/home/lnzliplg/public_html/share.tar
man/man1/python2.7.1000064400000034366151730177170010032 0ustar00.TH PYTHON "1"

.\" To view this file while editing, run it through groff:
.\"   groff -Tascii -man python.man | less

.SH NAME
python \- an interpreted, interactive, object-oriented programming language
.SH SYNOPSIS
.B python
[
.B \-B
]
[
.B \-d
]
[
.B \-E
]
[
.B \-h
]
[
.B \-i
]
[
.B \-m 
.I module-name
]
.br
       [
.B \-O
]
[
.B \-OO
]
[
.B \-R
]
[
.B -Q
.I argument
]
[
.B \-s
]
[
.B \-S
]
[
.B \-t
]
[
.B \-u
]
.br
       [
.B \-v
]
[
.B \-V
]
[
.B \-W
.I argument
]
[
.B \-x
]
[
.B \-3
]
[
.B \-?
]
.br
       [
.B \-c
.I command
|
.I script
|
\-
]
[
.I arguments
]
.SH DESCRIPTION
Python is an interpreted, interactive, object-oriented programming
language that combines remarkable power with very clear syntax.
For an introduction to programming in Python, see the Python Tutorial.
The Python Library Reference documents built-in and standard types,
constants, functions and modules.
Finally, the Python Reference Manual describes the syntax and
semantics of the core language in (perhaps too) much detail.
(These documents may be located via the
.B "INTERNET RESOURCES"
below; they may be installed on your system as well.)
.PP
Python's basic power can be extended with your own modules written in
C or C++.
On most systems such modules may be dynamically loaded.
Python is also adaptable as an extension language for existing
applications.
See the internal documentation for hints.
.PP
Documentation for installed Python modules and packages can be 
viewed by running the 
.B pydoc
program.  
.SH COMMAND LINE OPTIONS
.TP
.B \-B
Don't write
.I .py[co]
files on import. See also PYTHONDONTWRITEBYTECODE.
.TP
.BI "\-c " command
Specify the command to execute (see next section).
This terminates the option list (following options are passed as
arguments to the command).
.TP
.B \-d
Turn on parser debugging output (for wizards only, depending on
compilation options).
.TP
.B \-E
Ignore environment variables like PYTHONPATH and PYTHONHOME that modify
the behavior of the interpreter.
.TP
.B \-h ", " \-? ", "\-\-help
Prints the usage for the interpreter executable and exits.
.TP
.B \-i
When a script is passed as first argument or the \fB\-c\fP option is
used, enter interactive mode after executing the script or the
command.  It does not read the $PYTHONSTARTUP file.  This can be
useful to inspect global variables or a stack trace when a script
raises an exception.
.TP
.BI "\-m " module-name
Searches 
.I sys.path 
for the named module and runs the corresponding 
.I .py 
file as a script.
.TP
.B \-O
Turn on basic optimizations.  This changes the filename extension for
compiled (bytecode) files from
.I .pyc
to \fI.pyo\fP.  Given twice, causes docstrings to be discarded.
.TP
.B \-OO
Discard docstrings in addition to the \fB-O\fP optimizations.
.TP
.B \-R
Turn on "hash randomization", so that the hash() values of str, bytes and
datetime objects are "salted" with an unpredictable pseudo-random value.
Although they remain constant within an individual Python process, they are
not predictable between repeated invocations of Python.
.IP
This is intended to provide protection against a denial of service
caused by carefully-chosen inputs that exploit the worst case performance
of a dict construction, O(n^2) complexity.  See
http://www.ocert.org/advisories/ocert-2011-003.html
for details.
.TP
.BI "\-Q " argument
Division control; see PEP 238.  The argument must be one of "old" (the
default, int/int and long/long return an int or long), "new" (new
division semantics, i.e. int/int and long/long returns a float),
"warn" (old division semantics with a warning for int/int and
long/long), or "warnall" (old division semantics with a warning for
all use of the division operator).  For a use of "warnall", see the
Tools/scripts/fixdiv.py script.
.TP
.B \-s
Don't add user site directory to sys.path.
.TP
.B \-S
Disable the import of the module
.I site
and the site-dependent manipulations of
.I sys.path
that it entails.
.TP
.B \-t
Issue a warning when a source file mixes tabs and spaces for
indentation in a way that makes it depend on the worth of a tab
expressed in spaces.  Issue an error when the option is given twice.
.TP
.B \-u
Force stdin, stdout and stderr to be totally unbuffered.  On systems
where it matters, also put stdin, stdout and stderr in binary mode.
Note that there is internal buffering in xreadlines(), readlines() and
file-object iterators ("for line in sys.stdin") which is not
influenced by this option.  To work around this, you will want to use
"sys.stdin.readline()" inside a "while 1:" loop.
.TP
.B \-v
Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  When given
twice, print a message for each file that is checked for when 
searching for a module.  Also provides information on module cleanup
at exit.
.TP
.B \-V ", " \-\-version
Prints the Python version number of the executable and exits.
.TP
.BI "\-W " argument
Warning control.  Python sometimes prints warning message to
.IR sys.stderr .
A typical warning message has the following form:
.IB file ":" line ": " category ": " message.
By default, each warning is printed once for each source line where it
occurs.  This option controls how often warnings are printed.
Multiple
.B \-W
options may be given; when a warning matches more than one
option, the action for the last matching option is performed.
Invalid
.B \-W
options are ignored (a warning message is printed about invalid
options when the first warning is issued).  Warnings can also be
controlled from within a Python program using the
.I warnings
module.

The simplest form of
.I argument
is one of the following
.I action
strings (or a unique abbreviation):
.B ignore
to ignore all warnings;
.B default
to explicitly request the default behavior (printing each warning once
per source line);
.B all
to print a warning each time it occurs (this may generate many
messages if a warning is triggered repeatedly for the same source
line, such as inside a loop);
.B module
to print each warning only the first time it occurs in each
module;
.B once
to print each warning only the first time it occurs in the program; or
.B error
to raise an exception instead of printing a warning message.

The full form of
.I argument
is
.IB action : message : category : module : line.
Here,
.I action
is as explained above but only applies to messages that match the
remaining fields.  Empty fields match all values; trailing empty
fields may be omitted.  The
.I message
field matches the start of the warning message printed; this match is
case-insensitive.  The
.I category
field matches the warning category.  This must be a class name; the
match test whether the actual warning category of the message is a
subclass of the specified warning category.  The full class name must
be given.  The
.I module
field matches the (fully-qualified) module name; this match is
case-sensitive.  The
.I line
field matches the line number, where zero matches all line numbers and
is thus equivalent to an omitted line number.
.TP
.B \-x
Skip the first line of the source.  This is intended for a DOS
specific hack only.  Warning: the line numbers in error messages will
be off by one!
.TP
.B \-3
Warn about Python 3.x incompatibilities that 2to3 cannot trivially fix.
.SH INTERPRETER INTERFACE
The interpreter interface resembles that of the UNIX shell: when
called with standard input connected to a tty device, it prompts for
commands and executes them until an EOF is read; when called with a
file name argument or with a file as standard input, it reads and
executes a
.I script
from that file;
when called with
.B \-c
.IR command ,
it executes the Python statement(s) given as
.IR command .
Here
.I command
may contain multiple statements separated by newlines.
Leading whitespace is significant in Python statements!
In non-interactive mode, the entire input is parsed before it is
executed.
.PP
If available, the script name and additional arguments thereafter are
passed to the script in the Python variable
.IR sys.argv ,
which is a list of strings (you must first
.I import sys
to be able to access it).
If no script name is given,
.I sys.argv[0]
is an empty string; if
.B \-c
is used,
.I sys.argv[0]
contains the string
.I '-c'.
Note that options interpreted by the Python interpreter itself
are not placed in
.IR sys.argv .
.PP
In interactive mode, the primary prompt is `>>>'; the second prompt
(which appears when a command is not complete) is `...'.
The prompts can be changed by assignment to
.I sys.ps1
or
.IR sys.ps2 .
The interpreter quits when it reads an EOF at a prompt.
When an unhandled exception occurs, a stack trace is printed and
control returns to the primary prompt; in non-interactive mode, the
interpreter exits after printing the stack trace.
The interrupt signal raises the
.I Keyboard\%Interrupt
exception; other UNIX signals are not caught (except that SIGPIPE is
sometimes ignored, in favor of the
.I IOError
exception).  Error messages are written to stderr.
.SH FILES AND DIRECTORIES
These are subject to difference depending on local installation
conventions; ${prefix} and ${exec_prefix} are installation-dependent
and should be interpreted as for GNU software; they may be the same.
The default for both is \fI/usr/local\fP.
.IP \fI${exec_prefix}/bin/python\fP
Recommended location of the interpreter.
.PP
.I ${prefix}/lib/python<version>
.br
.I ${exec_prefix}/lib/python<version>
.RS
Recommended locations of the directories containing the standard
modules.
.RE
.PP
.I ${prefix}/include/python<version>
.br
.I ${exec_prefix}/include/python<version>
.RS
Recommended locations of the directories containing the include files
needed for developing Python extensions and embedding the
interpreter.
.RE
.IP \fI~/.pythonrc.py\fP
User-specific initialization file loaded by the \fIuser\fP module;
not used by default or by most applications.
.SH ENVIRONMENT VARIABLES
.IP PYTHONHOME
Change the location of the standard Python libraries.  By default, the
libraries are searched in ${prefix}/lib/python<version> and
${exec_prefix}/lib/python<version>, where ${prefix} and ${exec_prefix}
are installation-dependent directories, both defaulting to
\fI/usr/local\fP.  When $PYTHONHOME is set to a single directory, its value
replaces both ${prefix} and ${exec_prefix}.  To specify different values
for these, set $PYTHONHOME to ${prefix}:${exec_prefix}.
.IP PYTHONPATH
Augments the default search path for module files.
The format is the same as the shell's $PATH: one or more directory
pathnames separated by colons.
Non-existent directories are silently ignored.
The default search path is installation dependent, but generally
begins with ${prefix}/lib/python<version> (see PYTHONHOME above).
The default search path is always appended to $PYTHONPATH.
If a script argument is given, the directory containing the script is
inserted in the path in front of $PYTHONPATH.
The search path can be manipulated from within a Python program as the
variable
.IR sys.path .
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONY2K
Set this to a non-empty string to cause the \fItime\fP module to
require dates specified as strings to include 4-digit years, otherwise
2-digit years are converted based on rules described in the \fItime\fP
module documentation.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .py[co]
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times. 
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", the effect is the same as specifying
the \fB-R\fP option: a random value is used to seed the hashes of str,
bytes and datetime objects.

If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
generating the hash() of the types covered by the hash randomization.  Its
purpose is to allow repeatable hashing, such as for selftests for the
interpreter itself, or to allow a cluster of python processes to share hash
values.

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will lead to the same hash values as when hash randomization is
disabled.
.SH AUTHOR
The Python Software Foundation: https://www.python.org/psf/
.SH INTERNET RESOURCES
Main website:  https://www.python.org/
.br
Documentation:  https://docs.python.org/2/
.br
Developer resources:  https://docs.python.org/devguide/
.br
Downloads:  https://www.python.org/downloads/
.br
Module repository:  https://pypi.python.org/
.br
Newsgroups:  comp.lang.python, comp.lang.python.announce
.SH LICENSING
Python is distributed under an Open Source license.  See the file
"LICENSE" in the Python source distribution for information on terms &
conditions for accessing and otherwise using Python and for a
DISCLAIMER OF ALL WARRANTIES.
doc/alt-python27-contextlib2/LICENSE.txt000064400000013646151730177170013662 0ustar00

A. HISTORY OF THE SOFTWARE
==========================

contextlib2 is a derivative of the contextlib module distributed by the PSF
as part of the Python standard library. According, it is itself redistributed
under the PSF license (reproduced in full below). As the contextlib module
was added only in Python 2.5, the licenses for earlier Python versions are
not applicable and have not been included.

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases that included the contextlib module.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    2.5             2.4         2006        PSF         yes
    2.5.1           2.5         2007        PSF         yes
    2.5.2           2.5.1       2008        PSF         yes
    2.5.3           2.5.2       2008        PSF         yes
    2.6             2.5         2008        PSF         yes
    2.6.1           2.6         2008        PSF         yes
    2.6.2           2.6.1       2009        PSF         yes
    2.6.3           2.6.2       2009        PSF         yes
    2.6.4           2.6.3       2009        PSF         yes
    2.6.5           2.6.4       2010        PSF         yes
    3.0             2.6         2008        PSF         yes
    3.0.1           3.0         2009        PSF         yes
    3.1             3.0.1       2009        PSF         yes
    3.1.1           3.1         2009        PSF         yes
    3.1.2           3.1.1       2010        PSF         yes
    3.1.3           3.1.2       2010        PSF         yes
    3.1.4           3.1.3       2011        PSF         yes
    3.2             3.1         2011        PSF         yes
    3.2.1           3.2         2011        PSF         yes
    3.2.2           3.2.1       2011        PSF         yes
    3.3             3.2         2012        PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 Python Software Foundation; All Rights Reserved" are retained in Python
alone or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
doc/alt-python27-contextlib2/NEWS.rst000064400000007425151730177200013335 0ustar00Release History
---------------

0.5.4 (2016-07-31)
^^^^^^^^^^^^^^^^^^

* Thanks to the welcome efforts of Jannis Leidel, contextlib2 is now a
  [Jazzband](https://jazzband.co/) project! This means that I (Nick Coghlan)
  am no longer a single point of failure for backports of future contextlib
  updates to earlier Python versions.

* Issue `#7 <https://github.com/jazzband/contextlib2/issues/7>`__: Backported
  fix for CPython issue `#27122 <http://bugs.python.org/issue27122>`__,
  preventing a potential infinite loop on Python 3.5 when handling
  ``RuntimeError`` (CPython updates by Gregory P. Smith & Serhiy Storchaka)


0.5.3 (2016-05-02)
^^^^^^^^^^^^^^^^^^

* ``ExitStack`` now correctly handles context managers implemented as old-style
  classes in Python 2.x (such as ``codecs.StreamReader`` and
  ``codecs.StreamWriter``)

* ``setup.py`` has been migrated to setuptools and configured to emit a
  universal wheel file by default

0.5.2 (2016-05-02)
^^^^^^^^^^^^^^^^^^

* development migrated from BitBucket to GitHub

* ``redirect_stream``, ``redirect_stdout``, ``redirect_stderr`` and ``suppress``
  now explicitly inherit from ``object``, ensuring compatibility with
  ``ExitStack`` when run under Python 2.x (patch contributed by Devin
  Jeanpierre).

* ``MANIFEST.in`` is now included in the published sdist, ensuring the archive
  can be precisely recreated even without access to the original source repo
  (patch contributed by Guy Rozendorn)


0.5.1 (2016-01-13)
^^^^^^^^^^^^^^^^^^

* Python 2.6 compatilibity restored (patch contributed by Armin Ronacher)

* README converted back to reStructured Text formatting


0.5.0 (2016-01-12)
^^^^^^^^^^^^^^^^^^

* Updated to include all features from the Python 3.4 and 3.5 releases of
  contextlib (also includes some ``ExitStack`` enhancements made following
  the integration into the standard library for Python 3.3)

* The legacy ``ContextStack`` and ``ContextDecorator.refresh_cm`` APIs are
  no longer documented and emit ``DeprecationWarning`` when used

* Python 2.6, 3.2 and 3.3 have been dropped from compatibility testing

* tox is now supported for local version compatibility testing (patch by
  Marc Abramowitz)


0.4.0 (2012-05-05)
^^^^^^^^^^^^^^^^^^

* (BitBucket) Issue #8: Replace ContextStack with ExitStack (old ContextStack
  API retained for backwards compatibility)

* Fall back to unittest2 if unittest is missing required functionality


0.3.1 (2012-01-17)
^^^^^^^^^^^^^^^^^^

* (BitBucket) Issue #7: Add MANIFEST.in so PyPI package contains all relevant
  files (patch contributed by Doug Latornell)


0.3 (2012-01-04)
^^^^^^^^^^^^^^^^

* (BitBucket) Issue #5: ContextStack.register no longer pointlessly returns the
  wrapped function
* (BitBucket) Issue #2: Add examples and recipes section to docs
* (BitBucket) Issue #3: ContextStack.register_exit() now accepts objects with
  __exit__ attributes in addition to accepting exit callbacks directly
* (BitBucket) Issue #1: Add ContextStack.preserve() to move all registered
  callbacks to a new ContextStack object
* Wrapped callbacks now expose __wrapped__ (for direct callbacks) or __self__
  (for context manager methods) attributes to aid in introspection
* Moved version number to a VERSION.txt file (read by both docs and setup.py)
* Added NEWS.rst (and incorporated into documentation)


0.2 (2011-12-15)
^^^^^^^^^^^^^^^^

* Renamed CleanupManager to ContextStack (hopefully before anyone started
  using the module for anything, since I didn't alias the old name at all)


0.1 (2011-12-13)
^^^^^^^^^^^^^^^^

* Initial release as a backport module
* Added CleanupManager (based on a `Python feature request`_)
* Added ContextDecorator.refresh_cm() (based on a `Python tracker issue`_)
  
.. _Python feature request: http://bugs.python.org/issue13585
.. _Python tracker issue: http://bugs.python.org/issue11647
doc/alt-python27-contextlib2/README.rst000064400000003372151730177210013514 0ustar00.. image:: https://jazzband.co/static/img/badge.svg
   :target: https://jazzband.co/
   :alt: Jazzband

.. image:: https://readthedocs.org/projects/contextlib2/badge/?version=latest
   :target: https://contextlib2.readthedocs.org/
   :alt: Latest Docs

.. image:: https://img.shields.io/travis/jazzband/contextlib2/master.svg
   :target: http://travis-ci.org/jazzband/contextlib2

.. image:: https://coveralls.io/repos/github/jazzband/contextlib2/badge.svg?branch=master
   :target: https://coveralls.io/github/jazzband/contextlib2?branch=master

.. image:: https://landscape.io/github/jazzband/contextlib2/master/landscape.svg
   :target: https://landscape.io/github/jazzband/contextlib2/

contextlib2 is a backport of the `standard library's contextlib
module <https://docs.python.org/3.5/library/contextlib.html>`_ to
earlier Python versions.

It also serves as a real world proving ground for possible future
enhancements to the standard library version.

Development
-----------

contextlib2 has no runtime dependencies, but requires ``unittest2`` for testing
on Python 2.x.

Local testing is just a matter of running ``python test_contextlib2.py``.

You can test against multiple versions of Python with
`tox <https://tox.testrun.org/>`_::

    pip install tox
    tox

Versions currently tested in both tox and Travis CI are:

* CPython 2.6
* CPython 2.7
* CPython 3.4
* CPython 3.5
* CPython 3.6 (CPython development branch)
* PyPy

tox also has a PyPy3 configuration, but it is not configured in Travis
due to a
`known incompatibility <https://bitbucket.org/pypy/pypy/issues/1903>`_.

To install several of the relevant runtimes on Fedora 23::

    sudo dnf install python python3 pypy pypy3
    sudo dnf copr enable -y mstuchli/Python3.5
    sudo dnf install python35-python3
doc/alt-python27-contextlib2/VERSION.txt000064400000000006151730177210013702 0ustar000.5.4
doc/alt-python27-setuptools/asl.txt000064400000026136151730177220013335 0ustar00
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
doc/alt-python27-setuptools/requirements.txt000064400000000075151730177230015274 0ustar00sphinx
rst.linker>=1.9
jaraco.packaging>=3.2

setuptools>=34
doc/alt-python27-setuptools/developer-guide.txt000064400000010026151730177240015627 0ustar00================================
Developer's Guide for Setuptools
================================

If you want to know more about contributing on Setuptools, this is the place.


.. contents:: **Table of Contents**


-------------------
Recommended Reading
-------------------

Please read `How to write the perfect pull request
<https://blog.jaraco.com/how-to-write-perfect-pull-request/>`_ for some tips
on contributing to open source projects. Although the article is not
authoritative, it was authored by the maintainer of Setuptools, so reflects
his opinions and will improve the likelihood of acceptance and quality of
contribution.

------------------
Project Management
------------------

Setuptools is maintained primarily in Github at `this home
<https://github.com/pypa/setuptools>`_. Setuptools is maintained under the
Python Packaging Authority (PyPA) with several core contributors. All bugs
for Setuptools are filed and the canonical source is maintained in Github.

User support and discussions are done through the issue tracker (for specific)
issues, through the distutils-sig mailing list, or on IRC (Freenode) at
#pypa.

Discussions about development happen on the pypa-dev mailing list or on
`Gitter <https://gitter.im/pypa/setuptools>`_.

-----------------
Authoring Tickets
-----------------

Before authoring any source code, it's often prudent to file a ticket
describing the motivation behind making changes. First search to see if a
ticket already exists for your issue. If not, create one. Try to think from
the perspective of the reader. Explain what behavior you expected, what you
got instead, and what factors might have contributed to the unexpected
behavior. In Github, surround a block of code or traceback with the triple
backtick "\`\`\`" so that it is formatted nicely.

Filing a ticket provides a forum for justification, discussion, and
clarification. The ticket provides a record of the purpose for the change and
any hard decisions that were made. It provides a single place for others to
reference when trying to understand why the software operates the way it does
or why certain changes were made.

Setuptools makes extensive use of hyperlinks to tickets in the changelog so
that system integrators and other users can get a quick summary, but then
jump to the in-depth discussion about any subject referenced.

-----------
Source Code
-----------

Grab the code at Github::

    $ git checkout https://github.com/pypa/setuptools

If you want to contribute changes, we recommend you fork the repository on
Github, commit the changes to your repository, and then make a pull request
on Github. If you make some changes, don't forget to:

- add a note in CHANGES.rst

Please commit all changes in the 'master' branch against the latest available
commit or for bug-fixes, against an earlier commit or release in which the
bug occurred.

If you find yourself working on more than one issue at a time, Setuptools
generally prefers Git-style branches, so use Mercurial bookmarks or Git
branches or multiple forks to maintain separate efforts.

The Continuous Integration tests that validate every release are run
from this repository.

For posterity, the old `Bitbucket mirror
<https://bitbucket.org/pypa/setuptools>`_ is available.

-------
Testing
-------

The primary tests are run using tox. To run the tests, first make
sure you have tox installed, then invoke it::

    $ tox

Under continuous integration, additional tests may be run. See the
``.travis.yml`` file for full details on the tests run under Travis-CI.

-------------------
Semantic Versioning
-------------------

Setuptools follows ``semver``.

.. explain value of reflecting meaning in versions.

----------------------
Building Documentation
----------------------

Setuptools relies on the Sphinx system for building documentation.
To accommodate RTD, docs must be built from the docs/ directory.

To build them, you need to have installed the requirements specified
in docs/requirements.txt. One way to do this is to use rwt:

    setuptools/docs$ python -m rwt -r requirements.txt -- -m sphinx . html
doc/alt-python27-setuptools/zpl.txt000064400000004026151730177240013357 0ustar00Zope Public License (ZPL) Version 2.1

A copyright notice accompanies this license document that identifies the
copyright holders.

This license has been certified as open source. It has also been designated as
GPL compatible by the Free Software Foundation (FSF).

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions in source code must retain the accompanying copyright
notice, this list of conditions, and the following disclaimer.

2. Redistributions in binary form must reproduce the accompanying copyright
notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution.

3. Names of the copyright holders must not be used to endorse or promote
products derived from this software without prior written permission from the
copyright holders.

4. The right to distribute this software or to use it for any purpose does not
give you the right to use Servicemarks (sm) or Trademarks (tm) of the
copyright
holders. Use of them is covered by separate agreement with the copyright
holders.

5. If any files are modified, you must cause the modified files to carry
prominent notices stating that you changed the files and the date of any
change.

Disclaimer

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/alt-python27-setuptools/pkg_resources.txt000064400000270267151730177250015442 0ustar00=============================================================
Package Discovery and Resource Access using ``pkg_resources``
=============================================================

The ``pkg_resources`` module distributed with ``setuptools`` provides an API
for Python libraries to access their resource files, and for extensible
applications and frameworks to automatically discover plugins.  It also
provides runtime support for using C extensions that are inside zipfile-format
eggs, support for merging packages that have separately-distributed modules or
subpackages, and APIs for managing Python's current "working set" of active
packages.


.. contents:: **Table of Contents**


--------
Overview
--------

The ``pkg_resources`` module provides runtime facilities for finding,
introspecting, activating and using installed Python distributions. Some
of the more advanced features (notably the support for parallel installation
of multiple versions) rely specifically on the "egg" format (either as a
zip archive or subdirectory), while others (such as plugin discovery) will
work correctly so long as "egg-info" metadata directories are available for
relevant distributions.

Eggs are a distribution format for Python modules, similar in concept to
Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
However, unlike a pure distribution format, eggs can also be installed and
added directly to ``sys.path`` as an import location. When installed in
this way, eggs are *discoverable*, meaning that they carry metadata that
unambiguously identifies their contents and dependencies. This means that
an installed egg can be *automatically* found and added to ``sys.path`` in
response to simple requests of the form, "get me everything I need to use
docutils' PDF support". This feature allows mutually conflicting versions of
a distribution to co-exist in the same Python installation, with individual
applications activating the desired version at runtime by manipulating the
contents of ``sys.path`` (this differs from the virtual environment
approach, which involves creating isolated environments for each
application).

The following terms are needed in order to explain the capabilities offered
by this module:

project
    A library, framework, script, plugin, application, or collection of data
    or other resources, or some combination thereof.  Projects are assumed to
    have "relatively unique" names, e.g. names registered with PyPI.

release
    A snapshot of a project at a particular point in time, denoted by a version
    identifier.

distribution
    A file or files that represent a particular release.

importable distribution
    A file or directory that, if placed on ``sys.path``, allows Python to
    import any modules contained within it.

pluggable distribution
    An importable distribution whose filename unambiguously identifies its
    release (i.e. project and version), and whose contents unambiguously
    specify what releases of other projects will satisfy its runtime
    requirements.

extra
    An "extra" is an optional feature of a release, that may impose additional
    runtime requirements.  For example, if docutils PDF support required a
    PDF support library to be present, docutils could define its PDF support as
    an "extra", and list what other project releases need to be available in
    order to provide it.

environment
    A collection of distributions potentially available for importing, but not
    necessarily active.  More than one distribution (i.e. release version) for
    a given project may be present in an environment.

working set
    A collection of distributions actually available for importing, as on
    ``sys.path``.  At most one distribution (release version) of a given
    project may be present in a working set, as otherwise there would be
    ambiguity as to what to import.

eggs
    Eggs are pluggable distributions in one of the three formats currently
    supported by ``pkg_resources``.  There are built eggs, development eggs,
    and egg links.  Built eggs are directories or zipfiles whose name ends
    with ``.egg`` and follows the egg naming conventions, and contain an
    ``EGG-INFO`` subdirectory (zipped or otherwise).  Development eggs are
    normal directories of Python code with one or more ``ProjectName.egg-info``
    subdirectories. The development egg format is also used to provide a
    default version of a distribution that is available to software that
    doesn't use ``pkg_resources`` to request specific versions. Egg links
    are ``*.egg-link`` files that contain the name of a built or
    development egg, to support symbolic linking on platforms that do not
    have native symbolic links (or where the symbolic link support is
    limited).

(For more information about these terms and concepts, see also this
`architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)

.. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html


.. -----------------
.. Developer's Guide
.. -----------------

.. This section isn't written yet.  Currently planned topics include
    Accessing Resources
    Finding and Activating Package Distributions
        get_provider()
        require()
        WorkingSet
        iter_distributions
    Running Scripts
    Configuration
    Namespace Packages
    Extensible Applications and Frameworks
        Locating entry points
        Activation listeners
        Metadata access
        Extended Discovery and Installation
    Supporting Custom PEP 302 Implementations
.. For now, please check out the extensive `API Reference`_ below.


-------------
API Reference
-------------

Namespace Package Support
=========================

A namespace package is a package that only contains other packages and modules,
with no direct contents of its own.  Such packages can be split across
multiple, separately-packaged distributions.  They are normally used to split
up large packages produced by a single organization, such as in the ``zope``
namespace package for Zope Corporation packages, and the ``peak`` namespace
package for the Python Enterprise Application Kit.

To create a namespace package, you list it in the ``namespace_packages``
argument to ``setup()``, in your project's ``setup.py``.  (See the
:ref:`setuptools documentation on namespace packages <Namespace Packages>` for
more information on this.)  Also, you must add a ``declare_namespace()`` call
in the package's ``__init__.py`` file(s):

``declare_namespace(name)``
    Declare that the dotted package name `name` is a "namespace package" whose
    contained packages and modules may be spread across multiple distributions.
    The named package's ``__path__`` will be extended to include the
    corresponding package in all distributions on ``sys.path`` that contain a
    package of that name.  (More precisely, if an importer's
    ``find_module(name)`` returns a loader, then it will also be searched for
    the package's contents.)  Whenever a Distribution's ``activate()`` method
    is invoked, it checks for the presence of namespace packages and updates
    their ``__path__`` contents accordingly.

Applications that manipulate namespace packages or directly alter ``sys.path``
at runtime may also need to use this API function:

``fixup_namespace_packages(path_item)``
    Declare that `path_item` is a newly added item on ``sys.path`` that may
    need to be used to update existing namespace packages.  Ordinarily, this is
    called for you when an egg is automatically added to ``sys.path``, but if
    your application modifies ``sys.path`` to include locations that may
    contain portions of a namespace package, you will need to call this
    function to ensure they are added to the existing namespace packages.

Although by default ``pkg_resources`` only supports namespace packages for
filesystem and zip importers, you can extend its support to other "importers"
compatible with PEP 302 using the ``register_namespace_handler()`` function.
See the section below on `Supporting Custom Importers`_ for details.


``WorkingSet`` Objects
======================

The ``WorkingSet`` class provides access to a collection of "active"
distributions.  In general, there is only one meaningful ``WorkingSet``
instance: the one that represents the distributions that are currently active
on ``sys.path``.  This global instance is available under the name
``working_set`` in the ``pkg_resources`` module.  However, specialized
tools may wish to manipulate working sets that don't correspond to
``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.

It's important to note that the global ``working_set`` object is initialized
from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs.  If
you manually modify ``sys.path``, you must invoke the appropriate methods on
the ``working_set`` instance to keep it in sync.  Unfortunately, Python does
not provide any way to detect arbitrary changes to a list object like
``sys.path``, so ``pkg_resources`` cannot automatically update the
``working_set`` based on changes to ``sys.path``.

``WorkingSet(entries=None)``
    Create a ``WorkingSet`` from an iterable of path entries.  If `entries`
    is not supplied, it defaults to the value of ``sys.path`` at the time
    the constructor is called.

    Note that you will not normally construct ``WorkingSet`` instances
    yourself, but instead you will implicitly or explicitly use the global
    ``working_set`` instance.  For the most part, the ``pkg_resources`` API
    is designed so that the ``working_set`` is used by default, such that you
    don't have to explicitly refer to it most of the time.

All distributions available directly on ``sys.path`` will be activated
automatically when ``pkg_resources`` is imported. This behaviour can cause
version conflicts for applications which require non-default versions of
those distributions. To handle this situation, ``pkg_resources`` checks for a
``__requires__`` attribute in the ``__main__`` module when initializing the
default working set, and uses this to ensure a suitable version of each
affected distribution is activated. For example::

    __requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
    import pkg_resources


Basic ``WorkingSet`` Methods
----------------------------

The following methods of ``WorkingSet`` objects are also available as module-
level functions in ``pkg_resources`` that apply to the default ``working_set``
instance.  Thus, you can use e.g. ``pkg_resources.require()`` as an
abbreviation for ``pkg_resources.working_set.require()``:


``require(*requirements)``
    Ensure that distributions matching `requirements` are activated

    `requirements` must be a string or a (possibly-nested) sequence
    thereof, specifying the distributions and versions required.  The
    return value is a sequence of the distributions that needed to be
    activated to fulfill the requirements; all relevant distributions are
    included, even if they were already activated in this working set.

    For the syntax of requirement specifiers, see the section below on
    `Requirements Parsing`_.

    In general, it should not be necessary for you to call this method
    directly.  It's intended more for use in quick-and-dirty scripting and
    interactive interpreter hacking than for production use. If you're creating
    an actual library or application, it's strongly recommended that you create
    a "setup.py" script using ``setuptools``, and declare all your requirements
    there.  That way, tools like EasyInstall can automatically detect what
    requirements your package has, and deal with them accordingly.

    Note that calling ``require('SomePackage')`` will not install
    ``SomePackage`` if it isn't already present.  If you need to do this, you
    should use the ``resolve()`` method instead, which allows you to pass an
    ``installer`` callback that will be invoked when a needed distribution
    can't be found on the local machine.  You can then have this callback
    display a dialog, automatically download the needed distribution, or
    whatever else is appropriate for your application. See the documentation
    below on the ``resolve()`` method for more information, and also on the
    ``obtain()`` method of ``Environment`` objects.

``run_script(requires, script_name)``
    Locate distribution specified by `requires` and run its `script_name`
    script.  `requires` must be a string containing a requirement specifier.
    (See `Requirements Parsing`_ below for the syntax.)

    The script, if found, will be executed in *the caller's globals*.  That's
    because this method is intended to be called from wrapper scripts that
    act as a proxy for the "real" scripts in a distribution.  A wrapper script
    usually doesn't need to do anything but invoke this function with the
    correct arguments.

    If you need more control over the script execution environment, you
    probably want to use the ``run_script()`` method of a ``Distribution``
    object's `Metadata API`_ instead.

``iter_entry_points(group, name=None)``
    Yield entry point objects from `group` matching `name`

    If `name` is None, yields all entry points in `group` from all
    distributions in the working set, otherwise only ones matching both
    `group` and `name` are yielded.  Entry points are yielded from the active
    distributions in the order that the distributions appear in the working
    set.  (For the global ``working_set``, this should be the same as the order
    that they are listed in ``sys.path``.)  Note that within the entry points
    advertised by an individual distribution, there is no particular ordering.

    Please see the section below on `Entry Points`_ for more information.


``WorkingSet`` Methods and Attributes
-------------------------------------

These methods are used to query or manipulate the contents of a specific
working set, so they must be explicitly invoked on a particular ``WorkingSet``
instance:

``add_entry(entry)``
    Add a path item to the ``entries``, finding any distributions on it.  You
    should use this when you add additional items to ``sys.path`` and you want
    the global ``working_set`` to reflect the change.  This method is also
    called by the ``WorkingSet()`` constructor during initialization.

    This method uses ``find_distributions(entry,True)`` to find distributions
    corresponding to the path entry, and then ``add()`` them.  `entry` is
    always appended to the ``entries`` attribute, even if it is already
    present, however. (This is because ``sys.path`` can contain the same value
    more than once, and the ``entries`` attribute should be able to reflect
    this.)

``__contains__(dist)``
    True if `dist` is active in this ``WorkingSet``.  Note that only one
    distribution for a given project can be active in a given ``WorkingSet``.

``__iter__()``
    Yield distributions for non-duplicate projects in the working set.
    The yield order is the order in which the items' path entries were
    added to the working set.

``find(req)``
    Find a distribution matching `req` (a ``Requirement`` instance).
    If there is an active distribution for the requested project, this
    returns it, as long as it meets the version requirement specified by
    `req`.  But, if there is an active distribution for the project and it
    does *not* meet the `req` requirement, ``VersionConflict`` is raised.
    If there is no active distribution for the requested project, ``None``
    is returned.

``resolve(requirements, env=None, installer=None)``
    List all distributions needed to (recursively) meet `requirements`

    `requirements` must be a sequence of ``Requirement`` objects.  `env`,
    if supplied, should be an ``Environment`` instance.  If
    not supplied, an ``Environment`` is created from the working set's
    ``entries``.  `installer`, if supplied, will be invoked with each
    requirement that cannot be met by an already-installed distribution; it
    should return a ``Distribution`` or ``None``.  (See the ``obtain()`` method
    of `Environment Objects`_, below, for more information on the `installer`
    argument.)

``add(dist, entry=None)``
    Add `dist` to working set, associated with `entry`

    If `entry` is unspecified, it defaults to ``dist.location``.  On exit from
    this routine, `entry` is added to the end of the working set's ``.entries``
    (if it wasn't already present).

    `dist` is only added to the working set if it's for a project that
    doesn't already have a distribution active in the set.  If it's
    successfully added, any  callbacks registered with the ``subscribe()``
    method will be called.  (See `Receiving Change Notifications`_, below.)

    Note: ``add()`` is automatically called for you by the ``require()``
    method, so you don't normally need to use this method directly.

``entries``
    This attribute represents a "shadow" ``sys.path``, primarily useful for
    debugging.  If you are experiencing import problems, you should check
    the global ``working_set`` object's ``entries`` against ``sys.path``, to
    ensure that they match.  If they do not, then some part of your program
    is manipulating ``sys.path`` without updating the ``working_set``
    accordingly.  IMPORTANT NOTE: do not directly manipulate this attribute!
    Setting it equal to ``sys.path`` will not fix your problem, any more than
    putting black tape over an "engine warning" light will fix your car!  If
    this attribute is out of sync with ``sys.path``, it's merely an *indicator*
    of the problem, not the cause of it.


Receiving Change Notifications
------------------------------

Extensible applications and frameworks may need to receive notification when
a new distribution (such as a plug-in component) has been added to a working
set.  This is what the ``subscribe()`` method and ``add_activation_listener()``
function are for.

``subscribe(callback)``
    Invoke ``callback(distribution)`` once for each active distribution that is
    in the set now, or gets added later.  Because the callback is invoked for
    already-active distributions, you do not need to loop over the working set
    yourself to deal with the existing items; just register the callback and
    be prepared for the fact that it will be called immediately by this method.

    Note that callbacks *must not* allow exceptions to propagate, or they will
    interfere with the operation of other callbacks and possibly result in an
    inconsistent working set state.  Callbacks should use a try/except block
    to ignore, log, or otherwise process any errors, especially since the code
    that caused the callback to be invoked is unlikely to be able to handle
    the errors any better than the callback itself.

``pkg_resources.add_activation_listener()`` is an alternate spelling of
``pkg_resources.working_set.subscribe()``.


Locating Plugins
----------------

Extensible applications will sometimes have a "plugin directory" or a set of
plugin directories, from which they want to load entry points or other
metadata.  The ``find_plugins()`` method allows you to do this, by scanning an
environment for the newest version of each project that can be safely loaded
without conflicts or missing requirements.

``find_plugins(plugin_env, full_env=None, fallback=True)``
   Scan `plugin_env` and identify which distributions could be added to this
   working set without version conflicts or missing requirements.

   Example usage::

       distributions, errors = working_set.find_plugins(
           Environment(plugin_dirlist)
       )
       map(working_set.add, distributions)  # add plugins+libs to sys.path
       print "Couldn't load", errors        # display errors

   The `plugin_env` should be an ``Environment`` instance that contains only
   distributions that are in the project's "plugin directory" or directories.
   The `full_env`, if supplied, should be an ``Environment`` instance that
   contains all currently-available distributions.

   If `full_env` is not supplied, one is created automatically from the
   ``WorkingSet`` this method is called on, which will typically mean that
   every directory on ``sys.path`` will be scanned for distributions.

   This method returns a 2-tuple: (`distributions`, `error_info`), where
   `distributions` is a list of the distributions found in `plugin_env` that
   were loadable, along with any other distributions that are needed to resolve
   their dependencies.  `error_info` is a dictionary mapping unloadable plugin
   distributions to an exception instance describing the error that occurred.
   Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
   instance.

   Most applications will use this method mainly on the master ``working_set``
   instance in ``pkg_resources``, and then immediately add the returned
   distributions to the working set so that they are available on sys.path.
   This will make it possible to find any entry points, and allow any other
   metadata tracking and hooks to be activated.

   The resolution algorithm used by ``find_plugins()`` is as follows.  First,
   the project names of the distributions present in `plugin_env` are sorted.
   Then, each project's eggs are tried in descending version order (i.e.,
   newest version first).

   An attempt is made to resolve each egg's dependencies. If the attempt is
   successful, the egg and its dependencies are added to the output list and to
   a temporary copy of the working set.  The resolution process continues with
   the next project name, and no older eggs for that project are tried.

   If the resolution attempt fails, however, the error is added to the error
   dictionary.  If the `fallback` flag is true, the next older version of the
   plugin is tried, until a working version is found.  If false, the resolution
   process continues with the next plugin project name.

   Some applications may have stricter fallback requirements than others. For
   example, an application that has a database schema or persistent objects
   may not be able to safely downgrade a version of a package. Others may want
   to ensure that a new plugin configuration is either 100% good or else
   revert to a known-good configuration.  (That is, they may wish to revert to
   a known configuration if the `error_info` return value is non-empty.)

   Note that this algorithm gives precedence to satisfying the dependencies of
   alphabetically prior project names in case of version conflicts. If two
   projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
   of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
   disabled due to version conflict.


``Environment`` Objects
=======================

An "environment" is a collection of ``Distribution`` objects, usually ones
that are present and potentially importable on the current platform.
``Environment`` objects are used by ``pkg_resources`` to index available
distributions during dependency resolution.

``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
    Create an environment snapshot by scanning `search_path` for distributions
    compatible with `platform` and `python`.  `search_path` should be a
    sequence of strings such as might be used on ``sys.path``.  If a
    `search_path` isn't supplied, ``sys.path`` is used.

    `platform` is an optional string specifying the name of the platform
    that platform-specific distributions must be compatible with.  If
    unspecified, it defaults to the current platform.  `python` is an
    optional string naming the desired version of Python (e.g. ``'2.4'``);
    it defaults to the currently-running version.

    You may explicitly set `platform` (and/or `python`) to ``None`` if you
    wish to include *all* distributions, not just those compatible with the
    running platform or Python version.

    Note that `search_path` is scanned immediately for distributions, and the
    resulting ``Environment`` is a snapshot of the found distributions.  It
    is not automatically updated if the system's state changes due to e.g.
    installation or removal of distributions.

``__getitem__(project_name)``
    Returns a list of distributions for the given project name, ordered
    from newest to oldest version.  (And highest to lowest format precedence
    for distributions that contain the same version of the project.)  If there
    are no distributions for the project, returns an empty list.

``__iter__()``
    Yield the unique project names of the distributions in this environment.
    The yielded names are always in lower case.

``add(dist)``
    Add `dist` to the environment if it matches the platform and python version
    specified at creation time, and only if the distribution hasn't already
    been added. (i.e., adding the same distribution more than once is a no-op.)

``remove(dist)``
    Remove `dist` from the environment.

``can_add(dist)``
    Is distribution `dist` acceptable for this environment?  If it's not
    compatible with the ``platform`` and ``python`` version values specified
    when the environment was created, a false value is returned.

``__add__(dist_or_env)``  (``+`` operator)
    Add a distribution or environment to an ``Environment`` instance, returning
    a *new* environment object that contains all the distributions previously
    contained by both.  The new environment will have a ``platform`` and
    ``python`` of ``None``, meaning that it will not reject any distributions
    from being added to it; it will simply accept whatever is added.  If you
    want the added items to be filtered for platform and Python version, or
    you want to add them to the *same* environment instance, you should use
    in-place addition (``+=``) instead.

``__iadd__(dist_or_env)``  (``+=`` operator)
    Add a distribution or environment to an ``Environment`` instance
    *in-place*, updating the existing instance and returning it.  The
    ``platform`` and ``python`` filter attributes take effect, so distributions
    in the source that do not have a suitable platform string or Python version
    are silently ignored.

``best_match(req, working_set, installer=None)``
    Find distribution best matching `req` and usable on `working_set`

    This calls the ``find(req)`` method of the `working_set` to see if a
    suitable distribution is already active.  (This may raise
    ``VersionConflict`` if an unsuitable version of the project is already
    active in the specified `working_set`.)  If a suitable distribution isn't
    active, this method returns the newest distribution in the environment
    that meets the ``Requirement`` in `req`.  If no suitable distribution is
    found, and `installer` is supplied, then the result of calling
    the environment's ``obtain(req, installer)`` method will be returned.

``obtain(requirement, installer=None)``
    Obtain a distro that matches requirement (e.g. via download).  In the
    base ``Environment`` class, this routine just returns
    ``installer(requirement)``, unless `installer` is None, in which case
    None is returned instead.  This method is a hook that allows subclasses
    to attempt other ways of obtaining a distribution before falling back
    to the `installer` argument.

``scan(search_path=None)``
    Scan `search_path` for distributions usable on `platform`

    Any distributions found are added to the environment.  `search_path` should
    be a sequence of strings such as might be used on ``sys.path``.  If not
    supplied, ``sys.path`` is used.  Only distributions conforming to
    the platform/python version defined at initialization are added.  This
    method is a shortcut for using the ``find_distributions()`` function to
    find the distributions from each item in `search_path`, and then calling
    ``add()`` to add each one to the environment.


``Requirement`` Objects
=======================

``Requirement`` objects express what versions of a project are suitable for
some purpose.  These objects (or their string form) are used by various
``pkg_resources`` APIs in order to find distributions that a script or
distribution needs.


Requirements Parsing
--------------------

``parse_requirements(s)``
    Yield ``Requirement`` objects for a string or iterable of lines.  Each
    requirement must start on a new line.  See below for syntax.

``Requirement.parse(s)``
    Create a ``Requirement`` object from a string or iterable of lines.  A
    ``ValueError`` is raised if the string or lines do not contain a valid
    requirement specifier, or if they contain more than one specifier.  (To
    parse multiple specifiers from a string or iterable of strings, use
    ``parse_requirements()`` instead.)

    The syntax of a requirement specifier is defined in full in PEP 508.

    Some examples of valid requirement specifiers::

        FooProject >= 1.2
        Fizzy [foo, bar]
        PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
        SomethingWhoseVersionIDontCareAbout
        SomethingWithMarker[foo]>1.0;python_version<"2.7"

    The project name is the only required portion of a requirement string, and
    if it's the only thing supplied, the requirement will accept any version
    of that project.

    The "extras" in a requirement are used to request optional features of a
    project, that may require additional project distributions in order to
    function.  For example, if the hypothetical "Report-O-Rama" project offered
    optional PDF support, it might require an additional library in order to
    provide that support.  Thus, a project needing Report-O-Rama's PDF features
    could use a requirement of ``Report-O-Rama[PDF]`` to request installation
    or activation of both Report-O-Rama and any libraries it needs in order to
    provide PDF support.  For example, you could use::

        easy_install.py Report-O-Rama[PDF]

    To install the necessary packages using the EasyInstall program, or call
    ``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
    distributions to sys.path at runtime.

    The "markers" in a requirement are used to specify when a requirement
    should be installed -- the requirement will be installed if the marker
    evaluates as true in the current environment. For example, specifying
    ``argparse;python_version<"2.7"`` will not install in an Python 2.7 or 3.3
    environment, but will in a Python 2.6 environment.

``Requirement`` Methods and Attributes
--------------------------------------

``__contains__(dist_or_version)``
    Return true if `dist_or_version` fits the criteria for this requirement.
    If `dist_or_version` is a ``Distribution`` object, its project name must
    match the requirement's project name, and its version must meet the
    requirement's version criteria.  If `dist_or_version` is a string, it is
    parsed using the ``parse_version()`` utility function.  Otherwise, it is
    assumed to be an already-parsed version.

    The ``Requirement`` object's version specifiers (``.specs``) are internally
    sorted into ascending version order, and used to establish what ranges of
    versions are acceptable.  Adjacent redundant conditions are effectively
    consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
    ``"<2,<3"`` produces the same results as``"<2"``). ``"!="`` versions are
    excised from the ranges they fall within.  The version being tested for
    acceptability is then checked for membership in the resulting ranges.

``__eq__(other_requirement)``
    A requirement compares equal to another requirement if they have
    case-insensitively equal project names, version specifiers, and "extras".
    (The order that extras and version specifiers are in is also ignored.)
    Equal requirements also have equal hashes, so that requirements can be
    used in sets or as dictionary keys.

``__str__()``
    The string form of a ``Requirement`` is a string that, if passed to
    ``Requirement.parse()``, would return an equal ``Requirement`` object.

``project_name``
    The name of the required project

``key``
    An all-lowercase version of the ``project_name``, useful for comparison
    or indexing.

``extras``
    A tuple of names of "extras" that this requirement calls for.  (These will
    be all-lowercase and normalized using the ``safe_extra()`` parsing utility
    function, so they may not exactly equal the extras the requirement was
    created with.)

``specs``
    A list of ``(op,version)`` tuples, sorted in ascending parsed-version
    order.  The `op` in each tuple is a comparison operator, represented as
    a string.  The `version` is the (unparsed) version number.

``marker``
    An instance of ``packaging.markers.Marker`` that allows evaluation
    against the current environment. May be None if no marker specified.

``url``
    The location to download the requirement from if specified.

Entry Points
============

Entry points are a simple way for distributions to "advertise" Python objects
(such as functions or classes) for use by other distributions.  Extensible
applications and frameworks can search for entry points with a particular name
or group, either from a specific distribution or from all active distributions
on sys.path, and then inspect or load the advertised objects at will.

Entry points belong to "groups" which are named with a dotted name similar to
a Python package or module name.  For example, the ``setuptools`` package uses
an entry point named ``distutils.commands`` in order to find commands defined
by distutils extensions.  ``setuptools`` treats the names of entry points
defined in that group as the acceptable commands for a setup script.

In a similar way, other packages can define their own entry point groups,
either using dynamic names within the group (like ``distutils.commands``), or
possibly using predefined names within the group.  For example, a blogging
framework that offers various pre- or post-publishing hooks might define an
entry point group and look for entry points named "pre_process" and
"post_process" within that group.

To advertise an entry point, a project needs to use ``setuptools`` and provide
an ``entry_points`` argument to ``setup()`` in its setup script, so that the
entry points will be included in the distribution's metadata.  For more
details, see the ``setuptools`` documentation.  (XXX link here to setuptools)

Each project distribution can advertise at most one entry point of a given
name within the same entry point group.  For example, a distutils extension
could advertise two different ``distutils.commands`` entry points, as long as
they had different names.  However, there is nothing that prevents *different*
projects from advertising entry points of the same name in the same group.  In
some cases, this is a desirable thing, since the application or framework that
uses the entry points may be calling them as hooks, or in some other way
combining them.  It is up to the application or framework to decide what to do
if multiple distributions advertise an entry point; some possibilities include
using both entry points, displaying an error message, using the first one found
in sys.path order, etc.


Convenience API
---------------

In the following functions, the `dist` argument can be a ``Distribution``
instance, a ``Requirement`` instance, or a string specifying a requirement
(i.e. project name, version, etc.).  If the argument is a string or
``Requirement``, the specified distribution is located (and added to sys.path
if not already present).  An error will be raised if a matching distribution is
not available.

The `group` argument should be a string containing a dotted identifier,
identifying an entry point group.  If you are defining an entry point group,
you should include some portion of your package's name in the group name so as
to avoid collision with other packages' entry point groups.

``load_entry_point(dist, group, name)``
    Load the named entry point from the specified distribution, or raise
    ``ImportError``.

``get_entry_info(dist, group, name)``
    Return an ``EntryPoint`` object for the given `group` and `name` from
    the specified distribution.  Returns ``None`` if the distribution has not
    advertised a matching entry point.

``get_entry_map(dist, group=None)``
    Return the distribution's entry point map for `group`, or the full entry
    map for the distribution.  This function always returns a dictionary,
    even if the distribution advertises no entry points.  If `group` is given,
    the dictionary maps entry point names to the corresponding ``EntryPoint``
    object.  If `group` is None, the dictionary maps group names to
    dictionaries that then map entry point names to the corresponding
    ``EntryPoint`` instance in that group.

``iter_entry_points(group, name=None)``
    Yield entry point objects from `group` matching `name`.

    If `name` is None, yields all entry points in `group` from all
    distributions in the working set on sys.path, otherwise only ones matching
    both `group` and `name` are yielded.  Entry points are yielded from
    the active distributions in the order that the distributions appear on
    sys.path.  (Within entry points for a particular distribution, however,
    there is no particular ordering.)

    (This API is actually a method of the global ``working_set`` object; see
    the section above on `Basic WorkingSet Methods`_ for more information.)


Creating and Parsing
--------------------

``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
    Create an ``EntryPoint`` instance.  `name` is the entry point name.  The
    `module_name` is the (dotted) name of the module containing the advertised
    object.  `attrs` is an optional tuple of names to look up from the
    module to obtain the advertised object.  For example, an `attrs` of
    ``("foo","bar")`` and a `module_name` of ``"baz"`` would mean that the
    advertised object could be obtained by the following code::

        import baz
        advertised_object = baz.foo.bar

    The `extras` are an optional tuple of "extra feature" names that the
    distribution needs in order to provide this entry point.  When the
    entry point is loaded, these extra features are looked up in the `dist`
    argument to find out what other distributions may need to be activated
    on sys.path; see the ``load()`` method for more details.  The `extras`
    argument is only meaningful if `dist` is specified.  `dist` must be
    a ``Distribution`` instance.

``EntryPoint.parse(src, dist=None)`` (classmethod)
    Parse a single entry point from string `src`

    Entry point syntax follows the form::

        name = some.module:some.attr [extra1,extra2]

    The entry name and module name are required, but the ``:attrs`` and
    ``[extras]`` parts are optional, as is the whitespace shown between
    some of the items.  The `dist` argument is passed through to the
    ``EntryPoint()`` constructor, along with the other values parsed from
    `src`.

``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
    Parse `lines` (a string or sequence of lines) to create a dictionary
    mapping entry point names to ``EntryPoint`` objects.  ``ValueError`` is
    raised if entry point names are duplicated, if `group` is not a valid
    entry point group name, or if there are any syntax errors.  (Note: the
    `group` parameter is used only for validation and to create more
    informative error messages.)  If `dist` is provided, it will be used to
    set the ``dist`` attribute of the created ``EntryPoint`` objects.

``EntryPoint.parse_map(data, dist=None)`` (classmethod)
    Parse `data` into a dictionary mapping group names to dictionaries mapping
    entry point names to ``EntryPoint`` objects.  If `data` is a dictionary,
    then the keys are used as group names and the values are passed to
    ``parse_group()`` as the `lines` argument.  If `data` is a string or
    sequence of lines, it is first split into .ini-style sections (using
    the ``split_sections()`` utility function) and the section names are used
    as group names.  In either case, the `dist` argument is passed through to
    ``parse_group()`` so that the entry points will be linked to the specified
    distribution.


``EntryPoint`` Objects
----------------------

For simple introspection, ``EntryPoint`` objects have attributes that
correspond exactly to the constructor argument names: ``name``,
``module_name``, ``attrs``, ``extras``, and ``dist`` are all available.  In
addition, the following methods are provided:

``load()``
    Load the entry point, returning the advertised Python object.  Effectively
    calls ``self.require()`` then returns ``self.resolve()``.

``require(env=None, installer=None)``
    Ensure that any "extras" needed by the entry point are available on
    sys.path.  ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
    but no ``dist``, or if the named extras are not defined by the
    distribution.  If `env` is supplied, it must be an ``Environment``, and it
    will be used to search for needed distributions if they are not already
    present on sys.path.  If `installer` is supplied, it must be a callable
    taking a ``Requirement`` instance and returning a matching importable
    ``Distribution`` instance or None.

``resolve()``
    Resolve the entry point from its module and attrs, returning the advertised
    Python object. Raises ``ImportError`` if it cannot be obtained.

``__str__()``
    The string form of an ``EntryPoint`` is a string that could be passed to
    ``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.


``Distribution`` Objects
========================

``Distribution`` objects represent collections of Python code that may or may
not be importable, and may or may not have metadata and resources associated
with them.  Their metadata may include information such as what other projects
the distribution depends on, what entry points the distribution advertises, and
so on.


Getting or Creating Distributions
---------------------------------

Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
an ``Environment``.  (See the sections above on `WorkingSet Objects`_ and
`Environment Objects`_, which are containers for active distributions and
available distributions, respectively.)  You can also obtain ``Distribution``
objects from one of these high-level APIs:

``find_distributions(path_item, only=False)``
    Yield distributions accessible via `path_item`.  If `only` is true, yield
    only distributions whose ``location`` is equal to `path_item`.  In other
    words, if `only` is true, this yields any distributions that would be
    importable if `path_item` were on ``sys.path``.  If `only` is false, this
    also yields distributions that are "in" or "under" `path_item`, but would
    not be importable unless their locations were also added to ``sys.path``.

``get_distribution(dist_spec)``
    Return a ``Distribution`` object for a given ``Requirement`` or string.
    If `dist_spec` is already a ``Distribution`` instance, it is returned.
    If it is a ``Requirement`` object or a string that can be parsed into one,
    it is used to locate and activate a matching distribution, which is then
    returned.

However, if you're creating specialized tools for working with distributions,
or creating a new distribution format, you may also need to create
``Distribution`` objects directly, using one of the three constructors below.

These constructors all take an optional `metadata` argument, which is used to
access any resources or metadata associated with the distribution.  `metadata`
must be an object that implements the ``IResourceProvider`` interface, or None.
If it is None, an ``EmptyProvider`` is used instead.  ``Distribution`` objects
implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
delegating them to the `metadata` object.

``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
    Create a distribution for `location`, which must be a string such as a
    URL, filename, or other string that might be used on ``sys.path``.
    `basename` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
    If `basename` ends with ``.egg``, then the project's name, version, python
    version and platform are extracted from the filename and used to set those
    properties of the created distribution.  Any additional keyword arguments
    are forwarded to the ``Distribution()`` constructor.

``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
    Create a distribution by parsing a local filename.  This is a shorter way
    of saying  ``Distribution.from_location(normalize_path(filename),
    os.path.basename(filename), metadata)``.  In other words, it creates a
    distribution whose location is the normalize form of the filename, parsing
    name and version information from the base portion of the filename.  Any
    additional keyword arguments are forwarded to the ``Distribution()``
    constructor.

``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
    Create a distribution by setting its properties.  All arguments are
    optional and default to None, except for `py_version` (which defaults to
    the current Python version) and `precedence` (which defaults to
    ``EGG_DIST``; for more details see ``precedence`` under `Distribution
    Attributes`_ below).  Note that it's usually easier to use the
    ``from_filename()`` or ``from_location()`` constructors than to specify
    all these arguments individually.


``Distribution`` Attributes
---------------------------

location
    A string indicating the distribution's location.  For an importable
    distribution, this is the string that would be added to ``sys.path`` to
    make it actively importable.  For non-importable distributions, this is
    simply a filename, URL, or other way of locating the distribution.

project_name
    A string, naming the project that this distribution is for.  Project names
    are defined by a project's setup script, and they are used to identify
    projects on PyPI.  When a ``Distribution`` is constructed, the
    `project_name` argument is passed through the ``safe_name()`` utility
    function to filter out any unacceptable characters.

key
    ``dist.key`` is short for ``dist.project_name.lower()``.  It's used for
    case-insensitive comparison and indexing of distributions by project name.

extras
    A list of strings, giving the names of extra features defined by the
    project's dependency list (the ``extras_require`` argument specified in
    the project's setup script).

version
    A string denoting what release of the project this distribution contains.
    When a ``Distribution`` is constructed, the `version` argument is passed
    through the ``safe_version()`` utility function to filter out any
    unacceptable characters.  If no `version` is specified at construction
    time, then attempting to access this attribute later will cause the
    ``Distribution`` to try to discover its version by reading its ``PKG-INFO``
    metadata file.  If ``PKG-INFO`` is unavailable or can't be parsed,
    ``ValueError`` is raised.

parsed_version
    The ``parsed_version`` is an object representing a "parsed" form of the
    distribution's ``version``.  ``dist.parsed_version`` is a shortcut for
    calling ``parse_version(dist.version)``.  It is used to compare or sort
    distributions by version.  (See the `Parsing Utilities`_ section below for
    more information on the ``parse_version()`` function.)  Note that accessing
    ``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
    was constructed without a `version` and without `metadata` capable of
    supplying the missing version info.

py_version
    The major/minor Python version the distribution supports, as a string.
    For example, "2.7" or "3.4".  The default is the current version of Python.

platform
    A string representing the platform the distribution is intended for, or
    ``None`` if the distribution is "pure Python" and therefore cross-platform.
    See `Platform Utilities`_ below for more information on platform strings.

precedence
    A distribution's ``precedence`` is used to determine the relative order of
    two distributions that have the same ``project_name`` and
    ``parsed_version``.  The default precedence is ``pkg_resources.EGG_DIST``,
    which is the highest (i.e. most preferred) precedence.  The full list
    of predefined precedences, from most preferred to least preferred, is:
    ``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
    ``DEVELOP_DIST``.  Normally, precedences other than ``EGG_DIST`` are used
    only by the ``setuptools.package_index`` module, when sorting distributions
    found in a package index to determine their suitability for installation.
    "System" and "Development" eggs (i.e., ones that use the ``.egg-info``
    format), however, are automatically given a precedence of ``DEVELOP_DIST``.



``Distribution`` Methods
------------------------

``activate(path=None)``
    Ensure distribution is importable on `path`.  If `path` is None,
    ``sys.path`` is used instead.  This ensures that the distribution's
    ``location`` is in the `path` list, and it also performs any necessary
    namespace package fixups or declarations.  (That is, if the distribution
    contains namespace packages, this method ensures that they are declared,
    and that the distribution's contents for those namespace packages are
    merged with the contents provided by any other active distributions.  See
    the section above on `Namespace Package Support`_ for more information.)

    ``pkg_resources`` adds a notification callback to the global ``working_set``
    that ensures this method is called whenever a distribution is added to it.
    Therefore, you should not normally need to explicitly call this method.
    (Note that this means that namespace packages on ``sys.path`` are always
    imported as soon as ``pkg_resources`` is, which is another reason why
    namespace packages should not contain any code or import statements.)

``as_requirement()``
    Return a ``Requirement`` instance that matches this distribution's project
    name and version.

``requires(extras=())``
    List the ``Requirement`` objects that specify this distribution's
    dependencies.  If `extras` is specified, it should be a sequence of names
    of "extras" defined by the distribution, and the list returned will then
    include any dependencies needed to support the named "extras".

``clone(**kw)``
    Create a copy of the distribution.  Any supplied keyword arguments override
    the corresponding argument to the ``Distribution()`` constructor, allowing
    you to change some of the copied distribution's attributes.

``egg_name()``
    Return what this distribution's standard filename should be, not including
    the ".egg" extension.  For example, a distribution for project "Foo"
    version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
    of ``Foo-1.2-py2.3-win32``.  Any dashes in the name or version are
    converted to underscores.  (``Distribution.from_location()`` will convert
    them back when parsing a ".egg" file name.)

``__cmp__(other)``, ``__hash__()``
    Distribution objects are hashed and compared on the basis of their parsed
    version and precedence, followed by their key (lowercase project name),
    location, Python version, and platform.

The following methods are used to access ``EntryPoint`` objects advertised
by the distribution.  See the section above on `Entry Points`_ for more
detailed information about these operations:

``get_entry_info(group, name)``
    Return the ``EntryPoint`` object for `group` and `name`, or None if no
    such point is advertised by this distribution.

``get_entry_map(group=None)``
    Return the entry point map for `group`.  If `group` is None, return
    a dictionary mapping group names to entry point maps for all groups.
    (An entry point map is a dictionary of entry point names to ``EntryPoint``
    objects.)

``load_entry_point(group, name)``
    Short for ``get_entry_info(group, name).load()``.  Returns the object
    advertised by the named entry point, or raises ``ImportError`` if
    the entry point isn't advertised by this distribution, or there is some
    other import problem.

In addition to the above methods, ``Distribution`` objects also implement all
of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
documented in later sections):

* ``has_metadata(name)``
* ``metadata_isdir(name)``
* ``metadata_listdir(name)``
* ``get_metadata(name)``
* ``get_metadata_lines(name)``
* ``run_script(script_name, namespace)``
* ``get_resource_filename(manager, resource_name)``
* ``get_resource_stream(manager, resource_name)``
* ``get_resource_string(manager, resource_name)``
* ``has_resource(resource_name)``
* ``resource_isdir(resource_name)``
* ``resource_listdir(resource_name)``

If the distribution was created with a `metadata` argument, these resource and
metadata access methods are all delegated to that `metadata` provider.
Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
will appear to have no resources or metadata.  This delegation approach is used
so that supporting custom importers or new distribution formats can be done
simply by creating an appropriate `IResourceProvider`_ implementation; see the
section below on `Supporting Custom Importers`_ for more details.


``ResourceManager`` API
=======================

The ``ResourceManager`` class provides uniform access to package resources,
whether those resources exist as files and directories or are compressed in
an archive of some kind.

Normally, you do not need to create or explicitly manage ``ResourceManager``
instances, as the ``pkg_resources`` module creates a global instance for you,
and makes most of its methods available as top-level names in the
``pkg_resources`` module namespace.  So, for example, this code actually
calls the ``resource_string()`` method of the global ``ResourceManager``::

    import pkg_resources
    my_data = pkg_resources.resource_string(__name__, "foo.dat")

Thus, you can use the APIs below without needing an explicit
``ResourceManager`` instance; just import and use them as needed.


Basic Resource Access
---------------------

In the following methods, the `package_or_requirement` argument may be either
a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
If it is a package or module name, the named module or package must be
importable (i.e., be in a distribution or directory on ``sys.path``), and the
`resource_name` argument is interpreted relative to the named package.  (Note
that if a module name is used, then the resource name is relative to the
package immediately containing the named module.  Also, you should not use use
a namespace package name, because a namespace package can be spread across
multiple distributions, and is therefore ambiguous as to which distribution
should be searched for the resource.)

If it is a ``Requirement``, then the requirement is automatically resolved
(searching the current ``Environment`` if necessary) and a matching
distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
already present.  (Unless the ``Requirement`` can't be satisfied, in which
case an exception is raised.)  The `resource_name` argument is then interpreted
relative to the root of the identified distribution; i.e. its first path
segment will be treated as a peer of the top-level modules or packages in the
distribution.

Note that resource names must be ``/``-separated paths and cannot be absolute
(i.e. no leading ``/``) or contain relative names like ``".."``.  Do *not* use
``os.path`` routines to manipulate resource paths, as they are *not* filesystem
paths.

``resource_exists(package_or_requirement, resource_name)``
    Does the named resource exist?  Return ``True`` or ``False`` accordingly.

``resource_stream(package_or_requirement, resource_name)``
    Return a readable file-like object for the specified resource; it may be
    an actual file, a ``StringIO``, or some similar object.  The stream is
    in "binary mode", in the sense that whatever bytes are in the resource
    will be read as-is.

``resource_string(package_or_requirement, resource_name)``
    Return the specified resource as a string.  The resource is read in
    binary fashion, such that the returned string contains exactly the bytes
    that are stored in the resource.

``resource_isdir(package_or_requirement, resource_name)``
    Is the named resource a directory?  Return ``True`` or ``False``
    accordingly.

``resource_listdir(package_or_requirement, resource_name)``
    List the contents of the named resource directory, just like ``os.listdir``
    except that it works even if the resource is in a zipfile.

Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
as to the resource type.  You cannot use ``resource_listdir()`` on a file
resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
directory resources.  Using an inappropriate method for the resource type may
result in an exception or undefined behavior, depending on the platform and
distribution format involved.


Resource Extraction
-------------------

``resource_filename(package_or_requirement, resource_name)``
    Sometimes, it is not sufficient to access a resource in string or stream
    form, and a true filesystem filename is needed.  In such cases, you can
    use this method (or module-level function) to obtain a filename for a
    resource.  If the resource is in an archive distribution (such as a zipped
    egg), it will be extracted to a cache directory, and the filename within
    the cache will be returned.  If the named resource is a directory, then
    all resources within that directory (including subdirectories) are also
    extracted.  If the named resource is a C extension or "eager resource"
    (see the ``setuptools`` documentation for details), then all C extensions
    and eager resources are extracted at the same time.

    Archived resources are extracted to a cache location that can be managed by
    the following two methods:

``set_extraction_path(path)``
    Set the base path where resources will be extracted to, if needed.

    If you do not call this routine before any extractions take place, the
    path defaults to the return value of ``get_default_cache()``.  (Which is
    based on the ``PYTHON_EGG_CACHE`` environment variable, with various
    platform-specific fallbacks.  See that routine's documentation for more
    details.)

    Resources are extracted to subdirectories of this path based upon
    information given by the resource provider.  You may set this to a
    temporary directory, but then you must call ``cleanup_resources()`` to
    delete the extracted files when done.  There is no guarantee that
    ``cleanup_resources()`` will be able to remove all extracted files.  (On
    Windows, for example, you can't unlink .pyd or .dll files that are still
    in use.)

    Note that you may not change the extraction path for a given resource
    manager once resources have been extracted, unless you first call
    ``cleanup_resources()``.

``cleanup_resources(force=False)``
    Delete all extracted resource files and directories, returning a list
    of the file and directory names that could not be successfully removed.
    This function does not have any concurrency protection, so it should
    generally only be called when the extraction path is a temporary
    directory exclusive to a single process.  This method is not
    automatically called; you must call it explicitly or register it as an
    ``atexit`` function if you wish to ensure cleanup of a temporary
    directory used for extractions.


"Provider" Interface
--------------------

If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
for a new distribution archive format, you may need to use the following
``IResourceManager`` methods to co-ordinate extraction of resources to the
filesystem.  If you're not implementing an archive format, however, you have
no need to use these methods.  Unlike the other methods listed above, they are
*not* available as top-level functions tied to the global ``ResourceManager``;
you must therefore have an explicit ``ResourceManager`` instance to use them.

``get_cache_path(archive_name, names=())``
    Return absolute location in cache for `archive_name` and `names`

    The parent directory of the resulting path will be created if it does
    not already exist.  `archive_name` should be the base filename of the
    enclosing egg (which may not be the name of the enclosing zipfile!),
    including its ".egg" extension.  `names`, if provided, should be a
    sequence of path name parts "under" the egg's extraction location.

    This method should only be called by resource providers that need to
    obtain an extraction location, and only for names they intend to
    extract, as it tracks the generated names for possible cleanup later.

``extraction_error()``
    Raise an ``ExtractionError`` describing the active exception as interfering
    with the extraction process.  You should call this if you encounter any
    OS errors extracting the file to the cache path; it will format the
    operating system exception for you, and add other information to the
    ``ExtractionError`` instance that may be needed by programs that want to
    wrap or handle extraction errors themselves.

``postprocess(tempname, filename)``
    Perform any platform-specific postprocessing of `tempname`.
    Resource providers should call this method ONLY after successfully
    extracting a compressed resource.  They must NOT call it on resources
    that are already in the filesystem.

    `tempname` is the current (temporary) name of the file, and `filename`
    is the name it will be renamed to by the caller after this routine
    returns.


Metadata API
============

The metadata API is used to access metadata resources bundled in a pluggable
distribution.  Metadata resources are virtual files or directories containing
information about the distribution, such as might be used by an extensible
application or framework to connect "plugins".  Like other kinds of resources,
metadata resource names are ``/``-separated and should not contain ``..`` or
begin with a ``/``.  You should not use ``os.path`` routines to manipulate
resource paths.

The metadata API is provided by objects implementing the ``IMetadataProvider``
or ``IResourceProvider`` interfaces.  ``Distribution`` objects implement this
interface, as do objects returned by the ``get_provider()`` function:

``get_provider(package_or_requirement)``
    If a package name is supplied, return an ``IResourceProvider`` for the
    package.  If a ``Requirement`` is supplied, resolve it by returning a
    ``Distribution`` from the current working set (searching the current
    ``Environment`` if necessary and adding the newly found ``Distribution``
    to the working set).  If the named package can't be imported, or the
    ``Requirement`` can't be satisfied, an exception is raised.

    NOTE: if you use a package name rather than a ``Requirement``, the object
    you get back may not be a pluggable distribution, depending on the method
    by which the package was installed.  In particular, "development" packages
    and "single-version externally-managed" packages do not have any way to
    map from a package name to the corresponding project's metadata.  Do not
    write code that passes a package name to ``get_provider()`` and then tries
    to retrieve project metadata from the returned object.  It may appear to
    work when the named package is in an ``.egg`` file or directory, but
    it will fail in other installation scenarios.  If you want project
    metadata, you need to ask for a *project*, not a package.


``IMetadataProvider`` Methods
-----------------------------

The methods provided by objects (such as ``Distribution`` instances) that
implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:

``has_metadata(name)``
    Does the named metadata resource exist?

``metadata_isdir(name)``
    Is the named metadata resource a directory?

``metadata_listdir(name)``
    List of metadata names in the directory (like ``os.listdir()``)

``get_metadata(name)``
    Return the named metadata resource as a string.  The data is read in binary
    mode; i.e., the exact bytes of the resource file are returned.

``get_metadata_lines(name)``
    Yield named metadata resource as list of non-blank non-comment lines.  This
    is short for calling ``yield_lines(provider.get_metadata(name))``.  See the
    section on `yield_lines()`_ below for more information on the syntax it
    recognizes.

``run_script(script_name, namespace)``
    Execute the named script in the supplied namespace dictionary.  Raises
    ``ResolutionError`` if there is no script by that name in the ``scripts``
    metadata directory.  `namespace` should be a Python dictionary, usually
    a module dictionary if the script is being run as a module.


Exceptions
==========

``pkg_resources`` provides a simple exception hierarchy for problems that may
occur when processing requests to locate and activate packages::

    ResolutionError
        DistributionNotFound
        VersionConflict
        UnknownExtra

    ExtractionError

``ResolutionError``
    This class is used as a base class for the other three exceptions, so that
    you can catch all of them with a single "except" clause.  It is also raised
    directly for miscellaneous requirement-resolution problems like trying to
    run a script that doesn't exist in the distribution it was requested from.

``DistributionNotFound``
    A distribution needed to fulfill a requirement could not be found.

``VersionConflict``
    The requested version of a project conflicts with an already-activated
    version of the same project.

``UnknownExtra``
    One of the "extras" requested was not recognized by the distribution it
    was requested from.

``ExtractionError``
    A problem occurred extracting a resource to the Python Egg cache.  The
    following attributes are available on instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail


Supporting Custom Importers
===========================

By default, ``pkg_resources`` supports normal filesystem imports, and
``zipimport`` importers.  If you wish to use the ``pkg_resources`` features
with other (PEP 302-compatible) importers or module loaders, you may need to
register various handlers and support functions using these APIs:

``register_finder(importer_type, distribution_finder)``
    Register `distribution_finder` to find distributions in ``sys.path`` items.
    `importer_type` is the type or class of a PEP 302 "Importer" (``sys.path``
    item handler), and `distribution_finder` is a callable that, when passed a
    path item, the importer instance, and an `only` flag, yields
    ``Distribution`` instances found under that path item.  (The `only` flag,
    if true, means the finder should yield only ``Distribution`` objects whose
    ``location`` is equal to the path item provided.)

    See the source of the ``pkg_resources.find_on_path`` function for an
    example finder function.

``register_loader_type(loader_type, provider_factory)``
    Register `provider_factory` to make ``IResourceProvider`` objects for
    `loader_type`.  `loader_type` is the type or class of a PEP 302
    ``module.__loader__``, and `provider_factory` is a function that, when
    passed a module object, returns an `IResourceProvider`_ for that module,
    allowing it to be used with the `ResourceManager API`_.

``register_namespace_handler(importer_type, namespace_handler)``
    Register `namespace_handler` to declare namespace packages for the given
    `importer_type`.  `importer_type` is the type or class of a PEP 302
    "importer" (sys.path item handler), and `namespace_handler` is a callable
    with a signature like this::

        def namespace_handler(importer, path_entry, moduleName, module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the relevant importer object has
    already agreed that it can handle the relevant path item.  The handler
    should only return a subpath if the module ``__path__`` does not already
    contain an equivalent subpath.  Otherwise, it should return None.

    For an example namespace handler, see the source of the
    ``pkg_resources.file_ns_handler`` function, which is used for both zipfile
    importing and regular importing.


IResourceProvider
-----------------

``IResourceProvider`` is an abstract class that documents what methods are
required of objects returned by a `provider_factory` registered with
``register_loader_type()``.  ``IResourceProvider`` is a subclass of
``IMetadataProvider``, so objects that implement this interface must also
implement all of the `IMetadataProvider Methods`_ as well as the methods
shown here.  The `manager` argument to the methods below must be an object
that supports the full `ResourceManager API`_ documented above.

``get_resource_filename(manager, resource_name)``
    Return a true filesystem path for `resource_name`, coordinating the
    extraction with `manager`, if the resource must be unpacked to the
    filesystem.

``get_resource_stream(manager, resource_name)``
    Return a readable file-like object for `resource_name`.

``get_resource_string(manager, resource_name)``
    Return a string containing the contents of `resource_name`.

``has_resource(resource_name)``
    Does the package contain the named resource?

``resource_isdir(resource_name)``
    Is the named resource a directory?  Return a false value if the resource
    does not exist or is not a directory.

``resource_listdir(resource_name)``
    Return a list of the contents of the resource directory, ala
    ``os.listdir()``.  Requesting the contents of a non-existent directory may
    raise an exception.

Note, by the way, that your provider classes need not (and should not) subclass
``IResourceProvider`` or ``IMetadataProvider``!  These classes exist solely
for documentation purposes and do not provide any useful implementation code.
You may instead wish to subclass one of the `built-in resource providers`_.


Built-in Resource Providers
---------------------------

``pkg_resources`` includes several provider classes that are automatically used
where appropriate.  Their inheritance tree looks like this::

    NullProvider
        EggProvider
            DefaultProvider
                PathMetadata
            ZipProvider
                EggMetadata
        EmptyProvider
            FileMetadata


``NullProvider``
    This provider class is just an abstract base that provides for common
    provider behaviors (such as running scripts), given a definition for just
    a few abstract methods.

``EggProvider``
    This provider class adds in some egg-specific features that are common
    to zipped and unzipped eggs.

``DefaultProvider``
    This provider class is used for unpacked eggs and "plain old Python"
    filesystem modules.

``ZipProvider``
    This provider class is used for all zipped modules, whether they are eggs
    or not.

``EmptyProvider``
    This provider class always returns answers consistent with a provider that
    has no metadata or resources.  ``Distribution`` objects created without
    a ``metadata`` argument use an instance of this provider class instead.
    Since all ``EmptyProvider`` instances are equivalent, there is no need
    to have more than one instance.  ``pkg_resources`` therefore creates a
    global instance of this class under the name ``empty_provider``, and you
    may use it if you have need of an ``EmptyProvider`` instance.

``PathMetadata(path, egg_info)``
    Create an ``IResourceProvider`` for a filesystem-based distribution, where
    `path` is the filesystem location of the importable modules, and `egg_info`
    is the filesystem location of the distribution's metadata directory.
    `egg_info` should usually be the ``EGG-INFO`` subdirectory of `path` for an
    "unpacked egg", and a ``ProjectName.egg-info`` subdirectory of `path` for
    a "development egg".  However, other uses are possible for custom purposes.

``EggMetadata(zipimporter)``
    Create an ``IResourceProvider`` for a zipfile-based distribution.  The
    `zipimporter` should be a ``zipimport.zipimporter`` instance, and may
    represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
    a specific egg *within* a basket, or a zipfile egg (where the zipfile
    itself is a ".egg").  It can also be a combination, such as a zipfile egg
    that also contains other eggs.

``FileMetadata(path_to_pkg_info)``
    Create an ``IResourceProvider`` that provides exactly one metadata
    resource: ``PKG-INFO``.  The supplied path should be a distutils PKG-INFO
    file.  This is basically the same as an ``EmptyProvider``, except that
    requests for ``PKG-INFO`` will be answered using the contents of the
    designated file.  (This provider is used to wrap ``.egg-info`` files
    installed by vendor-supplied system packages.)


Utility Functions
=================

In addition to its high-level APIs, ``pkg_resources`` also includes several
generally-useful utility routines.  These routines are used to implement the
high-level APIs, but can also be quite useful by themselves.


Parsing Utilities
-----------------

``parse_version(version)``
    Parsed a project's version string as defined by PEP 440. The returned
    value will be an object that represents the version. These objects may
    be compared to each other and sorted. The sorting algorithm is as defined
    by PEP 440 with the addition that any version which is not a valid PEP 440
    version will be considered less than any valid PEP 440 version and the
    invalid versions will continue sorting using the original algorithm.

.. _yield_lines():

``yield_lines(strs)``
    Yield non-empty/non-comment lines from a string/unicode or a possibly-
    nested sequence thereof.  If `strs` is an instance of ``basestring``, it
    is split into lines, and each non-blank, non-comment line is yielded after
    stripping leading and trailing whitespace.  (Lines whose first non-blank
    character is ``#`` are considered comment lines.)

    If `strs` is not an instance of ``basestring``, it is iterated over, and
    each item is passed recursively to ``yield_lines()``, so that an arbitrarily
    nested sequence of strings, or sequences of sequences of strings can be
    flattened out to the lines contained therein.  So for example, passing
    a file object or a list of strings to ``yield_lines`` will both work.
    (Note that between each string in a sequence of strings there is assumed to
    be an implicit line break, so lines cannot bridge two strings in a
    sequence.)

    This routine is used extensively by ``pkg_resources`` to parse metadata
    and file formats of various kinds, and most other ``pkg_resources``
    parsing functions that yield multiple values will use it to break up their
    input.  However, this routine is idempotent, so calling ``yield_lines()``
    on the output of another call to ``yield_lines()`` is completely harmless.

``split_sections(strs)``
    Split a string (or possibly-nested iterable thereof), yielding ``(section,
    content)`` pairs found using an ``.ini``-like syntax.  Each ``section`` is
    a whitespace-stripped version of the section name ("``[section]``")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any non-blank, non-comment lines before
    the first section header, they're yielded in a first ``section`` of
    ``None``.

    This routine uses ``yield_lines()`` as its front end, so you can pass in
    anything that ``yield_lines()`` accepts, such as an open text file, string,
    or sequence of strings.  ``ValueError`` is raised if a malformed section
    header is found (i.e. a line starting with ``[`` but not ending with
    ``]``).

    Note that this simplistic parser assumes that any line whose first nonblank
    character is ``[`` is a section heading, so it can't support .ini format
    variations that allow ``[`` as the first nonblank character on other lines.

``safe_name(name)``
    Return a "safe" form of a project's name, suitable for use in a
    ``Requirement`` string, as a distribution name, or a PyPI project name.
    All non-alphanumeric runs are condensed to single "-" characters, such that
    a name like "The $$$ Tree" becomes "The-Tree".  Note that if you are
    generating a filename from this value you should combine it with a call to
    ``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
    See ``to_filename()``.

``safe_version(version)``
    This will return the normalized form of any PEP 440 version, if the version
    string is not PEP 440 compatible than it is similar to ``safe_name()``
    except that spaces in the input become dots, and dots are allowed to exist
    in the output.  As with ``safe_name()``, if you are generating a filename
    from this you should replace any "-" characters in the output with
    underscores.

``safe_extra(extra)``
    Return a "safe" form of an extra's name, suitable for use in a requirement
    string or a setup script's ``extras_require`` keyword.  This routine is
    similar to ``safe_name()`` except that non-alphanumeric runs are replaced
    by a single underbar (``_``), and the result is lowercased.

``to_filename(name_or_version)``
    Escape a name or version string so it can be used in a dash-separated
    filename (or ``#egg=name-version`` tag) without ambiguity.  You
    should only pass in values that were returned by ``safe_name()`` or
    ``safe_version()``.


Platform Utilities
------------------

``get_build_platform()``
    Return this platform's identifier string.  For Windows, the return value
    is ``"win32"``, and for Mac OS X it is a string of the form
    ``"macosx-10.4-ppc"``.  All other platforms return the same uname-based
    string that the ``distutils.util.get_platform()`` function returns.
    This string is the minimum platform version required by distributions built
    on the local machine.  (Backward compatibility note: setuptools versions
    prior to 0.6b1 called this function ``get_platform()``, and the function is
    still available under that name for backward compatibility reasons.)

``get_supported_platform()`` (New in 0.6b1)
    This is the similar to ``get_build_platform()``, but is the maximum
    platform version that the local machine supports.  You will usually want
    to use this value as the ``provided`` argument to the
    ``compatible_platforms()`` function.

``compatible_platforms(provided, required)``
    Return true if a distribution built on the `provided` platform may be used
    on the `required` platform.  If either platform value is ``None``, it is
    considered a wildcard, and the platforms are therefore compatible.
    Likewise, if the platform strings are equal, they're also considered
    compatible, and ``True`` is returned.  Currently, the only non-equal
    platform strings that are considered compatible are Mac OS X platform
    strings with the same hardware type (e.g. ``ppc``) and major version
    (e.g. ``10``) with the `provided` platform's minor version being less than
    or equal to the `required` platform's minor version.

``get_default_cache()``
    Determine the default cache location for extracting resources from zipped
    eggs.  This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
    if set.  Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
    the user's "Application Data" directory.  On all other systems, it returns
    ``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
    set.


PEP 302 Utilities
-----------------

``get_importer(path_item)``
    Retrieve a PEP 302 "importer" for the given path item (which need not
    actually be on ``sys.path``).  This routine simulates the PEP 302 protocol
    for obtaining an "importer" object.  It first checks for an importer for
    the path item in ``sys.path_importer_cache``, and if not found it calls
    each of the ``sys.path_hooks`` and caches the result if a good importer is
    found.  If no importer is found, this routine returns an ``ImpWrapper``
    instance that wraps the builtin import machinery as a PEP 302-compliant
    "importer" object.  This ``ImpWrapper`` is *not* cached; instead a new
    instance is returned each time.

    (Note: When run under Python 2.5, this function is simply an alias for
    ``pkgutil.get_importer()``, and instead of ``pkg_resources.ImpWrapper``
    instances, it may return ``pkgutil.ImpImporter`` instances.)


File/Path Utilities
-------------------

``ensure_directory(path)``
    Ensure that the parent directory (``os.path.dirname``) of `path` actually
    exists, using ``os.makedirs()`` if necessary.

``normalize_path(path)``
    Return a "normalized" version of `path`, such that two paths represent
    the same filesystem location if they have equal ``normalized_path()``
    values.  Specifically, this is a shortcut for calling ``os.path.realpath``
    and ``os.path.normcase`` on `path`.  Unfortunately, on certain platforms
    (notably Cygwin and Mac OS X) the ``normcase`` function does not accurately
    reflect the platform's case-sensitivity, so there is always the possibility
    of two apparently-different paths being equal on such platforms.

History
-------

0.6c9
 * Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.

0.6c7
 * Fix package precedence problem where single-version eggs installed in
   ``site-packages`` would take precedence over ``.egg`` files (or directories)
   installed in ``site-packages``.

0.6c6
 * Fix extracted C extensions not having executable permissions under Cygwin.

 * Allow ``.egg-link`` files to contain relative paths.

 * Fix cache dir defaults on Windows when multiple environment vars are needed
   to construct a path.

0.6c4
 * Fix "dev" versions being considered newer than release candidates.

0.6c3
 * Python 2.5 compatibility fixes.

0.6c2
 * Fix a problem with eggs specified directly on ``PYTHONPATH`` on
   case-insensitive filesystems possibly not showing up in the default
   working set, due to differing normalizations of ``sys.path`` entries.

0.6b3
 * Fixed a duplicate path insertion problem on case-insensitive filesystems.

0.6b1
 * Split ``get_platform()`` into ``get_supported_platform()`` and
   ``get_build_platform()`` to work around a Mac versioning problem that caused
   the behavior of ``compatible_platforms()`` to be platform specific.

 * Fix entry point parsing when a standalone module name has whitespace
   between it and the extras.

0.6a11
 * Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
   cache permission problems get a more user-friendly explanation of the
   problem, and so that programs can catch and handle extraction errors if they
   need to.

0.6a10
 * Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
   method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
   to ``Environment``.

 * ``safe_name()`` now allows dots in project names.

 * There is a new ``to_filename()`` function that escapes project names and
   versions for safe use in constructing egg filenames from a Distribution
   object's metadata.

 * Added ``Distribution.clone()`` method, and keyword argument support to other
   ``Distribution`` constructors.

 * Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
   eggs using ``.egg-info`` format.

0.6a9
 * Don't raise an error when an invalid (unfinished) distribution is found
   unless absolutely necessary.  Warn about skipping invalid/unfinished eggs
   when building an Environment.

 * Added support for ``.egg-info`` files or directories with version/platform
   information embedded in the filename, so that system packagers have the
   option of including ``PKG-INFO`` files to indicate the presence of a
   system-installed egg, without needing to use ``.egg`` directories, zipfiles,
   or ``.pth`` manipulation.

 * Changed ``parse_version()`` to remove dashes before pre-release tags, so
   that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
   to ``0.2rc1``.  The idea that a dash *always* meant a post-release version
   was highly non-intuitive to setuptools users and Python developers, who
   seem to want to use ``-rc`` version numbers a lot.

0.6a8
 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version
   conflicts from being detected at runtime.

 * Improved runtime conflict warning message to identify a line in the user's
   program, rather than flagging the ``warn()`` call in ``pkg_resources``.

 * Avoid giving runtime conflict warnings for namespace packages, even if they
   were declared by a different package than the one currently being activated.

 * Fix path insertion algorithm for case-insensitive filesystems.

 * Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
   being set as an attribute of their parent package.

0.6a6
 * Activated distributions are now inserted in ``sys.path`` (and the working
   set) just before the directory that contains them, instead of at the end.
   This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
   the same location, and allows eggs found earlier on ``sys.path`` to override
   ones found later.

 * When a distribution is activated, it now checks whether any contained
   non-namespace modules have already been imported and issues a warning if
   a conflicting module has already been imported.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.

 * Fixed a problem extracting zipped files on Windows, when the egg in question
   has had changed contents but still has the same version number.

0.6a4
 * Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.

0.6a3
 * Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
   EntryPoint, and Distribution objects' extras handling.

0.6a1
 * Enhanced performance of ``require()`` and related operations when all
   requirements are already in the working set, and enhanced performance of
   directory scanning for distributions.

 * Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
   ``zipimport``, and the previously-broken "eager resource" support.

 * Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
   some other resource API bugs.

 * Many API changes and enhancements:

   * Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
     ``get_entry_info`` APIs for dynamic plugin discovery.

   * ``list_resources`` is now ``resource_listdir`` (and it actually works)

   * Resource API functions like ``resource_string()`` that accepted a package
     name and resource name, will now also accept a ``Requirement`` object in
     place of the package name (to allow access to non-package data files in
     an egg).

   * ``get_provider()`` will now accept a ``Requirement`` instance or a module
     name.  If it is given a ``Requirement``, it will return a corresponding
     ``Distribution`` (by calling ``require()`` if a suitable distribution
     isn't already in the working set), rather than returning a metadata and
     resource provider for a specific module.  (The difference is in how
     resource paths are interpreted; supplying a module name means resources
     path will be module-relative, rather than relative to the distribution's
     root.)

   * ``Distribution`` objects now implement the ``IResourceProvider`` and
     ``IMetadataProvider`` interfaces, so you don't need to reference the (no
     longer available) ``metadata`` attribute to get at these interfaces.

   * ``Distribution`` and ``Requirement`` both have a ``project_name``
     attribute for the project name they refer to.  (Previously these were
     ``name`` and ``distname`` attributes.)

   * The ``path`` attribute of ``Distribution`` objects is now ``location``,
     because it isn't necessarily a filesystem path (and hasn't been for some
     time now).  The ``location`` of ``Distribution`` objects in the filesystem
     should always be normalized using ``pkg_resources.normalize_path()``; all
     of the setuptools and EasyInstall code that generates distributions from
     the filesystem (including ``Distribution.from_filename()``) ensure this
     invariant, but if you use a more generic API like ``Distribution()`` or
     ``Distribution.from_location()`` you should take care that you don't
     create a distribution with an un-normalized filesystem path.

   * ``Distribution`` objects now have an ``as_requirement()`` method that
     returns a ``Requirement`` for the distribution's project name and version.

   * Distribution objects no longer have an ``installed_on()`` method, and the
     ``install_on()`` method is now ``activate()`` (but may go away altogether
     soon).  The ``depends()`` method has also been renamed to ``requires()``,
     and ``InvalidOption`` is now ``UnknownExtra``.

   * ``find_distributions()`` now takes an additional argument called ``only``,
     that tells it to only yield distributions whose location is the passed-in
     path.  (It defaults to False, so that the default behavior is unchanged.)

   * ``AvailableDistributions`` is now called ``Environment``, and the
     ``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
     because they weren't particularly useful.  ``__getitem__()`` no longer
     raises ``KeyError``; it just returns an empty list if there are no
     distributions for the named project.

   * The ``resolve()`` method of ``Environment`` is now a method of
     ``WorkingSet`` instead, and the ``best_match()`` method now uses a working
     set instead of a path list as its second argument.

   * There is a new ``pkg_resources.add_activation_listener()`` API that lets
     you register a callback for notifications about distributions added to
     ``sys.path`` (including the distributions already on it).  This is
     basically a hook for extensible applications and frameworks to be able to
     search for plugin metadata in distributions added at runtime.

0.5a13
 * Fixed a bug in resource extraction from nested packages in a zipped egg.

0.5a12
 * Updated extraction/cache mechanism for zipped resources to avoid inter-
   process and inter-thread races during extraction.  The default cache
   location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
   and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
   current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
   variable isn't set.

0.5a10
 * Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
   ``sys.path`` (e.g. if a user deletes an egg without removing it from the
   ``easy-install.pth`` file).

 * Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
   never actually went inside ``.egg`` files.

 * Made ``pkg_resources`` import the module you request resources from, if it's
   not already imported.

0.5a4
 * ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
   accept an ``installer`` argument: a callable taking one argument, a
   ``Requirement`` instance.  The callable must return a ``Distribution``
   object, or ``None`` if no distribution is found.  This feature is used by
   EasyInstall to resolve dependencies by recursively invoking itself.

0.4a4
 * Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
   directory extraction for zipped eggs.

0.4a3
 * Fixed scripts not being able to see a ``__file__`` variable in ``__main__``

 * Fixed a problem with ``resource_isdir()`` implementation that was introduced
   in 0.4a2.

0.4a1
 * Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
   ``!=``) when only one condition was included.

 * Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
   arbitrary distribution names and versions found on PyPI.

0.3a4
 * ``pkg_resources`` now supports resource directories, not just the resources
   in them.  In particular, there are ``resource_listdir()`` and
   ``resource_isdir()`` APIs.

 * ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
   multiple distributions in subdirectories whose names end with ``.egg``.
   Having such a "basket" in a directory on ``sys.path`` is equivalent to
   having the individual eggs in that directory, but the contained eggs can
   be individually added (or not) to ``sys.path``.  Currently, however, there
   is no automated way to create baskets.

 * Namespace package manipulation is now protected by the Python import lock.

0.3a1
 * Initial release.

doc/alt-python27-setuptools/psfl.txt000064400000030737151730177260013530 0ustar00A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
Reserved" are retained in Python alone or in any derivative version prepared by
Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
doc/alt-python27-setuptools/easy_install.txt000064400000223431151730177270015247 0ustar00============
Easy Install
============

Easy Install is a python module (``easy_install``) bundled with ``setuptools``
that lets you automatically download, build, install, and manage Python
packages.

Please share your experiences with us! If you encounter difficulty installing
a package, please contact us via the `distutils mailing list
<http://mail.python.org/pipermail/distutils-sig/>`_.  (Note: please DO NOT send
private email directly to the author of setuptools; it will be discarded.  The
mailing list is a searchable archive of previously-asked and answered
questions; you should begin your research there before reporting something as a
bug -- and then do so via list discussion first.)

(Also, if you'd like to learn about how you can use ``setuptools`` to make your
own packages work better with EasyInstall, or provide EasyInstall-like features
without requiring your users to use EasyInstall directly, you'll probably want
to check out the full `setuptools`_ documentation as well.)

.. contents:: **Table of Contents**


Using "Easy Install"
====================


.. _installation instructions:

Installing "Easy Install"
-------------------------

Please see the `setuptools PyPI page <https://pypi.python.org/pypi/setuptools>`_
for download links and basic installation instructions for each of the
supported platforms.

You will need at least Python 2.6.  An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform.

Note that the instructions on the setuptools PyPI page assume that you are
are installing to Python's primary ``site-packages`` directory.  If this is
not the case, you should consult the section below on `Custom Installation
Locations`_ before installing.  (And, on Windows, you should not use the
``.exe`` installer when installing to an alternate location.)

Note that ``easy_install`` normally works by downloading files from the
internet.  If you are behind an NTLM-based firewall that prevents Python
programs from accessing the net directly, you may wish to first install and use
the `APS proxy server <http://ntlmaps.sf.net/>`_, which lets you get past such
firewalls in the same way that your web browser(s) do.

(Alternately, if you do not wish easy_install to actually download anything, you
can restrict it from doing so with the ``--allow-hosts`` option; see the
sections on `restricting downloads with --allow-hosts`_ and `command-line
options`_ for more details.)


Troubleshooting
~~~~~~~~~~~~~~~

If EasyInstall/setuptools appears to install correctly, and you can run the
``easy_install`` command but it fails with an ``ImportError``, the most likely
cause is that you installed to a location other than ``site-packages``,
without taking any of the steps described in the `Custom Installation
Locations`_ section below.  Please see that section and follow the steps to
make sure that your custom location will work correctly.  Then re-install.

Similarly, if you can run ``easy_install``, and it appears to be installing
packages, but then you can't import them, the most likely issue is that you
installed EasyInstall correctly but are using it to install packages to a
non-standard location that hasn't been properly prepared.  Again, see the
section on `Custom Installation Locations`_ for more details.


Windows Notes
~~~~~~~~~~~~~

Installing setuptools will provide an ``easy_install`` command according to
the techniques described in `Executables and Launchers`_. If the
``easy_install`` command is not available after installation, that section
provides details on how to configure Windows to make the commands available.


Downloading and Installing a Package
------------------------------------

For basic use of ``easy_install``, you need only supply the filename or URL of
a source distribution or .egg file (`Python Egg`__).

__ http://peak.telecommunity.com/DevCenter/PythonEggs

**Example 1**. Install a package by name, searching PyPI for the latest
version, and automatically downloading, building, and installing it::

    easy_install SQLObject

**Example 2**. Install or upgrade a package by name and version by finding
links on a given "download page"::

    easy_install -f http://pythonpaste.org/package_index.html SQLObject

**Example 3**. Download a source distribution from a specified URL,
automatically building and installing it::

    easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

**Example 4**. Install an already-downloaded .egg file::

    easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

**Example 5**.  Upgrade an already-installed package to the latest version
listed on PyPI::

    easy_install --upgrade PyProtocols

**Example 6**.  Install a source distribution that's already downloaded and
extracted in the current directory (New in 0.5a9)::

    easy_install .

**Example 7**.  (New in 0.6a1) Find a source distribution or Subversion
checkout URL for a package, and extract it or check it out to
``~/projects/sqlobject`` (the name will always be in all-lowercase), where it
can be examined or edited.  (The package will not be installed, but it can
easily be installed with ``easy_install ~/projects/sqlobject``.  See `Editing
and Viewing Source Packages`_ below for more info.)::

    easy_install --editable --build-directory ~/projects SQLObject

**Example 7**. (New in 0.6.11) Install a distribution within your home dir::

    easy_install --user SQLAlchemy

Easy Install accepts URLs, filenames, PyPI package names (i.e., ``distutils``
"distribution" names), and package+version specifiers.  In each case, it will
attempt to locate the latest available version that meets your criteria.

When downloading or processing downloaded files, Easy Install recognizes
distutils source distribution files with extensions of .tgz, .tar, .tar.gz,
.tar.bz2, or .zip.  And of course it handles already-built .egg
distributions as well as ``.win32.exe`` installers built using distutils.

By default, packages are installed to the running Python installation's
``site-packages`` directory, unless you provide the ``-d`` or ``--install-dir``
option to specify an alternative directory, or specify an alternate location
using distutils configuration files.  (See `Configuration Files`_, below.)

By default, any scripts included with the package are installed to the running
Python installation's standard script installation location.  However, if you
specify an installation directory via the command line or a config file, then
the default directory for installing scripts will be the same as the package
installation directory, to ensure that the script will have access to the
installed package.  You can override this using the ``-s`` or ``--script-dir``
option.

Installed packages are added to an ``easy-install.pth`` file in the install
directory, so that Python will always use the most-recently-installed version
of the package.  If you would like to be able to select which version to use at
runtime, you should use the ``-m`` or ``--multi-version`` option.


Upgrading a Package
-------------------

You don't need to do anything special to upgrade a package: just install the
new version, either by requesting a specific version, e.g.::

    easy_install "SomePackage==2.0"

a version greater than the one you have now::

    easy_install "SomePackage>2.0"

using the upgrade flag, to find the latest available version on PyPI::

    easy_install --upgrade SomePackage

or by using a download page, direct download URL, or package filename::

    easy_install -f http://example.com/downloads ExamplePackage

    easy_install http://example.com/downloads/ExamplePackage-2.0-py2.4.egg

    easy_install my_downloads/ExamplePackage-2.0.tgz

If you're using ``-m`` or ``--multi-version`` , using the ``require()``
function at runtime automatically selects the newest installed version of a
package that meets your version criteria.  So, installing a newer version is
the only step needed to upgrade such packages.

If you're installing to a directory on PYTHONPATH, or a configured "site"
directory (and not using ``-m``), installing a package automatically replaces
any previous version in the ``easy-install.pth`` file, so that Python will
import the most-recently installed version by default.  So, again, installing
the newer version is the only upgrade step needed.

If you haven't suppressed script installation (using ``--exclude-scripts`` or
``-x``), then the upgraded version's scripts will be installed, and they will
be automatically patched to ``require()`` the corresponding version of the
package, so that you can use them even if they are installed in multi-version
mode.

``easy_install`` never actually deletes packages (unless you're installing a
package with the same name and version number as an existing package), so if
you want to get rid of older versions of a package, please see `Uninstalling
Packages`_, below.


Changing the Active Version
---------------------------

If you've upgraded a package, but need to revert to a previously-installed
version, you can do so like this::

    easy_install PackageName==1.2.3

Where ``1.2.3`` is replaced by the exact version number you wish to switch to.
If a package matching the requested name and version is not already installed
in a directory on ``sys.path``, it will be located via PyPI and installed.

If you'd like to switch to the latest installed version of ``PackageName``, you
can do so like this::

    easy_install PackageName

This will activate the latest installed version.  (Note: if you have set any
``find_links`` via distutils configuration files, those download pages will be
checked for the latest available version of the package, and it will be
downloaded and installed if it is newer than your current version.)

Note that changing the active version of a package will install the newly
active version's scripts, unless the ``--exclude-scripts`` or ``-x`` option is
specified.


Uninstalling Packages
---------------------

If you have replaced a package with another version, then you can just delete
the package(s) you don't need by deleting the PackageName-versioninfo.egg file
or directory (found in the installation directory).

If you want to delete the currently installed version of a package (or all
versions of a package), you should first run::

    easy_install -m PackageName

This will ensure that Python doesn't continue to search for a package you're
planning to remove. After you've done this, you can safely delete the .egg
files or directories, along with any scripts you wish to remove.


Managing Scripts
----------------

Whenever you install, upgrade, or change versions of a package, EasyInstall
automatically installs the scripts for the selected package version, unless
you tell it not to with ``-x`` or ``--exclude-scripts``.  If any scripts in
the script directory have the same name, they are overwritten.

Thus, you do not normally need to manually delete scripts for older versions of
a package, unless the newer version of the package does not include a script
of the same name.  However, if you are completely uninstalling a package, you
may wish to manually delete its scripts.

EasyInstall's default behavior means that you can normally only run scripts
from one version of a package at a time.  If you want to keep multiple versions
of a script available, however, you can simply use the ``--multi-version`` or
``-m`` option, and rename the scripts that EasyInstall creates.  This works
because EasyInstall installs scripts as short code stubs that ``require()`` the
matching version of the package the script came from, so renaming the script
has no effect on what it executes.

For example, suppose you want to use two versions of the ``rst2html`` tool
provided by the `docutils <http://docutils.sf.net/>`_ package.  You might
first install one version::

    easy_install -m docutils==0.3.9

then rename the ``rst2html.py`` to ``r2h_039``, and install another version::

    easy_install -m docutils==0.3.10

This will create another ``rst2html.py`` script, this one using docutils
version 0.3.10 instead of 0.3.9.  You now have two scripts, each using a
different version of the package.  (Notice that we used ``-m`` for both
installations, so that Python won't lock us out of using anything but the most
recently-installed version of the package.)


Executables and Launchers
-------------------------

On Unix systems, scripts are installed with as natural files with a "#!"
header and no extension and they launch under the Python version indicated in
the header.

On Windows, there is no mechanism to "execute" files without extensions, so
EasyInstall provides two techniques to mirror the Unix behavior. The behavior
is indicated by the SETUPTOOLS_LAUNCHER environment variable, which may be
"executable" (default) or "natural".

Regardless of the technique used, the script(s) will be installed to a Scripts
directory (by default in the Python installation directory). It is recommended
for EasyInstall that you ensure this directory is in the PATH environment
variable. The easiest way to ensure the Scripts directory is in the PATH is
to run ``Tools\Scripts\win_add2path.py`` from the Python directory (requires
Python 2.6 or later).

Note that instead of changing your ``PATH`` to include the Python scripts
directory, you can also retarget the installation location for scripts so they
go on a directory that's already on the ``PATH``.  For more information see
`Command-Line Options`_ and `Configuration Files`_.  During installation,
pass command line options (such as ``--script-dir``) to
``ez_setup.py`` to control where ``easy_install.exe`` will be installed.


Windows Executable Launcher
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the "executable" launcher is used, EasyInstall will create a '.exe'
launcher of the same name beside each installed script (including
``easy_install`` itself). These small .exe files launch the script of the
same name using the Python version indicated in the '#!' header.

This behavior is currently default. To force
the use of executable launchers, set ``SETUPTOOLS_LAUNCHER`` to "executable".

Natural Script Launcher
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall also supports deferring to an external launcher such as
`pylauncher <https://bitbucket.org/pypa/pylauncher>`_ for launching scripts.
Enable this experimental functionality by setting the
``SETUPTOOLS_LAUNCHER`` environment variable to "natural". EasyInstall will
then install scripts as simple
scripts with a .pya (or .pyw) extension appended. If these extensions are
associated with the pylauncher and listed in the PATHEXT environment variable,
these scripts can then be invoked simply and directly just like any other
executable. This behavior may become default in a future version.

EasyInstall uses the .pya extension instead of simply
the typical '.py' extension. This distinct extension is necessary to prevent
Python
from treating the scripts as importable modules (where name conflicts exist).
Current releases of pylauncher do not yet associate with .pya files by
default, but future versions should do so.


Tips & Techniques
-----------------

Multiple Python Versions
~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall installs itself under two names:
``easy_install`` and ``easy_install-N.N``, where ``N.N`` is the Python version
used to install it.  Thus, if you install EasyInstall for both Python 3.2 and
2.7, you can use the ``easy_install-3.2`` or ``easy_install-2.7`` scripts to
install packages for the respective Python version.

Setuptools also supplies easy_install as a runnable module which may be
invoked using ``python -m easy_install`` for any Python with Setuptools
installed.

Restricting Downloads with ``--allow-hosts``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the ``--allow-hosts`` (``-H``) option to restrict what domains
EasyInstall will look for links and downloads on.  ``--allow-hosts=None``
prevents downloading altogether.  You can also use wildcards, for example
to restrict downloading to hosts in your own intranet.  See the section below
on `Command-Line Options`_ for more details on the ``--allow-hosts`` option.

By default, there are no host restrictions in effect, but you can change this
default by editing the appropriate `configuration files`_ and adding:

.. code-block:: ini

    [easy_install]
    allow_hosts = *.myintranet.example.com,*.python.org

The above example would then allow downloads only from hosts in the
``python.org`` and ``myintranet.example.com`` domains, unless overridden on the
command line.


Installing on Un-networked Machines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Just copy the eggs or source packages you need to a directory on the target
machine, then use the ``-f`` or ``--find-links`` option to specify that
directory's location.  For example::

    easy_install -H None -f somedir SomePackage

will attempt to install SomePackage using only eggs and source packages found
in ``somedir`` and disallowing all remote access.  You should of course make
sure you have all of SomePackage's dependencies available in somedir.

If you have another machine of the same operating system and library versions
(or if the packages aren't platform-specific), you can create the directory of
eggs using a command like this::

    easy_install -zmaxd somedir SomePackage

This will tell EasyInstall to put zipped eggs or source packages for
SomePackage and all its dependencies into ``somedir``, without creating any
scripts or .pth files.  You can then copy the contents of ``somedir`` to the
target machine.  (``-z`` means zipped eggs, ``-m`` means multi-version, which
prevents .pth files from being used, ``-a`` means to copy all the eggs needed,
even if they're installed elsewhere on the machine, and ``-d`` indicates the
directory to place the eggs in.)

You can also build the eggs from local development packages that were installed
with the ``setup.py develop`` command, by including the ``-l`` option, e.g.::

    easy_install -zmaxld somedir SomePackage

This will use locally-available source distributions to build the eggs.


Packaging Others' Projects As Eggs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Need to distribute a package that isn't published in egg form?  You can use
EasyInstall to build eggs for a project.  You'll want to use the ``--zip-ok``,
``--exclude-scripts``, and possibly ``--no-deps`` options (``-z``, ``-x`` and
``-N``, respectively).  Use ``-d`` or ``--install-dir`` to specify the location
where you'd like the eggs placed.  By placing them in a directory that is
published to the web, you can then make the eggs available for download, either
in an intranet or to the internet at large.

If someone distributes a package in the form of a single ``.py`` file, you can
wrap it in an egg by tacking an ``#egg=name-version`` suffix on the file's URL.
So, something like this::

    easy_install -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will install the package as an egg, and this::

    easy_install -zmaxd. \
        -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will create a ``.egg`` file in the current directory.


Creating your own Package Index
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition to local directories and the Python Package Index, EasyInstall can
find download links on most any web page whose URL is given to the ``-f``
(``--find-links``) option.  In the simplest case, you can simply have a web
page with links to eggs or Python source packages, even an automatically
generated directory listing (such as the Apache web server provides).

If you are setting up an intranet site for package downloads, you may want to
configure the target machines to use your download site by default, adding
something like this to their `configuration files`_:

.. code-block:: ini

    [easy_install]
    find_links = http://mypackages.example.com/somedir/
                 http://turbogears.org/download/
                 http://peak.telecommunity.com/dist/

As you can see, you can list multiple URLs separated by whitespace, continuing
on multiple lines if necessary (as long as the subsequent lines are indented.

If you are more ambitious, you can also create an entirely custom package index
or PyPI mirror.  See the ``--index-url`` option under `Command-Line Options`_,
below, and also the section on `Package Index "API"`_.


Password-Protected Sites
------------------------

If a site you want to download from is password-protected using HTTP "Basic"
authentication, you can specify your credentials in the URL, like so::

    http://some_userid:some_password@some.example.com/some_path/

You can do this with both index page URLs and direct download URLs.  As long
as any HTML pages read by easy_install use *relative* links to point to the
downloads, the same user ID and password will be used to do the downloading.

Using .pypirc Credentials
-------------------------

In additional to supplying credentials in the URL, ``easy_install`` will also
honor credentials if present in the .pypirc file. Teams maintaining a private
repository of packages may already have defined access credentials for
uploading packages according to the distutils documentation. ``easy_install``
will attempt to honor those if present. Refer to the distutils documentation
for Python 2.5 or later for details on the syntax.

Controlling Build Options
~~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall respects standard distutils `Configuration Files`_, so you can use
them to configure build options for packages that it installs from source.  For
example, if you are on Windows using the MinGW compiler, you can configure the
default compiler by putting something like this:

.. code-block:: ini

    [build]
    compiler = mingw32

into the appropriate distutils configuration file.  In fact, since this is just
normal distutils configuration, it will affect any builds using that config
file, not just ones done by EasyInstall.  For example, if you add those lines
to ``distutils.cfg`` in the ``distutils`` package directory, it will be the
default compiler for *all* packages you build.  See `Configuration Files`_
below for a list of the standard configuration file locations, and links to
more documentation on using distutils configuration files.


Editing and Viewing Source Packages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sometimes a package's source distribution  contains additional documentation,
examples, configuration files, etc., that are not part of its actual code.  If
you want to be able to examine these files, you can use the ``--editable``
option to EasyInstall, and EasyInstall will look for a source distribution
or Subversion URL for the package, then download and extract it or check it out
as a subdirectory of the ``--build-directory`` you specify.  If you then wish
to install the package after editing or configuring it, you can do so by
rerunning EasyInstall with that directory as the target.

Note that using ``--editable`` stops EasyInstall from actually building or
installing the package; it just finds, obtains, and possibly unpacks it for
you.  This allows you to make changes to the package if necessary, and to
either install it in development mode using ``setup.py develop`` (if the
package uses setuptools, that is), or by running ``easy_install projectdir``
(where ``projectdir`` is the subdirectory EasyInstall created for the
downloaded package.

In order to use ``--editable`` (``-e`` for short), you *must* also supply a
``--build-directory`` (``-b`` for short).  The project will be placed in a
subdirectory of the build directory.  The subdirectory will have the same
name as the project itself, but in all-lowercase.  If a file or directory of
that name already exists, EasyInstall will print an error message and exit.

Also, when using ``--editable``, you cannot use URLs or filenames as arguments.
You *must* specify project names (and optional version requirements) so that
EasyInstall knows what directory name(s) to create.  If you need to force
EasyInstall to use a particular URL or filename, you should specify it as a
``--find-links`` item (``-f`` for short), and then also specify
the project name, e.g.::

    easy_install -eb ~/projects \
     -fhttp://prdownloads.sourceforge.net/ctypes/ctypes-0.9.6.tar.gz?download \
     ctypes==0.9.6


Dealing with Installation Conflicts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(NOTE: As of 0.6a11, this section is obsolete; it is retained here only so that
people using older versions of EasyInstall can consult it.  As of version
0.6a11, installation conflicts are handled automatically without deleting the
old or system-installed packages, and without ignoring the issue.  Instead,
eggs are automatically shifted to the front of ``sys.path`` using special
code added to the ``easy-install.pth`` file.  So, if you are using version
0.6a11 or better of setuptools, you do not need to worry about conflicts,
and the following issues do not apply to you.)

EasyInstall installs distributions in a "managed" way, such that each
distribution can be independently activated or deactivated on ``sys.path``.
However, packages that were not installed by EasyInstall are "unmanaged",
in that they usually live all in one directory and cannot be independently
activated or deactivated.

As a result, if you are using EasyInstall to upgrade an existing package, or
to install a package with the same name as an existing package, EasyInstall
will warn you of the conflict.  (This is an improvement over ``setup.py
install``, because the ``distutils`` just install new packages on top of old
ones, possibly combining two unrelated packages or leaving behind modules that
have been deleted in the newer version of the package.)

EasyInstall will stop the installation if it detects a conflict
between an existing, "unmanaged" package, and a module or package in any of
the distributions you're installing.  It will display a list of all of the
existing files and directories that would need to be deleted for the new
package to be able to function correctly.  To proceed, you must manually
delete these conflicting files and directories and re-run EasyInstall.

Of course, once you've replaced all of your existing "unmanaged" packages with
versions managed by EasyInstall, you won't have any more conflicts to worry
about!


Compressed Installation
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall tries to install packages in zipped form, if it can.  Zipping
packages can improve Python's overall import performance if you're not using
the ``--multi-version`` option, because Python processes zipfile entries on
``sys.path`` much faster than it does directories.

As of version 0.5a9, EasyInstall analyzes packages to determine whether they
can be safely installed as a zipfile, and then acts on its analysis.  (Previous
versions would not install a package as a zipfile unless you used the
``--zip-ok`` option.)

The current analysis approach is fairly conservative; it currently looks for:

 * Any use of the ``__file__`` or ``__path__`` variables (which should be
   replaced with ``pkg_resources`` API calls)

 * Possible use of ``inspect`` functions that expect to manipulate source files
   (e.g. ``inspect.getsource()``)

 * Top-level modules that might be scripts used with ``python -m`` (Python 2.4)

If any of the above are found in the package being installed, EasyInstall will
assume that the package cannot be safely run from a zipfile, and unzip it to
a directory instead.  You can override this analysis with the ``-zip-ok`` flag,
which will tell EasyInstall to install the package as a zipfile anyway.  Or,
you can use the ``--always-unzip`` flag, in which case EasyInstall will always
unzip, even if its analysis says the package is safe to run as a zipfile.

Normally, however, it is simplest to let EasyInstall handle the determination
of whether to zip or unzip, and only specify overrides when needed to work
around a problem.  If you find you need to override EasyInstall's guesses, you
may want to contact the package author and the EasyInstall maintainers, so that
they can make appropriate changes in future versions.

(Note: If a package uses ``setuptools`` in its setup script, the package author
has the option to declare the package safe or unsafe for zipped usage via the
``zip_safe`` argument to ``setup()``.  If the package author makes such a
declaration, EasyInstall believes the package's author and does not perform its
own analysis.  However, your command-line option, if any, will still override
the package author's choice.)


Reference Manual
================

Configuration Files
-------------------

(New in 0.4a2)

You may specify default options for EasyInstall using the standard
distutils configuration files, under the command heading ``easy_install``.
EasyInstall will look first for a ``setup.cfg`` file in the current directory,
then a ``~/.pydistutils.cfg`` or ``$HOME\\pydistutils.cfg`` (on Unix-like OSes
and Windows, respectively), and finally a ``distutils.cfg`` file in the
``distutils`` package directory.  Here's a simple example:

.. code-block:: ini

    [easy_install]

    # set the default location to install packages
    install_dir = /home/me/lib/python

    # Notice that indentation can be used to continue an option
    # value; this is especially useful for the "--find-links"
    # option, which tells easy_install to use download links on
    # these pages before consulting PyPI:
    #
    find_links = http://sqlobject.org/
                 http://peak.telecommunity.com/dist/

In addition to accepting configuration for its own options under
``[easy_install]``, EasyInstall also respects defaults specified for other
distutils commands.  For example, if you don't set an ``install_dir`` for
``[easy_install]``, but *have* set an ``install_lib`` for the ``[install]``
command, this will become EasyInstall's default installation directory.  Thus,
if you are already using distutils configuration files to set default install
locations, build options, etc., EasyInstall will respect your existing settings
until and unless you override them explicitly in an ``[easy_install]`` section.

For more information, see also the current Python documentation on the `use and
location of distutils configuration files <https://docs.python.org/install/index.html#inst-config-files>`_.

Notice that ``easy_install`` will use the ``setup.cfg`` from the current
working directory only if it was triggered from ``setup.py`` through the
``install_requires`` option. The standalone command will not use that file.

Command-Line Options
--------------------

``--zip-ok, -z``
    Install all packages as zip files, even if they are marked as unsafe for
    running as a zipfile.  This can be useful when EasyInstall's analysis
    of a non-setuptools package is too conservative, but keep in mind that
    the package may not work correctly.  (Changed in 0.5a9; previously this
    option was required in order for zipped installation to happen at all.)

``--always-unzip, -Z``
    Don't install any packages as zip files, even if the packages are marked
    as safe for running as a zipfile.  This can be useful if a package does
    something unsafe, but not in a way that EasyInstall can easily detect.
    EasyInstall's default analysis is currently very conservative, however, so
    you should only use this option if you've had problems with a particular
    package, and *after* reporting the problem to the package's maintainer and
    to the EasyInstall maintainers.

    (Note: the ``-z/-Z`` options only affect the installation of newly-built
    or downloaded packages that are not already installed in the target
    directory; if you want to convert an existing installed version from
    zipped to unzipped or vice versa, you'll need to delete the existing
    version first, and re-run EasyInstall.)

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``easy_install`` from
    adding an ``easy-install.pth`` entry for the package being installed, and
    if an entry for any version the package already exists, it will be removed
    upon successful installation. In multi-version mode, no specific version of
    the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``. This can be as
    simple as::

        from pkg_resources import require
        require("SomePackage", "OtherPackage", "MyPackage")

    which will put the latest installed version of the specified packages on
    ``sys.path`` for you. (For more advanced uses, like selecting specific
    versions and enabling optional dependencies, see the ``pkg_resources`` API
    doc.)

    Changed in 0.6a10: this option is no longer silently enabled when
    installing to a non-PYTHONPATH, non-"site" directory.  You must always
    explicitly use this option if you want it to be active.

``--upgrade, -U``   (New in 0.5a4)
    By default, EasyInstall only searches online if a project/version
    requirement can't be met by distributions already installed
    on sys.path or the installation directory.  However, if you supply the
    ``--upgrade`` or ``-U`` flag, EasyInstall will always check the package
    index and ``--find-links`` URLs before selecting a version to install.  In
    this way, you can force EasyInstall to use the latest available version of
    any package it installs (subject to any version requirements that might
    exclude such later versions).

``--install-dir=DIR, -d DIR``
    Set the installation directory. It is up to you to ensure that this
    directory is on ``sys.path`` at runtime, and to use
    ``pkg_resources.require()`` to enable the installed package(s) that you
    need.

    (New in 0.4a2) If this option is not directly specified on the command line
    or in a distutils configuration file, the distutils default installation
    location is used.  Normally, this would be the ``site-packages`` directory,
    but if you are using distutils configuration files, setting things like
    ``prefix`` or ``install_lib``, then those settings are taken into
    account when computing the default installation directory, as is the
    ``--prefix`` option.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't install scripts.  This is useful if you need to install multiple
    versions of a package, but do not want to reset the version that will be
    run by scripts that are already installed.

``--user`` (New in 0.6.11)
    Use the user-site-packages as specified in :pep:`370`
    instead of the global site-packages.

``--always-copy, -a``   (New in 0.5a4)
    Copy all needed distributions to the installation directory, even if they
    are already present in a directory on sys.path.  In older versions of
    EasyInstall, this was the default behavior, but now you must explicitly
    request it.  By default, EasyInstall will no longer copy such distributions
    from other sys.path directories to the installation directory, unless you
    explicitly gave the distribution's filename on the command line.

    Note that as of 0.6a10, using this option excludes "system" and
    "development" eggs from consideration because they can't be reliably
    copied.  This may cause EasyInstall to choose an older version of a package
    than what you expected, or it may cause downloading and installation of a
    fresh copy of something that's already installed.  You will see warning
    messages for any eggs that EasyInstall skips, before it falls back to an
    older version or attempts to download a fresh copy.

``--find-links=URLS_OR_FILENAMES, -f URLS_OR_FILENAMES``
    Scan the specified "download pages" or directories for direct links to eggs
    or other distributions.  Any existing file or directory names or direct
    download URLs are immediately added to EasyInstall's search cache, and any
    indirect URLs (ones that don't point to eggs or other recognized archive
    formats) are added to a list of additional places to search for download
    links.  As soon as EasyInstall has to go online to find a package (either
    because it doesn't exist locally, or because ``--upgrade`` or ``-U`` was
    used), the specified URLs will be downloaded and scanned for additional
    direct links.

    Eggs and archives found by way of ``--find-links`` are only downloaded if
    they are needed to meet a requirement specified on the command line; links
    to unneeded packages are ignored.

    If all requested packages can be found using links on the specified
    download pages, the Python Package Index will not be consulted unless you
    also specified the ``--upgrade`` or ``-U`` option.

    (Note: if you want to refer to a local HTML file containing links, you must
    use a ``file:`` URL, as filenames that do not refer to a directory, egg, or
    archive are ignored.)

    You may specify multiple URLs or file/directory names with this option,
    separated by whitespace.  Note that on the command line, you will probably
    have to surround the URL list with quotes, so that it is recognized as a
    single option value.  You can also specify URLs in a configuration file;
    see `Configuration Files`_, above.

    Changed in 0.6a10: previously all URLs and directories passed to this
    option were scanned as early as possible, but from 0.6a10 on, only
    directories and direct archive links are scanned immediately; URLs are not
    retrieved unless a package search was already going to go online due to a
    package not being available locally, or due to the use of the ``--update``
    or ``-U`` option.

``--no-find-links`` Blocks the addition of any link.
    This parameter is useful if you want to avoid adding links defined in a
    project easy_install is installing (whether it's a requested project or a
    dependency). When used, ``--find-links`` is ignored.

    Added in Distribute 0.6.11 and Setuptools 0.7.

``--index-url=URL, -i URL`` (New in 0.4a1; default changed in 0.6c7)
    Specifies the base URL of the Python Package Index.  The default is
    https://pypi.python.org/simple if not specified.  When a package is requested
    that is not locally available or linked from a ``--find-links`` download
    page, the package index will be searched for download pages for the needed
    package, and those download pages will be searched for links to download
    an egg or source distribution.

``--editable, -e`` (New in 0.6a1)
    Only find and download source distributions for the specified projects,
    unpacking them to subdirectories of the specified ``--build-directory``.
    EasyInstall will not actually build or install the requested projects or
    their dependencies; it will just find and extract them for you.  See
    `Editing and Viewing Source Packages`_ above for more details.

``--build-directory=DIR, -b DIR`` (UPDATED in 0.6a1)
    Set the directory used to build source packages.  If a package is built
    from a source distribution or checkout, it will be extracted to a
    subdirectory of the specified directory.  The subdirectory will have the
    same name as the extracted distribution's project, but in all-lowercase.
    If a file or directory of that name already exists in the given directory,
    a warning will be printed to the console, and the build will take place in
    a temporary directory instead.

    This option is most useful in combination with the ``--editable`` option,
    which forces EasyInstall to *only* find and extract (but not build and
    install) source distributions.  See `Editing and Viewing Source Packages`_,
    above, for more information.

``--verbose, -v, --quiet, -q`` (New in 0.4a4)
    Control the level of detail of EasyInstall's progress messages.  The
    default detail level is "info", which prints information only about
    relatively time-consuming operations like running a setup script, unpacking
    an archive, or retrieving a URL.  Using ``-q`` or ``--quiet`` drops the
    detail level to "warn", which will only display installation reports,
    warnings, and errors.  Using ``-v`` or ``--verbose`` increases the detail
    level to include individual file-level operations, link analysis messages,
    and distutils messages from any setup scripts that get run.  If you include
    the ``-v`` option more than once, the second and subsequent uses are passed
    down to any setup scripts, increasing the verbosity of their reporting as
    well.

``--dry-run, -n`` (New in 0.4a4)
    Don't actually install the package or scripts.  This option is passed down
    to any setup scripts run, so packages should not actually build either.
    This does *not* skip downloading, nor does it skip extracting source
    distributions to a temporary/build directory.

``--optimize=LEVEL``, ``-O LEVEL`` (New in 0.4a4)
    If you are installing from a source distribution, and are *not* using the
    ``--zip-ok`` option, this option controls the optimization level for
    compiling installed ``.py`` files to ``.pyo`` files.  It does not affect
    the compilation of modules contained in ``.egg`` files, only those in
    ``.egg`` directories.  The optimization level can be set to 0, 1, or 2;
    the default is 0 (unless it's set under ``install`` or ``install_lib`` in
    one of your distutils configuration files).

``--record=FILENAME``  (New in 0.5a4)
    Write a record of all installed files to FILENAME.  This is basically the
    same as the same option for the standard distutils "install" command, and
    is included for compatibility with tools that expect to pass this option
    to "setup.py install".

``--site-dirs=DIRLIST, -S DIRLIST``   (New in 0.6a1)
    Specify one or more custom "site" directories (separated by commas).
    "Site" directories are directories where ``.pth`` files are processed, such
    as the main Python ``site-packages`` directory.  As of 0.6a10, EasyInstall
    automatically detects whether a given directory processes ``.pth`` files
    (or can be made to do so), so you should not normally need to use this
    option.  It is is now only necessary if you want to override EasyInstall's
    judgment and force an installation directory to be treated as if it
    supported ``.pth`` files.

``--no-deps, -N``  (New in 0.6a6)
    Don't install any dependencies.  This is intended as a convenience for
    tools that wrap eggs in a platform-specific packaging system.  (We don't
    recommend that you use it for anything else.)

``--allow-hosts=PATTERNS, -H PATTERNS``   (New in 0.6a6)
    Restrict downloading and spidering to hosts matching the specified glob
    patterns.  E.g. ``-H *.python.org`` restricts web access so that only
    packages listed and downloadable from machines in the ``python.org``
    domain.  The glob patterns must match the *entire* user/host/port section of
    the target URL(s).  For example, ``*.python.org`` will NOT accept a URL
    like ``http://python.org/foo`` or ``http://www.python.org:8080/``.
    Multiple patterns can be specified by separating them with commas.  The
    default pattern is ``*``, which matches anything.

    In general, this option is mainly useful for blocking EasyInstall's web
    access altogether (e.g. ``-Hlocalhost``), or to restrict it to an intranet
    or other trusted site.  EasyInstall will do the best it can to satisfy
    dependencies given your host restrictions, but of course can fail if it
    can't find suitable packages.  EasyInstall displays all blocked URLs, so
    that you can adjust your ``--allow-hosts`` setting if it is more strict
    than you intended.  Some sites may wish to define a restrictive default
    setting for this option in their `configuration files`_, and then manually
    override the setting on the command line as needed.

``--prefix=DIR`` (New in 0.6a10)
    Use the specified directory as a base for computing the default
    installation and script directories.  On Windows, the resulting default
    directories will be ``prefix\\Lib\\site-packages`` and ``prefix\\Scripts``,
    while on other platforms the defaults will be
    ``prefix/lib/python2.X/site-packages`` (with the appropriate version
    substituted) for libraries and ``prefix/bin`` for scripts.

    Note that the ``--prefix`` option only sets the *default* installation and
    script directories, and does not override the ones set on the command line
    or in a configuration file.

``--local-snapshots-ok, -l`` (New in 0.6c6)
    Normally, EasyInstall prefers to only install *released* versions of
    projects, not in-development ones, because such projects may not
    have a currently-valid version number.  So, it usually only installs them
    when their ``setup.py`` directory is explicitly passed on the command line.

    However, if this option is used, then any in-development projects that were
    installed using the ``setup.py develop`` command, will be used to build
    eggs, effectively upgrading the "in-development" project to a snapshot
    release.  Normally, this option is used only in conjunction with the
    ``--always-copy`` option to create a distributable snapshot of every egg
    needed to run an application.

    Note that if you use this option, you must make sure that there is a valid
    version number (such as an SVN revision number tag) for any in-development
    projects that may be used, as otherwise EasyInstall may not be able to tell
    what version of the project is "newer" when future installations or
    upgrades are attempted.


.. _non-root installation:

Custom Installation Locations
-----------------------------

By default, EasyInstall installs python packages into Python's main ``site-packages`` directory,
and manages them using a custom ``.pth`` file in that same directory.

Very often though, a user or developer wants ``easy_install`` to install and manage python packages
in an alternative location, usually for one of 3 reasons:

1. They don't have access to write to the main Python site-packages directory.

2. They want a user-specific stash of packages, that is not visible to other users.

3. They want to isolate a set of packages to a specific python application, usually to minimize
   the possibility of version conflicts.

Historically, there have been many approaches to achieve custom installation.
The following section lists only the easiest and most relevant approaches [1]_.

`Use the "--user" option`_

`Use the "--user" option and customize "PYTHONUSERBASE"`_

`Use "virtualenv"`_

.. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_ in Python 2.6.

.. _PEP-370: http://www.python.org/dev/peps/pep-0370/


Use the "--user" option
~~~~~~~~~~~~~~~~~~~~~~~
With Python 2.6 came the User scheme for installation, which means that all
python distributions support an alternative install location that is specific to a user [2]_ [3]_.
The Default location for each OS is explained in the python documentation
for the ``site.USER_BASE`` variable.  This mode of installation can be turned on by
specifying the ``--user`` option to ``setup.py install`` or ``easy_install``.
This approach serves the need to have a user-specific stash of packages.

.. [2] Prior to Python2.6, Mac OS X offered a form of the User scheme. That is now subsumed into the User scheme introduced in Python 2.6.
.. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized.

Use the "--user" option and customize "PYTHONUSERBASE"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The User scheme install location can be customized by setting the ``PYTHONUSERBASE`` environment
variable, which updates the value of ``site.USER_BASE``.  To isolate packages to a specific
application, simply set the OS environment of that application to a specific value of
``PYTHONUSERBASE``, that contains just those packages.

Use "virtualenv"
~~~~~~~~~~~~~~~~
"virtualenv" is a 3rd-party python package that effectively "clones" a python installation, thereby
creating an isolated location to install packages.  The evolution of "virtualenv" started before the existence
of the User installation scheme.  "virtualenv" provides a version of ``easy_install`` that is
scoped to the cloned python install and is used in the normal way. "virtualenv" does offer various features
that the User installation scheme alone does not provide, e.g. the ability to hide the main python site-packages.

Please refer to the `virtualenv`_ documentation for more details.

.. _virtualenv: https://pypi.python.org/pypi/virtualenv



Package Index "API"
-------------------

Custom package indexes (and PyPI) must follow the following rules for
EasyInstall to be able to look up and download packages:

1. Except where stated otherwise, "pages" are HTML or XHTML, and "links"
   refer to ``href`` attributes.

2. Individual project version pages' URLs must be of the form
   ``base/projectname/version``, where ``base`` is the package index's base URL.

3. Omitting the ``/version`` part of a project page's URL (but keeping the
   trailing ``/``) should result in a page that is either:

   a) The single active version of that project, as though the version had been
      explicitly included, OR

   b) A page with links to all of the active version pages for that project.

4. Individual project version pages should contain direct links to downloadable
   distributions where possible.  It is explicitly permitted for a project's
   "long_description" to include URLs, and these should be formatted as HTML
   links by the package index, as EasyInstall does no special processing to
   identify what parts of a page are index-specific and which are part of the
   project's supplied description.

5. Where available, MD5 information should be added to download URLs by
   appending a fragment identifier of the form ``#md5=...``, where ``...`` is
   the 32-character hex MD5 digest.  EasyInstall will verify that the
   downloaded file's MD5 digest matches the given value.

6. Individual project version pages should identify any "homepage" or
   "download" URLs using ``rel="homepage"`` and ``rel="download"`` attributes
   on the HTML elements linking to those URLs. Use of these attributes will
   cause EasyInstall to always follow the provided links, unless it can be
   determined by inspection that they are downloadable distributions. If the
   links are not to downloadable distributions, they are retrieved, and if they
   are HTML, they are scanned for download links. They are *not* scanned for
   additional "homepage" or "download" links, as these are only processed for
   pages that are part of a package index site.

7. The root URL of the index, if retrieved with a trailing ``/``, must result
   in a page containing links to *all* projects' active version pages.

   (Note: This requirement is a workaround for the absence of case-insensitive
   ``safe_name()`` matching of project names in URL paths. If project names are
   matched in this fashion (e.g. via the PyPI server, mod_rewrite, or a similar
   mechanism), then it is not necessary to include this all-packages listing
   page.)

8. If a package index is accessed via a ``file://`` URL, then EasyInstall will
   automatically use ``index.html`` files, if present, when trying to read a
   directory with a trailing ``/`` on the URL.


Backward Compatibility
~~~~~~~~~~~~~~~~~~~~~~

Package indexes that wish to support setuptools versions prior to 0.6b4 should
also follow these rules:

* Homepage and download links must be preceded with ``"<th>Home Page"`` or
  ``"<th>Download URL"``, in addition to (or instead of) the ``rel=""``
  attributes on the actual links.  These marker strings do not need to be
  visible, or uncommented, however!  For example, the following is a valid
  homepage link that will work with any version of setuptools::

    <li>
     <strong>Home Page:</strong>
     <!-- <th>Home Page -->
     <a rel="homepage" href="http://sqlobject.org">http://sqlobject.org</a>
    </li>

  Even though the marker string is in an HTML comment, older versions of
  EasyInstall will still "see" it and know that the link that follows is the
  project's home page URL.

* The pages described by paragraph 3(b) of the preceding section *must*
  contain the string ``"Index of Packages</title>"`` somewhere in their text.
  This can be inside of an HTML comment, if desired, and it can be anywhere
  in the page.  (Note: this string MUST NOT appear on normal project pages, as
  described in paragraphs 2 and 3(a)!)

In addition, for compatibility with PyPI versions that do not use ``#md5=``
fragment IDs, EasyInstall uses the following regular expression to match PyPI's
displayed MD5 info (broken onto two lines for readability)::

    <a href="([^"#]+)">([^<]+)</a>\n\s+\(<a href="[^?]+\?:action=show_md5
    &amp;digest=([0-9a-f]{32})">md5</a>\)

History
=======

0.6c9
 * Fixed ``win32.exe`` support for .pth files, so unnecessary directory nesting
   is flattened out in the resulting egg.  (There was a case-sensitivity
   problem that affected some distributions, notably ``pywin32``.)

 * Prevent ``--help-commands`` and other junk from showing under Python 2.5
   when running ``easy_install --help``.

 * Fixed GUI scripts sometimes not executing on Windows

 * Fixed not picking up dependency links from recursive dependencies.

 * Only make ``.py``, ``.dll`` and ``.so`` files executable when unpacking eggs

 * Changes for Jython compatibility

 * Improved error message when a requirement is also a directory name, but the
   specified directory is not a source package.

 * Fixed ``--allow-hosts`` option blocking ``file:`` URLs

 * Fixed HTTP SVN detection failing when the page title included a project
   name (e.g. on SourceForge-hosted SVN)

 * Fix Jython script installation to handle ``#!`` lines better when
   ``sys.executable`` is a script.

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Keep site directories (e.g. ``site-packages``) from being included in
   ``.pth`` files.

0.6c7
 * ``ftp:`` download URLs now work correctly.

 * The default ``--index-url`` is now ``https://pypi.python.org/simple``, to use
   the Python Package Index's new simpler (and faster!) REST API.

0.6c6
 * EasyInstall no longer aborts the installation process if a URL it wants to
   retrieve can't be downloaded, unless the URL is an actual package download.
   Instead, it issues a warning and tries to keep going.

 * Fixed distutils-style scripts originally built on Windows having their line
   endings doubled when installed on any platform.

 * Added ``--local-snapshots-ok`` flag, to allow building eggs from projects
   installed using ``setup.py develop``.

 * Fixed not HTML-decoding URLs scraped from web pages

0.6c5
 * Fixed ``.dll`` files on Cygwin not having executable permissions when an egg
   is installed unzipped.

0.6c4
 * Added support for HTTP "Basic" authentication using ``http://user:pass@host``
   URLs.  If a password-protected page contains links to the same host (and
   protocol), those links will inherit the credentials used to access the
   original page.

 * Removed all special support for Sourceforge mirrors, as Sourceforge's
   mirror system now works well for non-browser downloads.

 * Fixed not recognizing ``win32.exe`` installers that included a custom
   bitmap.

 * Fixed not allowing ``os.open()`` of paths outside the sandbox, even if they
   are opened read-only (e.g. reading ``/dev/urandom`` for random numbers, as
   is done by ``os.urandom()`` on some platforms).

 * Fixed a problem with ``.pth`` testing on Windows when ``sys.executable``
   has a space in it (e.g., the user installed Python to a ``Program Files``
   directory).

0.6c3
 * You can once again use "python -m easy_install" with Python 2.4 and above.

 * Python 2.5 compatibility fixes added.

0.6c2
 * Windows script wrappers now support quoted arguments and arguments
   containing spaces.  (Patch contributed by Jim Fulton.)

 * The ``ez_setup.py`` script now actually works when you put a setuptools
   ``.egg`` alongside it for bootstrapping an offline machine.

 * A writable installation directory on ``sys.path`` is no longer required to
   download and extract a source distribution using ``--editable``.

 * Generated scripts now use ``-x`` on the ``#!`` line when ``sys.executable``
   contains non-ASCII characters, to prevent deprecation warnings about an
   unspecified encoding when the script is run.

0.6c1
 * EasyInstall now includes setuptools version information in the
   ``User-Agent`` string sent to websites it visits.

0.6b4
 * Fix creating Python wrappers for non-Python scripts

 * Fix ``ftp://`` directory listing URLs from causing a crash when used in the
   "Home page" or "Download URL" slots on PyPI.

 * Fix ``sys.path_importer_cache`` not being updated when an existing zipfile
   or directory is deleted/overwritten.

 * Fix not recognizing HTML 404 pages from package indexes.

 * Allow ``file://`` URLs to be used as a package index.  URLs that refer to
   directories will use an internally-generated directory listing if there is
   no ``index.html`` file in the directory.

 * Allow external links in a package index to be specified using
   ``rel="homepage"`` or ``rel="download"``, without needing the old
   PyPI-specific visible markup.

 * Suppressed warning message about possibly-misspelled project name, if an egg
   or link for that project name has already been seen.

0.6b3
 * Fix local ``--find-links`` eggs not being copied except with
   ``--always-copy``.

 * Fix sometimes not detecting local packages installed outside of "site"
   directories.

 * Fix mysterious errors during initial ``setuptools`` install, caused by
   ``ez_setup`` trying to run ``easy_install`` twice, due to a code fallthru
   after deleting the egg from which it's running.

0.6b2
 * Don't install or update a ``site.py`` patch when installing to a
   ``PYTHONPATH`` directory with ``--multi-version``, unless an
   ``easy-install.pth`` file is already in use there.

 * Construct ``.pth`` file paths in such a way that installing an egg whose
   name begins with ``import`` doesn't cause a syntax error.

 * Fixed a bogus warning message that wasn't updated since the 0.5 versions.

0.6b1
 * Better ambiguity management: accept ``#egg`` name/version even if processing
   what appears to be a correctly-named distutils file, and ignore ``.egg``
   files with no ``-``, since valid Python ``.egg`` files always have a version
   number (but Scheme eggs often don't).

 * Support ``file://`` links to directories in ``--find-links``, so that
   easy_install can build packages from local source checkouts.

 * Added automatic retry for Sourceforge mirrors.  The new download process is
   to first just try dl.sourceforge.net, then randomly select mirror IPs and
   remove ones that fail, until something works.  The removed IPs stay removed
   for the remainder of the run.

 * Ignore bdist_dumb distributions when looking at download URLs.

0.6a11
 * Process ``dependency_links.txt`` if found in a distribution, by adding the
   URLs to the list for scanning.

 * Use relative paths in ``.pth`` files when eggs are being installed to the
   same directory as the ``.pth`` file.  This maximizes portability of the
   target directory when building applications that contain eggs.

 * Added ``easy_install-N.N`` script(s) for convenience when using multiple
   Python versions.

 * Added automatic handling of installation conflicts.  Eggs are now shifted to
   the front of sys.path, in an order consistent with where they came from,
   making EasyInstall seamlessly co-operate with system package managers.

   The ``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk`` options
   are now no longer necessary, and will generate warnings at the end of a
   run if you use them.

 * Don't recursively traverse subdirectories given to ``--find-links``.

0.6a10
 * Added exhaustive testing of the install directory, including a spawn test
   for ``.pth`` file support, and directory writability/existence checks.  This
   should virtually eliminate the need to set or configure ``--site-dirs``.

 * Added ``--prefix`` option for more do-what-I-mean-ishness in the absence of
   RTFM-ing.  :)

 * Enhanced ``PYTHONPATH`` support so that you don't have to put any eggs on it
   manually to make it work.  ``--multi-version`` is no longer a silent
   default; you must explicitly use it if installing to a non-PYTHONPATH,
   non-"site" directory.

 * Expand ``$variables`` used in the ``--site-dirs``, ``--build-directory``,
   ``--install-dir``, and ``--script-dir`` options, whether on the command line
   or in configuration files.

 * Improved SourceForge mirror processing to work faster and be less affected
   by transient HTML changes made by SourceForge.

 * PyPI searches now use the exact spelling of requirements specified on the
   command line or in a project's ``install_requires``.  Previously, a
   normalized form of the name was used, which could lead to unnecessary
   full-index searches when a project's name had an underscore (``_``) in it.

 * EasyInstall can now download bare ``.py`` files and wrap them in an egg,
   as long as you include an ``#egg=name-version`` suffix on the URL, or if
   the ``.py`` file is listed as the "Download URL" on the project's PyPI page.
   This allows third parties to "package" trivial Python modules just by
   linking to them (e.g. from within their own PyPI page or download links
   page).

 * The ``--always-copy`` option now skips "system" and "development" eggs since
   they can't be reliably copied.  Note that this may cause EasyInstall to
   choose an older version of a package than what you expected, or it may cause
   downloading and installation of a fresh version of what's already installed.

 * The ``--find-links`` option previously scanned all supplied URLs and
   directories as early as possible, but now only directories and direct
   archive links are scanned immediately.  URLs are not retrieved unless a
   package search was already going to go online due to a package not being
   available locally, or due to the use of the ``--update`` or ``-U`` option.

 * Fixed the annoying ``--help-commands`` wart.

0.6a9
 * Fixed ``.pth`` file processing picking up nested eggs (i.e. ones inside
   "baskets") when they weren't explicitly listed in the ``.pth`` file.

 * If more than one URL appears to describe the exact same distribution, prefer
   the shortest one.  This helps to avoid "table of contents" CGI URLs like the
   ones on effbot.org.

 * Quote arguments to python.exe (including python's path) to avoid problems
   when Python (or a script) is installed in a directory whose name contains
   spaces on Windows.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.

0.6a8
 * Update for changed SourceForge mirror format

 * Fixed not installing dependencies for some packages fetched via Subversion

 * Fixed dependency installation with ``--always-copy`` not using the same
   dependency resolution procedure as other operations.

 * Fixed not fully removing temporary directories on Windows, if a Subversion
   checkout left read-only files behind

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

0.6a7
 * Fixed not being able to install Windows script wrappers using Python 2.3

0.6a6
 * Added support for "traditional" PYTHONPATH-based non-root installation, and
   also the convenient ``virtual-python.py`` script, based on a contribution
   by Ian Bicking.  The setuptools egg now contains a hacked ``site`` module
   that makes the PYTHONPATH-based approach work with .pth files, so that you
   can get the full EasyInstall feature set on such installations.

 * Added ``--no-deps`` and ``--allow-hosts`` options.

 * Improved Windows ``.exe`` script wrappers so that the script can have the
   same name as a module without confusing Python.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.
   Also, ensure that currently installed/selected packages aren't given
   precedence over ones desired by a package being installed, which could
   cause conflict errors.

0.6a3
 * Improved error message when trying to use old ways of running
   ``easy_install``.  Removed the ability to run via ``python -m`` or by
   running ``easy_install.py``; ``easy_install`` is the command to run on all
   supported platforms.

 * Improved wrapper script generation and runtime initialization so that a
   VersionConflict doesn't occur if you later install a competing version of a
   needed package as the default version of that package.

 * Fixed a problem parsing version numbers in ``#egg=`` links.

0.6a2
 * EasyInstall can now install "console_scripts" defined by packages that use
   ``setuptools`` and define appropriate entry points.  On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name.  On other
   platforms, the scripts are installed without a file extension.

 * Using ``python -m easy_install`` or running ``easy_install.py`` is now
   DEPRECATED, since an ``easy_install`` wrapper is now available on all
   platforms.

0.6a1
 * EasyInstall now does MD5 validation of downloads from PyPI, or from any link
   that has an "#md5=..." trailer with a 32-digit lowercase hex md5 digest.

 * EasyInstall now handles symlinks in target directories by removing the link,
   rather than attempting to overwrite the link's destination.  This makes it
   easier to set up an alternate Python "home" directory (as described above in
   the `Non-Root Installation`_ section).

 * Added support for handling MacOS platform information in ``.egg`` filenames,
   based on a contribution by Kevin Dangoor.  You may wish to delete and
   reinstall any eggs whose filename includes "darwin" and "Power_Macintosh",
   because the format for this platform information has changed so that minor
   OS X upgrades (such as 10.4.1 to 10.4.2) do not cause eggs built with a
   previous OS version to become obsolete.

 * easy_install's dependency processing algorithms have changed.  When using
   ``--always-copy``, it now ensures that dependencies are copied too.  When
   not using ``--always-copy``, it tries to use a single resolution loop,
   rather than recursing.

 * Fixed installing extra ``.pyc`` or ``.pyo`` files for scripts with ``.py``
   extensions.

 * Added ``--site-dirs`` option to allow adding custom "site" directories.
   Made ``easy-install.pth`` work in platform-specific alternate site
   directories (e.g. ``~/Library/Python/2.x/site-packages`` on Mac OS X).

 * If you manually delete the current version of a package, the next run of
   EasyInstall against the target directory will now remove the stray entry
   from the ``easy-install.pth`` file.

 * EasyInstall now recognizes URLs with a ``#egg=project_name`` fragment ID
   as pointing to the named project's source checkout.  Such URLs have a lower
   match precedence than any other kind of distribution, so they'll only be
   used if they have a higher version number than any other available
   distribution, or if you use the ``--editable`` option.  The ``#egg``
   fragment can contain a version if it's formatted as ``#egg=proj-ver``,
   where ``proj`` is the project name, and ``ver`` is the version number.  You
   *must* use the format for these values that the ``bdist_egg`` command uses;
   i.e., all non-alphanumeric runs must be condensed to single underscore
   characters.

 * Added the ``--editable`` option; see `Editing and Viewing Source Packages`_
   above for more info.  Also, slightly changed the behavior of the
   ``--build-directory`` option.

 * Fixed the setup script sandbox facility not recognizing certain paths as
   valid on case-insensitive platforms.

0.5a12
 * Fix ``python -m easy_install`` not working due to setuptools being installed
   as a zipfile.  Update safety scanner to check for modules that might be used
   as ``python -m`` scripts.

 * Misc. fixes for win32.exe support, including changes to support Python 2.4's
   changed ``bdist_wininst`` format.

0.5a10
 * Put the ``easy_install`` module back in as a module, as it's needed for
   ``python -m`` to run it!

 * Allow ``--find-links/-f`` to accept local directories or filenames as well
   as URLs.

0.5a9
 * EasyInstall now automatically detects when an "unmanaged" package or
   module is going to be on ``sys.path`` ahead of a package you're installing,
   thereby preventing the newer version from being imported.  By default, it
   will abort installation to alert you of the problem, but there are also
   new options (``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk``)
   available to change the default behavior.  (Note: this new feature doesn't
   take effect for egg files that were built with older ``setuptools``
   versions, because they lack the new metadata file required to implement it.)

 * The ``easy_install`` distutils command now uses ``DistutilsError`` as its
   base error type for errors that should just issue a message to stderr and
   exit the program without a traceback.

 * EasyInstall can now be given a path to a directory containing a setup
   script, and it will attempt to build and install the package there.

 * EasyInstall now performs a safety analysis on module contents to determine
   whether a package is likely to run in zipped form, and displays
   information about what modules may be doing introspection that would break
   when running as a zipfile.

 * Added the ``--always-unzip/-Z`` option, to force unzipping of packages that
   would ordinarily be considered safe to unzip, and changed the meaning of
   ``--zip-ok/-z`` to "always leave everything zipped".

0.5a8
 * There is now a separate documentation page for `setuptools`_; revision
   history that's not specific to EasyInstall has been moved to that page.

 .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools

0.5a5
 * Made ``easy_install`` a standard ``setuptools`` command, moving it from
   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
   that if you were importing or extending it, you must now change your imports
   accordingly.  ``easy_install.py`` is still installed as a script, but not as
   a module.

0.5a4
 * Added ``--always-copy/-a`` option to always copy needed packages to the
   installation directory, even if they're already present elsewhere on
   sys.path. (In previous versions, this was the default behavior, but now
   you must request it.)

 * Added ``--upgrade/-U`` option to force checking PyPI for latest available
   version(s) of all packages requested by name and version, even if a matching
   version is available locally.

 * Added automatic installation of dependencies declared by a distribution
   being installed.  These dependencies must be listed in the distribution's
   ``EGG-INFO`` directory, so the distribution has to have declared its
   dependencies by using setuptools.  If a package has requirements it didn't
   declare, you'll still have to deal with them yourself.  (E.g., by asking
   EasyInstall to find and install them.)

 * Added the ``--record`` option to ``easy_install`` for the benefit of tools
   that run ``setup.py install --record=filename`` on behalf of another
   packaging system.)

0.5a3
 * Fixed not setting script permissions to allow execution.

 * Improved sandboxing so that setup scripts that want a temporary directory
   (e.g. pychecker) can still run in the sandbox.

0.5a2
 * Fix stupid stupid refactoring-at-the-last-minute typos.  :(

0.5a1
 * Added support for converting ``.win32.exe`` installers to eggs on the fly.
   EasyInstall will now recognize such files by name and install them.

 * Fixed a problem with picking the "best" version to install (versions were
   being sorted as strings, rather than as parsed values)

0.4a4
 * Added support for the distutils "verbose/quiet" and "dry-run" options, as
   well as the "optimize" flag.

 * Support downloading packages that were uploaded to PyPI (by scanning all
   links on package pages, not just the homepage/download links).

0.4a3
 * Add progress messages to the search/download process so that you can tell
   what URLs it's reading to find download links.  (Hopefully, this will help
   people report out-of-date and broken links to package authors, and to tell
   when they've asked for a package that doesn't exist.)

0.4a2
 * Added support for installing scripts

 * Added support for setting options via distutils configuration files, and
   using distutils' default options as a basis for EasyInstall's defaults.

 * Renamed ``--scan-url/-s`` to ``--find-links/-f`` to free up ``-s`` for the
   script installation directory option.

 * Use ``urllib2`` instead of ``urllib``, to allow use of ``https:`` URLs if
   Python includes SSL support.

0.4a1
 * Added ``--scan-url`` and ``--index-url`` options, to scan download pages
   and search PyPI for needed packages.

0.3a4
 * Restrict ``--build-directory=DIR/-b DIR`` option to only be used with single
   URL installs, to avoid running the wrong setup.py.

0.3a3
 * Added ``--build-directory=DIR/-b DIR`` option.

 * Added "installation report" that explains how to use 'require()' when doing
   a multiversion install or alternate installation directory.

 * Added SourceForge mirror auto-select (Contributed by Ian Bicking)

 * Added "sandboxing" that stops a setup script from running if it attempts to
   write to the filesystem outside of the build area

 * Added more workarounds for packages with quirky ``install_data`` hacks

0.3a2
 * Added subversion download support for ``svn:`` and ``svn+`` URLs, as well as
   automatic recognition of HTTP subversion URLs (Contributed by Ian Bicking)

 * Misc. bug fixes

0.3a1
 * Initial release.


Future Plans
============

* Additional utilities to list/remove/verify packages
* Signature checking?  SSL?  Ability to suppress PyPI search?
* Display byte progress meter when downloading distributions and long pages?
* Redirect stdout/stderr to log during run_setup?

doc/alt-python27-setuptools/setuptools.txt000064400000367272151730177270015015 0ustar00==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
(for Python 2.6 and up) that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.  Your users don't need to
install or even know about setuptools in order to use them, and you don't
have to include the entire setuptools package in your distributions.  By
including just a single `bootstrap module`_ (a 12K .py file), your package will
automatically download and install ``setuptools`` if the user is building your
package from source and doesn't have a suitable version already installed.

.. _bootstrap module: https://bootstrap.pypa.io/ez_setup.py

Feature Highlights:

* Automatically find/download/install/upgrade dependencies at build time using
  the `EasyInstall tool <easy_install.html>`_,
  which supports downloading via HTTP, FTP, Subversion, and SourceForge, and
  automatically scans web pages linked from PyPI to find download links.  (It's
  the closest thing to CPAN currently available for Python.)

* Create `Python Eggs <http://peak.telecommunity.com/DevCenter/PythonEggs>`_ -
  a single-file importable distribution format

* Enhanced support for accessing data files hosted in zipped packages.

* Automatically include all packages in your source tree, without listing them
  individually in setup.py

* Automatically include all relevant files in your source distributions,
  without needing to create a ``MANIFEST.in`` file, and without having to force
  regeneration of the ``MANIFEST`` file when your source tree changes.

* Automatically generate wrapper scripts or Windows (console and GUI) .exe
  files for any number of "main" functions in your project.  (Note: this is not
  a py2exe replacement; the .exe files rely on the local Python installation.)

* Transparent Pyrex support, so that your setup.py can list ``.pyx`` files and
  still work even when the end-user doesn't have Pyrex installed (as long as
  you include the Pyrex-generated C in your source distribution)

* Command aliases - create project-specific, per-user, or site-wide shortcut
  names for commonly used commands and options

* PyPI upload support - upload your source distributions and eggs to PyPI

* Deploy your project in "development mode", such that it's available on
  ``sys.path``, yet can still be edited directly from its source checkout.

* Easily extend the distutils with new commands or ``setup()`` arguments, and
  distribute/reuse your extensions for multiple projects, without copying code.

* Create extensible applications and frameworks that automatically discover
  extensions, using simple "entry points" declared in a project's setup script.

.. contents:: **Table of Contents**

.. _ez_setup.py: `bootstrap module`_


-----------------
Developer's Guide
-----------------


Installing ``setuptools``
=========================

Please follow the `EasyInstall Installation Instructions`_ to install the
current stable version of setuptools.  In particular, be sure to read the
section on `Custom Installation Locations`_ if you are installing anywhere
other than Python's ``site-packages`` directory.

.. _EasyInstall Installation Instructions: easy_install.html#installation-instructions

.. _Custom Installation Locations: easy_install.html#custom-installation-locations

If you want the current in-development version of setuptools, you should first
install a stable version, and then run::

    ez_setup.py setuptools==dev

This will download and install the latest development (i.e. unstable) version
of setuptools from the Python Subversion sandbox.


Basic Use
=========

For basic use of setuptools, just import things from setuptools instead of
the distutils.  Here's a minimal setup script using setuptools::

    from setuptools import setup, find_packages
    setup(
        name="HelloWorld",
        version="0.1",
        packages=find_packages(),
    )

As you can see, it doesn't take much to use setuptools in a project.
Run that script in your project folder, alongside the Python packages
you have developed.

Invoke that script to produce eggs, upload to
PyPI, and automatically include all packages in the directory where the
setup.py lives.  See the `Command Reference`_ section below to see what
commands you can give to this setup script. For example,
to produce a source distribution, simply invoke::

    python setup.py sdist

Of course, before you release your project to PyPI, you'll want to add a bit
more information to your setup script to help people find or learn about your
project.  And maybe your project will have grown by then to include a few
dependencies, and perhaps some data files and scripts::

    from setuptools import setup, find_packages
    setup(
        name="HelloWorld",
        version="0.1",
        packages=find_packages(),
        scripts=['say_hello.py'],

        # Project uses reStructuredText, so ensure that the docutils get
        # installed or upgraded on the target machine
        install_requires=['docutils>=0.3'],

        package_data={
            # If any package contains *.txt or *.rst files, include them:
            '': ['*.txt', '*.rst'],
            # And include any *.msg files found in the 'hello' package, too:
            'hello': ['*.msg'],
        },

        # metadata for upload to PyPI
        author="Me",
        author_email="me@example.com",
        description="This is an Example Package",
        license="PSF",
        keywords="hello world example examples",
        url="http://example.com/HelloWorld/",   # project home page, if any

        # could also include long_description, download_url, classifiers, etc.
    )

In the sections that follow, we'll explain what most of these ``setup()``
arguments do (except for the metadata ones), and the various ways you might use
them in your own project(s).


Specifying Your Project's Version
---------------------------------

Setuptools can work well with most versioning schemes; there are, however, a
few special things to watch out for, in order to ensure that setuptools and
EasyInstall can always tell what version of your package is newer than another
version.  Knowing these things will also help you correctly specify what
versions of other projects your project depends on.

A version consists of an alternating series of release numbers and pre-release
or post-release tags.  A release number is a series of digits punctuated by
dots, such as ``2.4`` or ``0.5``.  Each series of digits is treated
numerically, so releases ``2.1`` and ``2.1.0`` are different ways to spell the
same release number, denoting the first subrelease of release 2.  But  ``2.10``
is the *tenth* subrelease of release 2, and so is a different and newer release
from ``2.1`` or ``2.1.0``.  Leading zeros within a series of digits are also
ignored, so ``2.01`` is the same as ``2.1``, and different from ``2.0.1``.

Following a release number, you can have either a pre-release or post-release
tag.  Pre-release tags make a version be considered *older* than the version
they are appended to.  So, revision ``2.4`` is *newer* than revision ``2.4c1``,
which in turn is newer than ``2.4b1`` or ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4-1`` and ``2.4pl3`` are newer than ``2.4``, but are *older*
than ``2.4.1`` (which has a higher release number).

A pre-release tag is a series of letters that are alphabetically before
"final".  Some examples of prerelease tags would include ``alpha``, ``beta``,
``a``, ``c``, ``dev``, and so on.  You do not have to place a dot or dash
before the prerelease tag if it's immediately after a number, but it's okay to
do so if you prefer.  Thus, ``2.4c1`` and ``2.4.c1`` and ``2.4-c1`` all
represent release candidate 1 of version ``2.4``, and are treated as identical
by setuptools.

In addition, there are three special prerelease tags that are treated as if
they were the letter ``c``: ``pre``, ``preview``, and ``rc``.  So, version
``2.4rc1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4c1``, and are treated as identical by setuptools.

A post-release tag is either a series of letters that are alphabetically
greater than or equal to "final", or a dash (``-``).  Post-release tags are
generally used to separate patch numbers, port numbers, build numbers, revision
numbers, or date stamps from the release number.  For example, the version
``2.4-r1263`` might denote Subversion revision 1263 of a post-release patch of
version ``2.4``.  Or you might use ``2.4-20051127`` to denote a date-stamped
post-release.

Notice that after each pre or post-release tag, you are free to place another
release number, followed again by more pre- or post-release tags.  For example,
``0.6a9.dev-r41475`` could denote Subversion revision 41475 of the in-
development version of the ninth alpha of release 0.6.  Notice that ``dev`` is
a pre-release tag, so this version is a *lower* version number than ``0.6a9``,
which would be the actual ninth alpha of release 0.6.  But the ``-r41475`` is
a post-release tag, so this version is *newer* than ``0.6a9.dev``.

For the most part, setuptools' interpretation of version numbers is intuitive,
but here are a few tips that will keep you out of trouble in the corner cases:

* Don't stick adjoining pre-release tags together without a dot or number
  between them.  Version ``1.9adev`` is the ``adev`` prerelease of ``1.9``,
  *not* a development pre-release of ``1.9a``.  Use ``.dev`` instead, as in
  ``1.9a.dev``, or separate the prerelease tags with a number, as in
  ``1.9a0dev``.  ``1.9a.dev``, ``1.9a0dev``, and even ``1.9.a.dev`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer.

* If you want to be certain that your chosen numbering scheme works the way
  you think it will, you can use the ``pkg_resources.parse_version()`` function
  to compare different version numbers::

    >>> from pkg_resources import parse_version
    >>> parse_version('1.9.a.dev') == parse_version('1.9a0dev')
    True
    >>> parse_version('2.1-rc2') < parse_version('2.1')
    True
    >>> parse_version('0.6a9dev-r41475') < parse_version('0.6a9')
    True

Once you've decided on a version numbering scheme for your project, you can
have setuptools automatically tag your in-development releases with various
pre- or post-release tags.  See the following sections for more details:

* `Tagging and "Daily Build" or "Snapshot" Releases`_
* `Managing "Continuous Releases" Using Subversion`_
* The `egg_info`_ command


New and Changed ``setup()`` Keywords
====================================

The following keyword arguments to ``setup()`` are added or changed by
``setuptools``.  All of them are optional; you do not have to supply them
unless you need the associated ``setuptools`` feature.

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section below on
    `Including Data Files`_.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section below on `Including Data Files`_.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section below on `Including
    Data Files`_.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section below on `Declaring
    Dependencies`_ for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See `Dynamic
    Discovery of Services and Plugins`_ for details and examples of the format
    of this argument.  In addition, this keyword is used to support `Automatic
    Script Creation`_.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section below on `Declaring
    Dependencies`_ for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``
    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (even going so far as to download them using
    ``EasyInstall``) before processing the rest of the setup script or commands.
    This argument is needed if you are using distutils extensions as part of
    your build process; for example, extensions that process setup() arguments
    and turn them into EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

``dependency_links``
    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use by tools like EasyInstall to use when installing
    an ``.egg`` file.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section below on `Namespace Packages`_ for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the `test`_ command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    `test`_ command below for more details.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (even going
    so far as to download them using ``EasyInstall``).  Note that these
    required projects will *not* be installed on the system where the tests
    are run, but only downloaded to the project's setup directory if they're
    not already installed locally.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the `names` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be '/'-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on `Automatic Resource Extraction`_.

``use_2to3``
    Convert the source code from Python 2 to Python 3 with 2to3 during the
    build process. See :doc:`python3` for more details.

``convert_2to3_doctests``
    List of doctest source files that need to be converted with 2to3.
    See :doc:`python3` for more details.

``use_2to3_fixers``
    A list of modules to search for additional fixers to be used during
    the 2to3 conversion. See :doc:`python3` for more details.


Using ``find_packages()``
-------------------------

For simple projects, it's usually easy enough to manually add packages to
the ``packages`` argument of ``setup()``.  However, for very large projects
(Twisted, PEAK, Zope, Chandler, etc.), it can be a big burden to keep the
package list updated.  That's what ``setuptools.find_packages()`` is for.

``find_packages()`` takes a source directory and two lists of package name
patterns to exclude and include.  If omitted, the source directory defaults to
the same
directory as the setup script.  Some projects use a ``src`` or ``lib``
directory as the root of their source tree, and those projects would of course
use ``"src"`` or ``"lib"`` as the first argument to ``find_packages()``.  (And
such projects also need something like ``package_dir={'':'src'}`` in their
``setup()`` arguments, but that's just a normal distutils thing.)

Anyway, ``find_packages()`` walks the target directory, filtering by inclusion
patterns, and finds Python packages (any directory). On Python 3.2 and
earlier, packages are only recognized if they include an ``__init__.py`` file.
Finally, exclusion patterns are applied to remove matching packages.

Inclusion and exclusion patterns are package names, optionally including
wildcards.  For
example, ``find_packages(exclude=["*.tests"])`` will exclude all packages whose
last name part is ``tests``.   Or, ``find_packages(exclude=["*.tests",
"*.tests.*"])`` will also exclude any subpackages of packages named ``tests``,
but it still won't exclude a top-level ``tests`` package or the children
thereof.  In fact, if you really want no ``tests`` packages at all, you'll need
something like this::

    find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])

in order to cover all the bases.  Really, the exclusion patterns are intended
to cover simpler use cases than this, like excluding a single, specified
package and its subpackages.

Regardless of the parameters, the ``find_packages()``
function returns a list of package names suitable for use as the ``packages``
argument to ``setup()``, and so is usually the easiest way to set that
argument in your setup script.  Especially since it frees you from having to
remember to modify your setup script whenever your project grows additional
top-level packages or subpackages.


Automatic Script Creation
=========================

Packaging and installing scripts can be a bit awkward with the distutils.  For
one thing, there's no easy way to have a script's filename match local
conventions on both Windows and POSIX platforms.  For another, you often have
to create a separate file just for the "main" script, when your actual "main"
is a function in a module somewhere.  And even in Python 2.4, using the ``-m``
option only works for actual ``.py`` files that aren't installed in a package.

``setuptools`` fixes all of these problems by automatically generating scripts
for you with the correct extension, and on Windows it will even create an
``.exe`` file so that users don't have to change their ``PATHEXT`` settings.
The way to use this feature is to define "entry points" in your setup script
that indicate what function the generated script should import and run.  For
example, to create two console scripts called ``foo`` and ``bar``, and a GUI
script called ``baz``, you might do something like this::

    setup(
        # other arguments here...
        entry_points={
            'console_scripts': [
                'foo = my_package.some_module:main_func',
                'bar = other_module:some_func',
            ],
            'gui_scripts': [
                'baz = my_package_gui:start_func',
            ]
        }
    )

When this project is installed on non-Windows platforms (using "setup.py
install", "setup.py develop", or by using EasyInstall), a set of ``foo``,
``bar``, and ``baz`` scripts will be installed that import ``main_func`` and
``some_func`` from the specified modules.  The functions you specify are called
with no arguments, and their return value is passed to ``sys.exit()``, so you
can return an errorlevel or message to print to stderr.

On Windows, a set of ``foo.exe``, ``bar.exe``, and ``baz.exe`` launchers are
created, alongside a set of ``foo.py``, ``bar.py``, and ``baz.pyw`` files.  The
``.exe`` wrappers find and execute the right version of Python to run the
``.py`` or ``.pyw`` file.

You may define as many "console script" and "gui script" entry points as you
like, and each one can optionally specify "extras" that it depends on, that
will be added to ``sys.path`` when the script is run.  For more information on
"extras", see the section below on `Declaring Extras`_.  For more information
on "entry points" in general, see the section below on `Dynamic Discovery of
Services and Plugins`_.


"Eggsecutable" Scripts
----------------------

Occasionally, there are situations where it's desirable to make an ``.egg``
file directly executable.  You can do this by including an entry point such
as the following::

    setup(
        # other arguments here...
        entry_points={
            'setuptools.installation': [
                'eggsecutable = my_package.some_module:main_func',
            ]
        }
    )

Any eggs built from the above setup script will include a short executable
prelude that imports and calls ``main_func()`` from ``my_package.some_module``.
The prelude can be run on Unix-like platforms (including Mac and Linux) by
invoking the egg with ``/bin/sh``, or by enabling execute permissions on the
``.egg`` file.  For the executable prelude to run, the appropriate version of
Python must be available via the ``PATH`` environment variable, under its
"long" name.  That is, if the egg is built for Python 2.3, there must be a
``python2.3`` executable present in a directory on ``PATH``.

This feature is primarily intended to support ez_setup the installation of
setuptools itself on non-Windows platforms, but may also be useful for other
projects as well.

IMPORTANT NOTE: Eggs with an "eggsecutable" header cannot be renamed, or
invoked via symlinks.  They *must* be invoked using their original filename, in
order to ensure that, once running, ``pkg_resources`` will know what project
and version is in use.  The header script will check this and exit with an
error if the ``.egg`` file has been renamed or is invoked via a symlink that
changes its base name.


Declaring Dependencies
======================

``setuptools`` supports automatically installing dependencies when a package is
installed, and including information about dependencies in Python Eggs (so that
package management tools like EasyInstall can use the information).

``setuptools`` and ``pkg_resources`` use a common syntax for specifying a
project's required dependencies.  This syntax consists of a project's PyPI
name, optionally followed by a comma-separated list of "extras" in square
brackets, optionally followed by a comma-separated list of version
specifiers.  A version specifier is one of the operators ``<``, ``>``, ``<=``,
``>=``, ``==`` or ``!=``, followed by a version identifier.  Tokens may be
separated by whitespace, but any whitespace or nonstandard characters within a
project name or version identifier must be replaced with ``-``.

Version specifiers for a given project are internally sorted into ascending
version order, and used to establish what ranges of versions are acceptable.
Adjacent redundant conditions are also consolidated (e.g. ``">1, >2"`` becomes
``">1"``, and ``"<2,<3"`` becomes ``"<3"``). ``"!="`` versions are excised from
the ranges they fall within.  A project's version is then checked for
membership in the resulting ranges. (Note that providing conflicting conditions
for the same version (e.g. "<2,>=2" or "==2,!=2") is meaningless and may
therefore produce bizarre results.)

Here are some example requirement specifiers::

    docutils >= 0.3

    # comment lines and \ continuations are allowed in requirement strings
    BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \
        ==1.6, ==1.7  # and so are line-end comments

    PEAK[FastCGI, reST]>=0.5a4

    setuptools==0.5a7

The simplest way to include requirement specifiers is to use the
``install_requires`` argument to ``setup()``.  It takes a string or list of
strings containing requirement specifiers.  If you include more than one
requirement in a string, each requirement must begin on a new line.

This has three effects:

1. When your project is installed, either by using EasyInstall, ``setup.py
   install``, or ``setup.py develop``, all of the dependencies not already
   installed will be located (via PyPI), downloaded, built (if necessary),
   and installed.

2. Any scripts in your project will be installed with wrappers that verify
   the availability of the specified dependencies at runtime, and ensure that
   the correct versions are added to ``sys.path`` (e.g. if multiple versions
   have been installed).

3. Python Egg distributions will include a metadata file listing the
   dependencies.

Note, by the way, that if you declare your dependencies in ``setup.py``, you do
*not* need to use the ``require()`` function in your scripts or modules, as
long as you either install the project or use ``setup.py develop`` to do
development work on it.  (See `"Development Mode"`_ below for more details on
using ``setup.py develop``.)


Dependencies that aren't in PyPI
--------------------------------

If your project depends on packages that aren't registered in PyPI, you may
still be able to depend on them, as long as they are available for download
as:

- an egg, in the standard distutils ``sdist`` format,
- a single ``.py`` file, or
- a VCS repository (Subversion, Mercurial, or Git).

You just need to add some URLs to the ``dependency_links`` argument to
``setup()``.

The URLs must be either:

1. direct download URLs,
2. the URLs of web pages that contain direct download links, or
3. the repository's URL

In general, it's better to link to web pages, because it is usually less
complex to update a web page than to release a new version of your project.
You can also use a SourceForge ``showfiles.php`` link in the case where a
package you depend on is distributed via SourceForge.

If you depend on a package that's distributed as a single ``.py`` file, you
must include an ``"#egg=project-version"`` suffix to the URL, to give a project
name and version number.  (Be sure to escape any dashes in the name or version
by replacing them with underscores.)  EasyInstall will recognize this suffix
and automatically create a trivial ``setup.py`` to wrap the single ``.py`` file
as an egg.

In the case of a VCS checkout, you should also append ``#egg=project-version``
in order to identify for what package that checkout should be used. You can
append ``@REV`` to the URL's path (before the fragment) to specify a revision.
Additionally, you can also force the VCS being used by prepending the URL with
a certain prefix. Currently available are:

-  ``svn+URL`` for Subversion,
-  ``git+URL`` for Git, and
-  ``hg+URL`` for Mercurial

A more complete example would be:

    ``vcs+proto://host/path@revision#egg=project-version``

Be careful with the version. It should match the one inside the project files.
If you want to disregard the version, you have to omit it both in the
``requires`` and in the URL's fragment.

This will do a checkout (or a clone, in Git and Mercurial parlance) to a
temporary folder and run ``setup.py bdist_egg``.

The ``dependency_links`` option takes the form of a list of URL strings.  For
example, the below will cause EasyInstall to search the specified page for
eggs or source distributions, if the package's dependencies aren't already
installed::

    setup(
        ...
        dependency_links=[
            "http://peak.telecommunity.com/snapshots/"
        ],
    )


.. _Declaring Extras:


Declaring "Extras" (optional features with their own dependencies)
------------------------------------------------------------------

Sometimes a project has "recommended" dependencies, that are not required for
all uses of the project.  For example, a project might offer optional PDF
output if ReportLab is installed, and reStructuredText support if docutils is
installed.  These optional features are called "extras", and setuptools allows
you to define their requirements as well.  In this way, other projects that
require these optional features can force the additional requirements to be
installed, by naming the desired extras in their ``install_requires``.

For example, let's say that Project A offers optional PDF and reST support::

    setup(
        name="Project-A",
        ...
        extras_require={
            'PDF':  ["ReportLab>=1.2", "RXP"],
            'reST': ["docutils>=0.3"],
        }
    )

As you can see, the ``extras_require`` argument takes a dictionary mapping
names of "extra" features, to strings or lists of strings describing those
features' requirements.  These requirements will *not* be automatically
installed unless another package depends on them (directly or indirectly) by
including the desired "extras" in square brackets after the associated project
name.  (Or if the extras were listed in a requirement spec on the EasyInstall
command line.)

Extras can be used by a project's `entry points`_ to specify dynamic
dependencies.  For example, if Project A includes a "rst2pdf" script, it might
declare it like this, so that the "PDF" requirements are only resolved if the
"rst2pdf" script is run::

    setup(
        name="Project-A",
        ...
        entry_points={
            'console_scripts': [
                'rst2pdf = project_a.tools.pdfgen [PDF]',
                'rst2html = project_a.tools.htmlgen',
                # more script entry points ...
            ],
        }
    )

Projects can also use another project's extras when specifying dependencies.
For example, if project B needs "project A" with PDF support installed, it
might declare the dependency like this::

    setup(
        name="Project-B",
        install_requires=["Project-A[PDF]"],
        ...
    )

This will cause ReportLab to be installed along with project A, if project B is
installed -- even if project A was already installed.  In this way, a project
can encapsulate groups of optional "downstream dependencies" under a feature
name, so that packages that depend on it don't have to know what the downstream
dependencies are.  If a later version of Project A builds in PDF support and
no longer needs ReportLab, or if it ends up needing other dependencies besides
ReportLab in order to provide PDF support, Project B's setup information does
not need to change, but the right packages will still be installed if needed.

Note, by the way, that if a project ends up not needing any other packages to
support a feature, it should keep an empty requirements list for that feature
in its ``extras_require`` argument, so that packages depending on that feature
don't break (due to an invalid feature name).  For example, if Project A above
builds in PDF support and no longer needs ReportLab, it could change its
setup to this::

    setup(
        name="Project-A",
        ...
        extras_require={
            'PDF':  [],
            'reST': ["docutils>=0.3"],
        }
    )

so that Package B doesn't have to remove the ``[PDF]`` from its requirement
specifier.


.. _Platform Specific Dependencies:


Declaring platform specific dependencies
----------------------------------------

Sometimes a project might require a dependency to run on a specific platform.
This could to a package that back ports a module so that it can be used in
older python versions.  Or it could be a package that is required to run on a
specific operating system.  This will allow a project to work on multiple
different platforms without installing dependencies that are not required for
a platform that is installing the project.

For example, here is a project that uses the ``enum`` module and ``pywin32``::

    setup(
        name="Project",
        ...
        install_requires=[
            'enum34;python_version<"3.4"',
            'pywin32 >= 1.0;platform_system=="Windows"'
        ]
    )

Since the ``enum`` module was added in Python 3.4, it should only be installed
if the python version is earlier.  Since ``pywin32`` will only be used on
windows, it should only be installed when the operating system is Windows.
Specifying version requirements for the dependencies is supported as normal.

The environmental markers that may be used for testing platform types are
detailed in `PEP 508`_.

.. _PEP 508: https://www.python.org/dev/peps/pep-0508/

Including Data Files
====================

The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location.  However, the most common use case
for data files distributed with a package is for use *by* the package, usually
by including the data files in the package directory.

Setuptools offers three ways to specify data files to be included in your
packages.  First, you can simply use the ``include_package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        include_package_data=True
    )

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
(They can also be tracked by a revision control system, using an appropriate
plugin.  See the section below on `Adding Support for Revision Control
Systems`_ for information on how to write such plugins.)

If you want finer-grained control over what files are included (for example,
if you have documentation files in your package directories and want to exclude
them from installation), then you can also use the ``package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        package_data={
            # If any package contains *.txt or *.rst files, include them:
            '': ['*.txt', '*.rst'],
            # And include any *.msg files found in the 'hello' package, too:
            'hello': ['*.msg'],
        }
    )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns.  The globs may include subdirectory names, if the data
files are contained in a subdirectory of the package.  For example, if the
package tree looks like this::

    setup.py
    src/
        mypkg/
            __init__.py
            mypkg.txt
            data/
                somefile.dat
                otherdata.dat

The setuptools setup file might look like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages('src'),  # include all packages under src
        package_dir={'':'src'},   # tell distutils packages are under src

        package_data={
            # If any package contains *.txt files, include them:
            '': ['*.txt'],
            # And include any *.dat files found in the 'data' subdirectory
            # of the 'mypkg' package, also:
            'mypkg': ['data/*.dat'],
        }
    )

Notice that if you list patterns in ``package_data`` under the empty string,
these patterns are used to find files in every package, even ones that also
have their own patterns listed.  Thus, in the above example, the ``mypkg.txt``
file gets included even though it's not listed in the patterns for ``mypkg``.

Also notice that if you use paths, you *must* use a forward slash (``/``) as
the path separator, even if you are on Windows.  Setuptools automatically
converts slashes to appropriate platform-specific separators at build time.

(Note: although the ``package_data`` argument was previously only available in
``setuptools``, it was also added to the Python ``distutils`` package as of
Python 2.4; there is `some documentation for the feature`__ available on the
python.org website.  If using the setuptools-specific ``include_package_data``
argument, files specified by ``package_data`` will *not* be automatically
added to the manifest unless they are listed in the MANIFEST.in file.)

__ http://docs.python.org/dist/node11.html

Sometimes, the ``include_package_data`` or ``package_data`` options alone
aren't sufficient to precisely define what files you want included.  For
example, you may want to include package README files in your revision control
system and source distributions, but exclude them from being installed.  So,
setuptools offers an ``exclude_package_data`` option as well, that allows you
to do things like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages('src'),  # include all packages under src
        package_dir={'':'src'},   # tell distutils packages are under src

        include_package_data=True,    # include everything in source control

        # ...but exclude README.txt from all packages
        exclude_package_data={'': ['README.txt']},
    )

The ``exclude_package_data`` option is a dictionary mapping package names to
lists of wildcard patterns, just like the ``package_data`` option.  And, just
as with that option, a key of ``''`` will apply the given pattern(s) to all
packages.  However, any files that match these patterns will be *excluded*
from installation, even if they were listed in ``package_data`` or were
included as a result of using ``include_package_data``.

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by ``MANIFEST.in``.

``package_data``
    Specify additional patterns to match files and directories that may or may
    not be matched by ``MANIFEST.in`` or found in source control.

``exclude_package_data``
    Specify patterns for data files and directories that should *not* be
    included when a package is installed, even if they would otherwise have
    been included due to the use of the preceding options.

NOTE: Due to the way the distutils build process works, a data file that you
include in your project and then stop including may be "orphaned" in your
project's build directories, requiring you to run ``setup.py clean --all`` to
fully remove them.  This may also be important for your users and contributors
if they track intermediate revisions of your project using Subversion; be sure
to let them know when you make changes that remove files from inclusion so they
can run ``setup.py clean --all``.


Accessing Data Files at Runtime
-------------------------------

Typically, existing programs manipulate a package's ``__file__`` attribute in
order to find the location of data files.  However, this manipulation isn't
compatible with PEP 302-based import hooks, including importing from zip files
and Python Eggs.  It is strongly recommended that, if you are using data files,
you should use the :ref:`ResourceManager API` of ``pkg_resources`` to access
them.  The ``pkg_resources`` module is distributed as part of setuptools, so if
you're using setuptools to distribute your package, there is no reason not to
use its resource management API.  See also `Accessing Package Resources`_ for
a quick example of converting code that uses ``__file__`` to use
``pkg_resources`` instead.

.. _Accessing Package Resources: http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources


Non-Package Data Files
----------------------

The ``distutils`` normally install general "data files" to a platform-specific
location (e.g. ``/usr/share``).  This feature intended to be used for things
like documentation, example configuration files, and the like.  ``setuptools``
does not install these data files in a separate location, however.  They are
bundled inside the egg file or directory, alongside the Python modules and
packages.  The data files can also be accessed using the :ref:`ResourceManager
API`, by specifying a ``Requirement`` instead of a package name::

    from pkg_resources import Requirement, resource_filename
    filename = resource_filename(Requirement.parse("MyProject"),"sample.conf")

The above code will obtain the filename of the "sample.conf" file in the data
root of the "MyProject" distribution.

Note, by the way, that this encapsulation of data files means that you can't
actually install data files to some arbitrary location on a user's machine;
this is a feature, not a bug.  You can always include a script in your
distribution that extracts and copies your the documentation or data files to
a user-specified location, at their discretion.  If you put related data files
in a single directory, you can use ``resource_filename()`` with the directory
name to get a filesystem directory that then can be copied with the ``shutil``
module.  (Even if your package is installed as a zipfile, calling
``resource_filename()`` on a directory will return an actual filesystem
directory, whose contents will be that entire subtree of your distribution.)

(Of course, if you're writing a new package, you can just as easily place your
data files or directories inside one of your packages, rather than using the
distutils' approach.  However, if you're updating an existing application, it
may be simpler not to change the way it currently specifies these data files.)


Automatic Resource Extraction
-----------------------------

If you are using tools that expect your resources to be "real" files, or your
project includes non-extension native libraries or other files that your C
extensions expect to be able to access, you may need to list those files in
the ``eager_resources`` argument to ``setup()``, so that the files will be
extracted together, whenever a C extension in the project is imported.

This is especially important if your project includes shared libraries *other*
than distutils-built C extensions, and those shared libraries use file
extensions other than ``.dll``, ``.so``, or ``.dylib``, which are the
extensions that setuptools 0.6a8 and higher automatically detects as shared
libraries and adds to the ``native_libs.txt`` file for you.  Any shared
libraries whose names do not end with one of those extensions should be listed
as ``eager_resources``, because they need to be present in the filesystem when
he C extensions that link to them are used.

The ``pkg_resources`` runtime for compressed packages will automatically
extract *all* C extensions and ``eager_resources`` at the same time, whenever
*any* C extension or eager resource is requested via the ``resource_filename()``
API.  (C extensions are imported using ``resource_filename()`` internally.)
This ensures that C extensions will see all of the "real" files that they
expect to see.

Note also that you can list directory resource names in ``eager_resources`` as
well, in which case the directory's contents (including subdirectories) will be
extracted whenever any C extension or eager resource is requested.

Please note that if you're not sure whether you need to use this argument, you
don't!  It's really intended to support projects with lots of non-Python
dependencies and as a last resort for crufty projects that can't otherwise
handle being compressed.  If your package is pure Python, Python plus data
files, or Python plus C, you really don't need this.  You've got to be using
either C or an external program that needs "real" files in your project before
there's any possibility of ``eager_resources`` being relevant to your project.


Extensible Applications and Frameworks
======================================


.. _Entry Points:

Dynamic Discovery of Services and Plugins
-----------------------------------------

``setuptools`` supports creating libraries that "plug in" to extensible
applications and frameworks, by letting you register "entry points" in your
project that can be imported by the application or framework.

For example, suppose that a blogging tool wants to support plugins
that provide translation for various file types to the blog's output format.
The framework might define an "entry point group" called ``blogtool.parsers``,
and then allow plugins to register entry points for the file extensions they
support.

This would allow people to create distributions that contain one or more
parsers for different file types, and then the blogging tool would be able to
find the parsers at runtime by looking up an entry point for the file
extension (or mime type, or however it wants to).

Note that if the blogging tool includes parsers for certain file formats, it
can register these as entry points in its own setup script, which means it
doesn't have to special-case its built-in formats.  They can just be treated
the same as any other plugin's entry points would be.

If you're creating a project that plugs in to an existing application or
framework, you'll need to know what entry points or entry point groups are
defined by that application or framework.  Then, you can register entry points
in your setup script.  Here are a few examples of ways you might register an
``.rst`` file parser entry point in the ``blogtool.parsers`` entry point group,
for our hypothetical blogging tool::

    setup(
        # ...
        entry_points={'blogtool.parsers': '.rst = some_module:SomeClass'}
    )

    setup(
        # ...
        entry_points={'blogtool.parsers': ['.rst = some_module:a_func']}
    )

    setup(
        # ...
        entry_points="""
            [blogtool.parsers]
            .rst = some.nested.module:SomeClass.some_classmethod [reST]
        """,
        extras_require=dict(reST="Docutils>=0.3.5")
    )

The ``entry_points`` argument to ``setup()`` accepts either a string with
``.ini``-style sections, or a dictionary mapping entry point group names to
either strings or lists of strings containing entry point specifiers.  An
entry point specifier consists of a name and value, separated by an ``=``
sign.  The value consists of a dotted module name, optionally followed by a
``:`` and a dotted identifier naming an object within the module.  It can
also include a bracketed list of "extras" that are required for the entry
point to be used.  When the invoking application or framework requests loading
of an entry point, any requirements implied by the associated extras will be
passed to ``pkg_resources.require()``, so that an appropriate error message
can be displayed if the needed package(s) are missing.  (Of course, the
invoking app or framework can ignore such errors if it wants to make an entry
point optional if a requirement isn't installed.)


Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata to include in eggs, which they can then access using the
``pkg_resources`` metadata APIs.  Ordinarily, this is done by having plugin
developers include additional files in their ``ProjectName.egg-info``
directory.  However, since it can be tedious to create such files by hand, you
may want to create a distutils extension that will create the necessary files
from arguments to ``setup()``, in much the same way that ``setuptools`` does
for many of the ``setup()`` arguments it adds.  See the section below on
`Creating distutils Extensions`_ for more details, especially the subsection on
`Adding new EGG-INFO Files`_.


"Development Mode"
==================

Under normal circumstances, the ``distutils`` assume that you are going to
build a distribution of your project, not use it in its "raw" or "unbuilt"
form.  If you were to use the ``distutils`` that way, you would have to rebuild
and reinstall your project every time you made a change to it during
development.

Another problem that sometimes comes up with the ``distutils`` is that you may
need to do development on two related projects at the same time.  You may need
to put both projects' packages in the same directory to run them, but need to
keep them separate for revision control purposes.  How can you do this?

Setuptools allows you to deploy your projects for use in a common directory or
staging area, but without copying any files.  Thus, you can edit each project's
code in its checkout directory, and only need to run build commands when you
change a project's C extensions or similarly compiled files.  You can even
deploy a project into another project's checkout directory, if that's your
preferred way of working (as opposed to using a common independent staging area
or the site-packages directory).

To do this, use the ``setup.py develop`` command.  It works very similarly to
``setup.py install`` or the EasyInstall tool, except that it doesn't actually
install anything.  Instead, it creates a special ``.egg-link`` file in the
deployment directory, that links to your project's source code.  And, if your
deployment directory is Python's ``site-packages`` directory, it will also
update the ``easy-install.pth`` file to include your project's source code,
thereby making it available on ``sys.path`` for all programs using that Python
installation.

If you have enabled the ``use_2to3`` flag, then of course the ``.egg-link``
will not link directly to your source code when run under Python 3, since
that source code would be made for Python 2 and not work under Python 3.
Instead the ``setup.py develop`` will build Python 3 code under the ``build``
directory, and link there. This means that after doing code changes you will
have to run ``setup.py build`` before these changes are picked up by your
Python 3 installation.

In addition, the ``develop`` command creates wrapper scripts in the target
script directory that will run your in-development scripts after ensuring that
all your ``install_requires`` packages are available on ``sys.path``.

You can deploy the same project to multiple staging areas, e.g. if you have
multiple projects on the same machine that are sharing the same project you're
doing development work.

When you're done with a given development task, you can remove the project
source from a staging area using ``setup.py develop --uninstall``, specifying
the desired staging area if it's not the default.

There are several options to control the precise behavior of the ``develop``
command; see the section on the `develop`_ command below for more details.

Note that you can also apply setuptools commands to non-setuptools projects,
using commands like this::

   python -c "import setuptools; execfile('setup.py')" develop

That is, you can simply list the normal setup commands and options following
the quoted part.


Distributing a ``setuptools``-based project
===========================================

Using ``setuptools``...  Without bundling it!
---------------------------------------------

.. warning:: **ez_setup** is deprecated in favor of PIP with **PEP-518** support.

Your users might not have ``setuptools`` installed on their machines, or even
if they do, it might not be the right version.  Fixing this is easy; just
download `ez_setup.py`_, and put it in the same directory as your ``setup.py``
script.  (Be sure to add it to your revision control system, too.)  Then add
these two lines to the very top of your setup script, before the script imports
anything from setuptools:

.. code-block:: python

    import ez_setup
    ez_setup.use_setuptools()

That's it.  The ``ez_setup`` module will automatically download a matching
version of ``setuptools`` from PyPI, if it isn't present on the target system.
Whenever you install an updated version of setuptools, you should also update
your projects' ``ez_setup.py`` files, so that a matching version gets installed
on the target machine(s).

By the way, setuptools supports the new PyPI "upload" command, so you can use
``setup.py sdist upload`` or ``setup.py bdist_egg upload`` to upload your
source or egg distributions respectively.  Your project's current version must
be registered with PyPI first, of course; you can use ``setup.py register`` to
do that.  Or you can do it all in one step, e.g. ``setup.py register sdist
bdist_egg upload`` will register the package, build source and egg
distributions, and then upload them both to PyPI, where they'll be easily
found by other projects that depend on them.

(By the way, if you need to distribute a specific version of ``setuptools``,
you can specify the exact version and base download URL as parameters to the
``use_setuptools()`` function.  See the function's docstring for details.)


What Your Users Should Know
---------------------------

In general, a setuptools-based project looks just like any distutils-based
project -- as long as your users have an internet connection and are installing
to ``site-packages``, that is.  But for some users, these conditions don't
apply, and they may become frustrated if this is their first encounter with
a setuptools-based project.  To keep these users happy, you should review the
following topics in your project's installation instructions, if they are
relevant to your project and your target audience isn't already familiar with
setuptools and ``easy_install``.

Network Access
    If your project is using ``ez_setup``, you should inform users of the
    need to either have network access, or to preinstall the correct version of
    setuptools using the `EasyInstall installation instructions`_.  Those
    instructions also have tips for dealing with firewalls as well as how to
    manually download and install setuptools.

Custom Installation Locations
    You should inform your users that if they are installing your project to
    somewhere other than the main ``site-packages`` directory, they should
    first install setuptools using the instructions for `Custom Installation
    Locations`_, before installing your project.

Your Project's Dependencies
    If your project depends on other projects that may need to be downloaded
    from PyPI or elsewhere, you should list them in your installation
    instructions, or tell users how to find out what they are.  While most
    users will not need this information, any users who don't have unrestricted
    internet access may have to find, download, and install the other projects
    manually.  (Note, however, that they must still install those projects
    using ``easy_install``, or your project will not know they are installed,
    and your setup script will try to download them again.)

    If you want to be especially friendly to users with limited network access,
    you may wish to build eggs for your project and its dependencies, making
    them all available for download from your site, or at least create a page
    with links to all of the needed eggs.  In this way, users with limited
    network access can manually download all the eggs to a single directory,
    then use the ``-f`` option of ``easy_install`` to specify the directory
    to find eggs in.  Users who have full network access can just use ``-f``
    with the URL of your download page, and ``easy_install`` will find all the
    needed eggs using your links directly.  This is also useful when your
    target audience isn't able to compile packages (e.g. most Windows users)
    and your package or some of its dependencies include C code.

Revision Control System Users and Co-Developers
    Users and co-developers who are tracking your in-development code using
    a revision control system should probably read this manual's sections
    regarding such development.  Alternately, you may wish to create a
    quick-reference guide containing the tips from this manual that apply to
    your particular situation.  For example, if you recommend that people use
    ``setup.py develop`` when tracking your in-development code, you should let
    them know that this needs to be run after every update or commit.

    Similarly, if you remove modules or data files from your project, you
    should remind them to run ``setup.py clean --all`` and delete any obsolete
    ``.pyc`` or ``.pyo``.  (This tip applies to the distutils in general, not
    just setuptools, but not everybody knows about them; be kind to your users
    by spelling out your project's best practices rather than leaving them
    guessing.)

Creating System Packages
    Some users want to manage all Python packages using a single package
    manager, and sometimes that package manager isn't ``easy_install``!
    Setuptools currently supports ``bdist_rpm``, ``bdist_wininst``, and
    ``bdist_dumb`` formats for system packaging.  If a user has a locally-
    installed "bdist" packaging tool that internally uses the distutils
    ``install`` command, it should be able to work with ``setuptools``.  Some
    examples of "bdist" formats that this should work with include the
    ``bdist_nsi`` and ``bdist_msi`` formats for Windows.

    However, packaging tools that build binary distributions by running
    ``setup.py install`` on the command line or as a subprocess will require
    modification to work with setuptools.  They should use the
    ``--single-version-externally-managed`` option to the ``install`` command,
    combined with the standard ``--root`` or ``--record`` options.
    See the `install command`_ documentation below for more details.  The
    ``bdist_deb`` command is an example of a command that currently requires
    this kind of patching to work with setuptools.

    If you or your users have a problem building a usable system package for
    your project, please report the problem via the mailing list so that
    either the "bdist" tool in question or setuptools can be modified to
    resolve the issue.


Setting the ``zip_safe`` flag
-----------------------------

For some use cases (such as bundling as part of a larger application), Python
packages may be run directly from a zip file.
Not all packages, however, are capable of running in compressed form, because
they may expect to be able to access either source code or data files as
normal operating system files.  So, ``setuptools`` can install your project
as a zipfile or a directory, and its default choice is determined by the
project's ``zip_safe`` flag.

You can pass a True or False value for the ``zip_safe`` argument to the
``setup()`` function, or you can omit it.  If you omit it, the ``bdist_egg``
command will analyze your project's contents to see if it can detect any
conditions that would prevent it from working in a zipfile.  It will output
notices to the console about any such conditions that it finds.

Currently, this analysis is extremely conservative: it will consider the
project unsafe if it contains any C extensions or datafiles whatsoever.  This
does *not* mean that the project can't or won't work as a zipfile!  It just
means that the ``bdist_egg`` authors aren't yet comfortable asserting that
the project *will* work.  If the project contains no C or data files, and does
no ``__file__`` or ``__path__`` introspection or source code manipulation, then
there is an extremely solid chance the project will work when installed as a
zipfile.  (And if the project uses ``pkg_resources`` for all its data file
access, then C extensions and other data files shouldn't be a problem at all.
See the `Accessing Data Files at Runtime`_ section above for more information.)

However, if ``bdist_egg`` can't be *sure* that your package will work, but
you've checked over all the warnings it issued, and you are either satisfied it
*will* work (or if you want to try it for yourself), then you should set
``zip_safe`` to ``True`` in your ``setup()`` call.  If it turns out that it
doesn't work, you can always change it to ``False``, which will force
``setuptools`` to install your project as a directory rather than as a zipfile.

Of course, the end-user can still override either decision, if they are using
EasyInstall to install your package.  And, if you want to override for testing
purposes, you can just run ``setup.py easy_install --zip-ok .`` or ``setup.py
easy_install --always-unzip .`` in your project directory. to install the
package as a zipfile or directory, respectively.

In the future, as we gain more experience with different packages and become
more satisfied with the robustness of the ``pkg_resources`` runtime, the
"zip safety" analysis may become less conservative.  However, we strongly
recommend that you determine for yourself whether your project functions
correctly when installed as a zipfile, correct any problems if you can, and
then make an explicit declaration of ``True`` or ``False`` for the ``zip_safe``
flag, so that it will not be necessary for ``bdist_egg`` or ``EasyInstall`` to
try to guess whether your project can work as a zipfile.


Namespace Packages
------------------

Sometimes, a large package is more useful if distributed as a collection of
smaller eggs.  However, Python does not normally allow the contents of a
package to be retrieved from more than one location.  "Namespace packages"
are a solution for this problem.  When you declare a package to be a namespace
package, it means that the package has no meaningful contents in its
``__init__.py``, and that it is merely a container for modules and subpackages.

The ``pkg_resources`` runtime will then automatically ensure that the contents
of namespace packages that are spread over multiple eggs or directories are
combined into a single "virtual" package.

The ``namespace_packages`` argument to ``setup()`` lets you declare your
project's namespace packages, so that they will be included in your project's
metadata.  The argument should list the namespace packages that the egg
participates in.  For example, the ZopeInterface project might do this::

    setup(
        # ...
        namespace_packages=['zope']
    )

because it contains a ``zope.interface`` package that lives in the ``zope``
namespace package.  Similarly, a project for a standalone ``zope.publisher``
would also declare the ``zope`` namespace package.  When these projects are
installed and used, Python will see them both as part of a "virtual" ``zope``
package, even though they will be installed in different locations.

Namespace packages don't have to be top-level packages.  For example, Zope 3's
``zope.app`` package is a namespace package, and in the future PEAK's
``peak.util`` package will be too.

Note, by the way, that your project's source tree must include the namespace
packages' ``__init__.py`` files (and the ``__init__.py`` of any parent
packages), in a normal Python package layout.  These ``__init__.py`` files
*must* contain the line::

    __import__('pkg_resources').declare_namespace(__name__)

This code ensures that the namespace package machinery is operating and that
the current package is registered as a namespace package.

You must NOT include any other code and data in a namespace package's
``__init__.py``.  Even though it may appear to work during development, or when
projects are installed as ``.egg`` files, it will not work when the projects
are installed using "system" packaging tools -- in such cases the
``__init__.py`` files will not be installed, let alone executed.

You must include the ``declare_namespace()``  line in the ``__init__.py`` of
*every* project that has contents for the namespace package in question, in
order to ensure that the namespace will be declared regardless of which
project's copy of ``__init__.py`` is loaded first.  If the first loaded
``__init__.py`` doesn't declare it, it will never *be* declared, because no
other copies will ever be loaded!


TRANSITIONAL NOTE
~~~~~~~~~~~~~~~~~

Setuptools automatically calls ``declare_namespace()`` for you at runtime,
but future versions may *not*.  This is because the automatic declaration
feature has some negative side effects, such as needing to import all namespace
packages during the initialization of the ``pkg_resources`` runtime, and also
the need for ``pkg_resources`` to be explicitly imported before any namespace
packages work at all.  In some future releases, you'll be responsible
for including your own declaration lines, and the automatic declaration feature
will be dropped to get rid of the negative side effects.

During the remainder of the current development cycle, therefore, setuptools
will warn you about missing ``declare_namespace()`` calls in your
``__init__.py`` files, and you should correct these as soon as possible
before the compatibility support is removed.
Namespace packages without declaration lines will not work
correctly once a user has upgraded to a later version, so it's important that
you make this change now in order to avoid having your code break in the field.
Our apologies for the inconvenience, and thank you for your patience.



Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

When a set of related projects are under development, it may be important to
track finer-grained version increments than you would normally use for e.g.
"stable" releases.  While stable releases might be measured in dotted numbers
with alpha/beta/etc. status codes, development versions of a project often
need to be tracked by revision or build number or even build date.  This is
especially true when projects in development need to refer to one another, and
therefore may literally need an up-to-the-minute version of something!

To support these scenarios, ``setuptools`` allows you to "tag" your source and
egg distributions by adding one or more of the following to the project's
"official" version identifier:

* A manually-specified pre-release tag, such as "build" or "dev", or a
  manually-specified post-release tag, such as a build or revision number
  (``--tag-build=STRING, -bSTRING``)

* An 8-character representation of the build date (``--tag-date, -d``), as
  a postrelease tag

You can add these tags by adding ``egg_info`` and the desired options to
the command line ahead of the ``sdist`` or ``bdist`` commands that you want
to generate a daily build or snapshot for.  See the section below on the
`egg_info`_ command for more details.

(Also, before you release your project, be sure to see the section above on
`Specifying Your Project's Version`_ for more information about how pre- and
post-release tags affect how setuptools and EasyInstall interpret version
numbers.  This is important in order to make sure that dependency processing
tools will know which versions of your project are newer than others.)

Finally, if you are creating builds frequently, and either building them in a
downloadable location or are copying them to a distribution server, you should
probably also check out the `rotate`_ command, which lets you automatically
delete all but the N most-recently-modified distributions matching a glob
pattern.  So, you can use a command line like::

    setup.py egg_info -rbDEV bdist_egg rotate -m.egg -k3

to build an egg whose version info includes 'DEV-rNNNN' (where NNNN is the
most recent Subversion revision that affected the source tree), and then
delete any egg files from the distribution directory except for the three
that were built most recently.

If you have to manage automated builds for multiple packages, each with
different tagging and rotation policies, you may also want to check out the
`alias`_ command, which would let each package define an alias like ``daily``
that would perform the necessary tag, build, and rotate commands.  Then, a
simpler script or cron job could just run ``setup.py daily`` in each project
directory.  (And, you could also define sitewide or per-user default versions
of the ``daily`` alias, so that projects that didn't define their own would
use the appropriate defaults.)


Generating Source Distributions
-------------------------------

``setuptools`` enhances the distutils' default algorithm for source file
selection with pluggable endpoints for looking up files to include. If you are
using a revision control system, and your source distributions only need to
include files that you're tracking in revision control, use a corresponding
plugin instead of writing a ``MANIFEST.in`` file. See the section below on
`Adding Support for Revision Control Systems`_ for information on plugins.

If you need to include automatically generated files, or files that are kept in
an unsupported revision control system, you'll need to create a ``MANIFEST.in``
file to specify any files that the default file location algorithm doesn't
catch.  See the distutils documentation for more information on the format of
the ``MANIFEST.in`` file.

But, be sure to ignore any part of the distutils documentation that deals with
``MANIFEST`` or how it's generated from ``MANIFEST.in``; setuptools shields you
from these issues and doesn't work the same way in any case.  Unlike the
distutils, setuptools regenerates the source distribution manifest file
every time you build a source distribution, and it builds it inside the
project's ``.egg-info`` directory, out of the way of your main project
directory.  You therefore need not worry about whether it is up-to-date or not.

Indeed, because setuptools' approach to determining the contents of a source
distribution is so much simpler, its ``sdist`` command omits nearly all of
the options that the distutils' more complex ``sdist`` process requires.  For
all practical purposes, you'll probably use only the ``--formats`` option, if
you use any option at all.


Making your package available for EasyInstall
---------------------------------------------

If you use the ``register`` command (``setup.py register``) to register your
package with PyPI, that's most of the battle right there.  (See the
`docs for the register command`_ for more details.)

.. _docs for the register command: http://docs.python.org/dist/package-index.html

If you also use the `upload`_ command to upload actual distributions of your
package, that's even better, because EasyInstall will be able to find and
download them directly from your project's PyPI page.

However, there may be reasons why you don't want to upload distributions to
PyPI, and just want your existing distributions (or perhaps a Subversion
checkout) to be used instead.

So here's what you need to do before running the ``register`` command.  There
are three ``setup()`` arguments that affect EasyInstall:

``url`` and ``download_url``
   These become links on your project's PyPI page.  EasyInstall will examine
   them to see if they link to a package ("primary links"), or whether they are
   HTML pages.  If they're HTML pages, EasyInstall scans all HREF's on the
   page for primary links

``long_description``
   EasyInstall will check any URLs contained in this argument to see if they
   are primary links.

A URL is considered a "primary link" if it is a link to a .tar.gz, .tgz, .zip,
.egg, .egg.zip, .tar.bz2, or .exe file, or if it has an ``#egg=project`` or
``#egg=project-version`` fragment identifier attached to it.  EasyInstall
attempts to determine a project name and optional version number from the text
of a primary link *without* downloading it.  When it has found all the primary
links, EasyInstall will select the best match based on requested version,
platform compatibility, and other criteria.

So, if your ``url`` or ``download_url`` point either directly to a downloadable
source distribution, or to HTML page(s) that have direct links to such, then
EasyInstall will be able to locate downloads automatically.  If you want to
make Subversion checkouts available, then you should create links with either
``#egg=project`` or ``#egg=project-version`` added to the URL.  You should
replace ``project`` and ``version`` with the values they would have in an egg
filename.  (Be sure to actually generate an egg and then use the initial part
of the filename, rather than trying to guess what the escaped form of the
project name and version number will be.)

Note that Subversion checkout links are of lower precedence than other kinds
of distributions, so EasyInstall will not select a Subversion checkout for
downloading unless it has a version included in the ``#egg=`` suffix, and
it's a higher version than EasyInstall has seen in any other links for your
project.

As a result, it's a common practice to use mark checkout URLs with a version of
"dev" (i.e., ``#egg=projectname-dev``), so that users can do something like
this::

    easy_install --editable projectname==dev

in order to check out the in-development version of ``projectname``.


Making "Official" (Non-Snapshot) Releases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When you make an official release, creating source or binary distributions,
you will need to override the tag settings from ``setup.cfg``, so that you
don't end up registering versions like ``foobar-0.7a1.dev-r34832``.  This is
easy to do if you are developing on the trunk and using tags or branches for
your releases - just make the change to ``setup.cfg`` after branching or
tagging the release, so the trunk will still produce development snapshots.

Alternately, if you are not branching for releases, you can override the
default version options on the command line, using something like::

    python setup.py egg_info -Db "" sdist bdist_egg register upload

The first part of this command (``egg_info -Db ""``) will override the
configured tag information, before creating source and binary eggs, registering
the project with PyPI, and uploading the files.  Thus, these commands will use
the plain version from your ``setup.py``, without adding the build designation
string.

Of course, if you will be doing this a lot, you may wish to create a personal
alias for this operation, e.g.::

    python setup.py alias -u release egg_info -Db ""

You can then use it like this::

    python setup.py release sdist bdist_egg register upload

Or of course you can create more elaborate aliases that do all of the above.
See the sections below on the `egg_info`_ and `alias`_ commands for more ideas.



Distributing Extensions compiled with Pyrex
-------------------------------------------

``setuptools`` includes transparent support for building Pyrex extensions, as
long as you define your extensions using ``setuptools.Extension``, *not*
``distutils.Extension``.  You must also not import anything from Pyrex in
your setup script.

If you follow these rules, you can safely list ``.pyx`` files as the source
of your ``Extension`` objects in the setup script.  ``setuptools`` will detect
at build time whether Pyrex is installed or not.  If it is, then ``setuptools``
will use it.  If not, then ``setuptools`` will silently change the
``Extension`` objects to refer to the ``.c`` counterparts of the ``.pyx``
files, so that the normal distutils C compilation process will occur.

Of course, for this to work, your source distributions must include the C
code generated by Pyrex, as well as your original ``.pyx`` files.  This means
that you will probably want to include current ``.c`` files in your revision
control system, rebuilding them whenever you check changes in for the ``.pyx``
source files.  This will ensure that people tracking your project in a revision
control system will be able to build it even if they don't have Pyrex
installed, and that your source releases will be similarly usable with or
without Pyrex.


-----------------
Command Reference
-----------------

.. _alias:

``alias`` - Define shortcuts for commonly used commands
=======================================================

Sometimes, you need to use the same commands over and over, but you can't
necessarily set them as defaults.  For example, if you produce both development
snapshot releases and "stable" releases of a project, you may want to put
the distributions in different places, or use different ``egg_info`` tagging
options, etc.  In these cases, it doesn't make sense to set the options in
a distutils configuration file, because the values of the options changed based
on what you're trying to do.

Setuptools therefore allows you to define "aliases" - shortcut names for
an arbitrary string of commands and options, using ``setup.py alias aliasname
expansion``, where aliasname is the name of the new alias, and the remainder of
the command line supplies its expansion.  For example, this command defines
a sitewide alias called "daily", that sets various ``egg_info`` tagging
options::

    setup.py alias --global-config daily egg_info --tag-build=development

Once the alias is defined, it can then be used with other setup commands,
e.g.::

    setup.py daily bdist_egg        # generate a daily-build .egg file
    setup.py daily sdist            # generate a daily-build source distro
    setup.py daily sdist bdist_egg  # generate both

The above commands are interpreted as if the word ``daily`` were replaced with
``egg_info --tag-build=development``.

Note that setuptools will expand each alias *at most once* in a given command
line.  This serves two purposes.  First, if you accidentally create an alias
loop, it will have no effect; you'll instead get an error message about an
unknown command.  Second, it allows you to define an alias for a command, that
uses that command.  For example, this (project-local) alias::

    setup.py alias bdist_egg bdist_egg rotate -k1 -m.egg

redefines the ``bdist_egg`` command so that it always runs the ``rotate``
command afterwards to delete all but the newest egg file.  It doesn't loop
indefinitely on ``bdist_egg`` because the alias is only expanded once when
used.

You can remove a defined alias with the ``--remove`` (or ``-r``) option, e.g.::

    setup.py alias --global-config --remove daily

would delete the "daily" alias we defined above.

Aliases can be defined on a project-specific, per-user, or sitewide basis.  The
default is to define or remove a project-specific alias, but you can use any of
the `configuration file options`_ (listed under the `saveopts`_ command, below)
to determine which distutils configuration file an aliases will be added to
(or removed from).

Note that if you omit the "expansion" argument to the ``alias`` command,
you'll get output showing that alias' current definition (and what
configuration file it's defined in).  If you omit the alias name as well,
you'll get a listing of all current aliases along with their configuration
file locations.


``bdist_egg`` - Create a Python Egg for the project
===================================================

This command generates a Python Egg (``.egg`` file) for the project.  Python
Eggs are the preferred binary distribution format for EasyInstall, because they
are cross-platform (for "pure" packages), directly importable, and contain
project metadata including scripts and information about the project's
dependencies.  They can be simply downloaded and added to ``sys.path``
directly, or they can be placed in a directory on ``sys.path`` and then
automatically discovered by the egg runtime system.

This command runs the `egg_info`_ command (if it hasn't already run) to update
the project's metadata (``.egg-info``) directory.  If you have added any extra
metadata files to the ``.egg-info`` directory, those files will be included in
the new egg file's metadata directory, for use by the egg runtime system or by
any applications or frameworks that use that metadata.

You won't usually need to specify any special options for this command; just
use ``bdist_egg`` and you're done.  But there are a few options that may
be occasionally useful:

``--dist-dir=DIR, -d DIR``
    Set the directory where the ``.egg`` file will be placed.  If you don't
    supply this, then the ``--dist-dir`` setting of the ``bdist`` command
    will be used, which is usually a directory named ``dist`` in the project
    directory.

``--plat-name=PLATFORM, -p PLATFORM``
    Set the platform name string that will be embedded in the egg's filename
    (assuming the egg contains C extensions).  This can be used to override
    the distutils default platform name with something more meaningful.  Keep
    in mind, however, that the egg runtime system expects to see eggs with
    distutils platform names, so it may ignore or reject eggs with non-standard
    platform names.  Similarly, the EasyInstall program may ignore them when
    searching web pages for download links.  However, if you are
    cross-compiling or doing some other unusual things, you might find a use
    for this option.

``--exclude-source-files``
    Don't include any modules' ``.py`` files in the egg, just compiled Python,
    C, and data files.  (Note that this doesn't affect any ``.py`` files in the
    EGG-INFO directory or its subdirectories, since for example there may be
    scripts with a ``.py`` extension which must still be retained.)  We don't
    recommend that you use this option except for packages that are being
    bundled for proprietary end-user applications, or for "embedded" scenarios
    where space is at an absolute premium.  On the other hand, if your package
    is going to be installed and used in compressed form, you might as well
    exclude the source because Python's ``traceback`` module doesn't currently
    understand how to display zipped source code anyway, or how to deal with
    files that are in a different place from where their code was compiled.

There are also some options you will probably never need, but which are there
because they were copied from similar ``bdist`` commands used as an example for
creating this one.  They may be useful for testing and debugging, however,
which is why we kept them:

``--keep-temp, -k``
    Keep the contents of the ``--bdist-dir`` tree around after creating the
    ``.egg`` file.

``--bdist-dir=DIR, -b DIR``
    Set the temporary directory for creating the distribution.  The entire
    contents of this directory are zipped to create the ``.egg`` file, after
    running various installation commands to copy the package's modules, data,
    and extensions here.

``--skip-build``
    Skip doing any "build" commands; just go straight to the
    install-and-compress phases.


.. _develop:

``develop`` - Deploy the project source in "Development Mode"
=============================================================

This command allows you to deploy your project's source for use in one or more
"staging areas" where it will be available for importing.  This deployment is
done in such a way that changes to the project source are immediately available
in the staging area(s), without needing to run a build or install step after
each change.

The ``develop`` command works by creating an ``.egg-link`` file (named for the
project) in the given staging area.  If the staging area is Python's
``site-packages`` directory, it also updates an ``easy-install.pth`` file so
that the project is on ``sys.path`` by default for all programs run using that
Python installation.

The ``develop`` command also installs wrapper scripts in the staging area (or
a separate directory, as specified) that will ensure the project's dependencies
are available on ``sys.path`` before running the project's source scripts.
And, it ensures that any missing project dependencies are available in the
staging area, by downloading and installing them if necessary.

Last, but not least, the ``develop`` command invokes the ``build_ext -i``
command to ensure any C extensions in the project have been built and are
up-to-date, and the ``egg_info`` command to ensure the project's metadata is
updated (so that the runtime and wrappers know what the project's dependencies
are).  If you make any changes to the project's setup script or C extensions,
you should rerun the ``develop`` command against all relevant staging areas to
keep the project's scripts, metadata and extensions up-to-date.  Most other
kinds of changes to your project should not require any build operations or
rerunning ``develop``, but keep in mind that even minor changes to the setup
script (e.g. changing an entry point definition) require you to re-run the
``develop`` or ``test`` commands to keep the distribution updated.

Here are some of the options that the ``develop`` command accepts.  Note that
they affect the project's dependencies as well as the project itself, so if you
have dependencies that need to be installed and you use ``--exclude-scripts``
(for example), the dependencies' scripts will not be installed either!  For
this reason, you may want to use EasyInstall to install the project's
dependencies before using the ``develop`` command, if you need finer control
over the installation options for dependencies.

``--uninstall, -u``
    Un-deploy the current project.  You may use the ``--install-dir`` or ``-d``
    option to designate the staging area.  The created ``.egg-link`` file will
    be removed, if present and it is still pointing to the project directory.
    The project directory will be removed from ``easy-install.pth`` if the
    staging area is Python's ``site-packages`` directory.

    Note that this option currently does *not* uninstall script wrappers!  You
    must uninstall them yourself, or overwrite them by using EasyInstall to
    activate a different version of the package.  You can also avoid installing
    script wrappers in the first place, if you use the ``--exclude-scripts``
    (aka ``-x``) option when you run ``develop`` to deploy the project.

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``develop`` from
    adding an ``easy-install.pth`` entry for the project(s) being deployed, and
    if an entry for any version of a project already exists, the entry will be
    removed upon successful deployment.  In multi-version mode, no specific
    version of the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``, or you are running
    a wrapper script generated by ``setuptools`` or EasyInstall.  (In which
    case the wrapper script calls ``require()`` for you.)

    Note that if you install to a directory other than ``site-packages``,
    this option is automatically in effect, because ``.pth`` files can only be
    used in ``site-packages`` (at least in Python 2.3 and 2.4). So, if you use
    the ``--install-dir`` or ``-d`` option (or they are set via configuration
    file(s)) your project and its dependencies will be deployed in multi-
    version mode.

``--install-dir=DIR, -d DIR``
    Set the installation directory (staging area).  If this option is not
    directly specified on the command line or in a distutils configuration
    file, the distutils default installation location is used.  Normally, this
    will be the ``site-packages`` directory, but if you are using distutils
    configuration files, setting things like ``prefix`` or ``install_lib``,
    then those settings are taken into account when computing the default
    staging area.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't deploy script wrappers.  This is useful if you don't want to disturb
    existing versions of the scripts in the staging area.

``--always-copy, -a``
    Copy all needed distributions to the staging area, even if they
    are already present in another directory on ``sys.path``.  By default, if
    a requirement can be met using a distribution that is already available in
    a directory on ``sys.path``, it will not be copied to the staging area.

``--egg-path=DIR``
    Force the generated ``.egg-link`` file to use a specified relative path
    to the source directory.  This can be useful in circumstances where your
    installation directory is being shared by code running under multiple
    platforms (e.g. Mac and Windows) which have different absolute locations
    for the code under development, but the same *relative* locations with
    respect to the installation directory.  If you use this option when
    installing, you must supply the same relative path when uninstalling.

In addition to the above options, the ``develop`` command also accepts all of
the same options accepted by ``easy_install``.  If you've configured any
``easy_install`` settings in your ``setup.cfg`` (or other distutils config
files), the ``develop`` command will use them as defaults, unless you override
them in a ``[develop]`` section or on the command line.


``easy_install`` - Find and install packages
============================================

This command runs the `EasyInstall tool
<easy_install.html>`_ for you.  It is exactly
equivalent to running the ``easy_install`` command.  All command line arguments
following this command are consumed and not processed further by the distutils,
so this must be the last command listed on the command line.  Please see
the EasyInstall documentation for the options reference and usage examples.
Normally, there is no reason to use this command via the command line, as you
can just use ``easy_install`` directly.  It's only listed here so that you know
it's a distutils command, which means that you can:

* create command aliases that use it,
* create distutils extensions that invoke it as a subcommand, and
* configure options for it in your ``setup.cfg`` or other distutils config
  files.


.. _egg_info:

``egg_info`` - Create egg metadata and set build tags
=====================================================

This command performs two operations: it updates a project's ``.egg-info``
metadata directory (used by the ``bdist_egg``, ``develop``, and ``test``
commands), and it allows you to temporarily change a project's version string,
to support "daily builds" or "snapshot" releases.  It is run automatically by
the ``sdist``, ``bdist_egg``, ``develop``, ``register``, and ``test`` commands
in order to update the project's metadata, but you can also specify it
explicitly in order to temporarily change the project's version string while
executing other commands.  (It also generates the``.egg-info/SOURCES.txt``
manifest file, which is used when you are building source distributions.)

In addition to writing the core egg metadata defined by ``setuptools`` and
required by ``pkg_resources``, this command can be extended to write other
metadata files as well, by defining entry points in the ``egg_info.writers``
group.  See the section on `Adding new EGG-INFO Files`_ below for more details.
Note that using additional metadata writers may require you to include a
``setup_requires`` argument to ``setup()`` in order to ensure that the desired
writers are available on ``sys.path``.


Release Tagging Options
-----------------------

The following options can be used to modify the project's version string for
all remaining commands on the setup command line.  The options are processed
in the order shown, so if you use more than one, the requested tags will be
added in the following order:

``--tag-build=NAME, -b NAME``
    Append NAME to the project's version string.  Due to the way setuptools
    processes "pre-release" version suffixes beginning with the letters "a"
    through "e" (like "alpha", "beta", and "candidate"), you will usually want
    to use a tag like ".build" or ".dev", as this will cause the version number
    to be considered *lower* than the project's default version.  (If you
    want to make the version number *higher* than the default version, you can
    always leave off --tag-build and then use one or both of the following
    options.)

    If you have a default build tag set in your ``setup.cfg``, you can suppress
    it on the command line using ``-b ""`` or ``--tag-build=""`` as an argument
    to the ``egg_info`` command.

``--tag-date, -d``
    Add a date stamp of the form "-YYYYMMDD" (e.g. "-20050528") to the
    project's version number.

``--no-date, -D``
    Don't include a date stamp in the version number.  This option is included
    so you can override a default setting in ``setup.cfg``.


(Note: Because these options modify the version number used for source and
binary distributions of your project, you should first make sure that you know
how the resulting version numbers will be interpreted by automated tools
like EasyInstall.  See the section above on `Specifying Your Project's
Version`_ for an explanation of pre- and post-release tags, as well as tips on
how to choose and verify a versioning scheme for your your project.)

For advanced uses, there is one other option that can be set, to change the
location of the project's ``.egg-info`` directory.  Commands that need to find
the project's source directory or metadata should get it from this setting:


Other ``egg_info`` Options
--------------------------

``--egg-base=SOURCEDIR, -e SOURCEDIR``
    Specify the directory that should contain the .egg-info directory.  This
    should normally be the root of your project's source tree (which is not
    necessarily the same as your project directory; some projects use a ``src``
    or ``lib`` subdirectory as the source root).  You should not normally need
    to specify this directory, as it is normally determined from the
    ``package_dir`` argument to the ``setup()`` function, if any.  If there is
    no ``package_dir`` set, this option defaults to the current directory.


``egg_info`` Examples
---------------------

Creating a dated "nightly build" snapshot egg::

    python setup.py egg_info --tag-date --tag-build=DEV bdist_egg

Creating and uploading a release with no version tags, even if some default
tags are specified in ``setup.cfg``::

    python setup.py egg_info -RDb "" sdist bdist_egg register upload

(Notice that ``egg_info`` must always appear on the command line *before* any
commands that you want the version changes to apply to.)


.. _install command:

``install`` - Run ``easy_install`` or old-style installation
============================================================

The setuptools ``install`` command is basically a shortcut to run the
``easy_install`` command on the current project.  However, for convenience
in creating "system packages" of setuptools-based projects, you can also
use this option:

``--single-version-externally-managed``
    This boolean option tells the ``install`` command to perform an "old style"
    installation, with the addition of an ``.egg-info`` directory so that the
    installed project will still have its metadata available and operate
    normally.  If you use this option, you *must* also specify the ``--root``
    or ``--record`` options (or both), because otherwise you will have no way
    to identify and remove the installed files.

This option is automatically in effect when ``install`` is invoked by another
distutils command, so that commands like ``bdist_wininst`` and ``bdist_rpm``
will create system packages of eggs.  It is also automatically in effect if
you specify the ``--root`` option.


``install_egg_info`` - Install an ``.egg-info`` directory in ``site-packages``
==============================================================================

Setuptools runs this command as part of ``install`` operations that use the
``--single-version-externally-managed`` options.  You should not invoke it
directly; it is documented here for completeness and so that distutils
extensions such as system package builders can make use of it.  This command
has only one option:

``--install-dir=DIR, -d DIR``
    The parent directory where the ``.egg-info`` directory will be placed.
    Defaults to the same as the ``--install-dir`` option specified for the
    ``install_lib`` command, which is usually the system ``site-packages``
    directory.

This command assumes that the ``egg_info`` command has been given valid options
via the command line or ``setup.cfg``, as it will invoke the ``egg_info``
command and use its options to locate the project's source ``.egg-info``
directory.


.. _rotate:

``rotate`` - Delete outdated distribution files
===============================================

As you develop new versions of your project, your distribution (``dist``)
directory will gradually fill up with older source and/or binary distribution
files.  The ``rotate`` command lets you automatically clean these up, keeping
only the N most-recently modified files matching a given pattern.

``--match=PATTERNLIST, -m PATTERNLIST``
    Comma-separated list of glob patterns to match.  This option is *required*.
    The project name and ``-*`` is prepended to the supplied patterns, in order
    to match only distributions belonging to the current project (in case you
    have a shared distribution directory for multiple projects).  Typically,
    you will use a glob pattern like ``.zip`` or ``.egg`` to match files of
    the specified type.  Note that each supplied pattern is treated as a
    distinct group of files for purposes of selecting files to delete.

``--keep=COUNT, -k COUNT``
    Number of matching distributions to keep.  For each group of files
    identified by a pattern specified with the ``--match`` option, delete all
    but the COUNT most-recently-modified files in that group.  This option is
    *required*.

``--dist-dir=DIR, -d DIR``
    Directory where the distributions are.  This defaults to the value of the
    ``bdist`` command's ``--dist-dir`` option, which will usually be the
    project's ``dist`` subdirectory.

**Example 1**: Delete all .tar.gz files from the distribution directory, except
for the 3 most recently modified ones::

    setup.py rotate --match=.tar.gz --keep=3

**Example 2**: Delete all Python 2.3 or Python 2.4 eggs from the distribution
directory, except the most recently modified one for each Python version::

    setup.py rotate --match=-py2.3*.egg,-py2.4*.egg --keep=1


.. _saveopts:

``saveopts`` - Save used options to a configuration file
========================================================

Finding and editing ``distutils`` configuration files can be a pain, especially
since you also have to translate the configuration options from command-line
form to the proper configuration file format.  You can avoid these hassles by
using the ``saveopts`` command.  Just add it to the command line to save the
options you used.  For example, this command builds the project using
the ``mingw32`` C compiler, then saves the --compiler setting as the default
for future builds (even those run implicitly by the ``install`` command)::

    setup.py build --compiler=mingw32 saveopts

The ``saveopts`` command saves all options for every command specified on the
command line to the project's local ``setup.cfg`` file, unless you use one of
the `configuration file options`_ to change where the options are saved.  For
example, this command does the same as above, but saves the compiler setting
to the site-wide (global) distutils configuration::

    setup.py build --compiler=mingw32 saveopts -g

Note that it doesn't matter where you place the ``saveopts`` command on the
command line; it will still save all the options specified for all commands.
For example, this is another valid way to spell the last example::

    setup.py saveopts -g build --compiler=mingw32

Note, however, that all of the commands specified are always run, regardless of
where ``saveopts`` is placed on the command line.


Configuration File Options
--------------------------

Normally, settings such as options and aliases are saved to the project's
local ``setup.cfg`` file.  But you can override this and save them to the
global or per-user configuration files, or to a manually-specified filename.

``--global-config, -g``
    Save settings to the global ``distutils.cfg`` file inside the ``distutils``
    package directory.  You must have write access to that directory to use
    this option.  You also can't combine this option with ``-u`` or ``-f``.

``--user-config, -u``
    Save settings to the current user's ``~/.pydistutils.cfg`` (POSIX) or
    ``$HOME/pydistutils.cfg`` (Windows) file.  You can't combine this option
    with ``-g`` or ``-f``.

``--filename=FILENAME, -f FILENAME``
    Save settings to the specified configuration file to use.  You can't
    combine this option with ``-g`` or ``-u``.  Note that if you specify a
    non-standard filename, the ``distutils`` and ``setuptools`` will not
    use the file's contents.  This option is mainly included for use in
    testing.

These options are used by other ``setuptools`` commands that modify
configuration files, such as the `alias`_ and `setopt`_ commands.


.. _setopt:

``setopt`` - Set a distutils or setuptools option in a config file
==================================================================

This command is mainly for use by scripts, but it can also be used as a quick
and dirty way to change a distutils configuration option without having to
remember what file the options are in and then open an editor.

**Example 1**.  Set the default C compiler to ``mingw32`` (using long option
names)::

    setup.py setopt --command=build --option=compiler --set-value=mingw32

**Example 2**.  Remove any setting for the distutils default package
installation directory (short option names)::

    setup.py setopt -c install -o install_lib -r


Options for the ``setopt`` command:

``--command=COMMAND, -c COMMAND``
    Command to set the option for.  This option is required.

``--option=OPTION, -o OPTION``
    The name of the option to set.  This option is required.

``--set-value=VALUE, -s VALUE``
    The value to set the option to.  Not needed if ``-r`` or ``--remove`` is
    set.

``--remove, -r``
    Remove (unset) the option, instead of setting it.

In addition to the above options, you may use any of the `configuration file
options`_ (listed under the `saveopts`_ command, above) to determine which
distutils configuration file the option will be added to (or removed from).


.. _test:

``test`` - Build package and run a unittest suite
=================================================

When doing test-driven development, or running automated builds that need
testing before they are deployed for downloading or use, it's often useful
to be able to run a project's unit tests without actually deploying the project
anywhere, even using the ``develop`` command.  The ``test`` command runs a
project's unit tests without actually deploying it, by temporarily putting the
project's source on ``sys.path``, after first running ``build_ext -i`` and
``egg_info`` to ensure that any C extensions and project metadata are
up-to-date.

To use this command, your project's tests must be wrapped in a ``unittest``
test suite by either a function, a ``TestCase`` class or method, or a module
or package containing ``TestCase`` classes.  If the named suite is a module,
and the module has an ``additional_tests()`` function, it is called and the
result (which must be a ``unittest.TestSuite``) is added to the tests to be
run.  If the named suite is a package, any submodules and subpackages are
recursively added to the overall test suite.  (Note: if your project specifies
a ``test_loader``, the rules for processing the chosen ``test_suite`` may
differ; see the `test_loader`_ documentation for more details.)

Note that many test systems including ``doctest`` support wrapping their
non-``unittest`` tests in ``TestSuite`` objects.  So, if you are using a test
package that does not support this, we suggest you encourage its developers to
implement test suite support, as this is a convenient and standard way to
aggregate a collection of tests to be run under a common test harness.

By default, tests will be run in the "verbose" mode of the ``unittest``
package's text test runner, but you can get the "quiet" mode (just dots) if
you supply the ``-q`` or ``--quiet`` option, either as a global option to
the setup script (e.g. ``setup.py -q test``) or as an option for the ``test``
command itself (e.g. ``setup.py test -q``).  There is one other option
available:

``--test-suite=NAME, -s NAME``
    Specify the test suite (or module, class, or method) to be run
    (e.g. ``some_module.test_suite``).  The default for this option can be
    set by giving a ``test_suite`` argument to the ``setup()`` function, e.g.::

        setup(
            # ...
            test_suite="my_package.tests.test_all"
        )

    If you did not set a ``test_suite`` in your ``setup()`` call, and do not
    provide a ``--test-suite`` option, an error will occur.


.. _upload:

``upload`` - Upload source and/or egg distributions to PyPI
===========================================================

The ``upload`` command is implemented and `documented
<https://docs.python.org/3.1/distutils/uploading.html>`_
in distutils.

Setuptools augments the ``upload`` command with support
for `keyring <https://pypi.python.org/pypi/keyring>`_,
allowing the password to be stored in a secure
location and not in plaintext in the .pypirc file. To use
keyring, first install keyring and set the password for
the relevant repository, e.g.::

    python -m keyring set <repository> <username>
    Password for '<username>' in '<repository>': ********

Then, in .pypirc, set the repository configuration as normal,
but omit the password. Thereafter, uploads will use the
password from the keyring.

New in 20.1: Added keyring support.


-----------------------------------------
Configuring setup() using setup.cfg files
-----------------------------------------

.. note:: New in 30.3.0 (8 Dec 2016).

.. important:: ``setup.py`` with ``setup()`` function call is still required even 
                if your configuration resides in ``setup.cfg``.

``Setuptools`` allows using configuration files (usually `setup.cfg`)
to define package’s metadata and other options which are normally supplied
to ``setup()`` function.

This approach not only allows automation scenarios, but also reduces
boilerplate code in some cases.

.. note::
    Implementation presents limited compatibility with distutils2-like
    ``setup.cfg`` sections (used by ``pbr`` and ``d2to1`` packages).

    Namely: only metadata related keys from ``metadata`` section are supported
    (except for ``description-file``); keys from ``files``, ``entry_points``
    and ``backwards_compat`` are not supported.


.. code-block:: ini

    [metadata]
    name = my_package
    version = attr: src.VERSION
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD 3-Clause License
    classifiers =
        Framework :: Django
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.5

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    scripts =
      bin/first.py
      bin/second.py

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        src.subpackage1
        src.subpackage2


Metadata and options could be set in sections with the same names.

* Keys are the same as keyword arguments one provides to ``setup()`` function.

* Complex values could be placed comma-separated or one per line
  in *dangling* sections. The following are the same:

  .. code-block:: ini

      [metadata]
      keywords = one, two

      [metadata]
      keywords =
        one
        two

* In some cases complex values could be provided in subsections for clarity.

* Some keys allow ``file:``, ``attr:`` and ``find:`` directives to cover
  common usecases.

* Unknown keys are ignored.


Specifying values
=================

Some values are treated as simple strings, some allow more logic.

Type names used below:

* ``str`` - simple string
* ``list-comma`` - dangling list or comma-separated values string
* ``list-semi`` - dangling list or semicolon-separated values string
* ``bool`` -  ``True`` is 1, yes, true
* ``dict`` - list-comma where keys from values are separated by =
* ``section`` - values could be read from a dedicated (sub)section


Special directives:

* ``attr:`` - value could be read from module attribute
* ``file:`` - value could be read from a list of files and then concatenated


.. note::
    ``file:`` directive is sandboxed and won't reach anything outside
    directory with ``setup.py``.


Metadata
--------

.. note::
    Aliases given below are supported for compatibility reasons,
    but not advised.

=================  =================  =====
Key                Aliases            Accepted value type
=================  =================  =====
name                                  str
version                               attr:, str
url                home-page          str
download_url       download-url       str
author                                str
author_email       author-email       str
maintainer                            str
maintainer_email   maintainer-email   str
classifiers        classifier         file:, list-comma
license                               file:, str
description        summary            file:, str
long_description   long-description   file:, str
keywords                              list-comma
platforms          platform           list-comma
provides                              list-comma
requires                              list-comma
obsoletes                             list-comma
=================  =================  =====

.. note::

    **version** - ``attr:`` supports callables; supports iterables;
    unsupported types are casted using ``str()``.


Options
-------

=======================  =====
Key                      Accepted value type
=======================  =====
zip_safe                 bool
setup_requires           list-semi
install_requires         list-semi
extras_require           section
python_requires          str
entry_points             file:, section
use_2to3                 bool
use_2to3_fixers          list-comma
use_2to3_exclude_fixers  list-comma
convert_2to3_doctests    list-comma
scripts                  list-comma
eager_resources          list-comma
dependency_links         list-comma
tests_require            list-semi
include_package_data     bool
packages                 find:, list-comma
package_dir              dict
package_data             section
exclude_package_data     section
namespace_packages       list-comma
py_modules               list-comma
=======================  =====

.. note::

    **packages** - ``find:`` directive can be further configured
    in a dedicated subsection `options.packages.find`. This subsection
    accepts the same keys as `setuptools.find` function:
    `where`, `include`, `exclude`.


Configuration API
=================

Some automation tools may wish to access data from a configuration file.

``Setuptools`` exposes ``read_configuration()`` function allowing
parsing ``metadata`` and ``options`` sections into a dictionary.


.. code-block:: python

    from setuptools.config import read_configuration

    conf_dict = read_configuration('/home/user/dev/package/setup.cfg')


By default ``read_configuration()`` will read only file provided
in the first argument. To include values from other configuration files
which could be in various places set `find_others` function argument
to ``True``.

If you have only a configuration file but not the whole package you can still
try to get data out of it with the help of `ignore_option_errors` function
argument. When it is set to ``True`` all options with errors possibly produced
by directives, such as ``attr:`` and others will be silently ignored.
As a consequence the resulting dictionary will include no such options.


--------------------------------
Extending and Reusing Setuptools
--------------------------------

Creating ``distutils`` Extensions
=================================

It can be hard to add new commands or setup arguments to the distutils.  But
the ``setuptools`` package makes it a bit easier, by allowing you to distribute
a distutils extension as a separate project, and then have projects that need
the extension just refer to it in their ``setup_requires`` argument.

With ``setuptools``, your distutils extension projects can hook in new
commands and ``setup()`` arguments just by defining "entry points".  These
are mappings from command or argument names to a specification of where to
import a handler from.  (See the section on `Dynamic Discovery of Services and
Plugins`_ above for some more background on entry points.)


Adding Commands
---------------

You can add new ``setup`` commands by defining entry points in the
``distutils.commands`` group.  For example, if you wanted to add a ``foo``
command, you might add something like this to your distutils extension
project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
        },
    )

(Assuming, of course, that the ``foo`` class in ``mypackage.some_module`` is
a ``setuptools.Command`` subclass.)

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running "install" or "develop" with a site-packages installation
directory) the command(s) will be available to any ``setuptools``-based setup
scripts.  It is not necessary to use the ``--command-packages`` option or
to monkeypatch the ``distutils.command`` package to install your commands;
``setuptools`` automatically adds a wrapper to the distutils to search for
entry points in the active distributions on ``sys.path``.  In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!


Adding ``setup()`` Arguments
----------------------------

Sometimes, your commands may need additional arguments to the ``setup()``
call.  You can enable this by defining entry points in the
``distutils.setup_keywords`` group.  For example, if you wanted a ``setup()``
argument called ``bar_baz``, you might add something like this to your
distutils extension project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
            "distutils.setup_keywords": [
                "bar_baz = mypackage.some_module:validate_bar_baz",
            ],
        },
    )

The idea here is that the entry point defines a function that will be called
to validate the ``setup()`` argument, if it's supplied.  The ``Distribution``
object will have the initial value of the attribute set to ``None``, and the
validation function will only be called if the ``setup()`` call sets it to
a non-None value.  Here's an example validation function::

    def assert_bool(dist, attr, value):
        """Verify that value is True, False, 0, or 1"""
        if bool(value) != value:
            raise DistutilsSetupError(
                "%r must be a boolean value (got %r)" % (attr,value)
            )

Your function should accept three arguments: the ``Distribution`` object,
the attribute name, and the attribute value.  It should raise a
``DistutilsSetupError`` (from the ``distutils.errors`` module) if the argument
is invalid.  Remember, your function will only be called with non-None values,
and the default value of arguments defined this way is always None.  So, your
commands should always be prepared for the possibility that the attribute will
be ``None`` when they access it later.

If more than one active distribution defines an entry point for the same
``setup()`` argument, *all* of them will be called.  This allows multiple
distutils extensions to define a common argument, as long as they agree on
what values of that argument are valid.

Also note that as with commands, it is not necessary to subclass or monkeypatch
the distutils ``Distribution`` class in order to add your arguments; it is
sufficient to define the entry points in your extension, as long as any setup
script using your extension lists your project in its ``setup_requires``
argument.


Adding new EGG-INFO Files
-------------------------

Some extensible applications or frameworks may want to allow third parties to
develop plugins with application or framework-specific metadata included in
the plugins' EGG-INFO directory, for easy access via the ``pkg_resources``
metadata API.  The easiest way to allow this is to create a distutils extension
to be used from the plugin projects' setup scripts (via ``setup_requires``)
that defines a new setup keyword, and then uses that data to write an EGG-INFO
file when the ``egg_info`` command is run.

The ``egg_info`` command looks for extension points in an ``egg_info.writers``
group, and calls them to write the files.  Here's a simple example of a
distutils extension defining a setup argument ``foo_bar``, which is a list of
lines that will be written to ``foo_bar.txt`` in the EGG-INFO directory of any
project that uses the argument::

    setup(
        # ...
        entry_points={
            "distutils.setup_keywords": [
                "foo_bar = setuptools.dist:assert_string_list",
            ],
            "egg_info.writers": [
                "foo_bar.txt = setuptools.command.egg_info:write_arg",
            ],
        },
    )

This simple example makes use of two utility functions defined by setuptools
for its own use: a routine to validate that a setup keyword is a sequence of
strings, and another one that looks up a setup argument and writes it to
a file.  Here's what the writer utility looks like::

    def write_arg(cmd, basename, filename):
        argname = os.path.splitext(basename)[0]
        value = getattr(cmd.distribution, argname, None)
        if value is not None:
            value = '\n'.join(value) + '\n'
        cmd.write_or_delete_file(argname, filename, value)

As you can see, ``egg_info.writers`` entry points must be a function taking
three arguments: a ``egg_info`` command instance, the basename of the file to
write (e.g. ``foo_bar.txt``), and the actual full filename that should be
written to.

In general, writer functions should honor the command object's ``dry_run``
setting when writing files, and use the ``distutils.log`` object to do any
console output.  The easiest way to conform to this requirement is to use
the ``cmd`` object's ``write_file()``, ``delete_file()``, and
``write_or_delete_file()`` methods exclusively for your file operations.  See
those methods' docstrings for more details.


Adding Support for Revision Control Systems
-------------------------------------------------

If the files you want to include in the source distribution are tracked using
Git, Mercurial or SVN, you can use the following packages to achieve that:

- Git and Mercurial: `setuptools_scm <https://pypi.python.org/pypi/setuptools_scm>`_
- SVN: `setuptools_svn <https://pypi.python.org/pypi/setuptools_svn>`_

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this::

    entry_points={
        "setuptools.file_finders": [
            "foobar = my_foobar_module:find_files_for_foobar",
        ]
    }

Then, anyone who wants to use your plugin can simply install it, and their
local setuptools installation will be able to find the necessary files.

It is not necessary to distribute source control plugins with projects that
simply use the other source control system, or to specify the plugins in
``setup_requires``.  When you create a source distribution with the ``sdist``
command, setuptools automatically records what files were found in the
``SOURCES.txt`` file.  That way, recipients of source distributions don't need
to have revision control at all.  However, if someone is working on a package
by checking out with that system, they will need the same plugin(s) that the
original author is using.

A few important points for writing revision control file finders:

* Your finder function MUST return relative paths, created by appending to the
  passed-in directory name.  Absolute paths are NOT allowed, nor are relative
  paths that reference a parent directory of the passed-in directory.

* Your finder function MUST accept an empty string as the directory name,
  meaning the current directory.  You MUST NOT convert this to a dot; just
  yield relative paths.  So, yielding a subdirectory named ``some/dir`` under
  the current directory should NOT be rendered as ``./some/dir`` or
  ``/somewhere/some/dir``, but *always* as simply ``some/dir``

* Your finder function SHOULD NOT raise any errors, and SHOULD deal gracefully
  with the absence of needed programs (i.e., ones belonging to the revision
  control system itself.  It *may*, however, use ``distutils.log.warn()`` to
  inform the user of the missing program(s).


Subclassing ``Command``
-----------------------

Sorry, this section isn't written yet, and neither is a lot of what's below
this point.

XXX


Reusing ``setuptools`` Code
===========================

``ez_setup``
------------

XXX


``setuptools.archive_util``
---------------------------

XXX


``setuptools.sandbox``
----------------------

XXX


``setuptools.package_index``
----------------------------

XXX


Mailing List and Bug Tracker
============================

Please use the `distutils-sig mailing list`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the list are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
.. _setuptools bug tracker: https://github.com/pypa/setuptools/
doc/alt-python27-setuptools/formats.txt000064400000075012151730177270014233 0ustar00=====================================
The Internal Structure of Python Eggs
=====================================

STOP! This is not the first document you should read!



.. contents:: **Table of Contents**


----------------------
Eggs and their Formats
----------------------

A "Python egg" is a logical structure embodying the release of a
specific version of a Python project, comprising its code, resources,
and metadata. There are multiple formats that can be used to physically
encode a Python egg, and others can be developed. However, a key
principle of Python eggs is that they should be discoverable and
importable. That is, it should be possible for a Python application to
easily and efficiently find out what eggs are present on a system, and
to ensure that the desired eggs' contents are importable.

There are two basic formats currently implemented for Python eggs:

1. ``.egg`` format: a directory or zipfile *containing* the project's
   code and resources, along with an ``EGG-INFO`` subdirectory that
   contains the project's metadata

2. ``.egg-info`` format: a file or directory placed *adjacent* to the
   project's code and resources, that directly contains the project's
   metadata.

Both formats can include arbitrary Python code and resources, including
static data files, package and non-package directories, Python
modules, C extension modules, and so on.  But each format is optimized
for different purposes.

The ``.egg`` format is well-suited to distribution and the easy
uninstallation or upgrades of code, since the project is essentially
self-contained within a single directory or file, unmingled with any
other projects' code or resources.  It also makes it possible to have
multiple versions of a project simultaneously installed, such that
individual programs can select the versions they wish to use.

The ``.egg-info`` format, on the other hand, was created to support
backward-compatibility, performance, and ease of installation for system
packaging tools that expect to install all projects' code and resources
to a single directory (e.g. ``site-packages``).  Placing the metadata
in that same directory simplifies the installation process, since it
isn't necessary to create ``.pth`` files or otherwise modify
``sys.path`` to include each installed egg.

Its disadvantage, however, is that it provides no support for clean
uninstallation or upgrades, and of course only a single version of a
project can be installed to a given directory. Thus, support from a
package management tool is required. (This is why setuptools' "install"
command refers to this type of egg installation as "single-version,
externally managed".)  Also, they lack sufficient data to allow them to
be copied from their installation source.  easy_install can "ship" an
application by copying ``.egg`` files or directories to a target
location, but it cannot do this for ``.egg-info`` installs, because
there is no way to tell what code and resources belong to a particular
egg -- there may be several eggs "scrambled" together in a single
installation location, and the ``.egg-info`` format does not currently
include a way to list the files that were installed.  (This may change
in a future version.)


Code and Resources
==================

The layout of the code and resources is dictated by Python's normal
import layout, relative to the egg's "base location".

For the ``.egg`` format, the base location is the ``.egg`` itself. That
is, adding the ``.egg`` filename or directory name to ``sys.path``
makes its contents importable.

For the ``.egg-info`` format, however, the base location is the
directory that *contains* the ``.egg-info``, and thus it is the
directory that must be added to ``sys.path`` to make the egg importable.
(Note that this means that the "normal" installation of a package to a
``sys.path`` directory is sufficient to make it an "egg" if it has an
``.egg-info`` file or directory installed alongside of it.)


Project Metadata
=================

If eggs contained only code and resources, there would of course be
no difference between them and any other directory or zip file on
``sys.path``.  Thus, metadata must also be included, using a metadata
file or directory.

For the ``.egg`` format, the metadata is placed in an ``EGG-INFO``
subdirectory, directly within the ``.egg`` file or directory.  For the
``.egg-info`` format, metadata is stored directly within the
``.egg-info`` directory itself.

The minimum project metadata that all eggs must have is a standard
Python ``PKG-INFO`` file, named ``PKG-INFO`` and placed within the
metadata directory appropriate to the format.  Because it's possible for
this to be the only metadata file included, ``.egg-info`` format eggs
are not required to be a directory; they can just be a ``.egg-info``
file that directly contains the ``PKG-INFO`` metadata.  This eliminates
the need to create a directory just to store one file.  This option is
*not* available for ``.egg`` formats, since setuptools always includes
other metadata.  (In fact, setuptools itself never generates
``.egg-info`` files, either; the support for using files was added so
that the requirement could easily be satisfied by other tools, such
as the distutils in Python 2.5).

In addition to the ``PKG-INFO`` file, an egg's metadata directory may
also include files and directories representing various forms of
optional standard metadata (see the section on `Standard Metadata`_,
below) or user-defined metadata required by the project.  For example,
some projects may define a metadata format to describe their application
plugins, and metadata in this format would then be included by plugin
creators in their projects' metadata directories.


Filename-Embedded Metadata
==========================

To allow introspection of installed projects and runtime resolution of
inter-project dependencies, a certain amount of information is embedded
in egg filenames.  At a minimum, this includes the project name, and
ideally will also include the project version number.  Optionally, it
can also include the target Python version and required runtime
platform if platform-specific C code is included.  The syntax of an
egg filename is as follows::

    name ["-" version ["-py" pyver ["-" required_platform]]] "." ext

The "name" and "version" should be escaped using the ``to_filename()``
function provided by ``pkg_resources``, after first processing them with
``safe_name()`` and ``safe_version()`` respectively.  These latter two
functions can also be used to later "unescape" these parts of the
filename.  (For a detailed description of these transformations, please
see the "Parsing Utilities" section of the ``pkg_resources`` manual.)

The "pyver" string is the Python major version, as found in the first
3 characters of ``sys.version``.  "required_platform" is essentially
a distutils ``get_platform()`` string, but with enhancements to properly
distinguish Mac OS versions.  (See the ``get_build_platform()``
documentation in the "Platform Utilities" section of the
``pkg_resources`` manual for more details.)

Finally, the "ext" is either ``.egg`` or ``.egg-info``, as appropriate
for the egg's format.

Normally, an egg's filename should include at least the project name and
version, as this allows the runtime system to find desired project
versions without having to read the egg's PKG-INFO to determine its
version number.

Setuptools, however, only includes the version number in the filename
when an ``.egg`` file is built using the ``bdist_egg`` command, or when
an ``.egg-info`` directory is being installed by the
``install_egg_info`` command. When generating metadata for use with the
original source tree, it only includes the project name, so that the
directory will not have to be renamed each time the project's version
changes.

This is especially important when version numbers change frequently, and
the source metadata directory is kept under version control with the
rest of the project.  (As would be the case when the project's source
includes project-defined metadata that is not generated from by
setuptools from data in the setup script.)


Egg Links
=========

In addition to the ``.egg`` and ``.egg-info`` formats, there is a third
egg-related extension that you may encounter on occasion: ``.egg-link``
files.

These files are not eggs, strictly speaking. They simply provide a way
to reference an egg that is not physically installed in the desired
location. They exist primarily as a cross-platform alternative to
symbolic links, to support "installing" code that is being developed in
a different location than the desired installation location. For
example, if a user is developing an application plugin in their home
directory, but the plugin needs to be "installed" in an application
plugin directory, running "setup.py develop -md /path/to/app/plugins"
will install an ``.egg-link`` file in ``/path/to/app/plugins``, that
tells the egg runtime system where to find the actual egg (the user's
project source directory and its ``.egg-info`` subdirectory).

``.egg-link`` files are named following the format for ``.egg`` and
``.egg-info`` names, but only the project name is included; no version,
Python version, or platform information is included.  When the runtime
searches for available eggs, ``.egg-link`` files are opened and the
actual egg file/directory name is read from them.

Each ``.egg-link`` file should contain a single file or directory name,
with no newlines.  This filename should be the base location of one or
more eggs.  That is, the name must either end in ``.egg``, or else it
should be the parent directory of one or more ``.egg-info`` format eggs.

As of setuptools 0.6c6, the path may be specified as a platform-independent
(i.e. ``/``-separated) relative path from the directory containing the
``.egg-link`` file, and a second line may appear in the file, specifying a
platform-independent relative path from the egg's base directory to its
setup script directory.  This allows installation tools such as EasyInstall
to find the project's setup directory and build eggs or perform other setup
commands on it.


-----------------
Standard Metadata
-----------------

In addition to the minimum required ``PKG-INFO`` metadata, projects can
include a variety of standard metadata files or directories, as
described below.  Except as otherwise noted, these files and directories
are automatically generated by setuptools, based on information supplied
in the setup script or through analysis of the project's code and
resources.

Most of these files and directories are generated via "egg-info
writers" during execution of the setuptools ``egg_info`` command, and
are listed in the ``egg_info.writers`` entry point group defined by
setuptools' own ``setup.py`` file.

Project authors can register their own metadata writers as entry points
in this group (as described in the setuptools manual under "Adding new
EGG-INFO Files") to cause setuptools to generate project-specific
metadata files or directories during execution of the ``egg_info``
command.  It is up to project authors to document these new metadata
formats, if they create any.


``.txt`` File Formats
=====================

Files described in this section that have ``.txt`` extensions have a
simple lexical format consisting of a sequence of text lines, each line
terminated by a linefeed character (regardless of platform).  Leading
and trailing whitespace on each line is ignored, as are blank lines and
lines whose first nonblank character is a ``#`` (comment symbol).  (This
is the parsing format defined by the ``yield_lines()`` function of
the ``pkg_resources`` module.)

All ``.txt`` files defined by this section follow this format, but some
are also "sectioned" files, meaning that their contents are divided into
sections, using square-bracketed section headers akin to Windows
``.ini`` format.  Note that this does *not* imply that the lines within
the sections follow an ``.ini`` format, however.  Please see an
individual metadata file's documentation for a description of what the
lines and section names mean in that particular file.

Sectioned files can be parsed using the ``split_sections()`` function;
see the "Parsing Utilities" section of the ``pkg_resources`` manual for
for details.


Dependency Metadata
===================


``requires.txt``
----------------

This is a "sectioned" text file.  Each section is a sequence of
"requirements", as parsed by the ``parse_requirements()`` function;
please see the ``pkg_resources`` manual for the complete requirement
parsing syntax.

The first, unnamed section (i.e., before the first section header) in
this file is the project's core requirements, which must be installed
for the project to function.  (Specified using the ``install_requires``
keyword to ``setup()``).

The remaining (named) sections describe the project's "extra"
requirements, as specified using the ``extras_require`` keyword to
``setup()``.  The section name is the name of the optional feature, and
the section body lists that feature's dependencies.

Note that it is not normally necessary to inspect this file directly;
``pkg_resources.Distribution`` objects have a ``requires()`` method
that can be used to obtain ``Requirement`` objects describing the
project's core and optional dependencies.


``setup_requires.txt``
----------------------

Much like ``requires.txt`` except represents the requirements
specified by the ``setup_requires`` parameter to the Distribution.


``dependency_links.txt``
------------------------

A list of dependency URLs, one per line, as specified using the
``dependency_links`` keyword to ``setup()``.  These may be direct
download URLs, or the URLs of web pages containing direct download
links, and will be used by EasyInstall to find dependencies, as though
the user had manually provided them via the ``--find-links`` command
line option.  Please see the setuptools manual and EasyInstall manual
for more information on specifying this option, and for information on
how EasyInstall processes ``--find-links`` URLs.


``depends.txt`` -- Obsolete, do not create!
-------------------------------------------

This file follows an identical format to ``requires.txt``, but is
obsolete and should not be used.  The earliest versions of setuptools
required users to manually create and maintain this file, so the runtime
still supports reading it, if it exists.  The new filename was created
so that it could be automatically generated from ``setup()`` information
without overwriting an existing hand-created ``depends.txt``, if one
was already present in the project's source ``.egg-info`` directory.


``namespace_packages.txt`` -- Namespace Package Metadata
========================================================

A list of namespace package names, one per line, as supplied to the
``namespace_packages`` keyword to ``setup()``.  Please see the manuals
for setuptools and ``pkg_resources`` for more information about
namespace packages.


``entry_points.txt`` -- "Entry Point"/Plugin Metadata
=====================================================

This is a "sectioned" text file, whose contents encode the
``entry_points`` keyword supplied to ``setup()``.  All sections are
named, as the section names specify the entry point groups in which the
corresponding section's entry points are registered.

Each section is a sequence of "entry point" lines, each parseable using
the ``EntryPoint.parse`` classmethod; please see the ``pkg_resources``
manual for the complete entry point parsing syntax.

Note that it is not necessary to parse this file directly; the
``pkg_resources`` module provides a variety of APIs to locate and load
entry points automatically.  Please see the setuptools and
``pkg_resources`` manuals for details on the nature and uses of entry
points.


The ``scripts`` Subdirectory
============================

This directory is currently only created for ``.egg`` files built by
the setuptools ``bdist_egg`` command.  It will contain copies of all
of the project's "traditional" scripts (i.e., those specified using the
``scripts`` keyword to ``setup()``).  This is so that they can be
reconstituted when an ``.egg`` file is installed.

The scripts are placed here using the distutils' standard
``install_scripts`` command, so any ``#!`` lines reflect the Python
installation where the egg was built.  But instead of copying the
scripts to the local script installation directory, EasyInstall writes
short wrapper scripts that invoke the original scripts from inside the
egg, after ensuring that sys.path includes the egg and any eggs it
depends on.  For more about `script wrappers`_, see the section below on
`Installation and Path Management Issues`_.


Zip Support Metadata
====================


``native_libs.txt``
-------------------

A list of C extensions and other dynamic link libraries contained in
the egg, one per line.  Paths are ``/``-separated and relative to the
egg's base location.

This file is generated as part of ``bdist_egg`` processing, and as such
only appears in ``.egg`` files (and ``.egg`` directories created by
unpacking them).  It is used to ensure that all libraries are extracted
from a zipped egg at the same time, in case there is any direct linkage
between them.  Please see the `Zip File Issues`_ section below for more
information on library and resource extraction from ``.egg`` files.


``eager_resources.txt``
-----------------------

A list of resource files and/or directories, one per line, as specified
via the ``eager_resources`` keyword to ``setup()``.  Paths are
``/``-separated and relative to the egg's base location.

Resource files or directories listed here will be extracted
simultaneously, if any of the named resources are extracted, or if any
native libraries listed in ``native_libs.txt`` are extracted.  Please
see the setuptools manual for details on what this feature is used for
and how it works, as well as the `Zip File Issues`_ section below.


``zip-safe`` and ``not-zip-safe``
---------------------------------

These are zero-length files, and either one or the other should exist.
If ``zip-safe`` exists, it means that the project will work properly
when installed as an ``.egg`` zipfile, and conversely the existence of
``not-zip-safe`` means the project should not be installed as an
``.egg`` file.  The ``zip_safe`` option to setuptools' ``setup()``
determines which file will be written. If the option isn't provided,
setuptools attempts to make its own assessment of whether the package
can work, based on code and content analysis.

If neither file is present at installation time, EasyInstall defaults
to assuming that the project should be unzipped.  (Command-line options
to EasyInstall, however, take precedence even over an existing
``zip-safe`` or ``not-zip-safe`` file.)

Note that these flag files appear only in ``.egg`` files generated by
``bdist_egg``, and in ``.egg`` directories created by unpacking such an
``.egg`` file.



``top_level.txt`` -- Conflict Management Metadata
=================================================

This file is a list of the top-level module or package names provided
by the project, one Python identifier per line.

Subpackages are not included; a project containing both a ``foo.bar``
and a ``foo.baz`` would include only one line, ``foo``, in its
``top_level.txt``.

This data is used by ``pkg_resources`` at runtime to issue a warning if
an egg is added to ``sys.path`` when its contained packages may have
already been imported.

(It was also once used to detect conflicts with non-egg packages at
installation time, but in more recent versions, setuptools installs eggs
in such a way that they always override non-egg packages, thus
preventing a problem from arising.)


``SOURCES.txt`` -- Source Files Manifest
========================================

This file is roughly equivalent to the distutils' ``MANIFEST`` file.
The differences are as follows:

* The filenames always use ``/`` as a path separator, which must be
  converted back to a platform-specific path whenever they are read.

* The file is automatically generated by setuptools whenever the
  ``egg_info`` or ``sdist`` commands are run, and it is *not*
  user-editable.

Although this metadata is included with distributed eggs, it is not
actually used at runtime for any purpose.  Its function is to ensure
that setuptools-built *source* distributions can correctly discover
what files are part of the project's source, even if the list had been
generated using revision control metadata on the original author's
system.

In other words, ``SOURCES.txt`` has little or no runtime value for being
included in distributed eggs, and it is possible that future versions of
the ``bdist_egg`` and ``install_egg_info`` commands will strip it before
installation or distribution.  Therefore, do not rely on its being
available outside of an original source directory or source
distribution.


------------------------------
Other Technical Considerations
------------------------------


Zip File Issues
===============

Although zip files resemble directories, they are not fully
substitutable for them.  Most platforms do not support loading dynamic
link libraries contained in zipfiles, so it is not possible to directly
import C extensions from ``.egg`` zipfiles.  Similarly, there are many
existing libraries -- whether in Python or C -- that require actual
operating system filenames, and do not work with arbitrary "file-like"
objects or in-memory strings, and thus cannot operate directly on the
contents of zip files.

To address these issues, the ``pkg_resources`` module provides a
"resource API" to support obtaining either the contents of a resource,
or a true operating system filename for the resource.  If the egg
containing the resource is a directory, the resource's real filename
is simply returned.  However, if the egg is a zipfile, then the
resource is first extracted to a cache directory, and the filename
within the cache is returned.

The cache directory is determined by the ``pkg_resources`` API; please
see the ``set_cache_path()`` and ``get_default_cache()`` documentation
for details.


The Extraction Process
----------------------

Resources are extracted to a cache subdirectory whose name is based
on the enclosing ``.egg`` filename and the path to the resource.  If
there is already a file of the correct name, size, and timestamp, its
filename is returned to the requester.  Otherwise, the desired file is
extracted first to a temporary name generated using
``mkstemp(".$extract",target_dir)``, and then its timestamp is set to
match the one in the zip file, before renaming it to its final name.
(Some collision detection and resolution code is used to handle the
fact that Windows doesn't overwrite files when renaming.)

If a resource directory is requested, all of its contents are
recursively extracted in this fashion, to ensure that the directory
name can be used as if it were valid all along.

If the resource requested for extraction is listed in the
``native_libs.txt`` or ``eager_resources.txt`` metadata files, then
*all* resources listed in *either* file will be extracted before the
requested resource's filename is returned, thus ensuring that all
C extensions and data used by them will be simultaneously available.


Extension Import Wrappers
-------------------------

Since Python's built-in zip import feature does not support loading
C extension modules from zipfiles, the setuptools ``bdist_egg`` command
generates special import wrappers to make it work.

The wrappers are ``.py`` files (along with corresponding ``.pyc``
and/or ``.pyo`` files) that have the same module name as the
corresponding C extension.  These wrappers are located in the same
package directory (or top-level directory) within the zipfile, so that
say, ``foomodule.so`` will get a corresponding ``foo.py``, while
``bar/baz.pyd`` will get a corresponding ``bar/baz.py``.

These wrapper files contain a short stanza of Python code that asks
``pkg_resources`` for the filename of the corresponding C extension,
then reloads the module using the obtained filename.  This will cause
``pkg_resources`` to first ensure that all of the egg's C extensions
(and any accompanying "eager resources") are extracted to the cache
before attempting to link to the C library.

Note, by the way, that ``.egg`` directories will also contain these
wrapper files.  However, Python's default import priority is such that
C extensions take precedence over same-named Python modules, so the
import wrappers are ignored unless the egg is a zipfile.


Installation and Path Management Issues
=======================================

Python's initial setup of ``sys.path`` is very dependent on the Python
version and installation platform, as well as how Python was started
(i.e., script vs. ``-c`` vs. ``-m`` vs. interactive interpreter).
In fact, Python also provides only two relatively robust ways to affect
``sys.path`` outside of direct manipulation in code: the ``PYTHONPATH``
environment variable, and ``.pth`` files.

However, with no cross-platform way to safely and persistently change
environment variables, this leaves ``.pth`` files as EasyInstall's only
real option for persistent configuration of ``sys.path``.

But ``.pth`` files are rather strictly limited in what they are allowed
to do normally.  They add directories only to the *end* of ``sys.path``,
after any locally-installed ``site-packages`` directory, and they are
only processed *in* the ``site-packages`` directory to start with.

This is a double whammy for users who lack write access to that
directory, because they can't create a ``.pth`` file that Python will
read, and even if a sympathetic system administrator adds one for them
that calls ``site.addsitedir()`` to allow some other directory to
contain ``.pth`` files, they won't be able to install newer versions of
anything that's installed in the systemwide ``site-packages``, because
their paths will still be added *after* ``site-packages``.

So EasyInstall applies two workarounds to solve these problems.

The first is that EasyInstall leverages ``.pth`` files' "import" feature
to manipulate ``sys.path`` and ensure that anything EasyInstall adds
to a ``.pth`` file will always appear before both the standard library
and the local ``site-packages`` directories.  Thus, it is always
possible for a user who can write a Python-read ``.pth`` file to ensure
that their packages come first in their own environment.

Second, when installing to a ``PYTHONPATH`` directory (as opposed to
a "site" directory like ``site-packages``) EasyInstall will also install
a special version of the ``site`` module.  Because it's in a
``PYTHONPATH`` directory, this module will get control before the
standard library version of ``site`` does.  It will record the state of
``sys.path`` before invoking the "real" ``site`` module, and then
afterwards it processes any ``.pth`` files found in ``PYTHONPATH``
directories, including all the fixups needed to ensure that eggs always
appear before the standard library in sys.path, but are in a relative
order to one another that is defined by their ``PYTHONPATH`` and
``.pth``-prescribed sequence.

The net result of these changes is that ``sys.path`` order will be
as follows at runtime:

1. The ``sys.argv[0]`` directory, or an empty string if no script
   is being executed.

2. All eggs installed by EasyInstall in any ``.pth`` file in each
   ``PYTHONPATH`` directory, in order first by ``PYTHONPATH`` order,
   then normal ``.pth`` processing order (which is to say alphabetical
   by ``.pth`` filename, then by the order of listing within each
   ``.pth`` file).

3. All eggs installed by EasyInstall in any ``.pth`` file in each "site"
   directory (such as ``site-packages``), following the same ordering
   rules as for the ones on ``PYTHONPATH``.

4. The ``PYTHONPATH`` directories themselves, in their original order

5. Any paths from ``.pth`` files found on ``PYTHONPATH`` that were *not*
   eggs installed by EasyInstall, again following the same relative
   ordering rules.

6. The standard library and "site" directories, along with the contents
   of any ``.pth`` files found in the "site" directories.

Notice that sections 1, 4, and 6 comprise the "normal" Python setup for
``sys.path``.  Sections 2 and 3 are inserted to support eggs, and
section 5 emulates what the "normal" semantics of ``.pth`` files on
``PYTHONPATH`` would be if Python natively supported them.

For further discussion of the tradeoffs that went into this design, as
well as notes on the actual magic inserted into ``.pth`` files to make
them do these things, please see also the following messages to the
distutils-SIG mailing list:

* http://mail.python.org/pipermail/distutils-sig/2006-February/006026.html
* http://mail.python.org/pipermail/distutils-sig/2006-March/006123.html


Script Wrappers
---------------

EasyInstall never directly installs a project's original scripts to
a script installation directory.  Instead, it writes short wrapper
scripts that first ensure that the project's dependencies are active
on sys.path, before invoking the original script.  These wrappers
have a #! line that points to the version of Python that was used to
install them, and their second line is always a comment that indicates
the type of script wrapper, the project version required for the script
to run, and information identifying the script to be invoked.

The format of this marker line is::

    "# EASY-INSTALL-" script_type ": " tuple_of_strings "\n"

The ``script_type`` is one of ``SCRIPT``, ``DEV-SCRIPT``, or
``ENTRY-SCRIPT``.  The ``tuple_of_strings`` is a comma-separated
sequence of Python string constants.  For ``SCRIPT`` and ``DEV-SCRIPT``
wrappers, there are two strings: the project version requirement, and
the script name (as a filename within the ``scripts`` metadata
directory).  For ``ENTRY-SCRIPT`` wrappers, there are three:
the project version requirement, the entry point group name, and the
entry point name.  (See the "Automatic Script Creation" section in the
setuptools manual for more information about entry point scripts.)

In each case, the project version requirement string will be a string
parseable with the ``pkg_resources`` modules' ``Requirement.parse()``
classmethod.  The only difference between a ``SCRIPT`` wrapper and a
``DEV-SCRIPT`` is that a ``DEV-SCRIPT`` actually executes the original
source script in the project's source tree, and is created when the
"setup.py develop" command is run.  A ``SCRIPT`` wrapper, on the other
hand, uses the "installed" script written to the ``EGG-INFO/scripts``
subdirectory of the corresponding ``.egg`` zipfile or directory.
(``.egg-info`` eggs do not have script wrappers associated with them,
except in the "setup.py develop" case.)

The purpose of including the marker line in generated script wrappers is
to facilitate introspection of installed scripts, and their relationship
to installed eggs.  For example, an uninstallation tool could use this
data to identify what scripts can safely be removed, and/or identify
what scripts would stop working if a particular egg is uninstalled.

doc/alt-python27-setuptools/releases.txt000064400000004102151730177300014345 0ustar00===============
Release Process
===============

In order to allow for rapid, predictable releases, Setuptools uses a
mechanical technique for releases, enacted by Travis following a
successful build of a tagged release per
`PyPI deployment <https://docs.travis-ci.com/user/deployment/pypi>`_.

Prior to cutting a release, please check that the CHANGES.rst reflects
the summary of changes since the last release.
Ideally, these changelog entries would have been added
along with the changes, but it's always good to check.
Think about it from the
perspective of a user not involved with the development--what would
that person want to know about what has changed--or from the
perspective of your future self wanting to know when a particular
change landed.

To cut a release, install and run ``bump2version {part}`` where ``part``
is major, minor, or patch based on the scope of the changes in the
release. Then, push the commits to the master branch. If tests pass,
the release will be uploaded to PyPI (from the Python 3.6 tests).

Release Frequency
-----------------

Some have asked why Setuptools is released so frequently. Because Setuptools
uses a mechanical release process, it's very easy to make releases whenever the
code is stable (tests are passing). As a result, the philosophy is to release
early and often.

While some find the frequent releases somewhat surprising, they only empower
the user. Although releases are made frequently, users can choose the frequency
at which they use those releases. If instead Setuptools contributions were only
released in batches, the user would be constrained to only use Setuptools when
those official releases were made. With frequent releases, the user can govern
exactly how often he wishes to update.

Frequent releases also then obviate the need for dev or beta releases in most
cases. Because releases are made early and often, bugs are discovered and
corrected quickly, in many cases before other users have yet to encounter them.

Release Managers
----------------

Additionally, anyone with push access to the master branch has access to cut
releases.
doc/alt-python27-setuptools/development.txt000064400000002702151730177300015070 0ustar00-------------------------
Development on Setuptools
-------------------------

Setuptools is maintained by the Python community under the Python Packaging
Authority (PyPA) and led by Jason R. Coombs.

This document describes the process by which Setuptools is developed.
This document assumes the reader has some passing familiarity with
*using* setuptools, the ``pkg_resources`` module, and EasyInstall.  It
does not attempt to explain basic concepts like inter-project
dependencies, nor does it contain detailed lexical syntax for most
file formats.  Neither does it explain concepts like "namespace
packages" or "resources" in any detail, as all of these subjects are
covered at length in the setuptools developer's guide and the
``pkg_resources`` reference manual.

Instead, this is **internal** documentation for how those concepts and
features are *implemented* in concrete terms.  It is intended for people
who are working on the setuptools code base, who want to be able to
troubleshoot setuptools problems, want to write code that reads the file
formats involved, or want to otherwise tinker with setuptools-generated
files and directories.

Note, however, that these are all internal implementation details and
are therefore subject to change; stick to the published API if you don't
want to be responsible for keeping your code from breaking when
setuptools changes.  You have been warned.

.. toctree::
   :maxdepth: 1

   developer-guide
   formats
   releases
doc/alt-python27-setuptools/index.txt000064400000001031151730177310013650 0ustar00Welcome to Setuptools' documentation!
=====================================

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects, where packaging includes:

 - Python package and module definitions
 - Distribution package metadata
 - Test hooks
 - Project installation
 - Platform-specific details
 - Python 3 support

Documentation content:

.. toctree::
   :maxdepth: 2

   setuptools
   easy_install
   pkg_resources
   python3
   development
   roadmap
   history
doc/alt-python27-setuptools/history.txt000064400000003537151730177320014260 0ustar00:tocdepth: 2

.. _changes:

History
*******

.. include:: ../CHANGES (links).rst

Credits
*******

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
  version of ``pkg_resources``, and supplied the OS X operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories. Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application. In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Tarek Ziadé is the principal author of the Distribute fork, which
  re-invigorated the community on the project, encouraged renewed innovation,
  and addressed many defects.

* Since the merge with Distribute, Jason R. Coombs is the
  maintainer of setuptools. The project is maintained in coordination with
  the Python Packaging Authority (PyPA) and the larger Python community.

doc/alt-python27-setuptools/python3.txt000064400000007602151730177330014161 0ustar00=====================================================
Supporting both Python 2 and Python 3 with Setuptools
=====================================================

Starting with Distribute version 0.6.2 and Setuptools 0.7, the Setuptools
project supported Python 3. Installing and
using setuptools for Python 3 code works exactly the same as for Python 2
code.

Setuptools provides a facility to invoke 2to3 on the code as a part of the
build process, by setting the keyword parameter ``use_2to3`` to True, but
the Setuptools strongly recommends instead developing a unified codebase
using `six <https://pypi.python.org/pypi/six>`_,
`future <https://pypi.python.org/pypi/future>`_, or another compatibility
library.


Using 2to3
==========

Setuptools attempts to make the porting process easier by automatically
running
2to3 as a part of running tests. To do so, you need to configure the
setup.py so that you can run the unit tests with ``python setup.py test``.

See :ref:`test` for more information on this.

Once you have the tests running under Python 2, you can add the use_2to3
keyword parameters to setup(), and start running the tests under Python 3.
The test command will now first run the build command during which the code
will be converted with 2to3, and the tests will then be run from the build
directory, as opposed from the source directory as is normally done.

Setuptools will convert all Python files, and also all doctests in Python
files. However, if you have doctests located in separate text files, these
will not automatically be converted. By adding them to the
``convert_2to3_doctests`` keyword parameter Setuptools will convert them as
well.

By default, the conversion uses all fixers in the ``lib2to3.fixers`` package.
To use additional fixers, the parameter ``use_2to3_fixers`` can be set
to a list of names of packages containing fixers. To exclude fixers, the
parameter ``use_2to3_exclude_fixers`` can be set to fixer names to be
skipped.

An example setup.py might look something like this::

    from setuptools import setup

    setup(
        name='your.module',
        version='1.0',
        description='This is your awesome module',
        author='You',
        author_email='your@email',
        package_dir={'': 'src'},
        packages=['your', 'you.module'],
        test_suite='your.module.tests',
        use_2to3=True,
        convert_2to3_doctests=['src/your/module/README.txt'],
        use_2to3_fixers=['your.fixers'],
        use_2to3_exclude_fixers=['lib2to3.fixes.fix_import'],
    )

Differential conversion
-----------------------

Note that a file will only be copied and converted during the build process
if the source file has been changed. If you add a file to the doctests
that should be converted, it will not be converted the next time you run
the tests, since it hasn't been modified. You need to remove it from the
build directory. Also if you run the build, install or test commands before
adding the use_2to3 parameter, you will have to remove the build directory
before you run the test command, as the files otherwise will seem updated,
and no conversion will happen.

In general, if code doesn't seem to be converted, deleting the build directory
and trying again is a good safeguard against the build directory getting
"out of sync" with the source directory.

Distributing Python 3 modules
=============================

You can distribute your modules with Python 3 support in different ways. A
normal source distribution will work, but can be slow in installing, as the
2to3 process will be run during the install. But you can also distribute
the module in binary format, such as a binary egg. That egg will contain the
already converted code, and hence no 2to3 conversion is needed during install.

Advanced features
=================

If you don't want to run the 2to3 conversion on the doctests in Python files,
you can turn that off by setting ``setuptools.use_2to3_on_doctests = False``.
doc/alt-python27-setuptools/roadmap.txt000064400000000247151730177330014176 0ustar00=======
Roadmap
=======

Setuptools is primarily in maintenance mode. The project attempts to address
user issues, concerns, and feature requests in a timely fashion.
doc/alt-python27-devel/valgrind-python.supp000064400000016441151730177340014732 0ustar00#
# This is a valgrind suppression file that should be used when using valgrind.
#
#  Here's an example of running valgrind:
#
#	cd python/dist/src
#	valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \
#		./python -E -tt ./Lib/test/regrtest.py -u bsddb,network
#
# You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER
# to use the preferred suppressions with Py_ADDRESS_IN_RANGE.
#
# If you do not want to recompile Python, you can uncomment
# suppressions for PyObject_Free and PyObject_Realloc.
#
# See Misc/README.valgrind for more information.

# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Addr4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Value4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
   Memcheck:Value8
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
   Memcheck:Cond
   fun:Py_ADDRESS_IN_RANGE
}

#
# Leaks (including possible leaks)
#    Hmmm, I wonder if this masks some real leaks.  I think it does.
#    Will need to fix that.
#

{
   Suppress leaking the GIL.  Happens once per process, see comment in ceval.c.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_InitThreads
}

{
   Suppress leaking the GIL after a fork.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_ReInitThreads
}

{
   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_create_key
   fun:_PyGILState_Init
   fun:Py_InitializeEx
   fun:Py_Main
}

{
   Hmmm, is this a real leak or like the GIL?
   Memcheck:Leak
   fun:malloc
   fun:PyThread_ReInitTLS
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:realloc
   fun:_PyObject_GC_Resize
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_New
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_NewVar
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   bpo-37329: _PyWarnings_Init allocates memory at startup, but doesn't release it at exit
   Memcheck:Leak
   fun:malloc
   ...
   fun:_PyWarnings_Init
}

#
# Non-python specific leaks
#

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:memalign
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Free
###}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Realloc
###}

###
### All the suppressions below are for errors that occur within libraries
### that Python uses.  The problems to not appear to be related to Python's
### use of the libraries.
###

{
   Generic ubuntu ld problems
   Memcheck:Addr8
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
}

{
   Generic gentoo ld problems
   Memcheck:Cond
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
}

{
   DBM problems, see test_dbm
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_close
}

{
   DBM problems, see test_dbm
   Memcheck:Value8
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   GDBM problems, see test_gdbm
   Memcheck:Param
   write(buf)
   fun:write
   fun:gdbm_open

}

{
   ZLIB problems, see test_gzip
   Memcheck:Cond
   obj:/lib/libz.so.1.2.3
   obj:/lib/libz.so.1.2.3
   fun:deflate
}

{
   Avoid problems w/readline doing a putenv and leaking on exit
   Memcheck:Leak
   fun:malloc
   fun:xmalloc
   fun:sh_set_lines_and_columns
   fun:_rl_get_screen_size
   fun:_rl_init_terminal_io
   obj:/lib/libreadline.so.4.3
   fun:rl_initialize
}

###
### These occur from somewhere within the SSL, when running
###  test_socket_sll.  They are too general to leave on by default.
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:memset
###}
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:memset
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:MD5_Update
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:MD5_Update
###}

#
# All of these problems come from using test_socket_ssl
#
{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_bin2bn
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont
}

{
   from test_socket_ssl
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libcrypto.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_set_key_unchecked
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_encrypt2
}

{
   from test_socket_ssl
   Memcheck:Cond
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Value4
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BUF_MEM_grow_clean
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:memcpy
   fun:ssl3_read_bytes
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:SHA1_Update
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:SHA1_Update
}


doc/alt-python27-devel/gdbinit000064400000011325151730177340012233 0ustar00# If you use the GNU debugger gdb to debug the Python C runtime, you
# might find some of the following commands useful.  Copy this to your
# ~/.gdbinit file and it'll get loaded into gdb automatically when you
# start it up.  Then, at the gdb prompt you can do things like:
#
#    (gdb) pyo apyobjectptr
#    <module 'foobar' (built-in)>
#    refcounts: 1
#    address    : 84a7a2c
#    $1 = void
#    (gdb)
#
# NOTE: If you have gdb 7 or later, it supports debugging of Python directly
# with embedded macros that you may find superior to what is in here.
# See Tools/gdb/libpython.py and http://bugs.python.org/issue8032.

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyObject*
define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyGC_Head*
define pyg
    print _PyGC_Dump($arg0)
end

# print the local variables of the current frame
define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = co->co_varnames
	    set $_name = PyString_AsString(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyStringObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyStringObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

# print the current frame - verbose
define pyframev
    pyframe
    pylocals
end

define pyframe
    set $__fn = (char *)((PyStringObject *)co->co_filename)->ob_sval
    set $__n = (char *)((PyStringObject *)co->co_name)->ob_sval
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

# print the entire Python call stack
define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end

# print the entire Python call stack - verbose mode
define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end

# generally useful macro to print a Unicode string
def pu
  set $uni = $arg0 
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80) 
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
doc/alt-python27-devel/README.valgrind000064400000010462151730177350013357 0ustar00This document describes some caveats about the use of Valgrind with
Python.  Valgrind is used periodically by Python developers to try
to ensure there are no memory leaks or invalid memory reads/writes.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must do one of the following:

  * Uncomment Py_USING_MEMORY_DEBUGGER in Objects/obmalloc.c,
    then rebuild Python
  * Uncomment the lines in Misc/valgrind-python.supp that
    suppress the warnings for PyObject_Free and PyObject_Realloc

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
doc/alt-python27/README000064400000154060151730177360010461 0ustar00This is Python version 2.7.18
=============================

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation.  All
rights reserved.

Copyright (c) 2000 BeOpen.com.
All rights reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All rights reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum.
All rights reserved.


License information
-------------------

See the file "LICENSE" for information on the history of this
software, terms & conditions for usage, and a DISCLAIMER OF ALL
WARRANTIES.

This Python distribution contains no GNU General Public Licensed
(GPLed) code so it may be used in proprietary projects just like prior
Python distributions.  There are interfaces to some GNU code but these
are entirely optional.

All trademarks referenced herein are property of their respective
holders.


What's new in this release?
---------------------------

See the file "Misc/NEWS".


If you don't read instructions
------------------------------

Congratulations on getting this far. :-)

To start building right away (on UNIX): type "./configure" in the
current directory and when it finishes, type "make".  This creates an
executable "./python"; to install in /usr/local, first do "su root"
and then "make install".

The section `Build instructions' below is still recommended reading.


What is Python anyway?
----------------------

Python is an interpreted, interactive object-oriented programming
language suitable (amongst other uses) for distributed application
development, scripting, numeric computing and system testing.  Python
is often compared to Tcl, Perl, Java, JavaScript, Visual Basic or
Scheme.  To find out more about what Python can do for you, point your
browser to http://www.python.org/.


How do I learn Python?
----------------------

The official tutorial is still a good place to start; see
http://docs.python.org/ for online and downloadable versions, as well
as a list of other introductions, and reference documentation.

There's a quickly growing set of books on Python.  See
http://wiki.python.org/moin/PythonBooks for a list.


Documentation
-------------

All documentation is provided online in a variety of formats.  In
order of importance for new users: Tutorial, Library Reference,
Language Reference, Extending & Embedding, and the Python/C API.  The
Library Reference is especially of immense value since much of
Python's power is described there, including the built-in data types
and functions!

All documentation is also available online at the Python web site
(http://docs.python.org/, see below).  It is available online for occasional
reference, or can be downloaded in many formats for faster access.  The
documentation is downloadable in HTML, PostScript, PDF, LaTeX, and
reStructuredText (2.6+) formats; the LaTeX and reStructuredText versions are
primarily for documentation authors, translators, and people with special
formatting requirements.

If you would like to contribute to the development of Python, relevant
documentation is available at:

    http://docs.python.org/devguide/

For information about building Python's documentation, refer to Doc/README.txt.


Web sites
---------

New Python releases and related technologies are published at
http://www.python.org/.  Come visit us!


Newsgroups and Mailing Lists
----------------------------

Read comp.lang.python, a high-volume discussion newsgroup about
Python, or comp.lang.python.announce, a low-volume moderated newsgroup
for Python-related announcements.  These are also accessible as
mailing lists: see http://www.python.org/community/lists/ for an
overview of these and many other Python-related mailing lists.

Archives are accessible via the Google Groups Usenet archive; see
http://groups.google.com/.  The mailing lists are also archived, see
http://www.python.org/community/lists/ for details.


Bug reports
-----------

To report or search for bugs, please use the Python Bug
Tracker at http://bugs.python.org/.


Patches and contributions
-------------------------

To submit a patch or other contribution, please use the Python Patch
Manager at http://bugs.python.org/.  Guidelines
for patch submission may be found at http://www.python.org/dev/patches/.

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or python-ideas mailing lists for inital feedback. A Python
Enhancement Proposal (PEP) may be submitted if your idea gains ground. All
current PEPs, as well as guidelines for submitting a new PEP, are listed at
http://www.python.org/dev/peps/.


Questions
---------

For help, if you can't find it in the manuals or on the web site, it's
best to post to the comp.lang.python or the Python mailing list (see
above).  If you specifically don't want to involve the newsgroup or
mailing list, send questions to help@python.org (a group of volunteers
who answer questions as they can).  The newsgroup is the most
efficient way to ask public questions.


Build instructions
==================

Before you can build Python, you must first configure it.
Fortunately, the configuration and build process has been automated
for Unix and Linux installations, so all you usually have to do is
type a few commands and sit back.  There are some platforms where
things are not quite as smooth; see the platform specific notes below.
If you want to build for multiple platforms sharing the same source
tree, see the section on VPATH below.

Start by running the script "./configure", which determines your
system configuration and creates the Makefile.  (It takes a minute or
two -- please be patient!)  You may want to pass options to the
configure script -- see the section below on configuration options and
variables.  When it's done, you are ready to run make.

To build Python, you normally type "make" in the toplevel directory.
If you have changed the configuration, the Makefile may have to be
rebuilt.  In this case, you may have to run make again to correctly
build your desired target.  The interpreter executable is built in the
top level directory.

To get an optimized build of Python, "configure --enable-optimizations" before
you run make.  This sets the default make targets up to enable Profile Guided
Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO)
on some platforms.  For more details, see the sections bellow.

Once you have built a Python interpreter, see the subsections below on
testing and installation.  If you run into trouble, see the next
section.

Previous versions of Python used a manual configuration process that
involved editing the file Modules/Setup.  While this file still exists
and manual configuration is still supported, it is rarely needed any
more: almost all modules are automatically built as appropriate under
guidance of the setup.py script, which is run by Make after the
interpreter has been built.


Profile Guided Optimization
---------------------------

PGO takes advantage of recent versions of the GCC or Clang compilers.
If ran, "make profile-opt" will do several steps.

First, the entire Python directory is cleaned of temporary files that
may have resulted in a previous compilation.

Then, an instrumented version of the interpreter is built, using suitable
compiler flags for each flavour. Note that this is just an intermediary
step and the binary resulted after this step is not good for real life
workloads, as it has profiling instructions embedded inside.

After this instrumented version of the interpreter is built, the Makefile
will automatically run a training workload. This is necessary in order to
profile the interpreter execution. Note also that any output, both stdout
and stderr, that may appear at this step is suppressed.

Finally, the last step is to rebuild the interpreter, using the information
collected in the previous one. The end result will be a Python binary
that is optimized and suitable for distribution or production installation.


Link Time Optimization
----------------------

Enabled via configure's --with-lto flag.  LTO takes advantages of recent
compiler toolchains ability to optimize across the otherwise arbitrary .o file
boundary when building final executables or shared libraries for additional
performance gains.


Troubleshooting
---------------

See also the platform specific notes in the next section.

If you run into other trouble, see the FAQ
(http://www.python.org/doc/faq/) for hints on what can go wrong, and
how to fix it.

If you rerun the configure script with different options, remove all
object files by running "make clean" before rebuilding.  Believe it or
not, "make clean" sometimes helps to clean up other inexplicable
problems as well.  Try it before sending in a bug report!

If the configure script fails or doesn't seem to find things that
should be there, inspect the config.log file.

If you get a warning for every file about the -Olimit option being no
longer supported, you can ignore it.  There's no foolproof way to know
whether this option is needed; all we can do is test whether it is
accepted without error.  On some systems, e.g. older SGI compilers, it
is essential for performance (specifically when compiling ceval.c,
which has more basic blocks than the default limit of 1000).  If the
warning bothers you, edit the Makefile to remove "-Olimit 1500" from
the OPT variable.

If you get failures in test_long, or sys.maxint gets set to -1, you
are probably experiencing compiler bugs, usually related to
optimization.  This is a common problem with some versions of gcc, and
some vendor-supplied compilers, which can sometimes be worked around
by turning off optimization.  Consider switching to stable versions
(gcc 2.95.2, gcc 3.x, or contact your vendor.)

From Python 2.0 onward, all Python C code is ANSI C.  Compiling using
old K&R-C-only compilers is no longer possible.  ANSI C compilers are
available for all modern systems, either in the form of updated
compilers from the vendor, or one of the free compilers (gcc).

If "make install" fails mysteriously during the "compiling the library"
step, make sure that you don't have any of the PYTHONPATH or PYTHONHOME
environment variables set, as they may interfere with the newly built
executable which is compiling the library.

Unsupported systems
-------------------

A number of systems are not supported in Python 2.7 anymore. Some
support code is still present, but will be removed in later versions.
If you still need to use current Python versions on these systems,
please send a message to python-dev@python.org indicating that you
volunteer to support this system. For a more detailed discussion 
regarding no-longer-supported and resupporting platforms, as well
as a list of platforms that became or will be unsupported, see PEP 11.

More specifically, the following systems are not supported any
longer:
- SunOS 4
- DYNIX
- dgux
- Minix
- NeXT
- Irix 4 and --with-sgi-dl
- Linux 1
- Systems defining __d6_pthread_create (configure.ac)
- Systems defining PY_PTHREAD_D4, PY_PTHREAD_D6,
  or PY_PTHREAD_D7 in thread_pthread.h
- Systems using --with-dl-dld
- Systems using --without-universal-newlines
- MacOS 9
- Systems using --with-wctype-functions
- Win9x, WinME


Platform specific notes
-----------------------

(Some of these may no longer apply.  If you find you can build Python
on these platforms without the special directions mentioned here,
submit a documentation bug report to SourceForge (see Bug Reports
above) so we can remove them!)

Unix platforms: If your vendor still ships (and you still use) Berkeley DB
        1.85 you will need to edit Modules/Setup to build the bsddb185
        module and add a line to sitecustomize.py which makes it the
        default.  In Modules/Setup a line like

            bsddb185 bsddbmodule.c

        should work.  (You may need to add -I, -L or -l flags to direct the
        compiler and linker to your include files and libraries.)

XXX I think this next bit is out of date:

64-bit platforms: The modules audioop, and imageop don't work.
        The setup.py script disables them on 64-bit installations.
        Don't try to enable them in the Modules/Setup file.  They
        contain code that is quite wordsize sensitive.  (If you have a
        fix, let us know!)

Solaris: When using Sun's C compiler with threads, at least on Solaris
        2.5.1, you need to add the "-mt" compiler option (the simplest
        way is probably to specify the compiler with this option as
        the "CC" environment variable when running the configure
        script).

        When using GCC on Solaris, beware of binutils 2.13 or GCC
        versions built using it.  This mistakenly enables the
        -zcombreloc option which creates broken shared libraries on
        Solaris.  binutils 2.12 works, and the binutils maintainers
        are aware of the problem.  Binutils 2.13.1 only partially
        fixed things.  It appears that 2.13.2 solves the problem
        completely.  This problem is known to occur with Solaris 2.7
        and 2.8, but may also affect earlier and later versions of the
        OS.

        When the dynamic loader complains about errors finding shared
        libraries, such as

        ld.so.1: ./python: fatal: libstdc++.so.5: open failed:
        No such file or directory

        you need to first make sure that the library is available on
        your system. Then, you need to instruct the dynamic loader how
        to find it. You can choose any of the following strategies:

        1. When compiling Python, set LD_RUN_PATH to the directories
           containing missing libraries.
        2. When running Python, set LD_LIBRARY_PATH to these directories.
        3. Use crle(8) to extend the search path of the loader.
        4. Modify the installed GCC specs file, adding -R options into the
           *link: section.

        The complex object fails to compile on Solaris 10 with gcc 3.4 (at
        least up to 3.4.3).  To work around it, define Py_HUGE_VAL as
        HUGE_VAL(), e.g.:

          make CPPFLAGS='-D"Py_HUGE_VAL=HUGE_VAL()" -I. -I$(srcdir)/Include'
          ./python setup.py CPPFLAGS='-D"Py_HUGE_VAL=HUGE_VAL()"'

Linux:  A problem with threads and fork() was tracked down to a bug in
        the pthreads code in glibc version 2.0.5; glibc version 2.0.7
        solves the problem.  This causes the popen2 test to fail;
        problem and solution reported by Pablo Bleyer.

Red Hat Linux: Red Hat 9 built Python2.2 in UCS-4 mode and hacked
        Tcl to support it. To compile Python2.3 with Tkinter, you will
        need to pass --enable-unicode=ucs4 flag to ./configure.

        There's an executable /usr/bin/python which is Python
        1.5.2 on most older Red Hat installations; several key Red Hat tools
        require this version.  Python 2.1.x may be installed as
        /usr/bin/python2.  The Makefile installs Python as
        /usr/local/bin/python, which may or may not take precedence
        over /usr/bin/python, depending on how you have set up $PATH.

FreeBSD 3.x and probably platforms with NCurses that use libmytinfo or
        similar: When using cursesmodule, the linking is not done in
        the correct order with the defaults.  Remove "-ltermcap" from
        the readline entry in Setup, and use as curses entry: "curses
        cursesmodule.c -lmytinfo -lncurses -ltermcap" - "mytinfo" (so
        called on FreeBSD) should be the name of the auxiliary library
        required on your platform.  Normally, it would be linked
        automatically, but not necessarily in the correct order.

BSDI:   BSDI versions before 4.1 have known problems with threads,
        which can cause strange errors in a number of modules (for
        instance, the 'test_signal' test script will hang forever.)
        Turning off threads (with --with-threads=no) or upgrading to
        BSDI 4.1 solves this problem.

DEC Unix: Run configure with --with-dec-threads, or with
        --with-threads=no if no threads are desired (threads are on by
        default).  When using GCC, it is possible to get an internal
        compiler error if optimization is used.  This was reported for
        GCC 2.7.2.3 on selectmodule.c.  Manually compile the affected
        file without optimization to solve the problem.

DEC Ultrix: compile with GCC to avoid bugs in the native compiler,
        and pass SHELL=/bin/sh5 to Make when installing.

AIX:    A complete overhaul of the shared library support is now in
        place.  See Misc/AIX-NOTES for some notes on how it's done.
        (The optimizer bug reported at this place in previous releases
        has been worked around by a minimal code change.) If you get
        errors about pthread_* functions, during compile or during
        testing, try setting CC to a thread-safe (reentrant) compiler,
        like "cc_r".  For full C++ module support, set CC="xlC_r" (or
        CC="xlC" without thread support).

AIX 5.3: To build a 64-bit version with IBM's compiler, I used the
        following:

        export PATH=/usr/bin:/usr/vacpp/bin
        ./configure --with-gcc="xlc_r -q64" --with-cxx="xlC_r -q64" \
                    --disable-ipv6 AR="ar -X64"
        make

HP-UX:  When using threading, you may have to add -D_REENTRANT to the
        OPT variable in the top-level Makefile; reported by Pat Knight,
        this seems to make a difference (at least for HP-UX 10.20)
        even though pyconfig.h defines it. This seems unnecessary when
        using HP/UX 11 and later - threading seems to work "out of the
        box".

HP-UX ia64: When building on the ia64 (Itanium) platform using HP's
        compiler, some experience has shown that the compiler's
        optimiser produces a completely broken version of python
        (see http://bugs.python.org/814976). To work around this,
        edit the Makefile and remove -O from the OPT line.

        To build a 64-bit executable on an Itanium 2 system using HP's
        compiler, use these environment variables:

                CC=cc
                CXX=aCC
                BASECFLAGS="+DD64"
                LDFLAGS="+DD64 -lxnet"

        and call configure as:

                ./configure --without-gcc

        then *unset* the environment variables again before running
        make.  (At least one of these flags causes the build to fail
        if it remains set.)  You still have to edit the Makefile and
        remove -O from the OPT line.

HP PA-RISC 2.0: A recent bug report (http://bugs.python.org/546117)
        suggests that the C compiler in this 64-bit system has bugs
        in the optimizer that break Python.  Compiling without
        optimization solves the problems.

SCO:    The following apply to SCO 3 only; Python builds out of the box
        on SCO 5 (or so we've heard).

        1) Everything works much better if you add -U__STDC__ to the
        defs.  This is because all the SCO header files are broken.
        Anything that isn't mentioned in the C standard is
        conditionally excluded when __STDC__ is defined.

        2) Due to the U.S. export restrictions, SCO broke the crypt
        stuff out into a separate library, libcrypt_i.a so the LIBS
        needed be set to:

                LIBS=' -lsocket -lcrypt_i'

UnixWare: There are known bugs in the math library of the system, as well as
        problems in the handling of threads (calling fork in one
        thread may interrupt system calls in others). Therefore, test_math and
        tests involving threads will fail until those problems are fixed.

QNX:    Chris Herborth (chrish@qnx.com) writes:
        configure works best if you use GNU bash; a port is available on
        ftp.qnx.com in /usr/free.  I used the following process to build,
        test and install Python 1.5.x under QNX:

        1) CONFIG_SHELL=/usr/local/bin/bash CC=cc RANLIB=: \
            ./configure --verbose --without-gcc --with-libm=""

        2) edit Modules/Setup to activate everything that makes sense for
           your system... tested here at QNX with the following modules:

                array, audioop, binascii, cPickle, cStringIO, cmath,
                crypt, curses, errno, fcntl, gdbm, grp, imageop,
                _locale, math, md5, new, operator, parser, pcre,
                posix, pwd, readline, regex, reop,
                select, signal, socket, soundex, strop, struct,
                syslog, termios, time, timing, zlib, audioop, imageop

        3) make SHELL=/usr/local/bin/bash

           or, if you feel the need for speed:

           make SHELL=/usr/local/bin/bash OPT="-5 -Oil+nrt"

        4) make SHELL=/usr/local/bin/bash test

           Using GNU readline 2.2 seems to behave strangely, but I
           think that's a problem with my readline 2.2 port.  :-\

        5) make SHELL=/usr/local/bin/bash install

        If you get SIGSEGVs while running Python (I haven't yet, but
        I've only run small programs and the test cases), you're
        probably running out of stack; the default 32k could be a
        little tight.  To increase the stack size, edit the Makefile
        to read: LDFLAGS = -N 48k

BeOS:   See Misc/BeOS-NOTES for notes about compiling/installing
        Python on BeOS R3 or later.  Note that only the PowerPC
        platform is supported for R3; both PowerPC and x86 are
        supported for R4.

Cray T3E: Mark Hadfield (m.hadfield@niwa.co.nz) writes:
        Python can be built satisfactorily on a Cray T3E but based on
        my experience with the NIWA T3E (2002-05-22, version 2.2.1)
        there are a few bugs and gotchas. For more information see a
        thread on comp.lang.python in May 2002 entitled "Building
        Python on Cray T3E".

        1) Use Cray's cc and not gcc. The latter was reported not to
           work by Konrad Hinsen. It may work now, but it may not.

        2) To set sys.platform to something sensible, pass the
           following environment variable to the configure script:

             MACHDEP=unicosmk

        2) Run configure with option "--enable-unicode=ucs4".

        3) The Cray T3E does not support dynamic linking, so extension
           modules have to be built by adding (or uncommenting) lines
           in Modules/Setup. The minimum set of modules is

             posix, new, _sre, unicodedata

           On NIWA's vanilla T3E system the following have also been
           included successfully:

             _codecs, _locale, _socket, _symtable, _testcapi, _weakref
             array, binascii, cmath, cPickle, crypt, cStringIO, dbm
             errno, fcntl, grp, math, md5, operator, parser, pcre, pwd
             regex, rotor, select, struct, strop, syslog, termios
             time, timing, xreadlines

        4) Once the python executable and library have been built, make
           will execute setup.py, which will attempt to build remaining
           extensions and link them dynamically. Each of these attempts
           will fail but should not halt the make process. This is
           normal.

        5) Running "make test" uses a lot of resources and causes
           problems on our system. You might want to try running tests
           singly or in small groups.

SGI:    SGI's standard "make" utility (/bin/make or /usr/bin/make)
        does not check whether a command actually changed the file it
        is supposed to build.  This means that whenever you say "make"
        it will redo the link step.  The remedy is to use SGI's much
        smarter "smake" utility (/usr/sbin/smake), or GNU make.  If
        you set the first line of the Makefile to #!/usr/sbin/smake
        smake will be invoked by make (likewise for GNU make).

        WARNING: There are bugs in the optimizer of some versions of
        SGI's compilers that can cause bus errors or other strange
        behavior, especially on numerical operations.  To avoid this,
        try building with "make OPT=".

OS/2:   If you are running Warp3 or Warp4 and have IBM's VisualAge C/C++
        compiler installed, just change into the pc\os2vacpp directory
        and type NMAKE.  Threading and sockets are supported by default
        in the resulting binaries of PYTHON15.DLL and PYTHON.EXE.

Reliant UNIX: The thread support does not compile on Reliant UNIX, and
        there is a (minor) problem in the configure script for that
        platform as well.  This should be resolved in time for a
        future release.

macOS:  Building a complete Python installation requires the use of various
        additional third-party libraries, depending on your build platform and
        configure options.  Not all standard library modules are buildable or
        useable on all platforms.  Refer to the "Install Dependencies" section
        section of the "Developer Guide" for current detailed information on
        dependencies for macOS:
            https://devguide.python.org/setup/#install-dependencies

        On macOS, there are additional configure and build options related
        to macOS framework and universal builds.  Refer to Mac/README.rst.

        The tests will crash on both 10.1 and 10.2 with SEGV in
        test_re and test_sre due to the small default stack size.  If
        you set the stack size to 2048 before doing a "make test" the
        failure can be avoided.  If you're using the tcsh or csh shells,
        use "limit stacksize 2048" and for the bash shell (the default
        as of macOS 10.3), use "ulimit -s 2048".

        On naked Darwin you may want to add the configure option
        "--disable-toolbox-glue" to disable the glue code for the Carbon
        interface modules. The modules themselves are currently only built
        if you add the --enable-framework option, see below.

        On a clean macOS /usr/local does not exist. Do a
        "sudo mkdir -m 775 /usr/local"
        before you do a make install. It is probably not a good idea to
        do "sudo make install" which installs everything as superuser,
        as this may later cause problems when installing distutils-based
        additions.

        Some people have reported problems building Python after using "fink"
        to install additional unix software. Disabling fink (remove all 
        references to /sw from your .profile or .login) should solve this.

Cygwin: With recent (relative to the time of writing, 2001-12-19)
        Cygwin installations, there are problems with the interaction
        of dynamic linking and fork().  This manifests itself in build
        failures during the execution of setup.py.

        There are two workarounds that both enable Python (albeit
        without threading support) to build and pass all tests on
        NT/2000 (and most likely XP as well, though reports of testing
        on XP would be appreciated).

        The workarounds:

        (a) the band-aid fix is to link the _socket module statically
        rather than dynamically (which is the default).

        To do this, run "./configure --with-threads=no" including any
        other options you need (--prefix, etc.).  Then in Modules/Setup
        uncomment the lines:

        #SSL=/usr/local/ssl
        #_socket socketmodule.c \
        #       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        #       -L$(SSL)/lib -lssl -lcrypto

        and remove "local/" from the SSL variable.  Finally, just run
        "make"!

        (b) The "proper" fix is to rebase the Cygwin DLLs to prevent
        base address conflicts.  Details on how to do this can be
        found in the following mail:

           http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html

        It is hoped that a version of this solution will be
        incorporated into the Cygwin distribution fairly soon.

        Two additional problems:

        (1) Threading support should still be disabled due to a known
        bug in Cygwin pthreads that causes test_threadedtempfile to
        hang.

        (2) The _curses module does not build.  This is a known
        Cygwin ncurses problem that should be resolved the next time
        that this package is released.

        On older versions of Cygwin, test_poll may hang and test_strftime
        may fail.

        The situation on 9X/Me is not accurately known at present.
        Some time ago, there were reports that the following
        regression tests failed:

            test_pwd
            test_select (hang)
            test_socket

        Due to the test_select hang on 9X/Me, one should run the
        regression test using the following:

            make TESTOPTS='-l -x test_select' test

        News regarding these platforms with more recent Cygwin
        versions would be appreciated!

Windows: When executing Python scripts on the command line using file type
        associations (i.e. starting "script.py" instead of "python script.py"),
        redirects may not work unless you set a specific registry key.  See
        the Knowledge Base article <http://support.microsoft.com/kb/321788>.


Configuring the bsddb and dbm modules
-------------------------------------

Beginning with Python version 2.3, the PyBsddb package
<http://pybsddb.sf.net/> was adopted into Python as the bsddb package,
exposing a set of package-level functions which provide
backwards-compatible behavior.  Only versions 3.3 through 4.4 of
Sleepycat's libraries provide the necessary API, so older versions
aren't supported through this interface.  The old bsddb module has
been retained as bsddb185, though it is not built by default.  Users
wishing to use it will have to tweak Modules/Setup to build it.  The
dbm module will still be built against the Sleepycat libraries if
other preferred alternatives (ndbm, gdbm) are not found.

Building the sqlite3 module
---------------------------

To build the sqlite3 module, you'll need the sqlite3 or libsqlite3
packages installed, including the header files. Many modern operating
systems distribute the headers in a separate package to the library -
often it will be the same name as the main package, but with a -dev or
-devel suffix. 

The version of pysqlite2 that's including in Python needs sqlite3 3.0.8
or later. setup.py attempts to check that it can find a correct version.

Configuring threads
-------------------

As of Python 2.0, threads are enabled by default.  If you wish to
compile without threads, or if your thread support is broken, pass the
--with-threads=no switch to configure.  Unfortunately, on some
platforms, additional compiler and/or linker options are required for
threads to work properly.  Below is a table of those options,
collected by Bill Janssen.  We would love to automate this process
more, but the information below is not enough to write a patch for the
configure.ac file, so manual intervention is required.  If you patch
the configure.ac file and are confident that the patch works, please
send in the patch.  (Don't bother patching the configure script itself
-- it is regenerated each time the configure.ac file changes.)

Compiler switches for threads
.............................

The definition of _REENTRANT should be configured automatically, if
that does not work on your system, or if _REENTRANT is defined
incorrectly, please report that as a bug.

    OS/Compiler/threads                     Switches for use with threads
    (POSIX is draft 10, DCE is draft 4)     compile & link

    SunOS 5.{1-5}/{gcc,SunPro cc}/solaris   -mt
    SunOS 5.5/{gcc,SunPro cc}/POSIX         (nothing)
    DEC OSF/1 3.x/cc/DCE                    -threads
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/cc/DCE                 -threads
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/cc/POSIX               -pthread
            (butenhof@zko.dec.com)
    AIX 4.1.4/cc_r/d7                       (nothing)
            (buhrt@iquest.net)
    AIX 4.1.4/cc_r4/DCE                     (nothing)
            (buhrt@iquest.net)
    IRIX 6.2/cc/POSIX                       (nothing)
            (robertl@cwi.nl)


Linker (ld) libraries and flags for threads
...........................................

    OS/threads                          Libraries/switches for use with threads

    SunOS 5.{1-5}/solaris               -lthread
    SunOS 5.5/POSIX                     -lpthread
    DEC OSF/1 3.x/DCE                   -lpthreads -lmach -lc_r -lc
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/DCE                -lpthreads -lpthread -lmach -lexc -lc
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/POSIX              -lpthread -lmach -lexc -lc
            (butenhof@zko.dec.com)
    AIX 4.1.4/{draft7,DCE}              (nothing)
            (buhrt@iquest.net)
    IRIX 6.2/POSIX                      -lpthread
            (jph@emilia.engr.sgi.com)


Building a shared libpython
---------------------------

Starting with Python 2.3, the majority of the interpreter can be built
into a shared library, which can then be used by the interpreter
executable, and by applications embedding Python. To enable this feature,
configure with --enable-shared.

If you enable this feature, the same object files will be used to create
a static library.  In particular, the static library will contain object
files using position-independent code (PIC) on platforms where PIC flags
are needed for the shared library.


Configuring additional built-in modules
---------------------------------------

Starting with Python 2.1, the setup.py script at the top of the source
distribution attempts to detect which modules can be built and
automatically compiles them.  Autodetection doesn't always work, so
you can still customize the configuration by editing the Modules/Setup
file; but this should be considered a last resort.  The rest of this
section only applies if you decide to edit the Modules/Setup file.
You also need this to enable static linking of certain modules (which
is needed to enable profiling on some systems).

This file is initially copied from Setup.dist by the configure script;
if it does not exist yet, create it by copying Modules/Setup.dist
yourself (configure will never overwrite it).  Never edit Setup.dist
-- always edit Setup or Setup.local (see below).  Read the comments in
the file for information on what kind of edits are allowed.  When you
have edited Setup in the Modules directory, the interpreter will
automatically be rebuilt the next time you run make (in the toplevel
directory).

Many useful modules can be built on any Unix system, but some optional
modules can't be reliably autodetected.  Often the quickest way to
determine whether a particular module works or not is to see if it
will build: enable it in Setup, then if you get compilation or link
errors, disable it -- you're either missing support or need to adjust
the compilation and linking parameters for that module.

On SGI IRIX, there are modules that interface to many SGI specific
system libraries, e.g. the GL library and the audio hardware.  These
modules will not be built by the setup.py script.

In addition to the file Setup, you can also edit the file Setup.local.
(the makesetup script processes both).  You may find it more
convenient to edit Setup.local and leave Setup alone.  Then, when
installing a new Python version, you can copy your old Setup.local
file.


Setting the optimization/debugging options
------------------------------------------

If you want or need to change the optimization/debugging options for
the C compiler, assign to the OPT variable on the toplevel make
command; e.g. "make OPT=-g" will build a debugging version of Python
on most platforms.  The default is OPT=-O; a value for OPT in the
environment when the configure script is run overrides this default
(likewise for CC; and the initial value for LIBS is used as the base
set of libraries to link with).

When compiling with GCC, the default value of OPT will also include
the -Wall and -Wstrict-prototypes options.

Additional debugging code to help debug memory management problems can
be enabled by using the --with-pydebug option to the configure script.

For flags that change binary compatibility, use the EXTRA_CFLAGS
variable.


Profiling
---------

If you want C profiling turned on, the easiest way is to run configure
with the CC environment variable to the necessary compiler
invocation.  For example, on Linux, this works for profiling using
gprof(1):

    CC="gcc -pg" ./configure

Note that on Linux, gprof apparently does not work for shared
libraries.  The Makefile/Setup mechanism can be used to compile and
link most extension modules statically.


Coverage checking
-----------------

For C coverage checking using gcov, run "make coverage".  This will
build a Python binary with profiling activated, and a ".gcno" and
".gcda" file for every source file compiled with that option.  With
the built binary, now run the code whose coverage you want to check.
Then, you can see coverage statistics for each individual source file
by running gcov, e.g.

    gcov -o Modules zlibmodule

This will create a "zlibmodule.c.gcov" file in the current directory
containing coverage info for that source file.

This works only for source files statically compiled into the
executable; use the Makefile/Setup mechanism to compile and link
extension modules you want to coverage-check statically.


Testing
-------

To test the interpreter, type "make test" in the top-level directory.
This runs the test set twice (once with no compiled files, once with
the compiled files left by the previous test run).  The test set
produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.
If a message is printed about a failed test or a traceback or core
dump is produced, something is wrong.  On some Linux systems (those
that are not yet using glibc 6), test_strftime fails due to a
non-standard implementation of strftime() in the C library. Please
ignore this, or upgrade to glibc version 6.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run "make testall".

IMPORTANT: If the tests fail and you decide to mail a bug report,
*don't* include the output of "make test".  It is useless.  Run the
failing test manually, as follows:

        ./python Lib/test/regrtest.py -v test_whatever

(substituting the top of the source tree for '.' if you built in a
different directory).  This runs the test in verbose mode.


Installing
----------

To install the Python binary, library modules, shared library modules
(see below), include files, configuration files, and the manual page,
just type

        make install

This will install all platform-independent files in subdirectories of
the directory given with the --prefix option to configure or to the
`prefix' Make variable (default /usr/local).  All binary and other
platform-specific files will be installed in subdirectories if the
directory given by --exec-prefix or the `exec_prefix' Make variable
(defaults to the --prefix directory) is given.

If DESTDIR is set, it will be taken as the root directory of the
installation, and files will be installed into $(DESTDIR)$(prefix),
$(DESTDIR)$(exec_prefix), etc.

All subdirectories created will have Python's version number in their
name, e.g. the library modules are installed in
"/usr/local/lib/python<version>/" by default, where <version> is the
<major>.<minor> release number (e.g. "2.1").  The Python binary is
installed as "python<version>" and a hard link named "python" is
created.  The only file not installed with a version number in its
name is the manual page, installed as "/usr/local/man/man1/python.1"
by default.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".

The only thing you may have to install manually is the Python mode for
Emacs found in Misc/python-mode.el.  (But then again, more recent
versions of Emacs may already have it.)  Follow the instructions that
came with Emacs for installation of site-specific files.


Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (--prefix argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using "make altinstall" contain the major and minor
version and can thus live side-by-side.  "make install" also creates
${prefix}/bin/python which refers to ${prefix}/bin/pythonX.Y.  If you intend
to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using
"make install".  Install all other versions using "make altinstall".

For example, if you want to install Python 2.5, 2.6 and 3.0 with 2.6 being
the primary version, you would execute "make install" in your 2.6 build
directory and "make altinstall" in the others.


Configuration options and variables
-----------------------------------

Some special cases are handled by passing options to the configure
script.

WARNING: if you rerun the configure script with different options, you
must run "make clean" before rebuilding.  Exceptions to this rule:
after changing --prefix or --exec-prefix, all you need to do is remove
Modules/getpath.o.

--with(out)-gcc: The configure script uses gcc (the GNU C compiler) if
        it finds it.  If you don't want this, or if this compiler is
        installed but broken on your platform, pass the option
        --without-gcc.  You can also pass "CC=cc" (or whatever the
        name of the proper C compiler is) in the environment, but the
        advantage of using --without-gcc is that this option is
        remembered by the config.status script for its --recheck
        option.

--prefix, --exec-prefix: If you want to install the binaries and the
        Python library somewhere else than in /usr/local/{bin,lib},
        you can pass the option --prefix=DIRECTORY; the interpreter
        binary will be installed as DIRECTORY/bin/python and the
        library files as DIRECTORY/lib/python/*.  If you pass
        --exec-prefix=DIRECTORY (as well) this overrides the
        installation prefix for architecture-dependent files (like the
        interpreter binary).  Note that --prefix=DIRECTORY also
        affects the default module search path (sys.path), when
        Modules/config.c is compiled.  Passing make the option
        prefix=DIRECTORY (and/or exec_prefix=DIRECTORY) overrides the
        prefix set at configuration time; this may be more convenient
        than re-running the configure script if you change your mind
        about the install prefix.

--with-readline: This option is no longer supported.  GNU
        readline is automatically enabled by setup.py when present.

--with-threads: On most Unix systems, you can now use multiple
        threads, and support for this is enabled by default.  To
        disable this, pass --with-threads=no.  If the library required
        for threads lives in a peculiar place, you can use
        --with-thread=DIRECTORY.  IMPORTANT: run "make clean" after
        changing (either enabling or disabling) this option, or you
        will get link errors!  Note: for DEC Unix use
        --with-dec-threads instead.

--with-sgi-dl: On SGI IRIX 4, dynamic loading of extension modules is
        supported by the "dl" library by Jack Jansen, which is
        ftp'able from ftp://ftp.cwi.nl/pub/dynload/dl-1.6.tar.Z.
        This is enabled (after you've ftp'ed and compiled the dl
        library) by passing --with-sgi-dl=DIRECTORY where DIRECTORY
        is the absolute pathname of the dl library.  (Don't bother on
        IRIX 5, it already has dynamic linking using SunOS style
        shared libraries.)  THIS OPTION IS UNSUPPORTED.

--with-dl-dld: Dynamic loading of modules is rumored to be supported
        on some other systems: VAX (Ultrix), Sun3 (SunOS 3.4), Sequent
        Symmetry (Dynix), and Atari ST.  This is done using a
        combination of the GNU dynamic loading package
        (ftp://ftp.cwi.nl/pub/dynload/dl-dld-1.1.tar.Z) and an
        emulation of the SGI dl library mentioned above (the emulation
        can be found at
        ftp://ftp.cwi.nl/pub/dynload/dld-3.2.3.tar.Z).  To
        enable this, ftp and compile both libraries, then call
        configure, passing it the option
        --with-dl-dld=DL_DIRECTORY,DLD_DIRECTORY where DL_DIRECTORY is
        the absolute pathname of the dl emulation library and
        DLD_DIRECTORY is the absolute pathname of the GNU dld library.
        (Don't bother on SunOS 4 or 5, they already have dynamic
        linking using shared libraries.)  THIS OPTION IS UNSUPPORTED.

--with-libm, --with-libc: It is possible to specify alternative
        versions for the Math library (default -lm) and the C library
        (default the empty string) using the options
        --with-libm=STRING and --with-libc=STRING, respectively.  For
        example, if your system requires that you pass -lc_s to the C
        compiler to use the shared C library, you can pass
        --with-libc=-lc_s. These libraries are passed after all other
        libraries, the C library last.

--with-libs='libs': Add 'libs' to the LIBS that the python interpreter
        is linked against.

--with-cxx-main=<compiler>: If you plan to use C++ extension modules,
        then -- on some platforms -- you need to compile python's main()
        function with the C++ compiler. With this option, make will use
        <compiler> to compile main() *and* to link the python executable.
        It is likely that the resulting executable depends on the C++
        runtime library of <compiler>. (The default is --without-cxx-main.)

        There are platforms that do not require you to build Python
        with a C++ compiler in order to use C++ extension modules.
        E.g., x86 Linux with ELF shared binaries and GCC 3.x, 4.x is such
        a platform. We recommend that you configure Python
        --without-cxx-main on those platforms because a mismatch
        between the C++ compiler version used to build Python and to
        build a C++ extension module is likely to cause a crash at
        runtime.

        The Python installation also stores the variable CXX that
        determines, e.g., the C++ compiler distutils calls by default
        to build C++ extensions. If you set CXX on the configure command
        line to any string of non-zero length, then configure won't
        change CXX. If you do not preset CXX but pass
        --with-cxx-main=<compiler>, then configure sets CXX=<compiler>.
        In all other cases, configure looks for a C++ compiler by
        some common names (c++, g++, gcc, CC, cxx, cc++, cl) and sets
        CXX to the first compiler it finds. If it does not find any
        C++ compiler, then it sets CXX="".

        Similarly, if you want to change the command used to link the
        python executable, then set LINKCC on the configure command line.


--with-pydebug:  Enable additional debugging code to help track down
        memory management problems.  This allows printing a list of all
        live objects when the interpreter terminates.

--with(out)-universal-newlines: enable reading of text files with
        foreign newline convention (default: enabled). In other words,
        any of \r, \n or \r\n is acceptable as end-of-line character.
        If enabled import and execfile will automatically accept any newline
        in files. Python code can open a file with open(file, 'U') to
        read it in universal newline mode. THIS OPTION IS UNSUPPORTED.

--with-tsc: Profile using the Pentium timestamping counter (TSC).

--with-system-ffi:  Build the _ctypes extension module using an ffi
        library installed on the system.

--with-dbmliborder=db1:db2:...:  Specify the order that backends for the
	dbm extension are checked. Valid value is a colon separated string
	with the backend names `ndbm', `gdbm' and `bdb'.

Building for multiple architectures (using the VPATH feature)
-------------------------------------------------------------

If your file system is shared between multiple architectures, it
usually is not necessary to make copies of the sources for each
architecture you want to support.  If the make program supports the
VPATH feature, you can create an empty build directory for each
architecture, and in each directory run the configure script (on the
appropriate machine with the appropriate options).  This creates the
necessary subdirectories and the Makefiles therein.  The Makefiles
contain a line VPATH=... which points to a directory containing the
actual sources.  (On SGI systems, use "smake -J1" instead of "make" if
you use VPATH -- don't try gnumake.)

For example, the following is all you need to build a minimal Python
in /usr/tmp/python (assuming ~guido/src/python is the toplevel
directory and you want to build in /usr/tmp/python):

        $ mkdir /usr/tmp/python
        $ cd /usr/tmp/python
        $ ~guido/src/python/configure
        [...]
        $ make
        [...]
        $

Note that configure copies the original Setup file to the build
directory if it finds no Setup file there.  This means that you can
edit the Setup file for each architecture independently.  For this
reason, subsequent changes to the original Setup file are not tracked
automatically, as they might overwrite local changes.  To force a copy
of a changed original Setup file, delete the target Setup file.  (The
makesetup script supports multiple input files, so if you want to be
fancy you can change the rules to create an empty Setup.local if it
doesn't exist and run it with arguments $(srcdir)/Setup Setup.local;
however this assumes that you only need to add modules.)

Also note that you can't use a workspace for VPATH and non VPATH builds. The
object files left behind by one version confuses the other.


Building on non-UNIX systems
----------------------------

For Windows (2000/NT/ME/98/95), assuming you have MS VC++ 7.1, the
project files are in PCbuild, the workspace is pcbuild.dsw.  See
PCbuild\readme.txt for detailed instructions.

For other non-Unix Windows compilers, in particular MS VC++ 6.0 and
for OS/2, enter the directory "PC" and read the file "readme.txt".

For the Mac, a separate source distribution will be made available,
for use with the CodeWarrior compiler.  If you are interested in Mac
development, join the PythonMac Special Interest Group
(http://www.python.org/sigs/pythonmac-sig/, or send email to
pythonmac-sig-request@python.org).

Of course, there are also binary distributions available for these
platforms -- see http://www.python.org/.

To port Python to a new non-UNIX system, you will have to fake the
effect of running the configure script manually (for Mac and PC, this
has already been done for you).  A good start is to copy the file
pyconfig.h.in to pyconfig.h and edit the latter to reflect the actual
configuration of your system.  Most symbols must simply be defined as
1 only if the corresponding feature is present and can be left alone
otherwise; however the *_t type symbols must be defined as some
variant of int if they need to be defined at all.

For all platforms, it's important that the build arrange to define the
preprocessor symbol NDEBUG on the compiler command line in a release
build of Python (else assert() calls remain in the code, hurting
release-build performance).  The Unix, Windows and Mac builds already
do this.


Miscellaneous issues
====================

Emacs mode
----------

There's an excellent Emacs editing mode for Python code; see the file
Misc/python-mode.el.  Originally written by the famous Tim Peters, it is now
maintained by the equally famous Barry Warsaw.  The latest version, along with
various other contributed Python-related Emacs goodies, is online at
http://launchpad.net/python-mode/.


Tkinter
-------

The setup.py script automatically configures this when it detects a
usable Tcl/Tk installation.  This requires Tcl/Tk version 8.0 or
higher.

For more Tkinter information, see the Tkinter Resource page:
http://www.python.org/topics/tkinter/

There are demos in the Demo/tkinter directory.

Note that there's a Python module called "Tkinter" (capital T) which
lives in Lib/lib-tk/Tkinter.py, and a C module called "_tkinter"
(lower case t and leading underscore) which lives in
Modules/_tkinter.c.  Demos and normal Tk applications import only the
Python Tkinter module -- only the latter imports the C _tkinter
module.  In order to find the C _tkinter module, it must be compiled
and linked into the Python interpreter -- the setup.py script does
this.  In order to find the Python Tkinter module, sys.path must be
set correctly -- normal installation takes care of this.


Distribution structure
----------------------

Most subdirectories have their own README files.  Most files have
comments.

Demo/           Demonstration scripts, modules and programs
Doc/            Documentation sources (reStructuredText)
Grammar/        Input for the parser generator
Include/        Public header files
LICENSE         Licensing information
Lib/            Python library modules
Mac/            Macintosh specific resources
Makefile.pre.in Source from which config.status creates the Makefile.pre
Misc/           Miscellaneous useful files
Modules/        Implementation of most built-in modules
Objects/        Implementation of most built-in object types
PC/             Files specific to PC ports (DOS, Windows, OS/2)
PCbuild/        Build directory for Microsoft Visual C++
Parser/         The parser and tokenizer and their input handling
Python/         The byte-compiler and interpreter
README          The file you're reading now
RISCOS/         Files specific to RISC OS port
Tools/          Some useful programs written in Python
pyconfig.h.in   Source from which pyconfig.h is created (GNU autoheader output)
configure       Configuration shell script (GNU autoconf output)
configure.ac    Configuration specification (input for GNU autoconf)
install-sh      Shell script used to install files
setup.py        Python script used to build extension modules

The following files will (may) be created in the toplevel directory by
the configuration and build processes:

Makefile        Build rules
Makefile.pre    Build rules before running Modules/makesetup
buildno         Keeps track of the build number
config.cache    Cache of configuration variables
pyconfig.h      Configuration header
config.log      Log from last configure run
config.status   Status from last run of the configure script
getbuildinfo.o  Object file from Modules/getbuildinfo.c
libpython<version>.a    The library archive
python          The executable interpreter
reflog.txt      Output from running the regression suite with the -R flag 
tags, TAGS      Tags files for vi and Emacs


That's all, folks!
------------------


--Guido van Rossum (home page: http://www.python.org/~guido/)
doc/alt-python27-raven/PKG-INFO000064400000002564151730177360012010 0ustar00Metadata-Version: 1.1
Name: raven
Version: 6.3.0
Summary: Raven is a client for Sentry (https://getsentry.com)
Home-page: https://github.com/getsentry/raven-python
Author: Sentry
Author-email: hello@getsentry.com
License: BSD
Description: 
        Raven
        =====
        
        Raven is a Python client for `Sentry <http://getsentry.com/>`_. It provides
        full out-of-the-box support for many of the popular frameworks, including
        `Django <djangoproject.com>`_, `Flask <http://flask.pocoo.org/>`_, and `Pylons
        <http://www.pylonsproject.org/>`_. Raven also includes drop-in support for any
        `WSGI <https://wsgi.readthedocs.io/>`_-compatible web application.
        
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
doc/alt-python27-raven/LICENSE000064400000002764151730177370011723 0ustar00Copyright (c) 2015 Functional Software, Inc and individual contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    3. Neither the name of the Raven nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/alt-python27-raven/README.rst000064400000006674151730177370012411 0ustar00.. raw:: html

    <p align="center">

.. image:: docs/_static/logo.png
    :target: https://sentry.io
    :align: center
    :width: 116
    :alt: Sentry website

.. raw:: html

    </p>

Raven - Sentry for Python
=========================

.. image:: https://img.shields.io/pypi/v/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- version

.. image:: https://travis-ci.org/getsentry/raven-python.svg?branch=master
    :target: https://travis-ci.org/getsentry/raven-python

.. image:: https://img.shields.io/pypi/l/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- MIT licence

.. image:: https://img.shields.io/pypi/pyversions/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- Python versions

.. image:: https://codeclimate.com/github/getsentry/raven-python/badges/gpa.svg
   :target: https://codeclimate.com/github/codeclimate/codeclimate
   :alt: Code Climate


Raven is the official Python client for `Sentry`_, officially supports
Python 2.6–2.7 & 3.3–3.7, and runs on PyPy and Google App Engine.

It tracks errors and exceptions that happen during the
execution of your application and provides instant notification with detailed
information needed to prioritize, identify, reproduce and fix each issue.

It provides full out-of-the-box support for many of the popular python frameworks, including
Django, and Flask. Raven also includes drop-in support for any WSGI-compatible
web application.

Your application doesn't live on the web? No problem! Raven is easy to use in
any Python application.

For more information, see our `Python Documentation`_ for framework integrations and other goodies.


Features
--------

- Automatically report (un)handled exceptions and errors
- Send customized diagnostic data
- Process and sanitize data before sending it over the network


Quickstart
----------

It's really easy to get started with Raven. After you complete setting up a project in Sentry,
you’ll be given a value which we call a DSN, or Data Source Name. You will need it to configure the client.


Install the latest package with *pip* and configure the client::

    pip install raven --upgrade

Create a client and capture an example exception:

.. sourcecode:: python

    from raven import Client

    client = Client('___DSN___')

    try:
        1 / 0
    except ZeroDivisionError:
        client.captureException()


Raven Python is more than that however. Checkout our `Python Documentation`_.


Contributing
------------

Raven is under active development and contributions are more than welcome!
There are many ways to contribute:

* Join in on discussions on our `Mailing List`_ or in our `IRC Channel`_.

* Report bugs on our `Issue Tracker`_.

* Submit a pull request!


Resources
---------

* `Sentry`_
* `Python Documentation`_
* `Issue Tracker`_
* `Code`_ on Github
* `Mailing List`_
* `IRC Channel`_ (irc.freenode.net, #sentry)
* `Travis CI`_

.. _Sentry: https://getsentry.com/
.. _Python Documentation: https://docs.getsentry.com/hosted/clients/python/
.. _SDKs for other platforms: https://docs.sentry.io/#platforms
.. _Issue Tracker: https://github.com/getsentry/raven-python/issues
.. _Code: https://github.com/getsentry/raven-python
.. _Mailing List: https://groups.google.com/group/getsentry
.. _IRC Channel: irc://irc.freenode.net/sentry
.. _Travis CI: http://travis-ci.org/getsentry/raven-python





Not using Python? Check out our `SDKs for other platforms`_.
doc/alt-python27-pip/README.rst000064400000004606151730177400012051 0ustar00pip - The Python Package Installer
==================================

.. image:: https://img.shields.io/pypi/v/pip.svg
   :target: https://pypi.org/project/pip/

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest

pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.

Please take a look at our documentation for how to install and use pip:

* `Installation`_
* `Usage`_

We release updates regularly, with a new version every 3 months. Find more details in our documentation:

* `Release notes`_
* `Release process`_

In 2020, we're working on improvements to the heart of pip. Please `learn more and take our survey`_ to help us do it right.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

Code of Conduct
---------------

Everyone interacting in the pip project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installing.html
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _learn more and take our survey: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
doc/alt-python27-libs/README000064400000154060151730177410011404 0ustar00This is Python version 2.7.18
=============================

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation.  All
rights reserved.

Copyright (c) 2000 BeOpen.com.
All rights reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All rights reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum.
All rights reserved.


License information
-------------------

See the file "LICENSE" for information on the history of this
software, terms & conditions for usage, and a DISCLAIMER OF ALL
WARRANTIES.

This Python distribution contains no GNU General Public Licensed
(GPLed) code so it may be used in proprietary projects just like prior
Python distributions.  There are interfaces to some GNU code but these
are entirely optional.

All trademarks referenced herein are property of their respective
holders.


What's new in this release?
---------------------------

See the file "Misc/NEWS".


If you don't read instructions
------------------------------

Congratulations on getting this far. :-)

To start building right away (on UNIX): type "./configure" in the
current directory and when it finishes, type "make".  This creates an
executable "./python"; to install in /usr/local, first do "su root"
and then "make install".

The section `Build instructions' below is still recommended reading.


What is Python anyway?
----------------------

Python is an interpreted, interactive object-oriented programming
language suitable (amongst other uses) for distributed application
development, scripting, numeric computing and system testing.  Python
is often compared to Tcl, Perl, Java, JavaScript, Visual Basic or
Scheme.  To find out more about what Python can do for you, point your
browser to http://www.python.org/.


How do I learn Python?
----------------------

The official tutorial is still a good place to start; see
http://docs.python.org/ for online and downloadable versions, as well
as a list of other introductions, and reference documentation.

There's a quickly growing set of books on Python.  See
http://wiki.python.org/moin/PythonBooks for a list.


Documentation
-------------

All documentation is provided online in a variety of formats.  In
order of importance for new users: Tutorial, Library Reference,
Language Reference, Extending & Embedding, and the Python/C API.  The
Library Reference is especially of immense value since much of
Python's power is described there, including the built-in data types
and functions!

All documentation is also available online at the Python web site
(http://docs.python.org/, see below).  It is available online for occasional
reference, or can be downloaded in many formats for faster access.  The
documentation is downloadable in HTML, PostScript, PDF, LaTeX, and
reStructuredText (2.6+) formats; the LaTeX and reStructuredText versions are
primarily for documentation authors, translators, and people with special
formatting requirements.

If you would like to contribute to the development of Python, relevant
documentation is available at:

    http://docs.python.org/devguide/

For information about building Python's documentation, refer to Doc/README.txt.


Web sites
---------

New Python releases and related technologies are published at
http://www.python.org/.  Come visit us!


Newsgroups and Mailing Lists
----------------------------

Read comp.lang.python, a high-volume discussion newsgroup about
Python, or comp.lang.python.announce, a low-volume moderated newsgroup
for Python-related announcements.  These are also accessible as
mailing lists: see http://www.python.org/community/lists/ for an
overview of these and many other Python-related mailing lists.

Archives are accessible via the Google Groups Usenet archive; see
http://groups.google.com/.  The mailing lists are also archived, see
http://www.python.org/community/lists/ for details.


Bug reports
-----------

To report or search for bugs, please use the Python Bug
Tracker at http://bugs.python.org/.


Patches and contributions
-------------------------

To submit a patch or other contribution, please use the Python Patch
Manager at http://bugs.python.org/.  Guidelines
for patch submission may be found at http://www.python.org/dev/patches/.

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or python-ideas mailing lists for inital feedback. A Python
Enhancement Proposal (PEP) may be submitted if your idea gains ground. All
current PEPs, as well as guidelines for submitting a new PEP, are listed at
http://www.python.org/dev/peps/.


Questions
---------

For help, if you can't find it in the manuals or on the web site, it's
best to post to the comp.lang.python or the Python mailing list (see
above).  If you specifically don't want to involve the newsgroup or
mailing list, send questions to help@python.org (a group of volunteers
who answer questions as they can).  The newsgroup is the most
efficient way to ask public questions.


Build instructions
==================

Before you can build Python, you must first configure it.
Fortunately, the configuration and build process has been automated
for Unix and Linux installations, so all you usually have to do is
type a few commands and sit back.  There are some platforms where
things are not quite as smooth; see the platform specific notes below.
If you want to build for multiple platforms sharing the same source
tree, see the section on VPATH below.

Start by running the script "./configure", which determines your
system configuration and creates the Makefile.  (It takes a minute or
two -- please be patient!)  You may want to pass options to the
configure script -- see the section below on configuration options and
variables.  When it's done, you are ready to run make.

To build Python, you normally type "make" in the toplevel directory.
If you have changed the configuration, the Makefile may have to be
rebuilt.  In this case, you may have to run make again to correctly
build your desired target.  The interpreter executable is built in the
top level directory.

To get an optimized build of Python, "configure --enable-optimizations" before
you run make.  This sets the default make targets up to enable Profile Guided
Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO)
on some platforms.  For more details, see the sections bellow.

Once you have built a Python interpreter, see the subsections below on
testing and installation.  If you run into trouble, see the next
section.

Previous versions of Python used a manual configuration process that
involved editing the file Modules/Setup.  While this file still exists
and manual configuration is still supported, it is rarely needed any
more: almost all modules are automatically built as appropriate under
guidance of the setup.py script, which is run by Make after the
interpreter has been built.


Profile Guided Optimization
---------------------------

PGO takes advantage of recent versions of the GCC or Clang compilers.
If ran, "make profile-opt" will do several steps.

First, the entire Python directory is cleaned of temporary files that
may have resulted in a previous compilation.

Then, an instrumented version of the interpreter is built, using suitable
compiler flags for each flavour. Note that this is just an intermediary
step and the binary resulted after this step is not good for real life
workloads, as it has profiling instructions embedded inside.

After this instrumented version of the interpreter is built, the Makefile
will automatically run a training workload. This is necessary in order to
profile the interpreter execution. Note also that any output, both stdout
and stderr, that may appear at this step is suppressed.

Finally, the last step is to rebuild the interpreter, using the information
collected in the previous one. The end result will be a Python binary
that is optimized and suitable for distribution or production installation.


Link Time Optimization
----------------------

Enabled via configure's --with-lto flag.  LTO takes advantages of recent
compiler toolchains ability to optimize across the otherwise arbitrary .o file
boundary when building final executables or shared libraries for additional
performance gains.


Troubleshooting
---------------

See also the platform specific notes in the next section.

If you run into other trouble, see the FAQ
(http://www.python.org/doc/faq/) for hints on what can go wrong, and
how to fix it.

If you rerun the configure script with different options, remove all
object files by running "make clean" before rebuilding.  Believe it or
not, "make clean" sometimes helps to clean up other inexplicable
problems as well.  Try it before sending in a bug report!

If the configure script fails or doesn't seem to find things that
should be there, inspect the config.log file.

If you get a warning for every file about the -Olimit option being no
longer supported, you can ignore it.  There's no foolproof way to know
whether this option is needed; all we can do is test whether it is
accepted without error.  On some systems, e.g. older SGI compilers, it
is essential for performance (specifically when compiling ceval.c,
which has more basic blocks than the default limit of 1000).  If the
warning bothers you, edit the Makefile to remove "-Olimit 1500" from
the OPT variable.

If you get failures in test_long, or sys.maxint gets set to -1, you
are probably experiencing compiler bugs, usually related to
optimization.  This is a common problem with some versions of gcc, and
some vendor-supplied compilers, which can sometimes be worked around
by turning off optimization.  Consider switching to stable versions
(gcc 2.95.2, gcc 3.x, or contact your vendor.)

From Python 2.0 onward, all Python C code is ANSI C.  Compiling using
old K&R-C-only compilers is no longer possible.  ANSI C compilers are
available for all modern systems, either in the form of updated
compilers from the vendor, or one of the free compilers (gcc).

If "make install" fails mysteriously during the "compiling the library"
step, make sure that you don't have any of the PYTHONPATH or PYTHONHOME
environment variables set, as they may interfere with the newly built
executable which is compiling the library.

Unsupported systems
-------------------

A number of systems are not supported in Python 2.7 anymore. Some
support code is still present, but will be removed in later versions.
If you still need to use current Python versions on these systems,
please send a message to python-dev@python.org indicating that you
volunteer to support this system. For a more detailed discussion 
regarding no-longer-supported and resupporting platforms, as well
as a list of platforms that became or will be unsupported, see PEP 11.

More specifically, the following systems are not supported any
longer:
- SunOS 4
- DYNIX
- dgux
- Minix
- NeXT
- Irix 4 and --with-sgi-dl
- Linux 1
- Systems defining __d6_pthread_create (configure.ac)
- Systems defining PY_PTHREAD_D4, PY_PTHREAD_D6,
  or PY_PTHREAD_D7 in thread_pthread.h
- Systems using --with-dl-dld
- Systems using --without-universal-newlines
- MacOS 9
- Systems using --with-wctype-functions
- Win9x, WinME


Platform specific notes
-----------------------

(Some of these may no longer apply.  If you find you can build Python
on these platforms without the special directions mentioned here,
submit a documentation bug report to SourceForge (see Bug Reports
above) so we can remove them!)

Unix platforms: If your vendor still ships (and you still use) Berkeley DB
        1.85 you will need to edit Modules/Setup to build the bsddb185
        module and add a line to sitecustomize.py which makes it the
        default.  In Modules/Setup a line like

            bsddb185 bsddbmodule.c

        should work.  (You may need to add -I, -L or -l flags to direct the
        compiler and linker to your include files and libraries.)

XXX I think this next bit is out of date:

64-bit platforms: The modules audioop, and imageop don't work.
        The setup.py script disables them on 64-bit installations.
        Don't try to enable them in the Modules/Setup file.  They
        contain code that is quite wordsize sensitive.  (If you have a
        fix, let us know!)

Solaris: When using Sun's C compiler with threads, at least on Solaris
        2.5.1, you need to add the "-mt" compiler option (the simplest
        way is probably to specify the compiler with this option as
        the "CC" environment variable when running the configure
        script).

        When using GCC on Solaris, beware of binutils 2.13 or GCC
        versions built using it.  This mistakenly enables the
        -zcombreloc option which creates broken shared libraries on
        Solaris.  binutils 2.12 works, and the binutils maintainers
        are aware of the problem.  Binutils 2.13.1 only partially
        fixed things.  It appears that 2.13.2 solves the problem
        completely.  This problem is known to occur with Solaris 2.7
        and 2.8, but may also affect earlier and later versions of the
        OS.

        When the dynamic loader complains about errors finding shared
        libraries, such as

        ld.so.1: ./python: fatal: libstdc++.so.5: open failed:
        No such file or directory

        you need to first make sure that the library is available on
        your system. Then, you need to instruct the dynamic loader how
        to find it. You can choose any of the following strategies:

        1. When compiling Python, set LD_RUN_PATH to the directories
           containing missing libraries.
        2. When running Python, set LD_LIBRARY_PATH to these directories.
        3. Use crle(8) to extend the search path of the loader.
        4. Modify the installed GCC specs file, adding -R options into the
           *link: section.

        The complex object fails to compile on Solaris 10 with gcc 3.4 (at
        least up to 3.4.3).  To work around it, define Py_HUGE_VAL as
        HUGE_VAL(), e.g.:

          make CPPFLAGS='-D"Py_HUGE_VAL=HUGE_VAL()" -I. -I$(srcdir)/Include'
          ./python setup.py CPPFLAGS='-D"Py_HUGE_VAL=HUGE_VAL()"'

Linux:  A problem with threads and fork() was tracked down to a bug in
        the pthreads code in glibc version 2.0.5; glibc version 2.0.7
        solves the problem.  This causes the popen2 test to fail;
        problem and solution reported by Pablo Bleyer.

Red Hat Linux: Red Hat 9 built Python2.2 in UCS-4 mode and hacked
        Tcl to support it. To compile Python2.3 with Tkinter, you will
        need to pass --enable-unicode=ucs4 flag to ./configure.

        There's an executable /usr/bin/python which is Python
        1.5.2 on most older Red Hat installations; several key Red Hat tools
        require this version.  Python 2.1.x may be installed as
        /usr/bin/python2.  The Makefile installs Python as
        /usr/local/bin/python, which may or may not take precedence
        over /usr/bin/python, depending on how you have set up $PATH.

FreeBSD 3.x and probably platforms with NCurses that use libmytinfo or
        similar: When using cursesmodule, the linking is not done in
        the correct order with the defaults.  Remove "-ltermcap" from
        the readline entry in Setup, and use as curses entry: "curses
        cursesmodule.c -lmytinfo -lncurses -ltermcap" - "mytinfo" (so
        called on FreeBSD) should be the name of the auxiliary library
        required on your platform.  Normally, it would be linked
        automatically, but not necessarily in the correct order.

BSDI:   BSDI versions before 4.1 have known problems with threads,
        which can cause strange errors in a number of modules (for
        instance, the 'test_signal' test script will hang forever.)
        Turning off threads (with --with-threads=no) or upgrading to
        BSDI 4.1 solves this problem.

DEC Unix: Run configure with --with-dec-threads, or with
        --with-threads=no if no threads are desired (threads are on by
        default).  When using GCC, it is possible to get an internal
        compiler error if optimization is used.  This was reported for
        GCC 2.7.2.3 on selectmodule.c.  Manually compile the affected
        file without optimization to solve the problem.

DEC Ultrix: compile with GCC to avoid bugs in the native compiler,
        and pass SHELL=/bin/sh5 to Make when installing.

AIX:    A complete overhaul of the shared library support is now in
        place.  See Misc/AIX-NOTES for some notes on how it's done.
        (The optimizer bug reported at this place in previous releases
        has been worked around by a minimal code change.) If you get
        errors about pthread_* functions, during compile or during
        testing, try setting CC to a thread-safe (reentrant) compiler,
        like "cc_r".  For full C++ module support, set CC="xlC_r" (or
        CC="xlC" without thread support).

AIX 5.3: To build a 64-bit version with IBM's compiler, I used the
        following:

        export PATH=/usr/bin:/usr/vacpp/bin
        ./configure --with-gcc="xlc_r -q64" --with-cxx="xlC_r -q64" \
                    --disable-ipv6 AR="ar -X64"
        make

HP-UX:  When using threading, you may have to add -D_REENTRANT to the
        OPT variable in the top-level Makefile; reported by Pat Knight,
        this seems to make a difference (at least for HP-UX 10.20)
        even though pyconfig.h defines it. This seems unnecessary when
        using HP/UX 11 and later - threading seems to work "out of the
        box".

HP-UX ia64: When building on the ia64 (Itanium) platform using HP's
        compiler, some experience has shown that the compiler's
        optimiser produces a completely broken version of python
        (see http://bugs.python.org/814976). To work around this,
        edit the Makefile and remove -O from the OPT line.

        To build a 64-bit executable on an Itanium 2 system using HP's
        compiler, use these environment variables:

                CC=cc
                CXX=aCC
                BASECFLAGS="+DD64"
                LDFLAGS="+DD64 -lxnet"

        and call configure as:

                ./configure --without-gcc

        then *unset* the environment variables again before running
        make.  (At least one of these flags causes the build to fail
        if it remains set.)  You still have to edit the Makefile and
        remove -O from the OPT line.

HP PA-RISC 2.0: A recent bug report (http://bugs.python.org/546117)
        suggests that the C compiler in this 64-bit system has bugs
        in the optimizer that break Python.  Compiling without
        optimization solves the problems.

SCO:    The following apply to SCO 3 only; Python builds out of the box
        on SCO 5 (or so we've heard).

        1) Everything works much better if you add -U__STDC__ to the
        defs.  This is because all the SCO header files are broken.
        Anything that isn't mentioned in the C standard is
        conditionally excluded when __STDC__ is defined.

        2) Due to the U.S. export restrictions, SCO broke the crypt
        stuff out into a separate library, libcrypt_i.a so the LIBS
        needed be set to:

                LIBS=' -lsocket -lcrypt_i'

UnixWare: There are known bugs in the math library of the system, as well as
        problems in the handling of threads (calling fork in one
        thread may interrupt system calls in others). Therefore, test_math and
        tests involving threads will fail until those problems are fixed.

QNX:    Chris Herborth (chrish@qnx.com) writes:
        configure works best if you use GNU bash; a port is available on
        ftp.qnx.com in /usr/free.  I used the following process to build,
        test and install Python 1.5.x under QNX:

        1) CONFIG_SHELL=/usr/local/bin/bash CC=cc RANLIB=: \
            ./configure --verbose --without-gcc --with-libm=""

        2) edit Modules/Setup to activate everything that makes sense for
           your system... tested here at QNX with the following modules:

                array, audioop, binascii, cPickle, cStringIO, cmath,
                crypt, curses, errno, fcntl, gdbm, grp, imageop,
                _locale, math, md5, new, operator, parser, pcre,
                posix, pwd, readline, regex, reop,
                select, signal, socket, soundex, strop, struct,
                syslog, termios, time, timing, zlib, audioop, imageop

        3) make SHELL=/usr/local/bin/bash

           or, if you feel the need for speed:

           make SHELL=/usr/local/bin/bash OPT="-5 -Oil+nrt"

        4) make SHELL=/usr/local/bin/bash test

           Using GNU readline 2.2 seems to behave strangely, but I
           think that's a problem with my readline 2.2 port.  :-\

        5) make SHELL=/usr/local/bin/bash install

        If you get SIGSEGVs while running Python (I haven't yet, but
        I've only run small programs and the test cases), you're
        probably running out of stack; the default 32k could be a
        little tight.  To increase the stack size, edit the Makefile
        to read: LDFLAGS = -N 48k

BeOS:   See Misc/BeOS-NOTES for notes about compiling/installing
        Python on BeOS R3 or later.  Note that only the PowerPC
        platform is supported for R3; both PowerPC and x86 are
        supported for R4.

Cray T3E: Mark Hadfield (m.hadfield@niwa.co.nz) writes:
        Python can be built satisfactorily on a Cray T3E but based on
        my experience with the NIWA T3E (2002-05-22, version 2.2.1)
        there are a few bugs and gotchas. For more information see a
        thread on comp.lang.python in May 2002 entitled "Building
        Python on Cray T3E".

        1) Use Cray's cc and not gcc. The latter was reported not to
           work by Konrad Hinsen. It may work now, but it may not.

        2) To set sys.platform to something sensible, pass the
           following environment variable to the configure script:

             MACHDEP=unicosmk

        2) Run configure with option "--enable-unicode=ucs4".

        3) The Cray T3E does not support dynamic linking, so extension
           modules have to be built by adding (or uncommenting) lines
           in Modules/Setup. The minimum set of modules is

             posix, new, _sre, unicodedata

           On NIWA's vanilla T3E system the following have also been
           included successfully:

             _codecs, _locale, _socket, _symtable, _testcapi, _weakref
             array, binascii, cmath, cPickle, crypt, cStringIO, dbm
             errno, fcntl, grp, math, md5, operator, parser, pcre, pwd
             regex, rotor, select, struct, strop, syslog, termios
             time, timing, xreadlines

        4) Once the python executable and library have been built, make
           will execute setup.py, which will attempt to build remaining
           extensions and link them dynamically. Each of these attempts
           will fail but should not halt the make process. This is
           normal.

        5) Running "make test" uses a lot of resources and causes
           problems on our system. You might want to try running tests
           singly or in small groups.

SGI:    SGI's standard "make" utility (/bin/make or /usr/bin/make)
        does not check whether a command actually changed the file it
        is supposed to build.  This means that whenever you say "make"
        it will redo the link step.  The remedy is to use SGI's much
        smarter "smake" utility (/usr/sbin/smake), or GNU make.  If
        you set the first line of the Makefile to #!/usr/sbin/smake
        smake will be invoked by make (likewise for GNU make).

        WARNING: There are bugs in the optimizer of some versions of
        SGI's compilers that can cause bus errors or other strange
        behavior, especially on numerical operations.  To avoid this,
        try building with "make OPT=".

OS/2:   If you are running Warp3 or Warp4 and have IBM's VisualAge C/C++
        compiler installed, just change into the pc\os2vacpp directory
        and type NMAKE.  Threading and sockets are supported by default
        in the resulting binaries of PYTHON15.DLL and PYTHON.EXE.

Reliant UNIX: The thread support does not compile on Reliant UNIX, and
        there is a (minor) problem in the configure script for that
        platform as well.  This should be resolved in time for a
        future release.

macOS:  Building a complete Python installation requires the use of various
        additional third-party libraries, depending on your build platform and
        configure options.  Not all standard library modules are buildable or
        useable on all platforms.  Refer to the "Install Dependencies" section
        section of the "Developer Guide" for current detailed information on
        dependencies for macOS:
            https://devguide.python.org/setup/#install-dependencies

        On macOS, there are additional configure and build options related
        to macOS framework and universal builds.  Refer to Mac/README.rst.

        The tests will crash on both 10.1 and 10.2 with SEGV in
        test_re and test_sre due to the small default stack size.  If
        you set the stack size to 2048 before doing a "make test" the
        failure can be avoided.  If you're using the tcsh or csh shells,
        use "limit stacksize 2048" and for the bash shell (the default
        as of macOS 10.3), use "ulimit -s 2048".

        On naked Darwin you may want to add the configure option
        "--disable-toolbox-glue" to disable the glue code for the Carbon
        interface modules. The modules themselves are currently only built
        if you add the --enable-framework option, see below.

        On a clean macOS /usr/local does not exist. Do a
        "sudo mkdir -m 775 /usr/local"
        before you do a make install. It is probably not a good idea to
        do "sudo make install" which installs everything as superuser,
        as this may later cause problems when installing distutils-based
        additions.

        Some people have reported problems building Python after using "fink"
        to install additional unix software. Disabling fink (remove all 
        references to /sw from your .profile or .login) should solve this.

Cygwin: With recent (relative to the time of writing, 2001-12-19)
        Cygwin installations, there are problems with the interaction
        of dynamic linking and fork().  This manifests itself in build
        failures during the execution of setup.py.

        There are two workarounds that both enable Python (albeit
        without threading support) to build and pass all tests on
        NT/2000 (and most likely XP as well, though reports of testing
        on XP would be appreciated).

        The workarounds:

        (a) the band-aid fix is to link the _socket module statically
        rather than dynamically (which is the default).

        To do this, run "./configure --with-threads=no" including any
        other options you need (--prefix, etc.).  Then in Modules/Setup
        uncomment the lines:

        #SSL=/usr/local/ssl
        #_socket socketmodule.c \
        #       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        #       -L$(SSL)/lib -lssl -lcrypto

        and remove "local/" from the SSL variable.  Finally, just run
        "make"!

        (b) The "proper" fix is to rebase the Cygwin DLLs to prevent
        base address conflicts.  Details on how to do this can be
        found in the following mail:

           http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html

        It is hoped that a version of this solution will be
        incorporated into the Cygwin distribution fairly soon.

        Two additional problems:

        (1) Threading support should still be disabled due to a known
        bug in Cygwin pthreads that causes test_threadedtempfile to
        hang.

        (2) The _curses module does not build.  This is a known
        Cygwin ncurses problem that should be resolved the next time
        that this package is released.

        On older versions of Cygwin, test_poll may hang and test_strftime
        may fail.

        The situation on 9X/Me is not accurately known at present.
        Some time ago, there were reports that the following
        regression tests failed:

            test_pwd
            test_select (hang)
            test_socket

        Due to the test_select hang on 9X/Me, one should run the
        regression test using the following:

            make TESTOPTS='-l -x test_select' test

        News regarding these platforms with more recent Cygwin
        versions would be appreciated!

Windows: When executing Python scripts on the command line using file type
        associations (i.e. starting "script.py" instead of "python script.py"),
        redirects may not work unless you set a specific registry key.  See
        the Knowledge Base article <http://support.microsoft.com/kb/321788>.


Configuring the bsddb and dbm modules
-------------------------------------

Beginning with Python version 2.3, the PyBsddb package
<http://pybsddb.sf.net/> was adopted into Python as the bsddb package,
exposing a set of package-level functions which provide
backwards-compatible behavior.  Only versions 3.3 through 4.4 of
Sleepycat's libraries provide the necessary API, so older versions
aren't supported through this interface.  The old bsddb module has
been retained as bsddb185, though it is not built by default.  Users
wishing to use it will have to tweak Modules/Setup to build it.  The
dbm module will still be built against the Sleepycat libraries if
other preferred alternatives (ndbm, gdbm) are not found.

Building the sqlite3 module
---------------------------

To build the sqlite3 module, you'll need the sqlite3 or libsqlite3
packages installed, including the header files. Many modern operating
systems distribute the headers in a separate package to the library -
often it will be the same name as the main package, but with a -dev or
-devel suffix. 

The version of pysqlite2 that's including in Python needs sqlite3 3.0.8
or later. setup.py attempts to check that it can find a correct version.

Configuring threads
-------------------

As of Python 2.0, threads are enabled by default.  If you wish to
compile without threads, or if your thread support is broken, pass the
--with-threads=no switch to configure.  Unfortunately, on some
platforms, additional compiler and/or linker options are required for
threads to work properly.  Below is a table of those options,
collected by Bill Janssen.  We would love to automate this process
more, but the information below is not enough to write a patch for the
configure.ac file, so manual intervention is required.  If you patch
the configure.ac file and are confident that the patch works, please
send in the patch.  (Don't bother patching the configure script itself
-- it is regenerated each time the configure.ac file changes.)

Compiler switches for threads
.............................

The definition of _REENTRANT should be configured automatically, if
that does not work on your system, or if _REENTRANT is defined
incorrectly, please report that as a bug.

    OS/Compiler/threads                     Switches for use with threads
    (POSIX is draft 10, DCE is draft 4)     compile & link

    SunOS 5.{1-5}/{gcc,SunPro cc}/solaris   -mt
    SunOS 5.5/{gcc,SunPro cc}/POSIX         (nothing)
    DEC OSF/1 3.x/cc/DCE                    -threads
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/cc/DCE                 -threads
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/cc/POSIX               -pthread
            (butenhof@zko.dec.com)
    AIX 4.1.4/cc_r/d7                       (nothing)
            (buhrt@iquest.net)
    AIX 4.1.4/cc_r4/DCE                     (nothing)
            (buhrt@iquest.net)
    IRIX 6.2/cc/POSIX                       (nothing)
            (robertl@cwi.nl)


Linker (ld) libraries and flags for threads
...........................................

    OS/threads                          Libraries/switches for use with threads

    SunOS 5.{1-5}/solaris               -lthread
    SunOS 5.5/POSIX                     -lpthread
    DEC OSF/1 3.x/DCE                   -lpthreads -lmach -lc_r -lc
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/DCE                -lpthreads -lpthread -lmach -lexc -lc
            (butenhof@zko.dec.com)
    Digital UNIX 4.x/POSIX              -lpthread -lmach -lexc -lc
            (butenhof@zko.dec.com)
    AIX 4.1.4/{draft7,DCE}              (nothing)
            (buhrt@iquest.net)
    IRIX 6.2/POSIX                      -lpthread
            (jph@emilia.engr.sgi.com)


Building a shared libpython
---------------------------

Starting with Python 2.3, the majority of the interpreter can be built
into a shared library, which can then be used by the interpreter
executable, and by applications embedding Python. To enable this feature,
configure with --enable-shared.

If you enable this feature, the same object files will be used to create
a static library.  In particular, the static library will contain object
files using position-independent code (PIC) on platforms where PIC flags
are needed for the shared library.


Configuring additional built-in modules
---------------------------------------

Starting with Python 2.1, the setup.py script at the top of the source
distribution attempts to detect which modules can be built and
automatically compiles them.  Autodetection doesn't always work, so
you can still customize the configuration by editing the Modules/Setup
file; but this should be considered a last resort.  The rest of this
section only applies if you decide to edit the Modules/Setup file.
You also need this to enable static linking of certain modules (which
is needed to enable profiling on some systems).

This file is initially copied from Setup.dist by the configure script;
if it does not exist yet, create it by copying Modules/Setup.dist
yourself (configure will never overwrite it).  Never edit Setup.dist
-- always edit Setup or Setup.local (see below).  Read the comments in
the file for information on what kind of edits are allowed.  When you
have edited Setup in the Modules directory, the interpreter will
automatically be rebuilt the next time you run make (in the toplevel
directory).

Many useful modules can be built on any Unix system, but some optional
modules can't be reliably autodetected.  Often the quickest way to
determine whether a particular module works or not is to see if it
will build: enable it in Setup, then if you get compilation or link
errors, disable it -- you're either missing support or need to adjust
the compilation and linking parameters for that module.

On SGI IRIX, there are modules that interface to many SGI specific
system libraries, e.g. the GL library and the audio hardware.  These
modules will not be built by the setup.py script.

In addition to the file Setup, you can also edit the file Setup.local.
(the makesetup script processes both).  You may find it more
convenient to edit Setup.local and leave Setup alone.  Then, when
installing a new Python version, you can copy your old Setup.local
file.


Setting the optimization/debugging options
------------------------------------------

If you want or need to change the optimization/debugging options for
the C compiler, assign to the OPT variable on the toplevel make
command; e.g. "make OPT=-g" will build a debugging version of Python
on most platforms.  The default is OPT=-O; a value for OPT in the
environment when the configure script is run overrides this default
(likewise for CC; and the initial value for LIBS is used as the base
set of libraries to link with).

When compiling with GCC, the default value of OPT will also include
the -Wall and -Wstrict-prototypes options.

Additional debugging code to help debug memory management problems can
be enabled by using the --with-pydebug option to the configure script.

For flags that change binary compatibility, use the EXTRA_CFLAGS
variable.


Profiling
---------

If you want C profiling turned on, the easiest way is to run configure
with the CC environment variable to the necessary compiler
invocation.  For example, on Linux, this works for profiling using
gprof(1):

    CC="gcc -pg" ./configure

Note that on Linux, gprof apparently does not work for shared
libraries.  The Makefile/Setup mechanism can be used to compile and
link most extension modules statically.


Coverage checking
-----------------

For C coverage checking using gcov, run "make coverage".  This will
build a Python binary with profiling activated, and a ".gcno" and
".gcda" file for every source file compiled with that option.  With
the built binary, now run the code whose coverage you want to check.
Then, you can see coverage statistics for each individual source file
by running gcov, e.g.

    gcov -o Modules zlibmodule

This will create a "zlibmodule.c.gcov" file in the current directory
containing coverage info for that source file.

This works only for source files statically compiled into the
executable; use the Makefile/Setup mechanism to compile and link
extension modules you want to coverage-check statically.


Testing
-------

To test the interpreter, type "make test" in the top-level directory.
This runs the test set twice (once with no compiled files, once with
the compiled files left by the previous test run).  The test set
produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.
If a message is printed about a failed test or a traceback or core
dump is produced, something is wrong.  On some Linux systems (those
that are not yet using glibc 6), test_strftime fails due to a
non-standard implementation of strftime() in the C library. Please
ignore this, or upgrade to glibc version 6.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run "make testall".

IMPORTANT: If the tests fail and you decide to mail a bug report,
*don't* include the output of "make test".  It is useless.  Run the
failing test manually, as follows:

        ./python Lib/test/regrtest.py -v test_whatever

(substituting the top of the source tree for '.' if you built in a
different directory).  This runs the test in verbose mode.


Installing
----------

To install the Python binary, library modules, shared library modules
(see below), include files, configuration files, and the manual page,
just type

        make install

This will install all platform-independent files in subdirectories of
the directory given with the --prefix option to configure or to the
`prefix' Make variable (default /usr/local).  All binary and other
platform-specific files will be installed in subdirectories if the
directory given by --exec-prefix or the `exec_prefix' Make variable
(defaults to the --prefix directory) is given.

If DESTDIR is set, it will be taken as the root directory of the
installation, and files will be installed into $(DESTDIR)$(prefix),
$(DESTDIR)$(exec_prefix), etc.

All subdirectories created will have Python's version number in their
name, e.g. the library modules are installed in
"/usr/local/lib/python<version>/" by default, where <version> is the
<major>.<minor> release number (e.g. "2.1").  The Python binary is
installed as "python<version>" and a hard link named "python" is
created.  The only file not installed with a version number in its
name is the manual page, installed as "/usr/local/man/man1/python.1"
by default.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".

The only thing you may have to install manually is the Python mode for
Emacs found in Misc/python-mode.el.  (But then again, more recent
versions of Emacs may already have it.)  Follow the instructions that
came with Emacs for installation of site-specific files.


Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (--prefix argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using "make altinstall" contain the major and minor
version and can thus live side-by-side.  "make install" also creates
${prefix}/bin/python which refers to ${prefix}/bin/pythonX.Y.  If you intend
to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using
"make install".  Install all other versions using "make altinstall".

For example, if you want to install Python 2.5, 2.6 and 3.0 with 2.6 being
the primary version, you would execute "make install" in your 2.6 build
directory and "make altinstall" in the others.


Configuration options and variables
-----------------------------------

Some special cases are handled by passing options to the configure
script.

WARNING: if you rerun the configure script with different options, you
must run "make clean" before rebuilding.  Exceptions to this rule:
after changing --prefix or --exec-prefix, all you need to do is remove
Modules/getpath.o.

--with(out)-gcc: The configure script uses gcc (the GNU C compiler) if
        it finds it.  If you don't want this, or if this compiler is
        installed but broken on your platform, pass the option
        --without-gcc.  You can also pass "CC=cc" (or whatever the
        name of the proper C compiler is) in the environment, but the
        advantage of using --without-gcc is that this option is
        remembered by the config.status script for its --recheck
        option.

--prefix, --exec-prefix: If you want to install the binaries and the
        Python library somewhere else than in /usr/local/{bin,lib},
        you can pass the option --prefix=DIRECTORY; the interpreter
        binary will be installed as DIRECTORY/bin/python and the
        library files as DIRECTORY/lib/python/*.  If you pass
        --exec-prefix=DIRECTORY (as well) this overrides the
        installation prefix for architecture-dependent files (like the
        interpreter binary).  Note that --prefix=DIRECTORY also
        affects the default module search path (sys.path), when
        Modules/config.c is compiled.  Passing make the option
        prefix=DIRECTORY (and/or exec_prefix=DIRECTORY) overrides the
        prefix set at configuration time; this may be more convenient
        than re-running the configure script if you change your mind
        about the install prefix.

--with-readline: This option is no longer supported.  GNU
        readline is automatically enabled by setup.py when present.

--with-threads: On most Unix systems, you can now use multiple
        threads, and support for this is enabled by default.  To
        disable this, pass --with-threads=no.  If the library required
        for threads lives in a peculiar place, you can use
        --with-thread=DIRECTORY.  IMPORTANT: run "make clean" after
        changing (either enabling or disabling) this option, or you
        will get link errors!  Note: for DEC Unix use
        --with-dec-threads instead.

--with-sgi-dl: On SGI IRIX 4, dynamic loading of extension modules is
        supported by the "dl" library by Jack Jansen, which is
        ftp'able from ftp://ftp.cwi.nl/pub/dynload/dl-1.6.tar.Z.
        This is enabled (after you've ftp'ed and compiled the dl
        library) by passing --with-sgi-dl=DIRECTORY where DIRECTORY
        is the absolute pathname of the dl library.  (Don't bother on
        IRIX 5, it already has dynamic linking using SunOS style
        shared libraries.)  THIS OPTION IS UNSUPPORTED.

--with-dl-dld: Dynamic loading of modules is rumored to be supported
        on some other systems: VAX (Ultrix), Sun3 (SunOS 3.4), Sequent
        Symmetry (Dynix), and Atari ST.  This is done using a
        combination of the GNU dynamic loading package
        (ftp://ftp.cwi.nl/pub/dynload/dl-dld-1.1.tar.Z) and an
        emulation of the SGI dl library mentioned above (the emulation
        can be found at
        ftp://ftp.cwi.nl/pub/dynload/dld-3.2.3.tar.Z).  To
        enable this, ftp and compile both libraries, then call
        configure, passing it the option
        --with-dl-dld=DL_DIRECTORY,DLD_DIRECTORY where DL_DIRECTORY is
        the absolute pathname of the dl emulation library and
        DLD_DIRECTORY is the absolute pathname of the GNU dld library.
        (Don't bother on SunOS 4 or 5, they already have dynamic
        linking using shared libraries.)  THIS OPTION IS UNSUPPORTED.

--with-libm, --with-libc: It is possible to specify alternative
        versions for the Math library (default -lm) and the C library
        (default the empty string) using the options
        --with-libm=STRING and --with-libc=STRING, respectively.  For
        example, if your system requires that you pass -lc_s to the C
        compiler to use the shared C library, you can pass
        --with-libc=-lc_s. These libraries are passed after all other
        libraries, the C library last.

--with-libs='libs': Add 'libs' to the LIBS that the python interpreter
        is linked against.

--with-cxx-main=<compiler>: If you plan to use C++ extension modules,
        then -- on some platforms -- you need to compile python's main()
        function with the C++ compiler. With this option, make will use
        <compiler> to compile main() *and* to link the python executable.
        It is likely that the resulting executable depends on the C++
        runtime library of <compiler>. (The default is --without-cxx-main.)

        There are platforms that do not require you to build Python
        with a C++ compiler in order to use C++ extension modules.
        E.g., x86 Linux with ELF shared binaries and GCC 3.x, 4.x is such
        a platform. We recommend that you configure Python
        --without-cxx-main on those platforms because a mismatch
        between the C++ compiler version used to build Python and to
        build a C++ extension module is likely to cause a crash at
        runtime.

        The Python installation also stores the variable CXX that
        determines, e.g., the C++ compiler distutils calls by default
        to build C++ extensions. If you set CXX on the configure command
        line to any string of non-zero length, then configure won't
        change CXX. If you do not preset CXX but pass
        --with-cxx-main=<compiler>, then configure sets CXX=<compiler>.
        In all other cases, configure looks for a C++ compiler by
        some common names (c++, g++, gcc, CC, cxx, cc++, cl) and sets
        CXX to the first compiler it finds. If it does not find any
        C++ compiler, then it sets CXX="".

        Similarly, if you want to change the command used to link the
        python executable, then set LINKCC on the configure command line.


--with-pydebug:  Enable additional debugging code to help track down
        memory management problems.  This allows printing a list of all
        live objects when the interpreter terminates.

--with(out)-universal-newlines: enable reading of text files with
        foreign newline convention (default: enabled). In other words,
        any of \r, \n or \r\n is acceptable as end-of-line character.
        If enabled import and execfile will automatically accept any newline
        in files. Python code can open a file with open(file, 'U') to
        read it in universal newline mode. THIS OPTION IS UNSUPPORTED.

--with-tsc: Profile using the Pentium timestamping counter (TSC).

--with-system-ffi:  Build the _ctypes extension module using an ffi
        library installed on the system.

--with-dbmliborder=db1:db2:...:  Specify the order that backends for the
	dbm extension are checked. Valid value is a colon separated string
	with the backend names `ndbm', `gdbm' and `bdb'.

Building for multiple architectures (using the VPATH feature)
-------------------------------------------------------------

If your file system is shared between multiple architectures, it
usually is not necessary to make copies of the sources for each
architecture you want to support.  If the make program supports the
VPATH feature, you can create an empty build directory for each
architecture, and in each directory run the configure script (on the
appropriate machine with the appropriate options).  This creates the
necessary subdirectories and the Makefiles therein.  The Makefiles
contain a line VPATH=... which points to a directory containing the
actual sources.  (On SGI systems, use "smake -J1" instead of "make" if
you use VPATH -- don't try gnumake.)

For example, the following is all you need to build a minimal Python
in /usr/tmp/python (assuming ~guido/src/python is the toplevel
directory and you want to build in /usr/tmp/python):

        $ mkdir /usr/tmp/python
        $ cd /usr/tmp/python
        $ ~guido/src/python/configure
        [...]
        $ make
        [...]
        $

Note that configure copies the original Setup file to the build
directory if it finds no Setup file there.  This means that you can
edit the Setup file for each architecture independently.  For this
reason, subsequent changes to the original Setup file are not tracked
automatically, as they might overwrite local changes.  To force a copy
of a changed original Setup file, delete the target Setup file.  (The
makesetup script supports multiple input files, so if you want to be
fancy you can change the rules to create an empty Setup.local if it
doesn't exist and run it with arguments $(srcdir)/Setup Setup.local;
however this assumes that you only need to add modules.)

Also note that you can't use a workspace for VPATH and non VPATH builds. The
object files left behind by one version confuses the other.


Building on non-UNIX systems
----------------------------

For Windows (2000/NT/ME/98/95), assuming you have MS VC++ 7.1, the
project files are in PCbuild, the workspace is pcbuild.dsw.  See
PCbuild\readme.txt for detailed instructions.

For other non-Unix Windows compilers, in particular MS VC++ 6.0 and
for OS/2, enter the directory "PC" and read the file "readme.txt".

For the Mac, a separate source distribution will be made available,
for use with the CodeWarrior compiler.  If you are interested in Mac
development, join the PythonMac Special Interest Group
(http://www.python.org/sigs/pythonmac-sig/, or send email to
pythonmac-sig-request@python.org).

Of course, there are also binary distributions available for these
platforms -- see http://www.python.org/.

To port Python to a new non-UNIX system, you will have to fake the
effect of running the configure script manually (for Mac and PC, this
has already been done for you).  A good start is to copy the file
pyconfig.h.in to pyconfig.h and edit the latter to reflect the actual
configuration of your system.  Most symbols must simply be defined as
1 only if the corresponding feature is present and can be left alone
otherwise; however the *_t type symbols must be defined as some
variant of int if they need to be defined at all.

For all platforms, it's important that the build arrange to define the
preprocessor symbol NDEBUG on the compiler command line in a release
build of Python (else assert() calls remain in the code, hurting
release-build performance).  The Unix, Windows and Mac builds already
do this.


Miscellaneous issues
====================

Emacs mode
----------

There's an excellent Emacs editing mode for Python code; see the file
Misc/python-mode.el.  Originally written by the famous Tim Peters, it is now
maintained by the equally famous Barry Warsaw.  The latest version, along with
various other contributed Python-related Emacs goodies, is online at
http://launchpad.net/python-mode/.


Tkinter
-------

The setup.py script automatically configures this when it detects a
usable Tcl/Tk installation.  This requires Tcl/Tk version 8.0 or
higher.

For more Tkinter information, see the Tkinter Resource page:
http://www.python.org/topics/tkinter/

There are demos in the Demo/tkinter directory.

Note that there's a Python module called "Tkinter" (capital T) which
lives in Lib/lib-tk/Tkinter.py, and a C module called "_tkinter"
(lower case t and leading underscore) which lives in
Modules/_tkinter.c.  Demos and normal Tk applications import only the
Python Tkinter module -- only the latter imports the C _tkinter
module.  In order to find the C _tkinter module, it must be compiled
and linked into the Python interpreter -- the setup.py script does
this.  In order to find the Python Tkinter module, sys.path must be
set correctly -- normal installation takes care of this.


Distribution structure
----------------------

Most subdirectories have their own README files.  Most files have
comments.

Demo/           Demonstration scripts, modules and programs
Doc/            Documentation sources (reStructuredText)
Grammar/        Input for the parser generator
Include/        Public header files
LICENSE         Licensing information
Lib/            Python library modules
Mac/            Macintosh specific resources
Makefile.pre.in Source from which config.status creates the Makefile.pre
Misc/           Miscellaneous useful files
Modules/        Implementation of most built-in modules
Objects/        Implementation of most built-in object types
PC/             Files specific to PC ports (DOS, Windows, OS/2)
PCbuild/        Build directory for Microsoft Visual C++
Parser/         The parser and tokenizer and their input handling
Python/         The byte-compiler and interpreter
README          The file you're reading now
RISCOS/         Files specific to RISC OS port
Tools/          Some useful programs written in Python
pyconfig.h.in   Source from which pyconfig.h is created (GNU autoheader output)
configure       Configuration shell script (GNU autoconf output)
configure.ac    Configuration specification (input for GNU autoconf)
install-sh      Shell script used to install files
setup.py        Python script used to build extension modules

The following files will (may) be created in the toplevel directory by
the configuration and build processes:

Makefile        Build rules
Makefile.pre    Build rules before running Modules/makesetup
buildno         Keeps track of the build number
config.cache    Cache of configuration variables
pyconfig.h      Configuration header
config.log      Log from last configure run
config.status   Status from last run of the configure script
getbuildinfo.o  Object file from Modules/getbuildinfo.c
libpython<version>.a    The library archive
python          The executable interpreter
reflog.txt      Output from running the regression suite with the -R flag 
tags, TAGS      Tags files for vi and Emacs


That's all, folks!
------------------


--Guido van Rossum (home page: http://www.python.org/~guido/)
licenses/alt-python27/LICENSE000064400000030747151730177410011647 0ustar00A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
licenses/alt-python27-pip/LICENSE.txt000064400000002102151730177420013234 0ustar00Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)

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

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

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

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
bash-completion/completions/pip2000064400000000444151730177420012772 0ustar00
# pip bash completion start
_pip2_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
}
complete -o default -F _pip2_completion pip pip{,-}{2,2.7}}
# pip bash completion end

man/man1/xml2-config.1000064400000002351151730335120010363 0ustar00.TH xml2-config 1 "3 April 2022" Version 1.2.0
.SH NAME
xml2-config - script to get information about the installed version of libxml2
.SH SYNOPSIS
.B xml2-config
[\-\-prefix\fI[=DIR]\fP] [\-\-libs] [\-\-cflags] [\-\-version] [\-\-help]
.SH DESCRIPTION
\fIxml2-config\fP is a tool that is used to determine the compile and
linker flags that should be used to compile and link programs that use
\fIlibxml2\fP.
.SH OPTIONS
\fIxml2-config\fP accepts the following options:
.TP 8
.B  \-\-version
Print the currently installed version of \fIlibxml2\fP on the standard output.
.TP 8
.B  \-\-libs
Print the linker flags that are necessary to link a \fIlibxml2\fP program.
Add \-\-dynamic after \-\-libs to print only shared library linking
information.
.TP 8
.B  \-\-cflags
Print the compiler flags that are necessary to compile a \fIlibxml2\fP program.
.TP 8
.B  \-\-prefix=PREFIX
If specified, use PREFIX instead of the installation prefix that
\fIlibxml2\fP was built with when computing the output for the
\-\-cflags and \-\-libs options. This option must be specified before
any \-\-libs or \-\-cflags options.
.SH AUTHOR
This manual page was written by Fredrik Hallenberg <hallon@lysator.liu.se>,
for the Debian GNU/linux system (but may be used by others).
man/man1/xmlcatalog.1000064400000020521151730335120010370 0ustar00'\" t
.\"     Title: xmlcatalog
.\"    Author: John Fleck <jfleck@inkstain.net>
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
.\"      Date: 08/17/2022
.\"    Manual: xmlcatalog Manual
.\"    Source: libxml2
.\"  Language: English
.\"
.TH "XMLCATALOG" "1" "08/17/2022" "libxml2" "xmlcatalog Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
xmlcatalog \- Command line tool to parse and manipulate XML or SGML catalog files\&.
.SH "SYNOPSIS"
.HP \w'\fBxmlcatalog\fR\ 'u
\fBxmlcatalog\fR [\fB\-\-sgml\fR | \fB\-\-shell\fR | \fB\-\-create\fR | \fB\-\-del\ \fR\fB\fIVALUE(S)\fR\fR | [\ \fB\-\-add\ \fR\fB\fITYPE\fR\fR\fB\ \fR\fB\fIORIG\fR\fR\fB\ \fR\fB\fIREPLACE\fR\fR\fB\ \fR\ |\ \fB\-\-add\ \fR\fB\fIFILENAME\fR\fR] | \fB\-\-noout\fR | \fB\-\-no\-super\-update\fR | [\fB\-v\fR\ |\ \fB\-\-verbose\fR]] {\fICATALOGFILE\fR} {\fIENTITIES\fR...}
.SH "DESCRIPTION"
.PP
\fBxmlcatalog\fR
is a command line application allowing users to monitor and manipulate
XML
and
SGML
catalogs\&. It is included in
\fBlibxml\fR(3)\&.
.PP
Its functions can be invoked from a single command from the command line, or it can perform multiple functions in interactive mode\&. It can operate on both
XML
and
SGML
files\&.
.SH "OPTIONS"
.PP
\fBxmlcatalog\fR
accepts the following options (in alphabetical order):
.PP
\fB\-\-add \fR\fB\fITYPE\fR\fR\fB \fR\fB\fIORIG\fR\fR\fB \fR\fB\fIREPLACE\fR\fR\fB \fR
.RS 4
Add an entry to
CATALOGFILE\&.
\fITYPE\fR
indicates the type of entry\&. Possible types are:
\fIpublic\fR, \fIsystem\fR, \fIuri\fR, \fIrewriteSystem\fR, \fIrewriteURI\fR, \fIdelegatePublic\fR, \fIdelegateSystem\fR, \fIdelegateURI\fR, \fInextCatalog\fR\&.
\fIORIG\fR
is the original reference to be replaced, and
\fIREPLACE\fR
is the
URI
of the replacement entity to be used\&. The
\fB\-\-add\fR
option will not overwrite
CATALOGFILE, outputting to
stdout, unless
\fB\-\-noout\fR
is used\&. The
\fB\-\-add\fR
will always take three parameters even if some of the
XML
catalog constructs will have only a single argument\&.
.RE
.PP
\fB\-\-add \fR\fB\fIFILENAME\fR\fR
.RS 4
If the
\fB\-\-add\fR
option is used following the
\fB\-\-sgml\fR
option, only a single argument, a
\fIFILENAME\fR, is used\&. This is used to add the name of a catalog file to an
SGML
supercatalog, a file that contains references to other included
SGML
catalog files\&.
.RE
.PP
\fB\-\-create\fR
.RS 4
Create a new
XML
catalog\&. Outputs to
stdout, ignoring
\fIfilename\fR
unless
\fB\-\-noout\fR
is used, in which case it creates a new catalog file
\fIfilename\fR\&.
.RE
.PP
\fB\-\-del \fR\fB\fIVALUE(S)\fR\fR
.RS 4
Remove entries from
\fICATALOGFILE\fR
matching
\fIVALUE(S)\fR\&. The
\fB\-\-del\fR
option will not overwrite
\fICATALOGFILE\fR, outputting to
stdout, unless
\fB\-\-noout\fR
is used\&.
.RE
.PP
\fB\-\-noout\fR
.RS 4
Save output to the named file rather than outputting to
stdout\&.
.RE
.PP
\fB\-\-no\-super\-update\fR
.RS 4
Do not update the
SGML
super catalog\&.
.RE
.PP
\fB\-\-shell\fR
.RS 4
Run a shell allowing interactive queries on catalog file
\fICATALOGFILE\fR\&. For the set of available commands see
the section called \(lqSHELL COMMANDS\(rq\&.
.RE
.PP
\fB\-\-sgml\fR
.RS 4
Uses
SGML
super catalogs for
\fB\-\-add\fR
and
\fB\-\-del\fR
options\&.
.RE
.PP
\fB\-v\fR, \fB\-\-verbose\fR
.RS 4
Output debugging information\&.
.RE
.PP
Invoking
\fBxmlcatalog\fR
non\-interactively without a designated action (imposed with options like
\fB\-\-add\fR) will result in a lookup of the catalog entry for
\fIENTITIES\fR
in the catalog denoted with
\fICATALOGFILE\fR\&. The corresponding entries will be output to the command line\&. This mode of operation, together with
\fB\-\-shell\fR
mode and non\-modifying (i\&.e\&. without
\fB\-\-noout\fR) direct actions, allows for a special shortcut of the void
\fICATALOGFILE\fR
specification (possibly expressed as "" in the shell environment) appointing the default system catalog\&. That simplifies the handling when its exact location is irrelevant but the respective built\-in still needs to be consulted\&.
.SH "SHELL COMMANDS"
.PP
Invoking
\fBxmlcatalog\fR
with the
\fB\-\-shell \fR\fB\fICATALOGFILE\fR\fR
option opens a command line shell allowing interactive access to the catalog file identified by
\fICATALOGFILE\fR\&. Invoking the shell provides a command line prompt after which the following commands (described in alphabetical order) can be entered\&.
.PP
\fBadd \fR\fB\fITYPE\fR\fR\fB \fR\fB\fIORIG\fR\fR\fB \fR\fB\fIREPLACE\fR\fR\fB \fR
.RS 4
Add an entry to the catalog file\&.
\fITYPE\fR
indicates the type of entry\&. Possible types are:
\fIpublic\fR, \fIsystem\fR, \fIuri\fR, \fIrewriteSystem\fR, \fIrewriteURI\fR, \fIdelegatePublic\fR, \fIdelegateSystem\fR, \fIdelegateURI\fR, \fInextCatalog\fR\&.
\fIORIG\fR
is the original reference to be replaced, and
\fIREPLACE\fR
is the
URI
of the replacement entity to be used\&. The
\fB\-\-add\fR
option will not overwrite
CATALOGFILE, outputting to
stdout, unless
\fB\-\-noout\fR
is used\&. The
\fB\-\-add\fR
will always take three parameters even if some of the
XML
catalog constructs will have only a single argument\&.
.RE
.PP
\fBdebug\fR
.RS 4
Print debugging statements showing the steps
\fBxmlcatalog\fR
is executing\&.
.RE
.PP
\fBdel \fR\fB\fIVALUE(S)\fR\fR
.RS 4
Remove the catalog entry corresponding to
\fIVALUE(S)\fR\&.
.RE
.PP
\fBdump\fR
.RS 4
Print the current catalog\&.
.RE
.PP
\fBexit\fR
.RS 4
Quit the shell\&.
.RE
.PP
\fBpublic \fR\fB\fIPUBLIC\-ID\fR\fR
.RS 4
Execute a Formal Public Identifier lookup of the catalog entry for
\fIPUBLIC\-ID\fR\&. The corresponding entry will be output to the command line\&.
.RE
.PP
\fBquiet\fR
.RS 4
Stop printing debugging statements\&.
.RE
.PP
\fBsystem \fR\fB\fISYSTEM\-ID\fR\fR
.RS 4
Execute a Formal Public Identifier lookup of the catalog entry for
\fISYSTEM\-ID\fR\&. The corresponding entry will be output to the command line\&.
.RE
.SH "ENVIRONMENT"
.PP
\fBXML_CATALOG_FILES\fR
.RS 4
XML
catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the
\fBXML_CATALOG_FILES\fR
environment variable to a space\-separated list of catalogs\&. Use percent\-encoding to escape spaces or other characters\&. An empty variable should deactivate loading the default
/etc/xml/catalog
catalog\&.
.RE
.SH "DIAGNOSTICS"
.PP
\fBxmlcatalog\fR
return codes provide information that can be used when calling it from scripts\&.
.PP
\fB0\fR
.RS 4
No error
.RE
.PP
\fB1\fR
.RS 4
Failed to remove an entry from the catalog
.RE
.PP
\fB2\fR
.RS 4
Failed to save to the catalog, check file permissions
.RE
.PP
\fB3\fR
.RS 4
Failed to add an entry to the catalog
.RE
.PP
\fB4\fR
.RS 4
Failed to look up an entry in the catalog
.RE
.SH "SEE ALSO"
.PP
\fBlibxml\fR(3)
.PP
More information can be found at
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBlibxml\fR(3)
web page
\m[blue]\fB\%https://gitlab.gnome.org/GNOME/libxml2\fR\m[]
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBlibxml\fR(3)
catalog support web page at
\m[blue]\fB\%https://gitlab.gnome.org/GNOME/libxml2/-/wikis/Catalog-support\fR\m[]
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
James Clark\*(Aqs
SGML
catalog page
\m[blue]\fB\%http://www.jclark.com/sp/catalog.htm\fR\m[]
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
OASIS
XML
catalog specification
\m[blue]\fB\%http://www.oasis-open.org/committees/entity/spec.html\fR\m[]
.RE
.sp
.SH "AUTHOR"
.PP
\fBJohn Fleck\fR <\&jfleck@inkstain\&.net\&>
.RS 4
Author.
.RE
.SH "COPYRIGHT"
.br
Copyright \(co 2001, 2004
.br
man/man1/xmllint.1000064400000032246151730335120007733 0ustar00'\" t
.\"     Title: xmllint
.\"    Author: John Fleck <jfleck@inkstain.net>
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
.\"      Date: 08/17/2022
.\"    Manual: xmllint Manual
.\"    Source: libxml2
.\"  Language: English
.\"
.TH "XMLLINT" "1" "08/17/2022" "libxml2" "xmllint Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
xmllint \- command line XML tool
.SH "SYNOPSIS"
.HP \w'\fBxmllint\fR\ 'u
\fBxmllint\fR [\fB\-\-version\fR | \fB\-\-debug\fR | \fB\-\-shell\fR | \fB\-\-xpath\ "\fR\fB\fIXPath_expression\fR\fR\fB"\fR | \fB\-\-debugent\fR | \fB\-\-copy\fR | \fB\-\-recover\fR | \fB\-\-noent\fR | \fB\-\-noout\fR | \fB\-\-nonet\fR | \fB\-\-path\ "\fR\fB\fIPATH(S)\fR\fR\fB"\fR | \fB\-\-load\-trace\fR | \fB\-\-htmlout\fR | \fB\-\-nowrap\fR | \fB\-\-valid\fR | \fB\-\-postvalid\fR | \fB\-\-dtdvalid\ \fR\fB\fIURL\fR\fR | \fB\-\-dtdvalidfpi\ \fR\fB\fIFPI\fR\fR | \fB\-\-timing\fR | \fB\-\-output\ \fR\fB\fIFILE\fR\fR | \fB\-\-repeat\fR | \fB\-\-insert\fR | \fB\-\-compress\fR | \fB\-\-html\fR | \fB\-\-xmlout\fR | \fB\-\-push\fR | \fB\-\-memory\fR | \fB\-\-maxmem\ \fR\fB\fINBBYTES\fR\fR | \fB\-\-nowarning\fR | \fB\-\-noblanks\fR | \fB\-\-nocdata\fR | \fB\-\-format\fR | \fB\-\-encode\ \fR\fB\fIENCODING\fR\fR | \fB\-\-dropdtd\fR | \fB\-\-nsclean\fR | \fB\-\-testIO\fR | \fB\-\-catalogs\fR | \fB\-\-nocatalogs\fR | \fB\-\-auto\fR | \fB\-\-xinclude\fR | \fB\-\-noxincludenode\fR | \fB\-\-loaddtd\fR | \fB\-\-dtdattr\fR | \fB\-\-stream\fR | \fB\-\-walker\fR | \fB\-\-pattern\ \fR\fB\fIPATTERNVALUE\fR\fR | \fB\-\-chkregister\fR | \fB\-\-relaxng\ \fR\fB\fISCHEMA\fR\fR | \fB\-\-schema\ \fR\fB\fISCHEMA\fR\fR | \fB\-\-c14n\fR] {\fIXML\-FILE(S)\fR... | \-}
.HP \w'\fBxmllint\fR\ 'u
\fBxmllint\fR \fB\-\-help\fR
.SH "DESCRIPTION"
.PP
The
\fBxmllint\fR
program parses one or more
XML
files, specified on the command line as
\fIXML\-FILE\fR
(or the standard input if the filename provided is
\fB\-\fR
)\&. It prints various types of output, depending upon the options selected\&. It is useful for detecting errors both in
XML
code and in the
XML
parser itself\&.
.PP
\fBxmllint\fR
is included in
\fBlibxml\fR(3)\&.
.SH "OPTIONS"
.PP
\fBxmllint\fR
accepts the following options (in alphabetical order):
.PP
\fB\-\-auto\fR
.RS 4
Generate a small document for testing purposes\&.
.RE
.PP
\fB\-\-catalogs\fR
.RS 4
Use the
SGML
catalog(s) from
\fBSGML_CATALOG_FILES\fR\&. Otherwise
XML
catalogs starting from
/etc/xml/catalog
are used by default\&.
.RE
.PP
\fB\-\-chkregister\fR
.RS 4
Turn on node registration\&. Useful for developers testing
\fBlibxml\fR(3)
node tracking code\&.
.RE
.PP
\fB\-\-compress\fR
.RS 4
Turn on
\fBgzip\fR(1)
compression of output\&.
.RE
.PP
\fB\-\-copy\fR
.RS 4
Test the internal copy implementation\&.
.RE
.PP
\fB\-\-c14n\fR
.RS 4
Use the W3C
XML
Canonicalisation (C14N) to serialize the result of parsing to
stdout\&. It keeps comments in the result\&.
.RE
.PP
\fB\-\-dtdvalid \fR\fB\fIURL\fR\fR
.RS 4
Use the
DTD
specified by an
\fIURL\fR
for validation\&.
.RE
.PP
\fB\-\-dtdvalidfpi \fR\fB\fIFPI\fR\fR
.RS 4
Use the
DTD
specified by a Formal Public Identifier
\fIFPI\fR
for validation, note that this will require a catalog exporting that Formal Public Identifier to work\&.
.RE
.PP
\fB\-\-debug\fR
.RS 4
Parse a file and output an annotated tree of the in\-memory version of the document\&.
.RE
.PP
\fB\-\-debugent\fR
.RS 4
Debug the entities defined in the document\&.
.RE
.PP
\fB\-\-dropdtd\fR
.RS 4
Remove
DTD
from output\&.
.RE
.PP
\fB\-\-dtdattr\fR
.RS 4
Fetch external
DTD
and populate the tree with inherited attributes\&.
.RE
.PP
\fB\-\-encode \fR\fB\fIENCODING\fR\fR
.RS 4
Output in the given encoding\&. Note that this works for full document not fragments or result from XPath queries\&.
.RE
.PP
\fB\-\-format\fR
.RS 4
Reformat and reindent the output\&. The
\fBXMLLINT_INDENT\fR
environment variable controls the indentation\&. The default value is two spaces " ")\&.
.RE
.PP
\fB\-\-help\fR
.RS 4
Print out a short usage summary for
\fBxmllint\fR\&.
.RE
.PP
\fB\-\-html\fR
.RS 4
Use the
HTML
parser\&.
.RE
.PP
\fB\-\-htmlout\fR
.RS 4
Output results as an
HTML
file\&. This causes
\fBxmllint\fR
to output the necessary
HTML
tags surrounding the result tree output so the results can be displayed/viewed in a browser\&.
.RE
.PP
\fB\-\-insert\fR
.RS 4
Test for valid insertions\&.
.RE
.PP
\fB\-\-loaddtd\fR
.RS 4
Fetch an external
DTD\&.
.RE
.PP
\fB\-\-load\-trace\fR
.RS 4
Display all the documents loaded during the processing to
stderr\&.
.RE
.PP
\fB\-\-maxmem \fR\fB\fINNBYTES\fR\fR
.RS 4
Test the parser memory support\&.
\fINNBYTES\fR
is the maximum number of bytes the library is allowed to allocate\&. This can also be used to make sure batch processing of
XML
files will not exhaust the virtual memory of the server running them\&.
.RE
.PP
\fB\-\-memory\fR
.RS 4
Parse from memory\&.
.RE
.PP
\fB\-\-noblanks\fR
.RS 4
Drop ignorable blank spaces\&.
.RE
.PP
\fB\-\-nocatalogs\fR
.RS 4
Do not use any catalogs\&.
.RE
.PP
\fB\-\-nocdata\fR
.RS 4
Substitute CDATA section by equivalent text nodes\&.
.RE
.PP
\fB\-\-noent\fR
.RS 4
Substitute entity values for entity references\&. By default,
\fBxmllint\fR
leaves entity references in place\&.
.RE
.PP
\fB\-\-nonet\fR
.RS 4
Do not use the Internet to fetch
DTDs or entities\&.
.RE
.PP
\fB\-\-noout\fR
.RS 4
Suppress output\&. By default,
\fBxmllint\fR
outputs the result tree\&.
.RE
.PP
\fB\-\-nowarning\fR
.RS 4
Do not emit warnings from the parser and/or validator\&.
.RE
.PP
\fB\-\-nowrap\fR
.RS 4
Do not output
HTML
doc wrapper\&.
.RE
.PP
\fB\-\-noxincludenode\fR
.RS 4
Do XInclude processing but do not generate XInclude start and end nodes\&.
.RE
.PP
\fB\-\-nsclean\fR
.RS 4
Remove redundant namespace declarations\&.
.RE
.PP
\fB\-\-output \fR\fB\fIFILE\fR\fR
.RS 4
Define a file path where
\fBxmllint\fR
will save the result of parsing\&. Usually the programs build a tree and save it on
stdout, with this option the result
XML
instance will be saved onto a file\&.
.RE
.PP
\fB\-\-path "\fR\fB\fIPATH(S)\fR\fR\fB"\fR
.RS 4
Use the (space\- or colon\-separated) list of filesystem paths specified by
\fIPATHS\fR
to load
DTDs or entities\&. Enclose space\-separated lists by quotation marks\&.
.RE
.PP
\fB\-\-pattern \fR\fB\fIPATTERNVALUE\fR\fR
.RS 4
Used to exercise the pattern recognition engine, which can be used with the reader interface to the parser\&. It allows to select some nodes in the document based on an XPath (subset) expression\&. Used for debugging\&.
.RE
.PP
\fB\-\-postvalid\fR
.RS 4
Validate after parsing has completed\&.
.RE
.PP
\fB\-\-push\fR
.RS 4
Use the push mode of the parser\&.
.RE
.PP
\fB\-\-recover\fR
.RS 4
Output any parsable portions of an invalid document\&.
.RE
.PP
\fB\-\-relaxng \fR\fB\fISCHEMA\fR\fR
.RS 4
Use RelaxNG file named
\fISCHEMA\fR
for validation\&.
.RE
.PP
\fB\-\-repeat\fR
.RS 4
Repeat 100 times, for timing or profiling\&.
.RE
.PP
\fB\-\-schema \fR\fB\fISCHEMA\fR\fR
.RS 4
Use a W3C
XML
Schema file named
\fISCHEMA\fR
for validation\&.
.RE
.PP
\fB\-\-shell\fR
.RS 4
Run a navigating shell\&. Details on available commands in shell mode are below (see
the section called \(lqSHELL COMMANDS\(rq)\&.
.RE
.PP
\fB\-\-xpath "\fR\fB\fIXPath_expression\fR\fR\fB"\fR
.RS 4
Run an XPath expression given as argument and print the result\&. In case of a nodeset result, each node in the node set is serialized in full in the output\&. In case of an empty node set the "XPath set is empty" result will be shown and an error exit code will be returned\&.
.RE
.PP
\fB\-\-stream\fR
.RS 4
Use streaming
API
\- useful when used in combination with
\fB\-\-relaxng\fR
or
\fB\-\-valid\fR
options for validation of files that are too large to be held in memory\&.
.RE
.PP
\fB\-\-testIO\fR
.RS 4
Test user input/output support\&.
.RE
.PP
\fB\-\-timing\fR
.RS 4
Output information about the time it takes
\fBxmllint\fR
to perform the various steps\&.
.RE
.PP
\fB\-\-valid\fR
.RS 4
Determine if the document is a valid instance of the included Document Type Definition (DTD)\&. A
DTD
to be validated against also can be specified at the command line using the
\fB\-\-dtdvalid\fR
option\&. By default,
\fBxmllint\fR
also checks to determine if the document is well\-formed\&.
.RE
.PP
\fB\-\-version\fR
.RS 4
Display the version of
\fBlibxml\fR(3)
used\&.
.RE
.PP
\fB\-\-walker\fR
.RS 4
Test the walker module, which is a reader interface but for a document tree, instead of using the reader
API
on an unparsed document it works on an existing in\-memory tree\&. Used for debugging\&.
.RE
.PP
\fB\-\-xinclude\fR
.RS 4
Do XInclude processing\&.
.RE
.PP
\fB\-\-xmlout\fR
.RS 4
Used in conjunction with
\fB\-\-html\fR\&. Usually when
HTML
is parsed the document is saved with the
HTML
serializer\&. But with this option the resulting document is saved with the
XML
serializer\&. This is primarily used to generate
XHTML
from
HTML
input\&.
.RE
.SH "SHELL COMMANDS"
.PP
\fBxmllint\fR
offers an interactive shell mode invoked with the
\fB\-\-shell\fR
command\&. Available commands in shell mode include (in alphabetical order):
.PP
\fBbase\fR
.RS 4
Display
XML
base of the node\&.
.RE
.PP
\fBbye\fR
.RS 4
Leave the shell\&.
.RE
.PP
\fBcat \fR\fB\fINODE\fR\fR
.RS 4
Display the given node or the current one\&.
.RE
.PP
\fBcd \fR\fB\fIPATH\fR\fR
.RS 4
Change the current node to the given path (if unique) or root if no argument is given\&.
.RE
.PP
\fBdir \fR\fB\fIPATH\fR\fR
.RS 4
Dumps information about the node (namespace, attributes, content)\&.
.RE
.PP
\fBdu \fR\fB\fIPATH\fR\fR
.RS 4
Show the structure of the subtree under the given path or the current node\&.
.RE
.PP
\fBexit\fR
.RS 4
Leave the shell\&.
.RE
.PP
\fBhelp\fR
.RS 4
Show this help\&.
.RE
.PP
\fBfree\fR
.RS 4
Display memory usage\&.
.RE
.PP
\fBload \fR\fB\fIFILENAME\fR\fR
.RS 4
Load a new document with the given filename\&.
.RE
.PP
\fBls \fR\fB\fIPATH\fR\fR
.RS 4
List contents of the given path or the current directory\&.
.RE
.PP
\fBpwd\fR
.RS 4
Display the path to the current node\&.
.RE
.PP
\fBquit\fR
.RS 4
Leave the shell\&.
.RE
.PP
\fBsave \fR\fB\fIFILENAME\fR\fR
.RS 4
Save the current document to the given filename or to the original name\&.
.RE
.PP
\fBvalidate\fR
.RS 4
Check the document for errors\&.
.RE
.PP
\fBwrite \fR\fB\fIFILENAME\fR\fR
.RS 4
Write the current node to the given filename\&.
.RE
.SH "ENVIRONMENT"
.PP
\fBSGML_CATALOG_FILES\fR
.RS 4
SGML
catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the
\fBSGML_CATALOG_FILES\fR
environment variable to a list of catalogs\&. An empty one should deactivate loading the default
/etc/sgml/catalog
catalog\&.
.RE
.PP
\fBXML_CATALOG_FILES\fR
.RS 4
XML
catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the
\fBXML_CATALOG_FILES\fR
environment variable to a space\-separated list of catalogs\&. Use percent\-encoding to escape spaces or other characters\&. An empty variable should deactivate loading the default
/etc/xml/catalog
catalog\&.
.RE
.PP
\fBXML_DEBUG_CATALOG\fR
.RS 4
Setting the environment variable
\fBXML_DEBUG_CATALOG\fR
to
\fInon\-zero\fR
using the
\fBexport\fR
command outputs debugging information related to catalog operations\&.
.RE
.PP
\fBXMLLINT_INDENT\fR
.RS 4
Setting the environment variable
\fBXMLLINT_INDENT\fR
controls the indentation\&. The default value is two spaces " "\&.
.RE
.SH "DIAGNOSTICS"
.PP
\fBxmllint\fR
return codes provide information that can be used when calling it from scripts\&.
.PP
\fB0\fR
.RS 4
No error
.RE
.PP
\fB1\fR
.RS 4
Unclassified
.RE
.PP
\fB2\fR
.RS 4
Error in
DTD
.RE
.PP
\fB3\fR
.RS 4
Validation error
.RE
.PP
\fB4\fR
.RS 4
Validation error
.RE
.PP
\fB5\fR
.RS 4
Error in schema compilation
.RE
.PP
\fB6\fR
.RS 4
Error writing output
.RE
.PP
\fB7\fR
.RS 4
Error in pattern (generated when
\fB\-\-pattern\fR
option is used)
.RE
.PP
\fB8\fR
.RS 4
Error in Reader registration (generated when
\fB\-\-chkregister\fR
option is used)
.RE
.PP
\fB9\fR
.RS 4
Out of memory error
.RE
.PP
\fB10\fR
.RS 4
XPath evaluation error
.RE
.SH "SEE ALSO"
.PP
\fBlibxml\fR(3)
.PP
More information can be found at
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBlibxml\fR(3)
web page
\m[blue]\fB\%https://gitlab.gnome.org/GNOME/libxml2\fR\m[]
.RE
.sp
.SH "AUTHORS"
.PP
\fBJohn Fleck\fR <\&jfleck@inkstain\&.net\&>
.RS 4
Author.
.RE
.PP
\fBZiying Sherwin\fR <\&sherwin@nlm\&.nih\&.gov\&>
.RS 4
Author.
.RE
.PP
\fBHeiko Rupp\fR <\&hwr@pilhuhn\&.de\&>
.RS 4
Author.
.RE
.SH "COPYRIGHT"
.br
Copyright \(co 2001, 2004
.br
doc/alt-libxml2/TODO000064400000026134151730335120010136 0ustar00124907 HTML parse buffer problem when parsing larse in-memory docs
124110 DTD validation && wrong namespace
123564 xmllint --html --format

           TODO for the XML parser and stuff:
	   ==================================

    this tend to be outdated :-\ ...

DOCS:
=====

- use case of using XInclude to load for example a description.
  order document + product base -(XSLT)-> quote with XIncludes 
                                                   |
  HTML output with description of parts <---(XSLT)--

TODO:
=====
- XInclude at the SAX level (libSRVG)
- fix the C code prototype to bring back doc/libxml-undocumented.txt
  to a reasonable level
- Computation of base when HTTP redirect occurs, might affect HTTP
  interfaces.
- Computation of base in XInclude. Relativization of URIs.
- listing all attributes in a node.
- Better checking of external parsed entities TAG 1234
- Go through erratas and do the cleanup.
  http://www.w3.org/XML/xml-19980210-errata ... started ...
- jamesh suggestion: SAX like functions to save a document ie. call a
  function to open a new element with given attributes, write character
  data, close last element, etc
  + inversted SAX, initial patch in April 2002 archives.
- htmlParseDoc has parameter encoding which is not used.
  Function htmlCreateDocParserCtxt ignore it.
- fix realloc() usage.
- Stricten the UTF8 conformance (Martin Duerst):
  http://www.w3.org/2001/06/utf-8-test/.
  The bad files are in http://www.w3.org/2001/06/utf-8-wrong/.
- xml:id normalized value

TODO:
=====

- move all string manipulation functions (xmlStrdup, xmlStrlen, etc.) to
  global.c. Bjorn noted that the following files depends on parser.o solely
  because of these string functions: entities.o, global.o, hash.o, tree.o,
  xmlIO.o, and xpath.o.

- Optimization of tag strings allocation ?

- maintain coherency of namespace when doing cut'n paste operations
  => the functions are coded, but need testing

- function to rebuild the ID table
- functions to rebuild the DTD hash tables (after DTD changes).
   

EXTENSIONS:
===========

- Tools to produce man pages from the SGML docs.

- Add Xpointer recognition/API

- Add Xlink recognition/API
  => started adding an xlink.[ch] with a unified API for XML and HTML.
     it's crap :-(

- Implement XSchemas
  => Really need to be done <grin/>
  - datatype are complete, but structure support is very limited.

- extend the shell with:
   - edit
   - load/save
   - mv (yum, yum, but it's harder because directories are ordered in
     our case, mvup and mvdown would be required)


Done:
=====

- Add HTML validation using the XHTML DTD
  - problem: do we want to keep and maintain the code for handling
    DTD/System ID cache directly in libxml ?
  => not really done that way, but there are new APIs to check elements
     or attributes. Otherwise XHTML validation directly ...

- XML Schemas datatypes except Base64 and BinHex

- Relax NG validation

- XmlTextReader streaming API + validation

- Add a DTD cache prefilled with xhtml DTDs and entities and a program to
  manage them -> like the /usr/bin/install-catalog from SGML
  right place seems $datadir/xmldtds
  Maybe this is better left to user apps
  => use a catalog instead , and xhtml1-dtd package

- Add output to XHTML
  => XML serializer automatically recognize the DTd and apply the specific
     rules.

- Fix output of <tst val="x&#xA;y"/>

- compliance to XML-Namespace checking, see section 6 of
  http://www.w3.org/TR/REC-xml-names/

- Correct standalone checking/emitting (hard)
  2.9 Standalone Document Declaration

- Implement OASIS XML Catalog support
  http://www.oasis-open.org/committees/entity/

- Get OASIS testsuite to a more friendly result, check all the results
  once stable. the check-xml-test-suite.py script does this

- Implement XSLT
  => libxslt

- Finish XPath
  => attributes addressing troubles
  => defaulted attributes handling
  => namespace axis ?
  done as XSLT got debugged

- bug reported by Michael Meallin on validation problems
  => Actually means I need to add support (and warn) for non-deterministic
     content model.
- Handle undefined namespaces in entity contents better ... at least
  issue a warning
- DOM needs
  int xmlPruneProp(xmlNodePtr node, xmlAtttrPtr attr);
  => done it's actually xmlRemoveProp xmlUnsetProp xmlUnsetNsProp

- HTML: handling of Script and style data elements, need special code in
  the parser and saving functions (handling of < > " ' ...):
  http://www.w3.org/TR/html4/types.html#type-script
  Attributes are no problems since entities are accepted.
- DOM needs
  xmlAttrPtr xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value)
- problem when parsing hrefs with & with the HTML parser (IRC ac)
- If the internal encoding is not UTF8 saving to a given encoding doesn't
  work => fix to force UTF8 encoding ...
  done, added documentation too
- Add an ASCII I/O encoder (asciiToUTF8 and UTF8Toascii)
- Issue warning when using non-absolute namespaces URI.
- the html parser should add <head> and <body> if they don't exist
  started, not finished.
  Done, the automatic closing is added and 3 testcases were inserted
- Command to force the parser to stop parsing and ignore the rest of the file.
  xmlStopParser() should allow this, mostly untested
- support for HTML empty attributes like <hr noshade>
- plugged iconv() in for support of a large set of encodings.
- xmlSwitchToEncoding() rewrite done
- URI checkings (no fragments) rfc2396.txt
- Added a clean mechanism for overload or added input methods:
  xmlRegisterInputCallbacks()
- dynamically adapt the alloc entry point to use g_alloc()/g_free()
  if the programmer wants it: 
    - use xmlMemSetup() to reset the routines used.
- Check attribute normalization especially xmlGetProp()
- Validity checking problems for NOTATIONS attributes
- Validity checking problems for ENTITY ENTITIES attributes
- Parsing of a well balanced chunk xmlParseBalancedChunkMemory()
- URI module: validation, base, etc ... see uri.[ch]
- turn tester into a generic program xmllint installed with libxml
- extend validity checks to go through entities content instead of
  just labelling them PCDATA
- Save Dtds using the children list instead of dumping the tables,
  order is preserved as well as comments and PIs
- Wrote a notice of changes requires to go from 1.x to 2.x
- make sure that all SAX callbacks are disabled if a WF error is detected
- checking/handling of newline normalization
  http://localhost/www.xml.com/axml/target.html#sec-line-ends
- correct checking of '&' '%' on entities content.
- checking of PE/Nesting on entities declaration
- checking/handling of xml:space
   - checking done.
   - handling done, not well tested
- Language identification code, productions [33] to [38]
  => done, the check has been added and report WFness errors
- Conditional sections in DTDs [61] to [65]
  => should this crap be really implemented ???
  => Yep OASIS testsuite uses them
- Allow parsed entities defined in the internal subset to override
  the ones defined in the external subset (DtD customization).
  => This mean that the entity content should be computed only at
     use time, i.e. keep the orig string only at parse time and expand
     only when referenced from the external subset :-(
     Needed for complete use of most DTD from Eve Maler
- Add regression tests for all WFC errors
  => did some in test/WFC
  => added OASIS testsuite routines
     http://xmlsoft.org/conf/result.html

- I18N: http://wap.trondheim.com/vaer/index.phtml is not XML and accepted
  by the XML parser, UTF-8 should be checked when there is no "encoding"
  declared !
- Support for UTF-8 and UTF-16 encoding
  => added some conversion routines provided by Martin Durst
     patched them, got fixes from @@@
     I plan to keep everything internally as UTF-8 (or ISO-Latin-X)
     this is slightly more costly but more compact, and recent processors
     efficiency is cache related. The key for good performances is keeping
     the data set small, so will I.
  => the new progressive reading routines call the detection code
     is enabled, tested the ISO->UTF-8 stuff
- External entities loading: 
   - allow override by client code
   - make sure it is called for all external entities referenced
  Done, client code should use xmlSetExternalEntityLoader() to set
  the default loading routine. It will be called each time an external
  entity entity resolution is triggered.
- maintain ID coherency when removing/changing attributes
  The function used to deallocate attributes now check for it being an
  ID and removes it from the table.
- push mode parsing i.e. non-blocking state based parser
  done, both for XML and HTML parsers. Use xmlCreatePushParserCtxt()
  and xmlParseChunk() and html counterparts.
  The tester program now has a --push option to select that parser 
  front-end. Douplicated tests to use both and check results are similar.

- Most of XPath, still see some troubles and occasionnal memleaks.
- an XML shell, allowing to traverse/manipulate an XML document with
  a shell like interface, and using XPath for the anming syntax
  - use of readline and history added when available
  - the shell interface has been cleanly separated and moved to debugXML.c
- HTML parser, should be fairly stable now
- API to search the lang of an attribute
- Collect IDs at parsing and maintain a table. 
   PBM: maintain the table coherency
   PBM: how to detect ID types in absence of DtD !
- Use it for XPath ID support
- Add validity checking
  Should be finished now !
- Add regression tests with entity substitutions

- External Parsed entities, either XML or external Subset [78] and [79]
  parsing the xmllang DtD now works, so it should be sufficient for
  most cases !

- progressive reading. The entity support is a first step toward
  abstraction of an input stream. A large part of the context is still
  located on the stack, moving to a state machine and putting everything
  in the parsing context should provide an adequate solution.
  => Rather than progressive parsing, give more power to the SAX-like
     interface. Currently the DOM-like representation is built but
     => it should be possible to define that only as a set of SAX callbacks
	and remove the tree creation from the parser code.
	DONE

- DOM support, instead of using a proprietary in memory
  format for the document representation, the parser should
  call a DOM API to actually build the resulting document.
  Then the parser becomes independent of the in-memory
  representation of the document. Even better using RPC's
  the parser can actually build the document in another
  program.
  => Work started, now the internal representation is by default
     very near a direct DOM implementation. The DOM glue is implemented
     as a separate module. See the GNOME gdome module.

- C++ support : John Ehresman <jehresma@dsg.harvard.edu>
- Updated code to follow more recent specs, added compatibility flag
- Better error handling, use a dedicated, overridable error
  handling function.
- Support for CDATA.
- Keep track of line numbers for better error reporting.
- Support for PI (SAX one).
- Support for Comments (bad, should be in ASAP, they are parsed
  but not stored), should be configurable.
- Improve the support of entities on save (+SAX).

doc/alt-libxml2/Copyright000064400000002411151730335120011331 0ustar00Except where otherwise noted in the source code (e.g. the files hash.c,
list.c and the trio files, which are covered by a similar licence but
with different Copyright notices) all the files are:

 Copyright (C) 1998-2012 Daniel Veillard.  All Rights Reserved.

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

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

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

v2.10.2: Aug 29 2022

### Improvements

- Remove set-but-unused variable in xmlXPathScanName
- Silence -Warray-bounds warning

### Build system

- build: require automake-1.16.3 or later (Xi Ruoyao)
- Remove generated files from distribution

### Test suite

- Don't create missing.xml when running testapi


v2.10.1: Aug 25 2022

### Regressions

- Fix xmlCtxtReadDoc with encoding

### Bug fixes

- Fix HTML parser with threads and --without-legacy

### Build system

- Fix build with Python 3.10
- cmake: Disable version script on macOS
- Remove Makefile rule to build testapi.c

### Documentation

- Switch back to HTML output for API documentation
- Port doc/examples/index.py to Python 3
- Fix order of exports in libxml2-api.xml
- Remove libxml2-refs.xml


v2.10.0: Aug 17 2022

### Security

- [CVE-2022-2309] Reset nsNr in xmlCtxtReset
- Reserve byte for NUL terminator and report errors consistently in xmlBuf and
  xmlBuffer (David Kilzer)
- Fix missing NUL terminators in xmlBuf and xmlBuffer functions (David Kilzer)
- Fix integer overflow in xmlBufferDump() (David Kilzer)
- xmlBufAvail() should return length without including a byte for NUL
  terminator (David Kilzer)
- Fix ownership of xmlNodePtr & xmlAttrPtr fields in xmlSetTreeDoc() (David
  Kilzer)
- Use xmlNewDocText in xmlXIncludeCopyRange
- Fix use-after-free bugs when calling xmlTextReaderClose() before
  xmlFreeTextReader() on post-validating parser (David Kilzer)
- Use UPDATE_COMPAT() consistently in buf.c (David Kilzer)
- fix: xmlXPathParserContext could be double-delete in  OOM case. (jinsub ahn)

### Removals and deprecations

- Disable XPointer location support by default
- Remove outdated xml2Conf.sh
- Deprecate module init and cleanup functions
- Remove obsolete XML Software Autoupdate (XSA) file
- Remove DOCBparser
- Remove obsolete Python test framework
- Remove broken VxWorks support
- Remove broken Mac OS 9 support
- Remove broken bakefile support
- Remove broken Visual Studio 2010 support
- Remove broken Windows CE support
- Deprecate IDREF-related functions in valid.h
- Deprecate legacy functions
- Disable legacy support by default
- Deprecate all functions in nanoftp.h
- Disable FTP support by default
- Add XML_DEPRECATED macro
- Remove elfgcchack.h

### Regressions

- Skip incorrectly opened HTML comments
- Restore behavior of htmlDocContentDumpFormatOutput() (David Kilzer)

### Bug fixes

- Fix memory leak with invalid XSD
- Make XPath depth check work with recursive invocations
- Fix memory leak in xmlLoadEntityContent error path
- Avoid double-free if malloc fails in inputPush
- Properly fold whitespace around the QName value when validating an XSD
  schema. (Damjan Jovanovic)
- Add whitespace folding for some atomic data types that it's missing on.
  (Damjan Jovanovic)
- Don't add IDs containing unexpanded entity references

### Improvements

- Avoid calling xmlSetTreeDoc
- Simplify xmlFreeNode
- Don't reset nsDef when changing node content
- Fix unintended fall-through in xmlNodeAddContentLen
- Remove unused xmlBuf functions (David Kilzer)
- Implement xpath1() XPointer scheme
- Add configuration flag for XPointer locations support
- Fix compiler warnings in Python code
- Mark more static data as `const` (David Kilzer)
- Make xmlStaticCopyNode non-recursive
- Clean up encoding switching code
- Simplify recursive pthread mutex
- Use non-recursive mutex in dict.c
- Fix parser progress checks
- Avoid arithmetic on freed pointers
- Improve buffer allocation scheme
- Remove unneeded #includes
- Add support for some non-standard escapes in regular expressions. (Damjan
  Jovanovic)
- htmlParseComment: handle abruptly-closed comments (Mike Dalessio)
- Add let variable tag support (Oliver Diehl)
- Add value-of tag support (Oliver Diehl)
- Remove useless call to xmlRelaxNGCleanupTypes
- Don't include ICU headers in public headers
- Update `xmlStrlen()` to use POSIX / ISO C `strlen()` (Mike Dalessio)
- Fix unused variable warnings with disabled features
- Only warn on invalid redeclarations of predefined entities
- Remove unneeded code in xmlreader.c
- Rework validation context flags

### Portability

- Use NAN/INFINITY if available to init XPath NaN/Inf (Sergey Kosukhin)
- Fix Python tests on macOS
- Fix xmlCleanupThreads on Windows
- Fix reinitialization of library on Windows
- Don't mix declarations and code in runtest.c
- Use portable python shebangs (David Seifert)
- Use critical sections as mutex on Windows
- Don't set HAVE_WIN32_THREADS in win32config.h
- Use stdint.h with newer MSVC
- Remove cruft from win32config.h
- Remove isinf/isnan emulation in win32config.h
- Always fopen files with "rb"
- Remove __DJGPP__ checks
- Remove useless __CYGWIN__ checks

### Build system

- Don't autogenerate doc/examples/Makefile.am
- cmake: Install libxml.m4 on UNIX-like platforms (Daniel E)
- cmake: Use symbol versioning on UNIX-like platforms (Daniel E)
- Port genUnicode.py to Python 3
- Port gentest.py to Python 3
- cmake: Fix build without thread support
- cmake: Install documentation in CMAKE_INSTALL_DOCDIR
- cmake: Remove non needed files in docs dir (Daniel E)
- configure: move XML_PRIVATE_LIBS after WIN32_EXTRA_LIBADD is set
  (Christopher Degawa)
- Move local Autoconf macros into m4 directory
- Use XML_PRIVATE_LIBS in libxml2_la_LIBADD
- Update libxml-2.0-uninstalled.pc.in
- Remove LIBS from XML_PRIVATE_LIBS
- Add WIN32_EXTRA_LIBADD to XML_PRIVATE_LIBS
- Don't overlink executables
- cmake: Adjust paths for UNIX or UNIX-like target systems (Daniel Engberg)
- build: Make use of variables in libxml's pkg-config file (Daniel Engberg)
- Avoid obsolescent `test -a` constructs (David Seifert)
- Move AM_MAINTAINER_MODE to AM section
- configure.ac: make AM_SILENT_RULES([yes]) unconditional (David Seifert)
- Streamline documentation installation
- Don't try to recreate COPYING symlink
- Detect libm using libtool's macros (David Seifert)
- configure.ac: disable static libraries by default (David Seifert)
- python/Makefile.am: nest python docs in $(docdir) (David Seifert)
- python/Makefile.am: rely on global AM_INIT_AUTOMAKE (David Seifert)
- Makefile.am: install examples more idiomatically (David Seifert)
- configure.ac: remove useless AC_SUBST (David Seifert)
- Respect `--sysconfdir` in source files (David Seifert)
- Ignore configure backup file created by recent autoreconf too (Vadim Zeitlin)
- Only install *.html and *.c example files
- Remove --with-html-dir option
- Rework documentation build system
- Remove old website
- Use AM_PATH_PYTHON/PKG_CHECK_MODULES for python bindings (David Seifert)
- Update genChRanges.py
- Update build_glob.py
- Remove ICONV_CONST test
- Remove obsolete AC_HEADER checks
- Don't check for standard C89 library functions
- Don't check for standard C89 headers
- Remove special configuration for certain maintainers

### Test suite, CI

- Disable network in API tests
- testapi: remove leading slash from "/missing.xml" (Mike Gilbert)
- Build Autotools CI tests out of source tree (VPATH)
- Add --with-minimum build to CI tests
- Fix warnings when testing --with-minimum build
- cmake: Run all tests when threads are disabled
- Also build CI tests with -Werror
- Move doc/examples tests to new test suite
- Simplify 'make check' targets
- Fix schemas and relaxng tests
- Remove unused result files
- Allow missing result files in runtest
- Move regexp tests to runtest
- Move SVG tests to runtest.c
- Move testModule to new test suite
- Move testThreads to new test suite
- Remove major parts of old test suite
- Make testchar return an error on failure (Tony Tascioglu)
- Add CI job for static build
- python/tests: open() relative to test scripts (David Seifert)
- Port some test scripts to Python 3

### Documentation

- Improve documentation of tree manipulation API
- Update xml2-config man page
- Consolidate man pages
- Rename xmlcatalog_man.xml
- Make examples a standalone HTML page
- Fix documentation in entities.c
- Add note about optimization flags


v2.9.14: May 02 2022:
   - Security:
  [CVE-2022-29824] Integer overflow in xmlBuf and xmlBuffer
  Fix potential double-free in xmlXPtrStringRangeFunction
  Fix memory leak in xmlFindCharEncodingHandler
  Normalize XPath strings in-place
  Prevent integer-overflow in htmlSkipBlankChars() and xmlSkipBlankChars()
    (David Kilzer)
  Fix leak of xmlElementContent (David Kilzer)

   - Bug fixes:
  Fix parsing of subtracted regex character classes
  Fix recursion check in xinclude.c
  Reset last error in xmlCleanupGlobals
  Fix certain combinations of regex range quantifiers
  Fix range quantifier on subregex

   - Improvements:
  Fix recovery from invalid HTML start tags

   - Build system, portability:
  Define LFS macros before including system headers
  Initialize XPath floating-point globals
  configure: check for icu DEFS (James Hilliard)
  configure.ac: produce tar.xz only (GNOME policy) (David Seifert)
  CMakeLists.txt: Fix LIBXML_VERSION_NUMBER
  Fix build with older Python versions
  Fix --without-valid build


v2.9.13: Feb 19 2022:
   - Security:
  [CVE-2022-23308] Use-after-free of ID and IDREF attributes
  (Thanks to Shinji Sato for the report)
  Use-after-free in xmlXIncludeCopyRange (David Kilzer)
  Fix Null-deref-in-xmlSchemaGetComponentTargetNs (huangduirong)
  Fix memory leak in xmlXPathCompNodeTest
  Fix null pointer deref in xmlStringGetNodeList
  Fix several memory leaks found by Coverity (David King)
  
   - Fixed regressions:
  Fix regression in RelaxNG pattern matching
  Properly handle nested documents in xmlFreeNode
  Fix regression with PEs in external DTD
  Fix random dropping of characters on dumping ASCII encoded XML (Mohammad Razavi)
  Revert "Make schema validation fail with multiple top-level elements"
  Fix regression when parsing invalid HTML tags in push mode
  Fix regression parsing public IDs literals in HTML
  Fix buffering in xmlOutputBufferWrite
  Fix whitespace when serializing empty HTML documents
  Fix XPath recursion limit
  Fix regression in xmlNodeDumpOutputInternal
  Work around lxml API abuse
  
   - Bug fixes:
  Fix xmlSetTreeDoc with entity references
  Fix double counting of CRLF in comments
  Make sure to grow input buffer in xmlParseMisc
  Don't ignore xmllint options after "-"
  Don't normalize namespace URIs in XPointer xmlns() scheme
  Fix handling of XSD with empty namespace
  Also register HTML document nodes
  Make xmllint return an error if arguments are missing
  Fix handling of ctxt->base in xmlXPtrEvalXPtrPart
  Fix xmllint --maxmem
  Fix htmlReadFd, which was using a mix of xml and html context functions (Finn Barber)
  Move current position before possible calling of ctxt->sax->characters (Yulin Li)
  Fix parse failure when 4-byte character in UTF-16 BE is split across a chunk (David Kilzer)
  Patch to forbid epsilon-reduction of final states (Arne Becker)
  Avoid segfault at exit when using custom memory functions (Mike Dalessio)
  
   - Tests, code quality, fuzzing:
  Remove .travis.yml
  Make xmlFuzzReadString return a zero size in error case
  Fix unused function warning in testapi.c
  Update NewsML DTD in test suite
  Add more checks for malloc failures in xmllint.c
  Avoid potential integer overflow in xmlstring.c
  Run CI tests with UBSan implicit-conversion checks
  Fix casting of line numbers in SAX2.c
  Fix integer conversion warnings in hash.c
  Add explicit casts in runtest.c 
  Fix integer conversion warning in xmlIconvWrapper
  Add suffix to unsigned constant in xmlmemory.c
  Add explicit casts in testchar.c
  Fix integer conversion warnings in xmlstring.c
  Add explicit cast in xmlURIUnescapeString
  Remove unused variable in xmlCharEncOutFunc (David King)
  
   - Build system, portability:
  Remove xmlwin32version.h
  Fix fuzzer test with VPATH build
  Support custom prefix when installing Python module
  Remove Makefile.win
  Remove CVS and SVN-related code
  Port python 3.x module to Windows and improve distutils (Chun-wei Fan)
  Correctly install the HTML examples into their subdirectory (Mattia Rizzolo)
  Refactor the settings of $docdir (Mattia Rizzolo)
  Remove unused configure checks (Ben Boeckel)
  python/Makefile.am: use *_LIBADD, not *_LDFLAGS for LIBS (Sam James)
  Fix check for libtool in autogen.sh
  Use version in configure.ac for CMake (Timothy Lyanguzov)
  Add CMake alias targets for embedded projects (Markus Rickert)
  
   - Documentation:
  Remove SVN keyword anchors
  Rework README
  Remove README.cvs-commits
  Remove old ChangeLog
  Update hyperlinks
  Remove README.docs
  Remove MAINTAINERS 
  Remove xmltutorial.pdf
  Upload documentation to GitLab pages
  Document how to escape XML_CATALOG_FILES
  Fix libxml2.doap
  Update URL for libxml++ C++ binding (Kjell Ahlstedt)
  Generate devhelp2 index file (Emmanuele Bassi)
  Mention XML_CATALOG_FILES is space-separated (Jan Tojnar)
  Add documentaiton for xmllint exit code 10 (Rainer Canavan)
  Fix some validation errors in the FAQ (David King)
  Add instructions on how to use CMake to compile libxml (Markus Rickert)
  


v2.9.12: May 13 2021:
   - Build system:
  Add fuzz.h and seed/regexp to EXTRA_DIST
  


v2.9.11: May 13 2021:
   - Security:
  Patch for security issue CVE-2021-3541 (Daniel Veillard)
  
   - Documentation:
  Clarify xmlNewDocProp documentation (Nick Wellnhofer)
  
   - Portability:
  CMake: Only add postfixes if MSVC (Christopher Degawa),
  Fix XPath NaN/Inf for older GCC versions (Nick Wellnhofer),
  Use CMake PROJECT_VERSION (Markus Rickert),
  Fix warnings in libxml.m4 with autoconf 2.70+. (Simon Josefsson),
  Add CI for CMake on MSVC (Markus Rickert),
  Update minimum required CMake version (Markus Rickert),
  Add variables for configured options to CMake config files (Markus Rickert),
  Check if variables exist when defining targets (Markus Rickert),
  Check if target exists when reading target properties (Markus Rickert),
  Add xmlcatalog target and definition to config files (Markus Rickert),
  Remove include directories for link-only dependencies (Markus Rickert),
  Fix ICU build in CMake (Markus Rickert),
  Configure pkgconfig, xml2-config, and xml2Conf.sh file (Markus Rickert),
  Update CMake config files (Markus Rickert),
  Add xmlcatalog and xmllint to CMake export (Markus Rickert),
  Simplify xmlexports.h (Nick Wellnhofer),
  Require dependencies based on enabled CMake options (Markus Rickert),
  Use NAMELINK_COMPONENT in CMake install (Markus Rickert),
  Add CMake files to EXTRA_DIST (Markus Rickert),
  Add missing compile definition for static builds to CMake (Markus Rickert),
  Add CI for CMake on Linux and MinGW (Markus Rickert),
  Fix variable name in win32/configure.js (Nick Wellnhofer),
  Fix version parsing in win32/configure.js (Nick Wellnhofer),
  Fix autotools warnings (Nick Wellnhofer),
  Update config.h.cmake.in (Markus Rickert),
  win32: allow passing *FLAGS on command line (Michael Stahl),
  Configure file xmlwin32version.h.in on MSVC (Markus Rickert),
  List headers individually (Markus Rickert),
  Add CMake build files (Markus Rickert),
  Parenthesize Py<type>_Check() in ifs (Miro Hrončok),
  Minor fixes to configure.js (Nick Wellnhofer)
  
   - Bug Fixes:
  Fix null deref in legacy SAX1 parser (Nick Wellnhofer),
  Fix handling of unexpected EOF in xmlParseContent (Nick Wellnhofer),
  Fix line numbers in error messages for mismatched tags (Nick Wellnhofer),
  Fix htmlTagLookup (Nick Wellnhofer),
  Propagate error in xmlParseElementChildrenContentDeclPriv (Nick Wellnhofer),
  Fix user-after-free with `xmllint --xinclude --dropdtd` (Nick Wellnhofer),
  Fix dangling pointer with `xmllint --dropdtd` (Nick Wellnhofer),
  Validate UTF8 in xmlEncodeEntities (Joel Hockey),
  Fix use-after-free with `xmllint --html --push` (Nick Wellnhofer),
  Allow FP division by zero in xmlXPathInit (Nick Wellnhofer),
  Fix xmlGetNodePath with invalid node types (Nick Wellnhofer),
  Fix exponential behavior with recursive entities (Nick Wellnhofer),
  Fix quadratic behavior when looking up xml:* attributes (Nick Wellnhofer),
  Fix slow parsing of HTML with encoding errors (Nick Wellnhofer),
  Fix null deref introduced with previous commit (Nick Wellnhofer),
  Check for invalid redeclarations of predefined entities (Nick Wellnhofer),
  Add the copy of type from original xmlDoc in xmlCopyDoc() (SVGAnimate),
  parser.c: shrink the input buffer when appropriate (Mike Dalessio),
  Fix infinite loop in HTML parser introduced with recent commits (Nick Wellnhofer),
  Fix quadratic runtime when parsing CDATA sections (Nick Wellnhofer),
  Fix timeout when handling recursive entities (Nick Wellnhofer),
  Fix memory leak in xmlParseElementMixedContentDecl (Nick Wellnhofer),
  Fix null deref in xmlStringGetNodeList (Nick Wellnhofer),
  use new htmlParseLookupCommentEnd to find comment ends (Mike Dalessio),
  htmlParseComment: treat `--!>` as if it closed the comment (Mike Dalessio),
  Fix integer overflow in xmlSchemaGetParticleTotalRangeMin (Nick Wellnhofer),
  encoding: fix memleak in xmlRegisterCharEncodingHandler() (Xiaoming Ni),
  xmlschemastypes.c: xmlSchemaGetFacetValueAsULong add, check "facet->val" (Xiaoming Ni),
  Fix null pointer deref in xmlXPtrRangeInsideFunction (Nick Wellnhofer),
  Fix quadratic runtime in HTML push parser with null bytes (Nick Wellnhofer),
  Avoid quadratic checking of identity-constraints (Michael Matz),
  Fix building with ICU 68. (Frederik Seiffert),
  Convert python/libxml.c to PY_SSIZE_T_CLEAN (Victor Stinner),
  Fix xmlURIEscape memory leaks. (Elliott Hughes),
  Avoid call stack overflow with XML reader and recursive XIncludes (Nick Wellnhofer),
  Fix caret in regexp character group (Nick Wellnhofer),
  parser.c: xmlParseCharData peek behavior fixed wrt newlines (Mike Dalessio),
  Fix memory leaks in XPointer string-range function (Nick Wellnhofer),
  Fix use-after-free when XIncluding text from Reader (Nick Wellnhofer),
  Fix SEGV in xmlSAXParseFileWithData (yanjinjq),
  Fix null deref in XPointer expression error path (Nick Wellnhofer),
  Don't call xmlXPathInit directly (Nick Wellnhofer),
  Fix cleanup of attributes in XML reader (Nick Wellnhofer),
  Fix double free in XML reader with XIncludes (Nick Wellnhofer),
  Fix memory leak in xmlXIncludeAddNode error paths (Nick Wellnhofer),
  Revert "Fix quadratic runtime in xi:fallback processing" (Nick Wellnhofer),
  Fix error reporting with xi:fallback (Nick Wellnhofer),
  Fix quadratic runtime in xi:fallback processing (Nick Wellnhofer),
  Fix corner case with empty xi:fallback (Nick Wellnhofer),
  Fix XInclude regression introduced with recent commit (Nick Wellnhofer),
  Fix memory leak in runtest.c (Nick Wellnhofer),
  Make "xmllint --push --recovery" work (Nick Wellnhofer),
  Revert "Do not URI escape in server side includes" (Nick Wellnhofer),
  Fix column number accounting in xmlParse*NameAndCompare (Nick Wellnhofer),
  Stop counting nbChars in parser context (Nick Wellnhofer),
  Fix out-of-bounds read with 'xmllint --htmlout' (Nick Wellnhofer),
  Fix exponential runtime and memory in xi:fallback processing (Nick Wellnhofer),
  Don't process siblings of root in xmlXIncludeProcess (Nick Wellnhofer),
  Don't recurse into xi:include children in xmlXIncludeDoProcess (Nick Wellnhofer),
  Fix memory leak in xmlXIncludeIncludeNode error paths (Nick Wellnhofer),
  Check for custom free function in global destructor (Nick Wellnhofer),
  Fix integer overflow when comparing schema dates (Nick Wellnhofer),
  Fix exponential runtime in xmlFARecurseDeterminism (Nick Wellnhofer),
  Don't try to handle namespaces when building HTML documents (Nick Wellnhofer),
  Fix several quadratic runtime issues in HTML push parser (Nick Wellnhofer),
  Fix quadratic runtime when push parsing HTML start tags (Nick Wellnhofer),
  Reset XML parser input before reporting errors (David Kilzer),
  Fix quadratic runtime when push parsing HTML entity refs (Nick Wellnhofer),
  Fix HTML push parser lookahead (Nick Wellnhofer),
  Make htmlCurrentChar always translate U+0000 (Nick Wellnhofer),
  Fix UTF-8 decoder in HTML parser (Nick Wellnhofer),
  Fix quadratic runtime when parsing HTML script content (Nick Wellnhofer),
  Reset HTML parser input before reporting error (Nick Wellnhofer),
  Fix more quadratic runtime issues in HTML push parser (Nick Wellnhofer),
  Fix regression introduced with 477c7f6a (Nick Wellnhofer),
  Fix quadratic runtime in HTML parser (Nick Wellnhofer),
  Reset HTML parser input before reporting encoding error (Nick Wellnhofer),
  Fix integer overflow in xmlFAParseQuantExact (Nick Wellnhofer),
  Fix return value of xmlC14NDocDumpMemory (Nick Wellnhofer),
  Don't follow next pointer on documents in xmlXPathRunStreamEval (Nick Wellnhofer),
  Fix integer overflow in _xmlSchemaParseGYear (Nick Wellnhofer),
  Fix integer overflow when parsing {min,max}Occurs (Nick Wellnhofer),
  Fix another memory leak in xmlSchemaValAtomicType (Nick Wellnhofer),
  Fix unsigned integer overflow in htmlParseTryOrFinish (Nick Wellnhofer),
  Fix integer overflow in htmlParseCharRef (Nick Wellnhofer),
  Fix undefined behavior in UTF16LEToUTF8 (Nick Wellnhofer),
  Fix return value of xmlCharEncOutput (Nick Wellnhofer),
  Never expand parameter entities in text declaration (Nick Wellnhofer),
  Fix undefined behavior in xmlXPathTryStreamCompile (Nick Wellnhofer),
  Fix use-after-free with validating reader (Nick Wellnhofer),
  xmlParseBalancedChunkMemory must not be called with NULL doc (Nick Wellnhofer),
  Revert "Fix memory leak in xmlParseBalancedChunkMemoryRecover" (Nick Wellnhofer),
  Fix memory leak in xmlXIncludeLoadDoc error path (Nick Wellnhofer),
  Make schema validation fail with multiple top-level elements (Nick Wellnhofer),
  Call xmlCleanupParser on ELF destruction (Samuel Thibault),
  Fix copying of entities in xmlParseReference (Nick Wellnhofer),
  Fix memory leak in xmlSchemaValidateStream (Zhipeng Xie),
  Fix xmlSchemaGetCanonValue formatting for date and dateTime (Kevin Puetz),
  Fix memory leak when shared libxml.dll is unloaded (Kevin Puetz),
  Fix potentially-uninitialized critical section in Win32 DLL builds (Kevin Puetz),
  Fix integer overflow in xmlBufferResize (Nick Wellnhofer),
  Check for overflow when allocating two-dimensional arrays (Nick Wellnhofer),
  Remove useless comparisons (Nick Wellnhofer),
  Fix overflow check in xmlNodeDump (Nick Wellnhofer),
  Fix infinite loop in xmlStringLenDecodeEntities (Zhipeng Xie),
  Fix freeing of nested documents (Nick Wellnhofer),
  Fix more memory leaks in error paths of XPath parser (Nick Wellnhofer),
  Fix memory leaks of encoding handlers in xmlsave.c (Nick Wellnhofer),
  Fix xml2-config error code (Nick Wellnhofer),
  Fix memory leak in error path of XPath expr parser (Nick Wellnhofer),
  Fix overflow handling in xmlBufBackToBuffer (Nick Wellnhofer),
  Null pointer handling in catalog.c (raniervf),
  xml2-config.in: fix regressions introduced by commit 2f2bf4b2c (Dmitry V. Levin)
  
   - Improvements:
  Store per-element parser state in a struct (Nick Wellnhofer),
  update for xsd:language type check (PaulHiggs),
  Update INSTALL.libxml2 (Nick Wellnhofer),
  Fix include order in c14n.h (Nick Wellnhofer),
  Fix duplicate xmlStrEqual calls in htmlParseEndTag (Nick Wellnhofer),
  Speed up htmlCheckAutoClose (Nick Wellnhofer),
  Speed up htmlTagLookup (Nick Wellnhofer),
  Stop checking attributes for UTF-8 validity (Nick Wellnhofer),
  Reduce some fuzzer timeouts (Nick Wellnhofer),
  Only run a few CI tests unless scheduled (Nick Wellnhofer),
  Improve fuzzer stability (Nick Wellnhofer),
  Check for feature flags in fuzzer tests (Nick Wellnhofer),
  Another attempt at improving fuzzer stability (Nick Wellnhofer),
  Revert "Improve HTML fuzzer stability" (Nick Wellnhofer),
  Add charset names to fuzzing dictionaries (Nick Wellnhofer),
  Improve HTML fuzzer stability (Nick Wellnhofer),
  Add CI for MSVC x86 (Markus Rickert),
  Add a flag to not output anything when xmllint succeeded (hhb),
  Speed up HTML fuzzer (Nick Wellnhofer),
  Remove unused encoding parameter of HTML output functions (Nick Wellnhofer),
  Handle malloc failures in fuzzing code (Nick Wellnhofer),
  add test coverage for incorrectly-closed comments (Mike Dalessio),
  Enforce maximum length of fuzz input (Nick Wellnhofer),
  Remove temporary members from struct _xmlXPathContext (Nick Wellnhofer),
  Build the Python extension with PY_SSIZE_T_CLEAN (Victor Stinner),
  Add CI test for Python 3 (Nick Wellnhofer),
  Add fuzzing dictionaries to EXTRA_DIST (Nick Wellnhofer),
  Add 'fuzz' subdirectory to DIST_SUBDIRS (Nick Wellnhofer),
  Allow port numbers up to INT_MAX (Nick Wellnhofer),
  Handle dumps of corrupted documents more gracefully (Nick Wellnhofer),
  Limit size of free lists in XML reader when fuzzing (Nick Wellnhofer),
  Hardcode maximum XPath recursion depth (Nick Wellnhofer),
  Pass URL of main entity in XML fuzzer (Nick Wellnhofer),
  Consolidate seed corpus generation (Nick Wellnhofer),
  Test fuzz targets with dummy driver (Nick Wellnhofer),
  Fix regression introduced with commit d88df4b (Nick Wellnhofer),
  Fix regression introduced with commit 74dcc10b (Nick Wellnhofer),
  Add TODO comment in xinclude.c (Nick Wellnhofer),
  Stop using maxParserDepth in xpath.c (Nick Wellnhofer),
  Remove dead code in xinclude.c (Nick Wellnhofer),
  Don't add formatting newlines to XInclude nodes (Nick Wellnhofer),
  Don't use SAX1 if all element handlers are NULL (Nick Wellnhofer),
  Remove unneeded progress checks in HTML parser (Nick Wellnhofer),
  Use strcmp when fuzzing (Nick Wellnhofer),
  Fix XPath fuzzer (Nick Wellnhofer),
  Fuzz XInclude engine (Nick Wellnhofer),
  Add XPath and XPointer fuzzer (Nick Wellnhofer),
  Update fuzzing code (Nick Wellnhofer),
  More *NodeDumpOutput fixes (Nick Wellnhofer),
  Fix *NodeDumpOutput functions (Nick Wellnhofer),
  Make xmlNodeDumpOutputInternal non-recursive (Nick Wellnhofer),
  Make xhtmlNodeDumpOutput non-recursive (Nick Wellnhofer),
  Make htmlNodeDumpFormatOutput non-recursive (Nick Wellnhofer),
  Fix .gitattributes (Nick Wellnhofer),
  Rework control flow in htmlCurrentChar (Nick Wellnhofer),
  Make 'xmllint --html --push -' read from stdin (Nick Wellnhofer),
  Remove misleading comments in xpath.c (Nick Wellnhofer),
  Update to Devhelp index file format version 2 (Andre Klapper),
  Set project language to C (Markus Rickert),
  Add variable for working directory of XML Conformance Test Suite (Markus Rickert),
  Add additional tests and XML Conformance Test Suite (Markus Rickert),
  Add command line option for temp directory in runtest (Markus Rickert),
  Ensure LF line endings for test files (Markus Rickert),
  Enable runtests and testThreads (Markus Rickert),
  Limit regexp nesting depth (Nick Wellnhofer),
  Fix return values and documentation in encoding.c (Nick Wellnhofer),
  Add regexp regression tests (David Kilzer),
  Report error for invalid regexp quantifiers (Nick Wellnhofer),
  Fix rebuilding docs, by hiding __attribute__((...)) behind a macro. (Martin Vidner),
  Copy xs:duration parser from libexslt (Nick Wellnhofer),
  Fuzz target for XML Schemas (Nick Wellnhofer),
  Move entity recorder to fuzz.c (Nick Wellnhofer),
  Fuzz target for HTML parser (Nick Wellnhofer),
  Update GitLab CI container (Nick Wellnhofer),
  Add options file for xml fuzzer (Nick Wellnhofer),
  Add a couple of libFuzzer targets (Nick Wellnhofer),
  Guard new calls to xmlValidatePopElement in xml_reader.c (Daniel Cheng),
  Add LIBXML_VALID_ENABLED to xmlreader (Łukasz Wojniłowicz),
  Fix typos (Nick Wellnhofer),
  Disable LeakSanitizer (Nick Wellnhofer),
  Stop calling SAX getEntity handler from XMLReader (Nick Wellnhofer),
  Add test case for recursive external parsed entities (Nick Wellnhofer),
  Enable error tests with entity substitution (Nick Wellnhofer),
  Don't load external entity from xmlSAX2GetEntity (Nick Wellnhofer),
  Merge code paths loading external entities (Nick Wellnhofer),
  Copy some XMLReader option flags to parser context (Nick Wellnhofer),
  Add xmlPopOutputCallbacks (Nick Wellnhofer),
  Updated Python test reader2.py (Pieter van Oostrum),
  Updated python/tests/tstLastError.py (Pieter van Oostrum),
  Use random seed in xmlDictComputeFastKey (Ranier Vilela),
  Enable more undefined behavior sanitizers (Nick Wellnhofer)
  


v2.9.10: Oct 30 2019:
   - Documentation:
  Fix a few more typos ("fonction") (Nick Wellnhofer),
  Large batch of typo fixes (Jared Yanovich),
  Fix typos: tree: move{ -> s}, reconcil{i -> }ed, h{o -> e}ld by... (Jan Pokorný),
  Fix typo: xpath: simpli{ -> fi}ed (Jan Pokorný),
  Doc: do not mislead towards "infeasible" scenario wrt. xmlBufNodeDump (Jan Pokorný),
  Fix comments in test code (zhouzhongyuan),
  fix comment in testReader.c (zhouzhongyuan)
  
   - Portability:
  Fix some release issues on Fedora 30 (Daniel Veillard),
  Fix exponent digits when running tests under old MSVC (Daniel Richard G),
  Work around buggy ceil() function on AIX (Daniel Richard G),
  Don't call printf with NULL string in runtest.c (Daniel Richard G),
  Switched from unsigned long to ptrdiff_t in parser.c (Stephen Chenney),
  timsort.h: support older GCCs (Jérôme Duval),
  Make configure.ac work with older pkg-config (Nick Wellnhofer),
  Stop defining _REENTRANT on some Win32 platforms (Nick Wellnhofer),
  Fix nanohttp.c on MinGW (Nick Wellnhofer),
  Fix Windows compiler warning in testC14N.c (Nick Wellnhofer),
  Merge testThreadsWin32.c into testThreads.c (Nick Wellnhofer),
  Fix Python bindings under Windows (Nick Wellnhofer)
  
   - Bug Fixes:
  Another fix for conditional sections at end of document (Nick Wellnhofer),
  Fix for conditional sections at end of document (Nick Wellnhofer),
  Make sure that Python tests exit with error code (Nick Wellnhofer),
  Audit memory error handling in xpath.c (Nick Wellnhofer),
  Fix error code in xmlTextWriterStartDocument (Nick Wellnhofer),
  Fix integer overflow when counting written bytes (Nick Wellnhofer),
  Fix uninitialized memory access in HTML parser (Nick Wellnhofer),
  Fix memory leak in xmlSchemaValAtomicType (Nick Wellnhofer),
  Disallow conditional sections in internal subset (Nick Wellnhofer),
  Fix use-after-free in xmlTextReaderFreeNodeList (Nick Wellnhofer),
  Fix Regextests (Nick Wellnhofer),
  Fix empty branch in regex (Nick Wellnhofer),
  Fix integer overflow in entity recursion check (Nick Wellnhofer),
  Don't read external entities or XIncludes from stdin (Nick Wellnhofer),
  Fix Schema determinism check of ##other namespaces (Nick Wellnhofer),
  Fix potential null deref in xmlSchemaIDCFillNodeTables (zhouzhongyuan),
  Fix potential memory leak in xmlBufBackToBuffer (Nick Wellnhofer),
  Fix error message when processing XIncludes with fallbacks (Nick Wellnhofer),
  Fix memory leak in xmlRegEpxFromParse (zhouzhongyuan),
  14:00 is a valid timezone for xs:dateTime (Nick Wellnhofer),
  Fix memory leak in xmlParseBalancedChunkMemoryRecover (Zhipeng Xie),
  Fix potential null deref in xmlRelaxNGParsePatterns (Nick Wellnhofer),
  Misleading error message with xs:{min|max}Inclusive (bettermanzzy),
  Fix memory leak in xmlXIncludeLoadTxt (Wang Kirin),
  Partial fix for comparison of xs:durations (Nick Wellnhofer),
  Fix null deref in xmlreader buffer (zhouzhongyuan),
  Fix unability to RelaxNG-validate grammar with choice-based name class (Jan Pokorný),
  Fix unability to validate ambiguously constructed interleave for RelaxNG (Jan Pokorný),
  Fix possible null dereference in xmlXPathIdFunction (zhouzhongyuan),
  fix memory leak in xmlAllocOutputBuffer (zhouzhongyuan),
  Fix unsigned int overflow (Jens Eggerstedt),
  dict.h: gcc 2.95 doesn't allow multiple storage classes (Nick Wellnhofer),
  Fix another code path in xmlParseQName (Nick Wellnhofer),
  Make sure that xmlParseQName returns NULL in error case (Nick Wellnhofer),
  Fix build without reader but with pattern (Nick Wellnhofer),
  Fix memory leak in xmlAllocOutputBufferInternal error path (Nick Wellnhofer),
  Fix unsigned integer overflow (Nick Wellnhofer),
  Fix return value of xmlOutputBufferWrite (Nick Wellnhofer),
  Fix parser termination from "Double hyphen within comment" error (David Warring),
  Fix call stack overflow in xmlFreePattern (Nick Wellnhofer),
  Fix null deref in previous commit (Nick Wellnhofer),
  Fix memory leaks in xmlXPathParseNameComplex error paths (Nick Wellnhofer),
  Check for integer overflow in xmlXPtrEvalChildSeq (Nick Wellnhofer),
  Fix xmllint dump of XPath namespace nodes (Nick Wellnhofer),
  Fix float casts in xmlXPathSubstringFunction (Nick Wellnhofer),
  Fix null deref in xmlregexp error path (Nick Wellnhofer),
  Fix null pointer dereference in xmlTextReaderReadOuterXml (Nick Wellnhofer),
  Fix memory leaks in xmlParseStartTag2 error paths (Nick Wellnhofer),
  Fix memory leak in xmlSAX2StartElement (Nick Wellnhofer),
  Fix commit "Memory leak in xmlFreeID (xmlreader.c)" (Nick Wellnhofer),
  Fix NULL pointer deref in xmlTextReaderValidateEntity (Nick Wellnhofer),
  Memory leak in xmlFreeTextReader (Nick Wellnhofer),
  Memory leak in xmlFreeID (xmlreader.c) (Nick Wellnhofer)
  
   - Improvements:
  Run XML conformance tests under CI (Nick Wellnhofer),
  Update GitLab CI config (Nick Wellnhofer),
  Propagate memory errors in valuePush (Nick Wellnhofer),
  Propagate memory errors in xmlXPathCompExprAdd (Nick Wellnhofer),
  Make xmlFreeDocElementContent non-recursive (Nick Wellnhofer),
  Enable continuous integration via GitLab CI (Nick Wellnhofer),
  Avoid ignored attribute warnings under GCC (Nick Wellnhofer),
  Make xmlDumpElementContent non-recursive (Nick Wellnhofer),
  Make apibuild.py ignore ATTRIBUTE_NO_SANITIZE (Nick Wellnhofer),
  Mark xmlExp* symbols as removed (Nick Wellnhofer),
  Make xmlParseConditionalSections non-recursive (Nick Wellnhofer),
  Adjust expected error in Python tests (Nick Wellnhofer),
  Make xmlTextReaderFreeNodeList non-recursive (Nick Wellnhofer),
  Make xmlFreeNodeList non-recursive (Nick Wellnhofer),
  Make xmlParseContent and xmlParseElement non-recursive (Nick Wellnhofer),
  Remove executable bit from non-executable files (Nick Wellnhofer),
  Fix expected output of test/schemas/any4 (Nick Wellnhofer),
  Optimize build instructions in README (zhouzhongyuan),
  xml2-config.in: Output CFLAGS and LIBS on the same line (Hugh McMaster),
  xml2-config: Add a --dynamic switch to print only shared libraries (Hugh McMaster),
  Annotate functions with __attribute__((no_sanitize)) (Nick Wellnhofer),
  Fix warnings when compiling without reader or push parser (Nick Wellnhofer),
  Remove unused member `doc` in xmlSaveCtxt (Nick Wellnhofer),
  Limit recursion depth in xmlXPathCompOpEvalPredicate (Nick Wellnhofer),
  Remove -Wno-array-bounds (Nick Wellnhofer),
  Remove unreachable code in xmlXPathCountFunction (Nick Wellnhofer),
  Improve XPath predicate and filter evaluation (Nick Wellnhofer),
  Limit recursion depth in xmlXPathOptimizeExpression (Nick Wellnhofer),
  Disable hash randomization when fuzzing (Nick Wellnhofer),
  Optional recursion limit when parsing XPath expressions (Nick Wellnhofer),
  Optional recursion limit when evaluating XPath expressions (Nick Wellnhofer),
  Use break statements in xmlXPathCompOpEval (Nick Wellnhofer),
  Optional XPath operation limit (Nick Wellnhofer),
  Fix compilation with --with-minimum (Nick Wellnhofer),
  Check XPath stack after calling functions (Nick Wellnhofer),
  Remove debug printf in xmlreader.c (Nick Wellnhofer),
  Always define LIBXML_THREAD_ENABLED when enabled (Michael Haubenwallner),
  Regenerate NEWS (Nick Wellnhofer),
  Change git repo URL (Nick Wellnhofer),
  Change bug tracker URL (Nick Wellnhofer),
  Remove outdated HTML file (Nick Wellnhofer),
  Fix unused function warning in testapi.c (Nick Wellnhofer),
  Add some generated test files to .gitignore (Nick Wellnhofer),
  Remove unneeded function pointer casts (Nick Wellnhofer),
  Fix -Wcast-function-type warnings (GCC 8) (Nick Wellnhofer),
  Fix -Wformat-truncation warnings (GCC 8) (Nick Wellnhofer)
  
   - Cleanups:
  Rebuild docs (Nick Wellnhofer),
  Disable xmlExp regex code (Nick Wellnhofer),
  Remove redundant code in xmlRelaxNGValidateState (Nick Wellnhofer),
  Remove redundant code in xmlXPathCompRelationalExpr (Nick Wellnhofer)
  


v2.9.9: Jan 03 2019:
   - Security:
  CVE-2018-9251 CVE-2018-14567 Fix infinite loop in LZMA decompression (Nick Wellnhofer),
  CVE-2018-14404 Fix nullptr deref with XPath logic ops (Nick Wellnhofer),
  
   - Documentation:
  reader: Fix documentation comment (Mohammed Sadiq)
  
   - Portability:
  Fix MSVC build with lzma (Nick Wellnhofer),
  Variables need 'extern' in static lib on Cygwin (Michael Haubenwallner),
  Really declare dllexport/dllimport for Cygwin (Michael Haubenwallner),
  Merge branch 'patch-2' into 'master' (Nick Wellnhofer),
  Change dir to $THEDIR after ACLOCAL_PATH check autoreconf creates aclocal.m4 in $srcdir (Vitaly Buka),
  Improve error message if pkg.m4 couldn't be found (Nick Wellnhofer),
  NaN and Inf fixes for pre-C99 compilers (Nick Wellnhofer)
  
   - Bug Fixes:
  Revert "Support xmlTextReaderNextSibling w/o preparsed doc" (Nick Wellnhofer),
  Fix building relative URIs (Thomas Holder),
  Problem with data in interleave in RelaxNG validation (Nikolai Weibull),
  Fix memory leak in xmlSwitchInputEncodingInt error path (Nick Wellnhofer),
  Set doc on element obtained from freeElems (Nick Wellnhofer),
  Fix HTML serialization with UTF-8 encoding (Nick Wellnhofer),
  Use actual doc in xmlTextReaderRead*Xml (Nick Wellnhofer),
  Unlink node before freeing it in xmlSAX2StartElement (Nick Wellnhofer),
  Check return value of nodePush in xmlSAX2StartElement (Nick Wellnhofer),
  Free input buffer in xmlHaltParser (Nick Wellnhofer),
  Reset HTML parser input pointers on encoding failure (Nick Wellnhofer),
  Don't run icu_parse_test if EUC-JP is unsupported (Nick Wellnhofer),
  Fix xmlSchemaValidCtxtPtr reuse memory leak (Greg Hildstrom),
  Fix xmlTextReaderNext with preparsed document (Felix Bünemann),
  Remove stray character from comment (Nick Wellnhofer),
  Remove a misleading line from xmlCharEncOutput (Andrey Bienkowski),
  HTML noscript should not close p (Daniel Veillard),
  Don't change context node in xmlXPathRoot (Nick Wellnhofer),
  Stop using XPATH_OP_RESET (Nick Wellnhofer),
  Revert "Change calls to xmlCharEncInput to set flush false" (Nick Wellnhofer)
  
   - Improvements:
  Fix "Problem with data in interleave in RelaxNG validation" (Nikolai Weibull),
  cleanup: remove some unreachable code (Thomas Holder),
  add --relative to testURI (Thomas Holder),
  Remove redefined starts and defines inside include elements (Nikolai Weibull),
  Allow choice within choice in nameClass in RELAX NG (Nikolai Weibull),
  Look inside divs for starts and defines inside include (Nikolai Weibull),
  Add compile and libxml2-config.cmake to .gitignore (Nikolai Weibull),
  Stop using doc->charset outside parser code (Nick Wellnhofer),
  Add newlines to 'xmllint --xpath' output (Nick Wellnhofer),
  Don't include SAX.h from globals.h (Nick Wellnhofer),
  Support xmlTextReaderNextSibling w/o preparsed doc (Felix Bünemann),
  Don't instruct user to run make when autogen.sh failed (林博仁(Buo-ren Lin)),
  Run Travis ASan tests with "sudo: required" (Nick Wellnhofer),
  Improve restoring of context size and position (Nick Wellnhofer),
  Simplify and harden nodeset filtering (Nick Wellnhofer),
  Avoid unnecessary backups of the context node (Nick Wellnhofer),
  Fix inconsistency in xmlXPathIsInf (Nick Wellnhofer)
  
   - Cleanups:
  


v2.9.8: Mar 05 2018:
   - Portability:
  python: remove single use of _PyVerify_fd (Patrick Welche),
  Build more test executables on Windows/MSVC (Nick Wellnhofer),
  Stop including ansidecl.h (Nick Wellnhofer),
  Fix libz and liblzma detection (Nick Wellnhofer),
  Revert "Compile testapi with -Wno-unused-function" (Nick Wellnhofer)
  
   - Bug Fixes:
  Fix xmlParserEntityCheck (Nick Wellnhofer),
  Halt parser in case of encoding error (Nick Wellnhofer),
  Clear entity content in case of errors (Nick Wellnhofer),
  Change calls to xmlCharEncInput to set flush false when not final call. Having flush incorrectly set to true causes errors for ICU. (Joel Hockey),
  Fix buffer over-read in xmlParseNCNameComplex (Nick Wellnhofer),
  Fix ICU library filenames on Windows/MSVC (Nick Wellnhofer),
  Fix xmlXPathIsNaN broken by recent commit (Nick Wellnhofer),
  Fix -Wenum-compare warnings (Nick Wellnhofer),
  Fix callback signature in testapi.c (Nick Wellnhofer),
  Fix unused parameter warning without ICU (Nick Wellnhofer),
  Fix IO callback signatures (Nick Wellnhofer),
  Fix misc callback signatures (Nick Wellnhofer),
  Fix list callback signatures (Nick Wellnhofer),
  Fix hash callback signatures (Nick Wellnhofer),
  Refactor name and type signature for xmlNop (Vlad Tsyrklevich),
  Fixed ICU to set flush correctly and provide pivot buffer. (Joel Hockey),
  Skip EBCDIC tests if EBCDIC isn't supported (Nick Wellnhofer)
  
   - Improvements:
  Disable pointer-overflow UBSan checks under Travis (Nick Wellnhofer),
  Improve handling of context input_id (Daniel Veillard),
  Add resource file to Windows DLL (ccpaging),
  Run Travis tests with -Werror (Nick Wellnhofer),
  Build with "-Wall -Wextra" (Nick Wellnhofer),
  Fix -Wtautological-pointer-compare warnings (Nick Wellnhofer),
  Remove unused AC_CHECKs (Nick Wellnhofer),
  Update information about contributing (Nick Wellnhofer),
  Fix -Wmisleading-indentation warnings (Nick Wellnhofer),
  Don't touch CFLAGS in configure.ac (Nick Wellnhofer),
  Ignore function pointer cast warnings (Nick Wellnhofer),
  Simplify XPath NaN, inf and -0 handling (Nick Wellnhofer),
  Introduce xmlPosixStrdup and update xmlMemStrdup (Nick Wellnhofer),
  Add test for ICU flush and pivot buffer (Nick Wellnhofer),
  Compile testapi with -Wno-unused-function (Nick Wellnhofer)
  


2.9.7: Nov 02 2017:
   - Documentation:
  xmlcatalog: refresh man page wrt. querying system catalog easily (Jan Pokorný)
  
   - Portability:
  Fix deprecated Travis compiler flag (Nick Wellnhofer),
  Add declaration for DllMain (J. Peter Mugaas),
  Fix preprocessor conditional in threads.h (J. Peter Mugaas),
  Fix pointer comparison warnings on 64-bit Windows (J. Peter Mugaas),
  Fix macro redefinition warning (J. Peter Mugaas),
  Default to native threads on MinGW-w64 (Nick Wellnhofer),
  Simplify Windows IO functions (Nick Wellnhofer),
  Fix runtest on Windows (Nick Wellnhofer),
  socklen_t is always int on Windows (Nick Wellnhofer),
  Don't redefine socket error codes on Windows (Nick Wellnhofer),
  Fix pointer/int cast warnings on 64-bit Windows (Nick Wellnhofer),
  Fix Windows compiler warnings in xmlCanonicPath (Nick Wellnhofer)
  
   - Bug Fixes:
  xmlcatalog: restore ability to query system catalog easily (Jan Pokorný),
  Fix comparison of nodesets to strings (Nick Wellnhofer)
  
   - Improvements:
  Add Makefile rules to rebuild HTML man pages (Nick Wellnhofer),
  Fix mixed decls and code in timsort.h (Nick Wellnhofer),
  Rework handling of return values in thread tests (Nick Wellnhofer),
  Fix unused variable warnings in testrecurse (Nick Wellnhofer),
  Fix -Wimplicit-fallthrough warnings (J. Peter Mugaas),
  Upgrade timsort.h to latest revision (Nick Wellnhofer),
  Increase warning level to /W3 under MSVC (Nick Wellnhofer),
  Fix a couple of warnings in dict.c and threads.c (Nick Wellnhofer),
  Update .gitignore for Windows (Nick Wellnhofer),
  Fix unused variable warnings in nanohttp.c (Nick Wellnhofer),
  Fix the Windows header mess (Nick Wellnhofer),
  Don't include winsock2.h in xmllint.c (Nick Wellnhofer),
  Remove generated file python/setup.py from version control (Nick Wellnhofer),
  Use __linux__ macro in generated code (Nick Wellnhofer)
  


v2.9.6: Oct 06 2017:
   - Portability:
  Change preprocessor OS tests to __linux__ (Nick Wellnhofer)
  
   - Bug Fixes:
  Fix XPath stack frame logic (Nick Wellnhofer),
  Report undefined XPath variable error message (Nick Wellnhofer),
  Fix regression with librsvg (Nick Wellnhofer),
  Handle more invalid entity values in recovery mode (Nick Wellnhofer),
  Fix structured validation errors (Nick Wellnhofer),
  Fix memory leak in LZMA decompressor (Nick Wellnhofer),
  Set memory limit for LZMA decompression (Nick Wellnhofer),
  Handle illegal entity values in recovery mode (Nick Wellnhofer),
  Fix debug dump of streaming XPath expressions (Nick Wellnhofer),
  Fix memory leak in nanoftp (Nick Wellnhofer),
  Fix memory leaks in SAX1 parser (Nick Wellnhofer)
  


v2.9.5: Sep 04 2017:
   - Security:
  Detect infinite recursion in parameter entities (Nick Wellnhofer),
  Fix handling of parameter-entity references (Nick Wellnhofer),
  Disallow namespace nodes in XPointer ranges (Nick Wellnhofer),
  Fix XPointer paths beginning with range-to (Nick Wellnhofer)
  
   - Documentation:
  Documentation fixes (Nick Wellnhofer),
  Spelling and grammar fixes (Nick Wellnhofer)
  
   - Portability:
  Adding README.zOS to list of extra files for the release (Daniel Veillard),
  Description of work needed to compile on zOS (Stéphane Michaut),
  Porting libxml2 on zOS encoding of code (Stéphane Michaut),
  small changes for OS/400 (Patrick Monnerat),
  relaxng.c, xmlschemas.c: Fix build on pre-C99 compilers (Chun-wei Fan)
  
   - Bug Fixes:
  Problem resolving relative URIs (Daniel Veillard),
  Fix unwanted warnings when switching encodings (Nick Wellnhofer),
  Fix signature of xmlSchemaAugmentImportedIDC (Daniel Veillard),
  Heap-buffer-overflow read of size 1 in xmlFAParsePosCharGroup (David Kilzer),
  Fix NULL pointer deref in xmlFAParseCharClassEsc (Nick Wellnhofer),
  Fix infinite loops with push parser in recovery mode (Nick Wellnhofer),
  Send xmllint usage error to stderr (Nick Wellnhofer),
  Fix NULL deref in xmlParseExternalEntityPrivate (Nick Wellnhofer),
  Make sure not to call IS_BLANK_CH when parsing the DTD (Nick Wellnhofer),
  Fix xmlHaltParser (Nick Wellnhofer),
  Fix pathological performance when outputting charrefs (Nick Wellnhofer),
  Fix invalid-source-encoding warnings in testWriter.c (Nick Wellnhofer),
  Fix duplicate SAX callbacks for entity content (David Kilzer),
  Treat URIs with scheme as absolute in C14N (Nick Wellnhofer),
  Fix copy-paste errors in error messages (Nick Wellnhofer),
  Fix sanity check in htmlParseNameComplex (Nick Wellnhofer),
  Fix potential infinite loop in xmlStringLenDecodeEntities (Nick Wellnhofer),
  Reset parser input pointers on encoding failure (Nick Wellnhofer),
  Fix memory leak in xmlParseEntityDecl error path (Nick Wellnhofer),
  Fix xmlBuildRelativeURI for URIs starting with './' (Nick Wellnhofer),
  Fix type confusion in xmlValidateOneNamespace (Nick Wellnhofer),
  Fix memory leak in xmlStringLenGetNodeList (Nick Wellnhofer),
  Fix NULL pointer deref in xmlDumpElementContent (Daniel Veillard),
  Fix memory leak in xmlBufAttrSerializeTxtContent (Nick Wellnhofer),
  Stop parser on unsupported encodings (Nick Wellnhofer),
  Check for integer overflow in memory debug code (Nick Wellnhofer),
  Fix buffer size checks in xmlSnprintfElementContent (Nick Wellnhofer),
  Avoid reparsing in xmlParseStartTag2 (Nick Wellnhofer),
  Fix undefined behavior in xmlRegExecPushStringInternal (Nick Wellnhofer),
  Check XPath exponents for overflow (Nick Wellnhofer),
  Check for overflow in xmlXPathIsPositionalPredicate (Nick Wellnhofer),
  Fix spurious error message (Nick Wellnhofer),
  Fix memory leak in xmlCanonicPath (Nick Wellnhofer),
  Fix memory leak in xmlXPathCompareNodeSetValue (Nick Wellnhofer),
  Fix memory leak in pattern error path (Nick Wellnhofer),
  Fix memory leak in parser error path (Nick Wellnhofer),
  Fix memory leaks in XPointer error paths (Nick Wellnhofer),
  Fix memory leak in xmlXPathNodeSetMergeAndClear (Nick Wellnhofer),
  Fix memory leak in XPath filter optimizations (Nick Wellnhofer),
  Fix memory leaks in XPath error paths (Nick Wellnhofer),
  Do not leak the new CData node if adding fails (David Tardon),
  Prevent unwanted external entity reference (Neel Mehta),
  Increase buffer space for port in HTTP redirect support (Daniel Veillard),
  Fix more NULL pointer derefs in xpointer.c (Nick Wellnhofer),
  Avoid function/data pointer conversion in xpath.c (Nick Wellnhofer),
  Fix format string warnings (Nick Wellnhofer),
  Disallow namespace nodes in XPointer points (Nick Wellnhofer),
  Fix comparison with root node in xmlXPathCmpNodes (Nick Wellnhofer),
  Fix attribute decoding during XML schema validation (Alex Henrie),
  Fix NULL pointer deref in XPointer range-to (Nick Wellnhofer)
  
   - Improvements:
  Updating the spec file to reflect Fedora 24 (Daniel Veillard),
  Add const in five places to move 1 KiB to .rdata (Bruce Dawson),
  Fix missing part of comment for function xmlXPathEvalExpression() (Daniel Veillard),
  Get rid of "blanks wrapper" for parameter entities (Nick Wellnhofer),
  Simplify handling of parameter entity references (Nick Wellnhofer),
  Deduplicate code in encoding.c (Nick Wellnhofer),
  Make HTML parser functions take const pointers (Nick Wellnhofer),
  Build test programs only when needed (Nick Wellnhofer),
  Fix doc/examples/index.py (Nick Wellnhofer),
  Fix compiler warnings in threads.c (Nick Wellnhofer),
  Fix empty-body warning in nanohttp.c (Nick Wellnhofer),
  Fix cast-align warnings (Nick Wellnhofer),
  Fix unused-parameter warnings (Nick Wellnhofer),
  Rework entity boundary checks (Nick Wellnhofer),
  Don't switch encoding for internal parameter entities (Nick Wellnhofer),
  Merge duplicate code paths handling PE references (Nick Wellnhofer),
  Test SAX2 callbacks with entity substitution (Nick Wellnhofer),
  Support catalog and threads tests under --without-sax1 (Nick Wellnhofer),
  Misc fixes for 'make tests' (Nick Wellnhofer),
  Initialize keepBlanks in HTML parser (Nick Wellnhofer),
  Add test cases for bug 758518 (David Kilzer),
  Fix compiler warning in htmlParseElementInternal (Nick Wellnhofer),
  Remove useless check in xmlParseAttributeListDecl (Nick Wellnhofer),
  Allow zero sized memory input buffers (Nick Wellnhofer),
  Add TODO comment in xmlSwitchEncoding (Nick Wellnhofer),
  Check for integer overflow in xmlXPathFormatNumber (Nick Wellnhofer),
  Make Travis print UBSan stacktraces (Nick Wellnhofer),
  Add .travis.yml (Nick Wellnhofer),
  Fix expected error output in Python tests (Nick Wellnhofer),
  Simplify control flow in xmlParseStartTag2 (Nick Wellnhofer),
  Disable LeakSanitizer when running API tests (Nick Wellnhofer),
  Avoid out-of-bound array access in API tests (Nick Wellnhofer),
  Avoid spurious UBSan errors in parser.c (Nick Wellnhofer),
  Parse small XPath numbers more accurately (Nick Wellnhofer),
  Rework XPath rounding functions (Nick Wellnhofer),
  Fix white space in test output (Nick Wellnhofer),
  Fix axis traversal from attribute and namespace nodes (Nick Wellnhofer),
  Check for trailing characters in XPath expressions earlier (Nick Wellnhofer),
  Rework final handling of XPath results (Nick Wellnhofer),
  Make xmlXPathEvalExpression call xmlXPathEval (Nick Wellnhofer),
  Remove unused variables (Nick Wellnhofer),
  Don't print generic error messages in XPath tests (Nick Wellnhofer)
  
   - Cleanups:
  Fix a couple of misleading indentation errors (Daniel Veillard),
  Remove unnecessary calls to xmlPopInput (Nick Wellnhofer)
  


2.9.4: May 23 2016:
   - Security:
  More format string warnings with possible format string vulnerability (David Kilzer),
  Avoid building recursive entities (Daniel Veillard),
  Heap-based buffer overread in htmlCurrentChar (Pranjal Jumde),
  Heap-based buffer-underreads due to xmlParseName (David Kilzer),
  Heap use-after-free in xmlSAX2AttributeNs (Pranjal Jumde),
  Heap use-after-free in htmlParsePubidLiteral and htmlParseSystemiteral (Pranjal Jumde),
  Fix some format string warnings with possible format string vulnerability (David Kilzer),
  Detect change of encoding when parsing HTML names (Hugh Davenport),
  Fix inappropriate fetch of entities content (Daniel Veillard),
  Bug 759398: Heap use-after-free in xmlDictComputeFastKey <https://bugzilla.gnome.org/show_bug.cgi?id=759398> (Pranjal Jumde),
  Bug 758605: Heap-based buffer overread in xmlDictAddString <https://bugzilla.gnome.org/show_bug.cgi?id=758605> (Pranjal Jumde),
  Bug 758588: Heap-based buffer overread in xmlParserPrintFileContextInternal <https://bugzilla.gnome.org/show_bug.cgi?id=758588> (David Kilzer),
  Bug 757711: heap-buffer-overflow in xmlFAParsePosCharGroup <https://bugzilla.gnome.org/show_bug.cgi?id=757711> (Pranjal Jumde),
  Add missing increments of recursion depth counter to XML parser. (Peter Simons)
  
   - Documentation:
  Fix typo: s{ ec -> cr }cipt (Jan Pokorný),
  Fix typos: dictio{ nn -> n }ar{y,ies} (Jan Pokorný),
  Fix typos: PATH_{ SEAPARATOR -> SEPARATOR } (Jan Pokorný),
  Correct a typo. (Shlomi Fish)
  
   - Portability:
  Correct the usage of LDFLAGS (Mattias Hansson),
  Revert the use of SAVE_LDFLAGS in configure.ac (Mattias Hansson),
  libxml2 hardcodes -L/lib in zlib/lzma tests which breaks cross-compiles (Mike Frysinger),
  Fix apibuild for a recently added construct (Daniel Veillard),
  Use pkg-config to locate zlib when possible (Stewart Brodie),
  Use pkg-config to locate ICU when possible (Stewart Brodie),
  Portability to non C99 compliant compilers (Patrick Monnerat),
  dict.h: Move xmlDictPtr definition before includes to allow direct inclusion. (Patrick Monnerat),
  os400: tell about xmllint and xmlcatalog in README400. (Patrick Monnerat),
  os400: properly process SGML add in XMLCATALOG command. (Patrick Monnerat),
  os400: implement CL command XMLCATALOG. (Patrick Monnerat),
  os400: compile and install program xmlcatalog (qshell-only). (Patrick Monnerat),
  os400: expand tabs in sources, strip trailing blanks. (Patrick Monnerat),
  os400: implement CL command XMLLINT. (Patrick Monnerat),
  os400: compile and install program xmllint (qshell-only). (Patrick Monnerat),
  os400: initscript make_module(): Use options instead of positional parameters. (Patrick Monnerat),
  os400: c14n.rpgle: allow *omit for nullable reference parameters. (Patrick Monnerat),
  os400: use like() for double type. (Patrick Monnerat),
  os400: use like() for int type. (Patrick Monnerat),
  os400: use like() for unsigned int type. (Patrick Monnerat),
  os400: use like() for enum types. (Patrick Monnerat),
  Add xz to xml2-config --libs output (Baruch Siach),
  Bug 760190: configure.ac should be able to build --with-icu without icu-config tool <https://bugzilla.gnome.org/show_bug.cgi?id=760190> (David Kilzer),
  win32\VC10\config.h and VS 2015 (Bruce Dawson),
  Add configure maintainer mode (orzen)
  
   - Bug Fixes:
  Avoid an out of bound access when serializing malformed strings (Daniel Veillard),
  Unsigned addition may overflow in xmlMallocAtomicLoc() (David Kilzer),
  Integer signed/unsigned type mismatch in xmlParserInputGrow() (David Kilzer),
  Bug 763071: heap-buffer-overflow in xmlStrncat <https://bugzilla.gnome.org/show_bug.cgi?id=763071> (Pranjal Jumde),
  Integer overflow parsing port number in URI (Michael Paddon),
  Fix an error with regexp on nullable counted char transition (Daniel Veillard),
  Fix memory leak with XPath namespace nodes (Nick Wellnhofer),
  Fix namespace axis traversal (Nick Wellnhofer),
      Fix null pointer deref in docs with no root element (Hugh Davenport),
  Fix XSD validation of URIs with ampersands (Alex Henrie),
  xmlschemastypes.c: accept endOfDayFrag Times set to "24:00:00" mean "end of day" and should not cause an error. (Patrick Monnerat),
  xmlcatalog: flush stdout before interactive shell input. (Patrick Monnerat),
  xmllint: flush stdout before interactive shell input. (Patrick Monnerat),
  Don't recurse into OP_VALUEs in xmlXPathOptimizeExpression (Nick Wellnhofer),
  Fix namespace::node() XPath expression (Nick Wellnhofer),
  Fix OOB write in xmlXPathEmptyNodeSet (Nick Wellnhofer),
  Fix parsing of NCNames in XPath (Nick Wellnhofer),
  Fix OOB read with invalid UTF-8 in xmlUTF8Strsize (Nick Wellnhofer),
  Do normalize string-based datatype value in RelaxNG facet checking (Audric Schiltknecht),
  Bug 760921: REGRESSION (8eb55d78): doc/examples/io1 test fails after fix for "xmlSaveUri() incorrectly recomposes URIs with rootless paths" <https://bugzilla.gnome.org/show_bug.cgi?id=760921> (David Kilzer),
  Bug 760861: REGRESSION (bf9c1dad): Missing results for test/schemas/regexp-char-ref_[01].xsd <https://bugzilla.gnome.org/show_bug.cgi?id=760861> (David Kilzer),
  error.c: *input->cur == 0 does not mean no error (Pavel Raiskup),
  Add missing RNG test files (David Kilzer),
  Bug 760183: REGRESSION (v2.9.3): XML push parser fails with bogus UTF-8 encoding error when multi-byte character in large CDATA section is split across buffer <https://bugzilla.gnome.org/show_bug.cgi?id=760183> (David Kilzer),
  Bug 758572: ASAN crash in make check <https://bugzilla.gnome.org/show_bug.cgi?id=758572> (David Kilzer),
  Bug 721158: Missing ICU string when doing --version on xmllint <https://bugzilla.gnome.org/show_bug.cgi?id=721158> (David Kilzer),
  python 3: libxml2.c wrappers create Unicode str already (Michael Stahl),
  Add autogen.sh to distrib (orzen),
  Heap-based buffer overread in xmlNextChar (Daniel Veillard)
  
   - Improvements:
  Add more debugging info to runtest (Daniel Veillard),
  Implement "runtest -u" mode (David Kilzer),
  Add a make rule to rebuild for ASAN (Daniel Veillard)
  


v2.9.3: Nov 20 2015:
   - Security:
  CVE-2015-8242 Buffer overead with HTML parser in push mode (Hugh Davenport),
  CVE-2015-7500 Fix memory access error due to incorrect entities boundaries (Daniel Veillard),
  CVE-2015-7499-2 Detect incoherency on GROW (Daniel Veillard),
  CVE-2015-7499-1 Add xmlHaltParser() to stop the parser (Daniel Veillard),
  CVE-2015-5312 Another entity expansion issue (David Drysdale),
  CVE-2015-7497 Avoid an heap buffer overflow in xmlDictComputeFastQKey (David Drysdale),
  CVE-2015-7498 Avoid processing entities after encoding conversion failures (Daniel Veillard),
  CVE-2015-8035 Fix XZ compression support loop (Daniel Veillard),
  CVE-2015-7942-2 Fix an error in previous Conditional section patch (Daniel Veillard),
  CVE-2015-7942 Another variation of overflow in Conditional sections (Daniel Veillard),
  CVE-2015-1819 Enforce the reader to run in constant memory (Daniel Veillard)
  CVE-2015-7941_2 Cleanup conditional section error handling (Daniel Veillard),
  CVE-2015-7941_1 Stop parsing on entities boundaries errors (Daniel Veillard),
  
   - Documentation:
  Correct spelling of "calling" (Alex Henrie),
  Fix a small error in xmllint --format description (Fabien Degomme),
  Avoid XSS on the search of xmlsoft.org (Daniel Veillard)
  
   - Portability:
  threads: use forward declarations only for glibc (Michael Heimpold),
  Update Win32 configure.js to search for configure.ac (Daniel Veillard)
  
   - Bug Fixes:
  Bug on creating new stream from entity (Daniel Veillard),
  Fix some loop issues embedding NEXT (Daniel Veillard),
  Do not print error context when there is none (Daniel Veillard),
  Avoid extra processing of MarkupDecl when EOF (Hugh Davenport),
  Fix parsing short unclosed comment uninitialized access (Daniel Veillard),
  Add missing Null check in xmlParseExternalEntityPrivate (Gaurav Gupta),
  Fix a bug in CData error handling in the push parser (Daniel Veillard),
  Fix a bug on name parsing at the end of current input buffer (Daniel Veillard),
  Fix the spurious ID already defined error (Daniel Veillard),
  Fix previous change to node sort order (Nick Wellnhofer),
  Fix a self assignment issue raised by clang (Scott Graham),
  Fail parsing early on if encoding conversion failed (Daniel Veillard),
  Do not process encoding values if the declaration if broken (Daniel Veillard),
  Silence clang's -Wunknown-attribute (Michael Catanzaro),
  xmlMemUsed is not thread-safe (Martin von Gagern),
  Fix support for except in nameclasses (Daniel Veillard),
  Fix order of root nodes (Nick Wellnhofer),
  Allow attributes on descendant-or-self axis (Nick Wellnhofer),
  Fix the fix to Windows locking (Steve Nairn),
  Fix timsort invariant loop re: Envisage article (Christopher Swenson),
  Don't add IDs in xmlSetTreeDoc (Nick Wellnhofer),
  Account for ID attributes in xmlSetTreeDoc (Nick Wellnhofer),
  Remove various unused value assignments (Philip Withnall),
  Fix missing entities after CVE-2014-3660 fix (Daniel Veillard),
  Revert "Missing initialization for the catalog module" (Daniel Veillard)
  
   - Improvements:
  Reuse xmlHaltParser() where it makes sense (Daniel Veillard),
  xmlStopParser reset errNo (Daniel Veillard),
  Re-enable xz support by default (Daniel Veillard),
  Recover unescaped less-than character in HTML recovery parsing (Daniel Veillard),
  Allow HTML serializer to output HTML5 DOCTYPE (Shaun McCance),
  Regression test for bug #695699 (Nick Wellnhofer),
  Add a couple of XPath tests (Nick Wellnhofer),
  Add Python 3 rpm subpackage (Tomas Radej),
  libxml2-config.cmake.in: update include directories (Samuel Martin),
  Adding example from bugs 738805 to regression tests (Daniel Veillard)
  
   - Cleanups:
  


2.9.2: Oct 16 2014:
   - Security:
  Fix for CVE-2014-3660 billion laugh variant (Daniel Veillard),
  CVE-2014-0191 Do not fetch external parameter entities (Daniel Veillard)
  
   - Bug Fixes:
  fix memory leak xml header encoding field with XML_PARSE_IGNORE_ENC (Bart De Schuymer),
  xmlmemory: handle realloc properly (Yegor Yefremov),
  Python generator bug raised by the const change (Daniel Veillard),
  Windows Critical sections not released correctly (Daniel Veillard),
  Parser error on repeated recursive entity expansion containing &lt; (Daniel Veillard),
  xpointer : fixing Null Pointers (Gaurav Gupta),
  Remove Unnecessary Null check in xpointer.c (Gaurav Gupta),
  parser bug on misformed namespace attributes (Dennis Filder),
  Pointer dereferenced before null check (Daniel Veillard),
  Leak of struct addrinfo in xmlNanoFTPConnect() (Gaurav Gupta),
  Possible overflow in HTMLParser.c (Daniel Veillard),
  python/tests/sync.py assumes Python dictionaries are ordered (John Beck),
  Fix Enum check and missing break (Gaurav Gupta),
  xmlIO: Handle error returns from dup() (Philip Withnall),
  Fix a problem properly saving URIs (Daniel Veillard),
  wrong error column in structured error when parsing attribute values (Juergen Keil),
  wrong error column in structured error when skipping whitespace in xml decl (Juergen Keil),
  no error column in structured error handler for xml schema validation errors (Juergen Keil),
  Couple of Missing Null checks (Gaurav Gupta),
  Add couple of missing Null checks (Daniel Veillard),
  xmlschemastypes: Fix potential array overflow (Philip Withnall),
  runtest: Fix a memory leak on parse failure (Philip Withnall),
  xmlIO: Fix an FD leak on gzdopen() failure (Philip Withnall),
  xmlcatalog: Fix a memory leak on quit (Philip Withnall),
  HTMLparser: Correctly initialise a stack allocated structure (Philip Withnall),
  Check for tmon in _xmlSchemaDateAdd() is incorrect (David Kilzer),
  Avoid Possible Null Pointer in trio.c (Gaurav Gupta),
  Fix processing in SAX2 in case of an allocation failure (Daniel Veillard),
  XML Shell command "cd" does not handle "/" at end of path (Daniel Veillard),
  Fix various Missing Null checks (Gaurav Gupta),
  Fix a potential NULL dereference (Daniel Veillard),
  Add a couple of misisng check in xmlRelaxNGCleanupTree (Gaurav Gupta),
  Add a missing argument check (Gaurav Gupta),
  Adding a check in case of allocation error (Gaurav Gupta),
  xmlSaveUri() incorrectly recomposes URIs with rootless paths (Dennis Filder),
  Adding some missing NULL checks (Gaurav),
  Fixes for xmlInitParserCtxt (Daniel Veillard),
  Fix regressions introduced by CVE-2014-0191 patch (Daniel Veillard),
  erroneously ignores a validation error if no error callback set (Daniel Veillard),
  xmllint was not parsing the --c14n11 flag (Sérgio Batista),
  Avoid Possible null pointer dereference in memory debug mode (Gaurav),
  Avoid Double Null Check (Gaurav),
  Restore context size and position after XPATH_OP_ARG (Nick Wellnhofer),
  Fix xmlParseInNodeContext() if node is not element (Daniel Veillard),
  Avoid a possible NULL pointer dereference (Gaurav),
  Fix xmlTextWriterWriteElement when a null content is given (Daniel Veillard),
  Fix an typo 'onrest' in htmlScriptAttributes (Daniel Veillard),
  fixing a ptotential uninitialized access (Daniel Veillard),
  Fix an fd leak in an error case (Daniel Veillard),
  Missing initialization for the catalog module (Daniel Veillard),
  Handling of XPath function arguments in error case (Nick Wellnhofer),
  Fix a couple of missing NULL checks (Gaurav),
  Avoid a possibility of dangling encoding handler (Gaurav),
  Fix HTML push parser to accept HTML_PARSE_NODEFDTD (Arnold Hendriks),
  Fix a bug loading some compressed files (Mike Alexander),
  Fix XPath node comparison bug (Gaurav),
  Type mismatch in xmlschemas.c (Gaurav),
  Type mismatch in xmlschemastypes.c (Gaurav),
  Avoid a deadcode in catalog.c (Daniel Veillard),
  run close socket on Solaris, same as we do on other platforms (Denis Pauk),
  Fix pointer dereferenced before null check (Gaurav),
  Fix a potential NULL dereference in tree code (Daniel Veillard),
  Fix potential NULL pointer dereferences in regexp code (Gaurav),
  xmllint --pretty crashed without following numeric argument (Tim Galeckas),
  Fix XPath expressions of the form '@ns:*' (Nick Wellnhofer),
  Fix XPath '//' optimization with predicates (Nick Wellnhofer),
  Clear up a potential NULL dereference (Daniel Veillard),
  Fix a possible NULL dereference (Gaurav),
  Avoid crash if allocation fails (Daniel Veillard),
  Remove occasional leading space in XPath number formatting (Daniel Veillard),
  Fix handling of mmap errors (Daniel Veillard),
  Catch malloc error and exit accordingly (Daniel Veillard),
  missing else in xlink.c (Ami Fischman),
  Fix a parsing bug on non-ascii element and CR/LF usage (Daniel Veillard),
  Fix a regression in xmlGetDocCompressMode() (Daniel Veillard),
  properly quote the namespace uris written out during c14n (Aleksey Sanin),
  Remove premature XInclude check on URI being relative (Alexey Neyman),
  Fix missing break on last() function for attributes (dcb),
  Do not URI escape in server side includes (Romain Bondue),
  Fix an error in xmlCleanupParser (Alexander Pastukhov)
  
   - Documentation:
  typo in error messages "colon are forbidden from..." (Daniel Veillard),
  Fix a link to James SAX documentation old page (Daniel Veillard),
  Fix typos in relaxng.c (Jan Pokorný),
  Fix a doc typo (Daniel Veillard),
  Fix typos in {tree,xpath}.c (errror) (Jan Pokorný),
  Add limitations about encoding conversion (Daniel Veillard),
  Fix typos in xmlschemas{,types}.c (Jan Pokorný),
  Fix incorrect spelling entites->entities (Jan Pokorný),
  Forgot to document 2.9.1 release, regenerate docs (Daniel Veillard)
  
   - Portability:
  AC_CONFIG_FILES and executable bit (Roumen Petrov),
  remove HAVE_CONFIG_H dependency in testlimits.c (Roumen Petrov),
  fix some tabs mixing incompatible with python3 (Roumen Petrov),
  Visual Studio 14 CTP defines snprintf() (Francis Dupont),
  OS400: do not try to copy unexisting doc files (Patrick Monnerat),
  OS400: use either configure.ac or configure.in. (Patrick Monnerat),
  os400: make-src.sh: create physical file with target CCSID (Patrick Monnerat),
  OS400: Add some more C macros equivalent procedures. (Patrick Monnerat),
  OS400: use C macros to implement equivalent RPG support procedures. (Patrick Monnerat),
  OS400: implement XPath macros as procedures for ILE/RPG support. (Patrick Monnerat),
  OS400: include in distribution tarball. (Patrick Monnerat),
  OS400: Add README: compilation directives and OS/400 specific stuff. (Patrick Monnerat),
  OS400: Add compilation scripts. (Patrick Monnerat),
  OS400: ILE RPG language header files. (Patrick Monnerat),
  OS400: implement some macros as functions for ILE/RPG language support (that as no macros). (Patrick Monnerat),
  OS400: UTF8<-->EBCDIC wrappers for system and external library calls (Patrick Monnerat),
  OS400: Easy character transcoding support (Patrick Monnerat),
  OS400: iconv functions compatibility wrappers and table builder. (Patrick Monnerat),
  OS400: create architecture directory. Implement dlfcn emulation. (Patrick Monnerat),
  Fix building when configuring without xpath and xptr (Daniel Veillard),
  configure: Add --with-python-install-dir (Jonas Eriksson),
  Fix compilation with minimum and xinclude. (Nicolas Le Cam),
  Compile out use of xmlValidateNCName() when not available. (Nicolas Le Cam),
  Fix compilation with minimum and schematron. (Nicolas Le Cam),
  Legacy needs xmlSAX2StartElement() and xmlSAX2EndElement(). (Nicolas Le Cam),
  Don't use xmlValidateName() when not available. (Nicolas Le Cam),
  Fix a portability issue on Windows (Longstreth Jon),
  Various portability patches for OpenVMS (Jacob (Jouk) Jansen),
  Use specific macros for portability to OS/400 (Patrick Monnerat),
  Add macros needed for OS/400 portability (Patrick Monnerat),
  Portability patch for fopen on OS/400 (Patrick Monnerat),
  Portability fixes for OS/400 (Patrick Monnerat),
  Improve va_list portability (Patrick Monnerat),
  Portability fix (Patrick Monnerat),
  Portability fix (Patrick Monnerat),
  Generic portability fix (Patrick Monnerat),
  Shortening lines in headers (Patrick Monnerat),
  build: Use pkg-config to find liblzma in preference to AC_CHECK_LIB (Philip Withnall),
  build: Add @LZMA_LIBS@ to libxml’s pkg-config files (Philip Withnall),
  fix some tabs mixing incompatible with python3 (Daniel Veillard),
  add additional defines checks for support "./configure --with-minimum" (Denis Pauk),
  Another round of fixes for older versions of Python (Arfrever Frehtes Taifersar Arahesis),
  python: fix drv_libxml2.py for python3 compatibility (Alexandre Rostovtsev),
  python: Fix compiler warnings when building python3 bindings (Armin K),
  Fix for compilation with python 2.6.8 (Petr Sumbera)
  
   - Improvements:
  win32/libxml2.def.src after rebuild in doc (Roumen Petrov),
  elfgcchack.h: more legacy needs xmlSAX2StartElement() and xmlSAX2EndElement() (Roumen Petrov),
  elfgcchack.h: add xmlXPathNodeEval and xmlXPathSetContextNode (Roumen Petrov),
  Provide cmake module (Samuel Martin),
  Fix a couple of issues raised by make dist (Daniel Veillard),
  Fix and add const qualifiers (Kurt Roeckx),
  Preparing for upcoming release of 2.9.2 (Daniel Veillard),
  Fix zlib and lzma libraries check via command line (Dmitriy),
  wrong error column in structured error when parsing end tag (Juergen Keil),
  doc/news.html: small update to avoid line join while generating NEWS. (Patrick Monnerat),
  Add methods for python3 iterator (Ron Angeles),
  Support element node traversal in document fragments. (Kyle VanderBeek),
  xmlNodeSetName: Allow setting the name to a substring of the currently set name (Tristan Van Berkom),
  Added macros for argument casts (Eric Zurcher),
  adding init calls to xml and html Read parsing entry points (Daniel Veillard),
  Get rid of 'REPLACEMENT CHARACTER' Unicode chars in xmlschemas.c (Jan Pokorný),
  Implement choice for name classes on attributes (Shaun McCance),
  Two small namespace tweaks (Daniel Veillard),
  xmllint --memory should fail on empty files (Daniel Veillard),
  Cast encoding name to char pointer to match arg type (Nikolay Sivov)
  
   - Cleanups:
  Removal of old configure.in (Daniel Veillard),
  Unreachable code in tree.c (Gaurav Gupta),
  Remove a couple of dead conditions (Gaurav Gupta),
  Avoid some dead code and cleanup in relaxng.c (Gaurav),
  Drop not needed checks (Denis Pauk),
  Fix a wrong test (Daniel Veillard)
  


2.9.1: Apr 19 2013:
   -  Features:
    Support for Python3 (Daniel Veillard),
    Add xmlXPathSetContextNode and xmlXPathNodeEval (Alex Bligh)
  
   -  Documentation:
    Add documentation for xmllint --xpath (Daniel Veillard),
    Fix the URL of the SAX documentation from James (Daniel Veillard),
    Fix spelling of "length". (Michael Wood)
  
   -  Portability:
    Fix python bindings with versions older than 2.7 (Daniel Veillard),
    rebuild docs:Makefile.am (Roumen Petrov),
    elfgcchack.h after rebuild in doc (Roumen Petrov),
    elfgcchack for buf module (Roumen Petrov),
    Fix a uneeded and wrong extra link parameter (Daniel Veillard),
    Few cleanup patches for Windows (Denis Pauk),
    Fix rpmbuild --nocheck (Mark Salter),
    Fix for win32/configure.js and WITH_THREAD_ALLOC (Daniel Richard),
    Fix Broken multi-arch support in xml2-config (Daniel Veillard),
    Fix a portability issue for GCC < 3.4.0 (Daniel Veillard),
    Windows build fixes (Daniel Richard),
    Fix a thread portability problem (Friedrich Haubensak),
    Downgrade autoconf requirement to 2.63 (Daniel Veillard)
  
   -  Bug Fixes:
    Fix a linking error for python bindings (Daniel Veillard),
    Fix a couple of return without value (Jüri Aedla),
    Improve the hashing functions (Daniel Franke),
    Improve handling of xmlStopParser() (Daniel Veillard),
    Remove risk of lockup in dictionary initialization (Daniel Veillard),
    Activate detection of encoding in external subset (Daniel Veillard),
    Fix an output buffer flushing conversion bug (Mikhail Titov),
    Fix an old bug in xmlSchemaValidateOneElement (Csaba László),
    Fix configure cannot remove messages (Gilles Espinasse),
    fix schema validation in combination with xsi:nil (Daniel Veillard),
    xmlCtxtReadFile doesn't work with literal IPv6 URLs (Steve Wolf),
    Fix a few problems with setEntityLoader (Alexey Neyman),
    Detect excessive entities expansion upon replacement (Daniel Veillard),
    Fix the flushing out of raw buffers on encoding conversions (Daniel,
Veillard),
    Fix some buffer conversion issues (Daniel Veillard),
    When calling xmlNodeDump make sure we grow the buffer quickly (Daniel,
Veillard),
    Fix an error in the progressive DTD parsing code (Dan Winship),
    xmllint should not load DTD by default when using the reader (Daniel,
Veillard),
    Try IBM-037 when looking for EBCDIC handlers (Petr Sumbera),
    Fix potential out of bound access (Daniel Veillard),
    Fix large parse of file from memory (Daniel Veillard),
    Fix a bug in the nsclean option of the parser (Daniel Veillard),
    Fix a regression in 2.9.0 breaking validation while streaming (Daniel,
Veillard),
    Remove potential calls to exit() (Daniel Veillard)
  
   -  Improvements:
    Regenerated API, and testapi, rebuild documentation (Daniel Veillard),
    Fix tree iterators broken by 2to3 script (Daniel Veillard),
    update all tests for Python3 and Python2 (Daniel Veillard),
    A few more fixes for python 3 affecting libxml2.py (Daniel Veillard),
    Fix compilation on Python3 (Daniel Veillard),
    Converting apibuild.py to python3 (Daniel Veillard),
    First pass at starting porting to python3 (Daniel Veillard),
    updated configure.in for python3 (Daniel Veillard),
    Add support for xpathRegisterVariable in Python (Shaun McCance),
    Added a regression tests from bug 694228 data (Daniel Veillard),
    Cache presence of '<' in entities content (Daniel Veillard),
    Avoid extra processing on entities (Daniel Veillard),
    Python binding for xmlRegisterInputCallback (Alexey Neyman),
    Python bindings: DOM casts everything to xmlNode (Alexey Neyman),
    Define LIBXML_THREAD_ALLOC_ENABLED via xmlversion.h (Tim Starling),
    Adding streaming validation to runtest checks (Daniel Veillard),
    Add a --pushsmall option to xmllint (Daniel Veillard)
  
   -  Cleanups:
    Switched comment in file to UTF-8 encoding (Daniel Veillard),
    Extend gitignore (Daniel Veillard),
    Silent the new python test on input (Alexey Neyman),
    Cleanup of a duplicate test (Daniel Veillard),
    Cleanup on duplicate test expressions (Daniel Veillard),
    Fix compiler warning after 153cf15905cf4ec080612ada6703757d10caba1e (Patrick,
Gansterer),
    Spec cleanups and a fix for multiarch support (Daniel Veillard),
    Silence a clang warning (Daniel Veillard),
    Cleanup the Copyright to be pure MIT Licence wording (Daniel Veillard),
    rand_seed should be static in dict.c (Wouter Van Rooy),
    Fix typos in parser comments (Jan Pokorný)
  


2.9.0: Sep 11 2012:
   -  Features:
    A few new API entry points,
    More resilient push parser mode,
    A lot of portability improvement,
    Faster XPath evaluation
  
   -  Documentation:
    xml2-config.1 markup error (Christian Weisgerber),
    libxml(3) manpage typo fix (John Bradshaw),
    More cleanups to the documentation part of libxml2 (Daniel Richard G)
  
   -  Portability:
    Bug 676544 - fails to build with --without-sax1 (Akira TAGOH),
    fix builds not having stdint.h (Rob Richards),
    GetProcAddressA is available only on WinCE (Daniel Veillard),
    More updates and cleanups on autotools and Makefiles (Daniel Richard G),
    More changes for Win32 compilation (Eric Zurcher),
    Basic changes for Win32 builds of release 2.9.0: compile buf.c (Eric Zurcher),
    Bundles all generated files for python into the distribution (Daniel Richard G),
    Fix compiler warnings of wincecompat.c (Patrick Gansterer),
    Fix non __GNUC__ build (Patrick Gansterer),
    Fix windows unicode build (Patrick Gansterer),
    clean redefinition of {v}snprintf in C-source (Roumen Petrov),
    use xmlBuf... if DEBUG_INPUT is defined (Roumen Petrov),
    fix runtests to use pthreads support for various Unix platforms (Daniel Richard G),
    Various "make distcheck" and portability fixups 2nd part (Daniel Richard G),
    Various "make distcheck" and portability fixups (Daniel Richard G),
    Fix compilation on older Visual Studio (Daniel Veillard)
  
   -  Bug Fixes:
    Change the XPath code to percolate allocation errors (Daniel Veillard),
    Fix reuse of xmlInitParser (Daniel Veillard),
    Fix potential crash on entities errors (Daniel Veillard),
    initialize var (Rob Richards),
    Fix the XPath arity check to also check the XPath stack limits (Daniel Veillard),
    Fix problem with specific and generic error handlers (Pietro Cerutti),
    Avoid a potential infinite recursion (Daniel Veillard),
    Fix an XSD error when generating internal automata (Daniel Veillard),
    Patch for xinclude of text using multibyte characters (Vitaly Ostanin),
    Fix a segfault on XSD validation on pattern error (Daniel Veillard),
    Fix missing xmlsave.h module which was ignored in recent builds (Daniel Veillard),
    Add a missing element check (Daniel Veillard),
    Adding various checks on node type though the API (Daniel Veillard),
    Namespace nodes can't be unlinked with xmlUnlinkNode (Daniel Veillard),
    Fix make dist to include new private header files (Daniel Veillard),
    More fixups on the push parser behaviour (Daniel Veillard),
    Strengthen behaviour of the push parser in problematic situations (Daniel Veillard),
    Enforce XML_PARSER_EOF state handling through the parser (Daniel Veillard),
    Fixup limits parser (Daniel Veillard),
    Do not fetch external parsed entities (Daniel Veillard),
    Fix an error in previous commit (Aron Xu),
    Fix entities local buffers size problems (Daniel Veillard),
    Fix parser local buffers size problems (Daniel Veillard),
    Fix a failure to report xmlreader parsing failures (Daniel Veillard)
  
   -  Improvements:
    Keep libxml2.syms when running "make distclean" (Daniel Veillard),
    Allow to set the quoting character of an xmlWriter (Csaba Raduly),
    Keep non-significant blanks node in HTML parser (Daniel Veillard),
    Add a forbidden variable error number and message to XPath (Daniel Veillard),
    Support long path names on WNT (Michael Stahl),
    Improve HTML escaping of attribute on output (Daniel Veillard),
    Handle ICU_LIBS as LIBADD, not LDFLAGS to prevent linking errors (Arfrever Frehtes Taifersar Arahesis),
    Switching XPath node sorting to Timsort (Vojtech Fried),
    Optimizing '//' in XPath expressions (Nick Wellnhofer),
    Expose xmlBufShrink in the public tree API (Daniel Veillard),
    Visible HTML elements close the head tag (Conrad Irwin),
    Fix file and line report for XSD SAX and reader streaming validation (Daniel Veillard),
    Fix const qualifyer to definition of xmlBufferDetach (Daniel Veillard),
    minimize use of HAVE_CONFIG_H (Roumen Petrov),
    fixup regression in Various "make distcheck" and portability fixups (Roumen Petrov),
    Add support for big line numbers in error reporting (Daniel Veillard),
    Avoid using xmlBuffer for serialization (Daniel Veillard),
    Improve compatibility between xmlBuf and xmlBuffer (Daniel Veillard),
    Provide new accessors for xmlOutputBuffer (Daniel Veillard),
    Improvements for old buffer compatibility (Daniel Veillard),
    Expand the limit test program (Daniel Veillard),
    Improve error reporting on parser errors (Daniel Veillard),
    Implement some default limits in the XPath module (Daniel Veillard),
    Introduce some default parser limits (Daniel Veillard),
    Cleanups and new limit APIs for dictionaries (Daniel Veillard),
    Fixup for buf.c (Daniel Veillard),
    Cleanup URI module memory allocation code (Daniel Veillard),
    Extend testlimits (Daniel Veillard),
    More avoid quadratic behaviour (Daniel Veillard),
    Impose a reasonable limit on PI size (Daniel Veillard),
    first version of testlimits new test (Daniel Veillard),
    Avoid quadratic behaviour in some push parsing cases (Daniel Veillard),
    Impose a reasonable limit on comment size (Daniel Veillard),
    Impose a reasonable limit on attribute size (Daniel Veillard),
    Harden the buffer code and make it more compatible (Daniel Veillard),
    More cleanups for input/buffers code (Daniel Veillard),
    Cleanup function xmlBufResetInput(), to set input from Buffer (Daniel Veillard)
    Switch the test program for characters to new input buffers (Daniel Veillard),
    Convert the HTML tree module to the new buffers (Daniel Veillard),
    Convert of the HTML parser to new input buffers (Daniel Veillard),
    Convert the writer to new output buffer and save APIs (Daniel Veillard),
    Convert XMLReader to the new input buffers (Daniel Veillard),
    New saving functions using xmlBuf and conversion (Daniel Veillard),
    Provide new xmlBuf based saving functions (Daniel Veillard),
    Convert XInclude to the new input buffers (Daniel Veillard),
    Convert catalog code to the new input buffers (Daniel Veillard),
    Convert C14N to the new Input buffer (Daniel Veillard),
    Convert xmlIO.c to the new input and output buffers (Daniel Veillard),
    Convert XML parser to the new input buffers (Daniel Veillard),
    Incompatible change to the Input and Output buffers (Daniel Veillard),
    Adding new encoding function to deal with the new structures (Daniel Veillard),
    Convert XPath to xmlBuf (Daniel Veillard),
    Adding a new buf module for buffers (Daniel Veillard),
    Memory error within SAX2 reuse common framework (Daniel Veillard),
    Fix xmllint --xpath node initialization (Daniel Veillard)
  
   -  Cleanups:
    Various cleanups to avoid compiler warnings (Daniel Veillard),
    Big space and tab cleanup (Daniel Veillard),
    Followup to LibXML2 docs/examples cleanup patch (Daniel Veillard),
    Second round of cleanups for LibXML2 docs/examples (Daniel Richard),
    Remove all .cvsignore as they are not used anymore (Daniel Veillard),
    Fix a Timsort function helper comment (Daniel Veillard),
    Small cleanup for valgrind target (Daniel Veillard),
    Patch for portability of latin characters in C files (Daniel Veillard),
    Cleanup some of the parser code (Daniel Veillard),
    Fix a variable name in comment (Daniel Veillard),
    Regenerated testapi.c (Daniel Veillard),
    Regenerating docs and API files (Daniel Veillard),
    Small cleanup of unused variables in test (Daniel Veillard),
    Expand .gitignore with more files (Daniel Veillard)
  


2.8.0: May 23 2012:
   - Features:
  add lzma compression support (Anders F Bjorklund)
  
   - Documentation:
    xmlcatalog: Add uri and delegateURI to possible add types in man page. (Ville Skyttä),
    Update README.tests (Daniel Veillard),
    URI handling code is not OOM resilient (Daniel Veillard),
    Fix an error in comment (Daniel Veillard),
    Fixed bug #617016 (Daniel Mustieles),
    Fixed two typos in the README document (Daniel Neel),
    add generated html files (Anders F Bjorklund),
    Clarify the need to use xmlFreeNode after xmlUnlinkNode (Daniel Veillard),
    Improve documentation a bit (Daniel Veillard),
    Updated URL for lxml python bindings (Daniel Veillard)
  
   - Portability:
    Restore code for Windows compilation (Daniel Veillard),
    Remove git error message during configure (Christian Dywan),
    xmllint: Build fix for endTimer if !defined(HAVE_GETTIMEOFDAY) (Patrick R. Gansterer),
    remove a bashism in confgure.in (John Hein),
    undef ERROR if already defined (Patrick R. Gansterer),
    Fix library problems with mingw-w64 (Michael Cronenworth),
    fix windows build. ifdef addition from bug 666491 makes no sense (Rob Richards),
    prefer native threads on win32 (Sam Thursfield),
    Allow to compile with Visual Studio 2010 (Thomas Lemm),
    Fix mingw's snprintf configure check (Andoni Morales),
    fixed a 64bit big endian issue (Marcus Meissner),
    Fix portability failure if netdb.h lacks NO_ADDRESS (Daniel Veillard),
    Fix windows build from lzma addition (Rob Richards),
    autogen: Only check for libtoolize (Colin Walters),
    Fix the Windows build files (Patrick von Reth),
    634846 Remove a linking option breaking Windows VC10 (Daniel Veillard),
    599241 fix an initialization problem on Win64 (Andrew W. Nosenko),
    fix win build (Rob Richards)
  
   - Bug fixes:
    Part for rand_r checking missing (Daniel Veillard),
    Cleanup on randomization (Daniel Veillard),
    Fix undefined reference in python module (Pacho Ramos),
    Fix a race in xmlNewInputStream (Daniel Veillard),
    Fix weird streaming RelaxNG errors (Noam),
    Fix various bugs in new code raised by the API checking (Daniel Veillard),
    Fix various problems with "make dist" (Daniel Veillard),
    Fix a memory leak in the xzlib code (Daniel Veillard),
    HTML parser error with <noscript> in the <head> (Denis Pauk),
    XSD: optional element in complex type extension (Remi Gacogne),
    Fix html serialization error and htmlSetMetaEncoding() (Daniel Veillard),
    Fix a wrong return value in previous patch (Daniel Veillard),
    Fix an uninitialized variable use (Daniel Veillard),
    Fix a compilation problem with --minimum (Brandon Slack),
    Remove redundant and ungarded include of resolv.h (Daniel Veillard),
    xinclude with parse="text" does not use the entity loader (Shaun McCance),
    Allow to parse 1 byte HTML files (Denis Pauk),
    Patch that fixes the skipping of the HTML_PARSE_NOIMPLIED flag (Martin Schröder),
    Avoid memory leak if xmlParserInputBufferCreateIO fails (Lin Yi-Li),
    Prevent an infinite loop when dumping a node with encoding problems (Timothy Elliott),
    xmlParseNodeInContext problems with an empty document (Tim Elliott),
    HTML element position is not detected properly (Pavel Andrejs),
    Fix an off by one pointer access (Jüri Aedla),
    Try to fix a problem with entities in SAX mode (Daniel Veillard),
    Fix a crash with xmllint --path on empty results (Daniel Veillard),
    Fixed bug #667946 (Daniel Mustieles),
    Fix a logic error in Schemas Component Constraints (Ryan Sleevi),
    Fix a wrong enum type use in Schemas Types (Nico Weber),
    Fix SAX2 builder in case of undefined attributes namespace (Daniel Veillard),
    Fix SAX2 builder in case of undefined element namespaces (Daniel Veillard),
    fix reference to STDOUT_FILENO on MSVC (Tay Ray Chuan),
    fix a pair of possible out of array char references (Daniel Veillard),
    Fix an allocation error when copying entities (Daniel Veillard),
    Make sure the parser returns when getting a Stop order (Chris Evans),
    Fix some potential problems on reallocation failures(parser.c) (Xia Xinfeng),
    Fix a schema type duration comparison overflow (Daniel Veillard),
    Fix an unimplemented part in RNG value validation (Daniel Veillard),
    Fix missing error status in XPath evaluation (Daniel Veillard),
    Hardening of XPath evaluation (Daniel Veillard),
    Fix an off by one error in encoding (Daniel Veillard),
    Fix RELAX NG include bug #655288 (Shaun McCance),
    Fix XSD validation bug #630130 (Toyoda Eizi),
    Fix some potential problems on reallocation failures (Chris Evans),
    __xmlRaiseError: fix use of the structured callback channel (Dmitry V. Levin),
    __xmlRaiseError: fix the structured callback channel's data initialization (Dmitry V. Levin),
    Fix memory corruption when xmlParseBalancedChunkMemoryInternal is called from xmlParseBalancedChunk (Rob Richards),
    Small fix for previous commit (Daniel Veillard),
    Fix a potential freeing error in XPath (Daniel Veillard),
    Fix a potential memory access error (Daniel Veillard),
    Reactivate the shared library versioning script (Daniel Veillard)
  
   - Improvements:
    use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime (Roumen Petrov),
    New symbols added for the next release (Daniel Veillard),
    xmlTextReader bails too quickly on error (Andy Lutomirski),
    Use a hybrid allocation scheme in xmlNodeSetContent (Conrad Irwin),
    Use buffers when constructing string node lists. (Conrad Irwin),
    Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk),
    wrong message for double hyphen in comment XML error (Bryan Henderson),
    Fix "make tst" to grab lzma lib too (Daniel Veillard),
    Add "whereis" command to xmllint shell (Ryan),
    Improve xmllint shell (Ryan),
    add function xmlTextReaderRelaxNGValidateCtxt() (Noam Postavsky),
    Add --system support to autogen.sh (Daniel Veillard),
    Add hash randomization to hash and dict structures (Daniel Veillard),
    included xzlib in dist (Anders F Bjorklund),
    move xz/lzma helpers to separate included files (Anders F Bjorklund),
    add generated devhelp files (Anders F Bjorklund),
    add XML_WITH_LZMA to api (Anders F Bjorklund),
    autogen.sh: Honor NOCONFIGURE environment variable (Colin Walters),
    Improve the error report on undefined REFs (Daniel Veillard),
    Add exception for new W3C PI xml-model (Daniel Veillard),
    Add options to ignore the internal encoding (Daniel Veillard),
    testapi: use the right type for the check (Stefan Kost),
    various: handle return values of write calls (Stefan Kost),
    testWriter: xmlTextWriterWriteFormatElement wants an int instead of a long int (Stefan Kost),
    runxmlconf: update to latest testsuite version (Stefan Kost),
    configure: add -Wno-long-long to CFLAGS (Stefan Kost),
    configure: support silent automake rules if possible (Stefan Kost),
    xmlmemory: add a cast as size_t has no portable printf modifier (Stefan Kost),
    __xmlRaiseError: remove redundant schannel initialization (Dmitry V. Levin),
    __xmlRaiseError: do cheap code check early (Dmitry V. Levin)
  
   - Cleanups:
    Cleanups before 2.8.0-rc2 (Daniel Veillard),
    Avoid an extra operation (Daniel Veillard),
    Remove vestigial de-ANSI-fication support. (Javier Jardón),
    autogen.sh: Fix typo (Javier Jardón),
    Do not use unsigned but unsigned int (Daniel Veillard),
    Remove two references to u_short (Daniel Veillard),
    Fix -Wempty-body warning from clang (Nico Weber),
    Cleanups of lzma support (Daniel Veillard),
    Augment the list of ignored files (Daniel Veillard),
    python: remove unused variable (Stefan Kost),
    python: flag two unused args (Stefan Kost),
    configure: acconfig.h is deprecated since autoconf-2.50 (Stefan Kost),
    xpath: remove unused variable (Stefan Kost)
  


2.7.8: Nov 4 2010:
   -  Features:
    480323 add code to plug in ICU converters by default (Giuseppe Iuculano),
    Add xmlSaveOption XML_SAVE_WSNONSIG (Adam Spragg)
  
   -  Documentation:
    Fix devhelp documentation installation (Mike Hommey),
    Fix web site encoding problems (Daniel Veillard),
    Fix a couple of typo in HTML parser error messages (Michael Day),
    Forgot to update the news page for 0.7.7 (Daniel Veillard)
  
   -  Portability:
    607273 Fix python detection on MSys/Windows (LRN),
    614087 Fix Socket API usage to allow Windows64 compilation (Ozkan Sezer),
    Fix compilation with Clang (Koop Mast),
    Fix Win32 build (Rob Richards)
  
   -  Bug Fixes:
    595789 fix a remaining potential Solaris problem (Daniel Veillard),
    617468 fix progressive HTML parsing with style using "'" (Denis Pauk),
    616478 Fix xmllint shell write command (Gwenn Kahz),
    614005 Possible erroneous HTML parsing on unterminated script (Pierre Belzile),
    627987 Fix XSD IDC errors in imported schemas (Jim Panetta),
    629325 XPath rounding errors first cleanup (Phil Shafer),
    630140 fix iso995x encoding error (Daniel Veillard),
    make sure htmlCtxtReset do reset the disableSAX field (Daniel Veillard),
    Fix a change of semantic on XPath preceding and following axis (Daniel Veillard),
    Fix a potential segfault due to weak symbols on pthreads (Mike Hommey),
    Fix a leak in XPath compilation (Daniel Veillard),
    Fix the semantic of XPath axis for namespace/attribute context nodes (Daniel Veillard),
    Avoid a descriptor leak in catalog loading code (Carlo Bramini),
    Fix a small bug in XPath evaluation code (Marius Wachtler),
    Fix handling of XML-1.0 XML namespace declaration (Daniel Veillard),
    Fix errors in XSD double validation check (Csaba Raduly),
    Fix handling of apos in URIs (Daniel Veillard),
    xmlTextReaderReadOuterXml should handle DTD (Rob Richards),
    Autogen.sh needs to create m4 directory (Rob Richards)
  
   -  Improvements:
    606592 update language ID parser to RFC 5646 (Daniel Veillard),
    Sort python generated stubs (Mike Hommey),
    Add an HTML parser option to avoid a default doctype (Daniel Veillard)
  
   -  Cleanups:
    618831 don't ship generated files in git (Adrian Bunk),
    Switch from the obsolete mkinstalldirs to AC_PROG_MKDIR_P (Adrian Bunk),
    Various cleanups on encoding handling (Daniel Veillard),
    Fix xmllint to use format=1 for default formatting (Adam Spragg),
    Force _xmlSaveCtxt.format to be 0 or 1 (Adam Spragg),
    Cleanup encoding pointer comparison (Nikolay Sivov),
    Small code cleanup on previous patch (Daniel Veillard)
  


2.7.7: Mar 15 2010:
   -  Improvements:
    Adding a --xpath option to xmllint (Daniel Veillard),
    Make HTML parser non-recursive (Eugene Pimenov)
  
   -  Portability:
    relaxng.c: cast to allow compilation with sun studio 11 (Ben Walton),
    Fix build failure on Sparc solaris (Roumen Petrov),
    use autoreconf in autogen.sh (Daniel Veillard),
    Fix build with mingw (Roumen Petrov),
    Upgrade some of the configure and autogen (Daniel Veillard),
    Fix relaxNG tests in runtest for Windows runtest.c: initialize ret (Rob Richards),
    Fix a const warning in xmlNodeSetBase (Martin Trappel),
    Fix python generator to not use deprecated xmllib (Daniel Veillard),
    Update some automake files (Daniel Veillard),
    598785 Fix nanohttp on Windows (spadix)
  
   -  Bug Fixes:
    libxml violates the zlib interface and crashes (Mark Adler),
    Fix broken escape behaviour in regexp ranges (Daniel Veillard),
    Fix  missing win32 libraries in libxml-2.0.pc (Volker Grabsch),
    Fix detection of python linker flags (Daniel Macks),
    fix build error in libxml2/python (Paul Smith),
    ChunkParser: Incorrect decoding of small xml files (Raul Hudea),
    htmlCheckEncoding doesn't update input-end after shrink (Eugene Pimenov),
    Fix a missing #ifdef (Daniel Veillard),
    Fix encoding selection for xmlParseInNodeContext (Daniel Veillard),
    xmlPreviousElementSibling mistake (François Delyon),
    608773 add a missing check in xmlGROW (Daniel Veillard),
    Fix xmlParseInNodeContext for HTML content (Daniel Veillard),
    Fix lost namespace when copying node * tree.c: reconcile namespace if not found (Rob Richards),
    Fix some missing commas in HTML element lists (Eugene Pimenov),
    Correct variable type to unsigned (Nikolay Sivov),
    Recognize ID attribute in HTML without DOCTYPE (Daniel Veillard),
    Fix memory leak in xmlXPathEvalExpression() (Martin),
    Fix an init bug in global.c (Kai Henning),
    Fix xmlNodeSetBase() comment (Daniel Veillard),
    Fix broken escape behaviour in regexp ranges (Daniel Veillard),
    Don't give default HTML boolean attribute values in parser (Daniel Veillard),
    xmlCtxtResetLastError should reset ctxt-errNo (Daniel Veillard)
  
   -  Cleanups:
    Cleanup a couple of weirdness in HTML parser (Eugene Pimenov)
  


2.7.6: Oct  6 2009:
   -  Bug Fixes:
     Restore thread support in default configuration (Andrew W. Nosenko),
     URI with no path parsing problem (Daniel Veillard),
     Minor patch for conditional defines in threads.c (Eric Zurcher)
  


2.7.5: Sep 24 2009:
   -  Bug Fixes:
    Restore behavior of --with-threads without argument (Andrew W. Nosenko),
    Fix memory leak when doc is NULL (Rob Richards),
    595792 fixing a RelaxNG bug introduced in 2.7.4 (Daniel Veillard),
    Fix a Relaxng bug raised by libvirt test suite (Daniel Veillard),
    Fix a parsing problem with little data at startup (Daniel Veillard),
    link python module with python library (Frederic Crozat),
    594874 Forgot an fclose in xmllint (Daniel Veillard)
  
   -  Cleanup:
    Adding symbols.xml to EXTRA_DIST (Daniel Veillard)
  


2.7.4: Sep 10 2009:
   - Improvements:
    Switch to GIT (GNOME),
    Add symbol versioning to libxml2 shared libs (Daniel Veillard)
  
   - Portability:
    593857 try to work around thread pbm MinGW 4.4 (Daniel Veillard),
    594250 rename ATTRIBUTE_ALLOC_SIZE to avoid clashes (Daniel Veillard),
    Fix Windows build * relaxng.c: fix windows build (Rob Richards),
    Fix the globals.h to use XMLPUBFUN (Paul Smith),
    Problem with extern extern in header (Daniel Veillard),
    Add -lnetwork for compiling on Haiku (Scott McCreary),
    Runtest portability patch for Solaris (Tim Rice),
    Small patch to accommodate the Haiku OS (Scott McCreary),
    584605 package VxWorks folder in the distribution (Daniel Veillard),
    574017 Realloc too expensive on most platform (Daniel Veillard),
    Fix windows build (Rob Richards),
    545579 doesn't compile without schema support (Daniel Veillard),
    xmllint use xmlGetNodePath when not compiled in (Daniel Veillard),
    Try to avoid __imp__xmlFree link trouble on msys (Daniel Veillard),
    Allow to select the threading system on Windows (LRN),
    Fix Solaris binary links, cleanups (Daniel Veillard),
    Bug 571059 – MSVC doesn't work with the bakefile (Intron),
    fix ATTRIBUTE_PRINTF header clash (Belgabor and Mike Hommey),
    fixes for Borland/CodeGear/Embarcadero compilers (Eric Zurcher)
  
   - Documentation:
    544910 typo: "renciliateNs" (Leonid Evdokimov),
    Add VxWorks to list of OSes (Daniel Veillard),
    Regenerate the documentation and update for git (Daniel Veillard),
    560524 ¿ xmlTextReaderLocalName description (Daniel Veillard),
    Added sponsoring by AOE media for the server (Daniel Veillard),
    updated URLs for GNOME (Vincent Lefevre),
    more warnings about xmlCleanupThreads and xmlCleanupParser (Daniel Veillard)
  
   - Bug fixes:
    594514 memory leaks - duplicate initialization (MOD),
    Wrong block opening in htmlNodeDumpOutputInternal (Daniel Veillard),
    492317 Fix  Relax-NG validation problems (Daniel Veillard),
    558452 fight with reg test and error report (Daniel Veillard),
    558452 RNG compilation of optional multiple child (Daniel Veillard),
    579746 XSD validation not correct / nilable groups (Daniel Veillard),
    502960 provide namespace stack when parsing entity (Daniel Veillard),
    566012 part 2 fix regression tests and push mode (Daniel Veillard),
    566012 autodetected encoding and encoding conflict (Daniel Veillard),
    584220 xpointer(/) and xinclude problems (Daniel Veillard),
    587663 Incorrect Attribute-Value Normalization (Daniel Veillard),
    444994 HTML chunked failure for attribute with <> (Daniel Veillard),
    Fix end of buffer char being split in XML parser (Daniel Veillard),
    Non ASCII character may be split at buffer end (Adiel Mittmann),
    440226 Add xmlXIncludeProcessTreeFlagsData API (Stefan Behnel),
    572129 speed up parsing of large HTML text nodes (Markus Kull),
    Fix HTML parsing with 0 character in CDATA (Daniel Veillard),
    Fix SetGenericErrorFunc and SetStructured clash (Wang Lam),
    566012  Incomplete EBCDIC parsing support (Martin Kogler),
    541335 HTML avoid creating 2 head or 2 body element (Daniel Veillard),
    541237 error correcting missing end tags in HTML (Daniel Veillard),
    583439 missing line numbers in push mode (Daniel Veillard),
    587867 xmllint --html --xmlout serializing as HTML (Daniel Veillard),
    559501 avoid select and use poll for nanohttp (Raphael Prevost),
    559410 -  Regexp bug on (...)? constructs (Daniel Veillard),
    Fix a small problem on previous HTML parser patch (Daniel Veillard),
    592430 -  HTML parser runs into endless loop (Daniel Veillard),
    447899 potential double free in xmlFreeTextReader (Daniel Veillard),
    446613 small validation bug mixed content with NS (Daniel Veillard),
    Fix the problem of revalidating a doc with RNG (Daniel Veillard),
    Fix xmlKeepBlanksDefault to not break indent (Nick Wellnhofer),
    512131 refs from externalRef part need to be added (Daniel Veillard),
    512131 crash in xmlRelaxNGValidateFullElement (Daniel Veillard),
    588441 allow '.' in HTML Names even if invalid (Daniel Veillard),
    582913 Fix htmlSetMetaEncoding() to be nicer (Daniel Veillard),
    579317 Try to find the HTML encoding information (Daniel Veillard),
    575875 don't output charset=html (Daniel Veillard),
    571271 fix semantic of xsd:all with minOccurs=0 (Daniel Veillard),
    570702 fix a bug in regexp determinism checking (Daniel Veillard),
    567619 xmlValidateNotationUse missing param test (Daniel Veillard),
    574393 ¿ utf-8 filename magic for compressed files (Hans Breuer),
    Fix a couple of problems in the parser (Daniel Veillard),
    585505 ¿ Document ids and refs populated by XSD (Wayne Jensen),
    582906 XSD validating multiple imports of the same schema (Jason Childs),
    Bug 582887 ¿ problems validating complex schemas (Jason Childs),
    Bug 579729 ¿ fix XSD schemas parsing crash (Miroslav Bajtos),
    576368 ¿ htmlChunkParser with special attributes (Jiri Netolicky),
    Bug 565747 ¿ relax anyURI data character checking (Vincent Lefevre),
    Preserve attributes of include start on tree copy (Petr Pajas),
    Skip silently unrecognized XPointer schemes (Jakub Wilk),
    Fix leak on SAX1, xmllint --sax1 option and debug (Daniel Veillard),
    potential NULL dereference on non-glibc (Jim Meyering),
    Fix an XSD validation crash (Daniel Veillard),
    Fix a regression in streaming entities support (Daniel Veillard),
    Fix a couple of ABI issues with C14N 1.1 (Aleksey Sanin),
    Aleksey Sanin support for c14n 1.1 (Aleksey Sanin),
    reader bug fix with entities (Daniel Veillard),
    use options from current parser ctxt for external entities (Rob Richards),
    581612 use %s to printf strings (Christian Persch),
    584605 change the threading initialization sequence (Igor Novoseltsev),
    580705 keep line numbers in HTML parser (Aaron Patterson),
    581803 broken HTML table attributes init (Roland Steiner),
    do not set error code in xmlNsWarn (Rob Richards),
    564217 fix structured error handling problems,
    reuse options from current parser for entities (Rob Richards),
    xmlXPathRegisterNs should not allow enpty prefixes (Daniel Veillard),
    add a missing check in xmlAddSibling (Kris Breuker),
    avoid leaks on errors (Jinmei Tatuya)
  
   - Cleanup:
    Chasing dead assignments reported by clang-scan (Daniel Veillard),
    A few more safety cleanup raised by scan (Daniel Veillard),
    Fixing assorted potential problems raised by scan (Daniel Veillard),
    Potential uninitialized arguments raised by scan (Daniel Veillard),
    Fix a bunch of scan 'dead increments' and cleanup (Daniel Veillard),
    Remove a pedantic warning (Daniel Veillard),
    555833 always use rm -f in uninstall-local (Daniel Veillard),
    542394 xmlRegisterOutputCallbacks MAX_INPUT_CALLBACK (Daniel Veillard),
    Autoregenerate libxml2.syms automated checkings (Daniel Veillard),
    Make xmlRecoverDoc const (Martin Trappel) (Daniel Veillard),
    Both args of xmlStrcasestr are const (Daniel Veillard),
    hide the nbParse* variables used for debugging (Mike Hommey),
    570806 changed include of config.h (William M. Brack),
    cleanups and error reports when xmlTextWriterVSprintf fails (Jinmei Tatuya)
  


2.7.3: Jan 18 2009:
   - Build fix: fix build when HTML support is not included.
   - Bug fixes: avoid memory overflow in gigantic text nodes,
      indentation problem on the writed (Rob Richards),
      xmlAddChildList pointer problem (Rob Richards and Kevin Milburn),
      xmlAddChild problem with attribute (Rob Richards and Kris Breuker),
      avoid a memory leak in an edge case (Daniel Zimmermann),
      deallocate some pthread data (Alex Ott).
   - Improvements: configure option to avoid rebuilding docs (Adrian Bunk),
      limit text nodes to 10MB max by default, add element traversal
      APIs, add a parser option to enable pre 2.7 SAX behavior (Rob Richards),
      add gcc malloc checking (Marcus Meissner), add gcc printf like functions
      parameters checking (Marcus Meissner).


2.7.2: Oct 3 2008:
   - Portability fix: fix solaris compilation problem, fix compilation
        if XPath is not configured in
   - Bug fixes: nasty entity bug introduced in 2.7.0, restore old behaviour
        when saving an HTML doc with an xml dump function, HTML UTF-8 parsing
        bug, fix reader custom error handlers (Riccardo Scussat)
    
   - Improvement: xmlSave options for more flexibility to save as
        XML/HTML/XHTML, handle leading BOM in HTML documents


2.7.1: Sep 1 2008:
   - Portability fix: Borland C fix (Moritz Both)
   - Bug fixes: python serialization wrappers, XPath QName corner
        case handking and leaks (Martin)
   - Improvement: extend the xmlSave to handle HTML documents and trees
   - Cleanup: python serialization wrappers


2.7.0: Aug 30 2008:
   - Documentation: switch ChangeLog to UTF-8, improve mutithreads and
      xmlParserCleanup docs
   - Portability fixes: Older Win32 platforms (Rob Richards), MSVC
      porting fix (Rob Richards), Mac OS X regression tests (Sven Herzberg),
      non GNUCC builds (Rob Richards), compilation on Haiku (Andreas Färber)
      
   - Bug fixes: various realloc problems (Ashwin), potential double-free
      (Ashwin), regexp crash, icrash with invalid whitespace facets (Rob
      Richards), pattern fix when streaming (William Brack), various XML
      parsing and validation fixes based on the W3C regression tests, reader
      tree skipping function fix (Ashwin), Schemas regexps escaping fix
      (Volker Grabsch), handling of entity push errors (Ashwin), fix a slowdown
      when encoder can't serialize characters on output
   - Code cleanup: compilation fix without the reader, without the output
      (Robert Schwebel), python whitespace (Martin), many space/tabs cleanups,
      serious cleanup of the entity handling code
   - Improvement: switch parser to XML-1.0 5th edition, add parsing flags
      for old versions, switch URI parsing to RFC 3986,
      add xmlSchemaValidCtxtGetParserCtxt (Holger Kaelberer),
      new hashing functions for dictionaries (based on Stefan Behnel work),
      improve handling of misplaced html/head/body in HTML parser, better
      regression test tools and code coverage display, better algorithms
      to detect various versions of the billion laughts attacks, make
      arbitrary parser limits avoidable as a parser option


2.6.32: Apr 8 2008:
   - Documentation: returning heap memory to kernel (Wolfram Sang),
      trying to clarify xmlCleanupParser() use, xmlXPathContext improvement
      (Jack Jansen), improve the *Recover* functions documentation,
      XmlNodeType doc link fix (Martijn Arts)
   - Bug fixes: internal subset memory leak (Ashwin), avoid problem with
      paths starting with // (Petr Sumbera), streaming XSD validation callback
      patches (Ashwin), fix redirection on port other than 80 (William Brack),
      SAX2 leak (Ashwin), XInclude fragment of own document (Chris Ryan),
      regexp bug with '.' (Andrew Tosh), flush the writer at the end of the
      document (Alfred Mickautsch), output I/O bug fix (William Brack),
      writer CDATA output after a text node (Alex Khesin), UTF-16 encoding
      detection (William Brack), fix handling of empty CDATA nodes for Safari
      team, python binding problem with namespace nodes, improve HTML parsing
      (Arnold Hendriks), regexp automata build bug, memory leak fix (Vasily
      Chekalkin), XSD test crash, weird system parameter entity parsing problem,
      allow save to file:///X:/ windows paths, various attribute normalisation
      problems, externalSubsetSplit fix (Ashwin), attribute redefinition in
      the DTD (Ashwin), fix in char ref parsing check (Alex Khesin), many
      out of memory handling fixes (Ashwin), XPath out of memory handling fixes
      (Alvaro Herrera), various realloc problems (Ashwin), UCS4 encoding
      conversion buffer size (Christian Fruth), problems with EatName
      functions on memory errors, BOM handling in external parsed entities
      (Mark Rowe)
   - Code cleanup: fix build under VS 2008 (David Wimsey), remove useless
      mutex in xmlDict (Florent Guilian), Mingw32 compilation fix (Carlo
      Bramini), Win and MacOS EOL cleanups (Florent Guiliani), iconv need
      a const detection (Roumen Petrov), simplify xmlSetProp (Julien Charbon),
      cross compilation fixes for Mingw (Roumen Petrov), SCO Openserver build
      fix (Florent Guiliani), iconv uses const on Win32 (Rob Richards),
      duplicate code removal (Ashwin), missing malloc test and error reports
      (Ashwin), VMS makefile fix (Tycho Hilhorst)
   - improvements: better plug of schematron in the normal error handling
      (Tobias Minich)


2.6.31: Jan 11 2008:
   - Security fix: missing of checks in UTF-8 parsing
   - Bug fixes: regexp bug, dump attribute from XHTML document, fix
      xmlFree(NULL) to not crash in debug mode, Schematron parsing crash
      (Rob Richards), global lock free on Windows (Marc-Antoine Ruel),
      XSD crash due to double free (Rob Richards), indentation fix in
      xmlTextWriterFullEndElement (Felipe Pena), error in attribute type
      parsing if attribute redeclared, avoid crash in hash list scanner if
      deleting elements, column counter bug fix (Christian Schmidt),
      HTML embed element saving fix (Stefan Behnel), avoid -L/usr/lib
      output from xml2-config (Fred Crozat), avoid an xmllint crash 
      (Stefan Kost), don't stop HTML parsing on out of range chars.
      
   - Code cleanup: fix open() call third argument, regexp cut'n paste
      copy error, unused variable in __xmlGlobalInitMutexLock (Hannes Eder),
      some make distcheck related fixes (John Carr)
   - Improvements: HTTP Header: includes port number (William Brack),
      testURI --debug option, 


2.6.30: Aug 23 2007:
   - Portability: Solaris crash on error handling, windows path fixes
      (Roland Schwarz and Rob Richards), mingw build (Roland Schwarz)
   - Bugfixes: xmlXPathNodeSetSort problem (William Brack), leak when
      reusing a writer for a new document (Dodji Seketeli), Schemas
      xsi:nil handling patch (Frank Gross), relative URI build problem
      (Patrik Fimml), crash in xmlDocFormatDump, invalid char in comment
      detection bug, fix disparity with xmlSAXUserParseMemory, automata
      generation for complex regexp counts problems, Schemas IDC import
      problems (Frank Gross), xpath predicate evailation error handling
      (William Brack)


2.6.29: Jun 12 2007:
   - Portability: patches from Andreas Stricke for WinCEi,
      fix compilation warnings (William Brack), avoid warnings on Apple OS/X
      (Wendy Doyle and Mark Rowe), Windows compilation and threading
      improvements (Rob Richards), compilation against old Python versions,
      new GNU tar changes (Ryan Hill)
   - Documentation: xmlURIUnescapeString comment, 
   - Bugfixes: xmlBufferAdd problem (Richard Jones), 'make valgrind'
      flag fix (Richard Jones), regexp interpretation of \,
      htmlCreateDocParserCtxt (Jean-Daniel Dupas), configure.in
      typo (Bjorn Reese), entity content failure, xmlListAppend() fix
      (Georges-André Silber), XPath number serialization (William Brack),
      nanohttp gzipped stream fix (William Brack and Alex Cornejo),
      xmlCharEncFirstLine typo (Mark Rowe), uri bug (François Delyon),
      XPath string value of PI nodes (William Brack), XPath node set
      sorting bugs (William Brack), avoid outputting namespace decl
      dups in the writer (Rob Richards), xmlCtxtReset bug, UTF-8 encoding
      error handling, recustion on next in catalogs, fix a Relax-NG crash,
      workaround wrong file: URIs, htmlNodeDumpFormatOutput on attributes,
      invalid character in attribute detection bug, big comments before 
      internal subset streaming bug, HTML parsing of attributes with : in
      the name, IDness of name in HTML (Dagfinn I. Mannsåker) 
   - Improvement: keep URI query parts in raw form (Richard Jones),
      embed tag support in HTML (Michael Day) 


2.6.28: Apr 17 2007:
   - Documentation: comment fixes (Markus Keim), xpath comments fixes too
      (James Dennett)
   - Bug fixes: XPath bug (William Brack), HTML parser autoclose stack usage
      (Usamah Malik), various regexp bug fixes (DV and William), path conversion
      on Windows (Igor Zlatkovic), htmlCtxtReset fix (Michael Day), XPath
      principal node of axis bug, HTML serialization of some codepoint
      (Steven Rainwater), user data propagation in XInclude (Michael Day),
      standalone and XML decl detection (Michael Day), Python id output
      for some id, fix the big python string memory leak, URI parsing fixes
      (Stéphane Bidoul and William), long comments parsing bug (William),
      concurrent threads initialization (Ted Phelps), invalid char
      in text XInclude (William), XPath memory leak (William), tab in
      python problems (Andreas Hanke), XPath node comparison error
      (Oleg Paraschenko), cleanup patch for reader (Julien Reichel),
      XML Schemas attribute group (William), HTML parsing problem (William),
      fix char 0x2d in regexps (William), regexp quantifier range with
      min occurs of 0 (William), HTML script/style parsing (Mike Day)
   - Improvement: make xmlTextReaderSetup() public
   - Compilation and postability: fix a missing include problem (William),
      __ss_family on AIX again (Björn Wiberg), compilation without zlib
      (Michael Day), catalog patch for Win32 (Christian Ehrlicher),
      Windows CE fixes (Andreas Stricke)
   - Various CVS to SVN infrastructure changes


2.6.27: Oct 25 2006:
   - Portability fixes: file names on windows (Roland Schwingel, 
      Emelyanov Alexey), windows compile fixup (Rob Richards), 
      AIX iconv() is apparently case sensitive
   - improvements: Python XPath types mapping (Nic Ferrier), XPath optimization
      (Kasimier), add xmlXPathCompiledEvalToBoolean (Kasimier), Python node
      equality and comparison (Andreas Pakulat), xmlXPathCollectAndTest
      improvememt (Kasimier), expose if library was compiled with zlib 
      support (Andrew Nosenko), cache for xmlSchemaIDCMatcher structs
      (Kasimier), xmlTextConcat should work with comments and PIs (Rob
      Richards), export htmlNewParserCtxt needed by Michael Day, refactoring
      of catalog entity loaders (Michael Day), add XPointer support to 
      python bindings (Ross Reedstrom, Brian West and Stefan Anca), 
      try to sort out most file path to URI conversions and xmlPathToUri,
      add --html --memory case to xmllint
   - building fix: fix --with-minimum (Felipe Contreras), VMS fix, 
      const'ification of HTML parser structures (Matthias Clasen),
      portability fix (Emelyanov Alexey), wget autodetection (Peter
      Breitenlohner),  remove the build path recorded in the python
      shared module, separate library flags for shared and static builds
      (Mikhail Zabaluev), fix --with-minimum --with-sax1 builds, fix
      --with-minimum --with-schemas builds
   - bug fix: xmlGetNodePath fix (Kasimier), xmlDOMWrapAdoptNode and
      attribute (Kasimier), crash when using the recover mode, 
      xmlXPathEvalExpr problem (Kasimier), xmlXPathCompExprAdd bug (Kasimier),
      missing destroy in xmlFreeRMutex (Andrew Nosenko), XML Schemas fixes
      (Kasimier), warning on entities processing, XHTML script and style
      serialization (Kasimier), python generator for long types, bug in
      xmlSchemaClearValidCtxt (Bertrand Fritsch), xmlSchemaXPathEvaluate
      allocation bug (Marton Illes), error message end of line (Rob Richards),
      fix attribute serialization in writer (Rob Richards), PHP4 DTD validation
      crash, parser safety patch (Ben Darnell), _private context propagation
      when parsing entities (with Michael Day), fix entities behaviour when 
      using SAX, URI to file path fix (Mikhail Zabaluev), disappearing validity
      context, arg error in SAX callback (Mike Hommey), fix mixed-content
      autodetect when using --noblanks, fix xmlIOParseDTD error handling,
      fix bug in xmlSplitQName on special Names, fix Relax-NG element content
      validation bug, fix xmlReconciliateNs bug, fix potential attribute 
      XML parsing bug, fix line/column accounting in XML parser, chunking bug
      in the HTML parser on script, try to detect obviously buggy HTML
      meta encoding indications, bugs with encoding BOM and xmlSaveDoc, 
      HTML entities in attributes parsing, HTML minimized attribute values,
      htmlReadDoc and htmlReadIO were broken, error handling bug in
      xmlXPathEvalExpression (Olaf Walkowiak), fix a problem in
      htmlCtxtUseOptions, xmlNewInputFromFile could leak (Marius Konitzer),
      bug on misformed SSD regexps (Christopher Boumenot)
      
   - documentation: warning about XML_PARSE_COMPACT (Kasimier Buchcik),
      fix xmlXPathCastToString documentation, improve man pages for
      xmllitn and xmlcatalog (Daniel Leidert), fixed comments of a few
      functions


2.6.26: Jun 6 2006:
   - portability fixes: Python detection (Joseph Sacco), compilation
    error(William Brack and Graham Bennett), LynxOS patch (Olli Savia)
   - bug fixes: encoding buffer problem, mix of code and data in
    xmlIO.c(Kjartan Maraas), entities in XSD validation (Kasimier Buchcik),
    variousXSD validation fixes (Kasimier), memory leak in pattern (Rob
    Richards andKasimier), attribute with colon in name (Rob Richards), XPath
    leak inerror reporting (Aleksey Sanin), XInclude text include of
    selfdocument.
   - improvements: Xpath optimizations (Kasimier), XPath object
    cache(Kasimier)


2.6.25: Jun 6 2006::
Do not use or package 2.6.25
2.6.24: Apr 28 2006:
   - Portability fixes: configure on Windows, testapi compile on windows
      (Kasimier Buchcik, venkat naidu), Borland C++ 6 compile (Eric Zurcher),
      HP-UX compiler workaround (Rick Jones), xml2-config bugfix, gcc-4.1
      cleanups, Python detection scheme (Joseph Sacco), UTF-8 file paths on
      Windows (Roland Schwingel).
      
   - Improvements: xmlDOMWrapReconcileNamespaces xmlDOMWrapCloneNode (Kasimier
      Buchcik), XML catalog debugging (Rick Jones), update to Unicode 4.01.
   - Bug fixes: xmlParseChunk() problem in 2.6.23, xmlParseInNodeContext()
      on HTML docs, URI behaviour on Windows (Rob Richards), comment streaming
      bug, xmlParseComment (with William Brack), regexp bug fixes (DV &
      Youri Golovanov), xmlGetNodePath on text/CDATA (Kasimier),
      one Relax-NG interleave bug, xmllint --path and --valid,
      XSD bugfixes (Kasimier), remove debug
      left in Python bindings (Nic Ferrier), xmlCatalogAdd bug (Martin Cole),
      xmlSetProp fixes (Rob Richards), HTML IDness (Rob Richards), a large
      number of cleanups and small fixes based on Coverity reports, bug
      in character ranges, Unicode tables const (Aivars Kalvans), schemas
      fix (Stefan Kost), xmlRelaxNGParse error deallocation, 
      xmlSchemaAddSchemaDoc error deallocation, error handling on unallowed
      code point, ixmllint --nonet to never reach the net (Gary Coady),
      line break in writer after end PI (Jason Viers). 
   - Documentation: man pages updates and cleanups (Daniel Leidert).
   - New features: Relax NG structure error handlers.


2.6.23: Jan 5 2006:
   - portability fixes: Windows (Rob Richards), getaddrinfo on Windows
    (Kolja Nowak, Rob Richards), icc warnings (Kjartan Maraas),
    --with-minimum compilation fixes (William Brack), error case handling fix
    on Solaris (Albert Chin), don't use 'list' as parameter name reported by
    Samuel Diaz Garcia, more old Unices portability fixes (Albert Chin),
    MinGW compilation (Mark Junker), HP-UX compiler warnings (Rick
  Jones),
   - code cleanup: xmlReportError (Adrian Mouat), remove xmlBufferClose
    (Geert Jansen), unreachable code (Oleksandr Kononenko), refactoring
    parsing code (Bjorn Reese)
   - bug fixes: xmlBuildRelativeURI and empty path (William Brack),
    combinatory explosion and performances in regexp code, leak in
    xmlTextReaderReadString(), xmlStringLenDecodeEntities problem (Massimo
    Morara), Identity Constraints bugs and a segfault (Kasimier Buchcik),
    XPath pattern based evaluation bugs (DV & Kasimier),
    xmlSchemaContentModelDump() memory leak (Kasimier), potential leak in
    xmlSchemaCheckCSelectorXPath(), xmlTextWriterVSprintf() misuse of
    vsnprintf (William Brack), XHTML serialization fix (Rob Richards), CRLF
    split problem (William), issues with non-namespaced attributes in
    xmlAddChild() xmlAddNextSibling() and xmlAddPrevSibling() (Rob Richards),
    HTML parsing of script, Python must not output to stdout (Nic Ferrier),
    exclusive C14N namespace visibility (Aleksey Sanin), XSD datatype
    totalDigits bug (Kasimier Buchcik), error handling when writing to an
    xmlBuffer (Rob Richards), runtest schemas error not reported (Hisashi
    Fujinaka), signed/unsigned problem in date/time code (Albert Chin), fix
    XSI driven XSD validation (Kasimier), parsing of xs:decimal (Kasimier),
    fix DTD writer output (Rob Richards), leak in xmlTextReaderReadInnerXml
    (Gary Coady), regexp bug affecting schemas (Kasimier), configuration of
    runtime debugging (Kasimier), xmlNodeBufGetContent bug on entity refs
    (Oleksandr Kononenko), xmlRegExecPushString2 bug (Sreeni Nair),
    compilation and build fixes (Michael Day), removed dependencies on
    xmlSchemaValidError (Kasimier), bug with <xml:foo/>, more XPath
    pattern based evaluation fixes (Kasimier)
   - improvements: XSD Schemas redefinitions/restrictions (Kasimier
    Buchcik), node copy checks and fix for attribute (Rob Richards), counted
    transition bug in regexps, ctxt->standalone = -2 to indicate no
    standalone attribute was found, add xmlSchemaSetParserStructuredErrors()
    (Kasimier Buchcik), add xmlTextReaderSchemaValidateCtxt() to API
    (Kasimier), handle gzipped HTTP resources (Gary Coady), add
    htmlDocDumpMemoryFormat. (Rob Richards),
   - documentation: typo (Michael Day), libxml man page (Albert Chin), save
    function to XML buffer (Geert Jansen), small doc fix (Aron Stansvik),


2.6.22: Sep 12 2005:
   - build fixes: compile without schematron (Stéphane Bidoul)
   - bug fixes: xmlDebugDumpNode on namespace node (Oleg Paraschenko)i,
    CDATA push parser bug, xmlElemDump problem with XHTML1 doc,
    XML_FEATURE_xxx clash with expat headers renamed XML_WITH_xxx, fix some
    output formatting for meta element (Rob Richards), script and style
    XHTML1 serialization (David Madore), Attribute derivation fixups in XSD
    (Kasimier Buchcik), better IDC error reports (Kasimier Buchcik)
   - improvements: add XML_SAVE_NO_EMPTY xmlSaveOption (Rob Richards), add
    XML_SAVE_NO_XHTML xmlSaveOption, XML Schemas improvements preparing for
    derive (Kasimier Buchcik).
   - documentation: generation of gtk-doc like docs, integration with
    devhelp.


2.6.21: Sep 4 2005:
   - build fixes: Cygwin portability fixes (Gerrit P. Haase), calling
    convention problems on Windows (Marcus Boerger), cleanups based on Linus'
    sparse tool, update of win32/configure.js (Rob Richards), remove warnings
    on Windows(Marcus Boerger), compilation without SAX1, detection of the
    Python binary, use $GCC inestad of $CC = 'gcc' (Andrew W. Nosenko),
    compilation/link with threads and old gcc, compile problem by C370 on
    Z/OS,
   - bug fixes: http_proxy environments (Peter Breitenlohner), HTML UTF-8
    bug (Jiri Netolicky), XPath NaN compare bug (William Brack),
    htmlParseScript potential bug, Schemas regexp handling of spaces, Base64
    Schemas comparisons NIST passes, automata build error xsd:all,
    xmlGetNodePath for namespaced attributes (Alexander Pohoyda), xmlSchemas
    foreign namespaces handling, XML Schemas facet comparison (Kupriyanov
    Anatolij), xmlSchemaPSimpleTypeErr error report (Kasimier Buchcik), xml:
    namespace ahndling in Schemas (Kasimier), empty model group in Schemas
    (Kasimier), wildcard in Schemas (Kasimier), URI composition (William),
    xs:anyType in Schemas (Kasimier), Python resolver emitting error
    messages directly, Python xmlAttr.parent (Jakub Piotr Clapa), trying to
    fix the file path/URI conversion, xmlTextReaderGetAttribute fix (Rob
    Richards), xmlSchemaFreeAnnot memleak (Kasimier), HTML UTF-8
    serialization, streaming XPath, Schemas determinism detection problem,
    XInclude bug, Schemas context type (Dean Hill), validation fix (Derek
    Poon), xmlTextReaderGetAttribute[Ns] namespaces (Rob Richards), Schemas
    type fix (Kuba Nowakowski), UTF-8 parser bug, error in encoding handling,
    xmlGetLineNo fixes, bug on entities handling, entity name extraction in
    error handling with XInclude, text nodes in HTML body tags (Gary Coady),
    xml:id and IDness at the treee level fixes, XPath streaming patterns
  bugs.
   - improvements: structured interfaces for schemas and RNG error reports
    (Marcus Boerger), optimization of the char data inner loop parsing
    (thanks to Behdad Esfahbod for the idea), schematron validation though
    not finished yet, xmlSaveOption to omit XML declaration, keyref match
    error reports (Kasimier), formal expression handling code not plugged
    yet, more lax mode for the HTML parser, parser XML_PARSE_COMPACT option
    for text nodes allocation.
   - documentation: xmllint man page had --nonet duplicated


2.6.20: Jul 10 2005:
   - build fixes: Windows build (Rob Richards), Mingw compilation (Igor
    Zlatkovic), Windows Makefile (Igor), gcc warnings (Kasimier and
    andriy@google.com), use gcc weak references to pthread to avoid the
    pthread dependency on Linux, compilation problem (Steve Nairn), compiling
    of subset (Morten Welinder), IPv6/ss_family compilation (William Brack),
    compilation when disabling parts of the library, standalone test
    distribution.
   - bug fixes: bug in lang(), memory cleanup on errors (William Brack),
    HTTP query strings (Aron Stansvik), memory leak in DTD (William), integer
    overflow in XPath (William), nanoftp buffer size, pattern "." apth fixup
    (Kasimier), leak in tree reported by Malcolm Rowe, replaceNode patch
    (Brent Hendricks), CDATA with NULL content (Mark Vakoc), xml:base fixup
    on XInclude (William), pattern fixes (William), attribute bug in
    exclusive c14n (Aleksey Sanin), xml:space and xml:lang with SAX2 (Rob
    Richards), namespace trouble in complex parsing (Malcolm Rowe), XSD type
    QNames fixes (Kasimier), XPath streaming fixups (William), RelaxNG bug
    (Rob Richards), Schemas for Schemas fixes (Kasimier), removal of ID (Rob
    Richards), a small RelaxNG leak, HTML parsing in push mode bug (James
    Bursa), failure to detect UTF-8 parsing bugs in CDATA sections,
    areBlanks() heuristic failure, duplicate attributes in DTD bug
  (William).
   - improvements: lot of work on Schemas by Kasimier Buchcik both on
    conformance and streaming, Schemas validation messages (Kasimier Buchcik,
    Matthew Burgess), namespace removal at the python level (Brent
    Hendricks), Update to new Schemas regression tests from W3C/Nist
    (Kasimier), xmlSchemaValidateFile() (Kasimier), implementation of
    xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml (James Wert),
    standalone test framework and programs, new DOM import APIs
    xmlDOMWrapReconcileNamespaces() xmlDOMWrapAdoptNode() and
    xmlDOMWrapRemoveNode(), extension of xmllint capabilities for SAX and
    Schemas regression tests, xmlStopParser() available in pull mode too,
    ienhancement to xmllint --shell namespaces support, Windows port of the
    standalone testing tools (Kasimier and William),
    xmlSchemaValidateStream() xmlSchemaSAXPlug() and xmlSchemaSAXUnplug() SAX
    Schemas APIs, Schemas xmlReader support.


2.6.19: Apr 02 2005:
   - build fixes: drop .la from RPMs, --with-minimum build fix (William
    Brack), use XML_SOCKLEN_T instead of SOCKLEN_T because it breaks with AIX
    5.3 compiler, fixed elfgcchack.h generation and PLT reduction code on
    Linux/ELF/gcc4
   - bug fixes: schemas type decimal fixups (William Brack), xmmlint return
    code (Gerry Murphy), small schemas fixes (Matthew Burgess and GUY
    Fabrice), workaround "DAV:" namespace brokenness in c14n (Aleksey Sanin),
    segfault in Schemas (Kasimier Buchcik), Schemas attribute validation
    (Kasimier), Prop related functions and xmlNewNodeEatName (Rob Richards),
    HTML serialization of name attribute on a elements, Python error handlers
    leaks and improvement (Brent Hendricks), uninitialized variable in
    encoding code, Relax-NG validation bug, potential crash if
    gnorableWhitespace is NULL, xmlSAXParseDoc and xmlParseDoc signatures,
    switched back to assuming UTF-8 in case no encoding is given at
    serialization time
   - improvements: lot of work on Schemas by Kasimier Buchcik on facets
    checking and also mixed handling.
   - 


2.6.18: Mar 13 2005:
   - build fixes: warnings (Peter Breitenlohner), testapi.c generation,
    Bakefile support (Francesco Montorsi), Windows compilation (Joel Reed),
    some gcc4 fixes, HP-UX portability fixes (Rick Jones).
   - bug fixes: xmlSchemaElementDump namespace (Kasimier Buchcik), push and
    xmlreader stopping on non-fatal errors, thread support for dictionaries
    reference counting (Gary Coady), internal subset and push problem, URL
    saved in xmlCopyDoc, various schemas bug fixes (Kasimier), Python paths
    fixup (Stephane Bidoul), xmlGetNodePath and namespaces, xmlSetNsProp fix
    (Mike Hommey), warning should not count as error (William Brack),
    xmlCreatePushParser empty chunk, XInclude parser flags (William), cleanup
    FTP and HTTP code to reuse the uri parsing and IPv6 (William),
    xmlTextWriterStartAttributeNS fix (Rob Richards), XMLLINT_INDENT being
    empty (William), xmlWriter bugs (Rob Richards), multithreading on Windows
    (Rich Salz), xmlSearchNsByHref fix (Kasimier), Python binding leak (Brent
    Hendricks), aliasing bug exposed by gcc4 on s390, xmlTextReaderNext bug
    (Rob Richards), Schemas decimal type fixes (William Brack),
    xmlByteConsumed static buffer (Ben Maurer).
   - improvement: speedup parsing comments and DTDs, dictionary support for
    hash tables, Schemas Identity constraints (Kasimier), streaming XPath
    subset, xmlTextReaderReadString added (Bjorn Reese), Schemas canonical
    values handling (Kasimier), add xmlTextReaderByteConsumed (Aron
  Stansvik),
   - Documentation: Wiki support (Joel Reed)


2.6.17: Jan 16 2005:
   - build fixes: Windows, warnings removal (William Brack),
    maintainer-clean dependency(William), build in a different directory
    (William), fixing --with-minimum configure build (William), BeOS build
    (Marcin Konicki), Python-2.4 detection (William), compilation on AIX (Dan
    McNichol)
   - bug fixes: xmlTextReaderHasAttributes (Rob Richards), xmlCtxtReadFile()
    to use the catalog(s), loop on output (William Brack), XPath memory leak,
    ID deallocation problem (Steve Shepard), debugDumpNode crash (William),
    warning not using error callback (William), xmlStopParser bug (William),
    UTF-16 with BOM on DTDs (William), namespace bug on empty elements in
    push mode (Rob Richards), line and col computations fixups (Aleksey
    Sanin), xmlURIEscape fix (William), xmlXPathErr on bad range (William),
    patterns with too many steps, bug in RNG choice optimization, line number
    sometimes missing.
   - improvements: XSD Schemas (Kasimier Buchcik), python generator
    (William), xmlUTF8Strpos speedup (William), unicode Python strings
    (William), XSD error reports (Kasimier Buchcik), Python __str__ call
    serialize().
   - new APIs: added xmlDictExists(), GetLineNumber and GetColumnNumber for
    the xmlReader (Aleksey Sanin), Dynamic Shared Libraries APIs (mostly Joel
    Reed), error extraction API from regexps, new XMLSave option for format
    (Phil Shafer)
   - documentation: site improvement (John Fleck), FAQ entries
  (William).


2.6.16: Nov 10 2004:
   - general hardening and bug fixing crossing all the API based on new
    automated regression testing
   - build fix: IPv6 build and test on AIX (Dodji Seketeli)
   - bug fixes: problem with XML::Libxml reported by Petr Pajas,  encoding
    conversion functions return values, UTF-8 bug affecting XPath reported by
    Markus Bertheau, catalog problem with NULL entries (William Brack)
   - documentation: fix to xmllint man page, some API function description
    were updated.
   - improvements: DTD validation APIs provided at the Python level (Brent
    Hendricks)


2.6.15: Oct 27 2004:
   - security fixes on the nanoftp and nanohttp modules
   - build fixes: xmllint detection bug in configure, building outside the
    source tree (Thomas Fitzsimmons)
   - bug fixes: HTML parser on broken ASCII chars in names (William), Python
    paths (Malcolm Tredinnick), xmlHasNsProp and default namespace (William),
    saving to python file objects (Malcolm Tredinnick), DTD lookup fix
    (Malcolm), save back <group> in catalogs (William), tree build
    fixes (DV and Rob Richards), Schemas memory bug, structured error handler
    on Python 64bits, thread local memory deallocation, memory leak reported
    by Volker Roth, xmlValidateDtd in the presence of an internal subset,
    entities and _private problem (William), xmlBuildRelativeURI error
    (William).
   - improvements: better XInclude error reports (William), tree debugging
    module and tests, convenience functions at the Reader API (Graham
    Bennett), add support for PI in the HTML parser.


2.6.14: Sep 29 2004:
   - build fixes: configure paths for xmllint and xsltproc, compilation
    without HTML parser, compilation warning cleanups (William Brack &
    Malcolm Tredinnick), VMS makefile update (Craig Berry),
   - bug fixes: xmlGetUTF8Char (William Brack), QName properties (Kasimier
    Buchcik), XInclude testing, Notation serialization, UTF8ToISO8859x
    transcoding (Mark Itzcovitz), lots of XML Schemas cleanup and fixes
    (Kasimier), ChangeLog cleanup (Stepan Kasal), memory fixes (Mark Vakoc),
    handling of failed realloc(), out of bound array addressing in Schemas
    date handling, Python space/tabs cleanups (Malcolm Tredinnick), NMTOKENS
    E20 validation fix (Malcolm),
   - improvements: added W3C XML Schemas testsuite (Kasimier Buchcik), add
    xmlSchemaValidateOneElement (Kasimier), Python exception hierearchy
    (Malcolm Tredinnick), Python libxml2 driver improvement (Malcolm
    Tredinnick), Schemas support for xsi:schemaLocation,
    xsi:noNamespaceSchemaLocation, xsi:type (Kasimier Buchcik)


2.6.13: Aug 31 2004:
   - build fixes: Windows and zlib (Igor Zlatkovic), -O flag with gcc,
    Solaris compiler warning, fixing RPM BuildRequires,
   - fixes: DTD loading on Windows (Igor), Schemas error reports APIs
    (Kasimier Buchcik), Schemas validation crash, xmlCheckUTF8 (William Brack
    and Julius Mittenzwei), Schemas facet check (Kasimier), default namespace
    problem (William), Schemas hexbinary empty values, encoding error could
    generate a serialization loop.
   - Improvements: Schemas validity improvements (Kasimier), added --path
    and --load-trace options to xmllint
   - documentation: tutorial update (John Fleck)


2.6.12: Aug 22 2004:
   - build fixes: fix --with-minimum, elfgcchack.h fixes (Peter
    Breitenlohner), perl path lookup (William), diff on Solaris (Albert
    Chin), some 64bits cleanups.
   - Python: avoid a warning with 2.3 (William Brack), tab and space mixes
    (William), wrapper generator fixes (William), Cygwin support (Gerrit P.
    Haase), node wrapper fix (Marc-Antoine Parent), XML Schemas support
    (Torkel Lyng)
   - Schemas: a lot of bug fixes and improvements from Kasimier Buchcik
   - fixes: RVT fixes (William), XPath context resets bug (William), memory
    debug (Steve Hay), catalog white space handling (Peter Breitenlohner),
    xmlReader state after attribute reading (William), structured error
    handler (William), XInclude generated xml:base fixup (William), Windows
    memory reallocation problem (Steve Hay), Out of Memory conditions
    handling (William and Olivier Andrieu), htmlNewDoc() charset bug,
    htmlReadMemory init (William), a posteriori validation DTD base
    (William), notations serialization missing, xmlGetNodePath (Dodji),
    xmlCheckUTF8 (Diego Tartara), missing line numbers on entity
  (William)
   - improvements: DocBook catalog build scrip (William), xmlcatalog tool
    (Albert Chin), xmllint --c14n option, no_proxy environment (Mike Hommey),
    xmlParseInNodeContext() addition, extend xmllint --shell, allow XInclude
    to not generate start/end nodes, extend xmllint --version to include CVS
    tag (William)
   - documentation: web pages fixes, validity API docs fixes (William)
    schemas API fix (Eric Haszlakiewicz), xmllint man page (John Fleck)


2.6.11: July 5 2004:
   - Schemas: a lot of changes and improvements by Kasimier Buchcik for
    attributes, namespaces and simple types.
   - build fixes: --with-minimum (William Brack),  some gcc cleanup
    (William), --with-thread-alloc (William)
   - portability: Windows binary package change (Igor Zlatkovic), Catalog
    path on Windows
   - documentation: update to the tutorial (John Fleck), xmllint return code
    (John Fleck), man pages (Ville Skytta),
   - bug fixes: C14N bug serializing namespaces (Aleksey Sanin), testSAX
    properly initialize the library (William), empty node set in XPath
    (William), xmlSchemas errors (William), invalid charref problem pointed
    by Morus Walter, XInclude xml:base generation (William), Relax-NG bug
    with div processing (William), XPointer and xml:base problem(William),
    Reader and entities, xmllint return code for schemas (William), reader
    streaming problem (Steve Ball), DTD serialization problem (William),
    libxml.m4 fixes (Mike Hommey), do not provide destructors as methods on
    Python classes, xmlReader buffer bug, Python bindings memory interfaces
    improvement (with Stéphane Bidoul), Fixed the push parser to be back to
    synchronous behaviour.
   - improvement: custom per-thread I/O enhancement (Rob Richards), register
    namespace in debug shell (Stefano Debenedetti), Python based regression
    test for non-Unix users (William), dynamically increase the number of
    XPath extension functions in Python and fix a memory leak (Marc-Antoine
    Parent and William)
   - performance: hack done with Arjan van de Ven to reduce ELF footprint
    and generated code on Linux, plus use gcc runtime profiling to optimize
    the code generated in the RPM packages.


2.6.10: May 17 2004:
   - Web page generated for ChangeLog
   - build fixes: --without-html problems, make check without make all
   - portability: problem with xpath.c on Windows (MSC and Borland), memcmp
    vs. strncmp on Solaris, XPath tests on Windows (Mark Vakoc), C++ do not
    use "list" as parameter name, make tests work with Python 1.5 (Ed
  Davis),
   - improvements: made xmlTextReaderMode public, small buffers resizing
    (Morten Welinder), add --maxmem option to xmllint, add
    xmlPopInputCallback() for Matt Sergeant, refactoring of serialization
    escaping, added escaping customization
   - bugfixes: xsd:extension (Taihei Goi), assorted regexp bugs (William
    Brack), xmlReader end of stream problem, node deregistration with reader,
    URI escaping and filemanes,  XHTML1 formatting (Nick Wellnhofer), regexp
    transition reduction (William), various XSD Schemas fixes (Kasimier
    Buchcik), XInclude fallback problem (William), weird problems with DTD
    (William), structured error handler callback context (William), reverse
    xmlEncodeSpecialChars() behaviour back to escaping '"'


2.6.9: Apr 18 2004:
   - implement xml:id Working Draft, relaxed XPath id() checking
   - bugfixes: xmlCtxtReset (Brent Hendricks), line number and CDATA (Dave
    Beckett), Relax-NG compilation (William Brack), Regexp patches (with
    William), xmlUriEscape (Mark Vakoc), a Relax-NG notAllowed problem (with
    William), Relax-NG name classes compares (William), XInclude duplicate
    fallback (William), external DTD encoding detection (William), a DTD
    validation bug (William), xmlReader Close() fix, recursive extension
    schemas
   - improvements: use xmlRead* APIs in test tools (Mark Vakoc), indenting
    save optimization, better handle IIS broken HTTP redirect  behaviour (Ian
    Hummel), HTML parser frameset (James Bursa), libxml2-python RPM
    dependency, XML Schemas union support (Kasimier Buchcik), warning removal
    clanup (William), keep ChangeLog compressed when installing from RPMs
   - documentation: examples and xmlDocDumpMemory docs (John Fleck), new
    example (load, xpath, modify, save), xmlCatalogDump() comments,
   - Windows: Borland C++ builder (Eric Zurcher), work around Microsoft
    compiler NaN handling bug (Mark Vakoc)


2.6.8: Mar 23 2004:
   - First step of the cleanup of the serialization code and APIs
   - XML Schemas: mixed content (Adam Dickmeiss), QName handling fixes (Adam
    Dickmeiss), anyURI for "" (John Belmonte)
   - Python: Canonicalization C14N support added (Anthony Carrico)
   - xmlDocCopyNode() extension (William)
   - Relax-NG: fix when processing XInclude results (William), external
    reference in interleave (William), missing error on <choice>
    failure (William), memory leak in schemas datatype facets.
   - xmlWriter: patch for better DTD support (Alfred Mickautsch)
   - bug fixes: xmlXPathLangFunction memory leak (Mike Hommey and William
    Brack), no ID errors if using HTML_PARSE_NOERROR, xmlcatalog fallbacks to
    URI on SYSTEM lookup failure, XInclude parse flags inheritance (William),
    XInclude and XPointer fixes for entities (William), XML parser bug
    reported by Holger Rauch, nanohttp fd leak (William),  regexps char
    groups '-' handling (William), dictionary reference counting problems,
    do not close stderr.
   - performance patches from Petr Pajas
   - Documentation fixes: XML_CATALOG_FILES in man pages (Mike Hommey)
   - compilation and portability fixes: --without-valid, catalog cleanups
    (Peter Breitenlohner), MingW patch (Roland Schwingel), cross-compilation
    to Windows (Christophe de Vienne),  --with-html-dir fixup (Julio Merino
    Vidal), Windows build (Eric Zurcher)


2.6.7: Feb 23 2004:
   - documentation: tutorial updates (John Fleck), benchmark results
   - xmlWriter: updates and fixes (Alfred Mickautsch, Lucas Brasilino)
   - XPath optimization (Petr Pajas)
   - DTD ID handling optimization
   - bugfixes: xpath number with  > 19 fractional (William Brack), push
    mode with unescaped '>' characters, fix xmllint --stream --timing, fix
    xmllint --memory --stream memory usage, xmlAttrSerializeTxtContent
    handling NULL, trying to fix Relax-NG/Perl interface.
   - python: 2.3 compatibility, whitespace fixes (Malcolm Tredinnick)
   - Added relaxng option to xmllint --shell


2.6.6: Feb 12 2004:
   - nanohttp and nanoftp: buffer overflow error on URI parsing (Igor and
    William) reported by Yuuichi Teranishi
   - bugfixes: make test and path issues, xmlWriter attribute serialization
    (William Brack), xmlWriter indentation (William), schemas validation
    (Eric Haszlakiewicz), XInclude dictionaries issues (William and Oleg
    Paraschenko), XInclude empty fallback (William), HTML warnings (William),
    XPointer in XInclude (William), Python namespace serialization,
    isolat1ToUTF8 bound error (Alfred Mickautsch), output of parameter
    entities in internal subset (William), internal subset bug in push mode,
    <xs:all> fix (Alexey Sarytchev)
   - Build: fix for automake-1.8 (Alexander Winston), warnings removal
    (Philip Ludlam), SOCKLEN_T detection fixes (Daniel Richard), fix
    --with-minimum configuration.
   - XInclude: allow the 2001 namespace without warning.
   - Documentation: missing example/index.html (John Fleck), version
    dependencies (John Fleck)
   - reader API: structured error reporting (Steve Ball)
   - Windows compilation: mingw, msys (Mikhail Grushinskiy), function
    prototype (Cameron Johnson), MSVC6 compiler warnings, _WINSOCKAPI_
  patch
   - Parsers: added xmlByteConsumed(ctxt) API to get the byte offset in
    input.


2.6.5: Jan 25 2004:
   - Bugfixes: dictionaries for schemas (William Brack), regexp segfault
    (William), xs:all problem (William), a number of XPointer bugfixes
    (William), xmllint error go to stderr, DTD validation problem with
    namespace, memory leak (William), SAX1 cleanup and minimal options fixes
    (Mark Vadoc), parser context reset on error (Shaun McCance), XPath union
    evaluation problem (William) , xmlReallocLoc with NULL (Aleksey Sanin),
    XML Schemas double free (Steve Ball), XInclude with no href, argument
    callbacks order for XPath callbacks (Frederic Peters)
   - Documentation: python scripts (William Brack), xslt stylesheets (John
    Fleck), doc (Sven Zimmerman), I/O example.
   - Python bindings: fixes (William), enum support (Stéphane Bidoul),
    structured error reporting (Stéphane Bidoul)
   - XInclude: various fixes for conformance, problem related to dictionary
    references (William & me), recursion (William)
   - xmlWriter: indentation (Lucas Brasilino), memory leaks (Alfred
    Mickautsch),
   - xmlSchemas: normalizedString datatype (John Belmonte)
   - code cleanup for strings functions (William)
   - Windows: compiler patches (Mark Vakoc)
   - Parser optimizations, a few new XPath and dictionary APIs for future
    XSLT optimizations.


2.6.4: Dec 24 2003:
   - Windows build fixes (Igor Zlatkovic)
   - Some serious XInclude problems reported by Oleg Paraschenko and
   - Unix and Makefile packaging fixes (me, William Brack,
   - Documentation improvements (John Fleck, William Brack), example fix
    (Lucas Brasilino)
   - bugfixes: xmlTextReaderExpand() with xmlReaderWalker, XPath handling of
    NULL strings (William Brack) , API building reader or parser from
    filedescriptor should not close it, changed XPath sorting to be stable
    again (William Brack), xmlGetNodePath() generating '(null)' (William
    Brack), DTD validation and namespace bug (William Brack), XML Schemas
    double inclusion behaviour


2.6.3: Dec 10 2003:
   - documentation updates and cleanup (DV, William Brack, John Fleck)
   - added a repository of examples, examples from Aleksey Sanin, Dodji
    Seketeli, Alfred Mickautsch
   - Windows updates: Mark Vakoc, Igor Zlatkovic, Eric Zurcher, Mingw
    (Kenneth Haley)
   - Unicode range checking (William Brack)
   - code cleanup (William Brack)
   - Python bindings: doc (John Fleck),  bug fixes
   - UTF-16 cleanup and BOM issues (William Brack)
   - bug fixes: ID and xmlReader validation, XPath (William Brack),
    xmlWriter (Alfred Mickautsch), hash.h inclusion problem, HTML parser
    (James Bursa), attribute defaulting and validation, some serialization
    cleanups, XML_GET_LINE macro, memory debug when using threads (William
    Brack), serialization of attributes and entities content, xmlWriter
    (Daniel Schulman)
   - XInclude bugfix, new APIs and update to the last version including the
    namespace change.
   - XML Schemas improvements: include (Robert Stepanek), import and
    namespace handling, fixed the regression tests troubles, added examples
    based on Eric van der Vlist book, regexp fixes
   - preliminary pattern support for streaming (needed for schemas
    constraints), added xmlTextReaderPreservePattern() to collect subdocument
    when streaming.
   - various fixes in the structured error handling


2.6.2: Nov 4 2003:
   - XPath context unregistration fixes
   - text node coalescing fixes (Mark Lilback)
   - API to screate a W3C Schemas from an existing document (Steve Ball)
   - BeOS patches (Marcin 'Shard' Konicki)
   - xmlStrVPrintf function added (Aleksey Sanin)
   - compilation fixes (Mark Vakoc)
   - stdin parsing fix (William Brack)
   - a posteriori DTD validation fixes
   - xmlReader bug fixes: Walker fixes, python bindings
   - fixed xmlStopParser() to really stop the parser and errors
   - always generate line numbers when using the new xmlReadxxx
  functions
   - added XInclude support to the xmlReader interface
   - implemented XML_PARSE_NONET parser option
   - DocBook XSLT processing bug fixed
   - HTML serialization for <p> elements (William Brack and me)
   - XPointer failure in XInclude are now handled as resource errors
   - fixed xmllint --html to use the HTML serializer on output (added
    --xmlout to implement the previous behaviour of saving it using the XML
    serializer)


2.6.1: Oct 28 2003:
   - Mostly bugfixes after the big 2.6.0 changes
   - Unix compilation patches: libxml.m4 (Patrick Welche), warnings cleanup
    (William Brack)
   - Windows compilation patches (Joachim Bauch, Stephane Bidoul, Igor
    Zlatkovic)
   - xmlWriter bugfix (Alfred Mickautsch)
   - chvalid.[ch]: couple of fixes from Stephane Bidoul
   - context reset: error state reset, push parser reset (Graham
  Bennett)
   - context reuse: generate errors if file is not readable
   - defaulted attributes for element coming from internal entities
    (Stephane Bidoul)
   - Python: tab and spaces mix (William Brack)
   - Error handler could crash in DTD validation in 2.6.0
   - xmlReader: do not use the document or element _private field
   - testSAX.c: avoid a problem with some PIs (Massimo Morara)
   - general bug fixes: mandatory encoding in text decl, serializing
    Document Fragment nodes, xmlSearchNs 2.6.0 problem (Kasimier Buchcik),
    XPath errors not reported,  slow HTML parsing of large documents.


2.6.0: Oct 20 2003:
   - Major revision release: should be API and ABI compatible but got a lot
    of change
   - Increased the library modularity, far more options can be stripped out,
    a --with-minimum configuration will weight around 160KBytes
   - Use per parser and per document dictionary, allocate names and small
    text nodes from the dictionary
   - Switch to a SAX2 like parser rewrote most of the XML parser core,
    provides namespace resolution and defaulted attributes, minimize memory
    allocations and copies, namespace checking and specific error handling,
    immutable buffers, make predefined entities static structures, etc...
   - rewrote all the error handling in the library, all errors can be
    intercepted at a structured level, with precise information
  available.
   - New simpler and more generic XML and HTML parser APIs, allowing to
    easily modify the parsing options and reuse parser context for multiple
    consecutive documents.
   - Similar new APIs for the xmlReader, for options and reuse, provided new
    functions to access content as const strings, use them for Python
  bindings
   - a  lot of other smaller API improvements: xmlStrPrintf (Aleksey Sanin),
    Walker i.e. reader on a document tree based on Alfred Mickautsch code,
    make room in nodes for line numbers, reference counting and future PSVI
    extensions, generation of character ranges to be checked with faster
    algorithm (William),  xmlParserMaxDepth (Crutcher Dunnavant), buffer
    access
   - New xmlWriter API provided by Alfred Mickautsch
   - Schemas: base64 support by Anthony Carrico
   - Parser<->HTTP integration fix, proper processing of the Mime-Type
    and charset information if available.
   - Relax-NG: bug fixes including the one reported by Martijn Faassen and
    zeroOrMore, better error reporting.
   - Python bindings (Stéphane Bidoul), never use stdout for errors
  output
   - Portability: all the headers have macros for export and calling
    convention definitions (Igor Zlatkovic), VMS update (Craig A. Berry),
    Windows: threads (Jesse Pelton), Borland compiler (Eric Zurcher,  Igor),
    Mingw (Igor), typos (Mark Vakoc),  beta version (Stephane Bidoul),
    warning cleanups on AIX and MIPS compilers (William Brack), BeOS (Marcin
    'Shard' Konicki)
   - Documentation fixes and README (William Brack), search fix (William),
    tutorial updates (John Fleck), namespace docs (Stefan Kost)
   - Bug fixes: xmlCleanupParser (Dave Beckett), threading uninitialized
    mutexes, HTML doctype lowercase,  SAX/IO (William), compression detection
    and restore (William), attribute declaration in DTDs (William), namespace
    on attribute in HTML output (William), input filename (Rob Richards),
    namespace DTD validation, xmlReplaceNode (Chris Ryland), I/O callbacks
    (Markus Keim), CDATA serialization (Shaun McCance), xmlReader (Peter
    Derr), high codepoint charref like &#x10FFFF;, buffer access in push
    mode (Justin Fletcher), TLS threads on Windows (Jesse Pelton), XPath bug
    (William), xmlCleanupParser (Marc Liyanage), CDATA output (William), HTTP
    error handling.
   - xmllint options: --dtdvalidfpi for Tobias Reif, --sax1 for compat
    testing,  --nodict for building without tree dictionary, --nocdata to
    replace CDATA by text, --nsclean to remove surperfluous  namespace
    declarations
   - added xml2-config --libtool-libs option from Kevin P. Fleming
   - a lot of profiling and tuning of the code, speedup patch for
    xmlSearchNs() by Luca Padovani. The xmlReader should do far less
    allocation and it speed should get closer to SAX. Chris Anderson worked
    on speeding and cleaning up repetitive checking code.
   - cleanup of "make tests"
   - libxml-2.0-uninstalled.pc from Malcolm Tredinnick
   - deactivated the broken docBook SGML parser code and plugged the XML
    parser instead.


2.5.11: Sep 9 2003:
A bugfix only release:   - risk of crash in Relax-NG
   - risk of crash when using multithreaded programs


2.5.10: Aug 15 2003:
A bugfixes only release   - Windows Makefiles (William Brack)
   - UTF-16 support fixes (Mark Itzcovitz)
   - Makefile and portability (William Brack) automake, Linux alpha, Mingw
    on Windows (Mikhail Grushinskiy)
   - HTML parser (Oliver Stoeneberg)
   - XInclude performance problem reported by Kevin Ruscoe
   - XML parser performance problem reported by Grant Goodale
   - xmlSAXParseDTD() bug fix from Malcolm Tredinnick
   - and a couple other cleanup


2.5.9: Aug 9 2003:
   - bugfixes: IPv6 portability, xmlHasNsProp (Markus Keim), Windows build
    (Wiliam Brake, Jesse Pelton, Igor), Schemas (Peter Sobisch), threading
    (Rob Richards), hexBinary type (), UTF-16 BOM (Dodji Seketeli),
    xmlReader, Relax-NG schemas compilation, namespace handling,  EXSLT (Sean
    Griffin), HTML parsing problem (William Brack), DTD validation for mixed
    content + namespaces, HTML serialization, library initialization,
    progressive HTML parser
   - better interfaces for Relax-NG error handling (Joachim Bauch, )
   - adding xmlXIncludeProcessTree() for XInclud'ing in a subtree
   - doc fixes and improvements (John Fleck)
   - configure flag for -with-fexceptions when embedding in C++
   - couple of new UTF-8 helper functions (William Brack)
   - general encoding cleanup + ISO-8859-x without iconv (Peter Jacobi)
   - xmlTextReader cleanup + enum for node types (Bjorn Reese)
   - general compilation/warning cleanup Solaris/HP-UX/... (William
  Brack)


2.5.8: Jul 6 2003:
   - bugfixes: XPath, XInclude, file/URI mapping, UTF-16 save (Mark
    Itzcovitz), UTF-8 checking, URI saving, error printing (William Brack),
    PI related memleak, compilation without schemas or without xpath (Joerg
    Schmitz-Linneweber/Garry Pennington), xmlUnlinkNode problem with DTDs,
    rpm problem on , i86_64, removed a few compilation problems from 2.5.7,
    xmlIOParseDTD, and xmlSAXParseDTD (Malcolm Tredinnick)
   - portability: DJGPP (MsDos) , OpenVMS (Craig A. Berry)
   - William Brack fixed multithreading lock problems
   - IPv6 patch for FTP and HTTP accesses (Archana Shah/Wipro)
   - Windows fixes (Igor Zlatkovic,  Eric Zurcher), threading (Stéphane
    Bidoul)
   - A few W3C Schemas Structure improvements
   - W3C Schemas Datatype improvements (Charlie Bozeman)
   - Python bindings for thread globals (Stéphane Bidoul), and method/class
    generator
   - added --nonet option to xmllint
   - documentation improvements (John Fleck)


2.5.7: Apr 25 2003:
   - Relax-NG: Compiling to regexp and streaming validation on top of the
    xmlReader interface, added to xmllint --stream
   - xmlReader: Expand(), Next() and DOM access glue, bug fixes
   - Support for large files: RGN validated a 4.5GB instance
   - Thread support is now configured in by default
   - Fixes: update of the Trio code (Bjorn), WXS Date and Duration fixes
    (Charles Bozeman), DTD and namespaces (Brent Hendricks), HTML push parser
    and zero bytes handling, some missing Windows file path conversions,
    behaviour of the parser and validator in the presence of "out of memory"
    error conditions
   - extended the API to be able to plug a garbage collecting memory
    allocator, added xmlMallocAtomic() and modified the allocations
    accordingly.
   - Performances: removed excessive malloc() calls, speedup of the push and
    xmlReader interfaces, removed excessive thread locking
   - Documentation: man page (John Fleck), xmlReader documentation
   - Python: adding binding for xmlCatalogAddLocal (Brent M Hendricks)


2.5.6: Apr 1 2003:
   - Fixed W3C XML Schemas datatype, should be compliant now except for
    binHex and base64 which are not supported yet.
   - bug fixes: non-ASCII IDs, HTML output, XInclude on large docs and
    XInclude entities handling, encoding detection on external subsets, XML
    Schemas bugs and memory leaks, HTML parser (James Bursa)
   - portability: python/trio (Albert Chin), Sun compiler warnings
   - documentation: added --relaxng option to xmllint man page (John)
   - improved error reporting: xml:space, start/end tag mismatches, Relax NG
    errors


2.5.5: Mar 24 2003:
   - Lot of fixes on the Relax NG implementation. More testing including
    DocBook and TEI examples.
   - Increased the support for W3C XML Schemas datatype
   - Several bug fixes in the URI handling layer
   - Bug fixes: HTML parser, xmlReader, DTD validation, XPath, encoding
    conversion, line counting in the parser.
   - Added support for $XMLLINT_INDENT environment variable, FTP delete
   - Fixed the RPM spec file name


2.5.4: Feb 20 2003:
   - Conformance testing and lot of fixes on Relax NG and XInclude
    implementation
   - Implementation of XPointer element() scheme
   - Bug fixes: XML parser, XInclude entities merge, validity checking on
    namespaces,
    2 serialization bugs, node info generation problems, a DTD regexp
    generation problem.
  
   - Portability: windows updates and path canonicalization (Igor)
   - A few typo fixes (Kjartan Maraas)
   - Python bindings generator fixes (Stephane Bidoul)


2.5.3: Feb 10 2003:
   - RelaxNG and XML Schemas datatypes improvements, and added a first
    version of RelaxNG Python bindings
   - Fixes: XLink (Sean Chittenden), XInclude (Sean Chittenden), API fix for
    serializing namespace nodes, encoding conversion bug, XHTML1
  serialization
   - Portability fixes: Windows (Igor), AMD 64bits RPM spec file


2.5.2: Feb 5 2003:
   - First implementation of RelaxNG, added --relaxng flag to xmllint
   - Schemas support now compiled in by default.
   - Bug fixes: DTD validation, namespace checking, XInclude and entities,
    delegateURI in XML Catalogs, HTML parser, XML reader (Stéphane Bidoul),
    XPath parser and evaluation,  UTF8ToUTF8 serialization, XML reader memory
    consumption, HTML parser, HTML serialization in the presence of
  namespaces
   - added an HTML API to check elements and attributes.
   - Documentation improvement, PDF for the tutorial (John Fleck), doc
    patches (Stefan Kost)
   - Portability fixes: NetBSD (Julio Merino), Windows (Igor Zlatkovic)
   - Added python bindings for XPointer, contextual error reporting
    (Stéphane Bidoul)
   - URI/file escaping problems (Stefano Zacchiroli)


2.5.1: Jan 8 2003:
   - Fixes a memory leak and configuration/compilation problems in 2.5.0
   - documentation updates (John)
   - a couple of XmlTextReader fixes


2.5.0: Jan 6 2003:
   - New XmltextReader interface based on C#
    API (with help of Stéphane Bidoul)
   - Windows: more exports, including the new API (Igor)
   - XInclude fallback fix
   - Python: bindings for the new API, packaging (Stéphane Bidoul),
    drv_libxml2.py Python xml.sax driver (Stéphane Bidoul), fixes, speedup
    and iterators for Python-2.2 (Hannu Krosing)
   - Tutorial fixes (john Fleck and Niraj Tolia) xmllint man update
  (John)
   - Fix an XML parser bug raised by Vyacheslav Pindyura
   - Fix for VMS serialization (Nigel Hall) and config (Craig A. Berry)
   - Entities handling fixes
   - new API to optionally track node creation and deletion (Lukas
  Schroeder)
   - Added documentation for the XmltextReader interface and some XML guidelines


2.4.30: Dec 12 2002:
   - 2.4.29 broke the python bindings, rereleasing
   - Improvement/fixes of the XML API generator, and couple of minor code
    fixes.


2.4.29: Dec 11 2002:
   - Windows fixes (Igor): Windows CE port, pthread linking, python bindings
    (Stéphane Bidoul), Mingw (Magnus Henoch), and export list updates
   - Fix for prev in python bindings (ERDI Gergo)
   - Fix for entities handling (Marcus Clarke)
   - Refactored the XML and HTML dumps to a single code path, fixed XHTML1
    dump
   - Fix for URI parsing when handling URNs with fragment identifiers
   - Fix for HTTP URL escaping problem
   - added an TextXmlReader (C#) like API (work in progress)
   - Rewrote the API in XML generation script, includes a C parser and saves
    more information needed for C# bindings


2.4.28: Nov 22 2002:
   - a couple of python binding fixes
   - 2 bug fixes in the XML push parser
   - potential memory leak removed (Martin Stoilov)
   - fix to the configure script for Unix (Dimitri Papadopoulos)
   - added encoding support for XInclude parse="text"
   - autodetection of XHTML1 and specific serialization rules added
   - nasty threading bug fixed (William Brack)


2.4.27: Nov 17 2002:
   - fixes for the Python bindings
   - a number of bug fixes: SGML catalogs, xmlParseBalancedChunkMemory(),
    HTML parser,  Schemas (Charles Bozeman), document fragment support
    (Christian Glahn), xmlReconciliateNs (Brian Stafford), XPointer,
    xmlFreeNode(), xmlSAXParseMemory (Peter Jones), xmlGetNodePath (Petr
    Pajas), entities processing
   - added grep to xmllint --shell
   - VMS update patch from Craig A. Berry
   - cleanup of the Windows build with support for more compilers (Igor),
    better thread support on Windows
   - cleanup of Unix Makefiles and spec file
   - Improvements to the documentation (John Fleck)


2.4.26: Oct 18 2002:
   - Patches for Windows CE port, improvements on Windows paths handling
   - Fixes to the validation  code (DTD and Schemas), xmlNodeGetPath() ,
    HTML serialization, Namespace compliance,  and a number of small
  problems


2.4.25: Sep 26 2002:
   - A number of bug fixes: XPath, validation, Python bindings, DOM and
    tree, xmlI/O,  Html
   - Serious rewrite of XInclude
   - Made XML Schemas regexp part of the default build and APIs, small fix
    and improvement of the regexp core
   - Changed the validation code to reuse XML Schemas regexp APIs
   - Better handling of Windows file paths, improvement of Makefiles (Igor,
    Daniel Gehriger, Mark Vakoc)
   - Improved the python I/O bindings, the tests, added resolver and regexp
    APIs
   - New logos from Marc Liyanage
   - Tutorial improvements: John Fleck, Christopher Harris
   - Makefile: Fixes for AMD x86_64 (Mandrake), DESTDIR (Christophe
  Merlet)
   - removal of all stderr/perror use for error reporting
   - Better error reporting: XPath and DTD validation
   - update of the trio portability layer (Bjorn Reese)

2.4.24: Aug 22 2002   - XPath fixes (William), xf:escape-uri() (Wesley Terpstra)
   - Python binding fixes: makefiles (William), generator, rpm build, x86-64
    (fcrozat)
   - HTML <style> and boolean attributes serializer fixes
   - C14N improvements by Aleksey
   - doc cleanups: Rick Jones
   - Windows compiler makefile updates: Igor and Elizabeth Barham
   - XInclude: implementation of fallback and xml:base fixup added


2.4.23: July 6 2002:
   - performances patches: Peter Jacobi
   - c14n fixes, testsuite and performances: Aleksey Sanin
   - added xmlDocFormatDump: Chema Celorio
   - new tutorial: John Fleck
   - new hash functions and performances: Sander Vesik, portability fix from
    Peter Jacobi
   - a number of bug fixes: XPath (William Brack, Richard Jinks), XML and
    HTML parsers, ID lookup function
   - removal of all remaining sprintf: Aleksey Sanin


2.4.22: May 27 2002:
   - a number of bug fixes: configure scripts, base handling, parser, memory
    usage, HTML parser, XPath, documentation (Christian Cornelssen),
    indentation, URI parsing
   - Optimizations for XMLSec, fixing and making public some of the network
    protocol handlers (Aleksey)
   - performance patch from Gary Pennington
   - Charles Bozeman provided date and time support for XML Schemas
  datatypes


2.4.21: Apr 29 2002:
This release is both a bug fix release and also contains the early XML
Schemas structures at 
http://www.w3.org/TR/xmlschema-1/
 and datatypes at 
http://www.w3.org/TR/xmlschema-2/
 code, beware, all
interfaces are likely to change, there is huge holes, it is clearly a work in
progress and don't even think of putting this code in a production system,
it's actually not compiled in by default. The real fixes are:
   - a couple of bugs or limitations introduced in 2.4.20
   - patches for Borland C++ and MSC by Igor
   - some fixes on XPath strings and conformance patches by Richard
  Jinks
   - patch from Aleksey for the ExcC14N specification
   - OSF/1 bug fix by Bjorn


2.4.20: Apr 15 2002:
   - bug fixes: file descriptor leak, XPath, HTML output, DTD validation
   - XPath conformance testing by Richard Jinks
   - Portability fixes: Solaris, MPE/iX, Windows, OSF/1, python bindings,
    libxml.m4


2.4.19: Mar 25 2002:
   - bug fixes: half a dozen XPath bugs, Validation, ISO-Latin to UTF8
    encoder
   - portability fixes in the HTTP code
   - memory allocation checks using valgrind, and profiling tests
   - revamp of the Windows build and Makefiles


2.4.18: Mar 18 2002:
   - bug fixes: tree, SAX, canonicalization, validation, portability,
  XPath
   - removed the --with-buffer option it was becoming unmaintainable
   - serious cleanup of the Python makefiles
   - speedup patch to XPath very effective for DocBook stylesheets
   - Fixes for Windows build, cleanup of the documentation


2.4.17: Mar 8 2002:
   - a lot of bug fixes, including "namespace nodes have no parents in
  XPath"
   - fixed/improved the Python wrappers, added more examples and more
    regression tests, XPath extension functions can now return node-sets
   - added the XML Canonicalization support from Aleksey Sanin


2.4.16: Feb 20 2002:
   - a lot of bug fixes, most of them were triggered by the XML Testsuite
    from OASIS and W3C. Compliance has been significantly improved.
   - a couple of portability fixes too.


2.4.15: Feb 11 2002:
   - Fixed the Makefiles, especially the python module ones
   - A few bug fixes and cleanup
   - Includes cleanup


2.4.14: Feb 8 2002:
   - Change of License to the MIT
    License basically for integration in XFree86 codebase, and removing
    confusion around the previous dual-licensing
   - added Python bindings, beta software but should already be quite
    complete
   - a large number of fixes and cleanups, especially for all tree
    manipulations
   - cleanup of the headers, generation of a reference API definition in
  XML


2.4.13: Jan 14 2002:
   - update of the documentation: John Fleck and Charlie Bozeman
   - cleanup of timing code from Justin Fletcher
   - fixes for Windows and initial thread support on Win32: Igor and Serguei
    Narojnyi
   - Cygwin patch from Robert Collins
   - added xmlSetEntityReferenceFunc() for Keith Isdale work on xsldbg


2.4.12: Dec 7 2001:
   - a few bug fixes: thread (Gary Pennington), xmllint (Geert Kloosterman),
    XML parser (Robin Berjon), XPointer (Danny Jamshy), I/O cleanups
  (robert)
   - Eric Lavigne contributed project files for MacOS
   - some makefiles cleanups


2.4.11: Nov 26 2001:
   - fixed a couple of errors in the includes, fixed a few bugs, some code
    cleanups
   - xmllint man pages improvement by Heiko Rupp
   - updated VMS build instructions from John A Fotheringham
   - Windows Makefiles updates from Igor


2.4.10: Nov 10 2001:
   - URI escaping fix (Joel Young)
   - added xmlGetNodePath() (for paths or XPointers generation)
   - Fixes namespace handling problems when using DTD and validation
   - improvements on xmllint: Morus Walter patches for --format and
    --encode, Stefan Kost and Heiko Rupp improvements on the --shell
   - fixes for xmlcatalog linking pointed by Weiqi Gao
   - fixes to the HTML parser


2.4.9: Nov 6 2001:
   - fixes more catalog bugs
   - avoid a compilation problem, improve xmlGetLineNo()


2.4.8: Nov 4 2001:
   - fixed SGML catalogs broken in previous release, updated xmlcatalog
  tool
   - fixed a compile errors and some includes troubles.


2.4.7: Oct 30 2001:
   - exported some debugging interfaces
   - serious rewrite of the catalog code
   - integrated Gary Pennington thread safety patch, added configure option
    and regression tests
   - removed an HTML parser bug
   - fixed a couple of potentially serious validation bugs
   - integrated the SGML DocBook support in xmllint
   - changed the nanoftp anonymous login passwd
   - some I/O cleanup and a couple of interfaces for Perl wrapper
   - general bug fixes
   - updated xmllint man page by John Fleck
   - some VMS and Windows updates


2.4.6: Oct 10 2001:
   - added an updated man pages by John Fleck
   - portability and configure fixes
   - an infinite loop on the HTML parser was removed (William)
   - Windows makefile patches from Igor
   - fixed half a dozen bugs reported for libxml or libxslt
   - updated xmlcatalog to be able to modify SGML super catalogs


2.4.5: Sep 14 2001:
   - Remove a few annoying bugs in 2.4.4
   - forces the HTML serializer to output decimal charrefs since some
    version of Netscape can't handle hexadecimal ones


1.8.16: Sep 14 2001:
   - maintenance release of the old libxml1 branch, couple of bug and
    portability fixes


2.4.4: Sep 12 2001:
   - added --convert to xmlcatalog, bug fixes and cleanups of XML
  Catalog
   - a few bug fixes and some portability changes
   - some documentation cleanups


2.4.3:  Aug 23 2001:
   - XML Catalog support see the doc
   - New NaN/Infinity floating point code
   - A few bug fixes


2.4.2:  Aug 15 2001:
   - adds xmlLineNumbersDefault() to control line number generation
   - lot of bug fixes
   - the Microsoft MSC projects files should now be up to date
   - inheritance of namespaces from DTD defaulted attributes
   - fixes a serious potential security bug
   - added a --format option to xmllint


2.4.1:  July 24 2001:
   - possibility to keep line numbers in the tree
   - some computation NaN fixes
   - extension of the XPath API
   - cleanup for alpha and ia64 targets
   - patch to allow saving through HTTP PUT or POST


2.4.0: July 10 2001:
   - Fixed a few bugs in XPath, validation, and tree handling.
   - Fixed XML Base implementation, added a couple of examples to the
    regression tests
   - A bit of cleanup


2.3.14: July 5 2001:
   - fixed some entities problems and reduce memory requirement when
    substituting them
   - lots of improvements in the XPath queries interpreter can be
    substantially faster
   - Makefiles and configure cleanups
   - Fixes to XPath variable eval, and compare on empty node set
   - HTML tag closing bug fixed
   - Fixed an URI reference computation problem when validating


2.3.13: June 28 2001:
   - 2.3.12 configure.in was broken as well as the push mode XML parser
   - a few more fixes for compilation on Windows MSC by Yon Derek


1.8.14: June 28 2001:
   - Zbigniew Chyla gave a patch to use the old XML parser in push mode
   - Small Makefile fix


2.3.12: June 26 2001:
   - lots of cleanup
   - a couple of validation fix
   - fixed line number counting
   - fixed serious problems in the XInclude processing
   - added support for UTF8 BOM at beginning of entities
   - fixed a strange gcc optimizer bugs in xpath handling of float, gcc-3.0
    miscompile uri.c (William), Thomas Leitner provided a fix for the
    optimizer on Tru64
   - incorporated Yon Derek and Igor Zlatkovic  fixes and improvements for
    compilation on Windows MSC
   - update of libxml-doc.el (Felix Natter)
   - fixed 2 bugs in URI normalization code


2.3.11: June 17 2001:
   - updates to trio, Makefiles and configure should fix some portability
    problems (alpha)
   - fixed some HTML serialization problems (pre, script, and block/inline
    handling), added encoding aware APIs, cleanup of this code
   - added xmlHasNsProp()
   - implemented a specific PI for encoding support in the DocBook SGML
    parser
   - some XPath fixes (-Infinity, / as a function parameter and namespaces
    node selection)
   - fixed a performance problem and an error in the validation code
   - fixed XInclude routine to implement the recursive behaviour
   - fixed xmlFreeNode problem when libxml is included statically twice
   - added --version to xmllint for bug reports


2.3.10: June 1 2001:
   - fixed the SGML catalog support
   - a number of reported bugs got fixed, in XPath, iconv detection,
    XInclude processing
   - XPath string function should now handle unicode correctly


2.3.9: May 19 2001:
Lots of bugfixes, and added a basic SGML catalog support:
   - HTML push bugfix #54891 and another patch from Jonas Borgstrom
   - some serious speed optimization again
   - some documentation cleanups
   - trying to get better linking on Solaris (-R)
   - XPath API cleanup from Thomas Broyer
   - Validation bug fixed #54631, added a patch from Gary Pennington, fixed
    xmlValidGetValidElements()
   - Added an INSTALL file
   - Attribute removal added to API: #54433
   - added a basic support for SGML catalogs
   - fixed xmlKeepBlanksDefault(0) API
   - bugfix in xmlNodeGetLang()
   - fixed a small configure portability problem
   - fixed an inversion of SYSTEM and PUBLIC identifier in HTML document


1.8.13: May 14 2001:
   - bugfixes release of the old libxml1 branch used by Gnome


2.3.8: May 3 2001:
   - Integrated an SGML DocBook parser for the Gnome project
   - Fixed a few things in the HTML parser
   - Fixed some XPath bugs raised by XSLT use, tried to fix the floating
    point portability issue
   - Speed improvement (8M/s for SAX, 3M/s for DOM, 1.5M/s for
    DOM+validation using the XML REC as input and a 700MHz celeron).
   - incorporated more Windows cleanup
   - added xmlSaveFormatFile()
   - fixed problems in copying nodes with entities references (gdome)
   - removed some troubles surrounding the new validation module


2.3.7: April 22 2001:
   - lots of small bug fixes, corrected XPointer
   - Non deterministic content model validation support
   - added xmlDocCopyNode for gdome2
   - revamped the way the HTML parser handles end of tags
   - XPath: corrections of namespaces support and number formatting
   - Windows: Igor Zlatkovic patches for MSC compilation
   - HTML output fixes from P C Chow and William M. Brack
   - Improved validation speed sensible for DocBook
   - fixed a big bug with ID declared in external parsed entities
   - portability fixes, update of Trio from Bjorn Reese


2.3.6: April 8 2001:
   - Code cleanup using extreme gcc compiler warning options, found and
    cleared half a dozen potential problem
   - the Eazel team found an XML parser bug
   - cleaned up the user of some of the string formatting function. used the
    trio library code to provide the one needed when the platform is missing
    them
   - xpath: removed a memory leak and fixed the predicate evaluation
    problem, extended the testsuite and cleaned up the result. XPointer seems
    broken ...


2.3.5: Mar 23 2001:
   - Biggest change is separate parsing and evaluation of XPath expressions,
    there is some new APIs for this too
   - included a number of bug fixes(XML push parser, 51876, notations,
  52299)
   - Fixed some portability issues


2.3.4: Mar 10 2001:
   - Fixed bugs #51860 and #51861
   - Added a global variable xmlDefaultBufferSize to allow default buffer
    size to be application tunable.
   - Some cleanup in the validation code, still a bug left and this part
    should probably be rewritten to support ambiguous content model :-\
   - Fix a couple of serious bugs introduced or raised by changes in 2.3.3
    parser
   - Fixed another bug in xmlNodeGetContent()
   - Bjorn fixed XPath node collection and Number formatting
   - Fixed a loop reported in the HTML parsing
   - blank space are reported even if the Dtd content model proves that they
    are formatting spaces, this is for XML conformance


2.3.3: Mar 1 2001:
   - small change in XPath for XSLT
   - documentation cleanups
   - fix in validation by Gary Pennington
   - serious parsing performances improvements


2.3.2: Feb 24 2001:
   - chasing XPath bugs, found a bunch, completed some TODO
   - fixed a Dtd parsing bug
   - fixed a bug in xmlNodeGetContent
   - ID/IDREF support partly rewritten by Gary Pennington


2.3.1: Feb 15 2001:
   - some XPath and HTML bug fixes for XSLT
   - small extension of the hash table interfaces for DOM gdome2
    implementation
   - A few bug fixes


2.3.0: Feb 8 2001 (2.2.12 was on 25 Jan but I didn't kept track):
   - Lots of XPath bug fixes
   - Add a mode with Dtd lookup but without validation error reporting for
    XSLT
   - Add support for text node without escaping (XSLT)
   - bug fixes for xmlCheckFilename
   - validation code bug fixes from Gary Pennington
   - Patch from Paul D. Smith correcting URI path normalization
   - Patch to allow simultaneous install of libxml-devel and
  libxml2-devel
   - the example Makefile is now fixed
   - added HTML to the RPM packages
   - tree copying bugfixes
   - updates to Windows makefiles
   - optimization patch from Bjorn Reese


2.2.11: Jan 4 2001:
   - bunch of bug fixes (memory I/O, xpath, ftp/http, ...)
   - added htmlHandleOmittedElem()
   - Applied Bjorn Reese's IPV6 first patch
   - Applied Paul D. Smith patches for validation of XInclude results
   - added XPointer xmlns() new scheme support


2.2.10: Nov 25 2000:
   - Fix the Windows problems of 2.2.8
   - integrate OpenVMS patches
   - better handling of some nasty HTML input
   - Improved the XPointer implementation
   - integrate a number of provided patches


2.2.9: Nov 25 2000:
   - erroneous release :-(


2.2.8: Nov 13 2000:
   - First version of XInclude
    support
   - Patch in conditional section handling
   - updated MS compiler project
   - fixed some XPath problems
   - added an URI escaping function
   - some other bug fixes


2.2.7: Oct 31 2000:
   - added message redirection
   - XPath improvements (thanks TOM !)
   - xmlIOParseDTD() added
   - various small fixes in the HTML, URI, HTTP and XPointer support
   - some cleanup of the Makefile, autoconf and the distribution content


2.2.6: Oct 25 2000::
   - Added an hash table module, migrated a number of internal structure to
    those
   - Fixed a posteriori validation problems
   - HTTP module cleanups
   - HTML parser improvements (tag errors, script/style handling, attribute
    normalization)
   - coalescing of adjacent text nodes
   - couple of XPath bug fixes, exported the internal API


2.2.5: Oct 15 2000::
   - XPointer implementation and testsuite
   - Lot of XPath fixes, added variable and functions registration, more
    tests
   - Portability fixes, lots of enhancements toward an easy Windows build
    and release
   - Late validation fixes
   - Integrated a lot of contributed patches
   - added memory management docs
   - a performance problem when using large buffer seems fixed


2.2.4: Oct 1 2000::
   - main XPath problem fixed
   - Integrated portability patches for Windows
   - Serious bug fixes on the URI and HTML code


2.2.3: Sep 17 2000:
   - bug fixes
   - cleanup of entity handling code
   - overall review of all loops in the parsers, all sprintf usage has been
    checked too
   - Far better handling of larges Dtd. Validating against DocBook XML Dtd
    works smoothly now.


1.8.10: Sep 6 2000:
   - bug fix release for some Gnome projects


2.2.2: August 12 2000:
   - mostly bug fixes
   - started adding routines to access xml parser context options


2.2.1: July 21 2000:
   - a purely bug fixes release
   - fixed an encoding support problem when parsing from a memory block
   - fixed a DOCTYPE parsing problem
   - removed a bug in the function allowing to override the memory
    allocation routines


2.2.0: July 14 2000:
   - applied a lot of portability fixes
   - better encoding support/cleanup and saving (content is now always
    encoded in UTF-8)
   - the HTML parser now correctly handles encodings
   - added xmlHasProp()
   - fixed a serious problem with &#38;
   - propagated the fix to FTP client
   - cleanup, bugfixes, etc ...
   - Added a page about libxml Internationalization
    support


1.8.9:  July 9 2000:
   - fixed the spec the RPMs should be better
   - fixed a serious bug in the FTP implementation, released 1.8.9 to solve
    rpmfind users problem


2.1.1: July 1 2000:
   - fixes a couple of bugs in the 2.1.0 packaging
   - improvements on the HTML parser


2.1.0 and 1.8.8: June 29 2000:
   - 1.8.8 is mostly a commodity package for upgrading to libxml2 according
    to new instructions. It fixes a nasty problem
    about &#38; charref parsing
   - 2.1.0 also ease the upgrade from libxml v1 to the recent version. it
    also contains numerous fixes and enhancements:
    
      added xmlStopParser() to stop parsing
      improved a lot parsing speed when there is large CDATA blocks
      includes XPath patches provided by Picdar Technology
      tried to fix as much as possible DTD validation and namespace
        related problems
      output to a given encoding has been added/tested
      lot of various fixes
    
  
   - added xmlStopParser() to stop parsing
   - improved a lot parsing speed when there is large CDATA blocks
   - includes XPath patches provided by Picdar Technology
   - tried to fix as much as possible DTD validation and namespace
        related problems
   - output to a given encoding has been added/tested
   - lot of various fixes


2.0.0: Apr 12 2000:
   - First public release of libxml2. If you are using libxml, it's a good
    idea to check the 1.x to 2.x upgrade instructions. NOTE: while initially
    scheduled for Apr 3 the release occurred only on Apr 12 due to massive
    workload.
   - The include are now located under $prefix/include/libxml (instead of
    $prefix/include/gnome-xml), they also are referenced by
    #include <libxml/xxx.h>
    instead of
    #include "xxx.h"
  
   - a new URI module for parsing URIs and following strictly RFC 2396
   - the memory allocation routines used by libxml can now be overloaded
    dynamically by using xmlMemSetup()
   - The previously CVS only tool tester has been renamed
    xmllint and is now installed as part of the libxml2
    package
   - The I/O interface has been revamped. There is now ways to plug in
    specific I/O modules, either at the URI scheme detection level using
    xmlRegisterInputCallbacks()  or by passing I/O functions when creating a
    parser context using xmlCreateIOParserCtxt()
   - there is a C preprocessor macro LIBXML_VERSION providing the version
    number of the libxml module in use
   - a number of optional features of libxml can now be excluded at
    configure time (FTP/HTTP/HTML/XPath/Debug)


2.0.0beta: Mar 14 2000:
   - This is a first Beta release of libxml version 2
   - It's available only fromxmlsoft.org
    FTP, it's packaged as libxml2-2.0.0beta and available as tar and
  RPMs
   - This version is now the head in the Gnome CVS base, the old one is
    available under the tag LIB_XML_1_X
   - This includes a very large set of changes. From a  programmatic point
    of view applications should not have to be modified too much, check the
    upgrade page
   - Some interfaces may changes (especially a bit about encoding).
   - the updates includes:
    
      fix I18N support. ISO-Latin-x/UTF-8/UTF-16 (nearly) seems correctly
        handled now
      Better handling of entities, especially well-formedness checking
        and proper PEref extensions in external subsets
      DTD conditional sections
      Validation now correctly handle entities content
      change
        structures to accommodate DOM
    
  
   - fix I18N support. ISO-Latin-x/UTF-8/UTF-16 (nearly) seems correctly
        handled now
   - Better handling of entities, especially well-formedness checking
        and proper PEref extensions in external subsets
   - DTD conditional sections
   - Validation now correctly handle entities content
   - change
        structures to accommodate DOM
   - Serious progress were made toward compliance, here are the result of the test against the
    OASIS testsuite (except the Japanese tests since I don't support that
    encoding yet). This URL is rebuilt every couple of hours using the CVS
    head version.


1.8.7: Mar 6 2000:
   - This is a bug fix release:
   - It is possible to disable the ignorable blanks heuristic used by
    libxml-1.x, a new function  xmlKeepBlanksDefault(0) will allow this. Note
    that for adherence to XML spec, this behaviour will be disabled by
    default in 2.x . The same function will allow to keep compatibility for
    old code.
   - Blanks in <a>  </a> constructs are not ignored anymore,
    avoiding heuristic is really the Right Way :-\
   - The unchecked use of snprintf which was breaking libxml-1.8.6
    compilation on some platforms has been fixed
   - nanoftp.c nanohttp.c: Fixed '#' and '?' stripping when processing
  URIs


1.8.6: Jan 31 2000:
   - added a nanoFTP transport module, debugged until the new version of rpmfind can use
    it without troubles


1.8.5: Jan 21 2000:
   - adding APIs to parse a well balanced chunk of XML (production [43] content of the
    XML spec)
   - fixed a hideous bug in xmlGetProp pointed by Rune.Djurhuus@fast.no
   - Jody Goldberg <jgoldberg@home.com> provided another patch trying
    to solve the zlib checks problems
   - The current state in gnome CVS base is expected to ship as 1.8.5 with
    gnumeric soon


1.8.4: Jan 13 2000:
   - bug fixes, reintroduced xmlNewGlobalNs(), fixed xmlNewNs()
   - all exit() call should have been removed from libxml
   - fixed a problem with INCLUDE_WINSOCK on WIN32 platform
   - added newDocFragment()


1.8.3: Jan 5 2000:
   - a Push interface for the XML and HTML parsers
   - a shell-like interface to the document tree (try tester --shell :-)
   - lots of bug fixes and improvement added over XMas holidays
   - fixed the DTD parsing code to work with the xhtml DTD
   - added xmlRemoveProp(), xmlRemoveID() and xmlRemoveRef()
   - Fixed bugs in xmlNewNs()
   - External entity loading code has been revamped, now it uses
    xmlLoadExternalEntity(), some fix on entities processing were added
   - cleaned up WIN32 includes of socket stuff


1.8.2: Dec 21 1999:
   - I got another problem with includes and C++, I hope this issue is fixed
    for good this time
   - Added a few tree modification functions: xmlReplaceNode,
    xmlAddPrevSibling, xmlAddNextSibling, xmlNodeSetName and
    xmlDocSetRootElement
   - Tried to improve the HTML output with help from Chris Lahey


1.8.1: Dec 18 1999:
   - various patches to avoid troubles when using libxml with C++ compilers
    the "namespace" keyword and C escaping in include files
   - a problem in one of the core macros IS_CHAR was corrected
   - fixed a bug introduced in 1.8.0 breaking default namespace processing,
    and more specifically the Dia application
   - fixed a posteriori validation (validation after parsing, or by using a
    Dtd not specified in the original document)
   - fixed a bug in


1.8.0: Dec 12 1999:
   - cleanup, especially memory wise
   - the parser should be more reliable, especially the HTML one, it should
    not crash, whatever the input !
   - Integrated various patches, especially a speedup improvement for large
    dataset from Carl Nygard,
    configure with --with-buffers to enable them.
   - attribute normalization, oops should have been added long ago !
   - attributes defaulted from DTDs should be available, xmlSetProp() now
    does entities escaping by default.


1.7.4: Oct 25 1999:
   - Lots of HTML improvement
   - Fixed some errors when saving both XML and HTML
   - More examples, the regression tests should now look clean
   - Fixed a bug with contiguous charref


1.7.3: Sep 29 1999:
   - portability problems fixed
   - snprintf was used unconditionally, leading to link problems on system
    were it's not available, fixed


1.7.1: Sep 24 1999:
   - The basic type for strings manipulated by libxml has been renamed in
    1.7.1 from CHAR to xmlChar. The reason
    is that CHAR was conflicting with a predefined type on Windows. However
    on non WIN32 environment, compatibility is provided by the way of  a
    #define .
   - Changed another error : the use of a structure field called errno, and
    leading to troubles on platforms where it's a macro


1.7.0: Sep 23 1999:
   - Added the ability to fetch remote DTD or parsed entities, see the nanohttp module.
   - Added an errno to report errors by another mean than a simple printf
    like callback
   - Finished ID/IDREF support and checking when validation
   - Serious memory leaks fixed (there is now a memory wrapper module)
   - Improvement of XPath
    implementation
   - Added an HTML parser front-end

Daniel Veillard at 
bugs.html
doc/alt-libxml2-devel/tutorial/includexpath.c000064400000002723151730335120015240 0ustar00<![CDATA[
#include <libxml/parser.h>
#include <libxml/xpath.h>

xmlDocPtr
getdoc (char *docname) {
	xmlDocPtr doc;
	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return NULL;
	}

	return doc;
}

xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
	
	xmlXPathContextPtr context;
	xmlXPathObjectPtr result;

	context = xmlXPathNewContext(doc);
	if (context == NULL) {
		printf("Error in xmlXPathNewContext\n");
		return NULL;
	}
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL) {
		printf("Error in xmlXPathEvalExpression\n");
		return NULL;
	}
	if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
		xmlXPathFreeObject(result);
                printf("No result\n");
		return NULL;
	}
	return result;
}
int
main(int argc, char **argv) {

	char *docname;
	xmlDocPtr doc;
	xmlChar *xpath = (xmlChar*) "//keyword";
	xmlNodeSetPtr nodeset;
	xmlXPathObjectPtr result;
	int i;
	xmlChar *keyword;
		
	if (argc <= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	doc = getdoc(docname);
	result = getnodeset (doc, xpath);
	if (result) {
		nodeset = result->nodesetval;
		for (i=0; i < nodeset->nodeNr; i++) {
			keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
		printf("keyword: %s\n", keyword);
		xmlFree(keyword);
		}
		xmlXPathFreeObject (result);
	}
	xmlFreeDoc(doc);
	xmlCleanupParser();
	return (1);
}
]]>doc/alt-libxml2-devel/tutorial/apg.html000064400000005716151730335120014046 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>G.�Code for Retrieving Attribute Value Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apf.html" title="F.�Code for Add Attribute Example"><link rel="next" href="aph.html" title="H.�Code for Encoding Conversion Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">G.�Code for Retrieving Attribute Value Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apf.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="aph.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="getattributeappendix"></a>G.�Code for Retrieving Attribute Value Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;libxml/xmlmemory.h&gt;
#include &lt;libxml/parser.h&gt;

void
getReference (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *uri;
	cur = cur-&gt;xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"reference"))) {
		    uri = xmlGetProp(cur, "uri");
		    printf("uri: %s\n", uri);
		    xmlFree(uri);
	    }
	    cur = cur-&gt;next;
	}
	return;
}


void
parseDoc(char *docname) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	if (xmlStrcmp(cur-&gt;name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}
	
	getReference (doc, cur);
	xmlFreeDoc(doc);
	return;
}

int
main(int argc, char **argv) {

	char *docname;

	if (argc &lt;= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	parseDoc (docname);
	
	return (1);
}

</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apf.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="aph.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">F.�Code for Add Attribute Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�H.�Code for Encoding Conversion Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s05.html000064400000016434151730335130014372 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Using XPath to Retrieve Element Content</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s04.html" title="Retrieving Element Content"><link rel="next" href="ar01s06.html" title="Writing element content"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Using XPath to Retrieve Element Content</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s04.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s06.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialxpath"></a>Using XPath to Retrieve Element Content</h2></div></div><div></div></div><p>In addition to walking the document tree to find an element,
    <span class="application">Libxml2</span> includes support for
      use of <span class="application">XPath</span> expressions to retrieve sets of
      nodes that match a specified criteria. Full documentation of the
      <span class="application">XPath</span> <span class="acronym">API</span> is <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html" target="_top">here</a>.
    </p><p><span class="application">XPath</span> allows searching through a document
    for nodes that match specified criteria. In the example below we search
      through a document for the contents of all <tt class="varname">keyword</tt>
    elements.
      </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p>A full discussion of <span class="application">XPath</span> is beyond
	  the scope of this document. For details on its use, see the <a href="http://www.w3.org/TR/xpath" target="_top">XPath specification</a>.</p></td></tr></table></div><p>
      Full code for this example is at <a href="apd.html" title="D.�Code for XPath Example">Appendix�D, <i>Code for XPath Example</i></a>.
    </p><p>Using <span class="application">XPath</span> requires setting up an
      xmlXPathContext and then supplying the <span class="application">XPath</span>
      expression and the context to the
      <tt class="function">xmlXPathEvalExpression</tt> function. The function returns
      an xmlXPathObjectPtr, which includes the set of nodes satisfying the
      <span class="application">XPath</span> expression.</p><p>
      </p><pre class="programlisting">
	xmlXPathObjectPtr
	getnodeset (xmlDocPtr doc, xmlChar *xpath){
	
	<a name="cocontext"></a><img src="images/callouts/1.png" alt="1" border="0">xmlXPathContextPtr context;
	xmlXPathObjectPtr result;

	<a name="cocreatecontext"></a><img src="images/callouts/2.png" alt="2" border="0">context = xmlXPathNewContext(doc);
	<a name="corunxpath"></a><img src="images/callouts/3.png" alt="3" border="0">result = xmlXPathEvalExpression(xpath, context);
	<a name="cocheckxpathresult"></a><img src="images/callouts/4.png" alt="4" border="0">if(xmlXPathNodeSetIsEmpty(result-&gt;nodesetval)){
		xmlXPathFreeObject(result);
                printf("No result\n");
		return NULL;
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#cocontext"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>First we declare our variables.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#cocreatecontext"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>Initialize the <tt class="varname">context</tt> variable.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#corunxpath"><img src="images/callouts/3.png" alt="3" border="0"></a> </td><td valign="top" align="left"><p>Apply the <span class="application">XPath</span> expression.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#cocheckxpathresult"><img src="images/callouts/4.png" alt="4" border="0"></a> </td><td valign="top" align="left"><p>Check the result and free the memory allocated to
	    <tt class="varname">result</tt> if no result is found.</p></td></tr></table></div><p>
    </p><p>The xmlPathObjectPtr returned by the function contains a set of nodes
    and other information needed to iterate through the set and act on the
      results. For this example, our functions returns the
    <tt class="varname">xmlXPathObjectPtr</tt>. We use it to print the contents of
      <tt class="varname">keyword</tt> nodes in our document. The node set object
      includes the number of elements in the set (<tt class="varname">nodeNr</tt>) and
      an array of nodes (<tt class="varname">nodeTab</tt>):
      </p><pre class="programlisting">
	<a name="conodesetcounter"></a><img src="images/callouts/1.png" alt="1" border="0">for (i=0; i &lt; nodeset-&gt;nodeNr; i++) {
	<a name="coprintkeywords"></a><img src="images/callouts/2.png" alt="2" border="0">keyword = xmlNodeListGetString(doc, nodeset-&gt;nodeTab[i]-&gt;xmlChildrenNode, 1);
		printf("keyword: %s\n", keyword);
	        xmlFree(keyword);
	}
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#conodesetcounter"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>The value of <tt class="varname">nodeset-&gt;Nr</tt> holds the number of
	  elements in the node set. Here we use it to iterate through the array.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#coprintkeywords"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>Here we print the contents of each of the nodes returned.
	    </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p>Note that we are printing the child node of the node that is
		returned, because the contents of the <tt class="varname">keyword</tt>
		element are a child text node.</p></td></tr></table></div><p>
	  </p></td></tr></table></div><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s04.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Retrieving Element Content�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Writing element content</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/index.html000064400000013523151730335130014402 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Libxml Tutorial</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="next" href="ar01s02.html" title="Data Types"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Libxml Tutorial</th></tr><tr><td width="20%" align="left">�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s02.html">Next</a></td></tr></table><hr></div><div class="article" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="id2473660"></a>Libxml Tutorial</h1></div><div><div class="author"><h3 class="author"><span class="firstname">John</span> <span class="surname">Fleck</span></h3></div></div><div><p class="copyright">Copyright � 2002, 2003 John Fleck</p></div><div><div class="revhistory"><table border="1" width="100%" summary="Revision history"><tr><th align="left" valign="top" colspan="2"><b>Revision History</b></th></tr><tr><td align="left">Revision 1</td><td align="left">June 4, 2002</td></tr><tr><td align="left" colspan="2">Initial draft</td></tr><tr><td align="left">Revision 2</td><td align="left">June 12, 2002</td></tr><tr><td align="left" colspan="2">retrieving attribute value added</td></tr><tr><td align="left">Revision 3</td><td align="left">Aug. 31, 2002</td></tr><tr><td align="left" colspan="2">freeing memory fix</td></tr><tr><td align="left">Revision 4</td><td align="left">Nov. 10, 2002</td></tr><tr><td align="left" colspan="2">encoding discussion added</td></tr><tr><td align="left">Revision 5</td><td align="left">Dec. 15, 2002</td></tr><tr><td align="left" colspan="2">more memory freeing changes</td></tr><tr><td align="left">Revision 6</td><td align="left">Jan. 26. 2003</td></tr><tr><td align="left" colspan="2">add index</td></tr><tr><td align="left">Revision 7</td><td align="left">April 25, 2003</td></tr><tr><td align="left" colspan="2">add compilation appendix</td></tr><tr><td align="left">Revision 8</td><td align="left">July 24, 2003</td></tr><tr><td align="left" colspan="2">add XPath example</td></tr><tr><td align="left">Revision 9</td><td align="left">Feb. 14, 2004</td></tr><tr><td align="left" colspan="2">Fix bug in XPath example</td></tr><tr><td align="left">Revision 7</td><td align="left">Aug. 24, 2004</td></tr><tr><td align="left" colspan="2">Fix another bug in XPath example</td></tr></table></div></div></div><div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><a href="index.html#introduction">Introduction</a></dt><dt><a href="ar01s02.html">Data Types</a></dt><dt><a href="ar01s03.html">Parsing the file</a></dt><dt><a href="ar01s04.html">Retrieving Element Content</a></dt><dt><a href="ar01s05.html">Using XPath to Retrieve Element Content</a></dt><dt><a href="ar01s06.html">Writing element content</a></dt><dt><a href="ar01s07.html">Writing Attribute</a></dt><dt><a href="ar01s08.html">Retrieving Attributes</a></dt><dt><a href="ar01s09.html">Encoding Conversion</a></dt><dt>A. <a href="apa.html">Compilation</a></dt><dt>B. <a href="apb.html">Sample Document</a></dt><dt>C. <a href="apc.html">Code for Keyword Example</a></dt><dt>D. <a href="apd.html">Code for XPath Example</a></dt><dt>E. <a href="ape.html">Code for Add Keyword Example</a></dt><dt>F. <a href="apf.html">Code for Add Attribute Example</a></dt><dt>G. <a href="apg.html">Code for Retrieving Attribute Value Example</a></dt><dt>H. <a href="aph.html">Code for Encoding Conversion Example</a></dt><dt>I. <a href="api.html">Acknowledgements</a></dt></dl></div><div class="abstract"><p class="title"><b>Abstract</b></p><p>Libxml is a freely licensed C language library for handling
    <span class="acronym">XML</span>, portable across a large number of platforms. This
    tutorial provides examples of its basic functions.</p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction"></a>Introduction</h2></div></div><div></div></div><p>Libxml is a C language library implementing functions for reading,
      creating and manipulating <span class="acronym">XML</span> data. This tutorial
    provides example code and explanations of its basic functionality.</p><p>Libxml and more details about its use are available on <a href="https://gitlab.gnome.org/GNOME/libxml2" target="_top">the project home page</a>. Included there is complete <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/general.html" target="_top">
	<span class="acronym">API</span> documentation</a>. This tutorial is not meant
    to substitute for that complete documentation, but to illustrate the
    functions needed to use the library to perform basic operations.

</p><p>The tutorial is based on a simple <span class="acronym">XML</span> application I
    use for articles I write. The format includes metadata and the body
    of the article.</p><p>The example code in this tutorial demonstrates how to:
      </p><div class="itemizedlist"><ul type="disc"><li><p>Parse the document.</p></li><li><p>Extract the text within a specified element.</p></li><li><p>Add an element and its content.</p></li><li><p>Add an attribute.</p></li><li><p>Extract the value of an attribute.</p></li></ul></div><p>
    </p><p>Full code for the examples is included in the appendices.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left">�</td><td width="20%" align="center">�</td><td width="40%" align="right">�<a accesskey="n" href="ar01s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">�</td><td width="20%" align="center">�</td><td width="40%" align="right" valign="top">�Data Types</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/apb.html000064400000003752151730335130014040 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>B.�Sample Document</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apa.html" title="A.�Compilation"><link rel="next" href="apc.html" title="C.�Code for Keyword Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">B.�Sample Document</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apa.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apc.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="sampledoc"></a>B.�Sample Document</h2></div></div><div></div></div><pre class="programlisting">
&lt;?xml version="1.0"?&gt;
&lt;story&gt;
  &lt;storyinfo&gt;
    &lt;author&gt;John Fleck&lt;/author&gt;
    &lt;datewritten&gt;June 2, 2002&lt;/datewritten&gt;
    &lt;keyword&gt;example keyword&lt;/keyword&gt;
  &lt;/storyinfo&gt;
  &lt;body&gt;
    &lt;headline&gt;This is the headline&lt;/headline&gt;
    &lt;para&gt;This is the body text.&lt;/para&gt;
  &lt;/body&gt;
&lt;/story&gt;
</pre></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apa.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apc.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">A.�Compilation�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�C.�Code for Keyword Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/apd.html000064400000006240151730335130014035 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>D.�Code for XPath Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apc.html" title="C.�Code for Keyword Example"><link rel="next" href="ape.html" title="E.�Code for Add Keyword Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">D.�Code for XPath Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apc.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ape.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="xpathappendix"></a>D.�Code for XPath Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;libxml/parser.h&gt;
#include &lt;libxml/xpath.h&gt;

xmlDocPtr
getdoc (char *docname) {
	xmlDocPtr doc;
	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return NULL;
	}

	return doc;
}

xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
	
	xmlXPathContextPtr context;
	xmlXPathObjectPtr result;

	context = xmlXPathNewContext(doc);
	if (context == NULL) {
		printf("Error in xmlXPathNewContext\n");
		return NULL;
	}
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL) {
		printf("Error in xmlXPathEvalExpression\n");
		return NULL;
	}
	if(xmlXPathNodeSetIsEmpty(result-&gt;nodesetval)){
		xmlXPathFreeObject(result);
                printf("No result\n");
		return NULL;
	}
	return result;
}
int
main(int argc, char **argv) {

	char *docname;
	xmlDocPtr doc;
	xmlChar *xpath = (xmlChar*) "//keyword";
	xmlNodeSetPtr nodeset;
	xmlXPathObjectPtr result;
	int i;
	xmlChar *keyword;
		
	if (argc &lt;= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	doc = getdoc(docname);
	result = getnodeset (doc, xpath);
	if (result) {
		nodeset = result-&gt;nodesetval;
		for (i=0; i &lt; nodeset-&gt;nodeNr; i++) {
			keyword = xmlNodeListGetString(doc, nodeset-&gt;nodeTab[i]-&gt;xmlChildrenNode, 1);
		printf("keyword: %s\n", keyword);
		xmlFree(keyword);
		}
		xmlXPathFreeObject (result);
	}
	xmlFreeDoc(doc);
	xmlCleanupParser();
	return (1);
}
</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apc.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ape.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">C.�Code for Keyword Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�E.�Code for Add Keyword Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s03.html000064400000013126151730335130014363 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Parsing the file</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s02.html" title="Data Types"><link rel="next" href="ar01s04.html" title="Retrieving Element Content"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Parsing the file</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s02.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s04.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialparsing"></a>Parsing the file</h2></div></div><div></div></div><p><a class="indexterm" name="fileparsing"></a>
Parsing the file requires only the name of the file and a single
      function call, plus error checking. Full code: <a href="apc.html" title="C.�Code for Keyword Example">Appendix�C, <i>Code for Keyword Example</i></a></p><p>
    </p><pre class="programlisting">
        <a name="declaredoc"></a><img src="images/callouts/1.png" alt="1" border="0"> xmlDocPtr doc;
	<a name="declarenode"></a><img src="images/callouts/2.png" alt="2" border="0"> xmlNodePtr cur;

	<a name="parsefile"></a><img src="images/callouts/3.png" alt="3" border="0"> doc = xmlParseFile(docname);
	
	<a name="checkparseerror"></a><img src="images/callouts/4.png" alt="4" border="0"> if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}

	<a name="getrootelement"></a><img src="images/callouts/5.png" alt="5" border="0"> cur = xmlDocGetRootElement(doc);
	
	<a name="checkemptyerror"></a><img src="images/callouts/6.png" alt="6" border="0"> if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	<a name="checkroottype"></a><img src="images/callouts/7.png" alt="7" border="0"> if (xmlStrcmp(cur-&gt;name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}

    </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#declaredoc"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>Declare the pointer that will point to your parsed document.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#declarenode"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>Declare a node pointer (you'll need this in order to
	  interact with individual nodes).</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#checkparseerror"><img src="images/callouts/4.png" alt="4" border="0"></a> </td><td valign="top" align="left"><p>Check to see that the document was successfully parsed. If it
	    was not, <span class="application">libxml</span> will at this point
	    register an error and stop. 
	    </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p><a class="indexterm" name="id2525337"></a>
One common example of an error at this point is improper
	    handling of encoding. The <span class="acronym">XML</span> standard requires
	    documents stored with an encoding other than UTF-8 or UTF-16 to
	    contain an explicit declaration of their encoding. If the
	    declaration is there, <span class="application">libxml</span> will
	    automatically perform the necessary conversion to UTF-8 for
		you. More information on <span class="acronym">XML's</span> encoding
		requirements is contained in the <a href="http://www.w3.org/TR/REC-xml#charencoding" target="_top">standard</a>.</p></td></tr></table></div><p>
	  </p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#getrootelement"><img src="images/callouts/5.png" alt="5" border="0"></a> </td><td valign="top" align="left"><p>Retrieve the document's root element.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#checkemptyerror"><img src="images/callouts/6.png" alt="6" border="0"></a> </td><td valign="top" align="left"><p>Check to make sure the document actually contains something.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#checkroottype"><img src="images/callouts/7.png" alt="7" border="0"></a> </td><td valign="top" align="left"><p>In our case, we need to make sure the document is the right
	  type. "story" is the root type of the documents used in this
	  tutorial.</p></td></tr></table></div><p>
      <a class="indexterm" name="id2525415"></a>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s02.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Data Types�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Retrieving Element Content</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/api.html000064400000003553151730335130014046 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>I.�Acknowledgements</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="aph.html" title="H.�Code for Encoding Conversion Example"><link rel="next" href="ix01.html" title="Index"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">I.�Acknowledgements</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="aph.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ix01.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="id2588597"></a>I.�Acknowledgements</h2></div></div><div></div></div><p>A number of people have generously offered feedback, code and
    suggested improvements to this tutorial. In no particular order:
      <span class="simplelist">Daniel Veillard, Marcus Labib Iskander, Christopher R. Harris, Igor Zlatkovic, Niraj Tolia, David Turover</span>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="aph.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ix01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">H.�Code for Encoding Conversion Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Index</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/images/toc-minus.png000064400000000403151730335130016267 0ustar00�PNG


IHDR	��)�bKGD��#2IDATx�ch���`����g I׏j?}-p�Z�ECtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignatureecf413ef47524404f90c44d8c7d12a2e݈��
tEXtPage15x9+0+07v�IEND�B`�doc/alt-libxml2-devel/tutorial/images/draft.png000064400000042056151730335130015463 0ustar00�PNG


IHDR��K�ZJgAMA���a IDATx����v۸��a<�N�G��3��mQ<�/������ �W�TB1r̩,�Z���4MY�m}[2[��躮m۾﷾�-�[��u]w�\�i��Y)U���w�
*i@\��VJ��x�\[OSI"r��b����q��	��󼪪����Ն��Q�&��R�8*��և��	i���Oh!������ӄ4`c�$�RJk-��R� 9MH�tcB/�ӄ4`3�&�8NN��m�}�@B���4!
�c5�#�4!
mM
}m��$՜&�A�}߶�V�f�n@8z1�0KZ�����<��Ry�c�<y����?�8O�,ˊ�h�Fk��1 �!�� �ޑЏ!�~��#���k�_H�i�>�s��V�8��	B�������Lh�p7������v��8�<�[w�`�9*i�$��4`-�B�
	�!
x�b^�8x5�oT��G�������a���0s��;����&��!��b�;0��7������kBC}����b$�xk���eY��?��|���o�s$��x�� �c��x�����?������	�/����󇄎
{w������:R�qpt�����5Ih'x���H�1'
��<t�x�H��&��)���p8>桕R�4EAB;�[	���?��Hh�������ŏ����1}�Z���BN�BH�Q������v���C�4�)r�B�2�9턶�n}�|�CCk��ׯ<g�QI@���C�zz%*iHֆ5�5��QI@�����QO?������9�BR[Br��I@R"���
��w���tD�Њz�N�4$"�N��INð���!
)�w���Z�˺!
������-h�}���m�)�B)5����Z???�k�#Bv�_B7M���\.}�.���EN��n�+�	m��Z�u]�e�en_���Wƽ?EH�.�Nh��09-}d��G�4쏏��Z�K�������3��,ˏ	��ߺ��� ��q�$|B/�����FH�n����F��V�{��p7�C�y�o~�qo���*i؁�k�k�{C%
��*�}d��F�?�B�4EQ<|�[��w@�6��}d����F�?EN{�p7�h	�B�G����M%
����>zA=�	�4�ew	���i�}d�x�4!
�����ZHNWUŸ�C�4�b/��_a~�9B�����[�4l/���C�4l,���+�4l)���r�ϟ?	�4�`3�&��+m�-�c����8z%*i�@�5�5���������WO���#xyy9NB�����7?��6ϳ��3cNh��Lk�ظw��NH�1&��i�֮.yB�e=�9i�4M�8�m�r�v/	���.���@b�,���5ẻ�V��w���ͬ���������[�x���m=�oD%
������k�	���v�R"��e�2ʽ��V��}B�����v=��%������~��n��4M�0\.�Oǽ�K�km������{_�ބ4D��d桿 �����8Z�9ɧ��GHh�T�4�{�C%
μ���$�ʤ�������k�4�!�O��T���,;NBrzAH���C���y��iʲ,�N��ӂ����Z��ik��òv��V�4��1����} �7�}��J�y�eѳ�I�ބ4<蛄��z�Ӿg��iB�cBrz��i��:���I��nL���녙�~~~.���K܅J����rWB+�i��O����}�%�BH���$��3?UN�p���E��z2?��,��fNn�Xk]�%��kg~�J~��ZK=��q�	i���bߛ�y�q�|�Ar������Bk��y��ݗۉ#�1'
_�Ь�v�mۮ��y��*[�OSI��H�]��V�ބ4|��ޑ��Z�Mr��nx��ޣ$�eQI� �w*�~o*i��{Oθ	Rb�4�4���Њ�.�uYT����iI����_;���[I����pt�ЩJ����ph�:�szs	�{SI8.j�#�u=M%
�H���4�4�#b=��촞��p8��>���O���Q���cN���>���4!
�(Hh���4!
�X�E�4UU�"�	i���g��MӐ�{T�.r���8��$��u��7!
 e�F�I��??MHH��Q��ӄ4�4�;}��NL���l
 A�v���N��r�.�}C����Ӯ�$t�⬧	iI�S�0�	i�S+Ŗӄ4�D�ND�~��1)`�nE�GF%
`�Hh8ɸ7!
`�HhxCN�v���W��O����F���M��]bO1��U�4������	i;����&9MH�
�ӄ4��`O1l.XN�?uB�>�/7" ��<��Zks����
Q��Z)�߻(������ZSI�	�y���Z1�
 r$4��|?�w	���@�Hh���>'ZQI�	�]p2�iB+B@�Hh��ʜ�*�!
 B$��49��s���VJ�@\H�5�q�a�q���v��uY�'�"�D��^C�m[��<�J)r:��r�DŽVw�	��uB+��y�n�Os�-	���D��^�]B�iE=���}�u��	�i1 ��4��<�r�9��R�cNߞЊ��9z�oZL�DNo�Ӝ�+�!
`[���kZL�ĸ�&���	�i��^�Ƅ�{oe�i���	�ػ�VH�5�J�E�eeY���}/��ߕЊ��	���y���c	-��Xk�Mh�:i��kHB������~:�ZQI�GBk���8NB��XcLUU���	��8�}�?\C_�>2���!�א�r�<6j��޻@H��^��(�;�4M���֕�!
�;O	}�N1%o��EQ$��!
�/5t�4���^�o�y^UUUUί������kx��I�]�����kPCC�<y}}u��J)��8	�[XkI�}!�����*�987ϳ1�?��Qn�Ip�_B�,�~���jT{�����9�$���V�y�Z{M�i�^^^�y��[��)FB�!
�%cL]�EQ�����˲���	�O��#��BB�+�4/��vۢ�N9-g[��!
���,��,g[�����*˒��;�`�k����2����,F��=���G�O��zh:%�4���w�ib�܂�n�0�-�i�S7���1��PO+w"��s�&�q/B@P��iIh竭	�4�l�h����x��vС�ijh<�J�f�PO�۱D>��i��������>jh� ��l,�zz�v��e��8��l,�iN���XN��p���dr���C�I��<�m��w~���[�4���7�e�	
��cL�4��^N�$��!
 :��iO�~ZkI�#��h��9��gQ$�1'
 ^��O�)�iQ��Ƙ߿ߛ�$4|c�@���O��|�7	�i����l�s��Y���X�v��yY^χ�l+\cN�n�#{~~β���u��,˺��^�F%
`7��{���~�9�SB[ke����;T�vF���>�>�Ӟv,Qt��kT�vF��,���4-��)���7���R�i�546AHث09������::�!
`���O�@B��Iرe~��i�Hh�(�`�i���qoWHh܎J��Y?�	���n���&�q�x�5�]"�i��2<&ڜ&���J�4	����\�*�Ih����`pn��m�O��X�u�Ҵ��i�QIHֆ�4	
'i)�d�P��8�Ih8Ĝ4�􅜟�󜄆+T�!غ���i�8B�Q���y�_^^�i8AH8�0���4\��ڭ����m[���Ƙ_�~eY��%�<*i�ø7���pD�4v��n�5���r�qoĉJ�qc�.˒zq"�ڒ��{#Bw�ވ�40�H��9�(�@\�q�}�BN#6�Iy}}�,K9�P)�4|f~Zk���o��=B��$��y�gYVU�1���>2D����.��UU�繜	�u���ӈ!
lVJYk��EQ�y^UQ���!
l���Bf�}�A=�m��nI�O�\9�
�fNh��6ƔeYE�e�0�6V&�5km�4Y�IaMZ�@Nc�4��	�0�Ȫ-9+�1p��Fx�4���^H]�u�eEQ(
k��iFHA���u]�d�5c�n�����	�вj����š�2W�iCH��L�OITSX;AN#Ba�^
�<�e/)�7�����Ҁw�'�;�s��y�+
�GQO�7B�+��Ka-;��y�!��!
xgB��&��,����e��AH��"��I[��\�ۑ�������m���o�nƘ,˪�ʲ��ۑ�������b;
9��D�4�+��n@N�9B�eǗ������.(�_Fsُ�i�EH�L�Զm�u	��{7M#��	���!��!
x�u����cVk]E<o�����P��9
Wi��i����0�Ykm]�y�_.k��������kc�e�"��!
�ն����Z���t2����4M�Zke�[�Z���5r�Ҁ_��?�<�K"��*�����a�q��œ���d\Z�i.�&9=���xZ�_�~��I"����RL?|�_�~-u���c��WR�Ks�֚�XPOc
B�n�?�<���<zz�޷Y���i�",[���h.a�ir:I�4��m�>�XR��ei�Y~Qʲ�m�i�m\nFX�8'C��x!
�������?n�ia���i���j�^�зl	~��`~ ����ooo}�?|������������.��Z�oa-c��w��2r�"����}ߟ���1M�TU��K��<���u}z�1�eƍi �y�_^^�q|��,˲i���Z+diu��<sd\
��#�����MN�����|x�Pq:�꺾�w��8MS���	y�E�D��
k�i܈��Yȴ������$�eT:��j_�.�j�8��RO��4���z��/{��;D,������2.S�J�#����!
5�|^SLgY����@�i���2I�hVc̲j+�1�09�����79�G�4���|>w]��
eY>???����<��8>|^�sI����=��:��"������y◗�5���t:�e�p5,�!M��F���<��2�i|��B�C�W��*�RN�|�
�D6��<���Y��j4N�\&�eI6���O���yyY�4�/��4M�a�4�;���;�����i|DH�bz�`EQ4M��i+��4�˔y�c�ua���8�4�!��m�\����Z?==�e�ꖄ�v�q���+i��	\ބ4Қ��5B��<ϯ��+���1���N�FKvA�v'�E�eRXgY�@T���<�e-����z|�6��0+g�����gWw%��]׵�Ԓ>p�/�̩_.���%�w}Ж� ._{��,�\54�+*i`3�8�����,�����w&M�4ϳ�XK�s��ߺ�,ˤ��2:~�4����2H��Y
/d��i����I����S׵����?U|�Ǹ7	�/w��Õׇ�0r:�������(
�
9b+����{9�CVm�+��qoWG��лC%
l���m�.�J)k���P0RU/M�?Id�2i��|_Q�&�����$�^���u���~�LY]}�\duu�Ga.�ޖ-�#��k�s�s:�H��a�ؒ�fY�2�eqs�>)y9i/�B�����/7v�\��}��Y[Z�ske�75�~QI�b���u�u�<�����[z�<��Z9bK�:�RU�,K�я�nգ�4	�k�4��q___�i�E�����Lv�^�ݮe�����Xߛ�$���@.��E����ܒ#�ڶu՜�4�Ks���{On�iٱD֋��78ǜ495ye�n�uEQn�l
-3�RX���<�(�RX�e����H�4PI�p�K���m�ߓ��7o	C�Ŕ�P"ܹ�z��N�4kmUU�0��5��q-	'gU�y.ۖE��Z��g^VmE�\�M��l�FB��J���%�Vk�63��[�w�)����UUIU�
���1MӐ�ɠ�b!���#�b~F/Gl��02�I�}���#Fdƺ�kY�}����N�4�i�ڶ�ne\�u}:�\ݕo2�-ۖy=A�!���\��x!��4MeY�Љ!���8Y�e�yzz��Ի�4W�}�u]�U���iY�%����z����mxp��n .eY.3�������2�+{�n}/?�7VJ���VmI/z�E|S��HM���Q.k�|����ͷq��}�P7N�Q��P�h�!
�Ek]���(��"J)��x�0������M��^�ˌ1y���3�œ4��\.+�S����.b�	�)km�g����PI�Y�Wa�8v]W׵�[�bY3����$�H{�_-{�o}_�*i F���,���b��ҫ�?%��D*�2�q#*i FN�ǔR}ߗe)�qFHj��Z��dt	iY�Es~D%
D�Z���~����i"̃��П��o���ߠ��UU��!�ii�5��㱗��y��Y�UU�5>E%
�k����ו;e�ZQ�L/�b�,˺��i�^-������g�2Ć��e����ue�fY�����_zW\Z*Q9��:Y���U|��c����,�x�¶i j�0���qW>���Y�Kڐ�^Xk��*��7�&�v�)a�|��Vi vooo]׭�H���i��}$tQ߷��6�m��4���@6,��M����=;i[�%�!�����?�69L�ؒ
F\݃W�BN���0�"���9�[vG��|��e���ޘ�׿_k}:��q�C�����#J+Y��$��@�1MӬÚ����w��ބ���PR�:�+�䈎�(X�up|���ݼW�����Oh��H�w�,��G꺮�JEv�E�eMӐ�P4�{�u��XZ맧�`��FRCO�i�.��ZNHhB؇y�����7^�u�4M���ߎ%>�K�����pu��C��X�>H��m��:Z����(���W����j���m�B�����vc��?��\I����XI�ӄ�&C�RX�'��)�5{"F���T��
D�	����J�,�d�����ۉ��
�4�'�8����_�u:��8W7&��ߑC$ew>NB�����SU��rYsI�y����F
���Ry�˪�y�e��m$4�GH{b�q��}�E�0�ӫ�ߑC$�1���Kg��m�Hh���v������/��UNo�/wxRX�B�(�F�Բ�glGD��v�Z+Gn�q�Z���7_j�5�mB/�������A�ļ=����$J|/ҟ_�qW'�K��e��t��ߓ�EUUOOO�ө,�[އe_n?���YF�����:Y��!ӏE���#YT-U�8������0�
��Z�I��iMI-�O��>FB�e�,�VJɦ��fHh܋Jث�m��j�yzz�7�I�[,�v��,�M�0��PI�d�-�B����T{w�x��7Zή���UUI���}aOi`��e)˲�;K�m+�ʷ�f�^���6տ#��_�WZ�N��1t}�)VE�	��6�����?`ߜ:�uݏ��Ӯ�MӐ^�W��@���v��e��~��L�~�Hh`�I#"���Z;ϳ�A$[k-7��Z~��SwA~X�%���ҁ���.���~DHcKKO�$t(���%9�u5�g����yJ]E��HS�}����󼪪w�NBb�4�!���N��x�,�zZ�JjJ���8��///+w϶��u]�����4���A6yX�Zb��p���y��a�M�de��Zk�<�ш�/�����&���QI#���NB�k�[��2x{��zǗ���?��ڲ,����1$4B!H�+}�� IDAT)��g�W�U���r����ol�eOOOr5�!
�$�۶�d�LZ7M��|����___��y}�!
����neO�z�\&�On{'�Xk���-ے�DBk�\X`C�Z9XW
��g���rʯ��ʲl�[�A�bI/^d�Ox�4ܓ�}߯_���RWU�^N��������֣��c�ڶm�����{Gz˧iJ/?�1UU��$4�??pF��^__��o�;�<K���<����qp��n�!ۉ��#v�,�N��1f�`s�m۶m�zup��"8 =b��v�{��4M2�;M���l���K�Ѐ[� a�q��s۶;�9�DO)�����<� 	
8��V�Q
��'��7�sb9]UU�[Hh�~��a���0	t6$�Ӳ�Z��#�O��ƒ����Hh�RNgYV�u�o
;���C�G����½y���s벲,���_�S�%	
x���jBk���[!�ǛQn�7~�p��mNh1����ˮ[�DUUr��$4?]��,��.B�����ZkO=��Ca��[�����]"�fu]���Z�8GDk�<4?c�I�m���O���{�����)��)X�Y���,4���_km�����l���y�&��<�V��8��i��1y�k�f�~桁�i��kB[k%��,����ދC~�,��Qh9hR��w`�mk�����x��yY�]׭��֚�B"���	-I\�u����O��e5QQRUK�+i���0Y���b��o����]d���*�%	����6�,{��X����}�;���/����d�s���_?�PU��t
��(pd�4>�/��&�:^���1����_x����~Ϝ���|>;�y����~��}a�����n�Z�eYY�eYfY���˘�Ll;��Ud�w��]�j�^z�_
���1�{RC;O���O���tr���ʲ���Ӡ�4���r0r䆓K����:~DH�?x�S�t:UUU������s����G�7����H1�d�~�&W#��GH��|��Z�_�~�e�i�w�������G���^I7����4د�����b���4����ׯ_n_�Z�uݮ��Z+��/%���_��i(�a�[�w>�Na
菤�v��R��:��}c�_J>��Ӏo�4܏r��p]�ۮYʲ�i���L��6�8yOd8�n��|��>:�5t��M�l����A���%�v]L���N.u�\8u�!}h�kh	�<�#YD++��!士�m���	-���I�M8��-��/��j���.���(���<��0��b��!9Oh�+#��eY:<S��>�a�jSJMӔ�D+��)�4gB����L'�ڊ�8��[N])E�H�?��s����JeY�d`VN�\�mYk˲t���r�Ҁ'�>U�I�b_qX;���H�fsu��o�D+�+�:H��W����\'�����믣��
SxO�����
'��J)c��L���{��V��ǜ�m
@�AB���b��ᔢ��*'k�����pn7OX<��^8�g	�4�v��
';�y�1�������	���dkm��B�v56�}2��]>gq#�����u��]h�T���e�ۦQ���8Ԟb7r2-��f&�dY�䳋��r�0�
8�ק-�磆�|O���Wi�N)���p��y�u)�9�����ŧ�1feN�f&)��Zّ�ɥd��KP�tzH�����Z�ms5<0C�u�@҉!�o�&b��Y<��u]���dڼ'�y򂄾��|����H�j}WJ��
�����H���&?d�;�2ZdY�d�1����m[���K�{X����<�k�R2ܝ��"�<w�K(�N���9V[�Nz��W��u����ڮ�R}��`R{

��w���$G�e�GH��N.5�#m�J	>���m[�.r��+a���:Ȁ��|A۶m�:�`�	-e�3�R}�1�(
W�E��c-�Fʏ���ЏY?��~ò�I۠���}O�7𰔟ȩ:��$���+�^��q-Y0���0���I���$���ckm�oѢ,KW�c�f�s��Gy褁Qo�ZWUu���(
W�i�X3
<&�GsJH�5�iZ3!m�Ͳ,���h���0Ƹ:r�Ao�1�?��@B�1M�W�#�� #g��apr)�P�@'��^c�elM%W��}���a���zGΙ��3z���^Ik�u�ʾnc��cw��Z�m����!�Ů����ic��qu?;"3�?��@1
��(O�=b�{�����LE���a�������(��i�|>;�&�4M�0���,��ukm�4���+{�:��z_��v��	���a�GB]�Gk�&���_��cpzdQ�Tχ�F�u��y�E�<w���NeY�p�a8r�݁�ڻ ��/x�Qn��0N��7����j���@�9�>lB;Y�##Nni��<w���,[wu5 mzvG�ډ�Yl��1�P;u���*W9=���ra-p�=�cF
������ڑ�^H���KEAH�8�<Z�kh��l4}����y��~(U��>첫Oi��^��Ek�4�,�vrc@�9٘��b����|�JE�ʮ�->�N�:K�F��e�$��܈'іڶu����:�T�4�־�������RC���Z+�.�u\ ��\~q9�r�#��e��)��>	����t]�v=�5k�r�䟉�<����_�c���㑔���<�Ғ�����Z+g�r?Y��/j��1����Ŷ,`wOx!�
y��y�oc���$����,˲,��`VJ�}/�,9��������돟$��3[�)�@~1�j[ί�w;tx؃#WX�Z;���r��߫��|t��UU5M#ߗe��QE~�$��R�巌'ǜ���?��5nq:�R��FHo)LN�D��nZ)U�8����-�ijD���K�G�r��|���!=�G>�X���-�㸮k��לNo��yB+�����ny]c�O	R����1�Y���� �ޞ��m�z=x �qo	�e`|�c����?�*�/����S��l����ӷ;TB��t��wPz��<�5cRd�	�a���7�Iΰ�1��0��	�{����r�3���YFŗ�s����/�g�2�(�<�?�F��Y��tD���w��G�&�˲��3Y�-���׽����@f����8QIG�z�$�X���"�z}�1�I��1f���:$4��tt���;Zs�Q#YN���!�z4��axyy��Ih�B:F�{_�־��PC;��R�0�L]K��E�4Mm�}��K��ґb�AB�!%�DuQ�o��grH	
xBHNjz��iY�%�,G>�������c�����EHG��9MBo�zT\)u]d��E"ٲH!�c���8��wI,E�tJ�OX���˒���ǻ�]�0\��	�Bz�ӌrGN��e܅2�އ��4	��fF���Ax7���2�Xk���0���LBGNvA!��`���$��7IhY<ϳ�^�G-[R�t/+jh`���$9���[��!Q2�j���D�냗����%�6������54!�?���^nIb�UJ�����x�d�m9Rb�&In	�q����}����u�{��iߣܲ+u]����\Jm�ّ���IJ)�:���i�!�c{?/�_B�*޲,�<��@�E�$s��<� � )��܃s����}�oN�K�,˪��z����m��0�<Kr+�dl?��q�!�{{�i	���󳫑m�d\N����%-��Ih �t
��Ӟ:˲<�O�STQ�	lc�,I�Q�:��PIh �t"��ӞV[��4���r�L�t��+���Hh �t:��iO5tQEQTU�ӄ~g�_Z�d>{��A�
!�y�w]���z`M���.�R���H�w$���2���-���[��@l���YO��N\�f��^��^�>��@�����o���>\���`��&��j�ۂ&H�
���崵�r�(����О,���T��Ⱦ^ߵ����"���E%���iz�f�����.NB1#�S�mN�Б���%��]|�
��bFH'n�>2:N׭g��a$4-B:}��iz"܋�;4��/pYQ�󙄎�$?*�VOk����HB8&*�VO;��GB8,B�@��[$4�##��e_9MB88B�p���$4�GN����Ê9�Ih��qř�$4,�C�-�Ih�FHݒ�r��wBB�;f���$�뺖��7AB�Gl�	�o�Hh������Ih�
!�??MB�7����rP���N�o2���,}��1&�s�B%��������Z����i��7��1Z�,��c�1J)��1F���#'ظ�4M�<OӴ��ڡ��<K��<ϒ���C��⚾"������{&��֗�E�Rr>:ܓq�gcL�u�4
� ���_U�˯��G���]�-�\E�ey�/ն���/���m��,�*�G�X�%�8��ھ�iZ�f�)o�RU�ei������[a�ei�e���k���$���8JNo��EQc��ZF���ɽ���n����k)����m���<���f�9�2�e{��9
�H3��t��9ڿ��6��(d�:�š�����a�NES:O�麮#o�
��EQ�b��J'�e��|�%U[��ݴ�EQ�eYE��-�i)���0}ߏ��@�;�y>CY�y�WUax�uY����m�O@i
{{{KcH@VZ��8C�4�A��7��if����8�}�솱��8�e��G�Raƽ���Ӊqo��㐖�sXӆ�֧�)���z��i�m>��=���0�w�v�<����y�UUm};�loƽ�Ξz�}��r��]Ɨ�u����OCY�i�!�ʞy��a.��lv4�<_.�i�d�V$
e�r���n�w�<�.%�Lh����A�뺎d��~o�d�y�۶�|�^�'{���|:��11}/9-��^�|>7M��iǰ��n�+Ƙ�i�i��~������D�!=MS۶;��3�u�4��z�{Q�����i�^^^����PsUUeYn}/J\?-�e�������L[k��1,�3?����@�"}�œ��H���x�++��q�I�ږ��I�7<,�G�0ooo�ZbX�V��-k����S-_ȟ��9��V7���j�o�e�z�=�.�˲�T�eYJ�dYf����o��n�Qe��<���8�>h�</jC��e�g�F�89�~d��C-LB��ܔ`^R�:��%�Rj/��織�Zkj��I������_�+K"'�/��|ANHIDO��m/����ZWUUE�e�ߕg�2{i���Z����vw�w�D��EAN�Nm?<+���R�J*7Ms=���]�IZ�-N�β�,Ki�
���.ų,@B�2�ÿR��$�Du�u��r����%��PO�.@b���N�(ʲ���JӚ��ӫ����ˑ��iE��l���)&�Gưe��cd�w������Ұ�#�wB����ɹ�B�ɫ�:���4;v�9�i	جq�_Bc�A,��0}�w]����sZ�G�����5��<����_�-Y��y�uaJ���Z�m��_<��%��@G�#{�HN�	��9-_��v'�c�r�xڱDNt��<�I�[E!
emۆ�iy��ӊ�i��%	�#���8�Nav)�A���xyy	�=ϳ�BN@��=��%tY���ϱHu/YQ��ׯ��2�猪��y~�}C�i��i�;����`�Y���}�KF$�����tR�4�����Z�($�S";�E�{��:�yY����)O��rt�Rt&fI,k�L�s��V�{����x��eӮ���^66�O9�_��k�\�}NN�SQ�4��y|B��������,����i9�9��6��4���z<yZ������2�Un2���KN���g���5M�lL��%����E6A���y��|MN���	�IUU*�rZk=�s�uZ�,}�Ľ��\K����O%�+�N�9=�lCb��
��\>�H��t�u��u�0�
�Ȝ=�H�`|�\<��BZ�ݵF�f����9���LZ�e�����5�)�7*���*ߓ�m�}�_��9xʓЛX��a|�&��r>��?&@=͸7���}��*�RV�{�������xe����z�Л�.�Z��|��1r�q<^!�Б���,�|l�>M�|�'����*���JY��<��n�6��B�1?
���I��u�/G�a�}��������lA�8���g[E�t:i�}��1��0y���A&�z��:׷�6M���m��A��w�	�D�4��F�g{�QEY����iʲd��V�x�x�c�HhW꺞���贜�aby���&�l����{�����yNO�4M�1&�Ao�:�e�������A�Z����-'R8�=�b8��Ss����K"�	�ž4HN�8!C�MG���d~�Qn��I䯗���Jk-o�<�n�}�4�㸔��YYO����]%���@r�y1-˱�^ӭ��i@l�i��$t0Z�_�~9����ik-	
 B����^n:����c��<MS�3�⮜�S@�>yv�<4�bi�&��,����3�s��454���i�ӓeYQn��y�.�bZݐ���b�!�<t���p�}��i�mNSC�ܿC�y�9��i�"o[|��$4���+�����N�ֺ,K���Yk�a�����z��$4�]ȕR]���M�I�x8߃l�y��/��d��D>����w]�i�G�����x��4�4M���>˲��TQr�{�`��]?}����dő�L���odYFB������.E9��1�(
W�n�r�5������/@N��SU��o�^�b��kؓ�>�,�N���oǎz�`_�=7 ����vZ�,��7;?���8�;��a �#!놝\JL;���._���p�l�J|�d)�ל��z:Czz������2�}�%���X|7��/7� ����繓�B�,����y������Dkm��[	n��=$��i�Z�y�d-=����{8SO�-�sc�����ꖐV�ө+��ɑ�4�M�n}4�G�0I�o�<�K
�Q?�ө����י�b�o���N�1&˲�E��v�g�ip��Hr:=�ڢ(VNK�*,Ů&��#�er:1Zkc����Nn	�iź�eY��
����np��N�e�DN�^�_�ЪiHƽ����A����Jph�C��N�J���-�L��iX�%��|��!���T�,�e�����	iEN�1���|��g!���[�������2�9�g뻻i���"�w�Z+��\�%X��V�G�[+Ka���-/!�؏l�ֿ�$48�+������	ip�cH+��]�Ӡ׼�Nf��!��#�k��3��B\�Ҋ��	��W^��7\	�*TN�'��8���w	�BZ�#�\.�q�������D��V�EL޽���������ʸw�\}�Y��(����9͸������i���y�����$��ޑY��J.��9���f���{ǣ���Z����-g��{��ߛ�y�@��;�]��[���|�{��ߛ����Ƙ_���ť�ސ$�7Gk]�%���!��������q}���C!���-h����q����|��JN����h�TQ�v���"������Ry���	�WH+r:�q۶]cLUU��(��V��8^.'�b�1�'ƐV�O�|�I��R��*Z���x���Zkm�uN6�뚖1�'ސV�Z����,SRF�?�?a�i����ʳ4EQ�u��R�O�Ҋ�v�m[W	�eY]�l�
^� �9��0�08Y-�ic����Ҋ�^g���]utk���a6|��s��~��պ�su��ih���Ҋ�~�ۄ.˒��0vҊ����r9�Ϯ�zz#�IDAT���.���� ����"�o�6��RUU�S7�ːV��
��w��eY���^CZ������<�R�S�Ҿ����a�\.�\)��1eY�e��hi�!�����v��1�i�}H+�9�u�^r�SB???��^
!�<紵v����>�N$4l"��V������aBk���hB6�NH���N1��yQ�/[I*��!s��(��{\4	
J-��rz��m�&��V���puM�iu���z�&�5��t:����4CZ �=�r+�����b��?����.��������e��p�V�"���i��,�^��CZ�n�6XN�K說؝��~H+�9--�r�wB��
�r��VI䴿���h���$�8���>29q�i}d�kh"t�JZ촞&���j�9MB�a.�ծr���#;֜�秗�'ޘ �`�XI���iO�O*��!�"�iF����݋�ƽ��CW�"�z��,i���i����<����Ü��j~Z"|�&�������RC���w��4����0��0���4�����_��Y�Yk��|����ל�w^k�$4$����לv�����8��}dn���B�g��i�CH�$�&� I���iREH�!œ&� a��}��i�FH�-��&� y��#6�i���~І9MB�Aҏ�$�Ih8Bz��9MB���k��,Ih8Bځ9]�eUU$4
�`9��,F�����TO��pX��K�s���##�s��t�����9�i:���+s��(Bڟ�s��Bڣr��,i���ip����Ɯ&���!���$4�#B:�orZ:���!Χ9�$��:�-bFH�.�Ih�7�Ж�&����m�������?`u����IEND�B`�doc/alt-libxml2-devel/tutorial/images/blank.png000064400000000566151730335130015452 0ustar00�PNG


IHDR��L\��gAMA���a-IDATx���A �0���MF4
z�;3'���k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
��5k��X�`
�`f�HfIEND�B`�doc/alt-libxml2-devel/tutorial/images/note.png000064400000000752151730335130015325 0ustar00�PNG


IHDR�b$bKGD��#2IDATx�e�!��0E}���KC
�tAQCACQA�+g�4m�Ɍ��oK�.��q��c ���
D��="���s ��%��d�ǜH��1���y%�M8�f�K
�w��ֵ>i6g-Np���Y�tL#�ߟ�
a��b;�U�#2��V}
�ԣr�V�x�]�zT�T�1����OH��4�]o���z�Χ��g�"ӒN��Hl��U���u��߯���9�<�t�,��t��_�)2H����d�kBCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature3bd747c5e45807006b090dd3e7a26c44ӓ�tEXtPage24x24+0+0r[	1IEND�B`�doc/alt-libxml2-devel/tutorial/images/toc-blank.png000064400000000476151730335140016236 0ustar00�PNG


IHDR	�kd0PLTE���������������������������O&IbKGD�HIDATx�c����?|`� h ����B�h��CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturef7e388dabd4ef0097714b5643fdd3cfbb���
tEXtPage15x9+0+07v�IEND�B`�doc/alt-libxml2-devel/tutorial/images/home.png000064400000002204151730335140015303 0ustar00�PNG


IHDR#Yi�&PLTE�!�!)�)1�1B�BJ�Jc�cs�s����ƌ�Δ�Υ�޵��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GbKGD�H�IDATxڭQ�� l)��x����Y�,]Ҿ����8u�u,�q¼��řN!`���RN`M�}��%,�i�ím����
)��	+���
�C���<���qU;pZږ��zJky�� ���4�y|��50ܦy�k��/.�
��j*1�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature154332ef94ba5222343b4126d6035f91���tEXtPage35x15+0+0~F�IEND�B`�doc/alt-libxml2-devel/tutorial/images/warning.png000064400000002331151730335140016021 0ustar00�PNG


IHDRש��PLTE!)1BJRZks{����{{�RR�ZZ�{{��99�JJ�����������11�����))�����������������������������))��))���������!!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������p;�bKGD�H�IDATx�m�}o�0��M����5�%��%m
�s��zP�^��<?����Q��K���WDŽV�WH?��ʈ�@��n�VY����!�����aY��r�?8�C+�Y"%�}A�pt<����e���e
�t��h�Y��_�ϡC�x�i��E����1��s;P�̾�8ki[�tY�X}+��U��ݭ��H�<n��"��d�nr���>��UD�Kn�k[;һ?0n!��qCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturec42b7d2d564aab588891979703f02b45OߓtEXtPage24x24+0+0r[	1IEND�B`�doc/alt-libxml2-devel/tutorial/images/up.png000064400000002127151730335140015003 0ustar00�PNG


IHDR#Yi�&PLTE��!�!)�)1�1B�Bc�ck�k����ƌ�Δ�޵������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~bKGD�HfIDATxڕ�K� m�A��֝I+�o���@^P?�'#H];�<�R��[��Pe��0�2&t<*�Ϭ�7Sm���&Ji�G�����=��Ka�1{��g� �ưCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature2772383288e9cce11a512e2a8adf37b0k�tEXtPage35x15+0+0~F�IEND�B`�doc/alt-libxml2-devel/tutorial/images/tip.png000064400000000701151730335140015147 0ustar00�PNG


IHDR*�	bKGD��#2�IDATx�u��� @!+x���6�K���R+hJ����TaK
		>߁��Rh~j?�g0qF@�����!���eH,��0܆x��0�&p
�^���J��5y�=�J�	%P<�*ğ{���������j�
#��7�^���L~�!=����&Ṳ;
��&rgߊF�m��ͩ�P����;���ot�6B�J�qC
�Xdu���i]}OL�4+|) -�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3�'tEXtPage25x24+0+0��	�IEND�B`�doc/alt-libxml2-devel/tutorial/images/prev.png000064400000002154151730335140015333 0ustar00�PNG


IHDR#Yi�&PLTE��!�!)�)1�1B�BJ�JR�Rk�ks�s����ƌ�Δ�Υ�֭��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ĪbKGD�H{IDATxڵ���0C��V%2��o%e�Ķ8�Xz���\�<u��ԛ�+�F�a�>#KS��!�Q�aĪ
(9�Wv|�Y��Y���d=��[�髂���N���g�$�
����C=��%���CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature0f87aaf0b04e24ba165f2a4bfa6bca57k�tEXtPage35x15+0+0~F�IEND�B`�doc/alt-libxml2-devel/tutorial/images/caution.png000064400000002342151730335140016020 0ustar00�PNG


IHDRש��PLTE!!11BBZZcckkss{{����s����s�������s��{����s��{����������c����������Z��c�������c�����������������1��9��B����1��9��������������1���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������_��\bKGD�H�IDATx�u�ێ�@��b̮�Ic�AP�`bx��sBE�U�_��Oh�<��`�'��1��wp���	�W�ȝt:%su�&�w,�H��ȯ�f	�������59��v�:��\^
F;`�H�J'�8��71���ZJ��+��b�2B��8�����Q�$�w��RK��v)�nR��p�t��}��������Vb�T�z�D���v�@��=�rP�����du����v�z{N�l;�a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6�P�tEXtPage24x24+0+0r[	1IEND�B`�doc/alt-libxml2-devel/tutorial/images/important.png000064400000001322151730335150016371 0ustar00�PNG


IHDRש���PLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{����9����!��9��Z��{��c��{��J��R��Z��c��k��{������!��1��9��������������)��1��1��!��Z��R��s��c��k��B��c��{��������������������������������������������������������������������bKGDCg�
bIDATx�m�S�0�3E�1�����K�PT���F'�����Ǯ�Q��]�_i�K�B�&�F�(�6���r��c��/�Ѵ�\N��h���* �2p�=�:��J�v�?�����6��|
@}�`�^�>���s
P��vB��ɨ�@�d6"�o;g�`Ps�+����s%��ǯ%@�S�{4�ܾ�U�-�s"�1ч��?�j�<`g ��eZ�*�+��æ�2�_Yv�*����lv�~�gZ�[�s��Y[Ða;	=��/�oJĘ!�f���cl�Rm�RCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturec3ecc1fc5135d1e959695e569d213122ri�IEND�B`�doc/alt-libxml2-devel/tutorial/images/toc-plus.png000064400000000410151730335150016117 0ustar00�PNG


IHDR	��)�bKGD��#2#IDATx�ch���`���#���@�C"ԣ��j?RJl�d�:4CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignatureab17802e1ddae3211b1ce6bc3b08aec7{��(
tEXtPage15x9+0+07v�IEND�B`�doc/alt-libxml2-devel/tutorial/images/next.png000064400000002176151730335150015342 0ustar00�PNG


IHDR#Yi�&PLTE��!�!)�)1�1B�BJ�JR�Rc�ck�k����ƌ�Δ�Υ�֭�޵���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�`�bKGD�H�IDATxڽ��
� �U�\��&�{�W]��؟2!BrwA~�p)#Հ6�L��2���D@�n�R�̌��QK%+�uKe�h�݇YA=���qfn� �WRә�[P�z��2���4浱��y�,Ǭ���:l&�XDz�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturebcb022e8ade53bb4f94fb0f70d7c0a8cu�ktEXtPage35x15+0+0~F�IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/9.png000064400000000545151730335150016360 0ustar00�PNG


IHDRs;bKGD��#2IDATx��!�0GFVb��J,��WX��
�^Y��kTb++#���{�?/��Yٗy/j��!��Rj����+�~ ��E�#y@�������!��s�.�g���E�����O�r/���P8b��CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature34623e5e4d48310e409b280afe247602�14$tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/6.png000064400000000543151730335150016353 0ustar00�PNG


IHDRs;bKGD��#2}IDATx��!�0
�
���Fa�PXXj�'��	������n�n���󩺵�oP�H��l\BuNح��!��i`����d���'��נ��,�˖e�Ըg�NL��L�<
�V���?�s8�
�YCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignatured25d7176d67a038afc1c56558e3dfb1a���tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/10.png000064400000000551151730335150016425 0ustar00�PNG


IHDRs;bKGD��#2�IDATx�%��!C#�H,��N^[¶p�\�%��${��;��/yI@��l\�\�y�SM�}�i㎋��s���u�Ȍ��a�X̠ �e�ڭ��v��G�j��!=�d�R�;?ݢCb�	kCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature386e83bb9bdfba3227f58bb897e2c8a5�+
tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/4.png000064400000000531151730335150016346 0ustar00�PNG


IHDRs;bKGD��#2sIDATx��!�0C#��Xdee�P��"�\���o+{%le�ʰ!b���$�ci�1 q�
dCwC���mJV��$��6�hu��T�j~<_�²�|����㣴
K�F��6�[��CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature9f82fcac9e039cbdb72380a4591324f5���vtEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/7.png000064400000000530151730335150016350 0ustar00�PNG


IHDRs;bKGD��#2rIDATx�%���0�OV"Y!�����L�O�����
Hd�+�H������퇓��e
_��pD���l��C�0T+�ʫ+���	�VA�jݓ��{�O�9�lsLG�I�z��>61�GVSCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature298368142ac43cebd2586d8d1137c8df&9�tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/3.png000064400000000536151730335150016352 0ustar00�PNG


IHDRs;bKGD��#2xIDATx�%N��@4���^��0�+�
�F``�a��+�&���U����
qXҠ�q�
K�����]p�q�˟�3�&�=�ۿ-#�����S:�b�m�R�&j�Q�5c��LCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature80bbda2726ddace8ab8a01f59de2ebdb�utEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/1.png000064400000000511151730335150016341 0ustar00�PNG


IHDRs;bKGD��#2cIDATx�U��
�0���.)�Bf�t�6#d����H�(�'�������X�W��
9c�A�M-!d>�0(�*�?��/�c}�֮5u��ƌ:�x,�T�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature58a072e070da22f6135cbd3e414546f9hj!�tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/2.png000064400000000541151730335150016345 0ustar00�PNG


IHDRs;bKGD��#2{IDATx����0D?44,5,�
]����+�f���K
U�G�{��u���k��S��@�cB���SC�hS������{�2�y�4Cm�s^��% ��D��+O��J)}�:T�5`�/�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature80eae529c94a7f47deccfada28acb9df�o�
tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/8.png000064400000000545151730335150016357 0ustar00�PNG


IHDRs;bKGD��#2IDATx����0
��v�¬���a`��544T�
�?ݻ/T�ܗ�W[Б!Dغ���[`�T�3�(�f��p���g��c���3�1�ؿ.0��>���_�
+U�9�����9�Fb�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignature57be19505c03f92f3847f535e9b114e9�4kCtEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/images/callouts/5.png000064400000000534151730335150016352 0ustar00�PNG


IHDRs;bKGD��#2vIDATx����0
�����~+_Bh���Ilgv�����M���Zm���m��wb$|S�q$��^�%�)%�������YP3�]2�Q�j�%���|�#[7/B_�CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com��!�*tEXtSignaturefe690463379eb25e562fcc8cc9b3c7e0߲9�tEXtPage12x12+0+0�m�}IEND�B`�doc/alt-libxml2-devel/tutorial/includekeyword.c000064400000002507151730335150015603 0ustar00<![CDATA[
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *key;
	cur = cur->xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
		    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
		    printf("keyword: %s\n", key);
		    xmlFree(key);
 	    }
	cur = cur->next;
	}
    return;
}

static void
parseDoc(char *docname) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}
	
	cur = cur->xmlChildrenNode;
	while (cur != NULL) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur);
		}
		 
	cur = cur->next;
	}
	
	xmlFreeDoc(doc);
	return;
}

int
main(int argc, char **argv) {

	char *docname;
		
	if (argc <= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	parseDoc (docname);

	return (1);
}
]]>
doc/alt-libxml2-devel/tutorial/ar01s02.html000064400000006662151730335150014373 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Data Types</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="index.html" title="Libxml Tutorial"><link rel="next" href="ar01s03.html" title="Parsing the file"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Data Types</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s03.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialdatatypes"></a>Data Types</h2></div></div><div></div></div><p><span class="application">Libxml</span> declares a number of data types we
    will encounter repeatedly, hiding the messy stuff so you do not have to deal
    with it unless you have some specific need.</p><p>
      </p><div class="variablelist"><dl><dt><span class="term"><a class="indexterm" name="id2526186"></a>
<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLCHAR" target="_top">xmlChar</a></span></dt><dd><p>A basic replacement for char, a byte in a UTF-8 encoded
	    string. If your data uses another encoding, it must be converted to
	      UTF-8 for use with <span class="application">libxml's</span>
	      functions. More information on encoding is available on the <a href="https://gitlab.gnome.org/GNOME/libxml2/-/wikis/Encodings-support" target="_top"><span class="application">libxml</span> encoding support web page</a>.</p></dd><dt><span class="term"><a class="indexterm" name="id2526232"></a>
	    <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLDOC" target="_top">xmlDoc</a></span></dt><dd><p>A structure containing the tree created by a parsed doc. <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLDOCPTR" target="_top">xmlDocPtr</a>
	  is a pointer to the structure.</p></dd><dt><span class="term"><a class="indexterm" name="id2526266"></a>
<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNODEPTR" target="_top">xmlNodePtr</a>
	    and <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNODE" target="_top">xmlNode</a></span></dt><dd><p>A structure containing a single node. <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNODEPTR" target="_top">xmlNodePtr</a>
	  is a pointer to the structure, and is used in traversing the document tree.</p></dd></dl></div><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Libxml Tutorial�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Parsing the file</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s04.html000064400000014213151730335150014364 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Retrieving Element Content</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s03.html" title="Parsing the file"><link rel="next" href="ar01s05.html" title="Using XPath to Retrieve Element Content"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Retrieving Element Content</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s03.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s05.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialgettext"></a>Retrieving Element Content</h2></div></div><div></div></div><p><a class="indexterm" name="id2525439"></a>
Retrieving the content of an element involves traversing the document
    tree until you find what you are looking for. In this case, we are looking
    for an element called "keyword" contained within element called "story". The
    process to find the node we are interested in involves tediously walking the
    tree. We assume you already have an xmlDocPtr called <tt class="varname">doc</tt>
    and an xmlNodPtr called <tt class="varname">cur</tt>.</p><p>
      </p><pre class="programlisting">
	<a name="getchildnode"></a><img src="images/callouts/1.png" alt="1" border="0">cur = cur-&gt;xmlChildrenNode;
	<a name="huntstoryinfo"></a><img src="images/callouts/2.png" alt="2" border="0">while (cur != NULL) {
		if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur);
		}
		 
	cur = cur-&gt;next;
	}
      </pre><p>

      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#getchildnode"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>Get the first child node of <tt class="varname">cur</tt>. At this
	    point, <tt class="varname">cur</tt> points at the document root, which is
	    the element "story".</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#huntstoryinfo"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>This loop iterates through the elements that are children of
	  "story", looking for one called "storyinfo". That
	  is the element that will contain the "keywords" we are
	    looking for. It uses the <span class="application">libxml</span> string
	  comparison
	    function, <tt class="function"><a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#XMLSTRCMP" target="_top">xmlStrcmp</a></tt>. If there is a match, it calls the function <tt class="function">parseStory</tt>.</p></td></tr></table></div><p>
    </p><p>
      </p><pre class="programlisting">
void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *key;
	<a name="anothergetchild"></a><img src="images/callouts/1.png" alt="1" border="0"> cur = cur-&gt;xmlChildrenNode;
	<a name="findkeyword"></a><img src="images/callouts/2.png" alt="2" border="0"> while (cur != NULL) {
	    if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"keyword"))) {
	<a name="foundkeyword"></a><img src="images/callouts/3.png" alt="3" border="0">	    key = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
		    printf("keyword: %s\n", key);
		    xmlFree(key);
 	    }
	cur = cur-&gt;next;
	}
    return;
}
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#anothergetchild"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>Again we get the first child node.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#findkeyword"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>Like the loop above, we then iterate through the nodes, looking
	  for one that matches the element we're interested in, in this case
	  "keyword".</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#foundkeyword"><img src="images/callouts/3.png" alt="3" border="0"></a> </td><td valign="top" align="left"><p>When we find the "keyword" element, we need to print
	    its contents. Remember that in <span class="acronym">XML</span>, the text
	    contained within an element is a child node of that element, so we
	    turn to <tt class="varname">cur-&gt;xmlChildrenNode</tt>. To retrieve it, we
	    use the function <tt class="function"><a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNODELISTGETSTRING" target="_top">xmlNodeListGetString</a></tt>, which also takes the <tt class="varname">doc</tt> pointer as an argument. In this case, we just print it out.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p>Because <tt class="function">xmlNodeListGetString</tt> allocates
	      memory for the string it returns, you must use
	      <tt class="function">xmlFree</tt> to free it.</p></td></tr></table></div></td></tr></table></div><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s03.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Parsing the file�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Using XPath to Retrieve Element Content</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/apf.html000064400000005605151730335150014045 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>F.�Code for Add Attribute Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ape.html" title="E.�Code for Add Keyword Example"><link rel="next" href="apg.html" title="G.�Code for Retrieving Attribute Value Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">F.�Code for Add Attribute Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ape.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apg.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="addattributeappendix"></a>F.�Code for Add Attribute Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;libxml/xmlmemory.h&gt;
#include &lt;libxml/parser.h&gt;


xmlDocPtr
parseDoc(char *docname, char *uri) {

	xmlDocPtr doc;
	xmlNodePtr cur;
	xmlNodePtr newnode;
	xmlAttrPtr newattr;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return (NULL);
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	if (xmlStrcmp(cur-&gt;name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
	newattr = xmlNewProp (newnode, "uri", uri);
	return(doc);
}

int
main(int argc, char **argv) {

	char *docname;
	char *uri;
	xmlDocPtr doc;

	if (argc &lt;= 2) {
		printf("Usage: %s docname, uri\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	uri = argv[2];
	doc = parseDoc (docname, uri);
	if (doc != NULL) {
		xmlSaveFormatFile (docname, doc, 1);
		xmlFreeDoc(doc);
	}
	return (1);
}

</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ape.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apg.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">E.�Code for Add Keyword Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�G.�Code for Retrieving Attribute Value Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/apc.html000064400000006026151730335150014040 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>C.�Code for Keyword Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apb.html" title="B.�Sample Document"><link rel="next" href="apd.html" title="D.�Code for XPath Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">C.�Code for Keyword Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apb.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apd.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="keywordappendix"></a>C.�Code for Keyword Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;libxml/xmlmemory.h&gt;
#include &lt;libxml/parser.h&gt;

void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *key;
	cur = cur-&gt;xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"keyword"))) {
		    key = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
		    printf("keyword: %s\n", key);
		    xmlFree(key);
 	    }
	cur = cur-&gt;next;
	}
    return;
}

static void
parseDoc(char *docname) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	if (xmlStrcmp(cur-&gt;name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}
	
	cur = cur-&gt;xmlChildrenNode;
	while (cur != NULL) {
		if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur);
		}
		 
	cur = cur-&gt;next;
	}
	
	xmlFreeDoc(doc);
	return;
}

int
main(int argc, char **argv) {

	char *docname;
		
	if (argc &lt;= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	parseDoc (docname);

	return (1);
}

</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apb.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apd.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">B.�Sample Document�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�D.�Code for XPath Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s09.html000064400000016663151730335160014405 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Encoding Conversion</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s08.html" title="Retrieving Attributes"><link rel="next" href="apa.html" title="A.�Compilation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Encoding Conversion</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s08.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apa.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialconvert"></a>Encoding Conversion</h2></div></div><div></div></div><p><a class="indexterm" name="id2587348"></a>
Data encoding compatibility problems are one of the most common
      difficulties encountered by programmers new to <span class="acronym">XML</span> in
      general and <span class="application">libxml</span> in particular. Thinking
      through the design of your application in light of this issue will help
      avoid difficulties later. Internally, <span class="application">libxml</span>
      stores and manipulates data in the UTF-8 format. Data used by your program
      in other formats, such as the commonly used ISO-8859-1 encoding, must be
      converted to UTF-8 before passing it to <span class="application">libxml</span>
      functions. If you want your program's output in an encoding other than
      UTF-8, you also must convert it.</p><p><span class="application">Libxml</span> uses
      <span class="application">iconv</span> if it is available to convert
    data. Without <span class="application">iconv</span>, only UTF-8, UTF-16 and
    ISO-8859-1 can be used as external formats. With
    <span class="application">iconv</span>, any format can be used provided
    <span class="application">iconv</span> is able to convert it to and from
    UTF-8. Currently <span class="application">iconv</span> supports about 150
    different character formats with ability to convert from any to any. While
    the actual number of supported formats varies between implementations, every
    <span class="application">iconv</span> implementation is almost guaranteed to
    support every format anyone has ever heard of.</p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="images/warning.png"></td><th align="left">Warning</th></tr><tr><td colspan="2" align="left" valign="top"><p>A common mistake is to use different formats for the internal data
	in different parts of one's code. The most common case is an application
	that assumes ISO-8859-1 to be the internal data format, combined with
	<span class="application">libxml</span>, which assumes UTF-8 to be the
	internal data format. The result is an application that treats internal
	data differently, depending on which code section is executing. The one or
	the other part of code will then, naturally, misinterpret the data.
      </p></td></tr></table></div><p>This example constructs a simple document, then adds content provided
    at the command line to the document's root element and outputs the results
    to <tt class="filename">stdout</tt> in the proper encoding. For this example, we
    use ISO-8859-1 encoding. The encoding of the string input at the command
    line is converted from ISO-8859-1 to UTF-8. Full code: <a href="aph.html" title="H.�Code for Encoding Conversion Example">Appendix�H, <i>Code for Encoding Conversion Example</i></a></p><p>The conversion, encapsulated in the example code in the
      <tt class="function">convert</tt> function, uses
      <span class="application">libxml's</span>
    <tt class="function">xmlFindCharEncodingHandler</tt> function:
      </p><pre class="programlisting">
	<a name="handlerdatatype"></a><img src="images/callouts/1.png" alt="1" border="0">xmlCharEncodingHandlerPtr handler;
        <a name="calcsize"></a><img src="images/callouts/2.png" alt="2" border="0">size = (int)strlen(in)+1; 
        out_size = size*2-1; 
        out = malloc((size_t)out_size); 

&#8230;
	<a name="findhandlerfunction"></a><img src="images/callouts/3.png" alt="3" border="0">handler = xmlFindCharEncodingHandler(encoding);
&#8230;
	<a name="callconversionfunction"></a><img src="images/callouts/4.png" alt="4" border="0">handler-&gt;input(out, &amp;out_size, in, &amp;temp);
&#8230;	
	<a name="outputencoding"></a><img src="images/callouts/5.png" alt="5" border="0">xmlSaveFormatFileEnc("-", doc, encoding, 1);
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#handlerdatatype"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p><tt class="varname">handler</tt> is declared as a pointer to an
	    <tt class="function">xmlCharEncodingHandler</tt> function.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#calcsize"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>The <tt class="function">xmlCharEncodingHandler</tt> function needs
	  to be given the size of the input and output strings, which are
	    calculated here for strings <tt class="varname">in</tt> and
	  <tt class="varname">out</tt>.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#findhandlerfunction"><img src="images/callouts/3.png" alt="3" border="0"></a> </td><td valign="top" align="left"><p><tt class="function">xmlFindCharEncodingHandler</tt> takes as its
	    argument the data's initial encoding and searches
	    <span class="application">libxml's</span> built-in set of conversion
	    handlers, returning a pointer to the function or NULL if none is
	    found.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#callconversionfunction"><img src="images/callouts/4.png" alt="4" border="0"></a> </td><td valign="top" align="left"><p>The conversion function identified by <tt class="varname">handler</tt>
	  requires as its arguments pointers to the input and output strings,
	  along with the length of each. The lengths must be determined
	  separately by the application.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#outputencoding"><img src="images/callouts/5.png" alt="5" border="0"></a> </td><td valign="top" align="left"><p>To output in a specified encoding rather than UTF-8, we use
	    <tt class="function">xmlSaveFormatFileEnc</tt>, specifying the
	    encoding.</p></td></tr></table></div><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s08.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apa.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Retrieving Attributes�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�A.�Compilation</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s06.html000064400000007447151730335160014402 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Writing element content</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s05.html" title="Using XPath to Retrieve Element Content"><link rel="next" href="ar01s07.html" title="Writing Attribute"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Writing element content</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s05.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s07.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialwritingcontent"></a>Writing element content</h2></div></div><div></div></div><p><a class="indexterm" name="id2586968"></a>
      Writing element content uses many of the same steps we used above
      &#8212; parsing the document and walking the tree. We parse the document,
      then traverse the tree to find the place we want to insert our element. For
      this example, we want to again find the "storyinfo" element and
      this time insert a keyword. Then we'll write the file to disk. Full code:
      <a href="ape.html" title="E.�Code for Add Keyword Example">Appendix�E, <i>Code for Add Keyword Example</i></a></p><p>
      The main difference in this example is in
      <tt class="function">parseStory</tt>:

      </p><pre class="programlisting">
void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {

	<a name="addkeyword"></a><img src="images/callouts/1.png" alt="1" border="0"> xmlNewTextChild (cur, NULL, "keyword", keyword);
    return;
}
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#addkeyword"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>The <tt class="function"><a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNEWTEXTCHILD" target="_top">xmlNewTextChild</a></tt>
				     function adds a new child element at the
				     current node pointer's location in the
	    tree, specified by <tt class="varname">cur</tt>.</p></td></tr></table></div><p>
         </p><p>
      <a class="indexterm" name="id2587052"></a>
      Once the node has been added, we would like to write the document to
      file. Is you want the element to have a namespace, you can add it here as
      well. In our case, the namespace is NULL.
      </p><pre class="programlisting">
	xmlSaveFormatFile (docname, doc, 1);
      </pre><p>
      The first parameter is the name of the file to be written. You'll notice
      it is the same as the file we just read. In this case, we just write over
      the old file. The second parameter is a pointer to the xmlDoc
      structure. Setting the third parameter equal to one ensures indenting on output.
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s05.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Using XPath to Retrieve Element Content�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Writing Attribute</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ar01s08.html000064400000007524151730335160014400 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Retrieving Attributes</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s07.html" title="Writing Attribute"><link rel="next" href="ar01s09.html" title="Encoding Conversion"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Retrieving Attributes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s07.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s09.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialattribute"></a>Retrieving Attributes</h2></div></div><div></div></div><p><a class="indexterm" name="id2587236"></a>
Retrieving the value of an attribute is similar to the previous
    example in which we retrieved a node's text contents. In this case we'll
      extract the value of the <span class="acronym">URI</span> we added in the previous
      section. Full code: <a href="apg.html" title="G.�Code for Retrieving Attribute Value Example">Appendix�G, <i>Code for Retrieving Attribute Value Example</i></a>.</p><p>
      The initial steps for this example are similar to the previous ones: parse
      the doc, find the element you are interested in, then enter a function to
      carry out the specific task required. In this case, we call
      <tt class="function">getReference</tt>:
      </p><pre class="programlisting">
void
getReference (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *uri;
	cur = cur-&gt;xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"reference"))) {
		   <a name="getattributevalue"></a><img src="images/callouts/1.png" alt="1" border="0"> uri = xmlGetProp(cur, "uri");
		    printf("uri: %s\n", uri);
		    xmlFree(uri);
	    }
	    cur = cur-&gt;next;
	}
	return;
}
      </pre><p>
    
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#getattributevalue"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>
	    The key function is <tt class="function"><a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLGETPROP" target="_top">xmlGetProp</a></tt>, which returns an
      <tt class="varname">xmlChar</tt> containing the attribute's value. In this case,
					   we just print it out.
      </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p>
	  If you are using a <span class="acronym">DTD</span> that declares a fixed or
	  default value for the attribute, this function will retrieve it.
	</p></td></tr></table></div><p>
	  </p></td></tr></table></div><p>
     
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s07.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Writing Attribute�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Encoding Conversion</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/includeconvert.c000064400000003420151730335160015573 0ustar00<![CDATA[
#include <string.h>
#include <libxml/parser.h>


unsigned char*
convert (unsigned char *in, char *encoding)
{
	unsigned char *out;
        int ret,size,out_size,temp;
        xmlCharEncodingHandlerPtr handler;

        size = (int)strlen(in)+1; 
        out_size = size*2-1; 
        out = malloc((size_t)out_size); 

        if (out) {
                handler = xmlFindCharEncodingHandler(encoding);
                
                if (!handler) {
                        free(out);
                        out = NULL;
                }
        }
        if (out) {
                temp=size-1;
                ret = handler->input(out, &out_size, in, &temp);
                if (ret || temp-size+1) {
                        if (ret) {
                                printf("conversion wasn't successful.\n");
                        } else {
                                printf("conversion wasn't successful. converted: %i octets.\n",temp);
                        }
                        free(out);
                        out = NULL;
                } else {
                        out = realloc(out,out_size+1); 
                        out[out_size]=0; /*null terminating out*/
                        
                }
        } else {
                printf("no mem\n");
        }
        return (out);
}	


int
main(int argc, char **argv) {

	unsigned char *content, *out;
	xmlDocPtr doc;
	xmlNodePtr rootnode;
	char *encoding = "ISO-8859-1";
	
		
	if (argc <= 1) {
		printf("Usage: %s content\n", argv[0]);
		return(0);
	}

	content = argv[1];

	out = convert(content, encoding);

	doc = xmlNewDoc ("1.0");
	rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);
	xmlDocSetRootElement(doc, rootnode);

	xmlSaveFormatFileEnc("-", doc, encoding, 1);
	return (1);
}
]]>
doc/alt-libxml2-devel/tutorial/includeaddattribute.c000064400000002160151730335160016567 0ustar00<![CDATA[
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>


xmlDocPtr
parseDoc(char *docname, char *uri) {

	xmlDocPtr doc;
	xmlNodePtr cur;
	xmlNodePtr newnode;
	xmlAttrPtr newattr;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return (NULL);
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
	newattr = xmlNewProp (newnode, "uri", uri);
	return(doc);
}

int
main(int argc, char **argv) {

	char *docname;
	char *uri;
	xmlDocPtr doc;

	if (argc <= 2) {
		printf("Usage: %s docname, uri\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	uri = argv[2];
	doc = parseDoc (docname, uri);
	if (doc != NULL) {
		xmlSaveFormatFile (docname, doc, 1);
		xmlFreeDoc(doc);
	}
	return (1);
}
]]>
doc/alt-libxml2-devel/tutorial/apa.html000064400000004102151730335160014030 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>A.�Compilation</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s09.html" title="Encoding Conversion"><link rel="next" href="apb.html" title="B.�Sample Document"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">A.�Compilation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s09.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apb.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="compilation"></a>A.�Compilation</h2></div></div><div></div></div><p><a class="indexterm" name="id2587670"></a>
      <span class="application">Libxml</span> includes a script,
    <span class="application">xml2-config</span>, that can be used to generate
    flags for compilation and linking of programs written with the
      library. For pre-processor and compiler flags, use <b class="command">xml2-config
	--cflags</b>. For library linking flags, use <b class="command">xml2-config
	--libs</b>. Other options are available using <b class="command">xml2-config
    --help</b>.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s09.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apb.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Encoding Conversion�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�B.�Sample Document</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/includeaddkeyword.c000064400000002450151730335160016252 0ustar00<![CDATA[
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {

	xmlNewTextChild (cur, NULL, "keyword", keyword);
    return;
}

xmlDocPtr
parseDoc(char *docname, char *keyword) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return (NULL);
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	cur = cur->xmlChildrenNode;
	while (cur != NULL) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur, keyword);
		}
		 
	cur = cur->next;
	}
	return(doc);
}

int
main(int argc, char **argv) {

	char *docname;
	char *keyword;
	xmlDocPtr doc;

	if (argc <= 2) {
		printf("Usage: %s docname, keyword\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	keyword = argv[2];
	doc = parseDoc (docname, keyword);
	if (doc != NULL) {
		xmlSaveFormatFile (docname, doc, 0);
		xmlFreeDoc(doc);
	}
	
	return (1);
}
]]>
doc/alt-libxml2-devel/tutorial/ar01s07.html000064400000007470151730335160014377 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Writing Attribute</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s06.html" title="Writing element content"><link rel="next" href="ar01s08.html" title="Retrieving Attributes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Writing Attribute</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s06.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s08.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialwritingattribute"></a>Writing Attribute</h2></div></div><div></div></div><p><a class="indexterm" name="id2587093"></a>
Writing an attribute is similar to writing text to a new element. In
      this case, we'll add a reference <span class="acronym">URI</span> to our
      document. Full code:<a href="apf.html" title="F.�Code for Add Attribute Example">Appendix�F, <i>Code for Add Attribute Example</i></a>.</p><p>
      A <tt class="sgmltag-element">reference</tt> is a child of the <tt class="sgmltag-element">story</tt>
      element, so finding the place to put our new element and attribute is
      simple. As soon as we do the error-checking test in our
      <tt class="function">parseDoc</tt>, we are in the right spot to add our
      element. But before we do that, we need to make a declaration using a
      data type we have not seen yet:
      </p><pre class="programlisting">
	xmlAttrPtr newattr;
      </pre><p>
      We also need an extra xmlNodePtr:
      </p><pre class="programlisting">
	xmlNodePtr newnode;
      </pre><p>
    </p><p>
      The rest of <tt class="function">parseDoc</tt> is the same as before until we
      check to see if our root element is <tt class="sgmltag-element">story</tt>. If it is,
      then we know we are at the right spot to add our element:

      </p><pre class="programlisting">
	<a name="addreferencenode"></a><img src="images/callouts/1.png" alt="1" border="0"> newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
	<a name="addattributenode"></a><img src="images/callouts/2.png" alt="2" border="0"> newattr = xmlNewProp (newnode, "uri", uri);	
      </pre><p>
      </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#addreferencenode"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>First we add a new node at the location of the current node
	    pointer, <tt class="varname">cur.</tt> using the <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#XMLNEWTEXTCHILD" target="_top">xmlNewTextChild</a> function.</p></td></tr></table></div><p>
   </p><p>Once the node is added, the file is written to disk just as in the
    previous example in which we added an element with text content.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s06.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Writing element content�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Retrieving Attributes</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/includegetattribute.c000064400000002223151730335160016616 0ustar00<![CDATA[
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void
getReference (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *uri;
	cur = cur->xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
		    uri = xmlGetProp(cur, "uri");
		    printf("uri: %s\n", uri);
		    xmlFree(uri);
	    }
	    cur = cur->next;
	}
	return;
}


void
parseDoc(char *docname) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}
	
	getReference (doc, cur);
	xmlFreeDoc(doc);
	return;
}

int
main(int argc, char **argv) {

	char *docname;

	if (argc <= 1) {
		printf("Usage: %s docname\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	parseDoc (docname);
	
	return (1);
}
]]>
doc/alt-libxml2-devel/tutorial/aph.html000064400000007020151730335160014041 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>H.�Code for Encoding Conversion Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apg.html" title="G.�Code for Retrieving Attribute Value Example"><link rel="next" href="api.html" title="I.�Acknowledgements"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">H.�Code for Encoding Conversion Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apg.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="api.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="convertappendix"></a>H.�Code for Encoding Conversion Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;string.h&gt;
#include &lt;libxml/parser.h&gt;


unsigned char*
convert (unsigned char *in, char *encoding)
{
	unsigned char *out;
        int ret,size,out_size,temp;
        xmlCharEncodingHandlerPtr handler;

        size = (int)strlen(in)+1; 
        out_size = size*2-1; 
        out = malloc((size_t)out_size); 

        if (out) {
                handler = xmlFindCharEncodingHandler(encoding);
                
                if (!handler) {
                        free(out);
                        out = NULL;
                }
        }
        if (out) {
                temp=size-1;
                ret = handler-&gt;input(out, &amp;out_size, in, &amp;temp);
                if (ret || temp-size+1) {
                        if (ret) {
                                printf("conversion wasn't successful.\n");
                        } else {
                                printf("conversion wasn't successful. converted: %i octets.\n",temp);
                        }
                        free(out);
                        out = NULL;
                } else {
                        out = realloc(out,out_size+1); 
                        out[out_size]=0; /*null terminating out*/
                        
                }
        } else {
                printf("no mem\n");
        }
        return (out);
}	


int
main(int argc, char **argv) {

	unsigned char *content, *out;
	xmlDocPtr doc;
	xmlNodePtr rootnode;
	char *encoding = "ISO-8859-1";
	
		
	if (argc &lt;= 1) {
		printf("Usage: %s content\n", argv[0]);
		return(0);
	}

	content = argv[1];

	out = convert(content, encoding);

	doc = xmlNewDoc ("1.0");
	rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);
	xmlDocSetRootElement(doc, rootnode);

	xmlSaveFormatFileEnc("-", doc, encoding, 1);
	return (1);
}

</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apg.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="api.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">G.�Code for Retrieving Attribute Value Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�I.�Acknowledgements</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ape.html000064400000006030151730335160014036 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>E.�Code for Add Keyword Example</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="apd.html" title="D.�Code for XPath Example"><link rel="next" href="apf.html" title="F.�Code for Add Attribute Example"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">E.�Code for Add Keyword Example</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="apd.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="apf.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="addkeywordappendix"></a>E.�Code for Add Keyword Example</h2></div></div><div></div></div><p>
      </p><pre class="programlisting">
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;libxml/xmlmemory.h&gt;
#include &lt;libxml/parser.h&gt;

void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {

	xmlNewTextChild (cur, NULL, "keyword", keyword);
    return;
}

xmlDocPtr
parseDoc(char *docname, char *keyword) {

	xmlDocPtr doc;
	xmlNodePtr cur;

	doc = xmlParseFile(docname);
	
	if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return (NULL);
	}
	
	cur = xmlDocGetRootElement(doc);
	
	if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	if (xmlStrcmp(cur-&gt;name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return (NULL);
	}
	
	cur = cur-&gt;xmlChildrenNode;
	while (cur != NULL) {
		if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur, keyword);
		}
		 
	cur = cur-&gt;next;
	}
	return(doc);
}

int
main(int argc, char **argv) {

	char *docname;
	char *keyword;
	xmlDocPtr doc;

	if (argc &lt;= 2) {
		printf("Usage: %s docname, keyword\n", argv[0]);
		return(0);
	}

	docname = argv[1];
	keyword = argv[2];
	doc = parseDoc (docname, keyword);
	if (doc != NULL) {
		xmlSaveFormatFile (docname, doc, 0);
		xmlFreeDoc(doc);
	}
	
	return (1);
}

</pre><p>
    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="apd.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="apf.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">D.�Code for XPath Example�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�F.�Code for Add Attribute Example</td></tr></table></div></body></html>
doc/alt-libxml2-devel/tutorial/ix01.html000064400000004761151730335160014063 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Index</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="api.html" title="I.�Acknowledgements"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Index</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="api.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�</td></tr></table><hr></div><div class="index"><div class="titlepage"><div><div><h2 class="title"><a name="id2588704"></a>Index</h2></div></div><div></div></div><div class="index"><div class="indexdiv"><h3>A</h3><dl><dt>attribute</dt><dd><dl><dt>retrieving value, <a href="ar01s08.html">Retrieving Attributes</a></dt><dt>writing, <a href="ar01s07.html">Writing Attribute</a></dt></dl></dd></dl></div><div class="indexdiv"><h3>C</h3><dl><dt>compiler flags, <a href="apa.html">Compilation</a></dt></dl></div><div class="indexdiv"><h3>E</h3><dl><dt>element</dt><dd><dl><dt>retrieving content, <a href="ar01s04.html">Retrieving Element Content</a></dt><dt>writing content, <a href="ar01s06.html">Writing element content</a></dt></dl></dd><dt>encoding, <a href="ar01s03.html">Parsing the file</a>, <a href="ar01s09.html">Encoding Conversion</a></dt></dl></div><div class="indexdiv"><h3>F</h3><dl><dt>file</dt><dd><dl><dt>parsing, <a href="ar01s03.html">Parsing the file</a>-<a href="ar01s03.html">Parsing the file</a></dt><dt>saving, <a href="ar01s06.html">Writing element content</a></dt></dl></dd></dl></div><div class="indexdiv"><h3>X</h3><dl><dt>xmlChar, <a href="ar01s02.html">Data Types</a></dt><dt>xmlDoc, <a href="ar01s02.html">Data Types</a></dt><dt>xmlNodePtr, <a href="ar01s02.html">Data Types</a></dt></dl></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="api.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�</td></tr><tr><td width="40%" align="left" valign="top">I.�Acknowledgements�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�</td></tr></table></div></body></html>
doc/alt-libxml2-devel/libxml2-api.xml.gz000064400000471200151730335170014027 0ustar00�/�clibxml2-api.xml���s۸�����\g.�L�7M�rף)Jf#Q
Iپv:��-���_��?X��(ے�K?�!gI�-�`�����e��y��"�凓�?0��"���_~�������rt��?~���`�4X�_�%�\r��~�c_o���W�w�̅?��,��;�#����e�=���n����� e�,;;��R����7O2L�_��JL��0�W����"��RD�L7^���i����b����B�\E<����Xpv-��9�����L"6�,�g��`?�Q���	{Y��*������7,�d<yb�L�ɯn2�d�W<�o�0��������
����1��S��Uу�X���^��<a�<N� ����c�q%2Y
��r.�_�-�e��7A�^9纖ޱ�i%j��x��>�҄�$�G�,=�7���Q������T�gM\�4|�WS<-� ۹4�6�p�����9M�Gs�����rL4�χ���#�=���{�rݱK���dh[��'PW����MN���6�1d�_Z��q��S�E�	��1.�I���ÿ�9<����K��x�'�ư	:"�Xf�4�Y<D�����ʂ�ђ�ڱ�A@�jZB��q}�Q�3"�-�WE��Ff�
���ʰ8��և�������M���J�	��jF�e!�D��nq�)m����RdO/�FƤ�d	�pyI
G���-���4NW5��9�V�9׃9DZ/mB�)�U
W#/�ج��:�\Q�� )9�g�SG�V��e\<����v�V���2tO</dC9��Zd����x;N�g.�̕��B���C릚*��1jm/�0��Ǵ�kD��(m�¦(k������� �xr�߯����6���Rc�ؿ��-`%W[!�y��=@�3�
��ɱ/�����9H�9�?�:�,�Ґ���B�,N��>�>Oo���Ver�?�_-�1������:��F'6q-�r/-4�[ר�U+OS��l�^�\�E��qY4�4�:��@IeDo���8^�xXն+vr>"�A
�3zbFk!�8�W��S9�Yj
��$�Q�<�'�(��}MɞD)�뽻�9���^�I���;a��E|��P�%����f�XN>jO}[�"ge���y�da��7�	��ı���������uFA�'"D������P�S�axx�Ȇ�W�r�X���W<��ƶ��f6���P�{�U��W�Q�[^�")��S.�<C�z�B�q�	)�����+9Y/��N�y�v������K��y���r����Sߦ"�̫E\`��q�<I|���N�cG	Ē�^!�
�"���
�̩(�bGU�9�ک�@nl��3~�3�bZ4�H�9vxɊ��P�9Nd(�0Z�"�
��VZ}��:ڏ��j|�Us�¬�/k����n��JY�WH��SI<7n�O�$�gR{X�T��oc���7X�q[������>��T�fo9�(���Q�=Tq�,�Y�u�aѣ���oh�(q������X��!)F؆&[U
h�j��m����[L	Té�`w��jR�u0�R.�ckIݪ�dXU�C2�*x��^���x�iM�����:Q��UԤ�j�	�����KD��/���>���“��]'��}qf�H�0H����z�2��G�v'!�Aj�iHG�
�T>�[�Un��C�*��&���?1O�v)�1)~�7�U�?���[)�w
'"'g��d����Z�8Aֵ9�z���>5�‎D�[�U�X`C��*����y��O�8;��s�6�$���ݝCZɉ���魎	�S��I��+�\��CŽ<�_�rS��z���s5���&��y�u�ꖆo�o�#˛f�c�<��Hhf��+�1�6\olN����s��.x�"��k�-�9����>g��=���3�0���(7*7Q�>�@QF��g�����R�"u�U�YV/t�H�˝.���S贖�``�&ք��rEBEzϳ����VŁ3��r![Y�9't�
L�Ul��r�\�T��,ʠz�'vj�6�:�Ϊ�M4�4���%���o�44ȱ�u�o�&�V8�o
;+�_�DET�#��A�[�\񌒲�(����t�'��k�Žl���Zc*�r��֎,�[���;��h�yX繱x�u�Z�<��r��o*_H��Y��xK�k�� oy�3p��?��{Y3��Bu��� I]�e%ll��$h.\H/?^=�ɓ\��L�}�r�J.c�`��e����a��\.ay��k��T~f�����r����
K���;�@��.
�$�X�e�����z�m\�	d�`7=�8�j��qq��E����n�jM�ri.�j��VS�\NU�y�������Iz��y���^�Ƀ��vTI;�C�����R���vZhW�
��7��+�mZ
��E0G���V��3��
��`�@2�d�]ɩ�G2u�#�F�#�usc
�'ף��·k��[�����k��[��A�+�n��;�r�`_��#�L��]f�m]c�i��u��	au��Z(H�S��?bvd��`n�%�9����a��mD�@���[�<�h��`���8Ó������WdX=:���Lt�Ü�S5��L`x�
���P/�P�g�JS" j"�RAka�^O�bae�Ⱥpy^&�2OE�����e�i�.�n	�����Q�r�{qwU�
�I���1eH�2Wѿ���=�o�k��^��DT���F��X���Yxs{��D��<r��tGq*���9���������/�yp���#*l���K����5H�T�Xo�q�n}s�Uu��!
aAP?�Bu,�n���_� e��k_�y��������n/nj�<Q[�p�=W�������������}V4�u�鯬�~��-Jf$q�|.R��[iI�C�Ǔ��>���4ܶ7Ҕ?֏�8��ĆRեG'���޼�}��:�9�Y����em���,�,M\.�W.n�_���ԈGG�
"->(����|}~��ozЂ�3#��\���yŸ޳Kp����=;���d��T}>=��,�E��\֮,t�UY������gP8���L�֥3��&�rT��h�X�L��X�js���p�jE++1���g���gG'_>:~{O�Å����f�NOg�� �f�p�(ラ�i'�c'����N�N��;џ;�_��4T�:7{(�m�}��W��a� }ڶX����U���N;�g�Vz؉����}�$���	��~��S��>�n�(����l8l���q�����(g{i�`n+��n�EuV�! �\tAUd6�b���q��[a�N�Ɏ˂���R�K;I�U�"�R��>�S�l5>z6���/�\)�2��yH�i�g���!�V\���*��c�~�P+a��Ԓ.��s�T@�b���:K8�$��i���BGk7����\�u���V�p!LE�o,����<,A��*����o���}�u��l`9�kT�{U��9S��$�#K~@���g�!x�<L\�g�mY�U�U��|�B��H�@�槾���'Q�����Ҍ艐p��""��5ɸr?��cbM�zz�a��j���7�?;�K���/P�K����c-��Q6A��h�hz�
��eB���U;.|��?��;i*�O~׼�#M���$a�IV{Z��ZE��;A�|��ˀy�Xȱm�n��l��+K���Y��z�w.�B,u�Z�JK*V�2���N�DZŽY�\K��>�pw{���Mx
�X������w��w�y��נ�3���@eBX�&��]6��⡙goH���z"���~ի_�'�����\����.��oEWY�B��G�R�-�Y��tV��*Vh�b���u�.kݬn:�E5�@[�q��U�ߍ�YK��
2�9��vɉ��c����q�R^���A^�kn��C�"��G���"F�ρ�R��H�/�"��ȺQ�^�F&�6��_Z��|�|�G�j��-3�,�I;�G�ԌúH�w9��o�������SSa)-8��{�R�DX����,wȵZK�mG�v�z�7�,J܎�+sV	�[0�)��H�$��'�j�-
]%�%wD���v�4n�.�/@��22vښ(]GP%��هx��BH�eX!D�7���KI{�&���U$Z�-�M5I%��с���aG`$𢹌!�%)�iA�ʺ@�ec�ݱZ���v��`���P{F{7���_	�?�_�;N�~�(s�J�m�8mn��?2:���R�r/wN����8�Ͽ�Xe�Muݵ�gx��?��W�/d��gky��ra(�A��)���&M���ǫ�/�{}��sIމ�xu�@dV��."�n��7�)��w���|~�f�;5�:�mH6��.0>�^�$��T�Dްk��$S�ީ8Zn�����H�:O�=��Z	�{n-���@<��V^�P&���a�\��a�mx9�7�T�}�Dz��A�.�ʤ�Պ���Oa����6L8�,q.�l�)�EN���
*���L ]%���_�\�BS�:���8Z����K��(IjC�@�iR�,Y89#�pՎS9O*�M4),}$��!&��$��T*��n�i���b��BX�i��'/���vc����
#�
/���dA��\�wP�0CZ�ƌc��G����'߳H�T(����D�Y��Ǥ�\C�7���7�o��zX6���D�TS*/*�dө�o��+Y��$�p�}�
j�4�\�_XR��t�r�FF��00C(���Z<��9�T�[�H]:$�v�-��U:�J��b󌥥O�&�x|���KZݸؠL�~rf�:z�)���3M^��y��0Q�q��-Ș!��YȽ��N����ԯ���X�$�n
�p�D���#.�3ꀺ<�iM<���y��tU
��L�<�'Y�Yjba�8:*�<�,w�;})셶S��E��4�m�#�CT���Qy���R��+�k�6�!�>�x4Z�53|���Y}c:�g����cE�����&9x��ld6��@��	2ui�U�a�Oe���q}�����Ǔ�l�M{z<½/i�9>�k��l�XNo�w�d'0�T��$ָ�g&�p�/�=p�.>�#�3����#�R*�j����N'�|�i���i�;;�u,�B5LlAg����=PSl86zLm�`���;��QH��3>7<�o_���|��R�x�g�;�3�kw�pA�j̱i]�c;<xm;��t_q<sh�9v6�N> i�`���3�ą�˓�wA��#�ӵ����)s|�����	��:�d�D���)�3^��̘��J(^��E�<�T�:������8w�-�u=q�Hߟ �4D#�Tli�_��)�����
��a����5�v�Ѹ7b�(E��)d<�'S	M�e��>
�`�k
�p@B85������1����
,�Z�QERH+W1W.�2�q���}����kh�������(��n5n�Ch��uM�=zK'�>j۰�������^�QpyB�Y�� +���B��™�v��c�;�l�6��p8jӂ-�g�%QAQd�,85�8�FњF�!^9ODx�Gב��X¡$��0�TG<���PXK'�@aO�4!�:���ix�:��/����Z��o!&$��B>4�����:�\JPRt	�m*2�v�����?��Y�up�D���S��H�u����
1�u�|-%�_A ����'W�Քn��>^��d��*�ɣ/Su�Yte�����9�E�T�o����͍#I���_���������K���ݡHP�$	�PR�X
"!	�$����v?��#�x8���{=6]�)�����ᏘL�UJ�=H�B3D�M.�ʋDJ�V#p@�" $1(���V�L
6�סb"��k�9�}v�Q,���l�C���A�H���M����"X�}y����FUmr	�^X����S^҃�!��	�b!j�BHA�TK�V�~!�q�
��2
v�I[���n��q��"��+��S�����,j�0�p�R�K!�c#s3��+t��U>:)���S)�&��樿\V=K
��\�D�P��
[�+���n����z�R�b�0u�a�LA��4Sū>10
�`���PZ7�Sa��a�����E9;>C�`~(�:��#��s`�'����N���(�XA45I�q���E�g����-
w	�}Y��
:���,�����.�����6Ԥ�ɯ)E�R�r„�;�[
鲑O�C1z��d}`��_��]�AM�#�C���n�-C��
_����_i{O�i��s:s�ۙ�Y2��pX��и1\U������Ps	}�  �R�s2
_\}�Ɠ��J
�ɵQ��TQ"����s%�!��H�D��֍ݟ�J�| U�e�+�5�]C5a�A�	M�;ݵ ͢�.Cc��h��n��d&��90�ٷ����DZ�2�e}�MQ�f��uE�ۼqo!]"�����q
r��-,d1N
r��*����ކ�v�Z*[������t�K��`f�o��Cג}uZ��0����KB�4����p�
��WN�P#.I���T�{���C��b��
4!6s/z؆d����#`ץF(f���"��'�7h�sng��ʏ�z�q@�h�c�ם�sa���c?I��Y$]Rs��)���!����Ϛ�5x�`M��p��Ȁqt�I�G𦾕�,�D����5eU;#�Q(�]`9CG��Q�BW��Cڊ���%@Z�n��y�,�0\���Ө4��%X-�vO�ވ�S�h<	�e3.6e%���/X��BX��#�fz�cA�ZP��֬�$Ne��c$��}m�,��E_w[܂M���ܰ@����b�X�0�C�db��V.���^����1X�"�b�~ۅd���C7�$g�[�j΋$m��)��XN��
R`s�V�}��qG���h�8�``�K�F��R���.~Q���X�*�ɒ�Wi�k����;�;�U���
S�#������i��5H/��|��Gx7�?�7bs�D��s#xG
7y�oQ��5�ji���Rj~�h�(c����X��ŏ����k�����=����Z���N^z-�=�*��Ԩ`����9�32����c��i��J٪d�*�HS�SN8�J�U��H�����D!��)o��0%-�Q���{�'͈O<ղ�9`�9J	6ؠa�p���T�S�z��J�*{(շ�=�ې��j�Oz%2��wx�y�4��1u�T.1>��#��h�hߠ婸j�4��� �>�?�7��V)����l*�
�jZR��n�Қ��k�M��@[Mh+���ۖy���V�l�T���*圪��)r)�m`�����Ph�m��'S�������+��=��V*�n�Lm4�7U�B[
�w�߰�tëU�,"���̏
��C�
���
����>�l$i(d92�'�i��̄��ɤoc����|7XlX�(�`2��a�
�ϗb��,}���~=d�)�a
X�]�E�L|�ps������7�X1���w�-�U��!C�
�Y������C1E��H��^p��������8#h���:�i.9
���E�����a87w�S⫧�����5&r��fnO�e��CĎ i�K��ӕQ~�� �g�phR����,�ŋ/�z_��>ð�›��@���y5�Y�G�&E_�W��G�G[@�9��%P���-m@��}}Ռ�6��gx���9��g��0��di��;/�ȏY[�G_�O
x��_�B�H����ØV���/p�$����
4d5w�B�5x�p݀c2�ۚM�7c�?n����GN#$�J�Y6Ba��V�˽1��p~=#C#���<p�UɝQdFk|�g�t*�Ǫf��bJ��MpLm�ָ6\�Pf���o3�F�[��yS2�o�ؖ�8&�Bt�W�b�C��y����(�B�GK�����d�h�Mp�)fw`؃�X:���)8Q�D)4[����04'X����h5K�s5K~8�����"2��=���NCSL	.���5O
�B�U<�5�w:fQG�����ĩ��L�2���O��/h�JS"x�+Oqʕ1_x�H�)�2�����ZjЊ�y����Ę���cc4/>��C}�
���䘧�%ã�&RV@�L:"b�I60�0P;�"�q�V�ݽ���y�����1u}Xz�QFS�Z͐4�'��o
N1�VӤ(�q�Ƃ��
}�(Cnؤ��40�("���A#MM
lZ���2�nx4�\ׇ�F�9*����K(���m������ŵ&jݷ�ai��3�����Δ�&�dU���
o]枱��;�k�Z)����ن:��;�]P�
mYj�cs�/.b��>�5&H}`LT�Sr@kV��*���Z��n��
�>�%H�ڏ�V�U���n&����S�Ñ���D�������؝���)�3��f�.
H���0�7��
b����2(���j��Cϋ9q�Ϻ�D,�ـ[bU�E�"��T���0�7�$8����W�I��H���̄J��p�^�Cz�Z�,�>4,1��������G��^�.�Rq�s�n>
f��r��@��H,T� l����3�ұ)��h	8��� ��+�*O���`<s
�Pu�m�E�Qf�Q@���(�B��|	�%��� ��أ�x�D�����z�b�>8}�l�4�D���[��8s=4�+�������Nw
��������0����g���)0j��EH�m�AO��k�H��<�!pt2c&v�!-�l�=V�+����b,ֹ�لj�T�`��[d��,�&
wۦ�͸ʂ!��1��Nˑ��W2�Q���� �pk���EAf5#�(�8Y(��f�hfр�����5*��$p8.��r�EK<�7�E�6W���HL3�d Jg�X��B��N,|q�ɃW4�<`I�*��X�j?y��Q��qZ�j��&���l䫗�߃VyVK�K���>�~���j�� W��ʹz�Ajާ�&�ږ9�f�z6�?���m[x葡~�ȁ��b�A������ɏ�)T���ն8�:�(
, �N��fXt��8� ʠȺe$��{��(���K)�МG�IQ����=I���"�T0�3��H$����K�{˚d�b�;|&Wn9��T�7~,RP�_�_A�}��%ܭ��+d��ɋ�M����%mސ�-�쎝W|���脘�o*
��V�Q�bc�de{�uUꖶZM�@��pi`�P�:؍�ܬ�Go�@�mUP6%�R�7T�Ḁ�T2H%�q��:#O�s�MV��mV�pp�(/B,����,A�:�C�K����h��n%������?��Z�g�v�Y�:�����M���k�1�z�[���6<��y���V�'`��!�<�z�C��p:�C���K�S�a�N�Fs��lt�ظ&C��M��r��kZ�k��iYF��mZzx��Jm{�֠?����{	H��R��O���:��o���p��K�,�����^����D!�Gj�d{@	���\DM-<��1*�
��8.�58	��ZrE�j�h���53�hh�fb�Hp���!�{���6�|����+eȔ��lT
��F/(����{b����,,,
Q��ݡbI|�SI
B��8@��9k<l��@f�n�y5�{}<Y�DW�E�*-�;T\�4<���G0Q�T���b���MH�xة�-u?�9xh������A�K=����I��LP�UL%(�¹]�.���F���0 ŕa@�dT��=��k��3�K���P�'2E�LE�	"��/��Cn{ŞP2�L�~������Q�XFU�o�wO��+rF �|D�
ԛE�'|u����}�mU�+`���=��O�p�G�Ν����%K��	 B1S�4i-��(2nx�B!��b� kǫ�:�}�z$�"��J�kE�EO���$�cr�Ѹj���f�*��.������$.V�S��S��`<��
h�?W
�?���H(urc�pB$�j�q�\���D�
�J��%�7��>O��]����)��sMl:�|]<l�W�g������Dq��o�J/��rkh�o�<�T{��i�C����Fu�(�V�_}��*�R8ȾE�雥*ȍO_i�T��s^�B��,�L1H0��.�8�[��9x	�[7��|�0�"�C��l�����>D)�������n��6�7�	fVl?�-��'u>!,(-@� ���wʰ/^���m&>���
�;r��fz�sEO�ܢ�)n�A�}W�e�0�R�o����T�(t��RBQ�
H�U��&qv�������_vA��(� Y��Dy����*�X`У�y)��bAmn����2ơY��c(�.�)��U>"S�Q��dBƪ�|^W̖HQ��2�1sF,n����t$�`�Q�QS��U=}(L�NGy�d@ʛ��%��&R�F$���'�e����r��$�j1<8�$�c/F�
�Q'b�
e�f����e}�)Z�c�ǣ2̭#((e#�^y��ʺˆ��r�>^�	����d���ғ�p��O"���E�3TYX�`��(��a����"��o	l�o�!e�d���5���G�G0c�A!�TI�Do���Y(���E�Ai=��e��i�Q�2�2���`i+�:2 ���
����X��a�H-HĊ8Sb��7u��X]��K�D�W�'��	� W�����8u]���r�����@�d.��KT����m�"V>y�?
V8 U�O��`�c��4E�C�r�{��Eq�3���H�
���4�?8��$�ZT�mu�� ���E8��*H�[W	�U���P�Q�t0hr,`P;��KOl�GϾj
��˜mb��P8e����9P>�rЉ~U<�sX,Q�l]a�]�Y�#�bI3�8(��-"�C3����f�Z�{u~�*J��2���s՘��4��n�D���K�*�ۄ�`��|e������
c�A�g0��l�``U��F��P�}�*�Jt|�
�ӌ�n%�iz����PN�ΈHA9v~���5R��kCw�*��+Au!VK��e��4�'��A%֓b��.�3�)�}W�{2��m��o�n��~��
��H!��E�D�p�98��Rd��2��zN�2�F��+�kZ�SK��C������(/d�.V��کPc@�����詐a����A@�q��w<B�i�q�I�P�;�Fl6,m�\�Ź��:�c�CG�5���Xn0ei�R1��q��T����
�SM��z�J�jMC`QBϘ!�9���BA�
����րsųޓ�'�R��D�x��KL�#�b�)��4N�����2 �)r6[�X?5���%��I��u�RG�{Q���j��&B$\�^^C�����N���d"&ެ9��g�l��%"�Q��p#P
C*��b�]�d�ǯ͡h�N��1�&,`��*����T4 ����L�m��]�B�a��M�C��: ��	�~���j�<R���Yޕ��й��̧�� ����=�X���0Z-���|u�?j�T��8��Z��hm�V�
�#�)��-�$��я�N��=�w8+j7����gY�pw[�|-�Rp>�qT!��5�ێ�����
���K
���Kpj�ҽ��L�U=�E8E'mJ��U4�3x�����v��#PV�$��xW5��|�ȑ�g��.�D����S�	��=@�Km�'>ŗ�0�"B��>�
��?pg}W��g�l��BU��eBm}�qU��[�~�O�����L�^Fql�֧�@	�U:~pu�f��sGw��U�H�h:!	F�I��^��V���P��VR:��W�r^��K� � Q%�Twp~lڄ����%�f�/AM�[%��
X�nY��!U�h���%�x(�Ls6(��W���&vء��rמ��a�7��b�_,��.l����jKK1J�:��w�u^S�S��\m�K��?FX���k�K��_!|~�^��@޺�TT�uz��p[~�_c6s80�*T�Z��K�t��U���Z�m�+�5r��C��g��)O
�R��q�
�0c8��2�{����]���#up:7xp+F��6C�O���6^Z)|zK���@�������_]8K�4������M��G�|,��7%SF0Z�b�b"3n+(��Q�iQ�fЈp��D��hG�%�WL��8�Lj�gg8�u��\T+���]]�Euks�(��\�����_�
��&�r���Uu�e[b61�	t����8�:��܀�
�S0��4�b9��$�q��t��}�)���>B���τ-�X�)�u�>u�_?�J>K
��/+S�Q("�B�����`i�� )������]$Aa0��j�F�&��Ӛ�'��i��_6gC�=tވ}+����?7"om�i�������؏b�����>��PQ��A�"8�I�C��1C��`J,�{LN��5�!>y��l4��t{4��zY�{�|`��ZL�T�t�B�$�a�\R���j��k��ޢ�h{vg>sG���3�I�x����uX�/�k������q�W�6-7��:��֡�:Y�bض>�َa���V|�:���*�Ț�C:U��E�+vx.��.�8�5��Y�sr	��x�B@����������Qw�����n4g�20�S�%8�.�{�;Ā�0�i�Zc��L5
�AU<RR����0k���EA��"�6�-���l-BS:m�N̙�́�u����f�cu��0�E��:���-bz �b� �D��ĉB
�$
P%75���gcn��a�C,E+
��钹�붭"�E�	�1��/����4ʼn#b�0R�E��t��kt�1אGX���)9T��%
�1�����ڨ�J���$���Z>�5Ko��[c<ā�v���1��x%T��0p�$d�l���ј����8O��aW6�G�9jT����M����!��ʬ����<�{E��Ѹ̶,Ei���϶���0����RW֙مܤ���^�T��aU����Ĝ/�O�BՏ�����5��n�X�*R�@��vRí
�@(�2�{ý%��zP-�`"�w)QJ���n�p����F+���P�V����Μ��5��/s���
�so�CGd�P#�g�˽e#�4z���,3���J��R��V����x�Í��5�Y����@S�5Jy�1��Q %�G��+�;��X��j�A3��z��]�z�*�M���?��d��JƖ5E6�z{�]G�ڣ�SG�v�c��Y��ꪲ����g�+e�l���a���6,�^f�@n\��~�����&
�DaVj���7�Tz�(�!�A�$��Ќ|����ܐm�Tx�,b@�����-RV�.�)⢞㨒��&����[������l�Z1���8
�Z93UmN��KXYm�nK�<�P�:À=i���^���1��*�nV��>�T
��s�X�վgne�Nu�m�A"�9�a�ʯ,%��
F]Rh���h��S`�֝ή�kFNl���;��I���p�q-I��̱�{�;›�s�LCǖ�N<G���g~�I��"���Fn�D��Ɍ+��x�v�1)2�;]1��rX���tj�bay�
D,b��٠D�T/�tK I�K�������ۦ2���QĠ��G�5� ���W�Aظ*�j�6���%E�>Ԟ���:u#w�q�N�� �T������"��
ʀ��l��.�p"�d�Sk�Ng�"U���o�2и�`� �����&}g��Qsm�T�tm]u���@B���ۆ�,Y=ZU�i߽U�)׺�sT"�����SD�:w���+�G�}$��ϝ/��W��uN�|l��ښꦎH����i>�l]��N�3��*�0���r\UPԜ���
�'�N��G}c�b�PH�<C�[r����,,���4�R=�+���#������;� �!�C�]ldZ�=F�o�� c���E
�?)CL�E�����<�jBPj��2M[�UZC2��ϊ0�D
@P��Ũe
rm(.�aNm��&
FN%�A����]O�w@Ta���H&#c��>&PtYĹq�?)���Z���XC]qLݝ�-�WqUP8����;U%#&y��0�gU��>Qq�ʌ9_UWy3Ű�ʱ���%G�2�2o�zg�ۊ�95��;��7� �HQu�[u��Ƅ���&����F㙣�&�ǀ�X�޲?C��5X��T���ΣC�������h���)d:ͣ�S8����W
����(��7 :6�c0ő�*B3����U�sۼ����zF���Y3�:S�V�*Հ�
���W�M������r�)���2�1������s1�uE`J�c��"y�PD�u
���V��q�5�Cq9�w��V�A.A���VMK�A�|���c3��
v����i� uźXh̄g	�8�a�YC��q�
�0ЧH��C3�4����4���;����ӑ�w8�,��uTxo�A7nL�[���O&}�4F�2X��e�DzS�Rpk����b�P�Y�J̜�bd-��	������C<pc��7}98Z�
jd�
��v	R1��f��j�(h���[�a�2Q��u�ч��4���(�!�Q��v{��n0���h�&;n�����D]E�\�"̞+��V��088�����N���I��ADeY��bV�^G�2�R�q�(N�N��8���^ZE4Vz=��2!��)#�'D�Z��X��.
�+
�h)�RXܜSP�d�'[c�T���@��n�2o��h��0�KE3`��\`�vc�X�Ơ���0^�1x�`�ۚۿk(�7��(������U�ĞK-����Û�lyO�PN1������ qw�����U�.
{�wT�O2`ph"y��A�0f+7��W���y��8�uB��#�r�rPZ�ڱ����R�0ۂA��9�/��Q'�-Zȡ�/(��m�R�➂��m���LK�Bl8�WmM�y\��@6�Ȳ'YIc�
]Dsc�G)��(�E,MQ��Hü��qz]u�1&G��Mfu`9�xL���P:ފ.}�1�μ=o�G�8�8�-�
H��>�;��T�t�hlr�n���`9
/�q�=	?��pӁQ�S�D�N7��	y�S�d��N��4��=%���Z�d��=�$uO&IݓIR��$�:`'���s*4'D�Y{�b��O��|tO��w����A�
�9��F5�CH�o��XI��1��M�l�Yw��vN��{Z�'�祿�N�����,<���]jC��_���ٽ�ޣV�p~�w0#i����Zo����z���\Ũ?������^G��3c<��#C)����4D��m6�j6�}�s���U0e�F�O�<�
�I�O��F�dx	��yQT�a
���3�i�_�
�
�l�b2�1�,9B��Q̜�-k���B7g<4Um
��j1C2�?X�m��0���Skڙ]����U�dr��v�q�ga��C�݊�&�J_ P�Sjo��˫;#�8�p3�Z�c�``�ȑ��x
�w,{c�A:����ch�w�(:�A�؁,���1�Y��Z �qxŠ�C$�>�(��@��X���w�*�&������y�K��s23�r�G9D�
�`�8,��߈��gЄ��)������Mt�"�6�ۜ�^S���>
��i�tqhp*@fI�
�;�t�!@��峇Ź�K�F�
�r�iH�ې>Z�(��-��W�P�n�5�C��2Xh���s|ڧN�
��E��(��Q O��I��k�<Ny��8�o��	ތ��;��n���N�?g���=]�F9[��>�<�{<�zgr�Jq��Ҹ��)�-�5e��,�b���i�f���Y���`k����iݝ�8�φ��_�$H�-:��2�Z!M��L
�P��;�Nm��m�6|fO���hG��*{ཕՐ���Fc4�o3�l���)s�9n��QLX�C33��}bGm�1�6Do�`��`���٘��(��9�}h8�FC�sз����tR����6���GW��3X[�\���s�2`�:�0"�/�k�C�"�4E�m���D0����F{G�DX:'��=	��	�tO2/��o�D3|��9;Ɉΰ���a�m��t:����c���<h�	�r��7`�ׄv���|�qٗ�;M�;ͨwN��$(��9�	J���Z�4�MV�F`��-ph����1�Ǻy��6!=�?����`⡾��9���4�2���0�j
�3�F"�B������tƽ`�x���#�gw^u�5��J��#72��"
U�>G�����FA��o�w�P��[��ӿ˼�оX��`���h�x�T
PP8Y����Ҧ�k�8����W�$T�4��xE���!�u-y��Q���
���DI1*��n~o[�E�](�=@B�����E�(��d�K��D�*�x��Uyl�̧���i��y���gBL�x61���2��0����
�,_1��NA�f�Lq�ێR�t�I<�xT-��������D�>+ȓ'ɤ�t�{�7-`�C6�z@��9�aJK��
̤�J���l�}�ՠ�<k�2W;�sx��W�ֈ �du�7�C��n�B�����W/����+��(���W#��%;���ios�U��ip-s�Ƒ͓Sm%�_�%��Dn��c���A��J����B��!�,�Ѐ#��\�Y�vդ���3`���*a[�?ơ�����
'v����p%���=�j.4��4��L
C>D�&��h������r��D��u/���ܺ�O}�:��l>�:j���!�/��@���$���z�GQe_����`��`�6���+e�i���ԋb?���4ܼ:q�I=@�	��G��͈���V�h�Yd(��ߓ �p���a9��PO�^��m?ƂG�<\4ӅUE�M�`����?7���4Aal�B���
�A�B�E�`���r��r�r����x���]�/�(���'"�����[�K���2B�n�������QkOa��%+�Ҏ5/�����	��_?��/t�l�Nj(�+(���"����p���J*!%�=�䮫�5���?�ή�U��x_�B�����=g��:��֛�
?z�>]����؇��Z�/	#��n��[@~��x�ZD�G��n	"��w��𷅷��U�~\���.y	��5�6����`��%�6�E�T
���Mz_��]2Oʯ�$\*P�����n+b���
V���m'l�UT�(�}��sA(�T�(�DH�ľA���V�p��U��L�__���*�0��+�	g�*(Ȋ*����򶔅��Y0u����U���t�b�
Cv�p��"�ʪJ����NuJ�H[h.w+��h\��/���~��B�.�q����?5�!x�mGO{|�V�����[.�O���t��}�=�3$g�'�}������|����3��� ,ln�¢�T�S�z3��*��S�s��
̡?@�r�{K?:�e��Ⱥ��1�W���$`�J4�r����Z�k���D܉�m�/�VH#}%��"���8K��B��*�9��/�n�*8�x���)�U1�̮�9+�"��B�aZ*��0͋Eur+��xA��b'���C�1hL;�ch��]�(��֕���	(�l����c�nC�.�i�hH�R}E�4�l�4���1nLcd�D�hUWŢ�E\��]�M)S��R�V`9ED�$��^�F
���*�a�m{��j�[U$�w部���~n#����G�*,��\���Ë5�PPc�>S�v��Ģ�q��$�D>���k�����0�U��
��h��VHV
�p�1X2͸�!���8��H���&�sﭾ����~�D��.��n� �\�{�,
���@}C.��>�=
�Ky��N�����7�p��Y��ze�*�
�S��[ro8!��
ޚ`p�l6��;o�k4���k�Aq�Gq�E��eE�&Q՟��A��a�o�$,���6X�p�'��;
3<���N�-��Z�,̊���zc�֏�q���L`��q�>�n-�l�zq�N1G�c�i�^_o�w��h�H�c`�/Vh,4�	��4L/>�l�gf�4��q~�m�IEb���|7l��*X�J��'n����2� ���L�I��S�=�f���A��q�7���W<Z��W/��M�PL�o~C�$~��o��܍^<�ҁ�6�ſ�q�56?"vpa�!
'��|���7�8/�Hi���MFS�1�HLl0
�)#i��Id��h�u>�m<�z,	!��
v}������L0�2��V^��DGõ<�^`nՂsV�#���@�B�8������:���Д��Z
b`�T^UD����,�Z%�`Tާ�{G�M>?�m[�6RI;D�i�@���()�P��{�z����d�����T�P!��k��7/
 ?�����`��7JP{�0�㧤�rHX6eP�L`~(��J9�-�Q>�	M��<�gJN�H����fW�'ޛ~Uԃ��B093�̊@6Y�Q��f�*�Mt�"��q���=�S��Cӓ�j�詆��TN�KA�6Om0��.~A\}�;��;���
l����$��%J~:�[�gg��0����:�1�a�����c�_&�-��|y�D���#a�pj�sK��x������ǧ�����>�;�[w�Rn-�zP"6��*�ּ�D(�Z�.{@�ƽcZ�c�(�)��D
""�Vj�h��zj%��P��3Z����H=^x[��t���ӓ��*��@�p.�D�8�1O�2�����Ey�_ręWH%c��K�l��3���<���w��s�f�@�n�U<�$�&|=�#k���\��$�j��e���!@w|a�ز�)t�ʽ�z/mP��!�V�͠ѕ|K0uPS芾Y���k���-ۤVo�U�7����������ڽ9D�^k!��Y�_�U���"j����sh�0غt.��7){�B�W��kVՀe� ��0]힛���+up�����7�V�V�E\(����)�c�`�⨈�`���H�r35��� �ĥ1H���h�X�@SM᛬�����p���	�X�r�'y$�f��!`ڦ	��&�"�%��4��,�DٕR�V�*�[�XFB�罨bI�W� �5�����u�J8�a4Ē	D�yI=5	M�<pה�1��X��G~`�Rw�������f������E#����!&E�wr����ø?u��EP�[����X)�����'���� aQ��M5
�!�����H�����U�C����G��e�[/���G��_�x�B�}W�9�[���O-c]r�]�Ubl�A�8t��*��V�����#x�p�`L{x�b$t=(�~<�(��"�� \ ��� v[qa!��	�xЬ~V�� ��<SJX�	̡r*d
3�D�&�&rEJ�ح�!����)+,�*����5�L�l��f�����:�xn�}2g(���
�����oW�6��x��α������,Ro��^�1}�$|�ؠ&o�����i�5��7o���?y���V�cD�Ј��/o�zנ�[�����|�w\�j��, [�G��L�6�p�h-6Ǔ-�0�N�C�/;o�
D���T�~CѺ�[x��P�3�8��e�u*��Q�?�R�1G�1oC�u0{��CO�{Tɶ���	���E��@L��'>�ۆ1,FN
g�8��n,�l��3�smA��[��r�ba�gv6�4�%�5�������K�=����1���k�e�h
0Ύ��� '�4�>{�3�w�q�&F+���|�}�}2V�C���F䚁Ay��w�@�d��1��&P4�S�(|E��5d��	����6D�@(܏K�0C
��:TL/(A�o	�)��J1�
#�U�Z�`#�l�,�3��K�����+�]Z��F���g��L���9����1�~�yۗ��rv�-�q,�j{K��h��"��)��ԫLd�����ˆ�u��n&�&�B��4�A-p`O8����8�l����'#�
l��‰��ǁmP`&j�É����)
�jS܌Lq�=ũ�i�C�?Nk98(ܲ9_q`8e��&�O8(�f���Y�?
���-���*�#m�E_��z
#���!��VOM;7�$
WӀF�aЂ��w<��(�
x�����Ʒ�A6��P]�G~�6޳!4����]���.�og�[C�h��?���7�	&̵CO^�p�Y@��[5�:���O�48/�����
�	��1Î|�+���d��6Aq��o/"����ֻ�/HP���2�g��n��G�%n�
̪�M�Oob5�e�r��F�ۄ�c��h���i|��9/�g/A�N05�����x�ƴ��-�s�G����go�۠�߂�w���xK�x_Qs�AN_�
�E4Y��/kŜ�=��{!(	6�&�	Ői�~S��t{���^?f`���>~	������:ݾ����u;_�載������­赧h.�W����»i��}� ^�d>7~�+�L��uC��);���2�g�:�_�l`�<��9\�lަ�T�wo��J�=�#m?������H<��r��<�F��/�g�U�@׊��x��zo36��G>�"L��
�jS8��(i��[�@��6(�"i��.�.J��<4^�#�3�A�AYC��,mŔd�H��!9�W@��E�Rl���Cl���V�3
��ۼz(��}����'�a�#���v���a��/�F�7x��Μ���Jcd�K�4��a</u���T�§�����}����K�k������K����ypiH='��[ڪ��`�M?&���ҏ�`�}Z���D�y0(d;��'ͷ�۾�g��nY�w1ԯg7�>��/�5(�z���kH-����O:�\0Tp�Z�?�M(�5T��{&��[78`6�
@���9Z���w��(/��0�q��)��b!�4��e�aAgH@Ǻ�<�z�A������O侙X��Xw�C�F�T�Dk�Ng.���F��̹�A�-ܑ�7�	��?���Y�9<�k[ȉvu��i)��:=�p����8șI�	LKx"A1���ʫ8PJ�ި��ۆ��D�9ϰ�@��-Ե@1F�?�?!�
��(W"��� *�3fj��z��+˹���X���"�G�5���D��A~t��EX��`�q����)��$X|%?�/ڿ��?x���i��s���+hvO�E�;Ō�V�y���au�3��M%q{�X������A���) Uˮ��Q��J&�:T|�+�C�V~��U-ʹ�7K|���`H�`
��5�	o�`��)X�v2��v.��$��Xei�<�ƣ�HX����j՘y�O����Ȗ�9|�4"k���HL�	�&�!h� (
����)�KCͰ4QI3UAq�`,)�f��9�MwJ	z$��^�a6��[Mv+C�h�2#�[3�f�5��L�s,Mvk�䍕��� 5D9����9!�f��G�WМ`���'��}r:����:_��{����g���	4@�����:�6a(O��	e�ى�p��ks$�lq�i4��� �c��l>w'T_w'�_w'R`w'�`w'Qaw��aw�Tbw�A�ݝL�ݝP�ݝB�ݝD��ɨ�Z���K^���%��_hY�s�Ǝ�Bj"D����[�����O��\F��m=���I�6�V���Z��P����v1���;kN��]Z��a�b��nF�^�����^�$�]�i�my�>�&(��в�>Ɓ����7�"p�e�J�ymYc�/��2}�XCü�Vk�����˦tc�P��Ȳ���,��{�Ҷ�s�@��`	pp۷�d��O-�(Ʀ)#(Ʀ�[S��C(���O��9Sh�H�>GW��4P�M�ꊤ���Z��!ԙ���11\���>ԕ�pj�Ҹ���(-��f,,ϥ���g���.!��c�m��bfƖ��iA�Αa�M��72�$�ٙ9�d��)N���Gd�Ўn;*�`ɔ��ۇFA��6!�X3{�8�Й]7�b�}%���of��D*� ��
���1
C�N�o[< ��&�պ��0$���R(袆�p�ó��G�a�d��-�(h����%h�(�C���<�|4�
���aqY|��!
TYCi���KC�e\쨸IC�E���"��⺿|~�P��s�5EA��(7�d���I���
Y�{C$q�$�%n��9t���xr$M�Ӝ��<P�M�4E҄ې�I�9m�BS��9\oAb$KdD.�o��?���9;"h˸xA�b�͏�&<R�2`��0p��$o	z�q�Pp��{���� �k^���p!�zwR�.3j�<V}����8X��8�5e_*CBgRTll�0`�g����+Z&`Iq;0�A��F����4�^Pp��K��i�K$��3{�>�/=k�X�ژ%
��C�H�c%�[��R��k�k�I����)����b�'Mx�<�{&4���V��N�—A�_$��R�+k��L
��W��h)����Zү�J��>o)>��ľ�SN��%W�?IЛ�
C��.���'�hS�C�`LUAٚT�O�~Q�#�R}d�!�Mo%��F;ա��� yLj���H�p��Q����j�H�H���4���
�%�j^�-���4ŒIw8޶�C�^Py<� :�ܡ��'&J���`�m00�w���z����(�W�a���C�'�G�A:䷊��S�oX��
��Q��5� w$˧�ۏw+��4���Va5'W��)�7pvgj
�3K1�z�C._H禱l�C���>�_ŗ(yX���{q�8��%ʛ�bU�8\x+��4��I�>�'d{ca��xK.�3�3o��h4x��N`KԌ�� �n�=,�+I�j6����QYQ.��B�%}r��I5��"�_=!q��mr�K�Z�@�q��Yz��)|����*|E.�	Wh,����cg��6��<o4~��Ł>�
�ؓ*U\�
�֌�@�6�_v>��^���>��>I�IO��?r�_���� 38`���E6���l��V�_XWf�4����c�
$�ց�L�s`���*�@�-�$�Uϛ0ڬXd,��c�0��L�l������j�!��Xp��Eh��q`.���`��8J<�����i2>u �؈Mx�Ɂ$ِ�
���4p��:J�}�$��ip�aU�Д����{�BC�C�)ir��x���0�O��	�5oT55��&^y�߄�]h*C�U�u��M�`���
{y[��
��&@�mƲ��R壎Xd�A�TJHB
Z��Z	��XX`�8��qD�^�����y�E��y��݁6 8�%�t���&Kt���n�k�V�u�0"2��'f�m�Ґ
`��9G(J�$�5�^Q����3��}�6�>6�5��~~d���XuI	�X �(�c|
%(wC��P�%������Àq�S��pz���=z
dQ/�eT?6€;��x�`Pg�º!�BI"8'%���c��_�8��F����a�+�:��K�wh��&8���z>�
�v3h�
�y�T"D�	J�S)G����oZ`���Gy D^�h��>�x��=�"�g���h!97�n�W-�9���O��8��z6�vZ���+U�r�y�U�=� ���_}�G�jIJ����FGWg ���O4��$��aɴ�
M�!�Γ�ȼa�<f�ÿ�z1U�0�S�]8d�'�a1(Z���<��Z`+z��&����e��
���s1zΌ��M��X�D�<�
���?�4�Yed
�Ԟ�pM��3<�GC�|j7/�.��&<��F�����@������2�2l�s�hB80�%~K-�<0T�YH#��!i,���O�w��>|���]����>��5k0Rk�["Z��:��jG:Q@H{ڂ��D�h���"���_��_��=�'��9~	w�%�;r�|��eB{/�9H�=�1I�N���:"��?_�?���E�y
�w�w�2��#���$�#����!�^@��R�ˑ������j�폚�������)��Q�)�,��1B{)��D7]Z�+c~q��b�I�k��Dz|��AN�ElEV)w
��&LDŽ&Q'�SYأ(WR���<a�8�.��ͧ�B	�i\m��� Ïij(��6o�D��]��,
c�Qٺ��w���؏�.7�R�dL�0��h6��?�m����HP�&�������[Ww�����"P��[�b�Q���`��a�R�����fm�숣>I(��oxA[��i��ɩA.��cjs���aUk�YϯUo>%��H֥����1X��%�.`vɯ_��2|%�p��O���](�J9��D���m�����;�30��и1\��X��x��Z+`�����#���y��ǜ���^��J��x�Vo���k���pL�	�j�]���:�)���G�ӧO�*���Sž��~*5Ҵ�g*Q?����x�}�}�`��?k���ii���/oW�C��O��$QQr��
�]�t%ѓ
u��~�и'��w����V��/�>�]���g-�lm��
����?�#���OA�e��Sl�b�oᐉ�k'5S��Z��L�G������z�?�F��'��Q�E~8b37��4�'��-V;zxQ��#G�3�f=����F`��nh��.����v	9�i�~
�P��V���*m�w���3Ć!׎k�,8����� "��
��o���QK/^��[O���H&nNl,t�c�6�m�==��{��fQZ��?k��9H��kFG��lZ{$vq�a��iT�(��1�U��#W���]?�%�������i�V���Vg���f�^��:勵�{��_�/�V�i�n��H�8�s���!�ɕ��d4�?���r�M)ZT2����o,-�P�n����s�g�X��s�m_����=��W�>]k*�w�t���7��MA����O�t�䗏��81��H�E�
��"��*��q˦�����������f��_mr����e�:M�S��HMo�p��}�Wo����ç_~�����_�����W��I�^mg�ʁ�"C��fVe�E�d:sS�O߷9O���~��ܿ�@��%{��_�pVQ��;M�h�K���8���.��Ia�ܴ�[Y*8�M�u>]}�}IgC�CLü?[��˽dHC�a�^YPC�Ĵ�Ѧ�\�=��5��I�m̓�� ��WD���5�f�E���u��Y�]���+Sfi1R�g���A�g�x��\G!%�Lƻ-x.��>;d^��
���[�ϧa�=���1�߾X��S�`�Lט�JS�6I@�aӷ����xnL��]�Di�Կ��ȱ;����p4Ի�~����_���?�?u>u�_�šX!d뉪�LCrgjD��^RHC��rC�����ƒ�|���&|US�#w��;�&I_;�9��M'b9	x��c�)��ߊx߼`ҡH|� �;aǺ�<�zP�N?�ǟ�L�����<���{�Rbo���_P����&_�0bl�nث�or�W:5�4���㿮����N��5��u�Cv���`�0��11d������`&��@l�Z���N>Y����?)qh�\x��L�ƒ�8�%��1�O�o�}���6zC�+�����*�>H״!s3���v��g}�Q0,;���r�l���Wͦ��o�ܡ�ϻ����!J\9��6��ps৚ gp�O�8
�,^�5��҈�,�
'�r�ږـ1r��|�\�q�M�8�4*1��Z�;;i�#��:���9�5yJ^��B@c:������-��ԛ��#3����_��n��c�a@f0l0j��Щ��К��x����	�D�йO�I�K}|(��'��_Q��D��`�&�7�I&s�e��j�z 	�V���3��Y�ߒ�+�z��O@z	_i8xB�e���Xk���I���YJ�0W/��
-P�FkL��߉����g�=�`l @�)���"�q}®���6�hN�A�vH�3h�����H��q�'�'J2�D��F�lju���=t���1��`g���eoI�F_P�#%��ǘ�6sG��/+(�$״{ts�W���g�\��Ä[��Qb��f~W&�s���`��-��ɰ�[�%�,!��hQ�"�恀�Gԥ8i���O�ޠx�O�1����<8�-`'����֞�OĄ~�_UϜ0��G��\~B,f=�L?��t�(ҧ��K��VM�U{I�����)���Z�_�c[�+k<Dq����D��6��i�vPKE�j�(Irj�J��T��o�z"�l@�s0�!�Yb0`��Մ��2�B@����Q"?���}�,|}	/��bE����\e�f�|�������Bm�X���>�=b���0��ӧO�_�Y�ήG3�+d���|�+�g0��}�"im�{\��d�
ͻ}�U��fݫ�I�2��Ud�_����7��ZP����!-��g�¾�G�Spх�D����O{��M��y����o?>m��'�ǟ�K����_�����?��m6�oA�\6�ci�[��G�����x��UK{�¯�OĬ�z���7�k�}
$3���j!����L���Z���#�H7^F���2"�O*��[���:��OD�D��>��(�6��t��:
�rʗ�j p�d1���[ƻ��O�ɧ�_Q+5Is�•r�',6-�#�����4B>��Íeh%PkYᇡ;�?i3p>',+H�[���	3�[2L�CJ�*�P�g���Ip�{0�5�����$Y�Ҁ{��Byj�D�k���hnk�>�j�-����%Fd���d���4I�>p����Bb!�"���w]gkp
��T(D]�Q��.�2Ě1]a�&
�L /��0����%4��Ua@~l��*mz�/Ԭ�d�Q��1>T�G��t&;1��\��0�=ч:�D>��-X�֬���Ȁd�-��#g�:^�N���!�p������xd�-�P@<�GkZ%J
�'�K�%���5�D����F�B��
�N���$��?��U���e}�M�����۞��@��v��ه���8����H�<晰d�M��<E��Y��3GZ�OOH�X7���X�aM�S+k��ႌJXb����A/�!*N S%�b+?�s7'�ݸ�
V�I�ڋ`m�|�~w�5��0�O�+�K��*4������G��I�-�8��,n5-%��iWhr��B�o�E4N�JiJݾB��@{Y3���,���:d�n�WUw4�$�K��Ka��47�p�/��+0�����/4���8�YH��ހ��x7�&�C�y�MV�1���@(
�}a�������g_�m��b�/f+��}�tmrK2��n!܎0�H��EY��8�
�?K�r_.�hI�;ƬO��`DSi�@��
�/DɅ�m�/�5�ϓ/<�
��=2cܵF�D��ƶ�5s3���cI��n����($gb��>�|j��-���8���_[v�2�H{U�~���8�۟��I�b8�U�')#�8z��_���D�DhHCĚqh���M.1C�eMك��?�r���o��3�7e~��e�`/ip�'H��#�A����������%;�hT�@i�Qg��	���_��������5�S�f9��!�{���5�F�n�_�����c��:S4\}C���tR���r.g����S�P�s�Ғ>5�aj[�Ƶ�J/�S怱m��A�_#`���6r�Ӻx����5����$�?��n��q�X��0��{�\ ������K�'�rL�5~��ٵ��)���L�d�����d�'��}iì�e�.hd�-$q6o����S�6t��-n�T�6�2K��ޖҋxq�X<�	�Q�u�Z�#�y��ҏ�p`؃�x�+:"�^ǧ���?�ž-^h�Xf�62�)gjgwq�1C,$™b�b%+HiW&5�iE��4�8R݁\�~=~p5bP}KJ�x�}�j�%���O�+���S�y>z+$�ܲ�����}Y*d��t�d��:t�8�A���L7��T�"���G��
��w�����x��8q�@�3���2�ޑN�G�BW��B�u��d�������UTG��ruDѽH�p�Zӱ~�#u	�X�����k�pqDa�:�(^G�}�'�>ud%}��+c�d���	^�,Y�yI.���9'a�֧������_�iY���M�^�|�ߔ$k�l���}�;޸��,�;6�	�o������'�yf6�v��N|�`jZ��2�t�-��3
	^��G�����FY���>ޓ#5�g�}~�"��m�#�f�d����D!BpF�t�?�Q���[A|ò�\"e\���F�Qe4=�~6���#ӆ��X�7�w�9�e��US���2`�U,��=�Yg�#��yi��>�=�y�����A⯛
s��f�CȃT*�D3nq*V�����xf�]�$���Җ�qV����okdWm#��	��X���m�іV���ZC�-@����"S�̣�A�/��O^���e�pȣ9����Sׇw��LV@� �8˚��a��%i��.��JgE+AyJ;�Z��K�Y�iCy�k�
'�Pơ��*���ی�&���E8��� �ae#U0�����l:oK25
"h��@'���Ҁ�e�A�reof��@XW&�z�]de�qX���s?d�QLYK慝�	6
}��Q��1r��m$O����qO�-��?�c�l�`jL˞���Y�b�����j�O�i�j����&�uo�C���g!���u�
��j}H��&Y��S���
8�c���;�Ih�~׷
���rpZ@*���q�C�=���ZC�W��HXaM��m|HI�@�_?��"�>��ݷY̰�n���Ŏ��n�z�+H��4�b�bA�6�ך��O2'8>3�ZH�5��2��c��o
����z�=��N�W�#�&���3�2�?���ʠ��_�`�$p*����X���,7Y6���< 7�i�J*bu�N��
������x��Z@�]��ɮ@4�iF8$�x�Z�K�ϯ-ٜ��0yў���>�o{A�JCBW�FQ�¨v��93�}�� k�����T/<�����(�-�鸹��|�Y=�b�:�ITSVȦ�`B�DgY5D�G�
���hD1�MD=�l�<%%ۤ>�E	K�Ns���)�C�9i�Y6_�����;��̯�ro��і�Į�P�cQ�:�C�mn��F�9lV��i0�i�H�S(JEnժ'�q�,���	��E�*�x9B�L�c��k'��}ImIr�$ȃC�ٗ�+��RI@�o�誀sݶ�����E^��U������.��W|�J��.�*5[R>['eTk}V_�u�����[|�6�89jMؔ�������N
���Z��U�1N��d�����}�{�G�ЏB��/�m��!�]$],Lӻ��"�Z�x!�Zv+LU
�8)�'M��
j<�G���b/֯du9�,���|a6؏��r�	��4�>��Қa�\��z.��闟v�#kA��19�wxhC&�=�7�֎o�&���ޭR:�T.�g�%��%�;�%�����!�����.��}���j��yj<�R�gt�x��gu�m�����?�l�CH�?�d���'�������`ݳܿ��0�0��f��Ӛ�"�����^�0L~/�NɫO��[�c��<�!��_ˬa��)Gp�C,�Қ�ʚ"�\���4O��J�W:�@�.��sz[*_{��"܇��k��~˾��ا�'B���n-����&��.;դD���m��Ԩ �5�������\�6q�g��<k7~2`�)n(.sd_�1��V(s:���4��a��4�,�YaTGà����P6���Ga`�wU�E�c������E�׊�����u�b�J���8���x+Cݗٌ3��z�h���7֊K�?X��4�U��x��k�tЂ�g�闿�x-�p���A@ӏ?UV����I��qW�7��# ��,$L�"s6�9IA~���;SE��4�p|l����҇�L�-��W�-$��O.�u�|o#�맻�%������������o�$��G(�*��:Z�c3���1+
š��P#I�e�(���*�����_�rҪ��}�2�Ԡ�[�b��8�&�UjvƤ����`���Z��� #�:Tu�Q� ����i�񾑅��W�KnoJ����p��'7�wyC܆[h�,ox�N���}�p������rس}:��|QT�o�
�ԅq�����@D��" ��+}Ц��4$(͆�b�0���e ����9�>)"K��
�<��4��w�Iz���N
G����U4GM��=U>�æ8�H�»=����o4H�=���Mvq������s[[��� jA��	D�&/p������,�ʣ��j�����[H7?B���{^�aJom��4�[�W��r���L�c+P7nL˦��x�Һ�h�uD,h���r�w[e�42U��#Ӻ�����3�tD�:��M�-5Ыf4ty�]�q�i��E��
U̅|�"Ǝ��.t5������ߚ��1��
��l_	��$x˥i
W���.�?}��W��c�.W&{�"VF,�p�'�aD����t�Yh[ylC��W k'�S}�7]���᰷���$����E��8q���;ݖը�(�ʃ�yiC�Z��z�G�Y�u5���� �gbj?j�c��c���OpƁ뱖�ғ;@Ɔ�yNT��M�f��*�|=�=�c��Ux^�EX�/#l�Z&L��φ*c�aun���>�.�W�s^�W.S���?L�3'����S��U�F�h9��܌��Z9t�bD4�C	��S'�ʁcE�Y�Zdd�B��q
9�a�����W�,�Si�yl�yi�+�R'��5t�(�s<�XϚ`�Mt�_,�PB}�G]*�ZB�;�4
��5�#��95����nC����%��m51���jN\�~\
.��h�O�e�����@i�u�X��ϫ��o�v?UcJ�<_�F#ݞ��ck0��fţ�V�]�rXΒ��~n���s�g�iH����	�T���5��+\>;���/m~��Y��sTs�W��
���Y�s���{�Ƽ6���	���˵]�
Ϥ���w�ۦut_���%\-?�l6[l�"�fJqfL&3�X��VK���k� )�%T�|�Y֞���U�K�_,/s�M���}��9�g��*�{v������3��y���h�6Gl��
>��*6+
�iN(�Z(Ӽ��Q2�}[�~`�p)��P��5C)n��>�wꐧá������1���EisfKg��
��=�cC늇����qj	f�#w&&w& G�1g>sG�<Jm1�6�+�,����N��N�z����]��i���t�SJkb8԰-��=FKyC��������+JWDjJLf��K�
���iuD�l}0+5�?F�'&ĕz(��s�%�*|>z��h��֬�z�u��[q��hdWѶ0hS�Q�;�dO��w�J̄<j���#K��58H�N�.�ߏzj���m߆g"����:���}U�����,r��Ez��0�c}$	)���gW{{�`K� ����_��5n�
�;��۲�;���z�Y�]z�zz]Yz=zg��z������;��w�@޹,�z���.d�]*л��w)K�J�^�F-��h;h�]�k�=�z0�����c����J�+>�P�(�4f�����}�'�"��g�V��xi�^<�(���8�[c���p�*�y	��B��l�� �Ò�H��]������<��]�y!�q=ў�U�$�S�;�{�����f� p,�J��߭k�w{�u�����Q���Ңs��l��/5��uG�,f�n��cF�,�@ӡ;}W�o��7��V[t够p	������s���Bb���қ�1B]1��!kR��#u!&u!C��zkպ���!}k�Rv�ї^t�a?�L�R�����XO����߈��JL�J�V�q���m�wnK�����\<�s*����9�j	��u�Sr9�����X��uK��:b���Q)Es#%��NOL�,z��x�:1��Q2<b��9� �@1��w�����O�ċԕX$�H,�	��Z^����Ü\%yJ�+�Cݮ��5�Q񺴅�R�w��X��B!������<�\
�ĸ-ޛ�31�a�m���ȴo�O�X��b����xUڢUq�}s�;��;p�b��r�튗�+Xk�:�Pn~��u����忌���\[0s��E�tM#V��2��F�l��Rt�T<m�inԎج�\IQ�U1�v=vU���T{��^A齣kIxU��b�B"L��l)�����P;��p1�­AQ�<q���CA�xGSf�v+YH�8>���(K&\B^#m<�jg�c<�Yo�㑉=aF
���t�m^��G�t��#��g�q��;+iǡi�����(�t~ie�p��2�!�(�u��9�M���5�tE%�M�&��9���[�b��Y��Bzo��
��>�,{R��VY���
]D�,�}�2<�FѺ8S�(��6�.t����%�K�
�6��<���2���Z�ԾX�����I�8:<B���h�%����_�̄�r�ES|q�ɐ���辉aZZ!(6�x���I�S18���9��l:w�!rg=���B��QX'zq@㙄��BHO����s)�#�iŦ���d�~�p�����NVJG�F|is������P��vG@AbQ��vW@��% v״�Z'�6�c�H���}&CFx��=Cm��[���@_<�ܽ_�<��K>)"��h��ٔ7k�����	Yc:.��{�:ܭ_RUdȘ��نb�v�\����{�;:LsH�s)"1����+
�����e|@G�:�
��`�c:m~������ϭ���
���;�{Y�' a[G=��:����I���r{/����(]�6�^JR�MD�+R����Z�8��oLݮ)�����ۓ�"�;ͻg2tx�ؿ�=��!6��/�]�C�L+�q.bB��k�iNʮ���1i���_��X?x�}Q�0���j�[Г[�e�	�M�OUgG
�-�����\9��3G���q��eG���z&gj�t���8�ᣏ}�J�;o%����{
Q�o�y�E<�-��m��7��?%�-u�QB�y�P��V��Q�E[�Ru�6Fc�a���]o�~�m[�1m��)/��W'Lx�����&�8&@�����Ͻ��{ý�f�����{\�`��Rv.2�ϻ\J�}vR�XQV}(����n�P1L�}Z�,mw%��S���.�*�H����0�/iE���/�rM�Cj�q	�lȨ
�ŪwƧe}P��{@�R$�]2���{ˮ'w%ՕԨ�N��J����+.y��LI�$�����;BE
�3g�)��@W����<`ߌ�'ҙ
=��	]<�E���~�Mtq�'����@a����!(��ԿL���š'ҤD��xЙ)Q<��%���r�1���S_=A��t�Y
��]��D�UK�˷侍^���RB��Ck���gN�s;Wr��}�����J��ԕ���eM��M4�K��H�q��{!IJxCi�����á�y8}"��R��m
t�~m���-�&�m�?�o~x.�4�_�q7i�}�����S_��E�͏hEE�#����[Y�@"Q�<�I�e�R��/;"b,lF�b��s�zA�1)�p����%���t�J��0��F�_��:�fy_�f�;c�:���̧��5��)����,^"�P��������\��!����-˥Ժ����tι��]��}%�w,c��1c9����ړ�%:�{"=��ꁱ�έ��
�?$t�8$Alѽ��Dt�\pOrK��#�B\�¹�Թ��=�Ӷ0���j�)A衜gA3"GI�S�\�ъBa8�����kY��[�S��UO��KGt.�s�g���[7\ti,����н+ibB�)Z�ޥ-�[��!�:�1���ԗv�+��X��R�9�zш.�ŮD'�UO�}�O,��E�7�g5(�0�˝!��.��t,�FB{�v�9wNu�h�/�4�Oa�z�%E�0]QZ�0�Ӗ"%�^	K���}����鉉H�SE����$SC�\���	2�Et��qo0��5M3ٮ"Y��ʚ�;�}��M� ���+��Zײ%����ǝ8L-AE$k�\Y+�p��A.D���O�f�T�`l9<�h��=IBBϰ��kV�}���`�w��s'���s!!�p!t�p�
�}"m��ta.R�O(�{\���ݶ�;]�:A���n]�	���y���8������;�5�嚃3��F�Ѹ��"��k�@}�	8�^m�'��Q�)ȥH�]r[*�bm�fQ�[W���fΕH\q�@��1�s~�(���~ֻ�G��I�6rn azʅ,-�#H�sS?�Sr!���I���m����m�p���֬��+��1V�*[�G�}]
���l��,]w+�z��
�������G�ݤ��猿IV�����/ߕ��gd�82y������mM��zr�t�
õ�ݼ�c����nŧ����5��&�o��ճ�!*�n�i�Х-z��A�5�{u
1��}��/�B�$	����&�������h�$�0ы�!3�H1�q�I��V�Ai+V�J[@�����;�z�a����X�;ZC��A���J�p��n���Ѿ�l�1!FC{�6�+���	[�oD-���s`I��א76�]�K�Z�x��\b��x�u�g�CC�2N��l���
k�-�	NPx�wmzK�M9��K^\��+�5�5�$DJ��(%�Ch���̕
���n���X@�NAz���v��I���~C ���J�\ڭ�e��6�*��F� �.���T�;_C�W��G�&S��t���"��qJ�v�<�;S��h�3R~�)�;� pI��R�׶�;9�K
�z�J+�ں.�xH�=e�����SB�~S���{�S�'��po� 莄QB~���W�e���ꆝ���feD�}�V.�����#�*3��E�k�����A�S�#34�@�7��מ�p���ǷxU/6�t�8^ʎ�I�Ӈ�S�n�7�{�l�;!u8���̴/EF��P����b���x�o"p�(D��%�S�d�Z�� �Ԛ�>��`ׯ9%�l0�uQ���zP����焩
%�^��ΔS����q��0B2��Q�)@��sc�C+�w��
pe�́���o�����q�����QU�۾9s���Xc�s4%�E�d�b2m�{�����
.J��&`�&`y�~�8#�J�������ğ�8W#`�����x�}&�8���S���;�`N)oJ`8�
�ha�/��GddZ��,�̹��9��M�0y��OV�K`l�	���8�>H\��#���!t�'/�W�>ǩrN)���c9E���TygQ[\ͼ�)gNipk%�ŵ�ۜ�─e��>�9�q����+�C"��ϼ��T����ք��J����^��o����9�ʁ�Xu[\��ͩTN	\��&.�©S�
sj[76��xT�j���S�~l�k��9E���>� ��/��j
��C[\��ͩIN�;��y;Y,Fgm>���]�Fjs5�dd�yF�8��S�&O�C�9%�)��1��CG�-:\mּkY��qY�6�.5%3��<��YO��z�f��@}^��ٙXk�q��)���X�u��)w<�t�#�xn����v�SY;%�xĚ�sƧ0�]G��:�|�gtĪ�s�'�L�S$VM�K�/��#VM�+>����b��m	(��i���ۜ
�)
���ҙxg�a��"ob����?Kb��嫌���k�.WcLu��ۺb}��ꋩ��-��E��.�y�% V]����o3w�ڢ���h��ڢ����=�{�M��n2ט�{یw��ĺ������'��=�6�gw�Ļ���M��B�xM��{�@w�(��R���LkN�o�oۥ�)<g����bO�<��ڨ>��l��+N����J?����T<tҷ�c��	���������l����5(]�+�:J���$i�c#o�Z�y��Sy<�N�b{�B����׎"FG�PuG��+�7�(��0ö��R����S�"N)���H�J�(�e�%b#;�	m������ �P�빚Fr*_ӰY'�?����%I<���X`}P�aSa�R��Fj��H8���rHC��
�E�浦�	�
�U^��f��C@2�KK��d��ϫdQhT, �ݯ��+?�8\�4�MnP�9,�qT�^)-�*d�g!у՝�R�)��][���y�r�ݬmX��܈��W�P�(C}�g貝�ڣ�6{-�騎�'A��$�?k���W^��IXJ,�qcZv�)M;�5�TSpq('�Tvo�{'�3��Đ�|>�Oa��&�h�N��2'�}�s����;|����rm�
���� �
�m�F=���&_ݤ�K��ڋ�:i�N�A}T��a:���G��0�$hd���)i�7��:5!�n"Ų��h)(�/&[���)VJ�s�����q�E��2�JHiq_CwT�QZ�9_W���[Wet��n�R�/���"9���qC�e�筪��W��T�Z�$���gml�X#�!�K�-ѦΝA�+��M�'u�{~v̽[f��[oA���Z1�p�� @|�,XvC��C�er@ݫ�d��Ջ����k@lCr*<��XD^��O�{�#0�`oPt�Z��'��
�(��q��K��C�å�9�YZ�O�n�P39�d�B�`=H�wQ�-�L��>�f)�E|•���,>Ke�`�pI��n�,��N�s)��2ˆa�Ntg���%�� a�?����:xk��oZW�#Xen��MjN�I_��\.��JX�>\��u�w�
����w�=�/C��o���e�@�ϯ�^�k�(��\����:E�9;.�:�F����|e:AD���@�1����O���+#�Q�{�+�@�l�#G&6���ˀ��^�.b�ޱ 8���>�<�YD�h�U�bz[�m�V*��m%B��^;�VO��Ga�,������W�[��AD�b�UO���0Ӓ9���V�'L�����}�7~�4߼��E7�RB��z��-׾��m��_�6K�h�M�	�6��<+5\�u!b��h;zU$h?�?��;�nK��3!N����ӻ<�8W���0��I�)+�O�Z|>���Ol��{G$[�!X�v�U&%;sn9�Pa
Q��s�C��8zݖv�� Xw��B٧�T4b��bg<g.:�	�v�L�E�%;�IAL3{d%8�*��‹�x4դ�
��bJ�Q*��=��ȅ��̉����TԌ��n��󇞴rZ
���d�""Y�Y�l�&ѷ�2�[�E$�����uD{�)1vEЈJ�b��/�Cf�}\G�# ]G9�W��Se���y�U�XʹO��Hw
��˦������w��b>H�������_5G~��f�	�>�J��*��D�K=߉���J�?kH�Z�����	~>�ƨ�C�n��;gu�O��Qq�	b�™�
gߛbn�4I�O�O�1nLcd��;��5܃ȇ�h;Wp�ܳ���o���*G�]y%nXY�����0�{g�a'Yը���ߪ���@����w��_�yd�TO�ao7�^�Ṷ��/�W�tj���;p��y�%Q�:���	�[��W�?
ɷ|0A'��m�7�1\6#���q֌X�p���l��hU�w�
�Ϧ���p����f��$�۬{��mvv
���j7�AwZ�]��g�.�1�����	ho|��p�ieJ�v�:'�Ph�|0��S�x��n��D���vS�i���u�@��Ҹ?�̕���:.TU8��m��w�u['���vW'���b
u]�.��ͫ�<d�^���)z���i����O&��m��5%ฅ8�*��عr�i��@(��pC������i�����8GV3�3wY������
�}�NR�+D
7����oU���sP/nǨ�.�
���zS�KzqJVɕ��c���V듷*���}mN��
-��xjI���I���ƅ��c�����(���e���\L�\��p�.Ą.��l��J������h�V_����\�'�U_���fHqh�Jg��D+�A�j��m��B�`�X[��2��F�"zb����eR�7��"5�w<�W`k�W`�T�g.	�נj�/�h	�D���R��y��x����Y3(����W+#$�F���>S ��h�븵��br`i˜f�:_��ʌ�`���8���`0�-�GK��:]9Z"!+�NO��ΠX;	�c�yc�GJ,}��=�Ę�ʩs!CH|��Kk�:�R�fcט��U�Z�+ZR�P\q��h´gt?�'d��[�n[���f6�dsK\Ū��Jу0	�T\����k*ּr��GC��uH�'��7�(�Zb���ԯ%#�b%�=��%�"�:[��%���ju/�h��]J�<FL�G�Wb�L�R+�����5�-U!�F\���㫐42W(��\�^G��Xo�+[�z])Zb�(������Ѽ?��g��Z�3YR��hq1�V�\��PH��w!KL��7Sh�.��]�^ͣ'�#�+)z�&e햸hf�%E��K>FI�B�*$U�Tc��5�_�H�<�%�[g|�a�_ҵar�N�;���>�c�
RI\\ĝ$Zg|
b:J�zq���ٹA�z���5�_sо1{��GK�3�.%hɊ�Xe�]��-����?���$M:�T��H���y[���^8o��4=��?+��<5�=�;��9��ֹX���	�#`z�N��#+�+��b�T��.w�b�r~!G���{��X��_
)�ǘlC+��+%��^���EK��`�_���E[�"���(�7�EG��ԋɅx�_t�Ȏ�MrZb�y�S"h����X�\�)��[�b-sq�D��rr@P�l.��VN��/����R��hӋ��ŕ%��p)V2�-9z�-p)V.�m9J|9��ˎ!�^��ȥX��6��i~)�%�=E��_<�ber)V&��*x�x$���\�d�o$�+V+�b���ĉH����$�J��)�b���$%�#��J�%IKdA\���U[���Ƽ����$A�ʼ뗫�$)��p%�+W=Ij�y%�&Wg��D�+���*���u�_w�������RL�ˀ�(|%�WWB*r~���c�DHL��h�#IۂH�Ի0�Y#mq�e[o)�2i��pۂ0\������ ٶ H6�+z|h�cdۂY�ӫ-[m�V���-�[m�Vi���0����V�bJ�bJ�}g.h������4�G<{�Ƕ �1+1YD��H�7� 6��Umqdl[�����h��cۂ�،���-�mc���qtmq�c[�Qǜ���mA���6�U�9 $���X �޿v��@8�
C�K�]�l��mA�-�#�|��޶���/�#:��A�mAP*�i�#!��Q��;�[wR�S{���:�r���0Z� ��[M+No�d$��Q�'^�d�#�p�6�HD|p۷ŦhOl���-7Jhdٓ�[7ʶh�k/�Bw�v�pI�����K�xTs�Rĥ.�A�Wj�[Z��V�qKN�Tj��#^���LU9�F���P������'��.�3���H;�hk��_@yw-ڭ|>�������TO|��_�(�{
l7����SKŝ�0߄��q�u�7�/A���ry��r键U)J�<��'�����0�l[��%]�g���h��i�%-�)2*/�j삣�
DolZщŗp]���y�ٝ���b�]!���J^�W�R�޼á(|��r��r�*�C���#��z��uF����U5�(%;=����t�y<&w�����w��.�9^$7pi��9t��y�CQ���D��R��ΥXX�Pj)�O�R�7�lIͪ�{�6����<�p'�+^�nC�7��4�.'ͣB���]��"	j��n#h������g�?R�^iwQT�c퉩����W�$�rC94�"Y:�=G��α�j_��
�Y�ۗH������.��NI�ǣ+�Q�6����XOu�_Ku�Z��E�Pk�NG�+���꜡��wnG�1:H���5d�I��sŚ�s���ݹbMչB���ܮXSu�4U��D/�<�:O�٥:I�����
C�O�\<��-Y��9���s��\\ۜ�8��ⲣL�ã(vw\v�)vyŗ�˞2��♘�2�3�s1E�޽��s��+Nr�r�\rr�.+	��p;By"
a!Q���g\�_���;1-���L��?���B��x������y�j���jF�gC\�m��F���8��⪅'�ӏ�0ԋ�6�t�+r�Ë��&Ĺ�.����&Ĺ�.��+��CJ�ҋ��dj���m�Ky�[�L�39��>q�Q���s�"������E�%a]�y�'�T��T	�4cO|�띫�]�zbU�S�R�}�'���.U	���/6=���:-X%�bE׺S������L�xut.ı��+I�����T�x�]H����<�P�]΅[��I�3q��E[h���_�]����^�NR���M$k]��H/�O')U�O����◓���4Uq���EK����xU/īZi�q�(�o�W4\�;����̪�	��8�5/��B��tq%��̇���h�j/��9�#�E�D�0Ǵ�y���[����8�ⲥDp���􋋞,�k�*v>?������ts6��[��͌5x��g��9�DLh���/��[c��P��GP��қab�b�b�G�v��S��3���^���/:�{����W�Z�%�W�ɍ���+.E�m�7�En$���u!܏Y�3�[e����H�Z
�6�J���8 �B�
L�XOو�[]�I��u�'^�R_�ߙ	�[X9�^ĵ�.��c������D�f�5ԉaE���ƀ�
�����5���y@,�Bɲ^x�b��ٹ��Q�3�7T�\��|����6��zU��wٞ8x��U'�u��Ϝ�p����ת�~�&�h�;.�E�.�{j��..ĕ�.ı�{�����R|�W�=A��&�8h`O�H���b�9W��)��x!�N�,Za�ㅸ��ť49	Z<����mՅ	z�r��c���$�Lw���g9='sK�T�w9�������2�]N�z4�������g24�[����R�'MOr���+��[Z�����0F���q����Wgm5r<��Ll@�u���`���w�U%��XH�zjyφg�=(~k.�cO5\��Xh.��\��Xt.:����\H����#V��2t��f�D(��o�R�� �J�.ҽR#ǽ��/
9n��x'�v��q�+���m]v�)���Z켧D�,Vb�g
Ը��;�\��f�5�����R�Z��&�>\�)Q����+�uc�Ǽ3U�AΤ4+���j�Yv��o�%�%5����*b�uٖ��X�;��*�Փ$��!NM~b�j�%%���q��G�$�Dx��%^�V[� ��k�O�VG� ��m�����63Af&��Z���S�Ӽ%V��G�U�5���\��
/-��&�_s\�(˶Xӊ���T���D'ּ�׹"ߞ����䦲+�m����+��}�W=1ѴL�x,|��$�g��/�˚���?�8?�X�*�������e �~wq���W�HV<P�kZ\<#�HOm�v�+��JKnZ&W8H�E+vh�lBm�����X���RqⶦbOu^��vQk��4�<mAHV���Ҫ��~�H�;�^�Zj$�F���'�O�L8H��I��.(�)V�=i����{J]�K�S��+���dv��,�����K�5oOZ��]�*�B��5 ��������I�y�˧���E�B���-�X���<��#&*ޝ=�����tS�d���8����**+I��gm5�R��W�ř��h#q�ڋ3im�.O��u���o����2LwL(�[�+N�WP����`,$zv*��gc*�q�{pu[�R���[���%��=��j�Dj}{�G��Nz����r%�*܂ݛ���_{��I�h��}!�R�\�՝�r�O$��Q8k@���UK��CP"��$�_���ɔhj)��3u�ŕX�6��/���SF�	��c�Oǫ��E�f�Z��B4�٥`�z,	bE���k�︋F$�{���J�mϋe��=��,����M�n��d�' ��!<2��d��[�i_4$N0Ry4�Dp�a���nC:Մ��iJ����Cx�h*_G�h\6�A�I%��L�4d*�wȜ5%��2޺4��à�*���Yh��u�C��D,��6&��x�ΛS:h$R�q՜�i�����H:�ɰ{��	��Z�Ɲ�S-��T�~�*���n�vGӳ
���>ܸ�:��W��7%po[�`M����oMЏ�־�S�=����bS}给s�V���~�!�o7_�-D���,�]�����-G��F����«@=�^#�WJ�>0L��6����b!��y3��H��ll�m���S��=A�@���aJ/2��ĵ>�Λˆ�;���u��D���:L��PB`�Q����_���T�}��$��7����s[�b��-�����_�k��}I����fr��}6�:����k�=\��R@l39��!	��vv7�;���뵄���'�l������ϭ�;���FUu�D��3�Kq���J�z��bmw�$�<�q���G�\�K��c�R��o�-t�$�-�]���h�YHr42�/O%�:g�Y��ҏQ�MB��1,+�֑�D/ڞ�K[��o�kIF~����E����?�6���0J$�����>�Ւ�G�%;o��E��&z�����c>廚'�jOGqm�KQm���g�R���wG�ʪ�ĵ/E��h��b�Kq������\GL��F���S\�RT�J��#���I��q���^^HQIC�EI��x/��;\����^A�'����^A�'����fnyr*���KP��h��{�A�/E�B���\-'����T���RL�R��n��4�4y3+��~yђ�9�}J�EV�r$�z��!���+��v�9C��i%q�ˎԾѹ����w&K����#�I�����I��yR�sR��{�*ĸ�(��+YbܖU��,�˳�<)ި�Y
�gmyR�}%Nd�<�Ȓ:�7��g2\�uU�q'Q�!�z��B/nwuyv�BL@N�;����	�5�م*A�ꉵș�9�k�3i
r��N��\N�:,�P�'�^����}���dv�&s1�d�C��p!]q6�eWJZ��g�w���.��{+�x��R�7�?���jQ����K�\�*M+��*V�ݞ$U���}]��ob�
�+>*�g�T�W|�v��Te�Wl�t���i߅�n1A���Ji�r�cY�#�	])� vz���L��R+��Ҕ��P\�s�D�{���"K��ͣ�օ����h
ά��H4A*VlB�v$���i@|>�[2th���4������P��$�M�/�B})��u)nVs�9�\s0�ܵ�s'lH��E�})�s,�怔�bh�$IU�H�Uo[�z�&�T)�[�^���G4׌��W4Z�%^��p}���P� �Jwip�w��=b&>w��Ԫ�=#@�J�Α��!���vG��A��!��2c:��s0}b���J���74�l	��6-瀚x�Z�u����������9�X_���f�l@$�B��&��t��ξ�B�:���r��bE]���Nib<�CD1$%��+=�g\��PZ�q��Y.�*Q!RW}���QyZ�0�Ӣ=ƵDF�Pv��4E.�.T�*U"�ܧϭD��E3je���f�_H��U3BEw��ncr��M�\�19�l7�Ȣ�Rfh���f����g���R'�̨ΛQ*x'e���Q�M�K=�y�.��X���8�DA˜�4����d)�&�>;
�RUn��5�0u�T���ݜuJ���1���`�-��K$ɳ�܈��Ӏ6����R��WS!W��R�L�LV\STA�P�[�pQ�!�}�I�1�?�_0��2�LUJ3�m�J�V�4.8U��UhHg
����Ӿ��j���)Te��T!��DF�i��`o��D��u3��e�1���ؘb����9��^�*_���y�C��ۭ�_��7����|/�5o�yI�;�M���Y#�����&�Wo��i��@7Z���q�m��~�doѓ���S��h`�C�%H�x�-�;�Dbd�k�n�	ɶOK�֧��=��j�Tk+^����P��L"�CݞO,��0��RKg"]K?:�9\"I6�����,�գ�6G_�G>$�iL�0
�(�dWH�N@�թ�$�2��d����
�3	b&�D&��]]�i%�lں�꜇鮰��D�έ����ړ�↎c3wt�C���%23�C1��^.,|�^GL��A�o�}�?�n�S��ʕhLW]6��''\J��_������	�J]quɣ`BG��l������?ڦ$
�� z徺c'�1�W�Ru�Ȯ��@�}��`���w��-�)����k�q��EG����\Փ1��y�Z�#3[��}yD��]�s�
�=�W�)"��i�:tg����Y)DSt��Cx�Bh��f��/�:U�1��#wZ�Ju��FuA;ʸj�j�ΖA.�wuȮ����VQu��c]^�]=ԭ��8�M�n���}��I����"��l�o�P�":��w��,��t�=��w1����k1��>i�j.<�Mkq�W>ek�Ngnݴ(���W�v��m��֠RU	�>P��L�
QWuK��g��C����OK��qv�BE��0���{Q��U���@c��f&Ѩ�Zl���Rb��TEvon��ꙇ��es��@v|�m�+#s���V��ب�RSX�l���3c<���ƘwC;���Ć���Y�2��PW�:��<�S���Q7F�.�1������>\"�����𛿔�M/�����D�ny���nGHs�g��P�y^��&�L<�g�D��D��ݿ�K���;'���'�䴈rq/�dyē�O�O�y��֓ �f�۾��x"[≜�ƮoO���sq��y}�RNʹr��L<����[n?�s����C�ә�mG�^9�S�[�#�z�w{4�����UK��tѓ�3�(��:��<���K�B�Z��x���%�wy�w�t��sqr�y}rfN��] ��9ow�hٺ��d<gf��gfR�.���g�
����f���fJ�^;a���TI�o��pbI�p$������}��%�Ñ�)8��+��P[��Kv��r���:���9qI:Ɵt���\W��5��9�|�%G����+_,��b�<�#�ϩ�-�N[ -}b�_�c���YM)�3�,�=�Z�1�Cx>��x,&(Ȗ@ g&�PӺӺт��Ƒ� ^�+�]�л#�Rc�#J�LDq�ŷd>��P��[Uf���b���%��|F�&�'��s��1:�oe��ԕx�]�!�Cl��ƺ/�o�ܴ��ܺ�O}�:<J]1�.��x��=K�����x��3�V 'V'G%��t�zD|�q�@(�^�K��VK�p�[�һ�m�%/G��S���E�ՋgQ�����rL�NJ���F�}M̎m_~O�q�����A�<b[��mc����(���<��.�e�]$ު�]��Bb�3�K�ϑ�K�s�_Ua[�a���6��1G-�2�g���C���6�If�G��#�Zq�֔���%�p��C�FJ;��9�
��ʸ�0#'�F��q)|�#Sn����؉��\��U�X{-��q��\W3�5���KE&�=�1�?�������Y)3�L��r�7ބ�k/q%�����#)2ǹ��W��3vK��ax͞��
�0
�0>h�p���e�x���a�_�ʢ�b���Ce���x�]|�~��R�/�z5�$ʰA4bː�I?�pĴ�\<
�xQ�$���f�§�_-S|��jn�D[�x��s���Y`�~��T�'^���s��`���_��ŏh���b[x�n��U��)��7K��3y��������/�C0�����6y?�ӈ	� �	m�Q�֦��TK�1i��)Ɩ,�"k�����;��6��׆���I:�p�'�_u��fl��؃���U���� ��}��3�k��͑IX���!DD��g�?�ͧN���g��_5�/&k���n�%��Y����Y{�~&�^��_����,��k�`��F0�1a��^~�4#ў�`Cxf�V�.�^_�
A�OX�~�������ӟ�ڏ�>��"H���;Kq��Dz��d�6a��"7K-H�e���]R$�������8�D�vµ�3�+:��%ؒG�tIF�[���K����i�=?�^���k-��54F�n��/��
F���Vs��و���
���D�f�22\�ٯ��D�6ޑ�İ��.	?�q{A�C@4�����#2@�2g�q
eHY���6Ꮝe�z+�����\���c�R�-�ɡ'r��n3�=���a[��h�N�V�P��s�m� yW8��?=�3��&�7d����VI�FS�~
��-�}gY�!�Sy稪ޓ_�|n�K�ZX�C�f��EfL�M=�$o	Q�3\"��_�0��N�=��69�OE8a�
" 8�OE8��:�`)s�8��[r�|�@����[�KFr��b��ވ�O��t��L�����l�U��<�%�L�><~&����+��C4&�%�7u��[BLcY �?��A,�Zp�O�a�j��bR���7�ʍ~d�+_r��@;/�+J6� iB���Et�R�^�]R�E��S���e�o���
�[,畷%W�4k	��-&�K�WH�m
YRp+��a����἟��
�1��׶Q��#r�;�r�����92W�a+��-!�y�ʼn+�,%��e!
:�������AhT`jf�KjĢ�����q7-��ձ����� $W��pq�0\T����@G@v���&.Z2q��0�;�HPzq.j�$�]Rk��=��D�"������|�r:�[7��fR3��◩sg�FkOڀL�W���):	-þ�{R5�mRU�ߗ:��	�+�*�~�d���j����
M�G��Z}�Ѽ�:�`��x���(���z��1di��ʥ���넹+ް��?�Q� �l�۫e5�+Ə���������G���6�2���ZT�k��<L"����^��$���U4ry�u+��,`�+�LX��ݥ��"����%"����+�<���4>�'��:�.	�p���Ѽ�G�<�U=7��k�!�‡dh�����>Qf��-*:�>��:}
Y��-!@�\��i���m���%���?������N�Lz.��G&$�?'�d��ؼ��z�$�V�ڱ�_��*��#(X����{z"�_*>�Q��a���d�s'�vG���H��H<ا:o‚5�8��ϣt@��(v\��b����
�`h�ڧ>������ԅ��#��-\X>~#�ik?y	��K'ð꧎����kk/}8"r0��^,}h�q�zt0<\	�X�8�=��K,ڽ��2�]�
�s��"�}X��f�RSb�7
CR���s^ƶ�y���K��y���P�[j��%x~��f�[q2^�G~�w6�7Q����H�����FI:��xV6��p�*��N6��>CC��("�!|�"���	pU婀\�/�n���C�9���(J3�`�<ό##�NU�� ���
^�*�4��lU�c�),��wj#�����%DG%���O�r�J-�h��<����6�P�#�e짡셒 ^�O�L�� �;�;9���؏2ew�Go�Bv�G�O�x��ѩ�atF����eΓ���JOI������^S�^KAF�>�v��G�K�X�X��̓�Xf�N���=y9�]�X6���p�vU�B��{�ą�\���57�&���->}����/�џYx���jx�%X�9��v&7t��_��/�9�6���򴃛ǧ�x����p�ee������;�O�"ꮃ��TO$G1�u���!�ц�����:��b�<:R��<�dR�ڏf޳/ah���ޞd�?�T�𳟘�(���l��c=��{�+��b�|Yy-�I�a^��'��"�%���Pk,�m��"��<��B�#���A�@|ك_����F�d(p5�=FfȨ����|Şyo���{�?؃8��ݑ&TEI쯞4��Y�E�^A%�Q����5c�-T���+���U�?����,�]ssL�k���E��M�A0��d(�O?��?�������]���ݏ�_~h��&L���'Բ�����+��
?|씾 ����q]B~(p�y�bv�=Շ��a;��B�J��WiCe�8�4����|�����Ҍ��r�f>�a�\$�dr��5��QQ�x&���齢6��lC�!͇l��X&Z���,㚃�6h�Ǹ1,��q���"��Q,�xf�E�v�
,(�K���%�6sn�AT7E�~����
s��6�k��J7��Wo+�_1��2�L���M"O�����Gu�=<io�`Ȝi
���`�X��P�|���t}�n˰�_zI��B����B��"uo9e�jS��5�'|k�|�w`͹��G����������Ř+[6����j�C�m9r�d�^��%�\��4rH��.�B^�V���G�X���8��t�B������Xj�$�t���1��^�=N���@vr{���q��&�|�6)D��u��ψd�Q��2�S�R(�쫿��O��>�/�gd���}~���y�r�t}��a�D�g�~Q�p��i�d�˜���胀��8����D/�2���+|Fa��6�Y���>:
j��XV,5ʱF�
�E��s��
�*)�+��AKu�����ò�|�]T��Z��f����֔`����HϜ���9+^�(3L��uT�J���V7�"M!����OdO�˫z�;�z�Z �Q*����ar���":N`j�3�Ij4;���Ԫ�Fbij�֦��Q��J�X���֏&#��-������ڪ&�����>m�47t���ؚa<�G�fѴP�#�A]�'�<@�e��}
v3��g�]6�nC��ug���<��]�E2��W�v5���̖��Ǵ>ե��]�S�U/�j�@`���>Ӗ=b���PN�����c���g�W�Ҥ�i�!�0-���R\�����}y%��0f�B��*s��"�;Yz��𳖿��'}C��k�p�ВOhe�'(����Xcp��J���&m�Q�c%[>���^��'��D����KU[��j�"Qr�q��y9#�f�\��+0]-8}8��5��G_��A��ݴW�c�"/�3y��u�T���<U���4����P���=�E������c�{Kj��Oj�2�x݁�t�����3
�+l��ˎ>��[��1�N
�T���3u,�#؂A呜��+N"&�v
#d7D^��-�I>�S�4��䴏MC�͒��Q4���v�/p,Ҡ�c.�_�榵2(�����_�U�_?�m�d��*�>}/��"j�Y�Ma�A��B#�UB�s0L�q�#�����uW��>�̷R�*�I�;�5�O��y�F.�����,�	x���x�T���)�3��ʳT1�W+�]n~*a�`�R��3�ѱK~�㣻!?W��I�Í��,;��1��N����GJAݵ���Q��e^O�,~ٞ�J��/'��E�I`�$�rW�u�9xۯRO"~��F��+:��c9DN�-���F��;F�/�z��.[��|V��j�8E��ę�oJ��
ww
i�R9���z�#!�P
�;p��9�]��+hT7~r�E�e������+o��bL,K��L
p��RK�������{�+�J9x��E�Ɇ�}��P�*����zXc^��?���$`�SJ�S;�l�9�VF��T>�S)C?�-����I���xx�cv���ќ5�W�2����V��s9v�`Ȑ��u�H�KA��*�s���޿ؤ����e'���V[�G�P�"����a�
e�=|�)M����B�h��RDE10�\y)��$
\ce�pa�bki2���
^�MX�8��<˼t���b���"�6�1�w��ů��S=���8���nƴ'�^G�ƅ�C&��8��r�lj�z���	�z̻��3K��;
�R7�)|]�տ0�>B�r>i�훧�֧ːO'����|(-�:kYm/Γ���(�2-ն��5���n���)-�Y�I�ܭ�^�u����I�����r��||/CQ�����P��+,�W[����������/5�H�2҄hܷ\���+��ӄ}V?(�uQ��e_p֨�Ъ98�'��a�v�w�̻�y�?�C�|P�P�(���S��>9�yB�w��+��(;H���* �9a��	}0�a��gi���[��h�$�P"�zK�����ݎW�)���i��'��ާh�
�HO�_�M���Zq�W,Ί����.Y9����g��M"����m�S7��lݤ�u̬�y��l�$X�Vd��ђ��?��F,�7�x���[!�啡ط�Z��W�N�Uֳj(Ve�wY����3|�`��w������#�]!�I�*-�ľ���H"�ȧA�$����qnz��x��"a���e���,�}�0}��3�̸d�1�T��Wu/Z���x�
�D'�\P|�2"��4���ʫ�P6p����(��&�9��^����×z�VE��i�S���z�z��ć��};����o�o���0��4��JbbU�"~-����h_�`�e.�9F��xL�NWJ‚��U��j�Y�>(&�XcHv��o�؉�NG���?Ҥ��l��X\�j%�ј��(�U�,����k���(Z��T����[���‡5
Eߎ@�+.Q��U�W@�����56"�H�%�	L%�(���>�kCkBַ>�i�>,=�g��U�y����j%�_�G��q�iL_���[ך���]�1q�(�MH�5D��������a��Rb�d��JL�8�cȉM�~l���1�օ�R�'�C��-��@~�n��c�|OO��`�|o
<.�J���6�K�좈�U���a<~o2s�8�/�!��=�Ԟ4��ݩ<�b~"L\�8����x����~�[� �N�{�������L�ͬ�
��O��6y�˒��4\)��Oa��|j��Z
� ��y@*��No�,��),�Q��9���}�Ճ���./�N�z����{�F��C�V3���.�gi0�dE,�2u�1!W�� ���zY՘�J�4h�MuZG��x �괈�0�Dz1glr�ĥK��br�nG��$zC1����*19�Q�P)���8�,��V��I����I�B3's��Z����0L¯��Bz=��4��R[.�l�$��9!�ԙ�ȴ!}
�	o���#�=��#�=��#�-��XU�����
����]���ގæ��6
�i�o�с���j7|ͣ����P��ӧO����X�����Y����r�(�nO����B��$Y�ISB`�70�⒅ܿ�i���g��ׯe��h� ����<�4�N��_g?�E��|-�o��#
�Ey���V�>�֥{�<�|�����Ƶ�׶5��!}���Rn0�m�+�.6���K��ϯa�p!�(�c�ʔ�
)��`�q�A���j�����VǏ+�%�R��!K6bj��MB��~?�T�*����=�{��ӵ3��=�N�)�D{MÙq�O��k����b��幒s?�[3���q���������
�`��X�t]��R��F�R�K��vZf�e/ myQnt�f�͏ޏZ�;�Z�	��T�����v'm�q���Z��^(�J�<d�f��4��6�1�5*2��2��Z��ފ������0��K�����yw���:?�=��'0x7���t,"��W�+H
��@,�F�R��~�����̴�M=�V~p����7	ѩA)Ƣ��k�٣�Q�E�0�?�CQ]���K�
�	L_�����K@ti��8�(�'��>U�R��(q��c�A�`���7=��.��Y����h�f!"�p��1�F���<�����
��j�p[*�Z��(X�%�`0���$����E�;
e���EIA5�ؙ>�gx"��ǾX*�K��~9J��0+��b�$-Ȇ�H���H��v�'Y��B�R>�4L����y�
�C��I��i��üt��}�Ƀ�J����
�O��L��^����-���߉)��rۥ��ؤ��Z���M�+�z�ݩ�Հ�ث�����7�6H}v��ͬ����<bA�O|�X��w�L|�B~.qpQ�J��W�t���B#
�Nb����
�8%�"̾�{��e��j�_(P_��е�8��ٛ�_�����	{+=j�/�����Ӓ,5Q^,�j]P1!�+�]��ME�]:���;�,�-HXԱ4�����o`M�nȍS�TM64���X��Q�ƴ\�WZo��֥F����I���/;��3�?/���?��3#����=x��wzuM��I�@�;b�9��X9U���%����8_'�N�D賥��VH�x�'�c[ߺC?3���i�6��e�k:wŮ�
roXZ�'�|�>=�(1j~P�=�ؖ�V#�}�W���IOM��n�e�W+�&}*7(_y�~��7�#�j��M~�0��?'�n�Wl��ifҎ_8?����P��Ak�T��Z��h\���@�t����s�N��4)�`U�c�>d�7FI\�RF�BH58�M��(�-���H��0(����i���_�����/isRxe�[�2�}]�G��U�b��_�U��6����G�|$�	cX�*MVndkV��*���I
��Q�����3ge�Ti����q2X�I'��E9Y]W�L�eۼ���Q ��P�x�؏#���a���C?H��E'���N%�7�maKfVۂ�j[�[mW���Ѕ��	��ؐõ)��|�}5�P4�lb���gi�2b��"�Vo����Ʃr�2T���.C����-�Y���Y���Tf��#�Ҁ��7�@�F	��u�惼3~zS)�`�,I
��T�訳�D��ԏ�p|�ﻶ �<��ч'&mFٓ�|���қZ��z �ğԦe彙7�P"���AQ���/|D��5B�ΜW>-L������@�c8k����[�MJ�(��J��B�a�����H�գHf���.�J垧��*�dz~JpHzb���U���/6��t�i|�C�~!���p���KQ���y��2��r�̱7����d?�Ð�E-�(�LKn�є~(9�D^�Gr8��+����F#�a5Q)�|�I���A�kᇲ뿬b)�H���i���gҜTp�"���G��~J �W�(�D�"���7a��K�����_��$���ͳ�a
���p�
���N�)�F�f��?%׹�:���{�8�RL�'i�2��'�z��V�^q�6�B?_�,��Z��Fr�!d�z�
�?����ǎ�8sh-"b,���{�z�{
��)}�ڇf�
{�ȯt�I�\
���*TZB���1�b���(�3>�0�hb_���躻7��o���v�9E�~���4�i�Ө��Q�O��F�?����:uS��{,~�7Hr�(�/e�."+�W8��υo~��i�=.��	t��#;�"�F̀�h;������N0��L��-��ͯ<f�޷�k�}Y�̾(���
�\���A�"�Z�xEH��c���8���(�@Xf���Ȅ2a�>�@Ea�`'�#1t�*W >��Ug?n��Y�:y}���i����+Z�5iUK��s��#k
�=:�+�zFI��!H�NO�4�2k�&�D1T�{6KN��s��/?׷�d^�vK?洲�>���W�����6�k}%OZ��h�IZ+)	i�W)c��h��
~��hH��	7�k�8O��־I�,f��Zձ(��>���_e=����T�D$x=���ȕtU;�U�$\.��0Ȥ;�.�	J%�'Ծ�UЫ��4Ob��ѥ���F���i����n�ꓙC�T�e0NT���V��B���q3?��ak��N�e�U,�v���C����-c��b}Zlf|B|�Ȕ�DZD�4���־�>�F,�LqV�G{#㥘�U���W��p��5���HȐ�d#��k)+@�M��^��Y�DŽ�
&@~1��Ob���%�h*U�[y�f���m�:��Kٕ"�V����W��9�z��Pa��N�� �O,���GMu<4O�,��ā�=T�!ϏF�w_��d�B)ꐜ��`�\x��`�/Ĥ��>"��rq�c9�'Q�0����Z�h\�J��.Aʛ��އ�ڑB7�gikD�N�m4�UY1*^Zm�b9�U�>�/Q�!������]�
+��K8D�;EQ���', ,��aw���?�Z��X�v��I}�Cyl�Sܪ���I�OqN��naG#�Ml%?�������9X���Kg��Q�lD��Orw�:m]���k�Z�Ra�������Z�=�"�y��	iૃL���ܵ����A[{�E��\��NR��	S:�o���u�oꇩ��G���X-{��#�|�M�760(�L]zve7��ˎ�q��x���{��6:�q���x���x�n�Iߙ��ݝOm���;���'��	}=����0�V��J��b��0M��aT�P��=$R��.yOtK.xOl�W��Z�鵎A(���M�U�/��q�a����򛡞V)�oJ�4˾,�8�╓�#=V�!�u�}x��+�$��[���U�p�{�.��(�����ݳ��c��!����
��	�˸b�z.�μ'h��n����?�c�?�_�4�P�:��I�Mc��*����᥀ݭ�OU�1#��%�Y���\d�
ӯ��r�DOI��
�]��V|m�}�@*�>Ҷ�Ʀ�̥�Ѵ���#Դ�Tw4�}�dwkuWn����)NZb�CF�{�p�U
��$H�b3?�h��;��
:�8y|?�
�9-�ZM֦�6a���е�a@��R����ᑷ��ߍ<x�!�
�X�]���,O��8ZS$o����ꂝ����5U���u"��w뢁(w�)�M��NaT����b��z�gQ��U��p���$�M>��|t�A�+#Iܐ$j#U>���IG*|�����ח*�9L0RG�O������#,����?��2���͓��~��ۭ$�No*�a�����2�q�eB�OF���˿�G��23��`�v6���R=�gS��J�ϐW<)[a�zPu{a|�b(���n�z����,��Iq���"G�_�"L��C���fE�/�ݺ���]���H�F<��{i�Rs}`lHN���Q�X�y�#���z��Q��/�jU�����{~����C��\+#��"iu�n�[Q�?L��e��͊��V��g`�Kh�)����bg��M6Ա��Ǩ�O�jį����x'�X)���}X�	z-孾�y�����-_���3J�������^��u-w�o+#�N�Ȋ�.����X)}xP�x�]��˺u�ߥ�����{p�yMpt�ӯ�#dߔGXFZ��#3��p��K�A}�z�.�V��55�L�i7ىunmo���Q���ox�h&x��>���\��9����Ҫ�-;��1��_���j���x�H���q�߱������3�Tۢ�{.�U:��}R�U�L�6����e�ٶ!��Z���-ɛ�y�K�p<r�K4o���O[�{��I��"��oa��q��mWW��a���ī+2C��`��6?҂M��2�d��td�����"��-AU)�U p�~#E"�B[��^�14����,D����ht>YGqm����ly�ô����K~u����Z����k,�*8Z=5+���O��j���MSҹ>�a��(�R	��!F$���
�]A�D��<�Z/��:؀[&{��D�6��[���dbMۅ&v�J���IBz�<q��!%�e9::�\�ʈ�Z��ِ}�t���H^_����\WV�^i�2��������/�.���+�n�GO�R�:�q�%����tr������U�)���Հ�0W�����WE뺂��%�K���߂}����V�/��Q5�
�ǯ<�S��$��gL��K�,VV�r���+���h��z��m#���?���[�����;1�iKU)ٷ��
�O���&�E��6C�q�͋�0�Y�ŭXY�_��EK���_mN��`�*X��X�9"8Mh:$M=HY��	��bڡ���}Z?�ZT�t<4�D*P՘�~vh�0F���t�{:l�	�����A{T�,+��~�u�ʋ�ARDp�;떔j���}�c�v)H荿���E�m����Y1>nt��`�*�K�|O��r-�-�e�� #O����p���u�l�b�����-X��@�Ҷ�Y�}�m�淌�8�==ѫ�C�^�!��M��&]uֶ>Ðq^p��9G0��X�
Y����ǟR�!)�w�"[�/��'z��V�dԀ[�
���/�'�8�#��]*P�/R:��i+�;*�"Ku����`"D$��8C�@&G�}�������2��>8c�5(�v���m��cK= �;��w`��	�"nM��|�6g�0���������/���[1!~�JW�ѕ���B:b�+�Xӥz�V_a��s�$��	��(v�MZ��7��i��k��/^�M�9j��y"9�ep�ȕ'z�H��bp(���Mi�=�|s�*�p��<ۼPK�HT��<��
H��a~9POpE�*M�e^���xa*>�w���餛M��_Ԧ,�Fl?���q�{�~��nP�J�`�Ou��C=�V�L����r�f��4W�"F��߃~$u3f_6�|�N3��[��B�^���-*�R#O?��-|/S�.~R����2�S�pU�<�B�Hl�hi����,J������&?��Q'�i���6�J���"�G�8�aS�p�!���]$��3}�}��.}>k�����j%�w�L����,�E��z�͖(��g2@���#�rd�x�5��D��(}��w�Q�#Q�"���<Tj�}��1�s��9w�Sq
Yq���^ԓË���!tR�(��`�֘�
�[I�i�7:7��p�kN@�*r��BJjs��TWi�4X�c�Q���ڧ>�_ֈ��a��7?J��籄
q|B+Y\G籒�ut�2����7��ܳ��J��._�h���
sX❜�m�mK����D���f��B��c�\��Ƙ^r���*9�<��
+a���5(���a2���#gs>ՠ,2��!ԮwOO~�_�˹�F�1V���N)P��t���s�x�J+mڎb̾��#R���IH��M��aFo�1a95��r~H���6A��~+����Q�(][�R@X1`+x+Q��P%i�Y�x��
�6�dB�4��$���vKU�/�8��~���sZ����;`׏��i��� 9-J�UL����7�~�yۗ`qZ��9N`��	����'.R����9;�3��g��^�����?�{M�6�^�C���<;��$�>L��QM sQ?,�{��b��p4F寝$Z����QD/��t;q��%�(̀�G����^0Ǹ���bV��168��Rc W�!s3�2)K�"�wY�ɣ�����sP�K�L�"�ꆲo��O?L��l����65C,y��h ��PW� k�]��ը
�_Rq�7	��o��f�&B�E���n\Mt�:'���i�d���L�4�`�1+��V��J/�f�<z�M]�"h�5�J���_��o3wt醷䲚ߺ�q�V�����r���J��~�P����f�z���_�'��=��k�0x	���tzc=�Ԓ�=}�o
����30m�����S=���pWN�#�#�H��Эւg�x������� Dy�xR�ݓ��/�H���B�7��>���k�G�!'��=�1%��n�p�@�-�������b�H���"tv�-�C����|��%CU�[���E�4დ��Z�Ίٖy��;�� ?����	0��[tO����g���;�!�pg	~"W�_����&�vo�1�pmg��(f*a�]����Ǭ�;���k����!�Jk7�Xe	di����r)��k�m#���n��Ŗ�
y���~���go���gc��?���g��H��7�J^�"�G��	d�gͼ��j����fI����i�Ⱦ1���КhP��jao!p��\Z�x㿂u45?mH�-��و>a�~҆���}W�J���ó�W��'�.[��".����y^5
���m:�S�OG���;�[�*����i��mY��c�d���T:$E����~��/�ᾟ�^ӼV��'BB+X�jo�TΛ�Tr SG�%�KÖ�+u�Ѕ���$--�)�j�@	G��0&1�>�=~�t�}���� 3�"o��X�"�ne�Ydo��/�f��CTD��?���B}b�&�B��H���bw�#�����5�����g�4���G����a��߉� �.�`��GQ��$E���{���_Q�:H�ԧ.wc<r=��ﹱ �/�F+���g���(\��uݞ�Y�;�S��Jz���Wɬ��q����S�La��-�H�\�n�_=�ߎ�!P�*�Ng�H!q�9�b�*�n|f-��&��T�~�^�6u F�
l�ݒ��MSjQ{a`���0����Ⱥ*�g����R"W�>d�,����r�	UC݁kg�����UE�&�|l��Q���{�N�Y�oPT��^���g�-t�^�@Ҋ���y�����^roD�c/��.�wZ���Y�RK��e�X�P#�R��EZ���	w�F�6
����C���v���d�*���Y�{|�ցH��	�X�����/�\b�"����m�@ �����Ȉ'zf��*W�䪧��z`*�	���6���2��6��KF�x��a�"�!�2�3<��l,�����`׊!z��f���/�?�딶���h&��
Eg�ܤTA��>a�mֹ��ש��~l�+�]|r�i�tQ�C��>M!��*_��u��:K�3Y�%�5�m���Qk]���<�VFZh��WS����ҫN�X�j;��>N�Y�f��z�.[���b�sQ��)uP��~��~�ĥ��JP�OR�$�UF۷�c?�O�{��eӅ�'�р�3v'^���ҚE!��/��Y<�
ͷ�)�E'�'���Kq*�I�'M�?�%F��;xà�8ռ�]{���
Le�6z�8R&-cZ2BL��0���H���aR��P3��Qd���v^cVu��k0�E���u']G�)�P�w�����)��H�������
�H��k���`��w���{��!�9���}�ߋ7�t%���L@��~#�RFn|�H�m$�$�`�V�b�!�d���n''Ë��:�)԰���/�x	�ր0�cc9�����.�q)?�V;E%�ñ޸����:��p�{рW��:�b7�,Z�|��{� C���1L��`��jAt�6��4��Cj�j:�Q���<���gB����"L�?��$���ɾqfE߄�A�n�}Uݚ�����Ë�Z���Z�0bEy+�RY+���������_����LG��#�n�E��K�)W��6�����R�¸/�q����PV4H�)w���
��k� `+=
��Y���<B\�zx4�Ӯ~a�ߘ*~~Ijћ��ˏ�`7�fc�`)z�p���=�վ�+v��БGTNA�l��2W��s�_�r,HN|(G�Ө�,����Υ~��F�2�c�|��o����ƌ��蚭�Q����O�
�T�
2k�k��v����A���B�����9��Jό�I�ۺ=C��J��1O��^.�fe㺞&�9��\���������ˣ޳g��cX=oϟ=��i�d1��WQe�����jKLзY�ʍ���~wy�z\�)�?7I2�����m7�̦\�;
g���8~6�fa�U�5�G�����^}8�t�p�VKI�N��o"�\��,u��8��d���l������*�Q{[��;=)�##����]L�B�9;��f��ay���%B��ƨK�w�,��/_��=����������+v��%��@��x+`��������X@ZI��+P$�K�|�۩7���ť��T/��Â����2>�ܱ��"Vt���e��=0���_O���fuȃ��\�����/��J��xdX�؆%�8�����0X�]�I�%Qqq!P�q9ko�(V�$<���7t'���UA$��M������?���O���8��?K;��QqG?pD:���f���Rf#�d?�����͝��1��O�o���;h�àK�F��FjC�ѩ�K�j�S}�T��D�-�py��'R�0���qd*��d�Aa3�R�&)��]�F����`iaVb|{&�]�&�`��cNz���gX��Q�F�ތ��Ə�u�ս�{Q^X�R��;H�
�R��)��}��C{+_�K��,n�����ɕ&�!�nREXSr�V;�	ԗ��p���ej�d�8<I?8����t���+�\/g���?�����ܔR������E|�A�9sg�����{�?���"Nɴ����C��j�
(
]���K`灆�H�'��D�X�n�z����&G��JG����c5�R�ٍ�*
3�0.�3�Le�%�V���>֗s���@��ŗ��]���jFΩ��Ԋ����~��ī��b^nR+�&k���s1�t+��q$<pYg�*�Z�h�Q�XxXY�����<^�q,��w�RY�����.5;�9{�K��j�
�F�cuiό���5�:����<���(���mt*�x�R���e��5.���!X$�yQK�J�U�8����9}�﷑����P��eKi���_K���{���̕�̓d��l��ܢl#�4l�%�YB��Kn����-�u���|ނ�?߮�O�$��g��=�66_���t�"�eJR�.d�	�׍"��-[�7�$���m�s��Qv�U�Z�R���=�v���ޓ'C��o<4O+��J��}7�H��%S��UE�.}��޹b��t8�O}�	"
�>����g��Z%�h�3��"�K�%r�=�~��Jz��'�]w+Jd{�`��w?��@������j��c��y��t�\y��c���M`�@��!{�Ox�t��X��G�_Ent�u�~�uOc�1뮷Z�G��w���O(�7]���BO���Q���d/�K*�����m�E"�X�l��t�����k�}�{��jo������0g��7tu̿�aAoH��K�#���̞��7�Or��P�Ի�y�`!��I��׾"�.H�u���."/w�⁽�ـO�\�4`���j'�䕓��8����(��	XT/��"�L�{)����X��Й	d��2�ze
O��Ꜭ��F�T)��U���(.b`p�D���E�E��1e`�ߣ��:c?�F	�*'����HA�8�zq��Hy�MX��E�(z��������jǐ�gQ/$5?��E�K���G�rR.׈z�����z�}hq�X�-�B���Z��ד���R�O���^��{���a=�ה��]%��ٝ{��c(k�R����0�n�e�YƧa�q1�ʢ殬`y�s������q����4�V��$��G�����ܺq��d�5�*��&��V�t
b�ӯ�Y��J��ۃ��g#\}���y�*��UJ.�>�>����8O�ȳ��!+��r
�8�����3����ܪ�S�@�� ���=���1���h�۸�z�%o��5Q�k<o�]ud��Oy}I1���Z�ݧcTO��7u'�]��a.�ڸ����|��<�Ѱ!xI�3��'?\�b4��P�`&ʄ<FN5kගb-f��s�� ԭw�����(�A��<|K��s4^4�<^p�ܾ��Xm�ڎ��1a0�9��mw�u�X�l��gCr?HM��H�@~Vd����V�7��؏
é���׻�}���(~��#vW*�N�<󸮲�v�)�T��iK����{�.Id:T�O��a@�߇:kzk+bE��b�KY"�Ã��B�e�G�W���O
��i�̻�d�,���'I�{��U�,��(����
˖���ڢԫ���U�+��,<N��A�*��Ҿ����k�"^�
���'�
S;�/RS�;'C]�m�����E�Q�+��
�ݜ,��K?�Js���P�"^׈p ��?�����(�M���+QG#R�2��"�0�XE"�8��6-c/R�/��Y%&�2�_��sAuPF����l�_Z�
�8�-B~ N��K�n�i4������f�]H?��:X��b���|I��޶C��l�'�AcD��?���¿���D0w2HZ���&�E��FS&"\W�T��C�84����-�O�����^�#�ἹGN��#.$�s(%l��
FG!7�����o5�瞪UC�Ap���[�:{`n0ԡ
��@��5gO���tT?4>��>-�L�����:Q����B���j+�g$zK��Yu�)S�0��У
dt��� ���Hn�LK�h$�t
G�%�Do-!z���4��-c���o�;2�ի�� u�������-�|/�L�yg��\�d?h`��]�܆�i\������!�]p��C#CÞj�`�Ȼ�~��
1g"R�˸�b��L�`c��i�R�P�סs�t+ȧ���Z�>�cG3��i��_��˰N�o��eʛ�>S����e�˲W�AW��ݍ�d��ޯ���sdvs��:|"�ݨ�Er�r�*W�W���?���0�:��7���Ks�Q?P\Z$�y���?�B�=29;�����{��{~o6O�q�Cw����_{����/�[� ~�5@����"'w9��I!��5���{g��_�?�����ǔ��Ğ""׶��Ʃ.���ߑZf�KКmt�.KP�W%bt�I:ێ����{�T�|�ha�ވa��+Xګ�+��N�������@Ye�Tf��|��뺪��>�,2�94I��Y��1f#��ӱ�*ͬA7=��nRZw9��w��v��-ݬT<!�>i�]F
ݬ�?�v>9��UG�E�#���ؽSYH��ɘ*u��b��^��w~v���|�u�1����
1��l�u/gL�O��X<3i�Rӽ��t���g�xo\>G1_�"�(,�s\XEG�̡1��*j��;�P�L0%k�6k��cr��^������db�t�M�fK��͕���@/���]d��bu?y�����1��H�Ic�����1��T��Q�>�dCYw��|��5J�^0z<�5�j��g��@�]����-)o"K���J����d���2@��\@�,P���}[_	9���6�T���@�o������`Z����
�
HK���k��RC�
`�R��M�?t'yE��1��lC�W5c������y#�����t���$�;iP�Ǐ���C]�� �p����G��*�`/�˥D?�9<�W)�#o�H@B��ݹ����"�9�uޝ� Ȍuh��j�z���K<�i��رj�;2�_��缷�6h(��OR5n�~[�)0
o*]"�Q�ut�0˸P���.
�(y�0�fv�fW�T��"��O,e���O�x��#
���/6O�E�S4W��e.u�Mi��S�
u~F?̈́���J��AF�	�O����5����y��\�\U�L \n��\ʼn4њ%&24���{��_AA���!��͸"M

��G��}}���.;O�vOmv�~~y�feNi�:�{hn6��om���J5$��s����I�Y�����[t���1���|�\��J��M
>�q$�\m	Ԣ���8qG�ȫ�]�:<c�st���Y�ɫ�c�+i��u3kߴ�|���RԢ�ع��I2K@rCij��)�Z���Z���(��,��Q�L���ʪY�	�]Ef �T�p�n�T�n��G�#wMx�(5j�S�i���؀"�j55��`�{��S{^w�5~����Oq���_WF�x�@�/>�ʻ���F=���h���ű���P�Xc,�Y�RD�ܔLU�*k�m�T5�~�1R�Y8u������[E�^ԧL����Hpxj|Q��W�h_:d�� �wvQ���
(�m�
z�=�
Y�uU�2���s"�w.s"��*��*�߇?���sI*}�G��v)3Pr̝:� �1z�4!����F�;ac�D�uM�l������,�����5jU>��IijY��o�|�:ސh(�v��l�zg��;��} 9���P�	�'7�q~����)�KRp���L��1gְ�d���W$��Q���?�k�ɯZ�ٜ
����:�J]Q�U�6[�ڜ�Z�̓0<�0�[�F!��>t-8	m�&��+	�>k����I�^R�~��}nc+຤��>
PJ��U�<o�	j��9q���k6�	:F2�]]Qw�ޓ��x��dj��ǵ���1�Eӥ�A]Rt,�8�~��M��5�i�Xq�&Q�5#�1*-<J�U�������)��@=���fQ�,5��}��N$�~��^y	:�T���U���a�|	�8XhQ�3o-a�!,�Mɬ*^������_�ݸ~��S�:
�0���E1T�Z����)�Z���_O����B�<
�u����f���/f��Xjr1�8�(YP5�TМ��遴߃�\l��O)�7d��u�8���[�J��AΫ�s�NSp�f��z8���8US�-�}X���뮋y���V�r�or=bTu*9ɺ���wn�4���R��8_��c_jE�`�1�q�f`���N���G��z`:�kmgyND�#wb���	��vG<׋����ex>�.ȼ.R
�~�$��Pv������J�1�ȏ�t�g�Ѣ��Ȑ�ˆ"��B^;Z ��C��̨���;i݊}`Z.
�
��X��,�{��N0_��r��/_����Nkn6�n�"S����f,K���Բ:m~���Y�zp�A���e�l~_S�W�n����r�EK�
�Ҁf�1���5�?��ٙ\�g-��i]}��o\ٰ~�ꂃ��/a��*9����ݖ'ה�{zm<3tf���o�
��K3��1_��[��=*�#��
-�E��O
�ˡ���T��8���л��?ވ����{�2��8���(���[�޵DkԔ�}v�V�(I�Zq�ws7��	������aE=5;��#ȯ�N&����:q��9}���ZnVIKd �g&8��p�r3�,Ȓ	nEYn��vPf�.�L��`��1�ѕ�we@w>�0Bh?��I/�v�'>,}<�F�Y��W��gi�g=���%׻��?���)3<S��`���o�4��zU|���Y\	�%����g�,�� ���Mv�]�$��[�D.��!��0P�K�u�
wS?�����)���*VI?Z+���X��ˊ@�����IHc�I�t]��p���暹k6���vmْ(����
��v���#�\	�X�@
���_��UG����~N���/�y����|�F��x�>Qpn=f)�@C�a�����M���߄�Z8��<��j�ZW�g���^gt!i��R����K��y����O�5|H	�V_2�T���?3�|��L*�6�+�"KB[U=����b���6����S�M�4�
.�7q����2&S�`1��Ms�<ˠ'*!b��=fH�A��Mp�[I�|DyE��+,-�F��ǧ�F��э�ד�hUB��Η�Gk<u8cuY�+/���C��3�Ly��x�k7��o��Lw��xтGj���G8&
�a:x
�%��l�n���y0P��g,q�n�DtF�<�T\��Z��!�3"��r:�~;�χ�.z���z�y\�>��0�SNŐ�t�t�@mKŗ`��8��$���u�빚�l-
Kz�n��ȈS+���;�9���u�M�h�%�h�lo����R����r��-�\��F�y�ŭjP�U�kR-�ҐV�T�,�}�pJ-]1�g�ޣ��r�)�Y!'���I�'�4���+�:&+��NO�ЮLO�*����(<
'�c]�x�O�X���ut8<<=S��;K:'��;K5���'/B)D��c*����ؿ�䷄��+�@��h(*��:)(�|��Y2%�}��<�g�<�	�b�u!-��JَJ�#�N��5�KIX��]��dt�/��|J���8��&�Ti]�j�rc02�M�+�k(�bl|�b?��M�ߊbf����O{��T�-XpI����܏Q�t#=��͠�l����I�j1⁶b��m�O�T�5�m?��T�)�˂��i��1�&\�^Tq�L�����
��o�<*����)���fwEւ�?j"@Jvt�̵3q���,�
k��2d���T�QJ�#�M���E��|�N��	Jb���r�J���X��,��IVsa`4݇�9V(9o��G���/y��ߍ���m�������؎:&'������&pT�"	�2Q�v��Y�x�Y_sa]8w��[�^�:��xX��X-��܁�t,�ߔO��U'��leO��?���'c�'���f2�-�p~���7k	�&Ԑ����q;�q�����m�{o��/rin\(vK��oL��*i_������2��S�Z�z�=8Nx�b,aA�A����]sf
K�ٲ?�����혮�h�(��&���s7�D���6M�Lx{�E�>
Ё�O�<�@6@r��߆�b��	v{�n8f�hA�T�]�1�Sg������ӻa��1�ʏ9�'����<w�X�0.tW����֬��1��$�����(�8��{L	u�S.�=s��J��P:&��ؽ���:y��<�닡���"�pwx�RV�E:����.��j�����L>��J)�^��(�B��a6w8�~�H�s.���C��P�/AU#�vf9yZp>H_W!���D�Cn�=e�>S���
�e!,���;�wn�2��k��j-�S\�͖�L4BI/Z^�%k��ˋ�:�ɲ�8�SA�h�L�(�5EeͥS�.��(gy]�FQ�+M�q8J�)P"���<)��$Dž�V��*�s�)32cgH�EX�j{�#���B�8��S�g�������=����P�۷��Tg�6�#͛�We�Rָ~��fœ�7+�h��rU�'�m	��O�v�U6�uҭa�"�ؚ=��d���Qu��O����d��[xjˈ�i�(@�WU�ɦ=�P��`�!X�q�JJ�<�M8��?�LUw�s��t�����w�3x�>��J}�N���b0*�KO���J��|}�
%�`{���~_���ۺL��.�*m���wT�m	����q=��
�׷�DJ�ь)�R�]dj<�f|A�y�c�Mȅ��X��g@��5���΋����K���:Ux^˺=n�ewy�CYb/J8��8R���~Tq�~�����b�-���$C$y�����{��-b�d�a[8
��k(�9[�뮼R��M�N�'3�n��̛\�:�!k�����d/n���]Dާ�1�2px�뙨�?��FSaFB��{oe���?;:}wܫ� ,P�s��.�%�]�[R����O����n�
���
^S�r�t{����W�¦��D�^�W�y�
4?���*�?Y�5�W�Fr��tU'f�aBu!Z0^�T=m@nK�X�q�^�L���|���O��� p�<��A��ҍ�F��;�J��pS�ZBA7�a��<�T��D>��.i������~�}�΂Bj[u�����>6G^%��'���xH0�U(����Tж��iQ�CU�7>�mЄ��3^�Ö�oox�\���ޏ�O���;�3u�S�\Co*É�*�>�H��<�D��)�d�*�]�X#����`��37q���ܟz֊r嗔(�����˅����E����w����r��#��.aN�n��fxM�i(q��-���*�	�Q��c8�j�_}�|I���=<<���_�]�����X�8�lh��7^��d����1���gB���Z�(C�)e᧚S���m����y��
y٥u���1]D��b�v�ے-�l�\�d����fYq�݂1D�]\p6m��9
��e��QCr^Y�%@G3��N�x�>l��!b/�}��S����/nF,vӨ41��|�
o�S�p3?�`�����^Pj)P�g;%��
����>�U+~�,�V���k�$�r*;�;�RO�R(k�HP�v��9u�rB.��$�pP9r8����[�G�"H�Z��
5T�DW�O���QC��?|4B݇�N���>�E�������{��h%�jX��_>dr������p���+��g��'�k12z�p64��Vs�g�ߵn�.؜F� P������V��|R@�W@�ϗO��IYݼ�s
���'ݷi��R�W��-�/�
�b�ShAWeR	m���H�	#
��bS-E�f1E��Q7!�V�
�^��K�IO��N��Х���e���V��VۨUDk�}L�uJ��:��@
��M�@��ɟ�Ӹ=���%Vc�=���fR|�M�ܟͼ������ț'�{:�lطPW�k� P�DO��׫�wn
�7�(� �Cr���E��$��x�68v������Վ{+XJ�Ϣ�0w�<��,���Z�K��ۼ�ni΃�����T�<�k��A�����(
I:B`ؓI�t���unj��t���:O��I=���՘є�z���F���ru�
*;؎�hƙ����FVs#3�f�r<m&��f���f�r�lЧ���e{��,z��tW
���G�-w���1*��6����Į�]�H\[�!��k?��t1�^87�� �a�~Rʵ��O��T�������p*�@���!p�&��#,,�(�Th�o,��a��_�;�׉;��a~:&�����x�j�z�Mh��.�_�\�4�NT8�;X�#�ŘwX0�F�i��"���L̢�T��`�x��ƫ�V^=�沤i��.��f��6�z�%�P*>9������K\AӼ2�@]yj�\�N<��k�V�q��?�B�7���ts'�fHT�BEYɠV���$h��5�6æ¦p��uPֆQGht���F{�cZ)!#yӯῌmC��(V@W,��6�%����VB/C���9����Iu�*�m&��j�aN;�ar�b��n\Dd�:
���;�p9�Av�$���BŮ*8p¿B��0,Y��C�L�g!��<o���
>�Rtb�>�PE��x���������=�F�SYc���`*jl�
�"�qFRr����|@5��l/��z��i�7ҟ]E����=ʞ�l�?Ðp�4�ǂ*ث��l�n"�j|��%�����ц��3]����߮ЮׄT4�,U
�c��GP3?�@D����ea���s5A^�<20�%��U�_�R�|��v��"�V�<��<*�|Y�'��!*#�MaE׻�kc�L��4r�QM�ey�1�L8��tk�R��0pMd*1(V�U������n'C:���&"[,�r�S��]��x�$j�A� -)�ly���o/����e���'Q
7��iIQIk�H��Z"�x�F~F;d5y�Ҝe�s���@2����u�s<��ο����A��#%+KZ㯦��ӏ�Y㲐Ÿu���fW__�Z�ϣ���5��J��[H�/�`�{m�(;h2���ڲZ$#|-F�n���`���,�rNc̳P5����q`f���T�^�|��G�l�H���*��ۂ���#믰t�!��u���r�m|)�s`tyE��1.�O�YO�b�_{�?�6Ś��M_Qx��oC��%�,�s��K��M��><�n���E���
9���#0]vY�_h"
��DTJޖ����#t�q�Ś��a�=�F^��X���A�$���6v?8��D�jY��zl�+t	�_�3�
�|:��/�
�ws�Mq��;|�[���׼���Wk��6{(h�	�b���߫ ����~]���3[?!X�ع
�'o���0�MRl�`��c�֊�|��$*�JSʼ���ڔ����DUWs�����ɲ������\�v���� �'��sV	Ք�T����NN���n���f�^�u��^�Ă��͆�L��|�+N��=��Ѫ>�<
A0gq�_Աm���t���"����m7R��/9d��oV���-;�]݂S��fѥ

�EP@A�S���I@��T��E܂�%-��b��p5D�4:�:U.56��^�v�c��-������G/޲gn�N<�,��^GV� �+C�n��NA�2�8�t��-!# �A�[>�nQ�84��k\��y�v�Ƚ�>,�}�G���?!�����)��\��/��q�@sMd<���7����pU��"21b�8��cm�L�w��k^8�t��3���K��K:���}�߽z��ਏ��#�BY^.&7bS#��3���Ctx��#)�V��y�T�˴@_�����(h���ܟ`zR"��]�G9�C���<���L�� �.����?+���ĩSP�_,�,���P�b�X�b
��r��AS���`���]��/"�H1�����c����֡qt�:��u}��b%1g����&��Gj�q]0�	�.��+z�A"ho�d��ٳt؋.����Q��*?���$��D��8ν���Dm�ы�D1��o�?������E��n7�X��&��|��f�)����X����R�
<I-�(ϸ�9����w�S��!,��d�a�܀���)�����eaR�HNJc��=iFT�j��(�Xi�ag/���i����!\8T�Sa]{x��i�a@~���0�{��3X���U?�0듛�7!\��P^�큷!l_6�=�������~�)i�Jm�f�"{�A8όE��[$n\g3�E������CIb�����U�c%H�x��>ϙ�.xq��D�J��q����e:=;x$�$�B�"���(�Jx�����}�vyr��o|�u.�8�~���ރ�UP54qx/`���0�mO��C��K�<�Ȇ�pA)WՅ 7*b�	�����P\n�H�����t�O	u�m_��b,�b�Tq�n�����%�C�j��*�I.�.���(Ʒ���@�)���������}���c@�K�:�Țz|Qg�ֆ�IT�|�1��»����p�ƀoq�w�@p�ȃ~�>*Ք�0]���ZF��T�N;�L#�兇�+O��[�F*���I��0:S#��0����8�m�[��Y"G/��<�_���P�4���"�.�ddo�gj 1+L��)��7��]TQX
��1�>O��#j
~)��������ۯ�a4y6�|49���D���������Uٚw7�[�ӹ�G����k�Nxek�_�=���O�m!~�>L�_3��/[—���5����Z/�X��T�GI�ѵ�T;�g=L.(�rV�\����Z�[x���u����|��6o�}A�՟����j]l0i�'p��_M]{�0���٣�䓧�s�M��'A����?E���B�y�LkG��x���4q����^P��I��^�ITN>9?�dN��9\��L�i���uvU�.�0�9��h_�hk����-�S���J��H��ڏ?w5��C�t��ԡ�:����0~�N�	;$l�IrR��>#w"A5���7$	o��S�
f����_��{����cN���p�W_���o��{|��b;�;��UUW�-���x�ZV�O�I�>N훾������}o����q޾� )�~����W��]Ğ�VV�:җ�5ue���?i�'M�@S��O>�>()[��P��_��#��e�Xі(��$��EG�ڔd���>�^�����:g�fL{>�S4��؋��H�DZ�I??���glZ?笣���K�����KH-]Z45U���_�,�P�3�_�{+���^�D˲F��T�{��xofٻpM{��c��@&���j׷��q�>os5l���h��+vs�}������|٪b��QqF�n9�M�"���7w�:���Қ��ܞ':�M%@t4U4{€�Z;�
�Ÿ�2�,���م��1y	zE.��8�f��܆X�G ��pb!k�����A�n8���C�C��Y���:Ը�@(|�a�=v$d^��2��b��(�	,�D��j�DI�<c��9qd>9@U�9��3�����>�x��S�(�`{����P�Ne�T%'`5ā4=,ğ��&mܦkn�a�׊�$��9��X�)R�x9��r�<�[-q�7i�z-*�z#!>��1ݎ$�8H�4�ɚ�
�MSc1�-~��F��}����S��.?��V��)����4+_��t4��`1�<�����cb'&H\�cy�27�)��m~�ґ���
�Ɣ$���|b<��Ams*}ߡڑ 7<YW���IJS��C��]	���ixed^��ʚg��r����M�<��ۜ�(�[҅j�寱zq�گ>	�x�`6ƛ'�;A�V��t옛x��n�M���-��YY�w�E+K���
��sJ�Ʊh�xd6l�tC�}�a�Q�P��|i�t�I�?v�{�=�w�!?��1z<�����5�fm�т�c��e��`q�?���������j@��n�J�6ux���>�`��xe�ҖW�8���A��	�_�����ޘ�xo?�af�X���-�2�Y"�ЪفN�jNr�FE�6O�cy�9����iy�p�q�N@��S{��n��`��N8���B�-�0�Y��*�\��D����d��6�*�ZᶸYi-q&W�I�'4���<��@{崟WzX騨 �����欦,;��`�͆��;���NM��;~"i��Vk�*ӡ�;���څS�Жo)�$�.����v�F�1}�Aa��d{��X|ST��*���N���؏)��^���0號40+4t��2d/P�|:ʷv�{.���#�[�܆��p�/7�,ǡ�:.J�(e�_S�,(�c��4��x�u���uW�~�}�}�����/\tI���������I���Ż�N�G�����5����Y*zVɆ�յ���:)�G�K�ս�n�����_ϛ�5z�]v=�z��:nBaP��`t4
c!}uBtU��/�"X:p4
����6yٹ�%��'#�@}��
�4�Ҕ^3!}=��2&��P:�2U��BEH*B�Ԑ��I{�� ��I{�")�:g���ت���o\��l&O��9�p��u�3��Lbo�%坯�΀d���^:�k�i8�q�����B�2%�Xbt�/�@!;D��H�����";P�Z�_"�o1k���H� ��=��]p�~��f�I� p�c� ��qs$F�E��QeԐ�'�|͚�y�H6-�Ӭ��*�#�����>�F���	q:��s�<����"���a���bZ�B,����#S��joo��~:������f���MG���z�q8���i]Ě
�!!ٝ|8���U�1�{��Bg�|��8ȝK�Z���<-��(}�}�����	d{b����J�-�|蓦,����.���|�n)����*O�,��r۔‚](�Xywh��e�����h6g~�n�Q��#AFR�����\I駎�Mc��������"�/Рq��*1�x�%�DZ�;��z�r!�xu�ƙL����vaڪY��j:�rq,���</�p�qF�Z��@ϲdyq��j�+����1㉸�<����u㹴"�w����w��0'`\<�׋)B��ٝ�j3�Ri��y�<-��[���Ž����ͮ�%#�\bO�0�!��r�Ƀ�U�c_����{n4��7\����RV_R��J��[w��@�k�����ߴ�F��ud�E�ܲ�D�7Q��[�ņϺL��E�៪��'�A�M�?V|�n�<?J��=����%�c���I�\4�X�TU /BG�c�<oL�`���65�¢:F݀�4��7�x�qm4]��)�Ÿiz�UUnTh���D������a��k��K���>qⷷ�
ӱ
�Uu�2u�B6� ��Io�tZ֍��Z�#^G�>w��k�DFoHW�G��lY9r��wu�t��Ʊ��Ř�8��y#ؚ�M�/aL�^=}Q7�qYb��h8!�2����Q
8�ѮX�1��X��U��c]�{��繳�nb>@'�x�Sg-N��%Gm7�M��I�mTŌ,6�E�+�W��#�[h�[:�+L��[j̀
(�ҝ��2�ȗž̘u���g�BS0f(�7����@�ao�4���Xv��֚;�#��5.܉��6�n_jc�F��7G�b��V(L}�J�1����#y�8g���+���gݘ�=0o�<���(���Ԭb�t�b��-��Dz��W���_�������{�8�?�`q�������~o^�o���o������q�n��C��������݃���~?<���K���7�Mk�Ɨ1�)0�}���r��������j�.��o�����Lޔ����uɺ��Y�at��?\간_��?�������o��F��#^Lt=:@�:C����օ�g20�݉��@#{��{�@ h�Q�ϓ��Ǒ7�x�|��~���$�K?����g��xa�(ߛQȨ^~�����χv	�����(AAq@R�@��Kbk��W�.�.jO�]�������&v�9_/��-�>���Xv&�<s���9C�O&~�`�'G
Vs��~co���y�Η/3���gs8�����0��]�O{z��^~�4���^~�Ջo���?}����?̾���y�Z��dG�
�t�s�<3����2j��J}�����0\}�%�p�4]��c/z�Q�$����^���w��w�3yh�	�������/���̯�����߿;��a�����K�~����o]���~��w��~{���A�$�X���=v2��B!N4�d1�c��ݝ�?<;d˅�\�CR\�u^y�a����y�=vM��bYM:�c��[	=W�4��4J�eh<�����(iFhT���۸+�����UV�q�$n�x���'f��ErM2x���LB��.���z̞1>�����h��#���{arV�
Z������G�p���p�r1�����z�U9�ϵX$ʂ+G7�ӏ�8�C�}aHk7��ad��tU6s�t	Q�A��)���ϯ���ĸ�^Ozl.q�(*���Zx��k��H����$f����i*c��
�%f�ԓ�mj�ִ�1�B+�j��Q7����Jr�`��0�D��f­Ѳ�g �x�
�/Y�p!ԟ����@2=�\ׁ�,{p�П�{S�'9��ԩ��7���3�`���a��#�@���V�ǃ� \�'�^��C�����]��kdZ�r?��WG��[�p�HHw�A�\u���(�OPf�e�E�)Cwl�&��t!꥓��1B���d�L0\�*~[{^6��U*@�t�s�7�l2�ϯ2�[%PЅl�]��3>kLz���P
Ԗ��‰�z��cF��.�`B1)�N��B�h���p�3�nJ(��A�K�Bw]#��w	�Ρ�y
[B��= 0[���Z�v�5�G6���@��H��D���+�r���.3���Cp��T�S����p��zDr��&�Ar�u�D�,��7�r�(�X���k^�.&|+�~%�?���C���H�V<W�5�	ɣ'��+B���Q���^��%Ӈ�sx�yNl4�*%pz�|���@7�o�h(�y�U
,�e����Ƃ����.q!%����z����-�̏����>����C�9Ɠ����OUŁ��.��ddUo��`���m�
�����g$�TP:��W�׫ޥ4�=3�~ƞ���XjՇ*�uh��Q�R���|{�
%���1ҕ+��.���F�-SB�}���Ǝ�c";�T(¤�-{���`�9��X��t���{پ�N:Nί��g��7T��Ld���q�[�f��±�t1�eJ�+�"H�(r����Hl7����%9��`\��%rO9{���:��cH������e%��V�At�x)��}N4�B]�%�x���ℱ�9(�+X�<`R�7<�����qVh�H+�y.�������R��;����l@�D�hɞ���ɩ�Vz��F��:������_�xA���X�����(�c}IE�Z��$|zʉ�S����a�l �0y탞\�XY���6��l��V+Ti#�Qդ[���I1�S���>�8�(�r������=�>�����3<E�*s+c�C�DXӰc
r�T1�M	eB ��)C$�����7���ȅ�!Y��s�e9�ݎT��_^�!:^.x-���lcސ��B�L�m&ڶ�+�����^P=\շJ�foq\��;
+�'L��>��ߐ��<�`T�09M<��)��x١0������Q��o���/:\��x�O��F.W�e��.�U�Tg+�hʴ`�[4U�������8�����,�������A"�J�b��]��u��ES���5���gh�'�:���Cg~��;v�$ܟձ�Jߥkqq��y��f���f]z)�+��wq����S�P���m.
�j��\oO*�c���l�q�FCV�?=���f�
q-=�RS��-*ƽ���fs�L$��Y��7v���J�q�J���7^@8���e@
�-9�3^;o�aU�N�;�0�.�����:��l���k2��;��)�eLQ{ك�������}M�ۃ-�y�U�^��az�����_lN��'����:)�'eO[�մ׭d(��#;�TF�Jڦ�S��8��a�#�/s�`F���L-E���)�G�TQ���V�>(�!�*�&im�~�#ڔ�7S{����%a�;���&�ϔ�]��7*��^%�gq�eA�;+	_��Ԙڒ�뎵"�X�b8}��
��C�=[�IU��r��E��)9��"UY1���y�6goN���-`)3��?��؏�ѳ���7��'v���W-X�\�3ӳɂ�9b��N�hN�0�ʣ�c��d���'��Y |u�B�����£[��u��zFZj��FZ�����3#oH�X8�5����8�s�Q~�4����i��=�?1��r�M"i��23H5ׂ�+�fuv��}�⳾i����U�v4{)J��Kw�����~p 7�ʥ֭�����fw��F89���I�x�A�������#�2Q?7���F7�&�B�f��æ�
��Ѿ��;����،��EZ@h[ ���#�C�G�c���M��Q8�1ݵ�?0bG�\��'�ѝ
�\����L�=��m-�z5�e�r^#��`HO�䵄H5���~�롢U�ڰ��RC7LŢ,��o��zjp�̃3�T����eʐ9�n�~nk�Z�+�#�����6���m!Q46iU0��w��gt�-3v�,�ip���	��?x�R�򳍡���_�n�
=P���/�džuZC>�_�A��)����
+��G1���MR��l�T����t���V����H�`T�Q�
`��:���� �
��x�W�W�@!����b�����hx㙁5@�=W�,׾���@��8[���PU����t��M�h���c�Ji5�Nz۰����+B�.�&�����6�����"�I{8�j��b�4�v�<Y�?�_�5ݦ|��G��ln�IK��k�;" �>2�c�H�[�h:JRy�]F�B{��G4��9������s�_F�F�@!0�>\Ln%IG7��#CAQ��Z���(P�'c΀�$��|��՘�jz���%��8������g����޻O�<{ �E�jٻ�j��-,P��U_�܄�s��&�[��������7k��ܾ��9��(�r�@S����o���|N�p�!b�n��Ck��?¥k/�ѓ�)?
��7�Y1T�1�U������i�9��/9u�E��)7�ωL�m)��U�2��ڦ4�	G%j���⨁2�����w� �Z�QzXl���^ɝ��E
J\�թ�5��4H��5�I��[5:fl����#�
`YY!�%�����p����Е�3|���5-��R���U�{2n/��w�ZUE��ѪBK��6�:ٜ
���c��Oɠc�/�˙t�J�΋� �f��Ɠ�7w� �H}�����^�x�m}�|�t-;۶�>[AB��b��E��nG+�>���:��_ā�����S���xn�~v���$�$ݺΩ%���#�_P�l�>�=Ʌ @9K�RR�B9�p��8b�x��������x�v�q�.�^2�t�ח�:5�ͯ��p4oH�Ք�w�w�T^A;�h{Oaα�*>����Kɍ5�ޜ�,��)���{�����v6�^��]Fƀ+tН��%�!��Q���x4!��9ƭQ�IY�VG��+�Ƚ��>E0��2O��\��e������S��g?�+���ыr�(Ax�1���T�4y��Kġw<_ �L+p\?0�5,W����C��A��8���00-�Ke�
�a���;��Æc3������'�O������܀�~�K�\y��(^{(�R��I~G#.M-���`�d���7@
Y� Lb)��z�e���V]Q�Ќ����`"t��_k����;?���#�,>Q�A8�iM��p���RL���o�I��DͲ㨼8=ʻt�zQf�U���/c+eQu2���r��J&���BN��[���E��c�!L�aa`P_D޵ײ�9\�&���1� �2/MA,0�Hp��
:A|�1�v`�p��B�����y�Oa!��,m3�?aY�]�A|���P'�py	7�*�/��/��˲�T��N�g�CS-
�B#��̒+q*	�A�Pk=.qAz���o]����ٶ�}���'�~g�ף�l,r�ً�>3����{R��]Ӟ�a0�&��MG�`��0��)��{�<P��j�+kqǪ�ɲ�0�2����w�I��Q��I9td΢+3�����`V#�1	�y�T�k1UԵ�E�*�$��d��-?J(�\�_x�2�*���K��T�9�wx��w~.~���3�-��[#�:���4��A����G݁y�}�.W�r#����X��'�Y8.�YM����P	�+��VY�J344���z�N���b4�mOj[��]+v�^Za������nt �gK���M+���9	��4eB7����\H�G�H���RfR Yo\3Z�޸fރΖ���~R�5�/H�Yn[i�V�:������Q)���s�91x��F���m�d���I�C+7���&�p�9u��/^9=6��w�h‡R+#�d
b�4e�4$C��~,8ԦuN�9.���(��m����{l#V�<�����&�������탛<�X;�
�M��]*�ҁ�L4a�,,�����X8(��҅�T������N籵iі@.-�&�bb:Y�����	%�V����V6�q�_zgl�h�.b�)UF��_/�)���أ?�2�u�R��-\8/�-��.�˶�eK��]���w��H�[�J�Ҭ�6j��ʗZa��*{�"
D���ooO���'��\ǽ��UT�urM�^_��}e�T��
��a��U�tL;����]n��$�`����K[��D�j�����˹��l��1�g�;��;����ez�ke��.Q��Q�>��ѥ�H�x��rݶ����v�g���xG�} ���q0��Vp7��
u��	U�Xid4�Ue+�w�����n�8�3� ?�8��f���W`C���,S\�¥`�7����`��N)�����2ZCw�u��X�&:=+�:O_Z�֊ܥ�i�W倓���D�}�U(.N�� pJ�x���	<�Q���/N�:PJ�$�Z���Yۢ0�vMŎ��D�J�J�ܢ$���{������e�BKOz*�\,�S��	��ә��*A�=���7�x��X�իF!�gΟ��}�޹�����ˣ�?7=i���.�.��tN�U�a��(g���zUkUo�I��J����N폧�t��I#�f�s���G���!�KM����퍛䴟�#�"t�~��w�އ��	�3��w����q�Ί�Kؙ}Bȏ�9�m^Qs/���W+�WKJ�V��6���K�����NL�otU�acl��I��mp *�t�Ֆ����.<���U�]%�pgy���Q�X��P�\l�yM�Y)	�f���/ϛ�QQ����ϩ�Y:{���~_�?�7��"�"h����fm2�A6�LTq�s4�>A�U�멱`�zJ�E�'?\�&q�ō��@����E
��;M�<���D��tو����+MMF����%���T#4^�,l#�NL9�⥱H��7T�ކ�Sb!	4n���y�K���w4
#jCq;�F?Q�s��9Q��v���c�NQ�<�U+~�*w�|x	F��q��͇n�+�	�׏~�V"� !��e�����J�-��N4�祼;
�D{��׸���5��0��w�d��2)͇�<�����\}x�G��Z�N)����Cb$�7N�ໂ�L�IR/�4��F��R 2��sq�͊��{�3��I���Œp�
v�L ,�"��Hғ-���;�I$C�`|Nt��������-,�).7��c��4-�F7��a���s�G^F_mVjH?��f^U;�����1�VKV�����ݺ�f7X\�:A4@�|
��3Jl�0��d�b�k8�t��Vv�q1���0蚵D���QP�Fh�I��M	Mq�EPChHQ0�����>�#݋:���M7
����̥�	�yM��A��������+�#v�Em*jF��ٔ�j�lm��yX<DD�%���_kO��)�Mv��
g�U�&O(ܬ&w���2�?��*�H��5Mv��y^_Si6Am�ۆw5I��K���>Y�&���gt�"�B@��'kV=Z�JMR�,������Ȁ�)�pg ����JOy��:%�[�Z0kK;�͔Uj�"m2�jZœx�A�O����A��`��W�]�ձ�ޭe�X������%u
�M��nm��ʜݔ3z�g�F���kE�Zo���J�<�R��M4O'��]�
y�]�����fԐ:����)~����Ia�mo,/9%/~]
�ɸ����l/�l�ړǭ+O�i�{�i��‘��}HS:PSM�s�E���g��F#?N��/��3�v�Ӧ�Z?��N�o]ߠ���)��i֤C�Dn��ǧ��ph�Ʒ����N�n6�~:�B���)@��aZ��̫U�f0EN|�[8g�*z7
#�Lˁg�u��"������Rq����(
#�X�|Z���+�87�x7���Y�\f�@S��v[;�o#?�H�%���E���<\��u����,8�˙4���T/�hE}��ں���IG����߈*�?&��(=��&W4�N��}+E�y-��?��/�l���0t���|�����9�f�g!&��������X����S&!_<��o��dzT�)�RK��M��"|�L���48�r^v�����og�~�BGy5����
��}��I��΍�Bs�j0��_<�F��o,ɘ�r���#���k��7��^�"�P��[z}��u�W����}�Cr�|��R�2��mjm��!�ꣴ�"��ӔCL���Ql�T�Ѳ�	�6I�>.�n�K��m@�x��N4L�c�g;S�o)$T�c?7�������m������=m����w]c�t�����j�@��/�ä�����U2�ou2��Z+Y�S�.��c<,��	�7���ؿ���L�sч����v�z]�n��ٔ���ZV7�Rs�F(���ߌʃ�T�[���^O�X��?���^�����5=�m�!�Vjh�tO��m::�^��u��|b��X�R$�����yt�9����H��q-�%�4�
&P&��ܧ��mN'��>q썦J?�S����j��$	(V��4������j�9�l�U!�v����b�O*��U/U՛�z�Э������}�;âG���I�R��!���j�Q�;�x�j���A����f�Ova����H�M�52ERZS\�tʮI_�'[�
'�l�5��řn=����0ŚF��ۺ�!I�'3���8ϒ�~�]�/�a��j���,ɝNK���^���6���t��U/׳��oO�D�H�E�1Q-��3�|�^��a;��C�G����屖r.���X�s��acg,u��,�[����+�u�T׎���Ƨ�?\a���/�jy��9�'����2��bK�]zX����(�a)7Z�~c�5���a�S�mE�JA���ۧ�I�I��b
�s������k��!M�&��	�Reg��hW#�D�|����@�B�i��L����PN�(��B`���3��B?���y�ؒB)2ߎ�c╢�?�Ҟ��l�\Ek�p.u?�T=b�W��w��)�	
��
6�D�r�-��#
�䒒�h#@�,�+�{4��8��+&��759���u�ƄqI���({����Eҫk.4X*�F�hWPl9���Ѩ�`T. �E��i�b+���j�r�(�Ҳt/�Q��1≃�1I��S
>
�eW��L�D��Qe���#�b5<���w7O��t�]���~�0�bsg�����c�Z���MP�\��&P��LZ�Q���B�v<���ğy��Ĺ���o���!r6gS�b(nx�نK�s��}p����9���1����`��&�fM#0���K�e�o�	7��t	;��_q�ơ���[Yf`&֌_�2��'o����#
�0̈́:���~B9�3��C��~�P��ܘ�{`-N�+8���уH����������)�w���6��ۯ�xE����J˗�,���6��H�q����v$�wd���xq���/�"ּ+Ӕ;��V[��7n�9�l�+��y�\{�uҳ������vyؐ";��l�4��a�U1vu������N� dr����b
��/9}�[���J�'(:�"�jy��IȰg3z\U��ЀZ�ӏ�y�Q�RP�"r��x.����ʎ.���5�p�j��C��Xsh|�!n�1~
��k����H��K,�R�F��0�}�Mo��t����/���N�t1��v��}�Og�����|
��^�Z
H�#\���o��̪�f��C�3��v��u�?�U f�l���)�	��i���j��I��{7D1�).���?��Eg��������Ô�aa3��ղ�	G�Ͼ��'�3�0	g;����b�z7�Ñ�&�?!՝���Ա6��E���5���6"U]%��S�'��	��Ee�=�����L���?_L݌S ��~��I
,|�ٖꅌG���u�6��d�)��1�ϣǣ�v)�G�]�	؆�#r�؉l������$�".9�(M��Q��x�€MR�"]z�{�Ԧy�9����1�D`J֥��1�3�wΞ�Z��q~��dm���t�"nT��ħ�V��+l}�p���G8`g=�����g>�k�%��-�3�[S����'5�f�6��u�W��;��_�[� ��\gUBS�_X_�����/j���3�
b�o����iI���l����i�s
��))�u6���\S�:ALu&a�{Q���Q�O8���1�;�(R��h/FK��#1�X���?�5�d��>�/�bgs��1]:X��� �U�����E�j;v��ס�
t����м"o|	��NA@��ģJ)^́��{LV?��T�>0m�b��Q~�(�t+��QU!��Ns�j�];����.�0�:�i��M:�Taʝ�?8)42N`/2�,ї���ѢK�N�5��-��?�{���^ ��S6�>�Nj��
��b�[r�%jno<���k$񨫫��'�1�y���în�"�5JAM�2&���;^��|�n�c~����_Հ
��R1��2��B��Arc�E6��|���<-�s�npZt�􏕾2��h��c&.:���Z�X\M�Q���(�[�\#���x4
S�r�<�.��̂���v�SoZ��A�P�4
�P�8s�q�	N����nL���.58	��ڙag���Gx��^A.lK��&�˾8ѡ�f�!N�|��꫚���KN	7"������|O�S�vH�"��;=�	��"��:|���}�o�%�,�R�!h�����FTj�o�ޗ�;n@o|��@�H`�.�g��5a�m�|�<�}*j�4���X�S>Er�0�¹ӰSv����kij`l_�Rڍ�����+�z�x���[�ф�+��hyQ�v�T���f���b��y��-+��z�_٘�f܍��
	���W�a �)}]�j�BxAz���x�)C��(t�,G�¨ϸ����g‘G"
�~uD�S&rQSbX8�9�/���
��&�!���X�Y�y�i<�RcdBeDh頒�	�F��N������m
&�*�Ɇ��C>��C
���E�X$�u��i\�hc���w����Z1�j<�(�ڠYj��c=�f�;�O��.*>R*���$;"������%p&̎j��8��e�6f0��r��y6��q8��J\�����Ч�sJ2tGaC3����3e�[`��ն�굁���J����tal�ۛpJt&H,�m+��E!ou"zz^
r��=�g�Ls`�,H��D�%P C�u�V2�L0Յ�_�N��9��7b�}���x���*nKb�c ִd��6�:HTh:��F����D���k���ז�F��=����Mc�3[��ZM>p�6�<�	v�eʣ�֟.)8�3@]��;�l�rI�l7k�~FƟ�Y�x�-�+��y�0�8a�㵫�����^F��x�Li'��$Ɲ��С���\B����)��CW˿5��[X�w
+�ڟ�������Sןi�}lG*��ә�W�Kθ�]��\�-�p��9��M�aUk���T������ �k 㾍C/�������s�:9X��X���("ڀ��
jZ��G���`��+t$ū�y3��/�٘V��D�)����w%��G��q:(�2����]��l���m�D�y�.ș:��M�@���0w��7�[�"Kvd.�����-!'��߳+�a8�3��#`�TY#M�}��FT$��'�F�}�f/�%��%�#c����o�b�d:mL����i���z0/����Y�3M>�D�w^c�c;�	g��h���)��yl%�p$R�W�1݌o�lm6�(�7����OȖ���I��V֠��B%s��n1�6��l�/0�6o�eH`�+=��6�e�s��
)
���u��.�Q�~�Rƻnl�..{G���qvb�n�.r2ҽf�#�����Kvx��:N�Q�h�붇՜Ӧp=����;���6��Ř�NW�@�ū��b&�=��:kH�!|��@^:ӗ�.t�QŅ��q�
�K�RY��T�:R�����gf����o�)�+������Q)kTlHA��R��S�֌��.��t��7D�?����\����j�ԙ�4���~Bd�i����V<�k��rx�?���P[�*P8k���s�p>���wioFo��/iqspac�*Cx4�$H�OL�pRMcz��b���K	�O�^]�
!)b��=΍u�W���ǹmރ���x�`�׋)}3q�+w���tꍬ���}�C�'^Ќ�K���敺�1w�=N�M����
��� ����~X�ڨÌƽ	�uyy���ju(��
��x1��4��:�O����� e���EX��";�vs�j�"q��	&���s�g��5b�a}Y�V�{
U�!�
.�@g����S#�0�[a�a\u�����α����Vy�@�Y��fU�Aj�R^�n�*�Ӻ�[���Vq�@�d>�6c�gVi��w�o��0[%s��,�R�'E7�	��*��X�x���H��R�q�;;FA�}]��:��7�۲X�Y<�ʠ���A8׼ϻݮ���i��a=xs�=el�D��WZpr��v
�c�F7ެ���S�ȡ�&�O�NN�pxzz~���ѐ��q��>Ћq��'bs^G]7o����߁m��F���+Y \�h�uQ0|˟Q��ؙ{��×Z��_?]���E:W�����0�d���+�~z�eyx�~�-M�9�ݒKBG��pN�� �aV���h���EN�/5؄�䯞����A:,��Q��	}�μ�TF��o,���J�)؃0e�dҴt���]�&I毞=�����~�
�ɳ�������TY�d��A����C��`�-����*H��6ݲ:��6�����%�W3�sc�M��K8���M"D&"��I#���%�q����9�ֶ��`�Қ7&��=����o6��p��,��Q���ř�v3��̳}�Ɣ��VU���~\̕B�����O�.R:�WYkFc�,�َI�Ű,��2���s��\R��s�d�d�&�;O���H�J������jB���m�ҚR���v�؋G
�9dTA�J�q������Ci	��Ƚh������O�@y�­|�`�AA�������\4�|%=5��e\Q)�Eر�hu8rK��x,�Z��2;��̺K,���Y�vM�<ٰ�U��R:�++�V����lG��R��l^��A햾U1��[�*t�28�KBH���KR�h���?7���}�?���Mm��TtX�]�$ܓ?n,CO{��v��[j�Yu�>��n��{q��kN�y^��6u.,m��Y�pp#�@�ŴtyR�z��
������'�*����wa�Fdφg�&�cy��o2�	/�C��S��ֽ+�����#�ǘ^b9��.�ǑôN<�H("�ԛ����kr��_%_j<G_{�e���eD��]dž�T��*���q��~�+�\J͸p�0�e�M��L��3�m����7"G�+��B ȗIeA�Eտ�*�n����^V`��Ԃ��n�e��b>6!�ih+u�0
�>j%�7UE�x�:A�d��Jˁ)�eI�R�8g�b��q���b�\*
���s��z�Ԟzj
}�o��;���5�Mρ�E@W0hO�$&�֙KT*17[e�Zd���t�U�����m�5c92��:P��?�a�[s����'�ʣ���7=W@���^�Z�c�.>HR���c^m�SXjk`l��Fݫ���G��f>�Vv����J�
����gD,��4����I���4e��4i��	Uz�Q����$�&$J�#0�5���tϮLW�y�L���|F��xj��`D�%�l��N�
8�0�n��k7�BV��6�g~��ǧ0��l��b~�s�)2>�t�D9��r��S�͇�Yo�L6.�E�\���i�����H�bJ5T�
L��r	����p��gq��*Y�d�.!�n';-g�xu�}ʙ
*�� �L�	z��5������OI_����D�ӕ��jp��	��'ix�a�p
��:�;��M]�o�R�n�+�2J8�C��i"Pp�9�׉�(r�����N?a��"�%
�H�@YQϤ$.po��V�۾*"��&7k�t��3%x��]9~�O�f\k7��vG�q� �3c1L�ЌdD-�4�'4�����M���)���۰巋���e/�~�=�rNi1I�1�7t�����U0��ߔ��B
"�Y�S��I�����]�rp*&��(-���^�)
`��B�/4��JPޙ6r��ȼc���`tF�R��0���Iw��}��}���\�9�&��f�~<�y��ծ���2���ϡ�z���j�9��Ow��:��%�ӅjL-k���F��w��բ}֕�d{:�������J*S�1�#:�����Cy�XZ�
�d��v�wa�w۽}f�,�y)��2�n1�`�xd����Ԕ�K�:~ ��< EM�Ci
P�tM1*�\�u4�뺋i�a��h��:���^�[�W��	I0H�o��F%~#ScVa�M����^,׫��1�s�S7��o�UѦ-�rb-��r�B��B����C�mc�.&Ht f�J/EsjF�wÓo�m�'U���ͻ<*�=�@l�.�8�����Er�dJ(?Z����T$����kB��)�`������|���;;nZ�A�Op�X���+�^KD�z���nt���
���҄0U@����ɠw��Z�����
_�$9B�&(�xc��z����6%�PJ�e�h�k��>S�.ђ
��p.]��ķ�� 9�6ڭ��+�
[����Ѥ0�Xiu�f�;�?
�O{dQ�����@�>�^&��Sl�J[b��@6���"j��v�;�;N��\�ȍ���yQ$���j��ip�o/
E����}8���N�ծ>xч{�������1}O�7X�c����e旊�3�g�v}�hj��Փ��B�I:nƼv��k��_�5dYL+*
q1��$�Je�8
�P�"#�
+�r���:x>�|��7�t!�hwP�%��9���]�eD����ѿi;�k�(�_iQ�8Fa5Ce�Qb�k��c9��>���?E|��f(��9^p��
ś >�Il\?˖2��7���)�S�o�j�"��@�z�Ia���y蔓��h�o����-҆u�����$b�5U���܇�=��$�<�HQ{/+D���*x_=��\e�O��վ-����?I�%�xP�*꣇����㶣�2}d�a�:�59�\�e�I%ijAhA
��D7�cy���Ԧgh2���1* 	���0TE�x��~}MUg]�y�ª,Z|�w�֛~M��:ӄ�E�b��s��ě�y\��ȏ"ϊ���xz]�T���@wt�Q�p,��?o�tl^㑩p�|> ���o�'����ЈT�(Y���3]���5�����F�F�����;����?S��f�6�_=�^��9l�����J��Y��m�'���Z_���v���[D�l�+F3D��r��!���3M(���a�����9�S���s49dL\�a)��x��5�c)A��<^��9�9��b5}��WEc�ۣ�)G���莞���:i��H�+�|3'�F��js��g�Vu�x��SvMA����?��y�(�HL�=U[�_�����n@3c^�O�[���_�hR4Gñns����6�$���y_�1o�
����B����=���c�0�U���bz:��-�1����"��QNc�3i�K	_��(���Xy$;j
�z<V��c��G��F�V��!�I�>��ǎI�'I~:C?��w�t��m�2�>Hߓ���[9}?Ub�EohA��X��[���1ƙ����O����3�����
�b:��bn����K�S1�:yPXA��B̮�e*[_E۔6���	��_Ke��Tד�ښ����g�um��įQ�U�Ph���ǬH5���?���b�Z��uX���hCiȒ�,��3���<�u����]-�i@�m5��/��`?tX�8�D�/��I�Mg��
��׼��4�0�.d(i'ǟi;�+=0��)K`��5;G��j�KNw-q�Hpk��w��vz9�j:�Ӳx�z�k�~2�8���ga��+	��@�eS�yL����sD�������#�~K�Y�:J��ԥ�[��l�#�U�{2�a �+�A]d�؊|]]'�S��	�Ky����|���^8�j`��)�B[6*K�<	-ls$$,2*_�HY��^_-���^>L�v�Cn�6��a]K8��Y�"Ņ[X	�3F��B�FSgg��D�Fl�y��f�&�V|s�u+�rE�ZI�2�JTz��g��~�$�R�MD�iXE�_�DF�o�l�=�O�����Ża)�ω�Xp���DS�tꍒt�h.F��=�0�.�C��u��08�`��wM!2����rq�J<��w�����0N>,"���C���`�b}%�*޺E�)�����؅�Wr٦��Ek�ݻr�>m��ؾ	C�xx\�1������Ky��O�O����g3e3��.)��q<��"U��T�-�>-H�wדּ���7�4�B��9Wp��Xz�J#[����ӟHX���ÿdh���x����i ]�*��a�'0�&���ݾP�y5d����S{�1���"�:^:2&����1,�P���h��yK����"oq�fp�U�d������{w2����1��23#}3`��i]�w�"�&��|�f�D����l�)��Ӄ��wb�k8õ}���@�5�-��[��LX;�<zHA��{_q��r�*7i7�
b,�����G��7x�i��3�C�bf��Y��_� ҭ��cdFgZHa�,w٢Ԧaa#�bM��l�q��l�Jbd8lPA�`���8�+�:L��w:�h�?i����0�*�D�,^�J1`��DŒ7�N]?���]��V`3��5I5T�	U*ذ�I���6+d��w�l���)��p0��^���,k<�#�pNG�OEF���6����<V5P�=C
�q��l�J\��ګ{�u
�T�s*��^�i�5�)��6�'n�,�!�����O�p��V�O(lAL�����n�}��5B�S��=���B�`P�/gj���?oE�"�5
��fpU�j2U䜡�em*KU��N~���I�_U��S�~��8${��(���Eջ��y��^�L,�����J]�؃�<=��Vj*^��u��V���)�IR����>,^�ɯF~s9;��h�շ)���zH�5+-(��ȏ�1�����FW�s�I~D���K��(���&V,��n����c��9#��]F�S��ݮ�����Ŕ�J��|}w�o���n�	䉯+��ҵ���8�7C<tdn�x�*��p��A��M/�ھQ��"�:�d��0�Iic�	x�u.��A�.S�h�~�PŮ�5��T�S��\*xn.]-�4�at#�ͳRp3L�.�#�h��Vǹsī��ÛKnP׺�Z6u���[m���?M���f(�-�ȇ>;ڝQŌ�EI��i��pJ�-�fs��B�MT���=r؇q�����!��wp9`���{�Z�u�E��-��"���Q8��r�o�z��ωd��O6B.jٖ6z�9Ѯw�`��ͬUոMA��s"b��I}[,+���Y�Km�>в/��-L��v/�G[*�5Rɯ���S�^��j]wJ׸��������÷�:!f���d�����p�c9�	ϩ��a�u��r_8\�jE�ؤ�;�7�T(=��v�ͬ�q��|.Ig@�(�Wq��;���U�|W3�{x�0��GY�V���b<��${o�S��$[��K�lE�ۭ	j�G�(�o�~���W�~p��ӱ����J���S��6�F%0},�k�a^h��u��o0�������wF��MO�9&`���5r��j17ܲ%�;o�c=�@�K�B�&'DZ�(��F�<q���쁲<<�׾s�Ƭg�
��(NB��.1�O�q3A�8�=�ѷ{�\�n�ţȟ+��~r�iqՋU4uݲ2�������o쐢[�-��sҶ��u�G�����6o{݂{/�٦c9��ox�Uێ�1�3�s®;|K`l��[D��7zʼn\Ш�kϣH8�"l��Z��ڠ���=6fW'WйF�C�tP�(�!�cz���֫�!��X�Gm̍b �RƳB5Z��c�
���y9�jPV�r�5��?�7'�W,Er�E��uCI2y���.bC��*�^Q�����)V�\�E���EV-�e�!���^�ڙ�B�9)��r��]�k���sTh�HC��������/���_�
�(V�^U�']� ����WLF��[7oM���6��+
un1��P�y3u^u�q�?Vt"���$���x�8�W����s��9���&u_<�hj��?P{	�0C�SOնʹUaGm�i�QC�lC(�Q��U��Api
���hė�zrWh}�@�����i�
`Q��t�G�$l�Ŀ���15klj4�Y���B@��0�`�I#�;���T���NO;�Q~�tN��j�Fzqx�c&ߓ���)���_�+�q�^_���"	���]	×P�B��hȠ�D�b>��$��줾��3��aS7N,��N��<���8Ug>W+BC9� ���[n�w
C���:~��`��e�W
��|B!Z����Ѩ�����vz�����7�dO\�X
� 0��E�5�����D��WG�~TOI����7��nIv�Z%C���5ݱ:� ���`�j'�X'Dm����%�J@Eѱ��~���)p���u��OzL�<E���	)I�&�uԀ�3P�Wp�:
�a�x��ڏ����d+�<V�||�%DŽ��\��u`�4�_YF�����U��3�Źȼ>���u�o�?Z�CO�ٟ՚z���Q{��3I����I��>�5�&���B81���kXċ(
OSԉ�u�!j��RC�M=�>��)c��a
�0���v���ڄ�;#�Bq���tTP���&�s*�"s�R�U�
8�����b�%��p:^:O崡�ה©�Õ4NUҭ"_�d�%I�m��T�92`C�sI/��)L��}6�:,�#��r��m��a�K��:Z�f�p�I8/i=7����2v�@� �uZr
���d�B�<-��
�ڏ�8�xQՆ�#��ʲH�%�Y��K%���v��e[�޽�𥂭Ĭ�̧^�ϯ�z_�eq
�'�i'��cS�zb67�Z[^�Q��`�2!�M�ZM�ނ=<�׷�,�r؏M�xo��s�!��5qK�[(z
�7^�,��jZE�뵨�NiZ��ip��n�6XE���Mm�|�X���ʛ��~��>�zѤ�����b�d���%��m��E��MFx�ɾ�nzQn����c���ӗ����?Yy5Otqk��m&�L!�3k���7�E|ӈi� ������|�]�d;r��VCx�[y�i� [3�(�������84��:+��Q�g�>��|"}P!W+9a�4$,�Е��ք=A�ӆ����K\�Q7EU'�
�q�/��P���'�o˼������h�����2b�clp�Ba��̊!�<u�6�
������񺎟#mG�}wJ6_ۥ��|$�)S�+NT��#����//��m��T�2h����S0�a!L}�g>�U�{6��S�i^Ħ�,_�7�������C��|[q�<-�
�Z��j{X������j�ɽn-=8\��e���m<kS}l ҝ���5O�oE�tᣆ��]ţ�@p�L1NP�z�kr�hsݤ�Z�o�J5Vt?&����^C
��5�5*��.5#���*tLJ[C�"�Y��������vD��ˋ��9W�r}ҏ1�2z����Q_�f#�
��ǿ�X�v�	��C���(9�ekē#Ќ�=��W�Ԉ���F���/y�k�(w���|r�D�����0s?b"�3Ԣ�Q����
:�B���89 ��Wp�����
j�k'lE$���Dl	<���bw 3q��M�3�M�kg�L'!J/Xȸ?'�k�"\?�H��
�����}Q�j&��g鎩�t�/��E,1�6�w�@��ƈT/�[�kq����3�v��ҋ�w���N�Љ���  e�p�����q�f��r�oF��	��7�2$�)4�V�9�ՍC��1v�V-�}����Q(�<�!��gǙk�_�`	�����bʙ*�MԘS�#��&�=)="�G��|V����)c[6��>Πނ��<'ʷ:�e���M�ܞ�G`�'6��ػZL~�\C
Ԫ����q�w�L]	�� ���i�7,7S�딟�@i#ø�������9��TJB#�Qӵj4VӲpS�f�N������'Z]�뫑{sj@�t5r��3t�Z�軠�
X������t�}3��n�k�t��M�\?����_tA
r�q���iT��N9J���WƗ� ���p���j�&婠(��@���M�N_
�d�a�����Z*:iA�<��J�[��Y �T	��%����Y�Q��@G2
�VOj�|f�&�po��a܂��s�3�R��f[�k��B���c4υ�,��d��x>u��X�C�-��OuAڕPx �fX��^��wW��V�'���خ���`JN�1��Д��ajŐ�uy�
��ЈD����O��kɋY�h�`$V���t�S�<�@Ɂ�B�]'�R��[�rKnC��1�莈�n�g-M�gL�|b©!M�t�,wFV�!k;ʛ�P�v�Y���iKc4�&���~�$*�Wb�*:0�7^��T���J�z�K�tc�Bݤ�t����&��<2��@W:�
cF�5���3ˮ�}c��m��'��:��j�$��*N��b��i��uğ�SOؘ|OF�jFV=Z��"��GG�Ru������]���6o���O��`E��H=s���FMMP�MD�gX���E��j���8΀�Eȣ�1U=�y��?q8��F b�¶�:ud��r�m �/��v+�~��j��+�|�輤����W8#�=Z��g��R+Y㘡���탟_���tF,7��L釱~�ب�T���3^��m}Z֩��˞!�7=Vl>�x�n��W�L�K�L����VZ�X_:)��U�ԅn��6ߢ��MeX���E��5�'�Tx�>��F��u�|T��&.=M��^9�=?~w��^:!�"Wo��;�`��V�6)��AR��t�5�'��])E9*�р�S��R���Fd��^y%�?��T�C� s�%�s�\cff1��%q�be=N9W�d��\�� 픚NW�b�`TK��1��7�c!V���'D;�eh>�?y�-��b<%�tTC�XW<�8^ Ĺ`�.�� ���&�<U�5��H����~�����.���4�nxr�Rw���n��c� 7����h	��V��I�k,_��Ϗ�_	�	W�����ͫ���W$@_r�\4
?�
=�ڵ���w�<��t��X��0�?�Ϯ��v��a���5��1�(�C�Ć��
]>C�mR{�A��J�O��N�4�&J����3��o�3�O�e����%H�d4�h,��Uͣ���,�:�*	?zA�;
��fv���s%ꦓ~L�O�?NO|<����?(�"@ώ�H\+jܬ�P3��R15�Wב}�܃����`b��p���|�1�U)�L���B�u:&\�Ug����
�E�-��?8_�w�TmgO*��p|��Ͼ��/�j����Z}I�
��S�7�H����>��A����I�U�*4W�"�z"���=�t���[�=�"���9co4u��e�H҄�肆���pT��ԇv�L/�|o������Xi���J�d)�qE)���65���EJg���I�*���;�4z�E�I1~�Gvi���7�(١�D��/�xo�k~l,2������b��r>V��dS�X��z�}�����+;��e=k"�Ax2���o�T"����:��TJEZ+�
�
h�
͗�#Գ�P�V@l�O�y�;�K�!�/MBǩ���S��Q���qm�=Su깁q�n��܉��<
�p��ԽǤ0�,���ǻ{�]4���f���e�|���HUNJ�
�����d�%N��q���䜹���6(@0�#=�m���e����8I���,	��3�{�H
-3��CSO���}���ju/����¾�cb�z��[�4�,�w�B�sN %����졁�������xK\���7�LX��{����̏~=&G�7|�r�4��4��ty�~Me�@4f��o�CcTGK�ǒz{t�Q�j.���WW��4��ת�$�Ӟ쪌ë�#��7�<�%v�f��S�!���S����
��u�D�y &g̓�s����M� �Ž���K�B.�u�
�
UӣpG���U�ݡ};��[5�2���]VG�_�s\
֝j���F��l��
�	:��J�eK�U1N�6�X&J�t��T�"��U�uAϊK����i��/P�u[�l���'ް��S�פ;ŗW�>�K$}DS05�eA^��M��׬_��I�F�P�yu�
���ns�"ͷ��)�RE���������A�Ւ#�}�ʽy�IP�Dm�:��
��8�<���m`�1M��>xD�>�X�m_�3c6��{��U��3�v�����r%*��8��bR���$�Q.��i(�M�z�Ok��[��J_��e-�d���3��E4��ҹ�H,���X�����	�	V�����I*��T����@˟"}�#Ԛp�GH�O~��ɍ|�>�;��S�����F��UȤ�# ���3�ג�d~L
4P0�Jm��p]af�?�u����ݠw鸯����?��aXx�u���?T�{��(�嗞�il
`P'V��k؁$��G]�e_�a4��fH��c/Nb����7�v�]�0�c�:T��rkƪ�6�u������Gz
,��ݱ��J���=�}���W���
�;c.	�#^�4��9����~�w���&�gm�\�S���?�^HہϕZE���t3�d��aaW��^y�+�����3ܝSO^}���ϜC6��C���X�.���R�S�E5��Ԝ��(���Is7N��`*Z�|N��on�T)97)���c�%��(�:u�$����N䂦ĥ���VY&�V+�~|�E[���V;{�
�����n瀣l���Ë�Er���t�$Y�'����ѹ�%�K�r���E�c#j6��{���m����_����tJ>���Oy -6
{�-X����1@4�/h�n�Z&�g#K�:��g���
,�rb�(��UWB�7U�|~���uH~$�l4l����i��H�BLcH��d-5��5�8gU�5�=ej��L���	��p�+�~�%)��C)�^0
qw}(�z�?U��O�:�O�*z�˵N�R�\�.��S�n�����14.-%�c�Cr>�.O�Mo�Od��8:��+�Ϥ>ȫ�L�K��|.}
�!���5Xfx{p�ĄƯ������N�{���,�%��V
�>q Mt�����t'⭤��}���-��B-��@씄5�h!�ٛ��Hm�gA4�Mڀ���Kn��ì`����/[�}�bO��͠� ��/\�H4/�-Sۈ�#^u�*`�J��;do�>�~2
���91:�=�0)(W
D~�N�(\��l�a�h�IJ�G���n��g�lJ�����Y��U��y��i�>�
�qDȈ���@k5�eP�.�R
|@>�%��<&��e�a�f�2���9�d��w\����/g��E���Or�%9���-���۲=���}�Vd����R��;��mlw/�Y����
L�8pd�:R������r���_�Zݾ#��frd�R��$��h�BH��xp�7X�Kmdۧ�t�Z)�͝Ϳ��q2���ݰ�>�
Q�H��-͙2�]mH�^?1�}¨ΉK���x��J4��ps��&B�R��5�UD$�xX�=W�~�y���$�Q8�{t�#�1�&�]�/{oz��R
���o���q
`�$*|^
��GM'[SZ�����zY��w�I?���W���_9R6��j]"�\BC��G�@�i�˵3s����y���vu��p���N0�eǍ����%Y��*J}�̦��{��ņ��Vm�-��k��ǩ�!�Ɠ�4���U�D�S�H��7#*p\�+�̧cE`OG1(
�'�띊GO����s%P��5 �2��P5�%����ː� �Ξ��8��W����8{�C뀉���~�{;3
�ꞭoR�>��^�p��s���W�v���~�ܥ�Wl�}�9@h/2Н��;�x�-W���䒣�a�y"��ʷ�c&�K�t�]�{~Ҕ�t\�y�tx�����?���������A����.Iy�-��ay���JډT�p�.�:�>H�V;��}0���J�C�Oa�
�RS��*M�b�,uDaOc)��pc:�#�iՕ)� m���~�{g��_`���,�ʫ&C�
����iy�;��xT�7H{7��@R��K� ܶ^7`[��M �����#wʼnI�!��1ߋ/=)p��O�,ZC�iI����S
Z�[Y�̖��"FT�<w���qjLFJ� k�wv�deE�
Y���n6�dYSG�3Rhu��X&c{��������7�c�>��Oa$���hR��8u,�
a�OzU�H�G�cS��޶��'��j� Hz���K7�O�?	w�t����O�OJ��J-�6�����~e�d��7�5�^}~�|Ng�UE��{���ɝ�c���0�^o��ߕD��#�]�K��p,�Y�o�P��pf�ŋ+5�J4t;Wx�|��=��2B�7f�I�N�.�Jk��)���=��	o�
w�Ӕ�g��H[5��!�4ײ9�k�nU�Q���Ƭ�Py�e�2�t�-�ˮ����ߥ{�$�b��}�@���O�#=0A�z�B�s��&�aB�7�3�ǯ�'5�F��&6p��zxZ�]�b%\�[.�y�&��l�P�K^;��^���XL�]#/����(�7<����̽(�wFn�tfk.�I�&�����c}��0I�2	u�w��pV���)
�F��$��&k˥l[��ײ?�jkݡֱ;�Kw�� ����hB���tZ���&w+:���IM�� ɤ���6_�v����Q��K,�K5��S���3�8������amx,*�������
	�ԯ��4�7�A2��{�z\�M�z�h���m&��P_��h��-i
��y�q�ZM���P=i٬˵�{���D���t�;�||�d?ߛp6��pyRrr`��×mc��%�m��yH��%N1R�X/8���J�S�ju�O����d�ࣲ��-~6�@{�����Y|����&)��Q�����(=J��*��n�Eo���p���;q�>�95�����B�U��J0D�S\4����>����5�In�Җ���UU��2�A����Kۭ�4�%
�����*k~f(Y�:��u�\<�Sޑcq��_Hw�RNXm�����M���+Y���ϲ�@=����W.��5�]M[f��+G�X_�U>u���p���{����a������*�:��
��鍋6��NWNmC=Q��K�g�S�#��\k�.�q��NŸF��R�fU����J��p���hͮ�#w/`S�|�o�t��J}����Yq��Ǹʳ��� �ܾt��g��X�2F�٘I4Wl�Ax4�	
��ğz[�躂�K�{��v�,kd�<(�� ;r�mx6��G������[�
Ɣ[�R�D��D�~���\}�C�
^{	O?b
O"���c�:Xs��&
���E)yT��M�*
S�K!l�?��J��ڨ�Z����8��
8^�wvZ�M�m 8Gc����ǁg�G�"���5R��K���\o���x*�\3k;�V/Q��$%�׺�3�nZ4�@��܍K����  �L �����01[+��=����)[7�q���Wd����Q�����E���&����ZZ5��(� ��R���6�?(��N�eۡ�fmҘ�Y:���M�8��t[u�/��ˢ����G ����;�xc%��x�ME*�	�\����7p�����r�CXZ�yO"QK$�0l*�l[碿�+�GZf�~�|T�
ӧ�z���9Tr�S�e��S��i��F�y���l��ǡ��~v��iqY鵈T$���:,���!b��;P�n	/���ŔZ-k����̽G}��|1U����hQ��k7��B�A
d]'Jyf'�^�ɥ�:]�<����-��j.3kn�-�a��c9a��Ÿ<(S
S'��v�+��7�{�[��t>l.,�4��a3��+�r�kXc��r
u��I
9��X����)r�(���Tk*]��
�ouImJC&��;+��[�'D�xGc�xw�q&:*�@5��"_�j��(فwWr�8�|�T�P
��P�7��$[e�^��8"Ct@�aJ���Iw�y�{�cl�]̧��&�G4�`��3ĝG?�dl%#�:LFӠ�T6t��Q�mP��cQ&������f������j���R���U��wY�8Ia]�oA9�8d��?���)�{��&)@�}�"�2<��k��b��nÞ+�8�� ��2p��vK$��'
;�k���IFM^����W[s���t���[�Q)[~��k�E*5�9���c�<#�lQ��]�����c�l�wy�#F����M�4��]�_��<�b��ߛ1>L)�̤�RΏ-9n�#��Y39Gh&2����#/��:�����l*��a��Po�6��CVK�>C[Ն��6`���c[����]�"�w��0�6�W헂��\~KN������������*2�E��c>��Z�K�7��aY|��o.��j�،�C��ֆM�(({�_se �[L����۩���O����ޮ�C:z���<�w�p��/�_E�'z<��@w�$�+w�H�/�4kߩ�'��	�/����R�07���'U�Mj����ϩ-��з�F+^
>�s�#��/t��*p��]
�i���D��Ք�N6t�p��X�#���I�b1w��8v��������P���.���Yä�o8�>���#��n7�\�qŴ�7����g��`M�+w�Ѻ��Tdݱr��g~i0
�Z��5����qM���g^��h9��4�x��]	���U�k�����,vy���܆�G	!@\'�3��rGc���=TDSU#B�M���ER#~ ��V
�h�ҋŒn�J:�h�ƽ�t�r�ټ��:��A�u�Ҹ~ K�j�9��>n x8g� */�sOjY�e&����
ٺ�����1�W�~�)\�m+AI�\�� �E���������`��g\�VH^�W,��UN$��(@J�����E
l�5���&m��0�'>7�s�+�c0Cs%�PL�\��K��K.c�q�"�b	������Ѫt�E�D9r9��=�eK�	n���Lt��Q��dy��E*Ő�q�v�i���=j2])�Խ\I"���8���*�Y�E_��=�@j��+(HCK ,)���.�sݔ�N��\K&
EN��:^R5��Ŭ ^����n���؃#Y8֎�x�9� �:j;����Oh�9��*L?8/Tg�`���ҥ@d}�F��C��}�uK����?M��c|�IS{�)��7�3 �7�:���gGn2��ԟ�<^�囟�pp8�n�[g���48�";#f��X�u��\R��+o���lsd���Q��T�����0ݪ{����ğ�i�.�gW�*�L�Y��'?ɝD.�A?��`���=���;��]��]Z��살�U>�r#Q΂t$G���TL���`s�����'P\�͞��F�9�"�~:�o�p/������i��
�2@i@���#���!&�1�9;3&��-�LN��A׎�.:f9e�}-����ɑ���qb.�;タ��y��`��Q)�\���zW�殺g�X���	C�ۋ�L8/#����m��{�r�R]�@���W���]>6v��>�d]7��&��v�B{
d��-��d�A�'�|o
����$������Dr��ްF���J#z�����2�X'_�H�n@$�aу���i�I�{�˅;I	��ZX<Cw��u��d1R�G.�/F5�L¨��.�~i8[�&�[�����@�vl@n������|�us�2:�`rm���%9
x\z�/p�8���?:���H��{��F�>��҈�XuH��5	�¹Nj���U�Gż��ԏ��KW��6vW��6��N?�X� �r��
w���Oi�T�u�I���`�c4���2=�!�ڱ�hK�˰q�)V�bm�+��L�x:���&w��P�q�R!O��{Ax�)0����rh2��1*��)�W�Qh���Nz닮�
J��I�#��"!����6��ώN���>���-ٷP��-����6��߳�xR�6X
^��]ͱ9ǚ�X��,)C�
���L9&�[�W�68����+7lV@���v7f�k͍Y&O��Ȥg;׵��g�Vb��������n�}��O=�1�t�C�93�b��fFf�V��5�6N�֘O�N#g2��*�E�6��ò
FW���Py{��x�y�@?;΋W���F,�f��ׅ��(v�����,�$M}�;�f̍��T�x�ˋ͡E9�p����Ȁ/D��w_v�o�#h4�8�o���㜥Gx�i��a`��:�ֵ"%�~��?������[)%�,��2g4�m����,�S#�t����o�����Cc;�Hʀ爇������g`�+/�D���٣��
�2`cË�@����ڋ��	]�n�a���#���GՖ7���E��YB��ެ�*���!���s]�cѠ�:�/n+�CE�C�+$˕:F��.՛r��m~�ة
2E'�d�mjsD��S>�:q?I��kB�*�BI��(����	$��$�d����ϔ����g�`��3�b��x7K�DY����{=���F#y�yk�T�-��O{Η�#Լ[�1����F��_>�fr���%��K��T�c�m������|'c�p��®s��T�:���0�gG*Q%%bĄU^Qb��ZT!��r�&��� ���KG�Y���/�j�t���~���԰p�b�I?8��j�\C�+``\XS�."G~�Hsg��� �F����5���w�̽��eIԣZM*h�[��ď9�nx(
E��+�ׁ�}l �ѝ,���
&����
E�杯���^��Ԕ��h��9X�sx(�Q2>
���$�ʺ2V�`����s�.'��y�M���P��5�+������tT��rI�uWA���P>~QX]���bygD~n�nq��A����1����U?$V.�jB&8Ŕ����/�~8�x�Y:�4ˇ�f]�}y�Xe�|k۔�Q��f�	z���J|�Ά�0ۍ�
,[ܵ3��3�ƛ���U����:��݃~�0c���'h3&0TeЬ�x{�!/0/2��l|샍|�vT����_Y�o���=��B'�g���:��rjG��S8K�f�ŷgaĢv)ABW�7<9��2A������媈��0�ճW�1|�D���=�B���v{|k��f��� l�%;U���͵8��
m.u��
R�����x�(��a�TD�%��;�:�h�X�����$�k��8����ۋ`S�е
5}9���V�[��q��T�|lN�{��"����'�ޜp�*$��֕s�[$s����Wy�5\D
eIr�/�{`�M�%h����y�
;��(cʇ�xr���MF7�Dձ�x#rU�9�r ��A��">���;�k]xҭ���E<�F�9�b X���a���yԫC�K�WG~zv�6���v�u�\0�묇
A^>F%�d[����ʃ�F
��vl\AU�Zv�*|�k>���7<9��jW��D�,��&�/\��Pe�CO�s�^z���S��%�6|�y^:�X��4�!VŖk���s�`?�-L���7^�r����;jNΫW?8�_[ʭ����ߦ��l.?�w�tt���/�>�ӱ���[��ZZ�������t��ME�r~�C�
nr�m��
�K�;1jP��0��S.�+�j
��FדKH��Фb)��.'(b��s@e�T.�������b�N�QS�2����q�F���"3��K�kt0�J��%0�)�k8gp{��+}���}q��y�����������N�5V9���ț'��B�X�>��~K�a<�$qE2�w�[$#��Xx���8��v�ʾ���k_�U��	����O��9�::G^	SgEs�r�y��駒},y��Α#|׋��"���d�|8�Ec�rѕ��$��'����oͲCo]��b��0�q�Z�h�;]��C�h3�q,�CI���y+���P1c�%R'N��
�)��N����,|��5�Ȅ��s"S��0�.����L�Gv�iI�ۦ�V�-38��E�%#���|�߿~�ިp�i03��a���zr�
4���lǥᰛ�.U�ñF#�/�@"4��Dm�]{�Q��iz��{{O\�Ӣ���"�lLx�є��)Ix}(�(��a��]����d���Xi��3v�h��Mg�)��R�{k�W�t�Y�z!�Vc�����#�����A�x�9��<�+��l�X��.���4V� O��?�%į~��G��;q�h���/�LI@`�2r�$���+��T������B��Tl=�/SQ��LAcg�Z�b�
Z�� ���W<_GT�P�2Ձe�>V����IR3�Nm{�����P�+x�ػ���&�J�+��W��
`�f��h�	��6�^%�_�xR�_��t"����b�r4G���;��J�|
j�°��hào�g�2o���YC\�N�
2� �a��}����zg�O���/rb`�T�@$�nV�=h�;�p�#�~a��0���޾��c�⿘�J$<#5=C��=��e8^�����)�zא�3�xI@�@�3�RR���m�}~ON�v-3���V!nkx��HK,v�����ެ����^���
�`]�`qzڰ��džĂb����hF�e-�	�?4ۡk�8D�������;�-����?�/{�V' cy�����S·�K�
��s����f�i�>Ƥ��yp�̳�6볅b7�U���<�ew�)!�
n���*	�)�+X�E䰻�4�sa��qN3YHq<4줦H�,�A��$f	�o��}vJc��5�"2\ş�`pp.�nMir�c����oT�ɹZ���`�O���,���;E`����"����&��zO/⣻��Ӄ+�T5�.��ҒRdA�{BN����8)T�а�f�дВU�f
�S U�v-Y��D�l�FhU
��z��=��t�<F��k��ǘ�
����_�_��>6�*e-3@�9�b��;�<EW0*m>�L~kER]l k\����7A8֤.��7���L~�%��o����裳���/iL���#�u����+��fڣ�!��T�}\�+8�V�s�b9�M�p.�o�y1-�yѥ�_4��a����ɷ�i����q�2��c��9���]�`_:Ex�\��$1�=^�¹�F�'/z�;���q�V	~1�%
�Nj���c]��:�fs0+b��dl��/f����b���?�:�rr'��j�<��'��^��j?RJn�:�,}�qF|���G��o�pY�sY��T�SsL~�JA����o�+���	��1�8����x����W�wrH��=/��w�[Rv��/����|o9��}<ſ|�^:4]د��K�ٹ�R�ͰH=(�	�����o�]!�)��n�ӥ����=�?z�po_�/��A���e���q\e!�emj*���6KjX�])�f���l���(��[
tq��z丒.ߧ�7����\7����_����m�K«�8�,���kD�: }�-�Ժ���v���!
��x�d��)��[u�\^��{��ײ�r���$J�G��-���E�����f�F�H�LȔ�,鱯����b)ޓ
J?�aF��Q7���]�.B>�1Eg`���.�J���*��b"�RLq�D�L�J�\���ߙz#���Q��=g��ulT���1gܓ���b?�,Kw4
��~z�qve��$~�|M�1GZR{:�/p�b��nCf䒈T�χX�����C���έ(����G�bB�nM��e=�IJ�<7S�#���R;��;��@�d�~��H�Ae�i�9VC��ox�^�U�X��P��w�[~�>s�o�Y��ׇ'K�+�So�N-�xo����Y�h�%�uD�zTUQ9�d�P칱D�����ȯ��s�*���w��k������@Ԥ&�8C���Q��L�>�͙v��#&YÌ��/+��4�*���V'��֦.����ÄQc�`�E;=A5ʅ�{�7oO�q S��N5�@"3�+a��1olZ�,7K��!���pq5�n��`�X1$�`�vTG�uT���/��^yh���j�G��@�oy��k/���o_���a(����̪˹jO]�$�<F���	����m9�v���f��y]�l�
�x��H|Ïu̠�Ü��׈�}<@/�To��iim�S��C�-4I���A�oߧ�S�Ɯ��X��;����ȥ�mQV����J��z�V�֞�f���x[q<<^�P���\j��¤I6�K+
��ҋ���(��BJ��C%K]���m��,��/>�9�����mG(�rr�:��\|��Vc����;��'��4�Y{�w�HTH�~�'��'�����:�SG2]b�<}�М�ڥ�3<�������q��Xa�P�++�ð@�`$;���| o����ZG�G,�]���hg��%�Hyv�X��H�w8��u77:�d��N��=M���Ƀ�����(u�R��s����*��B37��T�uC�M��M��ۯ���>;/�?����q�όट[�]��
;�{�<r9rɅ��%iS�J���p��K�_�����9�z��塯]�����„�������
]y�Ϗ����e��K0%a�8�qN��|���8f7m=�Q�ԝ�:�sj�=�h1Ї��:�?7Ԛ5g�L��P����V�O0�hR�
;���}�Q�kRHSj/�nP���%�;'^��8_�#o�nޛVPZ�0�d��o�x�%
���'|:��	��g�=گ[B�y'��>����.&3��M�׺�s��Z�p���y&����뿐�=�5����� �Gyz���sS+��2���T/`1����o��(��w|�	���3�-�ݬ�����j��ҏ����bʐl?N�dB���
���b++����icH��=A�xϕ�aV�
݄>���c_��3������[q?b������	ɟ��m~�^5b6�=�"���?S?�[�;�&+N+0�:�uj4G[�Eb›(\̟��z汻�='�s� �yFC@m�t�9Щ��@u"�S�{'�����׈�RL���=ƼRNh�0����\����C�
��F�*ܒG�Үм��"� �M>{,F�R�Х��X��$��q�B���R31�N���sB���Unk<���rۭ��IAkI�<��c�8P �j�sɺ��\�Gpp5u���ݘ���o�Jܺ�7�j	{�;�UVlzqgZ�/!�s�=)�p��D��@�hts���ŷ�n>\�p��B��?J�wğ����)7*n��7��%�."ĒH����;:y5vzo/��"�;<�E1������R��h�?��G�f4/����ԛD��ZeT{���1�w�{�;~��ć���-Y�Rr��c/.~&'�nA�cL@��+2ݍ��#$-�D��B��c�ea��}KA^��h�5����ڦ�;*
��G�AJ�Ǽw��6?������we9���-�֒�N#p�-[��D?���p��sm3�_�I�{y��[�X����f��,�0t��4�|��
r{�`� FVPxd��ʹU�(3�ԁb��BW�ȃm
Mֶش��j&C0�k��]wtbO�9�b$�s�����~��ɿ�|��^˴����1@M�gI�-+B�5-'[�jK�8���{��J������?�!6X���e��K�?X�	�����y�ҩT�I �൅"��).���d��B*���������c$lF̗<�%
O��4ߕ��Ϣ�v��(�f�۝4��=����xs��9�F�8�l�q
2^z�$GY��ы�Mgt0�Vաl�3C&:��?U'D�7�cu�#��?`;���ӂ�����낣�?`�^�i������¶�zo�ONs�����t�̝�s�!s$bh������W�G�"���
��6Dy��|Lx�:V��t�.��%ݓj�pWT͊��"�V4z6��[�✘z[����n�ň>Z�z��w�
4����&��`$�%!Qw#nQ��Y�Z�p�Q�u�]|s7
O ��ض4:Be�Sbf`ǬjJ��D��`(.g���vl�^L�7pDB�Dr�` TԚ
T���8X!~��qp�fr�u����>�<��ܗ�h~B��3Z�J�R���Ϫ�)�s:�"ޗ5d}|�ɕŞ���1L`
�Ԧ���w�!B%�,���BDŽn&���P?J-���,/`ښ�L�h1���Q�3�XA��\�T�9�bB���_-Pkʗg���8M/e��.��с��ήh�l�
J�o#|�>��E�g):1�7�?3��%�.}�8m�S䈔��?��m�`��7	#R$F	A�I'#>�e�\�f��2������[�7�˄=�2��?�ga	6Vl�� �����FJ�·���Yƪ�K�kz#�|�q���wo{�4��xC5�����o�����H�w�So亦�[��%�v�)�8��h�`Vz�ꖁ�t�Q��[�ͷ"�Y4���mb֩�M<\Az�cL���Z�p��U��еy��'��z�QO)nM5H�x�$�T��\.pJ�X^=����:���}��{��#8��cP�p
�W�B+�D��.�t�?Җ&t�O���@��F,Ϣ�N�{ou3��l�N�g�ꩤ�Ƈ'�E~5Ό)��=�ᬼ�jP��ĩAt�l[�I/c��C^���^��b���j�_
��/��ɢǞm!��(��s8��#�`0�T�-�l�$���P�0�ң%�޶]�r`�b˿�T���
t.�b`�s�i�[�Do����^|��}�9�r[P}.-�2�3�.Η;�T;�5�]`vߋV�s�u��i����V�q�F���d���"	�ă� ^��a�A�]<C���]���.���2%��*�r"�~�$�l}�l�"��ܺl*{��or�ו��#U&�9jC]\�p�x�p(ڣ�}�w/!�ʾ:�E	Z"rQ����-�\�ܝ��`ٮ�����B�m{x@�.��T)Nћ�F�e���
�Z�HqM�&��̖�L{^��v���XgW7$�M���s�nW�i�aW�%�ۧ��_~�ޱ6T�n;��T��?툃?��VEX��	޴"��!�+��̖�T��cRF��)/覟��r�)�ý
?y��rr�2fZf���!�@8b^�9/���N�h�>�M��yKq�9�6/v-��{._�(hz���e�D��Ֆ�~��S�ma�]lw�#-�P� e��3��ׯ���­��U�T�4��ڬ�����9Ú�K���T���?��oj-zRԦ3�m�]5�Z��R*�{���s
R��KP�t����hGI7�Ap���C��W��#��AF��Ѕ�߹o6�tǥ
�sf-������p�)�I�R�ұe�0WUJU+}x��E^��7qG��Z����_�zk�cUmP��F�VL��&�9�Vw%�
e�NQ��
<�5d��ȽN��\M�9��Pd���X��M���q�O�����i��J����&�&�h�!��W{�'���g`Y�e�_E�)�C�Ɵ��]1��*Ã5��6��k�E]�R���罾���j���GY��׮�/n�=Օ�vi�Z��j1F*�5����}���/�nH��۞rl���,��)+3�0��W*��U
�zs�;�H5����4rÆV�������ڡ7+�E)�΁���N��_\�Opg�Ι���bw��BKQ��y����h�����9�Yk�{�[z)H6��mu��m'CN,�*�j_�βCs���}V�j��u���
a�k�ױ�n���s�v�7߽O�l�?�#��B�҃Sq̱J����������J���"�uλ�[�=i��5E�w��SK	�w�)�n��.�19b?����3^�����vyV�������]XW�����E
&��#�r>Q5b�,	�������.�C�1V�ԭ�q�l���#ᘛQ�n�AljJ`d
e��f��\aʬ��l��	���7Dׇ�
��[�?p�������g��O3�O�~K��+�cN����Wg�1X�üx�>m�d5�;�R��������9�kITH�=}d|���|��@�$n�������UW|W^r�0&He��sA�[\%�XlCi�Tb�t���Q��л����}���*�6��^@{�8�R����&@X��\ ��L��l{�|�͖���,�	U��
:�/��XFЊ
�	{m_���͍?JUV0�0�2�;����
(��Mn�S�T���pp�.�cjf�=_���nRI��}�c/O�f�r��)[v?���\ԏ�Ɩ?��h@3G���"�ȡ��er�W�N��hJeq�0�%HHb��ϽA�3[�ax�
� �8�D�Jh��f[!�d��$�O��5m�/��]����IC�I��2Ǖ�P��1�6?ux�Fk_��Jc�J����%���S���6�Z���%)���Ӆ25 3�4a!S�p�@]/����Ia!��30|4h;�����cs��m�5t?{��H�n��m/�i�$��`X*�����e�w����}>A�ǀҙ��C�m���vf�Ħv"E�Y+5����T�����A$�G���{/��6��8+$q� �(�[�f+�i*��y
2���[���c�}[T�[�t]��=CV�����
N��5j�Q�H��U�Ax� *!AcD6���M�h8k��d�Bt'4�ߧ�������N!�v�Ꮎ-��?�3�z�}JNڴ���RYȳt�K�^�M�α&��ŋ��{$��̱t~�$#?���Ѳ�q�}�iu��'=�]��T�yk`��'�x�X�iM���A����Ȅs�0p\z�1�r7�����ݥ��."ߐ�(�ڂO�+7�`�˓#������(S�*��L�?1���"��{��e���ȥ�Y�}���6
�6om�6K�ܬ�{�DU��8hSW�����ׂ֗�m+r�-Fœe�����`�[
GB��,;��g�	���#t#I��|u�pՔ'C������H����{55;P�e}1Mxha��li
����3XQ8�|�&�HC]��5���]�&�"�S��*Ug�'����%]�IX�#m++/>Ki�Û"��	V��zʉ"�-!���3'�N���K�9�\`Co2?�����>e�v�;QE�_t��?vc2TX#�L
��߼�	m���t�w<X�ѭ��RH�/]��h���ɛ��8O8�4;�`1���nXdRcj30���U-�+ex�(���ǘp����45�N�����E����	J��(�0J�|�Ș�i���#��h�6>��tR�l2��M	x����Mj�3M�c?�O���j&�{�A��=v'�5�P�<��q�~���s�U@�$������GըO�Y<��meR�ݎy��(�`��7��vU��On);c��S�KۍYx�+.l��M��k1qJ�IM��Hp�7˿rŽ2�*T|�Zi_���
�mfrCUV��J쵳�Zq����vl+n����S�h�����|Ed�J�$D}��b�W��/ו�¿A�PۻV	�r�+�*���P�Zr%!h�q�x�1݃X�q�c�ܰ��L3{�x�Fw9�sa ��)]��������(�+S\w�)�����?w��{�/Ӎ1�V��}
N}
N}
N�
Nu@�핁
�Kf�U�;��~��$�rL7�#��XS�r�o�d��ٳ�����W�0�<^>���R�Z��M����&n�T\�� bc�576$R2a�*�6P$ޘտ���R���sk�O�(�K
)��[���3�k�w�8ь���@F�)���kGm7�QC�osI��{M���H�}Ҵ�3���{p}xp����]^�}��O"p�N��q��?�l^l�)�a:*S�0A�(4H�2U�ɛ�g��M\�mF`-4kټ+�7S�);�]�s�l2#`n f�;�KA�`̇���U����^��Y�a�e'�Ӟ���?;�*�h��6��
��rw�Xp[`Iq�Z���6cR!>���,!8k��q#��� �s�(d��\.d��a��|x	F��q��͇���6����K�V`�m��"��p3���N��U�˓�Ko���etu�8�	�\$Q�M����ie�N�&4��:8U�U��H)�7�X�պoUU��R~a�s]~�
����5�'�KW�J�ٌC%��b_l����f�&[U��0r���EY��/FT�GGA`�����Y�jѪjAh���j#t�Z.��)[��h���㡌��}Q�ME������%<;�cyPq���2E���e�<‡�����\Y���-�7{�#�`�����nS�f8�+:��KM6e���vSa1zH-��f�}l�`*J&a7�ަ(���dHG���}������������"H���nƙ"����z1��Vw6��x�q6��;���Z�=��C��(�m ���#W_��(�d�+iR�'#��
�@^�	�$��T���z�ŷg� �C׻�"y7<9�6�)�ؘ�
AZ��L%�4�����>�_�^�ZYw��2a��$@K��Kؓ�v(��`4Ϛ/��A��֌j$�%�	�<F�"�T�M{�m1�+��OA8��[B)�8-Y�'��w�fbf'v�*R{��oH-��'�ni�-�+�h-Ѵu�"��|v�r��AT�v
M�[�Z����F�.ɖ�-i��5��~�Y�c"#�s1[IS>)�U�O����Sq�J�N�–�Ù��W�m�nu7b����b蜙H�C�m54��"��m���!�����:}Dy�9q[�ʭ+6��Px)E���H�Jk�,҂CM	3�Ui��U�F4�k�<
��.
�1��T�"/:�ܛ�۰�W�Di�E��b릻�V<!���z�X��I�s#��V�ǚAW�8����-�K��NZ�ȵ�r�H��)%�(�:�ݪ�\�$Q{:jY�"��^���dkh�U�d(7$i�8G>E��RIS:��N�"?�(��A�_`��B�?I�O����x���X{���r�Ol}����O\|.&7ð~������Rx�;��P���2O��(�c�IX��O٪�>��ƊV��B���\��4�c��Ƿ�L��\~�>Z�a�e���H��>̧�.Ʃh0:?���|�V�O_��;*O���M��qr��g�tky����-)�	*�5R�Q!}7�
�ZO�pv��*=�M\~Pp{q8�.�J#n�TD��[�`�h�3�#]��:���@B�c`]�1�6S�i2_G��y���ec1e����j�)��K�y��m���coB�*8H.��^Ŋw@"�	�3>�f��캎U�H��*��Ƒ�"�+�/`{|z��ћ��c�U�`F�{�2��U���'�Y��i\�奱I�7�J�jQ6���1�ߎ��Ž�g��C��сFn@���
���|AF��_�>{��15>�R���Q����?�d.D,������B��r�
�aY��r遹�z��@�;׉�1p�S�6���n�o��cC8LՃ�:*A��<��ia���
���ț��1��,����IO���U�#���+���?��U��g�\��4�/I f_����+_O�I^}a�����
���0w��U�h�eFڮ�;.kM�a�nZ�ʿ��_y�
©#���
ħ�L�u�������2�O~���j�^˓΋ҳr�M�⩐�i�9�oRnk�'�W{A��g����?�\r&�`�hB�p�g�i�m��W9)al5ӡ3�(�E<�O�H�(�p�V^�����n�szj��(�|�����d+�9B1u�7	�b�0�w"Ʉ��Y�>UB!�����Ǝ�|
�mR��;�4��,۾�Q�|�4'Qގs�nx�nX��p"��jH]�ņ��v��f�_3eE�	��'ݦ�K)���W)m���^)e�$��c�7'ӳ��y� �XA��U�B��X�/�`�4PviD0��� a�cQ�~u���5�葋�e�2���ppeQ�9��9��bI"t����Y�`��W��چ�05��|��8�Z�Um=��Ԋׄ
X�Xgs)�iN~-��چ����ٌ���jEHH��	��͊��j�U-d���Y5����/טI�Tx{�J���B+J�S�[Aa�yᛍ0p�{�����v��&����y���J��`,��W�`���[,;#��[��r��2��ҡ*�Z�W����nj%�UO����ƓLW�>�&�"x<$����F�~)HI?8����F0����W���|�(���Fm���\D�ڔ��u��E���B�*�<��wD,a�NU4���j�E	��P޸������O�q.�XvX�K�i�s>oxs�s2n/0���B�՟5�\�}��s�Q&��,>m
+R~�^��qeI�ǒ�� ;�'qk"n)�]c�C���um+�����l���EA��%#M�rs6�9+1}V�s8?��ow�$#?)�|y~K��#6�8��\)���嬣�9�n'>=IZI�0�ux�VNʕ(�J]^�����e���$q��ϰ��xO��rL�N�ƫ�Ї�{�(R%�C=���h1��nźOG�]��܃�q�iduY~����Ӊf�� 
ܷ�u��8���K�V
�Al�c�#����ߓO���l�5,���Yg��N������'�S�OY�%�(%06N�_�O��n�j�9h�M����עF^~:�����!���):o���&+��ӹ{���>w���阯$yK��[ȶ�����?y���-z��V[�OΌǴ�~u��h7���K
5{k��W�8����-6Q��X��[dr��6g.�w����)X�K�`��әlk��QY��lK�a�=��X�J�t�"�)�3�W-�'��7#����d)|֥�ԨR��?$Y^��7ue�t�[��i؆96;`�'dI��N���ʇ3��4�U�e�H�r�4um�`>�t��'�;MU4(-�]�+�LIy���òa�iǗ9u++��t��қ%)���r@X�t}�Z�4򧈑yo,�2��JU�b�F�t�Q��WP�6�)bőH�D����w���2ւ.��^��a�xz���L��7wc�Mc�{D�&[8^\QWXuve�
���p�z�v������DZ!��`|6s�8��ؙ-F7<c\K��%�=c�/E����*�

�>�Q������T��������
��f'&�ڢ�̨]:q�F������w�6.w9r�`F��.�$����p�}�Zy�lp�ۋ���:A�X%��o��]���W����c�x���)��n�F�s俿u����֬�X`�@xCc�6IjY���8�ƭ�l$/��/I��
J߳ڕ�j��ŢYJ�:W;[;�.�`�z�9��G&ظK���iһ�Fy�!�7���+=�8���vQ~`�8,�~�:\��,���<+Vn��f�g'6ˌ�k�����k\�Kr�)ٺԕŽ��ˢh�X^���`�B/�7����׵�pD�^e��7' =�G%����׸�ԓ��L(.L��R��"�<g1�G�G|�1��^��uz'd4��	*�Lk�v�@��l��������p�����NÑ��N�Ԇ�`����x�H���=Mo&R�*VM" �E��Hj�犣��_�P#�
MM8G8����y^PU��M]k�Kr�G<�U?LU6)�JYr0/÷	�P��H\KV8ɀ�������T(�:��g����$�u%���M���Q*q��€�-�!�;Qˁ�M���D����i٠�ľ��B7��
���hd��Ԝ�@�"3ۢ:k�ȞT�#W=O�`�U�F
D�oAP	�0P8Pl�z\�F��F�:250!M
��S�v
���[ً�Q��-���^��D��c�����\DҔdI����H��K+���'�{�g�k
5��F�1:qǻ/�XDB�a+�|�jTp��E��Hj~n�)�Cʻ�@t7�I�9�放�n��j9�"��M,x��q����̻ݪ�$�E�J|O|v�i��h��Ī-�]QxV����_"��B�_�Fu����{P�E-��4a4欢�gy\��޹��P�مe
t�u����(
�ٽ�q�����(��ѣ>�=w6���x�!ȷ{8�ö��9'��N�����g{��۪��;��a��oy �"��̵ Z�i�MOk�B0�ligLm��H�o�nW���x�$�,��*���vX+��bv]�Ø�5�"(V� �A�J����~|��aҏ���=�p�Cj���bym6�v�mD�4���FP�tZ�B����C�������d�ʞCc�P�q��$z�gI���(l]T=��඘���Ջ*c��Q4���b�}S�D��V�V� i?Uf&j���ɗ�-�(uWZ��P��Rp��2��(�Nm>�햙x�I�<^\����͝Ϳ��q2ob��G��o���I��JwH�.Å������a�g�%7����l�!��`"�ݬ�,�V��t�XV5���&��B���G���I&uv����ZEH��P���v��lҞN��j��D:�`9/��xA^������E�y
�%�
�~�5A0C0��ܴB���ͥ
c/3��&��*U�B=(RanZ�(z�bJk��0x�f���f\�
Hx9��Ųt��4)�z�dY�gp��iq��a�K״&7���E��2&V�STCTx�m��
d��ʏ�T���ި�������B^ӷ��x�m����6�~���)Q�yo4уS���
�R�!t�%4Ÿ�#�zP3z�s���TL�{����a����P�3w�)�'�h!�,x%gg�֬E$��
K���*N����-H�R�/��\�sF�@�Mw�y	Ů�B��s�}�X*���;#�,����H�)�W��H���a}˴�SX�VS�Z<^���ev��[C{�x@s���
U�ܹ��VL�I�4���_2�mLj!��3�.�F�)([��2�s�d��ȥ��f���u�G S�l��‘��/qΕ�L+]5�35�
�J�v܎��`���є�ݺ�$
��O�徛����0�zh�n�Ɓ�ה&4T�wc�-�XԛQ��>���
�.i�]U�EK��*fJ:�"�
��'��4x�{Y[E_1['�wM)���e�o�1ku��K�)"N�^`mr�sU�US,7�l#a�9l[V��x��D!KzW(��M[򸢊ئ4j^mN�tQ,�v�h-���O�t�3Rf��#�@�{�&�g����8�۴{���0⌥!����C��"�\�6�k�f�L<mu�9&�_�r7�Zㄅ�𧕵�w׋��g 
_��N�C��m���E�4E�I��j$o�ٮ����4\�PŻmo$�J�6��Hƭo�椡X�7�b[ �+8�g��2QaN#	���ۆs[<w0nن!=�^nPh���Rt���gj���T{�͹Cҵy�(�<9u2��2ȖJ�z˳B5-�%נ�{�@'�=!�G��.l�q��f`��)1��e�����X��d��s� {N7F�N���3m�S|�^�Sv�w��}�^A�jьw\�8�-I�7V#��Y[�ٖ�a�����-kp�nO������WJ[.��\�I{�y8U�w�qfe��4UK3{PN�"���9��@��Q��zX�N��%�-b��C����2F�����q�i�9��Gޠ@Ux|���Q�8YL�=��*���_�I8Z�c�$p�޾��x�lW��
R�qc8�@{������&)(Ah3i�W�?a60r_��f��k�
��,���M
*sT'�����Js��[�.�-����Eu���s}\�t��&�`ԟ�p��>:�|�M���!I�C�D�ζh+�*8�d���!�JN.HY��'=�#tL�q�
��g(�,n�L���s�����"�p���t��(Q��)xO�$�j@�*���u*����S&���X��S����� "�%sŶ���3CM^���r53/��I>�ݮ����_y)�[$%�X�:;o�y�~�'�U�i�9�%'������q�H�
8.Ζf)����}>�ZR�hW��J��:& Q��=�񗏪BH$A@b�=M�@=2���=mÐ0sU�}��5��L�y`s�=�w���ʘqOV-�I����j�N�NV�GJ��p��l!�J�,��
�D�)���|��b8�8�Q�A�O-�2�]��V��s�x��7Lo�ɱW%�k�V	�#��c�3���smX_���J���W�s}.jNY'XpMO=�MD���I-!׭(�p�@�	�ؤ�3�����6xR���,����Ԡ�4/h������%9B!�`��d�c�FQm��gV�?��{@�����n<ֿ���?��vE�3y�T",٫q���Nɧpw%~�_��&�Ʊ����|�7���l���e�+S��L��Z�"4�^w�Q��,�F��x�C1�C'�*�%�ݱ�ܹ����_���A��8��s���.};�
�.H~]NCp���_�Jۿ�(B�Bc�9fX��e<T�c?�l�����;Zw���Y�I�k��C;}�W}�g�"��(<�S�|d�����7�?�=V��T�=�k�!�1�����y��M۞ټ�y�?��I��d����J}zI�*�61�%Y�����p�Df��l�d�Ā��M�3x�L�#�F^saԒ1�+VN͠}�й�Xg>�a���!��Ҍ|B��F�&=�u�#U��J�2C�|0������M�J�[j��Qu��Y/y�lì�e:�*c c��S5Ce|�	��2���w+�����(�{Z߽~�0~03�ī��}1O��ސ�,�`�%G�A(
�u�Ce��mX��R�irq�wK��\�H����!w;��d�z�~¨�*��ɥ��L�:�q��cR9��2��W���p���<qq����_�;1sHA\Hw����`�-9u�1|Y��ůR+>@~&|`���Ѹ���Xuz���v�]sT�%�H�<���<=[YG��@ڏ5�,C�_Eӓ}o�ڱJ�h��O[(�2��n�T�r�����țit5�7#;ϝ*�=�E�O5A����OQ,f���G�
�x�����l
$��[��pX�ْ{��P;�J��w%vu�C`��w����>b�jIM�P�i[��.�)��P7��=���t �ӡ�y��_�/�0��d�_r/������I�qpC�2���Y��U��1�c�@�l�2P�6�����
�5O�X�Y��;;%S-r��`�u
z���HmW�^@�3�
��o��<P��"�u
�0{>z����7_�^���zuz{j��}�����%?�
+�^��8o���fZ�`�����^Wxk���y��w�^=<<����l��8��rb'z��C��kp�`G
�ӀJ�-i9A��^��j���{�����κ�%DΧ~�&�ӝ�����瑱0�,V>��#��z���̎���B���Ϝǯ��c����ޏP����
��g���J��T��
hr�E���	q�L��^]N�8�YMS��j�7���~��?E���U[ſ��ԫ����C<���8�1��(Dž��#�ᵶʟc�{��*�yt��^�W�R��llO������7(��
{�D����?a}�8��K���aL�樂��je����iV�HW�lz�s=�?5�R���4�GQ�� ?X�+���0W�@�j"�ZLD(��o&�H[��é^���d6�z\�(��EM˒1��6��E���Q�6)f�n<z����6�—܏p�b��;��
�E�QR�Ѓ�\�Z�w8��￑���zp� "V5rA+��4db�>�dn���L+x��5�<��ʆƉ2�ciѐ����Qb��pt�1t㒖%��{7H�v,mυ}�U��8�kTפ(�l(�ǃ`T<e�&�:nB6�GS���Yg@�O15pB�>`�ګ#Iݥ�U��T1N�'�q�g��I����*X�DBtsaC�B=Zo���
�[�pvl&E)��~v��&q��|?��l���*)K7�J�Г`�?U��o�bw~��;rC�F����Ž�m,���v☀�F�����<%3�O�Y�b����F@e�����4�+aj`-���������N_.�I�D�+��╔�.=�+M��9_���ߤuQ8+�OSK�"����M�R�1#{%|���l�,ﺁI_}V�D�-�j|+����s��ƍz5�7�,���N��x�2�U5*�"��"�*�~V�d�jP�/�׎5Ր�G�Iݤ����2�];I��&���&����Q��;T9���՝
_�4��hه>��@o�M�6(�?�j3U����߻1���w9�<W��N�T`$�˺M��d�\V'���7����G7�۟��:|�S��/���/�O��
0h˲��U��i��������?�V</�jd?z�r�)6۬�Y�����g��X����+k�]J&y�!��jbY�b4��=�G���V����ܙEte=㓋(�`S[Zg[	�f�"��)h`M�� a��Z�(+UH�����R.,Y�=b5�K���bhy���\�1D�
�?q��?�$�*���ԁ(�bzX�'T�>qR���fM��'֬��	�r&���Yµ����~��_)A�z��O�-|���u���2B �y�;\��	km+�9��5�K�o�9�-��@�~�>M~�WۣH꯻Hw�I��b��|��8�`�W'���(��a!��2���-�1c�Tx-ڛe��؝�9s{�i>�4��ߙm���s������nXg��_2W��͸~���o�n �e#�F�T�R��/�t)��p'BR�@�؟�͟�Ҡ�b+N͊��&1|�?<���W�藵Y�X?�m�xc7u�wSW�{Y�Z�n��]�McU�5=���3��r�~�d�撁�F>M	�^�%��[9�o3#ݟ&`.�n�-xٌ��:�&�ęc�=+v-�fh���Ź*��	�&N!�p7/̓�.'�v�ȍJb,j�$5�wҩ4���q�j�$ =F�O-�ՆR�����ʼn�]���Ka��X��|���z��4�bV�Q
���g�7�汫y<�
1p�G+���M듓0E�إ"�xz�+����z]`\�:=�����%ۮ�*��5D�<��L*K��]�u����;���8��:�(�����hXy�*J����B
V�Dȏ�&j_S&Ha��������Bc��75)�����7���d6W�s�8��Ie+��?�tt,0�c�*9W#�Yo@!���p�KF$�px��G��r��[��zY��%u�W��������M{0@R�{�TL7V�)�g�����lIm	�UKQ�Nv
6Z.P�m�#v�[篾H���������
K�B��Gz�$��C�h�-�GG��Q��@
�>��T`n �+D�!)vGS��0��Bq(���\�g?`X���8��H�^��$�ۺB�lN\|��'��1R�F{�Q�yE�o��;,}��hJ5̟@k��(n�¯Q^��b,E��ӗ�[�����_B�?z��-������
gؼ�K�A\��FwA�Q�U��`-�Й��^�L� �D>J��|�V�.�:;�����B�O�Z4's��F���e*��l6��3y�^��K|���vūoD�=�΢�=߾��*l��(f��9qf=����
Je�>�4�IF�6hN8I����,5IgjQ�I�a:�f�a��S��F��}�#�Ro����m'A(0f�  �����������Q٠n�sN>%KՊ��B�`���6�c�f�M�G�-^1ˮ��7�4Y���"hY�_	�/�L�le��t�pHTw�d��ˀT���.Ih�b)����iU������yE��-��Q�9@����q�J�E��dW/,%U��	�y>�l�������'�V�(5/Th�&7�CrÒZ2,��rز�r�e��%w2.�l%#
˥�4D����1��Q�Յ�
�k����U��GE
�G^9�ܒ5�Ioqd���'��K��^�X�sh�b�IId��MشV=4���E�M}˱�N
��mY�Œ�Tř�D������BѮ���ӻl%�$Z�L
�Lj�?k�֥�T��@�#QFC�w�TLWtKnY�������|�"!fX�s
Ƅ<xҼ�l]�9��b�ą9.-�i��w�XO�?&�^p鿬Sw
�_����Q���~��>	f#*	@S����La���<7�{�'^:�u��{���<DDc�`7���w�(�F�ˊ7�.��`��y�I6u��߉�}r'��>���8��S��G��XJ|������2N�q��N��K�H5�ؼk�<��]g��w������u2�ˁ�)��4�S�+�W�K�gX��	.Ɯi��,���r��Ÿ�Q���<-zU\Y(�Ы�d��K�YF���,���fv�N����d~��X�H���)������;q�WD/S��g6J4�4�N��D���wE�r5!�b��w����0���d?̋e��Y�ME�� RY�э�ֹ�@�o���$ _���b� �Θg�[�,����@N���eR�����窎q���y$n�'H�8���^0{��GBA�ԬE9J�5�@�Q���,�O�D�SA.�P�#qCQ��J�p��i�π���}9��V���#�c�h�ڋ�[O�5���?��)��6}T}EW��j��Xe��Fq���V�	��&0��]�h���1�P�[j�����,����i$;�f�Ԁ�O?2�j�����I�$]J 
�
w.�O,�Iqb�^i�-�'ϟLfn�7\�3X��ʔ�ÄQ���z҅
J�aP���0�E�����5����XM�W��aq?�hTT�(��>�_�-F5-�c�/�יc�[im<|���6��B�j���`����[��E�Xf�4J
�Iv�F�Ku¶h�J�Î�G42�d�I�Fڴ�p#��� ��+0n�,q�R%��+�v�:�I��֙�R$��2>��Q��x1Q.N��;�ȶ`K(W���KZD�uTjA�'�s�v���xy�ְ݉��~�{�k��!_��6�����s��������bf��(�"���J��y��J�DŠ,}�v�$]U8��G���2@�ܹH~|G�h�a]�O��;�T>
����+�PW�ܙUE�zc�fw���]4ס�SY�%�J�K�~���d;�3l�u~_VL�Mat͑X>�W�-iYr�M0sb���#����?�5`�y���o��4`���f��.���Z��t}v&/jYE>��O[?__�_~�κ��ڒ��,4@��-kq���(��a��5.�����?��5���4܀�b�0��I�v�?��/�?�-~'?�?���>¿��?}�>X�}I=�.��ߞ��f倘����,�M-�Yz=����O�܌�Ӱbd�Z�T�^�h�F��a�Kl��Š��YW3gjG��ŃU�@MR�WC��=��#��T�����i��4�q�"؅��1�ql`�Z,#�ď�)�7�%;���K?�aB�R%�����ِpFTږ���z݄5��F�9iYM>?R�nMɹb���#���Zu��
7�wt���
��b�ٍ��%����/������������߾�1�z$���8��S
�t��ܰ��4��v�cI�P.|����L�N8
\Zۏ*�q��+�na�D�ǖ�ͻ8��{����a���aN_�}���+�jBZ�h�ǔa�hZ�q2:���-k�+�6k

��_��0vs)0�Caj�)�D#ޟ݈�Y7��_(�_n�������2C9���X�HG�5�XGsG�r�Jx�8vf���Mɾ�;�TKQ�\�݉;�.;��t�K��4�0���dU
L�X���!�疱�ed����^���C��
�Mc֢k���;md;��8�ŗ)�YUs`>�@faٚY6�Ly_-�s s�<Z�H����W�
�k�\#Ž%/եx���{�U����U����10v�su���G6��읙�D!��g>ű��@6`�fv.�VlW�{[^�t
��P�v�*ۏ�8N��c['4ci?��Yuz�r�a�u�Y�:N�ٺ��qά,Tc�8TJnw�^��zY'�|�Q�M5��C��#/N�T�՘�e�2d�z]8]M8���!���ii�������:tQQ�Wݫ��3ðޯ���4�:�q>�Kz�bjz�'����ln:�gEF96�y�q�i)�?��C�ў>=��C"����ѳ���(Z��n�b��-UKTу��^�_~?L��|R��ç~DL��U�2i�*�~d���C!-�kGV��4T]@3�r�jQ'�._9Uc?Roi�į��C���c0�/�EeR�I�f
^De�j�3�Bl�pw銦���.k�.��#�(�>M<�ѲfGZ#�ڈCI%.j���<I�*�aS!�jB@.o��A5	�Y&Է��x57g�֎^2m�8��m���[��/e��h!�B̓�Н�����8��k����y7Q��܃+��#��JY\X�]��b�z�4��%1RTߓp,c뜡e���55�f�?G������Ế���_dI/�E7ԅ�g5Z�U�%�&�jr�*�:<ۦN��o��
%��i���61[Z"�aY�䎆�������jcu7q47�8���,�f� M�������ˢb��C+G�4'�E��nN#'���B�U�B�1nhyd/�ii�R����`z!7�X?m�%�����.P�*���D�r�F�sÃX�S\$'+_��v�5�[V�rLEݴ�5;/�1z_�-�����(��kX#sy��m�t�]Z�U�Pl��������
�	1�ݴu���l�H�<R3����6L5,.��墳,�du����B9H�o%��f��U�bUH.���j��z�9Ws3���_�@k/��S�����9Fm�O�������Q���2�
_�ߋ�eaO�k�x%u�e�+Yi�*S~["]#�����[�Ͷ2��!��>���6��f����`�}�6��4;)P�yǥ�N\��`�Q���kߚ�"�s�
;��gC	��F�J1E�8n�lM���n�����)Ni}���+��J�Y�!��ezy���݌`wU��J96��	���`�B�є��2���l69���B�g�%ˁ�p��	G�N<v�Sb��c�Ruv�	�lĹ�U�}Y-�_n�Ge������uG�o+e�TI��u��tJ7䰑dq�>G�R9�t�n�[��Xv�0e�V9pJ��u΃�􎿣;;���Q+_cu����u�w�V
[�����6ҾU�Smc�$!׻�%�X�$�ؚ�GgAc��4�ۥ(g܊|�x�6�<���\����D�b?f~!V�!Yx(ugj�!���m�kԿYEڛ��
g[�RV.\
#�s����Q����3�5�c�GHIe�;�8t�G�'oWcS�m��K����ENwy�F�B\,-��SE�tk
w-��-�8���=�fU����$�+�������A�^U�R��-��6���k�;��B�і9H���`|@sCcR+�U�M��.�;,w�a����ɮ+���1^���6�ވ��1�6��OA���fd��#{�0���	BY�8��HM]Uz��#��l@�Gͪ�o�L#��@�6/0���A&f�>GA{�͉�f�4�$��L�SYN*!Cx�=�8mRB�b#�;���ך8M_���g�M=�JD]&89�7"��}�e:�m�+�1�(�G(.�"��Tz�.F(���u�ߐ��}�ɗ-�uR�͔D�"�TΤ�`��� |�>$�S��Č?�7���&�:�������G��Y�`$8��-�s�=�r`B�Bk�s��#պYȌE$c#�Z��Q�S��W(�f���g>@�Mu���W��L�T7O1�R�"��c�/Dqu2�M�8��੒v�YW��P�`��K�P���e��*FV_̫�95�i�y9X+��,����g"��i�`9����Xj�)��OW�]��hIP(���{ٔƣl�,�ȇ��p��+�I�!�J���
�{��b�i`r0�U�'/$C�l`,h3�lv��\�bb����"b�Ci�v��s!DV�Y�y�1If�v�P��%��b�.�����y#���6ޑ'Ä���Փ�Z�g�� t���1�}��lŤ��u����H`h�O�">�>���@����4����*L�+*卅�m/�_��ޖ��l�N�Ɔ�����JU�0���7��Z��r�>h?��
�
�\�Ǹ�p�ԧU��-�M�!���_��B��4W_sI���#'��׏�^�~�#��G[�4'k�*D�Út|@�h1��)�!�H�pI���h�!��0��Fݑ�6��](�^������R�nz�=���Z^�OH�ۀZ�x��_�@��Z:���ת�Y��շ좲�8x��/����-,��E�֬��cU���5l>���V�A(5�rw�P�+�-ѹ�۳�������R=�q��&.�v��̌XܟJ�oB�b�-@����WRs7��l��n)��7,߭��U�X4��+d�͗P<J"[�la����S���m8��eî�ӤeLNc#�-�b���<W&�g�>�V+8��"�~g��_��P�e�,p����2���K����w��֥3�F��L|�z��k��%��h��2�`�@o.�H@2MP��5f�L�0a�&"��¡Ӧ2cE��v�Z�!2�+���^ci��ɡ���=��\ ����oaE,�EY#%�C��O�� 1�r��ð�l3��S]r�!�7T*~�ȃ���_Yǚ�a�S���J�=j��UV���Q����~)*k��ˠa�1@m�<,4"t�j:j��}�#�H��������Ɋ�h��к��?s��
j���sI�@Nٜ	~��A�@<K��h�q�g��v��E�)�o��_?}:�����ŗ����||rkQ��x��1��@Z�&�<R��y?��_���W�
�q�؆Z	��-��5�;�h.X�\�0"[s���2 J�&"[Q',��Fyٕ�$zs�Ah-������3���$�Kot��zm�j�k�9ĵ��:�ُ�`���83�H�Vj.4D���յ�0}�����bIۃ�
O�N��Se��s4�
��?,�{/ξ?>�K%����B�N�?$�/��y�="�h�� ��af;��$�D�€!|,;h����Ȱ�	.Xo��n&���o����@<*���$s���^����;n�!�i3���`�-��>	R�ʠ䉩=~Z����y��-�<Z#9Uz%����=Ŵ��~�؃]KAU�#�K�O_�p���J��J)trǥ�.3A2Y�1��)�cѝ�Q��3��l	i4TD���$)Y��A�����p�a�;���W���b#JO%��[�0P��4���!��#F�(�H�Ʋ���ݓIx�}���J���C���E�q�6^L��
��ԓq�z_|V�:ac��*�l��X�c��}6?�_�Y���<'<�\�H��2�.;�T�#�ܦ��i�C�n�q��;L&�E�)��J�B�D��Wl	{��a��p�bX�
Z9�Z�� �=�\.Rgvp��ԈbQâ�R�I�l
"A�$R��(�Ә���ӻ4Σlq��*��,����j��U���kM�"�2��n3\�J�*��Z����j2ڱ��ׅ�U̫@�貽�>;�W���Y��>�<��z��|�h�#xխ&������v��(����˙Qr�k�z!'r�C�� �1O��g60�a������QԾ&ed-��x�V��~�	
��j �@�=��i��[�L�l��l4��4E����o�r�V���xhXV$7�vU[��xF��^�j��҄�������}�;���=����,�"fb}q�x�Z�(��p1����״�?�|�h2g
h�c-�lT1����fՕ�̋z� �e�����['��o����\~�;��r ������LĪ\�T
�U	�a�jn"i�q��]�(�� �G%�ݸT�ݬPѝ�<E5�%S�^J7����sz�����k{6O�Y~��oXJc�Xr�]��5dE�D����l3T$!|r�Às����L��D��O���z��zy�3��g�%�1�:�$$cO�e���.~�B�nN9��k�����-�$�j�(�Ҙ7�X��6�����
�U��P�^� ��K��4
��T�����$K;�lel��H�)�j,]��7\QQ��t�OŴ�-�^�Q����7�W��m���eɃ_��^}��a�p�@Wp!�i{ݧI������ȚY6���=s:ēnuה��V���B�HO�+op����Mu�A4;��`a�e����^�jl�����F�z^S2��9DLQ�ڥ����S7��
�a�e�=�)�3:�V�Aj��"̤�|iS��i�GBJ$Ew(��:�Nּf}�h�}��KU
�O<o��uP����[����E���i�\�V�p��Bz��VOڐ�h{�yA����I�<��ξ��wAm��NPY�%M�d~G���bX>�܆���>R,[�~���L�(���ʢ2��S��yS[�KO�������(7N[W DƗFph��GZ=�i�6,2[
2���Փ�C�n��?_�����:s�ȸ��9,O�W�*�0�TEUK�ם��k|���d�v5WP2���K��R����6���X�xHs�]S��a/��7uJr!K��/��ý�9,�39u���~x_�]�v]/������A݉7J� ;!`�y�A�q��SX����R-����F�#��V�}��!Kp��:��`}O���O�d?�f�P9ªR+�nk9�SB�lmY�EO�n\_mxy��b�V�7�t7-,�ʊ�%�+�f�V��^<kK;:%��)t�lXZ�+��\�V��Bw�bZEa�U�QC��T������E�h����Ӎ��r�Kr�e<��8m��oXL?���h?��v�i���|y�ݾ��)�c����z��wX�oM�6�nL�E^�B�1�	�����0���3s�=���OQ�PN˅1(p�E���㘚�`;[*�(w�BXD-��4�<��d��\���ְ��Ⱥ��:1�Z�d����U9vWY���h��NU�ҽ>Yn&���	{�b�FH���$��+�ҽ�|�Mu�T_����,��;���G�����n)��Ƚ~hI�N�HO�L�/Ms��@�q��4F�*i�5���oJ*�
Ma�sm��H���w"r���*�1�ܘ"֛�T�[_o?���uɊ��H����͵pX��zyc����޽��up��,S���la�$<1���X�A|��ާ_��������1գf��4TI
�BU�f*���Z�q�O��N+�#TL���C�(z��F��rз&��ьѶ���"�u��8N�!=����9��5
inh}d�C�>�AWyr���1%P>EY�L�|��1��	e�v��5ptVQh��'�zf�����)�eRzi�J�c�*�x��NЈ��dz�)P͑F�U����q�ş��\/m���w�2�B�$E�OE�T`M`<S�?�'�t��IH;K��l2��j�
�#0E��'IH��u&EuX�nR@*�7<C>c6ɑ=��8�UQ�x��y;?�5���G�.�ϼ��!:V��f�#�G� �p�c���������l~pX��םxJW2�^g�t�	տ)���o��
�L*�m��d���X��G.�I�}����0��|�s�"��Q��f�VA
��f�xi`�N�
�Xxo��;BO.�9԰�P����kV�;�������Y�2��#��*��#��^���a�h,NS�e��Ͷ��Z�A)�H��\<�(d��K����8���q�|��N�����[9�h�����#V�N��X�N�ā��T�
��P4C�Fe}�{v#���74�{�N������&ȗ�+��U��@���E�������Y����z��᪶��|M.�{�A6^Z��*r��'�Ϳ�+�b��Y�Jꫫ+J��[@��4-�dj<��Em�k�S<�(s�N2���]��<��eaV;�����_�?��Hr�o��\�(��M��8���>٠�΋�8b�^&Ɠ�J��E��r4U�H�u�[��C@wac��q��Z_zvk�{�KkaU��4��̟7O�h�Z���VDM6���+�%�3�_�u֘0P[�XU��nv�X?&����]�u΅Td:����0�X�7O��?r�_���� ~��7�v��R���������dItGVH��M��ه?lP/wRP/��0G�|Q�A?4�"$a��%��IGvlL�À i]~�={��UT(���4�쓇���(�X�§�'>���xH{GQŏt�j���L��L������>��c@g@��+��a".�L�E�����E������+3�m�R�V�,�ptUp7���GuII�r)>��8��(�\l��}ͷM�M6:H�����ZQ���>FX�ţ�V���5��Xu�X�I�����t�,�B`�\/]!Mv��I���8#��;}e�7�3�'�3Fx���#�����&ʫz�A�X����6�BnIB(��jc��4�t]�@�'ۏ�c�����߉�A0j8€�G�ˑ�����f��פd�Sgx+��^3�|�Ӕ�"�M���"Z�\C|X�E��
�է3tG�=��Fc�g��YY��=���󥅘"}����O�\���R�h�C>�8=e��R8��pmG6mp�]�8��H��z���)N��h =Z5�U�� rp�H����]�.��
���F�\~��|+�O3F����Dr*�>u&������P�>A�h�͍���wx������C"x-�h�����_,ݱ�?u'�_B?�s�ź:�>����P����=�S�Pv��qj�W��*H�\;ej���C89n�ю���qV �jo��a��2�<��q�-�|�,�@yT���Ǜ��ۯ�g�>�D��}
8:�T�����BꐵSh۶���eý��x�]s����{AuO�M+�g�NT�`����J�Ojc��(��J�c�$�[ܚx�R�iZD�t�ޞ�|�w��%��/��he�|�S�o�K`|�[U�W�i0����
�U��`�j��1w!�=���:9Kĕ=�m���)޳�ݲ���X~��B�~�v,qH3�v���9�p��lL��Ua�1>r|}}��-�9T��fp�����L֪+1�)wOTFW�����Q�?l�e-��I�L攄%����wPE�|��~��G5e�
+
q>��*�0�
��.Q�|c�jsO�O}��
H��c��J��2c,T]N���Ƌ�L�
���Be����Y��4V�������Fa�i{Q4P��,�*+p��i$�"(�0p:�ô.��s]쯊���5���q�L�yp�Zm���x0|�����R��։P��g������2��S��F��)^�p=�MA�^�h�֙����Q�9��&&�?H�!����~/[/r�A��1� ���3����h֬�,$<�c���d"3��|l(����A��ˋ�9�w�T�ð;����Ĩ*��6��ri���e.Hl�k�]�9��n�DҌ���՟�c���Cn��=��m����M��z!T�PtSF�����(��?Isjg&�
��$c��D�#=LeQ@�T������O������E�;8�7������j�}�rd�'���Q�g�!O�u���CGT�W��p�7�A�&s{S���~9�;�a�k��
4d����Ŏ��{�<!]�L���SD�r�F�A��Ѧ?��|��mٷ�?Ω�)X�ӯv��p����(;Goo�gW�g'Ƿg�אָ�.Mr�,�e#7�{�J�]h����؎ؤ�����@�^�K.)&�g|
2hw�����4:�t���FI[�;QUn]��Q��1�*n(�d��sՁ�E-�'����7�����,©��z��m�d���ZB�z��Ty�CYv2E�Q�ɒ��M��U2�,G�_ҕ��;��;5!�e�Ex�"	N��7m�ԟ>��ȯ�Fo^���]��AZ�TD�')��_F)���?�g`����摦c�i�EhQp�hIa�CN�7�f���ela�5t[��QG�`�k#xX�`����'\���v=�5��n�kl�V.*�|<��1��i	)�b67�:k��bIђ0�`mH����S�Iy!��X*���s�wP&�E�D
0��)�>{�q�ۍ�7�n�(�j�MB�R�d�����y��RA��NG�N54]'q�_�eʒp��&�x�i����L�wZ2<�uT�:-z)�$D�C�TgW�'P��5�A����D���[��#�J%׽'D�[i����w��/��*�v#�E�.�C�;��BM^��*nN��+��䒽�!�l�4��4JȔNWZ3�}�r4��Q��a��J��:�[?r\{�,D�Ρ3G�б��ZEN�^����,�
��*�i�-��d]���6�3�~t?�l
d�����KG~�wޕ,����16-Ċ�N��-��EUd�����'?&E'a�W�lSj�����ţ���(bJ}2Wo�\jZ��4�1�R��)��lR��W ���Ϗ�޶���zn%5�c�����L�!g�ˠ�"������!��`��vK��;;�?ϼ��s����X�N�y��ⶢ�Z��y��!I�D�/})Q���#l�ܾ����{��%�qٌ�Lkd��i0n�?��ol�OH�[T2zբ���p_���a�Ha{Y&����U.�OUG���T]��v�i"Ou��r��������y0.��
�G���eȆ܁,F�fC�1�t#�co�'���#		�z�wHtfݔnP�t?.';�	���T�k��!����N���0�ҐX��nj���{�nZanSݧ�S1��Z���-+��M>�D�Ɂ:b�τ�/��n���]���]Y��M(�F��8�������,���J�0:)~Z����Ԁ��k7\)���S���I�ϫ�n��Qht$,C؝��<�m�701:�;jah���^k�1u�����j0[k��n�z)c��SjCH�u3�iU*��z�U����{렙����2 F}
զ:gﮛ.X�dfO���T���N��V�^�G��}�����ڔtt��8"Jb�,x���*J�05�K�gzRl�����
p�'�RaH��k� ��/d���oj{�6�I8�A��"e��Ž(HF3b�@����͒�A��ᴎ���^ؙ>�z8�]W���Ŗ����a��B��.=ȼ��Kf�%E�ɭ$��ɍXeSW&+�w��ʲ�1��}k�,�@C�y�.�;��=$��tO3�ו�K�<a��"}csl�'�t�A�����tN�,\�6_\�v]I�hS�]���2^;G�3G�&�Pͯ�3f�PVC淢8�G�V�`�b�{�ᗉ�ɕm��Dg3S�������'1���_�`]j�����b��i8�Lx9�v�x��l|�cF0Χj�ќ�/O�ѯ��{Z�@�MtҼ�d�=����(p8��
l�J�u'���x��Ə�E�-z�){|�I��}�v�u�vT���uv��k�^�$�a���!�*�&�	&�O�/x�ձj�$A��m#��C�<_��c�9m`�?�O��+XcAw��X�3*����)B4�2�k�O����l�a���ڤsX;���3i6iu�E�������sP腁!�v�:R�T����eN��mX/X��_�ï�<��o?F�Zl����n��,̋�5�ɮ-���&��ޟ��8�t���v�����*�ijU�a�f�g��̯�0�S)z�Y,ؔ�F�P�e�Z��I�S��\�Bz�7��P�bx������ֲ9��i
���|-ӴV�F�"�o�\K-]4Q�݋�e.�MT;:���'�o�G�u��	J��Rf���7��\f%UM�y����,0\Uw.dD9��4P)�H�6���L�Z��9��A��!8�4���I��~�����~tf�BF�ޞ�(�Y��a��H�G�Hf��������d���I���χz�{��b�f��dHr5�������n��f�v�3
'��֣뺰�E�R~R�n��z�@ ���:)�{��E���ɋ��=��'kU;�+��p+y^��yF��:���s���f5���Q$
�P�T���YcO�]O�?��SLS��QǾ��Z䲹�b;���C�޸#��R([F�%���4���^����#j�){'�9����X�-��Z��T�xZ4���g�;�.���^�zxxN�d��WQ0��P�r��{5�E칣#@𫛧(�W?�<�����.�y5L��_�
�\�E�y��3�b�I���.`v�fSI��xEi�!��^���wehݸ(羧ge�x���{䞁����ͭ�+`�����HE�i��RQ��95�R�a�M��iK���	���P����}��,��Ԟ�����qpxx�D��Pv�^%\M�����ϤDZ��h=�����Tx�b}�Xx^�O'�!5�+YTr:��^č�J������-17*[R�q*r �URy�%3ϊp�3A���{����r�bS��fvL��#��v�M�1k�o�b�nW�h��E�T�׬�dU���������棒A�X0�t��Ƥ]| �%�[�֩��$�Nߢ�)��3;�f���\nT�=����u�,�S�������(<�o�M�f���X����Qq���ܺI/@��j{|�e61�5���p$K5Ӹ%k<j���R�z�w�A]7��-E~\�+�J�vRC���(���\N�NQ���4�6�����o7RJ�~`�	٨�w.u>q_��˓�f��P����:HQȼ�j%U�b��ɹ"w6g��k�P�[m����ЪHU�
[�T&����f> n�d�q�L*7��ۖ�3�^&&˯r̯˴���-�\/>e�C�g6'�@d&�����>K�U�.2y���_�O�K�=q��x����o({�M}s����㛥��]��Ql�%J�7�6�p���\�uhÖ�u�=����EGb���������E�/!5��Z��_�
��Yp�D���l��ƴb`J[���!)$h�еj�)j7�ũ
V>V��8�×i�-v��ǔk�Tb��.�:zo��5�GIW]&IY�?�p
B�r^p�2�OB#2�Q�>�i�,+;G� ��Cm�W�TO�-D�l�\U��v�;x��֩���$����`S��rf�`N�߂���u +�8֓hXB�%�.��~{b�|s�.�~���@]�楓?��:��!n���Үr�܆wε�$�ȱ
J*`�����IT.�){|g��R*�j�Ej9��\.Q�`�hA���$C�:�v�y�9�)Q�����Ҫq ���^�\1U
��Hg��nJu-W�<���fe�!�4�x����o��SP���D��u�2��M�Re�hG�-��X-w5�Ö��Vu,�r}���]�7׬r��!���\*[�G0��TSj쮕
o�����RC��;��V����'F6^z��M�l
R}&cl��e���9�<K i�бeɦ�f_<XR���^V���<2�-�j��Z�߲��*LnB1�F�崁�j�G�r��=}��X��ˊ]8�xUKJ�a��
8�j�������jس���*�MC�˼9��@ �R�ڸFzrU��a3ע@;=
�\eR��5'���Q)���W��U�$Y!<����![}l��v#�"�;qٳ��3��m��5�]�0��',���NQA
���Ř�j)�*D���·*�F�[��n���%�)��@6�}�;���f	p���j�$0�������'�Ƿǭ��!9MjE��R�r��%�1�B�z{�6�Ô/��=��vs#KW�rQ�X�5��+aO�3;=�R!��-^)�C�-ys����dIٌ��(�"��9��h�$�<Y��t=ms���oB��|g��:�0��G���L���y�@O<�C�ƢUQ�-��%��������͞��nD|�;m���T�t�W������	�2j<�����kE�������R�Ӄ�r^9�ya]��y=$.�m�Ҩ�?lDqX�8�����3E>���٪�8�b����7w�-\�3�l{+ӻn����v-�4��cj�W�ET�͇������˛�P�J��p��s�l��@����Ԡ������
�,7'�<=|�~�ޞ�_����Ж�'����i�����/d���u��mKF�;�\��#�Ql���<��7�'ET��x�X�~�*Ϳ0�1|�i�cl����"�S�u|{{q~s��Z��\Bd-��iuZ@��no�"롴=O�K:��4���glnK���Mτ�6�4�>_ܜ���n�6}��T(�t@>CJ�aD��ǒ#���}}3|�u %Z�T���SkŲ�犦*�����C�ҞDdT��O~�~S6_}"����/��؝$�vauR�ۜ^�ͩ���=���p�é�W`��ܒ�5���]oM��6Ȭ���u�I��b�RϯO-�"/� ]�֖��nP�G@��]Bќ,������#�:vl/SN0�6|��'�K*��2���Fa ��s���l�.n�.��)dg�&|a��?��6	��)��"�=n�"�i�#�U��؅���Ԧ8����n�@	�u���m9����_�9;��[1�ѡ�Z0��VDߦkڠ��Wz�[�/̐�:~.Emz	L��{�Wx��'�u\�<�s�g��9e�v�Y����G���d(����)�<����ف}�*��:�rzu���JTi�G��bTe�:{&�g�a8�'�'[��w�]�a~�'qO�[��s�W���*�p��J0����ev�蚬e�\R�rw`��GqGq6`cj���O�ƃ�>t;�=[���~
™�$:C�a�XF[��W�)2���n��^�A$��&�Y��P�F%q=ơ!�F���S��.�,%�b��}�|'��p���x�qIτ<�O{�(��R��ar��~K沓�ͭXa�x�}��s;l��J�>��n(׳!�]��e	o$V'H����Y�ۻ;�:|�[��w�t�<+2۩�s�:zv���q8Z�m�x*�N�s^��Vh?<�|��A-��(�����M�h�B��ZzU��1֎�i��x�D5���׮'��~���Pg�~9���z��f��$f��K��+���*r����#:Et��/���Ui�����s��s��>z�%G/§y�����by�y@��S3�JG�w�v��#�N��`'����>�q��u_W�>�/�xg)h&�'��ij���GR��H���}����0m��1_x<f�is���|�g`�Ң:;N����}���(���,6t��f|hW�oB��+�IB�(�=U����TL>t�=(n�wb��\�^0��(%�E���&1�'����Y�*�7u_���S�ͣ޸���f
�^���kl S��/G��lc�)>�B�nkB�x��^�m�u�,���S%�_'���"��}�E��m���N�
�����$���K��G���pW_R��~o#����4v��>|���Ž�'X?>��\>]]^]o����H��Q2=���}C)o��o�+欋��U�pl��Xa��g�z������$��^\g�y�tkO{woD���A���Ǡ����)�4��Q�I5�§�l��2
�⚛��d�N�@P��PHF�&I,ԭ�gƃ4��Y���_d�X��eoT��ד���XL��K��0@%�KͳM��n�	���ɗӳ�6(R��;�	���M�c���̈����,X�����*�r��	�����:8Ez��ȬS���	�nC��!�}�s�J{������OP.P�q'���̣�g�=����{&|�;_^V�����hQ}�G;r�p��F���zR�Om��<yU�&.�c��Ę�`���5A�8��X�����5���
�̛<�=Ǡ�2�b�P$�
�Ɣ3k���`L���T.����vʾ#���U-��}<
�lhQ7��;����y�
C�B�s�5���7�s;�pM���?����	��w�4^稵x�}����I0��^4r�l.]��_^��Ez���sG�О�u��B��o��|!A��O��C4\�^A����{hy�۾s��$�C����Cp�����e^����f2D��q�.�Y��c�@�;�w�	+� |ڰ`,�ݰ+`�<?��P#_�|ҵ���vF�']�,:����r�S@v�u������~�cp��)�����) g]䬧���Us�ӫ�kj�E�S@&]d�O@~�?��]S?�T=�,�H�S@vͱ���' /;�˞��k�]�NO�5����e״�˞j5W��UO��5�2�U׮���^5W]Ưz*�_u��u�S��U��8�ܞ�k��U_���y�z�=��oz
ƮI�7=�"o���~󭧀����n؛���7=����cp�����k���%��]伧��0�?��a����G-�w��l�b�S��n�y|���[��N��l>	�nVC����"�ۛt��{�w�)ڏ��r�<z���Y]����O%���zܧy��͓��#;�\���������W��+8�[�ca�}�D(�W����������ZX�@
����\�Z������{A$��'3�q�5�����>���X��}����.Xi�߹��s�ZV�I=�l����?3����睳$�V�C���5wQ��8a���V^T�@
ѵ�"ZS/�Ѿ���� ��{�>��ށ6�;�)@-��gɷ���7p��ub��)�<���j����i�e�i��=:��U�؝�oA�N;OD���^]���A�W�;`�Q(�KZT�@�N�B�ގ��H�$aL�s�N�2��N�Ϡ
��۝*/�o�<�:���F������]�;>�8t�Љ�g�`�b�}��(�/��CPN]�Ȩ{ 5�C��cw����3��uO2P��+8��_�bB�B{��]\S/�͔si}�ݹ��v�? Ʈ���A򴼣7����
(G�q��wt�o�:����^��������iB�]#D����o��R��z`w6�\�\S��;�(�s����/����j�m~y�o��Y?Xfm}�g۳��]�ѧ��?�œ3�J���lݔV����2�a�A���;@��X�]� �@]N���U��
�jG������@G�{���m�9����k�5�o�����e��E�ԁ?
��%��u��Id�-]�jfq����쮹����d6a����
�_�w��gКzH�9���U����@���p�k1���"+KV�;���Sׂ�hM�d4��W�7`v>��a�iX�@��_����,Xqq}�5��c�5�
�7w�}�L)rU�����^�N�\U�9�=U��h�s�m��;��16�w�PV6���?P��۽<>��ށ3�P�,z�n����k�-[g.l��s��un���RX����C�c��܇����1§��a��_j��K~3{��1�'�:�h��7P��S����\U�9���{Фe��Q�@����aM=�ω��O�ٵ����x�z��*��w�^2�Z�*/�w����W���CP��d���ߺ#w��(W�7`~���k7���;p��VrN�;9����Н��-��w�����
�>��o�'�4�..�� �l%�eK������m�ֿ�]�a��@�;��?�G��t�XP��>���,�sm�J��(��=;�� ���	��� �ֽ�?�z��+�<�\σ�=Yq`	�K�^���;7X�$�O�;�G(���H8��ڞ�{�q�F.�49V��b�԰QL���S�{̟���(a<?/ѱ����>�O��ׯ�X_#�$�rk3���M�b��a���d�c��
��O'o��ZG։z�i�L=;*�7�L�h4������W����E4���8�H��,I
r�Ȳ�z`w�q`�S?�/B���;Nk��G�<$xf�٧o��XP�y�r��f���Q�к�zq�㏁�j"�p��f���k_1Nv�N�I�#��_}��
CVD�|)s��|��NgPd��“���к�o��9���Z����J�B�ۏ<�
{�??��\$�9|ح\
�=�.�X��yŸ�w��>�6d		��$�����w}\�w)=�s�T�2	_g��NBTFʓZ5J��s 5e1�	��0��=a�+c$�`�k/~�'���{�GQ�>I`K<�a�t1|)ugV�e�MG/�ϣd2a���<,��ܸ�#I��/��R�߅��?P���I*�xAK
���"==�N�����+�OOެ8�tm�B&nO��F|[}�H�x�8dE���iu�'�S�C�AB�����ï�	˧��Ga2�W�k`���gM�p��� �Ñ��̚�B2�h6��$9և|��X����g9�2�O�\5�kCL�
Ǩ�fڰ6�
���ӻ0Q���F��	\	4���|A�]Bt���:�r@ �yܻ��7^e���`��4��k@W���VW
��O�+U^����'A�;
��^����ʆ!V�z�쉑{f}���;ɼ�"~�e���$)�R�h U2p�4�MX/��q#`"�OJ����
0��1�c��*��D��;��A�0����d�(V����6�C�+�N�q�k\gQ�k9��О���\"�Α�4� !Cr�i�(�>Y��SĐk0��J�;~�P���z�环�����+��\vM7�k2j�֓P���KF-�M���V�/�K��4}�n�,?kO|7�R�}��ơ$f	*И���#>!�yb�*V#�[�������"�,��K�#�A֕�`@ձ-����$c�B
��I�u|�v@B~j2'a�ܘd��x@J��;	�t�O@jd�#U��O�D8X�'�Wvp�-?�$�F҄W/;.��!�톆�;��njPgW��H�
�����",����qz7D,�i��z��b�7)��v�P�6N6¾‚�wu��; z'2�&��b.�:��D� G�³
��`�ȉQ���
	�Fx���ە�QiW��/��0�W��"[��Yjh���/+����g��o����,��ʎ�}�P�
]:ߒ�j.���D�x,���A%��7���%�jd��_����U�
���VWR�5Q�D[du��}�Zd`ӏ���)\;K[������s�z�gX�
%GM�]�s)z<�8?M�k{6O����������Z��XNJ�`f�60�(�$%Hi^�(f�v�����}k��A"x`��f�Ǐ��`�	|g`�f�k��~-�m�uƻ0G����c�IFi��H���_�NJ�~D��H������ !q
P
`	Q�s%�r���D;gAF=W��F���rrz|{L�߄�H�$� _�8T�$$��:3/����H���R�L���U�����?�}}hH�z
��ܣ�Z0%I��5|#��=Q��в��(����Ǔw�MS�Jk��8!�95����oyA��A�i����=!'uIzO
��8�!�e�.zE���|��?�HRr&Ϭ�<lz$s(�Rc���@=(�47�#�\�d\,�n�"Ȍt�ǻ�P�FM��=�	�eKS��6�
������p�@���c�����������FvmŎ]%iG�:۴ˈ���<ӗWr&A�e.��`�4����?q
�6V�����i��ۖ��p�XbK1�@um'�0�_	�h�DI"�^SS��1�5wAHR�'�U#��7P!�1�Mo��Qrh��8V�4��
�V���8%���a�;���"T!����0�=�|�a��>�`?�͛.u$&H?���0Ÿ�Yep?�����z0�Ai�C�H4�OF9$߶�pq\�m�<��|Uc
�j��i��$6_cX=�g#3�Yp��hF�l�IǜL|{{��w��d���!
/��.�
��F��Wx�XH�<Ĕ!0^̿w��0
�)L��{���-,|*f�H	�K��?�4LV�b-22J���2��n�E���A���+%a/�W>�p0��D
r�R��ʓI�*��t��~1��d�aVP�A�6J8X�l��C���7��x3@4�w֑�WR���Ai���u!��I���8�&zL�����b��u~����:���Qdz8���;D��=s���r�;�j;0��1�M5��G��	��&S8��D�0k�*"�u�y�W��1�Ke'j��X��s�
��ןR�/֏��w�
�#�����˚�<$�O
��W0~�|�3�^�1߼$AҘ��o�Jh����.o�o��r���ϖ�K��߄�8����/�uv�0�,��ө�秖of��ע�V*�^t,n�sA/4�+lW�26�yK���3V�`c�	ł��Pt3X�bl�C1�S�BT�4����U�Q$b�;�?>Tǥ`y���/Wo@)�0����P��8�^�H=�L\�"��38H�a#!|����U��R³8�L-���+�l
7�!�f�	hOZHZ��3�cOm\9;?��@��S����TLj\�|�![��8H��	Y�*r8@�!\Y�3h�S
`⨪�d	��0����A�ILj�����n�\�D�����es�a�#;23������H�ʲ4җ�d�N)���E�"��e�5�xbWD�섗_n�oϿ\nh8F�ƒ��ҳ
@H�G��a"�p��=��gh���$�ПR�a`�mR�Iy}������a�Ⓜ�ڸܸ�z�a��S�j9�����'������$�QMk�u.O.ɴ���ğ��o��X����ǯ�=`�'~���,���7�~_��O��g�˞�8����/*_�%kK<4�&�ҵ�G��ͮl4KȩjI�|Z�X�LG)��\�B��W@ݭ��PK������h��u�4F�#(��p�^3�@a���?	TР�ϤZ69�����F��ޓǶ�c�rk�����μ!�$g�ߊ�T�NKij'�Dg u�Qs����P]p��v
k��5�u	�Q��yK���ke�ں~
CE�Μ�ůr�+���ui�9�>�Rp�Ss@Z؞�'t	�-a�1�0�2#�w
25n��,�L�,c�d�7�B��멊��Yfe��e�84
?�j^t�A7_�4�f�!dT�%�:�FF�hހ��}���Ǝ
#h���[����\�ϊqr�S��>Xmk��U!oe�nK�ij`�I��L��L��e���x~|H�iY���7��1WF~��q����Q�9����IN�J��!q(a��_T���TEۢ��ܪ�t�J�F:7
A�^��U���v~�k���U�IM��z�Pl���₼
�� �+��ɤ���B�h@;�VK���}df=�WJy�G�����ΰa�]:L
�9GJVP����cݝ�ڱ�
rT�[¢E�(4۪�VP�,WF��oҴS�MY��`fy�7,,֬���k�y�M��,Ȓe����}��ٞ�={F��}tk��ޯ݂_�:Z6GP2�ZO%k��������������D�Kg�A���[�n@�<�3�	~�F<��#�a���<v���S�ʻC)��'��DX�8]X7
=��#w�z6�����p��ae�X�j�Lz��(!:��r8�:����R���((��]F,�N��'�pb�G^��d��ޝ�k�/x{��H������Y�,�Vo�"�?(�z�7��F+{8���*<�ͰaJ���>���?x%��d�8�)�G����4��;>��^�,�|"���7��OF�q��ҋ���˓��+��|�w5�BnS3/5f��������^�m�K�GR����"���)��4�u��+6�����ʚ�>��w�D&��D6-M|�Ou�u�3c>ieV��I�OM���v�i˜��8�9JD#���YE�<{��S�xʼ?a,jRxxq!�
e���&ʎ�&5�N!�I
��pOχJm�Yq
�IW6�"�$A����`EQZ���ZdSƟ���sO]]�i�?��A��7925{d�BUF6����Pp�M��g�
��:�$�3ݰ%}]Bg�i�&��eN����e��������]&�N�A��q;�ꖰ���I�E�EW%ꇾӆ���Z�P鍈��Z0��p�Ĺr���3<Q���e
�c��J�Kji����>XƲ�I�cHWv|w�8\�P#zߞKל���_��Li��,�v�d�v)��Vd���q���9*n��sA!,�5�V��}����۲Mu�FOd~V��,k��3D��e�H�[ަG�ʜ�^ �ȣ����Y���	�`�f�md{)���@}���9��'�)��C GFO��O���Ih��O\.�k�υ�M�c�+.�Ν���B��~ͮqU�g��"��c��v���f�Ǹh������sX�"e,�W�'�
�I�	�x�{�}�6�X�q��A�	�$���
%��B�����8�o�a�7�7đ�N�3G=K�4��йm+�AD���'D���
�h�\��KJA�bʍ9�)BlOte_�����1�H�����6�-~#RU�M�t��-Wj<�F+�j�Q�;�ĎbI���%��Mfy�)%l�_ȽP�28A2�D2)���BA�`-���ֽ��$n��_�r?zh=ja�K�ۂ� ���-P�	AЕT�;x��*��n��#�S�z��<�xbہ^�g7����A�*l�+ئ�C�u�k��>�[�׆���Køh�$����ڥ��v �l~��I.�-k�����ԏ�^�]�7Dt��[�]��� �Jx���ܢ�A�M�+b;$�](�y{qY@�a:8��$l}E�Cq�p�&�y/�R��
�1u�m�.J��u�zn_�Q��y�y&fA��\X��w�GA-wh��
m�����'�"�wŝB#�x�^��d("�+d=ji͸����=m_���&Mj�(�}24OW�E|~&���h��}����! ] ���0NC���a�����Q��_�Nn��k/~oE���d?}���0����Y����Y�B�P�A��.A�����0ޙ�r,q��M���q���Xo�nw���'�;��:��4�����ۯ���O�Z�|�M3�Kw8�F�n�;�Pşiq�g�s�?F�X�[*Q�G=)�
��@�xcaB~#늅_��{����ggg���w���)ߊ0�DEy@"��,kTH?��i33`�$�.V�i�l��3�L�p���k�(3��M���L����/����]2��^)�}R��9Dd`r�8�D�q\0�-�m�]Ol�2s=����}E+
5�+<�7r�(�cw/΄�ir�_�	?4��;;�Ȧ�e�eȨ�(��cC�8g�i7�m��OTg�+J��y6�"ªGd/�&X��m��	��~S��JA�*�3��s4Ƚ˓C+6�c�)���4HB�Qs2�v�D1_m�n�����d�~���X�j#��$�F�E�
]����R]�,j�R��?�_+��wR{�g��W�M��	L2�5�S9e"�n�MK(���OdQ�1ͩ苸�"d*6jkCJI��!,����iE58q��G+0���O���v;N�~��0ك��8Ɖu�����9l
�}O��m�:�J�Zˠ�R��=I5sʄ�l@�ˠ/�~����H�~gl�8��d�,z~f?��df #�N��u^�1Ry(H��=}��~�;�����sä;s���`h}�X�|��7��F�޼~}8���j.{�
��TV�x��%&��c���df�V��
��E5��}�޵��+�TTi	��(Z�7��ؤ�C)C�XY*��Vp2UGbf��;�jFs�;d��5�V�-�v�"����kT���qV����d%ΉT���Xe��}$�c��/�� ڱ�I�k.g�X����x�a;���{	����K;	ӚP�pE��U��-{��Ndn�ؖ-���+|9�#3۩�P
�a+Kj`�b!��C��q��8���>_3�]��]wj�Y�M�ԣV���:i�;n�j,�_�s�_�w��4	X��<\��XI���\��v,ͧb�LO��\i��oI��l��"����OD�����L��x�h�}:�8�˜��z�||M��|���8�[����t�T&aO�oؘ��w�
��t-3���x��I8�H�m��G�i9TL�4�?��I�e���ڸw'��X�{��>�����:�n|����Ԃ���w�3�AjZ�t?�w�m%s$�!�T�
�
(�#qd�t���)ʥ,�^����.Y���SNI:��i��v^�2��)����y�EG���-#'R����MUB�:d��_�$��ɦ�"B�(^�4_�S.��I�@e殠�-�C����KD
J	�>
�w��K�d��+/{�U7�u��O;��^-����T��dp`e�E��i��f�@�
m"���H�����3�.�A�N���m�ڢ@*�3����f$�"�ůdA�>0�g�A��c+���Hv(��T�P�%����8�Jf4��ꛏ�ou�r���D�Mǒ���u6�>8|�k�A_�>C�p��SH��
T@XUL�YX�Q��f�6���V�\����@P�/�(�
��܂6�y>�Ҕ�R�D%dh[za�2H��і m+�7=�)$����f�+��1~sӤ������ѩ2�S���)�����q�&�N���\L��$�v8�#)�����e�^-2�$��e6�/߭Vll�-��/0V+~6E�,�5�ۺj�؜0��3{Mz��B�/�"̚\H�z�k�
Id�p�p#.�ݞ�O�����^�#���/ʩ����߮P��[�f�;}S�!�a�V.�]��\�ݾ��Op7I���Dl�0�ZŽTY"�>,��țA��+��X%�4�R�#����M�lc4YL���t�H����˕s*�o�t:��v��a�H&�؏��ap�����hz�[���N�;�:B�L⾔�H�C�	m��k�>��K�uȥ��a��[>�)��jk�F�4%�̍֊@Q��"Z��k��ECJ`A�-�oۜwq@+@t,��F:��%F� �֤N��R1�Jf�T�̋5i�pZ	947�]��\w�*1����]|Di�y�^�J�ߒЭ`,�ǩ�;}��Hj�nTтXL+�~O\�#5�P����;�s,���Ik~u)�T3G/�j �2/�D��ս�ד�WZ�>����2o���T-��OyN��W%Ȳ���l�*Y�d����uo�^/o���:f���P��^�ץ����X,%����;;:��nG�%��w�T��w���Fߚl��X	�䃌��ʔC���b�������a��s�=wvhxs���n�d܀����)yB����J|����S� ���������o�_�\C.ca�@w��E�DŽ&���^ָ�yRGCZq[�=Q��͗,6��L���[��|�J�0��h̓�n�uS��%����{�Kh�{h��Hwn�L���w��4m�W�M`�x��-�k��h���p��1��gvL����1�o�/z�qȸX�4K��%Մ��v��!�*U$�
��$���
��ez=�ݍ���+�mss������6gW�g'Ƿg��6�^���l�@H5<��	6��.H�,n�ڞ�O!19B��вγ?(
��
�"�Dwu�"�p݂k�5S�n>��,['��}4tu+n��-�k��ަ���_T0�-w�����3���-�����;g��nx{�~��ü������^���e_�ic�]���Pi�6��#2K�h[jX4x�_��_�y��w�?�|=�a�K~��d5�*T�F�!<����B*��BX���f�'.����
�JM�_ͺk�EI�5t��^���x�,�ʗ{*
�|lT�؝��������%1g�i	Ѧ&�t�"84���ߙ13R��l��U�2,q�ѩ3�3ʴ1X\k>�k�c��`2���a5����vg+f�G�ϑtx�R�^�����ug���*|�EI�v��F�EE䏷����u!��e)H�v�5|v!�{��r!^>P(�k�zI����睊�
�L�a��wM^jU�o�D�p��mӐ>F=%�f�HS��&�Eߩ�pRq$��ڟRK��HHӃ��GW���=y���ݜ�6�0�ɑ�%|���p��*� m<�`�gyk�_�N;W6XY:�LJ��
���`��L�������s$.eG�|��jj�U��zP���ܘX~�*�F�ϖ!�,��s��,����G@��?`|��a�O:Ǻ�K����~���_��wxSh/�Q���E���}�������﫛B�}�m��,�<�ݒ]��^�����=s)�Jio�pu}�Z<EK��2�Q��4<aE�u�������z�2^��m
@����1��O�pf��x!(��i��g���B���ܯ��4��4"�����L%� r���
u������
����K�-�X;&������E�G;��JS�6U:�*��e<~rH(n�*�ZM���g�#;�D��������"�r�N)��u��2@�(��G��B�/�1�Z�b�W��N��pU�����3��A�\���X��[��mhc/�K�*���H������_�͆+���o?�Q����)*
x���#Ra�\�KK�Fmȼ,�Y�v��Q`��d��P�/4Sp]�P�E΄�/$�9��0l
����u��V��+x���/Ö]p<���a�v�����5k)�R��n��%�ޤ[�����΋A�Ꙃc�@��I��U!c�1���^}��u$T31R�S�3	��$_��U�SG�]-g��o��~ygE�|��uz{
��p�^UMӈ�Ci��&�����nP���Hd��_�X~@)ch9gžWԥ�S����~�
q�z
����bI����{�/�)>�)�T�q�?jqOhkZ�$����X���c
ir-a�ה[6�^��YR[�=k޲)~�ԋY��@�i��ۓXfL,��%�^Ⱉ�)s0��}����;fi�n����uOЍ	��yݣ룈�����S\:E�|&�˖["%C�
�<��O9�"��O���(%M[��Q���*��b�����Wg�s�R�{"*�&	�IX߄�R��Ϯ�)GJ�Z X�9�צKi��,S� hi?.℆-Kʩi|1��5r��E�o�:(��3��\-����_7(
��@4S�&��b{����u��BM�K�…����>
���r�ҽ�J��
M[�=�O��Ih�ƫ{3����S���0�`^�H�Er���=
Ԣ��-9Y��/Bu�D��+c|s���:]�ݝ�t����F��K"Q���C������t*7����l
��2�4�{�A�*�k�$�zI��ƚ��83v�L4��}�~ω�AN�6�	�w�CG��Q�*��
m.�W��
��%<F�+|��
ѥ?q��j"�"�ɘU]u�~@i~��u�����r���
�V4�EB�Y��(��E�ts�s��Ё�cw���.�h��.�H[�)��^���6^�x�Yʙخ����H�����v^Q%�>�R�vU<~Y��A��K��������5N$g?���j4�Z31���I����||�J�l�S�r��,����b}�J׼���������zk��\�ܷ��=w�1ۻQux�b�����xh���QC���w���=��7�X,���*i�l8����`��O{��״�g1��,*#AF���K�Br"�3���B�Vm���"��#i�L��@��v�ݢ�����\����Y���
$��%J'��s�ٚ�W�C�L�,�T�D7��ɬ�\��ʓ�^���c���ޮN�&����k���p�§RֻNm�-0�\y��	5d�5�;�v�i��q��~�(�RH#�pVԌ6oC��`���B��_�um�E�ߢ�]O{�
�vM2|�d�	+l8���]�Sk8"����]�9�Z���X\?<W7�K�Q��dZ9
���ϩ�t$�����0�߇b��c
𐍦(Z�x�h:E��dU��m=hKS��"����o�vU@��e���J�w�������3Z��������Y�NnV^����Ǫ���eW+�>�;��v�H{��h(��x؝�A�Sn��"��gŶ�V$p�q�9�d�d�3�)󅝺hgm�S�#ƞ-O]�β�&�vcז�6}l��asI��dʻ�8����_iXㆈh���P��D��L�χ/�tr\�I0ڦ�B�/��1L�)�|���r*1ݩ��]M��*j���h0ڪ�z�bvR$1���)�c��d��l��Z��c��DC�	_��6`�H���.��{��� ���Ը"�q���H��X�d9�ѯ��{)����Q��)Gj���=J�O��A��Ø���7�Ңn��>:�d"�@������LY�|�%�h2*:h�w�����R�P�F+��m���g�<��^r-0�9·�y>yͷP��h�=v黼�~��ū�}"F���7���:��f:����z��+|[�|
�6փs-��r�M�}�FT4����u��U9&��K����8�Y��bg$�C�mu���JT�ܿ繗\~@$@M~ώ�y���a:,͢�+|\|�m`݁���*L�b�˰
6;R���u������٪�'iy���a+~�..�R�-"�'Ge�
:�c����J\�K�5��ц���,�jGx!��U��>8-#e��</�C�h���ą�	��,���6̻GG���;����J-.�����~ �kI6oqSY�%�ɼj�'�T�jr���w��THns��̵�b
���)
�Z
����*�f�GV3�Y�+j��B�Ն��BPZ�t�6�2~�h:�Y�jhSL�|t�d�ʩ�d��̮�cg0T8�$���}���4r�$�}$�A3�����F3���^=Z�p'm5�l|��x�z���'��59�c�:������~?�[�u���	;�P.�]���	�u��zGy��c�G?/H�ٮ�Kt��ԙ�76%��еI�l������b:b��2R/=W���Rʿ�+_ű��|F�J��K�	f��w�Wx�D�,�/$�lStQK܍��g�A�"3�rAfW�E8x.�tӴ�\�\���$��B���<�s�p.{TEM=��{�n�AЎ��<�4hڒe�'���g��s�pu&��CO@���W��=�M�@�C�Ch��HDK:������T�*�"�#�ML�2L�Α��Es����0��	��H�{vYtk�S���)em��biEr�̰��H,){�2SƨcU	NJ�c����k����$�ڭ��Na���~rM�V댅b?�#�^y���J�������u�9���4~��{Ω���ᨓ?���8+�����߾���O^���.e�0��V(1���-^�7�s��%V/
^ʇ.���7��o�P}}��_���XŹ��y�L�g1y���-�^J �ɴ������� D��Ԧ[�42�?OɣՌ>�%�X3oX��Xm���i^=J�)�	9��8�U��RJ$������$1E������9I:zgY�F�sT������:.��4�%�XJ�a��/G%�����z��a��My�,��l����.�˅'���?�[*��S����_�Ú��<\(ޕ�p��1&��ޑ�XR��� �K(�Ndo,1vgX�<gC�=���-�^�ΉF`��+��:��<s�$�"w�[G��kӻ���k�J��]!r+��9�R��>p

7�Q,n���Y��~/�%X恹d}s����C�S��K
�?Uq^�;�	Rx�l����S �R�Q����3ۇ�;Jh0��f��:|Sٜ�΁s$�RqIx��2;�ݙ�2<�'�����ά�����g�cy!g�Mïef��얝��2o�x��E|jh�I�7�o�l�Q�/�n&Vޟ�T���t�
.�ȣu�Z�OejPd~*�4���Y�� d��[���}1�v�0�C��b�
�(������s�I�GrC���z��E,f��VkRœ�*��76H����$�ix�rDWe��{��t�}��d�Rǵ؎`D2�cn�2֧���XS��TV��n
Y�]n�"JT�@P*�{h}��G=X���y��?����߽z����?���C
2zD�g����#��^Kd�}$	�'���
GM>���I�x��&5�vN���]�ӆϽ��х���H�[W��9w(����vB&�&���H�%�HZ������0}��`�����~/����)i�w�+Вuvt�+@/���b 4�.����D�+s�x��͢�l�j��gdpȟ���%��]���VC�6��?3Fc���ED���&W1��Q�TѓP�G�m
ٟ+-�*���A�����D�\Y�{!�˜hJ�^�L��:e���/n	�#;5���,���@��D;��f(�U�qx�I��A�R�G���]��X�c�p�Zߡ�,	Y}����f����v���f���¡{�⻖���P�7z�f����k��`<�r�7jo���]���^��rk���D��g��ӇW��7���h>�F}Y�3����x/�vUkeo�N��L���U9���*�o��o�BȬd,���fII��myQ�7�ӎ���.��+j�kPv�2��Q��"�o�X��T�L�ȚY���T��Zl� �0��D%ޓb�
�NKe����:fð�<��i=�"��X!K����3�{4�}��$o01��fD)z�T��*/}f�v�Z#1�1>p��*����R�J;�Wb��X�VLx�r7g�l�>:�#�/L&Kv�DQPɿ�(|�����o��.�����i��hg]�{GcAV�ꍫT)1��plT��֕�w\P|��b�b��e�](���2ca�
D����Oɠ�� ^2��g�

SW���rܮ��M֬cM|rI�I&�v��t[e
o�� ����Z�e�-S ��s`��l�z������|FYCc��%?l�>�x��M���V�2@q�X7��a;��R
	
<M
5�۬M��q

�ae�r3Yn?��U���me�Csc�m�h��3(��f���m�����rw��	CdO�0���^p�<�)�$��E�&l��(�����˾Y	�q�1q=�߅<�{i�8�߬@��Ʋ�k{6O������rr��$hi�7֋��P�����l����d����:��x��X�����TTŁT֓��%Ŷ!K��
�;��x���v��2��T�82;NVp�а&	�ݛ��0_��3^�0��l7�����$�2v�<�`Z�Q�+S�:Y%.�ë�)3�KSC���6��0�m*�B���[���\�8���n����X���T�����̼OO����Dic4���&O��;>�88��,��|o��v��Y�vKW�$�5�rq�	�\m(#�v�>�h��¹��jʤPS*+D���_5�	�e�ƌ�&���5!or�8���8e����x�L�jd$����$�<�é�Mi'��i��$��.��1uXeAUzϕ�9�OH���yM)�s����]e��#mن�H]qo��i�m)_���̠Q��N��-�]�g�����ɿ�G�/G���,�iǎ-)��W|��8Pƶ���x�8v4�:�7�N�h�R#�
��Z�+�H�*�G$�RF�po+
'�)
ƫO
|p:{���OK0�S��1�)\��G�qH����K�px�=��C*K����U�%�.������H�l��_���Y��'K6�7+��A�!۶+d�W���X��j�+s��N�^���}�Xh�ժԜ�x/�
ш�4U�PGQ'
)K/�x����U�a�A��c�[F���4�g�CP}����^سP���MK\��d��J�οɱmjM������������|߯�%l�?��BL�վh�=W�e�μ~f;:�:F�b��
l�C̿��
��Y������t��c�ziQR�h%��?є&8h�-�����3+�IF�*v�eGV(:�-pL}!�,��/K�;�h��Iz��Z�6�g��sh��:��N*��[�����D�ek����J��|��\>����d?�S��7��®	ͷ�b�TP�k��K=�ʴ�f�)��(
<��~N���-��g�e%�U0��'H,@4�9�b.-*0�B7V7�E�,�+�IZ�� ZkZ�^[n�7W�$��f������������t�%4�Bdoc/alt-libxml2-devel/examples/test1.xml000064400000000007151730335170014137 0ustar00<doc/>
doc/alt-libxml2-devel/examples/reader3.o000064400000065630151730335170014077 0ustar00ELF>]@@:9	

-/,0+1*2GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��ATL�%UH�-S��uH�nL�f�
R�1�1�H���H��H����1�L��H�����x[f.�H�����t�ubH���H��H���H��tH�=H���H�����[1�]A\�H�=M��H��1�H����H�=H��1�H��H����H�=H��1�H���preservedtest3.xml%s : failed to parse
Unable to open %s
%s : failed add preserve pattern %s
�
�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�7(
��0
��8doc
�7@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'7
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
07@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�j0
��
��
�P
��
��
�C 
�7(]j`
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
�CX�
%�
&��K9���CB3��C�)M		C	C)W+	1	�@	����������	
c�	
j�	�	Ja��JaJ�K�L�docM��[N�� !�!�!�"
",
�
#
#
$1
%T1%Q	%Rv%X|"
7
M#
#
$1
%T1%Q	%Rv"
D	�#
#
$1
%T1%Q	%Rv&=
�%Uv%T0%Q0&J
�%Us%T|%Q0&W
%Us&c
 %Us&p
8%Us$p
%Us&|
g%U

R&�
%Tv&�
�%Uv'�
'�
�(�
)�)2�*doc�+ �	*ret!	a,da1
)d�)d<�-.Z/
I/

.
�/
.
v./
�/
/9.�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B:;9I�B4:;9I�B4:;9I�B1R�BUXYW1�B U!41�B"1R�BXYW#1$��1%���B&��1'��1(.:;9'I ):;9I*4:;9I+4:;9I,.?:;9'I 4-..?<n:;9/.?<n:;9U�U�T�T�
�VV
�\\V0�0�\\\VVVPVPSSPSPP
�
�
�,gQ�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlreader3.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hxmlreader.hxmlversion.hparser.h!	�K!
%	YK
RXZC�	�
�	�	�	[R	�8	@]	\��\Y X
� 8
�.
Q-
�R�#	h. 
�___off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDreadernsDef_codecvt_private_xmlNsxmlNslong long intsigned charGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endencodinglong intoldNsparent_flagsextractFile_IO_buf_endstdin_xmlTextReaderXML_XINCLUDE_END_IO_codecvtExternalID_old_offset_offsetmainxmlTextReaderxmlCharxmlCleanupParsercompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocfprintfxmlMemoryDump_xmlAttr__streamlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLXML_XINCLUDE_STARTlast_IO_save_basexmlFreeTextReader_xmlDtd_lock_flags2_modestdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitiesfilenamexmlReaderForFilexmlTextReaderPtr_IO_write_endXML_ATTRIBUTE_DECLreader3.c_IO_lock_t_IO_FILEpatternxmlTextReaderPreservePattern_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlTextReaderReadxmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotationsXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdup__fprintf_chkXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODEintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypexmlDocDumpXML_DOCUMENT_FRAG_NODEargcxmlTextReaderCurrentDoc_freeres_listextraXML_ENTITY_REF_NODE_wide_dataatypeelementsXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESargv_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�,F�H�H ��
CBA
�	.+B/]y0��1��2 "$&(/01234.5-2
7<A*FRbw�)*+,-������18CN_mt.annobin_reader3.c.annobin_reader3.c_end.annobin_reader3.c.hot.annobin_reader3.c_end.hot.annobin_reader3.c.unlikely.annobin_reader3.c_end.unlikely.annobin_reader3.c.startup.annobin_reader3.c_end.startup.annobin_reader3.c.exit.annobin_reader3.c_end.exit.annobin_main.start.annobin_main.end.LC0.LC1.LC2.LC3.LC4.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlReaderForFilexmlTextReaderPreservePatternxmlTextReaderReadxmlTextReaderCurrentDocxmlFreeTextReaderstdoutxmlDocDumpxmlFreeDocxmlCleanupParserxmlMemoryDumpstderr__fprintf_chk * $ % & '++	-��������.��������)C��������5D��������NE��������dF��������uG���������H���������I���������J���������K���������L���������M���������N���������/���������O���������N���������0���������O���������H���������N��������1��������O��������

#
#
#*
!@%
"*
#\8
#�?
#6H
#�O
#�V
#�]
#�k
#p
#|
#��
#��
#.�
#+�
#�
#��
#�
#��
#��
#�
#�
#>
#4)
#�6
#C
#�P
#]
#�j
#bw
#��
#��
#,�
#h�
#\�
#��
#��
#n�
#F�
#C�
#Y
#j
#�!
#;-
##5
#\\
#pg
#��
#J�
#p�
#��
#��
#w�
#�
#�
#�
#� 
#�&
#Z,
#g2
#w8
#>
#�D
#J
#P
#$V
#�\
#�b
#�h
#n
#t
#rz
#�
#_�
#��
#��
#��
#[�
#`�
#u�
#��
#��
#B�
#"�
#��
#��
##�
#�
#�
#�(
#�6
#/D
#$R
#c`
#��
#��
#z�
#��
#��
#��
#T�
#T�
#�
#�
#�
#�*
#/8
#$F
#cT
#�p
#~
#�
#o�
#��
#|�
#��
#��
#�
#��
#�
#�
#�
#/-
#$;
#cI
#�e
#�s
#��
#��
#��
#�
#��
#�
#��
#��
#�

#�
#�)
#z@
#�G
#�L
#�Q
#�^
#�k
#�y
#c�
#��
#��
#��
#��
#��
#|�
#��
#�
#�
#� 
#/.
#$<
#cJ
#�s
#y�
#��
#_�
#��
#��
#��
#P 	
#C	
#�H	
#T	
#�`	
#�l	
#�x	
#@�	
#��	
#P�	
#��	
#��	+�	
#)�	
�	
�	
#��	
A�	
=�	
#��	
�

z

#7

�

�$

0(

*1
+-:

!J

�N

{W

�[

�`

!i

m

v

]z

S�

��

��
+��
+��

�

�
+��
�
+��
+�
6
4'+�=R+�[+�w
d{
b�+�*�+9�+R�+h	+y!+�9+�O+-h+��+��+��+��
#2�
#��
#7�
#�

#f

#�$

#<2

#M6

#M>

#�B

#�K

#?O

#?X

#�\

#�d

#.h

#.q

#Bu

#B}

#��

#��

#�

#�

#��

#��

#��

#��

#n�

#n++(+(+A+I+,T+,\+�+�+�
�+�+�+��+�+�+#��+#�+�+�+0+�8+�C+�K+�W+_+�+-�+��+��+��+��+�+-�+�+��+��+��++%+�0+�8+�]+<e+Qp+Qx+��+��+��+��+�+�+�+h�+x�+��+�+�+�6+�>+�Id+�l+w*
++-+�+�+� +�(+@+H+`+ +.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rodata.str1.8.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group9@729P739h749�(759�76�!�'�1��,@707	G�V��Q@8707ph�h�@h707<�<��@�707����@�707��	8�@�707 @(8(7,29=;2x%O��
J@P: 7[Y�n��i@pSH7 ~~ 0y@�Y07"�� `�@�Y�7$�!k�@�Z7&�0y#��0h,.��,�,p�,G�,�,��,��,��,��,�,�, /�,H*@�Z75-�8A	�4��Z@doc/alt-libxml2-devel/examples/index.html000064400000115330151730335170014360 0ustar00<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Libxml2 set of examples</title>
  </head>
  <body>
    <h1>Libxml2 set of examples</h1>
    <p> The examples are stored per section depending on the main focus
    of the example:</p>
    <ul>
      <li>
        <p><a href="#xmlWriter">xmlWriter</a> :</p>
        <ul>
          <li><a href="#testWriter.c">testWriter.c</a>: use various APIs for the xmlWriter</li>
        </ul>
      </li>
      <li>
        <p><a href="#InputOutput">InputOutput</a> :</p>
        <ul>
          <li><a href="#io1.c">io1.c</a>: Example of custom Input/Output</li>
          <li><a href="#io2.c">io2.c</a>: Output to char buffer</li>
        </ul>
      </li>
      <li>
        <p><a href="#Tree">Tree</a> :</p>
        <ul>
          <li><a href="#tree1.c">tree1.c</a>: Navigates a tree to print element names</li>
          <li><a href="#tree2.c">tree2.c</a>: Creates a tree</li>
        </ul>
      </li>
      <li>
        <p><a href="#XPath">XPath</a> :</p>
        <ul>
          <li><a href="#xpath1.c">xpath1.c</a>: Evaluate XPath expression and prints result node set.</li>
          <li><a href="#xpath2.c">xpath2.c</a>: Load a document, locate subelements with XPath, modify said elements and save the resulting document.</li>
        </ul>
      </li>
      <li>
        <p><a href="#Parsing">Parsing</a> :</p>
        <ul>
          <li><a href="#parse1.c">parse1.c</a>: Parse an XML file to a tree and free it</li>
          <li><a href="#parse2.c">parse2.c</a>: Parse and validate an XML file to a tree and free the result</li>
          <li><a href="#parse3.c">parse3.c</a>: Parse an XML document in memory to a tree and free it</li>
          <li><a href="#parse4.c">parse4.c</a>: Parse an XML document chunk by chunk to a tree and free it</li>
        </ul>
      </li>
      <li>
        <p><a href="#xmlReader">xmlReader</a> :</p>
        <ul>
          <li><a href="#reader1.c">reader1.c</a>: Parse an XML file with an xmlReader</li>
          <li><a href="#reader2.c">reader2.c</a>: Parse and validate an XML file with an xmlReader</li>
          <li><a href="#reader3.c">reader3.c</a>: Show how to extract subdocuments with xmlReader</li>
          <li><a href="#reader4.c">reader4.c</a>: Parse multiple XML files reusing an xmlReader</li>
        </ul>
      </li>
    </ul>
    <p> Getting the compilation options and libraries dependencies needed
to generate binaries from the examples is best done on Linux/Unix by using
the xml2-config script which should have been installed as part of <i>make
install</i> step or when installing the libxml2 development package:</p>
    <pre>gcc -o example `xml2-config --cflags` example.c `xml2-config --libs`</pre>
    <h2><a name="InputOutput" id="InputOutput"></a>InputOutput Examples</h2>
    <h3><a name="io1.c" href="io1.c" id="io1.c">io1.c</a>: Example of custom Input/Output</h3>
    <p>Demonstrate the use of xmlRegisterInputCallbacks to build a custom I/O layer, this is used in an XInclude method context to show how dynamic document can be built in a clean way.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xinclude.html">&lt;libxml/xinclude.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlIO.html">&lt;libxml/xmlIO.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 105: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 117: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 117: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlIO.html#xmlRegisterInputCallbacks">xmlRegisterInputCallbacks</a> from xmlIO.h</li>
      <li> line 124: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlReadMemory">xmlReadMemory</a> from parser.h</li>
      <li> line 134: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xinclude.html#xmlXIncludeProcess">xmlXIncludeProcess</a> from xinclude.h</li>
      <li> line 143: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocDump">xmlDocDump</a> from tree.h</li>
      <li> line 149: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
      <li> line 154: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 158: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>io1</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="io2.c" href="io2.c" id="io2.c">io2.c</a>: Output to char buffer</h3>
    <p>Demonstrate the use of xmlDocDumpMemory to output document to a character buffer</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 19: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> from tree.h</li>
      <li> line 20: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 27: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDoc">xmlNewDoc</a> from tree.h</li>
      <li> line 28: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDocNode">xmlNewDocNode</a> from tree.h</li>
      <li> line 29: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodeSetContent">xmlNodeSetContent</a> from tree.h</li>
      <li> line 30: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocSetRootElement">xmlDocSetRootElement</a> from tree.h</li>
      <li> line 36: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocDumpFormatMemory">xmlDocDumpFormatMemory</a> from tree.h</li>
      <li> line 43: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>io2</p>
    <p>Author: John Fleck</p>
    <h2><a name="Parsing" id="Parsing"></a>Parsing Examples</h2>
    <h3><a name="parse1.c" href="parse1.c" id="parse1.c">parse1.c</a>: Parse an XML file to a tree and free it</h3>
    <p>Demonstrate the use of xmlReadFile() to read an XML file into a tree and xmlFreeDoc() to free the resulting tree</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 24: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 26: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlReadFile">xmlReadFile</a> from parser.h</li>
      <li> line 31: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
      <li> line 45: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 50: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 54: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>parse1 test1.xml</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="parse2.c" href="parse2.c" id="parse2.c">parse2.c</a>: Parse and validate an XML file to a tree and free the result</h3>
    <p>Create a parser context for an XML file, then parse and validate the file, creating a tree, check the validation result and xmlFreeDoc() to free the resulting tree.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 25: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> from tree.h</li>
      <li> line 26: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 29: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlNewParserCtxt">xmlNewParserCtxt</a> from parser.h</li>
      <li> line 35: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCtxtReadFile">xmlCtxtReadFile</a> from parser.h</li>
      <li> line 44: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
      <li> line 47: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlFreeParserCtxt">xmlFreeParserCtxt</a> from parser.h</li>
      <li> line 61: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 66: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 70: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>parse2 test2.xml</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="parse3.c" href="parse3.c" id="parse3.c">parse3.c</a>: Parse an XML document in memory to a tree and free it</h3>
    <p>Demonstrate the use of xmlReadMemory() to read an XML file into a tree and xmlFreeDoc() to free the resulting tree</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 27: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 33: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlReadMemory">xmlReadMemory</a> from parser.h</li>
      <li> line 38: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
      <li> line 49: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 54: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 58: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>parse3</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="parse4.c" href="parse4.c" id="parse4.c">parse4.c</a>: Parse an XML document chunk by chunk to a tree and free it</h3>
    <p>Demonstrate the use of xmlCreatePushParserCtxt() and xmlParseChunk() to read an XML file progressively into a tree and xmlFreeDoc() to free the resulting tree</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 45: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> from tree.h</li>
      <li> line 47: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> from tree.h</li>
      <li> line 67: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCreatePushParserCtxt">xmlCreatePushParserCtxt</a> from parser.h</li>
      <li> line 86: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlParseChunk">xmlParseChunk</a> from parser.h</li>
      <li> line 94: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlFreeParserCtxt">xmlFreeParserCtxt</a> from parser.h</li>
      <li> line 103: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlFreeDoc">xmlFreeDoc</a> from tree.h</li>
      <li> line 120: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 131: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 135: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>parse4 test3.xml</p>
    <p>Author: Daniel Veillard</p>
    <h2><a name="Tree" id="Tree"></a>Tree Examples</h2>
    <h3><a name="tree1.c" href="tree1.c" id="tree1.c">tree1.c</a>: Navigates a tree to print element names</h3>
    <p>Parse a file to a tree, use xmlDocGetRootElement() to get the root element, then walk the document and print all the element name in document order.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 67: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlReadFile">xmlReadFile</a> from parser.h</li>
      <li> line 74: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocGetRootElement">xmlDocGetRootElement</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>tree1 filename_or_URL</p>
    <p>Author: Dodji Seketeli</p>
    <h3><a name="tree2.c" href="tree2.c" id="tree2.c">tree2.c</a>: Creates a tree</h3>
    <p>Shows how to create document, nodes and dump it to stdout or file.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 38: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDoc">xmlNewDoc</a> from tree.h</li>
      <li> line 40: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocSetRootElement">xmlDocSetRootElement</a> from tree.h</li>
      <li> line 45: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlCreateIntSubset">xmlCreateIntSubset</a> from tree.h</li>
      <li> line 73: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDocNode">xmlNewDocNode</a> from tree.h</li>
      <li> line 74: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDocText">xmlNewDocText</a> from tree.h</li>
      <li> line 77: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlAddChild">xmlAddChild</a> from tree.h</li>
      <li> line 87: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewChild">xmlNewChild</a> from tree.h</li>
      <li> line 88: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewProp">xmlNewProp</a> from tree.h</li>
      <li> line 95: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlSaveFormatFileEnc">xmlSaveFormatFileEnc</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>tree2 &lt;filename&gt;  -Default output: stdout</p>
    <p>Author: Lucas Brasilino &lt;brasilino@recife.pe.gov.br&gt;</p>
    <h2><a name="XPath" id="XPath"></a>XPath Examples</h2>
    <h3><a name="xpath1.c" href="xpath1.c" id="xpath1.c">xpath1.c</a>: Evaluate XPath expression and prints result node set.</h3>
    <p>Shows how to evaluate XPath expression and register known namespaces in XPath context.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html">&lt;libxml/xpath.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpathInternals.html">&lt;libxml/xpathInternals.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 39: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlInitParser">xmlInitParser</a> from parser.h</li>
      <li> line 87: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> from xpath.h</li>
      <li> line 88: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> from xpath.h</li>
      <li> line 94: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlParseFile">xmlParseFile</a> from parser.h</li>
      <li> line 101: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathNewContext">xmlXPathNewContext</a> from xpath.h</li>
      <li> line 117: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathEvalExpression">xmlXPathEvalExpression</a> from xpath.h</li>
      <li> line 129: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathFreeObject">xmlXPathFreeObject</a> from xpath.h</li>
      <li> line 130: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathFreeContext">xmlXPathFreeContext</a> from xpath.h</li>
      <li> line 156: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlstring.html#xmlStrdup">xmlStrdup</a> from xmlstring.h</li>
      <li> line 180: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlstring.html#xmlStrchr">xmlStrchr</a> from xmlstring.h</li>
      <li> line 186: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpathInternals.html#xmlXPathRegisterNs">xmlXPathRegisterNs</a> from xpathInternals.h</li>
      <li> line 206: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> from tree.h</li>
      <li> line 218: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>xpath1 &lt;xml-file&gt; &lt;xpath-expr&gt; [&lt;known-ns-list&gt;]</p>
    <p>Author: Aleksey Sanin</p>
    <h3><a name="xpath2.c" href="xpath2.c" id="xpath2.c">xpath2.c</a>: Load a document, locate subelements with XPath, modify said elements and save the resulting document.</h3>
    <p>Shows how to make a full round-trip from a load/edit/save</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html">&lt;libxml/tree.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html">&lt;libxml/parser.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html">&lt;libxml/xpath.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpathInternals.html">&lt;libxml/xpathInternals.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 41: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlInitParser">xmlInitParser</a> from parser.h</li>
      <li> line 87: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> from xpath.h</li>
      <li> line 88: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> from xpath.h</li>
      <li> line 95: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlParseFile">xmlParseFile</a> from parser.h</li>
      <li> line 102: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathNewContext">xmlXPathNewContext</a> from xpath.h</li>
      <li> line 110: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathEvalExpression">xmlXPathEvalExpression</a> from xpath.h</li>
      <li> line 123: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathFreeObject">xmlXPathFreeObject</a> from xpath.h</li>
      <li> line 124: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathFreeContext">xmlXPathFreeContext</a> from xpath.h</li>
      <li> line 127: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocDump">xmlDocDump</a> from tree.h</li>
      <li> line 162: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodeSetContent">xmlNodeSetContent</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>xpath2 &lt;xml-file&gt; &lt;xpath-expr&gt; &lt;new-value&gt;</p>
    <p>Author: Aleksey Sanin and Daniel Veillard</p>
    <h2><a name="xmlReader" id="xmlReader"></a>xmlReader Examples</h2>
    <h3><a name="reader1.c" href="reader1.c" id="reader1.c">reader1.c</a>: Parse an XML file with an xmlReader</h3>
    <p>Demonstrate the use of xmlReaderForFile() to parse an XML file and dump the information about the nodes found in the process. (Note that the XMLReader functions require libxml2 version later than 2.6.)</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html">&lt;libxml/xmlreader.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 29: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderConstName">xmlTextReaderConstName</a> from xmlreader.h</li>
      <li> line 33: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderConstValue">xmlTextReaderConstValue</a> from xmlreader.h</li>
      <li> line 36: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderDepth">xmlTextReaderDepth</a> from xmlreader.h</li>
      <li> line 37: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderNodeType">xmlTextReaderNodeType</a> from xmlreader.h</li>
      <li> line 39: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderIsEmptyElement">xmlTextReaderIsEmptyElement</a> from xmlreader.h</li>
      <li> line 40: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderHasValue">xmlTextReaderHasValue</a> from xmlreader.h</li>
      <li> line 44: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlstring.html#xmlStrlen">xmlStrlen</a> from xmlstring.h</li>
      <li> line 59: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> from xmlreader.h</li>
      <li> line 62: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlReaderForFile">xmlReaderForFile</a> from xmlreader.h</li>
      <li> line 67: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderRead">xmlTextReaderRead</a> from xmlreader.h</li>
      <li> line 69: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlFreeTextReader">xmlFreeTextReader</a> from xmlreader.h</li>
      <li> line 89: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlversion.html#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a> from xmlversion.h</li>
      <li> line 94: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> from parser.h</li>
      <li> line 98: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlmemory.html#xmlMemoryDump">xmlMemoryDump</a> from xmlmemory.h</li>
    </ul>
    <p>Usage:</p>
    <p>reader1 &lt;filename&gt;</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="reader2.c" href="reader2.c" id="reader2.c">reader2.c</a>: Parse and validate an XML file with an xmlReader</h3>
    <p>Demonstrate the use of xmlReaderForFile() to parse an XML file validating the content in the process and activating options like entities substitution, and DTD attributes defaulting. (Note that the XMLReader functions require libxml2 version later than 2.6.)</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html">&lt;libxml/xmlreader.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 30: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderConstName">xmlTextReaderConstName</a> from xmlreader.h</li>
      <li> line 34: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderConstValue">xmlTextReaderConstValue</a> from xmlreader.h</li>
      <li> line 37: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderDepth">xmlTextReaderDepth</a> from xmlreader.h</li>
      <li> line 38: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderNodeType">xmlTextReaderNodeType</a> from xmlreader.h</li>
      <li> line 40: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderIsEmptyElement">xmlTextReaderIsEmptyElement</a> from xmlreader.h</li>
      <li> line 41: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderHasValue">xmlTextReaderHasValue</a> from xmlreader.h</li>
      <li> line 45: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlstring.html#xmlStrlen">xmlStrlen</a> from xmlstring.h</li>
      <li> line 60: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> from xmlreader.h</li>
      <li> line 68: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlReaderForFile">xmlReaderForFile</a> from xmlreader.h</li>
      <li> line 76: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderRead">xmlTextReaderRead</a> from xmlreader.h</li>
      <li> line 81: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderIsValid">xmlTextReaderIsValid</a> from xmlreader.h</li>
      <li> line 84: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlFreeTextReader">xmlFreeTextReader</a> from xmlreader.h</li>
    </ul>
    <p>Usage:</p>
    <p>reader2 &lt;valid_xml_filename&gt;</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="reader3.c" href="reader3.c" id="reader3.c">reader3.c</a>: Show how to extract subdocuments with xmlReader</h3>
    <p>Demonstrate the use of xmlTextReaderPreservePattern() to parse an XML file with the xmlReader while collecting only some subparts of the document. (Note that the XMLReader functions require libxml2 version later than 2.6.)</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html">&lt;libxml/xmlreader.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 32: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> from xmlreader.h</li>
      <li> line 38: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlReaderForFile">xmlReaderForFile</a> from xmlreader.h</li>
      <li> line 43: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderPreservePattern">xmlTextReaderPreservePattern</a> from xmlreader.h</li>
      <li> line 52: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderRead">xmlTextReaderRead</a> from xmlreader.h</li>
      <li> line 62: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderCurrentDoc">xmlTextReaderCurrentDoc</a> from xmlreader.h</li>
      <li> line 66: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlFreeTextReader">xmlFreeTextReader</a> from xmlreader.h</li>
      <li> line 96: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocDump">xmlDocDump</a> from tree.h</li>
    </ul>
    <p>Usage:</p>
    <p>reader3</p>
    <p>Author: Daniel Veillard</p>
    <h3><a name="reader4.c" href="reader4.c" id="reader4.c">reader4.c</a>: Parse multiple XML files reusing an xmlReader</h3>
    <p>Demonstrate the use of xmlReaderForFile() and xmlReaderNewFile to parse XML files while reusing the reader object and parser context.  (Note that the XMLReader functions require libxml2 version later than 2.6.)</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html">&lt;libxml/xmlreader.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 26: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderRead">xmlTextReaderRead</a> from xmlreader.h</li>
      <li> line 54: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> from xmlreader.h</li>
      <li> line 72: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlReaderForFile">xmlReaderForFile</a> from xmlreader.h</li>
      <li> line 83: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlReaderNewFile">xmlReaderNewFile</a> from xmlreader.h</li>
      <li> line 97: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlTextReaderCurrentDoc">xmlTextReaderCurrentDoc</a> from xmlreader.h</li>
      <li> line 104: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlreader.html#xmlFreeTextReader">xmlFreeTextReader</a> from xmlreader.h</li>
    </ul>
    <p>Usage:</p>
    <p>reader4 &lt;filename&gt; [ filename ... ]</p>
    <p>Author: Graham Bennett</p>
    <h2><a name="xmlWriter" id="xmlWriter"></a>xmlWriter Examples</h2>
    <h3><a name="testWriter.c" href="testWriter.c" id="testWriter.c">testWriter.c</a>: use various APIs for the xmlWriter</h3>
    <p>tests a number of APIs for the xmlWriter, especially the various methods to write to a filename, to a memory buffer, to a new document, or to a subtree. It shows how to do encoding string conversions too. The resulting documents are then serialized.</p>
    <p>Includes:</p>
    <ul>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-encoding.html">&lt;libxml/encoding.h&gt;</a>
      </li>
      <li>
        <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html">&lt;libxml/xmlwriter.h&gt;</a>
      </li>
    </ul>
    <p>Uses:</p>
    <ul>
      <li> line 76: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlNewTextWriterFilename">xmlNewTextWriterFilename</a> from xmlwriter.h</li>
      <li> line 341: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> from tree.h</li>
      <li> line 347: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlBufferCreate">xmlBufferCreate</a> from tree.h</li>
      <li> line 355: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlNewTextWriterMemory">xmlNewTextWriterMemory</a> from xmlwriter.h</li>
      <li> line 613: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlBufferFree">xmlBufferFree</a> from tree.h</li>
      <li> line 632: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlNewTextWriterDoc">xmlNewTextWriterDoc</a> from xmlwriter.h</li>
      <li> line 878: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> from xmlwriter.h</li>
      <li> line 880: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> from tree.h</li>
      <li> line 885: Macro <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-parser.html#XML_DEFAULT_VERSION">XML_DEFAULT_VERSION</a> from parser.h</li>
      <li> line 885: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDoc">xmlNewDoc</a> from tree.h</li>
      <li> line 894: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNewDocNode">xmlNewDocNode</a> from tree.h</li>
      <li> line 901: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlDocSetRootElement">xmlDocSetRootElement</a> from tree.h</li>
      <li> line 904: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlNewTextWriterTree">xmlNewTextWriterTree</a> from xmlwriter.h</li>
      <li> line 913: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterStartDocument">xmlTextWriterStartDocument</a> from xmlwriter.h</li>
      <li> line 925: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterWriteComment">xmlTextWriterWriteComment</a> from xmlwriter.h</li>
      <li> line 949: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterWriteAttribute">xmlTextWriterWriteAttribute</a> from xmlwriter.h</li>
      <li> line 959: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterWriteFormatComment">xmlTextWriterWriteFormatComment</a> from xmlwriter.h</li>
      <li> line 1073: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterWriteFormatElement">xmlTextWriterWriteFormatElement</a> from xmlwriter.h</li>
      <li> line 1096: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterStartElement">xmlTextWriterStartElement</a> from xmlwriter.h</li>
      <li> line 1103: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterWriteElement">xmlTextWriterWriteElement</a> from xmlwriter.h</li>
      <li> line 1111: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterEndElement">xmlTextWriterEndElement</a> from xmlwriter.h</li>
      <li> line 1121: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlTextWriterEndDocument">xmlTextWriterEndDocument</a> from xmlwriter.h</li>
      <li> line 1127: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xmlwriter.html#xmlFreeTextWriter">xmlFreeTextWriter</a> from xmlwriter.h</li>
      <li> line 1129: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlSaveFileEnc">xmlSaveFileEnc</a> from tree.h</li>
      <li> line 1151: Type <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> from encoding.h</li>
      <li> line 1156: Function <a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-encoding.html#xmlFindCharEncodingHandler">xmlFindCharEncodingHandler</a> from encoding.h</li>
    </ul>
    <p>Usage:</p>
    <p>testWriter</p>
    <p>Author: Alfred Mickautsch</p>
  </body>
</html>
doc/alt-libxml2-devel/examples/tree2.o000064400000072710151730335170013570 0ustar00ELF>Hg@@:9	

-/,0+1*2GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��AWAVAUATU�SH��(H�t$�|$�
RdH�%(H��$1��H�=�1�H�1�H��I���L��H��I���H�
1�L��H�5�H�
1�L��H��1�H�1�L���H�
1�L��H��H�H�5H��H���H��H�H�5�1�H�1�L���H�5L��H���H��H���H��L��H�\$�A��H�
H��1���A��1�H��1�L���I��E��A��H�
H�ߺ�1��1�1�H��L���A��H�
H�HE�H�5H��A���A��u���ul�|$H�=~	H�D$H�x�H�L���L�����1�H��$dH3%(u$H��([]A\A]A^A_������noyes-1.0roottree2.dtdcontent of node 1node1node2this node has attributesnode3attributebarfoonode4node%dnode%d%doddUTF-8other way to create content (which is also a node)e�5int�h�h���	�1%
3a
6	�
7	�
8	�
9	� 
:	�(
;	�0
<	�8
=	�@
@	�H
A	�P
B	�X
D>`
FDh
Hap
Iat
Jox
ML�
NS�
OJ�
QZ�
Y
{�
[e�
\p�
]D�
^	C�
_
)�
`a�
bv��+9�
�Z51`k
��5��%����a
�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�7(
��0
��8doc
�7@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'7
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
07@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�j0
��
��
�P
��
��
�C 
�7(]j`
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
�CX�
��
���
%�
&��K��C9�B3		C 	)M,	2	CF	C)WR	X	�g	������ 	���F	aO�l
aldoc��"�/�
r��}i	aja�S	�
 � �!�"Us"T~"Q
"R	"Xv#�!V
R � �!�"Us"T1"Q
"R	"Xv"Y~$�k"U

R$��"U	$��"U|"T0"Q	"R0$��"U|"T}$�"U|"T	"Q0"R	$�E"U}"T0"Q	"R	$�t"U}"T0"Q	"R0$��"U}"T0"Q	"R	$�"Us"T	"Q	$
"Us"T	"Q	$�>
"U|"T0"Q	"R0$c
"U|"T	${
"Us$�
"U}$��
"U}"T0"Qs"R0$��
"U"T0"Qs"R0$"T	$,,"T|"Q	"R1$9D"U|%F%S%_�
��5�&"a�'__s"�("�)*+
,

,
<,
�,
�,
M,
,
S,
�,
�,
,9+�-%U:;9I$>$>I7I&I	:;9

:;9I8:;9<
I!I/4:;9I?<!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B:;9I�B4:;9I�B4:;9I�B4:;9I1R�BUXYW 1�B!��1"���B#1R�BXYW$��1%��1&.?:;9'I 4':;9I(:;9I)*.?<n:;+.?<n:;9,.?<n:;9-.?<nU��}T��}0�P\\0�P]]0�PSPST0�PP5�Vv�v�v�1�^~�^^
�S
�S,O�N�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmltree2.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hxmlversion.hparser.h<built-in>	7�IX��zX/X��=Ye=]zy4	v	�>�_
/�=
Z��]	O
1�
OfX	0!
L
�
3
��
MU	c
X��?�]YJ�...�XX__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessprintfnext_shortbufxmlNewChildXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDXML_XINCLUDE_STARTnsDef_codecvt_private_xmlNsxmlNslong long intsigned charxmlNodeGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECLbuff_fileno_IO_read_endencodinglong intoldNsparent_flagsxmlNewProp_IO_buf_endstdinXML_XINCLUDE_END_IO_codecvtExternalID_old_offset_offsetmainxmlCharxmlCleanupParsercompressionlinexmlMallocAtomicxmlElementTypesize_txmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocxmlMemoryDump_xmlAttrlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLlast_IO_save_basexmlNewDoc_xmlDtd_lock_flags2_modestdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitieselements_IO_write_endXML_ATTRIBUTE_DECL_IO_lock_t__builtin___sprintf_chk_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlNsTypechildrenxmlSaveFormatFileEncunsigned charXML_DTD_NODEnodeversionentitiesxmlNewDocNodeshort intxmlNewDocText_IO_wide_datanotationsnode1xmlNodePtrXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdupatype__stack_chk_failXML_ATTRIBUTE_IDREFattributesxmlAddChildpropertiesXML_CDATA_SECTION_NODEdict__sprintf_chkXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODExmlDocSetRootElementintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATIONxmlCreateIntSubset__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTyperoot_nodeXML_DOCUMENT_FRAG_NODEargc_freeres_listextraXML_ENTITY_REF_NODE_wide_dataXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESargv_IO_write_baseXML_ATTRIBUTE_NMTOKENtree2.cXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�LOF�B�B �B(�A0�F8�G�
8A0A(B BBBI
�	.'</Uo0��1��2�O "$&(/01234.5	
#(-.247:<SBGYMcSgYk_eqkxqv�|�������)*+,-�O�� 5HT_my�����.annobin_tree2.c.annobin_tree2.c_end.annobin_tree2.c.hot.annobin_tree2.c_end.hot.annobin_tree2.c.unlikely.annobin_tree2.c_end.unlikely.annobin_tree2.c.startup.annobin_tree2.c_end.startup.annobin_tree2.c.exit.annobin_tree2.c_end.exit.annobin_main.start.annobin_main.end.LC3.LC4.LC5.LC6.LC7.LC8.LC9.LC10.LC1.LC11.LC12.LC13.LC14.LC15.LC16.LC17.LC0.LC18.LC2.LC19.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlNewDocxmlNewDocNodexmlDocSetRootElementxmlCreateIntSubsetxmlNewChildxmlNewPropxmlNewDocTextxmlAddChild__sprintf_chkxmlSaveFormatFileEncxmlFreeDocxmlCleanupParserxmlMemoryDump__stack_chk_fail * $ % & '++O<R��������C-��������HS��������Q.��������^T��������lU��������s/��������.���������V���������0���������1���������W���������2���������W���������3���������4���������W���������5���������6���������X���������7���������8���������X���������9��������	T��������:��������Y��������&Z��������6Z��������@;��������Z[��������iW��������y<���������[���������W���������=���������5���������>���������X���������?���������@���������\��������]��������^��������
_��������K`��������

#(
#�
#*
!0%
"*
#�8
#�?
#EH
#kO
#�V
#]
#�k
#;p
#|
#�
#��
#��
#Q�
#�
#%�
#�
#��
#��
#�
#�
#c!
#.
#�;
#,H
#-U
#b
#o
#E|
#��
#�
#�
#i�
#?�
#��
#��
#�
#W�
#R�
#�
#M
#�&
#2
#�:
#a
#�l
#��
#o�
#S�
#��
#��
#!�
#�
#�
#�
#� 
#y&
#k,
#2
#Z8
#>
#�D
#�J
#;P
#3V
#�\
#yb
#h
#�n
#
t
#z
#��
#u�
#��
#��
#f�
#C�
#��
#��
#��
#��
#l�
#9�
#	�
# �
#�
#�
#�
#�(
#M6
#D
#JR
#d`
#��
#��
#n�
#��
#��
#��
#e�
#7�
#�
#�
#�
#M*
#8
#JF
#dT
#�p
#�~
#��
#W�
#��
#��
#��
#��
#+�
#��
#�
#�
#M
#-
#J;
#dI
#�e
#�s
#~�
#��
#��
#D�
#��
#2�
#6�
#��
#�

#�
#�)
#n@
#G
#�L
#�Q
#C^
#k
#�y
#d�
#��
#�
#w�
#��
#��
#��
#��
#�
#�
#M 
#.
#J<
#dJ
#�s
#,�
#��
# �
#��
#n�
#�
#��
#�	
#�!	
#_G	
#h	
#!t	
#��	
#��	
#;�	
#�	
#��	+�	
#R�	
�	
�	
#��	
@�	
<�	
��	
x

#1

�

�

#�!

N%

B*

#�5

�9

�>

#W

+[

!i

�m

�v
+:

!�

�

�

M�

K�
+^�
q�
+p�
+p
r
p
�
�+�<xS+@l+L�	�+b�
�+p�+��
+�/.<F+�f4u+��S�:�+��Y��+��g
c
+
0
k?
+Z
d
+*|
+:�
+m�
+��
+��
�+��-+E+R+_+O�
#\�
#f�
#��
#��
#��
#��
#-�
#-�
#��
#��
#��
#��
#S�
#S�
#s�
#s
#X

#X
#�
#� 
#b$
#b-
#V1
#V:
#�>
#�G
#�K
#�T
#uX
#u`
#2d
#2++(+(+O@+H+?S+?[+O�+;�+]�+]�+a�+a�+1�+8�+O�+;�+k�+k+o+o+3+8'+ON+;V+�b+�j+�u+�}+�+�+�+�+5�+5�+9�+;�+�+�+)�+�+�++:3+:?+:G+�R+�Z+/g+8o+E|+J�+O�+p�+p�+p�+��+��+��+��+5�+8+O+:'+^2qM+:U+^r+pz+��x�+p�+�
++:+S+Y+^0+8+O]+ +.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rodata.str1.8.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group9@7A9P7B9h7C9�(7D9�7E�!�'�1��,@�<07	G�V��Q@�<07ph�h�@=07<�<��@0=07����@`=07��	8�@�=07 O@�=P7,2o
�;23O3iJ@BH7[��n" �i@X]�7 ~�#0y@d07"�$P�@Hd�7$�e$��@�d7&�0�&��0�/.�%0%0p%0G%0%0�%0�%0�%0�%0%0(0 /H0h*@�d75�0	8P	�9�e@doc/alt-libxml2-devel/examples/xpath2000075500000017372151730335170013526 0ustar00#! /bin/sh

# xpath2 - temporary wrapper script for .libs/xpath2
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The xpath2 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file xpath2.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "xpath2:xpath2:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "xpath2:xpath2:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "xpath2:xpath2:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'xpath2'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/examples.xml000064400000077245151730335170014737 0ustar00<examples>
  <example filename='io1.c'>
    <synopsis>Example of custom Input/Output</synopsis>
    <purpose>Demonstrate the use of xmlRegisterInputCallbacks to build a custom I/O layer, this is used in an XInclude method context to show how dynamic document can be built in a clean way.</purpose>
    <usage>io1</usage>
    <test>io1 &gt; io1.tmp &amp;&amp; diff io1.tmp $(srcdir)/io1.res</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>InputOutput</section>
    <includes>
      <include line='16'>&lt;libxml/parser.h&gt;</include>
      <include line='17'>&lt;libxml/tree.h&gt;</include>
      <include line='18'>&lt;libxml/xinclude.h&gt;</include>
      <include line='19'>&lt;libxml/xmlIO.h&gt;</include>
    </includes>
    <uses>
      <macro line='117' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <function line='154' file='parser' name='xmlCleanupParser'/>
      <function line='143' file='tree' name='xmlDocDump'/>
      <typedef line='105' file='tree' name='xmlDocPtr'/>
      <function line='149' file='tree' name='xmlFreeDoc'/>
      <function line='158' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='124' file='parser' name='xmlReadMemory'/>
      <function line='117' file='xmlIO' name='xmlRegisterInputCallbacks'/>
      <function line='134' file='xinclude' name='xmlXIncludeProcess'/>
    </uses>
  </example>
  <example filename='io2.c'>
    <synopsis>Output to char buffer</synopsis>
    <purpose>Demonstrate the use of xmlDocDumpMemory to output document to a character buffer</purpose>
    <usage>io2</usage>
    <test>io2 &gt; io2.tmp &amp;&amp; diff io2.tmp $(srcdir)/io2.res</test>
    <author>John Fleck</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>InputOutput</section>
    <includes>
      <include line='12'>&lt;libxml/parser.h&gt;</include>
    </includes>
    <uses>
      <function line='36' file='tree' name='xmlDocDumpFormatMemory'/>
      <typedef line='20' file='tree' name='xmlDocPtr'/>
      <function line='30' file='tree' name='xmlDocSetRootElement'/>
      <variable line='42' file='globals' name='xmlFree'/>
      <function line='43' file='tree' name='xmlFreeDoc'/>
      <function line='27' file='tree' name='xmlNewDoc'/>
      <function line='28' file='tree' name='xmlNewDocNode'/>
      <typedef line='19' file='tree' name='xmlNodePtr'/>
      <function line='29' file='tree' name='xmlNodeSetContent'/>
    </uses>
  </example>
  <example filename='parse1.c'>
    <synopsis>Parse an XML file to a tree and free it</synopsis>
    <purpose>Demonstrate the use of xmlReadFile() to read an XML file into a tree and xmlFreeDoc() to free the resulting tree</purpose>
    <usage>parse1 test1.xml</usage>
    <test>parse1 test1.xml</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>Parsing</section>
    <includes>
      <include line='13'>&lt;libxml/parser.h&gt;</include>
      <include line='14'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <macro line='45' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <function line='50' file='parser' name='xmlCleanupParser'/>
      <typedef line='24' file='tree' name='xmlDocPtr'/>
      <function line='31' file='tree' name='xmlFreeDoc'/>
      <function line='54' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='26' file='parser' name='xmlReadFile'/>
    </uses>
  </example>
  <example filename='parse2.c'>
    <synopsis>Parse and validate an XML file to a tree and free the result</synopsis>
    <purpose>Create a parser context for an XML file, then parse and validate the file, creating a tree, check the validation result and xmlFreeDoc() to free the resulting tree.</purpose>
    <usage>parse2 test2.xml</usage>
    <test>parse2 test2.xml</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>Parsing</section>
    <includes>
      <include line='14'>&lt;libxml/parser.h&gt;</include>
      <include line='15'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <macro line='61' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <enum line='35' file='parser' name='XML_PARSE_DTDVALID'/>
      <function line='66' file='parser' name='xmlCleanupParser'/>
      <function line='35' file='parser' name='xmlCtxtReadFile'/>
      <typedef line='26' file='tree' name='xmlDocPtr'/>
      <function line='44' file='tree' name='xmlFreeDoc'/>
      <function line='47' file='parser' name='xmlFreeParserCtxt'/>
      <function line='70' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='29' file='parser' name='xmlNewParserCtxt'/>
      <typedef line='25' file='tree' name='xmlParserCtxtPtr'/>
    </uses>
  </example>
  <example filename='parse3.c'>
    <synopsis>Parse an XML document in memory to a tree and free it</synopsis>
    <purpose>Demonstrate the use of xmlReadMemory() to read an XML file into a tree and xmlFreeDoc() to free the resulting tree</purpose>
    <usage>parse3</usage>
    <test>parse3</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>Parsing</section>
    <includes>
      <include line='13'>&lt;libxml/parser.h&gt;</include>
      <include line='14'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <macro line='49' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <function line='54' file='parser' name='xmlCleanupParser'/>
      <typedef line='27' file='tree' name='xmlDocPtr'/>
      <function line='38' file='tree' name='xmlFreeDoc'/>
      <function line='58' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='33' file='parser' name='xmlReadMemory'/>
    </uses>
  </example>
  <example filename='parse4.c'>
    <synopsis>Parse an XML document chunk by chunk to a tree and free it</synopsis>
    <purpose>Demonstrate the use of xmlCreatePushParserCtxt() and xmlParseChunk() to read an XML file progressively into a tree and xmlFreeDoc() to free the resulting tree</purpose>
    <usage>parse4 test3.xml</usage>
    <test>parse4 test3.xml</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>Parsing</section>
    <includes>
      <include line='14'>&lt;libxml/parser.h&gt;</include>
      <include line='15'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <macro line='120' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <function line='131' file='parser' name='xmlCleanupParser'/>
      <function line='67' file='parser' name='xmlCreatePushParserCtxt'/>
      <typedef line='47' file='tree' name='xmlDocPtr'/>
      <function line='103' file='tree' name='xmlFreeDoc'/>
      <function line='94' file='parser' name='xmlFreeParserCtxt'/>
      <function line='135' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='86' file='parser' name='xmlParseChunk'/>
      <typedef line='45' file='tree' name='xmlParserCtxtPtr'/>
    </uses>
  </example>
  <example filename='reader1.c'>
    <synopsis>Parse an XML file with an xmlReader</synopsis>
    <purpose>Demonstrate the use of xmlReaderForFile() to parse an XML file and dump the information about the nodes found in the process. (Note that the XMLReader functions require libxml2 version later than 2.6.)</purpose>
    <usage>reader1 &lt;filename&gt;</usage>
    <test>reader1 test2.xml &gt; reader1.tmp &amp;&amp; diff reader1.tmp $(srcdir)/reader1.res</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>xmlReader</section>
    <includes>
      <include line='15'>&lt;libxml/xmlreader.h&gt;</include>
    </includes>
    <uses>
      <macro line='89' file='xmlversion' name='LIBXML_TEST_VERSION'/>
      <function line='94' file='parser' name='xmlCleanupParser'/>
      <function line='69' file='xmlreader' name='xmlFreeTextReader'/>
      <function line='98' file='xmlmemory' name='xmlMemoryDump'/>
      <function line='62' file='xmlreader' name='xmlReaderForFile'/>
      <function line='44' file='xmlstring' name='xmlStrlen'/>
      <function line='29' file='xmlreader' name='xmlTextReaderConstName'/>
      <function line='33' file='xmlreader' name='xmlTextReaderConstValue'/>
      <function line='36' file='xmlreader' name='xmlTextReaderDepth'/>
      <function line='40' file='xmlreader' name='xmlTextReaderHasValue'/>
      <function line='39' file='xmlreader' name='xmlTextReaderIsEmptyElement'/>
      <function line='37' file='xmlreader' name='xmlTextReaderNodeType'/>
      <typedef line='59' file='xmlreader' name='xmlTextReaderPtr'/>
      <function line='67' file='xmlreader' name='xmlTextReaderRead'/>
    </uses>
  </example>
  <example filename='reader2.c'>
    <synopsis>Parse and validate an XML file with an xmlReader</synopsis>
    <purpose>Demonstrate the use of xmlReaderForFile() to parse an XML file validating the content in the process and activating options like entities substitution, and DTD attributes defaulting. (Note that the XMLReader functions require libxml2 version later than 2.6.)</purpose>
    <usage>reader2 &lt;valid_xml_filename&gt;</usage>
    <test>reader2 test2.xml &gt; reader1.tmp &amp;&amp; diff reader1.tmp $(srcdir)/reader1.res</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>xmlReader</section>
    <includes>
      <include line='16'>&lt;libxml/xmlreader.h&gt;</include>
    </includes>
    <uses>
      <enum line='69' file='parser' name='XML_PARSE_DTDATTR'/>
      <enum line='71' file='parser' name='XML_PARSE_DTDVALID'/>
      <enum line='70' file='parser' name='XML_PARSE_NOENT'/>
      <function line='84' file='xmlreader' name='xmlFreeTextReader'/>
      <function line='68' file='xmlreader' name='xmlReaderForFile'/>
      <function line='45' file='xmlstring' name='xmlStrlen'/>
      <function line='30' file='xmlreader' name='xmlTextReaderConstName'/>
      <function line='34' file='xmlreader' name='xmlTextReaderConstValue'/>
      <function line='37' file='xmlreader' name='xmlTextReaderDepth'/>
      <function line='41' file='xmlreader' name='xmlTextReaderHasValue'/>
      <function line='40' file='xmlreader' name='xmlTextReaderIsEmptyElement'/>
      <function line='81' file='xmlreader' name='xmlTextReaderIsValid'/>
      <function line='38' file='xmlreader' name='xmlTextReaderNodeType'/>
      <typedef line='60' file='xmlreader' name='xmlTextReaderPtr'/>
      <function line='76' file='xmlreader' name='xmlTextReaderRead'/>
    </uses>
  </example>
  <example filename='reader3.c'>
    <synopsis>Show how to extract subdocuments with xmlReader</synopsis>
    <purpose>Demonstrate the use of xmlTextReaderPreservePattern() to parse an XML file with the xmlReader while collecting only some subparts of the document. (Note that the XMLReader functions require libxml2 version later than 2.6.)</purpose>
    <usage>reader3</usage>
    <test>reader3 &gt; reader3.tmp &amp;&amp; diff reader3.tmp $(srcdir)/reader3.res</test>
    <author>Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>xmlReader</section>
    <includes>
      <include line='16'>&lt;libxml/xmlreader.h&gt;</include>
    </includes>
    <uses>
      <function line='96' file='tree' name='xmlDocDump'/>
      <function line='66' file='xmlreader' name='xmlFreeTextReader'/>
      <function line='38' file='xmlreader' name='xmlReaderForFile'/>
      <function line='62' file='xmlreader' name='xmlTextReaderCurrentDoc'/>
      <function line='43' file='xmlreader' name='xmlTextReaderPreservePattern'/>
      <typedef line='32' file='xmlreader' name='xmlTextReaderPtr'/>
      <function line='52' file='xmlreader' name='xmlTextReaderRead'/>
    </uses>
  </example>
  <example filename='reader4.c'>
    <synopsis>Parse multiple XML files reusing an xmlReader</synopsis>
    <purpose>Demonstrate the use of xmlReaderForFile() and xmlReaderNewFile to parse XML files while reusing the reader object and parser context.  (Note that the XMLReader functions require libxml2 version later than 2.6.)</purpose>
    <usage>reader4 &lt;filename&gt; [ filename ... ]</usage>
    <test>reader4 test1.xml test2.xml test3.xml &gt; reader4.tmp &amp;&amp; diff reader4.tmp $(srcdir)/reader4.res</test>
    <author>Graham Bennett</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>xmlReader</section>
    <includes>
      <include line='15'>&lt;libxml/xmlreader.h&gt;</include>
    </includes>
    <uses>
      <function line='104' file='xmlreader' name='xmlFreeTextReader'/>
      <function line='72' file='xmlreader' name='xmlReaderForFile'/>
      <function line='83' file='xmlreader' name='xmlReaderNewFile'/>
      <function line='97' file='xmlreader' name='xmlTextReaderCurrentDoc'/>
      <typedef line='54' file='xmlreader' name='xmlTextReaderPtr'/>
      <function line='26' file='xmlreader' name='xmlTextReaderRead'/>
    </uses>
  </example>
  <example filename='testWriter.c'>
    <synopsis>use various APIs for the xmlWriter</synopsis>
    <purpose>tests a number of APIs for the xmlWriter, especially the various methods to write to a filename, to a memory buffer, to a new document, or to a subtree. It shows how to do encoding string conversions too. The resulting documents are then serialized.</purpose>
    <usage>testWriter</usage>
    <test>testWriter &amp;&amp; for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done</test>
    <author>Alfred Mickautsch</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>xmlWriter</section>
    <includes>
      <include line='16'>&lt;libxml/encoding.h&gt;</include>
      <include line='17'>&lt;libxml/xmlwriter.h&gt;</include>
    </includes>
    <uses>
      <macro line='885' file='parser' name='XML_DEFAULT_VERSION'/>
      <function line='347' file='tree' name='xmlBufferCreate'/>
      <function line='613' file='tree' name='xmlBufferFree'/>
      <typedef line='341' file='tree' name='xmlBufferPtr'/>
      <typedef line='1151' file='encoding' name='xmlCharEncodingHandlerPtr'/>
      <function line='901' file='tree' name='xmlDocSetRootElement'/>
      <function line='1156' file='encoding' name='xmlFindCharEncodingHandler'/>
      <variable line='1180' file='globals' name='xmlFree'/>
      <function line='1127' file='xmlwriter' name='xmlFreeTextWriter'/>
      <variable line='1166' file='globals' name='xmlMalloc'/>
      <function line='885' file='tree' name='xmlNewDoc'/>
      <function line='894' file='tree' name='xmlNewDocNode'/>
      <function line='632' file='xmlwriter' name='xmlNewTextWriterDoc'/>
      <function line='76' file='xmlwriter' name='xmlNewTextWriterFilename'/>
      <function line='355' file='xmlwriter' name='xmlNewTextWriterMemory'/>
      <function line='904' file='xmlwriter' name='xmlNewTextWriterTree'/>
      <typedef line='880' file='tree' name='xmlNodePtr'/>
      <variable line='1183' file='globals' name='xmlRealloc'/>
      <function line='1129' file='tree' name='xmlSaveFileEnc'/>
      <function line='1121' file='xmlwriter' name='xmlTextWriterEndDocument'/>
      <function line='1111' file='xmlwriter' name='xmlTextWriterEndElement'/>
      <typedef line='878' file='xmlwriter' name='xmlTextWriterPtr'/>
      <function line='913' file='xmlwriter' name='xmlTextWriterStartDocument'/>
      <function line='1096' file='xmlwriter' name='xmlTextWriterStartElement'/>
      <function line='949' file='xmlwriter' name='xmlTextWriterWriteAttribute'/>
      <function line='925' file='xmlwriter' name='xmlTextWriterWriteComment'/>
      <function line='1103' file='xmlwriter' name='xmlTextWriterWriteElement'/>
      <function line='959' file='xmlwriter' name='xmlTextWriterWriteFormatComment'/>
      <function line='1073' file='xmlwriter' name='xmlTextWriterWriteFormatElement'/>
    </uses>
  </example>
  <example filename='tree1.c'>
    <synopsis>Navigates a tree to print element names</synopsis>
    <purpose>Parse a file to a tree, use xmlDocGetRootElement() to get the root element, then walk the document and print all the element name in document order.</purpose>
    <usage>tree1 filename_or_URL</usage>
    <test>tree1 test2.xml &gt; tree1.tmp &amp;&amp; diff tree1.tmp $(srcdir)/tree1.res</test>
    <author>Dodji Seketeli</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>Tree</section>
    <includes>
      <include line='13'>&lt;libxml/parser.h&gt;</include>
      <include line='14'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <enum line='36' file='tree' name='XML_ELEMENT_NODE'/>
      <function line='74' file='tree' name='xmlDocGetRootElement'/>
      <function line='67' file='parser' name='xmlReadFile'/>
    </uses>
  </example>
  <example filename='tree2.c'>
    <synopsis>Creates a tree</synopsis>
    <purpose>Shows how to create document, nodes and dump it to stdout or file.</purpose>
    <usage>tree2 &lt;filename&gt;  -Default output: stdout</usage>
    <test>tree2 &gt; tree2.tmp &amp;&amp; diff tree2.tmp $(srcdir)/tree2.res</test>
    <author>Lucas Brasilino &lt;brasilino@recife.pe.gov.br&gt;</author>
    <copy>see Copyright for the status of this software </copy>
    <section>Tree</section>
    <includes>
      <include line='12'>&lt;libxml/parser.h&gt;</include>
      <include line='13'>&lt;libxml/tree.h&gt;</include>
    </includes>
    <uses>
      <function line='77' file='tree' name='xmlAddChild'/>
      <function line='45' file='tree' name='xmlCreateIntSubset'/>
      <function line='40' file='tree' name='xmlDocSetRootElement'/>
      <function line='87' file='tree' name='xmlNewChild'/>
      <function line='38' file='tree' name='xmlNewDoc'/>
      <function line='73' file='tree' name='xmlNewDocNode'/>
      <function line='74' file='tree' name='xmlNewDocText'/>
      <function line='88' file='tree' name='xmlNewProp'/>
      <function line='95' file='tree' name='xmlSaveFormatFileEnc'/>
    </uses>
  </example>
  <example filename='xpath1.c'>
    <synopsis>Evaluate XPath expression and prints result node set.</synopsis>
    <purpose>Shows how to evaluate XPath expression and register known namespaces in XPath context.</purpose>
    <usage>xpath1 &lt;xml-file&gt; &lt;xpath-expr&gt; [&lt;known-ns-list&gt;]</usage>
    <test>xpath1 test3.xml &apos;//child2&apos; &gt; xpath1.tmp &amp;&amp; diff xpath1.tmp $(srcdir)/xpath1.res</test>
    <author>Aleksey Sanin</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>XPath</section>
    <includes>
      <include line='17'>&lt;libxml/parser.h&gt;</include>
      <include line='16'>&lt;libxml/tree.h&gt;</include>
      <include line='18'>&lt;libxml/xpath.h&gt;</include>
      <include line='19'>&lt;libxml/xpathInternals.h&gt;</include>
    </includes>
    <uses>
      <enum line='229' file='tree' name='XML_ELEMENT_NODE'/>
      <enum line='217' file='tree' name='XML_NAMESPACE_DECL'/>
      <variable line='193' file='globals' name='xmlFree'/>
      <function line='39' file='parser' name='xmlInitParser'/>
      <typedef line='206' file='tree' name='xmlNodePtr'/>
      <typedef line='218' file='tree' name='xmlNsPtr'/>
      <function line='94' file='parser' name='xmlParseFile'/>
      <function line='180' file='xmlstring' name='xmlStrchr'/>
      <function line='156' file='xmlstring' name='xmlStrdup'/>
      <typedef line='87' file='xpath' name='xmlXPathContextPtr'/>
      <function line='117' file='xpath' name='xmlXPathEvalExpression'/>
      <function line='130' file='xpath' name='xmlXPathFreeContext'/>
      <function line='129' file='xpath' name='xmlXPathFreeObject'/>
      <function line='101' file='xpath' name='xmlXPathNewContext'/>
      <typedef line='88' file='xpath' name='xmlXPathObjectPtr'/>
      <function line='186' file='xpathInternals' name='xmlXPathRegisterNs'/>
    </uses>
  </example>
  <example filename='xpath2.c'>
    <synopsis>Load a document, locate subelements with XPath, modify said elements and save the resulting document.</synopsis>
    <purpose>Shows how to make a full round-trip from a load/edit/save</purpose>
    <usage>xpath2 &lt;xml-file&gt; &lt;xpath-expr&gt; &lt;new-value&gt;</usage>
    <test>xpath2 test3.xml &apos;//discarded&apos; discarded &gt; xpath2.tmp &amp;&amp; diff xpath2.tmp $(srcdir)/xpath2.res</test>
    <author>Aleksey Sanin and Daniel Veillard</author>
    <copy>see Copyright for the status of this software. </copy>
    <section>XPath</section>
    <includes>
      <include line='17'>&lt;libxml/parser.h&gt;</include>
      <include line='16'>&lt;libxml/tree.h&gt;</include>
      <include line='18'>&lt;libxml/xpath.h&gt;</include>
      <include line='19'>&lt;libxml/xpathInternals.h&gt;</include>
    </includes>
    <uses>
      <enum line='180' file='tree' name='XML_NAMESPACE_DECL'/>
      <function line='127' file='tree' name='xmlDocDump'/>
      <function line='41' file='parser' name='xmlInitParser'/>
      <function line='162' file='tree' name='xmlNodeSetContent'/>
      <function line='95' file='parser' name='xmlParseFile'/>
      <typedef line='87' file='xpath' name='xmlXPathContextPtr'/>
      <function line='110' file='xpath' name='xmlXPathEvalExpression'/>
      <function line='124' file='xpath' name='xmlXPathFreeContext'/>
      <function line='123' file='xpath' name='xmlXPathFreeObject'/>
      <function line='102' file='xpath' name='xmlXPathNewContext'/>
      <typedef line='88' file='xpath' name='xmlXPathObjectPtr'/>
    </uses>
  </example>
  <symbols>
    <symbol name='LIBXML_TEST_VERSION'>
      <ref filename='io1.c'/>
      <ref filename='parse1.c'/>
      <ref filename='parse2.c'/>
      <ref filename='parse3.c'/>
      <ref filename='parse4.c'/>
      <ref filename='reader1.c'/>
    </symbol>
    <symbol name='XML_DEFAULT_VERSION'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='XML_ELEMENT_NODE'>
      <ref filename='tree1.c'/>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='XML_NAMESPACE_DECL'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='XML_PARSE_DTDATTR'>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='XML_PARSE_DTDVALID'>
      <ref filename='parse2.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='XML_PARSE_NOENT'>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlAddChild'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlBufferCreate'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlBufferFree'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlBufferPtr'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlCharEncodingHandlerPtr'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlCleanupParser'>
      <ref filename='io1.c'/>
      <ref filename='parse1.c'/>
      <ref filename='parse2.c'/>
      <ref filename='parse3.c'/>
      <ref filename='parse4.c'/>
      <ref filename='reader1.c'/>
    </symbol>
    <symbol name='xmlCreateIntSubset'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlCreatePushParserCtxt'>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlCtxtReadFile'>
      <ref filename='parse2.c'/>
    </symbol>
    <symbol name='xmlDocDump'>
      <ref filename='io1.c'/>
      <ref filename='reader3.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlDocDumpFormatMemory'>
      <ref filename='io2.c'/>
    </symbol>
    <symbol name='xmlDocGetRootElement'>
      <ref filename='tree1.c'/>
    </symbol>
    <symbol name='xmlDocPtr'>
      <ref filename='io1.c'/>
      <ref filename='io2.c'/>
      <ref filename='parse1.c'/>
      <ref filename='parse2.c'/>
      <ref filename='parse3.c'/>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlDocSetRootElement'>
      <ref filename='io2.c'/>
      <ref filename='testWriter.c'/>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlFindCharEncodingHandler'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlFree'>
      <ref filename='io2.c'/>
      <ref filename='testWriter.c'/>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='xmlFreeDoc'>
      <ref filename='io1.c'/>
      <ref filename='io2.c'/>
      <ref filename='parse1.c'/>
      <ref filename='parse2.c'/>
      <ref filename='parse3.c'/>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlFreeParserCtxt'>
      <ref filename='parse2.c'/>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlFreeTextReader'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
      <ref filename='reader3.c'/>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlFreeTextWriter'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlInitParser'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlMalloc'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlMemoryDump'>
      <ref filename='io1.c'/>
      <ref filename='parse1.c'/>
      <ref filename='parse2.c'/>
      <ref filename='parse3.c'/>
      <ref filename='parse4.c'/>
      <ref filename='reader1.c'/>
    </symbol>
    <symbol name='xmlNewChild'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlNewDoc'>
      <ref filename='io2.c'/>
      <ref filename='testWriter.c'/>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlNewDocNode'>
      <ref filename='io2.c'/>
      <ref filename='testWriter.c'/>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlNewDocText'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlNewParserCtxt'>
      <ref filename='parse2.c'/>
    </symbol>
    <symbol name='xmlNewProp'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlNewTextWriterDoc'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlNewTextWriterFilename'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlNewTextWriterMemory'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlNewTextWriterTree'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlNodePtr'>
      <ref filename='io2.c'/>
      <ref filename='testWriter.c'/>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='xmlNodeSetContent'>
      <ref filename='io2.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlNsPtr'>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='xmlParseChunk'>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlParseFile'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlParserCtxtPtr'>
      <ref filename='parse2.c'/>
      <ref filename='parse4.c'/>
    </symbol>
    <symbol name='xmlReadFile'>
      <ref filename='parse1.c'/>
      <ref filename='tree1.c'/>
    </symbol>
    <symbol name='xmlReadMemory'>
      <ref filename='io1.c'/>
      <ref filename='parse3.c'/>
    </symbol>
    <symbol name='xmlReaderForFile'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
      <ref filename='reader3.c'/>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlReaderNewFile'>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlRealloc'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlRegisterInputCallbacks'>
      <ref filename='io1.c'/>
    </symbol>
    <symbol name='xmlSaveFileEnc'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlSaveFormatFileEnc'>
      <ref filename='tree2.c'/>
    </symbol>
    <symbol name='xmlStrchr'>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='xmlStrdup'>
      <ref filename='xpath1.c'/>
    </symbol>
    <symbol name='xmlStrlen'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderConstName'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderConstValue'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderCurrentDoc'>
      <ref filename='reader3.c'/>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlTextReaderDepth'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderHasValue'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderIsEmptyElement'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderIsValid'>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderNodeType'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
    </symbol>
    <symbol name='xmlTextReaderPreservePattern'>
      <ref filename='reader3.c'/>
    </symbol>
    <symbol name='xmlTextReaderPtr'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
      <ref filename='reader3.c'/>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlTextReaderRead'>
      <ref filename='reader1.c'/>
      <ref filename='reader2.c'/>
      <ref filename='reader3.c'/>
      <ref filename='reader4.c'/>
    </symbol>
    <symbol name='xmlTextWriterEndDocument'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterEndElement'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterPtr'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterStartDocument'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterStartElement'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterWriteAttribute'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterWriteComment'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterWriteElement'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterWriteFormatComment'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlTextWriterWriteFormatElement'>
      <ref filename='testWriter.c'/>
    </symbol>
    <symbol name='xmlXIncludeProcess'>
      <ref filename='io1.c'/>
    </symbol>
    <symbol name='xmlXPathContextPtr'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathEvalExpression'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathFreeContext'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathFreeObject'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathNewContext'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathObjectPtr'>
      <ref filename='xpath1.c'/>
      <ref filename='xpath2.c'/>
    </symbol>
    <symbol name='xmlXPathRegisterNs'>
      <ref filename='xpath1.c'/>
    </symbol>
  </symbols>
  <sections>
    <section name='InputOutput'>
      <example filename='io1.c'/>
      <example filename='io2.c'/>
    </section>
    <section name='Parsing'>
      <example filename='parse1.c'/>
      <example filename='parse2.c'/>
      <example filename='parse3.c'/>
      <example filename='parse4.c'/>
    </section>
    <section name='Tree'>
      <example filename='tree1.c'/>
      <example filename='tree2.c'/>
    </section>
    <section name='XPath'>
      <example filename='xpath1.c'/>
      <example filename='xpath2.c'/>
    </section>
    <section name='xmlReader'>
      <example filename='reader1.c'/>
      <example filename='reader2.c'/>
      <example filename='reader3.c'/>
      <example filename='reader4.c'/>
    </section>
    <section name='xmlWriter'>
      <example filename='testWriter.c'/>
    </section>
  </sections>
</examples>
doc/alt-libxml2-devel/examples/.memdump000064400000000001151730335170014014 0ustar00
doc/alt-libxml2-devel/examples/tree2.c000064400000006575151730335170013562 0ustar00/* 
 * section:  Tree
 * synopsis: Creates a tree
 * purpose:  Shows how to create document, nodes and dump it to stdout or file.
 * usage:    tree2 <filename>  -Default output: stdout
 * test:     tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res
 * author:   Lucas Brasilino <brasilino@recife.pe.gov.br>
 * copy:     see Copyright for the status of this software
 */

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

#if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)

/*
 *To compile this file using gcc you can type
 *gcc `xml2-config --cflags --libs` -o tree2 tree2.c
 */

/* A simple example how to create DOM. Libxml2 automagically 
 * allocates the necessary amount of memory to it.
*/
int
main(int argc, char **argv)
{
    xmlDocPtr doc = NULL;       /* document pointer */
    xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */
    char buff[256];
    int i, j;

    LIBXML_TEST_VERSION;

    /* 
     * Creates a new document, a node and set it as a root node
     */
    doc = xmlNewDoc(BAD_CAST "1.0");
    root_node = xmlNewDocNode(doc, NULL, BAD_CAST "root", NULL);
    xmlDocSetRootElement(doc, root_node);

    /*
     * Creates a DTD declaration. Isn't mandatory. 
     */
    xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd");

    /* 
     * xmlNewChild() creates a new node, which is "attached" as child node
     * of root_node node. 
     */
    xmlNewChild(root_node, NULL, BAD_CAST "node1",
                BAD_CAST "content of node 1");
    /* 
     * The same as above, but the new child node doesn't have a content 
     */
    xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL);

    /* 
     * xmlNewProp() creates attributes, which is "attached" to an node.
     * It returns xmlAttrPtr, which isn't used here.
     */
    node =
        xmlNewChild(root_node, NULL, BAD_CAST "node3",
                    BAD_CAST "this node has attributes");
    xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
    xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar");

    /*
     * Here goes another way to create nodes. xmlNewNode() and xmlNewText
     * creates a node and a text node separately. They are "attached"
     * by xmlAddChild() 
     */
    node = xmlNewDocNode(doc, NULL, BAD_CAST "node4", NULL);
    node1 = xmlNewDocText(doc, BAD_CAST
                   "other way to create content (which is also a node)");
    xmlAddChild(node, node1);
    xmlAddChild(root_node, node);

    /* 
     * A simple loop that "automates" nodes creation 
     */
    for (i = 5; i < 7; i++) {
        sprintf(buff, "node%d", i);
        node = xmlNewChild(root_node, NULL, BAD_CAST buff, NULL);
        for (j = 1; j < 4; j++) {
            sprintf(buff, "node%d%d", i, j);
            node1 = xmlNewChild(node, NULL, BAD_CAST buff, NULL);
            xmlNewProp(node1, BAD_CAST "odd", BAD_CAST((j % 2) ? "no" : "yes"));
        }
    }

    /* 
     * Dumping document to stdio or file
     */
    xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);

    /*free the document */
    xmlFreeDoc(doc);

    /*
     *Free the global variables that may
     *have been allocated by the parser.
     */
    xmlCleanupParser();

    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
#else
int main(void) {
    fprintf(stderr, "tree support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/testWriter.o000064400000322540151730335170014722 0ustar00ELF>��@@;:

.0-1,2+3��AVAUATUSH��dH�%(H�D$1�H����H��H��I���H��H����H���D�hI��C�|-��<$Hc��I��H����D�t$H�L$H��H��H��S��xw�T$��D)��uI�$L��pHc��H��Hc$�H�L$dH3%(H����H��[]A\A]A^��H�5�1��L��1��H�=���f�1��@M��H��LD�H�51�L����s����H�=1���Y������U1�SH���H����1�1�H�H��H������@H�5H������H�5H�=�H��H��H������HH��t	H��H�5H�������H�H�5H�������H�H�5H�������H�5H�=�H�5H��H��H��1������H��t	H��H�5H������01���H��H�H�5�����1���H��H�H�5����vH�5H�=�H�5H��H��H������.H��t	H��H�5H�=�H�5H��H��H�������H��t	H��H������H�5H������CH�5H������,H�H�5H�������1��
H��H�H�5����yH�������H�5H�������H�H�5H������1��H��H�H�5����H������/H������H�5H�����xLH�H�5H�������H�������H�������XH��[]�H��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�fDH��H�=[]�ZH�=[]�ff.�@��AUI��ATUSH���H�=H����1�H��H���H��H����H��1�H�1��H�=����H�5H�������H�5H�=�H��H��I���H�=���?M��t	L��H�5H������3H�H�5H������5H�H�5H������H�5H�=�H��H�5H��I��1��H�=����M��t	L��H�5H�������1���H��H�H�5�����1���H��H�H�5�����H�5H�=�H�5H��H��I������oM��t	L��H�5H�=�H�5H��H��I������1M��t	L��H������#H�5H�������H�5H�������H�H�5H�������1��
H��H�H�5�����H�������H�5H������+H�H�5H������]1��H��H�H�5����(H������8H������(H�5H�������H�H�5H�������H�������H���H�=��xWH���L��H�5�H�=H��H��t1H�}H���H���XH��[]A\A]��H�=H��[]A\A]�f.�H��H�=[]A\A]�f.�H��H�=[]A\A]�f.�H�=��H�=��H�=�{���@��AT1�I��USH��dH�%(H�D$1�H���H����1�1�H�H��H������pH�5H������)H�5H�=�H��H��H������`H��t	H��H�5H�������H�H�5H�������H�H�5H�������H�5H�=�H�5H��H��H��1�����H��t	H��H�5H������H1���H��H�H�5�����1���H��H�H�5����~H�5H�=�H�5H��H��H������>H��t	H��H�5H�=�H�5H��H��H������H��t	H��H������"H�5H������[H�5H������DH�H�5H�������1��
H��H�H�5�����H�������H�5H�������H�H�5H������,1��H��H�H�5����H������7H������'H�5H�����xdH�H�5H�������H�������H�������H���H�4$L��H��H�<$��H�=�H�D$dH3%(��H��[]A\��H�=���f�H�=��f�H�=��f�H�=��f�H�=��f�H�=��{����H�=��c����H�=��K����H�=��5���f���AUI��H�=ATUSH���H�=H����1�H�1�H��H���H��H����H��H���H��H��1��H�=H��H���mH��1�H�1��H�=���KH�5H�=�H��H��I���H�=���M��t	L��H�5H������/H�H�5H�������H�H�5H�������H�5H�=�H��H�5H��I��1��H�=����M��t	L��H�5H�������1���H��H�H�5�����1���H��H�H�5����kH�5H�=�H�5H��H��I������KM��t	L��H�5H�=�H�5H��H��I������
M��t	L��H�������H�5H�������H�5H�������H�H�5H�������1��
H��H�H�5����nH������~H�5H������'H�H�5H������91��H��H�H�5����H������H������H�5H�������H�H�5H�������H�������H���H�=��x3H���L��H��H��XH��[]A\A]�H�=H��[]A\A]�f.�H��H�=[]A\A]�f.�H��H�=[]A\A]�f.�H�=��H�=��H�=�{���GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignConvertInput: no memISO-8859-1EXAMPLEORDER1.0versiondexml:lang<�>HEADER%010dX_ORDER_ID%dCUSTOMER_IDM�llerNAME_1J�rgNAME_2ENTRIESENTRY<Test>ARTICLEENTRY_NO<Test 2>FOOTERThis is a text.TEXTwwriter1.tmpwriter2.tmpwriter3.tmpwriter4.tmpConvertInput: no encoding handler found for '%s'
ConvertInput: conversion wasn't successful.ConvertInput: conversion wasn't successful. converted: %i octets.
testXmlwriterFilename: Error creating the xml writertestXmlwriterFilename: Error at xmlTextWriterStartDocumenttestXmlwriterFilename: Error at xmlTextWriterStartElementThis is a comment with special chars: <�>testXmlwriterFilename: Error at xmlTextWriterWriteCommenttestXmlwriterFilename: Error at xmlTextWriterWriteAttributeThis is another comment with special chars: %stestXmlwriterFilename: Error at xmlTextWriterWriteFormatCommenttestXmlwriterFilename: Error at xmlTextWriterWriteFormatElementtestXmlwriterFilename: Error at xmlTextWriterWriteElementtestXmlwriterFilename: Error at xmlTextWriterEndElementtestXmlwriterFilename: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error creating the xml buffertestXmlwriterMemory: Error creating the xml writertestXmlwriterMemory: Error at xmlTextWriterStartDocumenttestXmlwriterMemory: Error at xmlTextWriterStartElementtestXmlwriterMemory: Error at xmlTextWriterWriteCommenttestXmlwriterMemory: Error at xmlTextWriterWriteAttributetestXmlwriterMemory: Error at xmlTextWriterWriteFormatCommenttestXmlwriterMemory: Error at xmlTextWriterWriteFormatElementtestXmlwriterMemory: Error at xmlTextWriterWriteElementtestXmlwriterMemory: Error at xmlTextWriterEndElementtestXmlwriterMemory: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error at fopentestXmlwriterDoc: Error creating the xml writertestXmlwriterDoc: Error at xmlTextWriterStartDocumenttestXmlwriterDoc: Error at xmlTextWriterStartElementtestXmlwriterDoc: Error at xmlTextWriterWriteCommenttestXmlwriterDoc: Error at xmlTextWriterWriteAttributetestXmlwriterDoc: Error at xmlTextWriterWriteFormatCommenttestXmlwriterDoc: Error at xmlTextWriterWriteFormatElementtestXmlwriterDoc: Error at xmlTextWriterWriteElementtestXmlwriterDoc: Error at xmlTextWriterEndElementtestXmlwriterDoc: Error at xmlTextWriterEndDocumenttestXmlwriterTree: Error creating the xml document treetestXmlwriterTree: Error creating the xml nodetestXmlwriterTree: Error creating the xml writertestXmlwriterTree: Error at xmlTextWriterStartDocumenttestXmlwriterTree: Error at xmlTextWriterWriteCommenttestXmlwriterTree: Error at xmlTextWriterStartElementtestXmlwriterTree: Error at xmlTextWriterWriteAttributetestXmlwriterTree: Error at xmlTextWriterWriteFormatCommenttestXmlwriterTree: Error at xmlTextWriterWriteFormatElementtestXmlwriterTree: Error at xmlTextWriterWriteElementtestXmlwriterTree: Error at xmlTextWriterEndElementtestXmlwriterTree: Error at xmlTextWriterEndDocumentGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��H���
R�H�=�H�=�H�=�H�=���1�H��õ;�5Eint�m�m���1%	3f	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D>`	FDh	Hfp	Ift	Jtx	MQ�	NX�	OJ�	QZ�	Y
��	[e�	\p�	]D�	^	C�	_
)�	`f�	bv��
+9��Z
51`k��
5��%�����f�������	C
cf))/5/EfL
y
�(S(
��	
�!�	
� �	
� ;	
� �	
� � 
�!�GE�<J�Q�Y [_	\quse]<	^<	_�	`qZk�<��	

�w�<�[	
�x�U�C���
�U�U �U(�U0�U8doc��@ns�E	H�qP�
X�E	`�Ch�Qp�Qrg��J�C���
�U�U ��(�U0�U8doc��@�CH�CP�CX�C`�
h�
p�Cx[�'�(C)�*�+U,U -U(.U0/U8doc0�@3fH4fL:JP;JX<K	`=
h>
pids?Cx@C�URLA
�Bf�DM
�EC�Ff�Hf�Pw���0�E	�K	���
�
�C ��(��`�
�C���
�U�U �U(�
0�
8doc��@ns�E	H�[P�CXQ	�g�'

%P&G
-
�
9_
e
p
C
B3|
�
C�
)
M�
�
C�
C)
W�
�
��
��p
�p
��
�S
��
#'8xq`��
inx�x*�outzqret{	f|	f }	f�@ ~	f�D�!2�R"2#J2$U1$T	!2��"2#�2$U	%2�	�"2#J2$U1$T	$Q|%2�	2
"2#�2$U	&�2J
$U|&�2b
$Uv'�
$U}1$1 $ &'�
$U|$Tw$Qv$R�D'�
$U|'�
$U|(�2)kl��k�rcm	fn,doco:
p
tmpqq*2w	�+2*2�	�+2*2�	�+2*2�	+2*2�	'+2*2c	J+2%2�	�"2,�2-�2�$U	.�2$U	%2�	�"2%2�		"2!2�	="2!2�	q"2!2
�	�/2�&/4�$U	&<4�$Us$T0$Q	$R0&I4$Us$Tv&V43$Us$Tv$Q0&b4b$Uv$T0$Q	$R0&>�$U	$T	&n4�$Uv$T|'�$U|&z4�$Uv$T	&�4$Uv$T	$Q	&�4I$Uv$T	$Q	&>u$U	$T	&�4�$Uv$T	$Q|'�$U|&z4�$Uv$T	&�4$Uv$T	$Q	$R
�&�4K$Uv$T	$Q	$R
�&>w$U	$T	&�4�$Uv$T	$Q|'�$U|&>�$U	$T	&�4
$Uv$T	$Q|'!$U|&�49$Uv&z4^$Uv$T	&z4�$Uv$T	&�4�$Uv$T	$Q	&�4�$Uv$T	$Q	$R:&�4$Uv&z4)$Uv$T	&�4[$Uv$T	$Q	&�4�$Uv$T	$Q	$RD&�4�$Uv&�4�$Uv&z4�$Uv$T	&�4$Uv$T	$Q	&�41$Uv&�4I$Uv&�4a$Uv&�4�$U}$Ts$Q	,�4)og��o�rcq	fr,tmpsq0doct:
�P!2�	k"2#�2$U	!2�	�"2#�2$U	!2�		"2#�2$U	!2z	X"2#�2$U	!2�	�"2#�2$U	!2�	�"2#�2$U	!2�	E"2#�2$U	!2�	�"2#�2$U	!2�	�"2#�2$U	!2Y	2"2#�2$U	&?7O$Uw$T0&b4~$Us$T0$Q	$R0&z4�$Us$T	&>�$U	$T	&n4�$Us$Tv'$Uv&z4&$Us$T	&�4X$Us$T	$Q	&�4�$Us$T	$Q	&>�$U	$T	&�4�$Us$T	$Qv'�$Uv&z4$Us$T	&�4S$Us$T	$Q	$R
�&�4�$Us$T	$Q	$R
�&>�$U	$T	&�4�$Us$T	$Qv'�$Uv&>#$U	$T	&�4N$Us$T	$Qv'b$Uv&�4z$Us&z4�$Us$T	&z4�$Us$T	&�4�$Us$T	$Q	&�4-$Us$T	$Q	$R:&�4E$Us&z4j$Us$T	&�4�$Us$T	$Q	&�4�$Us$T	$Q	$RD&�4�$Us&�4$Us&z4($Us$T	&�4Z$Us$T	$Q	&�4r$Us&�4�$Us&�4�$Us&�4�$U|$Q	(�4(�2)Ql��(Q!�rcS	fT,bufU_tmpVqfpW�*2]	� +2*2n	� +2*2�	� +2*2�		!+2*2U	,!+2*2]	O!+2!2a�!"<2"02#R7$Ts%2e	""2,�2-�2�!$U	.�2$U	%2w	;""2%2�	c""2!2�	�""2!2�	�""2!2
�	�"/2�(�8&�8(#$Uv$T0&b4W#$Us$T0$Q	$R0&z4|#$Us$T	&>�#$U	$T	&n4�#$Us$T|'�#$U|&z4�#$Us$T	&�41$$Us$T	$Q	&�4c$$Us$T	$Q	&>�$$U	$T	&�4�$$Us$T	$Q|'�$$U|&z4�$$Us$T	&�4,%$Us$T	$Q	$R
�&�4e%$Us$T	$Q	$R
�&>�%$U	$T	&�4�%$Us$T	$Q|'�%$U|&>�%$U	$T	&�4'&$Us$T	$Q|';&$U|&�4S&$Us&z4x&$Us$T	&z4�&$Us$T	&�4�&$Us$T	$Q	&�4'$Us$T	$Q	$R:&�4'$Us&z4C'$Us$T	&�4u'$Us$T	$Q	&�4�'$Us$T	$Q	$RD&�4�'$Us&�4�'$Us&z4($Us$T	&�43($Us$T	$Q	&�4K($Us&�4c($Us&�4{($Us&�8�($U}$T	&�8�($Us,�81EA�.12uriE#�3rcG	f4H,3tmpIq52`	u)"2.�2$U	52W	�)"2.�2$U	52	�)"2.�2$U	52N	;*"2.�2$U	52m	}*"2.�2$U	52�	�*"2.�2$U	52�	+"2.�2$U	52�	C+"2.�2$U	52�	�+"2.�2$U	%2B	�+/2�.�2$U	&�;�+$U�U$T0&b4,$Us$T0$Q	$R0&z49,$Us$T	&>e,$U	$T	&n4�,$Us$Tv'�,$Uv&z4�,$Us$T	&�4�,$Us$T	$Q	&�4 -$Us$T	$Q	&>L-$U	$T	&�4w-$Us$T	$Qv'�-$Uv&z4�-$Us$T	&�4�-$Us$T	$Q	$R
�&�4".$Us$T	$Q	$R
�&>N.$U	$T	&�4y.$Us$T	$Qv'�.$Uv&>�.$U	$T	&�4�.$Us$T	$Qv'�.$Uv&�4/$Us&z45/$Us$T	&z4Z/$Us$T	&�4�/$Us$T	$Q	&�4�/$Us$T	$Q	$R:&�4�/$Us&z40$Us$T	&�420$Us$T	$Q	&�4i0$Us$T	$Q	$RD&�4�0$Us&�4�0$Us&z4�0$Us$T	&�4�0$Us$T	$Q	&�41$Us&�4 1$Us,�46fS�2&�;i1$U

R&�(�1$U	&��1$U	&��1$U	&�
�1$U	(�;(�;7kf28k �97dfJ28d�8d<�9:\;/�-ConvertInput: conversion wasn't successful.
<;�ConvertInput: no mem
:
�=�>;2�0testXmlwriterTree: Error creating the xml node
;;�9testXmlwriterTree: Error at xmlTextWriterWriteAttribute
;9�7testXmlwriterTree: Error at xmlTextWriterStartElement
;?�=testXmlwriterTree: Error at xmlTextWriterWriteFormatElement
;9�7testXmlwriterTree: Error at xmlTextWriterWriteElement
;7�5testXmlwriterTree: Error at xmlTextWriterEndElement
=
=<=�:+	:8	:N:W	:�:F	:h	:r:`:<:-=�=;8�6testXmlwriterDoc: Error at xmlTextWriterStartElement
;9�7testXmlwriterDoc: Error at xmlTextWriterStartDocument
;:�8testXmlwriterDoc: Error at xmlTextWriterWriteAttribute
;3�1testXmlwriterDoc: Error creating the xml writer
;8�6testXmlwriterDoc: Error at xmlTextWriterWriteComment
;8�6testXmlwriterDoc: Error at xmlTextWriterWriteElement
;>�<testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement
;>�<testXmlwriterDoc: Error at xmlTextWriterWriteFormatComment
;6�4testXmlwriterDoc: Error at xmlTextWriterEndElement
;7�5testXmlwriterDoc: Error at xmlTextWriterEndDocument
:)	;�%s<;6�4testXmlwriterMemory: Error creating the xml writer
;;�9testXmlwriterMemory: Error at xmlTextWriterStartElement
;=�;testXmlwriterMemory: Error at xmlTextWriterWriteAttribute
;A�?testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement
;;�9testXmlwriterMemory: Error at xmlTextWriterWriteElement
;9�7testXmlwriterMemory: Error at xmlTextWriterEndElement
=�:%	:�:�=�;=�;testXmlwriterFilename: Error at xmlTextWriterStartElement
;>�<testXmlwriterFilename: Error at xmlTextWriterStartDocument
;?�=testXmlwriterFilename: Error at xmlTextWriterWriteAttribute
;8�6testXmlwriterFilename: Error creating the xml writer
;=�;testXmlwriterFilename: Error at xmlTextWriterWriteComment
;=�;testXmlwriterFilename: Error at xmlTextWriterWriteElement
;C�AtestXmlwriterFilename: Error at xmlTextWriterWriteFormatElement
;C�AtestXmlwriterFilename: Error at xmlTextWriterWriteFormatComment
;;�9testXmlwriterFilename: Error at xmlTextWriterEndElement
;<�:testXmlwriterFilename: Error at xmlTextWriterEndDocument
:#	:=9:
�%U:;9I$>&I$>I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!'II>I:;9(
:;9I8:;9
:;9I8
:;9I8:;9I'.?:;9'I@�B:;9I�B:;9I�B4:;9I�B4:;9I�B 4:;9I!1R�BXYW"1�B#��1$���B%1R�BUXYW&��1'��(��1).?:;9'@�B*1XYW+1,���B1-���B1.���B1/104:;9I1.?:;9'@�B2:;9I�B34:;9I�B44:;9I�B51R�BUXYW6.?:;9'I@�B7.?:;9'I 48:;9I9:.?<n:;9;6<.?<n:;=.?<n:;9>.?<nUV�U�VUV�U�T\�T�T\�T�P\PS\P\PP]]]PSSSPS
��
��U]�U�]�U�]�U�]�U�]PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPVVVVPSUSSSSPVPP\PQ\P\P\\\\�����U\�U�\PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSSPSSPVPQVPVPVVVV����������U]�U�]�U�]�U�]�U�]PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSPSSSPVUVVVVP\PQ\P\P\\\PS�PS�����U�U�PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPSUSSSPSSSSSSPVPQVPVPVVVVVVVV���������<�S���
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmltestWriter.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hiconv.hencoding.hxmlstring.htree.hxmlmemory.hglobals.hxmlwriter.hstring.h<built-in>xmlversion.hparser.h	����<<X>�
�K=X=�	�	Y	 Jf<
X>%<><%<
�JQ
m,�w
.
�=
-x��w
�J�	�
�w�	�X�wJ
	�	��w
�t
�w.XX��wXKz&z.^Y
�
Y�
�
�
0d>
Y�X�
��
Z�
Z�
/�=
X[�X�
��
.��
.��
/�=
Y�X�
/�=
Y�X�
��
��
��
Z�
.��
��
��
Z�
.��
��
��
�Q
Z�
�
�
��= 	�~��
�~J�t 
�~ �	j�
�~J�t 
�~ �	l�
�~J�t 
�~ �	a�
�~J�t
�~.�	�
�~J�t 
�~ �	���
�~J�t 
�~ �	8F�
�~J�t 
�~ �	&X�
�~J�t 
�~ �	���
�~J�t 
�~ X	��~�
�~ �t 
�~ X	�Kw	�Y
�~�t��X=�
/
�~�t�
�
�
0d>
Y
�}�t�X�
��
Z�
Z�
/�=
.[
�}�t�X�
��
.��
.��
/�=
Y�X�
/�=
Z�X�
��
��
��
Z�
.��
��
��
Z�
.��
��
��
��
Z�
�	�
�
�|�tO�
�|��t=]�|
���=  .-	�~��~
t�
�|��	��}�
�|J�t  
�|J�	��}�
�|J�t  .
�|.�	��}
�	��}
�	��}
��nx.��<Y
�
Y�
�	�
0d>
Y�X�
��
Z�
Z�
/�=
X[�X�
��
.��
.��
/�=
Y�X�
/�=
Y�X�
��
��
��
Z�
.��
��
��
Z�
.��
��
��
�P
Z�
�	�
���0	�~��{
�	���	�~��{
�	�#J�{
�	�RJ�{
�	�J�{
�	��J�{
�	�mJ�{
�	�m��{
�	�2��z
�	��X	wX�z
�	��Kw	Xwt	�Y
�y�t�X=��
�y��t=�
/
�y�t	�
0d>
Y
�y�t�X�
��
Z�
Z�
/�=
.[
�y�t�X�
��
.��
.��
/�=
Y�X�
/�=
Y�X�
��
��
��
Z�
.��
��
��
Z�
.��
��
��
��
Z�
�	�
�
�x�tO�"=  .-	�~��y
t�
�x��	��y�
�xJ�t  .
�x.�	��y�
�xJ�t  .
�x.�	��y
�	��y
�	��x
	PzP�����\YprintfxmlTextWriterWriteFormatComment_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLxmlReallocFuncXML_BUFFER_ALLOC_DOUBLEITtype_IO_buf_basexmlTextWriterEndDocumentpsvilong long unsigned int_IO_buf_endout_sizexmlNewTextWriterTreeSystemIDXML_XINCLUDE_STARTnsDeftestXmlwriterFilename_privatexmlTextWriterWriteCommentxmlNslong long intsigned charxmlNodeGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECLlong unsigned int_fileno_IO_read_endencodinglastlong intoldNsparent_flagsxmlCharEncodingHandler__builtin_fputs__builtin_putsstdinXML_XINCLUDE_END_IO_codecvt__printf_chkxmlNewTextWriterFilenameExternalID_old_offset_offsetxmlBufferxmlCharxmlCleanupParserXML_ATTRIBUTE_ENTITIEStestXmlwriterDoccompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODEtempxmlMalloc_xmlDocXML_NOTATION_NODExmlCharEncodingOutputFuncunsigned int_freeres_bufxmlTextWriterWriteFormatElementxmlDocxmlTextWriterWriteAttributexmlMemoryDump_xmlAttr__streamoutputxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrXML_ATTRIBUTE_ENTITYprefixnamesys_nerrcharsetcontextsizeshort unsigned intXML_ENTITY_DECL_IO_wide_datastrlenxmlBufferPtrxmlBufferAllocationSchemexmlTextWriterStartElementwriterxmlNewDoc_xmlDtdtestWriter.c_lockxmlTextWriterStartDocument_flags2_modexmlTextWriterEndElementstdoutXML_BUFFER_ALLOC_IOXML_PI_NODExmlTextWriterWriteElementXML_ATTRIBUTE_IDiconv_thandlerxmlFreeTextWriter_codecvt_xmlBufferstandaloneextSubsetxmlRealloccontentpentities_IO_save_basexmlCharEncodingInputFuncxmlTextWriterPtrelements_xmlTextWriter_IO_write_endXML_ATTRIBUTE_DECLxmlFindCharEncodingHandler_IO_lock_t_IO_FILEfputsXML_BUFFER_ALLOC_BOUNDED__off_t_IO_save_endXML_BUFFER_ALLOC_EXACTXML_ENTITY_NODEsys_errlist_markersrefsxmlFreecontentIOxmlBufferCreatexmlNsTypechildrenunsigned charXML_DTD_NODEnodeXML_BUFFER_ALLOC_IMMUTABLEversionentitiesshort intfilenotationsxmlNodePtrXML_DOCUMENT_TYPE_NODE_xmlNodeXML_ATTRIBUTE_IDREFS_vtable_offsetFILExmlMemStrdupatypeinput__stack_chk_failXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictfprintfXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictxmlSaveFileEncXML_TEXT_NODEfcloseallocxmlDocSetRootElementintSubset__off64_t_cur_column_IO_read_baseiconv_inXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS_xmlCharEncodingHandler__pad5ConvertInputxmlNewDocNode_unused2stderrxmlTextWriterxmlCharEncodingHandlerPtr_IO_markerXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypexmlBufferFreexmlNewTextWriterMemoryXML_DOCUMENT_FRAG_NODE_freeres_listextraXML_ENTITY_REF_NODExmlNewTextWriterDocprev_wide_datatestXmlwriterTreeXML_DOCUMENT_NODEXML_BUFFER_ALLOC_HYBRID_xmlNsputsmain_IO_write_baseiconv_outXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAfopentestXmlwriterMemoryGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�@`F�B�B �A(�A0�D@�
0A(A BBBI�`AE�C�D G
DAHD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAEAHAplF�E�A �A(�D0�
(D ABBLK
(A ABBOD
(H ABBOD
(H ABBO0xgF�F�A �D0�
 AABHp�lF�L�A �A(�D0�
(D ABBHK
(A ABBOD
(H ABBOD
(H ABBO SHJ
�	
/1
K0i�1��2�3%A`[`�����
�
�%�F�eyS !#%')012345/6�h�8�����!�h�)�/�3�;�>�G��M�T�Z�e�h�t{���� �&�,�2�8�>�D�J(O�T�Z�_�e�k�qHw}@�����h����������0��� �`�����`��0�������@�0
h�	@	%�	+�
1�7�	=x	C(
Ih
O�
U�[�a�g�my���*+,-.�`��*�2C`AYr�����7Ohz�l������� 
g��
�l'1?TiSn~�.annobin_testWriter.c.annobin_testWriter.c_end.annobin_testWriter.c.hot.annobin_testWriter.c_end.hot.annobin_testWriter.c.unlikely.annobin_testWriter.c_end.unlikely.annobin_testWriter.c.startup.annobin_testWriter.c_end.startup.annobin_testWriter.c.exit.annobin_testWriter.c_end.exit.annobin_ConvertInput.start.annobin_ConvertInput.end.annobin_testXmlwriterFilename.start.annobin_testXmlwriterFilename.end.annobin_testXmlwriterMemory.start.annobin_testXmlwriterMemory.end.annobin_testXmlwriterDoc.start.annobin_testXmlwriterDoc.end.annobin_testXmlwriterTree.start.annobin_testXmlwriterTree.end.annobin_main.start.annobin_main.end.LC3.LC2.LC0.LC1.LC4.LC6.LC8.LC10.LC12.LC13.LC14.LC16.LC17.LC18.LC19.LC21.LC22.LC23.LC25.LC26.LC27.LC28.LC30.LC31.LC33.LC34.LC35.LC36.LC37.LC38.LC39.LC40.LC41.LC9.LC7.LC15.LC5.LC11.LC29.LC24.LC20.LC32.LC42.LC43.LC45.LC47.LC49.LC53.LC54.LC55.LC44.LC46.LC48.LC50.LC51.LC52.LC58.LC57.LC60.LC56.LC59.LC63.LC62.LC61.LC64.LC65.LC66.LC68.LC69.LC70.LC73.LC77.LC67.LC72.LC71.LC74.LC75.LC76.LC78.LC79.LC80.LC81.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupConvertInput_GLOBAL_OFFSET_TABLE_xmlFindCharEncodingHandlerstrlenxmlMallocxmlRealloc__printf_chkxmlFree__stack_chk_failtestXmlwriterFilenamexmlNewTextWriterFilenamexmlTextWriterStartDocumentxmlTextWriterStartElementxmlTextWriterWriteCommentxmlTextWriterWriteAttributexmlTextWriterWriteFormatCommentxmlTextWriterWriteFormatElementxmlTextWriterWriteElementxmlTextWriterEndElementxmlTextWriterEndDocumentxmlFreeTextWritertestXmlwriterMemoryxmlBufferCreatexmlNewTextWriterMemoryfopenfputsfclosexmlBufferFreetestXmlwriterDocxmlNewTextWriterDocxmlSaveFileEncxmlFreeDoctestXmlwriterTreexmlNewDocxmlNewDocNodexmlDocSetRootElementxmlNewTextWriterTreemainxmlCheckVersionxmlCleanupParserxmlMemoryDump3���������G���������_��������������������7����������������������������8�����������������9��������.:��������8���������K;��������R���������\���������m����������<�������������������=�������������������<���������>���������������������������������������?������������������@��������A�����������������B��������%C��������-���������<<��������CD��������H���������OE��������_���������u���������|F�������������������G���������H�������������������I���������J�������������������<���������K�������������������L���������������������������<��������"M��������'���������.N��������<���������R���������Z���������iO��������q����������P�������������������Q���������R�������������������I���������S�����������������������������P������������������T��������R�����������������)I��������0S��������5���������E���������U���������dU��������l���������wV��������~W���������������������������������������X���������Y���������Z��������[��������'\��������?]��������W^��������o_���������`���������a�������������������b�������������������<������������������c��������=�����������������+<��������2>��������7���������E���������Ld��������b���������i?��������q����������@���������A�������������������B���������C�������������������<���������D�������������������E�������������������e������������������F�����������������$G��������+H��������0���������II��������PJ��������U���������d<��������kK��������p���������wL�����������������������������<���������M�������������������N���������������������������������������O������������������P�����������������Q��������%R��������-���������FI��������MS��������R���������b���������qP��������y����������T���������R�������������������I���������S���������������������������������������U������������������	V��������		W��������	���������!	���������1	���������8	f��������D	���������N	g��������S	���������Z	h��������n	���������v	����������	i���������	j���������	k���������	l��������
m��������
n��������E
���������Y
<��������d
���������s
=��������{
����������
<���������
>���������
����������
����������
����������
?���������
����������
@���������
A���������
����������
B���������
C�����������������<��������D�������� ���������'E��������7���������M���������TF��������\���������uG��������|H�������������������I���������J�������������������<���������K�������������������L�����������������������������<���������M������������������N�����������������*���������2���������AO��������I���������XP��������`���������oQ��������vR��������~����������I���������S�����������������������������P�������������������T���������R������������������
I��������
S��������

���������
���������-
���������<
U��������D
���������O
V��������V
W��������^
���������n
���������~
����������
����������
<���������
����������
����������
o���������
����������
p���������
����������
q���������
���������r�����������������s�����������������#t��������(���������3u��������8���������Kv��������P���������cw��������h���������r���������yx��������~����������@�������������������y���������=���������������������������������������z��������<����������������� {��������/<��������6>��������;���������I���������P|��������f���������m?��������u����������@���������A�������������������B���������C�������������������<���������D�������������������E�������������������}�����������������F�����������������(G��������/H��������4���������MI��������TJ��������Y���������h<��������oK��������t���������{L�����������������������������<���������M�������������������N���������������������������������������O������������������P�����������������"Q��������)R��������1���������JI��������QS��������V���������f���������uP��������}����������T���������R�������������������I���������S���������������������������������������U������������������V��������
W�����������������%���������5���������<~��������H���������U<��������Z���������s�����������������������������������������������������������������������������������������������������������.���������F���������^���������v������������������������������	����������	����������	����������	���������i��������������������������������������� 4��`$,`P`X��`�����
���

�D
L�p�x����� . / 0 155S���������������������������!���������&���������-���������2���������9���������>���������C���������H���������
(
-�
-

-I
+@%
,*
-{8
-�?
-zH
-bT
-x[
-�b
-�p
-�u
-��
-
�
-�	�
-��
-��
-'�
-��
-*
�
-7�
-+�
-h
-�
-!
-.
-%;
-�H
-U
-4b
-�o
-8|
-��
-
�
-	�
-��
-�
-��
-��
-��
-��
-��
-�

-@
-�
&
-	2
-�:
-�
a
-Pl
-��
-9�
-^�
-�
�
-Z�
-�
-��
-&<
-`H
-T
-x
a
-Un
-.	{
-��
-8
�
-F�
-�
�
-��
-��
-��
-��
-e�
-�
-��
-�
-�
-�
-8
-sE
-�	R
-5`
-��
-�
-�	�
-�	�
-o	�
-��
-�
-y�
-&�
-��
-��
-��
-N�
-�
�
-p�
-��
-v�
-��
-��
-G�
-?�
-

-f%
-�+
-E	1
-�7
-9=
-�C
-PI
-a
O
-A
U
-:\
-Qh
-�v
-v�
-��
-U�
-Y�
-��
-��
-��
-�
-
-d	
-Z+
-�9
-�G
-�\
-j
-vx
-��
-U�
-Y�
-��
-��
-��
-��
-��
-P
-Y	
-� 
-�.
-><
-Q
-F_
-vm
-�{
-U�
-Y�
-��
-��
-��
-��
-��
-��
-


-�
-�#
-�1
-�M
-(i
-cw
-�	�
-��
-�	�
-d	�
-��
-�	�
-�	�
-O�
-��
-&�
-��
-�
	
-5	
-N)	
-v7	
-kR	
-�`	
-vn	
-�|	
-U�	
-Y�	
-��	
-��	
-��	
-��	
-(	�	
-�

-�

-�.

-�;

-T

-q

-�

-��

-;�

-��

-<�

-��

-�
--
-	
-�
(
-Y-
-??
-�
Km
)q
)v
-��
)��
)��
)K�
)=�
)��
)��
-s�
) �
)�
- �
-7�
-��
)u�
)i��)
)�-
)�2�HhW`}
)'�
)%��8�+�
+�
)Q�
)O�<��H�
+0

)

)}
V(
3
7K
Kc
c�
��
��
��
`�

-��
��

-�
)�
)�
)� 
)�%
-�1
)5
)F
)�J
)O
-}[
)(_
)"p
)�t
)q}�����M	�,9OpX
+�i
)	m
)}	r����	���x	���
+��
)�	�
)�	���
+
)�	
)�	��4
)�	8
)�	B�K�h
)'
l
)%
v���
'�3���/���!���4Tc?xh��M�j�y�)��3/�3>@;J�_Glv�����M�8�ZT].h;eLxatnx��{������������"�:U�_z��5�����Z���e�j� �*�E�R�\�w��e�����������)29JLb^��m�
-�� 
�
-��
)W
�
)O
�
)�
�
)�
�
-��
)�
�
)�

)`
)H!�
*�
G
)VK
)TP�
a�p�
y�
�
)��
)~��
�`��
��
�
)��
)���
�4
)�8
)�=N0]f�
)��
)����� � �
)(�
)&�,���00!
)R%
)P*<;�JHSHp
)|t
)zyT�@�`�`�
)��
)��l���v�v
)�
)��(03I
Ph
p
�!��
�h���
��
�
)'�
B3O/Y	t>�;�$�G��;��Q�`M�6ZCTT�oh|e���t����{���
�$?�O.c6{M���d�����������e.�F�a�k������
���e�!
�1
H
�)b
D�Q�[r
s�
��
��
���
�v�
-��� 
-� 
) 
)�" 
)"& 
)�+ 
-�7 
)x; 
)lL 
)P 
)�a 
)�e 
)�u 
)�y 
)�� �� � I� �!5	1!W	T!f	]!f	z!
)�~!
)��!
)��!
)��!r	�!�	�!
+��!
)4�!
)2�!�	�!�	�!0�!�		"�"�	!"
+02"
)^6"
)\@"�	I"
+`Z"
)�^"
)�h"�	q"�	�"
)��"
)��"
�"
�"
)��"
)��"
�"
�"
'�8�"�#�)#I#X# s#!}#;�#h�#�#I�#f�#u�#)$�$3($/2$�M$>Z$;d$�y$G�$�$��$�$�$�$M�$4%Z%T-%YH%hU%ef%t{%t�%�%��%{�%��%��%��%�%�&�(&�<&�T&�o&�y&�&��&1�&��&��&V�&��&e'f'}:'�D'�_'�l'�v'��'��'e�'��'��'��'�(	(�*(�4(%	L(5	d(H	|(W	�(��(z	�(�	�(
-`�(`�(
)�(
))
)�)
)A)
-�)
)_)
)E+)
)�/)
)f8)�A)
+`Q)
)�U)
)�Z)�k)(z)��)
+��)
)��)
)��)��)��)��)
+��)
)�)
)�)�)��)*
+ *
)F*
)D *1*�@* I*
+`Y*
)p]*
)nb*2s*��*8�*
+��*
)��*
)��*J�*��*P�*
+��*
)��*
)��*b�*�+h+
+ +
)�#+
)�(+z9+HH+�Q+
+`a+
)e+
)j+�{+�+��+
+��+
'I;�+��+@�+q�+�,,�0,!:,�O,h\,f,��,��,��,)�,�,3�,/�,1
->-;!-L6-GC-M-ch-x-y�-��-M�-��-Z�-T�-�.h.e#.�8.tE.O.j.{z.�.+�.��.�.@�.��.V�.^/u,/�6/�Q/�[/�v/��/��/��/��/e�/��/��/�00�)0�309N0�[0ej0I�0Y�0p�0��0��0��0��0�	1�!1�/1
-2:15Q15j151��15*�1��156�1��15B�1��15G�15L2
-2
-[
 2
-�	12
-�=2
-[
K2
-\O2
-\�2
--�2
-*�2
-��2
-��2
-��2
-��2
-4	�2
-4	04
-�44
-�=4
-�
A4
-�
J4
-�	N4
-�	W4
-)[4
-)c4
-g4
-o4
-s4
-{4
-�4
-��4
-��4
-��4
-�4
-�4
-��4
-��4
-��4
-��4
-F�4
-F�4
-��4
-��4
-��4
-��4
-�	�4
-�	�4
-�4
-@7
-�D7
-�S7
-�W7
-�8
-?�8
-?�8
-p�8
-p�8
-z�8
-z�8
-�	�8
-�	�8
-b9
-b�;
-i�;
-i�;
-��;
-��;
-��;
-��;
-��;
-�/!/)�4�<�J�R]epx[�[�`��6�6�f�f���++`KfS�^�f�q�y���������A�U�U�[������ O(�3�;FAN[u:}J�J����������"�"�Q���h'/:
'V2Q+Y<dA�[�
'�2�������h�h�m�m��
�� �(�3�;�I�Q�\�d�r�z���>�M�i�y�����#�.�6AIT8\Bg]owz���������������4�5�?�Z�i�j���%�-�8�@�K�S�^�f�q�y��(�)�8�9�K������������#+d6�>�I�Q�\�d��������c�c�l�m�w�����������(�0�;�CNmVw�H�L�L��������������������	�	�	�!	�)	f4	�<	�G	�O	�Z	�b	�	m�	w�	
'�2�	��	��	
'3�	��	��	
'?3�	�
�

'z3'
�/
�:

'�3W
 
_
D
j
D
r
�
}
�
�
�
�
�
�
��
h
~

�
$�
,�
7�
?�
J�
R]	e#p;xP�`�j��������������-�6�L�M�cd��#�.�6�A�I�T�\�g�o�z
� 
�!
�0
�1
�G
�H
�a
�b
�q
�r
��
��
��
��

�

�

�
%
�
-
�
8
@
K
S
+^
.f
;q
Ay
S�
Y�
k�
v�
��
I
�
g
�
g
�
�
�
�
�
�
�
�
q%v-�`�
h�
s�
{1�1�6�6�:�:�������������
�
�
&q1v9�V�
^�
i
'�4��
��
�
'.5��
��
�
'i5��
��
'�5�
'�5(0,;
'6R.Z<e
'N6|A�T�
'�6�Y�l�
'�6�v���
'7���'�	2�	:�	H�	P�	[�	c�	q�	y�	��	��	��	��	��	��	��	�
"*5 =:HIPe[uc�n�v������������4�>�Y�s�����������!,40?1G;RVZeefm|x}���������������������	�	�$	�%	4	5	G	#�	+�	6�	>�	I�	Q
x����a	��	��	��	��	��	��	��	�
���#�	.�	6�	A�	I�	T�	\�	g�	o�	z�	�
�D�H�H���������������%�-�8�@�K�S�	^�	f�	q�	y
�a	�q	�q	�	�f	�r	�
'K7�f	q	q	r	4�	<�	G
']7^�	f�	q
'�7��	��	�
'�7��	��	�
'8��	�	
�
'T8`pp#������������������0�1�K�cx��!�)�4�<�GOZ@bUm^ut�u�����������������������9
HI X+Y3o>pF�Q�Y�d�l�w���������������1�2�I�J�a�byz�"�*�_qg�r�z���������������������,�2�D
J\b%t0z8�C�K��������Y�Y�^�^�b�b������;;??&�1�9�DL-W2_EjJr]}b�u�z�����������
'
9����
'I9�$/
'�9FNY
'�9px2�
':�2�J�
'C:�J�b�
'�:�b�z
'�:z �+
';
' 5"'+<0H8O@QH[`�h�p�x�������������������������� (08@H ` h p$x+�-�8�8�8�<�C�E�P�P�P�T�[]h h(h0l8s@uH�`�h�p�x�������������������	��	��	��	�	�	�	�	0�	8�	@�	H�	`�	h�	p�	x�	�p�w���������������������� �(�@H�P5X5S�~��5 d`�| 
��$5.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rela.gnu.build.attributes.text.startup.rela.text.startup.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group>@8�>T8�>l8�>�(8�>�8� ��@��8%8&�,�6��1@�8
L�[��V@�08
uT�T��@H�08A(�(��@x�08������@��08�2�2�
�*8@��08A0,S<@�8T�,�;O@�xT8`<h�s�k@n@�I�?8!�2�@~@x�H8#�r�p�@���	8%���@��H8'�0���0y�.���A��u��L�� ������������������ 4ȯ8/@ȓ�86�09�	0��X�Edoc/alt-libxml2-devel/examples/index.py000064400000021711151730335170014043 0ustar00#!/usr/bin/env python
#
# Indexes the examples and build an XML description
#
import glob
import sys
try:
    import libxml2
except:
    print("libxml2 python bindings not available")
    sys.exit(1)
sys.path.insert(0, "..")
from apibuild import CParser, escape

examples = []
extras = ['examples.xsl', 'index.html', 'index.py']
tests = []
sections = {}
symbols = {}
api_dict = None
api_doc = None

def load_api():
    global api_dict
    global api_doc

    if api_dict != None:
        return
    api_dict = {}
    try:
        print("loading ../libxml2-api.xml")
        api_doc = libxml2.parseFile("../libxml2-api.xml")
    except:
        print("failed to parse ../libxml2-api.xml")
        sys.exit(1)

def find_symbol(name):
    global api_dict
    global api_doc

    if api_doc == None:
        load_api()

    if name == None:
        return
    if name in api_dict:
        return api_dict[name]
    ctxt = api_doc.xpathNewContext()
    res = ctxt.xpathEval("/api/symbols/*[@name = '%s']" % (name))
    if type(res) == type([]) and len(res) >= 1:
        if len(res) > 1:
            print("Found %d references to %s in the API" % (len(res), name))
        node = res[0]
        typ = node.name
        file = node.xpathEval("string(@file)")
        info = node.xpathEval("string(info)")
    else:
        print("Reference %s not found in the API" % (name))
        return None
    ret = (typ, file, info)
    api_dict[name] = ret
    return ret

def parse_top_comment(filename, comment):
    res = {}
    lines = comment.split("\n")
    item = None
    for line in lines:
        while line != "" and (line[0] == ' ' or line[0] == '\t'):
            line = line[1:]
        while line != "" and line[0] == '*':
            line = line[1:]
        while line != "" and (line[0] == ' ' or line[0] == '\t'):
            line = line[1:]
        try:
            (it, line) = line.split(":", 1)
            item = it
            while line != "" and (line[0] == ' ' or line[0] == '\t'):
                line = line[1:]
            if item in res:
                res[item] = res[item] + " " + line
            else:
                res[item] = line
        except:
            if item != None:
                if item in res:
                    res[item] = res[item] + " " + line
                else:
                    res[item] = line
    return res

def parse(filename, output):
    global symbols
    global sections

    parser = CParser(filename)
    parser.collect_references()
    idx = parser.parse()
    info = parse_top_comment(filename, parser.top_comment)
    output.write("  <example filename='%s'>\n" % filename)
    try:
        synopsis = info['synopsis']
        output.write("    <synopsis>%s</synopsis>\n" % escape(synopsis));
    except:
        print("Example %s lacks a synopsis description" % (filename))
    try:
        purpose = info['purpose']
        output.write("    <purpose>%s</purpose>\n" % escape(purpose));
    except:
        print("Example %s lacks a purpose description" % (filename))
    try:
        usage = info['usage']
        output.write("    <usage>%s</usage>\n" % escape(usage));
    except:
        print("Example %s lacks an usage description" % (filename))
    try:
        test = info['test']
        output.write("    <test>%s</test>\n" % escape(test));
        progname=filename[0:-2]
        command=test.replace(progname, './' + progname, 1)
        tests.append(command)
    except:
        pass
    try:
        author = info['author']
        output.write("    <author>%s</author>\n" % escape(author));
    except:
        print("Example %s lacks an author description" % (filename))
    try:
        copy = info['copy']
        output.write("    <copy>%s</copy>\n" % escape(copy));
    except:
        print("Example %s lacks a copyright description" % (filename))
    try:
        section = info['section']
        output.write("    <section>%s</section>\n" % escape(section));
        if section in sections:
            sections[section].append(filename)
        else:
            sections[section] = [filename]
    except:
        print("Example %s lacks a section description" % (filename))
    for topic in sorted(info.keys()):
        if topic != "purpose" and topic != "usage" and \
           topic != "author" and topic != "copy" and \
           topic != "section" and topic != "synopsis" and topic != "test":
            str = info[topic]
            output.write("    <extra topic='%s'>%s</extra>\n" % (
                         escape(topic), escape(str)))
    output.write("    <includes>\n")
    for include in sorted(idx.includes.keys()):
        if include.find("libxml") != -1:
            id = idx.includes[include]
            line = id.get_lineno()
            output.write("      <include line='%d'>%s</include>\n" %
                         (line, escape(include)))
    output.write("    </includes>\n")
    output.write("    <uses>\n")
    for ref in sorted(idx.references.keys()):
        id = idx.references[ref]
        name = id.get_name()
        line = id.get_lineno()
        if name in symbols:
            sinfo = symbols[name]
            refs = sinfo[0]
            # gather at most 5 references per symbols
            if refs > 5:
                continue
            sinfo.append(filename)
            sinfo[0] = refs + 1
        else:
            symbols[name] = [1, filename]
        info = find_symbol(name)
        if info != None:
            type = info[0]
            file = info[1]
            output.write("      <%s line='%d' file='%s' name='%s'/>\n" % (type,
                         line, file, name))
        else:
            type = id.get_type()
            output.write("      <%s line='%d' name='%s'/>\n" % (type,
                         line, name))

    output.write("    </uses>\n")
    output.write("  </example>\n")

    return idx

def dump_symbols(output):
    global symbols

    output.write("  <symbols>\n")
    for symbol in sorted(symbols.keys()):
        output.write("    <symbol name='%s'>\n" % (symbol))
        info = symbols[symbol]
        i = 1
        while i < len(info):
            output.write("      <ref filename='%s'/>\n" % (info[i]))
            i = i + 1
        output.write("    </symbol>\n")
    output.write("  </symbols>\n")

def dump_sections(output):
    global sections

    output.write("  <sections>\n")
    for section in sorted(sections.keys()):
        output.write("    <section name='%s'>\n" % (section))
        info = sections[section]
        i = 0
        while i < len(info):
            output.write("      <example filename='%s'/>\n" % (info[i]))
            i = i + 1
        output.write("    </section>\n")
    output.write("  </sections>\n")

def dump_Makefile():
    for file in glob.glob('*.xml'):
        extras.append(file)
    for file in glob.glob('*.res'):
        extras.append(file)
    Makefile="""##
## This file is auto-generated by index.py
## DO NOT EDIT !!!
##

AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
LDADD = $(top_builddir)/libxml2.la

CLEANFILES = *.tmp

rebuild:
\tcd $(srcdir) && $(PYTHON) index.py
\t$(MAKE) Makefile
\tcd $(srcdir) && xsltproc examples.xsl examples.xml
\t-cd $(srcdir) && xmllint --valid --noout index.html

.PHONY: rebuild

install-data-local: 
\t$(MKDIR_P) $(DESTDIR)$(docdir)/examples
\t-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/

clean-local:
\ttest -f Makefile.am || rm -f test?.xml

"""
    examples.sort()
    extras.sort()
    tests.sort()
    EXTRA_DIST=""
    for extra in extras:
        EXTRA_DIST = EXTRA_DIST + " \\\n\t" + extra
    Makefile = Makefile + "EXTRA_DIST =%s\n\n" % (EXTRA_DIST)
    check_PROGRAMS=""
    for example in examples:
        check_PROGRAMS = check_PROGRAMS + " \\\n\t" + example
    Makefile = Makefile + "check_PROGRAMS =%s\n\n" % (check_PROGRAMS)
    for example in examples:
        Makefile = Makefile + "%s_SOURCES = %s.c\n\n" % (example, example)
    Makefile = Makefile + "valgrind: \n\t$(MAKE) CHECKER='valgrind' tests\n\n"
    Makefile = Makefile + "tests: $(check_PROGRAMS)\n"
    Makefile = Makefile + "\t@test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .\n"
    Makefile = Makefile + "\t@(echo '## examples regression tests')\n"
    Makefile = Makefile + "\t@(echo > .memdump)\n"
    for test in tests:
        Makefile = Makefile + "\t@$(CHECKER) %s\n" % (test)
        Makefile = Makefile + '\t@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0\n'
    Makefile = Makefile + "\t@rm *.tmp\n"
    try:
        old = open("Makefile.am", "r").read()
        if old != Makefile:
            n = open("Makefile.am", "w").write(Makefile)
            print("Updated Makefile.am")
    except:
        print("Failed to read or save Makefile.am")

if __name__ == "__main__":
    load_api()
    output = open("examples.xml", "w")
    output.write("<examples>\n")

    for file in sorted(glob.glob('*.c')):
        parse(file, output)
        examples.append(file[:-2])

    dump_symbols(output)
    dump_sections(output)
    output.write("</examples>\n")
    output.close()
    #dump_Makefile()

doc/alt-libxml2-devel/examples/reader2.c000064400000006077151730335170014062 0ustar00/**
 * section: xmlReader
 * synopsis: Parse and validate an XML file with an xmlReader
 * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
 *          validating the content in the process and activating options
 *          like entities substitution, and DTD attributes defaulting.
 *          (Note that the XMLReader functions require libxml2 version later
 *          than 2.6.)
 * usage: reader2 <valid_xml_filename>
 * test: reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/xmlreader.h>

#ifdef LIBXML_READER_ENABLED

/**
 * processNode:
 * @reader: the xmlReader
 *
 * Dump information about the current node
 */
static void
processNode(xmlTextReaderPtr reader) {
    const xmlChar *name, *value;

    name = xmlTextReaderConstName(reader);
    if (name == NULL)
	name = BAD_CAST "--";

    value = xmlTextReaderConstValue(reader);

    printf("%d %d %s %d %d", 
	    xmlTextReaderDepth(reader),
	    xmlTextReaderNodeType(reader),
	    name,
	    xmlTextReaderIsEmptyElement(reader),
	    xmlTextReaderHasValue(reader));
    if (value == NULL)
	printf("\n");
    else {
        if (xmlStrlen(value) > 40)
            printf(" %.40s...\n", value);
        else
	    printf(" %s\n", value);
    }
}

/**
 * streamFile:
 * @filename: the file name to parse
 *
 * Parse, validate and print information about an XML file.
 */
static void
streamFile(const char *filename) {
    xmlTextReaderPtr reader;
    int ret;


    /*
     * Pass some special parsing options to activate DTD attribute defaulting,
     * entities substitution and DTD validation
     */
    reader = xmlReaderForFile(filename, NULL,
                 XML_PARSE_DTDATTR |  /* default DTD attributes */
		 XML_PARSE_NOENT |    /* substitute entities */
		 XML_PARSE_DTDVALID); /* validate with the DTD */
    if (reader != NULL) {
        ret = xmlTextReaderRead(reader);
        while (ret == 1) {
            processNode(reader);
            ret = xmlTextReaderRead(reader);
        }
	/*
	 * Once the document has been fully parsed check the validation results
	 */
	if (xmlTextReaderIsValid(reader) != 1) {
	    fprintf(stderr, "Document %s does not validate\n", filename);
	}
        xmlFreeTextReader(reader);
        if (ret != 0) {
            fprintf(stderr, "%s : failed to parse\n", filename);
        }
    } else {
        fprintf(stderr, "Unable to open %s\n", filename);
    }
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    streamFile(argv[1]);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}

#else
int main(void) {
    fprintf(stderr, "XInclude support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/parse3.o000064400000054030151730335170013737 0ustar00ELF>�I@@98	

,.+/*0)1GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��H���
R�E1�1ɾH�H�=�H��tH�����1�H���H�
��H�=���noname.xml<doc/>Failed to parse document
u�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�7(
��0
��8doc
�7@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'7
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
07@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�j0
��
��
�P
��
��
�C 
�7(]j`
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
�CX�
%�
&��K��C9�B3��C	)M		C&	C)W2	8	�G	������	���&	�)al��
�
1�
�
�
�
 #	S
 !".#U	#T1#QI$9�
#U	#T6#Q	#R0#X0%F$S�
#U

R%_%l&'�''a(doc�)da.'d�'d<�*+,
u,
-,
9-�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I4:;9I.?:;9'I@�B1R�BUXYW1�BU41�B 1R�BXYW!1"��1#���B$��1%��1&.:;9' ':;9I(4:;9I).?:;9'I 4*+.?<n:;,.?<n:;9-.?<n:;96�6�
�
�PP
�,l�O�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlparse3.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hparser.hxmlversion.h<built-in>	(PzP�i�\�\Y	gt�
��__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDXML_XINCLUDE_STARTnsDef_codecvt_private_xmlNsxmlNslong long intsigned char__builtin_fwriteGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endencodinglong intoldNsparent_flags_IO_buf_endstdinXML_XINCLUDE_END_IO_codecvtExternalID_old_offset_offsetxmlCharxmlCleanupParserxmlReadMemoryexample3FunccompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocfprintfxmlMemoryDump_xmlAttr__streamlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLlast_IO_save_base_cur_column_xmlDtd_lock_flags2_modestdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitieselements_IO_write_endXML_ATTRIBUTE_DECL_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotationsXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdupatypeXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doublelengthparseFlagschar_xmlDictXML_TEXT_NODEintSubset__off64_tdocument_IO_read_base_IO_save_endparse3.cXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypefwriteXML_DOCUMENT_FRAG_NODE_freeres_listextraXML_ENTITY_REF_NODE_wide_dataXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESmain_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�lHD
A
�	-)?.Yt/��0��1�l!#%'./0123-4#(-2>Ncw()*+,�l��������.annobin_parse3.c.annobin_parse3.c_end.annobin_parse3.c.hot.annobin_parse3.c_end.hot.annobin_parse3.c.unlikely.annobin_parse3.c_end.unlikely.annobin_parse3.c.startup.annobin_parse3.c_end.startup.annobin_parse3.c.exit.annobin_parse3.c_end.exit.annobin_main.start.annobin_main.end.LC0.LC1.LC2.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlReadMemoryxmlFreeDocxmlCleanupParserxmlMemoryDumpstderrfwrite ) # $ % &**l@��������,��������&-��������+A��������8B��������=C��������BD��������PE��������a.��������fF��������

"$
"�
"*
 0%
!*
"\8
"�?
"@H
"LO
"V
"]
"xk
"2p
"|
"~�
"X�
"��
"H�
"�
"�
"��
"�
"��
"�
"�
"O
"+)
"]6
"�C
"#P
"]
"j
"Sw
"��
"9�
"��
"h�
"M�
"��
"��
"��
"��
"M�
"�
"[
"!
"�-
"�5
"�\
"rg
"��
"[�
"a�
"&�
"��
"�
"�
"�
"'
"f 
"&
"�,
"2
"h8
">
"�D
"�J
"�P
".V
"-\
"Zb
"h
"�n
"t
"rz
"��
"a�
"��
">�
"t�
"��
"��
"�
"��
"(�
"��
"��
"r�
"��
"��
"�
"�
"�(
"C6
"&D
"AR
"c`
"��
"��
"�
"��
"��
"��
"��
"E�
"�
"�
"�
"C*
"&8
"AF
"cT
"�p
"�~
"��
"��
"o�
"~�
"��
"��
"&�
"��
"�
"�
"C
"&-
"A;
"cI
"�e
"�s
"��
"t�
"��
";�
"g�
")�
",�
"��
""

"�
"M)
"@
"�G
":L
"]Q
"9^
"�k
"�y
"c�
"��
"m�
"��
"��
"��
"��
"��
"�
"�
"C 
"&.
"A<
"cJ
"�s
"��
"��
"i�
"�
"��
"��
"D	
"Z'	
"H	
"T	
"�`	
"�l	
"1x	
"��	
"��	
"�	*�	*�	
 �	
�	
�	
@�	
<�	
 �	
��	
��	*M
*M 

�$

�.
*j?
T
*/i
{
�
*<�
*�
*A�
*F�

"��

"��

"F
"p
"�!
"�/
"�3
":
"�>
"�G
"RK
"RT
"�X
"�`
"�d
"�m
"xq
"x**<*M *l@*H*<S\*Md*lo�*/�*;�*M�*i�*M�*j�
***<*M*l0*8*l^* *.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group*@6/*P60*h61*�(62*�63�!�'�1��,@P.06	G�V��Q@�.06ph�h�@�.06<�<��@�.06����@/06��	8�@@/06 l@p/�6,2�,@�y;@`0�6L1h_��Z@E�6o�0j@�F06!��P~@�F�6#�	��@pG6%�0�R�0%.�K%K%pK%GK%K%�K%�K%�K%�K%�K%P%  p%8@�G64�%�7>	P,��G1doc/alt-libxml2-devel/examples/reader2.o000064400000063740151730335170014076 0ustar00ELF>`Y@@:9	

-/,0+1*2GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS����t��AW�
RAVAUATUSH��H���H�C�1�H��H�D$�H��H���Of�H���H�߉Ń����H��H��H��H�HD��H��I���H��A���H��A���H��A���H��E��I��AU��D��H�5�1��XZM��t@L���L��(~H�5�1���M���H�5�1���5����
��&������u'H�����u<��H��1�[]A\A]A^A_�H�L$H�=H�1����H�L$H�=H�1����H�L$H�=H�1����--%d %d %s %d %d %.40s...
 %s
%s : failed to parse
Unable to open %s
Document %s does not validate
�
�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��
9*C
B36<CK)
MW]CqC)
W}����<DI @� @� @�*�*�K�
�qc�j��]a��*	]a]*	0	h�=	I	U	b	K
to	{	�	�	$$��	�	 U1 T	 R Xv Y~�	.
5�	�	 U1 T	 Q|�	0��	�	 U1 T	�	+��	�	 U:!�	� Us!
� Us!
 Us!
. Us!+
F Us!7
^ UsC
 U|�	!R��	"�	O
 T1 Q	 R���	!V
4�	"�	O
 T1 Q	 R���	!Y	�#�	
�"�	O
 T1 Q	 R��![
� U�� T0 QJ!h
� Us$t
�
 Us!�
	 U

R$�
$�
�%;b	&;�'<�(ret=	a%�	&�'�'�)ka�	&k �*)da�	&d�&d<�*+\,�
-+�+�+�+�+�+�+	U+Z.I+�.+v+
.9+
�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!'I'I>I:;9(((.?:;9'I@�B:;9I�B1R�BUXYW1�BU41�B1R�BXYW��1 ���B!��1"1#1$��1%.:;9' &:;9I'4:;9I(4:;9I).?:;9'I 4*+.?<n:;9,6-.?<n:;..?<n:;9U�U�TS�T�P����PSSPSP1�PVVSSPVVP\Q\
�
�
��
�
�,�
U�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlreader2.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.hxmlmemory.hglobals.hxmlreader.hxmlversion.hparser.h<built-in>!	�K�!j 	.!wX	�!w	JZ\J$�SXX@	�U�+<	/
�P
\::=tL
Z
:>X��
$�	w

��@<
Y=
tC;
.
__X�
�dX	[�J\YI/ _�
�.
p
�.	s
J�printf__off_txmlTextReaderNodeType_IO_read_ptrXML_PARSE_PEDANTIC_chainxmlStrdupFuncXML_PARSE_NODICT/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_t_shortbufXML_PARSE_NOXINCNODE_IO_buf_baseXML_PARSE_IGNORE_ENClong long unsigned intXML_PARSE_BIG_LINESreader_codecvtxmlTextReaderIsEmptyElementlong long intsigned charGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobin_fileno_IO_read_endstreamFilelong int_flags_IO_buf_endstdin_xmlTextReaderputchar_IO_codecvt__printf_chkXML_PARSE_DTDATTR_offsetmainxmlTextReaderxmlCharxmlCleanupParserXML_PARSE_HUGEvalue_IO_markerunsigned int_freeres_bufxmlReallocFuncfprintfxmlMemoryDump__streamlong unsigned intxmlCheckVersionxmlFreeFuncxmlTextReaderHasValue_IO_write_ptrname__builtin_putcharsys_nerrprocessNodeshort unsigned intXML_PARSE_DTDLOAD_IO_save_basexmlFreeTextReaderXML_PARSE_OLD10xmlTextReaderDepthxmlMallocAtomic_lockXML_PARSE_DTDVALID_flags2_modestdoutxmlMallocXML_PARSE_NOWARNINGXML_PARSE_XINCLUDEXML_PARSE_OLDSAXxmlReallocfilenamexmlReaderForFilexmlTextReaderPtr_IO_write_end_IO_lock_t_IO_FILE_old_offsetsys_errlist_markersxmlFreexmlTextReaderReadXML_PARSE_NSCLEANXML_PARSE_NOENTunsigned charshort intxmlTextReaderConstValue_IO_wide_data_vtable_offsetFILExmlMemStrdup__fprintf_chkXML_PARSE_COMPACTreader2.clong doublecharxmlStrlen__off64_t_cur_column_IO_read_base_IO_save_endXML_PARSE_NONET__fmtXML_PARSE_NOBLANKSxmlTextReaderConstName__pad5_unused2stderrxmlMallocFuncXML_PARSE_SAX1_IO_backup_baseXML_PARSE_RECOVERXML_PARSE_NOCDATAargcxmlTextReaderIsValid_freeres_listXML_PARSE_NOERRORXML_PARSE_NOBASEFIX_wide_dataargv_IO_write_baseGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�T�Q�G�B �B(�A0�A8�GP�XH`YXAPx
8C0A(B BBBA
�	.+B/]y0��1��2� "$&(/01234.5-27<AF"K8P\l��)*+,-�������#9Uk~��������.annobin_reader2.c.annobin_reader2.c_end.annobin_reader2.c.hot.annobin_reader2.c_end.hot.annobin_reader2.c.unlikely.annobin_reader2.c_end.unlikely.annobin_reader2.c.startup.annobin_reader2.c_end.startup.annobin_reader2.c.exit.annobin_reader2.c_end.exit.annobin_main.start.annobin_main.end.LC0.LC1.LC2.LC3.LC4.LC5.LC6.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlReaderForFilexmlTextReaderReadxmlTextReaderConstNamexmlTextReaderConstValuexmlTextReaderHasValuexmlTextReaderIsEmptyElementxmlTextReaderNodeTypexmlTextReaderDepth__printf_chkxmlStrlenputcharxmlTextReaderIsValidxmlFreeTextReaderxmlCleanupParserxmlMemoryDumpstderr__fprintf_chk * $ % & '++�&E��������>F��������TG��������gH��������w-���������I���������J���������K���������L���������M���������.���������N���������O���������/���������N��������0��������N��������!P��������+Q��������8R��������AS��������FT��������cU��������j1��������vV���������U���������2���������V���������U���������3���������V��������

#V
#�
#k
!�%
"*
#�8
#U?
#
H
#pO
#�V
#J]
#~k
#Up
#|
#�
#�
#
�
#^�
#%�
#=�
#*�
#K�
#��
#�
#�
#e
#�)
#�6
#8C
#+P
#E]
#5j
#dw
#�
#�
#��
#��
#K�
#��
#�
#;�
#�
#�
#�
#l
#�!
#�-
#�5
#\
#�g
#��
#q�
#r�
#��
#��
#�
#�
#<	
#�
#w+
#�L
#'r
#L�
#��
#`�
#��
#��
#Q�
#�
#��
#2�
#[�
#��
#��
#E�
#Z�
#N�
#�
#�

#�
#
#'%
#�.
#�7
#�@
#�L
#�Q
#y]
#;i
#�u
#4�
#��
#��
#w�
#��
#��+�
#��
�
�
#F�
C�
=�+=
!
�
� 
!)
�-
�6
e:
[C+fL
!@\
�`
�e
!@n
r
{
f
^�+��+��
��
��+���+��
!�
�

�+�%:+C+_
 c
h+~�+�+�
N�
L�+%�+k�+��+�+�/+�G+�_+�y+[�+[�
x�
v�+z��+|�+|�
�
�+�""9+�B+�`8o+��8�+B�+X�+/�+<�+*	+E	+J1	
#J>	
#�J	
#c	
#�p	
#|	
#��	
#��	
#�	
#U�	
#6�	
#L�	
#U�	
#��	
#��	
#��	
#��	
#n

#n

#�

#�

#�

#� 

# $

# ,

#0

#8

#(<

#(D

#
H

#
P

#�T

#�\

#�`

#�i

#<m

#<u

#�y

#��

#�

#�

#g�

#g�

#��

#��

#>�

#>++++�C+K+)V+)^+Ei+Eq+��+=�+A�+A�+@�+[�+��+E�+N�+N+Q+[+�%+�-+�8+�@+�e+]m+fx+f�+*�+*�+.�+.�+@�+[�+��+f�+�+�+*+t+{(+{0+;+C+*f+�n+�y+��+�+�+�+�+*�+��+���+��+ +(+3N+V+*a
�	x+[�+|��+|�+��"
++.+8+=+@ +[(+�@+XH+[P+fX+`+h+*�+��+��+��+�+�+�d+ +.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rodata.str1.8.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group9@749P759h769�(779�78�!�'�1��,@x507	G�V��Q@�507ph�h�@�507<�<��@607����@8607��	8�@h607 �@�6�7,2�K;20
OO
�
J@�9�7[\n^�i@PN�7 ~00y@U07"�`��@@U�7$�0�@�V7&�0>"Z�0�).��)�)p�)G�)�)��)��)��)��)�)�) /�)p*@W75X*(8C	�2� W@doc/alt-libxml2-devel/examples/test3.xml000064400000001501151730335200014133 0ustar00<doc>
  <parent>
    <discarded>
      <discarded/>
    </discarded>
    <preserved/>
    This text node must be discarded
    <discarded>
      <discarded/>
    </discarded>
    <preserved>
      content1
      <child1></child1>
      <child2>content2</child2>
      <preserved>too</preserved>
      <child2>content3</child2>
      <preserved></preserved>
      <child2>content4</child2>
      <preserved/>
      <child2>content5</child2>
      content6
    </preserved>
    This text node must be discarded
    <discarded>
      <discarded/>
    </discarded>
    This text node must be discarded
    <preserved></preserved>
    This text node must be discarded
    <preserved/>
    This text node must be discarded
    <discarded>
      <discarded/>
    </discarded>
    This text node must be discarded
  </parent>
</doc>

      
doc/alt-libxml2-devel/examples/test2.xml000064400000000343151730335200014135 0ustar00<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
]>
<doc>
  <src ref="foo"/>
  <dest id="foo"/>
  <src ref="foo"/>
</doc>

doc/alt-libxml2-devel/examples/parse1000075500000017372151730335200013505 0ustar00#! /bin/sh

# parse1 - temporary wrapper script for .libs/parse1
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The parse1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file parse1.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "parse1:parse1:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "parse1:parse1:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "parse1:parse1:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'parse1'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/tree1000075500000017357151730335200013335 0ustar00#! /bin/sh

# tree1 - temporary wrapper script for .libs/tree1
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The tree1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file tree1.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "tree1:tree1:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "tree1:tree1:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "tree1:tree1:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'tree1'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/xpath2.c000064400000012323151730335200013725 0ustar00/** 
 * section: 	XPath
 * synopsis: 	Load a document, locate subelements with XPath, modify
 *              said elements and save the resulting document.
 * purpose: 	Shows how to make a full round-trip from a load/edit/save
 * usage:	xpath2 <xml-file> <xpath-expr> <new-value>
 * test:	xpath2 test3.xml '//discarded' discarded > xpath2.tmp && diff xpath2.tmp $(srcdir)/xpath2.res
 * author: 	Aleksey Sanin and Daniel Veillard
 * copy: 	see Copyright for the status of this software.
 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>

#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_SAX1_ENABLED) && \
    defined(LIBXML_OUTPUT_ENABLED)


static void usage(const char *name);
static int example4(const char *filename, const xmlChar * xpathExpr,
                    const xmlChar * value);
static void update_xpath_nodes(xmlNodeSetPtr nodes, const xmlChar * value);


int 
main(int argc, char **argv) {
    /* Parse command line and process file */
    if (argc != 4) {
	fprintf(stderr, "Error: wrong number of arguments.\n");
	usage(argv[0]);
	return(-1);
    } 
    
    /* Init libxml */     
    xmlInitParser();
    LIBXML_TEST_VERSION

    /* Do the main job */
    if (example4(argv[1], BAD_CAST argv[2], BAD_CAST argv[3])) {
	usage(argv[0]);
	return(-1);
    }

    /* Shutdown libxml */
    xmlCleanupParser();
    
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return 0;
}

/**
 * usage:
 * @name:		the program name.
 *
 * Prints usage information.
 */
static void 
usage(const char *name) {
    assert(name);
    
    fprintf(stderr, "Usage: %s <xml-file> <xpath-expr> <value>\n", name);
}

/**
 * example4:
 * @filename:		the input XML filename.
 * @xpathExpr:		the xpath expression for evaluation.
 * @value:		the new node content.
 *
 * Parses input XML file, evaluates XPath expression and update the nodes
 * then print the result.
 *
 * Returns 0 on success and a negative value otherwise.
 */
static int 
example4(const char* filename, const xmlChar* xpathExpr, const xmlChar* value) {
    xmlDocPtr doc;
    xmlXPathContextPtr xpathCtx; 
    xmlXPathObjectPtr xpathObj; 
    
    assert(filename);
    assert(xpathExpr);
    assert(value);

    /* Load XML document */
    doc = xmlParseFile(filename);
    if (doc == NULL) {
	fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename);
	return(-1);
    }

    /* Create xpath evaluation context */
    xpathCtx = xmlXPathNewContext(doc);
    if(xpathCtx == NULL) {
        fprintf(stderr,"Error: unable to create new XPath context\n");
        xmlFreeDoc(doc); 
        return(-1);
    }
    
    /* Evaluate xpath expression */
    xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
    if(xpathObj == NULL) {
        fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr);
        xmlXPathFreeContext(xpathCtx); 
        xmlFreeDoc(doc); 
        return(-1);
    }

    /* update selected nodes */
    update_xpath_nodes(xpathObj->nodesetval, value);

    
    /* Cleanup of XPath data */
    xmlXPathFreeObject(xpathObj);
    xmlXPathFreeContext(xpathCtx); 

    /* dump the resulting document */
    xmlDocDump(stdout, doc);


    /* free the document */
    xmlFreeDoc(doc); 
    
    return(0);
}

/**
 * update_xpath_nodes:
 * @nodes:		the nodes set.
 * @value:		the new value for the node(s)
 *
 * Prints the @nodes content to @output.
 */
static void
update_xpath_nodes(xmlNodeSetPtr nodes, const xmlChar* value) {
    int size;
    int i;
    
    assert(value);
    size = (nodes) ? nodes->nodeNr : 0;
    
    /*
     * NOTE: the nodes are processed in reverse order, i.e. reverse document
     *       order because xmlNodeSetContent can actually free up descendant
     *       of the node and such nodes may have been selected too ! Handling
     *       in reverse order ensure that descendant are accessed first, before
     *       they get removed. Mixing XPath and modifications on a tree must be
     *       done carefully !
     */
    for(i = size - 1; i >= 0; i--) {
	assert(nodes->nodeTab[i]);
	
	xmlNodeSetContent(nodes->nodeTab[i], value);
	/*
	 * All the elements returned by an XPath query are pointers to
	 * elements from the tree *except* namespace nodes where the XPath
	 * semantic is different from the implementation in libxml2 tree.
	 * As a result when a returned node set is freed when
	 * xmlXPathFreeObject() is called, that routine must check the
	 * element type. But node from the returned set may have been removed
	 * by xmlNodeSetContent() resulting in access to freed data.
	 * This can be exercised by running
	 *       valgrind xpath2 test3.xml '//discarded' discarded
	 * There is 2 ways around it:
	 *   - make a copy of the pointers to the nodes from the result set 
	 *     then call xmlXPathFreeObject() and then modify the nodes
	 * or
	 *   - remove the reference to the modified nodes from the node set
	 *     as they are processed, if they are not namespace nodes.
	 */
	if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL)
	    nodes->nodeTab[i] = NULL;
    }
}

#else
int main(void) {
    fprintf(stderr, "XPath support not compiled in\n");
    return 0;
}
#endif
doc/alt-libxml2-devel/examples/testWriter.c000064400000113145151730335200014677 0ustar00/**
 * section: xmlWriter
 * synopsis: use various APIs for the xmlWriter
 * purpose: tests a number of APIs for the xmlWriter, especially
 *          the various methods to write to a filename, to a memory
 *          buffer, to a new document, or to a subtree. It shows how to
 *          do encoding string conversions too. The resulting
 *          documents are then serialized.
 * usage: testWriter
 * test: testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done
 * author: Alfred Mickautsch
 * copy: see Copyright for the status of this software.
 */
#include <stdio.h>
#include <string.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>

#if defined(LIBXML_WRITER_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)

#define MY_ENCODING "ISO-8859-1"

void testXmlwriterFilename(const char *uri);
void testXmlwriterMemory(const char *file);
void testXmlwriterDoc(const char *file);
void testXmlwriterTree(const char *file);
xmlChar *ConvertInput(const char *in, const char *encoding);

int
main(void)
{
    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    /* first, the file version */
    testXmlwriterFilename("writer1.tmp");

    /* next, the memory version */
    testXmlwriterMemory("writer2.tmp");

    /* next, the DOM version */
    testXmlwriterDoc("writer3.tmp");

    /* next, the tree version */
    testXmlwriterTree("writer4.tmp");

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return 0;
}

/**
 * testXmlwriterFilename:
 * @uri: the output URI
 *
 * test the xmlWriter interface when writing to a new file
 */
void
testXmlwriterFilename(const char *uri)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlChar *tmp;

    /* Create a new XmlWriter for uri, with no compression. */
    writer = xmlNewTextWriterFilename(uri, 0);
    if (writer == NULL) {
        printf("testXmlwriterFilename: Error creating the xml writer\n");
        return;
    }

    /* Start the document with the xml default for the version,
     * encoding ISO 8859-1 and the default for the standalone
     * declaration. */
    rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n");
        return;
    }

    /* Start an element named "EXAMPLE". Since this is the first
     * element, this will be the root element of the document. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write a comment as child of EXAMPLE.
     * Please observe, that the input to the xmlTextWriter functions
     * HAS to be in UTF-8, even if the output XML is encoded
     * in iso-8859-1 */
    tmp = ConvertInput("This is a comment with special chars: <\xE4\xF6\xFC>",
                       MY_ENCODING);
    rc = xmlTextWriterWriteComment(writer, tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "ORDER" as child of EXAMPLE. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Add an attribute with name "version" and value "1.0" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
                                     BAD_CAST "1.0");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
                                     BAD_CAST "de");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Write a comment as child of ORDER */
    tmp = ConvertInput("<\xE4\xF6\xFC>", MY_ENCODING);
    rc = xmlTextWriterWriteFormatComment(writer,
		     "This is another comment with special chars: %s",
		     tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "HEADER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "X_ORDER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
                                         "%010d", 53535);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "CUSTOMER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
                                         "%d", 1010);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "NAME_1" as child of HEADER. */
    tmp = ConvertInput("M\xFCller", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Write an element named "NAME_2" as child of HEADER. */
    tmp = ConvertInput("J\xF6rg", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Close the element named HEADER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRIES" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test>");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         10);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test 2>");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         20);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Close the element named ENTRIES. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "FOOTER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "TEXT" as child of FOOTER. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
                                   BAD_CAST "This is a text.");
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Close the element named FOOTER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Here we could close the elements ORDER and EXAMPLE using the
     * function xmlTextWriterEndElement, but since we do not want to
     * write any other elements, we simply call xmlTextWriterEndDocument,
     * which will do all the work. */
    rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n");
        return;
    }

    xmlFreeTextWriter(writer);
}

/**
 * testXmlwriterMemory:
 * @file: the output file
 *
 * test the xmlWriter interface when writing to memory
 */
void
testXmlwriterMemory(const char *file)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlBufferPtr buf;
    xmlChar *tmp;
    FILE *fp;

    /* Create a new XML buffer, to which the XML document will be
     * written */
    buf = xmlBufferCreate();
    if (buf == NULL) {
        printf("testXmlwriterMemory: Error creating the xml buffer\n");
        return;
    }

    /* Create a new XmlWriter for memory, with no compression.
     * Remark: there is no compression for this kind of xmlTextWriter */
    writer = xmlNewTextWriterMemory(buf, 0);
    if (writer == NULL) {
        printf("testXmlwriterMemory: Error creating the xml writer\n");
        return;
    }

    /* Start the document with the xml default for the version,
     * encoding ISO 8859-1 and the default for the standalone
     * declaration. */
    rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n");
        return;
    }

    /* Start an element named "EXAMPLE". Since this is the first
     * element, this will be the root element of the document. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write a comment as child of EXAMPLE.
     * Please observe, that the input to the xmlTextWriter functions
     * HAS to be in UTF-8, even if the output XML is encoded
     * in iso-8859-1 */
    tmp = ConvertInput("This is a comment with special chars: <\xE4\xF6\xFC>",
                       MY_ENCODING);
    rc = xmlTextWriterWriteComment(writer, tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "ORDER" as child of EXAMPLE. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Add an attribute with name "version" and value "1.0" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
                                     BAD_CAST "1.0");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
                                     BAD_CAST "de");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Write a comment as child of ORDER */
    tmp = ConvertInput("<\xE4\xF6\xFC>", MY_ENCODING);
    rc = xmlTextWriterWriteFormatComment(writer,
		     "This is another comment with special chars: %s",
                                         tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "HEADER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "X_ORDER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
                                         "%010d", 53535);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "CUSTOMER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
                                         "%d", 1010);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "NAME_1" as child of HEADER. */
    tmp = ConvertInput("M\xFCller", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Write an element named "NAME_2" as child of HEADER. */
    tmp = ConvertInput("J\xF6rg", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);

    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Close the element named HEADER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRIES" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test>");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         10);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test 2>");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         20);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Close the element named ENTRIES. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "FOOTER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "TEXT" as child of FOOTER. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
                                   BAD_CAST "This is a text.");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Close the element named FOOTER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Here we could close the elements ORDER and EXAMPLE using the
     * function xmlTextWriterEndElement, but since we do not want to
     * write any other elements, we simply call xmlTextWriterEndDocument,
     * which will do all the work. */
    rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n");
        return;
    }

    xmlFreeTextWriter(writer);

    fp = fopen(file, "w");
    if (fp == NULL) {
        printf("testXmlwriterMemory: Error at fopen\n");
        return;
    }

    fprintf(fp, "%s", (const char *) buf->content);

    fclose(fp);

    xmlBufferFree(buf);
}

/**
 * testXmlwriterDoc:
 * @file: the output file
 *
 * test the xmlWriter interface when creating a new document
 */
void
testXmlwriterDoc(const char *file)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlChar *tmp;
    xmlDocPtr doc;


    /* Create a new XmlWriter for DOM, with no compression. */
    writer = xmlNewTextWriterDoc(&doc, 0);
    if (writer == NULL) {
        printf("testXmlwriterDoc: Error creating the xml writer\n");
        return;
    }

    /* Start the document with the xml default for the version,
     * encoding ISO 8859-1 and the default for the standalone
     * declaration. */
    rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartDocument\n");
        return;
    }

    /* Start an element named "EXAMPLE". Since this is the first
     * element, this will be the root element of the document. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write a comment as child of EXAMPLE.
     * Please observe, that the input to the xmlTextWriter functions
     * HAS to be in UTF-8, even if the output XML is encoded
     * in iso-8859-1 */
    tmp = ConvertInput("This is a comment with special chars: <\xE4\xF6\xFC>",
                       MY_ENCODING);
    rc = xmlTextWriterWriteComment(writer, tmp);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "ORDER" as child of EXAMPLE. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Add an attribute with name "version" and value "1.0" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
                                     BAD_CAST "1.0");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
                                     BAD_CAST "de");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Write a comment as child of ORDER */
    tmp = ConvertInput("<\xE4\xF6\xFC>", MY_ENCODING);
    rc = xmlTextWriterWriteFormatComment(writer,
		 "This is another comment with special chars: %s",
		                         tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "HEADER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "X_ORDER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
                                         "%010d", 53535);
    if (rc < 0) {
        printf
            ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "CUSTOMER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
                                         "%d", 1010);
    if (rc < 0) {
        printf
            ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "NAME_1" as child of HEADER. */
    tmp = ConvertInput("M\xFCller", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Write an element named "NAME_2" as child of HEADER. */
    tmp = ConvertInput("J\xF6rg", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Close the element named HEADER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRIES" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test>");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         10);
    if (rc < 0) {
        printf
            ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test 2>");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         20);
    if (rc < 0) {
        printf
            ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Close the element named ENTRIES. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "FOOTER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "TEXT" as child of FOOTER. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
                                   BAD_CAST "This is a text.");
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Close the element named FOOTER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Here we could close the elements ORDER and EXAMPLE using the
     * function xmlTextWriterEndElement, but since we do not want to
     * write any other elements, we simply call xmlTextWriterEndDocument,
     * which will do all the work. */
    rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf("testXmlwriterDoc: Error at xmlTextWriterEndDocument\n");
        return;
    }

    xmlFreeTextWriter(writer);

    xmlSaveFileEnc(file, doc, MY_ENCODING);

    xmlFreeDoc(doc);
}

/**
 * testXmlwriterTree:
 * @file: the output file
 *
 * test the xmlWriter interface when writing to a subtree
 */
void
testXmlwriterTree(const char *file)
{
    int rc;
    xmlTextWriterPtr writer;
    xmlDocPtr doc;
    xmlNodePtr node;
    xmlChar *tmp;

    /* Create a new XML DOM tree, to which the XML document will be
     * written */
    doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
    if (doc == NULL) {
        printf
            ("testXmlwriterTree: Error creating the xml document tree\n");
        return;
    }

    /* Create a new XML node, to which the XML document will be
     * appended */
    node = xmlNewDocNode(doc, NULL, BAD_CAST "EXAMPLE", NULL);
    if (node == NULL) {
        printf("testXmlwriterTree: Error creating the xml node\n");
        return;
    }

    /* Make ELEMENT the root node of the tree */
    xmlDocSetRootElement(doc, node);

    /* Create a new XmlWriter for DOM tree, with no compression. */
    writer = xmlNewTextWriterTree(doc, node, 0);
    if (writer == NULL) {
        printf("testXmlwriterTree: Error creating the xml writer\n");
        return;
    }

    /* Start the document with the xml default for the version,
     * encoding ISO 8859-1 and the default for the standalone
     * declaration. */
    rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartDocument\n");
        return;
    }

    /* Write a comment as child of EXAMPLE.
     * Please observe, that the input to the xmlTextWriter functions
     * HAS to be in UTF-8, even if the output XML is encoded
     * in iso-8859-1 */
    tmp = ConvertInput("This is a comment with special chars: <\xE4\xF6\xFC>",
                       MY_ENCODING);
    rc = xmlTextWriterWriteComment(writer, tmp);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "ORDER" as child of EXAMPLE. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Add an attribute with name "version" and value "1.0" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
                                     BAD_CAST "1.0");
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
                                     BAD_CAST "de");
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
        return;
    }

    /* Write a comment as child of ORDER */
    tmp = ConvertInput("<\xE4\xF6\xFC>", MY_ENCODING);
    rc = xmlTextWriterWriteFormatComment(writer,
			 "This is another comment with special chars: %s",
					  tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteFormatComment\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Start an element named "HEADER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "X_ORDER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
                                         "%010d", 53535);
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "CUSTOMER_ID" as child of HEADER. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
                                         "%d", 1010);
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Write an element named "NAME_1" as child of HEADER. */
    tmp = ConvertInput("M\xFCller", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Write an element named "NAME_2" as child of HEADER. */
    tmp = ConvertInput("J\xF6rg", MY_ENCODING);
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        return;
    }
    if (tmp != NULL) xmlFree(tmp);

    /* Close the element named HEADER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRIES" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test>");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         10);
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "ENTRY" as child of ENTRIES. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "ARTICLE" as child of ENTRY. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
                                   BAD_CAST "<Test 2>");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Write an element named "ENTRY_NO" as child of ENTRY. */
    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
                                         20);
    if (rc < 0) {
        printf
            ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        return;
    }

    /* Close the element named ENTRY. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Close the element named ENTRIES. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Start an element named "FOOTER" as child of ORDER. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        return;
    }

    /* Write an element named "TEXT" as child of FOOTER. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
                                   BAD_CAST "This is a text.");
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        return;
    }

    /* Close the element named FOOTER. */
    rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        return;
    }

    /* Here we could close the elements ORDER and EXAMPLE using the
     * function xmlTextWriterEndElement, but since we do not want to
     * write any other elements, we simply call xmlTextWriterEndDocument,
     * which will do all the work. */
    rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf("testXmlwriterTree: Error at xmlTextWriterEndDocument\n");
        return;
    }

    xmlFreeTextWriter(writer);

    xmlSaveFileEnc(file, doc, MY_ENCODING);

    xmlFreeDoc(doc);
}

/**
 * ConvertInput:
 * @in: string in a given encoding
 * @encoding: the encoding used
 *
 * Converts @in into UTF-8 for processing with libxml2 APIs
 *
 * Returns the converted UTF-8 string, or NULL in case of error.
 */
xmlChar *
ConvertInput(const char *in, const char *encoding)
{
    xmlChar *out;
    int ret;
    int size;
    int out_size;
    int temp;
    xmlCharEncodingHandlerPtr handler;

    if (in == 0)
        return 0;

    handler = xmlFindCharEncodingHandler(encoding);

    if (!handler) {
        printf("ConvertInput: no encoding handler found for '%s'\n",
               encoding ? encoding : "");
        return 0;
    }

    size = (int) strlen(in) + 1;
    out_size = size * 2 - 1;
    out = (unsigned char *) xmlMalloc((size_t) out_size);

    if (out != 0) {
        temp = size - 1;
        ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);
        if ((ret < 0) || (temp - size + 1)) {
            if (ret < 0) {
                printf("ConvertInput: conversion wasn't successful.\n");
            } else {
                printf
                    ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",
                     temp);
            }

            xmlFree(out);
            out = 0;
        } else {
            out = (unsigned char *) xmlRealloc(out, out_size + 1);
            out[out_size] = 0;  /*null terminating out */
        }
    } else {
        printf("ConvertInput: no mem\n");
    }

    return out;
}

#else
int main(void) {
    fprintf(stderr, "Writer or output support not compiled in\n");
    return 0;
}
#endif
doc/alt-libxml2-devel/examples/reader2000075500000017405151730335200013633 0ustar00#! /bin/sh

# reader2 - temporary wrapper script for .libs/reader2
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The reader2 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file reader2.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "reader2:reader2:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "reader2:reader2:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "reader2:reader2:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'reader2'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/parse3.c000064400000002736151730335200013723 0ustar00/**
 * section: Parsing
 * synopsis: Parse an XML document in memory to a tree and free it
 * purpose: Demonstrate the use of xmlReadMemory() to read an XML file
 *          into a tree and xmlFreeDoc() to free the resulting tree
 * usage: parse3
 * test: parse3
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

static const char *document = "<doc/>";

/**
 * example3Func:
 * @content: the content of the document
 * @length: the length in bytes
 *
 * Parse the in memory document and free the resulting tree
 */
static void
example3Func(const char *content, int length) {
    xmlDocPtr doc; /* the resulting document tree */

    /*
     * The document being in memory, it have no base per RFC 2396,
     * and the "noname.xml" argument will serve as its base.
     */
    doc = xmlReadMemory(content, length, "noname.xml", NULL, 0);
    if (doc == NULL) {
        fprintf(stderr, "Failed to parse document\n");
	return;
    }
    xmlFreeDoc(doc);
}

int main(void) {
    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    example3Func(document, 6);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
doc/alt-libxml2-devel/examples/.libs/lt-io2000075500000025670151730335210014430 0ustar00ELF>�
@8$@8@@@@hh����
�
 PP P �� hh h ���  ���DDS�td���  P�td���<<Q�tdR�tdPP P ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUj,i�_(����U��%YX��@ I��|�CE���qX* ����� 9 j�"�|S  �      libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlDocDumpFormatMemoryxmlNodeSetContentxmlNewDocxmlFreeDocxmlFreexmlNewDocNodexmlDocSetRootElementlibc.so.6__printf_chk__stack_chk_fail__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.4.30GLIBC_2.4GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64 �L�ii
,ui	6ti	BP �X �` ` � � � � � 
  � � � � � 	� 
� � � 
��H��H�� H��t��H����5z �%{ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D��UH�=0SH��(dH�%(H�D$1����1�H�1�H��H���D���H�5H��H���b���H��H���7����H�T$H��H�t$���H�T$H�5�1�����H�|$�E H������H�L$dH3%(u	H��(1�[]��������1�I��^H��H���PTL�FH�
�H�=����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�u H��t��fD�����=u u+UH�=R H��tH�=� �9����d����M ]������w������AWI��AVI��AUA��ATL�%T UH�-T SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���1.0rootcontent%s;<����p ���������p���X`�������(zRx����/D$4����FJw�?:*3$"\�����,t�����E�H�D@�
CAAD�x���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�������` �N�
XP X ���o0h
�x �0�	���o���o����o�o����oh 	 	0	@	P	`	p	�	�	GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�GA$3p11130
UGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*0
�
GA*GOW*�GA$3a1 eGA*�UGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y�a���o��$n���o��`}00��B�����		���	�	��0
0
%�XX
�hh���<����P P�X X�` `�h h�x x��      
0 Z `` �#)doc/alt-libxml2-devel/examples/.libs/xpath2000075500000026520151730335210014523 0ustar00ELF>P@�%@8@@@@hh�����   �  00 0 ���  ���DDS�td���  P�tdtttDDQ�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�>�$*���EZVd�Y���ѕ��A 
��|BE��)��qX9��.* S �`�� 9 sQ"`����J�8  r  <(  y  C   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseFilexmlXPathNewContextxmlNodeSetContentxmlCheckVersionxmlXPathFreeObjectxmlXPathEvalExpressionxmlCleanupParserxmlFreeDocxmlDocDumpxmlXPathFreeContextxmlInitParserxmlMemoryDumplibc.so.6__assert_fail__fprintf_chkstdoutstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30/opt/alt/libxml2/usr/lib640ui	�ti	��L� 0  �( ( � � � 
� � 
   (  X ` h p x � � 	� � 
� � � � � � � ��H��H�1 H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h�������%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D��AWAVAUI��ATUSH�����4�����
R�#���I�mM�eM�uH���M����M����H������H��H����H��� ���H��H���\H��L���Y���H���L�xM��twA���xoI�wHc�L�,�H�<�H������M��H��I)��DI��J�<*H����L��H�D$���I�WH�D$J�*H�1�~tH�M9�u�H�����H�����H�=1 H������H���)�������o���1�H��[]A\A]A^A_�H�
� �"�H�=N���I�}�����H�
���H�5�H�=����H�=� L��H���Y���H������H�����I�}����k���H�
q �*�H�=���H���c�����H�=J H��1�H�����H�
s�\H�5#H�=8��H�
T�[H�5H�=����H�
5�ZH�5�H�=����D��1�I��^H��H���PTL��H�
H�=X����b �H�=� H�z H9�tH�N H��t	�����H�=Q H�5J H)�H��H��H��?H�H�tH� H��t��fD�����=5 u+UH�=� H��tH�=
 �9����d����
 ]������w����H��tH��H�=� �1�H���~���PH�
��DH�5�H�=��~���f.�@��AWI��AVI��AUA��ATL�%l UH�-l SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���xpath2.cfilenamexpathExprvaluenodes->nodeTab[i]Usage: %s <xml-file> <xpath-expr> <value>
Error: wrong number of arguments.
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: unable to evaluate xpath expression "%s"
usageupdate_xpath_nodesexample4;@L���t\����\�������\�����������\zRx�x���/D$4���FJw�?:*3$"\����t���BcH�����{F�B�B �E(�A0�A8�DP2
8A0A(B BBBAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB(���0�( ��

   ���o0�h
�@ �	(�	���o���o����o�o����o0 �
�
�
 0@P`p�����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�
GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�GA$3p1113�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY��GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008QhhpY���a���o��4n���o��P}((��B		���
�
��
�
������5�
�  Q�ttD���0� �   �( (�0 0�@ @��        
0 Z8 `` @�$)doc/alt-libxml2-devel/examples/.libs/parse1000075500000015670151730335210014514 0ustar00ELF>�	@8@8@@@@hh���pp `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�td@@@<<Q�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�eeZ,�Y
��d0���,��T��A 
��|CE���qX9��* �S�c 9 �"�o�0 � � �  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlReadFilexmlCleanupParserxmlFreeDocxmlMemoryDumplibc.so.6__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib640�����L��ui	ti	`
 �
h
 P
p
 p
 � � � � � 	  � � � � � 	� 
� ��H��H�� H��t��H����5: �%; ��h�������h��������h�������h�������h�������h�������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D����t��S�
RH�����H�[1�1�H�����H��tH���v���������1�[�H�=� H�پH���-�����f.����1�I��^H��H���PTL�FH�
�H�=h���� �H�=! H� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w������AWI��AVI��AUA��ATL�%� UH�-� SL)�H���_���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���Failed to parse %s
;<���p���������p���X`�������zRx����/D$4�����FJw�?:*3$"\�ptH���eP�w
AD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB������
P
p
 �&0
`
 h
 ���o0�h
A� ����	���o���oP���o�o*���ox
 `p�����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a10�	GA$3p1113@	GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*@	�	GA*GOW*�GA$3a1�	%GA*�
GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��Aa���o** n���oPP`}����B����00�PP����p�@	@	��
�((�@@<�����`
 `
�h
 h
�p
 p
�x
 x
�� �x�    
0Z0``�)doc/alt-libxml2-devel/examples/.libs/tree1000075500000016520151730335210014334 0ustar00ELF>p	@�@8@@@@hh���

 `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�td���DDQ�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUQ6�K�4�慁�o�./��B��@ ��|CE���qX* ��S�c 9 �"o�� � � libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlReadFilexmlCleanupParserxmlFreeDocxmlDocGetRootElementlibc.so.6__printf_chk__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib640�����L��ui	
ti	`
 P
h
 
p
 p
 � � � � � 	� � � � � 	� 
� ��H��H�� H��t��H����5z �%{ ��h�������h��������h�������h�������h�������h�������h��������% D���%� D���%� D���%� D���%� D���%� D���%� D����t��U�
RSH��Q���H�{1�1����H��H��t#H�����H���H���d������Z1�[]�H�SH�5�1��"�������1�I��^H��H���PTL��H�
/H�=h����B �H�=a H�Z H9�tH�. H��t	�����H�=1 H�5* H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=> ����d����� ]������w����H��tKUH�-�SH��H���{tH�{����H�[0H��u�H��[]�@H�SH��1�������f.�D��AWI��AVI��AUA��ATL�%� UH�-� SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���node type: Element, name: %s
error: could not parse file %s
;D����x����p������`����0�������`zRx�x���/D$4����FJw�?:*3$"\X���p,t���QF�H�G \
AAEX��,�����pP�F�D x
CAAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB8���P

p
 �%�
8`
 h
 ���o0�`
@� �H��	���o���o(���o�o���ox
  0@P`p�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1��	GA$3p1113	�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�	EGA$3p1113�
5GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�
%GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o000Q``hY��@a���on���o((`}����BHH���������p�		5�88
�HHH���D���0�`
 `
�h
 h
�p
 p
�x
 x
�� �x�  
0Z``@�)doc/alt-libxml2-devel/examples/.libs/lt-reader2000075500000025670151730335210015263 0ustar00ELF>�@8$@8@@@@hh���   �(      ���  ���DDS�td���  P�td���<<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�@��$�fv.<��8�,Kjƶ�A 
��|CE���qX9�<* jw��S� �9 �"{��.O�i�0  �  �  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderHasValuexmlFreeTextReaderxmlTextReaderIsEmptyElementxmlTextReaderIsValidxmlCheckVersionxmlTextReaderConstValuexmlStrlenxmlCleanupParserxmlTextReaderNodeTypexmlTextReaderConstNamexmlTextReaderReadxmlMemoryDumpxmlTextReaderDepthxmlReaderForFilelibc.so.6__printf_chkputchar__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.6.0LIBXML2_2.5.7LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64`0ui	�ti	����������L � P  � � � � 
�    H P X ` h p x 	� 
� � � � � � � � � � ��H��H�Q H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h���������%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D���%� D���%� D����t��AW�
RAVAUATUSH��H������H�C�1�H��H�D$�~���H��H���Of�H�����H�߉Ń����e���H��H��H��H��HD�����H��I�����H��A�����H��A�����H��A���0���H��E��I��AU��D��H�5w�1��,���XZM��t@L���}���L��(~H�5\�1������M���H�5s�1�����5����
����&�������u'H�������u<����f���H��1�[]A\A]A^A_�H�L$H�=� H�1���v����H�L$H�=� H��1���U����H�L$H�=� H��1���4����f���1�I��^H��H���PTL�FH�
�H�=���� �H�=! H� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w������AWI��AVI��AUA��ATL�%L UH�-L SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���--%d %d %s %d %d %.40s...
%s : failed to parse
Unable to open %s
Document %s does not validate
;<���p8����X�������X���x���PzRx�����/D$4����0FJw�?:*3$"\���� Tt�����Q�G�B �B(�A0�A8�GP�XH`YXAPx
8C0A(B BBBAD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB ����P `x
  ���o0�h
V0 ��	��	���o���o����o�oF���o  ����� 0@P`p�����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1x�GA$3p1113�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*�
�GA*GOW*�GA$3a1�%GA*�GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��Va���oFF6n���o��p}����B�	�	��xx���0��� ��
�
%�
�((p���<���(� � � �   �0 0��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/reader2000075500000025670151730335220014647 0ustar00ELF>�@8$@8@@@@hh�����   �(      ���  ���DDS�td���  P�tdhhh<<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU{���a��y�r�-#��E_���A 
��|CE���qX9�<* jw��S� �9 �"{��.O�i�0  �  �  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderHasValuexmlFreeTextReaderxmlTextReaderIsEmptyElementxmlTextReaderIsValidxmlCheckVersionxmlTextReaderConstValuexmlStrlenxmlCleanupParserxmlTextReaderNodeTypexmlTextReaderConstNamexmlTextReaderReadxmlMemoryDumpxmlTextReaderDepthxmlReaderForFilelibc.so.6__printf_chkputchar__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.6.0LIBXML2_2.5.7LIBXML2_2.4.30/opt/alt/libxml2/usr/lib64`0ui	�ti	����������L `    � � � � 
�    H P X ` h p x 	� 
� � � � � � � � � � ��H��H�y H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h���������%� D���%� D���%� D���%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D����t��AW�
RAVAUATUSH��H������H�C�1�H��H�D$�~���H��H���Of�H�����H�߉Ń����e���H��H��H��H��HD�����H��I�����H��A�����H��A�����H��A���0���H��E��I��AU��D��H�5w�1��,���XZM��t@L���}���L��(~H�5\�1������M���H�5s�1�����5����
����&�������u'H�������u<����f���H��1�[]A\A]A^A_�H�L$H�=� H�1���v����H�L$H�=� H��1���U����H�L$H�=� H��1���4����f���1�I��^H��H���PTL�FH�
�H�=����2 �H�=Q H�J H9�tH� H��t	�����H�=! H�5 H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w������AWI��AVI��AUA��ATL�%| UH�-| SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���--%d %d %s %d %d %.40s...
%s : failed to parse
Unable to open %s
Document %s does not validate
;<���p8����X�������X���x���PzRx�����/D$4����0FJw�?:*3$"\���� Tt�����Q�G�B �B(�A0�A8�GP�XH`YXAPx
8C0A(B BBBAD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB ���`  `P
�  ���o0�h
+0 ��	��	���o���oX���o�o���o  �������� 0@P`p��GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1P�GA$3p1113�
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*�
~GA*GOW*�GA$3a1��GA*p�GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��+a���o6n���oXXp}����B�	�	��PP�pp0��� ��
�
%���
���p�hh<���(� � � �   �0 0��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/reader3000075500000025670151730335220014650 0ustar00ELF>�@8$@8@@@@hh��� 88 8 � PP P ���  ���DDS�td���  P�td���<<Q�tdR�td88 8 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�/�S/���o��k�s��A 
��|BE��)��qX9�* ��7��� 9 ("���pS\8  I  (  P  !   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderPreservePatternxmlFreeTextReaderxmlCheckVersionxmlCleanupParserxmlFreeDocxmlDocDumpxmlTextReaderCurrentDocxmlTextReaderReadxmlMemoryDumpxmlReaderForFilelibc.so.6__fprintf_chkstdoutstderr__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.3LIBXML2_2.6.0LIBXML2_2.4.30LIBXML2_2.5.0GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib64P���a���o�L}����ui	�ti	�8 �
@ �
H H � � � 	� 
�    (  x � � � � � � � � 
� � � ��H��H�� H��t��H����52 �%3 ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1�������%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D��ATL�%�UH�-�S��uH�nL�f�
R�C���1�1�H�����H��H����1�L��H�������x[f.�H���(�����t�ubH������H��H���\���H��tH�=� H������H������+�������[1�]A\�H�=� M��H��1�H���o����H�=� H��1�H���P���H������H�=_ H��1�H���)�������1�I��^H��H���PTL�FH�
�H�=������ �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=b H��tH�=� ����d����} ]������w������AWI��AVI��AUA��ATL�%L UH�-L SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���preservedtest3.xml%s : failed to parse
Unable to open %s
%s : failed add preserve pattern %s
;<h���p8������������X����x���(zRx�����/D$4��FJw�?:*3$"\�����,t@���F�H�H ��
CBAD� ���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�H����
�
H �

H8 @ ���o0xh
�`  ���	���o���ox���o�oF���oP @
P
`
p
�
�
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1

GA$3p1113�EGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*��GA*GOW*�GA$3a1
UGA*�
EGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008QhhYxx�a���oFF,n���oxx�}����B�� �

�0
0
��������HH
�XXp���<��8 8�@ @�H H�P P�` `��        
0 Z8 `` �#)doc/alt-libxml2-devel/examples/.libs/lt-reader1000075500000025670151730335220015263 0ustar00ELF>@8$@8@@@@hh���((   �  (( ( ���  ���DDS�td���  P�td���<<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�H�F��&����=v�b���A 
��|CE���qX9�'j* Ub�S� �9 "{��:��i�0  �  �  x   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderHasValuexmlFreeTextReaderxmlTextReaderIsEmptyElementxmlCheckVersionxmlTextReaderConstValuexmlStrlenxmlCleanupParserxmlTextReaderNodeTypexmlTextReaderConstNamexmlTextReaderReadxmlMemoryDumpxmlTextReaderDepthxmlReaderForFilelibc.so.6__printf_chkputchar__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.6.0LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64K0ui	�ti	������L� � �    � � � 
� � 
   P X ` h p x � 	� � 
� � � � � � � � ��H��H�� H��t��H����5
 �% ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D����t��AW�
RAVAUATUSH��H������H�C1�1�H��H�$���H��H���-fDH���������H���g���H��H��H��H��HD�����H��I�����H��A�����H��A�����H��A���B���H��E��I��AU��D��H�5Y�1��>���XZM��t@L������L��(~H�5>�1������O���H�5U�1�����7����
����(���H�߉D$����D$��u����j���H��1�[]A\A]A^A_�H�$H�=^ H��1�������H�$H�=> H��1���k����f���1�I��^H��H���PTL�FH�
�H�=8����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�e H��t��fD�����=} u+UH�=B H��tH�=^
 �	����d����U ]������w������AWI��AVI��AUA��ATL�%
 UH�-
 SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���--%d %d %s %d %d %.40s...
%s : failed to parse
Unable to open %s
;8l���l����������<���T,�������LzRx���/D$4���� FJw�?:*3$"\�Tt���Q�G�B �B(�A0�A8�GP�XH`YXAPv
8C0A(B BBBAD� ���eF�E�E �E(�H0�H8�G@n8A0A(B BBBH�����  K�
h  ���o0�h
38 �x	��	���o���o@���o�o���o( @P`p�������� 0@GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1/GA$3p1113`
eGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*`
�GA*GOW*�GA$3a10uGA*�eGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004QhhpY��3a���o4n���o@@`}����Bx	x	���00 �PP�`
`
�hh
�xxJ���<�(� � �   �( (�8 8��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/parse3000075500000015670151730335220014517 0ustar00ELF>�	@8@8@@@@hh���hh `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�td888<<Q�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU��?ǒ.UДȡ�TI���A 
��|CE���qX9�* �St 9 �"�c��0 � � �  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlCleanupParserxmlFreeDocxmlMemoryDumpxmlReadMemorylibc.so.6stderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5/opt/alt/libxml2/usr/lib640�����L��ui		`
 p
h
 0
p
 p
 � � � � �   � � � � � 	� 
� ��H��H�� H��t��H����5Z �%[ ��h�������h��������h�������h�������h�������h�������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D��H���
R�~���E1�1ɾH��H�=����H��tH���d�������z���1�H���H�
� ��H�=������@��1�I��^H��H���PTL�FH�
�H�=h����" �H�=A H�: H9�tH� H��t	�����H�= H�5
 H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�= �y����d����� ]������w������AWI��AVI��AUA��ATL�%� UH�-� SL)�H���W���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���noname.xml<doc/>Failed to parse document
;<����px�������X���XH��������zRx�����/D$4�����FJw�?:*3$"\���pt0���lHD
AD�p���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�����p
0
p
 �
�
`
 h
 ���o0�h
0� �`��	���o���o8���o�o���ox
 @P`p���GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�	GA$3p1113 	�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA* 	�	GA*GOW*�GA$3a1�	GA*�
�
GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��0a���o n���o88P}����B``���00����p� 	 	���
�

�0�88<�xx��`
 `
�h
 h
�p
 p
�x
 x
�� �x�    
0Z0``�)doc/alt-libxml2-devel/examples/.libs/io2000075500000025670151730335220014014 0ustar00ELF>�
@8$@8@@@@hh����
�
 PP P �� hh h ���  ���DDS�td���  P�td```<<Q�tdR�tdPP P ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUZ�ܐuO1ܧ�]:D��8x/�@ I��|�CE���qX* ����� 9 j�"�|S  �      libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlDocDumpFormatMemoryxmlNodeSetContentxmlNewDocxmlFreeDocxmlFreexmlNewDocNodexmlDocSetRootElementlibc.so.6__printf_chk__stack_chk_fail__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.4.30GLIBC_2.4GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib64 �L�ii
,ui	6ti	BP �X p` ` � � � � � 
  � � � � � 	� 
� � � 
��H��H� H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a�������% D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D��UH�=0SH��(dH�%(H�D$1����1�H�1�H��H���D���H�5H��H���b���H��H���7����H�T$H��H�t$���H�T$H�5�1�����H�|$�e H������H�L$dH3%(u	H��(1�[]��������1�I��^H��H���PTL�FH�
�H�=����� �H�= H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=r H��tH�=� �9����d����m ]������w������AWI��AVI��AUA��ATL�%t UH�-t SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���1.0rootcontent%s;<����p ���������p���X`�������(zRx����/D$4����FJw�?:*3$"\�����,t�����E�H�D@�
CAAD�x���eF�E�E �E(�H0�H8�G@n8A0A(B BBB������p` �N�
8P X ���o0h
ix ���	���o���o����o�o����oh �		 	0	@	P	`	p	GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1��
GA$3p1113
5GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*
�
GA*GOW*�GA$3a1EGA*�5GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Yia���o��$n���o��`}��B������������	�	��

%�88
�HH�``<����P P�X X�` `�h h�x x��      
0 Z `` �#)doc/alt-libxml2-devel/examples/.libs/reader4000075500000026520151730335220014644 0ustar00ELF>�@�%@8@@@@hh��� 00 0 � HH H ���  ���DDS�td���  P�td���DDQ�tdR�td00 0 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUu�r
	�d����]
��C�h�A 
��|CE���qX9�e* ��-v�� 9 "���SR0  ?  F     libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlFreeTextReaderxmlReaderNewFilexmlCheckVersionxmlCleanupParserxmlFreeDocxmlTextReaderCurrentDocxmlTextReaderReadxmlMemoryDumpxmlReaderForFilelibc.so.6__printf_chk__fprintf_chkstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30LIBXML2_2.5.0LIBXML2_2.6.0/opt/alt/libxml2/usr/lib64�0ui	Wti	c�Lo���~����0 p
8 0
@ @ � � � 
� �    p x � � � � � 	� � 
� � � � ��H��H�� H��t��H����5Z �%[ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!�������%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D��AUATUS�H������I��A���
R�D���I�}1�1����H��H��tuH���A��t1A�D$�I�]M�d�H�31�1�H��H�����H���UL9�u�H������H��tH�����H��1��A����,�������H����[]A\A]�I�MH�=� H��1���l�����f.���1�I��^H��H���PTL�FH�
�H�=�����" �H�=A H�: H9�tH� H��t	�����H�= H�5
 H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w����UH��SH���������f�H�������t�H���I���H����H���H��tL��u H��H��H�5t1�[�]�$���@H�=) H��H��1�[H�5�]����DH�
 ��H�=��k����f����h���f�H�
� H����[H�=�]�-���f.���AWI��AVI��AUA��ATL�%� UH�-� SL)�H���/���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���failed to obtain document
Failed to obtain URL
%s: Failed to parse
%s: Processed ok
%s: failed to create reader
;@|���t\����,�������\���������4l���|zRx�����/D$4����FJw�?:*3$"\�����@t@����A�D�D K
MFIK
FMJCKH8�,����F�B�A �A(�I0�
(C ABBAD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB<��p
0
@ ���	
�0 8 ���o0xh
�X 8���	���o���o`���o�o.���oH 
 
0
@
P
`
p
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�	�GA$3p1113�sGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY��GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004QhhYxx�a���o..,n���o``p}����B��8��	�	�

���
�
����E���
�y���D���P�0 0�8 8�@ @�H H�X X��        
0 Z0 `` @�$)doc/alt-libxml2-devel/examples/.libs/tree2000075500000025670151730335220014344 0ustar00ELF>�@8$@8@@@@hh���``   �� 00 0 ���  ���DDS�td���  P�td<<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUy�UhStc���5��/4���@ ��|CE���qXq* �K�a�� �9 ."���=S�p  ]  d  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlNewDocTextxmlCheckVersionxmlSaveFormatFileEncxmlNewDocxmlCleanupParserxmlFreeDocxmlNewPropxmlCreateIntSubsetxmlMemoryDumpxmlNewDocNodexmlDocSetRootElementxmlNewChildxmlAddChildlibc.so.6__stack_chk_fail__cxa_finalize__sprintf_chk__libc_start_main_edata__bss_start_endGLIBC_2.3.4GLIBC_2.4GLIBC_2.2.5LIBXML2_2.4.30/opt/alt/libxml2/usr/lib64@ti	uii
�ui	��L� �  `( ( � � � 	� � X ` h p x � � 
� � 
� � � � � � � ��H��H�� H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D���%m D���%e D��AWAVAUATU�SH��(H�t$�|$�
RdH�%(H��$1���H�=��t���1�H��1�H��I�����L��H��I������H�
g1�L��H�5V�h���H�
Y1�L��H�_���1�H�W1�L���m���H�
L1�L��H�Y�U���H��H�5LH��H���|���H��H�AH�5>�f���1�H�41�L������H�5DL��H�����H��H�����H��L��H�\$�v���A��H�
�H��1���A��r���1�H��1�L�����I��E��A��H�
�H�ߺ�1��?���1�1�H��L�����A��H�
!H�HE�H�5�H��A�����A��u���ul�|$H�=�~	H�D$H�x�H�ZL������L���I�������o���1�H��$dH3%(u$H��([]A\A]A^A_������A������1�I��^H��H���PTL�FH�
�H�=������ �H�= H�
 H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=�
 �Y����d����q ]������w������AWI��AVI��AUA��ATL�%L
 UH�-L
 SL)�H���W���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���noyes-1.0roottree2.dtdcontent of node 1node1node2this node has attributesnode3attributebarfoonode4node%dnode%d%doddUTF-8other way to create content (which is also a node);<`���pp����p��������X���� ���HzRx�`���/D$4��FJw�?:*3$"\���Lt����OF�B�B �B(�A0�F8�G�
8A0A(B BBBID�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB����`( �8

(   ���o0�`
�@ ����	���o���o����o�ob���o0 p
�
�
�
�
�
�
�
�
 0@P`GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a18
�GA$3p1113p%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*p�GA*GOW*�GA$3a1�5GA*�%GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o000Q``@Y���a���obb0n���o��`}����B����8
8
�`
`
�pp�pp��((
�88��<�@@ � �   �( (�0 0�@ @��      
0 Z `` �#)doc/alt-libxml2-devel/examples/.libs/lt-parse2000075500000025670151730335220015134 0ustar00ELF>p@8$@8@@@@hh����� HH H �� `` ` ���  ���DDS�td���  P�tdD
D
D
<<Q�tdR�tdHH H ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�֛�.x8)����P��A 
��|CE���qX9���* �S� �9 �"�u�c0      �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlFreeParserCtxtxmlCleanupParserxmlFreeDocxmlNewParserCtxtxmlMemoryDumpxmlCtxtReadFilelibc.so.6__fprintf_chkstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib640����L-�ui	<ti	HH PP X X � � � � 	� 
   � � � � � � 
� � � 
� ��H��H�� H��t��H����52 �%3 ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q�������%� D���%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D����t��AT�
RUSH���`���L�c�G���H��H��tc�1�L��H���]���H��H��th���t!H���4���H������g����R���[1�]A\�H�= L��1�H������H�
� �"�H�=��/����H�=� L��1�H������f.�@��1�I��^H��H���PTL�FH�
�H�=�����B �H�=a H�Z H9�tH�. H��t	�����H�=1 H�5* H)�H��H��H��?H�H�tH�� H��t��fD�����=
 u+UH�=� H��tH�=& �	����d����� ]������w������AWI��AVI��AUA��ATL�%� UH�-� SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���Failed to allocate parser context
Failed to parse %s
Failed to validate %s
;8����l�����L����,���T��������$zRx����/D$4�����FJw�?:*3$"\����,t�����Q�F�A �W
CBAD�8���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�`���PX �T	
�H P ���o00h
�p �(P�	���o���o����o�o����o` P	`	p	�	�	�	�	�	�	�	GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1	�GA$3p1113�
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*�
bGA*GOW*�GA$3a1��GA*`�GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y00�a���o��&n���o��`}PP��B((��		�@	@	���	�	���
�
E���
���[�D
D
<��
�
�H H�P P�X X�` `�p p��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/lt-reader4000075500000026520151730335230015262 0ustar00ELF>�@�%@8@@@@hh���HH 00 0 � HH H ���  ���DDS�td���  P�td���DDQ�tdR�td00 0 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUJy��B�Q���Ъ��mߕ�A 
��|CE���qX9�e* ��-v�� 9 "���SR0  ?  F     libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlFreeTextReaderxmlReaderNewFilexmlCheckVersionxmlCleanupParserxmlFreeDocxmlTextReaderCurrentDocxmlTextReaderReadxmlMemoryDumpxmlReaderForFilelibc.so.6__printf_chk__fprintf_chkstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30LIBXML2_2.5.0LIBXML2_2.6.0/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64�0ui	Wti	c�Lo���~����0 �
8 `
@ @ � � � 
� �    p x � � � � � 	� � 
� � � � ��H��H�� H��t��H����5* �%+ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!�������%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D��AUATUS�H������I��A���
R�D���I�}1�1����H��H��tuH���A��t1A�D$�I�]M�d�H�31�1�H��H�����H���UL9�u�H������H��tH�����H��1��A����,�������H����[]A\A]�I�MH�= H��1���l�����f.���1�I��^H��H���PTL�FH�
�H�=������ �H�= H�
 H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w����UH��SH���������f�H�������t�H���I���H����H���H��tL��u H��H��H�5t1�[�]�$���@H�=� H��H��1�[H�5�]����DH�
� ��H�=��k����f����h���f�H�
� H����[H�=�]�-���f.���AWI��AVI��AUA��ATL�%d UH�-d SL)�H���'���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���failed to obtain document
Failed to obtain URL
%s: Failed to parse
%s: Processed ok
%s: failed to create reader
;@|���t\����,�������\���������4l���|zRx�����/D$4����FJw�?:*3$"\�����@t@����A�D�D K
MFIK
FMJCKH8�,����F�B�A �A(�I0�
(C ABBAD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB<���
`
@ ��

(0 8 ���o0xh
�X 8���	���o���o����o�oX���oH @
P
`
p
�
�
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1
�GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�5GA$3p1113�%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004QhhYxx�a���oXX,n���o��p}����B��8�

�0
0
������E�((
�88y���D���P�0 0�8 8�@ @�H H�X X��        
0 Z0 `` @�$)doc/alt-libxml2-devel/examples/.libs/lt-io1000075500000026670151730335230014432 0ustar00ELF>
@8&@8@@@@hh����� 00 0 � HH H ���  ���DDS�td���  P�td���\\Q�tdR�td00 0 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUL���]�VH̊+�ڿ̎�A 
��|BE��)��qX9�* ��St �9 "���c��98  &  �(  -  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlCleanupParserxmlFreeDocxmlRegisterInputCallbacksxmlDocDumpxmlXIncludeProcessxmlMemoryDumpxmlReadMemorylibc.so.6exitstrlenstdoutmemcpystderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.14GLIBC_2.2.5LIBXML2_2.6.0LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64�0���>ui	I���U�Lc0 �
8 �
@ @   �� � � � 
�    (  p x � � � � 	� � � 
� � � � ��H��H�� H��t��H����5 �% ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!�������%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D���%� D���%� D��S�
R�Q���H�
�H�H�5\H�=�������x^H�� H���=���H��E1�1�H�[���W���H��H��tH���W�����~LH�=� H������H������G�������1�[�H�
� ��H�=�1�������H�
p ��H�=��
�����`���H�
I �#�H�=������9���f���1�I��^H��H���PTL�6H�
�H�=����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�e H��t��fD�����=� u+UH�=B H��tH�=~ ����d����] ]������w������H��t
�1 1�ø�����@��U��SH��H�������u7H��t2�- ��H��H��H��9�N�Hc�)�����-� H����[]��������f���H��H��t,�H�=�����u�� 1H���1��D��H��1�H��t�H�=�����������fD��AWI��AVI��AUA��ATL�%4 UH�-4 SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���<list><people>a</people><people>b</people></list>failed to register SQL handler
failed to parse the including file
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2003/XInclude">
  <p>List of people:</p>
  <xi:include href="sql:select_name_from_people"/>
</document>
sql:include.xmlXInclude processing failed
;\
x����X����(���88���x(����H����������$���X�����zRx�����/D$4���FJw�?:*3$"\�����tP���(�\���WE�C�D |
CAD�����;�����*���E��
AD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBBD���
�
@ �r

X0 8 ���o0�h
�X 8��	���o���ox���o�oH���oH P
`
p
�
�
�
�
�
�
�
�
�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1
/
GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a10
eGA$3p1113�UGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�
�
GA*FORTIFY�EGA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS�
�.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008Qhh(Y���a���oHH.n���oxx`}���B��8�

�@
@
��  ����e�XX
�hh]���\�((X�0 0�8 8�@ @�H H�X X��        
0 Z8 `l �%)doc/alt-libxml2-devel/examples/.libs/lt-parse3000075500000015670151730335230015135 0ustar00ELF>�	@8@8@@@@hh����� `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�tdhhh<<Q�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU!�c�&[{[;��|�Xl�~�e�A 
��|CE���qX9�* �St 9 �"�c��0 � � �  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlCleanupParserxmlFreeDocxmlMemoryDumpxmlReadMemorylibc.so.6stderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib640�����L��ui		`
 �
h
 `
p
 p
 � � � � �   � � � � � 	� 
� ��H��H�� H��t��H����5* �%+ ��h�������h��������h�������h�������h�������h�������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D��H���
R�~���E1�1ɾH��H�=����H��tH���d�������z���1�H���H�
| ��H�=������@��1�I��^H��H���PTL�FH�
�H�=h����� �H�= H�
 H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� �y����d����� ]������w������AWI��AVI��AUA��ATL�%� UH�-� SL)�H���W���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���noname.xml<doc/>Failed to parse document
;<����px�������X���XH��������zRx�����/D$4�����FJw�?:*3$"\���pt0���lHD
AD�p���eF�E�E �E(�H0�H8�G@n8A0A(B BBB������
`
p
 �8
(`
 h
 ���o0�h
[� ����	���o���oh���o�oD���ox
 p������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a18�	GA$3p1113P	%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*P	�	GA*GOW*�GA$3a1�	5GA*�
%GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��[a���oDD n���ohhP}����B����88�``����p�P	P	��((
�880�hh<�����`
 `
�h
 h
�p
 p
�x
 x
�� �x�    
0Z0``�)doc/alt-libxml2-devel/examples/.libs/lt-xpath2000075500000026520151730335230015142 0ustar00ELF>�@�%@8@@@@hh���   �  00 0 ���  ���DDS�td���  P�td���DDQ�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU��MK��_5
}��UE��:��A 
��|BE��)��qX9��.* S �`�� 9 sQ"`����J�8  r  <(  y  C   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseFilexmlXPathNewContextxmlNodeSetContentxmlCheckVersionxmlXPathFreeObjectxmlXPathEvalExpressionxmlCleanupParserxmlFreeDocxmlDocDumpxmlXPathFreeContextxmlInitParserxmlMemoryDumplibc.so.6__assert_fail__fprintf_chkstdoutstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib640ui	�ti	��L� `   ( ( � � � 
� � 
   (  X ` h p x � � 	� � 
� � � � � � � ��H��H� H��t��H����5R �%S ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h�������%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D���%� D���%� D���%� D���%� D��AWAVAUI��ATUSH�����4�����
R�#���I�mM�eM�uH���M����M����H������H��H����H��� ���H��H���\H��L���Y���H���L�xM��twA���xoI�wHc�L�,�H�<�H������M��H��I)��DI��J�<*H����L��H�D$���I�WH�D$J�*H�1�~tH�M9�u�H�����H�����H�= H������H���)�������o���1�H��[]A\A]A^A_�H�
� �"�H�=N���I�}�����H�
���H�5�H�=����H�=} L��H���Y���H������H�����I�}����k���H�
A �*�H�=���H���c�����H�= H��1�H�����H�
s�\H�5#H�=8��H�
T�[H�5H�=����H�
5�ZH�5�H�=����D��1�I��^H��H���PTL��H�
H�=X����2 �H�=Q H�J H9�tH� H��t	�����H�=! H�5 H)�H��H��H��?H�H�tH�� H��t��fD�����= u+UH�=� H��tH�=� �9����d����� ]������w����H��tH��H�=� �1�H���~���PH�
��DH�5�H�=��~���f.�@��AWI��AVI��AUA��ATL�%< UH�-< SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���xpath2.cfilenamexpathExprvaluenodes->nodeTab[i]Usage: %s <xml-file> <xpath-expr> <value>
Error: wrong number of arguments.
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: unable to evaluate xpath expression "%s"
usageupdate_xpath_nodesexample4;@L���t\����\�������\�����������\zRx�x���/D$4���FJw�?:*3$"\����t���BcH�����{F�B�B �E(�A0�A8�DP2
8A0A(B BBBAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB(���` ( ��

8   ���o0�h
�@ �H	X�	���o���o���o�o����o0  0@P`p��������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�
�GA$3p1113
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�EGA$3p1113�5GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�%GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008QhhpY���a���o��4n���oP}XX��BH	H	���
�
��
�
��

5�88
�PPQ���D���0� �   �( (�0 0�@ @��        
0 Z8 `` @�$)doc/alt-libxml2-devel/examples/.libs/lt-xpath1000075500000026660151730335230015146 0ustar00ELF>0@0&@8@@@@hh���88   �0 (( ( ���  ���DDS�td���  P�td���\\Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUo���:��L���GB5k�S�A K��|�BE��)��qX9�@* S2r�� 9 c"s`�����\�@  �(  �  N0  �  U   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseFilexmlXPathRegisterNsxmlXPathNewContextxmlCheckVersionxmlXPathFreeObjectxmlXPathEvalExpressionxmlCleanupParserxmlStrdupxmlFreeDocxmlFreexmlXPathFreeContextxmlInitParserxmlMemoryDumpxmlStrchrlibc.so.6__assert_fail__fprintf_chkstdoutstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64(0ui	�ti	��L�  �    � � � 	� 
�    (  0  P X ` h p x � � � 
� � � � � � � � ��H��H�� H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D��U�G�SH��H����wB�������
R�
���1҃�t$H�sH�{�V��xC�}����X���1�H��[]�H�S��H�
" �"�H�=!
�|���H�;�����H�;����f���1�I��^H��H���PTL��H�
_H�=H����� �H�=� H�� H9�tH�n H��t	�����H�=q H�5j H)�H��H��H��?H�H�tH�5 H��t��fD�����=] u+UH�= H��tH�=. ����d����5 ]������w����H��H��t[H��H�=� �1�H���Z����4H�
� �H�=��-����3H�
� H���H�=�����H�
.	�BH�5�H�=3����ff.�f���AVAUATUSH���jH���BH��H�����I��H���H���
fDH���< t���tk�=H����H�����L�h� L������H��t*�L��H��H��L�p������u7M��tL����L��H��H�������uL��� 1�[]A\A]A^�H�=� M��H��1�H�L�����L��� [�����]A\A]A^�H�
d �&�H�=����L��M [�����]A\A]A^�H�
0 �(�H�=����������e���H�
i��H�5!H�=,���H�
J��H�5H�=�r���f���AVAUATUSH����I��H��H���\�1�H���H�����������I�FH�H���J�S�L�-�L�$��O�A����H�@HH����H�HI�оH��H��1����I9�t`I�FH�H��H����D�@H�PA��u�H�H�qHH�yH�HH��tXH��L�NI�оWH��H��1��N���XZI9�u�[]A\A]A^�fDH�ѾL��H��1��#����r���fDI��I�оH��H��1�����K����H�ѾH��1�H�������&���f�[H��1�]H��A\�A]1�A^���H�
i��H�5AH�=n���H�
J��H�5"H�=4���f���AUATUSH��H���EI��H���H��I���R���H��H��ttH�����H��H����M��tL��H���&�������H��L������I��H��tYH�xH�5� ���L���s���H�����H������1�H��[]A\A]�H�=? H�پ1�H�~����������L��H��H�= �1����H���-���H�����������L��H����H�
� �*�H�=B�5���H���}���������b���H�
,�[H�5�H�=O�4���H�

�ZH�5�H�='����D��AWI��AVI��AUA��ATL�%D UH�-D SL)�H���g���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���xpath1.cxpathCtxnsListoutputResult (%d nodes):
nodes->nodeTab[i]= element node "%s:%s"
= element node "%s"
= node "%s": type %d
filenamexpathExprUsage: %s <xml-file> <xpath-expr> [<known-ns-list>]
where <known-ns-list> is a list of known namespaces
in "<prefix1>=<href1> <prefix2>=href2> ..." format
Error: unable to strdup namespaces list
Error: invalid namespaces list format
Error: unable to register NS with prefix="%s" and href="%s"
= namespace "%s"="%s" for node %s:%s
= namespace "%s"="%s" for node %s
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: failed to register namespaces list "%s"
Error: unable to evaluate xpath expression "%s"
Error: wrong number of arguments.
print_xpath_nodesregister_namespacesexecute_xpath_expressionusage;\
�������p���x`����������Pp�����`���`zRx���/D$4� FJw�?:*3$"\�t�����DO
Q`������F�B�B �A(�A0��
(A BBBAj
(F BBBAg
(F BBBAX�8����F�B�B �A(�A0��8M@R8A0F
(A BBBGi
(F IGDE8P����{F�B�A �A(�D0�
(A ABBA,���E�D�G ~
AAAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB�����  (�H
(  ���o0p
	8 ��	�	���o���oX���o�o���o( �������� 0@P`p�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1H_GA$3p1113�
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1`5GA$3p1113�%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY �
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS �.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o00<Qpp�Y	a���o8n���oXXP}���B�	�	��HH�pp �����
�
��((
�@@���\�  � � �   �( (�8 8��         
0 Z@ `` �%)doc/alt-libxml2-devel/examples/.libs/lt-tree1000075500000016520151730335230014753 0ustar00ELF>�	@�@8@@@@hh���8
8
 `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�td���DDQ�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU����0��j;<�\~W�8dF���@ ��|CE���qX* ��S�c 9 �"o�� � � libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlReadFilexmlCleanupParserxmlFreeDocxmlDocGetRootElementlibc.so.6__printf_chk__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib640�����L��ui	
ti	`
 �
h
 @
p
 p
 � � � � � 	� � � � � 	� 
� ��H��H�� H��t��H����5J �%K ��h�������h��������h�������h�������h�������h�������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D����t��U�
RSH��Q���H�{1�1����H��H��t#H�����H���H���d������Z1�[]�H�SH�5�1��"�������1�I��^H��H���PTL��H�
/H�=h���� �H�=1 H�* H9�tH�� H��t	�����H�= H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�= ����d����� ]������w����H��tKUH�-�SH��H���{tH�{����H�[0H��u�H��[]�@H�SH��1�������f.�D��AWI��AVI��AUA��ATL�%T UH�-T SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���node type: Element, name: %s
error: could not parse file %s
;D����x����p������`����0�������`zRx�x���/D$4����FJw�?:*3$"\X���p,t���QF�H�G \
AAEX��,�����pP�F�D x
CAAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB8����
@
p
 �% 
h`
 h
 ���o0�`
k� �x��	���o���oX���o�o4���ox
 P`p����GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1 �	GA$3p11130	�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�	uGA$3p1113�
eGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�
UGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o000Q``hY��ka���o44n���oXX`}����Bxx��  �@@����p�0	0	5�hh
�xxH���D�0�`
 `
�h
 h
�p
 p
�x
 x
�� �x�  
0Z``@�)doc/alt-libxml2-devel/examples/.libs/parse2000075500000025670151730335230014520 0ustar00ELF>@@8$@8@@@@hh���PP HH H �� `` ` ���  ���DDS�td���  P�td


<<Q�tdR�tdHH H ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�s�N�g���󠍜��DA�A 
��|CE���qX9���* �S� �9 �"�u�c0      �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlFreeParserCtxtxmlCleanupParserxmlFreeDocxmlNewParserCtxtxmlMemoryDumpxmlCtxtReadFilelibc.so.6__fprintf_chkstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib640����L-�ui	<ti	HH  P �X X � � � � 	� 
   � � � � � � 
� � � 
� ��H��H�� H��t��H����5b �%c ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D����t��AT�
RUSH���`���L�c�G���H��H��tc�1�L��H���]���H��H��th���t!H���4���H������g����R���[1�]A\�H�=D L��1�H������H�
% �"�H�=��/����H�= L��1�H������f.�@��1�I��^H��H���PTL�FH�
�H�=�����r �H�=� H�� H9�tH�^ H��t	�����H�=a H�5Z H)�H��H��H��?H�H�tH�% H��t��fD�����== u+UH�= H��tH�=V �	����d���� ]������w������AWI��AVI��AUA��ATL�%� UH�-� SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���Failed to allocate parser context
Failed to parse %s
Failed to validate %s
;8����l�����L����,���T��������$zRx����/D$4�����FJw�?:*3$"\����,t�����Q�F�A �W
CBAD�8���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�`��� �X �T�
�H P ���o00h
op �(�	���o���o����o�o����o`  	0	@	P	`	p	�	�	�	�	GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�oGA$3p1113`
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*`
2GA*GOW*�GA$3a1p�GA*0�GA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y00oa���o��&n���o��`}((��B�����		���	�	��`
`
E���
���[�

<�P
P
�H H�P P�X X�` `�p p��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/io1000075500000026670151730335230014015 0ustar00ELF>�@8&@8@@@@hh���PP 00 0 � HH H ���  ���DDS�td���  P�td���\\Q�tdR�td00 0 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU��:X��>�I�fJO��A=��A 
��|BE��)��qX9�* ��St �9 "���c��98  &  �(  -  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlCleanupParserxmlFreeDocxmlRegisterInputCallbacksxmlDocDumpxmlXIncludeProcessxmlMemoryDumpxmlReadMemorylibc.so.6exitstrlenstdoutmemcpystderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.14GLIBC_2.2.5LIBXML2_2.6.0LIBXML2_2.4.30/opt/alt/libxml2/usr/lib64�0���>ui	I���U�Lc0 �
8 p
@ @   �� � � � 
�    (  p x � � � � 	� � � 
� � � � ��H��H�� H��t��H����5J �%K ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!�������%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D��S�
R�Q���H�
�H�H�5\H�=�������x^H�
 H���=���H��E1�1�H�[���W���H��H��tH���W�����~LH�=� H������H������G�������1�[�H�
� ��H�=�1�������H�
� ��H�=��
�����`���H�
y �#�H�=������9���f���1�I��^H��H���PTL�6H�
�H�=����� �H�=	 H� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=r H��tH�=� ����d����� ]������w������H��t
�a 1�ø�����@��U��SH��H�������u7H��t2�-0 ��H��H��H��9�N�Hc�)�����- H����[]��������f���H��H��t,�H�=�����u�� 1H���1��D��H��1�H��t�H�=�����������fD��AWI��AVI��AUA��ATL�%d UH�-d SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���<list><people>a</people><people>b</people></list>failed to register SQL handler
failed to parse the including file
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2003/XInclude">
  <p>List of people:</p>
  <xi:include href="sql:select_name_from_people"/>
</document>
sql:include.xmlXInclude processing failed
;\
x����X����(���88���x(����H����������$���X�����zRx�����/D$4���FJw�?:*3$"\�����tP���(�\���WE�C�D |
CAD�����;�����*���E��
AD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBBD���
p
@ �r�	
(0 8 ���o0�h
�X 8��	���o���oP���o�o���oH  
0
@
P
`
p
�
�
�
�
�
�
�
�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�	�GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1
5GA$3p1113�%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�
�
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS�
�.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008Qhh(Y���a���o.n���oPP`}���B��8��	�	�

���
�
����e�((
�88]���\���X�0 0�8 8�@ @�H H�X X��        
0 Z8 `l �%)doc/alt-libxml2-devel/examples/.libs/lt-parse1000075500000015670151730335240015134 0ustar00ELF>�	@8@8@@@@hh����� `
`
 `
 �� x
x
 x
 ���  ���DDS�td���  P�tdppp<<Q�tdR�td`
`
 `
 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�3`���ۭ�V���{��06��A 
��|CE���qX9��* �S�c 9 �"�o�0 � � �  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlCheckVersionxmlReadFilexmlCleanupParserxmlFreeDocxmlMemoryDumplibc.so.6__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.0LIBXML2_2.4.30GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib640�����L��ui	ti	`
 �
h
 �
p
 p
 � � � � � 	  � � � � � 	� 
� ��H��H�q H��t��H����5
 �% ��h�������h��������h�������h�������h�������h�������h��������%� D���%� D���%� D���%} D���%u D���%m D���%e D����t��S�
RH�����H�[1�1�H�����H��tH���v���������1�[�H�=a H�پH���-�����f.����1�I��^H��H���PTL�FH�
�H�=h����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=b H��tH�=� ����d����u ]������w������AWI��AVI��AUA��ATL�%t UH�-t SL)�H���W���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���Failed to parse %s
;<���p���������p���X`�������zRx����/D$4�����FJw�?:*3$"\�ptH���eP�w
AD�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB������
�
p
 �&X
H`
 h
 ���o0�h
l� ����	���o���ox���o�oT���ox
 �������GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1X
GA$3p1113p	EGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*p	�	GA*GOW*�GA$3a1
UGA*�
EGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh�Y��la���oTT n���oxx`}����B����XX�����		p�p	p	��HH
�XX�pp<�����`
 `
�h
 h
�p
 p
�x
 x
�� �x�    
0Z0``�)doc/alt-libxml2-devel/examples/.libs/xpath1000075500000026660151730335240014532 0ustar00ELF>@0&@8@@@@hh���   �0 (( ( ���  ���DDS�td���  P�td���\\Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUq�e�K�J��"F�)Cf���A K��|�BE��)��qX9�@* S2r�� 9 c"s`�����\�@  �(  �  N0  �  U   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseFilexmlXPathRegisterNsxmlXPathNewContextxmlCheckVersionxmlXPathFreeObjectxmlXPathEvalExpressionxmlCleanupParserxmlStrdupxmlFreeDocxmlFreexmlXPathFreeContextxmlInitParserxmlMemoryDumpxmlStrchrlibc.so.6__assert_fail__fprintf_chkstdoutstderrfwrite__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.4.30/opt/alt/libxml2/usr/lib64(0ui	�ti	��L� � �    � � � 	� 
�    (  0  P X ` h p x � � � 
� � � � � � � � ��H��H�� H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D���%m D���%e D��U�G�SH��H����wB�������
R�
���1҃�t$H�sH�{�V��xC�}����X���1�H��[]�H�S��H�
R �"�H�=!
�|���H�;�����H�;����f���1�I��^H��H���PTL��H�
_H�=H����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�e H��t��fD�����=� u+UH�=B H��tH�=^ ����d����e ]������w����H��H��t[H��H�= �1�H���Z����4H�
� �H�=��-����3H�
� H���H�=�����H�
.	�BH�5�H�=3����ff.�f���AVAUATUSH���jH���BH��H�����I��H���H���
fDH���< t���tk�=H����H�����L�h� L������H��t*�L��H��H��L�p������u7M��tL����L��H��H�������uL��� 1�[]A\A]A^�H�=� M��H��1�H�L�����L��� [�����]A\A]A^�H�
� �&�H�=����L��} [�����]A\A]A^�H�
` �(�H�=����������e���H�
i��H�5!H�=,���H�
J��H�5H�=�r���f���AVAUATUSH����I��H��H���\�1�H���H�����������I�FH�H���J�S�L�-�L�$��O�A����H�@HH����H�HI�оH��H��1����I9�t`I�FH�H��H����D�@H�PA��u�H�H�qHH�yH�HH��tXH��L�NI�оWH��H��1��N���XZI9�u�[]A\A]A^�fDH�ѾL��H��1��#����r���fDI��I�оH��H��1�����K����H�ѾH��1�H�������&���f�[H��1�]H��A\�A]1�A^���H�
i��H�5AH�=n���H�
J��H�5"H�=4���f���AUATUSH��H���EI��H���H��I���R���H��H��ttH�����H��H����M��tL��H���&�������H��L������I��H��tYH�xH�5� ���L���s���H�����H������1�H��[]A\A]�H�=o H�پ1�H�~����������L��H��H�=A �1����H���-���H�����������L��H����H�
 �*�H�=B�5���H���}���������b���H�
,�[H�5�H�=O�4���H�

�ZH�5�H�='����D��AWI��AVI��AUA��ATL�%t UH�-t SL)�H���g���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���xpath1.cxpathCtxnsListoutputResult (%d nodes):
nodes->nodeTab[i]= element node "%s:%s"
= element node "%s"
= node "%s": type %d
filenamexpathExprUsage: %s <xml-file> <xpath-expr> [<known-ns-list>]
where <known-ns-list> is a list of known namespaces
in "<prefix1>=<href1> <prefix2>=href2> ..." format
Error: unable to strdup namespaces list
Error: invalid namespaces list format
Error: unable to register NS with prefix="%s" and href="%s"
= namespace "%s"="%s" for node %s:%s
= namespace "%s"="%s" for node %s
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: failed to register namespaces list "%s"
Error: unable to evaluate xpath expression "%s"
Error: wrong number of arguments.
print_xpath_nodesregister_namespacesexecute_xpath_expressionusage;\
�������p���x`����������Pp�����`���`zRx���/D$4� FJw�?:*3$"\�t�����DO
Q`������F�B�B �A(�A0��
(A BBBAj
(F BBBAg
(F BBBAX�8����F�B�B �A(�A0��8M@R8A0F
(A BBBGi
(F IGDE8P����{F�B�A �A(�D0�
(A ABBA,���E�D�G ~
AAAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB������  (�
�  ���o0p
�8 ��	x	���o���o(���o�o����o( P`p�������� 0@PGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1/GA$3p1113p
{GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a10GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�{
GA*FORTIFY��GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS�{.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o00<Qpp�Y�a���o��8n���o((P}xx�B�	�	���@@ �``�p
p
����
����\���� � �   �( (�8 8��         
0 Z@ `` �%)doc/alt-libxml2-devel/examples/.libs/lt-reader3000075500000025670151730335240015267 0ustar00ELF>
@8$@8@@@@hh���(( 88 8 � PP P ���  ���DDS�td���  P�td���<<Q�tdR�td88 8 ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU;����K����i.�A 
��|BE��)��qX9�* ��7��� 9 ("���pS\8  I  (  P  !   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderPreservePatternxmlFreeTextReaderxmlCheckVersionxmlCleanupParserxmlFreeDocxmlDocDumpxmlTextReaderCurrentDocxmlTextReaderReadxmlMemoryDumpxmlReaderForFilelibc.so.6__fprintf_chkstdoutstderr__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.6.3LIBXML2_2.6.0LIBXML2_2.4.30LIBXML2_2.5.0GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64P���a���o�L}����ui	�ti	�8 �
@ �
H H � � � 	� 
�    (  x � � � � � � � � 
� � � ��H��H�� H��t��H����5 �% ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1�������%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D��ATL�%�UH�-�S��uH�nL�f�
R�C���1�1�H�����H��H����1�L��H�������x[f.�H���(�����t�ubH������H��H���\���H��tH�=� H������H������+�������[1�]A\�H�=� M��H��1�H���o����H�=f H��1�H���P���H������H�=? H��1�H���)�������1�I��^H��H���PTL�FH�
�H�=������ �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�e H��t��fD�����=� u+UH�=B H��tH�=� ����d����] ]������w������AWI��AVI��AUA��ATL�%, UH�-, SL)�H������H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���preservedtest3.xml%s : failed to parse
Unable to open %s
%s : failed add preserve pattern %s
;<h���p8������������X����x���(zRx�����/D$4��FJw�?:*3$"\�����,t@���F�H�H ��
CBAD� ���eF�E�E �E(�H0�H8�G@n8A0A(B BBB�H����
�
H �0

h8 @ ���o0xh
�`  	 �	���o���o����o�op���oP `
p
�
�
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a10
/
GA$3p1113�eGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*��GA*GOW*�GA$3a10
uGA*�
eGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o008QhhYxx�a���opp,n���o���}  ��B		 �0
0
�P
P
��  ������hh
�xxp���<�((�8 8�@ @�H H�P P�` `��        
0 Z8 `` �#)doc/alt-libxml2-devel/examples/.libs/reader1000075500000025670151730335240014650 0ustar00ELF>�@8$@8@@@@hh���   �  (( ( ���  ���DDS�td���  P�td���<<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU��
�PQ+��
%?��A 
��|CE���qX9�'j* Ub�S� �9 "{��:��i�0  �  �  x   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlTextReaderHasValuexmlFreeTextReaderxmlTextReaderIsEmptyElementxmlCheckVersionxmlTextReaderConstValuexmlStrlenxmlCleanupParserxmlTextReaderNodeTypexmlTextReaderConstNamexmlTextReaderReadxmlMemoryDumpxmlTextReaderDepthxmlReaderForFilelibc.so.6__printf_chkputchar__fprintf_chkstderr__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.2.5GLIBC_2.3.4LIBXML2_2.6.0LIBXML2_2.4.30/opt/alt/libxml2/usr/lib64K0ui	�ti	������L� � �    � � � 
� � 
   P X ` h p x � 	� � 
� � � � � � � � ��H��H�� H��t��H����5* �%+ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������% D���%
 D���% D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D����t��AW�
RAVAUATUSH��H������H�C1�1�H��H�$���H��H���-fDH���������H���g���H��H��H��H��HD�����H��I�����H��A�����H��A�����H��A���B���H��E��I��AU��D��H�5Y�1��>���XZM��t@L������L��(~H�5>�1������O���H�5U�1�����7����
����(���H�߉D$����D$��u����j���H��1�[]A\A]A^A_�H�$H�=~ H��1�������H�$H�=^ H��1���k����f���1�I��^H��H���PTL�FH�
�H�=8����� �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=b H��tH�=~
 �	����d����u ]������w������AWI��AVI��AUA��ATL�%$
 UH�-$
 SL)�H�����H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���--%d %d %s %d %d %.40s...
%s : failed to parse
Unable to open %s
;8l���l����������<���T,�������LzRx���/D$4���� FJw�?:*3$"\�Tt���Q�G�B �B(�A0�A8�GP�XH`YXAPv
8C0A(B BBBAD� ���eF�E�E �E(�H0�H8�G@n8A0A(B BBBH�����  K��

H  ���o0�h
8 �P	x�	���o���o���o�o����o(  0@P`p�������� GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�
GA$3p1113@
EGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*@
�GA*GOW*�GA$3a1UGA*�EGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004QhhpY��a���o��4n���o`}xx��BP	P	���
�
� �00�@
@
�HH
�XXJ���<���(� � �   �( (�8 8��        
0 Z0 `` �#)doc/alt-libxml2-devel/examples/.libs/lt-parse4000075500000026520151730335240015133 0ustar00ELF>�
@�%@8@@@@hh����� (( ( � @@ @ ���  ���DDS�td���  P�td���DDQ�tdR�td(( ( ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�a�g���"I����j��4�A 
��|CE���qX9��* �a� 9 "��	��S�qC8  0  7  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseChunkxmlCheckVersionxmlFreeParserCtxtxmlCleanupParserxmlFreeDocxmlCreatePushParserCtxtxmlMemoryDumplibc.so.6fopen__stack_chk_fail__fprintf_chkfclosestderrfwritefread__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.4.30GLIBC_2.4GLIBC_2.2.5GLIBC_2.3.4/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64 �LH�ii
Wui	ati	m( �0 @8 8 � � � � � 	   h p x � � 	� 
� � � 
� � � � � ��H��H�� H��t��H����5" �%# ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
���������%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D���%� D���%� D���%� D���%� D��AUATUSH��dH�%(H�D$1����tH�T$dH3%(�^H��[]A\A]�H��
R���H�{H�5�����H�� H����L�cH�\$H�������M��H��1�1�����H��H��u��D1ɉ�H��H������H�������1�H��H�����D�mH��H�]����E��tdH���V���H�=/ ��������p���1�����H�= L��1�H������H�KH�=� H��1�������H�=� L��1�H������z���H�
� �"�H�=��K����`����������1�I��^H��H���PTL�fH�
�H�=8���� �H�=1 H�* H9�tH�� H��t	�����H�= H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w����H��H�
� �����H����AWI��AVI��AUA��ATL�%\ UH�-\ SL)�H���'���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���rbFailed to parse %s
Failed to create parser context !
;D����x���������� ���`����0�������XzRx�����/D$40����FJw�?:*3$"\�����tP���DZ<������F�B�A �A(�D@r
(A ABBAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB@����@8 �y

(( 0 ���o0�h
�P P���	���o���o����o�oP���o@ @
P
`
p
�
�
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1
�
GA$3p1113�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�
5GA$3p1113�%GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh(Y���a���oPP.n���o��`}����B��P�

�0
0
��  ��%�((
�88H���D���(�( (�0 0�8 8�@ @�P P��        
0 Z8 `` @�$)doc/alt-libxml2-devel/examples/.libs/lt-testWriter000075500000046660151730335240016120 0ustar00ELF>�@0F@8@@@@hh����8�8 �<�< �< t� �<�< �< ���  ���DDS�td���  P�tdh5h5h5ddQ�tdR�td�<�< �< pp/lib64/ld-linux-x86-64.so.2GNU�GNUGNU��������D7?���&�@ @I&+�\�XX�<���|�CE���qXf��* ��,���PQkbz �9 �"���7������:&��Sv @ !0@ �H@ �8@ �@ �@ libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlSaveFileEncxmlTextWriterEndElementxmlTextWriterWriteAttributexmlTextWriterEndDocumentxmlTextWriterWriteElementxmlBufferFreexmlTextWriterWriteFormatElementxmlCheckVersionxmlNewTextWriterTreexmlNewDocxmlCleanupParserxmlNewTextWriterFilenamexmlFindCharEncodingHandlerxmlFreeDocxmlMallocxmlNewTextWriterDocxmlTextWriterStartDocumentxmlTextWriterWriteFormatCommentxmlFreeTextWriterxmlFreexmlBufferCreatexmlMemoryDumpxmlTextWriterWriteCommentxmlReallocxmlNewDocNodexmlNewTextWriterMemoryxmlDocSetRootElementxmlTextWriterStartElementlibc.so.6__printf_chkfopen__stack_chk_failstrlenfputsfclose__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5LIBXML2_2.4.30LIBXML2_2.6.3LIBXML2_2.6.0/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64�@ii
�ti	ui	�L���,���:�< ��< p�< �< �? �? 
�? �? �?  @ &0@ '8@ )�> �> �> �> �> �> ? ? 	? ?  ? 
(? 0? 8? @? H? P? X? `? h? p? x? �? �? �? �? �? �?  �? !�? "�? #�? $�? %��H��H��/ H��t��H����5z. �%{. ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h��Q������h��A������h��1������h��!������h��������h��������h������h ��������%e, D���%], D���%U, D���%M, D���%E, D���%=, D���%5, D���%-, D���%%, D���%, D���%, D���%
, D���%, D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%}+ D���%u+ D���%m+ D���%e+ D��H���
R�^���H�=��H�=���H�=��:H�=���i����$���1�H���f.���1�I��^H��H���PTL�FH�
�H�=x�����* �H�=+ H��* H9�tH��* H��t	�����H�=�* H�5�* H)�H��H��H��?H�H�tH��* H��t��fD�����=�* u+UH�=r* H��tH�=' ����d�����* ]������w������AVAUATUSH��dH�%(H�D$1�H����H��H��I�����H��H����H���5���D�hI��C�|-��<$Hc���) I��H����D�t$H�L$H��H��H��S��xw�T$��D)��uI�$L��pHc���) H��Hc$�H�L$dH3%(H����H��[]A\A]A^��H�5�1����L��1�z) �H�=�������f�1��@M��H�<�LD�H�5f1�L������s����H�==1��z����Y��������U1�SH���o���H����1�1�H�H��H��������@H�5
H��������H�5�H�=C�>���H��H��H���������HH��t	H���( H�5�H���������H��H�5�H���]�������H��H�5�H���?�������H�5aH�=����H�5]H��H��H��1��]�������H��t	H���' H�5XH���������01���H��H�>H�5=��������1���H��H�*H�5&�������vH�5�H�=����H�5H��H��H��������.H��t	H��`' H�5�H�=�����H�5�H��H��H���p�������H��t	H��"' H���������H�5�H���+������CH�5�H���������,H��H�5�H����������1��
H��H�-H�5l������yH���������H�53H���������H�:H�5"H��������1��H��H��H�5�w������H���������/H���������H�5�H���0�����xLH��H�5�H���&�������H����������H���f�������XH��[]����H��H�=�[]���fDH��H�=�[]���fDH��H�=u[]����fDH��H�=5[]���fDH��H�=[]���fDH��H�=[]���fDH��H�=�[]�n���fDH��H�=m[]�V���fDH��H�=[]�>���ZH�=>[]�/���ff.�@��AUI��ATUSH������H�=KH����1�H��H���m���H��H����H��1�H��
1��.���H�=����H�5�
H���������H�5r
H�=�����H��H��I�����H�=����?M��t	L��$ H�5G
H���+������3H�6
H�53
H���������5H�$
H�5 
H��������H�5�H�=
�4���H��H�5�H��I��1�����H�=�����M��t	L��x# H�5�H���������1���H��H��H�5��|�������1���H��H��H�5��W�������H�59H�=����H�5�H��H��I���'������oM��t	L���" H�5�H�=`�N���H�5YH��H��I�������1M��t	L���" H���{������#H�5%H�������H�5H�������H�H�5H�������1��
H��H��H�5��Z�������H�������H�5�H���#���+H��H�5�H������]1��H��H�<H�5{�����(H������8H������(H�5YH�������H�IH�5RH�������H���;����H�����H�=,��xWH���x�L��H�5��H�=BH��H��t1H�}H���~�H������XH��[]A\A]���H�=�H��[]A\A]�*�f.�H��H�=
[]A\A]�
�f.�H��H�=][]A\A]���f.�H�=���H�=���H�=�{���@��AT1�I��USH��dH�%(H�D$1�H����H����1�1�H�D	H��H�������pH�55	H���!���)H�5	H�=k�f���H��H��H���(���`H��t	H��� H�5�H��������H��H�5�H�������H��H�5�H���g����H�5�H�=����H�5�H��H��H��1�����H��t	H��' H�5�H���@���H1���H��H�fH�5e�+����1���H��H�RH�5N����~H�5�H�=?�;�H�5:H��H��H�������>H��t	H��� H�5�H�=��H�5H��H��H������H��t	H��J H���*���"H�5�H���S���[H�5�H���<���DH��H�5�H���.����1��
H��H�UH�5��	����H�������H�5[H���������H�bH�5JH��������,1��H��H��H�5*����H���?���7H���/���'H�5H���X���xdH��H�5H���N�����H���������H�������H���.�H�4$L��H���H�<$���H�=y
��H�D$dH3%(��H��[]A\��H�=
�����f�H�=�
����f�H�=�����f�H�=Q
���f�H�=1���f�H�=�
���{����H�=�
�|��c����H�=)�d��K������H�=K�N��5���f���AUI��H�=ATUSH�����H�=LH����1�H��1�H��H���-�H��H����H��H���V�H��H��1����H�=jH��H���mH��1�H��1���H�=|���KH�5nH�=���H��H��I����H�=����M��t	L�� H�5CH���'����/H�2H�5/H���������H� H�5H��������H�5�H�=�0�H��H�5�H��I��1����H�=�����M��t	L��t H�5�H��������1���H��H��H�5��x�����1���H��H��H�5��S����kH�55H�=���H�5�H��H��I���#����KM��t	L��� H�5�H�=\�J�H�5UH��H��I��������
M��t	L��� H���w�����H�5!H��������H�5H��������H�H�5H���{�����1��
H��H��H�5��V����nH�������~H�5�H�������'H��H�5�H�������91��H��H�8H�5w������H�������H���|����H�5UH��������H�EH�5NH��������H���7�����H�����H�=0
��x3H���t�L��H��H�H�B�XH��[]A\A]���H�=�
H��[]A\A]�J�f.�H��H�=�[]A\A]�*�f.�H��H�=U[]A\A]�
�f.�H�=���H�=��H�=A�{���@��AWI��AVI��AUA��ATL�%� UH�-� SL)�H���'�H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���ConvertInput: no memISO-8859-1EXAMPLEORDER1.0versiondexml:lang<�>HEADER%010dX_ORDER_ID%dCUSTOMER_IDM�llerNAME_1J�rgNAME_2ENTRIESENTRY<Test>ARTICLEENTRY_NO<Test 2>FOOTERThis is a text.TEXTwwriter1.tmpwriter2.tmpwriter3.tmpwriter4.tmpConvertInput: no encoding handler found for '%s'
ConvertInput: conversion wasn't successful.ConvertInput: conversion wasn't successful. converted: %i octets.
testXmlwriterFilename: Error creating the xml writertestXmlwriterFilename: Error at xmlTextWriterStartDocumenttestXmlwriterFilename: Error at xmlTextWriterStartElementThis is a comment with special chars: <�>testXmlwriterFilename: Error at xmlTextWriterWriteCommenttestXmlwriterFilename: Error at xmlTextWriterWriteAttributeThis is another comment with special chars: %stestXmlwriterFilename: Error at xmlTextWriterWriteFormatCommenttestXmlwriterFilename: Error at xmlTextWriterWriteFormatElementtestXmlwriterFilename: Error at xmlTextWriterWriteElementtestXmlwriterFilename: Error at xmlTextWriterEndElementtestXmlwriterFilename: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error creating the xml buffertestXmlwriterMemory: Error creating the xml writertestXmlwriterMemory: Error at xmlTextWriterStartDocumenttestXmlwriterMemory: Error at xmlTextWriterStartElementtestXmlwriterMemory: Error at xmlTextWriterWriteCommenttestXmlwriterMemory: Error at xmlTextWriterWriteAttributetestXmlwriterMemory: Error at xmlTextWriterWriteFormatCommenttestXmlwriterMemory: Error at xmlTextWriterWriteFormatElementtestXmlwriterMemory: Error at xmlTextWriterWriteElementtestXmlwriterMemory: Error at xmlTextWriterEndElementtestXmlwriterMemory: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error at fopentestXmlwriterDoc: Error creating the xml writertestXmlwriterDoc: Error at xmlTextWriterStartDocumenttestXmlwriterDoc: Error at xmlTextWriterStartElementtestXmlwriterDoc: Error at xmlTextWriterWriteCommenttestXmlwriterDoc: Error at xmlTextWriterWriteAttributetestXmlwriterDoc: Error at xmlTextWriterWriteFormatCommenttestXmlwriterDoc: Error at xmlTextWriterWriteFormatElementtestXmlwriterDoc: Error at xmlTextWriterWriteElementtestXmlwriterDoc: Error at xmlTextWriterEndElementtestXmlwriterDoc: Error at xmlTextWriterEndDocumenttestXmlwriterTree: Error creating the xml document treetestXmlwriterTree: Error creating the xml nodetestXmlwriterTree: Error creating the xml writertestXmlwriterTree: Error at xmlTextWriterStartDocumenttestXmlwriterTree: Error at xmlTextWriterWriteCommenttestXmlwriterTree: Error at xmlTextWriterStartElementtestXmlwriterTree: Error at xmlTextWriterWriteAttributetestXmlwriterTree: Error at xmlTextWriterWriteFormatCommenttestXmlwriterTree: Error at xmlTextWriterWriteFormatElementtestXmlwriterTree: Error at xmlTextWriterWriteElementtestXmlwriterTree: Error at xmlTextWriterEndElementtestXmlwriterTree: Error at xmlTextWriterEndDocument;d�����������h���X������x�4��hX���@zRx����/D$48�� FJw�?:*3$"\0��@tx��`F�B�B �A(�A0�D@�
0A(A BBBI����AE�C�D G
DAHD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAEAHAp\@�lF�E�A �A(�D0�
(D ABBLK
(A ABBOD
(H ABBOD
(H ABBO0�<�gF�F�A �D0�
 AABHpx�lF�L�A �A(�D0�
(D ABBHK
(A ABBOD
(H ABBOD
(H ABBOx$��SHJD�X�eF�E�E �E(�H0�H8�G@n8A0A(B BBB����p�< �H
8)�< �< ���o0�p
��> 
�	���o���ox���o�o���o�< P`p�������� 0@P`p�������� 0@PGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�GA$3p1113p�(GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1E)GA$3p1113�(5)GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY��(
GA*FORTIFY�(%)GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS��(.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o00<Qpp Y���a���oXn���oxx�}���B

��@@ �``�pp��8)8)
�H)H) �h5h5d��5�5���< �<��< �<��< �<��< �<��> �>H�@ @ @ @( 
0@ZH@``@�E)doc/alt-libxml2-devel/examples/.libs/lt-tree2000075500000025670151730335240014763 0ustar00ELF>�@8$@8@@@@hh�����   �� 00 0 ���  ���DDS�td���  P�td   <<Q�tdR�td  ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNUŎI�W���sF9Þ�$v�@ ��|CE���qXq* �K�a�� �9 ."���=S�p  ]  d  libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlNewDocTextxmlCheckVersionxmlSaveFormatFileEncxmlNewDocxmlCleanupParserxmlFreeDocxmlNewPropxmlCreateIntSubsetxmlMemoryDumpxmlNewDocNodexmlDocSetRootElementxmlNewChildxmlAddChildlibc.so.6__stack_chk_fail__cxa_finalize__sprintf_chk__libc_start_main_edata__bss_start_endGLIBC_2.3.4GLIBC_2.4GLIBC_2.2.5LIBXML2_2.4.30/builddir/build/BUILD/libxml2-2.10.2/.libs:/opt/alt/libxml2/usr/lib64@ti	uii
�ui	��L� �  �( ( � � � 	� � X ` h p x � � 
� � 
� � � � � � � ��H��H�i H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D��AWAVAUATU�SH��(H�t$�|$�
RdH�%(H��$1���H�=��t���1�H��1�H��I�����L��H��I������H�
g1�L��H�5V�h���H�
Y1�L��H�_���1�H�W1�L���m���H�
L1�L��H�Y�U���H��H�5LH��H���|���H��H�AH�5>�f���1�H�41�L������H�5DL��H�����H��H�����H��L��H�\$�v���A��H�
�H��1���A��r���1�H��1�L�����I��E��A��H�
�H�ߺ�1��?���1�1�H��L�����A��H�
!H�HE�H�5�H��A�����A��u���ul�|$H�=�~	H�D$H�x�H�ZL������L���I�������o���1�H��$dH3%(u$H��([]A\A]A^A_������A������1�I��^H��H���PTL�FH�
�H�=������ �H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=y u+UH�=b H��tH�=�
 �Y����d����Q ]������w������AWI��AVI��AUA��ATL�%,
 UH�-,
 SL)�H���_���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���noyes-1.0roottree2.dtdcontent of node 1node1node2this node has attributesnode3attributebarfoonode4node%dnode%d%doddUTF-8other way to create content (which is also a node);<`���pp����p��������X���� ���HzRx�`���/D$4��FJw�?:*3$"\���Lt����OF�B�B �B(�A0�F8�G�
8A0A(B BBBID�����eF�E�E �E(�H0�H8�G@n8A0A(B BBB�����( �`

H   ���o0�`
�@ �� �	���o���o����o�o����o0 �
�
�
�
�
�
�
 0@P`p�GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1`
GA$3p1113�EGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*��GA*GOW*�GA$3a1UGA*�EGA*GOW*
GA*FORTIFYGA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o000Q``@Y���a���o��0n���o��`}  ��B����`
`
��
�
��������HH
�XX��  <�`` � �   �( (�0 0�@ @��      
0 Z `` �#)doc/alt-libxml2-devel/examples/.libs/testWriter000075500000046660151730335240015503 0ustar00ELF>�@0F@8@@@@hh����8�8 �<�< �< t� �<�< �< ���  ���DDS�td���  P�td858585ddQ�tdR�td�<�< �< pp/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�ݿ�"%
�Y_��b�&�@ @I&+�\�XX�<���|�CE���qXf��* ��,���PQkbz �9 �"���7������:&��Sv @ !0@ �H@ �8@ �@ �@ libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlSaveFileEncxmlTextWriterEndElementxmlTextWriterWriteAttributexmlTextWriterEndDocumentxmlTextWriterWriteElementxmlBufferFreexmlTextWriterWriteFormatElementxmlCheckVersionxmlNewTextWriterTreexmlNewDocxmlCleanupParserxmlNewTextWriterFilenamexmlFindCharEncodingHandlerxmlFreeDocxmlMallocxmlNewTextWriterDocxmlTextWriterStartDocumentxmlTextWriterWriteFormatCommentxmlFreeTextWriterxmlFreexmlBufferCreatexmlMemoryDumpxmlTextWriterWriteCommentxmlReallocxmlNewDocNodexmlNewTextWriterMemoryxmlDocSetRootElementxmlTextWriterStartElementlibc.so.6__printf_chkfopen__stack_chk_failstrlenfputsfclose__cxa_finalize__libc_start_main_edata__bss_start_endGLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5LIBXML2_2.4.30LIBXML2_2.6.3LIBXML2_2.6.0/opt/alt/libxml2/usr/lib64�@ii
�ti	ui	�L���,���:�< ��< @�< �< �? �? 
�? �? �?  @ &0@ '8@ )�> �> �> �> �> �> ? ? 	? ?  ? 
(? 0? 8? @? H? P? X? `? h? p? x? �? �? �? �? �? �?  �? !�? "�? #�? $�? %��H��H��/ H��t��H����5�. �%�. ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h��Q������h��A������h��1������h��!������h��������h��������h������h ��������%�, D���%�, D���%�, D���%}, D���%u, D���%m, D���%e, D���%], D���%U, D���%M, D���%E, D���%=, D���%5, D���%-, D���%%, D���%, D���%, D���%
, D���%, D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D���%�+ D��H���
R�^���H�=��H�=���H�=��:H�=���i����$���1�H���f.���1�I��^H��H���PTL�FH�
�H�=x����+ �H�=1+ H�*+ H9�tH��* H��t	�����H�=+ H�5�* H)�H��H��H��?H�H�tH��* H��t��fD�����=�* u+UH�=�* H��tH�=>' ����d�����* ]������w������AVAUATUSH��dH�%(H�D$1�H����H��H��I�����H��H����H���5���D�hI��C�|-��<$Hc��-* I��H����D�t$H�L$H��H��H��S��xw�T$��D)��uI�$L��pHc���) H��Hc$�H�L$dH3%(H����H��[]A\A]A^��H�5�1����L��1��) �H�=�������f�1��@M��H�<�LD�H�5f1�L������s����H�==1��z����Y��������U1�SH���o���H����1�1�H�H��H��������@H�5
H��������H�5�H�=C�>���H��H��H���������HH��t	H���( H�5�H���������H��H�5�H���]�������H��H�5�H���?�������H�5aH�=����H�5]H��H��H��1��]�������H��t	H��/( H�5XH���������01���H��H�>H�5=��������1���H��H�*H�5&�������vH�5�H�=����H�5H��H��H��������.H��t	H���' H�5�H�=�����H�5�H��H��H���p�������H��t	H��R' H���������H�5�H���+������CH�5�H���������,H��H�5�H����������1��
H��H�-H�5l������yH���������H�53H���������H�:H�5"H��������1��H��H��H�5�w������H���������/H���������H�5�H���0�����xLH��H�5�H���&�������H����������H���f�������XH��[]����H��H�=�[]���fDH��H�=�[]���fDH��H�=u[]����fDH��H�=5[]���fDH��H�=[]���fDH��H�=[]���fDH��H�=�[]�n���fDH��H�=m[]�V���fDH��H�=[]�>���ZH�=>[]�/���ff.�@��AUI��ATUSH������H�=KH����1�H��H���m���H��H����H��1�H��
1��.���H�=����H�5�
H���������H�5r
H�=�����H��H��I�����H�=����?M��t	L��B$ H�5G
H���+������3H�6
H�53
H���������5H�$
H�5 
H��������H�5�H�=
�4���H��H�5�H��I��1�����H�=�����M��t	L���# H�5�H���������1���H��H��H�5��|�������1���H��H��H�5��W�������H�59H�=����H�5�H��H��I���'������oM��t	L��	# H�5�H�=`�N���H�5YH��H��I�������1M��t	L���" H���{������#H�5%H�������H�5H�������H�H�5H�������1��
H��H��H�5��Z�������H�������H�5�H���#���+H��H�5�H������]1��H��H�<H�5{�����(H������8H������(H�5YH�������H�IH�5RH�������H���;����H�����H�=,��xWH���x�L��H�5��H�=BH��H��t1H�}H���~�H������XH��[]A\A]���H�=�H��[]A\A]�*�f.�H��H�=
[]A\A]�
�f.�H��H�=][]A\A]���f.�H�=���H�=���H�=�{���@��AT1�I��USH��dH�%(H�D$1�H����H����1�1�H�D	H��H�������pH�55	H���!���)H�5	H�=k�f���H��H��H���(���`H��t	H��� H�5�H��������H��H�5�H�������H��H�5�H���g����H�5�H�=����H�5�H��H��H��1�����H��t	H��W H�5�H���@���H1���H��H�fH�5e�+����1���H��H�RH�5N����~H�5�H�=?�;�H�5:H��H��H�������>H��t	H��� H�5�H�=��H�5H��H��H������H��t	H��z H���*���"H�5�H���S���[H�5�H���<���DH��H�5�H���.����1��
H��H�UH�5��	����H�������H�5[H���������H�bH�5JH��������,1��H��H��H�5*����H���?���7H���/���'H�5H���X���xdH��H�5H���N�����H���������H�������H���.�H�4$L��H���H�<$���H�=y
��H�D$dH3%(��H��[]A\��H�=
�����f�H�=�
����f�H�=�����f�H�=Q
���f�H�=1���f�H�=�
���{����H�=�
�|��c����H�=)�d��K������H�=K�N��5���f���AUI��H�=ATUSH�����H�=LH����1�H��1�H��H���-�H��H����H��H���V�H��H��1����H�=jH��H���mH��1�H��1���H�=|���KH�5nH�=���H��H��I����H�=����M��t	L��> H�5CH���'����/H�2H�5/H���������H� H�5H��������H�5�H�=�0�H��H�5�H��I��1����H�=�����M��t	L��� H�5�H��������1���H��H��H�5��x�����1���H��H��H�5��S����kH�55H�=���H�5�H��H��I���#����KM��t	L�� H�5�H�=\�J�H�5UH��H��I��������
M��t	L��� H���w�����H�5!H��������H�5H��������H�H�5H���{�����1��
H��H��H�5��V����nH�������~H�5�H�������'H��H�5�H�������91��H��H�8H�5w������H�������H���|����H�5UH��������H�EH�5NH��������H���7�����H�����H�=0
��x3H���t�L��H��H�H�B�XH��[]A\A]���H�=�
H��[]A\A]�J�f.�H��H�=�[]A\A]�*�f.�H��H�=U[]A\A]�
�f.�H�=���H�=��H�=A�{���@��AWI��AVI��AUA��ATL�%� UH�-� SL)�H���/�H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���ConvertInput: no memISO-8859-1EXAMPLEORDER1.0versiondexml:lang<�>HEADER%010dX_ORDER_ID%dCUSTOMER_IDM�llerNAME_1J�rgNAME_2ENTRIESENTRY<Test>ARTICLEENTRY_NO<Test 2>FOOTERThis is a text.TEXTwwriter1.tmpwriter2.tmpwriter3.tmpwriter4.tmpConvertInput: no encoding handler found for '%s'
ConvertInput: conversion wasn't successful.ConvertInput: conversion wasn't successful. converted: %i octets.
testXmlwriterFilename: Error creating the xml writertestXmlwriterFilename: Error at xmlTextWriterStartDocumenttestXmlwriterFilename: Error at xmlTextWriterStartElementThis is a comment with special chars: <�>testXmlwriterFilename: Error at xmlTextWriterWriteCommenttestXmlwriterFilename: Error at xmlTextWriterWriteAttributeThis is another comment with special chars: %stestXmlwriterFilename: Error at xmlTextWriterWriteFormatCommenttestXmlwriterFilename: Error at xmlTextWriterWriteFormatElementtestXmlwriterFilename: Error at xmlTextWriterWriteElementtestXmlwriterFilename: Error at xmlTextWriterEndElementtestXmlwriterFilename: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error creating the xml buffertestXmlwriterMemory: Error creating the xml writertestXmlwriterMemory: Error at xmlTextWriterStartDocumenttestXmlwriterMemory: Error at xmlTextWriterStartElementtestXmlwriterMemory: Error at xmlTextWriterWriteCommenttestXmlwriterMemory: Error at xmlTextWriterWriteAttributetestXmlwriterMemory: Error at xmlTextWriterWriteFormatCommenttestXmlwriterMemory: Error at xmlTextWriterWriteFormatElementtestXmlwriterMemory: Error at xmlTextWriterWriteElementtestXmlwriterMemory: Error at xmlTextWriterEndElementtestXmlwriterMemory: Error at xmlTextWriterEndDocumenttestXmlwriterMemory: Error at fopentestXmlwriterDoc: Error creating the xml writertestXmlwriterDoc: Error at xmlTextWriterStartDocumenttestXmlwriterDoc: Error at xmlTextWriterStartElementtestXmlwriterDoc: Error at xmlTextWriterWriteCommenttestXmlwriterDoc: Error at xmlTextWriterWriteAttributetestXmlwriterDoc: Error at xmlTextWriterWriteFormatCommenttestXmlwriterDoc: Error at xmlTextWriterWriteFormatElementtestXmlwriterDoc: Error at xmlTextWriterWriteElementtestXmlwriterDoc: Error at xmlTextWriterEndElementtestXmlwriterDoc: Error at xmlTextWriterEndDocumenttestXmlwriterTree: Error creating the xml document treetestXmlwriterTree: Error creating the xml nodetestXmlwriterTree: Error creating the xml writertestXmlwriterTree: Error at xmlTextWriterStartDocumenttestXmlwriterTree: Error at xmlTextWriterWriteCommenttestXmlwriterTree: Error at xmlTextWriterStartElementtestXmlwriterTree: Error at xmlTextWriterWriteAttributetestXmlwriterTree: Error at xmlTextWriterWriteFormatCommenttestXmlwriterTree: Error at xmlTextWriterWriteFormatElementtestXmlwriterTree: Error at xmlTextWriterWriteElementtestXmlwriterTree: Error at xmlTextWriterEndElementtestXmlwriterTree: Error at xmlTextWriterEndDocument;d�����������h���X������x�4��hX���@zRx����/D$48�� FJw�?:*3$"\0��@tx��`F�B�B �A(�A0�D@�
0A(A BBBI����AE�C�D G
DAHD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAKD
HAEAHAp\@�lF�E�A �A(�D0�
(D ABBLK
(A ABBOD
(H ABBOD
(H ABBO0�<�gF�F�A �D0�
 AABHpx�lF�L�A �A(�D0�
(D ABBHK
(A ABBOD
(H ABBOD
(H ABBOx$��SHJD�X�eF�E�E �E(�H0�H8�G@n8A0A(B BBB����@�< �H�
)�< �< ���o0�p
c�> ��	���o���oP���o�o�
���o�<  0@P`p�������� 0@P`p�������� GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1��GA$3p1113@�(GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�)GA$3p1113�()GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY��(
GA*FORTIFY�(�(GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS��(.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o00<Qpp Y��ca���o�
�
Xn���oPP�}���B������ �00�@@��))
�)) �8585d��5�5���< �<��< �<��< �<��< �<��> �>H�@ @ @ @( 
0@ZH@``@�E)doc/alt-libxml2-devel/examples/.libs/parse4000075500000026520151730335240014516 0ustar00ELF>p
@�%@8@@@@hh����� (( ( � @@ @ ���  ���DDS�td���  P�tdPPPDDQ�tdR�td(( ( ��/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�o��� (��P"W�i�[���A 
��|CE���qX9��* �a� 9 "��	��S�qC8  0  7  �   libxml2.so.2_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablexmlParseChunkxmlCheckVersionxmlFreeParserCtxtxmlCleanupParserxmlFreeDocxmlCreatePushParserCtxtxmlMemoryDumplibc.so.6fopen__stack_chk_fail__fprintf_chkfclosestderrfwritefread__cxa_finalize__libc_start_main_edata__bss_start_endLIBXML2_2.4.30GLIBC_2.4GLIBC_2.2.5GLIBC_2.3.4/opt/alt/libxml2/usr/lib64 �LH�ii
Wui	ati	m( P0 8 8 � � � � � 	   h p x � � 	� 
� � � 
� � � � � ��H��H�� H��t��H����5R �%S ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
���������%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D��AUATUSH��dH�%(H�D$1����tH�T$dH3%(�^H��[]A\A]�H��
R���H�{H�5�����H�� H����L�cH�\$H�������M��H��1�1�����H��H��u��D1ɉ�H��H������H�������1�H��H�����D�mH��H�]����E��tdH���V���H�=_ ��������p���1�����H�=2 L��1�H������H�KH�= H��1�������H�=� L��1�H������z���H�
� �"�H�=��K����`����������1�I��^H��H���PTL�fH�
�H�=8����B �H�=a H�Z H9�tH�. H��t	�����H�=1 H�5* H)�H��H��H��?H�H�tH�� H��t��fD�����=
 u+UH�=� H��tH�= ����d����� ]������w����H��H�
� �����H����AWI��AVI��AUA��ATL�%� UH�-� SL)�H���/���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_�ff.������H��H���rbFailed to parse %s
Failed to create parser context !
;D����x���������� ���`����0�������XzRx�����/D$40����FJw�?:*3$"\�����tP���DZ<������F�B�A �A(�D@r
(A ABBAD����eF�E�E �E(�H0�H8�G@n8A0A(B BBB@���P8 �y�	
�( 0 ���o0�h
�P P���	���o���oX���o�o$���o@ 
 
0
@
P
`
p
�
�
�
�
�
�
�
GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-23)GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GA$3a1�	�
GA$3p1113�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3a1�
GA$3p1113��GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY��GA+GLIBCXX_ASSERTIONS.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.comment.gnu.build.attributes���� &�� 4$G���o004Qhh(Y���a���o$$.n���oXX`}����B��P��	�	�

���
�
����%���
�H�PPD���(�( (�0 0�8 8�@ @�P P��        
0 Z8 `` @�$)doc/alt-libxml2-devel/examples/reader3000075500000017405151730335250013641 0ustar00#! /bin/sh

# reader3 - temporary wrapper script for .libs/reader3
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The reader3 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file reader3.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "reader3:reader3:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "reader3:reader3:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "reader3:reader3:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'reader3'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/tree1.c000064400000004306151730335250013546 0ustar00/**
 * section: Tree
 * synopsis: Navigates a tree to print element names
 * purpose: Parse a file to a tree, use xmlDocGetRootElement() to
 *          get the root element, then walk the document and print
 *          all the element name in document order.
 * usage: tree1 filename_or_URL
 * test: tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res
 * author: Dodji Seketeli
 * copy: see Copyright for the status of this software.
 */
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

#ifdef LIBXML_TREE_ENABLED

/*
 *To compile this file using gcc you can type
 *gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c
 */

/**
 * print_element_names:
 * @a_node: the initial xml node to consider.
 *
 * Prints the names of the all the xml elements
 * that are siblings or children of a given xml node.
 */
static void
print_element_names(xmlNode * a_node)
{
    xmlNode *cur_node = NULL;

    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
        if (cur_node->type == XML_ELEMENT_NODE) {
            printf("node type: Element, name: %s\n", cur_node->name);
        }

        print_element_names(cur_node->children);
    }
}


/**
 * Simple example to parse a file called "file.xml", 
 * walk down the DOM, and print the name of the 
 * xml elements nodes.
 */
int
main(int argc, char **argv)
{
    xmlDoc *doc = NULL;
    xmlNode *root_element = NULL;

    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    /*parse the file and get the DOM */
    doc = xmlReadFile(argv[1], NULL, 0);

    if (doc == NULL) {
        printf("error: could not parse file %s\n", argv[1]);
    }

    /*Get the root element node */
    root_element = xmlDocGetRootElement(doc);

    print_element_names(root_element);

    /*free the document */
    xmlFreeDoc(doc);

    /*
     *Free the global variables that may
     *have been allocated by the parser.
     */
    xmlCleanupParser();

    return 0;
}
#else
int main(void) {
    fprintf(stderr, "Tree support not compiled in\n");
    return 0;
}
#endif
doc/alt-libxml2-devel/examples/parse1.o000064400000054020151730335250013733 0ustar00ELF>�I@@98	

,.+/*0)1GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS����t��S�
RH���H�[1�1�H���H��tH�����1�[�H�=H�پH����Failed to parse %s
g�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�7(
��0
��8doc
�7@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'7
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
07@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�j0
��
��
�P
��
��
�C 
�7(]j`
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
�CX�
%�
&��K��C9�B3��C	)M		C&	C)W2	8	�G	������	���&	"ae��
"a"�
�
-�
�
�
 �
	c
!"#T1#Q	#Rs$+�
#Us#T0#Q0%8$E�
#U

R%Q%^�&�
'�(doc�)da'd�'d<�*+Z,
q,
+,
9+�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B:;9I�B1R�BUXYW1�BU41�B 1R�BXYW!1"��1#���B$��1%��1&.:;9' ':;9I(4:;9I).?:;9'I 4*+.?<n:;9,.?<n:;9U�U�TS�T�SSPP
�,e�A�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlparse1.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hparser.hxmlversion.h!	!K�!j 	 X<ZjJ�\�\Y/	d.�
��__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDXML_XINCLUDE_STARTnsDef_codecvt_private_xmlNsxmlNslong long intsigned charGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endparse1.cencodinglong intoldNsparent_flags_IO_buf_endstdinXML_XINCLUDE_END_IO_codecvtExternalID_old_offset_offsetmainxmlCharxmlCleanupParsercompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocfprintfxmlMemoryDump_xmlAttr__streamlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLlast_IO_save_base_xmlDtd_lock_flags2_modestdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitiesfilenameelementsxmlReadFile_IO_write_endXML_ATTRIBUTE_DECL_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotationsXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdup__fprintf_chkXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODEintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypeXML_DOCUMENT_FRAG_NODEargcexample1Func_freeres_listextraXML_ENTITY_REF_NODE_wide_dataatypeXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESargv_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�eP�w
A
�	-)?.Yt/��0��1�e!#%'./0123-4#(4DYm()*+,~e��������.annobin_parse1.c.annobin_parse1.c_end.annobin_parse1.c.hot.annobin_parse1.c_end.hot.annobin_parse1.c.unlikely.annobin_parse1.c_end.unlikely.annobin_parse1.c.startup.annobin_parse1.c_end.startup.annobin_parse1.c.exit.annobin_parse1.c_end.exit.annobin_main.start.annobin_main.end.LC0.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlReadFilexmlFreeDocxmlCleanupParserxmlMemoryDumpstderr__fprintf_chk ) # $ % &**e>��������)?��������6@��������;A��������@B��������KC��������Z,��������_D��������

"
"
"*
 0%
!*
"\8
"z?
""H
"7O
"�V
"]
"ck
"*p
"|
"j�
"D�
"��
"@�
"�
"�
"��
"�
"��
"�
"�
"G
"
)
"C6
"�C
"P
"]
"j
")w
"��
"t�
"��
"h�
"#�
"��
"��
"��
"��
"/�
"�
"1
"!
"�-
"�5
"�\
"jg
"m�
"S�
"7�
"�
"��
"�
"�
"�
"
"R 
"�&
"�,
"�2
">8
"�>
"�D
"�J
"�P
"V
"\
"Eb
"�h
"�n
"�t
"rz
"��
"Y�
"��
"5�
"J�
"��
"��
"��
"��
"�
"��
"��
"X�
"o�
"��
"�
"�
"�(
".6
"D
"9R
"c`
"��
"��
"��
"��
"��
"��
"��
"�
"�
"�
"�
".*
"8
"9F
"cT
"�p
"{~
"��
"��
"Z�
"v�
"��
"��
"�
"��
"�
"�
".
"-
"9;
"cI
"�e
"�s
"b�
"`�
"m�
"3�
"R�
"!�
"�
"��
"

"�
"9)
"�@
"�G
"-L
"IQ
"$^
"�k
"�y
"c�
"��
"S�
"[�
"��
"��
"h�
"��
"�
"�
". 
".
"9<
"cJ
"�s
"��
"��
"K�
"��
"��
"��
"*	
"<'	
"H	
"�T	
"�`	
"wl	
"x	
"��	
"��	*�	
"��	
�	
�	
"�	
C�	
=�	*!�	
 �	
��	
��	
 �	
�

�

*H
*H/

3

=
*cS
d
*-�
*:�
*�
*?�
*D�

"��

"��

"R
"q
"� 
"�$
"�,
"�0
"�9
"8=
"8F
"�J
"�R
"�V
"�_
"Zc
"Z****eC*K*V*^*!i*!q*e�*!�*:�*H�*e�*-�*9�*H�*b*H
*c
**!*:*H*e0*8*eP* *.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group*@6-*P6.*h6/*�(60*�61�!�'�1��,@.06	G�V��Q@H.06ph�h�@x.06<�<��@�.06����@�.06��	8�@/06 e@8/�6,2�@�k;@�/�6L\_`1Z@�D�6o�0j@�F06!��P~@�F�6#���@hG6%�0�I�0%.�M%M%pM%GM%M%�M%�M%�M%�M%�M%P%  p%8@�G64�%x7<	 ,��G1doc/alt-libxml2-devel/examples/examples.xsl000064400000011015151730335250014723 0ustar00<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:variable name="apidoc-prefix">https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-</xsl:variable>

  <xsl:template match="include">
    <xsl:variable name="header" select="substring-before(substring-after(., '/'), '&gt;')"/>
    <xsl:variable name="doc" select="concat($apidoc-prefix, $header, 'tml')"/>
    <li><a href="{$doc}"><xsl:value-of select="."/></a></li>
  </xsl:template>

  <xsl:template match="typedef">
    <xsl:variable name="name" select="@name"/>
    <xsl:variable name="header" select="concat(@file, '.h')"/>
    <xsl:variable name="doc" select="concat($apidoc-prefix, @file, '.html#', $name)"/>
    <li> line <xsl:value-of select="@line"/>: Type <a href="{$doc}"><xsl:value-of select="$name"/></a> from <xsl:value-of select="$header"/></li>
  </xsl:template>

  <xsl:template match="function">
    <xsl:variable name="name" select="@name"/>
    <xsl:variable name="header" select="concat(@file, '.h')"/>
    <xsl:variable name="doc" select="concat($apidoc-prefix, @file, '.html#', $name)"/>
    <li> line <xsl:value-of select="@line"/>: Function <a href="{$doc}"><xsl:value-of select="$name"/></a> from <xsl:value-of select="$header"/></li>
  </xsl:template>

  <xsl:template match="macro">
    <xsl:variable name="name" select="@name"/>
    <xsl:variable name="header" select="concat(@file, '.h')"/>
    <xsl:variable name="doc" select="concat($apidoc-prefix, @file, '.html#', $name)"/>
    <li> line <xsl:value-of select="@line"/>: Macro <a href="{$doc}"><xsl:value-of select="$name"/></a> from <xsl:value-of select="$header"/></li>
  </xsl:template>

  <xsl:template match="example">
    <xsl:variable name="filename" select="string(@filename)"/>
    <h3><a name="{$filename}" href="{$filename}"><xsl:value-of select="$filename"/></a>: <xsl:value-of select="synopsis"/></h3>
    <p><xsl:value-of select="purpose"/></p>
    <p>Includes:</p>
    <ul>
    <xsl:for-each select="includes/include">
      <xsl:sort select="@line" data-type="number"/>
      <xsl:apply-templates select='.'/>
    </xsl:for-each>
    </ul>
    <p>Uses:</p>
    <ul>
    <xsl:for-each select="uses/*">
      <xsl:sort select="@line" data-type="number"/>
      <xsl:apply-templates select='.'/>
    </xsl:for-each>
    </ul>
    <p>Usage:</p>
    <p><xsl:value-of select="usage"/></p>
    <p>Author: <xsl:value-of select="author"/></p>
  </xsl:template>

  <xsl:template match="section">
    <li><p> <a href="#{@name}"><xsl:value-of select="@name"/></a> :</p>
    <ul>
    <xsl:for-each select="example">
      <xsl:sort select='.'/>
      <xsl:variable name="filename" select="@filename"/>
      <li> <a href="#{$filename}"><xsl:value-of select="$filename"/></a>: <xsl:value-of select="/examples/example[@filename = $filename]/synopsis"/></li>
    </xsl:for-each>
    </ul>
    </li>
  </xsl:template>

  <xsl:template match="sections">
    <p> The examples are stored per section depending on the main focus
    of the example:</p>
    <ul>
    <xsl:for-each select="section">
      <xsl:sort select='.'/>
      <xsl:apply-templates select='.'/>
    </xsl:for-each>
    </ul>
    <p> Getting the compilation options and libraries dependencies needed
to generate binaries from the examples is best done on Linux/Unix by using
the xml2-config script which should have been installed as part of <i>make
install</i> step or when installing the libxml2 development package:</p>
<pre>gcc -o example `xml2-config --cflags` example.c `xml2-config --libs`</pre>
  </xsl:template>

  <xsl:template name="sections-list">
    <xsl:for-each select="sections/section">
      <xsl:variable name="section" select="@name"/>
      <h2> <a name="{$section}"></a><xsl:value-of select="$section"/> Examples</h2>
      <xsl:apply-templates select='/examples/example[section = $section]'/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="examples">
    <xsl:variable name="title">Libxml2 set of examples</xsl:variable>
      <xsl:document href="index.html" method="xml" indent="yes" omit-xml-declaration="yes"
          doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
          doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html>
        <head>
	  <title>
	    <xsl:value-of select="$title"/>
	  </title>
        </head>
        <body>
	  <h1><xsl:value-of select="$title"/></h1>
          <xsl:apply-templates select="sections"/>
          <xsl:call-template name="sections-list"/>
        </body>
      </html>
    </xsl:document>
  </xsl:template>

</xsl:stylesheet>
doc/alt-libxml2-devel/examples/parse3000075500000017372151730335250013514 0ustar00#! /bin/sh

# parse3 - temporary wrapper script for .libs/parse3
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The parse3 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file parse3.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "parse3:parse3:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "parse3:parse3:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "parse3:parse3:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'parse3'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/io2000075500000017331151730335250013003 0ustar00#! /bin/sh

# io2 - temporary wrapper script for .libs/io2
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The io2 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file io2.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "io2:io2:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "io2:io2:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "io2:io2:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'io2'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/io2.o000064400000054050151730335250013234 0ustar00ELF>�I@@98	

,.+/*0)1GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��UH�=SH��(dH�%(H�D$1��1�H�1�H��H���H�5H��H���H��H����H�T$H��H�t$�H�T$H�51���H�|$�H���H�L$dH3%(u	H��(1�[]��1.0rootcontent%s��5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� ����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�2@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�2(
��0
��8doc
�2@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'2
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
02@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�e0
��
��
�K
��
��
�C 
�2(Xe`
��
�C
��
��
��
�� 
��(
��0
��8doc
�2@ns
��H
��P
�CX�
��
���
%�
&��F��C9�B3		C	)M'	-	CA	C)WM	S	�b	������	���A	a��7n�doc���P	a�L7%W
HV U1 T	!bv
 U	!o�
 Us T0 Q	 R0!|�
 Uv T	!��
 Us Tv!� Us T�P Q�L R1!�) Us"�#kaV$k �%&\'

'
<'
%'
�'
�'
(%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<!7I>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B4:;9I�B4:;9I1R�BXYW1�B��1 ���B!��1"��1#.?:;9'I 4$:;9I%&.?<n:;9'.?<n:;9(.?<nPVVPSS
�,��"�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlio2.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.h	
XvtX�	Y�=	Y	s=��g�
t���f  printf__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDXML_XINCLUDE_STARTstdoutnsDefxmlbuff_private_xmlNsxmlNslong long intsigned charxmlNodeGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endencodinglong intoldNsparent_flags_IO_buf_endstdinXML_XINCLUDE_END_IO_codecvt__printf_chkExternalID_old_offsetbuffersizexmlCharcompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocXML_ATTRIBUTE_NOTATION_xmlAttrlong unsigned intxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrXML_ATTRIBUTE_ENTITYnamesys_nerrcharsetxmlNodeSetContentshort unsigned intXML_ENTITY_DECLlast_IO_save_basexmlNewDoc_xmlDtd_lock_flags2_modexmlDocDumpFormatMemoryXML_PI_NODEXML_ATTRIBUTE_IDprefix_codecvtstandaloneextSubsetxmlRealloccontentpentitieselements_IO_write_endXML_ATTRIBUTE_DECL_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotationsxmlNodePtrXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdupatype__stack_chk_failXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDict_offsetio2.cXML_TEXT_NODExmlDocSetRootElementintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSxmlNewDocNode_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefxmlAttributeTypeXML_DOCUMENT_FRAG_NODE_freeres_listextraXML_ENTITY_REF_NODEcontext_wide_dataXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESmain_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�,�E�H�D@�
CAA
�	-#6.Me/��0��1���!#%'./0123-4
	%5J^()*+,o�t��������.annobin_io2.c.annobin_io2.c_end.annobin_io2.c.hot.annobin_io2.c_end.hot.annobin_io2.c.unlikely.annobin_io2.c_end.unlikely.annobin_io2.c.startup.annobin_io2.c_end.startup.annobin_io2.c.exit.annobin_io2.c_end.exit.annobin_main.start.annobin_main.end.LC0.LC1.LC2.LC3.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlNewDocxmlNewDocNodexmlNodeSetContentxmlDocSetRootElementxmlDocDumpFormatMemory__printf_chkxmlFreexmlFreeDoc__stack_chk_fail ) # $ % &**�,��������"A��������+-��������8B��������?.��������JC��������UD��������lE��������x/���������F���������G���������H���������I��������

"(
"�
"1
 %
!*
"c8
"x?
"(H
"RO
"�V
"]
"~k
"6p
"|
"��
"s�
"��
"L�
"�
" �
"��
"4�
"��
"�
"�
"S
")
"�6
"�C
")P
"]
"j
"@w
"��
"��
"��
"o�
":�
"��
"��
"��
"��
"5�
"$
"H
"N!
"�-
"�5
"\
"vg
"��
"_�
"��
"W�
"��
"�
"�	
"�
"I
"�
"-!
"�'
"
-
"e3
"�9
"?
"�E
"�K
"Q
"^W
"`]
"c
"�i
"o
"yu
"�{
"e�
"��
"Y�
"q�
"�
"+�
"��
"�
"C�
"
�
"��
"X�
"��
"��
"�
"�
"�#
"I1
"?
"EM
"j[
"��
"��
""�
"��
"��
"��
"��
"2�
"��
"�	
"�
"I%
"3
"EA
"jO
"�k
"�y
"��
"�
"u�
"��
"��
"��
"�
"��
"��
"�
"I
"(
"E6
"jD
"�`
"�n
"�|
"��
"��
"?�
"m�
"-�
"2�
"��
"D
"�
"h$
"";
"B
"\G
"xL
"?Y
"f
"�t
"j�
"��
"��
"��
"��
"��
"o�
"��
"��
"�

"I
")
"E7
"jE
"�n
"�|
"��
" �
"��
"Q�
"��
"��
"��
"u	
"BB	
"#c	
"o	
"�{	
"��	
"7�	
"��	
"/�	*�	
�	
�	
U�	
O�	
"��	
"�	
*p
*p.

�2

�7
*�M
X
*&m
w
*<�
�
*N�
	�
*Y�
*p*�**�8
"I
"W
"�[
"�c
"(g
"(p
"@t
"@}
"��
"��
"��
"��
"N�
"N�
"��
"��
"��
"�*F*M*M!*�,*�4*�U*7]*;h*;p*�{*��*��*p�*��
***�1* *.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group*@60*P61*h62*�(63*�64�!�'�1��,@�.06	G�V��Q@�.06ph�h�@�.06<�<��@ /06����@P/06��	8�@�/06 �@�/86,2�@��;@�0�6L�(_��Z@�Eh6o�0j@ G06!�� ~@PG06#����@�G6%�0�m�0�$.�%%p%G%%�%�%�%�%�% %  @%H@�G64�%�7?	x,�G1doc/alt-libxml2-devel/examples/reader4000075500000017405151730335250013642 0ustar00#! /bin/sh

# reader4 - temporary wrapper script for .libs/reader4
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The reader4 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file reader4.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "reader4:reader4:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "reader4:reader4:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "reader4:reader4:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'reader4'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/tree2000075500000017357151730335250013343 0ustar00#! /bin/sh

# tree2 - temporary wrapper script for .libs/tree2
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The tree2 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file tree2.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "tree2:tree2:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "tree2:tree2:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "tree2:tree2:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'tree2'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/xpath1.c000064400000014741151730335250013737 0ustar00/** 
 * section: 	XPath
 * synopsis: 	Evaluate XPath expression and prints result node set.
 * purpose: 	Shows how to evaluate XPath expression and register 
 *          	known namespaces in XPath context.
 * usage:	xpath1 <xml-file> <xpath-expr> [<known-ns-list>]
 * test:	xpath1 test3.xml '//child2' > xpath1.tmp && diff xpath1.tmp $(srcdir)/xpath1.res
 * author: 	Aleksey Sanin
 * copy: 	see Copyright for the status of this software.
 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>

#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_SAX1_ENABLED)


static void usage(const char *name);
int  execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList);
int  register_namespaces(xmlXPathContextPtr xpathCtx, const xmlChar* nsList);
void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output);

int 
main(int argc, char **argv) {
    /* Parse command line and process file */
    if((argc < 3) || (argc > 4)) {
	fprintf(stderr, "Error: wrong number of arguments.\n");
	usage(argv[0]);
	return(-1);
    } 
    
    /* Init libxml */     
    xmlInitParser();
    LIBXML_TEST_VERSION

    /* Do the main job */
    if(execute_xpath_expression(argv[1], BAD_CAST argv[2], (argc > 3) ? BAD_CAST argv[3] : NULL) < 0) {
	usage(argv[0]);
	return(-1);
    }

    /* Shutdown libxml */
    xmlCleanupParser();
    
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return 0;
}

/**
 * usage:
 * @name:		the program name.
 *
 * Prints usage information.
 */
static void 
usage(const char *name) {
    assert(name);
    
    fprintf(stderr, "Usage: %s <xml-file> <xpath-expr> [<known-ns-list>]\n", name);
    fprintf(stderr, "where <known-ns-list> is a list of known namespaces\n");
    fprintf(stderr, "in \"<prefix1>=<href1> <prefix2>=href2> ...\" format\n");
}

/**
 * execute_xpath_expression:
 * @filename:		the input XML filename.
 * @xpathExpr:		the xpath expression for evaluation.
 * @nsList:		the optional list of known namespaces in 
 *			"<prefix1>=<href1> <prefix2>=href2> ..." format.
 *
 * Parses input XML file, evaluates XPath expression and prints results.
 *
 * Returns 0 on success and a negative value otherwise.
 */
int 
execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList) {
    xmlDocPtr doc;
    xmlXPathContextPtr xpathCtx; 
    xmlXPathObjectPtr xpathObj; 
    
    assert(filename);
    assert(xpathExpr);

    /* Load XML document */
    doc = xmlParseFile(filename);
    if (doc == NULL) {
	fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename);
	return(-1);
    }

    /* Create xpath evaluation context */
    xpathCtx = xmlXPathNewContext(doc);
    if(xpathCtx == NULL) {
        fprintf(stderr,"Error: unable to create new XPath context\n");
        xmlFreeDoc(doc); 
        return(-1);
    }
    
    /* Register namespaces from list (if any) */
    if((nsList != NULL) && (register_namespaces(xpathCtx, nsList) < 0)) {
        fprintf(stderr,"Error: failed to register namespaces list \"%s\"\n", nsList);
        xmlXPathFreeContext(xpathCtx); 
        xmlFreeDoc(doc); 
        return(-1);
    }

    /* Evaluate xpath expression */
    xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
    if(xpathObj == NULL) {
        fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr);
        xmlXPathFreeContext(xpathCtx); 
        xmlFreeDoc(doc); 
        return(-1);
    }

    /* Print results */
    print_xpath_nodes(xpathObj->nodesetval, stdout);

    /* Cleanup */
    xmlXPathFreeObject(xpathObj);
    xmlXPathFreeContext(xpathCtx); 
    xmlFreeDoc(doc); 
    
    return(0);
}

/**
 * register_namespaces:
 * @xpathCtx:		the pointer to an XPath context.
 * @nsList:		the list of known namespaces in 
 *			"<prefix1>=<href1> <prefix2>=href2> ..." format.
 *
 * Registers namespaces from @nsList in @xpathCtx.
 *
 * Returns 0 on success and a negative value otherwise.
 */
int 
register_namespaces(xmlXPathContextPtr xpathCtx, const xmlChar* nsList) {
    xmlChar* nsListDup;
    xmlChar* prefix;
    xmlChar* href;
    xmlChar* next;
    
    assert(xpathCtx);
    assert(nsList);

    nsListDup = xmlStrdup(nsList);
    if(nsListDup == NULL) {
	fprintf(stderr, "Error: unable to strdup namespaces list\n");
	return(-1);	
    }
    
    next = nsListDup; 
    while(next != NULL) {
	/* skip spaces */
	while((*next) == ' ') next++;
	if((*next) == '\0') break;

	/* find prefix */
	prefix = next;
	next = (xmlChar*)xmlStrchr(next, '=');
	if(next == NULL) {
	    fprintf(stderr,"Error: invalid namespaces list format\n");
	    xmlFree(nsListDup);
	    return(-1);	
	}
	*(next++) = '\0';	
	
	/* find href */
	href = next;
	next = (xmlChar*)xmlStrchr(next, ' ');
	if(next != NULL) {
	    *(next++) = '\0';	
	}

	/* do register namespace */
	if(xmlXPathRegisterNs(xpathCtx, prefix, href) != 0) {
	    fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href);
	    xmlFree(nsListDup);
	    return(-1);	
	}
    }
    
    xmlFree(nsListDup);
    return(0);
}

/**
 * print_xpath_nodes:
 * @nodes:		the nodes set.
 * @output:		the output file handle.
 *
 * Prints the @nodes content to @output.
 */
void
print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) {
    xmlNodePtr cur;
    int size;
    int i;
    
    assert(output);
    size = (nodes) ? nodes->nodeNr : 0;
    
    fprintf(output, "Result (%d nodes):\n", size);
    for(i = 0; i < size; ++i) {
	assert(nodes->nodeTab[i]);
	
	if(nodes->nodeTab[i]->type == XML_NAMESPACE_DECL) {
	    xmlNsPtr ns;
	    
	    ns = (xmlNsPtr)nodes->nodeTab[i];
	    cur = (xmlNodePtr)ns->next;
	    if(cur->ns) { 
	        fprintf(output, "= namespace \"%s\"=\"%s\" for node %s:%s\n", 
		    ns->prefix, ns->href, cur->ns->href, cur->name);
	    } else {
	        fprintf(output, "= namespace \"%s\"=\"%s\" for node %s\n", 
		    ns->prefix, ns->href, cur->name);
	    }
	} else if(nodes->nodeTab[i]->type == XML_ELEMENT_NODE) {
	    cur = nodes->nodeTab[i];   	    
	    if(cur->ns) { 
    	        fprintf(output, "= element node \"%s:%s\"\n", 
		    cur->ns->href, cur->name);
	    } else {
    	        fprintf(output, "= element node \"%s\"\n", 
		    cur->name);
	    }
	} else {
	    cur = nodes->nodeTab[i];    
	    fprintf(output, "= node \"%s\": type %d\n", cur->name, cur->type);
	}
    }
}

#else
int main(void) {
    fprintf(stderr, "XPath support not compiled in\n");
    return 0;
}
#endif
doc/alt-libxml2-devel/examples/parse1.c000064400000002420151730335250013714 0ustar00/**
 * section: Parsing
 * synopsis: Parse an XML file to a tree and free it
 * purpose: Demonstrate the use of xmlReadFile() to read an XML file
 *          into a tree and xmlFreeDoc() to free the resulting tree
 * usage: parse1 test1.xml
 * test: parse1 test1.xml
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

/**
 * example1Func:
 * @filename: a filename or an URL
 *
 * Parse the resource and free the resulting tree
 */
static void
example1Func(const char *filename) {
    xmlDocPtr doc; /* the resulting document tree */

    doc = xmlReadFile(filename, NULL, 0);
    if (doc == NULL) {
        fprintf(stderr, "Failed to parse %s\n", filename);
	return;
    }
    xmlFreeDoc(doc);
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    example1Func(argv[1]);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
doc/alt-libxml2-devel/examples/xpath1.o000064400000165130151730335250013752 0ustar00ELF>X�@@<;

/1.2-3,4H��H��t[H��H�=�1�H���4H�
�H�=��3H�
H���H�=�H�
�BH�5H�=�ff.�f���AVAUATUSH���jH���BH��H���I��H���H���
fDH���< t���tk�=H���H�����L�h� L���H��t*�L��H��H��L�p���u7M��tL����L��H��H�����uL��1�[]A\A]A^�H�=M��H��1�H���L��[�����]A\A]A^�H�
�&�H�=�L��[�����]A\A]A^�H�
�(�H�=�������e���H�
��H�5H�=�H�
��H�5H�=�f���AVAUATUSH����I��H��H���\�1�H��H��������I�FH�H���J�S�L�-�L�$��O�A����H�@HH����H�HI�оH��H�1��I9�t`I�FH�H��H����D�@H�PA��u�H�H�qHH�yH�HH��tXH��L�NI�оWH�H��1��XZI9�u�[]A\A]A^�fDH�ѾL��H��1���r���fDI��I�оH��H�1���K����H�ѾH��1�H���&���f�[H��1�]H�A\�A]1�A^�H�
��H�5H�=�H�
��H�5H�=�f���AUATUSH��H���EI��H���H��I���H��H��ttH���H��H����M��tL��H�������H��L���I��H��tYH�xH�5�L���H���H���1�H��[]A\A]�H�=H�پ1�H���������L��H�H�=�1��H���H���������L��H���H�
�*�H�=�H���������b���H�
�[H�5H�=�H�
�ZH�5H�=�GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignxpath1.cnamexpathCtxnsListoutputResult (%d nodes):
nodes->nodeTab[i]= element node "%s:%s"
= element node "%s"
= node "%s": type %d
filenamexpathExprUsage: %s <xml-file> <xpath-expr> [<known-ns-list>]
where <known-ns-list> is a list of known namespaces
in "<prefix1>=<href1> <prefix2>=href2> ..." format
Error: unable to strdup namespaces list
Error: invalid namespaces list format
Error: unable to register NS with prefix="%s" and href="%s"
= namespace "%s"="%s" for node %s:%s
= namespace "%s"="%s" for node %s
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: failed to register namespaces list "%s"
Error: unable to evaluate xpath expression "%s"
Error: wrong number of arguments.
GA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��U�G�SH��H����wB����
R�1҃�t$H�sH�{���xC��1�H��[]�H�S��H�
�"�H�=�H�;�����H�;����print_xpath_nodesregister_namespacesexecute_xpath_expressionusage��5int�C�C���1.	3<	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	DG`	FMh	H<p	I<t	Jtx	MX�	Nf�	OS�	Qc�	Y
��	[n�	\y�	]M�	^	��	_
)�	`<�	b��
+B��c
5:it��
5��.�����<�������	Q��_
��	


�
_
��	

��x
��
��
��
��
��
�� 
��(
��0
��8doc
�E@ns
��H
�P
��X
��`
��h
�Xp
�Xr��
��
��
��
��
��
�� 
�E(
��0
��8doc
�E@
��H
��P
��X
��`
��h
��p
��x��
'E
(�
)�
*�
+�
,� 
-�(
.�0
/�8doc
0E@
3<H
4<L
:�P
;�X
<`
=�h
>�pids
?�x
@��URL
A��
B<�
D	�
E��
F<�
H<��^oR
w�
��0
��
�
�u
��
��
�� 
�E(
����`
��
��
��
��
��
�� 
��(
��0
��8doc
�E@ns
��H
��P
��X
��
���
%�
&	�^9		*	�B36	<	�K	)MW	]	�q	�)W}	�	��	�
�	
�	�	_�	�	L�	XN�
	O
<	P
<	Q�	R�		S�	T
< 	U�(	V�0	W�8	X
<@	Y
<D	Z�H	[�PM�
�	Z�
�
�
��
��*	�*	�K	�
	�q	'!.x,�
doc-�.�0	<1	<2�	4	< 5	<$6(8	<09	<4:�	8<	<@=	<D>�HA	PB	<XC�`F	<hG	<lJ	<pK�xL��O�	�P ��Q��T��W��X��[��\��_	�`	<�c��d�
�e�	�f�@icHk	<Pn�Xq5`r5hs	<p(�
")'�
X�fcur�����	<��
�� �<(�<,�40�!8�	<@��H�<P* r�
Q�S�	T	<	U	<	V�
R�x_e	r�| H~�		��	�	<	��	� 	��(	�	<0	��8	�	<@}����<��<���	��	����*:f<�FL�`f��l��	��	�:��`�$�����������	����z"{.�����������!��.�cur�� �	<i�	<!	"�ns��#+$�
v$H$<%&Uv&T1&Q	'+(�
$H$<%&Uv&T1&Q	(+�i$H$<)<&Uv&T1&Q	&Rs*&U�T&T1&Q	&R0(+��$H$<%&Uv&T1&Q}#+�"$H$<%&Uv&T1&Q	#+ ��$H$<%&Uv&T1&Q	)�&U	&T	&Q�&R	%&U	&T	&Q�&R	�
5+�<��9�(�
�A� � � � �!I	#+ �)$H,<%&T1&Q	&Rs&X}#+��$H,<%&U	&T1&Q&#+��$H,<%&U	&T1&Q()&�&U�T)2&Us&T=)2:&U}&T )>^&Uv&Ts&Q})>�&Uv&Ts&Q}-�&U|-�&U|-�&U|)�&U	&T	&Q�&R	%&U	&T	&Q�&R	�I
59+U<{��U&�U?�UY�docV� W�
 X�!�	#+`Y$H,<%&T1&Q	&Rs#+w	�$H,<%&T1#+n	�$H,<#+g	:$H,<%&U	&T1&Q*)KR&Us)Xj&Uv)�&Us&T|)e�&U}&Ts.a)r�&U|)�&Us)��&Uv)&Us)�+&Uv)�C&Uv)�&U	&T	&Q[&R	%&U	&T	&QZ&R	��
5�/A0A�!	�
5+<��%
<%#+!�$H,<%&U	&T1&Q".�)��&U

R.N.�.�.�.��1d<V0d�0d<�23���$�#+D�$H,<%&T1&Q	&R�U#+E;$H,<%&U	&T1&Q4(+F�$H,<*&U	&T1&Q3'�A4�5%&U	&T	&QB&R	6Z6C
76	)6	78�8L888�88
876896�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I:;9
:;9I84:;9I?<.?:;9'@�B:;9I�B4:;9I�B 4:;9I�B!4I4"U#1R�BXYW$1�B%��1&���B'1R�BXYW(1R�BUXYW)��1*���B1+.?:;9'I@�B,1-��.��1/.:;9' 0:;9I1.?:;9'I 423.1@�B4156.?<n:;97.?<n:;8.?<n:;9U^�U�^U^�U�^U�U�TV�T�VTU�T�VT�T�PRpPpS0�0�PP
�V
�V
�
�TVTU�T�
�V
�V
�VUV�U�V�U�V�U�VU�U�U�U�T�T�T�T�T�T�P\\\P\SSSS]]PSP]P^0�P
�
�
�US�U�S�U�U�U�U�U�T]�T�]T]T�T�Q\�Q�\�Q�\Q�Q�Q�Q�PVPVPSSPSP\P
�
�
�
�UV�U�VUp��U�VTS�T�S
�UR�U�U�U�
�
�
�<����
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlxpath1.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hdict.hxmlmemory.hhash.hxmlerror.hglobals.hxpath.hassert.hxpathInternals.hparser.hxmlversion.h<built-in>	�KZ 
�._
�`
a�
J[�I� KIz���<X=��J	<KM��<M�Y@�NX
iJ���Q�/..xX�
���z ^ ..i<�
���k X .[XF
�9�.tW.t64tK6
��$�0�
�<t��
�.�tX	��J��~
��YL�g
=�
Y�
��tX.fp�~
����
fX���~
����
�~ <�.
�~ �t
�~.X�
�~.�.
�~.X��.ta�tKa
���X=^�=�X���`����/fJZ 
�
	tm
�	.��	ttv
�	
�	�r��ttW�tt	L":�{Y�t�P]Y/Xs.vf�
tX��	X�_xmlXPathCompExprparentuser2lastErrortmpNsNrlastxmlAttributeType_shortbufbase_IO_lock_toutputxmlFreestderrxmlErrorLevel_IO_buf_endnb_types_privatemessagemax_variables_unused_xmlDtdnodesSystemIDentitiesnode_xmlNodeSetxmlMalloc_IO_write_endunsigned intXML_ATTRIBUTE_CDATAnextversionxmlStrchr_freeres_listxmlChar_flagsxpathCtxxpathExprXPATH_XSLT_TREEpentitiesnsListstringval_xmlNs_old_offsetlevel__builtin_fwritexmlInitParserxmlErrorPtrvalueNrXML_ERR_ERRORaxiselementsintSubseterrorfuncfilenameprevXML_TEXT_NODExmlXPathObjectnodeTabcache_IO_read_baseXML_ENTITY_DECLxmlXPathFunctionxmlXPathNewContextxmlXPathFreeObjecthere_IO_save_endboolvalxmlCleanupParserindexmax_funcs_unusedxmlStrdupFuncXML_COMMENT_NODE_xmlXPathObjectmax_axislong long unsigned intfilevalueMaxxmlDocPtrsys_errlist_IO_backup_basexmlNsType_offsetXML_ERR_WARNINGxmlXPathTypePtrsys_nerr_xmlXPathContextvalue_filenoxmlXPathContextxmlXPathTypeprefixsize_t_vtable_offset_markersXML_XINCLUDE_ENDXPATH_STRINGxmlStrdupfloatvalnodeNrxpath1.cxmlDocstr1str2str3originflagsxmlXPathObjectTypecodexmlXPathContextPtr__fmtXML_ATTRIBUTE_NODEnb_variables_unusedtypesxmlParseFileXPATH_NODESETindex2XML_ATTRIBUTE_ENTITIESxmlNodexmlXPathObjectPtrxmlXPathVariableLookupFunc__stream_xmlError_xmlXPathTypechar__fprintf_chk_modeexecute_xpath_expressionnodeMaxencoding_IO_markernodesetval_IO_read_ptrint1proximityPositionxmlDictxmlStructuredErrorFuncXML_CDATA_SECTION_NODExmlXPathFuncLookupFuncXML_NAMESPACE_DECLusageoldNsXML_ATTRIBUTE_IDxmlXPathEvalExpressionXPATH_BOOLEAN_IO_write_basexmlMallocFunclong long intXML_ENTITY_NODEXML_XINCLUDE_STARTancestor_IO_save_base_xmlAttrdepthxmlXPathAxisatypehrefcontextopLimitdictxmlXPathFreeContextxmlXPathCompExprxmlDictPtrfuncHashmax_typescharsetXML_DTD_NODExmlXPathNINFxmlXPathAxisPtrparseFlagsfuncLookupFuncnb_axissize_freeres_buffunctionURIXML_NOTATION_NODEdebugNodexmlErrorxmlXPathParserContextPtr__pad5long unsigned intXML_ATTRIBUTE_DECLxmlMemStrdupargcxmlXPathAxisFunc_xmlXPathAxisnsHashopCountnamespacesargvlong doubleextSubsetxmlNodePtrtmpNsListxmlMemoryDumpxmlNodeSetPtrxmlFreeDocxmlElementTypexmlXPathParserContextpsvivarLookupFuncxmlXPathRegisterNsXML_ATTRIBUTE_ENTITYnsDef_IO_read_endrefsXML_ATTRIBUTE_NOTATIONshort intxmlHashTableXML_DOCUMENT_TYPE_NODEctxtlong intpropertiesXPATH_UNDEFINEDGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinxmlXPathPINFxpathObjxmlXPathCompExprPtr_IO_wide_dataxptrxmlRealloc_xmlDocfprintfxmlHashTablePtrdomainXML_PI_NODEextraXML_ATTRIBUTE_IDREFstandalonenameXPATH_NUMBER_xmlDictprint_xpath_nodesXPATH_USERS_xmlXPathParserContext_wide_dataint2nb_funcs_unused_lock_IO_codecvt_codecvtregister_namespacesvalueFramestdin_IO_FILE__assert_failXML_ELEMENT_DECLXML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_NMTOKENStypeunsigned charxmlCheckVersionfunctionlineXML_ERR_FATALxmlNodeSet_IO_write_ptrnotationsExternalIDxmlNsPtrattributescontextSizexmlXPathConvertFuncXML_ELEMENT_NODEcontentfuncLookupDataXML_ERR_NONEXML_ATTRIBUTE_NMTOKENnsNr_xmlHashTablensListDupxmlReallocFuncstdoutXML_DOCUMENT_FRAG_NODExmlMallocAtomiccompressionfwrite__off_tvarHashsigned charXML_HTML_DOCUMENT_NODEuserDatashort unsigned intXML_ENTITY_REF_NODEXML_DOCUMENT_NODEmain__PRETTY_FUNCTION__xmlFreeFuncchildrendoublevarLookupData_chainuser_xmlNodeFILE_flags2XML_ATTRIBUTE_ENUMERATIONcompxmlNs_cur_columnvalueTab__off64_t_unused2_IO_buf_basexmlXPathNAN/builddir/build/BUILD/libxml2-2.10.2/doc/examplesGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx��DO
Q`8�F�B�B �A(�A0��
(A BBBAj
(F BBBAg
(F BBBAX��F�B�B �A(�A0��8M@R8A0F
(A BBBGi
(F IGDE8�{F�B�A �A(�D0�
(A ABBA,4�E�D�G ~
AAA
�	
0)
?1Yt2��3��4��%�+YD�g.� �.���"�H@au�!"$&(*12345607��8�p��	��������%�x�K�@�h�c�9����������
P/DX+,-./ip�����������0��{$7NUh|������.annobin_xpath1.c.annobin_xpath1.c_end.annobin_xpath1.c.hot.annobin_xpath1.c_end.hot.annobin_xpath1.c.unlikely.annobin_xpath1.c_end.unlikely.annobin_xpath1.c.startup.annobin_xpath1.c_end.startup.annobin_xpath1.c.exit.annobin_xpath1.c_end.exit.annobin_usage.start.annobin_usage.endusage__PRETTY_FUNCTION__.7905.annobin_register_namespaces.start.annobin_register_namespaces.end__PRETTY_FUNCTION__.7923.annobin_print_xpath_nodes.start.annobin_print_xpath_nodes.end__PRETTY_FUNCTION__.7937.annobin_execute_xpath_expression.start.annobin_execute_xpath_expression.end__PRETTY_FUNCTION__.7914.annobin_main.start.annobin_main.end.LC2.LC3.LC4.LC0.LC1.LC9.LC8.LC7.LC6.LC5.LC11.LC17.LC15.LC13.LC14.LC16.LC12.LC10.LC20.LC23.LC22.LC21.LC19.LC18.LC24.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupstderr_GLOBAL_OFFSET_TABLE___fprintf_chkfwrite__assert_failregister_namespacesxmlStrdupxmlStrchrxmlXPathRegisterNsxmlFreeprint_xpath_nodesexecute_xpath_expressionxmlParseFilexmlXPathNewContextxmlXPathEvalExpressionstdoutxmlXPathFreeObjectxmlXPathFreeContextxmlFreeDocmainxmlInitParserxmlCheckVersionxmlCleanupParserxmlMemoryDumpc��������;��������"e��������.c��������:<��������?f��������Kc��������[=��������g*Us>��������z?��������g���������i���������j��������j��������k��������Bk��������Ol��������ac��������p@��������ze���������l���������c���������A���������f���������l���������c���������B���������f���������*�>��������C��������g��������*>��������%D��������*g��������[E��������je���������F���������G���������e��������$H��������.e��������Ye��������yI���������e���������J���������e���������E���������*���������>���������K���������g���������*���������>��������L��������
g��������:o��������Jp��������fh��������yq���������r���������m���������s���������t���������u���������c���������M���������e���������N���������c���������e���������t��������u��������O��������!c��������2P��������7f��������?u��������P*<\>��������cQ��������hg��������o*<{>���������R���������g��������`f���������e�������� 8���$,�P�X.���.�.��.��DL� 2 3 4 599�w��������"x��������6n��������?y��������Dz��������Zc��������kS��������pf��������x�����������������
,
1�	
1A
1�
/%
0*
1�8
1F
1�	M
1�T
1I[
1�
b
1	i
1�
p
1j	u
1�
�
1��
1Z�
1!�
1��
1W�
1��
1A	�
1R�
1y�
1�
1�
1�
1�*
1�7
1\D
1�Q
1^
1Uk
1�x
1o�
1��
1��
1��
1G�
1��
1v�
1��
1��
1A�
1�
1

1m!
1�/
1j;
1VC
1�j
1�u
1�
�
1��
1\
�
1p�
1��
1P�
1O
1�"
1�(
1'.
1�4
1�
:
1�@
1F
1�L
1R
1�	X
1c
^
1�d
1�
j
1ep
1v
1&|
1`�
1$�
1��
1	�
1��
1�
1C�
1!�
1�
1&	�
1��
1
�
1-�
1w�
1S	�
16�
1a
1�
1D(
1@6
17D
11R
1`
1*n
1"�
1��
1�	�
1;	�
1	�
1p�
1�
1�
1�
1D
1@*
178
11F
1T
1*b
1"~
1��
1��
1��
1��
1��
1��
1��
1�
�
1�
1D
1@
17-
11;
1I
1*W
1"s
1�
�
15�
1�
1��
1=�
1/�
1��
1N	�
1]

1
1	)
1�7
1�	N
1�S
1�_
1Rd
1?v
1l�
1��
1��
1*�
1D�
1�
1��
1��
1�
1�
1�
1�(
1D6
1@D
17R
11`
1n
1*|
1"�
1��
1	�
1�
1��
1J�
1F	
1++	
1�L	
1M
r	
1��	
1t	�	
15
�	
1�
�	
1

�	
1~�	
1��	
1u�	
1w�	
1��	
1B

1

1�

1�)

1�6

18C

1pP

1Q]

1Vj

1[w

1��

1��

1�	�

1��

1��

1��

1��

1z
�

1�

1h
19#
1�/
1�L
1�Z
1�h
1�v
1�
�
1��
1S�
1��
1��
1��
1J�
1��
1�
1�
1y
10

1\,
1�:
1�H
1�
V
1�d
1`r
1j�
1	�
1G�
1�
1g�
1��
1��
1��
1��
1)�
1�


1

1(

1�7

1F

1gU

1Ld

1
s

1q�

1��

1��

1��

1y�

1Q�

1�

1�

1�
1�
1= 
1�.
1�<
1�
J
1�X
1�g
1�y
1��
1��
1:�
1��
1D�
1��
1�	�
1��
1k�
1E�
1�
1m�
1q
1m
15
1*
1D7
1�D
1�Q
11^
1�k
1\x
1��
1�
1��
1�
1@�
1��
1��
1L�
1@
1
1�;
1Ka
1�m
1\z
1@�
1�
1�
1p�
1�
1

1.
1"
1�
;
1�H
1�
U
1rb
1[i0�
1��
-�
-�
1a�
-��
-��
-��
-��
1��
-U�
-Q�
-��
-��
1�*�
/�
-�
-�:
-�>
-�G
-K
-P2l@{h�h�
-A�
-?�
-o�
-m���h�V�
/0�
-��
-�
-�
-�
n-%=�Z%nHw
/��
-\�
-Z�
-��
-��]�����
-��
-��
-��
-���K'�0�L
-P
-Y
-0]
-.b�~c���9��*����*
1�$�;
1^F
-kJ
-SO
1�Z
-z^
-nc
1C
n
-r
-w
1��
-��
-��
1�
-��
-��
1*�
-A�
-1�
1�* �^�^�
-��
-��~.�7�S
-	W
-	a�r������
-H	�
-F	��������	;#_F�S��������* �./* O
1sZq
1|
-�	�
-t	�
1g�
-]
�
-M
�
1��
-�
-�
-�
-��
1^�
-g�
-]�
1�
�
-��
-��
1�*@�	�%
-'
)
-%
3�I�^�g��
-U
�
-S
�����
-�
�
-�
��
-�


-�
;%�;>SNkj�}���������,CDlY�fy*@������*@�
17�
1@�
1�*Y
1!98
1FC
-�
G
-�
L
1�W
-�[
-�d9Wm9W�
-�
-�9t�P�9�9&�9:�9C�9H9|9�,
1�
=
19I
1�[v
-<z
-2�	�	�
-��
-��&��&�&
-�
-�C&8@CI
/Y
-]
-
gdxp�d�d�d���	��*Y
1_
1_
1�
1�
1�
 
1�'
1'+
1'3
177
17?
1	C
1	L
1�P
1�Y
1�]
1�f
1Tj
1Ts
1�w
1��
1�
1�
1��
1��
1��
1��
1W�
1W�
1��
1��
1��
1�0g'g/A:ABBPBX�c�k�v�~������������	�	��0dd;%;-B;BC�N�V�a�i�t�|�����������������!B"X-b5UV]�h�p��n�����-�b���9@$9AbI�Thobw��V�n�%�����%�V�d�dn��!�)�4�<�\Bdbox�B�b�����K�����
�c0�8�k�s�~��W�W�^�^������������������

'5=)H)P.z��������������"�"�.��$�,Y7^?�J�R�]�e�p�x����/�1�J�^��������J^�A�I�T�\�g�o�z��	�	���1�1�J�����^�~�	�"	�-	�H	�P	�[	��	�	=�	=�	Q�	Q�	��	��	��	��	M�	M�	g�	g
l
l
�'
�/
�]
e
=p
=x
��
��
��
��
M�
M�
`�
`�
l�
l�
�
�
�'=2=:�E�M�[�c�n�v��M�M�Y�Y�l�l�x�x��A	MM�'�/�:�BMgQoizi�������:�:�M��������
�

�'
�/
�:
�U
�]
�h
�
�
�
��
�
;�
��
9�
999J9J9Q)9Q19W<9WD9oO9oW9sd9sl9�z9��9��9�9�9�9O�9O�9Q�9Q�9�9W9tP<DOW%b%jdxd�~�~���	�&��&�C�8Cd"p
+ 9COSd0V8n@�H�P�X�`�h�p�x��������������H�h���4�h��� 9(9���9 <��0�89.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.groupF@9TFT9UFl9VF�(9WF�9X ��@8sp9&[,[6\T1@�{�9
L�	[�	�V@X}09
u�����@�}09AX
�X
��@�}09�,�,��@�}09�2�2�s8@~09A`�<@H~�9O�_\O�W@8�79h6-{H9;v@�09"��I@�@H�H9$��I@�@���9&�K�@`�09(�0R�0.a.�\aA\au\aL\a \a�\a�\a�\a\a\a$`a <�a`7@��x97�b�:c	hn��Mdoc/alt-libxml2-devel/examples/parse4.o000064400000137060151730335250013744 0ustar00ELF>p�@@;:

.0-1,2+3H��H�
���H���GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��AUATUSH��dH�%(H�D$1����tH�T$dH3%(�^H��[]A\A]�H��
R�H�{H�5�H�H����L�cH�\$H�������M��H��1�1��H��H��u��D1ɉ�H��H���H������1�H��H���D�mH��H�]�E��tdH���H�=���1�����H�=L��1�H����H�KH�=H�1����H�=L��1�H���z���H�
�"�H�=��`����rbFailed to parse %s
Failed to create parser context !
=$�5CJint�r�r��	��
5�1:3k6	�7	�8	�9	� :	�(;	�0<	�8=	�@@	�HA	�PB	�XDS`FYhHkpIktJyxMV�N]�O_�Qo�Y
��[z�\��]Y�^	C�_
)�`k�b���
+N�	�o
5Fu�	��
5��:�����k	�������	J
&@}�~C����|�(
 raw�(
(�	k0�	k4�58
�
# �h4�buf6�8�9�:�
cur;�
 end<�
(=	k0>	k4col?	k8E5@F�HG�
PH�
XI	k`idJ	kd
$��
&����	sax�d�C���k�k��
 ��
(�k0�k4��8�k@�kD�jH�kP�kX�k\�}`�	kh�Lp�	k��
k��k��k��k��k������k����
 �k(�k,�p0�r8�r@�kH�kL�kP��
X�
`�
h�vp�kx�k|�v��k�����k��k��k��k�C�k�k�C�k�k���p�	k�
k��
��
��
�k�k�kpv|� �(k0k4$k8%k<&k@'kH(EP-X.G�/5�05�3@�4k�5k�6@�8k�95�
'�	�
)�	 A
B�C�D�E�
*
�	�����S�`�m�� �(�F0�}8��@��H��P�%X�H`�fh�sp��x������� ���"����,��9��F��9������<��C��z�������
0��
&�
'C
(�

)�

*i
+i 
,^(
-i0
.i8doc
/�@
1
H
2
P
3kX
4�\
5�
`
6�
h
8�pURI
9�
x
:k�
;k�
1
�
i#

r4

<
��
	


�:
<
�	

��

� 6
�^
� p
��

�j*6x
�d
�C
��

��

�i
�i 
�i(
�i0
�i8doc
��@ns
�vH
�
P
�XX
�v`
�Ch
�Vp
�Vrvv�
�^
�C
��

��

�i
�i 
��(
�i0
�i8doc
��@
�CH
�CP
�CX
�C`
��
h
��
p
�Cxo�
'�
(C
)�

*�
+i
,i 
-i(
.i0
/i8doc
0�@
3kH
4kL
:^P
;^X
<|`
=�
h
>�
pids
?Cx
@C�URL
A�
�
Bk�
D��
EC�
Fk�
Hk�d<
�
�<
"&
'�
0#@0
2�
3�
4&
5 �
c1
6 �c2
7 �
8 � 
9 �
(
1�3@���
w�

�0
�v
�|
��
��

��

�C 
��(
��`
�E
�C
��

��

�i
�i 
�i(
�X0
�X8doc
��@ns
�vH
�P
�CX
�R��
�v
�x^
%d
&�~������C�
<�LXN�O
kP
kQ�RS�T
k U�(V�0W�8X
k@Y
kDZCH[CPM���C�Z	C�+<%"N&_Bqe*�9�P�pR}SCT|U�XkYk Zk$[}(]<0doc^�8_k@bvHckPdkTevXamh0`iShk<
�
��2���
T#�(W@XFZ5[5\5]5 �d`&Xb�c5d5e@kn 	

��<�G��_
��
kS!�
�C�!k�C�^��!��C�
�
j��C�
�
�
w��%!�9C�
��SY}C�
k�
�

������C�
�
kk�
^����C�
k��%C�
�
�
�
�28HC
�U[fC�U����C�
p���C�
�
�)���C�
k5�@�J�T�`�j�v�����������C�
�
�
kpkkp��Cc��!k		vvJQy��(-(�|�!�� �� � �� � �!�!6��!k�C�k?�9UB3��!C�)M!CC)W+1!�@����������"�	#jk���!$jk$j�!%�!z!!&�!'(")"�D("()"*�"8	�&�"+�",�#-T1-Q	-R|*�""a	�&�"+�",�#-T1-Q	-R|*�"F	P &�"+�",�#-U	-T1-Q".�"h -Us.�#� -U0-T0-Qs-X|.�#� -Uv-Ts-R0.�"� -Us.�#� -Uv-Ts-Q0-R1.�#!-Uv,�#-Us*�" }	y!&�"+�",�#-T1-Q	.�#�!-U

R.�#�!-T	/$/$/$/*$�0,6"1,�2-�	2.
�3doc/�3res0	k4kl"5mem�1k3res	k6)�"7E7')8__n6)7�9sz
):dk�"1d�1d<�;6"��#&G"(_"<S"=l"!&�"&�"&�"&~"'(�",3$-U�U-T1-Q4>Z?@�@@�@
>>�>�@9>�A@%U:;9I$>7I&I$>I	I
!I/:;9
:;9I8
:;9<4:;9I?<!
:;9I8:;9
:;9I8
:;9I8:;9
:;9I8:;9>I:;9(
:;9I8>I:;9:;9I'I (
!'I"4:;9I#.?:;9'I@�B$:;9I�B%1R�BUXYW&1�B'U(41�B)41*1R�BXYW+1,��1-���B.��1/��10.:;9' 1:;9I24:;9I34:;9I4.:;9'I 5:;9I6.?:;9'I 47:;9I8:;9I94:;9I:.?:;9'I 4;.1@�B<1=1R�BUXYW>.?<n:;9?.?<n:;@.?<n:;9A.?<nU�U�U�U�T�T�TS�T�S�T�\\\PVVPVSSPPP]P]
�
�
�
�U�U�P	4�1�U�U�	��<�6��
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlparse4.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlIO.hparser.hentities.hdict.hhash.hxmlerror.hxmlautomata.hvalid.hiconv.hencoding.hxmlmemory.hglobals.hxmlversion.h<built-in>	��}�JX�~!	���XX�j<X]
�u��JX��>	���Q&	K	:KZ_��\Y	�t,
�S.	�g
�.	

�X	`
�aX�parentnodeInfoTablastErrorexternalfatalErrorSAXFuncxmlParserCtxtPtrXML_INTERNAL_GENERAL_ENTITYxmlAttributeTypexmlParserInputBuffer_shortbufhasInternalSubsetSAXFunc_IO_lock_t_xmlAutomataoutputXML_ELEMENT_CONTENT_ORisStandalonestderrfreeAttrsxmlErrorLevelspaceNr_IO_buf_end_privatemessage_xmlDtdflags_xmlEntitybufferinternalSubsetSAXFuncentitiesxmlErrorPtrXML_PARSER_MISCvstateNrXML_ELEMENT_CONTENT_ELEMENTXML_ELEMENT_CONTENT_PLUS_IO_write_endXML_PARSER_STARTXML_ATTRIBUTE_CDATAnextresolveEntitySAXFuncxmlParseChunk_xmlNode_freeres_listrawconsumedxmlChar_flagsXML_PARSER_PUBLIC_LITERALXML_ELEMENT_CONTENT_ONCEreferenceSAXFunccatalogsrefsdictNamespentities__fread_alias_flags2begin_pos_xmlNs_old_offsetparse4.cetypelevel__builtin_fwritemyDocxmlCharEncodingOutputFuncXML_ERR_ERRORelementsintSubseterrorcharactersendDocumentSAXFuncfilenameprevunparsedEntityDeclSAXFuncXML_PARSER_PROLOG_xmlSAXLocatorXML_TEXT_NODEend_linecompressedexample4FuncendDocumentreference_xmlValidStatecommentdisableSAXXML_DTD_NODEnodeTabbegin_linenexteXML_PARSE_UNKNOWNreadPacketprocessingInstructionSAXFuncXML_ENTITY_DECLsizeentitiesstdoutsax2startElementNs_IO_save_endXML_PARSER_ENTITY_VALUEfatalErrorXML_INTERNAL_PREDEFINED_ENTITYxmlElementContentXML_INTERNAL_PARAMETER_ENTITYxmlStartTagXML_PARSER_COMMENT_xmlParserInputbaseignorableWhitespaceSAXFunclong long unsigned intvstateMaxxmlStrdupFuncXML_COMMENT_NODEstartElementwarningwellFormedendElementNsconsumedfilenodeInfoMaxfreeElemsNrxmlParserInputXML_NAMESPACE_DECLatts_xmlParserNodeInfoSeqxmlDocPtrentityDeclSAXFuncsys_errlistinSubsetnsWellFormedxmlNsTypexmlCleanupParser_offsetXML_PARSER_ATTRIBUTE_VALUEXML_ERR_WARNINGextSubsetsys_nerrownerinitializedfprintf_filenoXML_EXTERNAL_GENERAL_PARSED_ENTITYdomaingetParameterEntitySAXFuncserrorfopenend_posencoderprefixXML_PARSER_END_TAGxmlParserInputDeallocatesize_tentityDeclwarningSAXFunc_markersXML_XINCLUDE_END_xmlBufnodeNrinputNrnotationDecl_IO_read_basexmlDocxmlElementContentOccurprogressiveXML_EXTERNAL_PARAMETER_ENTITY_xmlErrorentityXML_PARSER_SYSTEM_LITERALstr1str2str3XML_PARSER_DTDfreeXML_PARSER_ENTITY_DECLnodememcodestartDocumentlast__fmtxmlBufXML_ATTRIBUTE_NODEnodeInfo_xmlParserInputBuffernotationDeclSAXFuncsetDocumentLocatorresolveEntitygetEntitySAXFuncXML_ATTRIBUTE_ENTITIESxmlNodevalidnbentitiesloadsubset__streamcharatype__fprintf_chkgetSystemIdiconv_indocdictsetDocumentLocatorSAXFuncstr_xml_nsxmlMallocAtomicpushTab_IO_marker_xmlAutomataState_IO_read_ptrint1int2xmlDictxmlStructuredErrorFuncfreeAttrsNrextSubURIXML_CDATA_SECTION_NODEunsigned intxmlParserInputStateexternalSubsetxmlValidityErrorFuncXML_EXTERNAL_GENERAL_UNPARSED_ENTITYxmlAutomataStatePtrxmlAttrPtroldNsstartDocumentSAXFuncstr_xmlnsXML_ATTRIBUTE_IDXML_PARSER_IGNOREprocessingInstruction_IO_write_basexmlMallocFunc_vtable_offsetmainlong long intXML_ENTITY_NODESystemIDchildrenXML_XINCLUDE_STARTerrorSAXFunc_IO_save_baseiconv_out_xmlAttrdepthxmlParserCtxtnameNrhrefextSubSystemcontextcharsdictparseModeignorableWhitespaceclosecallbackxmlDictPtrsizeentcopyinput_id_xmlSAXHandlercharsetxmlValidCtxtrecoverynsTabparseFlagsxmlAutomataPtrsize_freeres_buf_IO_backup_basexmlReallocXML_NOTATION_NODExmlError__pad5long unsigned intXML_ATTRIBUTE_DECLinputdirectoryXML_PARSER_PIxmlCharEncodingInputFuncxmlMemStrdupargcXML_ELEMENT_NODEXML_ELEMENT_CONTENT_PCDATAXML_ELEMENT_CONTENT_MULT_modeXML_PARSE_PUSH_DOM_xmlStartTagXML_PARSER_EPILOGlong doublegetLineNumbernameTabtokenxmlMemoryDumpattsDefaultxmlFreeDocxmlElementTypexmlMallocpsvi_xmlValidCtxthasExternalSubsetlinenumberscdataBlockSAXFunccharactersSAXFuncXML_ATTRIBUTE_ENTITYinstatexmlParserNodeInfoSeqnsDefXML_PARSER_CONTENTXML_PARSER_CDATA_SECTIONocur_IO_read_endXML_ATTRIBUTE_NOTATIONxmlAttrshort intxmlSAXLocatorPtrendElementSAXFuncxmlHashTableXML_DOCUMENT_TYPE_NODEXML_PARSER_START_TAGXML_ELEMENT_CONTENT_SEQXML_PARSE_READERctxtlong intpropertiesattallocsinternalSubsetoptionslengthfread__stack_chk_failreplaceEntitiesxmlInputReadCallbackchecked_xmlElementContentcheckIndexnodeMaxxmlEntityTypeXML_DOCUMENT_NODEattsSpecial_IO_wide_datastr_xmlnodefclosegetEntity_xmlDochasInternalSubsetxmlFreexmlBufPtrkeepBlanksxmlHashTablePtrxmlParserNodeInforeadcallbackXML_PI_NODExmlInputCloseCallbackextraXML_ATTRIBUTE_IDREFfreeElemsnodeInfoNrpedanticnamestateXML_PARSE_PUSH_SAX_xmlDictstartElementNsSAX2Func_lockxmlFreeParserCtxtxmlCreatePushParserCtxtxmlEntityPtrXML_PARSER_EOF_wide_dataxmlCharEncodingHandlermaximumnode_seq_xmlEnumeration_xmlParserNodeInfogetColumnNumber_IO_codecvtcommentSAXFuncxmlNodePtrstdin_IO_FILExmlCharEncodingHandlerPtrrecord_info__ptrvstateTabxmlValidityWarningFuncXML_ELEMENT_DECLorigxmlEnumerationXML_ATTRIBUTE_IDREFSXML_ELEMENT_CONTENT_OPTXML_ATTRIBUTE_NMTOKENSXML_PARSE_DOMtypeunsigned charxmlCheckVersionvctxtgetParameterEntityhtmllineencodingXML_ERR_FATALattributeDecl_IO_write_ptriconv_tnotationsExternalIDattributes_xmlCharEncodingHandlercontentspacexmlElementContentPtr_xmlParserCtxtXML_PARSE_SAXxmlParserInputBufferPtrisStandaloneSAXFuncXML_ATTRIBUTE_NMTOKENelementDeclnsNrnameMaxinputTabstandalonemaxatts_xmlHashTablexmlReallocFunc_codecvtversionspaceTabXML_DOCUMENT_FRAG_NODEinputMaxcompressionfwritexmlParserInputPtrxmlSAXLocator__off_tXML_ERR_NONEargvsigned charXML_HTML_DOCUMENT_NODEuserDataxmlElementContentTypeshort unsigned intXML_ENTITY_REF_NODEintSubNameGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinxmlValidStateelementDeclSAXFuncnbCharsxmlFreeFuncxmlAutomataendElementNsSAX2FuncxmlEnumerationPtrgetPublicIdstartElementSAXFunchasExternalSubsetSAXFunc_chainvstatexmlAutomataStateFILEdescerrNounparsedEntityDeclXML_ATTRIBUTE_ENUMERATIONxmlParserModespaceMaxendElementnodelenxmlNs__size_cur_columncdataBlocknsMaxxmlEntityattributeDeclSAXFunc__off64_t_unused2_IO_buf_baseexternalSubsetSAXFunchasPErefsvalidate/builddir/build/BUILD/libxml2-2.10.2/doc/examplesGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�DZ<4�F�B�A �A(�D@r
(A ABBA
�	
/)
?0Yt1��2��3�#G^	cw� !#%')012345/6��������*+,-.�
�%=K]ho�����.annobin_parse4.c.annobin_parse4.c_end.annobin_parse4.c.hot.annobin_parse4.c_end.hot.annobin_parse4.c.unlikely.annobin_parse4.c_end.unlikely.annobin_parse4.c.startup.annobin_parse4.c_end.startup.annobin_parse4.c.exit.annobin_parse4.c_end.exit.annobin_readPacket.constprop.0.start.annobin_readPacket.constprop.0.endreadPacket.constprop.0desc.annobin_main.start.annobin_main.end.LC0.LC1.LC2.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE_freadmainxmlCheckVersionfopenxmlCreatePushParserCtxtxmlParseChunkxmlFreeParserCtxtxmlFreeDocfclosexmlCleanupParserxmlMemoryDumpstderr__fprintf_chkfwrite__stack_chk_fail��������D�������� .��$, ( ) * +//�PF��������[1��������`G��������g������������������H���������I������������������I���������J���������K�����������������L��������M��������N��������O��������+2��������0P��������=O��������D2��������PP��������YO��������j2��������oP��������{O���������3���������Q���������R��������
"
'_
'�
'�
%p%
&*
'�8
'a
?
'�
M
'�Y
'-`
'�g
'�u
'0z
'��
'��
'�	�
'
�
'T�
'M
�
'p�
'�
'�
'B
'�
'�)
'6
'C
'$
P
'�]
'�j
'�w
'�
'��
'��
'r�
'��
'��
',�
'��
'd�
'x�
'2
'

'Z
 
'-
'�;
'�G
'�O
'0
v
'��
'�
'�
'��
'��
'��
'�
'L
'v 
'	-
'f:
'�G
'�T
'a
'N{
'��
'[�
'@�
'��
'(�
'e�
'�
'�
�
'u
'e)
'C
'P
'�]
'j
'mw
'4�
'��
'?�
'��
'�
'�
'��
'��
'm
'
'4%
'2
'�
?
'L
'�Y
'+f
's
'��
'��
'<�
'-�
'��
'�
'��
'��
'�
'�	�
'�
'�
'
'n+
'�
9
'�G
'MU
'#c
'fq
'_
'��
'Z�
'$�
'��
'T�
'�
�
'Y�
'��
'�
'I
'u
'9'
'y5
'�C
']Q
'�_
'�m
'$|
'�	�
'��
'��
'��
'E�
't�
'J�
'?�
'�	
'
'T!
'
0
'�?
'N
'�]
'�l
'D{
'(
�
'��
'��
'��
']�
'��
'�
'��
'�
	
'�	
' 	
'y/	
'�	>	
'�M	
'	\	
'�k	
'z	
'�	
'��	
'��	
'8�	
'��	
'��	
'��	
'�	�	
'X�	
'�

'�

'�.

'N<

'�J

'6X

'�f

'Z	t

'$�

'��

'�

'4�

'�

'�

'G	�

'��

'��

'�
'R
'
'a*
'�8
'�F
'T
'�b
'[p
'�~
'�
'~�
'�
�
'
�
'$�
'��
'��
'j�
'��
'C
'$
'�"
'�/
'�<
'�I
'V
'c
'�}
'q�
'��
'e�
'��
'b�
'��
'O�
'�
'�

'\

'�$

'�)

'PI

'�
O

'	U

'�[

'�
a

'@g

'�m

'�s

'�y

'�

'��

'~�

'?
�

'��

'/�

'`�

's
�

'��

'7�

'��

'��

'��

'��

'^�

'��

'��

'
'y	
'�
'�
'!
'}
'e+
'v7
'�D
'Q
'�_
'�w
')�
'$�
'��
'��
'��
'��
'�
'�
'�
'�
'9,
'9:
'�H
'V
'�p
'5~
'$�
'��
'��
'��
'��
'�
'�
'��
'X

'H
'm&
'k4
'bB
'�P
'�e
'.s
'$�
'��
'��
'��
'��
'�
'�
'��
'��
'4

'Q
'�)
'97
'mE
'a
'�}
'��
't�
'��
'��
'9�
'�
�
'��
'�
'��
'
'u
'�
'�
 
'�'
'.4
'A
'�O
'�]
'kk
'��
'�
'��
'��
'��
'L�
'd
�
'�
'��
'�
'e
'�"
'0
'�>
'TL
'�Z
'$h
'f�
'��
'0�
'$�
'��
'��
'��
'��
'�
'
'�)
'�	7
'�F
'._
'�	l
'�
''�
'e�
'��
'G�
'e�
'��
'��
':�
'&
'
'Q

'o*
'I7
'�D
'-Q
'^
'k
'x
'��
'��
'��
'Z
�
'_
�
'+�
'�
't�
'l
 
's,
'�1
'
C
'�O
';
T
'f
'>r
'
}
'�
�
'I�
'��
'��
'�
'[�
'��
'�
'��
'��
'<	
'=#
'�	0
'�=
'�J
'�W
'?p
'��
'I�
'&�
'�
�
'(�
'Q�
'��
'��
'��
'u�
'��
'
'�
'D&
'w3
'�M
'$Y
'Of
'�s
'e�
'N�
'i�
'��
'��
'�
�
'��
'��
'R�
'��
'?�
'R�
'��
'��
'��
'��
'��
':�
'o
'[	
'�
#
'U)
'�/
'�5
';
'�A
'H
';T
'F`
'-�
'�
'U
'�
'h	:
'PG
'o~
'3	�
'��
'L�
'�&
'�	I
'?g
'lt
'��
'��
'��
'��
'z
'r
'� 
'�-
'�:
'G
'&T
'�a
'�n
'�{
'�
'�
'P�
'�

' "
'�.
'x;
'�H
'�
U
'�b
'�	o
'&}
'�
'��
'��
'��
'g�
'��
'U 
'�A
'�M
'
Y
'4
e
'Hq
'�
}
'��
'��/�
'�
�
#�
#�
'��
#x�
#j�/x�
%0�
#�
#
%0
#o
#e!
#�%
#�.
#$2
#;/D/`
#�d
#�n/4��/V�/V�
#��
#��/s��/x /x 
#  
#* /�;  Q /�i /�� /�� /�� /�� /�!/�&!/6/!/6K!
#2O!
#0Y!/To!z!/T�!/d�!�!/�!/�!/�!/��!
'��!
'"
'+"
'n7"
'gT"
'
m"
'l"
'9�"
'k�"
'�	�"
'�"
'�	�"
'��"
#
#b#
#^#
#�#
#�*#3#
%?#
#�C#
#�L#
#�P#
#�Y#
#]#
#f#
#=j#
#9o#
%x#
#x|#
#v�#�#
'�	�#
'�	�#
'��#
'	�#
'D�#
'D�#
'�#
'�#
'2�#
'2�#
'��#
'��#
'��#
'��#
'q�#
'q$
'
$
'$
'�$
'�$
't#$
't+$
'r/$
'r4$
'l8$
'�//(/(#/G1/G9/OD/OL/�x/�/(�/(�/G�/G�/S�/S�/}�/}�/6�/6�/V�/V�/�/x$/�//7/6B/VJ/�o/�w/��/��/��/V�/x�/x�/��/��/��/��/��/V�/x$/�,/�7/�?/�J/�R/�]/�e/�p/x/(�/V�/x�/�/4��/V�/x�/x/� 2/6:/VEbju}�������=EPXx�
! /0/x8/�@/H/6P/VX/�px�/�/��/ 8/.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rodata.str1.8.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group>@84>T85>l86>�(87>�88 �@�b08&�,�6�41@�b�8
L$[$�V@`c08
u�����@�c08#�����@�c08������@�c08�t
8�@ d08#��@Pd�812O
@2h
#T�
A$O@�fH<8`�1�sy5�n@8��8!�:@~@0�H8#�V:��@x�P8%��::�@Ȭ08'�00>)�0YW.��W#�Wu�WL�W �W��W��W��W��W�W�W 4�Wp/@��086X�9C	�_�(�Edoc/alt-libxml2-devel/examples/parse4.c000064400000006725151730335250013733 0ustar00/**
 * section: Parsing
 * synopsis: Parse an XML document chunk by chunk to a tree and free it
 * purpose: Demonstrate the use of xmlCreatePushParserCtxt() and
 *          xmlParseChunk() to read an XML file progressively
 *          into a tree and xmlFreeDoc() to free the resulting tree
 * usage: parse4 test3.xml
 * test: parse4 test3.xml
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

#ifdef LIBXML_PUSH_ENABLED
static FILE *desc;

/**
 * readPacket:
 * @mem: array to store the packet
 * @size: the packet size
 *
 * read at most @size bytes from the document and store it in @mem
 *
 * Returns the number of bytes read
 */
static int
readPacket(char *mem, int size) {
    int res;

    res = fread(mem, 1, size, desc);
    return(res);
}

/**
 * example4Func:
 * @filename: a filename or an URL
 *
 * Parse the resource and free the resulting tree
 */
static void
example4Func(const char *filename) {
    xmlParserCtxtPtr ctxt;
    char chars[4];
    xmlDocPtr doc; /* the resulting document tree */
    int res;

    /*
     * Read a few first byte to check the input used for the
     * encoding detection at the parser level.
     */
    res = readPacket(chars, 4);
    if (res <= 0) {
        fprintf(stderr, "Failed to parse %s\n", filename);
	return;
    }

    /*
     * Create a progressive parsing context, the 2 first arguments
     * are not used since we want to build a tree and not use a SAX
     * parsing interface. We also pass the first bytes of the document
     * to allow encoding detection when creating the parser but this
     * is optional.
     */
    ctxt = xmlCreatePushParserCtxt(NULL, NULL,
                                   chars, res, filename);
    if (ctxt == NULL) {
        fprintf(stderr, "Failed to create parser context !\n");
	return;
    }

    /*
     * loop on the input getting the document data, of course 4 bytes
     * at a time is not realistic but allows to verify testing on small
     * documents.
     */
    while ((res = readPacket(chars, 4)) > 0) {
        xmlParseChunk(ctxt, chars, res, 0);
    }

    /*
     * there is no more input, indicate the parsing is finished.
     */
    xmlParseChunk(ctxt, chars, 0, 1);

    /*
     * collect the document back and if it was wellformed
     * and destroy the parser context.
     */
    doc = ctxt->myDoc;
    res = ctxt->wellFormed;
    xmlFreeParserCtxt(ctxt);

    if (!res) {
        fprintf(stderr, "Failed to parse %s\n", filename);
    }

    /*
     * since we don't use the document, destroy it now.
     */
    xmlFreeDoc(doc);
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    /*
     * simulate a progressive parsing using the input file.
     */
    desc = fopen(argv[1], "rb");
    if (desc != NULL) {
	example4Func(argv[1]);
	fclose(desc);
    } else {
        fprintf(stderr, "Failed to parse %s\n", argv[1]);
    }

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
#else /* ! LIBXML_PUSH_ENABLED */
int main(int argc, char **argv) {
    fprintf(stderr, "Library not compiled with push parser support\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/io1.c000064400000007253151730335250013222 0ustar00/**
 * section: InputOutput
 * synopsis: Example of custom Input/Output
 * purpose: Demonstrate the use of xmlRegisterInputCallbacks
 *          to build a custom I/O layer, this is used in an
 *          XInclude method context to show how dynamic document can
 *          be built in a clean way.
 * usage: io1
 * test: io1 > io1.tmp && diff io1.tmp $(srcdir)/io1.res
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xinclude.h>
#include <libxml/xmlIO.h>

#ifdef LIBXML_XINCLUDE_ENABLED
static const char *result = "<list><people>a</people><people>b</people></list>";
static const char *cur = NULL;
static int rlen;

/**
 * sqlMatch:
 * @URI: an URI to test
 *
 * Check for an sql: query
 *
 * Returns 1 if yes and 0 if another Input module should be used
 */
static int
sqlMatch(const char * URI) {
    if ((URI != NULL) && (!strncmp(URI, "sql:", 4)))
        return(1);
    return(0);
}

/**
 * sqlOpen:
 * @URI: an URI to test
 *
 * Return a pointer to the sql: query handler, in this example simply
 * the current pointer...
 *
 * Returns an Input context or NULL in case or error
 */
static void *
sqlOpen(const char * URI) {
    if ((URI == NULL) || (strncmp(URI, "sql:", 4)))
        return(NULL);
    cur = result;
    rlen = strlen(result);
    return((void *) cur);
}

/**
 * sqlClose:
 * @context: the read context
 *
 * Close the sql: query handler
 *
 * Returns 0 or -1 in case of error
 */
static int
sqlClose(void * context) {
    if (context == NULL) return(-1);
    cur = NULL;
    rlen = 0;
    return(0);
}

/**
 * sqlRead:
 * @context: the read context
 * @buffer: where to store data
 * @len: number of bytes to read
 *
 * Implement an sql: query read.
 *
 * Returns the number of bytes read or -1 in case of error
 */
static int
sqlRead(void * context, char * buffer, int len) {
   const char *ptr = (const char *) context;

   if ((context == NULL) || (buffer == NULL) || (len < 0))
       return(-1);

   if (len > rlen) len = rlen;
   memcpy(buffer, ptr, len);
   rlen -= len;
   return(len);
}

const char *include = "<?xml version='1.0'?>\n\
<document xmlns:xi=\"http://www.w3.org/2003/XInclude\">\n\
  <p>List of people:</p>\n\
  <xi:include href=\"sql:select_name_from_people\"/>\n\
</document>\n";

int main(void) {
    xmlDocPtr doc;

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    /*
     * register the new I/O handlers
     */
    if (xmlRegisterInputCallbacks(sqlMatch, sqlOpen, sqlRead, sqlClose) < 0) {
        fprintf(stderr, "failed to register SQL handler\n");
	exit(1);
    }
    /*
     * parse include into a document
     */
    doc = xmlReadMemory(include, strlen(include), "include.xml", NULL, 0);
    if (doc == NULL) {
        fprintf(stderr, "failed to parse the including file\n");
	exit(1);
    }

    /*
     * apply the XInclude process, this should trigger the I/O just
     * registered.
     */
    if (xmlXIncludeProcess(doc) <= 0) {
        fprintf(stderr, "XInclude processing failed\n");
	exit(1);
    }

#ifdef LIBXML_OUTPUT_ENABLED
    /*
     * save the output for checking to stdout
     */
    xmlDocDump(stdout, doc);
#endif

    /*
     * Free the document
     */
    xmlFreeDoc(doc);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
#else
int main(void) {
    fprintf(stderr, "XInclude support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/parse2.o000064400000126330151730335250013740 0ustar00ELF>X�@@:9	

-/,0+1*2GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS����t��AT�
RUSH���L�c�H��H��tc�1�L��H���H��H��th���t!H���H�����[1�]A\�H�=L��1�H���H�
�"�H�=��H�=L��1�H���Failed to allocate parser context
Failed to parse %s
Failed to validate %s
1"�5Eint�m�m���1%	3f	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D>`	FDh	Hfp	Ift	Jtx	MQ�	NX�	OJ�	QZ�	Y
��	[e�	\p�	]D�	^	C�	_
)�	`f�	bv��
+9��Z
51`k��
5��%�����f�������	E�
&
@}�	~C	y	��	�g	�
 raw�
(	�	f0	�	f4	�58
��
# �h4{buf6�	8�	9�	:�
cur;�
 end<�
(	=	f0	>	f4col?	f8	E5@	F�H	G�
P	H�
X	I	f`idJ	fd
$��
&����	sax�O	�C	�v	�f	�f	��
 	��
(	�f0	�f4	�{8	�f@	�fD	�UH	�VP	�fX	�f\	�h`	�	fh	�7p	�	f�	�
f�	�f�	�f�	�f�	�f�	�����f����
 �f(�f,�[0�m8�m@�fH�fL�fP��
X��`��h�ap�fx�f|�a��f��{��f��f��f��f�C�f�f�C�f�f���[�	f�
f��
��
��
�f�f�f[ag� �(f0f4$f8%f<&V@'fH(0P-�X.2�/5�05�3+�4f�5f�6+�8f�95�
'�	�
)�	 A�	B|C|D�E�
*
�	�����>�K�X�� ��(�10�h8�u@��H��P�X�3`�Qh�^p��x������� ���"��������$��1��$��
�����<��C��e�������
0��
&�	
'C	
(�
	
)�
	
*T	
+T 	
,I(	
-T0	
.T8doc
/�@	
1�H	
2�P	
3fX	
4�\	
5�
`	
6�
h	
8�pURI
9�
x	
:f�	
;f�
1���
i

r

<
��
	


�%
�<
�		

��

� !
�I	
� [	
��

�U!x
�O
�C
��

��

�T
�T 
�T(
�T0
�T8doc
��@ns
�aH
��P
�CX
�a`
�Ch
�Qp
�Qraa�
�I
�C
��

��

�T
�T 
��(
�T0
�T8doc
��@
�CH
�CP
�CX
�C`
��
h
��
p
�CxZ�
'�
(C
)�

*�
+T
,T 
-T(
.T0
/T8doc
0�@
3fH
4fL
:IP
;IX
<g`
=�
h
>�
pids
?Cx
@C�URL
A�
�
Bf�
D��
EC�
Ff�
Hf�O<
�
�<
"
'�
0#+0
2�
3�
4
5 �
c1
6 �c2
7 �
8 � 
9 �
(
1�+���
w�

��0
�a
�g
��
��

��

�C 
��(��
�z`
�0
�C
��

��

�T
�T 
�T(
�C0
�C8doc
��@ns
�aH
�	P
�CX
�=mz
�a
�cI
%O
&�i������C�
<��LXN�	O
f	P
f	Q�	R�	S�	T
f 	U�(	V�0	W�8	X
f@	Y
fD	ZCH	[CPM����C�Z��
C�'
%"9&J-\P*�9�P�pRh	SC	Tg	Us	XV	Yf 	Zf$	[h(	]<0doc^v8	_f@	baH	cfP	dfT	eaXamh`	i>hV<
�
n�2����T#�(W+	X1	Z5	[5	\5	]5 �O`&Cbx	c5	d5	e+fn� 	

�x<�2���J	
{�
f>!�
|Cm!f�C�^��!{�C�
�
j���C�
�
�
w��
!�$C�
�
�>DhC�
f�
�
�������C�
�
ff�
I����C�
f����C�
�
�
�
�#3C�	�@FQC�@�kq�C�
[���C�
�
�)���C�
f5�@�J�T�`�j�v��������rx�C�
�
�
f[ff[��Cc��!f��a�aELy��((�g	�!�	� �	� 	� �	� � �!s6��!f�C�f?�9@B3��!C�)M��!C
C)W!�+����������
<D @�"""""" "@"�###### #@$2f��a!%2f%2a!&g!=-!'t!()�!)�!*�!* '�!+�!,�!-T1-Q	-R|*�!	i '�!+�!,�!-U	-T1-Q"*�!&	� .�!
�+�!,�!-T1-Q	-R|/�!0�!� -Us-T|-Q0-R@0�!!-Uv,"-Us0"F!-U

R/"/("�1�!2�3�	4docv5df�!2d�2d<�6Z78�8�8
8�6896�%U:;9I$>&I$>I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!
:;9I8:;9
:;9I8
:;9I8:;9
:;9I8:;9>I:;9(
:;9I8>I:;9:;9I'I (
!'I"(#($.?:;9'I@�B%:;9I�B&1R�BUXYW'1�B(U)41�B*1R�BXYW+1,��1-���B.1/��10��11.:;9' 2:;9I34:;9I44:;9I5.?:;9'I 46.?<n:;97.?<n:;8.?<n:;9U�U�TS�T�\\PSSPSPVPVPV
�
�,����
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlparse2.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlIO.hparser.hentities.hdict.hhash.hxmlerror.hxmlautomata.hvalid.hiconv.hencoding.hxmlmemory.hglobals.hxmlversion.h<built-in>!	1K�!j 	.!wX	XZ[J�] >	\���\Y/bJ:
�.	��
��	4>
�parentnodeInfoTablastErrorexternalfatalErrorSAXFuncXML_INTERNAL_GENERAL_ENTITYxmlAttributeTypexmlParserInputBuffer_shortbufhasInternalSubsetSAXFunc_IO_lock_t_xmlAutomataoutputXML_ELEMENT_CONTENT_ORisStandalonestderrfreeAttrsxmlErrorLevelspaceNr_IO_buf_end_privatemessage_xmlDtdflags_xmlEntitybufferinternalSubsetSAXFuncentitiesxmlErrorPtrXML_PARSER_MISCvstateNrXML_ELEMENT_CONTENT_ELEMENTXML_ELEMENT_CONTENT_PLUS_IO_write_endXML_PARSER_STARTXML_ATTRIBUTE_CDATAnextresolveEntitySAXFunc_xmlNode_freeres_listrawconsumedXML_PARSE_OLD10xmlChar_flagsXML_PARSER_PUBLIC_LITERALXML_ELEMENT_CONTENT_ONCEreferenceSAXFunccatalogsrefsdictNamespentities_xmlStartTagXML_PARSE_DTDLOAD_flags2XML_PARSE_IGNORE_ENCbegin_pos_xmlNs_old_offsetetypelevel__builtin_fwritemyDocxmlCharEncodingOutputFuncXML_ERR_ERRORXML_PARSE_NSCLEANintSubseterrorcharactersendDocumentSAXFuncstartDocumentSAXFuncfilenameprevunparsedEntityDeclSAXFuncXML_PARSER_PROLOG_xmlSAXLocatorXML_TEXT_NODEend_linecompressedendDocumentreference_xmlValidStatecommentdisableSAXXML_DTD_NODEnodeTabbegin_linexmlNewParserCtxtnexteXML_PARSE_UNKNOWNprocessingInstructionSAXFuncXML_ENTITY_DECLsizeentitiesstdoutsax2startElementNs_IO_save_endXML_PARSER_ENTITY_VALUEfatalErrorXML_INTERNAL_PREDEFINED_ENTITYxmlElementContentXML_INTERNAL_PARAMETER_ENTITYxmlStartTagXML_PARSER_COMMENT_xmlParserInputbaseignorableWhitespaceSAXFunclong long unsigned intvstateMaxxmlStrdupFuncXML_COMMENT_NODEstartElementwarningwellFormedendElementNsconsumedfilenodeInfoMaxfreeElemsNrxmlParserInputXML_NAMESPACE_DECLatts_xmlParserNodeInfoSeqxmlDocPtrentityDeclSAXFuncsys_errlistXML_PARSE_NOCDATAinSubsetnsWellFormedxmlNsTypexmlCleanupParser_offsetXML_PARSER_ATTRIBUTE_VALUEXML_ERR_WARNINGextSubsetsys_nerrownerinitializedXML_PARSE_RECOVERfprintf_filenoXML_EXTERNAL_GENERAL_PARSED_ENTITYXML_PARSE_XINCLUDEgetParameterEntitySAXFuncserrorend_posencoderprefixXML_PARSER_END_TAGxmlParserInputDeallocatesize_tentityDeclparse2.cXML_PARSE_PEDANTICwarningSAXFunc_markersXML_XINCLUDE_ENDXML_PARSE_NOBASEFIX_xmlBufnodeNrinputNrnotationDecl_IO_read_basexmlDocxmlElementContentOccurprogressiveXML_EXTERNAL_PARAMETER_ENTITY_xmlErrorentityXML_PARSER_SYSTEM_LITERALstr1str2str3XML_PARSER_DTDexampleFuncfreeXML_PARSER_ENTITY_DECLnodememXML_PARSE_NOBLANKScodestartDocumentlast__fmtxmlBufXML_ATTRIBUTE_NODEnodeInfo_xmlParserInputBuffernotationDeclSAXFuncsetDocumentLocatorresolveEntityXML_PARSE_DTDVALIDgetEntitySAXFuncXML_ATTRIBUTE_ENTITIESxmlNodeXML_PARSE_DTDATTRxmlAttrvalidnbentitiesloadsubset__streamcharatype__fprintf_chkgetSystemIdiconv_indocdictsetDocumentLocatorSAXFuncstr_xml_nsxmlMallocAtomicpushTab_IO_marker_xmlAutomataState_IO_read_ptrint1int2xmlDictxmlStructuredErrorFuncfreeAttrsNrextSubURIXML_CDATA_SECTION_NODEXML_PARSE_HUGEunsigned intxmlParserInputStateexternalSubsetxmlValidityErrorFuncXML_EXTERNAL_GENERAL_UNPARSED_ENTITYxmlAutomataStatePtrxmlAttrPtroldNsstr_xmlnsXML_ATTRIBUTE_IDXML_PARSE_NONETprocessingInstruction_IO_write_basexmlMallocFuncmainlong long intXML_ENTITY_NODESystemIDchildrenXML_XINCLUDE_STARTXML_PARSE_NOENTerrorSAXFunc_IO_save_baseiconv_out_xmlAttrdepthxmlParserCtxtnameNrhrefextSubSystemcontextdictparseModeignorableWhitespaceclosecallbackxmlDictPtrsizeentcopyinput_idXML_PARSE_BIG_LINES_xmlSAXHandlercharsetxmlValidCtxtrecoverynsTabparseFlagsxmlAutomataPtr_freeres_buf_IO_backup_baseXML_NOTATION_NODExmlError__pad5long unsigned intXML_ATTRIBUTE_DECLinputdirectoryXML_PARSER_PIxmlCharEncodingInputFuncxmlMemStrdupargcXML_ELEMENT_NODEXML_ELEMENT_CONTENT_PCDATAXML_PARSE_NOERRORXML_ELEMENT_CONTENT_MULT_modeXML_PARSE_PUSH_DOMXML_PARSER_EPILOGlong doublegetLineNumbernameTabtokenxmlMemoryDumpattsDefaultxmlFreeDocxmlElementTypexmlMallocpsvi_xmlValidCtxthasExternalSubsetxmlCtxtReadFilelinenumberscdataBlockSAXFunccharactersSAXFuncXML_ATTRIBUTE_ENTITYinstatexmlParserNodeInfoSeqnsDefXML_PARSER_CONTENTXML_PARSER_CDATA_SECTIONocur_IO_read_endXML_ATTRIBUTE_NOTATIONXML_PARSE_OLDSAXXML_PARSE_NOXINCNODEshort intxmlSAXLocatorPtrendElementSAXFuncxmlHashTableXML_DOCUMENT_TYPE_NODEXML_PARSER_START_TAGXML_ELEMENT_CONTENT_SEQXML_PARSE_READERctxtlong intpropertiesattallocsinternalSubsetoptionslengthreplaceEntitiesxmlInputReadCallbackchecked_xmlElementContentcheckIndexnodeMaxxmlEntityTypeXML_DOCUMENT_NODEattsSpecial_IO_wide_datastr_xmlnodeXML_PARSE_COMPACTxmlReallocgetEntity_xmlDochasInternalSubsetxmlFreexmlBufPtrkeepBlanksxmlHashTablePtrxmlParserNodeInforeadcallbackXML_PI_NODExmlInputCloseCallbackextraXML_ATTRIBUTE_IDREFXML_PARSER_IGNOREfreeElemsnodeInfoNrpedanticnamestateXML_PARSE_PUSH_SAX_xmlDictstartElementNsSAX2Func_lockxmlFreeParserCtxt_vtable_offsetxmlEntityPtrXML_PARSE_NOWARNINGXML_PARSER_EOF_wide_dataxmlCharEncodingHandlermaximumnode_seq_xmlEnumeration_xmlParserNodeInfogetColumnNumber_IO_codecvtcommentSAXFuncxmlNodePtrstdin_IO_FILExmlCharEncodingHandlerPtrrecord_infovstateTabxmlValidityWarningFuncXML_ELEMENT_DECLorigxmlEnumerationXML_ATTRIBUTE_IDREFSXML_ELEMENT_CONTENT_OPTXML_ATTRIBUTE_NMTOKENSXML_PARSE_DOMtypeunsigned charxmlCheckVersionvctxtgetParameterEntityhtmllineencodingXML_ERR_FATALattributeDecl_IO_write_ptriconv_tnotationsExternalIDattributes_xmlCharEncodingHandlerdomaincontentspacexmlElementContentPtr_xmlParserCtxtXML_PARSE_SAXxmlParserInputBufferPtrisStandaloneSAXFuncXML_ATTRIBUTE_NMTOKENelementDeclnsNrnameMaxinputTabstandalonemaxatts_xmlHashTablexmlReallocFunc_codecvtversionspaceTabXML_DOCUMENT_FRAG_NODEinputMaxcompressionfwritexmlParserInputPtrxmlSAXLocator__off_tXML_ERR_NONEargvsigned charXML_HTML_DOCUMENT_NODEuserDataxmlElementContentTypeshort unsigned intXML_ENTITY_REF_NODEintSubNameGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinxmlValidStateelementDeclSAXFuncnbCharsxmlFreeFunchasExternalSubsetSAXFuncxmlAutomataendElementNsSAX2FuncxmlEnumerationPtrgetPublicIdXML_PARSE_NODICTstartElementSAXFuncXML_PARSE_SAX1_chainvstatexmlAutomataStateFILEerrNounparsedEntityDeclXML_ATTRIBUTE_ENUMERATIONxmlParserModespaceMaxendElementnodelenxmlNselementsxmlParserCtxtPtr_cur_columncdataBlocknsMaxxmlEntityattributeDeclSAXFunc__off64_t_unused2_IO_buf_baseexternalSubsetSAXFunchasPErefsvalidate/builddir/build/BUILD/libxml2-2.10.2/doc/examplesGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�,�Q�F�A �W
CBA
�	.)?/Yt0��1��2�� "$&(/01234.5#(-2>Ncw)*+,-���������%.annobin_parse2.c.annobin_parse2.c_end.annobin_parse2.c.hot.annobin_parse2.c_end.hot.annobin_parse2.c.unlikely.annobin_parse2.c_end.unlikely.annobin_parse2.c.startup.annobin_parse2.c_end.startup.annobin_parse2.c.exit.annobin_parse2.c_end.exit.annobin_main.start.annobin_main.end.LC2.LC0.LC1.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlNewParserCtxtxmlCtxtReadFilexmlFreeDocxmlFreeParserCtxtxmlCleanupParserxmlMemoryDumpstderr__fprintf_chkfwrite * $ % & '++�A��������%B��������?C��������XD��������`E��������eF��������jG��������xH���������-���������I���������H���������.���������J���������H���������/���������I��������

#q
#
#7
!0%
"*
#	8
##?
#�H
#�T
#?[
#�b
#�p
#%u
#��
#��
#�
�
#�
#E�
#�
#G�
#��
#Z�
#M�
#�
#
#!
#�.
#�
;
#�H
#FU
#b
#go
#�|
#��
#��
#J�
#z�
#2�
#��
#v�
#��
#�
#�
�
#
#�
#�&
#02
#�:
#�
a
#�l
#��
#�
#��
#��
#2�
#��
#=�
#e
#�	
#*
%
#{2
#U
?
#�L
#=f
#s
#r�
#!�
#��
#M�
#��
#��
#N�
#�
#Z
##.
#';
#C	H
#(U
#b
#F|
#��
#
�
#��
# �
#(�
#�
#a�
#�
#(
#F
#
#H*
#�7
#�D
#=Q
#�^
#|k
#�x
#[�
#>�
#��
#5�
#��
#$�
#�
#c
�
#.�
#�
#�
#5
#N$
#�2
#
@
#5N
#-\
#qj
#�x
#N�
#C�
#��
#f�
#Z�
#
�
#��
#��
#v�
#�
#�
#� 
#�
.
#�<
#_	J
#�X
#g
#t
v
#��
#��
#�
�
#��
#2
�
#o�
#Q�
#�
�
#��
#
#�

#�*
#09
#�H
#�
W
#9f
#�
u
#I�
#��
#��
#R�
#��
#A�
#��
#N�
#��
#	
#7
	
#i
)	
#�8	
#�	G	
#�V	
#5e	
#t	
#z
�	
#n
�	
#��	
#��	
#��	
#��	
#�
�	
#�	
#��	
#�


#�


#C'

#�5

#*C

#�Q

#�	_

#m

#{

#��

#?�

#$�

#;�

#�	�

#	�

#�

#��

#�

#"
#x
#A
#
#D1
#;?
#M
#r[
#i
#w
#��
#��
#A�
#�
#��
#�
#��
#��
#2�
#
#�

#�
#�'
#�	4
#A
#�N
#�h
#|u
#��
#Z�
#�
#m�
#��
#�
#;�
#��
#Y

#�	

#t

#D4

#�:

#�	@

#�F

#dL

#RR

#�X

#�^

#�d

#�j

#�p

#�v

#|

#	�

#N�

#k�

#5�

#��

#\�

#��

#O�

#`�

#��

##�

#��

#��

#��

#*
�

#�

#��

#N
#T

#T
#�"
#�/
#�<
#�J
#�b
#
p
#~
#��
#��
#��
#�	�
#�
#��
#��
#�	
#.
#%
#y3
##A
#�[
#$i
#w
#��
#��
#��
#�	�
#�
#��
#��
#c�
#�
#x
#Z
#m-
#�;
#�P
#"^
#l
#�z
#��
#��
#�	�
#�
#��
#��
#��
#F�
#h
#(
#"
#0
#(L
#�h
#�
v
#2
�
#y�
#�
�
#.�
#��
#��
#��
#��
#)�
#f�
#�
#�
#�
#�
#;,
#�:
#�H
#BV
#�~
#�
#��
#��
#|�
#�
#/�
#�
#c
�
#��
#��
#�

#�
#�)
#
7
#�E
#S
#*
n
#[
{
#��
#�
#��
#��
#��
#�	�
#�
#��
#�
#�
"
#y1
#J
#A
W
#
j
#�w
#��
#��
#Y�
#Y�
#��
#�
#H�
#1�
#��
#
#�
#�"
#z	/
#<
#I
#0V
##c
#	p
#	}
##	�
#%�
#*�
# �
#��
#c�
#7
#�
#�
#�
.
#:
#?
#�Q
#P]
#,h
#�t
#T�
#�
�
#~�
# �
#r�
#�
#��
#|�
#��
#[�
#,
#c

#(
#5
#�B
#J[
#�}
#8�
#o�
#��
#M�
#��
#�
#��
#��
#i�
#��
#��
#�
#c
#�
#8
#�D
#tQ
#�^
#Zk
#=�
#z�
#��
#o�
#X�
#(	�
#��
#w�
#��
#�
#)�
#��
#H	�
#��
#��
#��
#�
#��
#L�
#�
#�
#�
#� 
#�&
#�,
#3
#h?
#kK
#��
#��
#D�
#�
#
%
#�2
#�i
#�	v
#��
#^�
#�
#�
4
#�R
#�_
#��
#��
#�
#��
#��
#��
#�
#�
#7%
#�2
#&?
#�L
#�Y
#�f
#�
#��
#[�
#f
#.

#�
#�&
#�3
#H@
#�M
#�
Z
#�h
#$z
#q�
#��
#��
#y�
#i�
#g
#�,
#o8
#�
D
#
P
#<\
#w
#M}
#��
#��
#I
�
#
�
#��
#f�
#$�
#g	�
#�
#��
#4�
#��
#V�
#��
#|�
#��
#-�
#`�
#{
#k
#�
#�

#w*+A
#�L
P
U
#�`
Cd
=m+$v
!�
��
��
!�
��
��
N�
B�+u�+u�
��
��+�� +� +�5 
9 
�C +�T n +�w +�� � +�� � +)� +C!+\!+d.!+ G!+iT!+nh!
#7	u!
#��!
# �!
#_�!
#
�!
#�	�!
#�
�!
#�
�!
#��!
#�!
#n�!
#n�!
#��!
#��!
#U�!
#U"
#8"
#8"
#�"
#�"
#� "
#�)"
#;-"
#;++++�C+K+V+^+,i+,q+��+$�+d�+u�+��+,�+B�+B�+o�+u+�+�+�+�'+�N+FV+Ta+Ti+dt+u|+��+��+��+��+��+��+��+u�+��+�+�
++$+d+u+�0+8+��+ +.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.8.rodata.str1.1.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group9@709P719h729�(739�74�!�'�1��,@[07	G�V��Q@8[07ph�h�@h[07<�<��@�[07����@�[07��	8�@�[07 �@(\�7,2�#;2+OF5"J@�]�97[{.n�1,i@8��7 ~�30y@(�07"��3P�@X��7$�/4��@�7&�0�6i�03Q.�aQaQpaQGaQaQ�aQ�aQ�aQ�aQaQhQ /�QH*@�75�Q8?	�X,�@doc/alt-libxml2-devel/examples/reader1.o000064400000060040151730335250014062 0ustar00ELF>�Q@@98	

,.+/*0)1GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS����t��AW�
RAVAUATUSH��H���H�C1�1�H��H�$�H��H���-fDH�������H���H��H��H��H�HD��H��I���H��A���H��A���H��A���H��E��I��AU��D��H�5�1��XZM��t@L���L��(~H�5�1���O���H�5�1���7����
��(���H�߉D$��D$��u��H��1�[]A\A]A^A_�H�$H�=H�1�����H�$H�=H�1����--%d %d %s %d %d %.40s...
 %s
%s : failed to parse
Unable to open %s
{	�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��
9*C
B36<CK)
MW]CqC)
W}�����*�*�K�
�qc�j��Na��NaN	Y�".;B
�HT`m$#1~�U1T	RXvY~m-
~~�U1T	Q|m/�~�U1T	m*~�U:�/Us�GUs�_Us�wUs	�Us	�Us	U|� G
��(	T1Q	Rw� J	~�
��(	T1Q	Rw4	�UwT0Q0A	�UsM	UsY	�U

R e	 r	�!:;":�#;�$ret<	a!m"�#�#�%ka�"k �&%da�"d�"d<�&'\(�
)'�'�'�'�'�'�'	U'Z*I'�'v'
*9'
�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!'I'I.?:;9'I@�B:;9I�B1R�BUXYW1�BU41�B1R�BXYW��1���B��111 ��1!.:;9' ":;9I#4:;9I$4:;9I%.?:;9'I 4&'.?<n:;9(6).?<n:;*.?<n:;9U�U�TS�T�Pw��wwPSSPSP1�P����SSPVVP\Q\
�
�
��
�,��U�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlreader1.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.hxmlmemory.hglobals.hxmlreader.hxmlversion.hparser.h<built-in>!	�K�!j 	.!wX	�!w	JZeJtaJX=	�	�
�X
�::=tL
Z
:>X��
J��.	[

���<
Y>
tB<
.
VgX�
�	XtY�\YI/ 
c�
�.	d
<�_IO_buf_endxmlMallocAtomic__printf_chkxmlReallocFuncxmlFreesys_nerr__fprintf_chkshort intsize_txmlMemStrdup_offsetputchar_freeres_listxmlCheckVersionxmlTextReaderNodeType_IO_write_ptr_flags_IO_buf_base_freeres_bufxmlTextReaderConstNamevaluexmlFreeFuncxmlTextReaderHasValue/builddir/build/BUILD/libxml2-2.10.2/doc/examplesfilenameargv_IO_read_endxmlMallocstderrGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinxmlTextReader_locklong intprintf_cur_column_markersfprintfxmlChar_IO_write_basereadername_vtable_offset_IO_FILElong doubleunsigned charargcsigned char_codecvtlong long unsigned intxmlStrlenunsigned int_IO_marker_shortbufxmlTextReaderPtr_old_offset_chain_unused2_IO_read_ptrshort unsigned intxmlReaderForFilexmlFreeTextReadercharreader1.cmainxmlTextReaderConstValue_wide_dataxmlTextReaderRead__pad5__builtin_putcharxmlStrdupFunc_IO_codecvt__fmtlong unsigned int_IO_save_end_IO_write_end__off64_t_filenoxmlRealloc__off_tstreamFile_IO_backup_basestdin_flags2_mode_IO_read_basexmlTextReaderIsEmptyElement_IO_wide_dataxmlMallocFunc_IO_save_basesys_errlistFILEprocessNodexmlTextReaderDepth__stream_xmlTextReaderxmlCleanupParserxmlMemoryDumpstdoutlong long int_IO_lock_tGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�T�Q�G�B �B(�A0�A8�GP�XH`YXAPv
8C0A(B BBBA
�	-+B.]y/��0��1�!#%'./0123-4-27<A"F8KWg|�()*+,�������4Pfy�������.annobin_reader1.c.annobin_reader1.c_end.annobin_reader1.c.hot.annobin_reader1.c_end.hot.annobin_reader1.c.unlikely.annobin_reader1.c_end.unlikely.annobin_reader1.c.startup.annobin_reader1.c_end.startup.annobin_reader1.c.exit.annobin_reader1.c_end.exit.annobin_main.start.annobin_main.end.LC0.LC1.LC2.LC3.LC4.LC5.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupmain_GLOBAL_OFFSET_TABLE_xmlCheckVersionxmlReaderForFilexmlTextReaderReadxmlTextReaderConstNamexmlTextReaderConstValuexmlTextReaderHasValuexmlTextReaderIsEmptyElementxmlTextReaderNodeTypexmlTextReaderDepth__printf_chkxmlStrlenputcharxmlFreeTextReaderxmlCleanupParserxmlMemoryDumpstderr__fprintf_chk ) # $ % &**�&C��������:D��������TE��������eF��������u,��������~G���������H���������I���������J���������K���������-���������L���������M���������.���������L��������/��������L��������N��������0O��������=P��������BQ��������^R��������e0��������qS��������~R���������1���������S��������

"�
"�
"'
 �%
!*
"a8
"I?
"5H
"�O
"�V
"�]
"Wk
"xp
"�|
"v�
"��
"��
"��
"��
"g�
"��
"��
"��
"h
"�
"
")
"�6
"[C
"�P
"t]
"�j
"�w
"h�
"��
"��
"M�
"r�
"u�
"�
"��
"��
"��
"
"�
"{!
"*-
"�5
"B\
"7g
"��
"��
"��
"~�
"@�
"�
"�
"�	
"�
"+
"L
")r
")�
"�
"t�
"�
"��
"8�
"h�
"d�
"W�
"W�
"�*
"�&
*
/
"b:
C>
=G*9P
 `
�d
�i
 r
v


��
��*a�
 @�
�
�
 @�
D�
>�
��
��*��*��
��
��*�6*�?
 pO
!S
X*�n�*�*�
O�
M�*��*�*�
}�
{*#*i0*�H*�`*�x*��*��*��*W�*W�
��
��*u"!*w**wH8W*�m8*>�*X�*4�**�*A�*F

"�
"Y#
"�<
"/I
"�U
"�a
"�n
"�
"C�
"��
"N�
"C�
"�
"�
"}�
"�
"��
"��
"��
"��
"�
"�
"��
"�	
"�		
"�	
";	
";	
"+!	
"+)	
"I-	
"I5	
"�9	
"�B	
"�F	
"�N	
"�R	
"�Z	
"�^	
"�f	
"fj	
"fs	
"ww	
"w****�C*K*)V*)^*Ai*Aq*��*9�*=�*=�*��*��*��*��*<�*W�*�*A*J**J2*M=*WE*wP*wX*�c*�k*��*X�*a�*a�*(�*(�*3�*3�*<�*W�*w*a**#*(D*rL*yW*y_*j*r*(�*��*��*��*�*�*�*�*(�*��*�!*�)*4O*W*b}*�*(�
��*W�*w�"
**.*5*9*< *W(*�@*aH*P*X*(p*�x*��*��*�*�*�d* *.symtab.strtab.shstrtab.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.1.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group*@62*P63*h64*�(65*�66�!�'�1��,@x106	G�V��Q@�106ph�h�@�106<�<��@206����@8206��	8�@h206 �@�2�6,2�K@
	;@ 5�6L�._��Z@�F�6o�0j@�M06!���~@�M�6#�r��@xO6%�0U ��0�%.�(&(&p(&G(&(&�(&�(&�(&�(&�(&(&  H&p@�O64�&�7A	�.��O1doc/alt-libxml2-devel/examples/io2.c000064400000002254151730335250013217 0ustar00/**
 * section: InputOutput
 * synopsis: Output to char buffer
 * purpose: Demonstrate the use of xmlDocDumpMemory
 *          to output document to a character buffer
 * usage: io2
 * test: io2 > io2.tmp && diff io2.tmp $(srcdir)/io2.res
 * author: John Fleck
 * copy: see Copyright for the status of this software.
 */

#include <libxml/parser.h>

#if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
int
main(void)
{

    xmlNodePtr n;
    xmlDocPtr doc;
    xmlChar *xmlbuff;
    int buffersize;

    /*
     * Create the document.
     */
    doc = xmlNewDoc(BAD_CAST "1.0");
    n = xmlNewDocNode(doc, NULL, BAD_CAST "root", NULL);
    xmlNodeSetContent(n, BAD_CAST "content");
    xmlDocSetRootElement(doc, n);

    /*
     * Dump the document to a buffer and print it
     * for demonstration purposes.
     */
    xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
    printf("%s", (char *) xmlbuff);

    /*
     * Free associated memory.
     */
    xmlFree(xmlbuff);
    xmlFreeDoc(doc);

    return (0);

}
#else
#include <stdio.h>

int
main(void)
{
    fprintf(stderr,
            "library not configured with tree and output support\n");
    return (0);
}
#endif
doc/alt-libxml2-devel/examples/reader4.c000064400000006071151730335250014055 0ustar00/**
 * section: xmlReader
 * synopsis: Parse multiple XML files reusing an xmlReader
 * purpose: Demonstrate the use of xmlReaderForFile() and
 * xmlReaderNewFile to parse XML files while reusing the reader object
 * and parser context.  (Note that the XMLReader functions require
 * libxml2 version later than 2.6.)
 * usage: reader4 <filename> [ filename ... ]
 * test: reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res
 * author: Graham Bennett
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/xmlreader.h>

#ifdef LIBXML_READER_ENABLED

static void processDoc(xmlTextReaderPtr readerPtr) {
    int ret;
    xmlDocPtr docPtr;
    const xmlChar *URL;

    ret = xmlTextReaderRead(readerPtr);
    while (ret == 1) {
      ret = xmlTextReaderRead(readerPtr);
    }

    /*
     * One can obtain the document pointer to get interesting
     * information about the document like the URL, but one must also
     * be sure to clean it up at the end (see below).
     */
    docPtr = xmlTextReaderCurrentDoc(readerPtr);
    if (NULL == docPtr) {
      fprintf(stderr, "failed to obtain document\n");      
      return;
    }
      
    URL = docPtr->URL;
    if (NULL == URL) {
      fprintf(stderr, "Failed to obtain URL\n");      
    }

    if (ret != 0) {
      fprintf(stderr, "%s: Failed to parse\n", URL);
      return;
    }

    printf("%s: Processed ok\n", (const char *)URL);
}

int main(int argc, char **argv) {
    xmlTextReaderPtr readerPtr;
    int i;
    xmlDocPtr docPtr;

    if (argc < 2)
        return(1);

    /*
     * this initialises the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    /*
     * Create a new reader for the first file and process the
     * document.
     */
    readerPtr = xmlReaderForFile(argv[1], NULL, 0);
    if (NULL == readerPtr) {
      fprintf(stderr, "%s: failed to create reader\n", argv[1]);      
      return(1);
    }
    processDoc(readerPtr);

    /*
     * The reader can be reused for subsequent files.
     */
    for (i=2; i < argc; ++i) {
      	xmlReaderNewFile(readerPtr, argv[i], NULL, 0);
	if (NULL == readerPtr) {
	  fprintf(stderr, "%s: failed to create reader\n", argv[i]);      
	  return(1);
	}
        processDoc(readerPtr);
    }

    /*
     * Since we've called xmlTextReaderCurrentDoc, we now have to
     * clean up after ourselves.  We only have to do this the last
     * time, because xmlReaderNewFile calls xmlCtxtReset which takes
     * care of it.
     */
    docPtr = xmlTextReaderCurrentDoc(readerPtr);
    if (docPtr != NULL)
      xmlFreeDoc(docPtr);

    /*
     * Clean up the reader.
     */
    xmlFreeTextReader(readerPtr);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}

#else
int main(void) {
    fprintf(stderr, "xmlReader support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/io1.o000064400000075220151730335250013235 0ustar00ELF>Pk@@=<

02/3.4-5��H��t
�1�ø�����@��U��SH��H�������u7H��t2�-��H��H��H��9�N�Hc�)���-H����[]��������f���H��H��t,�H�=�����u�1H��1��D��H��1�H��t�H�=����������GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign<list><people>a</people><people>b</people></list>failed to register SQL handler
failed to parse the including file
<?xml version='1.0'?>
<document xmlns:xi="http://www.w3.org/2003/XInclude">
  <p>List of people:</p>
  <xi:include href="sql:select_name_from_people"/>
</document>
sql:include.xmlXInclude processing failed
GA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��S�
R�H�
H�H�5H�=���x^H�H���H��E1�1�H����H��H��tH�����~LH�=H���H�����1�[�H�
��H�=���H�
��H�=���H�
�#�H�=�����5Cint�m�m��	�1%
3f
6	�
7	�
8	�
9	� 
:	�(
;	�0
<	�8
=	�@
@	�H
A	�P
B	�X
D>`
FDh
Hfp
Ift
Jtx
MQ�
NX�
OJ�
QZ�
Y
��
[e�
\p�
]D�
^	C�
_
)�
`f�
bv��+9�
�Z51`k
��5��%�����	f
������	�
J��<��	

��<��	
��x���C�������� ��(��0��8doc�<@ns��H��P��X��`�Ch�Qp�Qr�����C�������� �<(��0��8doc�<@�CH�CP�CX�C`��h��p�Cx��'<(C)�*�+�,� -�(.�0/�8doc0<@3fH4fL:�P;�X<�`=�h>�pids?Cx@C�URLA��Bf�D��EC�Ff�Hf��w��o0�����U�����C �<(bo`���C�������� ��(��0��8doc�<@ns��H��P�CX�%�&��P����C9�B3�	C	)M	#	C7	C)WC	I	�X	�
��
��
�	
��
�7	�cur�f	b
�	hf�p doci�!v	k
":#.$H%U	%T1%QO!�	�
":#.$H%U	%T1%QK!~	&":#.$H%U	%T1%Q#&S?%U

R&_�%U	%T	%Q	%R	&k�%Us&x�%Us%Q	%R0%X0&��%Us&��%Ts&�%Us'�'�&�E%U1&�\%U1$�%U1(VfW�H
)VC)V �*lenV,f ptrW�+�
]"""�
$�%U�T%T�U%Qs $ &(Df�y
,DCU(3C;��
*URI3�(#f*��
*URI#�-C.E.�.)-dfH.d�.d<�/011�2�2u1]2�2291�2f
0%U:;9I$>7I$>I&I	:;9

:;9I8:;9<
I!I/4:;9I?<!>I:;9(:;9
:;9I8
:;9I8:;9I&'I'I4:;9I4:;9I4:;9I4:;9I?.?:;9'I@�B 4:;9I�B!1R�BXYW"1�B#1$��1%���B&��1'��1(.:;9'I@�B):;9I�B*:;9I�B+1R�BUXYW,:;9I-.?:;9'I 4.:;9I/0.?<n:;1.?<n:;92.?<n:;9PSSPS
�
�
�UT�U�UTP�T�TQSQUT�U�U	s $ &�Q	s $ &�T�U�P�T�UTUT<�d��
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlio1.cstring_fortified.hstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hxmlversion.hxmlIO.hstring.hparser.hxinclude.hstdlib.h<built-in>	�KY
� 9\1
XK1.#1+%[.f��
F<X;B;	=
D.X<	gz�Y�K=X�.XL
��2jfK?,X�.X�	�Kx(�	�Q"��	X	�	J�\Y<	V n
�	�]
�"	v�f
�
__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned int__srcSystemIDXML_XINCLUDE_STARTnsDef_codecvtxmlXIncludeProcess_xmlNsxmlNslong long intsigned char__builtin_fwriteGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endencodinglong intoldNsparent_flagsrlensqlRead_IO_buf_endmemcpyXML_XINCLUDE_END_IO_codecvtExternalID_old_offset_offsetxmlCharxmlCleanupParserxmlReadMemoryxmlRegisterInputCallbackscompressionlinexmlMallocAtomicxmlElementType_privatexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocstdinXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocfprintfxmlMemoryDump_xmlAttr__streamlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetsqlOpenshort unsigned intXML_ENTITY_DECLstrlenlast_IO_save_basesqlClose_xmlDtd_lock_flags2_modestdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitieselements_IO_write_endXML_ATTRIBUTE_DECL__dest_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlistio1.c_markersrefsxmlFreexmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotations__lenXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdupexitatypeXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdict__builtin_memcpyXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODEbufferintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATIONsqlMatch__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncincludexmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypexmlDocDumpfwriteXML_DOCUMENT_FRAG_NODE_freeres_listextraXML_ENTITY_REF_NODEcontext_wide_dataXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESmain_IO_write_baseXML_ATTRIBUTE_NMTOKENresultXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�(0WE�C�D |
CAD\;p*�E��
A
�	
1#
62Me3��4��5��
�	-wB WJwa�v�;~�����*�� "#%')+23456718����8��X�*>,-./0Oelq�����������.annobin_io1.c.annobin_io1.c_end.annobin_io1.c.hot.annobin_io1.c_end.hot.annobin_io1.c.unlikely.annobin_io1.c_end.unlikely.annobin_io1.c.startup.annobin_io1.c_end.startup.annobin_io1.c.exit.annobin_io1.c_end.exit.annobin_sqlClose.start.annobin_sqlClose.endsqlClose.annobin_sqlRead.start.annobin_sqlRead.endsqlRead.annobin_sqlOpen.start.annobin_sqlOpen.endsqlOpen.annobin_sqlMatch.start.annobin_sqlMatch.endsqlMatch.annobin_main.start.annobin_main.end.LC1.LC0.LC3.LC2.LC5.LC4.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE_memcpymainxmlCheckVersionxmlRegisterInputCallbacksincludestrlenxmlReadMemoryxmlXIncludeProcessstdoutxmlDocDumpxmlFreeDocxmlCleanupParserxmlMemoryDumpstderrfwrite��������@��������ZQ��������`���������;������������������<���������;�������� 8��$,PXw��w�w���w����D�L� 2 3 4 599S���������������� |'�,T��������7U��������?V��������N=��������UW��������eX��������pY��������xZ���������[���������\���������]���������^���������>���������_���������`���������^���������?���������_���������`���������^���������@���������_��������`��������!�
,
14
1h
1*
/@%
0*
1\8
1�?
1zM
1�T
1=[
1b
1�p
1Bu
1�
1��
1��
18�
1X�
1�
1,�
1��
1��
1�
1
1�
1l!
1l.
1�;
1	H
1nU
1b
1$o
1�|
1��
1��
1�
1h�
1��
1��
1��
1e�
15�
1��
1V
1�
1�&
12
1-:
1Aa
1�l
1��
1b�
1��
1��
1$�
1\�
1�
1
1�
1�%
1a+
1I1
1L7
1�=
1?C
1pI
1�O
1U
1h[
1�a
1�g
1m
1s
1Py
1r
1��
1�
1�
1��
1��
17�
1]�
1r�
1��
1��
1?�
1�
1��
1��
1
1,
1�
1-
1�;
1gI
1QW
1ce
1��
1��
1V�
1��
1��
1�
1C�
1��
1,
1�
1!
1�/
1g=
1QK
1cY
1�u
1��
1��
1K�
1��
1��
1��
1��
1Z�
1,�
1�
1
1�$
1g2
1Q@
1cN
1�j
1�x
1��
1��
1��
1K�
1��
19�
1w�
1-
1x
1� 
1�.
1VE
1	L
1�Q
1�V
1�c
1p
1�~
1c�
1��
1��
1��
1,�
1]�
1��
1,�
1�	
1
1�%
1g3
1QA
1cO
1�x
11�
1��
1��
15�
1��
1��
1�	
1�8	
1Y	
1Pe	
1
q	
1�}	
1|�	
1�	
1��	
1_�	�	
1��	U�	
1��	9

-



-
9�
9�8

-{<

-yF
9�W
!8p
9�y
9��

-��

-��
9��
"�
9��
9��

-��

-�9�!X'9@90U�b�o |�9C�9Y�"�9i�9|�9�9�"9�/9�F9�]9q
1d| �
1]�
-�
-�
1��
-r�
-j�
-��
-��
-(�
- �T�
/�
-�

-�	

-�


-�

-'

-#
^I

1zT
k

1]z

15�
��

-d�

-`�

10�
��

-��

-��

1x�

1&
1�
1�
1�/
1�;
19I
1M
1#T
1�X
1�`
1�d
1�l
1`p
1`y
1�}
1��
1��
1��
1�
1�
1��
1��
1��
1��
1��
1��
1,�
1,�
1x�
1}
9\9h9h%9�09�89�C9�K9�V9�^9{9��9��!8�9��9��"�9��9��!X OO&]1]9mGmOwr zL�L�]�]�m�m�w� �T�T�d�mw($0O;OC]N]Vmdmlw�T�W�W�]�]�^�T�]�]^'T/]:]B^d�l�w����������
+ 9LTTT Y(^@H�P9X9��9 4 `�t��9.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.8.rodata.str1.1.rela.gnu.build.attributes.text.startup.rela.text.startup.rela.data.rel.local.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.groupS@:AST:BSl:CS�(:DS�:E ��@�?�:&�,�6�T1@X@�:
L[�V@B0:
u�����@8B0:A�����@hB0:��
��
��@�B0:�2`%2�
-�
8@�B0:A�<@�B�:T�O@�E:i�d@�E�: u����!��@h`�:#��%@�@gH:%��%p�@Xg�:'�3&h�@Hh0:)�0�)��0y2.��2A�2u�2L�2 �2��2��2�2�2!�21�2 I�2�D@xhx:8h3	;P	�<�hZdoc/alt-libxml2-devel/examples/Makefile.in000064400000076162151730335250014440 0ustar00# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@

# Copyright (C) 1994-2021 Free Software Foundation, Inc.

# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.

@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = { \
  if test -z '$(MAKELEVEL)'; then \
    false; \
  elif test -n '$(MAKE_HOST)'; then \
    true; \
  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
    true; \
  else \
    false; \
  fi; \
}
am__make_running_with_option = \
  case $${target_option-} in \
      ?) ;; \
      *) echo "am__make_running_with_option: internal error: invalid" \
              "target option '$${target_option-}' specified" >&2; \
         exit 1;; \
  esac; \
  has_opt=no; \
  sane_makeflags=$$MAKEFLAGS; \
  if $(am__is_gnu_make); then \
    sane_makeflags=$$MFLAGS; \
  else \
    case $$MAKEFLAGS in \
      *\\[\ \	]*) \
        bs=\\; \
        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
    esac; \
  fi; \
  skip_next=no; \
  strip_trailopt () \
  { \
    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
  }; \
  for flg in $$sane_makeflags; do \
    test $$skip_next = yes && { skip_next=no; continue; }; \
    case $$flg in \
      *=*|--*) continue;; \
        -*I) strip_trailopt 'I'; skip_next=yes;; \
      -*I?*) strip_trailopt 'I';; \
        -*O) strip_trailopt 'O'; skip_next=yes;; \
      -*O?*) strip_trailopt 'O';; \
        -*l) strip_trailopt 'l'; skip_next=yes;; \
      -*l?*) strip_trailopt 'l';; \
      -[dEDm]) skip_next=yes;; \
      -[JT]) skip_next=yes;; \
    esac; \
    case $$flg in \
      *$$target_option*) has_opt=yes; break;; \
    esac; \
  done; \
  test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
check_PROGRAMS = io1$(EXEEXT) io2$(EXEEXT) parse1$(EXEEXT) \
	parse2$(EXEEXT) parse3$(EXEEXT) parse4$(EXEEXT) \
	reader1$(EXEEXT) reader2$(EXEEXT) reader3$(EXEEXT) \
	reader4$(EXEEXT) testWriter$(EXEEXT) tree1$(EXEEXT) \
	tree2$(EXEEXT) xpath1$(EXEEXT) xpath2$(EXEEXT)
subdir = doc/examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
	$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am_io1_OBJECTS = io1.$(OBJEXT)
io1_OBJECTS = $(am_io1_OBJECTS)
io1_LDADD = $(LDADD)
io1_DEPENDENCIES = $(top_builddir)/libxml2.la
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 = 
am_io2_OBJECTS = io2.$(OBJEXT)
io2_OBJECTS = $(am_io2_OBJECTS)
io2_LDADD = $(LDADD)
io2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse1_OBJECTS = parse1.$(OBJEXT)
parse1_OBJECTS = $(am_parse1_OBJECTS)
parse1_LDADD = $(LDADD)
parse1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse2_OBJECTS = parse2.$(OBJEXT)
parse2_OBJECTS = $(am_parse2_OBJECTS)
parse2_LDADD = $(LDADD)
parse2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse3_OBJECTS = parse3.$(OBJEXT)
parse3_OBJECTS = $(am_parse3_OBJECTS)
parse3_LDADD = $(LDADD)
parse3_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse4_OBJECTS = parse4.$(OBJEXT)
parse4_OBJECTS = $(am_parse4_OBJECTS)
parse4_LDADD = $(LDADD)
parse4_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader1_OBJECTS = reader1.$(OBJEXT)
reader1_OBJECTS = $(am_reader1_OBJECTS)
reader1_LDADD = $(LDADD)
reader1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader2_OBJECTS = reader2.$(OBJEXT)
reader2_OBJECTS = $(am_reader2_OBJECTS)
reader2_LDADD = $(LDADD)
reader2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader3_OBJECTS = reader3.$(OBJEXT)
reader3_OBJECTS = $(am_reader3_OBJECTS)
reader3_LDADD = $(LDADD)
reader3_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader4_OBJECTS = reader4.$(OBJEXT)
reader4_OBJECTS = $(am_reader4_OBJECTS)
reader4_LDADD = $(LDADD)
reader4_DEPENDENCIES = $(top_builddir)/libxml2.la
am_testWriter_OBJECTS = testWriter.$(OBJEXT)
testWriter_OBJECTS = $(am_testWriter_OBJECTS)
testWriter_LDADD = $(LDADD)
testWriter_DEPENDENCIES = $(top_builddir)/libxml2.la
am_tree1_OBJECTS = tree1.$(OBJEXT)
tree1_OBJECTS = $(am_tree1_OBJECTS)
tree1_LDADD = $(LDADD)
tree1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_tree2_OBJECTS = tree2.$(OBJEXT)
tree2_OBJECTS = $(am_tree2_OBJECTS)
tree2_LDADD = $(LDADD)
tree2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_xpath1_OBJECTS = xpath1.$(OBJEXT)
xpath1_OBJECTS = $(am_xpath1_OBJECTS)
xpath1_LDADD = $(LDADD)
xpath1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_xpath2_OBJECTS = xpath2.$(OBJEXT)
xpath2_OBJECTS = $(am_xpath2_OBJECTS)
xpath2_LDADD = $(LDADD)
xpath2_DEPENDENCIES = $(top_builddir)/libxml2.la
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo "  GEN     " $@;
am__v_GEN_1 = 
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 = 
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/io1.Po ./$(DEPDIR)/io2.Po \
	./$(DEPDIR)/parse1.Po ./$(DEPDIR)/parse2.Po \
	./$(DEPDIR)/parse3.Po ./$(DEPDIR)/parse4.Po \
	./$(DEPDIR)/reader1.Po ./$(DEPDIR)/reader2.Po \
	./$(DEPDIR)/reader3.Po ./$(DEPDIR)/reader4.Po \
	./$(DEPDIR)/testWriter.Po ./$(DEPDIR)/tree1.Po \
	./$(DEPDIR)/tree2.Po ./$(DEPDIR)/xpath1.Po \
	./$(DEPDIR)/xpath2.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
	$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo "  CC      " $@;
am__v_CC_1 = 
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
	$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo "  CCLD    " $@;
am__v_CCLD_1 = 
SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
DIST_SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates.  Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
  BEGIN { nonempty = 0; } \
  { items[$$0] = 1; nonempty = 1; } \
  END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique.  This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
  list='$(am__tagged_files)'; \
  unique=`for i in $$list; do \
    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
  done | $(am__uniquify_input)`
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BASE_THREAD_LIBS = @BASE_THREAD_LIBS@
C14N_OBJ = @C14N_OBJ@
CATALOG_OBJ = @CATALOG_OBJ@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
CYGPATH_W = @CYGPATH_W@
CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@
CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@
DEBUG_OBJ = @DEBUG_OBJ@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
EXTRA_CFLAGS = @EXTRA_CFLAGS@
FGREP = @FGREP@
FTP_OBJ = @FTP_OBJ@
GREP = @GREP@
HTML_OBJ = @HTML_OBJ@
HTTP_OBJ = @HTTP_OBJ@
ICONV_LIBS = @ICONV_LIBS@
ICU_CFLAGS = @ICU_CFLAGS@
ICU_DEFS = @ICU_DEFS@
ICU_LIBS = @ICU_LIBS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@
LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@
LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@
LIBXML_VERSION = @LIBXML_VERSION@
LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@
LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@
LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
LZMA_CFLAGS = @LZMA_CFLAGS@
LZMA_LIBS = @LZMA_LIBS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
MODULE_EXTENSION = @MODULE_EXTENSION@
MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@
MV = @MV@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PYTHON = @PYTHON@
PYTHON_CFLAGS = @PYTHON_CFLAGS@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_LIBS = @PYTHON_LIBS@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
PYTHON_PREFIX = @PYTHON_PREFIX@
PYTHON_TESTS = @PYTHON_TESTS@
PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
RDL_LIBS = @RDL_LIBS@
RELDATE = @RELDATE@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TAR = @TAR@
TEST_CATALOG = @TEST_CATALOG@
TEST_DEBUG = @TEST_DEBUG@
TEST_REGEXPS = @TEST_REGEXPS@
TEST_SCHEMATRON = @TEST_SCHEMATRON@
TEST_VALID = @TEST_VALID@
TEST_VTIME = @TEST_VTIME@
THREAD_CFLAGS = @THREAD_CFLAGS@
THREAD_LIBS = @THREAD_LIBS@
VERSION = @VERSION@
VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@
WGET = @WGET@
WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@
WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@
WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@
WITH_C14N = @WITH_C14N@
WITH_CATALOG = @WITH_CATALOG@
WITH_DEBUG = @WITH_DEBUG@
WITH_FTP = @WITH_FTP@
WITH_HTML = @WITH_HTML@
WITH_HTTP = @WITH_HTTP@
WITH_ICONV = @WITH_ICONV@
WITH_ICU = @WITH_ICU@
WITH_ISO8859X = @WITH_ISO8859X@
WITH_LEGACY = @WITH_LEGACY@
WITH_LZMA = @WITH_LZMA@
WITH_MEM_DEBUG = @WITH_MEM_DEBUG@
WITH_MODULES = @WITH_MODULES@
WITH_OUTPUT = @WITH_OUTPUT@
WITH_PATTERN = @WITH_PATTERN@
WITH_PUSH = @WITH_PUSH@
WITH_READER = @WITH_READER@
WITH_REGEXPS = @WITH_REGEXPS@
WITH_RUN_DEBUG = @WITH_RUN_DEBUG@
WITH_SAX1 = @WITH_SAX1@
WITH_SCHEMAS = @WITH_SCHEMAS@
WITH_SCHEMATRON = @WITH_SCHEMATRON@
WITH_THREADS = @WITH_THREADS@
WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@
WITH_TREE = @WITH_TREE@
WITH_TRIO = @WITH_TRIO@
WITH_VALID = @WITH_VALID@
WITH_WRITER = @WITH_WRITER@
WITH_XINCLUDE = @WITH_XINCLUDE@
WITH_XPATH = @WITH_XPATH@
WITH_XPTR = @WITH_XPTR@
WITH_XPTR_LOCS = @WITH_XPTR_LOCS@
WITH_ZLIB = @WITH_ZLIB@
XINCLUDE_OBJ = @XINCLUDE_OBJ@
XMLLINT = @XMLLINT@
XML_CFLAGS = @XML_CFLAGS@
XML_INCLUDEDIR = @XML_INCLUDEDIR@
XML_LIBDIR = @XML_LIBDIR@
XML_LIBS = @XML_LIBS@
XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@
XML_PRIVATE_LIBS = @XML_PRIVATE_LIBS@
XPATH_OBJ = @XPATH_OBJ@
XPTR_OBJ = @XPTR_OBJ@
XSLTPROC = @XSLTPROC@
Z_CFLAGS = @Z_CFLAGS@
Z_LIBS = @Z_LIBS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
pkgpyexecdir = @pkgpyexecdir@
pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
pyexecdir = @pyexecdir@
pythondir = @pythondir@
runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
LDADD = $(top_builddir)/libxml2.la
CLEANFILES = *.tmp
EXTRA_DIST = \
	examples.xml \
	examples.xsl \
	index.html \
	index.py \
	test1.xml \
	test2.xml \
	test3.xml

io1_SOURCES = io1.c
io2_SOURCES = io2.c
parse1_SOURCES = parse1.c
parse2_SOURCES = parse2.c
parse3_SOURCES = parse3.c
parse4_SOURCES = parse4.c
reader1_SOURCES = reader1.c
reader2_SOURCES = reader2.c
reader3_SOURCES = reader3.c
reader4_SOURCES = reader4.c
testWriter_SOURCES = testWriter.c
tree1_SOURCES = tree1.c
tree2_SOURCES = tree2.c
xpath1_SOURCES = xpath1.c
xpath2_SOURCES = xpath2.c
all: all-am

.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/examples/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign doc/examples/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
	esac;

$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh

$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):

clean-checkPROGRAMS:
	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
	echo " rm -f" $$list; \
	rm -f $$list || exit $$?; \
	test -n "$(EXEEXT)" || exit 0; \
	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
	echo " rm -f" $$list; \
	rm -f $$list

io1$(EXEEXT): $(io1_OBJECTS) $(io1_DEPENDENCIES) $(EXTRA_io1_DEPENDENCIES) 
	@rm -f io1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(io1_OBJECTS) $(io1_LDADD) $(LIBS)

io2$(EXEEXT): $(io2_OBJECTS) $(io2_DEPENDENCIES) $(EXTRA_io2_DEPENDENCIES) 
	@rm -f io2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(io2_OBJECTS) $(io2_LDADD) $(LIBS)

parse1$(EXEEXT): $(parse1_OBJECTS) $(parse1_DEPENDENCIES) $(EXTRA_parse1_DEPENDENCIES) 
	@rm -f parse1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse1_OBJECTS) $(parse1_LDADD) $(LIBS)

parse2$(EXEEXT): $(parse2_OBJECTS) $(parse2_DEPENDENCIES) $(EXTRA_parse2_DEPENDENCIES) 
	@rm -f parse2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse2_OBJECTS) $(parse2_LDADD) $(LIBS)

parse3$(EXEEXT): $(parse3_OBJECTS) $(parse3_DEPENDENCIES) $(EXTRA_parse3_DEPENDENCIES) 
	@rm -f parse3$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse3_OBJECTS) $(parse3_LDADD) $(LIBS)

parse4$(EXEEXT): $(parse4_OBJECTS) $(parse4_DEPENDENCIES) $(EXTRA_parse4_DEPENDENCIES) 
	@rm -f parse4$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse4_OBJECTS) $(parse4_LDADD) $(LIBS)

reader1$(EXEEXT): $(reader1_OBJECTS) $(reader1_DEPENDENCIES) $(EXTRA_reader1_DEPENDENCIES) 
	@rm -f reader1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader1_OBJECTS) $(reader1_LDADD) $(LIBS)

reader2$(EXEEXT): $(reader2_OBJECTS) $(reader2_DEPENDENCIES) $(EXTRA_reader2_DEPENDENCIES) 
	@rm -f reader2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader2_OBJECTS) $(reader2_LDADD) $(LIBS)

reader3$(EXEEXT): $(reader3_OBJECTS) $(reader3_DEPENDENCIES) $(EXTRA_reader3_DEPENDENCIES) 
	@rm -f reader3$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader3_OBJECTS) $(reader3_LDADD) $(LIBS)

reader4$(EXEEXT): $(reader4_OBJECTS) $(reader4_DEPENDENCIES) $(EXTRA_reader4_DEPENDENCIES) 
	@rm -f reader4$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader4_OBJECTS) $(reader4_LDADD) $(LIBS)

testWriter$(EXEEXT): $(testWriter_OBJECTS) $(testWriter_DEPENDENCIES) $(EXTRA_testWriter_DEPENDENCIES) 
	@rm -f testWriter$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(testWriter_OBJECTS) $(testWriter_LDADD) $(LIBS)

tree1$(EXEEXT): $(tree1_OBJECTS) $(tree1_DEPENDENCIES) $(EXTRA_tree1_DEPENDENCIES) 
	@rm -f tree1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(tree1_OBJECTS) $(tree1_LDADD) $(LIBS)

tree2$(EXEEXT): $(tree2_OBJECTS) $(tree2_DEPENDENCIES) $(EXTRA_tree2_DEPENDENCIES) 
	@rm -f tree2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(tree2_OBJECTS) $(tree2_LDADD) $(LIBS)

xpath1$(EXEEXT): $(xpath1_OBJECTS) $(xpath1_DEPENDENCIES) $(EXTRA_xpath1_DEPENDENCIES) 
	@rm -f xpath1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(xpath1_OBJECTS) $(xpath1_LDADD) $(LIBS)

xpath2$(EXEEXT): $(xpath2_OBJECTS) $(xpath2_DEPENDENCIES) $(EXTRA_xpath2_DEPENDENCIES) 
	@rm -f xpath2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(xpath2_OBJECTS) $(xpath2_LDADD) $(LIBS)

mostlyclean-compile:
	-rm -f *.$(OBJEXT)

distclean-compile:
	-rm -f *.tab.c

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io1.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io2.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse1.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse2.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse3.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse4.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader1.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader2.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader3.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader4.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testWriter.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree1.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree2.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath1.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath2.Po@am__quote@ # am--include-marker

$(am__depfiles_remade):
	@$(MKDIR_P) $(@D)
	@echo '# dummy' >$@-t && $(am__mv) $@-t $@

am--depfiles: $(am__depfiles_remade)

.c.o:
@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<

.c.obj:
@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`

.c.lo:
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<

mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs

ID: $(am__tagged_files)
	$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags

tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	set x; \
	here=`pwd`; \
	$(am__define_uniq_tagged_files); \
	shift; \
	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
	  test -n "$$unique" || unique=$$empty_fix; \
	  if test $$# -gt 0; then \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      "$$@" $$unique; \
	  else \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      $$unique; \
	  fi; \
	fi
ctags: ctags-am

CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	$(am__define_uniq_tagged_files); \
	test -z "$(CTAGS_ARGS)$$unique" \
	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
	     $$unique

GTAGS:
	here=`$(am__cd) $(top_builddir) && pwd` \
	  && $(am__cd) $(top_srcdir) \
	  && gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am

cscopelist-am: $(am__tagged_files)
	list='$(am__tagged_files)'; \
	case "$(srcdir)" in \
	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
	  *) sdir=$(subdir)/$(srcdir) ;; \
	esac; \
	for i in $$list; do \
	  if test -f "$$i"; then \
	    echo "$(subdir)/$$i"; \
	  else \
	    echo "$$sdir/$$i"; \
	  fi; \
	done >> $(top_builddir)/cscope.files

distclean-tags:
	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(BUILT_SOURCES)
	$(MAKE) $(AM_MAKEFLAGS) distdir-am

distdir-am: $(DISTFILES)
	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	list='$(DISTFILES)'; \
	  dist_files=`for file in $$list; do echo $$file; done | \
	  sed -e "s|^$$srcdirstrip/||;t" \
	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
	case $$dist_files in \
	  */*) $(MKDIR_P) `echo "$$dist_files" | \
			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
			   sort -u` ;; \
	esac; \
	for file in $$dist_files; do \
	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
	  if test -d $$d/$$file; then \
	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
	    if test -d "$(distdir)/$$file"; then \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
	  else \
	    test -f "$(distdir)/$$file" \
	    || cp -p $$d/$$file "$(distdir)/$$file" \
	    || exit 1; \
	  fi; \
	done
check-am: all-am
	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
	$(MAKE) $(AM_MAKEFLAGS) check-local
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am

install-am: all-am
	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am

installcheck: installcheck-am
install-strip:
	if test -z '$(STRIP)'; then \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	      install; \
	else \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
	fi
mostlyclean-generic:

clean-generic:
	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)

distclean-generic:
	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)

maintainer-clean-generic:
	@echo "This command is intended for maintainers to use"
	@echo "it deletes files that may require special tools to rebuild."
clean: clean-am

clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
	mostlyclean-am

distclean: distclean-am
		-rm -f ./$(DEPDIR)/io1.Po
	-rm -f ./$(DEPDIR)/io2.Po
	-rm -f ./$(DEPDIR)/parse1.Po
	-rm -f ./$(DEPDIR)/parse2.Po
	-rm -f ./$(DEPDIR)/parse3.Po
	-rm -f ./$(DEPDIR)/parse4.Po
	-rm -f ./$(DEPDIR)/reader1.Po
	-rm -f ./$(DEPDIR)/reader2.Po
	-rm -f ./$(DEPDIR)/reader3.Po
	-rm -f ./$(DEPDIR)/reader4.Po
	-rm -f ./$(DEPDIR)/testWriter.Po
	-rm -f ./$(DEPDIR)/tree1.Po
	-rm -f ./$(DEPDIR)/tree2.Po
	-rm -f ./$(DEPDIR)/xpath1.Po
	-rm -f ./$(DEPDIR)/xpath2.Po
	-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
	distclean-tags

dvi: dvi-am

dvi-am:

html: html-am

html-am:

info: info-am

info-am:

install-data-am: install-data-local

install-dvi: install-dvi-am

install-dvi-am:

install-exec-am:

install-html: install-html-am

install-html-am:

install-info: install-info-am

install-info-am:

install-man:

install-pdf: install-pdf-am

install-pdf-am:

install-ps: install-ps-am

install-ps-am:

installcheck-am:

maintainer-clean: maintainer-clean-am
		-rm -f ./$(DEPDIR)/io1.Po
	-rm -f ./$(DEPDIR)/io2.Po
	-rm -f ./$(DEPDIR)/parse1.Po
	-rm -f ./$(DEPDIR)/parse2.Po
	-rm -f ./$(DEPDIR)/parse3.Po
	-rm -f ./$(DEPDIR)/parse4.Po
	-rm -f ./$(DEPDIR)/reader1.Po
	-rm -f ./$(DEPDIR)/reader2.Po
	-rm -f ./$(DEPDIR)/reader3.Po
	-rm -f ./$(DEPDIR)/reader4.Po
	-rm -f ./$(DEPDIR)/testWriter.Po
	-rm -f ./$(DEPDIR)/tree1.Po
	-rm -f ./$(DEPDIR)/tree2.Po
	-rm -f ./$(DEPDIR)/xpath1.Po
	-rm -f ./$(DEPDIR)/xpath2.Po
	-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

mostlyclean: mostlyclean-am

mostlyclean-am: mostlyclean-compile mostlyclean-generic \
	mostlyclean-libtool

pdf: pdf-am

pdf-am:

ps: ps-am

ps-am:

uninstall-am: uninstall-local

.MAKE: check-am install-am install-strip

.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
	check-local clean clean-checkPROGRAMS clean-generic \
	clean-libtool clean-local cscopelist-am ctags ctags-am \
	distclean distclean-compile distclean-generic \
	distclean-libtool distclean-tags distdir dvi dvi-am html \
	html-am info info-am install install-am install-data \
	install-data-am install-data-local install-dvi install-dvi-am \
	install-exec install-exec-am install-html install-html-am \
	install-info install-info-am install-man install-pdf \
	install-pdf-am install-ps install-ps-am install-strip \
	installcheck installcheck-am installdirs maintainer-clean \
	maintainer-clean-generic mostlyclean mostlyclean-compile \
	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
	tags tags-am uninstall uninstall-am uninstall-local

.PRECIOUS: Makefile


rebuild:
	cd $(srcdir) && $(PYTHON) index.py
	$(MAKE) Makefile
	cd $(srcdir) && xsltproc examples.xsl examples.xml
	-cd $(srcdir) && xmllint --valid --noout index.html

.PHONY: rebuild

install-data-local: 
	$(MKDIR_P) $(DESTDIR)$(docdir)/examples
	-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/

uninstall-local:
	rm -f $(DESTDIR)$(docdir)/examples/*.c
	rm -f $(DESTDIR)$(docdir)/examples/*.html
	-rmdir $(DESTDIR)$(docdir)/examples

clean-local:
	test -f Makefile.am || rm -f test?.xml
	rm -f .memdump

valgrind: 
	$(MAKE) CHECKER='valgrind' check

check-local:
	@test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .
	@(echo '## examples regression tests')
	@(echo > .memdump)
	@$(CHECKER) ./io1 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./io2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse1 test1.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse2 test2.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse3
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse4 test3.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader2 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader3 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader4 test1.xml test2.xml test3.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./testWriter
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath1 test3.xml '//child2' >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath2 test3.xml '//discarded' discarded >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@rm -f *.tmp

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
doc/alt-libxml2-devel/examples/parse2000075500000017372151730335250013513 0ustar00#! /bin/sh

# parse2 - temporary wrapper script for .libs/parse2
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The parse2 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file parse2.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "parse2:parse2:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "parse2:parse2:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "parse2:parse2:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'parse2'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/parse2.c000064400000003661151730335260013726 0ustar00/**
 * section: Parsing
 * synopsis: Parse and validate an XML file to a tree and free the result
 * purpose: Create a parser context for an XML file, then parse and validate
 *          the file, creating a tree, check the validation result
 *          and xmlFreeDoc() to free the resulting tree.
 * usage: parse2 test2.xml
 * test: parse2 test2.xml
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

/**
 * exampleFunc:
 * @filename: a filename or an URL
 *
 * Parse and validate the resource and free the resulting tree
 */
static void
exampleFunc(const char *filename) {
    xmlParserCtxtPtr ctxt; /* the parser context */
    xmlDocPtr doc; /* the resulting document tree */

    /* create a parser context */
    ctxt = xmlNewParserCtxt();
    if (ctxt == NULL) {
        fprintf(stderr, "Failed to allocate parser context\n");
	return;
    }
    /* parse the file, activating the DTD validation option */
    doc = xmlCtxtReadFile(ctxt, filename, NULL, XML_PARSE_DTDVALID);
    /* check if parsing succeeded */
    if (doc == NULL) {
        fprintf(stderr, "Failed to parse %s\n", filename);
    } else {
	/* check if validation succeeded */
        if (ctxt->valid == 0)
	    fprintf(stderr, "Failed to validate %s\n", filename);
	/* free up the resulting document */
	xmlFreeDoc(doc);
    }
    /* free up the parser context */
    xmlFreeParserCtxt(ctxt);
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    exampleFunc(argv[1]);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}
doc/alt-libxml2-devel/examples/reader4.o000064400000073210151730335260014071 0ustar00ELF>h@@:9

-/,0+1*2UH��SH�������f�H�����t�H���H����H���H��tL��u H��H��H�51�[�]�@H�=H��H��1�[H��]�DH�
��H�=��f����h���f�H�
H����[H�=]�GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignfailed to obtain document
Failed to obtain URL
%s: Failed to parse
%s: Processed ok
%s: failed to create reader
GA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��AUATUS�H������I��A���
R�I�}1�1��H��H��tuH���A��t1A�D$�I�]M�d�H�31�1�H��H���H���L9�u�H���H��tH���H��1����H����[]A\A]�I�MH�=H�1����ӑ�5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� �����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�7(
��0
��8doc
�7@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'7
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
07@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�j0
��
��
�P
��
��
�C 
�7(]j`
��
�C
��
��
��
�� 
��(
��0
��8doc
�7@ns
��H
��P
�CX�
%�
&��K9���CB3��C�)M		C	C)W+	1	�@	����������	
c�	
j�	�	5a��b5a5b6�	i7	a8��J�
� �!"Ts"Q	#�
"U

R#�
"T0"Q0#h�
"Uv#%�
"Uv"Q0"R0#h
"Uv#2""Uv$?#LG"Uv$X$e�%
�&)�	'ret	a(�'URL�)ka�&k �*)da�&d�&d<�*+h��u,�,�,�-�2��.q"U1"T	-�.�� �."T1"Q	�8*/
� �!}"U	"T1"QE-h
�
u/0�0�0�1�$2�
� �.}"U	"T1"QJ#��
"Uv#��
"Uv!2"Uv3Z34
I4
i4
4
3
v493�3\53
�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B:;9I�B4:;9I�B4:;9I�B1R�BXYW1�B 1!��1"���B#��1$��1%.:;9' &:;9I'4:;9I(4:;9I).?:;9'I 4*+.1@�B,41�B-1R�BUXYW.���B1/U04111R�BUXYW213.?<n:;94.?<n:;95.?<n:;U\�U�\T]�T�]PVPV2�P
�UV�U�V�U�P1�PPPPPVQVRV
�
�
�V�U�<��R_�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlreader4.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hxmlreader.hxmlversion.hparser.h<built-in>4	4
�Y!
�	X��	u\O9F
:JF�
: FX
: �A6
Mt
3JMX
3 M�
3 �D:
���
��
Mt
3JM�
3 Mt
3 X!	4K!
l!zXO�X^�\�g/	z�X�Y�
<v.]\YW�
<�e
printf__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basepsvilong long unsigned intSystemIDXML_XINCLUDE_STARTnsDef_codecvt_private_xmlNsxmlNslong long intsigned char__builtin_fwriteGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECL_fileno_IO_read_endencodinglong intoldNsparent_flags_IO_buf_endstdin_xmlTextReaderXML_XINCLUDE_END_IO_codecvt__printf_chkExternalID_old_offset_offsetmainxmlTextReaderxmlCharxmlCleanupParsercompressionlinexmlMallocAtomicxmlElementTypexmlDocPtrXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocfprintfxmlMemoryDump_xmlAttr__streamlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrreader4.cnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLlast_IO_save_basexmlFreeTextReader_xmlDtd_lock_flags2_modeprocessDocstdoutXML_PI_NODEXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitiesxmlReaderForFilexmlTextReaderPtr_IO_write_endXML_ATTRIBUTE_DECLdocPtrreaderPtr_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlTextReaderReadxmlNsTypechildrenunsigned charXML_DTD_NODExmlReaderNewFileversionentitiesshort int_IO_wide_datanotationsXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdup__fprintf_chkXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODEintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderrXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefXML_ATTRIBUTE_NOTATIONxmlAttributeTypefwriteXML_DOCUMENT_FRAG_NODEargcxmlTextReaderCurrentDoc_freeres_listextraXML_ENTITY_REF_NODE_wide_dataatypeelementsXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESargv_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�@�A�D�D K
MFIK
FMJCKH8`�F�B�A �A(�I0�
(C ABBA
�	
.+
B/]y0��1��2!�9�DX� "$&(/01234.5jFo1ty~X�����)*+,-��&-;B�GWhy���.annobin_reader4.c.annobin_reader4.c_end.annobin_reader4.c.hot.annobin_reader4.c_end.hot.annobin_reader4.c.unlikely.annobin_reader4.c_end.unlikely.annobin_reader4.c.startup.annobin_reader4.c_end.startup.annobin_reader4.c.exit.annobin_reader4.c_end.exit.annobin_processDoc.start.annobin_processDoc.endprocessDoc.annobin_main.start.annobin_main.end.LC3.LC2.LC1.LC0.LC4.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE_xmlTextReaderReadxmlTextReaderCurrentDoc__printf_chkstderr__fprintf_chkfwritemainxmlCheckVersionxmlReaderForFilexmlReaderNewFilexmlFreeDocxmlFreeTextReaderxmlCleanupParserxmlMemoryDump
D��������$D��������3E��������Z/��������sG���������0���������G���������1���������I���������G���������2��������hF���������H���������I�������� ,���$,� & ' ( )--�(K��������5L��������E��������oM��������w���������E���������N���������O���������P���������Q���������G���������3���������H��������
 
%+
%
%1
#�%
$*
%c8
%�?
%[H
%�O
%(V
%]
%�k
%9p
%|
%�
%��
%S�
%O�
%�
%#�
%�
%��
%��
%
%�
%V
%P)
%�6
%&C
%�P
%]
%j
%~w
%��
%�
%=�
%o�
%x�
%��
%��
%{�
%S�
%h�
%j
%�
%�!
%L-
%H5
%\\
%�g
%�
%b�
%��
%��
%�
%w�
%�
%�
%�
%� 
%�&
%g,
%g2
%�8
%&>
%�D
%J
%P
%IV
%�\
%�b
%
h
%$n
%;t
%yz
%��
%w�
%
�
%��
%��
%l�
%q�
%��
%��
%��
%S�
%3�
%��
%�
%4�
%�
%�
%
(
%�6
%KD
%HR
%j`
%��
%��
%��
%��
%��
%��
%a�
%p�
%�
%�
%

%�*
%K8
%HF
%jT
%�p
%~
%��
%��
%��
%��
%��
%��
%A�
%��
%�
%

%�
%K-
%H;
%jI
%�e
%�s
%��
%��
%��
%B�
%��
%0�
%��
%�
%�

%�
%�)
%�@
%G
%�L
%�Q
%�^
%�k
%�y
%j�
%��
%��
%��
%��
% �
%��
%��
%�
%

%� 
%K.
%H<
%jJ
%�s
%��
%��
%��
%�
%��
%��
%u 	
%#C	
%�H	
%7T	
%�`	
%�l	
%�x	
%Q�	
%��	
%h�	
%�	
%��	-�	
%6�	
!�	
!�	
%��	
!o�	
!g�	
%>�	
!�

!�

!4

!2

%7"

!Z&

!X/
-�8
-�T

!X

!}b
-�y
X�
-,�
-9�
-I�
-s�
-{-�#-�0-�H-�U-�i
%�v
%>�
%7�
%�
%M�
%��
%��
%M�
!�
!�
!2!
!**
!�.
!�7
!�;
!�DPM
#]
!Ya
!Wfl|F�p�
#P�
!��
!����1�����
!�

!�

�
4
�=

#�M

!�Q

!�V

#�n
�w

#��
�
��
�
�
(�
7
%^
%^

%�
%�
%�
%�&
%�*
%�3
%;7
%;@
%�D
%�M
%^Q
%^Y
%�]
%�f
%�j
%�r
%�v
%�~
%�
%�
%��
%�--'-'#-].-]6-�D-�L-�o-w-+�-+�-��-��-��-��-��-<�-H�-H�-��-�-�-�-�4-I<-]Z-�b-�-��-��X��
�
�G�G��������2:EM*Y*a/l�t��7�L���������G�g�gkl�!�)�4�<�YPallF�l���1������������
 -PPT` a(f0g8pPpXw`{h�p�x������������������������--�n�- d-.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rela.gnu.build.attributes.text.startup.rela.text.startup.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group/@74/T75/l76/�(77/�78 ��@x<P7&�,�6�41@�=�7
L�[��V@X>07
u�����@�>072�����@�>07�t	�t	��@�>07�2Hu
�8@?072
�-@H?87E�
�@@�@�7Qk�dS_@8[P7 tq#@o@�bH7"��# �@�b�7$��$V�@pe07&�0'(��0#1.�Q12Q1uQ1LQ1 Q1�Q1�Q1�Q1�Q1�Q1
X1 %x1� @�e0752�8C	�9��e6doc/alt-libxml2-devel/examples/io1000075500000017331151730335260013003 0ustar00#! /bin/sh

# io1 - temporary wrapper script for .libs/io1
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The io1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file io1.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "io1:io1:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "io1:io1:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "io1:io1:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'io1'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/xpath1000075500000017372151730335260013525 0ustar00#! /bin/sh

# xpath1 - temporary wrapper script for .libs/xpath1
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The xpath1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file xpath1.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "xpath1:xpath1:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "xpath1:xpath1:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "xpath1:xpath1:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'xpath1'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/reader1.c000064400000004743151730335260014057 0ustar00/**
 * section: xmlReader
 * synopsis: Parse an XML file with an xmlReader
 * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
 *          and dump the information about the nodes found in the process.
 *          (Note that the XMLReader functions require libxml2 version later
 *          than 2.6.)
 * usage: reader1 <filename>
 * test: reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/xmlreader.h>

#ifdef LIBXML_READER_ENABLED

/**
 * processNode:
 * @reader: the xmlReader
 *
 * Dump information about the current node
 */
static void
processNode(xmlTextReaderPtr reader) {
    const xmlChar *name, *value;

    name = xmlTextReaderConstName(reader);
    if (name == NULL)
	name = BAD_CAST "--";

    value = xmlTextReaderConstValue(reader);

    printf("%d %d %s %d %d", 
	    xmlTextReaderDepth(reader),
	    xmlTextReaderNodeType(reader),
	    name,
	    xmlTextReaderIsEmptyElement(reader),
	    xmlTextReaderHasValue(reader));
    if (value == NULL)
	printf("\n");
    else {
        if (xmlStrlen(value) > 40)
            printf(" %.40s...\n", value);
        else
	    printf(" %s\n", value);
    }
}

/**
 * streamFile:
 * @filename: the file name to parse
 *
 * Parse and print information about an XML file.
 */
static void
streamFile(const char *filename) {
    xmlTextReaderPtr reader;
    int ret;

    reader = xmlReaderForFile(filename, NULL, 0);
    if (reader != NULL) {
        ret = xmlTextReaderRead(reader);
        while (ret == 1) {
            processNode(reader);
            ret = xmlTextReaderRead(reader);
        }
        xmlFreeTextReader(reader);
        if (ret != 0) {
            fprintf(stderr, "%s : failed to parse\n", filename);
        }
    } else {
        fprintf(stderr, "Unable to open %s\n", filename);
    }
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    streamFile(argv[1]);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}

#else
int main(void) {
    fprintf(stderr, "XInclude support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/reader1000075500000017405151730335260013640 0ustar00#! /bin/sh

# reader1 - temporary wrapper script for .libs/reader1
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The reader1 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file reader1.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "reader1:reader1:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "reader1:reader1:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "reader1:reader1:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'reader1'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/tree1.o000064400000060500151730335260013561 0ustar00ELF>�R@@;:

.0-1,2+3H��tKUH�-SH��H���{tH�{����H�[0H��u�H��[]�@H�SH��1�����GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignnode type: Element, name: %s
GA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS����t��U�
RSH��Q�H�{1�1��H��H��t#H���H���H����Z1�[]�H�SH�5�1����error: could not parse file %s
��5int�h�h���1 	3a	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	D9`	F?h	Hap	Iat	Jox	ML�	NS�	OE�	QU�	Y
{�	[`�	\k�	]?�	^	C�	_
)�	`a�	bq��
+4��U
5,[f��
5�� ����a�������	E��<
��	


���<
��	

��x
��
�C
��
��
��
�� 
��(
��0
��8doc
�2@ns
��H
��P
��X
��`
�Ch
�Lp
�Lr��
��
�C
��
��
��
�� 
�2(
��0
��8doc
�2@
�CH
�CP
�CX
�C`
��h
��p
�Cx��
'2
(C
)�
*�
+�
,� 
-�(
.�0
/�8doc
02@
3aH
4aL
:�P
;�X
<�`
=�h
>�pids
?Cx
@C�URL
A��
Ba�
D��
EC�
Fa�
Ha��
w�
�e0
��
��
�K
��
��
�C 
�2(Xe`
��
�C
��
��
��
�� 
��(
��0
��8doc
�2@ns
��H
��P
�CX�
���
%��F��C9�B3��C	)M
		C'	C)W3	9	�H	������	���'	3ap��
3
a3�
doc5
�6�fF	L
w
� �!U1!T	"�e
!U

R"��
!T0!Q0"��
!Uv#�
"��
!Uv#��$Q�f�!�%f%
X&w �!U1!Tv#�
'ka�(k �)*\*
+q+
�+
+9%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<!7I>I:;9(:;9
:;9I8
:;9I8:;9I'I'I.?:;9'I@�B:;9I�B4:;9I�B4:;9I�B1R�BXYW1 ��1!���B"��1#��1$.:;9'@�B%1R�BUXYW&1�B'.?:;9'I 4(:;9I)*.?<n:;9+.?<n:;9U�U�TS�T�S0�PVPV0�P0�U�U�U0�USSU
�<QpD@�
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmltree1.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hxmlmemory.hglobals.hxmlversion.hparser.h	U
� �t	�	j'�0J_X
a�
t	3K �\  tXJt [�]���Z/  	n %
 printf__off_t_IO_read_ptr_chainxmlStrdupFunc/builddir/build/BUILD/libxml2-2.10.2/doc/examplessize_tnext_shortbufXML_NAMESPACE_DECLprevtype_IO_buf_basemainpsvilong long unsigned intSystemIDXML_XINCLUDE_STARTnsDef_codecvt_private_xmlNsxmlNslong long intsigned charxmlNodeGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinXML_ELEMENT_DECLtree1.c_fileno_IO_read_endencodinglong intoldNsparent_flags_IO_buf_endstdinXML_XINCLUDE_END_IO_codecvt__printf_chkExternalID_old_offset_offsetxmlDocGetRootElementxmlCharxmlCleanupParsercompressionlinexmlMallocAtomicxmlElementTypeXML_COMMENT_NODExmlMalloc_xmlDocXML_NOTATION_NODEunsigned int_freeres_bufxmlReallocFuncxmlDocXML_ATTRIBUTE_NOTATION_xmlAttrlong unsigned intxmlCheckVersionxmlFreeFuncXML_ELEMENT_NODE_IO_write_ptrnamesys_nerrcharsetcontextshort unsigned intXML_ENTITY_DECLlast_IO_save_base_xmlDtdroot_element_lock_flags2_modecur_nodestdoutXML_PI_NODEprint_element_namesXML_ATTRIBUTE_IDprefixstandaloneextSubsetxmlRealloccontentpentitieselementsxmlReadFile_IO_write_endXML_ATTRIBUTE_DECL_IO_lock_t_IO_FILE_IO_markerXML_ENTITY_NODEsys_errlist_markersrefsxmlFreexmlNsTypechildrenunsigned charXML_DTD_NODEversionentitiesshort int_IO_wide_datanotationsXML_DOCUMENT_TYPE_NODE_xmlNode_vtable_offsetFILExmlMemStrdupatypeXML_ATTRIBUTE_IDREFattributespropertiesXML_CDATA_SECTION_NODEdictXML_ATTRIBUTE_NODElong doubleparseFlagschar_xmlDictXML_TEXT_NODEintSubset__off64_t_cur_column_IO_read_base_IO_save_endXML_ATTRIBUTE_ENUMERATION__fmtXML_ATTRIBUTE_NMTOKENS__pad5XML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_ENTITY_unused2stderra_nodeXML_HTML_DOCUMENT_NODExmlMallocFuncxmlFreeDoc_IO_backup_basehrefxmlAttributeTypeXML_DOCUMENT_FRAG_NODEargc_freeres_listextraXML_ENTITY_REF_NODE_wide_dataXML_DOCUMENT_NODEXML_ATTRIBUTE_ENTITIESargv_IO_write_baseXML_ATTRIBUTE_NMTOKENXML_ATTRIBUTE_CDATAGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�,QF�H�G \
AAEX��,LpP�F�D x
CAA
�	
/'
<0Uo1��2��3�Q7QK_p !#%')012345/6qv{����*+,-.���p�	*5.annobin_tree1.c.annobin_tree1.c_end.annobin_tree1.c.hot.annobin_tree1.c_end.hot.annobin_tree1.c.unlikely.annobin_tree1.c_end.unlikely.annobin_tree1.c.startup.annobin_tree1.c_end.startup.annobin_tree1.c.exit.annobin_tree1.c_end.exit.annobin_print_element_names.start.annobin_print_element_names.endprint_element_names.annobin_main.start.annobin_main.end.LC0.LC1.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE___printf_chkmainxmlCheckVersionxmlReadFilexmlDocGetRootElementxmlFreeDocxmlCleanupParser	0��������GB�������� -��Q$,Q ' ( ) *..pD��������(E��������8F��������@��������HG��������MH��������^1��������jB��������
!
&'
&
&1
$0%
%*
&c8
&�?
&HH
&vO
&V
&]
&�k
&=p
&|
&��
&{�
&�
&S�
&�
&'�
&��
&$�
&��
&�
&�
&Z
&+)
&�6
&�C
&MP
&]
&j
&Tw
&��
&��
&��
&o�
&N�
&��
&��
&��
&��
&U�
&	
&\
&:!
&�-
&5
&&\
&}g
&��
&f�
&k�
&C�
&��
&A�
&�	
&�
&Q
&�
&5!
&�'
&1-
&r3
&9
&�?
&�E
&�K
&6Q
&QW
&�]
&c
&�i
&o
&yu
&�{
&l�
&�
&I�
&��
&�
&�
&%�
&�
&3�
&��
&��
&x�
&��
&��
&�
&�
&�#
&m1
&&?
&LM
&j[
&��
&��
&*�
&��
&��
&��
&��
&9�
&��
&�	
&�
&m%
&&3
&LA
&jO
&�k
&�y
&��
&�
&��
&��
&��
&��
&.�
&��
&��
&�
&m
&&(
&L6
&jD
&�`
&�n
&�|
&��
&��
&F�
&��
&4�
&V�
&��
&L
&�
&p$
&*;
&B
&dG
&�L
&cY
&�f
&�t
&j�
&��
&��
&��
&��
&��
&��
&��
&��
&�

&m
&&)
&L7
&jE
&�n
&|
&��
&�
&q�
&��
&��
&h	
&b(	
&#I	
&$U	
&�a	
&�m	
&[y	
&��	
&��	.�	
&��	
"�	
"�	
&�	
"E�	
"=�	
"��	
"��	
&A�	
"$�	
"�	.W
.W"
,
.nB
M
.f
.,�
.<�
.D�
.L�
.Q�

&~�
�

&J�

"u
"o
&b
"�
"�8&
$6
"=:
";?KY$g
&x
&��
&��
&��
&��
&��
&��
&��
&��
&��
&v�
&v�
&��
&�....pE.M.X.`.Uk.Us.W�.W�.p�.�./�./�.4�.4�.V�.W�.i�.i.p$.,.<8.<@.CK.WS.pu}��M�M�Q������24
MM Q=4EMP
  .
8Q08Q@.H.pO�. P..symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.str1.8.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group>@82>T83>l84>�(85>�86 �Q@h208&!,!6$41@�2�8
LX[X�V@(308
u,�,��@X3082���@�308������@�308�2�

�
8@�3082p-@4�8@2p T��O@�4�8`bks�in@hJh8!�6@~@�NH8#�v`�@O�8%��H�@�O08'�0 ]�0{(.��(2�(u�(L�( �(��(��(��(��(�(�( 4�(x/@P086H)�9A	 0F8PEdoc/alt-libxml2-devel/examples/reader3.c000064400000005605151730335260014057 0ustar00/**
 * section: xmlReader
 * synopsis: Show how to extract subdocuments with xmlReader
 * purpose: Demonstrate the use of xmlTextReaderPreservePattern() 
 *          to parse an XML file with the xmlReader while collecting
 *          only some subparts of the document.
 *          (Note that the XMLReader functions require libxml2 version later
 *          than 2.6.)
 * usage: reader3
 * test: reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/xmlreader.h>

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)


/**
 * streamFile:
 * @filename: the file name to parse
 *
 * Parse and print information about an XML file.
 *
 * Returns the resulting doc with just the elements preserved.
 */
static xmlDocPtr
extractFile(const char *filename, const xmlChar *pattern) {
    xmlDocPtr doc;
    xmlTextReaderPtr reader;
    int ret;

    /*
     * build an xmlReader for that file
     */
    reader = xmlReaderForFile(filename, NULL, 0);
    if (reader != NULL) {
        /*
	 * add the pattern to preserve
	 */
        if (xmlTextReaderPreservePattern(reader, pattern, NULL) < 0) {
            fprintf(stderr, "%s : failed add preserve pattern %s\n",
	            filename, (const char *) pattern);
	}
	/*
	 * Parse and traverse the tree, collecting the nodes in the process
	 */
        ret = xmlTextReaderRead(reader);
        while (ret == 1) {
            ret = xmlTextReaderRead(reader);
        }
        if (ret != 0) {
            fprintf(stderr, "%s : failed to parse\n", filename);
	    xmlFreeTextReader(reader);
	    return(NULL);
        }
	/*
	 * get the resulting nodes
	 */
	doc = xmlTextReaderCurrentDoc(reader);
	/*
	 * Free up the reader
	 */
        xmlFreeTextReader(reader);
    } else {
        fprintf(stderr, "Unable to open %s\n", filename);
	return(NULL);
    }
    return(doc);
}

int main(int argc, char **argv) {
    const char *filename = "test3.xml";
    const char *pattern = "preserved";
    xmlDocPtr doc;

    if (argc == 3) {
        filename = argv[1];
	pattern = argv[2];
    }

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    doc = extractFile(filename, (const xmlChar *) pattern);
    if (doc != NULL) {
        /*
	 * output the result.
	 */
        xmlDocDump(stdout, doc);
	/*
	 * don't forget to free up the doc
	 */
	xmlFreeDoc(doc);
    }


    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}

#else
int main(void) {
    fprintf(stderr, "Reader, Pattern or output support not compiled in\n");
    return(0);
}
#endif
doc/alt-libxml2-devel/examples/Makefile000064400000074163151730335270014034 0ustar00# Makefile.in generated by automake 1.16.5 from Makefile.am.
# doc/examples/Makefile.  Generated from Makefile.in by configure.

# Copyright (C) 1994-2021 Free Software Foundation, Inc.

# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.



am__is_gnu_make = { \
  if test -z '$(MAKELEVEL)'; then \
    false; \
  elif test -n '$(MAKE_HOST)'; then \
    true; \
  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
    true; \
  else \
    false; \
  fi; \
}
am__make_running_with_option = \
  case $${target_option-} in \
      ?) ;; \
      *) echo "am__make_running_with_option: internal error: invalid" \
              "target option '$${target_option-}' specified" >&2; \
         exit 1;; \
  esac; \
  has_opt=no; \
  sane_makeflags=$$MAKEFLAGS; \
  if $(am__is_gnu_make); then \
    sane_makeflags=$$MFLAGS; \
  else \
    case $$MAKEFLAGS in \
      *\\[\ \	]*) \
        bs=\\; \
        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
    esac; \
  fi; \
  skip_next=no; \
  strip_trailopt () \
  { \
    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
  }; \
  for flg in $$sane_makeflags; do \
    test $$skip_next = yes && { skip_next=no; continue; }; \
    case $$flg in \
      *=*|--*) continue;; \
        -*I) strip_trailopt 'I'; skip_next=yes;; \
      -*I?*) strip_trailopt 'I';; \
        -*O) strip_trailopt 'O'; skip_next=yes;; \
      -*O?*) strip_trailopt 'O';; \
        -*l) strip_trailopt 'l'; skip_next=yes;; \
      -*l?*) strip_trailopt 'l';; \
      -[dEDm]) skip_next=yes;; \
      -[JT]) skip_next=yes;; \
    esac; \
    case $$flg in \
      *$$target_option*) has_opt=yes; break;; \
    esac; \
  done; \
  test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/libxml2
pkgincludedir = $(includedir)/libxml2
pkglibdir = $(libdir)/libxml2
pkglibexecdir = $(libexecdir)/libxml2
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = x86_64-redhat-linux-gnu
host_triplet = x86_64-redhat-linux-gnu
check_PROGRAMS = io1$(EXEEXT) io2$(EXEEXT) parse1$(EXEEXT) \
	parse2$(EXEEXT) parse3$(EXEEXT) parse4$(EXEEXT) \
	reader1$(EXEEXT) reader2$(EXEEXT) reader3$(EXEEXT) \
	reader4$(EXEEXT) testWriter$(EXEEXT) tree1$(EXEEXT) \
	tree2$(EXEEXT) xpath1$(EXEEXT) xpath2$(EXEEXT)
subdir = doc/examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
	$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am_io1_OBJECTS = io1.$(OBJEXT)
io1_OBJECTS = $(am_io1_OBJECTS)
io1_LDADD = $(LDADD)
io1_DEPENDENCIES = $(top_builddir)/libxml2.la
AM_V_lt = $(am__v_lt_$(V))
am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
am__v_lt_0 = --silent
am__v_lt_1 = 
am_io2_OBJECTS = io2.$(OBJEXT)
io2_OBJECTS = $(am_io2_OBJECTS)
io2_LDADD = $(LDADD)
io2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse1_OBJECTS = parse1.$(OBJEXT)
parse1_OBJECTS = $(am_parse1_OBJECTS)
parse1_LDADD = $(LDADD)
parse1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse2_OBJECTS = parse2.$(OBJEXT)
parse2_OBJECTS = $(am_parse2_OBJECTS)
parse2_LDADD = $(LDADD)
parse2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse3_OBJECTS = parse3.$(OBJEXT)
parse3_OBJECTS = $(am_parse3_OBJECTS)
parse3_LDADD = $(LDADD)
parse3_DEPENDENCIES = $(top_builddir)/libxml2.la
am_parse4_OBJECTS = parse4.$(OBJEXT)
parse4_OBJECTS = $(am_parse4_OBJECTS)
parse4_LDADD = $(LDADD)
parse4_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader1_OBJECTS = reader1.$(OBJEXT)
reader1_OBJECTS = $(am_reader1_OBJECTS)
reader1_LDADD = $(LDADD)
reader1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader2_OBJECTS = reader2.$(OBJEXT)
reader2_OBJECTS = $(am_reader2_OBJECTS)
reader2_LDADD = $(LDADD)
reader2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader3_OBJECTS = reader3.$(OBJEXT)
reader3_OBJECTS = $(am_reader3_OBJECTS)
reader3_LDADD = $(LDADD)
reader3_DEPENDENCIES = $(top_builddir)/libxml2.la
am_reader4_OBJECTS = reader4.$(OBJEXT)
reader4_OBJECTS = $(am_reader4_OBJECTS)
reader4_LDADD = $(LDADD)
reader4_DEPENDENCIES = $(top_builddir)/libxml2.la
am_testWriter_OBJECTS = testWriter.$(OBJEXT)
testWriter_OBJECTS = $(am_testWriter_OBJECTS)
testWriter_LDADD = $(LDADD)
testWriter_DEPENDENCIES = $(top_builddir)/libxml2.la
am_tree1_OBJECTS = tree1.$(OBJEXT)
tree1_OBJECTS = $(am_tree1_OBJECTS)
tree1_LDADD = $(LDADD)
tree1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_tree2_OBJECTS = tree2.$(OBJEXT)
tree2_OBJECTS = $(am_tree2_OBJECTS)
tree2_LDADD = $(LDADD)
tree2_DEPENDENCIES = $(top_builddir)/libxml2.la
am_xpath1_OBJECTS = xpath1.$(OBJEXT)
xpath1_OBJECTS = $(am_xpath1_OBJECTS)
xpath1_LDADD = $(LDADD)
xpath1_DEPENDENCIES = $(top_builddir)/libxml2.la
am_xpath2_OBJECTS = xpath2.$(OBJEXT)
xpath2_OBJECTS = $(am_xpath2_OBJECTS)
xpath2_LDADD = $(LDADD)
xpath2_DEPENDENCIES = $(top_builddir)/libxml2.la
AM_V_P = $(am__v_P_$(V))
am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
am__v_GEN_0 = @echo "  GEN     " $@;
am__v_GEN_1 = 
AM_V_at = $(am__v_at_$(V))
am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
am__v_at_0 = @
am__v_at_1 = 
DEFAULT_INCLUDES = -I. -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/io1.Po ./$(DEPDIR)/io2.Po \
	./$(DEPDIR)/parse1.Po ./$(DEPDIR)/parse2.Po \
	./$(DEPDIR)/parse3.Po ./$(DEPDIR)/parse4.Po \
	./$(DEPDIR)/reader1.Po ./$(DEPDIR)/reader2.Po \
	./$(DEPDIR)/reader3.Po ./$(DEPDIR)/reader4.Po \
	./$(DEPDIR)/testWriter.Po ./$(DEPDIR)/tree1.Po \
	./$(DEPDIR)/tree2.Po ./$(DEPDIR)/xpath1.Po \
	./$(DEPDIR)/xpath2.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
	$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_$(V))
am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
am__v_CC_0 = @echo "  CC      " $@;
am__v_CC_1 = 
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
	$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_$(V))
am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
am__v_CCLD_0 = @echo "  CCLD    " $@;
am__v_CCLD_1 = 
SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
DIST_SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates.  Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
  BEGIN { nonempty = 0; } \
  { items[$$0] = 1; nonempty = 1; } \
  END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique.  This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
  list='$(am__tagged_files)'; \
  unique=`for i in $$list; do \
    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
  done | $(am__uniquify_input)`
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = ${SHELL} '/builddir/build/BUILD/libxml2-2.10.2/missing' aclocal-1.16
AMTAR = $${TAR-tar}
AM_DEFAULT_VERBOSITY = 0
AR = ar
AUTOCONF = ${SHELL} '/builddir/build/BUILD/libxml2-2.10.2/missing' autoconf
AUTOHEADER = ${SHELL} '/builddir/build/BUILD/libxml2-2.10.2/missing' autoheader
AUTOMAKE = ${SHELL} '/builddir/build/BUILD/libxml2-2.10.2/missing' automake-1.16
AWK = gawk
BASE_THREAD_LIBS = -lpthread
C14N_OBJ = c14n.c
CATALOG_OBJ = catalog.o
CC = gcc
CCDEPMODE = depmode=none
CFLAGS = -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection
CPP = gcc -E
CPPFLAGS = 
CSCOPE = cscope
CTAGS = ctags
CYGPATH_W = echo
CYGWIN_EXTRA_LDFLAGS = 
CYGWIN_EXTRA_PYTHON_LIBADD = 
DEBUG_OBJ = debugXML.o
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
DLLTOOL = false
DSYMUTIL = 
DUMPBIN = 
ECHO_C = 
ECHO_N = -n
ECHO_T = 
EGREP = /usr/bin/grep -E
ETAGS = etags
EXEEXT = 
EXTRA_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -Wno-long-long -Wno-format-extra-args
FGREP = /usr/bin/grep -F
FTP_OBJ = nanoftp.o
GREP = /usr/bin/grep
HTML_OBJ = HTMLparser.o HTMLtree.o
HTTP_OBJ = nanohttp.o
ICONV_LIBS = 
ICU_CFLAGS = 
ICU_DEFS = 
ICU_LIBS = 
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
LD = /usr/bin/ld -m elf_x86_64
LDFLAGS = -Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
LIBM = -lm
LIBOBJS = 
LIBS = 
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LIBXML_MAJOR_VERSION = 2
LIBXML_MICRO_VERSION = 2
LIBXML_MINOR_VERSION = 10
LIBXML_VERSION = 2.10.2
LIBXML_VERSION_EXTRA = 
LIBXML_VERSION_INFO = 12:2:10
LIBXML_VERSION_NUMBER = 21002
LIPO = 
LN_S = ln -s
LTLIBOBJS = 
LT_SYS_LIBRARY_PATH = 
LZMA_CFLAGS = 
LZMA_LIBS = -llzma 
MAINT = 
MAKEINFO = ${SHELL} '/builddir/build/BUILD/libxml2-2.10.2/missing' makeinfo
MANIFEST_TOOL = :
MKDIR_P = /usr/bin/mkdir -p
MODULE_EXTENSION = .so
MODULE_PLATFORM_LIBS = -ldl
MV = /usr/bin/mv
NM = /usr/bin/nm -B
NMEDIT = 
OBJDUMP = objdump
OBJEXT = o
OTOOL = 
OTOOL64 = 
PACKAGE = libxml2
PACKAGE_BUGREPORT = 
PACKAGE_NAME = libxml2
PACKAGE_STRING = libxml2 2.10.2
PACKAGE_TARNAME = libxml2
PACKAGE_URL = 
PACKAGE_VERSION = 2.10.2
PATH_SEPARATOR = :
PERL = /usr/bin/perl
PKG_CONFIG = /usr/bin/x86_64-redhat-linux-gnu-pkg-config
PKG_CONFIG_LIBDIR = 
PKG_CONFIG_PATH = :/opt/alt/libxml2/usr/lib64/pkgconfig:/opt/alt/libxml2/usr/share/pkgconfig
PYTHON = 
PYTHON_CFLAGS = 
PYTHON_EXEC_PREFIX = 
PYTHON_LIBS = 
PYTHON_PLATFORM = 
PYTHON_PREFIX = 
PYTHON_TESTS = 
PYTHON_VERSION = 
RANLIB = ranlib
RDL_LIBS = 
RELDATE = Fri Mar 14 2025
SED = /usr/bin/sed
SET_MAKE = 
SHELL = /bin/sh
STRIP = strip
TAR = /usr/bin/tar
TEST_CATALOG = Catatests
TEST_DEBUG = Scripttests
TEST_REGEXPS = Automatatests
TEST_SCHEMATRON = Schematrontests
TEST_VALID = 
TEST_VTIME = VTimingtests
THREAD_CFLAGS =  -D_REENTRANT
THREAD_LIBS = 
VERSION = 2.10.2
VERSION_SCRIPT_FLAGS = -Wl,--version-script=
WGET = /usr/bin/wget
WIN32_EXTRA_LDFLAGS = 
WIN32_EXTRA_LIBADD = 
WIN32_EXTRA_PYTHON_LIBADD = 
WITH_C14N = 1
WITH_CATALOG = 1
WITH_DEBUG = 1
WITH_FTP = 1
WITH_HTML = 1
WITH_HTTP = 1
WITH_ICONV = 1
WITH_ICU = 0
WITH_ISO8859X = 1
WITH_LEGACY = 0
WITH_LZMA = 1
WITH_MEM_DEBUG = 0
WITH_MODULES = 1
WITH_OUTPUT = 1
WITH_PATTERN = 1
WITH_PUSH = 1
WITH_READER = 1
WITH_REGEXPS = 1
WITH_RUN_DEBUG = 0
WITH_SAX1 = 1
WITH_SCHEMAS = 1
WITH_SCHEMATRON = 1
WITH_THREADS = 1
WITH_THREAD_ALLOC = 0
WITH_TREE = 1
WITH_TRIO = 0
WITH_VALID = 1
WITH_WRITER = 1
WITH_XINCLUDE = 1
WITH_XPATH = 1
WITH_XPTR = 1
WITH_XPTR_LOCS = 0
WITH_ZLIB = 1
XINCLUDE_OBJ = xinclude.o
XMLLINT = /usr/bin/xmllint
XML_CFLAGS = 
XML_INCLUDEDIR = -I${includedir}/libxml2
XML_LIBDIR = -L${libdir}
XML_LIBS = -lxml2
XML_LIBTOOLLIBS = libxml2.la
XML_PRIVATE_LIBS = -lz  -llzma     -lm 
XPATH_OBJ = xpath.o
XPTR_OBJ = xpointer.o
XSLTPROC = /usr/bin/xsltproc
Z_CFLAGS = 
Z_LIBS = -lz 
abs_builddir = /builddir/build/BUILD/libxml2-2.10.2/doc/examples
abs_srcdir = /builddir/build/BUILD/libxml2-2.10.2/doc/examples
abs_top_builddir = /builddir/build/BUILD/libxml2-2.10.2
abs_top_srcdir = /builddir/build/BUILD/libxml2-2.10.2
ac_ct_AR = ar
ac_ct_CC = gcc
ac_ct_DUMPBIN = 
am__include = include
am__leading_dot = .
am__quote = 
am__tar = $${TAR-tar} chof - "$$tardir"
am__untar = $${TAR-tar} xf -
bindir = /opt/alt/libxml2/usr/bin
build = x86_64-redhat-linux-gnu
build_alias = x86_64-redhat-linux-gnu
build_cpu = x86_64
build_os = linux-gnu
build_vendor = redhat
builddir = .
datadir = /opt/alt/libxml2/usr/share
datarootdir = ${prefix}/share
docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
dvidir = ${docdir}
exec_prefix = /opt/alt/libxml2/usr
host = x86_64-redhat-linux-gnu
host_alias = x86_64-redhat-linux-gnu
host_cpu = x86_64
host_os = linux-gnu
host_vendor = redhat
htmldir = ${docdir}
includedir = /opt/alt/libxml2/usr/include
infodir = /opt/alt/libxml2/usr/share/info
install_sh = ${SHELL} /builddir/build/BUILD/libxml2-2.10.2/install-sh
libdir = /opt/alt/libxml2/usr/lib64
libexecdir = /opt/alt/libxml2/usr/libexec
localedir = ${datarootdir}/locale
localstatedir = /var
mandir = /opt/alt/libxml2/usr/share/man
mkdir_p = $(MKDIR_P)
oldincludedir = /usr/include
pdfdir = ${docdir}
pkgpyexecdir = 
pkgpythondir = 
prefix = /opt/alt/libxml2/usr
program_transform_name = s&^&&
psdir = ${docdir}
pyexecdir = 
pythondir = 
runstatedir = ${localstatedir}/run
sbindir = /opt/alt/libxml2/usr/sbin
sharedstatedir = /var/lib
srcdir = .
sysconfdir = /etc
target_alias = 
top_build_prefix = ../../
top_builddir = ../..
top_srcdir = ../..
AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
LDADD = $(top_builddir)/libxml2.la
CLEANFILES = *.tmp
EXTRA_DIST = \
	examples.xml \
	examples.xsl \
	index.html \
	index.py \
	test1.xml \
	test2.xml \
	test3.xml

io1_SOURCES = io1.c
io2_SOURCES = io2.c
parse1_SOURCES = parse1.c
parse2_SOURCES = parse2.c
parse3_SOURCES = parse3.c
parse4_SOURCES = parse4.c
reader1_SOURCES = reader1.c
reader2_SOURCES = reader2.c
reader3_SOURCES = reader3.c
reader4_SOURCES = reader4.c
testWriter_SOURCES = testWriter.c
tree1_SOURCES = tree1.c
tree2_SOURCES = tree2.c
xpath1_SOURCES = xpath1.c
xpath2_SOURCES = xpath2.c
all: all-am

.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/examples/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign doc/examples/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
	esac;

$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh

$(top_srcdir)/configure:  $(am__configure_deps)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):

clean-checkPROGRAMS:
	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
	echo " rm -f" $$list; \
	rm -f $$list || exit $$?; \
	test -n "$(EXEEXT)" || exit 0; \
	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
	echo " rm -f" $$list; \
	rm -f $$list

io1$(EXEEXT): $(io1_OBJECTS) $(io1_DEPENDENCIES) $(EXTRA_io1_DEPENDENCIES) 
	@rm -f io1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(io1_OBJECTS) $(io1_LDADD) $(LIBS)

io2$(EXEEXT): $(io2_OBJECTS) $(io2_DEPENDENCIES) $(EXTRA_io2_DEPENDENCIES) 
	@rm -f io2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(io2_OBJECTS) $(io2_LDADD) $(LIBS)

parse1$(EXEEXT): $(parse1_OBJECTS) $(parse1_DEPENDENCIES) $(EXTRA_parse1_DEPENDENCIES) 
	@rm -f parse1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse1_OBJECTS) $(parse1_LDADD) $(LIBS)

parse2$(EXEEXT): $(parse2_OBJECTS) $(parse2_DEPENDENCIES) $(EXTRA_parse2_DEPENDENCIES) 
	@rm -f parse2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse2_OBJECTS) $(parse2_LDADD) $(LIBS)

parse3$(EXEEXT): $(parse3_OBJECTS) $(parse3_DEPENDENCIES) $(EXTRA_parse3_DEPENDENCIES) 
	@rm -f parse3$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse3_OBJECTS) $(parse3_LDADD) $(LIBS)

parse4$(EXEEXT): $(parse4_OBJECTS) $(parse4_DEPENDENCIES) $(EXTRA_parse4_DEPENDENCIES) 
	@rm -f parse4$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parse4_OBJECTS) $(parse4_LDADD) $(LIBS)

reader1$(EXEEXT): $(reader1_OBJECTS) $(reader1_DEPENDENCIES) $(EXTRA_reader1_DEPENDENCIES) 
	@rm -f reader1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader1_OBJECTS) $(reader1_LDADD) $(LIBS)

reader2$(EXEEXT): $(reader2_OBJECTS) $(reader2_DEPENDENCIES) $(EXTRA_reader2_DEPENDENCIES) 
	@rm -f reader2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader2_OBJECTS) $(reader2_LDADD) $(LIBS)

reader3$(EXEEXT): $(reader3_OBJECTS) $(reader3_DEPENDENCIES) $(EXTRA_reader3_DEPENDENCIES) 
	@rm -f reader3$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader3_OBJECTS) $(reader3_LDADD) $(LIBS)

reader4$(EXEEXT): $(reader4_OBJECTS) $(reader4_DEPENDENCIES) $(EXTRA_reader4_DEPENDENCIES) 
	@rm -f reader4$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(reader4_OBJECTS) $(reader4_LDADD) $(LIBS)

testWriter$(EXEEXT): $(testWriter_OBJECTS) $(testWriter_DEPENDENCIES) $(EXTRA_testWriter_DEPENDENCIES) 
	@rm -f testWriter$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(testWriter_OBJECTS) $(testWriter_LDADD) $(LIBS)

tree1$(EXEEXT): $(tree1_OBJECTS) $(tree1_DEPENDENCIES) $(EXTRA_tree1_DEPENDENCIES) 
	@rm -f tree1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(tree1_OBJECTS) $(tree1_LDADD) $(LIBS)

tree2$(EXEEXT): $(tree2_OBJECTS) $(tree2_DEPENDENCIES) $(EXTRA_tree2_DEPENDENCIES) 
	@rm -f tree2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(tree2_OBJECTS) $(tree2_LDADD) $(LIBS)

xpath1$(EXEEXT): $(xpath1_OBJECTS) $(xpath1_DEPENDENCIES) $(EXTRA_xpath1_DEPENDENCIES) 
	@rm -f xpath1$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(xpath1_OBJECTS) $(xpath1_LDADD) $(LIBS)

xpath2$(EXEEXT): $(xpath2_OBJECTS) $(xpath2_DEPENDENCIES) $(EXTRA_xpath2_DEPENDENCIES) 
	@rm -f xpath2$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(xpath2_OBJECTS) $(xpath2_LDADD) $(LIBS)

mostlyclean-compile:
	-rm -f *.$(OBJEXT)

distclean-compile:
	-rm -f *.tab.c

#include ./$(DEPDIR)/io1.Po # am--include-marker
#include ./$(DEPDIR)/io2.Po # am--include-marker
#include ./$(DEPDIR)/parse1.Po # am--include-marker
#include ./$(DEPDIR)/parse2.Po # am--include-marker
#include ./$(DEPDIR)/parse3.Po # am--include-marker
#include ./$(DEPDIR)/parse4.Po # am--include-marker
#include ./$(DEPDIR)/reader1.Po # am--include-marker
#include ./$(DEPDIR)/reader2.Po # am--include-marker
#include ./$(DEPDIR)/reader3.Po # am--include-marker
#include ./$(DEPDIR)/reader4.Po # am--include-marker
#include ./$(DEPDIR)/testWriter.Po # am--include-marker
#include ./$(DEPDIR)/tree1.Po # am--include-marker
#include ./$(DEPDIR)/tree2.Po # am--include-marker
#include ./$(DEPDIR)/xpath1.Po # am--include-marker
#include ./$(DEPDIR)/xpath2.Po # am--include-marker

$(am__depfiles_remade):
	@$(MKDIR_P) $(@D)
	@echo '# dummy' >$@-t && $(am__mv) $@-t $@

am--depfiles: $(am__depfiles_remade)

.c.o:
#	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
#	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
#	$(AM_V_CC)source='$<' object='$@' libtool=no 
#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) 
	$(AM_V_CC)$(COMPILE) -c -o $@ $<

.c.obj:
#	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
#	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
#	$(AM_V_CC)source='$<' object='$@' libtool=no 
#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) 
	$(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`

.c.lo:
#	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
#	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
#	$(AM_V_CC)source='$<' object='$@' libtool=yes 
#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) 
	$(AM_V_CC)$(LTCOMPILE) -c -o $@ $<

mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs

ID: $(am__tagged_files)
	$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags

tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	set x; \
	here=`pwd`; \
	$(am__define_uniq_tagged_files); \
	shift; \
	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
	  test -n "$$unique" || unique=$$empty_fix; \
	  if test $$# -gt 0; then \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      "$$@" $$unique; \
	  else \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      $$unique; \
	  fi; \
	fi
ctags: ctags-am

CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	$(am__define_uniq_tagged_files); \
	test -z "$(CTAGS_ARGS)$$unique" \
	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
	     $$unique

GTAGS:
	here=`$(am__cd) $(top_builddir) && pwd` \
	  && $(am__cd) $(top_srcdir) \
	  && gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am

cscopelist-am: $(am__tagged_files)
	list='$(am__tagged_files)'; \
	case "$(srcdir)" in \
	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
	  *) sdir=$(subdir)/$(srcdir) ;; \
	esac; \
	for i in $$list; do \
	  if test -f "$$i"; then \
	    echo "$(subdir)/$$i"; \
	  else \
	    echo "$$sdir/$$i"; \
	  fi; \
	done >> $(top_builddir)/cscope.files

distclean-tags:
	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(BUILT_SOURCES)
	$(MAKE) $(AM_MAKEFLAGS) distdir-am

distdir-am: $(DISTFILES)
	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	list='$(DISTFILES)'; \
	  dist_files=`for file in $$list; do echo $$file; done | \
	  sed -e "s|^$$srcdirstrip/||;t" \
	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
	case $$dist_files in \
	  */*) $(MKDIR_P) `echo "$$dist_files" | \
			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
			   sort -u` ;; \
	esac; \
	for file in $$dist_files; do \
	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
	  if test -d $$d/$$file; then \
	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
	    if test -d "$(distdir)/$$file"; then \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
	  else \
	    test -f "$(distdir)/$$file" \
	    || cp -p $$d/$$file "$(distdir)/$$file" \
	    || exit 1; \
	  fi; \
	done
check-am: all-am
	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
	$(MAKE) $(AM_MAKEFLAGS) check-local
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am

install-am: all-am
	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am

installcheck: installcheck-am
install-strip:
	if test -z '$(STRIP)'; then \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	      install; \
	else \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
	fi
mostlyclean-generic:

clean-generic:
	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)

distclean-generic:
	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)

maintainer-clean-generic:
	@echo "This command is intended for maintainers to use"
	@echo "it deletes files that may require special tools to rebuild."
clean: clean-am

clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
	mostlyclean-am

distclean: distclean-am
		-rm -f ./$(DEPDIR)/io1.Po
	-rm -f ./$(DEPDIR)/io2.Po
	-rm -f ./$(DEPDIR)/parse1.Po
	-rm -f ./$(DEPDIR)/parse2.Po
	-rm -f ./$(DEPDIR)/parse3.Po
	-rm -f ./$(DEPDIR)/parse4.Po
	-rm -f ./$(DEPDIR)/reader1.Po
	-rm -f ./$(DEPDIR)/reader2.Po
	-rm -f ./$(DEPDIR)/reader3.Po
	-rm -f ./$(DEPDIR)/reader4.Po
	-rm -f ./$(DEPDIR)/testWriter.Po
	-rm -f ./$(DEPDIR)/tree1.Po
	-rm -f ./$(DEPDIR)/tree2.Po
	-rm -f ./$(DEPDIR)/xpath1.Po
	-rm -f ./$(DEPDIR)/xpath2.Po
	-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
	distclean-tags

dvi: dvi-am

dvi-am:

html: html-am

html-am:

info: info-am

info-am:

install-data-am: install-data-local

install-dvi: install-dvi-am

install-dvi-am:

install-exec-am:

install-html: install-html-am

install-html-am:

install-info: install-info-am

install-info-am:

install-man:

install-pdf: install-pdf-am

install-pdf-am:

install-ps: install-ps-am

install-ps-am:

installcheck-am:

maintainer-clean: maintainer-clean-am
		-rm -f ./$(DEPDIR)/io1.Po
	-rm -f ./$(DEPDIR)/io2.Po
	-rm -f ./$(DEPDIR)/parse1.Po
	-rm -f ./$(DEPDIR)/parse2.Po
	-rm -f ./$(DEPDIR)/parse3.Po
	-rm -f ./$(DEPDIR)/parse4.Po
	-rm -f ./$(DEPDIR)/reader1.Po
	-rm -f ./$(DEPDIR)/reader2.Po
	-rm -f ./$(DEPDIR)/reader3.Po
	-rm -f ./$(DEPDIR)/reader4.Po
	-rm -f ./$(DEPDIR)/testWriter.Po
	-rm -f ./$(DEPDIR)/tree1.Po
	-rm -f ./$(DEPDIR)/tree2.Po
	-rm -f ./$(DEPDIR)/xpath1.Po
	-rm -f ./$(DEPDIR)/xpath2.Po
	-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

mostlyclean: mostlyclean-am

mostlyclean-am: mostlyclean-compile mostlyclean-generic \
	mostlyclean-libtool

pdf: pdf-am

pdf-am:

ps: ps-am

ps-am:

uninstall-am: uninstall-local

.MAKE: check-am install-am install-strip

.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
	check-local clean clean-checkPROGRAMS clean-generic \
	clean-libtool clean-local cscopelist-am ctags ctags-am \
	distclean distclean-compile distclean-generic \
	distclean-libtool distclean-tags distdir dvi dvi-am html \
	html-am info info-am install install-am install-data \
	install-data-am install-data-local install-dvi install-dvi-am \
	install-exec install-exec-am install-html install-html-am \
	install-info install-info-am install-man install-pdf \
	install-pdf-am install-ps install-ps-am install-strip \
	installcheck installcheck-am installdirs maintainer-clean \
	maintainer-clean-generic mostlyclean mostlyclean-compile \
	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
	tags tags-am uninstall uninstall-am uninstall-local

.PRECIOUS: Makefile


rebuild:
	cd $(srcdir) && $(PYTHON) index.py
	$(MAKE) Makefile
	cd $(srcdir) && xsltproc examples.xsl examples.xml
	-cd $(srcdir) && xmllint --valid --noout index.html

.PHONY: rebuild

install-data-local: 
	$(MKDIR_P) $(DESTDIR)$(docdir)/examples
	-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/

uninstall-local:
	rm -f $(DESTDIR)$(docdir)/examples/*.c
	rm -f $(DESTDIR)$(docdir)/examples/*.html
	-rmdir $(DESTDIR)$(docdir)/examples

clean-local:
	test -f Makefile.am || rm -f test?.xml
	rm -f .memdump

valgrind: 
	$(MAKE) CHECKER='valgrind' check

check-local:
	@test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .
	@(echo '## examples regression tests')
	@(echo > .memdump)
	@$(CHECKER) ./io1 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./io2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse1 test1.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse2 test2.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse3
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse4 test3.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader2 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader3 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader4 test1.xml test2.xml test3.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./testWriter
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath1 test3.xml '//child2' >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath2 test3.xml '//discarded' discarded >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@rm -f *.tmp

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
doc/alt-libxml2-devel/examples/testWriter000075500000017446151730335270014477 0ustar00#! /bin/sh

# testWriter - temporary wrapper script for .libs/testWriter
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The testWriter program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file testWriter.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "testWriter:testWriter:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "testWriter:testWriter:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "testWriter:testWriter:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'testWriter'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/examples/Makefile.am000064400000006163151730335270014423 0ustar00AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
LDADD = $(top_builddir)/libxml2.la

CLEANFILES = *.tmp

rebuild:
	cd $(srcdir) && $(PYTHON) index.py
	$(MAKE) Makefile
	cd $(srcdir) && xsltproc examples.xsl examples.xml
	-cd $(srcdir) && xmllint --valid --noout index.html

.PHONY: rebuild

install-data-local: 
	$(MKDIR_P) $(DESTDIR)$(docdir)/examples
	-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/

uninstall-local:
	rm -f $(DESTDIR)$(docdir)/examples/*.c
	rm -f $(DESTDIR)$(docdir)/examples/*.html
	-rmdir $(DESTDIR)$(docdir)/examples

clean-local:
	test -f Makefile.am || rm -f test?.xml
	rm -f .memdump

EXTRA_DIST = \
	examples.xml \
	examples.xsl \
	index.html \
	index.py \
	test1.xml \
	test2.xml \
	test3.xml

check_PROGRAMS = \
	io1 \
	io2 \
	parse1 \
	parse2 \
	parse3 \
	parse4 \
	reader1 \
	reader2 \
	reader3 \
	reader4 \
	testWriter \
	tree1 \
	tree2 \
	xpath1 \
	xpath2

io1_SOURCES = io1.c

io2_SOURCES = io2.c

parse1_SOURCES = parse1.c

parse2_SOURCES = parse2.c

parse3_SOURCES = parse3.c

parse4_SOURCES = parse4.c

reader1_SOURCES = reader1.c

reader2_SOURCES = reader2.c

reader3_SOURCES = reader3.c

reader4_SOURCES = reader4.c

testWriter_SOURCES = testWriter.c

tree1_SOURCES = tree1.c

tree2_SOURCES = tree2.c

xpath1_SOURCES = xpath1.c

xpath2_SOURCES = xpath2.c

valgrind: 
	$(MAKE) CHECKER='valgrind' check

check-local:
	@test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .
	@(echo '## examples regression tests')
	@(echo > .memdump)
	@$(CHECKER) ./io1 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./io2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse1 test1.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse2 test2.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse3
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./parse4 test3.xml
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader2 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader3 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./reader4 test1.xml test2.xml test3.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./testWriter
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree1 test2.xml >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./tree2 >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath1 test3.xml '//child2' >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@$(CHECKER) ./xpath2 test3.xml '//discarded' discarded >/dev/null
	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
	@rm -f *.tmp
doc/alt-libxml2-devel/examples/xpath2.o000064400000121410151730335270013746 0ustar00ELF>�@@<;

/1.2-3,4H��tH��H�=�1�H��PH�
�DH�5H�=�GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignxpath2.cnamefilenamexpathExprvaluenodes->nodeTab[i]Usage: %s <xml-file> <xpath-expr> <value>
Error: wrong number of arguments.
Error: unable to parse file "%s"
Error: unable to create new XPath context
Error: unable to evaluate xpath expression "%s"
GA*GA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*GA*GOW*�GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS��AWAVAUI��ATUSH�����4��
R�I�mM�eM�uH���M����M����H���H��H����H���H��H���\H��L���H���L�xM��twA���xoI�wHc�L�,�H�<�H������M��H��I)��DI��J�<*H����L��H�D$�I�WH�D$J�*H�1�~tH�M9�u�H���H���H�=H���H�����1�H��[]A\A]A^A_�H�
�"�H�=�I�}�����H�
��H�5H�=�H�=L��H��H���H���I�}����k���H�
�*�H�=�H�����H�=H��1�H���H�
�\H�5H�=�H�
�[H�5H�=�H�
�ZH�5H�=�usageupdate_xpath_nodesexample4/�5int�C�C���1.	3<	6	�	7	�	8	�	9	� 	:	�(	;	�0	<	�8	=	�@	@	�H	A	�P	B	�X	DG`	FMh	H<p	I<t	Jtx	MX�	Nf�	OS�	Qc�	Y
��	[n�	\y�	]M�	^	��	_
)�	`<�	b��
+B��c
5:it��
5��.�����<�������	Q��_
��	


�
_
��	

��x
��
��
��
��
��
�� 
��(
��0
��8doc
�E@ns
��H
�P
��X
��`
��h
�Xp
�Xr��
��
��
��
��
��
�� 
�E(
��0
��8doc
�E@
��H
��P
��X
��`
��h
��p
��x��
'E
(�
)�
*�
+�
,� 
-�(
.�0
/�8doc
0E@
3<H
4<L
:�P
;�X
<`
=�h
>�pids
?�x
@��URL
A��
B<�
D	�
E��
F<�
H<��^oR
w�
��0
��
�
�u
��
��
�� 
�E(
����`
��
��
��
��
��
�� 
��(
��0
��8doc
�E@ns
��H
��P
��X
��
���
%�
&	�^9		*	�B36	<	�K	)MW	]	�q	�)W}	�	��	�
�	
�	�	_�	�	L�	XN�
	O
<	P
<	Q�	R�		S�	T
< 	U�(	V�0	W�8	X
<@	Y
<D	Z�H	[�PM�
�	Z�
�
�
��
��*	�*	�K	�
	�q	'!.x,�
doc-�.�0	<1	<2�	4	< 5	<$6(8	<09	<4:�	8<	<@=	<D>�HA	PB	<XC�`F	<hG	<lJ	<pK�xL��O�	�P ��Q��T��W��X��[��\��_	�`	<�c��d�
�e�	�f�@icHk	<Pn�Xq5`r5hs	<p(�
")'�
X�fcur�����	<��
�� �<(�<,�40�!8�	<@��H�<P* r�
Q�S�	T	<	U	<	V�
R�x_e	r�| H~�		��	�	<	��	� 	��(	�	<0	��8	�	<@}����<��<���	��	����*:f<�FL�`f��l��	��	�:��`�$�����������	����z"{.����������"��8��	< i�	<!�	��
5�"U<2U�U/�UI� docV�W�
X�!B	�B
52CtC�!�	��
5t# <{�_$ 
<$ _%�-	�&�&�&�'(�((%aw�&z&n'(�(�)u�*T|+�*U	*T	*Q�*R	,ep	D&�-v+�*T1*Q	*R~,eh	�&�-v+�*U	*T1*Q*,ea&�-v+�*T1*Q	*Rv)�*Uv)�0*Us)�N*U~*Tv.�)�s*Uv)��*Ts)��*Us)��*Uv)��*Us)��*Us)�**U	*T	*Q\*R	)�i*U	*T	*Q[*R	+�*U	*T	*QZ*R	,e#&�-v+�*U	*T1*Q".)
**U

R..&.G.G�/d<�d�d<�01GB�u&T,eF&�-v2�*T1*Q	*R�U3GC4T'+�*U	*T	*QD*R	5
%6C
6Z75L555�55
�5
576596�%U:;9I$>$>I&I:;9	
:;9I8
:;9<I
!I/4:;9I?<7I!>I:;9(:;9
:;9I8
:;9I8:;9I'I'I:;9
:;9I84:;9I?<.:;9' :;9I4:;9I 4:;9I!4I4".:;9'I #.?:;9'I@�B$:;9I�B%1R�BUXYW&1�B'U(41�B)��1*���B+��1,1R�BXYW-1.��1/.?:;9'I 401.1@�B2���B131R�BUXYW415.?<n:;96.?<n:;97.?<n:;U�U�U�U�T]�T�T]�T�]\\\\\^^^^^VVVPSSPSPVVPVPP\\__�1�QR
�
�
�
�UR�U�U�U�
�<B{L��
/usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include../../include/libxmlxpath2.cstdio2.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.hxmlstring.htree.hdict.hxmlmemory.hhash.hxmlerror.hglobals.hxpath.hassert.hparser.hxmlversion.h<built-in>	�Z
�.]!�	L�Y�	J(�������=���J$
Xf/��<J��XJXJ<gjtX\����]Y/i��
tX���X�	Pt
�	����	9�
�	�w.
�z.��_xmlXPathCompExprparentuser2lastErrortmpNsNrlastxmlAttributeType_shortbufbase_IO_lock_txmlFreestderr_IO_buf_endnb_types_privatemessagemax_variables_unused_xmlDtdnodesSystemIDentitiesnode_xmlNodeSetxmlMallocxmlDocDump_IO_write_endunsigned intXML_ATTRIBUTE_CDATAnextversion_freeres_listxmlChar_flagsxpathCtxxpathExprXPATH_XSLT_TREEpentitiesstringval_xmlNs_old_offsetlevel__builtin_fwritexmlInitParserxmlErrorPtrvalueNrXML_ERR_ERRORaxiselementsintSubseterrorfuncfilenameprevXML_TEXT_NODExmlXPathObjectnodeTabcachexmlDictXML_ENTITY_DECLxmlXPathFunctionxmlXPathNewContextxmlXPathFreeObjecthere_IO_save_endboolvalxmlCleanupParserindexmax_funcs_unusedxmlStrdupFuncXML_COMMENT_NODE_xmlXPathObjectmax_axislong long unsigned intfilevalueMaxxmlDocPtrsys_errlist_IO_backup_basexmlNsType_offsetXML_ERR_WARNINGxmlXPathTypePtrsys_nerr_xmlXPathContextvalue_filenoxmlXPathContextxmlXPathTypeprefixsize_t_vtable_offset_markersXML_XINCLUDE_ENDXPATH_STRINGfloatvalnodeNr_IO_read_basexmlDocstr1str2str3originflagsxmlXPathObjectTypecodexmlXPathContextPtr__fmtXML_ATTRIBUTE_NODEnb_variables_unusedtypesxmlParseFileindex2XML_ATTRIBUTE_ENTITIESxmlNodexmlXPathObjectPtrxmlXPathVariableLookupFunc__stream_xmlError_xmlXPathTypechar__fprintf_chk_modenodeMaxencoding_IO_markernodesetval_IO_read_ptrint1proximityPositionxmlXPathFreeContextxmlStructuredErrorFuncXML_CDATA_SECTION_NODExmlXPathFuncLookupFuncXML_NAMESPACE_DECLusageoldNsxmlErrorLevelXML_ATTRIBUTE_IDxmlXPathEvalExpressionXPATH_BOOLEAN_IO_write_basexmlMallocFunclong long intXML_ENTITY_NODEXML_XINCLUDE_STARTancestor_IO_save_base_xmlAttrdepthxmlXPathAxisatypehrefcontextopLimitdictxmlXPathCompExprxmlDictPtrfuncHashmax_typescharsetXML_DTD_NODExmlXPathNINFxmlXPathAxisPtrparseFlagsfuncLookupFuncnb_axissize_freeres_buffunctionURIXML_NOTATION_NODEdebugNodexmlErrorxmlXPathParserContextPtr__pad5long unsigned intXML_ATTRIBUTE_DECLxmlMemStrdupargcxmlXPathAxisFunc_xmlXPathAxisnsHashopCountnamespacesargvlong doubleextSubsettmpNsListxmlMemoryDumpxmlNodeSetPtrxmlFreeDocxmlElementTypexmlXPathParserContextpsvivarLookupFuncXML_ATTRIBUTE_ENTITYnsDef_IO_read_endrefsXML_ATTRIBUTE_NOTATIONshort intxmlHashTableXML_DOCUMENT_TYPE_NODEctxtlong intpropertiesXPATH_UNDEFINEDGNU C17 8.5.0 20210514 (Red Hat 8.5.0-24) -m64 -mtune=generic -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIE -fplugin=gcc-annobinxmlNodeSetContentxmlXPathPINFxpathObjxmlXPathCompExprPtr_IO_wide_dataxptrxmlRealloc_xmlDocfprintfxpath2.cxmlHashTablePtrdomainXML_PI_NODEextraXML_ATTRIBUTE_IDREFstandalonenameXPATH_NUMBER_xmlDictXPATH_NODESETXPATH_USERS_xmlXPathParserContext_wide_dataint2nb_funcs_unused_lock_IO_codecvt_codecvtxmlNodePtrvalueFramestdin_IO_FILE__assert_failXML_ELEMENT_DECLXML_ATTRIBUTE_IDREFSXML_ATTRIBUTE_NMTOKENStypeunsigned charxmlCheckVersionfunctionlineXML_ERR_FATALxmlNodeSet_IO_write_ptrnotationsExternalIDxmlNsPtrattributescontextSizexmlXPathConvertFuncXML_ELEMENT_NODEcontentfuncLookupDataXML_ERR_NONEupdate_xpath_nodesXML_ATTRIBUTE_NMTOKENnsNr_xmlHashTablexmlReallocFuncstdoutXML_DOCUMENT_FRAG_NODExmlMallocAtomiccompressionfwrite__off_tvarHashsigned charXML_HTML_DOCUMENT_NODEuserDatashort unsigned intXML_ENTITY_REF_NODEXML_DOCUMENT_NODEmain__PRETTY_FUNCTION__xmlFreeFuncchildrendoublevarLookupData_chainuserexample4_xmlNodeFILE_flags2XML_ATTRIBUTE_ENUMERATIONcompxmlNs_cur_columnvalueTab__off64_t_unused2_IO_buf_basexmlXPathNAN/builddir/build/BUILD/libxml2-2.10.2/doc/examplesGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-24)GNU�zRx�BcH0{F�B�B �E(�A0�A8�DP2
8A0A(B BBBA
�	
0)
?1Yt2��3��4�B%B+DX{j�(	!"$&(*12345607���	�0�'�����X�!�����+,-./*1GUc{hv��������$2.annobin_xpath2.c.annobin_xpath2.c_end.annobin_xpath2.c.hot.annobin_xpath2.c_end.hot.annobin_xpath2.c.unlikely.annobin_xpath2.c_end.unlikely.annobin_xpath2.c.startup.annobin_xpath2.c_end.startup.annobin_xpath2.c.exit.annobin_xpath2.c_end.exit.annobin_usage.start.annobin_usage.endusage__PRETTY_FUNCTION__.7902.annobin_main.start.annobin_main.end__PRETTY_FUNCTION__.7918__PRETTY_FUNCTION__.7911.LC2.LC0.LC1.LC3.LC10.LC9.LC8.LC7.LC6.LC5.LC4.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupstderr_GLOBAL_OFFSET_TABLE___fprintf_chk__assert_failmainxmlInitParserxmlCheckVersionxmlParseFilexmlXPathNewContextxmlXPathEvalExpressionxmlNodeSetContentxmlXPathFreeObjectxmlXPathFreeContextstdoutxmlDocDumpxmlFreeDocxmlCleanupParserxmlMemoryDumpfwriteN��������4��������&#��������25��������96��������>Q��������P�������� 1��B$,B + , - .22{S��������)T��������XU��������lV���������W���������X��������Y��������Z��������#[��������+\��������3]��������8^��������=_��������UN��������f7��������k`��������t���������#�5���������8���������Q���������N���������9���������P���������Z���������]������������������N���������:���������`���������]��������N��������;��������P��������!#$-5��������4<��������9Q��������@#$L5��������S=��������XQ��������_#$k5��������r>��������wQ��������
%
*\	
*�

*�
(�%
)*
*�8
*�F
*8	M
*cT
*�[
*�
b
*�i
*_
p
*	u
*O
�
*l�
*&�
*�
*��
*C�
*f�
*��
*�
*F�
*7
*�
*
*p*
*�7
*;D
*�Q
*�^
*k
*�x
**�
*��
*W�
*��
*G�
*b�
*U�
*t�
*B�
*-�
*o
*�
*9!
*v/
*%;
*VC
*Pj
*hu
*w
�
*��
*
�
*i�
*}�
*/�
*;
*�"
*x(
*.
*�4
*�
:
*q@
*�
F
*�L
*�
R
*	X
*
^
*�d
*k
j
*p
*�v
*�|
*?�
*��
*��
*��
*��
*�
*�
*�
�
*��
*��
*��
*��
*��
*2�
*��
*6�
*
*�
*�(
*�
6
*�
D
*1R
*`
* n
*�
*��
*A	�
*��
*��
*�
*�
�
*�
*�
*�
*�
*
*�
8
*1F
*T
* b
*~
*E�
*��
*c�
*��
*O�
*��
*m�
*�
�
*�
*�
*�

*�
-
*1;
*I
* W
*s
*<
�
*�
�
*��
*N�
*��
*%�
*G�
*��
*

*�
*�)
*H7
*A	N
*BS
*7_
*d
*�v
*K�
*Q�
*��
* �
*��
*��
*��
*��
*��
*Z
*�
*�(
*�6
*�
D
*�
R
*1`
*n
* |
*�
*��
*��
*��
*}�
*$�
*%	
*�
+	
*UL	
*�r	
*��	
*	�	
*��	
*�
�	
*��	
*]�	
*��	
*�	
*�	
*��	
*

*�


*Z

*�)

*�6

*C

*P

*+]

*0j

*5w

*s�

*M�

*3	�

*��

*��

*��

*��

*,
�

*�

*a
*�#
*�/
*�L
*�Z
*�h
*�v
*W
�
*|�
*�
*��
*R�
*��
*�
*b�
*��
*�
*2
*�
*,
*n:
*xH
*�
V
*�d
*:r
*#�
*��
*�
�
*�
�
*�
*|�
*S�
*��
*X�
*)�
*�


*�

*(

*�7

*�F

*AU

*1d

*�s

**�

*��

*_�

*��

*+�

*Q�

*��

*��

*�
*�
* 
*c.
*L<
*�
J
*�X
*�g
*�y
*,�
*��
*�
*?�
*)�
*p�
*L	�
*�
*8�
*�
�
*��
*�
*]
*G
*
*�*
*�7
*[D
*�Q
*^
*wk
*x
*��
*�
*��
*��
*�
�
*z�
*��
*�
*�

*�
*m;
*a
*�m
*z
*�
�
*��
*8�
*O�
*��
*�
*�
*"
*c
;
*�H
*M
U
*+b
*�o
*�{
*��
*j�
*�
�#�
*�
*��
*S�
*�
*J
*Z

*�
)#(H
*�U
*�
a
*�
k#�
*�
�2�
*��
&�
&�
*=�
&x�
&j�29�
(0�
&�
&�
&�
&�
&
&
(0
&^!
&T*
&�.
&�7
&J;
&FD2�M
(p]
&�a
&�j
&�n
&�s
(p|
&��
&��
& �
&�2��2��'��#�2��2�
&q
&o2�4�I2�R2�n
&�r
&�|2����2��2��
&��
&��2�X2\2p12�O2\2 t2/�27�2��2��2��2=!!#(+2\@M`#(j2{{��#(�2R�2R�
&��
&��2o�02#2-+2<82AE2xR2�f
*�
w
*�
*r��
&1�
&'���
&��
&��""%
(3
(8BI	Vi#v
*;
z
*;
�
*��
*��
*+�
*+�
*H
�
*��
*��
*��
*`�
*`�
*!�
*!�
*s�
*s�
*��
*��
*��
*��
*~�
*~
*�
*�
*
*
*�
*�'
*b+
*b22"2"#2R12R92jD2jL2{x2�2"�2"�2��2��2R�2R�2c�2c�2}�2}�2��2��2{29%2702}82�C2�K2�V2�^2i2q2{�29�2��2��2��2��2��2��2�2�2{212s2�&21292{^2_f2oq2oy2C�2}�2��2��2�2�2�2s�2��2��2C�2}2�2�2�#2�+2�J2�R2�]2�e2��2��2�2}�2��2��2�2}�2��2��2� 2�(2�92�A2�L2�T2�q2�y2����2��2����2��2�X�2R2o019DL!W!_"m"u=�=�B��"�
$ 2""#B029827@2}H2�P2�X2{p2�x2�2}�2���B�2�2{��2 42.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rela.gnu.build.attributes.text.startup.rela.text.startup.rodata.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.groupF@9?FT9@Fl9AF�(9BF�9C �B@R�9&,641@�R�9
LH[H�V@HS09
u���@xS09A�����@�S09������@�S09�2�
92�
��8@T09A
{<@8TP9O�1\�3W@�X@,9h�({�+�v@Ȅ�
9"��1@�@`�H9$�2��@���9&��2P�@X�09(�0(6��0�D.� EA Eu EL E  E� E� E� E E E$ E <@Ex7@��097�E	:N	�N9��Mdoc/alt-libxml2-devel/examples/parse4000075500000017372151730335300013511 0ustar00#! /bin/sh

# parse4 - temporary wrapper script for .libs/parse4
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2
#
# The parse4 program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /builddir/build/BUILD/libxml2-2.10.2/doc/examples; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/share/Modules/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin; export PATH; gcc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o \$progdir/\$file parse4.o  ../../.libs/libxml2.so -Wl,-rpath -Wl,/builddir/build/BUILD/libxml2-2.10.2/.libs -Wl,-rpath -Wl,/opt/alt/libxml2/usr/lib64)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  generated_by_libtool_version='2.4.6'
  notinst_deplibs=' ../../libxml2.la'
else
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
    file="$0"

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
    ECHO="printf %s\\n"
  fi

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /usr/bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "parse4:parse4:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-15build2" 1>&2
  fi
}

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
  lt_dump_args_N=1;
  for lt_arg
  do
    $ECHO "parse4:parse4:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`
  done
}

# Core function for launching the target application
func_exec_program_core ()
{

      if test -n "$lt_option_debug"; then
        $ECHO "parse4:parse4:$LINENO: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      fi
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1
}

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
    do
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
      esac
      shift
    done ;;
  esac
  func_exec_program_core ${1+"$@"}
}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /usr/bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /usr/bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;
      esac
    fi

    file=`$ECHO "$file" | /usr/bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /usr/bin/sed -n 's/.*-> //p'`
  done

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
      thisdir=`pwd`
    fi
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /usr/bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;
    esac
  fi

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"

  program=lt-'parse4'
  progdir="$thisdir/.libs"

  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /usr/bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then

    file="$$-$program"

    if test ! -d "$progdir"; then
      mkdir "$progdir"
    else
      rm -f "$progdir/$file"
    fi

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
      else
	$ECHO "$relink_command_output" >&2
	rm -f "$progdir/$file"
	exit 1
      fi
    fi

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"
  fi

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    fi
  else
    # The program doesn't exist.
    $ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1
  fi
fi
doc/alt-libxml2-devel/xmllint.html000064400000055417151730335300013126 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>xmllint</title><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry"><a name="idm1"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>xmllint &#8212; command line <acronym class="acronym">XML</acronym> tool</p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><div class="cmdsynopsis"><p><code class="command">xmllint</code>  [ <code class="option">--version</code>  |   <code class="option">--debug</code>  |   <code class="option">--shell</code>  |   <code class="option">--xpath "<em class="replaceable"><code>XPath_expression</code></em>"</code>  |   <code class="option">--debugent</code>  |   <code class="option">--copy</code>  |   <code class="option">--recover</code>  |   <code class="option">--noent</code>  |   <code class="option">--noout</code>  |   <code class="option">--nonet</code>  |   <code class="option">--path "<em class="replaceable"><code>PATH(S)</code></em>"</code>  |   <code class="option">--load-trace</code>  |   <code class="option">--htmlout</code>  |   <code class="option">--nowrap</code>  |   <code class="option">--valid</code>  |   <code class="option">--postvalid</code>  |   <code class="option">--dtdvalid <em class="replaceable"><code>URL</code></em></code>  |   <code class="option">--dtdvalidfpi <em class="replaceable"><code>FPI</code></em></code>  |   <code class="option">--timing</code>  |   <code class="option">--output <em class="replaceable"><code>FILE</code></em></code>  |   <code class="option">--repeat</code>  |   <code class="option">--insert</code>  |   <code class="option">--compress</code>  |   <code class="option">--html</code>  |   <code class="option">--xmlout</code>  |   <code class="option">--push</code>  |   <code class="option">--memory</code>  |   <code class="option">--maxmem <em class="replaceable"><code>NBBYTES</code></em></code>  |   <code class="option">--nowarning</code>  |   <code class="option">--noblanks</code>  |   <code class="option">--nocdata</code>  |   <code class="option">--format</code>  |   <code class="option">--encode <em class="replaceable"><code>ENCODING</code></em></code>  |   <code class="option">--dropdtd</code>  |   <code class="option">--nsclean</code>  |   <code class="option">--testIO</code>  |   <code class="option">--catalogs</code>  |   <code class="option">--nocatalogs</code>  |   <code class="option">--auto</code>  |   <code class="option">--xinclude</code>  |   <code class="option">--noxincludenode</code>  |   <code class="option">--loaddtd</code>  |   <code class="option">--dtdattr</code>  |   <code class="option">--stream</code>  |   <code class="option">--walker</code>  |   <code class="option">--pattern <em class="replaceable"><code>PATTERNVALUE</code></em></code>  |   <code class="option">--chkregister</code>  |   <code class="option">--relaxng <em class="replaceable"><code>SCHEMA</code></em></code>  |   <code class="option">--schema <em class="replaceable"><code>SCHEMA</code></em></code>  |   <code class="option">--c14n</code> ] { <em class="replaceable"><code>XML-FILE(S)</code></em>...  |   - }</p></div><div class="cmdsynopsis"><p><code class="command">xmllint</code>   <code class="option">--help</code> </p></div></div><div class="refsect1"><a name="description"></a><h2>DESCRIPTION</h2><p>
		The <span class="command"><strong>xmllint</strong></span> program parses one or more <acronym class="acronym">XML</acronym> files,
		specified on the command line as <em class="replaceable"><code>XML-FILE</code></em>
		(or the standard input if the filename provided
		is <span class="bold"><strong>-</strong></span> ). It prints various types of
		output, depending upon the options selected. It is useful for detecting
		errors both in <acronym class="acronym">XML</acronym> code and in
		the <acronym class="acronym">XML</acronym> parser itself.
	</p><p><span class="command"><strong>xmllint</strong></span> is included in <span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span>.</p></div><div class="refsect1"><a name="options"></a><h2>OPTIONS</h2><p>
		<span class="command"><strong>xmllint</strong></span> accepts the following options (in alphabetical order):
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="option">--auto</code></span></dt><dd><p>Generate a small document for testing purposes.</p></dd><dt><span class="term"><code class="option">--catalogs</code></span></dt><dd><p>
			Use the <acronym class="acronym">SGML</acronym> catalog(s) from <code class="envar">SGML_CATALOG_FILES</code>.
			Otherwise <acronym class="acronym">XML</acronym> catalogs starting
			from <code class="filename">/etc/xml/catalog</code> are used by default.
		</p></dd><dt><span class="term"><code class="option">--chkregister</code></span></dt><dd><p>
			Turn on node registration. Useful for developers testing <span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span> node tracking code.
		</p></dd><dt><span class="term"><code class="option">--compress</code></span></dt><dd><p>
			Turn on <span class="citerefentry"><span class="refentrytitle">gzip</span>(1)</span> compression of output.
		</p></dd><dt><span class="term"><code class="option">--copy</code></span></dt><dd><p>Test the internal copy implementation.</p></dd><dt><span class="term"><code class="option">--c14n</code></span></dt><dd><p>
			Use the W3C <acronym class="acronym">XML</acronym> Canonicalisation (<acronym class="acronym">C14N</acronym>) to
			serialize the result of parsing to <code class="filename">stdout</code>.
			It keeps comments in the result.
		</p></dd><dt><span class="term"><code class="option">--dtdvalid <em class="replaceable"><code>URL</code></em></code></span></dt><dd><p>
			Use the <acronym class="acronym">DTD</acronym> specified by
			an <em class="replaceable"><code>URL</code></em> for validation.
		</p></dd><dt><span class="term"><code class="option">--dtdvalidfpi <em class="replaceable"><code>FPI</code></em></code></span></dt><dd><p>
			Use the <acronym class="acronym">DTD</acronym> specified by a Formal Public
			Identifier <em class="replaceable"><code>FPI</code></em> for validation, note that this
			will require a catalog exporting that Formal Public Identifier to work.
		</p></dd><dt><span class="term"><code class="option">--debug</code></span></dt><dd><p>
			Parse a file and output an annotated tree of the
			in-memory version of the document.
		</p></dd><dt><span class="term"><code class="option">--debugent</code></span></dt><dd><p>Debug the entities defined in the document.</p></dd><dt><span class="term"><code class="option">--dropdtd</code></span></dt><dd><p>Remove <acronym class="acronym">DTD</acronym> from output.</p></dd><dt><span class="term"><code class="option">--dtdattr</code></span></dt><dd><p>
			Fetch external <acronym class="acronym">DTD</acronym> and populate the tree with
			inherited attributes.
		</p></dd><dt><span class="term"><code class="option">--encode <em class="replaceable"><code>ENCODING</code></em></code></span></dt><dd><p>Output in the given encoding. Note that this works for full document not fragments or result from XPath queries.</p></dd><dt><span class="term"><code class="option">--format</code></span></dt><dd><p>
			Reformat and reindent the output. The <code class="envar">XMLLINT_INDENT</code>
			environment variable controls the indentation. The default value is two
			spaces "  ").
		</p></dd><dt><span class="term"><code class="option">--help</code></span></dt><dd><p>Print out a short usage summary for <span class="command"><strong>xmllint</strong></span>.</p></dd><dt><span class="term"><code class="option">--html</code></span></dt><dd><p>Use the <acronym class="acronym">HTML</acronym> parser.</p></dd><dt><span class="term"><code class="option">--htmlout</code></span></dt><dd><p>
			Output results as an <acronym class="acronym">HTML</acronym> file. This
			causes <span class="command"><strong>xmllint</strong></span> to output the necessary <acronym class="acronym">HTML</acronym>
			tags surrounding the result tree output so the results can be
			displayed/viewed in a browser.
		</p></dd><dt><span class="term"><code class="option">--insert</code></span></dt><dd><p>Test for valid insertions.</p></dd><dt><span class="term"><code class="option">--loaddtd</code></span></dt><dd><p>Fetch an external <acronym class="acronym">DTD</acronym>.</p></dd><dt><span class="term"><code class="option">--load-trace</code></span></dt><dd><p>
			Display all the documents loaded during the processing
			to <code class="filename">stderr</code>.
		</p></dd><dt><span class="term"><code class="option">--maxmem <em class="replaceable"><code>NNBYTES</code></em></code></span></dt><dd><p>
			Test the parser memory support. <em class="replaceable"><code>NNBYTES</code></em>
			is the maximum number of bytes the library is allowed to allocate.
			This can also be used to make sure batch processing
			of <acronym class="acronym">XML</acronym> files will not exhaust the virtual memory
			of the server running them.
		</p></dd><dt><span class="term"><code class="option">--memory</code></span></dt><dd><p>Parse from memory.</p></dd><dt><span class="term"><code class="option">--noblanks</code></span></dt><dd><p>Drop ignorable blank spaces.</p></dd><dt><span class="term"><code class="option">--nocatalogs</code></span></dt><dd><p>Do not use any catalogs.</p></dd><dt><span class="term"><code class="option">--nocdata</code></span></dt><dd><p>Substitute CDATA section by equivalent text nodes.</p></dd><dt><span class="term"><code class="option">--noent</code></span></dt><dd><p>
			Substitute entity values for entity references. By default, <span class="command"><strong>xmllint</strong></span>
			leaves entity references in place.
		</p></dd><dt><span class="term"><code class="option">--nonet</code></span></dt><dd><p>
			Do not use the Internet to fetch <acronym class="acronym">DTD</acronym>s or entities.
		</p></dd><dt><span class="term"><code class="option">--noout</code></span></dt><dd><p>
			Suppress output. By default, <span class="command"><strong>xmllint</strong></span> outputs the result tree.
		</p></dd><dt><span class="term"><code class="option">--nowarning</code></span></dt><dd><p>Do not emit warnings from the parser and/or validator.</p></dd><dt><span class="term"><code class="option">--nowrap</code></span></dt><dd><p>Do not output <acronym class="acronym">HTML</acronym> doc wrapper.</p></dd><dt><span class="term"><code class="option">--noxincludenode</code></span></dt><dd><p>
			Do XInclude processing but do not generate XInclude start and end nodes.
		</p></dd><dt><span class="term"><code class="option">--nsclean</code></span></dt><dd><p>Remove redundant namespace declarations.</p></dd><dt><span class="term"><code class="option">--output <em class="replaceable"><code>FILE</code></em></code></span></dt><dd><p>
			Define a file path where <span class="command"><strong>xmllint</strong></span> will save the result of parsing.
			Usually the programs build a tree and save it
			on <code class="filename">stdout</code>, with this option
			the result <acronym class="acronym">XML</acronym> instance will be saved onto a file.
		</p></dd><dt><span class="term"><code class="option">--path "<em class="replaceable"><code>PATH(S)</code></em>"</code></span></dt><dd><p>
			Use the (space- or colon-separated) list of filesystem paths specified
			by <em class="replaceable"><code>PATHS</code></em> to load <acronym class="acronym">DTD</acronym>s or
			entities. Enclose space-separated lists by quotation marks.
		</p></dd><dt><span class="term"><code class="option">--pattern <em class="replaceable"><code>PATTERNVALUE</code></em></code></span></dt><dd><p>
			Used to exercise the pattern recognition engine, which can be used
			with the reader interface to the parser. It allows to select some
			nodes in the document based on an XPath (subset) expression. Used
			for debugging.
		</p></dd><dt><span class="term"><code class="option">--postvalid</code></span></dt><dd><p>Validate after parsing has completed.</p></dd><dt><span class="term"><code class="option">--push</code></span></dt><dd><p>Use the push mode of the parser.</p></dd><dt><span class="term"><code class="option">--recover</code></span></dt><dd><p>Output any parsable portions of an invalid document.</p></dd><dt><span class="term"><code class="option">--relaxng <em class="replaceable"><code>SCHEMA</code></em></code></span></dt><dd><p>
			Use RelaxNG file named <em class="replaceable"><code>SCHEMA</code></em>
			for validation.
		</p></dd><dt><span class="term"><code class="option">--repeat</code></span></dt><dd><p>Repeat 100 times, for timing or profiling.</p></dd><dt><span class="term"><code class="option">--schema <em class="replaceable"><code>SCHEMA</code></em></code></span></dt><dd><p>
			Use a W3C <acronym class="acronym">XML</acronym> Schema file
			named <em class="replaceable"><code>SCHEMA</code></em> for validation.
		</p></dd><dt><span class="term"><code class="option">--shell</code></span></dt><dd><p>
			Run a navigating shell. Details on available commands in shell mode
			are below (see <a class="xref" href="#shell" title="SHELL COMMANDS">the section called &#8220;SHELL COMMANDS&#8221;</a>).
		</p></dd><dt><span class="term"><code class="option">--xpath "<em class="replaceable"><code>XPath_expression</code></em>"</code></span></dt><dd><p>
			Run an XPath expression given as argument and print the
			result. In case of a nodeset result, each node in the
			node set is serialized in full in the output. In case
			of an empty node set the "XPath set is empty" result
			will be shown and an error exit code will be returned.
		</p></dd><dt><span class="term"><code class="option">--stream</code></span></dt><dd><p>
			Use streaming <acronym class="acronym">API</acronym> - useful when used in combination
			with <code class="option">--relaxng</code> or <code class="option">--valid</code> options
			for validation of files that are too large to be held in memory.
		</p></dd><dt><span class="term"><code class="option">--testIO</code></span></dt><dd><p>Test user input/output support.</p></dd><dt><span class="term"><code class="option">--timing</code></span></dt><dd><p>
			Output information about the time it takes <span class="command"><strong>xmllint</strong></span> to perform the
			various steps.
		</p></dd><dt><span class="term"><code class="option">--valid</code></span></dt><dd><p>
			Determine if the document is a valid instance of the included
			Document Type Definition (<acronym class="acronym">DTD</acronym>).
			A <acronym class="acronym">DTD</acronym> to be validated against also can be
			specified at the command line using the <code class="option">--dtdvalid</code>
			option. By default, <span class="command"><strong>xmllint</strong></span> also checks to determine if the
			document is well-formed.
		</p></dd><dt><span class="term"><code class="option">--version</code></span></dt><dd><p>
			Display the version of <span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span> used.
		</p></dd><dt><span class="term"><code class="option">--walker</code></span></dt><dd><p>
			Test the walker module, which is a reader interface but for a
			document tree, instead of using the reader <acronym class="acronym">API</acronym> on
			an unparsed document it works on an existing in-memory tree. Used for
			debugging.
		</p></dd><dt><span class="term"><code class="option">--xinclude</code></span></dt><dd><p>Do XInclude processing.</p></dd><dt><span class="term"><code class="option">--xmlout</code></span></dt><dd><p>
			Used in conjunction with <code class="option">--html</code>. Usually
			when <acronym class="acronym">HTML</acronym> is parsed the document is saved with
			the <acronym class="acronym">HTML</acronym> serializer. But with this option the
			resulting document is saved with the <acronym class="acronym">XML</acronym>
			serializer. This is primarily used to
			generate <acronym class="acronym">XHTML</acronym> from <acronym class="acronym">HTML</acronym> input.
		</p></dd></dl></div></div><div class="refsect1"><a name="shell"></a><h2>SHELL COMMANDS</h2><p>
		<span class="command"><strong>xmllint</strong></span> offers an interactive shell mode invoked with
		the <code class="option">--shell</code> command. Available commands in shell mode
		include (in alphabetical order):
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><span class="command"><strong>base</strong></span></span></dt><dd><p>Display <acronym class="acronym">XML</acronym> base of the node.</p></dd><dt><span class="term"><span class="command"><strong>bye</strong></span></span></dt><dd><p>Leave the shell.</p></dd><dt><span class="term"><span class="command"><strong>cat <em class="replaceable"><code>NODE</code></em></strong></span></span></dt><dd><p>Display the given node or the current one.</p></dd><dt><span class="term"><span class="command"><strong>cd <em class="replaceable"><code>PATH</code></em></strong></span></span></dt><dd><p>
			Change the current node to the given path (if unique) or root if no
			argument is given.
		</p></dd><dt><span class="term"><span class="command"><strong>dir <em class="replaceable"><code>PATH</code></em></strong></span></span></dt><dd><p>
			Dumps information about the node (namespace, attributes, content).
		</p></dd><dt><span class="term"><span class="command"><strong>du <em class="replaceable"><code>PATH</code></em></strong></span></span></dt><dd><p>
			Show the structure of the subtree under the given path or the current node.
		</p></dd><dt><span class="term"><span class="command"><strong>exit</strong></span></span></dt><dd><p>Leave the shell.</p></dd><dt><span class="term"><span class="command"><strong>help</strong></span></span></dt><dd><p>Show this help.</p></dd><dt><span class="term"><span class="command"><strong>free</strong></span></span></dt><dd><p>Display memory usage.</p></dd><dt><span class="term"><span class="command"><strong>load <em class="replaceable"><code>FILENAME</code></em></strong></span></span></dt><dd><p>Load a new document with the given filename.</p></dd><dt><span class="term"><span class="command"><strong>ls <em class="replaceable"><code>PATH</code></em></strong></span></span></dt><dd><p>List contents of the given path or the current directory.</p></dd><dt><span class="term"><span class="command"><strong>pwd</strong></span></span></dt><dd><p>Display the path to the current node.</p></dd><dt><span class="term"><span class="command"><strong>quit</strong></span></span></dt><dd><p>Leave the shell.</p></dd><dt><span class="term"><span class="command"><strong>save <em class="replaceable"><code>FILENAME</code></em></strong></span></span></dt><dd><p>
			Save the current document to the given filename or to the original name.
		</p></dd><dt><span class="term"><code class="option">validate</code></span></dt><dd><p>Check the document for errors.</p></dd><dt><span class="term"><span class="command"><strong>write <em class="replaceable"><code>FILENAME</code></em></strong></span></span></dt><dd><p>Write the current node to the given filename.</p></dd></dl></div></div><div class="refsect1"><a name="environment"></a><h2>ENVIRONMENT</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="envar">SGML_CATALOG_FILES</code></span></dt><dd><p><acronym class="acronym">SGML</acronym> catalog behavior can be changed by redirecting
			queries to the user's own set of catalogs. This can be done by setting
			the <code class="envar">SGML_CATALOG_FILES</code> environment variable to a list
			of catalogs. An empty one should deactivate loading the
			default <code class="filename">/etc/sgml/catalog</code> catalog.
		</p></dd><dt><span class="term"><code class="envar">XML_CATALOG_FILES</code></span></dt><dd><p><acronym class="acronym">XML</acronym> catalog behavior can be changed by redirecting
			queries to the user's own set of catalogs. This can be done by setting
			the <code class="envar">XML_CATALOG_FILES</code> environment variable to a space-separated
			list of catalogs. Use percent-encoding to escape spaces or other characters.
			An empty variable should deactivate loading the default <code class="filename">/etc/xml/catalog</code> catalog.
		</p></dd><dt><span class="term"><code class="envar">XML_DEBUG_CATALOG</code></span></dt><dd><p>Setting the environment variable <code class="envar">XML_DEBUG_CATALOG</code>
			to <em class="parameter"><code>non-zero</code></em> using the <span class="command"><strong>export</strong></span>
			command outputs debugging information related to catalog operations.
		</p></dd><dt><span class="term"><code class="envar">XMLLINT_INDENT</code></span></dt><dd><p>Setting the environment variable <code class="envar">XMLLINT_INDENT</code>
			controls the indentation. The default value is two spaces "  ".
		</p></dd></dl></div></div><div class="refsect1"><a name="diagnostics"></a><h2>DIAGNOSTICS</h2><p>
		<span class="command"><strong>xmllint</strong></span> return codes provide information that can be used when
		calling it from scripts.
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><span class="errorcode">0</span></span></dt><dd><p>No error</p></dd><dt><span class="term"><span class="errorcode">1</span></span></dt><dd><p>Unclassified</p></dd><dt><span class="term"><span class="errorcode">2</span></span></dt><dd><p>Error in <acronym class="acronym">DTD</acronym></p></dd><dt><span class="term"><span class="errorcode">3</span></span></dt><dd><p>Validation error</p></dd><dt><span class="term"><span class="errorcode">4</span></span></dt><dd><p>Validation error</p></dd><dt><span class="term"><span class="errorcode">5</span></span></dt><dd><p>Error in schema compilation</p></dd><dt><span class="term"><span class="errorcode">6</span></span></dt><dd><p>Error writing output</p></dd><dt><span class="term"><span class="errorcode">7</span></span></dt><dd><p>
			Error in pattern (generated when <code class="option">--pattern</code> option is used)
		</p></dd><dt><span class="term"><span class="errorcode">8</span></span></dt><dd><p>
			Error in Reader registration (generated
			when <code class="option">--chkregister</code> option is used)
		</p></dd><dt><span class="term"><span class="errorcode">9</span></span></dt><dd><p>Out of memory error</p></dd><dt><span class="term"><span class="errorcode">10</span></span></dt><dd><p>XPath evaluation error</p></dd></dl></div></div><div class="refsect1"><a name="seealso"></a><h2>SEE ALSO</h2><p><span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span>
	</p><p>
		More information can be found at
		</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span> web page <a class="ulink" href="https://gitlab.gnome.org/GNOME/libxml2" target="_top">https://gitlab.gnome.org/GNOME/libxml2</a>
				</p></li></ul></div><p>
	</p></div></div></body></html>
doc/alt-libxml2-devel/xmlcatalog.html000064400000033370151730335300013564 0ustar00<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>xmlcatalog</title><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry"><a name="idm1"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>xmlcatalog &#8212; 
		Command line tool to parse and manipulate <acronym class="acronym">XML</acronym>
		or <acronym class="acronym">SGML</acronym> catalog files.
	</p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><div class="cmdsynopsis"><p><code class="command">xmlcatalog</code>  [ <code class="option">--sgml</code>  |   <code class="option">--shell</code>  |   <code class="option">--create</code>  |   <code class="option">--del <em class="replaceable"><code>VALUE(S)</code></em></code>  |   
			[ 
					<code class="option">--add
					 <em class="replaceable"><code>TYPE</code></em>
					 <em class="replaceable"><code>ORIG</code></em>
					 <em class="replaceable"><code>REPLACE</code></em>
					</code>
				  |   <code class="option">--add <em class="replaceable"><code>FILENAME</code></em></code> ]		
		  |   <code class="option">--noout</code>  |   <code class="option">--no-super-update</code>  |   
			[ <code class="option">-v</code>  |   <code class="option">--verbose</code> ]
		 ] {<em class="replaceable"><code>CATALOGFILE</code></em>} {<em class="replaceable"><code>ENTITIES</code></em>...}</p></div></div><div class="refsect1"><a name="description"></a><h2>DESCRIPTION</h2><p>
		<span class="command"><strong>xmlcatalog</strong></span> is a command line application allowing users to monitor and
		manipulate <acronym class="acronym">XML</acronym> and <acronym class="acronym">SGML</acronym> catalogs. It
		is included in <span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span>.
	</p><p>
		Its functions can be invoked from a single command from the command line,
		or it can perform multiple functions in interactive mode. It can operate
		on both <acronym class="acronym">XML</acronym> and <acronym class="acronym">SGML</acronym> files.
	</p></div><div class="refsect1"><a name="options"></a><h2>OPTIONS</h2><p>
		<span class="command"><strong>xmlcatalog</strong></span> accepts the following options (in alphabetical order):
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">
		<code class="option">--add
		 <em class="replaceable"><code>TYPE</code></em>
		 <em class="replaceable"><code>ORIG</code></em>
		 <em class="replaceable"><code>REPLACE</code></em>
		</code>
	</span></dt><dd><p>
			Add an entry to <code class="filename">CATALOGFILE</code>. <em class="replaceable"><code>TYPE</code></em>
			indicates the type of entry. Possible types are: <span class="simplelist"><em class="parameter"><code>public</code></em>, <em class="parameter"><code>system</code></em>, <em class="parameter"><code>uri</code></em>, <em class="parameter"><code>rewriteSystem</code></em>, <em class="parameter"><code>rewriteURI</code></em>, <em class="parameter"><code>delegatePublic</code></em>, <em class="parameter"><code>delegateSystem</code></em>, <em class="parameter"><code>delegateURI</code></em>, <em class="parameter"><code>nextCatalog</code></em></span>. <em class="replaceable"><code>ORIG</code></em> is the original
			reference to be replaced, and <em class="replaceable"><code>REPLACE</code></em>
			is the <acronym class="acronym">URI</acronym> of the replacement entity to be
			used. The <code class="option">--add</code> option will not overwrite
			<code class="filename">CATALOGFILE</code>, outputting
			to <code class="filename">stdout</code>, unless
			<code class="option">--noout</code> is used. The <code class="option">--add</code> will
			always take three parameters even if some of the <acronym class="acronym">XML</acronym>
			catalog constructs will have only a single argument.
		</p></dd><dt><span class="term"><code class="option">--add <em class="replaceable"><code>FILENAME</code></em></code></span></dt><dd><p>
			If the <code class="option">--add</code> option is used following
			the <code class="option">--sgml</code> option, only a single argument,
			a <em class="replaceable"><code>FILENAME</code></em>, is used. This is used to add
			the name of a catalog file to an <acronym class="acronym">SGML</acronym> supercatalog,
			a file that contains references to other included <acronym class="acronym">SGML</acronym>
			catalog files.
		</p></dd><dt><span class="term"><code class="option">--create</code></span></dt><dd><p>
			Create a new <acronym class="acronym">XML</acronym> catalog. Outputs
			to <code class="filename">stdout</code>,
			ignoring <em class="replaceable"><code>filename</code></em> unless <code class="option">--noout</code> is
			used, in which case it creates a new catalog
			file <em class="replaceable"><code>filename</code></em>.
		</p></dd><dt><span class="term"><code class="option">--del <em class="replaceable"><code>VALUE(S)</code></em></code></span></dt><dd><p>
			Remove entries from <em class="replaceable"><code>CATALOGFILE</code></em>
			matching <em class="replaceable"><code>VALUE(S)</code></em>. The <code class="option">--del</code>
			option will not overwrite <em class="replaceable"><code>CATALOGFILE</code></em>,
			outputting to <code class="filename">stdout</code>,
			unless <code class="option">--noout</code> is used.
		</p></dd><dt><span class="term"><code class="option">--noout</code></span></dt><dd><p>
			Save output to the named file rather than outputting
			to <code class="filename">stdout</code>.
		</p></dd><dt><span class="term"><code class="option">--no-super-update</code></span></dt><dd><p>
			Do not update the <acronym class="acronym">SGML</acronym> super catalog.
		</p></dd><dt><span class="term"><code class="option">--shell</code></span></dt><dd><p>
			Run a shell allowing interactive queries on catalog
			file <em class="replaceable"><code>CATALOGFILE</code></em>. For the set of available
			commands see <a class="xref" href="#shell" title="SHELL COMMANDS">the section called &#8220;SHELL COMMANDS&#8221;</a>.
		</p></dd><dt><span class="term"><code class="option">--sgml</code></span></dt><dd><p>
			Uses <acronym class="acronym">SGML</acronym> super catalogs for <code class="option">--add</code>
			and <code class="option">--del</code> options.
		</p></dd><dt><span class="term"><code class="option">-v</code>, </span><span class="term"><code class="option">--verbose</code></span></dt><dd><p>Output debugging information.</p></dd></dl></div><p>
		Invoking <span class="command"><strong>xmlcatalog</strong></span> non-interactively without a designated action
		(imposed with options like <code class="option">--add</code>) will result in a lookup
		of the catalog entry for <em class="replaceable"><code>ENTITIES</code></em> in the
		catalog denoted with <em class="replaceable"><code>CATALOGFILE</code></em>. The
		corresponding entries will be output to the command line. This mode of
		operation, together with <code class="option">--shell</code> mode and non-modifying
		(i.e. without <code class="option">--noout</code>) direct actions, allows for
		a special shortcut of the void <em class="replaceable"><code>CATALOGFILE</code></em>
		specification (possibly expressed as "" in the shell
		environment) appointing the default system catalog. That simplifies the
		handling when its exact location is irrelevant but the respective built-in
		still needs to be consulted.
	</p></div><div class="refsect1"><a name="shell"></a><h2>SHELL COMMANDS</h2><p>
		Invoking <span class="command"><strong>xmlcatalog</strong></span> with
		the <code class="option">--shell <em class="replaceable"><code>CATALOGFILE</code></em></code> option opens
		a command line shell allowing interactive access to the catalog file
		identified by <em class="replaceable"><code>CATALOGFILE</code></em>. Invoking the shell
		provides a command line prompt after which the following commands (described in
		alphabetical order) can be entered.
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">
		<code class="option">add
		 <em class="replaceable"><code>TYPE</code></em>
		 <em class="replaceable"><code>ORIG</code></em>
		 <em class="replaceable"><code>REPLACE</code></em>
		</code>
	</span></dt><dd><p>
			Add an entry to the catalog file. <em class="replaceable"><code>TYPE</code></em>
			indicates the type of entry. Possible types are: <span class="simplelist"><em class="parameter"><code>public</code></em>, <em class="parameter"><code>system</code></em>, <em class="parameter"><code>uri</code></em>, <em class="parameter"><code>rewriteSystem</code></em>, <em class="parameter"><code>rewriteURI</code></em>, <em class="parameter"><code>delegatePublic</code></em>, <em class="parameter"><code>delegateSystem</code></em>, <em class="parameter"><code>delegateURI</code></em>, <em class="parameter"><code>nextCatalog</code></em></span>. <em class="replaceable"><code>ORIG</code></em> is the original
			reference to be replaced, and <em class="replaceable"><code>REPLACE</code></em>
			is the <acronym class="acronym">URI</acronym> of the replacement entity to be
			used. The <code class="option">--add</code> option will not overwrite
			<code class="filename">CATALOGFILE</code>, outputting
			to <code class="filename">stdout</code>, unless
			<code class="option">--noout</code> is used. The <code class="option">--add</code> will
			always take three parameters even if some of the <acronym class="acronym">XML</acronym>
			catalog constructs will have only a single argument.
		</p></dd><dt><span class="term"><code class="option">debug</code></span></dt><dd><p>
			Print debugging statements showing the steps <span class="command"><strong>xmlcatalog</strong></span> is executing.
		</p></dd><dt><span class="term"><code class="option">del <em class="replaceable"><code>VALUE(S)</code></em></code></span></dt><dd><p>
			Remove the catalog entry corresponding to <em class="replaceable"><code>VALUE(S)</code></em>.
		</p></dd><dt><span class="term"><code class="option">dump</code></span></dt><dd><p>Print the current catalog.</p></dd><dt><span class="term"><code class="option">exit</code></span></dt><dd><p>Quit the shell.</p></dd><dt><span class="term"><code class="option">public <em class="replaceable"><code>PUBLIC-ID</code></em></code></span></dt><dd><p>
			Execute a Formal Public Identifier lookup of the catalog entry
			for <em class="replaceable"><code>PUBLIC-ID</code></em>. The corresponding entry will be
			output to the command line.
		</p></dd><dt><span class="term"><code class="option">quiet</code></span></dt><dd><p>Stop printing debugging statements.</p></dd><dt><span class="term"><code class="option">system <em class="replaceable"><code>SYSTEM-ID</code></em></code></span></dt><dd><p>
			Execute a Formal Public Identifier lookup of the catalog entry
			for <em class="replaceable"><code>SYSTEM-ID</code></em>. The corresponding entry will be
			output to the command line.
		</p></dd></dl></div></div><div class="refsect1"><a name="environment"></a><h2>ENVIRONMENT</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="envar">XML_CATALOG_FILES</code></span></dt><dd><p><acronym class="acronym">XML</acronym> catalog behavior can be changed by redirecting
			queries to the user's own set of catalogs. This can be done by setting
			the <code class="envar">XML_CATALOG_FILES</code> environment variable to a space-separated
			list of catalogs. Use percent-encoding to escape spaces or other characters.
			An empty variable should deactivate loading the default <code class="filename">/etc/xml/catalog</code> catalog.
		</p></dd></dl></div></div><div class="refsect1"><a name="diagnostics"></a><h2>DIAGNOSTICS</h2><p>
		<span class="command"><strong>xmlcatalog</strong></span> return codes provide information that can be used when
		calling it from scripts.
	</p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><span class="errorcode">0</span></span></dt><dd><p>No error</p></dd><dt><span class="term"><span class="errorcode">1</span></span></dt><dd><p>Failed to remove an entry from the catalog</p></dd><dt><span class="term"><span class="errorcode">2</span></span></dt><dd><p>Failed to save to the catalog, check file permissions</p></dd><dt><span class="term"><span class="errorcode">3</span></span></dt><dd><p>Failed to add an entry to the catalog</p></dd><dt><span class="term"><span class="errorcode">4</span></span></dt><dd><p>Failed to look up an entry in the catalog</p></dd></dl></div></div><div class="refsect1"><a name="seealso"></a><h2>SEE ALSO</h2><p><span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span>
	</p><p>
		More information can be found at
		</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span> web page <a class="ulink" href="https://gitlab.gnome.org/GNOME/libxml2" target="_top">https://gitlab.gnome.org/GNOME/libxml2</a>
				</p></li><li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">libxml</span>(3)</span> catalog support web page
					at <a class="ulink" href="https://gitlab.gnome.org/GNOME/libxml2/-/wikis/Catalog-support" target="_top">https://gitlab.gnome.org/GNOME/libxml2/-/wikis/Catalog-support</a>
				</p></li><li class="listitem"><p>James Clark's <acronym class="acronym">SGML</acronym> catalog
					page <a class="ulink" href="http://www.jclark.com/sp/catalog.htm" target="_top">http://www.jclark.com/sp/catalog.htm</a>
				</p></li><li class="listitem"><p><acronym class="acronym">OASIS</acronym> <acronym class="acronym">XML</acronym> catalog specification
					<a class="ulink" href="http://www.oasis-open.org/committees/entity/spec.html" target="_top">http://www.oasis-open.org/committees/entity/spec.html</a>
				</p></li></ul></div><p>
	</p></div></div></body></html>
gtk-doc/html/libxml2/index.html000064400000007070151730335300012412 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>libxml2 Reference Manual</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="general.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">libxml2 Reference Manual</span></h2>
<p>Libxml2 is the XML C parser and toolkit developed for the Gnome project
(but usable outside of the Gnome platform), it is free software available
under the <a href="http://www.opensource.org/licenses/mit-license.html">MIT
License</a>. XML itself is a metalanguage to design markup languages, i.e.
text language where semantic and structure are added to the content using
extra "markup" information enclosed between angle brackets. HTML is the most
well-known markup language. Though the library is written in C, a variety of
language bindings make it available in other environments.</p>
<p>Libxml2 implements a number of existing standards related to markup
languages:</p>
<ul>
<li>the XML standard: <a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>
</li>
<li>Namespaces in XML: <a href="http://www.w3.org/TR/REC-xml-names/">http://www.w3.org/TR/REC-xml-names/</a>
</li>
<li>XML Base: <a href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
</li>
<li>
<a href="http://www.cis.ohio-state.edu/rfc/rfc2396.txt">RFC 2396</a> :
Uniform Resource Identifiers <a href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</a>
</li>
<li>XML Path Language (XPath) 1.0: <a href="http://www.w3.org/TR/xpath">http://www.w3.org/TR/xpath</a>
</li>
<li>HTML4 parser: <a href="http://www.w3.org/TR/html401/">http://www.w3.org/TR/html401/</a>
</li>
<li>XML Pointer Language (XPointer) Version 1.0: <a href="http://www.w3.org/TR/xptr">http://www.w3.org/TR/xptr</a>
</li>
<li>XML Inclusions (XInclude) Version 1.0: <a href="http://www.w3.org/TR/xinclude/">http://www.w3.org/TR/xinclude/</a>
</li>
<li>ISO-8859-x encodings, as well as <a href="http://www.cis.ohio-state.edu/rfc/rfc2044.txt">rfc2044</a> [UTF-8]
and <a href="http://www.cis.ohio-state.edu/rfc/rfc2781.txt">rfc2781</a>
[UTF-16] Unicode encodings, and more if using iconv support</li>
<li>part of SGML Open Technical Resolution TR9401:1997</li>
<li>XML Catalogs Working Draft 06 August 2001: <a href="http://www.oasis-open.org/committees/entity/spec-2001-08-06.html">http://www.oasis-open.org/committees/entity/spec-2001-08-06.html</a>
</li>
<li>Canonical XML Version 1.0: <a href="http://www.w3.org/TR/xml-c14n">http://www.w3.org/TR/xml-c14n</a>
and the Exclusive XML Canonicalization CR draft <a href="http://www.w3.org/TR/xml-exc-c14n">http://www.w3.org/TR/xml-exc-c14n</a>
</li>
<li>Relax NG, ISO/IEC 19757-2:2003, <a href="http://www.oasis-open.org/committees/relax-ng/spec-20011203.html">http://www.oasis-open.org/committees/relax-ng/spec-20011203.html</a>
</li>
<li>W3C XML Schemas Part 2: Datatypes <a href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/">REC 02 May
2001</a>
</li>
<li>W3C <a href="http://www.w3.org/TR/xml-id/">xml:id</a> Working Draft 7
April 2004</li>
</ul>
</body>
</html>
gtk-doc/html/libxml2/libxml2-encoding.html000064400000070721151730335300014443 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>encoding: interface for the encoding conversion functions</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-dict.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-entities.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">encoding</span></h2>
<p>encoding - interface for the encoding conversion functions</p>
<p>interface for the encoding conversion functions needed for XML basic encoding and iconv() support.  Related specs are rfc2044        (UTF-8 and UTF-16) F. Yergeau Alis Technologies [ISO-10646]    UTF-8 and UTF-16 in Annexes [ISO-8859-1]   ISO Latin-1 characters codes. [UNICODE]      The Unicode Consortium, "The Unicode Standard -- Worldwide Character Encoding -- Version 1.0", Addison- Wesley, Volume 1, 1991, Volume 2, 1992.  UTF-8 is described in Unicode Technical Report #4. [US-ASCII]     Coded Character Set--7-bit American Standard Code for Information Interchange, ANSI X3.4-1986. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef enum <a href="#xmlCharEncoding">xmlCharEncoding</a>;
typedef struct _xmlCharEncodingHandler <a href="#xmlCharEncodingHandler">xmlCharEncodingHandler</a>;
typedef <a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * <a href="#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>;
int	<a href="#UTF8Toisolat1">UTF8Toisolat1</a>			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen);
int	<a href="#isolat1ToUTF8">isolat1ToUTF8</a>			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen);
int	<a href="#xmlAddEncodingAlias">xmlAddEncodingAlias</a>		(const char * name, <br>					 const char * alias);
int	<a href="#xmlCharEncCloseFunc">xmlCharEncCloseFunc</a>		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler);
int	<a href="#xmlCharEncFirstLine">xmlCharEncFirstLine</a>		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in);
int	<a href="#xmlCharEncInFunc">xmlCharEncInFunc</a>		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in);
int	<a href="#xmlCharEncOutFunc">xmlCharEncOutFunc</a>		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in);
typedef int <a href="#xmlCharEncodingInputFunc">xmlCharEncodingInputFunc</a>	(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen);
typedef int <a href="#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a>	(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen);
void	<a href="#xmlCleanupCharEncodingHandlers">xmlCleanupCharEncodingHandlers</a>	(void);
void	<a href="#xmlCleanupEncodingAliases">xmlCleanupEncodingAliases</a>	(void);
int	<a href="#xmlDelEncodingAlias">xmlDelEncodingAlias</a>		(const char * alias);
<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>	<a href="#xmlDetectCharEncoding">xmlDetectCharEncoding</a>	(const unsigned char * in, <br>					 int len);
<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	<a href="#xmlFindCharEncodingHandler">xmlFindCharEncodingHandler</a>	(const char * name);
<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	<a href="#xmlGetCharEncodingHandler">xmlGetCharEncodingHandler</a>	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
const char *	<a href="#xmlGetCharEncodingName">xmlGetCharEncodingName</a>	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
const char *	<a href="#xmlGetEncodingAlias">xmlGetEncodingAlias</a>	(const char * alias);
void	<a href="#xmlInitCharEncodingHandlers">xmlInitCharEncodingHandlers</a>	(void);
<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	<a href="#xmlNewCharEncodingHandler">xmlNewCharEncodingHandler</a>	(const char * name, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingInputFunc">xmlCharEncodingInputFunc</a> input, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> output);
<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>	<a href="#xmlParseCharEncoding">xmlParseCharEncoding</a>	(const char * name);
void	<a href="#xmlRegisterCharEncodingHandler">xmlRegisterCharEncodingHandler</a>	(<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncoding">Enum </a>xmlCharEncoding</h3>
<pre class="programlisting">enum <a href="#xmlCharEncoding">xmlCharEncoding</a> {
    <a name="XML_CHAR_ENCODING_ERROR">XML_CHAR_ENCODING_ERROR</a> = -1 /* No char encoding detected */
    <a name="XML_CHAR_ENCODING_NONE">XML_CHAR_ENCODING_NONE</a> = 0 /* No char encoding detected */
    <a name="XML_CHAR_ENCODING_UTF8">XML_CHAR_ENCODING_UTF8</a> = 1 /* UTF-8 */
    <a name="XML_CHAR_ENCODING_UTF16LE">XML_CHAR_ENCODING_UTF16LE</a> = 2 /* UTF-16 little endian */
    <a name="XML_CHAR_ENCODING_UTF16BE">XML_CHAR_ENCODING_UTF16BE</a> = 3 /* UTF-16 big endian */
    <a name="XML_CHAR_ENCODING_UCS4LE">XML_CHAR_ENCODING_UCS4LE</a> = 4 /* UCS-4 little endian */
    <a name="XML_CHAR_ENCODING_UCS4BE">XML_CHAR_ENCODING_UCS4BE</a> = 5 /* UCS-4 big endian */
    <a name="XML_CHAR_ENCODING_EBCDIC">XML_CHAR_ENCODING_EBCDIC</a> = 6 /* EBCDIC uh! */
    <a name="XML_CHAR_ENCODING_UCS4_2143">XML_CHAR_ENCODING_UCS4_2143</a> = 7 /* UCS-4 unusual ordering */
    <a name="XML_CHAR_ENCODING_UCS4_3412">XML_CHAR_ENCODING_UCS4_3412</a> = 8 /* UCS-4 unusual ordering */
    <a name="XML_CHAR_ENCODING_UCS2">XML_CHAR_ENCODING_UCS2</a> = 9 /* UCS-2 */
    <a name="XML_CHAR_ENCODING_8859_1">XML_CHAR_ENCODING_8859_1</a> = 10 /* ISO-8859-1 ISO Latin 1 */
    <a name="XML_CHAR_ENCODING_8859_2">XML_CHAR_ENCODING_8859_2</a> = 11 /* ISO-8859-2 ISO Latin 2 */
    <a name="XML_CHAR_ENCODING_8859_3">XML_CHAR_ENCODING_8859_3</a> = 12 /* ISO-8859-3 */
    <a name="XML_CHAR_ENCODING_8859_4">XML_CHAR_ENCODING_8859_4</a> = 13 /* ISO-8859-4 */
    <a name="XML_CHAR_ENCODING_8859_5">XML_CHAR_ENCODING_8859_5</a> = 14 /* ISO-8859-5 */
    <a name="XML_CHAR_ENCODING_8859_6">XML_CHAR_ENCODING_8859_6</a> = 15 /* ISO-8859-6 */
    <a name="XML_CHAR_ENCODING_8859_7">XML_CHAR_ENCODING_8859_7</a> = 16 /* ISO-8859-7 */
    <a name="XML_CHAR_ENCODING_8859_8">XML_CHAR_ENCODING_8859_8</a> = 17 /* ISO-8859-8 */
    <a name="XML_CHAR_ENCODING_8859_9">XML_CHAR_ENCODING_8859_9</a> = 18 /* ISO-8859-9 */
    <a name="XML_CHAR_ENCODING_2022_JP">XML_CHAR_ENCODING_2022_JP</a> = 19 /* ISO-2022-JP */
    <a name="XML_CHAR_ENCODING_SHIFT_JIS">XML_CHAR_ENCODING_SHIFT_JIS</a> = 20 /* Shift_JIS */
    <a name="XML_CHAR_ENCODING_EUC_JP">XML_CHAR_ENCODING_EUC_JP</a> = 21 /* EUC-JP */
    <a name="XML_CHAR_ENCODING_ASCII">XML_CHAR_ENCODING_ASCII</a> = 22 /*  pure ASCII */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncodingHandler">Structure </a>xmlCharEncodingHandler</h3>
<pre class="programlisting">struct _xmlCharEncodingHandler {
    char *	name
    <a href="libxml2-encoding.html#xmlCharEncodingInputFunc">xmlCharEncodingInputFunc</a>	input
    <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a>	output
    iconv_t	iconv_in
    iconv_t	iconv_out
    struct _uconv_t *	uconv_in
    struct _uconv_t *	uconv_out
} xmlCharEncodingHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncodingHandlerPtr">Typedef </a>xmlCharEncodingHandlerPtr</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * xmlCharEncodingHandlerPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncodingInputFunc"></a>Function type xmlCharEncodingInputFunc</h3>
<pre class="programlisting">int	xmlCharEncodingInputFunc	(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen)<br>
</pre>
<p>Take a block of chars in the original encoding and try to convert it to an UTF-8 block of chars out.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the UTF-8 result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of chars in the original encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written, -1 if lack of space, or -2 if the transcoding failed. The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictiable. The value of @outlen after return is the number of octets consumed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncodingOutputFunc"></a>Function type xmlCharEncodingOutputFunc</h3>
<pre class="programlisting">int	xmlCharEncodingOutputFunc	(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen)<br>
</pre>
<p>Take a block of UTF-8 chars in and try to convert it to another encoding. Note: a first call designed to produce heading info is called with in = NULL. If stateful this should also initialize the encoder state.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of UTF-8 chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written, -1 if lack of space, or -2 if the transcoding failed. The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictiable. The value of @outlen after return is the number of octets produced.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="UTF8Toisolat1"></a>UTF8Toisolat1 ()</h3>
<pre class="programlisting">int	UTF8Toisolat1			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen)<br>
</pre>
<p>Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 block of chars out.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of UTF-8 chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictable. The value of @outlen after return is the number of octets produced.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="isolat1ToUTF8"></a>isolat1ToUTF8 ()</h3>
<pre class="programlisting">int	isolat1ToUTF8			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen)<br>
</pre>
<p>Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 block of chars out.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of ISO Latin 1 chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written if success, or -1 otherwise The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictable. The value of @outlen after return is the number of octets produced.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddEncodingAlias"></a>xmlAddEncodingAlias ()</h3>
<pre class="programlisting">int	xmlAddEncodingAlias		(const char * name, <br>					 const char * alias)<br>
</pre>
<p>Registers an alias @alias for an encoding named @name. Existing alias will be overwritten.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the encoding name as parsed, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>alias</tt></i>:</span></td>
<td>the alias name as parsed, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncCloseFunc"></a>xmlCharEncCloseFunc ()</h3>
<pre class="programlisting">int	xmlCharEncCloseFunc		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler)<br>
</pre>
<p>Generic front-end for encoding handler close function</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>char encoding transformation data structure</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if success, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncFirstLine"></a>xmlCharEncFirstLine ()</h3>
<pre class="programlisting">int	xmlCharEncFirstLine		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in)<br>
</pre>
<p>Front-end for the encoding handler input function, but handle only the very first line, i.e. limit itself to 45 chars.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>char encoding transformation data structure</td>
</tr>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the output.</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the input</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncInFunc"></a>xmlCharEncInFunc ()</h3>
<pre class="programlisting">int	xmlCharEncInFunc		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in)<br>
</pre>
<p>Generic front-end for the encoding handler input function</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>char encoding transformation data structure</td>
</tr>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the output.</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the input</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharEncOutFunc"></a>xmlCharEncOutFunc ()</h3>
<pre class="programlisting">int	xmlCharEncOutFunc		(<a href="libxml2-encoding.html#xmlCharEncodingHandler">xmlCharEncodingHandler</a> * handler, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> out, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> in)<br>
</pre>
<p>Generic front-end for the encoding handler output function a first call with @in == NULL has to be made firs to initiate the output in case of non-stateless encoding needing to initiate their state or the output (like the BOM in UTF16). In case of UTF8 sequence conversion errors for the given encoder, the content will be automatically remapped to a CharRef sequence.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>char encoding transformation data structure</td>
</tr>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the output.</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> for the input</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupCharEncodingHandlers"></a>xmlCleanupCharEncodingHandlers ()</h3>
<pre class="programlisting">void	xmlCleanupCharEncodingHandlers	(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Cleanup the memory allocated for the char encoding support, it unregisters all the encoding handlers and the aliases.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupEncodingAliases"></a>xmlCleanupEncodingAliases ()</h3>
<pre class="programlisting">void	xmlCleanupEncodingAliases	(void)<br>
</pre>
<p>Unregisters all aliases</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDelEncodingAlias"></a>xmlDelEncodingAlias ()</h3>
<pre class="programlisting">int	xmlDelEncodingAlias		(const char * alias)<br>
</pre>
<p>Unregisters an encoding alias @alias</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>alias</tt></i>:</span></td>
<td>the alias name as parsed, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDetectCharEncoding"></a>xmlDetectCharEncoding ()</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>	xmlDetectCharEncoding	(const unsigned char * in, <br>					 int len)<br>
</pre>
<p>Guess the encoding of the entity using the first bytes of the entity content according to the non-normative appendix F of the XML-1.0 recommendation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to the first bytes of the XML entity, must be at least 2 bytes long (at least 4 if encoding is UTF4 variant).</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>pointer to the length of the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>one of the XML_CHAR_ENCODING_... values.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFindCharEncodingHandler"></a>xmlFindCharEncodingHandler ()</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	xmlFindCharEncodingHandler	(const char * name)<br>
</pre>
<p>Search in the registered set the handler able to read/write that encoding.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>a string describing the char encoding.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the handler or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetCharEncodingHandler"></a>xmlGetCharEncodingHandler ()</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	xmlGetCharEncodingHandler	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Search in the registered set the handler able to read/write that encoding.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>an <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> value.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the handler or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetCharEncodingName"></a>xmlGetCharEncodingName ()</h3>
<pre class="programlisting">const char *	xmlGetCharEncodingName	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>The "canonical" name for XML encoding. C.f. http://www.w3.org/TR/REC-xml#charencoding Section 4.3.3 Character Encoding in Entities</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the canonical name for the given encoding</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetEncodingAlias"></a>xmlGetEncodingAlias ()</h3>
<pre class="programlisting">const char *	xmlGetEncodingAlias	(const char * alias)<br>
</pre>
<p>Lookup an encoding name for the given alias.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>alias</tt></i>:</span></td>
<td>the alias name as parsed, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not found, otherwise the original name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitCharEncodingHandlers"></a>xmlInitCharEncodingHandlers ()</h3>
<pre class="programlisting">void	xmlInitCharEncodingHandlers	(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Initialize the char encoding support, it registers the default encoding supported. NOTE: while public, this function usually doesn't need to be called in normal processing.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewCharEncodingHandler"></a>xmlNewCharEncodingHandler ()</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	xmlNewCharEncodingHandler	(const char * name, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingInputFunc">xmlCharEncodingInputFunc</a> input, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> output)<br>
</pre>
<p>Create and registers an xmlCharEncodingHandler.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the encoding name, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the <a href="libxml2-encoding.html#xmlCharEncodingInputFunc">xmlCharEncodingInputFunc</a> to read that encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> to write that encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> created (or NULL in case of error).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCharEncoding"></a>xmlParseCharEncoding ()</h3>
<pre class="programlisting"><a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>	xmlParseCharEncoding	(const char * name)<br>
</pre>
<p>Compare the string to the encoding schemes already known. Note that the comparison is case insensitive accordingly to the section [XML] 4.3.3 Character Encoding in Entities.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the encoding name as parsed, in UTF-8 format (ASCII actually)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>one of the XML_CHAR_ENCODING_... values or <a href="libxml2-encoding.html#XML_CHAR_ENCODING_NONE">XML_CHAR_ENCODING_NONE</a> if not recognized.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterCharEncodingHandler"></a>xmlRegisterCharEncodingHandler ()</h3>
<pre class="programlisting">void	xmlRegisterCharEncodingHandler	(<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler)<br>
</pre>
<p>Register the char encoding handler, surprising, isn't it ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler block</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlregexp.html000064400000121134151730335300014663 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlregexp: regular expressions handling</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlreader.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlsave.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlregexp</span></h2>
<p>xmlregexp - regular expressions handling</p>
<p>basic API for libxml regular expressions handling used for XML Schemas and validation. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlExpCtxt <a href="#xmlExpCtxt">xmlExpCtxt</a>;
typedef <a href="libxml2-xmlregexp.html#xmlExpCtxt">xmlExpCtxt</a> * <a href="#xmlExpCtxtPtr">xmlExpCtxtPtr</a>;
typedef struct _xmlExpNode <a href="#xmlExpNode">xmlExpNode</a>;
typedef <a href="libxml2-xmlregexp.html#xmlExpNode">xmlExpNode</a> * <a href="#xmlExpNodePtr">xmlExpNodePtr</a>;
typedef enum <a href="#xmlExpNodeType">xmlExpNodeType</a>;
typedef struct _xmlRegExecCtxt <a href="#xmlRegExecCtxt">xmlRegExecCtxt</a>;
typedef <a href="libxml2-xmlregexp.html#xmlRegExecCtxt">xmlRegExecCtxt</a> * <a href="#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a>;
typedef struct _xmlRegexp <a href="#xmlRegexp">xmlRegexp</a>;
typedef <a href="libxml2-xmlregexp.html#xmlRegexp">xmlRegexp</a> * <a href="#xmlRegexpPtr">xmlRegexpPtr</a>;
int	<a href="#xmlExpCtxtNbCons">xmlExpCtxtNbCons</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt);
int	<a href="#xmlExpCtxtNbNodes">xmlExpCtxtNbNodes</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt);
void	<a href="#xmlExpDump">xmlExpDump</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> expr);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpExpDerive">xmlExpExpDerive</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> sub);
void	<a href="#xmlExpFree">xmlExpFree</a>			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp);
void	<a href="#xmlExpFreeCtxt">xmlExpFreeCtxt</a>			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt);
int	<a href="#xmlExpGetLanguage">xmlExpGetLanguage</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langList, <br>					 int len);
int	<a href="#xmlExpGetStart">xmlExpGetStart</a>			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** tokList, <br>					 int len);
int	<a href="#xmlExpIsNillable">xmlExpIsNillable</a>		(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp);
int	<a href="#xmlExpMaxToken">xmlExpMaxToken</a>			(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> expr);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpNewAtom">xmlExpNewAtom</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len);
<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a>	<a href="#xmlExpNewCtxt">xmlExpNewCtxt</a>		(int maxNodes, <br>					 <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpNewOr">xmlExpNewOr</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> left, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> right);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpNewRange">xmlExpNewRange</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> subset, <br>					 int min, <br>					 int max);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpNewSeq">xmlExpNewSeq</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> left, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> right);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpParse">xmlExpParse</a>		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 const char * expr);
void	<a href="#xmlExpRef">xmlExpRef</a>			(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp);
<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	<a href="#xmlExpStringDerive">xmlExpStringDerive</a>	(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len);
int	<a href="#xmlExpSubsume">xmlExpSubsume</a>			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> sub);
typedef void <a href="#xmlRegExecCallbacks">xmlRegExecCallbacks</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>					 void * transdata, <br>					 void * inputdata);
int	<a href="#xmlRegExecErrInfo">xmlRegExecErrInfo</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** string, <br>					 int * nbval, <br>					 int * nbneg, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** values, <br>					 int * terminal);
int	<a href="#xmlRegExecNextValues">xmlRegExecNextValues</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 int * nbval, <br>					 int * nbneg, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** values, <br>					 int * terminal);
int	<a href="#xmlRegExecPushString">xmlRegExecPushString</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 void * data);
int	<a href="#xmlRegExecPushString2">xmlRegExecPushString2</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value2, <br>					 void * data);
void	<a href="#xmlRegFreeExecCtxt">xmlRegFreeExecCtxt</a>		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec);
void	<a href="#xmlRegFreeRegexp">xmlRegFreeRegexp</a>		(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> regexp);
<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a>	<a href="#xmlRegNewExecCtxt">xmlRegNewExecCtxt</a>	(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp, <br>						 <a href="libxml2-xmlregexp.html#xmlRegExecCallbacks">xmlRegExecCallbacks</a> callback, <br>						 void * data);
<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	<a href="#xmlRegexpCompile">xmlRegexpCompile</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * regexp);
int	<a href="#xmlRegexpExec">xmlRegexpExec</a>			(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlRegexpIsDeterminist">xmlRegexpIsDeterminist</a>		(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp);
void	<a href="#xmlRegexpPrint">xmlRegexpPrint</a>			(FILE * output, <br>					 <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> regexp);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpCtxt">Structure </a>xmlExpCtxt</h3>
<pre class="programlisting">struct _xmlExpCtxt {
The content of this structure is not made public by the API.
} xmlExpCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpCtxtPtr">Typedef </a>xmlExpCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpCtxt">xmlExpCtxt</a> * xmlExpCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNode">Structure </a>xmlExpNode</h3>
<pre class="programlisting">struct _xmlExpNode {
The content of this structure is not made public by the API.
} xmlExpNode;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNodePtr">Typedef </a>xmlExpNodePtr</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNode">xmlExpNode</a> * xmlExpNodePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNodeType">Enum </a>xmlExpNodeType</h3>
<pre class="programlisting">enum <a href="#xmlExpNodeType">xmlExpNodeType</a> {
    <a name="XML_EXP_EMPTY">XML_EXP_EMPTY</a> = 0
    <a name="XML_EXP_FORBID">XML_EXP_FORBID</a> = 1
    <a name="XML_EXP_ATOM">XML_EXP_ATOM</a> = 2
    <a name="XML_EXP_SEQ">XML_EXP_SEQ</a> = 3
    <a name="XML_EXP_OR">XML_EXP_OR</a> = 4
    <a name="XML_EXP_COUNT">XML_EXP_COUNT</a> = 5
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecCtxt">Structure </a>xmlRegExecCtxt</h3>
<pre class="programlisting">struct _xmlRegExecCtxt {
The content of this structure is not made public by the API.
} xmlRegExecCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecCtxtPtr">Typedef </a>xmlRegExecCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlRegExecCtxt">xmlRegExecCtxt</a> * xmlRegExecCtxtPtr;
</pre>
<p>A libxml progressive regular expression evaluation context</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexp">Structure </a>xmlRegexp</h3>
<pre class="programlisting">struct _xmlRegexp {
The content of this structure is not made public by the API.
} xmlRegexp;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexpPtr">Typedef </a>xmlRegexpPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlRegexp">xmlRegexp</a> * xmlRegexpPtr;
</pre>
<p>A libxml regular expression, they can actually be far more complex thank the POSIX regex expressions.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecCallbacks"></a>Function type xmlRegExecCallbacks</h3>
<pre class="programlisting">void	xmlRegExecCallbacks		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>					 void * transdata, <br>					 void * inputdata)<br>
</pre>
<p>Callback function when doing a transition in the automata</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>the regular expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the current token string</td>
</tr>
<tr>
<td><span class="term"><i><tt>transdata</tt></i>:</span></td>
<td>transition data</td>
</tr>
<tr>
<td><span class="term"><i><tt>inputdata</tt></i>:</span></td>
<td>input data</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="emptyExp">Variable </a>emptyExp</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> emptyExp;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="forbiddenExp">Variable </a>forbiddenExp</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> forbiddenExp;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpCtxtNbCons"></a>xmlExpCtxtNbCons ()</h3>
<pre class="programlisting">int	xmlExpCtxtNbCons		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt)<br>
</pre>
<p>Debugging facility provides the number of allocated nodes over lifetime</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of nodes ever allocated or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpCtxtNbNodes"></a>xmlExpCtxtNbNodes ()</h3>
<pre class="programlisting">int	xmlExpCtxtNbNodes		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt)<br>
</pre>
<p>Debugging facility provides the number of allocated nodes at a that point</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of nodes in use or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpDump"></a>xmlExpDump ()</h3>
<pre class="programlisting">void	xmlExpDump			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> expr)<br>
</pre>
<p>Serialize the expression as compiled to the buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>a buffer to receive the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>expr</tt></i>:</span></td>
<td>the compiled expression</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpExpDerive"></a>xmlExpExpDerive ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpExpDerive		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> sub)<br>
</pre>
<p>Evaluates the expression resulting from @exp consuming a sub expression @sub Based on algebraic derivation and sometimes direct Brzozowski derivation it usually takes less than linear time and can handle expressions generating infinite languages.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expressions context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the englobing expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>sub</tt></i>:</span></td>
<td>the subexpression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting expression or NULL in case of internal error, the result must be freed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpFree"></a>xmlExpFree ()</h3>
<pre class="programlisting">void	xmlExpFree			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp)<br>
</pre>
<p>Dereference the expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpFreeCtxt"></a>xmlExpFreeCtxt ()</h3>
<pre class="programlisting">void	xmlExpFreeCtxt			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt)<br>
</pre>
<p>Free an expression context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an expression context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpGetLanguage"></a>xmlExpGetLanguage ()</h3>
<pre class="programlisting">int	xmlExpGetLanguage		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langList, <br>					 int len)<br>
</pre>
<p>Find all the strings used in @exp and store them in @list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>langList</tt></i>:</span></td>
<td>where to store the tokens</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the allocated length of @list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpGetStart"></a>xmlExpGetStart ()</h3>
<pre class="programlisting">int	xmlExpGetStart			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** tokList, <br>					 int len)<br>
</pre>
<p>Find all the strings that appears at the start of the languages accepted by @exp and store them in @list. E.g. for (a, b) | c it will return the list [a, c]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>tokList</tt></i>:</span></td>
<td>where to store the tokens</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the allocated length of @list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpIsNillable"></a>xmlExpIsNillable ()</h3>
<pre class="programlisting">int	xmlExpIsNillable		(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp)<br>
</pre>
<p>Finds if the expression is nillable, i.e. if it accepts the empty sequence</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if nillable, 0 if not and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpMaxToken"></a>xmlExpMaxToken ()</h3>
<pre class="programlisting">int	xmlExpMaxToken			(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> expr)<br>
</pre>
<p>Indicate the maximum number of input a expression can accept</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>expr</tt></i>:</span></td>
<td>a compiled expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the maximum length or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNewAtom"></a>xmlExpNewAtom ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpNewAtom		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len)<br>
</pre>
<p>Get the atom associated to this name from that context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the atom name</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the atom name length in byte (or -1);</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNewCtxt"></a>xmlExpNewCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a>	xmlExpNewCtxt		(int maxNodes, <br>					 <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Creates a new context for manipulating expressions</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>maxNodes</tt></i>:</span></td>
<td>the maximum number of nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>optional dictionary to use internally</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNewOr"></a>xmlExpNewOr ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpNewOr		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> left, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> right)<br>
</pre>
<p>Get the atom associated to the choice @left | @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>left</tt></i>:</span></td>
<td>left expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>right</tt></i>:</span></td>
<td>right expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNewRange"></a>xmlExpNewRange ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpNewRange		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> subset, <br>					 int min, <br>					 int max)<br>
</pre>
<p>Get the atom associated to the range (@subset){@min, @max} Note that @subset is consumed in the operation, to keep an handle on it use xmlExpRef() and use xmlExpFree() to release it, this is true even in case of failure (unless ctxt == NULL).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>subset</tt></i>:</span></td>
<td>the expression to be repeated</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the lower bound for the repetition</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the upper bound for the repetition, -1 means infinite</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpNewSeq"></a>xmlExpNewSeq ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpNewSeq		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> left, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> right)<br>
</pre>
<p>Get the atom associated to the sequence @left , @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>left</tt></i>:</span></td>
<td>left expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>right</tt></i>:</span></td>
<td>right expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpParse"></a>xmlExpParse ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpParse		(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 const char * expr)<br>
</pre>
<p>Minimal parser for regexps, it understand the following constructs - string terminals - choice operator | - sequence operator , - subexpressions (...) - usual cardinality operators + * and ? - finite sequences { min, max } - infinite sequences { min, * } There is minimal checkings made especially no checking on strings values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expressions context</td>
</tr>
<tr>
<td><span class="term"><i><tt>expr</tt></i>:</span></td>
<td>the 0 terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new expression or NULL in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpRef"></a>xmlExpRef ()</h3>
<pre class="programlisting">void	xmlExpRef			(<a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp)<br>
</pre>
<p>Increase the <a href="libxml2-SAX.html#reference">reference</a> count of the expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpStringDerive"></a>xmlExpStringDerive ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a>	xmlExpStringDerive	(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len)<br>
</pre>
<p>Do one step of Brzozowski derivation of the expression @exp with respect to the input string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expression context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the string len in bytes if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting expression or NULL in case of internal error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExpSubsume"></a>xmlExpSubsume ()</h3>
<pre class="programlisting">int	xmlExpSubsume			(<a href="libxml2-xmlregexp.html#xmlExpCtxtPtr">xmlExpCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> exp, <br>					 <a href="libxml2-xmlregexp.html#xmlExpNodePtr">xmlExpNodePtr</a> sub)<br>
</pre>
<p>Check whether @exp accepts all the languages accepted by @sub the input being a subexpression.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the expressions context</td>
</tr>
<tr>
<td><span class="term"><i><tt>exp</tt></i>:</span></td>
<td>the englobing expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>sub</tt></i>:</span></td>
<td>the subexpression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 if false and -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecErrInfo"></a>xmlRegExecErrInfo ()</h3>
<pre class="programlisting">int	xmlRegExecErrInfo		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** string, <br>					 int * nbval, <br>					 int * nbneg, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** values, <br>					 int * terminal)<br>
</pre>
<p>Extract error information from the regexp execution, the parameter @string will be updated with the value pushed and not accepted, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>a regexp execution context generating an error</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>return value for the error string</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbval</tt></i>:</span></td>
<td>pointer to the number of accepted values IN/OUT</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbneg</tt></i>:</span></td>
<td>return number of negative transitions</td>
</tr>
<tr>
<td><span class="term"><i><tt>values</tt></i>:</span></td>
<td>pointer to the array of acceptable values</td>
</tr>
<tr>
<td><span class="term"><i><tt>terminal</tt></i>:</span></td>
<td>return value if this was a terminal state</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecNextValues"></a>xmlRegExecNextValues ()</h3>
<pre class="programlisting">int	xmlRegExecNextValues		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 int * nbval, <br>					 int * nbneg, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** values, <br>					 int * terminal)<br>
</pre>
<p>Extract information from the regexp execution, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>a regexp execution context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbval</tt></i>:</span></td>
<td>pointer to the number of accepted values IN/OUT</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbneg</tt></i>:</span></td>
<td>return number of negative transitions</td>
</tr>
<tr>
<td><span class="term"><i><tt>values</tt></i>:</span></td>
<td>pointer to the array of acceptable values</td>
</tr>
<tr>
<td><span class="term"><i><tt>terminal</tt></i>:</span></td>
<td>return value if this was a terminal state</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecPushString"></a>xmlRegExecPushString ()</h3>
<pre class="programlisting">int	xmlRegExecPushString		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 void * data)<br>
</pre>
<p>Push one input token in the execution context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>a regexp execution context or NULL to indicate the end</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>a string token input</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the token to reuse in callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegExecPushString2"></a>xmlRegExecPushString2 ()</h3>
<pre class="programlisting">int	xmlRegExecPushString2		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value2, <br>					 void * data)<br>
</pre>
<p>Push one input token in the execution context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>a regexp execution context or NULL to indicate the end</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the first string token input</td>
</tr>
<tr>
<td><span class="term"><i><tt>value2</tt></i>:</span></td>
<td>the second string token input</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the token to reuse in callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegFreeExecCtxt"></a>xmlRegFreeExecCtxt ()</h3>
<pre class="programlisting">void	xmlRegFreeExecCtxt		(<a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a> exec)<br>
</pre>
<p>Free the structures associated to a regular expression evaluation context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>exec</tt></i>:</span></td>
<td>a regular expression evaluation context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegFreeRegexp"></a>xmlRegFreeRegexp ()</h3>
<pre class="programlisting">void	xmlRegFreeRegexp		(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> regexp)<br>
</pre>
<p>Free a regexp</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>regexp</tt></i>:</span></td>
<td>the regexp</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegNewExecCtxt"></a>xmlRegNewExecCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlRegExecCtxtPtr">xmlRegExecCtxtPtr</a>	xmlRegNewExecCtxt	(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp, <br>						 <a href="libxml2-xmlregexp.html#xmlRegExecCallbacks">xmlRegExecCallbacks</a> callback, <br>						 void * data)<br>
</pre>
<p>Build a context used for progressive evaluation of a regexp.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>a precompiled regular expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>callback</tt></i>:</span></td>
<td>a callback function used for handling progresses in the automata matching phase</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the context data associated to the callback in this context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexpCompile"></a>xmlRegexpCompile ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	xmlRegexpCompile	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * regexp)<br>
</pre>
<p>Parses a regular expression conforming to XML Schemas Part 2 Datatype Appendix F and builds an automata suitable for testing strings against that regular expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>regexp</tt></i>:</span></td>
<td>a regular expression string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the compiled expression or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexpExec"></a>xmlRegexpExec ()</h3>
<pre class="programlisting">int	xmlRegexpExec			(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Check if the regular expression generates the value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the compiled regular expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the value to check against the regular expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if it matches, 0 if not and a negative value in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexpIsDeterminist"></a>xmlRegexpIsDeterminist ()</h3>
<pre class="programlisting">int	xmlRegexpIsDeterminist		(<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> comp)<br>
</pre>
<p>Check if the regular expression is determinist</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the compiled regular expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if it yes, 0 if not and a negative value in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegexpPrint"></a>xmlRegexpPrint ()</h3>
<pre class="programlisting">void	xmlRegexpPrint			(FILE * output, <br>					 <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a> regexp)<br>
</pre>
<p>Print the content of the compiled regular expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the file for the output debug</td>
</tr>
<tr>
<td><span class="term"><i><tt>regexp</tt></i>:</span></td>
<td>the compiled regexp</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/general.html000064400000011674151730335300012725 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>libxml2: </title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="index.html" title="libxml2 Reference Manual">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="index.html" title="libxml2 Reference Manual">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="u" href="index.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-HTMLparser.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">libxml2 API Modules</span></h2>
<p><a href="libxml2-HTMLparser.html">HTMLparser</a> - interface for an HTML 4.0 non-verifying parser<br><a href="libxml2-HTMLtree.html">HTMLtree</a> - specific APIs to process HTML tree, especially serialization<br><a href="libxml2-SAX.html">SAX</a> - Old SAX version 1 handler, deprecated<br><a href="libxml2-SAX2.html">SAX2</a> - SAX2 parser interface used to build the DOM tree<br><a href="libxml2-c14n.html">c14n</a> - Provide Canonical XML and Exclusive XML Canonicalization<br><a href="libxml2-catalog.html">catalog</a> - interfaces to the Catalog handling system<br><a href="libxml2-chvalid.html">chvalid</a> - Unicode character range checking<br><a href="libxml2-debugXML.html">debugXML</a> - Tree debugging APIs<br><a href="libxml2-dict.html">dict</a> - string dictionary<br><a href="libxml2-encoding.html">encoding</a> - interface for the encoding conversion functions<br><a href="libxml2-entities.html">entities</a> - interface for the XML entities handling<br><a href="libxml2-globals.html">globals</a> - interface for all global variables of the library<br><a href="libxml2-hash.html">hash</a> - Chained hash tables<br><a href="libxml2-list.html">list</a> - lists interfaces<br><a href="libxml2-nanoftp.html">nanoftp</a> - minimal FTP implementation<br><a href="libxml2-nanohttp.html">nanohttp</a> - minimal HTTP implementation<br><a href="libxml2-parser.html">parser</a> - the core parser module<br><a href="libxml2-parserInternals.html">parserInternals</a> - internals routines and limits exported by the parser.<br><a href="libxml2-pattern.html">pattern</a> - pattern expression handling<br><a href="libxml2-relaxng.html">relaxng</a> - implementation of the Relax-NG validation<br><a href="libxml2-schemasInternals.html">schemasInternals</a> - internal interfaces for XML Schemas<br><a href="libxml2-schematron.html">schematron</a> - XML Schematron implementation<br><a href="libxml2-threads.html">threads</a> - interfaces for thread handling<br><a href="libxml2-tree.html">tree</a> - interfaces for tree manipulation<br><a href="libxml2-uri.html">uri</a> - library of generic URI related routines<br><a href="libxml2-valid.html">valid</a> - The DTD validation<br><a href="libxml2-xinclude.html">xinclude</a> - implementation of XInclude<br><a href="libxml2-xlink.html">xlink</a> - unfinished XLink detection module<br><a href="libxml2-xmlIO.html">xmlIO</a> - interface for the I/O interfaces used by the parser<br><a href="libxml2-xmlautomata.html">xmlautomata</a> - API to build regexp automata<br><a href="libxml2-xmlerror.html">xmlerror</a> - error handling<br><a href="libxml2-xmlexports.html">xmlexports</a> - macros for marking symbols as exportable/importable.<br><a href="libxml2-xmlmemory.html">xmlmemory</a> - interface for the memory allocator<br><a href="libxml2-xmlmodule.html">xmlmodule</a> - dynamic module loading<br><a href="libxml2-xmlreader.html">xmlreader</a> - the XMLReader implementation<br><a href="libxml2-xmlregexp.html">xmlregexp</a> - regular expressions handling<br><a href="libxml2-xmlsave.html">xmlsave</a> - the XML document serializer<br><a href="libxml2-xmlschemas.html">xmlschemas</a> - incomplete XML Schemas structure implementation<br><a href="libxml2-xmlschemastypes.html">xmlschemastypes</a> - implementation of XML Schema Datatypes<br><a href="libxml2-xmlstring.html">xmlstring</a> - set of routines to process strings<br><a href="libxml2-xmlunicode.html">xmlunicode</a> - Unicode character APIs<br><a href="libxml2-xmlversion.html">xmlversion</a> - compile-time version information<br><a href="libxml2-xmlwriter.html">xmlwriter</a> - text writing API for XML<br><a href="libxml2-xpath.html">xpath</a> - XML Path Language implementation<br><a href="libxml2-xpathInternals.html">xpathInternals</a> - internal interfaces for XML Path Language implementation<br><a href="libxml2-xpointer.html">xpointer</a> - API to handle XML Pointers<br></p>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlschemastypes.html000064400000126643151730335300016113 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlschemastypes: implementation of XML Schema Datatypes</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlschemas.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlstring.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlschemastypes</span></h2>
<p>xmlschemastypes - implementation of XML Schema Datatypes</p>
<p>module providing the XML Schema Datatypes implementation both definition and validity checking </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef enum <a href="#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a>;
int	<a href="#xmlSchemaCheckFacet">xmlSchemaCheckFacet</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> typeDecl, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> pctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlSchemaCleanupTypes">xmlSchemaCleanupTypes</a>		(void);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSchemaCollapseString">xmlSchemaCollapseString</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlSchemaCompareValues">xmlSchemaCompareValues</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> x, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> y);
int	<a href="#xmlSchemaCompareValuesWhtsp">xmlSchemaCompareValuesWhtsp</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> x, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> xws, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> y, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> yws);
<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	<a href="#xmlSchemaCopyValue">xmlSchemaCopyValue</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val);
void	<a href="#xmlSchemaFreeFacet">xmlSchemaFreeFacet</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet);
void	<a href="#xmlSchemaFreeValue">xmlSchemaFreeValue</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> value);
<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	<a href="#xmlSchemaGetBuiltInListSimpleTypeItemType">xmlSchemaGetBuiltInListSimpleTypeItemType</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type);
<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	<a href="#xmlSchemaGetBuiltInType">xmlSchemaGetBuiltInType</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> type);
int	<a href="#xmlSchemaGetCanonValue">xmlSchemaGetCanonValue</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** retValue);
int	<a href="#xmlSchemaGetCanonValueWhtsp">xmlSchemaGetCanonValueWhtsp</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** retValue, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws);
unsigned long	<a href="#xmlSchemaGetFacetValueAsULong">xmlSchemaGetFacetValueAsULong</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet);
<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	<a href="#xmlSchemaGetPredefinedType">xmlSchemaGetPredefinedType</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns);
<a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a>	<a href="#xmlSchemaGetValType">xmlSchemaGetValType</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val);
void	<a href="#xmlSchemaInitTypes">xmlSchemaInitTypes</a>		(void);
int	<a href="#xmlSchemaIsBuiltInTypeFacet">xmlSchemaIsBuiltInTypeFacet</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 int facetType);
<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a>	<a href="#xmlSchemaNewFacet">xmlSchemaNewFacet</a>	(void);
<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	<a href="#xmlSchemaNewNOTATIONValue">xmlSchemaNewNOTATIONValue</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns);
<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	<a href="#xmlSchemaNewQNameValue">xmlSchemaNewQNameValue</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceName, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName);
<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	<a href="#xmlSchemaNewStringValue">xmlSchemaNewStringValue</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlSchemaValPredefTypeNode">xmlSchemaValPredefTypeNode</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlSchemaValPredefTypeNodeNoNorm">xmlSchemaValPredefTypeNodeNoNorm</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlSchemaValidateFacet">xmlSchemaValidateFacet</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> base, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val);
int	<a href="#xmlSchemaValidateFacetWhtsp">xmlSchemaValidateFacetWhtsp</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> fws, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> valType, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws);
int	<a href="#xmlSchemaValidateLengthFacet">xmlSchemaValidateLengthFacet</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 unsigned long * length);
int	<a href="#xmlSchemaValidateLengthFacetWhtsp">xmlSchemaValidateLengthFacetWhtsp</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> valType, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>						 unsigned long * length, <br>						 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws);
int	<a href="#xmlSchemaValidateListSimpleTypeFacet">xmlSchemaValidateListSimpleTypeFacet</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 unsigned long actualLen, <br>						 unsigned long * expectedLen);
int	<a href="#xmlSchemaValidatePredefinedType">xmlSchemaValidatePredefinedType</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val);
int	<a href="#xmlSchemaValueAppend">xmlSchemaValueAppend</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> prev, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> cur);
int	<a href="#xmlSchemaValueGetAsBoolean">xmlSchemaValueGetAsBoolean</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSchemaValueGetAsString">xmlSchemaValueGetAsString</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val);
<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	<a href="#xmlSchemaValueGetNext">xmlSchemaValueGetNext</a>	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> cur);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSchemaWhiteSpaceReplace">xmlSchemaWhiteSpaceReplace</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWhitespaceValueType">Enum </a>xmlSchemaWhitespaceValueType</h3>
<pre class="programlisting">enum <a href="#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> {
    <a name="XML_SCHEMA_WHITESPACE_UNKNOWN">XML_SCHEMA_WHITESPACE_UNKNOWN</a> = 0
    <a name="XML_SCHEMA_WHITESPACE_PRESERVE">XML_SCHEMA_WHITESPACE_PRESERVE</a> = 1
    <a name="XML_SCHEMA_WHITESPACE_REPLACE">XML_SCHEMA_WHITESPACE_REPLACE</a> = 2
    <a name="XML_SCHEMA_WHITESPACE_COLLAPSE">XML_SCHEMA_WHITESPACE_COLLAPSE</a> = 3
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCheckFacet"></a>xmlSchemaCheckFacet ()</h3>
<pre class="programlisting">int	xmlSchemaCheckFacet		(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> typeDecl, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> pctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Checks and computes the values of facets.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet</td>
</tr>
<tr>
<td><span class="term"><i><tt>typeDecl</tt></i>:</span></td>
<td>the schema type definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>pctxt</tt></i>:</span></td>
<td>the schema parser context or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the optional name of the type</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if valid, a positive error code if not valid and -1 in case of an internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCleanupTypes"></a>xmlSchemaCleanupTypes ()</h3>
<pre class="programlisting">void	xmlSchemaCleanupTypes		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Cleanup the default XML Schemas type library</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCollapseString"></a>xmlSchemaCollapseString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSchemaCollapseString	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Removes and normalize white spaces in the string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>a value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new string or NULL if no change was required.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCompareValues"></a>xmlSchemaCompareValues ()</h3>
<pre class="programlisting">int	xmlSchemaCompareValues		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> x, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> y)<br>
</pre>
<p>Compare 2 values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>x</tt></i>:</span></td>
<td>a first value</td>
</tr>
<tr>
<td><span class="term"><i><tt>y</tt></i>:</span></td>
<td>a second value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 if x &lt; y, 0 if x == y, 1 if x &gt; y, 2 if x &lt;&gt; y, and -2 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCompareValuesWhtsp"></a>xmlSchemaCompareValuesWhtsp ()</h3>
<pre class="programlisting">int	xmlSchemaCompareValuesWhtsp	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> x, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> xws, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> y, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> yws)<br>
</pre>
<p>Compare 2 values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>x</tt></i>:</span></td>
<td>a first value</td>
</tr>
<tr>
<td><span class="term"><i><tt>xws</tt></i>:</span></td>
<td>the whitespace value of x</td>
</tr>
<tr>
<td><span class="term"><i><tt>y</tt></i>:</span></td>
<td>a second value</td>
</tr>
<tr>
<td><span class="term"><i><tt>yws</tt></i>:</span></td>
<td>the whitespace value of y</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 if x &lt; y, 0 if x == y, 1 if x &gt; y, 2 if x &lt;&gt; y, and -2 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaCopyValue"></a>xmlSchemaCopyValue ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	xmlSchemaCopyValue	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val)<br>
</pre>
<p>Copies the precomputed value. This duplicates any string within.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value to be copied</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the copy or NULL if a copy for a data-type is not implemented.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeFacet"></a>xmlSchemaFreeFacet ()</h3>
<pre class="programlisting">void	xmlSchemaFreeFacet		(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet)<br>
</pre>
<p>Deallocate a Schema Facet structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>a schema facet structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeValue"></a>xmlSchemaFreeValue ()</h3>
<pre class="programlisting">void	xmlSchemaFreeValue		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> value)<br>
</pre>
<p>Cleanup the default XML Schemas type library</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetBuiltInListSimpleTypeItemType"></a>xmlSchemaGetBuiltInListSimpleTypeItemType ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	xmlSchemaGetBuiltInListSimpleTypeItemType	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type)<br>
</pre>
<p>Lookup function</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the built-in simple type.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the item type of @type as defined by the built-in datatype hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetBuiltInType"></a>xmlSchemaGetBuiltInType ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	xmlSchemaGetBuiltInType	(<a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> type)<br>
</pre>
<p>Gives you the type struct for a built-in type by its type id.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of the built in type</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the type if found, NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetCanonValue"></a>xmlSchemaGetCanonValue ()</h3>
<pre class="programlisting">int	xmlSchemaGetCanonValue		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** retValue)<br>
</pre>
<p>Get the canonical lexical representation of the value. The caller has to FREE the returned retValue. WARNING: Some value types are not supported yet, resulting in a @retValue of "???". TODO: XML Schema 1.0 does not define canonical representations for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>retValue</tt></i>:</span></td>
<td>the returned value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetCanonValueWhtsp"></a>xmlSchemaGetCanonValueWhtsp ()</h3>
<pre class="programlisting">int	xmlSchemaGetCanonValueWhtsp	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** retValue, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws)<br>
</pre>
<p>Get the canonical representation of the value. The caller has to free the returned @retValue.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>retValue</tt></i>:</span></td>
<td>the returned value</td>
</tr>
<tr>
<td><span class="term"><i><tt>ws</tt></i>:</span></td>
<td>the whitespace type of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetFacetValueAsULong"></a>xmlSchemaGetFacetValueAsULong ()</h3>
<pre class="programlisting">unsigned long	xmlSchemaGetFacetValueAsULong	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet)<br>
</pre>
<p>Extract the value of a facet</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>an schemas type facet</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value as a long</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetPredefinedType"></a>xmlSchemaGetPredefinedType ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	xmlSchemaGetPredefinedType	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns)<br>
</pre>
<p>Lookup a type in the default XML Schemas type library</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the type name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the type if found, NULL otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetValType"></a>xmlSchemaGetValType ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a>	xmlSchemaGetValType	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val)<br>
</pre>
<p>Accessor for the type of a value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a schemas value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> of the value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaInitTypes"></a>xmlSchemaInitTypes ()</h3>
<pre class="programlisting">void	xmlSchemaInitTypes		(void)<br>
</pre>
<p>Initialize the default XML Schemas type library</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaIsBuiltInTypeFacet"></a>xmlSchemaIsBuiltInTypeFacet ()</h3>
<pre class="programlisting">int	xmlSchemaIsBuiltInTypeFacet	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 int facetType)<br>
</pre>
<p>Evaluates if a specific facet can be used in conjunction with a type.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the built-in type</td>
</tr>
<tr>
<td><span class="term"><i><tt>facetType</tt></i>:</span></td>
<td>the facet type</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the facet can be used with the given built-in type, 0 otherwise and -1 in case the type is not a built-in type.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewFacet"></a>xmlSchemaNewFacet ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a>	xmlSchemaNewFacet	(void)<br>
</pre>
<p>Allocate a new Facet structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly allocated structure or NULL in case or error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewNOTATIONValue"></a>xmlSchemaNewNOTATIONValue ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	xmlSchemaNewNOTATIONValue	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns)<br>
</pre>
<p>Allocate a new NOTATION value. The given values are consumed and freed with the struct.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the notation name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the notation namespace name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new value or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewQNameValue"></a>xmlSchemaNewQNameValue ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	xmlSchemaNewQNameValue	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceName, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName)<br>
</pre>
<p>Allocate a new QName value. The given values are consumed and freed with the struct.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>namespaceName</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>localName</tt></i>:</span></td>
<td>the local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new value or NULL in case of an error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewStringValue"></a>xmlSchemaNewStringValue ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	xmlSchemaNewStringValue	(<a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Allocate a new simple type value. The type can be of XML_SCHEMAS_STRING. WARNING: This one is intended to be expanded for other string based types. We need this for anySimpleType as well. The given value is consumed and freed with the struct.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the value type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new value or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValPredefTypeNode"></a>xmlSchemaValPredefTypeNode ()</h3>
<pre class="programlisting">int	xmlSchemaValPredefTypeNode	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the predefined type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the return computed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node containing the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValPredefTypeNodeNoNorm"></a>xmlSchemaValPredefTypeNodeNoNorm ()</h3>
<pre class="programlisting">int	xmlSchemaValPredefTypeNodeNoNorm	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. This one does apply any normalization to the value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the predefined type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the return computed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node containing the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateFacet"></a>xmlSchemaValidateFacet ()</h3>
<pre class="programlisting">int	xmlSchemaValidateFacet		(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> base, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val)<br>
</pre>
<p>Check a value against a facet condition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>base</tt></i>:</span></td>
<td>the base type</td>
</tr>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the lexical repr of the value to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateFacetWhtsp"></a>xmlSchemaValidateFacetWhtsp ()</h3>
<pre class="programlisting">int	xmlSchemaValidateFacetWhtsp	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> fws, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> valType, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws)<br>
</pre>
<p>Check a value against a facet condition. This takes value normalization according to the specified whitespace types into account. Note that @value needs to be the *normalized* value if the facet is of type "pattern".</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>fws</tt></i>:</span></td>
<td>the whitespace type of the facet's value</td>
</tr>
<tr>
<td><span class="term"><i><tt>valType</tt></i>:</span></td>
<td>the built-in type of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the lexical (or normalized for pattern) repr of the value to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>ws</tt></i>:</span></td>
<td>the whitespace type of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateLengthFacet"></a>xmlSchemaValidateLengthFacet ()</h3>
<pre class="programlisting">int	xmlSchemaValidateLengthFacet	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>					 unsigned long * length)<br>
</pre>
<p>Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the built-in type</td>
</tr>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the lexical repr. of the value to be validated</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>length</tt></i>:</span></td>
<td>the actual length of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateLengthFacetWhtsp"></a>xmlSchemaValidateLengthFacetWhtsp ()</h3>
<pre class="programlisting">int	xmlSchemaValidateLengthFacetWhtsp	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValType">xmlSchemaValType</a> valType, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val, <br>						 unsigned long * length, <br>						 <a href="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType">xmlSchemaWhitespaceValueType</a> ws)<br>
</pre>
<p>Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>valType</tt></i>:</span></td>
<td>the built-in type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the lexical repr. of the value to be validated</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the precomputed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>length</tt></i>:</span></td>
<td>the actual length of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>ws</tt></i>:</span></td>
<td>the whitespace type of the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateListSimpleTypeFacet"></a>xmlSchemaValidateListSimpleTypeFacet ()</h3>
<pre class="programlisting">int	xmlSchemaValidateListSimpleTypeFacet	(<a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a> facet, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>						 unsigned long actualLen, <br>						 unsigned long * expectedLen)<br>
</pre>
<p>Checks the value of a list simple type against a facet.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>facet</tt></i>:</span></td>
<td>the facet to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the lexical repr of the value to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>actualLen</tt></i>:</span></td>
<td>the number of list items</td>
</tr>
<tr>
<td><span class="term"><i><tt>expectedLen</tt></i>:</span></td>
<td>the resulting expected number of list items</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the value is valid, a positive error code number otherwise and -1 in case of an internal error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidatePredefinedType"></a>xmlSchemaValidatePredefinedType ()</h3>
<pre class="programlisting">int	xmlSchemaValidatePredefinedType	(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> * val)<br>
</pre>
<p>Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the predefined type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the return computed value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValueAppend"></a>xmlSchemaValueAppend ()</h3>
<pre class="programlisting">int	xmlSchemaValueAppend		(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> prev, <br>					 <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> cur)<br>
</pre>
<p>Appends a next sibling to a list of computed values.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>prev</tt></i>:</span></td>
<td>the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the value to be appended</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if succeeded and -1 on API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValueGetAsBoolean"></a>xmlSchemaValueGetAsBoolean ()</h3>
<pre class="programlisting">int	xmlSchemaValueGetAsBoolean	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val)<br>
</pre>
<p>Accessor for the boolean value of a computed value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true and 0 if false, or in case of an error. Hmm.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValueGetAsString"></a>xmlSchemaValueGetAsString ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSchemaValueGetAsString	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> val)<br>
</pre>
<p>Accessor for the string value of a computed value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string value or NULL if there was none, or on API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValueGetNext"></a>xmlSchemaValueGetNext ()</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	xmlSchemaValueGetNext	(<a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a> cur)<br>
</pre>
<p>Accessor for the next sibling of a list of computed values.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next value or NULL if there was none, or on API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWhiteSpaceReplace"></a>xmlSchemaWhiteSpaceReplace ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSchemaWhiteSpaceReplace	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Replaces 0xd, 0x9 and 0xa with a space.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>a value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new string or NULL if no change was required.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/home.png000064400000001216151730335300012047 0ustar00�PNG


IHDR�w=�bKGD�������	pHYs��~�tIME�1��KvIDATx�Օ�kq�?�rC���p�	~C�np��CAAJ.B-\'G�]:ܠ���C�
-(�8���Ԁ!�fD�����ғklbR�oy�x����wpðIJ�<�of_�-@����RH����f֟t����^����ښ�$Q���|��p����g�v;X^^&�s�(bww�Z�F���9���&�3඙
��^IR�ZUE.0Z]]U��
�PY�M�8�H�GI��������e�kqq�Ҁ�!��
$��۬��3�n
�e��{-/seee��Ì�X����O�ͷ$�8==U�S������Q�RR��'�9-�s���+B^ �C�ەs���<o��3�KKKt:j��J�$I����<'�s�8�{�������z��j�(M�Q7u$�,����B�.�ތ�Ձ;���F�p�����Y�z�3k��E�	���e���!S���$��v����0KR�o�0��l6999�j�sssT*�ׅv�v�
>�+%��<7��W��	��:�2IEND�B`�gtk-doc/html/libxml2/libxml2-xmlwriter.html000064400000332757151730335300014724 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlwriter: text writing API for XML</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlversion.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xpath.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlwriter</span></h2>
<p>xmlwriter - text writing API for XML</p>
<p>text writing API for XML </p>
<p>Author(s): Alfred Mickautsch &lt;alfred@mickautsch.de&gt; </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#xmlTextWriterWriteDocType">xmlTextWriterWriteDocType</a>;
#define <a href="#xmlTextWriterWriteProcessingInstruction">xmlTextWriterWriteProcessingInstruction</a>;
typedef struct _xmlTextWriter <a href="#xmlTextWriter">xmlTextWriter</a>;
typedef <a href="libxml2-xmlwriter.html#xmlTextWriter">xmlTextWriter</a> * <a href="#xmlTextWriterPtr">xmlTextWriterPtr</a>;
void	<a href="#xmlFreeTextWriter">xmlFreeTextWriter</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriter">xmlNewTextWriter</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriterDoc">xmlNewTextWriterDoc</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> * doc, <br>						 int compression);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriterFilename">xmlNewTextWriterFilename</a>	(const char * uri, <br>							 int compression);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriterMemory">xmlNewTextWriterMemory</a>	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>						 int compression);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriterPushParser">xmlNewTextWriterPushParser</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int compression);
<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	<a href="#xmlNewTextWriterTree">xmlNewTextWriterTree</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 int compression);
int	<a href="#xmlTextWriterEndAttribute">xmlTextWriterEndAttribute</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndCDATA">xmlTextWriterEndCDATA</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndComment">xmlTextWriterEndComment</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndDTD">xmlTextWriterEndDTD</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndDTDAttlist">xmlTextWriterEndDTDAttlist</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndDTDElement">xmlTextWriterEndDTDElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndDTDEntity">xmlTextWriterEndDTDEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndDocument">xmlTextWriterEndDocument</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndElement">xmlTextWriterEndElement</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterEndPI">xmlTextWriterEndPI</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterFlush">xmlTextWriterFlush</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterFullEndElement">xmlTextWriterFullEndElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterSetIndent">xmlTextWriterSetIndent</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int indent);
int	<a href="#xmlTextWriterSetIndentString">xmlTextWriterSetIndentString</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
int	<a href="#xmlTextWriterSetQuoteChar">xmlTextWriterSetQuoteChar</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> quotechar);
int	<a href="#xmlTextWriterStartAttribute">xmlTextWriterStartAttribute</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextWriterStartAttributeNS">xmlTextWriterStartAttributeNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI);
int	<a href="#xmlTextWriterStartCDATA">xmlTextWriterStartCDATA</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterStartComment">xmlTextWriterStartComment</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer);
int	<a href="#xmlTextWriterStartDTD">xmlTextWriterStartDTD</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid);
int	<a href="#xmlTextWriterStartDTDAttlist">xmlTextWriterStartDTDAttlist</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextWriterStartDTDElement">xmlTextWriterStartDTDElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextWriterStartDTDEntity">xmlTextWriterStartDTDEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int pe, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextWriterStartDocument">xmlTextWriterStartDocument</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * version, <br>					 const char * encoding, <br>					 const char * standalone);
int	<a href="#xmlTextWriterStartElement">xmlTextWriterStartElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextWriterStartElementNS">xmlTextWriterStartElementNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI);
int	<a href="#xmlTextWriterStartPI">xmlTextWriterStartPI</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target);
int	<a href="#xmlTextWriterWriteAttribute">xmlTextWriterWriteAttribute</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteAttributeNS">xmlTextWriterWriteAttributeNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteBase64">xmlTextWriterWriteBase64</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * data, <br>					 int start, <br>					 int len);
int	<a href="#xmlTextWriterWriteBinHex">xmlTextWriterWriteBinHex</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * data, <br>					 int start, <br>					 int len);
int	<a href="#xmlTextWriterWriteCDATA">xmlTextWriterWriteCDATA</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteComment">xmlTextWriterWriteComment</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteDTD">xmlTextWriterWriteDTD</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * subset);
int	<a href="#xmlTextWriterWriteDTDAttlist">xmlTextWriterWriteDTDAttlist</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteDTDElement">xmlTextWriterWriteDTDElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteDTDEntity">xmlTextWriterWriteDTDEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int pe, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteDTDExternalEntity">xmlTextWriterWriteDTDExternalEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 int pe, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid);
int	<a href="#xmlTextWriterWriteDTDExternalEntityContents">xmlTextWriterWriteDTDExternalEntityContents</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid);
int	<a href="#xmlTextWriterWriteDTDInternalEntity">xmlTextWriterWriteDTDInternalEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 int pe, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteDTDNotation">xmlTextWriterWriteDTDNotation</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid);
int	<a href="#xmlTextWriterWriteElement">xmlTextWriterWriteElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteElementNS">xmlTextWriterWriteElementNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteFormatAttribute">xmlTextWriterWriteFormatAttribute</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...);
int	<a href="#xmlTextWriterWriteFormatAttributeNS">xmlTextWriterWriteFormatAttributeNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 ... ...);
int	<a href="#xmlTextWriterWriteFormatCDATA">xmlTextWriterWriteFormatCDATA</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatComment">xmlTextWriterWriteFormatComment</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatDTD">xmlTextWriterWriteFormatDTD</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatDTDAttlist">xmlTextWriterWriteFormatDTDAttlist</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...);
int	<a href="#xmlTextWriterWriteFormatDTDElement">xmlTextWriterWriteFormatDTDElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...);
int	<a href="#xmlTextWriterWriteFormatDTDInternalEntity">xmlTextWriterWriteFormatDTDInternalEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 int pe, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const char * format, <br>							 ... ...);
int	<a href="#xmlTextWriterWriteFormatElement">xmlTextWriterWriteFormatElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatElementNS">xmlTextWriterWriteFormatElementNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 ... ...);
int	<a href="#xmlTextWriterWriteFormatPI">xmlTextWriterWriteFormatPI</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatRaw">xmlTextWriterWriteFormatRaw</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWriteFormatString">xmlTextWriterWriteFormatString</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...);
int	<a href="#xmlTextWriterWritePI">xmlTextWriterWritePI</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteRaw">xmlTextWriterWriteRaw</a>		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteRawLen">xmlTextWriterWriteRawLen</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
int	<a href="#xmlTextWriterWriteString">xmlTextWriterWriteString</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
int	<a href="#xmlTextWriterWriteVFormatAttribute">xmlTextWriterWriteVFormatAttribute</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatAttributeNS">xmlTextWriterWriteVFormatAttributeNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatCDATA">xmlTextWriterWriteVFormatCDATA</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatComment">xmlTextWriterWriteVFormatComment</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatDTD">xmlTextWriterWriteVFormatDTD</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const char * format, <br>					 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatDTDAttlist">xmlTextWriterWriteVFormatDTDAttlist</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatDTDElement">xmlTextWriterWriteVFormatDTDElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatDTDInternalEntity">xmlTextWriterWriteVFormatDTDInternalEntity</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 int pe, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const char * format, <br>							 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatElement">xmlTextWriterWriteVFormatElement</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatElementNS">xmlTextWriterWriteVFormatElementNS</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatPI">xmlTextWriterWriteVFormatPI</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const char * format, <br>					 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatRaw">xmlTextWriterWriteVFormatRaw</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr);
int	<a href="#xmlTextWriterWriteVFormatString">xmlTextWriterWriteVFormatString</a>	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDocType">Macro </a>xmlTextWriterWriteDocType</h3>
<pre class="programlisting">#define <a href="#xmlTextWriterWriteDocType">xmlTextWriterWriteDocType</a>;
</pre>
<p>this macro maps to <a href="libxml2-xmlwriter.html#xmlTextWriterWriteDTD">xmlTextWriterWriteDTD</a></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteProcessingInstruction">Macro </a>xmlTextWriterWriteProcessingInstruction</h3>
<pre class="programlisting">#define <a href="#xmlTextWriterWriteProcessingInstruction">xmlTextWriterWriteProcessingInstruction</a>;
</pre>
<p>This macro maps to <a href="libxml2-xmlwriter.html#xmlTextWriterWritePI">xmlTextWriterWritePI</a></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriter">Structure </a>xmlTextWriter</h3>
<pre class="programlisting">struct _xmlTextWriter {
The content of this structure is not made public by the API.
} xmlTextWriter;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterPtr">Typedef </a>xmlTextWriterPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriter">xmlTextWriter</a> * xmlTextWriterPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeTextWriter"></a>xmlFreeTextWriter ()</h3>
<pre class="programlisting">void	xmlFreeTextWriter		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>Deallocate all the resources associated to the writer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriter"></a>xmlNewTextWriter ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriter	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure using an <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> NOTE: the @out parameter will be deallocated when the writer is closed (if the call succeed.)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriterDoc"></a>xmlNewTextWriterDoc ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriterDoc	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> * doc, <br>						 int compression)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure with @*doc as output</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>address of a <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> to hold the new XML document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>compress the output?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriterFilename"></a>xmlNewTextWriterFilename ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriterFilename	(const char * uri, <br>							 int compression)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure with @uri as output</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>the URI of the resource for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>compress the output?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriterMemory"></a>xmlNewTextWriterMemory ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriterMemory	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>						 int compression)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure with @buf as output TODO: handle compression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td><a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a></td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>compress the output?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriterPushParser"></a>xmlNewTextWriterPushParser ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriterPushParser	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int compression)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure with @ctxt as output NOTE: the @ctxt context will be freed with the resulting writer (if the call succeeds). TODO: handle compression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> to hold the new XML document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>compress the output?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextWriterTree"></a>xmlNewTextWriterTree ()</h3>
<pre class="programlisting"><a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>	xmlNewTextWriterTree	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 int compression)<br>
</pre>
<p>Create a new <a href="libxml2-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a> structure with @doc as output starting at @node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a></td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> or NULL for doc-&gt;children</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>compress the output?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndAttribute"></a>xmlTextWriterEndAttribute ()</h3>
<pre class="programlisting">int	xmlTextWriterEndAttribute	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End the current xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndCDATA"></a>xmlTextWriterEndCDATA ()</h3>
<pre class="programlisting">int	xmlTextWriterEndCDATA		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml CDATA section.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndComment"></a>xmlTextWriterEndComment ()</h3>
<pre class="programlisting">int	xmlTextWriterEndComment		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End the current xml comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndDTD"></a>xmlTextWriterEndDTD ()</h3>
<pre class="programlisting">int	xmlTextWriterEndDTD		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml DTD.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndDTDAttlist"></a>xmlTextWriterEndDTDAttlist ()</h3>
<pre class="programlisting">int	xmlTextWriterEndDTDAttlist	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml DTD <a href="libxml2-SAX.html#attribute">attribute</a> list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndDTDElement"></a>xmlTextWriterEndDTDElement ()</h3>
<pre class="programlisting">int	xmlTextWriterEndDTDElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml DTD element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndDTDEntity"></a>xmlTextWriterEndDTDEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterEndDTDEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml DTD entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndDocument"></a>xmlTextWriterEndDocument ()</h3>
<pre class="programlisting">int	xmlTextWriterEndDocument	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End an xml document. All open elements are closed, and the content is flushed to the output.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndElement"></a>xmlTextWriterEndElement ()</h3>
<pre class="programlisting">int	xmlTextWriterEndElement		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End the current xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterEndPI"></a>xmlTextWriterEndPI ()</h3>
<pre class="programlisting">int	xmlTextWriterEndPI		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End the current xml PI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterFlush"></a>xmlTextWriterFlush ()</h3>
<pre class="programlisting">int	xmlTextWriterFlush		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>Flush the output buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterFullEndElement"></a>xmlTextWriterFullEndElement ()</h3>
<pre class="programlisting">int	xmlTextWriterFullEndElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>End the current xml element. Writes an end tag even if the element is empty</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterSetIndent"></a>xmlTextWriterSetIndent ()</h3>
<pre class="programlisting">int	xmlTextWriterSetIndent		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int indent)<br>
</pre>
<p>Set indentation output. indent = 0 do not indentation. indent &gt; 0 do indentation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>indent</tt></i>:</span></td>
<td>do indentation?</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 on error or 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterSetIndentString"></a>xmlTextWriterSetIndentString ()</h3>
<pre class="programlisting">int	xmlTextWriterSetIndentString	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Set string indentation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 on error or 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterSetQuoteChar"></a>xmlTextWriterSetQuoteChar ()</h3>
<pre class="programlisting">int	xmlTextWriterSetQuoteChar	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> quotechar)<br>
</pre>
<p>Set the character used for quoting attributes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>quotechar</tt></i>:</span></td>
<td>the quote character</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 on error or 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartAttribute"></a>xmlTextWriterStartAttribute ()</h3>
<pre class="programlisting">int	xmlTextWriterStartAttribute	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Start an xml attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartAttributeNS"></a>xmlTextWriterStartAttributeNS ()</h3>
<pre class="programlisting">int	xmlTextWriterStartAttributeNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI)<br>
</pre>
<p>Start an xml <a href="libxml2-SAX.html#attribute">attribute</a> with namespace support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartCDATA"></a>xmlTextWriterStartCDATA ()</h3>
<pre class="programlisting">int	xmlTextWriterStartCDATA		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>Start an xml CDATA section.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartComment"></a>xmlTextWriterStartComment ()</h3>
<pre class="programlisting">int	xmlTextWriterStartComment	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer)<br>
</pre>
<p>Start an xml comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartDTD"></a>xmlTextWriterStartDTD ()</h3>
<pre class="programlisting">int	xmlTextWriterStartDTD		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid)<br>
</pre>
<p>Start an xml DTD.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartDTDAttlist"></a>xmlTextWriterStartDTDAttlist ()</h3>
<pre class="programlisting">int	xmlTextWriterStartDTDAttlist	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Start an xml DTD ATTLIST.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartDTDElement"></a>xmlTextWriterStartDTDElement ()</h3>
<pre class="programlisting">int	xmlTextWriterStartDTDElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Start an xml DTD element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartDTDEntity"></a>xmlTextWriterStartDTDEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterStartDTDEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int pe, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Start an xml DTD ATTLIST.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartDocument"></a>xmlTextWriterStartDocument ()</h3>
<pre class="programlisting">int	xmlTextWriterStartDocument	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * version, <br>					 const char * encoding, <br>					 const char * standalone)<br>
</pre>
<p>Start a new xml document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>version</tt></i>:</span></td>
<td>the xml version ("1.0") or NULL for default ("1.0")</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding or NULL for default</td>
</tr>
<tr>
<td><span class="term"><i><tt>standalone</tt></i>:</span></td>
<td>"yes" or "no" or NULL for default</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartElement"></a>xmlTextWriterStartElement ()</h3>
<pre class="programlisting">int	xmlTextWriterStartElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Start an xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartElementNS"></a>xmlTextWriterStartElementNS ()</h3>
<pre class="programlisting">int	xmlTextWriterStartElementNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI)<br>
</pre>
<p>Start an xml element with namespace support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterStartPI"></a>xmlTextWriterStartPI ()</h3>
<pre class="programlisting">int	xmlTextWriterStartPI		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target)<br>
</pre>
<p>Start an xml PI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>PI target</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteAttribute"></a>xmlTextWriterWriteAttribute ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteAttribute	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteAttributeNS"></a>xmlTextWriterWriteAttributeNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteAttributeNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteBase64"></a>xmlTextWriterWriteBase64 ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteBase64	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * data, <br>					 int start, <br>					 int len)<br>
</pre>
<p>Write an base64 encoded xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>binary data</td>
</tr>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the position within the data of the first byte to encode</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of bytes to encode</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteBinHex"></a>xmlTextWriterWriteBinHex ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteBinHex	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * data, <br>					 int start, <br>					 int len)<br>
</pre>
<p>Write a BinHex encoded xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>binary data</td>
</tr>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the position within the data of the first byte to encode</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of bytes to encode</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteCDATA"></a>xmlTextWriterWriteCDATA ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteCDATA		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml CDATA.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>CDATA content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteComment"></a>xmlTextWriterWriteComment ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteComment	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#comment">comment</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTD"></a>xmlTextWriterWriteDTD ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTD		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * subset)<br>
</pre>
<p>Write a DTD.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>subset</tt></i>:</span></td>
<td>string content of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDAttlist"></a>xmlTextWriterWriteDTDAttlist ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDAttlist	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write a DTD ATTLIST.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>content of the ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDElement"></a>xmlTextWriterWriteDTDElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write a DTD element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD element</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>content of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDEntity"></a>xmlTextWriterWriteDTDEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 int pe, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write a DTD entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>ndataid</tt></i>:</span></td>
<td>the xml notation name.</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>content of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDExternalEntity"></a>xmlTextWriterWriteDTDExternalEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDExternalEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 int pe, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid)<br>
</pre>
<p>Write a DTD external entity. The entity must have been started with <a href="libxml2-xmlwriter.html#xmlTextWriterStartDTDEntity">xmlTextWriterStartDTDEntity</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>ndataid</tt></i>:</span></td>
<td>the xml notation name.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDExternalEntityContents"></a>xmlTextWriterWriteDTDExternalEntityContents ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDExternalEntityContents	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ndataid)<br>
</pre>
<p>Write the contents of a DTD external entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>ndataid</tt></i>:</span></td>
<td>the xml notation name.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDInternalEntity"></a>xmlTextWriterWriteDTDInternalEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDInternalEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 int pe, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write a DTD internal entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>content of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteDTDNotation"></a>xmlTextWriterWriteDTDNotation ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteDTDNotation	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid)<br>
</pre>
<p>Write a DTD entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the xml notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteElement"></a>xmlTextWriterWriteElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>element content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteElementNS"></a>xmlTextWriterWriteElementNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteElementNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml element with namespace support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>element content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatAttribute"></a>xmlTextWriterWriteFormatAttribute ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatAttribute	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...)<br>
</pre>
<p>Write a formatted xml attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatAttributeNS"></a>xmlTextWriterWriteFormatAttributeNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatAttributeNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 ... ...)<br>
</pre>
<p>Write a formatted xml attribute.with namespace support</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatCDATA"></a>xmlTextWriterWriteFormatCDATA ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatCDATA	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a formatted xml CDATA.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatComment"></a>xmlTextWriterWriteFormatComment ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatComment	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write an xml comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatDTD"></a>xmlTextWriterWriteFormatDTD ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatDTD	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a DTD with a formatted markup declarations part.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatDTDAttlist"></a>xmlTextWriterWriteFormatDTDAttlist ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatDTDAttlist	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...)<br>
</pre>
<p>Write a formatted DTD ATTLIST.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatDTDElement"></a>xmlTextWriterWriteFormatDTDElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatDTDElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 ... ...)<br>
</pre>
<p>Write a formatted DTD element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD element</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatDTDInternalEntity"></a>xmlTextWriterWriteFormatDTDInternalEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatDTDInternalEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 int pe, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const char * format, <br>							 ... ...)<br>
</pre>
<p>Write a formatted DTD internal entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatElement"></a>xmlTextWriterWriteFormatElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a formatted xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatElementNS"></a>xmlTextWriterWriteFormatElementNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatElementNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 ... ...)<br>
</pre>
<p>Write a formatted xml element with namespace support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatPI"></a>xmlTextWriterWriteFormatPI ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatPI	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a formatted PI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>PI target</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatRaw"></a>xmlTextWriterWriteFormatRaw ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatRaw	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a formatted raw xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteFormatString"></a>xmlTextWriterWriteFormatString ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteFormatString	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 ... ...)<br>
</pre>
<p>Write a formatted xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the format</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWritePI"></a>xmlTextWriterWritePI ()</h3>
<pre class="programlisting">int	xmlTextWriterWritePI		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml PI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>PI target</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>PI content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteRaw"></a>xmlTextWriterWriteRaw ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteRaw		(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write a raw xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>text string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteRawLen"></a>xmlTextWriterWriteRawLen ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteRawLen	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Write an xml text. TODO: what about entities and special chars??</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>text string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>length of the text string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteString"></a>xmlTextWriterWriteString ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteString	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Write an xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>text string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatAttribute"></a>xmlTextWriterWriteVFormatAttribute ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatAttribute	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted xml attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatAttributeNS"></a>xmlTextWriterWriteVFormatAttributeNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatAttributeNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted xml attribute.with namespace support</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>
<a href="libxml2-SAX.html#attribute">attribute</a> local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatCDATA"></a>xmlTextWriterWriteVFormatCDATA ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatCDATA	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr)<br>
</pre>
<p>Write a formatted xml CDATA.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatComment"></a>xmlTextWriterWriteVFormatComment ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatComment	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write an xml comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatDTD"></a>xmlTextWriterWriteVFormatDTD ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatDTD	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubid, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysid, <br>					 const char * format, <br>					 va_list argptr)<br>
</pre>
<p>Write a DTD with a formatted markup declarations part.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubid</tt></i>:</span></td>
<td>the public identifier, which is an alternative to the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysid</tt></i>:</span></td>
<td>the system identifier, which is the URI of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatDTDAttlist"></a>xmlTextWriterWriteVFormatDTDAttlist ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatDTDAttlist	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted DTD ATTLIST.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD ATTLIST</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatDTDElement"></a>xmlTextWriterWriteVFormatDTDElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatDTDElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted DTD element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD element</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatDTDInternalEntity"></a>xmlTextWriterWriteVFormatDTDInternalEntity ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatDTDInternalEntity	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>							 int pe, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const char * format, <br>							 va_list argptr)<br>
</pre>
<p>Write a formatted DTD internal entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>pe</tt></i>:</span></td>
<td>TRUE if this is a parameter entity, FALSE if not</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the DTD entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatElement"></a>xmlTextWriterWriteVFormatElement ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatElement	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted xml element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatElementNS"></a>xmlTextWriterWriteVFormatElementNS ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatElementNS	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI, <br>						 const char * format, <br>						 va_list argptr)<br>
</pre>
<p>Write a formatted xml element with namespace support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>element local name</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatPI"></a>xmlTextWriterWriteVFormatPI ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatPI	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const char * format, <br>					 va_list argptr)<br>
</pre>
<p>Write a formatted xml PI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>PI target</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatRaw"></a>xmlTextWriterWriteVFormatRaw ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatRaw	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr)<br>
</pre>
<p>Write a formatted raw xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextWriterWriteVFormatString"></a>xmlTextWriterWriteVFormatString ()</h3>
<pre class="programlisting">int	xmlTextWriterWriteVFormatString	(<a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a> writer, <br>					 const char * format, <br>					 va_list argptr)<br>
</pre>
<p>Write a formatted xml text.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>writer</tt></i>:</span></td>
<td>the <a href="libxml2-xmlwriter.html#xmlTextWriterPtr">xmlTextWriterPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>format string (see printf)</td>
</tr>
<tr>
<td><span class="term"><i><tt>argptr</tt></i>:</span></td>
<td>pointer to the first member of the variable argument list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the bytes written (may be 0 because of buffering) or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-schematron.html000064400000040360151730335300015014 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>schematron: XML Schematron implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-schemasInternals.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-threads.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">schematron</span></h2>
<p>schematron - XML Schematron implementation</p>
<p>interface to the XML Schematron validity checking. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlSchematron <a href="#xmlSchematron">xmlSchematron</a>;
typedef struct _xmlSchematronParserCtxt <a href="#xmlSchematronParserCtxt">xmlSchematronParserCtxt</a>;
typedef <a href="libxml2-schematron.html#xmlSchematronParserCtxt">xmlSchematronParserCtxt</a> * <a href="#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>;
typedef <a href="libxml2-schematron.html#xmlSchematron">xmlSchematron</a> * <a href="#xmlSchematronPtr">xmlSchematronPtr</a>;
typedef struct _xmlSchematronValidCtxt <a href="#xmlSchematronValidCtxt">xmlSchematronValidCtxt</a>;
typedef <a href="libxml2-schematron.html#xmlSchematronValidCtxt">xmlSchematronValidCtxt</a> * <a href="#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a>;
typedef enum <a href="#xmlSchematronValidOptions">xmlSchematronValidOptions</a>;
void	<a href="#xmlSchematronFree">xmlSchematronFree</a>		(<a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a> schema);
void	<a href="#xmlSchematronFreeParserCtxt">xmlSchematronFreeParserCtxt</a>	(<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a> ctxt);
void	<a href="#xmlSchematronFreeValidCtxt">xmlSchematronFreeValidCtxt</a>	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt);
<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	<a href="#xmlSchematronNewDocParserCtxt">xmlSchematronNewDocParserCtxt</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	<a href="#xmlSchematronNewMemParserCtxt">xmlSchematronNewMemParserCtxt</a>	(const char * buffer, <br>							 int size);
<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	<a href="#xmlSchematronNewParserCtxt">xmlSchematronNewParserCtxt</a>	(const char * URL);
<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a>	<a href="#xmlSchematronNewValidCtxt">xmlSchematronNewValidCtxt</a>	(<a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a> schema, <br>							 int options);
<a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a>	<a href="#xmlSchematronParse">xmlSchematronParse</a>	(<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a> ctxt);
void	<a href="#xmlSchematronSetValidStructuredErrors">xmlSchematronSetValidStructuredErrors</a>	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx);
int	<a href="#xmlSchematronValidateDoc">xmlSchematronValidateDoc</a>	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> instance);
typedef void <a href="#xmlSchematronValidityErrorFunc">xmlSchematronValidityErrorFunc</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef void <a href="#xmlSchematronValidityWarningFunc">xmlSchematronValidityWarningFunc</a>	(void * ctx, <br>						 const char * msg, <br>						 ... ...);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematron">Structure </a>xmlSchematron</h3>
<pre class="programlisting">struct _xmlSchematron {
The content of this structure is not made public by the API.
} xmlSchematron;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronParserCtxt">Structure </a>xmlSchematronParserCtxt</h3>
<pre class="programlisting">struct _xmlSchematronParserCtxt {
The content of this structure is not made public by the API.
} xmlSchematronParserCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronParserCtxtPtr">Typedef </a>xmlSchematronParserCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronParserCtxt">xmlSchematronParserCtxt</a> * xmlSchematronParserCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronPtr">Typedef </a>xmlSchematronPtr</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematron">xmlSchematron</a> * xmlSchematronPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidCtxt">Structure </a>xmlSchematronValidCtxt</h3>
<pre class="programlisting">struct _xmlSchematronValidCtxt {
The content of this structure is not made public by the API.
} xmlSchematronValidCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidCtxtPtr">Typedef </a>xmlSchematronValidCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronValidCtxt">xmlSchematronValidCtxt</a> * xmlSchematronValidCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidOptions">Enum </a>xmlSchematronValidOptions</h3>
<pre class="programlisting">enum <a href="#xmlSchematronValidOptions">xmlSchematronValidOptions</a> {
    <a name="XML_SCHEMATRON_OUT_QUIET">XML_SCHEMATRON_OUT_QUIET</a> = 1 /* quiet no report */
    <a name="XML_SCHEMATRON_OUT_TEXT">XML_SCHEMATRON_OUT_TEXT</a> = 2 /* build a textual report */
    <a name="XML_SCHEMATRON_OUT_XML">XML_SCHEMATRON_OUT_XML</a> = 4 /* output SVRL */
    <a name="XML_SCHEMATRON_OUT_ERROR">XML_SCHEMATRON_OUT_ERROR</a> = 8 /* output via xmlStructuredErrorFunc */
    <a name="XML_SCHEMATRON_OUT_FILE">XML_SCHEMATRON_OUT_FILE</a> = 256 /* output to a file descriptor */
    <a name="XML_SCHEMATRON_OUT_BUFFER">XML_SCHEMATRON_OUT_BUFFER</a> = 512 /* output to a buffer */
    <a name="XML_SCHEMATRON_OUT_IO">XML_SCHEMATRON_OUT_IO</a> = 1024 /*  output to I/O mechanism */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidityErrorFunc"></a>Function type xmlSchematronValidityErrorFunc</h3>
<pre class="programlisting">void	xmlSchematronValidityErrorFunc	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of an error callback from a Schematron validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidityWarningFunc"></a>Function type xmlSchematronValidityWarningFunc</h3>
<pre class="programlisting">void	xmlSchematronValidityWarningFunc	(void * ctx, <br>						 const char * msg, <br>						 ... ...)<br>
</pre>
<p>Signature of a warning callback from a Schematron validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronFree"></a>xmlSchematronFree ()</h3>
<pre class="programlisting">void	xmlSchematronFree		(<a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a> schema)<br>
</pre>
<p>Deallocate a Schematron structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronFreeParserCtxt"></a>xmlSchematronFreeParserCtxt ()</h3>
<pre class="programlisting">void	xmlSchematronFreeParserCtxt	(<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronFreeValidCtxt"></a>xmlSchematronFreeValidCtxt ()</h3>
<pre class="programlisting">void	xmlSchematronFreeValidCtxt	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronNewDocParserCtxt"></a>xmlSchematronNewDocParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	xmlSchematronNewDocParserCtxt	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Create an XML Schematrons parse context for that document. NB. The document may be modified during the parsing process.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a preparsed document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronNewMemParserCtxt"></a>xmlSchematronNewMemParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	xmlSchematronNewMemParserCtxt	(const char * buffer, <br>							 int size)<br>
</pre>
<p>Create an XML Schematrons parse context for that memory buffer expected to contain an XML Schematrons file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array containing the schemas</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronNewParserCtxt"></a>xmlSchematronNewParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a>	xmlSchematronNewParserCtxt	(const char * URL)<br>
</pre>
<p>Create an XML Schematrons parse context for that file/resource expected to contain an XML Schematrons file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the location of the schema</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronNewValidCtxt"></a>xmlSchematronNewValidCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a>	xmlSchematronNewValidCtxt	(<a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a> schema, <br>							 int options)<br>
</pre>
<p>Create an XML Schematrons validation context based on the given schema.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a precompiled XML Schematrons</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of <a href="libxml2-schematron.html#xmlSchematronValidOptions">xmlSchematronValidOptions</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the validation context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronParse"></a>xmlSchematronParse ()</h3>
<pre class="programlisting"><a href="libxml2-schematron.html#xmlSchematronPtr">xmlSchematronPtr</a>	xmlSchematronParse	(<a href="libxml2-schematron.html#xmlSchematronParserCtxtPtr">xmlSchematronParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a schema definition resource and build an internal XML Schema structure which can be used to validate instances.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal XML Schematron structure built from the resource or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronSetValidStructuredErrors"></a>xmlSchematronSetValidStructuredErrors ()</h3>
<pre class="programlisting">void	xmlSchematronSetValidStructuredErrors	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx)<br>
</pre>
<p>Set the structured error callback</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Schematron validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>serror</tt></i>:</span></td>
<td>the structured error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchematronValidateDoc"></a>xmlSchematronValidateDoc ()</h3>
<pre class="programlisting">int	xmlSchematronValidateDoc	(<a href="libxml2-schematron.html#xmlSchematronValidCtxtPtr">xmlSchematronValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> instance)<br>
</pre>
<p>Validate a tree instance against the schematron</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>instance</tt></i>:</span></td>
<td>the document instance tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of internal error and an error count otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xinclude.html000064400000036020151730335300014462 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xinclude: implementation of XInclude</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-valid.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xlink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xinclude</span></h2>
<p>xinclude - implementation of XInclude</p>
<p>API to handle XInclude processing, implements the World Wide Web Consortium Last Call Working Draft 10 November 2003</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XINCLUDE_FALLBACK">XINCLUDE_FALLBACK</a>;
#define <a href="#XINCLUDE_HREF">XINCLUDE_HREF</a>;
#define <a href="#XINCLUDE_NODE">XINCLUDE_NODE</a>;
#define <a href="#XINCLUDE_NS">XINCLUDE_NS</a>;
#define <a href="#XINCLUDE_OLD_NS">XINCLUDE_OLD_NS</a>;
#define <a href="#XINCLUDE_PARSE">XINCLUDE_PARSE</a>;
#define <a href="#XINCLUDE_PARSE_ENCODING">XINCLUDE_PARSE_ENCODING</a>;
#define <a href="#XINCLUDE_PARSE_TEXT">XINCLUDE_PARSE_TEXT</a>;
#define <a href="#XINCLUDE_PARSE_XML">XINCLUDE_PARSE_XML</a>;
#define <a href="#XINCLUDE_PARSE_XPOINTER">XINCLUDE_PARSE_XPOINTER</a>;
typedef struct _xmlXIncludeCtxt <a href="#xmlXIncludeCtxt">xmlXIncludeCtxt</a>;
typedef <a href="libxml2-xinclude.html#xmlXIncludeCtxt">xmlXIncludeCtxt</a> * <a href="#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a>;
void	<a href="#xmlXIncludeFreeContext">xmlXIncludeFreeContext</a>		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt);
<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a>	<a href="#xmlXIncludeNewContext">xmlXIncludeNewContext</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlXIncludeProcess">xmlXIncludeProcess</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlXIncludeProcessFlags">xmlXIncludeProcessFlags</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int flags);
int	<a href="#xmlXIncludeProcessFlagsData">xmlXIncludeProcessFlagsData</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int flags, <br>					 void * data);
int	<a href="#xmlXIncludeProcessNode">xmlXIncludeProcessNode</a>		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlXIncludeProcessTree">xmlXIncludeProcessTree</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree);
int	<a href="#xmlXIncludeProcessTreeFlags">xmlXIncludeProcessTreeFlags</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 int flags);
int	<a href="#xmlXIncludeProcessTreeFlagsData">xmlXIncludeProcessTreeFlagsData</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 int flags, <br>					 void * data);
int	<a href="#xmlXIncludeSetFlags">xmlXIncludeSetFlags</a>		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt, <br>					 int flags);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_FALLBACK">Macro </a>XINCLUDE_FALLBACK</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_FALLBACK">XINCLUDE_FALLBACK</a>;
</pre>
<p>Macro defining "fallback"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_HREF">Macro </a>XINCLUDE_HREF</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_HREF">XINCLUDE_HREF</a>;
</pre>
<p>Macro defining "href"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_NODE">Macro </a>XINCLUDE_NODE</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_NODE">XINCLUDE_NODE</a>;
</pre>
<p>Macro defining "include"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_NS">Macro </a>XINCLUDE_NS</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_NS">XINCLUDE_NS</a>;
</pre>
<p>Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_OLD_NS">Macro </a>XINCLUDE_OLD_NS</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_OLD_NS">XINCLUDE_OLD_NS</a>;
</pre>
<p>Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_PARSE">Macro </a>XINCLUDE_PARSE</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_PARSE">XINCLUDE_PARSE</a>;
</pre>
<p>Macro defining "parse"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_PARSE_ENCODING">Macro </a>XINCLUDE_PARSE_ENCODING</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_PARSE_ENCODING">XINCLUDE_PARSE_ENCODING</a>;
</pre>
<p>Macro defining "encoding"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_PARSE_TEXT">Macro </a>XINCLUDE_PARSE_TEXT</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_PARSE_TEXT">XINCLUDE_PARSE_TEXT</a>;
</pre>
<p>Macro defining "text"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_PARSE_XML">Macro </a>XINCLUDE_PARSE_XML</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_PARSE_XML">XINCLUDE_PARSE_XML</a>;
</pre>
<p>Macro defining "xml"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XINCLUDE_PARSE_XPOINTER">Macro </a>XINCLUDE_PARSE_XPOINTER</h3>
<pre class="programlisting">#define <a href="#XINCLUDE_PARSE_XPOINTER">XINCLUDE_PARSE_XPOINTER</a>;
</pre>
<p>Macro defining "xpointer"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeCtxt">Structure </a>xmlXIncludeCtxt</h3>
<pre class="programlisting">struct _xmlXIncludeCtxt {
The content of this structure is not made public by the API.
} xmlXIncludeCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeCtxtPtr">Typedef </a>xmlXIncludeCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xinclude.html#xmlXIncludeCtxt">xmlXIncludeCtxt</a> * xmlXIncludeCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeFreeContext"></a>xmlXIncludeFreeContext ()</h3>
<pre class="programlisting">void	xmlXIncludeFreeContext		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt)<br>
</pre>
<p>Free an XInclude context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XInclude context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeNewContext"></a>xmlXIncludeNewContext ()</h3>
<pre class="programlisting"><a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a>	xmlXIncludeNewContext	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Creates a new XInclude context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>an XML Document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcess"></a>xmlXIncludeProcess ()</h3>
<pre class="programlisting">int	xmlXIncludeProcess		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Implement the XInclude substitution on the XML document @doc</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessFlags"></a>xmlXIncludeProcessFlags ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessFlags		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int flags)<br>
</pre>
<p>Implement the XInclude substitution on the XML document @doc</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used for parsing XML includes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessFlagsData"></a>xmlXIncludeProcessFlagsData ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessFlagsData	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int flags, <br>					 void * data)<br>
</pre>
<p>Implement the XInclude substitution on the XML document @doc</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used for parsing XML includes</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>application data that will be passed to the parser context in the _private field of the parser context(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessNode"></a>xmlXIncludeProcessNode ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessNode		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Implement the XInclude substitution for the given subtree reusing the information and data coming from the given context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an existing XInclude context</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node in an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessTree"></a>xmlXIncludeProcessTree ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessTree		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree)<br>
</pre>
<p>Implement the XInclude substitution for the given subtree</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>a node in an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessTreeFlags"></a>xmlXIncludeProcessTreeFlags ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessTreeFlags	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 int flags)<br>
</pre>
<p>Implement the XInclude substitution for the given subtree</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>a node in an XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used for parsing XML includes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeProcessTreeFlagsData"></a>xmlXIncludeProcessTreeFlagsData ()</h3>
<pre class="programlisting">int	xmlXIncludeProcessTreeFlagsData	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 int flags, <br>					 void * data)<br>
</pre>
<p>Implement the XInclude substitution on the XML node @tree</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>an XML node</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used for parsing XML includes</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>application data that will be passed to the parser context in the _private field of the parser context(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no substitution were done, -1 if some processing failed or the number of substitutions done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXIncludeSetFlags"></a>xmlXIncludeSetFlags ()</h3>
<pre class="programlisting">int	xmlXIncludeSetFlags		(<a href="libxml2-xinclude.html#xmlXIncludeCtxtPtr">xmlXIncludeCtxtPtr</a> ctxt, <br>					 int flags)<br>
</pre>
<p>Set the flags used for further processing of XML resources.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XInclude processing context</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used for parsing XML includes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlunicode.html000064400000317561151730335310015033 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlunicode: Unicode character APIs</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlstring.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlversion.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlunicode</span></h2>
<p>xmlunicode - Unicode character APIs</p>
<p>API for the Unicode character APIs  This file is automatically generated from the UCS description files of the Unicode Character Database</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">int	<a href="#xmlUCSIsAegeanNumbers">xmlUCSIsAegeanNumbers</a>		(int code);
int	<a href="#xmlUCSIsAlphabeticPresentationForms">xmlUCSIsAlphabeticPresentationForms</a>	(int code);
int	<a href="#xmlUCSIsArabic">xmlUCSIsArabic</a>			(int code);
int	<a href="#xmlUCSIsArabicPresentationFormsA">xmlUCSIsArabicPresentationFormsA</a>	(int code);
int	<a href="#xmlUCSIsArabicPresentationFormsB">xmlUCSIsArabicPresentationFormsB</a>	(int code);
int	<a href="#xmlUCSIsArmenian">xmlUCSIsArmenian</a>		(int code);
int	<a href="#xmlUCSIsArrows">xmlUCSIsArrows</a>			(int code);
int	<a href="#xmlUCSIsBasicLatin">xmlUCSIsBasicLatin</a>		(int code);
int	<a href="#xmlUCSIsBengali">xmlUCSIsBengali</a>			(int code);
int	<a href="#xmlUCSIsBlock">xmlUCSIsBlock</a>			(int code, <br>					 const char * block);
int	<a href="#xmlUCSIsBlockElements">xmlUCSIsBlockElements</a>		(int code);
int	<a href="#xmlUCSIsBopomofo">xmlUCSIsBopomofo</a>		(int code);
int	<a href="#xmlUCSIsBopomofoExtended">xmlUCSIsBopomofoExtended</a>	(int code);
int	<a href="#xmlUCSIsBoxDrawing">xmlUCSIsBoxDrawing</a>		(int code);
int	<a href="#xmlUCSIsBraillePatterns">xmlUCSIsBraillePatterns</a>		(int code);
int	<a href="#xmlUCSIsBuhid">xmlUCSIsBuhid</a>			(int code);
int	<a href="#xmlUCSIsByzantineMusicalSymbols">xmlUCSIsByzantineMusicalSymbols</a>	(int code);
int	<a href="#xmlUCSIsCJKCompatibility">xmlUCSIsCJKCompatibility</a>	(int code);
int	<a href="#xmlUCSIsCJKCompatibilityForms">xmlUCSIsCJKCompatibilityForms</a>	(int code);
int	<a href="#xmlUCSIsCJKCompatibilityIdeographs">xmlUCSIsCJKCompatibilityIdeographs</a>	(int code);
int	<a href="#xmlUCSIsCJKCompatibilityIdeographsSupplement">xmlUCSIsCJKCompatibilityIdeographsSupplement</a>	(int code);
int	<a href="#xmlUCSIsCJKRadicalsSupplement">xmlUCSIsCJKRadicalsSupplement</a>	(int code);
int	<a href="#xmlUCSIsCJKSymbolsandPunctuation">xmlUCSIsCJKSymbolsandPunctuation</a>	(int code);
int	<a href="#xmlUCSIsCJKUnifiedIdeographs">xmlUCSIsCJKUnifiedIdeographs</a>	(int code);
int	<a href="#xmlUCSIsCJKUnifiedIdeographsExtensionA">xmlUCSIsCJKUnifiedIdeographsExtensionA</a>	(int code);
int	<a href="#xmlUCSIsCJKUnifiedIdeographsExtensionB">xmlUCSIsCJKUnifiedIdeographsExtensionB</a>	(int code);
int	<a href="#xmlUCSIsCat">xmlUCSIsCat</a>			(int code, <br>					 const char * cat);
int	<a href="#xmlUCSIsCatC">xmlUCSIsCatC</a>			(int code);
int	<a href="#xmlUCSIsCatCc">xmlUCSIsCatCc</a>			(int code);
int	<a href="#xmlUCSIsCatCf">xmlUCSIsCatCf</a>			(int code);
int	<a href="#xmlUCSIsCatCo">xmlUCSIsCatCo</a>			(int code);
int	<a href="#xmlUCSIsCatCs">xmlUCSIsCatCs</a>			(int code);
int	<a href="#xmlUCSIsCatL">xmlUCSIsCatL</a>			(int code);
int	<a href="#xmlUCSIsCatLl">xmlUCSIsCatLl</a>			(int code);
int	<a href="#xmlUCSIsCatLm">xmlUCSIsCatLm</a>			(int code);
int	<a href="#xmlUCSIsCatLo">xmlUCSIsCatLo</a>			(int code);
int	<a href="#xmlUCSIsCatLt">xmlUCSIsCatLt</a>			(int code);
int	<a href="#xmlUCSIsCatLu">xmlUCSIsCatLu</a>			(int code);
int	<a href="#xmlUCSIsCatM">xmlUCSIsCatM</a>			(int code);
int	<a href="#xmlUCSIsCatMc">xmlUCSIsCatMc</a>			(int code);
int	<a href="#xmlUCSIsCatMe">xmlUCSIsCatMe</a>			(int code);
int	<a href="#xmlUCSIsCatMn">xmlUCSIsCatMn</a>			(int code);
int	<a href="#xmlUCSIsCatN">xmlUCSIsCatN</a>			(int code);
int	<a href="#xmlUCSIsCatNd">xmlUCSIsCatNd</a>			(int code);
int	<a href="#xmlUCSIsCatNl">xmlUCSIsCatNl</a>			(int code);
int	<a href="#xmlUCSIsCatNo">xmlUCSIsCatNo</a>			(int code);
int	<a href="#xmlUCSIsCatP">xmlUCSIsCatP</a>			(int code);
int	<a href="#xmlUCSIsCatPc">xmlUCSIsCatPc</a>			(int code);
int	<a href="#xmlUCSIsCatPd">xmlUCSIsCatPd</a>			(int code);
int	<a href="#xmlUCSIsCatPe">xmlUCSIsCatPe</a>			(int code);
int	<a href="#xmlUCSIsCatPf">xmlUCSIsCatPf</a>			(int code);
int	<a href="#xmlUCSIsCatPi">xmlUCSIsCatPi</a>			(int code);
int	<a href="#xmlUCSIsCatPo">xmlUCSIsCatPo</a>			(int code);
int	<a href="#xmlUCSIsCatPs">xmlUCSIsCatPs</a>			(int code);
int	<a href="#xmlUCSIsCatS">xmlUCSIsCatS</a>			(int code);
int	<a href="#xmlUCSIsCatSc">xmlUCSIsCatSc</a>			(int code);
int	<a href="#xmlUCSIsCatSk">xmlUCSIsCatSk</a>			(int code);
int	<a href="#xmlUCSIsCatSm">xmlUCSIsCatSm</a>			(int code);
int	<a href="#xmlUCSIsCatSo">xmlUCSIsCatSo</a>			(int code);
int	<a href="#xmlUCSIsCatZ">xmlUCSIsCatZ</a>			(int code);
int	<a href="#xmlUCSIsCatZl">xmlUCSIsCatZl</a>			(int code);
int	<a href="#xmlUCSIsCatZp">xmlUCSIsCatZp</a>			(int code);
int	<a href="#xmlUCSIsCatZs">xmlUCSIsCatZs</a>			(int code);
int	<a href="#xmlUCSIsCherokee">xmlUCSIsCherokee</a>		(int code);
int	<a href="#xmlUCSIsCombiningDiacriticalMarks">xmlUCSIsCombiningDiacriticalMarks</a>	(int code);
int	<a href="#xmlUCSIsCombiningDiacriticalMarksforSymbols">xmlUCSIsCombiningDiacriticalMarksforSymbols</a>	(int code);
int	<a href="#xmlUCSIsCombiningHalfMarks">xmlUCSIsCombiningHalfMarks</a>	(int code);
int	<a href="#xmlUCSIsCombiningMarksforSymbols">xmlUCSIsCombiningMarksforSymbols</a>	(int code);
int	<a href="#xmlUCSIsControlPictures">xmlUCSIsControlPictures</a>		(int code);
int	<a href="#xmlUCSIsCurrencySymbols">xmlUCSIsCurrencySymbols</a>		(int code);
int	<a href="#xmlUCSIsCypriotSyllabary">xmlUCSIsCypriotSyllabary</a>	(int code);
int	<a href="#xmlUCSIsCyrillic">xmlUCSIsCyrillic</a>		(int code);
int	<a href="#xmlUCSIsCyrillicSupplement">xmlUCSIsCyrillicSupplement</a>	(int code);
int	<a href="#xmlUCSIsDeseret">xmlUCSIsDeseret</a>			(int code);
int	<a href="#xmlUCSIsDevanagari">xmlUCSIsDevanagari</a>		(int code);
int	<a href="#xmlUCSIsDingbats">xmlUCSIsDingbats</a>		(int code);
int	<a href="#xmlUCSIsEnclosedAlphanumerics">xmlUCSIsEnclosedAlphanumerics</a>	(int code);
int	<a href="#xmlUCSIsEnclosedCJKLettersandMonths">xmlUCSIsEnclosedCJKLettersandMonths</a>	(int code);
int	<a href="#xmlUCSIsEthiopic">xmlUCSIsEthiopic</a>		(int code);
int	<a href="#xmlUCSIsGeneralPunctuation">xmlUCSIsGeneralPunctuation</a>	(int code);
int	<a href="#xmlUCSIsGeometricShapes">xmlUCSIsGeometricShapes</a>		(int code);
int	<a href="#xmlUCSIsGeorgian">xmlUCSIsGeorgian</a>		(int code);
int	<a href="#xmlUCSIsGothic">xmlUCSIsGothic</a>			(int code);
int	<a href="#xmlUCSIsGreek">xmlUCSIsGreek</a>			(int code);
int	<a href="#xmlUCSIsGreekExtended">xmlUCSIsGreekExtended</a>		(int code);
int	<a href="#xmlUCSIsGreekandCoptic">xmlUCSIsGreekandCoptic</a>		(int code);
int	<a href="#xmlUCSIsGujarati">xmlUCSIsGujarati</a>		(int code);
int	<a href="#xmlUCSIsGurmukhi">xmlUCSIsGurmukhi</a>		(int code);
int	<a href="#xmlUCSIsHalfwidthandFullwidthForms">xmlUCSIsHalfwidthandFullwidthForms</a>	(int code);
int	<a href="#xmlUCSIsHangulCompatibilityJamo">xmlUCSIsHangulCompatibilityJamo</a>	(int code);
int	<a href="#xmlUCSIsHangulJamo">xmlUCSIsHangulJamo</a>		(int code);
int	<a href="#xmlUCSIsHangulSyllables">xmlUCSIsHangulSyllables</a>		(int code);
int	<a href="#xmlUCSIsHanunoo">xmlUCSIsHanunoo</a>			(int code);
int	<a href="#xmlUCSIsHebrew">xmlUCSIsHebrew</a>			(int code);
int	<a href="#xmlUCSIsHighPrivateUseSurrogates">xmlUCSIsHighPrivateUseSurrogates</a>	(int code);
int	<a href="#xmlUCSIsHighSurrogates">xmlUCSIsHighSurrogates</a>		(int code);
int	<a href="#xmlUCSIsHiragana">xmlUCSIsHiragana</a>		(int code);
int	<a href="#xmlUCSIsIPAExtensions">xmlUCSIsIPAExtensions</a>		(int code);
int	<a href="#xmlUCSIsIdeographicDescriptionCharacters">xmlUCSIsIdeographicDescriptionCharacters</a>	(int code);
int	<a href="#xmlUCSIsKanbun">xmlUCSIsKanbun</a>			(int code);
int	<a href="#xmlUCSIsKangxiRadicals">xmlUCSIsKangxiRadicals</a>		(int code);
int	<a href="#xmlUCSIsKannada">xmlUCSIsKannada</a>			(int code);
int	<a href="#xmlUCSIsKatakana">xmlUCSIsKatakana</a>		(int code);
int	<a href="#xmlUCSIsKatakanaPhoneticExtensions">xmlUCSIsKatakanaPhoneticExtensions</a>	(int code);
int	<a href="#xmlUCSIsKhmer">xmlUCSIsKhmer</a>			(int code);
int	<a href="#xmlUCSIsKhmerSymbols">xmlUCSIsKhmerSymbols</a>		(int code);
int	<a href="#xmlUCSIsLao">xmlUCSIsLao</a>			(int code);
int	<a href="#xmlUCSIsLatin1Supplement">xmlUCSIsLatin1Supplement</a>	(int code);
int	<a href="#xmlUCSIsLatinExtendedA">xmlUCSIsLatinExtendedA</a>		(int code);
int	<a href="#xmlUCSIsLatinExtendedAdditional">xmlUCSIsLatinExtendedAdditional</a>	(int code);
int	<a href="#xmlUCSIsLatinExtendedB">xmlUCSIsLatinExtendedB</a>		(int code);
int	<a href="#xmlUCSIsLetterlikeSymbols">xmlUCSIsLetterlikeSymbols</a>	(int code);
int	<a href="#xmlUCSIsLimbu">xmlUCSIsLimbu</a>			(int code);
int	<a href="#xmlUCSIsLinearBIdeograms">xmlUCSIsLinearBIdeograms</a>	(int code);
int	<a href="#xmlUCSIsLinearBSyllabary">xmlUCSIsLinearBSyllabary</a>	(int code);
int	<a href="#xmlUCSIsLowSurrogates">xmlUCSIsLowSurrogates</a>		(int code);
int	<a href="#xmlUCSIsMalayalam">xmlUCSIsMalayalam</a>		(int code);
int	<a href="#xmlUCSIsMathematicalAlphanumericSymbols">xmlUCSIsMathematicalAlphanumericSymbols</a>	(int code);
int	<a href="#xmlUCSIsMathematicalOperators">xmlUCSIsMathematicalOperators</a>	(int code);
int	<a href="#xmlUCSIsMiscellaneousMathematicalSymbolsA">xmlUCSIsMiscellaneousMathematicalSymbolsA</a>	(int code);
int	<a href="#xmlUCSIsMiscellaneousMathematicalSymbolsB">xmlUCSIsMiscellaneousMathematicalSymbolsB</a>	(int code);
int	<a href="#xmlUCSIsMiscellaneousSymbols">xmlUCSIsMiscellaneousSymbols</a>	(int code);
int	<a href="#xmlUCSIsMiscellaneousSymbolsandArrows">xmlUCSIsMiscellaneousSymbolsandArrows</a>	(int code);
int	<a href="#xmlUCSIsMiscellaneousTechnical">xmlUCSIsMiscellaneousTechnical</a>	(int code);
int	<a href="#xmlUCSIsMongolian">xmlUCSIsMongolian</a>		(int code);
int	<a href="#xmlUCSIsMusicalSymbols">xmlUCSIsMusicalSymbols</a>		(int code);
int	<a href="#xmlUCSIsMyanmar">xmlUCSIsMyanmar</a>			(int code);
int	<a href="#xmlUCSIsNumberForms">xmlUCSIsNumberForms</a>		(int code);
int	<a href="#xmlUCSIsOgham">xmlUCSIsOgham</a>			(int code);
int	<a href="#xmlUCSIsOldItalic">xmlUCSIsOldItalic</a>		(int code);
int	<a href="#xmlUCSIsOpticalCharacterRecognition">xmlUCSIsOpticalCharacterRecognition</a>	(int code);
int	<a href="#xmlUCSIsOriya">xmlUCSIsOriya</a>			(int code);
int	<a href="#xmlUCSIsOsmanya">xmlUCSIsOsmanya</a>			(int code);
int	<a href="#xmlUCSIsPhoneticExtensions">xmlUCSIsPhoneticExtensions</a>	(int code);
int	<a href="#xmlUCSIsPrivateUse">xmlUCSIsPrivateUse</a>		(int code);
int	<a href="#xmlUCSIsPrivateUseArea">xmlUCSIsPrivateUseArea</a>		(int code);
int	<a href="#xmlUCSIsRunic">xmlUCSIsRunic</a>			(int code);
int	<a href="#xmlUCSIsShavian">xmlUCSIsShavian</a>			(int code);
int	<a href="#xmlUCSIsSinhala">xmlUCSIsSinhala</a>			(int code);
int	<a href="#xmlUCSIsSmallFormVariants">xmlUCSIsSmallFormVariants</a>	(int code);
int	<a href="#xmlUCSIsSpacingModifierLetters">xmlUCSIsSpacingModifierLetters</a>	(int code);
int	<a href="#xmlUCSIsSpecials">xmlUCSIsSpecials</a>		(int code);
int	<a href="#xmlUCSIsSuperscriptsandSubscripts">xmlUCSIsSuperscriptsandSubscripts</a>	(int code);
int	<a href="#xmlUCSIsSupplementalArrowsA">xmlUCSIsSupplementalArrowsA</a>	(int code);
int	<a href="#xmlUCSIsSupplementalArrowsB">xmlUCSIsSupplementalArrowsB</a>	(int code);
int	<a href="#xmlUCSIsSupplementalMathematicalOperators">xmlUCSIsSupplementalMathematicalOperators</a>	(int code);
int	<a href="#xmlUCSIsSupplementaryPrivateUseAreaA">xmlUCSIsSupplementaryPrivateUseAreaA</a>	(int code);
int	<a href="#xmlUCSIsSupplementaryPrivateUseAreaB">xmlUCSIsSupplementaryPrivateUseAreaB</a>	(int code);
int	<a href="#xmlUCSIsSyriac">xmlUCSIsSyriac</a>			(int code);
int	<a href="#xmlUCSIsTagalog">xmlUCSIsTagalog</a>			(int code);
int	<a href="#xmlUCSIsTagbanwa">xmlUCSIsTagbanwa</a>		(int code);
int	<a href="#xmlUCSIsTags">xmlUCSIsTags</a>			(int code);
int	<a href="#xmlUCSIsTaiLe">xmlUCSIsTaiLe</a>			(int code);
int	<a href="#xmlUCSIsTaiXuanJingSymbols">xmlUCSIsTaiXuanJingSymbols</a>	(int code);
int	<a href="#xmlUCSIsTamil">xmlUCSIsTamil</a>			(int code);
int	<a href="#xmlUCSIsTelugu">xmlUCSIsTelugu</a>			(int code);
int	<a href="#xmlUCSIsThaana">xmlUCSIsThaana</a>			(int code);
int	<a href="#xmlUCSIsThai">xmlUCSIsThai</a>			(int code);
int	<a href="#xmlUCSIsTibetan">xmlUCSIsTibetan</a>			(int code);
int	<a href="#xmlUCSIsUgaritic">xmlUCSIsUgaritic</a>		(int code);
int	<a href="#xmlUCSIsUnifiedCanadianAboriginalSyllabics">xmlUCSIsUnifiedCanadianAboriginalSyllabics</a>	(int code);
int	<a href="#xmlUCSIsVariationSelectors">xmlUCSIsVariationSelectors</a>	(int code);
int	<a href="#xmlUCSIsVariationSelectorsSupplement">xmlUCSIsVariationSelectorsSupplement</a>	(int code);
int	<a href="#xmlUCSIsYiRadicals">xmlUCSIsYiRadicals</a>		(int code);
int	<a href="#xmlUCSIsYiSyllables">xmlUCSIsYiSyllables</a>		(int code);
int	<a href="#xmlUCSIsYijingHexagramSymbols">xmlUCSIsYijingHexagramSymbols</a>	(int code);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsAegeanNumbers"></a>xmlUCSIsAegeanNumbers ()</h3>
<pre class="programlisting">int	xmlUCSIsAegeanNumbers		(int code)<br>
</pre>
<p>Check whether the character is part of AegeanNumbers UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsAlphabeticPresentationForms"></a>xmlUCSIsAlphabeticPresentationForms ()</h3>
<pre class="programlisting">int	xmlUCSIsAlphabeticPresentationForms	(int code)<br>
</pre>
<p>Check whether the character is part of AlphabeticPresentationForms UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsArabic"></a>xmlUCSIsArabic ()</h3>
<pre class="programlisting">int	xmlUCSIsArabic			(int code)<br>
</pre>
<p>Check whether the character is part of Arabic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsArabicPresentationFormsA"></a>xmlUCSIsArabicPresentationFormsA ()</h3>
<pre class="programlisting">int	xmlUCSIsArabicPresentationFormsA	(int code)<br>
</pre>
<p>Check whether the character is part of ArabicPresentationForms-A UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsArabicPresentationFormsB"></a>xmlUCSIsArabicPresentationFormsB ()</h3>
<pre class="programlisting">int	xmlUCSIsArabicPresentationFormsB	(int code)<br>
</pre>
<p>Check whether the character is part of ArabicPresentationForms-B UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsArmenian"></a>xmlUCSIsArmenian ()</h3>
<pre class="programlisting">int	xmlUCSIsArmenian		(int code)<br>
</pre>
<p>Check whether the character is part of Armenian UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsArrows"></a>xmlUCSIsArrows ()</h3>
<pre class="programlisting">int	xmlUCSIsArrows			(int code)<br>
</pre>
<p>Check whether the character is part of Arrows UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBasicLatin"></a>xmlUCSIsBasicLatin ()</h3>
<pre class="programlisting">int	xmlUCSIsBasicLatin		(int code)<br>
</pre>
<p>Check whether the character is part of BasicLatin UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBengali"></a>xmlUCSIsBengali ()</h3>
<pre class="programlisting">int	xmlUCSIsBengali			(int code)<br>
</pre>
<p>Check whether the character is part of Bengali UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBlock"></a>xmlUCSIsBlock ()</h3>
<pre class="programlisting">int	xmlUCSIsBlock			(int code, <br>					 const char * block)<br>
</pre>
<p>Check whether the character is part of the UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>block</tt></i>:</span></td>
<td>UCS block name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false and -1 on unknown block</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBlockElements"></a>xmlUCSIsBlockElements ()</h3>
<pre class="programlisting">int	xmlUCSIsBlockElements		(int code)<br>
</pre>
<p>Check whether the character is part of BlockElements UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBopomofo"></a>xmlUCSIsBopomofo ()</h3>
<pre class="programlisting">int	xmlUCSIsBopomofo		(int code)<br>
</pre>
<p>Check whether the character is part of Bopomofo UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBopomofoExtended"></a>xmlUCSIsBopomofoExtended ()</h3>
<pre class="programlisting">int	xmlUCSIsBopomofoExtended	(int code)<br>
</pre>
<p>Check whether the character is part of BopomofoExtended UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBoxDrawing"></a>xmlUCSIsBoxDrawing ()</h3>
<pre class="programlisting">int	xmlUCSIsBoxDrawing		(int code)<br>
</pre>
<p>Check whether the character is part of BoxDrawing UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBraillePatterns"></a>xmlUCSIsBraillePatterns ()</h3>
<pre class="programlisting">int	xmlUCSIsBraillePatterns		(int code)<br>
</pre>
<p>Check whether the character is part of BraillePatterns UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsBuhid"></a>xmlUCSIsBuhid ()</h3>
<pre class="programlisting">int	xmlUCSIsBuhid			(int code)<br>
</pre>
<p>Check whether the character is part of Buhid UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsByzantineMusicalSymbols"></a>xmlUCSIsByzantineMusicalSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsByzantineMusicalSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of ByzantineMusicalSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKCompatibility"></a>xmlUCSIsCJKCompatibility ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKCompatibility	(int code)<br>
</pre>
<p>Check whether the character is part of CJKCompatibility UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKCompatibilityForms"></a>xmlUCSIsCJKCompatibilityForms ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKCompatibilityForms	(int code)<br>
</pre>
<p>Check whether the character is part of CJKCompatibilityForms UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKCompatibilityIdeographs"></a>xmlUCSIsCJKCompatibilityIdeographs ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKCompatibilityIdeographs	(int code)<br>
</pre>
<p>Check whether the character is part of CJKCompatibilityIdeographs UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKCompatibilityIdeographsSupplement"></a>xmlUCSIsCJKCompatibilityIdeographsSupplement ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKCompatibilityIdeographsSupplement	(int code)<br>
</pre>
<p>Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKRadicalsSupplement"></a>xmlUCSIsCJKRadicalsSupplement ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKRadicalsSupplement	(int code)<br>
</pre>
<p>Check whether the character is part of CJKRadicalsSupplement UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKSymbolsandPunctuation"></a>xmlUCSIsCJKSymbolsandPunctuation ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKSymbolsandPunctuation	(int code)<br>
</pre>
<p>Check whether the character is part of CJKSymbolsandPunctuation UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKUnifiedIdeographs"></a>xmlUCSIsCJKUnifiedIdeographs ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKUnifiedIdeographs	(int code)<br>
</pre>
<p>Check whether the character is part of CJKUnifiedIdeographs UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKUnifiedIdeographsExtensionA"></a>xmlUCSIsCJKUnifiedIdeographsExtensionA ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKUnifiedIdeographsExtensionA	(int code)<br>
</pre>
<p>Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCJKUnifiedIdeographsExtensionB"></a>xmlUCSIsCJKUnifiedIdeographsExtensionB ()</h3>
<pre class="programlisting">int	xmlUCSIsCJKUnifiedIdeographsExtensionB	(int code)<br>
</pre>
<p>Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCat"></a>xmlUCSIsCat ()</h3>
<pre class="programlisting">int	xmlUCSIsCat			(int code, <br>					 const char * cat)<br>
</pre>
<p>Check whether the character is part of the UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>cat</tt></i>:</span></td>
<td>UCS Category name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false and -1 on unknown category</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatC"></a>xmlUCSIsCatC ()</h3>
<pre class="programlisting">int	xmlUCSIsCatC			(int code)<br>
</pre>
<p>Check whether the character is part of C UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatCc"></a>xmlUCSIsCatCc ()</h3>
<pre class="programlisting">int	xmlUCSIsCatCc			(int code)<br>
</pre>
<p>Check whether the character is part of Cc UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatCf"></a>xmlUCSIsCatCf ()</h3>
<pre class="programlisting">int	xmlUCSIsCatCf			(int code)<br>
</pre>
<p>Check whether the character is part of Cf UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatCo"></a>xmlUCSIsCatCo ()</h3>
<pre class="programlisting">int	xmlUCSIsCatCo			(int code)<br>
</pre>
<p>Check whether the character is part of Co UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatCs"></a>xmlUCSIsCatCs ()</h3>
<pre class="programlisting">int	xmlUCSIsCatCs			(int code)<br>
</pre>
<p>Check whether the character is part of Cs UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatL"></a>xmlUCSIsCatL ()</h3>
<pre class="programlisting">int	xmlUCSIsCatL			(int code)<br>
</pre>
<p>Check whether the character is part of L UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatLl"></a>xmlUCSIsCatLl ()</h3>
<pre class="programlisting">int	xmlUCSIsCatLl			(int code)<br>
</pre>
<p>Check whether the character is part of Ll UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatLm"></a>xmlUCSIsCatLm ()</h3>
<pre class="programlisting">int	xmlUCSIsCatLm			(int code)<br>
</pre>
<p>Check whether the character is part of Lm UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatLo"></a>xmlUCSIsCatLo ()</h3>
<pre class="programlisting">int	xmlUCSIsCatLo			(int code)<br>
</pre>
<p>Check whether the character is part of Lo UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatLt"></a>xmlUCSIsCatLt ()</h3>
<pre class="programlisting">int	xmlUCSIsCatLt			(int code)<br>
</pre>
<p>Check whether the character is part of Lt UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatLu"></a>xmlUCSIsCatLu ()</h3>
<pre class="programlisting">int	xmlUCSIsCatLu			(int code)<br>
</pre>
<p>Check whether the character is part of Lu UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatM"></a>xmlUCSIsCatM ()</h3>
<pre class="programlisting">int	xmlUCSIsCatM			(int code)<br>
</pre>
<p>Check whether the character is part of M UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatMc"></a>xmlUCSIsCatMc ()</h3>
<pre class="programlisting">int	xmlUCSIsCatMc			(int code)<br>
</pre>
<p>Check whether the character is part of Mc UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatMe"></a>xmlUCSIsCatMe ()</h3>
<pre class="programlisting">int	xmlUCSIsCatMe			(int code)<br>
</pre>
<p>Check whether the character is part of Me UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatMn"></a>xmlUCSIsCatMn ()</h3>
<pre class="programlisting">int	xmlUCSIsCatMn			(int code)<br>
</pre>
<p>Check whether the character is part of Mn UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatN"></a>xmlUCSIsCatN ()</h3>
<pre class="programlisting">int	xmlUCSIsCatN			(int code)<br>
</pre>
<p>Check whether the character is part of N UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatNd"></a>xmlUCSIsCatNd ()</h3>
<pre class="programlisting">int	xmlUCSIsCatNd			(int code)<br>
</pre>
<p>Check whether the character is part of Nd UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatNl"></a>xmlUCSIsCatNl ()</h3>
<pre class="programlisting">int	xmlUCSIsCatNl			(int code)<br>
</pre>
<p>Check whether the character is part of Nl UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatNo"></a>xmlUCSIsCatNo ()</h3>
<pre class="programlisting">int	xmlUCSIsCatNo			(int code)<br>
</pre>
<p>Check whether the character is part of No UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatP"></a>xmlUCSIsCatP ()</h3>
<pre class="programlisting">int	xmlUCSIsCatP			(int code)<br>
</pre>
<p>Check whether the character is part of P UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPc"></a>xmlUCSIsCatPc ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPc			(int code)<br>
</pre>
<p>Check whether the character is part of Pc UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPd"></a>xmlUCSIsCatPd ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPd			(int code)<br>
</pre>
<p>Check whether the character is part of Pd UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPe"></a>xmlUCSIsCatPe ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPe			(int code)<br>
</pre>
<p>Check whether the character is part of Pe UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPf"></a>xmlUCSIsCatPf ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPf			(int code)<br>
</pre>
<p>Check whether the character is part of Pf UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPi"></a>xmlUCSIsCatPi ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPi			(int code)<br>
</pre>
<p>Check whether the character is part of Pi UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPo"></a>xmlUCSIsCatPo ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPo			(int code)<br>
</pre>
<p>Check whether the character is part of Po UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatPs"></a>xmlUCSIsCatPs ()</h3>
<pre class="programlisting">int	xmlUCSIsCatPs			(int code)<br>
</pre>
<p>Check whether the character is part of Ps UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatS"></a>xmlUCSIsCatS ()</h3>
<pre class="programlisting">int	xmlUCSIsCatS			(int code)<br>
</pre>
<p>Check whether the character is part of S UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatSc"></a>xmlUCSIsCatSc ()</h3>
<pre class="programlisting">int	xmlUCSIsCatSc			(int code)<br>
</pre>
<p>Check whether the character is part of Sc UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatSk"></a>xmlUCSIsCatSk ()</h3>
<pre class="programlisting">int	xmlUCSIsCatSk			(int code)<br>
</pre>
<p>Check whether the character is part of Sk UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatSm"></a>xmlUCSIsCatSm ()</h3>
<pre class="programlisting">int	xmlUCSIsCatSm			(int code)<br>
</pre>
<p>Check whether the character is part of Sm UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatSo"></a>xmlUCSIsCatSo ()</h3>
<pre class="programlisting">int	xmlUCSIsCatSo			(int code)<br>
</pre>
<p>Check whether the character is part of So UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatZ"></a>xmlUCSIsCatZ ()</h3>
<pre class="programlisting">int	xmlUCSIsCatZ			(int code)<br>
</pre>
<p>Check whether the character is part of Z UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatZl"></a>xmlUCSIsCatZl ()</h3>
<pre class="programlisting">int	xmlUCSIsCatZl			(int code)<br>
</pre>
<p>Check whether the character is part of Zl UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatZp"></a>xmlUCSIsCatZp ()</h3>
<pre class="programlisting">int	xmlUCSIsCatZp			(int code)<br>
</pre>
<p>Check whether the character is part of Zp UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCatZs"></a>xmlUCSIsCatZs ()</h3>
<pre class="programlisting">int	xmlUCSIsCatZs			(int code)<br>
</pre>
<p>Check whether the character is part of Zs UCS Category</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCherokee"></a>xmlUCSIsCherokee ()</h3>
<pre class="programlisting">int	xmlUCSIsCherokee		(int code)<br>
</pre>
<p>Check whether the character is part of Cherokee UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCombiningDiacriticalMarks"></a>xmlUCSIsCombiningDiacriticalMarks ()</h3>
<pre class="programlisting">int	xmlUCSIsCombiningDiacriticalMarks	(int code)<br>
</pre>
<p>Check whether the character is part of CombiningDiacriticalMarks UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCombiningDiacriticalMarksforSymbols"></a>xmlUCSIsCombiningDiacriticalMarksforSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsCombiningDiacriticalMarksforSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCombiningHalfMarks"></a>xmlUCSIsCombiningHalfMarks ()</h3>
<pre class="programlisting">int	xmlUCSIsCombiningHalfMarks	(int code)<br>
</pre>
<p>Check whether the character is part of CombiningHalfMarks UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCombiningMarksforSymbols"></a>xmlUCSIsCombiningMarksforSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsCombiningMarksforSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of CombiningMarksforSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsControlPictures"></a>xmlUCSIsControlPictures ()</h3>
<pre class="programlisting">int	xmlUCSIsControlPictures		(int code)<br>
</pre>
<p>Check whether the character is part of ControlPictures UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCurrencySymbols"></a>xmlUCSIsCurrencySymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsCurrencySymbols		(int code)<br>
</pre>
<p>Check whether the character is part of CurrencySymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCypriotSyllabary"></a>xmlUCSIsCypriotSyllabary ()</h3>
<pre class="programlisting">int	xmlUCSIsCypriotSyllabary	(int code)<br>
</pre>
<p>Check whether the character is part of CypriotSyllabary UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCyrillic"></a>xmlUCSIsCyrillic ()</h3>
<pre class="programlisting">int	xmlUCSIsCyrillic		(int code)<br>
</pre>
<p>Check whether the character is part of Cyrillic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsCyrillicSupplement"></a>xmlUCSIsCyrillicSupplement ()</h3>
<pre class="programlisting">int	xmlUCSIsCyrillicSupplement	(int code)<br>
</pre>
<p>Check whether the character is part of CyrillicSupplement UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsDeseret"></a>xmlUCSIsDeseret ()</h3>
<pre class="programlisting">int	xmlUCSIsDeseret			(int code)<br>
</pre>
<p>Check whether the character is part of Deseret UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsDevanagari"></a>xmlUCSIsDevanagari ()</h3>
<pre class="programlisting">int	xmlUCSIsDevanagari		(int code)<br>
</pre>
<p>Check whether the character is part of Devanagari UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsDingbats"></a>xmlUCSIsDingbats ()</h3>
<pre class="programlisting">int	xmlUCSIsDingbats		(int code)<br>
</pre>
<p>Check whether the character is part of Dingbats UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsEnclosedAlphanumerics"></a>xmlUCSIsEnclosedAlphanumerics ()</h3>
<pre class="programlisting">int	xmlUCSIsEnclosedAlphanumerics	(int code)<br>
</pre>
<p>Check whether the character is part of EnclosedAlphanumerics UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsEnclosedCJKLettersandMonths"></a>xmlUCSIsEnclosedCJKLettersandMonths ()</h3>
<pre class="programlisting">int	xmlUCSIsEnclosedCJKLettersandMonths	(int code)<br>
</pre>
<p>Check whether the character is part of EnclosedCJKLettersandMonths UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsEthiopic"></a>xmlUCSIsEthiopic ()</h3>
<pre class="programlisting">int	xmlUCSIsEthiopic		(int code)<br>
</pre>
<p>Check whether the character is part of Ethiopic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGeneralPunctuation"></a>xmlUCSIsGeneralPunctuation ()</h3>
<pre class="programlisting">int	xmlUCSIsGeneralPunctuation	(int code)<br>
</pre>
<p>Check whether the character is part of GeneralPunctuation UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGeometricShapes"></a>xmlUCSIsGeometricShapes ()</h3>
<pre class="programlisting">int	xmlUCSIsGeometricShapes		(int code)<br>
</pre>
<p>Check whether the character is part of GeometricShapes UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGeorgian"></a>xmlUCSIsGeorgian ()</h3>
<pre class="programlisting">int	xmlUCSIsGeorgian		(int code)<br>
</pre>
<p>Check whether the character is part of Georgian UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGothic"></a>xmlUCSIsGothic ()</h3>
<pre class="programlisting">int	xmlUCSIsGothic			(int code)<br>
</pre>
<p>Check whether the character is part of Gothic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGreek"></a>xmlUCSIsGreek ()</h3>
<pre class="programlisting">int	xmlUCSIsGreek			(int code)<br>
</pre>
<p>Check whether the character is part of Greek UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGreekExtended"></a>xmlUCSIsGreekExtended ()</h3>
<pre class="programlisting">int	xmlUCSIsGreekExtended		(int code)<br>
</pre>
<p>Check whether the character is part of GreekExtended UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGreekandCoptic"></a>xmlUCSIsGreekandCoptic ()</h3>
<pre class="programlisting">int	xmlUCSIsGreekandCoptic		(int code)<br>
</pre>
<p>Check whether the character is part of GreekandCoptic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGujarati"></a>xmlUCSIsGujarati ()</h3>
<pre class="programlisting">int	xmlUCSIsGujarati		(int code)<br>
</pre>
<p>Check whether the character is part of Gujarati UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsGurmukhi"></a>xmlUCSIsGurmukhi ()</h3>
<pre class="programlisting">int	xmlUCSIsGurmukhi		(int code)<br>
</pre>
<p>Check whether the character is part of Gurmukhi UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHalfwidthandFullwidthForms"></a>xmlUCSIsHalfwidthandFullwidthForms ()</h3>
<pre class="programlisting">int	xmlUCSIsHalfwidthandFullwidthForms	(int code)<br>
</pre>
<p>Check whether the character is part of HalfwidthandFullwidthForms UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHangulCompatibilityJamo"></a>xmlUCSIsHangulCompatibilityJamo ()</h3>
<pre class="programlisting">int	xmlUCSIsHangulCompatibilityJamo	(int code)<br>
</pre>
<p>Check whether the character is part of HangulCompatibilityJamo UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHangulJamo"></a>xmlUCSIsHangulJamo ()</h3>
<pre class="programlisting">int	xmlUCSIsHangulJamo		(int code)<br>
</pre>
<p>Check whether the character is part of HangulJamo UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHangulSyllables"></a>xmlUCSIsHangulSyllables ()</h3>
<pre class="programlisting">int	xmlUCSIsHangulSyllables		(int code)<br>
</pre>
<p>Check whether the character is part of HangulSyllables UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHanunoo"></a>xmlUCSIsHanunoo ()</h3>
<pre class="programlisting">int	xmlUCSIsHanunoo			(int code)<br>
</pre>
<p>Check whether the character is part of Hanunoo UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHebrew"></a>xmlUCSIsHebrew ()</h3>
<pre class="programlisting">int	xmlUCSIsHebrew			(int code)<br>
</pre>
<p>Check whether the character is part of Hebrew UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHighPrivateUseSurrogates"></a>xmlUCSIsHighPrivateUseSurrogates ()</h3>
<pre class="programlisting">int	xmlUCSIsHighPrivateUseSurrogates	(int code)<br>
</pre>
<p>Check whether the character is part of HighPrivateUseSurrogates UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHighSurrogates"></a>xmlUCSIsHighSurrogates ()</h3>
<pre class="programlisting">int	xmlUCSIsHighSurrogates		(int code)<br>
</pre>
<p>Check whether the character is part of HighSurrogates UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsHiragana"></a>xmlUCSIsHiragana ()</h3>
<pre class="programlisting">int	xmlUCSIsHiragana		(int code)<br>
</pre>
<p>Check whether the character is part of Hiragana UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsIPAExtensions"></a>xmlUCSIsIPAExtensions ()</h3>
<pre class="programlisting">int	xmlUCSIsIPAExtensions		(int code)<br>
</pre>
<p>Check whether the character is part of IPAExtensions UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsIdeographicDescriptionCharacters"></a>xmlUCSIsIdeographicDescriptionCharacters ()</h3>
<pre class="programlisting">int	xmlUCSIsIdeographicDescriptionCharacters	(int code)<br>
</pre>
<p>Check whether the character is part of IdeographicDescriptionCharacters UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKanbun"></a>xmlUCSIsKanbun ()</h3>
<pre class="programlisting">int	xmlUCSIsKanbun			(int code)<br>
</pre>
<p>Check whether the character is part of Kanbun UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKangxiRadicals"></a>xmlUCSIsKangxiRadicals ()</h3>
<pre class="programlisting">int	xmlUCSIsKangxiRadicals		(int code)<br>
</pre>
<p>Check whether the character is part of KangxiRadicals UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKannada"></a>xmlUCSIsKannada ()</h3>
<pre class="programlisting">int	xmlUCSIsKannada			(int code)<br>
</pre>
<p>Check whether the character is part of Kannada UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKatakana"></a>xmlUCSIsKatakana ()</h3>
<pre class="programlisting">int	xmlUCSIsKatakana		(int code)<br>
</pre>
<p>Check whether the character is part of Katakana UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKatakanaPhoneticExtensions"></a>xmlUCSIsKatakanaPhoneticExtensions ()</h3>
<pre class="programlisting">int	xmlUCSIsKatakanaPhoneticExtensions	(int code)<br>
</pre>
<p>Check whether the character is part of KatakanaPhoneticExtensions UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKhmer"></a>xmlUCSIsKhmer ()</h3>
<pre class="programlisting">int	xmlUCSIsKhmer			(int code)<br>
</pre>
<p>Check whether the character is part of Khmer UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsKhmerSymbols"></a>xmlUCSIsKhmerSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsKhmerSymbols		(int code)<br>
</pre>
<p>Check whether the character is part of KhmerSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLao"></a>xmlUCSIsLao ()</h3>
<pre class="programlisting">int	xmlUCSIsLao			(int code)<br>
</pre>
<p>Check whether the character is part of Lao UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLatin1Supplement"></a>xmlUCSIsLatin1Supplement ()</h3>
<pre class="programlisting">int	xmlUCSIsLatin1Supplement	(int code)<br>
</pre>
<p>Check whether the character is part of Latin-1Supplement UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLatinExtendedA"></a>xmlUCSIsLatinExtendedA ()</h3>
<pre class="programlisting">int	xmlUCSIsLatinExtendedA		(int code)<br>
</pre>
<p>Check whether the character is part of LatinExtended-A UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLatinExtendedAdditional"></a>xmlUCSIsLatinExtendedAdditional ()</h3>
<pre class="programlisting">int	xmlUCSIsLatinExtendedAdditional	(int code)<br>
</pre>
<p>Check whether the character is part of LatinExtendedAdditional UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLatinExtendedB"></a>xmlUCSIsLatinExtendedB ()</h3>
<pre class="programlisting">int	xmlUCSIsLatinExtendedB		(int code)<br>
</pre>
<p>Check whether the character is part of LatinExtended-B UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLetterlikeSymbols"></a>xmlUCSIsLetterlikeSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsLetterlikeSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of LetterlikeSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLimbu"></a>xmlUCSIsLimbu ()</h3>
<pre class="programlisting">int	xmlUCSIsLimbu			(int code)<br>
</pre>
<p>Check whether the character is part of Limbu UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLinearBIdeograms"></a>xmlUCSIsLinearBIdeograms ()</h3>
<pre class="programlisting">int	xmlUCSIsLinearBIdeograms	(int code)<br>
</pre>
<p>Check whether the character is part of LinearBIdeograms UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLinearBSyllabary"></a>xmlUCSIsLinearBSyllabary ()</h3>
<pre class="programlisting">int	xmlUCSIsLinearBSyllabary	(int code)<br>
</pre>
<p>Check whether the character is part of LinearBSyllabary UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsLowSurrogates"></a>xmlUCSIsLowSurrogates ()</h3>
<pre class="programlisting">int	xmlUCSIsLowSurrogates		(int code)<br>
</pre>
<p>Check whether the character is part of LowSurrogates UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMalayalam"></a>xmlUCSIsMalayalam ()</h3>
<pre class="programlisting">int	xmlUCSIsMalayalam		(int code)<br>
</pre>
<p>Check whether the character is part of Malayalam UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMathematicalAlphanumericSymbols"></a>xmlUCSIsMathematicalAlphanumericSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsMathematicalAlphanumericSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of MathematicalAlphanumericSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMathematicalOperators"></a>xmlUCSIsMathematicalOperators ()</h3>
<pre class="programlisting">int	xmlUCSIsMathematicalOperators	(int code)<br>
</pre>
<p>Check whether the character is part of MathematicalOperators UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMiscellaneousMathematicalSymbolsA"></a>xmlUCSIsMiscellaneousMathematicalSymbolsA ()</h3>
<pre class="programlisting">int	xmlUCSIsMiscellaneousMathematicalSymbolsA	(int code)<br>
</pre>
<p>Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMiscellaneousMathematicalSymbolsB"></a>xmlUCSIsMiscellaneousMathematicalSymbolsB ()</h3>
<pre class="programlisting">int	xmlUCSIsMiscellaneousMathematicalSymbolsB	(int code)<br>
</pre>
<p>Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMiscellaneousSymbols"></a>xmlUCSIsMiscellaneousSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsMiscellaneousSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of MiscellaneousSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMiscellaneousSymbolsandArrows"></a>xmlUCSIsMiscellaneousSymbolsandArrows ()</h3>
<pre class="programlisting">int	xmlUCSIsMiscellaneousSymbolsandArrows	(int code)<br>
</pre>
<p>Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMiscellaneousTechnical"></a>xmlUCSIsMiscellaneousTechnical ()</h3>
<pre class="programlisting">int	xmlUCSIsMiscellaneousTechnical	(int code)<br>
</pre>
<p>Check whether the character is part of MiscellaneousTechnical UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMongolian"></a>xmlUCSIsMongolian ()</h3>
<pre class="programlisting">int	xmlUCSIsMongolian		(int code)<br>
</pre>
<p>Check whether the character is part of Mongolian UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMusicalSymbols"></a>xmlUCSIsMusicalSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsMusicalSymbols		(int code)<br>
</pre>
<p>Check whether the character is part of MusicalSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsMyanmar"></a>xmlUCSIsMyanmar ()</h3>
<pre class="programlisting">int	xmlUCSIsMyanmar			(int code)<br>
</pre>
<p>Check whether the character is part of Myanmar UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsNumberForms"></a>xmlUCSIsNumberForms ()</h3>
<pre class="programlisting">int	xmlUCSIsNumberForms		(int code)<br>
</pre>
<p>Check whether the character is part of NumberForms UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsOgham"></a>xmlUCSIsOgham ()</h3>
<pre class="programlisting">int	xmlUCSIsOgham			(int code)<br>
</pre>
<p>Check whether the character is part of Ogham UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsOldItalic"></a>xmlUCSIsOldItalic ()</h3>
<pre class="programlisting">int	xmlUCSIsOldItalic		(int code)<br>
</pre>
<p>Check whether the character is part of OldItalic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsOpticalCharacterRecognition"></a>xmlUCSIsOpticalCharacterRecognition ()</h3>
<pre class="programlisting">int	xmlUCSIsOpticalCharacterRecognition	(int code)<br>
</pre>
<p>Check whether the character is part of OpticalCharacterRecognition UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsOriya"></a>xmlUCSIsOriya ()</h3>
<pre class="programlisting">int	xmlUCSIsOriya			(int code)<br>
</pre>
<p>Check whether the character is part of Oriya UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsOsmanya"></a>xmlUCSIsOsmanya ()</h3>
<pre class="programlisting">int	xmlUCSIsOsmanya			(int code)<br>
</pre>
<p>Check whether the character is part of Osmanya UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsPhoneticExtensions"></a>xmlUCSIsPhoneticExtensions ()</h3>
<pre class="programlisting">int	xmlUCSIsPhoneticExtensions	(int code)<br>
</pre>
<p>Check whether the character is part of PhoneticExtensions UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsPrivateUse"></a>xmlUCSIsPrivateUse ()</h3>
<pre class="programlisting">int	xmlUCSIsPrivateUse		(int code)<br>
</pre>
<p>Check whether the character is part of PrivateUse UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsPrivateUseArea"></a>xmlUCSIsPrivateUseArea ()</h3>
<pre class="programlisting">int	xmlUCSIsPrivateUseArea		(int code)<br>
</pre>
<p>Check whether the character is part of PrivateUseArea UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsRunic"></a>xmlUCSIsRunic ()</h3>
<pre class="programlisting">int	xmlUCSIsRunic			(int code)<br>
</pre>
<p>Check whether the character is part of Runic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsShavian"></a>xmlUCSIsShavian ()</h3>
<pre class="programlisting">int	xmlUCSIsShavian			(int code)<br>
</pre>
<p>Check whether the character is part of Shavian UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSinhala"></a>xmlUCSIsSinhala ()</h3>
<pre class="programlisting">int	xmlUCSIsSinhala			(int code)<br>
</pre>
<p>Check whether the character is part of Sinhala UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSmallFormVariants"></a>xmlUCSIsSmallFormVariants ()</h3>
<pre class="programlisting">int	xmlUCSIsSmallFormVariants	(int code)<br>
</pre>
<p>Check whether the character is part of SmallFormVariants UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSpacingModifierLetters"></a>xmlUCSIsSpacingModifierLetters ()</h3>
<pre class="programlisting">int	xmlUCSIsSpacingModifierLetters	(int code)<br>
</pre>
<p>Check whether the character is part of SpacingModifierLetters UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSpecials"></a>xmlUCSIsSpecials ()</h3>
<pre class="programlisting">int	xmlUCSIsSpecials		(int code)<br>
</pre>
<p>Check whether the character is part of Specials UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSuperscriptsandSubscripts"></a>xmlUCSIsSuperscriptsandSubscripts ()</h3>
<pre class="programlisting">int	xmlUCSIsSuperscriptsandSubscripts	(int code)<br>
</pre>
<p>Check whether the character is part of SuperscriptsandSubscripts UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSupplementalArrowsA"></a>xmlUCSIsSupplementalArrowsA ()</h3>
<pre class="programlisting">int	xmlUCSIsSupplementalArrowsA	(int code)<br>
</pre>
<p>Check whether the character is part of SupplementalArrows-A UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSupplementalArrowsB"></a>xmlUCSIsSupplementalArrowsB ()</h3>
<pre class="programlisting">int	xmlUCSIsSupplementalArrowsB	(int code)<br>
</pre>
<p>Check whether the character is part of SupplementalArrows-B UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSupplementalMathematicalOperators"></a>xmlUCSIsSupplementalMathematicalOperators ()</h3>
<pre class="programlisting">int	xmlUCSIsSupplementalMathematicalOperators	(int code)<br>
</pre>
<p>Check whether the character is part of SupplementalMathematicalOperators UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSupplementaryPrivateUseAreaA"></a>xmlUCSIsSupplementaryPrivateUseAreaA ()</h3>
<pre class="programlisting">int	xmlUCSIsSupplementaryPrivateUseAreaA	(int code)<br>
</pre>
<p>Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSupplementaryPrivateUseAreaB"></a>xmlUCSIsSupplementaryPrivateUseAreaB ()</h3>
<pre class="programlisting">int	xmlUCSIsSupplementaryPrivateUseAreaB	(int code)<br>
</pre>
<p>Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsSyriac"></a>xmlUCSIsSyriac ()</h3>
<pre class="programlisting">int	xmlUCSIsSyriac			(int code)<br>
</pre>
<p>Check whether the character is part of Syriac UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTagalog"></a>xmlUCSIsTagalog ()</h3>
<pre class="programlisting">int	xmlUCSIsTagalog			(int code)<br>
</pre>
<p>Check whether the character is part of Tagalog UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTagbanwa"></a>xmlUCSIsTagbanwa ()</h3>
<pre class="programlisting">int	xmlUCSIsTagbanwa		(int code)<br>
</pre>
<p>Check whether the character is part of Tagbanwa UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTags"></a>xmlUCSIsTags ()</h3>
<pre class="programlisting">int	xmlUCSIsTags			(int code)<br>
</pre>
<p>Check whether the character is part of Tags UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTaiLe"></a>xmlUCSIsTaiLe ()</h3>
<pre class="programlisting">int	xmlUCSIsTaiLe			(int code)<br>
</pre>
<p>Check whether the character is part of TaiLe UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTaiXuanJingSymbols"></a>xmlUCSIsTaiXuanJingSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsTaiXuanJingSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of TaiXuanJingSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTamil"></a>xmlUCSIsTamil ()</h3>
<pre class="programlisting">int	xmlUCSIsTamil			(int code)<br>
</pre>
<p>Check whether the character is part of Tamil UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTelugu"></a>xmlUCSIsTelugu ()</h3>
<pre class="programlisting">int	xmlUCSIsTelugu			(int code)<br>
</pre>
<p>Check whether the character is part of Telugu UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsThaana"></a>xmlUCSIsThaana ()</h3>
<pre class="programlisting">int	xmlUCSIsThaana			(int code)<br>
</pre>
<p>Check whether the character is part of Thaana UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsThai"></a>xmlUCSIsThai ()</h3>
<pre class="programlisting">int	xmlUCSIsThai			(int code)<br>
</pre>
<p>Check whether the character is part of Thai UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsTibetan"></a>xmlUCSIsTibetan ()</h3>
<pre class="programlisting">int	xmlUCSIsTibetan			(int code)<br>
</pre>
<p>Check whether the character is part of Tibetan UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsUgaritic"></a>xmlUCSIsUgaritic ()</h3>
<pre class="programlisting">int	xmlUCSIsUgaritic		(int code)<br>
</pre>
<p>Check whether the character is part of Ugaritic UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsUnifiedCanadianAboriginalSyllabics"></a>xmlUCSIsUnifiedCanadianAboriginalSyllabics ()</h3>
<pre class="programlisting">int	xmlUCSIsUnifiedCanadianAboriginalSyllabics	(int code)<br>
</pre>
<p>Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsVariationSelectors"></a>xmlUCSIsVariationSelectors ()</h3>
<pre class="programlisting">int	xmlUCSIsVariationSelectors	(int code)<br>
</pre>
<p>Check whether the character is part of VariationSelectors UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsVariationSelectorsSupplement"></a>xmlUCSIsVariationSelectorsSupplement ()</h3>
<pre class="programlisting">int	xmlUCSIsVariationSelectorsSupplement	(int code)<br>
</pre>
<p>Check whether the character is part of VariationSelectorsSupplement UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsYiRadicals"></a>xmlUCSIsYiRadicals ()</h3>
<pre class="programlisting">int	xmlUCSIsYiRadicals		(int code)<br>
</pre>
<p>Check whether the character is part of YiRadicals UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsYiSyllables"></a>xmlUCSIsYiSyllables ()</h3>
<pre class="programlisting">int	xmlUCSIsYiSyllables		(int code)<br>
</pre>
<p>Check whether the character is part of YiSyllables UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUCSIsYijingHexagramSymbols"></a>xmlUCSIsYijingHexagramSymbols ()</h3>
<pre class="programlisting">int	xmlUCSIsYijingHexagramSymbols	(int code)<br>
</pre>
<p>Check whether the character is part of YijingHexagramSymbols UCS Block</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>code</tt></i>:</span></td>
<td>UCS code point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xpathInternals.html000064400000432167151730335310015670 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xpathInternals: internal interfaces for XML Path Language implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xpath.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xpointer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xpathInternals</span></h2>
<p>xpathInternals - internal interfaces for XML Path Language implementation</p>
<p>internal interfaces for XML Path Language implementation used to build new modules on top of XPath like XPointer and XSLT </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#CAST_TO_BOOLEAN">CAST_TO_BOOLEAN</a>;
#define <a href="#CAST_TO_NUMBER">CAST_TO_NUMBER</a>;
#define <a href="#CAST_TO_STRING">CAST_TO_STRING</a>;
#define <a href="#CHECK_ARITY">CHECK_ARITY</a>(x);
#define <a href="#CHECK_ERROR">CHECK_ERROR</a>;
#define <a href="#CHECK_ERROR0">CHECK_ERROR0</a>;
#define <a href="#CHECK_TYPE">CHECK_TYPE</a>(typeval);
#define <a href="#CHECK_TYPE0">CHECK_TYPE0</a>(typeval);
#define <a href="#XP_ERROR">XP_ERROR</a>(X);
#define <a href="#XP_ERROR0">XP_ERROR0</a>(X);
#define <a href="#xmlXPathCheckError">xmlXPathCheckError</a>(ctxt);
#define <a href="#xmlXPathEmptyNodeSet">xmlXPathEmptyNodeSet</a>(ns);
#define <a href="#xmlXPathGetContextNode">xmlXPathGetContextNode</a>(ctxt);
#define <a href="#xmlXPathGetDocument">xmlXPathGetDocument</a>(ctxt);
#define <a href="#xmlXPathGetError">xmlXPathGetError</a>(ctxt);
#define <a href="#xmlXPathReturnBoolean">xmlXPathReturnBoolean</a>(ctxt, val);
#define <a href="#xmlXPathReturnEmptyNodeSet">xmlXPathReturnEmptyNodeSet</a>(ctxt);
#define <a href="#xmlXPathReturnEmptyString">xmlXPathReturnEmptyString</a>(ctxt);
#define <a href="#xmlXPathReturnExternal">xmlXPathReturnExternal</a>(ctxt, val);
#define <a href="#xmlXPathReturnFalse">xmlXPathReturnFalse</a>(ctxt);
#define <a href="#xmlXPathReturnNodeSet">xmlXPathReturnNodeSet</a>(ctxt, ns);
#define <a href="#xmlXPathReturnNumber">xmlXPathReturnNumber</a>(ctxt, val);
#define <a href="#xmlXPathReturnString">xmlXPathReturnString</a>(ctxt, str);
#define <a href="#xmlXPathReturnTrue">xmlXPathReturnTrue</a>(ctxt);
#define <a href="#xmlXPathSetArityError">xmlXPathSetArityError</a>(ctxt);
#define <a href="#xmlXPathSetError">xmlXPathSetError</a>(ctxt, err);
#define <a href="#xmlXPathSetTypeError">xmlXPathSetTypeError</a>(ctxt);
#define <a href="#xmlXPathStackIsExternal">xmlXPathStackIsExternal</a>(ctxt);
#define <a href="#xmlXPathStackIsNodeSet">xmlXPathStackIsNodeSet</a>(ctxt);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#valuePop">valuePop</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
int	<a href="#valuePush">valuePush</a>			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value);
void	<a href="#xmlXPathAddValues">xmlXPathAddValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathBooleanFunction">xmlXPathBooleanFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathCeilingFunction">xmlXPathCeilingFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
int	<a href="#xmlXPathCompareValues">xmlXPathCompareValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int inf, <br>					 int strict);
void	<a href="#xmlXPathConcatFunction">xmlXPathConcatFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathContainsFunction">xmlXPathContainsFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathCountFunction">xmlXPathCountFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathDebugDumpCompExpr">xmlXPathDebugDumpCompExpr</a>	(FILE * output, <br>					 <a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>					 int depth);
void	<a href="#xmlXPathDebugDumpObject">xmlXPathDebugDumpObject</a>		(FILE * output, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> cur, <br>					 int depth);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathDifference">xmlXPathDifference</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathDistinct">xmlXPathDistinct</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathDistinctSorted">xmlXPathDistinctSorted</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes);
void	<a href="#xmlXPathDivValues">xmlXPathDivValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
int	<a href="#xmlXPathEqualValues">xmlXPathEqualValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathErr">xmlXPathErr</a>			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int error);
void	<a href="#xmlXPathEvalExpr">xmlXPathEvalExpr</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
int	<a href="#xmlXPathEvaluatePredicateResult">xmlXPathEvaluatePredicateResult</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> res);
void	<a href="#xmlXPathFalseFunction">xmlXPathFalseFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathFloorFunction">xmlXPathFloorFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathFreeParserContext">xmlXPathFreeParserContext</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
<a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a>	<a href="#xmlXPathFunctionLookup">xmlXPathFunctionLookup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a>	<a href="#xmlXPathFunctionLookupNS">xmlXPathFunctionLookupNS</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri);
int	<a href="#xmlXPathHasSameNodes">xmlXPathHasSameNodes</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
void	<a href="#xmlXPathIdFunction">xmlXPathIdFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathIntersection">xmlXPathIntersection</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
int	<a href="#xmlXPathIsNodeType">xmlXPathIsNodeType</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlXPathLangFunction">xmlXPathLangFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathLastFunction">xmlXPathLastFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathLeading">xmlXPathLeading</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathLeadingSorted">xmlXPathLeadingSorted</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
void	<a href="#xmlXPathLocalNameFunction">xmlXPathLocalNameFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathModValues">xmlXPathModValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathMultValues">xmlXPathMultValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathNamespaceURIFunction">xmlXPathNamespaceURIFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewBoolean">xmlXPathNewBoolean</a>	(int val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewCString">xmlXPathNewCString</a>	(const char * val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewFloat">xmlXPathNewFloat</a>	(double val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewNodeSet">xmlXPathNewNodeSet</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewNodeSetList">xmlXPathNewNodeSetList</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val);
<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a>	<a href="#xmlXPathNewParserContext">xmlXPathNewParserContext</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>							 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewString">xmlXPathNewString</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNewValueTree">xmlXPathNewValueTree</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextAncestor">xmlXPathNextAncestor</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextAncestorOrSelf">xmlXPathNextAncestorOrSelf</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextAttribute">xmlXPathNextAttribute</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextChild">xmlXPathNextChild</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextDescendant">xmlXPathNextDescendant</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextDescendantOrSelf">xmlXPathNextDescendantOrSelf</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextFollowing">xmlXPathNextFollowing</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextFollowingSibling">xmlXPathNextFollowingSibling</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextNamespace">xmlXPathNextNamespace</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextParent">xmlXPathNextParent</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextPreceding">xmlXPathNextPreceding</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextPrecedingSibling">xmlXPathNextPrecedingSibling</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPathNextSelf">xmlXPathNextSelf</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeLeading">xmlXPathNodeLeading</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeLeadingSorted">xmlXPathNodeLeadingSorted</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlXPathNodeSetAdd">xmlXPathNodeSetAdd</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
int	<a href="#xmlXPathNodeSetAddNs">xmlXPathNodeSetAddNs</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns);
int	<a href="#xmlXPathNodeSetAddUnique">xmlXPathNodeSetAddUnique</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
int	<a href="#xmlXPathNodeSetContains">xmlXPathNodeSetContains</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
void	<a href="#xmlXPathNodeSetDel">xmlXPathNodeSetDel</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
void	<a href="#xmlXPathNodeSetFreeNs">xmlXPathNodeSetFreeNs</a>		(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeSetMerge">xmlXPathNodeSetMerge</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val2);
void	<a href="#xmlXPathNodeSetRemove">xmlXPathNodeSetRemove</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 int val);
void	<a href="#xmlXPathNodeSetSort">xmlXPathNodeSetSort</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> set);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeTrailing">xmlXPathNodeTrailing</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeTrailingSorted">xmlXPathNodeTrailingSorted</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlXPathNormalizeFunction">xmlXPathNormalizeFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
int	<a href="#xmlXPathNotEqualValues">xmlXPathNotEqualValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathNotFunction">xmlXPathNotFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathNsLookup">xmlXPathNsLookup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
void	<a href="#xmlXPathNumberFunction">xmlXPathNumberFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathParseNCName">xmlXPathParseNCName</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathParseName">xmlXPathParseName</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
int	<a href="#xmlXPathPopBoolean">xmlXPathPopBoolean</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void *	<a href="#xmlXPathPopExternal">xmlXPathPopExternal</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathPopNodeSet">xmlXPathPopNodeSet</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
double	<a href="#xmlXPathPopNumber">xmlXPathPopNumber</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathPopString">xmlXPathPopString</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathPositionFunction">xmlXPathPositionFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathRegisterAllFunctions">xmlXPathRegisterAllFunctions</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
int	<a href="#xmlXPathRegisterFunc">xmlXPathRegisterFunc</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> f);
void	<a href="#xmlXPathRegisterFuncLookup">xmlXPathRegisterFuncLookup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathFuncLookupFunc">xmlXPathFuncLookupFunc</a> f, <br>					 void * funcCtxt);
int	<a href="#xmlXPathRegisterFuncNS">xmlXPathRegisterFuncNS</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri, <br>					 <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> f);
int	<a href="#xmlXPathRegisterNs">xmlXPathRegisterNs</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri);
int	<a href="#xmlXPathRegisterVariable">xmlXPathRegisterVariable</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value);
void	<a href="#xmlXPathRegisterVariableLookup">xmlXPathRegisterVariableLookup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathVariableLookupFunc">xmlXPathVariableLookupFunc</a> f, <br>					 void * data);
int	<a href="#xmlXPathRegisterVariableNS">xmlXPathRegisterVariableNS</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value);
void	<a href="#xmlXPathRegisteredFuncsCleanup">xmlXPathRegisteredFuncsCleanup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
void	<a href="#xmlXPathRegisteredNsCleanup">xmlXPathRegisteredNsCleanup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
void	<a href="#xmlXPathRegisteredVariablesCleanup">xmlXPathRegisteredVariablesCleanup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
void	<a href="#xmlXPathRoot">xmlXPathRoot</a>			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathRoundFunction">xmlXPathRoundFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathStartsWithFunction">xmlXPathStartsWithFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
double	<a href="#xmlXPathStringEvalNumber">xmlXPathStringEvalNumber</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
void	<a href="#xmlXPathStringFunction">xmlXPathStringFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathStringLengthFunction">xmlXPathStringLengthFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathSubValues">xmlXPathSubValues</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPathSubstringAfterFunction">xmlXPathSubstringAfterFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathSubstringBeforeFunction">xmlXPathSubstringBeforeFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathSubstringFunction">xmlXPathSubstringFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathSumFunction">xmlXPathSumFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathTrailing">xmlXPathTrailing</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathTrailingSorted">xmlXPathTrailingSorted</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2);
void	<a href="#xmlXPathTranslateFunction">xmlXPathTranslateFunction</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathTrueFunction">xmlXPathTrueFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathValueFlipSign">xmlXPathValueFlipSign</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathVariableLookup">xmlXPathVariableLookup</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathVariableLookupNS">xmlXPathVariableLookupNS</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathWrapCString">xmlXPathWrapCString</a>	(char * val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathWrapExternal">xmlXPathWrapExternal</a>	(void * val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathWrapNodeSet">xmlXPathWrapNodeSet</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathWrapString">xmlXPathWrapString</a>	(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
void	<a href="#xmlXPatherror">xmlXPatherror</a>			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 const char * file, <br>					 int line, <br>					 int no);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="CAST_TO_BOOLEAN">Macro </a>CAST_TO_BOOLEAN</h3>
<pre class="programlisting">#define <a href="#CAST_TO_BOOLEAN">CAST_TO_BOOLEAN</a>;
</pre>
<p>Macro to try to cast the value on the top of the XPath stack to a boolean.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CAST_TO_NUMBER">Macro </a>CAST_TO_NUMBER</h3>
<pre class="programlisting">#define <a href="#CAST_TO_NUMBER">CAST_TO_NUMBER</a>;
</pre>
<p>Macro to try to cast the value on the top of the XPath stack to a number.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CAST_TO_STRING">Macro </a>CAST_TO_STRING</h3>
<pre class="programlisting">#define <a href="#CAST_TO_STRING">CAST_TO_STRING</a>;
</pre>
<p>Macro to try to cast the value on the top of the XPath stack to a string.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CHECK_ARITY">Macro </a>CHECK_ARITY</h3>
<pre class="programlisting">#define <a href="#CHECK_ARITY">CHECK_ARITY</a>(x);
</pre>
<p>Macro to check that the number of args passed to an XPath function matches.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>x</tt></i>:</span></td>
<td>the number of expected args</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CHECK_ERROR">Macro </a>CHECK_ERROR</h3>
<pre class="programlisting">#define <a href="#CHECK_ERROR">CHECK_ERROR</a>;
</pre>
<p>Macro to return from the function if an XPath error was detected.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CHECK_ERROR0">Macro </a>CHECK_ERROR0</h3>
<pre class="programlisting">#define <a href="#CHECK_ERROR0">CHECK_ERROR0</a>;
</pre>
<p>Macro to return 0 from the function if an XPath error was detected.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CHECK_TYPE">Macro </a>CHECK_TYPE</h3>
<pre class="programlisting">#define <a href="#CHECK_TYPE">CHECK_TYPE</a>(typeval);
</pre>
<p>Macro to check that the value on top of the XPath stack is of a given type.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>typeval</tt></i>:</span></td>
<td>the XPath type</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="CHECK_TYPE0">Macro </a>CHECK_TYPE0</h3>
<pre class="programlisting">#define <a href="#CHECK_TYPE0">CHECK_TYPE0</a>(typeval);
</pre>
<p>Macro to check that the value on top of the XPath stack is of a given type. Return(0) in case of failure</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>typeval</tt></i>:</span></td>
<td>the XPath type</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XP_ERROR">Macro </a>XP_ERROR</h3>
<pre class="programlisting">#define <a href="#XP_ERROR">XP_ERROR</a>(X);
</pre>
<p>Macro to raise an XPath error and return.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>X</tt></i>:</span></td>
<td>the error code</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XP_ERROR0">Macro </a>XP_ERROR0</h3>
<pre class="programlisting">#define <a href="#XP_ERROR0">XP_ERROR0</a>(X);
</pre>
<p>Macro to raise an XPath error and return 0.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>X</tt></i>:</span></td>
<td>the error code</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCheckError">Macro </a>xmlXPathCheckError</h3>
<pre class="programlisting">#define <a href="#xmlXPathCheckError">xmlXPathCheckError</a>(ctxt);
</pre>
<p>Check if an XPath error was raised. Returns true if an error has been raised, false otherwise.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEmptyNodeSet">Macro </a>xmlXPathEmptyNodeSet</h3>
<pre class="programlisting">#define <a href="#xmlXPathEmptyNodeSet">xmlXPathEmptyNodeSet</a>(ns);
</pre>
<p>Empties a node-set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathGetContextNode">Macro </a>xmlXPathGetContextNode</h3>
<pre class="programlisting">#define <a href="#xmlXPathGetContextNode">xmlXPathGetContextNode</a>(ctxt);
</pre>
<p>Get the context node of an XPath context. Returns the context node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathGetDocument">Macro </a>xmlXPathGetDocument</h3>
<pre class="programlisting">#define <a href="#xmlXPathGetDocument">xmlXPathGetDocument</a>(ctxt);
</pre>
<p>Get the document of an XPath context. Returns the context document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathGetError">Macro </a>xmlXPathGetError</h3>
<pre class="programlisting">#define <a href="#xmlXPathGetError">xmlXPathGetError</a>(ctxt);
</pre>
<p>Get the error code of an XPath context. Returns the context error.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnBoolean">Macro </a>xmlXPathReturnBoolean</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnBoolean">xmlXPathReturnBoolean</a>(ctxt, val);
</pre>
<p>Pushes the boolean @val on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a boolean</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnEmptyNodeSet">Macro </a>xmlXPathReturnEmptyNodeSet</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnEmptyNodeSet">xmlXPathReturnEmptyNodeSet</a>(ctxt);
</pre>
<p>Pushes an empty node-set on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnEmptyString">Macro </a>xmlXPathReturnEmptyString</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnEmptyString">xmlXPathReturnEmptyString</a>(ctxt);
</pre>
<p>Pushes an empty string on the stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnExternal">Macro </a>xmlXPathReturnExternal</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnExternal">xmlXPathReturnExternal</a>(ctxt, val);
</pre>
<p>Pushes user data on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>user data</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnFalse">Macro </a>xmlXPathReturnFalse</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnFalse">xmlXPathReturnFalse</a>(ctxt);
</pre>
<p>Pushes false on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnNodeSet">Macro </a>xmlXPathReturnNodeSet</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnNodeSet">xmlXPathReturnNodeSet</a>(ctxt, ns);
</pre>
<p>Pushes the node-set @ns on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnNumber">Macro </a>xmlXPathReturnNumber</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnNumber">xmlXPathReturnNumber</a>(ctxt, val);
</pre>
<p>Pushes the double @val on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a double</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnString">Macro </a>xmlXPathReturnString</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnString">xmlXPathReturnString</a>(ctxt, str);
</pre>
<p>Pushes the string @str on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>a string</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathReturnTrue">Macro </a>xmlXPathReturnTrue</h3>
<pre class="programlisting">#define <a href="#xmlXPathReturnTrue">xmlXPathReturnTrue</a>(ctxt);
</pre>
<p>Pushes true on the context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSetArityError">Macro </a>xmlXPathSetArityError</h3>
<pre class="programlisting">#define <a href="#xmlXPathSetArityError">xmlXPathSetArityError</a>(ctxt);
</pre>
<p>Raises an <a href="libxml2-xpath.html#XPATH_INVALID_ARITY">XPATH_INVALID_ARITY</a> error.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSetError">Macro </a>xmlXPathSetError</h3>
<pre class="programlisting">#define <a href="#xmlXPathSetError">xmlXPathSetError</a>(ctxt, err);
</pre>
<p>Raises an error.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>an <a href="libxml2-xpath.html#xmlXPathError">xmlXPathError</a> code</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSetTypeError">Macro </a>xmlXPathSetTypeError</h3>
<pre class="programlisting">#define <a href="#xmlXPathSetTypeError">xmlXPathSetTypeError</a>(ctxt);
</pre>
<p>Raises an <a href="libxml2-xpath.html#XPATH_INVALID_TYPE">XPATH_INVALID_TYPE</a> error.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStackIsExternal">Macro </a>xmlXPathStackIsExternal</h3>
<pre class="programlisting">#define <a href="#xmlXPathStackIsExternal">xmlXPathStackIsExternal</a>(ctxt);
</pre>
<p>Checks if the current value on the XPath stack is an external object. Returns true if the current object on the stack is an external object.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStackIsNodeSet">Macro </a>xmlXPathStackIsNodeSet</h3>
<pre class="programlisting">#define <a href="#xmlXPathStackIsNodeSet">xmlXPathStackIsNodeSet</a>(ctxt);
</pre>
<p>Check if the current value on the XPath stack is a node set or an XSLT value tree. Returns true if the current object on the stack is a node-set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="valuePop"></a>valuePop ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	valuePop	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops the top XPath object from the value stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath evaluation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the XPath object just removed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="valuePush"></a>valuePush ()</h3>
<pre class="programlisting">int	valuePush			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value)<br>
</pre>
<p>Pushes a new XPath object on top of the value stack. If value is NULL, a memory error is recorded in the parser context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath evaluation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of items on the value stack, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathAddValues"></a>xmlXPathAddValues ()</h3>
<pre class="programlisting">void	xmlXPathAddValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the add operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathBooleanFunction"></a>xmlXPathBooleanFunction ()</h3>
<pre class="programlisting">void	xmlXPathBooleanFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the boolean() XPath function boolean boolean(object) The boolean function converts its argument to a boolean as follows: - a number is true if and only if it is neither positive or negative zero nor NaN - a node-set is true if and only if it is non-empty - a string is true if and only if its length is non-zero</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCeilingFunction"></a>xmlXPathCeilingFunction ()</h3>
<pre class="programlisting">void	xmlXPathCeilingFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the ceiling() XPath function number ceiling(number) The ceiling function returns the smallest (closest to negative infinity) number that is not less than the argument and that is an integer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompareValues"></a>xmlXPathCompareValues ()</h3>
<pre class="programlisting">int	xmlXPathCompareValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int inf, <br>					 int strict)<br>
</pre>
<p>Implement the compare operation on XPath objects: @arg1 &lt; @arg2 (1, 1, ... @arg1 &lt;= @arg2 (1, 0, ... @arg1 &gt; @arg2 (0, 1, ... @arg1 &gt;= @arg2 (0, 0, ... When neither object to be compared is a node-set and the operator is &lt;=, &lt;, &gt;=, &gt;, then the objects are compared by converted both objects to numbers and comparing the numbers according to IEEE 754. The &lt; comparison will be true if and only if the first number is less than the second number. The &lt;= comparison will be true if and only if the first number is less than or equal to the second number. The &gt; comparison will be true if and only if the first number is greater than the second number. The &gt;= comparison will be true if and only if the first number is greater than or equal to the second number.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>inf</tt></i>:</span></td>
<td>less than (1) or greater than (0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>strict</tt></i>:</span></td>
<td>is the comparison strict</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the comparison succeeded, 0 if it failed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathConcatFunction"></a>xmlXPathConcatFunction ()</h3>
<pre class="programlisting">void	xmlXPathConcatFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the concat() XPath function string concat(string, string, string*) The concat function returns the concatenation of its arguments.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathContainsFunction"></a>xmlXPathContainsFunction ()</h3>
<pre class="programlisting">void	xmlXPathContainsFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the contains() XPath function boolean contains(string, string) The contains function returns true if the first argument string contains the second argument string, and otherwise returns false.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCountFunction"></a>xmlXPathCountFunction ()</h3>
<pre class="programlisting">void	xmlXPathCountFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the count() XPath function number count(node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDebugDumpCompExpr"></a>xmlXPathDebugDumpCompExpr ()</h3>
<pre class="programlisting">void	xmlXPathDebugDumpCompExpr	(FILE * output, <br>					 <a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>					 int depth)<br>
</pre>
<p>Dumps the tree of the compiled XPath expression.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDebugDumpObject"></a>xmlXPathDebugDumpObject ()</h3>
<pre class="programlisting">void	xmlXPathDebugDumpObject		(FILE * output, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> cur, <br>					 int depth)<br>
</pre>
<p>Dump the content of the object for debugging purposes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * to dump the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the object to inspect</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>indentation level</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDifference"></a>xmlXPathDifference ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathDifference	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets difference() function: node-set set:difference (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the difference between the two node sets, or nodes1 if nodes2 is empty</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDistinct"></a>xmlXPathDistinct ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathDistinct	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes)<br>
</pre>
<p>Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set) @nodes is sorted by document order, then #exslSetsDistinctSorted is called with the sorted node-set</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a subset of the nodes contained in @nodes, or @nodes if it is empty</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDistinctSorted"></a>xmlXPathDistinctSorted ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathDistinctSorted	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes)<br>
</pre>
<p>Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a subset of the nodes contained in @nodes, or @nodes if it is empty</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathDivValues"></a>xmlXPathDivValues ()</h3>
<pre class="programlisting">void	xmlXPathDivValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the div operation on XPath objects @arg1 / @arg2: The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEqualValues"></a>xmlXPathEqualValues ()</h3>
<pre class="programlisting">int	xmlXPathEqualValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the equal operation on XPath objects content: @arg1 == @arg2</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or 1 depending on the results of the test.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathErr"></a>xmlXPathErr ()</h3>
<pre class="programlisting">void	xmlXPathErr			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int error)<br>
</pre>
<p>Handle an XPath error</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>error</tt></i>:</span></td>
<td>the error code</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEvalExpr"></a>xmlXPathEvalExpr ()</h3>
<pre class="programlisting">void	xmlXPathEvalExpr		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Parse and evaluate an XPath expression in the given context, then push the result on the context stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEvaluatePredicateResult"></a>xmlXPathEvaluatePredicateResult ()</h3>
<pre class="programlisting">int	xmlXPathEvaluatePredicateResult	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> res)<br>
</pre>
<p>Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>res</tt></i>:</span></td>
<td>the Predicate Expression evaluation result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if predicate is true, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFalseFunction"></a>xmlXPathFalseFunction ()</h3>
<pre class="programlisting">void	xmlXPathFalseFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the false() XPath function boolean false()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFloorFunction"></a>xmlXPathFloorFunction ()</h3>
<pre class="programlisting">void	xmlXPathFloorFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the floor() XPath function number floor(number) The floor function returns the largest (closest to positive infinity) number that is not greater than the argument and that is an integer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeParserContext"></a>xmlXPathFreeParserContext ()</h3>
<pre class="programlisting">void	xmlXPathFreeParserContext	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Free up an <a href="libxml2-xpath.html#xmlXPathParserContext">xmlXPathParserContext</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the context to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFunctionLookup"></a>xmlXPathFunctionLookup ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a>	xmlXPathFunctionLookup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search in the Function array of the context for the given function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the function name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFunctionLookupNS"></a>xmlXPathFunctionLookupNS ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a>	xmlXPathFunctionLookupNS	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri)<br>
</pre>
<p>Search in the Function array of the context for the given function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the function name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the function namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathHasSameNodes"></a>xmlXPathHasSameNodes ()</h3>
<pre class="programlisting">int	xmlXPathHasSameNodes		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets has-same-nodes function: boolean set:has-same-node(node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true (1) if @nodes1 shares any node with @nodes2, false (0) otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathIdFunction"></a>xmlXPathIdFunction ()</h3>
<pre class="programlisting">void	xmlXPathIdFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the id() XPath function node-set id(object) The id function selects elements by their unique ID (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, then the result is the union of the result of applying id to the string value of each of the nodes in the argument node-set. When the argument to id is of any other type, the argument is converted to a string as if by a call to the string function; the string is split into a whitespace-separated list of tokens (whitespace is any sequence of <a href="libxml2-SAX.html#characters">characters</a> matching the production S); the result is a node-set containing the elements in the same document as the context node that have a unique ID equal to any of the tokens in the list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathIntersection"></a>xmlXPathIntersection ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathIntersection	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets intersection() function: node-set set:intersection (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a node set comprising the nodes that are within both the node sets passed as arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathIsNodeType"></a>xmlXPathIsNodeType ()</h3>
<pre class="programlisting">int	xmlXPathIsNodeType		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Is the name given a NodeType one. [38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>a name string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathLangFunction"></a>xmlXPathLangFunction ()</h3>
<pre class="programlisting">void	xmlXPathLangFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the lang() XPath function boolean lang(string) The lang function returns true or false depending on whether the language of the context node as specified by xml:lang attributes is the same as or is a sublanguage of the language specified by the argument string. The language of the context node is determined by the value of the xml:lang <a href="libxml2-SAX.html#attribute">attribute</a> on the context node, or, if the context node has no xml:lang attribute, by the value of the xml:lang <a href="libxml2-SAX.html#attribute">attribute</a> on the nearest ancestor of the context node that has an xml:lang attribute. If there is no such attribute, then lang</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathLastFunction"></a>xmlXPathLastFunction ()</h3>
<pre class="programlisting">void	xmlXPathLastFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the last() XPath function number last() The last function returns the number of nodes in the context node list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathLeading"></a>xmlXPathLeading ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathLeading		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #exslSetsLeadingSorted is called.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathLeadingSorted"></a>xmlXPathLeadingSorted ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathLeadingSorted	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathLocalNameFunction"></a>xmlXPathLocalNameFunction ()</h3>
<pre class="programlisting">void	xmlXPathLocalNameFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the local-name() XPath function string local-name(node-set?) The local-name function returns a string containing the local part of the name of the node in the argument node-set that is first in document order. If the node-set is empty or the first node has no name, an empty string is returned. If the argument is omitted it defaults to the context node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathModValues"></a>xmlXPathModValues ()</h3>
<pre class="programlisting">void	xmlXPathModValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the mod operation on XPath objects: @arg1 / @arg2 The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathMultValues"></a>xmlXPathMultValues ()</h3>
<pre class="programlisting">void	xmlXPathMultValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the multiply operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNamespaceURIFunction"></a>xmlXPathNamespaceURIFunction ()</h3>
<pre class="programlisting">void	xmlXPathNamespaceURIFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the namespace-uri() XPath function string namespace-uri(node-set?) The namespace-uri function returns a string containing the namespace URI of the expanded name of the node in the argument node-set that is first in document order. If the node-set is empty, the first node has no name, or the expanded name has no namespace URI, an empty string is returned. If the argument is omitted it defaults to the context node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewBoolean"></a>xmlXPathNewBoolean ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewBoolean	(int val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type boolean and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the boolean value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewCString"></a>xmlXPathNewCString ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewCString	(const char * val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type string and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the char * value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewFloat"></a>xmlXPathNewFloat ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewFloat	(double val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type double and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the double value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewNodeSet"></a>xmlXPathNewNodeSet ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewNodeSet	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type NodeSet and initialize it with the single Node @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the NodePtr value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewNodeSetList"></a>xmlXPathNewNodeSetList ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewNodeSetList	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type NodeSet and initialize it with the Nodeset @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an existing NodeSet</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewParserContext"></a>xmlXPathNewParserContext ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a>	xmlXPathNewParserContext	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>							 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathParserContext">xmlXPathParserContext</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathParserContext">xmlXPathParserContext</a> just allocated.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewString"></a>xmlXPathNewString ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewString	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type string and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewValueTree"></a>xmlXPathNewValueTree ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNewValueTree	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type Value Tree (XSLT) and initialize it with the tree root @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the NodePtr value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextAncestor"></a>xmlXPathNextAncestor ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextAncestor	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "ancestor" direction the ancestor axis contains the ancestors of the context node; the ancestors of the context node consist of the parent of context node and the parent's parent and so on; the nodes are ordered in reverse document order; thus the parent is the first node on the axis, and the parent's parent is the second node on the axis</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextAncestorOrSelf"></a>xmlXPathNextAncestorOrSelf ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextAncestorOrSelf	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "ancestor-or-self" direction he ancestor-or-self axis contains the context node and ancestors of the context node in reverse document order; thus the context node is the first node on the axis, and the context node's parent the second; parent here is defined the same as with the parent axis.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextAttribute"></a>xmlXPathNextAttribute ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextAttribute	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "attribute" direction TODO: support DTD inherited default attributes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current <a href="libxml2-SAX.html#attribute">attribute</a> in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextChild"></a>xmlXPathNextChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextChild	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "child" direction The child axis contains the children of the context node in document order.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextDescendant"></a>xmlXPathNextDescendant ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextDescendant	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "descendant" direction the descendant axis contains the descendants of the context node in document order; a descendant is a child or a child of a child and so on.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextDescendantOrSelf"></a>xmlXPathNextDescendantOrSelf ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextDescendantOrSelf	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "descendant-or-self" direction the descendant-or-self axis contains the context node and the descendants of the context node in document order; thus the context node is the first node on the axis, and the first child of the context node is the second node on the axis</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextFollowing"></a>xmlXPathNextFollowing ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextFollowing	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "following" direction The following axis contains all nodes in the same document as the context node that are after the context node in document order, excluding any descendants and excluding <a href="libxml2-SAX.html#attribute">attribute</a> nodes and namespace nodes; the nodes are ordered in document order</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextFollowingSibling"></a>xmlXPathNextFollowingSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextFollowingSibling	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "following-sibling" direction The following-sibling axis contains the following siblings of the context node in document order.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextNamespace"></a>xmlXPathNextNamespace ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextNamespace	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "namespace" direction the namespace axis contains the namespace nodes of the context node; the order of nodes on this axis is implementation-defined; the axis will be empty unless the context node is an element We keep the XML namespace node at the end of the list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current <a href="libxml2-SAX.html#attribute">attribute</a> in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextParent"></a>xmlXPathNextParent ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextParent	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "parent" direction The parent axis contains the parent of the context node, if there is one.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextPreceding"></a>xmlXPathNextPreceding ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextPreceding	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "preceding" direction the preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding <a href="libxml2-SAX.html#attribute">attribute</a> nodes and namespace nodes; the nodes are ordered in reverse document order</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextPrecedingSibling"></a>xmlXPathNextPrecedingSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextPrecedingSibling	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "preceding-sibling" direction The preceding-sibling axis contains the preceding siblings of the context node in reverse document order; the first preceding sibling is first on the axis; the sibling preceding that node is the second on the axis and so on.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNextSelf"></a>xmlXPathNextSelf ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPathNextSelf	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Traversal function for the "self" direction The self axis contains just the context node itself</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node in the traversal</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element following that axis</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeLeading"></a>xmlXPathNodeLeading ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeLeading	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes is sorted by document order, then #exslSetsNodeLeadingSorted is called.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeLeadingSorted"></a>xmlXPathNodeLeadingSorted ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeLeadingSorted	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetAdd"></a>xmlXPathNodeSetAdd ()</h3>
<pre class="programlisting">int	xmlXPathNodeSetAdd		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>add a new <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> to an existing NodeSet</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a new <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetAddNs"></a>xmlXPathNodeSetAddNs ()</h3>
<pre class="programlisting">int	xmlXPathNodeSetAddNs		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns)<br>
</pre>
<p>add a new namespace node to an existing NodeSet</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the hosting node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a the namespace node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetAddUnique"></a>xmlXPathNodeSetAddUnique ()</h3>
<pre class="programlisting">int	xmlXPathNodeSetAddUnique	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>add a new <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> to an existing NodeSet, optimized version when we are sure the node is not already in the set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a new <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetContains"></a>xmlXPathNodeSetContains ()</h3>
<pre class="programlisting">int	xmlXPathNodeSetContains		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>checks whether @cur contains @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true (1) if @cur contains @val, false (0) otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetDel"></a>xmlXPathNodeSetDel ()</h3>
<pre class="programlisting">void	xmlXPathNodeSetDel		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>Removes an <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> from an existing NodeSet</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetFreeNs"></a>xmlXPathNodeSetFreeNs ()</h3>
<pre class="programlisting">void	xmlXPathNodeSetFreeNs		(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns)<br>
</pre>
<p>Namespace nodes in libxml don't match the XPath semantic. In a node set the namespace nodes are duplicated and the next pointer is set to the parent node in the XPath semantic. Check if such a node needs to be freed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the XPath namespace node found in a nodeset.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetMerge"></a>xmlXPathNodeSetMerge ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeSetMerge	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val2)<br>
</pre>
<p>Merges two nodesets, all nodes from @val2 are added to @val1 if @val1 is NULL, a new set is created and copied from @val2</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val1</tt></i>:</span></td>
<td>the first NodeSet or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>val2</tt></i>:</span></td>
<td>the second NodeSet</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>@val1 once extended or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetRemove"></a>xmlXPathNodeSetRemove ()</h3>
<pre class="programlisting">void	xmlXPathNodeSetRemove		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> cur, <br>					 int val)<br>
</pre>
<p>Removes an entry from an existing NodeSet list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the index to remove</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetSort"></a>xmlXPathNodeSetSort ()</h3>
<pre class="programlisting">void	xmlXPathNodeSetSort		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> set)<br>
</pre>
<p>Sort the node set in document order</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>set</tt></i>:</span></td>
<td>the node set</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeTrailing"></a>xmlXPathNodeTrailing ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeTrailing	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted is called.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeTrailingSorted"></a>xmlXPathNodeTrailingSorted ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeTrailingSorted	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNormalizeFunction"></a>xmlXPathNormalizeFunction ()</h3>
<pre class="programlisting">void	xmlXPathNormalizeFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the normalize-space() XPath function string normalize-space(string?) The normalize-space function returns the argument string with white space normalized by stripping leading and trailing whitespace and replacing sequences of whitespace <a href="libxml2-SAX.html#characters">characters</a> by a single space. Whitespace <a href="libxml2-SAX.html#characters">characters</a> are the same allowed by the S production in XML. If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNotEqualValues"></a>xmlXPathNotEqualValues ()</h3>
<pre class="programlisting">int	xmlXPathNotEqualValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the equal operation on XPath objects content: @arg1 == @arg2</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or 1 depending on the results of the test.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNotFunction"></a>xmlXPathNotFunction ()</h3>
<pre class="programlisting">void	xmlXPathNotFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the not() XPath function boolean not(boolean) The not function returns true if its argument is false, and false otherwise.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNsLookup"></a>xmlXPathNsLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathNsLookup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Search in the namespace declaration array of the context for the given namespace name associated to the given prefix</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the namespace prefix value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNumberFunction"></a>xmlXPathNumberFunction ()</h3>
<pre class="programlisting">void	xmlXPathNumberFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the number() XPath function number number(object?)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathParseNCName"></a>xmlXPathParseNCName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathParseNCName	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>parse an XML namespace non qualified name. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace name or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathParseName"></a>xmlXPathParseName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathParseName	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>parse an XML name [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace name or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPopBoolean"></a>xmlXPathPopBoolean ()</h3>
<pre class="programlisting">int	xmlXPathPopBoolean		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops a boolean from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the boolean</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPopExternal"></a>xmlXPathPopExternal ()</h3>
<pre class="programlisting">void *	xmlXPathPopExternal		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops an external object from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the object</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPopNodeSet"></a>xmlXPathPopNodeSet ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathPopNodeSet	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops a node-set from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node-set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPopNumber"></a>xmlXPathPopNumber ()</h3>
<pre class="programlisting">double	xmlXPathPopNumber		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops a number from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPopString"></a>xmlXPathPopString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathPopString	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Pops a string from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPositionFunction"></a>xmlXPathPositionFunction ()</h3>
<pre class="programlisting">void	xmlXPathPositionFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the position() XPath function number position() The position function returns the position of the context node in the context node list. The first position is 1, and so the last position will be equal to last().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterAllFunctions"></a>xmlXPathRegisterAllFunctions ()</h3>
<pre class="programlisting">void	xmlXPathRegisterAllFunctions	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Registers all default XPath functions in this context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterFunc"></a>xmlXPathRegisterFunc ()</h3>
<pre class="programlisting">int	xmlXPathRegisterFunc		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> f)<br>
</pre>
<p>Register a new function. If @f is NULL it unregisters the function</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the function name</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the function implementation or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterFuncLookup"></a>xmlXPathRegisterFuncLookup ()</h3>
<pre class="programlisting">void	xmlXPathRegisterFuncLookup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathFuncLookupFunc">xmlXPathFuncLookupFunc</a> f, <br>					 void * funcCtxt)<br>
</pre>
<p>Registers an external mechanism to do function lookup.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the lookup function</td>
</tr>
<tr>
<td><span class="term"><i><tt>funcCtxt</tt></i>:</span></td>
<td>the lookup data</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterFuncNS"></a>xmlXPathRegisterFuncNS ()</h3>
<pre class="programlisting">int	xmlXPathRegisterFuncNS		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri, <br>					 <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> f)<br>
</pre>
<p>Register a new function. If @f is NULL it unregisters the function</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the function name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the function namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the function implementation or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterNs"></a>xmlXPathRegisterNs ()</h3>
<pre class="programlisting">int	xmlXPathRegisterNs		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri)<br>
</pre>
<p>Register a new namespace. If @ns_uri is NULL it unregisters the namespace</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the namespace prefix cannot be NULL or empty string</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterVariable"></a>xmlXPathRegisterVariable ()</h3>
<pre class="programlisting">int	xmlXPathRegisterVariable	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value)<br>
</pre>
<p>Register a new variable value. If @value is NULL it unregisters the variable</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the variable name</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the variable value or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterVariableLookup"></a>xmlXPathRegisterVariableLookup ()</h3>
<pre class="programlisting">void	xmlXPathRegisterVariableLookup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathVariableLookupFunc">xmlXPathVariableLookupFunc</a> f, <br>					 void * data)<br>
</pre>
<p>register an external mechanism to do variable lookup</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the lookup function</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the lookup data</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisterVariableNS"></a>xmlXPathRegisterVariableNS ()</h3>
<pre class="programlisting">int	xmlXPathRegisterVariableNS	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> value)<br>
</pre>
<p>Register a new variable value. If @value is NULL it unregisters the variable</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the variable name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the variable namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the variable value or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisteredFuncsCleanup"></a>xmlXPathRegisteredFuncsCleanup ()</h3>
<pre class="programlisting">void	xmlXPathRegisteredFuncsCleanup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Cleanup the XPath context data associated to registered functions</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisteredNsCleanup"></a>xmlXPathRegisteredNsCleanup ()</h3>
<pre class="programlisting">void	xmlXPathRegisteredNsCleanup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Cleanup the XPath context data associated to registered variables</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRegisteredVariablesCleanup"></a>xmlXPathRegisteredVariablesCleanup ()</h3>
<pre class="programlisting">void	xmlXPathRegisteredVariablesCleanup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Cleanup the XPath context data associated to registered variables</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRoot"></a>xmlXPathRoot ()</h3>
<pre class="programlisting">void	xmlXPathRoot			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Initialize the context to the root of the document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathRoundFunction"></a>xmlXPathRoundFunction ()</h3>
<pre class="programlisting">void	xmlXPathRoundFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the round() XPath function number round(number) The round function returns the number that is closest to the argument and that is an integer. If there are two such numbers, then the one that is closest to positive infinity is returned.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStartsWithFunction"></a>xmlXPathStartsWithFunction ()</h3>
<pre class="programlisting">void	xmlXPathStartsWithFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the starts-with() XPath function boolean starts-with(string, string) The starts-with function returns true if the first argument string starts with the second argument string, and otherwise returns false.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStringEvalNumber"></a>xmlXPathStringEvalNumber ()</h3>
<pre class="programlisting">double	xmlXPathStringEvalNumber	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>[30a] Float ::= Number ('e' Digits?)? [30] Number ::= Digits ('.' Digits?)? | '.' Digits [31] Digits ::= [0-9]+ Compile a Number in the string In complement of the Number expression, this function also handles negative values : '-' Number.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>A string to scan</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the double value.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStringFunction"></a>xmlXPathStringFunction ()</h3>
<pre class="programlisting">void	xmlXPathStringFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the string() XPath function string string(object?) The string function converts an object to a string as follows: - A node-set is converted to a string by returning the value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned. - A number is converted to a string as follows + NaN is converted to the string NaN + positive zero is converted to the string 0 + negative zero is converted to the string 0 + positive infinity is converted to the string Infinity + negative infinity is converted to the string -Infinity + if the number is an integer, the number is represented in decimal form as a Number with no decimal point and no leading zeros, preceded by a minus sign (-) if the number is negative + otherwise, the number is represented in decimal form as a Number including a decimal point with at least one digit before the decimal point and at least one digit after the decimal point, preceded by a minus sign (-) if the number is negative; there must be no leading zeros before the decimal point apart possibly from the one required digit immediately before the decimal point; beyond the one required digit after the decimal point there must be as many, but only as many, more digits as are needed to uniquely distinguish the number from all other IEEE 754 numeric values. - The boolean false value is converted to the string false. The boolean true value is converted to the string true. If the argument is omitted, it defaults to a node-set with the context node as its only member.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathStringLengthFunction"></a>xmlXPathStringLengthFunction ()</h3>
<pre class="programlisting">void	xmlXPathStringLengthFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the string-length() XPath function number string-length(string?) The string-length returns the number of <a href="libxml2-SAX.html#characters">characters</a> in the string (see [3.6 Strings]). If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSubValues"></a>xmlXPathSubValues ()</h3>
<pre class="programlisting">void	xmlXPathSubValues		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the subtraction operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSubstringAfterFunction"></a>xmlXPathSubstringAfterFunction ()</h3>
<pre class="programlisting">void	xmlXPathSubstringAfterFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the substring-after() XPath function string substring-after(string, string) The substring-after function returns the substring of the first argument string that follows the first occurrence of the second argument string in the first argument string, or the empty stringi if the first argument string does not contain the second argument string. For example, substring-after("1999/04/01","/") returns 04/01, and substring-after("1999/04/01","19") returns 99/04/01.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSubstringBeforeFunction"></a>xmlXPathSubstringBeforeFunction ()</h3>
<pre class="programlisting">void	xmlXPathSubstringBeforeFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the substring-before() XPath function string substring-before(string, string) The substring-before function returns the substring of the first argument string that precedes the first occurrence of the second argument string in the first argument string, or the empty string if the first argument string does not contain the second argument string. For example, substring-before("1999/04/01","/") returns 1999.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSubstringFunction"></a>xmlXPathSubstringFunction ()</h3>
<pre class="programlisting">void	xmlXPathSubstringFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the substring() XPath function string substring(string, number, number?) The substring function returns the substring of the first argument starting at the position specified in the second argument with length specified in the third argument. For example, substring("12345",2,3) returns "234". If the third argument is not specified, it returns the substring starting at the position specified in the second argument and continuing to the end of the string. For example, substring("12345",2) returns "2345". More precisely, each character in the string (see [3.6 Strings]) is considered to have a numeric position: the position of the first character is 1, the position of the second character is 2 and so on. The returned substring contains those <a href="libxml2-SAX.html#characters">characters</a> for which the position of the character is greater than or equal to the second argument and, if the third argument is specified, less than the sum of the second and third arguments; the comparisons and addition used for the above follow the standard IEEE 754 rules. Thus: - substring("12345", 1.5, 2.6) returns "234" - substring("12345", 0, 3) returns "12" - substring("12345", 0 div 0, 3) returns "" - substring("12345", 1, 0 div 0) returns "" - substring("12345", -42, 1 div 0) returns "12345" - substring("12345", -1 div 0, 1 div 0) returns ""</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSumFunction"></a>xmlXPathSumFunction ()</h3>
<pre class="programlisting">void	xmlXPathSumFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the sum() XPath function number sum(node-set) The sum function returns the sum of the values of the nodes in the argument node-set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathTrailing"></a>xmlXPathTrailing ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathTrailing	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #xmlXPathTrailingSorted is called.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathTrailingSorted"></a>xmlXPathTrailingSorted ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathTrailingSorted	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes1, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes2)<br>
</pre>
<p>Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>nodes1</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes2</tt></i>:</span></td>
<td>a node-set, sorted by document order</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathTranslateFunction"></a>xmlXPathTranslateFunction ()</h3>
<pre class="programlisting">void	xmlXPathTranslateFunction	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the translate() XPath function string translate(string, string, string) The translate function returns the first argument string with occurrences of <a href="libxml2-SAX.html#characters">characters</a> in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC")</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathTrueFunction"></a>xmlXPathTrueFunction ()</h3>
<pre class="programlisting">void	xmlXPathTrueFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the true() XPath function boolean true()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathValueFlipSign"></a>xmlXPathValueFlipSign ()</h3>
<pre class="programlisting">void	xmlXPathValueFlipSign		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>Implement the unary - operation on an XPath object The numeric operators convert their operands to numbers as if by calling the number function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathVariableLookup"></a>xmlXPathVariableLookup ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathVariableLookup	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search in the Variable array of the context for the given variable value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the variable name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a copy of the value or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathVariableLookupNS"></a>xmlXPathVariableLookupNS ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathVariableLookupNS	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri)<br>
</pre>
<p>Search in the Variable array of the context for the given variable value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the variable name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the variable namespace URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the a copy of the value or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathWrapCString"></a>xmlXPathWrapCString ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathWrapCString	(char * val)<br>
</pre>
<p>Wraps a string into an XPath object.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the char * value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathWrapExternal"></a>xmlXPathWrapExternal ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathWrapExternal	(void * val)<br>
</pre>
<p>Wraps the @val data into an XPath object.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the user data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathWrapNodeSet"></a>xmlXPathWrapNodeSet ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathWrapNodeSet	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> val)<br>
</pre>
<p>Wrap the Nodeset @val in a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the NodePtr value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathWrapString"></a>xmlXPathWrapString ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathWrapString	(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>Wraps the @val string into an XPath object.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPatherror"></a>xmlXPatherror ()</h3>
<pre class="programlisting">void	xmlXPatherror			(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 const char * file, <br>					 int line, <br>					 int no)<br>
</pre>
<p>Formats an error message.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file name</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>the line number</td>
</tr>
<tr>
<td><span class="term"><i><tt>no</tt></i>:</span></td>
<td>the error number</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-globals.html000064400000104776151730335310014311 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>globals: interface for all global variables of the library</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-entities.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-hash.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">globals</span></h2>
<p>globals - interface for all global variables of the library</p>
<p>all the global variables and thread handling for those variables is handled by this module.  The bottom of this file is automatically generated by build_glob.py based on the description file global.data </p>
<p>Author(s): Gary Pennington &lt;Gary.Pennington@uk.sun.com&gt;, Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlGlobalState <a href="#xmlGlobalState">xmlGlobalState</a>;
typedef <a href="libxml2-globals.html#xmlGlobalState">xmlGlobalState</a> * <a href="#xmlGlobalStatePtr">xmlGlobalStatePtr</a>;
void	<a href="#xmlCleanupGlobals">xmlCleanupGlobals</a>		(void);
<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>	<a href="#xmlDeregisterNodeDefault">xmlDeregisterNodeDefault</a>	(<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a> func);
typedef void <a href="#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlInitGlobals">xmlInitGlobals</a>			(void);
void	<a href="#xmlInitializeGlobalState">xmlInitializeGlobalState</a>	(<a href="libxml2-globals.html#xmlGlobalStatePtr">xmlGlobalStatePtr</a> gs);
<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	<a href="#xmlOutputBufferCreateFilenameDefault">xmlOutputBufferCreateFilenameDefault</a>	(<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a> func);
typedef <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> <a href="#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder, <br>							 int compression);
<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	<a href="#xmlParserInputBufferCreateFilenameDefault">xmlParserInputBufferCreateFilenameDefault</a>	(<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a> func);
typedef <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> <a href="#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>	<a href="#xmlRegisterNodeDefault">xmlRegisterNodeDefault</a>	(<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a> func);
typedef void <a href="#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	<a href="#xmlThrDefBufferAllocScheme">xmlThrDefBufferAllocScheme</a>	(<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> v);
int	<a href="#xmlThrDefDefaultBufferSize">xmlThrDefDefaultBufferSize</a>	(int v);
<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>	<a href="#xmlThrDefDeregisterNodeDefault">xmlThrDefDeregisterNodeDefault</a>	(<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a> func);
int	<a href="#xmlThrDefDoValidityCheckingDefaultValue">xmlThrDefDoValidityCheckingDefaultValue</a>	(int v);
int	<a href="#xmlThrDefGetWarningsDefaultValue">xmlThrDefGetWarningsDefaultValue</a>	(int v);
int	<a href="#xmlThrDefIndentTreeOutput">xmlThrDefIndentTreeOutput</a>	(int v);
int	<a href="#xmlThrDefKeepBlanksDefaultValue">xmlThrDefKeepBlanksDefaultValue</a>	(int v);
int	<a href="#xmlThrDefLineNumbersDefaultValue">xmlThrDefLineNumbersDefaultValue</a>	(int v);
int	<a href="#xmlThrDefLoadExtDtdDefaultValue">xmlThrDefLoadExtDtdDefaultValue</a>	(int v);
<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	<a href="#xmlThrDefOutputBufferCreateFilenameDefault">xmlThrDefOutputBufferCreateFilenameDefault</a>	(<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a> func);
int	<a href="#xmlThrDefParserDebugEntities">xmlThrDefParserDebugEntities</a>	(int v);
<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	<a href="#xmlThrDefParserInputBufferCreateFilenameDefault">xmlThrDefParserInputBufferCreateFilenameDefault</a>	(<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a> func);
int	<a href="#xmlThrDefPedanticParserDefaultValue">xmlThrDefPedanticParserDefaultValue</a>	(int v);
<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>	<a href="#xmlThrDefRegisterNodeDefault">xmlThrDefRegisterNodeDefault</a>	(<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a> func);
int	<a href="#xmlThrDefSaveNoEmptyTags">xmlThrDefSaveNoEmptyTags</a>	(int v);
void	<a href="#xmlThrDefSetGenericErrorFunc">xmlThrDefSetGenericErrorFunc</a>	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> handler);
void	<a href="#xmlThrDefSetStructuredErrorFunc">xmlThrDefSetStructuredErrorFunc</a>	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> handler);
int	<a href="#xmlThrDefSubstituteEntitiesDefaultValue">xmlThrDefSubstituteEntitiesDefaultValue</a>	(int v);
const char *	<a href="#xmlThrDefTreeIndentString">xmlThrDefTreeIndentString</a>	(const char * v);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlGlobalState">Structure </a>xmlGlobalState</h3>
<pre class="programlisting">struct _xmlGlobalState {
    const char *	xmlParserVersion
    <a href="libxml2-tree.html#xmlSAXLocator">xmlSAXLocator</a>	xmlDefaultSAXLocator
    <a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a>	xmlDefaultSAXHandler
    <a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a>	docbDefaultSAXHandler	: unused
    <a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a>	htmlDefaultSAXHandler
    <a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a>	xmlFree
    <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a>	xmlMalloc
    <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a>	xmlMemStrdup
    <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a>	xmlRealloc
    <a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a>	xmlGenericError
    <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a>	xmlStructuredError
    void *	xmlGenericErrorContext
    int	oldXMLWDcompatibility
    <a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	xmlBufferAllocScheme
    int	xmlDefaultBufferSize
    int	xmlSubstituteEntitiesDefaultValue
    int	xmlDoValidityCheckingDefaultValue
    int	xmlGetWarningsDefaultValue
    int	xmlKeepBlanksDefaultValue
    int	xmlLineNumbersDefaultValue
    int	xmlLoadExtDtdDefaultValue
    int	xmlParserDebugEntities
    int	xmlPedanticParserDefaultValue
    int	xmlSaveNoEmptyTags
    int	xmlIndentTreeOutput
    const char *	xmlTreeIndentString
    <a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>	xmlRegisterNodeDefaultValue
    <a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>	xmlDeregisterNodeDefaultValue
    <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a>	xmlMallocAtomic
    <a href="libxml2-xmlerror.html#xmlError">xmlError</a>	xmlLastError
    <a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	xmlParserInputBufferCreateFilenameValue
    <a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	xmlOutputBufferCreateFilenameValue
    void *	xmlStructuredErrorContext
} xmlGlobalState;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGlobalStatePtr">Typedef </a>xmlGlobalStatePtr</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlGlobalState">xmlGlobalState</a> * xmlGlobalStatePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDeregisterNodeFunc"></a>Function type xmlDeregisterNodeFunc</h3>
<pre class="programlisting">void	xmlDeregisterNodeFunc		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Signature for the deregistration callback of a discarded node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFilenameFunc"></a>Function type xmlOutputBufferCreateFilenameFunc</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateFilenameFunc	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder, <br>							 int compression)<br>
</pre>
<p>Signature for the function doing the lookup for a suitable output method corresponding to an URI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI to write to</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> in case of success or NULL if no method was found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFilenameFunc"></a>Function type xmlParserInputBufferCreateFilenameFunc</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateFilenameFunc	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Signature for the function doing the lookup for a suitable input method corresponding to an URI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI to read from</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the requested source encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in case of success or NULL if no method was found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterNodeFunc"></a>Function type xmlRegisterNodeFunc</h3>
<pre class="programlisting">void	xmlRegisterNodeFunc		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Signature for the registration callback of a created node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDefaultSAXHandler">Variable </a>htmlDefaultSAXHandler</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> htmlDefaultSAXHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="oldXMLWDcompatibility">Variable </a>oldXMLWDcompatibility</h3>
<pre class="programlisting">int oldXMLWDcompatibility;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferAllocScheme">Variable </a>xmlBufferAllocScheme</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> xmlBufferAllocScheme;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDefaultBufferSize">Variable </a>xmlDefaultBufferSize</h3>
<pre class="programlisting">int xmlDefaultBufferSize;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDefaultSAXHandler">Variable </a>xmlDefaultSAXHandler</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> xmlDefaultSAXHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDefaultSAXLocator">Variable </a>xmlDefaultSAXLocator</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlSAXLocator">xmlSAXLocator</a> xmlDefaultSAXLocator;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDeregisterNodeDefaultValue">Variable </a>xmlDeregisterNodeDefaultValue</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a> xmlDeregisterNodeDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDoValidityCheckingDefaultValue">Variable </a>xmlDoValidityCheckingDefaultValue</h3>
<pre class="programlisting">int xmlDoValidityCheckingDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFree">Variable </a>xmlFree</h3>
<pre class="programlisting"><a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> xmlFree;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGenericError">Variable </a>xmlGenericError</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> xmlGenericError;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGenericErrorContext">Variable </a>xmlGenericErrorContext</h3>
<pre class="programlisting">void * xmlGenericErrorContext;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetWarningsDefaultValue">Variable </a>xmlGetWarningsDefaultValue</h3>
<pre class="programlisting">int xmlGetWarningsDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIndentTreeOutput">Variable </a>xmlIndentTreeOutput</h3>
<pre class="programlisting">int xmlIndentTreeOutput;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlKeepBlanksDefaultValue">Variable </a>xmlKeepBlanksDefaultValue</h3>
<pre class="programlisting">int xmlKeepBlanksDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLastError">Variable </a>xmlLastError</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlError">xmlError</a> xmlLastError;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLineNumbersDefaultValue">Variable </a>xmlLineNumbersDefaultValue</h3>
<pre class="programlisting">int xmlLineNumbersDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadExtDtdDefaultValue">Variable </a>xmlLoadExtDtdDefaultValue</h3>
<pre class="programlisting">int xmlLoadExtDtdDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMalloc">Variable </a>xmlMalloc</h3>
<pre class="programlisting"><a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> xmlMalloc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMallocAtomic">Variable </a>xmlMallocAtomic</h3>
<pre class="programlisting"><a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> xmlMallocAtomic;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemStrdup">Variable </a>xmlMemStrdup</h3>
<pre class="programlisting"><a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> xmlMemStrdup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFilenameValue">Variable </a>xmlOutputBufferCreateFilenameValue</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a> xmlOutputBufferCreateFilenameValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserDebugEntities">Variable </a>xmlParserDebugEntities</h3>
<pre class="programlisting">int xmlParserDebugEntities;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFilenameValue">Variable </a>xmlParserInputBufferCreateFilenameValue</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a> xmlParserInputBufferCreateFilenameValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserVersion">Variable </a>xmlParserVersion</h3>
<pre class="programlisting">const char * xmlParserVersion;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPedanticParserDefaultValue">Variable </a>xmlPedanticParserDefaultValue</h3>
<pre class="programlisting">int xmlPedanticParserDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRealloc">Variable </a>xmlRealloc</h3>
<pre class="programlisting"><a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> xmlRealloc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterNodeDefaultValue">Variable </a>xmlRegisterNodeDefaultValue</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a> xmlRegisterNodeDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveNoEmptyTags">Variable </a>xmlSaveNoEmptyTags</h3>
<pre class="programlisting">int xmlSaveNoEmptyTags;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStructuredError">Variable </a>xmlStructuredError</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> xmlStructuredError;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStructuredErrorContext">Variable </a>xmlStructuredErrorContext</h3>
<pre class="programlisting">void * xmlStructuredErrorContext;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSubstituteEntitiesDefaultValue">Variable </a>xmlSubstituteEntitiesDefaultValue</h3>
<pre class="programlisting">int xmlSubstituteEntitiesDefaultValue;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTreeIndentString">Variable </a>xmlTreeIndentString</h3>
<pre class="programlisting">const char * xmlTreeIndentString;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupGlobals"></a>xmlCleanupGlobals ()</h3>
<pre class="programlisting">void	xmlCleanupGlobals		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Additional cleanup for multi-threading</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDeregisterNodeDefault"></a>xmlDeregisterNodeDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>	xmlDeregisterNodeDefault	(<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a> func)<br>
</pre>
<p>Registers a callback for node destruction</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>function pointer to the new DeregisterNodeFunc</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous value of the deregistration function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitGlobals"></a>xmlInitGlobals ()</h3>
<pre class="programlisting">void	xmlInitGlobals			(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Additional initialisation for multi-threading</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitializeGlobalState"></a>xmlInitializeGlobalState ()</h3>
<pre class="programlisting">void	xmlInitializeGlobalState	(<a href="libxml2-globals.html#xmlGlobalStatePtr">xmlGlobalStatePtr</a> gs)<br>
</pre>
<p>xmlInitializeGlobalState() initialize a global state with all the default values of the library.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>gs</tt></i>:</span></td>
<td>a pointer to a newly allocated global state</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFilenameDefault"></a>xmlOutputBufferCreateFilenameDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	xmlOutputBufferCreateFilenameDefault	(<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a> func)<br>
</pre>
<p>Registers a callback for URI output file handling</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>function pointer to the new OutputBufferCreateFilenameFunc</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the old value of the registration function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFilenameDefault"></a>xmlParserInputBufferCreateFilenameDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	xmlParserInputBufferCreateFilenameDefault	(<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a> func)<br>
</pre>
<p>Registers a callback for URI input file handling</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>function pointer to the new ParserInputBufferCreateFilenameFunc</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the old value of the registration function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterNodeDefault"></a>xmlRegisterNodeDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>	xmlRegisterNodeDefault	(<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a> func)<br>
</pre>
<p>Registers a callback for node creation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>function pointer to the new RegisterNodeFunc</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the old value of the registration function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefBufferAllocScheme"></a>xmlThrDefBufferAllocScheme ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	xmlThrDefBufferAllocScheme	(<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefDefaultBufferSize"></a>xmlThrDefDefaultBufferSize ()</h3>
<pre class="programlisting">int	xmlThrDefDefaultBufferSize	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefDeregisterNodeDefault"></a>xmlThrDefDeregisterNodeDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a>	xmlThrDefDeregisterNodeDefault	(<a href="libxml2-globals.html#xmlDeregisterNodeFunc">xmlDeregisterNodeFunc</a> func)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefDoValidityCheckingDefaultValue"></a>xmlThrDefDoValidityCheckingDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefDoValidityCheckingDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefGetWarningsDefaultValue"></a>xmlThrDefGetWarningsDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefGetWarningsDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefIndentTreeOutput"></a>xmlThrDefIndentTreeOutput ()</h3>
<pre class="programlisting">int	xmlThrDefIndentTreeOutput	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefKeepBlanksDefaultValue"></a>xmlThrDefKeepBlanksDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefKeepBlanksDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefLineNumbersDefaultValue"></a>xmlThrDefLineNumbersDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefLineNumbersDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefLoadExtDtdDefaultValue"></a>xmlThrDefLoadExtDtdDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefLoadExtDtdDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefOutputBufferCreateFilenameDefault"></a>xmlThrDefOutputBufferCreateFilenameDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a>	xmlThrDefOutputBufferCreateFilenameDefault	(<a href="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc">xmlOutputBufferCreateFilenameFunc</a> func)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefParserDebugEntities"></a>xmlThrDefParserDebugEntities ()</h3>
<pre class="programlisting">int	xmlThrDefParserDebugEntities	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefParserInputBufferCreateFilenameDefault"></a>xmlThrDefParserInputBufferCreateFilenameDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a>	xmlThrDefParserInputBufferCreateFilenameDefault	(<a href="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc">xmlParserInputBufferCreateFilenameFunc</a> func)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefPedanticParserDefaultValue"></a>xmlThrDefPedanticParserDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefPedanticParserDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefRegisterNodeDefault"></a>xmlThrDefRegisterNodeDefault ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a>	xmlThrDefRegisterNodeDefault	(<a href="libxml2-globals.html#xmlRegisterNodeFunc">xmlRegisterNodeFunc</a> func)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefSaveNoEmptyTags"></a>xmlThrDefSaveNoEmptyTags ()</h3>
<pre class="programlisting">int	xmlThrDefSaveNoEmptyTags	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefSetGenericErrorFunc"></a>xmlThrDefSetGenericErrorFunc ()</h3>
<pre class="programlisting">void	xmlThrDefSetGenericErrorFunc	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> handler)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefSetStructuredErrorFunc"></a>xmlThrDefSetStructuredErrorFunc ()</h3>
<pre class="programlisting">void	xmlThrDefSetStructuredErrorFunc	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> handler)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefSubstituteEntitiesDefaultValue"></a>xmlThrDefSubstituteEntitiesDefaultValue ()</h3>
<pre class="programlisting">int	xmlThrDefSubstituteEntitiesDefaultValue	(int v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlThrDefTreeIndentString"></a>xmlThrDefTreeIndentString ()</h3>
<pre class="programlisting">const char *	xmlThrDefTreeIndentString	(const char * v)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>v</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlIO.html000064400000160720151730335310013705 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlIO: interface for the I/O interfaces used by the parser</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xlink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlautomata.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlIO</span></h2>
<p>xmlIO - interface for the I/O interfaces used by the parser</p>
<p>interface for the I/O interfaces used by the parser </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlAllocOutputBuffer">xmlAllocOutputBuffer</a>	(<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlAllocParserInputBuffer">xmlAllocParserInputBuffer</a>	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
int	<a href="#xmlCheckFilename">xmlCheckFilename</a>		(const char * path);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlCheckHTTPInput">xmlCheckHTTPInput</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> ret);
void	<a href="#xmlCleanupInputCallbacks">xmlCleanupInputCallbacks</a>	(void);
void	<a href="#xmlCleanupOutputCallbacks">xmlCleanupOutputCallbacks</a>	(void);
int	<a href="#xmlFileClose">xmlFileClose</a>			(void * context);
int	<a href="#xmlFileMatch">xmlFileMatch</a>			(const char * filename);
void *	<a href="#xmlFileOpen">xmlFileOpen</a>			(const char * filename);
int	<a href="#xmlFileRead">xmlFileRead</a>			(void * context, <br>					 char * buffer, <br>					 int len);
void	<a href="#xmlFreeParserInputBuffer">xmlFreeParserInputBuffer</a>	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in);
int	<a href="#xmlIOFTPClose">xmlIOFTPClose</a>			(void * context);
int	<a href="#xmlIOFTPMatch">xmlIOFTPMatch</a>			(const char * filename);
void *	<a href="#xmlIOFTPOpen">xmlIOFTPOpen</a>			(const char * filename);
int	<a href="#xmlIOFTPRead">xmlIOFTPRead</a>			(void * context, <br>					 char * buffer, <br>					 int len);
int	<a href="#xmlIOHTTPClose">xmlIOHTTPClose</a>			(void * context);
int	<a href="#xmlIOHTTPMatch">xmlIOHTTPMatch</a>			(const char * filename);
void *	<a href="#xmlIOHTTPOpen">xmlIOHTTPOpen</a>			(const char * filename);
void *	<a href="#xmlIOHTTPOpenW">xmlIOHTTPOpenW</a>			(const char * post_uri, <br>					 int compression);
int	<a href="#xmlIOHTTPRead">xmlIOHTTPRead</a>			(void * context, <br>					 char * buffer, <br>					 int len);
typedef int <a href="#xmlInputCloseCallback">xmlInputCloseCallback</a>		(void * context);
typedef int <a href="#xmlInputMatchCallback">xmlInputMatchCallback</a>		(char const * filename);
typedef void * <a href="#xmlInputOpenCallback">xmlInputOpenCallback</a>		(char const * filename);
typedef int <a href="#xmlInputReadCallback">xmlInputReadCallback</a>		(void * context, <br>					 char * buffer, <br>					 int len);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNoNetExternalEntityLoader">xmlNoNetExternalEntityLoader</a>	(const char * URL, <br>							 const char * ID, <br>							 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNormalizeWindowsPath">xmlNormalizeWindowsPath</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path);
int	<a href="#xmlOutputBufferClose">xmlOutputBufferClose</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out);
<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlOutputBufferCreateBuffer">xmlOutputBufferCreateBuffer</a>	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder);
<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlOutputBufferCreateFd">xmlOutputBufferCreateFd</a>	(int fd, <br>						 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder);
<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlOutputBufferCreateFile">xmlOutputBufferCreateFile</a>	(FILE * file, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder);
<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlOutputBufferCreateFilename">xmlOutputBufferCreateFilename</a>	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder, <br>							 int compression);
<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	<a href="#xmlOutputBufferCreateIO">xmlOutputBufferCreateIO</a>	(<a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> iowrite, <br>						 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> ioclose, <br>						 void * ioctx, <br>						 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder);
int	<a href="#xmlOutputBufferFlush">xmlOutputBufferFlush</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlOutputBufferGetContent">xmlOutputBufferGetContent</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out);
size_t	<a href="#xmlOutputBufferGetSize">xmlOutputBufferGetSize</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out);
int	<a href="#xmlOutputBufferWrite">xmlOutputBufferWrite</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 int len, <br>					 const char * buf);
int	<a href="#xmlOutputBufferWriteEscape">xmlOutputBufferWriteEscape</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escaping);
int	<a href="#xmlOutputBufferWriteString">xmlOutputBufferWriteString</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 const char * str);
typedef int <a href="#xmlOutputCloseCallback">xmlOutputCloseCallback</a>		(void * context);
typedef int <a href="#xmlOutputMatchCallback">xmlOutputMatchCallback</a>		(char const * filename);
typedef void * <a href="#xmlOutputOpenCallback">xmlOutputOpenCallback</a>		(char const * filename);
typedef int <a href="#xmlOutputWriteCallback">xmlOutputWriteCallback</a>		(void * context, <br>					 const char * buffer, <br>					 int len);
char *	<a href="#xmlParserGetDirectory">xmlParserGetDirectory</a>		(const char * filename);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateFd">xmlParserInputBufferCreateFd</a>	(int fd, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateFile">xmlParserInputBufferCreateFile</a>	(FILE * file, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateFilename">xmlParserInputBufferCreateFilename</a>	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateIO">xmlParserInputBufferCreateIO</a>	(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>							 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>							 void * ioctx, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateMem">xmlParserInputBufferCreateMem</a>	(const char * mem, <br>							 int size, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlParserInputBufferCreateStatic">xmlParserInputBufferCreateStatic</a>	(const char * mem, <br>							 int size, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
int	<a href="#xmlParserInputBufferGrow">xmlParserInputBufferGrow</a>	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len);
int	<a href="#xmlParserInputBufferPush">xmlParserInputBufferPush</a>	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len, <br>					 const char * buf);
int	<a href="#xmlParserInputBufferRead">xmlParserInputBufferRead</a>	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len);
int	<a href="#xmlPopInputCallbacks">xmlPopInputCallbacks</a>		(void);
int	<a href="#xmlPopOutputCallbacks">xmlPopOutputCallbacks</a>		(void);
void	<a href="#xmlRegisterDefaultInputCallbacks">xmlRegisterDefaultInputCallbacks</a>	(void);
void	<a href="#xmlRegisterDefaultOutputCallbacks">xmlRegisterDefaultOutputCallbacks</a>	(void);
void	<a href="#xmlRegisterHTTPPostCallbacks">xmlRegisterHTTPPostCallbacks</a>	(void);
int	<a href="#xmlRegisterInputCallbacks">xmlRegisterInputCallbacks</a>	(<a href="libxml2-xmlIO.html#xmlInputMatchCallback">xmlInputMatchCallback</a> matchFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputOpenCallback">xmlInputOpenCallback</a> openFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> readFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> closeFunc);
int	<a href="#xmlRegisterOutputCallbacks">xmlRegisterOutputCallbacks</a>	(<a href="libxml2-xmlIO.html#xmlOutputMatchCallback">xmlOutputMatchCallback</a> matchFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputOpenCallback">xmlOutputOpenCallback</a> openFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> writeFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> closeFunc);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlInputCloseCallback"></a>Function type xmlInputCloseCallback</h3>
<pre class="programlisting">int	xmlInputCloseCallback		(void * context)<br>
</pre>
<p>Callback used in the I/O Input API to close the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>an Input context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInputMatchCallback"></a>Function type xmlInputMatchCallback</h3>
<pre class="programlisting">int	xmlInputMatchCallback		(char const * filename)<br>
</pre>
<p>Callback used in the I/O Input API to detect if the current handler can provide input functionality for this resource.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if yes and 0 if another Input module should be used</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInputOpenCallback"></a>Function type xmlInputOpenCallback</h3>
<pre class="programlisting">void *	xmlInputOpenCallback		(char const * filename)<br>
</pre>
<p>Callback used in the I/O Input API to open the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an Input context or NULL in case or error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInputReadCallback"></a>Function type xmlInputReadCallback</h3>
<pre class="programlisting">int	xmlInputReadCallback		(void * context, <br>					 char * buffer, <br>					 int len)<br>
</pre>
<p>Callback used in the I/O Input API to read the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>an Input context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>the buffer to store data read</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the buffer in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes read or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputCloseCallback"></a>Function type xmlOutputCloseCallback</h3>
<pre class="programlisting">int	xmlOutputCloseCallback		(void * context)<br>
</pre>
<p>Callback used in the I/O Output API to close the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>an Output context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputMatchCallback"></a>Function type xmlOutputMatchCallback</h3>
<pre class="programlisting">int	xmlOutputMatchCallback		(char const * filename)<br>
</pre>
<p>Callback used in the I/O Output API to detect if the current handler can provide output functionality for this resource.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if yes and 0 if another Output module should be used</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputOpenCallback"></a>Function type xmlOutputOpenCallback</h3>
<pre class="programlisting">void *	xmlOutputOpenCallback		(char const * filename)<br>
</pre>
<p>Callback used in the I/O Output API to open the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an Output context or NULL in case or error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputWriteCallback"></a>Function type xmlOutputWriteCallback</h3>
<pre class="programlisting">int	xmlOutputWriteCallback		(void * context, <br>					 const char * buffer, <br>					 int len)<br>
</pre>
<p>Callback used in the I/O Output API to write to the resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>an Output context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>the buffer of data to write</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the buffer in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAllocOutputBuffer"></a>xmlAllocOutputBuffer ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlAllocOutputBuffer	(<a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder)<br>
</pre>
<p>Create a buffered parser output</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the encoding converter or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAllocParserInputBuffer"></a>xmlAllocParserInputBuffer ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlAllocParserInputBuffer	(<a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for progressive parsing</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCheckFilename"></a>xmlCheckFilename ()</h3>
<pre class="programlisting">int	xmlCheckFilename		(const char * path)<br>
</pre>
<p>function checks to see if @path is a valid source (file, socket...) for XML. if stat is not available on the target machine,</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>path</tt></i>:</span></td>
<td>the path to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1. if stat fails, returns 0 (if calling stat on the filename fails, it can't be right). if stat succeeds and the file is a directory, returns 2. otherwise returns 1.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCheckHTTPInput"></a>xmlCheckHTTPInput ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlCheckHTTPInput	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> ret)<br>
</pre>
<p>Check an input in case it was created from an HTTP stream, in that case it will handle encoding and update of the base URL in case of redirection. It also checks for HTTP errors in which case the input is cleanly freed up and an appropriate error is raised in context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>ret</tt></i>:</span></td>
<td>an XML parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the input or NULL in case of HTTP error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupInputCallbacks"></a>xmlCleanupInputCallbacks ()</h3>
<pre class="programlisting">void	xmlCleanupInputCallbacks	(void)<br>
</pre>
<p>clears the entire input callback table. this includes the compiled-in I/O.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupOutputCallbacks"></a>xmlCleanupOutputCallbacks ()</h3>
<pre class="programlisting">void	xmlCleanupOutputCallbacks	(void)<br>
</pre>
<p>clears the entire output callback table. this includes the compiled-in I/O callbacks.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFileClose"></a>xmlFileClose ()</h3>
<pre class="programlisting">int	xmlFileClose			(void * context)<br>
</pre>
<p>Close an I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFileMatch"></a>xmlFileMatch ()</h3>
<pre class="programlisting">int	xmlFileMatch			(const char * filename)<br>
</pre>
<p>input from FILE *</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if matches, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFileOpen"></a>xmlFileOpen ()</h3>
<pre class="programlisting">void *	xmlFileOpen			(const char * filename)<br>
</pre>
<p>Wrapper around xmlFileOpen_real that try it with an unescaped version of @filename, if this fails fallback to @filename</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a handler or NULL in case or failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFileRead"></a>xmlFileRead ()</h3>
<pre class="programlisting">int	xmlFileRead			(void * context, <br>					 char * buffer, <br>					 int len)<br>
</pre>
<p>Read @len bytes to @buffer from the I/O channel.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>where to drop data</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>number of bytes to write</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or &lt; 0 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeParserInputBuffer"></a>xmlFreeParserInputBuffer ()</h3>
<pre class="programlisting">void	xmlFreeParserInputBuffer	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in)<br>
</pre>
<p>Free up the memory used by a buffered parser input</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a buffered parser input</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOFTPClose"></a>xmlIOFTPClose ()</h3>
<pre class="programlisting">int	xmlIOFTPClose			(void * context)<br>
</pre>
<p>Close an FTP I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOFTPMatch"></a>xmlIOFTPMatch ()</h3>
<pre class="programlisting">int	xmlIOFTPMatch			(const char * filename)<br>
</pre>
<p>check if the URI matches an FTP one</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if matches, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOFTPOpen"></a>xmlIOFTPOpen ()</h3>
<pre class="programlisting">void *	xmlIOFTPOpen			(const char * filename)<br>
</pre>
<p>open an FTP I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an I/O context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOFTPRead"></a>xmlIOFTPRead ()</h3>
<pre class="programlisting">int	xmlIOFTPRead			(void * context, <br>					 char * buffer, <br>					 int len)<br>
</pre>
<p>Read @len bytes to @buffer from the I/O channel.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>where to drop data</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>number of bytes to write</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOHTTPClose"></a>xmlIOHTTPClose ()</h3>
<pre class="programlisting">int	xmlIOHTTPClose			(void * context)<br>
</pre>
<p>Close an HTTP I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOHTTPMatch"></a>xmlIOHTTPMatch ()</h3>
<pre class="programlisting">int	xmlIOHTTPMatch			(const char * filename)<br>
</pre>
<p>check if the URI matches an HTTP one</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if matches, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOHTTPOpen"></a>xmlIOHTTPOpen ()</h3>
<pre class="programlisting">void *	xmlIOHTTPOpen			(const char * filename)<br>
</pre>
<p>open an HTTP I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI for matching</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an I/O context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOHTTPOpenW"></a>xmlIOHTTPOpenW ()</h3>
<pre class="programlisting">void *	xmlIOHTTPOpenW			(const char * post_uri, <br>					 int compression)<br>
</pre>
<p>Open a temporary buffer to collect the document for a subsequent HTTP POST request. Non-static as is called from the output buffer creation routine.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>post_uri</tt></i>:</span></td>
<td>The destination URI for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>The compression desired for the document.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an I/O context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOHTTPRead"></a>xmlIOHTTPRead ()</h3>
<pre class="programlisting">int	xmlIOHTTPRead			(void * context, <br>					 char * buffer, <br>					 int len)<br>
</pre>
<p>Read @len bytes to @buffer from the I/O channel.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the I/O context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>where to drop data</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>number of bytes to write</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNoNetExternalEntityLoader"></a>xmlNoNetExternalEntityLoader ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNoNetExternalEntityLoader	(const char * URL, <br>							 const char * ID, <br>							 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>A specific entity loader disabling network accesses, though still allowing local catalog accesses for resolution.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the System ID for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the context in which the entity is called or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new allocated xmlParserInputPtr, or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNormalizeWindowsPath"></a>xmlNormalizeWindowsPath ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNormalizeWindowsPath	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path)<br>
</pre>
<p>This function is obsolete. Please see xmlURIFromPath in uri.c for a better solution.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>path</tt></i>:</span></td>
<td>the input file path</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a canonicalized version of the path</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferClose"></a>xmlOutputBufferClose ()</h3>
<pre class="programlisting">int	xmlOutputBufferClose		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out)<br>
</pre>
<p>flushes and close the output I/O channel and free up all the associated resources</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a buffered output</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateBuffer"></a>xmlOutputBufferCreateBuffer ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateBuffer	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder)<br>
</pre>
<p>Create a buffered output for the progressive saving to a <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the encoding converter or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFd"></a>xmlOutputBufferCreateFd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateFd	(int fd, <br>						 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder)<br>
</pre>
<p>Create a buffered output for the progressive saving to a file descriptor</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>a file descriptor number</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the encoding converter or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFile"></a>xmlOutputBufferCreateFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateFile	(FILE * file, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder)<br>
</pre>
<p>Create a buffered output for the progressive saving to a FILE * buffered C I/O</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>a FILE*</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the encoding converter or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateFilename"></a>xmlOutputBufferCreateFilename ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateFilename	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder, <br>							 int compression)<br>
</pre>
<p>Create a buffered output for the progressive saving of a file If filename is "-' then we use stdout as the output. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. TODO: currently if compression is set, the library only support writing to a local file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>a C string containing the URI or filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the encoding converter or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>the compression ration (0 none, 9 max).</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferCreateIO"></a>xmlOutputBufferCreateIO ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>	xmlOutputBufferCreateIO	(<a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> iowrite, <br>						 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> ioclose, <br>						 void * ioctx, <br>						 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> encoder)<br>
</pre>
<p>Create a buffered output for the progressive saving to an I/O handler</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>iowrite</tt></i>:</span></td>
<td>an I/O write function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoder</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser output or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferFlush"></a>xmlOutputBufferFlush ()</h3>
<pre class="programlisting">int	xmlOutputBufferFlush		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out)<br>
</pre>
<p>flushes the output I/O channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a buffered output</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferGetContent"></a>xmlOutputBufferGetContent ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlOutputBufferGetContent	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out)<br>
</pre>
<p>Gives a pointer to the data currently held in the output buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the data or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferGetSize"></a>xmlOutputBufferGetSize ()</h3>
<pre class="programlisting">size_t	xmlOutputBufferGetSize		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out)<br>
</pre>
<p>Gives the length of the data currently held in the output buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case or error or no data is held, the size otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferWrite"></a>xmlOutputBufferWrite ()</h3>
<pre class="programlisting">int	xmlOutputBufferWrite		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 int len, <br>					 const char * buf)<br>
</pre>
<p>Write the content of the array in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a buffered parser output</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the size in bytes of the array.</td>
</tr>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars immediately written, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferWriteEscape"></a>xmlOutputBufferWriteEscape ()</h3>
<pre class="programlisting">int	xmlOutputBufferWriteEscape	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escaping)<br>
</pre>
<p>Write the content of the string in the output I/O buffer This routine escapes the <a href="libxml2-SAX.html#characters">characters</a> and then handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a buffered parser output</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>a zero terminated UTF-8 string</td>
</tr>
<tr>
<td><span class="term"><i><tt>escaping</tt></i>:</span></td>
<td>an optional escaping function (or NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars immediately written, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferWriteString"></a>xmlOutputBufferWriteString ()</h3>
<pre class="programlisting">int	xmlOutputBufferWriteString	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> out, <br>					 const char * str)<br>
</pre>
<p>Write the content of the string in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a buffered parser output</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>a zero terminated C string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars immediately written, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserGetDirectory"></a>xmlParserGetDirectory ()</h3>
<pre class="programlisting">char *	xmlParserGetDirectory		(const char * filename)<br>
</pre>
<p>lookup the directory for that file</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the path to a file</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new allocated string containing the directory, or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFd"></a>xmlParserInputBufferCreateFd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateFd	(int fd, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing for the input from a file descriptor</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>a file descriptor number</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFile"></a>xmlParserInputBufferCreateFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateFile	(FILE * file, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing of a FILE * buffered C I/O</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>a FILE*</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateFilename"></a>xmlParserInputBufferCreateFilename ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateFilename	(const char * URI, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing of a file If filename is "-' then we use stdin as the input. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Do an encoding check if enc == <a href="libxml2-encoding.html#XML_CHAR_ENCODING_NONE">XML_CHAR_ENCODING_NONE</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>a C string containing the URI or filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateIO"></a>xmlParserInputBufferCreateIO ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateIO	(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>							 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>							 void * ioctx, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing for the input from an I/O handler</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateMem"></a>xmlParserInputBufferCreateMem ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateMem	(const char * mem, <br>							 int size, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing for the input from a memory area.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>the memory input</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the length of the memory block</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferCreateStatic"></a>xmlParserInputBufferCreateStatic ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlParserInputBufferCreateStatic	(const char * mem, <br>							 int size, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a buffered parser input for the progressive parsing for the input from an immutable memory area. This will not copy the memory area to the buffer, but the memory is expected to be available until the end of the parsing, this is useful for example when using mmap'ed file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>the memory input</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the length of the memory block</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser input or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferGrow"></a>xmlParserInputBufferGrow ()</h3>
<pre class="programlisting">int	xmlParserInputBufferGrow	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len)<br>
</pre>
<p>Grow up the content of the input buffer, the old data are preserved This routine handle the I18N transcoding to internal UTF-8 This routine is used when operating the parser in normal (pull) mode TODO: one should be able to remove one extra copy by copying directly onto in-&gt;buffer or in-&gt;raw</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a buffered parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>indicative value of the amount of chars to read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars read and stored in the buffer, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferPush"></a>xmlParserInputBufferPush ()</h3>
<pre class="programlisting">int	xmlParserInputBufferPush	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len, <br>					 const char * buf)<br>
</pre>
<p>Push the content of the arry in the input buffer This routine handle the I18N transcoding to internal UTF-8 This is used when operating the parser in progressive (push) mode.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a buffered parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the size in bytes of the array.</td>
</tr>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars read and stored in the buffer, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferRead"></a>xmlParserInputBufferRead ()</h3>
<pre class="programlisting">int	xmlParserInputBufferRead	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> in, <br>					 int len)<br>
</pre>
<p>Refresh the content of the input buffer, the old data are considered consumed This routine handle the I18N transcoding to internal UTF-8</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a buffered parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>indicative value of the amount of chars to read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of chars read and stored in the buffer, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPopInputCallbacks"></a>xmlPopInputCallbacks ()</h3>
<pre class="programlisting">int	xmlPopInputCallbacks		(void)<br>
</pre>
<p>Clear the top input callback from the input stack. this includes the compiled-in I/O.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of input callback registered or -1 in case of error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPopOutputCallbacks"></a>xmlPopOutputCallbacks ()</h3>
<pre class="programlisting">int	xmlPopOutputCallbacks		(void)<br>
</pre>
<p>Remove the top output callbacks from the output stack. This includes the compiled-in I/O.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of output callback registered or -1 in case of error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterDefaultInputCallbacks"></a>xmlRegisterDefaultInputCallbacks ()</h3>
<pre class="programlisting">void	xmlRegisterDefaultInputCallbacks	(void)<br>
</pre>
<p>Registers the default compiled-in I/O handlers.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterDefaultOutputCallbacks"></a>xmlRegisterDefaultOutputCallbacks ()</h3>
<pre class="programlisting">void	xmlRegisterDefaultOutputCallbacks	(void)<br>
</pre>
<p>Registers the default compiled-in I/O handlers.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterHTTPPostCallbacks"></a>xmlRegisterHTTPPostCallbacks ()</h3>
<pre class="programlisting">void	xmlRegisterHTTPPostCallbacks	(void)<br>
</pre>
<p>By default, libxml submits HTTP output requests using the "PUT" method. Calling this method changes the HTTP output method to use the "POST" method instead.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterInputCallbacks"></a>xmlRegisterInputCallbacks ()</h3>
<pre class="programlisting">int	xmlRegisterInputCallbacks	(<a href="libxml2-xmlIO.html#xmlInputMatchCallback">xmlInputMatchCallback</a> matchFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputOpenCallback">xmlInputOpenCallback</a> openFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> readFunc, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> closeFunc)<br>
</pre>
<p>Register a new set of I/O callback for handling parser input.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>matchFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlInputMatchCallback">xmlInputMatchCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>openFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlInputOpenCallback">xmlInputOpenCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>readFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>closeFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the registered handler number or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRegisterOutputCallbacks"></a>xmlRegisterOutputCallbacks ()</h3>
<pre class="programlisting">int	xmlRegisterOutputCallbacks	(<a href="libxml2-xmlIO.html#xmlOutputMatchCallback">xmlOutputMatchCallback</a> matchFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputOpenCallback">xmlOutputOpenCallback</a> openFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> writeFunc, <br>					 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> closeFunc)<br>
</pre>
<p>Register a new set of I/O callback for handling output.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>matchFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlOutputMatchCallback">xmlOutputMatchCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>openFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlOutputOpenCallback">xmlOutputOpenCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>writeFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>closeFunc</tt></i>:</span></td>
<td>the <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the registered handler number or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlmemory.html000064400000057032151730335310014707 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlmemory: interface for the memory allocator</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlexports.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlmodule.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlmemory</span></h2>
<p>xmlmemory - interface for the memory allocator</p>
<p>provides interfaces for the memory allocator, including debugging capabilities. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#DEBUG_MEMORY">DEBUG_MEMORY</a>;
#define <a href="#xmlMalloc">xmlMalloc</a>;
#define <a href="#xmlMallocAtomic">xmlMallocAtomic</a>;
#define <a href="#xmlMemStrdup">xmlMemStrdup</a>;
#define <a href="#xmlRealloc">xmlRealloc</a>;
void	<a href="#xmlCleanupMemory">xmlCleanupMemory</a>		(void);
typedef void <a href="#xmlFreeFunc">xmlFreeFunc</a>			(void * mem);
int	<a href="#xmlGcMemGet">xmlGcMemGet</a>			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> * freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocAtomicFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> * reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> * strdupFunc);
int	<a href="#xmlGcMemSetup">xmlGcMemSetup</a>			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocAtomicFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> strdupFunc);
int	<a href="#xmlInitMemory">xmlInitMemory</a>			(void);
void *	<a href="#xmlMallocAtomicLoc">xmlMallocAtomicLoc</a>		(size_t size, <br>					 const char * file, <br>					 int line);
typedef void * <a href="#xmlMallocFunc">xmlMallocFunc</a>			(size_t size);
void *	<a href="#xmlMallocLoc">xmlMallocLoc</a>			(size_t size, <br>					 const char * file, <br>					 int line);
int	<a href="#xmlMemBlocks">xmlMemBlocks</a>			(void);
void	<a href="#xmlMemDisplay">xmlMemDisplay</a>			(FILE * fp);
void	<a href="#xmlMemDisplayLast">xmlMemDisplayLast</a>		(FILE * fp, <br>					 long nbBytes);
void	<a href="#xmlMemFree">xmlMemFree</a>			(void * ptr);
int	<a href="#xmlMemGet">xmlMemGet</a>			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> * freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> * reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> * strdupFunc);
void *	<a href="#xmlMemMalloc">xmlMemMalloc</a>			(size_t size);
void *	<a href="#xmlMemRealloc">xmlMemRealloc</a>			(void * ptr, <br>					 size_t size);
int	<a href="#xmlMemSetup">xmlMemSetup</a>			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> strdupFunc);
void	<a href="#xmlMemShow">xmlMemShow</a>			(FILE * fp, <br>					 int nr);
char *	<a href="#xmlMemStrdupLoc">xmlMemStrdupLoc</a>			(const char * str, <br>					 const char * file, <br>					 int line);
int	<a href="#xmlMemUsed">xmlMemUsed</a>			(void);
void	<a href="#xmlMemoryDump">xmlMemoryDump</a>			(void);
char *	<a href="#xmlMemoryStrdup">xmlMemoryStrdup</a>			(const char * str);
typedef void * <a href="#xmlReallocFunc">xmlReallocFunc</a>			(void * mem, <br>					 size_t size);
void *	<a href="#xmlReallocLoc">xmlReallocLoc</a>			(void * ptr, <br>					 size_t size, <br>					 const char * file, <br>					 int line);
typedef char * <a href="#xmlStrdupFunc">xmlStrdupFunc</a>			(const char * str);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="DEBUG_MEMORY">Macro </a>DEBUG_MEMORY</h3>
<pre class="programlisting">#define <a href="#DEBUG_MEMORY">DEBUG_MEMORY</a>;
</pre>
<p><a href="libxml2-xmlmemory.html#DEBUG_MEMORY">DEBUG_MEMORY</a> replaces the allocator with a collect and debug shell to the libc allocator. <a href="libxml2-xmlmemory.html#DEBUG_MEMORY">DEBUG_MEMORY</a> should only be activated when debugging libxml i.e. if libxml has been configured with --with-debug-mem too. #define DEBUG_MEMORY_FREED #define <a href="libxml2-xmlversion.html#DEBUG_MEMORY_LOCATION">DEBUG_MEMORY_LOCATION</a></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeFunc"></a>Function type xmlFreeFunc</h3>
<pre class="programlisting">void	xmlFreeFunc			(void * mem)<br>
</pre>
<p>Signature for a free() implementation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>an already allocated block of memory</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMallocFunc"></a>Function type xmlMallocFunc</h3>
<pre class="programlisting">void *	xmlMallocFunc			(size_t size)<br>
</pre>
<p>Signature for a malloc() implementation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size requested in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the newly allocated block or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReallocFunc"></a>Function type xmlReallocFunc</h3>
<pre class="programlisting">void *	xmlReallocFunc			(void * mem, <br>					 size_t size)<br>
</pre>
<p>Signature for a realloc() implementation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>an already allocated block of memory</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the new size requested in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the newly reallocated block or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrdupFunc"></a>Function type xmlStrdupFunc</h3>
<pre class="programlisting">char *	xmlStrdupFunc			(const char * str)<br>
</pre>
<p>Signature for an strdup() implementation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the copy of the string or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupMemory"></a>xmlCleanupMemory ()</h3>
<pre class="programlisting">void	xmlCleanupMemory		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Free up all the memory allocated by the library for its own use. This should not be called by user level code.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGcMemGet"></a>xmlGcMemGet ()</h3>
<pre class="programlisting">int	xmlGcMemGet			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> * freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocAtomicFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> * reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> * strdupFunc)<br>
</pre>
<p>Provides the memory access functions set currently in use The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>freeFunc</tt></i>:</span></td>
<td>place to save the free() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocFunc</tt></i>:</span></td>
<td>place to save the malloc() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocAtomicFunc</tt></i>:</span></td>
<td>place to save the atomic malloc() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>reallocFunc</tt></i>:</span></td>
<td>place to save the realloc() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>strdupFunc</tt></i>:</span></td>
<td>place to save the strdup() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGcMemSetup"></a>xmlGcMemSetup ()</h3>
<pre class="programlisting">int	xmlGcMemSetup			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocAtomicFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> strdupFunc)<br>
</pre>
<p>Override the default memory access functions with a new set This has to be called before any other libxml routines ! The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators Should this be blocked if there was already some allocations done ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>freeFunc</tt></i>:</span></td>
<td>the free() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocFunc</tt></i>:</span></td>
<td>the malloc() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocAtomicFunc</tt></i>:</span></td>
<td>the malloc() function to use for atomic allocations</td>
</tr>
<tr>
<td><span class="term"><i><tt>reallocFunc</tt></i>:</span></td>
<td>the realloc() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>strdupFunc</tt></i>:</span></td>
<td>the strdup() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitMemory"></a>xmlInitMemory ()</h3>
<pre class="programlisting">int	xmlInitMemory			(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Initialize the memory layer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMallocAtomicLoc"></a>xmlMallocAtomicLoc ()</h3>
<pre class="programlisting">void *	xmlMallocAtomicLoc		(size_t size, <br>					 const char * file, <br>					 int line)<br>
</pre>
<p>a malloc() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>an unsigned int specifying the size in byte to allocate.</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>the line number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the allocated area or NULL in case of lack of memory.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMallocLoc"></a>xmlMallocLoc ()</h3>
<pre class="programlisting">void *	xmlMallocLoc			(size_t size, <br>					 const char * file, <br>					 int line)<br>
</pre>
<p>a malloc() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>an int specifying the size in byte to allocate.</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>the line number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the allocated area or NULL in case of lack of memory.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemBlocks"></a>xmlMemBlocks ()</h3>
<pre class="programlisting">int	xmlMemBlocks			(void)<br>
</pre>
<p>Provides the number of memory areas currently allocated</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int representing the number of blocks</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemDisplay"></a>xmlMemDisplay ()</h3>
<pre class="programlisting">void	xmlMemDisplay			(FILE * fp)<br>
</pre>
<p>show in-extenso the memory blocks allocated</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>fp</tt></i>:</span></td>
<td>a FILE descriptor used as the output file, if NULL, the result is written to the file .memorylist</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemDisplayLast"></a>xmlMemDisplayLast ()</h3>
<pre class="programlisting">void	xmlMemDisplayLast		(FILE * fp, <br>					 long nbBytes)<br>
</pre>
<p>the last nbBytes of memory allocated and not freed, useful for dumping the memory left allocated between two places at runtime.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fp</tt></i>:</span></td>
<td>a FILE descriptor used as the output file, if NULL, the result is written to the file .memorylist</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbBytes</tt></i>:</span></td>
<td>the amount of memory to dump</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemFree"></a>xmlMemFree ()</h3>
<pre class="programlisting">void	xmlMemFree			(void * ptr)<br>
</pre>
<p>a free() equivalent, with error checking.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ptr</tt></i>:</span></td>
<td>the memory block pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemGet"></a>xmlMemGet ()</h3>
<pre class="programlisting">int	xmlMemGet			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> * freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> * mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> * reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> * strdupFunc)<br>
</pre>
<p>Provides the memory access functions set currently in use</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>freeFunc</tt></i>:</span></td>
<td>place to save the free() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocFunc</tt></i>:</span></td>
<td>place to save the malloc() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>reallocFunc</tt></i>:</span></td>
<td>place to save the realloc() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>strdupFunc</tt></i>:</span></td>
<td>place to save the strdup() function in use</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemMalloc"></a>xmlMemMalloc ()</h3>
<pre class="programlisting">void *	xmlMemMalloc			(size_t size)<br>
</pre>
<p>a malloc() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>an int specifying the size in byte to allocate.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the allocated area or NULL in case of lack of memory.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemRealloc"></a>xmlMemRealloc ()</h3>
<pre class="programlisting">void *	xmlMemRealloc			(void * ptr, <br>					 size_t size)<br>
</pre>
<p>a realloc() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ptr</tt></i>:</span></td>
<td>the initial memory block pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>an int specifying the size in byte to allocate.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the allocated area or NULL in case of lack of memory.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemSetup"></a>xmlMemSetup ()</h3>
<pre class="programlisting">int	xmlMemSetup			(<a href="libxml2-xmlmemory.html#xmlFreeFunc">xmlFreeFunc</a> freeFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlMallocFunc">xmlMallocFunc</a> mallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlReallocFunc">xmlReallocFunc</a> reallocFunc, <br>					 <a href="libxml2-xmlmemory.html#xmlStrdupFunc">xmlStrdupFunc</a> strdupFunc)<br>
</pre>
<p>Override the default memory access functions with a new set This has to be called before any other libxml routines ! Should this be blocked if there was already some allocations done ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>freeFunc</tt></i>:</span></td>
<td>the free() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>mallocFunc</tt></i>:</span></td>
<td>the malloc() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>reallocFunc</tt></i>:</span></td>
<td>the realloc() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>strdupFunc</tt></i>:</span></td>
<td>the strdup() function to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemShow"></a>xmlMemShow ()</h3>
<pre class="programlisting">void	xmlMemShow			(FILE * fp, <br>					 int nr)<br>
</pre>
<p>show a show display of the memory allocated, and dump the @nr last allocated areas which were not freed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fp</tt></i>:</span></td>
<td>a FILE descriptor used as the output file</td>
</tr>
<tr>
<td><span class="term"><i><tt>nr</tt></i>:</span></td>
<td>number of entries to dump</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemStrdupLoc"></a>xmlMemStrdupLoc ()</h3>
<pre class="programlisting">char *	xmlMemStrdupLoc			(const char * str, <br>					 const char * file, <br>					 int line)<br>
</pre>
<p>a strdup() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the initial string pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>the line number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new string or NULL if allocation error occurred.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemUsed"></a>xmlMemUsed ()</h3>
<pre class="programlisting">int	xmlMemUsed			(void)<br>
</pre>
<p>Provides the amount of memory currently allocated</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int representing the amount of memory allocated.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemoryDump"></a>xmlMemoryDump ()</h3>
<pre class="programlisting">void	xmlMemoryDump			(void)<br>
</pre>
<p>Dump in-extenso the memory blocks allocated to the file .memorylist</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMemoryStrdup"></a>xmlMemoryStrdup ()</h3>
<pre class="programlisting">char *	xmlMemoryStrdup			(const char * str)<br>
</pre>
<p>a strdup() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the initial string pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new string or NULL if allocation error occurred.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReallocLoc"></a>xmlReallocLoc ()</h3>
<pre class="programlisting">void *	xmlReallocLoc			(void * ptr, <br>					 size_t size, <br>					 const char * file, <br>					 int line)<br>
</pre>
<p>a realloc() equivalent, with logging of the allocation info.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ptr</tt></i>:</span></td>
<td>the initial memory block pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>an int specifying the size in byte to allocate.</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>the line number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the allocated area or NULL in case of lack of memory.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-threads.html000064400000031065151730335310014306 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>threads: interfaces for thread handling</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-schematron.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-tree.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">threads</span></h2>
<p>threads - interfaces for thread handling</p>
<p>set of generic threading related routines should work with pthreads, Windows native or TLS threads </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlMutex <a href="#xmlMutex">xmlMutex</a>;
typedef <a href="libxml2-threads.html#xmlMutex">xmlMutex</a> * <a href="#xmlMutexPtr">xmlMutexPtr</a>;
typedef struct _xmlRMutex <a href="#xmlRMutex">xmlRMutex</a>;
typedef <a href="libxml2-threads.html#xmlRMutex">xmlRMutex</a> * <a href="#xmlRMutexPtr">xmlRMutexPtr</a>;
void	<a href="#xmlCleanupThreads">xmlCleanupThreads</a>		(void);
int	<a href="#xmlDllMain">xmlDllMain</a>			(void * hinstDLL, <br>					 unsigned long fdwReason, <br>					 void * lpvReserved);
void	<a href="#xmlFreeMutex">xmlFreeMutex</a>			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok);
void	<a href="#xmlFreeRMutex">xmlFreeRMutex</a>			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok);
<a href="libxml2-globals.html#xmlGlobalStatePtr">xmlGlobalStatePtr</a>	<a href="#xmlGetGlobalState">xmlGetGlobalState</a>	(void);
int	<a href="#xmlGetThreadId">xmlGetThreadId</a>			(void);
void	<a href="#xmlInitThreads">xmlInitThreads</a>			(void);
int	<a href="#xmlIsMainThread">xmlIsMainThread</a>			(void);
void	<a href="#xmlLockLibrary">xmlLockLibrary</a>			(void);
void	<a href="#xmlMutexLock">xmlMutexLock</a>			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok);
void	<a href="#xmlMutexUnlock">xmlMutexUnlock</a>			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok);
<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a>	<a href="#xmlNewMutex">xmlNewMutex</a>		(void);
<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a>	<a href="#xmlNewRMutex">xmlNewRMutex</a>		(void);
void	<a href="#xmlRMutexLock">xmlRMutexLock</a>			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok);
void	<a href="#xmlRMutexUnlock">xmlRMutexUnlock</a>			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok);
void	<a href="#xmlUnlockLibrary">xmlUnlockLibrary</a>		(void);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlMutex">Structure </a>xmlMutex</h3>
<pre class="programlisting">struct _xmlMutex {
The content of this structure is not made public by the API.
} xmlMutex;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMutexPtr">Typedef </a>xmlMutexPtr</h3>
<pre class="programlisting"><a href="libxml2-threads.html#xmlMutex">xmlMutex</a> * xmlMutexPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRMutex">Structure </a>xmlRMutex</h3>
<pre class="programlisting">struct _xmlRMutex {
The content of this structure is not made public by the API.
} xmlRMutex;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRMutexPtr">Typedef </a>xmlRMutexPtr</h3>
<pre class="programlisting"><a href="libxml2-threads.html#xmlRMutex">xmlRMutex</a> * xmlRMutexPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupThreads"></a>xmlCleanupThreads ()</h3>
<pre class="programlisting">void	xmlCleanupThreads		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. xmlCleanupThreads() is used to to cleanup all the thread related data of the libxml2 library once processing has ended. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind !</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDllMain"></a>xmlDllMain ()</h3>
<pre class="programlisting">int	xmlDllMain			(void * hinstDLL, <br>					 unsigned long fdwReason, <br>					 void * lpvReserved)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>hinstDLL</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>fdwReason</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>lpvReserved</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td></td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeMutex"></a>xmlFreeMutex ()</h3>
<pre class="programlisting">void	xmlFreeMutex			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok)<br>
</pre>
<p>xmlFreeMutex() is used to reclaim resources associated with a libxml2 token struct.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the simple mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeRMutex"></a>xmlFreeRMutex ()</h3>
<pre class="programlisting">void	xmlFreeRMutex			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok)<br>
</pre>
<p>xmlRFreeMutex() is used to reclaim resources associated with a reentrant mutex.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the reentrant mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetGlobalState"></a>xmlGetGlobalState ()</h3>
<pre class="programlisting"><a href="libxml2-globals.html#xmlGlobalStatePtr">xmlGlobalStatePtr</a>	xmlGetGlobalState	(void)<br>
</pre>
<p>xmlGetGlobalState() is called to retrieve the global state for a thread.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the thread global state or NULL in case of error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetThreadId"></a>xmlGetThreadId ()</h3>
<pre class="programlisting">int	xmlGetThreadId			(void)<br>
</pre>
<p>xmlGetThreadId() find the current thread ID number Note that this is likely to be broken on some platforms using pthreads as the specification doesn't mandate pthread_t to be an integer type</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current thread ID number</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitThreads"></a>xmlInitThreads ()</h3>
<pre class="programlisting">void	xmlInitThreads			(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. xmlInitThreads() is used to to initialize all the thread related data of the libxml2 library.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsMainThread"></a>xmlIsMainThread ()</h3>
<pre class="programlisting">int	xmlIsMainThread			(void)<br>
</pre>
<p>xmlIsMainThread() check whether the current thread is the main thread.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the current thread is the main thread, 0 otherwise</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLockLibrary"></a>xmlLockLibrary ()</h3>
<pre class="programlisting">void	xmlLockLibrary			(void)<br>
</pre>
<p>xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 library.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMutexLock"></a>xmlMutexLock ()</h3>
<pre class="programlisting">void	xmlMutexLock			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok)<br>
</pre>
<p>xmlMutexLock() is used to lock a libxml2 token.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the simple mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlMutexUnlock"></a>xmlMutexUnlock ()</h3>
<pre class="programlisting">void	xmlMutexUnlock			(<a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a> tok)<br>
</pre>
<p>xmlMutexUnlock() is used to unlock a libxml2 token.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the simple mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewMutex"></a>xmlNewMutex ()</h3>
<pre class="programlisting"><a href="libxml2-threads.html#xmlMutexPtr">xmlMutexPtr</a>	xmlNewMutex		(void)<br>
</pre>
<p>xmlNewMutex() is used to allocate a libxml2 token struct for use in synchronizing access to data.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new simple mutex pointer or NULL in case of error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewRMutex"></a>xmlNewRMutex ()</h3>
<pre class="programlisting"><a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a>	xmlNewRMutex		(void)<br>
</pre>
<p>xmlRNewMutex() is used to allocate a reentrant mutex for use in synchronizing access to data. token_r is a re-entrant lock and thus useful for synchronizing access to data structures that may be manipulated in a recursive fashion.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reentrant mutex pointer or NULL in case of error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRMutexLock"></a>xmlRMutexLock ()</h3>
<pre class="programlisting">void	xmlRMutexLock			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok)<br>
</pre>
<p>xmlRMutexLock() is used to lock a libxml2 token_r.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the reentrant mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRMutexUnlock"></a>xmlRMutexUnlock ()</h3>
<pre class="programlisting">void	xmlRMutexUnlock			(<a href="libxml2-threads.html#xmlRMutexPtr">xmlRMutexPtr</a> tok)<br>
</pre>
<p>xmlRMutexUnlock() is used to unlock a libxml2 token_r.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>tok</tt></i>:</span></td>
<td>the reentrant mutex</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUnlockLibrary"></a>xmlUnlockLibrary ()</h3>
<pre class="programlisting">void	xmlUnlockLibrary		(void)<br>
</pre>
<p>xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 library.</p>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlautomata.html000064400000104033151730335310015204 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlautomata: API to build regexp automata</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlIO.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlerror.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlautomata</span></h2>
<p>xmlautomata - API to build regexp automata</p>
<p>the API to build regexp automata </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlAutomata <a href="#xmlAutomata">xmlAutomata</a>;
typedef <a href="libxml2-xmlautomata.html#xmlAutomata">xmlAutomata</a> * <a href="#xmlAutomataPtr">xmlAutomataPtr</a>;
typedef struct _xmlAutomataState <a href="#xmlAutomataState">xmlAutomataState</a>;
typedef <a href="libxml2-xmlautomata.html#xmlAutomataState">xmlAutomataState</a> * <a href="#xmlAutomataStatePtr">xmlAutomataStatePtr</a>;
<a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	<a href="#xmlAutomataCompile">xmlAutomataCompile</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataGetInitState">xmlAutomataGetInitState</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am);
int	<a href="#xmlAutomataIsDeterminist">xmlAutomataIsDeterminist</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewAllTrans">xmlAutomataNewAllTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 int lax);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewCountTrans">xmlAutomataNewCountTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 int min, <br>							 int max, <br>							 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewCountTrans2">xmlAutomataNewCountTrans2</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 int min, <br>							 int max, <br>							 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewCountedTrans">xmlAutomataNewCountedTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 int counter);
int	<a href="#xmlAutomataNewCounter">xmlAutomataNewCounter</a>		(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>					 int min, <br>					 int max);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewCounterTrans">xmlAutomataNewCounterTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 int counter);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewEpsilon">xmlAutomataNewEpsilon</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewNegTrans">xmlAutomataNewNegTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>						 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewOnceTrans">xmlAutomataNewOnceTrans</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>						 int min, <br>						 int max, <br>						 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewOnceTrans2">xmlAutomataNewOnceTrans2</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 int min, <br>							 int max, <br>							 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewState">xmlAutomataNewState</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewTransition">xmlAutomataNewTransition</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 void * data);
<a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	<a href="#xmlAutomataNewTransition2">xmlAutomataNewTransition2</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 void * data);
int	<a href="#xmlAutomataSetFinalState">xmlAutomataSetFinalState</a>	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>					 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> state);
void	<a href="#xmlFreeAutomata">xmlFreeAutomata</a>			(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am);
<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a>	<a href="#xmlNewAutomata">xmlNewAutomata</a>		(void);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomata">Structure </a>xmlAutomata</h3>
<pre class="programlisting">struct _xmlAutomata {
The content of this structure is not made public by the API.
} xmlAutomata;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataPtr">Typedef </a>xmlAutomataPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomata">xmlAutomata</a> * xmlAutomataPtr;
</pre>
<p>A libxml automata description, It can be compiled into a regexp</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataState">Structure </a>xmlAutomataState</h3>
<pre class="programlisting">struct _xmlAutomataState {
The content of this structure is not made public by the API.
} xmlAutomataState;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataStatePtr">Typedef </a>xmlAutomataStatePtr</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataState">xmlAutomataState</a> * xmlAutomataStatePtr;
</pre>
<p>A state int the automata description,</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataCompile"></a>xmlAutomataCompile ()</h3>
<pre class="programlisting"><a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	xmlAutomataCompile	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am)<br>
</pre>
<p>Compile the automata into a Reg Exp ready for being executed. The automata should be free after this point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the compiled regexp or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataGetInitState"></a>xmlAutomataGetInitState ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataGetInitState	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am)<br>
</pre>
<p>Initial state lookup</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the initial state of the automata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataIsDeterminist"></a>xmlAutomataIsDeterminist ()</h3>
<pre class="programlisting">int	xmlAutomataIsDeterminist	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am)<br>
</pre>
<p>Checks if an automata is determinist.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if not, and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewAllTrans"></a>xmlAutomataNewAllTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewAllTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 int lax)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a an ALL transition from the @from state to the target state. That transition is an epsilon transition allowed only when all transitions from the @from node have been activated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>lax</tt></i>:</span></td>
<td>allow to transition if not all all transitions have been activated</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewCountTrans"></a>xmlAutomataNewCountTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewCountTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 int min, <br>							 int max, <br>							 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the minimum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the maximum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewCountTrans2"></a>xmlAutomataNewCountTrans2 ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewCountTrans2	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 int min, <br>							 int max, <br>							 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>token2</tt></i>:</span></td>
<td>the second input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the minimum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the maximum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewCountedTrans"></a>xmlAutomataNewCountedTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewCountedTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 int counter)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will increment the counter provided</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>counter</tt></i>:</span></td>
<td>the counter associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewCounter"></a>xmlAutomataNewCounter ()</h3>
<pre class="programlisting">int	xmlAutomataNewCounter		(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>					 int min, <br>					 int max)<br>
</pre>
<p>Create a new counter</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the minimal value on the counter</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the maximal value on the counter</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the counter number or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewCounterTrans"></a>xmlAutomataNewCounterTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewCounterTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 int counter)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will be allowed only if the counter is within the right range.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>counter</tt></i>:</span></td>
<td>the counter associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewEpsilon"></a>xmlAutomataNewEpsilon ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewEpsilon	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewNegTrans"></a>xmlAutomataNewNegTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewNegTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>						 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by any value except (@token,@token2) Note that if @token2 is not NULL, then (X, NULL) won't match to follow # the semantic of XSD ##other</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the first input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>token2</tt></i>:</span></td>
<td>the second input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data passed to the callback function if the transition is activated</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewOnceTrans"></a>xmlAutomataNewOnceTrans ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewOnceTrans	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>						 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>						 int min, <br>						 int max, <br>						 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max, moreover that transition can only be crossed once.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the minimum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the maximum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewOnceTrans2"></a>xmlAutomataNewOnceTrans2 ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewOnceTrans2	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 int min, <br>							 int max, <br>							 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max, moreover that transition can only be crossed once.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>token2</tt></i>:</span></td>
<td>the second input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>min</tt></i>:</span></td>
<td>the minimum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the maximum successive occurrences of token</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data associated to the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewState"></a>xmlAutomataNewState ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewState	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am)<br>
</pre>
<p>Create a new disconnected state in the automata</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewTransition"></a>xmlAutomataNewTransition ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewTransition	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data passed to the callback function if the transition is activated</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataNewTransition2"></a>xmlAutomataNewTransition2 ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	xmlAutomataNewTransition2	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> from, <br>							 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> to, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * token2, <br>							 void * data)<br>
</pre>
<p>If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>the starting point of the transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>the target point of the transition or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>token</tt></i>:</span></td>
<td>the first input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>token2</tt></i>:</span></td>
<td>the second input string associated to that transition</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>data passed to the callback function if the transition is activated</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the target state or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAutomataSetFinalState"></a>xmlAutomataSetFinalState ()</h3>
<pre class="programlisting">int	xmlAutomataSetFinalState	(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am, <br>					 <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a> state)<br>
</pre>
<p>Makes that state a final state</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>state</tt></i>:</span></td>
<td>a state in this automata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeAutomata"></a>xmlFreeAutomata ()</h3>
<pre class="programlisting">void	xmlFreeAutomata			(<a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a> am)<br>
</pre>
<p>Free an automata</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>am</tt></i>:</span></td>
<td>an automata</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewAutomata"></a>xmlNewAutomata ()</h3>
<pre class="programlisting"><a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a>	xmlNewAutomata		(void)<br>
</pre>
<p>Create a new automata</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new object or NULL in case of failure</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-uri.html000064400000043143151730335320013454 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>uri: library of generic URI related routines</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-tree.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-valid.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">uri</span></h2>
<p>uri - library of generic URI related routines</p>
<p>library of generic URI related routines Implements RFC 2396 </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlURI <a href="#xmlURI">xmlURI</a>;
typedef <a href="libxml2-uri.html#xmlURI">xmlURI</a> * <a href="#xmlURIPtr">xmlURIPtr</a>;
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBuildRelativeURI">xmlBuildRelativeURI</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBuildURI">xmlBuildURI</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCanonicPath">xmlCanonicPath</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path);
<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	<a href="#xmlCreateURI">xmlCreateURI</a>		(void);
void	<a href="#xmlFreeURI">xmlFreeURI</a>			(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri);
int	<a href="#xmlNormalizeURIPath">xmlNormalizeURIPath</a>		(char * path);
<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	<a href="#xmlParseURI">xmlParseURI</a>		(const char * str);
<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	<a href="#xmlParseURIRaw">xmlParseURIRaw</a>		(const char * str, <br>					 int raw);
int	<a href="#xmlParseURIReference">xmlParseURIReference</a>		(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri, <br>					 const char * str);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlPathToURI">xmlPathToURI</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path);
void	<a href="#xmlPrintURI">xmlPrintURI</a>			(FILE * stream, <br>					 <a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSaveUri">xmlSaveUri</a>		(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlURIEscape">xmlURIEscape</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlURIEscapeStr">xmlURIEscapeStr</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * list);
char *	<a href="#xmlURIUnescapeString">xmlURIUnescapeString</a>		(const char * str, <br>					 int len, <br>					 char * target);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlURI">Structure </a>xmlURI</h3>
<pre class="programlisting">struct _xmlURI {
    char *	scheme	: the URI scheme
    char *	opaque	: opaque part
    char *	authority	: the authority part
    char *	server	: the server part
    char *	user	: the user part
    int	port	: the port number
    char *	path	: the path string
    char *	query	: the query string (deprecated - use with caution)
    char *	fragment	: the fragment identifier
    int	cleanup	: parsing potentially unclean URI
    char *	query_raw	: the query string (as it appears in the URI)
} xmlURI;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlURIPtr">Typedef </a>xmlURIPtr</h3>
<pre class="programlisting"><a href="libxml2-uri.html#xmlURI">xmlURI</a> * xmlURIPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBuildRelativeURI"></a>xmlBuildRelativeURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBuildRelativeURI	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base)<br>
</pre>
<p>Expresses the URI of the <a href="libxml2-SAX.html#reference">reference</a> in terms relative to the base. Some examples of this operation include: base = "http://site1.com/docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif pic1.gif http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif base = "docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif Note: if the URI <a href="libxml2-SAX.html#reference">reference</a> is really weird or complicated, it may be worthwhile to first convert it into a "nice" one by calling <a href="libxml2-uri.html#xmlBuildURI">xmlBuildURI</a> (using 'base') before calling this routine, since this routine (for reasonable efficiency) assumes URI has already been through some validation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI <a href="libxml2-SAX.html#reference">reference</a> under consideration</td>
</tr>
<tr>
<td><span class="term"><i><tt>base</tt></i>:</span></td>
<td>the base value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new URI string (to be freed by the caller) or NULL in case error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBuildURI"></a>xmlBuildURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBuildURI		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base)<br>
</pre>
<p>Computes he final URI of the <a href="libxml2-SAX.html#reference">reference</a> done by checking that the given URI is valid, and building the final URI using the base URI. This is processed according to section 5.2 of the RFC 2396 5.2. Resolving Relative References to Absolute Form</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI instance found in the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>base</tt></i>:</span></td>
<td>the base value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new URI string (to be freed by the caller) or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCanonicPath"></a>xmlCanonicPath ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCanonicPath		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path)<br>
</pre>
<p>Constructs a canonic path from the specified path.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>path</tt></i>:</span></td>
<td>the resource locator in a filesystem notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new canonic path, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateURI"></a>xmlCreateURI ()</h3>
<pre class="programlisting"><a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	xmlCreateURI		(void)<br>
</pre>
<p>Simply creates an empty <a href="libxml2-uri.html#xmlURI">xmlURI</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new structure or NULL in case of error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeURI"></a>xmlFreeURI ()</h3>
<pre class="programlisting">void	xmlFreeURI			(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri)<br>
</pre>
<p>Free up the <a href="libxml2-uri.html#xmlURI">xmlURI</a> struct</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>pointer to an <a href="libxml2-uri.html#xmlURI">xmlURI</a>
</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNormalizeURIPath"></a>xmlNormalizeURIPath ()</h3>
<pre class="programlisting">int	xmlNormalizeURIPath		(char * path)<br>
</pre>
<p>Applies the 5 normalization steps to a path string--that is, RFC 2396 Section 5.2, steps 6.c through 6.g. Normalization occurs directly on the string, no new allocation is done</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>path</tt></i>:</span></td>
<td>pointer to the path string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or an error code</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseURI"></a>xmlParseURI ()</h3>
<pre class="programlisting"><a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	xmlParseURI		(const char * str)<br>
</pre>
<p>Parse an URI based on RFC 3986 URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the URI string to analyze</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly built <a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseURIRaw"></a>xmlParseURIRaw ()</h3>
<pre class="programlisting"><a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a>	xmlParseURIRaw		(const char * str, <br>					 int raw)<br>
</pre>
<p>Parse an URI but allows to keep intact the original fragments. URI-reference = URI / relative-ref</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the URI string to analyze</td>
</tr>
<tr>
<td><span class="term"><i><tt>raw</tt></i>:</span></td>
<td>if 1 unescaping of URI pieces are disabled</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly built <a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseURIReference"></a>xmlParseURIReference ()</h3>
<pre class="programlisting">int	xmlParseURIReference		(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri, <br>					 const char * str)<br>
</pre>
<p>Parse an URI <a href="libxml2-SAX.html#reference">reference</a> string based on RFC 3986 and fills in the appropriate fields of the @uri structure URI-reference = URI / relative-ref</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>pointer to an URI structure</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string to analyze</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or the error code</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPathToURI"></a>xmlPathToURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlPathToURI		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * path)<br>
</pre>
<p>Constructs an URI expressing the existing path</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>path</tt></i>:</span></td>
<td>the resource locator in a filesystem notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new URI, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPrintURI"></a>xmlPrintURI ()</h3>
<pre class="programlisting">void	xmlPrintURI			(FILE * stream, <br>					 <a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri)<br>
</pre>
<p>Prints the URI in the stream @stream.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>a FILE* for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>pointer to an <a href="libxml2-uri.html#xmlURI">xmlURI</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveUri"></a>xmlSaveUri ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSaveUri		(<a href="libxml2-uri.html#xmlURIPtr">xmlURIPtr</a> uri)<br>
</pre>
<p>Save the URI as an escaped string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>pointer to an <a href="libxml2-uri.html#xmlURI">xmlURI</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new string (to be deallocated by caller)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlURIEscape"></a>xmlURIEscape ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlURIEscape		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Escaping routine, does not do validity checks ! It will try to escape the chars needing this, but this is heuristic based it's impossible to be sure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string of the URI to escape</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an copy of the string, but escaped 25 May 2001 Uses <a href="libxml2-uri.html#xmlParseURI">xmlParseURI</a> and <a href="libxml2-uri.html#xmlURIEscapeStr">xmlURIEscapeStr</a> to try to escape correctly according to RFC2396. - Carl Douglas</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlURIEscapeStr"></a>xmlURIEscapeStr ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlURIEscapeStr		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * list)<br>
</pre>
<p>This routine escapes a string to hex, ignoring reserved <a href="libxml2-SAX.html#characters">characters</a> (a-z) and the <a href="libxml2-SAX.html#characters">characters</a> in the exception list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>string to escape</td>
</tr>
<tr>
<td><span class="term"><i><tt>list</tt></i>:</span></td>
<td>exception list string of chars not to escape</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new escaped string or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlURIUnescapeString"></a>xmlURIUnescapeString ()</h3>
<pre class="programlisting">char *	xmlURIUnescapeString		(const char * str, <br>					 int len, <br>					 char * target)<br>
</pre>
<p>Unescaping routine, but does not check that the string is an URI. The output is a direct unsigned char translation of %XX values (no encoding) Note that the length of the result can only be smaller or same size as the input string.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string to unescape</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length in bytes to unescape (or &lt;= 0 to indicate full string)</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>optional destination buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a copy of the string, but unescaped, will return NULL only in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-parserInternals.html000064400000363527151730335320016044 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parserInternals: internals routines and limits exported by the parser.</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-parser.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-pattern.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">parserInternals</span></h2>
<p>parserInternals - internals routines and limits exported by the parser.</p>
<p>this module exports a number of internal parsing routines they are not really all intended for applications but can prove useful doing low level processing. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#INPUT_CHUNK">INPUT_CHUNK</a>;
#define <a href="#IS_ASCII_DIGIT">IS_ASCII_DIGIT</a>(c);
#define <a href="#IS_ASCII_LETTER">IS_ASCII_LETTER</a>(c);
#define <a href="#IS_BASECHAR">IS_BASECHAR</a>(c);
#define <a href="#IS_BLANK">IS_BLANK</a>(c);
#define <a href="#IS_BLANK_CH">IS_BLANK_CH</a>(c);
#define <a href="#IS_BYTE_CHAR">IS_BYTE_CHAR</a>(c);
#define <a href="#IS_CHAR">IS_CHAR</a>(c);
#define <a href="#IS_CHAR_CH">IS_CHAR_CH</a>(c);
#define <a href="#IS_COMBINING">IS_COMBINING</a>(c);
#define <a href="#IS_COMBINING_CH">IS_COMBINING_CH</a>(c);
#define <a href="#IS_DIGIT">IS_DIGIT</a>(c);
#define <a href="#IS_DIGIT_CH">IS_DIGIT_CH</a>(c);
#define <a href="#IS_EXTENDER">IS_EXTENDER</a>(c);
#define <a href="#IS_EXTENDER_CH">IS_EXTENDER_CH</a>(c);
#define <a href="#IS_IDEOGRAPHIC">IS_IDEOGRAPHIC</a>(c);
#define <a href="#IS_LETTER">IS_LETTER</a>(c);
#define <a href="#IS_LETTER_CH">IS_LETTER_CH</a>(c);
#define <a href="#IS_PUBIDCHAR">IS_PUBIDCHAR</a>(c);
#define <a href="#IS_PUBIDCHAR_CH">IS_PUBIDCHAR_CH</a>(c);
#define <a href="#MOVETO_ENDTAG">MOVETO_ENDTAG</a>(p);
#define <a href="#MOVETO_STARTTAG">MOVETO_STARTTAG</a>(p);
#define <a href="#SKIP_EOL">SKIP_EOL</a>(p);
#define <a href="#XML_MAX_DICTIONARY_LIMIT">XML_MAX_DICTIONARY_LIMIT</a>;
#define <a href="#XML_MAX_LOOKUP_LIMIT">XML_MAX_LOOKUP_LIMIT</a>;
#define <a href="#XML_MAX_NAMELEN">XML_MAX_NAMELEN</a>;
#define <a href="#XML_MAX_NAME_LENGTH">XML_MAX_NAME_LENGTH</a>;
#define <a href="#XML_MAX_TEXT_LENGTH">XML_MAX_TEXT_LENGTH</a>;
#define <a href="#XML_SUBSTITUTE_BOTH">XML_SUBSTITUTE_BOTH</a>;
#define <a href="#XML_SUBSTITUTE_NONE">XML_SUBSTITUTE_NONE</a>;
#define <a href="#XML_SUBSTITUTE_PEREF">XML_SUBSTITUTE_PEREF</a>;
#define <a href="#XML_SUBSTITUTE_REF">XML_SUBSTITUTE_REF</a>;
<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	<a href="#htmlCreateFileParserCtxt">htmlCreateFileParserCtxt</a>	(const char * filename, <br>							 const char * encoding);
void	<a href="#htmlInitAutoClose">htmlInitAutoClose</a>		(void);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#inputPop">inputPop</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#inputPush">inputPush</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> value);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#namePop">namePop</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#namePush">namePush</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#nodePop">nodePop</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#nodePush">nodePush</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> value);
int	<a href="#xmlCheckLanguageID">xmlCheckLanguageID</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * lang);
int	<a href="#xmlCopyChar">xmlCopyChar</a>			(int len, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * out, <br>					 int val);
int	<a href="#xmlCopyCharMultiByte">xmlCopyCharMultiByte</a>		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * out, <br>					 int val);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateEntityParserCtxt">xmlCreateEntityParserCtxt</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateFileParserCtxt">xmlCreateFileParserCtxt</a>	(const char * filename);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateMemoryParserCtxt">xmlCreateMemoryParserCtxt</a>	(const char * buffer, <br>							 int size);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateURLParserCtxt">xmlCreateURLParserCtxt</a>	(const char * filename, <br>						 int options);
int	<a href="#xmlCurrentChar">xmlCurrentChar</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int * len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlDecodeEntities">xmlDecodeEntities</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int len, <br>					 int what, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3);
typedef void <a href="#xmlEntityReferenceFunc">xmlEntityReferenceFunc</a>		(<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> ent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> firstNode, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> lastNode);
void	<a href="#xmlErrMemory">xmlErrMemory</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * extra);
void	<a href="#xmlFreeInputStream">xmlFreeInputStream</a>		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input);
void	<a href="#xmlHandleEntity">xmlHandleEntity</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> entity);
int	<a href="#xmlIsLetter">xmlIsLetter</a>			(int c);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNamespaceParseNCName">xmlNamespaceParseNCName</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNamespaceParseNSDef">xmlNamespaceParseNSDef</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNamespaceParseQName">xmlNamespaceParseQName</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNewEntityInputStream">xmlNewEntityInputStream</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> entity);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNewInputFromFile">xmlNewInputFromFile</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const char * filename);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNewInputStream">xmlNewInputStream</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNewStringInputStream">xmlNewStringInputStream</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buffer);
void	<a href="#xmlNextChar">xmlNextChar</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseAttValue">xmlParseAttValue</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseAttribute">xmlParseAttribute</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** value);
void	<a href="#xmlParseAttributeListDecl">xmlParseAttributeListDecl</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlParseAttributeType">xmlParseAttributeType</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> * tree);
void	<a href="#xmlParseCDSect">xmlParseCDSect</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseCharData">xmlParseCharData</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int cdata);
int	<a href="#xmlParseCharRef">xmlParseCharRef</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseComment">xmlParseComment</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseContent">xmlParseContent</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlParseDefaultDecl">xmlParseDefaultDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** value);
void	<a href="#xmlParseDocTypeDecl">xmlParseDocTypeDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseElement">xmlParseElement</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlParseElementChildrenContentDecl">xmlParseElementChildrenContentDecl</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int inputchk);
int	<a href="#xmlParseElementContentDecl">xmlParseElementContentDecl</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> * result);
int	<a href="#xmlParseElementDecl">xmlParseElementDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlParseElementMixedContentDecl">xmlParseElementMixedContentDecl</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int inputchk);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseEncName">xmlParseEncName</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseEncodingDecl">xmlParseEncodingDecl</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseEndTag">xmlParseEndTag</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseEntityDecl">xmlParseEntityDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlParseEntityRef">xmlParseEntityRef</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseEntityValue">xmlParseEntityValue</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** orig);
int	<a href="#xmlParseEnumeratedType">xmlParseEnumeratedType</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> * tree);
<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	<a href="#xmlParseEnumerationType">xmlParseEnumerationType</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseExternalID">xmlParseExternalID</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** publicID, <br>					 int strict);
void	<a href="#xmlParseExternalSubset">xmlParseExternalSubset</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
void	<a href="#xmlParseMarkupDecl">xmlParseMarkupDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseMisc">xmlParseMisc</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseName">xmlParseName</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseNamespace">xmlParseNamespace</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseNmtoken">xmlParseNmtoken</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseNotationDecl">xmlParseNotationDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	<a href="#xmlParseNotationType">xmlParseNotationType</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParsePEReference">xmlParsePEReference</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParsePI">xmlParsePI</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParsePITarget">xmlParsePITarget</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParsePubidLiteral">xmlParsePubidLiteral</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseQuotedString">xmlParseQuotedString</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseReference">xmlParseReference</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlParseSDDecl">xmlParseSDDecl</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseStartTag">xmlParseStartTag</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseSystemLiteral">xmlParseSystemLiteral</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseTextDecl">xmlParseTextDecl</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseVersionInfo">xmlParseVersionInfo</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlParseVersionNum">xmlParseVersionNum</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParseXMLDecl">xmlParseXMLDecl</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParserHandlePEReference">xmlParserHandlePEReference</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParserHandleReference">xmlParserHandleReference</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlParserInputShrink">xmlParserInputShrink</a>		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>	<a href="#xmlPopInput">xmlPopInput</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlPushInput">xmlPushInput</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlScanName">xmlScanName</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlSetEntityReferenceFunc">xmlSetEntityReferenceFunc</a>	(<a href="libxml2-parserInternals.html#xmlEntityReferenceFunc">xmlEntityReferenceFunc</a> func);
int	<a href="#xmlSkipBlankChars">xmlSkipBlankChars</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSplitQName">xmlSplitQName</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix);
int	<a href="#xmlStringCurrentChar">xmlStringCurrentChar</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int * len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStringDecodeEntities">xmlStringDecodeEntities</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int what, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStringLenDecodeEntities">xmlStringLenDecodeEntities</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 int len, <br>						 int what, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3);
int	<a href="#xmlSwitchEncoding">xmlSwitchEncoding</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
int	<a href="#xmlSwitchInputEncoding">xmlSwitchInputEncoding</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler);
int	<a href="#xmlSwitchToEncoding">xmlSwitchToEncoding</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="INPUT_CHUNK">Macro </a>INPUT_CHUNK</h3>
<pre class="programlisting">#define <a href="#INPUT_CHUNK">INPUT_CHUNK</a>;
</pre>
<p>The parser tries to always have that amount of input ready. One of the point is providing context when reporting errors.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_ASCII_DIGIT">Macro </a>IS_ASCII_DIGIT</h3>
<pre class="programlisting">#define <a href="#IS_ASCII_DIGIT">IS_ASCII_DIGIT</a>(c);
</pre>
<p>Macro to check [0-9]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_ASCII_LETTER">Macro </a>IS_ASCII_LETTER</h3>
<pre class="programlisting">#define <a href="#IS_ASCII_LETTER">IS_ASCII_LETTER</a>(c);
</pre>
<p>Macro to check [a-zA-Z]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_BASECHAR">Macro </a>IS_BASECHAR</h3>
<pre class="programlisting">#define <a href="#IS_BASECHAR">IS_BASECHAR</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [85] BaseChar ::= ... long list see REC ...</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_BLANK">Macro </a>IS_BLANK</h3>
<pre class="programlisting">#define <a href="#IS_BLANK">IS_BLANK</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [3] S ::= (#x20 | #x9 | #xD | #xA)+</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_BLANK_CH">Macro </a>IS_BLANK_CH</h3>
<pre class="programlisting">#define <a href="#IS_BLANK_CH">IS_BLANK_CH</a>(c);
</pre>
<p>Behaviour same as <a href="libxml2-parserInternals.html#IS_BLANK">IS_BLANK</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value (normally unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_BYTE_CHAR">Macro </a>IS_BYTE_CHAR</h3>
<pre class="programlisting">#define <a href="#IS_BYTE_CHAR">IS_BYTE_CHAR</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20...] any byte character in the accepted range</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an byte value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_CHAR">Macro </a>IS_CHAR</h3>
<pre class="programlisting">#define <a href="#IS_CHAR">IS_CHAR</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_CHAR_CH">Macro </a>IS_CHAR_CH</h3>
<pre class="programlisting">#define <a href="#IS_CHAR_CH">IS_CHAR_CH</a>(c);
</pre>
<p>Behaves like <a href="libxml2-parserInternals.html#IS_CHAR">IS_CHAR</a> on single-byte value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> (usually an unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_COMBINING">Macro </a>IS_COMBINING</h3>
<pre class="programlisting">#define <a href="#IS_COMBINING">IS_COMBINING</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [87] CombiningChar ::= ... long list see REC ...</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_COMBINING_CH">Macro </a>IS_COMBINING_CH</h3>
<pre class="programlisting">#define <a href="#IS_COMBINING_CH">IS_COMBINING_CH</a>(c);
</pre>
<p>Always false (all combining chars &gt; 0xff)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> (usually an unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_DIGIT">Macro </a>IS_DIGIT</h3>
<pre class="programlisting">#define <a href="#IS_DIGIT">IS_DIGIT</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [88] Digit ::= ... long list see REC ...</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_DIGIT_CH">Macro </a>IS_DIGIT_CH</h3>
<pre class="programlisting">#define <a href="#IS_DIGIT_CH">IS_DIGIT_CH</a>(c);
</pre>
<p>Behaves like <a href="libxml2-parserInternals.html#IS_DIGIT">IS_DIGIT</a> but with a single byte argument</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value (usually an unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_EXTENDER">Macro </a>IS_EXTENDER</h3>
<pre class="programlisting">#define <a href="#IS_EXTENDER">IS_EXTENDER</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_EXTENDER_CH">Macro </a>IS_EXTENDER_CH</h3>
<pre class="programlisting">#define <a href="#IS_EXTENDER_CH">IS_EXTENDER_CH</a>(c);
</pre>
<p>Behaves like <a href="libxml2-parserInternals.html#IS_EXTENDER">IS_EXTENDER</a> but with a single-byte argument</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value (usually an unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_IDEOGRAPHIC">Macro </a>IS_IDEOGRAPHIC</h3>
<pre class="programlisting">#define <a href="#IS_IDEOGRAPHIC">IS_IDEOGRAPHIC</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_LETTER">Macro </a>IS_LETTER</h3>
<pre class="programlisting">#define <a href="#IS_LETTER">IS_LETTER</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [84] Letter ::= BaseChar | Ideographic</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_LETTER_CH">Macro </a>IS_LETTER_CH</h3>
<pre class="programlisting">#define <a href="#IS_LETTER_CH">IS_LETTER_CH</a>(c);
</pre>
<p>Macro behaves like IS_LETTER, but only check base chars</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value (normally unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_PUBIDCHAR">Macro </a>IS_PUBIDCHAR</h3>
<pre class="programlisting">#define <a href="#IS_PUBIDCHAR">IS_PUBIDCHAR</a>(c);
</pre>
<p>Macro to check the following production in the XML spec: [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an UNICODE value (int)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="IS_PUBIDCHAR_CH">Macro </a>IS_PUBIDCHAR_CH</h3>
<pre class="programlisting">#define <a href="#IS_PUBIDCHAR_CH">IS_PUBIDCHAR_CH</a>(c);
</pre>
<p>Same as <a href="libxml2-parserInternals.html#IS_PUBIDCHAR">IS_PUBIDCHAR</a> but for single-byte value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> value (normally unsigned char)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="MOVETO_ENDTAG">Macro </a>MOVETO_ENDTAG</h3>
<pre class="programlisting">#define <a href="#MOVETO_ENDTAG">MOVETO_ENDTAG</a>(p);
</pre>
<p>Skips to the next '&gt;' char.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>p</tt></i>:</span></td>
<td>and UTF8 string pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="MOVETO_STARTTAG">Macro </a>MOVETO_STARTTAG</h3>
<pre class="programlisting">#define <a href="#MOVETO_STARTTAG">MOVETO_STARTTAG</a>(p);
</pre>
<p>Skips to the next '&lt;' char.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>p</tt></i>:</span></td>
<td>and UTF8 string pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="SKIP_EOL">Macro </a>SKIP_EOL</h3>
<pre class="programlisting">#define <a href="#SKIP_EOL">SKIP_EOL</a>(p);
</pre>
<p>Skips the end of line chars.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>p</tt></i>:</span></td>
<td>and UTF8 string pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_MAX_DICTIONARY_LIMIT">Macro </a>XML_MAX_DICTIONARY_LIMIT</h3>
<pre class="programlisting">#define <a href="#XML_MAX_DICTIONARY_LIMIT">XML_MAX_DICTIONARY_LIMIT</a>;
</pre>
<p>Maximum size allowed by the parser for a dictionary by default This is not a limitation of the parser but a safety boundary feature, use <a href="libxml2-parser.html#XML_PARSE_HUGE">XML_PARSE_HUGE</a> option to override it. Introduced in 2.9.0</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_MAX_LOOKUP_LIMIT">Macro </a>XML_MAX_LOOKUP_LIMIT</h3>
<pre class="programlisting">#define <a href="#XML_MAX_LOOKUP_LIMIT">XML_MAX_LOOKUP_LIMIT</a>;
</pre>
<p>Maximum size allowed by the parser for ahead lookup This is an upper boundary enforced by the parser to avoid bad behaviour on "unfriendly' content Introduced in 2.9.0</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_MAX_NAMELEN">Macro </a>XML_MAX_NAMELEN</h3>
<pre class="programlisting">#define <a href="#XML_MAX_NAMELEN">XML_MAX_NAMELEN</a>;
</pre>
<p>Identifiers can be longer, but this will be more costly at runtime.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_MAX_NAME_LENGTH">Macro </a>XML_MAX_NAME_LENGTH</h3>
<pre class="programlisting">#define <a href="#XML_MAX_NAME_LENGTH">XML_MAX_NAME_LENGTH</a>;
</pre>
<p>Maximum size allowed for a markup identifier. This is not a limitation of the parser but a safety boundary feature, use <a href="libxml2-parser.html#XML_PARSE_HUGE">XML_PARSE_HUGE</a> option to override it. Note that with the use of parsing dictionaries overriding the limit may result in more runtime memory usage in face of "unfriendly' content Introduced in 2.9.0</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_MAX_TEXT_LENGTH">Macro </a>XML_MAX_TEXT_LENGTH</h3>
<pre class="programlisting">#define <a href="#XML_MAX_TEXT_LENGTH">XML_MAX_TEXT_LENGTH</a>;
</pre>
<p>Maximum size allowed for a single text node when building a tree. This is not a limitation of the parser but a safety boundary feature, use <a href="libxml2-parser.html#XML_PARSE_HUGE">XML_PARSE_HUGE</a> option to override it. Introduced in 2.9.0</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SUBSTITUTE_BOTH">Macro </a>XML_SUBSTITUTE_BOTH</h3>
<pre class="programlisting">#define <a href="#XML_SUBSTITUTE_BOTH">XML_SUBSTITUTE_BOTH</a>;
</pre>
<p>Both general and parameter entities need to be substituted.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SUBSTITUTE_NONE">Macro </a>XML_SUBSTITUTE_NONE</h3>
<pre class="programlisting">#define <a href="#XML_SUBSTITUTE_NONE">XML_SUBSTITUTE_NONE</a>;
</pre>
<p>If no entities need to be substituted.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SUBSTITUTE_PEREF">Macro </a>XML_SUBSTITUTE_PEREF</h3>
<pre class="programlisting">#define <a href="#XML_SUBSTITUTE_PEREF">XML_SUBSTITUTE_PEREF</a>;
</pre>
<p>Whether parameter entities need to be substituted.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SUBSTITUTE_REF">Macro </a>XML_SUBSTITUTE_REF</h3>
<pre class="programlisting">#define <a href="#XML_SUBSTITUTE_REF">XML_SUBSTITUTE_REF</a>;
</pre>
<p>Whether general entities need to be substituted.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntityReferenceFunc"></a>Function type xmlEntityReferenceFunc</h3>
<pre class="programlisting">void	xmlEntityReferenceFunc		(<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> ent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> firstNode, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> lastNode)<br>
</pre>
<p>Callback function used when one needs to be able to track back the provenance of a chunk of nodes inherited from an entity replacement.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ent</tt></i>:</span></td>
<td>the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>firstNode</tt></i>:</span></td>
<td>the fist node in the chunk</td>
</tr>
<tr>
<td><span class="term"><i><tt>lastNode</tt></i>:</span></td>
<td>the last nod in the chunk</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserMaxDepth">Variable </a>xmlParserMaxDepth</h3>
<pre class="programlisting">unsigned int xmlParserMaxDepth;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringComment">Variable </a>xmlStringComment</h3>
<pre class="programlisting">const xmlCharxmlStringComment[] xmlStringComment;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringText">Variable </a>xmlStringText</h3>
<pre class="programlisting">const xmlCharxmlStringText[] xmlStringText;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringTextNoenc">Variable </a>xmlStringTextNoenc</h3>
<pre class="programlisting">const xmlCharxmlStringTextNoenc[] xmlStringTextNoenc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCreateFileParserCtxt"></a>htmlCreateFileParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	htmlCreateFileParserCtxt	(const char * filename, <br>							 const char * encoding)<br>
</pre>
<p>Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>a free form C string describing the HTML document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlInitAutoClose"></a>htmlInitAutoClose ()</h3>
<pre class="programlisting">void	htmlInitAutoClose		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. This is a no-op now.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="inputPop"></a>inputPop ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	inputPop	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Pops the top parser input from the input stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the input just removed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="inputPush"></a>inputPush ()</h3>
<pre class="programlisting">int	inputPush			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> value)<br>
</pre>
<p>Pushes a new parser input on top of the input stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, the index in the stack otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="namePop"></a>namePop ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	namePop			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Pops the top element name from the name stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the name just removed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="namePush"></a>namePush ()</h3>
<pre class="programlisting">int	namePush			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Pushes a new element name on top of the name stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, the index in the stack otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="nodePop"></a>nodePop ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	nodePop			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Pops the top element node from the node stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the node just removed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="nodePush"></a>nodePush ()</h3>
<pre class="programlisting">int	nodePush			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> value)<br>
</pre>
<p>Pushes a new element node on top of the node stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the element node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, the index in the stack otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCheckLanguageID"></a>xmlCheckLanguageID ()</h3>
<pre class="programlisting">int	xmlCheckLanguageID		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * lang)<br>
</pre>
<p>Checks that the value conforms to the LanguageID production: NOTE: this is somewhat deprecated, those productions were removed from the XML Second edition. [33] LanguageID ::= Langcode ('-' Subcode)* [34] Langcode ::= ISO639Code | IanaCode | UserCode [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ [38] Subcode ::= ([a-z] | [A-Z])+ The current REC <a href="libxml2-SAX.html#reference">reference</a> the successors of RFC 1766, currently 5646 http://www.rfc-editor.org/rfc/rfc5646.txt langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by ; extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag extlang = 3ALPHA ; selected ISO 639 codes *2("-" 3ALPHA) ; permanently reserved script = 4ALPHA ; ISO 15924 code region = 2ALPHA ; ISO 3166-1 code / 3DIGIT ; UN M.49 code variant = 5*8alphanum ; registered variants / (DIGIT 3alphanum) extension = singleton 1*("-" (2*8alphanum)) ; Single alphanumerics ; "x" reserved for private use singleton = DIGIT ; 0 - 9 / %x41-57 ; A - W / %x59-5A ; Y - Z / %x61-77 ; a - w / %x79-7A ; y - z it sounds right to still allow Irregular i-xxx IANA and user codes too The parser below doesn't try to cope with extension or privateuse that could be added but that's not interoperable anyway</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>lang</tt></i>:</span></td>
<td>pointer to the string value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if correct 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyChar"></a>xmlCopyChar ()</h3>
<pre class="programlisting">int	xmlCopyChar			(int len, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * out, <br>					 int val)<br>
</pre>
<p>append the char value in the array</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>Ignored, compatibility</td>
</tr>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the char value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> written</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyCharMultiByte"></a>xmlCopyCharMultiByte ()</h3>
<pre class="programlisting">int	xmlCopyCharMultiByte		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * out, <br>					 int val)<br>
</pre>
<p>append the char value in the array</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the char value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> written</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateEntityParserCtxt"></a>xmlCreateEntityParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateEntityParserCtxt	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * base)<br>
</pre>
<p>Create a parser context for an external entity Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the entity URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the entity PUBLIC ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>base</tt></i>:</span></td>
<td>a possible base for the target URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateFileParserCtxt"></a>xmlCreateFileParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateFileParserCtxt	(const char * filename)<br>
</pre>
<p>Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateMemoryParserCtxt"></a>xmlCreateMemoryParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateMemoryParserCtxt	(const char * buffer, <br>							 int size)<br>
</pre>
<p>Create a parser context for an XML in-memory document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateURLParserCtxt"></a>xmlCreateURLParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateURLParserCtxt	(const char * filename, <br>						 int options)<br>
</pre>
<p>Create a parser context for a file or URL content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time and for file accesses</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCurrentChar"></a>xmlCurrentChar ()</h3>
<pre class="programlisting">int	xmlCurrentChar			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int * len)<br>
</pre>
<p>The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer. Implement the end of line normalization: 2.11 End-of-Line Handling Wherever an external parsed entity or the literal entity value of an internal parsed entity contains either the literal two-character sequence "#xD#xA" or a standalone literal #xD, an XML processor must pass to the application the single character #xA. This behavior can conveniently be produced by normalizing all line breaks to #xA on input, before parsing.)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>pointer to the length of the char read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current char value and its length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDecodeEntities"></a>xmlDecodeEntities ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlDecodeEntities	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int len, <br>					 int what, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3)<br>
</pre>
<p>This function is deprecated, we now always process entities content through <a href="libxml2-parserInternals.html#xmlStringDecodeEntities">xmlStringDecodeEntities</a> TODO: remove it in next major release. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the len to decode (in bytes !), -1 for no size limit</td>
</tr>
<tr>
<td><span class="term"><i><tt>what</tt></i>:</span></td>
<td>combination of <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_REF">XML_SUBSTITUTE_REF</a> and <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_PEREF">XML_SUBSTITUTE_PEREF</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end2</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end3</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>A newly allocated string with the substitution done. The caller must deallocate it !</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlErrMemory"></a>xmlErrMemory ()</h3>
<pre class="programlisting">void	xmlErrMemory			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * extra)<br>
</pre>
<p>Handle a redefinition of <a href="libxml2-SAX.html#attribute">attribute</a> error</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>extra</tt></i>:</span></td>
<td>extra information</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeInputStream"></a>xmlFreeInputStream ()</h3>
<pre class="programlisting">void	xmlFreeInputStream		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input)<br>
</pre>
<p>Free up an input stream.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>
</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHandleEntity"></a>xmlHandleEntity ()</h3>
<pre class="programlisting">void	xmlHandleEntity			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> entity)<br>
</pre>
<p>Default handling of defined entities, when should we define a new input stream ? When do we just handle that as a set of chars ? OBSOLETE: to be removed at some point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>entity</tt></i>:</span></td>
<td>an XML entity pointer.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsLetter"></a>xmlIsLetter ()</h3>
<pre class="programlisting">int	xmlIsLetter			(int c)<br>
</pre>
<p>Check whether the character is allowed by the production [84] Letter ::= BaseChar | Ideographic</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>an unicode character (int)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if not, non-zero otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNamespaceParseNCName"></a>xmlNamespaceParseNCName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNamespaceParseNCName	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML namespace name. TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace name or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNamespaceParseNSDef"></a>xmlNamespaceParseNSDef ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNamespaceParseNSDef	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a namespace prefix declaration TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 1] NSDef ::= PrefixDef Eq SystemLiteral [NS 2] PrefixDef ::= 'xmlns' (':' NCName)?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNamespaceParseQName"></a>xmlNamespaceParseQName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNamespaceParseQName	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix)<br>
</pre>
<p>TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. parse an XML qualified name [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> **</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local part, and prefix is updated to get the Prefix if any.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewEntityInputStream"></a>xmlNewEntityInputStream ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNewEntityInputStream	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> entity)<br>
</pre>
<p>Create a new input stream based on an <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>entity</tt></i>:</span></td>
<td>an Entity pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new input stream or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewInputFromFile"></a>xmlNewInputFromFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNewInputFromFile	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const char * filename)<br>
</pre>
<p>Create a new input stream based on a file or an URL.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename to use as entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new input stream or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewInputStream"></a>xmlNewInputStream ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNewInputStream	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Create a new input stream structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new input stream or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewStringInputStream"></a>xmlNewStringInputStream ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNewStringInputStream	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buffer)<br>
</pre>
<p>Create a new input stream based on a memory buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an memory buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new input stream</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNextChar"></a>xmlNextChar ()</h3>
<pre class="programlisting">void	xmlNextChar			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Skip to the next char input char.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseAttValue"></a>xmlParseAttValue ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseAttValue	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a value for an <a href="libxml2-SAX.html#attribute">attribute</a> Note: the parser won't do substitution of entities here, this will be handled later in <a href="libxml2-tree.html#xmlStringGetNodeList">xmlStringGetNodeList</a> [10] AttValue ::= '"' ([^&lt;&amp;"] | Reference)* '"' | "'" ([^&lt;&amp;'] | Reference)* "'" 3.3.3 Attribute-Value Normalization: Before the value of an <a href="libxml2-SAX.html#attribute">attribute</a> is passed to the application or checked for validity, the XML processor must normalize it as follows: - a character <a href="libxml2-SAX.html#reference">reference</a> is processed by appending the referenced character to the <a href="libxml2-SAX.html#attribute">attribute</a> value - an entity <a href="libxml2-SAX.html#reference">reference</a> is processed by recursively processing the replacement text of the entity - a whitespace character (#x20, #xD, #xA, #x9) is processed by appending #x20 to the normalized value, except that only a single #x20 is appended for a "#xD#xA" sequence that is part of an external parsed entity or the literal entity value of an internal parsed entity - other <a href="libxml2-SAX.html#characters">characters</a> are processed by appending them to the normalized value If the declared value is not CDATA, then the XML processor must further process the normalized <a href="libxml2-SAX.html#attribute">attribute</a> value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) <a href="libxml2-SAX.html#characters">characters</a> by a single space (#x20) character. All attributes for which no declaration has been read should be treated by a non-validating parser as if declared CDATA.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the AttValue parsed or NULL. The value has to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseAttribute"></a>xmlParseAttribute ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseAttribute	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** value)<br>
</pre>
<p>parse an <a href="libxml2-SAX.html#attribute">attribute</a> [41] Attribute ::= Name Eq AttValue [ WFC: No External Entity References ] Attribute values cannot contain direct or indirect entity references to external entities. [ WFC: No &lt; in Attribute Values ] The replacement text of any entity referred to directly or indirectly in an <a href="libxml2-SAX.html#attribute">attribute</a> value (other than "&amp;lt;") must not contain a &lt;. [ VC: Attribute Value Type ] The <a href="libxml2-SAX.html#attribute">attribute</a> must have been declared; the value must be of the type declared for it. [25] Eq ::= S? '=' S? With namespace: [NS 11] Attribute ::= QName Eq AttValue Also the case QName == xmlns:??? is handled independently as a namespace definition.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** used to store the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name, and the value in *value.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseAttributeListDecl"></a>xmlParseAttributeListDecl ()</h3>
<pre class="programlisting">void	xmlParseAttributeListDecl	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>: parse the Attribute list def for an element [52] AttlistDecl ::= '&lt;!ATTLIST' S Name AttDef* S? '&gt;' [53] AttDef ::= S Name S AttType S DefaultDecl</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseAttributeType"></a>xmlParseAttributeType ()</h3>
<pre class="programlisting">int	xmlParseAttributeType		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> * tree)<br>
</pre>
<p>parse the Attribute list def for an element [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' Validity constraints for <a href="libxml2-SAX.html#attribute">attribute</a> values syntax are checked in xmlValidateAttributeValue() [ VC: ID ] Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them. [ VC: One ID per Element Type ] No element type may have more than one ID <a href="libxml2-SAX.html#attribute">attribute</a> specified. [ VC: ID Attribute Default ] An ID <a href="libxml2-SAX.html#attribute">attribute</a> must have a declared default of #IMPLIED or #REQUIRED. [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names; each IDREF Name must match the value of an ID <a href="libxml2-SAX.html#attribute">attribute</a> on some element in the XML document; i.e. IDREF values must match the value of some ID attribute. [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names; each Entity Name must match the name of an unparsed entity declared in the DTD. [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the enumeration tree built while parsing</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCDSect"></a>xmlParseCDSect ()</h3>
<pre class="programlisting">void	xmlParseCDSect			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Parse escaped pure raw content. [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '&lt;![CDATA[' [20] Data ::= (Char* - (Char* ']]&gt;' Char*)) [21] CDEnd ::= ']]&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCharData"></a>xmlParseCharData ()</h3>
<pre class="programlisting">void	xmlParseCharData		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int cdata)<br>
</pre>
<p>parse a CharData section. if we are within a CDATA section ']]&gt;' marks an end of section. The right angle bracket (&gt;) may be represented using the string "&amp;gt;", and must, for compatibility, be escaped using "&amp;gt;" or a character <a href="libxml2-SAX.html#reference">reference</a> when it appears in the string "]]&gt;" in content, when that string is not marking the end of a CDATA section. [14] CharData ::= [^&lt;&amp;]* - ([^&lt;&amp;]* ']]&gt;' [^&lt;&amp;]*)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cdata</tt></i>:</span></td>
<td>int indicating whether we are within a CDATA section</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCharRef"></a>xmlParseCharRef ()</h3>
<pre class="programlisting">int	xmlParseCharRef			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse Reference declarations [66] CharRef ::= '&amp;#' [0-9]+ ';' | '&amp;#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] Characters referred to using character references must match the production for Char.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value parsed (as an int), 0 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseComment"></a>xmlParseComment ()</h3>
<pre class="programlisting">void	xmlParseComment			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Skip an XML (SGML) <a href="libxml2-SAX.html#comment">comment</a> &lt;!-- .... --&gt; The spec says that "For compatibility, the string "--" (double-hyphen) must not occur within comments. " [15] Comment ::= '&lt;!--' ((Char - '-') | ('-' (Char - '-')))* '--&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseContent"></a>xmlParseContent ()</h3>
<pre class="programlisting">void	xmlParseContent			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Parse a content sequence. Stops at EOF or '&lt;/'. [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseDefaultDecl"></a>xmlParseDefaultDecl ()</h3>
<pre class="programlisting">int	xmlParseDefaultDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** value)<br>
</pre>
<p>Parse an <a href="libxml2-SAX.html#attribute">attribute</a> default declaration [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) [ VC: Required Attribute ] if the default declaration is the keyword #REQUIRED, then the <a href="libxml2-SAX.html#attribute">attribute</a> must be specified for all elements of the type in the attribute-list declaration. [ VC: Attribute Default Legal ] The declared default value must meet the lexical constraints of the declared <a href="libxml2-SAX.html#attribute">attribute</a> type c.f. xmlValidateAttributeDecl() [ VC: Fixed Attribute Default ] if an <a href="libxml2-SAX.html#attribute">attribute</a> has a default value declared with the #FIXED keyword, instances of that <a href="libxml2-SAX.html#attribute">attribute</a> must match the default value. [ WFC: No &lt; in Attribute Values ] handled in xmlParseAttValue()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>Receive a possible fixed default value for the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, <a href="libxml2-tree.html#XML_ATTRIBUTE_IMPLIED">XML_ATTRIBUTE_IMPLIED</a> or XML_ATTRIBUTE_FIXED.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseDocTypeDecl"></a>xmlParseDocTypeDecl ()</h3>
<pre class="programlisting">void	xmlParseDocTypeDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a DOCTYPE declaration [28] doctypedecl ::= '&lt;!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '&gt;' [ VC: Root Element Type ] The Name in the document type declaration must match the element type of the root element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseElement"></a>xmlParseElement ()</h3>
<pre class="programlisting">void	xmlParseElement			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML element [39] element ::= EmptyElemTag | STag content ETag [ WFC: Element Type Match ] The Name in an element's end-tag must match the element type in the start-tag.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseElementChildrenContentDecl"></a>xmlParseElementChildrenContentDecl ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlParseElementChildrenContentDecl	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int inputchk)<br>
</pre>
<p>parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in <a href="libxml2-parserInternals.html#xmlParseElementContentDecl">xmlParseElementContentDecl</a> [47] children ::= (choice | seq) ('?' | '*' | '+')? [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: Proper Group/PE Nesting ] applies to [49] and [50] TODO Parameter-entity replacement text must be properly nested with parenthesized groups. That is to say, if either of the opening or closing parentheses in a choice, seq, or Mixed construct is contained in the replacement text for a parameter entity, both must be contained in the same replacement text. For interoperability, if a parameter-entity <a href="libxml2-SAX.html#reference">reference</a> appears in a choice, seq, or Mixed construct, its replacement text should not be empty, and neither the first nor last non-blank character of the replacement text should be a connector (| or ,).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>inputchk</tt></i>:</span></td>
<td>the input used for the current entity, needed for boundary checks</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the tree of <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> describing the element hierarchy.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseElementContentDecl"></a>xmlParseElementContentDecl ()</h3>
<pre class="programlisting">int	xmlParseElementContentDecl	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> * result)<br>
</pre>
<p>parse the declaration for an Element content either Mixed or Children, the cases EMPTY and ANY are handled directly in <a href="libxml2-parserInternals.html#xmlParseElementDecl">xmlParseElementDecl</a> [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the element being defined.</td>
</tr>
<tr>
<td><span class="term"><i><tt>result</tt></i>:</span></td>
<td>the Element Content pointer will be stored here if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the type of element content XML_ELEMENT_TYPE_xxx</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseElementDecl"></a>xmlParseElementDecl ()</h3>
<pre class="programlisting">int	xmlParseElementDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an Element declaration. [45] elementdecl ::= '&lt;!ELEMENT' S Name S contentspec S? '&gt;' [ VC: Unique Element Type Declaration ] No element type may be declared more than once</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the type of the element, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseElementMixedContentDecl"></a>xmlParseElementMixedContentDecl ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlParseElementMixedContentDecl	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>							 int inputchk)<br>
</pre>
<p>parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in <a href="libxml2-parserInternals.html#xmlParseElementContentDecl">xmlParseElementContentDecl</a> [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) [ VC: No Duplicate Types ] The same name must not appear more than once in a single mixed-content declaration.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>inputchk</tt></i>:</span></td>
<td>the input used for the current entity, needed for boundary checks</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the list of the <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> describing the element choices</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEncName"></a>xmlParseEncName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseEncName		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the XML encoding name [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the encoding name value or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEncodingDecl"></a>xmlParseEncodingDecl ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseEncodingDecl	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the XML encoding declaration [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") this setups the conversion filters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the encoding value or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEndTag"></a>xmlParseEndTag ()</h3>
<pre class="programlisting">void	xmlParseEndTag			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an end of tag [42] ETag ::= '&lt;/' Name S? '&gt;' With namespace [NS 9] ETag ::= '&lt;/' QName S? '&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEntityDecl"></a>xmlParseEntityDecl ()</h3>
<pre class="programlisting">void	xmlParseEntityDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse &lt;!ENTITY declarations [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= '&lt;!ENTITY' S Name S EntityDef S? '&gt;' [72] PEDecl ::= '&lt;!ENTITY' S '%' S Name S PEDef S? '&gt;' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation Declared ] The Name must match the declared name of a notation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEntityRef"></a>xmlParseEntityRef ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlParseEntityRef	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse ENTITY references declarations [68] EntityRef ::= '&amp;' Name ';' [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", the Name given in the entity <a href="libxml2-SAX.html#reference">reference</a> must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. The declaration of a parameter entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it. Similarly, the declaration of a general entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it which appears in a default value in an attribute-list declaration. Note that if entities are declared in the external subset or in external parameter entities, a non-validating processor is not obligated to read and process their declarations; for such documents, the rule that an entity must be declared is a well-formedness constraint only if standalone='yes'. [ WFC: Parsed Entity ] An entity <a href="libxml2-SAX.html#reference">reference</a> must not contain the name of an unparsed entity</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found, or NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEntityValue"></a>xmlParseEntityValue ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseEntityValue	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** orig)<br>
</pre>
<p>parse a value for ENTITY declarations [9] EntityValue ::= '"' ([^%&amp;"] | PEReference | Reference)* '"' | "'" ([^%&amp;'] | PEReference | Reference)* "'"</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>orig</tt></i>:</span></td>
<td>if non-NULL store a copy of the original entity value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the EntityValue parsed with <a href="libxml2-SAX.html#reference">reference</a> substituted or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEnumeratedType"></a>xmlParseEnumeratedType ()</h3>
<pre class="programlisting">int	xmlParseEnumeratedType		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> * tree)<br>
</pre>
<p>parse an Enumerated <a href="libxml2-SAX.html#attribute">attribute</a> type. [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the enumeration tree built while parsing</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>
<a href="libxml2-tree.html#XML_ATTRIBUTE_ENUMERATION">XML_ATTRIBUTE_ENUMERATION</a> or <a href="libxml2-tree.html#XML_ATTRIBUTE_NOTATION">XML_ATTRIBUTE_NOTATION</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEnumerationType"></a>xmlParseEnumerationType ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	xmlParseEnumerationType	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an Enumeration <a href="libxml2-SAX.html#attribute">attribute</a> type. [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: Enumeration ] Values of this type must match one of the Nmtoken tokens in the declaration</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the enumeration <a href="libxml2-SAX.html#attribute">attribute</a> tree built while parsing</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseExternalID"></a>xmlParseExternalID ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseExternalID	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** publicID, <br>					 int strict)<br>
</pre>
<p>Parse an External ID or a Public ID NOTE: Productions [75] and [83] interact badly since [75] can generate 'PUBLIC' S PubidLiteral S SystemLiteral [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral [83] PublicID ::= 'PUBLIC' S PubidLiteral</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicID</tt></i>:</span></td>
<td>a xmlChar** receiving PubidLiteral</td>
</tr>
<tr>
<td><span class="term"><i><tt>strict</tt></i>:</span></td>
<td>indicate whether we should restrict parsing to only production [75], see NOTE below</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the function returns SystemLiteral and in the second case publicID receives PubidLiteral, is strict is off it is possible to return NULL and have publicID set.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseExternalSubset"></a>xmlParseExternalSubset ()</h3>
<pre class="programlisting">void	xmlParseExternalSubset		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>parse Markup declarations from an external subset [30] extSubset ::= textDecl? extSubsetDecl [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) *</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the system identifier (or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseMarkupDecl"></a>xmlParseMarkupDecl ()</h3>
<pre class="programlisting">void	xmlParseMarkupDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse Markup declarations [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: Proper Declaration/PE Nesting ] Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text. [ WFC: PEs in Internal Subset ] In the internal DTD subset, parameter-entity references can occur only where markup declarations can occur, not within markup declarations. (This does not apply to references that occur in external parameter entities or to the external subset.)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseMisc"></a>xmlParseMisc ()</h3>
<pre class="programlisting">void	xmlParseMisc			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML Misc* optional field. [27] Misc ::= Comment | PI | S</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseName"></a>xmlParseName ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseName		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML name. [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (#x20 Name)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the Name parsed or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseNamespace"></a>xmlParseNamespace ()</h3>
<pre class="programlisting">void	xmlParseNamespace		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>xmlParseNamespace: parse specific PI '&lt;?namespace ...' constructs. This is what the older xml-name Working Draft specified, a bunch of other stuff may still rely on it, so support is still here as if it was declared on the root of the Tree:-( TODO: remove from library To be removed at next drop of binary compatibility</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseNmtoken"></a>xmlParseNmtoken ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseNmtoken		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML Nmtoken. [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the Nmtoken parsed or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseNotationDecl"></a>xmlParseNotationDecl ()</h3>
<pre class="programlisting">void	xmlParseNotationDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a notation declaration [82] NotationDecl ::= '&lt;!NOTATION' S Name S (ExternalID | PublicID) S? '&gt;' Hence there is actually 3 choices: 'PUBLIC' S PubidLiteral 'PUBLIC' S PubidLiteral S SystemLiteral and 'SYSTEM' S SystemLiteral See the NOTE on xmlParseExternalID().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseNotationType"></a>xmlParseNotationType ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	xmlParseNotationType	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an Notation <a href="libxml2-SAX.html#attribute">attribute</a> type. Note: the leading 'NOTATION' S part has already being parsed... [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: Notation Attributes ] Values of this type must match one of the notation names included in the declaration; all notation names in the declaration must be declared.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the notation <a href="libxml2-SAX.html#attribute">attribute</a> tree built while parsing</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParsePEReference"></a>xmlParsePEReference ()</h3>
<pre class="programlisting">void	xmlParsePEReference		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse PEReference declarations The entity content is handled directly by pushing it's content as a new input stream. [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive <a href="libxml2-SAX.html#reference">reference</a> to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParsePI"></a>xmlParsePI ()</h3>
<pre class="programlisting">void	xmlParsePI			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML Processing Instruction. [16] PI ::= '&lt;?' PITarget (S (Char* - (Char* '?&gt;' Char*)))? '?&gt;' The processing is transferred to SAX once parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParsePITarget"></a>xmlParsePITarget ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParsePITarget	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the name of a PI [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the PITarget name or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParsePubidLiteral"></a>xmlParsePubidLiteral ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParsePubidLiteral	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML public literal [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the PubidLiteral parsed or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseQuotedString"></a>xmlParseQuotedString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseQuotedString	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Parse and return a string between quotes or doublequotes TODO: Deprecated, to be removed at next drop of binary compatibility</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string parser or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseReference"></a>xmlParseReference ()</h3>
<pre class="programlisting">void	xmlParseReference		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse and handle entity references in content, depending on the SAX interface, this may end-up in a call to character() if this is a CharRef, a predefined entity, if there is no reference() callback. or if the parser was asked to switch to that mode. [67] Reference ::= EntityRef | CharRef</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseSDDecl"></a>xmlParseSDDecl ()</h3>
<pre class="programlisting">int	xmlParseSDDecl			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the XML standalone declaration [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) [ VC: Standalone Document Declaration ] TODO The standalone document declaration must have the value "no" if any external markup declarations contain declarations of: - attributes with default values, if elements to which these attributes apply appear in the document without specifications of values for these attributes, or - entities (other than amp, lt, gt, apos, quot), if references to those entities appear in the document, or - attributes with values subject to normalization, where the <a href="libxml2-SAX.html#attribute">attribute</a> appears in the document with a value which will change as a result of normalization, or - element types with element content, if white space occurs directly within any instance of those types.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if standalone="yes" 0 if standalone="no" -2 if standalone <a href="libxml2-SAX.html#attribute">attribute</a> is missing or invalid (A standalone value of -2 means that the XML declaration was found, but no value was specified for the standalone attribute).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseStartTag"></a>xmlParseStartTag ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseStartTag	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a start of tag either for rule element or EmptyElement. In both case we don't parse the tag closing chars. [40] STag ::= '&lt;' Name (S Attribute)* S? '&gt;' [ WFC: Unique Att Spec ] No <a href="libxml2-SAX.html#attribute">attribute</a> name may appear more than once in the same start-tag or empty-element tag. [44] EmptyElemTag ::= '&lt;' Name (S Attribute)* S? '/&gt;' [ WFC: Unique Att Spec ] No <a href="libxml2-SAX.html#attribute">attribute</a> name may appear more than once in the same start-tag or empty-element tag. With namespace: [NS 8] STag ::= '&lt;' QName (S Attribute)* S? '&gt;' [NS 10] EmptyElement ::= '&lt;' QName (S Attribute)* S? '/&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the element name parsed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseSystemLiteral"></a>xmlParseSystemLiteral ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseSystemLiteral	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML Literal [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the SystemLiteral parsed or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseTextDecl"></a>xmlParseTextDecl ()</h3>
<pre class="programlisting">void	xmlParseTextDecl		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML declaration header for external entities [77] TextDecl ::= '&lt;?xml' VersionInfo? EncodingDecl S? '?&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseVersionInfo"></a>xmlParseVersionInfo ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseVersionInfo	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the XML version. [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [25] Eq ::= S? '=' S?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the version string, e.g. "1.0"</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseVersionNum"></a>xmlParseVersionNum ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlParseVersionNum	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse the XML version value. [26] VersionNum ::= '1.' [0-9]+ In practice allow [0-9].[0-9]+ at that level</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string giving the XML version number, or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseXMLDecl"></a>xmlParseXMLDecl ()</h3>
<pre class="programlisting">void	xmlParseXMLDecl			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML declaration header [23] XMLDecl ::= '&lt;?xml' VersionInfo EncodingDecl? SDDecl? S? '?&gt;'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserHandlePEReference"></a>xmlParserHandlePEReference ()</h3>
<pre class="programlisting">void	xmlParserHandlePEReference	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>[69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive <a href="libxml2-SAX.html#reference">reference</a> to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any <a href="libxml2-SAX.html#reference">reference</a> to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled. A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc i.e. - Included in literal in entity values - Included as Parameter Entity <a href="libxml2-SAX.html#reference">reference</a> within DTDs</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserHandleReference"></a>xmlParserHandleReference ()</h3>
<pre class="programlisting">void	xmlParserHandleReference	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>TODO: Remove, now deprecated ... the test is done directly in the content parsing routines. [67] Reference ::= EntityRef | CharRef [68] EntityRef ::= '&amp;' Name ';' [ WFC: Entity Declared ] the Name given in the entity <a href="libxml2-SAX.html#reference">reference</a> must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. [ WFC: Parsed Entity ] An entity <a href="libxml2-SAX.html#reference">reference</a> must not contain the name of an unparsed entity [66] CharRef ::= '&amp;#' [0-9]+ ';' | '&amp;#x' [0-9a-fA-F]+ ';' A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputShrink"></a>xmlParserInputShrink ()</h3>
<pre class="programlisting">void	xmlParserInputShrink		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in)<br>
</pre>
<p>This function removes used input for the parser.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an XML parser input</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPopInput"></a>xmlPopInput ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>	xmlPopInput			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>xmlPopInput: the current input pointed by ctxt-&gt;input came to an end pop it and return the next char.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> in the parser context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPushInput"></a>xmlPushInput ()</h3>
<pre class="programlisting">int	xmlPushInput			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input)<br>
</pre>
<p>xmlPushInput: switch to a new input stream which is stacked on top of the previous one(s).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an XML parser input fragment (entity, XML fragment ...).</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error or the index in the input stack</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlScanName"></a>xmlScanName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlScanName		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Trickery: parse an XML name but without consuming the input flow Needed for rollback cases. Used only when parsing entities references. TODO: seems deprecated now, only used in the default part of <a href="libxml2-parserInternals.html#xmlParserHandleReference">xmlParserHandleReference</a> [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the Name parsed or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetEntityReferenceFunc"></a>xmlSetEntityReferenceFunc ()</h3>
<pre class="programlisting">void	xmlSetEntityReferenceFunc	(<a href="libxml2-parserInternals.html#xmlEntityReferenceFunc">xmlEntityReferenceFunc</a> func)<br>
</pre>
<p>Set the function to call call back when a xml <a href="libxml2-SAX.html#reference">reference</a> has been made</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>A valid function</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSkipBlankChars"></a>xmlSkipBlankChars ()</h3>
<pre class="programlisting">int	xmlSkipBlankChars		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>skip all blanks character found at that point in the input streams. It pops up finished entities in the process if allowable at that point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of space chars skipped</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSplitQName"></a>xmlSplitQName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSplitQName		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix)<br>
</pre>
<p>parse an UTF8 encoded XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> **</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local part, and prefix is updated to get the Prefix if any.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringCurrentChar"></a>xmlStringCurrentChar ()</h3>
<pre class="programlisting">int	xmlStringCurrentChar		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int * len)<br>
</pre>
<p>The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>pointer to the beginning of the char</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>pointer to the length of the char read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current char value and its length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringDecodeEntities"></a>xmlStringDecodeEntities ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStringDecodeEntities	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int what, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3)<br>
</pre>
<p>Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the input string</td>
</tr>
<tr>
<td><span class="term"><i><tt>what</tt></i>:</span></td>
<td>combination of <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_REF">XML_SUBSTITUTE_REF</a> and <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_PEREF">XML_SUBSTITUTE_PEREF</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end2</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end3</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>A newly allocated string with the substitution done. The caller must deallocate it !</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringLenDecodeEntities"></a>xmlStringLenDecodeEntities ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStringLenDecodeEntities	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 int len, <br>						 int what, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end2, <br>						 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> end3)<br>
</pre>
<p>Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the input string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the string length</td>
</tr>
<tr>
<td><span class="term"><i><tt>what</tt></i>:</span></td>
<td>combination of <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_REF">XML_SUBSTITUTE_REF</a> and <a href="libxml2-parserInternals.html#XML_SUBSTITUTE_PEREF">XML_SUBSTITUTE_PEREF</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end2</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>end3</tt></i>:</span></td>
<td>an end marker xmlChar, 0 if none</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>A newly allocated string with the substitution done. The caller must deallocate it !</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSwitchEncoding"></a>xmlSwitchEncoding ()</h3>
<pre class="programlisting">int	xmlSwitchEncoding		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>change the input functions when discovering the character encoding of a given entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the encoding value (number)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSwitchInputEncoding"></a>xmlSwitchInputEncoding ()</h3>
<pre class="programlisting">int	xmlSwitchInputEncoding		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler)<br>
</pre>
<p>DEPRECATED: Use <a href="libxml2-parserInternals.html#xmlSwitchToEncoding">xmlSwitchToEncoding</a> change the input functions when discovering the character encoding of a given entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the input stream</td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the encoding handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSwitchToEncoding"></a>xmlSwitchToEncoding ()</h3>
<pre class="programlisting">int	xmlSwitchToEncoding		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a> handler)<br>
</pre>
<p>change the input functions when discovering the character encoding of a given entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the encoding handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlmodule.html000064400000015431151730335320014662 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlmodule: dynamic module loading</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlmemory.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlreader.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlmodule</span></h2>
<p>xmlmodule - dynamic module loading</p>
<p>basic API for dynamic module loading, used by libexslt added in 2.6.17 </p>
<p>Author(s): Joel W. Reed </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlModule <a href="#xmlModule">xmlModule</a>;
typedef enum <a href="#xmlModuleOption">xmlModuleOption</a>;
typedef <a href="libxml2-xmlmodule.html#xmlModule">xmlModule</a> * <a href="#xmlModulePtr">xmlModulePtr</a>;
int	<a href="#xmlModuleClose">xmlModuleClose</a>			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module);
int	<a href="#xmlModuleFree">xmlModuleFree</a>			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module);
<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a>	<a href="#xmlModuleOpen">xmlModuleOpen</a>		(const char * name, <br>					 int options);
int	<a href="#xmlModuleSymbol">xmlModuleSymbol</a>			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module, <br>					 const char * name, <br>					 void ** symbol);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlModule">Structure </a>xmlModule</h3>
<pre class="programlisting">struct _xmlModule {
The content of this structure is not made public by the API.
} xmlModule;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModuleOption">Enum </a>xmlModuleOption</h3>
<pre class="programlisting">enum <a href="#xmlModuleOption">xmlModuleOption</a> {
    <a name="XML_MODULE_LAZY">XML_MODULE_LAZY</a> = 1 /* lazy binding */
    <a name="XML_MODULE_LOCAL">XML_MODULE_LOCAL</a> = 2 /*  local binding */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModulePtr">Typedef </a>xmlModulePtr</h3>
<pre class="programlisting"><a href="libxml2-xmlmodule.html#xmlModule">xmlModule</a> * xmlModulePtr;
</pre>
<p>A handle to a dynamically loaded module</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModuleClose"></a>xmlModuleClose ()</h3>
<pre class="programlisting">int	xmlModuleClose			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module)<br>
</pre>
<p>The close operations unload the associated module and free the data associated to the module.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>module</tt></i>:</span></td>
<td>the module handle</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of argument error and -2 if the module could not be closed/unloaded.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModuleFree"></a>xmlModuleFree ()</h3>
<pre class="programlisting">int	xmlModuleFree			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module)<br>
</pre>
<p>The free operations free the data associated to the module but does not unload the associated shared library which may still be in use.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>module</tt></i>:</span></td>
<td>the module handle</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of argument error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModuleOpen"></a>xmlModuleOpen ()</h3>
<pre class="programlisting"><a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a>	xmlModuleOpen		(const char * name, <br>					 int options)<br>
</pre>
<p>Opens a module/shared library given its name or path NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We cannot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * . TODO: options are not yet implemented.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the module name</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of <a href="libxml2-xmlmodule.html#xmlModuleOption">xmlModuleOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a handle for the module or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlModuleSymbol"></a>xmlModuleSymbol ()</h3>
<pre class="programlisting">int	xmlModuleSymbol			(<a href="libxml2-xmlmodule.html#xmlModulePtr">xmlModulePtr</a> module, <br>					 const char * name, <br>					 void ** symbol)<br>
</pre>
<p>Lookup for a symbol address in the given module NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We cannot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * .</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>module</tt></i>:</span></td>
<td>the module</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the symbol</td>
</tr>
<tr>
<td><span class="term"><i><tt>symbol</tt></i>:</span></td>
<td>the resulting symbol address</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the symbol was found, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-chvalid.html000064400000045405151730335320014272 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chvalid: Unicode character range checking</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-catalog.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-debugXML.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">chvalid</span></h2>
<p>chvalid - Unicode character range checking</p>
<p>this module exports interfaces for the character range validation APIs  This file is automatically generated from the cvs source definition files using the genChRanges.py Python script </p>
<p>Author(s): William Brack &lt;wbrack@mmm.com.hk&gt; </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#xmlIsBaseCharQ">xmlIsBaseCharQ</a>(c);
#define <a href="#xmlIsBaseChar_ch">xmlIsBaseChar_ch</a>(c);
#define <a href="#xmlIsBlankQ">xmlIsBlankQ</a>(c);
#define <a href="#xmlIsBlank_ch">xmlIsBlank_ch</a>(c);
#define <a href="#xmlIsCharQ">xmlIsCharQ</a>(c);
#define <a href="#xmlIsChar_ch">xmlIsChar_ch</a>(c);
#define <a href="#xmlIsCombiningQ">xmlIsCombiningQ</a>(c);
#define <a href="#xmlIsDigitQ">xmlIsDigitQ</a>(c);
#define <a href="#xmlIsDigit_ch">xmlIsDigit_ch</a>(c);
#define <a href="#xmlIsExtenderQ">xmlIsExtenderQ</a>(c);
#define <a href="#xmlIsExtender_ch">xmlIsExtender_ch</a>(c);
#define <a href="#xmlIsIdeographicQ">xmlIsIdeographicQ</a>(c);
#define <a href="#xmlIsPubidCharQ">xmlIsPubidCharQ</a>(c);
#define <a href="#xmlIsPubidChar_ch">xmlIsPubidChar_ch</a>(c);
typedef struct _xmlChLRange <a href="#xmlChLRange">xmlChLRange</a>;
typedef <a href="libxml2-chvalid.html#xmlChLRange">xmlChLRange</a> * <a href="#xmlChLRangePtr">xmlChLRangePtr</a>;
typedef struct _xmlChRangeGroup <a href="#xmlChRangeGroup">xmlChRangeGroup</a>;
typedef <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> * <a href="#xmlChRangeGroupPtr">xmlChRangeGroupPtr</a>;
typedef struct _xmlChSRange <a href="#xmlChSRange">xmlChSRange</a>;
typedef <a href="libxml2-chvalid.html#xmlChSRange">xmlChSRange</a> * <a href="#xmlChSRangePtr">xmlChSRangePtr</a>;
int	<a href="#xmlCharInRange">xmlCharInRange</a>			(unsigned int val, <br>					 const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> * rptr);
int	<a href="#xmlIsBaseChar">xmlIsBaseChar</a>			(unsigned int ch);
int	<a href="#xmlIsBlank">xmlIsBlank</a>			(unsigned int ch);
int	<a href="#xmlIsChar">xmlIsChar</a>			(unsigned int ch);
int	<a href="#xmlIsCombining">xmlIsCombining</a>			(unsigned int ch);
int	<a href="#xmlIsDigit">xmlIsDigit</a>			(unsigned int ch);
int	<a href="#xmlIsExtender">xmlIsExtender</a>			(unsigned int ch);
int	<a href="#xmlIsIdeographic">xmlIsIdeographic</a>		(unsigned int ch);
int	<a href="#xmlIsPubidChar">xmlIsPubidChar</a>			(unsigned int ch);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBaseCharQ">Macro </a>xmlIsBaseCharQ</h3>
<pre class="programlisting">#define <a href="#xmlIsBaseCharQ">xmlIsBaseCharQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBaseChar_ch">Macro </a>xmlIsBaseChar_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsBaseChar_ch">xmlIsBaseChar_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBlankQ">Macro </a>xmlIsBlankQ</h3>
<pre class="programlisting">#define <a href="#xmlIsBlankQ">xmlIsBlankQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBlank_ch">Macro </a>xmlIsBlank_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsBlank_ch">xmlIsBlank_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsCharQ">Macro </a>xmlIsCharQ</h3>
<pre class="programlisting">#define <a href="#xmlIsCharQ">xmlIsCharQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsChar_ch">Macro </a>xmlIsChar_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsChar_ch">xmlIsChar_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsCombiningQ">Macro </a>xmlIsCombiningQ</h3>
<pre class="programlisting">#define <a href="#xmlIsCombiningQ">xmlIsCombiningQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsDigitQ">Macro </a>xmlIsDigitQ</h3>
<pre class="programlisting">#define <a href="#xmlIsDigitQ">xmlIsDigitQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsDigit_ch">Macro </a>xmlIsDigit_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsDigit_ch">xmlIsDigit_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsExtenderQ">Macro </a>xmlIsExtenderQ</h3>
<pre class="programlisting">#define <a href="#xmlIsExtenderQ">xmlIsExtenderQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsExtender_ch">Macro </a>xmlIsExtender_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsExtender_ch">xmlIsExtender_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsIdeographicQ">Macro </a>xmlIsIdeographicQ</h3>
<pre class="programlisting">#define <a href="#xmlIsIdeographicQ">xmlIsIdeographicQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsPubidCharQ">Macro </a>xmlIsPubidCharQ</h3>
<pre class="programlisting">#define <a href="#xmlIsPubidCharQ">xmlIsPubidCharQ</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsPubidChar_ch">Macro </a>xmlIsPubidChar_ch</h3>
<pre class="programlisting">#define <a href="#xmlIsPubidChar_ch">xmlIsPubidChar_ch</a>(c);
</pre>
<p>Automatically generated by genChRanges.py</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>c</tt></i>:</span></td>
<td>char to validate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChLRange">Structure </a>xmlChLRange</h3>
<pre class="programlisting">struct _xmlChLRange {
    unsigned int	low
    unsigned int	high
} xmlChLRange;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChLRangePtr">Typedef </a>xmlChLRangePtr</h3>
<pre class="programlisting"><a href="libxml2-chvalid.html#xmlChLRange">xmlChLRange</a> * xmlChLRangePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChRangeGroup">Structure </a>xmlChRangeGroup</h3>
<pre class="programlisting">struct _xmlChRangeGroup {
    int	nbShortRange
    int	nbLongRange
    const <a href="libxml2-chvalid.html#xmlChSRange">xmlChSRange</a> *	shortRange	: points to an array of ranges
    const <a href="libxml2-chvalid.html#xmlChLRange">xmlChLRange</a> *	longRange
} xmlChRangeGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChRangeGroupPtr">Typedef </a>xmlChRangeGroupPtr</h3>
<pre class="programlisting"><a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> * xmlChRangeGroupPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChSRange">Structure </a>xmlChSRange</h3>
<pre class="programlisting">struct _xmlChSRange {
    unsigned short	low
    unsigned short	high
} xmlChSRange;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChSRangePtr">Typedef </a>xmlChSRangePtr</h3>
<pre class="programlisting"><a href="libxml2-chvalid.html#xmlChSRange">xmlChSRange</a> * xmlChSRangePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBaseCharGroup">Variable </a>xmlIsBaseCharGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsBaseCharGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsCharGroup">Variable </a>xmlIsCharGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsCharGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsCombiningGroup">Variable </a>xmlIsCombiningGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsCombiningGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsDigitGroup">Variable </a>xmlIsDigitGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsDigitGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsExtenderGroup">Variable </a>xmlIsExtenderGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsExtenderGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsIdeographicGroup">Variable </a>xmlIsIdeographicGroup</h3>
<pre class="programlisting">const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> xmlIsIdeographicGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsPubidChar_tab">Variable </a>xmlIsPubidChar_tab</h3>
<pre class="programlisting">const unsigned charxmlIsPubidChar_tab[256] xmlIsPubidChar_tab;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharInRange"></a>xmlCharInRange ()</h3>
<pre class="programlisting">int	xmlCharInRange			(unsigned int val, <br>					 const <a href="libxml2-chvalid.html#xmlChRangeGroup">xmlChRangeGroup</a> * rptr)<br>
</pre>
<p>Does a binary search of the range table to determine if char is valid</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>character to be validated</td>
</tr>
<tr>
<td><span class="term"><i><tt>rptr</tt></i>:</span></td>
<td>pointer to range to be used to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if character valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBaseChar"></a>xmlIsBaseChar ()</h3>
<pre class="programlisting">int	xmlIsBaseChar			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsBaseChar_ch">xmlIsBaseChar_ch</a> or <a href="libxml2-chvalid.html#xmlIsBaseCharQ">xmlIsBaseCharQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBlank"></a>xmlIsBlank ()</h3>
<pre class="programlisting">int	xmlIsBlank			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsBlank_ch">xmlIsBlank_ch</a> or <a href="libxml2-chvalid.html#xmlIsBlankQ">xmlIsBlankQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsChar"></a>xmlIsChar ()</h3>
<pre class="programlisting">int	xmlIsChar			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsChar_ch">xmlIsChar_ch</a> or <a href="libxml2-chvalid.html#xmlIsCharQ">xmlIsCharQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsCombining"></a>xmlIsCombining ()</h3>
<pre class="programlisting">int	xmlIsCombining			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsCombiningQ">xmlIsCombiningQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsDigit"></a>xmlIsDigit ()</h3>
<pre class="programlisting">int	xmlIsDigit			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsDigit_ch">xmlIsDigit_ch</a> or <a href="libxml2-chvalid.html#xmlIsDigitQ">xmlIsDigitQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsExtender"></a>xmlIsExtender ()</h3>
<pre class="programlisting">int	xmlIsExtender			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsExtender_ch">xmlIsExtender_ch</a> or <a href="libxml2-chvalid.html#xmlIsExtenderQ">xmlIsExtenderQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsIdeographic"></a>xmlIsIdeographic ()</h3>
<pre class="programlisting">int	xmlIsIdeographic		(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsIdeographicQ">xmlIsIdeographicQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsPubidChar"></a>xmlIsPubidChar ()</h3>
<pre class="programlisting">int	xmlIsPubidChar			(unsigned int ch)<br>
</pre>
<p>This function is DEPRECATED. Use <a href="libxml2-chvalid.html#xmlIsPubidChar_ch">xmlIsPubidChar_ch</a> or <a href="libxml2-chvalid.html#xmlIsPubidCharQ">xmlIsPubidCharQ</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>character to validate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>true if argument valid, false otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/left.png000064400000000713151730335320012054 0ustar00�PNG


IHDR�w=�bKGD�������	pHYs��~�tIME�1&��[(XIDATx���!O�PE��*���ID%~ꊯ���"p�'�ŏ�`sܖ��rKf����� h�mi��I�z}�ܯI���.p�\�`x��l�?l�[�,H����k<�#�c�%\�AUx[�S�7�n6����r���zE���s���1�������j@��NL$ݤi�0�5/�}��\E���KIo�͓$a0�j�d�F�b�kI�����Ah>�W�lC'?�tk;|/�t*I��N���Z�^`�y�4��N�r]׮ �J���<�����ڐt����`�X��1@p�䀸d���Z')h���K�	�$V?%�]��+�L�sgU�K�"�w5�3O����IEND�B`�gtk-doc/html/libxml2/up.png000064400000000626151730335320011551 0ustar00�PNG


IHDR�w=�bKGD�������	pHYs��~�tIME�2.�E��#IDATx��=J�@F�o�]
!+��2��[Z�<@/�<����X�
ڭ�2�0v����…�j0�l�vV��A`���	�t*i��Hҭ~x�R~'IUU�9�#O��my�eJ�TeY�Gv�@x�O#�;2E>9��|t$D�9nnB���j��BRIsI��:H�8�U�����P��N�1fc�sN�95M㧖ɵ��束��1~�pE�e$�I����	�7nrD�f!;�`����'�yk��I���䲤sI_]��y�����^^I>O>�������?YBIEND�B`�gtk-doc/html/libxml2/libxml2-xmlstring.html000064400000103511151730335320014700 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlstring: set of routines to process strings</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlschemastypes.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlunicode.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlstring</span></h2>
<p>xmlstring - set of routines to process strings</p>
<p>type and interfaces needed for the internal string handling of the library, especially UTF8 processing. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#BAD_CAST">BAD_CAST</a>;
typedef unsigned char <a href="#xmlChar">xmlChar</a>;
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCharStrdup">xmlCharStrdup</a>		(const char * cur);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCharStrndup">xmlCharStrndup</a>		(const char * cur, <br>					 int len);
int	<a href="#xmlCheckUTF8">xmlCheckUTF8</a>			(const unsigned char * utf);
int	<a href="#xmlGetUTF8Char">xmlGetUTF8Char</a>			(const unsigned char * utf, <br>					 int * len);
int	<a href="#xmlStrEqual">xmlStrEqual</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2);
int	<a href="#xmlStrPrintf">xmlStrPrintf</a>			(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buf, <br>					 int len, <br>					 const char * msg, <br>					 ... ...);
int	<a href="#xmlStrQEqual">xmlStrQEqual</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pref, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
int	<a href="#xmlStrVPrintf">xmlStrVPrintf</a>			(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buf, <br>					 int len, <br>					 const char * msg, <br>					 va_list ap);
int	<a href="#xmlStrcasecmp">xmlStrcasecmp</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrcasestr">xmlStrcasestr</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrcat">xmlStrcat</a>		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * add);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrchr">xmlStrchr</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> val);
int	<a href="#xmlStrcmp">xmlStrcmp</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrdup">xmlStrdup</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur);
int	<a href="#xmlStrlen">xmlStrlen</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
int	<a href="#xmlStrncasecmp">xmlStrncasecmp</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrncat">xmlStrncat</a>		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * add, <br>					 int len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrncatNew">xmlStrncatNew</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len);
int	<a href="#xmlStrncmp">xmlStrncmp</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrndup">xmlStrndup</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int len);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrstr">xmlStrstr</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlStrsub">xmlStrsub</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int start, <br>					 int len);
int	<a href="#xmlUTF8Charcmp">xmlUTF8Charcmp</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf2);
int	<a href="#xmlUTF8Size">xmlUTF8Size</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf);
int	<a href="#xmlUTF8Strlen">xmlUTF8Strlen</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf);
int	<a href="#xmlUTF8Strloc">xmlUTF8Strloc</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utfchar);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlUTF8Strndup">xmlUTF8Strndup</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int len);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlUTF8Strpos">xmlUTF8Strpos</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int pos);
int	<a href="#xmlUTF8Strsize">xmlUTF8Strsize</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int len);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlUTF8Strsub">xmlUTF8Strsub</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int start, <br>					 int len);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="BAD_CAST">Macro </a>BAD_CAST</h3>
<pre class="programlisting">#define <a href="#BAD_CAST">BAD_CAST</a>;
</pre>
<p>Macro to cast a string to an <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * when one know its safe.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChar">Typedef </a>xmlChar</h3>
<pre class="programlisting">unsigned char xmlChar;
</pre>
<p>This is a basic byte in an UTF-8 encoded string. It's unsigned allowing to pinpoint case where char * are assigned to <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * (possibly making serialization back impossible).</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharStrdup"></a>xmlCharStrdup ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCharStrdup		(const char * cur)<br>
</pre>
<p>a strdup for char's to xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the input char *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCharStrndup"></a>xmlCharStrndup ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCharStrndup		(const char * cur, <br>					 int len)<br>
</pre>
<p>a strndup for char's to xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the input char *</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the len of @cur</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCheckUTF8"></a>xmlCheckUTF8 ()</h3>
<pre class="programlisting">int	xmlCheckUTF8			(const unsigned char * utf)<br>
</pre>
<p>Checks @utf for being valid UTF-8. @utf is assumed to be null-terminated. This function is not super-strict, as it will allow longer UTF-8 sequences than necessary. Note that Java is capable of producing these sequences if provoked. Also note, this routine checks for the 4-byte maximum size, but does not check for 0x10ffff maximum value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>Pointer to putative UTF-8 encoded string.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>value: true if @utf is valid.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetUTF8Char"></a>xmlGetUTF8Char ()</h3>
<pre class="programlisting">int	xmlGetUTF8Char			(const unsigned char * utf, <br>					 int * len)<br>
</pre>
<p>Read the first UTF8 character from @utf</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>a sequence of UTF-8 encoded bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>a pointer to the minimum number of bytes present in the sequence. This is used to assure the next character is completely contained within the sequence.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the char value or -1 in case of error, and sets *len to the actual number of bytes consumed (0 in case of error)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrEqual"></a>xmlStrEqual ()</h3>
<pre class="programlisting">int	xmlStrEqual			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2)<br>
</pre>
<p>Check if both strings are equal of have same content. Should be a bit more readable and faster than xmlStrcmp()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>the first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if they are equal, 0 if they are different</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrPrintf"></a>xmlStrPrintf ()</h3>
<pre class="programlisting">int	xmlStrPrintf			(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buf, <br>					 int len, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Formats @msg and places result into @buf.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the result buffer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the result buffer length.</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message with printf formatting.</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-SAX.html#characters">characters</a> written to @buf or -1 if an error occurs.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrQEqual"></a>xmlStrQEqual ()</h3>
<pre class="programlisting">int	xmlStrQEqual			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pref, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Check if a QName is Equal to a given string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>pref</tt></i>:</span></td>
<td>the prefix of the QName</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the localname of the QName</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if they are equal, 0 if they are different</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrVPrintf"></a>xmlStrVPrintf ()</h3>
<pre class="programlisting">int	xmlStrVPrintf			(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buf, <br>					 int len, <br>					 const char * msg, <br>					 va_list ap)<br>
</pre>
<p>Formats @msg and places result into @buf.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the result buffer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the result buffer length.</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message with printf formatting.</td>
</tr>
<tr>
<td><span class="term"><i><tt>ap</tt></i>:</span></td>
<td>extra parameters for the message.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-SAX.html#characters">characters</a> written to @buf or -1 if an error occurs.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrcasecmp"></a>xmlStrcasecmp ()</h3>
<pre class="programlisting">int	xmlStrcasecmp			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2)<br>
</pre>
<p>a strcasecmp for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>the first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the integer result of the comparison</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrcasestr"></a>xmlStrcasestr ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrcasestr		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>a case-ignoring strstr for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array (haystack)</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> to search (needle)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * for the first occurrence or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrcat"></a>xmlStrcat ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrcat		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * add)<br>
</pre>
<p>a strcat for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the original <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array</td>
</tr>
<tr>
<td><span class="term"><i><tt>add</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * containing the concatenated string. The original @cur is reallocated and should not be freed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrchr"></a>xmlStrchr ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrchr		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> val)<br>
</pre>
<p>a strchr for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * for the first occurrence or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrcmp"></a>xmlStrcmp ()</h3>
<pre class="programlisting">int	xmlStrcmp			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2)<br>
</pre>
<p>a strcmp for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>the first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the integer result of the comparison</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrdup"></a>xmlStrdup ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrdup		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur)<br>
</pre>
<p>a strdup for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the input <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrlen"></a>xmlStrlen ()</h3>
<pre class="programlisting">int	xmlStrlen			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>length of a xmlChar's string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> contained in the ARRAY.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrncasecmp"></a>xmlStrncasecmp ()</h3>
<pre class="programlisting">int	xmlStrncasecmp			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len)<br>
</pre>
<p>a strncasecmp for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>the first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the max comparison length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the integer result of the comparison</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrncat"></a>xmlStrncat ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrncat		(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * add, <br>					 int len)<br>
</pre>
<p>a strncat for array of xmlChar's, it will extend @cur with the len first bytes of @add. Note that if @len &lt; 0 then this is an API error and NULL will be returned.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the original <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array</td>
</tr>
<tr>
<td><span class="term"><i><tt>add</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array added</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of @add</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *, the original @cur is reallocated and should not be freed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrncatNew"></a>xmlStrncatNew ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrncatNew		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len)<br>
</pre>
<p>same as xmlStrncat, but creates a new string. The original two strings are not freed. If @len is &lt; 0 then the length will be calculated automatically.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the len of @str2 or &lt; 0</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrncmp"></a>xmlStrncmp ()</h3>
<pre class="programlisting">int	xmlStrncmp			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str2, <br>					 int len)<br>
</pre>
<p>a strncmp for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str1</tt></i>:</span></td>
<td>the first <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>str2</tt></i>:</span></td>
<td>the second <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the max comparison length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the integer result of the comparison</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrndup"></a>xmlStrndup ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrndup		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int len)<br>
</pre>
<p>a strndup for array of xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the input <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the len of @cur</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrstr"></a>xmlStrstr ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrstr		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>a strstr for xmlChar's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array (haystack)</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> to search (needle)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * for the first occurrence or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStrsub"></a>xmlStrsub ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlStrsub		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int start, <br>					 int len)<br>
</pre>
<p>Extract a substring of a given string</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * array (haystack)</td>
</tr>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the index of the first char (zero based)</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the substring</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * for the first occurrence or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Charcmp"></a>xmlUTF8Charcmp ()</h3>
<pre class="programlisting">int	xmlUTF8Charcmp			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf1, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf2)<br>
</pre>
<p>compares the two UCS4 values</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf1</tt></i>:</span></td>
<td>pointer to first UTF8 char</td>
</tr>
<tr>
<td><span class="term"><i><tt>utf2</tt></i>:</span></td>
<td>pointer to second UTF8 char</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>result of the compare as with <a href="libxml2-xmlstring.html#xmlStrncmp">xmlStrncmp</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Size"></a>xmlUTF8Size ()</h3>
<pre class="programlisting">int	xmlUTF8Size			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf)<br>
</pre>
<p>calculates the internal size of a UTF8 character</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>pointer to the UTF8 character</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the numbers of bytes in the character, -1 on format error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strlen"></a>xmlUTF8Strlen ()</h3>
<pre class="programlisting">int	xmlUTF8Strlen			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf)<br>
</pre>
<p>compute the length of an UTF8 string, it doesn't do a full UTF8 checking of the content of the string.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>a sequence of UTF-8 encoded bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of <a href="libxml2-SAX.html#characters">characters</a> in the string or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strloc"></a>xmlUTF8Strloc ()</h3>
<pre class="programlisting">int	xmlUTF8Strloc			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utfchar)<br>
</pre>
<p>a function to provide the relative location of a UTF8 char</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>the input UTF8 *</td>
</tr>
<tr>
<td><span class="term"><i><tt>utfchar</tt></i>:</span></td>
<td>the UTF8 character to be found</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the relative character position of the desired char or -1 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strndup"></a>xmlUTF8Strndup ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlUTF8Strndup		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int len)<br>
</pre>
<p>a strndup for array of UTF8's</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>the input UTF8 *</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the len of @utf (in chars)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new UTF8 * or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strpos"></a>xmlUTF8Strpos ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlUTF8Strpos		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int pos)<br>
</pre>
<p>a function to provide the equivalent of fetching a character from a string array</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>the input UTF8 *</td>
</tr>
<tr>
<td><span class="term"><i><tt>pos</tt></i>:</span></td>
<td>the position of the desired UTF8 char (in chars)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the UTF8 character or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strsize"></a>xmlUTF8Strsize ()</h3>
<pre class="programlisting">int	xmlUTF8Strsize			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int len)<br>
</pre>
<p>storage size of an UTF8 string the behaviour is not guaranteed if the input string is not UTF-8</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>a sequence of UTF-8 encoded bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-SAX.html#characters">characters</a> in the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the storage size of the first 'len' <a href="libxml2-SAX.html#characters">characters</a> of ARRAY</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUTF8Strsub"></a>xmlUTF8Strsub ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlUTF8Strsub		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * utf, <br>					 int start, <br>					 int len)<br>
</pre>
<p>Create a substring from a given UTF-8 string Note: positions are given in units of UTF-8 chars</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>utf</tt></i>:</span></td>
<td>a sequence of UTF-8 encoded bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>relative pos of first char</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>total number to copy</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to a newly created string or NULL if any problem</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-list.html000064400000061004151730335320013624 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>list: lists interfaces</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-hash.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-nanoftp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">list</span></h2>
<p>list - lists interfaces</p>
<p>this module implement the list support used in various place in the library. </p>
<p>Author(s): Gary Pennington &lt;Gary.Pennington@uk.sun.com&gt; </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlLink <a href="#xmlLink">xmlLink</a>;
typedef <a href="libxml2-list.html#xmlLink">xmlLink</a> * <a href="#xmlLinkPtr">xmlLinkPtr</a>;
typedef struct _xmlList <a href="#xmlList">xmlList</a>;
typedef <a href="libxml2-list.html#xmlList">xmlList</a> * <a href="#xmlListPtr">xmlListPtr</a>;
void *	<a href="#xmlLinkGetData">xmlLinkGetData</a>			(<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a> lk);
int	<a href="#xmlListAppend">xmlListAppend</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
void	<a href="#xmlListClear">xmlListClear</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
int	<a href="#xmlListCopy">xmlListCopy</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> cur, <br>					 const <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> old);
<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	<a href="#xmlListCreate">xmlListCreate</a>		(<a href="libxml2-list.html#xmlListDeallocator">xmlListDeallocator</a> deallocator, <br>					 <a href="libxml2-list.html#xmlListDataCompare">xmlListDataCompare</a> compare);
typedef int <a href="#xmlListDataCompare">xmlListDataCompare</a>		(const void * data0, <br>					 const void * data1);
typedef void <a href="#xmlListDeallocator">xmlListDeallocator</a>		(<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a> lk);
void	<a href="#xmlListDelete">xmlListDelete</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	<a href="#xmlListDup">xmlListDup</a>		(const <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> old);
int	<a href="#xmlListEmpty">xmlListEmpty</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a>	<a href="#xmlListEnd">xmlListEnd</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a>	<a href="#xmlListFront">xmlListFront</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
int	<a href="#xmlListInsert">xmlListInsert</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
void	<a href="#xmlListMerge">xmlListMerge</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l1, <br>					 <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l2);
void	<a href="#xmlListPopBack">xmlListPopBack</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
void	<a href="#xmlListPopFront">xmlListPopFront</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
int	<a href="#xmlListPushBack">xmlListPushBack</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
int	<a href="#xmlListPushFront">xmlListPushFront</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
int	<a href="#xmlListRemoveAll">xmlListRemoveAll</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
int	<a href="#xmlListRemoveFirst">xmlListRemoveFirst</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
int	<a href="#xmlListRemoveLast">xmlListRemoveLast</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
void	<a href="#xmlListReverse">xmlListReverse</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
void *	<a href="#xmlListReverseSearch">xmlListReverseSearch</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
void	<a href="#xmlListReverseWalk">xmlListReverseWalk</a>		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 <a href="libxml2-list.html#xmlListWalker">xmlListWalker</a> walker, <br>					 void * user);
void *	<a href="#xmlListSearch">xmlListSearch</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data);
int	<a href="#xmlListSize">xmlListSize</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
void	<a href="#xmlListSort">xmlListSort</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l);
void	<a href="#xmlListWalk">xmlListWalk</a>			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 <a href="libxml2-list.html#xmlListWalker">xmlListWalker</a> walker, <br>					 void * user);
typedef int <a href="#xmlListWalker">xmlListWalker</a>			(const void * data, <br>					 void * user);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlLink">Structure </a>xmlLink</h3>
<pre class="programlisting">struct _xmlLink {
The content of this structure is not made public by the API.
} xmlLink;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLinkPtr">Typedef </a>xmlLinkPtr</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlLink">xmlLink</a> * xmlLinkPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlList">Structure </a>xmlList</h3>
<pre class="programlisting">struct _xmlList {
The content of this structure is not made public by the API.
} xmlList;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListPtr">Typedef </a>xmlListPtr</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlList">xmlList</a> * xmlListPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListDataCompare"></a>Function type xmlListDataCompare</h3>
<pre class="programlisting">int	xmlListDataCompare		(const void * data0, <br>					 const void * data1)<br>
</pre>
<p>Callback function used to compare 2 data.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>data0</tt></i>:</span></td>
<td>the first data</td>
</tr>
<tr>
<td><span class="term"><i><tt>data1</tt></i>:</span></td>
<td>the second data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 is equality, -1 or 1 otherwise depending on the ordering.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListDeallocator"></a>Function type xmlListDeallocator</h3>
<pre class="programlisting">void	xmlListDeallocator		(<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a> lk)<br>
</pre>
<p>Callback function used to free data from a list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>lk</tt></i>:</span></td>
<td>the data to deallocate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListWalker"></a>Function type xmlListWalker</h3>
<pre class="programlisting">int	xmlListWalker			(const void * data, <br>					 void * user)<br>
</pre>
<p>Callback function used when walking a list with xmlListWalk().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the data found in the list</td>
</tr>
<tr>
<td><span class="term"><i><tt>user</tt></i>:</span></td>
<td>extra user provided data to the walker</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 to stop walking the list, 1 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLinkGetData"></a>xmlLinkGetData ()</h3>
<pre class="programlisting">void *	xmlLinkGetData			(<a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a> lk)<br>
</pre>
<p>See Returns.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>lk</tt></i>:</span></td>
<td>a link</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the data referenced from this link</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListAppend"></a>xmlListAppend ()</h3>
<pre class="programlisting">int	xmlListAppend			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Insert data in the ordered list at the end for this value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, 1 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListClear"></a>xmlListClear ()</h3>
<pre class="programlisting">void	xmlListClear			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Remove the all data in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListCopy"></a>xmlListCopy ()</h3>
<pre class="programlisting">int	xmlListCopy			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> cur, <br>					 const <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> old)<br>
</pre>
<p>Move all the element from the old list in the new list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the new list</td>
</tr>
<tr>
<td><span class="term"><i><tt>old</tt></i>:</span></td>
<td>the old list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success 1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListCreate"></a>xmlListCreate ()</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	xmlListCreate		(<a href="libxml2-list.html#xmlListDeallocator">xmlListDeallocator</a> deallocator, <br>					 <a href="libxml2-list.html#xmlListDataCompare">xmlListDataCompare</a> compare)<br>
</pre>
<p>Create a new list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>deallocator</tt></i>:</span></td>
<td>an optional deallocator function</td>
</tr>
<tr>
<td><span class="term"><i><tt>compare</tt></i>:</span></td>
<td>an optional comparison function</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new list or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListDelete"></a>xmlListDelete ()</h3>
<pre class="programlisting">void	xmlListDelete			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Deletes the list and its associated data</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListDup"></a>xmlListDup ()</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	xmlListDup		(const <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> old)<br>
</pre>
<p>Duplicate the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>old</tt></i>:</span></td>
<td>the list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new copy of the list or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListEmpty"></a>xmlListEmpty ()</h3>
<pre class="programlisting">int	xmlListEmpty			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Is the list empty ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the list is empty, 0 if not empty and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListEnd"></a>xmlListEnd ()</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a>	xmlListEnd		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Get the last element in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last element in the list, or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListFront"></a>xmlListFront ()</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlLinkPtr">xmlLinkPtr</a>	xmlListFront		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Get the first element in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the first element in the list, or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListInsert"></a>xmlListInsert ()</h3>
<pre class="programlisting">int	xmlListInsert			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Insert data in the ordered list at the beginning for this value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, 1 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListMerge"></a>xmlListMerge ()</h3>
<pre class="programlisting">void	xmlListMerge			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l1, <br>					 <a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l2)<br>
</pre>
<p>include all the elements of the second list in the first one and clear the second list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l1</tt></i>:</span></td>
<td>the original list</td>
</tr>
<tr>
<td><span class="term"><i><tt>l2</tt></i>:</span></td>
<td>the new list</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListPopBack"></a>xmlListPopBack ()</h3>
<pre class="programlisting">void	xmlListPopBack			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Removes the last element in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListPopFront"></a>xmlListPopFront ()</h3>
<pre class="programlisting">void	xmlListPopFront			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Removes the first element in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListPushBack"></a>xmlListPushBack ()</h3>
<pre class="programlisting">int	xmlListPushBack			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>add the new data at the end of the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>new data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if successful, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListPushFront"></a>xmlListPushFront ()</h3>
<pre class="programlisting">int	xmlListPushFront		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>add the new data at the beginning of the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>new data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if successful, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListRemoveAll"></a>xmlListRemoveAll ()</h3>
<pre class="programlisting">int	xmlListRemoveAll		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Remove the all instance associated to data in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>list data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of deallocation, or 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListRemoveFirst"></a>xmlListRemoveFirst ()</h3>
<pre class="programlisting">int	xmlListRemoveFirst		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Remove the first instance associated to data in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>list data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if a deallocation occurred, or 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListRemoveLast"></a>xmlListRemoveLast ()</h3>
<pre class="programlisting">int	xmlListRemoveLast		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Remove the last instance associated to data in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>list data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if a deallocation occurred, or 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListReverse"></a>xmlListReverse ()</h3>
<pre class="programlisting">void	xmlListReverse			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Reverse the order of the elements in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListReverseSearch"></a>xmlListReverseSearch ()</h3>
<pre class="programlisting">void *	xmlListReverseSearch		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Search the list in reverse order for an existing value of @data</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>a search value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value associated to @data or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListReverseWalk"></a>xmlListReverseWalk ()</h3>
<pre class="programlisting">void	xmlListReverseWalk		(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 <a href="libxml2-list.html#xmlListWalker">xmlListWalker</a> walker, <br>					 void * user)<br>
</pre>
<p>Walk all the element of the list in reverse order and apply the walker function to it</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>walker</tt></i>:</span></td>
<td>a processing function</td>
</tr>
<tr>
<td><span class="term"><i><tt>user</tt></i>:</span></td>
<td>a user parameter passed to the walker function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListSearch"></a>xmlListSearch ()</h3>
<pre class="programlisting">void *	xmlListSearch			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 void * data)<br>
</pre>
<p>Search the list for an existing value of @data</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>a search value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value associated to @data or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListSize"></a>xmlListSize ()</h3>
<pre class="programlisting">int	xmlListSize			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Get the number of elements in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of elements in the list or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListSort"></a>xmlListSort ()</h3>
<pre class="programlisting">void	xmlListSort			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l)<br>
</pre>
<p>Sort all the elements in the list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlListWalk"></a>xmlListWalk ()</h3>
<pre class="programlisting">void	xmlListWalk			(<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a> l, <br>					 <a href="libxml2-list.html#xmlListWalker">xmlListWalker</a> walker, <br>					 void * user)<br>
</pre>
<p>Walk all the element of the first from first to last and apply the walker function to it</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>l</tt></i>:</span></td>
<td>a list</td>
</tr>
<tr>
<td><span class="term"><i><tt>walker</tt></i>:</span></td>
<td>a processing function</td>
</tr>
<tr>
<td><span class="term"><i><tt>user</tt></i>:</span></td>
<td>a user parameter passed to the walker function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2.devhelp2000064400001366757151730335320013450 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://www.devhelp.net/book" title="libxml2 Reference Manual" link="index.html" author="" name="libxml2">
  <chapters>
    <sub name="API" link="general.html">
      <sub name="HTMLparser" link="libxml2-HTMLparser.html"/>
      <sub name="HTMLtree" link="libxml2-HTMLtree.html"/>
      <sub name="SAX" link="libxml2-SAX.html"/>
      <sub name="SAX2" link="libxml2-SAX2.html"/>
      <sub name="c14n" link="libxml2-c14n.html"/>
      <sub name="catalog" link="libxml2-catalog.html"/>
      <sub name="chvalid" link="libxml2-chvalid.html"/>
      <sub name="debugXML" link="libxml2-debugXML.html"/>
      <sub name="dict" link="libxml2-dict.html"/>
      <sub name="encoding" link="libxml2-encoding.html"/>
      <sub name="entities" link="libxml2-entities.html"/>
      <sub name="globals" link="libxml2-globals.html"/>
      <sub name="hash" link="libxml2-hash.html"/>
      <sub name="list" link="libxml2-list.html"/>
      <sub name="nanoftp" link="libxml2-nanoftp.html"/>
      <sub name="nanohttp" link="libxml2-nanohttp.html"/>
      <sub name="parser" link="libxml2-parser.html"/>
      <sub name="parserInternals" link="libxml2-parserInternals.html"/>
      <sub name="pattern" link="libxml2-pattern.html"/>
      <sub name="relaxng" link="libxml2-relaxng.html"/>
      <sub name="schemasInternals" link="libxml2-schemasInternals.html"/>
      <sub name="schematron" link="libxml2-schematron.html"/>
      <sub name="threads" link="libxml2-threads.html"/>
      <sub name="tree" link="libxml2-tree.html"/>
      <sub name="uri" link="libxml2-uri.html"/>
      <sub name="valid" link="libxml2-valid.html"/>
      <sub name="xinclude" link="libxml2-xinclude.html"/>
      <sub name="xlink" link="libxml2-xlink.html"/>
      <sub name="xmlIO" link="libxml2-xmlIO.html"/>
      <sub name="xmlautomata" link="libxml2-xmlautomata.html"/>
      <sub name="xmlerror" link="libxml2-xmlerror.html"/>
      <sub name="xmlexports" link="libxml2-xmlexports.html"/>
      <sub name="xmlmemory" link="libxml2-xmlmemory.html"/>
      <sub name="xmlmodule" link="libxml2-xmlmodule.html"/>
      <sub name="xmlreader" link="libxml2-xmlreader.html"/>
      <sub name="xmlregexp" link="libxml2-xmlregexp.html"/>
      <sub name="xmlsave" link="libxml2-xmlsave.html"/>
      <sub name="xmlschemas" link="libxml2-xmlschemas.html"/>
      <sub name="xmlschemastypes" link="libxml2-xmlschemastypes.html"/>
      <sub name="xmlstring" link="libxml2-xmlstring.html"/>
      <sub name="xmlunicode" link="libxml2-xmlunicode.html"/>
      <sub name="xmlversion" link="libxml2-xmlversion.html"/>
      <sub name="xmlwriter" link="libxml2-xmlwriter.html"/>
      <sub name="xpath" link="libxml2-xpath.html"/>
      <sub name="xpathInternals" link="libxml2-xpathInternals.html"/>
      <sub name="xpointer" link="libxml2-xpointer.html"/>
    </sub>
  </chapters>
  <functions>
    <keyword type="macro" name="ATTRIBUTE_UNUSED" link="libxml2-xmlversion.html#ATTRIBUTE_UNUSED"/>
    <keyword type="macro" name="BAD_CAST" link="libxml2-xmlstring.html#BAD_CAST"/>
    <keyword type="macro" name="BASE_BUFFER_SIZE" link="libxml2-tree.html#BASE_BUFFER_SIZE"/>
    <keyword type="macro" name="CAST_TO_BOOLEAN" link="libxml2-xpathInternals.html#CAST_TO_BOOLEAN"/>
    <keyword type="macro" name="CAST_TO_NUMBER" link="libxml2-xpathInternals.html#CAST_TO_NUMBER"/>
    <keyword type="macro" name="CAST_TO_STRING" link="libxml2-xpathInternals.html#CAST_TO_STRING"/>
    <keyword type="macro" name="CHECK_ARITY" link="libxml2-xpathInternals.html#CHECK_ARITY"/>
    <keyword type="macro" name="CHECK_ERROR" link="libxml2-xpathInternals.html#CHECK_ERROR"/>
    <keyword type="macro" name="CHECK_ERROR0" link="libxml2-xpathInternals.html#CHECK_ERROR0"/>
    <keyword type="macro" name="CHECK_TYPE" link="libxml2-xpathInternals.html#CHECK_TYPE"/>
    <keyword type="macro" name="CHECK_TYPE0" link="libxml2-xpathInternals.html#CHECK_TYPE0"/>
    <keyword type="macro" name="DEBUG_MEMORY" link="libxml2-xmlmemory.html#DEBUG_MEMORY"/>
    <keyword type="macro" name="DEBUG_MEMORY_LOCATION" link="libxml2-xmlversion.html#DEBUG_MEMORY_LOCATION"/>
    <keyword type="macro" name="HTML_COMMENT_NODE" link="libxml2-HTMLtree.html#HTML_COMMENT_NODE"/>
    <keyword type="macro" name="HTML_ENTITY_REF_NODE" link="libxml2-HTMLtree.html#HTML_ENTITY_REF_NODE"/>
    <keyword type="macro" name="HTML_PI_NODE" link="libxml2-HTMLtree.html#HTML_PI_NODE"/>
    <keyword type="macro" name="HTML_PRESERVE_NODE" link="libxml2-HTMLtree.html#HTML_PRESERVE_NODE"/>
    <keyword type="macro" name="HTML_TEXT_NODE" link="libxml2-HTMLtree.html#HTML_TEXT_NODE"/>
    <keyword type="macro" name="INPUT_CHUNK" link="libxml2-parserInternals.html#INPUT_CHUNK"/>
    <keyword type="macro" name="INVALID_SOCKET" link="libxml2-nanoftp.html#INVALID_SOCKET"/>
    <keyword type="macro" name="IS_ASCII_DIGIT" link="libxml2-parserInternals.html#IS_ASCII_DIGIT"/>
    <keyword type="macro" name="IS_ASCII_LETTER" link="libxml2-parserInternals.html#IS_ASCII_LETTER"/>
    <keyword type="macro" name="IS_BASECHAR" link="libxml2-parserInternals.html#IS_BASECHAR"/>
    <keyword type="macro" name="IS_BLANK" link="libxml2-parserInternals.html#IS_BLANK"/>
    <keyword type="macro" name="IS_BLANK_CH" link="libxml2-parserInternals.html#IS_BLANK_CH"/>
    <keyword type="macro" name="IS_BYTE_CHAR" link="libxml2-parserInternals.html#IS_BYTE_CHAR"/>
    <keyword type="macro" name="IS_CHAR" link="libxml2-parserInternals.html#IS_CHAR"/>
    <keyword type="macro" name="IS_CHAR_CH" link="libxml2-parserInternals.html#IS_CHAR_CH"/>
    <keyword type="macro" name="IS_COMBINING" link="libxml2-parserInternals.html#IS_COMBINING"/>
    <keyword type="macro" name="IS_COMBINING_CH" link="libxml2-parserInternals.html#IS_COMBINING_CH"/>
    <keyword type="macro" name="IS_DIGIT" link="libxml2-parserInternals.html#IS_DIGIT"/>
    <keyword type="macro" name="IS_DIGIT_CH" link="libxml2-parserInternals.html#IS_DIGIT_CH"/>
    <keyword type="macro" name="IS_EXTENDER" link="libxml2-parserInternals.html#IS_EXTENDER"/>
    <keyword type="macro" name="IS_EXTENDER_CH" link="libxml2-parserInternals.html#IS_EXTENDER_CH"/>
    <keyword type="macro" name="IS_IDEOGRAPHIC" link="libxml2-parserInternals.html#IS_IDEOGRAPHIC"/>
    <keyword type="macro" name="IS_LETTER" link="libxml2-parserInternals.html#IS_LETTER"/>
    <keyword type="macro" name="IS_LETTER_CH" link="libxml2-parserInternals.html#IS_LETTER_CH"/>
    <keyword type="macro" name="IS_PUBIDCHAR" link="libxml2-parserInternals.html#IS_PUBIDCHAR"/>
    <keyword type="macro" name="IS_PUBIDCHAR_CH" link="libxml2-parserInternals.html#IS_PUBIDCHAR_CH"/>
    <keyword type="macro" name="LIBXML2_NEW_BUFFER" link="libxml2-tree.html#LIBXML2_NEW_BUFFER"/>
    <keyword type="macro" name="LIBXML_ATTR_ALLOC_SIZE" link="libxml2-xmlversion.html#LIBXML_ATTR_ALLOC_SIZE"/>
    <keyword type="macro" name="LIBXML_ATTR_FORMAT" link="libxml2-xmlversion.html#LIBXML_ATTR_FORMAT"/>
    <keyword type="macro" name="LIBXML_AUTOMATA_ENABLED" link="libxml2-xmlversion.html#LIBXML_AUTOMATA_ENABLED"/>
    <keyword type="macro" name="LIBXML_C14N_ENABLED" link="libxml2-xmlversion.html#LIBXML_C14N_ENABLED"/>
    <keyword type="macro" name="LIBXML_CATALOG_ENABLED" link="libxml2-xmlversion.html#LIBXML_CATALOG_ENABLED"/>
    <keyword type="macro" name="LIBXML_DEBUG_ENABLED" link="libxml2-xmlversion.html#LIBXML_DEBUG_ENABLED"/>
    <keyword type="macro" name="LIBXML_DEBUG_RUNTIME" link="libxml2-xmlversion.html#LIBXML_DEBUG_RUNTIME"/>
    <keyword type="macro" name="LIBXML_DLL_IMPORT" link="libxml2-xmlexports.html#LIBXML_DLL_IMPORT"/>
    <keyword type="macro" name="LIBXML_DOTTED_VERSION" link="libxml2-xmlversion.html#LIBXML_DOTTED_VERSION"/>
    <keyword type="macro" name="LIBXML_EXPR_ENABLED" link="libxml2-xmlversion.html#LIBXML_EXPR_ENABLED"/>
    <keyword type="macro" name="LIBXML_FTP_ENABLED" link="libxml2-xmlversion.html#LIBXML_FTP_ENABLED"/>
    <keyword type="macro" name="LIBXML_HTML_ENABLED" link="libxml2-xmlversion.html#LIBXML_HTML_ENABLED"/>
    <keyword type="macro" name="LIBXML_HTTP_ENABLED" link="libxml2-xmlversion.html#LIBXML_HTTP_ENABLED"/>
    <keyword type="macro" name="LIBXML_ICONV_ENABLED" link="libxml2-xmlversion.html#LIBXML_ICONV_ENABLED"/>
    <keyword type="macro" name="LIBXML_ICU_ENABLED" link="libxml2-xmlversion.html#LIBXML_ICU_ENABLED"/>
    <keyword type="macro" name="LIBXML_ISO8859X_ENABLED" link="libxml2-xmlversion.html#LIBXML_ISO8859X_ENABLED"/>
    <keyword type="macro" name="LIBXML_LEGACY_ENABLED" link="libxml2-xmlversion.html#LIBXML_LEGACY_ENABLED"/>
    <keyword type="macro" name="LIBXML_LZMA_ENABLED" link="libxml2-xmlversion.html#LIBXML_LZMA_ENABLED"/>
    <keyword type="macro" name="LIBXML_MODULES_ENABLED" link="libxml2-xmlversion.html#LIBXML_MODULES_ENABLED"/>
    <keyword type="macro" name="LIBXML_MODULE_EXTENSION" link="libxml2-xmlversion.html#LIBXML_MODULE_EXTENSION"/>
    <keyword type="macro" name="LIBXML_OUTPUT_ENABLED" link="libxml2-xmlversion.html#LIBXML_OUTPUT_ENABLED"/>
    <keyword type="macro" name="LIBXML_PATTERN_ENABLED" link="libxml2-xmlversion.html#LIBXML_PATTERN_ENABLED"/>
    <keyword type="macro" name="LIBXML_PUSH_ENABLED" link="libxml2-xmlversion.html#LIBXML_PUSH_ENABLED"/>
    <keyword type="macro" name="LIBXML_READER_ENABLED" link="libxml2-xmlversion.html#LIBXML_READER_ENABLED"/>
    <keyword type="macro" name="LIBXML_REGEXP_ENABLED" link="libxml2-xmlversion.html#LIBXML_REGEXP_ENABLED"/>
    <keyword type="macro" name="LIBXML_SAX1_ENABLED" link="libxml2-xmlversion.html#LIBXML_SAX1_ENABLED"/>
    <keyword type="macro" name="LIBXML_SCHEMAS_ENABLED" link="libxml2-xmlversion.html#LIBXML_SCHEMAS_ENABLED"/>
    <keyword type="macro" name="LIBXML_SCHEMATRON_ENABLED" link="libxml2-xmlversion.html#LIBXML_SCHEMATRON_ENABLED"/>
    <keyword type="macro" name="LIBXML_TEST_VERSION" link="libxml2-xmlversion.html#LIBXML_TEST_VERSION"/>
    <keyword type="macro" name="LIBXML_THREAD_ALLOC_ENABLED" link="libxml2-xmlversion.html#LIBXML_THREAD_ALLOC_ENABLED"/>
    <keyword type="macro" name="LIBXML_THREAD_ENABLED" link="libxml2-xmlversion.html#LIBXML_THREAD_ENABLED"/>
    <keyword type="macro" name="LIBXML_TREE_ENABLED" link="libxml2-xmlversion.html#LIBXML_TREE_ENABLED"/>
    <keyword type="macro" name="LIBXML_UNICODE_ENABLED" link="libxml2-xmlversion.html#LIBXML_UNICODE_ENABLED"/>
    <keyword type="macro" name="LIBXML_VALID_ENABLED" link="libxml2-xmlversion.html#LIBXML_VALID_ENABLED"/>
    <keyword type="macro" name="LIBXML_VERSION" link="libxml2-xmlversion.html#LIBXML_VERSION"/>
    <keyword type="macro" name="LIBXML_VERSION_EXTRA" link="libxml2-xmlversion.html#LIBXML_VERSION_EXTRA"/>
    <keyword type="macro" name="LIBXML_VERSION_STRING" link="libxml2-xmlversion.html#LIBXML_VERSION_STRING"/>
    <keyword type="macro" name="LIBXML_WRITER_ENABLED" link="libxml2-xmlversion.html#LIBXML_WRITER_ENABLED"/>
    <keyword type="macro" name="LIBXML_XINCLUDE_ENABLED" link="libxml2-xmlversion.html#LIBXML_XINCLUDE_ENABLED"/>
    <keyword type="macro" name="LIBXML_XPATH_ENABLED" link="libxml2-xmlversion.html#LIBXML_XPATH_ENABLED"/>
    <keyword type="macro" name="LIBXML_XPTR_ENABLED" link="libxml2-xmlversion.html#LIBXML_XPTR_ENABLED"/>
    <keyword type="macro" name="LIBXML_XPTR_LOCS_ENABLED" link="libxml2-xmlversion.html#LIBXML_XPTR_LOCS_ENABLED"/>
    <keyword type="macro" name="LIBXML_ZLIB_ENABLED" link="libxml2-xmlversion.html#LIBXML_ZLIB_ENABLED"/>
    <keyword type="macro" name="MOVETO_ENDTAG" link="libxml2-parserInternals.html#MOVETO_ENDTAG"/>
    <keyword type="macro" name="MOVETO_STARTTAG" link="libxml2-parserInternals.html#MOVETO_STARTTAG"/>
    <keyword type="macro" name="SKIP_EOL" link="libxml2-parserInternals.html#SKIP_EOL"/>
    <keyword type="macro" name="SOCKET" link="libxml2-nanoftp.html#SOCKET"/>
    <keyword type="macro" name="WITHOUT_TRIO" link="libxml2-xmlversion.html#WITHOUT_TRIO"/>
    <keyword type="macro" name="WITH_TRIO" link="libxml2-xmlversion.html#WITH_TRIO"/>
    <keyword type="macro" name="XINCLUDE_FALLBACK" link="libxml2-xinclude.html#XINCLUDE_FALLBACK"/>
    <keyword type="macro" name="XINCLUDE_HREF" link="libxml2-xinclude.html#XINCLUDE_HREF"/>
    <keyword type="macro" name="XINCLUDE_NODE" link="libxml2-xinclude.html#XINCLUDE_NODE"/>
    <keyword type="macro" name="XINCLUDE_NS" link="libxml2-xinclude.html#XINCLUDE_NS"/>
    <keyword type="macro" name="XINCLUDE_OLD_NS" link="libxml2-xinclude.html#XINCLUDE_OLD_NS"/>
    <keyword type="macro" name="XINCLUDE_PARSE" link="libxml2-xinclude.html#XINCLUDE_PARSE"/>
    <keyword type="macro" name="XINCLUDE_PARSE_ENCODING" link="libxml2-xinclude.html#XINCLUDE_PARSE_ENCODING"/>
    <keyword type="macro" name="XINCLUDE_PARSE_TEXT" link="libxml2-xinclude.html#XINCLUDE_PARSE_TEXT"/>
    <keyword type="macro" name="XINCLUDE_PARSE_XML" link="libxml2-xinclude.html#XINCLUDE_PARSE_XML"/>
    <keyword type="macro" name="XINCLUDE_PARSE_XPOINTER" link="libxml2-xinclude.html#XINCLUDE_PARSE_XPOINTER"/>
    <keyword type="macro" name="XMLCALL" link="libxml2-xmlexports.html#XMLCALL"/>
    <keyword type="macro" name="XMLCDECL" link="libxml2-xmlexports.html#XMLCDECL"/>
    <keyword type="macro" name="XMLPUBFUN" link="libxml2-xmlexports.html#XMLPUBFUN"/>
    <keyword type="macro" name="XMLPUBLIC" link="libxml2-xmlexports.html#XMLPUBLIC"/>
    <keyword type="macro" name="XMLPUBVAR" link="libxml2-xmlexports.html#XMLPUBVAR"/>
    <keyword type="macro" name="XML_CAST_FPTR" link="libxml2-hash.html#XML_CAST_FPTR"/>
    <keyword type="macro" name="XML_CATALOGS_NAMESPACE" link="libxml2-catalog.html#XML_CATALOGS_NAMESPACE"/>
    <keyword type="macro" name="XML_CATALOG_PI" link="libxml2-catalog.html#XML_CATALOG_PI"/>
    <keyword type="macro" name="XML_COMPLETE_ATTRS" link="libxml2-parser.html#XML_COMPLETE_ATTRS"/>
    <keyword type="macro" name="XML_DEFAULT_VERSION" link="libxml2-parser.html#XML_DEFAULT_VERSION"/>
    <keyword type="macro" name="XML_DEPRECATED" link="libxml2-xmlversion.html#XML_DEPRECATED"/>
    <keyword type="macro" name="XML_DETECT_IDS" link="libxml2-parser.html#XML_DETECT_IDS"/>
    <keyword type="macro" name="XML_DOCB_DOCUMENT_NODE" link="libxml2-tree.html#XML_DOCB_DOCUMENT_NODE"/>
    <keyword type="macro" name="XML_GET_CONTENT" link="libxml2-tree.html#XML_GET_CONTENT"/>
    <keyword type="macro" name="XML_GET_LINE" link="libxml2-tree.html#XML_GET_LINE"/>
    <keyword type="macro" name="XML_LOCAL_NAMESPACE" link="libxml2-tree.html#XML_LOCAL_NAMESPACE"/>
    <keyword type="macro" name="XML_MAX_DICTIONARY_LIMIT" link="libxml2-parserInternals.html#XML_MAX_DICTIONARY_LIMIT"/>
    <keyword type="macro" name="XML_MAX_LOOKUP_LIMIT" link="libxml2-parserInternals.html#XML_MAX_LOOKUP_LIMIT"/>
    <keyword type="macro" name="XML_MAX_NAMELEN" link="libxml2-parserInternals.html#XML_MAX_NAMELEN"/>
    <keyword type="macro" name="XML_MAX_NAME_LENGTH" link="libxml2-parserInternals.html#XML_MAX_NAME_LENGTH"/>
    <keyword type="macro" name="XML_MAX_TEXT_LENGTH" link="libxml2-parserInternals.html#XML_MAX_TEXT_LENGTH"/>
    <keyword type="macro" name="XML_SAX2_MAGIC" link="libxml2-parser.html#XML_SAX2_MAGIC"/>
    <keyword type="macro" name="XML_SCHEMAS_ANYATTR_LAX" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYATTR_LAX"/>
    <keyword type="macro" name="XML_SCHEMAS_ANYATTR_SKIP" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYATTR_SKIP"/>
    <keyword type="macro" name="XML_SCHEMAS_ANYATTR_STRICT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYATTR_STRICT"/>
    <keyword type="macro" name="XML_SCHEMAS_ANY_LAX" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANY_LAX"/>
    <keyword type="macro" name="XML_SCHEMAS_ANY_SKIP" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANY_SKIP"/>
    <keyword type="macro" name="XML_SCHEMAS_ANY_STRICT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANY_STRICT"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTRGROUP_GLOBAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTRGROUP_GLOBAL"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTRGROUP_HAS_REFS" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTRGROUP_HAS_REFS"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTRGROUP_MARKED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTRGROUP_MARKED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTRGROUP_REDEFINED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTRGROUP_REDEFINED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_FIXED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_FIXED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_GLOBAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_GLOBAL"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_INTERNAL_RESOLVED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_INTERNAL_RESOLVED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_NSDEFAULT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_NSDEFAULT"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_USE_OPTIONAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_USE_OPTIONAL"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_USE_PROHIBITED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_USE_PROHIBITED"/>
    <keyword type="macro" name="XML_SCHEMAS_ATTR_USE_REQUIRED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ATTR_USE_REQUIRED"/>
    <keyword type="macro" name="XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_ABSTRACT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_ABSTRACT"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_BLOCK_ABSENT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_BLOCK_ABSENT"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_BLOCK_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_BLOCK_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_BLOCK_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_BLOCK_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_CIRCULAR" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_CIRCULAR"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_DEFAULT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_DEFAULT"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_FINAL_ABSENT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_FINAL_ABSENT"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_FINAL_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_FINAL_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_FINAL_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_FINAL_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_FIXED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_FIXED"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_GLOBAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_GLOBAL"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_INTERNAL_CHECKED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_INTERNAL_CHECKED"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_INTERNAL_RESOLVED" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_INTERNAL_RESOLVED"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_NILLABLE" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_NILLABLE"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_NSDEFAULT" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_NSDEFAULT"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_REF" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_REF"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD"/>
    <keyword type="macro" name="XML_SCHEMAS_ELEM_TOPLEVEL" link="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_TOPLEVEL"/>
    <keyword type="macro" name="XML_SCHEMAS_FACET_COLLAPSE" link="libxml2-schemasInternals.html#XML_SCHEMAS_FACET_COLLAPSE"/>
    <keyword type="macro" name="XML_SCHEMAS_FACET_PRESERVE" link="libxml2-schemasInternals.html#XML_SCHEMAS_FACET_PRESERVE"/>
    <keyword type="macro" name="XML_SCHEMAS_FACET_REPLACE" link="libxml2-schemasInternals.html#XML_SCHEMAS_FACET_REPLACE"/>
    <keyword type="macro" name="XML_SCHEMAS_FACET_UNKNOWN" link="libxml2-schemasInternals.html#XML_SCHEMAS_FACET_UNKNOWN"/>
    <keyword type="macro" name="XML_SCHEMAS_FINAL_DEFAULT_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_FINAL_DEFAULT_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_FINAL_DEFAULT_LIST" link="libxml2-schemasInternals.html#XML_SCHEMAS_FINAL_DEFAULT_LIST"/>
    <keyword type="macro" name="XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_FINAL_DEFAULT_UNION" link="libxml2-schemasInternals.html#XML_SCHEMAS_FINAL_DEFAULT_UNION"/>
    <keyword type="macro" name="XML_SCHEMAS_INCLUDING_CONVERT_NS" link="libxml2-schemasInternals.html#XML_SCHEMAS_INCLUDING_CONVERT_NS"/>
    <keyword type="macro" name="XML_SCHEMAS_QUALIF_ATTR" link="libxml2-schemasInternals.html#XML_SCHEMAS_QUALIF_ATTR"/>
    <keyword type="macro" name="XML_SCHEMAS_QUALIF_ELEM" link="libxml2-schemasInternals.html#XML_SCHEMAS_QUALIF_ELEM"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_ABSTRACT" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_ABSTRACT"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_BLOCK_DEFAULT" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_BLOCK_DEFAULT"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_BLOCK_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_BLOCK_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_BLOCK_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_BLOCK_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FACETSNEEDVALUE" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FACETSNEEDVALUE"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FINAL_DEFAULT" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FINAL_DEFAULT"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FINAL_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FINAL_EXTENSION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FINAL_LIST" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FINAL_LIST"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FINAL_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FINAL_RESTRICTION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FINAL_UNION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FINAL_UNION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_FIXUP_1" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_FIXUP_1"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_GLOBAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_GLOBAL"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_HAS_FACETS" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_HAS_FACETS"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_INTERNAL_INVALID" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_INTERNAL_INVALID"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_INTERNAL_RESOLVED" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_INTERNAL_RESOLVED"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_MARKED" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_MARKED"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_MIXED" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_MIXED"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_NORMVALUENEEDED" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_NORMVALUENEEDED"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_REDEFINED" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_REDEFINED"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_VARIETY_ABSENT" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_VARIETY_ABSENT"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_VARIETY_ATOMIC" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_VARIETY_ATOMIC"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_VARIETY_LIST" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_VARIETY_LIST"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_VARIETY_UNION" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_VARIETY_UNION"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE"/>
    <keyword type="macro" name="XML_SCHEMAS_TYPE_WHITESPACE_REPLACE" link="libxml2-schemasInternals.html#XML_SCHEMAS_TYPE_WHITESPACE_REPLACE"/>
    <keyword type="macro" name="XML_SCHEMAS_WILDCARD_COMPLETE" link="libxml2-schemasInternals.html#XML_SCHEMAS_WILDCARD_COMPLETE"/>
    <keyword type="macro" name="XML_SKIP_IDS" link="libxml2-parser.html#XML_SKIP_IDS"/>
    <keyword type="macro" name="XML_SUBSTITUTE_BOTH" link="libxml2-parserInternals.html#XML_SUBSTITUTE_BOTH"/>
    <keyword type="macro" name="XML_SUBSTITUTE_NONE" link="libxml2-parserInternals.html#XML_SUBSTITUTE_NONE"/>
    <keyword type="macro" name="XML_SUBSTITUTE_PEREF" link="libxml2-parserInternals.html#XML_SUBSTITUTE_PEREF"/>
    <keyword type="macro" name="XML_SUBSTITUTE_REF" link="libxml2-parserInternals.html#XML_SUBSTITUTE_REF"/>
    <keyword type="macro" name="XML_VCTXT_DTD_VALIDATED" link="libxml2-valid.html#XML_VCTXT_DTD_VALIDATED"/>
    <keyword type="macro" name="XML_VCTXT_USE_PCTXT" link="libxml2-valid.html#XML_VCTXT_USE_PCTXT"/>
    <keyword type="macro" name="XML_XML_ID" link="libxml2-tree.html#XML_XML_ID"/>
    <keyword type="macro" name="XML_XML_NAMESPACE" link="libxml2-tree.html#XML_XML_NAMESPACE"/>
    <keyword type="macro" name="XML_XPATH_CHECKNS" link="libxml2-xpath.html#XML_XPATH_CHECKNS"/>
    <keyword type="macro" name="XML_XPATH_NOVAR" link="libxml2-xpath.html#XML_XPATH_NOVAR"/>
    <keyword type="macro" name="XPATH_LOCATIONSET" link="libxml2-xpath.html#XPATH_LOCATIONSET"/>
    <keyword type="macro" name="XPATH_POINT" link="libxml2-xpath.html#XPATH_POINT"/>
    <keyword type="macro" name="XPATH_RANGE" link="libxml2-xpath.html#XPATH_RANGE"/>
    <keyword type="macro" name="XP_ERROR" link="libxml2-xpathInternals.html#XP_ERROR"/>
    <keyword type="macro" name="XP_ERROR0" link="libxml2-xpathInternals.html#XP_ERROR0"/>
    <keyword type="macro" name="htmlDefaultSubelement" link="libxml2-HTMLparser.html#htmlDefaultSubelement"/>
    <keyword type="macro" name="htmlElementAllowedHereDesc" link="libxml2-HTMLparser.html#htmlElementAllowedHereDesc"/>
    <keyword type="macro" name="htmlRequiredAttrs" link="libxml2-HTMLparser.html#htmlRequiredAttrs"/>
    <keyword type="macro" name="xmlChildrenNode" link="libxml2-tree.html#xmlChildrenNode"/>
    <keyword type="macro" name="xmlIsBaseCharQ" link="libxml2-chvalid.html#xmlIsBaseCharQ"/>
    <keyword type="macro" name="xmlIsBaseChar_ch" link="libxml2-chvalid.html#xmlIsBaseChar_ch"/>
    <keyword type="macro" name="xmlIsBlankQ" link="libxml2-chvalid.html#xmlIsBlankQ"/>
    <keyword type="macro" name="xmlIsBlank_ch" link="libxml2-chvalid.html#xmlIsBlank_ch"/>
    <keyword type="macro" name="xmlIsCharQ" link="libxml2-chvalid.html#xmlIsCharQ"/>
    <keyword type="macro" name="xmlIsChar_ch" link="libxml2-chvalid.html#xmlIsChar_ch"/>
    <keyword type="macro" name="xmlIsCombiningQ" link="libxml2-chvalid.html#xmlIsCombiningQ"/>
    <keyword type="macro" name="xmlIsDigitQ" link="libxml2-chvalid.html#xmlIsDigitQ"/>
    <keyword type="macro" name="xmlIsDigit_ch" link="libxml2-chvalid.html#xmlIsDigit_ch"/>
    <keyword type="macro" name="xmlIsExtenderQ" link="libxml2-chvalid.html#xmlIsExtenderQ"/>
    <keyword type="macro" name="xmlIsExtender_ch" link="libxml2-chvalid.html#xmlIsExtender_ch"/>
    <keyword type="macro" name="xmlIsIdeographicQ" link="libxml2-chvalid.html#xmlIsIdeographicQ"/>
    <keyword type="macro" name="xmlIsPubidCharQ" link="libxml2-chvalid.html#xmlIsPubidCharQ"/>
    <keyword type="macro" name="xmlIsPubidChar_ch" link="libxml2-chvalid.html#xmlIsPubidChar_ch"/>
    <keyword type="macro" name="xmlRootNode" link="libxml2-tree.html#xmlRootNode"/>
    <keyword type="macro" name="xmlTextWriterWriteDocType" link="libxml2-xmlwriter.html#xmlTextWriterWriteDocType"/>
    <keyword type="macro" name="xmlTextWriterWriteProcessingInstruction" link="libxml2-xmlwriter.html#xmlTextWriterWriteProcessingInstruction"/>
    <keyword type="macro" name="xmlXPathCheckError" link="libxml2-xpathInternals.html#xmlXPathCheckError"/>
    <keyword type="macro" name="xmlXPathEmptyNodeSet" link="libxml2-xpathInternals.html#xmlXPathEmptyNodeSet"/>
    <keyword type="macro" name="xmlXPathGetContextNode" link="libxml2-xpathInternals.html#xmlXPathGetContextNode"/>
    <keyword type="macro" name="xmlXPathGetDocument" link="libxml2-xpathInternals.html#xmlXPathGetDocument"/>
    <keyword type="macro" name="xmlXPathGetError" link="libxml2-xpathInternals.html#xmlXPathGetError"/>
    <keyword type="macro" name="xmlXPathNodeSetGetLength" link="libxml2-xpath.html#xmlXPathNodeSetGetLength"/>
    <keyword type="macro" name="xmlXPathNodeSetIsEmpty" link="libxml2-xpath.html#xmlXPathNodeSetIsEmpty"/>
    <keyword type="macro" name="xmlXPathNodeSetItem" link="libxml2-xpath.html#xmlXPathNodeSetItem"/>
    <keyword type="macro" name="xmlXPathReturnBoolean" link="libxml2-xpathInternals.html#xmlXPathReturnBoolean"/>
    <keyword type="macro" name="xmlXPathReturnEmptyNodeSet" link="libxml2-xpathInternals.html#xmlXPathReturnEmptyNodeSet"/>
    <keyword type="macro" name="xmlXPathReturnEmptyString" link="libxml2-xpathInternals.html#xmlXPathReturnEmptyString"/>
    <keyword type="macro" name="xmlXPathReturnExternal" link="libxml2-xpathInternals.html#xmlXPathReturnExternal"/>
    <keyword type="macro" name="xmlXPathReturnFalse" link="libxml2-xpathInternals.html#xmlXPathReturnFalse"/>
    <keyword type="macro" name="xmlXPathReturnNodeSet" link="libxml2-xpathInternals.html#xmlXPathReturnNodeSet"/>
    <keyword type="macro" name="xmlXPathReturnNumber" link="libxml2-xpathInternals.html#xmlXPathReturnNumber"/>
    <keyword type="macro" name="xmlXPathReturnString" link="libxml2-xpathInternals.html#xmlXPathReturnString"/>
    <keyword type="macro" name="xmlXPathReturnTrue" link="libxml2-xpathInternals.html#xmlXPathReturnTrue"/>
    <keyword type="macro" name="xmlXPathSetArityError" link="libxml2-xpathInternals.html#xmlXPathSetArityError"/>
    <keyword type="macro" name="xmlXPathSetError" link="libxml2-xpathInternals.html#xmlXPathSetError"/>
    <keyword type="macro" name="xmlXPathSetTypeError" link="libxml2-xpathInternals.html#xmlXPathSetTypeError"/>
    <keyword type="macro" name="xmlXPathStackIsExternal" link="libxml2-xpathInternals.html#xmlXPathStackIsExternal"/>
    <keyword type="macro" name="xmlXPathStackIsNodeSet" link="libxml2-xpathInternals.html#xmlXPathStackIsNodeSet"/>
    <keyword type="enum" name="HTML_DEPRECATED" link="libxml2-HTMLparser.html#HTML_DEPRECATED"/>
    <keyword type="enum" name="HTML_INVALID" link="libxml2-HTMLparser.html#HTML_INVALID"/>
    <keyword type="enum" name="HTML_NA" link="libxml2-HTMLparser.html#HTML_NA"/>
    <keyword type="enum" name="HTML_PARSE_COMPACT" link="libxml2-HTMLparser.html#HTML_PARSE_COMPACT"/>
    <keyword type="enum" name="HTML_PARSE_IGNORE_ENC" link="libxml2-HTMLparser.html#HTML_PARSE_IGNORE_ENC"/>
    <keyword type="enum" name="HTML_PARSE_NOBLANKS" link="libxml2-HTMLparser.html#HTML_PARSE_NOBLANKS"/>
    <keyword type="enum" name="HTML_PARSE_NODEFDTD" link="libxml2-HTMLparser.html#HTML_PARSE_NODEFDTD"/>
    <keyword type="enum" name="HTML_PARSE_NOERROR" link="libxml2-HTMLparser.html#HTML_PARSE_NOERROR"/>
    <keyword type="enum" name="HTML_PARSE_NOIMPLIED" link="libxml2-HTMLparser.html#HTML_PARSE_NOIMPLIED"/>
    <keyword type="enum" name="HTML_PARSE_NONET" link="libxml2-HTMLparser.html#HTML_PARSE_NONET"/>
    <keyword type="enum" name="HTML_PARSE_NOWARNING" link="libxml2-HTMLparser.html#HTML_PARSE_NOWARNING"/>
    <keyword type="enum" name="HTML_PARSE_PEDANTIC" link="libxml2-HTMLparser.html#HTML_PARSE_PEDANTIC"/>
    <keyword type="enum" name="HTML_PARSE_RECOVER" link="libxml2-HTMLparser.html#HTML_PARSE_RECOVER"/>
    <keyword type="enum" name="HTML_REQUIRED" link="libxml2-HTMLparser.html#HTML_REQUIRED"/>
    <keyword type="enum" name="HTML_VALID" link="libxml2-HTMLparser.html#HTML_VALID"/>
    <keyword type="enum" name="XLINK_ACTUATE_AUTO" link="libxml2-xlink.html#XLINK_ACTUATE_AUTO"/>
    <keyword type="enum" name="XLINK_ACTUATE_NONE" link="libxml2-xlink.html#XLINK_ACTUATE_NONE"/>
    <keyword type="enum" name="XLINK_ACTUATE_ONREQUEST" link="libxml2-xlink.html#XLINK_ACTUATE_ONREQUEST"/>
    <keyword type="enum" name="XLINK_SHOW_EMBED" link="libxml2-xlink.html#XLINK_SHOW_EMBED"/>
    <keyword type="enum" name="XLINK_SHOW_NEW" link="libxml2-xlink.html#XLINK_SHOW_NEW"/>
    <keyword type="enum" name="XLINK_SHOW_NONE" link="libxml2-xlink.html#XLINK_SHOW_NONE"/>
    <keyword type="enum" name="XLINK_SHOW_REPLACE" link="libxml2-xlink.html#XLINK_SHOW_REPLACE"/>
    <keyword type="enum" name="XLINK_TYPE_EXTENDED" link="libxml2-xlink.html#XLINK_TYPE_EXTENDED"/>
    <keyword type="enum" name="XLINK_TYPE_EXTENDED_SET" link="libxml2-xlink.html#XLINK_TYPE_EXTENDED_SET"/>
    <keyword type="enum" name="XLINK_TYPE_NONE" link="libxml2-xlink.html#XLINK_TYPE_NONE"/>
    <keyword type="enum" name="XLINK_TYPE_SIMPLE" link="libxml2-xlink.html#XLINK_TYPE_SIMPLE"/>
    <keyword type="enum" name="XML_ATTRIBUTE_CDATA" link="libxml2-tree.html#XML_ATTRIBUTE_CDATA"/>
    <keyword type="enum" name="XML_ATTRIBUTE_DECL" link="libxml2-tree.html#XML_ATTRIBUTE_DECL"/>
    <keyword type="enum" name="XML_ATTRIBUTE_ENTITIES" link="libxml2-tree.html#XML_ATTRIBUTE_ENTITIES"/>
    <keyword type="enum" name="XML_ATTRIBUTE_ENTITY" link="libxml2-tree.html#XML_ATTRIBUTE_ENTITY"/>
    <keyword type="enum" name="XML_ATTRIBUTE_ENUMERATION" link="libxml2-tree.html#XML_ATTRIBUTE_ENUMERATION"/>
    <keyword type="enum" name="XML_ATTRIBUTE_FIXED" link="libxml2-tree.html#XML_ATTRIBUTE_FIXED"/>
    <keyword type="enum" name="XML_ATTRIBUTE_ID" link="libxml2-tree.html#XML_ATTRIBUTE_ID"/>
    <keyword type="enum" name="XML_ATTRIBUTE_IDREF" link="libxml2-tree.html#XML_ATTRIBUTE_IDREF"/>
    <keyword type="enum" name="XML_ATTRIBUTE_IDREFS" link="libxml2-tree.html#XML_ATTRIBUTE_IDREFS"/>
    <keyword type="enum" name="XML_ATTRIBUTE_IMPLIED" link="libxml2-tree.html#XML_ATTRIBUTE_IMPLIED"/>
    <keyword type="enum" name="XML_ATTRIBUTE_NMTOKEN" link="libxml2-tree.html#XML_ATTRIBUTE_NMTOKEN"/>
    <keyword type="enum" name="XML_ATTRIBUTE_NMTOKENS" link="libxml2-tree.html#XML_ATTRIBUTE_NMTOKENS"/>
    <keyword type="enum" name="XML_ATTRIBUTE_NODE" link="libxml2-tree.html#XML_ATTRIBUTE_NODE"/>
    <keyword type="enum" name="XML_ATTRIBUTE_NONE" link="libxml2-tree.html#XML_ATTRIBUTE_NONE"/>
    <keyword type="enum" name="XML_ATTRIBUTE_NOTATION" link="libxml2-tree.html#XML_ATTRIBUTE_NOTATION"/>
    <keyword type="enum" name="XML_ATTRIBUTE_REQUIRED" link="libxml2-tree.html#XML_ATTRIBUTE_REQUIRED"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_BOUNDED" link="libxml2-tree.html#XML_BUFFER_ALLOC_BOUNDED"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_DOUBLEIT" link="libxml2-tree.html#XML_BUFFER_ALLOC_DOUBLEIT"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_EXACT" link="libxml2-tree.html#XML_BUFFER_ALLOC_EXACT"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_HYBRID" link="libxml2-tree.html#XML_BUFFER_ALLOC_HYBRID"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_IMMUTABLE" link="libxml2-tree.html#XML_BUFFER_ALLOC_IMMUTABLE"/>
    <keyword type="enum" name="XML_BUFFER_ALLOC_IO" link="libxml2-tree.html#XML_BUFFER_ALLOC_IO"/>
    <keyword type="enum" name="XML_BUF_OVERFLOW" link="libxml2-xmlerror.html#XML_BUF_OVERFLOW"/>
    <keyword type="enum" name="XML_C14N_1_0" link="libxml2-c14n.html#XML_C14N_1_0"/>
    <keyword type="enum" name="XML_C14N_1_1" link="libxml2-c14n.html#XML_C14N_1_1"/>
    <keyword type="enum" name="XML_C14N_CREATE_CTXT" link="libxml2-xmlerror.html#XML_C14N_CREATE_CTXT"/>
    <keyword type="enum" name="XML_C14N_CREATE_STACK" link="libxml2-xmlerror.html#XML_C14N_CREATE_STACK"/>
    <keyword type="enum" name="XML_C14N_EXCLUSIVE_1_0" link="libxml2-c14n.html#XML_C14N_EXCLUSIVE_1_0"/>
    <keyword type="enum" name="XML_C14N_INVALID_NODE" link="libxml2-xmlerror.html#XML_C14N_INVALID_NODE"/>
    <keyword type="enum" name="XML_C14N_RELATIVE_NAMESPACE" link="libxml2-xmlerror.html#XML_C14N_RELATIVE_NAMESPACE"/>
    <keyword type="enum" name="XML_C14N_REQUIRES_UTF8" link="libxml2-xmlerror.html#XML_C14N_REQUIRES_UTF8"/>
    <keyword type="enum" name="XML_C14N_UNKNOW_NODE" link="libxml2-xmlerror.html#XML_C14N_UNKNOW_NODE"/>
    <keyword type="enum" name="XML_CATALOG_ENTRY_BROKEN" link="libxml2-xmlerror.html#XML_CATALOG_ENTRY_BROKEN"/>
    <keyword type="enum" name="XML_CATALOG_MISSING_ATTR" link="libxml2-xmlerror.html#XML_CATALOG_MISSING_ATTR"/>
    <keyword type="enum" name="XML_CATALOG_NOT_CATALOG" link="libxml2-xmlerror.html#XML_CATALOG_NOT_CATALOG"/>
    <keyword type="enum" name="XML_CATALOG_PREFER_VALUE" link="libxml2-xmlerror.html#XML_CATALOG_PREFER_VALUE"/>
    <keyword type="enum" name="XML_CATALOG_RECURSION" link="libxml2-xmlerror.html#XML_CATALOG_RECURSION"/>
    <keyword type="enum" name="XML_CATA_ALLOW_ALL" link="libxml2-catalog.html#XML_CATA_ALLOW_ALL"/>
    <keyword type="enum" name="XML_CATA_ALLOW_DOCUMENT" link="libxml2-catalog.html#XML_CATA_ALLOW_DOCUMENT"/>
    <keyword type="enum" name="XML_CATA_ALLOW_GLOBAL" link="libxml2-catalog.html#XML_CATA_ALLOW_GLOBAL"/>
    <keyword type="enum" name="XML_CATA_ALLOW_NONE" link="libxml2-catalog.html#XML_CATA_ALLOW_NONE"/>
    <keyword type="enum" name="XML_CATA_PREFER_NONE" link="libxml2-catalog.html#XML_CATA_PREFER_NONE"/>
    <keyword type="enum" name="XML_CATA_PREFER_PUBLIC" link="libxml2-catalog.html#XML_CATA_PREFER_PUBLIC"/>
    <keyword type="enum" name="XML_CATA_PREFER_SYSTEM" link="libxml2-catalog.html#XML_CATA_PREFER_SYSTEM"/>
    <keyword type="enum" name="XML_CDATA_SECTION_NODE" link="libxml2-tree.html#XML_CDATA_SECTION_NODE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_2022_JP" link="libxml2-encoding.html#XML_CHAR_ENCODING_2022_JP"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_1" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_1"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_2" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_2"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_3" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_3"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_4" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_4"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_5" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_5"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_6" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_6"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_7" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_7"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_8" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_8"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_8859_9" link="libxml2-encoding.html#XML_CHAR_ENCODING_8859_9"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_ASCII" link="libxml2-encoding.html#XML_CHAR_ENCODING_ASCII"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_EBCDIC" link="libxml2-encoding.html#XML_CHAR_ENCODING_EBCDIC"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_ERROR" link="libxml2-encoding.html#XML_CHAR_ENCODING_ERROR"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_EUC_JP" link="libxml2-encoding.html#XML_CHAR_ENCODING_EUC_JP"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_NONE" link="libxml2-encoding.html#XML_CHAR_ENCODING_NONE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_SHIFT_JIS" link="libxml2-encoding.html#XML_CHAR_ENCODING_SHIFT_JIS"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UCS2" link="libxml2-encoding.html#XML_CHAR_ENCODING_UCS2"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UCS4BE" link="libxml2-encoding.html#XML_CHAR_ENCODING_UCS4BE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UCS4LE" link="libxml2-encoding.html#XML_CHAR_ENCODING_UCS4LE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UCS4_2143" link="libxml2-encoding.html#XML_CHAR_ENCODING_UCS4_2143"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UCS4_3412" link="libxml2-encoding.html#XML_CHAR_ENCODING_UCS4_3412"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UTF16BE" link="libxml2-encoding.html#XML_CHAR_ENCODING_UTF16BE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UTF16LE" link="libxml2-encoding.html#XML_CHAR_ENCODING_UTF16LE"/>
    <keyword type="enum" name="XML_CHAR_ENCODING_UTF8" link="libxml2-encoding.html#XML_CHAR_ENCODING_UTF8"/>
    <keyword type="enum" name="XML_CHECK_ENTITY_TYPE" link="libxml2-xmlerror.html#XML_CHECK_ENTITY_TYPE"/>
    <keyword type="enum" name="XML_CHECK_FOUND_ATTRIBUTE" link="libxml2-xmlerror.html#XML_CHECK_FOUND_ATTRIBUTE"/>
    <keyword type="enum" name="XML_CHECK_FOUND_CDATA" link="libxml2-xmlerror.html#XML_CHECK_FOUND_CDATA"/>
    <keyword type="enum" name="XML_CHECK_FOUND_COMMENT" link="libxml2-xmlerror.html#XML_CHECK_FOUND_COMMENT"/>
    <keyword type="enum" name="XML_CHECK_FOUND_DOCTYPE" link="libxml2-xmlerror.html#XML_CHECK_FOUND_DOCTYPE"/>
    <keyword type="enum" name="XML_CHECK_FOUND_ELEMENT" link="libxml2-xmlerror.html#XML_CHECK_FOUND_ELEMENT"/>
    <keyword type="enum" name="XML_CHECK_FOUND_ENTITY" link="libxml2-xmlerror.html#XML_CHECK_FOUND_ENTITY"/>
    <keyword type="enum" name="XML_CHECK_FOUND_ENTITYREF" link="libxml2-xmlerror.html#XML_CHECK_FOUND_ENTITYREF"/>
    <keyword type="enum" name="XML_CHECK_FOUND_FRAGMENT" link="libxml2-xmlerror.html#XML_CHECK_FOUND_FRAGMENT"/>
    <keyword type="enum" name="XML_CHECK_FOUND_NOTATION" link="libxml2-xmlerror.html#XML_CHECK_FOUND_NOTATION"/>
    <keyword type="enum" name="XML_CHECK_FOUND_PI" link="libxml2-xmlerror.html#XML_CHECK_FOUND_PI"/>
    <keyword type="enum" name="XML_CHECK_FOUND_TEXT" link="libxml2-xmlerror.html#XML_CHECK_FOUND_TEXT"/>
    <keyword type="enum" name="XML_CHECK_NAME_NOT_NULL" link="libxml2-xmlerror.html#XML_CHECK_NAME_NOT_NULL"/>
    <keyword type="enum" name="XML_CHECK_NOT_ATTR" link="libxml2-xmlerror.html#XML_CHECK_NOT_ATTR"/>
    <keyword type="enum" name="XML_CHECK_NOT_ATTR_DECL" link="libxml2-xmlerror.html#XML_CHECK_NOT_ATTR_DECL"/>
    <keyword type="enum" name="XML_CHECK_NOT_DTD" link="libxml2-xmlerror.html#XML_CHECK_NOT_DTD"/>
    <keyword type="enum" name="XML_CHECK_NOT_ELEM_DECL" link="libxml2-xmlerror.html#XML_CHECK_NOT_ELEM_DECL"/>
    <keyword type="enum" name="XML_CHECK_NOT_ENTITY_DECL" link="libxml2-xmlerror.html#XML_CHECK_NOT_ENTITY_DECL"/>
    <keyword type="enum" name="XML_CHECK_NOT_NCNAME" link="libxml2-xmlerror.html#XML_CHECK_NOT_NCNAME"/>
    <keyword type="enum" name="XML_CHECK_NOT_NS_DECL" link="libxml2-xmlerror.html#XML_CHECK_NOT_NS_DECL"/>
    <keyword type="enum" name="XML_CHECK_NOT_UTF8" link="libxml2-xmlerror.html#XML_CHECK_NOT_UTF8"/>
    <keyword type="enum" name="XML_CHECK_NO_DICT" link="libxml2-xmlerror.html#XML_CHECK_NO_DICT"/>
    <keyword type="enum" name="XML_CHECK_NO_DOC" link="libxml2-xmlerror.html#XML_CHECK_NO_DOC"/>
    <keyword type="enum" name="XML_CHECK_NO_ELEM" link="libxml2-xmlerror.html#XML_CHECK_NO_ELEM"/>
    <keyword type="enum" name="XML_CHECK_NO_HREF" link="libxml2-xmlerror.html#XML_CHECK_NO_HREF"/>
    <keyword type="enum" name="XML_CHECK_NO_NAME" link="libxml2-xmlerror.html#XML_CHECK_NO_NAME"/>
    <keyword type="enum" name="XML_CHECK_NO_NEXT" link="libxml2-xmlerror.html#XML_CHECK_NO_NEXT"/>
    <keyword type="enum" name="XML_CHECK_NO_PARENT" link="libxml2-xmlerror.html#XML_CHECK_NO_PARENT"/>
    <keyword type="enum" name="XML_CHECK_NO_PREV" link="libxml2-xmlerror.html#XML_CHECK_NO_PREV"/>
    <keyword type="enum" name="XML_CHECK_NS_ANCESTOR" link="libxml2-xmlerror.html#XML_CHECK_NS_ANCESTOR"/>
    <keyword type="enum" name="XML_CHECK_NS_SCOPE" link="libxml2-xmlerror.html#XML_CHECK_NS_SCOPE"/>
    <keyword type="enum" name="XML_CHECK_OUTSIDE_DICT" link="libxml2-xmlerror.html#XML_CHECK_OUTSIDE_DICT"/>
    <keyword type="enum" name="XML_CHECK_UNKNOWN_NODE" link="libxml2-xmlerror.html#XML_CHECK_UNKNOWN_NODE"/>
    <keyword type="enum" name="XML_CHECK_WRONG_DOC" link="libxml2-xmlerror.html#XML_CHECK_WRONG_DOC"/>
    <keyword type="enum" name="XML_CHECK_WRONG_NAME" link="libxml2-xmlerror.html#XML_CHECK_WRONG_NAME"/>
    <keyword type="enum" name="XML_CHECK_WRONG_NEXT" link="libxml2-xmlerror.html#XML_CHECK_WRONG_NEXT"/>
    <keyword type="enum" name="XML_CHECK_WRONG_PARENT" link="libxml2-xmlerror.html#XML_CHECK_WRONG_PARENT"/>
    <keyword type="enum" name="XML_CHECK_WRONG_PREV" link="libxml2-xmlerror.html#XML_CHECK_WRONG_PREV"/>
    <keyword type="enum" name="XML_COMMENT_NODE" link="libxml2-tree.html#XML_COMMENT_NODE"/>
    <keyword type="enum" name="XML_DOCUMENT_FRAG_NODE" link="libxml2-tree.html#XML_DOCUMENT_FRAG_NODE"/>
    <keyword type="enum" name="XML_DOCUMENT_NODE" link="libxml2-tree.html#XML_DOCUMENT_NODE"/>
    <keyword type="enum" name="XML_DOCUMENT_TYPE_NODE" link="libxml2-tree.html#XML_DOCUMENT_TYPE_NODE"/>
    <keyword type="enum" name="XML_DOC_DTDVALID" link="libxml2-tree.html#XML_DOC_DTDVALID"/>
    <keyword type="enum" name="XML_DOC_HTML" link="libxml2-tree.html#XML_DOC_HTML"/>
    <keyword type="enum" name="XML_DOC_INTERNAL" link="libxml2-tree.html#XML_DOC_INTERNAL"/>
    <keyword type="enum" name="XML_DOC_NSVALID" link="libxml2-tree.html#XML_DOC_NSVALID"/>
    <keyword type="enum" name="XML_DOC_OLD10" link="libxml2-tree.html#XML_DOC_OLD10"/>
    <keyword type="enum" name="XML_DOC_USERBUILT" link="libxml2-tree.html#XML_DOC_USERBUILT"/>
    <keyword type="enum" name="XML_DOC_WELLFORMED" link="libxml2-tree.html#XML_DOC_WELLFORMED"/>
    <keyword type="enum" name="XML_DOC_XINCLUDE" link="libxml2-tree.html#XML_DOC_XINCLUDE"/>
    <keyword type="enum" name="XML_DTD_ATTRIBUTE_DEFAULT" link="libxml2-xmlerror.html#XML_DTD_ATTRIBUTE_DEFAULT"/>
    <keyword type="enum" name="XML_DTD_ATTRIBUTE_REDEFINED" link="libxml2-xmlerror.html#XML_DTD_ATTRIBUTE_REDEFINED"/>
    <keyword type="enum" name="XML_DTD_ATTRIBUTE_VALUE" link="libxml2-xmlerror.html#XML_DTD_ATTRIBUTE_VALUE"/>
    <keyword type="enum" name="XML_DTD_CONTENT_ERROR" link="libxml2-xmlerror.html#XML_DTD_CONTENT_ERROR"/>
    <keyword type="enum" name="XML_DTD_CONTENT_MODEL" link="libxml2-xmlerror.html#XML_DTD_CONTENT_MODEL"/>
    <keyword type="enum" name="XML_DTD_CONTENT_NOT_DETERMINIST" link="libxml2-xmlerror.html#XML_DTD_CONTENT_NOT_DETERMINIST"/>
    <keyword type="enum" name="XML_DTD_DIFFERENT_PREFIX" link="libxml2-xmlerror.html#XML_DTD_DIFFERENT_PREFIX"/>
    <keyword type="enum" name="XML_DTD_DUP_TOKEN" link="libxml2-xmlerror.html#XML_DTD_DUP_TOKEN"/>
    <keyword type="enum" name="XML_DTD_ELEM_DEFAULT_NAMESPACE" link="libxml2-xmlerror.html#XML_DTD_ELEM_DEFAULT_NAMESPACE"/>
    <keyword type="enum" name="XML_DTD_ELEM_NAMESPACE" link="libxml2-xmlerror.html#XML_DTD_ELEM_NAMESPACE"/>
    <keyword type="enum" name="XML_DTD_ELEM_REDEFINED" link="libxml2-xmlerror.html#XML_DTD_ELEM_REDEFINED"/>
    <keyword type="enum" name="XML_DTD_EMPTY_NOTATION" link="libxml2-xmlerror.html#XML_DTD_EMPTY_NOTATION"/>
    <keyword type="enum" name="XML_DTD_ENTITY_TYPE" link="libxml2-xmlerror.html#XML_DTD_ENTITY_TYPE"/>
    <keyword type="enum" name="XML_DTD_ID_FIXED" link="libxml2-xmlerror.html#XML_DTD_ID_FIXED"/>
    <keyword type="enum" name="XML_DTD_ID_REDEFINED" link="libxml2-xmlerror.html#XML_DTD_ID_REDEFINED"/>
    <keyword type="enum" name="XML_DTD_ID_SUBSET" link="libxml2-xmlerror.html#XML_DTD_ID_SUBSET"/>
    <keyword type="enum" name="XML_DTD_INVALID_CHILD" link="libxml2-xmlerror.html#XML_DTD_INVALID_CHILD"/>
    <keyword type="enum" name="XML_DTD_INVALID_DEFAULT" link="libxml2-xmlerror.html#XML_DTD_INVALID_DEFAULT"/>
    <keyword type="enum" name="XML_DTD_LOAD_ERROR" link="libxml2-xmlerror.html#XML_DTD_LOAD_ERROR"/>
    <keyword type="enum" name="XML_DTD_MISSING_ATTRIBUTE" link="libxml2-xmlerror.html#XML_DTD_MISSING_ATTRIBUTE"/>
    <keyword type="enum" name="XML_DTD_MIXED_CORRUPT" link="libxml2-xmlerror.html#XML_DTD_MIXED_CORRUPT"/>
    <keyword type="enum" name="XML_DTD_MULTIPLE_ID" link="libxml2-xmlerror.html#XML_DTD_MULTIPLE_ID"/>
    <keyword type="enum" name="XML_DTD_NODE" link="libxml2-tree.html#XML_DTD_NODE"/>
    <keyword type="enum" name="XML_DTD_NOTATION_REDEFINED" link="libxml2-xmlerror.html#XML_DTD_NOTATION_REDEFINED"/>
    <keyword type="enum" name="XML_DTD_NOTATION_VALUE" link="libxml2-xmlerror.html#XML_DTD_NOTATION_VALUE"/>
    <keyword type="enum" name="XML_DTD_NOT_EMPTY" link="libxml2-xmlerror.html#XML_DTD_NOT_EMPTY"/>
    <keyword type="enum" name="XML_DTD_NOT_PCDATA" link="libxml2-xmlerror.html#XML_DTD_NOT_PCDATA"/>
    <keyword type="enum" name="XML_DTD_NOT_STANDALONE" link="libxml2-xmlerror.html#XML_DTD_NOT_STANDALONE"/>
    <keyword type="enum" name="XML_DTD_NO_DOC" link="libxml2-xmlerror.html#XML_DTD_NO_DOC"/>
    <keyword type="enum" name="XML_DTD_NO_DTD" link="libxml2-xmlerror.html#XML_DTD_NO_DTD"/>
    <keyword type="enum" name="XML_DTD_NO_ELEM_NAME" link="libxml2-xmlerror.html#XML_DTD_NO_ELEM_NAME"/>
    <keyword type="enum" name="XML_DTD_NO_PREFIX" link="libxml2-xmlerror.html#XML_DTD_NO_PREFIX"/>
    <keyword type="enum" name="XML_DTD_NO_ROOT" link="libxml2-xmlerror.html#XML_DTD_NO_ROOT"/>
    <keyword type="enum" name="XML_DTD_ROOT_NAME" link="libxml2-xmlerror.html#XML_DTD_ROOT_NAME"/>
    <keyword type="enum" name="XML_DTD_STANDALONE_DEFAULTED" link="libxml2-xmlerror.html#XML_DTD_STANDALONE_DEFAULTED"/>
    <keyword type="enum" name="XML_DTD_STANDALONE_WHITE_SPACE" link="libxml2-xmlerror.html#XML_DTD_STANDALONE_WHITE_SPACE"/>
    <keyword type="enum" name="XML_DTD_UNKNOWN_ATTRIBUTE" link="libxml2-xmlerror.html#XML_DTD_UNKNOWN_ATTRIBUTE"/>
    <keyword type="enum" name="XML_DTD_UNKNOWN_ELEM" link="libxml2-xmlerror.html#XML_DTD_UNKNOWN_ELEM"/>
    <keyword type="enum" name="XML_DTD_UNKNOWN_ENTITY" link="libxml2-xmlerror.html#XML_DTD_UNKNOWN_ENTITY"/>
    <keyword type="enum" name="XML_DTD_UNKNOWN_ID" link="libxml2-xmlerror.html#XML_DTD_UNKNOWN_ID"/>
    <keyword type="enum" name="XML_DTD_UNKNOWN_NOTATION" link="libxml2-xmlerror.html#XML_DTD_UNKNOWN_NOTATION"/>
    <keyword type="enum" name="XML_DTD_XMLID_TYPE" link="libxml2-xmlerror.html#XML_DTD_XMLID_TYPE"/>
    <keyword type="enum" name="XML_DTD_XMLID_VALUE" link="libxml2-xmlerror.html#XML_DTD_XMLID_VALUE"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_ELEMENT" link="libxml2-tree.html#XML_ELEMENT_CONTENT_ELEMENT"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_MULT" link="libxml2-tree.html#XML_ELEMENT_CONTENT_MULT"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_ONCE" link="libxml2-tree.html#XML_ELEMENT_CONTENT_ONCE"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_OPT" link="libxml2-tree.html#XML_ELEMENT_CONTENT_OPT"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_OR" link="libxml2-tree.html#XML_ELEMENT_CONTENT_OR"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_PCDATA" link="libxml2-tree.html#XML_ELEMENT_CONTENT_PCDATA"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_PLUS" link="libxml2-tree.html#XML_ELEMENT_CONTENT_PLUS"/>
    <keyword type="enum" name="XML_ELEMENT_CONTENT_SEQ" link="libxml2-tree.html#XML_ELEMENT_CONTENT_SEQ"/>
    <keyword type="enum" name="XML_ELEMENT_DECL" link="libxml2-tree.html#XML_ELEMENT_DECL"/>
    <keyword type="enum" name="XML_ELEMENT_NODE" link="libxml2-tree.html#XML_ELEMENT_NODE"/>
    <keyword type="enum" name="XML_ELEMENT_TYPE_ANY" link="libxml2-tree.html#XML_ELEMENT_TYPE_ANY"/>
    <keyword type="enum" name="XML_ELEMENT_TYPE_ELEMENT" link="libxml2-tree.html#XML_ELEMENT_TYPE_ELEMENT"/>
    <keyword type="enum" name="XML_ELEMENT_TYPE_EMPTY" link="libxml2-tree.html#XML_ELEMENT_TYPE_EMPTY"/>
    <keyword type="enum" name="XML_ELEMENT_TYPE_MIXED" link="libxml2-tree.html#XML_ELEMENT_TYPE_MIXED"/>
    <keyword type="enum" name="XML_ELEMENT_TYPE_UNDEFINED" link="libxml2-tree.html#XML_ELEMENT_TYPE_UNDEFINED"/>
    <keyword type="enum" name="XML_ENTITY_DECL" link="libxml2-tree.html#XML_ENTITY_DECL"/>
    <keyword type="enum" name="XML_ENTITY_NODE" link="libxml2-tree.html#XML_ENTITY_NODE"/>
    <keyword type="enum" name="XML_ENTITY_REF_NODE" link="libxml2-tree.html#XML_ENTITY_REF_NODE"/>
    <keyword type="enum" name="XML_ERR_ATTLIST_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_ATTLIST_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_ATTLIST_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_ATTLIST_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_ATTRIBUTE_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_ATTRIBUTE_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_ATTRIBUTE_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_ATTRIBUTE_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_ATTRIBUTE_REDEFINED" link="libxml2-xmlerror.html#XML_ERR_ATTRIBUTE_REDEFINED"/>
    <keyword type="enum" name="XML_ERR_ATTRIBUTE_WITHOUT_VALUE" link="libxml2-xmlerror.html#XML_ERR_ATTRIBUTE_WITHOUT_VALUE"/>
    <keyword type="enum" name="XML_ERR_CDATA_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_CDATA_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_CHARREF_AT_EOF" link="libxml2-xmlerror.html#XML_ERR_CHARREF_AT_EOF"/>
    <keyword type="enum" name="XML_ERR_CHARREF_IN_DTD" link="libxml2-xmlerror.html#XML_ERR_CHARREF_IN_DTD"/>
    <keyword type="enum" name="XML_ERR_CHARREF_IN_EPILOG" link="libxml2-xmlerror.html#XML_ERR_CHARREF_IN_EPILOG"/>
    <keyword type="enum" name="XML_ERR_CHARREF_IN_PROLOG" link="libxml2-xmlerror.html#XML_ERR_CHARREF_IN_PROLOG"/>
    <keyword type="enum" name="XML_ERR_COMMENT_ABRUPTLY_ENDED" link="libxml2-xmlerror.html#XML_ERR_COMMENT_ABRUPTLY_ENDED"/>
    <keyword type="enum" name="XML_ERR_COMMENT_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_COMMENT_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_CONDSEC_INVALID" link="libxml2-xmlerror.html#XML_ERR_CONDSEC_INVALID"/>
    <keyword type="enum" name="XML_ERR_CONDSEC_INVALID_KEYWORD" link="libxml2-xmlerror.html#XML_ERR_CONDSEC_INVALID_KEYWORD"/>
    <keyword type="enum" name="XML_ERR_CONDSEC_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_CONDSEC_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_CONDSEC_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_CONDSEC_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_DOCTYPE_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_DOCTYPE_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_DOCUMENT_EMPTY" link="libxml2-xmlerror.html#XML_ERR_DOCUMENT_EMPTY"/>
    <keyword type="enum" name="XML_ERR_DOCUMENT_END" link="libxml2-xmlerror.html#XML_ERR_DOCUMENT_END"/>
    <keyword type="enum" name="XML_ERR_DOCUMENT_START" link="libxml2-xmlerror.html#XML_ERR_DOCUMENT_START"/>
    <keyword type="enum" name="XML_ERR_ELEMCONTENT_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_ELEMCONTENT_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_ELEMCONTENT_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_ELEMCONTENT_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_ENCODING_NAME" link="libxml2-xmlerror.html#XML_ERR_ENCODING_NAME"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_AT_EOF" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_AT_EOF"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_IN_DTD" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_IN_DTD"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_IN_EPILOG" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_IN_EPILOG"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_IN_PROLOG" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_IN_PROLOG"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_NO_NAME" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_NO_NAME"/>
    <keyword type="enum" name="XML_ERR_ENTITYREF_SEMICOL_MISSING" link="libxml2-xmlerror.html#XML_ERR_ENTITYREF_SEMICOL_MISSING"/>
    <keyword type="enum" name="XML_ERR_ENTITY_BOUNDARY" link="libxml2-xmlerror.html#XML_ERR_ENTITY_BOUNDARY"/>
    <keyword type="enum" name="XML_ERR_ENTITY_CHAR_ERROR" link="libxml2-xmlerror.html#XML_ERR_ENTITY_CHAR_ERROR"/>
    <keyword type="enum" name="XML_ERR_ENTITY_IS_EXTERNAL" link="libxml2-xmlerror.html#XML_ERR_ENTITY_IS_EXTERNAL"/>
    <keyword type="enum" name="XML_ERR_ENTITY_IS_PARAMETER" link="libxml2-xmlerror.html#XML_ERR_ENTITY_IS_PARAMETER"/>
    <keyword type="enum" name="XML_ERR_ENTITY_LOOP" link="libxml2-xmlerror.html#XML_ERR_ENTITY_LOOP"/>
    <keyword type="enum" name="XML_ERR_ENTITY_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_ENTITY_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_ENTITY_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_ENTITY_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_ENTITY_PE_INTERNAL" link="libxml2-xmlerror.html#XML_ERR_ENTITY_PE_INTERNAL"/>
    <keyword type="enum" name="XML_ERR_ENTITY_PROCESSING" link="libxml2-xmlerror.html#XML_ERR_ENTITY_PROCESSING"/>
    <keyword type="enum" name="XML_ERR_EQUAL_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_EQUAL_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_ERROR" link="libxml2-xmlerror.html#XML_ERR_ERROR"/>
    <keyword type="enum" name="XML_ERR_EXTRA_CONTENT" link="libxml2-xmlerror.html#XML_ERR_EXTRA_CONTENT"/>
    <keyword type="enum" name="XML_ERR_EXT_ENTITY_STANDALONE" link="libxml2-xmlerror.html#XML_ERR_EXT_ENTITY_STANDALONE"/>
    <keyword type="enum" name="XML_ERR_EXT_SUBSET_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_EXT_SUBSET_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_FATAL" link="libxml2-xmlerror.html#XML_ERR_FATAL"/>
    <keyword type="enum" name="XML_ERR_GT_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_GT_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_HYPHEN_IN_COMMENT" link="libxml2-xmlerror.html#XML_ERR_HYPHEN_IN_COMMENT"/>
    <keyword type="enum" name="XML_ERR_INTERNAL_ERROR" link="libxml2-xmlerror.html#XML_ERR_INTERNAL_ERROR"/>
    <keyword type="enum" name="XML_ERR_INVALID_CHAR" link="libxml2-xmlerror.html#XML_ERR_INVALID_CHAR"/>
    <keyword type="enum" name="XML_ERR_INVALID_CHARREF" link="libxml2-xmlerror.html#XML_ERR_INVALID_CHARREF"/>
    <keyword type="enum" name="XML_ERR_INVALID_DEC_CHARREF" link="libxml2-xmlerror.html#XML_ERR_INVALID_DEC_CHARREF"/>
    <keyword type="enum" name="XML_ERR_INVALID_ENCODING" link="libxml2-xmlerror.html#XML_ERR_INVALID_ENCODING"/>
    <keyword type="enum" name="XML_ERR_INVALID_HEX_CHARREF" link="libxml2-xmlerror.html#XML_ERR_INVALID_HEX_CHARREF"/>
    <keyword type="enum" name="XML_ERR_INVALID_URI" link="libxml2-xmlerror.html#XML_ERR_INVALID_URI"/>
    <keyword type="enum" name="XML_ERR_LITERAL_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_LITERAL_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_LITERAL_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_LITERAL_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_LTSLASH_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_LTSLASH_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_LT_IN_ATTRIBUTE" link="libxml2-xmlerror.html#XML_ERR_LT_IN_ATTRIBUTE"/>
    <keyword type="enum" name="XML_ERR_LT_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_LT_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_MISPLACED_CDATA_END" link="libxml2-xmlerror.html#XML_ERR_MISPLACED_CDATA_END"/>
    <keyword type="enum" name="XML_ERR_MISSING_ENCODING" link="libxml2-xmlerror.html#XML_ERR_MISSING_ENCODING"/>
    <keyword type="enum" name="XML_ERR_MIXED_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_MIXED_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_MIXED_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_MIXED_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_NAME_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_NAME_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_NAME_TOO_LONG" link="libxml2-xmlerror.html#XML_ERR_NAME_TOO_LONG"/>
    <keyword type="enum" name="XML_ERR_NMTOKEN_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_NMTOKEN_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_NONE" link="libxml2-xmlerror.html#XML_ERR_NONE"/>
    <keyword type="enum" name="XML_ERR_NOTATION_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_NOTATION_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_NOTATION_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_NOTATION_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_NOTATION_PROCESSING" link="libxml2-xmlerror.html#XML_ERR_NOTATION_PROCESSING"/>
    <keyword type="enum" name="XML_ERR_NOT_STANDALONE" link="libxml2-xmlerror.html#XML_ERR_NOT_STANDALONE"/>
    <keyword type="enum" name="XML_ERR_NOT_WELL_BALANCED" link="libxml2-xmlerror.html#XML_ERR_NOT_WELL_BALANCED"/>
    <keyword type="enum" name="XML_ERR_NO_DTD" link="libxml2-xmlerror.html#XML_ERR_NO_DTD"/>
    <keyword type="enum" name="XML_ERR_NO_MEMORY" link="libxml2-xmlerror.html#XML_ERR_NO_MEMORY"/>
    <keyword type="enum" name="XML_ERR_NS_DECL_ERROR" link="libxml2-xmlerror.html#XML_ERR_NS_DECL_ERROR"/>
    <keyword type="enum" name="XML_ERR_OK" link="libxml2-xmlerror.html#XML_ERR_OK"/>
    <keyword type="enum" name="XML_ERR_PCDATA_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_PCDATA_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_PEREF_AT_EOF" link="libxml2-xmlerror.html#XML_ERR_PEREF_AT_EOF"/>
    <keyword type="enum" name="XML_ERR_PEREF_IN_EPILOG" link="libxml2-xmlerror.html#XML_ERR_PEREF_IN_EPILOG"/>
    <keyword type="enum" name="XML_ERR_PEREF_IN_INT_SUBSET" link="libxml2-xmlerror.html#XML_ERR_PEREF_IN_INT_SUBSET"/>
    <keyword type="enum" name="XML_ERR_PEREF_IN_PROLOG" link="libxml2-xmlerror.html#XML_ERR_PEREF_IN_PROLOG"/>
    <keyword type="enum" name="XML_ERR_PEREF_NO_NAME" link="libxml2-xmlerror.html#XML_ERR_PEREF_NO_NAME"/>
    <keyword type="enum" name="XML_ERR_PEREF_SEMICOL_MISSING" link="libxml2-xmlerror.html#XML_ERR_PEREF_SEMICOL_MISSING"/>
    <keyword type="enum" name="XML_ERR_PI_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_PI_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_PI_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_PI_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_PUBID_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_PUBID_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_RESERVED_XML_NAME" link="libxml2-xmlerror.html#XML_ERR_RESERVED_XML_NAME"/>
    <keyword type="enum" name="XML_ERR_SEPARATOR_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_SEPARATOR_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_SPACE_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_SPACE_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_STANDALONE_VALUE" link="libxml2-xmlerror.html#XML_ERR_STANDALONE_VALUE"/>
    <keyword type="enum" name="XML_ERR_STRING_NOT_CLOSED" link="libxml2-xmlerror.html#XML_ERR_STRING_NOT_CLOSED"/>
    <keyword type="enum" name="XML_ERR_STRING_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_STRING_NOT_STARTED"/>
    <keyword type="enum" name="XML_ERR_TAG_NAME_MISMATCH" link="libxml2-xmlerror.html#XML_ERR_TAG_NAME_MISMATCH"/>
    <keyword type="enum" name="XML_ERR_TAG_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_TAG_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_UNDECLARED_ENTITY" link="libxml2-xmlerror.html#XML_ERR_UNDECLARED_ENTITY"/>
    <keyword type="enum" name="XML_ERR_UNKNOWN_ENCODING" link="libxml2-xmlerror.html#XML_ERR_UNKNOWN_ENCODING"/>
    <keyword type="enum" name="XML_ERR_UNKNOWN_VERSION" link="libxml2-xmlerror.html#XML_ERR_UNKNOWN_VERSION"/>
    <keyword type="enum" name="XML_ERR_UNPARSED_ENTITY" link="libxml2-xmlerror.html#XML_ERR_UNPARSED_ENTITY"/>
    <keyword type="enum" name="XML_ERR_UNSUPPORTED_ENCODING" link="libxml2-xmlerror.html#XML_ERR_UNSUPPORTED_ENCODING"/>
    <keyword type="enum" name="XML_ERR_URI_FRAGMENT" link="libxml2-xmlerror.html#XML_ERR_URI_FRAGMENT"/>
    <keyword type="enum" name="XML_ERR_URI_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_URI_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_USER_STOP" link="libxml2-xmlerror.html#XML_ERR_USER_STOP"/>
    <keyword type="enum" name="XML_ERR_VALUE_REQUIRED" link="libxml2-xmlerror.html#XML_ERR_VALUE_REQUIRED"/>
    <keyword type="enum" name="XML_ERR_VERSION_MISMATCH" link="libxml2-xmlerror.html#XML_ERR_VERSION_MISMATCH"/>
    <keyword type="enum" name="XML_ERR_VERSION_MISSING" link="libxml2-xmlerror.html#XML_ERR_VERSION_MISSING"/>
    <keyword type="enum" name="XML_ERR_WARNING" link="libxml2-xmlerror.html#XML_ERR_WARNING"/>
    <keyword type="enum" name="XML_ERR_XMLDECL_NOT_FINISHED" link="libxml2-xmlerror.html#XML_ERR_XMLDECL_NOT_FINISHED"/>
    <keyword type="enum" name="XML_ERR_XMLDECL_NOT_STARTED" link="libxml2-xmlerror.html#XML_ERR_XMLDECL_NOT_STARTED"/>
    <keyword type="enum" name="XML_EXP_ATOM" link="libxml2-xmlregexp.html#XML_EXP_ATOM"/>
    <keyword type="enum" name="XML_EXP_COUNT" link="libxml2-xmlregexp.html#XML_EXP_COUNT"/>
    <keyword type="enum" name="XML_EXP_EMPTY" link="libxml2-xmlregexp.html#XML_EXP_EMPTY"/>
    <keyword type="enum" name="XML_EXP_FORBID" link="libxml2-xmlregexp.html#XML_EXP_FORBID"/>
    <keyword type="enum" name="XML_EXP_OR" link="libxml2-xmlregexp.html#XML_EXP_OR"/>
    <keyword type="enum" name="XML_EXP_SEQ" link="libxml2-xmlregexp.html#XML_EXP_SEQ"/>
    <keyword type="enum" name="XML_EXTERNAL_GENERAL_PARSED_ENTITY" link="libxml2-entities.html#XML_EXTERNAL_GENERAL_PARSED_ENTITY"/>
    <keyword type="enum" name="XML_EXTERNAL_GENERAL_UNPARSED_ENTITY" link="libxml2-entities.html#XML_EXTERNAL_GENERAL_UNPARSED_ENTITY"/>
    <keyword type="enum" name="XML_EXTERNAL_PARAMETER_ENTITY" link="libxml2-entities.html#XML_EXTERNAL_PARAMETER_ENTITY"/>
    <keyword type="enum" name="XML_FROM_BUFFER" link="libxml2-xmlerror.html#XML_FROM_BUFFER"/>
    <keyword type="enum" name="XML_FROM_C14N" link="libxml2-xmlerror.html#XML_FROM_C14N"/>
    <keyword type="enum" name="XML_FROM_CATALOG" link="libxml2-xmlerror.html#XML_FROM_CATALOG"/>
    <keyword type="enum" name="XML_FROM_CHECK" link="libxml2-xmlerror.html#XML_FROM_CHECK"/>
    <keyword type="enum" name="XML_FROM_DATATYPE" link="libxml2-xmlerror.html#XML_FROM_DATATYPE"/>
    <keyword type="enum" name="XML_FROM_DTD" link="libxml2-xmlerror.html#XML_FROM_DTD"/>
    <keyword type="enum" name="XML_FROM_FTP" link="libxml2-xmlerror.html#XML_FROM_FTP"/>
    <keyword type="enum" name="XML_FROM_HTML" link="libxml2-xmlerror.html#XML_FROM_HTML"/>
    <keyword type="enum" name="XML_FROM_HTTP" link="libxml2-xmlerror.html#XML_FROM_HTTP"/>
    <keyword type="enum" name="XML_FROM_I18N" link="libxml2-xmlerror.html#XML_FROM_I18N"/>
    <keyword type="enum" name="XML_FROM_IO" link="libxml2-xmlerror.html#XML_FROM_IO"/>
    <keyword type="enum" name="XML_FROM_MEMORY" link="libxml2-xmlerror.html#XML_FROM_MEMORY"/>
    <keyword type="enum" name="XML_FROM_MODULE" link="libxml2-xmlerror.html#XML_FROM_MODULE"/>
    <keyword type="enum" name="XML_FROM_NAMESPACE" link="libxml2-xmlerror.html#XML_FROM_NAMESPACE"/>
    <keyword type="enum" name="XML_FROM_NONE" link="libxml2-xmlerror.html#XML_FROM_NONE"/>
    <keyword type="enum" name="XML_FROM_OUTPUT" link="libxml2-xmlerror.html#XML_FROM_OUTPUT"/>
    <keyword type="enum" name="XML_FROM_PARSER" link="libxml2-xmlerror.html#XML_FROM_PARSER"/>
    <keyword type="enum" name="XML_FROM_REGEXP" link="libxml2-xmlerror.html#XML_FROM_REGEXP"/>
    <keyword type="enum" name="XML_FROM_RELAXNGP" link="libxml2-xmlerror.html#XML_FROM_RELAXNGP"/>
    <keyword type="enum" name="XML_FROM_RELAXNGV" link="libxml2-xmlerror.html#XML_FROM_RELAXNGV"/>
    <keyword type="enum" name="XML_FROM_SCHEMASP" link="libxml2-xmlerror.html#XML_FROM_SCHEMASP"/>
    <keyword type="enum" name="XML_FROM_SCHEMASV" link="libxml2-xmlerror.html#XML_FROM_SCHEMASV"/>
    <keyword type="enum" name="XML_FROM_SCHEMATRONV" link="libxml2-xmlerror.html#XML_FROM_SCHEMATRONV"/>
    <keyword type="enum" name="XML_FROM_TREE" link="libxml2-xmlerror.html#XML_FROM_TREE"/>
    <keyword type="enum" name="XML_FROM_URI" link="libxml2-xmlerror.html#XML_FROM_URI"/>
    <keyword type="enum" name="XML_FROM_VALID" link="libxml2-xmlerror.html#XML_FROM_VALID"/>
    <keyword type="enum" name="XML_FROM_WRITER" link="libxml2-xmlerror.html#XML_FROM_WRITER"/>
    <keyword type="enum" name="XML_FROM_XINCLUDE" link="libxml2-xmlerror.html#XML_FROM_XINCLUDE"/>
    <keyword type="enum" name="XML_FROM_XPATH" link="libxml2-xmlerror.html#XML_FROM_XPATH"/>
    <keyword type="enum" name="XML_FROM_XPOINTER" link="libxml2-xmlerror.html#XML_FROM_XPOINTER"/>
    <keyword type="enum" name="XML_FROM_XSLT" link="libxml2-xmlerror.html#XML_FROM_XSLT"/>
    <keyword type="enum" name="XML_FTP_ACCNT" link="libxml2-xmlerror.html#XML_FTP_ACCNT"/>
    <keyword type="enum" name="XML_FTP_EPSV_ANSWER" link="libxml2-xmlerror.html#XML_FTP_EPSV_ANSWER"/>
    <keyword type="enum" name="XML_FTP_PASV_ANSWER" link="libxml2-xmlerror.html#XML_FTP_PASV_ANSWER"/>
    <keyword type="enum" name="XML_FTP_URL_SYNTAX" link="libxml2-xmlerror.html#XML_FTP_URL_SYNTAX"/>
    <keyword type="enum" name="XML_HTML_DOCUMENT_NODE" link="libxml2-tree.html#XML_HTML_DOCUMENT_NODE"/>
    <keyword type="enum" name="XML_HTML_INCORRECTLY_OPENED_COMMENT" link="libxml2-xmlerror.html#XML_HTML_INCORRECTLY_OPENED_COMMENT"/>
    <keyword type="enum" name="XML_HTML_STRUCURE_ERROR" link="libxml2-xmlerror.html#XML_HTML_STRUCURE_ERROR"/>
    <keyword type="enum" name="XML_HTML_UNKNOWN_TAG" link="libxml2-xmlerror.html#XML_HTML_UNKNOWN_TAG"/>
    <keyword type="enum" name="XML_HTTP_UNKNOWN_HOST" link="libxml2-xmlerror.html#XML_HTTP_UNKNOWN_HOST"/>
    <keyword type="enum" name="XML_HTTP_URL_SYNTAX" link="libxml2-xmlerror.html#XML_HTTP_URL_SYNTAX"/>
    <keyword type="enum" name="XML_HTTP_USE_IP" link="libxml2-xmlerror.html#XML_HTTP_USE_IP"/>
    <keyword type="enum" name="XML_I18N_CONV_FAILED" link="libxml2-xmlerror.html#XML_I18N_CONV_FAILED"/>
    <keyword type="enum" name="XML_I18N_EXCESS_HANDLER" link="libxml2-xmlerror.html#XML_I18N_EXCESS_HANDLER"/>
    <keyword type="enum" name="XML_I18N_NO_HANDLER" link="libxml2-xmlerror.html#XML_I18N_NO_HANDLER"/>
    <keyword type="enum" name="XML_I18N_NO_NAME" link="libxml2-xmlerror.html#XML_I18N_NO_NAME"/>
    <keyword type="enum" name="XML_I18N_NO_OUTPUT" link="libxml2-xmlerror.html#XML_I18N_NO_OUTPUT"/>
    <keyword type="enum" name="XML_INTERNAL_GENERAL_ENTITY" link="libxml2-entities.html#XML_INTERNAL_GENERAL_ENTITY"/>
    <keyword type="enum" name="XML_INTERNAL_PARAMETER_ENTITY" link="libxml2-entities.html#XML_INTERNAL_PARAMETER_ENTITY"/>
    <keyword type="enum" name="XML_INTERNAL_PREDEFINED_ENTITY" link="libxml2-entities.html#XML_INTERNAL_PREDEFINED_ENTITY"/>
    <keyword type="enum" name="XML_IO_BUFFER_FULL" link="libxml2-xmlerror.html#XML_IO_BUFFER_FULL"/>
    <keyword type="enum" name="XML_IO_EACCES" link="libxml2-xmlerror.html#XML_IO_EACCES"/>
    <keyword type="enum" name="XML_IO_EADDRINUSE" link="libxml2-xmlerror.html#XML_IO_EADDRINUSE"/>
    <keyword type="enum" name="XML_IO_EAFNOSUPPORT" link="libxml2-xmlerror.html#XML_IO_EAFNOSUPPORT"/>
    <keyword type="enum" name="XML_IO_EAGAIN" link="libxml2-xmlerror.html#XML_IO_EAGAIN"/>
    <keyword type="enum" name="XML_IO_EALREADY" link="libxml2-xmlerror.html#XML_IO_EALREADY"/>
    <keyword type="enum" name="XML_IO_EBADF" link="libxml2-xmlerror.html#XML_IO_EBADF"/>
    <keyword type="enum" name="XML_IO_EBADMSG" link="libxml2-xmlerror.html#XML_IO_EBADMSG"/>
    <keyword type="enum" name="XML_IO_EBUSY" link="libxml2-xmlerror.html#XML_IO_EBUSY"/>
    <keyword type="enum" name="XML_IO_ECANCELED" link="libxml2-xmlerror.html#XML_IO_ECANCELED"/>
    <keyword type="enum" name="XML_IO_ECHILD" link="libxml2-xmlerror.html#XML_IO_ECHILD"/>
    <keyword type="enum" name="XML_IO_ECONNREFUSED" link="libxml2-xmlerror.html#XML_IO_ECONNREFUSED"/>
    <keyword type="enum" name="XML_IO_EDEADLK" link="libxml2-xmlerror.html#XML_IO_EDEADLK"/>
    <keyword type="enum" name="XML_IO_EDOM" link="libxml2-xmlerror.html#XML_IO_EDOM"/>
    <keyword type="enum" name="XML_IO_EEXIST" link="libxml2-xmlerror.html#XML_IO_EEXIST"/>
    <keyword type="enum" name="XML_IO_EFAULT" link="libxml2-xmlerror.html#XML_IO_EFAULT"/>
    <keyword type="enum" name="XML_IO_EFBIG" link="libxml2-xmlerror.html#XML_IO_EFBIG"/>
    <keyword type="enum" name="XML_IO_EINPROGRESS" link="libxml2-xmlerror.html#XML_IO_EINPROGRESS"/>
    <keyword type="enum" name="XML_IO_EINTR" link="libxml2-xmlerror.html#XML_IO_EINTR"/>
    <keyword type="enum" name="XML_IO_EINVAL" link="libxml2-xmlerror.html#XML_IO_EINVAL"/>
    <keyword type="enum" name="XML_IO_EIO" link="libxml2-xmlerror.html#XML_IO_EIO"/>
    <keyword type="enum" name="XML_IO_EISCONN" link="libxml2-xmlerror.html#XML_IO_EISCONN"/>
    <keyword type="enum" name="XML_IO_EISDIR" link="libxml2-xmlerror.html#XML_IO_EISDIR"/>
    <keyword type="enum" name="XML_IO_EMFILE" link="libxml2-xmlerror.html#XML_IO_EMFILE"/>
    <keyword type="enum" name="XML_IO_EMLINK" link="libxml2-xmlerror.html#XML_IO_EMLINK"/>
    <keyword type="enum" name="XML_IO_EMSGSIZE" link="libxml2-xmlerror.html#XML_IO_EMSGSIZE"/>
    <keyword type="enum" name="XML_IO_ENAMETOOLONG" link="libxml2-xmlerror.html#XML_IO_ENAMETOOLONG"/>
    <keyword type="enum" name="XML_IO_ENCODER" link="libxml2-xmlerror.html#XML_IO_ENCODER"/>
    <keyword type="enum" name="XML_IO_ENETUNREACH" link="libxml2-xmlerror.html#XML_IO_ENETUNREACH"/>
    <keyword type="enum" name="XML_IO_ENFILE" link="libxml2-xmlerror.html#XML_IO_ENFILE"/>
    <keyword type="enum" name="XML_IO_ENODEV" link="libxml2-xmlerror.html#XML_IO_ENODEV"/>
    <keyword type="enum" name="XML_IO_ENOENT" link="libxml2-xmlerror.html#XML_IO_ENOENT"/>
    <keyword type="enum" name="XML_IO_ENOEXEC" link="libxml2-xmlerror.html#XML_IO_ENOEXEC"/>
    <keyword type="enum" name="XML_IO_ENOLCK" link="libxml2-xmlerror.html#XML_IO_ENOLCK"/>
    <keyword type="enum" name="XML_IO_ENOMEM" link="libxml2-xmlerror.html#XML_IO_ENOMEM"/>
    <keyword type="enum" name="XML_IO_ENOSPC" link="libxml2-xmlerror.html#XML_IO_ENOSPC"/>
    <keyword type="enum" name="XML_IO_ENOSYS" link="libxml2-xmlerror.html#XML_IO_ENOSYS"/>
    <keyword type="enum" name="XML_IO_ENOTDIR" link="libxml2-xmlerror.html#XML_IO_ENOTDIR"/>
    <keyword type="enum" name="XML_IO_ENOTEMPTY" link="libxml2-xmlerror.html#XML_IO_ENOTEMPTY"/>
    <keyword type="enum" name="XML_IO_ENOTSOCK" link="libxml2-xmlerror.html#XML_IO_ENOTSOCK"/>
    <keyword type="enum" name="XML_IO_ENOTSUP" link="libxml2-xmlerror.html#XML_IO_ENOTSUP"/>
    <keyword type="enum" name="XML_IO_ENOTTY" link="libxml2-xmlerror.html#XML_IO_ENOTTY"/>
    <keyword type="enum" name="XML_IO_ENXIO" link="libxml2-xmlerror.html#XML_IO_ENXIO"/>
    <keyword type="enum" name="XML_IO_EPERM" link="libxml2-xmlerror.html#XML_IO_EPERM"/>
    <keyword type="enum" name="XML_IO_EPIPE" link="libxml2-xmlerror.html#XML_IO_EPIPE"/>
    <keyword type="enum" name="XML_IO_ERANGE" link="libxml2-xmlerror.html#XML_IO_ERANGE"/>
    <keyword type="enum" name="XML_IO_EROFS" link="libxml2-xmlerror.html#XML_IO_EROFS"/>
    <keyword type="enum" name="XML_IO_ESPIPE" link="libxml2-xmlerror.html#XML_IO_ESPIPE"/>
    <keyword type="enum" name="XML_IO_ESRCH" link="libxml2-xmlerror.html#XML_IO_ESRCH"/>
    <keyword type="enum" name="XML_IO_ETIMEDOUT" link="libxml2-xmlerror.html#XML_IO_ETIMEDOUT"/>
    <keyword type="enum" name="XML_IO_EXDEV" link="libxml2-xmlerror.html#XML_IO_EXDEV"/>
    <keyword type="enum" name="XML_IO_FLUSH" link="libxml2-xmlerror.html#XML_IO_FLUSH"/>
    <keyword type="enum" name="XML_IO_LOAD_ERROR" link="libxml2-xmlerror.html#XML_IO_LOAD_ERROR"/>
    <keyword type="enum" name="XML_IO_NETWORK_ATTEMPT" link="libxml2-xmlerror.html#XML_IO_NETWORK_ATTEMPT"/>
    <keyword type="enum" name="XML_IO_NO_INPUT" link="libxml2-xmlerror.html#XML_IO_NO_INPUT"/>
    <keyword type="enum" name="XML_IO_UNKNOWN" link="libxml2-xmlerror.html#XML_IO_UNKNOWN"/>
    <keyword type="enum" name="XML_IO_WRITE" link="libxml2-xmlerror.html#XML_IO_WRITE"/>
    <keyword type="enum" name="XML_MODULE_CLOSE" link="libxml2-xmlerror.html#XML_MODULE_CLOSE"/>
    <keyword type="enum" name="XML_MODULE_LAZY" link="libxml2-xmlmodule.html#XML_MODULE_LAZY"/>
    <keyword type="enum" name="XML_MODULE_LOCAL" link="libxml2-xmlmodule.html#XML_MODULE_LOCAL"/>
    <keyword type="enum" name="XML_MODULE_OPEN" link="libxml2-xmlerror.html#XML_MODULE_OPEN"/>
    <keyword type="enum" name="XML_NAMESPACE_DECL" link="libxml2-tree.html#XML_NAMESPACE_DECL"/>
    <keyword type="enum" name="XML_NOTATION_NODE" link="libxml2-tree.html#XML_NOTATION_NODE"/>
    <keyword type="enum" name="XML_NS_ERR_ATTRIBUTE_REDEFINED" link="libxml2-xmlerror.html#XML_NS_ERR_ATTRIBUTE_REDEFINED"/>
    <keyword type="enum" name="XML_NS_ERR_COLON" link="libxml2-xmlerror.html#XML_NS_ERR_COLON"/>
    <keyword type="enum" name="XML_NS_ERR_EMPTY" link="libxml2-xmlerror.html#XML_NS_ERR_EMPTY"/>
    <keyword type="enum" name="XML_NS_ERR_QNAME" link="libxml2-xmlerror.html#XML_NS_ERR_QNAME"/>
    <keyword type="enum" name="XML_NS_ERR_UNDEFINED_NAMESPACE" link="libxml2-xmlerror.html#XML_NS_ERR_UNDEFINED_NAMESPACE"/>
    <keyword type="enum" name="XML_NS_ERR_XML_NAMESPACE" link="libxml2-xmlerror.html#XML_NS_ERR_XML_NAMESPACE"/>
    <keyword type="enum" name="XML_PARSER_ATTRIBUTE_VALUE" link="libxml2-parser.html#XML_PARSER_ATTRIBUTE_VALUE"/>
    <keyword type="enum" name="XML_PARSER_CDATA_SECTION" link="libxml2-parser.html#XML_PARSER_CDATA_SECTION"/>
    <keyword type="enum" name="XML_PARSER_COMMENT" link="libxml2-parser.html#XML_PARSER_COMMENT"/>
    <keyword type="enum" name="XML_PARSER_CONTENT" link="libxml2-parser.html#XML_PARSER_CONTENT"/>
    <keyword type="enum" name="XML_PARSER_DEFAULTATTRS" link="libxml2-xmlreader.html#XML_PARSER_DEFAULTATTRS"/>
    <keyword type="enum" name="XML_PARSER_DTD" link="libxml2-parser.html#XML_PARSER_DTD"/>
    <keyword type="enum" name="XML_PARSER_END_TAG" link="libxml2-parser.html#XML_PARSER_END_TAG"/>
    <keyword type="enum" name="XML_PARSER_ENTITY_DECL" link="libxml2-parser.html#XML_PARSER_ENTITY_DECL"/>
    <keyword type="enum" name="XML_PARSER_ENTITY_VALUE" link="libxml2-parser.html#XML_PARSER_ENTITY_VALUE"/>
    <keyword type="enum" name="XML_PARSER_EOF" link="libxml2-parser.html#XML_PARSER_EOF"/>
    <keyword type="enum" name="XML_PARSER_EPILOG" link="libxml2-parser.html#XML_PARSER_EPILOG"/>
    <keyword type="enum" name="XML_PARSER_IGNORE" link="libxml2-parser.html#XML_PARSER_IGNORE"/>
    <keyword type="enum" name="XML_PARSER_LOADDTD" link="libxml2-xmlreader.html#XML_PARSER_LOADDTD"/>
    <keyword type="enum" name="XML_PARSER_MISC" link="libxml2-parser.html#XML_PARSER_MISC"/>
    <keyword type="enum" name="XML_PARSER_PI" link="libxml2-parser.html#XML_PARSER_PI"/>
    <keyword type="enum" name="XML_PARSER_PROLOG" link="libxml2-parser.html#XML_PARSER_PROLOG"/>
    <keyword type="enum" name="XML_PARSER_PUBLIC_LITERAL" link="libxml2-parser.html#XML_PARSER_PUBLIC_LITERAL"/>
    <keyword type="enum" name="XML_PARSER_SEVERITY_ERROR" link="libxml2-xmlreader.html#XML_PARSER_SEVERITY_ERROR"/>
    <keyword type="enum" name="XML_PARSER_SEVERITY_VALIDITY_ERROR" link="libxml2-xmlreader.html#XML_PARSER_SEVERITY_VALIDITY_ERROR"/>
    <keyword type="enum" name="XML_PARSER_SEVERITY_VALIDITY_WARNING" link="libxml2-xmlreader.html#XML_PARSER_SEVERITY_VALIDITY_WARNING"/>
    <keyword type="enum" name="XML_PARSER_SEVERITY_WARNING" link="libxml2-xmlreader.html#XML_PARSER_SEVERITY_WARNING"/>
    <keyword type="enum" name="XML_PARSER_START" link="libxml2-parser.html#XML_PARSER_START"/>
    <keyword type="enum" name="XML_PARSER_START_TAG" link="libxml2-parser.html#XML_PARSER_START_TAG"/>
    <keyword type="enum" name="XML_PARSER_SUBST_ENTITIES" link="libxml2-xmlreader.html#XML_PARSER_SUBST_ENTITIES"/>
    <keyword type="enum" name="XML_PARSER_SYSTEM_LITERAL" link="libxml2-parser.html#XML_PARSER_SYSTEM_LITERAL"/>
    <keyword type="enum" name="XML_PARSER_VALIDATE" link="libxml2-xmlreader.html#XML_PARSER_VALIDATE"/>
    <keyword type="enum" name="XML_PARSE_BIG_LINES" link="libxml2-parser.html#XML_PARSE_BIG_LINES"/>
    <keyword type="enum" name="XML_PARSE_COMPACT" link="libxml2-parser.html#XML_PARSE_COMPACT"/>
    <keyword type="enum" name="XML_PARSE_DOM" link="libxml2-parser.html#XML_PARSE_DOM"/>
    <keyword type="enum" name="XML_PARSE_DTDATTR" link="libxml2-parser.html#XML_PARSE_DTDATTR"/>
    <keyword type="enum" name="XML_PARSE_DTDLOAD" link="libxml2-parser.html#XML_PARSE_DTDLOAD"/>
    <keyword type="enum" name="XML_PARSE_DTDVALID" link="libxml2-parser.html#XML_PARSE_DTDVALID"/>
    <keyword type="enum" name="XML_PARSE_HUGE" link="libxml2-parser.html#XML_PARSE_HUGE"/>
    <keyword type="enum" name="XML_PARSE_IGNORE_ENC" link="libxml2-parser.html#XML_PARSE_IGNORE_ENC"/>
    <keyword type="enum" name="XML_PARSE_NOBASEFIX" link="libxml2-parser.html#XML_PARSE_NOBASEFIX"/>
    <keyword type="enum" name="XML_PARSE_NOBLANKS" link="libxml2-parser.html#XML_PARSE_NOBLANKS"/>
    <keyword type="enum" name="XML_PARSE_NOCDATA" link="libxml2-parser.html#XML_PARSE_NOCDATA"/>
    <keyword type="enum" name="XML_PARSE_NODICT" link="libxml2-parser.html#XML_PARSE_NODICT"/>
    <keyword type="enum" name="XML_PARSE_NOENT" link="libxml2-parser.html#XML_PARSE_NOENT"/>
    <keyword type="enum" name="XML_PARSE_NOERROR" link="libxml2-parser.html#XML_PARSE_NOERROR"/>
    <keyword type="enum" name="XML_PARSE_NONET" link="libxml2-parser.html#XML_PARSE_NONET"/>
    <keyword type="enum" name="XML_PARSE_NOWARNING" link="libxml2-parser.html#XML_PARSE_NOWARNING"/>
    <keyword type="enum" name="XML_PARSE_NOXINCNODE" link="libxml2-parser.html#XML_PARSE_NOXINCNODE"/>
    <keyword type="enum" name="XML_PARSE_NSCLEAN" link="libxml2-parser.html#XML_PARSE_NSCLEAN"/>
    <keyword type="enum" name="XML_PARSE_OLD10" link="libxml2-parser.html#XML_PARSE_OLD10"/>
    <keyword type="enum" name="XML_PARSE_OLDSAX" link="libxml2-parser.html#XML_PARSE_OLDSAX"/>
    <keyword type="enum" name="XML_PARSE_PEDANTIC" link="libxml2-parser.html#XML_PARSE_PEDANTIC"/>
    <keyword type="enum" name="XML_PARSE_PUSH_DOM" link="libxml2-parser.html#XML_PARSE_PUSH_DOM"/>
    <keyword type="enum" name="XML_PARSE_PUSH_SAX" link="libxml2-parser.html#XML_PARSE_PUSH_SAX"/>
    <keyword type="enum" name="XML_PARSE_READER" link="libxml2-parser.html#XML_PARSE_READER"/>
    <keyword type="enum" name="XML_PARSE_RECOVER" link="libxml2-parser.html#XML_PARSE_RECOVER"/>
    <keyword type="enum" name="XML_PARSE_SAX" link="libxml2-parser.html#XML_PARSE_SAX"/>
    <keyword type="enum" name="XML_PARSE_SAX1" link="libxml2-parser.html#XML_PARSE_SAX1"/>
    <keyword type="enum" name="XML_PARSE_UNKNOWN" link="libxml2-parser.html#XML_PARSE_UNKNOWN"/>
    <keyword type="enum" name="XML_PARSE_XINCLUDE" link="libxml2-parser.html#XML_PARSE_XINCLUDE"/>
    <keyword type="enum" name="XML_PATTERN_DEFAULT" link="libxml2-pattern.html#XML_PATTERN_DEFAULT"/>
    <keyword type="enum" name="XML_PATTERN_XPATH" link="libxml2-pattern.html#XML_PATTERN_XPATH"/>
    <keyword type="enum" name="XML_PATTERN_XSFIELD" link="libxml2-pattern.html#XML_PATTERN_XSFIELD"/>
    <keyword type="enum" name="XML_PATTERN_XSSEL" link="libxml2-pattern.html#XML_PATTERN_XSSEL"/>
    <keyword type="enum" name="XML_PI_NODE" link="libxml2-tree.html#XML_PI_NODE"/>
    <keyword type="enum" name="XML_READER_TYPE_ATTRIBUTE" link="libxml2-xmlreader.html#XML_READER_TYPE_ATTRIBUTE"/>
    <keyword type="enum" name="XML_READER_TYPE_CDATA" link="libxml2-xmlreader.html#XML_READER_TYPE_CDATA"/>
    <keyword type="enum" name="XML_READER_TYPE_COMMENT" link="libxml2-xmlreader.html#XML_READER_TYPE_COMMENT"/>
    <keyword type="enum" name="XML_READER_TYPE_DOCUMENT" link="libxml2-xmlreader.html#XML_READER_TYPE_DOCUMENT"/>
    <keyword type="enum" name="XML_READER_TYPE_DOCUMENT_FRAGMENT" link="libxml2-xmlreader.html#XML_READER_TYPE_DOCUMENT_FRAGMENT"/>
    <keyword type="enum" name="XML_READER_TYPE_DOCUMENT_TYPE" link="libxml2-xmlreader.html#XML_READER_TYPE_DOCUMENT_TYPE"/>
    <keyword type="enum" name="XML_READER_TYPE_ELEMENT" link="libxml2-xmlreader.html#XML_READER_TYPE_ELEMENT"/>
    <keyword type="enum" name="XML_READER_TYPE_END_ELEMENT" link="libxml2-xmlreader.html#XML_READER_TYPE_END_ELEMENT"/>
    <keyword type="enum" name="XML_READER_TYPE_END_ENTITY" link="libxml2-xmlreader.html#XML_READER_TYPE_END_ENTITY"/>
    <keyword type="enum" name="XML_READER_TYPE_ENTITY" link="libxml2-xmlreader.html#XML_READER_TYPE_ENTITY"/>
    <keyword type="enum" name="XML_READER_TYPE_ENTITY_REFERENCE" link="libxml2-xmlreader.html#XML_READER_TYPE_ENTITY_REFERENCE"/>
    <keyword type="enum" name="XML_READER_TYPE_NONE" link="libxml2-xmlreader.html#XML_READER_TYPE_NONE"/>
    <keyword type="enum" name="XML_READER_TYPE_NOTATION" link="libxml2-xmlreader.html#XML_READER_TYPE_NOTATION"/>
    <keyword type="enum" name="XML_READER_TYPE_PROCESSING_INSTRUCTION" link="libxml2-xmlreader.html#XML_READER_TYPE_PROCESSING_INSTRUCTION"/>
    <keyword type="enum" name="XML_READER_TYPE_SIGNIFICANT_WHITESPACE" link="libxml2-xmlreader.html#XML_READER_TYPE_SIGNIFICANT_WHITESPACE"/>
    <keyword type="enum" name="XML_READER_TYPE_TEXT" link="libxml2-xmlreader.html#XML_READER_TYPE_TEXT"/>
    <keyword type="enum" name="XML_READER_TYPE_WHITESPACE" link="libxml2-xmlreader.html#XML_READER_TYPE_WHITESPACE"/>
    <keyword type="enum" name="XML_READER_TYPE_XML_DECLARATION" link="libxml2-xmlreader.html#XML_READER_TYPE_XML_DECLARATION"/>
    <keyword type="enum" name="XML_REGEXP_COMPILE_ERROR" link="libxml2-xmlerror.html#XML_REGEXP_COMPILE_ERROR"/>
    <keyword type="enum" name="XML_RELAXNGP_CRNG" link="libxml2-relaxng.html#XML_RELAXNGP_CRNG"/>
    <keyword type="enum" name="XML_RELAXNGP_FREE_DOC" link="libxml2-relaxng.html#XML_RELAXNGP_FREE_DOC"/>
    <keyword type="enum" name="XML_RELAXNGP_NONE" link="libxml2-relaxng.html#XML_RELAXNGP_NONE"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ATTREXTRANS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ATTREXTRANS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ATTRNAME" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ATTRNAME"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ATTRNONS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ATTRNONS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ATTRVALID" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ATTRVALID"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ATTRWRONGNS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ATTRWRONGNS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_CONTENTVALID" link="libxml2-relaxng.html#XML_RELAXNG_ERR_CONTENTVALID"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_DATAELEM" link="libxml2-relaxng.html#XML_RELAXNG_ERR_DATAELEM"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_DATATYPE" link="libxml2-relaxng.html#XML_RELAXNG_ERR_DATATYPE"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_DUPID" link="libxml2-relaxng.html#XML_RELAXNG_ERR_DUPID"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMEXTRANS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMEXTRANS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMNAME" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMNAME"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMNONS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMNONS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMNOTEMPTY" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMNOTEMPTY"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMWRONG" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMWRONG"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_ELEMWRONGNS" link="libxml2-relaxng.html#XML_RELAXNG_ERR_ELEMWRONGNS"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_EXTRACONTENT" link="libxml2-relaxng.html#XML_RELAXNG_ERR_EXTRACONTENT"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_EXTRADATA" link="libxml2-relaxng.html#XML_RELAXNG_ERR_EXTRADATA"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_INTEREXTRA" link="libxml2-relaxng.html#XML_RELAXNG_ERR_INTEREXTRA"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_INTERNAL" link="libxml2-relaxng.html#XML_RELAXNG_ERR_INTERNAL"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_INTERNODATA" link="libxml2-relaxng.html#XML_RELAXNG_ERR_INTERNODATA"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_INTERSEQ" link="libxml2-relaxng.html#XML_RELAXNG_ERR_INTERSEQ"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_INVALIDATTR" link="libxml2-relaxng.html#XML_RELAXNG_ERR_INVALIDATTR"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_LACKDATA" link="libxml2-relaxng.html#XML_RELAXNG_ERR_LACKDATA"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_LIST" link="libxml2-relaxng.html#XML_RELAXNG_ERR_LIST"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_LISTELEM" link="libxml2-relaxng.html#XML_RELAXNG_ERR_LISTELEM"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_LISTEMPTY" link="libxml2-relaxng.html#XML_RELAXNG_ERR_LISTEMPTY"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_LISTEXTRA" link="libxml2-relaxng.html#XML_RELAXNG_ERR_LISTEXTRA"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_MEMORY" link="libxml2-relaxng.html#XML_RELAXNG_ERR_MEMORY"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_NODEFINE" link="libxml2-relaxng.html#XML_RELAXNG_ERR_NODEFINE"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_NOELEM" link="libxml2-relaxng.html#XML_RELAXNG_ERR_NOELEM"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_NOGRAMMAR" link="libxml2-relaxng.html#XML_RELAXNG_ERR_NOGRAMMAR"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_NOSTATE" link="libxml2-relaxng.html#XML_RELAXNG_ERR_NOSTATE"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_NOTELEM" link="libxml2-relaxng.html#XML_RELAXNG_ERR_NOTELEM"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_TEXTWRONG" link="libxml2-relaxng.html#XML_RELAXNG_ERR_TEXTWRONG"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_TYPE" link="libxml2-relaxng.html#XML_RELAXNG_ERR_TYPE"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_TYPECMP" link="libxml2-relaxng.html#XML_RELAXNG_ERR_TYPECMP"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_TYPEVAL" link="libxml2-relaxng.html#XML_RELAXNG_ERR_TYPEVAL"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_VALELEM" link="libxml2-relaxng.html#XML_RELAXNG_ERR_VALELEM"/>
    <keyword type="enum" name="XML_RELAXNG_ERR_VALUE" link="libxml2-relaxng.html#XML_RELAXNG_ERR_VALUE"/>
    <keyword type="enum" name="XML_RELAXNG_OK" link="libxml2-relaxng.html#XML_RELAXNG_OK"/>
    <keyword type="enum" name="XML_RNGP_ANYNAME_ATTR_ANCESTOR" link="libxml2-xmlerror.html#XML_RNGP_ANYNAME_ATTR_ANCESTOR"/>
    <keyword type="enum" name="XML_RNGP_ATTRIBUTE_CHILDREN" link="libxml2-xmlerror.html#XML_RNGP_ATTRIBUTE_CHILDREN"/>
    <keyword type="enum" name="XML_RNGP_ATTRIBUTE_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_ATTRIBUTE_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_ATTRIBUTE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_ATTRIBUTE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_ATTRIBUTE_NOOP" link="libxml2-xmlerror.html#XML_RNGP_ATTRIBUTE_NOOP"/>
    <keyword type="enum" name="XML_RNGP_ATTR_CONFLICT" link="libxml2-xmlerror.html#XML_RNGP_ATTR_CONFLICT"/>
    <keyword type="enum" name="XML_RNGP_CHOICE_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_CHOICE_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_CHOICE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_CHOICE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_CREATE_FAILURE" link="libxml2-xmlerror.html#XML_RNGP_CREATE_FAILURE"/>
    <keyword type="enum" name="XML_RNGP_DATA_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_DATA_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_DEFINE_CREATE_FAILED" link="libxml2-xmlerror.html#XML_RNGP_DEFINE_CREATE_FAILED"/>
    <keyword type="enum" name="XML_RNGP_DEFINE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_DEFINE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_DEFINE_MISSING" link="libxml2-xmlerror.html#XML_RNGP_DEFINE_MISSING"/>
    <keyword type="enum" name="XML_RNGP_DEFINE_NAME_MISSING" link="libxml2-xmlerror.html#XML_RNGP_DEFINE_NAME_MISSING"/>
    <keyword type="enum" name="XML_RNGP_DEF_CHOICE_AND_INTERLEAVE" link="libxml2-xmlerror.html#XML_RNGP_DEF_CHOICE_AND_INTERLEAVE"/>
    <keyword type="enum" name="XML_RNGP_ELEMENT_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_ELEMENT_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_ELEMENT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_ELEMENT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_ELEMENT_NAME" link="libxml2-xmlerror.html#XML_RNGP_ELEMENT_NAME"/>
    <keyword type="enum" name="XML_RNGP_ELEMENT_NO_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_ELEMENT_NO_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_ELEM_CONTENT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_ELEM_CONTENT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_ELEM_CONTENT_ERROR" link="libxml2-xmlerror.html#XML_RNGP_ELEM_CONTENT_ERROR"/>
    <keyword type="enum" name="XML_RNGP_ELEM_TEXT_CONFLICT" link="libxml2-xmlerror.html#XML_RNGP_ELEM_TEXT_CONFLICT"/>
    <keyword type="enum" name="XML_RNGP_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_EMPTY_CONSTRUCT" link="libxml2-xmlerror.html#XML_RNGP_EMPTY_CONSTRUCT"/>
    <keyword type="enum" name="XML_RNGP_EMPTY_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_EMPTY_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_EMPTY_NOT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_EMPTY_NOT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_ERROR_TYPE_LIB" link="libxml2-xmlerror.html#XML_RNGP_ERROR_TYPE_LIB"/>
    <keyword type="enum" name="XML_RNGP_EXCEPT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_EXCEPT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_EXCEPT_MISSING" link="libxml2-xmlerror.html#XML_RNGP_EXCEPT_MISSING"/>
    <keyword type="enum" name="XML_RNGP_EXCEPT_MULTIPLE" link="libxml2-xmlerror.html#XML_RNGP_EXCEPT_MULTIPLE"/>
    <keyword type="enum" name="XML_RNGP_EXCEPT_NO_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_EXCEPT_NO_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_EXTERNALREF_EMTPY" link="libxml2-xmlerror.html#XML_RNGP_EXTERNALREF_EMTPY"/>
    <keyword type="enum" name="XML_RNGP_EXTERNALREF_RECURSE" link="libxml2-xmlerror.html#XML_RNGP_EXTERNALREF_RECURSE"/>
    <keyword type="enum" name="XML_RNGP_EXTERNAL_REF_FAILURE" link="libxml2-xmlerror.html#XML_RNGP_EXTERNAL_REF_FAILURE"/>
    <keyword type="enum" name="XML_RNGP_FORBIDDEN_ATTRIBUTE" link="libxml2-xmlerror.html#XML_RNGP_FORBIDDEN_ATTRIBUTE"/>
    <keyword type="enum" name="XML_RNGP_FOREIGN_ELEMENT" link="libxml2-xmlerror.html#XML_RNGP_FOREIGN_ELEMENT"/>
    <keyword type="enum" name="XML_RNGP_GRAMMAR_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_GRAMMAR_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_GRAMMAR_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_GRAMMAR_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_GRAMMAR_MISSING" link="libxml2-xmlerror.html#XML_RNGP_GRAMMAR_MISSING"/>
    <keyword type="enum" name="XML_RNGP_GRAMMAR_NO_START" link="libxml2-xmlerror.html#XML_RNGP_GRAMMAR_NO_START"/>
    <keyword type="enum" name="XML_RNGP_GROUP_ATTR_CONFLICT" link="libxml2-xmlerror.html#XML_RNGP_GROUP_ATTR_CONFLICT"/>
    <keyword type="enum" name="XML_RNGP_HREF_ERROR" link="libxml2-xmlerror.html#XML_RNGP_HREF_ERROR"/>
    <keyword type="enum" name="XML_RNGP_INCLUDE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_INCLUDE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_INCLUDE_FAILURE" link="libxml2-xmlerror.html#XML_RNGP_INCLUDE_FAILURE"/>
    <keyword type="enum" name="XML_RNGP_INCLUDE_RECURSE" link="libxml2-xmlerror.html#XML_RNGP_INCLUDE_RECURSE"/>
    <keyword type="enum" name="XML_RNGP_INTERLEAVE_ADD" link="libxml2-xmlerror.html#XML_RNGP_INTERLEAVE_ADD"/>
    <keyword type="enum" name="XML_RNGP_INTERLEAVE_CREATE_FAILED" link="libxml2-xmlerror.html#XML_RNGP_INTERLEAVE_CREATE_FAILED"/>
    <keyword type="enum" name="XML_RNGP_INTERLEAVE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_INTERLEAVE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_INTERLEAVE_NO_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_INTERLEAVE_NO_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_INVALID_DEFINE_NAME" link="libxml2-xmlerror.html#XML_RNGP_INVALID_DEFINE_NAME"/>
    <keyword type="enum" name="XML_RNGP_INVALID_URI" link="libxml2-xmlerror.html#XML_RNGP_INVALID_URI"/>
    <keyword type="enum" name="XML_RNGP_INVALID_VALUE" link="libxml2-xmlerror.html#XML_RNGP_INVALID_VALUE"/>
    <keyword type="enum" name="XML_RNGP_MISSING_HREF" link="libxml2-xmlerror.html#XML_RNGP_MISSING_HREF"/>
    <keyword type="enum" name="XML_RNGP_NAME_MISSING" link="libxml2-xmlerror.html#XML_RNGP_NAME_MISSING"/>
    <keyword type="enum" name="XML_RNGP_NEED_COMBINE" link="libxml2-xmlerror.html#XML_RNGP_NEED_COMBINE"/>
    <keyword type="enum" name="XML_RNGP_NOTALLOWED_NOT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_NOTALLOWED_NOT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_NSNAME_ATTR_ANCESTOR" link="libxml2-xmlerror.html#XML_RNGP_NSNAME_ATTR_ANCESTOR"/>
    <keyword type="enum" name="XML_RNGP_NSNAME_NO_NS" link="libxml2-xmlerror.html#XML_RNGP_NSNAME_NO_NS"/>
    <keyword type="enum" name="XML_RNGP_PARAM_FORBIDDEN" link="libxml2-xmlerror.html#XML_RNGP_PARAM_FORBIDDEN"/>
    <keyword type="enum" name="XML_RNGP_PARAM_NAME_MISSING" link="libxml2-xmlerror.html#XML_RNGP_PARAM_NAME_MISSING"/>
    <keyword type="enum" name="XML_RNGP_PARENTREF_CREATE_FAILED" link="libxml2-xmlerror.html#XML_RNGP_PARENTREF_CREATE_FAILED"/>
    <keyword type="enum" name="XML_RNGP_PARENTREF_NAME_INVALID" link="libxml2-xmlerror.html#XML_RNGP_PARENTREF_NAME_INVALID"/>
    <keyword type="enum" name="XML_RNGP_PARENTREF_NOT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_PARENTREF_NOT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_PARENTREF_NO_NAME" link="libxml2-xmlerror.html#XML_RNGP_PARENTREF_NO_NAME"/>
    <keyword type="enum" name="XML_RNGP_PARENTREF_NO_PARENT" link="libxml2-xmlerror.html#XML_RNGP_PARENTREF_NO_PARENT"/>
    <keyword type="enum" name="XML_RNGP_PARSE_ERROR" link="libxml2-xmlerror.html#XML_RNGP_PARSE_ERROR"/>
    <keyword type="enum" name="XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME" link="libxml2-xmlerror.html#XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME"/>
    <keyword type="enum" name="XML_RNGP_PAT_ATTR_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_ATTR_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_ATTR_ELEM" link="libxml2-xmlerror.html#XML_RNGP_PAT_ATTR_ELEM"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_ELEM" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_ELEM"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_GROUP" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_GROUP"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_LIST" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_LIST"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_ONEMORE" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_ONEMORE"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_REF" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_REF"/>
    <keyword type="enum" name="XML_RNGP_PAT_DATA_EXCEPT_TEXT" link="libxml2-xmlerror.html#XML_RNGP_PAT_DATA_EXCEPT_TEXT"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_ELEM" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_ELEM"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_INTERLEAVE" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_INTERLEAVE"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_LIST" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_LIST"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_REF" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_REF"/>
    <keyword type="enum" name="XML_RNGP_PAT_LIST_TEXT" link="libxml2-xmlerror.html#XML_RNGP_PAT_LIST_TEXT"/>
    <keyword type="enum" name="XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME" link="libxml2-xmlerror.html#XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME"/>
    <keyword type="enum" name="XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME" link="libxml2-xmlerror.html#XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME"/>
    <keyword type="enum" name="XML_RNGP_PAT_ONEMORE_GROUP_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_ONEMORE_GROUP_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_ATTR" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_ATTR"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_DATA" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_DATA"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_GROUP" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_GROUP"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_INTERLEAVE" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_INTERLEAVE"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_LIST" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_LIST"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_ONEMORE" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_ONEMORE"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_TEXT" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_TEXT"/>
    <keyword type="enum" name="XML_RNGP_PAT_START_VALUE" link="libxml2-xmlerror.html#XML_RNGP_PAT_START_VALUE"/>
    <keyword type="enum" name="XML_RNGP_PREFIX_UNDEFINED" link="libxml2-xmlerror.html#XML_RNGP_PREFIX_UNDEFINED"/>
    <keyword type="enum" name="XML_RNGP_REF_CREATE_FAILED" link="libxml2-xmlerror.html#XML_RNGP_REF_CREATE_FAILED"/>
    <keyword type="enum" name="XML_RNGP_REF_CYCLE" link="libxml2-xmlerror.html#XML_RNGP_REF_CYCLE"/>
    <keyword type="enum" name="XML_RNGP_REF_NAME_INVALID" link="libxml2-xmlerror.html#XML_RNGP_REF_NAME_INVALID"/>
    <keyword type="enum" name="XML_RNGP_REF_NOT_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_REF_NOT_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_REF_NO_DEF" link="libxml2-xmlerror.html#XML_RNGP_REF_NO_DEF"/>
    <keyword type="enum" name="XML_RNGP_REF_NO_NAME" link="libxml2-xmlerror.html#XML_RNGP_REF_NO_NAME"/>
    <keyword type="enum" name="XML_RNGP_START_CHOICE_AND_INTERLEAVE" link="libxml2-xmlerror.html#XML_RNGP_START_CHOICE_AND_INTERLEAVE"/>
    <keyword type="enum" name="XML_RNGP_START_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_START_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_START_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_START_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_START_MISSING" link="libxml2-xmlerror.html#XML_RNGP_START_MISSING"/>
    <keyword type="enum" name="XML_RNGP_TEXT_EXPECTED" link="libxml2-xmlerror.html#XML_RNGP_TEXT_EXPECTED"/>
    <keyword type="enum" name="XML_RNGP_TEXT_HAS_CHILD" link="libxml2-xmlerror.html#XML_RNGP_TEXT_HAS_CHILD"/>
    <keyword type="enum" name="XML_RNGP_TYPE_MISSING" link="libxml2-xmlerror.html#XML_RNGP_TYPE_MISSING"/>
    <keyword type="enum" name="XML_RNGP_TYPE_NOT_FOUND" link="libxml2-xmlerror.html#XML_RNGP_TYPE_NOT_FOUND"/>
    <keyword type="enum" name="XML_RNGP_TYPE_VALUE" link="libxml2-xmlerror.html#XML_RNGP_TYPE_VALUE"/>
    <keyword type="enum" name="XML_RNGP_UNKNOWN_ATTRIBUTE" link="libxml2-xmlerror.html#XML_RNGP_UNKNOWN_ATTRIBUTE"/>
    <keyword type="enum" name="XML_RNGP_UNKNOWN_COMBINE" link="libxml2-xmlerror.html#XML_RNGP_UNKNOWN_COMBINE"/>
    <keyword type="enum" name="XML_RNGP_UNKNOWN_CONSTRUCT" link="libxml2-xmlerror.html#XML_RNGP_UNKNOWN_CONSTRUCT"/>
    <keyword type="enum" name="XML_RNGP_UNKNOWN_TYPE_LIB" link="libxml2-xmlerror.html#XML_RNGP_UNKNOWN_TYPE_LIB"/>
    <keyword type="enum" name="XML_RNGP_URI_FRAGMENT" link="libxml2-xmlerror.html#XML_RNGP_URI_FRAGMENT"/>
    <keyword type="enum" name="XML_RNGP_URI_NOT_ABSOLUTE" link="libxml2-xmlerror.html#XML_RNGP_URI_NOT_ABSOLUTE"/>
    <keyword type="enum" name="XML_RNGP_VALUE_EMPTY" link="libxml2-xmlerror.html#XML_RNGP_VALUE_EMPTY"/>
    <keyword type="enum" name="XML_RNGP_VALUE_NO_CONTENT" link="libxml2-xmlerror.html#XML_RNGP_VALUE_NO_CONTENT"/>
    <keyword type="enum" name="XML_RNGP_XMLNS_NAME" link="libxml2-xmlerror.html#XML_RNGP_XMLNS_NAME"/>
    <keyword type="enum" name="XML_RNGP_XML_NS" link="libxml2-xmlerror.html#XML_RNGP_XML_NS"/>
    <keyword type="enum" name="XML_SAVE_AS_HTML" link="libxml2-xmlsave.html#XML_SAVE_AS_HTML"/>
    <keyword type="enum" name="XML_SAVE_AS_XML" link="libxml2-xmlsave.html#XML_SAVE_AS_XML"/>
    <keyword type="enum" name="XML_SAVE_CHAR_INVALID" link="libxml2-xmlerror.html#XML_SAVE_CHAR_INVALID"/>
    <keyword type="enum" name="XML_SAVE_FORMAT" link="libxml2-xmlsave.html#XML_SAVE_FORMAT"/>
    <keyword type="enum" name="XML_SAVE_NOT_UTF8" link="libxml2-xmlerror.html#XML_SAVE_NOT_UTF8"/>
    <keyword type="enum" name="XML_SAVE_NO_DECL" link="libxml2-xmlsave.html#XML_SAVE_NO_DECL"/>
    <keyword type="enum" name="XML_SAVE_NO_DOCTYPE" link="libxml2-xmlerror.html#XML_SAVE_NO_DOCTYPE"/>
    <keyword type="enum" name="XML_SAVE_NO_EMPTY" link="libxml2-xmlsave.html#XML_SAVE_NO_EMPTY"/>
    <keyword type="enum" name="XML_SAVE_NO_XHTML" link="libxml2-xmlsave.html#XML_SAVE_NO_XHTML"/>
    <keyword type="enum" name="XML_SAVE_UNKNOWN_ENCODING" link="libxml2-xmlerror.html#XML_SAVE_UNKNOWN_ENCODING"/>
    <keyword type="enum" name="XML_SAVE_WSNONSIG" link="libxml2-xmlsave.html#XML_SAVE_WSNONSIG"/>
    <keyword type="enum" name="XML_SAVE_XHTML" link="libxml2-xmlsave.html#XML_SAVE_XHTML"/>
    <keyword type="enum" name="XML_SCHEMAP_AG_PROPS_CORRECT" link="libxml2-xmlerror.html#XML_SCHEMAP_AG_PROPS_CORRECT"/>
    <keyword type="enum" name="XML_SCHEMAP_ATTRFORMDEFAULT_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAP_ATTRFORMDEFAULT_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAP_ATTRGRP_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_ATTRGRP_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_ATTR_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_ATTR_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_AU_PROPS_CORRECT" link="libxml2-xmlerror.html#XML_SCHEMAP_AU_PROPS_CORRECT"/>
    <keyword type="enum" name="XML_SCHEMAP_AU_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_AU_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_A_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_A_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_A_PROPS_CORRECT_3" link="libxml2-xmlerror.html#XML_SCHEMAP_A_PROPS_CORRECT_3"/>
    <keyword type="enum" name="XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ALL_LIMITED" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ALL_LIMITED"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_CT_EXTENDS_1_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_CT_EXTENDS_1_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_CT_EXTENDS_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_CT_EXTENDS_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_CT_EXTENDS_1_3" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_CT_EXTENDS_1_3"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_DERIVED_OK_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_DERIVED_OK_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_DERIVED_OK_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_DERIVED_OK_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_1_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_1_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_VALID_DEFAULT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_VALID_DEFAULT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_VALID_DEFAULT_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_VALID_DEFAULT_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_CT_PROPS_CORRECT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_CT_PROPS_CORRECT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_CT_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_CT_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_CT_PROPS_CORRECT_3" link="libxml2-xmlerror.html#XML_SCHEMAP_CT_PROPS_CORRECT_3"/>
    <keyword type="enum" name="XML_SCHEMAP_CT_PROPS_CORRECT_4" link="libxml2-xmlerror.html#XML_SCHEMAP_CT_PROPS_CORRECT_4"/>
    <keyword type="enum" name="XML_SCHEMAP_CT_PROPS_CORRECT_5" link="libxml2-xmlerror.html#XML_SCHEMAP_CT_PROPS_CORRECT_5"/>
    <keyword type="enum" name="XML_SCHEMAP_CVC_SIMPLE_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_CVC_SIMPLE_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_C_PROPS_CORRECT" link="libxml2-xmlerror.html#XML_SCHEMAP_C_PROPS_CORRECT"/>
    <keyword type="enum" name="XML_SCHEMAP_DEF_AND_PREFIX" link="libxml2-xmlerror.html#XML_SCHEMAP_DEF_AND_PREFIX"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2"/>
    <keyword type="enum" name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3" link="libxml2-xmlerror.html#XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3"/>
    <keyword type="enum" name="XML_SCHEMAP_ELEMFORMDEFAULT_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAP_ELEMFORMDEFAULT_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAP_ELEM_DEFAULT_FIXED" link="libxml2-xmlerror.html#XML_SCHEMAP_ELEM_DEFAULT_FIXED"/>
    <keyword type="enum" name="XML_SCHEMAP_ELEM_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_ELEM_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_EXTENSION_NO_BASE" link="libxml2-xmlerror.html#XML_SCHEMAP_EXTENSION_NO_BASE"/>
    <keyword type="enum" name="XML_SCHEMAP_E_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_E_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_E_PROPS_CORRECT_3" link="libxml2-xmlerror.html#XML_SCHEMAP_E_PROPS_CORRECT_3"/>
    <keyword type="enum" name="XML_SCHEMAP_E_PROPS_CORRECT_4" link="libxml2-xmlerror.html#XML_SCHEMAP_E_PROPS_CORRECT_4"/>
    <keyword type="enum" name="XML_SCHEMAP_E_PROPS_CORRECT_5" link="libxml2-xmlerror.html#XML_SCHEMAP_E_PROPS_CORRECT_5"/>
    <keyword type="enum" name="XML_SCHEMAP_E_PROPS_CORRECT_6" link="libxml2-xmlerror.html#XML_SCHEMAP_E_PROPS_CORRECT_6"/>
    <keyword type="enum" name="XML_SCHEMAP_FACET_NO_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAP_FACET_NO_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAP_FAILED_BUILD_IMPORT" link="libxml2-xmlerror.html#XML_SCHEMAP_FAILED_BUILD_IMPORT"/>
    <keyword type="enum" name="XML_SCHEMAP_FAILED_LOAD" link="libxml2-xmlerror.html#XML_SCHEMAP_FAILED_LOAD"/>
    <keyword type="enum" name="XML_SCHEMAP_FAILED_PARSE" link="libxml2-xmlerror.html#XML_SCHEMAP_FAILED_PARSE"/>
    <keyword type="enum" name="XML_SCHEMAP_GROUP_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_GROUP_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI" link="libxml2-xmlerror.html#XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI"/>
    <keyword type="enum" name="XML_SCHEMAP_IMPORT_REDEFINE_NSNAME" link="libxml2-xmlerror.html#XML_SCHEMAP_IMPORT_REDEFINE_NSNAME"/>
    <keyword type="enum" name="XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI" link="libxml2-xmlerror.html#XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI"/>
    <keyword type="enum" name="XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI" link="libxml2-xmlerror.html#XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI"/>
    <keyword type="enum" name="XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI" link="libxml2-xmlerror.html#XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI"/>
    <keyword type="enum" name="XML_SCHEMAP_INTERNAL" link="libxml2-xmlerror.html#XML_SCHEMAP_INTERNAL"/>
    <keyword type="enum" name="XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE" link="libxml2-xmlerror.html#XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_ATTR_COMBINATION" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_ATTR_COMBINATION"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_ATTR_NAME" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_ATTR_NAME"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_ATTR_USE" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_ATTR_USE"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_BOOLEAN" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_BOOLEAN"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_ENUM" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_ENUM"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_FACET" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_FACET"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_FACET_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_FACET_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_MAXOCCURS" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_MAXOCCURS"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_MINOCCURS" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_MINOCCURS"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_REF_AND_SUBTYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_REF_AND_SUBTYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_INVALID_WHITE_SPACE" link="libxml2-xmlerror.html#XML_SCHEMAP_INVALID_WHITE_SPACE"/>
    <keyword type="enum" name="XML_SCHEMAP_MG_PROPS_CORRECT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_MG_PROPS_CORRECT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_MG_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_MG_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_NOATTR_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_NOATTR_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_NOROOT" link="libxml2-xmlerror.html#XML_SCHEMAP_NOROOT"/>
    <keyword type="enum" name="XML_SCHEMAP_NOTATION_NO_NAME" link="libxml2-xmlerror.html#XML_SCHEMAP_NOTATION_NO_NAME"/>
    <keyword type="enum" name="XML_SCHEMAP_NOTHING_TO_PARSE" link="libxml2-xmlerror.html#XML_SCHEMAP_NOTHING_TO_PARSE"/>
    <keyword type="enum" name="XML_SCHEMAP_NOTYPE_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_NOTYPE_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_NOT_DETERMINISTIC" link="libxml2-xmlerror.html#XML_SCHEMAP_NOT_DETERMINISTIC"/>
    <keyword type="enum" name="XML_SCHEMAP_NOT_SCHEMA" link="libxml2-xmlerror.html#XML_SCHEMAP_NOT_SCHEMA"/>
    <keyword type="enum" name="XML_SCHEMAP_NO_XMLNS" link="libxml2-xmlerror.html#XML_SCHEMAP_NO_XMLNS"/>
    <keyword type="enum" name="XML_SCHEMAP_NO_XSI" link="libxml2-xmlerror.html#XML_SCHEMAP_NO_XSI"/>
    <keyword type="enum" name="XML_SCHEMAP_PREFIX_UNDEFINED" link="libxml2-xmlerror.html#XML_SCHEMAP_PREFIX_UNDEFINED"/>
    <keyword type="enum" name="XML_SCHEMAP_P_PROPS_CORRECT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_P_PROPS_CORRECT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_P_PROPS_CORRECT_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_P_PROPS_CORRECT_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_P_PROPS_CORRECT_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_P_PROPS_CORRECT_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_RECURSIVE" link="libxml2-xmlerror.html#XML_SCHEMAP_RECURSIVE"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_ATTR" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_ATTR"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_ATTRGROUP" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_ATTRGROUP"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_ELEMENT" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_ELEMENT"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_GROUP" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_GROUP"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_NOTATION" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_NOTATION"/>
    <keyword type="enum" name="XML_SCHEMAP_REDEFINED_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_REDEFINED_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_REF_AND_CONTENT" link="libxml2-xmlerror.html#XML_SCHEMAP_REF_AND_CONTENT"/>
    <keyword type="enum" name="XML_SCHEMAP_REF_AND_SUBTYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_REF_AND_SUBTYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_REGEXP_INVALID" link="libxml2-xmlerror.html#XML_SCHEMAP_REGEXP_INVALID"/>
    <keyword type="enum" name="XML_SCHEMAP_RESTRICTION_NONAME_NOREF" link="libxml2-xmlerror.html#XML_SCHEMAP_RESTRICTION_NONAME_NOREF"/>
    <keyword type="enum" name="XML_SCHEMAP_S4S_ATTR_INVALID_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAP_S4S_ATTR_INVALID_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAP_S4S_ATTR_MISSING" link="libxml2-xmlerror.html#XML_SCHEMAP_S4S_ATTR_MISSING"/>
    <keyword type="enum" name="XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED" link="libxml2-xmlerror.html#XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED"/>
    <keyword type="enum" name="XML_SCHEMAP_S4S_ELEM_MISSING" link="libxml2-xmlerror.html#XML_SCHEMAP_S4S_ELEM_MISSING"/>
    <keyword type="enum" name="XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED" link="libxml2-xmlerror.html#XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED"/>
    <keyword type="enum" name="XML_SCHEMAP_SIMPLETYPE_NONAME" link="libxml2-xmlerror.html#XML_SCHEMAP_SIMPLETYPE_NONAME"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_3_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_3_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_3_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_3_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_4" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_4"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_CT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_CT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ELEMENT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ELEMENT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ELEMENT_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ELEMENT_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ELEMENT_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ELEMENT_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_ELEMENT_3" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_ELEMENT_3"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_1_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_1_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_1_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_1_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_2_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_2_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_2_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_2_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_3_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_3_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_IMPORT_3_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_IMPORT_3_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_INCLUDE" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_INCLUDE"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_REDEFINE" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_REDEFINE"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_RESOLVE" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_RESOLVE"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_SIMPLE_TYPE_1" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_SIMPLE_TYPE_1"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_SIMPLE_TYPE_2" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_SIMPLE_TYPE_2"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_SIMPLE_TYPE_3" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_SIMPLE_TYPE_3"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_SIMPLE_TYPE_4" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_SIMPLE_TYPE_4"/>
    <keyword type="enum" name="XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES" link="libxml2-xmlerror.html#XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES"/>
    <keyword type="enum" name="XML_SCHEMAP_ST_PROPS_CORRECT_1" link="libxml2-xmlerror.html#XML_SCHEMAP_ST_PROPS_CORRECT_1"/>
    <keyword type="enum" name="XML_SCHEMAP_ST_PROPS_CORRECT_2" link="libxml2-xmlerror.html#XML_SCHEMAP_ST_PROPS_CORRECT_2"/>
    <keyword type="enum" name="XML_SCHEMAP_ST_PROPS_CORRECT_3" link="libxml2-xmlerror.html#XML_SCHEMAP_ST_PROPS_CORRECT_3"/>
    <keyword type="enum" name="XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_TYPE_AND_SUBTYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_TYPE_AND_SUBTYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNION_NOT_EXPRESSIBLE" link="libxml2-xmlerror.html#XML_SCHEMAP_UNION_NOT_EXPRESSIBLE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ALL_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ALL_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ATTR_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ATTR_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_BASE_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_BASE_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_CHOICE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_CHOICE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_ELEM_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_ELEM_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_FACET_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_FACET_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_FACET_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_FACET_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_GROUP_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_GROUP_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_IMPORT_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_IMPORT_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_LIST_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_LIST_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_MEMBER_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_MEMBER_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_NOTATION_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_NOTATION_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_PREFIX" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_PREFIX"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_REF" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_REF"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_TYPE" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_TYPE"/>
    <keyword type="enum" name="XML_SCHEMAP_UNKNOWN_UNION_CHILD" link="libxml2-xmlerror.html#XML_SCHEMAP_UNKNOWN_UNION_CHILD"/>
    <keyword type="enum" name="XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH" link="libxml2-xmlerror.html#XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH"/>
    <keyword type="enum" name="XML_SCHEMAP_WARN_ATTR_REDECL_PROH" link="libxml2-xmlerror.html#XML_SCHEMAP_WARN_ATTR_REDECL_PROH"/>
    <keyword type="enum" name="XML_SCHEMAP_WARN_SKIP_SCHEMA" link="libxml2-xmlerror.html#XML_SCHEMAP_WARN_SKIP_SCHEMA"/>
    <keyword type="enum" name="XML_SCHEMAP_WARN_UNLOCATED_SCHEMA" link="libxml2-xmlerror.html#XML_SCHEMAP_WARN_UNLOCATED_SCHEMA"/>
    <keyword type="enum" name="XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER" link="libxml2-xmlerror.html#XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER"/>
    <keyword type="enum" name="XML_SCHEMAS_ANYSIMPLETYPE" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYSIMPLETYPE"/>
    <keyword type="enum" name="XML_SCHEMAS_ANYTYPE" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYTYPE"/>
    <keyword type="enum" name="XML_SCHEMAS_ANYURI" link="libxml2-schemasInternals.html#XML_SCHEMAS_ANYURI"/>
    <keyword type="enum" name="XML_SCHEMAS_BASE64BINARY" link="libxml2-schemasInternals.html#XML_SCHEMAS_BASE64BINARY"/>
    <keyword type="enum" name="XML_SCHEMAS_BOOLEAN" link="libxml2-schemasInternals.html#XML_SCHEMAS_BOOLEAN"/>
    <keyword type="enum" name="XML_SCHEMAS_BYTE" link="libxml2-schemasInternals.html#XML_SCHEMAS_BYTE"/>
    <keyword type="enum" name="XML_SCHEMAS_DATE" link="libxml2-schemasInternals.html#XML_SCHEMAS_DATE"/>
    <keyword type="enum" name="XML_SCHEMAS_DATETIME" link="libxml2-schemasInternals.html#XML_SCHEMAS_DATETIME"/>
    <keyword type="enum" name="XML_SCHEMAS_DECIMAL" link="libxml2-schemasInternals.html#XML_SCHEMAS_DECIMAL"/>
    <keyword type="enum" name="XML_SCHEMAS_DOUBLE" link="libxml2-schemasInternals.html#XML_SCHEMAS_DOUBLE"/>
    <keyword type="enum" name="XML_SCHEMAS_DURATION" link="libxml2-schemasInternals.html#XML_SCHEMAS_DURATION"/>
    <keyword type="enum" name="XML_SCHEMAS_ENTITIES" link="libxml2-schemasInternals.html#XML_SCHEMAS_ENTITIES"/>
    <keyword type="enum" name="XML_SCHEMAS_ENTITY" link="libxml2-schemasInternals.html#XML_SCHEMAS_ENTITY"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_ATTRINVALID" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_ATTRINVALID"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_ATTRUNKNOWN" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_ATTRUNKNOWN"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_CONSTRUCT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_CONSTRUCT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_ELEMCONT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_ELEMCONT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_EXTRACONTENT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_EXTRACONTENT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_FACET" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_FACET"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_HAVEDEFAULT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_HAVEDEFAULT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_INTERNAL" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_INTERNAL"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_INVALIDATTR" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_INVALIDATTR"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_INVALIDELEM" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_INVALIDELEM"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_ISABSTRACT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_ISABSTRACT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_MISSING" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_MISSING"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOROLLBACK" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOROLLBACK"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOROOT" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOROOT"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTDETERMINIST" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTDETERMINIST"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTEMPTY" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTEMPTY"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTNILLABLE" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTNILLABLE"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTSIMPLE" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTSIMPLE"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTTOPLEVEL" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTTOPLEVEL"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_NOTYPE" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_NOTYPE"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_OK" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_OK"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_UNDECLAREDELEM" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_UNDECLAREDELEM"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_VALUE" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_WRONGELEM" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_WRONGELEM"/>
    <keyword type="enum" name="XML_SCHEMAS_ERR_XXX" link="libxml2-xmlschemas.html#XML_SCHEMAS_ERR_XXX"/>
    <keyword type="enum" name="XML_SCHEMAS_FLOAT" link="libxml2-schemasInternals.html#XML_SCHEMAS_FLOAT"/>
    <keyword type="enum" name="XML_SCHEMAS_GDAY" link="libxml2-schemasInternals.html#XML_SCHEMAS_GDAY"/>
    <keyword type="enum" name="XML_SCHEMAS_GMONTH" link="libxml2-schemasInternals.html#XML_SCHEMAS_GMONTH"/>
    <keyword type="enum" name="XML_SCHEMAS_GMONTHDAY" link="libxml2-schemasInternals.html#XML_SCHEMAS_GMONTHDAY"/>
    <keyword type="enum" name="XML_SCHEMAS_GYEAR" link="libxml2-schemasInternals.html#XML_SCHEMAS_GYEAR"/>
    <keyword type="enum" name="XML_SCHEMAS_GYEARMONTH" link="libxml2-schemasInternals.html#XML_SCHEMAS_GYEARMONTH"/>
    <keyword type="enum" name="XML_SCHEMAS_HEXBINARY" link="libxml2-schemasInternals.html#XML_SCHEMAS_HEXBINARY"/>
    <keyword type="enum" name="XML_SCHEMAS_ID" link="libxml2-schemasInternals.html#XML_SCHEMAS_ID"/>
    <keyword type="enum" name="XML_SCHEMAS_IDREF" link="libxml2-schemasInternals.html#XML_SCHEMAS_IDREF"/>
    <keyword type="enum" name="XML_SCHEMAS_IDREFS" link="libxml2-schemasInternals.html#XML_SCHEMAS_IDREFS"/>
    <keyword type="enum" name="XML_SCHEMAS_INT" link="libxml2-schemasInternals.html#XML_SCHEMAS_INT"/>
    <keyword type="enum" name="XML_SCHEMAS_INTEGER" link="libxml2-schemasInternals.html#XML_SCHEMAS_INTEGER"/>
    <keyword type="enum" name="XML_SCHEMAS_LANGUAGE" link="libxml2-schemasInternals.html#XML_SCHEMAS_LANGUAGE"/>
    <keyword type="enum" name="XML_SCHEMAS_LONG" link="libxml2-schemasInternals.html#XML_SCHEMAS_LONG"/>
    <keyword type="enum" name="XML_SCHEMAS_NAME" link="libxml2-schemasInternals.html#XML_SCHEMAS_NAME"/>
    <keyword type="enum" name="XML_SCHEMAS_NCNAME" link="libxml2-schemasInternals.html#XML_SCHEMAS_NCNAME"/>
    <keyword type="enum" name="XML_SCHEMAS_NINTEGER" link="libxml2-schemasInternals.html#XML_SCHEMAS_NINTEGER"/>
    <keyword type="enum" name="XML_SCHEMAS_NMTOKEN" link="libxml2-schemasInternals.html#XML_SCHEMAS_NMTOKEN"/>
    <keyword type="enum" name="XML_SCHEMAS_NMTOKENS" link="libxml2-schemasInternals.html#XML_SCHEMAS_NMTOKENS"/>
    <keyword type="enum" name="XML_SCHEMAS_NNINTEGER" link="libxml2-schemasInternals.html#XML_SCHEMAS_NNINTEGER"/>
    <keyword type="enum" name="XML_SCHEMAS_NORMSTRING" link="libxml2-schemasInternals.html#XML_SCHEMAS_NORMSTRING"/>
    <keyword type="enum" name="XML_SCHEMAS_NOTATION" link="libxml2-schemasInternals.html#XML_SCHEMAS_NOTATION"/>
    <keyword type="enum" name="XML_SCHEMAS_NPINTEGER" link="libxml2-schemasInternals.html#XML_SCHEMAS_NPINTEGER"/>
    <keyword type="enum" name="XML_SCHEMAS_PINTEGER" link="libxml2-schemasInternals.html#XML_SCHEMAS_PINTEGER"/>
    <keyword type="enum" name="XML_SCHEMAS_QNAME" link="libxml2-schemasInternals.html#XML_SCHEMAS_QNAME"/>
    <keyword type="enum" name="XML_SCHEMAS_SHORT" link="libxml2-schemasInternals.html#XML_SCHEMAS_SHORT"/>
    <keyword type="enum" name="XML_SCHEMAS_STRING" link="libxml2-schemasInternals.html#XML_SCHEMAS_STRING"/>
    <keyword type="enum" name="XML_SCHEMAS_TIME" link="libxml2-schemasInternals.html#XML_SCHEMAS_TIME"/>
    <keyword type="enum" name="XML_SCHEMAS_TOKEN" link="libxml2-schemasInternals.html#XML_SCHEMAS_TOKEN"/>
    <keyword type="enum" name="XML_SCHEMAS_UBYTE" link="libxml2-schemasInternals.html#XML_SCHEMAS_UBYTE"/>
    <keyword type="enum" name="XML_SCHEMAS_UINT" link="libxml2-schemasInternals.html#XML_SCHEMAS_UINT"/>
    <keyword type="enum" name="XML_SCHEMAS_ULONG" link="libxml2-schemasInternals.html#XML_SCHEMAS_ULONG"/>
    <keyword type="enum" name="XML_SCHEMAS_UNKNOWN" link="libxml2-schemasInternals.html#XML_SCHEMAS_UNKNOWN"/>
    <keyword type="enum" name="XML_SCHEMAS_USHORT" link="libxml2-schemasInternals.html#XML_SCHEMAS_USHORT"/>
    <keyword type="enum" name="XML_SCHEMATRONV_ASSERT" link="libxml2-xmlerror.html#XML_SCHEMATRONV_ASSERT"/>
    <keyword type="enum" name="XML_SCHEMATRONV_REPORT" link="libxml2-xmlerror.html#XML_SCHEMATRONV_REPORT"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_BUFFER" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_BUFFER"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_ERROR" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_ERROR"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_FILE" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_FILE"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_IO" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_IO"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_QUIET" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_QUIET"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_TEXT" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_TEXT"/>
    <keyword type="enum" name="XML_SCHEMATRON_OUT_XML" link="libxml2-schematron.html#XML_SCHEMATRON_OUT_XML"/>
    <keyword type="enum" name="XML_SCHEMAV_ATTRINVALID" link="libxml2-xmlerror.html#XML_SCHEMAV_ATTRINVALID"/>
    <keyword type="enum" name="XML_SCHEMAV_ATTRUNKNOWN" link="libxml2-xmlerror.html#XML_SCHEMAV_ATTRUNKNOWN"/>
    <keyword type="enum" name="XML_SCHEMAV_CONSTRUCT" link="libxml2-xmlerror.html#XML_SCHEMAV_CONSTRUCT"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ATTRIBUTE_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ATTRIBUTE_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ATTRIBUTE_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ATTRIBUTE_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ATTRIBUTE_3" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ATTRIBUTE_3"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ATTRIBUTE_4" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ATTRIBUTE_4"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_AU" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_AU"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_4" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_4"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_3_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_3_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_3_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_3_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_3_2_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_3_2_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_4_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_4_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_4_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_4_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_4_3" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_4_3"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_1_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_1_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_1_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_1_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_2_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_2_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_2_2_2_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_2_2_2_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_5_2_2_2_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_5_2_2_2_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_6" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_6"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ELT_7" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ELT_7"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_ENUMERATION_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_ENUMERATION_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_FACET_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_FACET_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_IDC" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_IDC"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_LENGTH_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_LENGTH_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MAXLENGTH_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MAXLENGTH_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MININCLUSIVE_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MININCLUSIVE_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_MINLENGTH_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_MINLENGTH_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_PATTERN_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_PATTERN_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_TOTALDIGITS_VALID" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_TOTALDIGITS_VALID"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_TYPE_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_TYPE_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_TYPE_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_TYPE_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_TYPE_3_1_1" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_TYPE_3_1_1"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_TYPE_3_1_2" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_TYPE_3_1_2"/>
    <keyword type="enum" name="XML_SCHEMAV_CVC_WILDCARD" link="libxml2-xmlerror.html#XML_SCHEMAV_CVC_WILDCARD"/>
    <keyword type="enum" name="XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING" link="libxml2-xmlerror.html#XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING"/>
    <keyword type="enum" name="XML_SCHEMAV_ELEMCONT" link="libxml2-xmlerror.html#XML_SCHEMAV_ELEMCONT"/>
    <keyword type="enum" name="XML_SCHEMAV_ELEMENT_CONTENT" link="libxml2-xmlerror.html#XML_SCHEMAV_ELEMENT_CONTENT"/>
    <keyword type="enum" name="XML_SCHEMAV_EXTRACONTENT" link="libxml2-xmlerror.html#XML_SCHEMAV_EXTRACONTENT"/>
    <keyword type="enum" name="XML_SCHEMAV_FACET" link="libxml2-xmlerror.html#XML_SCHEMAV_FACET"/>
    <keyword type="enum" name="XML_SCHEMAV_HAVEDEFAULT" link="libxml2-xmlerror.html#XML_SCHEMAV_HAVEDEFAULT"/>
    <keyword type="enum" name="XML_SCHEMAV_INTERNAL" link="libxml2-xmlerror.html#XML_SCHEMAV_INTERNAL"/>
    <keyword type="enum" name="XML_SCHEMAV_INVALIDATTR" link="libxml2-xmlerror.html#XML_SCHEMAV_INVALIDATTR"/>
    <keyword type="enum" name="XML_SCHEMAV_INVALIDELEM" link="libxml2-xmlerror.html#XML_SCHEMAV_INVALIDELEM"/>
    <keyword type="enum" name="XML_SCHEMAV_ISABSTRACT" link="libxml2-xmlerror.html#XML_SCHEMAV_ISABSTRACT"/>
    <keyword type="enum" name="XML_SCHEMAV_MISC" link="libxml2-xmlerror.html#XML_SCHEMAV_MISC"/>
    <keyword type="enum" name="XML_SCHEMAV_MISSING" link="libxml2-xmlerror.html#XML_SCHEMAV_MISSING"/>
    <keyword type="enum" name="XML_SCHEMAV_NOROLLBACK" link="libxml2-xmlerror.html#XML_SCHEMAV_NOROLLBACK"/>
    <keyword type="enum" name="XML_SCHEMAV_NOROOT" link="libxml2-xmlerror.html#XML_SCHEMAV_NOROOT"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTDETERMINIST" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTDETERMINIST"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTEMPTY" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTEMPTY"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTNILLABLE" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTNILLABLE"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTSIMPLE" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTSIMPLE"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTTOPLEVEL" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTTOPLEVEL"/>
    <keyword type="enum" name="XML_SCHEMAV_NOTYPE" link="libxml2-xmlerror.html#XML_SCHEMAV_NOTYPE"/>
    <keyword type="enum" name="XML_SCHEMAV_UNDECLAREDELEM" link="libxml2-xmlerror.html#XML_SCHEMAV_UNDECLAREDELEM"/>
    <keyword type="enum" name="XML_SCHEMAV_VALUE" link="libxml2-xmlerror.html#XML_SCHEMAV_VALUE"/>
    <keyword type="enum" name="XML_SCHEMAV_WRONGELEM" link="libxml2-xmlerror.html#XML_SCHEMAV_WRONGELEM"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_ANY" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_ANY"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_BASIC" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_BASIC"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_ELEMENTS" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_ELEMENTS"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_EMPTY" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_EMPTY"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_MIXED" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_MIXED"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_SIMPLE" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_SIMPLE"/>
    <keyword type="enum" name="XML_SCHEMA_CONTENT_UNKNOWN" link="libxml2-schemasInternals.html#XML_SCHEMA_CONTENT_UNKNOWN"/>
    <keyword type="enum" name="XML_SCHEMA_EXTRA_ATTR_USE_PROHIB" link="libxml2-schemasInternals.html#XML_SCHEMA_EXTRA_ATTR_USE_PROHIB"/>
    <keyword type="enum" name="XML_SCHEMA_EXTRA_QNAMEREF" link="libxml2-schemasInternals.html#XML_SCHEMA_EXTRA_QNAMEREF"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_ENUMERATION" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_ENUMERATION"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_FRACTIONDIGITS" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_FRACTIONDIGITS"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_LENGTH" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_LENGTH"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MAXEXCLUSIVE" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MAXEXCLUSIVE"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MAXINCLUSIVE" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MAXINCLUSIVE"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MAXLENGTH" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MAXLENGTH"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MINEXCLUSIVE" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MINEXCLUSIVE"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MININCLUSIVE" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MININCLUSIVE"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_MINLENGTH" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_MINLENGTH"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_PATTERN" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_PATTERN"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_TOTALDIGITS" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_TOTALDIGITS"/>
    <keyword type="enum" name="XML_SCHEMA_FACET_WHITESPACE" link="libxml2-schemasInternals.html#XML_SCHEMA_FACET_WHITESPACE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ALL" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ALL"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ANY" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ANY"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ANY_ATTRIBUTE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ANY_ATTRIBUTE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ATTRIBUTE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ATTRIBUTE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ATTRIBUTEGROUP" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ATTRIBUTEGROUP"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ATTRIBUTE_USE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ATTRIBUTE_USE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_BASIC" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_BASIC"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_CHOICE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_CHOICE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_COMPLEX" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_COMPLEX"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_COMPLEX_CONTENT" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_COMPLEX_CONTENT"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_ELEMENT" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_ELEMENT"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_EXTENSION" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_EXTENSION"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_FACET" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_FACET"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_GROUP" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_GROUP"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_IDC_KEY" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_IDC_KEY"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_IDC_KEYREF" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_IDC_KEYREF"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_IDC_UNIQUE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_IDC_UNIQUE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_LIST" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_LIST"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_NOTATION" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_NOTATION"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_PARTICLE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_PARTICLE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_RESTRICTION" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_RESTRICTION"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_SEQUENCE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_SEQUENCE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_SIMPLE" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_SIMPLE"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_SIMPLE_CONTENT" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_SIMPLE_CONTENT"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_UNION" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_UNION"/>
    <keyword type="enum" name="XML_SCHEMA_TYPE_UR" link="libxml2-schemasInternals.html#XML_SCHEMA_TYPE_UR"/>
    <keyword type="enum" name="XML_SCHEMA_VAL_VC_I_CREATE" link="libxml2-xmlschemas.html#XML_SCHEMA_VAL_VC_I_CREATE"/>
    <keyword type="enum" name="XML_SCHEMA_WHITESPACE_COLLAPSE" link="libxml2-xmlschemastypes.html#XML_SCHEMA_WHITESPACE_COLLAPSE"/>
    <keyword type="enum" name="XML_SCHEMA_WHITESPACE_PRESERVE" link="libxml2-xmlschemastypes.html#XML_SCHEMA_WHITESPACE_PRESERVE"/>
    <keyword type="enum" name="XML_SCHEMA_WHITESPACE_REPLACE" link="libxml2-xmlschemastypes.html#XML_SCHEMA_WHITESPACE_REPLACE"/>
    <keyword type="enum" name="XML_SCHEMA_WHITESPACE_UNKNOWN" link="libxml2-xmlschemastypes.html#XML_SCHEMA_WHITESPACE_UNKNOWN"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_CLOSED" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_CLOSED"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_EOF" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_EOF"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_ERROR" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_ERROR"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_INITIAL" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_INITIAL"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_INTERACTIVE" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_INTERACTIVE"/>
    <keyword type="enum" name="XML_TEXTREADER_MODE_READING" link="libxml2-xmlreader.html#XML_TEXTREADER_MODE_READING"/>
    <keyword type="enum" name="XML_TEXT_NODE" link="libxml2-tree.html#XML_TEXT_NODE"/>
    <keyword type="enum" name="XML_TREE_INVALID_DEC" link="libxml2-xmlerror.html#XML_TREE_INVALID_DEC"/>
    <keyword type="enum" name="XML_TREE_INVALID_HEX" link="libxml2-xmlerror.html#XML_TREE_INVALID_HEX"/>
    <keyword type="enum" name="XML_TREE_NOT_UTF8" link="libxml2-xmlerror.html#XML_TREE_NOT_UTF8"/>
    <keyword type="enum" name="XML_TREE_UNTERMINATED_ENTITY" link="libxml2-xmlerror.html#XML_TREE_UNTERMINATED_ENTITY"/>
    <keyword type="enum" name="XML_WAR_CATALOG_PI" link="libxml2-xmlerror.html#XML_WAR_CATALOG_PI"/>
    <keyword type="enum" name="XML_WAR_ENTITY_REDEFINED" link="libxml2-xmlerror.html#XML_WAR_ENTITY_REDEFINED"/>
    <keyword type="enum" name="XML_WAR_LANG_VALUE" link="libxml2-xmlerror.html#XML_WAR_LANG_VALUE"/>
    <keyword type="enum" name="XML_WAR_NS_COLUMN" link="libxml2-xmlerror.html#XML_WAR_NS_COLUMN"/>
    <keyword type="enum" name="XML_WAR_NS_URI" link="libxml2-xmlerror.html#XML_WAR_NS_URI"/>
    <keyword type="enum" name="XML_WAR_NS_URI_RELATIVE" link="libxml2-xmlerror.html#XML_WAR_NS_URI_RELATIVE"/>
    <keyword type="enum" name="XML_WAR_SPACE_VALUE" link="libxml2-xmlerror.html#XML_WAR_SPACE_VALUE"/>
    <keyword type="enum" name="XML_WAR_UNDECLARED_ENTITY" link="libxml2-xmlerror.html#XML_WAR_UNDECLARED_ENTITY"/>
    <keyword type="enum" name="XML_WAR_UNKNOWN_VERSION" link="libxml2-xmlerror.html#XML_WAR_UNKNOWN_VERSION"/>
    <keyword type="enum" name="XML_WITH_AUTOMATA" link="libxml2-parser.html#XML_WITH_AUTOMATA"/>
    <keyword type="enum" name="XML_WITH_C14N" link="libxml2-parser.html#XML_WITH_C14N"/>
    <keyword type="enum" name="XML_WITH_CATALOG" link="libxml2-parser.html#XML_WITH_CATALOG"/>
    <keyword type="enum" name="XML_WITH_DEBUG" link="libxml2-parser.html#XML_WITH_DEBUG"/>
    <keyword type="enum" name="XML_WITH_DEBUG_MEM" link="libxml2-parser.html#XML_WITH_DEBUG_MEM"/>
    <keyword type="enum" name="XML_WITH_DEBUG_RUN" link="libxml2-parser.html#XML_WITH_DEBUG_RUN"/>
    <keyword type="enum" name="XML_WITH_EXPR" link="libxml2-parser.html#XML_WITH_EXPR"/>
    <keyword type="enum" name="XML_WITH_FTP" link="libxml2-parser.html#XML_WITH_FTP"/>
    <keyword type="enum" name="XML_WITH_HTML" link="libxml2-parser.html#XML_WITH_HTML"/>
    <keyword type="enum" name="XML_WITH_HTTP" link="libxml2-parser.html#XML_WITH_HTTP"/>
    <keyword type="enum" name="XML_WITH_ICONV" link="libxml2-parser.html#XML_WITH_ICONV"/>
    <keyword type="enum" name="XML_WITH_ICU" link="libxml2-parser.html#XML_WITH_ICU"/>
    <keyword type="enum" name="XML_WITH_ISO8859X" link="libxml2-parser.html#XML_WITH_ISO8859X"/>
    <keyword type="enum" name="XML_WITH_LEGACY" link="libxml2-parser.html#XML_WITH_LEGACY"/>
    <keyword type="enum" name="XML_WITH_LZMA" link="libxml2-parser.html#XML_WITH_LZMA"/>
    <keyword type="enum" name="XML_WITH_MODULES" link="libxml2-parser.html#XML_WITH_MODULES"/>
    <keyword type="enum" name="XML_WITH_NONE" link="libxml2-parser.html#XML_WITH_NONE"/>
    <keyword type="enum" name="XML_WITH_OUTPUT" link="libxml2-parser.html#XML_WITH_OUTPUT"/>
    <keyword type="enum" name="XML_WITH_PATTERN" link="libxml2-parser.html#XML_WITH_PATTERN"/>
    <keyword type="enum" name="XML_WITH_PUSH" link="libxml2-parser.html#XML_WITH_PUSH"/>
    <keyword type="enum" name="XML_WITH_READER" link="libxml2-parser.html#XML_WITH_READER"/>
    <keyword type="enum" name="XML_WITH_REGEXP" link="libxml2-parser.html#XML_WITH_REGEXP"/>
    <keyword type="enum" name="XML_WITH_SAX1" link="libxml2-parser.html#XML_WITH_SAX1"/>
    <keyword type="enum" name="XML_WITH_SCHEMAS" link="libxml2-parser.html#XML_WITH_SCHEMAS"/>
    <keyword type="enum" name="XML_WITH_SCHEMATRON" link="libxml2-parser.html#XML_WITH_SCHEMATRON"/>
    <keyword type="enum" name="XML_WITH_THREAD" link="libxml2-parser.html#XML_WITH_THREAD"/>
    <keyword type="enum" name="XML_WITH_TREE" link="libxml2-parser.html#XML_WITH_TREE"/>
    <keyword type="enum" name="XML_WITH_UNICODE" link="libxml2-parser.html#XML_WITH_UNICODE"/>
    <keyword type="enum" name="XML_WITH_VALID" link="libxml2-parser.html#XML_WITH_VALID"/>
    <keyword type="enum" name="XML_WITH_WRITER" link="libxml2-parser.html#XML_WITH_WRITER"/>
    <keyword type="enum" name="XML_WITH_XINCLUDE" link="libxml2-parser.html#XML_WITH_XINCLUDE"/>
    <keyword type="enum" name="XML_WITH_XPATH" link="libxml2-parser.html#XML_WITH_XPATH"/>
    <keyword type="enum" name="XML_WITH_XPTR" link="libxml2-parser.html#XML_WITH_XPTR"/>
    <keyword type="enum" name="XML_WITH_ZLIB" link="libxml2-parser.html#XML_WITH_ZLIB"/>
    <keyword type="enum" name="XML_XINCLUDE_BUILD_FAILED" link="libxml2-xmlerror.html#XML_XINCLUDE_BUILD_FAILED"/>
    <keyword type="enum" name="XML_XINCLUDE_DEPRECATED_NS" link="libxml2-xmlerror.html#XML_XINCLUDE_DEPRECATED_NS"/>
    <keyword type="enum" name="XML_XINCLUDE_END" link="libxml2-tree.html#XML_XINCLUDE_END"/>
    <keyword type="enum" name="XML_XINCLUDE_ENTITY_DEF_MISMATCH" link="libxml2-xmlerror.html#XML_XINCLUDE_ENTITY_DEF_MISMATCH"/>
    <keyword type="enum" name="XML_XINCLUDE_FALLBACKS_IN_INCLUDE" link="libxml2-xmlerror.html#XML_XINCLUDE_FALLBACKS_IN_INCLUDE"/>
    <keyword type="enum" name="XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE" link="libxml2-xmlerror.html#XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE"/>
    <keyword type="enum" name="XML_XINCLUDE_FRAGMENT_ID" link="libxml2-xmlerror.html#XML_XINCLUDE_FRAGMENT_ID"/>
    <keyword type="enum" name="XML_XINCLUDE_HREF_URI" link="libxml2-xmlerror.html#XML_XINCLUDE_HREF_URI"/>
    <keyword type="enum" name="XML_XINCLUDE_INCLUDE_IN_INCLUDE" link="libxml2-xmlerror.html#XML_XINCLUDE_INCLUDE_IN_INCLUDE"/>
    <keyword type="enum" name="XML_XINCLUDE_INVALID_CHAR" link="libxml2-xmlerror.html#XML_XINCLUDE_INVALID_CHAR"/>
    <keyword type="enum" name="XML_XINCLUDE_MULTIPLE_ROOT" link="libxml2-xmlerror.html#XML_XINCLUDE_MULTIPLE_ROOT"/>
    <keyword type="enum" name="XML_XINCLUDE_NO_FALLBACK" link="libxml2-xmlerror.html#XML_XINCLUDE_NO_FALLBACK"/>
    <keyword type="enum" name="XML_XINCLUDE_NO_HREF" link="libxml2-xmlerror.html#XML_XINCLUDE_NO_HREF"/>
    <keyword type="enum" name="XML_XINCLUDE_PARSE_VALUE" link="libxml2-xmlerror.html#XML_XINCLUDE_PARSE_VALUE"/>
    <keyword type="enum" name="XML_XINCLUDE_RECURSION" link="libxml2-xmlerror.html#XML_XINCLUDE_RECURSION"/>
    <keyword type="enum" name="XML_XINCLUDE_START" link="libxml2-tree.html#XML_XINCLUDE_START"/>
    <keyword type="enum" name="XML_XINCLUDE_TEXT_DOCUMENT" link="libxml2-xmlerror.html#XML_XINCLUDE_TEXT_DOCUMENT"/>
    <keyword type="enum" name="XML_XINCLUDE_TEXT_FRAGMENT" link="libxml2-xmlerror.html#XML_XINCLUDE_TEXT_FRAGMENT"/>
    <keyword type="enum" name="XML_XINCLUDE_UNKNOWN_ENCODING" link="libxml2-xmlerror.html#XML_XINCLUDE_UNKNOWN_ENCODING"/>
    <keyword type="enum" name="XML_XINCLUDE_XPTR_FAILED" link="libxml2-xmlerror.html#XML_XINCLUDE_XPTR_FAILED"/>
    <keyword type="enum" name="XML_XINCLUDE_XPTR_RESULT" link="libxml2-xmlerror.html#XML_XINCLUDE_XPTR_RESULT"/>
    <keyword type="enum" name="XML_XPATH_ENCODING_ERROR" link="libxml2-xmlerror.html#XML_XPATH_ENCODING_ERROR"/>
    <keyword type="enum" name="XML_XPATH_EXPRESSION_OK" link="libxml2-xmlerror.html#XML_XPATH_EXPRESSION_OK"/>
    <keyword type="enum" name="XML_XPATH_EXPR_ERROR" link="libxml2-xmlerror.html#XML_XPATH_EXPR_ERROR"/>
    <keyword type="enum" name="XML_XPATH_INVALID_ARITY" link="libxml2-xmlerror.html#XML_XPATH_INVALID_ARITY"/>
    <keyword type="enum" name="XML_XPATH_INVALID_CHAR_ERROR" link="libxml2-xmlerror.html#XML_XPATH_INVALID_CHAR_ERROR"/>
    <keyword type="enum" name="XML_XPATH_INVALID_CTXT_POSITION" link="libxml2-xmlerror.html#XML_XPATH_INVALID_CTXT_POSITION"/>
    <keyword type="enum" name="XML_XPATH_INVALID_CTXT_SIZE" link="libxml2-xmlerror.html#XML_XPATH_INVALID_CTXT_SIZE"/>
    <keyword type="enum" name="XML_XPATH_INVALID_OPERAND" link="libxml2-xmlerror.html#XML_XPATH_INVALID_OPERAND"/>
    <keyword type="enum" name="XML_XPATH_INVALID_PREDICATE_ERROR" link="libxml2-xmlerror.html#XML_XPATH_INVALID_PREDICATE_ERROR"/>
    <keyword type="enum" name="XML_XPATH_INVALID_TYPE" link="libxml2-xmlerror.html#XML_XPATH_INVALID_TYPE"/>
    <keyword type="enum" name="XML_XPATH_MEMORY_ERROR" link="libxml2-xmlerror.html#XML_XPATH_MEMORY_ERROR"/>
    <keyword type="enum" name="XML_XPATH_NUMBER_ERROR" link="libxml2-xmlerror.html#XML_XPATH_NUMBER_ERROR"/>
    <keyword type="enum" name="XML_XPATH_START_LITERAL_ERROR" link="libxml2-xmlerror.html#XML_XPATH_START_LITERAL_ERROR"/>
    <keyword type="enum" name="XML_XPATH_UNCLOSED_ERROR" link="libxml2-xmlerror.html#XML_XPATH_UNCLOSED_ERROR"/>
    <keyword type="enum" name="XML_XPATH_UNDEF_PREFIX_ERROR" link="libxml2-xmlerror.html#XML_XPATH_UNDEF_PREFIX_ERROR"/>
    <keyword type="enum" name="XML_XPATH_UNDEF_VARIABLE_ERROR" link="libxml2-xmlerror.html#XML_XPATH_UNDEF_VARIABLE_ERROR"/>
    <keyword type="enum" name="XML_XPATH_UNFINISHED_LITERAL_ERROR" link="libxml2-xmlerror.html#XML_XPATH_UNFINISHED_LITERAL_ERROR"/>
    <keyword type="enum" name="XML_XPATH_UNKNOWN_FUNC_ERROR" link="libxml2-xmlerror.html#XML_XPATH_UNKNOWN_FUNC_ERROR"/>
    <keyword type="enum" name="XML_XPATH_VARIABLE_REF_ERROR" link="libxml2-xmlerror.html#XML_XPATH_VARIABLE_REF_ERROR"/>
    <keyword type="enum" name="XML_XPTR_CHILDSEQ_START" link="libxml2-xmlerror.html#XML_XPTR_CHILDSEQ_START"/>
    <keyword type="enum" name="XML_XPTR_EVAL_FAILED" link="libxml2-xmlerror.html#XML_XPTR_EVAL_FAILED"/>
    <keyword type="enum" name="XML_XPTR_EXTRA_OBJECTS" link="libxml2-xmlerror.html#XML_XPTR_EXTRA_OBJECTS"/>
    <keyword type="enum" name="XML_XPTR_RESOURCE_ERROR" link="libxml2-xmlerror.html#XML_XPTR_RESOURCE_ERROR"/>
    <keyword type="enum" name="XML_XPTR_SUB_RESOURCE_ERROR" link="libxml2-xmlerror.html#XML_XPTR_SUB_RESOURCE_ERROR"/>
    <keyword type="enum" name="XML_XPTR_SYNTAX_ERROR" link="libxml2-xmlerror.html#XML_XPTR_SYNTAX_ERROR"/>
    <keyword type="enum" name="XML_XPTR_UNKNOWN_SCHEME" link="libxml2-xmlerror.html#XML_XPTR_UNKNOWN_SCHEME"/>
    <keyword type="enum" name="XPATH_BOOLEAN" link="libxml2-xpath.html#XPATH_BOOLEAN"/>
    <keyword type="enum" name="XPATH_ENCODING_ERROR" link="libxml2-xpath.html#XPATH_ENCODING_ERROR"/>
    <keyword type="enum" name="XPATH_EXPRESSION_OK" link="libxml2-xpath.html#XPATH_EXPRESSION_OK"/>
    <keyword type="enum" name="XPATH_EXPR_ERROR" link="libxml2-xpath.html#XPATH_EXPR_ERROR"/>
    <keyword type="enum" name="XPATH_FORBID_VARIABLE_ERROR" link="libxml2-xpath.html#XPATH_FORBID_VARIABLE_ERROR"/>
    <keyword type="enum" name="XPATH_INVALID_ARITY" link="libxml2-xpath.html#XPATH_INVALID_ARITY"/>
    <keyword type="enum" name="XPATH_INVALID_CHAR_ERROR" link="libxml2-xpath.html#XPATH_INVALID_CHAR_ERROR"/>
    <keyword type="enum" name="XPATH_INVALID_CTXT" link="libxml2-xpath.html#XPATH_INVALID_CTXT"/>
    <keyword type="enum" name="XPATH_INVALID_CTXT_POSITION" link="libxml2-xpath.html#XPATH_INVALID_CTXT_POSITION"/>
    <keyword type="enum" name="XPATH_INVALID_CTXT_SIZE" link="libxml2-xpath.html#XPATH_INVALID_CTXT_SIZE"/>
    <keyword type="enum" name="XPATH_INVALID_OPERAND" link="libxml2-xpath.html#XPATH_INVALID_OPERAND"/>
    <keyword type="enum" name="XPATH_INVALID_PREDICATE_ERROR" link="libxml2-xpath.html#XPATH_INVALID_PREDICATE_ERROR"/>
    <keyword type="enum" name="XPATH_INVALID_TYPE" link="libxml2-xpath.html#XPATH_INVALID_TYPE"/>
    <keyword type="enum" name="XPATH_LOCATIONSET" link="libxml2-xpath.html#XPATH_LOCATIONSET"/>
    <keyword type="enum" name="XPATH_MEMORY_ERROR" link="libxml2-xpath.html#XPATH_MEMORY_ERROR"/>
    <keyword type="enum" name="XPATH_NODESET" link="libxml2-xpath.html#XPATH_NODESET"/>
    <keyword type="enum" name="XPATH_NUMBER" link="libxml2-xpath.html#XPATH_NUMBER"/>
    <keyword type="enum" name="XPATH_NUMBER_ERROR" link="libxml2-xpath.html#XPATH_NUMBER_ERROR"/>
    <keyword type="enum" name="XPATH_OP_LIMIT_EXCEEDED" link="libxml2-xpath.html#XPATH_OP_LIMIT_EXCEEDED"/>
    <keyword type="enum" name="XPATH_POINT" link="libxml2-xpath.html#XPATH_POINT"/>
    <keyword type="enum" name="XPATH_RANGE" link="libxml2-xpath.html#XPATH_RANGE"/>
    <keyword type="enum" name="XPATH_RECURSION_LIMIT_EXCEEDED" link="libxml2-xpath.html#XPATH_RECURSION_LIMIT_EXCEEDED"/>
    <keyword type="enum" name="XPATH_STACK_ERROR" link="libxml2-xpath.html#XPATH_STACK_ERROR"/>
    <keyword type="enum" name="XPATH_START_LITERAL_ERROR" link="libxml2-xpath.html#XPATH_START_LITERAL_ERROR"/>
    <keyword type="enum" name="XPATH_STRING" link="libxml2-xpath.html#XPATH_STRING"/>
    <keyword type="enum" name="XPATH_UNCLOSED_ERROR" link="libxml2-xpath.html#XPATH_UNCLOSED_ERROR"/>
    <keyword type="enum" name="XPATH_UNDEFINED" link="libxml2-xpath.html#XPATH_UNDEFINED"/>
    <keyword type="enum" name="XPATH_UNDEF_PREFIX_ERROR" link="libxml2-xpath.html#XPATH_UNDEF_PREFIX_ERROR"/>
    <keyword type="enum" name="XPATH_UNDEF_VARIABLE_ERROR" link="libxml2-xpath.html#XPATH_UNDEF_VARIABLE_ERROR"/>
    <keyword type="enum" name="XPATH_UNFINISHED_LITERAL_ERROR" link="libxml2-xpath.html#XPATH_UNFINISHED_LITERAL_ERROR"/>
    <keyword type="enum" name="XPATH_UNKNOWN_FUNC_ERROR" link="libxml2-xpath.html#XPATH_UNKNOWN_FUNC_ERROR"/>
    <keyword type="enum" name="XPATH_USERS" link="libxml2-xpath.html#XPATH_USERS"/>
    <keyword type="enum" name="XPATH_VARIABLE_REF_ERROR" link="libxml2-xpath.html#XPATH_VARIABLE_REF_ERROR"/>
    <keyword type="enum" name="XPATH_XSLT_TREE" link="libxml2-xpath.html#XPATH_XSLT_TREE"/>
    <keyword type="enum" name="XPTR_RESOURCE_ERROR" link="libxml2-xpath.html#XPTR_RESOURCE_ERROR"/>
    <keyword type="enum" name="XPTR_SUB_RESOURCE_ERROR" link="libxml2-xpath.html#XPTR_SUB_RESOURCE_ERROR"/>
    <keyword type="enum" name="XPTR_SYNTAX_ERROR" link="libxml2-xpath.html#XPTR_SYNTAX_ERROR"/>
    <keyword type="typedef" name="htmlDocPtr" link="libxml2-HTMLparser.html#htmlDocPtr"/>
    <keyword type="typedef" name="htmlElemDescPtr" link="libxml2-HTMLparser.html#htmlElemDescPtr"/>
    <keyword type="typedef" name="htmlEntityDescPtr" link="libxml2-HTMLparser.html#htmlEntityDescPtr"/>
    <keyword type="typedef" name="htmlNodePtr" link="libxml2-HTMLparser.html#htmlNodePtr"/>
    <keyword type="typedef" name="htmlParserCtxt" link="libxml2-HTMLparser.html#htmlParserCtxt"/>
    <keyword type="typedef" name="htmlParserCtxtPtr" link="libxml2-HTMLparser.html#htmlParserCtxtPtr"/>
    <keyword type="typedef" name="htmlParserInput" link="libxml2-HTMLparser.html#htmlParserInput"/>
    <keyword type="typedef" name="htmlParserInputPtr" link="libxml2-HTMLparser.html#htmlParserInputPtr"/>
    <keyword type="typedef" name="htmlParserNodeInfo" link="libxml2-HTMLparser.html#htmlParserNodeInfo"/>
    <keyword type="typedef" name="htmlParserOption" link="libxml2-HTMLparser.html#htmlParserOption"/>
    <keyword type="typedef" name="htmlSAXHandler" link="libxml2-HTMLparser.html#htmlSAXHandler"/>
    <keyword type="typedef" name="htmlSAXHandlerPtr" link="libxml2-HTMLparser.html#htmlSAXHandlerPtr"/>
    <keyword type="typedef" name="htmlStatus" link="libxml2-HTMLparser.html#htmlStatus"/>
    <keyword type="typedef" name="xlinkActuate" link="libxml2-xlink.html#xlinkActuate"/>
    <keyword type="typedef" name="xlinkHRef" link="libxml2-xlink.html#xlinkHRef"/>
    <keyword type="typedef" name="xlinkHandlerPtr" link="libxml2-xlink.html#xlinkHandlerPtr"/>
    <keyword type="typedef" name="xlinkRole" link="libxml2-xlink.html#xlinkRole"/>
    <keyword type="typedef" name="xlinkShow" link="libxml2-xlink.html#xlinkShow"/>
    <keyword type="typedef" name="xlinkTitle" link="libxml2-xlink.html#xlinkTitle"/>
    <keyword type="typedef" name="xlinkType" link="libxml2-xlink.html#xlinkType"/>
    <keyword type="typedef" name="xmlAttrPtr" link="libxml2-tree.html#xmlAttrPtr"/>
    <keyword type="typedef" name="xmlAttributeDefault" link="libxml2-tree.html#xmlAttributeDefault"/>
    <keyword type="typedef" name="xmlAttributePtr" link="libxml2-tree.html#xmlAttributePtr"/>
    <keyword type="typedef" name="xmlAttributeTablePtr" link="libxml2-valid.html#xmlAttributeTablePtr"/>
    <keyword type="typedef" name="xmlAttributeType" link="libxml2-tree.html#xmlAttributeType"/>
    <keyword type="typedef" name="xmlAutomataPtr" link="libxml2-xmlautomata.html#xmlAutomataPtr"/>
    <keyword type="typedef" name="xmlAutomataStatePtr" link="libxml2-xmlautomata.html#xmlAutomataStatePtr"/>
    <keyword type="typedef" name="xmlBufPtr" link="libxml2-tree.html#xmlBufPtr"/>
    <keyword type="typedef" name="xmlBufferAllocationScheme" link="libxml2-tree.html#xmlBufferAllocationScheme"/>
    <keyword type="typedef" name="xmlBufferPtr" link="libxml2-tree.html#xmlBufferPtr"/>
    <keyword type="typedef" name="xmlC14NMode" link="libxml2-c14n.html#xmlC14NMode"/>
    <keyword type="typedef" name="xmlCatalogAllow" link="libxml2-catalog.html#xmlCatalogAllow"/>
    <keyword type="typedef" name="xmlCatalogPrefer" link="libxml2-catalog.html#xmlCatalogPrefer"/>
    <keyword type="typedef" name="xmlCatalogPtr" link="libxml2-catalog.html#xmlCatalogPtr"/>
    <keyword type="typedef" name="xmlChLRangePtr" link="libxml2-chvalid.html#xmlChLRangePtr"/>
    <keyword type="typedef" name="xmlChRangeGroupPtr" link="libxml2-chvalid.html#xmlChRangeGroupPtr"/>
    <keyword type="typedef" name="xmlChSRangePtr" link="libxml2-chvalid.html#xmlChSRangePtr"/>
    <keyword type="typedef" name="xmlChar" link="libxml2-xmlstring.html#xmlChar"/>
    <keyword type="typedef" name="xmlCharEncoding" link="libxml2-encoding.html#xmlCharEncoding"/>
    <keyword type="typedef" name="xmlCharEncodingHandlerPtr" link="libxml2-encoding.html#xmlCharEncodingHandlerPtr"/>
    <keyword type="typedef" name="xmlDOMWrapCtxtPtr" link="libxml2-tree.html#xmlDOMWrapCtxtPtr"/>
    <keyword type="typedef" name="xmlDictPtr" link="libxml2-dict.html#xmlDictPtr"/>
    <keyword type="typedef" name="xmlDocProperties" link="libxml2-tree.html#xmlDocProperties"/>
    <keyword type="typedef" name="xmlDocPtr" link="libxml2-tree.html#xmlDocPtr"/>
    <keyword type="typedef" name="xmlDtdPtr" link="libxml2-tree.html#xmlDtdPtr"/>
    <keyword type="typedef" name="xmlElementContentOccur" link="libxml2-tree.html#xmlElementContentOccur"/>
    <keyword type="typedef" name="xmlElementContentPtr" link="libxml2-tree.html#xmlElementContentPtr"/>
    <keyword type="typedef" name="xmlElementContentType" link="libxml2-tree.html#xmlElementContentType"/>
    <keyword type="typedef" name="xmlElementPtr" link="libxml2-tree.html#xmlElementPtr"/>
    <keyword type="typedef" name="xmlElementTablePtr" link="libxml2-valid.html#xmlElementTablePtr"/>
    <keyword type="typedef" name="xmlElementType" link="libxml2-tree.html#xmlElementType"/>
    <keyword type="typedef" name="xmlElementTypeVal" link="libxml2-tree.html#xmlElementTypeVal"/>
    <keyword type="typedef" name="xmlEntitiesTablePtr" link="libxml2-entities.html#xmlEntitiesTablePtr"/>
    <keyword type="typedef" name="xmlEntityPtr" link="libxml2-tree.html#xmlEntityPtr"/>
    <keyword type="typedef" name="xmlEntityType" link="libxml2-entities.html#xmlEntityType"/>
    <keyword type="typedef" name="xmlEnumerationPtr" link="libxml2-tree.html#xmlEnumerationPtr"/>
    <keyword type="typedef" name="xmlErrorDomain" link="libxml2-xmlerror.html#xmlErrorDomain"/>
    <keyword type="typedef" name="xmlErrorLevel" link="libxml2-xmlerror.html#xmlErrorLevel"/>
    <keyword type="typedef" name="xmlErrorPtr" link="libxml2-xmlerror.html#xmlErrorPtr"/>
    <keyword type="typedef" name="xmlExpCtxtPtr" link="libxml2-xmlregexp.html#xmlExpCtxtPtr"/>
    <keyword type="typedef" name="xmlExpNodePtr" link="libxml2-xmlregexp.html#xmlExpNodePtr"/>
    <keyword type="typedef" name="xmlExpNodeType" link="libxml2-xmlregexp.html#xmlExpNodeType"/>
    <keyword type="typedef" name="xmlFeature" link="libxml2-parser.html#xmlFeature"/>
    <keyword type="typedef" name="xmlGlobalStatePtr" link="libxml2-globals.html#xmlGlobalStatePtr"/>
    <keyword type="typedef" name="xmlHashTablePtr" link="libxml2-hash.html#xmlHashTablePtr"/>
    <keyword type="typedef" name="xmlIDPtr" link="libxml2-tree.html#xmlIDPtr"/>
    <keyword type="typedef" name="xmlIDTablePtr" link="libxml2-valid.html#xmlIDTablePtr"/>
    <keyword type="typedef" name="xmlLinkPtr" link="libxml2-list.html#xmlLinkPtr"/>
    <keyword type="typedef" name="xmlListPtr" link="libxml2-list.html#xmlListPtr"/>
    <keyword type="typedef" name="xmlLocationSetPtr" link="libxml2-xpointer.html#xmlLocationSetPtr"/>
    <keyword type="typedef" name="xmlModuleOption" link="libxml2-xmlmodule.html#xmlModuleOption"/>
    <keyword type="typedef" name="xmlModulePtr" link="libxml2-xmlmodule.html#xmlModulePtr"/>
    <keyword type="typedef" name="xmlMutexPtr" link="libxml2-threads.html#xmlMutexPtr"/>
    <keyword type="typedef" name="xmlNodePtr" link="libxml2-tree.html#xmlNodePtr"/>
    <keyword type="typedef" name="xmlNodeSetPtr" link="libxml2-xpath.html#xmlNodeSetPtr"/>
    <keyword type="typedef" name="xmlNotationPtr" link="libxml2-tree.html#xmlNotationPtr"/>
    <keyword type="typedef" name="xmlNotationTablePtr" link="libxml2-valid.html#xmlNotationTablePtr"/>
    <keyword type="typedef" name="xmlNsPtr" link="libxml2-tree.html#xmlNsPtr"/>
    <keyword type="typedef" name="xmlNsType" link="libxml2-tree.html#xmlNsType"/>
    <keyword type="typedef" name="xmlOutputBufferPtr" link="libxml2-tree.html#xmlOutputBufferPtr"/>
    <keyword type="typedef" name="xmlParserCtxtPtr" link="libxml2-tree.html#xmlParserCtxtPtr"/>
    <keyword type="typedef" name="xmlParserErrors" link="libxml2-xmlerror.html#xmlParserErrors"/>
    <keyword type="typedef" name="xmlParserInputBufferPtr" link="libxml2-tree.html#xmlParserInputBufferPtr"/>
    <keyword type="typedef" name="xmlParserInputPtr" link="libxml2-tree.html#xmlParserInputPtr"/>
    <keyword type="typedef" name="xmlParserInputState" link="libxml2-parser.html#xmlParserInputState"/>
    <keyword type="typedef" name="xmlParserMode" link="libxml2-parser.html#xmlParserMode"/>
    <keyword type="typedef" name="xmlParserNodeInfoPtr" link="libxml2-parser.html#xmlParserNodeInfoPtr"/>
    <keyword type="typedef" name="xmlParserNodeInfoSeqPtr" link="libxml2-parser.html#xmlParserNodeInfoSeqPtr"/>
    <keyword type="typedef" name="xmlParserOption" link="libxml2-parser.html#xmlParserOption"/>
    <keyword type="typedef" name="xmlParserProperties" link="libxml2-xmlreader.html#xmlParserProperties"/>
    <keyword type="typedef" name="xmlParserSeverities" link="libxml2-xmlreader.html#xmlParserSeverities"/>
    <keyword type="typedef" name="xmlPatternFlags" link="libxml2-pattern.html#xmlPatternFlags"/>
    <keyword type="typedef" name="xmlPatternPtr" link="libxml2-pattern.html#xmlPatternPtr"/>
    <keyword type="typedef" name="xmlRMutexPtr" link="libxml2-threads.html#xmlRMutexPtr"/>
    <keyword type="typedef" name="xmlReaderTypes" link="libxml2-xmlreader.html#xmlReaderTypes"/>
    <keyword type="typedef" name="xmlRefPtr" link="libxml2-tree.html#xmlRefPtr"/>
    <keyword type="typedef" name="xmlRefTablePtr" link="libxml2-valid.html#xmlRefTablePtr"/>
    <keyword type="typedef" name="xmlRegExecCtxtPtr" link="libxml2-xmlregexp.html#xmlRegExecCtxtPtr"/>
    <keyword type="typedef" name="xmlRegexpPtr" link="libxml2-xmlregexp.html#xmlRegexpPtr"/>
    <keyword type="typedef" name="xmlRelaxNGParserCtxtPtr" link="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr"/>
    <keyword type="typedef" name="xmlRelaxNGParserFlag" link="libxml2-relaxng.html#xmlRelaxNGParserFlag"/>
    <keyword type="typedef" name="xmlRelaxNGPtr" link="libxml2-relaxng.html#xmlRelaxNGPtr"/>
    <keyword type="typedef" name="xmlRelaxNGValidCtxtPtr" link="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr"/>
    <keyword type="typedef" name="xmlRelaxNGValidErr" link="libxml2-relaxng.html#xmlRelaxNGValidErr"/>
    <keyword type="typedef" name="xmlSAXHandlerPtr" link="libxml2-tree.html#xmlSAXHandlerPtr"/>
    <keyword type="typedef" name="xmlSAXHandlerV1Ptr" link="libxml2-parser.html#xmlSAXHandlerV1Ptr"/>
    <keyword type="typedef" name="xmlSAXLocatorPtr" link="libxml2-tree.html#xmlSAXLocatorPtr"/>
    <keyword type="typedef" name="xmlSaveCtxtPtr" link="libxml2-xmlsave.html#xmlSaveCtxtPtr"/>
    <keyword type="typedef" name="xmlSaveOption" link="libxml2-xmlsave.html#xmlSaveOption"/>
    <keyword type="typedef" name="xmlSchemaAnnotPtr" link="libxml2-schemasInternals.html#xmlSchemaAnnotPtr"/>
    <keyword type="typedef" name="xmlSchemaAttributeGroupPtr" link="libxml2-schemasInternals.html#xmlSchemaAttributeGroupPtr"/>
    <keyword type="typedef" name="xmlSchemaAttributeLinkPtr" link="libxml2-schemasInternals.html#xmlSchemaAttributeLinkPtr"/>
    <keyword type="typedef" name="xmlSchemaAttributePtr" link="libxml2-schemasInternals.html#xmlSchemaAttributePtr"/>
    <keyword type="typedef" name="xmlSchemaContentType" link="libxml2-schemasInternals.html#xmlSchemaContentType"/>
    <keyword type="typedef" name="xmlSchemaElementPtr" link="libxml2-schemasInternals.html#xmlSchemaElementPtr"/>
    <keyword type="typedef" name="xmlSchemaFacetLinkPtr" link="libxml2-schemasInternals.html#xmlSchemaFacetLinkPtr"/>
    <keyword type="typedef" name="xmlSchemaFacetPtr" link="libxml2-schemasInternals.html#xmlSchemaFacetPtr"/>
    <keyword type="typedef" name="xmlSchemaNotationPtr" link="libxml2-schemasInternals.html#xmlSchemaNotationPtr"/>
    <keyword type="typedef" name="xmlSchemaParserCtxtPtr" link="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr"/>
    <keyword type="typedef" name="xmlSchemaPtr" link="libxml2-xmlschemas.html#xmlSchemaPtr"/>
    <keyword type="typedef" name="xmlSchemaSAXPlugPtr" link="libxml2-xmlschemas.html#xmlSchemaSAXPlugPtr"/>
    <keyword type="typedef" name="xmlSchemaTypeLinkPtr" link="libxml2-schemasInternals.html#xmlSchemaTypeLinkPtr"/>
    <keyword type="typedef" name="xmlSchemaTypePtr" link="libxml2-schemasInternals.html#xmlSchemaTypePtr"/>
    <keyword type="typedef" name="xmlSchemaTypeType" link="libxml2-schemasInternals.html#xmlSchemaTypeType"/>
    <keyword type="typedef" name="xmlSchemaValPtr" link="libxml2-schemasInternals.html#xmlSchemaValPtr"/>
    <keyword type="typedef" name="xmlSchemaValType" link="libxml2-schemasInternals.html#xmlSchemaValType"/>
    <keyword type="typedef" name="xmlSchemaValidCtxtPtr" link="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr"/>
    <keyword type="typedef" name="xmlSchemaValidError" link="libxml2-xmlschemas.html#xmlSchemaValidError"/>
    <keyword type="typedef" name="xmlSchemaValidOption" link="libxml2-xmlschemas.html#xmlSchemaValidOption"/>
    <keyword type="typedef" name="xmlSchemaWhitespaceValueType" link="libxml2-xmlschemastypes.html#xmlSchemaWhitespaceValueType"/>
    <keyword type="typedef" name="xmlSchemaWildcardNsPtr" link="libxml2-schemasInternals.html#xmlSchemaWildcardNsPtr"/>
    <keyword type="typedef" name="xmlSchemaWildcardPtr" link="libxml2-schemasInternals.html#xmlSchemaWildcardPtr"/>
    <keyword type="typedef" name="xmlSchematronParserCtxtPtr" link="libxml2-schematron.html#xmlSchematronParserCtxtPtr"/>
    <keyword type="typedef" name="xmlSchematronPtr" link="libxml2-schematron.html#xmlSchematronPtr"/>
    <keyword type="typedef" name="xmlSchematronValidCtxtPtr" link="libxml2-schematron.html#xmlSchematronValidCtxtPtr"/>
    <keyword type="typedef" name="xmlSchematronValidOptions" link="libxml2-schematron.html#xmlSchematronValidOptions"/>
    <keyword type="typedef" name="xmlShellCtxtPtr" link="libxml2-debugXML.html#xmlShellCtxtPtr"/>
    <keyword type="typedef" name="xmlStreamCtxtPtr" link="libxml2-pattern.html#xmlStreamCtxtPtr"/>
    <keyword type="typedef" name="xmlTextReaderLocatorPtr" link="libxml2-xmlreader.html#xmlTextReaderLocatorPtr"/>
    <keyword type="typedef" name="xmlTextReaderMode" link="libxml2-xmlreader.html#xmlTextReaderMode"/>
    <keyword type="typedef" name="xmlTextReaderPtr" link="libxml2-xmlreader.html#xmlTextReaderPtr"/>
    <keyword type="typedef" name="xmlTextWriterPtr" link="libxml2-xmlwriter.html#xmlTextWriterPtr"/>
    <keyword type="typedef" name="xmlURIPtr" link="libxml2-uri.html#xmlURIPtr"/>
    <keyword type="typedef" name="xmlValidCtxtPtr" link="libxml2-valid.html#xmlValidCtxtPtr"/>
    <keyword type="typedef" name="xmlValidStatePtr" link="libxml2-valid.html#xmlValidStatePtr"/>
    <keyword type="typedef" name="xmlXIncludeCtxtPtr" link="libxml2-xinclude.html#xmlXIncludeCtxtPtr"/>
    <keyword type="typedef" name="xmlXPathAxisPtr" link="libxml2-xpath.html#xmlXPathAxisPtr"/>
    <keyword type="typedef" name="xmlXPathCompExprPtr" link="libxml2-xpath.html#xmlXPathCompExprPtr"/>
    <keyword type="typedef" name="xmlXPathContextPtr" link="libxml2-xpath.html#xmlXPathContextPtr"/>
    <keyword type="typedef" name="xmlXPathError" link="libxml2-xpath.html#xmlXPathError"/>
    <keyword type="typedef" name="xmlXPathFuncPtr" link="libxml2-xpath.html#xmlXPathFuncPtr"/>
    <keyword type="typedef" name="xmlXPathObjectPtr" link="libxml2-xpath.html#xmlXPathObjectPtr"/>
    <keyword type="typedef" name="xmlXPathObjectType" link="libxml2-xpath.html#xmlXPathObjectType"/>
    <keyword type="typedef" name="xmlXPathParserContextPtr" link="libxml2-xpath.html#xmlXPathParserContextPtr"/>
    <keyword type="typedef" name="xmlXPathTypePtr" link="libxml2-xpath.html#xmlXPathTypePtr"/>
    <keyword type="typedef" name="xmlXPathVariablePtr" link="libxml2-xpath.html#xmlXPathVariablePtr"/>
    <keyword type="struct" name="htmlElemDesc" link="libxml2-HTMLparser.html#htmlElemDesc"/>
    <keyword type="struct" name="htmlEntityDesc" link="libxml2-HTMLparser.html#htmlEntityDesc"/>
    <keyword type="struct" name="xlinkHandler" link="libxml2-xlink.html#xlinkHandler"/>
    <keyword type="struct" name="xmlAttr" link="libxml2-tree.html#xmlAttr"/>
    <keyword type="struct" name="xmlAttribute" link="libxml2-tree.html#xmlAttribute"/>
    <keyword type="struct" name="xmlAttributeTable" link="libxml2-valid.html#xmlAttributeTable"/>
    <keyword type="struct" name="xmlAutomata" link="libxml2-xmlautomata.html#xmlAutomata"/>
    <keyword type="struct" name="xmlAutomataState" link="libxml2-xmlautomata.html#xmlAutomataState"/>
    <keyword type="struct" name="xmlBuf" link="libxml2-tree.html#xmlBuf"/>
    <keyword type="struct" name="xmlBuffer" link="libxml2-tree.html#xmlBuffer"/>
    <keyword type="struct" name="xmlCatalog" link="libxml2-catalog.html#xmlCatalog"/>
    <keyword type="struct" name="xmlChLRange" link="libxml2-chvalid.html#xmlChLRange"/>
    <keyword type="struct" name="xmlChRangeGroup" link="libxml2-chvalid.html#xmlChRangeGroup"/>
    <keyword type="struct" name="xmlChSRange" link="libxml2-chvalid.html#xmlChSRange"/>
    <keyword type="struct" name="xmlCharEncodingHandler" link="libxml2-encoding.html#xmlCharEncodingHandler"/>
    <keyword type="struct" name="xmlDOMWrapCtxt" link="libxml2-tree.html#xmlDOMWrapCtxt"/>
    <keyword type="struct" name="xmlDict" link="libxml2-dict.html#xmlDict"/>
    <keyword type="struct" name="xmlDoc" link="libxml2-tree.html#xmlDoc"/>
    <keyword type="struct" name="xmlDtd" link="libxml2-tree.html#xmlDtd"/>
    <keyword type="struct" name="xmlElement" link="libxml2-tree.html#xmlElement"/>
    <keyword type="struct" name="xmlElementContent" link="libxml2-tree.html#xmlElementContent"/>
    <keyword type="struct" name="xmlElementTable" link="libxml2-valid.html#xmlElementTable"/>
    <keyword type="struct" name="xmlEntitiesTable" link="libxml2-entities.html#xmlEntitiesTable"/>
    <keyword type="struct" name="xmlEntity" link="libxml2-tree.html#xmlEntity"/>
    <keyword type="struct" name="xmlEnumeration" link="libxml2-tree.html#xmlEnumeration"/>
    <keyword type="struct" name="xmlError" link="libxml2-xmlerror.html#xmlError"/>
    <keyword type="struct" name="xmlExpCtxt" link="libxml2-xmlregexp.html#xmlExpCtxt"/>
    <keyword type="struct" name="xmlExpNode" link="libxml2-xmlregexp.html#xmlExpNode"/>
    <keyword type="struct" name="xmlGlobalState" link="libxml2-globals.html#xmlGlobalState"/>
    <keyword type="struct" name="xmlHashTable" link="libxml2-hash.html#xmlHashTable"/>
    <keyword type="struct" name="xmlID" link="libxml2-tree.html#xmlID"/>
    <keyword type="struct" name="xmlIDTable" link="libxml2-valid.html#xmlIDTable"/>
    <keyword type="struct" name="xmlLink" link="libxml2-list.html#xmlLink"/>
    <keyword type="struct" name="xmlList" link="libxml2-list.html#xmlList"/>
    <keyword type="struct" name="xmlLocationSet" link="libxml2-xpointer.html#xmlLocationSet"/>
    <keyword type="struct" name="xmlModule" link="libxml2-xmlmodule.html#xmlModule"/>
    <keyword type="struct" name="xmlMutex" link="libxml2-threads.html#xmlMutex"/>
    <keyword type="struct" name="xmlNode" link="libxml2-tree.html#xmlNode"/>
    <keyword type="struct" name="xmlNodeSet" link="libxml2-xpath.html#xmlNodeSet"/>
    <keyword type="struct" name="xmlNotation" link="libxml2-tree.html#xmlNotation"/>
    <keyword type="struct" name="xmlNotationTable" link="libxml2-valid.html#xmlNotationTable"/>
    <keyword type="struct" name="xmlNs" link="libxml2-tree.html#xmlNs"/>
    <keyword type="struct" name="xmlOutputBuffer" link="libxml2-tree.html#xmlOutputBuffer"/>
    <keyword type="struct" name="xmlParserCtxt" link="libxml2-tree.html#xmlParserCtxt"/>
    <keyword type="struct" name="xmlParserInput" link="libxml2-tree.html#xmlParserInput"/>
    <keyword type="struct" name="xmlParserInputBuffer" link="libxml2-tree.html#xmlParserInputBuffer"/>
    <keyword type="struct" name="xmlParserNodeInfo" link="libxml2-parser.html#xmlParserNodeInfo"/>
    <keyword type="struct" name="xmlParserNodeInfoSeq" link="libxml2-parser.html#xmlParserNodeInfoSeq"/>
    <keyword type="struct" name="xmlPattern" link="libxml2-pattern.html#xmlPattern"/>
    <keyword type="struct" name="xmlRMutex" link="libxml2-threads.html#xmlRMutex"/>
    <keyword type="struct" name="xmlRef" link="libxml2-tree.html#xmlRef"/>
    <keyword type="struct" name="xmlRefTable" link="libxml2-valid.html#xmlRefTable"/>
    <keyword type="struct" name="xmlRegExecCtxt" link="libxml2-xmlregexp.html#xmlRegExecCtxt"/>
    <keyword type="struct" name="xmlRegexp" link="libxml2-xmlregexp.html#xmlRegexp"/>
    <keyword type="struct" name="xmlRelaxNG" link="libxml2-relaxng.html#xmlRelaxNG"/>
    <keyword type="struct" name="xmlRelaxNGParserCtxt" link="libxml2-relaxng.html#xmlRelaxNGParserCtxt"/>
    <keyword type="struct" name="xmlRelaxNGValidCtxt" link="libxml2-relaxng.html#xmlRelaxNGValidCtxt"/>
    <keyword type="struct" name="xmlSAXHandler" link="libxml2-tree.html#xmlSAXHandler"/>
    <keyword type="struct" name="xmlSAXHandlerV1" link="libxml2-parser.html#xmlSAXHandlerV1"/>
    <keyword type="struct" name="xmlSAXLocator" link="libxml2-tree.html#xmlSAXLocator"/>
    <keyword type="struct" name="xmlSaveCtxt" link="libxml2-xmlsave.html#xmlSaveCtxt"/>
    <keyword type="struct" name="xmlSchema" link="libxml2-xmlschemas.html#xmlSchema"/>
    <keyword type="struct" name="xmlSchemaAnnot" link="libxml2-schemasInternals.html#xmlSchemaAnnot"/>
    <keyword type="struct" name="xmlSchemaAttribute" link="libxml2-schemasInternals.html#xmlSchemaAttribute"/>
    <keyword type="struct" name="xmlSchemaAttributeGroup" link="libxml2-schemasInternals.html#xmlSchemaAttributeGroup"/>
    <keyword type="struct" name="xmlSchemaAttributeLink" link="libxml2-schemasInternals.html#xmlSchemaAttributeLink"/>
    <keyword type="struct" name="xmlSchemaElement" link="libxml2-schemasInternals.html#xmlSchemaElement"/>
    <keyword type="struct" name="xmlSchemaFacet" link="libxml2-schemasInternals.html#xmlSchemaFacet"/>
    <keyword type="struct" name="xmlSchemaFacetLink" link="libxml2-schemasInternals.html#xmlSchemaFacetLink"/>
    <keyword type="struct" name="xmlSchemaNotation" link="libxml2-schemasInternals.html#xmlSchemaNotation"/>
    <keyword type="struct" name="xmlSchemaParserCtxt" link="libxml2-xmlschemas.html#xmlSchemaParserCtxt"/>
    <keyword type="struct" name="xmlSchemaSAXPlugStruct" link="libxml2-xmlschemas.html#xmlSchemaSAXPlugStruct"/>
    <keyword type="struct" name="xmlSchemaType" link="libxml2-schemasInternals.html#xmlSchemaType"/>
    <keyword type="struct" name="xmlSchemaTypeLink" link="libxml2-schemasInternals.html#xmlSchemaTypeLink"/>
    <keyword type="struct" name="xmlSchemaVal" link="libxml2-schemasInternals.html#xmlSchemaVal"/>
    <keyword type="struct" name="xmlSchemaValidCtxt" link="libxml2-xmlschemas.html#xmlSchemaValidCtxt"/>
    <keyword type="struct" name="xmlSchemaWildcard" link="libxml2-schemasInternals.html#xmlSchemaWildcard"/>
    <keyword type="struct" name="xmlSchemaWildcardNs" link="libxml2-schemasInternals.html#xmlSchemaWildcardNs"/>
    <keyword type="struct" name="xmlSchematron" link="libxml2-schematron.html#xmlSchematron"/>
    <keyword type="struct" name="xmlSchematronParserCtxt" link="libxml2-schematron.html#xmlSchematronParserCtxt"/>
    <keyword type="struct" name="xmlSchematronValidCtxt" link="libxml2-schematron.html#xmlSchematronValidCtxt"/>
    <keyword type="struct" name="xmlShellCtxt" link="libxml2-debugXML.html#xmlShellCtxt"/>
    <keyword type="struct" name="xmlStartTag" link="libxml2-parser.html#xmlStartTag"/>
    <keyword type="struct" name="xmlStreamCtxt" link="libxml2-pattern.html#xmlStreamCtxt"/>
    <keyword type="struct" name="xmlTextReader" link="libxml2-xmlreader.html#xmlTextReader"/>
    <keyword type="struct" name="xmlTextWriter" link="libxml2-xmlwriter.html#xmlTextWriter"/>
    <keyword type="struct" name="xmlURI" link="libxml2-uri.html#xmlURI"/>
    <keyword type="struct" name="xmlValidCtxt" link="libxml2-valid.html#xmlValidCtxt"/>
    <keyword type="struct" name="xmlValidState" link="libxml2-valid.html#xmlValidState"/>
    <keyword type="struct" name="xmlXIncludeCtxt" link="libxml2-xinclude.html#xmlXIncludeCtxt"/>
    <keyword type="struct" name="xmlXPathAxis" link="libxml2-xpath.html#xmlXPathAxis"/>
    <keyword type="struct" name="xmlXPathCompExpr" link="libxml2-xpath.html#xmlXPathCompExpr"/>
    <keyword type="struct" name="xmlXPathContext" link="libxml2-xpath.html#xmlXPathContext"/>
    <keyword type="struct" name="xmlXPathFunct" link="libxml2-xpath.html#xmlXPathFunct"/>
    <keyword type="struct" name="xmlXPathObject" link="libxml2-xpath.html#xmlXPathObject"/>
    <keyword type="struct" name="xmlXPathParserContext" link="libxml2-xpath.html#xmlXPathParserContext"/>
    <keyword type="struct" name="xmlXPathType" link="libxml2-xpath.html#xmlXPathType"/>
    <keyword type="struct" name="xmlXPathVariable" link="libxml2-xpath.html#xmlXPathVariable"/>
    <keyword type="function" name="attributeDeclSAXFunc" link="libxml2-parser.html#attributeDeclSAXFunc"/>
    <keyword type="function" name="attributeSAXFunc" link="libxml2-parser.html#attributeSAXFunc"/>
    <keyword type="function" name="cdataBlockSAXFunc" link="libxml2-parser.html#cdataBlockSAXFunc"/>
    <keyword type="function" name="charactersSAXFunc" link="libxml2-parser.html#charactersSAXFunc"/>
    <keyword type="function" name="commentSAXFunc" link="libxml2-parser.html#commentSAXFunc"/>
    <keyword type="function" name="elementDeclSAXFunc" link="libxml2-parser.html#elementDeclSAXFunc"/>
    <keyword type="function" name="endDocumentSAXFunc" link="libxml2-parser.html#endDocumentSAXFunc"/>
    <keyword type="function" name="endElementNsSAX2Func" link="libxml2-parser.html#endElementNsSAX2Func"/>
    <keyword type="function" name="endElementSAXFunc" link="libxml2-parser.html#endElementSAXFunc"/>
    <keyword type="function" name="entityDeclSAXFunc" link="libxml2-parser.html#entityDeclSAXFunc"/>
    <keyword type="function" name="errorSAXFunc" link="libxml2-parser.html#errorSAXFunc"/>
    <keyword type="function" name="externalSubsetSAXFunc" link="libxml2-parser.html#externalSubsetSAXFunc"/>
    <keyword type="function" name="fatalErrorSAXFunc" link="libxml2-parser.html#fatalErrorSAXFunc"/>
    <keyword type="function" name="ftpDataCallback" link="libxml2-nanoftp.html#ftpDataCallback"/>
    <keyword type="function" name="ftpListCallback" link="libxml2-nanoftp.html#ftpListCallback"/>
    <keyword type="function" name="getEntitySAXFunc" link="libxml2-parser.html#getEntitySAXFunc"/>
    <keyword type="function" name="getParameterEntitySAXFunc" link="libxml2-parser.html#getParameterEntitySAXFunc"/>
    <keyword type="function" name="hasExternalSubsetSAXFunc" link="libxml2-parser.html#hasExternalSubsetSAXFunc"/>
    <keyword type="function" name="hasInternalSubsetSAXFunc" link="libxml2-parser.html#hasInternalSubsetSAXFunc"/>
    <keyword type="function" name="ignorableWhitespaceSAXFunc" link="libxml2-parser.html#ignorableWhitespaceSAXFunc"/>
    <keyword type="function" name="internalSubsetSAXFunc" link="libxml2-parser.html#internalSubsetSAXFunc"/>
    <keyword type="function" name="isStandaloneSAXFunc" link="libxml2-parser.html#isStandaloneSAXFunc"/>
    <keyword type="function" name="notationDeclSAXFunc" link="libxml2-parser.html#notationDeclSAXFunc"/>
    <keyword type="function" name="processingInstructionSAXFunc" link="libxml2-parser.html#processingInstructionSAXFunc"/>
    <keyword type="function" name="referenceSAXFunc" link="libxml2-parser.html#referenceSAXFunc"/>
    <keyword type="function" name="resolveEntitySAXFunc" link="libxml2-parser.html#resolveEntitySAXFunc"/>
    <keyword type="function" name="setDocumentLocatorSAXFunc" link="libxml2-parser.html#setDocumentLocatorSAXFunc"/>
    <keyword type="function" name="startDocumentSAXFunc" link="libxml2-parser.html#startDocumentSAXFunc"/>
    <keyword type="function" name="startElementNsSAX2Func" link="libxml2-parser.html#startElementNsSAX2Func"/>
    <keyword type="function" name="startElementSAXFunc" link="libxml2-parser.html#startElementSAXFunc"/>
    <keyword type="function" name="unparsedEntityDeclSAXFunc" link="libxml2-parser.html#unparsedEntityDeclSAXFunc"/>
    <keyword type="function" name="warningSAXFunc" link="libxml2-parser.html#warningSAXFunc"/>
    <keyword type="function" name="xlinkExtendedLinkFunk" link="libxml2-xlink.html#xlinkExtendedLinkFunk"/>
    <keyword type="function" name="xlinkExtendedLinkSetFunk" link="libxml2-xlink.html#xlinkExtendedLinkSetFunk"/>
    <keyword type="function" name="xlinkNodeDetectFunc" link="libxml2-xlink.html#xlinkNodeDetectFunc"/>
    <keyword type="function" name="xlinkSimpleLinkFunk" link="libxml2-xlink.html#xlinkSimpleLinkFunk"/>
    <keyword type="function" name="xmlC14NIsVisibleCallback" link="libxml2-c14n.html#xmlC14NIsVisibleCallback"/>
    <keyword type="function" name="xmlCharEncodingInputFunc" link="libxml2-encoding.html#xmlCharEncodingInputFunc"/>
    <keyword type="function" name="xmlCharEncodingOutputFunc" link="libxml2-encoding.html#xmlCharEncodingOutputFunc"/>
    <keyword type="function" name="xmlDOMWrapAcquireNsFunction" link="libxml2-tree.html#xmlDOMWrapAcquireNsFunction"/>
    <keyword type="function" name="xmlDeregisterNodeFunc" link="libxml2-globals.html#xmlDeregisterNodeFunc"/>
    <keyword type="function" name="xmlEntityReferenceFunc" link="libxml2-parserInternals.html#xmlEntityReferenceFunc"/>
    <keyword type="function" name="xmlExternalEntityLoader" link="libxml2-parser.html#xmlExternalEntityLoader"/>
    <keyword type="function" name="xmlFreeFunc" link="libxml2-xmlmemory.html#xmlFreeFunc"/>
    <keyword type="function" name="xmlGenericErrorFunc" link="libxml2-xmlerror.html#xmlGenericErrorFunc"/>
    <keyword type="function" name="xmlHashCopier" link="libxml2-hash.html#xmlHashCopier"/>
    <keyword type="function" name="xmlHashDeallocator" link="libxml2-hash.html#xmlHashDeallocator"/>
    <keyword type="function" name="xmlHashScanner" link="libxml2-hash.html#xmlHashScanner"/>
    <keyword type="function" name="xmlHashScannerFull" link="libxml2-hash.html#xmlHashScannerFull"/>
    <keyword type="function" name="xmlInputCloseCallback" link="libxml2-xmlIO.html#xmlInputCloseCallback"/>
    <keyword type="function" name="xmlInputMatchCallback" link="libxml2-xmlIO.html#xmlInputMatchCallback"/>
    <keyword type="function" name="xmlInputOpenCallback" link="libxml2-xmlIO.html#xmlInputOpenCallback"/>
    <keyword type="function" name="xmlInputReadCallback" link="libxml2-xmlIO.html#xmlInputReadCallback"/>
    <keyword type="function" name="xmlListDataCompare" link="libxml2-list.html#xmlListDataCompare"/>
    <keyword type="function" name="xmlListDeallocator" link="libxml2-list.html#xmlListDeallocator"/>
    <keyword type="function" name="xmlListWalker" link="libxml2-list.html#xmlListWalker"/>
    <keyword type="function" name="xmlMallocFunc" link="libxml2-xmlmemory.html#xmlMallocFunc"/>
    <keyword type="function" name="xmlOutputBufferCreateFilenameFunc" link="libxml2-globals.html#xmlOutputBufferCreateFilenameFunc"/>
    <keyword type="function" name="xmlOutputCloseCallback" link="libxml2-xmlIO.html#xmlOutputCloseCallback"/>
    <keyword type="function" name="xmlOutputMatchCallback" link="libxml2-xmlIO.html#xmlOutputMatchCallback"/>
    <keyword type="function" name="xmlOutputOpenCallback" link="libxml2-xmlIO.html#xmlOutputOpenCallback"/>
    <keyword type="function" name="xmlOutputWriteCallback" link="libxml2-xmlIO.html#xmlOutputWriteCallback"/>
    <keyword type="function" name="xmlParserInputBufferCreateFilenameFunc" link="libxml2-globals.html#xmlParserInputBufferCreateFilenameFunc"/>
    <keyword type="function" name="xmlParserInputDeallocate" link="libxml2-parser.html#xmlParserInputDeallocate"/>
    <keyword type="function" name="xmlReallocFunc" link="libxml2-xmlmemory.html#xmlReallocFunc"/>
    <keyword type="function" name="xmlRegExecCallbacks" link="libxml2-xmlregexp.html#xmlRegExecCallbacks"/>
    <keyword type="function" name="xmlRegisterNodeFunc" link="libxml2-globals.html#xmlRegisterNodeFunc"/>
    <keyword type="function" name="xmlRelaxNGValidityErrorFunc" link="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc"/>
    <keyword type="function" name="xmlRelaxNGValidityWarningFunc" link="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc"/>
    <keyword type="function" name="xmlSchemaValidityErrorFunc" link="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc"/>
    <keyword type="function" name="xmlSchemaValidityLocatorFunc" link="libxml2-xmlschemas.html#xmlSchemaValidityLocatorFunc"/>
    <keyword type="function" name="xmlSchemaValidityWarningFunc" link="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc"/>
    <keyword type="function" name="xmlSchematronValidityErrorFunc" link="libxml2-schematron.html#xmlSchematronValidityErrorFunc"/>
    <keyword type="function" name="xmlSchematronValidityWarningFunc" link="libxml2-schematron.html#xmlSchematronValidityWarningFunc"/>
    <keyword type="function" name="xmlShellCmd" link="libxml2-debugXML.html#xmlShellCmd"/>
    <keyword type="function" name="xmlShellReadlineFunc" link="libxml2-debugXML.html#xmlShellReadlineFunc"/>
    <keyword type="function" name="xmlStrdupFunc" link="libxml2-xmlmemory.html#xmlStrdupFunc"/>
    <keyword type="function" name="xmlStructuredErrorFunc" link="libxml2-xmlerror.html#xmlStructuredErrorFunc"/>
    <keyword type="function" name="xmlTextReaderErrorFunc" link="libxml2-xmlreader.html#xmlTextReaderErrorFunc"/>
    <keyword type="function" name="xmlValidityErrorFunc" link="libxml2-valid.html#xmlValidityErrorFunc"/>
    <keyword type="function" name="xmlValidityWarningFunc" link="libxml2-valid.html#xmlValidityWarningFunc"/>
    <keyword type="function" name="xmlXPathAxisFunc" link="libxml2-xpath.html#xmlXPathAxisFunc"/>
    <keyword type="function" name="xmlXPathConvertFunc" link="libxml2-xpath.html#xmlXPathConvertFunc"/>
    <keyword type="function" name="xmlXPathEvalFunc" link="libxml2-xpath.html#xmlXPathEvalFunc"/>
    <keyword type="function" name="xmlXPathFuncLookupFunc" link="libxml2-xpath.html#xmlXPathFuncLookupFunc"/>
    <keyword type="function" name="xmlXPathFunction" link="libxml2-xpath.html#xmlXPathFunction"/>
    <keyword type="function" name="xmlXPathVariableLookupFunc" link="libxml2-xpath.html#xmlXPathVariableLookupFunc"/>
    <keyword type="macro" name="emptyExp" link="libxml2-xmlregexp.html#emptyExp"/>
    <keyword type="macro" name="forbiddenExp" link="libxml2-xmlregexp.html#forbiddenExp"/>
    <keyword type="macro" name="htmlDefaultSAXHandler" link="libxml2-globals.html#htmlDefaultSAXHandler"/>
    <keyword type="macro" name="oldXMLWDcompatibility" link="libxml2-globals.html#oldXMLWDcompatibility"/>
    <keyword type="macro" name="xmlBufferAllocScheme" link="libxml2-globals.html#xmlBufferAllocScheme"/>
    <keyword type="macro" name="xmlDefaultBufferSize" link="libxml2-globals.html#xmlDefaultBufferSize"/>
    <keyword type="macro" name="xmlDefaultSAXHandler" link="libxml2-globals.html#xmlDefaultSAXHandler"/>
    <keyword type="macro" name="xmlDefaultSAXLocator" link="libxml2-globals.html#xmlDefaultSAXLocator"/>
    <keyword type="macro" name="xmlDeregisterNodeDefaultValue" link="libxml2-globals.html#xmlDeregisterNodeDefaultValue"/>
    <keyword type="macro" name="xmlDoValidityCheckingDefaultValue" link="libxml2-globals.html#xmlDoValidityCheckingDefaultValue"/>
    <keyword type="macro" name="xmlFree" link="libxml2-globals.html#xmlFree"/>
    <keyword type="macro" name="xmlGenericError" link="libxml2-globals.html#xmlGenericError"/>
    <keyword type="macro" name="xmlGenericErrorContext" link="libxml2-globals.html#xmlGenericErrorContext"/>
    <keyword type="macro" name="xmlGetWarningsDefaultValue" link="libxml2-globals.html#xmlGetWarningsDefaultValue"/>
    <keyword type="macro" name="xmlIndentTreeOutput" link="libxml2-globals.html#xmlIndentTreeOutput"/>
    <keyword type="macro" name="xmlIsBaseCharGroup" link="libxml2-chvalid.html#xmlIsBaseCharGroup"/>
    <keyword type="macro" name="xmlIsCharGroup" link="libxml2-chvalid.html#xmlIsCharGroup"/>
    <keyword type="macro" name="xmlIsCombiningGroup" link="libxml2-chvalid.html#xmlIsCombiningGroup"/>
    <keyword type="macro" name="xmlIsDigitGroup" link="libxml2-chvalid.html#xmlIsDigitGroup"/>
    <keyword type="macro" name="xmlIsExtenderGroup" link="libxml2-chvalid.html#xmlIsExtenderGroup"/>
    <keyword type="macro" name="xmlIsIdeographicGroup" link="libxml2-chvalid.html#xmlIsIdeographicGroup"/>
    <keyword type="macro" name="xmlIsPubidChar_tab" link="libxml2-chvalid.html#xmlIsPubidChar_tab"/>
    <keyword type="macro" name="xmlKeepBlanksDefaultValue" link="libxml2-globals.html#xmlKeepBlanksDefaultValue"/>
    <keyword type="macro" name="xmlLastError" link="libxml2-globals.html#xmlLastError"/>
    <keyword type="macro" name="xmlLineNumbersDefaultValue" link="libxml2-globals.html#xmlLineNumbersDefaultValue"/>
    <keyword type="macro" name="xmlLoadExtDtdDefaultValue" link="libxml2-globals.html#xmlLoadExtDtdDefaultValue"/>
    <keyword type="macro" name="xmlMalloc" link="libxml2-globals.html#xmlMalloc"/>
    <keyword type="macro" name="xmlMallocAtomic" link="libxml2-globals.html#xmlMallocAtomic"/>
    <keyword type="macro" name="xmlMemStrdup" link="libxml2-globals.html#xmlMemStrdup"/>
    <keyword type="macro" name="xmlOutputBufferCreateFilenameValue" link="libxml2-globals.html#xmlOutputBufferCreateFilenameValue"/>
    <keyword type="macro" name="xmlParserDebugEntities" link="libxml2-globals.html#xmlParserDebugEntities"/>
    <keyword type="macro" name="xmlParserInputBufferCreateFilenameValue" link="libxml2-globals.html#xmlParserInputBufferCreateFilenameValue"/>
    <keyword type="macro" name="xmlParserMaxDepth" link="libxml2-parserInternals.html#xmlParserMaxDepth"/>
    <keyword type="macro" name="xmlParserVersion" link="libxml2-globals.html#xmlParserVersion"/>
    <keyword type="macro" name="xmlPedanticParserDefaultValue" link="libxml2-globals.html#xmlPedanticParserDefaultValue"/>
    <keyword type="macro" name="xmlRealloc" link="libxml2-globals.html#xmlRealloc"/>
    <keyword type="macro" name="xmlRegisterNodeDefaultValue" link="libxml2-globals.html#xmlRegisterNodeDefaultValue"/>
    <keyword type="macro" name="xmlSaveNoEmptyTags" link="libxml2-globals.html#xmlSaveNoEmptyTags"/>
    <keyword type="macro" name="xmlStringComment" link="libxml2-parserInternals.html#xmlStringComment"/>
    <keyword type="macro" name="xmlStringText" link="libxml2-parserInternals.html#xmlStringText"/>
    <keyword type="macro" name="xmlStringTextNoenc" link="libxml2-parserInternals.html#xmlStringTextNoenc"/>
    <keyword type="macro" name="xmlStructuredError" link="libxml2-globals.html#xmlStructuredError"/>
    <keyword type="macro" name="xmlStructuredErrorContext" link="libxml2-globals.html#xmlStructuredErrorContext"/>
    <keyword type="macro" name="xmlSubstituteEntitiesDefaultValue" link="libxml2-globals.html#xmlSubstituteEntitiesDefaultValue"/>
    <keyword type="macro" name="xmlTreeIndentString" link="libxml2-globals.html#xmlTreeIndentString"/>
    <keyword type="macro" name="xmlXPathNAN" link="libxml2-xpath.html#xmlXPathNAN"/>
    <keyword type="macro" name="xmlXPathNINF" link="libxml2-xpath.html#xmlXPathNINF"/>
    <keyword type="macro" name="xmlXPathPINF" link="libxml2-xpath.html#xmlXPathPINF"/>
    <keyword type="function" name="UTF8ToHtml ()" link="libxml2-HTMLparser.html#UTF8ToHtml"/>
    <keyword type="function" name="UTF8Toisolat1 ()" link="libxml2-encoding.html#UTF8Toisolat1"/>
    <keyword type="function" name="attribute ()" link="libxml2-SAX.html#attribute"/>
    <keyword type="function" name="attributeDecl ()" link="libxml2-SAX.html#attributeDecl"/>
    <keyword type="function" name="cdataBlock ()" link="libxml2-SAX.html#cdataBlock"/>
    <keyword type="function" name="characters ()" link="libxml2-SAX.html#characters"/>
    <keyword type="function" name="checkNamespace ()" link="libxml2-SAX.html#checkNamespace"/>
    <keyword type="function" name="comment ()" link="libxml2-SAX.html#comment"/>
    <keyword type="function" name="elementDecl ()" link="libxml2-SAX.html#elementDecl"/>
    <keyword type="function" name="endDocument ()" link="libxml2-SAX.html#endDocument"/>
    <keyword type="function" name="endElement ()" link="libxml2-SAX.html#endElement"/>
    <keyword type="function" name="entityDecl ()" link="libxml2-SAX.html#entityDecl"/>
    <keyword type="function" name="externalSubset ()" link="libxml2-SAX.html#externalSubset"/>
    <keyword type="function" name="getColumnNumber ()" link="libxml2-SAX.html#getColumnNumber"/>
    <keyword type="function" name="getEntity ()" link="libxml2-SAX.html#getEntity"/>
    <keyword type="function" name="getLineNumber ()" link="libxml2-SAX.html#getLineNumber"/>
    <keyword type="function" name="getNamespace ()" link="libxml2-SAX.html#getNamespace"/>
    <keyword type="function" name="getParameterEntity ()" link="libxml2-SAX.html#getParameterEntity"/>
    <keyword type="function" name="getPublicId ()" link="libxml2-SAX.html#getPublicId"/>
    <keyword type="function" name="getSystemId ()" link="libxml2-SAX.html#getSystemId"/>
    <keyword type="function" name="globalNamespace ()" link="libxml2-SAX.html#globalNamespace"/>
    <keyword type="function" name="hasExternalSubset ()" link="libxml2-SAX.html#hasExternalSubset"/>
    <keyword type="function" name="hasInternalSubset ()" link="libxml2-SAX.html#hasInternalSubset"/>
    <keyword type="function" name="htmlAttrAllowed ()" link="libxml2-HTMLparser.html#htmlAttrAllowed"/>
    <keyword type="function" name="htmlAutoCloseTag ()" link="libxml2-HTMLparser.html#htmlAutoCloseTag"/>
    <keyword type="function" name="htmlCreateFileParserCtxt ()" link="libxml2-parserInternals.html#htmlCreateFileParserCtxt"/>
    <keyword type="function" name="htmlCreateMemoryParserCtxt ()" link="libxml2-HTMLparser.html#htmlCreateMemoryParserCtxt"/>
    <keyword type="function" name="htmlCreatePushParserCtxt ()" link="libxml2-HTMLparser.html#htmlCreatePushParserCtxt"/>
    <keyword type="function" name="htmlCtxtReadDoc ()" link="libxml2-HTMLparser.html#htmlCtxtReadDoc"/>
    <keyword type="function" name="htmlCtxtReadFd ()" link="libxml2-HTMLparser.html#htmlCtxtReadFd"/>
    <keyword type="function" name="htmlCtxtReadFile ()" link="libxml2-HTMLparser.html#htmlCtxtReadFile"/>
    <keyword type="function" name="htmlCtxtReadIO ()" link="libxml2-HTMLparser.html#htmlCtxtReadIO"/>
    <keyword type="function" name="htmlCtxtReadMemory ()" link="libxml2-HTMLparser.html#htmlCtxtReadMemory"/>
    <keyword type="function" name="htmlCtxtReset ()" link="libxml2-HTMLparser.html#htmlCtxtReset"/>
    <keyword type="function" name="htmlCtxtUseOptions ()" link="libxml2-HTMLparser.html#htmlCtxtUseOptions"/>
    <keyword type="function" name="htmlDefaultSAXHandlerInit ()" link="libxml2-SAX2.html#htmlDefaultSAXHandlerInit"/>
    <keyword type="function" name="htmlDocContentDumpFormatOutput ()" link="libxml2-HTMLtree.html#htmlDocContentDumpFormatOutput"/>
    <keyword type="function" name="htmlDocContentDumpOutput ()" link="libxml2-HTMLtree.html#htmlDocContentDumpOutput"/>
    <keyword type="function" name="htmlDocDump ()" link="libxml2-HTMLtree.html#htmlDocDump"/>
    <keyword type="function" name="htmlDocDumpMemory ()" link="libxml2-HTMLtree.html#htmlDocDumpMemory"/>
    <keyword type="function" name="htmlDocDumpMemoryFormat ()" link="libxml2-HTMLtree.html#htmlDocDumpMemoryFormat"/>
    <keyword type="function" name="htmlElementAllowedHere ()" link="libxml2-HTMLparser.html#htmlElementAllowedHere"/>
    <keyword type="function" name="htmlElementStatusHere ()" link="libxml2-HTMLparser.html#htmlElementStatusHere"/>
    <keyword type="function" name="htmlEncodeEntities ()" link="libxml2-HTMLparser.html#htmlEncodeEntities"/>
    <keyword type="function" name="htmlEntityLookup ()" link="libxml2-HTMLparser.html#htmlEntityLookup"/>
    <keyword type="function" name="htmlEntityValueLookup ()" link="libxml2-HTMLparser.html#htmlEntityValueLookup"/>
    <keyword type="function" name="htmlFreeParserCtxt ()" link="libxml2-HTMLparser.html#htmlFreeParserCtxt"/>
    <keyword type="function" name="htmlGetMetaEncoding ()" link="libxml2-HTMLtree.html#htmlGetMetaEncoding"/>
    <keyword type="function" name="htmlHandleOmittedElem ()" link="libxml2-HTMLparser.html#htmlHandleOmittedElem"/>
    <keyword type="function" name="htmlInitAutoClose ()" link="libxml2-parserInternals.html#htmlInitAutoClose"/>
    <keyword type="function" name="htmlIsAutoClosed ()" link="libxml2-HTMLparser.html#htmlIsAutoClosed"/>
    <keyword type="function" name="htmlIsBooleanAttr ()" link="libxml2-HTMLtree.html#htmlIsBooleanAttr"/>
    <keyword type="function" name="htmlIsScriptAttribute ()" link="libxml2-HTMLparser.html#htmlIsScriptAttribute"/>
    <keyword type="function" name="htmlNewDoc ()" link="libxml2-HTMLtree.html#htmlNewDoc"/>
    <keyword type="function" name="htmlNewDocNoDtD ()" link="libxml2-HTMLtree.html#htmlNewDocNoDtD"/>
    <keyword type="function" name="htmlNewParserCtxt ()" link="libxml2-HTMLparser.html#htmlNewParserCtxt"/>
    <keyword type="function" name="htmlNodeDump ()" link="libxml2-HTMLtree.html#htmlNodeDump"/>
    <keyword type="function" name="htmlNodeDumpFile ()" link="libxml2-HTMLtree.html#htmlNodeDumpFile"/>
    <keyword type="function" name="htmlNodeDumpFileFormat ()" link="libxml2-HTMLtree.html#htmlNodeDumpFileFormat"/>
    <keyword type="function" name="htmlNodeDumpFormatOutput ()" link="libxml2-HTMLtree.html#htmlNodeDumpFormatOutput"/>
    <keyword type="function" name="htmlNodeDumpOutput ()" link="libxml2-HTMLtree.html#htmlNodeDumpOutput"/>
    <keyword type="function" name="htmlNodeStatus ()" link="libxml2-HTMLparser.html#htmlNodeStatus"/>
    <keyword type="function" name="htmlParseCharRef ()" link="libxml2-HTMLparser.html#htmlParseCharRef"/>
    <keyword type="function" name="htmlParseChunk ()" link="libxml2-HTMLparser.html#htmlParseChunk"/>
    <keyword type="function" name="htmlParseDoc ()" link="libxml2-HTMLparser.html#htmlParseDoc"/>
    <keyword type="function" name="htmlParseDocument ()" link="libxml2-HTMLparser.html#htmlParseDocument"/>
    <keyword type="function" name="htmlParseElement ()" link="libxml2-HTMLparser.html#htmlParseElement"/>
    <keyword type="function" name="htmlParseEntityRef ()" link="libxml2-HTMLparser.html#htmlParseEntityRef"/>
    <keyword type="function" name="htmlParseFile ()" link="libxml2-HTMLparser.html#htmlParseFile"/>
    <keyword type="function" name="htmlReadDoc ()" link="libxml2-HTMLparser.html#htmlReadDoc"/>
    <keyword type="function" name="htmlReadFd ()" link="libxml2-HTMLparser.html#htmlReadFd"/>
    <keyword type="function" name="htmlReadFile ()" link="libxml2-HTMLparser.html#htmlReadFile"/>
    <keyword type="function" name="htmlReadIO ()" link="libxml2-HTMLparser.html#htmlReadIO"/>
    <keyword type="function" name="htmlReadMemory ()" link="libxml2-HTMLparser.html#htmlReadMemory"/>
    <keyword type="function" name="htmlSAXParseDoc ()" link="libxml2-HTMLparser.html#htmlSAXParseDoc"/>
    <keyword type="function" name="htmlSAXParseFile ()" link="libxml2-HTMLparser.html#htmlSAXParseFile"/>
    <keyword type="function" name="htmlSaveFile ()" link="libxml2-HTMLtree.html#htmlSaveFile"/>
    <keyword type="function" name="htmlSaveFileEnc ()" link="libxml2-HTMLtree.html#htmlSaveFileEnc"/>
    <keyword type="function" name="htmlSaveFileFormat ()" link="libxml2-HTMLtree.html#htmlSaveFileFormat"/>
    <keyword type="function" name="htmlSetMetaEncoding ()" link="libxml2-HTMLtree.html#htmlSetMetaEncoding"/>
    <keyword type="function" name="htmlTagLookup ()" link="libxml2-HTMLparser.html#htmlTagLookup"/>
    <keyword type="function" name="ignorableWhitespace ()" link="libxml2-SAX.html#ignorableWhitespace"/>
    <keyword type="function" name="initGenericErrorDefaultFunc ()" link="libxml2-xmlerror.html#initGenericErrorDefaultFunc"/>
    <keyword type="function" name="inithtmlDefaultSAXHandler ()" link="libxml2-SAX.html#inithtmlDefaultSAXHandler"/>
    <keyword type="function" name="initxmlDefaultSAXHandler ()" link="libxml2-SAX.html#initxmlDefaultSAXHandler"/>
    <keyword type="function" name="inputPop ()" link="libxml2-parserInternals.html#inputPop"/>
    <keyword type="function" name="inputPush ()" link="libxml2-parserInternals.html#inputPush"/>
    <keyword type="function" name="internalSubset ()" link="libxml2-SAX.html#internalSubset"/>
    <keyword type="function" name="isStandalone ()" link="libxml2-SAX.html#isStandalone"/>
    <keyword type="function" name="isolat1ToUTF8 ()" link="libxml2-encoding.html#isolat1ToUTF8"/>
    <keyword type="function" name="namePop ()" link="libxml2-parserInternals.html#namePop"/>
    <keyword type="function" name="namePush ()" link="libxml2-parserInternals.html#namePush"/>
    <keyword type="function" name="namespaceDecl ()" link="libxml2-SAX.html#namespaceDecl"/>
    <keyword type="function" name="nodePop ()" link="libxml2-parserInternals.html#nodePop"/>
    <keyword type="function" name="nodePush ()" link="libxml2-parserInternals.html#nodePush"/>
    <keyword type="function" name="notationDecl ()" link="libxml2-SAX.html#notationDecl"/>
    <keyword type="function" name="processingInstruction ()" link="libxml2-SAX.html#processingInstruction"/>
    <keyword type="function" name="reference ()" link="libxml2-SAX.html#reference"/>
    <keyword type="function" name="resolveEntity ()" link="libxml2-SAX.html#resolveEntity"/>
    <keyword type="function" name="setDocumentLocator ()" link="libxml2-SAX.html#setDocumentLocator"/>
    <keyword type="function" name="setNamespace ()" link="libxml2-SAX.html#setNamespace"/>
    <keyword type="function" name="startDocument ()" link="libxml2-SAX.html#startDocument"/>
    <keyword type="function" name="startElement ()" link="libxml2-SAX.html#startElement"/>
    <keyword type="function" name="unparsedEntityDecl ()" link="libxml2-SAX.html#unparsedEntityDecl"/>
    <keyword type="function" name="valuePop ()" link="libxml2-xpathInternals.html#valuePop"/>
    <keyword type="function" name="valuePush ()" link="libxml2-xpathInternals.html#valuePush"/>
    <keyword type="function" name="xlinkGetDefaultDetect ()" link="libxml2-xlink.html#xlinkGetDefaultDetect"/>
    <keyword type="function" name="xlinkGetDefaultHandler ()" link="libxml2-xlink.html#xlinkGetDefaultHandler"/>
    <keyword type="function" name="xlinkIsLink ()" link="libxml2-xlink.html#xlinkIsLink"/>
    <keyword type="function" name="xlinkSetDefaultDetect ()" link="libxml2-xlink.html#xlinkSetDefaultDetect"/>
    <keyword type="function" name="xlinkSetDefaultHandler ()" link="libxml2-xlink.html#xlinkSetDefaultHandler"/>
    <keyword type="function" name="xmlACatalogAdd ()" link="libxml2-catalog.html#xmlACatalogAdd"/>
    <keyword type="function" name="xmlACatalogDump ()" link="libxml2-catalog.html#xmlACatalogDump"/>
    <keyword type="function" name="xmlACatalogRemove ()" link="libxml2-catalog.html#xmlACatalogRemove"/>
    <keyword type="function" name="xmlACatalogResolve ()" link="libxml2-catalog.html#xmlACatalogResolve"/>
    <keyword type="function" name="xmlACatalogResolvePublic ()" link="libxml2-catalog.html#xmlACatalogResolvePublic"/>
    <keyword type="function" name="xmlACatalogResolveSystem ()" link="libxml2-catalog.html#xmlACatalogResolveSystem"/>
    <keyword type="function" name="xmlACatalogResolveURI ()" link="libxml2-catalog.html#xmlACatalogResolveURI"/>
    <keyword type="function" name="xmlAddAttributeDecl ()" link="libxml2-valid.html#xmlAddAttributeDecl"/>
    <keyword type="function" name="xmlAddChild ()" link="libxml2-tree.html#xmlAddChild"/>
    <keyword type="function" name="xmlAddChildList ()" link="libxml2-tree.html#xmlAddChildList"/>
    <keyword type="function" name="xmlAddDocEntity ()" link="libxml2-entities.html#xmlAddDocEntity"/>
    <keyword type="function" name="xmlAddDtdEntity ()" link="libxml2-entities.html#xmlAddDtdEntity"/>
    <keyword type="function" name="xmlAddElementDecl ()" link="libxml2-valid.html#xmlAddElementDecl"/>
    <keyword type="function" name="xmlAddEncodingAlias ()" link="libxml2-encoding.html#xmlAddEncodingAlias"/>
    <keyword type="function" name="xmlAddID ()" link="libxml2-valid.html#xmlAddID"/>
    <keyword type="function" name="xmlAddNextSibling ()" link="libxml2-tree.html#xmlAddNextSibling"/>
    <keyword type="function" name="xmlAddNotationDecl ()" link="libxml2-valid.html#xmlAddNotationDecl"/>
    <keyword type="function" name="xmlAddPrevSibling ()" link="libxml2-tree.html#xmlAddPrevSibling"/>
    <keyword type="function" name="xmlAddRef ()" link="libxml2-valid.html#xmlAddRef"/>
    <keyword type="function" name="xmlAddSibling ()" link="libxml2-tree.html#xmlAddSibling"/>
    <keyword type="function" name="xmlAllocOutputBuffer ()" link="libxml2-xmlIO.html#xmlAllocOutputBuffer"/>
    <keyword type="function" name="xmlAllocParserInputBuffer ()" link="libxml2-xmlIO.html#xmlAllocParserInputBuffer"/>
    <keyword type="function" name="xmlAttrSerializeTxtContent ()" link="libxml2-tree.html#xmlAttrSerializeTxtContent"/>
    <keyword type="function" name="xmlAutomataCompile ()" link="libxml2-xmlautomata.html#xmlAutomataCompile"/>
    <keyword type="function" name="xmlAutomataGetInitState ()" link="libxml2-xmlautomata.html#xmlAutomataGetInitState"/>
    <keyword type="function" name="xmlAutomataIsDeterminist ()" link="libxml2-xmlautomata.html#xmlAutomataIsDeterminist"/>
    <keyword type="function" name="xmlAutomataNewAllTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewAllTrans"/>
    <keyword type="function" name="xmlAutomataNewCountTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewCountTrans"/>
    <keyword type="function" name="xmlAutomataNewCountTrans2 ()" link="libxml2-xmlautomata.html#xmlAutomataNewCountTrans2"/>
    <keyword type="function" name="xmlAutomataNewCountedTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewCountedTrans"/>
    <keyword type="function" name="xmlAutomataNewCounter ()" link="libxml2-xmlautomata.html#xmlAutomataNewCounter"/>
    <keyword type="function" name="xmlAutomataNewCounterTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewCounterTrans"/>
    <keyword type="function" name="xmlAutomataNewEpsilon ()" link="libxml2-xmlautomata.html#xmlAutomataNewEpsilon"/>
    <keyword type="function" name="xmlAutomataNewNegTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewNegTrans"/>
    <keyword type="function" name="xmlAutomataNewOnceTrans ()" link="libxml2-xmlautomata.html#xmlAutomataNewOnceTrans"/>
    <keyword type="function" name="xmlAutomataNewOnceTrans2 ()" link="libxml2-xmlautomata.html#xmlAutomataNewOnceTrans2"/>
    <keyword type="function" name="xmlAutomataNewState ()" link="libxml2-xmlautomata.html#xmlAutomataNewState"/>
    <keyword type="function" name="xmlAutomataNewTransition ()" link="libxml2-xmlautomata.html#xmlAutomataNewTransition"/>
    <keyword type="function" name="xmlAutomataNewTransition2 ()" link="libxml2-xmlautomata.html#xmlAutomataNewTransition2"/>
    <keyword type="function" name="xmlAutomataSetFinalState ()" link="libxml2-xmlautomata.html#xmlAutomataSetFinalState"/>
    <keyword type="function" name="xmlBoolToText ()" link="libxml2-debugXML.html#xmlBoolToText"/>
    <keyword type="function" name="xmlBufContent ()" link="libxml2-tree.html#xmlBufContent"/>
    <keyword type="function" name="xmlBufEnd ()" link="libxml2-tree.html#xmlBufEnd"/>
    <keyword type="function" name="xmlBufGetNodeContent ()" link="libxml2-tree.html#xmlBufGetNodeContent"/>
    <keyword type="function" name="xmlBufNodeDump ()" link="libxml2-tree.html#xmlBufNodeDump"/>
    <keyword type="function" name="xmlBufShrink ()" link="libxml2-tree.html#xmlBufShrink"/>
    <keyword type="function" name="xmlBufUse ()" link="libxml2-tree.html#xmlBufUse"/>
    <keyword type="function" name="xmlBufferAdd ()" link="libxml2-tree.html#xmlBufferAdd"/>
    <keyword type="function" name="xmlBufferAddHead ()" link="libxml2-tree.html#xmlBufferAddHead"/>
    <keyword type="function" name="xmlBufferCCat ()" link="libxml2-tree.html#xmlBufferCCat"/>
    <keyword type="function" name="xmlBufferCat ()" link="libxml2-tree.html#xmlBufferCat"/>
    <keyword type="function" name="xmlBufferContent ()" link="libxml2-tree.html#xmlBufferContent"/>
    <keyword type="function" name="xmlBufferCreate ()" link="libxml2-tree.html#xmlBufferCreate"/>
    <keyword type="function" name="xmlBufferCreateSize ()" link="libxml2-tree.html#xmlBufferCreateSize"/>
    <keyword type="function" name="xmlBufferCreateStatic ()" link="libxml2-tree.html#xmlBufferCreateStatic"/>
    <keyword type="function" name="xmlBufferDetach ()" link="libxml2-tree.html#xmlBufferDetach"/>
    <keyword type="function" name="xmlBufferDump ()" link="libxml2-tree.html#xmlBufferDump"/>
    <keyword type="function" name="xmlBufferEmpty ()" link="libxml2-tree.html#xmlBufferEmpty"/>
    <keyword type="function" name="xmlBufferFree ()" link="libxml2-tree.html#xmlBufferFree"/>
    <keyword type="function" name="xmlBufferGrow ()" link="libxml2-tree.html#xmlBufferGrow"/>
    <keyword type="function" name="xmlBufferLength ()" link="libxml2-tree.html#xmlBufferLength"/>
    <keyword type="function" name="xmlBufferResize ()" link="libxml2-tree.html#xmlBufferResize"/>
    <keyword type="function" name="xmlBufferSetAllocationScheme ()" link="libxml2-tree.html#xmlBufferSetAllocationScheme"/>
    <keyword type="function" name="xmlBufferShrink ()" link="libxml2-tree.html#xmlBufferShrink"/>
    <keyword type="function" name="xmlBufferWriteCHAR ()" link="libxml2-tree.html#xmlBufferWriteCHAR"/>
    <keyword type="function" name="xmlBufferWriteChar ()" link="libxml2-tree.html#xmlBufferWriteChar"/>
    <keyword type="function" name="xmlBufferWriteQuotedString ()" link="libxml2-tree.html#xmlBufferWriteQuotedString"/>
    <keyword type="function" name="xmlBuildQName ()" link="libxml2-tree.html#xmlBuildQName"/>
    <keyword type="function" name="xmlBuildRelativeURI ()" link="libxml2-uri.html#xmlBuildRelativeURI"/>
    <keyword type="function" name="xmlBuildURI ()" link="libxml2-uri.html#xmlBuildURI"/>
    <keyword type="function" name="xmlByteConsumed ()" link="libxml2-parser.html#xmlByteConsumed"/>
    <keyword type="function" name="xmlC14NDocDumpMemory ()" link="libxml2-c14n.html#xmlC14NDocDumpMemory"/>
    <keyword type="function" name="xmlC14NDocSave ()" link="libxml2-c14n.html#xmlC14NDocSave"/>
    <keyword type="function" name="xmlC14NDocSaveTo ()" link="libxml2-c14n.html#xmlC14NDocSaveTo"/>
    <keyword type="function" name="xmlC14NExecute ()" link="libxml2-c14n.html#xmlC14NExecute"/>
    <keyword type="function" name="xmlCanonicPath ()" link="libxml2-uri.html#xmlCanonicPath"/>
    <keyword type="function" name="xmlCatalogAdd ()" link="libxml2-catalog.html#xmlCatalogAdd"/>
    <keyword type="function" name="xmlCatalogAddLocal ()" link="libxml2-catalog.html#xmlCatalogAddLocal"/>
    <keyword type="function" name="xmlCatalogCleanup ()" link="libxml2-catalog.html#xmlCatalogCleanup"/>
    <keyword type="function" name="xmlCatalogConvert ()" link="libxml2-catalog.html#xmlCatalogConvert"/>
    <keyword type="function" name="xmlCatalogDump ()" link="libxml2-catalog.html#xmlCatalogDump"/>
    <keyword type="function" name="xmlCatalogFreeLocal ()" link="libxml2-catalog.html#xmlCatalogFreeLocal"/>
    <keyword type="function" name="xmlCatalogGetDefaults ()" link="libxml2-catalog.html#xmlCatalogGetDefaults"/>
    <keyword type="function" name="xmlCatalogGetPublic ()" link="libxml2-catalog.html#xmlCatalogGetPublic"/>
    <keyword type="function" name="xmlCatalogGetSystem ()" link="libxml2-catalog.html#xmlCatalogGetSystem"/>
    <keyword type="function" name="xmlCatalogIsEmpty ()" link="libxml2-catalog.html#xmlCatalogIsEmpty"/>
    <keyword type="function" name="xmlCatalogLocalResolve ()" link="libxml2-catalog.html#xmlCatalogLocalResolve"/>
    <keyword type="function" name="xmlCatalogLocalResolveURI ()" link="libxml2-catalog.html#xmlCatalogLocalResolveURI"/>
    <keyword type="function" name="xmlCatalogRemove ()" link="libxml2-catalog.html#xmlCatalogRemove"/>
    <keyword type="function" name="xmlCatalogResolve ()" link="libxml2-catalog.html#xmlCatalogResolve"/>
    <keyword type="function" name="xmlCatalogResolvePublic ()" link="libxml2-catalog.html#xmlCatalogResolvePublic"/>
    <keyword type="function" name="xmlCatalogResolveSystem ()" link="libxml2-catalog.html#xmlCatalogResolveSystem"/>
    <keyword type="function" name="xmlCatalogResolveURI ()" link="libxml2-catalog.html#xmlCatalogResolveURI"/>
    <keyword type="function" name="xmlCatalogSetDebug ()" link="libxml2-catalog.html#xmlCatalogSetDebug"/>
    <keyword type="function" name="xmlCatalogSetDefaultPrefer ()" link="libxml2-catalog.html#xmlCatalogSetDefaultPrefer"/>
    <keyword type="function" name="xmlCatalogSetDefaults ()" link="libxml2-catalog.html#xmlCatalogSetDefaults"/>
    <keyword type="function" name="xmlCharEncCloseFunc ()" link="libxml2-encoding.html#xmlCharEncCloseFunc"/>
    <keyword type="function" name="xmlCharEncFirstLine ()" link="libxml2-encoding.html#xmlCharEncFirstLine"/>
    <keyword type="function" name="xmlCharEncInFunc ()" link="libxml2-encoding.html#xmlCharEncInFunc"/>
    <keyword type="function" name="xmlCharEncOutFunc ()" link="libxml2-encoding.html#xmlCharEncOutFunc"/>
    <keyword type="function" name="xmlCharInRange ()" link="libxml2-chvalid.html#xmlCharInRange"/>
    <keyword type="function" name="xmlCharStrdup ()" link="libxml2-xmlstring.html#xmlCharStrdup"/>
    <keyword type="function" name="xmlCharStrndup ()" link="libxml2-xmlstring.html#xmlCharStrndup"/>
    <keyword type="function" name="xmlCheckFilename ()" link="libxml2-xmlIO.html#xmlCheckFilename"/>
    <keyword type="function" name="xmlCheckHTTPInput ()" link="libxml2-xmlIO.html#xmlCheckHTTPInput"/>
    <keyword type="function" name="xmlCheckLanguageID ()" link="libxml2-parserInternals.html#xmlCheckLanguageID"/>
    <keyword type="function" name="xmlCheckUTF8 ()" link="libxml2-xmlstring.html#xmlCheckUTF8"/>
    <keyword type="function" name="xmlCheckVersion ()" link="libxml2-xmlversion.html#xmlCheckVersion"/>
    <keyword type="function" name="xmlChildElementCount ()" link="libxml2-tree.html#xmlChildElementCount"/>
    <keyword type="function" name="xmlCleanupCharEncodingHandlers ()" link="libxml2-encoding.html#xmlCleanupCharEncodingHandlers"/>
    <keyword type="function" name="xmlCleanupEncodingAliases ()" link="libxml2-encoding.html#xmlCleanupEncodingAliases"/>
    <keyword type="function" name="xmlCleanupGlobals ()" link="libxml2-globals.html#xmlCleanupGlobals"/>
    <keyword type="function" name="xmlCleanupInputCallbacks ()" link="libxml2-xmlIO.html#xmlCleanupInputCallbacks"/>
    <keyword type="function" name="xmlCleanupMemory ()" link="libxml2-xmlmemory.html#xmlCleanupMemory"/>
    <keyword type="function" name="xmlCleanupOutputCallbacks ()" link="libxml2-xmlIO.html#xmlCleanupOutputCallbacks"/>
    <keyword type="function" name="xmlCleanupParser ()" link="libxml2-parser.html#xmlCleanupParser"/>
    <keyword type="function" name="xmlCleanupPredefinedEntities ()" link="libxml2-entities.html#xmlCleanupPredefinedEntities"/>
    <keyword type="function" name="xmlCleanupThreads ()" link="libxml2-threads.html#xmlCleanupThreads"/>
    <keyword type="function" name="xmlClearNodeInfoSeq ()" link="libxml2-parser.html#xmlClearNodeInfoSeq"/>
    <keyword type="function" name="xmlClearParserCtxt ()" link="libxml2-parser.html#xmlClearParserCtxt"/>
    <keyword type="function" name="xmlConvertSGMLCatalog ()" link="libxml2-catalog.html#xmlConvertSGMLCatalog"/>
    <keyword type="function" name="xmlCopyAttributeTable ()" link="libxml2-valid.html#xmlCopyAttributeTable"/>
    <keyword type="function" name="xmlCopyChar ()" link="libxml2-parserInternals.html#xmlCopyChar"/>
    <keyword type="function" name="xmlCopyCharMultiByte ()" link="libxml2-parserInternals.html#xmlCopyCharMultiByte"/>
    <keyword type="function" name="xmlCopyDoc ()" link="libxml2-tree.html#xmlCopyDoc"/>
    <keyword type="function" name="xmlCopyDocElementContent ()" link="libxml2-valid.html#xmlCopyDocElementContent"/>
    <keyword type="function" name="xmlCopyDtd ()" link="libxml2-tree.html#xmlCopyDtd"/>
    <keyword type="function" name="xmlCopyElementContent ()" link="libxml2-valid.html#xmlCopyElementContent"/>
    <keyword type="function" name="xmlCopyElementTable ()" link="libxml2-valid.html#xmlCopyElementTable"/>
    <keyword type="function" name="xmlCopyEntitiesTable ()" link="libxml2-entities.html#xmlCopyEntitiesTable"/>
    <keyword type="function" name="xmlCopyEnumeration ()" link="libxml2-valid.html#xmlCopyEnumeration"/>
    <keyword type="function" name="xmlCopyError ()" link="libxml2-xmlerror.html#xmlCopyError"/>
    <keyword type="function" name="xmlCopyNamespace ()" link="libxml2-tree.html#xmlCopyNamespace"/>
    <keyword type="function" name="xmlCopyNamespaceList ()" link="libxml2-tree.html#xmlCopyNamespaceList"/>
    <keyword type="function" name="xmlCopyNode ()" link="libxml2-tree.html#xmlCopyNode"/>
    <keyword type="function" name="xmlCopyNodeList ()" link="libxml2-tree.html#xmlCopyNodeList"/>
    <keyword type="function" name="xmlCopyNotationTable ()" link="libxml2-valid.html#xmlCopyNotationTable"/>
    <keyword type="function" name="xmlCopyProp ()" link="libxml2-tree.html#xmlCopyProp"/>
    <keyword type="function" name="xmlCopyPropList ()" link="libxml2-tree.html#xmlCopyPropList"/>
    <keyword type="function" name="xmlCreateDocParserCtxt ()" link="libxml2-parser.html#xmlCreateDocParserCtxt"/>
    <keyword type="function" name="xmlCreateEntitiesTable ()" link="libxml2-entities.html#xmlCreateEntitiesTable"/>
    <keyword type="function" name="xmlCreateEntityParserCtxt ()" link="libxml2-parserInternals.html#xmlCreateEntityParserCtxt"/>
    <keyword type="function" name="xmlCreateEnumeration ()" link="libxml2-valid.html#xmlCreateEnumeration"/>
    <keyword type="function" name="xmlCreateFileParserCtxt ()" link="libxml2-parserInternals.html#xmlCreateFileParserCtxt"/>
    <keyword type="function" name="xmlCreateIOParserCtxt ()" link="libxml2-parser.html#xmlCreateIOParserCtxt"/>
    <keyword type="function" name="xmlCreateIntSubset ()" link="libxml2-tree.html#xmlCreateIntSubset"/>
    <keyword type="function" name="xmlCreateMemoryParserCtxt ()" link="libxml2-parserInternals.html#xmlCreateMemoryParserCtxt"/>
    <keyword type="function" name="xmlCreatePushParserCtxt ()" link="libxml2-parser.html#xmlCreatePushParserCtxt"/>
    <keyword type="function" name="xmlCreateURI ()" link="libxml2-uri.html#xmlCreateURI"/>
    <keyword type="function" name="xmlCreateURLParserCtxt ()" link="libxml2-parserInternals.html#xmlCreateURLParserCtxt"/>
    <keyword type="function" name="xmlCtxtGetLastError ()" link="libxml2-xmlerror.html#xmlCtxtGetLastError"/>
    <keyword type="function" name="xmlCtxtReadDoc ()" link="libxml2-parser.html#xmlCtxtReadDoc"/>
    <keyword type="function" name="xmlCtxtReadFd ()" link="libxml2-parser.html#xmlCtxtReadFd"/>
    <keyword type="function" name="xmlCtxtReadFile ()" link="libxml2-parser.html#xmlCtxtReadFile"/>
    <keyword type="function" name="xmlCtxtReadIO ()" link="libxml2-parser.html#xmlCtxtReadIO"/>
    <keyword type="function" name="xmlCtxtReadMemory ()" link="libxml2-parser.html#xmlCtxtReadMemory"/>
    <keyword type="function" name="xmlCtxtReset ()" link="libxml2-parser.html#xmlCtxtReset"/>
    <keyword type="function" name="xmlCtxtResetLastError ()" link="libxml2-xmlerror.html#xmlCtxtResetLastError"/>
    <keyword type="function" name="xmlCtxtResetPush ()" link="libxml2-parser.html#xmlCtxtResetPush"/>
    <keyword type="function" name="xmlCtxtUseOptions ()" link="libxml2-parser.html#xmlCtxtUseOptions"/>
    <keyword type="function" name="xmlCurrentChar ()" link="libxml2-parserInternals.html#xmlCurrentChar"/>
    <keyword type="function" name="xmlDOMWrapAdoptNode ()" link="libxml2-tree.html#xmlDOMWrapAdoptNode"/>
    <keyword type="function" name="xmlDOMWrapCloneNode ()" link="libxml2-tree.html#xmlDOMWrapCloneNode"/>
    <keyword type="function" name="xmlDOMWrapFreeCtxt ()" link="libxml2-tree.html#xmlDOMWrapFreeCtxt"/>
    <keyword type="function" name="xmlDOMWrapNewCtxt ()" link="libxml2-tree.html#xmlDOMWrapNewCtxt"/>
    <keyword type="function" name="xmlDOMWrapReconcileNamespaces ()" link="libxml2-tree.html#xmlDOMWrapReconcileNamespaces"/>
    <keyword type="function" name="xmlDOMWrapRemoveNode ()" link="libxml2-tree.html#xmlDOMWrapRemoveNode"/>
    <keyword type="function" name="xmlDebugCheckDocument ()" link="libxml2-debugXML.html#xmlDebugCheckDocument"/>
    <keyword type="function" name="xmlDebugDumpAttr ()" link="libxml2-debugXML.html#xmlDebugDumpAttr"/>
    <keyword type="function" name="xmlDebugDumpAttrList ()" link="libxml2-debugXML.html#xmlDebugDumpAttrList"/>
    <keyword type="function" name="xmlDebugDumpDTD ()" link="libxml2-debugXML.html#xmlDebugDumpDTD"/>
    <keyword type="function" name="xmlDebugDumpDocument ()" link="libxml2-debugXML.html#xmlDebugDumpDocument"/>
    <keyword type="function" name="xmlDebugDumpDocumentHead ()" link="libxml2-debugXML.html#xmlDebugDumpDocumentHead"/>
    <keyword type="function" name="xmlDebugDumpEntities ()" link="libxml2-debugXML.html#xmlDebugDumpEntities"/>
    <keyword type="function" name="xmlDebugDumpNode ()" link="libxml2-debugXML.html#xmlDebugDumpNode"/>
    <keyword type="function" name="xmlDebugDumpNodeList ()" link="libxml2-debugXML.html#xmlDebugDumpNodeList"/>
    <keyword type="function" name="xmlDebugDumpOneNode ()" link="libxml2-debugXML.html#xmlDebugDumpOneNode"/>
    <keyword type="function" name="xmlDebugDumpString ()" link="libxml2-debugXML.html#xmlDebugDumpString"/>
    <keyword type="function" name="xmlDecodeEntities ()" link="libxml2-parserInternals.html#xmlDecodeEntities"/>
    <keyword type="function" name="xmlDefaultSAXHandlerInit ()" link="libxml2-SAX2.html#xmlDefaultSAXHandlerInit"/>
    <keyword type="function" name="xmlDelEncodingAlias ()" link="libxml2-encoding.html#xmlDelEncodingAlias"/>
    <keyword type="function" name="xmlDeregisterNodeDefault ()" link="libxml2-globals.html#xmlDeregisterNodeDefault"/>
    <keyword type="function" name="xmlDetectCharEncoding ()" link="libxml2-encoding.html#xmlDetectCharEncoding"/>
    <keyword type="function" name="xmlDictCleanup ()" link="libxml2-dict.html#xmlDictCleanup"/>
    <keyword type="function" name="xmlDictCreate ()" link="libxml2-dict.html#xmlDictCreate"/>
    <keyword type="function" name="xmlDictCreateSub ()" link="libxml2-dict.html#xmlDictCreateSub"/>
    <keyword type="function" name="xmlDictExists ()" link="libxml2-dict.html#xmlDictExists"/>
    <keyword type="function" name="xmlDictFree ()" link="libxml2-dict.html#xmlDictFree"/>
    <keyword type="function" name="xmlDictGetUsage ()" link="libxml2-dict.html#xmlDictGetUsage"/>
    <keyword type="function" name="xmlDictLookup ()" link="libxml2-dict.html#xmlDictLookup"/>
    <keyword type="function" name="xmlDictOwns ()" link="libxml2-dict.html#xmlDictOwns"/>
    <keyword type="function" name="xmlDictQLookup ()" link="libxml2-dict.html#xmlDictQLookup"/>
    <keyword type="function" name="xmlDictReference ()" link="libxml2-dict.html#xmlDictReference"/>
    <keyword type="function" name="xmlDictSetLimit ()" link="libxml2-dict.html#xmlDictSetLimit"/>
    <keyword type="function" name="xmlDictSize ()" link="libxml2-dict.html#xmlDictSize"/>
    <keyword type="function" name="xmlDllMain ()" link="libxml2-threads.html#xmlDllMain"/>
    <keyword type="function" name="xmlDocCopyNode ()" link="libxml2-tree.html#xmlDocCopyNode"/>
    <keyword type="function" name="xmlDocCopyNodeList ()" link="libxml2-tree.html#xmlDocCopyNodeList"/>
    <keyword type="function" name="xmlDocDump ()" link="libxml2-tree.html#xmlDocDump"/>
    <keyword type="function" name="xmlDocDumpFormatMemory ()" link="libxml2-tree.html#xmlDocDumpFormatMemory"/>
    <keyword type="function" name="xmlDocDumpFormatMemoryEnc ()" link="libxml2-tree.html#xmlDocDumpFormatMemoryEnc"/>
    <keyword type="function" name="xmlDocDumpMemory ()" link="libxml2-tree.html#xmlDocDumpMemory"/>
    <keyword type="function" name="xmlDocDumpMemoryEnc ()" link="libxml2-tree.html#xmlDocDumpMemoryEnc"/>
    <keyword type="function" name="xmlDocFormatDump ()" link="libxml2-tree.html#xmlDocFormatDump"/>
    <keyword type="function" name="xmlDocGetRootElement ()" link="libxml2-tree.html#xmlDocGetRootElement"/>
    <keyword type="function" name="xmlDocSetRootElement ()" link="libxml2-tree.html#xmlDocSetRootElement"/>
    <keyword type="function" name="xmlDumpAttributeDecl ()" link="libxml2-valid.html#xmlDumpAttributeDecl"/>
    <keyword type="function" name="xmlDumpAttributeTable ()" link="libxml2-valid.html#xmlDumpAttributeTable"/>
    <keyword type="function" name="xmlDumpElementDecl ()" link="libxml2-valid.html#xmlDumpElementDecl"/>
    <keyword type="function" name="xmlDumpElementTable ()" link="libxml2-valid.html#xmlDumpElementTable"/>
    <keyword type="function" name="xmlDumpEntitiesTable ()" link="libxml2-entities.html#xmlDumpEntitiesTable"/>
    <keyword type="function" name="xmlDumpEntityDecl ()" link="libxml2-entities.html#xmlDumpEntityDecl"/>
    <keyword type="function" name="xmlDumpNotationDecl ()" link="libxml2-valid.html#xmlDumpNotationDecl"/>
    <keyword type="function" name="xmlDumpNotationTable ()" link="libxml2-valid.html#xmlDumpNotationTable"/>
    <keyword type="function" name="xmlElemDump ()" link="libxml2-tree.html#xmlElemDump"/>
    <keyword type="function" name="xmlEncodeEntities ()" link="libxml2-entities.html#xmlEncodeEntities"/>
    <keyword type="function" name="xmlEncodeEntitiesReentrant ()" link="libxml2-entities.html#xmlEncodeEntitiesReentrant"/>
    <keyword type="function" name="xmlEncodeSpecialChars ()" link="libxml2-entities.html#xmlEncodeSpecialChars"/>
    <keyword type="function" name="xmlErrMemory ()" link="libxml2-parserInternals.html#xmlErrMemory"/>
    <keyword type="function" name="xmlExpCtxtNbCons ()" link="libxml2-xmlregexp.html#xmlExpCtxtNbCons"/>
    <keyword type="function" name="xmlExpCtxtNbNodes ()" link="libxml2-xmlregexp.html#xmlExpCtxtNbNodes"/>
    <keyword type="function" name="xmlExpDump ()" link="libxml2-xmlregexp.html#xmlExpDump"/>
    <keyword type="function" name="xmlExpExpDerive ()" link="libxml2-xmlregexp.html#xmlExpExpDerive"/>
    <keyword type="function" name="xmlExpFree ()" link="libxml2-xmlregexp.html#xmlExpFree"/>
    <keyword type="function" name="xmlExpFreeCtxt ()" link="libxml2-xmlregexp.html#xmlExpFreeCtxt"/>
    <keyword type="function" name="xmlExpGetLanguage ()" link="libxml2-xmlregexp.html#xmlExpGetLanguage"/>
    <keyword type="function" name="xmlExpGetStart ()" link="libxml2-xmlregexp.html#xmlExpGetStart"/>
    <keyword type="function" name="xmlExpIsNillable ()" link="libxml2-xmlregexp.html#xmlExpIsNillable"/>
    <keyword type="function" name="xmlExpMaxToken ()" link="libxml2-xmlregexp.html#xmlExpMaxToken"/>
    <keyword type="function" name="xmlExpNewAtom ()" link="libxml2-xmlregexp.html#xmlExpNewAtom"/>
    <keyword type="function" name="xmlExpNewCtxt ()" link="libxml2-xmlregexp.html#xmlExpNewCtxt"/>
    <keyword type="function" name="xmlExpNewOr ()" link="libxml2-xmlregexp.html#xmlExpNewOr"/>
    <keyword type="function" name="xmlExpNewRange ()" link="libxml2-xmlregexp.html#xmlExpNewRange"/>
    <keyword type="function" name="xmlExpNewSeq ()" link="libxml2-xmlregexp.html#xmlExpNewSeq"/>
    <keyword type="function" name="xmlExpParse ()" link="libxml2-xmlregexp.html#xmlExpParse"/>
    <keyword type="function" name="xmlExpRef ()" link="libxml2-xmlregexp.html#xmlExpRef"/>
    <keyword type="function" name="xmlExpStringDerive ()" link="libxml2-xmlregexp.html#xmlExpStringDerive"/>
    <keyword type="function" name="xmlExpSubsume ()" link="libxml2-xmlregexp.html#xmlExpSubsume"/>
    <keyword type="function" name="xmlFileClose ()" link="libxml2-xmlIO.html#xmlFileClose"/>
    <keyword type="function" name="xmlFileMatch ()" link="libxml2-xmlIO.html#xmlFileMatch"/>
    <keyword type="function" name="xmlFileOpen ()" link="libxml2-xmlIO.html#xmlFileOpen"/>
    <keyword type="function" name="xmlFileRead ()" link="libxml2-xmlIO.html#xmlFileRead"/>
    <keyword type="function" name="xmlFindCharEncodingHandler ()" link="libxml2-encoding.html#xmlFindCharEncodingHandler"/>
    <keyword type="function" name="xmlFirstElementChild ()" link="libxml2-tree.html#xmlFirstElementChild"/>
    <keyword type="function" name="xmlFreeAttributeTable ()" link="libxml2-valid.html#xmlFreeAttributeTable"/>
    <keyword type="function" name="xmlFreeAutomata ()" link="libxml2-xmlautomata.html#xmlFreeAutomata"/>
    <keyword type="function" name="xmlFreeCatalog ()" link="libxml2-catalog.html#xmlFreeCatalog"/>
    <keyword type="function" name="xmlFreeDoc ()" link="libxml2-tree.html#xmlFreeDoc"/>
    <keyword type="function" name="xmlFreeDocElementContent ()" link="libxml2-valid.html#xmlFreeDocElementContent"/>
    <keyword type="function" name="xmlFreeDtd ()" link="libxml2-tree.html#xmlFreeDtd"/>
    <keyword type="function" name="xmlFreeElementContent ()" link="libxml2-valid.html#xmlFreeElementContent"/>
    <keyword type="function" name="xmlFreeElementTable ()" link="libxml2-valid.html#xmlFreeElementTable"/>
    <keyword type="function" name="xmlFreeEntitiesTable ()" link="libxml2-entities.html#xmlFreeEntitiesTable"/>
    <keyword type="function" name="xmlFreeEnumeration ()" link="libxml2-valid.html#xmlFreeEnumeration"/>
    <keyword type="function" name="xmlFreeIDTable ()" link="libxml2-valid.html#xmlFreeIDTable"/>
    <keyword type="function" name="xmlFreeInputStream ()" link="libxml2-parserInternals.html#xmlFreeInputStream"/>
    <keyword type="function" name="xmlFreeMutex ()" link="libxml2-threads.html#xmlFreeMutex"/>
    <keyword type="function" name="xmlFreeNode ()" link="libxml2-tree.html#xmlFreeNode"/>
    <keyword type="function" name="xmlFreeNodeList ()" link="libxml2-tree.html#xmlFreeNodeList"/>
    <keyword type="function" name="xmlFreeNotationTable ()" link="libxml2-valid.html#xmlFreeNotationTable"/>
    <keyword type="function" name="xmlFreeNs ()" link="libxml2-tree.html#xmlFreeNs"/>
    <keyword type="function" name="xmlFreeNsList ()" link="libxml2-tree.html#xmlFreeNsList"/>
    <keyword type="function" name="xmlFreeParserCtxt ()" link="libxml2-parser.html#xmlFreeParserCtxt"/>
    <keyword type="function" name="xmlFreeParserInputBuffer ()" link="libxml2-xmlIO.html#xmlFreeParserInputBuffer"/>
    <keyword type="function" name="xmlFreePattern ()" link="libxml2-pattern.html#xmlFreePattern"/>
    <keyword type="function" name="xmlFreePatternList ()" link="libxml2-pattern.html#xmlFreePatternList"/>
    <keyword type="function" name="xmlFreeProp ()" link="libxml2-tree.html#xmlFreeProp"/>
    <keyword type="function" name="xmlFreePropList ()" link="libxml2-tree.html#xmlFreePropList"/>
    <keyword type="function" name="xmlFreeRMutex ()" link="libxml2-threads.html#xmlFreeRMutex"/>
    <keyword type="function" name="xmlFreeRefTable ()" link="libxml2-valid.html#xmlFreeRefTable"/>
    <keyword type="function" name="xmlFreeStreamCtxt ()" link="libxml2-pattern.html#xmlFreeStreamCtxt"/>
    <keyword type="function" name="xmlFreeTextReader ()" link="libxml2-xmlreader.html#xmlFreeTextReader"/>
    <keyword type="function" name="xmlFreeTextWriter ()" link="libxml2-xmlwriter.html#xmlFreeTextWriter"/>
    <keyword type="function" name="xmlFreeURI ()" link="libxml2-uri.html#xmlFreeURI"/>
    <keyword type="function" name="xmlFreeValidCtxt ()" link="libxml2-valid.html#xmlFreeValidCtxt"/>
    <keyword type="function" name="xmlGcMemGet ()" link="libxml2-xmlmemory.html#xmlGcMemGet"/>
    <keyword type="function" name="xmlGcMemSetup ()" link="libxml2-xmlmemory.html#xmlGcMemSetup"/>
    <keyword type="function" name="xmlGetBufferAllocationScheme ()" link="libxml2-tree.html#xmlGetBufferAllocationScheme"/>
    <keyword type="function" name="xmlGetCharEncodingHandler ()" link="libxml2-encoding.html#xmlGetCharEncodingHandler"/>
    <keyword type="function" name="xmlGetCharEncodingName ()" link="libxml2-encoding.html#xmlGetCharEncodingName"/>
    <keyword type="function" name="xmlGetCompressMode ()" link="libxml2-tree.html#xmlGetCompressMode"/>
    <keyword type="function" name="xmlGetDocCompressMode ()" link="libxml2-tree.html#xmlGetDocCompressMode"/>
    <keyword type="function" name="xmlGetDocEntity ()" link="libxml2-entities.html#xmlGetDocEntity"/>
    <keyword type="function" name="xmlGetDtdAttrDesc ()" link="libxml2-valid.html#xmlGetDtdAttrDesc"/>
    <keyword type="function" name="xmlGetDtdElementDesc ()" link="libxml2-valid.html#xmlGetDtdElementDesc"/>
    <keyword type="function" name="xmlGetDtdEntity ()" link="libxml2-entities.html#xmlGetDtdEntity"/>
    <keyword type="function" name="xmlGetDtdNotationDesc ()" link="libxml2-valid.html#xmlGetDtdNotationDesc"/>
    <keyword type="function" name="xmlGetDtdQAttrDesc ()" link="libxml2-valid.html#xmlGetDtdQAttrDesc"/>
    <keyword type="function" name="xmlGetDtdQElementDesc ()" link="libxml2-valid.html#xmlGetDtdQElementDesc"/>
    <keyword type="function" name="xmlGetEncodingAlias ()" link="libxml2-encoding.html#xmlGetEncodingAlias"/>
    <keyword type="function" name="xmlGetExternalEntityLoader ()" link="libxml2-parser.html#xmlGetExternalEntityLoader"/>
    <keyword type="function" name="xmlGetFeature ()" link="libxml2-parser.html#xmlGetFeature"/>
    <keyword type="function" name="xmlGetFeaturesList ()" link="libxml2-parser.html#xmlGetFeaturesList"/>
    <keyword type="function" name="xmlGetGlobalState ()" link="libxml2-threads.html#xmlGetGlobalState"/>
    <keyword type="function" name="xmlGetID ()" link="libxml2-valid.html#xmlGetID"/>
    <keyword type="function" name="xmlGetIntSubset ()" link="libxml2-tree.html#xmlGetIntSubset"/>
    <keyword type="function" name="xmlGetLastChild ()" link="libxml2-tree.html#xmlGetLastChild"/>
    <keyword type="function" name="xmlGetLastError ()" link="libxml2-xmlerror.html#xmlGetLastError"/>
    <keyword type="function" name="xmlGetLineNo ()" link="libxml2-tree.html#xmlGetLineNo"/>
    <keyword type="function" name="xmlGetNoNsProp ()" link="libxml2-tree.html#xmlGetNoNsProp"/>
    <keyword type="function" name="xmlGetNodePath ()" link="libxml2-tree.html#xmlGetNodePath"/>
    <keyword type="function" name="xmlGetNsList ()" link="libxml2-tree.html#xmlGetNsList"/>
    <keyword type="function" name="xmlGetNsProp ()" link="libxml2-tree.html#xmlGetNsProp"/>
    <keyword type="function" name="xmlGetParameterEntity ()" link="libxml2-entities.html#xmlGetParameterEntity"/>
    <keyword type="function" name="xmlGetPredefinedEntity ()" link="libxml2-entities.html#xmlGetPredefinedEntity"/>
    <keyword type="function" name="xmlGetProp ()" link="libxml2-tree.html#xmlGetProp"/>
    <keyword type="function" name="xmlGetRefs ()" link="libxml2-valid.html#xmlGetRefs"/>
    <keyword type="function" name="xmlGetThreadId ()" link="libxml2-threads.html#xmlGetThreadId"/>
    <keyword type="function" name="xmlGetUTF8Char ()" link="libxml2-xmlstring.html#xmlGetUTF8Char"/>
    <keyword type="function" name="xmlHandleEntity ()" link="libxml2-parserInternals.html#xmlHandleEntity"/>
    <keyword type="function" name="xmlHasFeature ()" link="libxml2-parser.html#xmlHasFeature"/>
    <keyword type="function" name="xmlHasNsProp ()" link="libxml2-tree.html#xmlHasNsProp"/>
    <keyword type="function" name="xmlHasProp ()" link="libxml2-tree.html#xmlHasProp"/>
    <keyword type="function" name="xmlHashAddEntry ()" link="libxml2-hash.html#xmlHashAddEntry"/>
    <keyword type="function" name="xmlHashAddEntry2 ()" link="libxml2-hash.html#xmlHashAddEntry2"/>
    <keyword type="function" name="xmlHashAddEntry3 ()" link="libxml2-hash.html#xmlHashAddEntry3"/>
    <keyword type="function" name="xmlHashCopy ()" link="libxml2-hash.html#xmlHashCopy"/>
    <keyword type="function" name="xmlHashCreate ()" link="libxml2-hash.html#xmlHashCreate"/>
    <keyword type="function" name="xmlHashCreateDict ()" link="libxml2-hash.html#xmlHashCreateDict"/>
    <keyword type="function" name="xmlHashDefaultDeallocator ()" link="libxml2-hash.html#xmlHashDefaultDeallocator"/>
    <keyword type="function" name="xmlHashFree ()" link="libxml2-hash.html#xmlHashFree"/>
    <keyword type="function" name="xmlHashLookup ()" link="libxml2-hash.html#xmlHashLookup"/>
    <keyword type="function" name="xmlHashLookup2 ()" link="libxml2-hash.html#xmlHashLookup2"/>
    <keyword type="function" name="xmlHashLookup3 ()" link="libxml2-hash.html#xmlHashLookup3"/>
    <keyword type="function" name="xmlHashQLookup ()" link="libxml2-hash.html#xmlHashQLookup"/>
    <keyword type="function" name="xmlHashQLookup2 ()" link="libxml2-hash.html#xmlHashQLookup2"/>
    <keyword type="function" name="xmlHashQLookup3 ()" link="libxml2-hash.html#xmlHashQLookup3"/>
    <keyword type="function" name="xmlHashRemoveEntry ()" link="libxml2-hash.html#xmlHashRemoveEntry"/>
    <keyword type="function" name="xmlHashRemoveEntry2 ()" link="libxml2-hash.html#xmlHashRemoveEntry2"/>
    <keyword type="function" name="xmlHashRemoveEntry3 ()" link="libxml2-hash.html#xmlHashRemoveEntry3"/>
    <keyword type="function" name="xmlHashScan ()" link="libxml2-hash.html#xmlHashScan"/>
    <keyword type="function" name="xmlHashScan3 ()" link="libxml2-hash.html#xmlHashScan3"/>
    <keyword type="function" name="xmlHashScanFull ()" link="libxml2-hash.html#xmlHashScanFull"/>
    <keyword type="function" name="xmlHashScanFull3 ()" link="libxml2-hash.html#xmlHashScanFull3"/>
    <keyword type="function" name="xmlHashSize ()" link="libxml2-hash.html#xmlHashSize"/>
    <keyword type="function" name="xmlHashUpdateEntry ()" link="libxml2-hash.html#xmlHashUpdateEntry"/>
    <keyword type="function" name="xmlHashUpdateEntry2 ()" link="libxml2-hash.html#xmlHashUpdateEntry2"/>
    <keyword type="function" name="xmlHashUpdateEntry3 ()" link="libxml2-hash.html#xmlHashUpdateEntry3"/>
    <keyword type="function" name="xmlIOFTPClose ()" link="libxml2-xmlIO.html#xmlIOFTPClose"/>
    <keyword type="function" name="xmlIOFTPMatch ()" link="libxml2-xmlIO.html#xmlIOFTPMatch"/>
    <keyword type="function" name="xmlIOFTPOpen ()" link="libxml2-xmlIO.html#xmlIOFTPOpen"/>
    <keyword type="function" name="xmlIOFTPRead ()" link="libxml2-xmlIO.html#xmlIOFTPRead"/>
    <keyword type="function" name="xmlIOHTTPClose ()" link="libxml2-xmlIO.html#xmlIOHTTPClose"/>
    <keyword type="function" name="xmlIOHTTPMatch ()" link="libxml2-xmlIO.html#xmlIOHTTPMatch"/>
    <keyword type="function" name="xmlIOHTTPOpen ()" link="libxml2-xmlIO.html#xmlIOHTTPOpen"/>
    <keyword type="function" name="xmlIOHTTPOpenW ()" link="libxml2-xmlIO.html#xmlIOHTTPOpenW"/>
    <keyword type="function" name="xmlIOHTTPRead ()" link="libxml2-xmlIO.html#xmlIOHTTPRead"/>
    <keyword type="function" name="xmlIOParseDTD ()" link="libxml2-parser.html#xmlIOParseDTD"/>
    <keyword type="function" name="xmlInitCharEncodingHandlers ()" link="libxml2-encoding.html#xmlInitCharEncodingHandlers"/>
    <keyword type="function" name="xmlInitGlobals ()" link="libxml2-globals.html#xmlInitGlobals"/>
    <keyword type="function" name="xmlInitMemory ()" link="libxml2-xmlmemory.html#xmlInitMemory"/>
    <keyword type="function" name="xmlInitNodeInfoSeq ()" link="libxml2-parser.html#xmlInitNodeInfoSeq"/>
    <keyword type="function" name="xmlInitParser ()" link="libxml2-parser.html#xmlInitParser"/>
    <keyword type="function" name="xmlInitParserCtxt ()" link="libxml2-parser.html#xmlInitParserCtxt"/>
    <keyword type="function" name="xmlInitThreads ()" link="libxml2-threads.html#xmlInitThreads"/>
    <keyword type="function" name="xmlInitializeCatalog ()" link="libxml2-catalog.html#xmlInitializeCatalog"/>
    <keyword type="function" name="xmlInitializeDict ()" link="libxml2-dict.html#xmlInitializeDict"/>
    <keyword type="function" name="xmlInitializeGlobalState ()" link="libxml2-globals.html#xmlInitializeGlobalState"/>
    <keyword type="function" name="xmlInitializePredefinedEntities ()" link="libxml2-entities.html#xmlInitializePredefinedEntities"/>
    <keyword type="function" name="xmlIsBaseChar ()" link="libxml2-chvalid.html#xmlIsBaseChar"/>
    <keyword type="function" name="xmlIsBlank ()" link="libxml2-chvalid.html#xmlIsBlank"/>
    <keyword type="function" name="xmlIsBlankNode ()" link="libxml2-tree.html#xmlIsBlankNode"/>
    <keyword type="function" name="xmlIsChar ()" link="libxml2-chvalid.html#xmlIsChar"/>
    <keyword type="function" name="xmlIsCombining ()" link="libxml2-chvalid.html#xmlIsCombining"/>
    <keyword type="function" name="xmlIsDigit ()" link="libxml2-chvalid.html#xmlIsDigit"/>
    <keyword type="function" name="xmlIsExtender ()" link="libxml2-chvalid.html#xmlIsExtender"/>
    <keyword type="function" name="xmlIsID ()" link="libxml2-valid.html#xmlIsID"/>
    <keyword type="function" name="xmlIsIdeographic ()" link="libxml2-chvalid.html#xmlIsIdeographic"/>
    <keyword type="function" name="xmlIsLetter ()" link="libxml2-parserInternals.html#xmlIsLetter"/>
    <keyword type="function" name="xmlIsMainThread ()" link="libxml2-threads.html#xmlIsMainThread"/>
    <keyword type="function" name="xmlIsMixedElement ()" link="libxml2-valid.html#xmlIsMixedElement"/>
    <keyword type="function" name="xmlIsPubidChar ()" link="libxml2-chvalid.html#xmlIsPubidChar"/>
    <keyword type="function" name="xmlIsRef ()" link="libxml2-valid.html#xmlIsRef"/>
    <keyword type="function" name="xmlIsXHTML ()" link="libxml2-tree.html#xmlIsXHTML"/>
    <keyword type="function" name="xmlKeepBlanksDefault ()" link="libxml2-parser.html#xmlKeepBlanksDefault"/>
    <keyword type="function" name="xmlLastElementChild ()" link="libxml2-tree.html#xmlLastElementChild"/>
    <keyword type="function" name="xmlLineNumbersDefault ()" link="libxml2-parser.html#xmlLineNumbersDefault"/>
    <keyword type="function" name="xmlLinkGetData ()" link="libxml2-list.html#xmlLinkGetData"/>
    <keyword type="function" name="xmlListAppend ()" link="libxml2-list.html#xmlListAppend"/>
    <keyword type="function" name="xmlListClear ()" link="libxml2-list.html#xmlListClear"/>
    <keyword type="function" name="xmlListCopy ()" link="libxml2-list.html#xmlListCopy"/>
    <keyword type="function" name="xmlListCreate ()" link="libxml2-list.html#xmlListCreate"/>
    <keyword type="function" name="xmlListDelete ()" link="libxml2-list.html#xmlListDelete"/>
    <keyword type="function" name="xmlListDup ()" link="libxml2-list.html#xmlListDup"/>
    <keyword type="function" name="xmlListEmpty ()" link="libxml2-list.html#xmlListEmpty"/>
    <keyword type="function" name="xmlListEnd ()" link="libxml2-list.html#xmlListEnd"/>
    <keyword type="function" name="xmlListFront ()" link="libxml2-list.html#xmlListFront"/>
    <keyword type="function" name="xmlListInsert ()" link="libxml2-list.html#xmlListInsert"/>
    <keyword type="function" name="xmlListMerge ()" link="libxml2-list.html#xmlListMerge"/>
    <keyword type="function" name="xmlListPopBack ()" link="libxml2-list.html#xmlListPopBack"/>
    <keyword type="function" name="xmlListPopFront ()" link="libxml2-list.html#xmlListPopFront"/>
    <keyword type="function" name="xmlListPushBack ()" link="libxml2-list.html#xmlListPushBack"/>
    <keyword type="function" name="xmlListPushFront ()" link="libxml2-list.html#xmlListPushFront"/>
    <keyword type="function" name="xmlListRemoveAll ()" link="libxml2-list.html#xmlListRemoveAll"/>
    <keyword type="function" name="xmlListRemoveFirst ()" link="libxml2-list.html#xmlListRemoveFirst"/>
    <keyword type="function" name="xmlListRemoveLast ()" link="libxml2-list.html#xmlListRemoveLast"/>
    <keyword type="function" name="xmlListReverse ()" link="libxml2-list.html#xmlListReverse"/>
    <keyword type="function" name="xmlListReverseSearch ()" link="libxml2-list.html#xmlListReverseSearch"/>
    <keyword type="function" name="xmlListReverseWalk ()" link="libxml2-list.html#xmlListReverseWalk"/>
    <keyword type="function" name="xmlListSearch ()" link="libxml2-list.html#xmlListSearch"/>
    <keyword type="function" name="xmlListSize ()" link="libxml2-list.html#xmlListSize"/>
    <keyword type="function" name="xmlListSort ()" link="libxml2-list.html#xmlListSort"/>
    <keyword type="function" name="xmlListWalk ()" link="libxml2-list.html#xmlListWalk"/>
    <keyword type="function" name="xmlLoadACatalog ()" link="libxml2-catalog.html#xmlLoadACatalog"/>
    <keyword type="function" name="xmlLoadCatalog ()" link="libxml2-catalog.html#xmlLoadCatalog"/>
    <keyword type="function" name="xmlLoadCatalogs ()" link="libxml2-catalog.html#xmlLoadCatalogs"/>
    <keyword type="function" name="xmlLoadExternalEntity ()" link="libxml2-parser.html#xmlLoadExternalEntity"/>
    <keyword type="function" name="xmlLoadSGMLSuperCatalog ()" link="libxml2-catalog.html#xmlLoadSGMLSuperCatalog"/>
    <keyword type="function" name="xmlLockLibrary ()" link="libxml2-threads.html#xmlLockLibrary"/>
    <keyword type="function" name="xmlLsCountNode ()" link="libxml2-debugXML.html#xmlLsCountNode"/>
    <keyword type="function" name="xmlLsOneNode ()" link="libxml2-debugXML.html#xmlLsOneNode"/>
    <keyword type="function" name="xmlMallocAtomicLoc ()" link="libxml2-xmlmemory.html#xmlMallocAtomicLoc"/>
    <keyword type="function" name="xmlMallocLoc ()" link="libxml2-xmlmemory.html#xmlMallocLoc"/>
    <keyword type="function" name="xmlMemBlocks ()" link="libxml2-xmlmemory.html#xmlMemBlocks"/>
    <keyword type="function" name="xmlMemDisplay ()" link="libxml2-xmlmemory.html#xmlMemDisplay"/>
    <keyword type="function" name="xmlMemDisplayLast ()" link="libxml2-xmlmemory.html#xmlMemDisplayLast"/>
    <keyword type="function" name="xmlMemFree ()" link="libxml2-xmlmemory.html#xmlMemFree"/>
    <keyword type="function" name="xmlMemGet ()" link="libxml2-xmlmemory.html#xmlMemGet"/>
    <keyword type="function" name="xmlMemMalloc ()" link="libxml2-xmlmemory.html#xmlMemMalloc"/>
    <keyword type="function" name="xmlMemRealloc ()" link="libxml2-xmlmemory.html#xmlMemRealloc"/>
    <keyword type="function" name="xmlMemSetup ()" link="libxml2-xmlmemory.html#xmlMemSetup"/>
    <keyword type="function" name="xmlMemShow ()" link="libxml2-xmlmemory.html#xmlMemShow"/>
    <keyword type="function" name="xmlMemStrdupLoc ()" link="libxml2-xmlmemory.html#xmlMemStrdupLoc"/>
    <keyword type="function" name="xmlMemUsed ()" link="libxml2-xmlmemory.html#xmlMemUsed"/>
    <keyword type="function" name="xmlMemoryDump ()" link="libxml2-xmlmemory.html#xmlMemoryDump"/>
    <keyword type="function" name="xmlMemoryStrdup ()" link="libxml2-xmlmemory.html#xmlMemoryStrdup"/>
    <keyword type="function" name="xmlModuleClose ()" link="libxml2-xmlmodule.html#xmlModuleClose"/>
    <keyword type="function" name="xmlModuleFree ()" link="libxml2-xmlmodule.html#xmlModuleFree"/>
    <keyword type="function" name="xmlModuleOpen ()" link="libxml2-xmlmodule.html#xmlModuleOpen"/>
    <keyword type="function" name="xmlModuleSymbol ()" link="libxml2-xmlmodule.html#xmlModuleSymbol"/>
    <keyword type="function" name="xmlMutexLock ()" link="libxml2-threads.html#xmlMutexLock"/>
    <keyword type="function" name="xmlMutexUnlock ()" link="libxml2-threads.html#xmlMutexUnlock"/>
    <keyword type="function" name="xmlNamespaceParseNCName ()" link="libxml2-parserInternals.html#xmlNamespaceParseNCName"/>
    <keyword type="function" name="xmlNamespaceParseNSDef ()" link="libxml2-parserInternals.html#xmlNamespaceParseNSDef"/>
    <keyword type="function" name="xmlNamespaceParseQName ()" link="libxml2-parserInternals.html#xmlNamespaceParseQName"/>
    <keyword type="function" name="xmlNanoFTPCheckResponse ()" link="libxml2-nanoftp.html#xmlNanoFTPCheckResponse"/>
    <keyword type="function" name="xmlNanoFTPCleanup ()" link="libxml2-nanoftp.html#xmlNanoFTPCleanup"/>
    <keyword type="function" name="xmlNanoFTPClose ()" link="libxml2-nanoftp.html#xmlNanoFTPClose"/>
    <keyword type="function" name="xmlNanoFTPCloseConnection ()" link="libxml2-nanoftp.html#xmlNanoFTPCloseConnection"/>
    <keyword type="function" name="xmlNanoFTPConnect ()" link="libxml2-nanoftp.html#xmlNanoFTPConnect"/>
    <keyword type="function" name="xmlNanoFTPConnectTo ()" link="libxml2-nanoftp.html#xmlNanoFTPConnectTo"/>
    <keyword type="function" name="xmlNanoFTPCwd ()" link="libxml2-nanoftp.html#xmlNanoFTPCwd"/>
    <keyword type="function" name="xmlNanoFTPDele ()" link="libxml2-nanoftp.html#xmlNanoFTPDele"/>
    <keyword type="function" name="xmlNanoFTPFreeCtxt ()" link="libxml2-nanoftp.html#xmlNanoFTPFreeCtxt"/>
    <keyword type="function" name="xmlNanoFTPGet ()" link="libxml2-nanoftp.html#xmlNanoFTPGet"/>
    <keyword type="function" name="xmlNanoFTPGetConnection ()" link="libxml2-nanoftp.html#xmlNanoFTPGetConnection"/>
    <keyword type="function" name="xmlNanoFTPGetResponse ()" link="libxml2-nanoftp.html#xmlNanoFTPGetResponse"/>
    <keyword type="function" name="xmlNanoFTPGetSocket ()" link="libxml2-nanoftp.html#xmlNanoFTPGetSocket"/>
    <keyword type="function" name="xmlNanoFTPInit ()" link="libxml2-nanoftp.html#xmlNanoFTPInit"/>
    <keyword type="function" name="xmlNanoFTPList ()" link="libxml2-nanoftp.html#xmlNanoFTPList"/>
    <keyword type="function" name="xmlNanoFTPNewCtxt ()" link="libxml2-nanoftp.html#xmlNanoFTPNewCtxt"/>
    <keyword type="function" name="xmlNanoFTPOpen ()" link="libxml2-nanoftp.html#xmlNanoFTPOpen"/>
    <keyword type="function" name="xmlNanoFTPProxy ()" link="libxml2-nanoftp.html#xmlNanoFTPProxy"/>
    <keyword type="function" name="xmlNanoFTPQuit ()" link="libxml2-nanoftp.html#xmlNanoFTPQuit"/>
    <keyword type="function" name="xmlNanoFTPRead ()" link="libxml2-nanoftp.html#xmlNanoFTPRead"/>
    <keyword type="function" name="xmlNanoFTPScanProxy ()" link="libxml2-nanoftp.html#xmlNanoFTPScanProxy"/>
    <keyword type="function" name="xmlNanoFTPUpdateURL ()" link="libxml2-nanoftp.html#xmlNanoFTPUpdateURL"/>
    <keyword type="function" name="xmlNanoHTTPAuthHeader ()" link="libxml2-nanohttp.html#xmlNanoHTTPAuthHeader"/>
    <keyword type="function" name="xmlNanoHTTPCleanup ()" link="libxml2-nanohttp.html#xmlNanoHTTPCleanup"/>
    <keyword type="function" name="xmlNanoHTTPClose ()" link="libxml2-nanohttp.html#xmlNanoHTTPClose"/>
    <keyword type="function" name="xmlNanoHTTPContentLength ()" link="libxml2-nanohttp.html#xmlNanoHTTPContentLength"/>
    <keyword type="function" name="xmlNanoHTTPEncoding ()" link="libxml2-nanohttp.html#xmlNanoHTTPEncoding"/>
    <keyword type="function" name="xmlNanoHTTPFetch ()" link="libxml2-nanohttp.html#xmlNanoHTTPFetch"/>
    <keyword type="function" name="xmlNanoHTTPInit ()" link="libxml2-nanohttp.html#xmlNanoHTTPInit"/>
    <keyword type="function" name="xmlNanoHTTPMethod ()" link="libxml2-nanohttp.html#xmlNanoHTTPMethod"/>
    <keyword type="function" name="xmlNanoHTTPMethodRedir ()" link="libxml2-nanohttp.html#xmlNanoHTTPMethodRedir"/>
    <keyword type="function" name="xmlNanoHTTPMimeType ()" link="libxml2-nanohttp.html#xmlNanoHTTPMimeType"/>
    <keyword type="function" name="xmlNanoHTTPOpen ()" link="libxml2-nanohttp.html#xmlNanoHTTPOpen"/>
    <keyword type="function" name="xmlNanoHTTPOpenRedir ()" link="libxml2-nanohttp.html#xmlNanoHTTPOpenRedir"/>
    <keyword type="function" name="xmlNanoHTTPRead ()" link="libxml2-nanohttp.html#xmlNanoHTTPRead"/>
    <keyword type="function" name="xmlNanoHTTPRedir ()" link="libxml2-nanohttp.html#xmlNanoHTTPRedir"/>
    <keyword type="function" name="xmlNanoHTTPReturnCode ()" link="libxml2-nanohttp.html#xmlNanoHTTPReturnCode"/>
    <keyword type="function" name="xmlNanoHTTPSave ()" link="libxml2-nanohttp.html#xmlNanoHTTPSave"/>
    <keyword type="function" name="xmlNanoHTTPScanProxy ()" link="libxml2-nanohttp.html#xmlNanoHTTPScanProxy"/>
    <keyword type="function" name="xmlNewAutomata ()" link="libxml2-xmlautomata.html#xmlNewAutomata"/>
    <keyword type="function" name="xmlNewCDataBlock ()" link="libxml2-tree.html#xmlNewCDataBlock"/>
    <keyword type="function" name="xmlNewCatalog ()" link="libxml2-catalog.html#xmlNewCatalog"/>
    <keyword type="function" name="xmlNewCharEncodingHandler ()" link="libxml2-encoding.html#xmlNewCharEncodingHandler"/>
    <keyword type="function" name="xmlNewCharRef ()" link="libxml2-tree.html#xmlNewCharRef"/>
    <keyword type="function" name="xmlNewChild ()" link="libxml2-tree.html#xmlNewChild"/>
    <keyword type="function" name="xmlNewComment ()" link="libxml2-tree.html#xmlNewComment"/>
    <keyword type="function" name="xmlNewDoc ()" link="libxml2-tree.html#xmlNewDoc"/>
    <keyword type="function" name="xmlNewDocComment ()" link="libxml2-tree.html#xmlNewDocComment"/>
    <keyword type="function" name="xmlNewDocElementContent ()" link="libxml2-valid.html#xmlNewDocElementContent"/>
    <keyword type="function" name="xmlNewDocFragment ()" link="libxml2-tree.html#xmlNewDocFragment"/>
    <keyword type="function" name="xmlNewDocNode ()" link="libxml2-tree.html#xmlNewDocNode"/>
    <keyword type="function" name="xmlNewDocNodeEatName ()" link="libxml2-tree.html#xmlNewDocNodeEatName"/>
    <keyword type="function" name="xmlNewDocPI ()" link="libxml2-tree.html#xmlNewDocPI"/>
    <keyword type="function" name="xmlNewDocProp ()" link="libxml2-tree.html#xmlNewDocProp"/>
    <keyword type="function" name="xmlNewDocRawNode ()" link="libxml2-tree.html#xmlNewDocRawNode"/>
    <keyword type="function" name="xmlNewDocText ()" link="libxml2-tree.html#xmlNewDocText"/>
    <keyword type="function" name="xmlNewDocTextLen ()" link="libxml2-tree.html#xmlNewDocTextLen"/>
    <keyword type="function" name="xmlNewDtd ()" link="libxml2-tree.html#xmlNewDtd"/>
    <keyword type="function" name="xmlNewElementContent ()" link="libxml2-valid.html#xmlNewElementContent"/>
    <keyword type="function" name="xmlNewEntity ()" link="libxml2-entities.html#xmlNewEntity"/>
    <keyword type="function" name="xmlNewEntityInputStream ()" link="libxml2-parserInternals.html#xmlNewEntityInputStream"/>
    <keyword type="function" name="xmlNewGlobalNs ()" link="libxml2-tree.html#xmlNewGlobalNs"/>
    <keyword type="function" name="xmlNewIOInputStream ()" link="libxml2-parser.html#xmlNewIOInputStream"/>
    <keyword type="function" name="xmlNewInputFromFile ()" link="libxml2-parserInternals.html#xmlNewInputFromFile"/>
    <keyword type="function" name="xmlNewInputStream ()" link="libxml2-parserInternals.html#xmlNewInputStream"/>
    <keyword type="function" name="xmlNewMutex ()" link="libxml2-threads.html#xmlNewMutex"/>
    <keyword type="function" name="xmlNewNode ()" link="libxml2-tree.html#xmlNewNode"/>
    <keyword type="function" name="xmlNewNodeEatName ()" link="libxml2-tree.html#xmlNewNodeEatName"/>
    <keyword type="function" name="xmlNewNs ()" link="libxml2-tree.html#xmlNewNs"/>
    <keyword type="function" name="xmlNewNsProp ()" link="libxml2-tree.html#xmlNewNsProp"/>
    <keyword type="function" name="xmlNewNsPropEatName ()" link="libxml2-tree.html#xmlNewNsPropEatName"/>
    <keyword type="function" name="xmlNewPI ()" link="libxml2-tree.html#xmlNewPI"/>
    <keyword type="function" name="xmlNewParserCtxt ()" link="libxml2-parser.html#xmlNewParserCtxt"/>
    <keyword type="function" name="xmlNewProp ()" link="libxml2-tree.html#xmlNewProp"/>
    <keyword type="function" name="xmlNewRMutex ()" link="libxml2-threads.html#xmlNewRMutex"/>
    <keyword type="function" name="xmlNewReference ()" link="libxml2-tree.html#xmlNewReference"/>
    <keyword type="function" name="xmlNewStringInputStream ()" link="libxml2-parserInternals.html#xmlNewStringInputStream"/>
    <keyword type="function" name="xmlNewText ()" link="libxml2-tree.html#xmlNewText"/>
    <keyword type="function" name="xmlNewTextChild ()" link="libxml2-tree.html#xmlNewTextChild"/>
    <keyword type="function" name="xmlNewTextLen ()" link="libxml2-tree.html#xmlNewTextLen"/>
    <keyword type="function" name="xmlNewTextReader ()" link="libxml2-xmlreader.html#xmlNewTextReader"/>
    <keyword type="function" name="xmlNewTextReaderFilename ()" link="libxml2-xmlreader.html#xmlNewTextReaderFilename"/>
    <keyword type="function" name="xmlNewTextWriter ()" link="libxml2-xmlwriter.html#xmlNewTextWriter"/>
    <keyword type="function" name="xmlNewTextWriterDoc ()" link="libxml2-xmlwriter.html#xmlNewTextWriterDoc"/>
    <keyword type="function" name="xmlNewTextWriterFilename ()" link="libxml2-xmlwriter.html#xmlNewTextWriterFilename"/>
    <keyword type="function" name="xmlNewTextWriterMemory ()" link="libxml2-xmlwriter.html#xmlNewTextWriterMemory"/>
    <keyword type="function" name="xmlNewTextWriterPushParser ()" link="libxml2-xmlwriter.html#xmlNewTextWriterPushParser"/>
    <keyword type="function" name="xmlNewTextWriterTree ()" link="libxml2-xmlwriter.html#xmlNewTextWriterTree"/>
    <keyword type="function" name="xmlNewValidCtxt ()" link="libxml2-valid.html#xmlNewValidCtxt"/>
    <keyword type="function" name="xmlNextChar ()" link="libxml2-parserInternals.html#xmlNextChar"/>
    <keyword type="function" name="xmlNextElementSibling ()" link="libxml2-tree.html#xmlNextElementSibling"/>
    <keyword type="function" name="xmlNoNetExternalEntityLoader ()" link="libxml2-xmlIO.html#xmlNoNetExternalEntityLoader"/>
    <keyword type="function" name="xmlNodeAddContent ()" link="libxml2-tree.html#xmlNodeAddContent"/>
    <keyword type="function" name="xmlNodeAddContentLen ()" link="libxml2-tree.html#xmlNodeAddContentLen"/>
    <keyword type="function" name="xmlNodeBufGetContent ()" link="libxml2-tree.html#xmlNodeBufGetContent"/>
    <keyword type="function" name="xmlNodeDump ()" link="libxml2-tree.html#xmlNodeDump"/>
    <keyword type="function" name="xmlNodeDumpOutput ()" link="libxml2-tree.html#xmlNodeDumpOutput"/>
    <keyword type="function" name="xmlNodeGetBase ()" link="libxml2-tree.html#xmlNodeGetBase"/>
    <keyword type="function" name="xmlNodeGetContent ()" link="libxml2-tree.html#xmlNodeGetContent"/>
    <keyword type="function" name="xmlNodeGetLang ()" link="libxml2-tree.html#xmlNodeGetLang"/>
    <keyword type="function" name="xmlNodeGetSpacePreserve ()" link="libxml2-tree.html#xmlNodeGetSpacePreserve"/>
    <keyword type="function" name="xmlNodeIsText ()" link="libxml2-tree.html#xmlNodeIsText"/>
    <keyword type="function" name="xmlNodeListGetRawString ()" link="libxml2-tree.html#xmlNodeListGetRawString"/>
    <keyword type="function" name="xmlNodeListGetString ()" link="libxml2-tree.html#xmlNodeListGetString"/>
    <keyword type="function" name="xmlNodeSetBase ()" link="libxml2-tree.html#xmlNodeSetBase"/>
    <keyword type="function" name="xmlNodeSetContent ()" link="libxml2-tree.html#xmlNodeSetContent"/>
    <keyword type="function" name="xmlNodeSetContentLen ()" link="libxml2-tree.html#xmlNodeSetContentLen"/>
    <keyword type="function" name="xmlNodeSetLang ()" link="libxml2-tree.html#xmlNodeSetLang"/>
    <keyword type="function" name="xmlNodeSetName ()" link="libxml2-tree.html#xmlNodeSetName"/>
    <keyword type="function" name="xmlNodeSetSpacePreserve ()" link="libxml2-tree.html#xmlNodeSetSpacePreserve"/>
    <keyword type="function" name="xmlNormalizeURIPath ()" link="libxml2-uri.html#xmlNormalizeURIPath"/>
    <keyword type="function" name="xmlNormalizeWindowsPath ()" link="libxml2-xmlIO.html#xmlNormalizeWindowsPath"/>
    <keyword type="function" name="xmlOutputBufferClose ()" link="libxml2-xmlIO.html#xmlOutputBufferClose"/>
    <keyword type="function" name="xmlOutputBufferCreateBuffer ()" link="libxml2-xmlIO.html#xmlOutputBufferCreateBuffer"/>
    <keyword type="function" name="xmlOutputBufferCreateFd ()" link="libxml2-xmlIO.html#xmlOutputBufferCreateFd"/>
    <keyword type="function" name="xmlOutputBufferCreateFile ()" link="libxml2-xmlIO.html#xmlOutputBufferCreateFile"/>
    <keyword type="function" name="xmlOutputBufferCreateFilename ()" link="libxml2-xmlIO.html#xmlOutputBufferCreateFilename"/>
    <keyword type="function" name="xmlOutputBufferCreateFilenameDefault ()" link="libxml2-globals.html#xmlOutputBufferCreateFilenameDefault"/>
    <keyword type="function" name="xmlOutputBufferCreateIO ()" link="libxml2-xmlIO.html#xmlOutputBufferCreateIO"/>
    <keyword type="function" name="xmlOutputBufferFlush ()" link="libxml2-xmlIO.html#xmlOutputBufferFlush"/>
    <keyword type="function" name="xmlOutputBufferGetContent ()" link="libxml2-xmlIO.html#xmlOutputBufferGetContent"/>
    <keyword type="function" name="xmlOutputBufferGetSize ()" link="libxml2-xmlIO.html#xmlOutputBufferGetSize"/>
    <keyword type="function" name="xmlOutputBufferWrite ()" link="libxml2-xmlIO.html#xmlOutputBufferWrite"/>
    <keyword type="function" name="xmlOutputBufferWriteEscape ()" link="libxml2-xmlIO.html#xmlOutputBufferWriteEscape"/>
    <keyword type="function" name="xmlOutputBufferWriteString ()" link="libxml2-xmlIO.html#xmlOutputBufferWriteString"/>
    <keyword type="function" name="xmlParseAttValue ()" link="libxml2-parserInternals.html#xmlParseAttValue"/>
    <keyword type="function" name="xmlParseAttribute ()" link="libxml2-parserInternals.html#xmlParseAttribute"/>
    <keyword type="function" name="xmlParseAttributeListDecl ()" link="libxml2-parserInternals.html#xmlParseAttributeListDecl"/>
    <keyword type="function" name="xmlParseAttributeType ()" link="libxml2-parserInternals.html#xmlParseAttributeType"/>
    <keyword type="function" name="xmlParseBalancedChunkMemory ()" link="libxml2-parser.html#xmlParseBalancedChunkMemory"/>
    <keyword type="function" name="xmlParseBalancedChunkMemoryRecover ()" link="libxml2-parser.html#xmlParseBalancedChunkMemoryRecover"/>
    <keyword type="function" name="xmlParseCDSect ()" link="libxml2-parserInternals.html#xmlParseCDSect"/>
    <keyword type="function" name="xmlParseCatalogFile ()" link="libxml2-catalog.html#xmlParseCatalogFile"/>
    <keyword type="function" name="xmlParseCharData ()" link="libxml2-parserInternals.html#xmlParseCharData"/>
    <keyword type="function" name="xmlParseCharEncoding ()" link="libxml2-encoding.html#xmlParseCharEncoding"/>
    <keyword type="function" name="xmlParseCharRef ()" link="libxml2-parserInternals.html#xmlParseCharRef"/>
    <keyword type="function" name="xmlParseChunk ()" link="libxml2-parser.html#xmlParseChunk"/>
    <keyword type="function" name="xmlParseComment ()" link="libxml2-parserInternals.html#xmlParseComment"/>
    <keyword type="function" name="xmlParseContent ()" link="libxml2-parserInternals.html#xmlParseContent"/>
    <keyword type="function" name="xmlParseCtxtExternalEntity ()" link="libxml2-parser.html#xmlParseCtxtExternalEntity"/>
    <keyword type="function" name="xmlParseDTD ()" link="libxml2-parser.html#xmlParseDTD"/>
    <keyword type="function" name="xmlParseDefaultDecl ()" link="libxml2-parserInternals.html#xmlParseDefaultDecl"/>
    <keyword type="function" name="xmlParseDoc ()" link="libxml2-parser.html#xmlParseDoc"/>
    <keyword type="function" name="xmlParseDocTypeDecl ()" link="libxml2-parserInternals.html#xmlParseDocTypeDecl"/>
    <keyword type="function" name="xmlParseDocument ()" link="libxml2-parser.html#xmlParseDocument"/>
    <keyword type="function" name="xmlParseElement ()" link="libxml2-parserInternals.html#xmlParseElement"/>
    <keyword type="function" name="xmlParseElementChildrenContentDecl ()" link="libxml2-parserInternals.html#xmlParseElementChildrenContentDecl"/>
    <keyword type="function" name="xmlParseElementContentDecl ()" link="libxml2-parserInternals.html#xmlParseElementContentDecl"/>
    <keyword type="function" name="xmlParseElementDecl ()" link="libxml2-parserInternals.html#xmlParseElementDecl"/>
    <keyword type="function" name="xmlParseElementMixedContentDecl ()" link="libxml2-parserInternals.html#xmlParseElementMixedContentDecl"/>
    <keyword type="function" name="xmlParseEncName ()" link="libxml2-parserInternals.html#xmlParseEncName"/>
    <keyword type="function" name="xmlParseEncodingDecl ()" link="libxml2-parserInternals.html#xmlParseEncodingDecl"/>
    <keyword type="function" name="xmlParseEndTag ()" link="libxml2-parserInternals.html#xmlParseEndTag"/>
    <keyword type="function" name="xmlParseEntity ()" link="libxml2-parser.html#xmlParseEntity"/>
    <keyword type="function" name="xmlParseEntityDecl ()" link="libxml2-parserInternals.html#xmlParseEntityDecl"/>
    <keyword type="function" name="xmlParseEntityRef ()" link="libxml2-parserInternals.html#xmlParseEntityRef"/>
    <keyword type="function" name="xmlParseEntityValue ()" link="libxml2-parserInternals.html#xmlParseEntityValue"/>
    <keyword type="function" name="xmlParseEnumeratedType ()" link="libxml2-parserInternals.html#xmlParseEnumeratedType"/>
    <keyword type="function" name="xmlParseEnumerationType ()" link="libxml2-parserInternals.html#xmlParseEnumerationType"/>
    <keyword type="function" name="xmlParseExtParsedEnt ()" link="libxml2-parser.html#xmlParseExtParsedEnt"/>
    <keyword type="function" name="xmlParseExternalEntity ()" link="libxml2-parser.html#xmlParseExternalEntity"/>
    <keyword type="function" name="xmlParseExternalID ()" link="libxml2-parserInternals.html#xmlParseExternalID"/>
    <keyword type="function" name="xmlParseExternalSubset ()" link="libxml2-parserInternals.html#xmlParseExternalSubset"/>
    <keyword type="function" name="xmlParseFile ()" link="libxml2-parser.html#xmlParseFile"/>
    <keyword type="function" name="xmlParseInNodeContext ()" link="libxml2-parser.html#xmlParseInNodeContext"/>
    <keyword type="function" name="xmlParseMarkupDecl ()" link="libxml2-parserInternals.html#xmlParseMarkupDecl"/>
    <keyword type="function" name="xmlParseMemory ()" link="libxml2-parser.html#xmlParseMemory"/>
    <keyword type="function" name="xmlParseMisc ()" link="libxml2-parserInternals.html#xmlParseMisc"/>
    <keyword type="function" name="xmlParseName ()" link="libxml2-parserInternals.html#xmlParseName"/>
    <keyword type="function" name="xmlParseNamespace ()" link="libxml2-parserInternals.html#xmlParseNamespace"/>
    <keyword type="function" name="xmlParseNmtoken ()" link="libxml2-parserInternals.html#xmlParseNmtoken"/>
    <keyword type="function" name="xmlParseNotationDecl ()" link="libxml2-parserInternals.html#xmlParseNotationDecl"/>
    <keyword type="function" name="xmlParseNotationType ()" link="libxml2-parserInternals.html#xmlParseNotationType"/>
    <keyword type="function" name="xmlParsePEReference ()" link="libxml2-parserInternals.html#xmlParsePEReference"/>
    <keyword type="function" name="xmlParsePI ()" link="libxml2-parserInternals.html#xmlParsePI"/>
    <keyword type="function" name="xmlParsePITarget ()" link="libxml2-parserInternals.html#xmlParsePITarget"/>
    <keyword type="function" name="xmlParsePubidLiteral ()" link="libxml2-parserInternals.html#xmlParsePubidLiteral"/>
    <keyword type="function" name="xmlParseQuotedString ()" link="libxml2-parserInternals.html#xmlParseQuotedString"/>
    <keyword type="function" name="xmlParseReference ()" link="libxml2-parserInternals.html#xmlParseReference"/>
    <keyword type="function" name="xmlParseSDDecl ()" link="libxml2-parserInternals.html#xmlParseSDDecl"/>
    <keyword type="function" name="xmlParseStartTag ()" link="libxml2-parserInternals.html#xmlParseStartTag"/>
    <keyword type="function" name="xmlParseSystemLiteral ()" link="libxml2-parserInternals.html#xmlParseSystemLiteral"/>
    <keyword type="function" name="xmlParseTextDecl ()" link="libxml2-parserInternals.html#xmlParseTextDecl"/>
    <keyword type="function" name="xmlParseURI ()" link="libxml2-uri.html#xmlParseURI"/>
    <keyword type="function" name="xmlParseURIRaw ()" link="libxml2-uri.html#xmlParseURIRaw"/>
    <keyword type="function" name="xmlParseURIReference ()" link="libxml2-uri.html#xmlParseURIReference"/>
    <keyword type="function" name="xmlParseVersionInfo ()" link="libxml2-parserInternals.html#xmlParseVersionInfo"/>
    <keyword type="function" name="xmlParseVersionNum ()" link="libxml2-parserInternals.html#xmlParseVersionNum"/>
    <keyword type="function" name="xmlParseXMLDecl ()" link="libxml2-parserInternals.html#xmlParseXMLDecl"/>
    <keyword type="function" name="xmlParserAddNodeInfo ()" link="libxml2-parser.html#xmlParserAddNodeInfo"/>
    <keyword type="function" name="xmlParserError ()" link="libxml2-xmlerror.html#xmlParserError"/>
    <keyword type="function" name="xmlParserFindNodeInfo ()" link="libxml2-parser.html#xmlParserFindNodeInfo"/>
    <keyword type="function" name="xmlParserFindNodeInfoIndex ()" link="libxml2-parser.html#xmlParserFindNodeInfoIndex"/>
    <keyword type="function" name="xmlParserGetDirectory ()" link="libxml2-xmlIO.html#xmlParserGetDirectory"/>
    <keyword type="function" name="xmlParserHandlePEReference ()" link="libxml2-parserInternals.html#xmlParserHandlePEReference"/>
    <keyword type="function" name="xmlParserHandleReference ()" link="libxml2-parserInternals.html#xmlParserHandleReference"/>
    <keyword type="function" name="xmlParserInputBufferCreateFd ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateFd"/>
    <keyword type="function" name="xmlParserInputBufferCreateFile ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateFile"/>
    <keyword type="function" name="xmlParserInputBufferCreateFilename ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateFilename"/>
    <keyword type="function" name="xmlParserInputBufferCreateFilenameDefault ()" link="libxml2-globals.html#xmlParserInputBufferCreateFilenameDefault"/>
    <keyword type="function" name="xmlParserInputBufferCreateIO ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateIO"/>
    <keyword type="function" name="xmlParserInputBufferCreateMem ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateMem"/>
    <keyword type="function" name="xmlParserInputBufferCreateStatic ()" link="libxml2-xmlIO.html#xmlParserInputBufferCreateStatic"/>
    <keyword type="function" name="xmlParserInputBufferGrow ()" link="libxml2-xmlIO.html#xmlParserInputBufferGrow"/>
    <keyword type="function" name="xmlParserInputBufferPush ()" link="libxml2-xmlIO.html#xmlParserInputBufferPush"/>
    <keyword type="function" name="xmlParserInputBufferRead ()" link="libxml2-xmlIO.html#xmlParserInputBufferRead"/>
    <keyword type="function" name="xmlParserInputGrow ()" link="libxml2-parser.html#xmlParserInputGrow"/>
    <keyword type="function" name="xmlParserInputRead ()" link="libxml2-parser.html#xmlParserInputRead"/>
    <keyword type="function" name="xmlParserInputShrink ()" link="libxml2-parserInternals.html#xmlParserInputShrink"/>
    <keyword type="function" name="xmlParserPrintFileContext ()" link="libxml2-xmlerror.html#xmlParserPrintFileContext"/>
    <keyword type="function" name="xmlParserPrintFileInfo ()" link="libxml2-xmlerror.html#xmlParserPrintFileInfo"/>
    <keyword type="function" name="xmlParserValidityError ()" link="libxml2-xmlerror.html#xmlParserValidityError"/>
    <keyword type="function" name="xmlParserValidityWarning ()" link="libxml2-xmlerror.html#xmlParserValidityWarning"/>
    <keyword type="function" name="xmlParserWarning ()" link="libxml2-xmlerror.html#xmlParserWarning"/>
    <keyword type="function" name="xmlPathToURI ()" link="libxml2-uri.html#xmlPathToURI"/>
    <keyword type="function" name="xmlPatternFromRoot ()" link="libxml2-pattern.html#xmlPatternFromRoot"/>
    <keyword type="function" name="xmlPatternGetStreamCtxt ()" link="libxml2-pattern.html#xmlPatternGetStreamCtxt"/>
    <keyword type="function" name="xmlPatternMatch ()" link="libxml2-pattern.html#xmlPatternMatch"/>
    <keyword type="function" name="xmlPatternMaxDepth ()" link="libxml2-pattern.html#xmlPatternMaxDepth"/>
    <keyword type="function" name="xmlPatternMinDepth ()" link="libxml2-pattern.html#xmlPatternMinDepth"/>
    <keyword type="function" name="xmlPatternStreamable ()" link="libxml2-pattern.html#xmlPatternStreamable"/>
    <keyword type="function" name="xmlPatterncompile ()" link="libxml2-pattern.html#xmlPatterncompile"/>
    <keyword type="function" name="xmlPedanticParserDefault ()" link="libxml2-parser.html#xmlPedanticParserDefault"/>
    <keyword type="function" name="xmlPopInput ()" link="libxml2-parserInternals.html#xmlPopInput"/>
    <keyword type="function" name="xmlPopInputCallbacks ()" link="libxml2-xmlIO.html#xmlPopInputCallbacks"/>
    <keyword type="function" name="xmlPopOutputCallbacks ()" link="libxml2-xmlIO.html#xmlPopOutputCallbacks"/>
    <keyword type="function" name="xmlPreviousElementSibling ()" link="libxml2-tree.html#xmlPreviousElementSibling"/>
    <keyword type="function" name="xmlPrintURI ()" link="libxml2-uri.html#xmlPrintURI"/>
    <keyword type="function" name="xmlPushInput ()" link="libxml2-parserInternals.html#xmlPushInput"/>
    <keyword type="function" name="xmlRMutexLock ()" link="libxml2-threads.html#xmlRMutexLock"/>
    <keyword type="function" name="xmlRMutexUnlock ()" link="libxml2-threads.html#xmlRMutexUnlock"/>
    <keyword type="function" name="xmlReadDoc ()" link="libxml2-parser.html#xmlReadDoc"/>
    <keyword type="function" name="xmlReadFd ()" link="libxml2-parser.html#xmlReadFd"/>
    <keyword type="function" name="xmlReadFile ()" link="libxml2-parser.html#xmlReadFile"/>
    <keyword type="function" name="xmlReadIO ()" link="libxml2-parser.html#xmlReadIO"/>
    <keyword type="function" name="xmlReadMemory ()" link="libxml2-parser.html#xmlReadMemory"/>
    <keyword type="function" name="xmlReaderForDoc ()" link="libxml2-xmlreader.html#xmlReaderForDoc"/>
    <keyword type="function" name="xmlReaderForFd ()" link="libxml2-xmlreader.html#xmlReaderForFd"/>
    <keyword type="function" name="xmlReaderForFile ()" link="libxml2-xmlreader.html#xmlReaderForFile"/>
    <keyword type="function" name="xmlReaderForIO ()" link="libxml2-xmlreader.html#xmlReaderForIO"/>
    <keyword type="function" name="xmlReaderForMemory ()" link="libxml2-xmlreader.html#xmlReaderForMemory"/>
    <keyword type="function" name="xmlReaderNewDoc ()" link="libxml2-xmlreader.html#xmlReaderNewDoc"/>
    <keyword type="function" name="xmlReaderNewFd ()" link="libxml2-xmlreader.html#xmlReaderNewFd"/>
    <keyword type="function" name="xmlReaderNewFile ()" link="libxml2-xmlreader.html#xmlReaderNewFile"/>
    <keyword type="function" name="xmlReaderNewIO ()" link="libxml2-xmlreader.html#xmlReaderNewIO"/>
    <keyword type="function" name="xmlReaderNewMemory ()" link="libxml2-xmlreader.html#xmlReaderNewMemory"/>
    <keyword type="function" name="xmlReaderNewWalker ()" link="libxml2-xmlreader.html#xmlReaderNewWalker"/>
    <keyword type="function" name="xmlReaderWalker ()" link="libxml2-xmlreader.html#xmlReaderWalker"/>
    <keyword type="function" name="xmlReallocLoc ()" link="libxml2-xmlmemory.html#xmlReallocLoc"/>
    <keyword type="function" name="xmlReconciliateNs ()" link="libxml2-tree.html#xmlReconciliateNs"/>
    <keyword type="function" name="xmlRecoverDoc ()" link="libxml2-parser.html#xmlRecoverDoc"/>
    <keyword type="function" name="xmlRecoverFile ()" link="libxml2-parser.html#xmlRecoverFile"/>
    <keyword type="function" name="xmlRecoverMemory ()" link="libxml2-parser.html#xmlRecoverMemory"/>
    <keyword type="function" name="xmlRegExecErrInfo ()" link="libxml2-xmlregexp.html#xmlRegExecErrInfo"/>
    <keyword type="function" name="xmlRegExecNextValues ()" link="libxml2-xmlregexp.html#xmlRegExecNextValues"/>
    <keyword type="function" name="xmlRegExecPushString ()" link="libxml2-xmlregexp.html#xmlRegExecPushString"/>
    <keyword type="function" name="xmlRegExecPushString2 ()" link="libxml2-xmlregexp.html#xmlRegExecPushString2"/>
    <keyword type="function" name="xmlRegFreeExecCtxt ()" link="libxml2-xmlregexp.html#xmlRegFreeExecCtxt"/>
    <keyword type="function" name="xmlRegFreeRegexp ()" link="libxml2-xmlregexp.html#xmlRegFreeRegexp"/>
    <keyword type="function" name="xmlRegNewExecCtxt ()" link="libxml2-xmlregexp.html#xmlRegNewExecCtxt"/>
    <keyword type="function" name="xmlRegexpCompile ()" link="libxml2-xmlregexp.html#xmlRegexpCompile"/>
    <keyword type="function" name="xmlRegexpExec ()" link="libxml2-xmlregexp.html#xmlRegexpExec"/>
    <keyword type="function" name="xmlRegexpIsDeterminist ()" link="libxml2-xmlregexp.html#xmlRegexpIsDeterminist"/>
    <keyword type="function" name="xmlRegexpPrint ()" link="libxml2-xmlregexp.html#xmlRegexpPrint"/>
    <keyword type="function" name="xmlRegisterCharEncodingHandler ()" link="libxml2-encoding.html#xmlRegisterCharEncodingHandler"/>
    <keyword type="function" name="xmlRegisterDefaultInputCallbacks ()" link="libxml2-xmlIO.html#xmlRegisterDefaultInputCallbacks"/>
    <keyword type="function" name="xmlRegisterDefaultOutputCallbacks ()" link="libxml2-xmlIO.html#xmlRegisterDefaultOutputCallbacks"/>
    <keyword type="function" name="xmlRegisterHTTPPostCallbacks ()" link="libxml2-xmlIO.html#xmlRegisterHTTPPostCallbacks"/>
    <keyword type="function" name="xmlRegisterInputCallbacks ()" link="libxml2-xmlIO.html#xmlRegisterInputCallbacks"/>
    <keyword type="function" name="xmlRegisterNodeDefault ()" link="libxml2-globals.html#xmlRegisterNodeDefault"/>
    <keyword type="function" name="xmlRegisterOutputCallbacks ()" link="libxml2-xmlIO.html#xmlRegisterOutputCallbacks"/>
    <keyword type="function" name="xmlRelaxNGCleanupTypes ()" link="libxml2-relaxng.html#xmlRelaxNGCleanupTypes"/>
    <keyword type="function" name="xmlRelaxNGDump ()" link="libxml2-relaxng.html#xmlRelaxNGDump"/>
    <keyword type="function" name="xmlRelaxNGDumpTree ()" link="libxml2-relaxng.html#xmlRelaxNGDumpTree"/>
    <keyword type="function" name="xmlRelaxNGFree ()" link="libxml2-relaxng.html#xmlRelaxNGFree"/>
    <keyword type="function" name="xmlRelaxNGFreeParserCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGFreeParserCtxt"/>
    <keyword type="function" name="xmlRelaxNGFreeValidCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGFreeValidCtxt"/>
    <keyword type="function" name="xmlRelaxNGGetParserErrors ()" link="libxml2-relaxng.html#xmlRelaxNGGetParserErrors"/>
    <keyword type="function" name="xmlRelaxNGGetValidErrors ()" link="libxml2-relaxng.html#xmlRelaxNGGetValidErrors"/>
    <keyword type="function" name="xmlRelaxNGInitTypes ()" link="libxml2-relaxng.html#xmlRelaxNGInitTypes"/>
    <keyword type="function" name="xmlRelaxNGNewDocParserCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGNewDocParserCtxt"/>
    <keyword type="function" name="xmlRelaxNGNewMemParserCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGNewMemParserCtxt"/>
    <keyword type="function" name="xmlRelaxNGNewParserCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGNewParserCtxt"/>
    <keyword type="function" name="xmlRelaxNGNewValidCtxt ()" link="libxml2-relaxng.html#xmlRelaxNGNewValidCtxt"/>
    <keyword type="function" name="xmlRelaxNGParse ()" link="libxml2-relaxng.html#xmlRelaxNGParse"/>
    <keyword type="function" name="xmlRelaxNGSetParserErrors ()" link="libxml2-relaxng.html#xmlRelaxNGSetParserErrors"/>
    <keyword type="function" name="xmlRelaxNGSetParserStructuredErrors ()" link="libxml2-relaxng.html#xmlRelaxNGSetParserStructuredErrors"/>
    <keyword type="function" name="xmlRelaxNGSetValidErrors ()" link="libxml2-relaxng.html#xmlRelaxNGSetValidErrors"/>
    <keyword type="function" name="xmlRelaxNGSetValidStructuredErrors ()" link="libxml2-relaxng.html#xmlRelaxNGSetValidStructuredErrors"/>
    <keyword type="function" name="xmlRelaxNGValidateDoc ()" link="libxml2-relaxng.html#xmlRelaxNGValidateDoc"/>
    <keyword type="function" name="xmlRelaxNGValidateFullElement ()" link="libxml2-relaxng.html#xmlRelaxNGValidateFullElement"/>
    <keyword type="function" name="xmlRelaxNGValidatePopElement ()" link="libxml2-relaxng.html#xmlRelaxNGValidatePopElement"/>
    <keyword type="function" name="xmlRelaxNGValidatePushCData ()" link="libxml2-relaxng.html#xmlRelaxNGValidatePushCData"/>
    <keyword type="function" name="xmlRelaxNGValidatePushElement ()" link="libxml2-relaxng.html#xmlRelaxNGValidatePushElement"/>
    <keyword type="function" name="xmlRelaxParserSetFlag ()" link="libxml2-relaxng.html#xmlRelaxParserSetFlag"/>
    <keyword type="function" name="xmlRemoveID ()" link="libxml2-valid.html#xmlRemoveID"/>
    <keyword type="function" name="xmlRemoveProp ()" link="libxml2-tree.html#xmlRemoveProp"/>
    <keyword type="function" name="xmlRemoveRef ()" link="libxml2-valid.html#xmlRemoveRef"/>
    <keyword type="function" name="xmlReplaceNode ()" link="libxml2-tree.html#xmlReplaceNode"/>
    <keyword type="function" name="xmlResetError ()" link="libxml2-xmlerror.html#xmlResetError"/>
    <keyword type="function" name="xmlResetLastError ()" link="libxml2-xmlerror.html#xmlResetLastError"/>
    <keyword type="function" name="xmlSAX2AttributeDecl ()" link="libxml2-SAX2.html#xmlSAX2AttributeDecl"/>
    <keyword type="function" name="xmlSAX2CDataBlock ()" link="libxml2-SAX2.html#xmlSAX2CDataBlock"/>
    <keyword type="function" name="xmlSAX2Characters ()" link="libxml2-SAX2.html#xmlSAX2Characters"/>
    <keyword type="function" name="xmlSAX2Comment ()" link="libxml2-SAX2.html#xmlSAX2Comment"/>
    <keyword type="function" name="xmlSAX2ElementDecl ()" link="libxml2-SAX2.html#xmlSAX2ElementDecl"/>
    <keyword type="function" name="xmlSAX2EndDocument ()" link="libxml2-SAX2.html#xmlSAX2EndDocument"/>
    <keyword type="function" name="xmlSAX2EndElement ()" link="libxml2-SAX2.html#xmlSAX2EndElement"/>
    <keyword type="function" name="xmlSAX2EndElementNs ()" link="libxml2-SAX2.html#xmlSAX2EndElementNs"/>
    <keyword type="function" name="xmlSAX2EntityDecl ()" link="libxml2-SAX2.html#xmlSAX2EntityDecl"/>
    <keyword type="function" name="xmlSAX2ExternalSubset ()" link="libxml2-SAX2.html#xmlSAX2ExternalSubset"/>
    <keyword type="function" name="xmlSAX2GetColumnNumber ()" link="libxml2-SAX2.html#xmlSAX2GetColumnNumber"/>
    <keyword type="function" name="xmlSAX2GetEntity ()" link="libxml2-SAX2.html#xmlSAX2GetEntity"/>
    <keyword type="function" name="xmlSAX2GetLineNumber ()" link="libxml2-SAX2.html#xmlSAX2GetLineNumber"/>
    <keyword type="function" name="xmlSAX2GetParameterEntity ()" link="libxml2-SAX2.html#xmlSAX2GetParameterEntity"/>
    <keyword type="function" name="xmlSAX2GetPublicId ()" link="libxml2-SAX2.html#xmlSAX2GetPublicId"/>
    <keyword type="function" name="xmlSAX2GetSystemId ()" link="libxml2-SAX2.html#xmlSAX2GetSystemId"/>
    <keyword type="function" name="xmlSAX2HasExternalSubset ()" link="libxml2-SAX2.html#xmlSAX2HasExternalSubset"/>
    <keyword type="function" name="xmlSAX2HasInternalSubset ()" link="libxml2-SAX2.html#xmlSAX2HasInternalSubset"/>
    <keyword type="function" name="xmlSAX2IgnorableWhitespace ()" link="libxml2-SAX2.html#xmlSAX2IgnorableWhitespace"/>
    <keyword type="function" name="xmlSAX2InitDefaultSAXHandler ()" link="libxml2-SAX2.html#xmlSAX2InitDefaultSAXHandler"/>
    <keyword type="function" name="xmlSAX2InitHtmlDefaultSAXHandler ()" link="libxml2-SAX2.html#xmlSAX2InitHtmlDefaultSAXHandler"/>
    <keyword type="function" name="xmlSAX2InternalSubset ()" link="libxml2-SAX2.html#xmlSAX2InternalSubset"/>
    <keyword type="function" name="xmlSAX2IsStandalone ()" link="libxml2-SAX2.html#xmlSAX2IsStandalone"/>
    <keyword type="function" name="xmlSAX2NotationDecl ()" link="libxml2-SAX2.html#xmlSAX2NotationDecl"/>
    <keyword type="function" name="xmlSAX2ProcessingInstruction ()" link="libxml2-SAX2.html#xmlSAX2ProcessingInstruction"/>
    <keyword type="function" name="xmlSAX2Reference ()" link="libxml2-SAX2.html#xmlSAX2Reference"/>
    <keyword type="function" name="xmlSAX2ResolveEntity ()" link="libxml2-SAX2.html#xmlSAX2ResolveEntity"/>
    <keyword type="function" name="xmlSAX2SetDocumentLocator ()" link="libxml2-SAX2.html#xmlSAX2SetDocumentLocator"/>
    <keyword type="function" name="xmlSAX2StartDocument ()" link="libxml2-SAX2.html#xmlSAX2StartDocument"/>
    <keyword type="function" name="xmlSAX2StartElement ()" link="libxml2-SAX2.html#xmlSAX2StartElement"/>
    <keyword type="function" name="xmlSAX2StartElementNs ()" link="libxml2-SAX2.html#xmlSAX2StartElementNs"/>
    <keyword type="function" name="xmlSAX2UnparsedEntityDecl ()" link="libxml2-SAX2.html#xmlSAX2UnparsedEntityDecl"/>
    <keyword type="function" name="xmlSAXDefaultVersion ()" link="libxml2-SAX2.html#xmlSAXDefaultVersion"/>
    <keyword type="function" name="xmlSAXParseDTD ()" link="libxml2-parser.html#xmlSAXParseDTD"/>
    <keyword type="function" name="xmlSAXParseDoc ()" link="libxml2-parser.html#xmlSAXParseDoc"/>
    <keyword type="function" name="xmlSAXParseEntity ()" link="libxml2-parser.html#xmlSAXParseEntity"/>
    <keyword type="function" name="xmlSAXParseFile ()" link="libxml2-parser.html#xmlSAXParseFile"/>
    <keyword type="function" name="xmlSAXParseFileWithData ()" link="libxml2-parser.html#xmlSAXParseFileWithData"/>
    <keyword type="function" name="xmlSAXParseMemory ()" link="libxml2-parser.html#xmlSAXParseMemory"/>
    <keyword type="function" name="xmlSAXParseMemoryWithData ()" link="libxml2-parser.html#xmlSAXParseMemoryWithData"/>
    <keyword type="function" name="xmlSAXUserParseFile ()" link="libxml2-parser.html#xmlSAXUserParseFile"/>
    <keyword type="function" name="xmlSAXUserParseMemory ()" link="libxml2-parser.html#xmlSAXUserParseMemory"/>
    <keyword type="function" name="xmlSAXVersion ()" link="libxml2-SAX2.html#xmlSAXVersion"/>
    <keyword type="function" name="xmlSaveClose ()" link="libxml2-xmlsave.html#xmlSaveClose"/>
    <keyword type="function" name="xmlSaveDoc ()" link="libxml2-xmlsave.html#xmlSaveDoc"/>
    <keyword type="function" name="xmlSaveFile ()" link="libxml2-tree.html#xmlSaveFile"/>
    <keyword type="function" name="xmlSaveFileEnc ()" link="libxml2-tree.html#xmlSaveFileEnc"/>
    <keyword type="function" name="xmlSaveFileTo ()" link="libxml2-tree.html#xmlSaveFileTo"/>
    <keyword type="function" name="xmlSaveFlush ()" link="libxml2-xmlsave.html#xmlSaveFlush"/>
    <keyword type="function" name="xmlSaveFormatFile ()" link="libxml2-tree.html#xmlSaveFormatFile"/>
    <keyword type="function" name="xmlSaveFormatFileEnc ()" link="libxml2-tree.html#xmlSaveFormatFileEnc"/>
    <keyword type="function" name="xmlSaveFormatFileTo ()" link="libxml2-tree.html#xmlSaveFormatFileTo"/>
    <keyword type="function" name="xmlSaveSetAttrEscape ()" link="libxml2-xmlsave.html#xmlSaveSetAttrEscape"/>
    <keyword type="function" name="xmlSaveSetEscape ()" link="libxml2-xmlsave.html#xmlSaveSetEscape"/>
    <keyword type="function" name="xmlSaveToBuffer ()" link="libxml2-xmlsave.html#xmlSaveToBuffer"/>
    <keyword type="function" name="xmlSaveToFd ()" link="libxml2-xmlsave.html#xmlSaveToFd"/>
    <keyword type="function" name="xmlSaveToFilename ()" link="libxml2-xmlsave.html#xmlSaveToFilename"/>
    <keyword type="function" name="xmlSaveToIO ()" link="libxml2-xmlsave.html#xmlSaveToIO"/>
    <keyword type="function" name="xmlSaveTree ()" link="libxml2-xmlsave.html#xmlSaveTree"/>
    <keyword type="function" name="xmlSaveUri ()" link="libxml2-uri.html#xmlSaveUri"/>
    <keyword type="function" name="xmlScanName ()" link="libxml2-parserInternals.html#xmlScanName"/>
    <keyword type="function" name="xmlSchemaCheckFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaCheckFacet"/>
    <keyword type="function" name="xmlSchemaCleanupTypes ()" link="libxml2-xmlschemastypes.html#xmlSchemaCleanupTypes"/>
    <keyword type="function" name="xmlSchemaCollapseString ()" link="libxml2-xmlschemastypes.html#xmlSchemaCollapseString"/>
    <keyword type="function" name="xmlSchemaCompareValues ()" link="libxml2-xmlschemastypes.html#xmlSchemaCompareValues"/>
    <keyword type="function" name="xmlSchemaCompareValuesWhtsp ()" link="libxml2-xmlschemastypes.html#xmlSchemaCompareValuesWhtsp"/>
    <keyword type="function" name="xmlSchemaCopyValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaCopyValue"/>
    <keyword type="function" name="xmlSchemaDump ()" link="libxml2-xmlschemas.html#xmlSchemaDump"/>
    <keyword type="function" name="xmlSchemaFree ()" link="libxml2-xmlschemas.html#xmlSchemaFree"/>
    <keyword type="function" name="xmlSchemaFreeFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaFreeFacet"/>
    <keyword type="function" name="xmlSchemaFreeParserCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaFreeParserCtxt"/>
    <keyword type="function" name="xmlSchemaFreeType ()" link="libxml2-schemasInternals.html#xmlSchemaFreeType"/>
    <keyword type="function" name="xmlSchemaFreeValidCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaFreeValidCtxt"/>
    <keyword type="function" name="xmlSchemaFreeValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaFreeValue"/>
    <keyword type="function" name="xmlSchemaFreeWildcard ()" link="libxml2-schemasInternals.html#xmlSchemaFreeWildcard"/>
    <keyword type="function" name="xmlSchemaGetBuiltInListSimpleTypeItemType ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetBuiltInListSimpleTypeItemType"/>
    <keyword type="function" name="xmlSchemaGetBuiltInType ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetBuiltInType"/>
    <keyword type="function" name="xmlSchemaGetCanonValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetCanonValue"/>
    <keyword type="function" name="xmlSchemaGetCanonValueWhtsp ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetCanonValueWhtsp"/>
    <keyword type="function" name="xmlSchemaGetFacetValueAsULong ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetFacetValueAsULong"/>
    <keyword type="function" name="xmlSchemaGetParserErrors ()" link="libxml2-xmlschemas.html#xmlSchemaGetParserErrors"/>
    <keyword type="function" name="xmlSchemaGetPredefinedType ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetPredefinedType"/>
    <keyword type="function" name="xmlSchemaGetValType ()" link="libxml2-xmlschemastypes.html#xmlSchemaGetValType"/>
    <keyword type="function" name="xmlSchemaGetValidErrors ()" link="libxml2-xmlschemas.html#xmlSchemaGetValidErrors"/>
    <keyword type="function" name="xmlSchemaInitTypes ()" link="libxml2-xmlschemastypes.html#xmlSchemaInitTypes"/>
    <keyword type="function" name="xmlSchemaIsBuiltInTypeFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaIsBuiltInTypeFacet"/>
    <keyword type="function" name="xmlSchemaIsValid ()" link="libxml2-xmlschemas.html#xmlSchemaIsValid"/>
    <keyword type="function" name="xmlSchemaNewDocParserCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaNewDocParserCtxt"/>
    <keyword type="function" name="xmlSchemaNewFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaNewFacet"/>
    <keyword type="function" name="xmlSchemaNewMemParserCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaNewMemParserCtxt"/>
    <keyword type="function" name="xmlSchemaNewNOTATIONValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaNewNOTATIONValue"/>
    <keyword type="function" name="xmlSchemaNewParserCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaNewParserCtxt"/>
    <keyword type="function" name="xmlSchemaNewQNameValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaNewQNameValue"/>
    <keyword type="function" name="xmlSchemaNewStringValue ()" link="libxml2-xmlschemastypes.html#xmlSchemaNewStringValue"/>
    <keyword type="function" name="xmlSchemaNewValidCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaNewValidCtxt"/>
    <keyword type="function" name="xmlSchemaParse ()" link="libxml2-xmlschemas.html#xmlSchemaParse"/>
    <keyword type="function" name="xmlSchemaSAXPlug ()" link="libxml2-xmlschemas.html#xmlSchemaSAXPlug"/>
    <keyword type="function" name="xmlSchemaSAXUnplug ()" link="libxml2-xmlschemas.html#xmlSchemaSAXUnplug"/>
    <keyword type="function" name="xmlSchemaSetParserErrors ()" link="libxml2-xmlschemas.html#xmlSchemaSetParserErrors"/>
    <keyword type="function" name="xmlSchemaSetParserStructuredErrors ()" link="libxml2-xmlschemas.html#xmlSchemaSetParserStructuredErrors"/>
    <keyword type="function" name="xmlSchemaSetValidErrors ()" link="libxml2-xmlschemas.html#xmlSchemaSetValidErrors"/>
    <keyword type="function" name="xmlSchemaSetValidOptions ()" link="libxml2-xmlschemas.html#xmlSchemaSetValidOptions"/>
    <keyword type="function" name="xmlSchemaSetValidStructuredErrors ()" link="libxml2-xmlschemas.html#xmlSchemaSetValidStructuredErrors"/>
    <keyword type="function" name="xmlSchemaValPredefTypeNode ()" link="libxml2-xmlschemastypes.html#xmlSchemaValPredefTypeNode"/>
    <keyword type="function" name="xmlSchemaValPredefTypeNodeNoNorm ()" link="libxml2-xmlschemastypes.html#xmlSchemaValPredefTypeNodeNoNorm"/>
    <keyword type="function" name="xmlSchemaValidCtxtGetOptions ()" link="libxml2-xmlschemas.html#xmlSchemaValidCtxtGetOptions"/>
    <keyword type="function" name="xmlSchemaValidCtxtGetParserCtxt ()" link="libxml2-xmlschemas.html#xmlSchemaValidCtxtGetParserCtxt"/>
    <keyword type="function" name="xmlSchemaValidateDoc ()" link="libxml2-xmlschemas.html#xmlSchemaValidateDoc"/>
    <keyword type="function" name="xmlSchemaValidateFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidateFacet"/>
    <keyword type="function" name="xmlSchemaValidateFacetWhtsp ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidateFacetWhtsp"/>
    <keyword type="function" name="xmlSchemaValidateFile ()" link="libxml2-xmlschemas.html#xmlSchemaValidateFile"/>
    <keyword type="function" name="xmlSchemaValidateLengthFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidateLengthFacet"/>
    <keyword type="function" name="xmlSchemaValidateLengthFacetWhtsp ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidateLengthFacetWhtsp"/>
    <keyword type="function" name="xmlSchemaValidateListSimpleTypeFacet ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidateListSimpleTypeFacet"/>
    <keyword type="function" name="xmlSchemaValidateOneElement ()" link="libxml2-xmlschemas.html#xmlSchemaValidateOneElement"/>
    <keyword type="function" name="xmlSchemaValidatePredefinedType ()" link="libxml2-xmlschemastypes.html#xmlSchemaValidatePredefinedType"/>
    <keyword type="function" name="xmlSchemaValidateSetFilename ()" link="libxml2-xmlschemas.html#xmlSchemaValidateSetFilename"/>
    <keyword type="function" name="xmlSchemaValidateSetLocator ()" link="libxml2-xmlschemas.html#xmlSchemaValidateSetLocator"/>
    <keyword type="function" name="xmlSchemaValidateStream ()" link="libxml2-xmlschemas.html#xmlSchemaValidateStream"/>
    <keyword type="function" name="xmlSchemaValueAppend ()" link="libxml2-xmlschemastypes.html#xmlSchemaValueAppend"/>
    <keyword type="function" name="xmlSchemaValueGetAsBoolean ()" link="libxml2-xmlschemastypes.html#xmlSchemaValueGetAsBoolean"/>
    <keyword type="function" name="xmlSchemaValueGetAsString ()" link="libxml2-xmlschemastypes.html#xmlSchemaValueGetAsString"/>
    <keyword type="function" name="xmlSchemaValueGetNext ()" link="libxml2-xmlschemastypes.html#xmlSchemaValueGetNext"/>
    <keyword type="function" name="xmlSchemaWhiteSpaceReplace ()" link="libxml2-xmlschemastypes.html#xmlSchemaWhiteSpaceReplace"/>
    <keyword type="function" name="xmlSchematronFree ()" link="libxml2-schematron.html#xmlSchematronFree"/>
    <keyword type="function" name="xmlSchematronFreeParserCtxt ()" link="libxml2-schematron.html#xmlSchematronFreeParserCtxt"/>
    <keyword type="function" name="xmlSchematronFreeValidCtxt ()" link="libxml2-schematron.html#xmlSchematronFreeValidCtxt"/>
    <keyword type="function" name="xmlSchematronNewDocParserCtxt ()" link="libxml2-schematron.html#xmlSchematronNewDocParserCtxt"/>
    <keyword type="function" name="xmlSchematronNewMemParserCtxt ()" link="libxml2-schematron.html#xmlSchematronNewMemParserCtxt"/>
    <keyword type="function" name="xmlSchematronNewParserCtxt ()" link="libxml2-schematron.html#xmlSchematronNewParserCtxt"/>
    <keyword type="function" name="xmlSchematronNewValidCtxt ()" link="libxml2-schematron.html#xmlSchematronNewValidCtxt"/>
    <keyword type="function" name="xmlSchematronParse ()" link="libxml2-schematron.html#xmlSchematronParse"/>
    <keyword type="function" name="xmlSchematronSetValidStructuredErrors ()" link="libxml2-schematron.html#xmlSchematronSetValidStructuredErrors"/>
    <keyword type="function" name="xmlSchematronValidateDoc ()" link="libxml2-schematron.html#xmlSchematronValidateDoc"/>
    <keyword type="function" name="xmlSearchNs ()" link="libxml2-tree.html#xmlSearchNs"/>
    <keyword type="function" name="xmlSearchNsByHref ()" link="libxml2-tree.html#xmlSearchNsByHref"/>
    <keyword type="function" name="xmlSetBufferAllocationScheme ()" link="libxml2-tree.html#xmlSetBufferAllocationScheme"/>
    <keyword type="function" name="xmlSetCompressMode ()" link="libxml2-tree.html#xmlSetCompressMode"/>
    <keyword type="function" name="xmlSetDocCompressMode ()" link="libxml2-tree.html#xmlSetDocCompressMode"/>
    <keyword type="function" name="xmlSetEntityReferenceFunc ()" link="libxml2-parserInternals.html#xmlSetEntityReferenceFunc"/>
    <keyword type="function" name="xmlSetExternalEntityLoader ()" link="libxml2-parser.html#xmlSetExternalEntityLoader"/>
    <keyword type="function" name="xmlSetFeature ()" link="libxml2-parser.html#xmlSetFeature"/>
    <keyword type="function" name="xmlSetGenericErrorFunc ()" link="libxml2-xmlerror.html#xmlSetGenericErrorFunc"/>
    <keyword type="function" name="xmlSetListDoc ()" link="libxml2-tree.html#xmlSetListDoc"/>
    <keyword type="function" name="xmlSetNs ()" link="libxml2-tree.html#xmlSetNs"/>
    <keyword type="function" name="xmlSetNsProp ()" link="libxml2-tree.html#xmlSetNsProp"/>
    <keyword type="function" name="xmlSetProp ()" link="libxml2-tree.html#xmlSetProp"/>
    <keyword type="function" name="xmlSetStructuredErrorFunc ()" link="libxml2-xmlerror.html#xmlSetStructuredErrorFunc"/>
    <keyword type="function" name="xmlSetTreeDoc ()" link="libxml2-tree.html#xmlSetTreeDoc"/>
    <keyword type="function" name="xmlSetupParserForBuffer ()" link="libxml2-parser.html#xmlSetupParserForBuffer"/>
    <keyword type="function" name="xmlShell ()" link="libxml2-debugXML.html#xmlShell"/>
    <keyword type="function" name="xmlShellBase ()" link="libxml2-debugXML.html#xmlShellBase"/>
    <keyword type="function" name="xmlShellCat ()" link="libxml2-debugXML.html#xmlShellCat"/>
    <keyword type="function" name="xmlShellDir ()" link="libxml2-debugXML.html#xmlShellDir"/>
    <keyword type="function" name="xmlShellDu ()" link="libxml2-debugXML.html#xmlShellDu"/>
    <keyword type="function" name="xmlShellList ()" link="libxml2-debugXML.html#xmlShellList"/>
    <keyword type="function" name="xmlShellLoad ()" link="libxml2-debugXML.html#xmlShellLoad"/>
    <keyword type="function" name="xmlShellPrintNode ()" link="libxml2-debugXML.html#xmlShellPrintNode"/>
    <keyword type="function" name="xmlShellPrintXPathError ()" link="libxml2-debugXML.html#xmlShellPrintXPathError"/>
    <keyword type="function" name="xmlShellPrintXPathResult ()" link="libxml2-debugXML.html#xmlShellPrintXPathResult"/>
    <keyword type="function" name="xmlShellPwd ()" link="libxml2-debugXML.html#xmlShellPwd"/>
    <keyword type="function" name="xmlShellSave ()" link="libxml2-debugXML.html#xmlShellSave"/>
    <keyword type="function" name="xmlShellValidate ()" link="libxml2-debugXML.html#xmlShellValidate"/>
    <keyword type="function" name="xmlShellWrite ()" link="libxml2-debugXML.html#xmlShellWrite"/>
    <keyword type="function" name="xmlSkipBlankChars ()" link="libxml2-parserInternals.html#xmlSkipBlankChars"/>
    <keyword type="function" name="xmlSnprintfElementContent ()" link="libxml2-valid.html#xmlSnprintfElementContent"/>
    <keyword type="function" name="xmlSplitQName ()" link="libxml2-parserInternals.html#xmlSplitQName"/>
    <keyword type="function" name="xmlSplitQName2 ()" link="libxml2-tree.html#xmlSplitQName2"/>
    <keyword type="function" name="xmlSplitQName3 ()" link="libxml2-tree.html#xmlSplitQName3"/>
    <keyword type="function" name="xmlSprintfElementContent ()" link="libxml2-valid.html#xmlSprintfElementContent"/>
    <keyword type="function" name="xmlStopParser ()" link="libxml2-parser.html#xmlStopParser"/>
    <keyword type="function" name="xmlStrEqual ()" link="libxml2-xmlstring.html#xmlStrEqual"/>
    <keyword type="function" name="xmlStrPrintf ()" link="libxml2-xmlstring.html#xmlStrPrintf"/>
    <keyword type="function" name="xmlStrQEqual ()" link="libxml2-xmlstring.html#xmlStrQEqual"/>
    <keyword type="function" name="xmlStrVPrintf ()" link="libxml2-xmlstring.html#xmlStrVPrintf"/>
    <keyword type="function" name="xmlStrcasecmp ()" link="libxml2-xmlstring.html#xmlStrcasecmp"/>
    <keyword type="function" name="xmlStrcasestr ()" link="libxml2-xmlstring.html#xmlStrcasestr"/>
    <keyword type="function" name="xmlStrcat ()" link="libxml2-xmlstring.html#xmlStrcat"/>
    <keyword type="function" name="xmlStrchr ()" link="libxml2-xmlstring.html#xmlStrchr"/>
    <keyword type="function" name="xmlStrcmp ()" link="libxml2-xmlstring.html#xmlStrcmp"/>
    <keyword type="function" name="xmlStrdup ()" link="libxml2-xmlstring.html#xmlStrdup"/>
    <keyword type="function" name="xmlStreamPop ()" link="libxml2-pattern.html#xmlStreamPop"/>
    <keyword type="function" name="xmlStreamPush ()" link="libxml2-pattern.html#xmlStreamPush"/>
    <keyword type="function" name="xmlStreamPushAttr ()" link="libxml2-pattern.html#xmlStreamPushAttr"/>
    <keyword type="function" name="xmlStreamPushNode ()" link="libxml2-pattern.html#xmlStreamPushNode"/>
    <keyword type="function" name="xmlStreamWantsAnyNode ()" link="libxml2-pattern.html#xmlStreamWantsAnyNode"/>
    <keyword type="function" name="xmlStringCurrentChar ()" link="libxml2-parserInternals.html#xmlStringCurrentChar"/>
    <keyword type="function" name="xmlStringDecodeEntities ()" link="libxml2-parserInternals.html#xmlStringDecodeEntities"/>
    <keyword type="function" name="xmlStringGetNodeList ()" link="libxml2-tree.html#xmlStringGetNodeList"/>
    <keyword type="function" name="xmlStringLenDecodeEntities ()" link="libxml2-parserInternals.html#xmlStringLenDecodeEntities"/>
    <keyword type="function" name="xmlStringLenGetNodeList ()" link="libxml2-tree.html#xmlStringLenGetNodeList"/>
    <keyword type="function" name="xmlStrlen ()" link="libxml2-xmlstring.html#xmlStrlen"/>
    <keyword type="function" name="xmlStrncasecmp ()" link="libxml2-xmlstring.html#xmlStrncasecmp"/>
    <keyword type="function" name="xmlStrncat ()" link="libxml2-xmlstring.html#xmlStrncat"/>
    <keyword type="function" name="xmlStrncatNew ()" link="libxml2-xmlstring.html#xmlStrncatNew"/>
    <keyword type="function" name="xmlStrncmp ()" link="libxml2-xmlstring.html#xmlStrncmp"/>
    <keyword type="function" name="xmlStrndup ()" link="libxml2-xmlstring.html#xmlStrndup"/>
    <keyword type="function" name="xmlStrstr ()" link="libxml2-xmlstring.html#xmlStrstr"/>
    <keyword type="function" name="xmlStrsub ()" link="libxml2-xmlstring.html#xmlStrsub"/>
    <keyword type="function" name="xmlSubstituteEntitiesDefault ()" link="libxml2-parser.html#xmlSubstituteEntitiesDefault"/>
    <keyword type="function" name="xmlSwitchEncoding ()" link="libxml2-parserInternals.html#xmlSwitchEncoding"/>
    <keyword type="function" name="xmlSwitchInputEncoding ()" link="libxml2-parserInternals.html#xmlSwitchInputEncoding"/>
    <keyword type="function" name="xmlSwitchToEncoding ()" link="libxml2-parserInternals.html#xmlSwitchToEncoding"/>
    <keyword type="function" name="xmlTextConcat ()" link="libxml2-tree.html#xmlTextConcat"/>
    <keyword type="function" name="xmlTextMerge ()" link="libxml2-tree.html#xmlTextMerge"/>
    <keyword type="function" name="xmlTextReaderAttributeCount ()" link="libxml2-xmlreader.html#xmlTextReaderAttributeCount"/>
    <keyword type="function" name="xmlTextReaderBaseUri ()" link="libxml2-xmlreader.html#xmlTextReaderBaseUri"/>
    <keyword type="function" name="xmlTextReaderByteConsumed ()" link="libxml2-xmlreader.html#xmlTextReaderByteConsumed"/>
    <keyword type="function" name="xmlTextReaderClose ()" link="libxml2-xmlreader.html#xmlTextReaderClose"/>
    <keyword type="function" name="xmlTextReaderConstBaseUri ()" link="libxml2-xmlreader.html#xmlTextReaderConstBaseUri"/>
    <keyword type="function" name="xmlTextReaderConstEncoding ()" link="libxml2-xmlreader.html#xmlTextReaderConstEncoding"/>
    <keyword type="function" name="xmlTextReaderConstLocalName ()" link="libxml2-xmlreader.html#xmlTextReaderConstLocalName"/>
    <keyword type="function" name="xmlTextReaderConstName ()" link="libxml2-xmlreader.html#xmlTextReaderConstName"/>
    <keyword type="function" name="xmlTextReaderConstNamespaceUri ()" link="libxml2-xmlreader.html#xmlTextReaderConstNamespaceUri"/>
    <keyword type="function" name="xmlTextReaderConstPrefix ()" link="libxml2-xmlreader.html#xmlTextReaderConstPrefix"/>
    <keyword type="function" name="xmlTextReaderConstString ()" link="libxml2-xmlreader.html#xmlTextReaderConstString"/>
    <keyword type="function" name="xmlTextReaderConstValue ()" link="libxml2-xmlreader.html#xmlTextReaderConstValue"/>
    <keyword type="function" name="xmlTextReaderConstXmlLang ()" link="libxml2-xmlreader.html#xmlTextReaderConstXmlLang"/>
    <keyword type="function" name="xmlTextReaderConstXmlVersion ()" link="libxml2-xmlreader.html#xmlTextReaderConstXmlVersion"/>
    <keyword type="function" name="xmlTextReaderCurrentDoc ()" link="libxml2-xmlreader.html#xmlTextReaderCurrentDoc"/>
    <keyword type="function" name="xmlTextReaderCurrentNode ()" link="libxml2-xmlreader.html#xmlTextReaderCurrentNode"/>
    <keyword type="function" name="xmlTextReaderDepth ()" link="libxml2-xmlreader.html#xmlTextReaderDepth"/>
    <keyword type="function" name="xmlTextReaderExpand ()" link="libxml2-xmlreader.html#xmlTextReaderExpand"/>
    <keyword type="function" name="xmlTextReaderGetAttribute ()" link="libxml2-xmlreader.html#xmlTextReaderGetAttribute"/>
    <keyword type="function" name="xmlTextReaderGetAttributeNo ()" link="libxml2-xmlreader.html#xmlTextReaderGetAttributeNo"/>
    <keyword type="function" name="xmlTextReaderGetAttributeNs ()" link="libxml2-xmlreader.html#xmlTextReaderGetAttributeNs"/>
    <keyword type="function" name="xmlTextReaderGetErrorHandler ()" link="libxml2-xmlreader.html#xmlTextReaderGetErrorHandler"/>
    <keyword type="function" name="xmlTextReaderGetParserColumnNumber ()" link="libxml2-xmlreader.html#xmlTextReaderGetParserColumnNumber"/>
    <keyword type="function" name="xmlTextReaderGetParserLineNumber ()" link="libxml2-xmlreader.html#xmlTextReaderGetParserLineNumber"/>
    <keyword type="function" name="xmlTextReaderGetParserProp ()" link="libxml2-xmlreader.html#xmlTextReaderGetParserProp"/>
    <keyword type="function" name="xmlTextReaderGetRemainder ()" link="libxml2-xmlreader.html#xmlTextReaderGetRemainder"/>
    <keyword type="function" name="xmlTextReaderHasAttributes ()" link="libxml2-xmlreader.html#xmlTextReaderHasAttributes"/>
    <keyword type="function" name="xmlTextReaderHasValue ()" link="libxml2-xmlreader.html#xmlTextReaderHasValue"/>
    <keyword type="function" name="xmlTextReaderIsDefault ()" link="libxml2-xmlreader.html#xmlTextReaderIsDefault"/>
    <keyword type="function" name="xmlTextReaderIsEmptyElement ()" link="libxml2-xmlreader.html#xmlTextReaderIsEmptyElement"/>
    <keyword type="function" name="xmlTextReaderIsNamespaceDecl ()" link="libxml2-xmlreader.html#xmlTextReaderIsNamespaceDecl"/>
    <keyword type="function" name="xmlTextReaderIsValid ()" link="libxml2-xmlreader.html#xmlTextReaderIsValid"/>
    <keyword type="function" name="xmlTextReaderLocalName ()" link="libxml2-xmlreader.html#xmlTextReaderLocalName"/>
    <keyword type="function" name="xmlTextReaderLocatorBaseURI ()" link="libxml2-xmlreader.html#xmlTextReaderLocatorBaseURI"/>
    <keyword type="function" name="xmlTextReaderLocatorLineNumber ()" link="libxml2-xmlreader.html#xmlTextReaderLocatorLineNumber"/>
    <keyword type="function" name="xmlTextReaderLookupNamespace ()" link="libxml2-xmlreader.html#xmlTextReaderLookupNamespace"/>
    <keyword type="function" name="xmlTextReaderMoveToAttribute ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToAttribute"/>
    <keyword type="function" name="xmlTextReaderMoveToAttributeNo ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToAttributeNo"/>
    <keyword type="function" name="xmlTextReaderMoveToAttributeNs ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToAttributeNs"/>
    <keyword type="function" name="xmlTextReaderMoveToElement ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToElement"/>
    <keyword type="function" name="xmlTextReaderMoveToFirstAttribute ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToFirstAttribute"/>
    <keyword type="function" name="xmlTextReaderMoveToNextAttribute ()" link="libxml2-xmlreader.html#xmlTextReaderMoveToNextAttribute"/>
    <keyword type="function" name="xmlTextReaderName ()" link="libxml2-xmlreader.html#xmlTextReaderName"/>
    <keyword type="function" name="xmlTextReaderNamespaceUri ()" link="libxml2-xmlreader.html#xmlTextReaderNamespaceUri"/>
    <keyword type="function" name="xmlTextReaderNext ()" link="libxml2-xmlreader.html#xmlTextReaderNext"/>
    <keyword type="function" name="xmlTextReaderNextSibling ()" link="libxml2-xmlreader.html#xmlTextReaderNextSibling"/>
    <keyword type="function" name="xmlTextReaderNodeType ()" link="libxml2-xmlreader.html#xmlTextReaderNodeType"/>
    <keyword type="function" name="xmlTextReaderNormalization ()" link="libxml2-xmlreader.html#xmlTextReaderNormalization"/>
    <keyword type="function" name="xmlTextReaderPrefix ()" link="libxml2-xmlreader.html#xmlTextReaderPrefix"/>
    <keyword type="function" name="xmlTextReaderPreserve ()" link="libxml2-xmlreader.html#xmlTextReaderPreserve"/>
    <keyword type="function" name="xmlTextReaderPreservePattern ()" link="libxml2-xmlreader.html#xmlTextReaderPreservePattern"/>
    <keyword type="function" name="xmlTextReaderQuoteChar ()" link="libxml2-xmlreader.html#xmlTextReaderQuoteChar"/>
    <keyword type="function" name="xmlTextReaderRead ()" link="libxml2-xmlreader.html#xmlTextReaderRead"/>
    <keyword type="function" name="xmlTextReaderReadAttributeValue ()" link="libxml2-xmlreader.html#xmlTextReaderReadAttributeValue"/>
    <keyword type="function" name="xmlTextReaderReadInnerXml ()" link="libxml2-xmlreader.html#xmlTextReaderReadInnerXml"/>
    <keyword type="function" name="xmlTextReaderReadOuterXml ()" link="libxml2-xmlreader.html#xmlTextReaderReadOuterXml"/>
    <keyword type="function" name="xmlTextReaderReadState ()" link="libxml2-xmlreader.html#xmlTextReaderReadState"/>
    <keyword type="function" name="xmlTextReaderReadString ()" link="libxml2-xmlreader.html#xmlTextReaderReadString"/>
    <keyword type="function" name="xmlTextReaderRelaxNGSetSchema ()" link="libxml2-xmlreader.html#xmlTextReaderRelaxNGSetSchema"/>
    <keyword type="function" name="xmlTextReaderRelaxNGValidate ()" link="libxml2-xmlreader.html#xmlTextReaderRelaxNGValidate"/>
    <keyword type="function" name="xmlTextReaderRelaxNGValidateCtxt ()" link="libxml2-xmlreader.html#xmlTextReaderRelaxNGValidateCtxt"/>
    <keyword type="function" name="xmlTextReaderSchemaValidate ()" link="libxml2-xmlreader.html#xmlTextReaderSchemaValidate"/>
    <keyword type="function" name="xmlTextReaderSchemaValidateCtxt ()" link="libxml2-xmlreader.html#xmlTextReaderSchemaValidateCtxt"/>
    <keyword type="function" name="xmlTextReaderSetErrorHandler ()" link="libxml2-xmlreader.html#xmlTextReaderSetErrorHandler"/>
    <keyword type="function" name="xmlTextReaderSetParserProp ()" link="libxml2-xmlreader.html#xmlTextReaderSetParserProp"/>
    <keyword type="function" name="xmlTextReaderSetSchema ()" link="libxml2-xmlreader.html#xmlTextReaderSetSchema"/>
    <keyword type="function" name="xmlTextReaderSetStructuredErrorHandler ()" link="libxml2-xmlreader.html#xmlTextReaderSetStructuredErrorHandler"/>
    <keyword type="function" name="xmlTextReaderSetup ()" link="libxml2-xmlreader.html#xmlTextReaderSetup"/>
    <keyword type="function" name="xmlTextReaderStandalone ()" link="libxml2-xmlreader.html#xmlTextReaderStandalone"/>
    <keyword type="function" name="xmlTextReaderValue ()" link="libxml2-xmlreader.html#xmlTextReaderValue"/>
    <keyword type="function" name="xmlTextReaderXmlLang ()" link="libxml2-xmlreader.html#xmlTextReaderXmlLang"/>
    <keyword type="function" name="xmlTextWriterEndAttribute ()" link="libxml2-xmlwriter.html#xmlTextWriterEndAttribute"/>
    <keyword type="function" name="xmlTextWriterEndCDATA ()" link="libxml2-xmlwriter.html#xmlTextWriterEndCDATA"/>
    <keyword type="function" name="xmlTextWriterEndComment ()" link="libxml2-xmlwriter.html#xmlTextWriterEndComment"/>
    <keyword type="function" name="xmlTextWriterEndDTD ()" link="libxml2-xmlwriter.html#xmlTextWriterEndDTD"/>
    <keyword type="function" name="xmlTextWriterEndDTDAttlist ()" link="libxml2-xmlwriter.html#xmlTextWriterEndDTDAttlist"/>
    <keyword type="function" name="xmlTextWriterEndDTDElement ()" link="libxml2-xmlwriter.html#xmlTextWriterEndDTDElement"/>
    <keyword type="function" name="xmlTextWriterEndDTDEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterEndDTDEntity"/>
    <keyword type="function" name="xmlTextWriterEndDocument ()" link="libxml2-xmlwriter.html#xmlTextWriterEndDocument"/>
    <keyword type="function" name="xmlTextWriterEndElement ()" link="libxml2-xmlwriter.html#xmlTextWriterEndElement"/>
    <keyword type="function" name="xmlTextWriterEndPI ()" link="libxml2-xmlwriter.html#xmlTextWriterEndPI"/>
    <keyword type="function" name="xmlTextWriterFlush ()" link="libxml2-xmlwriter.html#xmlTextWriterFlush"/>
    <keyword type="function" name="xmlTextWriterFullEndElement ()" link="libxml2-xmlwriter.html#xmlTextWriterFullEndElement"/>
    <keyword type="function" name="xmlTextWriterSetIndent ()" link="libxml2-xmlwriter.html#xmlTextWriterSetIndent"/>
    <keyword type="function" name="xmlTextWriterSetIndentString ()" link="libxml2-xmlwriter.html#xmlTextWriterSetIndentString"/>
    <keyword type="function" name="xmlTextWriterSetQuoteChar ()" link="libxml2-xmlwriter.html#xmlTextWriterSetQuoteChar"/>
    <keyword type="function" name="xmlTextWriterStartAttribute ()" link="libxml2-xmlwriter.html#xmlTextWriterStartAttribute"/>
    <keyword type="function" name="xmlTextWriterStartAttributeNS ()" link="libxml2-xmlwriter.html#xmlTextWriterStartAttributeNS"/>
    <keyword type="function" name="xmlTextWriterStartCDATA ()" link="libxml2-xmlwriter.html#xmlTextWriterStartCDATA"/>
    <keyword type="function" name="xmlTextWriterStartComment ()" link="libxml2-xmlwriter.html#xmlTextWriterStartComment"/>
    <keyword type="function" name="xmlTextWriterStartDTD ()" link="libxml2-xmlwriter.html#xmlTextWriterStartDTD"/>
    <keyword type="function" name="xmlTextWriterStartDTDAttlist ()" link="libxml2-xmlwriter.html#xmlTextWriterStartDTDAttlist"/>
    <keyword type="function" name="xmlTextWriterStartDTDElement ()" link="libxml2-xmlwriter.html#xmlTextWriterStartDTDElement"/>
    <keyword type="function" name="xmlTextWriterStartDTDEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterStartDTDEntity"/>
    <keyword type="function" name="xmlTextWriterStartDocument ()" link="libxml2-xmlwriter.html#xmlTextWriterStartDocument"/>
    <keyword type="function" name="xmlTextWriterStartElement ()" link="libxml2-xmlwriter.html#xmlTextWriterStartElement"/>
    <keyword type="function" name="xmlTextWriterStartElementNS ()" link="libxml2-xmlwriter.html#xmlTextWriterStartElementNS"/>
    <keyword type="function" name="xmlTextWriterStartPI ()" link="libxml2-xmlwriter.html#xmlTextWriterStartPI"/>
    <keyword type="function" name="xmlTextWriterWriteAttribute ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteAttribute"/>
    <keyword type="function" name="xmlTextWriterWriteAttributeNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteAttributeNS"/>
    <keyword type="function" name="xmlTextWriterWriteBase64 ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteBase64"/>
    <keyword type="function" name="xmlTextWriterWriteBinHex ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteBinHex"/>
    <keyword type="function" name="xmlTextWriterWriteCDATA ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteCDATA"/>
    <keyword type="function" name="xmlTextWriterWriteComment ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteComment"/>
    <keyword type="function" name="xmlTextWriterWriteDTD ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTD"/>
    <keyword type="function" name="xmlTextWriterWriteDTDAttlist ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDAttlist"/>
    <keyword type="function" name="xmlTextWriterWriteDTDElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDElement"/>
    <keyword type="function" name="xmlTextWriterWriteDTDEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDEntity"/>
    <keyword type="function" name="xmlTextWriterWriteDTDExternalEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDExternalEntity"/>
    <keyword type="function" name="xmlTextWriterWriteDTDExternalEntityContents ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDExternalEntityContents"/>
    <keyword type="function" name="xmlTextWriterWriteDTDInternalEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDInternalEntity"/>
    <keyword type="function" name="xmlTextWriterWriteDTDNotation ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteDTDNotation"/>
    <keyword type="function" name="xmlTextWriterWriteElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteElement"/>
    <keyword type="function" name="xmlTextWriterWriteElementNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteElementNS"/>
    <keyword type="function" name="xmlTextWriterWriteFormatAttribute ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatAttribute"/>
    <keyword type="function" name="xmlTextWriterWriteFormatAttributeNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatAttributeNS"/>
    <keyword type="function" name="xmlTextWriterWriteFormatCDATA ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatCDATA"/>
    <keyword type="function" name="xmlTextWriterWriteFormatComment ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatComment"/>
    <keyword type="function" name="xmlTextWriterWriteFormatDTD ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatDTD"/>
    <keyword type="function" name="xmlTextWriterWriteFormatDTDAttlist ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatDTDAttlist"/>
    <keyword type="function" name="xmlTextWriterWriteFormatDTDElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatDTDElement"/>
    <keyword type="function" name="xmlTextWriterWriteFormatDTDInternalEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatDTDInternalEntity"/>
    <keyword type="function" name="xmlTextWriterWriteFormatElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatElement"/>
    <keyword type="function" name="xmlTextWriterWriteFormatElementNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatElementNS"/>
    <keyword type="function" name="xmlTextWriterWriteFormatPI ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatPI"/>
    <keyword type="function" name="xmlTextWriterWriteFormatRaw ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatRaw"/>
    <keyword type="function" name="xmlTextWriterWriteFormatString ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteFormatString"/>
    <keyword type="function" name="xmlTextWriterWritePI ()" link="libxml2-xmlwriter.html#xmlTextWriterWritePI"/>
    <keyword type="function" name="xmlTextWriterWriteRaw ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteRaw"/>
    <keyword type="function" name="xmlTextWriterWriteRawLen ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteRawLen"/>
    <keyword type="function" name="xmlTextWriterWriteString ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteString"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatAttribute ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatAttribute"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatAttributeNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatAttributeNS"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatCDATA ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatCDATA"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatComment ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatComment"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatDTD ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatDTD"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatDTDAttlist ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatDTDAttlist"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatDTDElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatDTDElement"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatDTDInternalEntity ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatDTDInternalEntity"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatElement ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatElement"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatElementNS ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatElementNS"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatPI ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatPI"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatRaw ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatRaw"/>
    <keyword type="function" name="xmlTextWriterWriteVFormatString ()" link="libxml2-xmlwriter.html#xmlTextWriterWriteVFormatString"/>
    <keyword type="function" name="xmlThrDefBufferAllocScheme ()" link="libxml2-globals.html#xmlThrDefBufferAllocScheme"/>
    <keyword type="function" name="xmlThrDefDefaultBufferSize ()" link="libxml2-globals.html#xmlThrDefDefaultBufferSize"/>
    <keyword type="function" name="xmlThrDefDeregisterNodeDefault ()" link="libxml2-globals.html#xmlThrDefDeregisterNodeDefault"/>
    <keyword type="function" name="xmlThrDefDoValidityCheckingDefaultValue ()" link="libxml2-globals.html#xmlThrDefDoValidityCheckingDefaultValue"/>
    <keyword type="function" name="xmlThrDefGetWarningsDefaultValue ()" link="libxml2-globals.html#xmlThrDefGetWarningsDefaultValue"/>
    <keyword type="function" name="xmlThrDefIndentTreeOutput ()" link="libxml2-globals.html#xmlThrDefIndentTreeOutput"/>
    <keyword type="function" name="xmlThrDefKeepBlanksDefaultValue ()" link="libxml2-globals.html#xmlThrDefKeepBlanksDefaultValue"/>
    <keyword type="function" name="xmlThrDefLineNumbersDefaultValue ()" link="libxml2-globals.html#xmlThrDefLineNumbersDefaultValue"/>
    <keyword type="function" name="xmlThrDefLoadExtDtdDefaultValue ()" link="libxml2-globals.html#xmlThrDefLoadExtDtdDefaultValue"/>
    <keyword type="function" name="xmlThrDefOutputBufferCreateFilenameDefault ()" link="libxml2-globals.html#xmlThrDefOutputBufferCreateFilenameDefault"/>
    <keyword type="function" name="xmlThrDefParserDebugEntities ()" link="libxml2-globals.html#xmlThrDefParserDebugEntities"/>
    <keyword type="function" name="xmlThrDefParserInputBufferCreateFilenameDefault ()" link="libxml2-globals.html#xmlThrDefParserInputBufferCreateFilenameDefault"/>
    <keyword type="function" name="xmlThrDefPedanticParserDefaultValue ()" link="libxml2-globals.html#xmlThrDefPedanticParserDefaultValue"/>
    <keyword type="function" name="xmlThrDefRegisterNodeDefault ()" link="libxml2-globals.html#xmlThrDefRegisterNodeDefault"/>
    <keyword type="function" name="xmlThrDefSaveNoEmptyTags ()" link="libxml2-globals.html#xmlThrDefSaveNoEmptyTags"/>
    <keyword type="function" name="xmlThrDefSetGenericErrorFunc ()" link="libxml2-globals.html#xmlThrDefSetGenericErrorFunc"/>
    <keyword type="function" name="xmlThrDefSetStructuredErrorFunc ()" link="libxml2-globals.html#xmlThrDefSetStructuredErrorFunc"/>
    <keyword type="function" name="xmlThrDefSubstituteEntitiesDefaultValue ()" link="libxml2-globals.html#xmlThrDefSubstituteEntitiesDefaultValue"/>
    <keyword type="function" name="xmlThrDefTreeIndentString ()" link="libxml2-globals.html#xmlThrDefTreeIndentString"/>
    <keyword type="function" name="xmlUCSIsAegeanNumbers ()" link="libxml2-xmlunicode.html#xmlUCSIsAegeanNumbers"/>
    <keyword type="function" name="xmlUCSIsAlphabeticPresentationForms ()" link="libxml2-xmlunicode.html#xmlUCSIsAlphabeticPresentationForms"/>
    <keyword type="function" name="xmlUCSIsArabic ()" link="libxml2-xmlunicode.html#xmlUCSIsArabic"/>
    <keyword type="function" name="xmlUCSIsArabicPresentationFormsA ()" link="libxml2-xmlunicode.html#xmlUCSIsArabicPresentationFormsA"/>
    <keyword type="function" name="xmlUCSIsArabicPresentationFormsB ()" link="libxml2-xmlunicode.html#xmlUCSIsArabicPresentationFormsB"/>
    <keyword type="function" name="xmlUCSIsArmenian ()" link="libxml2-xmlunicode.html#xmlUCSIsArmenian"/>
    <keyword type="function" name="xmlUCSIsArrows ()" link="libxml2-xmlunicode.html#xmlUCSIsArrows"/>
    <keyword type="function" name="xmlUCSIsBasicLatin ()" link="libxml2-xmlunicode.html#xmlUCSIsBasicLatin"/>
    <keyword type="function" name="xmlUCSIsBengali ()" link="libxml2-xmlunicode.html#xmlUCSIsBengali"/>
    <keyword type="function" name="xmlUCSIsBlock ()" link="libxml2-xmlunicode.html#xmlUCSIsBlock"/>
    <keyword type="function" name="xmlUCSIsBlockElements ()" link="libxml2-xmlunicode.html#xmlUCSIsBlockElements"/>
    <keyword type="function" name="xmlUCSIsBopomofo ()" link="libxml2-xmlunicode.html#xmlUCSIsBopomofo"/>
    <keyword type="function" name="xmlUCSIsBopomofoExtended ()" link="libxml2-xmlunicode.html#xmlUCSIsBopomofoExtended"/>
    <keyword type="function" name="xmlUCSIsBoxDrawing ()" link="libxml2-xmlunicode.html#xmlUCSIsBoxDrawing"/>
    <keyword type="function" name="xmlUCSIsBraillePatterns ()" link="libxml2-xmlunicode.html#xmlUCSIsBraillePatterns"/>
    <keyword type="function" name="xmlUCSIsBuhid ()" link="libxml2-xmlunicode.html#xmlUCSIsBuhid"/>
    <keyword type="function" name="xmlUCSIsByzantineMusicalSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsByzantineMusicalSymbols"/>
    <keyword type="function" name="xmlUCSIsCJKCompatibility ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKCompatibility"/>
    <keyword type="function" name="xmlUCSIsCJKCompatibilityForms ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKCompatibilityForms"/>
    <keyword type="function" name="xmlUCSIsCJKCompatibilityIdeographs ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKCompatibilityIdeographs"/>
    <keyword type="function" name="xmlUCSIsCJKCompatibilityIdeographsSupplement ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKCompatibilityIdeographsSupplement"/>
    <keyword type="function" name="xmlUCSIsCJKRadicalsSupplement ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKRadicalsSupplement"/>
    <keyword type="function" name="xmlUCSIsCJKSymbolsandPunctuation ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKSymbolsandPunctuation"/>
    <keyword type="function" name="xmlUCSIsCJKUnifiedIdeographs ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKUnifiedIdeographs"/>
    <keyword type="function" name="xmlUCSIsCJKUnifiedIdeographsExtensionA ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKUnifiedIdeographsExtensionA"/>
    <keyword type="function" name="xmlUCSIsCJKUnifiedIdeographsExtensionB ()" link="libxml2-xmlunicode.html#xmlUCSIsCJKUnifiedIdeographsExtensionB"/>
    <keyword type="function" name="xmlUCSIsCat ()" link="libxml2-xmlunicode.html#xmlUCSIsCat"/>
    <keyword type="function" name="xmlUCSIsCatC ()" link="libxml2-xmlunicode.html#xmlUCSIsCatC"/>
    <keyword type="function" name="xmlUCSIsCatCc ()" link="libxml2-xmlunicode.html#xmlUCSIsCatCc"/>
    <keyword type="function" name="xmlUCSIsCatCf ()" link="libxml2-xmlunicode.html#xmlUCSIsCatCf"/>
    <keyword type="function" name="xmlUCSIsCatCo ()" link="libxml2-xmlunicode.html#xmlUCSIsCatCo"/>
    <keyword type="function" name="xmlUCSIsCatCs ()" link="libxml2-xmlunicode.html#xmlUCSIsCatCs"/>
    <keyword type="function" name="xmlUCSIsCatL ()" link="libxml2-xmlunicode.html#xmlUCSIsCatL"/>
    <keyword type="function" name="xmlUCSIsCatLl ()" link="libxml2-xmlunicode.html#xmlUCSIsCatLl"/>
    <keyword type="function" name="xmlUCSIsCatLm ()" link="libxml2-xmlunicode.html#xmlUCSIsCatLm"/>
    <keyword type="function" name="xmlUCSIsCatLo ()" link="libxml2-xmlunicode.html#xmlUCSIsCatLo"/>
    <keyword type="function" name="xmlUCSIsCatLt ()" link="libxml2-xmlunicode.html#xmlUCSIsCatLt"/>
    <keyword type="function" name="xmlUCSIsCatLu ()" link="libxml2-xmlunicode.html#xmlUCSIsCatLu"/>
    <keyword type="function" name="xmlUCSIsCatM ()" link="libxml2-xmlunicode.html#xmlUCSIsCatM"/>
    <keyword type="function" name="xmlUCSIsCatMc ()" link="libxml2-xmlunicode.html#xmlUCSIsCatMc"/>
    <keyword type="function" name="xmlUCSIsCatMe ()" link="libxml2-xmlunicode.html#xmlUCSIsCatMe"/>
    <keyword type="function" name="xmlUCSIsCatMn ()" link="libxml2-xmlunicode.html#xmlUCSIsCatMn"/>
    <keyword type="function" name="xmlUCSIsCatN ()" link="libxml2-xmlunicode.html#xmlUCSIsCatN"/>
    <keyword type="function" name="xmlUCSIsCatNd ()" link="libxml2-xmlunicode.html#xmlUCSIsCatNd"/>
    <keyword type="function" name="xmlUCSIsCatNl ()" link="libxml2-xmlunicode.html#xmlUCSIsCatNl"/>
    <keyword type="function" name="xmlUCSIsCatNo ()" link="libxml2-xmlunicode.html#xmlUCSIsCatNo"/>
    <keyword type="function" name="xmlUCSIsCatP ()" link="libxml2-xmlunicode.html#xmlUCSIsCatP"/>
    <keyword type="function" name="xmlUCSIsCatPc ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPc"/>
    <keyword type="function" name="xmlUCSIsCatPd ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPd"/>
    <keyword type="function" name="xmlUCSIsCatPe ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPe"/>
    <keyword type="function" name="xmlUCSIsCatPf ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPf"/>
    <keyword type="function" name="xmlUCSIsCatPi ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPi"/>
    <keyword type="function" name="xmlUCSIsCatPo ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPo"/>
    <keyword type="function" name="xmlUCSIsCatPs ()" link="libxml2-xmlunicode.html#xmlUCSIsCatPs"/>
    <keyword type="function" name="xmlUCSIsCatS ()" link="libxml2-xmlunicode.html#xmlUCSIsCatS"/>
    <keyword type="function" name="xmlUCSIsCatSc ()" link="libxml2-xmlunicode.html#xmlUCSIsCatSc"/>
    <keyword type="function" name="xmlUCSIsCatSk ()" link="libxml2-xmlunicode.html#xmlUCSIsCatSk"/>
    <keyword type="function" name="xmlUCSIsCatSm ()" link="libxml2-xmlunicode.html#xmlUCSIsCatSm"/>
    <keyword type="function" name="xmlUCSIsCatSo ()" link="libxml2-xmlunicode.html#xmlUCSIsCatSo"/>
    <keyword type="function" name="xmlUCSIsCatZ ()" link="libxml2-xmlunicode.html#xmlUCSIsCatZ"/>
    <keyword type="function" name="xmlUCSIsCatZl ()" link="libxml2-xmlunicode.html#xmlUCSIsCatZl"/>
    <keyword type="function" name="xmlUCSIsCatZp ()" link="libxml2-xmlunicode.html#xmlUCSIsCatZp"/>
    <keyword type="function" name="xmlUCSIsCatZs ()" link="libxml2-xmlunicode.html#xmlUCSIsCatZs"/>
    <keyword type="function" name="xmlUCSIsCherokee ()" link="libxml2-xmlunicode.html#xmlUCSIsCherokee"/>
    <keyword type="function" name="xmlUCSIsCombiningDiacriticalMarks ()" link="libxml2-xmlunicode.html#xmlUCSIsCombiningDiacriticalMarks"/>
    <keyword type="function" name="xmlUCSIsCombiningDiacriticalMarksforSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsCombiningDiacriticalMarksforSymbols"/>
    <keyword type="function" name="xmlUCSIsCombiningHalfMarks ()" link="libxml2-xmlunicode.html#xmlUCSIsCombiningHalfMarks"/>
    <keyword type="function" name="xmlUCSIsCombiningMarksforSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsCombiningMarksforSymbols"/>
    <keyword type="function" name="xmlUCSIsControlPictures ()" link="libxml2-xmlunicode.html#xmlUCSIsControlPictures"/>
    <keyword type="function" name="xmlUCSIsCurrencySymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsCurrencySymbols"/>
    <keyword type="function" name="xmlUCSIsCypriotSyllabary ()" link="libxml2-xmlunicode.html#xmlUCSIsCypriotSyllabary"/>
    <keyword type="function" name="xmlUCSIsCyrillic ()" link="libxml2-xmlunicode.html#xmlUCSIsCyrillic"/>
    <keyword type="function" name="xmlUCSIsCyrillicSupplement ()" link="libxml2-xmlunicode.html#xmlUCSIsCyrillicSupplement"/>
    <keyword type="function" name="xmlUCSIsDeseret ()" link="libxml2-xmlunicode.html#xmlUCSIsDeseret"/>
    <keyword type="function" name="xmlUCSIsDevanagari ()" link="libxml2-xmlunicode.html#xmlUCSIsDevanagari"/>
    <keyword type="function" name="xmlUCSIsDingbats ()" link="libxml2-xmlunicode.html#xmlUCSIsDingbats"/>
    <keyword type="function" name="xmlUCSIsEnclosedAlphanumerics ()" link="libxml2-xmlunicode.html#xmlUCSIsEnclosedAlphanumerics"/>
    <keyword type="function" name="xmlUCSIsEnclosedCJKLettersandMonths ()" link="libxml2-xmlunicode.html#xmlUCSIsEnclosedCJKLettersandMonths"/>
    <keyword type="function" name="xmlUCSIsEthiopic ()" link="libxml2-xmlunicode.html#xmlUCSIsEthiopic"/>
    <keyword type="function" name="xmlUCSIsGeneralPunctuation ()" link="libxml2-xmlunicode.html#xmlUCSIsGeneralPunctuation"/>
    <keyword type="function" name="xmlUCSIsGeometricShapes ()" link="libxml2-xmlunicode.html#xmlUCSIsGeometricShapes"/>
    <keyword type="function" name="xmlUCSIsGeorgian ()" link="libxml2-xmlunicode.html#xmlUCSIsGeorgian"/>
    <keyword type="function" name="xmlUCSIsGothic ()" link="libxml2-xmlunicode.html#xmlUCSIsGothic"/>
    <keyword type="function" name="xmlUCSIsGreek ()" link="libxml2-xmlunicode.html#xmlUCSIsGreek"/>
    <keyword type="function" name="xmlUCSIsGreekExtended ()" link="libxml2-xmlunicode.html#xmlUCSIsGreekExtended"/>
    <keyword type="function" name="xmlUCSIsGreekandCoptic ()" link="libxml2-xmlunicode.html#xmlUCSIsGreekandCoptic"/>
    <keyword type="function" name="xmlUCSIsGujarati ()" link="libxml2-xmlunicode.html#xmlUCSIsGujarati"/>
    <keyword type="function" name="xmlUCSIsGurmukhi ()" link="libxml2-xmlunicode.html#xmlUCSIsGurmukhi"/>
    <keyword type="function" name="xmlUCSIsHalfwidthandFullwidthForms ()" link="libxml2-xmlunicode.html#xmlUCSIsHalfwidthandFullwidthForms"/>
    <keyword type="function" name="xmlUCSIsHangulCompatibilityJamo ()" link="libxml2-xmlunicode.html#xmlUCSIsHangulCompatibilityJamo"/>
    <keyword type="function" name="xmlUCSIsHangulJamo ()" link="libxml2-xmlunicode.html#xmlUCSIsHangulJamo"/>
    <keyword type="function" name="xmlUCSIsHangulSyllables ()" link="libxml2-xmlunicode.html#xmlUCSIsHangulSyllables"/>
    <keyword type="function" name="xmlUCSIsHanunoo ()" link="libxml2-xmlunicode.html#xmlUCSIsHanunoo"/>
    <keyword type="function" name="xmlUCSIsHebrew ()" link="libxml2-xmlunicode.html#xmlUCSIsHebrew"/>
    <keyword type="function" name="xmlUCSIsHighPrivateUseSurrogates ()" link="libxml2-xmlunicode.html#xmlUCSIsHighPrivateUseSurrogates"/>
    <keyword type="function" name="xmlUCSIsHighSurrogates ()" link="libxml2-xmlunicode.html#xmlUCSIsHighSurrogates"/>
    <keyword type="function" name="xmlUCSIsHiragana ()" link="libxml2-xmlunicode.html#xmlUCSIsHiragana"/>
    <keyword type="function" name="xmlUCSIsIPAExtensions ()" link="libxml2-xmlunicode.html#xmlUCSIsIPAExtensions"/>
    <keyword type="function" name="xmlUCSIsIdeographicDescriptionCharacters ()" link="libxml2-xmlunicode.html#xmlUCSIsIdeographicDescriptionCharacters"/>
    <keyword type="function" name="xmlUCSIsKanbun ()" link="libxml2-xmlunicode.html#xmlUCSIsKanbun"/>
    <keyword type="function" name="xmlUCSIsKangxiRadicals ()" link="libxml2-xmlunicode.html#xmlUCSIsKangxiRadicals"/>
    <keyword type="function" name="xmlUCSIsKannada ()" link="libxml2-xmlunicode.html#xmlUCSIsKannada"/>
    <keyword type="function" name="xmlUCSIsKatakana ()" link="libxml2-xmlunicode.html#xmlUCSIsKatakana"/>
    <keyword type="function" name="xmlUCSIsKatakanaPhoneticExtensions ()" link="libxml2-xmlunicode.html#xmlUCSIsKatakanaPhoneticExtensions"/>
    <keyword type="function" name="xmlUCSIsKhmer ()" link="libxml2-xmlunicode.html#xmlUCSIsKhmer"/>
    <keyword type="function" name="xmlUCSIsKhmerSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsKhmerSymbols"/>
    <keyword type="function" name="xmlUCSIsLao ()" link="libxml2-xmlunicode.html#xmlUCSIsLao"/>
    <keyword type="function" name="xmlUCSIsLatin1Supplement ()" link="libxml2-xmlunicode.html#xmlUCSIsLatin1Supplement"/>
    <keyword type="function" name="xmlUCSIsLatinExtendedA ()" link="libxml2-xmlunicode.html#xmlUCSIsLatinExtendedA"/>
    <keyword type="function" name="xmlUCSIsLatinExtendedAdditional ()" link="libxml2-xmlunicode.html#xmlUCSIsLatinExtendedAdditional"/>
    <keyword type="function" name="xmlUCSIsLatinExtendedB ()" link="libxml2-xmlunicode.html#xmlUCSIsLatinExtendedB"/>
    <keyword type="function" name="xmlUCSIsLetterlikeSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsLetterlikeSymbols"/>
    <keyword type="function" name="xmlUCSIsLimbu ()" link="libxml2-xmlunicode.html#xmlUCSIsLimbu"/>
    <keyword type="function" name="xmlUCSIsLinearBIdeograms ()" link="libxml2-xmlunicode.html#xmlUCSIsLinearBIdeograms"/>
    <keyword type="function" name="xmlUCSIsLinearBSyllabary ()" link="libxml2-xmlunicode.html#xmlUCSIsLinearBSyllabary"/>
    <keyword type="function" name="xmlUCSIsLowSurrogates ()" link="libxml2-xmlunicode.html#xmlUCSIsLowSurrogates"/>
    <keyword type="function" name="xmlUCSIsMalayalam ()" link="libxml2-xmlunicode.html#xmlUCSIsMalayalam"/>
    <keyword type="function" name="xmlUCSIsMathematicalAlphanumericSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsMathematicalAlphanumericSymbols"/>
    <keyword type="function" name="xmlUCSIsMathematicalOperators ()" link="libxml2-xmlunicode.html#xmlUCSIsMathematicalOperators"/>
    <keyword type="function" name="xmlUCSIsMiscellaneousMathematicalSymbolsA ()" link="libxml2-xmlunicode.html#xmlUCSIsMiscellaneousMathematicalSymbolsA"/>
    <keyword type="function" name="xmlUCSIsMiscellaneousMathematicalSymbolsB ()" link="libxml2-xmlunicode.html#xmlUCSIsMiscellaneousMathematicalSymbolsB"/>
    <keyword type="function" name="xmlUCSIsMiscellaneousSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsMiscellaneousSymbols"/>
    <keyword type="function" name="xmlUCSIsMiscellaneousSymbolsandArrows ()" link="libxml2-xmlunicode.html#xmlUCSIsMiscellaneousSymbolsandArrows"/>
    <keyword type="function" name="xmlUCSIsMiscellaneousTechnical ()" link="libxml2-xmlunicode.html#xmlUCSIsMiscellaneousTechnical"/>
    <keyword type="function" name="xmlUCSIsMongolian ()" link="libxml2-xmlunicode.html#xmlUCSIsMongolian"/>
    <keyword type="function" name="xmlUCSIsMusicalSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsMusicalSymbols"/>
    <keyword type="function" name="xmlUCSIsMyanmar ()" link="libxml2-xmlunicode.html#xmlUCSIsMyanmar"/>
    <keyword type="function" name="xmlUCSIsNumberForms ()" link="libxml2-xmlunicode.html#xmlUCSIsNumberForms"/>
    <keyword type="function" name="xmlUCSIsOgham ()" link="libxml2-xmlunicode.html#xmlUCSIsOgham"/>
    <keyword type="function" name="xmlUCSIsOldItalic ()" link="libxml2-xmlunicode.html#xmlUCSIsOldItalic"/>
    <keyword type="function" name="xmlUCSIsOpticalCharacterRecognition ()" link="libxml2-xmlunicode.html#xmlUCSIsOpticalCharacterRecognition"/>
    <keyword type="function" name="xmlUCSIsOriya ()" link="libxml2-xmlunicode.html#xmlUCSIsOriya"/>
    <keyword type="function" name="xmlUCSIsOsmanya ()" link="libxml2-xmlunicode.html#xmlUCSIsOsmanya"/>
    <keyword type="function" name="xmlUCSIsPhoneticExtensions ()" link="libxml2-xmlunicode.html#xmlUCSIsPhoneticExtensions"/>
    <keyword type="function" name="xmlUCSIsPrivateUse ()" link="libxml2-xmlunicode.html#xmlUCSIsPrivateUse"/>
    <keyword type="function" name="xmlUCSIsPrivateUseArea ()" link="libxml2-xmlunicode.html#xmlUCSIsPrivateUseArea"/>
    <keyword type="function" name="xmlUCSIsRunic ()" link="libxml2-xmlunicode.html#xmlUCSIsRunic"/>
    <keyword type="function" name="xmlUCSIsShavian ()" link="libxml2-xmlunicode.html#xmlUCSIsShavian"/>
    <keyword type="function" name="xmlUCSIsSinhala ()" link="libxml2-xmlunicode.html#xmlUCSIsSinhala"/>
    <keyword type="function" name="xmlUCSIsSmallFormVariants ()" link="libxml2-xmlunicode.html#xmlUCSIsSmallFormVariants"/>
    <keyword type="function" name="xmlUCSIsSpacingModifierLetters ()" link="libxml2-xmlunicode.html#xmlUCSIsSpacingModifierLetters"/>
    <keyword type="function" name="xmlUCSIsSpecials ()" link="libxml2-xmlunicode.html#xmlUCSIsSpecials"/>
    <keyword type="function" name="xmlUCSIsSuperscriptsandSubscripts ()" link="libxml2-xmlunicode.html#xmlUCSIsSuperscriptsandSubscripts"/>
    <keyword type="function" name="xmlUCSIsSupplementalArrowsA ()" link="libxml2-xmlunicode.html#xmlUCSIsSupplementalArrowsA"/>
    <keyword type="function" name="xmlUCSIsSupplementalArrowsB ()" link="libxml2-xmlunicode.html#xmlUCSIsSupplementalArrowsB"/>
    <keyword type="function" name="xmlUCSIsSupplementalMathematicalOperators ()" link="libxml2-xmlunicode.html#xmlUCSIsSupplementalMathematicalOperators"/>
    <keyword type="function" name="xmlUCSIsSupplementaryPrivateUseAreaA ()" link="libxml2-xmlunicode.html#xmlUCSIsSupplementaryPrivateUseAreaA"/>
    <keyword type="function" name="xmlUCSIsSupplementaryPrivateUseAreaB ()" link="libxml2-xmlunicode.html#xmlUCSIsSupplementaryPrivateUseAreaB"/>
    <keyword type="function" name="xmlUCSIsSyriac ()" link="libxml2-xmlunicode.html#xmlUCSIsSyriac"/>
    <keyword type="function" name="xmlUCSIsTagalog ()" link="libxml2-xmlunicode.html#xmlUCSIsTagalog"/>
    <keyword type="function" name="xmlUCSIsTagbanwa ()" link="libxml2-xmlunicode.html#xmlUCSIsTagbanwa"/>
    <keyword type="function" name="xmlUCSIsTags ()" link="libxml2-xmlunicode.html#xmlUCSIsTags"/>
    <keyword type="function" name="xmlUCSIsTaiLe ()" link="libxml2-xmlunicode.html#xmlUCSIsTaiLe"/>
    <keyword type="function" name="xmlUCSIsTaiXuanJingSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsTaiXuanJingSymbols"/>
    <keyword type="function" name="xmlUCSIsTamil ()" link="libxml2-xmlunicode.html#xmlUCSIsTamil"/>
    <keyword type="function" name="xmlUCSIsTelugu ()" link="libxml2-xmlunicode.html#xmlUCSIsTelugu"/>
    <keyword type="function" name="xmlUCSIsThaana ()" link="libxml2-xmlunicode.html#xmlUCSIsThaana"/>
    <keyword type="function" name="xmlUCSIsThai ()" link="libxml2-xmlunicode.html#xmlUCSIsThai"/>
    <keyword type="function" name="xmlUCSIsTibetan ()" link="libxml2-xmlunicode.html#xmlUCSIsTibetan"/>
    <keyword type="function" name="xmlUCSIsUgaritic ()" link="libxml2-xmlunicode.html#xmlUCSIsUgaritic"/>
    <keyword type="function" name="xmlUCSIsUnifiedCanadianAboriginalSyllabics ()" link="libxml2-xmlunicode.html#xmlUCSIsUnifiedCanadianAboriginalSyllabics"/>
    <keyword type="function" name="xmlUCSIsVariationSelectors ()" link="libxml2-xmlunicode.html#xmlUCSIsVariationSelectors"/>
    <keyword type="function" name="xmlUCSIsVariationSelectorsSupplement ()" link="libxml2-xmlunicode.html#xmlUCSIsVariationSelectorsSupplement"/>
    <keyword type="function" name="xmlUCSIsYiRadicals ()" link="libxml2-xmlunicode.html#xmlUCSIsYiRadicals"/>
    <keyword type="function" name="xmlUCSIsYiSyllables ()" link="libxml2-xmlunicode.html#xmlUCSIsYiSyllables"/>
    <keyword type="function" name="xmlUCSIsYijingHexagramSymbols ()" link="libxml2-xmlunicode.html#xmlUCSIsYijingHexagramSymbols"/>
    <keyword type="function" name="xmlURIEscape ()" link="libxml2-uri.html#xmlURIEscape"/>
    <keyword type="function" name="xmlURIEscapeStr ()" link="libxml2-uri.html#xmlURIEscapeStr"/>
    <keyword type="function" name="xmlURIUnescapeString ()" link="libxml2-uri.html#xmlURIUnescapeString"/>
    <keyword type="function" name="xmlUTF8Charcmp ()" link="libxml2-xmlstring.html#xmlUTF8Charcmp"/>
    <keyword type="function" name="xmlUTF8Size ()" link="libxml2-xmlstring.html#xmlUTF8Size"/>
    <keyword type="function" name="xmlUTF8Strlen ()" link="libxml2-xmlstring.html#xmlUTF8Strlen"/>
    <keyword type="function" name="xmlUTF8Strloc ()" link="libxml2-xmlstring.html#xmlUTF8Strloc"/>
    <keyword type="function" name="xmlUTF8Strndup ()" link="libxml2-xmlstring.html#xmlUTF8Strndup"/>
    <keyword type="function" name="xmlUTF8Strpos ()" link="libxml2-xmlstring.html#xmlUTF8Strpos"/>
    <keyword type="function" name="xmlUTF8Strsize ()" link="libxml2-xmlstring.html#xmlUTF8Strsize"/>
    <keyword type="function" name="xmlUTF8Strsub ()" link="libxml2-xmlstring.html#xmlUTF8Strsub"/>
    <keyword type="function" name="xmlUnlinkNode ()" link="libxml2-tree.html#xmlUnlinkNode"/>
    <keyword type="function" name="xmlUnlockLibrary ()" link="libxml2-threads.html#xmlUnlockLibrary"/>
    <keyword type="function" name="xmlUnsetNsProp ()" link="libxml2-tree.html#xmlUnsetNsProp"/>
    <keyword type="function" name="xmlUnsetProp ()" link="libxml2-tree.html#xmlUnsetProp"/>
    <keyword type="function" name="xmlValidBuildContentModel ()" link="libxml2-valid.html#xmlValidBuildContentModel"/>
    <keyword type="function" name="xmlValidCtxtNormalizeAttributeValue ()" link="libxml2-valid.html#xmlValidCtxtNormalizeAttributeValue"/>
    <keyword type="function" name="xmlValidGetPotentialChildren ()" link="libxml2-valid.html#xmlValidGetPotentialChildren"/>
    <keyword type="function" name="xmlValidGetValidElements ()" link="libxml2-valid.html#xmlValidGetValidElements"/>
    <keyword type="function" name="xmlValidNormalizeAttributeValue ()" link="libxml2-valid.html#xmlValidNormalizeAttributeValue"/>
    <keyword type="function" name="xmlValidateAttributeDecl ()" link="libxml2-valid.html#xmlValidateAttributeDecl"/>
    <keyword type="function" name="xmlValidateAttributeValue ()" link="libxml2-valid.html#xmlValidateAttributeValue"/>
    <keyword type="function" name="xmlValidateDocument ()" link="libxml2-valid.html#xmlValidateDocument"/>
    <keyword type="function" name="xmlValidateDocumentFinal ()" link="libxml2-valid.html#xmlValidateDocumentFinal"/>
    <keyword type="function" name="xmlValidateDtd ()" link="libxml2-valid.html#xmlValidateDtd"/>
    <keyword type="function" name="xmlValidateDtdFinal ()" link="libxml2-valid.html#xmlValidateDtdFinal"/>
    <keyword type="function" name="xmlValidateElement ()" link="libxml2-valid.html#xmlValidateElement"/>
    <keyword type="function" name="xmlValidateElementDecl ()" link="libxml2-valid.html#xmlValidateElementDecl"/>
    <keyword type="function" name="xmlValidateNCName ()" link="libxml2-tree.html#xmlValidateNCName"/>
    <keyword type="function" name="xmlValidateNMToken ()" link="libxml2-tree.html#xmlValidateNMToken"/>
    <keyword type="function" name="xmlValidateName ()" link="libxml2-tree.html#xmlValidateName"/>
    <keyword type="function" name="xmlValidateNameValue ()" link="libxml2-valid.html#xmlValidateNameValue"/>
    <keyword type="function" name="xmlValidateNamesValue ()" link="libxml2-valid.html#xmlValidateNamesValue"/>
    <keyword type="function" name="xmlValidateNmtokenValue ()" link="libxml2-valid.html#xmlValidateNmtokenValue"/>
    <keyword type="function" name="xmlValidateNmtokensValue ()" link="libxml2-valid.html#xmlValidateNmtokensValue"/>
    <keyword type="function" name="xmlValidateNotationDecl ()" link="libxml2-valid.html#xmlValidateNotationDecl"/>
    <keyword type="function" name="xmlValidateNotationUse ()" link="libxml2-valid.html#xmlValidateNotationUse"/>
    <keyword type="function" name="xmlValidateOneAttribute ()" link="libxml2-valid.html#xmlValidateOneAttribute"/>
    <keyword type="function" name="xmlValidateOneElement ()" link="libxml2-valid.html#xmlValidateOneElement"/>
    <keyword type="function" name="xmlValidateOneNamespace ()" link="libxml2-valid.html#xmlValidateOneNamespace"/>
    <keyword type="function" name="xmlValidatePopElement ()" link="libxml2-valid.html#xmlValidatePopElement"/>
    <keyword type="function" name="xmlValidatePushCData ()" link="libxml2-valid.html#xmlValidatePushCData"/>
    <keyword type="function" name="xmlValidatePushElement ()" link="libxml2-valid.html#xmlValidatePushElement"/>
    <keyword type="function" name="xmlValidateQName ()" link="libxml2-tree.html#xmlValidateQName"/>
    <keyword type="function" name="xmlValidateRoot ()" link="libxml2-valid.html#xmlValidateRoot"/>
    <keyword type="function" name="xmlXIncludeFreeContext ()" link="libxml2-xinclude.html#xmlXIncludeFreeContext"/>
    <keyword type="function" name="xmlXIncludeNewContext ()" link="libxml2-xinclude.html#xmlXIncludeNewContext"/>
    <keyword type="function" name="xmlXIncludeProcess ()" link="libxml2-xinclude.html#xmlXIncludeProcess"/>
    <keyword type="function" name="xmlXIncludeProcessFlags ()" link="libxml2-xinclude.html#xmlXIncludeProcessFlags"/>
    <keyword type="function" name="xmlXIncludeProcessFlagsData ()" link="libxml2-xinclude.html#xmlXIncludeProcessFlagsData"/>
    <keyword type="function" name="xmlXIncludeProcessNode ()" link="libxml2-xinclude.html#xmlXIncludeProcessNode"/>
    <keyword type="function" name="xmlXIncludeProcessTree ()" link="libxml2-xinclude.html#xmlXIncludeProcessTree"/>
    <keyword type="function" name="xmlXIncludeProcessTreeFlags ()" link="libxml2-xinclude.html#xmlXIncludeProcessTreeFlags"/>
    <keyword type="function" name="xmlXIncludeProcessTreeFlagsData ()" link="libxml2-xinclude.html#xmlXIncludeProcessTreeFlagsData"/>
    <keyword type="function" name="xmlXIncludeSetFlags ()" link="libxml2-xinclude.html#xmlXIncludeSetFlags"/>
    <keyword type="function" name="xmlXPathAddValues ()" link="libxml2-xpathInternals.html#xmlXPathAddValues"/>
    <keyword type="function" name="xmlXPathBooleanFunction ()" link="libxml2-xpathInternals.html#xmlXPathBooleanFunction"/>
    <keyword type="function" name="xmlXPathCastBooleanToNumber ()" link="libxml2-xpath.html#xmlXPathCastBooleanToNumber"/>
    <keyword type="function" name="xmlXPathCastBooleanToString ()" link="libxml2-xpath.html#xmlXPathCastBooleanToString"/>
    <keyword type="function" name="xmlXPathCastNodeSetToBoolean ()" link="libxml2-xpath.html#xmlXPathCastNodeSetToBoolean"/>
    <keyword type="function" name="xmlXPathCastNodeSetToNumber ()" link="libxml2-xpath.html#xmlXPathCastNodeSetToNumber"/>
    <keyword type="function" name="xmlXPathCastNodeSetToString ()" link="libxml2-xpath.html#xmlXPathCastNodeSetToString"/>
    <keyword type="function" name="xmlXPathCastNodeToNumber ()" link="libxml2-xpath.html#xmlXPathCastNodeToNumber"/>
    <keyword type="function" name="xmlXPathCastNodeToString ()" link="libxml2-xpath.html#xmlXPathCastNodeToString"/>
    <keyword type="function" name="xmlXPathCastNumberToBoolean ()" link="libxml2-xpath.html#xmlXPathCastNumberToBoolean"/>
    <keyword type="function" name="xmlXPathCastNumberToString ()" link="libxml2-xpath.html#xmlXPathCastNumberToString"/>
    <keyword type="function" name="xmlXPathCastStringToBoolean ()" link="libxml2-xpath.html#xmlXPathCastStringToBoolean"/>
    <keyword type="function" name="xmlXPathCastStringToNumber ()" link="libxml2-xpath.html#xmlXPathCastStringToNumber"/>
    <keyword type="function" name="xmlXPathCastToBoolean ()" link="libxml2-xpath.html#xmlXPathCastToBoolean"/>
    <keyword type="function" name="xmlXPathCastToNumber ()" link="libxml2-xpath.html#xmlXPathCastToNumber"/>
    <keyword type="function" name="xmlXPathCastToString ()" link="libxml2-xpath.html#xmlXPathCastToString"/>
    <keyword type="function" name="xmlXPathCeilingFunction ()" link="libxml2-xpathInternals.html#xmlXPathCeilingFunction"/>
    <keyword type="function" name="xmlXPathCmpNodes ()" link="libxml2-xpath.html#xmlXPathCmpNodes"/>
    <keyword type="function" name="xmlXPathCompareValues ()" link="libxml2-xpathInternals.html#xmlXPathCompareValues"/>
    <keyword type="function" name="xmlXPathCompile ()" link="libxml2-xpath.html#xmlXPathCompile"/>
    <keyword type="function" name="xmlXPathCompiledEval ()" link="libxml2-xpath.html#xmlXPathCompiledEval"/>
    <keyword type="function" name="xmlXPathCompiledEvalToBoolean ()" link="libxml2-xpath.html#xmlXPathCompiledEvalToBoolean"/>
    <keyword type="function" name="xmlXPathConcatFunction ()" link="libxml2-xpathInternals.html#xmlXPathConcatFunction"/>
    <keyword type="function" name="xmlXPathContainsFunction ()" link="libxml2-xpathInternals.html#xmlXPathContainsFunction"/>
    <keyword type="function" name="xmlXPathContextSetCache ()" link="libxml2-xpath.html#xmlXPathContextSetCache"/>
    <keyword type="function" name="xmlXPathConvertBoolean ()" link="libxml2-xpath.html#xmlXPathConvertBoolean"/>
    <keyword type="function" name="xmlXPathConvertNumber ()" link="libxml2-xpath.html#xmlXPathConvertNumber"/>
    <keyword type="function" name="xmlXPathConvertString ()" link="libxml2-xpath.html#xmlXPathConvertString"/>
    <keyword type="function" name="xmlXPathCountFunction ()" link="libxml2-xpathInternals.html#xmlXPathCountFunction"/>
    <keyword type="function" name="xmlXPathCtxtCompile ()" link="libxml2-xpath.html#xmlXPathCtxtCompile"/>
    <keyword type="function" name="xmlXPathDebugDumpCompExpr ()" link="libxml2-xpathInternals.html#xmlXPathDebugDumpCompExpr"/>
    <keyword type="function" name="xmlXPathDebugDumpObject ()" link="libxml2-xpathInternals.html#xmlXPathDebugDumpObject"/>
    <keyword type="function" name="xmlXPathDifference ()" link="libxml2-xpathInternals.html#xmlXPathDifference"/>
    <keyword type="function" name="xmlXPathDistinct ()" link="libxml2-xpathInternals.html#xmlXPathDistinct"/>
    <keyword type="function" name="xmlXPathDistinctSorted ()" link="libxml2-xpathInternals.html#xmlXPathDistinctSorted"/>
    <keyword type="function" name="xmlXPathDivValues ()" link="libxml2-xpathInternals.html#xmlXPathDivValues"/>
    <keyword type="function" name="xmlXPathEqualValues ()" link="libxml2-xpathInternals.html#xmlXPathEqualValues"/>
    <keyword type="function" name="xmlXPathErr ()" link="libxml2-xpathInternals.html#xmlXPathErr"/>
    <keyword type="function" name="xmlXPathEval ()" link="libxml2-xpath.html#xmlXPathEval"/>
    <keyword type="function" name="xmlXPathEvalExpr ()" link="libxml2-xpathInternals.html#xmlXPathEvalExpr"/>
    <keyword type="function" name="xmlXPathEvalExpression ()" link="libxml2-xpath.html#xmlXPathEvalExpression"/>
    <keyword type="function" name="xmlXPathEvalPredicate ()" link="libxml2-xpath.html#xmlXPathEvalPredicate"/>
    <keyword type="function" name="xmlXPathEvaluatePredicateResult ()" link="libxml2-xpathInternals.html#xmlXPathEvaluatePredicateResult"/>
    <keyword type="function" name="xmlXPathFalseFunction ()" link="libxml2-xpathInternals.html#xmlXPathFalseFunction"/>
    <keyword type="function" name="xmlXPathFloorFunction ()" link="libxml2-xpathInternals.html#xmlXPathFloorFunction"/>
    <keyword type="function" name="xmlXPathFreeCompExpr ()" link="libxml2-xpath.html#xmlXPathFreeCompExpr"/>
    <keyword type="function" name="xmlXPathFreeContext ()" link="libxml2-xpath.html#xmlXPathFreeContext"/>
    <keyword type="function" name="xmlXPathFreeNodeSet ()" link="libxml2-xpath.html#xmlXPathFreeNodeSet"/>
    <keyword type="function" name="xmlXPathFreeNodeSetList ()" link="libxml2-xpath.html#xmlXPathFreeNodeSetList"/>
    <keyword type="function" name="xmlXPathFreeObject ()" link="libxml2-xpath.html#xmlXPathFreeObject"/>
    <keyword type="function" name="xmlXPathFreeParserContext ()" link="libxml2-xpathInternals.html#xmlXPathFreeParserContext"/>
    <keyword type="function" name="xmlXPathFunctionLookup ()" link="libxml2-xpathInternals.html#xmlXPathFunctionLookup"/>
    <keyword type="function" name="xmlXPathFunctionLookupNS ()" link="libxml2-xpathInternals.html#xmlXPathFunctionLookupNS"/>
    <keyword type="function" name="xmlXPathHasSameNodes ()" link="libxml2-xpathInternals.html#xmlXPathHasSameNodes"/>
    <keyword type="function" name="xmlXPathIdFunction ()" link="libxml2-xpathInternals.html#xmlXPathIdFunction"/>
    <keyword type="function" name="xmlXPathInit ()" link="libxml2-xpath.html#xmlXPathInit"/>
    <keyword type="function" name="xmlXPathIntersection ()" link="libxml2-xpathInternals.html#xmlXPathIntersection"/>
    <keyword type="function" name="xmlXPathIsInf ()" link="libxml2-xpath.html#xmlXPathIsInf"/>
    <keyword type="function" name="xmlXPathIsNaN ()" link="libxml2-xpath.html#xmlXPathIsNaN"/>
    <keyword type="function" name="xmlXPathIsNodeType ()" link="libxml2-xpathInternals.html#xmlXPathIsNodeType"/>
    <keyword type="function" name="xmlXPathLangFunction ()" link="libxml2-xpathInternals.html#xmlXPathLangFunction"/>
    <keyword type="function" name="xmlXPathLastFunction ()" link="libxml2-xpathInternals.html#xmlXPathLastFunction"/>
    <keyword type="function" name="xmlXPathLeading ()" link="libxml2-xpathInternals.html#xmlXPathLeading"/>
    <keyword type="function" name="xmlXPathLeadingSorted ()" link="libxml2-xpathInternals.html#xmlXPathLeadingSorted"/>
    <keyword type="function" name="xmlXPathLocalNameFunction ()" link="libxml2-xpathInternals.html#xmlXPathLocalNameFunction"/>
    <keyword type="function" name="xmlXPathModValues ()" link="libxml2-xpathInternals.html#xmlXPathModValues"/>
    <keyword type="function" name="xmlXPathMultValues ()" link="libxml2-xpathInternals.html#xmlXPathMultValues"/>
    <keyword type="function" name="xmlXPathNamespaceURIFunction ()" link="libxml2-xpathInternals.html#xmlXPathNamespaceURIFunction"/>
    <keyword type="function" name="xmlXPathNewBoolean ()" link="libxml2-xpathInternals.html#xmlXPathNewBoolean"/>
    <keyword type="function" name="xmlXPathNewCString ()" link="libxml2-xpathInternals.html#xmlXPathNewCString"/>
    <keyword type="function" name="xmlXPathNewContext ()" link="libxml2-xpath.html#xmlXPathNewContext"/>
    <keyword type="function" name="xmlXPathNewFloat ()" link="libxml2-xpathInternals.html#xmlXPathNewFloat"/>
    <keyword type="function" name="xmlXPathNewNodeSet ()" link="libxml2-xpathInternals.html#xmlXPathNewNodeSet"/>
    <keyword type="function" name="xmlXPathNewNodeSetList ()" link="libxml2-xpathInternals.html#xmlXPathNewNodeSetList"/>
    <keyword type="function" name="xmlXPathNewParserContext ()" link="libxml2-xpathInternals.html#xmlXPathNewParserContext"/>
    <keyword type="function" name="xmlXPathNewString ()" link="libxml2-xpathInternals.html#xmlXPathNewString"/>
    <keyword type="function" name="xmlXPathNewValueTree ()" link="libxml2-xpathInternals.html#xmlXPathNewValueTree"/>
    <keyword type="function" name="xmlXPathNextAncestor ()" link="libxml2-xpathInternals.html#xmlXPathNextAncestor"/>
    <keyword type="function" name="xmlXPathNextAncestorOrSelf ()" link="libxml2-xpathInternals.html#xmlXPathNextAncestorOrSelf"/>
    <keyword type="function" name="xmlXPathNextAttribute ()" link="libxml2-xpathInternals.html#xmlXPathNextAttribute"/>
    <keyword type="function" name="xmlXPathNextChild ()" link="libxml2-xpathInternals.html#xmlXPathNextChild"/>
    <keyword type="function" name="xmlXPathNextDescendant ()" link="libxml2-xpathInternals.html#xmlXPathNextDescendant"/>
    <keyword type="function" name="xmlXPathNextDescendantOrSelf ()" link="libxml2-xpathInternals.html#xmlXPathNextDescendantOrSelf"/>
    <keyword type="function" name="xmlXPathNextFollowing ()" link="libxml2-xpathInternals.html#xmlXPathNextFollowing"/>
    <keyword type="function" name="xmlXPathNextFollowingSibling ()" link="libxml2-xpathInternals.html#xmlXPathNextFollowingSibling"/>
    <keyword type="function" name="xmlXPathNextNamespace ()" link="libxml2-xpathInternals.html#xmlXPathNextNamespace"/>
    <keyword type="function" name="xmlXPathNextParent ()" link="libxml2-xpathInternals.html#xmlXPathNextParent"/>
    <keyword type="function" name="xmlXPathNextPreceding ()" link="libxml2-xpathInternals.html#xmlXPathNextPreceding"/>
    <keyword type="function" name="xmlXPathNextPrecedingSibling ()" link="libxml2-xpathInternals.html#xmlXPathNextPrecedingSibling"/>
    <keyword type="function" name="xmlXPathNextSelf ()" link="libxml2-xpathInternals.html#xmlXPathNextSelf"/>
    <keyword type="function" name="xmlXPathNodeEval ()" link="libxml2-xpath.html#xmlXPathNodeEval"/>
    <keyword type="function" name="xmlXPathNodeLeading ()" link="libxml2-xpathInternals.html#xmlXPathNodeLeading"/>
    <keyword type="function" name="xmlXPathNodeLeadingSorted ()" link="libxml2-xpathInternals.html#xmlXPathNodeLeadingSorted"/>
    <keyword type="function" name="xmlXPathNodeSetAdd ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetAdd"/>
    <keyword type="function" name="xmlXPathNodeSetAddNs ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetAddNs"/>
    <keyword type="function" name="xmlXPathNodeSetAddUnique ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetAddUnique"/>
    <keyword type="function" name="xmlXPathNodeSetContains ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetContains"/>
    <keyword type="function" name="xmlXPathNodeSetCreate ()" link="libxml2-xpath.html#xmlXPathNodeSetCreate"/>
    <keyword type="function" name="xmlXPathNodeSetDel ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetDel"/>
    <keyword type="function" name="xmlXPathNodeSetFreeNs ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetFreeNs"/>
    <keyword type="function" name="xmlXPathNodeSetMerge ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetMerge"/>
    <keyword type="function" name="xmlXPathNodeSetRemove ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetRemove"/>
    <keyword type="function" name="xmlXPathNodeSetSort ()" link="libxml2-xpathInternals.html#xmlXPathNodeSetSort"/>
    <keyword type="function" name="xmlXPathNodeTrailing ()" link="libxml2-xpathInternals.html#xmlXPathNodeTrailing"/>
    <keyword type="function" name="xmlXPathNodeTrailingSorted ()" link="libxml2-xpathInternals.html#xmlXPathNodeTrailingSorted"/>
    <keyword type="function" name="xmlXPathNormalizeFunction ()" link="libxml2-xpathInternals.html#xmlXPathNormalizeFunction"/>
    <keyword type="function" name="xmlXPathNotEqualValues ()" link="libxml2-xpathInternals.html#xmlXPathNotEqualValues"/>
    <keyword type="function" name="xmlXPathNotFunction ()" link="libxml2-xpathInternals.html#xmlXPathNotFunction"/>
    <keyword type="function" name="xmlXPathNsLookup ()" link="libxml2-xpathInternals.html#xmlXPathNsLookup"/>
    <keyword type="function" name="xmlXPathNumberFunction ()" link="libxml2-xpathInternals.html#xmlXPathNumberFunction"/>
    <keyword type="function" name="xmlXPathObjectCopy ()" link="libxml2-xpath.html#xmlXPathObjectCopy"/>
    <keyword type="function" name="xmlXPathOrderDocElems ()" link="libxml2-xpath.html#xmlXPathOrderDocElems"/>
    <keyword type="function" name="xmlXPathParseNCName ()" link="libxml2-xpathInternals.html#xmlXPathParseNCName"/>
    <keyword type="function" name="xmlXPathParseName ()" link="libxml2-xpathInternals.html#xmlXPathParseName"/>
    <keyword type="function" name="xmlXPathPopBoolean ()" link="libxml2-xpathInternals.html#xmlXPathPopBoolean"/>
    <keyword type="function" name="xmlXPathPopExternal ()" link="libxml2-xpathInternals.html#xmlXPathPopExternal"/>
    <keyword type="function" name="xmlXPathPopNodeSet ()" link="libxml2-xpathInternals.html#xmlXPathPopNodeSet"/>
    <keyword type="function" name="xmlXPathPopNumber ()" link="libxml2-xpathInternals.html#xmlXPathPopNumber"/>
    <keyword type="function" name="xmlXPathPopString ()" link="libxml2-xpathInternals.html#xmlXPathPopString"/>
    <keyword type="function" name="xmlXPathPositionFunction ()" link="libxml2-xpathInternals.html#xmlXPathPositionFunction"/>
    <keyword type="function" name="xmlXPathRegisterAllFunctions ()" link="libxml2-xpathInternals.html#xmlXPathRegisterAllFunctions"/>
    <keyword type="function" name="xmlXPathRegisterFunc ()" link="libxml2-xpathInternals.html#xmlXPathRegisterFunc"/>
    <keyword type="function" name="xmlXPathRegisterFuncLookup ()" link="libxml2-xpathInternals.html#xmlXPathRegisterFuncLookup"/>
    <keyword type="function" name="xmlXPathRegisterFuncNS ()" link="libxml2-xpathInternals.html#xmlXPathRegisterFuncNS"/>
    <keyword type="function" name="xmlXPathRegisterNs ()" link="libxml2-xpathInternals.html#xmlXPathRegisterNs"/>
    <keyword type="function" name="xmlXPathRegisterVariable ()" link="libxml2-xpathInternals.html#xmlXPathRegisterVariable"/>
    <keyword type="function" name="xmlXPathRegisterVariableLookup ()" link="libxml2-xpathInternals.html#xmlXPathRegisterVariableLookup"/>
    <keyword type="function" name="xmlXPathRegisterVariableNS ()" link="libxml2-xpathInternals.html#xmlXPathRegisterVariableNS"/>
    <keyword type="function" name="xmlXPathRegisteredFuncsCleanup ()" link="libxml2-xpathInternals.html#xmlXPathRegisteredFuncsCleanup"/>
    <keyword type="function" name="xmlXPathRegisteredNsCleanup ()" link="libxml2-xpathInternals.html#xmlXPathRegisteredNsCleanup"/>
    <keyword type="function" name="xmlXPathRegisteredVariablesCleanup ()" link="libxml2-xpathInternals.html#xmlXPathRegisteredVariablesCleanup"/>
    <keyword type="function" name="xmlXPathRoot ()" link="libxml2-xpathInternals.html#xmlXPathRoot"/>
    <keyword type="function" name="xmlXPathRoundFunction ()" link="libxml2-xpathInternals.html#xmlXPathRoundFunction"/>
    <keyword type="function" name="xmlXPathSetContextNode ()" link="libxml2-xpath.html#xmlXPathSetContextNode"/>
    <keyword type="function" name="xmlXPathStartsWithFunction ()" link="libxml2-xpathInternals.html#xmlXPathStartsWithFunction"/>
    <keyword type="function" name="xmlXPathStringEvalNumber ()" link="libxml2-xpathInternals.html#xmlXPathStringEvalNumber"/>
    <keyword type="function" name="xmlXPathStringFunction ()" link="libxml2-xpathInternals.html#xmlXPathStringFunction"/>
    <keyword type="function" name="xmlXPathStringLengthFunction ()" link="libxml2-xpathInternals.html#xmlXPathStringLengthFunction"/>
    <keyword type="function" name="xmlXPathSubValues ()" link="libxml2-xpathInternals.html#xmlXPathSubValues"/>
    <keyword type="function" name="xmlXPathSubstringAfterFunction ()" link="libxml2-xpathInternals.html#xmlXPathSubstringAfterFunction"/>
    <keyword type="function" name="xmlXPathSubstringBeforeFunction ()" link="libxml2-xpathInternals.html#xmlXPathSubstringBeforeFunction"/>
    <keyword type="function" name="xmlXPathSubstringFunction ()" link="libxml2-xpathInternals.html#xmlXPathSubstringFunction"/>
    <keyword type="function" name="xmlXPathSumFunction ()" link="libxml2-xpathInternals.html#xmlXPathSumFunction"/>
    <keyword type="function" name="xmlXPathTrailing ()" link="libxml2-xpathInternals.html#xmlXPathTrailing"/>
    <keyword type="function" name="xmlXPathTrailingSorted ()" link="libxml2-xpathInternals.html#xmlXPathTrailingSorted"/>
    <keyword type="function" name="xmlXPathTranslateFunction ()" link="libxml2-xpathInternals.html#xmlXPathTranslateFunction"/>
    <keyword type="function" name="xmlXPathTrueFunction ()" link="libxml2-xpathInternals.html#xmlXPathTrueFunction"/>
    <keyword type="function" name="xmlXPathValueFlipSign ()" link="libxml2-xpathInternals.html#xmlXPathValueFlipSign"/>
    <keyword type="function" name="xmlXPathVariableLookup ()" link="libxml2-xpathInternals.html#xmlXPathVariableLookup"/>
    <keyword type="function" name="xmlXPathVariableLookupNS ()" link="libxml2-xpathInternals.html#xmlXPathVariableLookupNS"/>
    <keyword type="function" name="xmlXPathWrapCString ()" link="libxml2-xpathInternals.html#xmlXPathWrapCString"/>
    <keyword type="function" name="xmlXPathWrapExternal ()" link="libxml2-xpathInternals.html#xmlXPathWrapExternal"/>
    <keyword type="function" name="xmlXPathWrapNodeSet ()" link="libxml2-xpathInternals.html#xmlXPathWrapNodeSet"/>
    <keyword type="function" name="xmlXPathWrapString ()" link="libxml2-xpathInternals.html#xmlXPathWrapString"/>
    <keyword type="function" name="xmlXPatherror ()" link="libxml2-xpathInternals.html#xmlXPatherror"/>
    <keyword type="function" name="xmlXPtrBuildNodeList ()" link="libxml2-xpointer.html#xmlXPtrBuildNodeList"/>
    <keyword type="function" name="xmlXPtrEval ()" link="libxml2-xpointer.html#xmlXPtrEval"/>
    <keyword type="function" name="xmlXPtrEvalRangePredicate ()" link="libxml2-xpointer.html#xmlXPtrEvalRangePredicate"/>
    <keyword type="function" name="xmlXPtrFreeLocationSet ()" link="libxml2-xpointer.html#xmlXPtrFreeLocationSet"/>
    <keyword type="function" name="xmlXPtrLocationSetAdd ()" link="libxml2-xpointer.html#xmlXPtrLocationSetAdd"/>
    <keyword type="function" name="xmlXPtrLocationSetCreate ()" link="libxml2-xpointer.html#xmlXPtrLocationSetCreate"/>
    <keyword type="function" name="xmlXPtrLocationSetDel ()" link="libxml2-xpointer.html#xmlXPtrLocationSetDel"/>
    <keyword type="function" name="xmlXPtrLocationSetMerge ()" link="libxml2-xpointer.html#xmlXPtrLocationSetMerge"/>
    <keyword type="function" name="xmlXPtrLocationSetRemove ()" link="libxml2-xpointer.html#xmlXPtrLocationSetRemove"/>
    <keyword type="function" name="xmlXPtrNewCollapsedRange ()" link="libxml2-xpointer.html#xmlXPtrNewCollapsedRange"/>
    <keyword type="function" name="xmlXPtrNewContext ()" link="libxml2-xpointer.html#xmlXPtrNewContext"/>
    <keyword type="function" name="xmlXPtrNewLocationSetNodeSet ()" link="libxml2-xpointer.html#xmlXPtrNewLocationSetNodeSet"/>
    <keyword type="function" name="xmlXPtrNewLocationSetNodes ()" link="libxml2-xpointer.html#xmlXPtrNewLocationSetNodes"/>
    <keyword type="function" name="xmlXPtrNewRange ()" link="libxml2-xpointer.html#xmlXPtrNewRange"/>
    <keyword type="function" name="xmlXPtrNewRangeNodeObject ()" link="libxml2-xpointer.html#xmlXPtrNewRangeNodeObject"/>
    <keyword type="function" name="xmlXPtrNewRangeNodePoint ()" link="libxml2-xpointer.html#xmlXPtrNewRangeNodePoint"/>
    <keyword type="function" name="xmlXPtrNewRangeNodes ()" link="libxml2-xpointer.html#xmlXPtrNewRangeNodes"/>
    <keyword type="function" name="xmlXPtrNewRangePointNode ()" link="libxml2-xpointer.html#xmlXPtrNewRangePointNode"/>
    <keyword type="function" name="xmlXPtrNewRangePoints ()" link="libxml2-xpointer.html#xmlXPtrNewRangePoints"/>
    <keyword type="function" name="xmlXPtrRangeToFunction ()" link="libxml2-xpointer.html#xmlXPtrRangeToFunction"/>
    <keyword type="function" name="xmlXPtrWrapLocationSet ()" link="libxml2-xpointer.html#xmlXPtrWrapLocationSet"/>
  </functions>
</book>
gtk-doc/html/libxml2/libxml2-tree.html000064400000713600151730335320013616 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>tree: interfaces for tree manipulation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-threads.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-uri.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">tree</span></h2>
<p>tree - interfaces for tree manipulation</p>
<p>this module describes the structures found in an tree resulting from an XML or HTML parsing, as well as the API provided for various processing on that tree </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#BASE_BUFFER_SIZE">BASE_BUFFER_SIZE</a>;
#define <a href="#LIBXML2_NEW_BUFFER">LIBXML2_NEW_BUFFER</a>;
#define <a href="#XML_DOCB_DOCUMENT_NODE">XML_DOCB_DOCUMENT_NODE</a>;
#define <a href="#XML_GET_CONTENT">XML_GET_CONTENT</a>;
#define <a href="#XML_GET_LINE">XML_GET_LINE</a>;
#define <a href="#XML_LOCAL_NAMESPACE">XML_LOCAL_NAMESPACE</a>;
#define <a href="#XML_XML_ID">XML_XML_ID</a>;
#define <a href="#XML_XML_NAMESPACE">XML_XML_NAMESPACE</a>;
#define <a href="#xmlChildrenNode">xmlChildrenNode</a>;
#define <a href="#xmlRootNode">xmlRootNode</a>;
typedef struct _xmlAttr <a href="#xmlAttr">xmlAttr</a>;
typedef <a href="libxml2-tree.html#xmlAttr">xmlAttr</a> * <a href="#xmlAttrPtr">xmlAttrPtr</a>;
typedef struct _xmlAttribute <a href="#xmlAttribute">xmlAttribute</a>;
typedef enum <a href="#xmlAttributeDefault">xmlAttributeDefault</a>;
typedef <a href="libxml2-tree.html#xmlAttribute">xmlAttribute</a> * <a href="#xmlAttributePtr">xmlAttributePtr</a>;
typedef enum <a href="#xmlAttributeType">xmlAttributeType</a>;
typedef struct _xmlBuf <a href="#xmlBuf">xmlBuf</a>;
typedef <a href="libxml2-tree.html#xmlBuf">xmlBuf</a> * <a href="#xmlBufPtr">xmlBufPtr</a>;
typedef struct _xmlBuffer <a href="#xmlBuffer">xmlBuffer</a>;
typedef enum <a href="#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>;
typedef <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * <a href="#xmlBufferPtr">xmlBufferPtr</a>;
typedef struct _xmlDOMWrapCtxt <a href="#xmlDOMWrapCtxt">xmlDOMWrapCtxt</a>;
typedef <a href="libxml2-tree.html#xmlDOMWrapCtxt">xmlDOMWrapCtxt</a> * <a href="#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a>;
typedef struct _xmlDoc <a href="#xmlDoc">xmlDoc</a>;
typedef enum <a href="#xmlDocProperties">xmlDocProperties</a>;
typedef <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * <a href="#xmlDocPtr">xmlDocPtr</a>;
typedef struct _xmlDtd <a href="#xmlDtd">xmlDtd</a>;
typedef <a href="libxml2-tree.html#xmlDtd">xmlDtd</a> * <a href="#xmlDtdPtr">xmlDtdPtr</a>;
typedef struct _xmlElement <a href="#xmlElement">xmlElement</a>;
typedef struct _xmlElementContent <a href="#xmlElementContent">xmlElementContent</a>;
typedef enum <a href="#xmlElementContentOccur">xmlElementContentOccur</a>;
typedef <a href="libxml2-tree.html#xmlElementContent">xmlElementContent</a> * <a href="#xmlElementContentPtr">xmlElementContentPtr</a>;
typedef enum <a href="#xmlElementContentType">xmlElementContentType</a>;
typedef <a href="libxml2-tree.html#xmlElement">xmlElement</a> * <a href="#xmlElementPtr">xmlElementPtr</a>;
typedef enum <a href="#xmlElementType">xmlElementType</a>;
typedef enum <a href="#xmlElementTypeVal">xmlElementTypeVal</a>;
typedef struct _xmlEntity <a href="#xmlEntity">xmlEntity</a>;
typedef <a href="libxml2-tree.html#xmlEntity">xmlEntity</a> * <a href="#xmlEntityPtr">xmlEntityPtr</a>;
typedef struct _xmlEnumeration <a href="#xmlEnumeration">xmlEnumeration</a>;
typedef <a href="libxml2-tree.html#xmlEnumeration">xmlEnumeration</a> * <a href="#xmlEnumerationPtr">xmlEnumerationPtr</a>;
typedef struct _xmlID <a href="#xmlID">xmlID</a>;
typedef <a href="libxml2-tree.html#xmlID">xmlID</a> * <a href="#xmlIDPtr">xmlIDPtr</a>;
typedef struct _xmlNode <a href="#xmlNode">xmlNode</a>;
typedef <a href="libxml2-tree.html#xmlNode">xmlNode</a> * <a href="#xmlNodePtr">xmlNodePtr</a>;
typedef struct _xmlNotation <a href="#xmlNotation">xmlNotation</a>;
typedef <a href="libxml2-tree.html#xmlNotation">xmlNotation</a> * <a href="#xmlNotationPtr">xmlNotationPtr</a>;
typedef struct _xmlNs <a href="#xmlNs">xmlNs</a>;
typedef <a href="libxml2-tree.html#xmlNs">xmlNs</a> * <a href="#xmlNsPtr">xmlNsPtr</a>;
typedef <a href="libxml2-tree.html#xmlElementType">xmlElementType</a> <a href="#xmlNsType">xmlNsType</a>;
typedef struct _xmlOutputBuffer <a href="#xmlOutputBuffer">xmlOutputBuffer</a>;
typedef <a href="libxml2-tree.html#xmlOutputBuffer">xmlOutputBuffer</a> * <a href="#xmlOutputBufferPtr">xmlOutputBufferPtr</a>;
typedef struct _xmlParserCtxt <a href="#xmlParserCtxt">xmlParserCtxt</a>;
typedef <a href="libxml2-tree.html#xmlParserCtxt">xmlParserCtxt</a> * <a href="#xmlParserCtxtPtr">xmlParserCtxtPtr</a>;
typedef struct _xmlParserInput <a href="#xmlParserInput">xmlParserInput</a>;
typedef struct _xmlParserInputBuffer <a href="#xmlParserInputBuffer">xmlParserInputBuffer</a>;
typedef <a href="libxml2-tree.html#xmlParserInputBuffer">xmlParserInputBuffer</a> * <a href="#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>;
typedef <a href="libxml2-tree.html#xmlParserInput">xmlParserInput</a> * <a href="#xmlParserInputPtr">xmlParserInputPtr</a>;
typedef struct _xmlRef <a href="#xmlRef">xmlRef</a>;
typedef <a href="libxml2-tree.html#xmlRef">xmlRef</a> * <a href="#xmlRefPtr">xmlRefPtr</a>;
typedef struct _xmlSAXHandler <a href="#xmlSAXHandler">xmlSAXHandler</a>;
typedef <a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * <a href="#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a>;
typedef struct _xmlSAXLocator <a href="#xmlSAXLocator">xmlSAXLocator</a>;
typedef <a href="libxml2-tree.html#xmlSAXLocator">xmlSAXLocator</a> * <a href="#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a>;
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlAddChild">xmlAddChild</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlAddChildList">xmlAddChildList</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlAddNextSibling">xmlAddNextSibling</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlAddPrevSibling">xmlAddPrevSibling</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlAddSibling">xmlAddSibling</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
void	<a href="#xmlAttrSerializeTxtContent">xmlAttrSerializeTxtContent</a>	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBufContent">xmlBufContent</a>		(const <a href="libxml2-tree.html#xmlBuf">xmlBuf</a> * buf);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBufEnd">xmlBufEnd</a>		(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf);
int	<a href="#xmlBufGetNodeContent">xmlBufGetNodeContent</a>		(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
size_t	<a href="#xmlBufNodeDump">xmlBufNodeDump</a>			(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format);
size_t	<a href="#xmlBufShrink">xmlBufShrink</a>			(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 size_t len);
size_t	<a href="#xmlBufUse">xmlBufUse</a>			(const <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf);
int	<a href="#xmlBufferAdd">xmlBufferAdd</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len);
int	<a href="#xmlBufferAddHead">xmlBufferAddHead</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len);
int	<a href="#xmlBufferCCat">xmlBufferCCat</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const char * str);
int	<a href="#xmlBufferCat">xmlBufferCat</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBufferContent">xmlBufferContent</a>	(const <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * buf);
<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	<a href="#xmlBufferCreate">xmlBufferCreate</a>		(void);
<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	<a href="#xmlBufferCreateSize">xmlBufferCreateSize</a>	(size_t size);
<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	<a href="#xmlBufferCreateStatic">xmlBufferCreateStatic</a>	(void * mem, <br>					 size_t size);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBufferDetach">xmlBufferDetach</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf);
int	<a href="#xmlBufferDump">xmlBufferDump</a>			(FILE * file, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf);
void	<a href="#xmlBufferEmpty">xmlBufferEmpty</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf);
void	<a href="#xmlBufferFree">xmlBufferFree</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf);
int	<a href="#xmlBufferGrow">xmlBufferGrow</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int len);
int	<a href="#xmlBufferLength">xmlBufferLength</a>			(const <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * buf);
int	<a href="#xmlBufferResize">xmlBufferResize</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int size);
void	<a href="#xmlBufferSetAllocationScheme">xmlBufferSetAllocationScheme</a>	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> scheme);
int	<a href="#xmlBufferShrink">xmlBufferShrink</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int len);
void	<a href="#xmlBufferWriteCHAR">xmlBufferWriteCHAR</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string);
void	<a href="#xmlBufferWriteChar">xmlBufferWriteChar</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const char * string);
void	<a href="#xmlBufferWriteQuotedString">xmlBufferWriteQuotedString</a>	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlBuildQName">xmlBuildQName</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ncname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * memory, <br>					 int len);
unsigned long	<a href="#xmlChildElementCount">xmlChildElementCount</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCopyDoc">xmlCopyDoc</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int recursive);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlCopyDtd">xmlCopyDtd</a>		(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlCopyNamespace">xmlCopyNamespace</a>	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlCopyNamespaceList">xmlCopyNamespaceList</a>	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlCopyNode">xmlCopyNode</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int extended);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlCopyNodeList">xmlCopyNodeList</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlCopyProp">xmlCopyProp</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> target, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlCopyPropList">xmlCopyPropList</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> target, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlCreateIntSubset">xmlCreateIntSubset</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
typedef <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> <a href="#xmlDOMWrapAcquireNsFunction">xmlDOMWrapAcquireNsFunction</a>	(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nsName, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nsPrefix);
int	<a href="#xmlDOMWrapAdoptNode">xmlDOMWrapAdoptNode</a>		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> sourceDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> destDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> destParent, <br>					 int options);
int	<a href="#xmlDOMWrapCloneNode">xmlDOMWrapCloneNode</a>		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> sourceDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * resNode, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> destDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> destParent, <br>					 int deep, <br>					 int options);
void	<a href="#xmlDOMWrapFreeCtxt">xmlDOMWrapFreeCtxt</a>		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a>	<a href="#xmlDOMWrapNewCtxt">xmlDOMWrapNewCtxt</a>	(void);
int	<a href="#xmlDOMWrapReconcileNamespaces">xmlDOMWrapReconcileNamespaces</a>	(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 int options);
int	<a href="#xmlDOMWrapRemoveNode">xmlDOMWrapRemoveNode</a>		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int options);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlDocCopyNode">xmlDocCopyNode</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int extended);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlDocCopyNodeList">xmlDocCopyNodeList</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlDocDump">xmlDocDump</a>			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur);
void	<a href="#xmlDocDumpFormatMemory">xmlDocDumpFormatMemory</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size, <br>					 int format);
void	<a href="#xmlDocDumpFormatMemoryEnc">xmlDocDumpFormatMemoryEnc</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> out_doc, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr, <br>					 int * doc_txt_len, <br>					 const char * txt_encoding, <br>					 int format);
void	<a href="#xmlDocDumpMemory">xmlDocDumpMemory</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size);
void	<a href="#xmlDocDumpMemoryEnc">xmlDocDumpMemoryEnc</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> out_doc, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr, <br>					 int * doc_txt_len, <br>					 const char * txt_encoding);
int	<a href="#xmlDocFormatDump">xmlDocFormatDump</a>		(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 int format);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlDocGetRootElement">xmlDocGetRootElement</a>	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlDocSetRootElement">xmlDocSetRootElement</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> root);
void	<a href="#xmlElemDump">xmlElemDump</a>			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlFirstElementChild">xmlFirstElementChild</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent);
void	<a href="#xmlFreeDoc">xmlFreeDoc</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur);
void	<a href="#xmlFreeDtd">xmlFreeDtd</a>			(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> cur);
void	<a href="#xmlFreeNode">xmlFreeNode</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
void	<a href="#xmlFreeNodeList">xmlFreeNodeList</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
void	<a href="#xmlFreeNs">xmlFreeNs</a>			(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur);
void	<a href="#xmlFreeNsList">xmlFreeNsList</a>			(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur);
void	<a href="#xmlFreeProp">xmlFreeProp</a>			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur);
void	<a href="#xmlFreePropList">xmlFreePropList</a>			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur);
<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	<a href="#xmlGetBufferAllocationScheme">xmlGetBufferAllocationScheme</a>	(void);
int	<a href="#xmlGetCompressMode">xmlGetCompressMode</a>		(void);
int	<a href="#xmlGetDocCompressMode">xmlGetDocCompressMode</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlGetIntSubset">xmlGetIntSubset</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlGetLastChild">xmlGetLastChild</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * parent);
long	<a href="#xmlGetLineNo">xmlGetLineNo</a>			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlGetNoNsProp">xmlGetNoNsProp</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlGetNodePath">xmlGetNodePath</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> *	<a href="#xmlGetNsList">xmlGetNsList</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlGetNsProp">xmlGetNsProp</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlGetProp">xmlGetProp</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlHasNsProp">xmlHasNsProp</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlHasProp">xmlHasProp</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlIsBlankNode">xmlIsBlankNode</a>			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node);
int	<a href="#xmlIsXHTML">xmlIsXHTML</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicID);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlLastElementChild">xmlLastElementChild</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewCDataBlock">xmlNewCDataBlock</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewCharRef">xmlNewCharRef</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewChild">xmlNewChild</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewComment">xmlNewComment</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlNewDoc">xmlNewDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * version);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocComment">xmlNewDocComment</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocFragment">xmlNewDocFragment</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocNode">xmlNewDocNode</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocNodeEatName">xmlNewDocNodeEatName</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocPI">xmlNewDocPI</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlNewDocProp">xmlNewDocProp</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocRawNode">xmlNewDocRawNode</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocText">xmlNewDocText</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewDocTextLen">xmlNewDocTextLen</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlNewDtd">xmlNewDtd</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlNewGlobalNs">xmlNewGlobalNs</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewNode">xmlNewNode</a>		(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewNodeEatName">xmlNewNodeEatName</a>	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlNewNs">xmlNewNs</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlNewNsProp">xmlNewNsProp</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlNewNsPropEatName">xmlNewNsPropEatName</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewPI">xmlNewPI</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlNewProp">xmlNewProp</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewReference">xmlNewReference</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewText">xmlNewText</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewTextChild">xmlNewTextChild</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNewTextLen">xmlNewTextLen</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlNextElementSibling">xmlNextElementSibling</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlNodeAddContent">xmlNodeAddContent</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
void	<a href="#xmlNodeAddContentLen">xmlNodeAddContentLen</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
int	<a href="#xmlNodeBufGetContent">xmlNodeBufGetContent</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
int	<a href="#xmlNodeDump">xmlNodeDump</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format);
void	<a href="#xmlNodeDumpOutput">xmlNodeDumpOutput</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format, <br>					 const char * encoding);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNodeGetBase">xmlNodeGetBase</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNodeGetContent">xmlNodeGetContent</a>	(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNodeGetLang">xmlNodeGetLang</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
int	<a href="#xmlNodeGetSpacePreserve">xmlNodeGetSpacePreserve</a>		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur);
int	<a href="#xmlNodeIsText">xmlNodeIsText</a>			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNodeListGetRawString">xmlNodeListGetRawString</a>	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * list, <br>					 int inLine);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlNodeListGetString">xmlNodeListGetString</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * list, <br>					 int inLine);
void	<a href="#xmlNodeSetBase">xmlNodeSetBase</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * uri);
void	<a href="#xmlNodeSetContent">xmlNodeSetContent</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
void	<a href="#xmlNodeSetContentLen">xmlNodeSetContentLen</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
void	<a href="#xmlNodeSetLang">xmlNodeSetLang</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * lang);
void	<a href="#xmlNodeSetName">xmlNodeSetName</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlNodeSetSpacePreserve">xmlNodeSetSpacePreserve</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int val);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlPreviousElementSibling">xmlPreviousElementSibling</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlReconciliateNs">xmlReconciliateNs</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree);
int	<a href="#xmlRemoveProp">xmlRemoveProp</a>			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlReplaceNode">xmlReplaceNode</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> old, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
int	<a href="#xmlSaveFile">xmlSaveFile</a>			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur);
int	<a href="#xmlSaveFileEnc">xmlSaveFileEnc</a>			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding);
int	<a href="#xmlSaveFileTo">xmlSaveFileTo</a>			(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding);
int	<a href="#xmlSaveFormatFile">xmlSaveFormatFile</a>		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 int format);
int	<a href="#xmlSaveFormatFileEnc">xmlSaveFormatFileEnc</a>		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format);
int	<a href="#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlSearchNs">xmlSearchNs</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#xmlSearchNsByHref">xmlSearchNsByHref</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href);
void	<a href="#xmlSetBufferAllocationScheme">xmlSetBufferAllocationScheme</a>	(<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> scheme);
void	<a href="#xmlSetCompressMode">xmlSetCompressMode</a>		(int mode);
void	<a href="#xmlSetDocCompressMode">xmlSetDocCompressMode</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int mode);
void	<a href="#xmlSetListDoc">xmlSetListDoc</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> list, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
void	<a href="#xmlSetNs">xmlSetNs</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlSetNsProp">xmlSetNsProp</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlSetProp">xmlSetProp</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
void	<a href="#xmlSetTreeDoc">xmlSetTreeDoc</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSplitQName2">xmlSplitQName2</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSplitQName3">xmlSplitQName3</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int * len);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlStringGetNodeList">xmlStringGetNodeList</a>	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlStringLenGetNodeList">xmlStringLenGetNodeList</a>	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len);
int	<a href="#xmlTextConcat">xmlTextConcat</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlTextMerge">xmlTextMerge</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> first, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> second);
void	<a href="#xmlUnlinkNode">xmlUnlinkNode</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
int	<a href="#xmlUnsetNsProp">xmlUnsetNsProp</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlUnsetProp">xmlUnsetProp</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlValidateNCName">xmlValidateNCName</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space);
int	<a href="#xmlValidateNMToken">xmlValidateNMToken</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space);
int	<a href="#xmlValidateName">xmlValidateName</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space);
int	<a href="#xmlValidateQName">xmlValidateQName</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="BASE_BUFFER_SIZE">Macro </a>BASE_BUFFER_SIZE</h3>
<pre class="programlisting">#define <a href="#BASE_BUFFER_SIZE">BASE_BUFFER_SIZE</a>;
</pre>
<p>default buffer size 4000.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML2_NEW_BUFFER">Macro </a>LIBXML2_NEW_BUFFER</h3>
<pre class="programlisting">#define <a href="#LIBXML2_NEW_BUFFER">LIBXML2_NEW_BUFFER</a>;
</pre>
<p>Macro used to express that the API use the new buffers for <a href="libxml2-tree.html#xmlParserInputBuffer">xmlParserInputBuffer</a> and xmlOutputBuffer. The change was introduced in 2.9.0.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_DOCB_DOCUMENT_NODE">Macro </a>XML_DOCB_DOCUMENT_NODE</h3>
<pre class="programlisting">#define <a href="#XML_DOCB_DOCUMENT_NODE">XML_DOCB_DOCUMENT_NODE</a>;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_GET_CONTENT">Macro </a>XML_GET_CONTENT</h3>
<pre class="programlisting">#define <a href="#XML_GET_CONTENT">XML_GET_CONTENT</a>;
</pre>
<p>Macro to extract the content pointer of a node.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_GET_LINE">Macro </a>XML_GET_LINE</h3>
<pre class="programlisting">#define <a href="#XML_GET_LINE">XML_GET_LINE</a>;
</pre>
<p>Macro to extract the line number of an element node.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_LOCAL_NAMESPACE">Macro </a>XML_LOCAL_NAMESPACE</h3>
<pre class="programlisting">#define <a href="#XML_LOCAL_NAMESPACE">XML_LOCAL_NAMESPACE</a>;
</pre>
<p>A namespace declaration node.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_XML_ID">Macro </a>XML_XML_ID</h3>
<pre class="programlisting">#define <a href="#XML_XML_ID">XML_XML_ID</a>;
</pre>
<p>This is the name for the special xml:id <a href="libxml2-SAX.html#attribute">attribute</a></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_XML_NAMESPACE">Macro </a>XML_XML_NAMESPACE</h3>
<pre class="programlisting">#define <a href="#XML_XML_NAMESPACE">XML_XML_NAMESPACE</a>;
</pre>
<p>This is the namespace for the special xml: prefix predefined in the XML Namespace specification.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChildrenNode">Macro </a>xmlChildrenNode</h3>
<pre class="programlisting">#define <a href="#xmlChildrenNode">xmlChildrenNode</a>;
</pre>
<p>Macro for compatibility naming layer with libxml1. Maps to "children."</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRootNode">Macro </a>xmlRootNode</h3>
<pre class="programlisting">#define <a href="#xmlRootNode">xmlRootNode</a>;
</pre>
<p>Macro for compatibility naming layer with libxml1. Maps to "children".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttr">Structure </a>xmlAttr</h3>
<pre class="programlisting">struct _xmlAttr {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_ATTRIBUTE_NODE, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the name of the property
    struct _xmlNode *	children	: the value of the property
    struct _xmlNode *	last	: NULL
    struct _xmlNode *	parent	: child-&gt;parent link
    struct _xmlAttr *	next	: next sibling link
    struct _xmlAttr *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    <a href="libxml2-tree.html#xmlNs">xmlNs</a> *	ns	: pointer to the associated namespace
    <a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a>	atype	: the <a href="libxml2-SAX.html#attribute">attribute</a> type if validating
    void *	psvi	: for type/PSVI information
} xmlAttr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttrPtr">Typedef </a>xmlAttrPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttr">xmlAttr</a> * xmlAttrPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttribute">Structure </a>xmlAttribute</h3>
<pre class="programlisting">struct _xmlAttribute {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_ATTRIBUTE_DECL, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Attribute name
    struct _xmlNode *	children	: NULL
    struct _xmlNode *	last	: NULL
    struct _xmlDtd *	parent	: -&gt; DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    struct _xmlAttribute *	nexth	: next in hash table
    <a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a>	atype	: The <a href="libxml2-SAX.html#attribute">attribute</a> type
    <a href="libxml2-tree.html#xmlAttributeDefault">xmlAttributeDefault</a>	def	: the default
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	defaultValue	: or the default value
    <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	tree	: or the enumeration tree if any
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	prefix	: the namespace prefix if any
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	elem	: Element holding the <a href="libxml2-SAX.html#attribute">attribute</a>
} xmlAttribute;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttributeDefault">Enum </a>xmlAttributeDefault</h3>
<pre class="programlisting">enum <a href="#xmlAttributeDefault">xmlAttributeDefault</a> {
    <a name="XML_ATTRIBUTE_NONE">XML_ATTRIBUTE_NONE</a> = 1
    <a name="XML_ATTRIBUTE_REQUIRED">XML_ATTRIBUTE_REQUIRED</a> = 2
    <a name="XML_ATTRIBUTE_IMPLIED">XML_ATTRIBUTE_IMPLIED</a> = 3
    <a name="XML_ATTRIBUTE_FIXED">XML_ATTRIBUTE_FIXED</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttributePtr">Typedef </a>xmlAttributePtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttribute">xmlAttribute</a> * xmlAttributePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttributeType">Enum </a>xmlAttributeType</h3>
<pre class="programlisting">enum <a href="#xmlAttributeType">xmlAttributeType</a> {
    <a name="XML_ATTRIBUTE_CDATA">XML_ATTRIBUTE_CDATA</a> = 1
    <a name="XML_ATTRIBUTE_ID">XML_ATTRIBUTE_ID</a> = 2
    <a name="XML_ATTRIBUTE_IDREF">XML_ATTRIBUTE_IDREF</a> = 3
    <a name="XML_ATTRIBUTE_IDREFS">XML_ATTRIBUTE_IDREFS</a> = 4
    <a name="XML_ATTRIBUTE_ENTITY">XML_ATTRIBUTE_ENTITY</a> = 5
    <a name="XML_ATTRIBUTE_ENTITIES">XML_ATTRIBUTE_ENTITIES</a> = 6
    <a name="XML_ATTRIBUTE_NMTOKEN">XML_ATTRIBUTE_NMTOKEN</a> = 7
    <a name="XML_ATTRIBUTE_NMTOKENS">XML_ATTRIBUTE_NMTOKENS</a> = 8
    <a name="XML_ATTRIBUTE_ENUMERATION">XML_ATTRIBUTE_ENUMERATION</a> = 9
    <a name="XML_ATTRIBUTE_NOTATION">XML_ATTRIBUTE_NOTATION</a> = 10
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBuf">Structure </a>xmlBuf</h3>
<pre class="programlisting">struct _xmlBuf {
The content of this structure is not made public by the API.
} xmlBuf;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufPtr">Typedef </a>xmlBufPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBuf">xmlBuf</a> * xmlBufPtr;
</pre>
<p>A pointer to a buffer structure, the actual structure internals are not public</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBuffer">Structure </a>xmlBuffer</h3>
<pre class="programlisting">struct _xmlBuffer {
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	content	: The buffer content UTF8
    unsigned int	use	: The buffer size used
    unsigned int	size	: The buffer size
    <a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	alloc	: The realloc method
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	contentIO	: in IO mode we may have a different base
} xmlBuffer;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferAllocationScheme">Enum </a>xmlBufferAllocationScheme</h3>
<pre class="programlisting">enum <a href="#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> {
    <a name="XML_BUFFER_ALLOC_DOUBLEIT">XML_BUFFER_ALLOC_DOUBLEIT</a> = 1 /* double each time one need to grow */
    <a name="XML_BUFFER_ALLOC_EXACT">XML_BUFFER_ALLOC_EXACT</a> = 2 /* grow only to the minimal size */
    <a name="XML_BUFFER_ALLOC_IMMUTABLE">XML_BUFFER_ALLOC_IMMUTABLE</a> = 3 /* immutable buffer */
    <a name="XML_BUFFER_ALLOC_IO">XML_BUFFER_ALLOC_IO</a> = 4 /* special allocation scheme used for I/O */
    <a name="XML_BUFFER_ALLOC_HYBRID">XML_BUFFER_ALLOC_HYBRID</a> = 5 /* exact up to a threshold, and doubleit thereafter */
    <a name="XML_BUFFER_ALLOC_BOUNDED">XML_BUFFER_ALLOC_BOUNDED</a> = 6 /*  limit the upper size of the buffer */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferPtr">Typedef </a>xmlBufferPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * xmlBufferPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapCtxt">Structure </a>xmlDOMWrapCtxt</h3>
<pre class="programlisting">struct _xmlDOMWrapCtxt {
    void *	_private	: * The type of this context, just in case we need specialized * context
    int	type	: * Internal namespace map used for various operations. *
    void *	namespaceMap	: * Use this one to acquire an <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> intended for node-&gt;ns. * (Note t
    <a href="libxml2-tree.html#xmlDOMWrapAcquireNsFunction">xmlDOMWrapAcquireNsFunction</a>	getNsForNodeFunc
} xmlDOMWrapCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapCtxtPtr">Typedef </a>xmlDOMWrapCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDOMWrapCtxt">xmlDOMWrapCtxt</a> * xmlDOMWrapCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDoc">Structure </a>xmlDoc</h3>
<pre class="programlisting">struct _xmlDoc {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_DOCUMENT_NODE, must be second !
    char *	name	: name/filename/URI of the document
    struct _xmlNode *	children	: the document tree
    struct _xmlNode *	last	: last child link
    struct _xmlNode *	parent	: child-&gt;parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: autoreference to itself End of common part
    int	compression	: level of zlib compression
    int	standalone	: standalone document (no external refs) 1 if standalone="yes" 0 if sta
    struct _xmlDtd *	intSubset	: the document internal subset
    struct _xmlDtd *	extSubset	: the document external subset
    struct _xmlNs *	oldNs	: Global namespace, the old way
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	version	: the XML version string
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	encoding	: external initial encoding, if any
    void *	ids	: Hash table for ID attributes if any
    void *	refs	: Hash table for IDREFs attributes if any
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	URL	: The URI for that document
    int	charset	: Internal flag for charset handling, actually an <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>
    struct _xmlDict *	dict	: dict used to allocate names or NULL
    void *	psvi	: for type/PSVI information
    int	parseFlags	: set of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a> used to parse the document
    int	properties	: set of <a href="libxml2-tree.html#xmlDocProperties">xmlDocProperties</a> for this document set at the end of parsing
} xmlDoc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocProperties">Enum </a>xmlDocProperties</h3>
<pre class="programlisting">enum <a href="#xmlDocProperties">xmlDocProperties</a> {
    <a name="XML_DOC_WELLFORMED">XML_DOC_WELLFORMED</a> = 1 /* document is XML well formed */
    <a name="XML_DOC_NSVALID">XML_DOC_NSVALID</a> = 2 /* document is Namespace valid */
    <a name="XML_DOC_OLD10">XML_DOC_OLD10</a> = 4 /* parsed with old XML-1.0 parser */
    <a name="XML_DOC_DTDVALID">XML_DOC_DTDVALID</a> = 8 /* DTD validation was successful */
    <a name="XML_DOC_XINCLUDE">XML_DOC_XINCLUDE</a> = 16 /* XInclude substitution was done */
    <a name="XML_DOC_USERBUILT">XML_DOC_USERBUILT</a> = 32 /* Document was built using the API and not by parsing an instance */
    <a name="XML_DOC_INTERNAL">XML_DOC_INTERNAL</a> = 64 /* built for internal processing */
    <a name="XML_DOC_HTML">XML_DOC_HTML</a> = 128 /*  parsed or built HTML document */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocPtr">Typedef </a>xmlDocPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * xmlDocPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDtd">Structure </a>xmlDtd</h3>
<pre class="programlisting">struct _xmlDtd {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_DTD_NODE, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Name of the DTD
    struct _xmlNode *	children	: the value of the property link
    struct _xmlNode *	last	: last child link
    struct _xmlDoc *	parent	: child-&gt;parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document End of common part
    void *	notations	: Hash table for notations if any
    void *	elements	: Hash table for elements if any
    void *	attributes	: Hash table for attributes if any
    void *	entities	: Hash table for entities if any
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ExternalID	: External identifier for PUBLIC DTD
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	SystemID	: URI for a SYSTEM or PUBLIC DTD
    void *	pentities	: Hash table for param entities if any
} xmlDtd;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDtdPtr">Typedef </a>xmlDtdPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtd">xmlDtd</a> * xmlDtdPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElement">Structure </a>xmlElement</h3>
<pre class="programlisting">struct _xmlElement {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_ELEMENT_DECL, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Element name
    struct _xmlNode *	children	: NULL
    struct _xmlNode *	last	: NULL
    struct _xmlDtd *	parent	: -&gt; DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    <a href="libxml2-tree.html#xmlElementTypeVal">xmlElementTypeVal</a>	etype	: The type
    <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	content	: the allowed element content
    <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	attributes	: List of the declared attributes
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	prefix	: the namespace prefix if any
    <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	contModel	: the validating regexp
    void *	contModel
} xmlElement;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementContent">Structure </a>xmlElementContent</h3>
<pre class="programlisting">struct _xmlElementContent {
    <a href="libxml2-tree.html#xmlElementContentType">xmlElementContentType</a>	type	: PCDATA, ELEMENT, SEQ or OR
    <a href="libxml2-tree.html#xmlElementContentOccur">xmlElementContentOccur</a>	ocur	: ONCE, OPT, MULT or PLUS
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Element name
    struct _xmlElementContent *	c1	: first child
    struct _xmlElementContent *	c2	: second child
    struct _xmlElementContent *	parent	: parent
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	prefix	: Namespace prefix
} xmlElementContent;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementContentOccur">Enum </a>xmlElementContentOccur</h3>
<pre class="programlisting">enum <a href="#xmlElementContentOccur">xmlElementContentOccur</a> {
    <a name="XML_ELEMENT_CONTENT_ONCE">XML_ELEMENT_CONTENT_ONCE</a> = 1
    <a name="XML_ELEMENT_CONTENT_OPT">XML_ELEMENT_CONTENT_OPT</a> = 2
    <a name="XML_ELEMENT_CONTENT_MULT">XML_ELEMENT_CONTENT_MULT</a> = 3
    <a name="XML_ELEMENT_CONTENT_PLUS">XML_ELEMENT_CONTENT_PLUS</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementContentPtr">Typedef </a>xmlElementContentPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContent">xmlElementContent</a> * xmlElementContentPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementContentType">Enum </a>xmlElementContentType</h3>
<pre class="programlisting">enum <a href="#xmlElementContentType">xmlElementContentType</a> {
    <a name="XML_ELEMENT_CONTENT_PCDATA">XML_ELEMENT_CONTENT_PCDATA</a> = 1
    <a name="XML_ELEMENT_CONTENT_ELEMENT">XML_ELEMENT_CONTENT_ELEMENT</a> = 2
    <a name="XML_ELEMENT_CONTENT_SEQ">XML_ELEMENT_CONTENT_SEQ</a> = 3
    <a name="XML_ELEMENT_CONTENT_OR">XML_ELEMENT_CONTENT_OR</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementPtr">Typedef </a>xmlElementPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElement">xmlElement</a> * xmlElementPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementType">Enum </a>xmlElementType</h3>
<pre class="programlisting">enum <a href="#xmlElementType">xmlElementType</a> {
    <a name="XML_ELEMENT_NODE">XML_ELEMENT_NODE</a> = 1
    <a name="XML_ATTRIBUTE_NODE">XML_ATTRIBUTE_NODE</a> = 2
    <a name="XML_TEXT_NODE">XML_TEXT_NODE</a> = 3
    <a name="XML_CDATA_SECTION_NODE">XML_CDATA_SECTION_NODE</a> = 4
    <a name="XML_ENTITY_REF_NODE">XML_ENTITY_REF_NODE</a> = 5
    <a name="XML_ENTITY_NODE">XML_ENTITY_NODE</a> = 6
    <a name="XML_PI_NODE">XML_PI_NODE</a> = 7
    <a name="XML_COMMENT_NODE">XML_COMMENT_NODE</a> = 8
    <a name="XML_DOCUMENT_NODE">XML_DOCUMENT_NODE</a> = 9
    <a name="XML_DOCUMENT_TYPE_NODE">XML_DOCUMENT_TYPE_NODE</a> = 10
    <a name="XML_DOCUMENT_FRAG_NODE">XML_DOCUMENT_FRAG_NODE</a> = 11
    <a name="XML_NOTATION_NODE">XML_NOTATION_NODE</a> = 12
    <a name="XML_HTML_DOCUMENT_NODE">XML_HTML_DOCUMENT_NODE</a> = 13
    <a name="XML_DTD_NODE">XML_DTD_NODE</a> = 14
    <a name="XML_ELEMENT_DECL">XML_ELEMENT_DECL</a> = 15
    <a name="XML_ATTRIBUTE_DECL">XML_ATTRIBUTE_DECL</a> = 16
    <a name="XML_ENTITY_DECL">XML_ENTITY_DECL</a> = 17
    <a name="XML_NAMESPACE_DECL">XML_NAMESPACE_DECL</a> = 18
    <a name="XML_XINCLUDE_START">XML_XINCLUDE_START</a> = 19
    <a name="XML_XINCLUDE_END">XML_XINCLUDE_END</a> = 20 /*  XML_DOCB_DOCUMENT_NODE= 21 removed */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementTypeVal">Enum </a>xmlElementTypeVal</h3>
<pre class="programlisting">enum <a href="#xmlElementTypeVal">xmlElementTypeVal</a> {
    <a name="XML_ELEMENT_TYPE_UNDEFINED">XML_ELEMENT_TYPE_UNDEFINED</a> = 0
    <a name="XML_ELEMENT_TYPE_EMPTY">XML_ELEMENT_TYPE_EMPTY</a> = 1
    <a name="XML_ELEMENT_TYPE_ANY">XML_ELEMENT_TYPE_ANY</a> = 2
    <a name="XML_ELEMENT_TYPE_MIXED">XML_ELEMENT_TYPE_MIXED</a> = 3
    <a name="XML_ELEMENT_TYPE_ELEMENT">XML_ELEMENT_TYPE_ELEMENT</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntity">Structure </a>xmlEntity</h3>
<pre class="programlisting">struct _xmlEntity {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: XML_ENTITY_DECL, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Entity name
    struct _xmlNode *	children	: First child link
    struct _xmlNode *	last	: Last child link
    struct _xmlDtd *	parent	: -&gt; DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	orig	: content without ref substitution
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	content	: content or ndata if unparsed
    int	length	: the content length
    <a href="libxml2-entities.html#xmlEntityType">xmlEntityType</a>	etype	: The entity type
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ExternalID	: External identifier for PUBLIC
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	SystemID	: URI for a SYSTEM or PUBLIC Entity
    struct _xmlEntity *	nexte	: unused
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	URI	: the full URI as computed
    int	owner	: does the entity own the childrens
    int	checked	: was the entity content checked this is also used to count entities *
} xmlEntity;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntityPtr">Typedef </a>xmlEntityPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntity">xmlEntity</a> * xmlEntityPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEnumeration">Structure </a>xmlEnumeration</h3>
<pre class="programlisting">struct _xmlEnumeration {
    struct _xmlEnumeration *	next	: next one
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Enumeration name
} xmlEnumeration;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEnumerationPtr">Typedef </a>xmlEnumerationPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEnumeration">xmlEnumeration</a> * xmlEnumerationPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlID">Structure </a>xmlID</h3>
<pre class="programlisting">struct _xmlID {
    struct _xmlID *	next	: next ID
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	value	: The ID name
    <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	attr	: The <a href="libxml2-SAX.html#attribute">attribute</a> holding it
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: The <a href="libxml2-SAX.html#attribute">attribute</a> if attr is not available
    int	lineno	: The line number if attr is not available
    struct _xmlDoc *	doc	: The document holding the ID
} xmlID;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIDPtr">Typedef </a>xmlIDPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlID">xmlID</a> * xmlIDPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNode">Structure </a>xmlNode</h3>
<pre class="programlisting">struct _xmlNode {
    void *	_private	: application data
    <a href="libxml2-tree.html#xmlElementType">xmlElementType</a>	type	: type number, must be second !
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the name of the node, or the entity
    struct _xmlNode *	children	: parent-&gt;childs link
    struct _xmlNode *	last	: last child link
    struct _xmlNode *	parent	: child-&gt;parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document End of common part
    <a href="libxml2-tree.html#xmlNs">xmlNs</a> *	ns	: pointer to the associated namespace
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	content	: the content
    struct _xmlAttr *	properties	: properties list
    <a href="libxml2-tree.html#xmlNs">xmlNs</a> *	nsDef	: namespace definitions on this node
    void *	psvi	: for type/PSVI information
    unsigned short	line	: line number
    unsigned short	extra	: extra data for XPath/XSLT
} xmlNode;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodePtr">Typedef </a>xmlNodePtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNode">xmlNode</a> * xmlNodePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNotation">Structure </a>xmlNotation</h3>
<pre class="programlisting">struct _xmlNotation {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Notation name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	PublicID	: Public identifier, if any
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	SystemID	: System identifier, if any
} xmlNotation;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNotationPtr">Typedef </a>xmlNotationPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNotation">xmlNotation</a> * xmlNotationPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNs">Structure </a>xmlNs</h3>
<pre class="programlisting">struct _xmlNs {
    struct _xmlNs *	next	: next Ns link for this node
    <a href="libxml2-tree.html#xmlNsType">xmlNsType</a>	type	: global or local
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	href	: URL for the namespace
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	prefix	: prefix for the namespace
    void *	_private	: application data
    struct _xmlDoc *	context	: normally an <a href="libxml2-tree.html#xmlDoc">xmlDoc</a>
} xmlNs;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNsPtr">Typedef </a>xmlNsPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNs">xmlNs</a> * xmlNsPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNsType">Typedef </a>xmlNsType</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementType">xmlElementType</a> xmlNsType;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBuffer">Structure </a>xmlOutputBuffer</h3>
<pre class="programlisting">struct _xmlOutputBuffer {
    void *	context
    <a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a>	writecallback
    <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a>	closecallback
    <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	encoder	: I18N conversions to UTF-8
    <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a>	buffer	: Local buffer encoded in UTF-8 or ISOLatin
    <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a>	conv	: if encoder != NULL buffer for output
    int	written	: total number of byte written
    int	error
} xmlOutputBuffer;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlOutputBufferPtr">Typedef </a>xmlOutputBufferPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlOutputBuffer">xmlOutputBuffer</a> * xmlOutputBufferPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserCtxt">Structure </a>xmlParserCtxt</h3>
<pre class="programlisting">struct _xmlParserCtxt {
    struct _xmlSAXHandler *	sax	: The SAX handler
    void *	userData	: For SAX interface only, used by DOM build
    <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	myDoc	: the document being built
    int	wellFormed	: is the document well formed
    int	replaceEntities	: shall we replace entities ?
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	version	: the XML version string
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	encoding	: the declared encoding, if any
    int	standalone	: standalone document
    int	html	: an HTML(1) document * 3 is HTML after &lt;head&gt; * 10 is HTML after &lt;body
    <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	input	: Current input stream
    int	inputNr	: Number of current input streams
    int	inputMax	: Max number of input streams
    <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> *	inputTab	: stack of inputs Node analysis stack only used for DOM building
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node	: Current parsed Node
    int	nodeNr	: Depth of the parsing stack
    int	nodeMax	: Max depth of the parsing stack
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> *	nodeTab	: array of nodes
    int	record_info	: Whether node info should be kept
    <a href="libxml2-parser.html#xmlParserNodeInfoSeq">xmlParserNodeInfoSeq</a>	node_seq	: info about each node parsed
    int	errNo	: error code
    int	hasExternalSubset	: <a href="libxml2-SAX.html#reference">reference</a> and external subset
    int	hasPErefs	: the internal subset has PE refs
    int	external	: are we parsing an external entity
    int	valid	: is the document valid
    int	validate	: shall we try to validate ?
    <a href="libxml2-valid.html#xmlValidCtxt">xmlValidCtxt</a>	vctxt	: The validity context
    <a href="libxml2-parser.html#xmlParserInputState">xmlParserInputState</a>	instate	: current type of input
    int	token	: next char look-ahead
    char *	directory	: the data directory Node name stack
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: Current parsed Node
    int	nameNr	: Depth of the parsing stack
    int	nameMax	: Max depth of the parsing stack
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * *	nameTab	: array of nodes
    long	nbChars	: unused
    long	checkIndex	: used by progressive parsing lookup
    int	keepBlanks	: ugly but ...
    int	disableSAX	: SAX callbacks are disabled
    int	inSubset	: Parsing is in int 1/ext 2 subset
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	intSubName	: name of subset
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	extSubURI	: URI of external subset
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	extSubSystem	: SYSTEM ID of external subset xml:space values
    int *	space	: Should the parser preserve spaces
    int	spaceNr	: Depth of the parsing stack
    int	spaceMax	: Max depth of the parsing stack
    int *	spaceTab	: array of space infos
    int	depth	: to prevent entity substitution loops
    <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	entity	: used to check entities boundaries
    int	charset	: encoding of the in-memory content actually an <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a>
    int	nodelen	: Those two fields are there to
    int	nodemem	: Speed up large node parsing
    int	pedantic	: signal pedantic warnings
    void *	_private	: For user data, libxml won't touch it
    int	loadsubset	: should the external subset be loaded
    int	linenumbers	: set line number in element content
    void *	catalogs	: document's own catalog
    int	recovery	: run in recovery mode
    int	progressive	: is this a progressive parsing
    <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	dict	: dictionary for the parser
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * *	atts	: array for the attributes callbacks
    int	maxatts	: the size of the array
    int	docdict	: * pre-interned strings *
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	str_xml
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	str_xmlns
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	str_xml_ns	: * Everything below is used only by the new SAX mode *
    int	sax2	: operating in the new SAX mode
    int	nsNr	: the number of inherited namespaces
    int	nsMax	: the size of the arrays
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * *	nsTab	: the array of prefix/namespace name
    int *	attallocs	: which <a href="libxml2-SAX.html#attribute">attribute</a> were allocated
    <a href="libxml2-parser.html#xmlStartTag">xmlStartTag</a> *	pushTab	: array of data for push
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	attsDefault	: defaulted attributes if any
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	attsSpecial	: non-CDATA attributes if any
    int	nsWellFormed	: is the document XML Namespace okay
    int	options	: * Those fields are needed only for streaming parsing so far *
    int	dictNames	: Use dictionary names for the tree
    int	freeElemsNr	: number of freed element nodes
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	freeElems	: List of freed element nodes
    int	freeAttrsNr	: number of freed attributes nodes
    <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	freeAttrs	: * the complete error information for the last error. *
    <a href="libxml2-xmlerror.html#xmlError">xmlError</a>	lastError
    <a href="libxml2-parser.html#xmlParserMode">xmlParserMode</a>	parseMode	: the parser mode
    unsigned long	nbentities	: number of entities references
    unsigned long	sizeentities	: size of parsed entities for use by HTML non-recursive parser
    <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> *	nodeInfo	: Current NodeInfo
    int	nodeInfoNr	: Depth of the parsing stack
    int	nodeInfoMax	: Max depth of the parsing stack
    <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> *	nodeInfoTab	: array of nodeInfos
    int	input_id	: we need to label inputs
    unsigned long	sizeentcopy	: volume of entity copy
} xmlParserCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserCtxtPtr">Typedef </a>xmlParserCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxt">xmlParserCtxt</a> * xmlParserCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInput">Structure </a>xmlParserInput</h3>
<pre class="programlisting">struct _xmlParserInput {
    <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	buf	: UTF-8 encoded buffer
    const char *	filename	: The file analyzed, if any
    const char *	directory	: the directory/base of the file
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	base	: Base of the array to parse
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	cur	: Current char being parsed
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	end	: end of the array to parse
    int	length	: length if known
    int	line	: Current line
    int	col	: * NOTE: consumed is only tested for equality in the parser code, *
    unsigned long	consumed	: How many xmlChars already consumed
    <a href="libxml2-parser.html#xmlParserInputDeallocate">xmlParserInputDeallocate</a>	free	: function to deallocate the base
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	encoding	: the encoding string for entity
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	version	: the version string for entity
    int	standalone	: Was that entity marked standalone
    int	id	: an unique identifier for the entity
} xmlParserInput;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBuffer">Structure </a>xmlParserInputBuffer</h3>
<pre class="programlisting">struct _xmlParserInputBuffer {
    void *	context
    <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a>	readcallback
    <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a>	closecallback
    <a href="libxml2-encoding.html#xmlCharEncodingHandlerPtr">xmlCharEncodingHandlerPtr</a>	encoder	: I18N conversions to UTF-8
    <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a>	buffer	: Local buffer encoded in UTF-8
    <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a>	raw	: if encoder != NULL buffer for raw input
    int	compressed	: -1=unknown, 0=not compressed, 1=compressed
    int	error
    unsigned long	rawconsumed	: amount consumed from raw
} xmlParserInputBuffer;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputBufferPtr">Typedef </a>xmlParserInputBufferPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBuffer">xmlParserInputBuffer</a> * xmlParserInputBufferPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputPtr">Typedef </a>xmlParserInputPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInput">xmlParserInput</a> * xmlParserInputPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRef">Structure </a>xmlRef</h3>
<pre class="programlisting">struct _xmlRef {
    struct _xmlRef *	next	: next Ref
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	value	: The Ref name
    <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	attr	: The <a href="libxml2-SAX.html#attribute">attribute</a> holding it
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: The <a href="libxml2-SAX.html#attribute">attribute</a> if attr is not available
    int	lineno	: The line number if attr is not available
} xmlRef;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRefPtr">Typedef </a>xmlRefPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlRef">xmlRef</a> * xmlRefPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXHandler">Structure </a>xmlSAXHandler</h3>
<pre class="programlisting">struct _xmlSAXHandler {
    <a href="libxml2-parser.html#internalSubsetSAXFunc">internalSubsetSAXFunc</a>	internalSubset
    <a href="libxml2-parser.html#isStandaloneSAXFunc">isStandaloneSAXFunc</a>	isStandalone
    <a href="libxml2-parser.html#hasInternalSubsetSAXFunc">hasInternalSubsetSAXFunc</a>	hasInternalSubset
    <a href="libxml2-parser.html#hasExternalSubsetSAXFunc">hasExternalSubsetSAXFunc</a>	hasExternalSubset
    <a href="libxml2-parser.html#resolveEntitySAXFunc">resolveEntitySAXFunc</a>	resolveEntity
    <a href="libxml2-parser.html#getEntitySAXFunc">getEntitySAXFunc</a>	getEntity
    <a href="libxml2-parser.html#entityDeclSAXFunc">entityDeclSAXFunc</a>	entityDecl
    <a href="libxml2-parser.html#notationDeclSAXFunc">notationDeclSAXFunc</a>	notationDecl
    <a href="libxml2-parser.html#attributeDeclSAXFunc">attributeDeclSAXFunc</a>	attributeDecl
    <a href="libxml2-parser.html#elementDeclSAXFunc">elementDeclSAXFunc</a>	elementDecl
    <a href="libxml2-parser.html#unparsedEntityDeclSAXFunc">unparsedEntityDeclSAXFunc</a>	unparsedEntityDecl
    <a href="libxml2-parser.html#setDocumentLocatorSAXFunc">setDocumentLocatorSAXFunc</a>	setDocumentLocator
    <a href="libxml2-parser.html#startDocumentSAXFunc">startDocumentSAXFunc</a>	startDocument
    <a href="libxml2-parser.html#endDocumentSAXFunc">endDocumentSAXFunc</a>	endDocument
    <a href="libxml2-parser.html#startElementSAXFunc">startElementSAXFunc</a>	startElement
    <a href="libxml2-parser.html#endElementSAXFunc">endElementSAXFunc</a>	endElement
    <a href="libxml2-parser.html#referenceSAXFunc">referenceSAXFunc</a>	reference
    <a href="libxml2-parser.html#charactersSAXFunc">charactersSAXFunc</a>	characters
    <a href="libxml2-parser.html#ignorableWhitespaceSAXFunc">ignorableWhitespaceSAXFunc</a>	ignorableWhitespace
    <a href="libxml2-parser.html#processingInstructionSAXFunc">processingInstructionSAXFunc</a>	processingInstruction
    <a href="libxml2-parser.html#commentSAXFunc">commentSAXFunc</a>	comment
    <a href="libxml2-parser.html#warningSAXFunc">warningSAXFunc</a>	warning
    <a href="libxml2-parser.html#errorSAXFunc">errorSAXFunc</a>	error
    <a href="libxml2-parser.html#fatalErrorSAXFunc">fatalErrorSAXFunc</a>	fatalError	: unused error() get all the errors
    <a href="libxml2-parser.html#getParameterEntitySAXFunc">getParameterEntitySAXFunc</a>	getParameterEntity
    <a href="libxml2-parser.html#cdataBlockSAXFunc">cdataBlockSAXFunc</a>	cdataBlock
    <a href="libxml2-parser.html#externalSubsetSAXFunc">externalSubsetSAXFunc</a>	externalSubset
    unsigned int	initialized	: The following fields are extensions available only on version 2
    void *	_private
    <a href="libxml2-parser.html#startElementNsSAX2Func">startElementNsSAX2Func</a>	startElementNs
    <a href="libxml2-parser.html#endElementNsSAX2Func">endElementNsSAX2Func</a>	endElementNs
    <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a>	serror
} xmlSAXHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXHandlerPtr">Typedef </a>xmlSAXHandlerPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * xmlSAXHandlerPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXLocator">Structure </a>xmlSAXLocator</h3>
<pre class="programlisting">struct _xmlSAXLocator {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *(*getPublicId)	getPublicId
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *(*getSystemId)	getSystemId
    int(*getLineNumber)	getLineNumber
    int(*getColumnNumber)	getColumnNumber
} xmlSAXLocator;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXLocatorPtr">Typedef </a>xmlSAXLocatorPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlSAXLocator">xmlSAXLocator</a> * xmlSAXLocatorPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapAcquireNsFunction"></a>Function type xmlDOMWrapAcquireNsFunction</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlDOMWrapAcquireNsFunction	(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nsName, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nsPrefix)<br>
</pre>
<p>A function called to acquire namespaces (xmlNs) from the wrapper.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a DOM wrapper context</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the context node (element or attribute)</td>
</tr>
<tr>
<td><span class="term"><i><tt>nsName</tt></i>:</span></td>
<td>the requested namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>nsPrefix</tt></i>:</span></td>
<td>the requested namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> or NULL in case of an error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddChild"></a>xmlAddChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlAddChild		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Add a new node to @parent, at the end of the child (or property) list merging adjacent TEXT nodes (in which case @cur is freed) If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an <a href="libxml2-SAX.html#attribute">attribute</a> with equal name, it is first destroyed. All tree manipulation functions can safely move nodes within a document. But when moving nodes from one document to another, references to namespaces in element or <a href="libxml2-SAX.html#attribute">attribute</a> nodes are NOT fixed. In this case, you MUST call <a href="libxml2-tree.html#xmlReconciliateNs">xmlReconciliateNs</a> after the move operation to avoid memory errors.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the child node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the child or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddChildList"></a>xmlAddChildList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlAddChildList		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Add a list of node at the end of the child list of the parent merging adjacent TEXT nodes (@cur may be freed) See the note regarding namespaces in xmlAddChild.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first node in the list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last child or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddNextSibling"></a>xmlAddNextSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlAddNextSibling	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Add a new node @elem as the next sibling of @cur If the new node was already inserted in a document it is first unlinked from its existing context. As a result of text merging @elem may be freed. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an <a href="libxml2-SAX.html#attribute">attribute</a> with equal name, it is first destroyed. See the note regarding namespaces in xmlAddChild.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the child node</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the new node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new node or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddPrevSibling"></a>xmlAddPrevSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlAddPrevSibling	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Add a new node @elem as the previous sibling of @cur merging adjacent TEXT nodes (@elem may be freed) If the new node was already inserted in a document it is first unlinked from its existing context. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an <a href="libxml2-SAX.html#attribute">attribute</a> with equal name, it is first destroyed. See the note regarding namespaces in xmlAddChild.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the child node</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the new node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new node or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddSibling"></a>xmlAddSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlAddSibling		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Add a new element @elem to the list of siblings of @cur merging adjacent TEXT nodes (@elem may be freed) If the new element was already inserted in a document it is first unlinked from its existing context. See the note regarding namespaces in xmlAddChild.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the child node</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the new node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new element or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttrSerializeTxtContent"></a>xmlAttrSerializeTxtContent ()</h3>
<pre class="programlisting">void	xmlAttrSerializeTxtContent	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string)<br>
</pre>
<p>Serialize text <a href="libxml2-SAX.html#attribute">attribute</a> values to an xml simple buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> node</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the text content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufContent"></a>xmlBufContent ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBufContent		(const <a href="libxml2-tree.html#xmlBuf">xmlBuf</a> * buf)<br>
</pre>
<p>Function to extract the content of a buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufEnd"></a>xmlBufEnd ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBufEnd		(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf)<br>
</pre>
<p>Function to extract the end of the content of a buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the end of the internal content or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufGetNodeContent"></a>xmlBufGetNodeContent ()</h3>
<pre class="programlisting">int	xmlBufGetNodeContent		(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buf with this value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>a buffer <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufNodeDump"></a>xmlBufNodeDump ()</h3>
<pre class="programlisting">size_t	xmlBufNodeDump			(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format)<br>
</pre>
<p>Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>level</tt></i>:</span></td>
<td>the imbrication level for indenting</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>is formatting allowed</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written to the buffer, in case of error 0 is returned or @buf stores the error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufShrink"></a>xmlBufShrink ()</h3>
<pre class="programlisting">size_t	xmlBufShrink			(<a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf, <br>					 size_t len)<br>
</pre>
<p>Remove the beginning of an XML buffer. NOTE that this routine behaviour differs from xmlBufferShrink() as it will return 0 on error instead of -1 due to size_t being used as the return type.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to dump</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> to remove</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte removed or 0 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufUse"></a>xmlBufUse ()</h3>
<pre class="programlisting">size_t	xmlBufUse			(const <a href="libxml2-tree.html#xmlBufPtr">xmlBufPtr</a> buf)<br>
</pre>
<p>Function to get the length of a buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the length of data in the internal content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferAdd"></a>xmlBufferAdd ()</h3>
<pre class="programlisting">int	xmlBufferAdd			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len)<br>
</pre>
<p>Add a string range to an XML buffer. if len == -1, the length of str is recomputed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to dump</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the #xmlChar string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of #xmlChar to add</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 successful, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferAddHead"></a>xmlBufferAddHead ()</h3>
<pre class="programlisting">int	xmlBufferAddHead		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 int len)<br>
</pre>
<p>Add a string range to the beginning of an XML buffer. if len == -1, the length of @str is recomputed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the #xmlChar string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of #xmlChar to add</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 successful, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferCCat"></a>xmlBufferCCat ()</h3>
<pre class="programlisting">int	xmlBufferCCat			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const char * str)<br>
</pre>
<p>Append a zero terminated C string to an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to dump</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the C char string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 successful, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferCat"></a>xmlBufferCat ()</h3>
<pre class="programlisting">int	xmlBufferCat			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Append a zero terminated string to an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to add to</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the #xmlChar string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 successful, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferContent"></a>xmlBufferContent ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBufferContent	(const <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * buf)<br>
</pre>
<p>Function to extract the content of a buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferCreate"></a>xmlBufferCreate ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	xmlBufferCreate		(void)<br>
</pre>
<p>routine to create an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new structure.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferCreateSize"></a>xmlBufferCreateSize ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	xmlBufferCreateSize	(size_t size)<br>
</pre>
<p>routine to create an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>initial size of buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new structure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferCreateStatic"></a>xmlBufferCreateStatic ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a>	xmlBufferCreateStatic	(void * mem, <br>					 size_t size)<br>
</pre>
<p>routine to create an XML buffer from an immutable memory area. The area won't be modified nor copied, and is expected to be present until the end of the buffer lifetime.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>the memory area</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size in byte</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new structure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferDetach"></a>xmlBufferDetach ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBufferDetach		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf)<br>
</pre>
<p>Remove the string contained in a buffer and gie it back to the caller. The buffer is reset to an empty content. This doesn't work with immutable buffers as they can't be reset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous string contained by the buffer.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferDump"></a>xmlBufferDump ()</h3>
<pre class="programlisting">int	xmlBufferDump			(FILE * file, <br>					 <a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf)<br>
</pre>
<p>Dumps an XML buffer to a FILE *.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>the file output</td>
</tr>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to dump</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of #xmlChar written</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferEmpty"></a>xmlBufferEmpty ()</h3>
<pre class="programlisting">void	xmlBufferEmpty			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf)<br>
</pre>
<p>empty a buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferFree"></a>xmlBufferFree ()</h3>
<pre class="programlisting">void	xmlBufferFree			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf)<br>
</pre>
<p>Frees an XML buffer. It frees both the content and the structure which encapsulate it.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferGrow"></a>xmlBufferGrow ()</h3>
<pre class="programlisting">int	xmlBufferGrow			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int len)<br>
</pre>
<p>Grow the available space of an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the minimum free size to allocate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new available space or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferLength"></a>xmlBufferLength ()</h3>
<pre class="programlisting">int	xmlBufferLength			(const <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> * buf)<br>
</pre>
<p>Function to get the length of a buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the length of data in the internal content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferResize"></a>xmlBufferResize ()</h3>
<pre class="programlisting">int	xmlBufferResize			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int size)<br>
</pre>
<p>Resize a buffer to accommodate minimum size of @size.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to resize</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the desired size</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of problems, 1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferSetAllocationScheme"></a>xmlBufferSetAllocationScheme ()</h3>
<pre class="programlisting">void	xmlBufferSetAllocationScheme	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> scheme)<br>
</pre>
<p>Sets the allocation scheme for this buffer</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to tune</td>
</tr>
<tr>
<td><span class="term"><i><tt>scheme</tt></i>:</span></td>
<td>allocation scheme to use</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferShrink"></a>xmlBufferShrink ()</h3>
<pre class="programlisting">int	xmlBufferShrink			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 unsigned int len)<br>
</pre>
<p>Remove the beginning of an XML buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the buffer to dump</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> to remove</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of #xmlChar removed, or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferWriteCHAR"></a>xmlBufferWriteCHAR ()</h3>
<pre class="programlisting">void	xmlBufferWriteCHAR		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string)<br>
</pre>
<p>routine which manages and grows an output buffer. This one adds xmlChars at the end of the buffer.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the string to add</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferWriteChar"></a>xmlBufferWriteChar ()</h3>
<pre class="programlisting">void	xmlBufferWriteChar		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const char * string)<br>
</pre>
<p>routine which manage and grows an output buffer. This one add C chars at the end of the array.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the string to add</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBufferWriteQuotedString"></a>xmlBufferWriteQuotedString ()</h3>
<pre class="programlisting">void	xmlBufferWriteQuotedString	(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string)<br>
</pre>
<p>routine which manage and grows an output buffer. This one writes a quoted or double quoted #xmlChar string, checking first if it holds quote or double-quotes internally</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the string to add</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBuildQName"></a>xmlBuildQName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlBuildQName		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ncname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * memory, <br>					 int len)<br>
</pre>
<p>Builds the QName @prefix:@ncname in @memory if there is enough space and prefix is not NULL nor empty, otherwise allocate a new string. If prefix is NULL or empty it returns ncname.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ncname</tt></i>:</span></td>
<td>the Name</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>memory</tt></i>:</span></td>
<td>preallocated memory</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>preallocated memory length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new string which must be freed by the caller if different from @memory and @ncname or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlChildElementCount"></a>xmlChildElementCount ()</h3>
<pre class="programlisting">unsigned long	xmlChildElementCount	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent)<br>
</pre>
<p>Finds the current number of child nodes of that element which are element nodes. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back <a href="libxml2-SAX.html#reference">reference</a> from entities content to entities references.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the count of element child or 0 if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyDoc"></a>xmlCopyDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCopyDoc		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int recursive)<br>
</pre>
<p>Do a copy of the document info. If recursive, the content tree will be copied too as well as DTD, namespaces and entities.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>recursive</tt></i>:</span></td>
<td>if not zero do a recursive copy.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlDocPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyDtd"></a>xmlCopyDtd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlCopyDtd		(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd)<br>
</pre>
<p>Do a copy of the dtd.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>the dtd</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlDtdPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyNamespace"></a>xmlCopyNamespace ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlCopyNamespace	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur)<br>
</pre>
<p>Do a copy of the namespace.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNsPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyNamespaceList"></a>xmlCopyNamespaceList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlCopyNamespaceList	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur)<br>
</pre>
<p>Do a copy of an namespace list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNsPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyNode"></a>xmlCopyNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlCopyNode		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int extended)<br>
</pre>
<p>Do a copy of the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>extended</tt></i>:</span></td>
<td>if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNodePtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyNodeList"></a>xmlCopyNodeList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlCopyNodeList		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Do a recursive copy of the node list. Use xmlDocCopyNodeList() if possible to ensure string interning.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the first node in the list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNodePtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyProp"></a>xmlCopyProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlCopyProp		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> target, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur)<br>
</pre>
<p>Do a copy of the attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>the element where the <a href="libxml2-SAX.html#attribute">attribute</a> will be grafted</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlAttrPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyPropList"></a>xmlCopyPropList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlCopyPropList		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> target, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur)<br>
</pre>
<p>Do a copy of an <a href="libxml2-SAX.html#attribute">attribute</a> list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>the element where the attributes will be grafted</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlAttrPtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateIntSubset"></a>xmlCreateIntSubset ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlCreateIntSubset	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Create the internal subset of a document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the DTD name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external (PUBLIC) ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the system ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new DTD structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapAdoptNode"></a>xmlDOMWrapAdoptNode ()</h3>
<pre class="programlisting">int	xmlDOMWrapAdoptNode		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> sourceDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> destDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> destParent, <br>					 int options)<br>
</pre>
<p>References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc-&gt;oldNs entries are used This is the case when you have an unlinked node and just want to move it to the context of If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in <a href="libxml2-SAX.html#attribute">attribute</a> values or element content. NOTE: This function was not intensively tested.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the optional context for custom processing</td>
</tr>
<tr>
<td><span class="term"><i><tt>sourceDoc</tt></i>:</span></td>
<td>the optional sourceDoc</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to start with</td>
</tr>
<tr>
<td><span class="term"><i><tt>destDoc</tt></i>:</span></td>
<td>the destination doc</td>
</tr>
<tr>
<td><span class="term"><i><tt>destParent</tt></i>:</span></td>
<td>the optional new parent of @node in @destDoc</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>option flags</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the operation succeeded, 1 if a node of unsupported type was given, 2 if a node of not yet supported type was given and -1 on API/internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapCloneNode"></a>xmlDOMWrapCloneNode ()</h3>
<pre class="programlisting">int	xmlDOMWrapCloneNode		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> sourceDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * resNode, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> destDoc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> destParent, <br>					 int deep, <br>					 int options)<br>
</pre>
<p>References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc-&gt;oldNs entries are used. This is the case when you don't know already where the cloned branch will be added to. If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in <a href="libxml2-SAX.html#attribute">attribute</a> values or element content. TODO: 1) What to do with XInclude? Currently this returns an error for XInclude.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the optional context for custom processing</td>
</tr>
<tr>
<td><span class="term"><i><tt>sourceDoc</tt></i>:</span></td>
<td>the optional sourceDoc</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to start with</td>
</tr>
<tr>
<td><span class="term"><i><tt>resNode</tt></i>:</span></td>
<td>the clone of the given @node</td>
</tr>
<tr>
<td><span class="term"><i><tt>destDoc</tt></i>:</span></td>
<td>the destination doc</td>
</tr>
<tr>
<td><span class="term"><i><tt>destParent</tt></i>:</span></td>
<td>the optional new parent of @node in @destDoc</td>
</tr>
<tr>
<td><span class="term"><i><tt>deep</tt></i>:</span></td>
<td>descend into child if set</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>option flags</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the operation succeeded, 1 if a node of unsupported (or not yet supported) type was given, -1 on API/internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapFreeCtxt"></a>xmlDOMWrapFreeCtxt ()</h3>
<pre class="programlisting">void	xmlDOMWrapFreeCtxt		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt)<br>
</pre>
<p>Frees the DOM-wrapper context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the DOM-wrapper context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapNewCtxt"></a>xmlDOMWrapNewCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a>	xmlDOMWrapNewCtxt	(void)<br>
</pre>
<p>Allocates and initializes a new DOM-wrapper context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> or NULL in case of an internal error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapReconcileNamespaces"></a>xmlDOMWrapReconcileNamespaces ()</h3>
<pre class="programlisting">int	xmlDOMWrapReconcileNamespaces	(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 int options)<br>
</pre>
<p>Ensures that ns-references point to ns-decls hold on element-nodes. Ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in <a href="libxml2-SAX.html#attribute">attribute</a> values or element content. NOTE: This function was not intensively tested.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>DOM wrapper context, unused at the moment</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element-node</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>option flags</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if succeeded, -1 otherwise and on API/internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDOMWrapRemoveNode"></a>xmlDOMWrapRemoveNode ()</h3>
<pre class="programlisting">int	xmlDOMWrapRemoveNode		(<a href="libxml2-tree.html#xmlDOMWrapCtxtPtr">xmlDOMWrapCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int options)<br>
</pre>
<p>Unlinks the given node from its owner. This will substitute ns-references to node-&gt;nsDef for ns-references to doc-&gt;oldNs, thus ensuring the removed branch to be autark wrt ns-references. NOTE: This function was not intensively tested.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a DOM wrapper context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the doc</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to be removed.</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>set of options, unused at the moment</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 on success, 1 if the node is not supported, -1 on API and internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocCopyNode"></a>xmlDocCopyNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlDocCopyNode		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int extended)<br>
</pre>
<p>Do a copy of the node to a given document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>extended</tt></i>:</span></td>
<td>if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNodePtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocCopyNodeList"></a>xmlDocCopyNodeList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlDocCopyNodeList	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Do a recursive copy of the node list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the target document</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the first node in the list.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlNodePtr, or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocDump"></a>xmlDocDump ()</h3>
<pre class="programlisting">int	xmlDocDump			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur)<br>
</pre>
<p>Dump an XML document to an open FILE.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the FILE*</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocDumpFormatMemory"></a>xmlDocDumpFormatMemory ()</h3>
<pre class="programlisting">void	xmlDocDumpFormatMemory		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size, <br>					 int format)<br>
</pre>
<p>Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>OUT: the memory pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>OUT: the memory length</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocDumpFormatMemoryEnc"></a>xmlDocDumpFormatMemoryEnc ()</h3>
<pre class="programlisting">void	xmlDocDumpFormatMemoryEnc	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> out_doc, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr, <br>					 int * doc_txt_len, <br>					 const char * txt_encoding, <br>					 int format)<br>
</pre>
<p>Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree(). Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out_doc</tt></i>:</span></td>
<td>Document to generate XML text from</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc_txt_ptr</tt></i>:</span></td>
<td>Memory pointer for allocated XML text</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc_txt_len</tt></i>:</span></td>
<td>Length of the generated XML text</td>
</tr>
<tr>
<td><span class="term"><i><tt>txt_encoding</tt></i>:</span></td>
<td>Character encoding to use when generating XML text</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocDumpMemory"></a>xmlDocDumpMemory ()</h3>
<pre class="programlisting">void	xmlDocDumpMemory		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size)<br>
</pre>
<p>Dump an XML document in memory and return the #xmlChar * and it's size in bytes. It's up to the caller to free the memory with xmlFree(). The resulting byte array is zero terminated, though the last 0 is not included in the returned size.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>OUT: the memory pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>OUT: the memory length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocDumpMemoryEnc"></a>xmlDocDumpMemoryEnc ()</h3>
<pre class="programlisting">void	xmlDocDumpMemoryEnc		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> out_doc, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr, <br>					 int * doc_txt_len, <br>					 const char * txt_encoding)<br>
</pre>
<p>Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out_doc</tt></i>:</span></td>
<td>Document to generate XML text from</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc_txt_ptr</tt></i>:</span></td>
<td>Memory pointer for allocated XML text</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc_txt_len</tt></i>:</span></td>
<td>Length of the generated XML text</td>
</tr>
<tr>
<td><span class="term"><i><tt>txt_encoding</tt></i>:</span></td>
<td>Character encoding to use when generating XML text</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocFormatDump"></a>xmlDocFormatDump ()</h3>
<pre class="programlisting">int	xmlDocFormatDump		(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 int format)<br>
</pre>
<p>Dump an XML document to an open FILE.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the FILE*</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocGetRootElement"></a>xmlDocGetRootElement ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlDocGetRootElement	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc)<br>
</pre>
<p>Get the root element of the document (doc-&gt;children is a list containing possibly comments, PIs, etc ...).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the #xmlNodePtr for the root or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDocSetRootElement"></a>xmlDocSetRootElement ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlDocSetRootElement	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> root)<br>
</pre>
<p>Set the root element of the document (doc-&gt;children is a list containing possibly comments, PIs, etc ...).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>root</tt></i>:</span></td>
<td>the new document root element, if root is NULL no action is taken, to remove a node from a document use xmlUnlinkNode(root) instead.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the old root element if any was found, NULL if root was NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElemDump"></a>xmlElemDump ()</h3>
<pre class="programlisting">void	xmlElemDump			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Dump an XML/HTML node, recursive behaviour, children are printed too.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFirstElementChild"></a>xmlFirstElementChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlFirstElementChild	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent)<br>
</pre>
<p>Finds the first child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back <a href="libxml2-SAX.html#reference">reference</a> from entities content to entities references.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the first element child or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeDoc"></a>xmlFreeDoc ()</h3>
<pre class="programlisting">void	xmlFreeDoc			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur)<br>
</pre>
<p>Free up all the structures used by a document, tree included.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>pointer to the document</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeDtd"></a>xmlFreeDtd ()</h3>
<pre class="programlisting">void	xmlFreeDtd			(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> cur)<br>
</pre>
<p>Free a DTD structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the DTD structure to free up</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeNode"></a>xmlFreeNode ()</h3>
<pre class="programlisting">void	xmlFreeNode			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Free a node, this is a recursive behaviour, all the children are freed too. This doesn't unlink the child from the list, use xmlUnlinkNode() first.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeNodeList"></a>xmlFreeNodeList ()</h3>
<pre class="programlisting">void	xmlFreeNodeList			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Free a node and all its siblings, this is a recursive behaviour, all the children are freed too.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first node in the list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeNs"></a>xmlFreeNs ()</h3>
<pre class="programlisting">void	xmlFreeNs			(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur)<br>
</pre>
<p>Free up the structures associated to a namespace</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the namespace pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeNsList"></a>xmlFreeNsList ()</h3>
<pre class="programlisting">void	xmlFreeNsList			(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> cur)<br>
</pre>
<p>Free up all the structures associated to the chained namespaces.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first namespace pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeProp"></a>xmlFreeProp ()</h3>
<pre class="programlisting">void	xmlFreeProp			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur)<br>
</pre>
<p>Free one attribute, all the content is freed too</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreePropList"></a>xmlFreePropList ()</h3>
<pre class="programlisting">void	xmlFreePropList			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur)<br>
</pre>
<p>Free a property and all its siblings, all the children are freed too.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the first property in the list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetBufferAllocationScheme"></a>xmlGetBufferAllocationScheme ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a>	xmlGetBufferAllocationScheme	(void)<br>
</pre>
<p>Types are <a href="libxml2-tree.html#XML_BUFFER_ALLOC_EXACT">XML_BUFFER_ALLOC_EXACT</a> - use exact sizes, keeps memory usage down <a href="libxml2-tree.html#XML_BUFFER_ALLOC_DOUBLEIT">XML_BUFFER_ALLOC_DOUBLEIT</a> - double buffer when extra needed, improves performance <a href="libxml2-tree.html#XML_BUFFER_ALLOC_HYBRID">XML_BUFFER_ALLOC_HYBRID</a> - use exact sizes on small strings to keep memory usage tight in normal usage, and doubleit on large strings to avoid pathological performance.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current allocation scheme</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetCompressMode"></a>xmlGetCompressMode ()</h3>
<pre class="programlisting">int	xmlGetCompressMode		(void)<br>
</pre>
<p>get the default compression mode used, ZLIB based.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 (uncompressed) to 9 (max compression)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDocCompressMode"></a>xmlGetDocCompressMode ()</h3>
<pre class="programlisting">int	xmlGetDocCompressMode		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc)<br>
</pre>
<p>get the compression ratio for a document, ZLIB based</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 (uncompressed) to 9 (max compression)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetIntSubset"></a>xmlGetIntSubset ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlGetIntSubset		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc)<br>
</pre>
<p>Get the internal subset of a document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the DTD structure or NULL if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetLastChild"></a>xmlGetLastChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlGetLastChild		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * parent)<br>
</pre>
<p>Search the last child of a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last child or NULL if none.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetLineNo"></a>xmlGetLineNo ()</h3>
<pre class="programlisting">long	xmlGetLineNo			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node)<br>
</pre>
<p>Get line number of @node. Try to override the limitation of lines being store in 16 bits ints if <a href="libxml2-parser.html#XML_PARSE_BIG_LINES">XML_PARSE_BIG_LINES</a> parser option was used</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>valid node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the line number if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetNoNsProp"></a>xmlGetNoNsProp ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlGetNoNsProp		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search and get the value of an <a href="libxml2-SAX.html#attribute">attribute</a> associated to a node This does the entity substitution. This function looks in DTD <a href="libxml2-SAX.html#attribute">attribute</a> declaration for #FIXED or default declaration values unless DTD use has been turned off. This function is similar to <a href="libxml2-tree.html#xmlGetProp">xmlGetProp</a> except it will accept only an <a href="libxml2-SAX.html#attribute">attribute</a> in no namespace.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value or NULL if not found. It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetNodePath"></a>xmlGetNodePath ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlGetNodePath		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node)<br>
</pre>
<p>Build a structure based Path for the given node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new path or NULL in case of error. The caller must free the returned string</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetNsList"></a>xmlGetNsList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> *	xmlGetNsList		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node)<br>
</pre>
<p>Search all the namespace applying to a given element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an NULL terminated array of all the #xmlNsPtr found that need to be freed by the caller or NULL if no namespace if defined</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetNsProp"></a>xmlGetNsProp ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlGetNsProp		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace)<br>
</pre>
<p>Search and get the value of an <a href="libxml2-SAX.html#attribute">attribute</a> associated to a node This <a href="libxml2-SAX.html#attribute">attribute</a> has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD <a href="libxml2-SAX.html#attribute">attribute</a> declaration for #FIXED or default declaration values unless DTD use has been turned off.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>nameSpace</tt></i>:</span></td>
<td>the URI of the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value or NULL if not found. It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetProp"></a>xmlGetProp ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlGetProp		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search and get the value of an <a href="libxml2-SAX.html#attribute">attribute</a> associated to a node This does the entity substitution. This function looks in DTD <a href="libxml2-SAX.html#attribute">attribute</a> declaration for #FIXED or default declaration values unless DTD use has been turned off. NOTE: this function acts independently of namespaces associated to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() for namespace aware processing.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value or NULL if not found. It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHasNsProp"></a>xmlHasNsProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlHasNsProp		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace)<br>
</pre>
<p>Search for an <a href="libxml2-SAX.html#attribute">attribute</a> associated to a node This <a href="libxml2-SAX.html#attribute">attribute</a> has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD <a href="libxml2-SAX.html#attribute">attribute</a> declaration for #FIXED or default declaration values unless DTD use has been turned off. Note that a namespace of NULL indicates to use the default namespace.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>nameSpace</tt></i>:</span></td>
<td>the URI of the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> or the <a href="libxml2-SAX.html#attribute">attribute</a> declaration or NULL if neither was found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHasProp"></a>xmlHasProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlHasProp		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search an <a href="libxml2-SAX.html#attribute">attribute</a> associated to a node This function also looks in DTD <a href="libxml2-SAX.html#attribute">attribute</a> declaration for #FIXED or default declaration values unless DTD use has been turned off.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> or the <a href="libxml2-SAX.html#attribute">attribute</a> declaration or NULL if neither was found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsBlankNode"></a>xmlIsBlankNode ()</h3>
<pre class="programlisting">int	xmlIsBlankNode			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node)<br>
</pre>
<p>Checks whether this node is an empty or whitespace only (and possibly ignorable) text-node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 yes, 0 no</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsXHTML"></a>xmlIsXHTML ()</h3>
<pre class="programlisting">int	xmlIsXHTML			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicID)<br>
</pre>
<p>Try to find if the document correspond to an XHTML DTD</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>systemID</tt></i>:</span></td>
<td>the system identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicID</tt></i>:</span></td>
<td>the public identifier</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if not and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLastElementChild"></a>xmlLastElementChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlLastElementChild	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent)<br>
</pre>
<p>Finds the last child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back <a href="libxml2-SAX.html#reference">reference</a> from entities content to entities references.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last element child or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewCDataBlock"></a>xmlNewCDataBlock ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewCDataBlock	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Creation of a new node containing a CDATA block.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the CDATA block content content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the block</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewCharRef"></a>xmlNewCharRef ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewCharRef		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Creation of a new character <a href="libxml2-SAX.html#reference">reference</a> node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the char ref string, starting with # or "&amp;# ... ;"</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewChild"></a>xmlNewChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewChild		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child list containing the TEXTs and ENTITY_REFs node will be created. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references. XML special chars must be escaped first by using xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the child</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the XML content of the child if any.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewComment"></a>xmlNewComment ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewComment		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Use of this function is DISCOURAGED in favor of xmlNewDocComment. Creation of a new node containing a comment.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#comment">comment</a> content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDoc"></a>xmlNewDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlNewDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * version)<br>
</pre>
<p>Creates a new XML document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>version</tt></i>:</span></td>
<td>
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string giving the version of XML "1.0"</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocComment"></a>xmlNewDocComment ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocComment	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new node containing a <a href="libxml2-SAX.html#comment">comment</a> within a document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#comment">comment</a> content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocFragment"></a>xmlNewDocFragment ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocFragment	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Creation of a new Fragment node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document owning the fragment</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocNode"></a>xmlNewDocNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocNode		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the node name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the XML text content if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocNodeEatName"></a>xmlNewDocNodeEatName ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocNodeEatName	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the node name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the XML text content if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocPI"></a>xmlNewDocPI ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocPI		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a processing instruction element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the target document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the processing instruction name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the PI content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocProp"></a>xmlNewDocProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlNewDocProp		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Create a new property carried by a document. NOTE: @value is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewProp() if you don't need entities support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocRawNode"></a>xmlNewDocRawNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocRawNode	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new node element within a document. @ns and @content are optional (NULL).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the node name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocText"></a>xmlNewDocText ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocText		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new text node within a document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocTextLen"></a>xmlNewDocTextLen ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewDocTextLen	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Creation of a new text node with an extra content length parameter. The text node pertain to a given document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the text len.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDtd"></a>xmlNewDtd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlNewDtd		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Creation of a new DTD for the external subset. To create an internal subset, use xmlCreateIntSubset().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the DTD name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the system ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new DTD structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewGlobalNs"></a>xmlNewGlobalNs ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlNewGlobalNs		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Creation of a Namespace, the old way using PI and without scoping DEPRECATED !!!</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document carrying the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the URI associated</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix for the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL this functionality had been removed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewNode"></a>xmlNewNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewNode		(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Creation of a new node element. @ns is optional (NULL). Use of this function is DISCOURAGED in favor of xmlNewDocNode.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the node name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object. Uses xmlStrdup() to make copy of @name.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewNodeEatName"></a>xmlNewNodeEatName ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewNodeEatName	(<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Creation of a new node element. @ns is optional (NULL). Use of this function is DISCOURAGED in favor of xmlNewDocNodeEatName.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the node name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object, with pointer @name as new node's name. Use xmlNewNode() if a copy of @name string is is needed as new node's name.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewNs"></a>xmlNewNs ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlNewNs		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Creation of a new Namespace. This function will refuse to create a namespace with a similar prefix than an existing one present on this node. Note that for a default namespace, @prefix should be NULL. We use href==NULL in the case of an element creation where the namespace was not defined.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the element carrying the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the URI associated</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix for the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new namespace pointer or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewNsProp"></a>xmlNewNsProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlNewNsProp		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Create a new property tagged with a namespace and carried by a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the holding node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewNsPropEatName"></a>xmlNewNsPropEatName ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlNewNsPropEatName	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Create a new property tagged with a namespace and carried by a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the holding node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewPI"></a>xmlNewPI ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewPI		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a processing instruction element. Use of this function is DISCOURAGED in favor of xmlNewDocPI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the processing instruction name</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the PI content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewProp"></a>xmlNewProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlNewProp		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Create a new property carried by a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the holding node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewReference"></a>xmlNewReference ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewReference		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Creation of a new <a href="libxml2-SAX.html#reference">reference</a> node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#reference">reference</a> name, or the <a href="libxml2-SAX.html#reference">reference</a> string with &amp; and ;</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewText"></a>xmlNewText ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewText		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new text node. Use of this function is DISCOURAGED in favor of xmlNewDocText.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextChild"></a>xmlNewTextChild ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewTextChild		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child TEXT node will be created containing the string @content. NOTE: Use xmlNewChild() if @content will contain entities that need to be preserved. Use this function, xmlNewTextChild(), if you need to ensure that reserved XML chars that might appear in @content, such as the ampersand, greater-than or less-than signs, are automatically replaced by their XML escaped entity representations.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a namespace if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the child</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content of the child if any.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextLen"></a>xmlNewTextLen ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNewTextLen		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Use of this function is DISCOURAGED in favor of xmlNewDocTextLen. Creation of a new text node with an extra parameter for the content's length</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the text content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the text len.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the new node object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNextElementSibling"></a>xmlNextElementSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlNextElementSibling	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Finds the first closest next sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back <a href="libxml2-SAX.html#reference">reference</a> from entities content to entities references.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next element sibling or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeAddContent"></a>xmlNodeAddContent ()</h3>
<pre class="programlisting">void	xmlNodeAddContent		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being modified</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>extra content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeAddContentLen"></a>xmlNodeAddContentLen ()</h3>
<pre class="programlisting">void	xmlNodeAddContentLen		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being modified</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>extra content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the size of @content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeBufGetContent"></a>xmlNodeBufGetContent ()</h3>
<pre class="programlisting">int	xmlNodeBufGetContent		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeDump"></a>xmlNodeDump ()</h3>
<pre class="programlisting">int	xmlNodeDump			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format)<br>
</pre>
<p>Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called. Since this is using <a href="libxml2-tree.html#xmlBuffer">xmlBuffer</a> structures it is limited to 2GB and somehow deprecated, use xmlNodeDumpOutput() instead.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>level</tt></i>:</span></td>
<td>the imbrication level for indenting</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>is formatting allowed</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written to the buffer or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeDumpOutput"></a>xmlNodeDumpOutput ()</h3>
<pre class="programlisting">void	xmlNodeDumpOutput		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int level, <br>					 int format, <br>					 const char * encoding)<br>
</pre>
<p>Dump an XML node, recursive behaviour, children are printed too. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>level</tt></i>:</span></td>
<td>the imbrication level for indenting</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>is formatting allowed</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>an optional encoding string</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeGetBase"></a>xmlNodeGetBase ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNodeGetBase		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Searches for the BASE URL. The code should work on both XML and HTML document even if base mechanisms are completely different. It returns the base as defined in RFC 2396 sections 5.1.1. Base URI within Document Content and 5.1.2. Base URI from the Encapsulating Entity However it does not return the document base (5.1.3), use doc-&gt;URL in this case</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document the node pertains to</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being checked</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the base URL, or NULL if not found It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeGetContent"></a>xmlNodeGetContent ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNodeGetContent	(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Read the value of a node, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being read</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new #xmlChar * or NULL if no content is available. It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeGetLang"></a>xmlNodeGetLang ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNodeGetLang		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Searches the language of a node, i.e. the values of the xml:lang <a href="libxml2-SAX.html#attribute">attribute</a> or the one carried by the nearest ancestor.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being checked</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the lang value, or NULL if not found It's up to the caller to free the memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeGetSpacePreserve"></a>xmlNodeGetSpacePreserve ()</h3>
<pre class="programlisting">int	xmlNodeGetSpacePreserve		(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * cur)<br>
</pre>
<p>Searches the space preserving behaviour of a node, i.e. the values of the xml:space <a href="libxml2-SAX.html#attribute">attribute</a> or the one carried by the nearest ancestor.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being checked</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 if xml:space is not inherited, 0 if "default", 1 if "preserve"</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeIsText"></a>xmlNodeIsText ()</h3>
<pre class="programlisting">int	xmlNodeIsText			(const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * node)<br>
</pre>
<p>Is this node a Text node ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 yes, 0 no</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeListGetRawString"></a>xmlNodeListGetRawString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNodeListGetRawString	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * list, <br>					 int inLine)<br>
</pre>
<p>Builds the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() this function doesn't do any character encoding handling.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>list</tt></i>:</span></td>
<td>a Node list</td>
</tr>
<tr>
<td><span class="term"><i><tt>inLine</tt></i>:</span></td>
<td>should we replace entity contents or show their external form</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the string copy, the caller must free it with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeListGetString"></a>xmlNodeListGetString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlNodeListGetString	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-tree.html#xmlNode">xmlNode</a> * list, <br>					 int inLine)<br>
</pre>
<p>Build the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>list</tt></i>:</span></td>
<td>a Node list</td>
</tr>
<tr>
<td><span class="term"><i><tt>inLine</tt></i>:</span></td>
<td>should we replace entity contents or show their external form</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the string copy, the caller must free it with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetBase"></a>xmlNodeSetBase ()</h3>
<pre class="programlisting">void	xmlNodeSetBase			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * uri)<br>
</pre>
<p>Set (or reset) the base URI of a node, i.e. the value of the xml:base attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being changed</td>
</tr>
<tr>
<td><span class="term"><i><tt>uri</tt></i>:</span></td>
<td>the new base URI</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetContent"></a>xmlNodeSetContent ()</h3>
<pre class="programlisting">void	xmlNodeSetContent		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being modified</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the new value of the content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetContentLen"></a>xmlNodeSetContentLen ()</h3>
<pre class="programlisting">void	xmlNodeSetContentLen		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being modified</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the new value of the content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the size of @content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetLang"></a>xmlNodeSetLang ()</h3>
<pre class="programlisting">void	xmlNodeSetLang			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * lang)<br>
</pre>
<p>Set the language of a node, i.e. the values of the xml:lang attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being changed</td>
</tr>
<tr>
<td><span class="term"><i><tt>lang</tt></i>:</span></td>
<td>the language description</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetName"></a>xmlNodeSetName ()</h3>
<pre class="programlisting">void	xmlNodeSetName			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Set (or reset) the name of a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being changed</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the new tag name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetSpacePreserve"></a>xmlNodeSetSpacePreserve ()</h3>
<pre class="programlisting">void	xmlNodeSetSpacePreserve		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 int val)<br>
</pre>
<p>Set (or reset) the space preserving behaviour of a node, i.e. the value of the xml:space attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node being changed</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the xml:space value ("0": default, 1: "preserve")</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPreviousElementSibling"></a>xmlPreviousElementSibling ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlPreviousElementSibling	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Finds the first closest previous sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back <a href="libxml2-SAX.html#reference">reference</a> from entities content to entities references.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous element sibling or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReconciliateNs"></a>xmlReconciliateNs ()</h3>
<pre class="programlisting">int	xmlReconciliateNs		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree)<br>
</pre>
<p>This function checks that all the namespaces declared within the given tree are properly declared. This is needed for example after Copy or Cut and then paste operations. The subtree may still hold pointers to namespace declarations outside the subtree or invalid/masked. As much as possible the function try to reuse the existing namespaces found in the new environment. If not possible the new namespaces are redeclared on @tree at the top of the given subtree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>a node defining the subtree to reconciliate</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of namespace declarations created or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRemoveProp"></a>xmlRemoveProp ()</h3>
<pre class="programlisting">int	xmlRemoveProp			(<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> cur)<br>
</pre>
<p>Unlink and free one attribute, all the content is freed too Note this doesn't work for namespace definition attributes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReplaceNode"></a>xmlReplaceNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlReplaceNode		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> old, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Unlink the old node from its current context, prune the new one at the same place. If @cur was already inserted in a document it is first unlinked from its existing context. See the note regarding namespaces in xmlAddChild.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>old</tt></i>:</span></td>
<td>the old node</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the @old node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFile"></a>xmlSaveFile ()</h3>
<pre class="programlisting">int	xmlSaveFile			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur)<br>
</pre>
<p>Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename (or URL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFileEnc"></a>xmlSaveFileEnc ()</h3>
<pre class="programlisting">int	xmlSaveFileEnc			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding)<br>
</pre>
<p>Dump an XML document, converting it to the given encoding</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename (or URL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the name of an encoding (or NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFileTo"></a>xmlSaveFileTo ()</h3>
<pre class="programlisting">int	xmlSaveFileTo			(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding)<br>
</pre>
<p>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an output I/O buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding if any assuming the I/O layer handles the transcoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFormatFile"></a>xmlSaveFormatFile ()</h3>
<pre class="programlisting">int	xmlSaveFormatFile		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 int format)<br>
</pre>
<p>Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. If @format is set then the document will be indented on output. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename (or URL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFormatFileEnc"></a>xmlSaveFormatFileEnc ()</h3>
<pre class="programlisting">int	xmlSaveFormatFileEnc		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an XML document to a file or an URL.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename or URL to output</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document being saved</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the name of the encoding to use or NULL.</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces be added.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of error. Note that @format = 1 provide node indenting only if <a href="libxml2-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFormatFileTo"></a>xmlSaveFormatFileTo ()</h3>
<pre class="programlisting">int	xmlSaveFormatFileTo		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an output I/O buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding if any assuming the I/O layer handles the transcoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSearchNs"></a>xmlSearchNs ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlSearchNs		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * nameSpace)<br>
</pre>
<p>Search a Ns registered under a given name space for a document. recurse on the parents until it finds the defined namespace or return NULL otherwise. @nameSpace can be NULL, this is a search for the default namespace. We don't allow to cross entities boundaries. If you don't declare the namespace within those you will be in troubles !!! A warning is generated to cover this case.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>nameSpace</tt></i>:</span></td>
<td>the namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace pointer or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSearchNsByHref"></a>xmlSearchNsByHref ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlSearchNsByHref	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href)<br>
</pre>
<p>Search a Ns aliasing a given URI. Recurse on the parents until it finds the defined namespace or return NULL otherwise.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the namespace value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace pointer or NULL.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetBufferAllocationScheme"></a>xmlSetBufferAllocationScheme ()</h3>
<pre class="programlisting">void	xmlSetBufferAllocationScheme	(<a href="libxml2-tree.html#xmlBufferAllocationScheme">xmlBufferAllocationScheme</a> scheme)<br>
</pre>
<p>Set the buffer allocation method. Types are <a href="libxml2-tree.html#XML_BUFFER_ALLOC_EXACT">XML_BUFFER_ALLOC_EXACT</a> - use exact sizes, keeps memory usage down <a href="libxml2-tree.html#XML_BUFFER_ALLOC_DOUBLEIT">XML_BUFFER_ALLOC_DOUBLEIT</a> - double buffer when extra needed, improves performance</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>scheme</tt></i>:</span></td>
<td>allocation method to use</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetCompressMode"></a>xmlSetCompressMode ()</h3>
<pre class="programlisting">void	xmlSetCompressMode		(int mode)<br>
</pre>
<p>set the default compression mode used, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the compression ratio</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetDocCompressMode"></a>xmlSetDocCompressMode ()</h3>
<pre class="programlisting">void	xmlSetDocCompressMode		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 int mode)<br>
</pre>
<p>set the compression ratio for a document, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the compression ratio</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetListDoc"></a>xmlSetListDoc ()</h3>
<pre class="programlisting">void	xmlSetListDoc			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> list, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>update all nodes in the list to point to the right document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>list</tt></i>:</span></td>
<td>the first element</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetNs"></a>xmlSetNs ()</h3>
<pre class="programlisting">void	xmlSetNs			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns)<br>
</pre>
<p>Associate a namespace to a node, a posteriori.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node in the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a namespace pointer</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetNsProp"></a>xmlSetNsProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlSetNsProp		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Set (or reset) an <a href="libxml2-SAX.html#attribute">attribute</a> carried by a node. The ns structure must be in scope, this is not checked</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> pointer.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetProp"></a>xmlSetProp ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlSetProp		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Set (or reset) an <a href="libxml2-SAX.html#attribute">attribute</a> carried by a node. If @name has a prefix, then the corresponding namespace-binding will be used, if in scope; it is an error it there's no such ns-binding for the prefix in scope.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name (a QName)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> pointer.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetTreeDoc"></a>xmlSetTreeDoc ()</h3>
<pre class="programlisting">void	xmlSetTreeDoc			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>update all nodes under the tree to point to the right document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the top element</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSplitQName2"></a>xmlSplitQName2 ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSplitQName2		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** prefix)<br>
</pre>
<p>parse an XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the full QName</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> **</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if the name doesn't have a prefix. Otherwise, returns the local part, and prefix is updated to get the Prefix. Both the return value and the prefix must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSplitQName3"></a>xmlSplitQName3 ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSplitQName3		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int * len)<br>
</pre>
<p>parse an XML qualified name string,i</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the full QName</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>an int *</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if it is not a Qualified Name, otherwise, update len with the length in byte of the prefix and return a pointer to the start of the name without the prefix</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringGetNodeList"></a>xmlStringGetNodeList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlStringGetNodeList	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the first child</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStringLenGetNodeList"></a>xmlStringLenGetNodeList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlStringLenGetNodeList	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len)<br>
</pre>
<p>Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value of the text</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the string value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the first child</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextConcat"></a>xmlTextConcat ()</h3>
<pre class="programlisting">int	xmlTextConcat			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content, <br>					 int len)<br>
</pre>
<p>Concat the given string at the end of the existing node content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>@content length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextMerge"></a>xmlTextMerge ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlTextMerge		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> first, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> second)<br>
</pre>
<p>Merge two text nodes into one</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>first</tt></i>:</span></td>
<td>the first text node</td>
</tr>
<tr>
<td><span class="term"><i><tt>second</tt></i>:</span></td>
<td>the second text node being merged</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the first text node augmented</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUnlinkNode"></a>xmlUnlinkNode ()</h3>
<pre class="programlisting">void	xmlUnlinkNode			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Unlink a node from it's current context, the node is not freed If one need to free the node, use xmlFreeNode() routine after the unlink to discard it. Note that namespace nodes can't be unlinked as they do not have pointer to their parent.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the node</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUnsetNsProp"></a>xmlUnsetNsProp ()</h3>
<pre class="programlisting">int	xmlUnsetNsProp			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Remove an <a href="libxml2-SAX.html#attribute">attribute</a> carried by a node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful, -1 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlUnsetProp"></a>xmlUnsetProp ()</h3>
<pre class="programlisting">int	xmlUnsetProp			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Remove an <a href="libxml2-SAX.html#attribute">attribute</a> carried by a node. This handles only attributes in no namespace.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful, -1 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNCName"></a>xmlValidateNCName ()</h3>
<pre class="programlisting">int	xmlValidateNCName		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space)<br>
</pre>
<p>Check that a value conforms to the lexical space of NCName</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>space</tt></i>:</span></td>
<td>allow spaces in front and end of the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNMToken"></a>xmlValidateNMToken ()</h3>
<pre class="programlisting">int	xmlValidateNMToken		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space)<br>
</pre>
<p>Check that a value conforms to the lexical space of NMToken</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>space</tt></i>:</span></td>
<td>allow spaces in front and end of the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateName"></a>xmlValidateName ()</h3>
<pre class="programlisting">int	xmlValidateName			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space)<br>
</pre>
<p>Check that a value conforms to the lexical space of Name</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>space</tt></i>:</span></td>
<td>allow spaces in front and end of the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateQName"></a>xmlValidateQName ()</h3>
<pre class="programlisting">int	xmlValidateQName		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int space)<br>
</pre>
<p>Check that a value conforms to the lexical space of QName</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>space</tt></i>:</span></td>
<td>allow spaces in front and end of the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/style.css000064400000001464151730335320012272 0ustar00.synopsis, .classsynopsis 
{
  background: #eeeeee;
  border: solid 1px #aaaaaa;
  padding: 0.5em;
}
.programlisting 
{
  background: #eeeeff;
  border: solid 1px #aaaaff;
  padding: 0.5em;
}
.variablelist 
{
  padding: 4px;
  margin-left: 3em;
}
.variablelist td:first-child
{
  vertical-align: top;
}
table.navigation 
{
  background: #ffeeee;
  border: solid 1px #ffaaaa;
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}
.navigation a 
{
  color: #770000;
}
.navigation a:visited 
{
  color: #550000;
}
.navigation .title 
{
  font-size: 200%;
}
div.refnamediv 
{
  margin-top: 2em;
}
div.gallery-float 
{
  float: left;
  padding: 10px;
}
div.gallery-float img 
{
  border-style: none;
}
div.gallery-spacer 
{
  clear: both;
}
a
{
  text-decoration: none;
}
a:hover
{
  text-decoration: underline;
  color: #FF0000;
}
gtk-doc/html/libxml2/libxml2-xmlversion.html000064400000044022151730335320015060 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlversion: compile-time version information</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlunicode.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlwriter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlversion</span></h2>
<p>xmlversion - compile-time version information</p>
<p>compile-time version information for the XML library </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#ATTRIBUTE_UNUSED">ATTRIBUTE_UNUSED</a>;
#define <a href="#DEBUG_MEMORY_LOCATION">DEBUG_MEMORY_LOCATION</a>;
#define <a href="#LIBXML_ATTR_ALLOC_SIZE">LIBXML_ATTR_ALLOC_SIZE</a>;
#define <a href="#LIBXML_ATTR_FORMAT">LIBXML_ATTR_FORMAT</a>;
#define <a href="#LIBXML_AUTOMATA_ENABLED">LIBXML_AUTOMATA_ENABLED</a>;
#define <a href="#LIBXML_C14N_ENABLED">LIBXML_C14N_ENABLED</a>;
#define <a href="#LIBXML_CATALOG_ENABLED">LIBXML_CATALOG_ENABLED</a>;
#define <a href="#LIBXML_DEBUG_ENABLED">LIBXML_DEBUG_ENABLED</a>;
#define <a href="#LIBXML_DEBUG_RUNTIME">LIBXML_DEBUG_RUNTIME</a>;
#define <a href="#LIBXML_DOTTED_VERSION">LIBXML_DOTTED_VERSION</a>;
#define <a href="#LIBXML_EXPR_ENABLED">LIBXML_EXPR_ENABLED</a>;
#define <a href="#LIBXML_FTP_ENABLED">LIBXML_FTP_ENABLED</a>;
#define <a href="#LIBXML_HTML_ENABLED">LIBXML_HTML_ENABLED</a>;
#define <a href="#LIBXML_HTTP_ENABLED">LIBXML_HTTP_ENABLED</a>;
#define <a href="#LIBXML_ICONV_ENABLED">LIBXML_ICONV_ENABLED</a>;
#define <a href="#LIBXML_ICU_ENABLED">LIBXML_ICU_ENABLED</a>;
#define <a href="#LIBXML_ISO8859X_ENABLED">LIBXML_ISO8859X_ENABLED</a>;
#define <a href="#LIBXML_LEGACY_ENABLED">LIBXML_LEGACY_ENABLED</a>;
#define <a href="#LIBXML_LZMA_ENABLED">LIBXML_LZMA_ENABLED</a>;
#define <a href="#LIBXML_MODULES_ENABLED">LIBXML_MODULES_ENABLED</a>;
#define <a href="#LIBXML_MODULE_EXTENSION">LIBXML_MODULE_EXTENSION</a>;
#define <a href="#LIBXML_OUTPUT_ENABLED">LIBXML_OUTPUT_ENABLED</a>;
#define <a href="#LIBXML_PATTERN_ENABLED">LIBXML_PATTERN_ENABLED</a>;
#define <a href="#LIBXML_PUSH_ENABLED">LIBXML_PUSH_ENABLED</a>;
#define <a href="#LIBXML_READER_ENABLED">LIBXML_READER_ENABLED</a>;
#define <a href="#LIBXML_REGEXP_ENABLED">LIBXML_REGEXP_ENABLED</a>;
#define <a href="#LIBXML_SAX1_ENABLED">LIBXML_SAX1_ENABLED</a>;
#define <a href="#LIBXML_SCHEMAS_ENABLED">LIBXML_SCHEMAS_ENABLED</a>;
#define <a href="#LIBXML_SCHEMATRON_ENABLED">LIBXML_SCHEMATRON_ENABLED</a>;
#define <a href="#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a>;
#define <a href="#LIBXML_THREAD_ALLOC_ENABLED">LIBXML_THREAD_ALLOC_ENABLED</a>;
#define <a href="#LIBXML_THREAD_ENABLED">LIBXML_THREAD_ENABLED</a>;
#define <a href="#LIBXML_TREE_ENABLED">LIBXML_TREE_ENABLED</a>;
#define <a href="#LIBXML_UNICODE_ENABLED">LIBXML_UNICODE_ENABLED</a>;
#define <a href="#LIBXML_VALID_ENABLED">LIBXML_VALID_ENABLED</a>;
#define <a href="#LIBXML_VERSION">LIBXML_VERSION</a>;
#define <a href="#LIBXML_VERSION_EXTRA">LIBXML_VERSION_EXTRA</a>;
#define <a href="#LIBXML_VERSION_STRING">LIBXML_VERSION_STRING</a>;
#define <a href="#LIBXML_WRITER_ENABLED">LIBXML_WRITER_ENABLED</a>;
#define <a href="#LIBXML_XINCLUDE_ENABLED">LIBXML_XINCLUDE_ENABLED</a>;
#define <a href="#LIBXML_XPATH_ENABLED">LIBXML_XPATH_ENABLED</a>;
#define <a href="#LIBXML_XPTR_ENABLED">LIBXML_XPTR_ENABLED</a>;
#define <a href="#LIBXML_XPTR_LOCS_ENABLED">LIBXML_XPTR_LOCS_ENABLED</a>;
#define <a href="#LIBXML_ZLIB_ENABLED">LIBXML_ZLIB_ENABLED</a>;
#define <a href="#WITHOUT_TRIO">WITHOUT_TRIO</a>;
#define <a href="#WITH_TRIO">WITH_TRIO</a>;
#define <a href="#XML_DEPRECATED">XML_DEPRECATED</a>;
void	<a href="#xmlCheckVersion">xmlCheckVersion</a>			(int version);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="ATTRIBUTE_UNUSED">Macro </a>ATTRIBUTE_UNUSED</h3>
<pre class="programlisting">#define <a href="#ATTRIBUTE_UNUSED">ATTRIBUTE_UNUSED</a>;
</pre>
<p>Macro used to signal to GCC unused function parameters</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="DEBUG_MEMORY_LOCATION">Macro </a>DEBUG_MEMORY_LOCATION</h3>
<pre class="programlisting">#define <a href="#DEBUG_MEMORY_LOCATION">DEBUG_MEMORY_LOCATION</a>;
</pre>
<p>Whether the memory debugging is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ATTR_ALLOC_SIZE">Macro </a>LIBXML_ATTR_ALLOC_SIZE</h3>
<pre class="programlisting">#define <a href="#LIBXML_ATTR_ALLOC_SIZE">LIBXML_ATTR_ALLOC_SIZE</a>;
</pre>
<p>Macro used to indicate to GCC this is an allocator function</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ATTR_FORMAT">Macro </a>LIBXML_ATTR_FORMAT</h3>
<pre class="programlisting">#define <a href="#LIBXML_ATTR_FORMAT">LIBXML_ATTR_FORMAT</a>;
</pre>
<p>Macro used to indicate to GCC the parameter are printf like</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_AUTOMATA_ENABLED">Macro </a>LIBXML_AUTOMATA_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_AUTOMATA_ENABLED">LIBXML_AUTOMATA_ENABLED</a>;
</pre>
<p>Whether the automata interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_C14N_ENABLED">Macro </a>LIBXML_C14N_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_C14N_ENABLED">LIBXML_C14N_ENABLED</a>;
</pre>
<p>Whether the Canonicalization support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_CATALOG_ENABLED">Macro </a>LIBXML_CATALOG_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_CATALOG_ENABLED">LIBXML_CATALOG_ENABLED</a>;
</pre>
<p>Whether the Catalog support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_DEBUG_ENABLED">Macro </a>LIBXML_DEBUG_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_DEBUG_ENABLED">LIBXML_DEBUG_ENABLED</a>;
</pre>
<p>Whether Debugging module is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_DEBUG_RUNTIME">Macro </a>LIBXML_DEBUG_RUNTIME</h3>
<pre class="programlisting">#define <a href="#LIBXML_DEBUG_RUNTIME">LIBXML_DEBUG_RUNTIME</a>;
</pre>
<p>Whether the runtime debugging is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_DOTTED_VERSION">Macro </a>LIBXML_DOTTED_VERSION</h3>
<pre class="programlisting">#define <a href="#LIBXML_DOTTED_VERSION">LIBXML_DOTTED_VERSION</a>;
</pre>
<p>the version string like "1.2.3"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_EXPR_ENABLED">Macro </a>LIBXML_EXPR_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_EXPR_ENABLED">LIBXML_EXPR_ENABLED</a>;
</pre>
<p>Whether the formal expressions interfaces are compiled in This code is unused and disabled unconditionally for now.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_FTP_ENABLED">Macro </a>LIBXML_FTP_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_FTP_ENABLED">LIBXML_FTP_ENABLED</a>;
</pre>
<p>Whether the FTP support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_HTML_ENABLED">Macro </a>LIBXML_HTML_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_HTML_ENABLED">LIBXML_HTML_ENABLED</a>;
</pre>
<p>Whether the HTML support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_HTTP_ENABLED">Macro </a>LIBXML_HTTP_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_HTTP_ENABLED">LIBXML_HTTP_ENABLED</a>;
</pre>
<p>Whether the HTTP support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ICONV_ENABLED">Macro </a>LIBXML_ICONV_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_ICONV_ENABLED">LIBXML_ICONV_ENABLED</a>;
</pre>
<p>Whether iconv support is available</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ICU_ENABLED">Macro </a>LIBXML_ICU_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_ICU_ENABLED">LIBXML_ICU_ENABLED</a>;
</pre>
<p>Whether icu support is available</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ISO8859X_ENABLED">Macro </a>LIBXML_ISO8859X_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_ISO8859X_ENABLED">LIBXML_ISO8859X_ENABLED</a>;
</pre>
<p>Whether ISO-8859-* support is made available in case iconv is not</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_LEGACY_ENABLED">Macro </a>LIBXML_LEGACY_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_LEGACY_ENABLED">LIBXML_LEGACY_ENABLED</a>;
</pre>
<p>Whether the deprecated APIs are compiled in for compatibility</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_LZMA_ENABLED">Macro </a>LIBXML_LZMA_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_LZMA_ENABLED">LIBXML_LZMA_ENABLED</a>;
</pre>
<p>Whether the Lzma support is compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_MODULES_ENABLED">Macro </a>LIBXML_MODULES_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_MODULES_ENABLED">LIBXML_MODULES_ENABLED</a>;
</pre>
<p>Whether the module interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_MODULE_EXTENSION">Macro </a>LIBXML_MODULE_EXTENSION</h3>
<pre class="programlisting">#define <a href="#LIBXML_MODULE_EXTENSION">LIBXML_MODULE_EXTENSION</a>;
</pre>
<p>the string suffix used by dynamic modules (usually shared libraries)</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_OUTPUT_ENABLED">Macro </a>LIBXML_OUTPUT_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_OUTPUT_ENABLED">LIBXML_OUTPUT_ENABLED</a>;
</pre>
<p>Whether the serialization/saving support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_PATTERN_ENABLED">Macro </a>LIBXML_PATTERN_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_PATTERN_ENABLED">LIBXML_PATTERN_ENABLED</a>;
</pre>
<p>Whether the <a href="libxml2-pattern.html#xmlPattern">xmlPattern</a> node selection interface is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_PUSH_ENABLED">Macro </a>LIBXML_PUSH_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_PUSH_ENABLED">LIBXML_PUSH_ENABLED</a>;
</pre>
<p>Whether the push parsing interfaces are configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_READER_ENABLED">Macro </a>LIBXML_READER_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_READER_ENABLED">LIBXML_READER_ENABLED</a>;
</pre>
<p>Whether the xmlReader parsing interface is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_REGEXP_ENABLED">Macro </a>LIBXML_REGEXP_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_REGEXP_ENABLED">LIBXML_REGEXP_ENABLED</a>;
</pre>
<p>Whether the regular expressions interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_SAX1_ENABLED">Macro </a>LIBXML_SAX1_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_SAX1_ENABLED">LIBXML_SAX1_ENABLED</a>;
</pre>
<p>Whether the older SAX1 interface is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_SCHEMAS_ENABLED">Macro </a>LIBXML_SCHEMAS_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_SCHEMAS_ENABLED">LIBXML_SCHEMAS_ENABLED</a>;
</pre>
<p>Whether the Schemas validation interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_SCHEMATRON_ENABLED">Macro </a>LIBXML_SCHEMATRON_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_SCHEMATRON_ENABLED">LIBXML_SCHEMATRON_ENABLED</a>;
</pre>
<p>Whether the Schematron validation interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_TEST_VERSION">Macro </a>LIBXML_TEST_VERSION</h3>
<pre class="programlisting">#define <a href="#LIBXML_TEST_VERSION">LIBXML_TEST_VERSION</a>;
</pre>
<p>Macro to check that the libxml version in use is compatible with the version the software has been compiled against</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_THREAD_ALLOC_ENABLED">Macro </a>LIBXML_THREAD_ALLOC_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_THREAD_ALLOC_ENABLED">LIBXML_THREAD_ALLOC_ENABLED</a>;
</pre>
<p>Whether the allocation hooks are per-thread</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_THREAD_ENABLED">Macro </a>LIBXML_THREAD_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_THREAD_ENABLED">LIBXML_THREAD_ENABLED</a>;
</pre>
<p>Whether the thread support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_TREE_ENABLED">Macro </a>LIBXML_TREE_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_TREE_ENABLED">LIBXML_TREE_ENABLED</a>;
</pre>
<p>Whether the DOM like tree manipulation API support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_UNICODE_ENABLED">Macro </a>LIBXML_UNICODE_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_UNICODE_ENABLED">LIBXML_UNICODE_ENABLED</a>;
</pre>
<p>Whether the Unicode related interfaces are compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_VALID_ENABLED">Macro </a>LIBXML_VALID_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_VALID_ENABLED">LIBXML_VALID_ENABLED</a>;
</pre>
<p>Whether the DTD validation support is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_VERSION">Macro </a>LIBXML_VERSION</h3>
<pre class="programlisting">#define <a href="#LIBXML_VERSION">LIBXML_VERSION</a>;
</pre>
<p>the version number: 1.2.3 value is 10203</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_VERSION_EXTRA">Macro </a>LIBXML_VERSION_EXTRA</h3>
<pre class="programlisting">#define <a href="#LIBXML_VERSION_EXTRA">LIBXML_VERSION_EXTRA</a>;
</pre>
<p>extra version information, used to show a git commit description</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_VERSION_STRING">Macro </a>LIBXML_VERSION_STRING</h3>
<pre class="programlisting">#define <a href="#LIBXML_VERSION_STRING">LIBXML_VERSION_STRING</a>;
</pre>
<p>the version number string, 1.2.3 value is "10203"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_WRITER_ENABLED">Macro </a>LIBXML_WRITER_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_WRITER_ENABLED">LIBXML_WRITER_ENABLED</a>;
</pre>
<p>Whether the xmlWriter saving interface is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_XINCLUDE_ENABLED">Macro </a>LIBXML_XINCLUDE_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_XINCLUDE_ENABLED">LIBXML_XINCLUDE_ENABLED</a>;
</pre>
<p>Whether XInclude is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_XPATH_ENABLED">Macro </a>LIBXML_XPATH_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_XPATH_ENABLED">LIBXML_XPATH_ENABLED</a>;
</pre>
<p>Whether XPath is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_XPTR_ENABLED">Macro </a>LIBXML_XPTR_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_XPTR_ENABLED">LIBXML_XPTR_ENABLED</a>;
</pre>
<p>Whether XPointer is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_XPTR_LOCS_ENABLED">Macro </a>LIBXML_XPTR_LOCS_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_XPTR_LOCS_ENABLED">LIBXML_XPTR_LOCS_ENABLED</a>;
</pre>
<p>Whether support for XPointer locations is configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_ZLIB_ENABLED">Macro </a>LIBXML_ZLIB_ENABLED</h3>
<pre class="programlisting">#define <a href="#LIBXML_ZLIB_ENABLED">LIBXML_ZLIB_ENABLED</a>;
</pre>
<p>Whether the Zlib support is compiled in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="WITHOUT_TRIO">Macro </a>WITHOUT_TRIO</h3>
<pre class="programlisting">#define <a href="#WITHOUT_TRIO">WITHOUT_TRIO</a>;
</pre>
<p>defined if the trio support should not be configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="WITH_TRIO">Macro </a>WITH_TRIO</h3>
<pre class="programlisting">#define <a href="#WITH_TRIO">WITH_TRIO</a>;
</pre>
<p>defined if the trio support need to be configured in</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_DEPRECATED">Macro </a>XML_DEPRECATED</h3>
<pre class="programlisting">#define <a href="#XML_DEPRECATED">XML_DEPRECATED</a>;
</pre>
<p>Macro used to indicate that a function, variable, type or struct member is deprecated.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCheckVersion"></a>xmlCheckVersion ()</h3>
<pre class="programlisting">void	xmlCheckVersion			(int version)<br>
</pre>
<p>check the compiled lib version against the include one. This can warn or immediately kill the application</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>version</tt></i>:</span></td>
<td>the include version number</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-nanoftp.html000064400000053134151730335320014323 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>nanoftp: minimal FTP implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-list.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-nanohttp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">nanoftp</span></h2>
<p>nanoftp - minimal FTP implementation</p>
<p>minimal FTP implementation allowing to fetch resources like external subset. This module is DEPRECATED, do not use any of its functions. </p>
<p> WARNING: this module is deprecated !</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#INVALID_SOCKET">INVALID_SOCKET</a>;
#define <a href="#SOCKET">SOCKET</a>;
typedef void <a href="#ftpDataCallback">ftpDataCallback</a>			(void * userData, <br>					 const char * data, <br>					 int len);
typedef void <a href="#ftpListCallback">ftpListCallback</a>			(void * userData, <br>					 const char * filename, <br>					 const char * attrib, <br>					 const char * owner, <br>					 const char * group, <br>					 unsigned long size, <br>					 int links, <br>					 int year, <br>					 const char * month, <br>					 int day, <br>					 int hour, <br>					 int minute);
int	<a href="#xmlNanoFTPCheckResponse">xmlNanoFTPCheckResponse</a>		(void * ctx);
void	<a href="#xmlNanoFTPCleanup">xmlNanoFTPCleanup</a>		(void);
int	<a href="#xmlNanoFTPClose">xmlNanoFTPClose</a>			(void * ctx);
int	<a href="#xmlNanoFTPCloseConnection">xmlNanoFTPCloseConnection</a>	(void * ctx);
int	<a href="#xmlNanoFTPConnect">xmlNanoFTPConnect</a>		(void * ctx);
void *	<a href="#xmlNanoFTPConnectTo">xmlNanoFTPConnectTo</a>		(const char * server, <br>					 int port);
int	<a href="#xmlNanoFTPCwd">xmlNanoFTPCwd</a>			(void * ctx, <br>					 const char * directory);
int	<a href="#xmlNanoFTPDele">xmlNanoFTPDele</a>			(void * ctx, <br>					 const char * file);
void	<a href="#xmlNanoFTPFreeCtxt">xmlNanoFTPFreeCtxt</a>		(void * ctx);
int	<a href="#xmlNanoFTPGet">xmlNanoFTPGet</a>			(void * ctx, <br>					 <a href="libxml2-nanoftp.html#ftpDataCallback">ftpDataCallback</a> callback, <br>					 void * userData, <br>					 const char * filename);
<a href="libxml2-nanoftp.html#SOCKET">SOCKET</a>	<a href="#xmlNanoFTPGetConnection">xmlNanoFTPGetConnection</a>		(void * ctx);
int	<a href="#xmlNanoFTPGetResponse">xmlNanoFTPGetResponse</a>		(void * ctx);
<a href="libxml2-nanoftp.html#SOCKET">SOCKET</a>	<a href="#xmlNanoFTPGetSocket">xmlNanoFTPGetSocket</a>		(void * ctx, <br>					 const char * filename);
void	<a href="#xmlNanoFTPInit">xmlNanoFTPInit</a>			(void);
int	<a href="#xmlNanoFTPList">xmlNanoFTPList</a>			(void * ctx, <br>					 <a href="libxml2-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br>					 void * userData, <br>					 const char * filename);
void *	<a href="#xmlNanoFTPNewCtxt">xmlNanoFTPNewCtxt</a>		(const char * URL);
void *	<a href="#xmlNanoFTPOpen">xmlNanoFTPOpen</a>			(const char * URL);
void	<a href="#xmlNanoFTPProxy">xmlNanoFTPProxy</a>			(const char * host, <br>					 int port, <br>					 const char * user, <br>					 const char * passwd, <br>					 int type);
int	<a href="#xmlNanoFTPQuit">xmlNanoFTPQuit</a>			(void * ctx);
int	<a href="#xmlNanoFTPRead">xmlNanoFTPRead</a>			(void * ctx, <br>					 void * dest, <br>					 int len);
void	<a href="#xmlNanoFTPScanProxy">xmlNanoFTPScanProxy</a>		(const char * URL);
int	<a href="#xmlNanoFTPUpdateURL">xmlNanoFTPUpdateURL</a>		(void * ctx, <br>					 const char * URL);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="INVALID_SOCKET">Macro </a>INVALID_SOCKET</h3>
<pre class="programlisting">#define <a href="#INVALID_SOCKET">INVALID_SOCKET</a>;
</pre>
<p>macro used to provide portability of code to windows sockets the value to be used when the socket is not valid</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="SOCKET">Macro </a>SOCKET</h3>
<pre class="programlisting">#define <a href="#SOCKET">SOCKET</a>;
</pre>
<p>macro used to provide portability of code to windows sockets</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="ftpDataCallback"></a>Function type ftpDataCallback</h3>
<pre class="programlisting">void	ftpDataCallback			(void * userData, <br>					 const char * data, <br>					 int len)<br>
</pre>
<p>A callback for the <a href="libxml2-nanoftp.html#xmlNanoFTPGet">xmlNanoFTPGet</a> command.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>the user provided context</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the data received</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>its size in bytes</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="ftpListCallback"></a>Function type ftpListCallback</h3>
<pre class="programlisting">void	ftpListCallback			(void * userData, <br>					 const char * filename, <br>					 const char * attrib, <br>					 const char * owner, <br>					 const char * group, <br>					 unsigned long size, <br>					 int links, <br>					 int year, <br>					 const char * month, <br>					 int day, <br>					 int hour, <br>					 int minute)<br>
</pre>
<p>A callback for the <a href="libxml2-nanoftp.html#xmlNanoFTPList">xmlNanoFTPList</a> command. Note that only one of year and day:minute are specified.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>user provided data for the callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file name (including "-&gt;" when links are shown)</td>
</tr>
<tr>
<td><span class="term"><i><tt>attrib</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>owner</tt></i>:</span></td>
<td>the owner string</td>
</tr>
<tr>
<td><span class="term"><i><tt>group</tt></i>:</span></td>
<td>the group string</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the file size</td>
</tr>
<tr>
<td><span class="term"><i><tt>links</tt></i>:</span></td>
<td>the link count</td>
</tr>
<tr>
<td><span class="term"><i><tt>year</tt></i>:</span></td>
<td>the year</td>
</tr>
<tr>
<td><span class="term"><i><tt>month</tt></i>:</span></td>
<td>the month</td>
</tr>
<tr>
<td><span class="term"><i><tt>day</tt></i>:</span></td>
<td>the day</td>
</tr>
<tr>
<td><span class="term"><i><tt>hour</tt></i>:</span></td>
<td>the hour</td>
</tr>
<tr>
<td><span class="term"><i><tt>minute</tt></i>:</span></td>
<td>the minute</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPCheckResponse"></a>xmlNanoFTPCheckResponse ()</h3>
<pre class="programlisting">int	xmlNanoFTPCheckResponse		(void * ctx)<br>
</pre>
<p>Check if there is a response from the FTP server after a command.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the code number, or 0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPCleanup"></a>xmlNanoFTPCleanup ()</h3>
<pre class="programlisting">void	xmlNanoFTPCleanup		(void)<br>
</pre>
<p>Cleanup the FTP protocol layer. This cleanup proxy information.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPClose"></a>xmlNanoFTPClose ()</h3>
<pre class="programlisting">int	xmlNanoFTPClose			(void * ctx)<br>
</pre>
<p>Close the connection and both control and transport</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPCloseConnection"></a>xmlNanoFTPCloseConnection ()</h3>
<pre class="programlisting">int	xmlNanoFTPCloseConnection	(void * ctx)<br>
</pre>
<p>Close the data connection from the server</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPConnect"></a>xmlNanoFTPConnect ()</h3>
<pre class="programlisting">int	xmlNanoFTPConnect		(void * ctx)<br>
</pre>
<p>Tries to open a control connection</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPConnectTo"></a>xmlNanoFTPConnectTo ()</h3>
<pre class="programlisting">void *	xmlNanoFTPConnectTo		(const char * server, <br>					 int port)<br>
</pre>
<p>Tries to open a control connection to the given server/port</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>server</tt></i>:</span></td>
<td>an FTP server name</td>
</tr>
<tr>
<td><span class="term"><i><tt>port</tt></i>:</span></td>
<td>the port (use 21 if 0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an fTP context or NULL if it failed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPCwd"></a>xmlNanoFTPCwd ()</h3>
<pre class="programlisting">int	xmlNanoFTPCwd			(void * ctx, <br>					 const char * directory)<br>
</pre>
<p>Tries to change the remote directory</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>directory</tt></i>:</span></td>
<td>a directory on the server</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 1 if CWD worked, 0 if it failed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPDele"></a>xmlNanoFTPDele ()</h3>
<pre class="programlisting">int	xmlNanoFTPDele			(void * ctx, <br>					 const char * file)<br>
</pre>
<p>Tries to delete an item (file or directory) from server</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>a file or directory on the server</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 1 if DELE worked, 0 if it failed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPFreeCtxt"></a>xmlNanoFTPFreeCtxt ()</h3>
<pre class="programlisting">void	xmlNanoFTPFreeCtxt		(void * ctx)<br>
</pre>
<p>Frees the context after closing the connection.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPGet"></a>xmlNanoFTPGet ()</h3>
<pre class="programlisting">int	xmlNanoFTPGet			(void * ctx, <br>					 <a href="libxml2-nanoftp.html#ftpDataCallback">ftpDataCallback</a> callback, <br>					 void * userData, <br>					 const char * filename)<br>
</pre>
<p>Fetch the given file from the server. All data are passed back in the callbacks. The last callback has a size of 0 block.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>callback</tt></i>:</span></td>
<td>the user callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>the user callback data</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file to retrieve</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPGetConnection"></a>xmlNanoFTPGetConnection ()</h3>
<pre class="programlisting"><a href="libxml2-nanoftp.html#SOCKET">SOCKET</a>	xmlNanoFTPGetConnection		(void * ctx)<br>
</pre>
<p>Try to open a data connection to the server. Currently only passive mode is supported.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPGetResponse"></a>xmlNanoFTPGetResponse ()</h3>
<pre class="programlisting">int	xmlNanoFTPGetResponse		(void * ctx)<br>
</pre>
<p>Get the response from the FTP server after a command.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the code number</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPGetSocket"></a>xmlNanoFTPGetSocket ()</h3>
<pre class="programlisting"><a href="libxml2-nanoftp.html#SOCKET">SOCKET</a>	xmlNanoFTPGetSocket		(void * ctx, <br>					 const char * filename)<br>
</pre>
<p>Initiate fetch of the given file from the server.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file to retrieve (or NULL if path is in context).</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the socket for the data connection, or &lt;0 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPInit"></a>xmlNanoFTPInit ()</h3>
<pre class="programlisting">void	xmlNanoFTPInit			(void)<br>
</pre>
<p>Initialize the FTP protocol layer. Currently it just checks for proxy information, and get the hostname</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPList"></a>xmlNanoFTPList ()</h3>
<pre class="programlisting">int	xmlNanoFTPList			(void * ctx, <br>					 <a href="libxml2-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br>					 void * userData, <br>					 const char * filename)<br>
</pre>
<p>Do a listing on the server. All files info are passed back in the callbacks.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>callback</tt></i>:</span></td>
<td>the user callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>the user callback data</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>optional files to list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPNewCtxt"></a>xmlNanoFTPNewCtxt ()</h3>
<pre class="programlisting">void *	xmlNanoFTPNewCtxt		(const char * URL)<br>
</pre>
<p>Allocate and initialize a new FTP context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL used to initialize the context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an FTP context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPOpen"></a>xmlNanoFTPOpen ()</h3>
<pre class="programlisting">void *	xmlNanoFTPOpen			(const char * URL)<br>
</pre>
<p>Start to fetch the given ftp:// resource</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL to the resource</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an FTP context, or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPProxy"></a>xmlNanoFTPProxy ()</h3>
<pre class="programlisting">void	xmlNanoFTPProxy			(const char * host, <br>					 int port, <br>					 const char * user, <br>					 const char * passwd, <br>					 int type)<br>
</pre>
<p>Setup the FTP proxy information. This can also be done by using ftp_proxy ftp_proxy_user and ftp_proxy_password environment variables.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>host</tt></i>:</span></td>
<td>the proxy host name</td>
</tr>
<tr>
<td><span class="term"><i><tt>port</tt></i>:</span></td>
<td>the proxy port</td>
</tr>
<tr>
<td><span class="term"><i><tt>user</tt></i>:</span></td>
<td>the proxy user name</td>
</tr>
<tr>
<td><span class="term"><i><tt>passwd</tt></i>:</span></td>
<td>the proxy password</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of proxy 1 for using SITE, 2 for USER a@b</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPQuit"></a>xmlNanoFTPQuit ()</h3>
<pre class="programlisting">int	xmlNanoFTPQuit			(void * ctx)<br>
</pre>
<p>Send a QUIT command to the server</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPRead"></a>xmlNanoFTPRead ()</h3>
<pre class="programlisting">int	xmlNanoFTPRead			(void * ctx, <br>					 void * dest, <br>					 int len)<br>
</pre>
<p>This function tries to read @len bytes from the existing FTP connection and saves them in @dest. This is a blocking call.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dest</tt></i>:</span></td>
<td>a buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the buffer length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte read. 0 is an indication of an end of connection. -1 indicates a parameter error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPScanProxy"></a>xmlNanoFTPScanProxy ()</h3>
<pre class="programlisting">void	xmlNanoFTPScanProxy		(const char * URL)<br>
</pre>
<p>(Re)Initialize the FTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like ftp://myproxy/ or ftp://myproxy:3128/ A NULL URL cleans up proxy information.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The proxy URL used to initialize the proxy context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoFTPUpdateURL"></a>xmlNanoFTPUpdateURL ()</h3>
<pre class="programlisting">int	xmlNanoFTPUpdateURL		(void * ctx, <br>					 const char * URL)<br>
</pre>
<p>Update an FTP context by parsing the URL and finding new path it indicates. If there is an error in the protocol, hostname, port or other information, the error is raised. It indicates a new connection has to be established.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an FTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL used to update the context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if Ok, -1 in case of error (other host).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-c14n.html000064400000031571151730335330013425 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>c14n: Provide Canonical XML and Exclusive XML Canonicalization</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-SAX2.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-catalog.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">c14n</span></h2>
<p>c14n - Provide Canonical XML and Exclusive XML Canonicalization</p>
<p>the c14n modules provides a  "Canonical XML" implementation</p>
<p>Author(s): Aleksey Sanin &lt;aleksey@aleksey.com&gt; </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef enum <a href="#xmlC14NMode">xmlC14NMode</a>;
int	<a href="#xmlC14NDocDumpMemory">xmlC14NDocDumpMemory</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr);
int	<a href="#xmlC14NDocSave">xmlC14NDocSave</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 const char * filename, <br>					 int compression);
int	<a href="#xmlC14NDocSaveTo">xmlC14NDocSaveTo</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf);
int	<a href="#xmlC14NExecute">xmlC14NExecute</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-c14n.html#xmlC14NIsVisibleCallback">xmlC14NIsVisibleCallback</a> is_visible_callback, <br>					 void * user_data, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf);
typedef int <a href="#xmlC14NIsVisibleCallback">xmlC14NIsVisibleCallback</a>	(void * user_data, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NMode">Enum </a>xmlC14NMode</h3>
<pre class="programlisting">enum <a href="#xmlC14NMode">xmlC14NMode</a> {
    <a name="XML_C14N_1_0">XML_C14N_1_0</a> = 0 /* Original C14N 1.0 spec */
    <a name="XML_C14N_EXCLUSIVE_1_0">XML_C14N_EXCLUSIVE_1_0</a> = 1 /* Exclusive C14N 1.0 spec */
    <a name="XML_C14N_1_1">XML_C14N_1_1</a> = 2 /*  C14N 1.1 spec */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NIsVisibleCallback"></a>Function type xmlC14NIsVisibleCallback</h3>
<pre class="programlisting">int	xmlC14NIsVisibleCallback	(void * user_data, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> parent)<br>
</pre>
<p>Signature for a C14N callback on visible nodes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>user data</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>the parent node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the node should be included</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NDocDumpMemory"></a>xmlC14NDocDumpMemory ()</h3>
<pre class="programlisting">int	xmlC14NDocDumpMemory		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** doc_txt_ptr)<br>
</pre>
<p>Dumps the canonized image of given XML document into memory. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document for canonization</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>the nodes set to be included in the canonized image or NULL if all document nodes should be included</td>
</tr>
<tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the c14n mode (see @xmlC14NMode)</td>
</tr>
<tr>
<td><span class="term"><i><tt>inclusive_ns_prefixes</tt></i>:</span></td>
<td>the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)</td>
</tr>
<tr>
<td><span class="term"><i><tt>with_comments</tt></i>:</span></td>
<td>include comments in the result (!=0) or not (==0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc_txt_ptr</tt></i>:</span></td>
<td>the memory pointer for allocated canonical XML text; the caller of this functions is responsible for calling xmlFree() to free allocated memory</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written on success or a negative value on fail</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NDocSave"></a>xmlC14NDocSave ()</h3>
<pre class="programlisting">int	xmlC14NDocSave			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 const char * filename, <br>					 int compression)<br>
</pre>
<p>Dumps the canonized image of given XML document into the file. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document for canonization</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>the nodes set to be included in the canonized image or NULL if all document nodes should be included</td>
</tr>
<tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the c14n mode (see @xmlC14NMode)</td>
</tr>
<tr>
<td><span class="term"><i><tt>inclusive_ns_prefixes</tt></i>:</span></td>
<td>the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)</td>
</tr>
<tr>
<td><span class="term"><i><tt>with_comments</tt></i>:</span></td>
<td>include comments in the result (!=0) or not (==0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename to store canonical XML image</td>
</tr>
<tr>
<td><span class="term"><i><tt>compression</tt></i>:</span></td>
<td>the compression level (zlib required): -1 - libxml default, 0 - uncompressed, &gt;0 - compression level</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of bytes written success or a negative value on fail</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NDocSaveTo"></a>xmlC14NDocSaveTo ()</h3>
<pre class="programlisting">int	xmlC14NDocSaveTo		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> nodes, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf)<br>
</pre>
<p>Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document for canonization</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodes</tt></i>:</span></td>
<td>the nodes set to be included in the canonized image or NULL if all document nodes should be included</td>
</tr>
<tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the c14n mode (see @xmlC14NMode)</td>
</tr>
<tr>
<td><span class="term"><i><tt>inclusive_ns_prefixes</tt></i>:</span></td>
<td>the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)</td>
</tr>
<tr>
<td><span class="term"><i><tt>with_comments</tt></i>:</span></td>
<td>include comments in the result (!=0) or not (==0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>non-negative value on success or a negative value on fail</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlC14NExecute"></a>xmlC14NExecute ()</h3>
<pre class="programlisting">int	xmlC14NExecute			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-c14n.html#xmlC14NIsVisibleCallback">xmlC14NIsVisibleCallback</a> is_visible_callback, <br>					 void * user_data, <br>					 int mode, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** inclusive_ns_prefixes, <br>					 int with_comments, <br>					 <a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf)<br>
</pre>
<p>Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document for canonization</td>
</tr>
<tr>
<td><span class="term"><i><tt>is_visible_callback</tt></i>:</span></td>
<td>the function to use to determine is node visible or not</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>the first parameter for @is_visible_callback function (in most cases, it is nodes set)</td>
</tr>
<tr>
<td><span class="term"><i><tt>mode</tt></i>:</span></td>
<td>the c14n mode (see @xmlC14NMode)</td>
</tr>
<tr>
<td><span class="term"><i><tt>inclusive_ns_prefixes</tt></i>:</span></td>
<td>the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)</td>
</tr>
<tr>
<td><span class="term"><i><tt>with_comments</tt></i>:</span></td>
<td>include comments in the result (!=0) or not (==0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>non-negative value on success or a negative value on fail</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlexports.html000064400000006407151730335330015105 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlexports: macros for marking symbols as exportable/importable.</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlerror.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlmemory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlexports</span></h2>
<p>xmlexports - macros for marking symbols as exportable/importable.</p>
<p>macros for marking symbols as exportable/importable. </p>
<p>Author(s): </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#LIBXML_DLL_IMPORT">LIBXML_DLL_IMPORT</a>;
#define <a href="#XMLCALL">XMLCALL</a>;
#define <a href="#XMLCDECL">XMLCDECL</a>;
#define <a href="#XMLPUBFUN">XMLPUBFUN</a>;
#define <a href="#XMLPUBLIC">XMLPUBLIC</a>;
#define <a href="#XMLPUBVAR">XMLPUBVAR</a>;
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="LIBXML_DLL_IMPORT">Macro </a>LIBXML_DLL_IMPORT</h3>
<pre class="programlisting">#define <a href="#LIBXML_DLL_IMPORT">LIBXML_DLL_IMPORT</a>;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XMLCALL">Macro </a>XMLCALL</h3>
<pre class="programlisting">#define <a href="#XMLCALL">XMLCALL</a>;
</pre>
<p>Macro which declares the calling convention for exported functions</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XMLCDECL">Macro </a>XMLCDECL</h3>
<pre class="programlisting">#define <a href="#XMLCDECL">XMLCDECL</a>;
</pre>
<p>Macro which declares the calling convention for exported functions that use '...'.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XMLPUBFUN">Macro </a>XMLPUBFUN</h3>
<pre class="programlisting">#define <a href="#XMLPUBFUN">XMLPUBFUN</a>;
</pre>
<p>Macro which declares an exportable function</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XMLPUBLIC">Macro </a>XMLPUBLIC</h3>
<pre class="programlisting">#define <a href="#XMLPUBLIC">XMLPUBLIC</a>;
</pre>
<p>Macro which declares a public symbol</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XMLPUBVAR">Macro </a>XMLPUBVAR</h3>
<pre class="programlisting">#define <a href="#XMLPUBVAR">XMLPUBVAR</a>;
</pre>
<p>Macro which declares an exportable variable</p>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-dict.html000064400000032422151730335330013577 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>dict: string dictionary</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-debugXML.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-encoding.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">dict</span></h2>
<p>dict - string dictionary</p>
<p>dictionary of reusable strings, just used to avoid allocation and freeing operations. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlDict <a href="#xmlDict">xmlDict</a>;
typedef <a href="libxml2-dict.html#xmlDict">xmlDict</a> * <a href="#xmlDictPtr">xmlDictPtr</a>;
void	<a href="#xmlDictCleanup">xmlDictCleanup</a>			(void);
<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	<a href="#xmlDictCreate">xmlDictCreate</a>		(void);
<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	<a href="#xmlDictCreateSub">xmlDictCreateSub</a>	(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> sub);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlDictExists">xmlDictExists</a>		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len);
void	<a href="#xmlDictFree">xmlDictFree</a>			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
size_t	<a href="#xmlDictGetUsage">xmlDictGetUsage</a>			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlDictLookup">xmlDictLookup</a>		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len);
int	<a href="#xmlDictOwns">xmlDictOwns</a>			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlDictQLookup">xmlDictQLookup</a>		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlDictReference">xmlDictReference</a>		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
size_t	<a href="#xmlDictSetLimit">xmlDictSetLimit</a>			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 size_t limit);
int	<a href="#xmlDictSize">xmlDictSize</a>			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
int	<a href="#xmlInitializeDict">xmlInitializeDict</a>		(void);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlDict">Structure </a>xmlDict</h3>
<pre class="programlisting">struct _xmlDict {
The content of this structure is not made public by the API.
} xmlDict;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictPtr">Typedef </a>xmlDictPtr</h3>
<pre class="programlisting"><a href="libxml2-dict.html#xmlDict">xmlDict</a> * xmlDictPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictCleanup"></a>xmlDictCleanup ()</h3>
<pre class="programlisting">void	xmlDictCleanup			(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Free the dictionary mutex. Do not call unless sure the library is not in use anymore !</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictCreate"></a>xmlDictCreate ()</h3>
<pre class="programlisting"><a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	xmlDictCreate		(void)<br>
</pre>
<p>Create a new dictionary</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created dictionary, or NULL if an error occurred.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictCreateSub"></a>xmlDictCreateSub ()</h3>
<pre class="programlisting"><a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	xmlDictCreateSub	(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> sub)<br>
</pre>
<p>Create a new dictionary, inheriting strings from the read-only dictionary @sub. On lookup, strings are first searched in the new dictionary, then in @sub, and if not found are created in the new dictionary.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sub</tt></i>:</span></td>
<td>an existing dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created dictionary, or NULL if an error occurred.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictExists"></a>xmlDictExists ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlDictExists		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len)<br>
</pre>
<p>Check if the @name exists in the dictionary @dict.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the name, if -1 it is recomputed</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal copy of the name or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictFree"></a>xmlDictFree ()</h3>
<pre class="programlisting">void	xmlDictFree			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Free the hash @dict and its contents. The userdata is deallocated with @f if provided.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictGetUsage"></a>xmlDictGetUsage ()</h3>
<pre class="programlisting">size_t	xmlDictGetUsage			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Get how much memory is used by a dictionary for strings Added in 2.9.0</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the amount of strings allocated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictLookup"></a>xmlDictLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlDictLookup		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int len)<br>
</pre>
<p>Add the @name to the dictionary @dict if not present.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the name, if -1 it is recomputed</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal copy of the name or NULL in case of internal error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictOwns"></a>xmlDictOwns ()</h3>
<pre class="programlisting">int	xmlDictOwns			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>check if a string is owned by the dictionary</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false and -1 in case of error -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictQLookup"></a>xmlDictQLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlDictQLookup		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Add the QName @prefix:@name to the hash @dict if not present.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal copy of the QName or NULL in case of internal error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictReference"></a>xmlDictReference ()</h3>
<pre class="programlisting">int	xmlDictReference		(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Increment the <a href="libxml2-SAX.html#reference">reference</a> counter of a dictionary</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictSetLimit"></a>xmlDictSetLimit ()</h3>
<pre class="programlisting">size_t	xmlDictSetLimit			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict, <br>					 size_t limit)<br>
</pre>
<p>Set a size limit for the dictionary Added in 2.9.0</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>limit</tt></i>:</span></td>
<td>the limit in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous limit of the dictionary or 0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDictSize"></a>xmlDictSize ()</h3>
<pre class="programlisting">int	xmlDictSize			(<a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Query the number of elements installed in the hash @dict.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>the dictionary</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of elements in the dictionary or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitializeDict"></a>xmlInitializeDict ()</h3>
<pre class="programlisting">int	xmlInitializeDict		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Do the dictionary mutex initialization.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if initialization was already done, and 1 if that call led to the initialization</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-relaxng.html000064400000104440151730335330014314 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>relaxng: implementation of the Relax-NG validation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-pattern.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-schemasInternals.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">relaxng</span></h2>
<p>relaxng - implementation of the Relax-NG validation</p>
<p>implementation of the Relax-NG validation </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlRelaxNG <a href="#xmlRelaxNG">xmlRelaxNG</a>;
typedef struct _xmlRelaxNGParserCtxt <a href="#xmlRelaxNGParserCtxt">xmlRelaxNGParserCtxt</a>;
typedef <a href="libxml2-relaxng.html#xmlRelaxNGParserCtxt">xmlRelaxNGParserCtxt</a> * <a href="#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>;
typedef enum <a href="#xmlRelaxNGParserFlag">xmlRelaxNGParserFlag</a>;
typedef <a href="libxml2-relaxng.html#xmlRelaxNG">xmlRelaxNG</a> * <a href="#xmlRelaxNGPtr">xmlRelaxNGPtr</a>;
typedef struct _xmlRelaxNGValidCtxt <a href="#xmlRelaxNGValidCtxt">xmlRelaxNGValidCtxt</a>;
typedef <a href="libxml2-relaxng.html#xmlRelaxNGValidCtxt">xmlRelaxNGValidCtxt</a> * <a href="#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a>;
typedef enum <a href="#xmlRelaxNGValidErr">xmlRelaxNGValidErr</a>;
void	<a href="#xmlRelaxNGCleanupTypes">xmlRelaxNGCleanupTypes</a>		(void);
void	<a href="#xmlRelaxNGDump">xmlRelaxNGDump</a>			(FILE * output, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema);
void	<a href="#xmlRelaxNGDumpTree">xmlRelaxNGDumpTree</a>		(FILE * output, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema);
void	<a href="#xmlRelaxNGFree">xmlRelaxNGFree</a>			(<a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema);
void	<a href="#xmlRelaxNGFreeParserCtxt">xmlRelaxNGFreeParserCtxt</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt);
void	<a href="#xmlRelaxNGFreeValidCtxt">xmlRelaxNGFreeValidCtxt</a>		(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt);
int	<a href="#xmlRelaxNGGetParserErrors">xmlRelaxNGGetParserErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br>					 void ** ctx);
int	<a href="#xmlRelaxNGGetValidErrors">xmlRelaxNGGetValidErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br>					 void ** ctx);
int	<a href="#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a>		(void);
<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewDocParserCtxt">xmlRelaxNGNewDocParserCtxt</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewMemParserCtxt">xmlRelaxNGNewMemParserCtxt</a>	(const char * buffer, <br>							 int size);
<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewParserCtxt">xmlRelaxNGNewParserCtxt</a>	(const char * URL);
<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a>	<a href="#xmlRelaxNGNewValidCtxt">xmlRelaxNGNewValidCtxt</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema);
<a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a>	<a href="#xmlRelaxNGParse">xmlRelaxNGParse</a>		(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt);
void	<a href="#xmlRelaxNGSetParserErrors">xmlRelaxNGSetParserErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> warn, <br>					 void * ctx);
void	<a href="#xmlRelaxNGSetParserStructuredErrors">xmlRelaxNGSetParserStructuredErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx);
void	<a href="#xmlRelaxNGSetValidErrors">xmlRelaxNGSetValidErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> warn, <br>					 void * ctx);
void	<a href="#xmlRelaxNGSetValidStructuredErrors">xmlRelaxNGSetValidStructuredErrors</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx);
int	<a href="#xmlRelaxNGValidateDoc">xmlRelaxNGValidateDoc</a>		(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlRelaxNGValidateFullElement">xmlRelaxNGValidateFullElement</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
int	<a href="#xmlRelaxNGValidatePopElement">xmlRelaxNGValidatePopElement</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
int	<a href="#xmlRelaxNGValidatePushCData">xmlRelaxNGValidatePushCData</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data, <br>					 int len);
int	<a href="#xmlRelaxNGValidatePushElement">xmlRelaxNGValidatePushElement</a>	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
typedef void <a href="#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef void <a href="#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
int	<a href="#xmlRelaxParserSetFlag">xmlRelaxParserSetFlag</a>		(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 int flags);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNG">Structure </a>xmlRelaxNG</h3>
<pre class="programlisting">struct _xmlRelaxNG {
The content of this structure is not made public by the API.
} xmlRelaxNG;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGParserCtxt">Structure </a>xmlRelaxNGParserCtxt</h3>
<pre class="programlisting">struct _xmlRelaxNGParserCtxt {
The content of this structure is not made public by the API.
} xmlRelaxNGParserCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGParserCtxtPtr">Typedef </a>xmlRelaxNGParserCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGParserCtxt">xmlRelaxNGParserCtxt</a> * xmlRelaxNGParserCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGParserFlag">Enum </a>xmlRelaxNGParserFlag</h3>
<pre class="programlisting">enum <a href="#xmlRelaxNGParserFlag">xmlRelaxNGParserFlag</a> {
    <a name="XML_RELAXNGP_NONE">XML_RELAXNGP_NONE</a> = 0
    <a name="XML_RELAXNGP_FREE_DOC">XML_RELAXNGP_FREE_DOC</a> = 1
    <a name="XML_RELAXNGP_CRNG">XML_RELAXNGP_CRNG</a> = 2
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGPtr">Typedef </a>xmlRelaxNGPtr</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNG">xmlRelaxNG</a> * xmlRelaxNGPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidCtxt">Structure </a>xmlRelaxNGValidCtxt</h3>
<pre class="programlisting">struct _xmlRelaxNGValidCtxt {
The content of this structure is not made public by the API.
} xmlRelaxNGValidCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidCtxtPtr">Typedef </a>xmlRelaxNGValidCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGValidCtxt">xmlRelaxNGValidCtxt</a> * xmlRelaxNGValidCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidErr">Enum </a>xmlRelaxNGValidErr</h3>
<pre class="programlisting">enum <a href="#xmlRelaxNGValidErr">xmlRelaxNGValidErr</a> {
    <a name="XML_RELAXNG_OK">XML_RELAXNG_OK</a> = 0
    <a name="XML_RELAXNG_ERR_MEMORY">XML_RELAXNG_ERR_MEMORY</a> = 1
    <a name="XML_RELAXNG_ERR_TYPE">XML_RELAXNG_ERR_TYPE</a> = 2
    <a name="XML_RELAXNG_ERR_TYPEVAL">XML_RELAXNG_ERR_TYPEVAL</a> = 3
    <a name="XML_RELAXNG_ERR_DUPID">XML_RELAXNG_ERR_DUPID</a> = 4
    <a name="XML_RELAXNG_ERR_TYPECMP">XML_RELAXNG_ERR_TYPECMP</a> = 5
    <a name="XML_RELAXNG_ERR_NOSTATE">XML_RELAXNG_ERR_NOSTATE</a> = 6
    <a name="XML_RELAXNG_ERR_NODEFINE">XML_RELAXNG_ERR_NODEFINE</a> = 7
    <a name="XML_RELAXNG_ERR_LISTEXTRA">XML_RELAXNG_ERR_LISTEXTRA</a> = 8
    <a name="XML_RELAXNG_ERR_LISTEMPTY">XML_RELAXNG_ERR_LISTEMPTY</a> = 9
    <a name="XML_RELAXNG_ERR_INTERNODATA">XML_RELAXNG_ERR_INTERNODATA</a> = 10
    <a name="XML_RELAXNG_ERR_INTERSEQ">XML_RELAXNG_ERR_INTERSEQ</a> = 11
    <a name="XML_RELAXNG_ERR_INTEREXTRA">XML_RELAXNG_ERR_INTEREXTRA</a> = 12
    <a name="XML_RELAXNG_ERR_ELEMNAME">XML_RELAXNG_ERR_ELEMNAME</a> = 13
    <a name="XML_RELAXNG_ERR_ATTRNAME">XML_RELAXNG_ERR_ATTRNAME</a> = 14
    <a name="XML_RELAXNG_ERR_ELEMNONS">XML_RELAXNG_ERR_ELEMNONS</a> = 15
    <a name="XML_RELAXNG_ERR_ATTRNONS">XML_RELAXNG_ERR_ATTRNONS</a> = 16
    <a name="XML_RELAXNG_ERR_ELEMWRONGNS">XML_RELAXNG_ERR_ELEMWRONGNS</a> = 17
    <a name="XML_RELAXNG_ERR_ATTRWRONGNS">XML_RELAXNG_ERR_ATTRWRONGNS</a> = 18
    <a name="XML_RELAXNG_ERR_ELEMEXTRANS">XML_RELAXNG_ERR_ELEMEXTRANS</a> = 19
    <a name="XML_RELAXNG_ERR_ATTREXTRANS">XML_RELAXNG_ERR_ATTREXTRANS</a> = 20
    <a name="XML_RELAXNG_ERR_ELEMNOTEMPTY">XML_RELAXNG_ERR_ELEMNOTEMPTY</a> = 21
    <a name="XML_RELAXNG_ERR_NOELEM">XML_RELAXNG_ERR_NOELEM</a> = 22
    <a name="XML_RELAXNG_ERR_NOTELEM">XML_RELAXNG_ERR_NOTELEM</a> = 23
    <a name="XML_RELAXNG_ERR_ATTRVALID">XML_RELAXNG_ERR_ATTRVALID</a> = 24
    <a name="XML_RELAXNG_ERR_CONTENTVALID">XML_RELAXNG_ERR_CONTENTVALID</a> = 25
    <a name="XML_RELAXNG_ERR_EXTRACONTENT">XML_RELAXNG_ERR_EXTRACONTENT</a> = 26
    <a name="XML_RELAXNG_ERR_INVALIDATTR">XML_RELAXNG_ERR_INVALIDATTR</a> = 27
    <a name="XML_RELAXNG_ERR_DATAELEM">XML_RELAXNG_ERR_DATAELEM</a> = 28
    <a name="XML_RELAXNG_ERR_VALELEM">XML_RELAXNG_ERR_VALELEM</a> = 29
    <a name="XML_RELAXNG_ERR_LISTELEM">XML_RELAXNG_ERR_LISTELEM</a> = 30
    <a name="XML_RELAXNG_ERR_DATATYPE">XML_RELAXNG_ERR_DATATYPE</a> = 31
    <a name="XML_RELAXNG_ERR_VALUE">XML_RELAXNG_ERR_VALUE</a> = 32
    <a name="XML_RELAXNG_ERR_LIST">XML_RELAXNG_ERR_LIST</a> = 33
    <a name="XML_RELAXNG_ERR_NOGRAMMAR">XML_RELAXNG_ERR_NOGRAMMAR</a> = 34
    <a name="XML_RELAXNG_ERR_EXTRADATA">XML_RELAXNG_ERR_EXTRADATA</a> = 35
    <a name="XML_RELAXNG_ERR_LACKDATA">XML_RELAXNG_ERR_LACKDATA</a> = 36
    <a name="XML_RELAXNG_ERR_INTERNAL">XML_RELAXNG_ERR_INTERNAL</a> = 37
    <a name="XML_RELAXNG_ERR_ELEMWRONG">XML_RELAXNG_ERR_ELEMWRONG</a> = 38
    <a name="XML_RELAXNG_ERR_TEXTWRONG">XML_RELAXNG_ERR_TEXTWRONG</a> = 39
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidityErrorFunc"></a>Function type xmlRelaxNGValidityErrorFunc</h3>
<pre class="programlisting">void	xmlRelaxNGValidityErrorFunc	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of an error callback from a Relax-NG validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidityWarningFunc"></a>Function type xmlRelaxNGValidityWarningFunc</h3>
<pre class="programlisting">void	xmlRelaxNGValidityWarningFunc	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of a warning callback from a Relax-NG validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGCleanupTypes"></a>xmlRelaxNGCleanupTypes ()</h3>
<pre class="programlisting">void	xmlRelaxNGCleanupTypes		(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> to free global state but see the warnings there. <a href="libxml2-parser.html#xmlCleanupParser">xmlCleanupParser</a> should be only called once at program exit. In most cases, you don't have call cleanup functions at all. Cleanup the default Schemas type library associated to RelaxNG</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGDump"></a>xmlRelaxNGDump ()</h3>
<pre class="programlisting">void	xmlRelaxNGDump			(FILE * output, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema)<br>
</pre>
<p>Dump a RelaxNG structure back</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the file output</td>
</tr>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGDumpTree"></a>xmlRelaxNGDumpTree ()</h3>
<pre class="programlisting">void	xmlRelaxNGDumpTree		(FILE * output, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema)<br>
</pre>
<p>Dump the transformed RelaxNG tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the file output</td>
</tr>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGFree"></a>xmlRelaxNGFree ()</h3>
<pre class="programlisting">void	xmlRelaxNGFree			(<a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema)<br>
</pre>
<p>Deallocate a RelaxNG structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGFreeParserCtxt"></a>xmlRelaxNGFreeParserCtxt ()</h3>
<pre class="programlisting">void	xmlRelaxNGFreeParserCtxt	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGFreeValidCtxt"></a>xmlRelaxNGFreeValidCtxt ()</h3>
<pre class="programlisting">void	xmlRelaxNGFreeValidCtxt		(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGGetParserErrors"></a>xmlRelaxNGGetParserErrors ()</h3>
<pre class="programlisting">int	xmlRelaxNGGetParserErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br>					 void ** ctx)<br>
</pre>
<p>Get the callback information used to handle errors for a validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error callback result</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning callback result</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>contextual data for the callbacks result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of failure, 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGGetValidErrors"></a>xmlRelaxNGGetValidErrors ()</h3>
<pre class="programlisting">int	xmlRelaxNGGetValidErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br>					 void ** ctx)<br>
</pre>
<p>Get the error and warning callback information</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error function result</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning function result</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error and 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGInitTypes"></a>xmlRelaxNGInitTypes ()</h3>
<pre class="programlisting">int	xmlRelaxNGInitTypes		(void)<br>
</pre>
<p>Initialize the default type libraries.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGNewDocParserCtxt"></a>xmlRelaxNGNewDocParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewDocParserCtxt	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a preparsed document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGNewMemParserCtxt"></a>xmlRelaxNGNewMemParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewMemParserCtxt	(const char * buffer, <br>							 int size)<br>
</pre>
<p>Create an XML RelaxNGs parse context for that memory buffer expected to contain an XML RelaxNGs file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array containing the schemas</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGNewParserCtxt"></a>xmlRelaxNGNewParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewParserCtxt	(const char * URL)<br>
</pre>
<p>Create an XML RelaxNGs parse context for that file/resource expected to contain an XML RelaxNGs file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the location of the schema</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGNewValidCtxt"></a>xmlRelaxNGNewValidCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a>	xmlRelaxNGNewValidCtxt	(<a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema)<br>
</pre>
<p>Create an XML RelaxNGs validation context based on the given schema</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a precompiled XML RelaxNGs</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the validation context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGParse"></a>xmlRelaxNGParse ()</h3>
<pre class="programlisting"><a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a>	xmlRelaxNGParse		(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a schema definition resource and build an internal XML Schema structure which can be used to validate instances.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal XML RelaxNG structure built from the resource or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGSetParserErrors"></a>xmlRelaxNGSetParserErrors ()</h3>
<pre class="programlisting">void	xmlRelaxNGSetParserErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> warn, <br>					 void * ctx)<br>
</pre>
<p>Set the callback functions used to handle errors for a validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>contextual data for the callbacks</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGSetParserStructuredErrors"></a>xmlRelaxNGSetParserStructuredErrors ()</h3>
<pre class="programlisting">void	xmlRelaxNGSetParserStructuredErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx)<br>
</pre>
<p>Set the callback functions used to handle errors for a parsing context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>serror</tt></i>:</span></td>
<td>the error callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>contextual data for the callbacks</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGSetValidErrors"></a>xmlRelaxNGSetValidErrors ()</h3>
<pre class="programlisting">void	xmlRelaxNGSetValidErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> err, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> warn, <br>					 void * ctx)<br>
</pre>
<p>Set the error and warning callback information</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGSetValidStructuredErrors"></a>xmlRelaxNGSetValidStructuredErrors ()</h3>
<pre class="programlisting">void	xmlRelaxNGSetValidStructuredErrors	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx)<br>
</pre>
<p>Set the structured error callback</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>serror</tt></i>:</span></td>
<td>the structured error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidateDoc"></a>xmlRelaxNGValidateDoc ()</h3>
<pre class="programlisting">int	xmlRelaxNGValidateDoc		(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Validate a document tree in memory.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a Relax-NG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a parsed document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the document is valid, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidateFullElement"></a>xmlRelaxNGValidateFullElement ()</h3>
<pre class="programlisting">int	xmlRelaxNGValidateFullElement	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Validate a full subtree when xmlRelaxNGValidatePushElement() returned 0 and the content of the node has been expanded.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidatePopElement"></a>xmlRelaxNGValidatePopElement ()</h3>
<pre class="programlisting">int	xmlRelaxNGValidatePopElement	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Pop the element end from the RelaxNG validation stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the RelaxNG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidatePushCData"></a>xmlRelaxNGValidatePushCData ()</h3>
<pre class="programlisting">int	xmlRelaxNGValidatePushCData	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data, <br>					 int len)<br>
</pre>
<p>check the CData parsed for validation in the current stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the RelaxNG validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>some character data read</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxNGValidatePushElement"></a>xmlRelaxNGValidatePushElement ()</h3>
<pre class="programlisting">int	xmlRelaxNGValidatePushElement	(<a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Push a new element start on the RelaxNG validation stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or 0 if validating the element requires a full node, and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRelaxParserSetFlag"></a>xmlRelaxParserSetFlag ()</h3>
<pre class="programlisting">int	xmlRelaxParserSetFlag		(<a href="libxml2-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br>					 int flags)<br>
</pre>
<p>Semi private function used to pass information to a parser context which are a combination of <a href="libxml2-relaxng.html#xmlRelaxNGParserFlag">xmlRelaxNGParserFlag</a> .</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a RelaxNG parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>a set of flags values</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-pattern.html000064400000044747151730335330014346 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pattern: pattern expression handling</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-parserInternals.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-relaxng.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">pattern</span></h2>
<p>pattern - pattern expression handling</p>
<p>allows to compile and test pattern expressions for nodes either in a tree or based on a parser state. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlPattern <a href="#xmlPattern">xmlPattern</a>;
typedef enum <a href="#xmlPatternFlags">xmlPatternFlags</a>;
typedef <a href="libxml2-pattern.html#xmlPattern">xmlPattern</a> * <a href="#xmlPatternPtr">xmlPatternPtr</a>;
typedef struct _xmlStreamCtxt <a href="#xmlStreamCtxt">xmlStreamCtxt</a>;
typedef <a href="libxml2-pattern.html#xmlStreamCtxt">xmlStreamCtxt</a> * <a href="#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a>;
void	<a href="#xmlFreePattern">xmlFreePattern</a>			(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
void	<a href="#xmlFreePatternList">xmlFreePatternList</a>		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
void	<a href="#xmlFreeStreamCtxt">xmlFreeStreamCtxt</a>		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream);
int	<a href="#xmlPatternFromRoot">xmlPatternFromRoot</a>		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a>	<a href="#xmlPatternGetStreamCtxt">xmlPatternGetStreamCtxt</a>	(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
int	<a href="#xmlPatternMatch">xmlPatternMatch</a>			(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlPatternMaxDepth">xmlPatternMaxDepth</a>		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
int	<a href="#xmlPatternMinDepth">xmlPatternMinDepth</a>		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
int	<a href="#xmlPatternStreamable">xmlPatternStreamable</a>		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp);
<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a>	<a href="#xmlPatterncompile">xmlPatterncompile</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pattern, <br>					 <a href="libxml2-dict.html#xmlDict">xmlDict</a> * dict, <br>					 int flags, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces);
int	<a href="#xmlStreamPop">xmlStreamPop</a>			(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream);
int	<a href="#xmlStreamPush">xmlStreamPush</a>			(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns);
int	<a href="#xmlStreamPushAttr">xmlStreamPushAttr</a>		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns);
int	<a href="#xmlStreamPushNode">xmlStreamPushNode</a>		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns, <br>					 int nodeType);
int	<a href="#xmlStreamWantsAnyNode">xmlStreamWantsAnyNode</a>		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> streamCtxt);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlPattern">Structure </a>xmlPattern</h3>
<pre class="programlisting">struct _xmlPattern {
The content of this structure is not made public by the API.
} xmlPattern;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternFlags">Enum </a>xmlPatternFlags</h3>
<pre class="programlisting">enum <a href="#xmlPatternFlags">xmlPatternFlags</a> {
    <a name="XML_PATTERN_DEFAULT">XML_PATTERN_DEFAULT</a> = 0 /* simple pattern match */
    <a name="XML_PATTERN_XPATH">XML_PATTERN_XPATH</a> = 1 /* standard XPath pattern */
    <a name="XML_PATTERN_XSSEL">XML_PATTERN_XSSEL</a> = 2 /* XPath subset for schema selector */
    <a name="XML_PATTERN_XSFIELD">XML_PATTERN_XSFIELD</a> = 4 /*  XPath subset for schema field */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternPtr">Typedef </a>xmlPatternPtr</h3>
<pre class="programlisting"><a href="libxml2-pattern.html#xmlPattern">xmlPattern</a> * xmlPatternPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamCtxt">Structure </a>xmlStreamCtxt</h3>
<pre class="programlisting">struct _xmlStreamCtxt {
The content of this structure is not made public by the API.
} xmlStreamCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamCtxtPtr">Typedef </a>xmlStreamCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-pattern.html#xmlStreamCtxt">xmlStreamCtxt</a> * xmlStreamCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreePattern"></a>xmlFreePattern ()</h3>
<pre class="programlisting">void	xmlFreePattern			(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Free up the memory allocated by @comp</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>an XSLT comp</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreePatternList"></a>xmlFreePatternList ()</h3>
<pre class="programlisting">void	xmlFreePatternList		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Free up the memory allocated by all the elements of @comp</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>an XSLT comp list</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeStreamCtxt"></a>xmlFreeStreamCtxt ()</h3>
<pre class="programlisting">void	xmlFreeStreamCtxt		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream)<br>
</pre>
<p>Free the stream context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>the stream context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternFromRoot"></a>xmlPatternFromRoot ()</h3>
<pre class="programlisting">int	xmlPatternFromRoot		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Check if the pattern must be looked at from the root.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternGetStreamCtxt"></a>xmlPatternGetStreamCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a>	xmlPatternGetStreamCtxt	(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Get a streaming context for that pattern Use <a href="libxml2-pattern.html#xmlFreeStreamCtxt">xmlFreeStreamCtxt</a> to free the context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the context or NULL in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternMatch"></a>xmlPatternMatch ()</h3>
<pre class="programlisting">int	xmlPatternMatch			(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Test whether the node matches the pattern</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if it matches, 0 if it doesn't and -1 in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternMaxDepth"></a>xmlPatternMaxDepth ()</h3>
<pre class="programlisting">int	xmlPatternMaxDepth		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Check the maximum depth reachable by a pattern</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-2 if no limit (using //), otherwise the depth, and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternMinDepth"></a>xmlPatternMinDepth ()</h3>
<pre class="programlisting">int	xmlPatternMinDepth		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Check the minimum depth reachable by a pattern, 0 mean the / or . are part of the set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error otherwise the depth,</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatternStreamable"></a>xmlPatternStreamable ()</h3>
<pre class="programlisting">int	xmlPatternStreamable		(<a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a> comp)<br>
</pre>
<p>Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() should work.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the precompiled pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if streamable, 0 if not and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPatterncompile"></a>xmlPatterncompile ()</h3>
<pre class="programlisting"><a href="libxml2-pattern.html#xmlPatternPtr">xmlPatternPtr</a>	xmlPatterncompile	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pattern, <br>					 <a href="libxml2-dict.html#xmlDict">xmlDict</a> * dict, <br>					 int flags, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces)<br>
</pre>
<p>Compile a pattern.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>pattern</tt></i>:</span></td>
<td>the pattern to compile</td>
</tr>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>an optional dictionary for interned strings</td>
</tr>
<tr>
<td><span class="term"><i><tt>flags</tt></i>:</span></td>
<td>compilation flags, see <a href="libxml2-pattern.html#xmlPatternFlags">xmlPatternFlags</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaces</tt></i>:</span></td>
<td>the prefix definitions, array of [URI, prefix] or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the compiled form of the pattern or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamPop"></a>xmlStreamPop ()</h3>
<pre class="programlisting">int	xmlStreamPop			(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream)<br>
</pre>
<p>push one level from the stream.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>the stream context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamPush"></a>xmlStreamPush ()</h3>
<pre class="programlisting">int	xmlStreamPush			(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns)<br>
</pre>
<p>Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an element-node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>the stream context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the current name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamPushAttr"></a>xmlStreamPushAttr ()</h3>
<pre class="programlisting">int	xmlStreamPushAttr		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns)<br>
</pre>
<p>Push new <a href="libxml2-SAX.html#attribute">attribute</a> data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an attribute-node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>the stream context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the current name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamPushNode"></a>xmlStreamPushNode ()</h3>
<pre class="programlisting">int	xmlStreamPushNode		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> stream, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns, <br>					 int nodeType)<br>
</pre>
<p>Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Different from xmlStreamPush() this function can be fed with nodes of type: element-, attribute-, text-, cdata-section-, comment- and processing-instruction-node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>stream</tt></i>:</span></td>
<td>the stream context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the current name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the namespace name</td>
</tr>
<tr>
<td><span class="term"><i><tt>nodeType</tt></i>:</span></td>
<td>the type of the node being pushed</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStreamWantsAnyNode"></a>xmlStreamWantsAnyNode ()</h3>
<pre class="programlisting">int	xmlStreamWantsAnyNode		(<a href="libxml2-pattern.html#xmlStreamCtxtPtr">xmlStreamCtxtPtr</a> streamCtxt)<br>
</pre>
<p>Query if the streaming pattern additionally needs to be fed with text-, cdata-section-, comment- and processing-instruction-nodes. If the result is 0 then only element-nodes and attribute-nodes need to be pushed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>streamCtxt</tt></i>:</span></td>
<td>the stream context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of need of nodes of the above described types, 0 otherwise. -1 on API errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-HTMLparser.html000064400000160501151730335330014635 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTMLparser: interface for an HTML 4.0 non-verifying parser</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-HTMLtree.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">HTMLparser</span></h2>
<p>HTMLparser - interface for an HTML 4.0 non-verifying parser</p>
<p>this module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones. It should be able to parse "real world" HTML, even if severely broken from a specification point of view. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#htmlDefaultSubelement">htmlDefaultSubelement</a>(elt);
#define <a href="#htmlElementAllowedHereDesc">htmlElementAllowedHereDesc</a>(parent, elt);
#define <a href="#htmlRequiredAttrs">htmlRequiredAttrs</a>(elt);
typedef <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> <a href="#htmlDocPtr">htmlDocPtr</a>;
typedef struct _htmlElemDesc <a href="#htmlElemDesc">htmlElemDesc</a>;
typedef <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * <a href="#htmlElemDescPtr">htmlElemDescPtr</a>;
typedef struct _htmlEntityDesc <a href="#htmlEntityDesc">htmlEntityDesc</a>;
typedef <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> * <a href="#htmlEntityDescPtr">htmlEntityDescPtr</a>;
typedef <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> <a href="#htmlNodePtr">htmlNodePtr</a>;
typedef <a href="libxml2-tree.html#xmlParserCtxt">xmlParserCtxt</a> <a href="#htmlParserCtxt">htmlParserCtxt</a>;
typedef <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> <a href="#htmlParserCtxtPtr">htmlParserCtxtPtr</a>;
typedef <a href="libxml2-tree.html#xmlParserInput">xmlParserInput</a> <a href="#htmlParserInput">htmlParserInput</a>;
typedef <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> <a href="#htmlParserInputPtr">htmlParserInputPtr</a>;
typedef <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> <a href="#htmlParserNodeInfo">htmlParserNodeInfo</a>;
typedef enum <a href="#htmlParserOption">htmlParserOption</a>;
typedef <a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> <a href="#htmlSAXHandler">htmlSAXHandler</a>;
typedef <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> <a href="#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a>;
typedef enum <a href="#htmlStatus">htmlStatus</a>;
int	<a href="#UTF8ToHtml">UTF8ToHtml</a>			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen);
<a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	<a href="#htmlAttrAllowed">htmlAttrAllowed</a>		(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * elt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * attr, <br>					 int legacy);
int	<a href="#htmlAutoCloseTag">htmlAutoCloseTag</a>		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> elem);
<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	<a href="#htmlCreateMemoryParserCtxt">htmlCreateMemoryParserCtxt</a>	(const char * buffer, <br>							 int size);
<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	<a href="#htmlCreatePushParserCtxt">htmlCreatePushParserCtxt</a>	(<a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>							 void * user_data, <br>							 const char * chunk, <br>							 int size, <br>							 const char * filename, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlCtxtReadDoc">htmlCtxtReadDoc</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlCtxtReadFd">htmlCtxtReadFd</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlCtxtReadFile">htmlCtxtReadFile</a>	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlCtxtReadIO">htmlCtxtReadIO</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlCtxtReadMemory">htmlCtxtReadMemory</a>	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
void	<a href="#htmlCtxtReset">htmlCtxtReset</a>			(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt);
int	<a href="#htmlCtxtUseOptions">htmlCtxtUseOptions</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 int options);
int	<a href="#htmlElementAllowedHere">htmlElementAllowedHere</a>		(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * parent, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elt);
<a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	<a href="#htmlElementStatusHere">htmlElementStatusHere</a>	(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * parent, <br>					 const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * elt);
int	<a href="#htmlEncodeEntities">htmlEncodeEntities</a>		(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen, <br>					 int quoteChar);
const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	<a href="#htmlEntityLookup">htmlEntityLookup</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	<a href="#htmlEntityValueLookup">htmlEntityValueLookup</a>	(unsigned int value);
void	<a href="#htmlFreeParserCtxt">htmlFreeParserCtxt</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt);
int	<a href="#htmlHandleOmittedElem">htmlHandleOmittedElem</a>		(int val);
int	<a href="#htmlIsAutoClosed">htmlIsAutoClosed</a>		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> elem);
int	<a href="#htmlIsScriptAttribute">htmlIsScriptAttribute</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	<a href="#htmlNewParserCtxt">htmlNewParserCtxt</a>	(void);
<a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	<a href="#htmlNodeStatus">htmlNodeStatus</a>		(const <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> node, <br>					 int legacy);
int	<a href="#htmlParseCharRef">htmlParseCharRef</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt);
int	<a href="#htmlParseChunk">htmlParseChunk</a>			(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 int terminate);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlParseDoc">htmlParseDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * encoding);
int	<a href="#htmlParseDocument">htmlParseDocument</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt);
void	<a href="#htmlParseElement">htmlParseElement</a>		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt);
const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	<a href="#htmlParseEntityRef">htmlParseEntityRef</a>	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** str);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlParseFile">htmlParseFile</a>		(const char * filename, <br>					 const char * encoding);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlReadDoc">htmlReadDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlReadFd">htmlReadFd</a>		(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlReadFile">htmlReadFile</a>		(const char * filename, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlReadIO">htmlReadIO</a>		(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlReadMemory">htmlReadMemory</a>		(const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlSAXParseDoc">htmlSAXParseDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * encoding, <br>					 <a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>					 void * userData);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlSAXParseFile">htmlSAXParseFile</a>	(const char * filename, <br>					 const char * encoding, <br>					 <a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>					 void * userData);
const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> *	<a href="#htmlTagLookup">htmlTagLookup</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * tag);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="htmlDefaultSubelement">Macro </a>htmlDefaultSubelement</h3>
<pre class="programlisting">#define <a href="#htmlDefaultSubelement">htmlDefaultSubelement</a>(elt);
</pre>
<p>Returns the default subelement for this element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlElementAllowedHereDesc">Macro </a>htmlElementAllowedHereDesc</h3>
<pre class="programlisting">#define <a href="#htmlElementAllowedHereDesc">htmlElementAllowedHereDesc</a>(parent, elt);
</pre>
<p>Checks whether an HTML element description may be a direct child of the specified element. Returns 1 if allowed; 0 otherwise.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>HTML parent element</td>
</tr>
<tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlRequiredAttrs">Macro </a>htmlRequiredAttrs</h3>
<pre class="programlisting">#define <a href="#htmlRequiredAttrs">htmlRequiredAttrs</a>(elt);
</pre>
<p>Returns the attributes required for the specified element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocPtr">Typedef </a>htmlDocPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> htmlDocPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlElemDesc">Structure </a>htmlElemDesc</h3>
<pre class="programlisting">struct _htmlElemDesc {
    const char *	name	: The tag name
    char	startTag	: Whether the start tag can be implied
    char	endTag	: Whether the end tag can be implied
    char	saveEndTag	: Whether the end tag should be saved
    char	empty	: Is this an empty element ?
    char	depr	: Is this a deprecated element ?
    char	dtd	: 1: only in Loose DTD, 2: only Frameset one
    char	isinline	: is this a block 0 or inline 1 element
    const char *	desc	: the description NRK Jan.2003 * New fields encapsulating HTML structur
    const char **	subelts	: allowed sub-elements of this element
    const char *	defaultsubelt	: subelement for suggested auto-repair if necessary or NULL
    const char **	attrs_opt	: Optional Attributes
    const char **	attrs_depr	: Additional deprecated attributes
    const char **	attrs_req	: Required attributes
} htmlElemDesc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlElemDescPtr">Typedef </a>htmlElemDescPtr</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * htmlElemDescPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlEntityDesc">Structure </a>htmlEntityDesc</h3>
<pre class="programlisting">struct _htmlEntityDesc {
    unsigned int	value	: the UNICODE value for the character
    const char *	name	: The entity name
    const char *	desc	: the description
} htmlEntityDesc;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlEntityDescPtr">Typedef </a>htmlEntityDescPtr</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> * htmlEntityDescPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodePtr">Typedef </a>htmlNodePtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> htmlNodePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserCtxt">Typedef </a>htmlParserCtxt</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxt">xmlParserCtxt</a> htmlParserCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserCtxtPtr">Typedef </a>htmlParserCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> htmlParserCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserInput">Typedef </a>htmlParserInput</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInput">xmlParserInput</a> htmlParserInput;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserInputPtr">Typedef </a>htmlParserInputPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> htmlParserInputPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserNodeInfo">Typedef </a>htmlParserNodeInfo</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> htmlParserNodeInfo;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParserOption">Enum </a>htmlParserOption</h3>
<pre class="programlisting">enum <a href="#htmlParserOption">htmlParserOption</a> {
    <a name="HTML_PARSE_RECOVER">HTML_PARSE_RECOVER</a> = 1 /* Relaxed parsing */
    <a name="HTML_PARSE_NODEFDTD">HTML_PARSE_NODEFDTD</a> = 4 /* do not default a doctype if not found */
    <a name="HTML_PARSE_NOERROR">HTML_PARSE_NOERROR</a> = 32 /* suppress error reports */
    <a name="HTML_PARSE_NOWARNING">HTML_PARSE_NOWARNING</a> = 64 /* suppress warning reports */
    <a name="HTML_PARSE_PEDANTIC">HTML_PARSE_PEDANTIC</a> = 128 /* pedantic error reporting */
    <a name="HTML_PARSE_NOBLANKS">HTML_PARSE_NOBLANKS</a> = 256 /* remove blank nodes */
    <a name="HTML_PARSE_NONET">HTML_PARSE_NONET</a> = 2048 /* Forbid network access */
    <a name="HTML_PARSE_NOIMPLIED">HTML_PARSE_NOIMPLIED</a> = 8192 /* Do not add implied html/body... elements */
    <a name="HTML_PARSE_COMPACT">HTML_PARSE_COMPACT</a> = 65536 /* compact small text nodes */
    <a name="HTML_PARSE_IGNORE_ENC">HTML_PARSE_IGNORE_ENC</a> = 2097152 /*  ignore internal document encoding hint */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSAXHandler">Typedef </a>htmlSAXHandler</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> htmlSAXHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSAXHandlerPtr">Typedef </a>htmlSAXHandlerPtr</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> htmlSAXHandlerPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlStatus">Enum </a>htmlStatus</h3>
<pre class="programlisting">enum <a href="#htmlStatus">htmlStatus</a> {
    <a name="HTML_NA">HTML_NA</a> = 0 /* something we don't check at all */
    <a name="HTML_INVALID">HTML_INVALID</a> = 1
    <a name="HTML_DEPRECATED">HTML_DEPRECATED</a> = 2
    <a name="HTML_VALID">HTML_VALID</a> = 4
    <a name="HTML_REQUIRED">HTML_REQUIRED</a> = 12 /*  VALID bit set so ( &amp; HTML_VALID ) is TRUE */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="UTF8ToHtml"></a>UTF8ToHtml ()</h3>
<pre class="programlisting">int	UTF8ToHtml			(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen)<br>
</pre>
<p>Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of UTF-8 chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed as the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlAttrAllowed"></a>htmlAttrAllowed ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	htmlAttrAllowed		(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * elt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * attr, <br>					 int legacy)<br>
</pre>
<p>Checks whether an <a href="libxml2-SAX.html#attribute">attribute</a> is valid for an element Has full knowledge of Required and Deprecated attributes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>HTML <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>legacy</tt></i>:</span></td>
<td>whether to allow deprecated attributes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, <a href="libxml2-HTMLparser.html#HTML_INVALID">HTML_INVALID</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlAutoCloseTag"></a>htmlAutoCloseTag ()</h3>
<pre class="programlisting">int	htmlAutoCloseTag		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> elem)<br>
</pre>
<p>The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if the element or one of it's children would autoclose the given tag.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the HTML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The tag name</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the HTML element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if autoclose, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCreateMemoryParserCtxt"></a>htmlCreateMemoryParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	htmlCreateMemoryParserCtxt	(const char * buffer, <br>							 int size)<br>
</pre>
<p>Create a parser context for an HTML in-memory document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCreatePushParserCtxt"></a>htmlCreatePushParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	htmlCreatePushParserCtxt	(<a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>							 void * user_data, <br>							 const char * chunk, <br>							 int size, <br>							 const char * filename, <br>							 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a parser context for using the HTML parser in push mode The value of @filename is used for fetching external entities and error/warning reports.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>chunk</tt></i>:</span></td>
<td>a pointer to an array of chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>number of chars in the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>an optional file name or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>an optional encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReadDoc"></a>htmlCtxtReadDoc ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlCtxtReadDoc		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReadFd"></a>htmlCtxtReadFd ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlCtxtReadFd		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReadFile"></a>htmlCtxtReadFile ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlCtxtReadFile	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReadIO"></a>htmlCtxtReadIO ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlCtxtReadIO		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an HTML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReadMemory"></a>htmlCtxtReadMemory ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlCtxtReadMemory	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtReset"></a>htmlCtxtReset ()</h3>
<pre class="programlisting">void	htmlCtxtReset			(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Reset a parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlCtxtUseOptions"></a>htmlCtxtUseOptions ()</h3>
<pre class="programlisting">int	htmlCtxtUseOptions		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 int options)<br>
</pre>
<p>Applies the options to the parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, the set of unknown or unimplemented options in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlElementAllowedHere"></a>htmlElementAllowedHere ()</h3>
<pre class="programlisting">int	htmlElementAllowedHere		(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * parent, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elt)<br>
</pre>
<p>Checks whether an HTML element may be a direct child of a parent element. Note - doesn't check for deprecated elements</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>HTML parent element</td>
</tr>
<tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if allowed; 0 otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlElementStatusHere"></a>htmlElementStatusHere ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	htmlElementStatusHere	(const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * parent, <br>					 const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> * elt)<br>
</pre>
<p>Checks whether an HTML element may be a direct child of a parent element. and if so whether it is valid or deprecated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>parent</tt></i>:</span></td>
<td>HTML parent element</td>
</tr>
<tr>
<td><span class="term"><i><tt>elt</tt></i>:</span></td>
<td>HTML element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>one of HTML_VALID, HTML_DEPRECATED, <a href="libxml2-HTMLparser.html#HTML_INVALID">HTML_INVALID</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlEncodeEntities"></a>htmlEncodeEntities ()</h3>
<pre class="programlisting">int	htmlEncodeEntities		(unsigned char * out, <br>					 int * outlen, <br>					 const unsigned char * in, <br>					 int * inlen, <br>					 int quoteChar)<br>
</pre>
<p>Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>a pointer to an array of bytes to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>outlen</tt></i>:</span></td>
<td>the length of @out</td>
</tr>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>a pointer to an array of UTF-8 chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>inlen</tt></i>:</span></td>
<td>the length of @in</td>
</tr>
<tr>
<td><span class="term"><i><tt>quoteChar</tt></i>:</span></td>
<td>the quote character to escape (' or ") or zero.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed as the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlEntityLookup"></a>htmlEntityLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	htmlEntityLookup	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the associated <a href="libxml2-HTMLparser.html#htmlEntityDescPtr">htmlEntityDescPtr</a> if found, NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlEntityValueLookup"></a>htmlEntityValueLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	htmlEntityValueLookup	(unsigned int value)<br>
</pre>
<p>Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the entity's unicode value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the associated <a href="libxml2-HTMLparser.html#htmlEntityDescPtr">htmlEntityDescPtr</a> if found, NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlFreeParserCtxt"></a>htmlFreeParserCtxt ()</h3>
<pre class="programlisting">void	htmlFreeParserCtxt		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Free all the memory used by a parser context. However the parsed document in ctxt-&gt;myDoc is not freed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlHandleOmittedElem"></a>htmlHandleOmittedElem ()</h3>
<pre class="programlisting">int	htmlHandleOmittedElem		(int val)<br>
</pre>
<p>Set and return the previous value for handling HTML omitted tags.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>int 0 or 1</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last value for 0 for no handling, 1 for auto insertion.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlIsAutoClosed"></a>htmlIsAutoClosed ()</h3>
<pre class="programlisting">int	htmlIsAutoClosed		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> elem)<br>
</pre>
<p>The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if a tag is autoclosed by one of it's child</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the HTML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the HTML element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if autoclosed, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlIsScriptAttribute"></a>htmlIsScriptAttribute ()</h3>
<pre class="programlisting">int	htmlIsScriptAttribute		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Check if an <a href="libxml2-SAX.html#attribute">attribute</a> is of content type Script</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 is the <a href="libxml2-SAX.html#attribute">attribute</a> is a script 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNewParserCtxt"></a>htmlNewParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a>	htmlNewParserCtxt	(void)<br>
</pre>
<p>Allocate and initialize a new parser context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> or NULL in case of allocation error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeStatus"></a>htmlNodeStatus ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlStatus">htmlStatus</a>	htmlNodeStatus		(const <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> node, <br>					 int legacy)<br>
</pre>
<p>Checks whether the tree node is valid. Experimental (the author only uses the HTML enhancements in a SAX parser)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>an <a href="libxml2-HTMLparser.html#htmlNodePtr">htmlNodePtr</a> in a tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>legacy</tt></i>:</span></td>
<td>whether to allow deprecated elements (YES is faster here for Element nodes)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>for Element nodes, a return from <a href="libxml2-HTMLparser.html#htmlElementAllowedHere">htmlElementAllowedHere</a> (if legacy allowed) or <a href="libxml2-HTMLparser.html#htmlElementStatusHere">htmlElementStatusHere</a> (otherwise). for Attribute nodes, a return from <a href="libxml2-HTMLparser.html#htmlAttrAllowed">htmlAttrAllowed</a> for other nodes, <a href="libxml2-HTMLparser.html#HTML_NA">HTML_NA</a> (no checks performed)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseCharRef"></a>htmlParseCharRef ()</h3>
<pre class="programlisting">int	htmlParseCharRef		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse Reference declarations [66] CharRef ::= '&amp;#' [0-9]+ ';' | '&amp;#x' [0-9a-fA-F]+ ';'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value parsed (as an int)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseChunk"></a>htmlParseChunk ()</h3>
<pre class="programlisting">int	htmlParseChunk			(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 int terminate)<br>
</pre>
<p>Parse a Chunk of memory</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>chunk</tt></i>:</span></td>
<td>an char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size in byte of the chunk</td>
</tr>
<tr>
<td><span class="term"><i><tt>terminate</tt></i>:</span></td>
<td>last chunk indicator</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>zero if no error, the <a href="libxml2-xmlerror.html#xmlParserErrors">xmlParserErrors</a> otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseDoc"></a>htmlParseDoc ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlParseDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * encoding)<br>
</pre>
<p>parse an HTML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>a free form C string describing the HTML document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseDocument"></a>htmlParseDocument ()</h3>
<pre class="programlisting">int	htmlParseDocument		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an HTML document (and build a tree if using the standard SAX interface).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0, -1 in case of error. the parser context is augmented as a result of the parsing.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseElement"></a>htmlParseElement ()</h3>
<pre class="programlisting">void	htmlParseElement		(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an HTML element, this is highly recursive this is kept for compatibility with previous code versions [39] element ::= EmptyElemTag | STag content ETag [41] Attribute ::= Name Eq AttValue</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseEntityRef"></a>htmlParseEntityRef ()</h3>
<pre class="programlisting">const <a href="libxml2-HTMLparser.html#htmlEntityDesc">htmlEntityDesc</a> *	htmlParseEntityRef	(<a href="libxml2-HTMLparser.html#htmlParserCtxtPtr">htmlParserCtxtPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** str)<br>
</pre>
<p>parse an HTML ENTITY references [68] EntityRef ::= '&amp;' Name ';'</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>location to store the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the associated <a href="libxml2-HTMLparser.html#htmlEntityDescPtr">htmlEntityDescPtr</a> if found, or NULL otherwise, if non-NULL *str will have to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlParseFile"></a>htmlParseFile ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlParseFile		(const char * filename, <br>					 const char * encoding)<br>
</pre>
<p>parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>a free form C string describing the HTML document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlReadDoc"></a>htmlReadDoc ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlReadDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlReadFd"></a>htmlReadFd ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlReadFd		(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an HTML from a file descriptor and build a tree. NOTE that the file descriptor will not be closed when the reader is closed or reset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlReadFile"></a>htmlReadFile ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlReadFile		(const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlReadIO"></a>htmlReadIO ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlReadIO		(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an HTML document from I/O functions and source and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlReadMemory"></a>htmlReadMemory ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlReadMemory		(const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of htmlParserOption(s)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSAXParseDoc"></a>htmlSAXParseDoc ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlSAXParseDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * encoding, <br>					 <a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>					 void * userData)<br>
</pre>
<p>Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks to handle parse events. If sax is NULL, fallback to the default DOM behavior and return a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>a free form C string describing the HTML document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>if using SAX, this pointer will be provided on callbacks.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree unless SAX is NULL or the document is not well formed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSAXParseFile"></a>htmlSAXParseFile ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlSAXParseFile	(const char * filename, <br>					 const char * encoding, <br>					 <a href="libxml2-HTMLparser.html#htmlSAXHandlerPtr">htmlSAXHandlerPtr</a> sax, <br>					 void * userData)<br>
</pre>
<p>parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>a free form C string describing the HTML document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>if using SAX, this pointer will be provided on callbacks.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree unless SAX is NULL or the document is not well formed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlTagLookup"></a>htmlTagLookup ()</h3>
<pre class="programlisting">const <a href="libxml2-HTMLparser.html#htmlElemDesc">htmlElemDesc</a> *	htmlTagLookup	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * tag)<br>
</pre>
<p>Lookup the HTML tag in the ElementTable</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>tag</tt></i>:</span></td>
<td>The tag name in lowercase</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the related <a href="libxml2-HTMLparser.html#htmlElemDescPtr">htmlElemDescPtr</a> or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-parser.html000064400000414546151730335330014163 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parser: the core parser module</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-nanohttp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-parserInternals.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">parser</span></h2>
<p>parser - the core parser module</p>
<p>Interfaces, constants and types related to the XML parser </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_COMPLETE_ATTRS">XML_COMPLETE_ATTRS</a>;
#define <a href="#XML_DEFAULT_VERSION">XML_DEFAULT_VERSION</a>;
#define <a href="#XML_DETECT_IDS">XML_DETECT_IDS</a>;
#define <a href="#XML_SAX2_MAGIC">XML_SAX2_MAGIC</a>;
#define <a href="#XML_SKIP_IDS">XML_SKIP_IDS</a>;
typedef enum <a href="#xmlFeature">xmlFeature</a>;
typedef enum <a href="#xmlParserInputState">xmlParserInputState</a>;
typedef enum <a href="#xmlParserMode">xmlParserMode</a>;
typedef struct _xmlParserNodeInfo <a href="#xmlParserNodeInfo">xmlParserNodeInfo</a>;
typedef <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> * <a href="#xmlParserNodeInfoPtr">xmlParserNodeInfoPtr</a>;
typedef struct _xmlParserNodeInfoSeq <a href="#xmlParserNodeInfoSeq">xmlParserNodeInfoSeq</a>;
typedef <a href="libxml2-parser.html#xmlParserNodeInfoSeq">xmlParserNodeInfoSeq</a> * <a href="#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a>;
typedef enum <a href="#xmlParserOption">xmlParserOption</a>;
typedef struct _xmlSAXHandlerV1 <a href="#xmlSAXHandlerV1">xmlSAXHandlerV1</a>;
typedef <a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * <a href="#xmlSAXHandlerV1Ptr">xmlSAXHandlerV1Ptr</a>;
typedef struct _xmlStartTag <a href="#xmlStartTag">xmlStartTag</a>;
typedef void <a href="#attributeDeclSAXFunc">attributeDeclSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree);
typedef void <a href="#attributeSAXFunc">attributeSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
typedef void <a href="#cdataBlockSAXFunc">cdataBlockSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len);
typedef void <a href="#charactersSAXFunc">charactersSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
typedef void <a href="#commentSAXFunc">commentSAXFunc</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
typedef void <a href="#elementDeclSAXFunc">elementDeclSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content);
typedef void <a href="#endDocumentSAXFunc">endDocumentSAXFunc</a>		(void * ctx);
typedef void <a href="#endElementNsSAX2Func">endElementNsSAX2Func</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI);
typedef void <a href="#endElementSAXFunc">endElementSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
typedef void <a href="#entityDeclSAXFunc">entityDeclSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
typedef void <a href="#errorSAXFunc">errorSAXFunc</a>			(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef void <a href="#externalSubsetSAXFunc">externalSubsetSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
typedef void <a href="#fatalErrorSAXFunc">fatalErrorSAXFunc</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> <a href="#getEntitySAXFunc">getEntitySAXFunc</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
typedef <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> <a href="#getParameterEntitySAXFunc">getParameterEntitySAXFunc</a>	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
typedef int <a href="#hasExternalSubsetSAXFunc">hasExternalSubsetSAXFunc</a>	(void * ctx);
typedef int <a href="#hasInternalSubsetSAXFunc">hasInternalSubsetSAXFunc</a>	(void * ctx);
typedef void <a href="#ignorableWhitespaceSAXFunc">ignorableWhitespaceSAXFunc</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
typedef void <a href="#internalSubsetSAXFunc">internalSubsetSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
typedef int <a href="#isStandaloneSAXFunc">isStandaloneSAXFunc</a>		(void * ctx);
typedef void <a href="#notationDeclSAXFunc">notationDeclSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
typedef void <a href="#processingInstructionSAXFunc">processingInstructionSAXFunc</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data);
typedef void <a href="#referenceSAXFunc">referenceSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
typedef <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> <a href="#resolveEntitySAXFunc">resolveEntitySAXFunc</a>	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
typedef void <a href="#setDocumentLocatorSAXFunc">setDocumentLocatorSAXFunc</a>	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc);
typedef void <a href="#startDocumentSAXFunc">startDocumentSAXFunc</a>		(void * ctx);
typedef void <a href="#startElementNsSAX2Func">startElementNsSAX2Func</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 int nb_namespaces, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces, <br>					 int nb_attributes, <br>					 int nb_defaulted, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** attributes);
typedef void <a href="#startElementSAXFunc">startElementSAXFunc</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts);
typedef void <a href="#unparsedEntityDeclSAXFunc">unparsedEntityDeclSAXFunc</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName);
typedef void <a href="#warningSAXFunc">warningSAXFunc</a>			(void * ctx, <br>					 const char * msg, <br>					 ... ...);
long	<a href="#xmlByteConsumed">xmlByteConsumed</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
void	<a href="#xmlCleanupParser">xmlCleanupParser</a>		(void);
void	<a href="#xmlClearNodeInfoSeq">xmlClearNodeInfoSeq</a>		(<a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq);
void	<a href="#xmlClearParserCtxt">xmlClearParserCtxt</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateDocParserCtxt">xmlCreateDocParserCtxt</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreateIOParserCtxt">xmlCreateIOParserCtxt</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>						 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>						 void * ioctx, <br>						 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlCreatePushParserCtxt">xmlCreatePushParserCtxt</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 const char * chunk, <br>						 int size, <br>						 const char * filename);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCtxtReadDoc">xmlCtxtReadDoc</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCtxtReadFd">xmlCtxtReadFd</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCtxtReadFile">xmlCtxtReadFile</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCtxtReadIO">xmlCtxtReadIO</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlCtxtReadMemory">xmlCtxtReadMemory</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
void	<a href="#xmlCtxtReset">xmlCtxtReset</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlCtxtResetPush">xmlCtxtResetPush</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 const char * filename, <br>					 const char * encoding);
int	<a href="#xmlCtxtUseOptions">xmlCtxtUseOptions</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int options);
typedef <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> <a href="#xmlExternalEntityLoader">xmlExternalEntityLoader</a>	(const char * URL, <br>						 const char * ID, <br>						 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> context);
void	<a href="#xmlFreeParserCtxt">xmlFreeParserCtxt</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-parser.html#xmlExternalEntityLoader">xmlExternalEntityLoader</a>	<a href="#xmlGetExternalEntityLoader">xmlGetExternalEntityLoader</a>	(void);
int	<a href="#xmlGetFeature">xmlGetFeature</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * name, <br>					 void * result);
int	<a href="#xmlGetFeaturesList">xmlGetFeaturesList</a>		(int * len, <br>					 const char ** result);
int	<a href="#xmlHasFeature">xmlHasFeature</a>			(<a href="libxml2-parser.html#xmlFeature">xmlFeature</a> feature);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlIOParseDTD">xmlIOParseDTD</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
void	<a href="#xmlInitNodeInfoSeq">xmlInitNodeInfoSeq</a>		(<a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq);
void	<a href="#xmlInitParser">xmlInitParser</a>			(void);
int	<a href="#xmlInitParserCtxt">xmlInitParserCtxt</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlKeepBlanksDefault">xmlKeepBlanksDefault</a>		(int val);
int	<a href="#xmlLineNumbersDefault">xmlLineNumbersDefault</a>		(int val);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlLoadExternalEntity">xmlLoadExternalEntity</a>	(const char * URL, <br>						 const char * ID, <br>						 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlNewIOInputStream">xmlNewIOInputStream</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>						 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlNewParserCtxt">xmlNewParserCtxt</a>	(void);
int	<a href="#xmlParseBalancedChunkMemory">xmlParseBalancedChunkMemory</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 int depth, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst);
int	<a href="#xmlParseBalancedChunkMemoryRecover">xmlParseBalancedChunkMemoryRecover</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 int depth, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst, <br>						 int recover);
int	<a href="#xmlParseChunk">xmlParseChunk</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 int terminate);
int	<a href="#xmlParseCtxtExternalEntity">xmlParseCtxtExternalEntity</a>	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlParseDTD">xmlParseDTD</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlParseDoc">xmlParseDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur);
int	<a href="#xmlParseDocument">xmlParseDocument</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlParseEntity">xmlParseEntity</a>		(const char * filename);
int	<a href="#xmlParseExtParsedEnt">xmlParseExtParsedEnt</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlParseExternalEntity">xmlParseExternalEntity</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 int depth, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlParseFile">xmlParseFile</a>		(const char * filename);
<a href="libxml2-xmlerror.html#xmlParserErrors">xmlParserErrors</a>	<a href="#xmlParseInNodeContext">xmlParseInNodeContext</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const char * data, <br>					 int datalen, <br>					 int options, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlParseMemory">xmlParseMemory</a>		(const char * buffer, <br>					 int size);
void	<a href="#xmlParserAddNodeInfo">xmlParserAddNodeInfo</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-parser.html#xmlParserNodeInfoPtr">xmlParserNodeInfoPtr</a> info);
const <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> *	<a href="#xmlParserFindNodeInfo">xmlParserFindNodeInfo</a>	(const <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctx, <br>							 const <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
unsigned long	<a href="#xmlParserFindNodeInfoIndex">xmlParserFindNodeInfoIndex</a>	(const <a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq, <br>						 const <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
typedef void <a href="#xmlParserInputDeallocate">xmlParserInputDeallocate</a>	(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
int	<a href="#xmlParserInputGrow">xmlParserInputGrow</a>		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in, <br>					 int len);
int	<a href="#xmlParserInputRead">xmlParserInputRead</a>		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in, <br>					 int len);
int	<a href="#xmlPedanticParserDefault">xmlPedanticParserDefault</a>	(int val);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlReadDoc">xmlReadDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlReadFd">xmlReadFd</a>		(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlReadFile">xmlReadFile</a>		(const char * filename, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlReadIO">xmlReadIO</a>		(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlReadMemory">xmlReadMemory</a>		(const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlRecoverDoc">xmlRecoverDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlRecoverFile">xmlRecoverFile</a>		(const char * filename);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlRecoverMemory">xmlRecoverMemory</a>	(const char * buffer, <br>					 int size);
<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	<a href="#xmlSAXParseDTD">xmlSAXParseDTD</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseDoc">xmlSAXParseDoc</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int recovery);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseEntity">xmlSAXParseEntity</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseFile">xmlSAXParseFile</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename, <br>					 int recovery);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseFileWithData">xmlSAXParseFileWithData</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename, <br>					 int recovery, <br>					 void * data);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseMemory">xmlSAXParseMemory</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * buffer, <br>					 int size, <br>					 int recovery);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlSAXParseMemoryWithData">xmlSAXParseMemoryWithData</a>	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 const char * buffer, <br>						 int size, <br>						 int recovery, <br>						 void * data);
int	<a href="#xmlSAXUserParseFile">xmlSAXUserParseFile</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 const char * filename);
int	<a href="#xmlSAXUserParseMemory">xmlSAXUserParseMemory</a>		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 const char * buffer, <br>					 int size);
void	<a href="#xmlSetExternalEntityLoader">xmlSetExternalEntityLoader</a>	(<a href="libxml2-parser.html#xmlExternalEntityLoader">xmlExternalEntityLoader</a> f);
int	<a href="#xmlSetFeature">xmlSetFeature</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * name, <br>					 void * value);
void	<a href="#xmlSetupParserForBuffer">xmlSetupParserForBuffer</a>		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buffer, <br>					 const char * filename);
void	<a href="#xmlStopParser">xmlStopParser</a>			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt);
int	<a href="#xmlSubstituteEntitiesDefault">xmlSubstituteEntitiesDefault</a>	(int val);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_COMPLETE_ATTRS">Macro </a>XML_COMPLETE_ATTRS</h3>
<pre class="programlisting">#define <a href="#XML_COMPLETE_ATTRS">XML_COMPLETE_ATTRS</a>;
</pre>
<p>Bit in the loadsubset context field to tell to do complete the elements attributes lists with the ones defaulted from the DTDs. Use it to initialize xmlLoadExtDtdDefaultValue.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_DEFAULT_VERSION">Macro </a>XML_DEFAULT_VERSION</h3>
<pre class="programlisting">#define <a href="#XML_DEFAULT_VERSION">XML_DEFAULT_VERSION</a>;
</pre>
<p>The default version of XML used: 1.0</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_DETECT_IDS">Macro </a>XML_DETECT_IDS</h3>
<pre class="programlisting">#define <a href="#XML_DETECT_IDS">XML_DETECT_IDS</a>;
</pre>
<p>Bit in the loadsubset context field to tell to do ID/REFs lookups. Use it to initialize xmlLoadExtDtdDefaultValue.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SAX2_MAGIC">Macro </a>XML_SAX2_MAGIC</h3>
<pre class="programlisting">#define <a href="#XML_SAX2_MAGIC">XML_SAX2_MAGIC</a>;
</pre>
<p>Special constant found in SAX2 blocks initialized fields</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SKIP_IDS">Macro </a>XML_SKIP_IDS</h3>
<pre class="programlisting">#define <a href="#XML_SKIP_IDS">XML_SKIP_IDS</a>;
</pre>
<p>Bit in the loadsubset context field to tell to not do ID/REFs registration. Used to initialize <a href="libxml2-globals.html#xmlLoadExtDtdDefaultValue">xmlLoadExtDtdDefaultValue</a> in some special cases.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFeature">Enum </a>xmlFeature</h3>
<pre class="programlisting">enum <a href="#xmlFeature">xmlFeature</a> {
    <a name="XML_WITH_THREAD">XML_WITH_THREAD</a> = 1
    <a name="XML_WITH_TREE">XML_WITH_TREE</a> = 2
    <a name="XML_WITH_OUTPUT">XML_WITH_OUTPUT</a> = 3
    <a name="XML_WITH_PUSH">XML_WITH_PUSH</a> = 4
    <a name="XML_WITH_READER">XML_WITH_READER</a> = 5
    <a name="XML_WITH_PATTERN">XML_WITH_PATTERN</a> = 6
    <a name="XML_WITH_WRITER">XML_WITH_WRITER</a> = 7
    <a name="XML_WITH_SAX1">XML_WITH_SAX1</a> = 8
    <a name="XML_WITH_FTP">XML_WITH_FTP</a> = 9
    <a name="XML_WITH_HTTP">XML_WITH_HTTP</a> = 10
    <a name="XML_WITH_VALID">XML_WITH_VALID</a> = 11
    <a name="XML_WITH_HTML">XML_WITH_HTML</a> = 12
    <a name="XML_WITH_LEGACY">XML_WITH_LEGACY</a> = 13
    <a name="XML_WITH_C14N">XML_WITH_C14N</a> = 14
    <a name="XML_WITH_CATALOG">XML_WITH_CATALOG</a> = 15
    <a name="XML_WITH_XPATH">XML_WITH_XPATH</a> = 16
    <a name="XML_WITH_XPTR">XML_WITH_XPTR</a> = 17
    <a name="XML_WITH_XINCLUDE">XML_WITH_XINCLUDE</a> = 18
    <a name="XML_WITH_ICONV">XML_WITH_ICONV</a> = 19
    <a name="XML_WITH_ISO8859X">XML_WITH_ISO8859X</a> = 20
    <a name="XML_WITH_UNICODE">XML_WITH_UNICODE</a> = 21
    <a name="XML_WITH_REGEXP">XML_WITH_REGEXP</a> = 22
    <a name="XML_WITH_AUTOMATA">XML_WITH_AUTOMATA</a> = 23
    <a name="XML_WITH_EXPR">XML_WITH_EXPR</a> = 24
    <a name="XML_WITH_SCHEMAS">XML_WITH_SCHEMAS</a> = 25
    <a name="XML_WITH_SCHEMATRON">XML_WITH_SCHEMATRON</a> = 26
    <a name="XML_WITH_MODULES">XML_WITH_MODULES</a> = 27
    <a name="XML_WITH_DEBUG">XML_WITH_DEBUG</a> = 28
    <a name="XML_WITH_DEBUG_MEM">XML_WITH_DEBUG_MEM</a> = 29
    <a name="XML_WITH_DEBUG_RUN">XML_WITH_DEBUG_RUN</a> = 30
    <a name="XML_WITH_ZLIB">XML_WITH_ZLIB</a> = 31
    <a name="XML_WITH_ICU">XML_WITH_ICU</a> = 32
    <a name="XML_WITH_LZMA">XML_WITH_LZMA</a> = 33
    <a name="XML_WITH_NONE">XML_WITH_NONE</a> = 99999 /*  just to be sure of allocation size */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputState">Enum </a>xmlParserInputState</h3>
<pre class="programlisting">enum <a href="#xmlParserInputState">xmlParserInputState</a> {
    <a name="XML_PARSER_EOF">XML_PARSER_EOF</a> = -1 /* nothing is to be parsed */
    <a name="XML_PARSER_START">XML_PARSER_START</a> = 0 /* nothing has been parsed */
    <a name="XML_PARSER_MISC">XML_PARSER_MISC</a> = 1 /* Misc* before int subset */
    <a name="XML_PARSER_PI">XML_PARSER_PI</a> = 2 /* Within a processing instruction */
    <a name="XML_PARSER_DTD">XML_PARSER_DTD</a> = 3 /* within some DTD content */
    <a name="XML_PARSER_PROLOG">XML_PARSER_PROLOG</a> = 4 /* Misc* after internal subset */
    <a name="XML_PARSER_COMMENT">XML_PARSER_COMMENT</a> = 5 /* within a comment */
    <a name="XML_PARSER_START_TAG">XML_PARSER_START_TAG</a> = 6 /* within a start tag */
    <a name="XML_PARSER_CONTENT">XML_PARSER_CONTENT</a> = 7 /* within the content */
    <a name="XML_PARSER_CDATA_SECTION">XML_PARSER_CDATA_SECTION</a> = 8 /* within a CDATA section */
    <a name="XML_PARSER_END_TAG">XML_PARSER_END_TAG</a> = 9 /* within a closing tag */
    <a name="XML_PARSER_ENTITY_DECL">XML_PARSER_ENTITY_DECL</a> = 10 /* within an entity declaration */
    <a name="XML_PARSER_ENTITY_VALUE">XML_PARSER_ENTITY_VALUE</a> = 11 /* within an entity value in a decl */
    <a name="XML_PARSER_ATTRIBUTE_VALUE">XML_PARSER_ATTRIBUTE_VALUE</a> = 12 /* within an attribute value */
    <a name="XML_PARSER_SYSTEM_LITERAL">XML_PARSER_SYSTEM_LITERAL</a> = 13 /* within a SYSTEM value */
    <a name="XML_PARSER_EPILOG">XML_PARSER_EPILOG</a> = 14 /* the Misc* after the last end tag */
    <a name="XML_PARSER_IGNORE">XML_PARSER_IGNORE</a> = 15 /* within an IGNORED section */
    <a name="XML_PARSER_PUBLIC_LITERAL">XML_PARSER_PUBLIC_LITERAL</a> = 16 /*  within a PUBLIC value */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserMode">Enum </a>xmlParserMode</h3>
<pre class="programlisting">enum <a href="#xmlParserMode">xmlParserMode</a> {
    <a name="XML_PARSE_UNKNOWN">XML_PARSE_UNKNOWN</a> = 0
    <a name="XML_PARSE_DOM">XML_PARSE_DOM</a> = 1
    <a name="XML_PARSE_SAX">XML_PARSE_SAX</a> = 2
    <a name="XML_PARSE_PUSH_DOM">XML_PARSE_PUSH_DOM</a> = 3
    <a name="XML_PARSE_PUSH_SAX">XML_PARSE_PUSH_SAX</a> = 4
    <a name="XML_PARSE_READER">XML_PARSE_READER</a> = 5
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserNodeInfo">Structure </a>xmlParserNodeInfo</h3>
<pre class="programlisting">struct _xmlParserNodeInfo {
    const struct _xmlNode *	node	: Position &amp; line # that text that created the node begins &amp; ends on
    unsigned long	begin_pos
    unsigned long	begin_line
    unsigned long	end_pos
    unsigned long	end_line
} xmlParserNodeInfo;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserNodeInfoPtr">Typedef </a>xmlParserNodeInfoPtr</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> * xmlParserNodeInfoPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserNodeInfoSeq">Structure </a>xmlParserNodeInfoSeq</h3>
<pre class="programlisting">struct _xmlParserNodeInfoSeq {
    unsigned long	maximum
    unsigned long	length
    <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> *	buffer
} xmlParserNodeInfoSeq;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserNodeInfoSeqPtr">Typedef </a>xmlParserNodeInfoSeqPtr</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlParserNodeInfoSeq">xmlParserNodeInfoSeq</a> * xmlParserNodeInfoSeqPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserOption">Enum </a>xmlParserOption</h3>
<pre class="programlisting">enum <a href="#xmlParserOption">xmlParserOption</a> {
    <a name="XML_PARSE_RECOVER">XML_PARSE_RECOVER</a> = 1 /* recover on errors */
    <a name="XML_PARSE_NOENT">XML_PARSE_NOENT</a> = 2 /* substitute entities */
    <a name="XML_PARSE_DTDLOAD">XML_PARSE_DTDLOAD</a> = 4 /* load the external subset */
    <a name="XML_PARSE_DTDATTR">XML_PARSE_DTDATTR</a> = 8 /* default DTD attributes */
    <a name="XML_PARSE_DTDVALID">XML_PARSE_DTDVALID</a> = 16 /* validate with the DTD */
    <a name="XML_PARSE_NOERROR">XML_PARSE_NOERROR</a> = 32 /* suppress error reports */
    <a name="XML_PARSE_NOWARNING">XML_PARSE_NOWARNING</a> = 64 /* suppress warning reports */
    <a name="XML_PARSE_PEDANTIC">XML_PARSE_PEDANTIC</a> = 128 /* pedantic error reporting */
    <a name="XML_PARSE_NOBLANKS">XML_PARSE_NOBLANKS</a> = 256 /* remove blank nodes */
    <a name="XML_PARSE_SAX1">XML_PARSE_SAX1</a> = 512 /* use the SAX1 interface internally */
    <a name="XML_PARSE_XINCLUDE">XML_PARSE_XINCLUDE</a> = 1024 /* Implement XInclude substitution */
    <a name="XML_PARSE_NONET">XML_PARSE_NONET</a> = 2048 /* Forbid network access */
    <a name="XML_PARSE_NODICT">XML_PARSE_NODICT</a> = 4096 /* Do not reuse the context dictionary */
    <a name="XML_PARSE_NSCLEAN">XML_PARSE_NSCLEAN</a> = 8192 /* remove redundant namespaces declarations */
    <a name="XML_PARSE_NOCDATA">XML_PARSE_NOCDATA</a> = 16384 /* merge CDATA as text nodes */
    <a name="XML_PARSE_NOXINCNODE">XML_PARSE_NOXINCNODE</a> = 32768 /* do not generate XINCLUDE START/END nodes */
    <a name="XML_PARSE_COMPACT">XML_PARSE_COMPACT</a> = 65536 /* compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree) */
    <a name="XML_PARSE_OLD10">XML_PARSE_OLD10</a> = 131072 /* parse using XML-1.0 before update 5 */
    <a name="XML_PARSE_NOBASEFIX">XML_PARSE_NOBASEFIX</a> = 262144 /* do not fixup XINCLUDE xml:base uris */
    <a name="XML_PARSE_HUGE">XML_PARSE_HUGE</a> = 524288 /* relax any hardcoded limit from the parser */
    <a name="XML_PARSE_OLDSAX">XML_PARSE_OLDSAX</a> = 1048576 /* parse using SAX2 interface before 2.7.0 */
    <a name="XML_PARSE_IGNORE_ENC">XML_PARSE_IGNORE_ENC</a> = 2097152 /* ignore internal document encoding hint */
    <a name="XML_PARSE_BIG_LINES">XML_PARSE_BIG_LINES</a> = 4194304 /*  Store big lines numbers in text PSVI field */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXHandlerV1">Structure </a>xmlSAXHandlerV1</h3>
<pre class="programlisting">struct _xmlSAXHandlerV1 {
    <a href="libxml2-parser.html#internalSubsetSAXFunc">internalSubsetSAXFunc</a>	internalSubset
    <a href="libxml2-parser.html#isStandaloneSAXFunc">isStandaloneSAXFunc</a>	isStandalone
    <a href="libxml2-parser.html#hasInternalSubsetSAXFunc">hasInternalSubsetSAXFunc</a>	hasInternalSubset
    <a href="libxml2-parser.html#hasExternalSubsetSAXFunc">hasExternalSubsetSAXFunc</a>	hasExternalSubset
    <a href="libxml2-parser.html#resolveEntitySAXFunc">resolveEntitySAXFunc</a>	resolveEntity
    <a href="libxml2-parser.html#getEntitySAXFunc">getEntitySAXFunc</a>	getEntity
    <a href="libxml2-parser.html#entityDeclSAXFunc">entityDeclSAXFunc</a>	entityDecl
    <a href="libxml2-parser.html#notationDeclSAXFunc">notationDeclSAXFunc</a>	notationDecl
    <a href="libxml2-parser.html#attributeDeclSAXFunc">attributeDeclSAXFunc</a>	attributeDecl
    <a href="libxml2-parser.html#elementDeclSAXFunc">elementDeclSAXFunc</a>	elementDecl
    <a href="libxml2-parser.html#unparsedEntityDeclSAXFunc">unparsedEntityDeclSAXFunc</a>	unparsedEntityDecl
    <a href="libxml2-parser.html#setDocumentLocatorSAXFunc">setDocumentLocatorSAXFunc</a>	setDocumentLocator
    <a href="libxml2-parser.html#startDocumentSAXFunc">startDocumentSAXFunc</a>	startDocument
    <a href="libxml2-parser.html#endDocumentSAXFunc">endDocumentSAXFunc</a>	endDocument
    <a href="libxml2-parser.html#startElementSAXFunc">startElementSAXFunc</a>	startElement
    <a href="libxml2-parser.html#endElementSAXFunc">endElementSAXFunc</a>	endElement
    <a href="libxml2-parser.html#referenceSAXFunc">referenceSAXFunc</a>	reference
    <a href="libxml2-parser.html#charactersSAXFunc">charactersSAXFunc</a>	characters
    <a href="libxml2-parser.html#ignorableWhitespaceSAXFunc">ignorableWhitespaceSAXFunc</a>	ignorableWhitespace
    <a href="libxml2-parser.html#processingInstructionSAXFunc">processingInstructionSAXFunc</a>	processingInstruction
    <a href="libxml2-parser.html#commentSAXFunc">commentSAXFunc</a>	comment
    <a href="libxml2-parser.html#warningSAXFunc">warningSAXFunc</a>	warning
    <a href="libxml2-parser.html#errorSAXFunc">errorSAXFunc</a>	error
    <a href="libxml2-parser.html#fatalErrorSAXFunc">fatalErrorSAXFunc</a>	fatalError	: unused error() get all the errors
    <a href="libxml2-parser.html#getParameterEntitySAXFunc">getParameterEntitySAXFunc</a>	getParameterEntity
    <a href="libxml2-parser.html#cdataBlockSAXFunc">cdataBlockSAXFunc</a>	cdataBlock
    <a href="libxml2-parser.html#externalSubsetSAXFunc">externalSubsetSAXFunc</a>	externalSubset
    unsigned int	initialized
} xmlSAXHandlerV1;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXHandlerV1Ptr">Typedef </a>xmlSAXHandlerV1Ptr</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * xmlSAXHandlerV1Ptr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStartTag">Structure </a>xmlStartTag</h3>
<pre class="programlisting">struct _xmlStartTag {
The content of this structure is not made public by the API.
} xmlStartTag;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="attributeDeclSAXFunc"></a>Function type attributeDeclSAXFunc</h3>
<pre class="programlisting">void	attributeDeclSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree)<br>
</pre>
<p>An <a href="libxml2-SAX.html#attribute">attribute</a> definition has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
<tr>
<td><span class="term"><i><tt>def</tt></i>:</span></td>
<td>the type of default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>defaultValue</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the tree of enumerated value set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="attributeSAXFunc"></a>Function type attributeSAXFunc</h3>
<pre class="programlisting">void	attributeSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Handle an <a href="libxml2-SAX.html#attribute">attribute</a> that has been read by the parser. The default handling is to convert the <a href="libxml2-SAX.html#attribute">attribute</a> into an DOM subtree and past it in a new <a href="libxml2-tree.html#xmlAttr">xmlAttr</a> element added to the element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The <a href="libxml2-SAX.html#attribute">attribute</a> name, including namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>The <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="cdataBlockSAXFunc"></a>Function type cdataBlockSAXFunc</h3>
<pre class="programlisting">void	cdataBlockSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len)<br>
</pre>
<p>Called when a pcdata block has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>The pcdata content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the block length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="charactersSAXFunc"></a>Function type charactersSAXFunc</h3>
<pre class="programlisting">void	charactersSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>Receiving some chars from the parser.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="commentSAXFunc"></a>Function type commentSAXFunc</h3>
<pre class="programlisting">void	commentSAXFunc			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>A <a href="libxml2-SAX.html#comment">comment</a> has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#comment">comment</a> content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="elementDeclSAXFunc"></a>Function type elementDeclSAXFunc</h3>
<pre class="programlisting">void	elementDeclSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content)<br>
</pre>
<p>An element definition has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the element type</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the element value tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="endDocumentSAXFunc"></a>Function type endDocumentSAXFunc</h3>
<pre class="programlisting">void	endDocumentSAXFunc		(void * ctx)<br>
</pre>
<p>Called when the document end has been detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="endElementNsSAX2Func"></a>Function type endElementNsSAX2Func</h3>
<pre class="programlisting">void	endElementNsSAX2Func		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI)<br>
</pre>
<p>SAX2 callback when an element end has been detected by the parser. It provides the namespace information for the element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>localname</tt></i>:</span></td>
<td>the local name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the element namespace prefix if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the element namespace name if available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="endElementSAXFunc"></a>Function type endElementSAXFunc</h3>
<pre class="programlisting">void	endElementSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Called when the end of an element has been detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The element name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="entityDeclSAXFunc"></a>Function type entityDeclSAXFunc</h3>
<pre class="programlisting">void	entityDeclSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>An entity definition has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity value (without processing).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="errorSAXFunc"></a>Function type errorSAXFunc</h3>
<pre class="programlisting">void	errorSAXFunc			(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format an error messages, callback.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="externalSubsetSAXFunc"></a>Function type externalSubsetSAXFunc</h3>
<pre class="programlisting">void	externalSubsetSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on external subset declaration.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="fatalErrorSAXFunc"></a>Function type fatalErrorSAXFunc</h3>
<pre class="programlisting">void	fatalErrorSAXFunc		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format fatal error messages, callback. Note: so far fatalError() SAX callbacks are not used, error() get all the callbacks for errors.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getEntitySAXFunc"></a>Function type getEntitySAXFunc</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	getEntitySAXFunc	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get an entity by name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getParameterEntitySAXFunc"></a>Function type getParameterEntitySAXFunc</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	getParameterEntitySAXFunc	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get a parameter entity by name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="hasExternalSubsetSAXFunc"></a>Function type hasExternalSubsetSAXFunc</h3>
<pre class="programlisting">int	hasExternalSubsetSAXFunc	(void * ctx)<br>
</pre>
<p>Does this document has an external subset?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="hasInternalSubsetSAXFunc"></a>Function type hasInternalSubsetSAXFunc</h3>
<pre class="programlisting">int	hasInternalSubsetSAXFunc	(void * ctx)<br>
</pre>
<p>Does this document has an internal subset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="ignorableWhitespaceSAXFunc"></a>Function type ignorableWhitespaceSAXFunc</h3>
<pre class="programlisting">void	ignorableWhitespaceSAXFunc	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>Receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="internalSubsetSAXFunc"></a>Function type internalSubsetSAXFunc</h3>
<pre class="programlisting">void	internalSubsetSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on internal subset declaration.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="isStandaloneSAXFunc"></a>Function type isStandaloneSAXFunc</h3>
<pre class="programlisting">int	isStandaloneSAXFunc		(void * ctx)<br>
</pre>
<p>Is this document tagged standalone?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="notationDeclSAXFunc"></a>Function type notationDeclSAXFunc</h3>
<pre class="programlisting">void	notationDeclSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>What to do when a notation declaration has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="processingInstructionSAXFunc"></a>Function type processingInstructionSAXFunc</h3>
<pre class="programlisting">void	processingInstructionSAXFunc	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data)<br>
</pre>
<p>A processing instruction has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>the target name</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the PI data's</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="referenceSAXFunc"></a>Function type referenceSAXFunc</h3>
<pre class="programlisting">void	referenceSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Called when an entity <a href="libxml2-SAX.html#reference">reference</a> is detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="resolveEntitySAXFunc"></a>Function type resolveEntitySAXFunc</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	resolveEntitySAXFunc	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>Callback: The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> if inlined or NULL for DOM behaviour.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="setDocumentLocatorSAXFunc"></a>Function type setDocumentLocatorSAXFunc</h3>
<pre class="programlisting">void	setDocumentLocatorSAXFunc	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc)<br>
</pre>
<p>Receive the document locator at startup, actually xmlDefaultSAXLocator. Everything is available on the context, so this is useless in our case.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>loc</tt></i>:</span></td>
<td>A SAX Locator</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="startDocumentSAXFunc"></a>Function type startDocumentSAXFunc</h3>
<pre class="programlisting">void	startDocumentSAXFunc		(void * ctx)<br>
</pre>
<p>Called when the document start being processed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="startElementNsSAX2Func"></a>Function type startElementNsSAX2Func</h3>
<pre class="programlisting">void	startElementNsSAX2Func		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 int nb_namespaces, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces, <br>					 int nb_attributes, <br>					 int nb_defaulted, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** attributes)<br>
</pre>
<p>SAX2 callback when an element start has been detected by the parser. It provides the namespace information for the element, as well as the new namespace declarations on the element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>localname</tt></i>:</span></td>
<td>the local name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the element namespace prefix if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the element namespace name if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_namespaces</tt></i>:</span></td>
<td>number of namespace definitions on that node</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaces</tt></i>:</span></td>
<td>pointer to the array of prefix/URI pairs namespace definitions</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_attributes</tt></i>:</span></td>
<td>the number of attributes on that node</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_defaulted</tt></i>:</span></td>
<td>the number of defaulted attributes. The defaulted ones are at the end of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>attributes</tt></i>:</span></td>
<td>pointer to the array of (localname/prefix/URI/value/end) <a href="libxml2-SAX.html#attribute">attribute</a> values.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="startElementSAXFunc"></a>Function type startElementSAXFunc</h3>
<pre class="programlisting">void	startElementSAXFunc		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts)<br>
</pre>
<p>Called when an opening tag has been processed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The element name, including namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>atts</tt></i>:</span></td>
<td>An array of name/value attributes pairs, NULL terminated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="unparsedEntityDeclSAXFunc"></a>Function type unparsedEntityDeclSAXFunc</h3>
<pre class="programlisting">void	unparsedEntityDeclSAXFunc	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName)<br>
</pre>
<p>What to do when an unparsed entity declaration is parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>notationName</tt></i>:</span></td>
<td>the name of the notation</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="warningSAXFunc"></a>Function type warningSAXFunc</h3>
<pre class="programlisting">void	warningSAXFunc			(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format a warning messages, callback.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlExternalEntityLoader"></a>Function type xmlExternalEntityLoader</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlExternalEntityLoader	(const char * URL, <br>						 const char * ID, <br>						 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> context)<br>
</pre>
<p>External entity loaders types.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The System ID of the resource requested</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>The Public ID of the resource requested</td>
</tr>
<tr>
<td><span class="term"><i><tt>context</tt></i>:</span></td>
<td>the XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the entity input parser.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputDeallocate"></a>Function type xmlParserInputDeallocate</h3>
<pre class="programlisting">void	xmlParserInputDeallocate	(<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Callback for freeing some parser input allocations.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string to deallocate</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlByteConsumed"></a>xmlByteConsumed ()</h3>
<pre class="programlisting">long	xmlByteConsumed			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>This function provides the current index of the parser relative to the start of the current entity. This function is computed in bytes from the beginning starting at zero and finishing at the size in byte of the file if parsing a file. The function is of constant cost if the input is UTF-8 but can be costly if run on non-UTF-8 input.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the index in bytes from the beginning of the entity or -1 in case the index could not be computed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupParser"></a>xmlCleanupParser ()</h3>
<pre class="programlisting">void	xmlCleanupParser		(void)<br>
</pre>
<p>This function name is somewhat misleading. It does not clean up parser state, it cleans up memory allocated by the library itself. It is a cleanup function for the XML library. It tries to reclaim all related global memory allocated for the library processing. It doesn't deallocate any document related memory. One should call xmlCleanupParser() only when the process has finished using the library and all XML/HTML documents built with it. See also xmlInitParser() which has the opposite function of preparing the library for operations. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind !</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlClearNodeInfoSeq"></a>xmlClearNodeInfoSeq ()</h3>
<pre class="programlisting">void	xmlClearNodeInfoSeq		(<a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq)<br>
</pre>
<p>-- Clear (release memory and reinitialize) node info sequence</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>seq</tt></i>:</span></td>
<td>a node info sequence pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlClearParserCtxt"></a>xmlClearParserCtxt ()</h3>
<pre class="programlisting">void	xmlClearParserCtxt		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Clear (release owned resources) and reinitialize a parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateDocParserCtxt"></a>xmlCreateDocParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateDocParserCtxt	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur)<br>
</pre>
<p>Creates a parser context for an XML in-memory document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateIOParserCtxt"></a>xmlCreateIOParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreateIOParserCtxt	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>						 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>						 void * ioctx, <br>						 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a parser context for using the XML parser with an existing I/O stream</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreatePushParserCtxt"></a>xmlCreatePushParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlCreatePushParserCtxt	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 const char * chunk, <br>						 int size, <br>						 const char * filename)<br>
</pre>
<p>Create a parser context for using the XML parser in push mode. If @buffer and @size are non-NULL, the data is used to detect the encoding. The remaining <a href="libxml2-SAX.html#characters">characters</a> will be parsed so they don't need to be fed in again through xmlParseChunk. To allow content encoding detection, @size should be &gt;= 4 The value of @filename is used for fetching external entities and error/warning reports.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>chunk</tt></i>:</span></td>
<td>a pointer to an array of chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>number of chars in the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>an optional file name or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new parser context or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReadDoc"></a>xmlCtxtReadDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCtxtReadDoc		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReadFd"></a>xmlCtxtReadFd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCtxtReadFd		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context NOTE that the file descriptor will not be closed when the reader is closed or reset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReadFile"></a>xmlCtxtReadFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCtxtReadFile		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReadIO"></a>xmlCtxtReadIO ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCtxtReadIO		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReadMemory"></a>xmlCtxtReadMemory ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlCtxtReadMemory	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtReset"></a>xmlCtxtReset ()</h3>
<pre class="programlisting">void	xmlCtxtReset			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Reset a parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtResetPush"></a>xmlCtxtResetPush ()</h3>
<pre class="programlisting">int	xmlCtxtResetPush		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 const char * filename, <br>					 const char * encoding)<br>
</pre>
<p>Reset a push parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>chunk</tt></i>:</span></td>
<td>a pointer to an array of chars</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>number of chars in the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>an optional file name or URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and 1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtUseOptions"></a>xmlCtxtUseOptions ()</h3>
<pre class="programlisting">int	xmlCtxtUseOptions		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 int options)<br>
</pre>
<p>Applies the options to the parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, the set of unknown or unimplemented options in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeParserCtxt"></a>xmlFreeParserCtxt ()</h3>
<pre class="programlisting">void	xmlFreeParserCtxt		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Free all the memory used by a parser context. However the parsed document in ctxt-&gt;myDoc is not freed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetExternalEntityLoader"></a>xmlGetExternalEntityLoader ()</h3>
<pre class="programlisting"><a href="libxml2-parser.html#xmlExternalEntityLoader">xmlExternalEntityLoader</a>	xmlGetExternalEntityLoader	(void)<br>
</pre>
<p>Get the default external entity resolver function for the application</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-parser.html#xmlExternalEntityLoader">xmlExternalEntityLoader</a> function pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetFeature"></a>xmlGetFeature ()</h3>
<pre class="programlisting">int	xmlGetFeature			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * name, <br>					 void * result)<br>
</pre>
<p>Read the current value of one feature of this parser instance</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML/HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the feature name</td>
</tr>
<tr>
<td><span class="term"><i><tt>result</tt></i>:</span></td>
<td>location to store the result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case or error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetFeaturesList"></a>xmlGetFeaturesList ()</h3>
<pre class="programlisting">int	xmlGetFeaturesList		(int * len, <br>					 const char ** result)<br>
</pre>
<p>Copy at most *@len feature names into the @result array</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the features name array (input/output)</td>
</tr>
<tr>
<td><span class="term"><i><tt>result</tt></i>:</span></td>
<td>an array of string to be filled with the features name.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case or error, or the total number of features, len is updated with the number of strings copied, strings must not be deallocated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHasFeature"></a>xmlHasFeature ()</h3>
<pre class="programlisting">int	xmlHasFeature			(<a href="libxml2-parser.html#xmlFeature">xmlFeature</a> feature)<br>
</pre>
<p>Examines if the library has been compiled with a given feature.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>feature</tt></i>:</span></td>
<td>the feature to be examined</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a non-zero value if the feature exist, otherwise zero. Returns zero (0) if the feature does not exist or an unknown unknown feature is requested, non-zero otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIOParseDTD"></a>xmlIOParseDTD ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlIOParseDTD		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Load and parse a DTD</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an Input Buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> or NULL in case of error. @input will be freed by the function in any case.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitNodeInfoSeq"></a>xmlInitNodeInfoSeq ()</h3>
<pre class="programlisting">void	xmlInitNodeInfoSeq		(<a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq)<br>
</pre>
<p>-- Initialize (set to initial state) node info sequence</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>seq</tt></i>:</span></td>
<td>a node info sequence pointer</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitParser"></a>xmlInitParser ()</h3>
<pre class="programlisting">void	xmlInitParser			(void)<br>
</pre>
<p>Initialization function for the XML parser. This is not reentrant. Call once before processing in case of use in multithreaded programs.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitParserCtxt"></a>xmlInitParserCtxt ()</h3>
<pre class="programlisting">int	xmlInitParserCtxt		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Initialize a parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlKeepBlanksDefault"></a>xmlKeepBlanksDefault ()</h3>
<pre class="programlisting">int	xmlKeepBlanksDefault		(int val)<br>
</pre>
<p>Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn't allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the "empty" nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>int 0 or 1</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last value for 0 for no substitution, 1 for substitution.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLineNumbersDefault"></a>xmlLineNumbersDefault ()</h3>
<pre class="programlisting">int	xmlLineNumbersDefault		(int val)<br>
</pre>
<p>Set and return the previous value for enabling line numbers in elements contents. This may break on old application and is turned off by default.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>int 0 or 1</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last value for 0 for no substitution, 1 for substitution.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadExternalEntity"></a>xmlLoadExternalEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlLoadExternalEntity	(const char * URL, <br>						 const char * ID, <br>						 <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Load an external entity, note that the use of this function for unparsed entities may generate problems</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the Public ID for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the context in which the entity is called or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewIOInputStream"></a>xmlNewIOInputStream ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlNewIOInputStream	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>						 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc)<br>
</pre>
<p>Create a new input stream structure encapsulating the @input into a stream suitable for the parser.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an I/O Input</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>the charset encoding if known</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new input stream or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewParserCtxt"></a>xmlNewParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlNewParserCtxt	(void)<br>
</pre>
<p>Allocate and initialize a new parser context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> or NULL</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseBalancedChunkMemory"></a>xmlParseBalancedChunkMemory ()</h3>
<pre class="programlisting">int	xmlParseBalancedChunkMemory	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 int depth, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst)<br>
</pre>
<p>Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document the chunk pertains to (must not be NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>Used for loop detection, use 0</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the input string in UTF8 or ISO-Latin (zero terminated)</td>
</tr>
<tr>
<td><span class="term"><i><tt>lst</tt></i>:</span></td>
<td>the return value for the set of parsed nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseBalancedChunkMemoryRecover"></a>xmlParseBalancedChunkMemoryRecover ()</h3>
<pre class="programlisting">int	xmlParseBalancedChunkMemoryRecover	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 void * user_data, <br>						 int depth, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * string, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst, <br>						 int recover)<br>
</pre>
<p>Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document the chunk pertains to (must not be NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>Used for loop detection, use 0</td>
</tr>
<tr>
<td><span class="term"><i><tt>string</tt></i>:</span></td>
<td>the input string in UTF8 or ISO-Latin (zero terminated)</td>
</tr>
<tr>
<td><span class="term"><i><tt>lst</tt></i>:</span></td>
<td>the return value for the set of parsed nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>recover</tt></i>:</span></td>
<td>return nodes even if the data is broken (use 0)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise In case recover is set to 1, the nodelist will not be empty even if the parsed chunk is not well balanced, assuming the parsing succeeded to some extent.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseChunk"></a>xmlParseChunk ()</h3>
<pre class="programlisting">int	xmlParseChunk			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * chunk, <br>					 int size, <br>					 int terminate)<br>
</pre>
<p>Parse a Chunk of memory</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>chunk</tt></i>:</span></td>
<td>an char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size in byte of the chunk</td>
</tr>
<tr>
<td><span class="term"><i><tt>terminate</tt></i>:</span></td>
<td>last chunk indicator</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>zero if no error, the <a href="libxml2-xmlerror.html#xmlParserErrors">xmlParserErrors</a> otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCtxtExternalEntity"></a>xmlParseCtxtExternalEntity ()</h3>
<pre class="programlisting">int	xmlParseCtxtExternalEntity	(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst)<br>
</pre>
<p>Parse an external general entity within an existing parsing context An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the existing parsing context</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the System ID for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>lst</tt></i>:</span></td>
<td>the return value for the set of parsed nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseDTD"></a>xmlParseDTD ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlParseDTD		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Load and parse an external subset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>a NAME* containing the External ID of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>a NAME* containing the URL to the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseDoc"></a>xmlParseDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlParseDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur)<br>
</pre>
<p>parse an XML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseDocument"></a>xmlParseDocument ()</h3>
<pre class="programlisting">int	xmlParseDocument		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse an XML document (and build a tree if using the standard SAX interface). [1] document ::= prolog element Misc* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0, -1 in case of error. the parser context is augmented as a result of the parsing.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseEntity"></a>xmlParseEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlParseEntity		(const char * filename)<br>
</pre>
<p>parse an XML external entity out of context and build a tree. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseExtParsedEnt"></a>xmlParseExtParsedEnt ()</h3>
<pre class="programlisting">int	xmlParseExtParsedEnt		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a general parsed entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0, -1 in case of error. the parser context is augmented as a result of the parsing.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseExternalEntity"></a>xmlParseExternalEntity ()</h3>
<pre class="programlisting">int	xmlParseExternalEntity		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 int depth, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst)<br>
</pre>
<p>Parse an external general entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document the chunk pertains to</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks (possibly NULL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>Used for loop detection, use 0</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the System ID for the entity to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>lst</tt></i>:</span></td>
<td>the return value for the set of parsed nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseFile"></a>xmlParseFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlParseFile		(const char * filename)<br>
</pre>
<p>parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree if the file was wellformed, NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseInNodeContext"></a>xmlParseInNodeContext ()</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlParserErrors">xmlParserErrors</a>	xmlParseInNodeContext	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const char * data, <br>					 int datalen, <br>					 int options, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> * lst)<br>
</pre>
<p>Parse a well-balanced chunk of an XML document within the context (DTD, namespaces, etc ...) of the given node. The allowed sequence for the data is a Well Balanced Chunk defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the context node</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the input string</td>
</tr>
<tr>
<td><span class="term"><i><tt>datalen</tt></i>:</span></td>
<td>the input string length in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>lst</tt></i>:</span></td>
<td>the return value for the set of parsed nodes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>
<a href="libxml2-xmlerror.html#XML_ERR_OK">XML_ERR_OK</a> if the chunk is well balanced, and the parser error code otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseMemory"></a>xmlParseMemory ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlParseMemory		(const char * buffer, <br>					 int size)<br>
</pre>
<p>parse an XML in-memory block and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserAddNodeInfo"></a>xmlParserAddNodeInfo ()</h3>
<pre class="programlisting">void	xmlParserAddNodeInfo		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-parser.html#xmlParserNodeInfoPtr">xmlParserNodeInfoPtr</a> info)<br>
</pre>
<p>Insert node info record into the sorted sequence</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>info</tt></i>:</span></td>
<td>a node info sequence pointer</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserFindNodeInfo"></a>xmlParserFindNodeInfo ()</h3>
<pre class="programlisting">const <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> *	xmlParserFindNodeInfo	(const <a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctx, <br>							 const <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Find the parser node info struct for a given node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>an XML node within the tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an <a href="libxml2-parser.html#xmlParserNodeInfo">xmlParserNodeInfo</a> block pointer or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserFindNodeInfoIndex"></a>xmlParserFindNodeInfoIndex ()</h3>
<pre class="programlisting">unsigned long	xmlParserFindNodeInfoIndex	(const <a href="libxml2-parser.html#xmlParserNodeInfoSeqPtr">xmlParserNodeInfoSeqPtr</a> seq, <br>						 const <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p><a href="libxml2-parser.html#xmlParserFindNodeInfoIndex">xmlParserFindNodeInfoIndex</a> : Find the index that the info record for the given node is or should be at in a sorted sequence</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>seq</tt></i>:</span></td>
<td>a node info sequence pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>an XML node pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a long indicating the position of the record</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputGrow"></a>xmlParserInputGrow ()</h3>
<pre class="programlisting">int	xmlParserInputGrow		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in, <br>					 int len)<br>
</pre>
<p>This function increase the input for the parser. It tries to preserve pointers to the input buffer, and keep already read data</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an XML parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>an indicative size for the lookahead</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the amount of char read, or -1 in case of error, 0 indicate the end of this entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserInputRead"></a>xmlParserInputRead ()</h3>
<pre class="programlisting">int	xmlParserInputRead		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> in, <br>					 int len)<br>
</pre>
<p>This function was internal and is deprecated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>in</tt></i>:</span></td>
<td>an XML parser input</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>an indicative size for the lookahead</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 as this is an error to use it.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlPedanticParserDefault"></a>xmlPedanticParserDefault ()</h3>
<pre class="programlisting">int	xmlPedanticParserDefault	(int val)<br>
</pre>
<p>Set and return the previous value for enabling pedantic warnings.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>int 0 or 1</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last value for 0 for no substitution, 1 for substitution.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReadDoc"></a>xmlReadDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlReadDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReadFd"></a>xmlReadFd ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlReadFd		(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML from a file descriptor and build a tree. NOTE that the file descriptor will not be closed when the reader is closed or reset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReadFile"></a>xmlReadFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlReadFile		(const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReadIO"></a>xmlReadIO ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlReadIO		(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML document from I/O functions and source and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReadMemory"></a>xmlReadMemory ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlReadMemory		(const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML in-memory document and build a tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRecoverDoc"></a>xmlRecoverDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlRecoverDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur)<br>
</pre>
<p>parse an XML in-memory document and build a tree. In the case the document is not Well Formed, a attempt to build a tree is tried anyway</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree or NULL in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRecoverFile"></a>xmlRecoverFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlRecoverFile		(const char * filename)<br>
</pre>
<p>parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. In the case the document is not Well Formed, it attempts to build a tree anyway</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree or NULL in case of failure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRecoverMemory"></a>xmlRecoverMemory ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlRecoverMemory	(const char * buffer, <br>					 int size)<br>
</pre>
<p>parse an XML in-memory block and build a tree. In the case the document is not Well Formed, an attempt to build a tree is tried anyway</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseDTD"></a>xmlSAXParseDTD ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a>	xmlSAXParseDTD		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Load and parse an external subset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>a NAME* containing the External ID of the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>a NAME* containing the URL to the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseDoc"></a>xmlSAXParseDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseDoc		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 int recovery)<br>
</pre>
<p>parse an XML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to an array of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>recovery</tt></i>:</span></td>
<td>work in recovery mode, i.e. tries to read no Well Formed documents</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseEntity"></a>xmlSAXParseEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseEntity	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename)<br>
</pre>
<p>parse an XML external entity out of context and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseFile"></a>xmlSAXParseFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseFile		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename, <br>					 int recovery)<br>
</pre>
<p>parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>recovery</tt></i>:</span></td>
<td>work in recovery mode, i.e. tries to read no Well Formed documents</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseFileWithData"></a>xmlSAXParseFileWithData ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseFileWithData	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * filename, <br>					 int recovery, <br>					 void * data)<br>
</pre>
<p>parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>recovery</tt></i>:</span></td>
<td>work in recovery mode, i.e. tries to read no Well Formed documents</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseMemory"></a>xmlSAXParseMemory ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseMemory	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 const char * buffer, <br>					 int size, <br>					 int recovery)<br>
</pre>
<p>parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>recovery</tt></i>:</span></td>
<td>work in recovery mode, i.e. tries to read not Well Formed documents</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXParseMemoryWithData"></a>xmlSAXParseMemoryWithData ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlSAXParseMemoryWithData	(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>						 const char * buffer, <br>						 int size, <br>						 int recovery, <br>						 void * data)<br>
</pre>
<p>parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>the SAX handler block</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>recovery</tt></i>:</span></td>
<td>work in recovery mode, i.e. tries to read no Well Formed documents</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXUserParseFile"></a>xmlSAXUserParseFile ()</h3>
<pre class="programlisting">int	xmlSAXUserParseFile		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 const char * filename)<br>
</pre>
<p>parse an XML file and call the given SAX handler routines. Automatic support for ZLIB/Compress compressed document is provided</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success or a error number otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXUserParseMemory"></a>xmlSAXUserParseMemory ()</h3>
<pre class="programlisting">int	xmlSAXUserParseMemory		(<a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data, <br>					 const char * buffer, <br>					 int size)<br>
</pre>
<p>A better SAX parsing routine. parse an XML in-memory buffer and call the given SAX handler routines.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>The user data returned on SAX callbacks</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>an in-memory XML document input</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the length of the XML document in bytes</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success or a error number otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetExternalEntityLoader"></a>xmlSetExternalEntityLoader ()</h3>
<pre class="programlisting">void	xmlSetExternalEntityLoader	(<a href="libxml2-parser.html#xmlExternalEntityLoader">xmlExternalEntityLoader</a> f)<br>
</pre>
<p>Changes the defaultexternal entity resolver function for the application</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the new entity resolver function</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetFeature"></a>xmlSetFeature ()</h3>
<pre class="programlisting">int	xmlSetFeature			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const char * name, <br>					 void * value)<br>
</pre>
<p>Change the current value of one feature of this parser instance</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML/HTML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the feature name</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>pointer to the location of the new value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case or error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetupParserForBuffer"></a>xmlSetupParserForBuffer ()</h3>
<pre class="programlisting">void	xmlSetupParserForBuffer		(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buffer, <br>					 const char * filename)<br>
</pre>
<p>Setup the parser context to parse a new buffer; Clears any prior contents from the parser context. The buffer parameter must not be NULL, but the filename parameter can be</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStopParser"></a>xmlStopParser ()</h3>
<pre class="programlisting">void	xmlStopParser			(<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Blocks further parser processing</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSubstituteEntitiesDefault"></a>xmlSubstituteEntitiesDefault ()</h3>
<pre class="programlisting">int	xmlSubstituteEntitiesDefault	(int val)<br>
</pre>
<p>Set and return the previous value for default entity support. Initially the parser always keep entity references instead of substituting entity values in the output. This function has to be used to change the default parser behavior SAX::substituteEntities() has to be used for changing that on a file by file basis.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>int 0 or 1</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the last value for 0 for no substitution, 1 for substitution.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xpath.html000064400000171535151730335330014011 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xpath: XML Path Language implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlwriter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xpathInternals.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xpath</span></h2>
<p>xpath - XML Path Language implementation</p>
<p>API for the XML Path Language implementation  XML Path Language implementation XPath is a language for addressing parts of an XML document, designed to be used by both XSLT and XPointer</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_XPATH_CHECKNS">XML_XPATH_CHECKNS</a>;
#define <a href="#XML_XPATH_NOVAR">XML_XPATH_NOVAR</a>;
#define <a href="#xmlXPathNodeSetGetLength">xmlXPathNodeSetGetLength</a>(ns);
#define <a href="#xmlXPathNodeSetIsEmpty">xmlXPathNodeSetIsEmpty</a>(ns);
#define <a href="#xmlXPathNodeSetItem">xmlXPathNodeSetItem</a>(ns, index);
typedef struct _xmlNodeSet <a href="#xmlNodeSet">xmlNodeSet</a>;
typedef <a href="libxml2-xpath.html#xmlNodeSet">xmlNodeSet</a> * <a href="#xmlNodeSetPtr">xmlNodeSetPtr</a>;
typedef struct _xmlXPathAxis <a href="#xmlXPathAxis">xmlXPathAxis</a>;
typedef <a href="libxml2-xpath.html#xmlXPathAxis">xmlXPathAxis</a> * <a href="#xmlXPathAxisPtr">xmlXPathAxisPtr</a>;
typedef struct _xmlXPathCompExpr <a href="#xmlXPathCompExpr">xmlXPathCompExpr</a>;
typedef <a href="libxml2-xpath.html#xmlXPathCompExpr">xmlXPathCompExpr</a> * <a href="#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>;
typedef struct _xmlXPathContext <a href="#xmlXPathContext">xmlXPathContext</a>;
typedef <a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a> * <a href="#xmlXPathContextPtr">xmlXPathContextPtr</a>;
typedef enum <a href="#xmlXPathError">xmlXPathError</a>;
typedef <a href="libxml2-xpath.html#xmlXPathFunct">xmlXPathFunct</a> * <a href="#xmlXPathFuncPtr">xmlXPathFuncPtr</a>;
typedef struct _xmlXPathFunct <a href="#xmlXPathFunct">xmlXPathFunct</a>;
typedef struct _xmlXPathObject <a href="#xmlXPathObject">xmlXPathObject</a>;
typedef <a href="libxml2-xpath.html#xmlXPathObject">xmlXPathObject</a> * <a href="#xmlXPathObjectPtr">xmlXPathObjectPtr</a>;
typedef enum <a href="#xmlXPathObjectType">xmlXPathObjectType</a>;
typedef struct _xmlXPathParserContext <a href="#xmlXPathParserContext">xmlXPathParserContext</a>;
typedef <a href="libxml2-xpath.html#xmlXPathParserContext">xmlXPathParserContext</a> * <a href="#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a>;
typedef struct _xmlXPathType <a href="#xmlXPathType">xmlXPathType</a>;
typedef <a href="libxml2-xpath.html#xmlXPathType">xmlXPathType</a> * <a href="#xmlXPathTypePtr">xmlXPathTypePtr</a>;
typedef struct _xmlXPathVariable <a href="#xmlXPathVariable">xmlXPathVariable</a>;
typedef <a href="libxml2-xpath.html#xmlXPathVariable">xmlXPathVariable</a> * <a href="#xmlXPathVariablePtr">xmlXPathVariablePtr</a>;
typedef <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> <a href="#xmlXPathAxisFunc">xmlXPathAxisFunc</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> cur);
double	<a href="#xmlXPathCastBooleanToNumber">xmlXPathCastBooleanToNumber</a>	(int val);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathCastBooleanToString">xmlXPathCastBooleanToString</a>	(int val);
int	<a href="#xmlXPathCastNodeSetToBoolean">xmlXPathCastNodeSetToBoolean</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns);
double	<a href="#xmlXPathCastNodeSetToNumber">xmlXPathCastNodeSetToNumber</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathCastNodeSetToString">xmlXPathCastNodeSetToString</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns);
double	<a href="#xmlXPathCastNodeToNumber">xmlXPathCastNodeToNumber</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathCastNodeToString">xmlXPathCastNodeToString</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
int	<a href="#xmlXPathCastNumberToBoolean">xmlXPathCastNumberToBoolean</a>	(double val);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathCastNumberToString">xmlXPathCastNumberToString</a>	(double val);
int	<a href="#xmlXPathCastStringToBoolean">xmlXPathCastStringToBoolean</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
double	<a href="#xmlXPathCastStringToNumber">xmlXPathCastStringToNumber</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val);
int	<a href="#xmlXPathCastToBoolean">xmlXPathCastToBoolean</a>		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
double	<a href="#xmlXPathCastToNumber">xmlXPathCastToNumber</a>		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlXPathCastToString">xmlXPathCastToString</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
int	<a href="#xmlXPathCmpNodes">xmlXPathCmpNodes</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node1, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>	<a href="#xmlXPathCompile">xmlXPathCompile</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathCompiledEval">xmlXPathCompiledEval</a>	(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx);
int	<a href="#xmlXPathCompiledEvalToBoolean">xmlXPathCompiledEvalToBoolean</a>	(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
int	<a href="#xmlXPathContextSetCache">xmlXPathContextSetCache</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 int active, <br>					 int value, <br>					 int options);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathConvertBoolean">xmlXPathConvertBoolean</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
typedef int <a href="#xmlXPathConvertFunc">xmlXPathConvertFunc</a>		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj, <br>					 int type);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathConvertNumber">xmlXPathConvertNumber</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathConvertString">xmlXPathConvertString</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>	<a href="#xmlXPathCtxtCompile">xmlXPathCtxtCompile</a>	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathEval">xmlXPathEval</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathEvalExpression">xmlXPathEvalExpression</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
typedef void <a href="#xmlXPathEvalFunc">xmlXPathEvalFunc</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
int	<a href="#xmlXPathEvalPredicate">xmlXPathEvalPredicate</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> res);
void	<a href="#xmlXPathFreeCompExpr">xmlXPathFreeCompExpr</a>		(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp);
void	<a href="#xmlXPathFreeContext">xmlXPathFreeContext</a>		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt);
void	<a href="#xmlXPathFreeNodeSet">xmlXPathFreeNodeSet</a>		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> obj);
void	<a href="#xmlXPathFreeNodeSetList">xmlXPathFreeNodeSetList</a>		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj);
void	<a href="#xmlXPathFreeObject">xmlXPathFreeObject</a>		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj);
typedef <a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a> <a href="#xmlXPathFuncLookupFunc">xmlXPathFuncLookupFunc</a>	(void * ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri);
typedef void <a href="#xmlXPathFunction">xmlXPathFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
void	<a href="#xmlXPathInit">xmlXPathInit</a>			(void);
int	<a href="#xmlXPathIsInf">xmlXPathIsInf</a>			(double val);
int	<a href="#xmlXPathIsNaN">xmlXPathIsNaN</a>			(double val);
<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	<a href="#xmlXPathNewContext">xmlXPathNewContext</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathNodeEval">xmlXPathNodeEval</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx);
<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	<a href="#xmlXPathNodeSetCreate">xmlXPathNodeSetCreate</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPathObjectCopy">xmlXPathObjectCopy</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
long	<a href="#xmlXPathOrderDocElems">xmlXPathOrderDocElems</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlXPathSetContextNode">xmlXPathSetContextNode</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx);
typedef <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> <a href="#xmlXPathVariableLookupFunc">xmlXPathVariableLookupFunc</a>	(void * ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_XPATH_CHECKNS">Macro </a>XML_XPATH_CHECKNS</h3>
<pre class="programlisting">#define <a href="#XML_XPATH_CHECKNS">XML_XPATH_CHECKNS</a>;
</pre>
<p>check namespaces at compilation</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_XPATH_NOVAR">Macro </a>XML_XPATH_NOVAR</h3>
<pre class="programlisting">#define <a href="#XML_XPATH_NOVAR">XML_XPATH_NOVAR</a>;
</pre>
<p>forbid variables in expression</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XPATH_LOCATIONSET">Macro </a>XPATH_LOCATIONSET</h3>
<pre class="programlisting">#define <a href="#XPATH_LOCATIONSET">XPATH_LOCATIONSET</a>;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XPATH_POINT">Macro </a>XPATH_POINT</h3>
<pre class="programlisting">#define <a href="#XPATH_POINT">XPATH_POINT</a>;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XPATH_RANGE">Macro </a>XPATH_RANGE</h3>
<pre class="programlisting">#define <a href="#XPATH_RANGE">XPATH_RANGE</a>;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetGetLength">Macro </a>xmlXPathNodeSetGetLength</h3>
<pre class="programlisting">#define <a href="#xmlXPathNodeSetGetLength">xmlXPathNodeSetGetLength</a>(ns);
</pre>
<p>Implement a functionality similar to the DOM NodeList.length. Returns the number of nodes in the node-set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetIsEmpty">Macro </a>xmlXPathNodeSetIsEmpty</h3>
<pre class="programlisting">#define <a href="#xmlXPathNodeSetIsEmpty">xmlXPathNodeSetIsEmpty</a>(ns);
</pre>
<p>Checks whether @ns is empty or not. Returns %TRUE if @ns is an empty node-set.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetItem">Macro </a>xmlXPathNodeSetItem</h3>
<pre class="programlisting">#define <a href="#xmlXPathNodeSetItem">xmlXPathNodeSetItem</a>(ns, index);
</pre>
<p>Implements a functionality similar to the DOM NodeList.item(). Returns the <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> at the given @index in @ns or NULL if @index is out of range (0 to length-1)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>index</tt></i>:</span></td>
<td>index of a node in the set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSet">Structure </a>xmlNodeSet</h3>
<pre class="programlisting">struct _xmlNodeSet {
    int	nodeNr	: number of nodes in the set
    int	nodeMax	: size of the array as allocated
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> *	nodeTab	: array of nodes in no particular order @@ with_ns to check whether nam
} xmlNodeSet;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNodeSetPtr">Typedef </a>xmlNodeSetPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSet">xmlNodeSet</a> * xmlNodeSetPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathAxis">Structure </a>xmlXPathAxis</h3>
<pre class="programlisting">struct _xmlXPathAxis {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the axis name
    <a href="libxml2-xpath.html#xmlXPathAxisFunc">xmlXPathAxisFunc</a>	func	: the search function
} xmlXPathAxis;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathAxisPtr">Typedef </a>xmlXPathAxisPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathAxis">xmlXPathAxis</a> * xmlXPathAxisPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompExpr">Structure </a>xmlXPathCompExpr</h3>
<pre class="programlisting">struct _xmlXPathCompExpr {
The content of this structure is not made public by the API.
} xmlXPathCompExpr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompExprPtr">Typedef </a>xmlXPathCompExprPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathCompExpr">xmlXPathCompExpr</a> * xmlXPathCompExprPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathContext">Structure </a>xmlXPathContext</h3>
<pre class="programlisting">struct _xmlXPathContext {
    <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	doc	: The current document
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node	: The current node
    int	nb_variables_unused	: unused (hash table)
    int	max_variables_unused	: unused (hash table)
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	varHash	: Hash table of defined variables
    int	nb_types	: number of defined types
    int	max_types	: max number of types
    <a href="libxml2-xpath.html#xmlXPathTypePtr">xmlXPathTypePtr</a>	types	: Array of defined types
    int	nb_funcs_unused	: unused (hash table)
    int	max_funcs_unused	: unused (hash table)
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	funcHash	: Hash table of defined funcs
    int	nb_axis	: number of defined axis
    int	max_axis	: max number of axis
    <a href="libxml2-xpath.html#xmlXPathAxisPtr">xmlXPathAxisPtr</a>	axis	: Array of defined axis the namespace nodes of the context node
    <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> *	namespaces	: Array of namespaces
    int	nsNr	: number of namespace in scope
    void *	user	: function to free extra variables
    int	contextSize	: the context size
    int	proximityPosition	: the proximity position extra stuff for XPointer
    int	xptr	: is this an XPointer context?
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	here	: for here()
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	origin	: for origin() the set of namespace declarations in scope for the expre
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	nsHash	: The namespaces hash table
    <a href="libxml2-xpath.html#xmlXPathVariableLookupFunc">xmlXPathVariableLookupFunc</a>	varLookupFunc	: variable lookup func
    void *	varLookupData	: variable lookup data Possibility to link in an extra item
    void *	extra	: needed for XSLT The function name and URI when calling a function
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	function
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	functionURI	: function lookup function and data
    <a href="libxml2-xpath.html#xmlXPathFuncLookupFunc">xmlXPathFuncLookupFunc</a>	funcLookupFunc	: function lookup func
    void *	funcLookupData	: function lookup data temporary namespace lists kept for walking the n
    <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> *	tmpNsList	: Array of namespaces
    int	tmpNsNr	: number of namespaces in scope error reporting mechanism
    void *	userData	: user specific data block
    <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a>	error	: the callback in case of errors
    <a href="libxml2-xmlerror.html#xmlError">xmlError</a>	lastError	: the last error
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	debugNode	: the source node XSLT dictionary
    <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	dict	: dictionary if any
    int	flags	: flags to control compilation Cache for reusal of XPath objects
    void *	cache	: Resource limits
    unsigned long	opLimit
    unsigned long	opCount
    int	depth
} xmlXPathContext;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathContextPtr">Typedef </a>xmlXPathContextPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a> * xmlXPathContextPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathError">Enum </a>xmlXPathError</h3>
<pre class="programlisting">enum <a href="#xmlXPathError">xmlXPathError</a> {
    <a name="XPATH_EXPRESSION_OK">XPATH_EXPRESSION_OK</a> = 0
    <a name="XPATH_NUMBER_ERROR">XPATH_NUMBER_ERROR</a> = 1
    <a name="XPATH_UNFINISHED_LITERAL_ERROR">XPATH_UNFINISHED_LITERAL_ERROR</a> = 2
    <a name="XPATH_START_LITERAL_ERROR">XPATH_START_LITERAL_ERROR</a> = 3
    <a name="XPATH_VARIABLE_REF_ERROR">XPATH_VARIABLE_REF_ERROR</a> = 4
    <a name="XPATH_UNDEF_VARIABLE_ERROR">XPATH_UNDEF_VARIABLE_ERROR</a> = 5
    <a name="XPATH_INVALID_PREDICATE_ERROR">XPATH_INVALID_PREDICATE_ERROR</a> = 6
    <a name="XPATH_EXPR_ERROR">XPATH_EXPR_ERROR</a> = 7
    <a name="XPATH_UNCLOSED_ERROR">XPATH_UNCLOSED_ERROR</a> = 8
    <a name="XPATH_UNKNOWN_FUNC_ERROR">XPATH_UNKNOWN_FUNC_ERROR</a> = 9
    <a name="XPATH_INVALID_OPERAND">XPATH_INVALID_OPERAND</a> = 10
    <a name="XPATH_INVALID_TYPE">XPATH_INVALID_TYPE</a> = 11
    <a name="XPATH_INVALID_ARITY">XPATH_INVALID_ARITY</a> = 12
    <a name="XPATH_INVALID_CTXT_SIZE">XPATH_INVALID_CTXT_SIZE</a> = 13
    <a name="XPATH_INVALID_CTXT_POSITION">XPATH_INVALID_CTXT_POSITION</a> = 14
    <a name="XPATH_MEMORY_ERROR">XPATH_MEMORY_ERROR</a> = 15
    <a name="XPTR_SYNTAX_ERROR">XPTR_SYNTAX_ERROR</a> = 16
    <a name="XPTR_RESOURCE_ERROR">XPTR_RESOURCE_ERROR</a> = 17
    <a name="XPTR_SUB_RESOURCE_ERROR">XPTR_SUB_RESOURCE_ERROR</a> = 18
    <a name="XPATH_UNDEF_PREFIX_ERROR">XPATH_UNDEF_PREFIX_ERROR</a> = 19
    <a name="XPATH_ENCODING_ERROR">XPATH_ENCODING_ERROR</a> = 20
    <a name="XPATH_INVALID_CHAR_ERROR">XPATH_INVALID_CHAR_ERROR</a> = 21
    <a name="XPATH_INVALID_CTXT">XPATH_INVALID_CTXT</a> = 22
    <a name="XPATH_STACK_ERROR">XPATH_STACK_ERROR</a> = 23
    <a name="XPATH_FORBID_VARIABLE_ERROR">XPATH_FORBID_VARIABLE_ERROR</a> = 24
    <a name="XPATH_OP_LIMIT_EXCEEDED">XPATH_OP_LIMIT_EXCEEDED</a> = 25
    <a name="XPATH_RECURSION_LIMIT_EXCEEDED">XPATH_RECURSION_LIMIT_EXCEEDED</a> = 26
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFuncPtr">Typedef </a>xmlXPathFuncPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathFunct">xmlXPathFunct</a> * xmlXPathFuncPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFunct">Structure </a>xmlXPathFunct</h3>
<pre class="programlisting">struct _xmlXPathFunct {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the function name
    <a href="libxml2-xpath.html#xmlXPathEvalFunc">xmlXPathEvalFunc</a>	func	: the evaluation function
} xmlXPathFunct;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathObject">Structure </a>xmlXPathObject</h3>
<pre class="programlisting">struct _xmlXPathObject {
    <a href="libxml2-xpath.html#xmlXPathObjectType">xmlXPathObjectType</a>	type
    <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	nodesetval
    int	boolval
    double	floatval
    <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	stringval
    void *	user
    int	index
    void *	user2
    int	index2
} xmlXPathObject;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathObjectPtr">Typedef </a>xmlXPathObjectPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObject">xmlXPathObject</a> * xmlXPathObjectPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathObjectType">Enum </a>xmlXPathObjectType</h3>
<pre class="programlisting">enum <a href="#xmlXPathObjectType">xmlXPathObjectType</a> {
    <a name="XPATH_UNDEFINED">XPATH_UNDEFINED</a> = 0
    <a name="XPATH_NODESET">XPATH_NODESET</a> = 1
    <a name="XPATH_BOOLEAN">XPATH_BOOLEAN</a> = 2
    <a name="XPATH_NUMBER">XPATH_NUMBER</a> = 3
    <a name="XPATH_STRING">XPATH_STRING</a> = 4
    <a name="XPATH_POINT">XPATH_POINT</a> = 5
    <a name="XPATH_RANGE">XPATH_RANGE</a> = 6
    <a name="XPATH_LOCATIONSET">XPATH_LOCATIONSET</a> = 7
    <a name="XPATH_USERS">XPATH_USERS</a> = 8
    <a name="XPATH_XSLT_TREE">XPATH_XSLT_TREE</a> = 9 /*  An XSLT value tree, non modifiable */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathParserContext">Structure </a>xmlXPathParserContext</h3>
<pre class="programlisting">struct _xmlXPathParserContext {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	cur	: the current char being parsed
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	base	: the full expression
    int	error	: error code
    <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	context	: the evaluation context
    <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	value	: the current value
    int	valueNr	: number of values stacked
    int	valueMax	: max number of values stacked
    <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> *	valueTab	: stack of values
    <a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>	comp	: the precompiled expression
    int	xptr	: it this an XPointer expression
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	ancestor	: used for walking preceding axis
    int	valueFrame	: used to limit Pop on the stack
} xmlXPathParserContext;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathParserContextPtr">Typedef </a>xmlXPathParserContextPtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathParserContext">xmlXPathParserContext</a> * xmlXPathParserContextPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathType">Structure </a>xmlXPathType</h3>
<pre class="programlisting">struct _xmlXPathType {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the type name
    <a href="libxml2-xpath.html#xmlXPathConvertFunc">xmlXPathConvertFunc</a>	func	: the conversion function
} xmlXPathType;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathTypePtr">Typedef </a>xmlXPathTypePtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathType">xmlXPathType</a> * xmlXPathTypePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathVariable">Structure </a>xmlXPathVariable</h3>
<pre class="programlisting">struct _xmlXPathVariable {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the variable name
    <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	value	: the value
} xmlXPathVariable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathVariablePtr">Typedef </a>xmlXPathVariablePtr</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathVariable">xmlXPathVariable</a> * xmlXPathVariablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathAxisFunc"></a>Function type xmlXPathAxisFunc</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathAxisFunc	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>						 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> cur)<br>
</pre>
<p>An axis traversal function. To traverse an axis, the engine calls the first time with cur == NULL and repeat until the function returns NULL indicating the end of the axis traversal.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath interpreter context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the previous node being explored on that axis</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the next node in that axis or NULL if at the end of the axis.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathConvertFunc"></a>Function type xmlXPathConvertFunc</h3>
<pre class="programlisting">int	xmlXPathConvertFunc		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj, <br>					 int type)<br>
</pre>
<p>A conversion function is associated to a type and used to cast the new type to primitive values.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the number of the target type</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEvalFunc"></a>Function type xmlXPathEvalFunc</h3>
<pre class="programlisting">void	xmlXPathEvalFunc		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>An XPath evaluation function, the parameters are on the XPath context stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments passed to the function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFuncLookupFunc"></a>Function type xmlXPathFuncLookupFunc</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathFunction">xmlXPathFunction</a>	xmlXPathFuncLookupFunc	(void * ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri)<br>
</pre>
<p>Prototype for callbacks used to plug function lookup in the XPath engine.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>name of the function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the namespace name hosting this function</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the XPath function or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFunction"></a>Function type xmlXPathFunction</h3>
<pre class="programlisting">void	xmlXPathFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>An XPath function. The arguments (if any) are popped out from the context stack and the result is pushed on the stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath interprestation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathVariableLookupFunc"></a>Function type xmlXPathVariableLookupFunc</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathVariableLookupFunc	(void * ctxt, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns_uri)<br>
</pre>
<p>Prototype for callbacks used to plug variable lookup in the XPath engine.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>name of the variable</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns_uri</tt></i>:</span></td>
<td>the namespace name hosting this variable</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the XPath object value or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNAN">Variable </a>xmlXPathNAN</h3>
<pre class="programlisting">double xmlXPathNAN;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNINF">Variable </a>xmlXPathNINF</h3>
<pre class="programlisting">double xmlXPathNINF;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathPINF">Variable </a>xmlXPathPINF</h3>
<pre class="programlisting">double xmlXPathPINF;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastBooleanToNumber"></a>xmlXPathCastBooleanToNumber ()</h3>
<pre class="programlisting">double	xmlXPathCastBooleanToNumber	(int val)<br>
</pre>
<p>Converts a boolean to its number value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a boolean</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastBooleanToString"></a>xmlXPathCastBooleanToString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathCastBooleanToString	(int val)<br>
</pre>
<p>Converts a boolean to its string value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a boolean</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly allocated string.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNodeSetToBoolean"></a>xmlXPathCastNodeSetToBoolean ()</h3>
<pre class="programlisting">int	xmlXPathCastNodeSetToBoolean	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns)<br>
</pre>
<p>Converts a node-set to its boolean value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the boolean value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNodeSetToNumber"></a>xmlXPathCastNodeSetToNumber ()</h3>
<pre class="programlisting">double	xmlXPathCastNodeSetToNumber	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns)<br>
</pre>
<p>Converts a node-set to its number value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNodeSetToString"></a>xmlXPathCastNodeSetToString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathCastNodeSetToString	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> ns)<br>
</pre>
<p>Converts a node-set to its string value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>a node-set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly allocated string.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNodeToNumber"></a>xmlXPathCastNodeToNumber ()</h3>
<pre class="programlisting">double	xmlXPathCastNodeToNumber	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Converts a node to its number value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNodeToString"></a>xmlXPathCastNodeToString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathCastNodeToString	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Converts a node to its string value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly allocated string.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNumberToBoolean"></a>xmlXPathCastNumberToBoolean ()</h3>
<pre class="programlisting">int	xmlXPathCastNumberToBoolean	(double val)<br>
</pre>
<p>Converts a number to its boolean value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the boolean value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastNumberToString"></a>xmlXPathCastNumberToString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathCastNumberToString	(double val)<br>
</pre>
<p>Converts a number to its string value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a number</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a newly allocated string.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastStringToBoolean"></a>xmlXPathCastStringToBoolean ()</h3>
<pre class="programlisting">int	xmlXPathCastStringToBoolean	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>Converts a string to its boolean value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the boolean value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastStringToNumber"></a>xmlXPathCastStringToNumber ()</h3>
<pre class="programlisting">double	xmlXPathCastStringToNumber	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * val)<br>
</pre>
<p>Converts a string to its number value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastToBoolean"></a>xmlXPathCastToBoolean ()</h3>
<pre class="programlisting">int	xmlXPathCastToBoolean		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an XPath object to its boolean value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the boolean value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastToNumber"></a>xmlXPathCastToNumber ()</h3>
<pre class="programlisting">double	xmlXPathCastToNumber		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an XPath object to its number value</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCastToString"></a>xmlXPathCastToString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlXPathCastToString	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an existing object to its string() equivalent</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the allocated string value of the object, NULL in case of error. It's up to the caller to free the string memory with xmlFree().</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCmpNodes"></a>xmlXPathCmpNodes ()</h3>
<pre class="programlisting">int	xmlXPathCmpNodes		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node1, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Compare two nodes w.r.t document order</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node1</tt></i>:</span></td>
<td>the first node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>the second node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-2 in case of error 1 if first point &lt; second point, 0 if it's the same node, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompile"></a>xmlXPathCompile ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>	xmlXPathCompile	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Compile an XPath expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> resulting from the compilation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompiledEval"></a>xmlXPathCompiledEval ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathCompiledEval	(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx)<br>
</pre>
<p>Evaluate the Precompiled XPath expression in the given context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the compiled XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> resulting from the evaluation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCompiledEvalToBoolean"></a>xmlXPathCompiledEvalToBoolean ()</h3>
<pre class="programlisting">int	xmlXPathCompiledEvalToBoolean	(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Applies the XPath boolean() function on the result of the given compiled expression.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>the compiled XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the expression evaluated to true, 0 if to false and -1 in API and internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathContextSetCache"></a>xmlXPathContextSetCache ()</h3>
<pre class="programlisting">int	xmlXPathContextSetCache		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 int active, <br>					 int value, <br>					 int options)<br>
</pre>
<p>Creates/frees an object cache on the XPath context. If activates XPath objects (xmlXPathObject) will be cached internally to be reused. @options: 0: This will set the XPath object caching: @value: This will set the maximum number of XPath objects to be cached per slot There are 5 slots for: node-set, string, number, boolean, and misc objects. Use &lt;0 for the default number (100). Other values for @options have currently no effect.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>active</tt></i>:</span></td>
<td>enables/disables (creates/frees) the cache</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>a value with semantics dependent on @options</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>options (currently only the value 0 is used)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the setting succeeded, and -1 on API or internal errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathConvertBoolean"></a>xmlXPathConvertBoolean ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathConvertBoolean	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an existing object to its boolean() equivalent</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new object, the old one is freed (or the operation is done directly on @val)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathConvertNumber"></a>xmlXPathConvertNumber ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathConvertNumber	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an existing object to its number() equivalent</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new object, the old one is freed (or the operation is done directly on @val)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathConvertString"></a>xmlXPathConvertString ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathConvertString	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Converts an existing object to its string() equivalent</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an XPath object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new object, the old one is freed (or the operation is done directly on @val)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathCtxtCompile"></a>xmlXPathCtxtCompile ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a>	xmlXPathCtxtCompile	(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Compile an XPath expression</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>an XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> resulting from the compilation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEval"></a>xmlXPathEval ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathEval	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx)<br>
</pre>
<p>Evaluate the XPath Location Path in the given context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> resulting from the evaluation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEvalExpression"></a>xmlXPathEvalExpression ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathEvalExpression	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Alias for xmlXPathEval().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> resulting from the evaluation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathEvalPredicate"></a>xmlXPathEvalPredicate ()</h3>
<pre class="programlisting">int	xmlXPathEvalPredicate		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> res)<br>
</pre>
<p>Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>res</tt></i>:</span></td>
<td>the Predicate Expression evaluation result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if predicate is true, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeCompExpr"></a>xmlXPathFreeCompExpr ()</h3>
<pre class="programlisting">void	xmlXPathFreeCompExpr		(<a href="libxml2-xpath.html#xmlXPathCompExprPtr">xmlXPathCompExprPtr</a> comp)<br>
</pre>
<p>Free up the memory allocated by @comp</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>comp</tt></i>:</span></td>
<td>an XPATH comp</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeContext"></a>xmlXPathFreeContext ()</h3>
<pre class="programlisting">void	xmlXPathFreeContext		(<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctxt)<br>
</pre>
<p>Free up an <a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the context to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeNodeSet"></a>xmlXPathFreeNodeSet ()</h3>
<pre class="programlisting">void	xmlXPathFreeNodeSet		(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> obj)<br>
</pre>
<p>Free the NodeSet compound (not the actual nodes !).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeNodeSetList"></a>xmlXPathFreeNodeSetList ()</h3>
<pre class="programlisting">void	xmlXPathFreeNodeSetList		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj)<br>
</pre>
<p>Free up the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> @obj but don't deallocate the objects in the list contrary to xmlXPathFreeObject().</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>an existing NodeSetList object</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathFreeObject"></a>xmlXPathFreeObject ()</h3>
<pre class="programlisting">void	xmlXPathFreeObject		(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj)<br>
</pre>
<p>Free up an <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> object.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>the object to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathInit"></a>xmlXPathInit ()</h3>
<pre class="programlisting">void	xmlXPathInit			(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Initialize the XPath environment</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathIsInf"></a>xmlXPathIsInf ()</h3>
<pre class="programlisting">int	xmlXPathIsInf			(double val)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a double value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the value is +Infinite, -1 if -Infinite, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathIsNaN"></a>xmlXPathIsNaN ()</h3>
<pre class="programlisting">int	xmlXPathIsNaN			(double val)<br>
</pre>
<p></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a double value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the value is a NaN, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNewContext"></a>xmlXPathNewContext ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	xmlXPathNewContext	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a> just allocated. The caller will need to free it.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeEval"></a>xmlXPathNodeEval ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathNodeEval	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>						 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx)<br>
</pre>
<p>Evaluate the XPath Location Path in the given context. The node 'node' is set as the context node. The context node is not restored.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to to use as the context node</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPath expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> resulting from the evaluation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathNodeSetCreate"></a>xmlXPathNodeSetCreate ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a>	xmlXPathNodeSetCreate	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> val)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> of type double and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an initial xmlNodePtr, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathObjectCopy"></a>xmlXPathObjectCopy ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPathObjectCopy	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>allocate a new copy of a given object</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the original object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathOrderDocElems"></a>xmlXPathOrderDocElems ()</h3>
<pre class="programlisting">long	xmlXPathOrderDocElems		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Call this routine to speed up XPath computation on static documents. This stamps all the element nodes with the document order Like for line information, the order is kept in the element-&gt;content field, the value stored is actually - the node number (starting at -1) to be able to differentiate from line numbers.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>an input document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of elements found in the document or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPathSetContextNode"></a>xmlXPathSetContextNode ()</h3>
<pre class="programlisting">int	xmlXPathSetContextNode		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx)<br>
</pre>
<p>Sets 'node' as the context node. The node must be in the same document as that associated with the context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to to use as the context node</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the XPath context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error or 0 if successful</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlsave.html000064400000034077151730335330014343 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlsave: the XML document serializer</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlregexp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlschemas.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlsave</span></h2>
<p>xmlsave - the XML document serializer</p>
<p>API to save document or subtree of document </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlSaveCtxt <a href="#xmlSaveCtxt">xmlSaveCtxt</a>;
typedef <a href="libxml2-xmlsave.html#xmlSaveCtxt">xmlSaveCtxt</a> * <a href="#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>;
typedef enum <a href="#xmlSaveOption">xmlSaveOption</a>;
int	<a href="#xmlSaveClose">xmlSaveClose</a>			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt);
long	<a href="#xmlSaveDoc">xmlSaveDoc</a>			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlSaveFlush">xmlSaveFlush</a>			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt);
int	<a href="#xmlSaveSetAttrEscape">xmlSaveSetAttrEscape</a>		(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escape);
int	<a href="#xmlSaveSetEscape">xmlSaveSetEscape</a>		(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escape);
<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	<a href="#xmlSaveToBuffer">xmlSaveToBuffer</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	<a href="#xmlSaveToFd">xmlSaveToFd</a>		(int fd, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	<a href="#xmlSaveToFilename">xmlSaveToFilename</a>	(const char * filename, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	<a href="#xmlSaveToIO">xmlSaveToIO</a>		(<a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> iowrite, <br>					 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * encoding, <br>					 int options);
long	<a href="#xmlSaveTree">xmlSaveTree</a>			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveCtxt">Structure </a>xmlSaveCtxt</h3>
<pre class="programlisting">struct _xmlSaveCtxt {
The content of this structure is not made public by the API.
} xmlSaveCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveCtxtPtr">Typedef </a>xmlSaveCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlsave.html#xmlSaveCtxt">xmlSaveCtxt</a> * xmlSaveCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveOption">Enum </a>xmlSaveOption</h3>
<pre class="programlisting">enum <a href="#xmlSaveOption">xmlSaveOption</a> {
    <a name="XML_SAVE_FORMAT">XML_SAVE_FORMAT</a> = 1 /* format save output */
    <a name="XML_SAVE_NO_DECL">XML_SAVE_NO_DECL</a> = 2 /* drop the xml declaration */
    <a name="XML_SAVE_NO_EMPTY">XML_SAVE_NO_EMPTY</a> = 4 /* no empty tags */
    <a name="XML_SAVE_NO_XHTML">XML_SAVE_NO_XHTML</a> = 8 /* disable XHTML1 specific rules */
    <a name="XML_SAVE_XHTML">XML_SAVE_XHTML</a> = 16 /* force XHTML1 specific rules */
    <a name="XML_SAVE_AS_XML">XML_SAVE_AS_XML</a> = 32 /* force XML serialization on HTML doc */
    <a name="XML_SAVE_AS_HTML">XML_SAVE_AS_HTML</a> = 64 /* force HTML serialization on XML doc */
    <a name="XML_SAVE_WSNONSIG">XML_SAVE_WSNONSIG</a> = 128 /*  format with non-significant whitespace */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveClose"></a>xmlSaveClose ()</h3>
<pre class="programlisting">int	xmlSaveClose			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt)<br>
</pre>
<p>Close a document saving context, i.e. make sure that all bytes have been output and free the associated data.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveDoc"></a>xmlSaveDoc ()</h3>
<pre class="programlisting">long	xmlSaveDoc			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Save a full document to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveFlush"></a>xmlSaveFlush ()</h3>
<pre class="programlisting">int	xmlSaveFlush			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt)<br>
</pre>
<p>Flush a document saving context, i.e. make sure that all bytes have been output.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveSetAttrEscape"></a>xmlSaveSetAttrEscape ()</h3>
<pre class="programlisting">int	xmlSaveSetAttrEscape		(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escape)<br>
</pre>
<p>Set a custom escaping function to be used for text in <a href="libxml2-SAX.html#attribute">attribute</a> content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>escape</tt></i>:</span></td>
<td>the escaping function</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveSetEscape"></a>xmlSaveSetEscape ()</h3>
<pre class="programlisting">int	xmlSaveSetEscape		(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-encoding.html#xmlCharEncodingOutputFunc">xmlCharEncodingOutputFunc</a> escape)<br>
</pre>
<p>Set a custom escaping function to be used for text in element content</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>escape</tt></i>:</span></td>
<td>the escaping function</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveToBuffer"></a>xmlSaveToBuffer ()</h3>
<pre class="programlisting"><a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	xmlSaveToBuffer		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buffer, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create a document saving context serializing to a buffer with the encoding and the options given</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding name to use or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of xmlSaveOptions</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new serialization context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveToFd"></a>xmlSaveToFd ()</h3>
<pre class="programlisting"><a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	xmlSaveToFd		(int fd, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create a document saving context serializing to a file descriptor with the encoding and the options given.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>a file descriptor number</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding name to use or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of xmlSaveOptions</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new serialization context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveToFilename"></a>xmlSaveToFilename ()</h3>
<pre class="programlisting"><a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	xmlSaveToFilename	(const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create a document saving context serializing to a filename or possibly to an URL (but this is less reliable) with the encoding and the options given.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file name or an URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding name to use or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of xmlSaveOptions</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new serialization context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveToIO"></a>xmlSaveToIO ()</h3>
<pre class="programlisting"><a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a>	xmlSaveToIO		(<a href="libxml2-xmlIO.html#xmlOutputWriteCallback">xmlOutputWriteCallback</a> iowrite, <br>					 <a href="libxml2-xmlIO.html#xmlOutputCloseCallback">xmlOutputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create a document saving context serializing to a file descriptor with the encoding and the options given</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>iowrite</tt></i>:</span></td>
<td>an I/O write function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding name to use or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a set of xmlSaveOptions</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new serialization context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSaveTree"></a>xmlSaveTree ()</h3>
<pre class="programlisting">long	xmlSaveTree			(<a href="libxml2-xmlsave.html#xmlSaveCtxtPtr">xmlSaveCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Save a subtree starting at the node parameter to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a document saving context</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-hash.html000064400000123122151730335330013575 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hash: Chained hash tables</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-globals.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-list.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">hash</span></h2>
<p>hash - Chained hash tables</p>
<p>This module implements the hash table support used in various places in the library. </p>
<p>Author(s): Bjorn Reese &lt;bjorn.reese@systematic.dk&gt; </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_CAST_FPTR">XML_CAST_FPTR</a>(fptr);
typedef struct _xmlHashTable <a href="#xmlHashTable">xmlHashTable</a>;
typedef <a href="libxml2-hash.html#xmlHashTable">xmlHashTable</a> * <a href="#xmlHashTablePtr">xmlHashTablePtr</a>;
int	<a href="#xmlHashAddEntry">xmlHashAddEntry</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 void * userdata);
int	<a href="#xmlHashAddEntry2">xmlHashAddEntry2</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 void * userdata);
int	<a href="#xmlHashAddEntry3">xmlHashAddEntry3</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 void * userdata);
typedef void * <a href="#xmlHashCopier">xmlHashCopier</a>			(void * payload, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	<a href="#xmlHashCopy">xmlHashCopy</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashCopier">xmlHashCopier</a> f);
<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	<a href="#xmlHashCreate">xmlHashCreate</a>		(int size);
<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	<a href="#xmlHashCreateDict">xmlHashCreateDict</a>	(int size, <br>					 <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict);
typedef void <a href="#xmlHashDeallocator">xmlHashDeallocator</a>		(void * payload, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlHashDefaultDeallocator">xmlHashDefaultDeallocator</a>	(void * entry, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlHashFree">xmlHashFree</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
void *	<a href="#xmlHashLookup">xmlHashLookup</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void *	<a href="#xmlHashLookup2">xmlHashLookup2</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2);
void *	<a href="#xmlHashLookup3">xmlHashLookup3</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3);
void *	<a href="#xmlHashQLookup">xmlHashQLookup</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void *	<a href="#xmlHashQLookup2">xmlHashQLookup2</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2);
void *	<a href="#xmlHashQLookup3">xmlHashQLookup3</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix3, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3);
int	<a href="#xmlHashRemoveEntry">xmlHashRemoveEntry</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
int	<a href="#xmlHashRemoveEntry2">xmlHashRemoveEntry2</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
int	<a href="#xmlHashRemoveEntry3">xmlHashRemoveEntry3</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
void	<a href="#xmlHashScan">xmlHashScan</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashScanner">xmlHashScanner</a> f, <br>					 void * data);
void	<a href="#xmlHashScan3">xmlHashScan3</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashScanner">xmlHashScanner</a> f, <br>					 void * data);
void	<a href="#xmlHashScanFull">xmlHashScanFull</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashScannerFull">xmlHashScannerFull</a> f, <br>					 void * data);
void	<a href="#xmlHashScanFull3">xmlHashScanFull3</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashScannerFull">xmlHashScannerFull</a> f, <br>					 void * data);
typedef void <a href="#xmlHashScanner">xmlHashScanner</a>			(void * payload, <br>					 void * data, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
typedef void <a href="#xmlHashScannerFull">xmlHashScannerFull</a>		(void * payload, <br>					 void * data, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3);
int	<a href="#xmlHashSize">xmlHashSize</a>			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table);
int	<a href="#xmlHashUpdateEntry">xmlHashUpdateEntry</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
int	<a href="#xmlHashUpdateEntry2">xmlHashUpdateEntry2</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
int	<a href="#xmlHashUpdateEntry3">xmlHashUpdateEntry3</a>		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_CAST_FPTR">Macro </a>XML_CAST_FPTR</h3>
<pre class="programlisting">#define <a href="#XML_CAST_FPTR">XML_CAST_FPTR</a>(fptr);
</pre>
<p>Macro to do a casting from an object pointer to a function pointer without encountering a warning from gcc #define XML_CAST_FPTR(fptr) (*(void **)(&amp;fptr)) This macro violated ISO C aliasing rules (gcc4 on s390 broke) so it is disabled now</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>fptr</tt></i>:</span></td>
<td>pointer to a function</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashTable">Structure </a>xmlHashTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlHashTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashTablePtr">Typedef </a>xmlHashTablePtr</h3>
<pre class="programlisting"><a href="libxml2-hash.html#xmlHashTable">xmlHashTable</a> * xmlHashTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashCopier"></a>Function type xmlHashCopier</h3>
<pre class="programlisting">void *	xmlHashCopier			(void * payload, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Callback to copy data from a hash.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>payload</tt></i>:</span></td>
<td>the data in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name associated</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a copy of the data or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashDeallocator"></a>Function type xmlHashDeallocator</h3>
<pre class="programlisting">void	xmlHashDeallocator		(void * payload, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Callback to free data from a hash.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>payload</tt></i>:</span></td>
<td>the data in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name associated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScanner"></a>Function type xmlHashScanner</h3>
<pre class="programlisting">void	xmlHashScanner			(void * payload, <br>					 void * data, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Callback when scanning data in a hash with the simple scanner.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>payload</tt></i>:</span></td>
<td>the data in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra scanner data</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name associated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScannerFull"></a>Function type xmlHashScannerFull</h3>
<pre class="programlisting">void	xmlHashScannerFull		(void * payload, <br>					 void * data, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3)<br>
</pre>
<p>Callback when scanning data in a hash with the full scanner.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>payload</tt></i>:</span></td>
<td>the data in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra scanner data</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name associated</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>the second name associated</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>the third name associated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashAddEntry"></a>xmlHashAddEntry ()</h3>
<pre class="programlisting">int	xmlHashAddEntry			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 void * userdata)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the @name. Duplicate names generate errors.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashAddEntry2"></a>xmlHashAddEntry2 ()</h3>
<pre class="programlisting">int	xmlHashAddEntry2		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 void * userdata)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Duplicate tuples generate errors.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashAddEntry3"></a>xmlHashAddEntry3 ()</h3>
<pre class="programlisting">int	xmlHashAddEntry3		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 void * userdata)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Duplicate entries generate errors.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashCopy"></a>xmlHashCopy ()</h3>
<pre class="programlisting"><a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	xmlHashCopy		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashCopier">xmlHashCopier</a> f)<br>
</pre>
<p>Scan the hash @table and applied @f to each value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the copier function for items in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new table or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashCreate"></a>xmlHashCreate ()</h3>
<pre class="programlisting"><a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	xmlHashCreate		(int size)<br>
</pre>
<p>Create a new xmlHashTablePtr.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object, or NULL if an error occurred.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashCreateDict"></a>xmlHashCreateDict ()</h3>
<pre class="programlisting"><a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	xmlHashCreateDict	(int size, <br>					 <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a> dict)<br>
</pre>
<p>Create a new <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> which will use @dict as the internal dictionary</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>dict</tt></i>:</span></td>
<td>a dictionary to use for the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object, or NULL if an error occurred.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashDefaultDeallocator"></a>xmlHashDefaultDeallocator ()</h3>
<pre class="programlisting">void	xmlHashDefaultDeallocator	(void * entry, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Free a hash table entry with xmlFree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>entry</tt></i>:</span></td>
<td>the hash table entry</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entry's name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashFree"></a>xmlHashFree ()</h3>
<pre class="programlisting">void	xmlHashFree			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Free the hash @table and its contents. The userdata is deallocated with @f if provided.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for items in the hash</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashLookup"></a>xmlHashLookup ()</h3>
<pre class="programlisting">void *	xmlHashLookup			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Find the userdata specified by the @name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashLookup2"></a>xmlHashLookup2 ()</h3>
<pre class="programlisting">void *	xmlHashLookup2			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2)<br>
</pre>
<p>Find the userdata specified by the (@name, @name2) tuple.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashLookup3"></a>xmlHashLookup3 ()</h3>
<pre class="programlisting">void *	xmlHashLookup3			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3)<br>
</pre>
<p>Find the userdata specified by the (@name, @name2, @name3) tuple.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the a pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashQLookup"></a>xmlHashQLookup ()</h3>
<pre class="programlisting">void *	xmlHashQLookup			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Find the userdata specified by the QName @prefix:@name/@name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashQLookup2"></a>xmlHashQLookup2 ()</h3>
<pre class="programlisting">void *	xmlHashQLookup2			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2)<br>
</pre>
<p>Find the userdata specified by the QNames tuple</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix2</tt></i>:</span></td>
<td>the second prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashQLookup3"></a>xmlHashQLookup3 ()</h3>
<pre class="programlisting">void *	xmlHashQLookup3			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix3, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3)<br>
</pre>
<p>Find the userdata specified by the (@name, @name2, @name3) tuple.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix2</tt></i>:</span></td>
<td>the second prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix3</tt></i>:</span></td>
<td>the third prefix of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the a pointer to the userdata</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashRemoveEntry"></a>xmlHashRemoveEntry ()</h3>
<pre class="programlisting">int	xmlHashRemoveEntry		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Find the userdata specified by the @name and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for removed item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the removal succeeded and -1 in case of error or not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashRemoveEntry2"></a>xmlHashRemoveEntry2 ()</h3>
<pre class="programlisting">int	xmlHashRemoveEntry2		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Find the userdata specified by the (@name, @name2) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for removed item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the removal succeeded and -1 in case of error or not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashRemoveEntry3"></a>xmlHashRemoveEntry3 ()</h3>
<pre class="programlisting">int	xmlHashRemoveEntry3		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Find the userdata specified by the (@name, @name2, @name3) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for removed item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the removal succeeded and -1 in case of error or not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScan"></a>xmlHashScan ()</h3>
<pre class="programlisting">void	xmlHashScan			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashScanner">xmlHashScanner</a> f, <br>					 void * data)<br>
</pre>
<p>Scan the hash @table and applied @f to each value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the scanner function for items in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra data passed to f</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScan3"></a>xmlHashScan3 ()</h3>
<pre class="programlisting">void	xmlHashScan3			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashScanner">xmlHashScanner</a> f, <br>					 void * data)<br>
</pre>
<p>Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the scanner function for items in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra data passed to f</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScanFull"></a>xmlHashScanFull ()</h3>
<pre class="programlisting">void	xmlHashScanFull			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 <a href="libxml2-hash.html#xmlHashScannerFull">xmlHashScannerFull</a> f, <br>					 void * data)<br>
</pre>
<p>Scan the hash @table and applied @f to each value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the scanner function for items in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra data passed to f</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashScanFull3"></a>xmlHashScanFull3 ()</h3>
<pre class="programlisting">void	xmlHashScanFull3		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 <a href="libxml2-hash.html#xmlHashScannerFull">xmlHashScannerFull</a> f, <br>					 void * data)<br>
</pre>
<p>Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the scanner function for items in the hash</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>extra data passed to f</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashSize"></a>xmlHashSize ()</h3>
<pre class="programlisting">int	xmlHashSize			(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table)<br>
</pre>
<p>Query the number of elements installed in the hash @table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of elements in the hash table or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashUpdateEntry"></a>xmlHashUpdateEntry ()</h3>
<pre class="programlisting">int	xmlHashUpdateEntry		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the @name. Existing entry for this @name will be removed and freed with @f if found.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for replaced item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashUpdateEntry2"></a>xmlHashUpdateEntry2 ()</h3>
<pre class="programlisting">int	xmlHashUpdateEntry2		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Existing entry for this tuple will be removed and freed with @f if found.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for replaced item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlHashUpdateEntry3"></a>xmlHashUpdateEntry3 ()</h3>
<pre class="programlisting">int	xmlHashUpdateEntry3		(<a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a> table, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name2, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name3, <br>					 void * userdata, <br>					 <a href="libxml2-hash.html#xmlHashDeallocator">xmlHashDeallocator</a> f)<br>
</pre>
<p>Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Existing entry for this tuple will be removed and freed with @f if found.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>the hash table</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name2</tt></i>:</span></td>
<td>a second name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>name3</tt></i>:</span></td>
<td>a third name of the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>userdata</tt></i>:</span></td>
<td>a pointer to the userdata</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the deallocator function for replaced item (if any)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 the addition succeeded and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-nanohttp.html000064400000037534151730335330014520 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>nanohttp: minimal HTTP implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-nanoftp.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-parser.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">nanohttp</span></h2>
<p>nanohttp - minimal HTTP implementation</p>
<p>minimal HTTP implementation allowing to fetch resources like external subset. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">const char *	<a href="#xmlNanoHTTPAuthHeader">xmlNanoHTTPAuthHeader</a>	(void * ctx);
void	<a href="#xmlNanoHTTPCleanup">xmlNanoHTTPCleanup</a>		(void);
void	<a href="#xmlNanoHTTPClose">xmlNanoHTTPClose</a>		(void * ctx);
int	<a href="#xmlNanoHTTPContentLength">xmlNanoHTTPContentLength</a>	(void * ctx);
const char *	<a href="#xmlNanoHTTPEncoding">xmlNanoHTTPEncoding</a>	(void * ctx);
int	<a href="#xmlNanoHTTPFetch">xmlNanoHTTPFetch</a>		(const char * URL, <br>					 const char * filename, <br>					 char ** contentType);
void	<a href="#xmlNanoHTTPInit">xmlNanoHTTPInit</a>			(void);
void *	<a href="#xmlNanoHTTPMethod">xmlNanoHTTPMethod</a>		(const char * URL, <br>					 const char * method, <br>					 const char * input, <br>					 char ** contentType, <br>					 const char * headers, <br>					 int ilen);
void *	<a href="#xmlNanoHTTPMethodRedir">xmlNanoHTTPMethodRedir</a>		(const char * URL, <br>					 const char * method, <br>					 const char * input, <br>					 char ** contentType, <br>					 char ** redir, <br>					 const char * headers, <br>					 int ilen);
const char *	<a href="#xmlNanoHTTPMimeType">xmlNanoHTTPMimeType</a>	(void * ctx);
void *	<a href="#xmlNanoHTTPOpen">xmlNanoHTTPOpen</a>			(const char * URL, <br>					 char ** contentType);
void *	<a href="#xmlNanoHTTPOpenRedir">xmlNanoHTTPOpenRedir</a>		(const char * URL, <br>					 char ** contentType, <br>					 char ** redir);
int	<a href="#xmlNanoHTTPRead">xmlNanoHTTPRead</a>			(void * ctx, <br>					 void * dest, <br>					 int len);
const char *	<a href="#xmlNanoHTTPRedir">xmlNanoHTTPRedir</a>	(void * ctx);
int	<a href="#xmlNanoHTTPReturnCode">xmlNanoHTTPReturnCode</a>		(void * ctx);
int	<a href="#xmlNanoHTTPSave">xmlNanoHTTPSave</a>			(void * ctxt, <br>					 const char * filename);
void	<a href="#xmlNanoHTTPScanProxy">xmlNanoHTTPScanProxy</a>		(const char * URL);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPAuthHeader"></a>xmlNanoHTTPAuthHeader ()</h3>
<pre class="programlisting">const char *	xmlNanoHTTPAuthHeader	(void * ctx)<br>
</pre>
<p>Get the authentication header of an HTTP context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the stashed value of the WWW-Authenticate or Proxy-Authenticate header.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPCleanup"></a>xmlNanoHTTPCleanup ()</h3>
<pre class="programlisting">void	xmlNanoHTTPCleanup		(void)<br>
</pre>
<p>Cleanup the HTTP protocol layer.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPClose"></a>xmlNanoHTTPClose ()</h3>
<pre class="programlisting">void	xmlNanoHTTPClose		(void * ctx)<br>
</pre>
<p>This function closes an HTTP context, it ends up the connection and free all data related to it.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPContentLength"></a>xmlNanoHTTPContentLength ()</h3>
<pre class="programlisting">int	xmlNanoHTTPContentLength	(void * ctx)<br>
</pre>
<p>Provides the specified content length from the HTTP header.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the specified content length from the HTTP header. Note that a value of -1 indicates that the content length element was not included in the response header.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPEncoding"></a>xmlNanoHTTPEncoding ()</h3>
<pre class="programlisting">const char *	xmlNanoHTTPEncoding	(void * ctx)<br>
</pre>
<p>Provides the specified encoding if specified in the HTTP headers.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the specified encoding or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPFetch"></a>xmlNanoHTTPFetch ()</h3>
<pre class="programlisting">int	xmlNanoHTTPFetch		(const char * URL, <br>					 const char * filename, <br>					 char ** contentType)<br>
</pre>
<p>This function try to fetch the indicated resource via HTTP GET and save it's content in the file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename where the content should be saved</td>
</tr>
<tr>
<td><span class="term"><i><tt>contentType</tt></i>:</span></td>
<td>if available the Content-Type information will be returned at that location</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of failure, 0 in case of success. The contentType, if provided must be freed by the caller</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPInit"></a>xmlNanoHTTPInit ()</h3>
<pre class="programlisting">void	xmlNanoHTTPInit			(void)<br>
</pre>
<p>Initialize the HTTP protocol layer. Currently it just checks for proxy information</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPMethod"></a>xmlNanoHTTPMethod ()</h3>
<pre class="programlisting">void *	xmlNanoHTTPMethod		(const char * URL, <br>					 const char * method, <br>					 const char * input, <br>					 char ** contentType, <br>					 const char * headers, <br>					 int ilen)<br>
</pre>
<p>This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>method</tt></i>:</span></td>
<td>the HTTP method to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the input string if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>contentType</tt></i>:</span></td>
<td>the Content-Type information IN and OUT</td>
</tr>
<tr>
<td><span class="term"><i><tt>headers</tt></i>:</span></td>
<td>the extra headers</td>
</tr>
<tr>
<td><span class="term"><i><tt>ilen</tt></i>:</span></td>
<td>input length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPMethodRedir"></a>xmlNanoHTTPMethodRedir ()</h3>
<pre class="programlisting">void *	xmlNanoHTTPMethodRedir		(const char * URL, <br>					 const char * method, <br>					 const char * input, <br>					 char ** contentType, <br>					 char ** redir, <br>					 const char * headers, <br>					 int ilen)<br>
</pre>
<p>This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>method</tt></i>:</span></td>
<td>the HTTP method to use</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the input string if any</td>
</tr>
<tr>
<td><span class="term"><i><tt>contentType</tt></i>:</span></td>
<td>the Content-Type information IN and OUT</td>
</tr>
<tr>
<td><span class="term"><i><tt>redir</tt></i>:</span></td>
<td>the redirected URL OUT</td>
</tr>
<tr>
<td><span class="term"><i><tt>headers</tt></i>:</span></td>
<td>the extra headers</td>
</tr>
<tr>
<td><span class="term"><i><tt>ilen</tt></i>:</span></td>
<td>input length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL in case of failure, otherwise a request handler. The contentType, or redir, if provided must be freed by the caller</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPMimeType"></a>xmlNanoHTTPMimeType ()</h3>
<pre class="programlisting">const char *	xmlNanoHTTPMimeType	(void * ctx)<br>
</pre>
<p>Provides the specified Mime-Type if specified in the HTTP headers.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the specified Mime-Type or NULL if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPOpen"></a>xmlNanoHTTPOpen ()</h3>
<pre class="programlisting">void *	xmlNanoHTTPOpen			(const char * URL, <br>					 char ** contentType)<br>
</pre>
<p>This function try to open a connection to the indicated resource via HTTP GET.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>contentType</tt></i>:</span></td>
<td>if available the Content-Type information will be returned at that location</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPOpenRedir"></a>xmlNanoHTTPOpenRedir ()</h3>
<pre class="programlisting">void *	xmlNanoHTTPOpenRedir		(const char * URL, <br>					 char ** contentType, <br>					 char ** redir)<br>
</pre>
<p>This function try to open a connection to the indicated resource via HTTP GET.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The URL to load</td>
</tr>
<tr>
<td><span class="term"><i><tt>contentType</tt></i>:</span></td>
<td>if available the Content-Type information will be returned at that location</td>
</tr>
<tr>
<td><span class="term"><i><tt>redir</tt></i>:</span></td>
<td>if available the redirected URL will be returned</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPRead"></a>xmlNanoHTTPRead ()</h3>
<pre class="programlisting">int	xmlNanoHTTPRead			(void * ctx, <br>					 void * dest, <br>					 int len)<br>
</pre>
<p>This function tries to read @len bytes from the existing HTTP connection and saves them in @dest. This is a blocking call.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dest</tt></i>:</span></td>
<td>a buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the buffer length</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte read. 0 is an indication of an end of connection. -1 indicates a parameter error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPRedir"></a>xmlNanoHTTPRedir ()</h3>
<pre class="programlisting">const char *	xmlNanoHTTPRedir	(void * ctx)<br>
</pre>
<p>Provides the specified redirection URL if available from the HTTP header.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the specified redirection URL or NULL if not redirected.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPReturnCode"></a>xmlNanoHTTPReturnCode ()</h3>
<pre class="programlisting">int	xmlNanoHTTPReturnCode		(void * ctx)<br>
</pre>
<p>Get the latest HTTP return code received</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the HTTP return code for the request.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPSave"></a>xmlNanoHTTPSave ()</h3>
<pre class="programlisting">int	xmlNanoHTTPSave			(void * ctxt, <br>					 const char * filename)<br>
</pre>
<p>This function saves the output of the HTTP transaction to a file It closes and free the context at the end</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the HTTP context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename where the content should be saved</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of failure, 0 in case of success.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNanoHTTPScanProxy"></a>xmlNanoHTTPScanProxy ()</h3>
<pre class="programlisting">void	xmlNanoHTTPScanProxy		(const char * URL)<br>
</pre>
<p>(Re)Initialize the HTTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like http://myproxy/ or http://myproxy:3128/ A NULL URL cleans up proxy information.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>The proxy URL used to initialize the proxy context</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlreader.html000064400000322637151730335330014651 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlreader: the XMLReader implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlmodule.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlregexp.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlreader</span></h2>
<p>xmlreader - the XMLReader implementation</p>
<p>API of the XML streaming API based on C# interfaces. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef enum <a href="#xmlParserProperties">xmlParserProperties</a>;
typedef enum <a href="#xmlParserSeverities">xmlParserSeverities</a>;
typedef enum <a href="#xmlReaderTypes">xmlReaderTypes</a>;
typedef struct _xmlTextReader <a href="#xmlTextReader">xmlTextReader</a>;
typedef void * <a href="#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a>;
typedef enum <a href="#xmlTextReaderMode">xmlTextReaderMode</a>;
typedef <a href="libxml2-xmlreader.html#xmlTextReader">xmlTextReader</a> * <a href="#xmlTextReaderPtr">xmlTextReaderPtr</a>;
void	<a href="#xmlFreeTextReader">xmlFreeTextReader</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlNewTextReader">xmlNewTextReader</a>	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>						 const char * URI);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlNewTextReaderFilename">xmlNewTextReaderFilename</a>	(const char * URI);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderForDoc">xmlReaderForDoc</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderForFd">xmlReaderForFd</a>	(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderForFile">xmlReaderForFile</a>	(const char * filename, <br>						 const char * encoding, <br>						 int options);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderForIO">xmlReaderForIO</a>	(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderForMemory">xmlReaderForMemory</a>	(const char * buffer, <br>						 int size, <br>						 const char * URL, <br>						 const char * encoding, <br>						 int options);
int	<a href="#xmlReaderNewDoc">xmlReaderNewDoc</a>			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlReaderNewFd">xmlReaderNewFd</a>			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlReaderNewFile">xmlReaderNewFile</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlReaderNewIO">xmlReaderNewIO</a>			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlReaderNewMemory">xmlReaderNewMemory</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlReaderNewWalker">xmlReaderNewWalker</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	<a href="#xmlReaderWalker">xmlReaderWalker</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlTextReaderAttributeCount">xmlTextReaderAttributeCount</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderBaseUri">xmlTextReaderBaseUri</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
long	<a href="#xmlTextReaderByteConsumed">xmlTextReaderByteConsumed</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderClose">xmlTextReaderClose</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstBaseUri">xmlTextReaderConstBaseUri</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstEncoding">xmlTextReaderConstEncoding</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstLocalName">xmlTextReaderConstLocalName</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstName">xmlTextReaderConstName</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstNamespaceUri">xmlTextReaderConstNamespaceUri</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstPrefix">xmlTextReaderConstPrefix</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstString">xmlTextReaderConstString</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstValue">xmlTextReaderConstValue</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstXmlLang">xmlTextReaderConstXmlLang</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderConstXmlVersion">xmlTextReaderConstXmlVersion</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlTextReaderCurrentDoc">xmlTextReaderCurrentDoc</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlTextReaderCurrentNode">xmlTextReaderCurrentNode</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderDepth">xmlTextReaderDepth</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
typedef void <a href="#xmlTextReaderErrorFunc">xmlTextReaderErrorFunc</a>		(void * arg, <br>					 const char * msg, <br>					 <a href="libxml2-xmlreader.html#xmlParserSeverities">xmlParserSeverities</a> severity, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlTextReaderExpand">xmlTextReaderExpand</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderGetAttribute">xmlTextReaderGetAttribute</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderGetAttributeNo">xmlTextReaderGetAttributeNo</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 int no);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderGetAttributeNs">xmlTextReaderGetAttributeNs</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI);
void	<a href="#xmlTextReaderGetErrorHandler">xmlTextReaderGetErrorHandler</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderErrorFunc">xmlTextReaderErrorFunc</a> * f, <br>					 void ** arg);
int	<a href="#xmlTextReaderGetParserColumnNumber">xmlTextReaderGetParserColumnNumber</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderGetParserLineNumber">xmlTextReaderGetParserLineNumber</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderGetParserProp">xmlTextReaderGetParserProp</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int prop);
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	<a href="#xmlTextReaderGetRemainder">xmlTextReaderGetRemainder</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderHasAttributes">xmlTextReaderHasAttributes</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderHasValue">xmlTextReaderHasValue</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderIsDefault">xmlTextReaderIsDefault</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderIsEmptyElement">xmlTextReaderIsEmptyElement</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderIsNamespaceDecl">xmlTextReaderIsNamespaceDecl</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderIsValid">xmlTextReaderIsValid</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderLocalName">xmlTextReaderLocalName</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderLocatorBaseURI">xmlTextReaderLocatorBaseURI</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator);
int	<a href="#xmlTextReaderLocatorLineNumber">xmlTextReaderLocatorLineNumber</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderLookupNamespace">xmlTextReaderLookupNamespace</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
int	<a href="#xmlTextReaderMoveToAttribute">xmlTextReaderMoveToAttribute</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlTextReaderMoveToAttributeNo">xmlTextReaderMoveToAttributeNo</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int no);
int	<a href="#xmlTextReaderMoveToAttributeNs">xmlTextReaderMoveToAttributeNs</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI);
int	<a href="#xmlTextReaderMoveToElement">xmlTextReaderMoveToElement</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderMoveToFirstAttribute">xmlTextReaderMoveToFirstAttribute</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderMoveToNextAttribute">xmlTextReaderMoveToNextAttribute</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderName">xmlTextReaderName</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderNamespaceUri">xmlTextReaderNamespaceUri</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderNext">xmlTextReaderNext</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderNextSibling">xmlTextReaderNextSibling</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderNodeType">xmlTextReaderNodeType</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderNormalization">xmlTextReaderNormalization</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderPrefix">xmlTextReaderPrefix</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlTextReaderPreserve">xmlTextReaderPreserve</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderPreservePattern">xmlTextReaderPreservePattern</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pattern, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces);
int	<a href="#xmlTextReaderQuoteChar">xmlTextReaderQuoteChar</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderRead">xmlTextReaderRead</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderReadAttributeValue">xmlTextReaderReadAttributeValue</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderReadInnerXml">xmlTextReaderReadInnerXml</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderReadOuterXml">xmlTextReaderReadOuterXml</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderReadState">xmlTextReaderReadState</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderReadString">xmlTextReaderReadString</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
int	<a href="#xmlTextReaderRelaxNGSetSchema">xmlTextReaderRelaxNGSetSchema</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema);
int	<a href="#xmlTextReaderRelaxNGValidate">xmlTextReaderRelaxNGValidate</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * rng);
int	<a href="#xmlTextReaderRelaxNGValidateCtxt">xmlTextReaderRelaxNGValidateCtxt</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 <a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>						 int options);
int	<a href="#xmlTextReaderSchemaValidate">xmlTextReaderSchemaValidate</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * xsd);
int	<a href="#xmlTextReaderSchemaValidateCtxt">xmlTextReaderSchemaValidateCtxt</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 int options);
void	<a href="#xmlTextReaderSetErrorHandler">xmlTextReaderSetErrorHandler</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderErrorFunc">xmlTextReaderErrorFunc</a> f, <br>					 void * arg);
int	<a href="#xmlTextReaderSetParserProp">xmlTextReaderSetParserProp</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int prop, <br>					 int value);
int	<a href="#xmlTextReaderSetSchema">xmlTextReaderSetSchema</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema);
void	<a href="#xmlTextReaderSetStructuredErrorHandler">xmlTextReaderSetStructuredErrorHandler</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> f, <br>						 void * arg);
int	<a href="#xmlTextReaderSetup">xmlTextReaderSetup</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options);
int	<a href="#xmlTextReaderStandalone">xmlTextReaderStandalone</a>		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderValue">xmlTextReaderValue</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlTextReaderXmlLang">xmlTextReaderXmlLang</a>	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserProperties">Enum </a>xmlParserProperties</h3>
<pre class="programlisting">enum <a href="#xmlParserProperties">xmlParserProperties</a> {
    <a name="XML_PARSER_LOADDTD">XML_PARSER_LOADDTD</a> = 1
    <a name="XML_PARSER_DEFAULTATTRS">XML_PARSER_DEFAULTATTRS</a> = 2
    <a name="XML_PARSER_VALIDATE">XML_PARSER_VALIDATE</a> = 3
    <a name="XML_PARSER_SUBST_ENTITIES">XML_PARSER_SUBST_ENTITIES</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserSeverities">Enum </a>xmlParserSeverities</h3>
<pre class="programlisting">enum <a href="#xmlParserSeverities">xmlParserSeverities</a> {
    <a name="XML_PARSER_SEVERITY_VALIDITY_WARNING">XML_PARSER_SEVERITY_VALIDITY_WARNING</a> = 1
    <a name="XML_PARSER_SEVERITY_VALIDITY_ERROR">XML_PARSER_SEVERITY_VALIDITY_ERROR</a> = 2
    <a name="XML_PARSER_SEVERITY_WARNING">XML_PARSER_SEVERITY_WARNING</a> = 3
    <a name="XML_PARSER_SEVERITY_ERROR">XML_PARSER_SEVERITY_ERROR</a> = 4
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderTypes">Enum </a>xmlReaderTypes</h3>
<pre class="programlisting">enum <a href="#xmlReaderTypes">xmlReaderTypes</a> {
    <a name="XML_READER_TYPE_NONE">XML_READER_TYPE_NONE</a> = 0
    <a name="XML_READER_TYPE_ELEMENT">XML_READER_TYPE_ELEMENT</a> = 1
    <a name="XML_READER_TYPE_ATTRIBUTE">XML_READER_TYPE_ATTRIBUTE</a> = 2
    <a name="XML_READER_TYPE_TEXT">XML_READER_TYPE_TEXT</a> = 3
    <a name="XML_READER_TYPE_CDATA">XML_READER_TYPE_CDATA</a> = 4
    <a name="XML_READER_TYPE_ENTITY_REFERENCE">XML_READER_TYPE_ENTITY_REFERENCE</a> = 5
    <a name="XML_READER_TYPE_ENTITY">XML_READER_TYPE_ENTITY</a> = 6
    <a name="XML_READER_TYPE_PROCESSING_INSTRUCTION">XML_READER_TYPE_PROCESSING_INSTRUCTION</a> = 7
    <a name="XML_READER_TYPE_COMMENT">XML_READER_TYPE_COMMENT</a> = 8
    <a name="XML_READER_TYPE_DOCUMENT">XML_READER_TYPE_DOCUMENT</a> = 9
    <a name="XML_READER_TYPE_DOCUMENT_TYPE">XML_READER_TYPE_DOCUMENT_TYPE</a> = 10
    <a name="XML_READER_TYPE_DOCUMENT_FRAGMENT">XML_READER_TYPE_DOCUMENT_FRAGMENT</a> = 11
    <a name="XML_READER_TYPE_NOTATION">XML_READER_TYPE_NOTATION</a> = 12
    <a name="XML_READER_TYPE_WHITESPACE">XML_READER_TYPE_WHITESPACE</a> = 13
    <a name="XML_READER_TYPE_SIGNIFICANT_WHITESPACE">XML_READER_TYPE_SIGNIFICANT_WHITESPACE</a> = 14
    <a name="XML_READER_TYPE_END_ELEMENT">XML_READER_TYPE_END_ELEMENT</a> = 15
    <a name="XML_READER_TYPE_END_ENTITY">XML_READER_TYPE_END_ENTITY</a> = 16
    <a name="XML_READER_TYPE_XML_DECLARATION">XML_READER_TYPE_XML_DECLARATION</a> = 17
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReader">Structure </a>xmlTextReader</h3>
<pre class="programlisting">struct _xmlTextReader {
The content of this structure is not made public by the API.
} xmlTextReader;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderLocatorPtr">Typedef </a>xmlTextReaderLocatorPtr</h3>
<pre class="programlisting">void * xmlTextReaderLocatorPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMode">Enum </a>xmlTextReaderMode</h3>
<pre class="programlisting">enum <a href="#xmlTextReaderMode">xmlTextReaderMode</a> {
    <a name="XML_TEXTREADER_MODE_INITIAL">XML_TEXTREADER_MODE_INITIAL</a> = 0
    <a name="XML_TEXTREADER_MODE_INTERACTIVE">XML_TEXTREADER_MODE_INTERACTIVE</a> = 1
    <a name="XML_TEXTREADER_MODE_ERROR">XML_TEXTREADER_MODE_ERROR</a> = 2
    <a name="XML_TEXTREADER_MODE_EOF">XML_TEXTREADER_MODE_EOF</a> = 3
    <a name="XML_TEXTREADER_MODE_CLOSED">XML_TEXTREADER_MODE_CLOSED</a> = 4
    <a name="XML_TEXTREADER_MODE_READING">XML_TEXTREADER_MODE_READING</a> = 5
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderPtr">Typedef </a>xmlTextReaderPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReader">xmlTextReader</a> * xmlTextReaderPtr;
</pre>
<p>Pointer to an xmlReader context.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderErrorFunc"></a>Function type xmlTextReaderErrorFunc</h3>
<pre class="programlisting">void	xmlTextReaderErrorFunc		(void * arg, <br>					 const char * msg, <br>					 <a href="libxml2-xmlreader.html#xmlParserSeverities">xmlParserSeverities</a> severity, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator)<br>
</pre>
<p>Signature of an error callback from a reader parser</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>the user argument</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>severity</tt></i>:</span></td>
<td>the severity of the error</td>
</tr>
<tr>
<td><span class="term"><i><tt>locator</tt></i>:</span></td>
<td>a locator indicating where the error occurred</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeTextReader"></a>xmlFreeTextReader ()</h3>
<pre class="programlisting">void	xmlFreeTextReader		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Deallocate all the resources associated to the reader</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>
</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextReader"></a>xmlNewTextReader ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlNewTextReader	(<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>						 const char * URI)<br>
</pre>
<p>Create an <a href="libxml2-xmlreader.html#xmlTextReader">xmlTextReader</a> structure fed with @input</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> used to read data</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI information for the source if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewTextReaderFilename"></a>xmlNewTextReaderFilename ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlNewTextReaderFilename	(const char * URI)<br>
</pre>
<p>Create an <a href="libxml2-xmlreader.html#xmlTextReader">xmlTextReader</a> structure fed with the resource at @URI</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI of the resource to process</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderForDoc"></a>xmlReaderForDoc ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderForDoc	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderForFd"></a>xmlReaderForFd ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderForFd	(int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create an xmltextReader for an XML from a file descriptor. The parsing flags @options are a combination of xmlParserOption. NOTE that the file descriptor will not be closed when the reader is closed or reset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderForFile"></a>xmlReaderForFile ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderForFile	(const char * filename, <br>						 const char * encoding, <br>						 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderForIO"></a>xmlReaderForIO ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderForIO	(<a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Create an xmltextReader for an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderForMemory"></a>xmlReaderForMemory ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderForMemory	(const char * buffer, <br>						 int size, <br>						 const char * URL, <br>						 const char * encoding, <br>						 int options)<br>
</pre>
<p>Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewDoc"></a>xmlReaderNewDoc ()</h3>
<pre class="programlisting">int	xmlReaderNewDoc			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * cur, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>a pointer to a zero terminated string</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewFd"></a>xmlReaderNewFd ()</h3>
<pre class="programlisting">int	xmlReaderNewFd			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int fd, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Setup an xmltextReader to parse an XML from a file descriptor. NOTE that the file descriptor will not be closed when the reader is closed or reset. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>fd</tt></i>:</span></td>
<td>an open file descriptor</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewFile"></a>xmlReaderNewFile ()</h3>
<pre class="programlisting">int	xmlReaderNewFile		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * filename, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file or URL</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewIO"></a>xmlReaderNewIO ()</h3>
<pre class="programlisting">int	xmlReaderNewIO			(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlIO.html#xmlInputReadCallback">xmlInputReadCallback</a> ioread, <br>					 <a href="libxml2-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a> ioclose, <br>					 void * ioctx, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Setup an xmltextReader to parse an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioread</tt></i>:</span></td>
<td>an I/O read function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioclose</tt></i>:</span></td>
<td>an I/O close function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ioctx</tt></i>:</span></td>
<td>an I/O handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewMemory"></a>xmlReaderNewMemory ()</h3>
<pre class="programlisting">int	xmlReaderNewMemory		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * buffer, <br>					 int size, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderNewWalker"></a>xmlReaderNewWalker ()</h3>
<pre class="programlisting">int	xmlReaderNewWalker		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Setup an xmltextReader to parse a preparsed XML document. This reuses the existing @reader xmlTextReader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a preparsed document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlReaderWalker"></a>xmlReaderWalker ()</h3>
<pre class="programlisting"><a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a>	xmlReaderWalker	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Create an xmltextReader for a preparsed document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a preparsed document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new reader or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderAttributeCount"></a>xmlTextReaderAttributeCount ()</h3>
<pre class="programlisting">int	xmlTextReaderAttributeCount	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Provides the number of attributes of the current node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 i no attributes, -1 in case of error or the <a href="libxml2-SAX.html#attribute">attribute</a> count</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderBaseUri"></a>xmlTextReaderBaseUri ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderBaseUri	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The base URI of the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the base URI or NULL if not available, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderByteConsumed"></a>xmlTextReaderByteConsumed ()</h3>
<pre class="programlisting">long	xmlTextReaderByteConsumed	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>This function provides the current index of the parser used by the reader, relative to the start of the current entity. This function actually just wraps a call to xmlBytesConsumed() for the parser context associated with the reader. See xmlBytesConsumed() for more information.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the index in bytes from the beginning of the entity or -1 in case the index could not be computed.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderClose"></a>xmlTextReaderClose ()</h3>
<pre class="programlisting">int	xmlTextReaderClose		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstBaseUri"></a>xmlTextReaderConstBaseUri ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstBaseUri	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The base URI of the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the base URI or NULL if not available, the string will be deallocated with the reader</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstEncoding"></a>xmlTextReaderConstEncoding ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstEncoding	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Determine the encoding of the document being read.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the encoding of the document or NULL in case of error. The string is deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstLocalName"></a>xmlTextReaderConstLocalName ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstLocalName	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The local name of the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local name or NULL if not available, the string will be deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstName"></a>xmlTextReaderConstName ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstName	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The qualified name of the node, equal to Prefix :LocalName.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local name or NULL if not available, the string is deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstNamespaceUri"></a>xmlTextReaderConstNamespaceUri ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstNamespaceUri	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The URI defining the namespace associated with the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace URI or NULL if not available, the string will be deallocated with the reader</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstPrefix"></a>xmlTextReaderConstPrefix ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstPrefix	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>A shorthand <a href="libxml2-SAX.html#reference">reference</a> to the namespace associated with the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the prefix or NULL if not available, the string is deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstString"></a>xmlTextReaderConstString ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstString	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Get an interned string from the reader, allows for example to speedup string name comparisons</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string to intern.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an interned copy of the string or NULL in case of error. The string will be deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstValue"></a>xmlTextReaderConstValue ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstValue	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Provides the text value of the node if present</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string or NULL if not available. The result will be deallocated on the next Read() operation.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstXmlLang"></a>xmlTextReaderConstXmlLang ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstXmlLang	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The xml:lang scope within which the node resides.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the xml:lang value or NULL if none exists.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderConstXmlVersion"></a>xmlTextReaderConstXmlVersion ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderConstXmlVersion	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Determine the XML version of the document being read.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the XML version of the document or NULL in case of error. The string is deallocated with the reader.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderCurrentDoc"></a>xmlTextReaderCurrentDoc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlTextReaderCurrentDoc	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Hacking interface allowing to get the <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> corresponding to the current document being accessed by the xmlTextReader. NOTE: as a result of this call, the reader will not destroy the associated XML document and calling xmlFreeDoc() on the result is needed once the reader parsing has finished.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderCurrentNode"></a>xmlTextReaderCurrentNode ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlTextReaderCurrentNode	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Hacking interface allowing to get the <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> corresponding to the current node being accessed by the xmlTextReader. This is dangerous because the underlying node may be destroyed on the next Reads.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderDepth"></a>xmlTextReaderDepth ()</h3>
<pre class="programlisting">int	xmlTextReaderDepth		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The depth of the node in the tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the depth or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderExpand"></a>xmlTextReaderExpand ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlTextReaderExpand	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Reads the contents of the current node and the full subtree. It then makes the subtree available until the next xmlTextReaderRead() call</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a node pointer valid until the next xmlTextReaderRead() call or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetAttribute"></a>xmlTextReaderGetAttribute ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderGetAttribute	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Provides the value of the <a href="libxml2-SAX.html#attribute">attribute</a> with the specified qualified name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the qualified name of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetAttributeNo"></a>xmlTextReaderGetAttributeNo ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderGetAttributeNo	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 int no)<br>
</pre>
<p>Provides the value of the <a href="libxml2-SAX.html#attribute">attribute</a> with the specified index relative to the containing element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>no</tt></i>:</span></td>
<td>the zero-based index of the <a href="libxml2-SAX.html#attribute">attribute</a> relative to the containing element</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetAttributeNs"></a>xmlTextReaderGetAttributeNs ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderGetAttributeNs	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI)<br>
</pre>
<p>Provides the value of the specified <a href="libxml2-SAX.html#attribute">attribute</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>localName</tt></i>:</span></td>
<td>the local name of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>the namespace URI of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetErrorHandler"></a>xmlTextReaderGetErrorHandler ()</h3>
<pre class="programlisting">void	xmlTextReaderGetErrorHandler	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderErrorFunc">xmlTextReaderErrorFunc</a> * f, <br>					 void ** arg)<br>
</pre>
<p>Retrieve the error callback function and user argument.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the callback function or NULL is no callback has been registered</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>a user argument</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetParserColumnNumber"></a>xmlTextReaderGetParserColumnNumber ()</h3>
<pre class="programlisting">int	xmlTextReaderGetParserColumnNumber	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Provide the column number of the current parsing point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the user data (XML reader context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int or 0 if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetParserLineNumber"></a>xmlTextReaderGetParserLineNumber ()</h3>
<pre class="programlisting">int	xmlTextReaderGetParserLineNumber	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Provide the line number of the current parsing point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the user data (XML reader context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int or 0 if not available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetParserProp"></a>xmlTextReaderGetParserProp ()</h3>
<pre class="programlisting">int	xmlTextReaderGetParserProp	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int prop)<br>
</pre>
<p>Read the parser internal property.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>prop</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlParserProperties">xmlParserProperties</a> to get</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the value, usually 0 or 1, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderGetRemainder"></a>xmlTextReaderGetRemainder ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a>	xmlTextReaderGetRemainder	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Method to get the remainder of the buffered XML. this method stops the parser, set its state to End Of File and return the input stream with what is left that the parser did not use. The implementation is not good, the parser certainly progressed past what's left in reader-&gt;input, and there is an allocation problem. Best would be to rewrite it differently.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> attached to the XML or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderHasAttributes"></a>xmlTextReaderHasAttributes ()</h3>
<pre class="programlisting">int	xmlTextReaderHasAttributes	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Whether the node has attributes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false, and -1 in case or error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderHasValue"></a>xmlTextReaderHasValue ()</h3>
<pre class="programlisting">int	xmlTextReaderHasValue		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Whether the node can have a text value.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true, 0 if false, and -1 in case or error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderIsDefault"></a>xmlTextReaderIsDefault ()</h3>
<pre class="programlisting">int	xmlTextReaderIsDefault		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Whether an Attribute node was generated from the default value defined in the DTD or schema.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if not defaulted, 1 if defaulted, and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderIsEmptyElement"></a>xmlTextReaderIsEmptyElement ()</h3>
<pre class="programlisting">int	xmlTextReaderIsEmptyElement	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Check if the current node is empty</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if empty, 0 if not and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderIsNamespaceDecl"></a>xmlTextReaderIsNamespaceDecl ()</h3>
<pre class="programlisting">int	xmlTextReaderIsNamespaceDecl	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Determine whether the current node is a namespace declaration rather than a regular attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the current node is a namespace declaration, 0 if it is a regular <a href="libxml2-SAX.html#attribute">attribute</a> or other type of node, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderIsValid"></a>xmlTextReaderIsValid ()</h3>
<pre class="programlisting">int	xmlTextReaderIsValid		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Retrieve the validity status from the parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the flag value 1 if valid, 0 if no, and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderLocalName"></a>xmlTextReaderLocalName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderLocalName	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The local name of the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local name or NULL if not available, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderLocatorBaseURI"></a>xmlTextReaderLocatorBaseURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderLocatorBaseURI	(<a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator)<br>
</pre>
<p>Obtain the base URI for the given locator.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>locator</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the base URI or NULL in case of error, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderLocatorLineNumber"></a>xmlTextReaderLocatorLineNumber ()</h3>
<pre class="programlisting">int	xmlTextReaderLocatorLineNumber	(<a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> locator)<br>
</pre>
<p>Obtain the line number for the given locator.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>locator</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderLocatorPtr">xmlTextReaderLocatorPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the line number or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderLookupNamespace"></a>xmlTextReaderLookupNamespace ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderLookupNamespace	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Resolves a namespace prefix in the scope of the current element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the prefix whose namespace URI is to be resolved. To return the default namespace, specify NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the namespace URI to which the prefix maps or NULL in case of error. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToAttribute"></a>xmlTextReaderMoveToAttribute ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToAttribute	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Moves the position of the current instance to the <a href="libxml2-SAX.html#attribute">attribute</a> with the specified qualified name.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the qualified name of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToAttributeNo"></a>xmlTextReaderMoveToAttributeNo ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToAttributeNo	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int no)<br>
</pre>
<p>Moves the position of the current instance to the <a href="libxml2-SAX.html#attribute">attribute</a> with the specified index relative to the containing element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>no</tt></i>:</span></td>
<td>the zero-based index of the <a href="libxml2-SAX.html#attribute">attribute</a> relative to the containing element.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToAttributeNs"></a>xmlTextReaderMoveToAttributeNs ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToAttributeNs	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localName, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespaceURI)<br>
</pre>
<p>Moves the position of the current instance to the <a href="libxml2-SAX.html#attribute">attribute</a> with the specified local name and namespace URI.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>localName</tt></i>:</span></td>
<td>the local name of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaceURI</tt></i>:</span></td>
<td>the namespace URI of the attribute.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToElement"></a>xmlTextReaderMoveToElement ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToElement	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Moves the position of the current instance to the node that contains the current Attribute node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not moved</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToFirstAttribute"></a>xmlTextReaderMoveToFirstAttribute ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToFirstAttribute	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Moves the position of the current instance to the first <a href="libxml2-SAX.html#attribute">attribute</a> associated with the current node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderMoveToNextAttribute"></a>xmlTextReaderMoveToNextAttribute ()</h3>
<pre class="programlisting">int	xmlTextReaderMoveToNextAttribute	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Moves the position of the current instance to the next <a href="libxml2-SAX.html#attribute">attribute</a> associated with the current node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, -1 in case of error, 0 if not found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderName"></a>xmlTextReaderName ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderName	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The qualified name of the node, equal to Prefix :LocalName.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local name or NULL if not available, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderNamespaceUri"></a>xmlTextReaderNamespaceUri ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderNamespaceUri	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The URI defining the namespace associated with the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the namespace URI or NULL if not available, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderNext"></a>xmlTextReaderNext ()</h3>
<pre class="programlisting">int	xmlTextReaderNext		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Skip to the node following the current one in document order while avoiding the subtree if any.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderNextSibling"></a>xmlTextReaderNextSibling ()</h3>
<pre class="programlisting">int	xmlTextReaderNextSibling	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Skip to the node following the current one in document order while avoiding the subtree if any. Currently implemented only for Readers built on a document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderNodeType"></a>xmlTextReaderNodeType ()</h3>
<pre class="programlisting">int	xmlTextReaderNodeType		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Get the node type of the current node Reference: http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlReaderTypes">xmlReaderTypes</a> of the current node or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderNormalization"></a>xmlTextReaderNormalization ()</h3>
<pre class="programlisting">int	xmlTextReaderNormalization	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The value indicating whether to normalize white space and <a href="libxml2-SAX.html#attribute">attribute</a> values. Since <a href="libxml2-SAX.html#attribute">attribute</a> value and end of line normalizations are a MUST in the XML specification only the value true is accepted. The broken behaviour of accepting out of range character entities like &amp;#0; is of course not supported either.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderPrefix"></a>xmlTextReaderPrefix ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderPrefix	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>A shorthand <a href="libxml2-SAX.html#reference">reference</a> to the namespace associated with the node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the prefix or NULL if not available, if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderPreserve"></a>xmlTextReaderPreserve ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlTextReaderPreserve	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>This tells the XML Reader to preserve the current node. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderPreservePattern"></a>xmlTextReaderPreservePattern ()</h3>
<pre class="programlisting">int	xmlTextReaderPreservePattern	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pattern, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces)<br>
</pre>
<p>This tells the XML Reader to preserve all nodes matched by the pattern. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>pattern</tt></i>:</span></td>
<td>an XPath subset pattern</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaces</tt></i>:</span></td>
<td>the prefix definitions, array of [URI, prefix] or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a non-negative number in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderQuoteChar"></a>xmlTextReaderQuoteChar ()</h3>
<pre class="programlisting">int	xmlTextReaderQuoteChar		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The quotation mark character used to enclose the value of an attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>" or ' and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderRead"></a>xmlTextReaderRead ()</h3>
<pre class="programlisting">int	xmlTextReaderRead		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Moves the position of the current instance to the next node in the stream, exposing its properties.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderReadAttributeValue"></a>xmlTextReaderReadAttributeValue ()</h3>
<pre class="programlisting">int	xmlTextReaderReadAttributeValue	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Parses an <a href="libxml2-SAX.html#attribute">attribute</a> value into one or more Text and EntityReference nodes.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, 0 if the reader was not positioned on an <a href="libxml2-SAX.html#attribute">attribute</a> node or all the <a href="libxml2-SAX.html#attribute">attribute</a> values have been read, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderReadInnerXml"></a>xmlTextReaderReadInnerXml ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderReadInnerXml	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Reads the contents of the current node, including child nodes and markup.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the XML content, or NULL if the current node is neither an element nor attribute, or has no child nodes. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderReadOuterXml"></a>xmlTextReaderReadOuterXml ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderReadOuterXml	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Reads the contents of the current node, including child nodes and markup.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the node and any XML content, or NULL if the current node cannot be serialized. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderReadState"></a>xmlTextReaderReadState ()</h3>
<pre class="programlisting">int	xmlTextReaderReadState		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Gets the read state of the reader.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the state value, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderReadString"></a>xmlTextReaderReadString ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderReadString	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Reads the contents of an element or a text node as a string.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string containing the contents of the Element or Text node, or NULL if the reader is positioned on any other type of node. The string must be deallocated by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderRelaxNGSetSchema"></a>xmlTextReaderRelaxNGSetSchema ()</h3>
<pre class="programlisting">int	xmlTextReaderRelaxNGSetSchema	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-relaxng.html#xmlRelaxNGPtr">xmlRelaxNGPtr</a> schema)<br>
</pre>
<p>Use RelaxNG to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then RelaxNG validation is deactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a precompiled RelaxNG schema</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the RelaxNG validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderRelaxNGValidate"></a>xmlTextReaderRelaxNGValidate ()</h3>
<pre class="programlisting">int	xmlTextReaderRelaxNGValidate	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * rng)<br>
</pre>
<p>Use RelaxNG schema to validate the document as it is processed. Activation is only possible before the first Read(). If @rng is NULL, then RelaxNG schema validation is deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>rng</tt></i>:</span></td>
<td>the path to a RelaxNG schema or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the schemas validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderRelaxNGValidateCtxt"></a>xmlTextReaderRelaxNGValidateCtxt ()</h3>
<pre class="programlisting">int	xmlTextReaderRelaxNGValidateCtxt	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 <a href="libxml2-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br>						 int options)<br>
</pre>
<p>Use RelaxNG schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then RelaxNG schema validation is deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the RelaxNG schema validation context or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>options (not used yet)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the schemas validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSchemaValidate"></a>xmlTextReaderSchemaValidate ()</h3>
<pre class="programlisting">int	xmlTextReaderSchemaValidate	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 const char * xsd)<br>
</pre>
<p>Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). If @xsd is NULL, then XML Schema validation is deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>xsd</tt></i>:</span></td>
<td>the path to a W3C XSD schema or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the schemas validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSchemaValidateCtxt"></a>xmlTextReaderSchemaValidateCtxt ()</h3>
<pre class="programlisting">int	xmlTextReaderSchemaValidateCtxt	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 int options)<br>
</pre>
<p>Use W3C XSD schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then XML Schema validation is deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XML Schema validation context or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>options (not used yet)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the schemas validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSetErrorHandler"></a>xmlTextReaderSetErrorHandler ()</h3>
<pre class="programlisting">void	xmlTextReaderSetErrorHandler	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlreader.html#xmlTextReaderErrorFunc">xmlTextReaderErrorFunc</a> f, <br>					 void * arg)<br>
</pre>
<p>Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the callback function to call on error and warnings</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>a user argument to pass to the callback function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSetParserProp"></a>xmlTextReaderSetParserProp ()</h3>
<pre class="programlisting">int	xmlTextReaderSetParserProp	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 int prop, <br>					 int value)<br>
</pre>
<p>Change the parser processing behaviour by changing some of its internal properties. Note that some properties can only be changed before any read has been done.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>prop</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlParserProperties">xmlParserProperties</a> to set</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>usually 0 or 1 to (de)activate it</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the call was successful, or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSetSchema"></a>xmlTextReaderSetSchema ()</h3>
<pre class="programlisting">int	xmlTextReaderSetSchema		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema)<br>
</pre>
<p>Use XSD Schema to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then Schema validation is deactivated. The @schema should not be freed until the reader is deallocated or its use has been deactivated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a precompiled Schema schema</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case the Schema validation could be (de)activated and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSetStructuredErrorHandler"></a>xmlTextReaderSetStructuredErrorHandler ()</h3>
<pre class="programlisting">void	xmlTextReaderSetStructuredErrorHandler	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> f, <br>						 void * arg)<br>
</pre>
<p>Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the callback function to call on error and warnings</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>a user argument to pass to the callback function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderSetup"></a>xmlTextReaderSetup ()</h3>
<pre class="programlisting">int	xmlTextReaderSetup		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 const char * URL, <br>					 const char * encoding, <br>					 int options)<br>
</pre>
<p>Setup an XML reader with new options</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>an XML reader</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>
<a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> used to feed the reader, will be destroyed with it.</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the base URL to use for the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-parser.html#xmlParserOption">xmlParserOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderStandalone"></a>xmlTextReaderStandalone ()</h3>
<pre class="programlisting">int	xmlTextReaderStandalone		(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Determine the standalone status of the document being read.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the document was declared to be standalone, 0 if it was declared to be not standalone, or -1 if the document did not specify its standalone status or in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderValue"></a>xmlTextReaderValue ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderValue	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>Provides the text value of the node if present</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the string or NULL if not available. The result must be deallocated with xmlFree()</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlTextReaderXmlLang"></a>xmlTextReaderXmlLang ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlTextReaderXmlLang	(<a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> reader)<br>
</pre>
<p>The xml:lang scope within which the node resides.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>reader</tt></i>:</span></td>
<td>the <a href="libxml2-xmlreader.html#xmlTextReaderPtr">xmlTextReaderPtr</a> used</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the xml:lang value or NULL if none exists., if non NULL it need to be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xpointer.html000064400000061171151730335340014530 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xpointer: API to handle XML Pointers</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xpathInternals.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xpointer</span></h2>
<p>xpointer - API to handle XML Pointers</p>
<p>API to handle XML Pointers Base implementation was made accordingly to W3C Candidate Recommendation 7 June 2000</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlLocationSet <a href="#xmlLocationSet">xmlLocationSet</a>;
typedef <a href="libxml2-xpointer.html#xmlLocationSet">xmlLocationSet</a> * <a href="#xmlLocationSetPtr">xmlLocationSetPtr</a>;
<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	<a href="#xmlXPtrBuildNodeList">xmlXPtrBuildNodeList</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrEval">xmlXPtrEval</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx);
void	<a href="#xmlXPtrEvalRangePredicate">xmlXPtrEvalRangePredicate</a>	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt);
void	<a href="#xmlXPtrFreeLocationSet">xmlXPtrFreeLocationSet</a>		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> obj);
void	<a href="#xmlXPtrLocationSetAdd">xmlXPtrLocationSetAdd</a>		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a>	<a href="#xmlXPtrLocationSetCreate">xmlXPtrLocationSetCreate</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
void	<a href="#xmlXPtrLocationSetDel">xmlXPtrLocationSetDel</a>		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val);
<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a>	<a href="#xmlXPtrLocationSetMerge">xmlXPtrLocationSetMerge</a>	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val1, <br>						 <a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val2);
void	<a href="#xmlXPtrLocationSetRemove">xmlXPtrLocationSetRemove</a>	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 int val);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewCollapsedRange">xmlXPtrNewCollapsedRange</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start);
<a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	<a href="#xmlXPtrNewContext">xmlXPtrNewContext</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> here, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> origin);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewLocationSetNodeSet">xmlXPtrNewLocationSetNodeSet</a>	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> set);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewLocationSetNodes">xmlXPtrNewLocationSetNodes</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRange">xmlXPtrNewRange</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>					 int startindex, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end, <br>					 int endindex);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRangeNodeObject">xmlXPtrNewRangeNodeObject</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRangeNodePoint">xmlXPtrNewRangeNodePoint</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRangeNodes">xmlXPtrNewRangeNodes</a>	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRangePointNode">xmlXPtrNewRangePointNode</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> start, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrNewRangePoints">xmlXPtrNewRangePoints</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> start, <br>						 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end);
void	<a href="#xmlXPtrRangeToFunction">xmlXPtrRangeToFunction</a>		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs);
<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	<a href="#xmlXPtrWrapLocationSet">xmlXPtrWrapLocationSet</a>	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlLocationSet">Structure </a>xmlLocationSet</h3>
<pre class="programlisting">struct _xmlLocationSet {
    int	locNr	: number of locations in the set
    int	locMax	: size of the array as allocated
    <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> *	locTab	: array of locations
} xmlLocationSet;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLocationSetPtr">Typedef </a>xmlLocationSetPtr</h3>
<pre class="programlisting"><a href="libxml2-xpointer.html#xmlLocationSet">xmlLocationSet</a> * xmlLocationSetPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrBuildNodeList"></a>xmlXPtrBuildNodeList ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	xmlXPtrBuildNodeList	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> obj)<br>
</pre>
<p>Build a node list tree copy of the XPointer result. This will drop Attributes and Namespace declarations.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>the XPointer result from the evaluation.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> list or NULL. the caller has to free the node tree.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrEval"></a>xmlXPtrEval ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrEval	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str, <br>					 <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a> ctx)<br>
</pre>
<p>Evaluate the XPath Location Path in the given context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the XPointer expression</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the XPointer context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> resulting from the evaluation or NULL. the caller has to free the object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrEvalRangePredicate"></a>xmlXPtrEvalRangePredicate ()</h3>
<pre class="programlisting">void	xmlXPtrEvalRangePredicate	(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt)<br>
</pre>
<p>[8] Predicate ::= '[' PredicateExpr ']' [9] PredicateExpr ::= Expr Evaluate a predicate as in xmlXPathEvalPredicate() but for a Location Set instead of a node set</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPointer Parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrFreeLocationSet"></a>xmlXPtrFreeLocationSet ()</h3>
<pre class="programlisting">void	xmlXPtrFreeLocationSet		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> obj)<br>
</pre>
<p>Free the LocationSet compound (not the actual ranges !).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>obj</tt></i>:</span></td>
<td>the <a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrLocationSetAdd"></a>xmlXPtrLocationSetAdd ()</h3>
<pre class="programlisting">void	xmlXPtrLocationSetAdd		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>add a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> to an existing LocationSet If the location already exist in the set @val is freed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial range set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrLocationSetCreate"></a>xmlXPtrLocationSetCreate ()</h3>
<pre class="programlisting"><a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a>	xmlXPtrLocationSetCreate	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Create a new <a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> of type double and of value @val</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an initial xmlXPathObjectPtr, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrLocationSetDel"></a>xmlXPtrLocationSetDel ()</h3>
<pre class="programlisting">void	xmlXPtrLocationSetDel		(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> val)<br>
</pre>
<p>Removes an <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> from an existing LocationSet</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial range set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>an <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrLocationSetMerge"></a>xmlXPtrLocationSetMerge ()</h3>
<pre class="programlisting"><a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a>	xmlXPtrLocationSetMerge	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val1, <br>						 <a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val2)<br>
</pre>
<p>Merges two rangesets, all ranges from @val2 are added to @val1</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val1</tt></i>:</span></td>
<td>the first LocationSet</td>
</tr>
<tr>
<td><span class="term"><i><tt>val2</tt></i>:</span></td>
<td>the second LocationSet</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>val1 once extended or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrLocationSetRemove"></a>xmlXPtrLocationSetRemove ()</h3>
<pre class="programlisting">void	xmlXPtrLocationSetRemove	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> cur, <br>					 int val)<br>
</pre>
<p>Removes an entry from an existing LocationSet list.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the initial range set</td>
</tr>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the index to remove</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewCollapsedRange"></a>xmlXPtrNewCollapsedRange ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewCollapsedRange	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range using a single nodes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting and ending node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewContext"></a>xmlXPtrNewContext ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	xmlXPtrNewContext	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> here, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> origin)<br>
</pre>
<p>Create a new XPointer context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the XML document</td>
</tr>
<tr>
<td><span class="term"><i><tt>here</tt></i>:</span></td>
<td>the node that directly contains the XPointer being evaluated or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>origin</tt></i>:</span></td>
<td>the element from which a user or program initiated traversal of the link, or NULL.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xpath.html#xmlXPathContext">xmlXPathContext</a> just allocated.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewLocationSetNodeSet"></a>xmlXPtrNewLocationSetNodeSet ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewLocationSetNodeSet	(<a href="libxml2-xpath.html#xmlNodeSetPtr">xmlNodeSetPtr</a> set)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type LocationSet and initialize it with all the nodes from @set</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>set</tt></i>:</span></td>
<td>a node set</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewLocationSetNodes"></a>xmlXPtrNewLocationSetNodes ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewLocationSetNodes	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type LocationSet and initialize it with the single range made of the two nodes @start and @end</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the start NodePtr value</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the end NodePtr value or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRange"></a>xmlXPtrNewRange ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRange	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>					 int startindex, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end, <br>					 int endindex)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting node</td>
</tr>
<tr>
<td><span class="term"><i><tt>startindex</tt></i>:</span></td>
<td>the start index</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending point</td>
</tr>
<tr>
<td><span class="term"><i><tt>endindex</tt></i>:</span></td>
<td>the ending index</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRangeNodeObject"></a>xmlXPtrNewRangeNodeObject ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRangeNodeObject	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range from a not to an object</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting node</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending object</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRangeNodePoint"></a>xmlXPtrNewRangeNodePoint ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRangeNodePoint	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>							 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range from a node to a point</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting node</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRangeNodes"></a>xmlXPtrNewRangeNodes ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRangeNodes	(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> start, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range using 2 nodes</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting node</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRangePointNode"></a>xmlXPtrNewRangePointNode ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRangePointNode	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> start, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range from a point to a node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting point</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrNewRangePoints"></a>xmlXPtrNewRangePoints ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrNewRangePoints	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> start, <br>						 <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> end)<br>
</pre>
<p>Create a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> of type range using 2 Points</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>start</tt></i>:</span></td>
<td>the starting point</td>
</tr>
<tr>
<td><span class="term"><i><tt>end</tt></i>:</span></td>
<td>the ending point</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrRangeToFunction"></a>xmlXPtrRangeToFunction ()</h3>
<pre class="programlisting">void	xmlXPtrRangeToFunction		(<a href="libxml2-xpath.html#xmlXPathParserContextPtr">xmlXPathParserContextPtr</a> ctxt, <br>					 int nargs)<br>
</pre>
<p>Implement the range-to() XPointer function Obsolete. range-to is not a real function but a special type of location step which is handled in xpath.c.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the XPointer Parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>nargs</tt></i>:</span></td>
<td>the number of args</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlXPtrWrapLocationSet"></a>xmlXPtrWrapLocationSet ()</h3>
<pre class="programlisting"><a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a>	xmlXPtrWrapLocationSet	(<a href="libxml2-xpointer.html#xmlLocationSetPtr">xmlLocationSetPtr</a> val)<br>
</pre>
<p>Wrap the LocationSet @val in a new <a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>val</tt></i>:</span></td>
<td>the LocationSet value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the newly created object.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-HTMLtree.html000064400000056743151730335340014315 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTMLtree: specific APIs to process HTML tree, especially serialization</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-HTMLparser.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-SAX.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">HTMLtree</span></h2>
<p>HTMLtree - specific APIs to process HTML tree, especially serialization</p>
<p>this module implements a few function needed to process tree in an HTML specific way. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#HTML_COMMENT_NODE">HTML_COMMENT_NODE</a>;
#define <a href="#HTML_ENTITY_REF_NODE">HTML_ENTITY_REF_NODE</a>;
#define <a href="#HTML_PI_NODE">HTML_PI_NODE</a>;
#define <a href="#HTML_PRESERVE_NODE">HTML_PRESERVE_NODE</a>;
#define <a href="#HTML_TEXT_NODE">HTML_TEXT_NODE</a>;
void	<a href="#htmlDocContentDumpFormatOutput">htmlDocContentDumpFormatOutput</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format);
void	<a href="#htmlDocContentDumpOutput">htmlDocContentDumpOutput</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding);
int	<a href="#htmlDocDump">htmlDocDump</a>			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur);
void	<a href="#htmlDocDumpMemory">htmlDocDumpMemory</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size);
void	<a href="#htmlDocDumpMemoryFormat">htmlDocDumpMemoryFormat</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size, <br>					 int format);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#htmlGetMetaEncoding">htmlGetMetaEncoding</a>	(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc);
int	<a href="#htmlIsBooleanAttr">htmlIsBooleanAttr</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlNewDoc">htmlNewDoc</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID);
<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	<a href="#htmlNewDocNoDtD">htmlNewDocNoDtD</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID);
int	<a href="#htmlNodeDump">htmlNodeDump</a>			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
void	<a href="#htmlNodeDumpFile">htmlNodeDumpFile</a>		(FILE * out, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur);
int	<a href="#htmlNodeDumpFileFormat">htmlNodeDumpFileFormat</a>		(FILE * out, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding, <br>					 int format);
void	<a href="#htmlNodeDumpFormatOutput">htmlNodeDumpFormatOutput</a>	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding, <br>					 int format);
void	<a href="#htmlNodeDumpOutput">htmlNodeDumpOutput</a>		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding);
int	<a href="#htmlSaveFile">htmlSaveFile</a>			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur);
int	<a href="#htmlSaveFileEnc">htmlSaveFileEnc</a>			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding);
int	<a href="#htmlSaveFileFormat">htmlSaveFileFormat</a>		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format);
int	<a href="#htmlSetMetaEncoding">htmlSetMetaEncoding</a>		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * encoding);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="HTML_COMMENT_NODE">Macro </a>HTML_COMMENT_NODE</h3>
<pre class="programlisting">#define <a href="#HTML_COMMENT_NODE">HTML_COMMENT_NODE</a>;
</pre>
<p>Macro. A <a href="libxml2-SAX.html#comment">comment</a> in a HTML document is really implemented the same way as a <a href="libxml2-SAX.html#comment">comment</a> in an XML document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="HTML_ENTITY_REF_NODE">Macro </a>HTML_ENTITY_REF_NODE</h3>
<pre class="programlisting">#define <a href="#HTML_ENTITY_REF_NODE">HTML_ENTITY_REF_NODE</a>;
</pre>
<p>Macro. An entity <a href="libxml2-SAX.html#reference">reference</a> in a HTML document is really implemented the same way as an entity <a href="libxml2-SAX.html#reference">reference</a> in an XML document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="HTML_PI_NODE">Macro </a>HTML_PI_NODE</h3>
<pre class="programlisting">#define <a href="#HTML_PI_NODE">HTML_PI_NODE</a>;
</pre>
<p>Macro. A processing instruction in a HTML document is really implemented the same way as a processing instruction in an XML document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="HTML_PRESERVE_NODE">Macro </a>HTML_PRESERVE_NODE</h3>
<pre class="programlisting">#define <a href="#HTML_PRESERVE_NODE">HTML_PRESERVE_NODE</a>;
</pre>
<p>Macro. A preserved node in a HTML document is really implemented the same way as a CDATA section in an XML document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="HTML_TEXT_NODE">Macro </a>HTML_TEXT_NODE</h3>
<pre class="programlisting">#define <a href="#HTML_TEXT_NODE">HTML_TEXT_NODE</a>;
</pre>
<p>Macro. A text node in a HTML document is really implemented the same way as a text node in an XML document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocContentDumpFormatOutput"></a>htmlDocContentDumpFormatOutput ()</h3>
<pre class="programlisting">void	htmlDocContentDumpFormatOutput	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an HTML document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the HTML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding string (unused)</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocContentDumpOutput"></a>htmlDocContentDumpOutput ()</h3>
<pre class="programlisting">void	htmlDocContentDumpOutput	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding)<br>
</pre>
<p>Dump an HTML document. Formatting return/spaces are added.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the HTML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding string (unused)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocDump"></a>htmlDocDump ()</h3>
<pre class="programlisting">int	htmlDocDump			(FILE * f, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur)<br>
</pre>
<p>Dump an HTML document to an open FILE.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the FILE*</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocDumpMemory"></a>htmlDocDumpMemory ()</h3>
<pre class="programlisting">void	htmlDocDumpMemory		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size)<br>
</pre>
<p>Dump an HTML document in memory and return the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * and it's size. It's up to the caller to free the memory.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>OUT: the memory pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>OUT: the memory length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlDocDumpMemoryFormat"></a>htmlDocDumpMemoryFormat ()</h3>
<pre class="programlisting">void	htmlDocDumpMemoryFormat		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** mem, <br>					 int * size, <br>					 int format)<br>
</pre>
<p>Dump an HTML document in memory and return the <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * and it's size. It's up to the caller to free the memory.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>mem</tt></i>:</span></td>
<td>OUT: the memory pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>OUT: the memory length</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlGetMetaEncoding"></a>htmlGetMetaEncoding ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	htmlGetMetaEncoding	(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc)<br>
</pre>
<p>Encoding definition lookup in the Meta tags</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current encoding as flagged in the HTML source</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlIsBooleanAttr"></a>htmlIsBooleanAttr ()</h3>
<pre class="programlisting">int	htmlIsBooleanAttr		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Determine if a given <a href="libxml2-SAX.html#attribute">attribute</a> is a boolean attribute.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the name of the <a href="libxml2-SAX.html#attribute">attribute</a> to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>false if the <a href="libxml2-SAX.html#attribute">attribute</a> is not boolean, true otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNewDoc"></a>htmlNewDoc ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlNewDoc		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID)<br>
</pre>
<p>Creates a new HTML document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>URI for the dtd, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID of the DTD, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNewDocNoDtD"></a>htmlNewDocNoDtD ()</h3>
<pre class="programlisting"><a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a>	htmlNewDocNoDtD		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID)<br>
</pre>
<p>Creates a new HTML document without a DTD node if @URI and @ExternalID are NULL</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>URI for the dtd, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID of the DTD, or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new document, do not initialize the DTD if not provided</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeDump"></a>htmlNodeDump ()</h3>
<pre class="programlisting">int	htmlNodeDump			(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the HTML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeDumpFile"></a>htmlNodeDumpFile ()</h3>
<pre class="programlisting">void	htmlNodeDumpFile		(FILE * out, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur)<br>
</pre>
<p>Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>the FILE pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeDumpFileFormat"></a>htmlNodeDumpFileFormat ()</h3>
<pre class="programlisting">int	htmlNodeDumpFileFormat		(FILE * out, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an HTML node, recursive behaviour,children are printed too. TODO: if encoding == NULL try to save in the doc encoding</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>the FILE pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeDumpFormatOutput"></a>htmlNodeDumpFormatOutput ()</h3>
<pre class="programlisting">void	htmlNodeDumpFormatOutput	(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an HTML node, recursive behaviour,children are printed too.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the HTML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding string (unused)</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlNodeDumpOutput"></a>htmlNodeDumpOutput ()</h3>
<pre class="programlisting">void	htmlNodeDumpOutput		(<a href="libxml2-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> cur, <br>					 const char * encoding)<br>
</pre>
<p>Dump an HTML node, recursive behaviour,children are printed too, and formatting returns/spaces are added.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the HTML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the current node</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding string (unused)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSaveFile"></a>htmlSaveFile ()</h3>
<pre class="programlisting">int	htmlSaveFile			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur)<br>
</pre>
<p>Dump an HTML document to a file. If @filename is "-" the stdout file is used.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename (or URL)</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSaveFileEnc"></a>htmlSaveFileEnc ()</h3>
<pre class="programlisting">int	htmlSaveFileEnc			(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding)<br>
</pre>
<p>Dump an HTML document to a file using a given encoding and formatting returns/spaces are added.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSaveFileFormat"></a>htmlSaveFileFormat ()</h3>
<pre class="programlisting">int	htmlSaveFileFormat		(const char * filename, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br>					 const char * encoding, <br>					 int format)<br>
</pre>
<p>Dump an HTML document to a file using a given encoding.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the document encoding</td>
</tr>
<tr>
<td><span class="term"><i><tt>format</tt></i>:</span></td>
<td>should formatting spaces been added</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of byte written or -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="htmlSetMetaEncoding"></a>htmlSetMetaEncoding ()</h3>
<pre class="programlisting">int	htmlSetMetaEncoding		(<a href="libxml2-HTMLparser.html#htmlDocPtr">htmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * encoding)<br>
</pre>
<p>Sets the current encoding in the Meta tags NOTE: this will not change the document content encoding, just the META flag associated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>encoding</tt></i>:</span></td>
<td>the encoding string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-schemasInternals.html000064400000173532151730335340016170 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>schemasInternals: internal interfaces for XML Schemas</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-relaxng.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-schematron.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">schemasInternals</span></h2>
<p>schemasInternals - internal interfaces for XML Schemas</p>
<p>internal interfaces for the XML Schemas handling and schema validity checking The Schemas development is a Work In Progress. Some of those interfaces are not guaranteed to be API or ABI stable ! </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_SCHEMAS_ANYATTR_LAX">XML_SCHEMAS_ANYATTR_LAX</a>;
#define <a href="#XML_SCHEMAS_ANYATTR_SKIP">XML_SCHEMAS_ANYATTR_SKIP</a>;
#define <a href="#XML_SCHEMAS_ANYATTR_STRICT">XML_SCHEMAS_ANYATTR_STRICT</a>;
#define <a href="#XML_SCHEMAS_ANY_LAX">XML_SCHEMAS_ANY_LAX</a>;
#define <a href="#XML_SCHEMAS_ANY_SKIP">XML_SCHEMAS_ANY_SKIP</a>;
#define <a href="#XML_SCHEMAS_ANY_STRICT">XML_SCHEMAS_ANY_STRICT</a>;
#define <a href="#XML_SCHEMAS_ATTRGROUP_GLOBAL">XML_SCHEMAS_ATTRGROUP_GLOBAL</a>;
#define <a href="#XML_SCHEMAS_ATTRGROUP_HAS_REFS">XML_SCHEMAS_ATTRGROUP_HAS_REFS</a>;
#define <a href="#XML_SCHEMAS_ATTRGROUP_MARKED">XML_SCHEMAS_ATTRGROUP_MARKED</a>;
#define <a href="#XML_SCHEMAS_ATTRGROUP_REDEFINED">XML_SCHEMAS_ATTRGROUP_REDEFINED</a>;
#define <a href="#XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED">XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED</a>;
#define <a href="#XML_SCHEMAS_ATTR_FIXED">XML_SCHEMAS_ATTR_FIXED</a>;
#define <a href="#XML_SCHEMAS_ATTR_GLOBAL">XML_SCHEMAS_ATTR_GLOBAL</a>;
#define <a href="#XML_SCHEMAS_ATTR_INTERNAL_RESOLVED">XML_SCHEMAS_ATTR_INTERNAL_RESOLVED</a>;
#define <a href="#XML_SCHEMAS_ATTR_NSDEFAULT">XML_SCHEMAS_ATTR_NSDEFAULT</a>;
#define <a href="#XML_SCHEMAS_ATTR_USE_OPTIONAL">XML_SCHEMAS_ATTR_USE_OPTIONAL</a>;
#define <a href="#XML_SCHEMAS_ATTR_USE_PROHIBITED">XML_SCHEMAS_ATTR_USE_PROHIBITED</a>;
#define <a href="#XML_SCHEMAS_ATTR_USE_REQUIRED">XML_SCHEMAS_ATTR_USE_REQUIRED</a>;
#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION">XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION">XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION">XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION</a>;
#define <a href="#XML_SCHEMAS_ELEM_ABSTRACT">XML_SCHEMAS_ELEM_ABSTRACT</a>;
#define <a href="#XML_SCHEMAS_ELEM_BLOCK_ABSENT">XML_SCHEMAS_ELEM_BLOCK_ABSENT</a>;
#define <a href="#XML_SCHEMAS_ELEM_BLOCK_EXTENSION">XML_SCHEMAS_ELEM_BLOCK_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_ELEM_BLOCK_RESTRICTION">XML_SCHEMAS_ELEM_BLOCK_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION">XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION</a>;
#define <a href="#XML_SCHEMAS_ELEM_CIRCULAR">XML_SCHEMAS_ELEM_CIRCULAR</a>;
#define <a href="#XML_SCHEMAS_ELEM_DEFAULT">XML_SCHEMAS_ELEM_DEFAULT</a>;
#define <a href="#XML_SCHEMAS_ELEM_FINAL_ABSENT">XML_SCHEMAS_ELEM_FINAL_ABSENT</a>;
#define <a href="#XML_SCHEMAS_ELEM_FINAL_EXTENSION">XML_SCHEMAS_ELEM_FINAL_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_ELEM_FINAL_RESTRICTION">XML_SCHEMAS_ELEM_FINAL_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_ELEM_FIXED">XML_SCHEMAS_ELEM_FIXED</a>;
#define <a href="#XML_SCHEMAS_ELEM_GLOBAL">XML_SCHEMAS_ELEM_GLOBAL</a>;
#define <a href="#XML_SCHEMAS_ELEM_INTERNAL_CHECKED">XML_SCHEMAS_ELEM_INTERNAL_CHECKED</a>;
#define <a href="#XML_SCHEMAS_ELEM_INTERNAL_RESOLVED">XML_SCHEMAS_ELEM_INTERNAL_RESOLVED</a>;
#define <a href="#XML_SCHEMAS_ELEM_NILLABLE">XML_SCHEMAS_ELEM_NILLABLE</a>;
#define <a href="#XML_SCHEMAS_ELEM_NSDEFAULT">XML_SCHEMAS_ELEM_NSDEFAULT</a>;
#define <a href="#XML_SCHEMAS_ELEM_REF">XML_SCHEMAS_ELEM_REF</a>;
#define <a href="#XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD">XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD</a>;
#define <a href="#XML_SCHEMAS_ELEM_TOPLEVEL">XML_SCHEMAS_ELEM_TOPLEVEL</a>;
#define <a href="#XML_SCHEMAS_FACET_COLLAPSE">XML_SCHEMAS_FACET_COLLAPSE</a>;
#define <a href="#XML_SCHEMAS_FACET_PRESERVE">XML_SCHEMAS_FACET_PRESERVE</a>;
#define <a href="#XML_SCHEMAS_FACET_REPLACE">XML_SCHEMAS_FACET_REPLACE</a>;
#define <a href="#XML_SCHEMAS_FACET_UNKNOWN">XML_SCHEMAS_FACET_UNKNOWN</a>;
#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_EXTENSION">XML_SCHEMAS_FINAL_DEFAULT_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_LIST">XML_SCHEMAS_FINAL_DEFAULT_LIST</a>;
#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION">XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_UNION">XML_SCHEMAS_FINAL_DEFAULT_UNION</a>;
#define <a href="#XML_SCHEMAS_INCLUDING_CONVERT_NS">XML_SCHEMAS_INCLUDING_CONVERT_NS</a>;
#define <a href="#XML_SCHEMAS_QUALIF_ATTR">XML_SCHEMAS_QUALIF_ATTR</a>;
#define <a href="#XML_SCHEMAS_QUALIF_ELEM">XML_SCHEMAS_QUALIF_ELEM</a>;
#define <a href="#XML_SCHEMAS_TYPE_ABSTRACT">XML_SCHEMAS_TYPE_ABSTRACT</a>;
#define <a href="#XML_SCHEMAS_TYPE_BLOCK_DEFAULT">XML_SCHEMAS_TYPE_BLOCK_DEFAULT</a>;
#define <a href="#XML_SCHEMAS_TYPE_BLOCK_EXTENSION">XML_SCHEMAS_TYPE_BLOCK_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_TYPE_BLOCK_RESTRICTION">XML_SCHEMAS_TYPE_BLOCK_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE">XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE</a>;
#define <a href="#XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION">XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION">XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_TYPE_FACETSNEEDVALUE">XML_SCHEMAS_TYPE_FACETSNEEDVALUE</a>;
#define <a href="#XML_SCHEMAS_TYPE_FINAL_DEFAULT">XML_SCHEMAS_TYPE_FINAL_DEFAULT</a>;
#define <a href="#XML_SCHEMAS_TYPE_FINAL_EXTENSION">XML_SCHEMAS_TYPE_FINAL_EXTENSION</a>;
#define <a href="#XML_SCHEMAS_TYPE_FINAL_LIST">XML_SCHEMAS_TYPE_FINAL_LIST</a>;
#define <a href="#XML_SCHEMAS_TYPE_FINAL_RESTRICTION">XML_SCHEMAS_TYPE_FINAL_RESTRICTION</a>;
#define <a href="#XML_SCHEMAS_TYPE_FINAL_UNION">XML_SCHEMAS_TYPE_FINAL_UNION</a>;
#define <a href="#XML_SCHEMAS_TYPE_FIXUP_1">XML_SCHEMAS_TYPE_FIXUP_1</a>;
#define <a href="#XML_SCHEMAS_TYPE_GLOBAL">XML_SCHEMAS_TYPE_GLOBAL</a>;
#define <a href="#XML_SCHEMAS_TYPE_HAS_FACETS">XML_SCHEMAS_TYPE_HAS_FACETS</a>;
#define <a href="#XML_SCHEMAS_TYPE_INTERNAL_INVALID">XML_SCHEMAS_TYPE_INTERNAL_INVALID</a>;
#define <a href="#XML_SCHEMAS_TYPE_INTERNAL_RESOLVED">XML_SCHEMAS_TYPE_INTERNAL_RESOLVED</a>;
#define <a href="#XML_SCHEMAS_TYPE_MARKED">XML_SCHEMAS_TYPE_MARKED</a>;
#define <a href="#XML_SCHEMAS_TYPE_MIXED">XML_SCHEMAS_TYPE_MIXED</a>;
#define <a href="#XML_SCHEMAS_TYPE_NORMVALUENEEDED">XML_SCHEMAS_TYPE_NORMVALUENEEDED</a>;
#define <a href="#XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD">XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD</a>;
#define <a href="#XML_SCHEMAS_TYPE_REDEFINED">XML_SCHEMAS_TYPE_REDEFINED</a>;
#define <a href="#XML_SCHEMAS_TYPE_VARIETY_ABSENT">XML_SCHEMAS_TYPE_VARIETY_ABSENT</a>;
#define <a href="#XML_SCHEMAS_TYPE_VARIETY_ATOMIC">XML_SCHEMAS_TYPE_VARIETY_ATOMIC</a>;
#define <a href="#XML_SCHEMAS_TYPE_VARIETY_LIST">XML_SCHEMAS_TYPE_VARIETY_LIST</a>;
#define <a href="#XML_SCHEMAS_TYPE_VARIETY_UNION">XML_SCHEMAS_TYPE_VARIETY_UNION</a>;
#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE">XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE</a>;
#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE">XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE</a>;
#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_REPLACE">XML_SCHEMAS_TYPE_WHITESPACE_REPLACE</a>;
#define <a href="#XML_SCHEMAS_WILDCARD_COMPLETE">XML_SCHEMAS_WILDCARD_COMPLETE</a>;
typedef struct _xmlSchemaAnnot <a href="#xmlSchemaAnnot">xmlSchemaAnnot</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaAnnot">xmlSchemaAnnot</a> * <a href="#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>;
typedef struct _xmlSchemaAttribute <a href="#xmlSchemaAttribute">xmlSchemaAttribute</a>;
typedef struct _xmlSchemaAttributeGroup <a href="#xmlSchemaAttributeGroup">xmlSchemaAttributeGroup</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaAttributeGroup">xmlSchemaAttributeGroup</a> * <a href="#xmlSchemaAttributeGroupPtr">xmlSchemaAttributeGroupPtr</a>;
typedef struct _xmlSchemaAttributeLink <a href="#xmlSchemaAttributeLink">xmlSchemaAttributeLink</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaAttributeLink">xmlSchemaAttributeLink</a> * <a href="#xmlSchemaAttributeLinkPtr">xmlSchemaAttributeLinkPtr</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaAttribute">xmlSchemaAttribute</a> * <a href="#xmlSchemaAttributePtr">xmlSchemaAttributePtr</a>;
typedef enum <a href="#xmlSchemaContentType">xmlSchemaContentType</a>;
typedef struct _xmlSchemaElement <a href="#xmlSchemaElement">xmlSchemaElement</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaElement">xmlSchemaElement</a> * <a href="#xmlSchemaElementPtr">xmlSchemaElementPtr</a>;
typedef struct _xmlSchemaFacet <a href="#xmlSchemaFacet">xmlSchemaFacet</a>;
typedef struct _xmlSchemaFacetLink <a href="#xmlSchemaFacetLink">xmlSchemaFacetLink</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaFacetLink">xmlSchemaFacetLink</a> * <a href="#xmlSchemaFacetLinkPtr">xmlSchemaFacetLinkPtr</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaFacet">xmlSchemaFacet</a> * <a href="#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a>;
typedef struct _xmlSchemaNotation <a href="#xmlSchemaNotation">xmlSchemaNotation</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaNotation">xmlSchemaNotation</a> * <a href="#xmlSchemaNotationPtr">xmlSchemaNotationPtr</a>;
typedef struct _xmlSchemaType <a href="#xmlSchemaType">xmlSchemaType</a>;
typedef struct _xmlSchemaTypeLink <a href="#xmlSchemaTypeLink">xmlSchemaTypeLink</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaTypeLink">xmlSchemaTypeLink</a> * <a href="#xmlSchemaTypeLinkPtr">xmlSchemaTypeLinkPtr</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaType">xmlSchemaType</a> * <a href="#xmlSchemaTypePtr">xmlSchemaTypePtr</a>;
typedef enum <a href="#xmlSchemaTypeType">xmlSchemaTypeType</a>;
typedef struct _xmlSchemaVal <a href="#xmlSchemaVal">xmlSchemaVal</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaVal">xmlSchemaVal</a> * <a href="#xmlSchemaValPtr">xmlSchemaValPtr</a>;
typedef enum <a href="#xmlSchemaValType">xmlSchemaValType</a>;
typedef struct _xmlSchemaWildcard <a href="#xmlSchemaWildcard">xmlSchemaWildcard</a>;
typedef struct _xmlSchemaWildcardNs <a href="#xmlSchemaWildcardNs">xmlSchemaWildcardNs</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaWildcardNs">xmlSchemaWildcardNs</a> * <a href="#xmlSchemaWildcardNsPtr">xmlSchemaWildcardNsPtr</a>;
typedef <a href="libxml2-schemasInternals.html#xmlSchemaWildcard">xmlSchemaWildcard</a> * <a href="#xmlSchemaWildcardPtr">xmlSchemaWildcardPtr</a>;
void	<a href="#xmlSchemaFreeType">xmlSchemaFreeType</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type);
void	<a href="#xmlSchemaFreeWildcard">xmlSchemaFreeWildcard</a>		(<a href="libxml2-schemasInternals.html#xmlSchemaWildcardPtr">xmlSchemaWildcardPtr</a> wildcard);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANYATTR_LAX">Macro </a>XML_SCHEMAS_ANYATTR_LAX</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANYATTR_LAX">XML_SCHEMAS_ANYATTR_LAX</a>;
</pre>
<p>Ignore validation non definition on attributes Obsolete, not used anymore.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANYATTR_SKIP">Macro </a>XML_SCHEMAS_ANYATTR_SKIP</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANYATTR_SKIP">XML_SCHEMAS_ANYATTR_SKIP</a>;
</pre>
<p>Skip unknown <a href="libxml2-SAX.html#attribute">attribute</a> from validation Obsolete, not used anymore.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANYATTR_STRICT">Macro </a>XML_SCHEMAS_ANYATTR_STRICT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANYATTR_STRICT">XML_SCHEMAS_ANYATTR_STRICT</a>;
</pre>
<p>Apply strict validation rules on attributes Obsolete, not used anymore.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANY_LAX">Macro </a>XML_SCHEMAS_ANY_LAX</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANY_LAX">XML_SCHEMAS_ANY_LAX</a>;
</pre>
<p>Used by wildcards. Validate if type found, don't worry if not found</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANY_SKIP">Macro </a>XML_SCHEMAS_ANY_SKIP</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANY_SKIP">XML_SCHEMAS_ANY_SKIP</a>;
</pre>
<p>Skip unknown <a href="libxml2-SAX.html#attribute">attribute</a> from validation</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ANY_STRICT">Macro </a>XML_SCHEMAS_ANY_STRICT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ANY_STRICT">XML_SCHEMAS_ANY_STRICT</a>;
</pre>
<p>Used by wildcards. Apply strict validation rules</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTRGROUP_GLOBAL">Macro </a>XML_SCHEMAS_ATTRGROUP_GLOBAL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTRGROUP_GLOBAL">XML_SCHEMAS_ATTRGROUP_GLOBAL</a>;
</pre>
<p>The <a href="libxml2-SAX.html#attribute">attribute</a> group has been defined.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTRGROUP_HAS_REFS">Macro </a>XML_SCHEMAS_ATTRGROUP_HAS_REFS</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTRGROUP_HAS_REFS">XML_SCHEMAS_ATTRGROUP_HAS_REFS</a>;
</pre>
<p>Whether this attr. group contains attr. group references.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTRGROUP_MARKED">Macro </a>XML_SCHEMAS_ATTRGROUP_MARKED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTRGROUP_MARKED">XML_SCHEMAS_ATTRGROUP_MARKED</a>;
</pre>
<p>Marks the attr group as marked; used for circular checks.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTRGROUP_REDEFINED">Macro </a>XML_SCHEMAS_ATTRGROUP_REDEFINED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTRGROUP_REDEFINED">XML_SCHEMAS_ATTRGROUP_REDEFINED</a>;
</pre>
<p>The attr group was redefined.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED">Macro </a>XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED">XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED</a>;
</pre>
<p>The <a href="libxml2-SAX.html#attribute">attribute</a> wildcard has been built.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_FIXED">Macro </a>XML_SCHEMAS_ATTR_FIXED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_FIXED">XML_SCHEMAS_ATTR_FIXED</a>;
</pre>
<p>the <a href="libxml2-SAX.html#attribute">attribute</a> has a fixed value</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_GLOBAL">Macro </a>XML_SCHEMAS_ATTR_GLOBAL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_GLOBAL">XML_SCHEMAS_ATTR_GLOBAL</a>;
</pre>
<p>allow elements in no namespace</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_INTERNAL_RESOLVED">Macro </a>XML_SCHEMAS_ATTR_INTERNAL_RESOLVED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_INTERNAL_RESOLVED">XML_SCHEMAS_ATTR_INTERNAL_RESOLVED</a>;
</pre>
<p>this is set when the "type" and "ref" references have been resolved.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_NSDEFAULT">Macro </a>XML_SCHEMAS_ATTR_NSDEFAULT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_NSDEFAULT">XML_SCHEMAS_ATTR_NSDEFAULT</a>;
</pre>
<p>allow elements in no namespace</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_USE_OPTIONAL">Macro </a>XML_SCHEMAS_ATTR_USE_OPTIONAL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_USE_OPTIONAL">XML_SCHEMAS_ATTR_USE_OPTIONAL</a>;
</pre>
<p>The <a href="libxml2-SAX.html#attribute">attribute</a> is optional.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_USE_PROHIBITED">Macro </a>XML_SCHEMAS_ATTR_USE_PROHIBITED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_USE_PROHIBITED">XML_SCHEMAS_ATTR_USE_PROHIBITED</a>;
</pre>
<p>Used by wildcards. The <a href="libxml2-SAX.html#attribute">attribute</a> is prohibited.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ATTR_USE_REQUIRED">Macro </a>XML_SCHEMAS_ATTR_USE_REQUIRED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ATTR_USE_REQUIRED">XML_SCHEMAS_ATTR_USE_REQUIRED</a>;
</pre>
<p>The <a href="libxml2-SAX.html#attribute">attribute</a> is required.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION">Macro </a>XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION">XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION</a>;
</pre>
<p>the schema has "extension" in the set of blockDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION">Macro </a>XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION">XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION</a>;
</pre>
<p>the schema has "restriction" in the set of blockDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION">Macro </a>XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION">XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION</a>;
</pre>
<p>the schema has "substitution" in the set of blockDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_ABSTRACT">Macro </a>XML_SCHEMAS_ELEM_ABSTRACT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_ABSTRACT">XML_SCHEMAS_ELEM_ABSTRACT</a>;
</pre>
<p>the element is abstract</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_BLOCK_ABSENT">Macro </a>XML_SCHEMAS_ELEM_BLOCK_ABSENT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_BLOCK_ABSENT">XML_SCHEMAS_ELEM_BLOCK_ABSENT</a>;
</pre>
<p>the "block" <a href="libxml2-SAX.html#attribute">attribute</a> is absent</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_BLOCK_EXTENSION">Macro </a>XML_SCHEMAS_ELEM_BLOCK_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_BLOCK_EXTENSION">XML_SCHEMAS_ELEM_BLOCK_EXTENSION</a>;
</pre>
<p>disallowed substitutions are absent</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_BLOCK_RESTRICTION">Macro </a>XML_SCHEMAS_ELEM_BLOCK_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_BLOCK_RESTRICTION">XML_SCHEMAS_ELEM_BLOCK_RESTRICTION</a>;
</pre>
<p>disallowed substitutions: "restriction"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION">Macro </a>XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION">XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION</a>;
</pre>
<p>disallowed substitutions: "substitution"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_CIRCULAR">Macro </a>XML_SCHEMAS_ELEM_CIRCULAR</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_CIRCULAR">XML_SCHEMAS_ELEM_CIRCULAR</a>;
</pre>
<p>a helper flag for the search of circular references.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_DEFAULT">Macro </a>XML_SCHEMAS_ELEM_DEFAULT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_DEFAULT">XML_SCHEMAS_ELEM_DEFAULT</a>;
</pre>
<p>the element has a default value</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_FINAL_ABSENT">Macro </a>XML_SCHEMAS_ELEM_FINAL_ABSENT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_FINAL_ABSENT">XML_SCHEMAS_ELEM_FINAL_ABSENT</a>;
</pre>
<p>substitution group exclusions are absent</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_FINAL_EXTENSION">Macro </a>XML_SCHEMAS_ELEM_FINAL_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_FINAL_EXTENSION">XML_SCHEMAS_ELEM_FINAL_EXTENSION</a>;
</pre>
<p>substitution group exclusions: "extension"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_FINAL_RESTRICTION">Macro </a>XML_SCHEMAS_ELEM_FINAL_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_FINAL_RESTRICTION">XML_SCHEMAS_ELEM_FINAL_RESTRICTION</a>;
</pre>
<p>substitution group exclusions: "restriction"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_FIXED">Macro </a>XML_SCHEMAS_ELEM_FIXED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_FIXED">XML_SCHEMAS_ELEM_FIXED</a>;
</pre>
<p>the element has a fixed value</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_GLOBAL">Macro </a>XML_SCHEMAS_ELEM_GLOBAL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_GLOBAL">XML_SCHEMAS_ELEM_GLOBAL</a>;
</pre>
<p>the element is global</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_INTERNAL_CHECKED">Macro </a>XML_SCHEMAS_ELEM_INTERNAL_CHECKED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_INTERNAL_CHECKED">XML_SCHEMAS_ELEM_INTERNAL_CHECKED</a>;
</pre>
<p>this is set when the elem decl has been checked against all constraints</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_INTERNAL_RESOLVED">Macro </a>XML_SCHEMAS_ELEM_INTERNAL_RESOLVED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_INTERNAL_RESOLVED">XML_SCHEMAS_ELEM_INTERNAL_RESOLVED</a>;
</pre>
<p>this is set when "type", "ref", "substitutionGroup" references have been resolved.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_NILLABLE">Macro </a>XML_SCHEMAS_ELEM_NILLABLE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_NILLABLE">XML_SCHEMAS_ELEM_NILLABLE</a>;
</pre>
<p>the element is nillable</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_NSDEFAULT">Macro </a>XML_SCHEMAS_ELEM_NSDEFAULT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_NSDEFAULT">XML_SCHEMAS_ELEM_NSDEFAULT</a>;
</pre>
<p>allow elements in no namespace Obsolete, not used anymore.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_REF">Macro </a>XML_SCHEMAS_ELEM_REF</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_REF">XML_SCHEMAS_ELEM_REF</a>;
</pre>
<p>the element is a <a href="libxml2-SAX.html#reference">reference</a> to a type</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD">Macro </a>XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD">XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD</a>;
</pre>
<p>the declaration is a substitution group head</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_ELEM_TOPLEVEL">Macro </a>XML_SCHEMAS_ELEM_TOPLEVEL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_ELEM_TOPLEVEL">XML_SCHEMAS_ELEM_TOPLEVEL</a>;
</pre>
<p>the element is top level obsolete: use <a href="libxml2-schemasInternals.html#XML_SCHEMAS_ELEM_GLOBAL">XML_SCHEMAS_ELEM_GLOBAL</a> instead</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FACET_COLLAPSE">Macro </a>XML_SCHEMAS_FACET_COLLAPSE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FACET_COLLAPSE">XML_SCHEMAS_FACET_COLLAPSE</a>;
</pre>
<p>collapse the types of the facet</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FACET_PRESERVE">Macro </a>XML_SCHEMAS_FACET_PRESERVE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FACET_PRESERVE">XML_SCHEMAS_FACET_PRESERVE</a>;
</pre>
<p>preserve the type of the facet</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FACET_REPLACE">Macro </a>XML_SCHEMAS_FACET_REPLACE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FACET_REPLACE">XML_SCHEMAS_FACET_REPLACE</a>;
</pre>
<p>replace the type of the facet</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FACET_UNKNOWN">Macro </a>XML_SCHEMAS_FACET_UNKNOWN</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FACET_UNKNOWN">XML_SCHEMAS_FACET_UNKNOWN</a>;
</pre>
<p>unknown facet handling</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FINAL_DEFAULT_EXTENSION">Macro </a>XML_SCHEMAS_FINAL_DEFAULT_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_EXTENSION">XML_SCHEMAS_FINAL_DEFAULT_EXTENSION</a>;
</pre>
<p>the schema has "extension" in the set of finalDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FINAL_DEFAULT_LIST">Macro </a>XML_SCHEMAS_FINAL_DEFAULT_LIST</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_LIST">XML_SCHEMAS_FINAL_DEFAULT_LIST</a>;
</pre>
<p>the schema has "list" in the set of finalDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION">Macro </a>XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION">XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION</a>;
</pre>
<p>the schema has "restriction" in the set of finalDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_FINAL_DEFAULT_UNION">Macro </a>XML_SCHEMAS_FINAL_DEFAULT_UNION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_FINAL_DEFAULT_UNION">XML_SCHEMAS_FINAL_DEFAULT_UNION</a>;
</pre>
<p>the schema has "union" in the set of finalDefault.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_INCLUDING_CONVERT_NS">Macro </a>XML_SCHEMAS_INCLUDING_CONVERT_NS</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_INCLUDING_CONVERT_NS">XML_SCHEMAS_INCLUDING_CONVERT_NS</a>;
</pre>
<p>the schema is currently including an other schema with no target namespace.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_QUALIF_ATTR">Macro </a>XML_SCHEMAS_QUALIF_ATTR</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_QUALIF_ATTR">XML_SCHEMAS_QUALIF_ATTR</a>;
</pre>
<p>Reflects attributeFormDefault == qualified in an XML schema document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_QUALIF_ELEM">Macro </a>XML_SCHEMAS_QUALIF_ELEM</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_QUALIF_ELEM">XML_SCHEMAS_QUALIF_ELEM</a>;
</pre>
<p>Reflects elementFormDefault == qualified in an XML schema document.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_ABSTRACT">Macro </a>XML_SCHEMAS_TYPE_ABSTRACT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_ABSTRACT">XML_SCHEMAS_TYPE_ABSTRACT</a>;
</pre>
<p>the simple/complexType is abstract.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_BLOCK_DEFAULT">Macro </a>XML_SCHEMAS_TYPE_BLOCK_DEFAULT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_BLOCK_DEFAULT">XML_SCHEMAS_TYPE_BLOCK_DEFAULT</a>;
</pre>
<p>the complexType did not specify 'block' so use the default of the &lt;schema&gt; item.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_BLOCK_EXTENSION">Macro </a>XML_SCHEMAS_TYPE_BLOCK_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_BLOCK_EXTENSION">XML_SCHEMAS_TYPE_BLOCK_EXTENSION</a>;
</pre>
<p>the complexType has a 'block' of "extension".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_BLOCK_RESTRICTION">Macro </a>XML_SCHEMAS_TYPE_BLOCK_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_BLOCK_RESTRICTION">XML_SCHEMAS_TYPE_BLOCK_RESTRICTION</a>;
</pre>
<p>the complexType has a 'block' of "restriction".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE">Macro </a>XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE">XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE</a>;
</pre>
<p>Marks the item as a builtin primitive.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION">Macro </a>XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION">XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION</a>;
</pre>
<p>the simple or complex type has a derivation method of "extension".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION">Macro </a>XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION">XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION</a>;
</pre>
<p>the simple or complex type has a derivation method of "restriction".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FACETSNEEDVALUE">Macro </a>XML_SCHEMAS_TYPE_FACETSNEEDVALUE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FACETSNEEDVALUE">XML_SCHEMAS_TYPE_FACETSNEEDVALUE</a>;
</pre>
<p>indicates if the facets need a computed value</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FINAL_DEFAULT">Macro </a>XML_SCHEMAS_TYPE_FINAL_DEFAULT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FINAL_DEFAULT">XML_SCHEMAS_TYPE_FINAL_DEFAULT</a>;
</pre>
<p>the simpleType has a final of "default".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FINAL_EXTENSION">Macro </a>XML_SCHEMAS_TYPE_FINAL_EXTENSION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FINAL_EXTENSION">XML_SCHEMAS_TYPE_FINAL_EXTENSION</a>;
</pre>
<p>the complexType has a final of "extension".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FINAL_LIST">Macro </a>XML_SCHEMAS_TYPE_FINAL_LIST</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FINAL_LIST">XML_SCHEMAS_TYPE_FINAL_LIST</a>;
</pre>
<p>the simpleType has a final of "list".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FINAL_RESTRICTION">Macro </a>XML_SCHEMAS_TYPE_FINAL_RESTRICTION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FINAL_RESTRICTION">XML_SCHEMAS_TYPE_FINAL_RESTRICTION</a>;
</pre>
<p>the simpleType/complexType has a final of "restriction".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FINAL_UNION">Macro </a>XML_SCHEMAS_TYPE_FINAL_UNION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FINAL_UNION">XML_SCHEMAS_TYPE_FINAL_UNION</a>;
</pre>
<p>the simpleType has a final of "union".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_FIXUP_1">Macro </a>XML_SCHEMAS_TYPE_FIXUP_1</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_FIXUP_1">XML_SCHEMAS_TYPE_FIXUP_1</a>;
</pre>
<p>First stage of fixup was done.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_GLOBAL">Macro </a>XML_SCHEMAS_TYPE_GLOBAL</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_GLOBAL">XML_SCHEMAS_TYPE_GLOBAL</a>;
</pre>
<p>the type is global</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_HAS_FACETS">Macro </a>XML_SCHEMAS_TYPE_HAS_FACETS</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_HAS_FACETS">XML_SCHEMAS_TYPE_HAS_FACETS</a>;
</pre>
<p>has facets</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_INTERNAL_INVALID">Macro </a>XML_SCHEMAS_TYPE_INTERNAL_INVALID</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_INTERNAL_INVALID">XML_SCHEMAS_TYPE_INTERNAL_INVALID</a>;
</pre>
<p>indicates that the type is invalid</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_INTERNAL_RESOLVED">Macro </a>XML_SCHEMAS_TYPE_INTERNAL_RESOLVED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_INTERNAL_RESOLVED">XML_SCHEMAS_TYPE_INTERNAL_RESOLVED</a>;
</pre>
<p>indicates that the type was typefixed</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_MARKED">Macro </a>XML_SCHEMAS_TYPE_MARKED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_MARKED">XML_SCHEMAS_TYPE_MARKED</a>;
</pre>
<p>Marks the item as marked; used for circular checks.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_MIXED">Macro </a>XML_SCHEMAS_TYPE_MIXED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_MIXED">XML_SCHEMAS_TYPE_MIXED</a>;
</pre>
<p>the element content type is mixed</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_NORMVALUENEEDED">Macro </a>XML_SCHEMAS_TYPE_NORMVALUENEEDED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_NORMVALUENEEDED">XML_SCHEMAS_TYPE_NORMVALUENEEDED</a>;
</pre>
<p>indicates if the facets (pattern) need a normalized value</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD">Macro </a>XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD">XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD</a>;
</pre>
<p>the complexType owns an <a href="libxml2-SAX.html#attribute">attribute</a> wildcard, i.e. it can be freed by the complexType</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_REDEFINED">Macro </a>XML_SCHEMAS_TYPE_REDEFINED</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_REDEFINED">XML_SCHEMAS_TYPE_REDEFINED</a>;
</pre>
<p>The type was redefined.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_VARIETY_ABSENT">Macro </a>XML_SCHEMAS_TYPE_VARIETY_ABSENT</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_VARIETY_ABSENT">XML_SCHEMAS_TYPE_VARIETY_ABSENT</a>;
</pre>
<p>the simpleType has a variety of "absent". TODO: Actually not necessary :-/, since if none of the variety flags occur then it's automatically absent.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_VARIETY_ATOMIC">Macro </a>XML_SCHEMAS_TYPE_VARIETY_ATOMIC</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_VARIETY_ATOMIC">XML_SCHEMAS_TYPE_VARIETY_ATOMIC</a>;
</pre>
<p>the simpleType has a variety of "union".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_VARIETY_LIST">Macro </a>XML_SCHEMAS_TYPE_VARIETY_LIST</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_VARIETY_LIST">XML_SCHEMAS_TYPE_VARIETY_LIST</a>;
</pre>
<p>the simpleType has a variety of "list".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_VARIETY_UNION">Macro </a>XML_SCHEMAS_TYPE_VARIETY_UNION</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_VARIETY_UNION">XML_SCHEMAS_TYPE_VARIETY_UNION</a>;
</pre>
<p>the simpleType has a variety of "union".</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE">Macro </a>XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE">XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE</a>;
</pre>
<p>a whitespace-facet value of "collapse"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE">Macro </a>XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE">XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE</a>;
</pre>
<p>a whitespace-facet value of "preserve"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_TYPE_WHITESPACE_REPLACE">Macro </a>XML_SCHEMAS_TYPE_WHITESPACE_REPLACE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_TYPE_WHITESPACE_REPLACE">XML_SCHEMAS_TYPE_WHITESPACE_REPLACE</a>;
</pre>
<p>a whitespace-facet value of "replace"</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_SCHEMAS_WILDCARD_COMPLETE">Macro </a>XML_SCHEMAS_WILDCARD_COMPLETE</h3>
<pre class="programlisting">#define <a href="#XML_SCHEMAS_WILDCARD_COMPLETE">XML_SCHEMAS_WILDCARD_COMPLETE</a>;
</pre>
<p>If the wildcard is complete.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAnnot">Structure </a>xmlSchemaAnnot</h3>
<pre class="programlisting">struct _xmlSchemaAnnot {
    struct _xmlSchemaAnnot *	next
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	content	: the annotation
} xmlSchemaAnnot;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAnnotPtr">Typedef </a>xmlSchemaAnnotPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaAnnot">xmlSchemaAnnot</a> * xmlSchemaAnnotPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttribute">Structure </a>xmlSchemaAttribute</h3>
<pre class="programlisting">struct _xmlSchemaAttribute {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type
    struct _xmlSchemaAttribute *	next	: the next <a href="libxml2-SAX.html#attribute">attribute</a> (not used?)
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: the name of the declaration
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ref	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refNs	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	typeName	: the local name of the type definition
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	typeNs	: the ns URI of the type definition
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	base	: Deprecated; not used
    int	occurs	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	defValue	: The initial value of the value constraint
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	subtypes	: the type definition
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace
    int	flags
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refPrefix	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	defVal	: The compiled value constraint
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributePtr">xmlSchemaAttributePtr</a>	refDecl	: Deprecated; not used
} xmlSchemaAttribute;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttributeGroup">Structure </a>xmlSchemaAttributeGroup</h3>
<pre class="programlisting">struct _xmlSchemaAttributeGroup {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    struct _xmlSchemaAttribute *	next	: the next <a href="libxml2-SAX.html#attribute">attribute</a> if in a group ...
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ref	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refNs	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributePtr">xmlSchemaAttributePtr</a>	attributes	: Deprecated; not used
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    int	flags
    <a href="libxml2-schemasInternals.html#xmlSchemaWildcardPtr">xmlSchemaWildcardPtr</a>	attributeWildcard
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refPrefix	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributeGroupPtr">xmlSchemaAttributeGroupPtr</a>	refItem	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace
    void *	attrUses
} xmlSchemaAttributeGroup;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttributeGroupPtr">Typedef </a>xmlSchemaAttributeGroupPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaAttributeGroup">xmlSchemaAttributeGroup</a> * xmlSchemaAttributeGroupPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttributeLink">Structure </a>xmlSchemaAttributeLink</h3>
<pre class="programlisting">struct _xmlSchemaAttributeLink {
    struct _xmlSchemaAttributeLink *	next	: the next <a href="libxml2-SAX.html#attribute">attribute</a> link ...
    struct _xmlSchemaAttribute *	attr	: the linked <a href="libxml2-SAX.html#attribute">attribute</a>
} xmlSchemaAttributeLink;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttributeLinkPtr">Typedef </a>xmlSchemaAttributeLinkPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaAttributeLink">xmlSchemaAttributeLink</a> * xmlSchemaAttributeLinkPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaAttributePtr">Typedef </a>xmlSchemaAttributePtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaAttribute">xmlSchemaAttribute</a> * xmlSchemaAttributePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaContentType">Enum </a>xmlSchemaContentType</h3>
<pre class="programlisting">enum <a href="#xmlSchemaContentType">xmlSchemaContentType</a> {
    <a name="XML_SCHEMA_CONTENT_UNKNOWN">XML_SCHEMA_CONTENT_UNKNOWN</a> = 0
    <a name="XML_SCHEMA_CONTENT_EMPTY">XML_SCHEMA_CONTENT_EMPTY</a> = 1
    <a name="XML_SCHEMA_CONTENT_ELEMENTS">XML_SCHEMA_CONTENT_ELEMENTS</a> = 2
    <a name="XML_SCHEMA_CONTENT_MIXED">XML_SCHEMA_CONTENT_MIXED</a> = 3
    <a name="XML_SCHEMA_CONTENT_SIMPLE">XML_SCHEMA_CONTENT_SIMPLE</a> = 4
    <a name="XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS">XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS</a> = 5 /* Obsolete */
    <a name="XML_SCHEMA_CONTENT_BASIC">XML_SCHEMA_CONTENT_BASIC</a> = 6
    <a name="XML_SCHEMA_CONTENT_ANY">XML_SCHEMA_CONTENT_ANY</a> = 7
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaElement">Structure </a>xmlSchemaElement</h3>
<pre class="programlisting">struct _xmlSchemaElement {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    struct _xmlSchemaType *	next	: Not used?
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ref	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refNs	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	subtypes	: the type definition
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributePtr">xmlSchemaAttributePtr</a>	attributes
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	flags
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	namedType
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	namedTypeNs
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	substGroup
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	substGroupNs
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	scope
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	value	: The original value of the value constraint.
    struct _xmlSchemaElement *	refDecl	: This will now be used for the substitution group affiliation
    <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	contModel	: Obsolete for WXS, maybe used for RelaxNG
    <a href="libxml2-schemasInternals.html#xmlSchemaContentType">xmlSchemaContentType</a>	contentType
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refPrefix	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	defVal	: The compiled value constraint.
    void *	idcs	: The identity-constraint defs
} xmlSchemaElement;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaElementPtr">Typedef </a>xmlSchemaElementPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaElement">xmlSchemaElement</a> * xmlSchemaElementPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFacet">Structure </a>xmlSchemaFacet</h3>
<pre class="programlisting">struct _xmlSchemaFacet {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    struct _xmlSchemaFacet *	next	: the next type if in a sequence ...
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	value	: The original value
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Obsolete
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    int	fixed	: XML_SCHEMAS_FACET_PRESERVE, etc.
    int	whitespace
    <a href="libxml2-schemasInternals.html#xmlSchemaValPtr">xmlSchemaValPtr</a>	val	: The compiled value
    <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	regexp	: The regex for patterns
} xmlSchemaFacet;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFacetLink">Structure </a>xmlSchemaFacetLink</h3>
<pre class="programlisting">struct _xmlSchemaFacetLink {
    struct _xmlSchemaFacetLink *	next	: the next facet link ...
    <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a>	facet	: the linked facet
} xmlSchemaFacetLink;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFacetLinkPtr">Typedef </a>xmlSchemaFacetLinkPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaFacetLink">xmlSchemaFacetLink</a> * xmlSchemaFacetLinkPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFacetPtr">Typedef </a>xmlSchemaFacetPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaFacet">xmlSchemaFacet</a> * xmlSchemaFacetPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNotation">Structure </a>xmlSchemaNotation</h3>
<pre class="programlisting">struct _xmlSchemaNotation {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	identifier
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace
} xmlSchemaNotation;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNotationPtr">Typedef </a>xmlSchemaNotationPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaNotation">xmlSchemaNotation</a> * xmlSchemaNotationPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaType">Structure </a>xmlSchemaType</h3>
<pre class="programlisting">struct _xmlSchemaType {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    struct _xmlSchemaType *	next	: the next type if in a sequence ...
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	ref	: Deprecated; not used
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refNs	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	subtypes
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributePtr">xmlSchemaAttributePtr</a>	attributes	: Deprecated; not used
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	flags
    <a href="libxml2-schemasInternals.html#xmlSchemaContentType">xmlSchemaContentType</a>	contentType
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	base	: Base type's local name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	baseNs	: Base type's target namespace
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	baseType	: The base type component
    <a href="libxml2-schemasInternals.html#xmlSchemaFacetPtr">xmlSchemaFacetPtr</a>	facets	: Local facets
    struct _xmlSchemaType *	redef	: Deprecated; not used
    int	recurse	: Obsolete
    <a href="libxml2-schemasInternals.html#xmlSchemaAttributeLinkPtr">xmlSchemaAttributeLinkPtr</a> *	attributeUses	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaWildcardPtr">xmlSchemaWildcardPtr</a>	attributeWildcard
    int	builtInType	: Type of built-in types.
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeLinkPtr">xmlSchemaTypeLinkPtr</a>	memberTypes	: member-types if a union type.
    <a href="libxml2-schemasInternals.html#xmlSchemaFacetLinkPtr">xmlSchemaFacetLinkPtr</a>	facetSet	: All facets (incl. inherited)
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	refPrefix	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	contentTypeDef	: Used for the simple content of complex types. Could we use @subtypes
    <a href="libxml2-xmlregexp.html#xmlRegexpPtr">xmlRegexpPtr</a>	contModel	: Holds the automaton of the content model
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace
    void *	attrUses
} xmlSchemaType;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaTypeLink">Structure </a>xmlSchemaTypeLink</h3>
<pre class="programlisting">struct _xmlSchemaTypeLink {
    struct _xmlSchemaTypeLink *	next	: the next type link ...
    <a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a>	type	: the linked type
} xmlSchemaTypeLink;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaTypeLinkPtr">Typedef </a>xmlSchemaTypeLinkPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaTypeLink">xmlSchemaTypeLink</a> * xmlSchemaTypeLinkPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaTypePtr">Typedef </a>xmlSchemaTypePtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaType">xmlSchemaType</a> * xmlSchemaTypePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaTypeType">Enum </a>xmlSchemaTypeType</h3>
<pre class="programlisting">enum <a href="#xmlSchemaTypeType">xmlSchemaTypeType</a> {
    <a name="XML_SCHEMA_TYPE_BASIC">XML_SCHEMA_TYPE_BASIC</a> = 1 /* A built-in datatype */
    <a name="XML_SCHEMA_TYPE_ANY">XML_SCHEMA_TYPE_ANY</a> = 2
    <a name="XML_SCHEMA_TYPE_FACET">XML_SCHEMA_TYPE_FACET</a> = 3
    <a name="XML_SCHEMA_TYPE_SIMPLE">XML_SCHEMA_TYPE_SIMPLE</a> = 4
    <a name="XML_SCHEMA_TYPE_COMPLEX">XML_SCHEMA_TYPE_COMPLEX</a> = 5
    <a name="XML_SCHEMA_TYPE_SEQUENCE">XML_SCHEMA_TYPE_SEQUENCE</a> = 6
    <a name="XML_SCHEMA_TYPE_CHOICE">XML_SCHEMA_TYPE_CHOICE</a> = 7
    <a name="XML_SCHEMA_TYPE_ALL">XML_SCHEMA_TYPE_ALL</a> = 8
    <a name="XML_SCHEMA_TYPE_SIMPLE_CONTENT">XML_SCHEMA_TYPE_SIMPLE_CONTENT</a> = 9
    <a name="XML_SCHEMA_TYPE_COMPLEX_CONTENT">XML_SCHEMA_TYPE_COMPLEX_CONTENT</a> = 10
    <a name="XML_SCHEMA_TYPE_UR">XML_SCHEMA_TYPE_UR</a> = 11
    <a name="XML_SCHEMA_TYPE_RESTRICTION">XML_SCHEMA_TYPE_RESTRICTION</a> = 12
    <a name="XML_SCHEMA_TYPE_EXTENSION">XML_SCHEMA_TYPE_EXTENSION</a> = 13
    <a name="XML_SCHEMA_TYPE_ELEMENT">XML_SCHEMA_TYPE_ELEMENT</a> = 14
    <a name="XML_SCHEMA_TYPE_ATTRIBUTE">XML_SCHEMA_TYPE_ATTRIBUTE</a> = 15
    <a name="XML_SCHEMA_TYPE_ATTRIBUTEGROUP">XML_SCHEMA_TYPE_ATTRIBUTEGROUP</a> = 16
    <a name="XML_SCHEMA_TYPE_GROUP">XML_SCHEMA_TYPE_GROUP</a> = 17
    <a name="XML_SCHEMA_TYPE_NOTATION">XML_SCHEMA_TYPE_NOTATION</a> = 18
    <a name="XML_SCHEMA_TYPE_LIST">XML_SCHEMA_TYPE_LIST</a> = 19
    <a name="XML_SCHEMA_TYPE_UNION">XML_SCHEMA_TYPE_UNION</a> = 20
    <a name="XML_SCHEMA_TYPE_ANY_ATTRIBUTE">XML_SCHEMA_TYPE_ANY_ATTRIBUTE</a> = 21
    <a name="XML_SCHEMA_TYPE_IDC_UNIQUE">XML_SCHEMA_TYPE_IDC_UNIQUE</a> = 22
    <a name="XML_SCHEMA_TYPE_IDC_KEY">XML_SCHEMA_TYPE_IDC_KEY</a> = 23
    <a name="XML_SCHEMA_TYPE_IDC_KEYREF">XML_SCHEMA_TYPE_IDC_KEYREF</a> = 24
    <a name="XML_SCHEMA_TYPE_PARTICLE">XML_SCHEMA_TYPE_PARTICLE</a> = 25
    <a name="XML_SCHEMA_TYPE_ATTRIBUTE_USE">XML_SCHEMA_TYPE_ATTRIBUTE_USE</a> = 26
    <a name="XML_SCHEMA_FACET_MININCLUSIVE">XML_SCHEMA_FACET_MININCLUSIVE</a> = 1000
    <a name="XML_SCHEMA_FACET_MINEXCLUSIVE">XML_SCHEMA_FACET_MINEXCLUSIVE</a> = 1001
    <a name="XML_SCHEMA_FACET_MAXINCLUSIVE">XML_SCHEMA_FACET_MAXINCLUSIVE</a> = 1002
    <a name="XML_SCHEMA_FACET_MAXEXCLUSIVE">XML_SCHEMA_FACET_MAXEXCLUSIVE</a> = 1003
    <a name="XML_SCHEMA_FACET_TOTALDIGITS">XML_SCHEMA_FACET_TOTALDIGITS</a> = 1004
    <a name="XML_SCHEMA_FACET_FRACTIONDIGITS">XML_SCHEMA_FACET_FRACTIONDIGITS</a> = 1005
    <a name="XML_SCHEMA_FACET_PATTERN">XML_SCHEMA_FACET_PATTERN</a> = 1006
    <a name="XML_SCHEMA_FACET_ENUMERATION">XML_SCHEMA_FACET_ENUMERATION</a> = 1007
    <a name="XML_SCHEMA_FACET_WHITESPACE">XML_SCHEMA_FACET_WHITESPACE</a> = 1008
    <a name="XML_SCHEMA_FACET_LENGTH">XML_SCHEMA_FACET_LENGTH</a> = 1009
    <a name="XML_SCHEMA_FACET_MAXLENGTH">XML_SCHEMA_FACET_MAXLENGTH</a> = 1010
    <a name="XML_SCHEMA_FACET_MINLENGTH">XML_SCHEMA_FACET_MINLENGTH</a> = 1011
    <a name="XML_SCHEMA_EXTRA_QNAMEREF">XML_SCHEMA_EXTRA_QNAMEREF</a> = 2000
    <a name="XML_SCHEMA_EXTRA_ATTR_USE_PROHIB">XML_SCHEMA_EXTRA_ATTR_USE_PROHIB</a> = 2001
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaVal">Structure </a>xmlSchemaVal</h3>
<pre class="programlisting">struct _xmlSchemaVal {
The content of this structure is not made public by the API.
} xmlSchemaVal;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValPtr">Typedef </a>xmlSchemaValPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaVal">xmlSchemaVal</a> * xmlSchemaValPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValType">Enum </a>xmlSchemaValType</h3>
<pre class="programlisting">enum <a href="#xmlSchemaValType">xmlSchemaValType</a> {
    <a name="XML_SCHEMAS_UNKNOWN">XML_SCHEMAS_UNKNOWN</a> = 0
    <a name="XML_SCHEMAS_STRING">XML_SCHEMAS_STRING</a> = 1
    <a name="XML_SCHEMAS_NORMSTRING">XML_SCHEMAS_NORMSTRING</a> = 2
    <a name="XML_SCHEMAS_DECIMAL">XML_SCHEMAS_DECIMAL</a> = 3
    <a name="XML_SCHEMAS_TIME">XML_SCHEMAS_TIME</a> = 4
    <a name="XML_SCHEMAS_GDAY">XML_SCHEMAS_GDAY</a> = 5
    <a name="XML_SCHEMAS_GMONTH">XML_SCHEMAS_GMONTH</a> = 6
    <a name="XML_SCHEMAS_GMONTHDAY">XML_SCHEMAS_GMONTHDAY</a> = 7
    <a name="XML_SCHEMAS_GYEAR">XML_SCHEMAS_GYEAR</a> = 8
    <a name="XML_SCHEMAS_GYEARMONTH">XML_SCHEMAS_GYEARMONTH</a> = 9
    <a name="XML_SCHEMAS_DATE">XML_SCHEMAS_DATE</a> = 10
    <a name="XML_SCHEMAS_DATETIME">XML_SCHEMAS_DATETIME</a> = 11
    <a name="XML_SCHEMAS_DURATION">XML_SCHEMAS_DURATION</a> = 12
    <a name="XML_SCHEMAS_FLOAT">XML_SCHEMAS_FLOAT</a> = 13
    <a name="XML_SCHEMAS_DOUBLE">XML_SCHEMAS_DOUBLE</a> = 14
    <a name="XML_SCHEMAS_BOOLEAN">XML_SCHEMAS_BOOLEAN</a> = 15
    <a name="XML_SCHEMAS_TOKEN">XML_SCHEMAS_TOKEN</a> = 16
    <a name="XML_SCHEMAS_LANGUAGE">XML_SCHEMAS_LANGUAGE</a> = 17
    <a name="XML_SCHEMAS_NMTOKEN">XML_SCHEMAS_NMTOKEN</a> = 18
    <a name="XML_SCHEMAS_NMTOKENS">XML_SCHEMAS_NMTOKENS</a> = 19
    <a name="XML_SCHEMAS_NAME">XML_SCHEMAS_NAME</a> = 20
    <a name="XML_SCHEMAS_QNAME">XML_SCHEMAS_QNAME</a> = 21
    <a name="XML_SCHEMAS_NCNAME">XML_SCHEMAS_NCNAME</a> = 22
    <a name="XML_SCHEMAS_ID">XML_SCHEMAS_ID</a> = 23
    <a name="XML_SCHEMAS_IDREF">XML_SCHEMAS_IDREF</a> = 24
    <a name="XML_SCHEMAS_IDREFS">XML_SCHEMAS_IDREFS</a> = 25
    <a name="XML_SCHEMAS_ENTITY">XML_SCHEMAS_ENTITY</a> = 26
    <a name="XML_SCHEMAS_ENTITIES">XML_SCHEMAS_ENTITIES</a> = 27
    <a name="XML_SCHEMAS_NOTATION">XML_SCHEMAS_NOTATION</a> = 28
    <a name="XML_SCHEMAS_ANYURI">XML_SCHEMAS_ANYURI</a> = 29
    <a name="XML_SCHEMAS_INTEGER">XML_SCHEMAS_INTEGER</a> = 30
    <a name="XML_SCHEMAS_NPINTEGER">XML_SCHEMAS_NPINTEGER</a> = 31
    <a name="XML_SCHEMAS_NINTEGER">XML_SCHEMAS_NINTEGER</a> = 32
    <a name="XML_SCHEMAS_NNINTEGER">XML_SCHEMAS_NNINTEGER</a> = 33
    <a name="XML_SCHEMAS_PINTEGER">XML_SCHEMAS_PINTEGER</a> = 34
    <a name="XML_SCHEMAS_INT">XML_SCHEMAS_INT</a> = 35
    <a name="XML_SCHEMAS_UINT">XML_SCHEMAS_UINT</a> = 36
    <a name="XML_SCHEMAS_LONG">XML_SCHEMAS_LONG</a> = 37
    <a name="XML_SCHEMAS_ULONG">XML_SCHEMAS_ULONG</a> = 38
    <a name="XML_SCHEMAS_SHORT">XML_SCHEMAS_SHORT</a> = 39
    <a name="XML_SCHEMAS_USHORT">XML_SCHEMAS_USHORT</a> = 40
    <a name="XML_SCHEMAS_BYTE">XML_SCHEMAS_BYTE</a> = 41
    <a name="XML_SCHEMAS_UBYTE">XML_SCHEMAS_UBYTE</a> = 42
    <a name="XML_SCHEMAS_HEXBINARY">XML_SCHEMAS_HEXBINARY</a> = 43
    <a name="XML_SCHEMAS_BASE64BINARY">XML_SCHEMAS_BASE64BINARY</a> = 44
    <a name="XML_SCHEMAS_ANYTYPE">XML_SCHEMAS_ANYTYPE</a> = 45
    <a name="XML_SCHEMAS_ANYSIMPLETYPE">XML_SCHEMAS_ANYSIMPLETYPE</a> = 46
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWildcard">Structure </a>xmlSchemaWildcard</h3>
<pre class="programlisting">struct _xmlSchemaWildcard {
    <a href="libxml2-schemasInternals.html#xmlSchemaTypeType">xmlSchemaTypeType</a>	type	: The kind of type
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Deprecated; not used
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	processContents
    int	any	: Indicates if the ns constraint is of ##any
    <a href="libxml2-schemasInternals.html#xmlSchemaWildcardNsPtr">xmlSchemaWildcardNsPtr</a>	nsSet	: The list of allowed namespaces
    <a href="libxml2-schemasInternals.html#xmlSchemaWildcardNsPtr">xmlSchemaWildcardNsPtr</a>	negNsSet	: The negated namespace
    int	flags
} xmlSchemaWildcard;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWildcardNs">Structure </a>xmlSchemaWildcardNs</h3>
<pre class="programlisting">struct _xmlSchemaWildcardNs {
    struct _xmlSchemaWildcardNs *	next	: the next constraint link ...
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	value	: the value
} xmlSchemaWildcardNs;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWildcardNsPtr">Typedef </a>xmlSchemaWildcardNsPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaWildcardNs">xmlSchemaWildcardNs</a> * xmlSchemaWildcardNsPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaWildcardPtr">Typedef </a>xmlSchemaWildcardPtr</h3>
<pre class="programlisting"><a href="libxml2-schemasInternals.html#xmlSchemaWildcard">xmlSchemaWildcard</a> * xmlSchemaWildcardPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeType"></a>xmlSchemaFreeType ()</h3>
<pre class="programlisting">void	xmlSchemaFreeType		(<a href="libxml2-schemasInternals.html#xmlSchemaTypePtr">xmlSchemaTypePtr</a> type)<br>
</pre>
<p>Deallocate a Schema Type structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>a schema type structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeWildcard"></a>xmlSchemaFreeWildcard ()</h3>
<pre class="programlisting">void	xmlSchemaFreeWildcard		(<a href="libxml2-schemasInternals.html#xmlSchemaWildcardPtr">xmlSchemaWildcardPtr</a> wildcard)<br>
</pre>
<p>Deallocates a wildcard structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>wildcard</tt></i>:</span></td>
<td>a wildcard structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/right.png000064400000000730151730335340012240 0ustar00�PNG


IHDR�w=�bKGD�������	pHYs��~�tIME�2I%�=eIDATx���!o�@��.'**M0$��$�?1~�vIeEu�Ll�&��4�䝠��B�ݛ��|�>�$ݶ�oc<���A��׀X��</zq
��HR��W���! CA�b��A$�I�J�ӕۀ�IAerN6�)�+c Y�V�f�� Y�����  �cF��+p�y�icIJ��(a�u���ڸ-T�Ʉ�b�bI�3�
ɲ`L���P]�p8��e?9�LR`�B�	ð�h�ݲ���kI�m�1��C3��}H����K��9:h�|򦒴�;0�(��*���gw��'�o�z�2��n׽y	x���r�޼<XôqjnAz�۹\��/wj��K�IEND�B`�gtk-doc/html/libxml2/libxml2-SAX.html000064400000111576151730335340013320 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SAX: Old SAX version 1 handler, deprecated</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-HTMLtree.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-SAX2.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">SAX</span></h2>
<p>SAX - Old SAX version 1 handler, deprecated</p>
<p>DEPRECATED set of SAX version 1 interfaces used to build the DOM tree. </p>
<p> WARNING: this module is deprecated !</p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">void	<a href="#attribute">attribute</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
void	<a href="#attributeDecl">attributeDecl</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree);
void	<a href="#cdataBlock">cdataBlock</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len);
void	<a href="#characters">characters</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
int	<a href="#checkNamespace">checkNamespace</a>			(void * ctx, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespace);
void	<a href="#comment">comment</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
void	<a href="#elementDecl">elementDecl</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content);
void	<a href="#endDocument">endDocument</a>			(void * ctx);
void	<a href="#endElement">endElement</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#entityDecl">entityDecl</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
void	<a href="#externalSubset">externalSubset</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
int	<a href="#getColumnNumber">getColumnNumber</a>			(void * ctx);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#getEntity">getEntity</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#getLineNumber">getLineNumber</a>			(void * ctx);
<a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	<a href="#getNamespace">getNamespace</a>		(void * ctx);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#getParameterEntity">getParameterEntity</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#getPublicId">getPublicId</a>		(void * ctx);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#getSystemId">getSystemId</a>		(void * ctx);
void	<a href="#globalNamespace">globalNamespace</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
int	<a href="#hasExternalSubset">hasExternalSubset</a>		(void * ctx);
int	<a href="#hasInternalSubset">hasInternalSubset</a>		(void * ctx);
void	<a href="#ignorableWhitespace">ignorableWhitespace</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
void	<a href="#inithtmlDefaultSAXHandler">inithtmlDefaultSAXHandler</a>	(<a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * hdlr);
void	<a href="#initxmlDefaultSAXHandler">initxmlDefaultSAXHandler</a>	(<a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * hdlr, <br>					 int warning);
void	<a href="#internalSubset">internalSubset</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
int	<a href="#isStandalone">isStandalone</a>			(void * ctx);
void	<a href="#namespaceDecl">namespaceDecl</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
void	<a href="#notationDecl">notationDecl</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
void	<a href="#processingInstruction">processingInstruction</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data);
void	<a href="#reference">reference</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#resolveEntity">resolveEntity</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
void	<a href="#setDocumentLocator">setDocumentLocator</a>		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc);
void	<a href="#setNamespace">setNamespace</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#startDocument">startDocument</a>			(void * ctx);
void	<a href="#startElement">startElement</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts);
void	<a href="#unparsedEntityDecl">unparsedEntityDecl</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="attribute"></a>attribute ()</h3>
<pre class="programlisting">void	attribute			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Handle an <a href="libxml2-SAX.html#attribute">attribute</a> that has been read by the parser. The default handling is to convert the <a href="libxml2-SAX.html#attribute">attribute</a> into an DOM subtree and past it in a new <a href="libxml2-tree.html#xmlAttr">xmlAttr</a> element added to the element. DEPRECATED: use xmlSAX2Attribute()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>The <a href="libxml2-SAX.html#attribute">attribute</a> name, including namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>The <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="attributeDecl"></a>attributeDecl ()</h3>
<pre class="programlisting">void	attributeDecl			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree)<br>
</pre>
<p>An <a href="libxml2-SAX.html#attribute">attribute</a> definition has been parsed DEPRECATED: use xmlSAX2AttributeDecl()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
<tr>
<td><span class="term"><i><tt>def</tt></i>:</span></td>
<td>the type of default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>defaultValue</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the tree of enumerated value set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="cdataBlock"></a>cdataBlock ()</h3>
<pre class="programlisting">void	cdataBlock			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len)<br>
</pre>
<p>called when a pcdata block has been parsed DEPRECATED: use xmlSAX2CDataBlock()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>The pcdata content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the block length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="characters"></a>characters ()</h3>
<pre class="programlisting">void	characters			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>receiving some chars from the parser. DEPRECATED: use xmlSAX2Characters()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="checkNamespace"></a>checkNamespace ()</h3>
<pre class="programlisting">int	checkNamespace			(void * ctx, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * namespace)<br>
</pre>
<p>Check that the current element namespace is the same as the one read upon parsing. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespace</tt></i>:</span></td>
<td>the namespace to check against</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="comment"></a>comment ()</h3>
<pre class="programlisting">void	comment			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>A <a href="libxml2-SAX.html#comment">comment</a> has been parsed. DEPRECATED: use xmlSAX2Comment()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#comment">comment</a> content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="elementDecl"></a>elementDecl ()</h3>
<pre class="programlisting">void	elementDecl			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content)<br>
</pre>
<p>An element definition has been parsed DEPRECATED: use xmlSAX2ElementDecl()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the element type</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the element value tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="endDocument"></a>endDocument ()</h3>
<pre class="programlisting">void	endDocument			(void * ctx)<br>
</pre>
<p>called when the document end has been detected. DEPRECATED: use xmlSAX2EndDocument()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="endElement"></a>endElement ()</h3>
<pre class="programlisting">void	endElement			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>called when the end of an element has been detected. DEPRECATED: use xmlSAX2EndElement()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The element name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="entityDecl"></a>entityDecl ()</h3>
<pre class="programlisting">void	entityDecl			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>An entity definition has been parsed DEPRECATED: use xmlSAX2EntityDecl()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity value (without processing).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="externalSubset"></a>externalSubset ()</h3>
<pre class="programlisting">void	externalSubset			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on external subset declaration. DEPRECATED: use xmlSAX2ExternalSubset()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getColumnNumber"></a>getColumnNumber ()</h3>
<pre class="programlisting">int	getColumnNumber			(void * ctx)<br>
</pre>
<p>Provide the column number of the current parsing point. DEPRECATED: use xmlSAX2GetColumnNumber()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getEntity"></a>getEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	getEntity		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get an entity by name DEPRECATED: use xmlSAX2GetEntity()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getLineNumber"></a>getLineNumber ()</h3>
<pre class="programlisting">int	getLineNumber			(void * ctx)<br>
</pre>
<p>Provide the line number of the current parsing point. DEPRECATED: use xmlSAX2GetLineNumber()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getNamespace"></a>getNamespace ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a>	getNamespace		(void * ctx)<br>
</pre>
<p>Get the current element namespace. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> or NULL if none</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getParameterEntity"></a>getParameterEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	getParameterEntity	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get a parameter entity by name DEPRECATED: use xmlSAX2GetParameterEntity()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getPublicId"></a>getPublicId ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	getPublicId		(void * ctx)<br>
</pre>
<p>Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" DEPRECATED: use xmlSAX2GetPublicId()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="getSystemId"></a>getSystemId ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	getSystemId		(void * ctx)<br>
</pre>
<p>Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd DEPRECATED: use xmlSAX2GetSystemId()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="globalNamespace"></a>globalNamespace ()</h3>
<pre class="programlisting">void	globalNamespace			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>An old global namespace has been parsed. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the namespace associated URN</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the namespace prefix</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="hasExternalSubset"></a>hasExternalSubset ()</h3>
<pre class="programlisting">int	hasExternalSubset		(void * ctx)<br>
</pre>
<p>Does this document has an external subset DEPRECATED: use xmlSAX2HasExternalSubset()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="hasInternalSubset"></a>hasInternalSubset ()</h3>
<pre class="programlisting">int	hasInternalSubset		(void * ctx)<br>
</pre>
<p>Does this document has an internal subset DEPRECATED: use xmlSAX2HasInternalSubset()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="ignorableWhitespace"></a>ignorableWhitespace ()</h3>
<pre class="programlisting">void	ignorableWhitespace		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use <a href="libxml2-SAX.html#characters">characters</a> DEPRECATED: use xmlSAX2IgnorableWhitespace()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="inithtmlDefaultSAXHandler"></a>inithtmlDefaultSAXHandler ()</h3>
<pre class="programlisting">void	inithtmlDefaultSAXHandler	(<a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * hdlr)<br>
</pre>
<p>Initialize the default HTML SAX version 1 handler DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>hdlr</tt></i>:</span></td>
<td>the SAX handler</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="initxmlDefaultSAXHandler"></a>initxmlDefaultSAXHandler ()</h3>
<pre class="programlisting">void	initxmlDefaultSAXHandler	(<a href="libxml2-parser.html#xmlSAXHandlerV1">xmlSAXHandlerV1</a> * hdlr, <br>					 int warning)<br>
</pre>
<p>Initialize the default XML SAX version 1 handler DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>hdlr</tt></i>:</span></td>
<td>the SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>warning</tt></i>:</span></td>
<td>flag if non-zero sets the handler warning procedure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="internalSubset"></a>internalSubset ()</h3>
<pre class="programlisting">void	internalSubset			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on internal subset declaration. DEPRECATED: use xmlSAX2InternalSubset()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="isStandalone"></a>isStandalone ()</h3>
<pre class="programlisting">int	isStandalone			(void * ctx)<br>
</pre>
<p>Is this document tagged standalone ? DEPRECATED: use xmlSAX2IsStandalone()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="namespaceDecl"></a>namespaceDecl ()</h3>
<pre class="programlisting">void	namespaceDecl			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * href, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>A namespace has been parsed. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the namespace associated URN</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the namespace prefix</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="notationDecl"></a>notationDecl ()</h3>
<pre class="programlisting">void	notationDecl			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>What to do when a notation declaration has been parsed. DEPRECATED: use xmlSAX2NotationDecl()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="processingInstruction"></a>processingInstruction ()</h3>
<pre class="programlisting">void	processingInstruction		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data)<br>
</pre>
<p>A processing instruction has been parsed. DEPRECATED: use xmlSAX2ProcessingInstruction()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>the target name</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the PI data's</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="reference"></a>reference ()</h3>
<pre class="programlisting">void	reference			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>called when an entity <a href="libxml2-SAX.html#reference">reference</a> is detected. DEPRECATED: use xmlSAX2Reference()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="resolveEntity"></a>resolveEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	resolveEntity	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine DEPRECATED: use xmlSAX2ResolveEntity()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> if inlined or NULL for DOM behaviour.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="setDocumentLocator"></a>setDocumentLocator ()</h3>
<pre class="programlisting">void	setDocumentLocator		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc)<br>
</pre>
<p>Receive the document locator at startup, actually <a href="libxml2-globals.html#xmlDefaultSAXLocator">xmlDefaultSAXLocator</a> Everything is available on the context, so this is useless in our case. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>loc</tt></i>:</span></td>
<td>A SAX Locator</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="setNamespace"></a>setNamespace ()</h3>
<pre class="programlisting">void	setNamespace			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Set the current element namespace. DEPRECATED</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the namespace prefix</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="startDocument"></a>startDocument ()</h3>
<pre class="programlisting">void	startDocument			(void * ctx)<br>
</pre>
<p>called when the document start being processed. DEPRECATED: use xmlSAX2StartDocument()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="startElement"></a>startElement ()</h3>
<pre class="programlisting">void	startElement			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts)<br>
</pre>
<p>called when an opening tag has been processed. DEPRECATED: use xmlSAX2StartElement()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>The element name, including namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>atts</tt></i>:</span></td>
<td>An array of name/value attributes pairs, NULL terminated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="unparsedEntityDecl"></a>unparsedEntityDecl ()</h3>
<pre class="programlisting">void	unparsedEntityDecl		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName)<br>
</pre>
<p>What to do when an unparsed entity declaration is parsed DEPRECATED: use xmlSAX2UnparsedEntityDecl()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>notationName</tt></i>:</span></td>
<td>the name of the notation</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-entities.html000064400000054256151730335340014512 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>entities: interface for the XML entities handling</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-encoding.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-globals.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">entities</span></h2>
<p>entities - interface for the XML entities handling</p>
<p>this module provides some of the entity API needed for the parser and applications. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlHashTable <a href="#xmlEntitiesTable">xmlEntitiesTable</a>;
typedef <a href="libxml2-entities.html#xmlEntitiesTable">xmlEntitiesTable</a> * <a href="#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a>;
typedef enum <a href="#xmlEntityType">xmlEntityType</a>;
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlAddDocEntity">xmlAddDocEntity</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlAddDtdEntity">xmlAddDtdEntity</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
void	<a href="#xmlCleanupPredefinedEntities">xmlCleanupPredefinedEntities</a>	(void);
<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a>	<a href="#xmlCopyEntitiesTable">xmlCopyEntitiesTable</a>	(<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table);
<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a>	<a href="#xmlCreateEntitiesTable">xmlCreateEntitiesTable</a>	(void);
void	<a href="#xmlDumpEntitiesTable">xmlDumpEntitiesTable</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table);
void	<a href="#xmlDumpEntityDecl">xmlDumpEntityDecl</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> ent);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlEncodeEntities">xmlEncodeEntities</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlEncodeEntitiesReentrant">xmlEncodeEntitiesReentrant</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlEncodeSpecialChars">xmlEncodeSpecialChars</a>	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input);
void	<a href="#xmlFreeEntitiesTable">xmlFreeEntitiesTable</a>		(<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlGetDocEntity">xmlGetDocEntity</a>		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlGetDtdEntity">xmlGetDtdEntity</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlGetParameterEntity">xmlGetParameterEntity</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlGetPredefinedEntity">xmlGetPredefinedEntity</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlInitializePredefinedEntities">xmlInitializePredefinedEntities</a>	(void);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlNewEntity">xmlNewEntity</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntitiesTable">Structure </a>xmlEntitiesTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlEntitiesTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntitiesTablePtr">Typedef </a>xmlEntitiesTablePtr</h3>
<pre class="programlisting"><a href="libxml2-entities.html#xmlEntitiesTable">xmlEntitiesTable</a> * xmlEntitiesTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEntityType">Enum </a>xmlEntityType</h3>
<pre class="programlisting">enum <a href="#xmlEntityType">xmlEntityType</a> {
    <a name="XML_INTERNAL_GENERAL_ENTITY">XML_INTERNAL_GENERAL_ENTITY</a> = 1
    <a name="XML_EXTERNAL_GENERAL_PARSED_ENTITY">XML_EXTERNAL_GENERAL_PARSED_ENTITY</a> = 2
    <a name="XML_EXTERNAL_GENERAL_UNPARSED_ENTITY">XML_EXTERNAL_GENERAL_UNPARSED_ENTITY</a> = 3
    <a name="XML_INTERNAL_PARAMETER_ENTITY">XML_INTERNAL_PARAMETER_ENTITY</a> = 4
    <a name="XML_EXTERNAL_PARAMETER_ENTITY">XML_EXTERNAL_PARAMETER_ENTITY</a> = 5
    <a name="XML_INTERNAL_PREDEFINED_ENTITY">XML_INTERNAL_PREDEFINED_ENTITY</a> = 6
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddDocEntity"></a>xmlAddDocEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlAddDocEntity		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Register a new entity for this document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type XML_xxx_yyy_ENTITY</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the entity external ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the entity system ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the entity or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddDtdEntity"></a>xmlAddDtdEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlAddDtdEntity		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Register a new entity for this document DTD external subset.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type XML_xxx_yyy_ENTITY</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the entity external ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the entity system ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the entity or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCleanupPredefinedEntities"></a>xmlCleanupPredefinedEntities ()</h3>
<pre class="programlisting">void	xmlCleanupPredefinedEntities	(void)<br>
</pre>
<p>Cleanup up the predefined entities table. Deprecated call</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyEntitiesTable"></a>xmlCopyEntitiesTable ()</h3>
<pre class="programlisting"><a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a>	xmlCopyEntitiesTable	(<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table)<br>
</pre>
<p>Build a copy of an entity table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An entity table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateEntitiesTable"></a>xmlCreateEntitiesTable ()</h3>
<pre class="programlisting"><a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a>	xmlCreateEntitiesTable	(void)<br>
</pre>
<p>create and initialize an empty entities hash table. This really doesn't make sense and should be deprecated</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> just created or NULL in case of error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpEntitiesTable"></a>xmlDumpEntitiesTable ()</h3>
<pre class="programlisting">void	xmlDumpEntitiesTable		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table)<br>
</pre>
<p>This will dump the content of the entity table as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>An XML buffer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An entity table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpEntityDecl"></a>xmlDumpEntityDecl ()</h3>
<pre class="programlisting">void	xmlDumpEntityDecl		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> ent)<br>
</pre>
<p>This will dump the content of the entity table as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>An XML buffer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>ent</tt></i>:</span></td>
<td>An entity table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEncodeEntities"></a>xmlEncodeEntities ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlEncodeEntities	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input)<br>
</pre>
<p>TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary compatibility People must migrate their code to <a href="libxml2-entities.html#xmlEncodeEntitiesReentrant">xmlEncodeEntitiesReentrant</a> ! This routine will issue a warning when encountered.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document containing the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>A string to convert to XML.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEncodeEntitiesReentrant"></a>xmlEncodeEntitiesReentrant ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlEncodeEntitiesReentrant	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input)<br>
</pre>
<p>Do a global encoding of a string, replacing the predefined entities and non ASCII values with their entities and CharRef counterparts. Contrary to xmlEncodeEntities, this routine is reentrant, and result must be deallocated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document containing the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>A string to convert to XML.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>A newly allocated string with the substitution done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlEncodeSpecialChars"></a>xmlEncodeSpecialChars ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlEncodeSpecialChars	(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * input)<br>
</pre>
<p>Do a global encoding of a string, replacing the predefined entities this routine is reentrant, and result must be deallocated.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document containing the string</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>A string to convert to XML.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>A newly allocated string with the substitution done.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeEntitiesTable"></a>xmlFreeEntitiesTable ()</h3>
<pre class="programlisting">void	xmlFreeEntitiesTable		(<a href="libxml2-entities.html#xmlEntitiesTablePtr">xmlEntitiesTablePtr</a> table)<br>
</pre>
<p>Deallocate the memory used by an entities hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An entity table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDocEntity"></a>xmlGetDocEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlGetDocEntity		(const <a href="libxml2-tree.html#xmlDoc">xmlDoc</a> * doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Do an entity lookup in the document entity hash table and</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document referencing the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the corresponding entity, otherwise a lookup is done in the predefined entities too. Returns A pointer to the entity structure or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdEntity"></a>xmlGetDtdEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlGetDtdEntity		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Do an entity lookup in the DTD entity hash table and</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document referencing the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the corresponding entity, if found. Note: the first argument is the document node, not the DTD node. Returns A pointer to the entity structure or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetParameterEntity"></a>xmlGetParameterEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlGetParameterEntity	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Do an entity lookup in the internal and external subsets and</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document referencing the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the corresponding parameter entity, if found. Returns A pointer to the entity structure or NULL if not found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetPredefinedEntity"></a>xmlGetPredefinedEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlGetPredefinedEntity	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Check whether this name is an predefined entity.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitializePredefinedEntities"></a>xmlInitializePredefinedEntities ()</h3>
<pre class="programlisting">void	xmlInitializePredefinedEntities	(void)<br>
</pre>
<p>Set up the predefined entities. Deprecated call</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewEntity"></a>xmlNewEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlNewEntity		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>Create a new entity, this differs from xmlAddDocEntity() that if the document is NULL or has no internal subset defined, then an unlinked entity structure will be returned, it is then the responsibility of the caller to link it to the document later or free it when not needed anymore.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type XML_xxx_yyy_ENTITY</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the entity external ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the entity system ID if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity content</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to the entity or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-debugXML.html000064400000100276151730335350014330 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>debugXML: Tree debugging APIs</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-chvalid.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-dict.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">debugXML</span></h2>
<p>debugXML - Tree debugging APIs</p>
<p>Interfaces to a set of routines used for debugging the tree produced by the XML parser. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlShellCtxt <a href="#xmlShellCtxt">xmlShellCtxt</a>;
typedef <a href="libxml2-debugXML.html#xmlShellCtxt">xmlShellCtxt</a> * <a href="#xmlShellCtxtPtr">xmlShellCtxtPtr</a>;
const char *	<a href="#xmlBoolToText">xmlBoolToText</a>		(int boolval);
int	<a href="#xmlDebugCheckDocument">xmlDebugCheckDocument</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
void	<a href="#xmlDebugDumpAttr">xmlDebugDumpAttr</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 int depth);
void	<a href="#xmlDebugDumpAttrList">xmlDebugDumpAttrList</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 int depth);
void	<a href="#xmlDebugDumpDTD">xmlDebugDumpDTD</a>			(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd);
void	<a href="#xmlDebugDumpDocument">xmlDebugDumpDocument</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
void	<a href="#xmlDebugDumpDocumentHead">xmlDebugDumpDocumentHead</a>	(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
void	<a href="#xmlDebugDumpEntities">xmlDebugDumpEntities</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
void	<a href="#xmlDebugDumpNode">xmlDebugDumpNode</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth);
void	<a href="#xmlDebugDumpNodeList">xmlDebugDumpNodeList</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth);
void	<a href="#xmlDebugDumpOneNode">xmlDebugDumpOneNode</a>		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth);
void	<a href="#xmlDebugDumpString">xmlDebugDumpString</a>		(FILE * output, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str);
int	<a href="#xmlLsCountNode">xmlLsCountNode</a>			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlLsOneNode">xmlLsOneNode</a>			(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlShell">xmlShell</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 char * filename, <br>					 <a href="libxml2-debugXML.html#xmlShellReadlineFunc">xmlShellReadlineFunc</a> input, <br>					 FILE * output);
int	<a href="#xmlShellBase">xmlShellBase</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellCat">xmlShellCat</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
typedef int <a href="#xmlShellCmd">xmlShellCmd</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellDir">xmlShellDir</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellDu">xmlShellDu</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellList">xmlShellList</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellLoad">xmlShellLoad</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
void	<a href="#xmlShellPrintNode">xmlShellPrintNode</a>		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xmlShellPrintXPathError">xmlShellPrintXPathError</a>		(int errorType, <br>					 const char * arg);
void	<a href="#xmlShellPrintXPathResult">xmlShellPrintXPathResult</a>	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> list);
int	<a href="#xmlShellPwd">xmlShellPwd</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * buffer, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
typedef char * <a href="#xmlShellReadlineFunc">xmlShellReadlineFunc</a>		(char * prompt);
int	<a href="#xmlShellSave">xmlShellSave</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellValidate">xmlShellValidate</a>		(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * dtd, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
int	<a href="#xmlShellWrite">xmlShellWrite</a>			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellCtxt">Structure </a>xmlShellCtxt</h3>
<pre class="programlisting">struct _xmlShellCtxt {
    char *	filename
    <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	doc
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node
    <a href="libxml2-xpath.html#xmlXPathContextPtr">xmlXPathContextPtr</a>	pctxt
    int	loaded
    FILE *	output
    <a href="libxml2-debugXML.html#xmlShellReadlineFunc">xmlShellReadlineFunc</a>	input
} xmlShellCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellCtxtPtr">Typedef </a>xmlShellCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-debugXML.html#xmlShellCtxt">xmlShellCtxt</a> * xmlShellCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellCmd"></a>Function type xmlShellCmd</h3>
<pre class="programlisting">int	xmlShellCmd			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>This is a generic signature for the XML shell functions.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>a string argument</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a first node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>a second node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int, negative returns indicating errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellReadlineFunc"></a>Function type xmlShellReadlineFunc</h3>
<pre class="programlisting">char *	xmlShellReadlineFunc		(char * prompt)<br>
</pre>
<p>This is a generic signature for the XML shell input function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>prompt</tt></i>:</span></td>
<td>a string prompt</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a string which will be freed by the Shell.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlBoolToText"></a>xmlBoolToText ()</h3>
<pre class="programlisting">const char *	xmlBoolToText		(int boolval)<br>
</pre>
<p>Convenient way to turn bool into text</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>boolval</tt></i>:</span></td>
<td>a bool to turn into text</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to either "True" or "False"</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugCheckDocument"></a>xmlDebugCheckDocument ()</h3>
<pre class="programlisting">int	xmlDebugCheckDocument		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Check the document for potential content problems, and output the errors to @output</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of errors found</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpAttr"></a>xmlDebugDumpAttr ()</h3>
<pre class="programlisting">void	xmlDebugDumpAttr		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 int depth)<br>
</pre>
<p>Dumps debug information for the <a href="libxml2-SAX.html#attribute">attribute</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpAttrList"></a>xmlDebugDumpAttrList ()</h3>
<pre class="programlisting">void	xmlDebugDumpAttrList		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 int depth)<br>
</pre>
<p>Dumps debug information for the <a href="libxml2-SAX.html#attribute">attribute</a> list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> list</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpDTD"></a>xmlDebugDumpDTD ()</h3>
<pre class="programlisting">void	xmlDebugDumpDTD			(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd)<br>
</pre>
<p>Dumps debug information for the DTD</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>the DTD</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpDocument"></a>xmlDebugDumpDocument ()</h3>
<pre class="programlisting">void	xmlDebugDumpDocument		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Dumps debug information for the document, it's recursive</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpDocumentHead"></a>xmlDebugDumpDocumentHead ()</h3>
<pre class="programlisting">void	xmlDebugDumpDocumentHead	(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Dumps debug information concerning the document, not recursive</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpEntities"></a>xmlDebugDumpEntities ()</h3>
<pre class="programlisting">void	xmlDebugDumpEntities		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Dumps debug information for all the entities in use by the document</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpNode"></a>xmlDebugDumpNode ()</h3>
<pre class="programlisting">void	xmlDebugDumpNode		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth)<br>
</pre>
<p>Dumps debug information for the element node, it is recursive</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpNodeList"></a>xmlDebugDumpNodeList ()</h3>
<pre class="programlisting">void	xmlDebugDumpNodeList		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth)<br>
</pre>
<p>Dumps debug information for the list of element node, it is recursive</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node list</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpOneNode"></a>xmlDebugDumpOneNode ()</h3>
<pre class="programlisting">void	xmlDebugDumpOneNode		(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int depth)<br>
</pre>
<p>Dumps debug information for the element node, it is not recursive</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>depth</tt></i>:</span></td>
<td>the indentation level.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDebugDumpString"></a>xmlDebugDumpString ()</h3>
<pre class="programlisting">void	xmlDebugDumpString		(FILE * output, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * str)<br>
</pre>
<p>Dumps information about the string, shorten it if necessary</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>str</tt></i>:</span></td>
<td>the string</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLsCountNode"></a>xmlLsCountNode ()</h3>
<pre class="programlisting">int	xmlLsCountNode			(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Count the children of @node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to count</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of children of @node.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLsOneNode"></a>xmlLsOneNode ()</h3>
<pre class="programlisting">void	xmlLsOneNode			(FILE * output, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Dump to @output the type and name of @node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the FILE * for the output</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to dump</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShell"></a>xmlShell ()</h3>
<pre class="programlisting">void	xmlShell			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 char * filename, <br>					 <a href="libxml2-debugXML.html#xmlShellReadlineFunc">xmlShellReadlineFunc</a> input, <br>					 FILE * output)<br>
</pre>
<p>Implements the XML shell This allow to load, validate, view, modify and save a document using a environment similar to a UNIX commandline.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the initial document</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the output buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the line reading function</td>
</tr>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the output FILE*, defaults to stdout if NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellBase"></a>xmlShellBase ()</h3>
<pre class="programlisting">int	xmlShellBase			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "base" dumps the current XML base of the node</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellCat"></a>xmlShellCat ()</h3>
<pre class="programlisting">int	xmlShellCat			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "cat" dumps the serialization node content (XML or HTML).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellDir"></a>xmlShellDir ()</h3>
<pre class="programlisting">int	xmlShellDir			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "dir" dumps information about the node (namespace, attributes, content).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellDu"></a>xmlShellDu ()</h3>
<pre class="programlisting">int	xmlShellDu			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> tree, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "du" show the structure of the subtree under node @tree If @tree is null, the command works on the current node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>a node defining a subtree</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellList"></a>xmlShellList ()</h3>
<pre class="programlisting">int	xmlShellList			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * arg, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "ls" Does an Unix like listing of the given node (like a directory)</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellLoad"></a>xmlShellLoad ()</h3>
<pre class="programlisting">int	xmlShellLoad			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "load" loads a new document specified by the filename</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file name</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 if loading failed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellPrintNode"></a>xmlShellPrintNode ()</h3>
<pre class="programlisting">void	xmlShellPrintNode		(<a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Print node to the output FILE</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a non-null node to print to the output FILE</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellPrintXPathError"></a>xmlShellPrintXPathError ()</h3>
<pre class="programlisting">void	xmlShellPrintXPathError		(int errorType, <br>					 const char * arg)<br>
</pre>
<p>Print the xpath error to libxml default error channel</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>errorType</tt></i>:</span></td>
<td>valid xpath error id</td>
</tr>
<tr>
<td><span class="term"><i><tt>arg</tt></i>:</span></td>
<td>the argument that cause xpath to fail</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellPrintXPathResult"></a>xmlShellPrintXPathResult ()</h3>
<pre class="programlisting">void	xmlShellPrintXPathResult	(<a href="libxml2-xpath.html#xmlXPathObjectPtr">xmlXPathObjectPtr</a> list)<br>
</pre>
<p>Prints result to the output FILE</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>list</tt></i>:</span></td>
<td>a valid result generated by an xpath evaluation</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellPwd"></a>xmlShellPwd ()</h3>
<pre class="programlisting">int	xmlShellPwd			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * buffer, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "pwd" Show the full path from the root to the node, if needed building thumblers when similar elements exists at a given ancestor level. The output is compatible with XPath commands.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>the output buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellSave"></a>xmlShellSave ()</h3>
<pre class="programlisting">int	xmlShellSave			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "save" Write the current document to the filename, or it's original name</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file name (optional)</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellValidate"></a>xmlShellValidate ()</h3>
<pre class="programlisting">int	xmlShellValidate		(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * dtd, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "validate" Validate the document, if a DTD path is provided, then the validation is done against the given DTD.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>the DTD URI (optional)</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlShellWrite"></a>xmlShellWrite ()</h3>
<pre class="programlisting">int	xmlShellWrite			(<a href="libxml2-debugXML.html#xmlShellCtxtPtr">xmlShellCtxtPtr</a> ctxt, <br>					 char * filename, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node2)<br>
</pre>
<p>Implements the XML shell function "write" Write the current node to the filename, it saves the serialization of the subtree under the @node specified</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the shell context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file name</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>a node in the tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>node2</tt></i>:</span></td>
<td>unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xlink.html000064400000040737151730335350014013 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xlink: unfinished XLink detection module</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xinclude.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlIO.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xlink</span></h2>
<p>xlink - unfinished XLink detection module</p>
<p>unfinished XLink detection module </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef enum <a href="#xlinkActuate">xlinkActuate</a>;
typedef <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * <a href="#xlinkHRef">xlinkHRef</a>;
typedef struct _xlinkHandler <a href="#xlinkHandler">xlinkHandler</a>;
typedef <a href="libxml2-xlink.html#xlinkHandler">xlinkHandler</a> * <a href="#xlinkHandlerPtr">xlinkHandlerPtr</a>;
typedef <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * <a href="#xlinkRole">xlinkRole</a>;
typedef enum <a href="#xlinkShow">xlinkShow</a>;
typedef <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * <a href="#xlinkTitle">xlinkTitle</a>;
typedef enum <a href="#xlinkType">xlinkType</a>;
typedef void <a href="#xlinkExtendedLinkFunk">xlinkExtendedLinkFunk</a>		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int nbLocators, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> * hrefs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * roles, <br>					 int nbArcs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * from, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * to, <br>					 <a href="libxml2-xlink.html#xlinkShow">xlinkShow</a> * show, <br>					 <a href="libxml2-xlink.html#xlinkActuate">xlinkActuate</a> * actuate, <br>					 int nbTitles, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> * titles, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langs);
typedef void <a href="#xlinkExtendedLinkSetFunk">xlinkExtendedLinkSetFunk</a>	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int nbLocators, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> * hrefs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * roles, <br>					 int nbTitles, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> * titles, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langs);
<a href="libxml2-xlink.html#xlinkNodeDetectFunc">xlinkNodeDetectFunc</a>	<a href="#xlinkGetDefaultDetect">xlinkGetDefaultDetect</a>	(void);
<a href="libxml2-xlink.html#xlinkHandlerPtr">xlinkHandlerPtr</a>	<a href="#xlinkGetDefaultHandler">xlinkGetDefaultHandler</a>	(void);
<a href="libxml2-xlink.html#xlinkType">xlinkType</a>	<a href="#xlinkIsLink">xlinkIsLink</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
typedef void <a href="#xlinkNodeDetectFunc">xlinkNodeDetectFunc</a>		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node);
void	<a href="#xlinkSetDefaultDetect">xlinkSetDefaultDetect</a>		(<a href="libxml2-xlink.html#xlinkNodeDetectFunc">xlinkNodeDetectFunc</a> func);
void	<a href="#xlinkSetDefaultHandler">xlinkSetDefaultHandler</a>		(<a href="libxml2-xlink.html#xlinkHandlerPtr">xlinkHandlerPtr</a> handler);
typedef void <a href="#xlinkSimpleLinkFunk">xlinkSimpleLinkFunk</a>		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> href, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> role, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> title);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xlinkActuate">Enum </a>xlinkActuate</h3>
<pre class="programlisting">enum <a href="#xlinkActuate">xlinkActuate</a> {
    <a name="XLINK_ACTUATE_NONE">XLINK_ACTUATE_NONE</a> = 0
    <a name="XLINK_ACTUATE_AUTO">XLINK_ACTUATE_AUTO</a> = 1
    <a name="XLINK_ACTUATE_ONREQUEST">XLINK_ACTUATE_ONREQUEST</a> = 2
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkHRef">Typedef </a>xlinkHRef</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * xlinkHRef;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkHandler">Structure </a>xlinkHandler</h3>
<pre class="programlisting">struct _xlinkHandler {
    <a href="libxml2-xlink.html#xlinkSimpleLinkFunk">xlinkSimpleLinkFunk</a>	simple
    <a href="libxml2-xlink.html#xlinkExtendedLinkFunk">xlinkExtendedLinkFunk</a>	extended
    <a href="libxml2-xlink.html#xlinkExtendedLinkSetFunk">xlinkExtendedLinkSetFunk</a>	set
} xlinkHandler;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkHandlerPtr">Typedef </a>xlinkHandlerPtr</h3>
<pre class="programlisting"><a href="libxml2-xlink.html#xlinkHandler">xlinkHandler</a> * xlinkHandlerPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkRole">Typedef </a>xlinkRole</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * xlinkRole;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkShow">Enum </a>xlinkShow</h3>
<pre class="programlisting">enum <a href="#xlinkShow">xlinkShow</a> {
    <a name="XLINK_SHOW_NONE">XLINK_SHOW_NONE</a> = 0
    <a name="XLINK_SHOW_NEW">XLINK_SHOW_NEW</a> = 1
    <a name="XLINK_SHOW_EMBED">XLINK_SHOW_EMBED</a> = 2
    <a name="XLINK_SHOW_REPLACE">XLINK_SHOW_REPLACE</a> = 3
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkTitle">Typedef </a>xlinkTitle</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * xlinkTitle;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkType">Enum </a>xlinkType</h3>
<pre class="programlisting">enum <a href="#xlinkType">xlinkType</a> {
    <a name="XLINK_TYPE_NONE">XLINK_TYPE_NONE</a> = 0
    <a name="XLINK_TYPE_SIMPLE">XLINK_TYPE_SIMPLE</a> = 1
    <a name="XLINK_TYPE_EXTENDED">XLINK_TYPE_EXTENDED</a> = 2
    <a name="XLINK_TYPE_EXTENDED_SET">XLINK_TYPE_EXTENDED_SET</a> = 3
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkExtendedLinkFunk"></a>Function type xlinkExtendedLinkFunk</h3>
<pre class="programlisting">void	xlinkExtendedLinkFunk		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int nbLocators, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> * hrefs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * roles, <br>					 int nbArcs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * from, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * to, <br>					 <a href="libxml2-xlink.html#xlinkShow">xlinkShow</a> * show, <br>					 <a href="libxml2-xlink.html#xlinkActuate">xlinkActuate</a> * actuate, <br>					 int nbTitles, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> * titles, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langs)<br>
</pre>
<p>This is the prototype for a extended link detection callback.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>user data pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node carrying the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbLocators</tt></i>:</span></td>
<td>the number of locators detected on the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>hrefs</tt></i>:</span></td>
<td>pointer to the array of locator hrefs</td>
</tr>
<tr>
<td><span class="term"><i><tt>roles</tt></i>:</span></td>
<td>pointer to the array of locator roles</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbArcs</tt></i>:</span></td>
<td>the number of arcs detected on the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>pointer to the array of source roles found on the arcs</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>pointer to the array of target roles found on the arcs</td>
</tr>
<tr>
<td><span class="term"><i><tt>show</tt></i>:</span></td>
<td>array of values for the show attributes found on the arcs</td>
</tr>
<tr>
<td><span class="term"><i><tt>actuate</tt></i>:</span></td>
<td>array of values for the actuate attributes found on the arcs</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbTitles</tt></i>:</span></td>
<td>the number of titles detected on the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>titles</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>langs</tt></i>:</span></td>
<td>array of xml:lang values for the titles</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkExtendedLinkSetFunk"></a>Function type xlinkExtendedLinkSetFunk</h3>
<pre class="programlisting">void	xlinkExtendedLinkSetFunk	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 int nbLocators, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> * hrefs, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> * roles, <br>					 int nbTitles, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> * titles, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** langs)<br>
</pre>
<p>This is the prototype for a extended link set detection callback.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>user data pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node carrying the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbLocators</tt></i>:</span></td>
<td>the number of locators detected on the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>hrefs</tt></i>:</span></td>
<td>pointer to the array of locator hrefs</td>
</tr>
<tr>
<td><span class="term"><i><tt>roles</tt></i>:</span></td>
<td>pointer to the array of locator roles</td>
</tr>
<tr>
<td><span class="term"><i><tt>nbTitles</tt></i>:</span></td>
<td>the number of titles detected on the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>titles</tt></i>:</span></td>
<td></td>
</tr>
<tr>
<td><span class="term"><i><tt>langs</tt></i>:</span></td>
<td>array of xml:lang values for the titles</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkNodeDetectFunc"></a>Function type xlinkNodeDetectFunc</h3>
<pre class="programlisting">void	xlinkNodeDetectFunc		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>This is the prototype for the link detection routine. It calls the default link detection callbacks upon link detection.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>user data pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node to check</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkSimpleLinkFunk"></a>Function type xlinkSimpleLinkFunk</h3>
<pre class="programlisting">void	xlinkSimpleLinkFunk		(void * ctx, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br>					 const <a href="libxml2-xlink.html#xlinkHRef">xlinkHRef</a> href, <br>					 const <a href="libxml2-xlink.html#xlinkRole">xlinkRole</a> role, <br>					 const <a href="libxml2-xlink.html#xlinkTitle">xlinkTitle</a> title)<br>
</pre>
<p>This is the prototype for a simple link detection callback.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>user data pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node carrying the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>href</tt></i>:</span></td>
<td>the target of the link</td>
</tr>
<tr>
<td><span class="term"><i><tt>role</tt></i>:</span></td>
<td>the role string</td>
</tr>
<tr>
<td><span class="term"><i><tt>title</tt></i>:</span></td>
<td>the link title</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkGetDefaultDetect"></a>xlinkGetDefaultDetect ()</h3>
<pre class="programlisting"><a href="libxml2-xlink.html#xlinkNodeDetectFunc">xlinkNodeDetectFunc</a>	xlinkGetDefaultDetect	(void)<br>
</pre>
<p>Get the default xlink detection routine</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current function or NULL;</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkGetDefaultHandler"></a>xlinkGetDefaultHandler ()</h3>
<pre class="programlisting"><a href="libxml2-xlink.html#xlinkHandlerPtr">xlinkHandlerPtr</a>	xlinkGetDefaultHandler	(void)<br>
</pre>
<p>Get the default xlink handler.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current <a href="libxml2-xlink.html#xlinkHandlerPtr">xlinkHandlerPtr</a> value.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkIsLink"></a>xlinkIsLink ()</h3>
<pre class="programlisting"><a href="libxml2-xlink.html#xlinkType">xlinkType</a>	xlinkIsLink		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> node)<br>
</pre>
<p>Check whether the given node carries the attributes needed to be a link element (or is one of the linking elements issued from the (X)HTML DtDs). This routine don't try to do full checking of the link validity but tries to detect and return the appropriate link type.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document containing the node</td>
</tr>
<tr>
<td><span class="term"><i><tt>node</tt></i>:</span></td>
<td>the node pointer itself</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-xlink.html#xlinkType">xlinkType</a> of the node (XLINK_TYPE_NONE if there is no link detected.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkSetDefaultDetect"></a>xlinkSetDefaultDetect ()</h3>
<pre class="programlisting">void	xlinkSetDefaultDetect		(<a href="libxml2-xlink.html#xlinkNodeDetectFunc">xlinkNodeDetectFunc</a> func)<br>
</pre>
<p>Set the default xlink detection routine</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>func</tt></i>:</span></td>
<td>pointer to the new detection routine.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xlinkSetDefaultHandler"></a>xlinkSetDefaultHandler ()</h3>
<pre class="programlisting">void	xlinkSetDefaultHandler		(<a href="libxml2-xlink.html#xlinkHandlerPtr">xlinkHandlerPtr</a> handler)<br>
</pre>
<p>Set the default xlink handlers</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the new value for the xlink handler block</td>
</tr></tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlerror.html000064400000244703151730335350014537 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlerror: error handling</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlautomata.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlexports.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlerror</span></h2>
<p>xmlerror - error handling</p>
<p>the API used to report errors </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlError <a href="#xmlError">xmlError</a>;
typedef enum <a href="#xmlErrorDomain">xmlErrorDomain</a>;
typedef enum <a href="#xmlErrorLevel">xmlErrorLevel</a>;
typedef <a href="libxml2-xmlerror.html#xmlError">xmlError</a> * <a href="#xmlErrorPtr">xmlErrorPtr</a>;
typedef enum <a href="#xmlParserErrors">xmlParserErrors</a>;
void	<a href="#initGenericErrorDefaultFunc">initGenericErrorDefaultFunc</a>	(<a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> * handler);
int	<a href="#xmlCopyError">xmlCopyError</a>			(<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> from, <br>					 <a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> to);
<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a>	<a href="#xmlCtxtGetLastError">xmlCtxtGetLastError</a>	(void * ctx);
void	<a href="#xmlCtxtResetLastError">xmlCtxtResetLastError</a>		(void * ctx);
typedef void <a href="#xmlGenericErrorFunc">xmlGenericErrorFunc</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a>	<a href="#xmlGetLastError">xmlGetLastError</a>		(void);
void	<a href="#xmlParserError">xmlParserError</a>			(void * ctx, <br>					 const char * msg, <br>					 ... ...);
void	<a href="#xmlParserPrintFileContext">xmlParserPrintFileContext</a>	(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input);
void	<a href="#xmlParserPrintFileInfo">xmlParserPrintFileInfo</a>		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input);
void	<a href="#xmlParserValidityError">xmlParserValidityError</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
void	<a href="#xmlParserValidityWarning">xmlParserValidityWarning</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
void	<a href="#xmlParserWarning">xmlParserWarning</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
void	<a href="#xmlResetError">xmlResetError</a>			(<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> err);
void	<a href="#xmlResetLastError">xmlResetLastError</a>		(void);
void	<a href="#xmlSetGenericErrorFunc">xmlSetGenericErrorFunc</a>		(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> handler);
void	<a href="#xmlSetStructuredErrorFunc">xmlSetStructuredErrorFunc</a>	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> handler);
typedef void <a href="#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a>		(void * userData, <br>					 <a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> error);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlError">Structure </a>xmlError</h3>
<pre class="programlisting">struct _xmlError {
    int	domain	: What part of the library raised this error
    int	code	: The error code, e.g. an <a href="libxml2-xmlerror.html#xmlParserError">xmlParserError</a>
    char *	message	: human-readable informative error message
    <a href="libxml2-xmlerror.html#xmlErrorLevel">xmlErrorLevel</a>	level	: how consequent is the error
    char *	file	: the filename
    int	line	: the line number if available
    char *	str1	: extra string information
    char *	str2	: extra string information
    char *	str3	: extra string information
    int	int1	: extra number information
    int	int2	: error column # or 0 if N/A (todo: rename field when we would brk ABI)
    void *	ctxt	: the parser context if available
    void *	node	: the node in the tree
} xmlError;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlErrorDomain">Enum </a>xmlErrorDomain</h3>
<pre class="programlisting">enum <a href="#xmlErrorDomain">xmlErrorDomain</a> {
    <a name="XML_FROM_NONE">XML_FROM_NONE</a> = 0
    <a name="XML_FROM_PARSER">XML_FROM_PARSER</a> = 1 /* The XML parser */
    <a name="XML_FROM_TREE">XML_FROM_TREE</a> = 2 /* The tree module */
    <a name="XML_FROM_NAMESPACE">XML_FROM_NAMESPACE</a> = 3 /* The XML Namespace module */
    <a name="XML_FROM_DTD">XML_FROM_DTD</a> = 4 /* The XML DTD validation with parser contex */
    <a name="XML_FROM_HTML">XML_FROM_HTML</a> = 5 /* The HTML parser */
    <a name="XML_FROM_MEMORY">XML_FROM_MEMORY</a> = 6 /* The memory allocator */
    <a name="XML_FROM_OUTPUT">XML_FROM_OUTPUT</a> = 7 /* The serialization code */
    <a name="XML_FROM_IO">XML_FROM_IO</a> = 8 /* The Input/Output stack */
    <a name="XML_FROM_FTP">XML_FROM_FTP</a> = 9 /* The FTP module */
    <a name="XML_FROM_HTTP">XML_FROM_HTTP</a> = 10 /* The HTTP module */
    <a name="XML_FROM_XINCLUDE">XML_FROM_XINCLUDE</a> = 11 /* The XInclude processing */
    <a name="XML_FROM_XPATH">XML_FROM_XPATH</a> = 12 /* The XPath module */
    <a name="XML_FROM_XPOINTER">XML_FROM_XPOINTER</a> = 13 /* The XPointer module */
    <a name="XML_FROM_REGEXP">XML_FROM_REGEXP</a> = 14 /* The regular expressions module */
    <a name="XML_FROM_DATATYPE">XML_FROM_DATATYPE</a> = 15 /* The W3C XML Schemas Datatype module */
    <a name="XML_FROM_SCHEMASP">XML_FROM_SCHEMASP</a> = 16 /* The W3C XML Schemas parser module */
    <a name="XML_FROM_SCHEMASV">XML_FROM_SCHEMASV</a> = 17 /* The W3C XML Schemas validation module */
    <a name="XML_FROM_RELAXNGP">XML_FROM_RELAXNGP</a> = 18 /* The Relax-NG parser module */
    <a name="XML_FROM_RELAXNGV">XML_FROM_RELAXNGV</a> = 19 /* The Relax-NG validator module */
    <a name="XML_FROM_CATALOG">XML_FROM_CATALOG</a> = 20 /* The Catalog module */
    <a name="XML_FROM_C14N">XML_FROM_C14N</a> = 21 /* The Canonicalization module */
    <a name="XML_FROM_XSLT">XML_FROM_XSLT</a> = 22 /* The XSLT engine from libxslt */
    <a name="XML_FROM_VALID">XML_FROM_VALID</a> = 23 /* The XML DTD validation with valid context */
    <a name="XML_FROM_CHECK">XML_FROM_CHECK</a> = 24 /* The error checking module */
    <a name="XML_FROM_WRITER">XML_FROM_WRITER</a> = 25 /* The xmlwriter module */
    <a name="XML_FROM_MODULE">XML_FROM_MODULE</a> = 26 /* The dynamically loaded module modul */
    <a name="XML_FROM_I18N">XML_FROM_I18N</a> = 27 /* The module handling character conversion */
    <a name="XML_FROM_SCHEMATRONV">XML_FROM_SCHEMATRONV</a> = 28 /* The Schematron validator module */
    <a name="XML_FROM_BUFFER">XML_FROM_BUFFER</a> = 29 /* The buffers module */
    <a name="XML_FROM_URI">XML_FROM_URI</a> = 30 /*  The URI module */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlErrorLevel">Enum </a>xmlErrorLevel</h3>
<pre class="programlisting">enum <a href="#xmlErrorLevel">xmlErrorLevel</a> {
    <a name="XML_ERR_NONE">XML_ERR_NONE</a> = 0
    <a name="XML_ERR_WARNING">XML_ERR_WARNING</a> = 1 /* A simple warning */
    <a name="XML_ERR_ERROR">XML_ERR_ERROR</a> = 2 /* A recoverable error */
    <a name="XML_ERR_FATAL">XML_ERR_FATAL</a> = 3 /*  A fatal error */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlErrorPtr">Typedef </a>xmlErrorPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlError">xmlError</a> * xmlErrorPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserErrors">Enum </a>xmlParserErrors</h3>
<pre class="programlisting">enum <a href="#xmlParserErrors">xmlParserErrors</a> {
    <a name="XML_ERR_OK">XML_ERR_OK</a> = 0
    <a name="XML_ERR_INTERNAL_ERROR">XML_ERR_INTERNAL_ERROR</a> = 1 /* 1 */
    <a name="XML_ERR_NO_MEMORY">XML_ERR_NO_MEMORY</a> = 2 /* 2 */
    <a name="XML_ERR_DOCUMENT_START">XML_ERR_DOCUMENT_START</a> = 3 /* 3 */
    <a name="XML_ERR_DOCUMENT_EMPTY">XML_ERR_DOCUMENT_EMPTY</a> = 4 /* 4 */
    <a name="XML_ERR_DOCUMENT_END">XML_ERR_DOCUMENT_END</a> = 5 /* 5 */
    <a name="XML_ERR_INVALID_HEX_CHARREF">XML_ERR_INVALID_HEX_CHARREF</a> = 6 /* 6 */
    <a name="XML_ERR_INVALID_DEC_CHARREF">XML_ERR_INVALID_DEC_CHARREF</a> = 7 /* 7 */
    <a name="XML_ERR_INVALID_CHARREF">XML_ERR_INVALID_CHARREF</a> = 8 /* 8 */
    <a name="XML_ERR_INVALID_CHAR">XML_ERR_INVALID_CHAR</a> = 9 /* 9 */
    <a name="XML_ERR_CHARREF_AT_EOF">XML_ERR_CHARREF_AT_EOF</a> = 10 /* 10 */
    <a name="XML_ERR_CHARREF_IN_PROLOG">XML_ERR_CHARREF_IN_PROLOG</a> = 11 /* 11 */
    <a name="XML_ERR_CHARREF_IN_EPILOG">XML_ERR_CHARREF_IN_EPILOG</a> = 12 /* 12 */
    <a name="XML_ERR_CHARREF_IN_DTD">XML_ERR_CHARREF_IN_DTD</a> = 13 /* 13 */
    <a name="XML_ERR_ENTITYREF_AT_EOF">XML_ERR_ENTITYREF_AT_EOF</a> = 14 /* 14 */
    <a name="XML_ERR_ENTITYREF_IN_PROLOG">XML_ERR_ENTITYREF_IN_PROLOG</a> = 15 /* 15 */
    <a name="XML_ERR_ENTITYREF_IN_EPILOG">XML_ERR_ENTITYREF_IN_EPILOG</a> = 16 /* 16 */
    <a name="XML_ERR_ENTITYREF_IN_DTD">XML_ERR_ENTITYREF_IN_DTD</a> = 17 /* 17 */
    <a name="XML_ERR_PEREF_AT_EOF">XML_ERR_PEREF_AT_EOF</a> = 18 /* 18 */
    <a name="XML_ERR_PEREF_IN_PROLOG">XML_ERR_PEREF_IN_PROLOG</a> = 19 /* 19 */
    <a name="XML_ERR_PEREF_IN_EPILOG">XML_ERR_PEREF_IN_EPILOG</a> = 20 /* 20 */
    <a name="XML_ERR_PEREF_IN_INT_SUBSET">XML_ERR_PEREF_IN_INT_SUBSET</a> = 21 /* 21 */
    <a name="XML_ERR_ENTITYREF_NO_NAME">XML_ERR_ENTITYREF_NO_NAME</a> = 22 /* 22 */
    <a name="XML_ERR_ENTITYREF_SEMICOL_MISSING">XML_ERR_ENTITYREF_SEMICOL_MISSING</a> = 23 /* 23 */
    <a name="XML_ERR_PEREF_NO_NAME">XML_ERR_PEREF_NO_NAME</a> = 24 /* 24 */
    <a name="XML_ERR_PEREF_SEMICOL_MISSING">XML_ERR_PEREF_SEMICOL_MISSING</a> = 25 /* 25 */
    <a name="XML_ERR_UNDECLARED_ENTITY">XML_ERR_UNDECLARED_ENTITY</a> = 26 /* 26 */
    <a name="XML_WAR_UNDECLARED_ENTITY">XML_WAR_UNDECLARED_ENTITY</a> = 27 /* 27 */
    <a name="XML_ERR_UNPARSED_ENTITY">XML_ERR_UNPARSED_ENTITY</a> = 28 /* 28 */
    <a name="XML_ERR_ENTITY_IS_EXTERNAL">XML_ERR_ENTITY_IS_EXTERNAL</a> = 29 /* 29 */
    <a name="XML_ERR_ENTITY_IS_PARAMETER">XML_ERR_ENTITY_IS_PARAMETER</a> = 30 /* 30 */
    <a name="XML_ERR_UNKNOWN_ENCODING">XML_ERR_UNKNOWN_ENCODING</a> = 31 /* 31 */
    <a name="XML_ERR_UNSUPPORTED_ENCODING">XML_ERR_UNSUPPORTED_ENCODING</a> = 32 /* 32 */
    <a name="XML_ERR_STRING_NOT_STARTED">XML_ERR_STRING_NOT_STARTED</a> = 33 /* 33 */
    <a name="XML_ERR_STRING_NOT_CLOSED">XML_ERR_STRING_NOT_CLOSED</a> = 34 /* 34 */
    <a name="XML_ERR_NS_DECL_ERROR">XML_ERR_NS_DECL_ERROR</a> = 35 /* 35 */
    <a name="XML_ERR_ENTITY_NOT_STARTED">XML_ERR_ENTITY_NOT_STARTED</a> = 36 /* 36 */
    <a name="XML_ERR_ENTITY_NOT_FINISHED">XML_ERR_ENTITY_NOT_FINISHED</a> = 37 /* 37 */
    <a name="XML_ERR_LT_IN_ATTRIBUTE">XML_ERR_LT_IN_ATTRIBUTE</a> = 38 /* 38 */
    <a name="XML_ERR_ATTRIBUTE_NOT_STARTED">XML_ERR_ATTRIBUTE_NOT_STARTED</a> = 39 /* 39 */
    <a name="XML_ERR_ATTRIBUTE_NOT_FINISHED">XML_ERR_ATTRIBUTE_NOT_FINISHED</a> = 40 /* 40 */
    <a name="XML_ERR_ATTRIBUTE_WITHOUT_VALUE">XML_ERR_ATTRIBUTE_WITHOUT_VALUE</a> = 41 /* 41 */
    <a name="XML_ERR_ATTRIBUTE_REDEFINED">XML_ERR_ATTRIBUTE_REDEFINED</a> = 42 /* 42 */
    <a name="XML_ERR_LITERAL_NOT_STARTED">XML_ERR_LITERAL_NOT_STARTED</a> = 43 /* 43 */
    <a name="XML_ERR_LITERAL_NOT_FINISHED">XML_ERR_LITERAL_NOT_FINISHED</a> = 44 /* 44 */
    <a name="XML_ERR_COMMENT_NOT_FINISHED">XML_ERR_COMMENT_NOT_FINISHED</a> = 45 /* 45 */
    <a name="XML_ERR_PI_NOT_STARTED">XML_ERR_PI_NOT_STARTED</a> = 46 /* 46 */
    <a name="XML_ERR_PI_NOT_FINISHED">XML_ERR_PI_NOT_FINISHED</a> = 47 /* 47 */
    <a name="XML_ERR_NOTATION_NOT_STARTED">XML_ERR_NOTATION_NOT_STARTED</a> = 48 /* 48 */
    <a name="XML_ERR_NOTATION_NOT_FINISHED">XML_ERR_NOTATION_NOT_FINISHED</a> = 49 /* 49 */
    <a name="XML_ERR_ATTLIST_NOT_STARTED">XML_ERR_ATTLIST_NOT_STARTED</a> = 50 /* 50 */
    <a name="XML_ERR_ATTLIST_NOT_FINISHED">XML_ERR_ATTLIST_NOT_FINISHED</a> = 51 /* 51 */
    <a name="XML_ERR_MIXED_NOT_STARTED">XML_ERR_MIXED_NOT_STARTED</a> = 52 /* 52 */
    <a name="XML_ERR_MIXED_NOT_FINISHED">XML_ERR_MIXED_NOT_FINISHED</a> = 53 /* 53 */
    <a name="XML_ERR_ELEMCONTENT_NOT_STARTED">XML_ERR_ELEMCONTENT_NOT_STARTED</a> = 54 /* 54 */
    <a name="XML_ERR_ELEMCONTENT_NOT_FINISHED">XML_ERR_ELEMCONTENT_NOT_FINISHED</a> = 55 /* 55 */
    <a name="XML_ERR_XMLDECL_NOT_STARTED">XML_ERR_XMLDECL_NOT_STARTED</a> = 56 /* 56 */
    <a name="XML_ERR_XMLDECL_NOT_FINISHED">XML_ERR_XMLDECL_NOT_FINISHED</a> = 57 /* 57 */
    <a name="XML_ERR_CONDSEC_NOT_STARTED">XML_ERR_CONDSEC_NOT_STARTED</a> = 58 /* 58 */
    <a name="XML_ERR_CONDSEC_NOT_FINISHED">XML_ERR_CONDSEC_NOT_FINISHED</a> = 59 /* 59 */
    <a name="XML_ERR_EXT_SUBSET_NOT_FINISHED">XML_ERR_EXT_SUBSET_NOT_FINISHED</a> = 60 /* 60 */
    <a name="XML_ERR_DOCTYPE_NOT_FINISHED">XML_ERR_DOCTYPE_NOT_FINISHED</a> = 61 /* 61 */
    <a name="XML_ERR_MISPLACED_CDATA_END">XML_ERR_MISPLACED_CDATA_END</a> = 62 /* 62 */
    <a name="XML_ERR_CDATA_NOT_FINISHED">XML_ERR_CDATA_NOT_FINISHED</a> = 63 /* 63 */
    <a name="XML_ERR_RESERVED_XML_NAME">XML_ERR_RESERVED_XML_NAME</a> = 64 /* 64 */
    <a name="XML_ERR_SPACE_REQUIRED">XML_ERR_SPACE_REQUIRED</a> = 65 /* 65 */
    <a name="XML_ERR_SEPARATOR_REQUIRED">XML_ERR_SEPARATOR_REQUIRED</a> = 66 /* 66 */
    <a name="XML_ERR_NMTOKEN_REQUIRED">XML_ERR_NMTOKEN_REQUIRED</a> = 67 /* 67 */
    <a name="XML_ERR_NAME_REQUIRED">XML_ERR_NAME_REQUIRED</a> = 68 /* 68 */
    <a name="XML_ERR_PCDATA_REQUIRED">XML_ERR_PCDATA_REQUIRED</a> = 69 /* 69 */
    <a name="XML_ERR_URI_REQUIRED">XML_ERR_URI_REQUIRED</a> = 70 /* 70 */
    <a name="XML_ERR_PUBID_REQUIRED">XML_ERR_PUBID_REQUIRED</a> = 71 /* 71 */
    <a name="XML_ERR_LT_REQUIRED">XML_ERR_LT_REQUIRED</a> = 72 /* 72 */
    <a name="XML_ERR_GT_REQUIRED">XML_ERR_GT_REQUIRED</a> = 73 /* 73 */
    <a name="XML_ERR_LTSLASH_REQUIRED">XML_ERR_LTSLASH_REQUIRED</a> = 74 /* 74 */
    <a name="XML_ERR_EQUAL_REQUIRED">XML_ERR_EQUAL_REQUIRED</a> = 75 /* 75 */
    <a name="XML_ERR_TAG_NAME_MISMATCH">XML_ERR_TAG_NAME_MISMATCH</a> = 76 /* 76 */
    <a name="XML_ERR_TAG_NOT_FINISHED">XML_ERR_TAG_NOT_FINISHED</a> = 77 /* 77 */
    <a name="XML_ERR_STANDALONE_VALUE">XML_ERR_STANDALONE_VALUE</a> = 78 /* 78 */
    <a name="XML_ERR_ENCODING_NAME">XML_ERR_ENCODING_NAME</a> = 79 /* 79 */
    <a name="XML_ERR_HYPHEN_IN_COMMENT">XML_ERR_HYPHEN_IN_COMMENT</a> = 80 /* 80 */
    <a name="XML_ERR_INVALID_ENCODING">XML_ERR_INVALID_ENCODING</a> = 81 /* 81 */
    <a name="XML_ERR_EXT_ENTITY_STANDALONE">XML_ERR_EXT_ENTITY_STANDALONE</a> = 82 /* 82 */
    <a name="XML_ERR_CONDSEC_INVALID">XML_ERR_CONDSEC_INVALID</a> = 83 /* 83 */
    <a name="XML_ERR_VALUE_REQUIRED">XML_ERR_VALUE_REQUIRED</a> = 84 /* 84 */
    <a name="XML_ERR_NOT_WELL_BALANCED">XML_ERR_NOT_WELL_BALANCED</a> = 85 /* 85 */
    <a name="XML_ERR_EXTRA_CONTENT">XML_ERR_EXTRA_CONTENT</a> = 86 /* 86 */
    <a name="XML_ERR_ENTITY_CHAR_ERROR">XML_ERR_ENTITY_CHAR_ERROR</a> = 87 /* 87 */
    <a name="XML_ERR_ENTITY_PE_INTERNAL">XML_ERR_ENTITY_PE_INTERNAL</a> = 88 /* 88 */
    <a name="XML_ERR_ENTITY_LOOP">XML_ERR_ENTITY_LOOP</a> = 89 /* 89 */
    <a name="XML_ERR_ENTITY_BOUNDARY">XML_ERR_ENTITY_BOUNDARY</a> = 90 /* 90 */
    <a name="XML_ERR_INVALID_URI">XML_ERR_INVALID_URI</a> = 91 /* 91 */
    <a name="XML_ERR_URI_FRAGMENT">XML_ERR_URI_FRAGMENT</a> = 92 /* 92 */
    <a name="XML_WAR_CATALOG_PI">XML_WAR_CATALOG_PI</a> = 93 /* 93 */
    <a name="XML_ERR_NO_DTD">XML_ERR_NO_DTD</a> = 94 /* 94 */
    <a name="XML_ERR_CONDSEC_INVALID_KEYWORD">XML_ERR_CONDSEC_INVALID_KEYWORD</a> = 95 /* 95 */
    <a name="XML_ERR_VERSION_MISSING">XML_ERR_VERSION_MISSING</a> = 96 /* 96 */
    <a name="XML_WAR_UNKNOWN_VERSION">XML_WAR_UNKNOWN_VERSION</a> = 97 /* 97 */
    <a name="XML_WAR_LANG_VALUE">XML_WAR_LANG_VALUE</a> = 98 /* 98 */
    <a name="XML_WAR_NS_URI">XML_WAR_NS_URI</a> = 99 /* 99 */
    <a name="XML_WAR_NS_URI_RELATIVE">XML_WAR_NS_URI_RELATIVE</a> = 100 /* 100 */
    <a name="XML_ERR_MISSING_ENCODING">XML_ERR_MISSING_ENCODING</a> = 101 /* 101 */
    <a name="XML_WAR_SPACE_VALUE">XML_WAR_SPACE_VALUE</a> = 102 /* 102 */
    <a name="XML_ERR_NOT_STANDALONE">XML_ERR_NOT_STANDALONE</a> = 103 /* 103 */
    <a name="XML_ERR_ENTITY_PROCESSING">XML_ERR_ENTITY_PROCESSING</a> = 104 /* 104 */
    <a name="XML_ERR_NOTATION_PROCESSING">XML_ERR_NOTATION_PROCESSING</a> = 105 /* 105 */
    <a name="XML_WAR_NS_COLUMN">XML_WAR_NS_COLUMN</a> = 106 /* 106 */
    <a name="XML_WAR_ENTITY_REDEFINED">XML_WAR_ENTITY_REDEFINED</a> = 107 /* 107 */
    <a name="XML_ERR_UNKNOWN_VERSION">XML_ERR_UNKNOWN_VERSION</a> = 108 /* 108 */
    <a name="XML_ERR_VERSION_MISMATCH">XML_ERR_VERSION_MISMATCH</a> = 109 /* 109 */
    <a name="XML_ERR_NAME_TOO_LONG">XML_ERR_NAME_TOO_LONG</a> = 110 /* 110 */
    <a name="XML_ERR_USER_STOP">XML_ERR_USER_STOP</a> = 111 /* 111 */
    <a name="XML_ERR_COMMENT_ABRUPTLY_ENDED">XML_ERR_COMMENT_ABRUPTLY_ENDED</a> = 112 /* 112 */
    <a name="XML_NS_ERR_XML_NAMESPACE">XML_NS_ERR_XML_NAMESPACE</a> = 200
    <a name="XML_NS_ERR_UNDEFINED_NAMESPACE">XML_NS_ERR_UNDEFINED_NAMESPACE</a> = 201 /* 201 */
    <a name="XML_NS_ERR_QNAME">XML_NS_ERR_QNAME</a> = 202 /* 202 */
    <a name="XML_NS_ERR_ATTRIBUTE_REDEFINED">XML_NS_ERR_ATTRIBUTE_REDEFINED</a> = 203 /* 203 */
    <a name="XML_NS_ERR_EMPTY">XML_NS_ERR_EMPTY</a> = 204 /* 204 */
    <a name="XML_NS_ERR_COLON">XML_NS_ERR_COLON</a> = 205 /* 205 */
    <a name="XML_DTD_ATTRIBUTE_DEFAULT">XML_DTD_ATTRIBUTE_DEFAULT</a> = 500
    <a name="XML_DTD_ATTRIBUTE_REDEFINED">XML_DTD_ATTRIBUTE_REDEFINED</a> = 501 /* 501 */
    <a name="XML_DTD_ATTRIBUTE_VALUE">XML_DTD_ATTRIBUTE_VALUE</a> = 502 /* 502 */
    <a name="XML_DTD_CONTENT_ERROR">XML_DTD_CONTENT_ERROR</a> = 503 /* 503 */
    <a name="XML_DTD_CONTENT_MODEL">XML_DTD_CONTENT_MODEL</a> = 504 /* 504 */
    <a name="XML_DTD_CONTENT_NOT_DETERMINIST">XML_DTD_CONTENT_NOT_DETERMINIST</a> = 505 /* 505 */
    <a name="XML_DTD_DIFFERENT_PREFIX">XML_DTD_DIFFERENT_PREFIX</a> = 506 /* 506 */
    <a name="XML_DTD_ELEM_DEFAULT_NAMESPACE">XML_DTD_ELEM_DEFAULT_NAMESPACE</a> = 507 /* 507 */
    <a name="XML_DTD_ELEM_NAMESPACE">XML_DTD_ELEM_NAMESPACE</a> = 508 /* 508 */
    <a name="XML_DTD_ELEM_REDEFINED">XML_DTD_ELEM_REDEFINED</a> = 509 /* 509 */
    <a name="XML_DTD_EMPTY_NOTATION">XML_DTD_EMPTY_NOTATION</a> = 510 /* 510 */
    <a name="XML_DTD_ENTITY_TYPE">XML_DTD_ENTITY_TYPE</a> = 511 /* 511 */
    <a name="XML_DTD_ID_FIXED">XML_DTD_ID_FIXED</a> = 512 /* 512 */
    <a name="XML_DTD_ID_REDEFINED">XML_DTD_ID_REDEFINED</a> = 513 /* 513 */
    <a name="XML_DTD_ID_SUBSET">XML_DTD_ID_SUBSET</a> = 514 /* 514 */
    <a name="XML_DTD_INVALID_CHILD">XML_DTD_INVALID_CHILD</a> = 515 /* 515 */
    <a name="XML_DTD_INVALID_DEFAULT">XML_DTD_INVALID_DEFAULT</a> = 516 /* 516 */
    <a name="XML_DTD_LOAD_ERROR">XML_DTD_LOAD_ERROR</a> = 517 /* 517 */
    <a name="XML_DTD_MISSING_ATTRIBUTE">XML_DTD_MISSING_ATTRIBUTE</a> = 518 /* 518 */
    <a name="XML_DTD_MIXED_CORRUPT">XML_DTD_MIXED_CORRUPT</a> = 519 /* 519 */
    <a name="XML_DTD_MULTIPLE_ID">XML_DTD_MULTIPLE_ID</a> = 520 /* 520 */
    <a name="XML_DTD_NO_DOC">XML_DTD_NO_DOC</a> = 521 /* 521 */
    <a name="XML_DTD_NO_DTD">XML_DTD_NO_DTD</a> = 522 /* 522 */
    <a name="XML_DTD_NO_ELEM_NAME">XML_DTD_NO_ELEM_NAME</a> = 523 /* 523 */
    <a name="XML_DTD_NO_PREFIX">XML_DTD_NO_PREFIX</a> = 524 /* 524 */
    <a name="XML_DTD_NO_ROOT">XML_DTD_NO_ROOT</a> = 525 /* 525 */
    <a name="XML_DTD_NOTATION_REDEFINED">XML_DTD_NOTATION_REDEFINED</a> = 526 /* 526 */
    <a name="XML_DTD_NOTATION_VALUE">XML_DTD_NOTATION_VALUE</a> = 527 /* 527 */
    <a name="XML_DTD_NOT_EMPTY">XML_DTD_NOT_EMPTY</a> = 528 /* 528 */
    <a name="XML_DTD_NOT_PCDATA">XML_DTD_NOT_PCDATA</a> = 529 /* 529 */
    <a name="XML_DTD_NOT_STANDALONE">XML_DTD_NOT_STANDALONE</a> = 530 /* 530 */
    <a name="XML_DTD_ROOT_NAME">XML_DTD_ROOT_NAME</a> = 531 /* 531 */
    <a name="XML_DTD_STANDALONE_WHITE_SPACE">XML_DTD_STANDALONE_WHITE_SPACE</a> = 532 /* 532 */
    <a name="XML_DTD_UNKNOWN_ATTRIBUTE">XML_DTD_UNKNOWN_ATTRIBUTE</a> = 533 /* 533 */
    <a name="XML_DTD_UNKNOWN_ELEM">XML_DTD_UNKNOWN_ELEM</a> = 534 /* 534 */
    <a name="XML_DTD_UNKNOWN_ENTITY">XML_DTD_UNKNOWN_ENTITY</a> = 535 /* 535 */
    <a name="XML_DTD_UNKNOWN_ID">XML_DTD_UNKNOWN_ID</a> = 536 /* 536 */
    <a name="XML_DTD_UNKNOWN_NOTATION">XML_DTD_UNKNOWN_NOTATION</a> = 537 /* 537 */
    <a name="XML_DTD_STANDALONE_DEFAULTED">XML_DTD_STANDALONE_DEFAULTED</a> = 538 /* 538 */
    <a name="XML_DTD_XMLID_VALUE">XML_DTD_XMLID_VALUE</a> = 539 /* 539 */
    <a name="XML_DTD_XMLID_TYPE">XML_DTD_XMLID_TYPE</a> = 540 /* 540 */
    <a name="XML_DTD_DUP_TOKEN">XML_DTD_DUP_TOKEN</a> = 541 /* 541 */
    <a name="XML_HTML_STRUCURE_ERROR">XML_HTML_STRUCURE_ERROR</a> = 800
    <a name="XML_HTML_UNKNOWN_TAG">XML_HTML_UNKNOWN_TAG</a> = 801 /* 801 */
    <a name="XML_HTML_INCORRECTLY_OPENED_COMMENT">XML_HTML_INCORRECTLY_OPENED_COMMENT</a> = 802 /* 802 */
    <a name="XML_RNGP_ANYNAME_ATTR_ANCESTOR">XML_RNGP_ANYNAME_ATTR_ANCESTOR</a> = 1000
    <a name="XML_RNGP_ATTR_CONFLICT">XML_RNGP_ATTR_CONFLICT</a> = 1001 /* 1001 */
    <a name="XML_RNGP_ATTRIBUTE_CHILDREN">XML_RNGP_ATTRIBUTE_CHILDREN</a> = 1002 /* 1002 */
    <a name="XML_RNGP_ATTRIBUTE_CONTENT">XML_RNGP_ATTRIBUTE_CONTENT</a> = 1003 /* 1003 */
    <a name="XML_RNGP_ATTRIBUTE_EMPTY">XML_RNGP_ATTRIBUTE_EMPTY</a> = 1004 /* 1004 */
    <a name="XML_RNGP_ATTRIBUTE_NOOP">XML_RNGP_ATTRIBUTE_NOOP</a> = 1005 /* 1005 */
    <a name="XML_RNGP_CHOICE_CONTENT">XML_RNGP_CHOICE_CONTENT</a> = 1006 /* 1006 */
    <a name="XML_RNGP_CHOICE_EMPTY">XML_RNGP_CHOICE_EMPTY</a> = 1007 /* 1007 */
    <a name="XML_RNGP_CREATE_FAILURE">XML_RNGP_CREATE_FAILURE</a> = 1008 /* 1008 */
    <a name="XML_RNGP_DATA_CONTENT">XML_RNGP_DATA_CONTENT</a> = 1009 /* 1009 */
    <a name="XML_RNGP_DEF_CHOICE_AND_INTERLEAVE">XML_RNGP_DEF_CHOICE_AND_INTERLEAVE</a> = 1010 /* 1010 */
    <a name="XML_RNGP_DEFINE_CREATE_FAILED">XML_RNGP_DEFINE_CREATE_FAILED</a> = 1011 /* 1011 */
    <a name="XML_RNGP_DEFINE_EMPTY">XML_RNGP_DEFINE_EMPTY</a> = 1012 /* 1012 */
    <a name="XML_RNGP_DEFINE_MISSING">XML_RNGP_DEFINE_MISSING</a> = 1013 /* 1013 */
    <a name="XML_RNGP_DEFINE_NAME_MISSING">XML_RNGP_DEFINE_NAME_MISSING</a> = 1014 /* 1014 */
    <a name="XML_RNGP_ELEM_CONTENT_EMPTY">XML_RNGP_ELEM_CONTENT_EMPTY</a> = 1015 /* 1015 */
    <a name="XML_RNGP_ELEM_CONTENT_ERROR">XML_RNGP_ELEM_CONTENT_ERROR</a> = 1016 /* 1016 */
    <a name="XML_RNGP_ELEMENT_EMPTY">XML_RNGP_ELEMENT_EMPTY</a> = 1017 /* 1017 */
    <a name="XML_RNGP_ELEMENT_CONTENT">XML_RNGP_ELEMENT_CONTENT</a> = 1018 /* 1018 */
    <a name="XML_RNGP_ELEMENT_NAME">XML_RNGP_ELEMENT_NAME</a> = 1019 /* 1019 */
    <a name="XML_RNGP_ELEMENT_NO_CONTENT">XML_RNGP_ELEMENT_NO_CONTENT</a> = 1020 /* 1020 */
    <a name="XML_RNGP_ELEM_TEXT_CONFLICT">XML_RNGP_ELEM_TEXT_CONFLICT</a> = 1021 /* 1021 */
    <a name="XML_RNGP_EMPTY">XML_RNGP_EMPTY</a> = 1022 /* 1022 */
    <a name="XML_RNGP_EMPTY_CONSTRUCT">XML_RNGP_EMPTY_CONSTRUCT</a> = 1023 /* 1023 */
    <a name="XML_RNGP_EMPTY_CONTENT">XML_RNGP_EMPTY_CONTENT</a> = 1024 /* 1024 */
    <a name="XML_RNGP_EMPTY_NOT_EMPTY">XML_RNGP_EMPTY_NOT_EMPTY</a> = 1025 /* 1025 */
    <a name="XML_RNGP_ERROR_TYPE_LIB">XML_RNGP_ERROR_TYPE_LIB</a> = 1026 /* 1026 */
    <a name="XML_RNGP_EXCEPT_EMPTY">XML_RNGP_EXCEPT_EMPTY</a> = 1027 /* 1027 */
    <a name="XML_RNGP_EXCEPT_MISSING">XML_RNGP_EXCEPT_MISSING</a> = 1028 /* 1028 */
    <a name="XML_RNGP_EXCEPT_MULTIPLE">XML_RNGP_EXCEPT_MULTIPLE</a> = 1029 /* 1029 */
    <a name="XML_RNGP_EXCEPT_NO_CONTENT">XML_RNGP_EXCEPT_NO_CONTENT</a> = 1030 /* 1030 */
    <a name="XML_RNGP_EXTERNALREF_EMTPY">XML_RNGP_EXTERNALREF_EMTPY</a> = 1031 /* 1031 */
    <a name="XML_RNGP_EXTERNAL_REF_FAILURE">XML_RNGP_EXTERNAL_REF_FAILURE</a> = 1032 /* 1032 */
    <a name="XML_RNGP_EXTERNALREF_RECURSE">XML_RNGP_EXTERNALREF_RECURSE</a> = 1033 /* 1033 */
    <a name="XML_RNGP_FORBIDDEN_ATTRIBUTE">XML_RNGP_FORBIDDEN_ATTRIBUTE</a> = 1034 /* 1034 */
    <a name="XML_RNGP_FOREIGN_ELEMENT">XML_RNGP_FOREIGN_ELEMENT</a> = 1035 /* 1035 */
    <a name="XML_RNGP_GRAMMAR_CONTENT">XML_RNGP_GRAMMAR_CONTENT</a> = 1036 /* 1036 */
    <a name="XML_RNGP_GRAMMAR_EMPTY">XML_RNGP_GRAMMAR_EMPTY</a> = 1037 /* 1037 */
    <a name="XML_RNGP_GRAMMAR_MISSING">XML_RNGP_GRAMMAR_MISSING</a> = 1038 /* 1038 */
    <a name="XML_RNGP_GRAMMAR_NO_START">XML_RNGP_GRAMMAR_NO_START</a> = 1039 /* 1039 */
    <a name="XML_RNGP_GROUP_ATTR_CONFLICT">XML_RNGP_GROUP_ATTR_CONFLICT</a> = 1040 /* 1040 */
    <a name="XML_RNGP_HREF_ERROR">XML_RNGP_HREF_ERROR</a> = 1041 /* 1041 */
    <a name="XML_RNGP_INCLUDE_EMPTY">XML_RNGP_INCLUDE_EMPTY</a> = 1042 /* 1042 */
    <a name="XML_RNGP_INCLUDE_FAILURE">XML_RNGP_INCLUDE_FAILURE</a> = 1043 /* 1043 */
    <a name="XML_RNGP_INCLUDE_RECURSE">XML_RNGP_INCLUDE_RECURSE</a> = 1044 /* 1044 */
    <a name="XML_RNGP_INTERLEAVE_ADD">XML_RNGP_INTERLEAVE_ADD</a> = 1045 /* 1045 */
    <a name="XML_RNGP_INTERLEAVE_CREATE_FAILED">XML_RNGP_INTERLEAVE_CREATE_FAILED</a> = 1046 /* 1046 */
    <a name="XML_RNGP_INTERLEAVE_EMPTY">XML_RNGP_INTERLEAVE_EMPTY</a> = 1047 /* 1047 */
    <a name="XML_RNGP_INTERLEAVE_NO_CONTENT">XML_RNGP_INTERLEAVE_NO_CONTENT</a> = 1048 /* 1048 */
    <a name="XML_RNGP_INVALID_DEFINE_NAME">XML_RNGP_INVALID_DEFINE_NAME</a> = 1049 /* 1049 */
    <a name="XML_RNGP_INVALID_URI">XML_RNGP_INVALID_URI</a> = 1050 /* 1050 */
    <a name="XML_RNGP_INVALID_VALUE">XML_RNGP_INVALID_VALUE</a> = 1051 /* 1051 */
    <a name="XML_RNGP_MISSING_HREF">XML_RNGP_MISSING_HREF</a> = 1052 /* 1052 */
    <a name="XML_RNGP_NAME_MISSING">XML_RNGP_NAME_MISSING</a> = 1053 /* 1053 */
    <a name="XML_RNGP_NEED_COMBINE">XML_RNGP_NEED_COMBINE</a> = 1054 /* 1054 */
    <a name="XML_RNGP_NOTALLOWED_NOT_EMPTY">XML_RNGP_NOTALLOWED_NOT_EMPTY</a> = 1055 /* 1055 */
    <a name="XML_RNGP_NSNAME_ATTR_ANCESTOR">XML_RNGP_NSNAME_ATTR_ANCESTOR</a> = 1056 /* 1056 */
    <a name="XML_RNGP_NSNAME_NO_NS">XML_RNGP_NSNAME_NO_NS</a> = 1057 /* 1057 */
    <a name="XML_RNGP_PARAM_FORBIDDEN">XML_RNGP_PARAM_FORBIDDEN</a> = 1058 /* 1058 */
    <a name="XML_RNGP_PARAM_NAME_MISSING">XML_RNGP_PARAM_NAME_MISSING</a> = 1059 /* 1059 */
    <a name="XML_RNGP_PARENTREF_CREATE_FAILED">XML_RNGP_PARENTREF_CREATE_FAILED</a> = 1060 /* 1060 */
    <a name="XML_RNGP_PARENTREF_NAME_INVALID">XML_RNGP_PARENTREF_NAME_INVALID</a> = 1061 /* 1061 */
    <a name="XML_RNGP_PARENTREF_NO_NAME">XML_RNGP_PARENTREF_NO_NAME</a> = 1062 /* 1062 */
    <a name="XML_RNGP_PARENTREF_NO_PARENT">XML_RNGP_PARENTREF_NO_PARENT</a> = 1063 /* 1063 */
    <a name="XML_RNGP_PARENTREF_NOT_EMPTY">XML_RNGP_PARENTREF_NOT_EMPTY</a> = 1064 /* 1064 */
    <a name="XML_RNGP_PARSE_ERROR">XML_RNGP_PARSE_ERROR</a> = 1065 /* 1065 */
    <a name="XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME">XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME</a> = 1066 /* 1066 */
    <a name="XML_RNGP_PAT_ATTR_ATTR">XML_RNGP_PAT_ATTR_ATTR</a> = 1067 /* 1067 */
    <a name="XML_RNGP_PAT_ATTR_ELEM">XML_RNGP_PAT_ATTR_ELEM</a> = 1068 /* 1068 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_ATTR">XML_RNGP_PAT_DATA_EXCEPT_ATTR</a> = 1069 /* 1069 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_ELEM">XML_RNGP_PAT_DATA_EXCEPT_ELEM</a> = 1070 /* 1070 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_EMPTY">XML_RNGP_PAT_DATA_EXCEPT_EMPTY</a> = 1071 /* 1071 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_GROUP">XML_RNGP_PAT_DATA_EXCEPT_GROUP</a> = 1072 /* 1072 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE">XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE</a> = 1073 /* 1073 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_LIST">XML_RNGP_PAT_DATA_EXCEPT_LIST</a> = 1074 /* 1074 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_ONEMORE">XML_RNGP_PAT_DATA_EXCEPT_ONEMORE</a> = 1075 /* 1075 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_REF">XML_RNGP_PAT_DATA_EXCEPT_REF</a> = 1076 /* 1076 */
    <a name="XML_RNGP_PAT_DATA_EXCEPT_TEXT">XML_RNGP_PAT_DATA_EXCEPT_TEXT</a> = 1077 /* 1077 */
    <a name="XML_RNGP_PAT_LIST_ATTR">XML_RNGP_PAT_LIST_ATTR</a> = 1078 /* 1078 */
    <a name="XML_RNGP_PAT_LIST_ELEM">XML_RNGP_PAT_LIST_ELEM</a> = 1079 /* 1079 */
    <a name="XML_RNGP_PAT_LIST_INTERLEAVE">XML_RNGP_PAT_LIST_INTERLEAVE</a> = 1080 /* 1080 */
    <a name="XML_RNGP_PAT_LIST_LIST">XML_RNGP_PAT_LIST_LIST</a> = 1081 /* 1081 */
    <a name="XML_RNGP_PAT_LIST_REF">XML_RNGP_PAT_LIST_REF</a> = 1082 /* 1082 */
    <a name="XML_RNGP_PAT_LIST_TEXT">XML_RNGP_PAT_LIST_TEXT</a> = 1083 /* 1083 */
    <a name="XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME">XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME</a> = 1084 /* 1084 */
    <a name="XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME">XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME</a> = 1085 /* 1085 */
    <a name="XML_RNGP_PAT_ONEMORE_GROUP_ATTR">XML_RNGP_PAT_ONEMORE_GROUP_ATTR</a> = 1086 /* 1086 */
    <a name="XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR">XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR</a> = 1087 /* 1087 */
    <a name="XML_RNGP_PAT_START_ATTR">XML_RNGP_PAT_START_ATTR</a> = 1088 /* 1088 */
    <a name="XML_RNGP_PAT_START_DATA">XML_RNGP_PAT_START_DATA</a> = 1089 /* 1089 */
    <a name="XML_RNGP_PAT_START_EMPTY">XML_RNGP_PAT_START_EMPTY</a> = 1090 /* 1090 */
    <a name="XML_RNGP_PAT_START_GROUP">XML_RNGP_PAT_START_GROUP</a> = 1091 /* 1091 */
    <a name="XML_RNGP_PAT_START_INTERLEAVE">XML_RNGP_PAT_START_INTERLEAVE</a> = 1092 /* 1092 */
    <a name="XML_RNGP_PAT_START_LIST">XML_RNGP_PAT_START_LIST</a> = 1093 /* 1093 */
    <a name="XML_RNGP_PAT_START_ONEMORE">XML_RNGP_PAT_START_ONEMORE</a> = 1094 /* 1094 */
    <a name="XML_RNGP_PAT_START_TEXT">XML_RNGP_PAT_START_TEXT</a> = 1095 /* 1095 */
    <a name="XML_RNGP_PAT_START_VALUE">XML_RNGP_PAT_START_VALUE</a> = 1096 /* 1096 */
    <a name="XML_RNGP_PREFIX_UNDEFINED">XML_RNGP_PREFIX_UNDEFINED</a> = 1097 /* 1097 */
    <a name="XML_RNGP_REF_CREATE_FAILED">XML_RNGP_REF_CREATE_FAILED</a> = 1098 /* 1098 */
    <a name="XML_RNGP_REF_CYCLE">XML_RNGP_REF_CYCLE</a> = 1099 /* 1099 */
    <a name="XML_RNGP_REF_NAME_INVALID">XML_RNGP_REF_NAME_INVALID</a> = 1100 /* 1100 */
    <a name="XML_RNGP_REF_NO_DEF">XML_RNGP_REF_NO_DEF</a> = 1101 /* 1101 */
    <a name="XML_RNGP_REF_NO_NAME">XML_RNGP_REF_NO_NAME</a> = 1102 /* 1102 */
    <a name="XML_RNGP_REF_NOT_EMPTY">XML_RNGP_REF_NOT_EMPTY</a> = 1103 /* 1103 */
    <a name="XML_RNGP_START_CHOICE_AND_INTERLEAVE">XML_RNGP_START_CHOICE_AND_INTERLEAVE</a> = 1104 /* 1104 */
    <a name="XML_RNGP_START_CONTENT">XML_RNGP_START_CONTENT</a> = 1105 /* 1105 */
    <a name="XML_RNGP_START_EMPTY">XML_RNGP_START_EMPTY</a> = 1106 /* 1106 */
    <a name="XML_RNGP_START_MISSING">XML_RNGP_START_MISSING</a> = 1107 /* 1107 */
    <a name="XML_RNGP_TEXT_EXPECTED">XML_RNGP_TEXT_EXPECTED</a> = 1108 /* 1108 */
    <a name="XML_RNGP_TEXT_HAS_CHILD">XML_RNGP_TEXT_HAS_CHILD</a> = 1109 /* 1109 */
    <a name="XML_RNGP_TYPE_MISSING">XML_RNGP_TYPE_MISSING</a> = 1110 /* 1110 */
    <a name="XML_RNGP_TYPE_NOT_FOUND">XML_RNGP_TYPE_NOT_FOUND</a> = 1111 /* 1111 */
    <a name="XML_RNGP_TYPE_VALUE">XML_RNGP_TYPE_VALUE</a> = 1112 /* 1112 */
    <a name="XML_RNGP_UNKNOWN_ATTRIBUTE">XML_RNGP_UNKNOWN_ATTRIBUTE</a> = 1113 /* 1113 */
    <a name="XML_RNGP_UNKNOWN_COMBINE">XML_RNGP_UNKNOWN_COMBINE</a> = 1114 /* 1114 */
    <a name="XML_RNGP_UNKNOWN_CONSTRUCT">XML_RNGP_UNKNOWN_CONSTRUCT</a> = 1115 /* 1115 */
    <a name="XML_RNGP_UNKNOWN_TYPE_LIB">XML_RNGP_UNKNOWN_TYPE_LIB</a> = 1116 /* 1116 */
    <a name="XML_RNGP_URI_FRAGMENT">XML_RNGP_URI_FRAGMENT</a> = 1117 /* 1117 */
    <a name="XML_RNGP_URI_NOT_ABSOLUTE">XML_RNGP_URI_NOT_ABSOLUTE</a> = 1118 /* 1118 */
    <a name="XML_RNGP_VALUE_EMPTY">XML_RNGP_VALUE_EMPTY</a> = 1119 /* 1119 */
    <a name="XML_RNGP_VALUE_NO_CONTENT">XML_RNGP_VALUE_NO_CONTENT</a> = 1120 /* 1120 */
    <a name="XML_RNGP_XMLNS_NAME">XML_RNGP_XMLNS_NAME</a> = 1121 /* 1121 */
    <a name="XML_RNGP_XML_NS">XML_RNGP_XML_NS</a> = 1122 /* 1122 */
    <a name="XML_XPATH_EXPRESSION_OK">XML_XPATH_EXPRESSION_OK</a> = 1200
    <a name="XML_XPATH_NUMBER_ERROR">XML_XPATH_NUMBER_ERROR</a> = 1201 /* 1201 */
    <a name="XML_XPATH_UNFINISHED_LITERAL_ERROR">XML_XPATH_UNFINISHED_LITERAL_ERROR</a> = 1202 /* 1202 */
    <a name="XML_XPATH_START_LITERAL_ERROR">XML_XPATH_START_LITERAL_ERROR</a> = 1203 /* 1203 */
    <a name="XML_XPATH_VARIABLE_REF_ERROR">XML_XPATH_VARIABLE_REF_ERROR</a> = 1204 /* 1204 */
    <a name="XML_XPATH_UNDEF_VARIABLE_ERROR">XML_XPATH_UNDEF_VARIABLE_ERROR</a> = 1205 /* 1205 */
    <a name="XML_XPATH_INVALID_PREDICATE_ERROR">XML_XPATH_INVALID_PREDICATE_ERROR</a> = 1206 /* 1206 */
    <a name="XML_XPATH_EXPR_ERROR">XML_XPATH_EXPR_ERROR</a> = 1207 /* 1207 */
    <a name="XML_XPATH_UNCLOSED_ERROR">XML_XPATH_UNCLOSED_ERROR</a> = 1208 /* 1208 */
    <a name="XML_XPATH_UNKNOWN_FUNC_ERROR">XML_XPATH_UNKNOWN_FUNC_ERROR</a> = 1209 /* 1209 */
    <a name="XML_XPATH_INVALID_OPERAND">XML_XPATH_INVALID_OPERAND</a> = 1210 /* 1210 */
    <a name="XML_XPATH_INVALID_TYPE">XML_XPATH_INVALID_TYPE</a> = 1211 /* 1211 */
    <a name="XML_XPATH_INVALID_ARITY">XML_XPATH_INVALID_ARITY</a> = 1212 /* 1212 */
    <a name="XML_XPATH_INVALID_CTXT_SIZE">XML_XPATH_INVALID_CTXT_SIZE</a> = 1213 /* 1213 */
    <a name="XML_XPATH_INVALID_CTXT_POSITION">XML_XPATH_INVALID_CTXT_POSITION</a> = 1214 /* 1214 */
    <a name="XML_XPATH_MEMORY_ERROR">XML_XPATH_MEMORY_ERROR</a> = 1215 /* 1215 */
    <a name="XML_XPTR_SYNTAX_ERROR">XML_XPTR_SYNTAX_ERROR</a> = 1216 /* 1216 */
    <a name="XML_XPTR_RESOURCE_ERROR">XML_XPTR_RESOURCE_ERROR</a> = 1217 /* 1217 */
    <a name="XML_XPTR_SUB_RESOURCE_ERROR">XML_XPTR_SUB_RESOURCE_ERROR</a> = 1218 /* 1218 */
    <a name="XML_XPATH_UNDEF_PREFIX_ERROR">XML_XPATH_UNDEF_PREFIX_ERROR</a> = 1219 /* 1219 */
    <a name="XML_XPATH_ENCODING_ERROR">XML_XPATH_ENCODING_ERROR</a> = 1220 /* 1220 */
    <a name="XML_XPATH_INVALID_CHAR_ERROR">XML_XPATH_INVALID_CHAR_ERROR</a> = 1221 /* 1221 */
    <a name="XML_TREE_INVALID_HEX">XML_TREE_INVALID_HEX</a> = 1300
    <a name="XML_TREE_INVALID_DEC">XML_TREE_INVALID_DEC</a> = 1301 /* 1301 */
    <a name="XML_TREE_UNTERMINATED_ENTITY">XML_TREE_UNTERMINATED_ENTITY</a> = 1302 /* 1302 */
    <a name="XML_TREE_NOT_UTF8">XML_TREE_NOT_UTF8</a> = 1303 /* 1303 */
    <a name="XML_SAVE_NOT_UTF8">XML_SAVE_NOT_UTF8</a> = 1400
    <a name="XML_SAVE_CHAR_INVALID">XML_SAVE_CHAR_INVALID</a> = 1401 /* 1401 */
    <a name="XML_SAVE_NO_DOCTYPE">XML_SAVE_NO_DOCTYPE</a> = 1402 /* 1402 */
    <a name="XML_SAVE_UNKNOWN_ENCODING">XML_SAVE_UNKNOWN_ENCODING</a> = 1403 /* 1403 */
    <a name="XML_REGEXP_COMPILE_ERROR">XML_REGEXP_COMPILE_ERROR</a> = 1450
    <a name="XML_IO_UNKNOWN">XML_IO_UNKNOWN</a> = 1500
    <a name="XML_IO_EACCES">XML_IO_EACCES</a> = 1501 /* 1501 */
    <a name="XML_IO_EAGAIN">XML_IO_EAGAIN</a> = 1502 /* 1502 */
    <a name="XML_IO_EBADF">XML_IO_EBADF</a> = 1503 /* 1503 */
    <a name="XML_IO_EBADMSG">XML_IO_EBADMSG</a> = 1504 /* 1504 */
    <a name="XML_IO_EBUSY">XML_IO_EBUSY</a> = 1505 /* 1505 */
    <a name="XML_IO_ECANCELED">XML_IO_ECANCELED</a> = 1506 /* 1506 */
    <a name="XML_IO_ECHILD">XML_IO_ECHILD</a> = 1507 /* 1507 */
    <a name="XML_IO_EDEADLK">XML_IO_EDEADLK</a> = 1508 /* 1508 */
    <a name="XML_IO_EDOM">XML_IO_EDOM</a> = 1509 /* 1509 */
    <a name="XML_IO_EEXIST">XML_IO_EEXIST</a> = 1510 /* 1510 */
    <a name="XML_IO_EFAULT">XML_IO_EFAULT</a> = 1511 /* 1511 */
    <a name="XML_IO_EFBIG">XML_IO_EFBIG</a> = 1512 /* 1512 */
    <a name="XML_IO_EINPROGRESS">XML_IO_EINPROGRESS</a> = 1513 /* 1513 */
    <a name="XML_IO_EINTR">XML_IO_EINTR</a> = 1514 /* 1514 */
    <a name="XML_IO_EINVAL">XML_IO_EINVAL</a> = 1515 /* 1515 */
    <a name="XML_IO_EIO">XML_IO_EIO</a> = 1516 /* 1516 */
    <a name="XML_IO_EISDIR">XML_IO_EISDIR</a> = 1517 /* 1517 */
    <a name="XML_IO_EMFILE">XML_IO_EMFILE</a> = 1518 /* 1518 */
    <a name="XML_IO_EMLINK">XML_IO_EMLINK</a> = 1519 /* 1519 */
    <a name="XML_IO_EMSGSIZE">XML_IO_EMSGSIZE</a> = 1520 /* 1520 */
    <a name="XML_IO_ENAMETOOLONG">XML_IO_ENAMETOOLONG</a> = 1521 /* 1521 */
    <a name="XML_IO_ENFILE">XML_IO_ENFILE</a> = 1522 /* 1522 */
    <a name="XML_IO_ENODEV">XML_IO_ENODEV</a> = 1523 /* 1523 */
    <a name="XML_IO_ENOENT">XML_IO_ENOENT</a> = 1524 /* 1524 */
    <a name="XML_IO_ENOEXEC">XML_IO_ENOEXEC</a> = 1525 /* 1525 */
    <a name="XML_IO_ENOLCK">XML_IO_ENOLCK</a> = 1526 /* 1526 */
    <a name="XML_IO_ENOMEM">XML_IO_ENOMEM</a> = 1527 /* 1527 */
    <a name="XML_IO_ENOSPC">XML_IO_ENOSPC</a> = 1528 /* 1528 */
    <a name="XML_IO_ENOSYS">XML_IO_ENOSYS</a> = 1529 /* 1529 */
    <a name="XML_IO_ENOTDIR">XML_IO_ENOTDIR</a> = 1530 /* 1530 */
    <a name="XML_IO_ENOTEMPTY">XML_IO_ENOTEMPTY</a> = 1531 /* 1531 */
    <a name="XML_IO_ENOTSUP">XML_IO_ENOTSUP</a> = 1532 /* 1532 */
    <a name="XML_IO_ENOTTY">XML_IO_ENOTTY</a> = 1533 /* 1533 */
    <a name="XML_IO_ENXIO">XML_IO_ENXIO</a> = 1534 /* 1534 */
    <a name="XML_IO_EPERM">XML_IO_EPERM</a> = 1535 /* 1535 */
    <a name="XML_IO_EPIPE">XML_IO_EPIPE</a> = 1536 /* 1536 */
    <a name="XML_IO_ERANGE">XML_IO_ERANGE</a> = 1537 /* 1537 */
    <a name="XML_IO_EROFS">XML_IO_EROFS</a> = 1538 /* 1538 */
    <a name="XML_IO_ESPIPE">XML_IO_ESPIPE</a> = 1539 /* 1539 */
    <a name="XML_IO_ESRCH">XML_IO_ESRCH</a> = 1540 /* 1540 */
    <a name="XML_IO_ETIMEDOUT">XML_IO_ETIMEDOUT</a> = 1541 /* 1541 */
    <a name="XML_IO_EXDEV">XML_IO_EXDEV</a> = 1542 /* 1542 */
    <a name="XML_IO_NETWORK_ATTEMPT">XML_IO_NETWORK_ATTEMPT</a> = 1543 /* 1543 */
    <a name="XML_IO_ENCODER">XML_IO_ENCODER</a> = 1544 /* 1544 */
    <a name="XML_IO_FLUSH">XML_IO_FLUSH</a> = 1545 /* 1545 */
    <a name="XML_IO_WRITE">XML_IO_WRITE</a> = 1546 /* 1546 */
    <a name="XML_IO_NO_INPUT">XML_IO_NO_INPUT</a> = 1547 /* 1547 */
    <a name="XML_IO_BUFFER_FULL">XML_IO_BUFFER_FULL</a> = 1548 /* 1548 */
    <a name="XML_IO_LOAD_ERROR">XML_IO_LOAD_ERROR</a> = 1549 /* 1549 */
    <a name="XML_IO_ENOTSOCK">XML_IO_ENOTSOCK</a> = 1550 /* 1550 */
    <a name="XML_IO_EISCONN">XML_IO_EISCONN</a> = 1551 /* 1551 */
    <a name="XML_IO_ECONNREFUSED">XML_IO_ECONNREFUSED</a> = 1552 /* 1552 */
    <a name="XML_IO_ENETUNREACH">XML_IO_ENETUNREACH</a> = 1553 /* 1553 */
    <a name="XML_IO_EADDRINUSE">XML_IO_EADDRINUSE</a> = 1554 /* 1554 */
    <a name="XML_IO_EALREADY">XML_IO_EALREADY</a> = 1555 /* 1555 */
    <a name="XML_IO_EAFNOSUPPORT">XML_IO_EAFNOSUPPORT</a> = 1556 /* 1556 */
    <a name="XML_XINCLUDE_RECURSION">XML_XINCLUDE_RECURSION</a> = 1600
    <a name="XML_XINCLUDE_PARSE_VALUE">XML_XINCLUDE_PARSE_VALUE</a> = 1601 /* 1601 */
    <a name="XML_XINCLUDE_ENTITY_DEF_MISMATCH">XML_XINCLUDE_ENTITY_DEF_MISMATCH</a> = 1602 /* 1602 */
    <a name="XML_XINCLUDE_NO_HREF">XML_XINCLUDE_NO_HREF</a> = 1603 /* 1603 */
    <a name="XML_XINCLUDE_NO_FALLBACK">XML_XINCLUDE_NO_FALLBACK</a> = 1604 /* 1604 */
    <a name="XML_XINCLUDE_HREF_URI">XML_XINCLUDE_HREF_URI</a> = 1605 /* 1605 */
    <a name="XML_XINCLUDE_TEXT_FRAGMENT">XML_XINCLUDE_TEXT_FRAGMENT</a> = 1606 /* 1606 */
    <a name="XML_XINCLUDE_TEXT_DOCUMENT">XML_XINCLUDE_TEXT_DOCUMENT</a> = 1607 /* 1607 */
    <a name="XML_XINCLUDE_INVALID_CHAR">XML_XINCLUDE_INVALID_CHAR</a> = 1608 /* 1608 */
    <a name="XML_XINCLUDE_BUILD_FAILED">XML_XINCLUDE_BUILD_FAILED</a> = 1609 /* 1609 */
    <a name="XML_XINCLUDE_UNKNOWN_ENCODING">XML_XINCLUDE_UNKNOWN_ENCODING</a> = 1610 /* 1610 */
    <a name="XML_XINCLUDE_MULTIPLE_ROOT">XML_XINCLUDE_MULTIPLE_ROOT</a> = 1611 /* 1611 */
    <a name="XML_XINCLUDE_XPTR_FAILED">XML_XINCLUDE_XPTR_FAILED</a> = 1612 /* 1612 */
    <a name="XML_XINCLUDE_XPTR_RESULT">XML_XINCLUDE_XPTR_RESULT</a> = 1613 /* 1613 */
    <a name="XML_XINCLUDE_INCLUDE_IN_INCLUDE">XML_XINCLUDE_INCLUDE_IN_INCLUDE</a> = 1614 /* 1614 */
    <a name="XML_XINCLUDE_FALLBACKS_IN_INCLUDE">XML_XINCLUDE_FALLBACKS_IN_INCLUDE</a> = 1615 /* 1615 */
    <a name="XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE">XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE</a> = 1616 /* 1616 */
    <a name="XML_XINCLUDE_DEPRECATED_NS">XML_XINCLUDE_DEPRECATED_NS</a> = 1617 /* 1617 */
    <a name="XML_XINCLUDE_FRAGMENT_ID">XML_XINCLUDE_FRAGMENT_ID</a> = 1618 /* 1618 */
    <a name="XML_CATALOG_MISSING_ATTR">XML_CATALOG_MISSING_ATTR</a> = 1650
    <a name="XML_CATALOG_ENTRY_BROKEN">XML_CATALOG_ENTRY_BROKEN</a> = 1651 /* 1651 */
    <a name="XML_CATALOG_PREFER_VALUE">XML_CATALOG_PREFER_VALUE</a> = 1652 /* 1652 */
    <a name="XML_CATALOG_NOT_CATALOG">XML_CATALOG_NOT_CATALOG</a> = 1653 /* 1653 */
    <a name="XML_CATALOG_RECURSION">XML_CATALOG_RECURSION</a> = 1654 /* 1654 */
    <a name="XML_SCHEMAP_PREFIX_UNDEFINED">XML_SCHEMAP_PREFIX_UNDEFINED</a> = 1700
    <a name="XML_SCHEMAP_ATTRFORMDEFAULT_VALUE">XML_SCHEMAP_ATTRFORMDEFAULT_VALUE</a> = 1701 /* 1701 */
    <a name="XML_SCHEMAP_ATTRGRP_NONAME_NOREF">XML_SCHEMAP_ATTRGRP_NONAME_NOREF</a> = 1702 /* 1702 */
    <a name="XML_SCHEMAP_ATTR_NONAME_NOREF">XML_SCHEMAP_ATTR_NONAME_NOREF</a> = 1703 /* 1703 */
    <a name="XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF">XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF</a> = 1704 /* 1704 */
    <a name="XML_SCHEMAP_ELEMFORMDEFAULT_VALUE">XML_SCHEMAP_ELEMFORMDEFAULT_VALUE</a> = 1705 /* 1705 */
    <a name="XML_SCHEMAP_ELEM_NONAME_NOREF">XML_SCHEMAP_ELEM_NONAME_NOREF</a> = 1706 /* 1706 */
    <a name="XML_SCHEMAP_EXTENSION_NO_BASE">XML_SCHEMAP_EXTENSION_NO_BASE</a> = 1707 /* 1707 */
    <a name="XML_SCHEMAP_FACET_NO_VALUE">XML_SCHEMAP_FACET_NO_VALUE</a> = 1708 /* 1708 */
    <a name="XML_SCHEMAP_FAILED_BUILD_IMPORT">XML_SCHEMAP_FAILED_BUILD_IMPORT</a> = 1709 /* 1709 */
    <a name="XML_SCHEMAP_GROUP_NONAME_NOREF">XML_SCHEMAP_GROUP_NONAME_NOREF</a> = 1710 /* 1710 */
    <a name="XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI">XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI</a> = 1711 /* 1711 */
    <a name="XML_SCHEMAP_IMPORT_REDEFINE_NSNAME">XML_SCHEMAP_IMPORT_REDEFINE_NSNAME</a> = 1712 /* 1712 */
    <a name="XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI">XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI</a> = 1713 /* 1713 */
    <a name="XML_SCHEMAP_INVALID_BOOLEAN">XML_SCHEMAP_INVALID_BOOLEAN</a> = 1714 /* 1714 */
    <a name="XML_SCHEMAP_INVALID_ENUM">XML_SCHEMAP_INVALID_ENUM</a> = 1715 /* 1715 */
    <a name="XML_SCHEMAP_INVALID_FACET">XML_SCHEMAP_INVALID_FACET</a> = 1716 /* 1716 */
    <a name="XML_SCHEMAP_INVALID_FACET_VALUE">XML_SCHEMAP_INVALID_FACET_VALUE</a> = 1717 /* 1717 */
    <a name="XML_SCHEMAP_INVALID_MAXOCCURS">XML_SCHEMAP_INVALID_MAXOCCURS</a> = 1718 /* 1718 */
    <a name="XML_SCHEMAP_INVALID_MINOCCURS">XML_SCHEMAP_INVALID_MINOCCURS</a> = 1719 /* 1719 */
    <a name="XML_SCHEMAP_INVALID_REF_AND_SUBTYPE">XML_SCHEMAP_INVALID_REF_AND_SUBTYPE</a> = 1720 /* 1720 */
    <a name="XML_SCHEMAP_INVALID_WHITE_SPACE">XML_SCHEMAP_INVALID_WHITE_SPACE</a> = 1721 /* 1721 */
    <a name="XML_SCHEMAP_NOATTR_NOREF">XML_SCHEMAP_NOATTR_NOREF</a> = 1722 /* 1722 */
    <a name="XML_SCHEMAP_NOTATION_NO_NAME">XML_SCHEMAP_NOTATION_NO_NAME</a> = 1723 /* 1723 */
    <a name="XML_SCHEMAP_NOTYPE_NOREF">XML_SCHEMAP_NOTYPE_NOREF</a> = 1724 /* 1724 */
    <a name="XML_SCHEMAP_REF_AND_SUBTYPE">XML_SCHEMAP_REF_AND_SUBTYPE</a> = 1725 /* 1725 */
    <a name="XML_SCHEMAP_RESTRICTION_NONAME_NOREF">XML_SCHEMAP_RESTRICTION_NONAME_NOREF</a> = 1726 /* 1726 */
    <a name="XML_SCHEMAP_SIMPLETYPE_NONAME">XML_SCHEMAP_SIMPLETYPE_NONAME</a> = 1727 /* 1727 */
    <a name="XML_SCHEMAP_TYPE_AND_SUBTYPE">XML_SCHEMAP_TYPE_AND_SUBTYPE</a> = 1728 /* 1728 */
    <a name="XML_SCHEMAP_UNKNOWN_ALL_CHILD">XML_SCHEMAP_UNKNOWN_ALL_CHILD</a> = 1729 /* 1729 */
    <a name="XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD">XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD</a> = 1730 /* 1730 */
    <a name="XML_SCHEMAP_UNKNOWN_ATTR_CHILD">XML_SCHEMAP_UNKNOWN_ATTR_CHILD</a> = 1731 /* 1731 */
    <a name="XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD">XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD</a> = 1732 /* 1732 */
    <a name="XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP">XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP</a> = 1733 /* 1733 */
    <a name="XML_SCHEMAP_UNKNOWN_BASE_TYPE">XML_SCHEMAP_UNKNOWN_BASE_TYPE</a> = 1734 /* 1734 */
    <a name="XML_SCHEMAP_UNKNOWN_CHOICE_CHILD">XML_SCHEMAP_UNKNOWN_CHOICE_CHILD</a> = 1735 /* 1735 */
    <a name="XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD">XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD</a> = 1736 /* 1736 */
    <a name="XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD">XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD</a> = 1737 /* 1737 */
    <a name="XML_SCHEMAP_UNKNOWN_ELEM_CHILD">XML_SCHEMAP_UNKNOWN_ELEM_CHILD</a> = 1738 /* 1738 */
    <a name="XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD">XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD</a> = 1739 /* 1739 */
    <a name="XML_SCHEMAP_UNKNOWN_FACET_CHILD">XML_SCHEMAP_UNKNOWN_FACET_CHILD</a> = 1740 /* 1740 */
    <a name="XML_SCHEMAP_UNKNOWN_FACET_TYPE">XML_SCHEMAP_UNKNOWN_FACET_TYPE</a> = 1741 /* 1741 */
    <a name="XML_SCHEMAP_UNKNOWN_GROUP_CHILD">XML_SCHEMAP_UNKNOWN_GROUP_CHILD</a> = 1742 /* 1742 */
    <a name="XML_SCHEMAP_UNKNOWN_IMPORT_CHILD">XML_SCHEMAP_UNKNOWN_IMPORT_CHILD</a> = 1743 /* 1743 */
    <a name="XML_SCHEMAP_UNKNOWN_LIST_CHILD">XML_SCHEMAP_UNKNOWN_LIST_CHILD</a> = 1744 /* 1744 */
    <a name="XML_SCHEMAP_UNKNOWN_NOTATION_CHILD">XML_SCHEMAP_UNKNOWN_NOTATION_CHILD</a> = 1745 /* 1745 */
    <a name="XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD">XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD</a> = 1746 /* 1746 */
    <a name="XML_SCHEMAP_UNKNOWN_REF">XML_SCHEMAP_UNKNOWN_REF</a> = 1747 /* 1747 */
    <a name="XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD">XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD</a> = 1748 /* 1748 */
    <a name="XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD">XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD</a> = 1749 /* 1749 */
    <a name="XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD">XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD</a> = 1750 /* 1750 */
    <a name="XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD">XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD</a> = 1751 /* 1751 */
    <a name="XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD">XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD</a> = 1752 /* 1752 */
    <a name="XML_SCHEMAP_UNKNOWN_TYPE">XML_SCHEMAP_UNKNOWN_TYPE</a> = 1753 /* 1753 */
    <a name="XML_SCHEMAP_UNKNOWN_UNION_CHILD">XML_SCHEMAP_UNKNOWN_UNION_CHILD</a> = 1754 /* 1754 */
    <a name="XML_SCHEMAP_ELEM_DEFAULT_FIXED">XML_SCHEMAP_ELEM_DEFAULT_FIXED</a> = 1755 /* 1755 */
    <a name="XML_SCHEMAP_REGEXP_INVALID">XML_SCHEMAP_REGEXP_INVALID</a> = 1756 /* 1756 */
    <a name="XML_SCHEMAP_FAILED_LOAD">XML_SCHEMAP_FAILED_LOAD</a> = 1757 /* 1757 */
    <a name="XML_SCHEMAP_NOTHING_TO_PARSE">XML_SCHEMAP_NOTHING_TO_PARSE</a> = 1758 /* 1758 */
    <a name="XML_SCHEMAP_NOROOT">XML_SCHEMAP_NOROOT</a> = 1759 /* 1759 */
    <a name="XML_SCHEMAP_REDEFINED_GROUP">XML_SCHEMAP_REDEFINED_GROUP</a> = 1760 /* 1760 */
    <a name="XML_SCHEMAP_REDEFINED_TYPE">XML_SCHEMAP_REDEFINED_TYPE</a> = 1761 /* 1761 */
    <a name="XML_SCHEMAP_REDEFINED_ELEMENT">XML_SCHEMAP_REDEFINED_ELEMENT</a> = 1762 /* 1762 */
    <a name="XML_SCHEMAP_REDEFINED_ATTRGROUP">XML_SCHEMAP_REDEFINED_ATTRGROUP</a> = 1763 /* 1763 */
    <a name="XML_SCHEMAP_REDEFINED_ATTR">XML_SCHEMAP_REDEFINED_ATTR</a> = 1764 /* 1764 */
    <a name="XML_SCHEMAP_REDEFINED_NOTATION">XML_SCHEMAP_REDEFINED_NOTATION</a> = 1765 /* 1765 */
    <a name="XML_SCHEMAP_FAILED_PARSE">XML_SCHEMAP_FAILED_PARSE</a> = 1766 /* 1766 */
    <a name="XML_SCHEMAP_UNKNOWN_PREFIX">XML_SCHEMAP_UNKNOWN_PREFIX</a> = 1767 /* 1767 */
    <a name="XML_SCHEMAP_DEF_AND_PREFIX">XML_SCHEMAP_DEF_AND_PREFIX</a> = 1768 /* 1768 */
    <a name="XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD">XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD</a> = 1769 /* 1769 */
    <a name="XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI">XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI</a> = 1770 /* 1770 */
    <a name="XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI">XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI</a> = 1771 /* 1771 */
    <a name="XML_SCHEMAP_NOT_SCHEMA">XML_SCHEMAP_NOT_SCHEMA</a> = 1772 /* 1772 */
    <a name="XML_SCHEMAP_UNKNOWN_MEMBER_TYPE">XML_SCHEMAP_UNKNOWN_MEMBER_TYPE</a> = 1773 /* 1773 */
    <a name="XML_SCHEMAP_INVALID_ATTR_USE">XML_SCHEMAP_INVALID_ATTR_USE</a> = 1774 /* 1774 */
    <a name="XML_SCHEMAP_RECURSIVE">XML_SCHEMAP_RECURSIVE</a> = 1775 /* 1775 */
    <a name="XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE">XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE</a> = 1776 /* 1776 */
    <a name="XML_SCHEMAP_INVALID_ATTR_COMBINATION">XML_SCHEMAP_INVALID_ATTR_COMBINATION</a> = 1777 /* 1777 */
    <a name="XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION">XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION</a> = 1778 /* 1778 */
    <a name="XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD">XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD</a> = 1779 /* 1779 */
    <a name="XML_SCHEMAP_INVALID_ATTR_NAME">XML_SCHEMAP_INVALID_ATTR_NAME</a> = 1780 /* 1780 */
    <a name="XML_SCHEMAP_REF_AND_CONTENT">XML_SCHEMAP_REF_AND_CONTENT</a> = 1781 /* 1781 */
    <a name="XML_SCHEMAP_CT_PROPS_CORRECT_1">XML_SCHEMAP_CT_PROPS_CORRECT_1</a> = 1782 /* 1782 */
    <a name="XML_SCHEMAP_CT_PROPS_CORRECT_2">XML_SCHEMAP_CT_PROPS_CORRECT_2</a> = 1783 /* 1783 */
    <a name="XML_SCHEMAP_CT_PROPS_CORRECT_3">XML_SCHEMAP_CT_PROPS_CORRECT_3</a> = 1784 /* 1784 */
    <a name="XML_SCHEMAP_CT_PROPS_CORRECT_4">XML_SCHEMAP_CT_PROPS_CORRECT_4</a> = 1785 /* 1785 */
    <a name="XML_SCHEMAP_CT_PROPS_CORRECT_5">XML_SCHEMAP_CT_PROPS_CORRECT_5</a> = 1786 /* 1786 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1</a> = 1787 /* 1787 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1</a> = 1788 /* 1788 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2</a> = 1789 /* 1789 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2</a> = 1790 /* 1790 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3</a> = 1791 /* 1791 */
    <a name="XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER">XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER</a> = 1792 /* 1792 */
    <a name="XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE">XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE</a> = 1793 /* 1793 */
    <a name="XML_SCHEMAP_UNION_NOT_EXPRESSIBLE">XML_SCHEMAP_UNION_NOT_EXPRESSIBLE</a> = 1794 /* 1794 */
    <a name="XML_SCHEMAP_SRC_IMPORT_3_1">XML_SCHEMAP_SRC_IMPORT_3_1</a> = 1795 /* 1795 */
    <a name="XML_SCHEMAP_SRC_IMPORT_3_2">XML_SCHEMAP_SRC_IMPORT_3_2</a> = 1796 /* 1796 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1</a> = 1797 /* 1797 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2</a> = 1798 /* 1798 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3</a> = 1799 /* 1799 */
    <a name="XML_SCHEMAP_COS_CT_EXTENDS_1_3">XML_SCHEMAP_COS_CT_EXTENDS_1_3</a> = 1800 /* 1800 */
    <a name="XML_SCHEMAV_NOROOT">XML_SCHEMAV_NOROOT</a> = 1801
    <a name="XML_SCHEMAV_UNDECLAREDELEM">XML_SCHEMAV_UNDECLAREDELEM</a> = 1802 /* 1802 */
    <a name="XML_SCHEMAV_NOTTOPLEVEL">XML_SCHEMAV_NOTTOPLEVEL</a> = 1803 /* 1803 */
    <a name="XML_SCHEMAV_MISSING">XML_SCHEMAV_MISSING</a> = 1804 /* 1804 */
    <a name="XML_SCHEMAV_WRONGELEM">XML_SCHEMAV_WRONGELEM</a> = 1805 /* 1805 */
    <a name="XML_SCHEMAV_NOTYPE">XML_SCHEMAV_NOTYPE</a> = 1806 /* 1806 */
    <a name="XML_SCHEMAV_NOROLLBACK">XML_SCHEMAV_NOROLLBACK</a> = 1807 /* 1807 */
    <a name="XML_SCHEMAV_ISABSTRACT">XML_SCHEMAV_ISABSTRACT</a> = 1808 /* 1808 */
    <a name="XML_SCHEMAV_NOTEMPTY">XML_SCHEMAV_NOTEMPTY</a> = 1809 /* 1809 */
    <a name="XML_SCHEMAV_ELEMCONT">XML_SCHEMAV_ELEMCONT</a> = 1810 /* 1810 */
    <a name="XML_SCHEMAV_HAVEDEFAULT">XML_SCHEMAV_HAVEDEFAULT</a> = 1811 /* 1811 */
    <a name="XML_SCHEMAV_NOTNILLABLE">XML_SCHEMAV_NOTNILLABLE</a> = 1812 /* 1812 */
    <a name="XML_SCHEMAV_EXTRACONTENT">XML_SCHEMAV_EXTRACONTENT</a> = 1813 /* 1813 */
    <a name="XML_SCHEMAV_INVALIDATTR">XML_SCHEMAV_INVALIDATTR</a> = 1814 /* 1814 */
    <a name="XML_SCHEMAV_INVALIDELEM">XML_SCHEMAV_INVALIDELEM</a> = 1815 /* 1815 */
    <a name="XML_SCHEMAV_NOTDETERMINIST">XML_SCHEMAV_NOTDETERMINIST</a> = 1816 /* 1816 */
    <a name="XML_SCHEMAV_CONSTRUCT">XML_SCHEMAV_CONSTRUCT</a> = 1817 /* 1817 */
    <a name="XML_SCHEMAV_INTERNAL">XML_SCHEMAV_INTERNAL</a> = 1818 /* 1818 */
    <a name="XML_SCHEMAV_NOTSIMPLE">XML_SCHEMAV_NOTSIMPLE</a> = 1819 /* 1819 */
    <a name="XML_SCHEMAV_ATTRUNKNOWN">XML_SCHEMAV_ATTRUNKNOWN</a> = 1820 /* 1820 */
    <a name="XML_SCHEMAV_ATTRINVALID">XML_SCHEMAV_ATTRINVALID</a> = 1821 /* 1821 */
    <a name="XML_SCHEMAV_VALUE">XML_SCHEMAV_VALUE</a> = 1822 /* 1822 */
    <a name="XML_SCHEMAV_FACET">XML_SCHEMAV_FACET</a> = 1823 /* 1823 */
    <a name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1">XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1</a> = 1824 /* 1824 */
    <a name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2">XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2</a> = 1825 /* 1825 */
    <a name="XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3">XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3</a> = 1826 /* 1826 */
    <a name="XML_SCHEMAV_CVC_TYPE_3_1_1">XML_SCHEMAV_CVC_TYPE_3_1_1</a> = 1827 /* 1827 */
    <a name="XML_SCHEMAV_CVC_TYPE_3_1_2">XML_SCHEMAV_CVC_TYPE_3_1_2</a> = 1828 /* 1828 */
    <a name="XML_SCHEMAV_CVC_FACET_VALID">XML_SCHEMAV_CVC_FACET_VALID</a> = 1829 /* 1829 */
    <a name="XML_SCHEMAV_CVC_LENGTH_VALID">XML_SCHEMAV_CVC_LENGTH_VALID</a> = 1830 /* 1830 */
    <a name="XML_SCHEMAV_CVC_MINLENGTH_VALID">XML_SCHEMAV_CVC_MINLENGTH_VALID</a> = 1831 /* 1831 */
    <a name="XML_SCHEMAV_CVC_MAXLENGTH_VALID">XML_SCHEMAV_CVC_MAXLENGTH_VALID</a> = 1832 /* 1832 */
    <a name="XML_SCHEMAV_CVC_MININCLUSIVE_VALID">XML_SCHEMAV_CVC_MININCLUSIVE_VALID</a> = 1833 /* 1833 */
    <a name="XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID">XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID</a> = 1834 /* 1834 */
    <a name="XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID">XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID</a> = 1835 /* 1835 */
    <a name="XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID">XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID</a> = 1836 /* 1836 */
    <a name="XML_SCHEMAV_CVC_TOTALDIGITS_VALID">XML_SCHEMAV_CVC_TOTALDIGITS_VALID</a> = 1837 /* 1837 */
    <a name="XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID">XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID</a> = 1838 /* 1838 */
    <a name="XML_SCHEMAV_CVC_PATTERN_VALID">XML_SCHEMAV_CVC_PATTERN_VALID</a> = 1839 /* 1839 */
    <a name="XML_SCHEMAV_CVC_ENUMERATION_VALID">XML_SCHEMAV_CVC_ENUMERATION_VALID</a> = 1840 /* 1840 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1">XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1</a> = 1841 /* 1841 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2">XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2</a> = 1842 /* 1842 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3">XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3</a> = 1843 /* 1843 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4">XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4</a> = 1844 /* 1844 */
    <a name="XML_SCHEMAV_CVC_ELT_1">XML_SCHEMAV_CVC_ELT_1</a> = 1845 /* 1845 */
    <a name="XML_SCHEMAV_CVC_ELT_2">XML_SCHEMAV_CVC_ELT_2</a> = 1846 /* 1846 */
    <a name="XML_SCHEMAV_CVC_ELT_3_1">XML_SCHEMAV_CVC_ELT_3_1</a> = 1847 /* 1847 */
    <a name="XML_SCHEMAV_CVC_ELT_3_2_1">XML_SCHEMAV_CVC_ELT_3_2_1</a> = 1848 /* 1848 */
    <a name="XML_SCHEMAV_CVC_ELT_3_2_2">XML_SCHEMAV_CVC_ELT_3_2_2</a> = 1849 /* 1849 */
    <a name="XML_SCHEMAV_CVC_ELT_4_1">XML_SCHEMAV_CVC_ELT_4_1</a> = 1850 /* 1850 */
    <a name="XML_SCHEMAV_CVC_ELT_4_2">XML_SCHEMAV_CVC_ELT_4_2</a> = 1851 /* 1851 */
    <a name="XML_SCHEMAV_CVC_ELT_4_3">XML_SCHEMAV_CVC_ELT_4_3</a> = 1852 /* 1852 */
    <a name="XML_SCHEMAV_CVC_ELT_5_1_1">XML_SCHEMAV_CVC_ELT_5_1_1</a> = 1853 /* 1853 */
    <a name="XML_SCHEMAV_CVC_ELT_5_1_2">XML_SCHEMAV_CVC_ELT_5_1_2</a> = 1854 /* 1854 */
    <a name="XML_SCHEMAV_CVC_ELT_5_2_1">XML_SCHEMAV_CVC_ELT_5_2_1</a> = 1855 /* 1855 */
    <a name="XML_SCHEMAV_CVC_ELT_5_2_2_1">XML_SCHEMAV_CVC_ELT_5_2_2_1</a> = 1856 /* 1856 */
    <a name="XML_SCHEMAV_CVC_ELT_5_2_2_2_1">XML_SCHEMAV_CVC_ELT_5_2_2_2_1</a> = 1857 /* 1857 */
    <a name="XML_SCHEMAV_CVC_ELT_5_2_2_2_2">XML_SCHEMAV_CVC_ELT_5_2_2_2_2</a> = 1858 /* 1858 */
    <a name="XML_SCHEMAV_CVC_ELT_6">XML_SCHEMAV_CVC_ELT_6</a> = 1859 /* 1859 */
    <a name="XML_SCHEMAV_CVC_ELT_7">XML_SCHEMAV_CVC_ELT_7</a> = 1860 /* 1860 */
    <a name="XML_SCHEMAV_CVC_ATTRIBUTE_1">XML_SCHEMAV_CVC_ATTRIBUTE_1</a> = 1861 /* 1861 */
    <a name="XML_SCHEMAV_CVC_ATTRIBUTE_2">XML_SCHEMAV_CVC_ATTRIBUTE_2</a> = 1862 /* 1862 */
    <a name="XML_SCHEMAV_CVC_ATTRIBUTE_3">XML_SCHEMAV_CVC_ATTRIBUTE_3</a> = 1863 /* 1863 */
    <a name="XML_SCHEMAV_CVC_ATTRIBUTE_4">XML_SCHEMAV_CVC_ATTRIBUTE_4</a> = 1864 /* 1864 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1">XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1</a> = 1865 /* 1865 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1">XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1</a> = 1866 /* 1866 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2">XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2</a> = 1867 /* 1867 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_4">XML_SCHEMAV_CVC_COMPLEX_TYPE_4</a> = 1868 /* 1868 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1">XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1</a> = 1869 /* 1869 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2">XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2</a> = 1870 /* 1870 */
    <a name="XML_SCHEMAV_ELEMENT_CONTENT">XML_SCHEMAV_ELEMENT_CONTENT</a> = 1871 /* 1871 */
    <a name="XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING">XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING</a> = 1872 /* 1872 */
    <a name="XML_SCHEMAV_CVC_COMPLEX_TYPE_1">XML_SCHEMAV_CVC_COMPLEX_TYPE_1</a> = 1873 /* 1873 */
    <a name="XML_SCHEMAV_CVC_AU">XML_SCHEMAV_CVC_AU</a> = 1874 /* 1874 */
    <a name="XML_SCHEMAV_CVC_TYPE_1">XML_SCHEMAV_CVC_TYPE_1</a> = 1875 /* 1875 */
    <a name="XML_SCHEMAV_CVC_TYPE_2">XML_SCHEMAV_CVC_TYPE_2</a> = 1876 /* 1876 */
    <a name="XML_SCHEMAV_CVC_IDC">XML_SCHEMAV_CVC_IDC</a> = 1877 /* 1877 */
    <a name="XML_SCHEMAV_CVC_WILDCARD">XML_SCHEMAV_CVC_WILDCARD</a> = 1878 /* 1878 */
    <a name="XML_SCHEMAV_MISC">XML_SCHEMAV_MISC</a> = 1879 /* 1879 */
    <a name="XML_XPTR_UNKNOWN_SCHEME">XML_XPTR_UNKNOWN_SCHEME</a> = 1900
    <a name="XML_XPTR_CHILDSEQ_START">XML_XPTR_CHILDSEQ_START</a> = 1901 /* 1901 */
    <a name="XML_XPTR_EVAL_FAILED">XML_XPTR_EVAL_FAILED</a> = 1902 /* 1902 */
    <a name="XML_XPTR_EXTRA_OBJECTS">XML_XPTR_EXTRA_OBJECTS</a> = 1903 /* 1903 */
    <a name="XML_C14N_CREATE_CTXT">XML_C14N_CREATE_CTXT</a> = 1950
    <a name="XML_C14N_REQUIRES_UTF8">XML_C14N_REQUIRES_UTF8</a> = 1951 /* 1951 */
    <a name="XML_C14N_CREATE_STACK">XML_C14N_CREATE_STACK</a> = 1952 /* 1952 */
    <a name="XML_C14N_INVALID_NODE">XML_C14N_INVALID_NODE</a> = 1953 /* 1953 */
    <a name="XML_C14N_UNKNOW_NODE">XML_C14N_UNKNOW_NODE</a> = 1954 /* 1954 */
    <a name="XML_C14N_RELATIVE_NAMESPACE">XML_C14N_RELATIVE_NAMESPACE</a> = 1955 /* 1955 */
    <a name="XML_FTP_PASV_ANSWER">XML_FTP_PASV_ANSWER</a> = 2000
    <a name="XML_FTP_EPSV_ANSWER">XML_FTP_EPSV_ANSWER</a> = 2001 /* 2001 */
    <a name="XML_FTP_ACCNT">XML_FTP_ACCNT</a> = 2002 /* 2002 */
    <a name="XML_FTP_URL_SYNTAX">XML_FTP_URL_SYNTAX</a> = 2003 /* 2003 */
    <a name="XML_HTTP_URL_SYNTAX">XML_HTTP_URL_SYNTAX</a> = 2020
    <a name="XML_HTTP_USE_IP">XML_HTTP_USE_IP</a> = 2021 /* 2021 */
    <a name="XML_HTTP_UNKNOWN_HOST">XML_HTTP_UNKNOWN_HOST</a> = 2022 /* 2022 */
    <a name="XML_SCHEMAP_SRC_SIMPLE_TYPE_1">XML_SCHEMAP_SRC_SIMPLE_TYPE_1</a> = 3000
    <a name="XML_SCHEMAP_SRC_SIMPLE_TYPE_2">XML_SCHEMAP_SRC_SIMPLE_TYPE_2</a> = 3001 /* 3001 */
    <a name="XML_SCHEMAP_SRC_SIMPLE_TYPE_3">XML_SCHEMAP_SRC_SIMPLE_TYPE_3</a> = 3002 /* 3002 */
    <a name="XML_SCHEMAP_SRC_SIMPLE_TYPE_4">XML_SCHEMAP_SRC_SIMPLE_TYPE_4</a> = 3003 /* 3003 */
    <a name="XML_SCHEMAP_SRC_RESOLVE">XML_SCHEMAP_SRC_RESOLVE</a> = 3004 /* 3004 */
    <a name="XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE">XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE</a> = 3005 /* 3005 */
    <a name="XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE">XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE</a> = 3006 /* 3006 */
    <a name="XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES">XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES</a> = 3007 /* 3007 */
    <a name="XML_SCHEMAP_ST_PROPS_CORRECT_1">XML_SCHEMAP_ST_PROPS_CORRECT_1</a> = 3008 /* 3008 */
    <a name="XML_SCHEMAP_ST_PROPS_CORRECT_2">XML_SCHEMAP_ST_PROPS_CORRECT_2</a> = 3009 /* 3009 */
    <a name="XML_SCHEMAP_ST_PROPS_CORRECT_3">XML_SCHEMAP_ST_PROPS_CORRECT_3</a> = 3010 /* 3010 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_1_1">XML_SCHEMAP_COS_ST_RESTRICTS_1_1</a> = 3011 /* 3011 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_1_2">XML_SCHEMAP_COS_ST_RESTRICTS_1_2</a> = 3012 /* 3012 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1">XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1</a> = 3013 /* 3013 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2">XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2</a> = 3014 /* 3014 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_1">XML_SCHEMAP_COS_ST_RESTRICTS_2_1</a> = 3015 /* 3015 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1</a> = 3016 /* 3016 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2</a> = 3017 /* 3017 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1</a> = 3018 /* 3018 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2</a> = 3019 /* 3019 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3</a> = 3020 /* 3020 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4</a> = 3021 /* 3021 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5">XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5</a> = 3022 /* 3022 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_1">XML_SCHEMAP_COS_ST_RESTRICTS_3_1</a> = 3023 /* 3023 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1</a> = 3024 /* 3024 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2</a> = 3025 /* 3025 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2</a> = 3026 /* 3026 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1</a> = 3027 /* 3027 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3</a> = 3028 /* 3028 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4</a> = 3029 /* 3029 */
    <a name="XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5">XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5</a> = 3030 /* 3030 */
    <a name="XML_SCHEMAP_COS_ST_DERIVED_OK_2_1">XML_SCHEMAP_COS_ST_DERIVED_OK_2_1</a> = 3031 /* 3031 */
    <a name="XML_SCHEMAP_COS_ST_DERIVED_OK_2_2">XML_SCHEMAP_COS_ST_DERIVED_OK_2_2</a> = 3032 /* 3032 */
    <a name="XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED">XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED</a> = 3033 /* 3033 */
    <a name="XML_SCHEMAP_S4S_ELEM_MISSING">XML_SCHEMAP_S4S_ELEM_MISSING</a> = 3034 /* 3034 */
    <a name="XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED">XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED</a> = 3035 /* 3035 */
    <a name="XML_SCHEMAP_S4S_ATTR_MISSING">XML_SCHEMAP_S4S_ATTR_MISSING</a> = 3036 /* 3036 */
    <a name="XML_SCHEMAP_S4S_ATTR_INVALID_VALUE">XML_SCHEMAP_S4S_ATTR_INVALID_VALUE</a> = 3037 /* 3037 */
    <a name="XML_SCHEMAP_SRC_ELEMENT_1">XML_SCHEMAP_SRC_ELEMENT_1</a> = 3038 /* 3038 */
    <a name="XML_SCHEMAP_SRC_ELEMENT_2_1">XML_SCHEMAP_SRC_ELEMENT_2_1</a> = 3039 /* 3039 */
    <a name="XML_SCHEMAP_SRC_ELEMENT_2_2">XML_SCHEMAP_SRC_ELEMENT_2_2</a> = 3040 /* 3040 */
    <a name="XML_SCHEMAP_SRC_ELEMENT_3">XML_SCHEMAP_SRC_ELEMENT_3</a> = 3041 /* 3041 */
    <a name="XML_SCHEMAP_P_PROPS_CORRECT_1">XML_SCHEMAP_P_PROPS_CORRECT_1</a> = 3042 /* 3042 */
    <a name="XML_SCHEMAP_P_PROPS_CORRECT_2_1">XML_SCHEMAP_P_PROPS_CORRECT_2_1</a> = 3043 /* 3043 */
    <a name="XML_SCHEMAP_P_PROPS_CORRECT_2_2">XML_SCHEMAP_P_PROPS_CORRECT_2_2</a> = 3044 /* 3044 */
    <a name="XML_SCHEMAP_E_PROPS_CORRECT_2">XML_SCHEMAP_E_PROPS_CORRECT_2</a> = 3045 /* 3045 */
    <a name="XML_SCHEMAP_E_PROPS_CORRECT_3">XML_SCHEMAP_E_PROPS_CORRECT_3</a> = 3046 /* 3046 */
    <a name="XML_SCHEMAP_E_PROPS_CORRECT_4">XML_SCHEMAP_E_PROPS_CORRECT_4</a> = 3047 /* 3047 */
    <a name="XML_SCHEMAP_E_PROPS_CORRECT_5">XML_SCHEMAP_E_PROPS_CORRECT_5</a> = 3048 /* 3048 */
    <a name="XML_SCHEMAP_E_PROPS_CORRECT_6">XML_SCHEMAP_E_PROPS_CORRECT_6</a> = 3049 /* 3049 */
    <a name="XML_SCHEMAP_SRC_INCLUDE">XML_SCHEMAP_SRC_INCLUDE</a> = 3050 /* 3050 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_1">XML_SCHEMAP_SRC_ATTRIBUTE_1</a> = 3051 /* 3051 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_2">XML_SCHEMAP_SRC_ATTRIBUTE_2</a> = 3052 /* 3052 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_3_1">XML_SCHEMAP_SRC_ATTRIBUTE_3_1</a> = 3053 /* 3053 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_3_2">XML_SCHEMAP_SRC_ATTRIBUTE_3_2</a> = 3054 /* 3054 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_4">XML_SCHEMAP_SRC_ATTRIBUTE_4</a> = 3055 /* 3055 */
    <a name="XML_SCHEMAP_NO_XMLNS">XML_SCHEMAP_NO_XMLNS</a> = 3056 /* 3056 */
    <a name="XML_SCHEMAP_NO_XSI">XML_SCHEMAP_NO_XSI</a> = 3057 /* 3057 */
    <a name="XML_SCHEMAP_COS_VALID_DEFAULT_1">XML_SCHEMAP_COS_VALID_DEFAULT_1</a> = 3058 /* 3058 */
    <a name="XML_SCHEMAP_COS_VALID_DEFAULT_2_1">XML_SCHEMAP_COS_VALID_DEFAULT_2_1</a> = 3059 /* 3059 */
    <a name="XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1">XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1</a> = 3060 /* 3060 */
    <a name="XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2">XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2</a> = 3061 /* 3061 */
    <a name="XML_SCHEMAP_CVC_SIMPLE_TYPE">XML_SCHEMAP_CVC_SIMPLE_TYPE</a> = 3062 /* 3062 */
    <a name="XML_SCHEMAP_COS_CT_EXTENDS_1_1">XML_SCHEMAP_COS_CT_EXTENDS_1_1</a> = 3063 /* 3063 */
    <a name="XML_SCHEMAP_SRC_IMPORT_1_1">XML_SCHEMAP_SRC_IMPORT_1_1</a> = 3064 /* 3064 */
    <a name="XML_SCHEMAP_SRC_IMPORT_1_2">XML_SCHEMAP_SRC_IMPORT_1_2</a> = 3065 /* 3065 */
    <a name="XML_SCHEMAP_SRC_IMPORT_2">XML_SCHEMAP_SRC_IMPORT_2</a> = 3066 /* 3066 */
    <a name="XML_SCHEMAP_SRC_IMPORT_2_1">XML_SCHEMAP_SRC_IMPORT_2_1</a> = 3067 /* 3067 */
    <a name="XML_SCHEMAP_SRC_IMPORT_2_2">XML_SCHEMAP_SRC_IMPORT_2_2</a> = 3068 /* 3068 */
    <a name="XML_SCHEMAP_INTERNAL">XML_SCHEMAP_INTERNAL</a> = 3069 /* 3069 non-W3C */
    <a name="XML_SCHEMAP_NOT_DETERMINISTIC">XML_SCHEMAP_NOT_DETERMINISTIC</a> = 3070 /* 3070 non-W3C */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1">XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1</a> = 3071 /* 3071 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2">XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2</a> = 3072 /* 3072 */
    <a name="XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3">XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3</a> = 3073 /* 3073 */
    <a name="XML_SCHEMAP_MG_PROPS_CORRECT_1">XML_SCHEMAP_MG_PROPS_CORRECT_1</a> = 3074 /* 3074 */
    <a name="XML_SCHEMAP_MG_PROPS_CORRECT_2">XML_SCHEMAP_MG_PROPS_CORRECT_2</a> = 3075 /* 3075 */
    <a name="XML_SCHEMAP_SRC_CT_1">XML_SCHEMAP_SRC_CT_1</a> = 3076 /* 3076 */
    <a name="XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3">XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3</a> = 3077 /* 3077 */
    <a name="XML_SCHEMAP_AU_PROPS_CORRECT_2">XML_SCHEMAP_AU_PROPS_CORRECT_2</a> = 3078 /* 3078 */
    <a name="XML_SCHEMAP_A_PROPS_CORRECT_2">XML_SCHEMAP_A_PROPS_CORRECT_2</a> = 3079 /* 3079 */
    <a name="XML_SCHEMAP_C_PROPS_CORRECT">XML_SCHEMAP_C_PROPS_CORRECT</a> = 3080 /* 3080 */
    <a name="XML_SCHEMAP_SRC_REDEFINE">XML_SCHEMAP_SRC_REDEFINE</a> = 3081 /* 3081 */
    <a name="XML_SCHEMAP_SRC_IMPORT">XML_SCHEMAP_SRC_IMPORT</a> = 3082 /* 3082 */
    <a name="XML_SCHEMAP_WARN_SKIP_SCHEMA">XML_SCHEMAP_WARN_SKIP_SCHEMA</a> = 3083 /* 3083 */
    <a name="XML_SCHEMAP_WARN_UNLOCATED_SCHEMA">XML_SCHEMAP_WARN_UNLOCATED_SCHEMA</a> = 3084 /* 3084 */
    <a name="XML_SCHEMAP_WARN_ATTR_REDECL_PROH">XML_SCHEMAP_WARN_ATTR_REDECL_PROH</a> = 3085 /* 3085 */
    <a name="XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH">XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH</a> = 3086 /* 3085 */
    <a name="XML_SCHEMAP_AG_PROPS_CORRECT">XML_SCHEMAP_AG_PROPS_CORRECT</a> = 3087 /* 3086 */
    <a name="XML_SCHEMAP_COS_CT_EXTENDS_1_2">XML_SCHEMAP_COS_CT_EXTENDS_1_2</a> = 3088 /* 3087 */
    <a name="XML_SCHEMAP_AU_PROPS_CORRECT">XML_SCHEMAP_AU_PROPS_CORRECT</a> = 3089 /* 3088 */
    <a name="XML_SCHEMAP_A_PROPS_CORRECT_3">XML_SCHEMAP_A_PROPS_CORRECT_3</a> = 3090 /* 3089 */
    <a name="XML_SCHEMAP_COS_ALL_LIMITED">XML_SCHEMAP_COS_ALL_LIMITED</a> = 3091 /* 3090 */
    <a name="XML_SCHEMATRONV_ASSERT">XML_SCHEMATRONV_ASSERT</a> = 4000 /* 4000 */
    <a name="XML_SCHEMATRONV_REPORT">XML_SCHEMATRONV_REPORT</a> = 4001
    <a name="XML_MODULE_OPEN">XML_MODULE_OPEN</a> = 4900 /* 4900 */
    <a name="XML_MODULE_CLOSE">XML_MODULE_CLOSE</a> = 4901 /* 4901 */
    <a name="XML_CHECK_FOUND_ELEMENT">XML_CHECK_FOUND_ELEMENT</a> = 5000
    <a name="XML_CHECK_FOUND_ATTRIBUTE">XML_CHECK_FOUND_ATTRIBUTE</a> = 5001 /* 5001 */
    <a name="XML_CHECK_FOUND_TEXT">XML_CHECK_FOUND_TEXT</a> = 5002 /* 5002 */
    <a name="XML_CHECK_FOUND_CDATA">XML_CHECK_FOUND_CDATA</a> = 5003 /* 5003 */
    <a name="XML_CHECK_FOUND_ENTITYREF">XML_CHECK_FOUND_ENTITYREF</a> = 5004 /* 5004 */
    <a name="XML_CHECK_FOUND_ENTITY">XML_CHECK_FOUND_ENTITY</a> = 5005 /* 5005 */
    <a name="XML_CHECK_FOUND_PI">XML_CHECK_FOUND_PI</a> = 5006 /* 5006 */
    <a name="XML_CHECK_FOUND_COMMENT">XML_CHECK_FOUND_COMMENT</a> = 5007 /* 5007 */
    <a name="XML_CHECK_FOUND_DOCTYPE">XML_CHECK_FOUND_DOCTYPE</a> = 5008 /* 5008 */
    <a name="XML_CHECK_FOUND_FRAGMENT">XML_CHECK_FOUND_FRAGMENT</a> = 5009 /* 5009 */
    <a name="XML_CHECK_FOUND_NOTATION">XML_CHECK_FOUND_NOTATION</a> = 5010 /* 5010 */
    <a name="XML_CHECK_UNKNOWN_NODE">XML_CHECK_UNKNOWN_NODE</a> = 5011 /* 5011 */
    <a name="XML_CHECK_ENTITY_TYPE">XML_CHECK_ENTITY_TYPE</a> = 5012 /* 5012 */
    <a name="XML_CHECK_NO_PARENT">XML_CHECK_NO_PARENT</a> = 5013 /* 5013 */
    <a name="XML_CHECK_NO_DOC">XML_CHECK_NO_DOC</a> = 5014 /* 5014 */
    <a name="XML_CHECK_NO_NAME">XML_CHECK_NO_NAME</a> = 5015 /* 5015 */
    <a name="XML_CHECK_NO_ELEM">XML_CHECK_NO_ELEM</a> = 5016 /* 5016 */
    <a name="XML_CHECK_WRONG_DOC">XML_CHECK_WRONG_DOC</a> = 5017 /* 5017 */
    <a name="XML_CHECK_NO_PREV">XML_CHECK_NO_PREV</a> = 5018 /* 5018 */
    <a name="XML_CHECK_WRONG_PREV">XML_CHECK_WRONG_PREV</a> = 5019 /* 5019 */
    <a name="XML_CHECK_NO_NEXT">XML_CHECK_NO_NEXT</a> = 5020 /* 5020 */
    <a name="XML_CHECK_WRONG_NEXT">XML_CHECK_WRONG_NEXT</a> = 5021 /* 5021 */
    <a name="XML_CHECK_NOT_DTD">XML_CHECK_NOT_DTD</a> = 5022 /* 5022 */
    <a name="XML_CHECK_NOT_ATTR">XML_CHECK_NOT_ATTR</a> = 5023 /* 5023 */
    <a name="XML_CHECK_NOT_ATTR_DECL">XML_CHECK_NOT_ATTR_DECL</a> = 5024 /* 5024 */
    <a name="XML_CHECK_NOT_ELEM_DECL">XML_CHECK_NOT_ELEM_DECL</a> = 5025 /* 5025 */
    <a name="XML_CHECK_NOT_ENTITY_DECL">XML_CHECK_NOT_ENTITY_DECL</a> = 5026 /* 5026 */
    <a name="XML_CHECK_NOT_NS_DECL">XML_CHECK_NOT_NS_DECL</a> = 5027 /* 5027 */
    <a name="XML_CHECK_NO_HREF">XML_CHECK_NO_HREF</a> = 5028 /* 5028 */
    <a name="XML_CHECK_WRONG_PARENT">XML_CHECK_WRONG_PARENT</a> = 5029 /* 5029 */
    <a name="XML_CHECK_NS_SCOPE">XML_CHECK_NS_SCOPE</a> = 5030 /* 5030 */
    <a name="XML_CHECK_NS_ANCESTOR">XML_CHECK_NS_ANCESTOR</a> = 5031 /* 5031 */
    <a name="XML_CHECK_NOT_UTF8">XML_CHECK_NOT_UTF8</a> = 5032 /* 5032 */
    <a name="XML_CHECK_NO_DICT">XML_CHECK_NO_DICT</a> = 5033 /* 5033 */
    <a name="XML_CHECK_NOT_NCNAME">XML_CHECK_NOT_NCNAME</a> = 5034 /* 5034 */
    <a name="XML_CHECK_OUTSIDE_DICT">XML_CHECK_OUTSIDE_DICT</a> = 5035 /* 5035 */
    <a name="XML_CHECK_WRONG_NAME">XML_CHECK_WRONG_NAME</a> = 5036 /* 5036 */
    <a name="XML_CHECK_NAME_NOT_NULL">XML_CHECK_NAME_NOT_NULL</a> = 5037 /* 5037 */
    <a name="XML_I18N_NO_NAME">XML_I18N_NO_NAME</a> = 6000
    <a name="XML_I18N_NO_HANDLER">XML_I18N_NO_HANDLER</a> = 6001 /* 6001 */
    <a name="XML_I18N_EXCESS_HANDLER">XML_I18N_EXCESS_HANDLER</a> = 6002 /* 6002 */
    <a name="XML_I18N_CONV_FAILED">XML_I18N_CONV_FAILED</a> = 6003 /* 6003 */
    <a name="XML_I18N_NO_OUTPUT">XML_I18N_NO_OUTPUT</a> = 6004 /* 6004 */
    <a name="XML_BUF_OVERFLOW">XML_BUF_OVERFLOW</a> = 7000
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGenericErrorFunc"></a>Function type xmlGenericErrorFunc</h3>
<pre class="programlisting">void	xmlGenericErrorFunc		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of the function to use when there is an error and no parsing or validity context available .</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>a parsing context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>the extra arguments of the varargs to format the message</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlStructuredErrorFunc"></a>Function type xmlStructuredErrorFunc</h3>
<pre class="programlisting">void	xmlStructuredErrorFunc		(void * userData, <br>					 <a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> error)<br>
</pre>
<p>Signature of the function to use when there is an error and the module handles the new error reporting mechanism.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>userData</tt></i>:</span></td>
<td>user provided data for the error callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>error</tt></i>:</span></td>
<td>the error being raised.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="initGenericErrorDefaultFunc"></a>initGenericErrorDefaultFunc ()</h3>
<pre class="programlisting">void	initGenericErrorDefaultFunc	(<a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> * handler)<br>
</pre>
<p>Set or reset (if NULL) the default handler for generic errors to the builtin error function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the handler</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyError"></a>xmlCopyError ()</h3>
<pre class="programlisting">int	xmlCopyError			(<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> from, <br>					 <a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> to)<br>
</pre>
<p>Save the original error to the new place.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>from</tt></i>:</span></td>
<td>a source error</td>
</tr>
<tr>
<td><span class="term"><i><tt>to</tt></i>:</span></td>
<td>a target error</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtGetLastError"></a>xmlCtxtGetLastError ()</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a>	xmlCtxtGetLastError	(void * ctx)<br>
</pre>
<p>Get the last parsing error registered.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if no error occurred or a pointer to the error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCtxtResetLastError"></a>xmlCtxtResetLastError ()</h3>
<pre class="programlisting">void	xmlCtxtResetLastError		(void * ctx)<br>
</pre>
<p>Cleanup the last global error registered. For parsing error this does not change the well-formedness result.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetLastError"></a>xmlGetLastError ()</h3>
<pre class="programlisting"><a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a>	xmlGetLastError		(void)<br>
</pre>
<p>Get the last global error registered. This is per thread if compiled with thread support.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if no error occurred or a pointer to the error</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserError"></a>xmlParserError ()</h3>
<pre class="programlisting">void	xmlParserError			(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format an error messages, gives file, line, position and extra parameters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserPrintFileContext"></a>xmlParserPrintFileContext ()</h3>
<pre class="programlisting">void	xmlParserPrintFileContext	(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input)<br>
</pre>
<p>Displays current context within the input content for error tracking</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserPrintFileInfo"></a>xmlParserPrintFileInfo ()</h3>
<pre class="programlisting">void	xmlParserPrintFileInfo		(<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input)<br>
</pre>
<p>Displays the associated file and line information for the current input</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>an <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> input</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserValidityError"></a>xmlParserValidityError ()</h3>
<pre class="programlisting">void	xmlParserValidityError		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format an validity error messages, gives file, line, position and extra parameters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserValidityWarning"></a>xmlParserValidityWarning ()</h3>
<pre class="programlisting">void	xmlParserValidityWarning	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format a validity warning messages, gives file, line, position and extra parameters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParserWarning"></a>xmlParserWarning ()</h3>
<pre class="programlisting">void	xmlParserWarning		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Display and format a warning messages, gives file, line, position and extra parameters.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>an XML parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message to display/transmit</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra parameters for the message display</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlResetError"></a>xmlResetError ()</h3>
<pre class="programlisting">void	xmlResetError			(<a href="libxml2-xmlerror.html#xmlErrorPtr">xmlErrorPtr</a> err)<br>
</pre>
<p>Cleanup the error.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>pointer to the error.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlResetLastError"></a>xmlResetLastError ()</h3>
<pre class="programlisting">void	xmlResetLastError		(void)<br>
</pre>
<p>Cleanup the last global error registered. For parsing error this does not change the well-formedness result.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetGenericErrorFunc"></a>xmlSetGenericErrorFunc ()</h3>
<pre class="programlisting">void	xmlSetGenericErrorFunc		(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlGenericErrorFunc">xmlGenericErrorFunc</a> handler)<br>
</pre>
<p>Function to reset the handler and the error context for out of context error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler One can simply force messages to be emitted to another FILE * than stderr by setting @ctx to this file handle and @handler to NULL. For multi-threaded applications, this must be set separately for each thread.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the new error handling context</td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the new handler function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSetStructuredErrorFunc"></a>xmlSetStructuredErrorFunc ()</h3>
<pre class="programlisting">void	xmlSetStructuredErrorFunc	(void * ctx, <br>					 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> handler)<br>
</pre>
<p>Function to reset the handler and the error context for out of context structured error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler For multi-threaded applications, this must be set separately for each thread.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the new error handling context</td>
</tr>
<tr>
<td><span class="term"><i><tt>handler</tt></i>:</span></td>
<td>the new handler function</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-xmlschemas.html000064400000122116151730335350015022 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>xmlschemas: incomplete XML Schemas structure implementation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-xmlsave.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xmlschemastypes.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">xmlschemas</span></h2>
<p>xmlschemas - incomplete XML Schemas structure implementation</p>
<p>interface to the XML Schemas handling and schema validity checking, it is incomplete right now. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">typedef struct _xmlSchema <a href="#xmlSchema">xmlSchema</a>;
typedef struct _xmlSchemaParserCtxt <a href="#xmlSchemaParserCtxt">xmlSchemaParserCtxt</a>;
typedef <a href="libxml2-xmlschemas.html#xmlSchemaParserCtxt">xmlSchemaParserCtxt</a> * <a href="#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>;
typedef <a href="libxml2-xmlschemas.html#xmlSchema">xmlSchema</a> * <a href="#xmlSchemaPtr">xmlSchemaPtr</a>;
typedef <a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugStruct">xmlSchemaSAXPlugStruct</a> * <a href="#xmlSchemaSAXPlugPtr">xmlSchemaSAXPlugPtr</a>;
typedef struct _xmlSchemaSAXPlug <a href="#xmlSchemaSAXPlugStruct">xmlSchemaSAXPlugStruct</a>;
typedef struct _xmlSchemaValidCtxt <a href="#xmlSchemaValidCtxt">xmlSchemaValidCtxt</a>;
typedef <a href="libxml2-xmlschemas.html#xmlSchemaValidCtxt">xmlSchemaValidCtxt</a> * <a href="#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a>;
typedef enum <a href="#xmlSchemaValidError">xmlSchemaValidError</a>;
typedef enum <a href="#xmlSchemaValidOption">xmlSchemaValidOption</a>;
void	<a href="#xmlSchemaDump">xmlSchemaDump</a>			(FILE * output, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema);
void	<a href="#xmlSchemaFree">xmlSchemaFree</a>			(<a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema);
void	<a href="#xmlSchemaFreeParserCtxt">xmlSchemaFreeParserCtxt</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt);
void	<a href="#xmlSchemaFreeValidCtxt">xmlSchemaFreeValidCtxt</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt);
int	<a href="#xmlSchemaGetParserErrors">xmlSchemaGetParserErrors</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> * err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> * warn, <br>					 void ** ctx);
int	<a href="#xmlSchemaGetValidErrors">xmlSchemaGetValidErrors</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> * err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> * warn, <br>					 void ** ctx);
int	<a href="#xmlSchemaIsValid">xmlSchemaIsValid</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt);
<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	<a href="#xmlSchemaNewDocParserCtxt">xmlSchemaNewDocParserCtxt</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	<a href="#xmlSchemaNewMemParserCtxt">xmlSchemaNewMemParserCtxt</a>	(const char * buffer, <br>							 int size);
<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	<a href="#xmlSchemaNewParserCtxt">xmlSchemaNewParserCtxt</a>	(const char * URL);
<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a>	<a href="#xmlSchemaNewValidCtxt">xmlSchemaNewValidCtxt</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema);
<a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a>	<a href="#xmlSchemaParse">xmlSchemaParse</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt);
<a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugPtr">xmlSchemaSAXPlugPtr</a>	<a href="#xmlSchemaSAXPlug">xmlSchemaSAXPlug</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> * sax, <br>						 void ** user_data);
int	<a href="#xmlSchemaSAXUnplug">xmlSchemaSAXUnplug</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugPtr">xmlSchemaSAXPlugPtr</a> plug);
void	<a href="#xmlSchemaSetParserErrors">xmlSchemaSetParserErrors</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> warn, <br>					 void * ctx);
void	<a href="#xmlSchemaSetParserStructuredErrors">xmlSchemaSetParserStructuredErrors</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx);
void	<a href="#xmlSchemaSetValidErrors">xmlSchemaSetValidErrors</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> warn, <br>					 void * ctx);
int	<a href="#xmlSchemaSetValidOptions">xmlSchemaSetValidOptions</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 int options);
void	<a href="#xmlSchemaSetValidStructuredErrors">xmlSchemaSetValidStructuredErrors</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx);
int	<a href="#xmlSchemaValidCtxtGetOptions">xmlSchemaValidCtxtGetOptions</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt);
<a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	<a href="#xmlSchemaValidCtxtGetParserCtxt">xmlSchemaValidCtxtGetParserCtxt</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt);
int	<a href="#xmlSchemaValidateDoc">xmlSchemaValidateDoc</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlSchemaValidateFile">xmlSchemaValidateFile</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 int options);
int	<a href="#xmlSchemaValidateOneElement">xmlSchemaValidateOneElement</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
void	<a href="#xmlSchemaValidateSetFilename">xmlSchemaValidateSetFilename</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> vctxt, <br>					 const char * filename);
void	<a href="#xmlSchemaValidateSetLocator">xmlSchemaValidateSetLocator</a>	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> vctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityLocatorFunc">xmlSchemaValidityLocatorFunc</a> f, <br>					 void * ctxt);
int	<a href="#xmlSchemaValidateStream">xmlSchemaValidateStream</a>		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data);
typedef void <a href="#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef int <a href="#xmlSchemaValidityLocatorFunc">xmlSchemaValidityLocatorFunc</a>	(void * ctx, <br>					 const char ** file, <br>					 unsigned long * line);
typedef void <a href="#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a>	(void * ctx, <br>					 const char * msg, <br>					 ... ...);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchema">Structure </a>xmlSchema</h3>
<pre class="programlisting">struct _xmlSchema {
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	name	: schema name
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	targetNamespace	: the target namespace
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	version
    const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	id	: Obsolete
    <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	doc
    <a href="libxml2-schemasInternals.html#xmlSchemaAnnotPtr">xmlSchemaAnnotPtr</a>	annot
    int	flags
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	typeDecl
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	attrDecl
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	attrgrpDecl
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	elemDecl
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	notaDecl
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	schemasImports
    void *	_private	: unused by the library for users or bindings
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	groupDecl
    <a href="libxml2-dict.html#xmlDictPtr">xmlDictPtr</a>	dict
    void *	includes	: the includes, this is opaque for now
    int	preserve	: whether to free the document
    int	counter	: used to give anonymous components unique names
    <a href="libxml2-hash.html#xmlHashTablePtr">xmlHashTablePtr</a>	idcDef	: All identity-constraint defs.
    void *	volatiles	: Obsolete
} xmlSchema;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaParserCtxt">Structure </a>xmlSchemaParserCtxt</h3>
<pre class="programlisting">struct _xmlSchemaParserCtxt {
The content of this structure is not made public by the API.
} xmlSchemaParserCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaParserCtxtPtr">Typedef </a>xmlSchemaParserCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaParserCtxt">xmlSchemaParserCtxt</a> * xmlSchemaParserCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaPtr">Typedef </a>xmlSchemaPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchema">xmlSchema</a> * xmlSchemaPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSAXPlugPtr">Typedef </a>xmlSchemaSAXPlugPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugStruct">xmlSchemaSAXPlugStruct</a> * xmlSchemaSAXPlugPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSAXPlugStruct">Structure </a>xmlSchemaSAXPlugStruct</h3>
<pre class="programlisting">struct _xmlSchemaSAXPlug {
The content of this structure is not made public by the API.
} xmlSchemaSAXPlugStruct;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidCtxt">Structure </a>xmlSchemaValidCtxt</h3>
<pre class="programlisting">struct _xmlSchemaValidCtxt {
The content of this structure is not made public by the API.
} xmlSchemaValidCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidCtxtPtr">Typedef </a>xmlSchemaValidCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaValidCtxt">xmlSchemaValidCtxt</a> * xmlSchemaValidCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidError">Enum </a>xmlSchemaValidError</h3>
<pre class="programlisting">enum <a href="#xmlSchemaValidError">xmlSchemaValidError</a> {
    <a name="XML_SCHEMAS_ERR_OK">XML_SCHEMAS_ERR_OK</a> = 0
    <a name="XML_SCHEMAS_ERR_NOROOT">XML_SCHEMAS_ERR_NOROOT</a> = 1
    <a name="XML_SCHEMAS_ERR_UNDECLAREDELEM">XML_SCHEMAS_ERR_UNDECLAREDELEM</a> = 2
    <a name="XML_SCHEMAS_ERR_NOTTOPLEVEL">XML_SCHEMAS_ERR_NOTTOPLEVEL</a> = 3
    <a name="XML_SCHEMAS_ERR_MISSING">XML_SCHEMAS_ERR_MISSING</a> = 4
    <a name="XML_SCHEMAS_ERR_WRONGELEM">XML_SCHEMAS_ERR_WRONGELEM</a> = 5
    <a name="XML_SCHEMAS_ERR_NOTYPE">XML_SCHEMAS_ERR_NOTYPE</a> = 6
    <a name="XML_SCHEMAS_ERR_NOROLLBACK">XML_SCHEMAS_ERR_NOROLLBACK</a> = 7
    <a name="XML_SCHEMAS_ERR_ISABSTRACT">XML_SCHEMAS_ERR_ISABSTRACT</a> = 8
    <a name="XML_SCHEMAS_ERR_NOTEMPTY">XML_SCHEMAS_ERR_NOTEMPTY</a> = 9
    <a name="XML_SCHEMAS_ERR_ELEMCONT">XML_SCHEMAS_ERR_ELEMCONT</a> = 10
    <a name="XML_SCHEMAS_ERR_HAVEDEFAULT">XML_SCHEMAS_ERR_HAVEDEFAULT</a> = 11
    <a name="XML_SCHEMAS_ERR_NOTNILLABLE">XML_SCHEMAS_ERR_NOTNILLABLE</a> = 12
    <a name="XML_SCHEMAS_ERR_EXTRACONTENT">XML_SCHEMAS_ERR_EXTRACONTENT</a> = 13
    <a name="XML_SCHEMAS_ERR_INVALIDATTR">XML_SCHEMAS_ERR_INVALIDATTR</a> = 14
    <a name="XML_SCHEMAS_ERR_INVALIDELEM">XML_SCHEMAS_ERR_INVALIDELEM</a> = 15
    <a name="XML_SCHEMAS_ERR_NOTDETERMINIST">XML_SCHEMAS_ERR_NOTDETERMINIST</a> = 16
    <a name="XML_SCHEMAS_ERR_CONSTRUCT">XML_SCHEMAS_ERR_CONSTRUCT</a> = 17
    <a name="XML_SCHEMAS_ERR_INTERNAL">XML_SCHEMAS_ERR_INTERNAL</a> = 18
    <a name="XML_SCHEMAS_ERR_NOTSIMPLE">XML_SCHEMAS_ERR_NOTSIMPLE</a> = 19
    <a name="XML_SCHEMAS_ERR_ATTRUNKNOWN">XML_SCHEMAS_ERR_ATTRUNKNOWN</a> = 20
    <a name="XML_SCHEMAS_ERR_ATTRINVALID">XML_SCHEMAS_ERR_ATTRINVALID</a> = 21
    <a name="XML_SCHEMAS_ERR_VALUE">XML_SCHEMAS_ERR_VALUE</a> = 22
    <a name="XML_SCHEMAS_ERR_FACET">XML_SCHEMAS_ERR_FACET</a> = 23
    <a name="XML_SCHEMAS_ERR_">XML_SCHEMAS_ERR_</a> = 24
    <a name="XML_SCHEMAS_ERR_XXX">XML_SCHEMAS_ERR_XXX</a> = 25
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidOption">Enum </a>xmlSchemaValidOption</h3>
<pre class="programlisting">enum <a href="#xmlSchemaValidOption">xmlSchemaValidOption</a> {
    <a name="XML_SCHEMA_VAL_VC_I_CREATE">XML_SCHEMA_VAL_VC_I_CREATE</a> = 1 /*  Default/fixed: create an attribute node * or an element's text node on the instance. * */
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidityErrorFunc"></a>Function type xmlSchemaValidityErrorFunc</h3>
<pre class="programlisting">void	xmlSchemaValidityErrorFunc	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of an error callback from an XSD validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidityLocatorFunc"></a>Function type xmlSchemaValidityLocatorFunc</h3>
<pre class="programlisting">int	xmlSchemaValidityLocatorFunc	(void * ctx, <br>					 const char ** file, <br>					 unsigned long * line)<br>
</pre>
<p>A schemas validation locator, a callback called by the validator. This is used when file or node information are not available to find out what file and line number are affected</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>user provided context</td>
</tr>
<tr>
<td><span class="term"><i><tt>file</tt></i>:</span></td>
<td>returned file information</td>
</tr>
<tr>
<td><span class="term"><i><tt>line</tt></i>:</span></td>
<td>returned line information</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidityWarningFunc"></a>Function type xmlSchemaValidityWarningFunc</h3>
<pre class="programlisting">void	xmlSchemaValidityWarningFunc	(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Signature of a warning callback from an XSD validation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the message</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>extra arguments</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaDump"></a>xmlSchemaDump ()</h3>
<pre class="programlisting">void	xmlSchemaDump			(FILE * output, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema)<br>
</pre>
<p>Dump a Schema structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>output</tt></i>:</span></td>
<td>the file output</td>
</tr>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFree"></a>xmlSchemaFree ()</h3>
<pre class="programlisting">void	xmlSchemaFree			(<a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema)<br>
</pre>
<p>Deallocate a Schema structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a schema structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeParserCtxt"></a>xmlSchemaFreeParserCtxt ()</h3>
<pre class="programlisting">void	xmlSchemaFreeParserCtxt		(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema parser context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaFreeValidCtxt"></a>xmlSchemaFreeValidCtxt ()</h3>
<pre class="programlisting">void	xmlSchemaFreeValidCtxt		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt)<br>
</pre>
<p>Free the resources associated to the schema validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetParserErrors"></a>xmlSchemaGetParserErrors ()</h3>
<pre class="programlisting">int	xmlSchemaGetParserErrors	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> * err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> * warn, <br>					 void ** ctx)<br>
</pre>
<p>Get the callback information used to handle errors for a parser context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a XMl-Schema parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error callback result</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning callback result</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>contextual data for the callbacks result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of failure, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaGetValidErrors"></a>xmlSchemaGetValidErrors ()</h3>
<pre class="programlisting">int	xmlSchemaGetValidErrors		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> * err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> * warn, <br>					 void ** ctx)<br>
</pre>
<p>Get the error and warning callback information</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a XML-Schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error function result</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning function result</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context result</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 in case of error and 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaIsValid"></a>xmlSchemaIsValid ()</h3>
<pre class="programlisting">int	xmlSchemaIsValid		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt)<br>
</pre>
<p>Check if any error was detected during validation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid so far, 0 if errors were detected, and -1 in case of internal error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewDocParserCtxt"></a>xmlSchemaNewDocParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	xmlSchemaNewDocParserCtxt	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Create an XML Schemas parse context for that document. NB. The document may be modified during the parsing process.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a preparsed document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewMemParserCtxt"></a>xmlSchemaNewMemParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	xmlSchemaNewMemParserCtxt	(const char * buffer, <br>							 int size)<br>
</pre>
<p>Create an XML Schemas parse context for that memory buffer expected to contain an XML Schemas file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buffer</tt></i>:</span></td>
<td>a pointer to a char array containing the schemas</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewParserCtxt"></a>xmlSchemaNewParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a>	xmlSchemaNewParserCtxt	(const char * URL)<br>
</pre>
<p>Create an XML Schemas parse context for that file/resource expected to contain an XML Schemas file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the location of the schema</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaNewValidCtxt"></a>xmlSchemaNewValidCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a>	xmlSchemaNewValidCtxt	(<a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a> schema)<br>
</pre>
<p>Create an XML Schemas validation context based on the given schema.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>schema</tt></i>:</span></td>
<td>a precompiled XML Schemas</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the validation context or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaParse"></a>xmlSchemaParse ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaPtr">xmlSchemaPtr</a>	xmlSchemaParse		(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt)<br>
</pre>
<p>parse a schema definition resource and build an internal XML Schema structure which can be used to validate instances.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the internal XML Schema structure built from the resource or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSAXPlug"></a>xmlSchemaSAXPlug ()</h3>
<pre class="programlisting"><a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugPtr">xmlSchemaSAXPlugPtr</a>	xmlSchemaSAXPlug	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> * sax, <br>						 void ** user_data)<br>
</pre>
<p>Plug a SAX based validation layer in a SAX parsing event flow. The original @saxptr and @dataptr data are replaced by new pointers but the calls to the original will be maintained.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a pointer to the original <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>a pointer to the original SAX user data pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a pointer to a data structure needed to unplug the validation layer or NULL in case of errors.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSAXUnplug"></a>xmlSchemaSAXUnplug ()</h3>
<pre class="programlisting">int	xmlSchemaSAXUnplug		(<a href="libxml2-xmlschemas.html#xmlSchemaSAXPlugPtr">xmlSchemaSAXPlugPtr</a> plug)<br>
</pre>
<p>Unplug a SAX based validation layer in a SAX parsing event flow. The original pointers used in the call are restored.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>plug</tt></i>:</span></td>
<td>a data structure returned by <a href="libxml2-xmlschemas.html#xmlSchemaSAXPlug">xmlSchemaSAXPlug</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of failure.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSetParserErrors"></a>xmlSchemaSetParserErrors ()</h3>
<pre class="programlisting">void	xmlSchemaSetParserErrors	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> warn, <br>					 void * ctx)<br>
</pre>
<p>Set the callback functions used to handle errors for a validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning callback</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>contextual data for the callbacks</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSetParserStructuredErrors"></a>xmlSchemaSetParserStructuredErrors ()</h3>
<pre class="programlisting">void	xmlSchemaSetParserStructuredErrors	(<a href="libxml2-xmlschemas.html#xmlSchemaParserCtxtPtr">xmlSchemaParserCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx)<br>
</pre>
<p>Set the structured error callback</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema parser context</td>
</tr>
<tr>
<td><span class="term"><i><tt>serror</tt></i>:</span></td>
<td>the structured error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSetValidErrors"></a>xmlSchemaSetValidErrors ()</h3>
<pre class="programlisting">void	xmlSchemaSetValidErrors		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityErrorFunc">xmlSchemaValidityErrorFunc</a> err, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityWarningFunc">xmlSchemaValidityWarningFunc</a> warn, <br>					 void * ctx)<br>
</pre>
<p>Set the error and warning callback information</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>err</tt></i>:</span></td>
<td>the error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>warn</tt></i>:</span></td>
<td>the warning function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSetValidOptions"></a>xmlSchemaSetValidOptions ()</h3>
<pre class="programlisting">int	xmlSchemaSetValidOptions	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 int options)<br>
</pre>
<p>Sets the options to be used during the validation.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a combination of <a href="libxml2-xmlschemas.html#xmlSchemaValidOption">xmlSchemaValidOption</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success, -1 in case of an API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaSetValidStructuredErrors"></a>xmlSchemaSetValidStructuredErrors ()</h3>
<pre class="programlisting">void	xmlSchemaSetValidStructuredErrors	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>						 <a href="libxml2-xmlerror.html#xmlStructuredErrorFunc">xmlStructuredErrorFunc</a> serror, <br>						 void * ctx)<br>
</pre>
<p>Set the structured error callback</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>serror</tt></i>:</span></td>
<td>the structured error function</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the functions context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidCtxtGetOptions"></a>xmlSchemaValidCtxtGetOptions ()</h3>
<pre class="programlisting">int	xmlSchemaValidCtxtGetOptions	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt)<br>
</pre>
<p>Get the validation context options.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the option combination or -1 on error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidCtxtGetParserCtxt"></a>xmlSchemaValidCtxtGetParserCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserCtxtPtr">xmlParserCtxtPtr</a>	xmlSchemaValidCtxtGetParserCtxt	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt)<br>
</pre>
<p>allow access to the parser context of the schema validation context</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the parser context of the schema validation context or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateDoc"></a>xmlSchemaValidateDoc ()</h3>
<pre class="programlisting">int	xmlSchemaValidateDoc		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Validate a document tree in memory.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a parsed document tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateFile"></a>xmlSchemaValidateFile ()</h3>
<pre class="programlisting">int	xmlSchemaValidateFile		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 const char * filename, <br>					 int options)<br>
</pre>
<p>Do a schemas validation of the given resource, it will use the SAX streamable validation internally.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the URI of the instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>options</tt></i>:</span></td>
<td>a future set of options, currently unused</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the document is valid, a positive error code number otherwise and -1 in case of an internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateOneElement"></a>xmlSchemaValidateOneElement ()</h3>
<pre class="programlisting">int	xmlSchemaValidateOneElement	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Validate a branch of a tree, starting with the given @elem.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the element and its subtree is valid, a positive error code number otherwise and -1 in case of an internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateSetFilename"></a>xmlSchemaValidateSetFilename ()</h3>
<pre class="programlisting">void	xmlSchemaValidateSetFilename	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> vctxt, <br>					 const char * filename)<br>
</pre>
<p>Workaround to provide file error reporting information when this is not provided by current APIs</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>vctxt</tt></i>:</span></td>
<td>the schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the file name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateSetLocator"></a>xmlSchemaValidateSetLocator ()</h3>
<pre class="programlisting">void	xmlSchemaValidateSetLocator	(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> vctxt, <br>					 <a href="libxml2-xmlschemas.html#xmlSchemaValidityLocatorFunc">xmlSchemaValidityLocatorFunc</a> f, <br>					 void * ctxt)<br>
</pre>
<p>Allows to set a locator function to the validation context, which will be used to provide file and line information since those are not provided as part of the SAX validation flow Setting @f to NULL disable the locator.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>vctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>f</tt></i>:</span></td>
<td>the locator function pointer</td>
</tr>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the locator context</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSchemaValidateStream"></a>xmlSchemaValidateStream ()</h3>
<pre class="programlisting">int	xmlSchemaValidateStream		(<a href="libxml2-xmlschemas.html#xmlSchemaValidCtxtPtr">xmlSchemaValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlParserInputBufferPtr">xmlParserInputBufferPtr</a> input, <br>					 <a href="libxml2-encoding.html#xmlCharEncoding">xmlCharEncoding</a> enc, <br>					 <a href="libxml2-tree.html#xmlSAXHandlerPtr">xmlSAXHandlerPtr</a> sax, <br>					 void * user_data)<br>
</pre>
<p>Validate an input based on a flow of SAX event from the parser and forward the events to the @sax handler with the provided @user_data the user provided @sax handler must be a SAX2 one.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a schema validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>input</tt></i>:</span></td>
<td>the input to use for reading the data</td>
</tr>
<tr>
<td><span class="term"><i><tt>enc</tt></i>:</span></td>
<td>an optional encoding information</td>
</tr>
<tr>
<td><span class="term"><i><tt>sax</tt></i>:</span></td>
<td>a SAX handler for the resulting events</td>
</tr>
<tr>
<td><span class="term"><i><tt>user_data</tt></i>:</span></td>
<td>the context to provide to the SAX handler.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-valid.html000064400000300151151730335350013752 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>valid: The DTD validation</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-uri.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-xinclude.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">valid</span></h2>
<p>valid - The DTD validation</p>
<p>API for the DTD handling and the validity checking </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_VCTXT_DTD_VALIDATED">XML_VCTXT_DTD_VALIDATED</a>;
#define <a href="#XML_VCTXT_USE_PCTXT">XML_VCTXT_USE_PCTXT</a>;
typedef struct _xmlHashTable <a href="#xmlAttributeTable">xmlAttributeTable</a>;
typedef <a href="libxml2-valid.html#xmlAttributeTable">xmlAttributeTable</a> * <a href="#xmlAttributeTablePtr">xmlAttributeTablePtr</a>;
typedef struct _xmlHashTable <a href="#xmlElementTable">xmlElementTable</a>;
typedef <a href="libxml2-valid.html#xmlElementTable">xmlElementTable</a> * <a href="#xmlElementTablePtr">xmlElementTablePtr</a>;
typedef struct _xmlHashTable <a href="#xmlIDTable">xmlIDTable</a>;
typedef <a href="libxml2-valid.html#xmlIDTable">xmlIDTable</a> * <a href="#xmlIDTablePtr">xmlIDTablePtr</a>;
typedef struct _xmlHashTable <a href="#xmlNotationTable">xmlNotationTable</a>;
typedef <a href="libxml2-valid.html#xmlNotationTable">xmlNotationTable</a> * <a href="#xmlNotationTablePtr">xmlNotationTablePtr</a>;
typedef struct _xmlHashTable <a href="#xmlRefTable">xmlRefTable</a>;
typedef <a href="libxml2-valid.html#xmlRefTable">xmlRefTable</a> * <a href="#xmlRefTablePtr">xmlRefTablePtr</a>;
typedef struct _xmlValidCtxt <a href="#xmlValidCtxt">xmlValidCtxt</a>;
typedef <a href="libxml2-valid.html#xmlValidCtxt">xmlValidCtxt</a> * <a href="#xmlValidCtxtPtr">xmlValidCtxtPtr</a>;
typedef struct _xmlValidState <a href="#xmlValidState">xmlValidState</a>;
typedef <a href="libxml2-valid.html#xmlValidState">xmlValidState</a> * <a href="#xmlValidStatePtr">xmlValidStatePtr</a>;
<a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	<a href="#xmlAddAttributeDecl">xmlAddAttributeDecl</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns, <br>					 <a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a> type, <br>					 <a href="libxml2-tree.html#xmlAttributeDefault">xmlAttributeDefault</a> def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree);
<a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	<a href="#xmlAddElementDecl">xmlAddElementDecl</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-tree.html#xmlElementTypeVal">xmlElementTypeVal</a> type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content);
<a href="libxml2-tree.html#xmlIDPtr">xmlIDPtr</a>	<a href="#xmlAddID">xmlAddID</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
<a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a>	<a href="#xmlAddNotationDecl">xmlAddNotationDecl</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * PublicID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
<a href="libxml2-tree.html#xmlRefPtr">xmlRefPtr</a>	<a href="#xmlAddRef">xmlAddRef</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
<a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a>	<a href="#xmlCopyAttributeTable">xmlCopyAttributeTable</a>	(<a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlCopyDocElementContent">xmlCopyDocElementContent</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>							 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlCopyElementContent">xmlCopyElementContent</a>	(<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur);
<a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a>	<a href="#xmlCopyElementTable">xmlCopyElementTable</a>	(<a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table);
<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	<a href="#xmlCopyEnumeration">xmlCopyEnumeration</a>	(<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> cur);
<a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a>	<a href="#xmlCopyNotationTable">xmlCopyNotationTable</a>	(<a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table);
<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	<a href="#xmlCreateEnumeration">xmlCreateEnumeration</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlDumpAttributeDecl">xmlDumpAttributeDecl</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> attr);
void	<a href="#xmlDumpAttributeTable">xmlDumpAttributeTable</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table);
void	<a href="#xmlDumpElementDecl">xmlDumpElementDecl</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem);
void	<a href="#xmlDumpElementTable">xmlDumpElementTable</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table);
void	<a href="#xmlDumpNotationDecl">xmlDumpNotationDecl</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a> nota);
void	<a href="#xmlDumpNotationTable">xmlDumpNotationTable</a>		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table);
void	<a href="#xmlFreeAttributeTable">xmlFreeAttributeTable</a>		(<a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table);
void	<a href="#xmlFreeDocElementContent">xmlFreeDocElementContent</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur);
void	<a href="#xmlFreeElementContent">xmlFreeElementContent</a>		(<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur);
void	<a href="#xmlFreeElementTable">xmlFreeElementTable</a>		(<a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table);
void	<a href="#xmlFreeEnumeration">xmlFreeEnumeration</a>		(<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> cur);
void	<a href="#xmlFreeIDTable">xmlFreeIDTable</a>			(<a href="libxml2-valid.html#xmlIDTablePtr">xmlIDTablePtr</a> table);
void	<a href="#xmlFreeNotationTable">xmlFreeNotationTable</a>		(<a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table);
void	<a href="#xmlFreeRefTable">xmlFreeRefTable</a>			(<a href="libxml2-valid.html#xmlRefTablePtr">xmlRefTablePtr</a> table);
void	<a href="#xmlFreeValidCtxt">xmlFreeValidCtxt</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> cur);
<a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	<a href="#xmlGetDtdAttrDesc">xmlGetDtdAttrDesc</a>	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	<a href="#xmlGetDtdElementDesc">xmlGetDtdElementDesc</a>	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a>	<a href="#xmlGetDtdNotationDesc">xmlGetDtdNotationDesc</a>	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	<a href="#xmlGetDtdQAttrDesc">xmlGetDtdQAttrDesc</a>	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
<a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	<a href="#xmlGetDtdQElementDesc">xmlGetDtdQElementDesc</a>	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix);
<a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	<a href="#xmlGetID">xmlGetID</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID);
<a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	<a href="#xmlGetRefs">xmlGetRefs</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID);
int	<a href="#xmlIsID">xmlIsID</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
int	<a href="#xmlIsMixedElement">xmlIsMixedElement</a>		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlIsRef">xmlIsRef</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlNewDocElementContent">xmlNewDocElementContent</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 <a href="libxml2-tree.html#xmlElementContentType">xmlElementContentType</a> type);
<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	<a href="#xmlNewElementContent">xmlNewElementContent</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 <a href="libxml2-tree.html#xmlElementContentType">xmlElementContentType</a> type);
<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a>	<a href="#xmlNewValidCtxt">xmlNewValidCtxt</a>		(void);
int	<a href="#xmlRemoveID">xmlRemoveID</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
int	<a href="#xmlRemoveRef">xmlRemoveRef</a>			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr);
void	<a href="#xmlSnprintfElementContent">xmlSnprintfElementContent</a>	(char * buf, <br>					 int size, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content, <br>					 int englob);
void	<a href="#xmlSprintfElementContent">xmlSprintfElementContent</a>	(char * buf, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content, <br>					 int englob);
int	<a href="#xmlValidBuildContentModel">xmlValidBuildContentModel</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlValidCtxtNormalizeAttributeValue">xmlValidCtxtNormalizeAttributeValue</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>							 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidGetPotentialChildren">xmlValidGetPotentialChildren</a>	(<a href="libxml2-tree.html#xmlElementContent">xmlElementContent</a> * ctree, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** names, <br>					 int * len, <br>					 int max);
int	<a href="#xmlValidGetValidElements">xmlValidGetValidElements</a>	(<a href="libxml2-tree.html#xmlNode">xmlNode</a> * prev, <br>					 <a href="libxml2-tree.html#xmlNode">xmlNode</a> * next, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** names, <br>					 int max);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlValidNormalizeAttributeValue">xmlValidNormalizeAttributeValue</a>	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateAttributeDecl">xmlValidateAttributeDecl</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> attr);
int	<a href="#xmlValidateAttributeValue">xmlValidateAttributeValue</a>	(<a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateDocument">xmlValidateDocument</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlValidateDocumentFinal">xmlValidateDocumentFinal</a>	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlValidateDtd">xmlValidateDtd</a>			(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd);
int	<a href="#xmlValidateDtdFinal">xmlValidateDtdFinal</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
int	<a href="#xmlValidateElement">xmlValidateElement</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
int	<a href="#xmlValidateElementDecl">xmlValidateElementDecl</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem);
int	<a href="#xmlValidateNameValue">xmlValidateNameValue</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateNamesValue">xmlValidateNamesValue</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateNmtokenValue">xmlValidateNmtokenValue</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateNmtokensValue">xmlValidateNmtokensValue</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateNotationDecl">xmlValidateNotationDecl</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a> nota);
int	<a href="#xmlValidateNotationUse">xmlValidateNotationUse</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName);
int	<a href="#xmlValidateOneAttribute">xmlValidateOneAttribute</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidateOneElement">xmlValidateOneElement</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem);
int	<a href="#xmlValidateOneNamespace">xmlValidateOneNamespace</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
int	<a href="#xmlValidatePopElement">xmlValidatePopElement</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * qname);
int	<a href="#xmlValidatePushCData">xmlValidatePushCData</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data, <br>					 int len);
int	<a href="#xmlValidatePushElement">xmlValidatePushElement</a>		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * qname);
int	<a href="#xmlValidateRoot">xmlValidateRoot</a>			(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc);
typedef void <a href="#xmlValidityErrorFunc">xmlValidityErrorFunc</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
typedef void <a href="#xmlValidityWarningFunc">xmlValidityWarningFunc</a>		(void * ctx, <br>					 const char * msg, <br>					 ... ...);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_VCTXT_DTD_VALIDATED">Macro </a>XML_VCTXT_DTD_VALIDATED</h3>
<pre class="programlisting">#define <a href="#XML_VCTXT_DTD_VALIDATED">XML_VCTXT_DTD_VALIDATED</a>;
</pre>
<p>Set after <a href="libxml2-valid.html#xmlValidateDtdFinal">xmlValidateDtdFinal</a> was called.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_VCTXT_USE_PCTXT">Macro </a>XML_VCTXT_USE_PCTXT</h3>
<pre class="programlisting">#define <a href="#XML_VCTXT_USE_PCTXT">XML_VCTXT_USE_PCTXT</a>;
</pre>
<p>Set if the validation context is part of a parser context.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttributeTable">Structure </a>xmlAttributeTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlAttributeTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAttributeTablePtr">Typedef </a>xmlAttributeTablePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlAttributeTable">xmlAttributeTable</a> * xmlAttributeTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementTable">Structure </a>xmlElementTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlElementTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlElementTablePtr">Typedef </a>xmlElementTablePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlElementTable">xmlElementTable</a> * xmlElementTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIDTable">Structure </a>xmlIDTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlIDTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIDTablePtr">Typedef </a>xmlIDTablePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlIDTable">xmlIDTable</a> * xmlIDTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNotationTable">Structure </a>xmlNotationTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlNotationTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNotationTablePtr">Typedef </a>xmlNotationTablePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlNotationTable">xmlNotationTable</a> * xmlNotationTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRefTable">Structure </a>xmlRefTable</h3>
<pre class="programlisting">struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlRefTable;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRefTablePtr">Typedef </a>xmlRefTablePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlRefTable">xmlRefTable</a> * xmlRefTablePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidCtxt">Structure </a>xmlValidCtxt</h3>
<pre class="programlisting">struct _xmlValidCtxt {
    void *	userData	: user specific data block
    <a href="libxml2-valid.html#xmlValidityErrorFunc">xmlValidityErrorFunc</a>	error	: the callback in case of errors
    <a href="libxml2-valid.html#xmlValidityWarningFunc">xmlValidityWarningFunc</a>	warning	: the callback in case of warning Node analysis stack used when validat
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a>	node	: Current parsed Node
    int	nodeNr	: Depth of the parsing stack
    int	nodeMax	: Max depth of the parsing stack
    <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> *	nodeTab	: array of nodes
    unsigned int	flags	: internal flags
    <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	doc	: the document
    int	valid	: temporary validity check result state state used for non-determinist
    <a href="libxml2-valid.html#xmlValidState">xmlValidState</a> *	vstate	: current state
    int	vstateNr	: Depth of the validation stack
    int	vstateMax	: Max depth of the validation stack
    <a href="libxml2-valid.html#xmlValidState">xmlValidState</a> *	vstateTab	: array of validation states
    <a href="libxml2-xmlautomata.html#xmlAutomataPtr">xmlAutomataPtr</a>	am	: the automata
    <a href="libxml2-xmlautomata.html#xmlAutomataStatePtr">xmlAutomataStatePtr</a>	state	: used to build the automata
    void *	am
    void *	state
} xmlValidCtxt;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidCtxtPtr">Typedef </a>xmlValidCtxtPtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlValidCtxt">xmlValidCtxt</a> * xmlValidCtxtPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidState">Structure </a>xmlValidState</h3>
<pre class="programlisting">struct _xmlValidState {
The content of this structure is not made public by the API.
} xmlValidState;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidStatePtr">Typedef </a>xmlValidStatePtr</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlValidState">xmlValidState</a> * xmlValidStatePtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidityErrorFunc"></a>Function type xmlValidityErrorFunc</h3>
<pre class="programlisting">void	xmlValidityErrorFunc		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Callback called when a validity error is found. This is a message oriented function similar to an *printf function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>usually an <a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> to a validity error context, but comes from ctxt-&gt;userData (which normally contains such a pointer); ctxt-&gt;userData can be changed by the user.</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the string to format *printf like vararg</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>remaining arguments to the format</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidityWarningFunc"></a>Function type xmlValidityWarningFunc</h3>
<pre class="programlisting">void	xmlValidityWarningFunc		(void * ctx, <br>					 const char * msg, <br>					 ... ...)<br>
</pre>
<p>Callback called when a validity warning is found. This is a message oriented function similar to an *printf function.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>usually an <a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> to a validity error context, but comes from ctxt-&gt;userData (which normally contains such a pointer); ctxt-&gt;userData can be changed by the user.</td>
</tr>
<tr>
<td><span class="term"><i><tt>msg</tt></i>:</span></td>
<td>the string to format *printf like vararg</td>
</tr>
<tr>
<td><span class="term"><i><tt>...</tt></i>:</span></td>
<td>remaining arguments to the format</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddAttributeDecl"></a>xmlAddAttributeDecl ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	xmlAddAttributeDecl	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ns, <br>					 <a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a> type, <br>					 <a href="libxml2-tree.html#xmlAttributeDefault">xmlAttributeDefault</a> def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree)<br>
</pre>
<p>Register a new <a href="libxml2-SAX.html#attribute">attribute</a> declaration Note that @tree becomes the ownership of the DTD</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>pointer to the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
<tr>
<td><span class="term"><i><tt>def</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> default type</td>
</tr>
<tr>
<td><span class="term"><i><tt>defaultValue</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>if it's an enumeration, the associated list</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not new, otherwise the <a href="libxml2-SAX.html#attribute">attribute</a> decl</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddElementDecl"></a>xmlAddElementDecl ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	xmlAddElementDecl	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 <a href="libxml2-tree.html#xmlElementTypeVal">xmlElementTypeVal</a> type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content)<br>
</pre>
<p>Register a new element declaration</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>pointer to the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the element type</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the element content tree or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddID"></a>xmlAddID ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlIDPtr">xmlIDPtr</a>	xmlAddID		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>Register a new id declaration</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>pointer to the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value name</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> holding the ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the new <a href="libxml2-tree.html#xmlIDPtr">xmlIDPtr</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddNotationDecl"></a>xmlAddNotationDecl ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a>	xmlAddNotationDecl	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * PublicID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Register a new notation declaration</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>pointer to the DTD</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>PublicID</tt></i>:</span></td>
<td>the public identifier or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the system identifier or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlAddRef"></a>xmlAddRef ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlRefPtr">xmlRefPtr</a>	xmlAddRef		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>DEPRECATED, do not use. This function will be removed from the public API. Register a new ref declaration</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>pointer to the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value name</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> holding the Ref</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the new <a href="libxml2-tree.html#xmlRefPtr">xmlRefPtr</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyAttributeTable"></a>xmlCopyAttributeTable ()</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a>	xmlCopyAttributeTable	(<a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table)<br>
</pre>
<p>Build a copy of an <a href="libxml2-SAX.html#attribute">attribute</a> table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An <a href="libxml2-SAX.html#attribute">attribute</a> table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyDocElementContent"></a>xmlCopyDocElementContent ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlCopyDocElementContent	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>							 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur)<br>
</pre>
<p>Build a copy of an element content description.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document owning the element declaration</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>An element content pointer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyElementContent"></a>xmlCopyElementContent ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlCopyElementContent	(<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur)<br>
</pre>
<p>Build a copy of an element content description. Deprecated, use <a href="libxml2-valid.html#xmlCopyDocElementContent">xmlCopyDocElementContent</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>An element content pointer.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyElementTable"></a>xmlCopyElementTable ()</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a>	xmlCopyElementTable	(<a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table)<br>
</pre>
<p>Build a copy of an element table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An element table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyEnumeration"></a>xmlCopyEnumeration ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	xmlCopyEnumeration	(<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> cur)<br>
</pre>
<p>Copy an enumeration <a href="libxml2-SAX.html#attribute">attribute</a> node (recursive).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the tree to copy.</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> just created or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCopyNotationTable"></a>xmlCopyNotationTable ()</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a>	xmlCopyNotationTable	(<a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table)<br>
</pre>
<p>Build a copy of a notation table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>A notation table</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the new <a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCreateEnumeration"></a>xmlCreateEnumeration ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a>	xmlCreateEnumeration	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>create and initialize an enumeration <a href="libxml2-SAX.html#attribute">attribute</a> node.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the enumeration name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> just created or NULL in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpAttributeDecl"></a>xmlDumpAttributeDecl ()</h3>
<pre class="programlisting">void	xmlDumpAttributeDecl		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> attr)<br>
</pre>
<p>This will dump the content of the <a href="libxml2-SAX.html#attribute">attribute</a> declaration as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>An <a href="libxml2-SAX.html#attribute">attribute</a> declaration</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpAttributeTable"></a>xmlDumpAttributeTable ()</h3>
<pre class="programlisting">void	xmlDumpAttributeTable		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table)<br>
</pre>
<p>This will dump the content of the <a href="libxml2-SAX.html#attribute">attribute</a> table as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An <a href="libxml2-SAX.html#attribute">attribute</a> table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpElementDecl"></a>xmlDumpElementDecl ()</h3>
<pre class="programlisting">void	xmlDumpElementDecl		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem)<br>
</pre>
<p>This will dump the content of the element declaration as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>An element table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpElementTable"></a>xmlDumpElementTable ()</h3>
<pre class="programlisting">void	xmlDumpElementTable		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table)<br>
</pre>
<p>This will dump the content of the element table as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An element table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpNotationDecl"></a>xmlDumpNotationDecl ()</h3>
<pre class="programlisting">void	xmlDumpNotationDecl		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a> nota)<br>
</pre>
<p>This will dump the content the notation declaration as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>nota</tt></i>:</span></td>
<td>A notation declaration</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDumpNotationTable"></a>xmlDumpNotationTable ()</h3>
<pre class="programlisting">void	xmlDumpNotationTable		(<a href="libxml2-tree.html#xmlBufferPtr">xmlBufferPtr</a> buf, <br>					 <a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table)<br>
</pre>
<p>This will dump the content of the notation table as an XML DTD definition</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>the XML buffer output</td>
</tr>
<tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>A notation table</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeAttributeTable"></a>xmlFreeAttributeTable ()</h3>
<pre class="programlisting">void	xmlFreeAttributeTable		(<a href="libxml2-valid.html#xmlAttributeTablePtr">xmlAttributeTablePtr</a> table)<br>
</pre>
<p>Deallocate the memory used by an entities hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An <a href="libxml2-SAX.html#attribute">attribute</a> table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeDocElementContent"></a>xmlFreeDocElementContent ()</h3>
<pre class="programlisting">void	xmlFreeDocElementContent	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur)<br>
</pre>
<p>Free an element content structure. The whole subtree is removed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document owning the element declaration</td>
</tr>
<tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the element content tree to free</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeElementContent"></a>xmlFreeElementContent ()</h3>
<pre class="programlisting">void	xmlFreeElementContent		(<a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> cur)<br>
</pre>
<p>Free an element content structure. The whole subtree is removed. Deprecated, use <a href="libxml2-valid.html#xmlFreeDocElementContent">xmlFreeDocElementContent</a> instead</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the element content tree to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeElementTable"></a>xmlFreeElementTable ()</h3>
<pre class="programlisting">void	xmlFreeElementTable		(<a href="libxml2-valid.html#xmlElementTablePtr">xmlElementTablePtr</a> table)<br>
</pre>
<p>Deallocate the memory used by an element hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An element table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeEnumeration"></a>xmlFreeEnumeration ()</h3>
<pre class="programlisting">void	xmlFreeEnumeration		(<a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> cur)<br>
</pre>
<p>free an enumeration <a href="libxml2-SAX.html#attribute">attribute</a> node (recursive).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the tree to free.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeIDTable"></a>xmlFreeIDTable ()</h3>
<pre class="programlisting">void	xmlFreeIDTable			(<a href="libxml2-valid.html#xmlIDTablePtr">xmlIDTablePtr</a> table)<br>
</pre>
<p>Deallocate the memory used by an ID hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An id table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeNotationTable"></a>xmlFreeNotationTable ()</h3>
<pre class="programlisting">void	xmlFreeNotationTable		(<a href="libxml2-valid.html#xmlNotationTablePtr">xmlNotationTablePtr</a> table)<br>
</pre>
<p>Deallocate the memory used by an entities hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An notation table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeRefTable"></a>xmlFreeRefTable ()</h3>
<pre class="programlisting">void	xmlFreeRefTable			(<a href="libxml2-valid.html#xmlRefTablePtr">xmlRefTablePtr</a> table)<br>
</pre>
<p>DEPRECATED, do not use. This function will be removed from the public API. Deallocate the memory used by an Ref hash table.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>table</tt></i>:</span></td>
<td>An ref table</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeValidCtxt"></a>xmlFreeValidCtxt ()</h3>
<pre class="programlisting">void	xmlFreeValidCtxt		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> cur)<br>
</pre>
<p>Free a validation context structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>cur</tt></i>:</span></td>
<td>the validation context to free</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdAttrDesc"></a>xmlGetDtdAttrDesc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	xmlGetDtdAttrDesc	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search the DTD for the description of this <a href="libxml2-SAX.html#attribute">attribute</a> on this element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a pointer to the DtD to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> if found or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdElementDesc"></a>xmlGetDtdElementDesc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	xmlGetDtdElementDesc	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search the DTD for the description of this element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a pointer to the DtD to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> if found or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdNotationDesc"></a>xmlGetDtdNotationDesc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a>	xmlGetDtdNotationDesc	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search the DTD for the description of this notation</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a pointer to the DtD to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the notation name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a> if found or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdQAttrDesc"></a>xmlGetDtdQAttrDesc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a>	xmlGetDtdQAttrDesc	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Search the DTD for the description of this qualified <a href="libxml2-SAX.html#attribute">attribute</a> on this element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a pointer to the DtD to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> if found or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetDtdQElementDesc"></a>xmlGetDtdQElementDesc ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a>	xmlGetDtdQElementDesc	(<a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix)<br>
</pre>
<p>Search the DTD for the description of this element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a pointer to the DtD to search</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the element namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> if found or NULL</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetID"></a>xmlGetID ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a>	xmlGetID		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID)<br>
</pre>
<p>Search the <a href="libxml2-SAX.html#attribute">attribute</a> declaring the given ID</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>pointer to the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the ID value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not found, otherwise the <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> defining the ID</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlGetRefs"></a>xmlGetRefs ()</h3>
<pre class="programlisting"><a href="libxml2-list.html#xmlListPtr">xmlListPtr</a>	xmlGetRefs		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ID)<br>
</pre>
<p>DEPRECATED, do not use. This function will be removed from the public API. Find the set of references for the supplied ID.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>pointer to the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>ID</tt></i>:</span></td>
<td>the ID value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not found, otherwise node set for the ID.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsID"></a>xmlIsID ()</h3>
<pre class="programlisting">int	xmlIsID			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>Determine whether an <a href="libxml2-SAX.html#attribute">attribute</a> is of type ID. In case we have DTD(s) then this is done if DTD loading has been requested. In the case of HTML documents parsed with the HTML parser, then ID detection is done systematically.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element carrying the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or 1 depending on the lookup result</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsMixedElement"></a>xmlIsMixedElement ()</h3>
<pre class="programlisting">int	xmlIsMixedElement		(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Search in the DtDs whether an element accept Mixed content (or ANY) basically if it is supposed to accept text childs</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if no, 1 if yes, and -1 if no element description is available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlIsRef"></a>xmlIsRef ()</h3>
<pre class="programlisting">int	xmlIsRef			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>DEPRECATED, do not use. This function will be removed from the public API. Determine whether an <a href="libxml2-SAX.html#attribute">attribute</a> is of type Ref. In case we have DTD(s) then this is simple, otherwise we use an heuristic: name Ref (upper or lowercase).</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the element carrying the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 or 1 depending on the lookup result</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewDocElementContent"></a>xmlNewDocElementContent ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlNewDocElementContent	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 <a href="libxml2-tree.html#xmlElementContentType">xmlElementContentType</a> type)<br>
</pre>
<p>Allocate an element content structure for the document.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the subelement name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of element content decl</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the new element content structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewElementContent"></a>xmlNewElementContent ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a>	xmlNewElementContent	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 <a href="libxml2-tree.html#xmlElementContentType">xmlElementContentType</a> type)<br>
</pre>
<p>Allocate an element content structure. Deprecated in favor of <a href="libxml2-valid.html#xmlNewDocElementContent">xmlNewDocElementContent</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the subelement name or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of element content decl</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the new element content structure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewValidCtxt"></a>xmlNewValidCtxt ()</h3>
<pre class="programlisting"><a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a>	xmlNewValidCtxt		(void)<br>
</pre>
<p>Allocate a validation context structure.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>NULL if not, otherwise the new validation context structure</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRemoveID"></a>xmlRemoveID ()</h3>
<pre class="programlisting">int	xmlRemoveID			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>Remove the given <a href="libxml2-SAX.html#attribute">attribute</a> from the ID table maintained internally.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 if the lookup failed and 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlRemoveRef"></a>xmlRemoveRef ()</h3>
<pre class="programlisting">int	xmlRemoveRef			(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr)<br>
</pre>
<p>DEPRECATED, do not use. This function will be removed from the public API. Remove the given <a href="libxml2-SAX.html#attribute">attribute</a> from the Ref table maintained internally.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a>
</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>-1 if the lookup failed and 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSnprintfElementContent"></a>xmlSnprintfElementContent ()</h3>
<pre class="programlisting">void	xmlSnprintfElementContent	(char * buf, <br>					 int size, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content, <br>					 int englob)<br>
</pre>
<p>This will dump the content of the element content definition Intended just for the debug routine</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an output buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>size</tt></i>:</span></td>
<td>the buffer size</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>An element table</td>
</tr>
<tr>
<td><span class="term"><i><tt>englob</tt></i>:</span></td>
<td>1 if one must print the englobing parenthesis, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSprintfElementContent"></a>xmlSprintfElementContent ()</h3>
<pre class="programlisting">void	xmlSprintfElementContent	(char * buf, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content, <br>					 int englob)<br>
</pre>
<p>Deprecated, unsafe, use <a href="libxml2-valid.html#xmlSnprintfElementContent">xmlSnprintfElementContent</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>buf</tt></i>:</span></td>
<td>an output buffer</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>An element table</td>
</tr>
<tr>
<td><span class="term"><i><tt>englob</tt></i>:</span></td>
<td>1 if one must print the englobing parenthesis, 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidBuildContentModel"></a>xmlValidBuildContentModel ()</h3>
<pre class="programlisting">int	xmlValidBuildContentModel	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem)<br>
</pre>
<p>(Re)Build the automata associated to the content model of this element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>a validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element declaration node</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 in case of success, 0 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidCtxtNormalizeAttributeValue"></a>xmlValidCtxtNormalizeAttributeValue ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlValidCtxtNormalizeAttributeValue	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>							 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>							 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>							 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Does the validation related extra step of the normalization of <a href="libxml2-SAX.html#attribute">attribute</a> values: If the declared value is not CDATA, then the XML processor must further process the normalized <a href="libxml2-SAX.html#attribute">attribute</a> value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) <a href="libxml2-SAX.html#characters">characters</a> by single space (#x20) character. Also check VC: Standalone Document Declaration in P32, and update ctxt-&gt;valid accordingly</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context or NULL</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the parent</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidGetPotentialChildren"></a>xmlValidGetPotentialChildren ()</h3>
<pre class="programlisting">int	xmlValidGetPotentialChildren	(<a href="libxml2-tree.html#xmlElementContent">xmlElementContent</a> * ctree, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** names, <br>					 int * len, <br>					 int max)<br>
</pre>
<p>Build/extend a list of potential children allowed by the content tree</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctree</tt></i>:</span></td>
<td>an element content tree</td>
</tr>
<tr>
<td><span class="term"><i><tt>names</tt></i>:</span></td>
<td>an array to store the list of child names</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>a pointer to the number of element in the list</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of element in the list, or -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidGetValidElements"></a>xmlValidGetValidElements ()</h3>
<pre class="programlisting">int	xmlValidGetValidElements	(<a href="libxml2-tree.html#xmlNode">xmlNode</a> * prev, <br>					 <a href="libxml2-tree.html#xmlNode">xmlNode</a> * next, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** names, <br>					 int max)<br>
</pre>
<p>This function returns the list of authorized children to insert within an existing tree while respecting the validity constraints forced by the Dtd. The insertion point is defined using @prev and @next in the following ways: to insert before 'node': xmlValidGetValidElements(node-&gt;prev, node, ... to insert next 'node': xmlValidGetValidElements(node, node-&gt;next, ... to replace 'node': xmlValidGetValidElements(node-&gt;prev, node-&gt;next, ... to prepend a child to 'node': xmlValidGetValidElements(NULL, node-&gt;childs, to append a child to 'node': xmlValidGetValidElements(node-&gt;last, NULL, ... pointers to the element names are inserted at the beginning of the array and do not need to be freed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>prev</tt></i>:</span></td>
<td>an element to insert after</td>
</tr>
<tr>
<td><span class="term"><i><tt>next</tt></i>:</span></td>
<td>an element to insert next</td>
</tr>
<tr>
<td><span class="term"><i><tt>names</tt></i>:</span></td>
<td>an array to store the list of child names</td>
</tr>
<tr>
<td><span class="term"><i><tt>max</tt></i>:</span></td>
<td>the size of the array</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of element in the list, or -1 in case of error. If the function returns the value @max the caller is invited to grow the receiving array and retry.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidNormalizeAttributeValue"></a>xmlValidNormalizeAttributeValue ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlValidNormalizeAttributeValue	(<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>						 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Does the validation related extra step of the normalization of <a href="libxml2-SAX.html#attribute">attribute</a> values: If the declared value is not CDATA, then the XML processor must further process the normalized <a href="libxml2-SAX.html#attribute">attribute</a> value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) <a href="libxml2-SAX.html#characters">characters</a> by single space (#x20) character.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the parent</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateAttributeDecl"></a>xmlValidateAttributeDecl ()</h3>
<pre class="programlisting">int	xmlValidateAttributeDecl	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlAttributePtr">xmlAttributePtr</a> attr)<br>
</pre>
<p>Try to validate a single <a href="libxml2-SAX.html#attribute">attribute</a> definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Default Legal ] - [ VC: Enumeration ] - [ VC: ID Attribute Default ] The ID/IDREF uniqueness and matching are done separately</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a> definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateAttributeValue"></a>xmlValidateAttributeValue ()</h3>
<pre class="programlisting">int	xmlValidateAttributeValue	(<a href="libxml2-tree.html#xmlAttributeType">xmlAttributeType</a> type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Validate that the given <a href="libxml2-SAX.html#attribute">attribute</a> value match the proper production [ VC: ID ] Values of type ID must match the Name production.... [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names ... [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names ... [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a> value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateDocument"></a>xmlValidateDocument ()</h3>
<pre class="programlisting">int	xmlValidateDocument		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Try to validate the document instance basically it does the all the checks described by the XML Rec i.e. validates the internal and external subset (if present) and validate the document tree.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateDocumentFinal"></a>xmlValidateDocumentFinal ()</h3>
<pre class="programlisting">int	xmlValidateDocumentFinal	(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Does the final step for the document validation once all the incremental validation steps have been completed basically it does the following checks described by the XML Rec Check all the IDREF/IDREFS attributes definition for validity</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateDtd"></a>xmlValidateDtd ()</h3>
<pre class="programlisting">int	xmlValidateDtd			(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlDtdPtr">xmlDtdPtr</a> dtd)<br>
</pre>
<p>Try to validate the document against the dtd instance Basically it does check all the definitions in the DtD. Note the the internal subset (if present) is de-coupled (i.e. not used), which could give problems if ID or IDREF is present.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>dtd</tt></i>:</span></td>
<td>a dtd instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateDtdFinal"></a>xmlValidateDtdFinal ()</h3>
<pre class="programlisting">int	xmlValidateDtdFinal		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Does the final step for the dtds validation once all the subsets have been parsed basically it does the following checks described by the XML Rec - check that ENTITY and ENTITIES type attributes default or possible values matches one of the defined entities. - check that NOTATION type attributes default or possible values matches one of the defined notations.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 if invalid and -1 if not well-formed</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateElement"></a>xmlValidateElement ()</h3>
<pre class="programlisting">int	xmlValidateElement		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Try to validate the subtree under an element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateElementDecl"></a>xmlValidateElementDecl ()</h3>
<pre class="programlisting">int	xmlValidateElementDecl		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlElementPtr">xmlElementPtr</a> elem)<br>
</pre>
<p>Try to validate a single element definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: One ID per Element Type ] - [ VC: No Duplicate Types ] - [ VC: Unique Element Type Declaration ]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNameValue"></a>xmlValidateNameValue ()</h3>
<pre class="programlisting">int	xmlValidateNameValue		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Validate that the given value match Name production</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>an Name value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNamesValue"></a>xmlValidateNamesValue ()</h3>
<pre class="programlisting">int	xmlValidateNamesValue		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Validate that the given value match Names production</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>an Names value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNmtokenValue"></a>xmlValidateNmtokenValue ()</h3>
<pre class="programlisting">int	xmlValidateNmtokenValue		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Validate that the given value match Nmtoken production [ VC: Name Token ]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>an Nmtoken value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNmtokensValue"></a>xmlValidateNmtokensValue ()</h3>
<pre class="programlisting">int	xmlValidateNmtokensValue	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Validate that the given value match Nmtokens production [ VC: Name Token ]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>an Nmtokens value</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNotationDecl"></a>xmlValidateNotationDecl ()</h3>
<pre class="programlisting">int	xmlValidateNotationDecl		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNotationPtr">xmlNotationPtr</a> nota)<br>
</pre>
<p>Try to validate a single notation definition basically it does the following checks as described by the XML-1.0 recommendation: - it seems that no validity constraint exists on notation declarations But this function get called anyway ...</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>nota</tt></i>:</span></td>
<td>a notation definition</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateNotationUse"></a>xmlValidateNotationUse ()</h3>
<pre class="programlisting">int	xmlValidateNotationUse		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName)<br>
</pre>
<p>Validate that the given name match a notation declaration. - [ VC: Notation Declared ]</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>the document</td>
</tr>
<tr>
<td><span class="term"><i><tt>notationName</tt></i>:</span></td>
<td>the notation name to check</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateOneAttribute"></a>xmlValidateOneAttribute ()</h3>
<pre class="programlisting">int	xmlValidateOneAttribute		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 <a href="libxml2-tree.html#xmlAttrPtr">xmlAttrPtr</a> attr, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Try to validate a single <a href="libxml2-SAX.html#attribute">attribute</a> for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>attr</tt></i>:</span></td>
<td>an <a href="libxml2-SAX.html#attribute">attribute</a> instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value (without entities processing)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateOneElement"></a>xmlValidateOneElement ()</h3>
<pre class="programlisting">int	xmlValidateOneElement		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem)<br>
</pre>
<p>Try to validate a single element and it's attributes, basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Element Valid ] - [ VC: Required Attribute ] Then call xmlValidateOneAttribute() for each <a href="libxml2-SAX.html#attribute">attribute</a> present. The ID/IDREF checkings are done separately</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateOneNamespace"></a>xmlValidateOneNamespace ()</h3>
<pre class="programlisting">int	xmlValidateOneNamespace		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 <a href="libxml2-tree.html#xmlNsPtr">xmlNsPtr</a> ns, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Try to validate a single namespace declaration for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>ns</tt></i>:</span></td>
<td>an namespace declaration instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> value (without entities processing)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidatePopElement"></a>xmlValidatePopElement ()</h3>
<pre class="programlisting">int	xmlValidatePopElement		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * qname)<br>
</pre>
<p>Pop the element end from the validation stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>qname</tt></i>:</span></td>
<td>the qualified name as appearing in the serialization</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidatePushCData"></a>xmlValidatePushCData ()</h3>
<pre class="programlisting">int	xmlValidatePushCData		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data, <br>					 int len)<br>
</pre>
<p>check the CData parsed for validation in the current stack</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>some character data read</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the length of the data</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidatePushElement"></a>xmlValidatePushElement ()</h3>
<pre class="programlisting">int	xmlValidatePushElement		(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br>					 <a href="libxml2-tree.html#xmlNodePtr">xmlNodePtr</a> elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * qname)<br>
</pre>
<p>Push a new element start on the validation stack.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>an element instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>qname</tt></i>:</span></td>
<td>the qualified name as appearing in the serialization</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if no validation problem was found or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlValidateRoot"></a>xmlValidateRoot ()</h3>
<pre class="programlisting">int	xmlValidateRoot			(<a href="libxml2-valid.html#xmlValidCtxtPtr">xmlValidCtxtPtr</a> ctxt, <br>					 <a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br>
</pre>
<p>Try to validate a the root element basically it does the following check as described by the XML-1.0 recommendation: - [ VC: Root Element Type ] it doesn't try to recurse or apply other check to the element</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctxt</tt></i>:</span></td>
<td>the validation context</td>
</tr>
<tr>
<td><span class="term"><i><tt>doc</tt></i>:</span></td>
<td>a document instance</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if valid or 0 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-catalog.html000064400000106347151730335350014300 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>catalog: interfaces to the Catalog handling system</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-c14n.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-chvalid.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">catalog</span></h2>
<p>catalog - interfaces to the Catalog handling system</p>
<p>the catalog module implements the support for XML Catalogs and SGML catalogs </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">#define <a href="#XML_CATALOGS_NAMESPACE">XML_CATALOGS_NAMESPACE</a>;
#define <a href="#XML_CATALOG_PI">XML_CATALOG_PI</a>;
typedef struct _xmlCatalog <a href="#xmlCatalog">xmlCatalog</a>;
typedef enum <a href="#xmlCatalogAllow">xmlCatalogAllow</a>;
typedef enum <a href="#xmlCatalogPrefer">xmlCatalogPrefer</a>;
typedef <a href="libxml2-catalog.html#xmlCatalog">xmlCatalog</a> * <a href="#xmlCatalogPtr">xmlCatalogPtr</a>;
int	<a href="#xmlACatalogAdd">xmlACatalogAdd</a>			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * orig, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * replace);
void	<a href="#xmlACatalogDump">xmlACatalogDump</a>			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 FILE * out);
int	<a href="#xmlACatalogRemove">xmlACatalogRemove</a>		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlACatalogResolve">xmlACatalogResolve</a>	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlACatalogResolvePublic">xmlACatalogResolvePublic</a>	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlACatalogResolveSystem">xmlACatalogResolveSystem</a>	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlACatalogResolveURI">xmlACatalogResolveURI</a>	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI);
int	<a href="#xmlCatalogAdd">xmlCatalogAdd</a>			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * orig, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * replace);
void *	<a href="#xmlCatalogAddLocal">xmlCatalogAddLocal</a>		(void * catalogs, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL);
void	<a href="#xmlCatalogCleanup">xmlCatalogCleanup</a>		(void);
int	<a href="#xmlCatalogConvert">xmlCatalogConvert</a>		(void);
void	<a href="#xmlCatalogDump">xmlCatalogDump</a>			(FILE * out);
void	<a href="#xmlCatalogFreeLocal">xmlCatalogFreeLocal</a>		(void * catalogs);
<a href="libxml2-catalog.html#xmlCatalogAllow">xmlCatalogAllow</a>	<a href="#xmlCatalogGetDefaults">xmlCatalogGetDefaults</a>	(void);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogGetPublic">xmlCatalogGetPublic</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogGetSystem">xmlCatalogGetSystem</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
int	<a href="#xmlCatalogIsEmpty">xmlCatalogIsEmpty</a>		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogLocalResolve">xmlCatalogLocalResolve</a>	(void * catalogs, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogLocalResolveURI">xmlCatalogLocalResolveURI</a>	(void * catalogs, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI);
int	<a href="#xmlCatalogRemove">xmlCatalogRemove</a>		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogResolve">xmlCatalogResolve</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogResolvePublic">xmlCatalogResolvePublic</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogResolveSystem">xmlCatalogResolveSystem</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID);
<a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlCatalogResolveURI">xmlCatalogResolveURI</a>	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI);
int	<a href="#xmlCatalogSetDebug">xmlCatalogSetDebug</a>		(int level);
<a href="libxml2-catalog.html#xmlCatalogPrefer">xmlCatalogPrefer</a>	<a href="#xmlCatalogSetDefaultPrefer">xmlCatalogSetDefaultPrefer</a>	(<a href="libxml2-catalog.html#xmlCatalogPrefer">xmlCatalogPrefer</a> prefer);
void	<a href="#xmlCatalogSetDefaults">xmlCatalogSetDefaults</a>		(<a href="libxml2-catalog.html#xmlCatalogAllow">xmlCatalogAllow</a> allow);
int	<a href="#xmlConvertSGMLCatalog">xmlConvertSGMLCatalog</a>		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal);
void	<a href="#xmlFreeCatalog">xmlFreeCatalog</a>			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal);
void	<a href="#xmlInitializeCatalog">xmlInitializeCatalog</a>		(void);
<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	<a href="#xmlLoadACatalog">xmlLoadACatalog</a>		(const char * filename);
int	<a href="#xmlLoadCatalog">xmlLoadCatalog</a>			(const char * filename);
void	<a href="#xmlLoadCatalogs">xmlLoadCatalogs</a>			(const char * pathss);
<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	<a href="#xmlLoadSGMLSuperCatalog">xmlLoadSGMLSuperCatalog</a>	(const char * filename);
<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	<a href="#xmlNewCatalog">xmlNewCatalog</a>		(int sgml);
<a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	<a href="#xmlParseCatalogFile">xmlParseCatalogFile</a>	(const char * filename);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="XML_CATALOGS_NAMESPACE">Macro </a>XML_CATALOGS_NAMESPACE</h3>
<pre class="programlisting">#define <a href="#XML_CATALOGS_NAMESPACE">XML_CATALOGS_NAMESPACE</a>;
</pre>
<p>The namespace for the XML Catalogs elements.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="XML_CATALOG_PI">Macro </a>XML_CATALOG_PI</h3>
<pre class="programlisting">#define <a href="#XML_CATALOG_PI">XML_CATALOG_PI</a>;
</pre>
<p>The specific XML Catalog Processing Instruction name.</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalog">Structure </a>xmlCatalog</h3>
<pre class="programlisting">struct _xmlCatalog {
The content of this structure is not made public by the API.
} xmlCatalog;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogAllow">Enum </a>xmlCatalogAllow</h3>
<pre class="programlisting">enum <a href="#xmlCatalogAllow">xmlCatalogAllow</a> {
    <a name="XML_CATA_ALLOW_NONE">XML_CATA_ALLOW_NONE</a> = 0
    <a name="XML_CATA_ALLOW_GLOBAL">XML_CATA_ALLOW_GLOBAL</a> = 1
    <a name="XML_CATA_ALLOW_DOCUMENT">XML_CATA_ALLOW_DOCUMENT</a> = 2
    <a name="XML_CATA_ALLOW_ALL">XML_CATA_ALLOW_ALL</a> = 3
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogPrefer">Enum </a>xmlCatalogPrefer</h3>
<pre class="programlisting">enum <a href="#xmlCatalogPrefer">xmlCatalogPrefer</a> {
    <a name="XML_CATA_PREFER_NONE">XML_CATA_PREFER_NONE</a> = 0
    <a name="XML_CATA_PREFER_PUBLIC">XML_CATA_PREFER_PUBLIC</a> = 1
    <a name="XML_CATA_PREFER_SYSTEM">XML_CATA_PREFER_SYSTEM</a> = 2
};
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogPtr">Typedef </a>xmlCatalogPtr</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalog">xmlCatalog</a> * xmlCatalogPtr;
</pre>
<p></p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogAdd"></a>xmlACatalogAdd ()</h3>
<pre class="programlisting">int	xmlACatalogAdd			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * orig, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * replace)<br>
</pre>
<p>Add an entry in the catalog, it may overwrite existing but different entries.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of record to add to the catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>orig</tt></i>:</span></td>
<td>the system, public or prefix to match</td>
</tr>
<tr>
<td><span class="term"><i><tt>replace</tt></i>:</span></td>
<td>the replacement value for the match</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogDump"></a>xmlACatalogDump ()</h3>
<pre class="programlisting">void	xmlACatalogDump			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 FILE * out)<br>
</pre>
<p>Dump the given catalog to the given file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>the file.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogRemove"></a>xmlACatalogRemove ()</h3>
<pre class="programlisting">int	xmlACatalogRemove		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Remove an entry from the catalog</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to remove</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of entries removed if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogResolve"></a>xmlACatalogResolve ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlACatalogResolve	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Do a complete resolution lookup of an External Identifier</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogResolvePublic"></a>xmlACatalogResolvePublic ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlACatalogResolvePublic	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID)<br>
</pre>
<p>Try to lookup the catalog local <a href="libxml2-SAX.html#reference">reference</a> associated to a public ID in that catalog</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the local resource if found or NULL otherwise, the value returned must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogResolveSystem"></a>xmlACatalogResolveSystem ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlACatalogResolveSystem	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Try to lookup the catalog resource for a system ID</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resource if found or NULL otherwise, the value returned must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlACatalogResolveURI"></a>xmlACatalogResolveURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlACatalogResolveURI	(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI)<br>
</pre>
<p>Do a complete resolution lookup of an URI</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogAdd"></a>xmlCatalogAdd ()</h3>
<pre class="programlisting">int	xmlCatalogAdd			(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * orig, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * replace)<br>
</pre>
<p>Add an entry in the catalog, it may overwrite existing but different entries. If called before any other catalog routine, allows to override the default shared catalog put in place by xmlInitializeCatalog();</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the type of record to add to the catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>orig</tt></i>:</span></td>
<td>the system, public or prefix to match</td>
</tr>
<tr>
<td><span class="term"><i><tt>replace</tt></i>:</span></td>
<td>the replacement value for the match</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogAddLocal"></a>xmlCatalogAddLocal ()</h3>
<pre class="programlisting">void *	xmlCatalogAddLocal		(void * catalogs, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URL)<br>
</pre>
<p>Add the new entry to the catalog list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catalogs</tt></i>:</span></td>
<td>a document's list of catalogs</td>
</tr>
<tr>
<td><span class="term"><i><tt>URL</tt></i>:</span></td>
<td>the URL to a new local catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the updated list</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogCleanup"></a>xmlCatalogCleanup ()</h3>
<pre class="programlisting">void	xmlCatalogCleanup		(void)<br>
</pre>
<p>Free up all the memory associated with catalogs</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogConvert"></a>xmlCatalogConvert ()</h3>
<pre class="programlisting">int	xmlCatalogConvert		(void)<br>
</pre>
<p>Convert all the SGML catalog entries as XML ones</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of entries converted if successful, -1 otherwise</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogDump"></a>xmlCatalogDump ()</h3>
<pre class="programlisting">void	xmlCatalogDump			(FILE * out)<br>
</pre>
<p>Dump all the global catalog content to the given file.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>out</tt></i>:</span></td>
<td>the file.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogFreeLocal"></a>xmlCatalogFreeLocal ()</h3>
<pre class="programlisting">void	xmlCatalogFreeLocal		(void * catalogs)<br>
</pre>
<p>Free up the memory associated to the catalog list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>catalogs</tt></i>:</span></td>
<td>a document's list of catalogs</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogGetDefaults"></a>xmlCatalogGetDefaults ()</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalogAllow">xmlCatalogAllow</a>	xmlCatalogGetDefaults	(void)<br>
</pre>
<p>Used to get the user preference w.r.t. to what catalogs should be accepted</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the current <a href="libxml2-catalog.html#xmlCatalogAllow">xmlCatalogAllow</a> value</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogGetPublic"></a>xmlCatalogGetPublic ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogGetPublic	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID)<br>
</pre>
<p>Try to lookup the catalog <a href="libxml2-SAX.html#reference">reference</a> associated to a public ID DEPRECATED, use xmlCatalogResolvePublic()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resource if found or NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogGetSystem"></a>xmlCatalogGetSystem ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogGetSystem	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Try to lookup the catalog <a href="libxml2-SAX.html#reference">reference</a> associated to a system ID DEPRECATED, use xmlCatalogResolveSystem()</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resource if found or NULL otherwise.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogIsEmpty"></a>xmlCatalogIsEmpty ()</h3>
<pre class="programlisting">int	xmlCatalogIsEmpty		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal)<br>
</pre>
<p>Check is a catalog is empty</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>should this create an SGML catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if the catalog is empty, 0 if not, amd -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogLocalResolve"></a>xmlCatalogLocalResolve ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogLocalResolve	(void * catalogs, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Do a complete resolution lookup of an External Identifier using a document's private catalog list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catalogs</tt></i>:</span></td>
<td>a document's list of catalogs</td>
</tr>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogLocalResolveURI"></a>xmlCatalogLocalResolveURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogLocalResolveURI	(void * catalogs, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI)<br>
</pre>
<p>Do a complete resolution lookup of an URI using a document's private catalog list</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catalogs</tt></i>:</span></td>
<td>a document's list of catalogs</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogRemove"></a>xmlCatalogRemove ()</h3>
<pre class="programlisting">int	xmlCatalogRemove		(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>Remove an entry from the catalog</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the value to remove</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of entries removed if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogResolve"></a>xmlCatalogResolve ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogResolve	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Do a complete resolution lookup of an External Identifier</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogResolvePublic"></a>xmlCatalogResolvePublic ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogResolvePublic	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * pubID)<br>
</pre>
<p>Try to lookup the catalog <a href="libxml2-SAX.html#reference">reference</a> associated to a public ID</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>pubID</tt></i>:</span></td>
<td>the public ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resource if found or NULL otherwise, the value returned must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogResolveSystem"></a>xmlCatalogResolveSystem ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogResolveSystem	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * sysID)<br>
</pre>
<p>Try to lookup the catalog resource for a system ID</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sysID</tt></i>:</span></td>
<td>the system ID string</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resource if found or NULL otherwise, the value returned must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogResolveURI"></a>xmlCatalogResolveURI ()</h3>
<pre class="programlisting"><a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlCatalogResolveURI	(const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI)<br>
</pre>
<p>Do a complete resolution lookup of an URI</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the URI</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the URI of the resource or NULL if not found, it must be freed by the caller.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogSetDebug"></a>xmlCatalogSetDebug ()</h3>
<pre class="programlisting">int	xmlCatalogSetDebug		(int level)<br>
</pre>
<p>Used to set the debug level for catalog operation, 0 disable debugging, 1 enable it</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>level</tt></i>:</span></td>
<td>the debug level of catalogs required</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous value of the catalog debugging level</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogSetDefaultPrefer"></a>xmlCatalogSetDefaultPrefer ()</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalogPrefer">xmlCatalogPrefer</a>	xmlCatalogSetDefaultPrefer	(<a href="libxml2-catalog.html#xmlCatalogPrefer">xmlCatalogPrefer</a> prefer)<br>
</pre>
<p>Allows to set the preference between public and system for deletion in XML Catalog resolution. C.f. section 4.1.1 of the spec Values accepted are <a href="libxml2-catalog.html#XML_CATA_PREFER_PUBLIC">XML_CATA_PREFER_PUBLIC</a> or <a href="libxml2-catalog.html#XML_CATA_PREFER_SYSTEM">XML_CATA_PREFER_SYSTEM</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>prefer</tt></i>:</span></td>
<td>the default preference for delegation</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous value of the default preference for delegation</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlCatalogSetDefaults"></a>xmlCatalogSetDefaults ()</h3>
<pre class="programlisting">void	xmlCatalogSetDefaults		(<a href="libxml2-catalog.html#xmlCatalogAllow">xmlCatalogAllow</a> allow)<br>
</pre>
<p>Used to set the user preference w.r.t. to what catalogs should be accepted</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>allow</tt></i>:</span></td>
<td>what catalogs should be accepted</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlConvertSGMLCatalog"></a>xmlConvertSGMLCatalog ()</h3>
<pre class="programlisting">int	xmlConvertSGMLCatalog		(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal)<br>
</pre>
<p>Convert all the SGML catalog entries as XML ones</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>the catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the number of entries converted if successful, -1 otherwise</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlFreeCatalog"></a>xmlFreeCatalog ()</h3>
<pre class="programlisting">void	xmlFreeCatalog			(<a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> catal)<br>
</pre>
<p>Free the memory allocated to a Catalog</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>catal</tt></i>:</span></td>
<td>a Catalog</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlInitializeCatalog"></a>xmlInitializeCatalog ()</h3>
<pre class="programlisting">void	xmlInitializeCatalog		(void)<br>
</pre>
<p>Do the catalog initialization. this function is not thread safe, catalog initialization should preferably be done once at startup</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadACatalog"></a>xmlLoadACatalog ()</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	xmlLoadACatalog		(const char * filename)<br>
</pre>
<p>Load the catalog and build the associated data structures. This can be either an XML Catalog or an SGML Catalog It will recurse in SGML CATALOG entries. On the other hand XML Catalogs are not handled recursively.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file path</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the catalog parsed or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadCatalog"></a>xmlLoadCatalog ()</h3>
<pre class="programlisting">int	xmlLoadCatalog			(const char * filename)<br>
</pre>
<p>Load the catalog and makes its definitions effective for the default external entity loader. It will recurse in SGML CATALOG entries. this function is not thread safe, catalog initialization should preferably be done once at startup</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file path</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success -1 in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadCatalogs"></a>xmlLoadCatalogs ()</h3>
<pre class="programlisting">void	xmlLoadCatalogs			(const char * pathss)<br>
</pre>
<p>Load the catalogs and makes their definitions effective for the default external entity loader. this function is not thread safe, catalog initialization should preferably be done once at startup</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>pathss</tt></i>:</span></td>
<td>a list of directories separated by a colon or a space.</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlLoadSGMLSuperCatalog"></a>xmlLoadSGMLSuperCatalog ()</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	xmlLoadSGMLSuperCatalog	(const char * filename)<br>
</pre>
<p>Load an SGML super catalog. It won't expand CATALOG or DELEGATE references. This is only needed for manipulating SGML Super Catalogs like adding and removing CATALOG or DELEGATE entries.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>a file path</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the catalog parsed or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlNewCatalog"></a>xmlNewCatalog ()</h3>
<pre class="programlisting"><a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a>	xmlNewCatalog		(int sgml)<br>
</pre>
<p>create a new Catalog.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>sgml</tt></i>:</span></td>
<td>should this create an SGML catalog</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-catalog.html#xmlCatalogPtr">xmlCatalogPtr</a> or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlParseCatalogFile"></a>xmlParseCatalogFile ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlDocPtr">xmlDocPtr</a>	xmlParseCatalogFile	(const char * filename)<br>
</pre>
<p>parse an XML file and build a tree. It's like xmlParseFile() except it bypass all catalog lookups.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>filename</tt></i>:</span></td>
<td>the filename</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the resulting document tree or NULL in case of error</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
gtk-doc/html/libxml2/libxml2-SAX2.html000064400000113223151730335350013372 0ustar00<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SAX2: SAX2 parser interface used to build the DOM tree</title>
<meta name="generator" content="Libxml2 devhelp stylesheet">
<link rel="start" href="index.html" title="libxml2 Reference Manual">
<link rel="up" href="general.html" title="API">
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="chapter" href="general.html" title="API">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="libxml2-SAX.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<td><a accesskey="n" href="libxml2-c14n.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
<th width="100%" align="center">libxml2 Reference Manual</th>
</tr></table>
<h2><span class="refentrytitle">SAX2</span></h2>
<p>SAX2 - SAX2 parser interface used to build the DOM tree</p>
<p>those are the default SAX2 interfaces used by the library when building DOM tree. </p>
<p>Author(s): Daniel Veillard </p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<pre class="synopsis">void	<a href="#htmlDefaultSAXHandlerInit">htmlDefaultSAXHandlerInit</a>	(void);
void	<a href="#xmlDefaultSAXHandlerInit">xmlDefaultSAXHandlerInit</a>	(void);
void	<a href="#xmlSAX2AttributeDecl">xmlSAX2AttributeDecl</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree);
void	<a href="#xmlSAX2CDataBlock">xmlSAX2CDataBlock</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len);
void	<a href="#xmlSAX2Characters">xmlSAX2Characters</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
void	<a href="#xmlSAX2Comment">xmlSAX2Comment</a>			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value);
void	<a href="#xmlSAX2ElementDecl">xmlSAX2ElementDecl</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content);
void	<a href="#xmlSAX2EndDocument">xmlSAX2EndDocument</a>		(void * ctx);
void	<a href="#xmlSAX2EndElement">xmlSAX2EndElement</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
void	<a href="#xmlSAX2EndElementNs">xmlSAX2EndElementNs</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI);
void	<a href="#xmlSAX2EntityDecl">xmlSAX2EntityDecl</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content);
void	<a href="#xmlSAX2ExternalSubset">xmlSAX2ExternalSubset</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
int	<a href="#xmlSAX2GetColumnNumber">xmlSAX2GetColumnNumber</a>		(void * ctx);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlSAX2GetEntity">xmlSAX2GetEntity</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
int	<a href="#xmlSAX2GetLineNumber">xmlSAX2GetLineNumber</a>		(void * ctx);
<a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	<a href="#xmlSAX2GetParameterEntity">xmlSAX2GetParameterEntity</a>	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSAX2GetPublicId">xmlSAX2GetPublicId</a>	(void * ctx);
const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	<a href="#xmlSAX2GetSystemId">xmlSAX2GetSystemId</a>	(void * ctx);
int	<a href="#xmlSAX2HasExternalSubset">xmlSAX2HasExternalSubset</a>	(void * ctx);
int	<a href="#xmlSAX2HasInternalSubset">xmlSAX2HasInternalSubset</a>	(void * ctx);
void	<a href="#xmlSAX2IgnorableWhitespace">xmlSAX2IgnorableWhitespace</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len);
void	<a href="#xmlSAX2InitDefaultSAXHandler">xmlSAX2InitDefaultSAXHandler</a>	(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr, <br>					 int warning);
void	<a href="#xmlSAX2InitHtmlDefaultSAXHandler">xmlSAX2InitHtmlDefaultSAXHandler</a>	(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr);
void	<a href="#xmlSAX2InternalSubset">xmlSAX2InternalSubset</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID);
int	<a href="#xmlSAX2IsStandalone">xmlSAX2IsStandalone</a>		(void * ctx);
void	<a href="#xmlSAX2NotationDecl">xmlSAX2NotationDecl</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
void	<a href="#xmlSAX2ProcessingInstruction">xmlSAX2ProcessingInstruction</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data);
void	<a href="#xmlSAX2Reference">xmlSAX2Reference</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name);
<a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	<a href="#xmlSAX2ResolveEntity">xmlSAX2ResolveEntity</a>	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId);
void	<a href="#xmlSAX2SetDocumentLocator">xmlSAX2SetDocumentLocator</a>	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc);
void	<a href="#xmlSAX2StartDocument">xmlSAX2StartDocument</a>		(void * ctx);
void	<a href="#xmlSAX2StartElement">xmlSAX2StartElement</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts);
void	<a href="#xmlSAX2StartElementNs">xmlSAX2StartElementNs</a>		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 int nb_namespaces, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces, <br>					 int nb_attributes, <br>					 int nb_defaulted, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** attributes);
void	<a href="#xmlSAX2UnparsedEntityDecl">xmlSAX2UnparsedEntityDecl</a>	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName);
int	<a href="#xmlSAXDefaultVersion">xmlSAXDefaultVersion</a>		(int version);
int	<a href="#xmlSAXVersion">xmlSAXVersion</a>			(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr, <br>					 int version);
</pre>
</div>
<div class="refsect1" lang="en"><h2>Description</h2></div>
<div class="refsect1" lang="en">
<h2>Details</h2>
<div class="refsect2" lang="en">
<div class="refsect2" lang="en">
<h3>
<a name="htmlDefaultSAXHandlerInit"></a>htmlDefaultSAXHandlerInit ()</h3>
<pre class="programlisting">void	htmlDefaultSAXHandlerInit	(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Initialize the default SAX handler</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlDefaultSAXHandlerInit"></a>xmlDefaultSAXHandlerInit ()</h3>
<pre class="programlisting">void	xmlDefaultSAXHandlerInit	(void)<br>
</pre>
<p>DEPRECATED: This function will be made private. Call <a href="libxml2-parser.html#xmlInitParser">xmlInitParser</a> to initialize the library. Initialize the default SAX2 handler</p>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2AttributeDecl"></a>xmlSAX2AttributeDecl ()</h3>
<pre class="programlisting">void	xmlSAX2AttributeDecl		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * elem, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 int type, <br>					 int def, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * defaultValue, <br>					 <a href="libxml2-tree.html#xmlEnumerationPtr">xmlEnumerationPtr</a> tree)<br>
</pre>
<p>An <a href="libxml2-SAX.html#attribute">attribute</a> definition has been parsed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>elem</tt></i>:</span></td>
<td>the name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> type</td>
</tr>
<tr>
<td><span class="term"><i><tt>def</tt></i>:</span></td>
<td>the type of default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>defaultValue</tt></i>:</span></td>
<td>the <a href="libxml2-SAX.html#attribute">attribute</a> default value</td>
</tr>
<tr>
<td><span class="term"><i><tt>tree</tt></i>:</span></td>
<td>the tree of enumerated value set</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2CDataBlock"></a>xmlSAX2CDataBlock ()</h3>
<pre class="programlisting">void	xmlSAX2CDataBlock		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value, <br>					 int len)<br>
</pre>
<p>called when a pcdata block has been parsed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>The pcdata content</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the block length</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2Characters"></a>xmlSAX2Characters ()</h3>
<pre class="programlisting">void	xmlSAX2Characters		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>receiving some chars from the parser.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2Comment"></a>xmlSAX2Comment ()</h3>
<pre class="programlisting">void	xmlSAX2Comment			(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * value)<br>
</pre>
<p>A <a href="libxml2-SAX2.html#xmlSAX2Comment">xmlSAX2Comment</a> has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>value</tt></i>:</span></td>
<td>the <a href="libxml2-SAX2.html#xmlSAX2Comment">xmlSAX2Comment</a> content</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2ElementDecl"></a>xmlSAX2ElementDecl ()</h3>
<pre class="programlisting">void	xmlSAX2ElementDecl		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 <a href="libxml2-tree.html#xmlElementContentPtr">xmlElementContentPtr</a> content)<br>
</pre>
<p>An element definition has been parsed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the element type</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the element value tree</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2EndDocument"></a>xmlSAX2EndDocument ()</h3>
<pre class="programlisting">void	xmlSAX2EndDocument		(void * ctx)<br>
</pre>
<p>called when the document end has been detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2EndElement"></a>xmlSAX2EndElement ()</h3>
<pre class="programlisting">void	xmlSAX2EndElement		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>called when the end of an element has been detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The element name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2EndElementNs"></a>xmlSAX2EndElementNs ()</h3>
<pre class="programlisting">void	xmlSAX2EndElementNs		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI)<br>
</pre>
<p>SAX2 callback when an element end has been detected by the parser. It provides the namespace information for the element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>localname</tt></i>:</span></td>
<td>the local name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the element namespace prefix if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the element namespace name if available</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2EntityDecl"></a>xmlSAX2EntityDecl ()</h3>
<pre class="programlisting">void	xmlSAX2EntityDecl		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 int type, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * content)<br>
</pre>
<p>An entity definition has been parsed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>type</tt></i>:</span></td>
<td>the entity type</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>content</tt></i>:</span></td>
<td>the entity value (without processing).</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2ExternalSubset"></a>xmlSAX2ExternalSubset ()</h3>
<pre class="programlisting">void	xmlSAX2ExternalSubset		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on external subset declaration.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetColumnNumber"></a>xmlSAX2GetColumnNumber ()</h3>
<pre class="programlisting">int	xmlSAX2GetColumnNumber		(void * ctx)<br>
</pre>
<p>Provide the column number of the current parsing point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetEntity"></a>xmlSAX2GetEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlSAX2GetEntity	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get an entity by name</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetLineNumber"></a>xmlSAX2GetLineNumber ()</h3>
<pre class="programlisting">int	xmlSAX2GetLineNumber		(void * ctx)<br>
</pre>
<p>Provide the line number of the current parsing point.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>an int</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetParameterEntity"></a>xmlSAX2GetParameterEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a>	xmlSAX2GetParameterEntity	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>Get a parameter entity by name</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlEntityPtr">xmlEntityPtr</a> if found.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetPublicId"></a>xmlSAX2GetPublicId ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSAX2GetPublicId	(void * ctx)<br>
</pre>
<p>Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN"</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2GetSystemId"></a>xmlSAX2GetSystemId ()</h3>
<pre class="programlisting">const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *	xmlSAX2GetSystemId	(void * ctx)<br>
</pre>
<p>Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> *</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2HasExternalSubset"></a>xmlSAX2HasExternalSubset ()</h3>
<pre class="programlisting">int	xmlSAX2HasExternalSubset	(void * ctx)<br>
</pre>
<p>Does this document has an external subset</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2HasInternalSubset"></a>xmlSAX2HasInternalSubset ()</h3>
<pre class="programlisting">int	xmlSAX2HasInternalSubset	(void * ctx)<br>
</pre>
<p>Does this document has an internal subset</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2IgnorableWhitespace"></a>xmlSAX2IgnorableWhitespace ()</h3>
<pre class="programlisting">void	xmlSAX2IgnorableWhitespace	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ch, <br>					 int len)<br>
</pre>
<p>receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use <a href="libxml2-SAX2.html#xmlSAX2Characters">xmlSAX2Characters</a></p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>ch</tt></i>:</span></td>
<td>a <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> string</td>
</tr>
<tr>
<td><span class="term"><i><tt>len</tt></i>:</span></td>
<td>the number of <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a>
</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2InitDefaultSAXHandler"></a>xmlSAX2InitDefaultSAXHandler ()</h3>
<pre class="programlisting">void	xmlSAX2InitDefaultSAXHandler	(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr, <br>					 int warning)<br>
</pre>
<p>Initialize the default XML SAX2 handler</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>hdlr</tt></i>:</span></td>
<td>the SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>warning</tt></i>:</span></td>
<td>flag if non-zero sets the handler warning procedure</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2InitHtmlDefaultSAXHandler"></a>xmlSAX2InitHtmlDefaultSAXHandler ()</h3>
<pre class="programlisting">void	xmlSAX2InitHtmlDefaultSAXHandler	(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr)<br>
</pre>
<p>Initialize the default HTML SAX2 handler</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>hdlr</tt></i>:</span></td>
<td>the SAX handler</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2InternalSubset"></a>xmlSAX2InternalSubset ()</h3>
<pre class="programlisting">void	xmlSAX2InternalSubset		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * ExternalID, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * SystemID)<br>
</pre>
<p>Callback on internal subset declaration.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>the root element name</td>
</tr>
<tr>
<td><span class="term"><i><tt>ExternalID</tt></i>:</span></td>
<td>the external ID</td>
</tr>
<tr>
<td><span class="term"><i><tt>SystemID</tt></i>:</span></td>
<td>the SYSTEM ID (e.g. filename or URL)</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2IsStandalone"></a>xmlSAX2IsStandalone ()</h3>
<pre class="programlisting">int	xmlSAX2IsStandalone		(void * ctx)<br>
</pre>
<p>Is this document tagged standalone ?</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>1 if true</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2NotationDecl"></a>xmlSAX2NotationDecl ()</h3>
<pre class="programlisting">void	xmlSAX2NotationDecl		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>What to do when a notation declaration has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the notation</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2ProcessingInstruction"></a>xmlSAX2ProcessingInstruction ()</h3>
<pre class="programlisting">void	xmlSAX2ProcessingInstruction	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * target, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * data)<br>
</pre>
<p>A processing instruction has been parsed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>target</tt></i>:</span></td>
<td>the target name</td>
</tr>
<tr>
<td><span class="term"><i><tt>data</tt></i>:</span></td>
<td>the PI data's</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2Reference"></a>xmlSAX2Reference ()</h3>
<pre class="programlisting">void	xmlSAX2Reference		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name)<br>
</pre>
<p>called when an entity <a href="libxml2-SAX2.html#xmlSAX2Reference">xmlSAX2Reference</a> is detected.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The entity name</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2ResolveEntity"></a>xmlSAX2ResolveEntity ()</h3>
<pre class="programlisting"><a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a>	xmlSAX2ResolveEntity	(void * ctx, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>						 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId)<br>
</pre>
<p>The entity loader, to control the loading of external entities, the application can either: - override this xmlSAX2ResolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the <a href="libxml2-tree.html#xmlParserInputPtr">xmlParserInputPtr</a> if inlined or NULL for DOM behaviour.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2SetDocumentLocator"></a>xmlSAX2SetDocumentLocator ()</h3>
<pre class="programlisting">void	xmlSAX2SetDocumentLocator	(void * ctx, <br>					 <a href="libxml2-tree.html#xmlSAXLocatorPtr">xmlSAXLocatorPtr</a> loc)<br>
</pre>
<p>Receive the document locator at startup, actually <a href="libxml2-globals.html#xmlDefaultSAXLocator">xmlDefaultSAXLocator</a> Everything is available on the context, so this is useless in our case.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>loc</tt></i>:</span></td>
<td>A SAX Locator</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2StartDocument"></a>xmlSAX2StartDocument ()</h3>
<pre class="programlisting">void	xmlSAX2StartDocument		(void * ctx)<br>
</pre>
<p>called when the document start being processed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody><tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr></tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2StartElement"></a>xmlSAX2StartElement ()</h3>
<pre class="programlisting">void	xmlSAX2StartElement		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * fullname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** atts)<br>
</pre>
<p>called when an opening tag has been processed.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>fullname</tt></i>:</span></td>
<td>The element name, including namespace prefix</td>
</tr>
<tr>
<td><span class="term"><i><tt>atts</tt></i>:</span></td>
<td>An array of name/value attributes pairs, NULL terminated</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2StartElementNs"></a>xmlSAX2StartElementNs ()</h3>
<pre class="programlisting">void	xmlSAX2StartElementNs		(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * localname, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * prefix, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * URI, <br>					 int nb_namespaces, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** namespaces, <br>					 int nb_attributes, <br>					 int nb_defaulted, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> ** attributes)<br>
</pre>
<p>SAX2 callback when an element start has been detected by the parser. It provides the namespace information for the element, as well as the new namespace declarations on the element.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>localname</tt></i>:</span></td>
<td>the local name of the element</td>
</tr>
<tr>
<td><span class="term"><i><tt>prefix</tt></i>:</span></td>
<td>the element namespace prefix if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>URI</tt></i>:</span></td>
<td>the element namespace name if available</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_namespaces</tt></i>:</span></td>
<td>number of namespace definitions on that node</td>
</tr>
<tr>
<td><span class="term"><i><tt>namespaces</tt></i>:</span></td>
<td>pointer to the array of prefix/URI pairs namespace definitions</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_attributes</tt></i>:</span></td>
<td>the number of attributes on that node</td>
</tr>
<tr>
<td><span class="term"><i><tt>nb_defaulted</tt></i>:</span></td>
<td>the number of defaulted attributes.</td>
</tr>
<tr>
<td><span class="term"><i><tt>attributes</tt></i>:</span></td>
<td>pointer to the array of (localname/prefix/URI/value/end) <a href="libxml2-SAX.html#attribute">attribute</a> values.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAX2UnparsedEntityDecl"></a>xmlSAX2UnparsedEntityDecl ()</h3>
<pre class="programlisting">void	xmlSAX2UnparsedEntityDecl	(void * ctx, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * name, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * publicId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * systemId, <br>					 const <a href="libxml2-xmlstring.html#xmlChar">xmlChar</a> * notationName)<br>
</pre>
<p>What to do when an unparsed entity declaration is parsed</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>ctx</tt></i>:</span></td>
<td>the user data (XML parser context)</td>
</tr>
<tr>
<td><span class="term"><i><tt>name</tt></i>:</span></td>
<td>The name of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>publicId</tt></i>:</span></td>
<td>The public ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>systemId</tt></i>:</span></td>
<td>The system ID of the entity</td>
</tr>
<tr>
<td><span class="term"><i><tt>notationName</tt></i>:</span></td>
<td>the name of the notation</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXDefaultVersion"></a>xmlSAXDefaultVersion ()</h3>
<pre class="programlisting">int	xmlSAXDefaultVersion		(int version)<br>
</pre>
<p>Set the default version of SAX used globally by the library. By default, during initialization the default is set to 2. Note that it is generally a better coding style to use xmlSAXVersion() to set up the version explicitly for a given parsing context.</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>version</tt></i>:</span></td>
<td>the version, 1 or 2</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>the previous value in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
<div class="refsect2" lang="en">
<h3>
<a name="xmlSAXVersion"></a>xmlSAXVersion ()</h3>
<pre class="programlisting">int	xmlSAXVersion			(<a href="libxml2-tree.html#xmlSAXHandler">xmlSAXHandler</a> * hdlr, <br>					 int version)<br>
</pre>
<p>Initialize the default XML SAX handler according to the version</p>
<div class="variablelist"><table border="0">
<col align="left">
<tbody>
<tr>
<td><span class="term"><i><tt>hdlr</tt></i>:</span></td>
<td>the SAX handler</td>
</tr>
<tr>
<td><span class="term"><i><tt>version</tt></i>:</span></td>
<td>the version, 1 or 2</td>
</tr>
<tr>
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
<td>0 in case of success and -1 in case of error.</td>
</tr>
</tbody>
</table></div>
</div>
<hr>
</div>
</div>
</body>
</html>
aclocal/libxml.m4000064400000017341151730335350007706 0ustar00# Configure paths for LIBXML2
# Simon Josefsson 2020-02-12
# Fix autoconf 2.70+ warnings
# Mike Hommey 2004-06-19
# use CPPFLAGS instead of CFLAGS
# Toshio Kuratomi 2001-04-21
# Adapted from:
# Configure paths for GLIB
# Owen Taylor     97-11-3

dnl AM_PATH_XML2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
dnl Test for XML, and define XML_CPPFLAGS and XML_LIBS
dnl
AC_DEFUN([AM_PATH_XML2],[ 
AC_ARG_WITH(xml-prefix,
            [  --with-xml-prefix=PFX   Prefix where libxml is installed (optional)],
            xml_config_prefix="$withval", xml_config_prefix="")
AC_ARG_WITH(xml-exec-prefix,
            [  --with-xml-exec-prefix=PFX Exec prefix where libxml is installed (optional)],
            xml_config_exec_prefix="$withval", xml_config_exec_prefix="")
AC_ARG_ENABLE(xmltest,
              [  --disable-xmltest       Do not try to compile and run a test LIBXML program],,
              enable_xmltest=yes)

  if test x$xml_config_exec_prefix != x ; then
     xml_config_args="$xml_config_args"
     if test x${XML2_CONFIG+set} != xset ; then
        XML2_CONFIG=$xml_config_exec_prefix/bin/xml2-config
     fi
  fi
  if test x$xml_config_prefix != x ; then
     xml_config_args="$xml_config_args --prefix=$xml_config_prefix"
     if test x${XML2_CONFIG+set} != xset ; then
        XML2_CONFIG=$xml_config_prefix/bin/xml2-config
     fi
  fi

  AC_PATH_PROG(XML2_CONFIG, xml2-config, no)
  min_xml_version=ifelse([$1], ,2.0.0,[$1])
  AC_MSG_CHECKING(for libxml - version >= $min_xml_version)
  no_xml=""
  if test "$XML2_CONFIG" = "no" ; then
    no_xml=yes
  else
    XML_CPPFLAGS=`$XML2_CONFIG $xml_config_args --cflags`
    XML_LIBS=`$XML2_CONFIG $xml_config_args --libs`
    xml_config_major_version=`$XML2_CONFIG $xml_config_args --version | \
           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
    xml_config_minor_version=`$XML2_CONFIG $xml_config_args --version | \
           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
    xml_config_micro_version=`$XML2_CONFIG $xml_config_args --version | \
           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
    if test "x$enable_xmltest" = "xyes" ; then
      ac_save_CPPFLAGS="$CPPFLAGS"
      ac_save_LIBS="$LIBS"
      CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS"
      LIBS="$XML_LIBS $LIBS"
dnl
dnl Now check if the installed libxml is sufficiently new.
dnl (Also sanity checks the results of xml2-config to some extent)
dnl
      rm -f conf.xmltest
      AC_RUN_IFELSE(
            [AC_LANG_SOURCE([[
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libxml/xmlversion.h>

int 
main()
{
  int xml_major_version, xml_minor_version, xml_micro_version;
  int major, minor, micro;
  char *tmp_version;

  system("touch conf.xmltest");

  /* Capture xml2-config output via autoconf/configure variables */
  /* HP/UX 9 (%@#!) writes to sscanf strings */
  tmp_version = (char *)strdup("$min_xml_version");
  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
     printf("%s, bad version string from xml2-config\n", "$min_xml_version");
     exit(1);
   }
   free(tmp_version);

   /* Capture the version information from the header files */
   tmp_version = (char *)strdup(LIBXML_DOTTED_VERSION);
   if (sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) {
     printf("%s, bad version string from libxml includes\n", "LIBXML_DOTTED_VERSION");
     exit(1);
   }
   free(tmp_version);

 /* Compare xml2-config output to the libxml headers */
  if ((xml_major_version != $xml_config_major_version) ||
      (xml_minor_version != $xml_config_minor_version) ||
      (xml_micro_version != $xml_config_micro_version))
    {
      printf("*** libxml header files (version %d.%d.%d) do not match\n",
         xml_major_version, xml_minor_version, xml_micro_version);
      printf("*** xml2-config (version %d.%d.%d)\n",
         $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version);
      return 1;
    } 
/* Compare the headers to the library to make sure we match */
  /* Less than ideal -- doesn't provide us with return value feedback, 
   * only exits if there's a serious mismatch between header and library.
   */
    LIBXML_TEST_VERSION;

    /* Test that the library is greater than our minimum version */
    if ((xml_major_version > major) ||
        ((xml_major_version == major) && (xml_minor_version > minor)) ||
        ((xml_major_version == major) && (xml_minor_version == minor) &&
        (xml_micro_version >= micro)))
      {
        return 0;
       }
     else
      {
        printf("\n*** An old version of libxml (%d.%d.%d) was found.\n",
               xml_major_version, xml_minor_version, xml_micro_version);
        printf("*** You need a version of libxml newer than %d.%d.%d.\n",
           major, minor, micro);
        printf("***\n");
        printf("*** If you have already installed a sufficiently new version, this error\n");
        printf("*** probably means that the wrong copy of the xml2-config shell script is\n");
        printf("*** being found. The easiest way to fix this is to remove the old version\n");
        printf("*** of LIBXML, but you can also set the XML2_CONFIG environment to point to the\n");
        printf("*** correct copy of xml2-config. (In this case, you will have to\n");
        printf("*** modify your LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf\n");
        printf("*** so that the correct libraries are found at run-time))\n");
    }
  return 1;
}
]])],, no_xml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
       CPPFLAGS="$ac_save_CPPFLAGS"
       LIBS="$ac_save_LIBS"
     fi
  fi

  if test "x$no_xml" = x ; then
     AC_MSG_RESULT(yes (version $xml_config_major_version.$xml_config_minor_version.$xml_config_micro_version))
     ifelse([$2], , :, [$2])     
  else
     AC_MSG_RESULT(no)
     if test "$XML2_CONFIG" = "no" ; then
       echo "*** The xml2-config script installed by LIBXML could not be found"
       echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in"
       echo "*** your path, or set the XML2_CONFIG environment variable to the"
       echo "*** full path to xml2-config."
     else
       if test -f conf.xmltest ; then
        :
       else
          echo "*** Could not run libxml test program, checking why..."
          CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS"
          LIBS="$LIBS $XML_LIBS"
	  AC_LINK_IFELSE(
            [AC_LANG_PROGRAM([[
#include <libxml/xmlversion.h>
#include <stdio.h>
]],    [[ LIBXML_TEST_VERSION; return 0;]])],
        [ echo "*** The test program compiled, but did not run. This usually means"
          echo "*** that the run-time linker is not finding LIBXML or finding the wrong"
          echo "*** version of LIBXML. If it is not finding LIBXML, you'll need to set your"
          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
          echo "*** is required on your system"
          echo "***"
          echo "*** If you have an old version installed, it is best to remove it, although"
          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
        [ echo "*** The test program failed to compile or link. See the file config.log for the"
          echo "*** exact error that occurred. This usually means LIBXML was incorrectly installed"
          echo "*** or that you have moved LIBXML since it was installed. In the latter case, you"
          echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ])
          CPPFLAGS="$ac_save_CPPFLAGS"
          LIBS="$ac_save_LIBS"
       fi
     fi

     XML_CPPFLAGS=""
     XML_LIBS=""
     ifelse([$3], , :, [$3])
  fi
  AC_SUBST(XML_CPPFLAGS)
  AC_SUBST(XML_LIBS)
  rm -f conf.xmltest
])
man/man1/erb.1000064400000006416151731612740007023 0ustar00.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd November 15, 2012
.Dt ERB \&1 "Ruby Programmer's Reference Guide"
.Os UNIX
.Sh NAME
.Nm erb
.Nd Ruby Templating
.Sh SYNOPSIS
.Nm
.Op Fl -version
.Op Fl UPdnvx
.Op Fl E Ar ext Ns Op Ns : Ns int
.Op Fl S Ar level
.Op Fl T Ar mode
.Op Fl r Ar library
.Op Fl -
.Op file ...
.Pp
.Sh DESCRIPTION
.Nm
is a command line front-end for
.Li "ERB"
library, which is an implementation of eRuby.
.Pp
ERB provides an easy to use but powerful templating system for Ruby.
Using ERB, actual Ruby code can be added to any plain text document for the
purposes of generating document information details and/or flow control.
.Pp
.Nm
is a part of
.Nm Ruby .
.Pp
.Sh OPTIONS
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl -version
Prints the version of
.Nm .
.Pp
.It Fl E Ar external Ns Op : Ns Ar internal
.It Fl -encoding Ar external Ns Op : Ns Ar internal
Specifies the default value(s) for external encodings and internal encoding. Values should be separated with colon (:).
.Pp
You can omit the one for internal encodings, then the value
.Pf ( Li "Encoding.default_internal" ) will be nil.
.Pp
.It Fl P
Evaluates lines starting with
.Li "%"
as Ruby code and removes the tailing EOLs.
.Pp
.It Fl S Ar level
Specifies the safe level in which eRuby script will run.
.Pp
.It Fl T Ar mode
Specifies trim mode (default 0).
.Ar mode
can be one of
.Bl -hang -offset indent
.It Sy 0
EOL remains after the embedded ruby script is evaluated.
.Pp
.It Sy 1
EOL is removed if the line ends with
.Li "%>" .
.Pp
.It Sy 2
EOL is removed if the line starts with
.Li "<%"
and ends with
.Li "%>" .
.Pp
.It Sy -
EOL is removed if the line ends with
.Li "-%>" .
And leading whitespaces are removed if the erb directive starts with
.Li "<%-" .
.Pp
.El
.It Fl r
Load a library
.Pp
.It Fl U
can be one of
Sets the default value for internal encodings
.Pf ( Li "Encoding.default_internal" ) to UTF-8.
.Pp
.It Fl d
.It Fl -debug
Turns on debug mode.
.Li "$DEBUG"
will be set to true.
.Pp
.It Fl h
.It Fl -help
Prints a summary of the options.
.Pp
.It Fl n
Used with
.Fl x .
Prepends the line number to each line in the output.
.Pp
.It Fl v
Enables verbose mode.
.Li "$VERBOSE"
will be set to true.
.Pp
.It Fl x
Converts the eRuby script into Ruby script and prints it without line numbers.
.Pp
.El
.Pp
.Sh EXAMPLES
Here is an eRuby script
.Bd -literal -offset indent
<?xml version="1.0" ?>
<% require 'prime' -%>
<erb-example>
  <calc><%= 1+1 %></calc>
  <var><%= __FILE__ %></var>
  <library><%= Prime.each(10).to_a.join(", ") %></library>
</erb-example>
.Ed
.Pp
Command
.Dl "% erb -T - example.erb"
prints
.Bd -literal -offset indent
<?xml version="1.0" ?>
<erb-example>
  <calc>2</calc>
  <var>example.erb</var>
  <library>2, 3, 5, 7</library>
</erb-example>
.Ed
.Pp
.Sh SEE ALSO
.Xr ruby 1 .
.Pp
And see
.Xr ri 1
documentation for
.Li "ERB"
class.
.Pp
.Sh REPORTING BUGS
.Bl -bullet
.It
Security vulnerabilities should be reported via an email to
.Mt security@ruby-lang.org .
Reported problems will be published after being fixed.
.Pp
.It
Other bugs and feature requests can be reported via the
Ruby Issue Tracking System
.Pq Lk https://bugs.ruby-lang.org/ .
Do not report security vulnerabilities
via this system because it publishes the vulnerabilities immediately.
.El
.Sh AUTHORS
Written by Masatoshi SEKI.
man/man1/ruby.1000064400000045007151731612740007233 0ustar00.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd October 31, 2015
.Dt RUBY \&1 "Ruby Programmer's Reference Guide"
.Os UNIX
.Sh NAME
.Nm ruby
.Nd Interpreted object-oriented scripting language
.Sh SYNOPSIS
.Nm
.Op Fl -copyright
.Op Fl -version
.Op Fl SUacdlnpswvy
.Op Fl 0 Ns Op Ar octal
.Op Fl C Ar directory
.Op Fl E Ar external Ns Op : Ns Ar internal
.Op Fl F Ns Op Ar pattern
.Op Fl I Ar directory
.Op Fl K Ns Op Ar c
.Op Fl T Ns Op Ar level
.Op Fl W Ns Op Ar level
.Op Fl e Ar command
.Op Fl i Ns Op Ar extension
.Op Fl r Ar library
.Op Fl x Ns Op Ar directory
.Op Fl - Ns Bro Cm enable Ns | Ns Cm disable Brc Ns - Ns Ar FEATURE
.Op Fl -dump Ns = Ns Ar target
.Op Fl -verbose
.Op Fl -
.Op Ar program_file
.Op Ar argument ...
.Sh DESCRIPTION
Ruby is an interpreted scripting language for quick and easy
object-oriented programming.  It has many features to process text
files and to do system management tasks (like in Perl).  It is simple,
straight-forward, and extensible.
.Pp
If you want a language for easy object-oriented programming, or you
don't like the Perl ugliness, or you do like the concept of LISP, but
don't like too many parentheses, Ruby might be your language of
choice.
.Sh FEATURES
Ruby's features are as follows:
.Bl -tag -width 6n
.It Sy "Interpretive"
Ruby is an interpreted language, so you don't have to recompile
programs written in Ruby to execute them.
.Pp
.It Sy "Variables have no type (dynamic typing)"
Variables in Ruby can contain data of any type.  You don't have to
worry about variable typing.  Consequently, it has a weaker compile
time check.
.Pp
.It Sy "No declaration needed"
You can use variables in your Ruby programs without any declarations.
Variable names denote their scope - global, class, instance, or local.
.Pp
.It Sy "Simple syntax"
Ruby has a simple syntax influenced slightly from Eiffel.
.Pp
.It Sy "No user-level memory management"
Ruby has automatic memory management.  Objects no longer referenced
from anywhere are automatically collected by the garbage collector
built into the interpreter.
.Pp
.It Sy "Everything is an object"
Ruby is a purely object-oriented language, and was so since its
creation.  Even such basic data as integers are seen as objects.
.Pp
.It Sy "Class, inheritance, and methods"
Being an object-oriented language, Ruby naturally has basic
features like classes, inheritance, and methods.
.Pp
.It Sy "Singleton methods"
Ruby has the ability to define methods for certain objects.  For
example, you can define a press-button action for certain widget by
defining a singleton method for the button.  Or, you can make up your
own prototype based object system using singleton methods, if you want
to.
.Pp
.It Sy "Mix-in by modules"
Ruby intentionally does not have the multiple inheritance as it is a
source of confusion.  Instead, Ruby has the ability to share
implementations across the inheritance tree.  This is often called a
.Sq Mix-in .
.Pp
.It Sy "Iterators"
Ruby has iterators for loop abstraction.
.Pp
.It Sy "Closures"
In Ruby, you can objectify the procedure.
.Pp
.It Sy "Text processing and regular expressions"
Ruby has a bunch of text processing features like in Perl.
.Pp
.It Sy "M17N, character set independent"
Ruby supports multilingualized programming. Easy to process texts
written in many different natural languages and encoded in many
different character encodings, without dependence on Unicode.
.Pp
.It Sy "Bignums"
With built-in bignums, you can for example calculate factorial(400).
.Pp
.It Sy "Reflection and domain specific languages"
Class is also an instance of the Class class. Definition of classes and methods
is an expression just as 1+1 is. So your programs can even write and modify programs.
Thus you can write your application in your own programming language on top of Ruby.
.Pp
.It Sy "Exception handling"
As in Java(tm).
.Pp
.It Sy "Direct access to the OS"
Ruby can use most
.Ux
system calls, often used in system programming.
.Pp
.It Sy "Dynamic loading"
On most
.Ux
systems, you can load object files into the Ruby interpreter
on-the-fly.
.It Sy "Rich libraries"
In addition to the
.Dq builtin libraries
and
.Dq standard libraries
that are bundled with Ruby, a vast amount of third-party libraries
.Pq Dq gems
are available via the package management system called
.Sq RubyGems ,
namely the
.Xr gem 1
command.  Visit RubyGems.org
.Pq Lk https://rubygems.org/
to find the gems you need, and explore GitHub
.Pq Lk https://github.com/
to see how they are being developed and used.
.El
.Pp
.Sh OPTIONS
Ruby interpreter accepts following command-line options (switches).
They are quite similar to those of
.Xr perl 1 .
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl -copyright
Prints the copyright notice.
.Pp
.It Fl -version
Prints the version of Ruby interpreter.
.Pp
.It Fl 0 Ns Op Ar octal
(The digit
.Dq zero . )
Specifies the input record separator
.Pf ( Li "$/" )
as an octal number. If no digit is given, the null character is taken
as the separator.  Other switches may follow the digits.
.Fl 00
turns Ruby into paragraph mode.
.Fl 0777
makes Ruby read whole file at once as a single string since there is
no legal character with that value.
.Pp
.It Fl C Ar directory
.It Fl X Ar directory
Causes Ruby to switch to the directory.
.Pp
.It Fl E Ar external Ns Op : Ns Ar internal
.It Fl -encoding Ar external Ns Op : Ns Ar internal
Specifies the default value(s) for external encodings and internal encoding. Values should be separated with colon (:).
.Pp
You can omit the one for internal encodings, then the value
.Pf ( Li "Encoding.default_internal" ) will be nil.
.Pp
.It Fl -external-encoding Ns = Ns Ar encoding
.It Fl -internal-encoding Ns = Ns Ar encoding
Specify the default external or internal character encoding
.Pp
.It Fl F Ar pattern
Specifies input field separator
.Pf ( Li "$;" ) .
.Pp
.It Fl I Ar directory
Used to tell Ruby where to load the library scripts.  Directory path
will be added to the load-path variable
.Pf ( Li "$:" ) .
.Pp
.It Fl K Ar kcode
Specifies KANJI (Japanese) encoding. The default value for script encodings
.Pf ( Li "__ENCODING__" ) and external encodings ( Li "Encoding.default_external" ) will be the specified one.
.Ar kcode
can be one of
.Bl -hang -offset indent
.It Sy e
EUC-JP
.Pp
.It Sy s
Windows-31J (CP932)
.Pp
.It Sy u
UTF-8
.Pp
.It Sy n
ASCII-8BIT (BINARY)
.El
.Pp
.It Fl S
Makes Ruby use the
.Ev PATH
environment variable to search for script, unless its name begins
with a slash.  This is used to emulate
.Li #!
on machines that don't support it, in the following manner:
.Bd -literal -offset indent
#! /usr/local/bin/ruby
# This line makes the next one a comment in Ruby \e
  exec /usr/local/bin/ruby -S $0 $*
.Ed
.Pp
On some systems
.Li "$0"
does not always contain the full pathname, so you need the
.Fl S
switch to tell Ruby to search for the script if necessary (to handle embedded
spaces and such).  A better construct than
.Li "$*"
would be
.Li ${1+"$@"} ,
but it does not work if the script is being interpreted by
.Xr csh 1 .
.Pp
.It Fl T Ns Op Ar level=1
Turns on taint checks at the specified level (default 1).
.Pp
.It Fl U
Sets the default value for internal encodings
.Pf ( Li "Encoding.default_internal" ) to UTF-8.
.Pp
.It Fl W Ns Op Ar level=2
Turns on verbose mode at the specified level without printing the version
message at the beginning. The level can be;
.Bl -hang -offset indent
.It Sy 0
Verbose mode is "silence". It sets the
.Li "$VERBOSE"
to nil.
.Pp
.It Sy 1
Verbose mode is "medium". It sets the
.Li "$VERBOSE"
to false.
.Pp
.It Sy 2 (default)
Verbose mode is "verbose". It sets the
.Li "$VERBOSE"
to true.
.Fl W Ns
2 is same as
.Fl w
.
.El
.Pp
.It Fl a
Turns on auto-split mode when used with
.Fl n
or
.Fl p .
In auto-split mode, Ruby executes
.Dl $F = $_.split
at beginning of each loop.
.Pp
.It Fl c
Causes Ruby to check the syntax of the script and exit without
executing. If there are no syntax errors, Ruby will print
.Dq Syntax OK
to the standard output.
.Pp
.It Fl d
.It Fl -debug
Turns on debug mode.
.Li "$DEBUG"
will be set to true.
.Pp
.It Fl e Ar command
Specifies script from command-line while telling Ruby not to search
the rest of the arguments for a script file name.
.Pp
.It Fl h
.It Fl -help
Prints a summary of the options.
.Pp
.It Fl i Ar extension
Specifies in-place-edit mode.  The extension, if specified, is added
to old file name to make a backup copy.  For example:
.Bd -literal -offset indent
% echo matz > /tmp/junk
% cat /tmp/junk
matz
% ruby -p -i.bak -e '$_.upcase!' /tmp/junk
% cat /tmp/junk
MATZ
% cat /tmp/junk.bak
matz
.Ed
.Pp
.It Fl l
(The lowercase letter
.Dq ell . )
Enables automatic line-ending processing, which means to firstly set
.Li "$\e"
to the value of
.Li "$/" ,
and secondly chops every line read using
.Li chop! .
.Pp
.It Fl n
Causes Ruby to assume the following loop around your script, which
makes it iterate over file name arguments somewhat like
.Nm sed
.Fl n
or
.Nm awk .
.Bd -literal -offset indent
while gets
  ...
end
.Ed
.Pp
.It Fl p
Acts mostly same as -n switch, but print the value of variable
.Li "$_"
at the each end of the loop.  For example:
.Bd -literal -offset indent
% echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"'
MATZ
.Ed
.Pp
.It Fl r Ar library
Causes Ruby to load the library using require.  It is useful when using
.Fl n
or
.Fl p .
.Pp
.It Fl s
Enables some switch parsing for switches after script name but before
any file name arguments (or before a
.Fl - ) .
Any switches found there are removed from
.Li ARGV
and set the corresponding variable in the script.  For example:
.Bd -literal -offset indent
#! /usr/local/bin/ruby -s
# prints "true" if invoked with `-xyz' switch.
print "true\en" if $xyz
.Ed
.Pp
.It Fl v
Enables verbose mode.  Ruby will print its version at the beginning
and set the variable
.Li "$VERBOSE"
to true.  Some methods print extra messages if this variable is true.
If this switch is given, and no other switches are present, Ruby quits
after printing its version.
.Pp
.It Fl w
Enables verbose mode without printing version message at the
beginning.  It sets the
.Li "$VERBOSE"
variable to true.
.Pp
.It Fl x Ns Op Ar directory
Tells Ruby that the script is embedded in a message.  Leading garbage
will be discarded until the first line that starts with
.Dq #!
and contains the string,
.Dq ruby .
Any meaningful switches on that line will be applied.  The end of the script
must be specified with either
.Li EOF ,
.Li "^D" ( Li "control-D" ) ,
.Li "^Z" ( Li "control-Z" ) ,
or the reserved word
.Li __END__ .
If the directory name is specified, Ruby will switch to that directory
before executing script.
.Pp
.It Fl y
.It Fl -yydebug
DO NOT USE.
.Pp
Turns on compiler debug mode.  Ruby will print a bunch of internal
state messages during compilation.  Only specify this switch you are going to
debug the Ruby interpreter.
.Pp
.It Fl -disable- Ns Ar FEATURE
.It Fl -enable- Ns Ar FEATURE
Disables (or enables) the specified
.Ar FEATURE .
.Bl -tag -width "--disable-rubyopt" -compact
.It Fl -disable-gems
.It Fl -enable-gems
Disables (or enables) RubyGems libraries.  By default, Ruby will load the latest
version of each installed gem. The
.Li Gem
constant is true if RubyGems is enabled, false if otherwise.
.Pp
.It Fl -disable-rubyopt
.It Fl -enable-rubyopt
Ignores (or considers) the
.Ev RUBYOPT
environment variable. By default, Ruby considers the variable.
.Pp
.It Fl -disable-all
.It Fl -enable-all
Disables (or enables) all features.
.Pp
.El
.Pp
.It Fl -dump Ns = Ns Ar target
Dump some informations.
.Pp
Prints the specified target.
.Ar target
can be one of;
.Bl -hang -offset indent
.It Sy version
version description same as
.Fl -version
.It Sy usage
brief usage message same as
.Fl h
.It Sy help
Show long help message same as
.Fl -help
.It Sy syntax
check of syntax same as
.Fl c
.Fl -yydebug
.It Sy yydebug
compiler debug mode, same as
.Fl -yydebug
.Pp
Only specify this switch if you are going to debug the Ruby interpreter.
.It Sy parsetree
.It Sy parsetree_with_comment
AST nodes tree
.Pp
Only specify this switch if you are going to debug the Ruby interpreter.
.It Sy insns
disassembled instructions
.Pp
Only specify this switch if you are going to debug the Ruby interpreter.
.El
.Pp
.It Fl -verbose
Enables verbose mode without printing version message at the
beginning.  It sets the
.Li "$VERBOSE"
variable to true.
If this switch is given, and no other switches are present, Ruby quits
after printing its version.
.El
.Pp
.Sh ENVIRONMENT
.Bl -tag -width "RUBYSHELL" -compact
.It Ev RUBYLIB
A colon-separated list of directories that are added to Ruby's
library load path
.Pf ( Li "$:" ) . Directories from this environment variable are searched
before the standard load path is searched.
.Pp
e.g.:
.Dl RUBYLIB="$HOME/lib/ruby:$HOME/lib/rubyext"
.Pp
.It Ev RUBYOPT
Additional Ruby options.
.Pp
e.g.
.Dl RUBYOPT="-w -Ke"
.Pp
Note that RUBYOPT can contain only
.Fl d , Fl E , Fl I , Fl K , Fl r , Fl T , Fl U , Fl v , Fl w , Fl W, Fl -debug ,
.Fl -disable- Ns Ar FEATURE
and
.Fl -enable- Ns Ar FEATURE .
.Pp
.It Ev RUBYPATH
A colon-separated list of directories that Ruby searches for
Ruby programs when the
.Fl S
flag is specified.  This variable precedes the
.Ev PATH
environment variable.
.Pp
.It Ev RUBYSHELL
The path to the system shell command.  This environment variable is
enabled for only mswin32, mingw32, and OS/2 platforms.  If this
variable is not defined, Ruby refers to
.Ev COMSPEC .
.Pp
.It Ev PATH
Ruby refers to the
.Ev PATH
environment variable on calling Kernel#system.
.El
.Pp
And Ruby depends on some RubyGems related environment variables unless RubyGems is disabled.
See the help of
.Xr gem 1
as below.
.Bd -literal -offset indent
% gem help
.Ed
.Pp
.Sh GC ENVIRONMENT
The Ruby garbage collector (GC) tracks objects in fixed-sized slots,
but each object may have auxiliary memory allocations handled by the
malloc family of C standard library calls (
.Xr malloc 3 ,
.Xr calloc 3 ,
and
.Xr realloc 3 ) .
In this documentatation, the "heap" refers to the Ruby object heap
of fixed-sized slots, while "malloc" refers to auxiliary
allocations commonly referred to as the "process heap".
Thus there are at least two possible ways to trigger GC:
.Bl -hang -offset indent
.It Sy 1
Reaching the object limit.
.It Sy 2
Reaching the malloc limit.
.Pp
.El
In Ruby 2.1, the generational GC was introduced and the limits are divided
into young and old generations, providing two additional ways to trigger
a GC:
.Bl -hang -offset indent
.It Sy 3
Reaching the old object limit.
.It Sy 4
Reaching the old malloc limit.
.El
.Pp
There are currently 4 possible areas where the GC may be tuned by
the following 11 environment variables:
.Bl -hang -compact -width "RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR"
.It Ev RUBY_GC_HEAP_INIT_SLOTS
Initial allocation slots.  Introduced in Ruby 2.1, default: 10000.
.Pp
.It Ev RUBY_GC_HEAP_FREE_SLOTS
Prepare at least this amount of slots after GC.
Allocate this number slots if there are not enough slots.
Introduced in Ruby 2.1, default: 4096
.Pp
.It Ev RUBY_GC_HEAP_GROWTH_FACTOR
Increase allocation rate of heap slots by this factor.
Introduced in Ruby 2.1, default: 1.8, minimum: 1.0 (no growth)
.Pp
.It Ev RUBY_GC_HEAP_GROWTH_MAX_SLOTS
Allocation rate is limited to this number of slots,
preventing excessive allocation due to RUBY_GC_HEAP_GROWTH_FACTOR.
Introduced in Ruby 2.1, default: 0 (no limit)
.Pp
.It Ev RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
Perform a full GC when the number of old objects is more than R * N,
where R is this factor and N is the number of old objects after the
last full GC.
Introduced in Ruby 2.1.1, default: 2.0
.Pp
.It Ev RUBY_GC_MALLOC_LIMIT
The initial limit of young generation allocation from the malloc-family.
GC will start when this limit is reached.
Default: 16MB
.Pp
.It Ev RUBY_GC_MALLOC_LIMIT_MAX
The maximum limit of young generation allocation from malloc before GC starts.
Prevents excessive malloc growth due to RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR.
Introduced in Ruby 2.1, default: 32MB.
.Pp
.It Ev RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
Increases the limit of young generation malloc calls, reducing
GC frequency but increasing malloc growth until RUBY_GC_MALLOC_LIMIT_MAX
is reached.
Introduced in Ruby 2.1, default: 1.4, minimum: 1.0 (no growth)
.Pp
.It Ev RUBY_GC_OLDMALLOC_LIMIT
The initial limit of old generation allocation from malloc,
a full GC will start when this limit is reached.
Introduced in Ruby 2.1, default: 16MB
.Pp
.It Ev RUBY_GC_OLDMALLOC_LIMIT_MAX
The maximum limit of old generation allocation from malloc before a
full GC starts.
Prevents excessive malloc growth due to RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR.
Introduced in Ruby 2.1, default: 128MB
.Pp
.It Ev RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
Increases the limit of old generation malloc allocation, reducing full
GC frequency but increasing malloc growth until RUBY_GC_OLDMALLOC_LIMIT_MAX
is reached.
Introduced in Ruby 2.1, default: 1.2, minimum: 1.0 (no growth)
.Pp
.El
.Sh STACK SIZE ENVIRONMENT
Stack size environment variables are implementation-dependent and
subject to change with different versions of Ruby.  The VM stack is used
for pure-Ruby code and managed by the virtual machine.  Machine stack is
used by the operating system and its usage is dependent on C extensions
as well as C compiler options.  Using lower values for these may allow
applications to keep more Fibers or Threads running; but increases the
chance of SystemStackError exceptions and segmentation faults (SIGSEGV).
These environment variables are available since Ruby 2.0.0.
All values are specified in bytes.
.Pp
.Bl -hang -compact -width "RUBY_THREAD_MACHINE_STACK_SIZE"
.It Ev RUBY_THREAD_VM_STACK_SIZE
VM stack size used at thread creation.
default: 131072 (32-bit CPU) or 262144 (64-bit)
.Pp
.It Ev RUBY_THREAD_MACHINE_STACK_SIZE
Machine stack size used at thread creation.
default: 524288 or 1048575
.Pp
.It Ev RUBY_FIBER_VM_STACK_SIZE
VM stack size used at fiber creation.
default: 65536 or 131072
.Pp
.It Ev RUBY_FIBER_MACHINE_STACK_SIZE
Machine stack size used at fiber creation.
default: 262144 or 524288
.Pp
.El
.Sh SEE ALSO
.Bl -hang -compact -width "https://www.ruby-toolbox.com/"
.It Lk https://www.ruby-lang.org/
The official web site.
.It Lk https://www.ruby-toolbox.com/
Comprehensive catalog of Ruby libraries.
.El
.Pp
.Sh REPORTING BUGS
.Bl -bullet
.It
Security vulnerabilities should be reported via an email to
.Mt security@ruby-lang.org .
Reported problems will be published after being fixed.
.Pp
.It
Other bugs and feature requests can be reported via the
Ruby Issue Tracking System
.Pq Lk https://bugs.ruby-lang.org/ .
Do not report security vulnerabilities
via this system because it publishes the vulnerabilities immediately.
.El
.Sh AUTHORS
Ruby is designed and implemented by
.An Yukihiro Matsumoto Aq matz@netlab.jp .
.Pp
See
.Aq Lk https://bugs.ruby-lang.org/projects/ruby/wiki/Contributors
for contributors to Ruby.
man/man1/irb.1000064400000006571151731612740007031 0ustar00.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd November 15, 2012
.Dt IRB \&1 "Ruby Programmer's Reference Guide"
.Os UNIX
.Sh NAME
.Nm irb
.Nd Interactive Ruby Shell
.Sh SYNOPSIS
.Nm
.Op Fl -version
.Op Fl dfm
.Op Fl I Ar directory
.Op Fl r Ar library
.Op Fl - Ns Oo no Oc Ns inspect
.Op Fl - Ns Oo no Oc Ns readline
.Op Fl -prompt Ar mode
.Op Fl -prompt-mode Ar mode
.Op Fl -inf-ruby-mode
.Op Fl -simple-prompt
.Op Fl -noprompt
.Op Fl -tracer
.Op Fl -back-trace-limit Ar n
.Op Fl -irb_debug Ar n
.Op Fl -
.Op program_file
.Op argument ...
.Pp
.Sh DESCRIPTION
.Nm
is the REPL(read-eval-print loop) environment for Ruby programs.
.Pp
.Sh OPTIONS
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl -version
Prints the version of
.Nm .
.Pp
.It Fl E Ar external Ns Op : Ns Ar internal
.It Fl -encoding Ar external Ns Op : Ns Ar internal
Same as `ruby -E' .
Specifies the default value(s) for external encodings and internal encoding. Values should be separated with colon (:).
.Pp
You can omit the one for internal encodings, then the value
.Pf ( Li "Encoding.default_internal" ) will be nil.
.Pp
.It Fl I Ar path
Same as `ruby -I' .
Specifies
.Li $LOAD_PATH
directory
.Pp
.It Fl U
Same as `ruby -U' .
Sets the default value for internal encodings
.Pf ( Li "Encoding.default_internal" ) to UTF-8.
.Pp
.It Fl d
Same as `ruby -d' .
Sets
.Li $DEBUG
to true.
.Pp
.It Fl f
Suppresses read of
.Pa ~/.irbrc .
.Pp
.It Fl h
.It Fl -help
Prints a summary of the options.
.Pp
.It Fl r Ar library
Same as `ruby -r'.
Causes irb to load the library using require.
.Pp
.It Fl -inspect
Uses `inspect' for output (default except for bc mode)
.Pp
.It Fl -noinspect
Doesn't use inspect for output
.Pp
.It Fl -readline
Uses Readline extension module.
.Pp
.It Fl -noreadline
Doesn't use Readline extension module.
.Pp
.It Fl -prompt Ar mode
.It Fl -prompt-mode Ar mode
Switch prompt mode. Pre-defined prompt modes are
`default', `simple', `xmp' and `inf-ruby'.
.Pp
.It Fl -inf-ruby-mode
Uses prompt appropriate for inf-ruby-mode on emacs.
Suppresses --readline.
.Pp
.It Fl -simple-prompt
Makes prompts simple.
.Pp
.It Fl -noprompt
No prompt mode.
.Pp
.It Fl -tracer
Displays trace for each execution of commands.
.Pp
.It Fl -back-trace-limit Ar n
Displays backtrace top
.Ar n
and tail
.Ar n Ns .
The default value is 16.
.Pp
.It Fl -irb_debug Ar n
Sets internal debug level to n (not for popular use)
.Pp
.El
.Pp
.Sh ENVIRONMENT
.Bl -tag -compact
.It Ev IRBRC
.Pp
.El
.Pp
Also
.Nm
depends on same variables as
.Xr ruby 1 .
.Pp
.Sh FILES
.Bl -tag -compact
.It Pa ~/.irbrc
Personal irb initialization.
.Pp
.El
.Pp
.Sh EXAMPLES
.Dl % irb
.Dl irb(main):001:0> Ic 1 + 1
.Dl 2
.Dl irb(main):002:0> Ic def t(x)
.Dl irb(main):003:1> Ic   x+1
.Dl irb(main):004:1> Ic end
.Dl => :t
.Dl irb(main):005:0> Ic t(3)
.Dl => 4
.Dl irb(main):006:0> Ic if t(3) == 4
.Dl irb(main):007:1> Ic p :ok
.Dl irb(main):008:1> Ic end
.Dl :ok
.Dl => :ok
.Dl irb(main):009:0> Ic quit
.Dl %
.Pp
.Sh SEE ALSO
.Xr ruby 1 .
.Pp
.Sh REPORTING BUGS
.Bl -bullet
.It
Security vulnerabilities should be reported via an email to
.Mt security@ruby-lang.org .
Reported problems will be published after being fixed.
.Pp
.It
Other bugs and feature requests can be reported via the
Ruby Issue Tracking System
.Pq Lk https://bugs.ruby-lang.org/ .
Do not report security vulnerabilities
via this system because it publishes the vulnerabilities immediately.
.El
.Sh AUTHORS
Written by Keiju ISHITSUKA.
man/man1/ri.1000064400000012343151731612740006661 0ustar00.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd April 20, 2017
.Dt RI \&1 "Ruby Programmer's Reference Guide"
.Os UNIX
.Sh NAME
.Nm ri
.Nd Ruby API reference front end
.Sh SYNOPSIS
.Nm
.Op Fl ahilTv
.Op Fl d Ar DIRNAME
.Op Fl f Ar FORMAT
.Op Fl w Ar WIDTH
.Op Fl - Ns Oo Cm no- Oc Ns Cm pager
.Op Fl -server Ns Oo = Ns Ar PORT Oc
.Op Fl - Ns Oo Cm no- Oc Ns Cm list-doc-dirs
.Op Fl -no-standard-docs
.Op Fl - Ns Oo Cm no- Oc Ns Bro Cm system Ns | Ns Cm site Ns | Ns Cm gems Ns | Ns Cm home Brc
.Op Fl - Ns Oo Cm no- Oc Ns Cm profile
.Op Fl -dump Ns = Ns Ar CACHE
.Op Ar name ...
.Sh DESCRIPTION
.Nm
is a command-line front end for the Ruby API reference.
You can search and read the API reference for classes and methods with
.Nm .
.Pp
.Nm
is a part of Ruby.
.Pp
.Ar name
can be:
.Bl -diag -offset indent
.It Class | Module | Module::Class
.Pp
.It Class::method | Class#method | Class.method | method
.Pp
.It gem_name: | gem_name:README | gem_name:History
.El
.Pp
All class names may be abbreviated to their minimum unambiguous form.
If a name is ambiguous, all valid options will be listed.
.Pp
A
.Ql \&.
matches either class or instance methods, while #method
matches only instance and ::method matches only class methods.
.Pp
README and other files may be displayed by prefixing them with the gem name
they're contained in.  If the gem name is followed by a
.Ql \&:
all files in the gem will be shown.
The file name extension may be omitted where it is unambiguous.
.Pp
For example:
.Bd -literal -offset indent
ri Fil
ri File
ri File.new
ri zip
ri rdoc:README
.Ed
.Pp
Note that shell quoting or escaping may be required for method names
containing punctuation:
.Bd -literal -offset indent
ri 'Array.[]'
ri compact\e!
.Ed
.Pp
To see the default directories
.Nm
will search, run:
.Bd -literal -offset indent
ri --list-doc-dirs
.Ed
.Pp
Specifying the
.Fl -system , Fl -site , Fl -home , Fl -gems ,
or
.Fl -doc-dir
options will limit
.Nm
to searching only the specified directories.
.Pp
.Nm
options may be set in the
.Ev RI
environment variable.
.Pp
The
.Nm
pager can be set with the
.Ev RI_PAGER
environment variable or the
.Ev PAGER
environment variable.
.Pp
.Sh OPTIONS
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl i
.It Fl - Ns Oo Cm no- Oc Ns Cm interactive
In interactive mode you can repeatedly
look up methods with autocomplete.
.Pp
.It Fl a
.It Fl - Ns Oo Cm no- Oc Ns Cm all
Show all documentation for a class or module.
.Pp
.It Fl l
.It Fl - Ns Oo Cm no- Oc Ns Cm list
List classes
.Nm
knows about.
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm pager
Send output to a pager,
rather than directly to stdout.
.Pp
.It Fl T
Synonym for
.Fl -no-pager .
.Pp
.It Fl w Ar WIDTH
.It Fl -width Ns = Ns Ar WIDTH
Set the width of the output.
.Pp
.It Fl -server Ns Oo = Ns Ar PORT Oc
Run RDoc server on the given port.
The default port is\~8214.
.Pp
.It Fl f Ar FORMAT
.It Fl -format Ns = Ns Ar FORMAT
Use the selected formatter.
The default formatter is
.Li bs
for paged output and
.Li ansi
otherwise.
Valid formatters are:
.Li ansi , Li bs , Li markdown , Li rdoc .
.Pp
.It Fl h
.It Fl -help
Show help and exit.
.Pp
.It Fl v
.It Fl -version
Output version information and exit.
.El
.Pp
Data source options:
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm list-doc-dirs
List the directories from which
.Nm
will source documentation on stdout and exit.
.Pp
.It Fl d Ar DIRNAME
.It Fl -doc-dir Ns = Ns Ar DIRNAME
List of directories from which to source
documentation in addition to the standard
directories.  May be repeated.
.Pp
.It Fl -no-standard-docs
Do not include documentation from the Ruby standard library,
.Pa site_lib ,
installed gems, or
.Pa ~/.rdoc .
Use with
.Fl -doc-dir .
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm system
Include documentation from Ruby's standard library.  Defaults to true.
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm site
Include documentation from libraries installed in
.Pa site_lib .
Defaults to true.
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm gems
Include documentation from RubyGems.  Defaults to true.
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm home
Include documentation stored in
.Pa ~/.rdoc .
Defaults to true.
.El
.Pp
Debug options:
.Bl -tag -width "1234567890123" -compact
.Pp
.It Fl - Ns Oo Cm no- Oc Ns Cm profile
Run with the Ruby profiler.
.Pp
.It Fl -dump Ns = Ns Ar CACHE
Dump data from an ri cache or data file.
.El
.Pp
.Sh ENVIRONMENT
.Bl -tag -width "USERPROFILE" -compact
.Pp
.It Ev RI
Options to prepend to those specified on the command-line.
.Pp
.It Ev RI_PAGER
.It Ev PAGER
Pager program to use for displaying.
.Pp
.It Ev HOME
.It Ev USERPROFILE
.It Ev HOMEPATH
Path to the user's home directory.
.El
.Pp
.Sh FILES
.Bl -tag -width "USERPROFILE" -compact
.Pp
.It Pa ~/.rdoc
Path for ri data in the user's home directory.
.Pp
.El
.Pp
.Sh SEE ALSO
.Xr ruby 1 ,
.Xr rdoc 1 ,
.Xr gem 1
.Pp
.Sh REPORTING BUGS
.Bl -bullet
.It
Security vulnerabilities should be reported via an email to
.Mt security@ruby-lang.org .
Reported problems will be published after being fixed.
.Pp
.It
Other bugs and feature requests can be reported via the
Ruby Issue Tracking System
.Pq Lk https://bugs.ruby-lang.org/ .
Do not report security vulnerabilities
via this system because it publishes the vulnerabilities immediately.
.El
.Sh AUTHORS
Written by
.An Dave Thomas Aq dave@pragmaticprogrammer.com .
doc/alt-ruby25/COPYING000064400000004751151731612750010271 0ustar00Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
You can redistribute it and/or modify it under either the terms of the
2-clause BSDL (see the file BSDL), or the conditions below:

  1. You may make and give away verbatim copies of the source form of the
     software without restriction, provided that you duplicate all of the
     original copyright notices and associated disclaimers.

  2. You may modify your copy of the software in any way, provided that
     you do at least ONE of the following:

       a) place your modifications in the Public Domain or otherwise
          make them Freely Available, such as by posting said
          modifications to Usenet or an equivalent medium, or by allowing
          the author to include your modifications in the software.

       b) use the modified software only within your corporation or
          organization.

       c) give non-standard binaries non-standard names, with
          instructions on where to get the original software distribution.

       d) make other distribution arrangements with the author.

  3. You may distribute the software in object code or binary form,
     provided that you do at least ONE of the following:

       a) distribute the binaries and library files of the software,
          together with instructions (in the manual page or equivalent)
          on where to get the original distribution.

       b) accompany the distribution with the machine-readable source of
          the software.

       c) give non-standard binaries non-standard names, with
          instructions on where to get the original software distribution.

       d) make other distribution arrangements with the author.

  4. You may modify and include the part of the software into any other
     software (possibly commercial).  But some files in the distribution
     are not written by the author, so that they are not under these terms.

     For the list of those files and their copying conditions, see the
     file LEGAL.

  5. The scripts and library files supplied as input to or produced as
     output from the software do not automatically fall under the
     copyright of the software, but belong to whomever generated them,
     and may be sold commercially, and may be aggregated with this
     software.

  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     PURPOSE.
doc/alt-ruby25/COPYING.ja000064400000005100151731612760010650 0ustar00本プログラムはフリーソフトウェアです.2-clause BSDL
または以下に示す条件で本プログラムを再配布できます
2-clause BSDLについてはBSDLファイルを参照して下さい.

  1. 複製は制限なく自由です.

  2. 以下の条件のいずれかを満たす時に本プログラムのソースを
     自由に変更できます.

     (a) ネットニューズにポストしたり,作者に変更を送付する
         などの方法で,変更を公開する.

     (b) 変更した本プログラムを自分の所属する組織内部だけで
         使う.

     (c) 変更点を明示したうえ,ソフトウェアの名前を変更する.
         そのソフトウェアを配布する時には変更前の本プログラ
         ムも同時に配布する.または変更前の本プログラムのソー
         スの入手法を明示する.

     (d) その他の変更条件を作者と合意する.

  3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ
     ルしたオブジェクトコードや実行形式でも配布できます.

     (a) バイナリを受け取った人がソースを入手できるように,
         ソースの入手法を明示する.

     (b) 機械可読なソースコードを添付する.

     (c) 変更を行ったバイナリは名前を変更したうえ,オリジナ
         ルのソースコードの入手法を明示する.

     (d) その他の配布条件を作者と合意する.

  4. 他のプログラムへの引用はいかなる目的であれ自由です.た
     だし,本プログラムに含まれる他の作者によるコードは,そ
     れぞれの作者の意向による制限が加えられる場合があります.

     それらファイルの一覧とそれぞれの配布条件などに付いては
     LEGALファイルを参照してください.

  5. 本プログラムへの入力となるスクリプトおよび,本プログラ
     ムからの出力の権利は本プログラムの作者ではなく,それぞ
     れの入出力を生成した人に属します.また,本プログラムに
     組み込まれるための拡張ライブラリについても同様です.

  6. 本プログラムは無保証です.作者は本プログラムをサポート
     する意志はありますが,プログラム自身のバグあるいは本プ
     ログラムの実行などから発生するいかなる損害に対しても責
     任を持ちません.
doc/alt-ruby25/BSDL000064400000002402151731612760007675 0ustar00Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
doc/alt-ruby25/LEGAL000064400000107504151731612770010007 0ustar00LEGAL NOTICE INFORMATION
------------------------

All the files in this distribution are covered under either the Ruby's
license (see the file COPYING) or public-domain except some files
mentioned below.

ccan/build_assert/build_assert.h
ccan/check_type/check_type.h
ccan/container_of/container_of.h
ccan/str/str.h

  These files are licensed under the CC0.

    https://creativecommons.org/choose/zero/

ccan/list/list.h

  This file is licensed under the MIT License.

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

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

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

include/ruby/onigmo.h:
include/ruby/oniguruma.h:
regcomp.c:
regenc.[ch]:
regerror.c:
regexec.c:
regint.h:
regparse.[ch]:
enc/ascii.c
enc/big5.c
enc/cp949.c
enc/emacs_mule.c
enc/encdb.c
enc/euc_jp.c
enc/euc_kr.c
enc/euc_tw.c
enc/gb18030.c
enc/gb2312.c
enc/gbk.c
enc/iso_8859_1.c
enc/iso_8859_10.c
enc/iso_8859_11.c
enc/iso_8859_13.c
enc/iso_8859_14.c
enc/iso_8859_15.c
enc/iso_8859_16.c
enc/iso_8859_2.c
enc/iso_8859_3.c
enc/iso_8859_4.c
enc/iso_8859_5.c
enc/iso_8859_6.c
enc/iso_8859_7.c
enc/iso_8859_8.c
enc/iso_8859_9.c
enc/koi8_r.c
enc/koi8_u.c
enc/shift_jis.c
enc/unicode.c
enc/us_ascii.c
enc/utf_16be.c
enc/utf_16le.c
enc/utf_32be.c
enc/utf_32le.c
enc/utf_8.c
enc/windows_1251.c

Onigmo (Oniguruma-mod) LICENSE
------------------------------

/*-
 * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
 * Copyright (c) 2011-2014  K.Takata  <kentkt AT csc DOT jp>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */


Oniguruma LICENSE
-----------------

/*-
 * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

https://github.com/k-takata/Onigmo/
https://github.com/kkos/oniguruma
https://svnweb.freebsd.org/ports/head/devel/oniguruma/

   When this software is partly used or it is distributed with Ruby,
   this of Ruby follows the license of Ruby.

enc/trans/GB/GB12345%UCS.src:
enc/trans/GB/UCS%GB12345.src:
enc/trans/GB/GB2312%UCS.src:
enc/trans/GB/UCS%GB2312.src:

    This mapping data was created from files provided by Unicode, Inc.
    (The Unicode Consortium). The files were used to create a product supporting
    Unicode, as explicitly permitted in the files' copyright notices.
    Please note that Unicode, Inc. never made any claims as to fitness of these
    files for any particular purpose, and has ceased to publish the files many
    years ago.

enc/trans/JIS/JISX0201-KANA%UCS.src:
enc/trans/JIS/JISX0208@1990%UCS.src:
enc/trans/JIS/JISX0212%UCS.src:
enc/trans/JIS/UCS%JISX0201-KANA.src:
enc/trans/JIS/UCS%JISX0208@1990.src:
enc/trans/JIS/UCS%JISX0212.src:

    © 2015 Unicode®, Inc.
    For terms of use, see http://www.unicode.org/terms_of_use.html

enc/trans/JIS/JISX0213-1%UCS@BMP.src:
enc/trans/JIS/JISX0213-1%UCS@SIP.src:
enc/trans/JIS/JISX0213-2%UCS@BMP.src:
enc/trans/JIS/JISX0213-2%UCS@SIP.src:

 	Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
 	Copyright (C) 2001 I'O, All Rights Reserved.
 	Copyright (C) 2006 Project X0213, All Rights Reserved.
 	You can use, modify, distribute this table freely.

enc/trans/JIS/UCS@BMP%JISX0213-1.src:
enc/trans/JIS/UCS@BMP%JISX0213-2.src:
enc/trans/JIS/UCS@SIP%JISX0213-1.src:
enc/trans/JIS/UCS@SIP%JISX0213-2.src:

 	Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
 	Copyright (C) 2001 I'O, All Rights Reserved.
 	You can use, modify, distribute this table freely.

configure:

  This file is free software.

    Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.

    This configure script is free software; the Free Software Foundation
    gives unlimited permission to copy, distribute and modify it.

tool/config.guess:
tool/config.sub:

  As long as you distribute these files with the file configure, they
  are covered under the Ruby's license.

      Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
      Free Software Foundation, Inc.

    This file is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

    As a special exception to the GNU General Public License, if you
    distribute this file as part of a program that contains a
    configuration script generated by Autoconf, you may include it under
    the same distribution terms that you use for the rest of that program.

parse.c:

  This file is licensed under the GPL, but is incorporated into Ruby and
  redistributed under the terms of the Ruby license, as permitted by the
  exception to the GPL below.

     Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
     Free Software Foundation, Inc.

     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2, or (at your option)
     any later version.

     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin Street, Fifth Floor,
     Boston, MA 02110-1301, USA.  */

  /* As a special exception, you may create a larger work that contains
     part or all of the Bison parser skeleton and distribute that work
     under terms of your choice, so long as that work isn't itself a
     parser generator using the skeleton or a modified version thereof
     as a parser skeleton.  Alternatively, if you modify or redistribute
     the parser skeleton itself, you may (at your option) remove this
     special exception, which will cause the skeleton and the resulting
     Bison output files to be licensed under the GNU General Public
     License without this special exception.

     This special exception was added by the Free Software Foundation in
     version 2.2 of Bison.  */

util.c (partly):

    Copyright (c) 1991, 2000, 2001 by Lucent Technologies.

    Permission to use, copy, modify, and distribute this software for any
    purpose without fee is hereby granted, provided that this entire notice
    is included in all copies of any software which is or includes a copy
    or modification of this software and in all copies of the supporting
    documentation for such software.

    THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
    WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
    REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
    OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.

win32/win32.[ch]:

  You can apply the Artistic License to these files. (or GPL,
  alternatively)

    Copyright (c) 1993, Intergraph Corporation

    You may distribute under the terms of either the GNU General Public
    License or the Artistic License, as specified in the perl README file.

util.c (partly):

   Copyright (c) 2004-2008 David Schultz <das@FreeBSD.ORG>
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:
   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
   2. Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

   THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   SUCH DAMAGE.

random.c

  This file is under the new-style BSD license.

    A C-program for MT19937, with initialization improved 2002/2/10.
    Coded by Takuji Nishimura and Makoto Matsumoto.
    This is a faster version by taking Shawn Cokus's optimization,
    Matthe Bellew's simplification, Isaku Wada's real version.

    Before using, initialize the state by using init_genrand(seed)
    or init_by_array(init_key, key_length).

    Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

      1. Redistributions of source code must retain the above copyright
	 notice, this list of conditions and the following disclaimer.

      2. Redistributions in binary form must reproduce the above copyright
	 notice, this list of conditions and the following disclaimer in the
	 documentation and/or other materials provided with the distribution.

      3. The names of its contributors may not be used to endorse or promote
	 products derived from this software without specific prior written
	 permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


    Any feedback is very welcome.
    http://www.math.keio.ac.jp/matumoto/emt.html
    email: matumoto@math.keio.ac.jp

  The Wayback Machine url: http://web.archive.org/web/19990429082237/http://www.math.keio.ac.jp/matumoto/emt.html

vm_dump.c:procstat_vm

  This file is under the new-style BSD license.

    Copyright (c) 2007 Robert N. M. Watson
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

    $FreeBSD: head/usr.bin/procstat/procstat_vm.c 261780 2014-02-11 21:57:37Z jhb $

vsnprintf.c:

  This file is under the old-style BSD license.  Note that the
  paragraph 3 below is now null and void.

    Copyright (c) 1990, 1993
         The Regents of the University of California.  All rights reserved.

    This code is derived from software contributed to Berkeley by
    Chris Torek.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the University nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

    IMPORTANT NOTE:
    --------------
    From ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
    paragraph 3 above is now null and void.

st.c:
strftime.c:
include/ruby/st.h:
missing/acosh.c:
missing/alloca.c:
missing/dup2.c:
missing/erf.c:
missing/finite.c:
missing/hypot.c:
missing/isinf.c:
missing/isnan.c:
missing/lgamma_r.c:
missing/memcmp.c:
missing/memmove.c:
missing/strchr.c:
missing/strerror.c:
missing/strstr.c:
missing/tgamma.c:
ext/date/date_strftime.c:
ext/digest/sha1/sha1.[ch]:
ext/sdbm/_sdbm.c:
ext/sdbm/sdbm.h:

  These files are all under public domain.

missing/crypt.c:

  This file is under the old-style BSD license.  Note that the
  paragraph 3 below is now null and void.

    Copyright (c) 1989, 1993
    	The Regents of the University of California.  All rights reserved.

    This code is derived from software contributed to Berkeley by
    Tom Truscott.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the University nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

missing/setproctitle.c

  This file is under the old-style BSD license.  Note that the
  paragraph 3 below is now null and void.

    Copyright 2003 Damien Miller
    Copyright (c) 1983, 1995-1997 Eric P. Allman
    Copyright (c) 1988, 1993
    	The Regents of the University of California.  All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the University nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

missing/strlcat.c
missing/strlcpy.c

  These files are under an ISC-style license.

    Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>

    Permission to use, copy, modify, and distribute this software for any
    purpose with or without fee is hereby granted, provided that the above
    copyright notice and this permission notice appear in all copies.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

missing/langinfo.c

  This file is from http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c.
  Ruby uses a modified version. The file contains the following
  author/copyright notice:

  Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11
  Permission to use, copy, modify, and distribute this software
  for any purpose and without fee is hereby granted. The author
  disclaims all warranties with regard to this software.

ext/digest/md5/md5.[ch]:

  These files are under the following license.  Ruby uses modified
  versions of them.

    Copyright (C) 1999, 2000 Aladdin Enterprises.  All rights reserved.

    This software is provided 'as-is', without any express or implied
    warranty.  In no event will the authors be held liable for any damages
    arising from the use of this software.

    Permission is granted to anyone to use this software for any purpose,
    including commercial applications, and to alter it and redistribute it
    freely, subject to the following restrictions:

    1. The origin of this software must not be misrepresented; you must not
       claim that you wrote the original software. If you use this software
       in a product, an acknowledgment in the product documentation would be
       appreciated but is not required.
    2. Altered source versions must be plainly marked as such, and must not be
       misrepresented as being the original software.
    3. This notice may not be removed or altered from any source distribution.

    L. Peter Deutsch
    ghost@aladdin.com

ext/digest/rmd160/rmd160.[ch]:

  These files have the following copyright information, and by the
  author we are allowed to use it under the new-style BSD license.

    AUTHOR:   Antoon Bosselaers, ESAT-COSIC
              (Arranged for libc by Todd C. Miller)
    DATE:     1 March 1996

    Copyright (c) Katholieke Universiteit Leuven
    1996, All Rights Reserved

ext/digest/sha2/sha2.[ch]:

  These files are under the new-style BSD license.

    Copyright 2000 Aaron D. Gifford.  All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

ext/json/generator/generator.c:

    Copyright 2001-2004 Unicode, Inc.

    Disclaimer

    This source code is provided as is by Unicode, Inc. No claims are
    made as to fitness for any particular purpose. No warranties of any
    kind are expressed or implied. The recipient agrees to determine
    applicability of information provided. If this file has been
    purchased on magnetic or optical media from Unicode, Inc., the
    sole remedy for any claim will be exchange of defective media
    within 90 days of receipt.

    Limitations on Rights to Redistribute This Code

    Unicode, Inc. hereby grants the right to freely use the information
    supplied in this file in the creation of products supporting the
    Unicode Standard, and to make copies of this file in any form
    for internal or external distribution as long as this notice
    remains attached.

ext/nkf/nkf-utf8/config.h:
ext/nkf/nkf-utf8/nkf.c:
ext/nkf/nkf-utf8/utf8tbl.c:

  These files are under the following license.  So to speak, it is
  copyrighted semi-public-domain software.

    Copyright (C) 1987, Fujitsu LTD. (Itaru ICHIKAWA)
       Everyone is permitted to do anything on this program
       including copying, modifying, improving,
       as long as you don't try to pretend that you wrote it.
       i.e., the above copyright notice has to appear in all copies.
       Binary distribution requires original version messages.
       You don't have to ask before copying, redistribution or publishing.
       THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.

ext/psych:
test/psych:

  Copyright 2009 Aaron Patterson, et al.

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

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

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

ext/psych/yaml:

  Copyright (c) 2006 Kirill Simonov

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

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

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

ext/socket/addrinfo.h:
ext/socket/getaddrinfo.c:
ext/socket/getnameinfo.c:

  These files are under the new-style BSD license.

    Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

ext/win32ole/win32ole.c:

  You can apply the Artistic License to this file. (or GPL,
  alternatively)

    (c) 1995 Microsoft Corporation. All rights reserved.
    Developed by ActiveWare Internet Corp., http://www.ActiveWare.com

    Other modifications Copyright (c) 1997, 1998 by Gurusamy Sarathy
    <gsar@umich.edu> and Jan Dubois <jan.dubois@ibm.net>

    You may distribute under the terms of either the GNU General Public
    License or the Artistic License, as specified in the README file
    of the Perl distribution.

  The Wayback Machine url: http://web.archive.org/web/19970607104352/http://www.activeware.com:80/

lib/rdoc/generator/template/darkfish/css/fonts.css:

  This file is licensed under the SIL Open Font License.

    http://scripts.sil.org/OFL

spec/mspec:
spec/ruby:

    Copyright (c) 2008 Engine Yard, Inc. All rights reserved.

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

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

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

lib/rubygems.rb:
lib/rubygems:
test/rubygems:

  RubyGems is copyrighted free software by Chad Fowler, Rich Kilmer, Jim
  Weirich and others.  You can redistribute it and/or modify it under
  either the terms of the MIT license (see the file MIT.txt), or the
  conditions below:

  1. You may make and give away verbatim copies of the source form of the
     software without restriction, provided that you duplicate all of the
     original copyright notices and associated disclaimers.

  2. You may modify your copy of the software in any way, provided that
     you do at least ONE of the following:

     a. place your modifications in the Public Domain or otherwise
        make them Freely Available, such as by posting said
        modifications to Usenet or an equivalent medium, or by allowing
        the author to include your modifications in the software.

     b. use the modified software only within your corporation or
        organization.

     c. give non-standard executables non-standard names, with
        instructions on where to get the original software distribution.

     d. make other distribution arrangements with the author.

  3. You may distribute the software in object code or executable
     form, provided that you do at least ONE of the following:

     a. distribute the executables and library files of the software,
        together with instructions (in the manual page or equivalent)
        on where to get the original distribution.

     b. accompany the distribution with the machine-readable source of
        the software.

     c. give non-standard executables non-standard names, with
        instructions on where to get the original software distribution.

     d . make other distribution arrangements with the author.

  4. You may modify and include the part of the software into any other
     software (possibly commercial).

  5. The scripts and library files supplied as input to or produced as
     output from the software do not automatically fall under the
     copyright of the software, but belong to whomever generated them,
     and may be sold commercially, and may be aggregated with this
     software.

  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     PURPOSE.
doc/alt-ruby25/README.EXT000064400000000034151731613000010530 0ustar00Moved to doc/extension.rdoc
doc/alt-ruby25/README.EXT.ja000064400000000053151731613010011123 0ustar00doc/extension.ja.rdocに移動しました
doc/alt-ruby25/ChangeLog000064400004772216151731613010011012 0ustar00------------------------------------------------------------------------
r67939 | usa | 2021-04-05 20:46:35 +0900 (Mon, 05 Apr 2021) | 1 line

add tag v2_5_9
------------------------------------------------------------------------
r67938 | usa | 2021-04-05 20:46:23 +0900 (Mon, 05 Apr 2021) | 2 lines

Oops, forgotten to add

------------------------------------------------------------------------
r67937 | usa | 2021-04-05 20:45:31 +0900 (Mon, 05 Apr 2021) | 2 lines

REXML 3.1.7.4

------------------------------------------------------------------------
r67893 | usa | 2021-02-16 22:35:19 +0900 (Tue, 16 Feb 2021) | 4 lines

Backport webrick patch for CVE-2020-25613

[Backport #17201]

------------------------------------------------------------------------
r67889 | usa | 2020-12-09 22:55:29 +0900 (Wed, 09 Dec 2020) | 2 lines

[Backport #17381] repalce the old certs in RubyGems

------------------------------------------------------------------------
r67887 | usa | 2020-10-28 22:12:06 +0900 (Wed, 28 Oct 2020) | 21 lines

merge revision(s): 07786ed

	* test/net/http/test_https.rb: Stop the error due to openssl 1.1.1h

	On some environments that uses OpenSSL 1.1.1h, the two tests now fail.

	http://rubyci.s3.amazonaws.com/android29-x86_64/ruby-master/log/20200924T062352Z.fail.html.gz
	https://github.com/ruby/ruby/runs/1159288773?check_suite_focus=true

	```
	  1) Failure:
	TestNetHTTPS#test_get [/data/data/com.termux/files/home/cb/tmp/build/202	00924T062352Z/ruby/test/net/http/test_https.rb:47]:
	<"0\x82\x03\xED0\x82\x02\xD5\xA0\x03..."> expected but was
	<"0\x82\x03\xE30\x82\x02\xCB\xA0\x03...">.
	```

	Not sure why, but verify_callback now seems to receive only SERVER_CERT
	but not CA_CERT.
	It would be good to investigate the issue furthermore, but tentatively,
	I want to stop the failures.

------------------------------------------------------------------------
r67885 | usa | 2020-06-14 01:03:14 +0900 (Sun, 14 Jun 2020) | 13 lines

merge revision(s) 7e289cdf3fed588b2d5a6973e29f9ff95cb8d76c: [Backport #16949]

[ruby/psych] Fixing compatibility with libyaml 0.2.5

The main issue is that commas aren't allowed in local tags.  libyaml
was updated to follow the spec, and our tests were out of date.

See: https://github.com/yaml/libyaml/issues/196

https://github.com/ruby/psych/commit/3f5e520fd3

Note that this is not security fix, but need for release processs.

------------------------------------------------------------------------
r67881 | usa | 2020-03-31 21:13:31 +0900 (Tue, 31 Mar 2020) | 5 lines

merge revision(s) 47a1872cd8b901b8aab6dedce7fa3807c97d290d: [Backport #16681]

	Use osuosl instead of GitHub releases

	  Because the package provided by GitHub releases is different from sourceware.
------------------------------------------------------------------------
r67877 | usa | 2020-03-31 20:40:08 +0900 (Tue, 31 Mar 2020) | 8 lines

merge revision(s) 61b7f86248bd121be2e83768be71ef289e8e5b90

	* ext/socket/init.c: do not return uninitialized buffer
	  Resize string buffer only if some data is received in
	  BasicSocket#read_nonblock and some methods.

	Co-Authored-By: Samuel Williams <samuel.williams@oriontransfer.co.nz>

------------------------------------------------------------------------
r67872 | usa | 2020-03-31 07:47:56 +0900 (Tue, 31 Mar 2020) | 7 lines

merge revision(s) 4adb2d655dcd54b28366b4d17e86b21e2b622cd1: [Backport #16738]

	Make RbConfig::CONFIG values mutable [Bug #16738]

	As `RbConfig.expand` modifies the argument and involved `CONFIG`
	values, its values should be mutable.

------------------------------------------------------------------------
r67871 | usa | 2020-03-31 07:44:13 +0900 (Tue, 31 Mar 2020) | 28 lines

merge revision(s) 62743: [Backport #16687]

	Fix FrozenError on `Ripper.slice`

	Currently `Ripper.slice` raises a FrozenError

	```ruby
	require 'ripper'
	p Ripper.slice('foo', 'ident')
	```

	```
	/path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:193:in `concat': can't modify frozen String (FrozenError)
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:193:in `block in compile'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:190:in `scan'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:190:in `compile'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:169:in `initialize'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:151:in `new'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:151:in `token_match'
		from /path/to/g/lib/ruby/2.6.0/ripper/lexer.rb:144:in `slice'
		from /tmp/tmp.kb4cnhvum2/test.rb:2:in `<main>'
	```

	This patch will fix the problem.

	[Fix GH-1837]

	From: Masataka Pocke Kuwabara <kuwabara@pocke.me>
------------------------------------------------------------------------
r67870 | usa | 2020-03-31 07:33:37 +0900 (Tue, 31 Mar 2020) | 4 lines

merge revision(s) 8a6ba10f9dd456cf54de800203cf04bbe42271fb: [Backport #12392]

	Do not make disabled directories at installation  [Bug #12392]

------------------------------------------------------------------------
r67869 | usa | 2020-03-31 07:22:10 +0900 (Tue, 31 Mar 2020) | 6 lines

merge revision(s) 36e9ed7fef6eb2d14becf6c52452e4ab16e4bf01: [Backport #16698]

	backport 80b5a0ff2a7709367178f29d4ebe1c54122b1c27 partially as a
	 securify fix for CVE-2020-10663. The patch was provided by Jeremy Evans.

	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67856 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
------------------------------------------------------------------------
r67868 | usa | 2020-03-31 07:11:15 +0900 (Tue, 31 Mar 2020) | 7 lines

merge revision(s) 6e6844320de989cb88a154e2ac75066ccea1bba2: [Backport #16619]

	Fixed duplicated warning

	As `command_rhs` is always a "value expression", `command_asgn`
	does not need the same check.

------------------------------------------------------------------------
r67867 | usa | 2020-03-31 07:05:30 +0900 (Tue, 31 Mar 2020) | 7 lines

merge revision(s) 6a2d779027818eda418c9118f700b36816e833a5: [Backport #16681]

	Switch to download libffi source package to github releases from
	 sourceware.org

	[Bug #16681]
	(cherry picked from commit 86022167461dc90b70164e2bb23316959bbfd6ba)
------------------------------------------------------------------------
r67866 | usa | 2020-03-31 06:51:46 +0900 (Tue, 31 Mar 2020) | 10 lines

merge revision(s) 77596fb7a91cc119b25ac9e19b3c8682709765b4: [Backport #16138]

	Do not turn on keyword_init for Struct subclass if keyword hash is
	 empty

	This was accidentally turned on because there was no checking for
	Qundef.

	Also, since only a single keyword is currently supported, simplify
	the rb_get_kwargs call.
------------------------------------------------------------------------
r67865 | usa | 2020-03-31 06:49:42 +0900 (Tue, 31 Mar 2020) | 8 lines

merge revision(s) 4f19666e8b144600e959e4673f79d63f98bd637d: [Backport #16508]

	`Regexp` in `MatchData` can be `nil`

	`String#sub` with a string pattern defers creating a `Regexp`
	until `MatchData#regexp` creates a `Regexp` from the matched
	string.  `Regexp#last_match(group_name)` accessed its content
	without creating the `Regexp` though.  [Bug #16508]
------------------------------------------------------------------------
r67864 | usa | 2020-03-31 06:46:27 +0900 (Tue, 31 Mar 2020) | 28 lines

merge revision(s) d6a2bce64a7fa1099e507e1d36b5f1533f42f60f,c687be4bc01c9ce52ea990945d9304d6fe59fe9b: [Backport #16159]

	time.c (find_time_t): fix round-to-zero bug

	`find_time_t` did not work correctly for year older than the Epoch
	because it used C's integer division (which rounds negative to zero).

	For example, `TIme.new(1933)` returned a wrong time whose year is 1922
	in Asia/Kuala_Lumpur because there is no 00:00:00 1st Jan. 1933 in the
	time zone.

	```
	$ TZ=Asia/Kuala_Lumpur ruby -e 'p Time.new(1933)'
	1932-12-31 00:00:00 +0700
	```

	This change fixes the issue by using `DIV` macro instead of `/`.
	Now `Time.new(1933)` returns a time in 1933.

	```
	$ TZ=Asia/Kuala_Lumpur ruby -e 'p Time.new(1933)'
	1933-01-01 00:20:00 +0720
	```

	[Bug #16159]

	Added a test for [Bug #16159]

------------------------------------------------------------------------
r67863 | usa | 2020-03-31 06:37:50 +0900 (Tue, 31 Mar 2020) | 21 lines

merge revision(s) 203b7fa1ae8cc40d41c38d684f70b3fea7fae813,0131fab749fb76800de09e49a6abf910201c5b58,9c0cd5c569ba22bc68d1a77ad6580a275cd99639,c144d7215b3444fa36d28d540b60170a5b30743d: [Backport #16196]

	Guard static variable first

	* ext/openssl/ossl_asn1.c (Init_ossl_asn1): register the static
	  variable to grab an internal object, before creating the object.
	  otherwise the just-created object could get collected during the
	  global variable list allocation.  [Bug #16196]

	Slimed down test runtime by stressing openssl.so only [Bug #16196]


	Prefer rb_gc_register_mark_object

	* ext/openssl/ossl_asn1.c (Init_ossl_asn1): prefer
	  `rb_gc_register_mark_object`, which is better for constant
	  objects, over `rb_gc_register_address` for global/static
	  variables which can be re-assigned at runtime.  [Bug #16196]

	Skip very time consuming test [Bug #16196]

------------------------------------------------------------------------
r67862 | usa | 2020-03-31 06:26:06 +0900 (Tue, 31 Mar 2020) | 4 lines

merge revision(s) 463092b84da7933f307cc8747f948f68ef19f5fd: [Backport #16279]

	Update rake-12.3.3.

------------------------------------------------------------------------
r67861 | usa | 2020-03-31 06:21:53 +0900 (Tue, 31 Mar 2020) | 14 lines

merge revision(s) c9423b016cfeab852bc5a829e55e0a11f80b3ab7,0b1e26398e018116180bf41cb63887f77d5d1b82,78ee2c245331e353e218b8fac9ca722a2bcd8fea: [Backport #15968]

	marshal.c: check instance variable count

	* marshal.c (w_obj_each): ensure that no instance variable was
	  added while dumping other instance variables.  [Bug #15968]

	Hoisted out w_ivar_each


	marshal.c: check instance variable count

	* marshal.c (w_ivar_each): ensure that no instance variable was
	  removed while dumping other instance variables.  [Bug #15968]
------------------------------------------------------------------------
r67860 | usa | 2020-03-31 06:11:41 +0900 (Tue, 31 Mar 2020) | 13 lines

merge revision(s) 78ef2d0f331c3e056ee367214710b41722de2fe0: [Backport #15935]

	merge revision(s) 8b3774be3dd9f472bddd99e84e3c9fe2ff99d7ac: [Backport
	 #15935]

		Fix memory leak

		* string.c (str_make_independent_expand): free independent buffer.
		  [Bug# 15935]

		Co-Authored-By: luke-gru (Luke Gruber) <luke.gru@gmail.com>

	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67805 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
------------------------------------------------------------------------
r67829 | usa | 2019-12-04 15:52:01 +0900 (Wed, 04 Dec 2019) | 7 lines

merge revision(s) 2a477e0e444de6344048101466fb9189b9defddc: [Backport #16353]

	test_ftp.rb: loosen timeout for Travis osx

	https://travis-ci.org/ruby/ruby/jobs/454798071

	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65723 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
------------------------------------------------------------------------
r67827 | usa | 2019-11-08 17:29:32 +0900 (Fri, 08 Nov 2019) | 14 lines

merge revision(s) 6333020fc924d3ae63775c032bbe8f57364cd42e:

	atime may not updated unless strictatime is set on macOS Catalina

	Cited from mount(8):

	```
	strictatime
	        Always update the file access time when reading from a
	        file. Without this option the filesystem may default to a
	        less strict update mode, where some access time updates
	        are skipped for performance reasons. This option could be
	        ignored if it is not supported by the filesystem.
	```
------------------------------------------------------------------------
r67826 | usa | 2019-10-03 11:27:34 +0900 (Thu, 03 Oct 2019) | 2 lines

Bump version

------------------------------------------------------------------------
r67815 | usa | 2019-10-01 20:02:16 +0900 (Tue, 01 Oct 2019) | 2 lines

Forgotten to update :)

------------------------------------------------------------------------
r67814 | usa | 2019-10-01 20:01:53 +0900 (Tue, 01 Oct 2019) | 6 lines

lib/shell/command-processor.rb (Shell#[]): prevent unknown command

`FileTest.send(command, ...)` allows to call not only FileTest-related
methods but also any method that belongs to Kernel, Object, etc.
patched by <mame@ruby-lang.org>

------------------------------------------------------------------------
r67813 | usa | 2019-10-01 20:01:05 +0900 (Tue, 01 Oct 2019) | 10 lines

merge revision(s) 3ce238b5f9795581eb84114dcfbdf4aa086bfecc

WEBrick: prevent response splitting and header injection

This is a follow up to d9d4a28.
The commit prevented CRLR, but did not address an isolated CR or an
isolated LF.

Co-Authored-By: NARUSE, Yui <naruse@airemix.jp>

------------------------------------------------------------------------
r67811 | usa | 2019-10-01 19:59:42 +0900 (Tue, 01 Oct 2019) | 7 lines

merge revision(s) 36e057e26ef2104bc2349799d6c52d22bb1c7d03

Loop with String#scan without creating substrings

Create the substrings necessary parts only, instead of cutting the
rest of the buffer.  Also removed a useless, probable typo, regexp.

------------------------------------------------------------------------
r67809 | usa | 2019-10-01 19:58:14 +0900 (Tue, 01 Oct 2019) | 7 lines

merge revision(s) a0a2640b398cffd351f87d3f6243103add66575b

Fix for wrong fnmatch patttern

* dir.c (file_s_fnmatch): ensure that pattern does not contain a
  NUL character.  https://hackerone.com/reports/449617

------------------------------------------------------------------------
r67800 | usa | 2019-09-02 05:10:27 +0900 (Mon, 02 Sep 2019) | 2 lines

Bump version to 2.5.7

------------------------------------------------------------------------
r67793 | usa | 2019-08-28 15:43:56 +0900 (Wed, 28 Aug 2019) | 3 lines

merger revision(s): f308ab2131ee675000926540cbb8c13c91dc3be5
	Remove jquery.js

------------------------------------------------------------------------
r67790 | usa | 2019-08-28 13:57:58 +0900 (Wed, 28 Aug 2019) | 4 lines

merge revision(s) 989e8ad322afdfa3aa06e74b89fc42aef42895d0:

	Remove debug print [ci skip]

------------------------------------------------------------------------
r67786 | usa | 2019-08-28 00:10:35 +0900 (Wed, 28 Aug 2019) | 2 lines

Bump version to 2.5.7

------------------------------------------------------------------------
r67779 | usa | 2019-08-27 21:53:55 +0900 (Tue, 27 Aug 2019) | 2 lines

Update rdoc version from 6.0.1 to 6.0.1.1.

------------------------------------------------------------------------
r67778 | usa | 2019-08-27 18:04:54 +0900 (Tue, 27 Aug 2019) | 2 lines

Skip test_gc_stress_at_startup because it causes SEGV on some platforms

------------------------------------------------------------------------
r67777 | usa | 2019-08-27 14:28:30 +0900 (Tue, 27 Aug 2019) | 5 lines

merge revision(s) 1613917ae64: [Backport #15784]

	Defer setting gc_stress instead of setting dont_gc

	[Bug #15784]
------------------------------------------------------------------------
r67776 | usa | 2019-08-27 14:02:29 +0900 (Tue, 27 Aug 2019) | 3 lines

Revert a part of r67767
it was not necessary for ruby_2_5.

------------------------------------------------------------------------
r67775 | usa | 2019-08-27 12:08:53 +0900 (Tue, 27 Aug 2019) | 5 lines

merge revision(s) f1a52d96a59c63d46cb23af60cdcaf38e30e0512 [Backport #15784]
Defer setting gc_stress until inits done

[Bug #15784]

------------------------------------------------------------------------
r67774 | usa | 2019-08-27 02:03:41 +0900 (Tue, 27 Aug 2019) | 11 lines

merge revision(s) f91879a7b548284c93743168acfd11e3d2aeefac,9557069299ac3b96691040a541afa65761a724ad: [Backport #15992]

	handle_interrupt to defend monitor state [Bug #15992]

	If an exception is raised from another thread for example Timeout
	and this thread is just after `mon_exit`'s `@mon_owner = nil`,
	the exception breaks the state of MonitorMixin. To prevent that situation,
	it need to block interruption in mon_enter and mon_exit.

	Avoid creating Hash objects per each mon_synchronize call (#2393)

------------------------------------------------------------------------
r67773 | usa | 2019-08-27 01:49:07 +0900 (Tue, 27 Aug 2019) | 7 lines

merge revision(s) d5c33364e3c0efb15e11df417c925afee2cdb9c9: [Backport #16105]
	Fixed heap-use-after-free
	
	* string.c (rb_str_sub_bang): retrieves a pointer to the
	  replacement string buffer just before using it, for the case of
	  replacement with the receiver string itself.  [Bug #16105]

------------------------------------------------------------------------
r67772 | usa | 2019-08-27 01:44:03 +0900 (Tue, 27 Aug 2019) | 6 lines

merge revision(s) 5b1bf8dd2d08ae7371ecf025967376bb794ed651: [Backport #16099]
	UTF LE is fixed at least the first 2 bytes
	
	* io.c (io_strip_bom): if the first 2 bytes are 0xFF0xFE, it
	  should be a little-endian UTF, 16 or 32.  [Bug #16099]

------------------------------------------------------------------------
r67771 | usa | 2019-08-27 01:20:36 +0900 (Tue, 27 Aug 2019) | 13 lines

merge revision(s) ec8e5f5aa64e2a54cf1e303f2b012c98e8d521ba,5a187e26adc8aa32367f294c1496935c7356d386: [Backport #15952]

	array.c: always check frozenness in Array#unshift. Fixes [Bug #15952]

	Closes: https://github.com/ruby/ruby/pull/2251

	array.c add back shared array optimization to
	 ary_ensure_room_for_unshift

	Bug fix in commit ec8e5f5aa64e2a [Bug #15952] disabled an
	optimization in this function.

	Closes: https://github.com/ruby/ruby/pull/2252
------------------------------------------------------------------------
r67770 | usa | 2019-08-27 01:17:49 +0900 (Tue, 27 Aug 2019) | 6 lines

merge revision(s) 8f51da5d41f0642d5a971e4223d1ba14643c6398: [Backport #15946]

	Get rid of undefined behavior

	* string.c (rb_str_sub_bang): str and repl can be same.
	  [Bug #15946]
------------------------------------------------------------------------
r67769 | usa | 2019-08-27 01:16:39 +0900 (Tue, 27 Aug 2019) | 11 lines

merge revision(s) 28678997e40869f5591eae60edd9757334426ffb,8797f48373dcfa3ff8e748667732dea8aea4347e: [Backport #15937]
	Preserve the string content at self-copying
	
	* string.c (rb_str_init): preserve the embedded content when
	  self-copying with a capacity.  [Bug #15937]
	
	New buffer for shared string
	
	* string.c (rb_str_init): allocate new buffer if the string is
	  shared.  [Bug #15937]

------------------------------------------------------------------------
r67768 | usa | 2019-08-27 01:12:14 +0900 (Tue, 27 Aug 2019) | 21 lines

merge revision(s) ae2a904ce9bffedee7d110dc60fd51c0a2879a5b,165ddfda20f6db8a3149d14c4f431fc242ddab70,fa7a768fdfe5223a29db4fa71b3e6101fb02ad51: [Backport #16051]

	Update the certificate files to make the test pass on Debian 10

	The old certificate files (for example, test/rubygems/ca_cert.pem) were
	signed by SHA1.  This message digest is considered too weak and rejected
	by OpenSSL 1.1.1 or later.  Because of this, the test suite does not
	pass on Debian 10.

	https://rubyci.org/logs/rubyci.s3.amazonaws.com/debian/ruby-master/log/20190527T123003Z.fail.html.gz#test%2Frubygems

	This change regenerates the files.
	A shell script for the regeneration (util/create_certs.sh) is also
	added.

	* remove trailing spaces.


	Removed inconsistency file from upstream repository of rubygems.

	  followed up ae2a904ce9bffedee7d110dc60fd51c0a2879a5b
------------------------------------------------------------------------
r67767 | usa | 2019-08-27 01:09:14 +0900 (Tue, 27 Aug 2019) | 25 lines

merge revision(s) 9dec4e8fc3a6018261834b5ac9b9877f787b97ca: [Backport #15934]
	String#b: Don't depend on dependent string
	
	Registering a string that depend on a dependent string as fstring
	can lead to use-after-free. See c06ddfe and 3f95620 for details.
	
	The following script triggers use-after-free on trunk, 2.4.6, 2.5.5
	and 2.6.3. Credits to @wanabe for using eval as a cross-version way
	of registering a fstring.
	
	```ruby
	a = ('j' * 24).b.b
	eval('', binding, a)
	
	p a
	4.times { GC.start }
	p a
	```

	- string.c (str_replace_shared_without_enc): when given a
	  dependent string, depend on the root of the dependent
	  string.
	
	[Bug #15934]

------------------------------------------------------------------------
r67766 | usa | 2019-08-27 00:58:57 +0900 (Tue, 27 Aug 2019) | 80 lines

merge revision(s) 3f9562015e651735bfc2fdd14e8f6963b673e22a,c06ddfee878524168e4af07443217ed2f8d0954b,3b3b4a44e5: [Backport #15792]

	Get rid of indirect sharing

	* string.c (str_duplicate): share the root shared string if the
	  original string is already sharing, so that all shared strings
	  refer the root shared string directly.  indirect sharing can
	  cause a dangling pointer.

	[Bug #15792]

	str_duplicate: Don't share with a frozen shared string

	This is a follow up for 3f9562015e651735bfc2fdd14e8f6963b673e22a.
	Before this commit, it was possible to create a shared string which
	shares with another shared string by passing a frozen shared string
	to `str_duplicate`.

	Such string looks like:

	```
	 --------                    -----------------
	 | root | ------ owns -----> | root's buffer |
	 --------                    -----------------
	     ^                             ^   ^
	 -----------                       |   |
	 | shared1 | ------ references -----   |
	 -----------                           |
	     ^                                 |
	 -----------                           |
	 | shared2 | ------ references ---------
	 -----------
	```

	This is bad news because `rb_fstring(shared2)` can make `shared1`
	independent, which severs the reference from `shared1` to `root`:

	```c
	/* from fstr_update_callback() */
	str = str_new_frozen(rb_cString, shared2);  /* can return shared1 */
	if (STR_SHARED_P(str)) { /* shared1 is also a shared string */
	    str_make_independent(str);  /* no frozen check */
	}
	```

	If `shared1` was the only reference to `root`, then `root` can be
	reclaimed by the GC, leaving `shared2` in a corrupted state:

	```
	 -----------                         --------------------
	 | shared1 | -------- owns --------> | shared1's buffer |
	 -----------                         --------------------
	      ^
	      |
	 -----------                         -------------------------
	 | shared2 | ------ references ----> | root's buffer (freed) |
	 -----------                         -------------------------
	```

	Here is a reproduction script for the situation this commit fixes.

	```ruby
	a = ('a' * 24).strip.freeze.strip
	-a
	p a
	4.times { GC.start }
	p a
	```

	 - string.c (str_duplicate): always share with the root string when
	   the original is a shared string.
	 - test_rb_str_dup.rb: specifically test `rb_str_dup` to make
	   sure it does not try to share with a shared string.

	[Bug #15792]

	Closes: https://github.com/ruby/ruby/pull/2159

	Update dependencies

------------------------------------------------------------------------
r67765 | usa | 2019-08-27 00:40:44 +0900 (Tue, 27 Aug 2019) | 5 lines

merge revision(s) 5e018214e7435030727a97ac49db038d96438e74: [Backport #15720]

	Fix SystemStackError when calling a method in an unused refinement

	Fixes [Bug #15720]
------------------------------------------------------------------------
r67764 | usa | 2019-08-27 00:39:06 +0900 (Tue, 27 Aug 2019) | 5 lines

merge revision(s) c1d78a7f0ece2004822193a0c1f1fd3dc38c2fdf: [Backport #15360]

	do_mutex_lock: release mutex before checking for interrupts (fixes
	 issue 15360)

------------------------------------------------------------------------
r67763 | usa | 2019-08-27 00:36:38 +0900 (Tue, 27 Aug 2019) | 12 lines

merge revision(s) 6375c68f8851e1e0fee8a95afba91c4555097127,c05eaa93258ddc01e685b6cc3a0da82998a2af48: [Backport #15839]
	parse.y: function parser_mixed_error & parser_mixed_escape
	
	Fix mixed encoding in heredoc
	
	Heredocs are parsed line-by-line, so we need to keep track of the
	temporary encoding of the string.  Previously, a heredoc would
	only detect mixed encoding errors if they were on the same line,
	this changes things so they will be caught on different lines.
	
	Fixes [Bug #15839]

------------------------------------------------------------------------
r67762 | usa | 2019-08-27 00:13:49 +0900 (Tue, 27 Aug 2019) | 7 lines

merge revision(s) 5bab1304af25a843728dbcd2f3594913740aecb0: [Backport #15847]

	fix visibility of SecureRandom.gen_random

	Aliasing a method preserves its visibility.  These aliases turn
	formerly-public methods into private.  Should make them public
	again.  [Bug #15847]
------------------------------------------------------------------------
r67761 | usa | 2019-08-27 00:10:32 +0900 (Tue, 27 Aug 2019) | 9 lines

merge revision(s) ea42423908ed055f9039b1dce6e9a232a3b2dd90: [Backport #15887]
	Keep vm->orig_progname alive
	
	`vm->orig_progname` can be different from `vm->progname` when user
	code assigns to `$0`. While `vm->progname` is kept alive by the
	global table, nothing marked `vm->orig_progname`.
	
	[Bug #15887]

------------------------------------------------------------------------
r67760 | svn | 2019-08-27 00:02:19 +0900 (Tue, 27 Aug 2019) | 1 line

* 2019-08-27
------------------------------------------------------------------------
r67759 | usa | 2019-08-27 00:02:19 +0900 (Tue, 27 Aug 2019) | 6 lines

merge revision(s) ac00bdc8a8ac2c62a94dd36a7784d15bbcb7df19: [Backport #15821]

	Do not modify shared array
	
	[Bug #15821]

------------------------------------------------------------------------
r67758 | usa | 2019-08-26 23:54:04 +0900 (Mon, 26 Aug 2019) | 13 lines

merge revision(s) d0ba4abf1a00339ebbb5d405db3240a8bdb7b68b,54eac83b2ad77ddea84fa6d66c09e0bb014cf61e: [Backport #15786]

	Add RB_ID_SERIAL_MAX
	
	
	Hide internal IDs
	
	* parse.y (internal_id): number the ID serial for internal use by
	  counting down from the neary maximum value, not to accidentally
	  match permanent IDs.
	
	[Bug #15768]

------------------------------------------------------------------------
r67757 | usa | 2019-08-26 23:45:41 +0900 (Mon, 26 Aug 2019) | 5 lines

merge revision(s) a6a26e42b15c46f117f4fce07a2050e9d727355d: [Backport #15906]

	compile.c: Partially revert r63870 which caused wrong optimization
	[Bug #15906]

------------------------------------------------------------------------
r67756 | usa | 2019-08-26 23:39:01 +0900 (Mon, 26 Aug 2019) | 5 lines

merge revision(s) b72623012d74abdb06210153ed48c9e2fa075bbd: [Backport #15775]

	Update broken URL in Float documentation.

	  [Misc #15775][ruby-core:92332]
------------------------------------------------------------------------
r67755 | usa | 2019-08-26 23:37:29 +0900 (Mon, 26 Aug 2019) | 18 lines

merge revision(s) a15f7dd1fb1148c3d586238ee6907875f2e40379: [Backport #15803]

	Always mark the string returned by File.realpath as tainted

	This string can include elements that were not in either string
	passed to File.realpath, even if one of the strings is an
	absolute path, due to symlinks:

	```ruby
	Dir.mkdir('b') unless File.directory?('b')
	File.write('b/a', '') unless File.file?('b/a')
	File.symlink('b', 'c') unless File.symlink?('c')
	path = File.realpath('c/a'.untaint, Dir.pwd.untaint)
	path # "/home/testr/ruby/b/a"
	path.tainted? # should be true, as 'b' comes from file system
	```

	[Bug #15803]
------------------------------------------------------------------------
r67754 | usa | 2019-08-26 23:18:58 +0900 (Mon, 26 Aug 2019) | 8 lines

merge revision(s) d118c84b0b9110462e479487ffaf175a75e5718e: [Backport #15199]

	Fix IO#scanf on pipes on Windows

	IO.seek on a pipe on Windows raises Errno::EINVAL instead of
	Errno::ESPIPE.

	Fixes Ruby Bug #15199
------------------------------------------------------------------------
r67753 | usa | 2019-08-26 23:15:13 +0900 (Mon, 26 Aug 2019) | 3 lines

merge revision(s) 5e23b1138f16af0defb184d7deeffadfd2ce3c04 [backport #15820]
	Fix potential memory leak

------------------------------------------------------------------------
r67752 | usa | 2019-08-26 23:06:52 +0900 (Mon, 26 Aug 2019) | 9 lines

merge revision(s) 179045acaf5de8398c321ada86a76f1afb77a796: [Backport #14539]

	regparse.c: Suppress duplicated range warning by mere \X

	* regparse.c (node_extended_grapheme_cluster): as Unicode 10 has
	  added Grapheme_Cluster_Break properties to some characters,
	  remove duplicated ranges for Unicode 9.

	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
------------------------------------------------------------------------
r67751 | usa | 2019-08-26 22:49:50 +0900 (Mon, 26 Aug 2019) | 4 lines

merge revision(s) af1e487e9bb763b939dc6704c9a343c9eafa1637: [Backport #15801]

	Updated marked commits for ChangeLog

------------------------------------------------------------------------
r67748 | usa | 2019-08-19 15:35:25 +0900 (Mon, 19 Aug 2019) | 124 lines

merge revision(s) f4fe2a76b0564e8e572936dec3bd724ac22b7a44: [Backport #15793]

	merge revision(s) 7b7043e5da8589e01b94575d4ed647e909e5c875: [Backport
	 #15793]

		eliminate use of freed memory

		rb_io_fptr_finalize_internal frees the memory region.

		=================================================================
		==85264==ERROR: AddressSanitizer: heap-use-after-free on address 0x610000000d8c at pc 0x5608e38077f7 bp 0x7ffee12d5440 sp 0x7ffee12d5438
		READ of size 4 at 0x610000000d8c thread T0
		    #0 0x5608e38077f6 in rb_io_memsize io.c:4749:24
		    #1 0x5608e37a0481 in obj_memsize_of gc.c:3547:14
		    #2 0x5608e37a4f30 in check_rvalue_consistency gc.c:1107:2
		    #3 0x5608e37a2624 in RVALUE_OLD_P gc.c:1218:5
		    #4 0x5608e37a5bae in rb_gc_force_recycle gc.c:6652:18
		    #5 0x5608e38191f9 in rb_f_backquote io.c:9021:5
		    #6 0x5608e3d8aa14 in call_cfunc_1 vm_insnhelper.c:2058:12
		    #7 0x5608e3d6e23d in vm_call_cfunc_with_frame vm_insnhelper.c:2211:11
		    #8 0x5608e3d54a35 in vm_call_cfunc vm_insnhelper.c:2229:12
		    #9 0x5608e3d5253b in vm_call_method_each_type vm_insnhelper.c:2564:9
		    #10 0x5608e3d51f50 in vm_call_method vm_insnhelper.c:2701:13
		    #11 0x5608e3cf2de4 in vm_call_general vm_insnhelper.c:2734:12
		    #12 0x5608e3d79918 in vm_sendish vm_insnhelper.c:3627:11
		    #13 0x5608e3d06cf5 in vm_exec_core insns.def:789:11
		    #14 0x5608e3d43700 in rb_vm_exec vm.c:1892:22
		    #15 0x5608e3d47cbf in rb_iseq_eval_main vm.c:2151:11
		    #16 0x5608e37620ca in ruby_exec_internal eval.c:262:2
		    #17 0x5608e376198b in ruby_exec_node eval.c:326:12
		    #18 0x5608e37617d0 in ruby_run_node eval.c:318:25
		    #19 0x5608e35c9486 in main main.c:42:9
		    #20 0x7f62e9421b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
		    #21 0x5608e3522289 in _start (miniruby+0x15f289)

		0x610000000d8c is located 76 bytes inside of 192-byte region [0x610000000d40,0x610000000e00)
		freed by thread T0 here:
		    #0 0x5608e359a2ed in free (miniruby+0x1d72ed)
		    #1 0x5608e37af421 in objspace_xfree gc.c:9591:5
		    #2 0x5608e37af3da in ruby_sized_xfree gc.c:9687:2
		    #3 0x5608e3799ac8 in ruby_xfree gc.c:9694:5
		    #4 0x5608e380746d in rb_io_fptr_finalize_internal io.c:4728:5
		    #5 0x5608e38191ed in rb_f_backquote io.c:9020:5
		    #6 0x5608e3d8aa14 in call_cfunc_1 vm_insnhelper.c:2058:12
		    #7 0x5608e3d6e23d in vm_call_cfunc_with_frame vm_insnhelper.c:2211:11
		    #8 0x5608e3d54a35 in vm_call_cfunc vm_insnhelper.c:2229:12
		    #9 0x5608e3d5253b in vm_call_method_each_type vm_insnhelper.c:2564:9
		    #10 0x5608e3d51f50 in vm_call_method vm_insnhelper.c:2701:13
		    #11 0x5608e3cf2de4 in vm_call_general vm_insnhelper.c:2734:12
		    #12 0x5608e3d79918 in vm_sendish vm_insnhelper.c:3627:11
		    #13 0x5608e3d06cf5 in vm_exec_core insns.def:789:11
		    #14 0x5608e3d43700 in rb_vm_exec vm.c:1892:22
		    #15 0x5608e3d47cbf in rb_iseq_eval_main vm.c:2151:11
		    #16 0x5608e37620ca in ruby_exec_internal eval.c:262:2
		    #17 0x5608e376198b in ruby_exec_node eval.c:326:12
		    #18 0x5608e37617d0 in ruby_run_node eval.c:318:25
		    #19 0x5608e35c9486 in main main.c:42:9
		    #20 0x7f62e9421b96 in __libc_start_main
		/build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310

		previously allocated by thread T0 here:
		    #0 0x5608e359a56d in malloc (miniruby+0x1d756d)
		    #1 0x5608e37aed12 in objspace_xmalloc0 gc.c:9416:5
		    #2 0x5608e37aebe7 in ruby_xmalloc0 gc.c:9600:12
		    #3 0x5608e37aea8b in ruby_xmalloc_body gc.c:9609:12
		    #4 0x5608e37a6d64 in ruby_xmalloc gc.c:11469:12
		    #5 0x5608e380e4b4 in rb_io_fptr_new io.c:8040:19
		    #6 0x5608e380e446 in rb_io_make_open_file io.c:8077:10
		    #7 0x5608e3850ea0 in pipe_open io.c:6707:5
		    #8 0x5608e384edb4 in pipe_open_s io.c:6772:12
		    #9 0x5608e381910b in rb_f_backquote io.c:9014:12
		    #10 0x5608e3d8aa14 in call_cfunc_1 vm_insnhelper.c:2058:12
		    #11 0x5608e3d6e23d in vm_call_cfunc_with_frame vm_insnhelper.c:2211:11
		    #12 0x5608e3d54a35 in vm_call_cfunc vm_insnhelper.c:2229:12
		    #13 0x5608e3d5253b in vm_call_method_each_type vm_insnhelper.c:2564:9
		    #14 0x5608e3d51f50 in vm_call_method vm_insnhelper.c:2701:13
		    #15 0x5608e3cf2de4 in vm_call_general vm_insnhelper.c:2734:12
		    #16 0x5608e3d79918 in vm_sendish vm_insnhelper.c:3627:11
		    #17 0x5608e3d06cf5 in vm_exec_core insns.def:789:11
		    #18 0x5608e3d43700 in rb_vm_exec vm.c:1892:22
		    #19 0x5608e3d47cbf in rb_iseq_eval_main vm.c:2151:11
		    #20 0x5608e37620ca in ruby_exec_internal eval.c:262:2
		    #21 0x5608e376198b in ruby_exec_node eval.c:326:12
		    #22 0x5608e37617d0 in ruby_run_node eval.c:318:25
		    #23 0x5608e35c9486 in main main.c:42:9
		    #24 0x7f62e9421b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310

		SUMMARY: AddressSanitizer: heap-use-after-free io.c:4749:24 in
		rb_io_memsize
		Shadow bytes around the buggy address:
		  0x0c207fff8160: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
		  0x0c207fff8170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
		  0x0c207fff8180: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
		  0x0c207fff8190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
		  0x0c207fff81a0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
		=>0x0c207fff81b0: fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd fd
		  0x0c207fff81c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
		  0x0c207fff81d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
		  0x0c207fff81e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
		  0x0c207fff81f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
		  0x0c207fff8200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
		Shadow byte legend (one shadow byte represents 8 application bytes):
		  Addressable:           00
		  Partially addressable: 01 02 03 04 05 06 07
		  Heap left redzone:       fa
		  Freed heap region:       fd
		  Stack left redzone:      f1
		  Stack mid redzone:       f2
		  Stack right redzone:     f3
		  Stack after return:      f5
		  Stack use after scope:   f8
		  Global redzone:          f9
		  Global init order:       f6
		  Poisoned by user:        f7
		  Container overflow:      fc
		  Array cookie:            ac
		  Intra object redzone:    bb
		  ASan internal:           fe
		  Left alloca redzone:     ca
		  Right alloca redzone:    cb
		  Shadow gap:              cc
		==85264==ABORTING

	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67710 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
------------------------------------------------------------------------
r67722 | usa | 2019-07-31 23:58:36 +0900 (Wed, 31 Jul 2019) | 5 lines

merge revision(s) 374c8f4ebab1a740990330c732b9de965c5e8d10: [Backport #15823]
Fixed about ARGF.lineno

[Bug #15823]

------------------------------------------------------------------------
r67717 | usa | 2019-07-31 23:02:50 +0900 (Wed, 31 Jul 2019) | 9 lines

merge revision(s) 67563: [Backport #15769]

	Support SNI (Reapplying r67488)

	This fixes connecting using TLS 1.3 to imap.gmail.com

	[Fix GH-2077] [Feature #15594]

	From: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
------------------------------------------------------------------------
r67709 | usa | 2019-05-30 18:14:41 +0900 (Thu, 30 May 2019) | 3 lines

merge revision(s) dcb6a6ae3e2b8a3e298e7f0d4a3e7f8ff102a30e:[Backport #15845]
	Windows simply causes an error to open invalid path

------------------------------------------------------------------------
r67708 | usa | 2019-05-03 06:16:27 +0900 (Fri, 03 May 2019) | 3 lines

merge revision(s) 66324: [Backport #15385]

	Modify insn list only when compiling
------------------------------------------------------------------------
r67707 | usa | 2019-04-30 22:20:09 +0900 (Tue, 30 Apr 2019) | 3 lines

merge revision(s) 67270: [Backport #15670]

	dsym should be treated as string [ruby-core:91852] [Bug #15670]
------------------------------------------------------------------------
r67706 | usa | 2019-04-30 22:04:57 +0900 (Tue, 30 Apr 2019) | 6 lines

merge revision(s) 67467: [Backport #15756]

	range.c: force hash values fixable

	* range.c (method_hash): force hash values fixable on LLP64
	  environment.  [ruby-core:92191] [Bug #15756]
------------------------------------------------------------------------
r67705 | usa | 2019-04-30 22:02:42 +0900 (Tue, 30 Apr 2019) | 6 lines

merge revision(s) 67468: [Backport #15757]

	range.c: force hash values fixable

	* range.c (range_hash): force hash values fixable on LLP64
	  environment.  [ruby-core:92194] [Bug #15757]
------------------------------------------------------------------------
r67704 | usa | 2019-04-30 22:00:04 +0900 (Tue, 30 Apr 2019) | 3 lines

merge revision(s) 67247: [Backport #15666]

	Guard out the test when it is run under root permission
------------------------------------------------------------------------
r67703 | usa | 2019-04-30 21:55:24 +0900 (Tue, 30 Apr 2019) | 7 lines

merge revision(s) 64057: [Backport #14952]

	Remove obsolete comment from Module#define_method documentation

	Since 2.5, Module#define_method is public. (feature #14133)

	Co-Authored-By: Miguel Landaeta <miguel@miguel.cc>
------------------------------------------------------------------------
r67702 | usa | 2019-04-30 21:40:20 +0900 (Tue, 30 Apr 2019) | 11 lines

merge revision(s) 66326,66649: [Backport #15385]

Fix infinite loop by ensure

* compile.c (iseq_insert_nop_between_end_and_cont): insert nop so that the end of rescue and continuing points are not same, to get rid of infinite loop. [Bug #15385]

test_optimization.rb: increase timeout for RubyCI

https://rubyci.org/logs/rubyci.s3.amazonaws.com/opensuseleap/ruby-trunk/log/20181230T040002Z.fail.html.gz


------------------------------------------------------------------------
r67268 | nagachika | 2019-03-15 20:32:41 +0900 (Fri, 15 Mar 2019) | 1 line

bump up teeny version to 2.5.6
------------------------------------------------------------------------
r67263 | nagachika | 2019-03-15 07:51:25 +0900 (Fri, 15 Mar 2019) | 4 lines

merge revision(s) 67261:

	tool/make-snapshot: Use 6-spaces indent for SIZE and digests
	to align with release note markdown.
------------------------------------------------------------------------
r67259 | nagachika | 2019-03-15 07:21:30 +0900 (Fri, 15 Mar 2019) | 8 lines

merge revision(s) 63309:

	thread_sync.c (condvar_ptr): reset fork_gen after forking

	Otherwise the condition variable waiter list will always
	be empty, which is wrong :x

	[Bug #14725] [Bug #14634]
------------------------------------------------------------------------
r67258 | nagachika | 2019-03-15 07:16:48 +0900 (Fri, 15 Mar 2019) | 1 line

bump up teeny version to 2.5.5
------------------------------------------------------------------------
r67242 | nagachika | 2019-03-13 09:32:12 +0900 (Wed, 13 Mar 2019) | 7 lines

merge revision(s) 67200: [Backport #15648]

	Add ignored_sp event

	* ext/ripper/lib/ripper/lexer.rb (Ripper::Lexer): add ignored_sp
	  event which will be fired from Ripper::Lexer#on_heredoc_dedent
	  method.  [ruby-core:91727] [Bug #15648]
------------------------------------------------------------------------
r67241 | nagachika | 2019-03-13 09:21:46 +0900 (Wed, 13 Mar 2019) | 9 lines

merge revision(s) 66909: [Backport #15555]

	tmpdir.rb: permission of user given directory

	* lib/tmpdir.rb (Dir.mktmpdir): check if the permission of the
	  parent directory only when using the default temporary
	  directory, and no check against user given directory.  the
	  security is the user's responsibility in that case.
	  [ruby-core:91216] [Bug #15555]
------------------------------------------------------------------------
r67240 | nagachika | 2019-03-13 09:06:19 +0900 (Wed, 13 Mar 2019) | 7 lines

merge revision(s) 66779: [Backport #15520]

	configure: refuse to build with jemalloc when header is missing

	[ruby-core:90964] [Bug #15520]

	Freom: Misty De Meo <mistydemeo@github.com>
------------------------------------------------------------------------
r67239 | nagachika | 2019-03-13 08:36:51 +0900 (Wed, 13 Mar 2019) | 7 lines

merge revision(s) 66618: [Backport #15660]

	test_io.rb: increase timeout for RubyCI

	to stabilize AIX powerpc CI

	https://rubyci.org/logs/rubyci.s3.amazonaws.com/aix71_ppc/ruby-trunk/log/20181227T113302Z.fail.html.gz
------------------------------------------------------------------------
r67238 | nagachika | 2019-03-13 08:35:29 +0900 (Wed, 13 Mar 2019) | 8 lines

merge revision(s) 66436: [Backport #15427]

	should use defined_class.

	* vm_insnhelper.c (vm_call_method_each_type): we should use me->defined_class
	  instead of me->owner because me->owner doesn't has correct ancestors list.
	  [Bug #15427]

------------------------------------------------------------------------
r67237 | nagachika | 2019-03-13 08:23:17 +0900 (Wed, 13 Mar 2019) | 26 lines

merge revision(s) 64234,64252: [Backport #15219]

	net/http, net/ftp: fix session resumption with TLS 1.3

	When TLS 1.3 is in use, the session ticket may not have been sent yet
	even though a handshake has finished. Also, the ticket could change if
	multiple session ticket messages are sent by the server. Use
	SSLContext#session_new_cb instead of calling SSLSocket#session
	immediately after a handshake. This way also works with earlier protocol
	versions.

	net/http, net/ftp: skip SSL/TLS session resumption tests

	Due to a bug in OpenSSL 1.1.0h[1] (it's only in this specific version;
	it was introduced just before the release and is already fixed in their
	stable branch), the callback set by SSLContext#session_new_cb= does not
	get called for clients, making net/http and net/ftp not attempt session
	resumption.

	Let's disable the affected test cases for now. Another option would be
	to fallback to using SSLSocket#session as we did before r64234. But
	since only a single version is affected and hopefully a new stable
	version containing the fix will be released in near future, I chose not
	to add such workaround code to lib/.

	[1] https://github.com/openssl/openssl/pull/5967
------------------------------------------------------------------------
r67236 | nagachika | 2019-03-13 07:01:32 +0900 (Wed, 13 Mar 2019) | 13 lines

merge revision(s) 66832: [Backport #15536]

	st.c (rb_hash_bulk_insert_into_st_table): avoid out-of-bounds write

	"hash_bulk_insert" first expands the table, but the target size was
	wrong: it was calculated by "num_entries + (size to buld insert)", but
	it was wrong when "num_entries < entries_bound", i.e., it has a deleted
	entry.  "hash_bulk_insert" adds the given entries from entries_bound,
	which led to out-of-bounds write access.  [Bug #15536]

	As a simple fix, this commit changes the calculation to "entries_bound +
	size".  I'm afraid if this might be inefficient, but I think it is safe
	anyway.
------------------------------------------------------------------------
r67235 | nagachika | 2019-03-13 06:44:56 +0900 (Wed, 13 Mar 2019) | 1 line

Merge RubyGems 2.7.6.2 patch [Bug #15643]
------------------------------------------------------------------------
r67234 | nagachika | 2019-03-13 06:32:03 +0900 (Wed, 13 Mar 2019) | 1 line

Merge RubyGems 2.7.6.1 patch [Bug #15637]
------------------------------------------------------------------------
r67233 | nagachika | 2019-03-13 06:05:56 +0900 (Wed, 13 Mar 2019) | 6 lines

merge revision(s) 67201: [Backport #15650]

	eval.c: clear internal errinfo

	* eval.c (ruby_cleanup): clear internal error info when invoking
	  end procs.  [ruby-core:91731] [Bug #15650]
------------------------------------------------------------------------
r67228 | nagachika | 2019-03-12 21:59:25 +0900 (Tue, 12 Mar 2019) | 8 lines

merge revision(s) 64636,64637: [Backport #15659]

	AIX doesn't set OptionLength for boolean options

	https://rubyci.org/logs/rubyci.s3.amazonaws.com/aix71_ppc/ruby-trunk/log/20180904T103302Z.fail.html.gz
	https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/com.ibm.aix.commtrf2/getsockopt.htm

	fix typo
------------------------------------------------------------------------
r67219 | nagachika | 2019-03-11 21:51:59 +0900 (Mon, 11 Mar 2019) | 7 lines

merge revision(s) 67203: [Backport #15651]

	numeric.c: fix infinite loop

	* numeric.c (int_pow): fix infinite loop in the case of y equal 1
	  and power of x does not overflow.
	  [ruby-core:91734] [Bug #15651]
------------------------------------------------------------------------
r67192 | nagachika | 2019-03-08 00:31:42 +0900 (Fri, 08 Mar 2019) | 7 lines

merge revision(s) 67167: [Backport #15635]

	string.c: respect the actual encoding

	* string.c (rb_enc_str_coderange): respect the actual encoding of
	  if a BOM presents, and scan for the actual code range.
	  [ruby-core:91662] [Bug #15635]
------------------------------------------------------------------------
r67191 | nagachika | 2019-03-08 00:19:34 +0900 (Fri, 08 Mar 2019) | 6 lines

merge revision(s) 67188: [Backport #15642]

	io.c: chomp CR at the end of read buffer

	* io.c (rb_io_getline_fast): chomp CR followed by LF but separated
	  by the read buffer boundary.  [ruby-core:91707] [Bug #15642]
------------------------------------------------------------------------
r67186 | nagachika | 2019-03-06 20:32:02 +0900 (Wed, 06 Mar 2019) | 5 lines

merge revision(s) 67183: [Backport #15607]

	Fix PTY.open on OpenBSD [Bug #15607]

	From: Jeremy Evans <code@jeremyevans.net>
------------------------------------------------------------------------
r67050 | nagachika | 2019-02-11 20:04:41 +0900 (Mon, 11 Feb 2019) | 12 lines

merge revision(s) 62872,62873: [Backport #14621]

	parse.y: unindent continued line

	* parse.y (tokadd_string): stop at continued line in dedented here
	  documents, to dedent for each lines before removing escaped
	  newlines.  [ruby-core:86236] [Bug #14621]

	parse.y: terminator at continued line

	* parse.y (here_document): a continuing line is not the
	  terminator.  [ruby-core:86283] [Bug #14621]
------------------------------------------------------------------------
r67013 | nagachika | 2019-02-05 21:15:47 +0900 (Tue, 05 Feb 2019) | 13 lines

merge revision(s) 66867: [Backport #15500]

	Revert r58345 and r58371.

	  These changes break the behavior of default gems. Bug #13428 says
	  r58345 is reasonable because gemspec file is installed by `to_ruby_for_cache`
	  method. But I revert `to_ruby_for_cache` in rbinstall.rb at r58403.
	  There is no reason that we apply r58345 now.

	  But I'm not sure about gemspec of default gems affects standalone gems.
	  I'm going to investigate it on rubygems/rubygems.

	  [Bug #15500][ruby-core:90867]
------------------------------------------------------------------------
r66912 | nagachika | 2019-01-23 23:14:25 +0900 (Wed, 23 Jan 2019) | 70 lines

merge revision(s) 62934,63210,63215,63309: [Backport #14634]

	thread_sync.c: avoid reaching across stacks of dead threads

	rb_ensure is insufficient cleanup for fork and we must
	reinitialize all waitqueues in the child process.

	Unfortunately this increases the footprint of ConditionVariable,
	Queue and SizedQueue by 8 bytes on 32-bit (16 bytes on 64-bit).

	[ruby-core:86316] [Bug #14634]

	variable.c: fix thread + fork errors in autoload

	This is fairly non-intrusive bugfix to prevent children
	from trying to reach into thread stacks of the parent.
	I will probably reuse this idea and redo r62934, too
	(same bug).

	* vm_core.h (typedef struct rb_vm_struct): add fork_gen counter
	* thread.c (rb_thread_atfork_internal): increment fork_gen
	* variable.c (struct autoload_data_i): store fork_gen
	* variable.c (check_autoload_data): remove (replaced with get_...)
	* variable.c (get_autoload_data): check fork_gen when retrieving
	* variable.c (check_autoload_required): use get_autoload_data
	* variable.c (rb_autoloading_value): ditto
	* variable.c (rb_autoload_p): ditto
	* variable.c (current_autoload_data): ditto
	* variable.c (autoload_reset): reset fork_gen, adjust indent
	* variable.c (rb_autoload_load): set fork_gen when setting state
	* test/ruby/test_autoload.rb (test_autoload_fork): new test
	  [ruby-core:86410] [Bug #14634]

	thread_sync: redo r62934 to use fork_gen

	Instead of maintaining linked-lists to store all
	rb_queue/rb_szqueue/rb_condvar structs; store only a fork_gen
	serial number to simplify management of these items.

	This reduces initialization costs and avoids the up-front cost
	of resetting all Queue/SizedQueue/ConditionVariable objects at
	fork while saving 8 bytes per-structure on 64-bit.  There are no
	savings on 32-bit.

	* thread.c (rb_thread_atfork_internal): remove rb_thread_sync_reset_all call
	* thread_sync.c (rb_thread_sync_reset_all): remove
	* thread_sync.c (queue_live): remove
	* thread_sync.c (queue_free): remove
	* thread_sync.c (struct rb_queue): s/live/fork_gen/
	* thread_sync.c (queue_data_type): use default free
	* thread_sync.c (queue_alloc): remove list_add
	* thread_sync.c (queue_fork_check): new function
	* thread_sync.c (queue_ptr): call queue_fork_check
	* thread_sync.c (szqueue_free): remove
	* thread_sync.c (szqueue_data_type): use default free
	* thread_sync.c (szqueue_alloc): remove list_add
	* thread_sync.c (szqueue_ptr):  check fork_gen via queue_fork_check
	* thread_sync.c (struct rb_condvar): s/live/fork_gen/
	* thread_sync.c (condvar_free): remove
	* thread_sync.c (cv_data_type): use default free
	* thread_sync.c (condvar_ptr): check fork_gen
	* thread_sync.c (condvar_alloc): remove list_add
	  [ruby-core:86316] [Bug #14634]

	thread_sync.c (condvar_ptr): reset fork_gen after forking

	Otherwise the condition variable waiter list will always
	be empty, which is wrong :x

	[Bug #14725] [Bug #14634]
------------------------------------------------------------------------
r66881 | nagachika | 2019-01-20 19:48:26 +0900 (Sun, 20 Jan 2019) | 7 lines

merge revision(s) 64879: [Backport #15162]

	transcode.c: add GC guard on raise

	* transcode.c (econv_s_search_convpath): add GC guard to fix SEGV
	  on raise.
	  [Bug #15162] [ruby-core:89172]
------------------------------------------------------------------------
r66880 | nagachika | 2019-01-20 18:17:59 +0900 (Sun, 20 Jan 2019) | 7 lines

merge revision(s) 63334: [Backport #14729]

	object.c: raise on long invalid float string

	* object.c (rb_cstr_to_dbl_raise): check long invalid float
	  string more precisely when truncating insignificant part.
	  [ruby-core:86800] [Bug #14729]
------------------------------------------------------------------------
r66879 | nagachika | 2019-01-20 14:13:27 +0900 (Sun, 20 Jan 2019) | 7 lines

merge revision(s) 63322: [Backport #14731]

	object.c: fix exponent with underscore

	* object.c (rb_cstr_to_dbl_raise): do not ignore exponent part
	  when the input string longer than internal buffer contains
	  underscore(s).  [ruby-core:86836] [Bug #14731]
------------------------------------------------------------------------
r66878 | nagachika | 2019-01-20 13:51:41 +0900 (Sun, 20 Jan 2019) | 9 lines

merge revision(s) 63720: [Backport #14864]

	dir.c: define O_CLOEXEC for older systems

	SuSE 10 has openat(), but not O_CLOEXEC

	Reported-by: wangpeiwen

	[ruby-core:87591] [Bug #14864]
------------------------------------------------------------------------
r66877 | nagachika | 2019-01-20 13:49:40 +0900 (Sun, 20 Jan 2019) | 6 lines

merge revision(s) 66401: [Backport #15412]

	Move autoload to toplevel

	So that classes which uses Net::HTTP with https can use OpenSSL
	namespace for example exception classes like OpenSSL::SSL::SSLError.
------------------------------------------------------------------------
r66876 | nagachika | 2019-01-20 13:47:51 +0900 (Sun, 20 Jan 2019) | 7 lines

merge revision(s) 66242: [Backport #15387]

	io.c (io_write_nonblock): add RB_GC_GUARD, io_fflush may switch threads

	Since io_fflush may block on mutex or rb_io_wait_readable and
	switch threads, we need to ensure the `str' VALUE returned by
	`rb_obj_as_string` is visible to GC.
------------------------------------------------------------------------
r66839 | nagachika | 2019-01-17 00:32:54 +0900 (Thu, 17 Jan 2019) | 6 lines

merge revision(s) 65974: [Backport #15340]

	Normalize month-mday before finding epoch

	Especially over the year 2038, 30 Feb and so on may cause odd behavior
	on validating found epoch with given year-month-day [Bug #15340]
------------------------------------------------------------------------
r66837 | nagachika | 2019-01-16 21:04:57 +0900 (Wed, 16 Jan 2019) | 15 lines

merge revision(s) 64476: [Backport #15084]

	thread_sync.c (rb_mutex_sleep): disable interrupt checking in ensure

	This is needed to reliably fix ConditionVariable#wait on Thread#kill
	[Bug #14999] because there is still a chance an interrupt could fire
	and prevent lock acquisition after an ensure statement.

	Arguably, rb_mutex_lock itself should be uninterruptible, but that
	already prevents bootstraptest/test_thread.rb from completing and
	probably breaks existing use cases.

	For reference, POSIX expressly forbids EINTR from pthread_mutex_lock.

	[ruby-core:88556] [Bug #14999]
------------------------------------------------------------------------
r66818 | nagachika | 2019-01-14 18:23:45 +0900 (Mon, 14 Jan 2019) | 17 lines

merge revision(s) 64589,64593: [Backport #15041]

	cont.c: set th->root_fiber to current fiber at fork

	Otherwise, th->root_fiber can point to an invalid Fiber,
	because Fibers do not live across fork.  So consider
	whatever Fiber is running the root fiber.

	[ruby-core:88723] [Bug #15041]

	cont.c (rb_fiber_atfork): th->root_fiber may not exist

	Otherwise, bootstraptest/test_fork.rb fails with -DVM_CHECK_MODE=2

	[Bug #15041]

	Fixes: r64589 "cont.c: set th->root_fiber to current fiber at fork"
------------------------------------------------------------------------
r66785 | svn | 2019-01-11 00:02:22 +0900 (Fri, 11 Jan 2019) | 1 line

* 2019-01-11
------------------------------------------------------------------------
r66784 | nagachika | 2019-01-11 00:02:21 +0900 (Fri, 11 Jan 2019) | 10 lines

merge revision(s) 66756: [Backport #15479]

	Mark array as "going to be modified" in `Array#reject!`

	Before this patch, if `reject!` is called on a shared array it can
	mutate the shared array rather than a copy.  This patch marks the array
	as "going to be modified" so that the shared source array isn't
	mutated.

	[Bug #15479] [ruby-core:90781]
------------------------------------------------------------------------
r66780 | nagachika | 2019-01-10 23:46:41 +0900 (Thu, 10 Jan 2019) | 11 lines

merge revision(s) 63823,63839: [Backport #14890]

	time.c: [DOC] Time#localtime

	* time.c: state that Time#localtime does nothing when nothing
	  changes.  [ruby-core:87675] [Bug #14880]

	skip test_localtime_zone if force_tz_test is false

	For example Solaris
	https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable10x/ruby-trunk/log/20180703T091803Z.fail.html.gz
------------------------------------------------------------------------
r66777 | nagachika | 2019-01-10 23:18:09 +0900 (Thu, 10 Jan 2019) | 6 lines

merge revision(s) 66111: [Backport #14561]

	Avoid GCing dead stack after switching away from a fiber

	Fixes <https://bugs.ruby-lang.org/issues/14561> and discussed
	<https://bugs.ruby-lang.org/issues/15362>.
------------------------------------------------------------------------
r66748 | nagachika | 2019-01-07 21:05:16 +0900 (Mon, 07 Jan 2019) | 18 lines

merge revision(s) 62671: [Backport #14571]

	resolv.rb: close socket

	* lib/resolv.rb (UnconnectedUDP#lazy_initialize): store new
	  sockets before binding, so the sockets get closed when the
	  requester is closing.

	* lib/resolv.rb (ConnectedUDP#lazy_initialize): ditto.

	* lib/resolv.rb (UnconnectedUDP#close): synchronize to get rid of
	  race condition.

	* lib/resolv.rb (ConnectedUDP#close): ditto.

	[ruby-core:85901] [Bug #14571]

	From: quixoten (Devin Christensen) <quixoten@gmail.com>
------------------------------------------------------------------------
r66689 | nagachika | 2019-01-02 15:44:14 +0900 (Wed, 02 Jan 2019) | 5 lines

merge revision(s) 66685,66686: [Backport #15495]

	Try to update cert

	Try to update cert (2nd try)
------------------------------------------------------------------------
r66309 | nagachika | 2018-12-10 21:31:18 +0900 (Mon, 10 Dec 2018) | 7 lines

merge revision(s) 62621: [Backport #15396]

	compile.c: do not truncate VALUE to long

	* compile.c (ibf_dump_object_regexp): do not truncate VALUE to
	  long.  it makes invalid VALUE on IL32LLP64 platforms where long
	  is shorter than VALUE.
------------------------------------------------------------------------
r66298 | nagachika | 2018-12-09 15:46:44 +0900 (Sun, 09 Dec 2018) | 5 lines

conceptually partial backport from r63103, r65567.
All ISeq#to_binary should rescue to skip when running with coverage.
current trunk (2.6-) has assert_iseq_to_binary.


------------------------------------------------------------------------
r66297 | nagachika | 2018-12-09 14:38:38 +0900 (Sun, 09 Dec 2018) | 5 lines

merge revision(s) 61535:

	iseq.c: fix build error when VM_CHECK_MODE is enabled

	Follow up of r61534.  Sorry.
------------------------------------------------------------------------
r66285 | nagachika | 2018-12-08 17:00:22 +0900 (Sat, 08 Dec 2018) | 3 lines

merge revision(s) 65667: [Backport #15284]

	Fix for bison 3.2 [Bug #15284]
------------------------------------------------------------------------
r66225 | nagachika | 2018-12-05 23:35:07 +0900 (Wed, 05 Dec 2018) | 26 lines

merge revision(s) 64736,65567: [Backport #15270]

	iseq.c: prefix rb_ to non-static iseq functions

	I assume we always prefix rb_ to non-static functions to avoid conflict.
	These functions are not exported and safe to be renamed.

	iseq.h: ditto
	compile.c: ditto

	Fix TracePoint for nested iseq loaded from binary [Bug#14702]

	When loading iseq from binary while a TracePoint is on, we need to
	recompile instructions to their "trace_" variant. Before this commit
	we only recompiled instructions in the top level iseq, which meant
	that TracePoint was malfunctioning for code inside module/class/method
	definitions.

	* compile.c: Move rb_iseq_init_trace to rb_ibf_load_iseq_complete.
	  It is called on all iseqs during loading.

	* test_iseq.rb: Test that tracepoints fire within children iseq when
	  using load_from_binary.

	This patch is from: Alan Wu <XrXr@users.noreply.github.com>

------------------------------------------------------------------------
r66131 | nagachika | 2018-12-02 16:37:49 +0900 (Sun, 02 Dec 2018) | 6 lines

merge revision(s) 62776: [Backport #15365]

	test_iseq.rb: skip iseq with coverage

	* test/ruby/test_iseq.rb (test_to_binary_with_objects): #to_binary
	  does not support iseq compiled with coverage, just skip.
------------------------------------------------------------------------
r66130 | nagachika | 2018-12-02 16:13:22 +0900 (Sun, 02 Dec 2018) | 7 lines

merge revision(s) 63040: [Backport #14553]

	compile.c: do not dump unused callinfos

	* compile.c (compile_if): rewind callinfo indexes used in
	  unreachable paths, to get rid of dumping unused callinfos.
	  [ruby-core:86399] [Bug #14553]
------------------------------------------------------------------------
r66112 | nagachika | 2018-12-01 13:19:25 +0900 (Sat, 01 Dec 2018) | 3 lines

merge revision(s) 65365:

	Update for tzdata-2018f
------------------------------------------------------------------------
r66105 | nagachika | 2018-11-30 20:59:43 +0900 (Fri, 30 Nov 2018) | 3 lines

merge revision(s) 65956:

	fix r65954; Keep tainty
------------------------------------------------------------------------
r66074 | nagachika | 2018-11-28 22:55:17 +0900 (Wed, 28 Nov 2018) | 25 lines

merge revision(s) 64799,64800,64801: [Backport #15105]

	fix typo.

	* vm_exec.h (DEBUG_END_INSN()): use `ec` instead of `th`.
	  This macro is used when `VMDEBUG > 0`.


	escape all env properly.

	* vm_backtrace.c (rb_debug_inspector_open): escape all env using
	  `rb_vm_stack_to_heap()` before making bindings.
	  [Bug #15105]

	  There is a complicated story of this issue:
	  Without this patch, IFUNC frame does not escaped. A IFUNC frame
	  points to CFUNC ep as previous ep. However, CFUNC ep can be escaped
	  because of making bindings of Ruby level frames.
	  IFUNC's ep can points to invalidated ep and `rb_iter_break()` will
	  fail. This is why `any?` fails.

	* test/-ext-/debug/test_debug.rb: add a test.


	* remove trailing spaces.
------------------------------------------------------------------------
r66073 | nagachika | 2018-11-28 22:36:08 +0900 (Wed, 28 Nov 2018) | 17 lines

merge revision(s) 65954,65955,65958: [Backport #15337]

	Don't use single byte optimization on grapheme clusters

	Unicode Text Segmentation considers CRLF as a character. [Bug #15337]

	add tests using Unicode test data for grapheme clusters

	Add file test/ruby/enc/test_grapheme_breaks.rb to test String#each_grapheme_cluster
	and \X extended grapheme cluster matcher in regular expressions against test data
	provided by Unicode (ucd/auxiliary/GraphemeBreakTest.txt).

	Some lines in the data file are ignored, as follows:
	- Lines with a surrogate, because Ruby doesn't handle these
	- The case of "\r\n", because there is a bug (#15337) in the implementation

	remove guard against bug #15337, because it is fixed
------------------------------------------------------------------------
r65728 | nagachika | 2018-11-15 00:21:50 +0900 (Thu, 15 Nov 2018) | 8 lines

merge revision(s) 62772: [Backport #14738]

	compile.c: fix load_from_binary

	* compile.c (ibf_load_iseq_each): realpath may be nil.  follow up
	  r59709.  [fix https://github.com/Shopify/bootsnap/issues/132]

	From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
------------------------------------------------------------------------
r65582 | nagachika | 2018-11-07 00:52:16 +0900 (Wed, 07 Nov 2018) | 3 lines

merge revision(s) 65554: [Backport #15282]

	Don't set throw data as cause [Bug #15282]
------------------------------------------------------------------------
r65581 | nagachika | 2018-11-07 00:31:15 +0900 (Wed, 07 Nov 2018) | 7 lines

merge revision(s) 65460: [Backport #15271]

	parse.y: last location from bison

	* parse.y (command): set the last location from the location
	  managed by bison, so that other nodes are not needed.
	  [ruby-core:89648] [Bug #15271]
------------------------------------------------------------------------
r65580 | nagachika | 2018-11-07 00:13:01 +0900 (Wed, 07 Nov 2018) | 7 lines

merge revision(s) 65350: [Backport #15245]

	compile.c: fix peephole optimization

	* compile.c (iseq_peephole_optimize): should `pop` before jump
	  instruction which succeeds to `newarray` of a literal object,
	  not after.  [ruby-core:89536] [Bug #15245]
------------------------------------------------------------------------
r65579 | nagachika | 2018-11-06 23:49:59 +0900 (Tue, 06 Nov 2018) | 7 lines

merge revision(s) 64786: [Backport #15087]

	parse.y: fix block passing with empty kwargs

	* parse.y (arg_blk_pass): preceeding arguments node may be NULL when
	  an empty keyword argument hash splat is optimized away.
	  [ruby-core:88890] [Bug #15087]
------------------------------------------------------------------------
r65274 | nagachika | 2018-10-21 20:19:59 +0900 (Sun, 21 Oct 2018) | 7 lines

merge revision(s) 64515:

	remove `const` warning.

	* compile.c (iseq_ibf_load): remove `const` to pass iseq as no `const`
	  parameter.

------------------------------------------------------------------------
r65273 | nagachika | 2018-10-21 20:16:49 +0900 (Sun, 21 Oct 2018) | 1 line

bump up teeny version to 2.5.4.
------------------------------------------------------------------------
r65155 | nagachika | 2018-10-18 19:45:08 +0900 (Thu, 18 Oct 2018) | 1 line

bump up teeny version to 2.5.3.
------------------------------------------------------------------------
r65132 | nagachika | 2018-10-18 00:26:54 +0900 (Thu, 18 Oct 2018) | 28 lines

Import Ruby/OpenSSL 2.1.2.

Original patches are written by rhe.

Changes since v2.1.1 can be found at the upstream GitHub repository:

	https://github.com/ruby/openssl/compare/v2.1.1..v2.1.2

Kazuki Yamaguchi (9):
      pkey: resume key generation after interrupt
      tool/ruby-openssl-docker: update to latest versions
      test/test_ssl: fix test failure with TLS 1.3
      test/test_x509name: change script encoding to ASCII-8BIT
      x509name: refactor OpenSSL::X509::Name#to_s
      x509name: fix handling of X509_NAME_{oneline,print_ex}() return value
      x509name: fix OpenSSL::X509::Name#{cmp,<=>}
      Ruby/OpenSSL 2.0.9
      Ruby/OpenSSL 2.1.2

nobu (6):
      no ID cache in Init functions
      search winsock libraries explicitly
      openssl: search winsock
      openssl_missing.h: constified
      reduce LibreSSL warnings
      needs openssl/opensslv.h


------------------------------------------------------------------------
r65128 | nagachika | 2018-10-18 00:06:18 +0900 (Thu, 18 Oct 2018) | 8 lines

merge revision(s) 65125:

	infect taint flag on Array#pack and String#unpack
	with the directives "B", "b", "H" and "h".

		* pack.c (pack_pack, pack_unpack_internal): infect taint flag.

		* test/ruby/test_pack.rb: add test for above.
------------------------------------------------------------------------
r65100 | nagachika | 2018-10-17 08:23:05 +0900 (Wed, 17 Oct 2018) | 6 lines

merge revision(s) 64913: [Backport #15223]

	Support ubasecrt.dll 10.0.17763.1 included in Windows 10 October 2018 Update



------------------------------------------------------------------------
r65002 | nagachika | 2018-10-12 00:12:06 +0900 (Fri, 12 Oct 2018) | 11 lines

merge revision(s) 64745: [Backport #15118]

	Use opt_{aref,aset} over opt_{aref,aset}_with

	* compile.c (iseq_compile_each0): Use `opt_aref`/`opt_aset` over
	  `opt_aref_with`/`opt_aset_with` when frozen_string_literal: true,
	  not to resurrect the index string on non-Hash receiver.

	[Fix GH-1957]

	From: chopraanmol1 <chopraanmol1@gmail.com>
------------------------------------------------------------------------
r64999 | nagachika | 2018-10-11 23:58:30 +0900 (Thu, 11 Oct 2018) | 20 lines

merge revision(s) 64062: [Backport #14939]

	cont.c (ec_switch): prevent delayed/missed trap interrupt race

	timer-thread may set trap interrupt with rb_threadptr_check_signal
	at any time independent of GVL.  This means timer-thread may set
	the trap interrupt flag on the previous execution context; causing
	the flag to be unnoticed until a future ec switch (or lost
	completely if the ec is done).

	Note: I avoid relying on th->interrupt_lock here and use
	atomics because we won't be able to rely on it for proposed lazy
	timer-thread [Misc #14937].

	This regression affects Ruby 2.5 as it was introduced by moving
	interrupt_flag to `ec' which is an unstable pointer.  Ruby <= 2.4
	was unaffected because vm->main_thread->interrupt_flag never
	changed.

	[ruby-core:88119] [Bug #14939]
------------------------------------------------------------------------
r64998 | nagachika | 2018-10-11 23:40:04 +0900 (Thu, 11 Oct 2018) | 22 lines

merge revision(s) 63711,64398: [Backport #14841]

	thread_sync.c (rb_mutex_lock): fix deadlock

	* thread_sync.c (rb_mutex_lock): fix deadlock
	  [ruby-core:87467] [Bug #14841]

	thread_sync.c (rb_mutex_lock): acquire lock before being killed

	We (the thread acquiring the mutex) need to acquire the mutex
	before being killed to work with ConditionVariable#wait.

	Thus we reinstate the acquire-immediately-after-sleeping logic
	from pre-r63711 while still retaining the
	acquire-after-checking-for-interrupts logic from r63711.

	This regression was introduced in
	commit 501069b8a4013f2e3fdde35c50e9527ef0061963 (r63711)
	("thread_sync.c (rb_mutex_lock): fix deadlock") for
	[Bug #14841]

	[ruby-core:88503] [Bug #14999] [Bug #14841]
------------------------------------------------------------------------
r64997 | nagachika | 2018-10-11 23:20:25 +0900 (Thu, 11 Oct 2018) | 11 lines

merge revision(s) 64514: [Backport #14702]

	check trace flags at loading [Bug #14702]

	* iseq.c (iseq_init_trace): at ISeq loading time, we need to check
	  `ruby_vm_event_enabled_flags` to turn on trace instructions.
	  Seprate this checking code from `finish_iseq_build()` and make
	  new function. `iseq_ibf_load()` calls this funcation after loading.

	* test/ruby/test_iseq.rb: add a test for this fix.

------------------------------------------------------------------------
r64996 | nagachika | 2018-10-11 22:51:19 +0900 (Thu, 11 Oct 2018) | 7 lines

merge revision(s) 63030: [Backport #14639]

	array.c: yield blockarg in collect

	* array.c (rb_ary_collect): yield in block argument semantics
	  always to splat array elements to lambda, for the backward
	  compatibility.  [ruby-core:86362] [Bug #14639]
------------------------------------------------------------------------
r64982 | nagachika | 2018-10-09 23:43:06 +0900 (Tue, 09 Oct 2018) | 10 lines

merge revision(s) 64860,64861: [Backport #15164]

	fallback env encoding to ASCII-8BIT

	* hash.c (env_enc_str_new): as no locale/filesystem encoding is
	  available in miniruby on Windows, fallback the encoding to
	  ASCII-8BIT so it is valid encoding when the conversion failed.
	  [ruby-core:89177] [Bug #15164]

	* properties.
------------------------------------------------------------------------
r64981 | nagachika | 2018-10-09 23:39:16 +0900 (Tue, 09 Oct 2018) | 14 lines

merge revision(s) 63067,63068: [Backport #14658]

	Fix Kernel#singleton_method with Module#Prepend

	* proc.c (rb_obj_singleton_method): search the method entry from
	  the origin class, for fix prepended modules.  [Bug #14658]

	From: Vasiliy Ermolovich <younash@gmail.com>

	proc.c: fix segfault when no singleton class

	* proc.c (rb_obj_singleton_method): bail out if the receiver does
	  not have the singleton class without accessing the origin class
	  not to segfault.  [Bug #14658]
------------------------------------------------------------------------
r64980 | nagachika | 2018-10-09 23:25:37 +0900 (Tue, 09 Oct 2018) | 5 lines

merge revision(s) 64900: [Backport #15190]

	Just a shebang is valid code

	[ruby-core:89240] [Bug #15190]
------------------------------------------------------------------------
r64979 | nagachika | 2018-10-09 23:09:35 +0900 (Tue, 09 Oct 2018) | 12 lines

merge revision(s) 62007,62024: [Backport #13069]

	mkmf.rb: ignore linker warnings

	* lib/mkmf.rb (try_ldflags): ignore linker warnings.  they cause
	  unexpected failures on OpenBSD.  [ruby-core:78827] [Bug #13069]

	mkmf.rb: werror on mswin

	* lib/mkmf.rb (MakeMakefile#try_ldflags): enable warning checking
	  on mswin, link.exe warns -l options but does not fail.
	  [Bug #13069]
------------------------------------------------------------------------
r64978 | nagachika | 2018-10-09 22:59:53 +0900 (Tue, 09 Oct 2018) | 7 lines

merge revision(s) 64915: [Backport #15205]

	check argument type.

	* iseq.c (iseqw_s_compile): check argument type (T_STRING) to
	  avoid SEGV.

------------------------------------------------------------------------
r64893 | nagachika | 2018-10-01 21:02:17 +0900 (Mon, 01 Oct 2018) | 33 lines

merge revision(s) 63868,63870: [Backport #14897]

	Fix a bug of peephole optimization

	```
	  if   L1
	L0:
	  jump L2
	L1:
	  ...
	L2:
	```

	was wrongly optimized to:

	```
	  unless L2
	L0:
	L1:
	  ...
	L2:
	```

	To make it conservative, this optimization is now disabled when there is
	any label between `if` and `jump` instructions.
	Fixes [Bug #14897].

	compile.c: remove unreachable jump only

	* compile.c (iseq_peephole_optimize): remove unreachable jump
	  instruction only.  if it is labeled and referred from other
	  instructions, it is reachable and must not be removed.
	  [ruby-core:87830] [Bug #14897]
------------------------------------------------------------------------
r64621 | nagachika | 2018-09-03 20:04:55 +0900 (Mon, 03 Sep 2018) | 1 line

test/test_tmpdir.rb(TRAVERSAL_PATH): re-apply r62990 partially. [Backport #14966]
------------------------------------------------------------------------
r64617 | nagachika | 2018-09-02 20:23:06 +0900 (Sun, 02 Sep 2018) | 7 lines

merge revision(s) 64092: [Backport #14942]

	win32.c: limit write size on console

	* win32/win32.c (constat_parse): split long buffer and limit write
	  size on a console, as well as rb_w32_write.
	  [ruby-dev:50597] [Bug #14942]
------------------------------------------------------------------------
r64616 | nagachika | 2018-09-02 20:20:33 +0900 (Sun, 02 Sep 2018) | 6 lines

merge revision(s) 64071: [Backport #14941]

	ruby.c: taint ARGV on Windows

	* ruby.c (external_str_new_cstr): strings come from the external
	  should be tainted.  [ruby-dev:50596] [Bug #14941]
------------------------------------------------------------------------
r64613 | nagachika | 2018-09-02 12:43:25 +0900 (Sun, 02 Sep 2018) | 1 line

test/ruby/test_io.rb (test_select_leak): extend timeout for Arch Linux[Backport 14929]
------------------------------------------------------------------------
r64612 | nagachika | 2018-09-01 19:50:39 +0900 (Sat, 01 Sep 2018) | 1 line

bump up patchlevel for r64611
------------------------------------------------------------------------
r64611 | nagachika | 2018-09-01 19:49:09 +0900 (Sat, 01 Sep 2018) | 1 line

test/ruby/test_io.rb (test_select_leak): extend timeout [Bug 14929]
------------------------------------------------------------------------
r64605 | nagachika | 2018-09-01 14:40:02 +0900 (Sat, 01 Sep 2018) | 21 lines

merge revision(s) 64007,64019,64020: [Backport #14929]

	thread.c (do_select): fix leak on exception

	When do_select is interrupted and raise happens from
	RUBY_VM_CHECK_INTS_BLOCKING, the original FD sets we copied
	do not get freed, leading to a memory leak.  Wrap up all the
	FD sets into a Ruby object to ensure the GC can release an
	allocations made for rb_fdset_t.

	This leak existed since Ruby 2.0.0 (r36430)

	[Bug #14929]

	increase timeout seconds.
	* test/ruby/test_io.rb (test_select_leak): increase timeout seconds
	  to pass this test on a high-load machine.


	60 sec is not enough at all

------------------------------------------------------------------------
r64603 | nagachika | 2018-09-01 11:31:27 +0900 (Sat, 01 Sep 2018) | 8 lines

merge revision(s) 64014: [Backport #14926]

	fix sum on infinity

	* array.c (rb_ary_sum): consider non-finite floats.
	  [ruby-core:88024] [Bug #14926]

	* enum.c (sum_iter): ditto.
------------------------------------------------------------------------
r64602 | nagachika | 2018-09-01 11:03:24 +0900 (Sat, 01 Sep 2018) | 6 lines

merge revision(s) 63994: [Backport #14920]

	reduce tzset

	* time.c (rb_localtime_r): call tzset() only after TZ environment
	  variable is changed.
------------------------------------------------------------------------
r64443 | nagachika | 2018-08-18 17:35:42 +0900 (Sat, 18 Aug 2018) | 9 lines

merge revision(s) 62099: [Backport #14416]

	net/pop: make modified strings mutable

	Thanks to Michael Zimmerman for the bug report

	* lib/net/pop.rb: make modified strings mutable
	  [ruby-core:85210] [Bug #14416]
	* test/net/pop/test_pop.rb: new test
------------------------------------------------------------------------
r64439 | nagachika | 2018-08-18 14:20:55 +0900 (Sat, 18 Aug 2018) | 9 lines

merge revision(s) 63741: [Backport #14868]

	process.c (ruby_fork_ruby): fix race in signal handling

	We must block signals before stopping timer-thread, otherwise
	signal handing may be delayed until (and if) another signal
	is received after timer-thread is restarted.

	[ruby-core:87622] [Bug #14868] [Bug #13916]
------------------------------------------------------------------------
r64438 | nagachika | 2018-08-18 14:04:31 +0900 (Sat, 18 Aug 2018) | 8 lines

merge revision(s) 63727: [Backport #14865]

	vm.c: fix infinite loop

	* vm.c: use EXEC_EVENT_HOOK_AND_POP_FRAME. While exception handling, if an exception
	  is raised in hooks, need to pop current frame and raise this raised exception by hook.

	[ruby-dev:50582] [Bug #14865]
------------------------------------------------------------------------
r64437 | nagachika | 2018-08-18 13:40:01 +0900 (Sat, 18 Aug 2018) | 15 lines

merge revision(s) 63698: [Backport #14856]

	lib/drb/extservm.rb (service): do not return `false'

	invoke_service_command may set entries in @servers to `false',
	making it incompatible with the intended use of the
	safe navigation operator.

	This caused occasional DRb test failures, but they were hidden
	with automatic retry.

	[ruby-core:87524] [Bug #14856]

	Fixes: r53111 ("use safe navigation operator")
		commit 059c9c1cf371e049c7481c78b76e9620da52757f [GH-1142]
------------------------------------------------------------------------
r64435 | nagachika | 2018-08-18 13:19:42 +0900 (Sat, 18 Aug 2018) | 9 lines

merge revision(s) 63112: [Backport #14818]

	Remove outdated example from Numeric documentation

	Since 2.5, Numeric instances can be cloned and duplicated.

	[Fix GH-1850]

	From: Miguel Landaeta <miguel@miguel.cc>
------------------------------------------------------------------------
r64434 | nagachika | 2018-08-18 13:18:32 +0900 (Sat, 18 Aug 2018) | 24 lines

merge revision(s) 63571,63572: [Backport #14816]

	`int isnan(double)` is a POSIXism

	- `isnan` is something relatively new.  We need to provide one for
	  those systems without it.  However:
	- X/Open defines `int isnan(double)`. Note the `int`.
	- C99 defines `isnan(x)` to be a macro.
	- C++11 nukes them all, undefines all the "masking macro"s, and
	  defines its own `bool isnan(double)`.  Note the `bool`.
	- In C++, `int isnan(double)` and `bool isnan(double)` are
	  incompatible.
	- So the mess.

	[Bug #14816][ruby-core:87364]
	further reading: https://developers.redhat.com/blog/2016/02/29/why-cstdlib-is-more-complicated-than-you-might-think/


	include/ruby/missing.h: defined(__cplusplus) before using __cplusplus

	* include/ruby/missing.h (isinf, isnan): For non-C++ programs,
	  defined(__cplusplus) may be needed before using __cplusplus.
	  [Bug #14816]

------------------------------------------------------------------------
r64432 | nagachika | 2018-08-18 12:37:56 +0900 (Sat, 18 Aug 2018) | 21 lines

merge revision(s) 63549,63551,63554: [Backport #14805]

	memo->u3.cnt is long not int [Bug #14805]

	enum.c: mitigate overflows

	* enum.c (enum_count): convert counters to Integer as unsigned
	  long, instead of long, to mitigate overflows.
	  [ruby-core:87348] [Bug #14805]

	* enum.c (ary_inject_op): ditto.

	* enum.c (each_with_index_i): ditto, instead of int.

	* enum.c (find_index_i, find_index_iter_i): ditto, instead of
	  unsigned int.

	enum.c: bignum counter

	* enum.c (imemo_count_up, imemo_count_value): promote the counter
	  value to a bignum on overflow.  [Bug #14805]
------------------------------------------------------------------------
r64431 | nagachika | 2018-08-18 12:07:15 +0900 (Sat, 18 Aug 2018) | 12 lines

merge revision(s) 63512,63514: [Backport #14790]

	time.rb: fix parsing time zone in iso8601

	* lib/time.rb (Time.xmlschema): a colon in time zone designator
	  can be omitted.  [ruby-core:87277] [Bug #14790]

	time.rb: fix parsing time zone in iso8601

	* lib/time.rb (Time.xmlschema): the minute in time zone designator
	  can be omitted together with the preceding colon.
	  [ruby-core:87277] [Bug #14790]
------------------------------------------------------------------------
r64430 | nagachika | 2018-08-18 11:56:32 +0900 (Sat, 18 Aug 2018) | 6 lines

merge revision(s) 63417: [Backport #14756]

	error.c: check redefined backtrace result

	* error.c (rb_get_backtrace): check the result of `backtrace` even
	  if the method is redefined.  [ruby-core:87013] [Bug #14756]
------------------------------------------------------------------------
r64428 | nagachika | 2018-08-18 11:39:09 +0900 (Sat, 18 Aug 2018) | 17 lines

merge revision(s) 63406: [Backport #14754]

	openssl: merge changes in v2.1.1

	Commits in upstream repository since v2.1.0 can be found at:

		https://github.com/ruby/openssl/compare/v2.1.0...v2.1.1

	----------------------------------------------------------------
	Kazuki Yamaguchi (7):
	      test/utils: disable Thread's report_on_exception in start_server
	      cipher: validate iterations argument for Cipher#pkcs5_keyivgen
	      extconf.rb: fix build with LibreSSL 2.7.0
	      test/test_pkey_rsa: fix test failure with OpenSSL 1.1.1
	      test/test_ssl_session: set client protocol version explicitly
	      Ruby/OpenSSL 2.0.8
	      Ruby/OpenSSL 2.1.1
------------------------------------------------------------------------
r64421 | nagachika | 2018-08-18 01:27:13 +0900 (Sat, 18 Aug 2018) | 7 lines

merge revision(s) 62952: [Backport #14638]

	win32/file.c: relative path with drive letter

	* win32/file.c (IS_ABSOLUTE_PATH_P): home directory should not be
	  a relative path regardless a drive letter.   PathIsRelativeW
	  returns FALSE on such path.  [ruby-core:86356] [Bug #14638]
------------------------------------------------------------------------
r64420 | nagachika | 2018-08-18 01:20:53 +0900 (Sat, 18 Aug 2018) | 6 lines

merge revision(s) 63396: [Backport #14750]

	net/imap: Fix ArgumentError in send_string_data

	Thanks to ShockwaveNN (Pavel Lobashov) for reporting the bug.
	[ruby-core:86990] [Bug #14750]
------------------------------------------------------------------------
r64419 | nagachika | 2018-08-18 00:48:46 +0900 (Sat, 18 Aug 2018) | 7 lines

merge revision(s) 63255: [Backport #14708]

	compile.c: fix unconditional branch optimization

	* compile.c (iseq_peephole_optimize): add dummy `putnil` after a
	  `jump` replacing an unconditional branch, to adjust removed
	  `dup`.  [ruby-core:86666] [Bug #14708]
------------------------------------------------------------------------
r64418 | nagachika | 2018-08-18 00:33:57 +0900 (Sat, 18 Aug 2018) | 5 lines

merge revision(s) 61567: [Backport #14693]

	fix uninitialized variable

	Likewise this can easily be noticed if you read the warnings.
------------------------------------------------------------------------
r64320 | nagachika | 2018-08-12 20:51:02 +0900 (Sun, 12 Aug 2018) | 7 lines

merge revision(s) 63252: [Backport #14707]

	string.c: fix scanned substring with `\K`

	* string.c (scan_once): fix the matched substring with `\K`, the
	  beginning of that string may differ from the matched position.
	  [ruby-core:86663] [Bug #14707]
------------------------------------------------------------------------
r64319 | nagachika | 2018-08-12 19:37:03 +0900 (Sun, 12 Aug 2018) | 8 lines

merge revision(s) 63133: [Backport #14566]

	eval_error.c: fix loop on exception in message

	* error.c (rb_get_message): accessor to the message.

	* eval_error.c (rb_ec_error_print): handle exceptions on fetching
	  the message.  [Bug #14566]
------------------------------------------------------------------------
r64195 | nagachika | 2018-08-05 19:59:57 +0900 (Sun, 05 Aug 2018) | 7 lines

merge revision(s) 61766: [Backport #14350]

	vm_insnhelper.c: search in the indexing order

	* vm_insnhelper.c (vm_opt_newarray_max, vm_opt_newarray_min):
	  search in the indexing order, as well as usual methods.
	  [ruby-core:84821] [Bug #14350]
------------------------------------------------------------------------
r63826 | nagachika | 2018-07-02 18:15:33 +0900 (Mon, 02 Jul 2018) | 9 lines

merge revision(s) 63304: [Backport #14713]

	io.c: workaround for EPROTOTYPE

	* io.c (internal_write_func, internal_writev_func): retry at
	  unexpected EPROTOTYPE on macOS, to get rid of a kernel bug.
	  [ruby-core:86690] [Bug #14713]

	* ext/socket/init.c (rsock_{sendto,send,write}_blocking): ditto.
------------------------------------------------------------------------
r63825 | nagachika | 2018-07-02 17:53:52 +0900 (Mon, 02 Jul 2018) | 7 lines

merge revision(s) 63696: [Backport #14853]

	variable.c: fix receiver on private constant

	* variable.c (rb_const_search): fix NameError :receiver attribute
	  on private constant, should raise with the included module, not
	  the ICLASS.
------------------------------------------------------------------------
r63824 | nagachika | 2018-07-02 17:30:36 +0900 (Mon, 02 Jul 2018) | 27 lines

merge revision(s) 62731,62735: [Backport #14495]

	Bug Fix Enumerator::Lazy#uniq state for multiple call

	* enumerator.c (lazy_uniq_i): create new hash for each calls.
	  [Fix GH-1820]

	Currently

		2.5.0-preview1 :001 > arr = (0..100).lazy.uniq{|i| i % 10}
		 => #<Enumerator::Lazy: #<Enumerator::Lazy: 0..100>:uniq>
		2.5.0-preview1 :002 > arr.to_a
		 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
		2.5.0-preview1 :003 > arr.to_a
		 => []

	Expected

	arr.to_a to always return same output

	From: Anmol Chopra <anmolchopra@rocketbox.in>

	test_enumerator.rb: duplicate assertions

	* test/ruby/test_enumerator.rb (test_uniq): remove assertions
	  which ared duplicate of lazy enumerator tests in
	  test_lazy_enumerator.rb.
------------------------------------------------------------------------
r63819 | nagachika | 2018-07-02 09:31:27 +0900 (Mon, 02 Jul 2018) | 23 lines

merge revision(s) 61525,61527,63062,63650: [Backport #14846]

	error.c: negative uplevel

	* error.c (rb_warn_m): negative uplevel is not allowed.
	  [ruby-core:84568] [Bug #14262]

	error.c: limit depth

	* error.c (rb_warn_m): limit backtrace depth to reduce objects to
	  be created but not used.

	error.c: prepend "warning: " always

	* error.c (rb_warn_m): prepend the string "warning: " if uplevel
	  keyword is given, even if caller file and line information are
	  not available.

	Fix condition in Kernel#warn when using uplevel

	* It causes SEGV on `warn("foo", uplevel: 100)`.
	* Found in a ruby/spec added by @andrykonchin in
	  https://github.com/ruby/spec/pull/605
------------------------------------------------------------------------
r63818 | nagachika | 2018-07-02 09:17:38 +0900 (Mon, 02 Jul 2018) | 1 line

bump up teeny version to 2.5.2.
------------------------------------------------------------------------
r63817 | nagachika | 2018-07-02 09:14:53 +0900 (Mon, 02 Jul 2018) | 19 lines

merge revision(s) 63054,63055,63056: [Backport #14655]

	test_time_tz.rb: Kiritimati tzdata fix

	* test/ruby/test_time_tz.rb (TestTimeTZ#test_pacific_kiritimati):
	  fix the expected data at the skip of New Year's Eve 1994.
	  [Bug #14655]

	test_time_tz.rb: Kiritimati tzdata fix

	* test/ruby/test_time_tz.rb (gen_zdump_test): fix the expected
	  data at the Kiritimati's skip of New Year's Eve 1994.
	  [Bug #14655]

	test_time_tz.rb: Lisbon tzdata fix

	* test/ruby/test_time_tz.rb (gen_variational_zdump_test): Update
	  Lisbon zdump data, which fixed the 1912-01-01 transition for
	  Portugual and its colonies.  [Bug #14655]
------------------------------------------------------------------------
r63049 | naruse | 2018-03-31 22:50:56 +0900 (Sat, 31 Mar 2018) | 3 lines

merge revision(s) 63048: [Backport #14654]

	Resurvey performance of RDoc by frozen_string_literal: true [Bug #14654]
------------------------------------------------------------------------
r63035 | naruse | 2018-03-29 19:05:57 +0900 (Thu, 29 Mar 2018) | 3 lines

merge revision(s) 61470:

	Add ruby_2_5 branch to .travis.yml
------------------------------------------------------------------------
r63027 | naruse | 2018-03-29 01:45:58 +0900 (Thu, 29 Mar 2018) | 2 lines

p57

------------------------------------------------------------------------
r63026 | svn | 2018-03-29 01:44:34 +0900 (Thu, 29 Mar 2018) | 1 line

* 2018-03-29
------------------------------------------------------------------------
r63025 | naruse | 2018-03-29 01:44:33 +0900 (Thu, 29 Mar 2018) | 4 lines

revert r62985 (r62966 in trunk)

It breaks test-all

------------------------------------------------------------------------
r63011 | naruse | 2018-03-28 22:46:14 +0900 (Wed, 28 Mar 2018) | 9 lines

merge revision(s) 63008:

	get rid of test error/failure on Windows introduced at r62955

	* lib/webrick/httpresponse.rb (send_body_io): use seek if NotImplementedError
	  is raised in IO.copy_stream with offset.

	* lib/webrick/httpservlet/filehandler.rb (multipart_body): ditto.

------------------------------------------------------------------------
r63010 | naruse | 2018-03-28 22:45:50 +0900 (Wed, 28 Mar 2018) | 2 lines

Revert wrong commit r62976-r62978

------------------------------------------------------------------------
r63009 | naruse | 2018-03-28 22:43:23 +0900 (Wed, 28 Mar 2018) | 6 lines

merge revision(s) 63000:

	unixsocket.c: abstract namespace

	* ext/socket/unixsocket.c (unixsock_path_value): fix r62991 for
	  Linux abstract namespace.
------------------------------------------------------------------------
r63007 | naruse | 2018-03-28 21:54:26 +0900 (Wed, 28 Mar 2018) | 2 lines

fix r62970 as r62990

------------------------------------------------------------------------
r63006 | naruse | 2018-03-28 21:50:56 +0900 (Wed, 28 Mar 2018) | 98 lines

merge revision(s) 62953-62959:

	win32/file.c: relative path with drive letter

	* win32/file.c (IS_ABSOLUTE_PATH_P): home directory should not be
	  a relative path regardless a drive letter.   PathIsRelativeW
	  returns FALSE on such path.  [ruby-core:86356] [Bug #14638]
	------------------------------------------------------------------------
	r62953 | normal | 2018-03-28 17:05:46 +0900 (Wed, 28 Mar 2018) | 15 lines

	webrick: favor .write over << method

	This will make the next change to use IO.copy_stream
	easier-to-read.  When we can drop Ruby 2.4 support in a few
	years, this will allow us to use writev(2) with multiple
	arguments for headers and chunked responses.

	* lib/webrick/cgi.rb (write): new wrapper method
	  lib/webrick/httpresponse.rb: (send_header): use socket.write
	  (send_body_io): ditto
	  (send_body_string): ditto
	  (send_body_proc): ditto
	  (_write_data): ditto
	  (ChunkedWrapper#write): ditto
	  (_send_file): ditto
	------------------------------------------------------------------------
	r62954 | normal | 2018-03-28 17:05:52 +0900 (Wed, 28 Mar 2018) | 14 lines

	webrick/httpresponse: IO.copy_stream for regular files

	Remove the redundant _send_file method since its functionality
	is unnecessary with IO.copy_stream.  IO.copy_stream also allows
	the use of sendfile under some OSes to speed up copies to
	non-TLS sockets.

	Testing with "curl >/dev/null" and "ruby -run -e httpd" to
	read a 1G file over Linux loopback reveals a reduction from
	around ~0.770 to ~0.490 seconds on the client side.

	* lib/webrick/httpresponse.rb (send_body_io): use IO.copy_stream
	  (_send_file): remove
	  [Feature #14237]
	------------------------------------------------------------------------
	r62955 | normal | 2018-03-28 17:05:57 +0900 (Wed, 28 Mar 2018) | 10 lines

	webrick: use IO.copy_stream for single range response

	This is also compatible with range responses generated
	by Rack::File (tested with rack 2.0.3).

	* lib/webrick/httpresponse.rb (send_body_io): use Content-Range
	* lib/webrick/httpservlet/filehandler.rb (make_partial_content):
	  use File object for the single range case
	* test/webrick/test_filehandler.rb (get_res_body): use send_body
	  to test result
	------------------------------------------------------------------------
	r62956 | normal | 2018-03-28 17:06:02 +0900 (Wed, 28 Mar 2018) | 7 lines

	test/webrick/test_filehandler.rb: stricter multipart range test

	We need to ensure we generate compatibile output in
	the face of future changes

	* test/webrick/test_filehandler.rb (test_make_partial_content):
	  check response body
	------------------------------------------------------------------------
	r62957 | normal | 2018-03-28 17:06:08 +0900 (Wed, 28 Mar 2018) | 8 lines

	webrick: quiet warning for multi-part ranges

	Content-Length is ignored by WEBrick::HTTPResponse even if we
	calculate it, so instead we chunk responses to HTTP/1.1 clients
	and terminate HTTP/1.0 connections.

	* lib/webrick/httpservlet/filehandler.rb (make_partial_content):
	  quiet warning
	------------------------------------------------------------------------
	r62958 | normal | 2018-03-28 17:06:13 +0900 (Wed, 28 Mar 2018) | 7 lines

	webrick/httpresponse: make ChunkedWrapper copy_stream-compatible

	The .write method needs to return the number of bytes written
	to avoid confusing IO.copy_stream.

	* lib/webrick/httpresponse.rb (ChunkedWrapper#write): return bytes written
	  (ChunkedWrapper#<<): return self
	------------------------------------------------------------------------
	r62959 | normal | 2018-03-28 17:06:18 +0900 (Wed, 28 Mar 2018) | 9 lines

	webrick: use IO.copy_stream for multipart response

	Use the new Proc response body feature to generate a multipart
	range response dynamically.  We use a flat array to minimize
	object overhead as much as possible; as many ranges may fit
	into an HTTP request header.

	* lib/webrick/httpservlet/filehandler.rb (multipart_body): new method
	  (make_partial_content): use multipart_body
------------------------------------------------------------------------
r62986 | naruse | 2018-03-28 18:26:17 +0900 (Wed, 28 Mar 2018) | 9 lines

webrick: prevent response splitting and header injection

Original patch by tenderlove (with minor style adjustments).

* lib/webrick/httpresponse.rb (send_header): call check_header
  (check_header): raise on embedded CRLF in header value
* test/webrick/test_httpresponse.rb
  (test_prevent_response_splitting_headers): new test
* (test_prevent_response_splitting_cookie_headers): ditto
------------------------------------------------------------------------
r62985 | naruse | 2018-03-28 18:26:16 +0900 (Wed, 28 Mar 2018) | 23 lines

webrick/httpproxy: stream request and response bodies

Reading entire request or response bodies into memory can lead
to trivial denial-of-service attacks.  Introduce Fibers in both
cases to allow streaming.

WEBrick::HTTPRequest gains a new body_reader method to prepare
itself as a source for IO.copy_stream.  This allows the
WEBrick::HTTPRequest object to be used as the
Net::HTTPGenericRequest#body_stream= arg for Net::HTTP.

For HTTP proxy response bodies, we also use a Fiber to
to make the HTTP request and read the response body.

* lib/webrick/httprequest.rb (body_reader): new method
  (readpartial): ditto
* lib/webrick/httpproxy.rb (perform_proxy_request): use Fiber
  to stream response body
  (do_GET, do_HEAD): adjust call
  (do_POST): adjust call and supply body_reader
* test/webrick/test_httprequest.rb (test_chunked): test
  for IO.copy_stream compatibility
* test/webrick/test_httpproxy.rb (test_big_bodies): new test
------------------------------------------------------------------------
r62984 | naruse | 2018-03-28 18:26:14 +0900 (Wed, 28 Mar 2018) | 18 lines

webrick/httpauth/digestauth: stream req.body

WARNING! WARNING! WARNING!  LIKELY BROKEN CHANGE

Pass a proc to WEBrick::HTTPRequest#body to avoid reading a
potentially large request body into memory during
authentication.

WARNING! this will break apps completely which want to do
something with the body besides calculating the MD5 digest
of it.

Also, keep in mind that probably nobody uses "auth-int".
Servers such as Apache, lighttpd, nginx don't seem to
support it; nor does curl when using POST/PUT bodies;
and we didn't have tests for it until now...

* lib/webrick/httpauth/digestauth.rb (_authenticate): stream req.body
------------------------------------------------------------------------
r62983 | naruse | 2018-03-28 18:26:13 +0900 (Wed, 28 Mar 2018) | 9 lines

webrick: add test for Digest auth-int

No changes to the actual code, this is a new test for
a feature for which no tests existed.  I don't understand
the Digest authentication code well at all, but this is
necessary for the subsequent change.

* test/webrick/test_httpauth.rb (test_digest_auth_int): new test
  (credentials_for_request): support bodies with POST
------------------------------------------------------------------------
r62982 | naruse | 2018-03-28 18:26:12 +0900 (Wed, 28 Mar 2018) | 9 lines

webrick/httprequest: use InputBufferSize for chunked requests

While WEBrick::HTTPRequest#body provides a Proc interface
for streaming large request bodies, clients must not force
the server to use an excessively large chunk size.

* lib/webrick/httprequest.rb (read_chunk_size): limit each
  read and block.call to :InputBufferSize in config.
* test/webrick/test_httpserver.rb (test_big_chunks): new test
------------------------------------------------------------------------
r62981 | naruse | 2018-03-28 18:26:12 +0900 (Wed, 28 Mar 2018) | 7 lines

webrick/httprequest: raise correct exception

"BadRequest" alone does not resolve correctly, it is in the
HTTPStatus namespace.

* lib/webrick/httprequest.rb (read_chunked): use correct exception
* test/webrick/test_httpserver.rb (test_eof_in_chunk): new test
------------------------------------------------------------------------
r62980 | naruse | 2018-03-28 18:26:11 +0900 (Wed, 28 Mar 2018) | 9 lines

webrick/httpservlet/cgihandler: reduce memory use

WEBrick::HTTPRequest#body can be passed a block to process the
body in chunks.  Use this feature to avoid building a giant
string in memory.

* lib/webrick/httpservlet/cgihandler.rb (do_GET):
  avoid reading entire request body into memory
  (do_POST is aliased to do_GET, so it handles bodies)
------------------------------------------------------------------------
r62979 | naruse | 2018-03-28 18:26:10 +0900 (Wed, 28 Mar 2018) | 13 lines

webrick/httprequest: limit request headers size

We use the same 112 KB limit started (AFAIK) by Mongrel, Thin,
and Puma to prevent malicious users from using up all the memory
with a single request.  This also limits the damage done by
excessive ranges in multipart Range: requests.

Due to the way we rely on IO#gets and the desire to keep
the code simple, the actual maximum header may be 4093 bytes
larger than 112 KB, but we're splitting hairs at that point.

* lib/webrick/httprequest.rb: define MAX_HEADER_LENGTH
  (read_header): raise when headers exceed max length
------------------------------------------------------------------------
r62978 | naruse | 2018-03-28 18:26:09 +0900 (Wed, 28 Mar 2018) | 1 line

sdbm: constified
------------------------------------------------------------------------
r62977 | naruse | 2018-03-28 18:26:08 +0900 (Wed, 28 Mar 2018) | 4 lines

sdbm: check offset

* ext/sdbm/_sdbm.c (splpage): check offset range.
  https://hackerone.com/reports/271291
------------------------------------------------------------------------
r62976 | naruse | 2018-03-28 18:26:07 +0900 (Wed, 28 Mar 2018) | 6 lines

sdbm: check offset

* ext/sdbm/_sdbm.c (getpair, getnkey): check offset range.
  https://hackerone.com/reports/271096

* ext/sdbm/init.c (fsdbm_each_pair): raise if fetch failed.
------------------------------------------------------------------------
r62975 | naruse | 2018-03-28 18:26:06 +0900 (Wed, 28 Mar 2018) | 4 lines

pack.c: fix underflow

* pack.c (pack_unpack_internal): get rid of underflow.
  https://hackerone.com/reports/298246
------------------------------------------------------------------------
r62974 | naruse | 2018-03-28 18:26:04 +0900 (Wed, 28 Mar 2018) | 9 lines

dir.c: check NUL bytes

* dir.c (GlobPathValue): should be used in rb_push_glob only.
  other methods should use FilePathValue.
  https://hackerone.com/reports/302338

* dir.c (rb_push_glob): expand GlobPathValue

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r62973 | naruse | 2018-03-28 18:26:01 +0900 (Wed, 28 Mar 2018) | 4 lines

unixsocket.c: check NUL bytes

* ext/socket/unixsocket.c (rsock_init_unixsock): check NUL bytes.
  https://hackerone.com/reports/302997
------------------------------------------------------------------------
r62972 | svn | 2018-03-28 18:26:01 +0900 (Wed, 28 Mar 2018) | 1 line

* 2018-03-28
------------------------------------------------------------------------
r62971 | naruse | 2018-03-28 18:26:00 +0900 (Wed, 28 Mar 2018) | 1 line

Remove directory separators
------------------------------------------------------------------------
r62911 | naruse | 2018-03-25 01:00:27 +0900 (Sun, 25 Mar 2018) | 18 lines

merge revision(s) 61587,61617,61618: [Backport #14273]

	compile.c: next label

	* compile.c (compile_next): label for jump to the end of block is
	  removable.

	compile.c: remove more unreachable chunk

	* compile.c (remove_unreachable_chunk): remove beyond labels to be
	  removed.

	compile.c: fix stack consistency error

	* compile.c (iseq_peephole_optimize): fix stack consistency error
	  from return in loop, by adding extra `pop` when replacing `jump`
	  with `leave`, which is never reached but needed to adjust sp
	  calculation.  [ruby-core:84589] [Bug #14273]
------------------------------------------------------------------------
r62909 | naruse | 2018-03-24 20:43:50 +0900 (Sat, 24 Mar 2018) | 13 lines

merge revision(s) 62723,62724: [Backport #14584]

        parse.y: reduce duplicate code

        parse.y: fix interpolated string literal dedent

        * parse.y (heredoc_dedent): fix interpolated string literal dedent,
          remove indentations from only nodes with the newline flag.
          [ruby-core:85983] [Bug #14584]

        * parse.y (here_document): set the newline flag on literal string
          nodes starting at the beginning of line.

------------------------------------------------------------------------
r62905 | naruse | 2018-03-24 19:57:34 +0900 (Sat, 24 Mar 2018) | 11 lines

merge revision(s) 62548,62894: [Backport #14324]

	eval_error.c: rb_error_write flags

	* eval_error.c (rb_error_write): add highlight and reverse mode
	  flags.  defaulted to rb_stderr_tty_p() if Qnil.

	error.c: full_message options

	* error.c (exc_full_message): add highlight: and reverse: keyword
	  options.  [Bug #14324]
------------------------------------------------------------------------
r62896 | naruse | 2018-03-22 20:18:00 +0900 (Thu, 22 Mar 2018) | 7 lines

merge revision(s) 62892,62893: [Backport #14363]

	fix each_grapheme_cluster's size [Bug #14363]

	From: Hugo Peixoto <hugo.peixoto@gmail.com>

	Factor out get_reg_grapheme_cluster
------------------------------------------------------------------------
r62895 | naruse | 2018-03-22 19:02:54 +0900 (Thu, 22 Mar 2018) | 2 lines

teenyup

------------------------------------------------------------------------
r62890 | svn | 2018-03-22 16:00:18 +0900 (Thu, 22 Mar 2018) | 1 line

* 2018-03-22
------------------------------------------------------------------------
r62889 | naruse | 2018-03-22 16:00:17 +0900 (Thu, 22 Mar 2018) | 14 lines

merge revision(s) 62042,62044: [Backport #14380]

	hash.c: support key swapping in Hash#transform_keys!

	* hash.c (rb_hash_transform_keys_bang): support key swapping in
	  Hash#transform_keys!
	  [Bug #14380] [ruby-core:84951]

	* test/ruby/test_hash.rb (test_transform_keys_bang):
	  add assertions for this change

	Fix rubyspec against the change in Hash#transform_keys!

	[Bug #14380] [ruby-core:84951]
------------------------------------------------------------------------
r62860 | naruse | 2018-03-20 18:52:52 +0900 (Tue, 20 Mar 2018) | 9 lines

merge revision(s) 62725: [Backport #14604]

	Fix setting method visibility on method wrapped with prepend

	Ignore prepended modules when looking for already defined methods on a
	class to set the visibility on.
	[Fix GH-1834]

	From: Dylan Thacker-Smith <Dylan.Smith@shopify.com>
------------------------------------------------------------------------
r62859 | naruse | 2018-03-20 18:39:52 +0900 (Tue, 20 Mar 2018) | 7 lines

merge revision(s) 62734: [Backport #14613]

	Add missing class FrozenError to Exception subclasses list documentation

	[Fix GH-1818]

	From: Miguel Landaeta <miguel@miguel.cc>
------------------------------------------------------------------------
r62858 | naruse | 2018-03-20 18:37:39 +0900 (Tue, 20 Mar 2018) | 37 lines

merge revision(s) 62396: [Backport #14357]

	st.c: retry operations if rebuilt

	Calling the .eql? and .hash methods during a Hash operation can
	result in a thread switch or a signal handler to run: allowing
	one execution context to rebuild the hash table while another is
	still reading or writing the table.  This results in a
	use-after-free bug affecting the thread_safe-0.3.6 test suite
	and likely other bugs.

	This bug did not affect users of commonly keys (String, Symbol,
	Fixnum) as those are optimized to avoid method dispatch
	for .eql? and .hash methods.

	A separate version of this change needs to be ported to Ruby 2.3.x
	which had a different implementation of st.c but was affected
	by the same bug.

	* st.c: Add comment about table rebuilding during comparison.
	  (DO_PTR_EQUAL_CHECK): New macro.
	  (REBUILT_TABLE_ENTRY_IND, REBUILT_TABLE_BIN_IND): New macros.
	  (find_entry, find_table_entry_ind, find_table_bin_ind): Use new
	  macros.  Return the rebuild flag.
	  (find_table_bin_ptr_and_reserve): Ditto.
	  (st_lookup, st_get_key, st_insert, st_insert2): Retry the
	  operation if the table was rebuilt.
	  (st_general_delete, st_shift, st_update, st_general_foreach):
	  Ditto.
	  (st_rehash_linear, st_rehash_indexed): Use DO_PTR_EQUAL_CHECK.
	  Return the rebuild flag.
	  (st_rehash): Retry the operation if the table was rebuilt.
	  [ruby-core:85510] [Ruby trunk Bug#14357]

	Thanks to Vit Ondruch for reporting the bug.

	From: Vladimir Makarov <vmakarov@redhat.com>
------------------------------------------------------------------------
r62854 | naruse | 2018-03-20 11:09:21 +0900 (Tue, 20 Mar 2018) | 7 lines

merge revision(s) 62673: [Backport #14577]

	thread.c: deadlock in backtrace

	* thread.c (unblock_function_set): check interrupts just once
	  during raising exceptions, as they are deferred since r16651.
	  [ruby-core:85939] [Bug #14577]
------------------------------------------------------------------------
r62853 | svn | 2018-03-20 11:08:28 +0900 (Tue, 20 Mar 2018) | 1 line

* 2018-03-20
------------------------------------------------------------------------
r62852 | naruse | 2018-03-20 11:08:27 +0900 (Tue, 20 Mar 2018) | 13 lines

merge revision(s) 62668: [Backport #14578]

	thread.c: reset waitq of keeping mutexes in child

	We must not maintain references to threads in the parent process
	in any mutexes held by the child process.

	* thread_sync.c (rb_mutex_cleanup_keeping_mutexes): new function
	* thread.c (rb_thread_atfork): cleanup keeping mutexes
	  [ruby-core:85940] [Bug #14578]

	Fixes: r58604 (commit 3586c9e0876e784767a1c1adba9ebc2499fa0ec2)
	       ("reduce rb_mutex_t size from 160 to 80 bytes on 64-bit")
------------------------------------------------------------------------
r62837 | naruse | 2018-03-19 17:27:04 +0900 (Mon, 19 Mar 2018) | 34 lines

merge revision(s) 62244,62246,62301,62302,62303,62422,62436,62452: [Backport #14481]

	Merge RubyGems-2.7.5 from upstream.

	  Please see its details: http://blog.rubygems.org/2018/02/06/2.7.5-released.html

	test_gem_util.rb: fix broken test

	* test/rubygems/test_gem_util.rb: no guarantee that tmpdir is
	  always underneath the root directory at all.

	test_gem_commands_setup_command.rb: BUNDLER_VERS

	* test/rubygems/test_gem_commands_setup_command.rb: run bundled
	  gem command, instead of installed one.

	no need to set bundled bundler unless Gem::USE_BUNDLER_FOR_GEMDEPS


	revert r62302 and force to define the version constant


	Merge RubyGems 2.7.6 from upstream.

	  It fixed some security vulnerabilities.

	  http://blog.rubygems.org/2018/02/15/2.7.6-released.html

	fix regexp literal warning.

	test/rubygems/test_gem_server.rb: eliminate duplicated character class warning.
	[Bug #14481]

	Remove unnecessary `[]`s
------------------------------------------------------------------------
r62835 | naruse | 2018-03-19 17:15:50 +0900 (Mon, 19 Mar 2018) | 2 lines

Merge r62197 to ease next merge

------------------------------------------------------------------------
r62834 | naruse | 2018-03-19 17:15:16 +0900 (Mon, 19 Mar 2018) | 20 lines

merge revision(s) 61501,61758: [Backport #14481]

	fix concurrent test.

	* test/rubygems/test_require.rb (test_concurrent_require):
	  Synchronizations should be in ensure clause. Sometimes
	  `require` fails (not sure why) and latch is not released.
	  Such case introduces unlimited awaiting.
	  This patch soleve this problem.


	skip some tests so that no failure occurs in root privilege

	Some tests had failed on `sudo make test-all`, mainly because root can
	access any files regardless of permission.  This change adds `skip`
	guards into such tests.

	Note that almost all tests in which `skip` guards is added, already have
	"windows" guard.  This is because there is no support to avoid read
	access by owner on Windows.
------------------------------------------------------------------------
r62761 | naruse | 2018-03-15 16:35:54 +0900 (Thu, 15 Mar 2018) | 15 lines

merge revision(s) 62394,62395: [Backport #14469]

	vm_insnhelper.c: rb_autoloading_value flag

	* vm_insnhelper.c (vm_get_ev_const): add flag argument of
	  `rb_autoloading_value`.

	* constant.h (rb_autoloading_value): moved the declaration from
	  vm_core.h for `rb_const_flag_t`.  [ruby-core:85516] [Bug #14469]

	variable.c: flags at autoloading

	* variable.c (const_tbl_update): flags by deprecate_constant /
	  private_constant set during autoloading should be preserved
	  after required.  [ruby-core:85516] [Bug #14469]
------------------------------------------------------------------------
r62632 | naruse | 2018-03-02 17:25:51 +0900 (Fri, 02 Mar 2018) | 13 lines

merge revision(s) 62606,62607: [Backport #14557]

	file.c: get rid of useless conversion

	* file.c (rb_file_s_stat): File.stat does not accept an IO
	  object as trying conversion to path name string first.  skip
	  conversion to IO and try stat(2) only.

	file.c: realpath on special symlink

	* file.c (realpath_rec): fallback to symlink path when it is
	  accessible but the link target is not actual entry on file
	  systems.  [ruby-dev:50487] [Bug #14557]
------------------------------------------------------------------------
r62610 | naruse | 2018-02-28 18:52:40 +0900 (Wed, 28 Feb 2018) | 8 lines

merge revision(s) 62572: [Backport #14549]

	date_core.c: defensive code

	* ext/date/date_core.c (f_cmp): check comparison failure.

	* ext/date/date_core.c (d_lite_step): deal with the comparison
	  result more defensively.  [ruby-core:85796] [Bug #14549]
------------------------------------------------------------------------
r62609 | naruse | 2018-02-28 18:49:29 +0900 (Wed, 28 Feb 2018) | 12 lines

merge revision(s) 62506,62508: [Backport #14438]

	test_time_tz.rb: past Japanese DST tzdata fix

	* test/ruby/test_time_tz.rb (TestTimeTZ#test_asia_tokyo): follow
	  the tzdata 2018 fix of Japanese DST transitions (1948-1951).
	  [ruby-core:85373] [Bug #14438]

	test_time_tz.rb: past Japanese DST tzdata fix

	* test/ruby/test_time_tz.rb (TestTimeTZ#test_asia_tokyo): fix
	  the expected data at the end of DST.  [Bug #14438]
------------------------------------------------------------------------
r62587 | svn | 2018-02-26 17:43:45 +0900 (Mon, 26 Feb 2018) | 1 line

* 2018-02-26
------------------------------------------------------------------------
r62586 | naruse | 2018-02-26 17:43:44 +0900 (Mon, 26 Feb 2018) | 5 lines

merge revision(s) 62094,62584: [Backport #14407]

        Merge ruby/spec@fd56cd4


------------------------------------------------------------------------
r62569 | svn | 2018-02-25 09:36:44 +0900 (Sun, 25 Feb 2018) | 1 line

* 2018-02-25
------------------------------------------------------------------------
r62568 | naruse | 2018-02-25 09:36:43 +0900 (Sun, 25 Feb 2018) | 9 lines

merge revision(s) 62071: [Backport #14407]

	defined? returns nil for toplevel constant lookup

	* variable.c (rb_const_defined_0): toplevel constant lookup has
	  been removed, should return nil too.
	  [ruby-core:85142] [Bug #14407] [Fix GH-1800]

	From: Gonzalo <grzuy0@gmail.com>
------------------------------------------------------------------------
r62562 | naruse | 2018-02-24 16:19:48 +0900 (Sat, 24 Feb 2018) | 8 lines

merge revision(s) 62555: [Backport #14547]

	rational.c: segfault on Rational exponent

	* rational.c (read_num): fix segfault on Rational() with positive
	  but less than the length of fractional part exponent.  should be
	  negated to convert to divisor which is a reciprocal.
	  [ruby-core:85783] [Bug #14547]
------------------------------------------------------------------------
r62561 | naruse | 2018-02-24 16:19:06 +0900 (Sat, 24 Feb 2018) | 10 lines

merge revision(s) 62513: [Backport #12762]

	Update url with 404 status on LEGAL file.

	  * Update redirected and upstream url.
	  * Added the Wayback Machine url for missing link.

	  [Bug #12762][ruby-dev:49802]

	From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r62539 | naruse | 2018-02-23 07:04:35 +0900 (Fri, 23 Feb 2018) | 6 lines

merge revision(s) 61862: [Backport #14368]

	parse.y (new_regexp): Fix SEGV of `/#{"\u3042"}#{'?'}/` in non UTF-8

	Mixing other encoding string literals in one Regexp caused SEGV.
	This bug was found by CoverityScan.
------------------------------------------------------------------------
r62538 | naruse | 2018-02-23 06:41:46 +0900 (Fri, 23 Feb 2018) | 8 lines

merge revision(s) 62107: [Backport #14420]

	force fixable

	* complex.c (nucomp_hash): force hash values fixable.
	  [ruby-core:85224] [Bug #14420]

	* rational.c (nurat_hash): ditto.
------------------------------------------------------------------------
r62537 | naruse | 2018-02-23 06:29:36 +0900 (Fri, 23 Feb 2018) | 12 lines

merge revision(s) 61605,62359,62361: [Backport #14356]

	Try to fix Travis CI configuration.

	.travis.yml: send notification to #alerts

	instead of #commits.

	.travis.yml: resurrect notification to #commits

	I heard at least Shibata-san sees the channel for the notification.
	But I want #alets to have all CI failure notifications too.
------------------------------------------------------------------------
r62527 | naruse | 2018-02-22 20:01:13 +0900 (Thu, 22 Feb 2018) | 6 lines

merge revision(s) 62333: [Backport #14459]

	compile.c: popped hash

	* compile.c (compile_array): skip creating new hash if preceeding
	  elements are popped all.  [ruby-core:85486] [Bug #14459]
------------------------------------------------------------------------
r62511 | naruse | 2018-02-21 15:16:32 +0900 (Wed, 21 Feb 2018) | 8 lines

merge revision(s) 61484: [Backport #14232]

	vm_method.c: fix super in refined module

	* vm_method.c (rb_method_entry_complement_defined_class): clone
	  the original method entry of refined module instance method with
	  the active ICLASS, to track super method chain.
	  [ruby-dev:50390] [Bug #14232]
------------------------------------------------------------------------
r62510 | naruse | 2018-02-21 15:00:51 +0900 (Wed, 21 Feb 2018) | 6 lines

merge revision(s) 61469: [Backport #14427]

	irb.rb: fix highlight

	* lib/irb.rb (IRB::Irb#eval_input): fix highlight for multiple
	  lines exception messages.
------------------------------------------------------------------------
r62509 | naruse | 2018-02-21 14:42:42 +0900 (Wed, 21 Feb 2018) | 6 lines

merge revision(s) 61523: [Backport #14261]

	parse.y: assignable_error

	* parse.y (assignable_gen): should return valid NODE always even
	  on errors.  [ruby-core:84565] [Bug #14261]
------------------------------------------------------------------------
r62507 | naruse | 2018-02-21 13:36:00 +0900 (Wed, 21 Feb 2018) | 8 lines

merge revision(s) 62115: [Backport #14421]

	proc: fix super_method segfault after bind

	* proc.c: handle undefined iclass
	  [ruby-core:85231] [Bug #14421]

	From: Eric Wong <e@80x24.org>
------------------------------------------------------------------------
r62501 | naruse | 2018-02-21 05:11:47 +0900 (Wed, 21 Feb 2018) | 21 lines

merge revision(s) 62116,62151: [Backport #14425]

	ruby.h: relax rb_funcall check on extra args for clang

	clang 5.+ (tested clang 7.0.0) seems to be attempting division-by-zero
	and giving a very large number for static args to rb_funcall.

	* include/ruby/ruby.h (rb_varargs_bad_length): relax check for clang
	* ext/-test-/funcall/funcall.c: renamed from passing_block.c
	  define extra_args_name function
	* test/-ext-/funcall/test_funcall.rb: new test
	  [ruby-core:85266] [Bug #14425]

	From: Eric Wong <e@80x24.org>

	ruby.h: relax rb_funcall(obj, id, 0, 0) case only

	* include/ruby/ruby.h (rb_varargs_argc_valid_p): relax rb_funcall
	  check on extra args only if argc == 0, for the compatibility
	  with wrong code which is probably confused with rb_funcallv.
	  [Bug #14425]
------------------------------------------------------------------------
r62483 | naruse | 2018-02-19 15:51:53 +0900 (Mon, 19 Feb 2018) | 7 lines

merge revision(s) 62040: [Backport #14388]

	string.c: clear substring code range

	* string.c (str_substr): substring of broken code range string may
	  be valid or broken.  patch by tommy (Masahiro Tomita) at
	  [ruby-dev:50430] [Bug #14388].
------------------------------------------------------------------------
r62482 | naruse | 2018-02-19 15:36:03 +0900 (Mon, 19 Feb 2018) | 5 lines

merge revision(s) 61645: [Backport #14333]

	Added bundler for `test-bundled-gems` dependency.

	  rake, did_you_mean, test-unit depends on bundler.
------------------------------------------------------------------------
r62481 | naruse | 2018-02-19 15:33:01 +0900 (Mon, 19 Feb 2018) | 14 lines

merge revision(s) 61711:

	compile.c (iseq_compile_each0): remove irrelevant tracecoverage

	This change removes tracecoverage instructions on a line that has any
	NODE but is non-significant, such as, just one literal.

	This fixes the following failure that occurs only when coverage is
	enabled:

	  1) Failure:
	TestISeq#test_to_a_lines [.../ruby/test/ruby/test_iseq.rb:56]:
	<[3, 4, 7, 9]> expected but was
	<[3, 4, 5, 6, 7, 8, 9]>.
------------------------------------------------------------------------
r62472 | naruse | 2018-02-18 23:25:43 +0900 (Sun, 18 Feb 2018) | 3 lines

merge revision(s) 61591: [Backport #14312]

	iseq.c (rb_iseq_new_with_opt): handle the case where node is imemo_func
------------------------------------------------------------------------
r62471 | svn | 2018-02-18 20:53:15 +0900 (Sun, 18 Feb 2018) | 1 line

* 2018-02-18
------------------------------------------------------------------------
r62470 | naruse | 2018-02-18 20:53:14 +0900 (Sun, 18 Feb 2018) | 4 lines

Revert r62426

it cause test failure

------------------------------------------------------------------------
r62428 | naruse | 2018-02-16 17:34:45 +0900 (Fri, 16 Feb 2018) | 11 lines

merge revision(s) 61616: [Backport #14314]

	marshal.c: allow marshalling keyword_init struct

	struct.c: define rb_struct_s_keyword_init to shared with marshal.c

	internal.h: add the declaration to be used by marshal.c

	test/ruby/test_marshal.rb: add test for Bug#14314

	[Feature #14314] [ruby-core:84629]
------------------------------------------------------------------------
r62427 | naruse | 2018-02-16 17:31:35 +0900 (Fri, 16 Feb 2018) | 10 lines

merge revision(s) 61754: [Backport #14346]

	dir.c: pass flags to openat(2) correctly

	Flags are 3rd argument of openat(2) while the 4th argument
	(mode_t) is unnecessary for our uses.  This bug exists since
	Ruby 2.5 from r58860 and was discoverd by strace.

	* dir.c (nogvl_opendir_at): use openat correctly
	  [Feature #13056] [Feature #14346]
------------------------------------------------------------------------
r62426 | naruse | 2018-02-16 17:28:48 +0900 (Fri, 16 Feb 2018) | 13 lines

merge revision(s) 61617,61618: [Backport #14273]

	compile.c: remove more unreachable chunk

	* compile.c (remove_unreachable_chunk): remove beyond labels to be
	  removed.

	compile.c: fix stack consistency error

	* compile.c (iseq_peephole_optimize): fix stack consistency error
	  from return in loop, by adding extra `pop` when replacing `jump`
	  with `leave`, which is never reached but needed to adjust sp
	  calculation.  [ruby-core:84589] [Bug #14273]
------------------------------------------------------------------------
r62425 | naruse | 2018-02-16 17:17:36 +0900 (Fri, 16 Feb 2018) | 13 lines

merge revision(s) 61639: [Backport #14323]

	net/ftp: fix FrozenError in BufferedSocket

	I noticed this bug while working on something else with
	RUBYOPT=-d on, existing test cases all passed with it.

	Note: I use String.new because it is the local style, here,
	I prefer +'' (or ''.b, for a future commit)

	* lib/net/ftp.rb (BufferedSocket#read): use String.new
	* test/net/ftp/test_buffered_socket.rb (test_read_nil): new test
	  [ruby-core:84675] [Bug #14323]
------------------------------------------------------------------------
r62421 | naruse | 2018-02-16 16:36:21 +0900 (Fri, 16 Feb 2018) | 6 lines

merge revision(s) 61636: [Backport #14257]

	string.c: out-of-bounds access

	* string.c (rb_str_enumerate_lines): fix out-of-bounds access when
	  record separator is longer than the last element.  [Bug #14257]
------------------------------------------------------------------------
r62420 | naruse | 2018-02-16 16:32:11 +0900 (Fri, 16 Feb 2018) | 9 lines

merge revision(s) 61603: [Backport #14279]

	check array for zsuper. [Bug #14279]

	* compile.c (iseq_compile_each0): for zsuper (NODE_ZSUPER), we need to check
	  given argument is Array or not.

	* test/ruby/test_super.rb: add a test for this bug.

------------------------------------------------------------------------
r62096 | svn | 2018-01-30 02:00:37 +0900 (Tue, 30 Jan 2018) | 1 line

* 2018-01-30
------------------------------------------------------------------------
r62095 | naruse | 2018-01-30 02:00:36 +0900 (Tue, 30 Jan 2018) | 108 lines

merge revision(s) 61564,61565,61571: [Backport #14270]

	fix SEGV touching uninitialized memory

	This function can be called from Init_VM().
	No assumption can be made about object internals.

	(lldb) run
	Process 15734 launched: './miniruby' (x86_64)
	Process 15734 stopped
	* thread #1: tid = 0x1441d4, 0x00000001000bdfcb miniruby`rb_raw_iseq_info(buff="0x0000000100f61f48 [0    ] T_IMEMO iseq", buff_size=256, iseq=0x0000000100f61f48) + 27 at gc.c:9273, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x50)
	    frame #0: 0x00000001000bdfcb miniruby`rb_raw_iseq_info(buff="0x0000000100f61f48 [0    ] T_IMEMO iseq", buff_size=256, iseq=0x0000000100f61f48) + 27 at gc.c:9273
	   9270 static void
	   9271 rb_raw_iseq_info(char *buff, const int buff_size, const rb_iseq_t *iseq)
	   9272 {
	-> 9273     if (iseq->body->location.label) {
	   9274         VALUE path = rb_iseq_path(iseq);
	   9275         snprintf(buff, buff_size, "%s %s@%s:%d", buff,
	   9276                  RSTRING_PTR(iseq->body->location.label),
	(lldb) p *iseq
	(rb_iseq_t) $0 = {
	  flags = 28698
	  reserved1 = 0
	  body = 0x0000000000000000
	  aux = {
	    compile_data = 0x0000000000000000
	    loader = (obj = 0, index = 0)
	    trace_events = 0
	  }
	}
	(lldb) bt
	* thread #1: tid = 0x1441d4, 0x00000001000bdfcb miniruby`rb_raw_iseq_info(buff="0x0000000100f61f48 [0    ] T_IMEMO iseq", buff_size=256, iseq=0x0000000100f61f48) + 27 at gc.c:9273, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x50)
	  * frame #0: 0x00000001000bdfcb miniruby`rb_raw_iseq_info(buff="0x0000000100f61f48 [0    ] T_IMEMO iseq", buff_size=256, iseq=0x0000000100f61f48) + 27 at gc.c:9273
	    frame #1: 0x00000001000bde72 miniruby`rb_raw_obj_info(buff="0x0000000100f61f48 [0    ] T_IMEMO iseq", buff_size=256, obj=4311097160) + 2786 at gc.c:9396
	    frame #2: 0x00000001000b7c5f miniruby`obj_info(obj=4311097160) + 95 at gc.c:9428
	    frame #3: 0x00000001000c16a8 miniruby`newobj_init(klass=0, flags=28698, v1=0, v2=0, v3=0, wb_protected=1, objspace=0x00000001007ee280, obj=4311097160) + 424 at gc.c:1887
	    frame #4: 0x00000001000b44c9 miniruby`newobj_of(klass=0, flags=28698, v1=0, v2=0, v3=0, wb_protected=1) + 217 at gc.c:1970
	    frame #5: 0x00000001000b464b miniruby`rb_imemo_new(type=imemo_iseq, v1=0, v2=0, v3=0, v0=0) + 75 at gc.c:2017
	    frame #6: 0x00000001000fd914 miniruby`iseq_imemo_alloc + 36 at iseq.h:156
	    frame #7: 0x00000001000f6e1d miniruby`iseq_alloc + 13 at iseq.c:211
	    frame #8: 0x00000001000f6bf8 miniruby`rb_iseq_new_with_opt(node=0x0000000000000000, name=4311097200, path=4311097200, realpath=8, first_lineno=1, parent=0x0000000000000000, type=ISEQ_TYPE_TOP, option=0x0000000100335c30) + 56 at iseq.c:519
	    frame #9: 0x00000001000f6bb6 miniruby`rb_iseq_new(node=0x0000000000000000, name=4311097200, path=4311097200, realpath=8, parent=0x0000000000000000, type=ISEQ_TYPE_TOP) + 86 at iseq.c:480
	    frame #10: 0x0000000100284bb0 miniruby`Init_VM + 1040 at vm.c:3022
	    frame #11: 0x00000001000d4f7d miniruby`rb_call_inits + 189 at inits.c:55
	    frame #12: 0x000000010009fe06 miniruby`ruby_setup + 198 at eval.c:61
	    frame #13: 0x000000010009fe5d miniruby`ruby_init + 13 at eval.c:78
	    frame #14: 0x00000001000009ed miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 93 at main.c:41
	    frame #15: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb)

	fix SEGV touching uninitialized memory

	This function can be called from rb_data_typed_object_zalloc().
	No assumption can be made about object internals.

	(lldb) run
	Process 22135 launched: './miniruby' (x86_64)
	Process 22135 stopped
	* thread #1: tid = 0x14a3af, 0x000000010008ac8a miniruby`vm_block_type(block=0x0000000000000000) + 12 at vm_core.h:1364, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
	    frame #0: 0x000000010008ac8a miniruby`vm_block_type(block=0x0000000000000000) + 12 at vm_core.h:1364
	   1361         break;
	   1362     }
	   1363 #endif
	-> 1364     return block->type;
	   1365 }
	   1366
	   1367 static inline void
	(lldb) bt
	* thread #1: tid = 0x14a3af, 0x000000010008ac8a miniruby`vm_block_type(block=0x0000000000000000) + 12 at vm_core.h:1364, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
	  * frame #0: 0x000000010008ac8a miniruby`vm_block_type(block=0x0000000000000000) + 12 at vm_core.h:1364
	    frame #1: 0x000000010008acdb miniruby`vm_block_iseq(block=0x0000000000000000) + 24 at vm_core.h:1399
	    frame #2: 0x000000010008acc1 miniruby`vm_proc_iseq(procval=4310866360) + 32 at vm_core.h:1387
	    frame #3: 0x000000010009cbed miniruby`rb_raw_obj_info(buff="0x0000000100f299b8 [0    ] proc (Proc)", buff_size=256, obj=4310866360) + 1513 at gc.c:9349
	    frame #4: 0x000000010009cf01 miniruby`obj_info(obj=4310866360) + 98 at gc.c:9428
	    frame #5: 0x000000010008ca1b miniruby`newobj_init(klass=4311027960, flags=12, v1=4298186080, v2=1, v3=0, wb_protected=32, objspace=0x00000001007cf280, obj=4310866360) + 338 at gc.c:1887
	    frame #6: 0x000000010008cce5 miniruby`newobj_of(klass=4311027960, flags=12, v1=4298186080, v2=1, v3=0, wb_protected=32) + 171 at gc.c:1970
	    frame #7: 0x000000010008d01d miniruby`rb_data_typed_object_wrap(klass=4311027960, datap=0x0000000000000000, type=0x0000000100311d60) + 133 at gc.c:2062
	    frame #8: 0x000000010008d04e miniruby`rb_data_typed_object_zalloc(klass=4311027960, size=40, type=0x0000000100311d60) + 42 at gc.c:2073
	    frame #9: 0x000000010011b459 miniruby`rb_proc_alloc(klass=4311027960) + 36 at proc.c:113
	    frame #10: 0x0000000100204d8e miniruby`vm_proc_create_from_captured(klass=4311027960, captured=0x00000001025003f8, block_type=block_type_iseq, is_from_method='\0', is_lambda='\x01') + 44 at vm.c:814
	    frame #11: 0x00000001002050d8 miniruby`rb_vm_make_proc_lambda(ec=0x00000001007cf548, captured=0x00000001025003f8, klass=4311027960, is_lambda='\x01') + 134 at vm.c:892
	    frame #12: 0x000000010011c0d2 miniruby`proc_new(klass=4311027960, is_lambda='\x01') + 445 at proc.c:752
	    frame #13: 0x000000010011c154 miniruby`rb_block_lambda + 27 at proc.c:808
	    frame #14: 0x00000001001ee7e3 miniruby`call_cfunc_0(func=(miniruby`rb_block_lambda at proc.c:807), recv=4310991600, argc=0, argv=0x0000000102400480) + 41 at vm_insnhelper.c:1729
	    frame #15: 0x00000001001ef2c3 miniruby`vm_call_cfunc_with_frame(ec=0x00000001007cf548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd4d0, ci=0x0000000102537be0, cc=0x000000010253e0f0) + 386 at vm_insnhelper.c:1918
	    frame #16: 0x00000001001ef412 miniruby`vm_call_cfunc(ec=0x00000001007cf548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd4d0, ci=0x0000000102537be0, cc=0x000000010253e0f0) + 149 at vm_insnhelper.c:1934
	    frame #17: 0x00000001001f0655 miniruby`vm_call_method_each_type(ec=0x00000001007cf548, cfp=0x00000001025003e0, calling=0x00007fff5fbfd4d0, ci=0x0000000102537be0, cc=0x000000010253e0f0) + 239 at vm_insnhelper.c:2232
	    frame #18: 0x00000001001f0ce0 miniruby`vm_call_method(ec=0x00000001007cf548, cfp=0x00000001025003e0, calling=0x00007fff5fbfd4d0, ci=0x0000000102537be0, cc=0x000000010253e0f0) + 117 at vm_insnhelper.c:2355
	    frame #19: 0x00000001001f0eb6 miniruby`vm_call_general(ec=0x00000001007cf548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd4d0, ci=0x0000000102537be0, cc=0x000000010253e0f0) + 59 at vm_insnhelper.c:2398
	    frame #20: 0x00000001001f6e61 miniruby`vm_exec_core(ec=0x00000001007cf548, initial=0) + 7480 at insns.def:850
	    frame #21: 0x0000000100207995 miniruby`vm_exec(ec=0x00000001007cf548) + 230 at vm.c:1771
	    frame #22: 0x0000000100208647 miniruby`rb_iseq_eval_main(iseq=0x0000000100f29fd0) + 52 at vm.c:2019
	    frame #23: 0x000000010007b750 miniruby`ruby_exec_internal(n=0x0000000100f29fd0) + 297 at eval.c:246
	    frame #24: 0x000000010007b876 miniruby`ruby_exec_node(n=0x0000000100f29fd0) + 36 at eval.c:310
	    frame #25: 0x000000010007b849 miniruby`ruby_run_node(n=0x0000000100f29fd0) + 62 at eval.c:302
	    frame #26: 0x0000000100000c05 miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 113 at main.c:42
	    frame #27: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb)

	check an existence of block.

	* gc.c (rb_raw_obj_info): check block before using it.

	* vm_core.h (vm_block_iseq): r61565 introduced NULL check but this
	  check is only needed by `rb_raw_obj_info()` and it is called at GC
	  debug mode. Above fix for `rb_raw_obj_info()` solves this problem and
	  NULL check should not be needed any more.

------------------------------------------------------------------------
r62023 | naruse | 2018-01-24 17:11:16 +0900 (Wed, 24 Jan 2018) | 292 lines

merge revision(s) 61562,61563,61566,61568,61569: [Backport #14269]

	fix SEGV touching uninitialized memory

	This function can be called from boot_defclass().
	No assumption can be made about object internals.

	(lldb) run
	Process 2386 launched: './miniruby' (x86_64)
	Process 2386 stopped
	* thread #1: tid = 0x13f3b6, 0x00000001001e0b26 miniruby`rb_class_path_cached(klass=4311373720) + 20 at variable.c:321, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
	    frame #0: 0x00000001001e0b26 miniruby`rb_class_path_cached(klass=4311373720) + 20 at variable.c:321
	   318  VALUE
	   319  rb_class_path_cached(VALUE klass)
	   320  {
	-> 321      st_table *ivtbl = RCLASS_IV_TBL(klass);
	   322      st_data_t n;
	   323
	   324      if (!ivtbl) return Qnil;
	(lldb) bt
	* thread #1: tid = 0x13f3b6, 0x00000001001e0b26 miniruby`rb_class_path_cached(klass=4311373720) + 20 at variable.c:321, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
	  * frame #0: 0x00000001001e0b26 miniruby`rb_class_path_cached(klass=4311373720) + 20 at variable.c:321
	    frame #1: 0x000000010009cbd0 miniruby`rb_raw_obj_info(buff="0x0000000100fa5798 [2    ] T_CLASS", buff_size=256, obj=4311373720) + 1393 at gc.c:9341
	    frame #2: 0x000000010009cf16 miniruby`obj_info(obj=4311373720) + 98 at gc.c:9423
	    frame #3: 0x000000010008ca87 miniruby`newobj_init(klass=0, flags=66, v1=0, v2=0, v3=0, wb_protected=1, objspace=0x00000001007cf280, obj=4311373720) + 338 at gc.c:1887
	    frame #4: 0x000000010008cd51 miniruby`newobj_of(klass=0, flags=66, v1=0, v2=0, v3=0, wb_protected=1) + 171 at gc.c:1970
	    frame #5: 0x000000010008ce1b miniruby`rb_wb_protected_newobj_of(klass=0, flags=66) + 54 at gc.c:1990
	    frame #6: 0x0000000100027563 miniruby`class_alloc(flags=2, klass=0) + 46 at class.c:165
	    frame #7: 0x000000010002761a miniruby`rb_class_boot(super=0) + 35 at class.c:203
	    frame #8: 0x0000000100028612 miniruby`boot_defclass(name="BasicObject", super=0) + 28 at class.c:537
	    frame #9: 0x000000010002868b miniruby`Init_class_hierarchy + 26 at class.c:548
	    frame #10: 0x00000001000efe69 miniruby`InitVM_Object + 9 at object.c:3892
	    frame #11: 0x00000001000f138e miniruby`Init_Object + 57 at object.c:4122
	    frame #12: 0x00000001000a59bd miniruby`rb_call_inits + 29 at inits.c:23
	    frame #13: 0x000000010007af30 miniruby`ruby_setup + 229 at eval.c:61
	    frame #14: 0x000000010007af7e miniruby`ruby_init + 13 at eval.c:78
	    frame #15: 0x0000000100000c58 miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 88 at main.c:41
	    frame #16: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb)

	fix SEGV touching uninitialized memory

	This function can be called from InitVM_Object().
	No assumption can be made about object internals.

	(lldb) run
	Process 10675 launched: './miniruby' (x86_64)
	Process 10675 stopped
	* thread #1: tid = 0x14252c, 0x00000001000bdda9 miniruby`rb_raw_obj_info(buff="0x0000000100fc1588 [0    ] T_IMEMO ment", buff_size=256, obj=4311487880) + 2489 at gc.c:9383, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
	    frame #0: 0x00000001000bdda9 miniruby`rb_raw_obj_info(buff="0x0000000100fc1588 [0    ] T_IMEMO ment", buff_size=256, obj=4311487880) + 2489 at gc.c:9383
	   9380                 const rb_method_entry_t *me = &RANY(obj)->as.imemo.ment;
	   9381                 snprintf(buff, buff_size, "%s (called_id: %s, type: %s, alias: %d, owner: %s, defined_class: %s)", buff,
	   9382                          rb_id2name(me->called_id),
	-> 9383                          method_type_name(me->def->type),
	   9384                          me->def->alias_count,
	   9385                          obj_info(me->owner),
	   9386                          obj_info(me->defined_class));
	(lldb) p *me
	(rb_method_entry_t) $0 = {
	  flags = 24602
	  defined_class = 4311488400
	  def = 0x0000000000000000
	  called_id = 3057
	  owner = 4311488400
	}
	(lldb) bt
	* thread #1: tid = 0x14252c, 0x00000001000bdda9 miniruby`rb_raw_obj_info(buff="0x0000000100fc1588 [0    ] T_IMEMO ment", buff_size=256, obj=4311487880) + 2489 at gc.c:9383, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
	  * frame #0: 0x00000001000bdda9 miniruby`rb_raw_obj_info(buff="0x0000000100fc1588 [0    ] T_IMEMO ment", buff_size=256, obj=4311487880) + 2489 at gc.c:9383
	    frame #1: 0x00000001000b7cbf miniruby`obj_info(obj=4311487880) + 95 at gc.c:9423
	    frame #2: 0x00000001000c16a8 miniruby`newobj_init(klass=4311488400, flags=24602, v1=0, v2=3057, v3=4311488400, wb_protected=1, objspace=0x00000001007ee280, obj=4311487880) + 424 at gc.c:1887
	    frame #3: 0x00000001000b4529 miniruby`newobj_of(klass=4311488400, flags=24602, v1=0, v2=3057, v3=4311488400, wb_protected=1) + 217 at gc.c:1970
	    frame #4: 0x00000001000b46ab miniruby`rb_imemo_new(type=imemo_ment, v1=0, v2=3057, v3=4311488400, v0=4311488400) + 75 at gc.c:2017
	    frame #5: 0x00000001002773b4 miniruby`rb_method_entry_alloc(called_id=3057, owner=4311488400, defined_class=4311488400, def=0x0000000000000000) + 52 at vm_method.c:368
	    frame #6: 0x0000000100277307 miniruby`rb_method_entry_create(called_id=3057, klass=4311488400, visi=METHOD_VISI_PRIVATE, def=0x0000000000000000) + 71 at vm_method.c:389
	    frame #7: 0x00000001002784c7 miniruby`rb_method_entry_make(klass=4311488400, mid=3057, defined_class=4311488400, visi=METHOD_VISI_PRIVATE, type=VM_METHOD_TYPE_CFUNC, def=0x0000000000000000, original_id=3057, opts=0x00007fff5fbfd9e8) + 1207 at vm_method.c:594
	    frame #8: 0x00000001002770f9 miniruby`rb_add_method(klass=4311488400, mid=3057, type=VM_METHOD_TYPE_CFUNC, opts=0x00007fff5fbfd9e8, visi=METHOD_VISI_PRIVATE) + 73 at vm_method.c:650
	    frame #9: 0x000000010027708a miniruby`rb_add_method_cfunc(klass=4311488400, mid=3057, func=(miniruby`rb_obj_dummy at object.c:1125), argc=0, visi=METHOD_VISI_PRIVATE) + 138 at vm_method.c:137
	    frame #10: 0x00000001000391e4 miniruby`rb_define_private_method(klass=4311488400, name="initialize", func=(miniruby`rb_obj_dummy at object.c:1125), argc=0) + 68 at class.c:1529
	    frame #11: 0x000000010013f5bf miniruby`InitVM_Object + 47 at object.c:3905
	    frame #12: 0x0000000100142ffd miniruby`Init_Object + 61 at object.c:4122
	    frame #13: 0x00000001000d4edd miniruby`rb_call_inits + 29 at inits.c:23
	    frame #14: 0x000000010009fe66 miniruby`ruby_setup + 198 at eval.c:61
	    frame #15: 0x000000010009febd miniruby`ruby_init + 13 at eval.c:78
	    frame #16: 0x0000000100000a4d miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 93 at main.c:41
	    frame #17: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb)

	fix SEGV touching uninitialized local variable

	This imemo_name is used uninitialized because the switch
	above does not cover all possible imemo types.

	(lldb) run
	Process 26068 launched: './miniruby' (x86_64)
	Process 26068 stopped
	* thread #1: tid = 0x14ba96, 0x00007fff8a402132 libsystem_c.dylib`strlen + 18, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xfffffffffffffff0)
	    frame #0: 0x00007fff8a402132 libsystem_c.dylib`strlen + 18
	libsystem_c.dylib`strlen:
	->  0x7fff8a402132 <+18>: pcmpeqb (%rdi), %xmm0
	    0x7fff8a402136 <+22>: pmovmskb %xmm0, %esi
	    0x7fff8a40213a <+26>: andq   $0xf, %rcx
	    0x7fff8a40213e <+30>: orq    $-0x1, %rax
	(lldb) bt
	* thread #1: tid = 0x14ba96, 0x00007fff8a402132 libsystem_c.dylib`strlen + 18, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xfffffffffffffff0)
	  * frame #0: 0x00007fff8a402132 libsystem_c.dylib`strlen + 18
	    frame #1: 0x00000001001f1531 miniruby`BSD_vfprintf(fp=0x00007fff5fbfc9e0, fmt0="%s %s", ap=0x00007fff5fbfcbf0) + 5873 at vsnprintf.c:1026
	    frame #2: 0x00000001001ef213 miniruby`ruby_do_vsnprintf(str="0x0000000100f46450 [0    ] T_IMEMO", n=256, fmt="%s %s", ap=0x00007fff5fbfcbf0) + 131 at sprintf.c:1285
	    frame #3: 0x00000001001ef3ea miniruby`ruby_snprintf(str="0x0000000100f46450 [0    ] T_IMEMO", n=256, fmt="%s %s") + 426 at sprintf.c:1300
	    frame #4: 0x00000001000bdc61 miniruby`rb_raw_obj_info(buff="0x0000000100f46450 [0    ] T_IMEMO", buff_size=256, obj=4310983760) + 2353 at gc.c:9376
	    frame #5: 0x00000001000b7bff miniruby`obj_info(obj=4310983760) + 95 at gc.c:9428
	    frame #6: 0x00000001000c1658 miniruby`newobj_init(klass=0, flags=36890, v1=0, v2=4303040512, v3=4310983800, wb_protected=1, objspace=0x00000001007ee280, obj=4310983760) + 424 at gc.c:1887
	    frame #7: 0x00000001000b4469 miniruby`newobj_of(klass=0, flags=36890, v1=0, v2=4303040512, v3=4310983800, wb_protected=1) + 217 at gc.c:1970
	    frame #8: 0x00000001000b45eb miniruby`rb_imemo_new(type=imemo_ast, v1=0, v2=4303040512, v3=4310983800, v0=0) + 75 at gc.c:2017
	    frame #9: 0x000000010011daed miniruby`rb_ast_new + 61 at node.c:1146
	    frame #10: 0x0000000100160e15 miniruby`rb_parser_compile_file_path(vparser=4310984400, fname=4310984960, file=4310984080, start=1) + 53 at parse.y:5776
	    frame #11: 0x00000001001e18ea miniruby`load_file_internal(argp_v=140734799795024) + 1834 at ruby.c:1907
	    frame #12: 0x00000001000a1bb5 miniruby`rb_ensure(b_proc=(miniruby`load_file_internal at ruby.c:1795), data1=140734799795024, e_proc=(miniruby`restore_load_file at ruby.c:2007), data2=140734799795024) + 245 at eval.c:1037
	    frame #13: 0x00000001001df4a4 miniruby`load_file(parser=4310984400, fname=4310984960, f=4310984080, script=1, opt=0x00007fff5fbfda28) + 100 at ruby.c:2026
	    frame #14: 0x00000001001e084e miniruby`process_options(argc=0, argv=0x00007fff5fbfdc00, opt=0x00007fff5fbfda28) + 3454 at ruby.c:1682
	    frame #15: 0x00000001001dfaae miniruby`ruby_process_options(argc=2, argv=0x00007fff5fbfdbf0) + 238 at ruby.c:2257
	    frame #16: 0x000000010009ff43 miniruby`ruby_options(argc=2, argv=0x00007fff5fbfdbf0) + 211 at eval.c:105
	    frame #17: 0x0000000100000989 miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 105 at main.c:42
	    frame #18: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb) up 4
	frame #4: 0x00000001000bdc61 miniruby`rb_raw_obj_info(buff="0x0000000100f46450 [0    ] T_IMEMO", buff_size=256, obj=4310983760) + 2353 at gc.c:9376
	   9373 #undef IMEMO_NAME
	   9374               default: UNREACHABLE;
	   9375             }
	-> 9376             snprintf(buff, buff_size, "%s %s", buff, imemo_name);
	   9377
	   9378             switch (imemo_type(obj)) {
	   9379               case imemo_ment: {
	(lldb) p imemo_name
	(const char *) $0 = 0xffffffffffffffff
	(lldb) p imemo_type(obj)
	(imemo_type) $1 = imemo_ast
	(lldb)

	fix SEGV inspecting already freed objects

	obj_info() assumes the given object is alive.  Passing freed
	objects to it results in SEGV.

	(lldb) run
	Process 29718 launched: './miniruby' (x86_64)
	Process 29718 stopped
	* thread #1: tid = 0x3082c5, 0x00000001000bfaab miniruby`pathobj_path(pathobj=4478683640) + 70 at vm_core.h:269, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
	    frame #0: 0x00000001000bfaab miniruby`pathobj_path(pathobj=4478683640) + 70 at vm_core.h:269
	   266      }
	   267      else {
	   268          VM_ASSERT(RB_TYPE_P(pathobj, T_ARRAY));
	-> 269          return RARRAY_AREF(pathobj, PATHOBJ_PATH);
	   270      }
	   271  }
	   272
	(lldb) bt
	* thread #1: tid = 0x3082c5, 0x00000001000bfaab miniruby`pathobj_path(pathobj=4478683640) + 70 at vm_core.h:269, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
	  * frame #0: 0x00000001000bfaab miniruby`pathobj_path(pathobj=4478683640) + 70 at vm_core.h:269
	    frame #1: 0x00000001000c25ff miniruby`rb_iseq_path(iseq=0x000000010af34a20) + 32 at iseq.c:723
	    frame #2: 0x000000010009db09 miniruby`rb_raw_iseq_info(buff="0x000000010af34a20 [1    ] T_IMEMO iseq", buff_size=256, iseq=0x000000010af34a20) + 69 at gc.c:9274
	    frame #3: 0x000000010009e45a miniruby`rb_raw_obj_info(buff="0x000000010af34a20 [1    ] T_IMEMO iseq", buff_size=256, obj=4478683680) + 2191 at gc.c:9397
	    frame #4: 0x000000010009e4d5 miniruby`obj_info(obj=4478683680) + 98 at gc.c:9429
	    frame #5: 0x0000000100091ae3 miniruby`gc_page_sweep(objspace=0x00000001007d3280, heap=0x00000001007d32a0, sweep_page=0x000000010ae07bc0) + 622 at gc.c:3529
	    frame #6: 0x000000010009206a miniruby`gc_sweep_step(objspace=0x00000001007d3280, heap=0x00000001007d32a0) + 188 at gc.c:3705
	    frame #7: 0x0000000100092254 miniruby`gc_sweep_continue(objspace=0x00000001007d3280, heap=0x00000001007d32a0) + 133 at gc.c:3772
	    frame #8: 0x000000010008d7f9 miniruby`heap_prepare(objspace=0x00000001007d3280, heap=0x00000001007d32a0) + 48 at gc.c:1746
	    frame #9: 0x000000010008d8a1 miniruby`heap_get_freeobj_from_next_freepage(objspace=0x00000001007d3280, heap=0x00000001007d32a0) + 37 at gc.c:1769
	    frame #10: 0x000000010008d98d miniruby`heap_get_freeobj(objspace=0x00000001007d3280, heap=0x00000001007d32a0) + 83 at gc.c:1803
	    frame #11: 0x000000010008dcb0 miniruby`newobj_slowpath(klass=4334386280, flags=5, v1=0, v2=0, v3=0, objspace=0x00000001007d3280, wb_protected=1) + 220 at gc.c:1930
	    frame #12: 0x000000010008dd6c miniruby`newobj_slowpath_wb_protected(klass=4334386280, flags=5, v1=0, v2=0, v3=0, objspace=0x00000001007d3280) + 76 at gc.c:1942
	    frame #13: 0x000000010008dea1 miniruby`newobj_of(klass=4334386280, flags=5, v1=0, v2=0, v3=0, wb_protected=1) + 221 at gc.c:1974
	    frame #14: 0x000000010008df39 miniruby`rb_wb_protected_newobj_of(klass=4334386280, flags=5) + 54 at gc.c:1990
	    frame #15: 0x0000000100195f7c miniruby`str_alloc(klass=4334386280) + 29 at string.c:692
	    frame #16: 0x0000000100195fe9 miniruby`str_new0(klass=4334386280, ptr="gitm", len=4, termlen=1) + 73 at string.c:714
	    frame #17: 0x000000010019633e miniruby`rb_enc_str_new(ptr="gitm", len=4, enc=0x00000001025d50a0) + 81 at string.c:766
	    frame #18: 0x000000010010a80a miniruby`parser_str_new(p="gitm", n=4, enc=0x00000001025d50a0, func=66, enc0=0x00000001025d50a0) + 50 at parse.y:5817
	    frame #19: 0x000000010010ce1a miniruby`parser_parse_string(parser=0x00000001042ac5c0, quote=0x000000010460c028) + 795 at parse.y:6675
	    frame #20: 0x00000001001120bd miniruby`parser_yylex(parser=0x00000001042ac5c0) + 159 at parse.y:8281
	    frame #21: 0x0000000100115068 miniruby`yylex(lval=0x00007fff5fbf9948, yylloc=0x00007fff5fbf9ab0, parser=0x00000001042ac5c0) + 55 at parse.y:8931
	    frame #22: 0x00000001000fc79f miniruby`ruby_yyparse(parser=0x00000001042ac5c0) + 1198 at parse.c:5798
	    frame #23: 0x0000000100109f5a miniruby`yycompile0(arg=4364879296) + 317 at parse.y:5595
	    frame #24: 0x0000000100214ef0 miniruby`rb_suppress_tracing(func=(miniruby`yycompile0 at parse.y:5565), arg=4364879296) + 349 at vm_trace.c:397
	    frame #25: 0x000000010010a1df miniruby`yycompile(parser=0x00000001042ac5c0, fname=4443743440, line=1) + 126 at parse.y:5637
	    frame #26: 0x000000010010a4c1 miniruby`parser_compile_string(vparser=4443743480, fname=4443743440, s=4443743520, line=1) + 191 at parse.y:5706
	    frame #27: 0x000000010010a5b7 miniruby`rb_parser_compile_string_path(vparser=4443743480, f=4443743440, s=4443743520, line=1) + 58 at parse.y:5730
	    frame #28: 0x0000000100206025 miniruby`eval_make_iseq(src=4443743520, fname=4443743440, line=1, bind=0x0000000000000000, base_block=0x00007fff5fbfb370) + 266 at vm_eval.c:1274
	    frame #29: 0x0000000100206153 miniruby`eval_string_with_cref(self=4334412520, src=4443743520, cref=0x0000000000000000, file=52, line=1) + 197 at vm_eval.c:1307
	    frame #30: 0x0000000100206389 miniruby`rb_f_eval(argc=1, argv=0x0000000102400eb8, self=4334412520) + 219 at vm_eval.c:1382
	    frame #31: 0x00000001001f247c miniruby`call_cfunc_m1(func=(miniruby`rb_f_eval at vm_eval.c:1364), recv=4334412520, argc=1, argv=0x0000000102400eb8) + 47 at vm_insnhelper.c:1723
	    frame #32: 0x00000001001f2f87 miniruby`vm_call_cfunc_with_frame(ec=0x00000001007d3548, reg_cfp=0x0000000102500d80, calling=0x00007fff5fbfbf50, ci=0x000000010263f240, cc=0x0000000100749b50) + 386 at vm_insnhelper.c:1918
	    frame #33: 0x00000001001f30d6 miniruby`vm_call_cfunc(ec=0x00000001007d3548, reg_cfp=0x0000000102500d80, calling=0x00007fff5fbfbf50, ci=0x000000010263f240, cc=0x0000000100749b50) + 149 at vm_insnhelper.c:1934
	    frame #34: 0x00000001001faf0e miniruby`vm_exec_core(ec=0x00000001007d3548, initial=0) + 8471 at insns.def:915
	    frame #35: 0x000000010020b75d miniruby`vm_exec(ec=0x00000001007d3548) + 230 at vm.c:1771
	    frame #36: 0x00000001002093f8 miniruby`invoke_block(ec=0x00000001007d3548, iseq=0x000000010252d7f0, self=4334412520, captured=0x0000000102500df8, cref=0x0000000000000000, type=572653569, opt_pc=0) + 224 at vm.c:988
	    frame #37: 0x0000000100209766 miniruby`invoke_iseq_block_from_c(ec=0x00000001007d3548, captured=0x0000000102500df8, self=4334412520, argc=0, argv=0x0000000000000000, passed_block_handler=0, cref=0x0000000000000000, is_lambda=0) + 389 at vm.c:1040
	    frame #38: 0x0000000100209824 miniruby`invoke_block_from_c_bh(ec=0x00000001007d3548, block_handler=4333768185, argc=0, argv=0x0000000000000000, passed_block_handler=0, cref=0x0000000000000000, is_lambda=0, force_blockarg=0) + 138 at vm.c:1058
	    frame #39: 0x00000001002099d0 miniruby`vm_yield(ec=0x00000001007d3548, argc=0, argv=0x0000000000000000) + 69 at vm.c:1103
	    frame #40: 0x0000000100205623 miniruby`rb_yield_0(argc=0, argv=0x0000000000000000) + 40 at vm_eval.c:970
	    frame #41: 0x0000000100205964 miniruby`loop_i + 19 at vm_eval.c:1049
	    frame #42: 0x000000010007db07 miniruby`rb_rescue2(b_proc=(miniruby`loop_i at vm_eval.c:1047), data1=0, r_proc=(miniruby`loop_stop at vm_eval.c:1056), data2=0) + 369 at eval.c:896
	    frame #43: 0x0000000100205a2e miniruby`rb_f_loop(self=4334412520) + 121 at vm_eval.c:1100
	    frame #44: 0x00000001001f24a7 miniruby`call_cfunc_0(func=(miniruby`rb_f_loop at vm_eval.c:1098), recv=4334412520, argc=0, argv=0x0000000102400e80) + 41 at vm_insnhelper.c:1729
	    frame #45: 0x00000001001f2f87 miniruby`vm_call_cfunc_with_frame(ec=0x00000001007d3548, reg_cfp=0x0000000102500de0, calling=0x00007fff5fbfd4d0, ci=0x000000010263bbf0, cc=0x0000000102642118) + 386 at vm_insnhelper.c:1918
	    frame #46: 0x00000001001f30d6 miniruby`vm_call_cfunc(ec=0x00000001007d3548, reg_cfp=0x0000000102500de0, calling=0x00007fff5fbfd4d0, ci=0x000000010263bbf0, cc=0x0000000102642118) + 149 at vm_insnhelper.c:1934
	    frame #47: 0x00000001001f4319 miniruby`vm_call_method_each_type(ec=0x00000001007d3548, cfp=0x0000000102500de0, calling=0x00007fff5fbfd4d0, ci=0x000000010263bbf0, cc=0x0000000102642118) + 239 at vm_insnhelper.c:2232
	    frame #48: 0x00000001001f4a2c miniruby`vm_call_method(ec=0x00000001007d3548, cfp=0x0000000102500de0, calling=0x00007fff5fbfd4d0, ci=0x000000010263bbf0, cc=0x0000000102642118) + 253 at vm_insnhelper.c:2366
	    frame #49: 0x00000001001f4b7a miniruby`vm_call_general(ec=0x00000001007d3548, reg_cfp=0x0000000102500de0, calling=0x00007fff5fbfd4d0, ci=0x000000010263bbf0, cc=0x0000000102642118) + 59 at vm_insnhelper.c:2398
	    frame #50: 0x00000001001fab2f miniruby`vm_exec_core(ec=0x00000001007d3548, initial=0) + 7480 at insns.def:850
	    frame #51: 0x000000010020b75d miniruby`vm_exec(ec=0x00000001007d3548) + 230 at vm.c:1771
	    frame #52: 0x000000010020c40f miniruby`rb_iseq_eval_main(iseq=0x000000010252dd90) + 52 at vm.c:2019
	    frame #53: 0x000000010007c768 miniruby`ruby_exec_internal(n=0x000000010252dd90) + 297 at eval.c:246
	    frame #54: 0x000000010007c88e miniruby`ruby_exec_node(n=0x000000010252dd90) + 36 at eval.c:310
	    frame #55: 0x000000010007c861 miniruby`ruby_run_node(n=0x000000010252dd90) + 62 at eval.c:302
	    frame #56: 0x000000010000138d miniruby`main(argc=2, argv=0x00007fff5fbfdbf0) + 113 at main.c:42
	    frame #57: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb) p ((struct RVALUE*)pathobj)->as.basic
	(RBasic) $0 = (flags = 0, klass = 4478683600)
	(lldb)

	fix SEGV inspecting uninitialized objects

	obj_info() assumes the given object is alive.  OTOH
	gc_writebarrier_incremental is called before or in middle of
	object initialization.  Can casue SEGV.

	(lldb) run
	Process 48188 launched: './miniruby' (x86_64)
	Process 48188 stopped
	* thread #1: tid = 0x30fd53, 0x00000001000bf7a9 miniruby`rb_array_const_ptr(a=5251291222225483145) + 12 at ruby.h:2072, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
	    frame #0: 0x00000001000bf7a9 miniruby`rb_array_const_ptr(a=5251291222225483145) + 12 at ruby.h:2072
	   2069 static inline const VALUE *
	   2070 rb_array_const_ptr(VALUE a)
	   2071 {
	-> 2072     return FIX_CONST_VALUE_PTR((RBASIC(a)->flags & RARRAY_EMBED_FLAG) ?
	   2073         RARRAY(a)->as.ary : RARRAY(a)->as.heap.ptr);
	   2074 }
	   2075
	(lldb) bt
	* thread #1: tid = 0x30fd53, 0x00000001000bf7a9 miniruby`rb_array_const_ptr(a=5251291222225483145) + 12 at ruby.h:2072, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
	  * frame #0: 0x00000001000bf7a9 miniruby`rb_array_const_ptr(a=5251291222225483145) + 12 at ruby.h:2072
	    frame #1: 0x00000001000bfaab miniruby`pathobj_path(pathobj=5251291222225483145) + 70 at vm_core.h:269
	    frame #2: 0x00000001000c25ff miniruby`rb_iseq_path(iseq=0x00000001025b71a8) + 32 at iseq.c:723
	    frame #3: 0x000000010009db09 miniruby`rb_raw_iseq_info(buff="0x00000001025b7158 [0    ] proc (Proc)", buff_size=256, iseq=0x00000001025b71a8) + 69 at gc.c:9274
	    frame #4: 0x000000010009e1d5 miniruby`rb_raw_obj_info(buff="0x00000001025b7158 [0    ] proc (Proc)", buff_size=256, obj=4334514520) + 1546 at gc.c:9351
	    frame #5: 0x000000010009e4d5 miniruby`obj_info(obj=4334514520) + 98 at gc.c:9429
	    frame #6: 0x0000000100096658 miniruby`gc_writebarrier_incremental(a=4334514520, b=4334514600, objspace=0x00000001007d3280) + 61 at gc.c:5963
	    frame #7: 0x00000001000968ca miniruby`rb_gc_writebarrier(a=4334514520, b=4334514600) + 127 at gc.c:6009
	    frame #8: 0x00000001001eabe0 miniruby`rb_obj_written(a=4334514520, oldv=52, b=4334514600, filename="/Users/urabe.shyouhei/data/src/pedantic/vm.c", line=821) + 72 at ruby.h:1472
	    frame #9: 0x00000001001eac2c miniruby`rb_obj_write(a=4334514520, slot=0x000000010259ff10, b=4334514600, filename="/Users/urabe.shyouhei/data/src/pedantic/vm.c", line=821) + 70 at ruby.h:1489
	    frame #10: 0x0000000100208b6f miniruby`vm_proc_create_from_captured(klass=4311027960, captured=0x0000000102500338, block_type=block_type_ifunc, is_from_method='\0', is_lambda='\x01') + 137 at vm.c:821
	    frame #11: 0x0000000100208e5c miniruby`rb_vm_make_proc_lambda(ec=0x00000001007d3548, captured=0x0000000102500338, klass=4311027960, is_lambda='\x01') + 134 at vm.c:892
	    frame #12: 0x000000010011f08e miniruby`proc_new(klass=4311027960, is_lambda='\x01') + 445 at proc.c:752
	    frame #13: 0x000000010011f110 miniruby`rb_block_lambda + 27 at proc.c:808
	    frame #14: 0x00000001001f24a7 miniruby`call_cfunc_0(func=(miniruby`rb_block_lambda at proc.c:807), recv=4310991600, argc=0, argv=0x0000000000000000) + 41 at vm_insnhelper.c:1729
	    frame #15: 0x00000001002033de miniruby`vm_call0_cfunc_with_frame(ec=0x00000001007d3548, calling=0x00007fff5fbfb080, ci=0x00007fff5fbfb070, cc=0x00007fff5fbfb0a0, argv=0x0000000000000000) + 370 at vm_eval.c:85
	    frame #16: 0x00000001002034d9 miniruby`vm_call0_cfunc(ec=0x00000001007d3548, calling=0x00007fff5fbfb080, ci=0x00007fff5fbfb070, cc=0x00007fff5fbfb0a0, argv=0x0000000000000000) + 59 at vm_eval.c:100
	    frame #17: 0x000000010020368f miniruby`vm_call0_body(ec=0x00000001007d3548, calling=0x00007fff5fbfb080, ci=0x00007fff5fbfb070, cc=0x00007fff5fbfb0a0, argv=0x0000000000000000) + 436 at vm_eval.c:131
	    frame #18: 0x000000010020326a miniruby`vm_call0(ec=0x00000001007d3548, recv=4310991600, id=2993, argc=0, argv=0x0000000000000000, me=0x0000000100f48110) + 142 at vm_eval.c:58
	    frame #19: 0x0000000100203c60 miniruby`rb_call0(ec=0x00000001007d3548, recv=4310991600, mid=2993, argc=0, argv=0x0000000000000000, scope=CALL_FCALL, self=4334514640) + 166 at vm_eval.c:296
	    frame #20: 0x0000000100204827 miniruby`rb_call(recv=4310991600, mid=2993, argc=0, argv=0x0000000000000000, scope=CALL_FCALL) + 84 at vm_eval.c:589
	    frame #21: 0x000000010020518b miniruby`rb_funcallv(recv=4310991600, mid=2993, argc=0, argv=0x0000000000000000) + 52 at vm_eval.c:815
	    frame #22: 0x000000010012242e miniruby`mlambda(method=0) + 45 at proc.c:2661
	    frame #23: 0x0000000100205bac miniruby`rb_iterate0(it_proc=(miniruby`mlambda at proc.c:2660), data1=0, ifunc=0x00000001025b71a8, ec=0x00000001007d3548) + 380 at vm_eval.c:1134
	    frame #24: 0x0000000100205d16 miniruby`rb_iterate(it_proc=(miniruby`mlambda at proc.c:2660), data1=0, bl_proc=(miniruby`bmcall at proc.c:2666), data2=4334514640) + 88 at vm_eval.c:1166
	    frame #25: 0x00000001001224c7 miniruby`method_to_proc(method=4334514640) + 43 at proc.c:2701
	    frame #26: 0x00000001001f24a7 miniruby`call_cfunc_0(func=(miniruby`method_to_proc at proc.c:2688), recv=4334514640, argc=0, argv=0x0000000102400568) + 41 at vm_insnhelper.c:1729
	    frame #27: 0x00000001001f2f87 miniruby`vm_call_cfunc_with_frame(ec=0x00000001007d3548, reg_cfp=0x0000000102500350, calling=0x00007fff5fbfc030, ci=0x0000000100f2ec70, cc=0x0000000102735718) + 386 at vm_insnhelper.c:1918
	    frame #28: 0x00000001001f30d6 miniruby`vm_call_cfunc(ec=0x00000001007d3548, reg_cfp=0x0000000102500350, calling=0x00007fff5fbfc030, ci=0x0000000100f2ec70, cc=0x0000000102735718) + 149 at vm_insnhelper.c:1934
	    frame #29: 0x00000001001f4319 miniruby`vm_call_method_each_type(ec=0x00000001007d3548, cfp=0x0000000102500350, calling=0x00007fff5fbfc030, ci=0x0000000100f2ec70, cc=0x0000000102735718) + 239 at vm_insnhelper.c:2232
	    frame #30: 0x00000001001f49a4 miniruby`vm_call_method(ec=0x00000001007d3548, cfp=0x0000000102500350, calling=0x00007fff5fbfc030, ci=0x0000000100f2ec70, cc=0x0000000102735718) + 117 at vm_insnhelper.c:2355
	    frame #31: 0x00000001001f4b7a miniruby`vm_call_general(ec=0x00000001007d3548, reg_cfp=0x0000000102500350, calling=0x00007fff5fbfc030, ci=0x0000000100f2ec70, cc=0x0000000102735718) + 59 at vm_insnhelper.c:2398
	    frame #32: 0x00000001001faf0e miniruby`vm_exec_core(ec=0x00000001007d3548, initial=0) + 8471 at insns.def:915
	    frame #33: 0x000000010020b75d miniruby`vm_exec(ec=0x00000001007d3548) + 230 at vm.c:1771
	    frame #34: 0x000000010020c3d1 miniruby`rb_iseq_eval(iseq=0x00000001007f8270) + 52 at vm.c:2008
	    frame #35: 0x00000001000caa4a miniruby`rb_load_internal0(ec=0x00000001007d3548, fname=4310799960, wrap=0) + 631 at load.c:611
	    frame #36: 0x00000001000cab36 miniruby`rb_load_internal(fname=4310799960, wrap=0) + 46 at load.c:642
	    frame #37: 0x00000001000cae1d miniruby`rb_f_load(argc=1, argv=0x00000001024004b8) + 217 at load.c:710
	    frame #38: 0x00000001001f247c miniruby`call_cfunc_m1(func=(miniruby`rb_f_load at load.c:695), recv=4311327440, argc=1, argv=0x00000001024004b8) + 47 at vm_insnhelper.c:1723
	    frame #39: 0x00000001001f2f87 miniruby`vm_call_cfunc_with_frame(ec=0x00000001007d3548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd3e0, ci=0x0000000102541070, cc=0x0000000100f9e918) + 386 at vm_insnhelper.c:1918
	    frame #40: 0x00000001001f30d6 miniruby`vm_call_cfunc(ec=0x00000001007d3548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd3e0, ci=0x0000000102541070, cc=0x0000000100f9e918) + 149 at vm_insnhelper.c:1934
	    frame #41: 0x00000001001f4319 miniruby`vm_call_method_each_type(ec=0x00000001007d3548, cfp=0x00000001025003e0, calling=0x00007fff5fbfd3e0, ci=0x0000000102541070, cc=0x0000000100f9e918) + 239 at vm_insnhelper.c:2232
	    frame #42: 0x00000001001f4a2c miniruby`vm_call_method(ec=0x00000001007d3548, cfp=0x00000001025003e0, calling=0x00007fff5fbfd3e0, ci=0x0000000102541070, cc=0x0000000100f9e918) + 253 at vm_insnhelper.c:2366
	    frame #43: 0x00000001001f4b7a miniruby`vm_call_general(ec=0x00000001007d3548, reg_cfp=0x00000001025003e0, calling=0x00007fff5fbfd3e0, ci=0x0000000102541070, cc=0x0000000100f9e918) + 59 at vm_insnhelper.c:2398
	    frame #44: 0x00000001001faf0e miniruby`vm_exec_core(ec=0x00000001007d3548, initial=0) + 8471 at insns.def:915
	    frame #45: 0x000000010020b75d miniruby`vm_exec(ec=0x00000001007d3548) + 230 at vm.c:1771
	    frame #46: 0x000000010020c40f miniruby`rb_iseq_eval_main(iseq=0x0000000100f21240) + 52 at vm.c:2019
	    frame #47: 0x000000010007c774 miniruby`ruby_exec_internal(n=0x0000000100f21240) + 297 at eval.c:246
	    frame #48: 0x000000010007c89a miniruby`ruby_exec_node(n=0x0000000100f21240) + 36 at eval.c:310
	    frame #49: 0x000000010007c86d miniruby`ruby_run_node(n=0x0000000100f21240) + 62 at eval.c:302
	    frame #50: 0x0000000100001399 miniruby`main(argc=9, argv=0x00007fff5fbfdae0) + 113 at main.c:42
	    frame #51: 0x00007fff88eda5ad libdyld.dylib`start + 1
	(lldb)
------------------------------------------------------------------------
r61661 | naruse | 2018-01-08 07:26:45 +0900 (Mon, 08 Jan 2018) | 7 lines

merge revision(s) 61561: [Backport #14272]

	fix memory leak (FOUND BY A COMPILER WARNING)

	Confusion of argument order ignores this st_free_table.
	Results in garbaged table not GCed.
	Easily noticable when you read the compiper warnings.
------------------------------------------------------------------------
r61660 | naruse | 2018-01-08 07:25:29 +0900 (Mon, 08 Jan 2018) | 10 lines

merge revision(s) 61518: [Backport #14260]

	bit fields treating negative values should be declared as signed int

	* internal.h (struct vm_ifunc_argc): Bit fields are unsigned by default.
	  For storing nagative values to bit fields, they must be declated as
	  signed int. Fix multiple test failure observed by 32-bit binaries
	  compiled with Oracle Developer Studio (Solaris Studio) 12.x on
	  Solaris 10 on sparc architecture. [Bug #14260]

------------------------------------------------------------------------
r61630 | naruse | 2018-01-06 05:40:54 +0900 (Sat, 06 Jan 2018) | 9 lines

merge revision(s) 61625,61626,61627:

	extend timeout to 15 seconds for ARMv8 environment

	Show how many seconds it timeouts

	By this we can easily extend timeout.

	Extend timeout of test_clear_unreachable_keyword_args
------------------------------------------------------------------------
r61629 | naruse | 2018-01-06 05:40:12 +0900 (Sat, 06 Jan 2018) | 8 lines

merge revision(s) 61517: [Backport #14259]

	numeric.c: Fix Integer#pow with a large Fixnum modulo

	* numeric.c: Fix Integer#pow with a large Fixnum modulo
	  [Bug #14259] [ruby-core:84562]

	* test/ruby/test_numeric.rb: add assertions for reproducing this bug.
------------------------------------------------------------------------
r61628 | naruse | 2018-01-06 05:39:03 +0900 (Sat, 06 Jan 2018) | 8 lines

merge revision(s) 61513: [Backport #14257]

	string.c: chomp rs at the end

	* string.c (rb_str_enumerate_lines): should chomp record separator
	  only, but not a newline, at the end of the receiver as well as
	  middle, if the separator is given.
	  [ruby-core:84552] [Bug #14257]
------------------------------------------------------------------------
r61583 | naruse | 2018-01-04 03:14:56 +0900 (Thu, 04 Jan 2018) | 5 lines

merge revision(s) 61507: [Backport #14247]

	Fix KeyError#{key,receiver} of Thread#fetch

	[ruby-core:84508] [Bug #14247]
------------------------------------------------------------------------
r61582 | naruse | 2018-01-04 03:12:16 +0900 (Thu, 04 Jan 2018) | 8 lines

merge revision(s) 61500: [Backport #14248]

	fix fd mask detection on os x

	This was broken in r59440 (3215b27a9abd8de793cf517f32d8901fd421eb1c)
	[Bug #14248]

	From: Stefan Kaes <skaes@railsexpress.de>
------------------------------------------------------------------------
r61581 | naruse | 2018-01-04 03:11:47 +0900 (Thu, 04 Jan 2018) | 14 lines

merge revision(s) 61497: [Backport #14243]

	erb.rb: preserve the behavior for invalid syntax

	comment. Fix regression at r58948.

	I even don't want to deprecate it because deprecation needs to lex all
	embedded Ruby script using Ripper and it would be slow.  So Let me just
	keep this behavior of Ruby 2.4. No change is the best compatibility.

	This commit stopped using String#-@ because it's harmful for "ambiguous
	first argument" warning if we really want to maintain this behavior.

	[Bug #14243]
------------------------------------------------------------------------
r61580 | naruse | 2018-01-04 03:03:49 +0900 (Thu, 04 Jan 2018) | 6 lines

merge revision(s) 61479: [Backport #14236]

	variable.c: public rb_autoload

	* variable.c (rb_autoload): restore the visibility for backward
	  compatibility.  [ruby-core:84454] [Bug #14236]
------------------------------------------------------------------------
r61579 | naruse | 2018-01-04 03:02:17 +0900 (Thu, 04 Jan 2018) | 23 lines

merge revision(s) 61471,61472: [Backport #14231]

	Use UINT128_T support flag from configure

	Current check for __uint128_t in hash.c is not valid, since it ignores
	compilers other than gcc. We hit this on lcc on e2k platform.

	Configure script properly checks from 128-bit data types support and
	sets HAVE_UINT128_T accordingly. This approach is already used within
	ruby at bignum.c, random.c, etc.

	Probably hash.c is an overlooked remnant of old days. This patch fixes
	this.

	[ruby-core:84438] [Bug #14231] [Fix GH-1781]
	From: Andrew Savchenko <bircoph@altlinux.org>

	hash.c: use uint128_t

	* hash.c (mult_and_mix): use uint128_t instead of __uint128_t.
	  [ruby-core:84438] [Bug #14231]

	From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61496 | naruse | 2017-12-27 19:25:32 +0900 (Wed, 27 Dec 2017) | 6 lines

merge revision(s) 61478: [Backport #14234]

	prelude.c.tmpl: get rid of errors with old gcc

	* template/prelude.c.tmpl: moved diagnostic pragmas outside
	  prelude_eval() for very old gcc.  [ruby-core:84449] [Bug #14234]
------------------------------------------------------------------------
r61467 | naruse | 2017-12-25 15:56:44 +0900 (Mon, 25 Dec 2017) | 2 lines

v2.5.0p0

------------------------------------------------------------------------
r61466 | naruse | 2017-12-25 15:51:11 +0900 (Mon, 25 Dec 2017) | 1 line

Release branch of Ruby 2.5
------------------------------------------------------------------------
r61465 | nobu | 2017-12-25 14:54:27 +0900 (Mon, 25 Dec 2017) | 4 lines

fix leaked fds

* lib/rubygems/command.rb (Gem::Command#invoke_with_build_args):
  restore UI and close the created SilentUI.
------------------------------------------------------------------------
r61464 | mame | 2017-12-25 14:16:05 +0900 (Mon, 25 Dec 2017) | 4 lines

doc/contributing.rdoc: Update platform maintainers

* mswin32 and Symbian OS are no longer supported
* Mac OS X was renamed
------------------------------------------------------------------------
r61463 | ko1 | 2017-12-25 13:40:42 +0900 (Mon, 25 Dec 2017) | 5 lines

Disasm output contains code range.

* iseq.c (iseq_inspect): show also code range information.
  Note that `iseq_inspect` is used only for header of disasm.

------------------------------------------------------------------------
r61462 | nobu | 2017-12-25 12:25:45 +0900 (Mon, 25 Dec 2017) | 4 lines

prelude.rb: block passing

* prelude.rb (Thread.exclusive): pass the block as a block
  argument.
------------------------------------------------------------------------
r61461 | kazu | 2017-12-25 12:01:07 +0900 (Mon, 25 Dec 2017) | 1 line

NEWS: Fix typos [ci skip]
------------------------------------------------------------------------
r61460 | nobu | 2017-12-25 11:42:13 +0900 (Mon, 25 Dec 2017) | 4 lines

prelude.c.tmpl: static literals

* template/prelude.c.tmpl (PRELUDE_STR): make string objects with
  static literals not to copy them.
------------------------------------------------------------------------
r61459 | nobu | 2017-12-25 11:09:14 +0900 (Mon, 25 Dec 2017) | 5 lines

prelude.c.tmpl: fix optimization options

* template/prelude.c.tmpl (prelude_eval): fix optimization
  options.  trace_instruction member has been removed.  filled
  coverage_enabled and debug_level members instead.
------------------------------------------------------------------------
r61458 | hsbt | 2017-12-25 09:33:19 +0900 (Mon, 25 Dec 2017) | 1 line

Added gemification entry to NEWS file.
------------------------------------------------------------------------
r61457 | ko1 | 2017-12-25 09:27:17 +0900 (Mon, 25 Dec 2017) | 10 lines

Set first line numbers for empty iseqs.

* compile.c (iseq_compile_each): for empty method, block and so on,
  `last_line` is not set so that line number of `putnil` instruction
  will be zero. This patch set `first_lineno` for such `putnil`.

  Problem is reported by deivid-rodriguez via Yuichiro Kaneko.

* test/ruby/test_iseq.rb: add a test for this spec.

------------------------------------------------------------------------
r61452 | sorah | 2017-12-25 02:55:01 +0900 (Mon, 25 Dec 2017) | 3 lines

NEWS: use of copy_file_range(2) isn't a new method

[ci skip]
------------------------------------------------------------------------
r61451 | k0kubun | 2017-12-25 02:20:04 +0900 (Mon, 25 Dec 2017) | 7 lines

NEWS: move the section to note ERB performance

I heard that notable performance improvements should be written to
"Implementation Improvements". So I put the sentence here.

Also, the sentence itself is fixed to be the same as Ruby 2.5 release
note draft's one.
------------------------------------------------------------------------
r61450 | ko1 | 2017-12-25 02:07:53 +0900 (Mon, 25 Dec 2017) | 6 lines

Remove "trace_instruction" compile option.

* iseq.h (rb_compile_option_struct): trace instruction is removed so that
  remove the trace_instruction compile option.
  Don't show warning (just ignore) for Ruby 2.5.

------------------------------------------------------------------------
r61449 | svn | 2017-12-25 01:43:17 +0900 (Mon, 25 Dec 2017) | 1 line

* 2017-12-25
------------------------------------------------------------------------
r61448 | k0kubun | 2017-12-25 01:43:17 +0900 (Mon, 25 Dec 2017) | 8 lines

NEWS: note about ERB's rendering performance

improvement.

There is no specific ticket for it, but improving the ERB's performance
was my largest passion that made me a Ruby committer.

See r58735, r58842, r58904, r58905, r58916.
------------------------------------------------------------------------
r61447 | mame | 2017-12-24 23:52:23 +0900 (Sun, 24 Dec 2017) | 1 line

NEWS: Add a brief explanation for branch and method coverage
------------------------------------------------------------------------
r61446 | nobu | 2017-12-24 19:12:21 +0900 (Sun, 24 Dec 2017) | 1 line

fix grammatical mistake [ci skip]
------------------------------------------------------------------------
r61445 | normal | 2017-12-24 17:45:21 +0900 (Sun, 24 Dec 2017) | 1 line

NEWS: updates for WEBrick [ci skip]
------------------------------------------------------------------------
r61444 | normal | 2017-12-24 17:40:11 +0900 (Sun, 24 Dec 2017) | 1 line

NEWS: fix typo [ci skip]
------------------------------------------------------------------------
r61443 | normal | 2017-12-24 17:38:43 +0900 (Sun, 24 Dec 2017) | 13 lines

webrick 1.4.2

This release removes uses of Kernel#open to avoid unintended
behaviors and make future auditing easier. [Misc #14216]

6 changes since 1.4.1:

      webrick: httpauth requires regular files
      webrick/httpservlet/cgi_runner.rb: remove unnecessary open
      webrick: WEBrick::Log requires path arg when given string
      webrick/httpservlet/*handler: use File.open
      webrick/httputils: note Kernel#open behavior
      webrick/httpservelet/cgi_runner: avoid IO#reopen on pathname
------------------------------------------------------------------------
r61442 | mrkn | 2017-12-24 15:24:57 +0900 (Sun, 24 Dec 2017) | 1 line

NEWS: update for bigdecimal 1.3.4
------------------------------------------------------------------------
r61441 | mrkn | 2017-12-24 15:22:41 +0900 (Sun, 24 Dec 2017) | 5 lines

bigdecimal: version 1.3.4

Import bigdecimal version 1.3.4.  The full commit log is here:

  https://github.com/ruby/bigdecimal/compare/v1.3.3...v1.3.4
------------------------------------------------------------------------
r61438 | kazu | 2017-12-24 11:41:00 +0900 (Sun, 24 Dec 2017) | 1 line

[DOC] Improve example of IO#pread [ci skip]
------------------------------------------------------------------------
r61437 | nobu | 2017-12-24 11:38:27 +0900 (Sun, 24 Dec 2017) | 4 lines

compile.c: toplevel return arguments

* compile.c (compile_return): evaluate arguments to top-level
  return but ignore the results.
------------------------------------------------------------------------
r61435 | nobu | 2017-12-24 11:26:22 +0900 (Sun, 24 Dec 2017) | 1 line

lib/irb.rb: highlight exceptions
------------------------------------------------------------------------
r61434 | nobu | 2017-12-24 10:52:21 +0900 (Sun, 24 Dec 2017) | 1 line

lib/irb.rb: simplified backtrace filtering
------------------------------------------------------------------------
r61433 | kazu | 2017-12-24 10:26:46 +0900 (Sun, 24 Dec 2017) | 1 line

[DOC] Use File.open with block instead of File.new without close [ci skip]
------------------------------------------------------------------------
r61432 | hsbt | 2017-12-24 08:33:09 +0900 (Sun, 24 Dec 2017) | 5 lines

Merge rdoc-6.0.1.

  It fixes an installation error of activerecord.

  https://github.com/ruby/rdoc/issues/571
------------------------------------------------------------------------
r61431 | sorah | 2017-12-24 03:17:39 +0900 (Sun, 24 Dec 2017) | 3 lines

Print backtrace in reverse order on IRB too

[Feature #8861]
------------------------------------------------------------------------
r61430 | svn | 2017-12-24 01:17:57 +0900 (Sun, 24 Dec 2017) | 1 line

* 2017-12-24
------------------------------------------------------------------------
r61429 | naruse | 2017-12-24 01:17:57 +0900 (Sun, 24 Dec 2017) | 10 lines

undef HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P on GCC 4.8

GCC 4.8 with optimization causes error if it compiles following code.
[Bug #14221]

```c
__builtin_choose_expr(__builtin_constant_p(b),0,1)
```

https://github.com/ruby/ruby/pull/1778
------------------------------------------------------------------------
r61428 | ko1 | 2017-12-23 23:48:28 +0900 (Sat, 23 Dec 2017) | 1 line

fix last commit
------------------------------------------------------------------------
r61427 | ko1 | 2017-12-23 23:46:59 +0900 (Sat, 23 Dec 2017) | 7 lines

RubyVM::InstructionSequence#trace_points.

* iseq.c (iseqw_trace_points): add `RubyVM::InstructionSequence#trace_points`
  method for tools which want to manipulate ISeq (and traces).

* test/ruby/test_iseq.rb: add a test for this method.

------------------------------------------------------------------------
r61426 | nobu | 2017-12-23 23:31:56 +0900 (Sat, 23 Dec 2017) | 6 lines

test_io_console.rb: get rid of sporadic failures

* test/io/console/test_io_console.rb (test_getpass): try to get
  rid of timing issues.

* test/io/console/test_io_console.rb (test_ioflush2): ditto.
------------------------------------------------------------------------
r61425 | ko1 | 2017-12-23 21:48:24 +0900 (Sat, 23 Dec 2017) | 7 lines

RubyVM::InstructionSequence#each_child.

* iseq.c (iseqw_each_child): add RubyVM::InstructionSequence#each_child
  method for tools which want to manipulate ISeq.

* test/ruby/test_iseq.rb: add a test for this method.

------------------------------------------------------------------------
r61424 | ko1 | 2017-12-23 20:00:48 +0900 (Sat, 23 Dec 2017) | 15 lines

revert line number spec of *return events.

* compile.c (rb_iseq_compile_node): line number spec of :return, :b_return
  and :end events of 'TracePoint` is changed for [Feature #14104].

  Quoted from [Feature #14104]:
  > Line numbers on :return/:b_return events show the last executed lines,
  > instead of end lines (without return statement).
  Note that :end event also affected.

  However, "buybug", a well-known ruby debugger depends on previous behavior
  so that I reverted this specification.

* test/ruby/test_settracefunc.rb: catch up this fix.

------------------------------------------------------------------------
r61423 | k0kubun | 2017-12-23 18:10:34 +0900 (Sat, 23 Dec 2017) | 7 lines

iseq.c: show first_lineno on iseq inspect

My motivation was to improve the output of `ruby --dump=insns xxx.rb`.
When one file has many iseqs, it's hard to find the one I want to read.

So I wanted `iseq_disasm` to show first_lineno. I unified the behavior
of `iseqw_disasm` for consistency.
------------------------------------------------------------------------
r61422 | kazu | 2017-12-23 10:53:48 +0900 (Sat, 23 Dec 2017) | 1 line

iseq.c: Remove unused macro in r61395
------------------------------------------------------------------------
r61421 | nobu | 2017-12-23 09:55:29 +0900 (Sat, 23 Dec 2017) | 5 lines

iseq.c: local variable names

* iseq.c (rb_insn_operand_intern): simplified the condition for
  local variable names, assume TS_LINDEX and TS_NUM combinations
  are only for local variables.
------------------------------------------------------------------------
r61420 | nobu | 2017-12-23 09:51:36 +0900 (Sat, 23 Dec 2017) | 4 lines

insns.def: adjust type

* insns.def (checkkeyword): adjust argument type to
  vm_check_keyword as lindex_t.
------------------------------------------------------------------------
r61419 | hsbt | 2017-12-23 09:38:52 +0900 (Sat, 23 Dec 2017) | 1 line

Avoid to warnings about gemspec loadings in rubygems tests.
------------------------------------------------------------------------
r61418 | svn | 2017-12-23 09:30:36 +0900 (Sat, 23 Dec 2017) | 1 line

* 2017-12-23
------------------------------------------------------------------------
r61417 | nobu | 2017-12-23 09:30:33 +0900 (Sat, 23 Dec 2017) | 4 lines

fix unicode data directory

* test/ruby/enc/test_regex_casefold.rb: fix searching unicode data
  directory, like as test_case_comprehensive.rb.
------------------------------------------------------------------------
r61416 | hsbt | 2017-12-23 08:08:05 +0900 (Sat, 23 Dec 2017) | 4 lines

Postponing the Bundler merge.

  I faced a big issue about Bundler with ruby core.
  I have no time to resolve it issue before 2.5 final release.
------------------------------------------------------------------------
r61415 | nobu | 2017-12-22 21:39:32 +0900 (Fri, 22 Dec 2017) | 6 lines

update unicode data files directory

* test/ruby/enc/test_case_comprehensive.rb: search ucd directory
  first if exists.

* test/ruby/enc/test_regex_casefold.rb: ditto.
------------------------------------------------------------------------
r61413 | usa | 2017-12-22 17:52:11 +0900 (Fri, 22 Dec 2017) | 7 lines

force hash values fixable

* include/ruby/ruby.h (RB_ST2FIX): force fixable on LLP64 environment.

* hash.c (any_hash): ditto.
  [ruby-core:84395] [Bug #14218]

------------------------------------------------------------------------
r61412 | glass | 2017-12-22 17:47:39 +0900 (Fri, 22 Dec 2017) | 6 lines

io.c: ignore EPERM

* io.c (nogvl_copy_file_range): ignore EPERM and fallback to
  sendfile(2) or read/write. copy_file_range(2) may not exist
  even if __NR_copy_file_range is defined in the build environment.
  [Bug #14207]
------------------------------------------------------------------------
r61411 | nobu | 2017-12-22 17:08:31 +0900 (Fri, 22 Dec 2017) | 5 lines

erb.rb: shadow by keys

* lib/erb.rb (ERB#new_toplevel): shadow already defined local
  variables by block local variabes, not to overwrite them.
  [ruby-core:84390] [Bug #14215]
------------------------------------------------------------------------
r61410 | hsbt | 2017-12-22 17:00:10 +0900 (Fri, 22 Dec 2017) | 3 lines

Bump up fileutils-1.0.2

  Added `FileUtils::VERSION` const variable.
------------------------------------------------------------------------
r61409 | normal | 2017-12-22 14:59:11 +0900 (Fri, 22 Dec 2017) | 8 lines

webrick/httpservelet/cgi_runner: avoid IO#reopen on pathname

IO#reopen seems to behave strangely on Win32 based on the logs
posted by Greg for [Bug #14420].  Lets try to fix the issue by
using File.open explicitly (but not Kernel#open).

* lib/webrick/httpservelet/cgi_runner: use File.open explicitly
  [Bug #14220]
------------------------------------------------------------------------
r61408 | ko1 | 2017-12-22 14:15:45 +0900 (Fri, 22 Dec 2017) | 6 lines

fix a test for debugging.

* test/rdoc/test_rdoc_markup_pre_process.rb: show
  `RDoc::Markup::PreProcess.post_processors` as a failure message
  for debugging.

------------------------------------------------------------------------
r61407 | kazu | 2017-12-22 12:35:54 +0900 (Fri, 22 Dec 2017) | 1 line

[DOC] StringIO#write accepts multiple arguments since r60377 [ci skip]
------------------------------------------------------------------------
r61406 | kazu | 2017-12-22 12:35:52 +0900 (Fri, 22 Dec 2017) | 1 line

[DOC] Fix indent [ci skip]
------------------------------------------------------------------------
r61405 | kazu | 2017-12-22 12:35:46 +0900 (Fri, 22 Dec 2017) | 1 line

[DOC] Remove unmatched parenthesis [ci skip]
------------------------------------------------------------------------
r61404 | nobu | 2017-12-22 10:49:00 +0900 (Fri, 22 Dec 2017) | 4 lines

ifaddr.c: get_ifaddrs

* ext/socket/ifaddr.c (get_ifaddrs): extract ifaddrs from
  Socket::Ifaddr.
------------------------------------------------------------------------
r61403 | nobu | 2017-12-22 10:12:02 +0900 (Fri, 22 Dec 2017) | 1 line

iseq.c (rb_insn_operand_intern): needs parenthesies
------------------------------------------------------------------------
r61402 | normal | 2017-12-22 10:08:05 +0900 (Fri, 22 Dec 2017) | 11 lines

webrick/httputils: note Kernel#open behavior

I don't know who uses the load_mime_types method; but it is
conceivable that a user would want to read the results of a
command instead of reading a regular file to load MIME types.

None of the WEBrick-related code in Ruby or default/bundled gems
seems to rely on this method; but it is likely 3rd-party code does.

* lib/webrick/httputils.rb (load_mime_types): note Kernel#open behavior
  [Misc #14216]
------------------------------------------------------------------------
r61401 | normal | 2017-12-22 10:08:00 +0900 (Fri, 22 Dec 2017) | 10 lines

webrick/httpservlet/*handler: use File.open

This makes future code audits easier.  None of these changes
fix realistic remote code execution vulnerabilities because
we stat(2) before attempting Kernel#open.

* lib/webrick/httpservlet/erbhandler.rb (do_GET): use File.open
* lib/webrick/httpservlet/filehandler.rb (do_GET): use File.open
  (make_partial_content): ditto
  [Misc #14216]
------------------------------------------------------------------------
r61400 | normal | 2017-12-22 10:07:55 +0900 (Fri, 22 Dec 2017) | 7 lines

webrick: WEBrick::Log requires path arg when given string

Allowing a user to specify "| command" via Kernel#open is
nonsensical since we never read from the resultant IO.

* lib/webrick/log.rb (initialize): replace Kernel#open with File.open
  [Misc #14216]
------------------------------------------------------------------------
r61399 | normal | 2017-12-22 10:07:50 +0900 (Fri, 22 Dec 2017) | 7 lines

webrick: add test for WEBrick::HTTPServlet::ERBHandler

This previously had no coverage.

* test/webrick/test_filehandler.rb (test_erbhandler): new test
* test/webrick/webrick.rhtml: new file for test
  [Misc #14216]
------------------------------------------------------------------------
r61398 | normal | 2017-12-22 10:07:45 +0900 (Fri, 22 Dec 2017) | 11 lines

webrick/httpservlet/cgi_runner.rb: remove unnecessary open

IO#reopen already takes string path names as well as IO objects
(but not "| command" strings)

This makes further auditing for inadvertant code execution
easier.  There's no actual bugfix or behavior change here,
as no external data is passed to cgi_runner.rb.

* lib/webrick/httpservlet/cgi_runner.rb: remove Kernel#open call
  [Misc #14216]
------------------------------------------------------------------------
r61397 | normal | 2017-12-22 10:07:39 +0900 (Fri, 22 Dec 2017) | 9 lines

webrick: httpauth requires regular files

Be sure we do not try to open a pipe to read from, since we care
about mtime in all cases.

* lib/webrick/httpauth/htdigest.rb: use File.open
* lib/webrick/httpauth/htgroup.rb: ditto
* lib/webrick/httpauth/htpasswd.rb: ditto
  [Misc #14216]
------------------------------------------------------------------------
r61396 | nobu | 2017-12-22 10:03:17 +0900 (Fri, 22 Dec 2017) | 4 lines

encoding.c: rb_enc_find_index2

* string.c (str_undump): use rb_enc_find_index2 to find encoding
  by unterminated string.  check the format before encoding name.
------------------------------------------------------------------------
r61395 | nobu | 2017-12-22 09:29:38 +0900 (Fri, 22 Dec 2017) | 4 lines

iseq.c: defined insn operand

* iseq.c (rb_insn_operand_intern): improve operands of defined
  instruction.
------------------------------------------------------------------------
r61394 | svn | 2017-12-22 08:28:16 +0900 (Fri, 22 Dec 2017) | 1 line

* 2017-12-22
------------------------------------------------------------------------
r61393 | shugo | 2017-12-22 08:28:15 +0900 (Fri, 22 Dec 2017) | 3 lines

Extend timeout for CI.

http://ci.rvm.jp/results/trunk-asserts-nopara@ruby-sky1/266962
------------------------------------------------------------------------
r61392 | akr | 2017-12-21 23:15:04 +0900 (Thu, 21 Dec 2017) | 5 lines

open-uri defines URI.open defined as an alias.

open-uri's Kernel.open will be deprecated in future.


------------------------------------------------------------------------
r61391 | nobu | 2017-12-21 20:59:31 +0900 (Thu, 21 Dec 2017) | 1 line

test for [Bug #14214]
------------------------------------------------------------------------
r61390 | hsbt | 2017-12-21 18:29:47 +0900 (Thu, 21 Dec 2017) | 1 line

Added detailed version of Bundler on NEWS.
------------------------------------------------------------------------
r61389 | eregon | 2017-12-21 18:29:18 +0900 (Thu, 21 Dec 2017) | 1 line

Simplify Thread#[]= spec
------------------------------------------------------------------------
r61388 | hsbt | 2017-12-21 18:22:15 +0900 (Thu, 21 Dec 2017) | 1 line

Merge release version of bundler-1.16.1 from upstream.
------------------------------------------------------------------------
r61387 | ko1 | 2017-12-21 17:29:56 +0900 (Thu, 21 Dec 2017) | 4 lines

revert r61371 for [Bug #14214]

Reverted patch doesn't check overwritten value.

------------------------------------------------------------------------
r61386 | nobu | 2017-12-21 16:59:00 +0900 (Thu, 21 Dec 2017) | 1 line

string.c: fix memory leak
------------------------------------------------------------------------
r61385 | nobu | 2017-12-21 16:50:46 +0900 (Thu, 21 Dec 2017) | 1 line

common.mk: revert r58542 [Bug #14213]
------------------------------------------------------------------------
r61384 | yui-knk | 2017-12-21 16:09:03 +0900 (Thu, 21 Dec 2017) | 1 line

iseq.c (rb_iseq_code_range): Remove needless `;`
------------------------------------------------------------------------
r61383 | mame | 2017-12-21 15:52:15 +0900 (Thu, 21 Dec 2017) | 7 lines

parse.y: change NODE_SCOPE's nd_loc to one of the parent NODE

This change (ad-hocly) adjusts the code range of NODE_SCOPE in
class/module definition because the same adjust is already done in
method definition.  I intend to just remove inconsistency between
class/module definition and method definition, but this kind of adjust
is dirty, so it should be fixed later (maybe in 2.6).
------------------------------------------------------------------------
r61382 | ko1 | 2017-12-21 15:40:28 +0900 (Thu, 21 Dec 2017) | 4 lines

add experimental API.

* iseq.c (rb_iseq_code_range): added to access iseq's code range.

------------------------------------------------------------------------
r61381 | naruse | 2017-12-21 14:09:17 +0900 (Thu, 21 Dec 2017) | 1 line

Don't allow mixed escape
------------------------------------------------------------------------
r61380 | naruse | 2017-12-21 14:09:16 +0900 (Thu, 21 Dec 2017) | 1 line

move dump format validation into parsing epilogue
------------------------------------------------------------------------
r61379 | naruse | 2017-12-21 14:08:57 +0900 (Thu, 21 Dec 2017) | 1 line

fix escapes in undump
------------------------------------------------------------------------
r61378 | sonots | 2017-12-21 14:07:43 +0900 (Thu, 21 Dec 2017) | 2 lines

* lib/logger.rb (Logger::LogDevice#open_logfile, #create_logfile):
  Logger should be able to open only files [Bug #14212]
------------------------------------------------------------------------
r61377 | tenderlove | 2017-12-21 09:40:54 +0900 (Thu, 21 Dec 2017) | 4 lines

Fix `imemo_name` to dump new imemo types

New IMEMO types were introduced, this just fixes the function that
converts the type to support the new types.
------------------------------------------------------------------------
r61376 | normal | 2017-12-21 09:26:24 +0900 (Thu, 21 Dec 2017) | 8 lines

io.c: IO#pwrite uses tmp buffer to avoid parallel modification

Since we release GVL, we must freeze and duplicate the string buffer
to prevent other threads from modifying our buffer while we are
waiting on pwrite(2).

* io.c (rb_io_pwrite): use_rb_str_tmp_frozen_{acquire/release}
  [Bug #14195]
------------------------------------------------------------------------
r61375 | ko1 | 2017-12-21 08:49:30 +0900 (Thu, 21 Dec 2017) | 5 lines

fix threading bug.

* spec/ruby/core/thread/element_set_spec.rb: `t` can be uninitialized.
  Use `Thread.current` explicitly.

------------------------------------------------------------------------
r61374 | usa | 2017-12-21 01:04:41 +0900 (Thu, 21 Dec 2017) | 10 lines

fix test errors on Windows

	* test/resolv/test_addr.rb (test_hosts_by_command): on Windows, `|` is
	  invalid charactor for path and raises `Errno::EINVAL` if trying to
	  open.

	* test/resolv/test_dns.rb (test_resolv_conf_by_command): ditto.

	cf. [Bug #14205]

------------------------------------------------------------------------
r61372 | svn | 2017-12-21 00:45:02 +0900 (Thu, 21 Dec 2017) | 1 line

* 2017-12-21
------------------------------------------------------------------------
r61371 | nobu | 2017-12-21 00:45:01 +0900 (Thu, 21 Dec 2017) | 5 lines

compile.c: branch on block param

* compile.c (compile_branch_condition): replace block param value
  in branch conditions with `defined(yield)`, to get rid of
  creating proc value.
------------------------------------------------------------------------
r61360 | nobu | 2017-12-20 23:10:06 +0900 (Wed, 20 Dec 2017) | 4 lines

iseq.c: block param name

* iseq.c (rb_insn_operand_intern): show local variable name at
  getblockparam/setblockparam too.
------------------------------------------------------------------------
r61359 | naruse | 2017-12-20 21:06:59 +0900 (Wed, 20 Dec 2017) | 3 lines

raise error if value contains CR/LF in iniheader of initialize_http_header

like r59693, initialize_http_header also should raise error. [Bug #14208]
------------------------------------------------------------------------
r61357 | stomar | 2017-12-20 18:51:29 +0900 (Wed, 20 Dec 2017) | 1 line

NEWS: update news for Psych
------------------------------------------------------------------------
r61356 | stomar | 2017-12-20 18:31:58 +0900 (Wed, 20 Dec 2017) | 1 line

NEWS: "absent operator" is now called "absence operator"
------------------------------------------------------------------------
r61355 | stomar | 2017-12-20 18:31:22 +0900 (Wed, 20 Dec 2017) | 1 line

NEWS: grammar fixes
------------------------------------------------------------------------
r61354 | hsbt | 2017-12-20 17:50:26 +0900 (Wed, 20 Dec 2017) | 1 line

Update rdoc-6.0.0 entry on NEWS file
------------------------------------------------------------------------
r61353 | mame | 2017-12-20 16:38:24 +0900 (Wed, 20 Dec 2017) | 6 lines

iseq.c (get_insn_info): use binary search instead of linear search

This change introduces get_insn_info_binary_search, which is (should be)
equivalent to the old get_insn_info.
The old get_insn_info is renamed to get_insn_info_linear_search.  When
VM_CHECK_MODE > 0, the equivalence is validated at finish_iseq_build.
------------------------------------------------------------------------
r61352 | mame | 2017-12-20 13:45:05 +0900 (Wed, 20 Dec 2017) | 3 lines

test/coverage/test_coverage.rb: make the expected value the same as 2.4

A follow up of r61350
------------------------------------------------------------------------
r61351 | nobu | 2017-12-20 13:25:01 +0900 (Wed, 20 Dec 2017) | 5 lines

Fixed command Injection

* lib/resolv.rb (Resolv::Config.parse_resolv_conf): fixed
  potential command injection by use of Kernel#open.
  [ruby-core:84347] [Bug #14205]
------------------------------------------------------------------------
r61350 | mame | 2017-12-20 13:24:14 +0900 (Wed, 20 Dec 2017) | 16 lines

compile.c: add a RUBY_EVENT_COVERAGE_LINE event for line coverage

2.5's line coverage measurement was about two times slower than 2.4
because of two reasons; (1) vm_trace uses rb_iseq_event_flags (which
takes O(n) currently where n is the length of iseq) to get an event
type, and (2) RUBY_EVENT_LINE uses setjmp to call an event hook.

This change adds a special event for line coverage,
RUBY_EVENT_COVERAGE_LINE, and adds `tracecoverage` instructions where
the event occurs in iseq.
`tracecoverage` instruction calls an event hook without vm_trace.
And, RUBY_EVENT_COVERAGE_LINE is an internal event which does not
use setjmp.

This change also cancells lineno change due to the deletion of trace
instructions [Feature #14104].  So fixes [Bug #14191].
------------------------------------------------------------------------
r61349 | nobu | 2017-12-20 13:18:31 +0900 (Wed, 20 Dec 2017) | 7 lines

Fixed command Injection

* resolv.rb (Resolv::Hosts#lazy_initialize): fixed potential
  command Injection in Hosts::new() by use of Kernel#open.
  [Fix GH-1777] [ruby-core:84347] [Bug #14205]

From: Drigg3r <drigg3r@yandex.com>
------------------------------------------------------------------------
r61348 | mame | 2017-12-20 10:51:50 +0900 (Wed, 20 Dec 2017) | 3 lines

vm_insnhelper.c (vm_trace): fix a typo

Typical code clone bug.
------------------------------------------------------------------------
r61347 | ko1 | 2017-12-20 09:24:19 +0900 (Wed, 20 Dec 2017) | 9 lines

extend timeout limit.

* test/ruby/test_process.rb (test_threading_works_after_exec_fail):
  extend timeout limit from 30 to 90 because some test nodes fails
  with timeout error.

  Also use a Queue instead of a local variable to communicate with
  threads.

------------------------------------------------------------------------
r61346 | nobu | 2017-12-20 09:09:51 +0900 (Wed, 20 Dec 2017) | 4 lines

parse.y: end of script at newline

* parse.y (parser_yylex): deal with end of script chars just after
  ignored newline as other places.  [ruby-core:84349] [Bug #14206]
------------------------------------------------------------------------
r61345 | ngoto | 2017-12-20 02:09:13 +0900 (Wed, 20 Dec 2017) | 7 lines

skip test_aspawn_too_long_path on Solaris 10 or earlier

* test/ruby/test_process.rb (TestProcess#test_aspawn_too_long_path):
  skip test_aspawn_too_long_path on Solaris 10 or earlier versions
  because they lack Process::RLIMIT_NPROC and the test creates
  extraordinary number of processes that makes the system unstable.

------------------------------------------------------------------------
r61344 | ngoto | 2017-12-20 01:55:08 +0900 (Wed, 20 Dec 2017) | 7 lines

Workaround for optimization bug of Oracle Developer Studio 12.4-12.6

* pack.c (pack_unpack, AVOID_CC_BUG): Very ugly workaround for
  optimization bug of Oracle Developer Studio (Oracle Solaris Studio)
  12.4, 12.5, and 12.6 on Solaris 10 with -xO4 optimization option.
  [Bug #11684] [ruby-core:84351]

------------------------------------------------------------------------
r61343 | svn | 2017-12-20 00:40:14 +0900 (Wed, 20 Dec 2017) | 1 line

* 2017-12-20
------------------------------------------------------------------------
r61342 | eregon | 2017-12-20 00:40:13 +0900 (Wed, 20 Dec 2017) | 4 lines

Break out of the loop after shutdown in DRbServer

* Patch by @seki:
  https://gist.github.com/seki/ae8bef20238c37c94a91b5461c4bfbdd
------------------------------------------------------------------------
r61341 | watson1978 | 2017-12-19 23:26:30 +0900 (Tue, 19 Dec 2017) | 6 lines

Revert "Improve performance of creating Hash object"

This reverts commit r61309
Because it was unstable on mswin CI.

[ruby-dev:50370][Bug #14203]
------------------------------------------------------------------------
r61340 | hsbt | 2017-12-19 21:28:18 +0900 (Tue, 19 Dec 2017) | 3 lines

Update version number of Psych

From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r61339 | hsbt | 2017-12-19 21:23:21 +0900 (Tue, 19 Dec 2017) | 3 lines

Update RubyGems entry on NEWS file.

From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r61338 | nobu | 2017-12-19 21:20:21 +0900 (Tue, 19 Dec 2017) | 9 lines

st.c: fix up

* st.c (_st_table_list, _st_table_pool): symbols beginning with an
  underscore and a lower letter are preserved by the standard.

* st.c (get_st_table): protoized.

* st.c (st_insert_generic): adjust local variable type to an
  argument argc.
------------------------------------------------------------------------
r61337 | nobu | 2017-12-19 19:46:51 +0900 (Tue, 19 Dec 2017) | 6 lines

thread_sync.c: fix rdoc

* thread_sync.c (define_thread_class): hide rb_define_class_under
  from rdoc, so that fake code to teach rdoc takes effect.

* thread_sync.c (Init_thread_sync): teach rdoc Mutex.
------------------------------------------------------------------------
r61336 | hsbt | 2017-12-19 18:44:33 +0900 (Tue, 19 Dec 2017) | 8 lines

Merge psych-3.0.2 from ruby/psych.

  It version changed fallback option to keywoad argument
  on `Yaml.load` method. It break backword compatiblity.

  see detailed discuttion: https://github.com/ruby/psych/issues/340

From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r61335 | nobu | 2017-12-19 13:57:20 +0900 (Tue, 19 Dec 2017) | 4 lines

error.c: KeyError docs [ci skip]

* error.c (key_err_receiver, key_err_key): [DOC] documents of
  KeyError methods.
------------------------------------------------------------------------
r61334 | nobu | 2017-12-19 12:17:37 +0900 (Tue, 19 Dec 2017) | 4 lines

vcs: --add-author-from

* tool/vcs.rb (VCS::GIT#commit): no --add-author-from option if
  author equals committer.
------------------------------------------------------------------------
r61333 | hsbt | 2017-12-19 12:12:22 +0900 (Tue, 19 Dec 2017) | 10 lines

Update version of strscan to 1.0.0.

  But we couldn't ship strscan (and stringio) gem. Because rubygems.org
  still masked them.

  https://github.com/rubygems/rubygems.org/pull/1696

  I'm going to ship them after it deployed.

From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r61332 | hsbt | 2017-12-19 11:43:09 +0900 (Tue, 19 Dec 2017) | 6 lines

Remove digest.gemspec for default gems.

  It needs to support header file installation and uninstallation.
  But current RubyGems didn't support it feature yet.

From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
------------------------------------------------------------------------
r61331 | nobu | 2017-12-19 11:41:37 +0900 (Tue, 19 Dec 2017) | 7 lines

compile.c: pop splat result

* compile.c (compile_array): pop splat result without creating a
  new hash if the whole hash is popped.
  [ruby-core:84340] [Bug #14201]

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61330 | nobu | 2017-12-19 10:08:52 +0900 (Tue, 19 Dec 2017) | 6 lines

Improve Array#- efficiency [Fixes GH-1756]

When doing the difference of a small array with a big one it is not
efficient in both time and memory to convert the second one to a hash.

From: Ana Maria Martinez Gomez <ammartinez@suse.de>
------------------------------------------------------------------------
r61329 | nobu | 2017-12-19 09:45:55 +0900 (Tue, 19 Dec 2017) | 7 lines

compile.c: side effect in splat

* compile.c (compile_array): splat which may have side effects
  should be compiled even if the result will be popped.
  [ruby-core:84340] [Bug #14201]

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61327 | eregon | 2017-12-19 01:41:48 +0900 (Tue, 19 Dec 2017) | 1 line

Use syswrite to avoid potential buffering in IO#select spec
------------------------------------------------------------------------
r61326 | ngoto | 2017-12-19 01:17:17 +0900 (Tue, 19 Dec 2017) | 10 lines

Support C89 if possible

* addr2line.c: Because stdbool.h is a C99 feature, compile error
  occurs with some old compilers without specifying C99 options.
  Fix compile error with Oracle Solaris Studio 12.4 on Solaris 10.
  [Bug #14200] [ruby-dev:50366]

* missing/stdbool.h: Alternative of stdbool.h for C89 compilers.


------------------------------------------------------------------------
r61325 | svn | 2017-12-19 00:46:57 +0900 (Tue, 19 Dec 2017) | 1 line

* 2017-12-19
------------------------------------------------------------------------
r61324 | ngoto | 2017-12-19 00:46:56 +0900 (Tue, 19 Dec 2017) | 6 lines

eval_error.c: Fix compile error on Solaris 10

* eval_error.c (write_warn, write_warn2, write_warn_str): Fix compile
  error "operands have incompatible types" with Oracle Solaris Studio
  12.4 on Solaris 10.

------------------------------------------------------------------------
r61323 | naruse | 2017-12-18 18:03:59 +0900 (Mon, 18 Dec 2017) | 1 line

suppress warning: 'const' attribute on function returning 'void'
------------------------------------------------------------------------
r61322 | normal | 2017-12-18 17:54:30 +0900 (Mon, 18 Dec 2017) | 5 lines

webrick 1.4.1 release

* lib/webrick/version.rb: bump version
* lib/webrick/webrick.gemspec: support Ruby 2.3+
  [Bug #14189]
------------------------------------------------------------------------
r61321 | nobu | 2017-12-18 16:39:05 +0900 (Mon, 18 Dec 2017) | 6 lines

test_io.rb: EINVAL on Windows

* test/ruby/test_io.rb (test_read_command): unusable character
  causes Errno::EINVAL on Windows.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61320 | nobu | 2017-12-18 16:15:07 +0900 (Mon, 18 Dec 2017) | 7 lines

io.c: opening external command

* io.c (rb_io_open_generic): try to open the named file as usual,
  if klass is not IO nor File, so that Errno::ENOENT will be
  raised probably.  calling on File will be same in the future.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61319 | nobu | 2017-12-18 16:10:15 +0900 (Mon, 18 Dec 2017) | 5 lines

io.c: open generic in binread

* io.c (rb_io_s_binread): fix r61317, unintentional change.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61318 | ko1 | 2017-12-18 13:42:53 +0900 (Mon, 18 Dec 2017) | 5 lines

check EOPNOTSUPP.

* test/ruby/test_file.rb (test_open_tempfile_path): skip EOPNOTSUPP
  (observed on Ubuntu 16 on Docker).

------------------------------------------------------------------------
r61317 | nobu | 2017-12-18 13:32:54 +0900 (Mon, 18 Dec 2017) | 7 lines

io.c: opening external command

* io.c (rb_io_open_generic): when external command will be invoked
  as other than IO singleton method, probably unintentionally,
  warn if it is File or raise ArgumentError.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61316 | nobu | 2017-12-18 13:23:16 +0900 (Mon, 18 Dec 2017) | 6 lines

envutil.rb: define flush method

* test/lib/envutil.rb (verbose_warning): flush is called on STDOUT
  and STDERR sometimes.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61315 | nobu | 2017-12-18 13:12:06 +0900 (Mon, 18 Dec 2017) | 3 lines

test/ruby/test_io.rb: test for r61314

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61314 | nobu | 2017-12-18 12:38:20 +0900 (Mon, 18 Dec 2017) | 6 lines

io.c: open_key_args by rb_io_open

* io.c (open_key_args): open by rb_io_open always also when
  open_args: option is given.

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61313 | mame | 2017-12-18 11:44:36 +0900 (Mon, 18 Dec 2017) | 7 lines

iseq.c (finish_iseq_build): fix coverage leakage [Bug #14191]

Before this change, coverage.so had failed to measure some multiple-line
code fragments.  This is because removing trace instructions (#14104)
changed TracePoint's lineno (new lineno), and coverage counter array was
based on old lineno.
This change initializes coverage counter array based on new lineno.
------------------------------------------------------------------------
r61312 | nobu | 2017-12-18 10:55:55 +0900 (Mon, 18 Dec 2017) | 3 lines

vcs.rb: --add-author-from option

From: Nobuyoshi Nakada <nobu@ruby-lang.org>
------------------------------------------------------------------------
r61311 | nobu | 2017-12-18 10:54:19 +0900 (Mon, 18 Dec 2017) | 1 line

st.c: no C99 comment
------------------------------------------------------------------------
r61310 | nobu | 2017-12-18 10:51:53 +0900 (Mon, 18 Dec 2017) | 5 lines

Requiring pp is not required now [ci skip]

- Followup of https://bugs.ruby-lang.org/issues/14123

From: Prathamesh Sonpatki <csonpatki@gmail.com>
------------------------------------------------------------------------
r61309 | watson1978 | 2017-12-18 10:49:33 +0900 (Mon, 18 Dec 2017) | 50 lines

Improve performance of creating Hash object

When generate Hash object, the heap area of st_table will be always allocated in internally
and seems it take a time.

To improve performance of creating Hash object,
this patch will reduce count of allocating heap areas for st_table by reuse them.

	Performance of creating Hash literal -> 1.53 times faster.

[Fix GH-1766] [ruby-core:84008] [Feature #14146]

### Environment

* OS : macOS 10.13.1
* CPU : 1.4 GHz Intel Core i7
* Compiler : Apple LLVM version 9.0.0 (clang-900.0.39)

### Before

$ ./miniruby -v -I. -I../benchmark-ips/lib ~/tmp/bench/literal.rb
ruby 2.5.0dev (2017-11-28 hash 60926) [x86_64-darwin17]
Warming up --------------------------------------
        Hash literal    51.544k i/100ms
Calculating -------------------------------------
        Hash literal    869.132k ({U+00B1} 1.1%) i/s -      4.381M in   5.041574s

### After

$ ./miniruby -v -I. -I../benchmark-ips/lib ~/tmp/bench/literal.rb
ruby 2.5.0dev (2017-11-28 hash 60926) [x86_64-darwin17]
Warming up --------------------------------------
        Hash literal    63.068k i/100ms
Calculating -------------------------------------
        Hash literal      1.328M ({U+00B1} 2.3%) i/s -      6.685M in   5.037861s

### Test code

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Hash literal" do |loop|
    count = 0
    while count < loop
      hash = {foo: 12, bar: 34, baz: 56}

      count += 1
    end
  end
end
------------------------------------------------------------------------
r61308 | usa | 2017-12-18 03:43:49 +0900 (Mon, 18 Dec 2017) | 5 lines

`BASERUBY` may be not available when building from tarball

* common.mk ($(REVISION_H)): revert a part of r61055 because this obstructs
  building ruby from tarball in clean (no ruby) environment.

------------------------------------------------------------------------
r61307 | svn | 2017-12-18 03:19:42 +0900 (Mon, 18 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r61306 | svn | 2017-12-18 03:19:42 +0900 (Mon, 18 Dec 2017) | 1 line

* 2017-12-18
------------------------------------------------------------------------
r61305 | marcandre | 2017-12-18 03:19:41 +0900 (Mon, 18 Dec 2017) | 1 line

Integer#{any|all|no}_bits: Fix coercion. Add specs [#12753]
------------------------------------------------------------------------
r61304 | nobu | 2017-12-17 20:13:23 +0900 (Sun, 17 Dec 2017) | 4 lines

common.mk: exts-note [ci skip]

* common.mk (exts-note): show notes of non-configured extension
  libraries.
------------------------------------------------------------------------
r61303 | nobu | 2017-12-17 18:40:19 +0900 (Sun, 17 Dec 2017) | 4 lines

thread.c: adjusted [ci skip]

* thread.c (timeval_add): adjusted indent and parenthesized in
  braces.
------------------------------------------------------------------------
r61302 | normal | 2017-12-17 17:26:17 +0900 (Sun, 17 Dec 2017) | 7 lines

thread.c: fix overly long Thread#join w/ timeout

* test/ruby/test_thread.rb (test_signal_at_join): test with timeout
* thread.c (sleep_wait_for_interrupt): remove
  (thread_join_sleep): use native_sleep directly to avoid extra
  missing thread status change
  [Bug #14181]
------------------------------------------------------------------------
r61301 | normal | 2017-12-17 17:26:12 +0900 (Sun, 17 Dec 2017) | 8 lines

thread.c: hoist out timeval arithmetic functions

timeval arithmetic may be reused in other places and this
makes sleep_timeval easier-to-read.

* thread.c (timeval_add): hoist out of sleep_timeval
  (timeval_update_expire): ditto
  (sleep_timeval): use new functions
------------------------------------------------------------------------
r61300 | svn | 2017-12-17 14:35:28 +0900 (Sun, 17 Dec 2017) | 1 line

* 2017-12-17
------------------------------------------------------------------------
r61299 | nobu | 2017-12-17 14:35:28 +0900 (Sun, 17 Dec 2017) | 4 lines

vm_method.c: empty table

* vm_method.c (prepare_callable_method_entry): empty method table
  has no entries.
------------------------------------------------------------------------
r61298 | nobu | 2017-12-17 14:35:27 +0900 (Sun, 17 Dec 2017) | 4 lines

vm_method.c: debug message

* vm_method.c (method_definition_addref_complement): fix debug
  message, show complemented_count instead of alias_count.
------------------------------------------------------------------------
r61297 | nobu | 2017-12-16 22:25:11 +0900 (Sat, 16 Dec 2017) | 9 lines

ruby.c: script __dir__ encoding

* ruby.c (process_options): fallback to the encoding of the script
  name since rb_realpath_internal() cannot convert the encoding
  when it is ASCII-8BIT.

* test/ruby/test_rubyoptions.rb (test___dir__encoding): explicitly
  pass environment variables for locale as they are overriden by
  invoke_ruby.
------------------------------------------------------------------------
r61296 | k0kubun | 2017-12-16 22:02:25 +0900 (Sat, 16 Dec 2017) | 10 lines

vm.c: always export rb_frame_method_id_and_class

Functions declared in include/ruby/backward.h is exported only when
the condition `!defined RUBY_EXPORT && !defined RUBY_NO_OLD_COMPATIBILITY`
is met (i.e. included by include/ruby/ruby.h).

So if it is not the case when ruby is built, this will not be exported.
This was not intentional at r60994.

[Bug #14192]
------------------------------------------------------------------------
r61295 | usa | 2017-12-16 15:05:16 +0900 (Sat, 16 Dec 2017) | 5 lines

should install after test

* common.mk (love): should install after test (but this change does not gurantee
  the order).

------------------------------------------------------------------------
r61294 | usa | 2017-12-16 10:56:14 +0900 (Sat, 16 Dec 2017) | 4 lines

aliases

* tool/merger.rb: aliases for removetag command.

------------------------------------------------------------------------
r61292 | mame | 2017-12-16 09:39:34 +0900 (Sat, 16 Dec 2017) | 5 lines

random.c: make sure that Random.urandom returns required-length buffer

getrandom(2) and read(2) (from /dev/urandom) may return a random buffer
whose length is shorter than required.  This change makes sure that they
get enough buffer by using a loop.
------------------------------------------------------------------------
r61291 | nobu | 2017-12-16 09:36:31 +0900 (Sat, 16 Dec 2017) | 4 lines

test_vm_dump.rb: skip if gcc

* test/ruby/test_vm_dump.rb (assert_darwin_vm_dump_works): gcc seems
  not to chain some frames like Apple's clang.
------------------------------------------------------------------------
r61290 | nobu | 2017-12-16 09:30:52 +0900 (Sat, 16 Dec 2017) | 4 lines

string.c: multiple codepoints

* string.c (undump_after_backslash): fix multiple codepoints in
  braces.
------------------------------------------------------------------------
r61289 | nobu | 2017-12-16 09:03:51 +0900 (Sat, 16 Dec 2017) | 4 lines

string.c: suppress warning

* string.c (str_undump): suppress maybe-uninitialized warning by
  gcc 7 and later.
------------------------------------------------------------------------
r61288 | normal | 2017-12-16 06:55:50 +0900 (Sat, 16 Dec 2017) | 3 lines

NEWS: update for WEBrick Proc body responses

Better late than never :x [Feature #855]
------------------------------------------------------------------------
r61287 | normal | 2017-12-16 06:49:21 +0900 (Sat, 16 Dec 2017) | 4 lines

NEWS: updates about trivial GVL release changes

No tickets, but all pretty trivial changes which avoids
stalls on slow/non-responsive filesytems.
------------------------------------------------------------------------
r61286 | marcandre | 2017-12-16 05:15:54 +0900 (Sat, 16 Dec 2017) | 1 line

lib/erb: Update doc [ci-skip] [doc]
------------------------------------------------------------------------
r61285 | eregon | 2017-12-16 02:44:37 +0900 (Sat, 16 Dec 2017) | 1 line

Update to ruby/spec@595645f
------------------------------------------------------------------------
r61284 | svn | 2017-12-16 02:44:16 +0900 (Sat, 16 Dec 2017) | 1 line

* 2017-12-16
------------------------------------------------------------------------
r61283 | eregon | 2017-12-16 02:44:15 +0900 (Sat, 16 Dec 2017) | 1 line

Update to ruby/mspec@19d929e
------------------------------------------------------------------------
r61282 | nobu | 2017-12-15 23:42:43 +0900 (Fri, 15 Dec 2017) | 4 lines

gperf.sed: static declarations

* tool/gperf.sed: comment out arguments part only, to keep the
  following declarations static.  [Feature #13883]
------------------------------------------------------------------------
r61281 | kazu | 2017-12-15 20:52:41 +0900 (Fri, 15 Dec 2017) | 4 lines

[DOC] `IO.new` accepts `external_encoding`

Revert part of r61278 [Bug #13655]
[ci skip]
------------------------------------------------------------------------
r61280 | kazu | 2017-12-15 20:52:40 +0900 (Fri, 15 Dec 2017) | 1 line

Fix typo [ci skip]
------------------------------------------------------------------------
r61279 | naruse | 2017-12-15 18:43:40 +0900 (Fri, 15 Dec 2017) | 1 line

initialize should be outside
------------------------------------------------------------------------
r61278 | naruse | 2017-12-15 17:26:33 +0900 (Fri, 15 Dec 2017) | 1 line

IO.new doesn't recive "-" as external_encoding [Bug #13655]
------------------------------------------------------------------------
r61277 | rhe | 2017-12-15 17:19:32 +0900 (Fri, 15 Dec 2017) | 5 lines

openssl: suppress report_on_exception warning

Import a commit from upstream:

	33a67ac96492 test/utils: disable Thread's report_on_exception in start_server
------------------------------------------------------------------------
r61276 | naruse | 2017-12-15 16:58:02 +0900 (Fri, 15 Dec 2017) | 1 line

check icc version inside condition
------------------------------------------------------------------------
r61275 | naruse | 2017-12-15 16:58:00 +0900 (Fri, 15 Dec 2017) | 4 lines

suppress icc warnings

* subscript out of range
* enumerated type mixed with another type
------------------------------------------------------------------------
r61274 | nobu | 2017-12-15 16:27:04 +0900 (Fri, 15 Dec 2017) | 6 lines

thread.c: fix deadlock

* thread.c (thread_join_sleep): the target thread may exit during
  `RUBY_VM_CHECK_INTS_BLOCKING`, but `sleep_forever` does not
  consider the condition change to wait.
  [ruby-core:84248] [Bug #14181]
------------------------------------------------------------------------
r61273 | mame | 2017-12-15 14:55:11 +0900 (Fri, 15 Dec 2017) | 1 line

node.c: show variable type for NODE_*ASGN
------------------------------------------------------------------------
r61272 | mame | 2017-12-15 14:55:10 +0900 (Fri, 15 Dec 2017) | 1 line

node.c (NODE_HASH): remove wrong default case
------------------------------------------------------------------------
r61271 | mame | 2017-12-15 14:55:09 +0900 (Fri, 15 Dec 2017) | 1 line

node.c: add more comment to NODE_CASE2
------------------------------------------------------------------------
r61270 | mame | 2017-12-15 14:55:08 +0900 (Fri, 15 Dec 2017) | 1 line

node.c: fix typos
------------------------------------------------------------------------
r61269 | usa | 2017-12-15 12:22:51 +0900 (Fri, 15 Dec 2017) | 4 lines

add `removetag` command

* tool/merger.rb (remove_tag): add `removetag` command.

------------------------------------------------------------------------
r61268 | nobu | 2017-12-15 12:07:10 +0900 (Fri, 15 Dec 2017) | 6 lines

thread.c: debug messages

* thread.c (terminate_all): fix funtion name in debug messages.

* thread.c (terminate_all, thread_join_sleep, thread_join): show
  the status of the target thread in debug messages.
------------------------------------------------------------------------
r61267 | usa | 2017-12-15 12:04:56 +0900 (Fri, 15 Dec 2017) | 5 lines

check the existence of specified tag

* tool/merger.rb (tag): check the existence of specified tag before tagging to
  get rid of careless mistakes.

------------------------------------------------------------------------
r61266 | normal | 2017-12-15 05:02:15 +0900 (Fri, 15 Dec 2017) | 6 lines

webrick 1.4.0 release

* lib/webrick/version.rb: change VERSION to 1.4.0
* lib/webrick/webrick.gemspec: require_relative for version,
  update date and contact info
  [Feature #13173]
------------------------------------------------------------------------
r61265 | eregon | 2017-12-15 04:26:04 +0900 (Fri, 15 Dec 2017) | 1 line

Add [Feature #14143] to NEWS
------------------------------------------------------------------------
r61263 | naruse | 2017-12-15 03:33:33 +0900 (Fri, 15 Dec 2017) | 3 lines

particular_werror_flags=no on ICC

fix r61261
------------------------------------------------------------------------
r61262 | svn | 2017-12-15 01:47:29 +0900 (Fri, 15 Dec 2017) | 1 line

* 2017-12-15
------------------------------------------------------------------------
r61261 | naruse | 2017-12-15 01:47:28 +0900 (Fri, 15 Dec 2017) | 3 lines

ICC doesn't support -Werror= but ignore

It cause warnings when ruby remove error= on compiling ext/*.
------------------------------------------------------------------------
r61242 | nagachika | 2017-12-14 22:41:30 +0900 (Thu, 14 Dec 2017) | 1 line

Fix a command injection vulnerability in Net::FTP.
------------------------------------------------------------------------
r61237 | eregon | 2017-12-14 22:08:02 +0900 (Thu, 14 Dec 2017) | 4 lines

The main Thread should have report_on_exception=true for consistency

* Adapt test and add specs.
* See [Feature #14143] [ruby-core:84227]
------------------------------------------------------------------------
r61236 | rhe | 2017-12-14 20:19:17 +0900 (Thu, 14 Dec 2017) | 1 line

NEWS: add entry for openssl
------------------------------------------------------------------------
r61235 | rhe | 2017-12-14 20:19:16 +0900 (Thu, 14 Dec 2017) | 19 lines

openssl: import v2.1.0

Import Ruby/OpenSSL 2.1.0. Commits since v2.1.0.beta2 can be found at:

	https://github.com/ruby/openssl/compare/v2.1.0.beta2...v2.1.0

----------------------------------------------------------------
Kazuki Yamaguchi (8):
      test/test_ssl: prevent changing default internal encoding
      ssl: remove a misleading comment
      pkey/ec: rearrange PKey::EC::Point#initialize
      ssl: remove unreachable code
      asn1: fix docs
      pkey/ec: add support for octet string encoding of EC point
      Ruby/OpenSSL 2.0.7
      Ruby/OpenSSL 2.1.0

eregon (1):
      Fix test-all tests to avoid creating report_on_exception warnings
------------------------------------------------------------------------
r61234 | naruse | 2017-12-14 19:38:36 +0900 (Thu, 14 Dec 2017) | 1 line

NaCl support is dropped at r60374
------------------------------------------------------------------------
r61233 | stomar | 2017-12-14 19:25:57 +0900 (Thu, 14 Dec 2017) | 1 line

numeric.c: [DOC] grammar fixes
------------------------------------------------------------------------
r61232 | stomar | 2017-12-14 19:25:17 +0900 (Thu, 14 Dec 2017) | 1 line

struct.c: [DOC] improve docs for Struct.new
------------------------------------------------------------------------
r61231 | stomar | 2017-12-14 19:24:38 +0900 (Thu, 14 Dec 2017) | 1 line

process.c: [DOC] fix grammar and double negative
------------------------------------------------------------------------
r61230 | stomar | 2017-12-14 19:23:10 +0900 (Thu, 14 Dec 2017) | 1 line

NEWS: grammar fixes
------------------------------------------------------------------------
r61229 | stomar | 2017-12-14 19:21:56 +0900 (Thu, 14 Dec 2017) | 5 lines

enum.c: improve docs for Enumerable#{any?,all?,none?,one?}

* enum.c: [DOC] reword docs for Enumerable#{any?,all?,none?,one?}
  to not mention the receiver (`enum') from call-seq, because it
  does not appear in the call-seq of the rendered HTML docs.
------------------------------------------------------------------------
r61228 | tadd | 2017-12-14 17:47:13 +0900 (Thu, 14 Dec 2017) | 2 lines

Implement String#undump to unescape String#dump-ed string
[Feature #12275] [close GH-1765]
------------------------------------------------------------------------
r61227 | mame | 2017-12-14 17:22:22 +0900 (Thu, 14 Dec 2017) | 3 lines

node.h: add nd_last_loc and nd_set_last_loc

Just refactoring.
------------------------------------------------------------------------
r61226 | usa | 2017-12-14 15:38:47 +0900 (Thu, 14 Dec 2017) | 5 lines

Thread.current.report_on_exception = false

* test/win32ole/test_win32ole.rb: set report_on_exception = false in threads
  which are expected to be throw some exceptions.

------------------------------------------------------------------------
r61225 | naruse | 2017-12-14 15:30:22 +0900 (Thu, 14 Dec 2017) | 1 line

Use string instead of regexp
------------------------------------------------------------------------
r61224 | mame | 2017-12-14 15:02:26 +0900 (Thu, 14 Dec 2017) | 5 lines

node.[ch], parse.y, compile.c: rename nd_column to nd_first_column

nd_set_column -> nd_first_set_column
nd_lineno -> nd_first_lineno
nd_set_lineno -> nd_first_set_lineno
------------------------------------------------------------------------
r61223 | mame | 2017-12-14 14:54:10 +0900 (Thu, 14 Dec 2017) | 1 line

parse.y: suppress "unused variable" warning of ripper.y
------------------------------------------------------------------------
r61222 | nobu | 2017-12-14 14:13:23 +0900 (Thu, 14 Dec 2017) | 1 line

prelude.rb: remove duplicate rdoc
------------------------------------------------------------------------
r61221 | nobu | 2017-12-14 13:40:15 +0900 (Thu, 14 Dec 2017) | 4 lines

bigdecimal: dependency

* ext/bigdecimal/extconf.rb: extconf.h depends on the gemspec
  file.  [ruby-core:84247] [Bug #14180]
------------------------------------------------------------------------
r61220 | yuki | 2017-12-14 11:29:01 +0900 (Thu, 14 Dec 2017) | 1 line

* gems/bundled_gems: Upgrade the did_you_mean gem to 1.2.0
------------------------------------------------------------------------
r61219 | hsbt | 2017-12-14 11:21:41 +0900 (Thu, 14 Dec 2017) | 1 line

Added `test-bundler` and `test-bundled-gems` to `make help` entries`.
------------------------------------------------------------------------
r61218 | knu | 2017-12-14 10:11:28 +0900 (Thu, 14 Dec 2017) | 8 lines

Allow empty path components in a URI [Bug #8352]

* generic.rb (URI::Generic#merge, URI::Generic#route_to): Fix a bug
  where a sequence of slashes in the path part gets collapsed to a
  single slash.  According to the relevant RFCs and WHATWG URL
  Standard, empty path components are simply valid and there is no
  special treatment defined for them, so we just keep them as they
  are.
------------------------------------------------------------------------
r61217 | k0kubun | 2017-12-14 01:07:52 +0900 (Thu, 14 Dec 2017) | 33 lines

iseq.c: dump type of branchiftype on disasm

This makes easier to debug scripts related to r59950.

* before

$ ./ruby --dump=insns -e '"#{a}"'
== disasm: #<ISeq:<main>@-e>============================================
0000 putobject        ""                                              (   1)[Li]
0002 putself
0003 opt_send_without_block <callinfo!mid:a, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache>
0006 dup
0007 branchiftype     5, 15
0010 dup
0011 opt_send_without_block <callinfo!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>, <callcache>
0014 tostring
0015 concatstrings    2
0017 leave

* after

$ ./ruby --dump=insns -e '"#{a}"'
== disasm: #<ISeq:<main>@-e>============================================
0000 putobject        ""                                              (   1)[Li]
0002 putself
0003 opt_send_without_block <callinfo!mid:a, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache>
0006 dup
0007 branchiftype     T_STRING, 15
0010 dup
0011 opt_send_without_block <callinfo!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>, <callcache>
0014 tostring
0015 concatstrings    2
0017 leave
------------------------------------------------------------------------
r61216 | eregon | 2017-12-14 00:59:26 +0900 (Thu, 14 Dec 2017) | 4 lines

Document how to deal with output created by Thread.report_on_exception.

* Improve and clarify the documentation of Thread.report_on_exception
  and related methods.
------------------------------------------------------------------------
r61215 | mrkn | 2017-12-14 00:36:25 +0900 (Thu, 14 Dec 2017) | 1 line

NEWS: bigdecimal 1.3.3
------------------------------------------------------------------------
r61214 | svn | 2017-12-14 00:28:31 +0900 (Thu, 14 Dec 2017) | 1 line

* 2017-12-14
------------------------------------------------------------------------
r61213 | mrkn | 2017-12-14 00:28:30 +0900 (Thu, 14 Dec 2017) | 5 lines

bigdecimal: version 1.3.3

Import bigdecimal version 1.3.3.  The full commit log is here:

  https://github.com/ruby/bigdecimal/compare/v1.3.2...v1.3.3
------------------------------------------------------------------------
r61212 | kazu | 2017-12-13 23:08:20 +0900 (Wed, 13 Dec 2017) | 3 lines

[DOC] Fix exception class [ci skip]

ref https://github.com/rurema/doctree/pull/816
------------------------------------------------------------------------
r61211 | nobu | 2017-12-13 21:06:11 +0900 (Wed, 13 Dec 2017) | 4 lines

vcs.rb: raise NotFoundError when command not found

* tool/vcs.rb (VCS#get_revisions): raise VCS::NotFoundError when
  command not found.
------------------------------------------------------------------------
r61210 | eregon | 2017-12-13 20:22:55 +0900 (Wed, 13 Dec 2017) | 1 line

Travis: the workaround needs sudo: required to work
------------------------------------------------------------------------
r61209 | eregon | 2017-12-13 20:13:55 +0900 (Wed, 13 Dec 2017) | 5 lines

Use the older Travis CI image

* The new one produces many warnings like:
  warning: Insecure world writable dir /usr/local/clang-5.0.0/bin in PATH, mode 040777
* Workaround from https://blog.travis-ci.com/2017-12-12-new-trusty-images-q4-launch
------------------------------------------------------------------------
r61208 | sorah | 2017-12-13 19:55:41 +0900 (Wed, 13 Dec 2017) | 1 line

NEWS: typo [DOC] [ci skip]
------------------------------------------------------------------------
r61207 | nobu | 2017-12-13 19:43:21 +0900 (Wed, 13 Dec 2017) | 1 line

test/ruby/test_env.rb: suppress a warning
------------------------------------------------------------------------
r61206 | nobu | 2017-12-13 19:40:54 +0900 (Wed, 13 Dec 2017) | 5 lines

test_process.rb: fix error when empty groups

* test/ruby/test_process.rb (test_maxgroups): set one element at
  least get rid of ZeroDivisionError when no process groups.
  [ruby-core:84224] [Bug #14174]
------------------------------------------------------------------------
r61205 | nobu | 2017-12-13 19:26:09 +0900 (Wed, 13 Dec 2017) | 5 lines

Ripper::Lexer bit predicates

* ext/ripper/lib/ripper/lexer.rb (Ripper::Lexer): added allbits?,
  anybits? and nobits? methods, as well as Integer.  a patch by
  aycabta.  [Feature #14170]
------------------------------------------------------------------------
r61204 | nobu | 2017-12-13 19:16:05 +0900 (Wed, 13 Dec 2017) | 1 line

process.c: adjust indent
------------------------------------------------------------------------
r61203 | eregon | 2017-12-13 18:45:48 +0900 (Wed, 13 Dec 2017) | 1 line

Avoid extra output in test_thread_interrupt_for_killed_thread
------------------------------------------------------------------------
r61202 | naruse | 2017-12-13 17:38:43 +0900 (Wed, 13 Dec 2017) | 1 line

Revert r61054
------------------------------------------------------------------------
r61201 | hsbt | 2017-12-13 14:52:47 +0900 (Wed, 13 Dec 2017) | 1 line

Bump version to etc-1.0.0 as default gems.
------------------------------------------------------------------------
r61200 | hsbt | 2017-12-13 14:24:01 +0900 (Wed, 13 Dec 2017) | 1 line

Bump version to csv-1.0.0 as default gems.
------------------------------------------------------------------------
r61199 | hsbt | 2017-12-13 11:43:38 +0900 (Wed, 13 Dec 2017) | 4 lines

Modify git clone command

  The previous git clone command is not work, the protocol in URL should be https
  [fix GH-1772]
------------------------------------------------------------------------
r61198 | yui-knk | 2017-12-13 10:10:27 +0900 (Wed, 13 Dec 2017) | 4 lines

parse.y: Revert r61196

* parse.y: Because top_stmts is generated from none (not "/* none */"),
  @0 is not set by YYLLOC_DEFAULT. So @0 is a meaningless location.
------------------------------------------------------------------------
r61197 | normal | 2017-12-13 09:38:08 +0900 (Wed, 13 Dec 2017) | 13 lines

webrick: compile RE correctly for beginning and end match

Using ^ and $ in regexps means we can accidentally get fooled
by "%0a" in HTTP request paths being decoded to newline
characters.  Use \A and \z to match beginning and end-of-string
respectively, instead.

Thanks to mame and hsbt for reporting.

* lib/webrick/httpserver.rb (MountTable#compile):
  use \A and \z instead of ^ and $
* lib/webrick/httpserver.rb (MountTable#normalize): use \z instead of $
* test/webrick/test_httpserver.rb (test_cntrl_in_path): new test
------------------------------------------------------------------------
r61196 | yui-knk | 2017-12-13 08:48:50 +0900 (Wed, 13 Dec 2017) | 20 lines

parse.y: Fix the locations of an empty script

* parse.y: Fix the locations of NODE_BEGIN in
  an empty script.

  ```
  ruby --dump=p -e ''
  ```

  * Before

  ```
  NODE_BEGIN (line: 1, code_range: (1,1)-(1,1))
  ```

  * After

  ```
  NODE_BEGIN (line: 1, code_range: (1,0)-(1,0))
  ```
------------------------------------------------------------------------
r61195 | eregon | 2017-12-13 08:41:50 +0900 (Wed, 13 Dec 2017) | 5 lines

Capture the values of globals in EnvUtil to restore to the original

* Avoids the thread-safety issues mentioned in r61192,
  when thread concurrently modify default Encodings or $VERBOSE.
  Their state will always be the original one once the test finishes.
------------------------------------------------------------------------
r61194 | eregon | 2017-12-13 08:41:34 +0900 (Wed, 13 Dec 2017) | 3 lines

Revert r61192 and r61193

* More general fix coming.
------------------------------------------------------------------------
r61193 | eregon | 2017-12-13 07:37:40 +0900 (Wed, 13 Dec 2017) | 3 lines

Use EnvUtil.with_default_external in tests needing it

* Reverts part of r54522.
------------------------------------------------------------------------
r61192 | eregon | 2017-12-13 06:51:53 +0900 (Wed, 13 Dec 2017) | 11 lines

Do not change Encoding.default_internal in assert_raise_with_message

* It is not thread-safe: if two threads call it concurrently,
  the default_internal Encoding might not be restored, which causes
  many problems. The same applies for $VERBOSE, which might also not be
  restored to its original value but to the new value instead.
  This happens because reading the original value might capture the
  value already changed by EnvUtil.with_default_internal in another
  Thread. One solution could be to capture the value of these globals
  before running the test.
* Reverts part of r54522.
------------------------------------------------------------------------
r61191 | eregon | 2017-12-13 06:32:13 +0900 (Wed, 13 Dec 2017) | 4 lines

Check that global encodings are not changed in test-all

* Check that Encoding.default_internal and Encoding.default_external
  are the same before and after every test.
------------------------------------------------------------------------
r61190 | eregon | 2017-12-13 05:09:36 +0900 (Wed, 13 Dec 2017) | 3 lines

Remove useless assertion in TestThread#test_handle_interrupt_blocking

* It was originally th.join(0.2), but th.join never returns nil.
------------------------------------------------------------------------
r61189 | eregon | 2017-12-13 04:48:32 +0900 (Wed, 13 Dec 2017) | 3 lines

Handle exception explicitly in TestBignum#test_interrupt_during_to_s

* Otherwise it produces a warning with Thread.report_on_exception=true.
------------------------------------------------------------------------
r61188 | eregon | 2017-12-13 03:44:49 +0900 (Wed, 13 Dec 2017) | 6 lines

Fix test-all tests to avoid creating report_on_exception warnings

* The warnings are shown by Thread.report_on_exception defaulting to
  true. [Feature #14143] [ruby-core:83979]
* Improves tests by narrowing down the scope where an exception
  is expected.
------------------------------------------------------------------------
r61187 | eregon | 2017-12-13 03:44:33 +0900 (Wed, 13 Dec 2017) | 3 lines

Remove extra assert_nil in Rinda tests

* They are never executed since thread_join() raises.
------------------------------------------------------------------------
r61186 | eregon | 2017-12-13 03:44:21 +0900 (Wed, 13 Dec 2017) | 3 lines

Fix tests which fail with extra stderr output when a Thread dies

* [Feature #14143] [ruby-core:83979].
------------------------------------------------------------------------
r61185 | eregon | 2017-12-13 03:44:07 +0900 (Wed, 13 Dec 2017) | 5 lines

Rescue expected Interrupt in TupleSpaceTestModule#test_take_bug_8215

* test/rinda/test_rinda.rb (test_take_bug_8215): add rescue for
  expected exception, which removes the warning by
  Thread.report_on_exception [Feature #14143].
------------------------------------------------------------------------
r61184 | eregon | 2017-12-13 03:43:55 +0900 (Wed, 13 Dec 2017) | 7 lines

Avoid creating a Thread for shutting down a DRbServer

* lib/drb/drb.rb: avoid creating a Thread and call the shutdown logic
  directly. Do not try to kill or join the current Thread.
  Thread.new { stop_service } caused "can't alloc thread (ThreadError)",
  which is shown with Thread.report_on_exception = true.
  [Bug #14171]
------------------------------------------------------------------------
r61183 | eregon | 2017-12-13 03:43:42 +0900 (Wed, 13 Dec 2017) | 11 lines

Set Thread.report_on_exception=true by default to report exceptions in Threads

* [Feature #14143] [ruby-core:83979]
* vm.c (vm_init2): Set Thread.report_on_exception to true.
* thread.c (thread_start_func_2): Add indication the message is caused
  by report_on_exception = true.
* spec/ruby: Specify the new behavior.
* test/ruby/test_thread.rb: Adapt and improve tests for
  Thread.report_on_exception and Thread#report_on_exception.
* test/ruby/test_thread.rb, test/ruby/test_exception.rb: Unset
  report_on_exception for tests expecting no extra output.
------------------------------------------------------------------------
r61182 | k0kubun | 2017-12-13 00:12:05 +0900 (Wed, 13 Dec 2017) | 9 lines

struct.c: don't explain implementation details

of keyword_init option. [DOC] [ci skip]

It's implemented to take Hash, but it's just implementation detail and
it's intended to behave in the same way as keyword arguments (for
:keyword_init option too).

Also I unified coding style of r61137 with other places.
------------------------------------------------------------------------
r61181 | k0kubun | 2017-12-13 00:03:45 +0900 (Wed, 13 Dec 2017) | 14 lines

struct.c: show `keyword_init: true` on inspect

for debugging if it's specified for the Struct class.
This follows up r61137.

We don't provide a method to check it because I don't think of any use
case, but showing this to inspect would be helpful for debugging if
someone is debugging whether keyword_init is properly enabled or not.

In this commit, I didn't show `keyword_init: false` because of backward
compatibility. Ideally any application should not depend on the behavior
of inspect, but I don't have strong motivation to break it too.

[close GH-1773]
------------------------------------------------------------------------
r61180 | usa | 2017-12-13 00:02:51 +0900 (Wed, 13 Dec 2017) | 10 lines

set ino at `File.lstat` on Windows

* win32/win32.c (winnt_stat): support symbolic link and others.

* win32/win32.c (w32_stati128, wstati128, name_for_stat, rb_w32_{,ul}stati128,
  wutimensat): follow above change.
  [Feature #14169]

  From: Takehiro Kubo kubo@jiubao.org

------------------------------------------------------------------------
r61179 | kazu | 2017-12-13 00:01:13 +0900 (Wed, 13 Dec 2017) | 1 line

Add more example of `Enumerable#one?` [ci skip]
------------------------------------------------------------------------
r61178 | kazu | 2017-12-13 00:01:11 +0900 (Wed, 13 Dec 2017) | 1 line

pattern and modulo are not keyword argument [ci skip]
------------------------------------------------------------------------
r61177 | kazu | 2017-12-13 00:01:10 +0900 (Wed, 13 Dec 2017) | 1 line

Fix typos [ci skip]
------------------------------------------------------------------------
r61176 | kazu | 2017-12-13 00:01:08 +0900 (Wed, 13 Dec 2017) | 3 lines

atime,mtime,ctime of File::Stat are instance methods

[ci skip]
------------------------------------------------------------------------
r61175 | kazu | 2017-12-13 00:01:07 +0900 (Wed, 13 Dec 2017) | 11 lines

Remove unnecessary `:`

Before:

`.../irb/init.rb:280: warning: :LoadError: cannot load such file -- hoge`

After:

`.../irb/init.rb:280: warning: LoadError: cannot load such file -- hoge`

[ci skip]
------------------------------------------------------------------------
r61174 | kazu | 2017-12-13 00:01:04 +0900 (Wed, 13 Dec 2017) | 3 lines

Use printf instead of puts and sprintf

[ci skip]
------------------------------------------------------------------------
r61173 | svn | 2017-12-13 00:01:03 +0900 (Wed, 13 Dec 2017) | 1 line

* 2017-12-13
------------------------------------------------------------------------
r61172 | kazu | 2017-12-13 00:01:02 +0900 (Wed, 13 Dec 2017) | 3 lines

[DOC] Process.last_status may return nil

[ci skip]
------------------------------------------------------------------------
r61171 | yui-knk | 2017-12-12 23:47:34 +0900 (Tue, 12 Dec 2017) | 25 lines

parse.y: Change the last location of none

* parse.y: Change the last location of none to be
  equal to the first location of none.
  Sometimes none has length (`parser->tokp` does not
  match `lex_p` when none is generated).
  This leads to invalid code_ranges.

  e.g. The locations of the NODE_CALL (:sort) is fixed:

  ```
  x.sort.join(" ")
  ```

  * Before

  ```
  NODE_CALL (line: 1, code_range: (1,0)-(1,7))
  ```

  * After

  ```
  NODE_CALL (line: 1, code_range: (1,0)-(1,6))
  ```
------------------------------------------------------------------------
r61170 | yui-knk | 2017-12-12 23:21:20 +0900 (Tue, 12 Dec 2017) | 3 lines

parse.y: Set locations of nd_body in NODE_ITER explicitly

* parse.y: Same as r61168, but for brace_block.
------------------------------------------------------------------------
r61169 | hsbt | 2017-12-12 23:10:43 +0900 (Tue, 12 Dec 2017) | 6 lines

Revert "switch from http to https for Unicode data file downloads"

This reverts commit 90de118a75921a08497b41de2950971073b3c924.

  The environment of mswinci couldn't handle https download.
  (It's certificates problem, We should upgrade its environment)
------------------------------------------------------------------------
r61168 | yui-knk | 2017-12-12 23:10:23 +0900 (Tue, 12 Dec 2017) | 11 lines

parse.y: Set locations of nd_body in NODE_ITER explicitly

* parse.y: Currently the location of do_body is set
  by new_do_body. Sometimes the last part of do_body is
  none, because bodystmt ends with opt_ensure.
  Token keyword_end has been looked ahead when a tokenizer
  generates none, so the last location of opt_ensure matches
  the last location of `end`. But this relation will be
  broken when we change the last location of none to be equal to
  the first location of none. So set locations of nd_body in
  NODE_ITER explicitly.
------------------------------------------------------------------------
r61167 | k0kubun | 2017-12-12 22:56:48 +0900 (Tue, 12 Dec 2017) | 9 lines

irb/test_init.rb: add test to ensure $0

is not changed.

At first `ARGV.unshift('something')` was suggested for r61149,
but it wasn't sufficient because it modifies $0.

Not only to preserve ARGV, but also r61149 intends to preserve $0.
This test prevents future breakage of the behavior.
------------------------------------------------------------------------
r61166 | k0kubun | 2017-12-12 22:47:46 +0900 (Tue, 12 Dec 2017) | 6 lines

test_struct.rb: rename constants to clarify

the intention. Follows up r61137.

They were forgotten to be renamed when :keyword_args is renamed to
:keyword_init.
------------------------------------------------------------------------
r61165 | yui-knk | 2017-12-12 22:19:40 +0900 (Tue, 12 Dec 2017) | 5 lines

ext/coverage/coverage.c: Add test cases

* ext/coverage/coverage.c (test_method_coverage_for_define_method):
  Add test cases for method coverages which test do-end block
  define_method.
------------------------------------------------------------------------
r61164 | svn | 2017-12-12 22:07:08 +0900 (Tue, 12 Dec 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r61163 | sorah | 2017-12-12 22:07:06 +0900 (Tue, 12 Dec 2017) | 1 line

NEWS: polish
------------------------------------------------------------------------
r61162 | ko1 | 2017-12-12 21:40:41 +0900 (Tue, 12 Dec 2017) | 6 lines

ignore lines (to catch up r61155).

* spec/ruby/library/net/ftp/return_code_spec.rb: check message body only.

* spec/ruby/library/net/http/http/set_debug_output_spec.rb: ditto.

------------------------------------------------------------------------
r61161 | sorah | 2017-12-12 21:17:38 +0900 (Tue, 12 Dec 2017) | 4 lines

error.c(rb_error_write): Remove ec_ from its name

It's unrelated to rb_execution_context_t during writing the patch
r61154
------------------------------------------------------------------------
r61160 | a_matsuda | 2017-12-12 21:12:40 +0900 (Tue, 12 Dec 2017) | 1 line

NEWS for Method#===
------------------------------------------------------------------------
r61159 | a_matsuda | 2017-12-12 21:12:39 +0900 (Tue, 12 Dec 2017) | 1 line

Unneeded assertion
------------------------------------------------------------------------
r61158 | a_matsuda | 2017-12-12 21:12:38 +0900 (Tue, 12 Dec 2017) | 3 lines

Add Method#=== that invokes #call

Patch by osyo via [Feature #14142]
------------------------------------------------------------------------
r61157 | sorah | 2017-12-12 21:10:21 +0900 (Tue, 12 Dec 2017) | 1 line

hotfix implicit-function-declaration
------------------------------------------------------------------------
r61156 | shyouhei | 2017-12-12 21:10:20 +0900 (Tue, 12 Dec 2017) | 2 lines

NEWS entry for [Feature #12882]

------------------------------------------------------------------------
r61155 | shyouhei | 2017-12-12 20:56:25 +0900 (Tue, 12 Dec 2017) | 27 lines

Add uplevel keyword to Kernel#warn and use it

If uplevel keyword is given, the warning message is prepended
with caller file and line information and the string "warning: ".
The use of the uplevel keyword makes Kernel#warn format output
similar to how rb_warn formats output.

This patch modifies net/ftp and net/imap to use Kernel#warn
instead of $stderr.puts or $stderr.printf, since they are used
for printing warnings.

This makes lib/cgi/core and tempfile use $stderr.puts instead of
warn for debug logging, since they are used for debug printing
and not for warning.

This does not modify bundler, rubygems, or rdoc, as those are
maintained outside of ruby and probably wish to remain backwards
compatible with older ruby versions.

rb_warn_m code is originally from nobu, but I've changed it
so that it only includes the path and lineno from uplevel
(not the method), and also prepends the string "warning: ",
to make it more similar to rb_warn.

From: Jeremy Evans code@jeremyevans.net
Signed-off-by: Urabe Shyouhei shyouhei@ruby-lang.org

------------------------------------------------------------------------
r61154 | sorah | 2017-12-12 20:47:16 +0900 (Tue, 12 Dec 2017) | 6 lines

error.c(exc_full_message): Exception#full_message

Add a method to retrieve a String expression of an exception,
formatted in the same way that Ruby prints an uncaught exception out.

[Feature #14141]
------------------------------------------------------------------------
r61153 | usa | 2017-12-12 20:43:18 +0900 (Tue, 12 Dec 2017) | 4 lines

remove unused variable

thanks kubo-san. c.f. [ruby-dev:50345]

------------------------------------------------------------------------
r61152 | shyouhei | 2017-12-12 20:33:26 +0900 (Tue, 12 Dec 2017) | 2 lines

NEWS entry for FrozenError [Feature #13224]

------------------------------------------------------------------------
r61151 | k0kubun | 2017-12-12 20:32:37 +0900 (Tue, 12 Dec 2017) | 1 line

irb/init.rb: make sure ARGV refers to toplevel one
------------------------------------------------------------------------
r61150 | svn | 2017-12-12 20:25:17 +0900 (Tue, 12 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r61149 | k0kubun | 2017-12-12 20:25:16 +0900 (Tue, 12 Dec 2017) | 12 lines

irb.rb: preserve ARGV on binding.irb

This is not perfectly good solution (at least we don't want to have ARGV
as default value of `argv` argument), but unfortunately IRB.setup and
IRB.parse_opts are public methods and we can't make breaking change to
those methods.

We may deprecate using them and then make them private in the future,
but the removal should not be in Ruby 2.5. So I kept their interface for
now.

[Bug #14162] [close GH-1770]
------------------------------------------------------------------------
r61148 | hsbt | 2017-12-12 19:57:58 +0900 (Tue, 12 Dec 2017) | 4 lines

Bump version to fileutils-1.0.1.

  Update source code url metadata on rubygems.org.
  [Feature #13197][ruby-core:79455]
------------------------------------------------------------------------
r61147 | naruse | 2017-12-12 18:12:14 +0900 (Tue, 12 Dec 2017) | 1 line

Integer#allbits?, Integer#anybits?, Integer#nobits? [Feature #12753]
------------------------------------------------------------------------
r61146 | hsbt | 2017-12-12 18:01:34 +0900 (Tue, 12 Dec 2017) | 1 line

Bump version to fileutils-1.0.0 as default gems.
------------------------------------------------------------------------
r61145 | duerst | 2017-12-12 18:00:20 +0900 (Tue, 12 Dec 2017) | 2 lines

switch from http to https for Unicode data file downloads
(patch from MSP-Greg (Greg L), this closes issue #13962)
------------------------------------------------------------------------
r61144 | mrkn | 2017-12-12 18:00:19 +0900 (Tue, 12 Dec 2017) | 1 line

NEWS: mention Process.last_status
------------------------------------------------------------------------
r61143 | mrkn | 2017-12-12 18:00:17 +0900 (Tue, 12 Dec 2017) | 7 lines

process.c: add Process.last_status

* process.c (proc_s_last_status): add Process.last_status
  [ruby-core:83514] [Feature #14043]

* test/ruby/test_process.rb (test_last_status): add a test case for
  Process.last_status.
------------------------------------------------------------------------
r61142 | yui-knk | 2017-12-12 17:54:34 +0900 (Tue, 12 Dec 2017) | 20 lines

parse.y: Fix the locations of NODE_ITER (cmd_brace_block)

* parse.y: Update the locations of NODE_ITER
  when nd_iter is determined.

  ```
  a (1) {|i|}
  ```

  * Before

  ```
  NODE_ITER (line: 1, code_range: (1,6)-(1,10))
  ```

  * After

  ```
  NODE_ITER (line: 1, code_range: (1,0)-(1,11))
  ```
------------------------------------------------------------------------
r61141 | duerst | 2017-12-12 17:35:08 +0900 (Tue, 12 Dec 2017) | 1 line

mention support of emoji-related Unicode character properties in NEWS
------------------------------------------------------------------------
r61140 | svn | 2017-12-12 17:34:14 +0900 (Tue, 12 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r61139 | hsbt | 2017-12-12 17:34:13 +0900 (Tue, 12 Dec 2017) | 1 line

Ignore gemspec under the lib directory for documentation.
------------------------------------------------------------------------
r61138 | k0kubun | 2017-12-12 17:27:33 +0900 (Tue, 12 Dec 2017) | 1 line

NEWS: add entry for r61137
------------------------------------------------------------------------
r61137 | k0kubun | 2017-12-12 17:12:43 +0900 (Tue, 12 Dec 2017) | 5 lines

struct.c: add keyword_init option to Struct.new

to initialize struct with keyword arguments.

[Feature #11925] [close GH-1771]
------------------------------------------------------------------------
r61136 | svn | 2017-12-12 15:15:45 +0900 (Tue, 12 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r61135 | svn | 2017-12-12 15:15:45 +0900 (Tue, 12 Dec 2017) | 1 line

* remove trailing spaces, append newline at EOF.
------------------------------------------------------------------------
r61134 | hsbt | 2017-12-12 15:15:44 +0900 (Tue, 12 Dec 2017) | 4 lines

Merge 1-16-stable branch of bundler.

  It's rc version for bundler-1.16.1. I'm going to update it version
  after official release from bundler team.
------------------------------------------------------------------------
r61133 | yui-knk | 2017-12-12 10:13:56 +0900 (Tue, 12 Dec 2017) | 22 lines

parse.y: Fix locations of NODE_ARRAY of mlhs_head

* parse.y: Fix to only include a range of mlhs_item
  (exclude ',' form range).

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  (a,) = 1,2
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,1)-(1,3))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,1)-(1,2))
  ```
------------------------------------------------------------------------
r61132 | ko1 | 2017-12-12 09:56:24 +0900 (Tue, 12 Dec 2017) | 4 lines

catch up r61131.

* spec/ruby/core/kernel/autoload_spec.rb: should use FrozenError.

------------------------------------------------------------------------
r61131 | shyouhei | 2017-12-12 09:46:34 +0900 (Tue, 12 Dec 2017) | 11 lines

Add FrozenError as a subclass of RuntimeError

FrozenError will be used instead of RuntimeError for exceptions
raised when there is an attempt to modify a frozen object. The
reason for this change is to differentiate exceptions related
to frozen objects from generic exceptions such as those generated
by Kernel#raise without an exception class.

From: Jeremy Evans <code@jeremyevans.net>
Signed-off-by: Urabe Shyouhei <shyouhei@ruby-lang.org>

------------------------------------------------------------------------
r61130 | yui-knk | 2017-12-12 09:28:29 +0900 (Tue, 12 Dec 2017) | 21 lines

parse.y: Fix locations of NODE_ARRAY in NODE_CALL(:=~)

* parse.y (match_op_gen): Fix to only include a range of node2.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  re =~ s1
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,0)-(1,8))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,6)-(1,8))
  ```
------------------------------------------------------------------------
r61129 | mame | 2017-12-12 09:20:58 +0900 (Tue, 12 Dec 2017) | 3 lines

ext/coverage/coverage.c: remove COVERAGE_EXPERIMENTAL_MODE

A NEWS entry is also added.
------------------------------------------------------------------------
r61128 | yui-knk | 2017-12-12 09:12:43 +0900 (Tue, 12 Dec 2017) | 22 lines

parse.y: Fix locations of NODE_ARRAY of opt_call_args

* parse.y: Fix to only include a range of assocs
  (exclude ',' form range).

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  m1(str: "bar",)
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,3)-(1,14))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,3)-(1,13))
  ```
------------------------------------------------------------------------
r61127 | marcandre | 2017-12-12 08:50:40 +0900 (Tue, 12 Dec 2017) | 1 line

NEWS: add changes for Matrix [ci-skip] [doc]
------------------------------------------------------------------------
r61126 | yui-knk | 2017-12-12 08:38:00 +0900 (Tue, 12 Dec 2017) | 21 lines

parse.y: Fix locations of NODE_ARRAY in NODE_BLOCK_PASS

* parse.y: Fix to only include a range of assocs.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  m1(str: "bar", &blk)
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,3)-(1,19))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,3)-(1,13))
  ```
------------------------------------------------------------------------
r61125 | yui-knk | 2017-12-12 08:20:42 +0900 (Tue, 12 Dec 2017) | 4 lines

Fix a method name

* test/ruby/test_optimization.rb (test_fixnum_ge):
  Fix a method name to suppress method redefinition warnings.
------------------------------------------------------------------------
r61124 | yui-knk | 2017-12-12 08:13:47 +0900 (Tue, 12 Dec 2017) | 24 lines

parse.y: Change locations of NODE_DVAR in NODE_MASGN

* parse.y: Change the last location of NODE_DVAR to
  be equal to the first location of NODE_DVAR.
  NODE_DVAR of NODE_MASGN (nd_value) is an internal variable,
  so it has no length.

  e.g. The locations of the NODE_DVAR is changed:

  ```
  a.b {|(c,d)| e}
  ```

  * Before

  ```
  NODE_DVAR (line: 1, code_range: (1,7)-(1,10))
  ```

  * After

  ```
  NODE_DVAR (line: 1, code_range: (1,7)-(1,7))
  ```
------------------------------------------------------------------------
r61123 | ko1 | 2017-12-12 05:30:37 +0900 (Tue, 12 Dec 2017) | 10 lines

remove vm_opt_binop_dispatch().

* vm_insnhelper.c (vm_opt_binop_dispatch): removed because this function
  has several issues for micro-benchmark. Write conditions manually.
  The worst point is that we can't control value checking order.
  For example, we can assume FIXNUM arithmetic operations are most popular
  in Ruby, so that we need to check FIXNUM at first.

* test/ruby/test_optimization.rb: also fix redef bug for LE/GT/GE.

------------------------------------------------------------------------
r61122 | ko1 | 2017-12-12 04:17:25 +0900 (Tue, 12 Dec 2017) | 13 lines

do not disable `trace_` prefix insns.

* vm.c: introduce `ruby_vm_event_enabled_flags` which represents which
  event flags are enabled before.

* vm_trace.c: do not turn off `trace_` prefix instructions because turn on
  overhead is a matter if a program repeats turn on and turn off frequently.

* iseq.c (finish_iseq_build): respect `ruby_vm_event_enabled_flags`.

* vm_insnhelper.c (vm_trace): check `ruby_vm_event_flags` and disable
  lazy trace-off technique (do not disable traces).

------------------------------------------------------------------------
r61121 | usa | 2017-12-12 02:31:43 +0900 (Tue, 12 Dec 2017) | 4 lines

fixed typo

* win32/win32.c (get_ino): forgotten to specify the member.  thanks kubo-san.

------------------------------------------------------------------------
r61120 | ko1 | 2017-12-12 01:07:21 +0900 (Tue, 12 Dec 2017) | 11 lines

vm_exec.h: introduce macros for abstarction.

* vm_exec.h: declare two macros
  * START_OF_ORIGINAL_INSN()
  * DISPATCH_ORIGINAL_INSN()
  instead of inserting label and goto lines.
  For OPT_CALL_THREADED_CODE, first macro is empty and second macro
  is simply call the original insn function.

* tool/instruction.rb: use above macros.

------------------------------------------------------------------------
r61119 | usa | 2017-12-12 01:06:41 +0900 (Tue, 12 Dec 2017) | 4 lines

undef previous definition of `SIZEOF_STRUCT_STAT_ST_INO`

trying to solve build problem of MinGW.  see [Bug #14165]

------------------------------------------------------------------------
r61118 | svn | 2017-12-12 00:30:01 +0900 (Tue, 12 Dec 2017) | 1 line

* 2017-12-12
------------------------------------------------------------------------
r61117 | kou | 2017-12-12 00:30:00 +0900 (Tue, 12 Dec 2017) | 2 lines

Update test-unit to 3.2.7

------------------------------------------------------------------------
r61116 | naruse | 2017-12-11 21:09:47 +0900 (Mon, 11 Dec 2017) | 1 line

extern rb_time_utc_offset to get utc offset
------------------------------------------------------------------------
r61115 | hsbt | 2017-12-11 17:37:49 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to zlib-1.0.0 as default gems.
------------------------------------------------------------------------
r61114 | hsbt | 2017-12-11 17:18:01 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to scanf-1.0.0 as default gems.
------------------------------------------------------------------------
r61113 | hsbt | 2017-12-11 15:48:09 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to sdbm-1.0.0 as default gems.
------------------------------------------------------------------------
r61112 | hsbt | 2017-12-11 15:03:53 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to fcntl-1.0.0 as default gems.
------------------------------------------------------------------------
r61111 | mame | 2017-12-11 13:46:57 +0900 (Mon, 11 Dec 2017) | 3 lines

lib/pp.rb: remove alias for suppressing a redefinition warning.

Because there is now the same guard in prelude.rb (alias pp pp).
------------------------------------------------------------------------
r61110 | hsbt | 2017-12-11 12:56:01 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to date-1.0.0 as default gems.
------------------------------------------------------------------------
r61109 | hsbt | 2017-12-11 12:27:47 +0900 (Mon, 11 Dec 2017) | 1 line

Bump version to cmath-1.0.0 as default gems.
------------------------------------------------------------------------
r61108 | usa | 2017-12-11 11:30:42 +0900 (Mon, 11 Dec 2017) | 2 lines

bccwin is no longer supported

------------------------------------------------------------------------
r61107 | usa | 2017-12-11 11:30:21 +0900 (Mon, 11 Dec 2017) | 4 lines

depend on win32.h on Windows

* lib/mkmf.rb (depend_rules): all objs should depend on win32.h on Windows.

------------------------------------------------------------------------
r61106 | yui-knk | 2017-12-11 11:19:43 +0900 (Mon, 11 Dec 2017) | 21 lines

parse.y: Fix locations of NODE_DSTR generated by evstr2dstr_gen

* parse.y (evstr2dstr_gen): Fix to only include a range of node.

  e.g. The locations of the NODE_DSTR is fixed:

  ```
  %W[a #{b} c]
  ```

  * Before

  ```
  NODE_DSTR (line: 1, code_range: (1,3)-(1,9))
  ```

  * After

  ```
  NODE_DSTR (line: 1, code_range: (1,5)-(1,9))
  ```
------------------------------------------------------------------------
r61105 | svn | 2017-12-11 10:04:47 +0900 (Mon, 11 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r61104 | hsbt | 2017-12-11 10:04:46 +0900 (Mon, 11 Dec 2017) | 3 lines

Ignore to generate documentation for template files of bundler.

  [Bug #14163][ruby-core:84141]
------------------------------------------------------------------------
r61103 | yui-knk | 2017-12-11 09:28:27 +0900 (Mon, 11 Dec 2017) | 3 lines

parse.y: Remove not used argument

* parse.y (list_append_gen): location is not used.
------------------------------------------------------------------------
r61102 | yui-knk | 2017-12-11 09:06:11 +0900 (Mon, 11 Dec 2017) | 24 lines

parse.y: Fix locations of NODE_SCOPE in NODE_MODULE

* parse.y: Fix to only include a range of bodystmt.

  e.g. The locations of the NODE_SCOPE is fixed:

  ```
  module M
    def m
    end
  end
  ```

  * Before

  ```
  NODE_SCOPE (line: 4, code_range: (1,0)-(4,3))
  ```

  * After

  ```
  NODE_SCOPE (line: 4, code_range: (1,8)-(4,3))
  ```
------------------------------------------------------------------------
r61101 | yui-knk | 2017-12-11 08:44:22 +0900 (Mon, 11 Dec 2017) | 21 lines

parse.y: Fix the last location of NODE_COLON2

* parse.y: Fix to only include a range from primary_value to tCONSTANT.

  e.g. The locations of the NODE_COLON2 is fixed:

  ```
  A::B ||= 1
  ```

  * Before

  ```
  NODE_COLON2 (line: 1, code_range: (1,0)-(1,10))
  ```

  * After

  ```
  NODE_COLON2 (line: 1, code_range: (1,0)-(1,4))
  ```
------------------------------------------------------------------------
r61100 | usa | 2017-12-11 08:28:09 +0900 (Mon, 11 Dec 2017) | 2 lines

mention about [Feature #13726] and [Feature #13731]

------------------------------------------------------------------------
r61099 | yui-knk | 2017-12-11 08:27:58 +0900 (Mon, 11 Dec 2017) | 22 lines

parse.y: Change the first location of NODE_ARRAY in NODE_DSTR (nd_next->nd_next)

* parse.y (list_append_gen): Change the first location to
  start with the location of item if new list is generated.

  e.g. The locations of the NODE_ARRAY is changed:

  ```
  "#{a}.#{b}"
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,0)-(1,6))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,5)-(1,6))
  ```
------------------------------------------------------------------------
r61098 | marcandre | 2017-12-11 07:36:28 +0900 (Mon, 11 Dec 2017) | 3 lines

Add case equality arity to Enumerable#all?, any?, none? and one?,
and specialized Array#any? and Hash#any?
Based on patch by D.E. Akers [#11286]
------------------------------------------------------------------------
r61097 | svn | 2017-12-11 02:26:59 +0900 (Mon, 11 Dec 2017) | 1 line

* 2017-12-11
------------------------------------------------------------------------
r61096 | usa | 2017-12-11 02:26:58 +0900 (Mon, 11 Dec 2017) | 12 lines

support 128bit ino on Windows (if available)

* win32/win32.c, include/ruby/win32.h (stati128, rb_{,u,l,ul}stati128): rename
  from stati64ns, change the type of st_ino to 64bit and added st_inohigh.

* dir.c, file.c (stat, lstat): follow above changes.

* file.c (rb_stat_ino): support 128bit ino.

* win32/win32.c (rb_{,u,l,ul}stati128): ditto.
  [Feature #13731]

------------------------------------------------------------------------
r61095 | yui-knk | 2017-12-09 22:13:58 +0900 (Sat, 09 Dec 2017) | 22 lines

parse.y: Fix locations of NODE_ARRAY in NODE_ATTRASGN (nd_args)

* parse.y (arg_append_gen): Fix to only include a range of
  node2 if new list is generated.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  x.default = 5
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,0)-(1,13))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,12)-(1,13))
  ```
------------------------------------------------------------------------
r61094 | nobu | 2017-12-09 20:58:25 +0900 (Sat, 09 Dec 2017) | 1 line

test_process.rb (test_maxgroups): add assertions
------------------------------------------------------------------------
r61093 | yui-knk | 2017-12-09 18:44:03 +0900 (Sat, 09 Dec 2017) | 25 lines

parse.y: Change locations of NODE_BLOCK in NODE_RESBODY (nd_body)

* parse.y: Change to only include a range from exc_var to compstmt.

  e.g. The locations of the NODE_BLOCK is changed:

  ```
  begin
    :a
  rescue E => e
    :b
  end
  ```

  * Before

  ```
  NODE_BLOCK (line: 3, code_range: (3,0)-(5,3))
  ```

  * After

  ```
  NODE_BLOCK (line: 3, code_range: (3,9)-(4,4))
  ```
------------------------------------------------------------------------
r61092 | yui-knk | 2017-12-09 12:52:59 +0900 (Sat, 09 Dec 2017) | 23 lines

parse.y: Fix locations of NODE_SCOPE in NODE_SCLASS

* parse.y: Fix to only include a range of bodystmt.

  e.g. The locations of the NODE_SCOPE is fixed:

  ```
  class << []
    def m; end
  end
  ```

  * Before

  ```
  NODE_SCOPE (line: 3, code_range: (1,0)-(3,3))
  ```

  * After

  ```
  NODE_SCOPE (line: 3, code_range: (2,2)-(3,3))
  ```
------------------------------------------------------------------------
r61091 | normal | 2017-12-09 12:46:39 +0900 (Sat, 09 Dec 2017) | 15 lines

Dir#chdir keeps GVL if passed block

On further examination, Dir.chdir with a block from multiple
threads is thread-unsafe given our use of the chdir_blocking and
chdir_thread global variables.

This bug was only introduced in r60583 so not part of any stable
release.

Dir.chdir without a block can still make senses in a MT context
as only one thread could be cwd-sensitive and other threads do
not care which directory they're in.

* dir.c (dir_chdir): keep GVL here
  (dir_s_chdir): release GVL if no block given
------------------------------------------------------------------------
r61090 | yui-knk | 2017-12-09 12:18:55 +0900 (Sat, 09 Dec 2017) | 21 lines

parse.y: Fix locations of NODE_ARRAY in NODE_OPCALL(nd_args)

* parse.y: Fix to only include a range of arg1.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  1 + 2
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,0)-(1,5))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,4)-(1,5))
  ```
------------------------------------------------------------------------
r61089 | yui-knk | 2017-12-09 12:03:34 +0900 (Sat, 09 Dec 2017) | 23 lines

parse.y: Fix locations of NODE_SCOPE in NODE_CLASS

* parse.y: Fix to only include a range of bodystmt.

  e.g. The locations of the NODE_SCOPE is fixed:

  ```
  class A
    def a; end
  end
  ```

  * Before

  ```
  NODE_SCOPE (line: 3, code_range: (1,0)-(3,3))
  ```

  * After

  ```
  NODE_SCOPE (line: 3, code_range: (1,7)-(3,3))
  ```
------------------------------------------------------------------------
r61088 | stomar | 2017-12-09 07:51:42 +0900 (Sat, 09 Dec 2017) | 1 line

doc/syntax/refinements.rdoc: fix typos
------------------------------------------------------------------------
r61087 | stomar | 2017-12-09 07:43:47 +0900 (Sat, 09 Dec 2017) | 1 line

bignum.c: [DOC] simplify comment
------------------------------------------------------------------------
r61086 | stomar | 2017-12-09 07:43:05 +0900 (Sat, 09 Dec 2017) | 1 line

NEWS: grammar fix
------------------------------------------------------------------------
r61085 | stomar | 2017-12-09 07:42:19 +0900 (Sat, 09 Dec 2017) | 1 line

ext/strscan/strscan.c: [DOC] grammar fixes
------------------------------------------------------------------------
r61084 | svn | 2017-12-09 03:51:57 +0900 (Sat, 09 Dec 2017) | 1 line

* 2017-12-09
------------------------------------------------------------------------
r61083 | normal | 2017-12-09 03:51:56 +0900 (Sat, 09 Dec 2017) | 15 lines

webrick: allow shutdown after StartCallback

We must to ensure the @status ivar is set to :Running before
running StartCallback, otherwise Webrick::Server#stop will not
change the @status to :Shutdown properly.

Note: I have not been able to reproduce the original issue but
understood at least part of the problem and fixed it with this
commit.  However, the original reporter (Peak Xu) was still able
to reproduce the problem on 1.9.2 p180 on Windows, so I'm not
sure what else might be going on.  Ruby threading and
synchronization primitives have changed a lot since 1.9.2, so
maybe that was fixed elsewhere.

* lib/webrick/server.rb: call StartCallback sooner [Bug #4841]
------------------------------------------------------------------------
r61082 | nobu | 2017-12-08 17:38:57 +0900 (Fri, 08 Dec 2017) | 1 line

lib/pp.rb: no rdoc of alias to suppress a warning
------------------------------------------------------------------------
r61081 | nobu | 2017-12-08 16:35:07 +0900 (Fri, 08 Dec 2017) | 5 lines

test_file_exhaustive.rb: get rid of failures

* test/ruby/test_file_exhaustive.rb (test_utime_symlinkfile):
  under some condition, symlink file is also affected by utimes()
  on Linux.
------------------------------------------------------------------------
r61080 | nobu | 2017-12-08 16:17:34 +0900 (Fri, 08 Dec 2017) | 4 lines

pp.rb: rdoc

* lib/pp.rb (pp): move pp alias before its rdoc, not to prevent
  parsing.
------------------------------------------------------------------------
r61079 | nobu | 2017-12-08 16:13:04 +0900 (Fri, 08 Dec 2017) | 5 lines

test_file_exhaustive.rb: test_utime_symlinkfile

* test_file_exhaustive.rb (test_utime_symlinkfile): investigate
  failures on some platforms.  wait a second to tell if symlink
  atime is changed.
------------------------------------------------------------------------
r61078 | nobu | 2017-12-08 15:24:16 +0900 (Fri, 08 Dec 2017) | 1 line

test_file_exhaustive.rb: fix arguments order
------------------------------------------------------------------------
r61077 | nobu | 2017-12-08 15:20:06 +0900 (Fri, 08 Dec 2017) | 4 lines

win32.c: check error code

* win32/win32.c (w32_io_info): check GetFileInformationByHandleEx
  error code to fallback to GetFileInformationByHandle.
------------------------------------------------------------------------
r61076 | nobu | 2017-12-08 14:51:19 +0900 (Fri, 08 Dec 2017) | 7 lines

support gperf 3.1

* tool/gperf.sed: extracted sed commands to a script.  ANSI-C code
  produced by gperf 3.1 declares length arguments as `size_t`.  it
  causes conflict with existing declarations, and needs casts for
  a local variable and return statements.
  [Feature #13883]
------------------------------------------------------------------------
r61075 | yui-knk | 2017-12-08 09:45:23 +0900 (Fri, 08 Dec 2017) | 3 lines

parse.y Fix compile error

ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
------------------------------------------------------------------------
r61074 | yui-knk | 2017-12-08 09:33:38 +0900 (Fri, 08 Dec 2017) | 22 lines

parse.y: Fix locations of modifier_rescue

* parse.y: Fix to only include a range from modifier_rescue
  to stmt (or arg).

  e.g. The locations of the NODE_RESBODY is fixed:

  ```
  a rescue 1
  ```

  * Before

  ```
  NODE_RESBODY (line: 1, code_range: (1,0)-(1,10))
  ```

  * After

  ```
  NODE_RESBODY (line: 1, code_range: (1,2)-(1,10))
  ```
------------------------------------------------------------------------
r61073 | svn | 2017-12-08 08:36:00 +0900 (Fri, 08 Dec 2017) | 1 line

* 2017-12-08
------------------------------------------------------------------------
r61072 | yui-knk | 2017-12-08 08:35:59 +0900 (Fri, 08 Dec 2017) | 21 lines

parse.y: Fix locations of string

* parse.y: Fix to include locations of tSTRING_BEG and tSTRING_END.

  e.g. The locations of the NODE_STR is fixed:

  ```
  "a"
  ```

  * Before

  ```
  NODE_STR (line: 1, code_range: (1,1)-(1,2))
  ```

  * After

  ```
  NODE_STR (line: 1, code_range: (1,0)-(1,3))
  ```
------------------------------------------------------------------------
r61071 | hsbt | 2017-12-07 17:08:56 +0900 (Thu, 07 Dec 2017) | 4 lines

Follow up r60970 for bundler's examples.

  r60970 break Gemfile.lock format with file protocol after bundle
  install/update. I addd hostname to these examples.
------------------------------------------------------------------------
r61070 | yui-knk | 2017-12-07 15:38:49 +0900 (Thu, 07 Dec 2017) | 23 lines

parse.y: Fix locations of array

* parse.y (make_array): Set locations of ary to
  include locations of start token (tLBRACK, tWORDS_BEG, ...)
  and end token (']', tSTRING_END, ...) of array.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  [1, 2, 3]
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, code_range: (1,1)-(1,8))
  ```

  * After

  ```
  NODE_ARRAY (line: 1, code_range: (1,0)-(1,9))
  ```
------------------------------------------------------------------------
r61069 | nobu | 2017-12-07 13:42:16 +0900 (Thu, 07 Dec 2017) | 1 line

win32/win32.c: removed a stale comment
------------------------------------------------------------------------
r61068 | nobu | 2017-12-07 13:12:42 +0900 (Thu, 07 Dec 2017) | 4 lines

parse.y: fix for old compilers

* parse.y (arg_value): initialization of aggregation type with
  non-constant values is not allowed in C89.
------------------------------------------------------------------------
r61067 | nobu | 2017-12-07 13:03:44 +0900 (Thu, 07 Dec 2017) | 5 lines

win32.c: fallback to old API

* win32/win32.c (w32_io_info, rb_w32_file_identical_p): fallback
  to GetFileInformationByHandle if GetFileInformationByHandleEx
  failed.  it seems not working on network drives.
------------------------------------------------------------------------
r61066 | yui-knk | 2017-12-07 12:00:36 +0900 (Thu, 07 Dec 2017) | 21 lines

parse.y: Fix locations of dsym

* parse.y: Fix to only include a range from tSTRING_BEG to tLABEL_END.

  e.g. The locations of the NODE_LIT is fixed:

  ```
  { "a": 10 }
  ```

  * Before

  ```
  NODE_LIT (line: 1, code_range: (1,2)-(1,9))
  ```

  * After

  ```
  NODE_LIT (line: 1, code_range: (1,2)-(1,6))
  ```
------------------------------------------------------------------------
r61065 | yui-knk | 2017-12-07 11:48:38 +0900 (Thu, 07 Dec 2017) | 22 lines

parse.y: Fix locations of dsym

* parse.y (dsym_node_gen): Always set locations
  to include locations of tSYMBEG and tSTRING_END.

  e.g. The locations of the NODE_LIT is fixed:

  ```
  :"a"
  ```

  * Before

  ```
  NODE_LIT (line: 1, code_range: (1,2)-(1,3))
  ```

  * After

  ```
  NODE_LIT (line: 1, code_range: (1,0)-(1,4))
  ```
------------------------------------------------------------------------
r61064 | yui-knk | 2017-12-07 11:36:51 +0900 (Thu, 07 Dec 2017) | 22 lines

parse.y: Fix locations of regexp

* parse.y (new_regexp_gen): Always set locations
  to include locations of tREGEXP_BEG and tREGEXP_END.

  e.g. The locations of the NODE_LIT is fixed:

  ```
  /a/
  ```

  * Before

  ```
  NODE_LIT (line: 1, code_range: (1,1)-(1,2))
  ```

  * After

  ```
  NODE_LIT (line: 1, code_range: (1,0)-(1,3))
  ```
------------------------------------------------------------------------
r61063 | yui-knk | 2017-12-07 11:25:37 +0900 (Thu, 07 Dec 2017) | 22 lines

parse.y: Fix locations of xstring

* parse.y (new_xstring_gen): Always set locations
  to include locations of tXSTRING_BEG and tSTRING_END.

  e.g. The locations of the NODE_XSTR is fixed:

  ```
  `a`
  ```

  * Before

  ```
  NODE_XSTR (line: 1, code_range: (1,1)-(1,2))
  ```

  * After

  ```
  NODE_XSTR (line: 1, code_range: (1,0)-(1,3))
  ```
------------------------------------------------------------------------
r61062 | shugo | 2017-12-07 08:56:04 +0900 (Thu, 07 Dec 2017) | 1 line

remove unnecessary read_timeout.
------------------------------------------------------------------------
r61061 | mame | 2017-12-07 07:43:54 +0900 (Thu, 07 Dec 2017) | 1 line

eval_intern.h: fix a typo
------------------------------------------------------------------------
r61060 | normal | 2017-12-07 06:51:10 +0900 (Thu, 07 Dec 2017) | 3 lines

cont.c: update comment for ec refactoring

* cont.c (fiber_switch): update comment (ec.fiber => ec->fiber_ptr)
------------------------------------------------------------------------
r61059 | svn | 2017-12-07 00:02:32 +0900 (Thu, 07 Dec 2017) | 1 line

* 2017-12-07
------------------------------------------------------------------------
r61058 | kazu | 2017-12-07 00:02:31 +0900 (Thu, 07 Dec 2017) | 4 lines

`Integer#pow(b)` accepts numeric

instead of integer only and returns numeric instead of integer only
same as `Integer#**`
------------------------------------------------------------------------
r61057 | nobu | 2017-12-06 21:36:37 +0900 (Wed, 06 Dec 2017) | 4 lines

numeric.c: rb_int_powm rdoc

* numeric.c (Init_Numeric): let rdoc know that rb_int_powm is
  defined in bignum.c.  [Feature #12508] [Feature #11003]
------------------------------------------------------------------------
r61056 | nobu | 2017-12-06 20:36:42 +0900 (Wed, 06 Dec 2017) | 5 lines

vcs.rb: fix r61054

* tool/vcs.rb (VCS::SVN.get_revisions): cmd_readd_at expects the
  whole arguments for IO.popen as the second argument, that is an
  array of command and mode.
------------------------------------------------------------------------
r61055 | nobu | 2017-12-06 20:18:53 +0900 (Wed, 06 Dec 2017) | 4 lines

file2lastrev.rb: suppress_not_found

* tool/file2lastrev.rb: exit successfully when command not found,
  and if --suppress_not_found is given.
------------------------------------------------------------------------
r61054 | nobu | 2017-12-06 20:18:52 +0900 (Wed, 06 Dec 2017) | 4 lines

vcs.rb: raise NotFoundError when command not found

* tool/vcs.rb (cmd_pipe_at, cmd_read_at, system): moved from GIT
  to VCS, and now raise VCS::NotFoundError when command not found.
------------------------------------------------------------------------
r61053 | hsbt | 2017-12-06 17:35:13 +0900 (Wed, 06 Dec 2017) | 1 line

Bump fiddle-1.0.0 for released version.
------------------------------------------------------------------------
r61052 | hsbt | 2017-12-06 17:34:34 +0900 (Wed, 06 Dec 2017) | 1 line

Bump gdbm-2.0.0 for released versionn.
------------------------------------------------------------------------
r61051 | hsbt | 2017-12-06 17:32:01 +0900 (Wed, 06 Dec 2017) | 1 line

Bump dbm-1.0.0 for released version.
------------------------------------------------------------------------
r61050 | mame | 2017-12-06 16:26:54 +0900 (Wed, 06 Dec 2017) | 4 lines

compile.c (rb_iseq_compile_node): Move the check for imemo_ifunc to top

Applying nd_type to imemo_ifunc object seems harmless fortunately, but
very dirty (to me).
------------------------------------------------------------------------
r61049 | mame | 2017-12-06 16:19:17 +0900 (Wed, 06 Dec 2017) | 4 lines

vm_core.h (RUBY_EVENT_COVERAGE_BRANCH): renamed

This change moves RUBY_EVENT_COVERAGE from include/ruby/ruby.h to
vm_core.h and renames it to RUBY_EVENT_COVERAGE_BRANCH.
------------------------------------------------------------------------
r61048 | mame | 2017-12-06 16:19:16 +0900 (Wed, 06 Dec 2017) | 3 lines

Remove RUBY_EVENT_SPECIFIED_LINE

Follow up of r61044
------------------------------------------------------------------------
r61047 | mame | 2017-12-06 16:04:49 +0900 (Wed, 06 Dec 2017) | 1 line

insns.def (tracebranch): renamed from `trace2`
------------------------------------------------------------------------
r61046 | mame | 2017-12-06 16:04:48 +0900 (Wed, 06 Dec 2017) | 4 lines

thread.c (update_branch_coverage): renamed from `update_coverage`

Now this function only deals with branch events, so this change renames
it and remove complexity that is no longer needed.
------------------------------------------------------------------------
r61045 | ko1 | 2017-12-06 15:54:40 +0900 (Wed, 06 Dec 2017) | 1 line

fix last commit
------------------------------------------------------------------------
r61044 | ko1 | 2017-12-06 15:53:15 +0900 (Wed, 06 Dec 2017) | 7 lines

remove unsupported RUBY_EVENT_SPECIFIED_LINE.

* vm_trace.c (get_event_id): remove experimental in past, and not supported
  now feature.

* vm_trace.c (tracepoint_inspect): ditto.

------------------------------------------------------------------------
r61043 | mame | 2017-12-06 15:39:05 +0900 (Wed, 06 Dec 2017) | 5 lines

thread.c (update_line_coverage): Use RUBY_EVENT_LINE

This change makes coverage use the general event type RUBY_EVENT_LINE
instead of a special event type RUBY_EVENT_COVERAGE.
Just a refactoring.
------------------------------------------------------------------------
r61042 | nobu | 2017-12-06 14:22:19 +0900 (Wed, 06 Dec 2017) | 4 lines

prelude.c.tmpl: fix line number

* template/prelude.c.tmpl (Init_prelude): fix line number of
  preludes.  line of prelude_eval is an int, not a VALUE.
------------------------------------------------------------------------
r61041 | mame | 2017-12-06 12:19:17 +0900 (Wed, 06 Dec 2017) | 1 line

eval_intern.h: prevent core dump with clang and make test-all
------------------------------------------------------------------------
r61040 | ko1 | 2017-12-06 12:16:08 +0900 (Wed, 06 Dec 2017) | 5 lines

remove `PUSH_TAG`/`EXEC_AG`/`POP_TAG`/`JUMO_TAG`.

* eval_intern.h: remove non-`EC_` prefix *_TAG() macros.
  Use `EC_` prefix macros explicitly.

------------------------------------------------------------------------
r61039 | yui-knk | 2017-12-06 12:09:55 +0900 (Wed, 06 Dec 2017) | 28 lines

parse.y: Fix the first location of heredoc identifier

* parse.y (parser_heredoc_identifier):
  Put length of term at the head of rb_strterm_heredoc_struct.term.

* parse.y (rb_parser_set_location_from_strterm_heredoc):
  Use length of term to calculate first_loc.column.

  e.g. The locations of the NODE_DSTR is fixed:

  ```
  a <<STR
  123
  #{:a}
  STR
  ```

  * Before

  ```
  NODE_DSTR (line: 3, code_range: (1,3)-(1,7))
  ```

  * After

  ```
  NODE_DSTR (line: 3, code_range: (1,2)-(1,7))
  ```
------------------------------------------------------------------------
r61038 | mame | 2017-12-06 10:41:05 +0900 (Wed, 06 Dec 2017) | 3 lines

parse.y: remove redefined typedef

Clang told me that this is C11 feature.
------------------------------------------------------------------------
r61037 | yui-knk | 2017-12-06 09:44:18 +0900 (Wed, 06 Dec 2017) | 28 lines

parse.y: Fix locations of HEREDOC

* parse.y (rb_parser_set_location_from_strterm_heredoc):
  Set locations based on rb_strterm_heredoc_t.

* parse.y (yylex): Set yylloc based on rb_strterm_heredoc_t
  when parsing heredoc.

  e.g. The locations of the NODE_DSTR is changed:

  ```
  a <<STR
  123
  #{:a}
  STR
  ```

  * Before

  ```
  NODE_DSTR (line: 3, code_range: (3,0)-(1,7))
  ```

  * After

  ```
  NODE_DSTR (line: 3, code_range: (1,3)-(1,7))
  ```
------------------------------------------------------------------------
r61036 | svn | 2017-12-06 08:34:15 +0900 (Wed, 06 Dec 2017) | 1 line

* 2017-12-06
------------------------------------------------------------------------
r61035 | yui-knk | 2017-12-06 08:34:14 +0900 (Wed, 06 Dec 2017) | 5 lines

test_syntax.rb: Add a test case for `not()`

* test/ruby/test_syntax.rb (TestSyntax#test_keyword_not_parens):
  Currently `not()` is tested by only TestRipper::ParserEvents#test_unary,
  so I think it's better to test this syntax directly.
------------------------------------------------------------------------
r61034 | nobu | 2017-12-05 22:49:40 +0900 (Tue, 05 Dec 2017) | 4 lines

parse.y: nd_line of new node

* parse.y (nd_set_loc): set nd_line of the newly created node to
  the first location.
------------------------------------------------------------------------
r61033 | nobu | 2017-12-05 22:46:21 +0900 (Tue, 05 Dec 2017) | 4 lines

parse.y: nd_line of call_uni_op

* parse.y (call_uni_op): set nd_line to the unary operator
  location, same as non-operator method calls.
------------------------------------------------------------------------
r61032 | nobu | 2017-12-05 22:42:46 +0900 (Tue, 05 Dec 2017) | 4 lines

parse.y: nd_line of logop

* parse.y (logop): set nd_line to the logical operator location,
  same as non-operator method calls.
------------------------------------------------------------------------
r61031 | nobu | 2017-12-05 22:38:01 +0900 (Tue, 05 Dec 2017) | 4 lines

parse.y: nd_line of match_op

* parse.y (match_op): set nd_line to the match operator location,
  same as non-operator method calls.
------------------------------------------------------------------------
r61030 | nobu | 2017-12-05 22:30:06 +0900 (Tue, 05 Dec 2017) | 4 lines

parse.y: nd_line of call_bin_op

* parse.y (call_bin_op): set nd_line to the binary operator
  location, same as non-operator method calls.
------------------------------------------------------------------------
r61029 | hsbt | 2017-12-05 20:08:00 +0900 (Tue, 05 Dec 2017) | 3 lines

Bump version to rdoc-6.0.0.

  There is no changes from rdoc-6.0.0.bebta4.
------------------------------------------------------------------------
r61028 | mame | 2017-12-05 18:45:03 +0900 (Tue, 05 Dec 2017) | 1 line

iseq.c (iseq_load, iseq_data_to_ary): Fix a type error (for clang)
------------------------------------------------------------------------
r61027 | mame | 2017-12-05 17:58:57 +0900 (Tue, 05 Dec 2017) | 3 lines

Hide ISeq#load

I disclosed it incorrectly at r61025.  Sorry.
------------------------------------------------------------------------
r61026 | mame | 2017-12-05 17:56:51 +0900 (Tue, 05 Dec 2017) | 5 lines

ext/coverage/coverage.c: method coverage has column info. of method def.

This change makes method coverage result have not only first lineno of
method defintion, but also code range (i.e. first lineno, first column,
last lineno, and last column).
------------------------------------------------------------------------
r61025 | mame | 2017-12-05 17:56:50 +0900 (Tue, 05 Dec 2017) | 4 lines

vm_core.h (rb_iseq_locatoin_t): add a field `code_range`

This change makes each ISeq keep NODE's code range.  This information is
needed for method coverage.
------------------------------------------------------------------------
r61024 | nobu | 2017-12-05 17:50:14 +0900 (Tue, 05 Dec 2017) | 4 lines

node.c: FIELD_BLOCK

* node.c (COMPOUND_FIELD, FIELD_BLOCK): moved block outside
  arguments like as SIMPLE_FIELD.
------------------------------------------------------------------------
r61023 | mame | 2017-12-05 16:16:42 +0900 (Tue, 05 Dec 2017) | 11 lines

Revamp method coverage to support define_method

Traditionally, method coverage measurement was implemented by inserting
`trace2` instruction to the head of method iseq.  So, it just measured
methods defined by `def` keyword.

This commit drastically changes the measuring mechanism of method
coverage; at `RUBY_EVENT_CALL`, it keeps a hash from rb_method_entry_t*
to runs (i.e., it counts the runs per method entry), and at
`Coverage.result`, it creates the result hash by enumerating all
`rb_method_entry_t*` objects (by `ObjectSpace.each_object`).
------------------------------------------------------------------------
r61022 | mame | 2017-12-05 13:23:06 +0900 (Tue, 05 Dec 2017) | 3 lines

node.c: a simple notation for code range of NODEs

This affects only `--dump=parsetree` and `--dump=parsetree_with_comment`.
------------------------------------------------------------------------
r61021 | svn | 2017-12-05 10:10:15 +0900 (Tue, 05 Dec 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r61020 | hsbt | 2017-12-05 10:10:13 +0900 (Tue, 05 Dec 2017) | 22 lines

vm_core.h: Increase the Fiber stack size on powerpc64

Currently the Fiber stack size is small for powerpc64 and it causes
test/ruby/test_backtrace.rb test to break, since it is using a 8kb stack
size.

It breaks on powerpc64 due to the fact that a frame in the stack is
usually 50% bigger on powerpc64 compared to Intel, due to some
considerations:

 * The powerpc64 minimum frame is 2x bigger than on Intel
 * Powerpc has more registers that might be saved in the frame compared
   to Intel.

I ran the same ruby test that is failing on both Intel and Powerpc, and
each Fiber frame is ~50% bigger on powerpc64 for every single lambda
function, thus, we need to increase the stack size on powerpc64 to
accomodate the same tests/applications.

This fixes bug#13757.

Signed-off-by: Breno Leitao <leitao@debian.org>
------------------------------------------------------------------------
r61019 | shugo | 2017-12-05 09:59:40 +0900 (Tue, 05 Dec 2017) | 3 lines

Remove unnecessary read_timeout.

http://ci.rvm.jp/results/trunk-asserts-nopara@ruby-sky1/219867
------------------------------------------------------------------------
r61018 | nobu | 2017-12-05 09:09:58 +0900 (Tue, 05 Dec 2017) | 3 lines

bignum.c: unified int_pow_tmp2

* bignum.c (int_pow_tmp2): unified DLONG and none DLONG code.
------------------------------------------------------------------------
r61017 | svn | 2017-12-05 08:59:03 +0900 (Tue, 05 Dec 2017) | 1 line

* 2017-12-05
------------------------------------------------------------------------
r61016 | yui-knk | 2017-12-05 08:59:02 +0900 (Tue, 05 Dec 2017) | 27 lines

parse.y: Fix locations of NODE_*ASGN and NODE_ERRINFO

* parse.y: Fix to only include a range of exc_var.

  e.g. The locations of the NODE_DASGN_CURR and NODE_ERRINFO are fixed:

  ```
  begin
    1
  rescue => e
    2
  end
  ```

  * Before

  ```
  NODE_DASGN_CURR (line: 3, first_lineno: 3, first_column: 0, last_lineno: 5, last_column: 3)
  NODE_ERRINFO (line: 5, first_lineno: 3, first_column: 0, last_lineno: 5, last_column: 3)
  ```

  * After

  ```
  NODE_DASGN_CURR (line: 3, first_lineno: 3, first_column: 7, last_lineno: 3, last_column: 11)
  NODE_ERRINFO (line: 5, first_lineno: 3, first_column: 7, last_lineno: 3, last_column: 11)
  ```
------------------------------------------------------------------------
r61015 | nobu | 2017-12-04 21:49:20 +0900 (Mon, 04 Dec 2017) | 3 lines

win32.c: fix error on mingw

* win32/win32.c (FILE_ID_128): defined on mingw already.
------------------------------------------------------------------------
r61014 | kazu | 2017-12-04 21:31:44 +0900 (Mon, 04 Dec 2017) | 1 line

[DOC] improve rdoc formatting for links [ci skip]
------------------------------------------------------------------------
r61013 | usa | 2017-12-04 19:48:30 +0900 (Mon, 04 Dec 2017) | 10 lines

support nanosec file timestamp on newer Windows

Support nanosec file timestamp on Windows 8 or later.
Original patches are written by kubo (Kubo Takehiro).
Windows 7 and earlier also supports nanosec file timestamp, but it's too
accurate than system time.  so, this feature is disabled on such versions.
[Feature #13726]

this change also includes [Misc #13702]

------------------------------------------------------------------------
r61012 | nobu | 2017-12-04 19:41:45 +0900 (Mon, 04 Dec 2017) | 4 lines

bignum.c: explicit casts

* bignum.c (int_pow_tmp2): explicitly cast to get rid of implicit
  conversion.
------------------------------------------------------------------------
r61011 | yui-knk | 2017-12-04 17:20:07 +0900 (Mon, 04 Dec 2017) | 22 lines

parse.y: Fix a location of NODE_BLOCK_PASS

* parse.y (arg_append_gen): Update the last location of
  NODE_BLOCK_PASS when NODE is appended to nd_head.

  e.g. The locations of the NODE_BLOCK_PASS is fixed:

  ```
  o[1, &bl] = :c
  ```

  * Before

  ```
  NODE_BLOCK_PASS (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 8)
  ```

  * After

  ```
  NODE_BLOCK_PASS (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 14)
  ```
------------------------------------------------------------------------
r61010 | yui-knk | 2017-12-04 16:50:42 +0900 (Mon, 04 Dec 2017) | 22 lines

parse.y: Fix a location of NODE_ARGSCAT

* parse.y (arg_append_gen): Update the last location of
  NODE_ARGSCAT when NODE is appended to nd_body.

  e.g. The locations of the NODE_ARGSCAT is fixed:

  ```
  m(*a, :b, :c)
  ```

  * Before

  ```
  NODE_ARGSCAT (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 8)
  ```

  * After

  ```
  NODE_ARGSCAT (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 12)
  ```
------------------------------------------------------------------------
r61009 | nobu | 2017-12-04 16:37:21 +0900 (Mon, 04 Dec 2017) | 7 lines

hide internal data objects

* marshal.c (compat_allocator_table): hide the wrapper object of
  compat_allocator_tbl.

* process.c (rb_execarg_new): hide wrapper objects of struct
  rb_execarg.
------------------------------------------------------------------------
r61008 | yui-knk | 2017-12-04 16:16:31 +0900 (Mon, 04 Dec 2017) | 22 lines

parse.y: Fix a location of NODE_ARRAY in NODE_ARGSCAT

* parse.y: Fix the first location to be equal to the location
  of the first element of NODE_ARRAY.

  e.g. The locations of the NODE_ARRAY is fixed:

  ```
  m(*a, :b, :c)
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 12)
  ```

  * After

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 12)
  ```
------------------------------------------------------------------------
r61007 | usa | 2017-12-04 15:41:28 +0900 (Mon, 04 Dec 2017) | 5 lines

try to pass compiling with VC12

* win32/win32.c (FILE_ID_128): it's not defined in SDK with VC10, but seems to
  be defined in SDK with VC12.

------------------------------------------------------------------------
r61006 | nobu | 2017-12-04 15:08:30 +0900 (Mon, 04 Dec 2017) | 5 lines

ifaddr.c: fix memsize

* ext/socket/ifaddr.c (ifaddr_memsize): do not count the whole
  rb_ifaddr_t array for each elements.  the header size is
  included in the first element for the time being.
------------------------------------------------------------------------
r61005 | usa | 2017-12-04 12:33:48 +0900 (Mon, 04 Dec 2017) | 7 lines

support `File.identical?` on ReFS

* file.c (rb_file_idenitical_p): move Windows dependent code to win32/win32.c.

* win32/win32.c (rb_w32_file_identical_p): support ReFS.
  see [Feature #13731] [ruby-dev:50166]

------------------------------------------------------------------------
r61004 | mrkn | 2017-12-04 11:35:41 +0900 (Mon, 04 Dec 2017) | 1 line

NEWS: add Integer#pow(b, m)
------------------------------------------------------------------------
r61003 | mrkn | 2017-12-04 11:35:40 +0900 (Mon, 04 Dec 2017) | 34 lines

bignum.c, numeric.c: add Integer#pow(b, m)

This commit is based on the pull-request #1320 created by Makoto Kishimoto.
[Feature #12508] [Feature #11003] [close GH-1320]

* bignum.c (rb_int_powm): Added for Integer#pow(b, m).

* internal.h (rb_int_powm): Declared to refer in numeric.c.

* bignum.c (bary_powm_gmp): Added for Integer#pow(b, m) using GMP.

* bignum.c (int_pow_tmp1): Added for implementing Integer#pow(b, m).

* bignum.c (int_pow_tmp2, int_pow_tmp3): ditto.

* internal.h (rb_num_positive_int_p): Moved from numeric.c for sharing
  the definition with bignum.c.

* internal.h (rb_num_negative_int_p, rb_num_compare_with_zero): ditto.

* numeric.c(negative_int_p): Moved to internal.h for sharing the
  definition with bignum.c.

* numeric.c (positive_int_p, compare_with_zero): ditto.

* numeric.c (rb_int_odd_p): Exported (renamed from int_odd_p).

* internal.h (rb_int_odd_p): ditto.

* internal.h (HALF_LONG_MSB): Added.

* numeric.c (SQRT_LONG_MAX): Redefined by using HALF_LONG_MSB.

* test/ruby/test_numeric.rb (test_pow): Added for Integer#pow(b, m).
------------------------------------------------------------------------
r61002 | usa | 2017-12-04 09:23:31 +0900 (Mon, 04 Dec 2017) | 5 lines

revert r60999

* test/logger/test_logdevice.rb: revert r60999 because it was caused by not
  committed changes.

------------------------------------------------------------------------
r61001 | nobu | 2017-12-04 08:54:45 +0900 (Mon, 04 Dec 2017) | 4 lines

ifaddr.c: unused member

* ext/socket/ifaddr.c (struct rb_ifaddr_tag): removed set but
  unused member root.
------------------------------------------------------------------------
r61000 | yui-knk | 2017-12-04 08:12:01 +0900 (Mon, 04 Dec 2017) | 21 lines

parse.y: Fix a location of NODE_ZARRAY

* parse.y: Fix to only include a range of opt_call_args.

  e.g. The locations of the NODE_ZARRAY is fixed:

  ```
  a[] ||= 1
  ```

  * Before

  ```
  NODE_ZARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 9)
  ```

  * After

  ```
  NODE_ZARRAY (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 3)
  ```
------------------------------------------------------------------------
r60999 | svn | 2017-12-04 00:49:06 +0900 (Mon, 04 Dec 2017) | 1 line

* 2017-12-04
------------------------------------------------------------------------
r60998 | usa | 2017-12-04 00:49:05 +0900 (Mon, 04 Dec 2017) | 5 lines

give a change to determine to rotate the log or not

* test/logger/test_logdevice.rb (test_shifting_{age,period_suffix}): give a
  chance to determine to rotate the log or not.

------------------------------------------------------------------------
r60997 | yui-knk | 2017-12-03 21:44:47 +0900 (Sun, 03 Dec 2017) | 1 line

parse.y (new_args_gen): Set the location of NODE_ARGS
------------------------------------------------------------------------
r60996 | yui-knk | 2017-12-03 21:27:01 +0900 (Sun, 03 Dec 2017) | 21 lines

parse.y: Fix a location of NODE_DVAR in rb_args_info

* parse.y (new_args_tail_gen): Set only a location of NODE_DVAR.

  e.g. The locations of the NODE_DVAR is fixed:

  ```
  def a(k: 1, **kws) end
  ```

  * Before

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 18)
  ```

  * After

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 12, last_lineno: 1, last_column: 17)
  ```
------------------------------------------------------------------------
r60995 | naruse | 2017-12-03 21:11:19 +0900 (Sun, 03 Dec 2017) | 1 line

Set binmode to handle non ASCII commit message
------------------------------------------------------------------------
r60994 | nobu | 2017-12-03 21:10:19 +0900 (Sun, 03 Dec 2017) | 5 lines

common.mk: ignore error

* common.mk ($(REVISION_H)): ignore error when git not found.
  `--suppress_not_found` option suppresses a warning but does not
  ignore the error.
------------------------------------------------------------------------
r60993 | naruse | 2017-12-03 21:06:16 +0900 (Sun, 03 Dec 2017) | 1 line

Add test for Bug::String.buf_new
------------------------------------------------------------------------
r60992 | shugo | 2017-12-03 17:35:44 +0900 (Sun, 03 Dec 2017) | 3 lines

Specify refinement inheritance by Module#include.

[ruby-core:79880] [Bug #13271]
------------------------------------------------------------------------
r60991 | shugo | 2017-12-03 17:10:42 +0900 (Sun, 03 Dec 2017) | 4 lines

Fix a documentation error of IO#putc.

IO#putc is multi-byte character safe when a String is given as its argument.
[ruby-core:82019] [Bug #13741]
------------------------------------------------------------------------
r60990 | shugo | 2017-12-03 17:02:56 +0900 (Sun, 03 Dec 2017) | 1 line

Init functions should have prefix to avoid confliction.
------------------------------------------------------------------------
r60989 | yui-knk | 2017-12-03 15:53:18 +0900 (Sun, 03 Dec 2017) | 1 line

parse.y: Set a location of NODE_NIL in `not()`
------------------------------------------------------------------------
r60988 | nobu | 2017-12-03 15:14:58 +0900 (Sun, 03 Dec 2017) | 4 lines

parse.y: location of BEGIN

* parse.y (top_stmt): wrap BEGIN statement to store the whole
  location for each block.
------------------------------------------------------------------------
r60987 | nobu | 2017-12-03 14:08:17 +0900 (Sun, 03 Dec 2017) | 1 line

common.mk: suppress an error message when git not found
------------------------------------------------------------------------
r60986 | yui-knk | 2017-12-03 13:53:05 +0900 (Sun, 03 Dec 2017) | 23 lines

parse.y: Fix locations of NODEs generated by cond0

* parse.y: Fix to only include a range of the first argument of cond.

  e.g. The locations of the NODE_MATCH2 and NODE_GVAR are fixed:

  ```
  1 while /#{:a}/
  ```

  * Before

  ```
  NODE_MATCH2 (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 15)
  NODE_GVAR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 15)
  ```

  * After

  ```
  NODE_MATCH2 (line: 1, first_lineno: 1, first_column: 8, last_lineno: 1, last_column: 15)
  NODE_GVAR (line: 1, first_lineno: 1, first_column: 8, last_lineno: 1, last_column: 15)
  ```
------------------------------------------------------------------------
r60985 | nobu | 2017-12-03 13:41:06 +0900 (Sun, 03 Dec 2017) | 4 lines

setup.mak: make Makefile stable

* win32/setup.mak (-basic-vars-): moved BASERUBY and HAVE_BASERUBY
  definition to make Makefile stable when they have been defaulted.
------------------------------------------------------------------------
r60984 | shugo | 2017-12-03 09:39:26 +0900 (Sun, 03 Dec 2017) | 4 lines

The superclass of a refinement should have BasicObject as its ancestor.

Otherwise, VM_ASSERT(callable_method_entry_p(cme)) in
prepare_callable_method_entry() fails if VM_CHECK_MODE is 2.
------------------------------------------------------------------------
r60983 | svn | 2017-12-03 00:41:08 +0900 (Sun, 03 Dec 2017) | 1 line

* 2017-12-03
------------------------------------------------------------------------
r60982 | naruse | 2017-12-03 00:41:08 +0900 (Sun, 03 Dec 2017) | 1 line

static
------------------------------------------------------------------------
r60981 | naruse | 2017-12-03 00:41:07 +0900 (Sun, 03 Dec 2017) | 1 line

Update dependencies
------------------------------------------------------------------------
r60980 | shugo | 2017-12-02 19:54:39 +0900 (Sat, 02 Dec 2017) | 6 lines

Modules should not have subclasses.

When refining a module, the module was set to the superclass of its refinement,
and a segmentation fault occurred.
The superclass of the refinement should be an iclass of the module.
[ruby-core:83617] [Bug #14070]
------------------------------------------------------------------------
r60979 | nobu | 2017-12-02 16:09:16 +0900 (Sat, 02 Dec 2017) | 4 lines

string.c: fix rb_external_str_new_with_enc

* string.c (rb_external_str_new_with_enc): do not search non-ascii
  by NULL pointer.  [ruby-core:84055] [Bug #14150]
------------------------------------------------------------------------
r60978 | nobu | 2017-12-02 12:16:01 +0900 (Sat, 02 Dec 2017) | 4 lines

common.mk: fix message

* common.mk (update-unicode-property-files): fix emoji version in
  the message.
------------------------------------------------------------------------
r60977 | nobu | 2017-12-02 12:12:51 +0900 (Sat, 02 Dec 2017) | 8 lines

fix for emoji-data.txt

* common.mk: download emoji-data.txt.  As emoji data files are
  located in a separate directory in Unicode.org site, reearranged
  Unicode data files directories same as the site.

* tool/enc-unicode.rb (get_file): search emoji data files in the
  second argument path.
------------------------------------------------------------------------
r60976 | nobu | 2017-12-02 12:12:50 +0900 (Sat, 02 Dec 2017) | 4 lines

enc-unicode.rb: for gperf 3.1

* tool/enc-unicode.rb: support for gperf 3.1, which defines length
  arguments as `size_t` but a local variable as `unsigned int`.
------------------------------------------------------------------------
r60975 | eregon | 2017-12-02 02:51:16 +0900 (Sat, 02 Dec 2017) | 1 line

Update to ruby/spec@e2d0d1e
------------------------------------------------------------------------
r60974 | svn | 2017-12-02 00:41:52 +0900 (Sat, 02 Dec 2017) | 1 line

* append newline at EOF.
------------------------------------------------------------------------
r60973 | eregon | 2017-12-02 00:41:50 +0900 (Sat, 02 Dec 2017) | 1 line

Update to ruby/spec@bacedc5
------------------------------------------------------------------------
r60972 | eregon | 2017-12-02 00:41:23 +0900 (Sat, 02 Dec 2017) | 1 line

Update to ruby/mspec@b501ade
------------------------------------------------------------------------
r60971 | svn | 2017-12-02 00:09:42 +0900 (Sat, 02 Dec 2017) | 1 line

* 2017-12-02
------------------------------------------------------------------------
r60970 | naruse | 2017-12-02 00:09:41 +0900 (Sat, 02 Dec 2017) | 6 lines

Append "//" if empty host for file or postgres URI

https://url.spec.whatwg.org/#url-serializing
> Otherwise, if url's host is null and url's scheme is "file", append "//" to output.

URL spec doesn't says anything about postgres, but assume the same thing.
------------------------------------------------------------------------
r60969 | naruse | 2017-12-01 23:32:12 +0900 (Fri, 01 Dec 2017) | 1 line

re-apply r60755
------------------------------------------------------------------------
r60968 | svn | 2017-12-01 23:08:14 +0900 (Fri, 01 Dec 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60967 | naruse | 2017-12-01 23:08:13 +0900 (Fri, 01 Dec 2017) | 1 line

Add missing file
------------------------------------------------------------------------
r60966 | naruse | 2017-12-01 22:50:13 +0900 (Fri, 01 Dec 2017) | 3 lines

Update to Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05.

[Bug #13892]
------------------------------------------------------------------------
r60965 | yui-knk | 2017-12-01 22:40:03 +0900 (Fri, 01 Dec 2017) | 23 lines

parse.y: Fix locations of NODEs related to for statement

* parse.y: Fix to only include a range of for_var.

  e.g. The locations of the NODE_ARGS and NODE_DVAR are fixed:

  ```
  for a in m do n end
  ```

  * Before

  ```
  NODE_ARGS (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 19)
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 19)
  ```

  * After

  ```
  NODE_ARGS (line: 1, first_lineno: 1, first_column: 4, last_lineno: 1, last_column: 5)
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 4, last_lineno: 1, last_column: 5)
  ```
------------------------------------------------------------------------
r60964 | k0kubun | 2017-12-01 21:26:40 +0900 (Fri, 01 Dec 2017) | 12 lines

vm.c: partially revert r60558

because it was actually used in
https://github.com/tmm1/rbtrace/blob/v0.4.8/ext/rbtrace.c#L329
and deprecated in r60579 AFTER removal in r60558.

ko1 agreed that we should keep just deprecated in Ruby 2.5 and remove it
later, and I'm commiting this because I want to make rbtrace.gem
installation successful.

backward.h: modify r60579 to make rb_frame_method_id_and_class()
compilable.
------------------------------------------------------------------------
r60963 | nobu | 2017-12-01 21:00:10 +0900 (Fri, 01 Dec 2017) | 1 line

vm_trace.c: suppress -Wclobbered warning
------------------------------------------------------------------------
r60962 | nobu | 2017-12-01 21:00:09 +0900 (Fri, 01 Dec 2017) | 6 lines

vm_trace.c: remove duplicate flag

* vm_trace.c (rb_suppress_tracing): remove duplicate flag
  `tracing`, which equals to `ec->trace_arg != NULL`.  and that
  `ec->trace_arg` points `dummy_trace_arg` means it was NULL at
  the beginning.
------------------------------------------------------------------------
r60961 | akr | 2017-12-01 19:48:29 +0900 (Fri, 01 Dec 2017) | 51 lines

Replace Kernel#pp after PP class is defined.

Avoid a race condition which a context switch
occur after replacing Kernel#pp but before
defining PP class.

Following patch, inserting sleep, makes
this problem reproducible.

```
Index: lib/pp.rb
===================================================================
--- lib/pp.rb	(revision 60960)
+++ lib/pp.rb	(working copy)
@@ -26,6 +26,7 @@ module Kernel
   end
   undef __pp_backup__ if method_defined?(:__pp_backup__)
   module_function :pp
+  sleep 1 # thread context switch
 end
 
 ##
```

With the above patch, "uninitialized constant Kernel::PP" can
happen as as follows.

```
% ./ruby -w -Ilib -e '
t1 = Thread.new {
  Thread.current.report_on_exception = true
  pp :foo1
}
t2 = Thread.new {
  Thread.current.report_on_exception = true
  sleep 0.5
  pp :foo2
}
t1.join rescue nil
t2.join rescue nil
'
#<Thread:0x000055dbf926eaa0@-e:6 run> terminated with exception:
Traceback (most recent call last):
	3: from -e:9:in `block in <main>'
	2: from /home/ruby/tst2/ruby/lib/pp.rb:22:in `pp'
	1: from /home/ruby/tst2/ruby/lib/pp.rb:22:in `each'
/home/ruby/tst2/ruby/lib/pp.rb:23:in `block in pp': uninitialized constant Kernel::PP (NameError)
:foo1
```


------------------------------------------------------------------------
r60960 | yui-knk | 2017-12-01 18:48:17 +0900 (Fri, 01 Dec 2017) | 21 lines

parse.y: Fix a location of NODE_HASH

* parse.y: Fix to only include a range of assocs.

  e.g. The locations of the NODE_HASH is fixed:

  ```
  a(1, b: 10, &block)
  ```

  * Before

  ```
  NODE_HASH (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 18)
  ```

  * After

  ```
  NODE_HASH (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 10)
  ```
------------------------------------------------------------------------
r60959 | mrkn | 2017-12-01 17:35:58 +0900 (Fri, 01 Dec 2017) | 3 lines

NEWS: Net::HTTP is a stdlib

[ci skip]
------------------------------------------------------------------------
r60958 | yui-knk | 2017-12-01 15:32:59 +0900 (Fri, 01 Dec 2017) | 21 lines

parse.y: Fix a location of hash keys

* parse.y: Use @1 to only include a range of tLABEL.

  e.g. The locations of the NODE_LIT(:b) is fixed:

  ```
  a(1, b: 10)
  ```

  * Before

  ```
  NODE_LIT (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 10)
  ```

  * After

  ```
  NODE_LIT (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60957 | usa | 2017-12-01 14:32:29 +0900 (Fri, 01 Dec 2017) | 5 lines

bold/underscore support in traceback before Windows10

* io.c (rb_write_error2): call `rb_w32_write_console()` when the device is tty,
  like `rb_write_error_str()`.

------------------------------------------------------------------------
r60956 | hsbt | 2017-12-01 13:39:49 +0900 (Fri, 01 Dec 2017) | 1 line

Added repository url for default gems.
------------------------------------------------------------------------
r60955 | nobu | 2017-12-01 13:27:32 +0900 (Fri, 01 Dec 2017) | 1 line

prelude.c.tmpl: escape comments
------------------------------------------------------------------------
r60954 | hsbt | 2017-12-01 13:25:32 +0900 (Fri, 01 Dec 2017) | 1 line

Added bundler entry to documentation of library and maintainers.
------------------------------------------------------------------------
r60953 | nobu | 2017-12-01 12:54:50 +0900 (Fri, 01 Dec 2017) | 5 lines

prelude.c.tmpl: split prelude code

* template/prelude.c.tmpl: split prelude code into blocks so that
  each elements do not exceed the string literal size limit in
  C89.
------------------------------------------------------------------------
r60952 | nobu | 2017-12-01 12:54:49 +0900 (Fri, 01 Dec 2017) | 1 line

prelude.rb: suppress redefinition warnings
------------------------------------------------------------------------
r60951 | hsbt | 2017-12-01 10:52:26 +0900 (Fri, 01 Dec 2017) | 3 lines

Merge psych-3.0.0.

  See NEWS file for this update details.
------------------------------------------------------------------------
r60950 | usa | 2017-12-01 10:29:50 +0900 (Fri, 01 Dec 2017) | 5 lines

revert r60873

* template/prelude.c.tmpl (translate): revert r60873 because when some errors or
  warnings are shown their line numbers are shifted.

------------------------------------------------------------------------
r60949 | svn | 2017-12-01 09:41:18 +0900 (Fri, 01 Dec 2017) | 1 line

* 2017-12-01
------------------------------------------------------------------------
r60948 | mame | 2017-12-01 09:41:17 +0900 (Fri, 01 Dec 2017) | 1 line

lib/pp.rb (Kernel#pp): Fix a race condition
------------------------------------------------------------------------
r60945 | mame | 2017-11-30 11:12:42 +0900 (Thu, 30 Nov 2017) | 1 line

prelude.rb (Kernel#pp): Fix a delegation bug
------------------------------------------------------------------------
r60944 | mame | 2017-11-30 10:31:00 +0900 (Thu, 30 Nov 2017) | 3 lines

prelude.rb: Add Kernel#pp, a trigger for lib/pp.rb

[Feature #14123]
------------------------------------------------------------------------
r60943 | marcandre | 2017-11-30 04:46:46 +0900 (Thu, 30 Nov 2017) | 1 line

Cherrypick 9f8d3d0 from ruby/spec
------------------------------------------------------------------------
r60942 | marcandre | 2017-11-30 02:47:59 +0900 (Thu, 30 Nov 2017) | 1 line

Make Module#{define|alias|undef|remove}_method public [#14133]
------------------------------------------------------------------------
r60941 | svn | 2017-11-30 02:47:48 +0900 (Thu, 30 Nov 2017) | 1 line

* 2017-11-30
------------------------------------------------------------------------
r60940 | marcandre | 2017-11-30 02:47:47 +0900 (Thu, 30 Nov 2017) | 1 line

Make Module#attr{accessor|reader|writer|} public [#14132]
------------------------------------------------------------------------
r60939 | nobu | 2017-11-29 23:48:02 +0900 (Wed, 29 Nov 2017) | 1 line

configure.ac: fixed a typo [Feature #4052]
------------------------------------------------------------------------
r60938 | naruse | 2017-11-29 21:04:24 +0900 (Wed, 29 Nov 2017) | 1 line

Update information about Oniguruma/Onigmo [Bug #13818]
------------------------------------------------------------------------
r60937 | k0kubun | 2017-11-29 20:27:32 +0900 (Wed, 29 Nov 2017) | 9 lines

test_workspace.rb: prefer using skip

rather than ignoring test definition to know untestability when
executing test with `-v`.

Also this simplifies check using `MiniTest::Unit::Guard#windows?`.

This change is suggested by @MSP-Greg here:
https://github.com/ruby/ruby/commit/7128849c8c5fce8df450379db54136fd21fab6ad#commitcomment-25836745
------------------------------------------------------------------------
r60936 | sorah | 2017-11-29 20:16:14 +0900 (Wed, 29 Nov 2017) | 3 lines

Typo... the feature committed at r60935

[Feature #14140] [ruby-core:83963]
------------------------------------------------------------------------
r60935 | sorah | 2017-11-29 20:14:23 +0900 (Wed, 29 Nov 2017) | 6 lines

Log exception with bold and underline for TTYs

Print error message in bold/underlined text if STDERR is unchanged and a tty.
[Feature #14160] [experimental]

Screenshot: https://img.sorah.jp/s/2017-11-29_1711_xj2fu.png
------------------------------------------------------------------------
r60934 | nobu | 2017-11-29 19:38:36 +0900 (Wed, 29 Nov 2017) | 1 line

spec/ruby/optional/capi/constants_spec.rb: Data is deprecated now
------------------------------------------------------------------------
r60933 | nobu | 2017-11-29 18:59:20 +0900 (Wed, 29 Nov 2017) | 3 lines

file.c: File.lutime

* file.c (utime_internal): add File.lutime.  [Feature #4052]
------------------------------------------------------------------------
r60932 | svn | 2017-11-29 17:39:48 +0900 (Wed, 29 Nov 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60931 | shugo | 2017-11-29 17:39:47 +0900 (Wed, 29 Nov 2017) | 5 lines

Unused module refinement shouldn't break method search.

Use rb_callable_method_entry_t::defined_class instead of
rb_callable_method_entry_t::owner, because the superclass of iclass
should be searched for modules. [ruby-core:83613] [Bug #14068]
------------------------------------------------------------------------
r60930 | nobu | 2017-11-29 17:23:16 +0900 (Wed, 29 Nov 2017) | 4 lines

object.c: deprecate Data

* object.c (InitVM_Object): Data is deprecated now.
  [Feature #3072]
------------------------------------------------------------------------
r60929 | nobu | 2017-11-29 16:57:48 +0900 (Wed, 29 Nov 2017) | 6 lines

strscan.c: add MatchData-like methods

* ext/strscan/strscan.c: added `size`, `captures` and `values_at`
  to StringScanner, shorthands of accessing the matched data.
  based on the patch by apeiros (Stefan Rusterholz) at
  [ruby-core:20412].  [Feature #836]
------------------------------------------------------------------------
r60928 | svn | 2017-11-29 07:30:29 +0900 (Wed, 29 Nov 2017) | 1 line

* 2017-11-29
------------------------------------------------------------------------
r60927 | hsbt | 2017-11-29 07:30:28 +0900 (Wed, 29 Nov 2017) | 3 lines

Merge rubygems-2.7.3.

  http://blog.rubygems.org/2017/11/28/2.7.3-released.html
------------------------------------------------------------------------
r60926 | yui-knk | 2017-11-28 15:19:04 +0900 (Tue, 28 Nov 2017) | 1 line

Fix typos
------------------------------------------------------------------------
r60925 | normal | 2017-11-28 12:28:35 +0900 (Tue, 28 Nov 2017) | 23 lines

file: release GVL for access(2) syscalls

Like stat(2), the access(2) syscall may take an indeterminate
amount of time on slow/remote filesystems.

This lets the following methods release the GVL to avoid choking
the entire VM while one thread is stuck on a slow or
non-responsive filesystem:

- File.readable?
- File.readable_real?
- File.writable?
- File.writable_real?
- File.executable?
- File.executable_real?

* file.c (nogvl_eaccess): new function
  (nogvl_access): ditto
  (rb_access): new wrapper function
  (rb_eaccess): release GVL
  (rb_file_readable_real_p): use rb_access
  (rb_file_writable_real_p): ditto
  (rb_file_executable_real_p): ditto
------------------------------------------------------------------------
r60924 | svn | 2017-11-28 11:27:48 +0900 (Tue, 28 Nov 2017) | 1 line

* 2017-11-28
------------------------------------------------------------------------
r60923 | ko1 | 2017-11-28 11:27:47 +0900 (Tue, 28 Nov 2017) | 9 lines

check ruby_vm_event_flags everytime.

* vm_insnhelper.c (vm_trace): use EXEC_EVENT_HOOK() instead of
  EXEC_EVENT_HOOK_VM_TRACE(). The latter macro assumes
  `ruby_vm_event_flags` is constant in `vm_trace()` function,
  but it can be changed in hook functions.

* vm_core.h (EXEC_EVENT_HOOK_VM_TRACE): removed.

------------------------------------------------------------------------
r60922 | hsbt | 2017-11-27 20:02:48 +0900 (Mon, 27 Nov 2017) | 1 line

Ignored obsoleted `bundle_ruby` command from upstream.
------------------------------------------------------------------------
r60921 | svn | 2017-11-27 19:45:27 +0900 (Mon, 27 Nov 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60920 | hsbt | 2017-11-27 19:45:24 +0900 (Mon, 27 Nov 2017) | 3 lines

Merge rdoc-6.0.0.beta4 from upstream.

  It version applied `frozen_string_literal: true`
------------------------------------------------------------------------
r60919 | nobu | 2017-11-27 15:59:07 +0900 (Mon, 27 Nov 2017) | 4 lines

psych_parser.c: fix compile error

* ext/psych/psych_parser.c (parse): fix declarations after
  statement, which cause compile error on mswin.
------------------------------------------------------------------------
r60918 | hsbt | 2017-11-27 14:38:48 +0900 (Mon, 27 Nov 2017) | 3 lines

Ignored `bundle_ruby` example with Ruby core.

  It was ignored with Bundler-1.15.x. It's regression at r60603.
------------------------------------------------------------------------
r60917 | hsbt | 2017-11-27 12:11:18 +0900 (Mon, 27 Nov 2017) | 1 line

Merge psych-3.0.0.beta4 from upstream.
------------------------------------------------------------------------
r60916 | ko1 | 2017-11-27 11:11:36 +0900 (Mon, 27 Nov 2017) | 5 lines

Ignore failures related to threading.

* test/lib/tracepointchecker.rb: ignore "deletion trace" check
  when there are threads other than the main thread.

------------------------------------------------------------------------
r60915 | ko1 | 2017-11-27 09:43:23 +0900 (Mon, 27 Nov 2017) | 7 lines

Relax `rb_bug()` condition.

* iseq.c (rb_iseq_trace_set): simply return immediately if
  ISeq::compile_data is available. Not sure why this state
  is allowed, but exception during compile (or `ISeq::load`)
  can make such states.

------------------------------------------------------------------------
r60914 | yui-knk | 2017-11-27 08:52:47 +0900 (Mon, 27 Nov 2017) | 22 lines

parse.y: Fix the last location of NODE_KW_ARG

* parse.y (kwd_append): Update the last location of
  NODE_KW_ARG when NODE is appended to the last.

  e.g. The locations of the first NODE_KW_ARG is fixed:

  ```
  def a(b: 1, c: 2); end
  ```

  * Before

  ```
  NODE_KW_ARG (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 10)
  ```

  * After

  ```
  NODE_KW_ARG (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 16)
  ```
------------------------------------------------------------------------
r60913 | svn | 2017-11-27 08:33:24 +0900 (Mon, 27 Nov 2017) | 1 line

* 2017-11-27
------------------------------------------------------------------------
r60912 | yui-knk | 2017-11-27 08:33:23 +0900 (Mon, 27 Nov 2017) | 22 lines

parse.y: Fix the last location of NODE_OPT_ARG

* parse.y (opt_arg_append): Update the last location of
  NODE_OPT_ARG when NODE is appended to the last.

  e.g. The locations of the first NODE_OPT_ARG is fixed:

  ```
  def a(b = 1, c = 2); end
  ```

  * Before

  ```
  NODE_OPT_ARG (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 11)
  ```

  * After

  ```
  NODE_OPT_ARG (line: 1, first_lineno: 1, first_column: 6, last_lineno: 1, last_column: 18)
  ```
------------------------------------------------------------------------
r60911 | rhe | 2017-11-26 19:33:32 +0900 (Sun, 26 Nov 2017) | 8 lines

openssl: sync with 2475d94517b4

Merge a commit from upstream:

	01445af367ec test/test_ssl: prevent changing default internal encoding

OpenSSL::TestSSL#test_fallback_scsv could change the default internal
encoding accidentally, causing other unrelated test cases to fail.
------------------------------------------------------------------------
r60910 | nobu | 2017-11-26 11:11:24 +0900 (Sun, 26 Nov 2017) | 1 line

leakchecker.rb: no conversion
------------------------------------------------------------------------
r60909 | svn | 2017-11-26 10:36:34 +0900 (Sun, 26 Nov 2017) | 1 line

* 2017-11-26
------------------------------------------------------------------------
r60908 | nobu | 2017-11-26 10:36:33 +0900 (Sun, 26 Nov 2017) | 1 line

util.h: remove my_getcwd
------------------------------------------------------------------------
r60907 | rhe | 2017-11-25 23:12:08 +0900 (Sat, 25 Nov 2017) | 47 lines

openssl: import v2.1.0.beta2

Import Ruby/OpenSSL 2.1.0.beta2. The full commit log since commit
e72d960db262 which was imported by r60013 can be found at:

	https://github.com/ruby/openssl/compare/e72d960db262...v2.1.0.beta2

----------------------------------------------------------------
Kazuki Yamaguchi (26):
      bn: use ALLOCV() macro instead of xmalloc()
      appveyor.yml: remove 'openssl version' line
      test/test_ssl_session: skip tests for session_remove_cb
      x509ext: implement X509::Extension#==
      x509attr: implement X509::Attribute#==
      x509cert: implement X509::Certificate#==
      x509revoked: add missing X509::Revoked#to_der
      x509crl, x509revoked: implement X509::{CRL,Revoked}#==
      x509req: implement X509::Request#==
      ssl: extract rb_intern("call")
      cipher: disallow setting AAD for non-AEAD ciphers
      test/test_cipher: fix test_non_aead_cipher_set_auth_data failure
      ssl: fix conflict of options in SSLContext#set_params
      buffering: let #write accept multiple arguments
      pkey: make pkey_check_public_key() non-static
      x509cert, x509crl, x509req, ns_spki: check sanity of public key
      test/envutil: port assert_warning from Ruby trunk
      test/utils: remove a pointless .public_key call in issue_cert
      ssl: add SSLContext#add_certificate
      test/test_ssl: fix test_security_level
      Drop support for LibreSSL 2.4
      kdf: add HKDF support
      test/test_x509cert: fix flaky test
      test/test_x509crl: fix random failure
      History.md: fix a typo
      Ruby/OpenSSL 2.1.0.beta2

Mark Wright (1):
      Fix build failure against OpenSSL 1.1 built with no-deprecated Thanks rhenium for the code review and fixes.

Peter Karman (1):
      Add RSA sign_pss() and verify_pss() methods

aeris (1):
      TLS Fallback Signaling Cipher Suite Value

kazu (1):
      Use caller with length to reduce unused strings
------------------------------------------------------------------------
r60906 | rhe | 2017-11-25 23:12:07 +0900 (Sat, 25 Nov 2017) | 3 lines

openssl: revert changes in SSLContext#{min,max}_version= in r60310

And adapt a net/http test to their old behavior.  [ruby-core:83491]
------------------------------------------------------------------------
r60905 | yui-knk | 2017-11-25 20:57:33 +0900 (Sat, 25 Nov 2017) | 4 lines

parse.y: opt_arg_append

* parse.y (opt_arg_append): extract optional arguments
  append.
------------------------------------------------------------------------
r60904 | svn | 2017-11-25 10:39:46 +0900 (Sat, 25 Nov 2017) | 1 line

* 2017-11-25
------------------------------------------------------------------------
r60903 | yui-knk | 2017-11-25 10:39:45 +0900 (Sat, 25 Nov 2017) | 26 lines

parse.y: Fix a location of assignable nodes

* parse.y (new_op_assign_gen): Update the location of
  lhs when NODE_OP_ASGN_OR/NODE_OP_ASGN_AND are generated.
  When NODE_OP_ASGN_OR/NODE_OP_ASGN_AND are generated
  a nd_value of lhs is set, so it is needed to update
  a location of lhs to include a location of rhs (same as
  node_assign_gen).

  e.g. The locations of NODE_DASGN_CURR is fixed:

  ```
  a ||= 1
  ```

  * Before

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 1)
  ```

  * After

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60902 | yui-knk | 2017-11-24 22:08:21 +0900 (Fri, 24 Nov 2017) | 4 lines

node.h: Remove not used macros

* node.h (nd_modl, nd_clss_, nd_tval, nd_visi_): Remove
  not used macros.
------------------------------------------------------------------------
r60901 | k0kubun | 2017-11-24 21:37:07 +0900 (Fri, 24 Nov 2017) | 11 lines

test_workspace.rb: skip test failing on windows

> Note that all files are always readable
> https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/chmod-wchmod
It seems that we can't make a file unreadable with `File.chmod` on
Windows.

When file can't be read, File::EACCES is raised on Windows too. So
r60900 should work anyway, but I don't know how to let it happen by
Ruby code. I tried to open file before reading it, but I couldn't
reproduce File::EACCES too.
------------------------------------------------------------------------
r60900 | kazu | 2017-11-24 20:00:10 +0900 (Fri, 24 Nov 2017) | 1 line

Fix TOCTTOU and avoid to read existing unreadable file
------------------------------------------------------------------------
r60899 | kazu | 2017-11-24 20:00:08 +0900 (Fri, 24 Nov 2017) | 1 line

Fix typos [ci skip]
------------------------------------------------------------------------
r60898 | nobu | 2017-11-24 14:46:55 +0900 (Fri, 24 Nov 2017) | 1 line

test/irb/test_workspace.rb: fix SCRIPT_LINES__
------------------------------------------------------------------------
r60897 | nobu | 2017-11-24 14:44:58 +0900 (Fri, 24 Nov 2017) | 1 line

workspace.rb: one more space
------------------------------------------------------------------------
r60896 | nobu | 2017-11-24 14:00:56 +0900 (Fri, 24 Nov 2017) | 6 lines

workspace.rb: fix SCRIPT_LINES__

* lib/irb/workspace.rb (code_around_binding): `SCRIPT_LINES__`
  values are arrays of lines.  get file and line at once.  moved
  loop-invariant format string.  join without extra strings by
  `$,`.
------------------------------------------------------------------------
r60895 | normal | 2017-11-24 13:49:05 +0900 (Fri, 24 Nov 2017) | 8 lines

file.c: simplify eaccess(3) callers

This will make future work to release GVL here simpler.

* file.c (rb_eaccess): new function
  (rb_file_readable_p): use rb_eaccess
  (rb_file_writable_p): ditto
  (rb_file_executable_p): ditto
------------------------------------------------------------------------
r60894 | k0kubun | 2017-11-24 13:29:49 +0900 (Fri, 24 Nov 2017) | 3 lines

NEWS: note about r57274

fixed r60888 to have Feature number too.
------------------------------------------------------------------------
r60893 | nobu | 2017-11-24 13:26:29 +0900 (Fri, 24 Nov 2017) | 3 lines

parse.y: make_array

* parse.y (make_array): turn NULL node into zero length array.
------------------------------------------------------------------------
r60892 | nobu | 2017-11-24 13:26:27 +0900 (Fri, 24 Nov 2017) | 8 lines

parse.y: refactor list literals

* parse.y (words, symbols, qwords, qsymbols): unify empty list and
  non-empty list.

* parse.y (parser_parse_string): always dispatch a word separator
  at the beginning of list literals.
  [ruby-core:83871] [Bug #14126]
------------------------------------------------------------------------
r60891 | nobu | 2017-11-24 13:26:23 +0900 (Fri, 24 Nov 2017) | 5 lines

test_parser_events.rb: results of list literals

* test/ripper/test_parser_events.rb (test_qwords_add),
  (test_qsymbols_add, test_symbols_add, test_words_add): more
  assertions for results of list literals.
------------------------------------------------------------------------
r60890 | svn | 2017-11-24 12:53:30 +0900 (Fri, 24 Nov 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60889 | svn | 2017-11-24 12:53:28 +0900 (Fri, 24 Nov 2017) | 1 line

* 2017-11-24
------------------------------------------------------------------------
r60888 | k0kubun | 2017-11-24 12:53:27 +0900 (Fri, 24 Nov 2017) | 3 lines

irb.rb: show source around binding.irb on start

[Feature #14124] [ruby-dev:50319] [close GH-1764]
------------------------------------------------------------------------
r60887 | yui-knk | 2017-11-23 23:15:27 +0900 (Thu, 23 Nov 2017) | 22 lines

parse.y: Fix a location of serial NODE_AND/NODE_OR

* parse.y (logop_gen): Update the last location of
  NODE_AND/NODE_OR when NODE is appended to the last.

  e.g. The locations of NODE_AND is fixed:

  ```
  a && b && c
  ```

  * Before

  ```
  NODE_AND (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6)
  ```

  * After

  ```
  NODE_AND (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 11)
  ```
------------------------------------------------------------------------
r60886 | k0kubun | 2017-11-23 23:04:24 +0900 (Thu, 23 Nov 2017) | 12 lines

.travis.yml: revert "workaround to resolve ::1"

This commit reverts r60736.

Shibata-san reported the cause of r60736 to Travis and it seems fixed:
https://github.com/travis-ci/travis-ci/issues/8780

In another CI, I found "::1     ip6-localhost ip6-loopback" in build
system information, unlike "::1  localhost ip6-localhost ip6-loopback"
that had failed in Ruby's CI on Travis.

Let's try Container-based environment again.
------------------------------------------------------------------------
r60885 | yui-knk | 2017-11-23 20:52:36 +0900 (Thu, 23 Nov 2017) | 4 lines

thread.c: Update documents

* thread.c (rb_default_coverage): Update documents of internal
  data structures for branch coverage.
------------------------------------------------------------------------
r60884 | nobu | 2017-11-23 16:10:56 +0900 (Thu, 23 Nov 2017) | 4 lines

io.c: read BOM only for reading

* io.c (io_strip_bom): just abandon detecting UTF encoding by BOM
  unless opened for reading.
------------------------------------------------------------------------
r60883 | nobu | 2017-11-23 13:30:23 +0900 (Thu, 23 Nov 2017) | 8 lines

ripper.y: fix word list events

* parse.y (parser_skip_words_sep): QWORDS_BEG should not include
  the first separators in ripper.

* parse.y (parser_parse_string): WORDS_SEP should not include
  the closing parentheses of a word list in ripper, should include
  spaces at beginning of lines.  [ruby-core:83864] [Bug #14126]
------------------------------------------------------------------------
r60882 | nobu | 2017-11-23 12:14:12 +0900 (Thu, 23 Nov 2017) | 1 line

debug.c: include RIMemo in ruby_dummy_gdb_enums
------------------------------------------------------------------------
r60881 | stomar | 2017-11-23 06:13:51 +0900 (Thu, 23 Nov 2017) | 1 line

lib/set.rb: [DOC] remove empty comments
------------------------------------------------------------------------
r60880 | svn | 2017-11-23 05:58:25 +0900 (Thu, 23 Nov 2017) | 1 line

* 2017-11-23
------------------------------------------------------------------------
r60879 | stomar | 2017-11-23 05:58:24 +0900 (Thu, 23 Nov 2017) | 5 lines

set.rb: improve docs for Set

* lib/set.rb: [DOC] add examples for Set#replace,
  add examples for creating a set from a hash with duplicates,
  simplify and fix style of some other examples, fix typos.
------------------------------------------------------------------------
r60878 | svn | 2017-11-22 21:32:42 +0900 (Wed, 22 Nov 2017) | 1 line

* 2017-11-22
------------------------------------------------------------------------
r60877 | yui-knk | 2017-11-22 21:32:41 +0900 (Wed, 22 Nov 2017) | 22 lines

parse.y: Fix the locations of NODE_BLOCK_PASS

  * parse.y (arg_blk_pass): Update the first location of
    NODE_BLOCK_PASS if nd_head is assigned.

  e.g. The locations of NODE_BLOCK_PASS is fixed:

  ```
  a(1, &:to_s)
  ```

  * Before

  ```
  NODE_BLOCK_PASS (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 11)
  ```

  * After

  ```
  NODE_BLOCK_PASS (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 11)
  ```
------------------------------------------------------------------------
r60876 | kazu | 2017-11-21 21:29:52 +0900 (Tue, 21 Nov 2017) | 1 line

Fix a typo
------------------------------------------------------------------------
r60875 | kazu | 2017-11-21 21:29:51 +0900 (Tue, 21 Nov 2017) | 4 lines

Use `const void*` instead of `const char*`

Use cast from `char*` to `void*` instead of union in opendir_without_gvl,
because convert from `void*` to `char*` without union in nogvl_opendir.
------------------------------------------------------------------------
r60874 | nobu | 2017-11-21 20:15:51 +0900 (Tue, 21 Nov 2017) | 4 lines

vm_args.c: ec arg of args_setup_kw_parameters

* vm_args.c (args_setup_kw_parameters): use same ec as the caller.
  make arguments order consistent with other functions.
------------------------------------------------------------------------
r60873 | usa | 2017-11-21 17:48:07 +0900 (Tue, 21 Nov 2017) | 5 lines

Skip comment lines

* template/prelude.c.tmpl (translate): empty (only LF) lines are not necessary.
  so skip them, but for safety only when they are made from comment line.

------------------------------------------------------------------------
r60872 | nobu | 2017-11-21 14:01:28 +0900 (Tue, 21 Nov 2017) | 6 lines

fix test_erb.rb [GH-1763]

* test/erb/test_erb.rb (test_run): require stringio.  suppress an
  unused variable warning.

From: MSP-Greg <MSP-Greg@users.noreply.github.com>
------------------------------------------------------------------------
r60871 | ko1 | 2017-11-21 11:57:01 +0900 (Tue, 21 Nov 2017) | 5 lines

check invariant.

* iseq.c (rb_iseq_trace_set): at this point ISEQ_USE_COMPILE_DATA
  should not be set.

------------------------------------------------------------------------
r60870 | eregon | 2017-11-21 09:56:09 +0900 (Tue, 21 Nov 2017) | 1 line

test/ruby/bug-13526.rb: should wait until all threads are stopped
------------------------------------------------------------------------
r60869 | yui-knk | 2017-11-21 09:47:00 +0900 (Tue, 21 Nov 2017) | 26 lines

parse.y: Fix the locations of NODE in percent strings

  * parse.y (parser_yylex): token_flush before
    calling parse_string. Without token_flush
    the first locations of NODE in percent strings
    are set to the location of %.

  e.g. The locations of NODE_STR is fixed:

  ```
  %w[a b]
  ```

  * Before

  ```
  NODE_STR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 4) ("a")
  NODE_STR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6) ("b")
  ```

  * After

  ```
  NODE_STR (line: 1, first_lineno: 1, first_column: 3, last_lineno: 1, last_column: 4) ("a")
  NODE_STR (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 6) ("b")
  ```
------------------------------------------------------------------------
r60868 | yui-knk | 2017-11-21 08:58:42 +0900 (Tue, 21 Nov 2017) | 21 lines

parse.y: Fix the last location of NODE_STR in %w

  * parse.y: Use @2 to only include a range of tSTRING_CONTENT.

  e.g. The locations of NODE_STR is fixed:

  ```
  %w[a]
  ```

  * Before

  ```
  NODE_STR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 5)
  ```

  * After

  ```
  NODE_STR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 4)
  ```
------------------------------------------------------------------------
r60867 | yui-knk | 2017-11-21 08:37:01 +0900 (Tue, 21 Nov 2017) | 23 lines

parse.y: Set the last location of NODE_ARRAY in %w

  * parse.y: list_append uses the locations
    of the second argument. So we should set the
    locations of $2 before pass it to list_append.

  e.g. The locations of NODE_ARRAY is fixed:

  ```
  %w[a b]
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 0, last_column: -1)
  ```

  * After

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60866 | yui-knk | 2017-11-21 08:12:43 +0900 (Tue, 21 Nov 2017) | 21 lines

parse.y: Fix the last location of NODE_LIT in %i

  * parse.y: Use @2 to not include a range of ' '.

  e.g. The locations of NODE_LIT is fixed:

  ```
  %i[a]
  ```

  * Before

  ```
  NODE_LIT (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 5)
  ```

  * After

  ```
  NODE_LIT (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 4)
  ```
------------------------------------------------------------------------
r60865 | svn | 2017-11-21 07:48:06 +0900 (Tue, 21 Nov 2017) | 1 line

* 2017-11-21
------------------------------------------------------------------------
r60864 | yui-knk | 2017-11-21 07:48:05 +0900 (Tue, 21 Nov 2017) | 23 lines

parse.y: Set the last location of NODE_ARRAY in %i

  * parse.y: list_append uses the locations
    of the second argument. So we should set the
    locations of $2 before pass it to list_append.

  e.g. The locations of NODE_ARRAY is fixed:

  ```
  %i[a b]
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 0, last_column: -1)
  ```

  * After

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60863 | kazu | 2017-11-20 21:57:08 +0900 (Mon, 20 Nov 2017) | 1 line

[DOC] Fix example result [ci skip]
------------------------------------------------------------------------
r60862 | yui-knk | 2017-11-20 15:00:04 +0900 (Mon, 20 Nov 2017) | 22 lines

parse.y: Fix the locations of NODE_FCALL

  * parse.y: Update the locations of NODE_FCALL
    when nd_args is determined.

  e.g. The locations of NODE_FCALL is fixed:

  ```
  a 1
  ```

  * Before

  ```
  NODE_FCALL (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 1)
  ```

  * After

  ```
  NODE_FCALL (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 3)
  ```
------------------------------------------------------------------------
r60861 | normal | 2017-11-20 11:29:35 +0900 (Mon, 20 Nov 2017) | 8 lines

File.mkfifo releases GVL

mkfifo(3) is subject to the same problems as open(2) on slow
filesystems.  Release the GVL and let the rest of the VM run
while we call mkfifo.

* file.c (nogvl_mkfifo): new function
  (rb_file_s_mkfifo): release GVL
------------------------------------------------------------------------
r60860 | marcandre | 2017-11-20 11:18:43 +0900 (Mon, 20 Nov 2017) | 3 lines

lib/matrix: Add hadamard_product/entrywise_product.

Based on a patch by Charley Hutchison. [GH-674]
------------------------------------------------------------------------
r60859 | marcandre | 2017-11-20 11:18:34 +0900 (Mon, 20 Nov 2017) | 1 line

lib/matrix: Add Matrix{.|#}combine
------------------------------------------------------------------------
r60858 | marcandre | 2017-11-20 11:18:23 +0900 (Mon, 20 Nov 2017) | 1 line

lib/matrix: accept vectors in {h|v}stack
------------------------------------------------------------------------
r60857 | marcandre | 2017-11-20 11:18:12 +0900 (Mon, 20 Nov 2017) | 1 line

lib/matrix: Add explicit coercion #to_matrix
------------------------------------------------------------------------
r60856 | nobu | 2017-11-20 10:17:43 +0900 (Mon, 20 Nov 2017) | 10 lines

win32.c: vm_exit_handler

* win32/win32.c (vm_exit_handler): separate exit handler for
  resources which must be released at exit of Ruby VM.

* win32/win32.c (socklist_insert, constat_handle): install the VM
  exit handler.

* gc.c (ENABLE_VM_OBJSPACE): no longer needs process global object
  space on Windows too.
------------------------------------------------------------------------
r60855 | yui-knk | 2017-11-20 08:59:32 +0900 (Mon, 20 Nov 2017) | 22 lines

Update the last location of NODE_BLOCK

* parse.y (block_append_gen): Update the last
  location of NODE_BLOCK when a tail is appended.

  e.g. The locations of NODE_BLOCK is fixed:

  ```
  a; b; c
  ```

  * Before

  ```
  NODE_BLOCK (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 4)
  ```

  * After

  ```
  NODE_BLOCK (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60854 | eregon | 2017-11-20 00:15:49 +0900 (Mon, 20 Nov 2017) | 4 lines

test/ruby/bug-13526.rb: Fix to actually refer to an existing file

* Add Thread.report_on_exception=true to catch problems early.
* Increase the number of Thread.pass to let the autoload start.
------------------------------------------------------------------------
r60853 | svn | 2017-11-20 00:15:32 +0900 (Mon, 20 Nov 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60852 | svn | 2017-11-20 00:15:32 +0900 (Mon, 20 Nov 2017) | 1 line

* append newline at EOF.
------------------------------------------------------------------------
r60851 | eregon | 2017-11-20 00:15:31 +0900 (Mon, 20 Nov 2017) | 3 lines

Add specs for concurrent Module#autoload

* When the file does not exist or the constant is not set.
------------------------------------------------------------------------
r60850 | svn | 2017-11-20 00:15:13 +0900 (Mon, 20 Nov 2017) | 1 line

* 2017-11-20
------------------------------------------------------------------------
r60849 | eregon | 2017-11-20 00:15:12 +0900 (Mon, 20 Nov 2017) | 1 line

Reorganize Module#autoload to have similar specs next to each other
------------------------------------------------------------------------
r60848 | nobu | 2017-11-19 16:07:42 +0900 (Sun, 19 Nov 2017) | 1 line

gc.c: moved ENABLE_VM_OBJSPACE from vm_core.h
------------------------------------------------------------------------
r60847 | normal | 2017-11-19 14:23:48 +0900 (Sun, 19 Nov 2017) | 7 lines

file.c (rb_file_s_mkfifo): use mode_t instead of int

mode_t is the correct type for mkfifo(3).  This fixes an
oversight from r60592 which made the same change to several
other functions.

* file.c (rb_file_s_mkfifo): use mode_t instead of int
------------------------------------------------------------------------
r60846 | normal | 2017-11-19 14:03:22 +0900 (Sun, 19 Nov 2017) | 4 lines

file.c: fix 64-bit conversion warnings from r60844

* file.c (nogvl_truncate): cast int to VALUE before "void *"
  (rb_file_s_truncate): cast "void *" to VALUE before int
------------------------------------------------------------------------
r60845 | normal | 2017-11-19 14:03:17 +0900 (Sun, 19 Nov 2017) | 9 lines

File.readlink and rb_readlink releases GVL

The `readlink' can stall on slow filesystems like `open' and
`read' syscalls.  Release the GVL and let the rest of the VM
function while `readlink' runs.

* file.c (nogvl_readlink): new function
  (readlink_without_gvl): ditto
  (rb_readlink): use readlink_without_gvl
------------------------------------------------------------------------
r60844 | normal | 2017-11-19 07:45:11 +0900 (Sun, 19 Nov 2017) | 10 lines

file: File#truncate and File.truncate release GVL

Like IO#write and IO.open, these file operations have
unpredictable performance on slow file systems.  Allow other
threads of the VM to proceed while they are taking place.

* file.c (nogvl_truncate): extract from rb_file_s_truncate
  (rb_file_s_truncate): release GVL
  (nogvl_ftruncate): extract from rb_file_truncate
  (rb_file_truncate): release GVL
------------------------------------------------------------------------
r60843 | normal | 2017-11-19 06:57:38 +0900 (Sun, 19 Nov 2017) | 8 lines

addr2line.c: fix r60841 for glibc before 2.22

SHF_COMPRESSED was not defined until glibc 2.22, and there are
older distros (e.g. Debian 8.x jessie) which do not have this
defined.

Perhaps it is safe to define SHF_COMPRESSED to (1 << 11) ourselves,
too, since ELF should be a standardized format.
------------------------------------------------------------------------
r60842 | svn | 2017-11-19 03:05:40 +0900 (Sun, 19 Nov 2017) | 1 line

* 2017-11-19
------------------------------------------------------------------------
r60841 | naruse | 2017-11-19 03:05:39 +0900 (Sun, 19 Nov 2017) | 5 lines

explictly skip compressed debug line

To identify the line of backtrace with ease, show the offset address of library.
You can just find the source filename and the line with
`addr2line -e libruby.so.2.5.0 0xXXXX`
------------------------------------------------------------------------
r60840 | yui-knk | 2017-11-18 22:11:36 +0900 (Sat, 18 Nov 2017) | 22 lines

parse.y: Fix the locations of NODE_ITER

  * parse.y: Update the locations of NODE_ITER
    when nd_iter is determined.

  e.g. The locations of NODE_ITER is fixed:

  ```
  a {b}
  ```

  * Before

  ```
  NODE_ITER (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 5)
  ```

  * After

  ```
  NODE_ITER (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 5)
  ```
------------------------------------------------------------------------
r60839 | ko1 | 2017-11-18 22:01:12 +0900 (Sat, 18 Nov 2017) | 5 lines

call only with ISEQ_TRACE_EVENTS.

* vm_insnhelper.c (vm_trace): rb_iseq_trace_set() only accepts
  ISEQ_TRACE_EVENTS.

------------------------------------------------------------------------
r60838 | ko1 | 2017-11-18 18:39:41 +0900 (Sat, 18 Nov 2017) | 18 lines

introduce `trace_events' info for iseq.

* vm_core.h (rb_iseq_t::aux): add `trace_events` which represents
  which events are enabled on this iseq. With this information,
  we can skip useless trace-on changes for ISeqs.

* vm_trace.c (RUBY_EVENTS_TRACE_BY_ISEQ): moved to iseq.h and rename it
  with ISEQ_TRACE_EVENTS.

* iseq.h: introduce ISEQ_USE_COMPILE_DATA iseq (imemo) flag to represent
  COMPILE_DATA is available. In other words, iseq->aux.trace_events is not
  available when this flag is set.
  * ISEQ_COMPILE_DATA() is changed from a macro.
  * ISEQ_COMPILE_DATA_ALLOC() is added.
  * ISEQ_COMPILE_DATA_CLEAR() is added.

* iseq.c: use them.

------------------------------------------------------------------------
r60837 | usa | 2017-11-18 17:25:29 +0900 (Sat, 18 Nov 2017) | 6 lines

Cannot call rb_thread_call_with{out,}_gvl before running VM

* dir.c (opendir_without_gvl, with_gvl_gc_for_fd, opendir_at): check the VM is
  already initialized before calling rb_thread_call_with{out,}_gvl().
  [Bug #14115]

------------------------------------------------------------------------
r60836 | yui-knk | 2017-11-18 17:21:46 +0900 (Sat, 18 Nov 2017) | 22 lines

parse.y: Fix the locations of NODE_DVAR and NODE_LVAR

  * parse.y: Fix the locations of NODE_DVAR and NODE_LVAR
    when it's a multiple assignment method parameter.

  e.g. The locations of NODE_DVAR is fixed:

  ```
  a {|(b, c)| d}
  ```

  * Before

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 4, last_lineno: 1, last_column: 10)
  ```

  * After

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 9)
  ```
------------------------------------------------------------------------
r60835 | ktsj | 2017-11-18 15:24:52 +0900 (Sat, 18 Nov 2017) | 3 lines

.gdbinit: fix print_pathobj

$str is not C string but RString.
------------------------------------------------------------------------
r60834 | ktsj | 2017-11-18 14:45:21 +0900 (Sat, 18 Nov 2017) | 4 lines

.gdbinit: follow up changes in r60726

rb_iseq_constant_body::line_info_size and line_info_table have
been renamed to insns_info_size, insns_info.
------------------------------------------------------------------------
r60833 | yui-knk | 2017-11-18 12:32:05 +0900 (Sat, 18 Nov 2017) | 1 line

parse.y: Use node_assign
------------------------------------------------------------------------
r60832 | suke | 2017-11-18 11:53:39 +0900 (Sat, 18 Nov 2017) | 4 lines

* ext/win32ole/win32ole.c: use WIN32OLEQueryInterfaceError when failed
  to query com interface.
* ext/win32ole/win32ole_event.c: ditto.
* ext/win32ole/win32ole_method.c: ditto.
------------------------------------------------------------------------
r60831 | normal | 2017-11-18 11:01:49 +0900 (Sat, 18 Nov 2017) | 12 lines

dir.c: openat calls release GVL, too

openat(2) also performs a path lookup, so it is also subject
to pathological slowdowns like opendir(3) and open(2) syscalls.

* dir.c (struct opendir_at_arg): new struct for callback
  (with_gvl_gc_for_fd): new callback for rb_thread_call_with_gvl
  (gc_for_fd_with_gvl): moved up
  (nogvl_opendir_at): extracted from do_opendir
  (opendir_at): new wrapper to release GVL for opendir_at
  (do_opendir): use new wrappers to release GVL
  (nogvl_dir_empty_p): adjust for gc_for_fd_with_gvl
------------------------------------------------------------------------
r60830 | normal | 2017-11-18 11:01:44 +0900 (Sat, 18 Nov 2017) | 10 lines

dir: release GVL on opendir

opendir(3) is subject to the same pathological slowdowns on
slow or unreliable filesystems as open(2), so release the GVL
to avoid stalling the entire VM like we do with IO#open

* dir.c (nogvl_opendir): new function
  (opendir_without_gvl): new function
  (dir_initialize): s/opendir/&_without_gvl/
  (do_opendir): ditto
------------------------------------------------------------------------
r60829 | yui-knk | 2017-11-18 10:40:13 +0900 (Sat, 18 Nov 2017) | 23 lines

Update the last location of NODE_ARRAY

* parse.y (list_append_gen, list_concat): Update
  the last location of NODE_ARRAY when an item is
  appended or concatenated with another NODE_ARRAY.

  e.g. The locations of NODE_ARRAY is fixed:

  ```
  a(1,2,3)
  ```

  * Before

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 3)
  ```

  * After

  ```
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 2, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60828 | svn | 2017-11-18 00:08:04 +0900 (Sat, 18 Nov 2017) | 1 line

* 2017-11-18
------------------------------------------------------------------------
r60827 | kazu | 2017-11-18 00:08:03 +0900 (Sat, 18 Nov 2017) | 5 lines

Fix typo in `Timeout` doc [ci skip]

Author: yuuji.yaginuma <yuuji.yaginuma@gmail.com>
https://github.com/ruby/ruby/pull/1760
[Fix GH-1760]
------------------------------------------------------------------------
r60826 | nobu | 2017-11-17 21:16:31 +0900 (Fri, 17 Nov 2017) | 1 line

parse.y: RUBY_SET_YYLLOC to rb_parser_set_location
------------------------------------------------------------------------
r60825 | nobu | 2017-11-17 21:16:30 +0900 (Fri, 17 Nov 2017) | 6 lines

parse.y: RUBY_SET_YYLLOC

* parse.y (RUBY_SET_YYLLOC): extract setting locations from the
  source line.

* parse.y (yylex): use RUBY_SET_YYLLOC.
------------------------------------------------------------------------
r60824 | knu | 2017-11-17 18:48:47 +0900 (Fri, 17 Nov 2017) | 4 lines

Add examples to Set documentation [ci skip]

GitHub PR:    https://github.com/ruby/ruby/pull/1752 [Fix GH-1752]
Submitted by: @Ana06 <anamma06@gmail.com>
------------------------------------------------------------------------
r60823 | yui-knk | 2017-11-17 17:23:06 +0900 (Fri, 17 Nov 2017) | 5 lines

NODE_CALL is not passed to node_assign_gen

* parse.y (node_assign_gen): NODE_CALL is not passed to
  node_assign_gen. NODE_CALL is not assignable. Assignable
  method call (array set and attr set) is represented by NODE_ATTRASGN.
------------------------------------------------------------------------
r60822 | ko1 | 2017-11-17 16:47:03 +0900 (Fri, 17 Nov 2017) | 4 lines

don't use `goto`.

* vm_trace.c (rb_exec_event_hooks): we don't need to use goto statement.

------------------------------------------------------------------------
r60821 | yui-knk | 2017-11-17 16:39:15 +0900 (Fri, 17 Nov 2017) | 24 lines

Fix location of assignable nodes

* parse.y (node_assign_gen): NODE_ATTRASGN is created
  before rhs is created. It is needed to set location
  after rhs is created to rhs range be included to the
  location of NODE_ATTRASGN.

  e.g. The locations of NODE_ATTRASGN is fixed:

  ```
  a[1] = 2
  ```

  * Before

  ```
  NODE_ATTRASGN (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 4)
  ```

  * After

  ```
  NODE_ATTRASGN (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 8)
  ```
------------------------------------------------------------------------
r60820 | ko1 | 2017-11-17 16:29:07 +0900 (Fri, 17 Nov 2017) | 6 lines

remove a wrong assertion.

* iseq.c (rb_iseq_trace_set): remove a wrong assertion.
  This assertion checked `insn` is `trace_` prefix instruction
  but threaded code `insn` is original code.

------------------------------------------------------------------------
r60819 | ko1 | 2017-11-17 15:59:22 +0900 (Fri, 17 Nov 2017) | 7 lines

reuse gvar value.

* vm_core.h (EXEC_EVENT_HOOK_VM_TRACE): added to pass vm_event_flags
  (== ruby_vm_event_flags) as a macro parameter.

* vm_insnhelper.c (vm_trace): use an added macro.

------------------------------------------------------------------------
r60818 | svn | 2017-11-17 15:24:56 +0900 (Fri, 17 Nov 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60817 | ko1 | 2017-11-17 15:24:55 +0900 (Fri, 17 Nov 2017) | 10 lines

remove `trace_` prefix insns lazily.

* vm_trace.c (update_global_event_hook): set only when tracing is added.
  If tracing was off (event flags are decreased), then ignore them.
  Next `trace_` prefix instruction will trace off itself (lazy tracing off).

* vm_insnhelper.c (vm_trace): trace-off for when trace is not needed.

* iseq.c (rb_iseq_trace_set): fix trace-off process (it was never off tracing).

------------------------------------------------------------------------
r60816 | yui-knk | 2017-11-17 13:25:48 +0900 (Fri, 17 Nov 2017) | 24 lines

Fix location of assignable nodes

* parse.y (node_assign_gen): In some case assignable nodes
  are created before rhs is created. In this case it is
  needed to set location after rhs is shifted to
  rhs range be included to assignable nodes.

  e.g. The locations of NODE_DASGN_CURR is fixed:

  ```
  a = 10
  ```

  * Before

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 1)
  ```

  * After

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6)
  ```
------------------------------------------------------------------------
r60815 | svn | 2017-11-17 08:13:25 +0900 (Fri, 17 Nov 2017) | 1 line

* 2017-11-17
------------------------------------------------------------------------
r60814 | yui-knk | 2017-11-17 08:13:24 +0900 (Fri, 17 Nov 2017) | 27 lines

Fix location of NODEs generated by new_op_assign_gen

* parse.y (new_op_assign_gen): Use a location of lhs
  when call gettable, bacause gettable creates a variable
  node. Use a location of rhs when call new_list,
  because item of new_list is rhs.

  The locations of NODE_DVAR(nd_vid: :a) and NODE_ARRAY
  are fixed:

  ```
  a -= 1
  ```

  * Before

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6)
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6)
  ```

  * After

  ```
  NODE_DVAR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 1)
  NODE_ARRAY (line: 1, first_lineno: 1, first_column: 5, last_lineno: 1, last_column: 6)
  ```
------------------------------------------------------------------------
r60813 | usa | 2017-11-16 21:26:04 +0900 (Thu, 16 Nov 2017) | 6 lines

Old gem file had not been removed

* common.mk (update-gems): `old.delete("gems/#{gem}")` always returns nil
  because when really downloading new gem, the filename is not in `old`.
  the real intention of this condition might be checking `old` is empty or not.

------------------------------------------------------------------------
r60812 | mame | 2017-11-16 20:03:37 +0900 (Thu, 16 Nov 2017) | 1 line

Refactoring out the direct accesses of NODE's u1, u2, and u3
------------------------------------------------------------------------
r60811 | k0kubun | 2017-11-16 19:02:03 +0900 (Thu, 16 Nov 2017) | 12 lines

thread_win32.c: stop returning unused value

to unify signature with pthread's one

I'm planning to use functions for rb_nativethread_cond_t and
rb_nativethread_mutex_t in the future JIT introduction.

In that case, I want them to have the same signature. To prevent the case
that its return value is used in somewhere and it becomes harder to unify
signature, I want to drop unused return value.

[close GH-1751]
------------------------------------------------------------------------
r60810 | ko1 | 2017-11-16 18:24:48 +0900 (Thu, 16 Nov 2017) | 5 lines

remove an unused function.

* eval.c (rb_iterator_p): removed because nobody use it
  and not exposed by headers.

------------------------------------------------------------------------
r60809 | ko1 | 2017-11-16 18:00:15 +0900 (Thu, 16 Nov 2017) | 5 lines

make a func static.

* vm_backtrace.c (rb_ec_backtrace_location_ary): make it static and
  remove `rb_` prefix.

------------------------------------------------------------------------
r60808 | ko1 | 2017-11-16 17:53:49 +0900 (Thu, 16 Nov 2017) | 4 lines

make a func static.

* vm_method.c (rb_resolve_refined_method_callable): make it static.

------------------------------------------------------------------------
r60807 | ko1 | 2017-11-16 17:48:59 +0900 (Thu, 16 Nov 2017) | 7 lines

make funcs static.

* thread.c (rb_threadptr_trap_interrupt): make it static
  and remove `rb_` prefix.

* thread.c (rb_threadptr_pending_interrupt_active_p): ditto.

------------------------------------------------------------------------
r60806 | ko1 | 2017-11-16 17:19:46 +0900 (Thu, 16 Nov 2017) | 6 lines

make funcs static.

* node.c: make them static:
  * rb_node_buffer_new
  * rb_node_buffer_free

------------------------------------------------------------------------
r60805 | ko1 | 2017-11-16 17:01:26 +0900 (Thu, 16 Nov 2017) | 4 lines

make a func static.

* addr2line.c (main_exe_path): make it static.

------------------------------------------------------------------------
r60804 | ko1 | 2017-11-16 16:56:56 +0900 (Thu, 16 Nov 2017) | 4 lines

remove unused func.

* gc.c (rb_garbage_collect): removed.

------------------------------------------------------------------------
r60803 | ko1 | 2017-11-16 16:49:43 +0900 (Thu, 16 Nov 2017) | 4 lines

make a func static.

* vm_eval.c (rb_f_block_given_p): make it static.

------------------------------------------------------------------------
r60802 | ko1 | 2017-11-16 16:47:33 +0900 (Thu, 16 Nov 2017) | 4 lines

make a func static.

* vm_eval.c (rb_f_public_send): make it static.

------------------------------------------------------------------------
r60801 | ko1 | 2017-11-16 16:46:05 +0900 (Thu, 16 Nov 2017) | 4 lines

remove unused function.

* vm_method.c (rb_method_entry_with_refinements): removed.

------------------------------------------------------------------------
r60800 | ko1 | 2017-11-16 16:43:27 +0900 (Thu, 16 Nov 2017) | 5 lines

make a func static.

* vm.c (rb_proc_create_from_captured): make this func static and renmae
  with vm_ prefix.

------------------------------------------------------------------------
r60799 | ko1 | 2017-11-16 16:41:33 +0900 (Thu, 16 Nov 2017) | 4 lines

export rb_tracearg_callee_id().

* include/ruby/debug.h (rb_tracearg_callee_id): export.

------------------------------------------------------------------------
r60798 | ko1 | 2017-11-16 16:38:41 +0900 (Thu, 16 Nov 2017) | 5 lines

make a func static.

* vm_eval.c (rb_raise_method_missing): make this func static and renmae with
  vm_ prefix.

------------------------------------------------------------------------
r60797 | ko1 | 2017-11-16 16:28:16 +0900 (Thu, 16 Nov 2017) | 4 lines

make it static.

* vm.c (rb_thread_mark): now file local.

------------------------------------------------------------------------
r60796 | ko1 | 2017-11-16 16:25:30 +0900 (Thu, 16 Nov 2017) | 9 lines

provide rb_vm_make_proc/lambda().

* vm.c (rb_vm_make_proc): removed.

* vm_core.h: provide utility inline functions
  * rb_vm_make_proc()
  * rb_vm_make_lambda()
  to call rb_vm_make_proc_lambda().

------------------------------------------------------------------------
r60795 | ko1 | 2017-11-16 16:14:45 +0900 (Thu, 16 Nov 2017) | 4 lines

remove unused function.

* vm_insnhelper.c (rb_vm_env_write): remove unused function.

------------------------------------------------------------------------
r60794 | ko1 | 2017-11-16 15:10:31 +0900 (Thu, 16 Nov 2017) | 4 lines

accepts `ec` as first parameter.

* vm_insnhelper.c (vm_check_match): accepts `ec` as first parameter.

------------------------------------------------------------------------
r60793 | ko1 | 2017-11-16 14:56:21 +0900 (Thu, 16 Nov 2017) | 4 lines

fix r60792.

* error.c (warning_string): `file` is already cstr.

------------------------------------------------------------------------
r60792 | ko1 | 2017-11-16 14:52:19 +0900 (Thu, 16 Nov 2017) | 7 lines

`rb_source_loc` -> `rb_source_location_cstr`

* vm.c (rb_source_loc): rename to rb_source_location_cstr()
  to make behavior clear compare with rb_source_location().

* error.c (warning_string): use rb_source_location_cstr() directly.

------------------------------------------------------------------------
r60791 | ko1 | 2017-11-16 14:45:44 +0900 (Thu, 16 Nov 2017) | 4 lines

fix r60789.

* vm.c (rb_source_loc): fix condition.

------------------------------------------------------------------------
r60790 | nobu | 2017-11-16 14:36:42 +0900 (Thu, 16 Nov 2017) | 4 lines

parse.y: no return in class

* parse.y (k_return): prohibit return in class/module body except
  for singleton class.
------------------------------------------------------------------------
r60789 | ko1 | 2017-11-16 14:35:58 +0900 (Thu, 16 Nov 2017) | 4 lines

rb_source_location() may return nil.

* vm.c (rb_source_location): return nil if path is not found.

------------------------------------------------------------------------
r60788 | ko1 | 2017-11-16 14:18:29 +0900 (Thu, 16 Nov 2017) | 4 lines

remove an unused function.

* vm.c (rb_sourcefilename): removed because nobody use it.

------------------------------------------------------------------------
r60787 | ko1 | 2017-11-16 14:14:18 +0900 (Thu, 16 Nov 2017) | 6 lines

add `ec` as first parameter.

* vm.c (vm_svar_get): accepts `ec` as first parameter.

* vm.c (vm_svar_set): ditto.

------------------------------------------------------------------------
r60786 | ko1 | 2017-11-16 13:37:02 +0900 (Thu, 16 Nov 2017) | 4 lines

fix up r60782 and r60783.

* cont.c (cont_restore_thread): re-check a condition (pointed by nobu).

------------------------------------------------------------------------
r60785 | yui-knk | 2017-11-16 12:36:20 +0900 (Thu, 16 Nov 2017) | 12 lines

Add a last location to branch coverage

* compile.c (DECL_BRANCH_BASE, ADD_TRACE_BRANCH_COVERAGE): Add
  a last location to arguments.

* compile.c (compile_if, compile_case, compile_case2, compile_loop, iseq_compile_each0):
  Pass a last location to macros.

* ext/coverage/coverage.c (branch_coverage): Add a last location to
  a return value.

* test/coverage/test_coverage.rb: Follow-up these changes.
------------------------------------------------------------------------
r60784 | kazu | 2017-11-16 12:32:23 +0900 (Thu, 16 Nov 2017) | 4 lines

Regexp#===: Use `\A` and `\z` instead of `^` and `$`

[ci skip]
ref https://github.com/rurema/doctree/pull/812
------------------------------------------------------------------------
r60783 | ko1 | 2017-11-16 11:53:17 +0900 (Thu, 16 Nov 2017) | 4 lines

avoid duplicated-cond compile error.

* cont.c (cont_restore_thread): fix duplicated-cond compile error.

------------------------------------------------------------------------
r60782 | ko1 | 2017-11-16 11:47:58 +0900 (Thu, 16 Nov 2017) | 17 lines

cleanup hook cleanup code.

* vm_trace.c: before this patch, deleted hooks are remvoed at
  *the beggining* of hooks (exec_hooks_precheck).
  This patch cleanup deleted hooks at
  (1) just after hook is deleted (TracePoint#disable and so on)
  (2) just after executing hooks (exec_hooks_postcheck)
  Most of time (1) is enough, but if some threads running hooks,
  we need to wait cleaning up deleted hooks until threads finish
  running the hooks. This is why (2) is introduced (and this is
  why current impl cleanup deleted hooks at the beggining of hooks).

* test/lib/tracepointchecker.rb: check also the number of delete
  waiting hooks.

* cont.c (cont_restore_thread): fix VM->trace_running count.

------------------------------------------------------------------------
r60781 | yui-knk | 2017-11-16 10:56:54 +0900 (Thu, 16 Nov 2017) | 24 lines

parse.y: Fix location of asgn node

* parse.y (new_op_assign_gen): Fix location of asgn node.
  Assignable node (e.g. NODE_LASGN) is generated before rhs
  is generated, so we reset the location when nd_value of
  asgn is fixed.

  e.g. :

  ```
  a -= 10
  ```

  * Before

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 1)
  ```

  * After

  ```
  NODE_DASGN_CURR (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 7)
  ```
------------------------------------------------------------------------
r60780 | yui-knk | 2017-11-16 10:06:10 +0900 (Thu, 16 Nov 2017) | 39 lines

parse.y: Preserve previous line and restore it when read '\n'

* parse.y (parser_params): Add prevline to store previous line.
* parse.y (yycompile0): Initialize prevline with 0.
* parse.y (parser_nextline): Store previous line on prevline.
* parse.y (parser_nextc): Check parser is on EOF or has nextline.
  Now parser_yylex does not always set lex_p as lex_pend, we should check
  EOF flag and nextline is set.
* parse.y (parser_yylex): Restore previous line, set lex_p and tokp
  on '\n'. Before this commit, tokp is on the head of next line of '\n'
  and lex_p is on the tail of next line when next token is '\n'.
  By this behavior, in some case the last column of NODE_CALL (or NODE_QCALL) is
  set to the last column of next line. NODE_CALL can be generated
  via `primary_value call_op operation2 {} opt_paren_args` and opt_paren_args
  can be none. If none is generated with next token '\n', the last column of
  none is set to the last column of next line.

  e.g. :

  ```
  a.b
  cd.ef
  ```

  The location of NODE_CALL of first line is set to,

  * Before

  ```
  NODE_CALL (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 6)
  ```

  * After

  ```
  NODE_CALL (line: 1, first_lineno: 1, first_column: 0, last_lineno: 1, last_column: 3)
  ```

* parse.y (parser_mark): GC mark prevline.
------------------------------------------------------------------------
r60779 | svn | 2017-11-16 02:07:55 +0900 (Thu, 16 Nov 2017) | 1 line

* 2017-11-16
------------------------------------------------------------------------
r60778 | hsbt | 2017-11-16 02:07:54 +0900 (Thu, 16 Nov 2017) | 1 line

Bump rake-12.3.0 on bundled gems.
------------------------------------------------------------------------
r60777 | kazu | 2017-11-15 22:53:15 +0900 (Wed, 15 Nov 2017) | 1 line

Remove redundant last newline [ci skip]
------------------------------------------------------------------------
r60776 | ko1 | 2017-11-15 22:21:24 +0900 (Wed, 15 Nov 2017) | 12 lines

remove rb_thread_t::event_hooks.

* vm_core.h (rb_thread_t): remove rb_thread_t::event_hooks.

* vm_trace.c: all hooks are connected to vm->event_hooks and
  add rb_event_hook_t::filter::th to filter invoke thread.
  It will simplify invoking hooks code.

* thread.c (thread_start_func_2): clear thread specific trace_func.

* test/ruby/test_settracefunc.rb: add a test for Thread#add_trace_func.

------------------------------------------------------------------------
r60775 | nobu | 2017-11-15 17:02:09 +0900 (Wed, 15 Nov 2017) | 4 lines

tmpdir.rb: merged make_tmpname to create

* lib/tmpdir.rb (Dir::Tmpname#create): try conversion of prefix
  and suffix just once before loop.
------------------------------------------------------------------------
r60774 | normal | 2017-11-15 16:24:26 +0900 (Wed, 15 Nov 2017) | 14 lines

dir.c: revert r60772, r60770, and r60769

Using readdir(3) without any locking causes thread-safety
problems if directory streams get shared between threads.  On
ancient platforms, readdir(3) may have thread-safety problems
even on different directory streams.

Using readdir_r(3) is not viable, either, as it's deprecated
due to name overflow problems.

So for now, rely on GVL as in previous Rubies and perhaps
consider per-"struct dir_data" mutexes for modern platforms
which allow concurrent calls to readdir(3) on different
directory streams.
------------------------------------------------------------------------
r60773 | nobu | 2017-11-15 14:50:10 +0900 (Wed, 15 Nov 2017) | 4 lines

thread.c: use ec

* thread.c (call_without_gvl): use execution context for
  RUBY_VM_CHECK_INTS_BLOCKING.
------------------------------------------------------------------------
r60772 | usa | 2017-11-15 14:18:37 +0900 (Wed, 15 Nov 2017) | 6 lines

Cannot call rb_thread_call_without_gvl before running VM

* dir.c (readdir_without_gvl): check the VM is already initialized before
  calling rb_thread_call_without_gvl().
  [Bug #14108]

------------------------------------------------------------------------
r60771 | ko1 | 2017-11-15 13:52:39 +0900 (Wed, 15 Nov 2017) | 7 lines

fix uninitialized memory reference.

* compile.c (iseq_set_sequence): clear kwargs (in ci_entries) memory area.
  kwargs ci entries are initialized by compiler. However, sometimes these
  initializations are skipped because corresponding calls are eliminated
  by some optimizations (for example, `if true` syntax elimnates else code).

------------------------------------------------------------------------
r60770 | usa | 2017-11-15 12:44:58 +0900 (Wed, 15 Nov 2017) | 4 lines

nogvl readdir make SEGV on Windows

* dir.c (readdir_without_gvl): workaround for Windows.  [Bug #14108]

------------------------------------------------------------------------
r60769 | normal | 2017-11-15 08:20:31 +0900 (Wed, 15 Nov 2017) | 18 lines

dir.c: release GVL around remaining readdir calls

Release GVL around all remaining readdir calls from the Dir
class to prevent pathological stalls on slow filesystems in
multi-threaded applications.

opendir, rewinddir, closedir calls are not affected yet, but
will be changed in future commits.

In the future, further work may be done consolidate multiple GVL
releasing calls to reduce overhead, similar to how changes to
Dir.empty? were made in r60111

* dir.c (nogvl_readdir): new function
  (readdir_without_gvl): ditto
  (dir_read): s/READDIR/readdir_without_gvl/
  (dir_each_entry): ditto
  (glob_helper): ditto
------------------------------------------------------------------------
r60768 | nobu | 2017-11-15 02:07:47 +0900 (Wed, 15 Nov 2017) | 3 lines

compile.c: fixup TRACE

* compile.c (remove_unreachable_chunk): ignore TRACE elements.
------------------------------------------------------------------------
r60767 | svn | 2017-11-15 00:37:49 +0900 (Wed, 15 Nov 2017) | 1 line

* 2017-11-15
------------------------------------------------------------------------
r60766 | nobu | 2017-11-15 00:37:48 +0900 (Wed, 15 Nov 2017) | 6 lines

parse.y: zero codepoints

* parse.y (parser_tokadd_utf8): relax restriction to allow zero or
  more codepoints.  fixup r59417.

  https://github.com/ruby/ruby/commit/7e8b910#commitcomment-25602670
------------------------------------------------------------------------
r60765 | ko1 | 2017-11-14 22:25:11 +0900 (Tue, 14 Nov 2017) | 5 lines

rewrite only if changed.

* vm_trace.c (update_global_event_hook): rewrite ISeqs only when
  effective events are changed.

------------------------------------------------------------------------
r60764 | ko1 | 2017-11-14 22:18:44 +0900 (Tue, 14 Nov 2017) | 9 lines

fix prefix.

* compile.c: the following functions accept LINK_ELEMENT so
  rename to `ELEM_` prefix names:
  * INSERT_ELEM_NEXT -> ELEM_INSERT_NEXT
  * INSERT_ELEM_PREV -> ELEM_INSERT_PREV
  * REPLACE_ELEM     -> ELEM_REPLACE
  * REMOVE_ELEM      -> ELEM_REMOVE

------------------------------------------------------------------------
r60763 | ko1 | 2017-11-14 21:58:36 +0900 (Tue, 14 Nov 2017) | 22 lines

remove `trace` instruction. [Feature #14104]

* tool/instruction.rb: create `trace_` prefix instructions.

* compile.c (ADD_TRACE): do not add `trace` instructions but add
  TRACE link elements. TRACE elements will be unified with a next
  instruction as instruction information.

* vm_trace.c (update_global_event_hook): modify all ISeqs when
  hooks are enabled.

* iseq.c (rb_iseq_trace_set): added to toggle `trace_` instructions.

* vm_insnhelper.c (vm_trace): added.
  This function is a body of `trace_` prefix instructions.

* vm_insnhelper.h (JUMP): save PC to a control frame.

* insns.def (trace): removed.

* vm_exec.h (INSN_ENTRY_SIG): add debug output (disabled).

------------------------------------------------------------------------
r60762 | nobu | 2017-11-14 13:42:38 +0900 (Tue, 14 Nov 2017) | 10 lines

process.c: removed preserving_errno

* process.c (try_with_sh, handle_fork_error): added argument for
  errno.

* process.c (proc_exec_cmd, proc_exec_sh, exec_async_signal_safe):
  now return errno instead of -1.

* process.c (rb_fork_ruby): merged retry_fork_ruby() and unified
  clean-up after fork regardless failure.
------------------------------------------------------------------------
r60761 | nobu | 2017-11-14 12:02:58 +0900 (Tue, 14 Nov 2017) | 1 line

string.c: prefer rb_syserr_fail
------------------------------------------------------------------------
r60760 | nobu | 2017-11-14 12:00:23 +0900 (Tue, 14 Nov 2017) | 1 line

common.mk: add dependencies for iseq.h
------------------------------------------------------------------------
r60759 | nobu | 2017-11-14 11:40:04 +0900 (Tue, 14 Nov 2017) | 1 line

compile.c: comments for concatstrings optimization [ci skip]
------------------------------------------------------------------------
r60758 | ko1 | 2017-11-14 10:37:41 +0900 (Tue, 14 Nov 2017) | 8 lines

use RUBY_API_VERSION as ISEQ versions.

* iseq.h: use RUBY_API_VERSION_MAJOR for ISEQ_MAJOR_VERSION and
  RUBY_API_VERSION_MINOR for ISEQ_MINOR_VERSION.
  We need to keep compatibility for ISeq during same major/minor versions.
  If we need to change compatibility between teeny versions, we should use
  (RUBY_API_VERSION_MINOR * 10 + iseq revs) for ISEQ_MINOR_VERSION.

------------------------------------------------------------------------
r60757 | svn | 2017-11-14 08:53:01 +0900 (Tue, 14 Nov 2017) | 1 line

* 2017-11-14
------------------------------------------------------------------------
r60756 | nobu | 2017-11-14 08:53:00 +0900 (Tue, 14 Nov 2017) | 5 lines

compile.c: fixup r60727

* compile.c (iseq_peephole_optimize): skip next `freezestring`
  instruction after `concatstrings` instruction when frozen string
  literal is enabled.
------------------------------------------------------------------------
r60755 | nobu | 2017-11-13 14:50:54 +0900 (Mon, 13 Nov 2017) | 5 lines

regexec.c: invalidate previously matched position

* regexec.c (match_at): invalidate end position not yet matched
  when new start position is pushed, to dispose previously stored
  position.  [ruby-core:83743] [Bug #14101]
------------------------------------------------------------------------
r60754 | nobu | 2017-11-13 14:46:30 +0900 (Mon, 13 Nov 2017) | 4 lines

test_regexp.rb: test_absent

* test/ruby/test_regexp.rb (test_absent): add simple tests for
  absent operator.
------------------------------------------------------------------------
r60753 | nobu | 2017-11-13 10:58:18 +0900 (Mon, 13 Nov 2017) | 4 lines

envutil.rb: preserve RUBYLIB

* test/lib/envutil.rb (invoke_ruby): preserve RUBYLIB which is
  set by runruby.rb and necessary to load standard libraries.
------------------------------------------------------------------------
r60752 | yui-knk | 2017-11-13 10:24:16 +0900 (Mon, 13 Nov 2017) | 3 lines

Print last location of a node

* node.c (A_NODE_HEADER): Print last location of a node.
------------------------------------------------------------------------
r60751 | yui-knk | 2017-11-13 10:24:15 +0900 (Mon, 13 Nov 2017) | 5 lines

Initialize last column with -1 and lineno with 0

* parse.y (node_newnode): Initialize last column of nodes
  with -1 and lineno with 0 to make it easy to detect nodes
  which we forget to set a column number or lineno.
------------------------------------------------------------------------
r60750 | yui-knk | 2017-11-13 09:14:33 +0900 (Mon, 13 Nov 2017) | 16 lines

Store last location of a node on RNode

* node.c (rb_node_init): Initialize last location with 0.

* node.h (struct rb_code_range_struct): Define a structure
  which contains first location and last location of a node.
* node.h (struct RNode): Use rb_code_range_t to store last
  location of a node.
* node.h (nd_column, nd_set_column, nd_lineno, nd_set_lineno):
  Follow-up the change of struct RNode.
* node.h (nd_last_column, nd_set_last_column, nd_last_lineno, nd_set_last_lineno):
  Define getter/setter macros for last location of RNode.

* parse.y : Set last location of tokens.

Thanks to Yusuke Endoh (mame) for design of data structures.
------------------------------------------------------------------------
r60749 | rhe | 2017-11-13 02:10:29 +0900 (Mon, 13 Nov 2017) | 6 lines

string.c: fix up r60748

An #ifdef was missing in r60748 and build broke on systems without
crypt_r().

https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11s/ruby-trunk/log/20171112T162503Z.fail.html.gz
------------------------------------------------------------------------
r60748 | rhe | 2017-11-13 00:55:04 +0900 (Mon, 13 Nov 2017) | 9 lines

string.c: fix memory leak in String#crypt

Use ALLOCV to allocate struct crypt_data for slightly cleaner and less
error-prone code. It is currently possible it leaks when an invalid
argument is passed to String#crypt or rb_str_new_cstr() fails to
allocate memory.

SIZEOF_CRYPT_DATA macro in missing/crypt.h is removed since it is not
used any longer.
------------------------------------------------------------------------
r60747 | svn | 2017-11-13 00:25:57 +0900 (Mon, 13 Nov 2017) | 1 line

* 2017-11-13
------------------------------------------------------------------------
r60746 | k0kubun | 2017-11-13 00:25:56 +0900 (Mon, 13 Nov 2017) | 3 lines

.gitignore: ignore dlntest.dll

This was generated with in-place build on MinGW and not ignored.
------------------------------------------------------------------------
r60745 | kazu | 2017-11-12 16:05:58 +0900 (Sun, 12 Nov 2017) | 5 lines

Clarify Dir.mktmpdir's change

`FileUtils.remove_entry_secure` checks `world_writable?` (and `sticky?`) only.
[ci skip]
ref https://github.com/rurema/doctree/pull/805
------------------------------------------------------------------------
r60744 | svn | 2017-11-12 13:45:52 +0900 (Sun, 12 Nov 2017) | 1 line

* 2017-11-12
------------------------------------------------------------------------
r60743 | nobu | 2017-11-12 13:45:51 +0900 (Sun, 12 Nov 2017) | 6 lines

load.c: cwd encoding

* load.c (rb_get_expanded_load_path): save cwd cache in OS path
  encoding, to get rid of unnecessary conversion and infinite
  loading when it needs encoding conversion.
  [ruby-dev:50221] [Bug #13863]
------------------------------------------------------------------------
r60742 | nobu | 2017-11-11 13:50:11 +0900 (Sat, 11 Nov 2017) | 1 line

parse.y: constified YYLTYPE
------------------------------------------------------------------------
r60741 | svn | 2017-11-11 12:57:03 +0900 (Sat, 11 Nov 2017) | 1 line

* 2017-11-11
------------------------------------------------------------------------
r60740 | suke | 2017-11-11 12:57:02 +0900 (Sat, 11 Nov 2017) | 2 lines

* ext/win32ole/win32ole.c(ole_const_load): suppress constant redefinition
  warnings when WIN32OLE.const_load [Bug #14085]
------------------------------------------------------------------------
r60739 | k0kubun | 2017-11-10 22:59:01 +0900 (Fri, 10 Nov 2017) | 10 lines

bin/erb: change template file encoding to UTF-8

Unlike Ruby source file encoding (script encoding) whose default is
changed to UTF-8 in Ruby 2.0 (Feature #6679), template's file encoding
given to erb(1) has been ASCII-8BIT since ERB supports m17n at r21170.

Like Ruby source file encoding, erb template file encoding should be
UTF-8 in Ruby 2.

[Bug #14095] [ruby-core:83708]
------------------------------------------------------------------------
r60738 | kazu | 2017-11-10 22:50:14 +0900 (Fri, 10 Nov 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r60737 | mame | 2017-11-10 22:46:38 +0900 (Fri, 10 Nov 2017) | 6 lines

Make `rb_ast_dispose` use `RB_OBJ_WRITE`

This fixes the mistake of r60722.
I used `rb_gc_writebarrier_remember` to notify to GC that the references
is changed.  But the function just adds the object to the remember set
blindly.  Ko1 told me that `RB_OBJ_WRITE` is suitable in this case.
------------------------------------------------------------------------
r60736 | k0kubun | 2017-11-10 20:50:00 +0900 (Fri, 10 Nov 2017) | 19 lines

.travis.yml: workaround to resolve ::1

Container-based Trusty environment (sudo: false) does not support IPv6.
https://github.com/travis-ci/travis-ci/issues/3302

And the image has "::1  localhost ip6-localhost ip6-loopback" entry in
addition to "127.0.0.1 localhost" in /etc/hosts.
Thus when it can resolve localhost to ::1 and CI fails.

To resolve this, at least we need to modify /etc/hosts for now but we
can't modify /etc/hosts without sudo.

So I enabled sudo. As Sudo-enabled VM didn't have "::1 localhost" entry,
this change fixed the cause without touching /etc/hosts.

Since boot of `sudo: required` is slower than `sudo: false`, please revert
this commit anytime when Container-based Trusty environment is updated and
::1 issue has gone.
https://docs.travis-ci.com/user/reference/overview/
------------------------------------------------------------------------
r60735 | nobu | 2017-11-10 17:26:44 +0900 (Fri, 10 Nov 2017) | 4 lines

iseq.c: disasm only once for each iseq

* iseq.c (rb_iseq_disasm): do not dump repeatedly same iseq which
  has been dumped by catch tables.
------------------------------------------------------------------------
r60734 | hsbt | 2017-11-10 15:31:36 +0900 (Fri, 10 Nov 2017) | 4 lines

Do not define test method instead of skip when Calendar class is not defined.

  Revisit r34739. Patch by MSP-Greg.
  [Bug #14088][ruby-core:83690][fix GH-1743]
------------------------------------------------------------------------
r60733 | ko1 | 2017-11-10 14:26:52 +0900 (Fri, 10 Nov 2017) | 6 lines

refactoring about source line.

* iseq.c (find_line_no): renamed to rb_iseq_line_no().

* vm_backtrace.c (calc_lineno): add a comment why we need to use "pos-1".

------------------------------------------------------------------------
r60732 | nobu | 2017-11-10 08:08:01 +0900 (Fri, 10 Nov 2017) | 4 lines

iseq.c: operand lvar

* iseq.c (rb_insn_operand_intern): show local variable operand
  name in unified instructions.
------------------------------------------------------------------------
r60731 | nobu | 2017-11-10 08:02:52 +0900 (Fri, 10 Nov 2017) | 1 line

mk_call_iseq_optimized.rb: add mode string [ci skip]
------------------------------------------------------------------------
r60730 | marcandre | 2017-11-10 07:05:44 +0900 (Fri, 10 Nov 2017) | 1 line

lib/matrix: Remove method catalog [doc] [ci-skip]
------------------------------------------------------------------------
r60729 | svn | 2017-11-10 07:04:48 +0900 (Fri, 10 Nov 2017) | 1 line

* 2017-11-10
------------------------------------------------------------------------
r60728 | marcandre | 2017-11-10 07:04:47 +0900 (Fri, 10 Nov 2017) | 1 line

TracePoint.new: raise ArgumentError when no block given [#14074]
------------------------------------------------------------------------
r60727 | nobu | 2017-11-09 17:27:01 +0900 (Thu, 09 Nov 2017) | 1 line

compile.c: optimize nested string interpolations
------------------------------------------------------------------------
r60726 | ko1 | 2017-11-09 15:57:24 +0900 (Thu, 09 Nov 2017) | 11 lines

insn_info/insns_info

* iseq.h (iseq_line_info_entry): rename to iseq_insn_info_entry.

* vm_core.h (rb_iseq_constant_body): rename field name line_info_table
  to insns_info and also from line_info_size to insns_info_size.

* compile.c (INSN): add struct insn_info to contain per insn information.

* compile.c (add_insn_info): added to add new insn_info entry.

------------------------------------------------------------------------
r60725 | ko1 | 2017-11-09 14:22:51 +0900 (Thu, 09 Nov 2017) | 8 lines

fix backtrace on argment error.

* vm_backtrace.c (rb_backtrace_use_iseq_first_lineno_for_last_location):
  added. It modifies last location's line as corresponding iseq's first line
  number.

* vm_args.c (raise_argument_error): use added function.

------------------------------------------------------------------------
r60724 | ko1 | 2017-11-09 13:27:27 +0900 (Thu, 09 Nov 2017) | 9 lines

fix peephole optimization.

* compile.c (iseq_peephole_optimize): do not need to put `pop`
  instruction.

* test/ruby/test_optimization.rb (test_peephole_optimization_without_trace):
  This code "def foo; 1.times{|(a), &b| nil && a}; end" fails to compile
  by stack underflow because of above bug (fixed by this patch).

------------------------------------------------------------------------
r60723 | mame | 2017-11-09 10:50:58 +0900 (Thu, 09 Nov 2017) | 5 lines

node.c (dump_node): add an explanation of NODE_HASH's nd_alen

The field has a flag to represent if it is a keyword argument (that has
no braces, e.g., `foo(k:1)`) or hash literal (that has braces, e.g.,
`foo({k:1})`).
------------------------------------------------------------------------
r60722 | mame | 2017-11-09 10:32:11 +0900 (Thu, 09 Nov 2017) | 4 lines

use `rb_ast_dispose` instead of `rb_ast_free`

`rb_ast_dispose` calls `rb_gc_writebarrier_remember`.  Unless we call
it, the marked objects may not be GC'ed until `rb_ast_t` is GC'ed.
------------------------------------------------------------------------
r60721 | hsbt | 2017-11-09 09:42:19 +0900 (Thu, 09 Nov 2017) | 4 lines

Merge rubygems-2.7.2.

  This version fixes some setup commands.
  https://github.com/rubygems/rubygems/blob/01e797f6aa045fd09df7813d0b5448e3667172a9/History.txt#L3
------------------------------------------------------------------------
r60720 | nobu | 2017-11-09 08:09:25 +0900 (Thu, 09 Nov 2017) | 6 lines

parse.y: fix r60644

* parse.y (rb_strterm_heredoc_t): should not define sourceline as
  union, to fix wrong read on big-endian platforms.
  as rb_imemo_new stores all members as VALUEs, should read it as
  VALUE too.
------------------------------------------------------------------------
r60719 | svn | 2017-11-09 01:43:24 +0900 (Thu, 09 Nov 2017) | 1 line

* 2017-11-09
------------------------------------------------------------------------
r60718 | a_matsuda | 2017-11-09 01:43:23 +0900 (Thu, 09 Nov 2017) | 8 lines

Fix typo in doc [ci skip]

`enable` and `disable` are instance methods.

Patch by: yuuji.yaginuma <yuuji.yaginuma@gmail.com>

https://github.com/ruby/ruby/pull/1744
[Fix GH-1744]
------------------------------------------------------------------------
r60717 | kazu | 2017-11-08 23:14:54 +0900 (Wed, 08 Nov 2017) | 1 line

fixup r60440 [ci skip]
------------------------------------------------------------------------
r60716 | nobu | 2017-11-08 19:54:09 +0900 (Wed, 08 Nov 2017) | 4 lines

parse.y: remove in_single

* parse.y (parser_params): removed in_single, which is referenced
  with in_def always.
------------------------------------------------------------------------
r60715 | knu | 2017-11-08 12:57:54 +0900 (Wed, 08 Nov 2017) | 1 line

Fix typos in rdoc
------------------------------------------------------------------------
r60714 | yui-knk | 2017-11-08 09:03:02 +0900 (Wed, 08 Nov 2017) | 5 lines

Omit first argument of NEW_CASE2

* node.h (NEW_CASE2): Omit first argument of NEW_CASE2,
  bacause the first argument of NEW_CASE2 is always 0.
* parse.y: Ditto
------------------------------------------------------------------------
r60713 | stomar | 2017-11-08 05:17:04 +0900 (Wed, 08 Nov 2017) | 6 lines

hash.c: improve docs for Hash#slice

* hash.c: [DOC] clarify description for Hash#slice and remove
  a sentence that might suggest that the receiver is modified;
  improve example to also include a case where a hash with
  several elements is returned.
------------------------------------------------------------------------
r60712 | stomar | 2017-11-08 05:15:59 +0900 (Wed, 08 Nov 2017) | 6 lines

string.c: improve docs for String#{concat,<<}

* string.c: [DOC] remove a misleading call-seq for String#concat,
  which suggests that all arguments must be Integers in this case;
  also clarify in the example that the receiver is modified;
  fix grammar for String#<<; move references to the end.
------------------------------------------------------------------------
r60711 | stomar | 2017-11-08 05:14:46 +0900 (Wed, 08 Nov 2017) | 5 lines

pathname.c: improve docs for Pathname

* ext/pathname/pathname.c: [DOC] improve example for Pathname.glob,
  by using a more common glob pattern, and improve the reference
  to the `base' keyword argument for Pathname#glob.
------------------------------------------------------------------------
r60710 | stomar | 2017-11-08 05:13:48 +0900 (Wed, 08 Nov 2017) | 3 lines

http.rb: improve docs

* lib/net/http.rb: [DOC] fix typos and grammar
------------------------------------------------------------------------
r60709 | stomar | 2017-11-08 05:13:00 +0900 (Wed, 08 Nov 2017) | 4 lines

socket.c,tcpsocket.c: improve deprecation notices

* ext/socket/socket.c: [DOC] fix grammar in deprecation notices.
* ext/socket/tcpsocket.c: [DOC] ditto.
------------------------------------------------------------------------
r60708 | stomar | 2017-11-08 05:11:44 +0900 (Wed, 08 Nov 2017) | 1 line

vm_dump.c: [DOC] fix grammar
------------------------------------------------------------------------
r60707 | stomar | 2017-11-08 05:11:09 +0900 (Wed, 08 Nov 2017) | 3 lines

string.c: fix typos

* string.c: [DOC] fix typos in doxygen comments.
------------------------------------------------------------------------
r60706 | stomar | 2017-11-08 05:10:29 +0900 (Wed, 08 Nov 2017) | 4 lines

file.c: improve docs for File#path

* file.c: [DOC] fix grammar in docs for File#path
  and use a stronger description than "inaccurate".
------------------------------------------------------------------------
r60705 | stomar | 2017-11-08 05:09:19 +0900 (Wed, 08 Nov 2017) | 1 line

ext/socket/ifaddr.c: [DOC] fix typo
------------------------------------------------------------------------
r60704 | stomar | 2017-11-08 05:08:34 +0900 (Wed, 08 Nov 2017) | 3 lines

etc.c: improve docs for sysconfdir

* ext/etc/etc.c: [DOC] small language fixes for etc_sysconfdir docs.
------------------------------------------------------------------------
r60703 | stomar | 2017-11-08 05:07:33 +0900 (Wed, 08 Nov 2017) | 1 line

README.md: fix typos and grammar
------------------------------------------------------------------------
r60702 | stomar | 2017-11-08 05:06:25 +0900 (Wed, 08 Nov 2017) | 1 line

NEWS: clarify "ubygems.rb" entry
------------------------------------------------------------------------
r60701 | svn | 2017-11-08 05:04:59 +0900 (Wed, 08 Nov 2017) | 1 line

* 2017-11-08
------------------------------------------------------------------------
r60700 | stomar | 2017-11-08 05:04:58 +0900 (Wed, 08 Nov 2017) | 4 lines

refinements.rdoc: improve docs

* doc/syntax/refinements.rdoc: [DOC] fix typos and grammar
  and remove superfluous "for the first time".
------------------------------------------------------------------------
r60699 | ko1 | 2017-11-07 23:23:58 +0900 (Tue, 07 Nov 2017) | 5 lines

disable GC.

* test/ruby/test_io.rb (test_write_no_garbage): malloc can cause GC
  and it will reduce string object counts. So disable GC during this test.

------------------------------------------------------------------------
r60698 | nobu | 2017-11-07 20:21:09 +0900 (Tue, 07 Nov 2017) | 1 line

tool/runruby.rb: fix RUNRUBY_USE_GDB case
------------------------------------------------------------------------
r60697 | ko1 | 2017-11-07 17:23:57 +0900 (Tue, 07 Nov 2017) | 7 lines

`th` is not used.

* vm_args.c: `th` parameter is not used on the following functions:
  * args_check_block_arg0
  * keyword_hash_p
  * args_pop_keyword_hash

------------------------------------------------------------------------
r60696 | ko1 | 2017-11-07 17:19:25 +0900 (Tue, 07 Nov 2017) | 5 lines

th->ec: dtrace

* vm.c (ruby_th_dtrace_setup): rename to rb_dtrace_setup()
  and accept `ec`.

------------------------------------------------------------------------
r60695 | ko1 | 2017-11-07 17:01:26 +0900 (Tue, 07 Nov 2017) | 1 line

`rb_execution_context_t *` should not be `th`
------------------------------------------------------------------------
r60694 | mame | 2017-11-07 15:36:07 +0900 (Tue, 07 Nov 2017) | 11 lines

Symptomatic treatment for `rb_thread_terminate_all` freeze

Under uncertain condition, `rb_thread_terminate_all` gets stuck.  `make
test-all TESTOPTS="test/ruby/test_gc.rb -n test_interrupt_in_finalizer`
fails very rarely (only once every thousand runs).  This IS a bug, but
seems difficult to fix it soon.

This commit makes `rb_thread_terminate_all` wake up every one second,
instead of waiting forever, which mitigates the unuseful freeze.
This is not an essential solution for the bug, though.  I'll create a
ticket with how to reproduce the original issue.
------------------------------------------------------------------------
r60693 | ko1 | 2017-11-07 15:14:00 +0900 (Tue, 07 Nov 2017) | 4 lines

th->ec: vm_once_dispatch.

* vm_insnhelper.c (vm_once_dispatch): accepts `ec`.

------------------------------------------------------------------------
r60692 | ko1 | 2017-11-07 15:09:47 +0900 (Tue, 07 Nov 2017) | 4 lines

th->ec: rb_threadptr_setup_exception

* eval.c (rb_threadptr_setup_exception): renamed to rb_ec_setup_exception().

------------------------------------------------------------------------
r60691 | ko1 | 2017-11-07 15:01:16 +0900 (Tue, 07 Nov 2017) | 9 lines

fix prefix `ruby_...()` to `rb_...()`.

* vm_core.h: fix prefix `ruby_` to `rb_` for the following functions.
  * ruby_current_execution_context
  * ruby_current_thread
  * ruby_current_vm
  * ruby_vm_check_ints
  * ruby_exec_event_hook_orig

------------------------------------------------------------------------
r60690 | ko1 | 2017-11-07 14:54:34 +0900 (Tue, 07 Nov 2017) | 2 lines

* vm_trace.c (rb_exec_event_hooks): accepts pop_p.

------------------------------------------------------------------------
r60689 | ko1 | 2017-11-07 14:45:46 +0900 (Tue, 07 Nov 2017) | 4 lines

th->ec: rb_load_internal0

* load.c (rb_load_internal0): accepts `ec`.

------------------------------------------------------------------------
r60688 | ko1 | 2017-11-07 14:41:43 +0900 (Tue, 07 Nov 2017) | 1 line

fix comment
------------------------------------------------------------------------
r60687 | ko1 | 2017-11-07 14:41:15 +0900 (Tue, 07 Nov 2017) | 2 lines

* eval_intern.h (rb_threadptr_tag_state): rename to rb_ec_tag_state.

------------------------------------------------------------------------
r60686 | ko1 | 2017-11-07 14:39:02 +0900 (Tue, 07 Nov 2017) | 2 lines

* vm_eval.c (rescue_funcall_args): th->ec

------------------------------------------------------------------------
r60685 | knu | 2017-11-07 14:28:14 +0900 (Tue, 07 Nov 2017) | 1 line

Add details on the min/time parameters to the rdoc
------------------------------------------------------------------------
r60684 | ko1 | 2017-11-07 14:22:09 +0900 (Tue, 07 Nov 2017) | 3 lines

* eval_intern.h: rename macros rb_thread_raised_* to
  rb_ec_raised_*.

------------------------------------------------------------------------
r60683 | ko1 | 2017-11-07 14:12:39 +0900 (Tue, 07 Nov 2017) | 5 lines

rename to rb_ec_set_raised().

* thread.c (rb_threadptr_set_raised): rename to rb_ec_set_raised
  and accepts `ec`

------------------------------------------------------------------------
r60682 | ko1 | 2017-11-07 14:09:27 +0900 (Tue, 07 Nov 2017) | 1 line

use GET_VM()
------------------------------------------------------------------------
r60681 | ko1 | 2017-11-07 14:08:09 +0900 (Tue, 07 Nov 2017) | 1 line

use GET_EC() directly
------------------------------------------------------------------------
r60680 | ko1 | 2017-11-07 14:06:50 +0900 (Tue, 07 Nov 2017) | 2 lines

* vm_backtrace.c (rb_debug_inspector_t): `th` -> `ec`.

------------------------------------------------------------------------
r60679 | ko1 | 2017-11-07 14:01:51 +0900 (Tue, 07 Nov 2017) | 5 lines

move `rb_thread_t::method_missing_reason` to ec.

* vm_core.h (rb_thread_t): move method_missing_reason to
  rb_execution_context_t.

------------------------------------------------------------------------
r60678 | ko1 | 2017-11-07 13:53:11 +0900 (Tue, 07 Nov 2017) | 4 lines

remove `rb_postponed_job_t::th`.

* vm_trace.c (rb_postponed_job_t): remove `th` field because it is not used.

------------------------------------------------------------------------
r60677 | ko1 | 2017-11-07 13:04:18 +0900 (Tue, 07 Nov 2017) | 2 lines

rename because it doesn't receive `th`.

------------------------------------------------------------------------
r60676 | ko1 | 2017-11-07 13:01:13 +0900 (Tue, 07 Nov 2017) | 11 lines

th->ec: rb_threadptr_reset_raised()

* thread.c (rb_threadptr_reset_raised): rename to `rb_ec_reset_raised`
  and accepts `ec`.

* vm_trace.c: the following functions accept `ec` instead of `th`
  * exec_hooks_body
  * exec_hooks_precheck
  * exec_hooks_unprotected
  * exec_hooks_protected

------------------------------------------------------------------------
r60675 | svn | 2017-11-07 12:41:35 +0900 (Tue, 07 Nov 2017) | 1 line

* 2017-11-07
------------------------------------------------------------------------
r60674 | ko1 | 2017-11-07 12:41:34 +0900 (Tue, 07 Nov 2017) | 5 lines

prepare local variables (th and vm).

* vm_trace.c (rb_threadptr_exec_event_hooks_orig): prepare local variables
  `th` and `vm` instead of using rb_ec_... functions.

------------------------------------------------------------------------
r60673 | ko1 | 2017-11-06 17:22:27 +0900 (Mon, 06 Nov 2017) | 2 lines

use `GET_EC()` directly.

------------------------------------------------------------------------
r60672 | ko1 | 2017-11-06 16:44:28 +0900 (Mon, 06 Nov 2017) | 12 lines

move rb_thread_t::interrupt_flag and mask
to rb_execution_context_t.

* vm_core.h (rb_thread_t): move
  `rb_thread_t::interrupt_flag` and
  `rb_thread_t::interrupt_mask` to rb_execution_context_t.

  RUBY_VM_CHECK_INTS() accepts `ec` instead of `th`.

* cont.c (rb_fiber_terminate): to propagate interrupt information,
  add new parameter `need_interrupt`.

------------------------------------------------------------------------
r60671 | ko1 | 2017-11-06 16:35:37 +0900 (Mon, 06 Nov 2017) | 1 line

show the location at intterrupted
------------------------------------------------------------------------
r60670 | ko1 | 2017-11-06 14:41:48 +0900 (Mon, 06 Nov 2017) | 5 lines

renmae ec::fiber to ec::fiber_ptr.

* vm_core.h (rb_execution_context_t): renmae ec::fiber to
  ec::fiber_ptr make consistent with ec::thread_ptr.

------------------------------------------------------------------------
r60669 | hsbt | 2017-11-06 11:02:04 +0900 (Mon, 06 Nov 2017) | 3 lines

Merge RubyGems 2.7.1.

  * Fix `gem update --system` with RubyGems 2.7+.
------------------------------------------------------------------------
r60668 | nobu | 2017-11-06 08:32:50 +0900 (Mon, 06 Nov 2017) | 4 lines

enum.c: check argument first

* enum.c (enum_cycle_size): check an argument before the size of
  the receiver, if it is given.
------------------------------------------------------------------------
r60667 | nobu | 2017-11-06 08:27:46 +0900 (Mon, 06 Nov 2017) | 1 line

test/ruby/test_lazy_enumerator.rb: test for [Bug #14082]
------------------------------------------------------------------------
r60666 | marcandre | 2017-11-06 07:14:25 +0900 (Mon, 06 Nov 2017) | 3 lines

Fix size on Enumerable#cycle when the size is 0 [Bug #14082].

Patch by Kenichi Kamiya
------------------------------------------------------------------------
r60665 | nobu | 2017-11-06 06:13:18 +0900 (Mon, 06 Nov 2017) | 7 lines

lexer.rb: Ripper::Lexer::State

* ext/ripper/lib/ripper/lexer.rb (Ripper::Lexer::State): wrapper
  of lex_state values.

* parse.y (rb_parser_lex_state_name): return shared strings.  lex
  state combinations are very restricted.
------------------------------------------------------------------------
r60664 | nobu | 2017-11-06 06:13:17 +0900 (Mon, 06 Nov 2017) | 1 line

runruby.rb: add -C/--chdir option
------------------------------------------------------------------------
r60663 | svn | 2017-11-06 00:10:41 +0900 (Mon, 06 Nov 2017) | 1 line

* 2017-11-06
------------------------------------------------------------------------
r60662 | kazu | 2017-11-06 00:10:41 +0900 (Mon, 06 Nov 2017) | 6 lines

Modify spell miss.

Runing -> Running

Author:    TomoyukiNakagawa <nakagawa.tomoyuki@gmail.com>
[Fix GH-1741] [ci skip]
------------------------------------------------------------------------
r60661 | nobu | 2017-11-05 14:11:04 +0900 (Sun, 05 Nov 2017) | 1 line

runruby.rb: support run.gdb by --debugger option
------------------------------------------------------------------------
r60660 | mame | 2017-11-05 12:52:22 +0900 (Sun, 05 Nov 2017) | 7 lines

Revert "Introduce rb_code_range_t and replace YYLTYPE with it"

r60655 changed the usage of bison by defining a customized YYLTYPE,
which seemed to cause a random stall at rb_thread_terminate_all.

Kazuki Tsujimoto investigated the issue and pointed out the commit that
caused it.  Thanks!
------------------------------------------------------------------------
r60659 | suke | 2017-11-05 10:02:04 +0900 (Sun, 05 Nov 2017) | 3 lines

ext/win32ole/lib/win32ole.rb (metods): rescue WIN32OLEQueryInterfaceError.
test/win32ole/test_win32ole.rb: add test for WIN32OLE#methods

------------------------------------------------------------------------
r60658 | suke | 2017-11-05 09:36:37 +0900 (Sun, 05 Nov 2017) | 2 lines

test/win32ole/test_win32ole_method.rb: remove redundant assertions.

------------------------------------------------------------------------
r60657 | suke | 2017-11-05 09:30:57 +0900 (Sun, 05 Nov 2017) | 10 lines

* ext/win32ole/win32ole_error.c: add WIN32OLEQueryInterfaceError.
* ext/win32ole/win32ole_error.h: ditto.
* ext/win32ole/win32ole.c(typeinfo_from_ole): raise WIN32OLEQueryInterfaceError in ole_methods.
* ext/win32ole/win32ole_method.c(ole_methods_from_typeinfo): ditto.

M    ext/win32ole/win32ole.c
M    ext/win32ole/win32ole_error.c
M    ext/win32ole/win32ole_error.h
M    ext/win32ole/win32ole_method.c

------------------------------------------------------------------------
r60656 | eregon | 2017-11-05 02:48:51 +0900 (Sun, 05 Nov 2017) | 1 line

Workaround Travis CI issue by hardcoding localhost
------------------------------------------------------------------------
r60655 | mame | 2017-11-05 01:34:00 +0900 (Sun, 05 Nov 2017) | 8 lines

Introduce rb_code_range_t and replace YYLTYPE with it

rb_code_range_t has two t_code_location_t, i.e., the first and last
locations.

This is used for YYLTYPE, tracked locations of bison, and will be also
used for representing the "range", the first and the last locations of
each NODE.  Currently, each NODE keeps only the first location, though.
------------------------------------------------------------------------
r60654 | nobu | 2017-11-05 00:39:52 +0900 (Sun, 05 Nov 2017) | 4 lines

parse.y: fix duplicate symbol

* parse.y (rb_strterm_mark): do not define in ripper to get rid of
  duplicate symbol with static-linked-ext.
------------------------------------------------------------------------
r60653 | svn | 2017-11-05 00:22:19 +0900 (Sun, 05 Nov 2017) | 1 line

* 2017-11-05
------------------------------------------------------------------------
r60652 | mame | 2017-11-05 00:22:18 +0900 (Sun, 05 Nov 2017) | 5 lines

Introduce `rb_code_location_t`

`rb_code_location_t` has two integers, lineno and column, which point to
one location on a code.  Now `rb_code_location_t` is used instead of
`VALUE nd_location`.
------------------------------------------------------------------------
r60651 | nobu | 2017-11-04 23:32:48 +0900 (Sat, 04 Nov 2017) | 3 lines

gc.c: UNEXPECTED_NODE

* gc.c (UNEXPECTED_NODE): extract rb_bug for T_NODE.
------------------------------------------------------------------------
r60650 | mame | 2017-11-04 23:24:16 +0900 (Sat, 04 Nov 2017) | 10 lines

Avoid usage of the magic number `(NODE*)-1`

This magic number has two meanings depending upon the context:

* "required keyword argument (no name)" on NODE_LASGN (`def foo(x:)`)
* "rest argument (no name)" on NODE_MASGN and NODE_POSTARG
  ('a, b, * = ary` or `a, b, *, z = ary`)

To show this intention explicitly, two macros are introduced:
NODE_SPECIAL_REQUIRED_KEYWORD and NODE_SPECIAL_NO_NAME_REST.
------------------------------------------------------------------------
r60649 | yui-knk | 2017-11-04 22:59:34 +0900 (Sat, 04 Nov 2017) | 6 lines

compile.c (setup_args): Fix a typo

* compile.c (setup_args): In this function,
  an argument of nd_line is argn except this line.
  And argn is a pointer of NODE. So I think this
  is a typo.
------------------------------------------------------------------------
r60648 | mame | 2017-11-04 22:31:47 +0900 (Sat, 04 Nov 2017) | 8 lines

gc.c (rb_free_tmp_buffer): stop accessing imemo_alloc as NODE

The fields of imemo_alloc were accessed via RNODE() cast, since the
imemo was NODE_ALLOCA traditionally.  This was refactored at r60239,
so now the fields should be accessed as imemo_alloc.  This prevented
change of NODE structure.

Yuichiro Kaneko pointed out this inconsistency.  Thanks!
------------------------------------------------------------------------
r60647 | mame | 2017-11-04 22:31:46 +0900 (Sat, 04 Nov 2017) | 4 lines

parse.y (new_args_tail_gen): returns a NODE instead of imemo

`new_args_tail_gen` returned imemo, but the value was later accessed as
`NODE*`.  This prevented change of NODE structure.
------------------------------------------------------------------------
r60646 | mame | 2017-11-04 22:05:05 +0900 (Sat, 04 Nov 2017) | 5 lines

test/ruby/test_io.rb (test_write_no_garbage): Add detailed message

I saw this test failed once.  There is no problem if `before > after`
but we cannot check it.  To allow diagnosis in future, the detailed
message is added.
------------------------------------------------------------------------
r60645 | nobu | 2017-11-04 21:07:20 +0900 (Sat, 04 Nov 2017) | 4 lines

parse.y: suppress warning in ripper

* parse.y (rb_discard_node_gen): rb_discard_node() is not used in
  ripper right now.
------------------------------------------------------------------------
r60644 | nobu | 2017-11-04 21:01:42 +0900 (Sat, 04 Nov 2017) | 8 lines

parse.y: suppress warnings

* parse.y (parser_set_line): removed no longer used function.

* parse.y (rb_strterm_heredoc_t): adjust type of sourceline to
  ruby_sourceline.

* parse.y (rb_strterm_t): get rid of redefinition.
------------------------------------------------------------------------
r60643 | mame | 2017-11-04 20:37:19 +0900 (Sat, 04 Nov 2017) | 5 lines

Remove RNODE cast from NODE utility functions

Now, casting NODE to VALUE is not recommended.  This change requires an
explicit cast from VALUE to NODE to use the NODE utility functions such
as `nd_type`.
------------------------------------------------------------------------
r60642 | mame | 2017-11-04 19:56:50 +0900 (Sat, 04 Nov 2017) | 3 lines

Rename imemo_strterm to imemo_parser_strterm

Per ko1's request.
------------------------------------------------------------------------
r60641 | mame | 2017-11-04 19:56:49 +0900 (Sat, 04 Nov 2017) | 1 line

ext/objspace/objspace.c: add imemo_strterm
------------------------------------------------------------------------
r60640 | mame | 2017-11-04 19:02:43 +0900 (Sat, 04 Nov 2017) | 1 line

Remove NODE-related pieces of code from GC
------------------------------------------------------------------------
r60639 | mame | 2017-11-04 18:18:08 +0900 (Sat, 04 Nov 2017) | 11 lines

Make Ripper use NODE buffer

This is a follow-up of r60488.  Not only the Ruby parser but also Ripper
now use NODE buffer instead of NODE objects managed by GC.

Now we can change the struct of NODEs so that it can keep detailed
location information, perhaps (not tried yet).  Note that, however, the
first word of each NODE must be still compatible with RBasic structure.
This is because Ripper handles NODEs and other objects uniformly;
especially, it still uses `RB_TYPE_P(obj, T_NODE)` for distinguishing
between NODEs and other objects.
------------------------------------------------------------------------
r60638 | mame | 2017-11-04 16:21:37 +0900 (Sat, 04 Nov 2017) | 1 line

Fix the alignment bug of r60634 for LLP64
------------------------------------------------------------------------
r60637 | mame | 2017-11-04 16:21:36 +0900 (Sat, 04 Nov 2017) | 3 lines

Revert "Revert "Replace NODE_STRTERM and NODE_HEREDOC with imemo_strterm""

Retry r60634
------------------------------------------------------------------------
r60636 | rhe | 2017-11-04 15:56:16 +0900 (Sat, 04 Nov 2017) | 7 lines

openssl: pull test case from upstream commit 62af0446569a

The test case added by r60310 ("fix OpenSSL::SSL::SSLContext#min_version
doesn't work", 2017-10-21) does not pass with OpenSSL >= 1.1.0 or
LibreSSL >= 2.6.0. Check that the default 'min_version' value is
properly enforced by actually attempting a handshake rather than by
inspecting the SSL option flags.  [ruby-core:83479] [Bug #14039]
------------------------------------------------------------------------
r60635 | mame | 2017-11-04 13:59:19 +0900 (Sat, 04 Nov 2017) | 3 lines

Revert "Replace NODE_STRTERM and NODE_HEREDOC with imemo_strterm"

Due to build failure on mswin and mingw.
------------------------------------------------------------------------
r60634 | mame | 2017-11-04 12:04:54 +0900 (Sat, 04 Nov 2017) | 8 lines

Replace NODE_STRTERM and NODE_HEREDOC with imemo_strterm

Just refactoring.

NODE_STRTERM and NODE_HEREDOC are not an internal node of AST, but a
temporary storage for managing termination of string literals and
heredocs.  Instead of NODE abuse, I want to use imemo for the storage
in order to avoid (my) confusion.
------------------------------------------------------------------------
r60633 | svn | 2017-11-04 10:48:46 +0900 (Sat, 04 Nov 2017) | 1 line

* 2017-11-04
------------------------------------------------------------------------
r60632 | nobu | 2017-11-04 10:48:45 +0900 (Sat, 04 Nov 2017) | 6 lines

load from relative path to __FILE__

* spec/ruby/library/pathname/empty_spec.rb: load spec_helper from
  relative path to `__FILE__` same as other spec files, instead of
  `__dir__` in which symlinks are resolved, to get rid of constant
  redefinition warning when `srcdir` contains symlinks.
------------------------------------------------------------------------
r60631 | kazu | 2017-11-03 16:14:51 +0900 (Fri, 03 Nov 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r60630 | suke | 2017-11-03 15:07:24 +0900 (Fri, 03 Nov 2017) | 3 lines

* ext/win32ole/lib/win32ole.rb :add WIN32OLE#methods. WIN32OLE might work
  well with did_you_mean gem.

------------------------------------------------------------------------
r60629 | yui-knk | 2017-11-03 12:49:07 +0900 (Fri, 03 Nov 2017) | 1 line

node.c: Add some comments
------------------------------------------------------------------------
r60628 | yui-knk | 2017-11-03 12:22:23 +0900 (Fri, 03 Nov 2017) | 6 lines

node.c: Fix possible alignment bugs

* node.c (rb_node_buffer_new): Use offsetof for
  node_buffer_t size calculation.
* node.c (rb_ast_newnode): Use offsetof for
  node_buffer_elem_t size calculation.
------------------------------------------------------------------------
r60627 | yui-knk | 2017-11-03 11:17:07 +0900 (Fri, 03 Nov 2017) | 5 lines

node.h: Remove obsolete comment

* node.h: NODE_FL_CREF_PUSHED_BY_EVAL was defined as
  NODE_FL_NEWLINE by r25984, redefined by r40703
  and removed by r49897.
------------------------------------------------------------------------
r60625 | nobu | 2017-11-03 09:52:54 +0900 (Fri, 03 Nov 2017) | 4 lines

test/ruby/test_eval.rb: use orphan procs

This failure has been hidden by the bug of assert_raise which is
fixed at r60614.
------------------------------------------------------------------------
r60624 | stomar | 2017-11-03 05:38:04 +0900 (Fri, 03 Nov 2017) | 4 lines

io.c: improve docs for the chomp option

* io.c: [DOC] improve the description for the chomp option and
  add examples to IO.readlines and IO#readlines; other small fixes.
------------------------------------------------------------------------
r60623 | stomar | 2017-11-03 05:26:11 +0900 (Fri, 03 Nov 2017) | 1 line

NEWS: add entry for Psych
------------------------------------------------------------------------
r60622 | stomar | 2017-11-03 05:25:37 +0900 (Fri, 03 Nov 2017) | 1 line

NEWS: fix grammar
------------------------------------------------------------------------
r60621 | stomar | 2017-11-03 05:25:04 +0900 (Fri, 03 Nov 2017) | 1 line

doc/NEWS-2.4.0: fix grammar and typo
------------------------------------------------------------------------
r60620 | stomar | 2017-11-03 05:23:47 +0900 (Fri, 03 Nov 2017) | 4 lines

proc.c: fix rdoc for Method class documentation

* proc.c: [DOC] fix rdoc syntax for the class documentation of
  the Method class so that it is displayed in the rendered docs.
------------------------------------------------------------------------
r60619 | stomar | 2017-11-03 05:21:15 +0900 (Fri, 03 Nov 2017) | 6 lines

proc.c: further improve docs for {Method,Proc}#arity

* proc.c: [DOC] fix grammar in docs for {Method,Proc}#arity;
  for Method#arity, move special case of methods written in C to the
  end of the description, fix a typo in a method name, and add an
  example for required arguments with an optional keyword argument.
------------------------------------------------------------------------
r60618 | stomar | 2017-11-03 05:20:11 +0900 (Fri, 03 Nov 2017) | 6 lines

proc.c: improve docs for {Method,Proc}#arity

* proc.c: [DOC] improve Method#arity documentation to match with
  Proc#arity, mentioning keyword arguments; also make Proc#arity
  examples more consistent in the naming of keyword arguments.
  Patch by Nikita Misharin (TheSmartnik).  [Fix GH-1735]
------------------------------------------------------------------------
r60617 | svn | 2017-11-03 05:06:38 +0900 (Fri, 03 Nov 2017) | 1 line

* 2017-11-03
------------------------------------------------------------------------
r60616 | stomar | 2017-11-03 05:06:38 +0900 (Fri, 03 Nov 2017) | 4 lines

rexml: improve docs

* lib/rexml/entity.rb: [DOC] drop a pointless comment.
  Reported by Michael Gee (mikegee).  [Fix GH-1736]
------------------------------------------------------------------------
r60615 | nobu | 2017-11-02 21:45:37 +0900 (Thu, 02 Nov 2017) | 4 lines

skip/fix wrong tests

* test/ruby/test_{class,eval}.rb: skip or fix wrong tests hidden
  by a bug of assert_raise.
------------------------------------------------------------------------
r60614 | nobu | 2017-11-02 21:29:33 +0900 (Thu, 02 Nov 2017) | 4 lines

assertions.rb: fix return in assert_raise

* test/lib/test/unit/assertions.rb (assert_raise): should fail if
  returned gently in the given block without any exceptions.
------------------------------------------------------------------------
r60613 | nobu | 2017-11-02 16:52:49 +0900 (Thu, 02 Nov 2017) | 4 lines

compile.c: kw splat after splat

* compile.c (setup_args): set keyword splat flag after splat
  arguments.  [ruby-core:83638] [Bug #10856]
------------------------------------------------------------------------
r60612 | nobu | 2017-11-02 16:52:48 +0900 (Thu, 02 Nov 2017) | 3 lines

debug.c: vm call flags

* debug.c (ruby_dummy_gdb_enums): include vm_call_flag_bits.
------------------------------------------------------------------------
r60611 | rhe | 2017-11-02 15:30:18 +0900 (Thu, 02 Nov 2017) | 5 lines

bignum.c: avoid use of uninitialized value in Integer.sqrt

This is a follow-up fix to r57713. estimate_initial_sqrt() didn't
initialize BDIGITs except the topmost two, letting Integer.sqrt return
wrong result in the fast path, such as for (1<<504).
------------------------------------------------------------------------
r60610 | usa | 2017-11-02 13:28:30 +0900 (Thu, 02 Nov 2017) | 7 lines

Support Windows

* spec/bundler/spec_helper.rb: there are no reason to refuse ':' and '-' in the
  path of spec files.  especially, ':' is always contained on Windows.

* spec/bundler/spec/helper.rb: open3.rb is also supported on Windows.

------------------------------------------------------------------------
r60609 | hsbt | 2017-11-02 13:27:33 +0900 (Thu, 02 Nov 2017) | 1 line

Fixed syntax error with ignore option order.
------------------------------------------------------------------------
r60608 | hsbt | 2017-11-02 13:25:37 +0900 (Thu, 02 Nov 2017) | 1 line

Merge release version of Rubygems 2.7.0.
------------------------------------------------------------------------
r60607 | usa | 2017-11-02 12:12:05 +0900 (Thu, 02 Nov 2017) | 4 lines

Should quote by double quotes, not single quotes for Windows

* common.mk (test-bundler-precheck): single quotes is not quote on Windows.

------------------------------------------------------------------------
r60606 | svn | 2017-11-02 08:30:03 +0900 (Thu, 02 Nov 2017) | 1 line

* 2017-11-02
------------------------------------------------------------------------
r60605 | svn | 2017-11-02 08:30:01 +0900 (Thu, 02 Nov 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60604 | svn | 2017-11-02 08:30:00 +0900 (Thu, 02 Nov 2017) | 1 line

* remove trailing spaces, append newline at EOF.
------------------------------------------------------------------------
r60603 | hsbt | 2017-11-02 08:29:38 +0900 (Thu, 02 Nov 2017) | 4 lines

Update bundled bundler to 1.16.0.

  * lib/bundler, spec/bundler: Merge bundler-1.16.0.
  * common.mk: rspec examples of bundler-1.16.0 needs require option.
------------------------------------------------------------------------
r60602 | nobu | 2017-11-01 12:26:55 +0900 (Wed, 01 Nov 2017) | 1 line

compile.c: refactored compile_return
------------------------------------------------------------------------
r60601 | nobu | 2017-11-01 12:26:54 +0900 (Wed, 01 Nov 2017) | 4 lines

test_syntax.rb: all assertions

* test/ruby/test_syntax.rb (test_return_toplevel): try all
  assertions even if any assertions failed.
------------------------------------------------------------------------
r60600 | nobu | 2017-11-01 12:26:27 +0900 (Wed, 01 Nov 2017) | 1 line

Pathname: get rid of a -Wcomment warning [DOC]
------------------------------------------------------------------------
r60599 | nobu | 2017-11-01 11:22:10 +0900 (Wed, 01 Nov 2017) | 5 lines

file.c: infect from arguments

* file.c (rb_check_realpath_internal): infetct the result with
  arguments, no taint if none are tainted and cwd is not used.
  [ruby-core:83583] [Bug #14060]
------------------------------------------------------------------------
r60598 | ko1 | 2017-11-01 11:04:02 +0900 (Wed, 01 Nov 2017) | 1 line

revert r60596 because it cause faulure on TestFile#test_realpath_taintedness
------------------------------------------------------------------------
r60597 | nobu | 2017-11-01 10:55:45 +0900 (Wed, 01 Nov 2017) | 1 line

dir.c: cast to suppress a warning
------------------------------------------------------------------------
r60596 | nobu | 2017-11-01 10:51:57 +0900 (Wed, 01 Nov 2017) | 5 lines

file.c: infect from arguments

* file.c (rb_check_realpath_internal): infetct the result with
  arguments, no taint if none are tainted and cwd is not used.
  [ruby-core:83583] [Bug #14060]
------------------------------------------------------------------------
r60595 | normal | 2017-11-01 09:17:11 +0900 (Wed, 01 Nov 2017) | 11 lines

dir: Dir.mkdir and Dir.rmdir release GVL

This avoids blocking the entire VM when operating on slow or
unreliable filesystems.  Instead, only the thread performing
the mkdir or rmdir operation is blocked and other threads
are free to proceed.

* dir.c (nogvl_mkdir): new function
  (nogvl_rmdir): ditto
  (dir_s_mkdir): release GVL
  (dir_s_rmdir): ditto
------------------------------------------------------------------------
r60594 | marcandre | 2017-11-01 07:24:03 +0900 (Wed, 01 Nov 2017) | 1 line

Pathname: Simplify example [DOC] [ci-skip]
------------------------------------------------------------------------
r60593 | svn | 2017-11-01 04:10:20 +0900 (Wed, 01 Nov 2017) | 1 line

* 2017-11-01
------------------------------------------------------------------------
r60592 | normal | 2017-11-01 04:10:19 +0900 (Wed, 01 Nov 2017) | 13 lines

use mode_t where applicable (instead of int)

mode_t is the correct type for these syscalls and it can be
easier-to-understand.  It may also help portability to future
platforms and improve type checking.

* dir.c (dir_s_mkdir): use mode_t for mkdir(2)

* file.c (chmod_internal): use mode_t for chmod(2)
  (rb_file_s_chmod): s/int/mode_t/
  (lchmod_internal): ditto, deref pointer as in chmod_internal
  (rb_file_s_lchmod): pass pointer as in rb_file_s_chmod
  (rb_file_s_rename): use mode_t for umask(2)
------------------------------------------------------------------------
r60591 | yui-knk | 2017-10-31 22:29:54 +0900 (Tue, 31 Oct 2017) | 4 lines

node.h: Rename nd_reserved to nd_location

* node.h (RNode): Now nd_reserved is used to store location
  information, so rename nd_reserved to nd_location.
------------------------------------------------------------------------
r60590 | nobu | 2017-10-31 18:33:22 +0900 (Tue, 31 Oct 2017) | 7 lines

compile.c: ensure after return in library toplevel

* compile.c (compile_return): execute ensure clause after toplevel
  return even in library toplevel other than the main script.
  [ruby-core:83589] [Bug #14061]

test
------------------------------------------------------------------------
r60589 | nobu | 2017-10-31 18:33:21 +0900 (Tue, 31 Oct 2017) | 3 lines

compile.c: compile_return

* compile.c (compile_return): extract from iseq_compile_each.
------------------------------------------------------------------------
r60588 | hsbt | 2017-10-31 16:24:29 +0900 (Tue, 31 Oct 2017) | 4 lines

null byte at Psych::Emitter.

  Check null byte. Patched by tommy (Masahiro Tomita).
  [Bug #13993][ruby-dev:50285]
------------------------------------------------------------------------
r60587 | mame | 2017-10-31 14:24:21 +0900 (Tue, 31 Oct 2017) | 1 line

Remove unneeded complexity
------------------------------------------------------------------------
r60586 | normal | 2017-10-31 10:37:37 +0900 (Tue, 31 Oct 2017) | 23 lines

webrick/httpresponse: minor cleanups to reduce memory use

I never knew "format" was a global method alias for "sprintf";
so it was confusing to me.  Normally, one would use "sprintf"
since it's also available in many other languages, but
Integer#to_s avoids parsing a format string so it's less
bug-prone.

Furthermore, favor string interpolation over String#<< since it
is easier for the VM to optimize memory allocation (as in r60320).
Interpolation also reduces method calls and memory overhead
for inline method cache.

Finally, ensure we clear all short-lived buffers for body
responses.  A similar change was made and measured for Net::*
in r58840 showing a large memory reduction on some workloads.

* webrick/httpresponse.rb (send_body_io): favor String#to_s,
  reduce method calls for String#<<,
  clear `buf' when done,
  avoid extra String#bytesize calls

* (send_body_string): ditto
------------------------------------------------------------------------
r60585 | yui-knk | 2017-10-31 09:46:30 +0900 (Tue, 31 Oct 2017) | 30 lines

Use NODE_CASE2 if case expressions don't exist

When NODE_WHEN is compiled by iseq_compile_each0,
the node passed to compile_when is NODE_WHEN (not NODE_CASE).
So we can not handle the location of NODE_CASE of
case statements which don't have case expressions.

e.g. :

```
case; when 1; foo; when 2; bar; else baz; end
```

This commit adds NODE_CASE2, and compiles it by
iseq_compile_each0.

* compile.c (compile_case): Does not call COMPILE_ when
  NODE_CASE does not have case expressions.
* compile.c (compile_case2): Compile NODE_CASE2 by compile_case2.
* compile.c (compile_when): Delete an obsoleted function.
* compile.c (iseq_compile_each0): Compile NODE_CASE2.

* ext/objspace/objspace.c (count_nodes): Add NODE_CASE2 case.

* node.c (dump_node, rb_gc_mark_node): Add NODE_CASE2 case.

* node.h (node_type): Add NODE_CASE2.
* node.h (NEW_CASE2): Add a macro which generates NODE_CASE2.

* parse.y: Generate NODE_CASE2 if case expressions don't exist.
------------------------------------------------------------------------
r60584 | normal | 2017-10-31 08:56:44 +0900 (Tue, 31 Oct 2017) | 9 lines

webrick: support Proc objects as body responses

* lib/webrick/httpresponse.rb (send_body): call send_body_proc
  (send_body_proc): new method
  (class ChunkedWrapper): new class

* test/webrick/test_httpresponse.rb (test_send_body_proc): new test
  (test_send_body_proc_chunked): ditto
  [Feature #855]
------------------------------------------------------------------------
r60583 | normal | 2017-10-31 08:47:27 +0900 (Tue, 31 Oct 2017) | 9 lines

dir: Dir.chdir releases GVL

chdir(2) is subject to all the pathological slowdowns and
caveats as open(2) on slow or unreliable filesystems, so ensure
other threads can proceed while this is happening.

* dir.c (nogvl_chdir): new function

* dir.c (dir_chdir): release GVL
------------------------------------------------------------------------
r60582 | svn | 2017-10-31 08:44:43 +0900 (Tue, 31 Oct 2017) | 1 line

* 2017-10-31
------------------------------------------------------------------------
r60581 | yui-knk | 2017-10-31 08:44:42 +0900 (Tue, 31 Oct 2017) | 17 lines

Use nd_lineno instead of nd_line for branch coverages

* compile.c (compile_if, compile_case, compile_loop, iseq_compile_each0):
  Use nd_lineno of nodes for branch coverages.
  nd_lineno is not adjusted line number of nodes.
  Sometimes nd_line is adjusted by fixpos. These
  adjustments lead to confusing result.

  For example, lineno of NODE_IF is 1, but
  line is 2 (line number is one-based).

  ```
  ;;;;;;;;;;;;;;;;;;;;if
    1 + 1
    2
  end
  ```
------------------------------------------------------------------------
r60580 | yui-knk | 2017-10-30 22:36:20 +0900 (Mon, 30 Oct 2017) | 12 lines

Store lineno on RNode

* node.c (A_NODE_HEADER): Print lineno.

* node.h (nd_column, nd_set_column): Store column
  number with 16-bit.
* node.h (nd_lineno, nd_set_lineno): Define
  getter/setter macros for lineno of RNode.

* parse.y : Set first lineno of tokens.

Thanks to takeshinoda for review.
------------------------------------------------------------------------
r60579 | nobu | 2017-10-30 14:45:21 +0900 (Mon, 30 Oct 2017) | 4 lines

backward.h: rb_frame_method_id_and_class

* include/ruby/backward.h (rb_frame_method_id_and_class): moved
  a deprecated declaration from intern.h, for r60558.
------------------------------------------------------------------------
r60578 | nobu | 2017-10-30 14:45:20 +0900 (Mon, 30 Oct 2017) | 5 lines

rbinstall.rb: show categories of default gems

* tool/rbinstall.rb (#install_default_gem): show categories of
  default gems, pure ruby libraries and libraries with extensions.
  [ruby-core:83600] [Bug #14065]
------------------------------------------------------------------------
r60577 | ko1 | 2017-10-30 12:58:05 +0900 (Mon, 30 Oct 2017) | 1 line

stop refine_spec because it causes double free error
------------------------------------------------------------------------
r60576 | yui-knk | 2017-10-30 07:12:08 +0900 (Mon, 30 Oct 2017) | 4 lines

Remove duplicated column set

* parse.y : Column of resq is set by new_resbody, so
  this line is needless.
------------------------------------------------------------------------
r60575 | yui-knk | 2017-10-30 06:52:54 +0900 (Mon, 30 Oct 2017) | 1 line

parse.y (new_regexp_gen): Set column for NODE_SCOPE
------------------------------------------------------------------------
r60574 | stomar | 2017-10-30 06:43:36 +0900 (Mon, 30 Oct 2017) | 3 lines

string.c: improve docs

* string.c: [DOC] fix rdoc for cross reference; fix grammar.
------------------------------------------------------------------------
r60573 | stomar | 2017-10-30 05:59:33 +0900 (Mon, 30 Oct 2017) | 3 lines

lib/set.rb: improve docs for Set#===

* lib/set.rb: [DOC] improve description and examples for Set#===.
------------------------------------------------------------------------
r60572 | stomar | 2017-10-30 05:58:36 +0900 (Mon, 30 Oct 2017) | 3 lines

io.c: improve docs

* io.c: [DOC] fix rdoc for some cross references; fix grammar.
------------------------------------------------------------------------
r60571 | stomar | 2017-10-30 05:57:29 +0900 (Mon, 30 Oct 2017) | 3 lines

io.c: docs for IO#write

* io.c: [DOC] fix example and language in IO#write docs.
------------------------------------------------------------------------
r60570 | stomar | 2017-10-30 05:56:13 +0900 (Mon, 30 Oct 2017) | 1 line

doc/contributors.rdoc: [DOC] update
------------------------------------------------------------------------
r60569 | stomar | 2017-10-30 05:50:55 +0900 (Mon, 30 Oct 2017) | 3 lines

complex.c: doc fix

* complex.c: [DOC] fix grammar and typo.
------------------------------------------------------------------------
r60568 | eregon | 2017-10-30 01:20:04 +0900 (Mon, 30 Oct 2017) | 1 line

Clarify what is written and read in IO#popen spec
------------------------------------------------------------------------
r60567 | eregon | 2017-10-30 01:18:50 +0900 (Mon, 30 Oct 2017) | 1 line

Fix spec which can fail if the pipe is closed before flushing in the subprocess
------------------------------------------------------------------------
r60566 | ko1 | 2017-10-30 01:12:06 +0900 (Mon, 30 Oct 2017) | 4 lines

* vm_dump.c (vm_stack_dump_each): accepts `ec`.

* vm_dump.c (vm_base_ptr): constify.

------------------------------------------------------------------------
r60565 | ko1 | 2017-10-30 00:51:23 +0900 (Mon, 30 Oct 2017) | 2 lines

* node.h (ast_t): renamed to `rb_ast_t`.

------------------------------------------------------------------------
r60564 | ko1 | 2017-10-30 00:41:53 +0900 (Mon, 30 Oct 2017) | 2 lines

* eval_jump.c (rb_exec_end_proc): use `GET_EC()`.

------------------------------------------------------------------------
r60563 | ko1 | 2017-10-30 00:38:55 +0900 (Mon, 30 Oct 2017) | 9 lines

call `rb_vm_stack_to_heap()`

* safe.c (rb_set_safe_level): call `rb_vm_stack_to_heap()`
  to set block parameter.

* safe.c (rb_set_safe_level): use `GET_EC()`.

* safe.c (safe_setter): ditto.

------------------------------------------------------------------------
r60562 | ko1 | 2017-10-30 00:34:20 +0900 (Mon, 30 Oct 2017) | 2 lines

* vm_insnhelper.h (GET_SP_COUNT): removed because nobody use it.

------------------------------------------------------------------------
r60561 | ko1 | 2017-10-30 00:31:47 +0900 (Mon, 30 Oct 2017) | 2 lines

* vm_eval.c (current_vm_stack_arg): accepts `ec`.

------------------------------------------------------------------------
r60560 | ko1 | 2017-10-30 00:27:07 +0900 (Mon, 30 Oct 2017) | 1 line

use given `ec`.
------------------------------------------------------------------------
r60559 | ko1 | 2017-10-30 00:25:32 +0900 (Mon, 30 Oct 2017) | 6 lines

constify `rb_vm_bh_to_procval()`

* vm_insnhelper.c (rb_vm_bh_to_procval): constify 1st param (ec).

* vm_args.c (args_setup_block_parameter): accepts (const) `ec`.

------------------------------------------------------------------------
r60558 | ko1 | 2017-10-30 00:17:29 +0900 (Mon, 30 Oct 2017) | 6 lines

remove unused functions.

* vm.c (rb_frame_method_id_and_class): removed because nobody use it.

* vm.c (rb_thread_current_status): ditto.

------------------------------------------------------------------------
r60557 | ko1 | 2017-10-30 00:13:49 +0900 (Mon, 30 Oct 2017) | 10 lines

use `GET_EC()`.

* eval.c (rb_block_given_p): use `GET_EC()` directly.

* eval.c (rb_ensure): ditto.

* eval.c (rb_errinfo): ditto.

* eval.c (previous_frame): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60556 | ko1 | 2017-10-30 00:03:33 +0900 (Mon, 30 Oct 2017) | 2 lines

* vm_eval.c (vm_catch_protect): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60555 | svn | 2017-10-30 00:00:24 +0900 (Mon, 30 Oct 2017) | 1 line

* 2017-10-30
------------------------------------------------------------------------
r60554 | ko1 | 2017-10-30 00:00:23 +0900 (Mon, 30 Oct 2017) | 1 line

use `GET_EC()`.
------------------------------------------------------------------------
r60553 | ko1 | 2017-10-29 23:59:04 +0900 (Sun, 29 Oct 2017) | 1 line

use `GET_EC()`.
------------------------------------------------------------------------
r60552 | ko1 | 2017-10-29 23:55:19 +0900 (Sun, 29 Oct 2017) | 2 lines

`th` -> `ec` for `rb_iterate0`.

------------------------------------------------------------------------
r60551 | ko1 | 2017-10-29 23:52:05 +0900 (Sun, 29 Oct 2017) | 2 lines

`th` -> `ec` for rb_raise_method_missing().

------------------------------------------------------------------------
r60550 | ko1 | 2017-10-29 23:45:16 +0900 (Sun, 29 Oct 2017) | 4 lines

`rb_call0()` accepts `ec`.

* vm_eval.c (rb_call0): accepts `ec`.

------------------------------------------------------------------------
r60549 | ko1 | 2017-10-29 23:39:51 +0900 (Sun, 29 Oct 2017) | 2 lines

* vm_eval.c (rb_current_receiver): use `GET_EC()`.

------------------------------------------------------------------------
r60548 | ko1 | 2017-10-29 23:38:25 +0900 (Sun, 29 Oct 2017) | 4 lines

`th` -> `ec` for vm_call_super().

* vm_eval.c (vm_call_super): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60547 | ko1 | 2017-10-29 23:33:23 +0900 (Sun, 29 Oct 2017) | 2 lines

use `GET_VM()` directly.

------------------------------------------------------------------------
r60546 | ko1 | 2017-10-29 23:31:01 +0900 (Sun, 29 Oct 2017) | 9 lines

`th` -> `ec` for VM dump related functions.

* vm_dump.c: `th` -> `ec` (and constify) for:
  * control_frame_dump
  * rb_vmdebug_stack_dump_raw
  * rb_vmdebug_debug_print_register
  * rb_vmdebug_debug_print_pre
  * rb_vmdebug_debug_print_post

------------------------------------------------------------------------
r60545 | ko1 | 2017-10-29 23:06:58 +0900 (Sun, 29 Oct 2017) | 5 lines

`rb_ec_error_print()`.

* eval_error.c (rb_threadptr_error_print): renamed to
  rb_ec_error_print() and it accepts `ec`.

------------------------------------------------------------------------
r60544 | ko1 | 2017-10-29 22:51:37 +0900 (Sun, 29 Oct 2017) | 4 lines

remove rb_threadptr_during_gc().

* gc.c (rb_threadptr_during_gc): removed because nobody use it.

------------------------------------------------------------------------
r60543 | ko1 | 2017-10-29 22:50:24 +0900 (Sun, 29 Oct 2017) | 2 lines

use `GET_EC()`.

------------------------------------------------------------------------
r60542 | ko1 | 2017-10-29 22:49:45 +0900 (Sun, 29 Oct 2017) | 5 lines

rb_ec_stack_check()

* gc.c (rb_ec_stack_check): renamed from rb_threadptr_stack_check()
  and it accepts `ec`.

------------------------------------------------------------------------
r60541 | ko1 | 2017-10-29 22:20:44 +0900 (Sun, 29 Oct 2017) | 2 lines

use `GET_EC()` directly.

------------------------------------------------------------------------
r60540 | ko1 | 2017-10-29 22:19:53 +0900 (Sun, 29 Oct 2017) | 2 lines

use `GET_VM()` directly.

------------------------------------------------------------------------
r60539 | ko1 | 2017-10-29 22:19:14 +0900 (Sun, 29 Oct 2017) | 4 lines

EXEC_EVENT_HOOK(ec, ...)

* vm_core.h (EXEC_EVENT_HOOK): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60538 | ko1 | 2017-10-29 22:17:37 +0900 (Sun, 29 Oct 2017) | 4 lines

`rb_trace_arg_t::ec`

* vm_core.h (rb_trace_arg_t): introduce `ec` field instead of `th`.

------------------------------------------------------------------------
r60537 | ko1 | 2017-10-29 21:57:04 +0900 (Sun, 29 Oct 2017) | 7 lines

`ec` has `thread_ptr`.

* cont.c (rb_context_struct): move rb_context_t::thread_ptr to
  rb_execution_context_t::thread_ptr.

* cont.c (rb_fiberptr_thread_ptr): removed.

------------------------------------------------------------------------
r60536 | ktsj | 2017-10-29 15:16:10 +0900 (Sun, 29 Oct 2017) | 3 lines

.gdbinit: follow up changes in r60440

ruby_current_vm has been renamed to ruby_current_vm_ptr.
------------------------------------------------------------------------
r60535 | nobu | 2017-10-29 14:46:23 +0900 (Sun, 29 Oct 2017) | 5 lines

io.c: honor buffered mode

* io.c (io_writev): honor buffered mode to get rid of broken pipe
  error when stdout is redirected to a pipeline.
  [ruby-core:83578] [Feature #14042]
------------------------------------------------------------------------
r60534 | nobu | 2017-10-29 09:43:34 +0900 (Sun, 29 Oct 2017) | 5 lines

io.c: convert to string at writev

* io.c (io_fwritev): needs conversion to string before accessing
  the content, as well as single argument case, not to segfault.
  [Feature #9323]
------------------------------------------------------------------------
r60533 | nobu | 2017-10-29 08:54:16 +0900 (Sun, 29 Oct 2017) | 1 line

Localize EC functions
------------------------------------------------------------------------
r60532 | eregon | 2017-10-29 05:04:52 +0900 (Sun, 29 Oct 2017) | 3 lines

Ignore the libruby check if it cannot be found

* ENV['RUBY_EXE'] can be just 'ruby' and is not an absolute path.
------------------------------------------------------------------------
r60531 | eregon | 2017-10-29 02:45:46 +0900 (Sun, 29 Oct 2017) | 1 line

Make sure to compile each extension only once in ruby/spec
------------------------------------------------------------------------
r60530 | kazu | 2017-10-29 01:34:30 +0900 (Sun, 29 Oct 2017) | 4 lines

Add note to close_{read,write} too

when call on closed stream
[ci skip]
------------------------------------------------------------------------
r60529 | eregon | 2017-10-29 01:15:46 +0900 (Sun, 29 Oct 2017) | 3 lines

Use ENV['RUBY_EXE'] as RbConfig.ruby might be incorrect

* On a built-but-not-installed-ruby.
------------------------------------------------------------------------
r60528 | ktsj | 2017-10-29 00:37:00 +0900 (Sun, 29 Oct 2017) | 5 lines

iseq.c: remove obsolete comment

You can see ARGS_SIMPLE flag as follows:

 $ ruby --dump=insns -e itself
------------------------------------------------------------------------
r60527 | svn | 2017-10-29 00:15:52 +0900 (Sun, 29 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60526 | svn | 2017-10-29 00:15:52 +0900 (Sun, 29 Oct 2017) | 1 line

* append newline at EOF.
------------------------------------------------------------------------
r60525 | eregon | 2017-10-29 00:15:48 +0900 (Sun, 29 Oct 2017) | 1 line

Update to ruby/spec@a6b8805
------------------------------------------------------------------------
r60524 | svn | 2017-10-29 00:14:56 +0900 (Sun, 29 Oct 2017) | 1 line

* 2017-10-29
------------------------------------------------------------------------
r60523 | eregon | 2017-10-29 00:14:55 +0900 (Sun, 29 Oct 2017) | 1 line

Update to ruby/mspec@90925d6
------------------------------------------------------------------------
r60522 | ko1 | 2017-10-28 22:22:04 +0900 (Sat, 28 Oct 2017) | 10 lines

`th` -> `ec` for backtrace functions.

* vm_backtrace.c: accept `ec` and rename `threadptr` to `ec`.
  * rb_threadptr_backtrace_object -> rb_ec_backtrace_object
  * rb_threadptr_backtrace_str_ary -> rb_ec_backtrace_str_ar
  * rb_threadptr_backtrace_location_ary -> rb_ec_backtrace_location_ary
  * threadptr_backtrace_to_ary -> ec_backtrace_to_ary

* vm_eval.c (adjust_backtrace_in_eval): accepts `ec`.

------------------------------------------------------------------------
r60521 | ko1 | 2017-10-28 21:23:51 +0900 (Sat, 28 Oct 2017) | 16 lines

`th` -> `ec` for method management functions.

* vm_eval.c: `th` -> `ec` for the following functions:
  * check_funcall_respond_to
  * check_funcall_callable
  * check_funcall_missing
  * rb_method_call_status

* vm_method.c: ditto.
  * call_method_entry
  * basic_obj_respond_to_missing
  * basic_obj_respond_to
  * vm_respond_to

* vm_eval.c (stack_check): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60520 | ko1 | 2017-10-28 20:52:56 +0900 (Sat, 28 Oct 2017) | 6 lines

`th` -> `ec` for rb_vm_call()

* vm_eval.c (rb_vm_call): accepts `ec` instead of `th`.

* proc.c: catch up this fix.

------------------------------------------------------------------------
r60519 | ko1 | 2017-10-28 20:46:32 +0900 (Sat, 28 Oct 2017) | 4 lines

* proc.c (rb_block_arity): use `ec` directly.

* proc.c (rb_mod_define_method): ditto.

------------------------------------------------------------------------
r60518 | ko1 | 2017-10-28 20:43:17 +0900 (Sat, 28 Oct 2017) | 2 lines

* proc.c (proc_new): use `ec` directly.

------------------------------------------------------------------------
r60517 | ko1 | 2017-10-28 20:41:08 +0900 (Sat, 28 Oct 2017) | 10 lines

`th` -> `ec` for rb_longjmp() and related functions.

* eval.c: `th` -> `ec` for the following functions:
  * rb_longjmp
  * exc_setup_message
  * setup_exception
  * errinfo_place

* eval.c (get_thread_errinfo): rename to get_ec_errinfo() and accepts `ec`.

------------------------------------------------------------------------
r60516 | ko1 | 2017-10-28 20:22:15 +0900 (Sat, 28 Oct 2017) | 2 lines

use `ec` directly.

------------------------------------------------------------------------
r60515 | ko1 | 2017-10-28 20:20:17 +0900 (Sat, 28 Oct 2017) | 6 lines

check `ec` instead of `th`.

* error.c (rb_bug): check `ec` instead of `th`.

* error.c (rb_bug_context): ditto.

------------------------------------------------------------------------
r60514 | ko1 | 2017-10-28 20:15:56 +0900 (Sat, 28 Oct 2017) | 4 lines

`th` -> `ec` for rb_vm_make_binding().

* vm.c (rb_vm_make_binding): accepts (const) `ec` instead of `th`.

------------------------------------------------------------------------
r60513 | ko1 | 2017-10-28 20:11:17 +0900 (Sat, 28 Oct 2017) | 5 lines

rename a function.

* vm.c (rb_thread_method_id_and_class): rename to
  rb_ec_frame_method_id_and_class() and accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60512 | ko1 | 2017-10-28 20:04:08 +0900 (Sat, 28 Oct 2017) | 2 lines

* vm.c (vm_define_method): don't use `th` any more.

------------------------------------------------------------------------
r60511 | ko1 | 2017-10-28 20:02:16 +0900 (Sat, 28 Oct 2017) | 2 lines

* vm.c (REWIND_CFP): use `ec` directly.

------------------------------------------------------------------------
r60510 | ko1 | 2017-10-28 19:59:37 +0900 (Sat, 28 Oct 2017) | 4 lines

`th` -> `ec` for vm_iter_break().

* vm.c (vm_iter_break): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60509 | ko1 | 2017-10-28 19:55:35 +0900 (Sat, 28 Oct 2017) | 7 lines

`th` -> `ec` for some functions.

* vm.c: `th` -> `ec` for the following functions:
  * vm_normal_frame
  * vm_cfp_svar_get
  * vm_cfp_svar_set

------------------------------------------------------------------------
r60508 | ko1 | 2017-10-28 19:47:19 +0900 (Sat, 28 Oct 2017) | 6 lines

`th` -> `ec` for some functions.

* vm.c (rb_vm_get_binding_creatable_next_cfp): accepts `ec` instead of `th`.

* vm.c (rb_vm_stack_to_heap): ditto.

------------------------------------------------------------------------
r60507 | ko1 | 2017-10-28 19:43:30 +0900 (Sat, 28 Oct 2017) | 4 lines

`th` -> `ec` for rb_vm_rewind_cfp.

* vm.c (rb_vm_rewind_cfp): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60506 | ko1 | 2017-10-28 19:35:55 +0900 (Sat, 28 Oct 2017) | 4 lines

`th` -> `ec` for vm_exec().

* vm.c (vm_exec): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60505 | eregon | 2017-10-28 19:32:45 +0900 (Sat, 28 Oct 2017) | 1 line

Add specs for [Feature #13983] Rational and Complex should be frozen
------------------------------------------------------------------------
r60504 | ko1 | 2017-10-28 19:23:58 +0900 (Sat, 28 Oct 2017) | 8 lines

`th` -> `ec` for vm_set_*_stack.

* vm.c: `th` -> `ec` for the following functions:
  * vm_set_top_stack
  * vm_set_eval_stack
  * vm_set_main_stack
  * vm_cref_new_toplevel

------------------------------------------------------------------------
r60503 | ko1 | 2017-10-28 19:01:54 +0900 (Sat, 28 Oct 2017) | 7 lines

move fields from `th` to `ec`.

* vm_core.h: move rb_thread_t::passed_block_handler to
  rb_execution_context_t::passed_block_handler.
  Also move rb_thread_t::passed_bmethod_me to
  rb_execution_context_t::passed_bmethod_me.

------------------------------------------------------------------------
r60502 | ktsj | 2017-10-28 18:22:45 +0900 (Sat, 28 Oct 2017) | 1 line

iseq.c: fix a typo
------------------------------------------------------------------------
r60501 | ktsj | 2017-10-28 18:22:44 +0900 (Sat, 28 Oct 2017) | 1 line

iseq.c: show all call flags
------------------------------------------------------------------------
r60500 | a_matsuda | 2017-10-28 15:49:50 +0900 (Sat, 28 Oct 2017) | 13 lines

Fix example that trace method is called outside block

[ci skip]

`TracePoint` doesn't have the `line` method.
Therefore, this example will raise `NoMethodError`.
But since it does not seem to be the intended error, use the existing `lineno`
method instead.

Patch by: yuuji.yaginuma <yuuji.yaginuma@gmail.com>

https://github.com/ruby/ruby/pull/1731
[Fix GH-1731]
------------------------------------------------------------------------
r60499 | ko1 | 2017-10-28 14:36:48 +0900 (Sat, 28 Oct 2017) | 7 lines

skip machine stack marking for current ec.

* vm.c (rb_execution_context_mark): At the beggining of GC marking,
  mark_current_machine_context() marks running machine stack so that
  rb_execution_context_mark() should not mark machine stack if it is
  current ec.

------------------------------------------------------------------------
r60498 | a_matsuda | 2017-10-28 10:05:17 +0900 (Sat, 28 Oct 2017) | 7 lines

Invalid TracePoint#disable example (without block)

Patch by: Johan <djo.went@hotmail.com>

https://github.com/ruby/ruby/pull/1727
[Fix GH-1727]
[ci skip]
------------------------------------------------------------------------
r60497 | ko1 | 2017-10-28 09:45:43 +0900 (Sat, 28 Oct 2017) | 4 lines

fix compile error.

* compile.c (iseq_compile_each): fix declaration because VC shows compile error.

------------------------------------------------------------------------
r60496 | normal | 2017-10-28 08:26:48 +0900 (Sat, 28 Oct 2017) | 18 lines

socket: fix BasicSocket#*_nonblock buffering bugs from r58400

IO#read_nonblock and IO#write_nonblock take into account
buffered data, so the Linux-only BasicSocket#read_nonblock
and BasicSocket#write_nonblock methods must, too.

This bug was only introduced in r58400
("socket: avoid fcntl for read/write_nonblock on Linux")
and does not affect any stable release.

* ext/socket/basicsocket.c (rsock_init_basicsocket):
* ext/socket/init.c (rsock_s_recvfrom_nonblock):
* ext/socket/init.c (rsock_init_socket_init):
* ext/socket/lib/socket.rb (def read_nonblock):
* ext/socket/lib/socket.rb (def write_nonblock):
* ext/socket/rubysocket.h (static inline void rsock_maybe_wait_fd):
* test/socket/test_basicsocket.rb (def test_read_write_nonblock):
  [Feature #13362]
------------------------------------------------------------------------
r60495 | nobu | 2017-10-28 06:08:37 +0900 (Sat, 28 Oct 2017) | 1 line

node.c: removed duplicate node_buffer_t definition
------------------------------------------------------------------------
r60494 | nobu | 2017-10-28 06:08:35 +0900 (Sat, 28 Oct 2017) | 1 line

compile.c: make node arguments invariant
------------------------------------------------------------------------
r60493 | ko1 | 2017-10-28 04:16:51 +0900 (Sat, 28 Oct 2017) | 4 lines

catch up recent changes for call threaded code VM.

Fix compile errors for OPT_CALL_THREADED_CODE (in vm_opts.h).

------------------------------------------------------------------------
r60492 | ko1 | 2017-10-28 04:08:31 +0900 (Sat, 28 Oct 2017) | 8 lines

`th` -> `ec` for `rb_insn_func_t`.

* vm_core.h (rb_insn_func_t): accepts `ec` instead of `th`.

* vm_insnhelper.c (rb_vm_opt_struct_aref): ditto.

* vm_insnhelper.c (rb_vm_opt_struct_aset): ditto.

------------------------------------------------------------------------
r60491 | ko1 | 2017-10-28 03:55:28 +0900 (Sat, 28 Oct 2017) | 1 line

skip tests temporarily
------------------------------------------------------------------------
r60490 | normal | 2017-10-28 03:37:23 +0900 (Sat, 28 Oct 2017) | 10 lines

io.c: fix IO.copy_stream on O_APPEND destination on Linux

Linux copy_file_range(2) fails with EBADF if the destination FD
has O_APPEND set.  Preserve existing (Ruby <= 2.4) behavior by
falling back to alternative copy mechanisms if this is the case
(instead of raising Errno::EBADF).

* io.c (nogvl_copy_file_range): do not raise on O_APPEND dst
* test/ruby/test_io.rb (test_copy_stream_append): new test
  [Feature #13867]
------------------------------------------------------------------------
r60489 | mame | 2017-10-28 02:06:06 +0900 (Sat, 28 Oct 2017) | 1 line

parse.y: Need to mark the third element of `NODE_HEREDOC`
------------------------------------------------------------------------
r60488 | mame | 2017-10-28 01:44:57 +0900 (Sat, 28 Oct 2017) | 4 lines

Revert "Revert "Manage AST NODEs out of GC""

This re-introduces r60485.
This reverts commit 5a176b75b1187cbd3861c387bde65ff66396a07c.
------------------------------------------------------------------------
r60487 | mame | 2017-10-28 01:34:57 +0900 (Sat, 28 Oct 2017) | 3 lines

compile.c: stop modifying NODE tree

This fixes some modification remained in r60479
------------------------------------------------------------------------
r60486 | mame | 2017-10-28 01:02:34 +0900 (Sat, 28 Oct 2017) | 3 lines

Revert "Manage AST NODEs out of GC"

This reverts commit 620ba74778bfdbdc34ffbb142d49ce84a0ef58e9.
------------------------------------------------------------------------
r60485 | mame | 2017-10-28 00:59:02 +0900 (Sat, 28 Oct 2017) | 33 lines

Manage AST NODEs out of GC

NODEs in AST are no longer objects managed by GC.  This change will
remove the restriction imposed by the GC.  For example, a NODE can use
more than five words (this is my primary purpose; we want to store the
position data for each NODE, for coverage library), or even a NODE can
have variable length (some kinds of NODEs have unused fields).
To do this, however, we need more work, since Ripper still uses T_NODE
objects managed by the GC.

The life time of NODEs is more obvious than other kinds of objects; they
are created at parsing, and they become disused immediately after
compilation.  This change releases all NODEs by a few `xfree`s after
compilation, so performance will be improved a bit.  In extreme example,
`eval("x=1;" * 10000000)` runs much faster (40 sec. -> 7.8 sec. on my
machine).

The most important part of this change is `ast_t` struct, which has
three contents: (1) NODE buffer (malloc'ed memory), (2) a reference to
the root NODE, and (3) an array that contains objects that must be
marked during parsing (such as literal objects).  Some functions that
had received `NODE*` arguments, must now receive `ast_t*`.

* node.c, node.h: defines `ast_t` struct and related operations.
* gc.c, internal.h: defines `imemo_ast`.
* parse.y: makes `parser_params` struct have a reference to `ast_t`.
  Instead of `rb_node_newnode`, use `rb_ast_newnode` to create a NODE.
* iseq.c, load.c, ruby.c, template/prelude.c.tmpl: modifies some
  functions to handle `ast_t*` instead of `NODE*`.
* test/ruby/test_gc.rb: ad-hoc fix for a failed test.  The test assumes
  GC eden is increased at startup by NODE object creation.  However,
  this change now create no NODE object, so GC eden is not necessarily
  increased.
------------------------------------------------------------------------
r60484 | kazu | 2017-10-28 00:14:02 +0900 (Sat, 28 Oct 2017) | 1 line

Fix parameter name
------------------------------------------------------------------------
r60483 | kazu | 2017-10-28 00:13:59 +0900 (Sat, 28 Oct 2017) | 1 line

Remove duplicated include
------------------------------------------------------------------------
r60482 | svn | 2017-10-28 00:06:39 +0900 (Sat, 28 Oct 2017) | 1 line

* 2017-10-28
------------------------------------------------------------------------
r60481 | mame | 2017-10-28 00:06:38 +0900 (Sat, 28 Oct 2017) | 4 lines

Add explicit markers for literal objects generated in parse.y

This is just a preparation to manage AST NODEs out of GC.
Currently `add_mark_object` does nothing.
------------------------------------------------------------------------
r60480 | watson1978 | 2017-10-27 23:55:03 +0900 (Fri, 27 Oct 2017) | 24 lines

string.c: Improve String#prepend performance if only one argument is given

* string.c (rb_str_prepend_multi): Prepend the string without generating
    temporary String object if only one argument is given.
	This is very similar with https://github.com/ruby/ruby/pull/1634

	String#prepend -> 47.5 % up

    [Fix GH-1670] [ruby-core:82195] [Bug #13773]

* Before
      String#prepend      1.517M ({U+00B1} 1.8%) i/s -      7.614M in   5.019819s

* After
      String#prepend      2.236M ({U+00B1} 3.4%) i/s -     11.234M in   5.029716s

* Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "String#prepend" do |loop|
    loop.times { "!".prepend("hello") }
  end
end
------------------------------------------------------------------------
r60479 | nobu | 2017-10-27 21:00:38 +0900 (Fri, 27 Oct 2017) | 1 line

compile.c, iseq.c: consitfied NODE pointers
------------------------------------------------------------------------
r60478 | naruse | 2017-10-27 17:40:40 +0900 (Fri, 27 Oct 2017) | 5 lines

Revert "Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]"

This reverts commit r60341,r60342,r60344,r60345.
Breaking compabitility of the order of result breaks many tests.
To avoid such effort to fix tests, the order should be kept.
------------------------------------------------------------------------
r60477 | ko1 | 2017-10-27 15:21:50 +0900 (Fri, 27 Oct 2017) | 6 lines

vm_exec_core() accepts `ec` instead of `th`.

* vm_exec.c (vm_exec_core): accepts `ec` instead of `th`.

* vm_args.c (vm_caller_setup_arg_block): also accepts `ec`.

------------------------------------------------------------------------
r60476 | ko1 | 2017-10-27 15:06:31 +0900 (Fri, 27 Oct 2017) | 27 lines

`th` -> `ec` for block related functions.

* vm.c: the following functions accept `ec` instead of `th`.
  * invoke_block
  * invoke_bmethod
  * invoke_iseq_block_from_c
  * invoke_block_from_c_bh
  * check_block_handler
  * vm_yield_with_cref
  * vm_yield
  * vm_yield_with_block
  * vm_yield_force_blockarg
  * invoke_block_from_c_proc
  * vm_invoke_proc
  * vm_invoke_bmethod
  * rb_vm_invoke_proc

* vm_insnhelper.c: ditto.
  * vm_yield_with_cfunc
  * vm_yield_with_symbol
  * vm_callee_setup_block_arg
  * vm_yield_setup_args
  * vm_invoke_iseq_block
  * vm_invoke_symbol_block
  * vm_invoke_ifunc_block
  * vm_invoke_block

------------------------------------------------------------------------
r60475 | ko1 | 2017-10-27 15:01:21 +0900 (Fri, 27 Oct 2017) | 5 lines

should use `th`.

* signal.c (check_stack_overflow): ruby_stack_overflowed_p()
  should accept `th`.

------------------------------------------------------------------------
r60474 | ko1 | 2017-10-27 14:33:33 +0900 (Fri, 27 Oct 2017) | 6 lines

`ec` -> `th`

* vm_exec.h (VM_SP_CNT): accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_stack_consistency_error): ditto.

------------------------------------------------------------------------
r60473 | ko1 | 2017-10-27 14:30:05 +0900 (Fri, 27 Oct 2017) | 4 lines

vm_defined() accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_defined): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60472 | ko1 | 2017-10-27 14:27:25 +0900 (Fri, 27 Oct 2017) | 5 lines

remove duplicated definition.

* vm_insnhelper.c (vm_block_handler_to_proc): removed because it is same
  functionality of rb_vm_bh_to_procval(). Use rb_vm_bh_to_procval().

------------------------------------------------------------------------
r60471 | ko1 | 2017-10-27 14:22:24 +0900 (Fri, 27 Oct 2017) | 6 lines

vm_search_super_method() accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_search_super_method): accepts `ec` instead of `th`.
  Surprisingly, it doesn't use `th` (now `ec`) so this patch is for
  the future extension.

------------------------------------------------------------------------
r60470 | ko1 | 2017-10-27 14:18:58 +0900 (Fri, 27 Oct 2017) | 4 lines

vm_get_ev_const() accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_get_ev_const): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60469 | a_matsuda | 2017-10-27 12:55:09 +0900 (Fri, 27 Oct 2017) | 6 lines

Fix typo

Patch by: 284km <k.furuhashi10@gmail.com>

https://github.com/ruby/ruby/pull/1729
[Fix GH-1729]
------------------------------------------------------------------------
r60468 | ko1 | 2017-10-27 11:49:30 +0900 (Fri, 27 Oct 2017) | 44 lines

`vm_call_handler` and related functions accept `ec` instead of `th`.

* vm_core.h (vm_call_handler): fix to accept `ec` instead of `th`.

* vm_args.c: the following functions accept `ec` instead of `th`.
  * raise_argument_error
  * argument_arity_error
  * argument_kw_error
  * setup_parameters_complex

* vm_eval.c: ditto.
  * vm_call0
  * vm_call0_cfunc_with_frame
  * vm_call0_cfunc
  * vm_call0_body

* vm_insnhelper.c: ditto
  * vm_call_iseq_setup_tailcall_0start
  * vm_call_iseq_setup_normal_0start
  * vm_callee_setup_arg
  * vm_call_iseq_setup
  * vm_call_iseq_setup_2
  * vm_call_iseq_setup_normal
  * vm_call_iseq_setup_tailcall
  * vm_cfp_consistent_p
  * vm_call_cfunc_with_frame
  * vm_call_cfunc
  * vm_call_ivar
  * vm_call_attrset
  * vm_call_bmethod_body
  * vm_call_bmethod
  * vm_call_opt_send
  * vm_call_opt_call
  * vm_call_method_missing
  * vm_call_zsuper
  * current_method_entry
  * vm_call_method_each_type
  * vm_call_method_nome
  * vm_call_method
  * vm_call_general
  * vm_call_super_method

* tool/mk_call_iseq_optimized.rb: ditto.

------------------------------------------------------------------------
r60467 | ko1 | 2017-10-27 10:35:12 +0900 (Fri, 27 Oct 2017) | 4 lines

vm_throw* accept `ec` instead of `th`.

* vm_insnhelper.c (vm_throw*): accept `ec` instead of `th`.

------------------------------------------------------------------------
r60466 | ko1 | 2017-10-27 10:31:15 +0900 (Fri, 27 Oct 2017) | 12 lines

ec->th for vm_cref_push() and constify.

* vm_insnhelper.c (vm_cref_push): accepts `ec` instead of `th`.

* vm_insnhelper.c: consitfy the first parameter (ec):
  * lep_svar
  * lep_svar_write
  * lep_svar_get
  * lep_svar_set
  * vm_getspecial
  and added vm_cref_push.

------------------------------------------------------------------------
r60465 | ko1 | 2017-10-27 10:22:01 +0900 (Fri, 27 Oct 2017) | 9 lines

Some functions accept `ec` instead of `th`.

* vm_insnhelper.c: The following functions accept `ec` instead of `th`.
  * lep_svar
  * lep_svar_write
  * lep_svar_get
  * lep_svar_set
  * vm_getspecial

------------------------------------------------------------------------
r60464 | ko1 | 2017-10-27 10:13:35 +0900 (Fri, 27 Oct 2017) | 6 lines

refactoring (rb_|)threadptr_stack_overflow.

* vm_insnhelper.c (ec_stack_overflow): renamed from threadptr_stack_overflow
  and also rb_ec_stack_overflow is from rb_threadptr_stack_overflow
  because they accept `ec` instead of `th`.

------------------------------------------------------------------------
r60463 | ko1 | 2017-10-27 09:46:11 +0900 (Fri, 27 Oct 2017) | 6 lines

vm_get_ruby_level_caller_cfp() accepts `ec` instead of `th`.

* vm.c (vm_get_ruby_level_caller_cfp): accepts `ec` instead of `th`.

* vm.c (vm_collect_local_variables_in_heap): don't need `th` anymore.

------------------------------------------------------------------------
r60462 | ko1 | 2017-10-27 09:31:59 +0900 (Fri, 27 Oct 2017) | 4 lines

move decl.

* proc.c: move declaration of rb_vm_bh_to_procval() to vm_core.h.

------------------------------------------------------------------------
r60461 | mame | 2017-10-27 09:25:57 +0900 (Fri, 27 Oct 2017) | 3 lines

Restore the prototype declaration of rb_vm_bh_to_procval

Fixes r60460
------------------------------------------------------------------------
r60460 | ko1 | 2017-10-27 08:33:59 +0900 (Fri, 27 Oct 2017) | 4 lines

rb_vm_bh_to_procval() accepts `ec` instead of `th`.

* vm_insnhelper.c (rb_vm_bh_to_procval): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60459 | hsbt | 2017-10-27 08:02:18 +0900 (Fri, 27 Oct 2017) | 3 lines

Removed obsoleted gitignore for test dependency.

  Follow up r60458.
------------------------------------------------------------------------
r60458 | usa | 2017-10-27 02:16:30 +0900 (Fri, 27 Oct 2017) | 2 lines

Ignore .bundle

------------------------------------------------------------------------
r60457 | usa | 2017-10-27 02:14:16 +0900 (Fri, 27 Oct 2017) | 5 lines

Quote with double quotes for Windows

* common.mk (test-bundled-gems-prepare): single quote cannot quote shell meta
  characters on Windows.

------------------------------------------------------------------------
r60456 | svn | 2017-10-27 00:29:37 +0900 (Fri, 27 Oct 2017) | 1 line

* 2017-10-27
------------------------------------------------------------------------
r60455 | naruse | 2017-10-27 00:29:36 +0900 (Fri, 27 Oct 2017) | 1 line

Host header should add branckets to IPv6 address [Bug #12642]
------------------------------------------------------------------------
r60454 | ko1 | 2017-10-26 23:44:09 +0900 (Thu, 26 Oct 2017) | 2 lines

replace `GET_THREAD()->ec` to `GET_EC()`.

------------------------------------------------------------------------
r60453 | ko1 | 2017-10-26 23:38:22 +0900 (Thu, 26 Oct 2017) | 7 lines

make root fiber at switching.

* cont.c (fiber_switch): make sure the root fiber object is available
  before the first switching.

* test/ruby/test_fiber.rb: remove "skip".

------------------------------------------------------------------------
r60452 | ko1 | 2017-10-26 23:28:43 +0900 (Thu, 26 Oct 2017) | 1 line

skip test_fiber_transfer_segv because it cause error with previous commit
------------------------------------------------------------------------
r60451 | ko1 | 2017-10-26 23:21:31 +0900 (Thu, 26 Oct 2017) | 11 lines

fix freeing `th->ec` bugs.

* vm.c (thread_free): simply call rb_threadptr_root_fiber_release().

* cont.c (rb_threadptr_root_fiber_release): release th->ec (ec->fiber)
  iff root_fiber is NULL. If root_fiber is available, then ignore it
  and root fiber object will free th->ec too.

* cont.c (rb_threadptr_root_fiber_setup): do not set th->root_fiber.
  th->root_fiber will be set if a root fiber object is created.

------------------------------------------------------------------------
r60450 | ko1 | 2017-10-26 20:02:13 +0900 (Thu, 26 Oct 2017) | 13 lines

introduce EC_*_TAG() instead of TH_*_TAG()

* eval_intern.h:
  introduce EC_*_TAG() macros instead of TH_*_TAG() macros.
  * TH_PUSH_TAG() -> EC_PUSH_TAG()
  * TH_POP_TAG() -> EC_POP_TAG()
  * TH_TMPPOP_TAG() -> EC_TMPPOP_TAG()
  * TH_REPUSH_TAG() -> EC_REPUSH_TAG()
  * TH_EXEC_TAG() -> EC_EXEC_TAG()
  * TH_JUMP_TAG() -> EC_JUMP_TAG()

  rb_threadptr_tag_state() , rb_ec_tag_jump() also accept `ec` instead of `th`.

------------------------------------------------------------------------
r60449 | ko1 | 2017-10-26 19:57:16 +0900 (Thu, 26 Oct 2017) | 4 lines

backtrace_each() accepts `ec` instead of `th`.

* vm_backtrace.c (backtrace_each): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60448 | ko1 | 2017-10-26 19:55:24 +0900 (Thu, 26 Oct 2017) | 4 lines

vm_pop_frame() accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_pop_frame): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60447 | ko1 | 2017-10-26 19:53:42 +0900 (Thu, 26 Oct 2017) | 4 lines

vm_push_frame() accepts `ec` instead of `th`.

* vm_insnhelper.c (vm_push_frame): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60446 | ko1 | 2017-10-26 19:52:05 +0900 (Thu, 26 Oct 2017) | 4 lines

use GET_EC()

* vm.c (vm_ep_in_heap_p_): use GET_EC() instead of GET_THREAD().

------------------------------------------------------------------------
r60445 | ko1 | 2017-10-26 19:50:45 +0900 (Thu, 26 Oct 2017) | 4 lines

A function accepts `ec` instead of `th`.

* vm.c (VM_CFP_IN_HEAP_P): accepts `ec` instead of `th`.

------------------------------------------------------------------------
r60444 | ko1 | 2017-10-26 19:49:33 +0900 (Thu, 26 Oct 2017) | 4 lines

A function accepts `ec` instead of `th`.

* vm.c (rb_vm_search_cf_from_ep): accept `ec` instead of `th`.

------------------------------------------------------------------------
r60443 | mame | 2017-10-26 17:45:14 +0900 (Thu, 26 Oct 2017) | 3 lines

Expand the definition of rb_imemo_new in rb_imemo_alloc_new

per ko1's comment
------------------------------------------------------------------------
r60442 | ko1 | 2017-10-26 17:42:44 +0900 (Thu, 26 Oct 2017) | 1 line

fix comments
------------------------------------------------------------------------
r60441 | ko1 | 2017-10-26 17:41:34 +0900 (Thu, 26 Oct 2017) | 18 lines

some functions accept `ec` instead of `th`.

* vm.c (vm_make_env_object): accepts `ec`.

* vm.c (rb_vm_get_ruby_level_next_cfp): ditto.

* vm.c (rb_vm_make_proc): ditto.

* vm.c (rb_vm_make_proc_lambda): ditto.

* vm_core.h: some macros accept ec instead of th
  (and make them inline functions):
  * RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW
  * RUBY_VM_END_CONTROL_FRAME
  * RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P

* eval.c (frame_func_id): constify for the first parameter.

------------------------------------------------------------------------
r60440 | ko1 | 2017-10-26 17:32:49 +0900 (Thu, 26 Oct 2017) | 21 lines

Use rb_execution_context_t instead of rb_thread_t
to represent execution context [Feature #14038]

* vm_core.h (rb_thread_t): rb_thread_t::ec is now a pointer.
  There are many code using `th` to represent execution context
  (such as cfp, VM stack and so on). To access `ec`, they need to
  use `th->ec->...` (adding one indirection) so that we need to
  replace them by passing `ec` instead of `th`.

* vm_core.h (GET_EC()): introduced to access current ec. Also
  remove `ruby_current_thread` global variable.

* cont.c (rb_context_t): introduce rb_context_t::thread_ptr instead of
  rb_context_t::thread_value.

* cont.c (ec_set_vm_stack): added to update vm_stack explicitly.

* cont.c (ec_switch): added to switch ec explicitly.

* cont.c (rb_fiber_close): added to terminate fibers explicitly.

------------------------------------------------------------------------
r60439 | nobu | 2017-10-26 16:36:23 +0900 (Thu, 26 Oct 2017) | 4 lines

test_env.rb: fix one-off bug

* test/ruby/test_env.rb (TestEnv#test_win32_blocksize): count the
  terminator byte too.
------------------------------------------------------------------------
r60438 | nobu | 2017-10-26 16:23:23 +0900 (Thu, 26 Oct 2017) | 10 lines

common conversion functions

* array.c (rb_to_array_type): make public to share common code
  internally.

* hash.c (rb_to_hash_type): make public to share common code
  internally.

* symbol.c (rb_to_symbol_type): make public to share common code
  internally.
------------------------------------------------------------------------
r60437 | marcandre | 2017-10-26 15:58:09 +0900 (Thu, 26 Oct 2017) | 1 line

TracePoint#enable, #disable: Don't yield any argument. [Bug #14057]
------------------------------------------------------------------------
r60436 | nobu | 2017-10-26 10:36:52 +0900 (Thu, 26 Oct 2017) | 6 lines

common.mk: quote pipes on Windows

* common.mk (update-gems, update-bundled_gems): quote pipes by
  double qoutes instead of single quotes, to escape them on
  Windows.  wildcard characters `*?[{` still need to be quoted by
  single quotes to get rid of globbing.
------------------------------------------------------------------------
r60435 | nobu | 2017-10-26 09:59:15 +0900 (Thu, 26 Oct 2017) | 4 lines

common.mk: test-bundled-gem [ci skip]

* common.mk (test-bundled-gems): moved from Makefile.in so it
  might work on nmake too.
------------------------------------------------------------------------
r60434 | nobu | 2017-10-26 09:59:13 +0900 (Thu, 26 Oct 2017) | 4 lines

common.mk: test-bundler [ci skip]

* common.mk (test-bundler): moved from Makefile.in so it might
  work on nmake too.
------------------------------------------------------------------------
r60433 | kazu | 2017-10-26 08:45:33 +0900 (Thu, 26 Oct 2017) | 1 line

test/ostruct: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r60432 | svn | 2017-10-26 08:35:47 +0900 (Thu, 26 Oct 2017) | 1 line

* 2017-10-26
------------------------------------------------------------------------
r60431 | nobu | 2017-10-26 08:35:46 +0900 (Thu, 26 Oct 2017) | 4 lines

test-bundled-gems-fetch

* tool/fetch-bundled_gems.rb: get rid of tool/git-refresh which
  requries Bourne shell.
------------------------------------------------------------------------
r60430 | nobu | 2017-10-25 23:25:39 +0900 (Wed, 25 Oct 2017) | 1 line

common.mk: remove old gems at update-gems
------------------------------------------------------------------------
r60429 | mame | 2017-10-25 22:38:53 +0900 (Wed, 25 Oct 2017) | 1 line

Refactoring by adding `rb_imemo_alloc_new` to create imemo_alloc buffer
------------------------------------------------------------------------
r60428 | usa | 2017-10-25 22:29:27 +0900 (Wed, 25 Oct 2017) | 8 lines

Get rid of a test error on Windows caused by r60417

* test/testunit/test_parallel.rb (teardown): this code seems to allow
  `Errno::EPIPE` from @worker_in.  in such case, `close` may also raise the same
  exception.
  I'm not confident in this conclusion and still doubt that we should revert
  r60417 instead of this commit or not.

------------------------------------------------------------------------
r60427 | mame | 2017-10-25 22:19:45 +0900 (Wed, 25 Oct 2017) | 6 lines

Make imemo_alloc writebarrier-unprotected

imemo_alloc provides a memory buffer whose contents are marked by GC.
C code can access imemo_alloc buffer freely, so imemo_alloc must be
considered writebarrier-unprotected.  But T_IMEMO is writebarrier-
protected by default, which caused a GC bug.
------------------------------------------------------------------------
r60426 | kazu | 2017-10-25 21:57:34 +0900 (Wed, 25 Oct 2017) | 3 lines

Fix `shadowing outer local variable` warning [ci skip]

ref https://github.com/rurema/doctree/pull/697
------------------------------------------------------------------------
r60425 | nobu | 2017-10-25 21:33:42 +0900 (Wed, 25 Oct 2017) | 1 line

io.c: let rb_p use writev
------------------------------------------------------------------------
r60424 | nobu | 2017-10-25 21:31:30 +0900 (Wed, 25 Oct 2017) | 4 lines

test_io.rb: skip writev test

* test/ruby/test_io.rb (TestIO#test_puts_parallel): skip a test
  needs writev which is not portable.  [Feature #14042]
------------------------------------------------------------------------
r60423 | nobu | 2017-10-25 21:04:53 +0900 (Wed, 25 Oct 2017) | 4 lines

io.c: warn old write

* io.c (rb_io_puts): warn if write method accepts just one
  argument.  [ruby-core:83529] [Feature #14042]
------------------------------------------------------------------------
r60422 | hsbt | 2017-10-25 18:24:37 +0900 (Wed, 25 Oct 2017) | 3 lines

Regenerate slack token on Travis CI.

  The previous token did not work on our slack team.
------------------------------------------------------------------------
r60421 | nobu | 2017-10-25 17:37:17 +0900 (Wed, 25 Oct 2017) | 4 lines

win32.c: unknown reparse tags

* win32/win32.c (rb_w32_read_reparse_point): skip unknown reparse
  tags.  [ruby-core:83539] [Bug #14047]
------------------------------------------------------------------------
r60420 | nobu | 2017-10-25 16:28:22 +0900 (Wed, 25 Oct 2017) | 4 lines

securerandom.rb: fix an example of choose [ci skip]

* lib/securerandom.rb (Random::Formatter#choose): [DOC] fix an
  example, `n` is not optional.
------------------------------------------------------------------------
r60419 | hsbt | 2017-10-25 16:03:11 +0900 (Wed, 25 Oct 2017) | 1 line

Update power_assert-1.1.1. It support `test-bundled-gems`.
------------------------------------------------------------------------
r60418 | hsbt | 2017-10-25 15:58:24 +0900 (Wed, 25 Oct 2017) | 3 lines

Fixed conflicted variables. v is already used another condition.

  [Misc #14050][ruby-core:83553]
------------------------------------------------------------------------
r60417 | nobu | 2017-10-25 14:44:38 +0900 (Wed, 25 Oct 2017) | 5 lines

io.c: write a newline together

* io.c (rb_io_puts): write a newline together at once for each
  argument.  based on the patch by rohitpaulk (Rohit Kuruvilla) at
  [ruby-core:83508].  [Feature #14042]
------------------------------------------------------------------------
r60416 | nobu | 2017-10-25 14:23:54 +0900 (Wed, 25 Oct 2017) | 6 lines

range.c: use rb_check_funcall

* range.c (rb_range_values): use rb_check_funcall instead of
  calling rb_respond_to then rb_funcall, and allow `begin` and
  `end` to be private as well as other internal conversions.
  [ruby-core:83541] [Bug #14048]
------------------------------------------------------------------------
r60415 | hsbt | 2017-10-25 14:04:24 +0900 (Wed, 25 Oct 2017) | 1 line

Added development dependency for power_assert.
------------------------------------------------------------------------
r60414 | hsbt | 2017-10-25 12:38:02 +0900 (Wed, 25 Oct 2017) | 3 lines

Update rake-12.2.1 for bundled gems.

  rake-12.2.0 broke Capistrano 3 task. 12.2.1 fixed this regression.
------------------------------------------------------------------------
r60413 | nobu | 2017-10-25 11:41:47 +0900 (Wed, 25 Oct 2017) | 5 lines

Fix Mock.verify_call to mock_respond_to?

* spec/mspec/lib/mspec/mocks/mock.rb (Mock.verify_call): should
  pass arguments to as given, not packed in an array.
  mock_respond_to? expects 2 or 3 arguments.
------------------------------------------------------------------------
r60412 | nobu | 2017-10-25 10:45:28 +0900 (Wed, 25 Oct 2017) | 4 lines

compile.c: refine error messages

* compile.c (rb_iseq_compile_node): raise compile error with exact
  iseq type name.
------------------------------------------------------------------------
r60411 | nobu | 2017-10-25 10:40:15 +0900 (Wed, 25 Oct 2017) | 6 lines

range.c: check if exclude_end? is defined

* range.c (rb_range_values): should raise TypeError if necessary
  method is not defined, not NoMethodError, when trying to tell if
  the object is a Range and extract info.
  [ruby-core:83541] [Bug #14048]
------------------------------------------------------------------------
r60410 | hsbt | 2017-10-25 10:13:35 +0900 (Wed, 25 Oct 2017) | 4 lines

Update latest bundled_gems.

  * rake-12.2.0
  * test-unit-3.2.6
------------------------------------------------------------------------
r60409 | nobu | 2017-10-25 09:33:29 +0900 (Wed, 25 Oct 2017) | 4 lines

debug.c: RSymbol info

* debug.c (ruby_dummy_gdb_enums): force to include struct RSymbol
  info.
------------------------------------------------------------------------
r60408 | normal | 2017-10-25 08:35:52 +0900 (Wed, 25 Oct 2017) | 6 lines

file.c: fix possible alignment bugs in r60386

* file.c (struct apply_filename): split out from struct apply_arg
* file.c (apply2files): use offsetof for flex array size calculation
* file.c (apply2files): avoid redundant marking with ALLOCV
  [ruby-core:83535]
------------------------------------------------------------------------
r60407 | nobu | 2017-10-25 08:19:57 +0900 (Wed, 25 Oct 2017) | 5 lines

debug.c: imemo_mask

* .gdbinit (rp, rp_imemo, rb_ps_thread): update imemo_mask.

* debug.c (ruby_dummy_gdb_enums): include imemo_types.
------------------------------------------------------------------------
r60406 | marcandre | 2017-10-25 03:08:15 +0900 (Wed, 25 Oct 2017) | 3 lines

lib/ostruct.rb: Use frozen literals.

Patch adapted from Espartaco Palma. [GH-1714] [Bug #14000]
------------------------------------------------------------------------
r60405 | svn | 2017-10-25 03:08:01 +0900 (Wed, 25 Oct 2017) | 1 line

* 2017-10-25
------------------------------------------------------------------------
r60404 | marcandre | 2017-10-25 03:08:00 +0900 (Wed, 25 Oct 2017) | 1 line

lib/weakref: Remove incorrect example [DOC] [Bug #14031]
------------------------------------------------------------------------
r60403 | ko1 | 2017-10-24 22:59:59 +0900 (Tue, 24 Oct 2017) | 1 line

add NEWS entry about [Feature #14045]
------------------------------------------------------------------------
r60402 | nobu | 2017-10-24 22:48:08 +0900 (Tue, 24 Oct 2017) | 10 lines

sysconfdir on Windows

* ext/etc/etc.c (etc_sysconfdir): mentioned special case on
  Windows.  [ruby-core:43110] [Bug #6121]

* ext/etc/extconf.rb: define SYSCONFDIR only if sysconfdir is set
  in RbConfig::CONFIG and not empty.

* win32/Makefile.sub (config.status): sysconfdir is not used on
  Windows.
------------------------------------------------------------------------
r60401 | kazu | 2017-10-24 21:10:32 +0900 (Tue, 24 Oct 2017) | 5 lines

Update call-seq of ARGF.read_nonblock

ARGF.read_nonblock supports `exception: false' like IO#read_nonblock
since 2.3.0.
[Feature #11358]
------------------------------------------------------------------------
r60400 | nobu | 2017-10-24 20:24:19 +0900 (Tue, 24 Oct 2017) | 1 line

Test for r60396
------------------------------------------------------------------------
r60399 | naruse | 2017-10-24 20:15:20 +0900 (Tue, 24 Oct 2017) | 5 lines

Revert "sysconfdir on Windows"

This reverts commit r60279.
This breaks mswin build:
https://ci.appveyor.com/project/ruby/ruby/build/1.0.5571
------------------------------------------------------------------------
r60398 | svn | 2017-10-24 20:13:50 +0900 (Tue, 24 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60397 | ko1 | 2017-10-24 20:13:49 +0900 (Tue, 24 Oct 2017) | 32 lines

Lazy Proc allocation for block parameters
[Feature #14045]

* insns.def (getblockparam, setblockparam): add special access
  instructions for block parameters.
  getblockparam checks VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM and
  if it is not set this instruction creates a Proc object from
  a given blcok and set VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM.
  setblockparam is similar to setlocal, but set
  VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM.

* compile.c: use get/setblockparm instead get/setlocal instructions.
  Note that they are used for method local block parameters (def m(&b)),
  not for block local method parameters (iter{|&b|).

* proc.c (get_local_variable_ptr): creates Proc object for
  Binding#local_variable_get/set.

* safe.c (safe_setter): we need to create Proc objects for postponed
  block parameters when $SAFE is changed.

* vm_args.c (args_setup_block_parameter): used only for block local blcok
  parameters.

* vm_args.c (vm_caller_setup_arg_block): if called with
  VM_CALL_ARGS_BLOCKARG_BLOCKPARAM flag then passed block values should be
  a block handler.

* test/ruby/test_optimization.rb: add tests.

* benchmark/bm_vm1_blockparam*: added.

------------------------------------------------------------------------
r60396 | nobu | 2017-10-24 20:09:41 +0900 (Tue, 24 Oct 2017) | 4 lines

ruby.c: fix r60393

* ruby.c (load_file_internal): set loop options after parsing
  shebang line.
------------------------------------------------------------------------
r60395 | nobu | 2017-10-24 17:13:13 +0900 (Tue, 24 Oct 2017) | 4 lines

vm_eval.c: all value type cases

* vm_eval.c (rb_type_str): ensure all value types are covered.
  missed types would be warned by -Wswitch option of gcc.
------------------------------------------------------------------------
r60394 | nobu | 2017-10-24 17:00:36 +0900 (Tue, 24 Oct 2017) | 6 lines

Removed NODE_OPT_N

* node.h (NODE_OPT_N): removed.

* parse.y (parser_append_options): expand -n option loop to while
  gets loop.
------------------------------------------------------------------------
r60393 | nobu | 2017-10-24 16:41:48 +0900 (Tue, 24 Oct 2017) | 7 lines

parse.y: rb_parser_set_options

* parse.y (yycompile0): append top-level addenda before appending
  prelude nodes.

* parse.y (rb_parser_set_options): set top-level addendum options
  before parsing.
------------------------------------------------------------------------
r60392 | nobu | 2017-10-24 16:17:36 +0900 (Tue, 24 Oct 2017) | 5 lines

vm_eval.c: uncallable_object

* vm_eval.c (uncallable_object): extract error case as a no-return
  function.  split successive ?-marks not to get confused with a
  trigraph.
------------------------------------------------------------------------
r60391 | mame | 2017-10-24 15:27:58 +0900 (Tue, 24 Oct 2017) | 5 lines

Avoid many type casts

The idiom `rb_gc_force_recycle((VALUE)...)` was used heavily.
This change defines `rb_discard_nod(NODE*)` and allows C compiler to
typecheck.
------------------------------------------------------------------------
r60390 | mame | 2017-10-24 15:16:31 +0900 (Tue, 24 Oct 2017) | 5 lines

Remove dynamic NODE allocation out of parser

A temporary NODE object was allocated to create iseq.  Instead, this
patch allocates a dummy NODE as auto variable, and discard it soon.
This change is intended as a preparation to manage AST NODEs out of GC.
------------------------------------------------------------------------
r60389 | mame | 2017-10-24 14:54:30 +0900 (Tue, 24 Oct 2017) | 5 lines

Remove special handling for (NODE*)1

The magic number was used to mark NODE_ATTRASGN when its receiver is
self.  But the hack was refactored at r46366.  So the remaining code
fragments are no longer needed.
------------------------------------------------------------------------
r60388 | normal | 2017-10-24 10:22:08 +0900 (Tue, 24 Oct 2017) | 16 lines

net/http: use require_relative to reduce syscalls

require_relative speeds up loading of files by reducing path
lookups.  On a clean install with RubyGems-enabled,
"ruby -rnet/http -e exit" shows a reduction in failed open(2)
syscalls from 410 to 350 (x86-64 GNU/Linux).

I could not measure a time difference on my Linux-based
machines, however this should be noticeable to users of other
kernels with worse syscall and VFS performance than Linux.

Further use of require_relative will reduce lookups in other
places.

* lib/net/http.rb: use require_relative
  [ruby-core:78285] [Feature #12973]
------------------------------------------------------------------------
r60387 | svn | 2017-10-24 10:20:05 +0900 (Tue, 24 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60386 | normal | 2017-10-24 10:20:04 +0900 (Tue, 24 Oct 2017) | 35 lines

file.c: apply2files releases GVL

This means File.chmod, File.lchmod, File.chown, File.lchown,
File.unlink, and File.utime operations on slow filesystems
no longer hold up other threads.

The platform-specific utime_failed changes is compile-tested
using a new UTIME_EINVAL macro

This hurts performance on fast filesystem, but these methods
are unlikely to be performance bottlenecks and (IMHO) avoiding
pathological slowdowns and stalls are more important.

benchmark results:
minimum results in each 3 measurements.
Execution time (sec)
name	trunk	built
file_chmod	0.591	0.801

Speedup ratio: compare with the result of `trunk' (greater is better)
name	built
file_chmod	0.737

* file.c (UTIME_EINVAL): new macro to ease compile-testing
* file.c (struct apply_arg): new struct
* file.c (no_gvl_apply2files): new function
* file.c (apply2files): release GVL
* file.c (chmod_internal): adjust for apply2files changes
* file.c (lchmod_internal): ditto
* file.c (chown_internal): ditto
* file.c (lchown_internal): ditto
* file.c (utime_failed): ditto
* file.c (utime_internal): ditto
* file.c (unlink_internal): ditto
  [ruby-core:83200] [Feature #13996]
------------------------------------------------------------------------
r60385 | svn | 2017-10-24 06:50:10 +0900 (Tue, 24 Oct 2017) | 1 line

* 2017-10-24
------------------------------------------------------------------------
r60384 | normal | 2017-10-24 06:50:08 +0900 (Tue, 24 Oct 2017) | 10 lines

thread_pthread: do not corrupt stack

This fixes stuck test/ruby/test_io.rb with FIBER_USE_NATIVE=0 on
GNU/Linux because linked-list pointers used by glibc get
corrupted when fiber stacks are copied.

Thanks to wanabe for finding the bug and original patch.

* thread_pthread (native_thread_init_stack): fix stack corruption
  [ruby-core:82737] [Bug #13387]
------------------------------------------------------------------------
r60383 | nobu | 2017-10-23 23:05:07 +0900 (Mon, 23 Oct 2017) | 4 lines

multiple arguments to write

Make write methods of IO-like objects accept multiple arguments,
as well as IO#write.
------------------------------------------------------------------------
r60382 | yui-knk | 2017-10-23 22:25:59 +0900 (Mon, 23 Oct 2017) | 4 lines

Add test cases for branch coverage

* test/coverage/test_coverage.rb (test_branch_coverage_for_while_statement):
  Add test cases for modifier while/until.
------------------------------------------------------------------------
r60381 | kazu | 2017-10-23 21:59:05 +0900 (Mon, 23 Oct 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r60380 | naruse | 2017-10-23 17:28:05 +0900 (Mon, 23 Oct 2017) | 4 lines

OpenSSL may show the different error message

https://github.com/ruby/ruby/commit/d02211c9da608742b09aec768db79442007eabc0#commitcomment-25119729
From: MSP-Greg <MSP-Greg@users.noreply.github.com>
------------------------------------------------------------------------
r60379 | nobu | 2017-10-23 16:06:12 +0900 (Mon, 23 Oct 2017) | 3 lines

zlib.c: multiple arguments to write

* ext/zlib/zlib.c (rb_gzwriter_write): accepts multiple arguments.
------------------------------------------------------------------------
r60378 | nobu | 2017-10-23 15:42:37 +0900 (Mon, 23 Oct 2017) | 4 lines

error.c: warning to write multiple arguments

* error.c (warning_write): accepts multiple arguments to merge
  multiple warning messages.
------------------------------------------------------------------------
r60377 | nobu | 2017-10-23 15:25:39 +0900 (Mon, 23 Oct 2017) | 4 lines

stringio.c: write multiple arguments

* ext/stringio/stringio.c (strio_write_m): make StringIO#write
  accept multiple arguments, as well as IO#write.
------------------------------------------------------------------------
r60376 | nobu | 2017-10-23 15:05:46 +0900 (Mon, 23 Oct 2017) | 1 line

NEWS: add [Feature #9323] [ci skip]
------------------------------------------------------------------------
r60375 | hsbt | 2017-10-23 14:58:59 +0900 (Mon, 23 Oct 2017) | 1 line

Removed empty dir.
------------------------------------------------------------------------
r60374 | hsbt | 2017-10-23 14:56:25 +0900 (Mon, 23 Oct 2017) | 8 lines

Drop to support NaCl platform.

  Because NaCl and PNaCl are already sunset status.
  see https://bugs.chromium.org/p/chromium/issues/detail?id=239656#c160

  configure.ac: Patch for this file was provided by @nobu.

  [Feature #14041][ruby-core:83497][fix GH-1726]
------------------------------------------------------------------------
r60373 | nobu | 2017-10-23 14:28:12 +0900 (Mon, 23 Oct 2017) | 4 lines

io.c: fix infinite retry

* io.c (io_binwritev): fix infinite retry when flushing buffered
  data.  [Feature #9323]
------------------------------------------------------------------------
r60372 | nobu | 2017-10-23 14:09:35 +0900 (Mon, 23 Oct 2017) | 4 lines

io.c: fix buffered output

* io.c (io_binwritev): append to buffered data, not overwriting.
  [Feature #9323]
------------------------------------------------------------------------
r60371 | nobu | 2017-10-23 14:09:34 +0900 (Mon, 23 Oct 2017) | 3 lines

io.c: fix total

* io.c (io_writev): total may be a bignum.  [Feature #9323]
------------------------------------------------------------------------
r60370 | nobu | 2017-10-23 11:25:58 +0900 (Mon, 23 Oct 2017) | 4 lines

io.c: no restriction

* io.c (io_write_m): remove argc restriction upto IOV_MAX-1.
  [Feature #9323]
------------------------------------------------------------------------
r60369 | sonots | 2017-10-23 01:57:16 +0900 (Mon, 23 Oct 2017) | 1 line

common.mk: add install-capi to make help
------------------------------------------------------------------------
r60368 | svn | 2017-10-23 01:03:58 +0900 (Mon, 23 Oct 2017) | 1 line

* 2017-10-23
------------------------------------------------------------------------
r60367 | kou | 2017-10-23 01:03:57 +0900 (Mon, 23 Oct 2017) | 27 lines

rss itunes: fix a bug that <itunes:explicit> value isn't fully supported

Fix GH-1725

<itunes:explicit> accepts "explicit", "yes", "true", "clean", "no" and
"false" as valid values.

Here is the <itunes:explicit>'s description in
https://help.apple.com/itc/podcasts_connect/#/itcb54353390:

> The <itunes:explicit> tag indicates whether your podcast contains
> explicit material. You can specify the following values:
>
>   * Yes | Explicit | True. If you specify yes, explicit, or true,
>     indicating the presence of explicit content, the iTunes Store
>     displays an Explicit parental advisory graphic for your podcast.
>
>   * Clean | No | False. If you specify clean, no, or false, indicating
>     that none of your podcast episodes contain explicit language or
>     adult content, the iTunes Store displays a Clean parental
>     advisory graphic for your podcast.

I don't know whether <itunes:explicit> value is case sensitive or
insensitive. But the current implementation is case insensitive.

Reported by Valerie Woolard Srinivasan. Thanks!!!

------------------------------------------------------------------------
r60366 | yui-knk | 2017-10-22 23:13:50 +0900 (Sun, 22 Oct 2017) | 4 lines

Add test cases for branch coverage

* test/coverage/test_coverage.rb (test_branch_coverage_for_if_statement):
  Add a test case for ternary operator.
------------------------------------------------------------------------
r60365 | yui-knk | 2017-10-22 22:58:55 +0900 (Sun, 22 Oct 2017) | 4 lines

Add test cases for branch coverage

* test/coverage/test_coverage.rb (test_branch_coverage_for_if_statement):
  Add test cases for modifier if/unless.
------------------------------------------------------------------------
r60364 | yui-knk | 2017-10-22 22:49:41 +0900 (Sun, 22 Oct 2017) | 4 lines

Add test cases for branch coverage

* test/coverage/test_coverage.rb (test_branch_coverage_for_if_statement):
  Add test cases for if/unless without else clauses.
------------------------------------------------------------------------
r60363 | yui-knk | 2017-10-22 22:34:24 +0900 (Sun, 22 Oct 2017) | 1 line

test/coverage/test_coverage.rb: Use `<<~` to ease to calculate column of target codes
------------------------------------------------------------------------
r60362 | yui-knk | 2017-10-22 22:18:40 +0900 (Sun, 22 Oct 2017) | 12 lines

Add column numbers to branch coverage

* compile.c (DECL_BRANCH_BASE, ADD_TRACE_BRANCH_COVERAGE): Add
  column to arguments.

* compile.c (compile_if, compile_case, compile_when, compile_loop, iseq_compile_each0):
  Pass column numbers to macros.

* ext/coverage/coverage.c (branch_coverage): Add column numbers to
  a return value.

* test/coverage/test_coverage.rb: Follow-up these changes.
------------------------------------------------------------------------
r60361 | knu | 2017-10-22 21:26:21 +0900 (Sun, 22 Oct 2017) | 1 line

Mention `Set#reset`
------------------------------------------------------------------------
r60360 | knu | 2017-10-22 21:25:34 +0900 (Sun, 22 Oct 2017) | 4 lines

Add `Set#reset`

This method resets the internal state of a set after modification to
existing elements, reindexing and deduplicating them. [Feature #6589]
------------------------------------------------------------------------
r60359 | hsbt | 2017-10-22 20:27:06 +0900 (Sun, 22 Oct 2017) | 3 lines

Fixed misspelling words.

  These are detected by https://github.com/client9/misspell
------------------------------------------------------------------------
r60358 | kazu | 2017-10-22 18:16:54 +0900 (Sun, 22 Oct 2017) | 1 line

Use `\A` and `\z` instead of `^` and `$`
------------------------------------------------------------------------
r60357 | kazu | 2017-10-22 18:16:51 +0900 (Sun, 22 Oct 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r60356 | rhe | 2017-10-22 16:18:55 +0900 (Sun, 22 Oct 2017) | 3 lines

gdbm, dbm, sdbm: remove unnecessary conditions

The dfree and dsize callback functions are never called with NULL.
------------------------------------------------------------------------
r60355 | rhe | 2017-10-22 16:18:54 +0900 (Sun, 22 Oct 2017) | 5 lines

gdbm, dbm, sdbm: prevent memory leak in #initialize

Have the allocator function allocate struct dbmdata too. #initialize
should not call ALLOC() after opening a file since it can fail with
NoMemoryError, leaking the opened file.
------------------------------------------------------------------------
r60354 | yui-knk | 2017-10-22 16:04:00 +0900 (Sun, 22 Oct 2017) | 6 lines

Fix a target method of a test

* test/ruby/test_string.rb (test_delete): I guess
  this line should be a test case which asserts
  coderange is handled correctly when a result of
  String#delete has non-ASCII characters.
------------------------------------------------------------------------
r60353 | kazu | 2017-10-22 16:01:57 +0900 (Sun, 22 Oct 2017) | 5 lines

Update doc of Hash#slice [ci skip]

- Add arguments to call-seq
- Add sample of multiple keys
- Add sample: hash does not contain key
------------------------------------------------------------------------
r60352 | kazu | 2017-10-22 15:30:47 +0900 (Sun, 22 Oct 2017) | 1 line

Fix indent and comment [ci skip]
------------------------------------------------------------------------
r60351 | nobu | 2017-10-22 15:22:50 +0900 (Sun, 22 Oct 2017) | 4 lines

io.c: fix local variables

* io.c (io_writev): fix local variable declarations, when
  writev(2) is not available.  [Feature #9323]
------------------------------------------------------------------------
r60350 | yui-knk | 2017-10-22 15:11:01 +0900 (Sun, 22 Oct 2017) | 1 line

parse.y (new_scope_gen): adjust indent
------------------------------------------------------------------------
r60349 | nobu | 2017-10-22 15:01:07 +0900 (Sun, 22 Oct 2017) | 4 lines

Add missing `buf` parameter to `recv_nonblock` doc [ci skip]

[Fix GH-1725]
From: yuuji.yaginuma <yuuji.yaginuma@gmail.com>
------------------------------------------------------------------------
r60348 | nobu | 2017-10-22 14:36:49 +0900 (Sun, 22 Oct 2017) | 4 lines

objspace.c: missing types

* ext/objspace/objspace.c (count_nodes): added recently added node
  types that were missing.
------------------------------------------------------------------------
r60347 | nobu | 2017-10-22 14:13:57 +0900 (Sun, 22 Oct 2017) | 4 lines

remove NODE_DREGX_ONCE

* node.h (enum node_type): remove NODE_DREGX_ONCE which is not
  used anymore.
------------------------------------------------------------------------
r60346 | rhe | 2017-10-22 13:19:03 +0900 (Sun, 22 Oct 2017) | 3 lines

doc/syntax/methods.rdoc: fix a misleading example

As a bonus, wrap a long line added by r60295.
------------------------------------------------------------------------
r60345 | nobu | 2017-10-22 13:06:23 +0900 (Sun, 22 Oct 2017) | 1 line

dir.c: adjust indent [ci skip]
------------------------------------------------------------------------
r60344 | naruse | 2017-10-22 11:19:52 +0900 (Sun, 22 Oct 2017) | 1 line

sort test result
------------------------------------------------------------------------
r60343 | glass | 2017-10-22 11:11:07 +0900 (Sun, 22 Oct 2017) | 4 lines

Make IO#write accept multiple arguments

io.c: make IO#write accept multiple arguments.
it uses writev(2) if possible.
------------------------------------------------------------------------
r60342 | naruse | 2017-10-22 11:08:46 +0900 (Sun, 22 Oct 2017) | 1 line

sort the test result
------------------------------------------------------------------------
r60341 | naruse | 2017-10-22 11:03:49 +0900 (Sun, 22 Oct 2017) | 3 lines

Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]

The order of resulted array is changed in some cases.
------------------------------------------------------------------------
r60340 | nobu | 2017-10-22 10:46:43 +0900 (Sun, 22 Oct 2017) | 5 lines

compile.c: optimize local variable assignments

* compile.c (iseq_peephole_optimize): eliminate simple self
  assignments of a local variable when the result is used.
  follow-up of r60322.
------------------------------------------------------------------------
r60339 | nobu | 2017-10-22 10:37:36 +0900 (Sun, 22 Oct 2017) | 4 lines

parse.y: workaround for warnings

* parse.y (mark_lvar_used): enable workaround to suppress unused
  local variables.  [ruby-core:82656] [Bug #13872]
------------------------------------------------------------------------
r60338 | nobu | 2017-10-22 10:13:57 +0900 (Sun, 22 Oct 2017) | 3 lines

fix up r60224

* parse.y (match_op_gen): fix optimization at DREGX_ONCE.
------------------------------------------------------------------------
r60337 | glass | 2017-10-22 09:57:46 +0900 (Sun, 22 Oct 2017) | 4 lines

hash.c: optimize Hash#compare_by_identity

hash.c (rb_hash_compare_by_id): avoid unnecessary allocation of st_table.
formerly, st_table created in rb_hash_modify() was not used and replaced immediately.
------------------------------------------------------------------------
r60336 | yui-knk | 2017-10-22 09:45:05 +0900 (Sun, 22 Oct 2017) | 6 lines

Remove not used node_type NODE_BMETHOD

* ext/objspace/objspace.c (count_nodes): This node_type has
  not been used since r24128.
* node.c (dump_node): ditto
* node.h (node_type, NEW_BMETHOD): ditto
------------------------------------------------------------------------
r60335 | glass | 2017-10-22 09:38:05 +0900 (Sun, 22 Oct 2017) | 3 lines

Add arity check into Hash#flatten

* hash.c (rb_hash_flatten): add arity check
------------------------------------------------------------------------
r60334 | yui-knk | 2017-10-22 09:29:40 +0900 (Sun, 22 Oct 2017) | 6 lines

Remove not used node_type NODE_BLOCK_ARG

* ext/objspace/objspace.c (count_nodes): This node_type has
  not been used since r11840.
* node.c (dump_node, rb_gc_mark_node): ditto
* node.h (node_type, NEW_BLOCK_ARG): ditto
------------------------------------------------------------------------
r60333 | nobu | 2017-10-22 09:19:12 +0900 (Sun, 22 Oct 2017) | 4 lines

vm_insnhelper.c: array aref optimization

* vm_insnhelper.c (vm_opt_aref): optimize on other than fixnum
  argument too.
------------------------------------------------------------------------
r60332 | yui-knk | 2017-10-22 09:17:39 +0900 (Sun, 22 Oct 2017) | 6 lines

Remove not used node_type NODE_TO_ARY

* ext/objspace/objspace.c (count_nodes): This node_type has
  not been used since r13236.
* node.c (dump_node, rb_gc_mark_node): ditto
* node.h (node_type, NEW_TO_ARY): ditto
------------------------------------------------------------------------
r60331 | nobu | 2017-10-22 09:00:41 +0900 (Sun, 22 Oct 2017) | 1 line

string.c: comment layout [ci skip]
------------------------------------------------------------------------
r60330 | suke | 2017-10-22 08:57:10 +0900 (Sun, 22 Oct 2017) | 3 lines

ext/win32ole/win32ole.c (fole_missing): set receiver in NoMethodError.
test/win32ole/test_win32ole.rb: ditto.

------------------------------------------------------------------------
r60329 | svn | 2017-10-22 08:49:36 +0900 (Sun, 22 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60328 | sonots | 2017-10-22 08:49:35 +0900 (Sun, 22 Oct 2017) | 6 lines

* string.c: [DOC] Split rdoc of String#<< and String#concat [ci skip]

Split String#<< and String#concat docs to reflect single and multiple
arguments

patched by MSP-Greg [fix GH-1614]
------------------------------------------------------------------------
r60327 | sonots | 2017-10-22 08:44:15 +0900 (Sun, 22 Oct 2017) | 11 lines

* object.c: Improve documentation of Kernel#Array

Array(arg) does more than just call to_ary or to_a on the argument.
It also falls back to returning [arg] if neither method is available.
This patch extends the description and adds a few examples of how it
handles common types of arguments, including an integer
(which does not implement to_ary or to_a).

Extend Kernel#Array doc to mention TypeError

patched by ragesoss (Sage Ross) [fix GH-1663]
------------------------------------------------------------------------
r60326 | sonots | 2017-10-22 08:38:17 +0900 (Sun, 22 Oct 2017) | 8 lines

* doc/regexp.rdoc: In regexp doc, two backslashes match one literally

In the "Metacharacters and Escapes" section of regexp.rdoc, it said that
to match a backslash literally, it must be backslash-escaped, but the
rendered HTML showed three backslashes (\\\). There should only be two
backslashes (\\).

patched by jlmuir (J. Lewis Muir) [fix GH-1677]
------------------------------------------------------------------------
r60325 | sonots | 2017-10-22 08:36:53 +0900 (Sun, 22 Oct 2017) | 2 lines

* doc/regexp.rdoc: Fix regexp doc syntax highlighting
  patched by jlmuir (J. Lewis Muir) [fix GH-1678]
------------------------------------------------------------------------
r60324 | sonots | 2017-10-22 08:35:40 +0900 (Sun, 22 Oct 2017) | 2 lines

* string.c: Remove errant "the" in gsub documentation
  patched by jlmuir (J. Lewis Muir) [fix GH-1679]
------------------------------------------------------------------------
r60323 | sonots | 2017-10-22 08:32:57 +0900 (Sun, 22 Oct 2017) | 4 lines

Fix typo in comment

* test/ruby/test_transcode.rb: fix typo in comment
  patched by larskanis (Lars Kanis) [GH-1681]
------------------------------------------------------------------------
r60322 | nobu | 2017-10-22 08:30:39 +0900 (Sun, 22 Oct 2017) | 4 lines

compile.c: optimize local variable assignments

* compile.c (iseq_peephole_optimize): eliminate repeated
  assignments and copy from/to a same local variable.
------------------------------------------------------------------------
r60321 | akr | 2017-10-22 08:23:05 +0900 (Sun, 22 Oct 2017) | 3 lines

reference Socket.getaddrinfo to Addrinfo.getaddrinfo.


------------------------------------------------------------------------
r60320 | nobu | 2017-10-22 08:21:05 +0900 (Sun, 22 Oct 2017) | 58 lines

Improve performance of string interpolation

This patch will add pre-allocation in string interpolation.
By this, unecessary capacity resizing is avoided.

For small strings, optimized `rb_str_resurrect` operation is
faster, so pre-allocation is done only when concatenated strings
are large.  `MIN_PRE_ALLOC_SIZE` was decided by experimenting with
local machine (x86_64-apple-darwin 16.5.0, Apple LLVM version
8.1.0 (clang - 802.0.42)).

String interpolation will be faster around 72% when large string is created.

* Before
  ```
  Calculating -------------------------------------
  Large string interpolation
                            1.276M ({U+00B1} 5.9%) i/s -      6.358M in   5.002022s
  Small string interpolation
                            5.156M ({U+00B1} 5.5%) i/s -     25.728M in   5.005731s
  ```

* After
  ```
  Calculating -------------------------------------
  Large string interpolation
                            2.201M ({U+00B1} 5.8%) i/s -     11.063M in   5.043724s
  Small string interpolation
                            5.192M ({U+00B1} 5.7%) i/s -     25.971M in   5.020516s
  ```

* Test code
  ```ruby
  require 'benchmark/ips'

  Benchmark.ips do |x|
    x.report "Large string interpolation" do |t|
      a = "Hellooooooooooooooooooooooooooooooooooooooooooooooooooo"
      b = "Wooooooooooooooooooooooooooooooooooooooooooooooooooorld"

      t.times do
        "#{a}, #{b}!"
      end
    end

    x.report "Small string interpolation" do |t|
      a = "Hello"
      b = "World"

      t.times do
        "#{a}, #{b}!"
      end
    end
  end
  ```

[Fix GH-1626]
From: Nao Minami <south37777@gmail.com>
------------------------------------------------------------------------
r60319 | akr | 2017-10-22 08:19:47 +0900 (Sun, 22 Oct 2017) | 23 lines

deprecate TCPSocket.gethostbyname.

TCPSocket.gethostbyname has problems similar to
Socket.gethostbyname.

An example of the problem which only the address family of
the first address is returned:

```
pp TCPSocket.gethostbyname("www.wide.ad.jp")
#=> ["www.wide.ad.jp",
      [],
      10,
      "2001:200:dff:fff1:216:3eff:fe4b:651c",
      "203.178.137.58"]
```

The address family of the first address, AF_INET6 (10), is
returned but
the address family of the second address, AF_INET, is not
returned.


------------------------------------------------------------------------
r60318 | rhe | 2017-10-22 05:26:26 +0900 (Sun, 22 Oct 2017) | 7 lines

openssl: merge test fix from upstream

Merge a commit from upstream:

	d1cbf6d75280 test/test_ssl_session: skip tests for session_remove_cb

Tests using SSL::SSLContext#session_remove_cb= are now skipped.
------------------------------------------------------------------------
r60317 | knu | 2017-10-22 02:03:40 +0900 (Sun, 22 Oct 2017) | 6 lines

Avoid use of `self.class.new(self)` in Set#collect!

That prevents infinite recursion when a subclass of Set uses
`collect!` in its constructor.

This should fix [Bug #12437].
------------------------------------------------------------------------
r60316 | naruse | 2017-10-22 01:44:56 +0900 (Sun, 22 Oct 2017) | 1 line

ignore server side error
------------------------------------------------------------------------
r60315 | naruse | 2017-10-22 01:44:56 +0900 (Sun, 22 Oct 2017) | 3 lines

Revert "ignore server side error"

This reverts commit r60314.
------------------------------------------------------------------------
r60314 | naruse | 2017-10-22 01:43:54 +0900 (Sun, 22 Oct 2017) | 1 line

ignore server side error
------------------------------------------------------------------------
r60313 | naruse | 2017-10-22 01:34:34 +0900 (Sun, 22 Oct 2017) | 1 line

fic expected error message
------------------------------------------------------------------------
r60312 | knu | 2017-10-22 01:28:52 +0900 (Sun, 22 Oct 2017) | 4 lines

Fix comparison methods of Set to check if `@hash` is actually comparable

This should fix comparison of rbtree backed SortedSet instances.
[Bug #12072]
------------------------------------------------------------------------
r60311 | naruse | 2017-10-22 01:25:22 +0900 (Sun, 22 Oct 2017) | 3 lines

Introduce Net::HTTP#min_version/max_version [Feature #9450]

Set SSL minimum/maximum version.
------------------------------------------------------------------------
r60310 | naruse | 2017-10-22 01:25:19 +0900 (Sun, 22 Oct 2017) | 1 line

fix OpenSSL::SSL::SSLContext#min_version doesn't work
------------------------------------------------------------------------
r60309 | akr | 2017-10-22 01:12:46 +0900 (Sun, 22 Oct 2017) | 2 lines

less random generations in Random::Formatter#choose.

------------------------------------------------------------------------
r60308 | hsbt | 2017-10-22 01:11:58 +0900 (Sun, 22 Oct 2017) | 5 lines

Add documentation for `chomp` option.

  https://github.com/ruby/ruby/pull/1717

  Patch by @ksss [fix GH-1717]
------------------------------------------------------------------------
r60307 | yui-knk | 2017-10-22 01:09:51 +0900 (Sun, 22 Oct 2017) | 7 lines

Remove not used node_type NODE_CVDECL

* compile.c (defined_expr0): This node_type has
  not been used since r11614.
* ext/objspace/objspace.c (count_nodes): ditto
* node.c (dump_node): ditto
* node.h (node_type, NEW_CVDECL): ditto
------------------------------------------------------------------------
r60306 | hsbt | 2017-10-22 01:05:01 +0900 (Sun, 22 Oct 2017) | 1 line

Handle Errno::EADDRNOTAVAIL with Raspberry Pi environment.
------------------------------------------------------------------------
r60305 | k0kubun | 2017-10-22 01:01:48 +0900 (Sun, 22 Oct 2017) | 1 line

erb.1: add missing option in detailed description
------------------------------------------------------------------------
r60304 | knu | 2017-10-22 00:57:32 +0900 (Sun, 22 Oct 2017) | 3 lines

Use a mutex to make SortedSet.setup thread-safe

This should fix [Bug #13735].
------------------------------------------------------------------------
r60303 | knu | 2017-10-22 00:57:26 +0900 (Sun, 22 Oct 2017) | 1 line

Remove redundant use of module_eval
------------------------------------------------------------------------
r60302 | yui-knk | 2017-10-22 00:56:03 +0900 (Sun, 22 Oct 2017) | 8 lines

Remove not used node_type NODE_IASGN2

* compile.c (compile_massign_opt, iseq_compile_each0): This
  node_type has not been used since r11813.
* ext/objspace/objspace.c (count_nodes): ditto
* node.c (dump_node, rb_gc_mark_node): ditto
* node.h (node_type, NEW_IASGN2): ditto
* parse.y (node_assign_gen): ditto
------------------------------------------------------------------------
r60301 | k0kubun | 2017-10-22 00:45:32 +0900 (Sun, 22 Oct 2017) | 1 line

driver.rb: allow executing driver.rb directly
------------------------------------------------------------------------
r60300 | usa | 2017-10-22 00:43:05 +0900 (Sun, 22 Oct 2017) | 9 lines

The encoding of __FILE__ and __dir__ should be same

* ruby.c (process_options): convert the real path of the script to locale
  encoding if its encoding is not locale (maybe UTF-8) on Windows/OS X.
  this change makes the encoding of __dir__ to the same encoding of __FILE__
  when the script name is passed from commandline.

* test/ruby/test_options.rb (test___dir__encoding): test for this change.

------------------------------------------------------------------------
r60299 | k0kubun | 2017-10-22 00:39:35 +0900 (Sun, 22 Oct 2017) | 3 lines

driver.rb: add option to specify target with rbenv

[close GH-1724]
------------------------------------------------------------------------
r60298 | knu | 2017-10-22 00:38:38 +0900 (Sun, 22 Oct 2017) | 1 line

Allow a SortedSet to be frozen and still functional [Bug #12091]
------------------------------------------------------------------------
r60297 | akr | 2017-10-22 00:21:26 +0900 (Sun, 22 Oct 2017) | 13 lines

SecureRandom.alphanumeric implemented.

[ruby-core:68098] [Feature #10849] proposed by Andrew Butterfield.

SecureRandom.choose and SecureRandom.graph is not included.
(The implementation has SecureRandom.choose but it is private.)

I feel the method name, SecureRandom.choose, doesn't represent
the behavior well.

The actual use cases of SecureRandom.graph is not obvious.


------------------------------------------------------------------------
r60296 | svn | 2017-10-22 00:19:46 +0900 (Sun, 22 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60295 | hsbt | 2017-10-22 00:19:45 +0900 (Sun, 22 Oct 2017) | 5 lines

Clarify return value for assignment methods.

  https://github.com/ruby/ruby/pull/1682

  Patch by @sos4nt [fix GH-1682]
------------------------------------------------------------------------
r60294 | hsbt | 2017-10-22 00:16:54 +0900 (Sun, 22 Oct 2017) | 6 lines

Clarify the behavior of IO.write without offset in write mode.

  https://github.com/ruby/ruby/pull/1571

  Patch by @takanabe [fix GH-1571]
  [Bug #11638][ruby-core:71277]
------------------------------------------------------------------------
r60293 | k0kubun | 2017-10-22 00:02:46 +0900 (Sun, 22 Oct 2017) | 15 lines

erb.rb: specify frozen_string_literal: true

for compilation performance.

$ ruby ./benchmark/driver.rb -e "trunk::/Users/k0kubun/.rbenv/versions/trunk/bin/ruby;modified::/Users/k0kubun/.rbenv/versions/modified/bin/ruby" -d ./benchmark -p app_erb

-----------------------------------------------------------
benchmark results:
Execution time (sec)
name    trunk   modified
app_erb 1.911      1.885

Speedup ratio: compare with the result of `trunk' (greater is better)
name    modified
app_erb    1.014
------------------------------------------------------------------------
r60292 | svn | 2017-10-22 00:02:26 +0900 (Sun, 22 Oct 2017) | 1 line

* 2017-10-22
------------------------------------------------------------------------
r60291 | hsbt | 2017-10-22 00:02:25 +0900 (Sun, 22 Oct 2017) | 9 lines

Update some words on README.md.

  * Remove space on double spaces.
  * Capitalization of "Ruby".
  * Use macOS instead of OS X.

  https://github.com/ruby/ruby/pull/1610

  Patch by @bunkrich [fix GH-1610]
------------------------------------------------------------------------
r60290 | hsbt | 2017-10-21 23:55:22 +0900 (Sat, 21 Oct 2017) | 5 lines

Added explicitly require to example code.

  https://github.com/ruby/ruby/pull/1666

  Patch by @guilherme [fix GH-1666]
------------------------------------------------------------------------
r60289 | yui-knk | 2017-10-21 23:51:07 +0900 (Sat, 21 Oct 2017) | 4 lines

Do not pass a not used argument

* parse.y (new_op_assign_gen): new_op_assign_gen for
  ripper does not need column information.
------------------------------------------------------------------------
r60288 | kazu | 2017-10-21 23:40:03 +0900 (Sat, 21 Oct 2017) | 1 line

Use caller with length to reduce unused strings
------------------------------------------------------------------------
r60287 | ko1 | 2017-10-21 23:35:19 +0900 (Sat, 21 Oct 2017) | 1 line

fix r60281
------------------------------------------------------------------------
r60286 | yui-knk | 2017-10-21 23:32:32 +0900 (Sat, 21 Oct 2017) | 4 lines

Define the macro separately for ruby parser and for ripper

* parse.y (new_op_assign): Define the macro separately
  for ruby parser and for ripper.
------------------------------------------------------------------------
r60285 | sonots | 2017-10-21 23:31:21 +0900 (Sat, 21 Oct 2017) | 5 lines

Add doxygen comments

* include/ruby/ruby.h (enum ruby_value_type): add doxygen comments
* internal.h (enum imemo_type, struct vm_svar): add doxygen comments
* method.h (rb_method_type_t, rb_method_iseq_t): add doxygen comments
------------------------------------------------------------------------
r60284 | glass | 2017-10-21 23:25:46 +0900 (Sat, 21 Oct 2017) | 4 lines

io.c: introduce copy offload to IO.copy_stream

io.c (rb_io_s_copy_stream): add copy offload feature (by using
copy_file_range(2) if available) to IO.copy_stream
------------------------------------------------------------------------
r60283 | kosaki | 2017-10-21 23:22:12 +0900 (Sat, 21 Oct 2017) | 1 line

test_pathname.rb#test_open should care about umask
------------------------------------------------------------------------
r60282 | kazu | 2017-10-21 23:22:04 +0900 (Sat, 21 Oct 2017) | 1 line

Fix r60271
------------------------------------------------------------------------
r60281 | kosaki | 2017-10-21 23:21:56 +0900 (Sat, 21 Oct 2017) | 1 line

test_cp_preserve_permissions should care about umask
------------------------------------------------------------------------
r60280 | akr | 2017-10-21 23:21:52 +0900 (Sat, 21 Oct 2017) | 9 lines

Describe recommended-methods.

Addrinfo.getaddrinfo is recommended instead of
Socket.gethostbyname.

Addrinfo#getnameinfo is recommended instead of
Socket.gethostbyaddr.


------------------------------------------------------------------------
r60279 | nobu | 2017-10-21 23:19:23 +0900 (Sat, 21 Oct 2017) | 7 lines

sysconfdir on Windows

* ext/etc/etc.c (etc_sysconfdir): mentioned special case on
  Windows.  [ruby-core:43110] [Bug #6121]

* win32/Makefile.sub (config.status): sysconfdir is not used on
  Windows.
------------------------------------------------------------------------
r60278 | hsbt | 2017-10-21 23:11:08 +0900 (Sat, 21 Oct 2017) | 5 lines

Removed obsoleted safe level checks on irb.

  https://github.com/ruby/ruby/pull/1713

  Patch by @y-yagi [fix GH-1713]
------------------------------------------------------------------------
r60277 | nobu | 2017-10-21 23:06:22 +0900 (Sat, 21 Oct 2017) | 4 lines

fix up r60243

* tool/vcs.rb (VCS::GIT.get_revisions): use last revision also as
  changed revision when the head does not have svn ID.
------------------------------------------------------------------------
r60276 | svn | 2017-10-21 22:58:32 +0900 (Sat, 21 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60275 | hsbt | 2017-10-21 22:58:31 +0900 (Sat, 21 Oct 2017) | 5 lines

Fixed unexpected behavior of `Resolv::MDNS#each_address` when given ".local" address.

  https://github.com/ruby/ruby/pull/1425

  Patch by @elct9620 [fix GH-1484]
------------------------------------------------------------------------
r60274 | hsbt | 2017-10-21 22:49:39 +0900 (Sat, 21 Oct 2017) | 5 lines

Improve docs for `File.delete` exceptions.

  https://github.com/ruby/ruby/pull/1505

  Patch by @mrtazz [fix GH-1505]
------------------------------------------------------------------------
r60273 | hsbt | 2017-10-21 22:40:12 +0900 (Sat, 21 Oct 2017) | 5 lines

Added sample code of merge! method in hash.c.

  https://github.com/ruby/ruby/pull/1652

  Patch by @selmertsx [fix GH-1652]
------------------------------------------------------------------------
r60272 | knu | 2017-10-21 22:38:03 +0900 (Sat, 21 Oct 2017) | 1 line

Fix the issue reference to [Bug #13769], handled in r60270
------------------------------------------------------------------------
r60271 | knu | 2017-10-21 22:34:22 +0900 (Sat, 21 Oct 2017) | 1 line

Add a new test case for ipaddr 1.2.0 + drb/acl
------------------------------------------------------------------------
r60270 | knu | 2017-10-21 22:34:19 +0900 (Sat, 21 Oct 2017) | 8 lines

Import ipaddr 1.2.0

- Add IPAddr#prefix
- Add IPAddr#loopback?
- Add IPAddr#private? [Feature #11666]
- Add IPAddr#link_local? [Feature #10912]
- Reject invalid address mask [Bug #13399]
- Warn that IPAddr#ipv4_compat and #ipv4_compat? are deprecated [#Bug 13769]
------------------------------------------------------------------------
r60269 | hsbt | 2017-10-21 22:17:54 +0900 (Sat, 21 Oct 2017) | 3 lines

Rename spec/rspec to .bundle.

  It used without rspec installation for test-* task.
------------------------------------------------------------------------
r60268 | kosaki | 2017-10-21 22:15:23 +0900 (Sat, 21 Oct 2017) | 8 lines

kill "discards 'const' qualifier" warning

Kill following warning.

../../../ext/psych/yaml/emitter.c: In function 'yaml_emitter_write_block_scalar_hints':
../../../ext/psych/yaml/emitter.c:2196:20: warning: assignment discards 'const' qualifier from pointer target type [enabled by default]
         chomp_hint = "-";
                    ^
------------------------------------------------------------------------
r60267 | kosaki | 2017-10-21 22:15:11 +0900 (Sat, 21 Oct 2017) | 8 lines

kill "discards 'const' qualifier" warning

Kill following warning.

../../../ext/psych/yaml/emitter.c: In function 'yaml_emitter_write_folded_scalar':
../../../ext/psych/yaml/emitter.c:2283:5: warning: passing argument 2 of 'yaml_emitter_write_indicator' discards 'const' qualifier from pointer target type [enabled by default]
     if (!yaml_emitter_write_indicator(emitter, ">", 1, 0, 0))
     ^
------------------------------------------------------------------------
r60266 | akr | 2017-10-21 22:13:02 +0900 (Sat, 21 Oct 2017) | 46 lines

Deprecation document for gethostbyname,gethostbyaddr.

[Feature #13097]

I confirmed current ruby (Ruby 2.4 and trunk) uses
gethostbyname() and gethostbyaddr().

Socket.gethostbyname uses getaddrinfo() and gethostbyname().
Socket.gethostbyaddr uses gethostbyaddr().

Socket.gethostbyname uses gethostbyname() to obtain alias hostnames.

RFC 3493 defines getaddrinfo()/getnameinfo() and
describes the problems of gethostbyname()/gethostbyaddr().
The problems are difficult protocol handling and thread-unsafety.

Since Ruby has GVL, the thread-unsafety doesn't cause wrong result.
But it may block other threads until finishing DNS query.

Socket.gethostbyname has the protocol handling problem.
It returns only one address family:

```
% ruby -rpp -rsocket -e 'pp Socket.gethostbyname("www.wide.ad.jp")'
["www.wide.ad.jp",
 [],
 10,
 " \x01\x02\x00\r\xFF\xFF\xF1\x02\x16>\xFF\xFEKe\x1C",
 "\xCB\xB2\x89:"]
```

www.wide.ad.jp has one IPv6 address and one IPv4 address.
But Socket.gethostbyname returns only one address family, 10 (AF_INET6),
which is the address family of the first address.

Also, Socket.gethostbyname and Socket.gethostbyaddr uses
4-bytes binary IPv4 address and 16-bytes binary IPv6 address.
This is not usual in other socket API in Ruby.
(Most socket API uses binary sockaddr string or Addrinfo object)

I think Socket.gethostbyname and Socket.gethostbyaddr are too far
from recommendable API.

So, I added deprecation description for documents for them.


------------------------------------------------------------------------
r60265 | yui-knk | 2017-10-21 22:06:36 +0900 (Sat, 21 Oct 2017) | 4 lines

node.h: Remove a not used function prototype

* node.h (rb_node_newnode_longlife): The definition
  of this function was deleted r24490.
------------------------------------------------------------------------
r60264 | kosaki | 2017-10-21 22:02:04 +0900 (Sat, 21 Oct 2017) | 8 lines

kill "value computed is not used" warning

Currently, gcc claims your coding style is not good. Shut it up.

../../../ext/psych/yaml/emitter.c: In function 'yaml_emitter_write_plain_scalar':
../../../ext/psych/yaml/emitter.c:28:6: warning: value computed is not used [-Wunused-value]
      && ((emitter->line_break == YAML_CR_BREAK ?                                \
      ^
------------------------------------------------------------------------
r60263 | kosaki | 2017-10-21 22:01:51 +0900 (Sat, 21 Oct 2017) | 8 lines

kill variable set but not used warning

Currently, dummy_mark variable makes following warnings. Let's fix it.

../../../ext/psych/yaml/parser.c: In function 'yaml_parser_parse_block_sequence_entry':
../../../ext/psych/yaml/parser.c:762:21: warning: variable 'dummy_mark' set but not used [-Wunused-but-set-variable]
         yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
                     ^
------------------------------------------------------------------------
r60262 | kosaki | 2017-10-21 21:57:14 +0900 (Sat, 21 Oct 2017) | 7 lines

kill "variable set but not used" warning

Currently, scanner.c makes following warning. Fix it.

../../../ext/psych/yaml/scanner.c: In function 'yaml_parser_decrease_flow_level':
../../../ext/psych/yaml/scanner.c:1189:23: warning: variable 'dummy_key' set but not used [-Wunused-but-set-variable]
     yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
------------------------------------------------------------------------
r60261 | nobu | 2017-10-21 21:34:13 +0900 (Sat, 21 Oct 2017) | 7 lines

Fix bug about String#scanf("%a")

* lib/scanf.rb (extract_float, initialize): allow to omit a sign
  on the binary exponent.  [ruby-core:82435] [Bug #13833]
  [Fix GH-1689]

From: tarotaro0 <tarousann11922960@yahoo.co.jp>
------------------------------------------------------------------------
r60260 | akr | 2017-10-21 21:22:46 +0900 (Sat, 21 Oct 2017) | 2 lines

add example for Socket.gethostbyaddr.

------------------------------------------------------------------------
r60259 | nobu | 2017-10-21 21:18:38 +0900 (Sat, 21 Oct 2017) | 1 line

gc.c (rb_raw_obj_info): suppress a warning
------------------------------------------------------------------------
r60258 | nobu | 2017-10-21 21:18:35 +0900 (Sat, 21 Oct 2017) | 1 line

gc.c (rb_raw_obj_info): adjust indent
------------------------------------------------------------------------
r60257 | usa | 2017-10-21 21:12:52 +0900 (Sat, 21 Oct 2017) | 6 lines

Treat REG_NONE just like REG_BINARY

* ext/win32/lib/win32/registry.rb (read, write): treat REG_NONE just like
  REG_BINARY when reading and writing.
  cf. [Bug #7526]

------------------------------------------------------------------------
r60256 | kazu | 2017-10-21 20:59:08 +0900 (Sat, 21 Oct 2017) | 2 lines

Sync svn:ignore [ci skip]

------------------------------------------------------------------------
r60255 | naruse | 2017-10-21 19:44:13 +0900 (Sat, 21 Oct 2017) | 3 lines

Revert "Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]"

This reverts commit r60253 because it causes on error on Linux.
------------------------------------------------------------------------
r60254 | sonots | 2017-10-21 19:33:25 +0900 (Sat, 21 Oct 2017) | 2 lines

* string.c (deleted_prefix_length, deleted_suffix_length):
  Add doxygen comment.
------------------------------------------------------------------------
r60253 | naruse | 2017-10-21 19:28:34 +0900 (Sat, 21 Oct 2017) | 3 lines

Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]

The order of resulted array is changed in some cases.
------------------------------------------------------------------------
r60252 | tarui | 2017-10-21 19:26:31 +0900 (Sat, 21 Oct 2017) | 3 lines

fix comment abount IMEMO_FL_USHIFT


------------------------------------------------------------------------
r60251 | ko1 | 2017-10-21 19:23:59 +0900 (Sat, 21 Oct 2017) | 1 line

do not need to clear by NULL because of last commit
------------------------------------------------------------------------
r60250 | ko1 | 2017-10-21 19:21:31 +0900 (Sat, 21 Oct 2017) | 5 lines

imemo_mask (enum) -> IMEMO_MASK (immediate value).

* internal.h: imemo_mask is not a valid imemo type but
  switch statements show warnings.

------------------------------------------------------------------------
r60249 | knu | 2017-10-21 18:53:52 +0900 (Sat, 21 Oct 2017) | 4 lines

Make ACL::ACLEntry not suppress IPAddr::InvalidPrefixError

This is because it would be a user error because a pattern containing
a slash shouldn't be a host name pattern but an IP address pattern.
------------------------------------------------------------------------
r60248 | svn | 2017-10-21 18:50:37 +0900 (Sat, 21 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60247 | hsbt | 2017-10-21 18:50:36 +0900 (Sat, 21 Oct 2017) | 4 lines

[EXPERIMENTAL] Added test-bundled-gems task.

  `test-bundled-gems` invoke test suite of bundled gems with
  build environment.
------------------------------------------------------------------------
r60246 | nobu | 2017-10-21 18:25:05 +0900 (Sat, 21 Oct 2017) | 4 lines

common.mk: preserve rest fields of bundled_gems

* common.mk (update-bundled_gems): preserve rest fields other than
  names and versions, for more extensions.
------------------------------------------------------------------------
r60245 | ko1 | 2017-10-21 18:24:59 +0900 (Sat, 21 Oct 2017) | 9 lines

add RUNRUBY_USE_GDB envvar for runruby.rb.

* tool/runruby.rb: add RUNRUBY_USE_GDB environment variable.
  If RUNRUBY_USE_GDB=true then use 'gdb --args'.
  If there is 'run.gdb' file (made by 'make run.gdb') on current directory,
  run gdb with this file ('gdb -x run.gdb --args').

  This envval is useful when you want to run test-all (and so on) with gdb.

------------------------------------------------------------------------
r60244 | nobu | 2017-10-21 18:10:42 +0900 (Sat, 21 Oct 2017) | 6 lines

fix up imemo_alloc

* internal.h (rb_imemo_alloc_struct), gc.c (gc_mark_imemo): turned
  next into the pointer to chain.

* parse.y (NEWHEAP): needs a cast.
------------------------------------------------------------------------
r60243 | nobu | 2017-10-21 17:56:58 +0900 (Sat, 21 Oct 2017) | 1 line

vcs.rb: try to extract revision number from tags
------------------------------------------------------------------------
r60242 | akr | 2017-10-21 17:44:56 +0900 (Sat, 21 Oct 2017) | 2 lines

RbConfig::LIMITS is provided by rbconfig/sizeof.

------------------------------------------------------------------------
r60241 | akr | 2017-10-21 17:41:59 +0900 (Sat, 21 Oct 2017) | 5 lines

declare variables once for each line in pathname.c.

This ease adding/deleting variables.


------------------------------------------------------------------------
r60240 | usa | 2017-10-21 17:41:22 +0900 (Sat, 21 Oct 2017) | 8 lines

Use GetSystemTimePreciseAsFileTime on recent Windows

* win32/win32.c (gettiemeofday, wutime): use GetSystemTimePreciseAsFileTime
  instead of GetSystemTimeAsFileTime if it is available.
  This patch is based on Takehiro Kubo <kubo@jiubao.org> 's one (change only
  the name of wrapper function).  Thanks! and sorry to late
  [ruby-dev:50167] [Feature #13732]

------------------------------------------------------------------------
r60239 | mame | 2017-10-21 17:40:28 +0900 (Sat, 21 Oct 2017) | 1 line

Replace NODE_ALLOCA with T_IMEMO (imemo_alloc)
------------------------------------------------------------------------
r60238 | akr | 2017-10-21 17:34:49 +0900 (Sat, 21 Oct 2017) | 4 lines

Pathname#glob method implemented.

[ruby-core:49373] [Feature #7360] proposed by Alexander E. Fischer.

------------------------------------------------------------------------
r60237 | usa | 2017-10-21 16:44:11 +0900 (Sat, 21 Oct 2017) | 5 lines

File.symlink is not potable

* test/fileutils/test_fileutils.rb: skip tests using File.symlink if it's not
  available.  this problem is reported by ko1.

------------------------------------------------------------------------
r60236 | akr | 2017-10-21 16:00:58 +0900 (Sat, 21 Oct 2017) | 7 lines

lib/open3.rb: accept IO-like object for :stdin_data argument.

Open3.capture3, Open3.capture2, Open3.capture2e accepts
IO-like object for :stdin_data argument.
[ruby-core:80936] [Feature #13527] proposed by janko.


------------------------------------------------------------------------
r60235 | k0kubun | 2017-10-21 15:57:04 +0900 (Sat, 21 Oct 2017) | 6 lines

vm.c, vm_insnhelper.h: export symbols of VM serials

This change is for future JIT compiler introduction.
See r60231 for the purpose.

[close GH-1721]
------------------------------------------------------------------------
r60234 | naruse | 2017-10-21 15:51:01 +0900 (Sat, 21 Oct 2017) | 1 line

[Feature #13712] String#start_with? supports regexp
------------------------------------------------------------------------
r60233 | akr | 2017-10-21 15:45:41 +0900 (Sat, 21 Oct 2017) | 2 lines

[DOC] describe methods used for src and dst argument.

------------------------------------------------------------------------
r60232 | akr | 2017-10-21 15:22:53 +0900 (Sat, 21 Oct 2017) | 2 lines

lib/open-uri.rb: accept :encoding option as well as encoding in mode string.

------------------------------------------------------------------------
r60231 | k0kubun | 2017-10-21 15:22:43 +0900 (Sat, 21 Oct 2017) | 10 lines

vm_core.h: export symbols of shared variables

vm_insnhelper.h: ditto.

All changes are for reducing changes required to introduce JIT compiler.
Unlike functions that can be inlined by header, those variables should
be shared with JIT-ed code. This will help reducing cost of rebase
against upstream.

[close GH-1720]
------------------------------------------------------------------------
r60230 | glass | 2017-10-21 15:11:01 +0900 (Sat, 21 Oct 2017) | 1 line

Update NEWS for Hash#slice
------------------------------------------------------------------------
r60229 | glass | 2017-10-21 15:08:33 +0900 (Sat, 21 Oct 2017) | 3 lines

hash.c: Add Hash#slice

* hash.c (rb_hash_slice): add Hash#slice [Feature #8499]
------------------------------------------------------------------------
r60228 | knu | 2017-10-21 14:18:40 +0900 (Sat, 21 Oct 2017) | 1 line

Replace `to_a[1..-1]` on a MatchData with `captures`
------------------------------------------------------------------------
r60227 | knu | 2017-10-21 14:18:38 +0900 (Sat, 21 Oct 2017) | 1 line

Remove redundant calls of String#chr
------------------------------------------------------------------------
r60226 | nobu | 2017-10-21 12:18:46 +0900 (Sat, 21 Oct 2017) | 1 line

assertion for r60225
------------------------------------------------------------------------
r60225 | yui-knk | 2017-10-21 11:50:38 +0900 (Sat, 21 Oct 2017) | 17 lines

Do not literal_flush if float is read correctly

* parse.y (parse_numeric): Do not literal_flush if
  float is read correctly. This will fix the first
  column of float.

before:
  ```
  1.2i1.1
         ^
  ```

after:
  ```
  1.2i1.1
      ^~~
  ```
------------------------------------------------------------------------
r60224 | nobu | 2017-10-21 10:06:25 +0900 (Sat, 21 Oct 2017) | 1 line

moved node generation for dregex_once to parse.y
------------------------------------------------------------------------
r60223 | yui-knk | 2017-10-21 09:14:32 +0900 (Sat, 21 Oct 2017) | 4 lines

Fix build on Windows

* parse.y (new_cdecl_gen): Rename local variable name
  from cdecl to nd_cdecl. We can not use cdecl on Windows.
------------------------------------------------------------------------
r60222 | svn | 2017-10-21 01:22:24 +0900 (Sat, 21 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60221 | svn | 2017-10-21 01:22:24 +0900 (Sat, 21 Oct 2017) | 1 line

* 2017-10-21
------------------------------------------------------------------------
r60220 | yui-knk | 2017-10-21 01:22:22 +0900 (Sat, 21 Oct 2017) | 14 lines

Store token first column number on RNode

* node.c (A_NODE_HEADER): Print column number.
* node.h (nd_column, nd_set_column): Define getter/setter
  macros for column number of RNode.
* parse.y: Set first column number of tokens.

Notes:

* Use `@n` to get the location of token in parse.y.
* When we use `@n`, arguments of yyerror and yylex are
  changed.
* Initialize column of nodes with -1 to make it easy
  to detect nodes which we forget to set a column number.
------------------------------------------------------------------------
r60219 | hsbt | 2017-10-20 18:03:37 +0900 (Fri, 20 Oct 2017) | 3 lines

Merge rubygems master(ddbf3203f3857649abe95c73edefc7de7e6ecff4).

  It fixed: https://github.com/rubygems/rubygems/issues/2041
------------------------------------------------------------------------
r60218 | hsbt | 2017-10-20 16:03:11 +0900 (Fri, 20 Oct 2017) | 4 lines

Overwrite destination symlink file if `remove_destination` is set.

  [Bug #13914][ruby-core:82846] Patch by @mzp
  https://github.com/ruby/fileutils/pull/9
------------------------------------------------------------------------
r60217 | svn | 2017-10-20 10:03:19 +0900 (Fri, 20 Oct 2017) | 1 line

* 2017-10-20
------------------------------------------------------------------------
r60216 | nobu | 2017-10-20 10:03:18 +0900 (Fri, 20 Oct 2017) | 9 lines

Make Time.parse respect timezone offset seconds

DateTime.parse handles them correctly, and DateTime.parse.to_time
results in the correct time.  Time.parse doesn't handle them
correctly because Time.zone_offset uses a different regexp that
only considers hours and minutes, not seconds.
[ruby-core:83400] [Bug #14034]

From: Jeremy Evans <code@jeremyevans.net>
------------------------------------------------------------------------
r60215 | nobu | 2017-10-19 20:24:03 +0900 (Thu, 19 Oct 2017) | 5 lines

ruby.c: reject NUL in $0

* ruby.c (ruby_setproctitle): raise if the argument contains NUL
  char.  process title is a NUL-terminated string.
  [ruby-core:82425] [Bug #13829]
------------------------------------------------------------------------
r60214 | nobu | 2017-10-19 19:58:08 +0900 (Thu, 19 Oct 2017) | 7 lines

freeze Complex and Rational

* complex.c (nucomp_s_new_internal, nucomp_loader): Complex
  instances are always frozen now.  [Feature #13983]

* rational.c (nurat_s_new_internal, nurat_loader): Rational
  instances are always frozen now.  [Feature #13983]
------------------------------------------------------------------------
r60213 | nobu | 2017-10-19 14:10:38 +0900 (Thu, 19 Oct 2017) | 4 lines

parse.y: indent at '#'

* parse.y (parser_here_document): update indent at '#', which is
  not a space.  [ruby-core:83368] [Bug #14032]
------------------------------------------------------------------------
r60212 | nobu | 2017-10-19 13:25:30 +0900 (Thu, 19 Oct 2017) | 5 lines

lexer.rb: no dedent strings in middle

* ext/ripper/lib/ripper/lexer.rb (on_heredoc_dedent): dedent only
  strings at the beginning, not strings in middle.
  [ruby-core:83343] [Bug #14027]
------------------------------------------------------------------------
r60211 | normal | 2017-10-19 08:34:02 +0900 (Thu, 19 Oct 2017) | 6 lines

webrick: fix up r60172 and r60210

Thanks to MSP-Greg (Greg L) for helping with this.

* lib/webrick/server.rb (start_thread): properly fix non-local return
  introduced in r60208 and r60210
------------------------------------------------------------------------
r60210 | normal | 2017-10-19 08:23:33 +0900 (Thu, 19 Oct 2017) | 6 lines

webrick: fix up r60172 and r60208

Thanks to MSP-Greg (Greg L) for helping with this.

* lib/webrick/server.rb (start_thread): fix non-local return
  introduced in r60208
------------------------------------------------------------------------
r60209 | svn | 2017-10-19 06:45:35 +0900 (Thu, 19 Oct 2017) | 1 line

* 2017-10-19
------------------------------------------------------------------------
r60208 | normal | 2017-10-19 06:45:34 +0900 (Thu, 19 Oct 2017) | 9 lines

webrick: fix up r60172 and revert r60189

Thanks to MSP-Greg (Greg L) for helping with this.

* lib/webrick/server.rb (start_thread): ignore ECONNRESET, ECONNABORTED,
  EPROTO, and EINVAL on TLS negotiation errors the same way they
  were ignored before r60172 in the accept_client method of the
  main acceptor thread.
  [Bug #14013] [Bug #14005]
------------------------------------------------------------------------
r60207 | nobu | 2017-10-18 22:08:53 +0900 (Wed, 18 Oct 2017) | 4 lines

parse.y: serial comparisons

* parse.y (rel_expr): warn sequence of comparisons, which would be
  probably unintentional.  [EXPERIMENTAL]
------------------------------------------------------------------------
r60206 | nobu | 2017-10-18 22:08:53 +0900 (Wed, 18 Oct 2017) | 3 lines

parse.y: relop

* parse.y (relop): extract to simplify comparisons.
------------------------------------------------------------------------
r60205 | svn | 2017-10-18 13:35:27 +0900 (Wed, 18 Oct 2017) | 1 line

* 2017-10-18
------------------------------------------------------------------------
r60204 | nobu | 2017-10-18 13:35:25 +0900 (Wed, 18 Oct 2017) | 1 line

Get rid of shadowing local variables
------------------------------------------------------------------------
r60203 | nobu | 2017-10-17 21:40:00 +0900 (Tue, 17 Oct 2017) | 4 lines

tempfile.rb: [DOC] all arguments [ci skip]

* lib/tempfile.rb (Tempfile.create): mention the other arguments
  too.  [ruby-core:83321] [Misc #14019]
------------------------------------------------------------------------
r60202 | nobu | 2017-10-17 21:30:12 +0900 (Tue, 17 Oct 2017) | 4 lines

node.c: all node types

* node.c (dump_node): moved rb_bug for unknown node outside to let
  unhandled node types be warned.
------------------------------------------------------------------------
r60201 | nobu | 2017-10-17 21:30:11 +0900 (Tue, 17 Oct 2017) | 1 line

node.c: adjust indent
------------------------------------------------------------------------
r60200 | nobu | 2017-10-17 21:05:32 +0900 (Tue, 17 Oct 2017) | 3 lines

compile.c: compile_for

* compile.c (compile_for): extract from iseq_compile_each.
------------------------------------------------------------------------
r60199 | nobu | 2017-10-17 21:05:30 +0900 (Tue, 17 Oct 2017) | 3 lines

compile.c: compile_iter

* compile.c (compile_iter): extract from iseq_compile_each.
------------------------------------------------------------------------
r60198 | kazu | 2017-10-17 20:58:51 +0900 (Tue, 17 Oct 2017) | 3 lines

Fix warning: assigned but unused variable

[Bug #14020][ruby-core:83313]
------------------------------------------------------------------------
r60197 | mame | 2017-10-17 20:38:16 +0900 (Tue, 17 Oct 2017) | 1 line

Improve some annotation names of output of parsetree-with-comment
------------------------------------------------------------------------
r60196 | yui-knk | 2017-10-17 20:13:53 +0900 (Tue, 17 Oct 2017) | 3 lines

node.c: Add NODE_OP_CDECL to dump node list.

* node.c (dump_node): Add NODE_OP_CDECL to dump node list.
------------------------------------------------------------------------
r60195 | mame | 2017-10-17 16:41:04 +0900 (Tue, 17 Oct 2017) | 1 line

Fix the leak in `TestRDocGeneratorDarkfish#test_generated_method_with_html_tag_yield`
------------------------------------------------------------------------
r60194 | mame | 2017-10-17 16:41:03 +0900 (Tue, 17 Oct 2017) | 12 lines

Suppress leak of file descriptors

`Bundler.ui=` in `Gem::TestCase#setup` creates `Bundler::UI::RGProxy`
which inherites `::Gem::SilentUI` whose `initialize` opens `/dev/null`,
and assigns it to `Gem::DefaultUserInteraction.ui`.
After that, `Gem::TestCase#setup` forces to overwrite
`Gem::DefaultUserInteraction.ui` with a mock.
Thus, the instance of `::Gem::SilentUI` is not closed, which leads to
the leak.

This commit keeps `Gem::DefaultUserInteraction.ui` and manually close it
in `teardown`.
------------------------------------------------------------------------
r60193 | nobu | 2017-10-17 08:11:40 +0900 (Tue, 17 Oct 2017) | 7 lines

Layout fixes in rdoc of lib/tempfile.rb [ci skip]

RDoc doesn't understand an asterisk inside the plus markers. Moving them
out of the markers looks better.
[Fix GH-1716]

From:    Herwin Weststrate <herwinw@herwinw.nl>
------------------------------------------------------------------------
r60192 | svn | 2017-10-17 04:42:34 +0900 (Tue, 17 Oct 2017) | 1 line

* 2017-10-17
------------------------------------------------------------------------
r60191 | normal | 2017-10-17 04:42:33 +0900 (Tue, 17 Oct 2017) | 3 lines

spec/ruby/optional/capi/io_spec.rb: speling fics

* spec/ruby/optional/capi/io_spec.rb: speling: s/writeable/writable/
------------------------------------------------------------------------
r60190 | nobu | 2017-10-16 14:00:21 +0900 (Mon, 16 Oct 2017) | 4 lines

configure.ac: fix SOEXT on Windows

* configure.ac (SOEXT): shoud be "dll" on Windows.
  [ruby-core:83208] [Bug #14002]
------------------------------------------------------------------------
r60189 | normal | 2017-10-16 13:33:53 +0900 (Mon, 16 Oct 2017) | 14 lines

webrick: fix up r60172

By making the socket non-blocking in r60172, TLS/SSL negotiation
via the SSL_accept function must handle non-blocking sockets
properly and retry on SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE.
OpenSSL::SSL::SSLSocket#accept cannot do that properly with a
non-blocking socket, so it must use non-blocking logic of
OpenSSL::SSL::SSLSocket#accept_nonblock.

Thanks to MSP-Greg (Greg L) for finding this.

* lib/webrick/server.rb (start_thread): use SSL_accept properly
  with non-blocking socket.
  [Bug #14013] [Bug #14005]
------------------------------------------------------------------------
r60188 | nobu | 2017-10-16 13:19:48 +0900 (Mon, 16 Oct 2017) | 5 lines

test_complex.rb: NaN Complex

* test/ruby/test_complex.rb (test_finite_p): assertions for NaN
  Complex.  NaN is not an infinite nor a finite number.
  [ruby-core:83272] [Bug #14014]
------------------------------------------------------------------------
r60187 | nobu | 2017-10-16 13:15:19 +0900 (Mon, 16 Oct 2017) | 7 lines

fix missing variables in ruby.pc

* configure.ac (LIBRUBY_SO): get rid of referrence to
  LIBRUBY_SONAME which is not present in ruby.pc.

* template/ruby.pc.in (RUBY_API_VERSION, SOEXT): add new
  variables.  [ruby-core:83208] [Bug #14002]
------------------------------------------------------------------------
r60186 | svn | 2017-10-16 01:05:07 +0900 (Mon, 16 Oct 2017) | 1 line

* 2017-10-16
------------------------------------------------------------------------
r60185 | nobu | 2017-10-16 01:05:06 +0900 (Mon, 16 Oct 2017) | 4 lines

error.c: [DOC] fix typo [ci skip]

* error.c (RuntimeError): example code uses Kernel#raise instance
  method, not Kernel.raise singleton method.
------------------------------------------------------------------------
r60184 | nobu | 2017-10-15 11:31:29 +0900 (Sun, 15 Oct 2017) | 5 lines

configure.ac: fix SONAME

* configure.ac (RUBY_SO_NAME): revert $(RUBY_API_VERSION:.=) to
  $(MAJOR)$(MINOR), as a string in middle is not replaced.
  [ruby-core:83208] [Bug #14002]
------------------------------------------------------------------------
r60183 | nobu | 2017-10-15 11:20:20 +0900 (Sun, 15 Oct 2017) | 4 lines

envutil.rb: precommand in invoke_ruby [ci skip]

* test/lib/envutil.rb (invoke_ruby): add precommand option to
  invoke ruby via some other commands, e.g., sudo.
------------------------------------------------------------------------
r60182 | nobu | 2017-10-15 00:55:14 +0900 (Sun, 15 Oct 2017) | 5 lines

configure.ac: link Foundation framework

* configure.ac (XLDFLAGS): link against Foundation framework and
  let __NSPlaceholderDictionary initialize, to get rid of crash
  after fork on macOS High Sierra.  [ruby-core:83239] [Bug #14009]
------------------------------------------------------------------------
r60181 | svn | 2017-10-15 00:35:06 +0900 (Sun, 15 Oct 2017) | 1 line

* 2017-10-15
------------------------------------------------------------------------
r60180 | nobu | 2017-10-15 00:35:05 +0900 (Sun, 15 Oct 2017) | 5 lines

configure.ac: LIBRUBY_SONAME

* configure.ac (LIBRUBY_SONAME): add new variable for the name of
  the library name with compatibility version.
  [ruby-core:83208] [Bug #14002]
------------------------------------------------------------------------
r60179 | nobu | 2017-10-14 11:17:07 +0900 (Sat, 14 Oct 2017) | 6 lines

distinguish pass and fail by highlight [ci skip]

* tool/colorize.rb: remove highlight attribute from "pass" to make
  distinguishable from "fail" by other than red-green colors.

* tool/ifchange: ditto.
------------------------------------------------------------------------
r60178 | svn | 2017-10-14 10:59:48 +0900 (Sat, 14 Oct 2017) | 1 line

* 2017-10-14
------------------------------------------------------------------------
r60177 | nobu | 2017-10-14 10:59:47 +0900 (Sat, 14 Oct 2017) | 5 lines

configure.ac: no _objc_msgSend trick

* configure.ac (XLDFLAGS): _objc_msgSend is no longer needed to
  link CoreFoundation, that framework is always used for CFString
  functions.
------------------------------------------------------------------------
r60176 | nobu | 2017-10-13 17:29:52 +0900 (Fri, 13 Oct 2017) | 3 lines

defines.h: warn EXTERN

* include/ruby/defines.h (EXTERN): warn as deprecated.
------------------------------------------------------------------------
r60175 | nobu | 2017-10-13 10:34:52 +0900 (Fri, 13 Oct 2017) | 6 lines

error.c: infinite recursion at Warning#warn

* error.c (rb_warn_m): write the message to rb_stderr directly, to
  get rid of infinite recursion when called on Warning module
  itself, by super in redefined Warning#warn.
  [ruby-dev:50293] [Bug #14006]
------------------------------------------------------------------------
r60174 | nobu | 2017-10-13 10:26:51 +0900 (Fri, 13 Oct 2017) | 4 lines

rbinstall.rb: fix for --cmd-type=cmd

* tool/rbinstall.rb (PROLOG_SCRIPT): fix wrapper code for cmd
  script.  [Bug#13997]
------------------------------------------------------------------------
r60173 | svn | 2017-10-13 03:50:08 +0900 (Fri, 13 Oct 2017) | 1 line

* 2017-10-13
------------------------------------------------------------------------
r60172 | normal | 2017-10-13 03:50:07 +0900 (Fri, 13 Oct 2017) | 20 lines

webrick: do not hang acceptor on slow TLS connections

OpenSSL::SSL::SSLSocket#accept may block indefinitely on clients
which negotiate the TCP connection, but fail (or are slow) to
negotiate the subsequent TLS handshake.  This prevents the
multi-threaded WEBrick server from accepting other connections.

Since the TLS handshake (via OpenSSL::SSL::SSLSocket#accept)
consists of normal read/write traffic over TCP, handle it in the
per-client thread, instead.

Furthermore, using non-blocking accept() is useful for non-TLS
sockets anyways because spurious wakeups are possible from
select(2).

* lib/webrick/server.rb (accept_client): use TCPServer#accept_nonblock
  and remove OpenSSL::SSL::SSLSocket#accept call
* lib/webrick/server.rb (start_thread): call OpenSSL::SSL::SSLSocket#accept
* test/webrick/test_ssl_server.rb (test_slow_connect): new test
  [ruby-core:83221] [Bug #14005]
------------------------------------------------------------------------
r60171 | nobu | 2017-10-12 16:27:16 +0900 (Thu, 12 Oct 2017) | 4 lines

rbinstall.rb: shell code as comments

* tool/rbinstall.rb (PROLOG_SCRIPT): wrap shell code by
  =begin/=end as comments.  [ruby-core:83202] [Bug#13997]
------------------------------------------------------------------------
r60170 | svn | 2017-10-12 10:38:07 +0900 (Thu, 12 Oct 2017) | 1 line

* 2017-10-12
------------------------------------------------------------------------
r60169 | hsbt | 2017-10-12 10:38:07 +0900 (Thu, 12 Oct 2017) | 3 lines

Removed unnecessary gem locking for avoiding test warnings.

  It causes test failure: http://ci.rvm.jp/results/trunk@P895/111404
------------------------------------------------------------------------
r60167 | kazu | 2017-10-11 21:07:39 +0900 (Wed, 11 Oct 2017) | 2 lines

Sync .gitignore and svn:ignore [ci skip]

------------------------------------------------------------------------
r60166 | sonots | 2017-10-11 20:39:15 +0900 (Wed, 11 Oct 2017) | 4 lines

* .gitignore: ignore exe/ruby and exe/.time instead of bin/ruby
  because bin/ruby was renamed as exe/ruby at r59937.

follow-up: [Bug #13911]
------------------------------------------------------------------------
r60165 | nobu | 2017-10-11 17:14:50 +0900 (Wed, 11 Oct 2017) | 1 line

NEWS: refine the entry about RDoc [ci skip]
------------------------------------------------------------------------
r60164 | ko1 | 2017-10-11 17:11:16 +0900 (Wed, 11 Oct 2017) | 6 lines

revert a part of r60163.

* test/ruby/test_settracefunc.rb (test_trace_point_binding_in_ifunc):
  do not need other threads because this script is invoked by another
  ruby process (and also remove typo).

------------------------------------------------------------------------
r60163 | ko1 | 2017-10-11 16:49:03 +0900 (Wed, 11 Oct 2017) | 5 lines

check a thread on TracePoint.

* test/ruby/test_settracefunc.rb: skip if TracePoint probes are invoked by
  non-main thread.

------------------------------------------------------------------------
r60162 | nobu | 2017-10-11 15:16:04 +0900 (Wed, 11 Oct 2017) | 5 lines

socket.c: null byte at Socket.getnameinfo

* ext/socket/socket.c (sock_s_getnameinfo): check null byte.
  patched by tommy (Masahiro Tomita) in [ruby-dev:50286].
  [Bug #13994]
------------------------------------------------------------------------
r60161 | nobu | 2017-10-11 15:16:03 +0900 (Wed, 11 Oct 2017) | 4 lines

process.c: null byte at initgroups

* process.c (proc_initgroups): check null byte.  patched by
  tommy (Masahiro Tomita) in [ruby-dev:50287].  [Bug #13995]
------------------------------------------------------------------------
r60160 | nobu | 2017-10-11 14:34:24 +0900 (Wed, 11 Oct 2017) | 4 lines

parse.y: token info with BOM

* parse.y (parser_prepare): set token_info_enabled flag first,
  before returning at BOM.  [ruby-dev:50288] [Bug #13998]
------------------------------------------------------------------------
r60159 | nobu | 2017-10-11 13:45:08 +0900 (Wed, 11 Oct 2017) | 4 lines

file.c: ALT_SEPARATOR on cygwin

* file.c (file_alt_separator): define only on DOSISH platforms.
  File::ALT_SEPARATOR is nil on cygwin.
------------------------------------------------------------------------
r60158 | svn | 2017-10-11 12:44:36 +0900 (Wed, 11 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60157 | svn | 2017-10-11 12:44:36 +0900 (Wed, 11 Oct 2017) | 1 line

* 2017-10-11
------------------------------------------------------------------------
r60156 | hsbt | 2017-10-11 12:44:35 +0900 (Wed, 11 Oct 2017) | 1 line

Added news entries of RDoc and Rubygems.
------------------------------------------------------------------------
r60155 | nobu | 2017-10-10 21:30:42 +0900 (Tue, 10 Oct 2017) | 4 lines

io.c: encoding of ARGF.inplace_mode

* io.c (argf_next_argv): encode inplace mode suffix to the path
  encoding.
------------------------------------------------------------------------
r60154 | nobu | 2017-10-10 19:42:52 +0900 (Tue, 10 Oct 2017) | 4 lines

io.c: path name conversion at ARGF

* io.c (argf_next_argv): the standard conversion to path name
  should take place.
------------------------------------------------------------------------
r60150 | svn | 2017-10-10 17:58:23 +0900 (Tue, 10 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60149 | hsbt | 2017-10-10 17:58:22 +0900 (Tue, 10 Oct 2017) | 3 lines

Merge rubygems-2.6.14 changes.

  It fixed http://blog.rubygems.org/2017/10/09/unsafe-object-deserialization-vulnerability.html
------------------------------------------------------------------------
r60148 | hsbt | 2017-10-10 13:54:49 +0900 (Tue, 10 Oct 2017) | 3 lines

Removed obsoleted test for RubyToken.

  [Bug #13991][ruby-core:83188] Patch by MSP-Greg.
------------------------------------------------------------------------
r60147 | svn | 2017-10-10 11:01:01 +0900 (Tue, 10 Oct 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r60146 | hsbt | 2017-10-10 11:01:00 +0900 (Tue, 10 Oct 2017) | 6 lines

Merge rdoc-6.0.0.beta3.

  * It version introduced did you mean? feature for ri command:
    https://github.com/ruby/rdoc/pull/533
  * Removed obbsoleted ruby_token.rbb.
    [Bug #13990][ruby-core:83180]
------------------------------------------------------------------------
r60145 | svn | 2017-10-10 04:00:23 +0900 (Tue, 10 Oct 2017) | 1 line

* 2017-10-10
------------------------------------------------------------------------
r60144 | normal | 2017-10-10 04:00:22 +0900 (Tue, 10 Oct 2017) | 5 lines

webrick: avoid needless wakeup from IO.select

Since r51231 ("webrick/server.rb: stop immediately"),
there is no need to poll on the @status change every
two seconds.
------------------------------------------------------------------------
r60143 | kazu | 2017-10-09 20:20:00 +0900 (Mon, 09 Oct 2017) | 3 lines

Remove unused test files related `$SAFE>=2`

unused since r14024
------------------------------------------------------------------------
r60142 | svn | 2017-10-09 12:08:03 +0900 (Mon, 09 Oct 2017) | 1 line

* 2017-10-09
------------------------------------------------------------------------
r60141 | nobu | 2017-10-09 12:08:02 +0900 (Mon, 09 Oct 2017) | 5 lines

verconf.h.tmpl: site and vendor directories

* template/verconf.h.tmpl: disable site and vendor directories
  when removed.  based on the path by arnoldwald (arnold w) at
  [ruby-core:81563].  [Bug #13631]
------------------------------------------------------------------------
r60140 | hsbt | 2017-10-08 18:13:03 +0900 (Sun, 08 Oct 2017) | 3 lines

Removed unnecessary json loading.

  It causes test fail on http://ci.rvm.jp/results/trunk-test@frontier/101990
------------------------------------------------------------------------
r60139 | kazu | 2017-10-08 16:00:01 +0900 (Sun, 08 Oct 2017) | 1 line

Remove unnecessary `require 'thread'`
------------------------------------------------------------------------
r60138 | nobu | 2017-10-08 15:00:57 +0900 (Sun, 08 Oct 2017) | 4 lines

parse.y: fix a typo

* parse.y (f_kw): fix typo.  needs the argument value, not the
  label twice.  [ruby-core:83174] [Bug #13987]
------------------------------------------------------------------------
r60137 | nobu | 2017-10-08 14:14:18 +0900 (Sun, 08 Oct 2017) | 5 lines

.gdbinit: newline at rp_id [ci skip]

* .gdbinit (rp_id): add a newline.

* .gdbinit (print_id): should not print a newline here.
------------------------------------------------------------------------
r60136 | svn | 2017-10-08 10:32:22 +0900 (Sun, 08 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60135 | svn | 2017-10-08 10:32:22 +0900 (Sun, 08 Oct 2017) | 1 line

* remove trailing spaces, append newline at EOF.
------------------------------------------------------------------------
r60134 | svn | 2017-10-08 10:32:20 +0900 (Sun, 08 Oct 2017) | 1 line

* 2017-10-08
------------------------------------------------------------------------
r60133 | hsbt | 2017-10-08 10:32:18 +0900 (Sun, 08 Oct 2017) | 4 lines

Merge rubygems master.

  This is RC version of Rubygems 2.7.0.
  https://github.com/rubygems/rubygems/commit/688fb7e83c13c3fe7c2bb03c49a2db4c82852aee
------------------------------------------------------------------------
r60132 | svn | 2017-10-07 11:23:28 +0900 (Sat, 07 Oct 2017) | 1 line

* 2017-10-07
------------------------------------------------------------------------
r60131 | nobu | 2017-10-07 11:23:27 +0900 (Sat, 07 Oct 2017) | 5 lines

zlib.c: ensure to free

* ext/zlib/zlib.c (zlib_gunzip): gz0 is a structure variable on
  the stack, no longer valid after exit by an exception.  ensure
  to free instead.  [Bug #13982]
------------------------------------------------------------------------
r60130 | nobu | 2017-10-06 22:41:37 +0900 (Fri, 06 Oct 2017) | 4 lines

zlib.c: memory leak in gunzip

* ext/zlib/zlib.c (zlib_gunzip): clear zstream to fix memory leak.
  [ruby-core:83162] [Bug #13982]
------------------------------------------------------------------------
r60129 | naruse | 2017-10-06 20:17:38 +0900 (Fri, 06 Oct 2017) | 6 lines

configure.ac: detect mandoc and set MANTYPE=doc

OpenBSD uses mandoc [Feature #13981] [ruby-core:83146]
Note: AC_PATH_PROGS_FEATURE_CHECK is autoconf 2.62 feature,
but current CRuby declares AC_PREREQ(2.67); it's safe to use.
Patched by kernigh (George Koehler)
------------------------------------------------------------------------
r60128 | nobu | 2017-10-06 15:11:25 +0900 (Fri, 06 Oct 2017) | 6 lines

.gdbinit: print_id in rp_id [ci skip]

* .gdbinit (rp_id): use print_id instead of calling
  lookup_id_str() in a debugger context.

* symbol.c (ID_ENTRY_UNIT): made visible to debuggers.
------------------------------------------------------------------------
r60127 | nobu | 2017-10-06 14:55:11 +0900 (Fri, 06 Oct 2017) | 7 lines

proc.c: super_method of included method

* proc.c (method_super_method): search the next super method along
  the included ancestor chain.  [ruby-core:83114] [Bug #13973]

* vm_method.c (rb_callable_method_entry_without_refinements):
  return the defined class.
------------------------------------------------------------------------
r60126 | nobu | 2017-10-06 14:55:10 +0900 (Fri, 06 Oct 2017) | 1 line

proc.c: prefer name method result to inspect
------------------------------------------------------------------------
r60125 | nobu | 2017-10-06 09:15:08 +0900 (Fri, 06 Oct 2017) | 4 lines

No more ubygems in trunk

[Fix GH-1711]
Author:    MSP-Greg <MSP-Greg@users.noreply.github.com>
------------------------------------------------------------------------
r60124 | svn | 2017-10-06 06:53:54 +0900 (Fri, 06 Oct 2017) | 1 line

* 2017-10-06
------------------------------------------------------------------------
r60123 | normal | 2017-10-06 06:53:54 +0900 (Fri, 06 Oct 2017) | 7 lines

webrick: avoid unnecessary IO#sync= call

Sockets and pipes are always created with FMODE_SYNC flag
already set (otherwise many things would be broken).

* lib/webrick/server.rb (accept_client): remove unnecessary
  IO#sync= call
------------------------------------------------------------------------
r60122 | hsbt | 2017-10-05 17:32:01 +0900 (Thu, 05 Oct 2017) | 8 lines

Fixed broken `bundle gem` command.

  This patch is provided by @gyugyu (Yusuke Yagyu)

  * Remove README* entry from no_install that there is no README* files except README.md.tt
  * Rename .travis.yml.tt to travis.yml.tt like gitignore.tt

  [Bug #13975][ruby-dev:50278][fix GH-1710]
------------------------------------------------------------------------
r60121 | nobu | 2017-10-05 11:35:58 +0900 (Thu, 05 Oct 2017) | 5 lines

io.c: [DOC] about buffering [ci skip]

* io.c (rb_file_initialize): [DOC] stated that non-tty file is
  buffered by the default, and added links to related methods.
  [ruby-core:83081] [Bug #13965]
------------------------------------------------------------------------
r60120 | nobu | 2017-10-05 10:53:22 +0900 (Thu, 05 Oct 2017) | 4 lines

parse.y: fix KWD2EID

* parse.y (KWD2EID): should respect the previous callback result
  for keywords.  [ruby-core:83106] [Bug #13971]
------------------------------------------------------------------------
r60119 | hsbt | 2017-10-05 10:43:47 +0900 (Thu, 05 Oct 2017) | 1 line

Fixed invalid gemspec.
------------------------------------------------------------------------
r60118 | svn | 2017-10-05 10:30:09 +0900 (Thu, 05 Oct 2017) | 1 line

* 2017-10-05
------------------------------------------------------------------------
r60117 | hsbt | 2017-10-05 10:30:08 +0900 (Thu, 05 Oct 2017) | 3 lines

Followed up [ruby-core:83093]. Update gemspec attributes.

  Added metadata for rubygems.org.
------------------------------------------------------------------------
r60116 | nobu | 2017-10-04 15:47:29 +0900 (Wed, 04 Oct 2017) | 13 lines

parse.y: fix var_field

* parse.y (mlhs_node): dispatch var_field as well as lhs.

* parse.y (lhs, var_hs): dispatch var_field before assignable
  check so it is inside assign_error at a wrong assignment, as
  well as backref_assign_error.

* parse.y (var_field_gen): wrap var_field value with the variable
  ID.

* parse.y (assignable_gen, const_decl_gen): return the callback
  result on a syntax error.
------------------------------------------------------------------------
r60115 | nobu | 2017-10-04 14:48:33 +0900 (Wed, 04 Oct 2017) | 4 lines

parse.y: reserved words as <id>

* parse.y (reswords): declare reserved words as <id> to remove
  extra cast.
------------------------------------------------------------------------
r60114 | nobu | 2017-10-04 14:30:44 +0900 (Wed, 04 Oct 2017) | 4 lines

test_sexp.rb: test for fname

* test/ripper/test_sexp.rb (test_def_fname): test for fname in def
  statement.  [ruby-core:83089] [Bug #13967]
------------------------------------------------------------------------
r60113 | nobu | 2017-10-04 13:43:00 +0900 (Wed, 04 Oct 2017) | 4 lines

parse.y: Revert r60102

* parse.y (op): do not set event ID here to dispatch on_op.
  [ruby-core:83089] [Bug #13967]
------------------------------------------------------------------------
r60112 | svn | 2017-10-04 09:04:52 +0900 (Wed, 04 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60111 | normal | 2017-10-04 09:04:51 +0900 (Wed, 04 Oct 2017) | 23 lines

Dir.empty? releases GVL

This converts all slow syscalls in the Dir.empty? implementation
to release GVL.  We avoid unnecessarily GVL release and
reacquire for each slow call (opendir, readdir, closedir) and
instead only release and acquire the GVL once in the common
case.

Benchmark results show a small degradation in single-threaded
performance:
Execution time (sec)
name	trunk	built
dir_empty_p	0.689	0.758

Speedup ratio: compare with the result of `trunk' (greater is better)
name	built
dir_empty_p	0.909

* dir.c (rb_gc_for_fd_with_gvl): new function
  (nogvl_dir_empty_p): ditto
  (dir_s_empty_p): use new functions to release GVL
* benchmark/bm_dir_empty_p.rb: new benchmark
  [ruby-core:83071] [Feature #13958]
------------------------------------------------------------------------
r60110 | normal | 2017-10-04 08:47:53 +0900 (Wed, 04 Oct 2017) | 17 lines

file.c: release GVL around lstat(2)

Like stat(2), lstat(2) can be expensive on slow filesystems and
should not block other threads.  There should be a minor, but
not significant slowdowns in single-threaded performance similar
to benchmarks around the more-portable stat(2):
[ruby-core:83012] [Bug #13941]

* file.c (no_gvl_lstat): new function for rb_thread_call_without_gvl
  (lstat_without_gvl): new wrapper to replace lstat(2) calls
  (rb_file_s_lstat): s/lstat/&_without_gvl/
  (rb_file_lstat): ditto
  (rb_file_symlink_p): ditto
  (rb_file_s_ftype): ditto
  (rb_file_expand_path_internal): ditto
  (realpath_rec): ditto
  [ruby-core:83075] [Feature #13963]
------------------------------------------------------------------------
r60109 | svn | 2017-10-04 08:47:30 +0900 (Wed, 04 Oct 2017) | 1 line

* 2017-10-04
------------------------------------------------------------------------
r60108 | normal | 2017-10-04 08:47:29 +0900 (Wed, 04 Oct 2017) | 3 lines

file.c: release GVL in File.{setuid?,setgid?,sticky?}

* file.c (check3rdbyte): use rb_stat to release GVL
------------------------------------------------------------------------
r60107 | kazu | 2017-10-03 21:06:14 +0900 (Tue, 03 Oct 2017) | 1 line

Fix leaked file descriptor
------------------------------------------------------------------------
r60106 | nobu | 2017-10-03 16:51:37 +0900 (Tue, 03 Oct 2017) | 1 line

test_parser_events.rb: backref_assign_error
------------------------------------------------------------------------
r60105 | nobu | 2017-10-03 13:56:23 +0900 (Tue, 03 Oct 2017) | 5 lines

parse.y: extract callback results

* parse.y: stripping wrapping NODEs from ripper callback results,
  when storing in Array objects.  NODEs must not appear in Ruby
  level.
------------------------------------------------------------------------
r60104 | nobu | 2017-10-03 13:47:13 +0900 (Tue, 03 Oct 2017) | 1 line

parse.y: set ripper event IDs to keyword variables
------------------------------------------------------------------------
r60103 | svn | 2017-10-03 10:38:54 +0900 (Tue, 03 Oct 2017) | 1 line

* 2017-10-03
------------------------------------------------------------------------
r60102 | nobu | 2017-10-03 10:38:52 +0900 (Tue, 03 Oct 2017) | 1 line

parse.y: set ripper event ID symbols to operators
------------------------------------------------------------------------
r60101 | nobu | 2017-10-02 21:23:17 +0900 (Mon, 02 Oct 2017) | 1 line

use rb_hash_new_with_size()
------------------------------------------------------------------------
r60100 | nobu | 2017-10-02 20:43:36 +0900 (Mon, 02 Oct 2017) | 5 lines

test_call.rb: refine test_safe_call

* test/ruby/test_call.rb (test_safe_call): rhs should not be
  evaluated when the receiver is nil.  simplified the assertion
  for  [Bug #13964].
------------------------------------------------------------------------
r60099 | nobu | 2017-10-02 17:33:30 +0900 (Mon, 02 Oct 2017) | 5 lines

compile.c: fix stack consitency error

* compile.c (iseq_compile_each0): fix stack consitency error on
  attr-assign with safe navigation operator when the receiver is
  nil, should pop it too.  [ruby-core:83078] [Bug #13964]
------------------------------------------------------------------------
r60098 | glass | 2017-10-02 16:51:27 +0900 (Mon, 02 Oct 2017) | 3 lines

Revert "vm_eval.c: add rb_yield_assoc_or_values()"

This reverts commit r60095 to prevent performance degradation.
------------------------------------------------------------------------
r60097 | nobu | 2017-10-02 15:46:42 +0900 (Mon, 02 Oct 2017) | 5 lines

io.c: check null char

* io.c (ruby_set_inplace_mode): check if null is contained.  based
  on the patch by tommy (Masahiro Tomita) in [ruby-dev:50272].
  [Bug #13960]
------------------------------------------------------------------------
r60096 | nobu | 2017-10-02 15:46:41 +0900 (Mon, 02 Oct 2017) | 7 lines

test_argf.rb: indent here docs

* test/ruby/test_argf.rb (assert_src_expected): default line
  number to caller's location.

* test/ruby/test_argf.rb (test_lineno, test_lineno2): get rid of a
  bug of wrong indentation after $. in Emacs 25.3 ruby-mode.el
------------------------------------------------------------------------
r60095 | glass | 2017-10-02 14:29:11 +0900 (Mon, 02 Oct 2017) | 11 lines

vm_eval.c: add rb_yield_assoc_or_values()

The new function rb_yield_assoc_or_values() will reduce branching.

* vm_eval.c: add rb_yield_assoc_or_values()

* internal.h: ditto

* hash.c: use rb_yield_assoc_or_values()

* struct.c: ditto
------------------------------------------------------------------------
r60094 | nobu | 2017-10-02 13:06:55 +0900 (Mon, 02 Oct 2017) | 1 line

ruby-additional.el: shorten here-doc markers
------------------------------------------------------------------------
r60093 | ko1 | 2017-10-02 10:57:27 +0900 (Mon, 02 Oct 2017) | 5 lines

use `ra` instead of new variables.

* file.c (rb_file_s_rename): `struct rename_args ra` already has members
  which contain C ptrs. Pointed by MSP-Greg. Thanks!

------------------------------------------------------------------------
r60092 | ko1 | 2017-10-02 10:22:11 +0900 (Mon, 02 Oct 2017) | 4 lines

catch up r60088 for DOSISH.

* file.c (rb_file_s_rename): src and dst are used only on DOSISH env.

------------------------------------------------------------------------
r60091 | normal | 2017-10-02 06:29:27 +0900 (Mon, 02 Oct 2017) | 5 lines

NEWS: entries for GVL release in File and Dir

(more to come)

* NEWS: updates for [Bug #13941] and [Feature #13951]
------------------------------------------------------------------------
r60090 | svn | 2017-10-02 06:19:25 +0900 (Mon, 02 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60089 | svn | 2017-10-02 06:19:25 +0900 (Mon, 02 Oct 2017) | 1 line

* 2017-10-02
------------------------------------------------------------------------
r60088 | normal | 2017-10-02 06:19:24 +0900 (Mon, 02 Oct 2017) | 23 lines

File#rename releases GVL

rename(2) requires two pathname resolution operations which can
take considerable time on slow filesystems, release the GVL so
operations on other threads may proceed.

On fast, local filesystems, this change results in some slowdown
as shown by the new benchmark.  I consider the performance trade
off acceptable as cases are avoided.

benchmark results:
minimum results in each 3 measurements.
Execution time (sec)
name	trunk	built
file_rename	2.648	2.804

Speedup ratio: compare with the result of `trunk' (greater is better)
name	built
file_rename	0.944

* file.c (no_gvl_rename): new function
  (rb_file_s_rename): release GVL for renames
* benchmark/bm_file_rename.rb: new benchmark
------------------------------------------------------------------------
r60087 | svn | 2017-10-01 22:44:50 +0900 (Sun, 01 Oct 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60086 | glass | 2017-10-01 22:44:49 +0900 (Sun, 01 Oct 2017) | 7 lines

string.c: avoid unnecessary call of str_strlen()

* string.c (rb_strseq_index): refactor and avoid
  call of str_strlen() when offset == 0.
  it will improve performance of String#index and #include?

* benchmark/bm_string_index.rb: benchmark for this change
------------------------------------------------------------------------
r60085 | glass | 2017-10-01 13:26:25 +0900 (Sun, 01 Oct 2017) | 9 lines

use rb_hash_new_with_size()

* hash.c: use rb_hash_new_with_size().

* marshal.c: ditto

* struct.c: ditto

* vm_args.c: ditto
------------------------------------------------------------------------
r60084 | nobu | 2017-10-01 12:46:59 +0900 (Sun, 01 Oct 2017) | 1 line

common.mk (UNICODE_DOWNLOAD): set cache directory
------------------------------------------------------------------------
r60083 | nobu | 2017-10-01 11:39:22 +0900 (Sun, 01 Oct 2017) | 3 lines

generic_erb.rb: -i option

* tool/generic_erb.rb: -i option to merge multiple template files.
------------------------------------------------------------------------
r60082 | nobu | 2017-10-01 11:24:11 +0900 (Sun, 01 Oct 2017) | 5 lines

test_refinement.rb: test for r59946

* test/ruby/test_refinement.rb (test_dsym_literal): test for
  r59946, interning dynamic symbol should not be affected by
  refinements too.
------------------------------------------------------------------------
r60081 | normal | 2017-10-01 10:44:47 +0900 (Sun, 01 Oct 2017) | 12 lines

file.c: remove unnecessary volatile use

For apply2files, all callers use the `path' VALUE for
generating exceptions, so there is no need to guard it.
In realpath_rec, RB_GC_GUARD is already used on link_orig.

In rb_check_realpath_internal, RB_GC_GUARD is necessary and
preferable (see Appendix E. of doc/extension.rdoc)

* file.c (apply2files): remove unnecessary volatile
  (realpath_rec): ditto
  (rb_check_realpath_internal): ditto, and add RB_GC_GUARD
------------------------------------------------------------------------
r60080 | svn | 2017-10-01 06:50:42 +0900 (Sun, 01 Oct 2017) | 1 line

* 2017-10-01
------------------------------------------------------------------------
r60079 | normal | 2017-10-01 06:50:42 +0900 (Sun, 01 Oct 2017) | 6 lines

thread_pthread.c: do not wakeup inside child processes

* thread_pthread.c (rb_thread_wakeup_timer_thread): check
  ownership before incrementing
  (rb_thread_wakeup_timer_thread_low): ditto
  [Bug #13794] [ruby-core:83064]
------------------------------------------------------------------------
r60078 | glass | 2017-09-30 22:14:09 +0900 (Sat, 30 Sep 2017) | 1 line

hash.c: use rb_hash_new_with_size()
------------------------------------------------------------------------
r60077 | nobu | 2017-09-30 21:26:23 +0900 (Sat, 30 Sep 2017) | 4 lines

eval.c: check type

* eval.c (ignored_block): check argument type, which must be
  Module.  [ruby-dev:50270] [Bug #13956]
------------------------------------------------------------------------
r60076 | glass | 2017-09-30 20:58:33 +0900 (Sat, 30 Sep 2017) | 9 lines

hash.c: remove special treatments on deletion

st.c was improved in r56650 that it permits deletion during iteration.
In this commit, special treatments for previous implementation are
removed.

* hash.c: don't use *_check and *_safe functions in st.c

* internal.h: remove HASH_DELETED flag
------------------------------------------------------------------------
r60075 | nobu | 2017-09-30 20:50:14 +0900 (Sat, 30 Sep 2017) | 1 line

dbm.c: suppress unused-but-set-variable warning
------------------------------------------------------------------------
r60074 | nobu | 2017-09-30 20:06:05 +0900 (Sat, 30 Sep 2017) | 1 line

gdbm.c: use the default external encoding
------------------------------------------------------------------------
r60073 | glass | 2017-09-30 18:27:30 +0900 (Sat, 30 Sep 2017) | 4 lines

configure.ac: remove --enable-pthread option.

* configure.ac: remove --enable-pthread option.
  it was obsoleted in 2009.
------------------------------------------------------------------------
r60072 | nobu | 2017-09-30 18:07:13 +0900 (Sat, 30 Sep 2017) | 1 line

dbm.c: removed useless assignments
------------------------------------------------------------------------
r60071 | nobu | 2017-09-30 17:35:23 +0900 (Sat, 30 Sep 2017) | 3 lines

ext: check if null byte is contained

[ruby-dev:50267] [Bug #13953]
------------------------------------------------------------------------
r60070 | glass | 2017-09-30 15:45:24 +0900 (Sat, 30 Sep 2017) | 1 line

configure.ac: remove unused macro
------------------------------------------------------------------------
r60069 | nobu | 2017-09-30 15:42:24 +0900 (Sat, 30 Sep 2017) | 1 line

ripper/lexer.rb: remove double quotes
------------------------------------------------------------------------
r60068 | glass | 2017-09-30 15:30:44 +0900 (Sat, 30 Sep 2017) | 4 lines

configure.ac: use m4_version_prereq

* configure.ac: use m4_version_prereq to check
  running autoconf version.
------------------------------------------------------------------------
r60067 | ktsj | 2017-09-30 12:31:32 +0900 (Sat, 30 Sep 2017) | 4 lines

test_find.rb: improve branch coverage

* test/test_find.rb (test_to_path): add a test
  for to_path conversion.
------------------------------------------------------------------------
r60066 | nobu | 2017-09-30 09:01:23 +0900 (Sat, 30 Sep 2017) | 5 lines

string.c: fix ASCII-only on succ

* string.c (str_succ): clear coderange cache when no alpha-numeric
  character case, carried part may become ASCII-only.
  [ruby-core:83062] [Bug #13952]
------------------------------------------------------------------------
r60065 | nobu | 2017-09-30 08:41:19 +0900 (Sat, 30 Sep 2017) | 4 lines

sizes.c.tmpl: prototype

* template/sizes.c.tmpl (Init_limits): turned a K&R style
  declaration into a prototype declaration.
------------------------------------------------------------------------
r60064 | svn | 2017-09-30 02:19:38 +0900 (Sat, 30 Sep 2017) | 1 line

* 2017-09-30
------------------------------------------------------------------------
r60063 | sonots | 2017-09-30 02:19:37 +0900 (Sat, 30 Sep 2017) | 5 lines

test_etc.rb: fix test_getgrnam for duplicated group names

* test/etc/test_etc.rb: Etc.getgrnam would not return the first entry in the order of Etc.group for duplicated group names.

follow-up: [Bug #6935]
------------------------------------------------------------------------
r60062 | nobu | 2017-09-29 22:21:17 +0900 (Fri, 29 Sep 2017) | 8 lines

configure.ac

* configure.ac: renamed configure.in.  [Feature #13946]

* Makefile.in, common.mk, ext/rbconfig/sizeof/depend: use
  configure.ac.

* README.ja.md, README.md: update document for configure.ac.
------------------------------------------------------------------------
r60061 | kazu | 2017-09-29 20:00:00 +0900 (Fri, 29 Sep 2017) | 3 lines

Use unpack1 instead of unpack and `[0]`

[Feature #13943][ruby-core:83027]
------------------------------------------------------------------------
r60060 | nobu | 2017-09-29 17:15:50 +0900 (Fri, 29 Sep 2017) | 4 lines

string.c: ASCII-incompatible is not ASCII only

* string.c (tr_trans): ASCII-incompatible encoding strings cannot
  be ASCII-only even if valid.  [ruby-core:83056] [Bug #13950]
------------------------------------------------------------------------
r60059 | nobu | 2017-09-29 17:00:47 +0900 (Fri, 29 Sep 2017) | 4 lines

pack.c: unpack "M" may be ASCII only

* pack.c (pack_unpack_internal): set ASCII only properly on "M",
  may be ASCII only.  [ruby-core:83055] [Bug #13949]
------------------------------------------------------------------------
r60058 | svn | 2017-09-29 16:43:23 +0900 (Fri, 29 Sep 2017) | 1 line

* 2017-09-29
------------------------------------------------------------------------
r60057 | nobu | 2017-09-29 16:43:22 +0900 (Fri, 29 Sep 2017) | 47 lines

array.c: improve operations on small arrays

[Feature #13884]

Reduce number of memory allocations for "and", "or" and "diff"
operations on small arrays

Very often, arrays are used to filter parameters and to select
interesting items from 2 collections and very often these
collections are small enough, for example:

```ruby
SAFE_COLUMNS = [:id, :title, :created_at]

def columns
  @all_columns & SAFE_COLUMNS
end
```

In this patch, I got rid of unnecessary memory allocations for
small arrays when "and", "or" and "diff" operations are performed.

name             | HEAD  | PATCH
-----------------+------:+------:
array_small_and  | 0.615 | 0.263
array_small_diff | 0.676 | 0.282
array_small_or   | 0.953 | 0.463

name             | PATCH
-----------------+------:
array_small_and  | 2.343
array_small_diff | 2.392
array_small_or   | 2.056

name             | HEAD  | PATCH
-----------------+------:+------:
array_small_and  | 1.429 | 1.005
array_small_diff | 1.493 | 0.878
array_small_or   | 1.672 | 1.152

name             | PATCH
-----------------+------:
array_small_and  | 1.422
array_small_diff | 1.700
array_small_or   | 1.452

Author:    Dmitry Bochkarev <dimabochkarev@gmail.com>
------------------------------------------------------------------------
r60056 | shirosaki | 2017-09-28 22:55:48 +0900 (Thu, 28 Sep 2017) | 6 lines

test_dln.rb: fix path separator on MinGW

* test/-ext-/win32/test_dln.rb (TestDln#test_check_imported):
  RbConfig::CONFIG["PATH_SEPARATOR"] is : which is a separator on
  msys2 shell building ruby. Use File::PATH_SEPARATOR ; on test.
  [Bug #13642] [ruby-core:81623]
------------------------------------------------------------------------
r60055 | shirosaki | 2017-09-28 22:43:21 +0900 (Thu, 28 Sep 2017) | 9 lines

io.c: fix segfault with closing socket on Windows

* io.c (fptr_finalize_flush): add an argument to keep GVL.
* io.c (fptr_finalize): adjust for above change.
* io.c (io_close_fptr): closing without GVL causes another
  exception while raising exception in another thread. This causes
  segfault on Windows. Keep GVL while closing when another thread
  raises.
  [Bug #13856] [ruby-core:82602]
------------------------------------------------------------------------
r60054 | naruse | 2017-09-28 19:51:37 +0900 (Thu, 28 Sep 2017) | 1 line

Net::HTTP.new: Support no_proxy parameter [Feature #11195]
------------------------------------------------------------------------
r60053 | naruse | 2017-09-28 19:51:31 +0900 (Thu, 28 Sep 2017) | 3 lines

URI::Generic: Separate no_proxy handling

To share with Net::HTTP. see #11195
------------------------------------------------------------------------
r60052 | svn | 2017-09-28 18:20:00 +0900 (Thu, 28 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r60051 | eregon | 2017-09-28 18:19:59 +0900 (Thu, 28 Sep 2017) | 1 line

Update to ruby/spec@691755d
------------------------------------------------------------------------
r60050 | eregon | 2017-09-28 18:19:19 +0900 (Thu, 28 Sep 2017) | 1 line

Update to ruby/mspec@c135328
------------------------------------------------------------------------
r60049 | nobu | 2017-09-28 11:51:41 +0900 (Thu, 28 Sep 2017) | 4 lines

test_io_console.rb: flush

* test/io/console/test_io_console.rb: flush to ensure the second
  data is sent.
------------------------------------------------------------------------
r60048 | svn | 2017-09-28 06:55:33 +0900 (Thu, 28 Sep 2017) | 1 line

* 2017-09-28
------------------------------------------------------------------------
r60047 | naruse | 2017-09-28 06:55:32 +0900 (Thu, 28 Sep 2017) | 4 lines

Remove DevKit path, change zlib link

by MSP-Greg <MSP-Greg@users.noreply.github.com>
fix https://github.com/ruby/ruby/pull/1708
------------------------------------------------------------------------
r60046 | kazu | 2017-09-27 21:32:57 +0900 (Wed, 27 Sep 2017) | 1 line

Fix exception class [ci skip]
------------------------------------------------------------------------
r60045 | duerst | 2017-09-27 16:47:13 +0900 (Wed, 27 Sep 2017) | 1 line

improve grammar in documentation of Array#bsearch [ci skip]
------------------------------------------------------------------------
r60044 | nobu | 2017-09-27 14:27:07 +0900 (Wed, 27 Sep 2017) | 1 line

pty.c: shrink repeated device names
------------------------------------------------------------------------
r60043 | nobu | 2017-09-27 14:27:06 +0900 (Wed, 27 Sep 2017) | 1 line

objspace_dump.c: remove unnecessary break
------------------------------------------------------------------------
r60042 | nobu | 2017-09-27 14:08:53 +0900 (Wed, 27 Sep 2017) | 1 line

ext: adjust indent [ci skip]
------------------------------------------------------------------------
r60041 | nobu | 2017-09-27 11:55:03 +0900 (Wed, 27 Sep 2017) | 4 lines

complex.c: no overflow

* complex.c (rb_complex_infinite_p): get rid of overflow and
  unnecessary multiplication.
------------------------------------------------------------------------
r60040 | nobu | 2017-09-27 11:38:51 +0900 (Wed, 27 Sep 2017) | 4 lines

complex.c: no overflow

* complex.c (rb_complex_finite_p): get rid of overflow and
  unnecessary multiplication.
------------------------------------------------------------------------
r60039 | svn | 2017-09-27 10:01:27 +0900 (Wed, 27 Sep 2017) | 1 line

* 2017-09-27
------------------------------------------------------------------------
r60038 | nobu | 2017-09-27 10:01:26 +0900 (Wed, 27 Sep 2017) | 1 line

* complex.c: fix Complex#infinite? return value. Because nucomp_abs never returns negative value.
------------------------------------------------------------------------
r60037 | nobu | 2017-09-27 08:28:07 +0900 (Wed, 27 Sep 2017) | 4 lines

Show rb_data_type_t definition [ci skip]

[Fix GH-1707]
Author:    hkdnet <hkdnet@users.noreply.github.com>
------------------------------------------------------------------------
r60036 | nobu | 2017-09-27 08:28:06 +0900 (Wed, 27 Sep 2017) | 4 lines

Fix a reference [ci skip]

[Fix GH-1706]
Author:    hkdnet <hkdnet@users.noreply.github.com>
------------------------------------------------------------------------
r60035 | naruse | 2017-09-26 23:00:25 +0900 (Tue, 26 Sep 2017) | 4 lines

Make retries for Net::HTTP configurable [Feature #10674]

by stereobooster
fix https://github.com/ruby/ruby/pull/1654
------------------------------------------------------------------------
r60034 | nobu | 2017-09-26 22:40:14 +0900 (Tue, 26 Sep 2017) | 1 line

parse.y: moved duplicate conditions
------------------------------------------------------------------------
r60033 | nobu | 2017-09-26 21:21:51 +0900 (Tue, 26 Sep 2017) | 1 line

Suppress warnings by other than self-assignments
------------------------------------------------------------------------
r60032 | k0kubun | 2017-09-26 20:50:07 +0900 (Tue, 26 Sep 2017) | 13 lines

erb.rb: drop unreachable method

This seems to be unreachable from first introduction at r21286.

In ERB implementation, `#empty?` is only called for each member of
return value of `String#scan`, and `ERB::Compiler::PercentLine` is never
returned from `String#scan`.

Also, in `ERB::Compiler#compile`, as it's yielded only when stag is nil,
methods called to `ERB::Compiler::PercentLine` object yielded from
`ERB::Compiler::TrimScanner#scan` are only: `#nil?`, `#==`, `to_s`.

Thus `ERB::Compiler::PercentLine#empty?` is never used.
------------------------------------------------------------------------
r60031 | k0kubun | 2017-09-26 20:30:45 +0900 (Tue, 26 Sep 2017) | 1 line

test_erb.rb: add test cases for uncovered methods
------------------------------------------------------------------------
r60030 | k0kubun | 2017-09-26 19:45:14 +0900 (Tue, 26 Sep 2017) | 3 lines

test_features.rb: fix unused variable warning

test/csv/test_features.rb:357: warning: assigned but unused variable - csv
------------------------------------------------------------------------
r60029 | mame | 2017-09-26 13:59:39 +0900 (Tue, 26 Sep 2017) | 1 line

run-lcov.rb: support overwritten tmpdir path
------------------------------------------------------------------------
r60028 | mame | 2017-09-26 13:51:09 +0900 (Tue, 26 Sep 2017) | 1 line

tool/run-lcov.rb: Filter tmp files out
------------------------------------------------------------------------
r60027 | nobu | 2017-09-26 13:13:37 +0900 (Tue, 26 Sep 2017) | 28 lines

Release gvl while doing (f)stat

At the moment rb_stat function is blocking. This patch changes the
behaviour to release the gvl while waiting for OS to return from
f(stat).

There is behaviour impact, but not significant (times are for 100000
iterations):

   $ ~/releaseruby_patch/bin/ruby bench.rb
Rehearsal ------------------------------------------------
File.exist?:   0.036412   0.056616   0.093028 (  0.093075)
--------------------------------------- total: 0.093028sec

                   user     system      total        real
File.exist?:   0.042953   0.049783   0.092736 (  0.092804)

   $ ~/releaseruby_no_patch/bin/ruby bench.rb
Rehearsal ------------------------------------------------
File.exist?:   0.056094   0.026293   0.082387 (  0.082389)
--------------------------------------- total: 0.082387sec

                   user     system      total        real
File.exist?:   0.037250   0.046702   0.083952 (  0.083956)

Based on the patch by Wolf <wolf@wolfsden.cz> at [ruby-core:83012],
with using `rb_thread_io_blocking_region` for `fstat`.
[Bug #13941]
------------------------------------------------------------------------
r60026 | nobu | 2017-09-26 09:07:41 +0900 (Tue, 26 Sep 2017) | 5 lines

test_drb.rb: removed extra spaces

* test/drb/test_drb.rb (TestDRbLarge#test_02_large_ary): removed
  unnecessary extra spaces which make the following parentheses an
  expression.
------------------------------------------------------------------------
r60025 | nobu | 2017-09-26 06:52:00 +0900 (Tue, 26 Sep 2017) | 4 lines

vm.c: unused function

* vm.c (rb_vm_jump_tag_but_local_jump): no longer used since
  r51292.
------------------------------------------------------------------------
r60024 | nobu | 2017-09-26 06:51:56 +0900 (Tue, 26 Sep 2017) | 5 lines

vm.c: fetch retval iff necessary

* vm.c (rb_vm_make_jump_tag_but_local_jump): get rid of fetching
  retval when it is not used.  it is necessary for local jump
  state only.
------------------------------------------------------------------------
r60023 | svn | 2017-09-26 02:38:43 +0900 (Tue, 26 Sep 2017) | 1 line

* 2017-09-26
------------------------------------------------------------------------
r60022 | naruse | 2017-09-26 02:38:42 +0900 (Tue, 26 Sep 2017) | 4 lines

Switch Build to use 2.4 with certs files

patched by MSP-Greg <MSP-Greg@users.noreply.github.com>
fix https://github.com/ruby/ruby/pull/1702
------------------------------------------------------------------------
r60021 | naruse | 2017-09-25 23:28:53 +0900 (Mon, 25 Sep 2017) | 1 line

HTTPHeader#add_field should allow binary [Bug #13926]
------------------------------------------------------------------------
r60020 | mame | 2017-09-25 23:04:59 +0900 (Mon, 25 Sep 2017) | 3 lines

tool/run-lcov.rb: Filter test files out

And refactoring.
------------------------------------------------------------------------
r60019 | naruse | 2017-09-25 17:19:10 +0900 (Mon, 25 Sep 2017) | 7 lines

Fix overflow detection for LLP64 arch [Bug #13748]

FIXNUMs are expected to fit into a long type, but the test is about a
VALUE type. Since long is < than VALUE on LLP64, the overflow is not
detected. As a result "2**31" evaluates to "-2147483648" on Windows with
gcc-7.1.0.
patched by Lars Kanis <lars@greiz-reinsdorf.de>
------------------------------------------------------------------------
r60018 | nobu | 2017-09-25 15:31:38 +0900 (Mon, 25 Sep 2017) | 6 lines

configure.in: install_name without teeny

* configure.in (RUBY_API_VERSION): remove teeny from install_name
  to allow link extension libraries for the same minor version.
  patched by kimuraw (Wataru Kimura) at [ruby-dev:50262].
  [Bug #13931]
------------------------------------------------------------------------
r60017 | naruse | 2017-09-25 15:20:10 +0900 (Mon, 25 Sep 2017) | 1 line

Time#at receives 3rd argument which specifies the unit of 2nd argument [Feature #13919]
------------------------------------------------------------------------
r60016 | sonots | 2017-09-25 15:05:52 +0900 (Mon, 25 Sep 2017) | 3 lines

thread.c: Use 'Class.new' instead of 'Class::new' in doc codes.

patched by Herwin [Fix GH-1700]
------------------------------------------------------------------------
r60015 | yui-knk | 2017-09-25 09:09:44 +0900 (Mon, 25 Sep 2017) | 8 lines

test/ruby/test_iseq.rb: Skip test_safe_call_chain if Coverage is running.

Follow up to r59990.
When Coverage is running, trace2 instructions are inserted
to take branch coverages for safe method invocations.
This insertion makes safe call chains unable to be optimized
and breaks this test case.
So we test it only when Coverage is not running.
------------------------------------------------------------------------
r60014 | svn | 2017-09-25 01:26:23 +0900 (Mon, 25 Sep 2017) | 1 line

* 2017-09-25
------------------------------------------------------------------------
r60013 | rhe | 2017-09-25 01:26:22 +0900 (Mon, 25 Sep 2017) | 32 lines

openssl: import e72d960db262

Sync with master branch of ruby/openssl.git to import changes in
v2.1.0.beta1..v2.0.6. The commit log since v2.1.0.beta1 which was
imported by r59734 can be found at:

	https://github.com/ruby/openssl/compare/v2.1.0.beta1...e72d960db262

----------------------------------------------------------------
Kazuki Yamaguchi (16):
      test/test_pair: fix test_write_nonblock{,_no_exceptions}
      x509name: fix a typo in docs
      test/test_fips: skip if setting FIPS mode fails
      test/test_asn1: fix possible failure in test_utctime
      test/test_ssl: suppress warning in test_alpn_protocol_selection_cancel
      test/test_pair: disable compression
      test/test_ssl: skip tmp_ecdh_callback test for LibreSSL >= 2.6.1
      test/test_ssl: do not run NPN tests for LibreSSL >= 2.6.1
      tool/ruby-openssl-docker: update
      test/test_pair: replace sleep with IO.select
      ssl: prevent SSLSocket#sysread* from leaking uninitialized data
      ossl.c: use struct CRYPTO_dynlock_value for non-dynamic locks
      ossl.c: make legacy locking callbacks reentrant
      test/test_engine: suppress stderr
      test/test_engine: check if RC4 is supported
      Ruby/OpenSSL 2.0.6

SHIBATA Hiroshi (1):
      To use upstream url of github

nobu (1):
      ruby.h: unnormalized Fixnum value
------------------------------------------------------------------------
r60012 | nobu | 2017-09-24 19:07:21 +0900 (Sun, 24 Sep 2017) | 3 lines

common.mk: force link exe/ruby

* common.mk (exe/ruby): force link exe/ruby with miniruby.
------------------------------------------------------------------------
r60011 | nobu | 2017-09-24 18:44:26 +0900 (Sun, 24 Sep 2017) | 4 lines

test_gc.rb: relax criterion

* test/ruby/test_gc.rb (TestGc#test_expand_heap): relax the
  criterion and compare by epsilon.
------------------------------------------------------------------------
r60010 | nobu | 2017-09-24 18:35:09 +0900 (Sun, 24 Sep 2017) | 4 lines

gem.rb: load rubygems.rb

* test/rubygems/test_gem.rb: load rubygems.rb explicitly, for the
  case configured as --disable-rubygems.
------------------------------------------------------------------------
r60009 | hsbt | 2017-09-24 17:10:08 +0900 (Sun, 24 Sep 2017) | 1 line

Added NEWS entry for r60008
------------------------------------------------------------------------
r60008 | hsbt | 2017-09-24 16:52:25 +0900 (Sun, 24 Sep 2017) | 5 lines

Removed ubygems.rb. rubygems.rb is always loaded now.

  * tool/sync_default_gems.rb: removed ubygems.rb from sync target.
  * test/rubygems/test_gem.rb: only enable "-rubygems" option when
    running under the Ruby 1.9.
------------------------------------------------------------------------
r60007 | nobu | 2017-09-24 14:22:23 +0900 (Sun, 24 Sep 2017) | 4 lines

load.c: fix rb_load_protect condition

* load.c (rb_load_protect): fix the condition to load the found
  file.  fixup of r59155.
------------------------------------------------------------------------
r60006 | nobu | 2017-09-24 10:48:25 +0900 (Sun, 24 Sep 2017) | 6 lines

ruby-runner.c: RUBYLIB

* ruby-runner.c (insert_env_path): extracted the function which
  insert path list to an environment variable.

* ruby-runner.c (main): append library paths to RUBYLIB.
------------------------------------------------------------------------
r60005 | nobu | 2017-09-24 09:15:02 +0900 (Sun, 24 Sep 2017) | 4 lines

common.mk: link exe/ruby

* common.mk (exe/ruby): make fixed name symbolic link exe/ruby to
  exe/$(PROGRAM), to run hardcoded bundler tests.
------------------------------------------------------------------------
r60004 | svn | 2017-09-24 08:58:25 +0900 (Sun, 24 Sep 2017) | 1 line

* 2017-09-24
------------------------------------------------------------------------
r60003 | mame | 2017-09-24 08:58:24 +0900 (Sun, 24 Sep 2017) | 4 lines

test/coverage/test_coverage.rb: Refactor coverage tests.

Add `assert_coverage` to invoke Ruby script under coverage measurement
and to compare the result with an expected value.
------------------------------------------------------------------------
r60002 | nobu | 2017-09-23 16:09:07 +0900 (Sat, 23 Sep 2017) | 6 lines

dup String#split return value

* string.c (rb_str_split): return duplicated receiver, when no
  splits.  patched by tompng (tomoya ishida) in [ruby-core:82911],
  and the test case by Seiei Miyagi <hanachin@gmail.com>.
  [Bug#13925] [Fix GH-1705]
------------------------------------------------------------------------
r60001 | nobu | 2017-09-23 16:09:06 +0900 (Sat, 23 Sep 2017) | 6 lines

dup String#rpartition return value

* string.c (rb_str_rpartition): return duplicated receiver, when
  no splits.  [ruby-core:82911] [Bug#13925]

Author:    Seiei Miyagi <hanachin@gmail.com>
------------------------------------------------------------------------
r60000 | nobu | 2017-09-23 16:09:05 +0900 (Sat, 23 Sep 2017) | 6 lines

dup String#partition return value

* string.c (rb_str_partition): return duplicated receiver, when no
  splits.  [ruby-core:82911] [Bug#13925]

Author:    Seiei Miyagi <hanachin@gmail.com>
------------------------------------------------------------------------
r59999 | nobu | 2017-09-23 15:49:35 +0900 (Sat, 23 Sep 2017) | 5 lines

parse.y: token type by identifer ID type

* parse.y (parse_ident): leave identifier type decision (local or
  const) to rb_enc_symname_type, and set the token type by ID
  type.
------------------------------------------------------------------------
r59998 | nobu | 2017-09-23 15:49:34 +0900 (Sat, 23 Sep 2017) | 3 lines

parse.y: missing semicolon

* parse.y (stmt_or_begin): fix missing semicolon.
------------------------------------------------------------------------
r59997 | hsbt | 2017-09-23 13:37:58 +0900 (Sat, 23 Sep 2017) | 3 lines

removed bin/bundle_ruby, It was ignored upstream gemspec.

  * spec/bundler/other/*: Marked exclude tags for ruby repository.
------------------------------------------------------------------------
r59996 | hsbt | 2017-09-23 11:57:12 +0900 (Sat, 23 Sep 2017) | 1 line

update section styles for psych, rubygems, bundler.
------------------------------------------------------------------------
r59995 | hsbt | 2017-09-23 11:55:07 +0900 (Sat, 23 Sep 2017) | 4 lines

Added sections of pysch library to LEGAL.

  * ext/psych/yaml/LICENSE: Integrate libyaml license to LEGAL and
    removed this file from repository.
------------------------------------------------------------------------
r59994 | hsbt | 2017-09-23 11:37:55 +0900 (Sat, 23 Sep 2017) | 1 line

Added bundler's license to LEGAL.
------------------------------------------------------------------------
r59993 | hsbt | 2017-09-23 11:26:10 +0900 (Sat, 23 Sep 2017) | 1 line

Added missing "ubygems.rb" file of rubygems to LEGAL.
------------------------------------------------------------------------
r59992 | hsbt | 2017-09-23 11:24:27 +0900 (Sat, 23 Sep 2017) | 1 line

Integrate LICENSE file of rubygems to LEGAL.
------------------------------------------------------------------------
r59991 | svn | 2017-09-23 09:17:36 +0900 (Sat, 23 Sep 2017) | 1 line

* 2017-09-23
------------------------------------------------------------------------
r59990 | yui-knk | 2017-09-23 09:17:35 +0900 (Sat, 23 Sep 2017) | 1 line

Enable to take branch coverages for safe method invocations
------------------------------------------------------------------------
r59989 | nobu | 2017-09-22 20:21:34 +0900 (Fri, 22 Sep 2017) | 8 lines

Update trick2013/yhara for Ruby 2.4

I need to raise LocalJumpError here (for the first "J" of the
output "JUST ANOTHER RUBY HACKER"), but this `return` does
not raise error in Ruby 2.4.

[Fix GH-1703]
Author:    Yutaka HARA <yutaka.hara+github@gmail.com>
------------------------------------------------------------------------
r59988 | nobu | 2017-09-22 13:56:24 +0900 (Fri, 22 Sep 2017) | 4 lines

numeric.c: reduced repeated calls

* numeric.c (rb_num2ll, rb_num2ull, fix_pow): turn repeated
  RFLOAT_VALUE calls into local variables.
------------------------------------------------------------------------
r59987 | svn | 2017-09-22 12:05:03 +0900 (Fri, 22 Sep 2017) | 1 line

* 2017-09-22
------------------------------------------------------------------------
r59986 | nobu | 2017-09-22 12:05:02 +0900 (Fri, 22 Sep 2017) | 5 lines

numeric.c: use NUM2DBL

* numeric.c (fix_fdiv_double), bignum.c (rb_big_fdiv_double): use
  NUM2DBL on unknown object.  RFLOAT_VALUE is only appliicable to
  T_FLOAT object.  [ruby-core:82924] [Bug #13928]
------------------------------------------------------------------------
r59985 | nobu | 2017-09-21 21:26:16 +0900 (Thu, 21 Sep 2017) | 4 lines

gmake.mk: order test-bundler

* defs/gmake.mk (ORDERED_TEST_TARGETS): order test-bundler too to
  get rid of mixing outputs.
------------------------------------------------------------------------
r59984 | nobu | 2017-09-21 16:29:20 +0900 (Thu, 21 Sep 2017) | 5 lines

load.c: real path to load

* load.c (rb_construct_expanded_load_path): expand load paths to
  real paths to get rid of duplicate loading from symbolic-linked
  directories.  [Feature #10222]
------------------------------------------------------------------------
r59983 | nobu | 2017-09-21 16:29:16 +0900 (Thu, 21 Sep 2017) | 5 lines

file.c: rb_check_realpath

* file.c (rb_check_realpath): returns real path which has no
  symbolic links.  similar to rb_realpath except for returning
  Qnil if any parts did not exist.
------------------------------------------------------------------------
r59982 | eregon | 2017-09-21 07:02:10 +0900 (Thu, 21 Sep 2017) | 4 lines

check_funcall_missing() should call respond_to_missing?(name, priv=true)

* Improve spec rather than constrain implementation.
* Coercion ignores visibility in Ruby.
------------------------------------------------------------------------
r59981 | eregon | 2017-09-21 06:50:14 +0900 (Thu, 21 Sep 2017) | 5 lines

Prefer adapting specs to complicating library code

* lib/net/ftp.rb (Net::FTP#initialize): simplify as per
  the original intent.
* spec/ruby/library/net/ftp/initialize_spec.rb: adapt specs.
------------------------------------------------------------------------
r59980 | eregon | 2017-09-21 05:19:54 +0900 (Thu, 21 Sep 2017) | 4 lines

Adapt tools to follow spec/rubyspec => spec/ruby rename

* [Misc #13792] [ruby-core:82287]
* Prefer test-spec over test-rubyspec in spec/README.
------------------------------------------------------------------------
r59979 | eregon | 2017-09-21 05:18:52 +0900 (Thu, 21 Sep 2017) | 4 lines

Move spec/rubyspec to spec/ruby for consistency

* Other ruby implementations use the spec/ruby directory.
  [Misc #13792] [ruby-core:82287]
------------------------------------------------------------------------
r59978 | svn | 2017-09-21 04:45:20 +0900 (Thu, 21 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59977 | eregon | 2017-09-21 04:45:19 +0900 (Thu, 21 Sep 2017) | 1 line

Update to ruby/spec@e3b6811
------------------------------------------------------------------------
r59976 | svn | 2017-09-21 03:47:15 +0900 (Thu, 21 Sep 2017) | 1 line

* 2017-09-21
------------------------------------------------------------------------
r59975 | normal | 2017-09-21 03:47:14 +0900 (Thu, 21 Sep 2017) | 11 lines

process: block/unblock signals around fork

As with forking for execve(2) in `spawn', we must block signals
to ensure they are handled correctly in a freshly `fork'-ed child.

* process.c (retry_fork_ruby): block/unblock signals around fork
  (rb_fork_ruby): re-enable signals in forked child
* test/ruby/test_process.rb (test_forked_child_signal): new test
  [ruby-core:82883] [Bug #13916]

  Thanks to Russell Davis for the bug report and test case.
------------------------------------------------------------------------
r59974 | nobu | 2017-09-20 17:38:52 +0900 (Wed, 20 Sep 2017) | 4 lines

parse.y: literal term lex_state

* parse.y (parser_string_term, parser_parse_string): move setting
  lex_state operations from parser_yylex per each token types.
------------------------------------------------------------------------
r59973 | sonots | 2017-09-20 14:01:09 +0900 (Wed, 20 Sep 2017) | 1 line

ruby.c: show help messages of --dump
------------------------------------------------------------------------
r59972 | nobu | 2017-09-20 11:32:55 +0900 (Wed, 20 Sep 2017) | 4 lines

fix up r59949

* ext/ripper/lib/ripper/lexer.rb (List#inspect): splat self data
  to local variables same as members of Elem.
------------------------------------------------------------------------
r59971 | shugo | 2017-09-20 10:40:53 +0900 (Wed, 20 Sep 2017) | 3 lines

Add MonitorMinx#mon_locked? and #mon_owned? to check states of objects

Patched by Satoshi "Moris" Tagomori <tagomoris@gmail.com>.  [Fix GH-1699]
------------------------------------------------------------------------
r59970 | nobu | 2017-09-20 09:53:47 +0900 (Wed, 20 Sep 2017) | 5 lines

ruby.c: paragraph mode by -00

* ruby.c (proc_options): set to paragraph mode, if -00 is given,
  as well as perl and -R0 option in 0.49.
  [ruby-core:81987] [Bug #13736]
------------------------------------------------------------------------
r59969 | svn | 2017-09-20 08:09:11 +0900 (Wed, 20 Sep 2017) | 1 line

* 2017-09-20
------------------------------------------------------------------------
r59968 | nobu | 2017-09-20 08:09:10 +0900 (Wed, 20 Sep 2017) | 1 line

adjust indent
------------------------------------------------------------------------
r59967 | nagachika | 2017-09-19 23:56:03 +0900 (Tue, 19 Sep 2017) | 3 lines

fix a typo in NEWS at r59966.

	* NEWS: fix a typo.
------------------------------------------------------------------------
r59966 | knu | 2017-09-19 17:45:12 +0900 (Tue, 19 Sep 2017) | 5 lines

Alias Set#=== to #include?

* set.rb (Set#===): Added via [Feature #13801] by davidarnold.

Closes #1673.
------------------------------------------------------------------------
r59965 | normal | 2017-09-19 17:39:22 +0900 (Tue, 19 Sep 2017) | 5 lines

webrick: handle EAGAIN/EWOULDBLOCK on proxy connections

* lib/webrick/httpproxy.rb (do_CONNECT): high-level IO methods
  [ruby-core:82861] [Bug #12130]
  Patch by: Keisuke NISHI
------------------------------------------------------------------------
r59964 | hsbt | 2017-09-19 14:01:02 +0900 (Tue, 19 Sep 2017) | 5 lines

Fixup r59961. Use http for libffi downloading.

  A few environments couldn't handle https download.
    * https://rubyci.org/logs/mswinci.japaneast.cloudapp.azure.com/vc12-x64/ruby-trunk/log/20170919T032511Z.fail.html.gz
    * https://rubyci.org/logs/www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20170919T040500Z.fail.html.gz
------------------------------------------------------------------------
r59963 | nobu | 2017-09-19 11:42:08 +0900 (Tue, 19 Sep 2017) | 4 lines

thread.c: report then abort

* thread.c (thread_start_func_2): report then abort on exception,
  if both are set.  [ruby-core:79280] [Bug #13163]
------------------------------------------------------------------------
r59962 | hsbt | 2017-09-19 11:39:40 +0900 (Tue, 19 Sep 2017) | 4 lines

Added documentation
Added documentaiton for installation of bundled gems.

  [Bug #13724][ruby-core:81938]
------------------------------------------------------------------------
r59961 | hsbt | 2017-09-19 11:25:16 +0900 (Tue, 19 Sep 2017) | 1 line

Use https instead of ftp for libffi downloading.
------------------------------------------------------------------------
r59960 | hsbt | 2017-09-19 10:54:28 +0900 (Tue, 19 Sep 2017) | 3 lines

Define the MIME type for JSON in WEBrick::HTTPUtils::DefaultMimeTypes.

  [Feature #10798][ruby-core:67879]
------------------------------------------------------------------------
r59959 | hsbt | 2017-09-19 09:37:38 +0900 (Tue, 19 Sep 2017) | 4 lines

Enabled temporary disabled examples of bundler rspec.

  These are fails when merging at r59779. But these are
  working now.
------------------------------------------------------------------------
r59958 | svn | 2017-09-19 09:22:57 +0900 (Tue, 19 Sep 2017) | 1 line

* 2017-09-19
------------------------------------------------------------------------
r59957 | nobu | 2017-09-19 09:22:56 +0900 (Tue, 19 Sep 2017) | 4 lines

parse.y: lex by lvar

* parse.y (parse_ident): disable tLPAREN_ARG state by local
  variable.  [ruby-list:50578]
------------------------------------------------------------------------
r59956 | ktsj | 2017-09-18 17:21:08 +0900 (Mon, 18 Sep 2017) | 5 lines

vm.c: fix `cfp consistency error' which occurs
when raising exception in bmethod call event

* vm.c (invoke_bmethod): set FINISH flag just before calling vm_exec.
  [ruby-dev:50162] [Bug #13705]
------------------------------------------------------------------------
r59955 | nobu | 2017-09-18 17:05:53 +0900 (Mon, 18 Sep 2017) | 10 lines

error.c: KeyError#receiver and KeyError#key

* error.c: new method KeyError#receiver and KeyError#key.
  [Feature #12063]

* hash.c: make KeyError object with receiver and key.

* sprintf.c: ditto.

Author:    ksss <co000ri@gmail.com>
------------------------------------------------------------------------
r59954 | nobu | 2017-09-18 16:52:58 +0900 (Mon, 18 Sep 2017) | 1 line

configure.in: use newer libtool only
------------------------------------------------------------------------
r59953 | rhe | 2017-09-18 14:37:29 +0900 (Mon, 18 Sep 2017) | 3 lines

re.c: remove unused rb_memcmp() function

It is no longer used or exported as of r13641.
------------------------------------------------------------------------
r59952 | yui-knk | 2017-09-18 14:17:21 +0900 (Mon, 18 Sep 2017) | 5 lines

thread.c: Clear an array for method coverage

* thread.c (reset_coverage_i): Clear an
  array for method coverage just like
  line coverage and branch coverage.
------------------------------------------------------------------------
r59951 | nobu | 2017-09-18 14:16:37 +0900 (Mon, 18 Sep 2017) | 4 lines

intern instruction

* insns.def (intern): new instruction to turn string into symbol.
  opt_call_c_function can not dump.
------------------------------------------------------------------------
r59950 | nobu | 2017-09-18 11:27:13 +0900 (Mon, 18 Sep 2017) | 11 lines

refinements in string interpolation

* compile.c (iseq_compile_each0): insert to_s method call, so that
  refinements activated at the caller should take place.
  [Feature #13812]

* insns.def (tostring): fix up converted object to a string,
  infect and fallback.

* insns.def (branchiftype): new instruction for conversion.
  branches if TOS is an instance of the given type.
------------------------------------------------------------------------
r59949 | nobu | 2017-09-18 09:08:19 +0900 (Mon, 18 Sep 2017) | 7 lines

parse.y: ripper_lex_state_name

* parse.y (ripper_lex_state_name): represent lex_state as OR-ed
  form.

* ext/ripper/lib/ripper/lexer.rb (Ripper::Lexer::Elem#to_a):
  lex_state for inspection.
------------------------------------------------------------------------
r59948 | svn | 2017-09-18 08:56:38 +0900 (Mon, 18 Sep 2017) | 1 line

* 2017-09-18
------------------------------------------------------------------------
r59947 | mame | 2017-09-18 08:56:37 +0900 (Mon, 18 Sep 2017) | 3 lines

ext/objspace/objspace.c: remove unneeded code clones.

`setup_hash` have already performed nil check and empty check.
------------------------------------------------------------------------
r59946 | nobu | 2017-09-17 18:28:58 +0900 (Sun, 17 Sep 2017) | 7 lines

literal symbol by intern

* compile.c (iseq_compile_each0): literal symbol should not be
  affected by redefinition of String#intern method.

* vm_insnhelper.c (rb_vm_str_intern): intern a string into a
  symbol directly.
------------------------------------------------------------------------
r59945 | nobu | 2017-09-17 18:21:47 +0900 (Sun, 17 Sep 2017) | 6 lines

compile.c: optimize unnecessary concatstrings

* compile.c (iseq_peephole_optimize): optimize away unnecessary
  concatenation of single string, following tostring which always
  puts a String instance.
  https://github.com/ruby/ruby/pull/1626#discussion_r139285653
------------------------------------------------------------------------
r59944 | mame | 2017-09-17 17:04:34 +0900 (Sun, 17 Sep 2017) | 3 lines

ext/io/console/lib/console/size.rb: Fix the context of method definition

`console_size` is not a instance method but a class method.
------------------------------------------------------------------------
r59943 | yui-knk | 2017-09-17 16:19:20 +0900 (Sun, 17 Sep 2017) | 5 lines

node.h: Remove a not used macro

* node.h (nd_refinements_): nd_refinements_ was
  introduced on r49894. But this macro has not been
  used since r49897.
------------------------------------------------------------------------
r59942 | nobu | 2017-09-17 15:50:31 +0900 (Sun, 17 Sep 2017) | 4 lines

make-snapshot: after-update

* tool/make-snapshot (package): fix missing after-update for
  libffi and so on.  [ruby-dev:50244] [Bug #13897]
------------------------------------------------------------------------
r59941 | nobu | 2017-09-17 14:51:15 +0900 (Sun, 17 Sep 2017) | 3 lines

suppress warnings

* compile.c: suppress maybe-uninitialized warnings by gcc7.
------------------------------------------------------------------------
r59940 | mame | 2017-09-17 13:30:30 +0900 (Sun, 17 Sep 2017) | 4 lines

run-lcov.rb: wrongly used unique ID as lineno

The second value of key of branch/method coverage is unique ID, not
lineno.
------------------------------------------------------------------------
r59939 | rhe | 2017-09-17 13:26:51 +0900 (Sun, 17 Sep 2017) | 5 lines

ext/date/extconf.rb: check for timezone and altzone

Instead of in configure.in. As of r28592 the HAVE_VAR_TIMEZONE and
HAVE_VAR_ALTZONE macros are only used by ext/date. ext/date doesn't care
whether they are int or long, so just check for the existence.
------------------------------------------------------------------------
r59938 | rhe | 2017-09-17 13:26:48 +0900 (Sun, 17 Sep 2017) | 4 lines

configure.in: don't check for existence of timezone()

HAVE_TIMEZONE and TIMEZONE_VOID macros are not used anymore as of r28592
("strftime.c: unused declarations removed.", 2010-07-09).
------------------------------------------------------------------------
r59937 | nobu | 2017-09-17 13:14:51 +0900 (Sun, 17 Sep 2017) | 5 lines

Rename bin/ruby as exe/ruby

* common.mk, configure.in: rename the bin directory to run build
  executable as exe, to get rid of overwriting true files at the
  installation.  [ruby-dev:50250] [Bug #13911]
------------------------------------------------------------------------
r59936 | svn | 2017-09-17 07:40:10 +0900 (Sun, 17 Sep 2017) | 1 line

* 2017-09-17
------------------------------------------------------------------------
r59935 | nobu | 2017-09-17 07:40:09 +0900 (Sun, 17 Sep 2017) | 1 line

test_fileutils.rb: rmdir should fail on nonexistent directory
------------------------------------------------------------------------
r59934 | nobu | 2017-09-16 20:59:47 +0900 (Sat, 16 Sep 2017) | 4 lines

fileutils.rb: error at rmdir

* lib/fileutils.rb (rmdir): should not ignore errors first, except
  for parent directories.  [ruby-dev:50236] [Bug #13889]
------------------------------------------------------------------------
r59933 | nobu | 2017-09-16 20:50:56 +0900 (Sat, 16 Sep 2017) | 5 lines

file.c: [DOC] separators at dirname and basename

* file.c (rb_file_s_basename, rb_file_s_dirname): [DOC] state
  that trailing separators will be stripped first, like as
  basename(1) and dirname(1).  [ruby-core:82828] [Bug #13908]
------------------------------------------------------------------------
r59932 | nobu | 2017-09-16 20:50:55 +0900 (Sat, 16 Sep 2017) | 1 line

common.mk: make bin directory
------------------------------------------------------------------------
r59931 | hsbt | 2017-09-16 08:46:46 +0900 (Sat, 16 Sep 2017) | 3 lines

To use github url for gemspec.

  [Bug #13906][ruby-core:82817]
------------------------------------------------------------------------
r59930 | nobu | 2017-09-16 04:25:46 +0900 (Sat, 16 Sep 2017) | 1 line

ruby-runner.c: reduce duplicate code
------------------------------------------------------------------------
r59929 | nobu | 2017-09-16 04:25:45 +0900 (Sat, 16 Sep 2017) | 1 line

Makefile.in: make wrappers for each name
------------------------------------------------------------------------
r59928 | nobu | 2017-09-16 02:47:50 +0900 (Sat, 16 Sep 2017) | 1 line

fixup r59927
------------------------------------------------------------------------
r59927 | nobu | 2017-09-16 02:42:00 +0900 (Sat, 16 Sep 2017) | 5 lines

rename ruby-runner as bin/ruby

* Makefile.in, configure.in, tool/runruby.rb: rename ruby-runner
  executable file as $(RUBY_INSTALL_NAME) under bin, to mimic
  dirty `#!/usr/bin/env` hack.
------------------------------------------------------------------------
r59926 | naruse | 2017-09-16 02:00:49 +0900 (Sat, 16 Sep 2017) | 13 lines

Find.find -> Use Dir.children instead of Dir.entries

Dir.children is available since Feature #11302.
Find.find can use of the new list (having no '.' neither '..' entries),
making now superflous an if statement.

This change can improve the performance of Find.find when the path
has lots of entries (thousands?).

https://bugs.ruby-lang.org/issues/11302
patched by Espartaco Palma <esparta@gmail.com>
https://github.com/ruby/ruby/pull/1697 fix GH-1697
[Feature #13896]
------------------------------------------------------------------------
r59925 | naruse | 2017-09-16 01:56:16 +0900 (Sat, 16 Sep 2017) | 4 lines

Fix test code of kconv

patched by tbpgr <tbpgr@tbpgr.jp>
https://github.com/ruby/ruby/pull/1696 fix GH-1696
------------------------------------------------------------------------
r59924 | svn | 2017-09-16 01:53:56 +0900 (Sat, 16 Sep 2017) | 1 line

* 2017-09-16
------------------------------------------------------------------------
r59923 | naruse | 2017-09-16 01:53:55 +0900 (Sat, 16 Sep 2017) | 4 lines

include query parameters in Net::HTTP.post

patched by Samuel Giddins <segiddins@segiddins.me>
https://github.com/ruby/ruby/pull/1686 fix GH-1686
------------------------------------------------------------------------
r59922 | kazu | 2017-09-15 21:03:42 +0900 (Fri, 15 Sep 2017) | 1 line

Fix typos [ci skip]
------------------------------------------------------------------------
r59921 | kazu | 2017-09-15 21:03:41 +0900 (Fri, 15 Sep 2017) | 1 line

Remove needless splat array
------------------------------------------------------------------------
r59920 | nobu | 2017-09-15 17:47:46 +0900 (Fri, 15 Sep 2017) | 4 lines

parse.y: use SET_LEX_STATE

* parse.y (f_arglist, parser_yylex): set lex_state via
  SET_LEX_STATE macro for yydebug messages.
------------------------------------------------------------------------
r59919 | nobu | 2017-09-15 11:01:59 +0900 (Fri, 15 Sep 2017) | 6 lines

object.c: fix conversion failure message

* object.c (convert_type_with_id): fix failure message for
  explicit conversion.  rb_convert_type_with_id and
  rb_check_convert_type_with_id are not only for implicit
  conversions.
------------------------------------------------------------------------
r59918 | nobu | 2017-09-15 09:59:35 +0900 (Fri, 15 Sep 2017) | 4 lines

rubyspec: jobserver fd may not be available

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  rescue possible EBADF as jobserver fd may not be available.
------------------------------------------------------------------------
r59917 | nobu | 2017-09-15 09:59:34 +0900 (Fri, 15 Sep 2017) | 4 lines

rubyspec: use mock directory

* spec/rubyspec/core/dir/mkdir_spec.rb: the source directory may
  be on a read-only filesystem.
------------------------------------------------------------------------
r59916 | nobu | 2017-09-15 09:59:32 +0900 (Fri, 15 Sep 2017) | 9 lines

rubyspec: fix types

* spec/rubyspec/optional/capi/ext/fixnum_spec.c: FIX2INT and
  FXI2UINT return long, in spite of their names.

* spec/rubyspec/optional/capi/ext/range_spec.c: err is int.

* spec/rubyspec/optional/capi/ext/st_spec.c: st_index_t is larger
  than int.
------------------------------------------------------------------------
r59915 | yui-knk | 2017-09-15 09:40:38 +0900 (Fri, 15 Sep 2017) | 5 lines

ext/coverage/coverage.c (rb_coverage_start): Ensure `opt` is a hash

Ensure `opt` is a hash before using `rb_hash_lookup` to `opt`.
This will prevent SEGV when an inappropriate object (i.e. an array)
is passed to `opt`.
------------------------------------------------------------------------
r59911 | eregon | 2017-09-15 00:56:33 +0900 (Fri, 15 Sep 2017) | 1 line

Update to ruby/spec@a4bc1d8
------------------------------------------------------------------------
r59910 | svn | 2017-09-15 00:56:10 +0900 (Fri, 15 Sep 2017) | 1 line

* 2017-09-15
------------------------------------------------------------------------
r59909 | eregon | 2017-09-15 00:56:09 +0900 (Fri, 15 Sep 2017) | 1 line

Update to ruby/mspec@5bd9409
------------------------------------------------------------------------
r59908 | eregon | 2017-09-14 23:54:29 +0900 (Thu, 14 Sep 2017) | 1 line

time.c (Time#-): Fix documentation.
------------------------------------------------------------------------
r59897 | mame | 2017-09-14 20:16:23 +0900 (Thu, 14 Sep 2017) | 4 lines

lib/webrick/log.rb: sanitize any type of logs

It had failed to sanitize some type of exception messages.  Reported and
patched by Yusuke Endoh (mame) at https://hackerone.com/reports/223363
------------------------------------------------------------------------
r59896 | nobu | 2017-09-14 19:53:47 +0900 (Thu, 14 Sep 2017) | 8 lines

ripper: add states of scanner

* parse.y (ripper_state): add states of scanner to tokens from
  Ripper.lex and Ripper::Filter#on_*.  based on the patch by
  aycabta (Code Ahss) at [ruby-core:81789].  [Feature #13686]

* ext/ripper/tools/preproc.rb (prelude, usercode): generate EXPR_*
  constants from enums.
------------------------------------------------------------------------
r59895 | nobu | 2017-09-14 19:49:29 +0900 (Thu, 14 Sep 2017) | 1 line

parse.y: [DOC] fix call-seq [ci skip]
------------------------------------------------------------------------
r59894 | mame | 2017-09-14 19:45:04 +0900 (Thu, 14 Sep 2017) | 5 lines

ext/coverage/coverage.c: use long instead of int for coverage site id

Coverage generates unique ID numbers for each branch and each method.
Use long instead of int for the IDs.  I don't want to see 2^32 branches
and methods in one file, but just in case...
------------------------------------------------------------------------
r59893 | naruse | 2017-09-14 18:21:48 +0900 (Thu, 14 Sep 2017) | 1 line

fix the case High Sierra's mincore(2) may return -128 [Bug #13895]
------------------------------------------------------------------------
r59892 | nobu | 2017-09-14 17:04:30 +0900 (Thu, 14 Sep 2017) | 4 lines

compile.c: iseq_pop_newarray

* compile.c (iseq_pop_newarray): optimize array literal in
  condition.
------------------------------------------------------------------------
r59891 | mame | 2017-09-14 16:45:17 +0900 (Thu, 14 Sep 2017) | 1 line

ext/coverage/coverage.c (method_coverage): `id` was used uninitialized
------------------------------------------------------------------------
r59890 | mame | 2017-09-14 15:07:05 +0900 (Thu, 14 Sep 2017) | 10 lines

Measure branch and method coverage for `make test-all`

To measure coverage of C code:
`./configure --enable-gcov && make && make exam && make lcov`

To measure coverage of Ruby code:
`./configure && make && make exam COVERAGE=true && make lcov`

To measure coverage of both languages at a time:
`./configure --enable-gcov && make && make exam COVERAGE=true && make lcov`
------------------------------------------------------------------------
r59889 | mame | 2017-09-14 14:27:02 +0900 (Thu, 14 Sep 2017) | 4 lines

Introduce NODE_UNLESS for branch coverage

`unless` statement was a syntactic sugar for `if` statement,
which made the result of branch coverage hard to understand.
------------------------------------------------------------------------
r59888 | mame | 2017-09-14 14:12:34 +0900 (Thu, 14 Sep 2017) | 1 line

Add method coverage
------------------------------------------------------------------------
r59887 | hsbt | 2017-09-14 14:04:38 +0900 (Thu, 14 Sep 2017) | 8 lines

added workaround for APFS file format.

  * TestFileExhaustive#test_atime: It fails with nano-sec precise.
    I changed to use unixtime for this assertion for APFS.
  * TestFileExhaustive#test_expand_path: skip assertion when given
    invalid charactor on APFS.

  [Bug #13816][ruby-core:82383]
------------------------------------------------------------------------
r59886 | mame | 2017-09-14 13:42:23 +0900 (Thu, 14 Sep 2017) | 1 line

Fix the lineno of case statement that has no expression
------------------------------------------------------------------------
r59885 | mame | 2017-09-14 13:32:58 +0900 (Thu, 14 Sep 2017) | 1 line

Add branch coverage for case-when statement
------------------------------------------------------------------------
r59878 | hsbt | 2017-09-14 12:57:22 +0900 (Thu, 14 Sep 2017) | 1 line

Removed needless operator.
------------------------------------------------------------------------
r59877 | mame | 2017-09-14 12:36:05 +0900 (Thu, 14 Sep 2017) | 1 line

Add branch coverage for while and until statements
------------------------------------------------------------------------
r59876 | mame | 2017-09-14 12:25:36 +0900 (Thu, 14 Sep 2017) | 1 line

Add branch coverage for if statement
------------------------------------------------------------------------
r59875 | mame | 2017-09-14 11:53:54 +0900 (Thu, 14 Sep 2017) | 1 line

ext/coverage/coverage.c: Fix the condition for non-experimental mode
------------------------------------------------------------------------
r59874 | mame | 2017-09-14 11:36:26 +0900 (Thu, 14 Sep 2017) | 24 lines

[EXPERIMENTAL] Extend the API of `Coverage.start` and `result`

The old API:

    Coverage.start
    load "foo.rb"
    p Coverage.result #=> {"foo.rb" => [1, 2, nil]}

The new API:

    ENV["COVERAGE_EXPERIMENTAL_MODE"] = "true"
    Coverage.start(lines: true)
    load "foo.rb"
    p Coverage.result #=> {"foo.rb" => {:lines => [1, 2, nil]}}

This new API allows us to add other measuring target types.

Notes:

* To keep compatibility, the old interface is still remained; passing no
  optional argument makes `Coverage.result` return the old format.
* This feature is still experimental.  So, to enable the new API, the
  environment variable `COVERAGE_EXPERIMENTAL_MODE` must be set.  I plan
  to activate this feature by Ruby 2.5.
------------------------------------------------------------------------
r59873 | hsbt | 2017-09-14 11:01:36 +0900 (Thu, 14 Sep 2017) | 4 lines

Update gemspec for gem released versions.

  * These are dbm, fcntl, io-console, sdbm, stringio, strscan, zlib,
    cmath, scanf.
------------------------------------------------------------------------
r59872 | ko1 | 2017-09-14 10:55:59 +0900 (Thu, 14 Sep 2017) | 3 lines

remove an unused variable (sometimes it fails test).


------------------------------------------------------------------------
r59871 | mame | 2017-09-14 10:55:30 +0900 (Thu, 14 Sep 2017) | 4 lines

Add a new instruction `trace2` for hooking with custom data

This is needed for passing to the hook function the measuring target
type (line/branch/method) and the site of coverage event fired.
------------------------------------------------------------------------
r59870 | nobu | 2017-09-14 02:07:19 +0900 (Thu, 14 Sep 2017) | 6 lines

test_rubyoptions.rb: keep paths if necessary

* test/ruby/test_rubyoptions.rb (TestRubyOptions#test_search):
  PATH must keep library loading paths on a platform where it is
  used for that purpose, for extra libraries.
  [ruby-core:81178] [Bug #13569] [Fix GH-1616]
------------------------------------------------------------------------
r59869 | svn | 2017-09-14 00:28:17 +0900 (Thu, 14 Sep 2017) | 1 line

* 2017-09-14
------------------------------------------------------------------------
r59868 | nobu | 2017-09-14 00:28:16 +0900 (Thu, 14 Sep 2017) | 4 lines

LIBPATHENV on Windows

* configure.in, win32/Makefile.sub: set LIBPATHENV to PATH on
  Windows, for extra DLLs.
------------------------------------------------------------------------
r59867 | suke | 2017-09-13 22:24:59 +0900 (Wed, 13 Sep 2017) | 3 lines

test/win32ole/test_word.rb: word quit without confirmation dialog to save 
files. [Bug #13894] Thanks to h.shirosaki.

------------------------------------------------------------------------
r59866 | kazu | 2017-09-13 21:46:13 +0900 (Wed, 13 Sep 2017) | 3 lines

Random.urandom raises RuntimeError instead of returning nil

[ci skip]
------------------------------------------------------------------------
r59865 | hsbt | 2017-09-13 18:06:34 +0900 (Wed, 13 Sep 2017) | 1 line

Removed needless magic-comment for encodings.
------------------------------------------------------------------------
r59864 | hsbt | 2017-09-13 18:06:05 +0900 (Wed, 13 Sep 2017) | 1 line

Fixup r59856. Added workaround for JRuby.
------------------------------------------------------------------------
r59863 | hsbt | 2017-09-13 11:36:46 +0900 (Wed, 13 Sep 2017) | 3 lines

Added executable to bundler template.

  It's same as upstream permission.
------------------------------------------------------------------------
r59862 | hsbt | 2017-09-13 11:21:02 +0900 (Wed, 13 Sep 2017) | 1 line

Fix a typo.
------------------------------------------------------------------------
r59861 | ko1 | 2017-09-13 08:15:34 +0900 (Wed, 13 Sep 2017) | 13 lines

Use mutable strings for mutation tests.

* test/fiddle/test_func.rb (test_string): this test break String buffer
  by `strcpy` ("000" -> "123"). However, the string literal "000" with
  `frozen_string_literal: true` returns a string object from frozen
  string pool. So that after this test "000" from fstring pool becomes
  "123" (modified string). 'test/date/' uses "000" (as fstring) and tests
  are fails (we could check with `make test-all TESTS='fiddle date'`).

* test/fiddle/test_function.rb: ditto.

* test/fiddle/test_import.rb: ditto.

------------------------------------------------------------------------
r59860 | svn | 2017-09-13 03:41:06 +0900 (Wed, 13 Sep 2017) | 1 line

* 2017-09-13
------------------------------------------------------------------------
r59859 | normal | 2017-09-13 03:41:05 +0900 (Wed, 13 Sep 2017) | 3 lines

cont.c: update comment to match r59776 [ci skip]

* cont.c (fiber_switch): th->fiber => th->ec.fiber in comment
------------------------------------------------------------------------
r59858 | mame | 2017-09-12 22:57:36 +0900 (Tue, 12 Sep 2017) | 3 lines

Random.urandom raises an exception instead of returning nil when failed

Early failure looks better in this case.  Refs [Bugs #13885].
------------------------------------------------------------------------
r59857 | rhe | 2017-09-12 22:52:51 +0900 (Tue, 12 Sep 2017) | 10 lines

openssl: merge test fixes from upstream, part 2

This is a combined patch of the following two commits in maint:

	a09d8c78dd30 test/test_ssl: suppress warning in test_alpn_protocol_selection_cancel
	de965374ee85 test/test_pair: disable compression

This hopefully fixes the RubyCI gentoo failure:

	http://rubyci.s3.amazonaws.com/gentoo/ruby-trunk/log/20170912T033004Z.fail.html.gz
------------------------------------------------------------------------
r59856 | hsbt | 2017-09-12 21:51:43 +0900 (Tue, 12 Sep 2017) | 5 lines

Partly reverted r59845.

  All of environments on Ruby CI are fails rdoc generation.
  It may be caused by
  https://github.com/ruby/rdoc/commit/8cfa11d6f1cc7e74e45e42fd8d1d76c5a0646a6e
------------------------------------------------------------------------
r59855 | naruse | 2017-09-12 21:49:38 +0900 (Tue, 12 Sep 2017) | 1 line

output some strings without quotes
------------------------------------------------------------------------
r59854 | hsbt | 2017-09-12 20:52:23 +0900 (Tue, 12 Sep 2017) | 6 lines

Merge fiddle-1.0.0.beta2 from upstream.

  * ext/fiddle/closure.c: use directly declaration for standalone gem
    without internal.h.
  * Specify frozen string literal is true.
  * Update gemspec configuration for release version.
------------------------------------------------------------------------
r59853 | kazu | 2017-09-12 20:15:27 +0900 (Tue, 12 Sep 2017) | 1 line

Add *.gemspec to .editorconfig [ci skip]
------------------------------------------------------------------------
r59852 | kazu | 2017-09-12 20:15:26 +0900 (Tue, 12 Sep 2017) | 1 line

Sort properties in .editorconfig [ci skip]
------------------------------------------------------------------------
r59851 | kazu | 2017-09-12 20:15:25 +0900 (Tue, 12 Sep 2017) | 1 line

Fix problem when open in emacs [ci skip]
------------------------------------------------------------------------
r59850 | hsbt | 2017-09-12 19:40:58 +0900 (Tue, 12 Sep 2017) | 1 line

Fixed copy option for bundler sync
------------------------------------------------------------------------
r59849 | hsbt | 2017-09-12 17:38:06 +0900 (Tue, 12 Sep 2017) | 4 lines

Merge csv-0.1.0 from upstream.

  * csv.gemspec: Update release version.
  * lib/csv.rb: Remove superfluous private clause.
------------------------------------------------------------------------
r59848 | hsbt | 2017-09-12 14:19:20 +0900 (Tue, 12 Sep 2017) | 3 lines

Fixed install error with rdoc.gemspec

  "lib/rdoc" is only workds on rdoc repository structure.
------------------------------------------------------------------------
r59847 | svn | 2017-09-12 12:42:56 +0900 (Tue, 12 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59846 | svn | 2017-09-12 12:42:55 +0900 (Tue, 12 Sep 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59845 | hsbt | 2017-09-12 12:42:54 +0900 (Tue, 12 Sep 2017) | 4 lines

Merge rdoc-6.0.0.beta2 from upstream.

  * This version changed lexer used Ripper from lexer based IRB.
    see details: https://github.com/ruby/rdoc/pull/512
------------------------------------------------------------------------
r59844 | nobu | 2017-09-12 05:10:34 +0900 (Tue, 12 Sep 2017) | 4 lines

console.c: set winsize on Windows

* ext/io/console/console.c (console_set_winsize): retry shrinking
  window and screen buffer.  [ruby-core:82741] [Bug #13888]
------------------------------------------------------------------------
r59843 | svn | 2017-09-12 05:10:34 +0900 (Tue, 12 Sep 2017) | 1 line

* 2017-09-12
------------------------------------------------------------------------
r59842 | nobu | 2017-09-12 05:10:33 +0900 (Tue, 12 Sep 2017) | 5 lines

test_io_console.rb: test_set_winsize_console

* test/io/console/test_io_console.rb (test_set_winsize_console):
  split from test_get_winsize_console and enable the case when
  attached to a console already
------------------------------------------------------------------------
r59840 | mame | 2017-09-11 21:44:51 +0900 (Mon, 11 Sep 2017) | 9 lines

lib/securerandom.rb: test one byte to determine urandom or openssl

`SecureRandom#gen_random` determines whether urandom is available or not
by trying `Random.urandom(n)`.  But, when n = 0, `Random.urandom(0)`
always succeeds even if urandom is not available, which leads to a wrong
decision.

When failed, `Random.urandom` returns nil instead of returning a shorter
string than required.  So the check for `ret.length != n` is not needed.
------------------------------------------------------------------------
r59839 | hsbt | 2017-09-11 18:44:29 +0900 (Mon, 11 Sep 2017) | 6 lines

Backport test_realworld_default_gem test from Rubygems-2.6.13.

  But this test is always fail on ruby core repository. Because
  default gems is only availabled after installation of Ruby.

  I ignored this test at https://github.com/rubygems/rubygems/pull/1986
------------------------------------------------------------------------
r59838 | naruse | 2017-09-11 17:50:08 +0900 (Mon, 11 Sep 2017) | 1 line

Follow latest VM changes
------------------------------------------------------------------------
r59837 | naruse | 2017-09-11 17:50:07 +0900 (Mon, 11 Sep 2017) | 1 line

suppress unused argument warning
------------------------------------------------------------------------
r59836 | hsbt | 2017-09-11 15:12:40 +0900 (Mon, 11 Sep 2017) | 3 lines

Remove commented out code of URI::HTTP.new.

  [Misc #13871][ruby-core:82655] Patch by @aycabta
------------------------------------------------------------------------
r59835 | hsbt | 2017-09-11 15:11:37 +0900 (Mon, 11 Sep 2017) | 3 lines

Remove commented out code of SecureRandom.random_number.

  [Misc #13870][ruby-core:82654] Patch by @aycabta.
------------------------------------------------------------------------
r59834 | hsbt | 2017-09-11 12:05:07 +0900 (Mon, 11 Sep 2017) | 1 line

Fixed unterminated backquote for bundler sync task.
------------------------------------------------------------------------
r59833 | hsbt | 2017-09-11 11:29:11 +0900 (Mon, 11 Sep 2017) | 3 lines

Update bundled gems.

  * rake-12.1.0 from 12.0.0
------------------------------------------------------------------------
r59832 | hsbt | 2017-09-11 10:33:46 +0900 (Mon, 11 Sep 2017) | 1 line

Added [Feature #12733] to NEWS entry.
------------------------------------------------------------------------
r59831 | ko1 | 2017-09-11 04:00:08 +0900 (Mon, 11 Sep 2017) | 13 lines

store ec instead of thread in rb_context_t.

* cont.c (rb_context_t): introduce saved_ec instaad of saved_thread.
  We only need to transfer ec data (not all of thread data).

  Introduce `thread_value` field to point creation thread.
  To acccess this field, `cont_thread_value()` is introduced.

* vm.c (rb_execution_context_mark): remove `static` and use it
  from cont.c (use this function instead of `rb_thread_mark`).

* vm_insnhelper.c (rb_vm_push_frame): accept ec instead of th.

------------------------------------------------------------------------
r59830 | ko1 | 2017-09-11 03:37:55 +0900 (Mon, 11 Sep 2017) | 7 lines

avoid false positive on fiber_verify().

* cont.c (fiber_store): move `cont_save_machine_stack()` timing to
  avoid `fiber_verify()` false positive on `FIBER_USE_NATIVE == 0`
  and `GC.stress = true`.
  This patch is very dirty and it should be removed soon.

------------------------------------------------------------------------
r59829 | ko1 | 2017-09-11 02:30:16 +0900 (Mon, 11 Sep 2017) | 7 lines

clear `stack_end`.

* cont.c (cont_save_thread): clear only `stack_end`. Clearing tells
  GC mark function to ignore this macine stack (not allocated yet).
  `stack_start` will be used by machine stack store/restore phase
  (on FIBER_USE_NATIVE == 0), so that only `stack_end` is cleared.

------------------------------------------------------------------------
r59828 | nobu | 2017-09-11 01:19:40 +0900 (Mon, 11 Sep 2017) | 4 lines

compile.c: pop coverage trace

* compile.c (iseq_compile_each0): pop trace for coverage only and
  clear its corresponding line.  [ruby-core:82726] [Bug #13886]
------------------------------------------------------------------------
r59827 | nobu | 2017-09-11 01:19:39 +0900 (Mon, 11 Sep 2017) | 1 line

cont.c: fix typo [ci skip]
------------------------------------------------------------------------
r59826 | svn | 2017-09-11 00:49:46 +0900 (Mon, 11 Sep 2017) | 1 line

* 2017-09-11
------------------------------------------------------------------------
r59825 | ko1 | 2017-09-11 00:49:45 +0900 (Mon, 11 Sep 2017) | 18 lines

move th->machine to ec->machine.

* vm_core.h: move rb_thread_t::machine to rb_execution_context_t::machine.

* vm_core.h, gc.c (rb_gc_mark_machine_stack): accept ec instead of th.
  it enables to call this func from rb_execution_context_mark() in vm.c.

* cont.c (fiber_setcontext): catch up this fix.
  fiber_restore_thread() restores machine stack information too.

* gc.c: catch up structure layout changes.

* thread.c: ditto.

* thread_pthread.c: ditto.

* thread_win32.c: ditto.

------------------------------------------------------------------------
r59824 | nobu | 2017-09-10 21:35:06 +0900 (Sun, 10 Sep 2017) | 3 lines

merger.rb: separate logs

* tool/merger.rb: separate each commit logs by an empty line.
------------------------------------------------------------------------
r59821 | nobu | 2017-09-10 20:52:56 +0900 (Sun, 10 Sep 2017) | 6 lines

cli_spec.rb: prefer BUNDLE_RUBY

* spec/bundler/bundler/cli_spec.rb: prefer BUNDLE_RUBY over env
  hack.  on macOS 10.11 or later, some system commands, e.g.
  /bin/sh and /usr/bin/env, clear DYLD_LIBRARY_PATH environment
  variable which is necessary to run not-yet installed command.
------------------------------------------------------------------------
r59810 | hsbt | 2017-09-10 12:21:58 +0900 (Sun, 10 Sep 2017) | 5 lines

BUNDLER_SPECS rquires a relative path with srcdir.

  default targets are all of bundler specs. if you run only
  commands/add_spec.rb spec:
    make test-bundler BUNDLER_SPECS=commands/add_spec.rb
------------------------------------------------------------------------
r59804 | nobu | 2017-09-10 07:08:01 +0900 (Sun, 10 Sep 2017) | 3 lines

runruby.rb: set envvars for bundler

* tool/runruby.rb: set gem and bundler environment variables.
------------------------------------------------------------------------
r59803 | mame | 2017-09-10 00:19:19 +0900 (Sun, 10 Sep 2017) | 3 lines

Add a note to Random.urandom

The method may return nil for some reasons.
------------------------------------------------------------------------
r59802 | svn | 2017-09-10 00:12:11 +0900 (Sun, 10 Sep 2017) | 1 line

* 2017-09-10
------------------------------------------------------------------------
r59801 | mame | 2017-09-10 00:12:10 +0900 (Sun, 10 Sep 2017) | 5 lines

Update a test of SecureRandom according to r57384

SecureRandom uses urandom by default.  So the test for a case where
openssl is unavailable makes no sense.  Instead, a simple test for a
case where urandom is unavailable is added.
------------------------------------------------------------------------
r59794 | mame | 2017-09-09 22:09:21 +0900 (Sat, 09 Sep 2017) | 8 lines

Support LCOV visualization for both C and Ruby code

`./configure --enable-gcov && make exam && make lcov` will create
`lcov-c-out/index.html` for coverage of C code of the interpreter.
`make exam COVERAGE=true && make lcov` will create
`lcov-rb-out/index.html` for coverage of Ruby stdlib code.
Using both `--enable-gcov` and `COVERAGE=true` will create
`lcov-out/index.html` for total coverage.
------------------------------------------------------------------------
r59792 | nobu | 2017-09-09 20:30:32 +0900 (Sat, 09 Sep 2017) | 10 lines

spec/bundler/support: paths for ruby core

* spec/bundler/support/path.rb (Spec::Path#for_ruby_core?): helper
  method to tell whether running in Ruby Core or not.

* spec/bundler/support/helpers.rb (Spec::Helpers#bundle): use
  Path.bindir for ruby core case.

* spec/bundler/support/rubygems_ext.rb (Spec::Rubygems.setup):
  ditto.
------------------------------------------------------------------------
r59791 | nobu | 2017-09-09 20:30:31 +0900 (Sat, 09 Sep 2017) | 4 lines

Makefile.in: test-bundler-prepare

* Makefile.in (test-bundler-prepare): install with --install-dir
  option instead of GEM_HOME and GEM_PATH environment variables.
------------------------------------------------------------------------
r59790 | nobu | 2017-09-09 19:20:38 +0900 (Sat, 09 Sep 2017) | 4 lines

rubygems_ext.rb: use BUNDLE_GEM

* spec/bundler/support/rubygems_ext.rb (install_gems): use
  BUNDLE_GEM set in Makefile.in instead of the installed command.
------------------------------------------------------------------------
r59789 | nobu | 2017-09-09 18:16:59 +0900 (Sat, 09 Sep 2017) | 4 lines

sprintf.c: NULL as str

* sprintf.c (ruby_vsnprintf, ruby_snprintf): allow NULL as str,
  just count the expected buffer size.
------------------------------------------------------------------------
r59788 | nobu | 2017-09-09 18:16:56 +0900 (Sat, 09 Sep 2017) | 4 lines

compile.c: replaced switch by TYPE

* compile.c (int_param): prefer FIXNUM_P and NIL_P to switch by
  TYPE.
------------------------------------------------------------------------
r59787 | kazu | 2017-09-09 11:34:30 +0900 (Sat, 09 Sep 2017) | 2 lines

Sync .gitignore and svn:ignore and cleanup [ci skip]

------------------------------------------------------------------------
r59786 | svn | 2017-09-09 08:51:15 +0900 (Sat, 09 Sep 2017) | 1 line

* 2017-09-09
------------------------------------------------------------------------
r59785 | normal | 2017-09-09 08:51:14 +0900 (Sat, 09 Sep 2017) | 9 lines

fiber: fix machine stack marking when FIBER_USE_NATIVE is 0

* cont.c (cont_mark): mark Fiber machine stack correctly when
  FIBER_USE_NATIVE is 0
* test/ruby/test_fiber.rb (test_mark_fiber): new test
  [Bug #13875] [ruby-core:82681]

This bug appears to be introduced with r59557.
("refactoring Fiber status")
------------------------------------------------------------------------
r59781 | hsbt | 2017-09-08 17:50:57 +0900 (Fri, 08 Sep 2017) | 3 lines

Rollback to v1.15.4 version.

  In r59779, it contains current master version of bundler repository.
------------------------------------------------------------------------
r59780 | svn | 2017-09-08 17:45:47 +0900 (Fri, 08 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59779 | hsbt | 2017-09-08 17:45:41 +0900 (Fri, 08 Sep 2017) | 15 lines

Merge bundler to standard libraries.

  rubygems 2.7.x depends bundler-1.15.x. This is preparation for
  rubygems and bundler migration.

  * lib/bundler.rb, lib/bundler/*: files of bundler-1.15.4
  * spec/bundler/*: rspec examples of bundler-1.15.4. I applied patches.
    * https://github.com/bundler/bundler/pull/6007
    * Exclude not working examples on ruby repository.
    * Fake ruby interpriter instead of installed ruby.
  * Makefile.in: Added test task named `test-bundler`. This task is only
    working macOS/linux yet. I'm going to support Windows environment later.
  * tool/sync_default_gems.rb: Added sync task for bundler.

  [Feature #12733][ruby-core:77172]
------------------------------------------------------------------------
r59778 | nobu | 2017-09-08 17:03:18 +0900 (Fri, 08 Sep 2017) | 7 lines

configure.in: moved flags

* configure.in (-DRUBY_DEVEL): moved from debugflags to XCFLAGS.
  this flags should be applied to the ruby core only.

* configure.in (-fno-fast-math): moved from optflags to CFLAGS.
  this flag is not for optimization.
------------------------------------------------------------------------
r59777 | nobu | 2017-09-08 16:22:47 +0900 (Fri, 08 Sep 2017) | 1 line

fix up r59776
------------------------------------------------------------------------
r59776 | ko1 | 2017-09-08 15:21:30 +0900 (Fri, 08 Sep 2017) | 5 lines

move th->fiber to ec->fiber.

* vm_core.h (rb_thread_t::fiber): move fiber field to
  rb_execution_context_t::fiber.

------------------------------------------------------------------------
r59775 | hsbt | 2017-09-08 14:33:12 +0900 (Fri, 08 Sep 2017) | 4 lines

Update latest bundled-gems.

  * minitest 5.10.3
  * test-unit 3.2.5
------------------------------------------------------------------------
r59774 | hsbt | 2017-09-08 14:18:18 +0900 (Fri, 08 Sep 2017) | 3 lines

fix a label for bundled gems.

  "bundle gems" is a wrong name.
------------------------------------------------------------------------
r59773 | usa | 2017-09-08 02:45:34 +0900 (Fri, 08 Sep 2017) | 5 lines

the working directory may not be srcdir

* test/runner.rb (COVERAGE): should use require_relative instead of require,
  because the working directory may not be srcdir.

------------------------------------------------------------------------
r59772 | svn | 2017-09-08 00:40:30 +0900 (Fri, 08 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59771 | svn | 2017-09-08 00:40:30 +0900 (Fri, 08 Sep 2017) | 1 line

* 2017-09-08
------------------------------------------------------------------------
r59770 | mame | 2017-09-08 00:40:29 +0900 (Fri, 08 Sep 2017) | 20 lines

Measure the test coverage without SimpleCov

Now `make test-all COVERAGE=true` measures the test coverage by using
`coverage.so` directly, and visualize the result by simplecov-html.

There has been some problems in coverage measurement with SimpleCov.
(They are not SimpleCov's fault, though.)

(1) It is difficult to extract the measured data as a machine-readable
format, such as Marshal.  I want to visualize the coverage data with
other coverage tools, such as LCOV and Cobertura.
(I know we can use SimpleCov's formatter mechanism, but I don't want
to depend upon SimpleCov so much.)

(2) SimpleCov seems to miss some coverage data.  For example,
`lib/cgi.rb` and `lib/ostruct.rb` are dropped.  I don't know why.

(3) I have a plan to enhance `coverage.so` with branch coverage.
It would be difficult to continue to only use SimpleCov as is.
This is the most important reason.
------------------------------------------------------------------------
r59769 | mame | 2017-09-07 21:36:01 +0900 (Thu, 07 Sep 2017) | 11 lines

Remove unneeded trace instruction for coverage

When no instruction is emitted in `iseq_compile_each0`
(i.e., when the line has no significant code), trace
instruction for `RUBY_EVENT_LINE` has been optimized out.
But trace for `RUBY_EVENT_COVERAGE` has not been removed.
Now, it is also removed.

`TestISeq#test_to_a_lines` has failed a long time under
coverage measurement (`make test-all COVERAGE=true`).
This change makes it pass.
------------------------------------------------------------------------
r59768 | kazu | 2017-09-07 21:31:50 +0900 (Thu, 07 Sep 2017) | 1 line

Use `%i`-literal instead of array of symbols
------------------------------------------------------------------------
r59767 | nobu | 2017-09-07 17:25:13 +0900 (Thu, 07 Sep 2017) | 4 lines

common.mk: fix golf

* common.mk (golf): MAINOBJ must be single object file name, so
  moved golf_prelude to EXTOBJS.  [ruby-dev:50214] [Bug #13854]
------------------------------------------------------------------------
r59766 | svn | 2017-09-07 12:24:09 +0900 (Thu, 07 Sep 2017) | 1 line

* 2017-09-07
------------------------------------------------------------------------
r59765 | nobu | 2017-09-07 12:24:08 +0900 (Thu, 07 Sep 2017) | 4 lines

ruby.h: unnormalized Fixnum value

* include/ruby/ruby.h (ST2FIX): fix unnormalized Fixnum value bug
  on mingw/mswin.  [ruby-core:82687] [Bug #13877]
------------------------------------------------------------------------
r59764 | kazu | 2017-09-06 22:46:31 +0900 (Wed, 06 Sep 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r59763 | nobu | 2017-09-06 22:11:44 +0900 (Wed, 06 Sep 2017) | 5 lines

string.c: fix false coderange

* string.c (rb_enc_str_scrub): enc can differ from the actual
  encoding of the string, the cached coderange is useless then.
  [ruby-core:82674] [Bug #13874]
------------------------------------------------------------------------
r59762 | nobu | 2017-09-06 21:50:10 +0900 (Wed, 06 Sep 2017) | 4 lines

string.c: optimize enumerate_grapheme_clusters

* string.c (rb_str_enumerate_grapheme_clusters): optimize when
  single byte only.
------------------------------------------------------------------------
r59761 | duerst | 2017-09-06 17:19:12 +0900 (Wed, 06 Sep 2017) | 3 lines

add mention of upgrade to Unicode 10.0.0 to NEWS file

(this completes [Feature #13685]; [ci skip])
------------------------------------------------------------------------
r59760 | duerst | 2017-09-06 17:12:02 +0900 (Wed, 06 Sep 2017) | 3 lines

remove Unicode 9.0.0-related files

We don't need these files anymore because we upgraded to Unicode 10.0.0.
------------------------------------------------------------------------
r59759 | duerst | 2017-09-06 16:56:41 +0900 (Wed, 06 Sep 2017) | 6 lines

update Ruby to Unicode 10.0.0

- In common.mk, set UNICODE_VERSION  to 10.0.0
- Generate and add enc/unicode/10.0.0/casefold.h and
  enc/unicode/10.0.0/name2ctype.h
- Update lib/unicode_normalize/tables.rb
------------------------------------------------------------------------
r59758 | mame | 2017-09-06 16:46:31 +0900 (Wed, 06 Sep 2017) | 4 lines

Update SimpleCov version (v0.10.0 -> v0.15.0)

To suppress warnings of Fixnum.
Also simplecov-html updated (v0.10.0 -> v0.10.2).
------------------------------------------------------------------------
r59757 | hsbt | 2017-09-06 12:53:25 +0900 (Wed, 06 Sep 2017) | 3 lines

Fixed compilationn error with VMDEBUG=3.

  [fix GH-1690] Patch from @musaprg(Kotaro Inoue)
------------------------------------------------------------------------
r59756 | ko1 | 2017-09-06 12:39:26 +0900 (Wed, 06 Sep 2017) | 9 lines

accept ec instead of th.

* vm.c: VM_EP_IN_HEAP_P() and vm_ep_in_heap_p_() only requires ec
  pointed from th.

* vm.c (rb_execution_context_mark): GET_THREAD() returns current
  running thread and we need to use marking thread here. Pass marking
  thread's ec instead of current thread.

------------------------------------------------------------------------
r59755 | ko1 | 2017-09-06 12:18:19 +0900 (Wed, 06 Sep 2017) | 1 line

th is not defined
------------------------------------------------------------------------
r59754 | ko1 | 2017-09-06 11:51:34 +0900 (Wed, 06 Sep 2017) | 1 line

thread_context -> execution_context
------------------------------------------------------------------------
r59753 | svn | 2017-09-06 11:47:00 +0900 (Wed, 06 Sep 2017) | 1 line

* 2017-09-06
------------------------------------------------------------------------
r59752 | ko1 | 2017-09-06 11:46:59 +0900 (Wed, 06 Sep 2017) | 4 lines

rb_execution_context_mark.

* vm.c (rb_execution_context_mark): separate from thread_mark().

------------------------------------------------------------------------
r59751 | rhe | 2017-09-05 18:47:59 +0900 (Tue, 05 Sep 2017) | 8 lines

openssl: merge test fixes from upstream

Fix platform-dependent or fragile test cases added by r59734. This is a
combined patch of the three commits below:

	4fc17977350a test/test_fips: skip if setting FIPS mode fails
	b25179fbeebf test/test_asn1: fix possible failure in test_utctime
	8ed81ff4b0a8 test/test_pair: fix test_write_nonblock{,_no_exceptions}
------------------------------------------------------------------------
r59750 | hsbt | 2017-09-05 17:25:26 +0900 (Tue, 05 Sep 2017) | 1 line

Update credentials for Travis/Slack integration.
------------------------------------------------------------------------
r59749 | mame | 2017-09-05 17:15:54 +0900 (Tue, 05 Sep 2017) | 3 lines

Hide NotImplementedError for windows

https://github.com/ruby/ruby/commit/440dc6b7e0b3b74db221eed81871516e301d4b3e#commitcomment-24074203
------------------------------------------------------------------------
r59748 | nobu | 2017-09-05 16:52:08 +0900 (Tue, 05 Sep 2017) | 4 lines

st.c: fix num_entries

* st.c (st_insert2): should manage num_entries when the key is
  undefined, as well as st_insert().
------------------------------------------------------------------------
r59747 | nobu | 2017-09-05 16:50:13 +0900 (Tue, 05 Sep 2017) | 6 lines

st.c: fix false assertions

* st.c: split assertion conditions.

* st.c (rb_hash_bulk_insert): the number of arguments should be
  even.
------------------------------------------------------------------------
r59746 | shyouhei | 2017-09-05 13:49:01 +0900 (Tue, 05 Sep 2017) | 7 lines

optimize rb_hash_bulk_insert to generally outperform 2.4.

Specialized routine for small linear-probling hash instances to
boost creation of such things [Bug #13861]

Signed-off-by: Urabe, Shyouhei <shyouhei@ruby-lang.org>

------------------------------------------------------------------------
r59745 | svn | 2017-09-05 13:48:19 +0900 (Tue, 05 Sep 2017) | 1 line

* 2017-09-05
------------------------------------------------------------------------
r59744 | shyouhei | 2017-09-05 13:48:19 +0900 (Tue, 05 Sep 2017) | 9 lines

add rb_hash_new_with_size()

Sometimes, size of a hash can be calcluated a priori.  By providing
such info to the constructor we can avoid unnecessary internal re-
allocations.  This can boost for instance creation of hash literals.
[Bug #13861]

Signed-off-by: Urabe, Shyouhei <shyouhei@ruby-lang.org>

------------------------------------------------------------------------
r59743 | nobu | 2017-09-04 23:04:54 +0900 (Mon, 04 Sep 2017) | 4 lines

string.c: grapheme clusters on frozen string

* string.c (rb_str_enumerate_grapheme_clusters): enumerate on
  shared frozen string.
------------------------------------------------------------------------
r59742 | nobu | 2017-09-04 23:04:50 +0900 (Mon, 04 Sep 2017) | 4 lines

string.c: enumerator_element

* string.c (enumerator_element): push or yield elements, and
  return 1 if needs checks.
------------------------------------------------------------------------
r59741 | mame | 2017-09-04 22:25:01 +0900 (Mon, 04 Sep 2017) | 3 lines

Improve line covearge of ext/io/nonblock/nonblock.c from 54.5% to 95.5%

Not so good test, but it would be better than nothing, I guess...
------------------------------------------------------------------------
r59740 | svn | 2017-09-04 21:15:07 +0900 (Mon, 04 Sep 2017) | 1 line

* 2017-09-04
------------------------------------------------------------------------
r59739 | kazu | 2017-09-04 21:15:06 +0900 (Mon, 04 Sep 2017) | 4 lines

gc.c: fix typo: nubmer -> number

Signed-off-by: Antonio Terceiro <terceiro@softwarelivre.org>
[Bug #13862]
------------------------------------------------------------------------
r59738 | mame | 2017-09-03 23:26:06 +0900 (Sun, 03 Sep 2017) | 8 lines

Refactor the internal data format for coverage measurement

To prepare new measuring targets: branch and method coverages.
So far, iseq->coverage was an array of counts executed for line coverage.
Now, it is a three-element array for each measuring target,
whose first element is an array for line coverage.
The second element is planned for branch coverage, and the third will be
for method coverage.
------------------------------------------------------------------------
r59737 | rhe | 2017-09-03 22:31:34 +0900 (Sun, 03 Sep 2017) | 3 lines

ext/.document: follow-up r59734

ext/openssl/ossl_pkcs5.c has been renamed to ossl_kdf.c.
------------------------------------------------------------------------
r59736 | nobu | 2017-09-03 22:21:07 +0900 (Sun, 03 Sep 2017) | 4 lines

string.c: make array in WANTARRAY

* string.c (WANTARRAY): make array for the result in method
  functions and pass it to enumerator functions.
------------------------------------------------------------------------
r59735 | svn | 2017-09-03 21:35:29 +0900 (Sun, 03 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59734 | rhe | 2017-09-03 21:35:27 +0900 (Sun, 03 Sep 2017) | 112 lines

openssl: import v2.1.0.beta1

Import Ruby/OpenSSL 2.1.0.beta1. The full commit log since v2.0.5
(imported by r59567) can be found at:

	https://github.com/ruby/openssl/compare/v2.0.5...v2.1.0.beta1

----------------------------------------------------------------
Antonio Terceiro (1):
      test/test_ssl: explicitly accept TLS 1.1 in corresponding test

Colby Swandale (1):
      document using secure protocol to fetch git master in Bundler

Colton Jenkins (1):
      Add fips_mode_get to return fips_mode

Kazuki Yamaguchi (85):
      Start preparing for 2.1.0
      Remove support for OpenSSL 0.9.8 and 1.0.0
      bn: refine tests
      bn: implement unary {plus,minus} operators for OpenSSL::BN
      bn: implement OpenSSL::BN#negative?
      Don't define main() when built with --enable-debug
      test: let OpenSSL::TestCase include OpenSSL::TestUtils
      test: prepare test PKey instances on demand
      Add OpenSSL.print_mem_leaks
      Enable OSSL_MDEBUG on CI builds
      ssl: move default DH parameters from OpenSSL::PKey::DH
      Make exceptions with the same format regardless of OpenSSL.debug
      ssl: show reason of 'certificate verify error' in exception message
      ssl: remove OpenSSL::ExtConfig::TLS_DH_anon_WITH_AES_256_GCM_SHA384
      ssl: do not confuse different ex_data index registries
      ssl: assume SSL/SSL_CTX always have a valid reference to the Ruby object
      Fix RDoc markup
      ssl: suppress compiler warning
      ext/openssl/deprecation.rb: remove broken-apple-openssl
      extconf.rb: print informative message if OpenSSL can't be found
      Rakefile: compile the extension before test
      kdf: introduce OpenSSL::KDF module
      ossl.h: add NUM2UINT64T() macro
      kdf: add scrypt
      Expand rb_define_copy_func() macro
      Expand FPTR_TO_FD() macro
      Remove SafeGet*() macros
      cipher: rename GetCipherPtr() to ossl_evp_get_cipherbyname()
      digest: rename GetDigestPtr() to ossl_evp_get_digestbyname()
      Add ossl_str_new(), an exception-safe rb_str_new()
      bio: simplify ossl_membio2str() using ossl_str_new()
      Remove unused functions and macros
      Drop support for LibreSSL 2.3
      ocsp: add OpenSSL::OCSP::Request#signed?
      asn1: infinite length -> indefinite length
      asn1: rearrange tests
      ssl: remove a needless NULL check in SSL::SSLContext#ciphers
      ssl: return nil in SSL::SSLSocket#cipher if session is not started
      asn1: remove an unnecessary function prototype
      asn1: require tag information when instantiating generic type
      asn1: initialize 'unused_bits' attribute of BitString with 0
      asn1: check for illegal 'unused_bits' value of BitString
      asn1: disallow NULL to be passed to asn1time_to_time()
      asn1: avoid truncating OID in OpenSSL::ASN1::ObjectId#oid
      asn1: allow constructed encoding with definite length form
      asn1: prohibit indefinite length form for primitive encoding
      asn1: allow tag number to be >= 32 for universal tag class
      asn1: use ossl_asn1_tag()
      asn1: clean up OpenSSL::ASN1::Constructive#to_der
      asn1: harmonize OpenSSL::ASN1::*#to_der
      asn1: prevent EOC octets from being in the middle of the content
      asn1: do not treat EOC octets as part of content octets
      x509name: add 'loc' and 'set' kwargs to OpenSSL::X509::Name#add_entry
      ssl: do not call session_remove_cb during GC
      Backport "Merge branch 'topic/test-memory-leak'" to maint
      cipher: update the documentation for Cipher#auth_tag=
      Rakefile: let sync:to_ruby know about test/openssl/fixtures
      test: fix formatting
      test/utils: remove OpenSSL::TestUtils.silent
      test/utils: add SSLTestCase#tls12_supported?
      test/utils: have start_server yield only the port number
      test/utils: do not set ecdh_curves in start_server
      test/utils: let server_loop close socket
      test/utils: improve error handling in start_server
      test/utils: add OpenSSL::TestUtils.openssl? and .libressl?
      test/utils: do not use DSA certificates in SSL tests
      test/test_ssl: remove test_invalid_shutdown_by_gc
      test/test_ssl: move test_multibyte_read_write to test_pair
      test/test_ssl_session: rearrange tests
      test/test_pair, test/test_ssl: fix for TLS 1.3
      ssl: remove useless call to rb_thread_wait_fd()
      ssl: fix NPN support
      ssl: mark OpenSSL::SSL::SSLContext::DEFAULT_{1024,2048} as private
      ssl: use 2048-bit group in the default tmp_dh_cb
      ssl: ensure that SSL option flags are non-negative
      ssl: update OpenSSL::SSL::OP_* flags
      ssl: prefer TLS_method() over SSLv23_method()
      ssl: add SSLContext#min_version= and #max_version=
      ssl: rework SSLContext#ssl_version=
      test/test_x509name: change script encoding to ASCII-8BIT
      x509name: refactor OpenSSL::X509::Name#to_s
      x509name: add OpenSSL::X509::Name#to_utf8
      x509name: add OpenSSL::X509::Name#inspect
      x509name: update regexp in OpenSSL::X509::Name.parse
      Ruby/OpenSSL 2.1.0.beta1

Marcus Stollsteimer (1):
      Fix rdoc for core Integer class

nobu (4):
      [DOC] {read,write}_nonblock with exception: false
      [DOC] keyword argument _exception_
      [DOC] mark up literals
      Revert r57690 except for read_nonblock
------------------------------------------------------------------------
r59733 | rhe | 2017-09-03 21:35:25 +0900 (Sun, 03 Sep 2017) | 4 lines

vm_insnhelper.c: fix opt_regexpmatch2 instruction

A fix-up for r58390 ("split insns.def into functions", 2017-04-18) which
accidentally swapped the arguments.
------------------------------------------------------------------------
r59732 | nobu | 2017-09-03 11:08:55 +0900 (Sun, 03 Sep 2017) | 4 lines

string.c: enumerator_wantarray

* string.c (enumerator_wantarray): show warnings at method
  functions for proper method names.
------------------------------------------------------------------------
r59731 | nobu | 2017-09-03 10:47:19 +0900 (Sun, 03 Sep 2017) | 4 lines

string.c: fix for non-Unicode encodings

* string.c (rb_str_enumerate_grapheme_clusters): should enumerate
  chars for non-Unicode encodings.  [Feature #13780]
------------------------------------------------------------------------
r59730 | nobu | 2017-09-03 09:39:23 +0900 (Sun, 03 Sep 2017) | 4 lines

string.c: suppress a warning

* string.c (rb_str_enumerate_grapheme_clusters): suppress a
  maybe-uninitialized warning by old gcc.
------------------------------------------------------------------------
r59729 | nobu | 2017-09-03 09:32:27 +0900 (Sun, 03 Sep 2017) | 4 lines

default.mspec: suppress warnings

* spec/default.mspec: suppress tons of useless use of == in void
  context warnings.
------------------------------------------------------------------------
r59728 | nobu | 2017-09-03 09:25:01 +0900 (Sun, 03 Sep 2017) | 4 lines

test_io.rb: suppress a warning

* test/ruby/test_io.rb (test_single_exception_on_close): suppress
  ambiguous first argument warning with RUBYOPT=-w.
------------------------------------------------------------------------
r59727 | nobu | 2017-09-03 09:13:15 +0900 (Sun, 03 Sep 2017) | 7 lines

test_coverage.rb: suppress warnings

* test/coverage/test_coverage.rb (test_nonpositive_linenumber):
  suppress method redefinition warnings.

* test/coverage/test_coverage.rb (test_eval): suppress literal in
  void context warning.
------------------------------------------------------------------------
r59726 | svn | 2017-09-03 09:02:24 +0900 (Sun, 03 Sep 2017) | 1 line

* 2017-09-03
------------------------------------------------------------------------
r59725 | nobu | 2017-09-03 09:02:23 +0900 (Sun, 03 Sep 2017) | 6 lines

test_coverage.rb: use real path

* test/coverage/test_coverage.rb (test_restarting_coverage): use
  real directory path for the case $TMPDIR contains symlinks.  on
  macOS, it is defaulted to a path under /var which is a symlink
  to /private/var.
------------------------------------------------------------------------
r59724 | mame | 2017-09-02 22:55:12 +0900 (Sat, 02 Sep 2017) | 12 lines

test/coverage/test_coverage.rb: run the tests in separated processes

The tests had been disabled under coverage measurement (during
`ENV['COVERAGE']`), since they call `Coverage.result` which stops
coverage measurement.
So, we couldn't measure both C-level and Ruby-level coverage of Ruby
simultaneously.
In short, `./configure --enable-gcov && make exam COVERAGE=true`
misses some coverages.

Now, the test runs in another process.  They does not stop coverage
measurement, so we can now enable the tests under coverage measurement.
------------------------------------------------------------------------
r59723 | rhe | 2017-09-02 15:17:52 +0900 (Sat, 02 Sep 2017) | 1 line

proc.c: [DOC] fixup r59720
------------------------------------------------------------------------
r59722 | nobu | 2017-09-02 11:05:34 +0900 (Sat, 02 Sep 2017) | 4 lines

getoptlong.rb: multiline regexps

* lib/getoptlong.rb: make regexps multiline safe.
  [ruby-core:82627] [Bug #13858]
------------------------------------------------------------------------
r59721 | nobu | 2017-09-02 10:47:43 +0900 (Sat, 02 Sep 2017) | 4 lines

cont.c: fix root fiber to_s

* cont.c (fiber_to_s): fix Fiber#to_s on root fibers which have no
  procs.  [ruby-core:82629] [Bug #13859]
------------------------------------------------------------------------
r59720 | nobu | 2017-09-02 10:41:14 +0900 (Sat, 02 Sep 2017) | 6 lines

Add Method#original_name code example [ci skip]

* proc.c (method_original_name): [DOC] add code example.
  [Fix GH-1693]

Author:    Seiei Miyagi <hanachin@gmail.com>
------------------------------------------------------------------------
r59719 | nobu | 2017-09-02 10:08:27 +0900 (Sat, 02 Sep 2017) | 6 lines

Update Hash#compact! documentation [ci skip]

* hash.c (rb_hash_compact_bang): [DOC] update the case if no
  changes were made.  [ruby-core:82591] [Bug #13855] [Fix GH-1692]

Author:    Lucas Buchala <lucasbuchala@gmail.com>
------------------------------------------------------------------------
r59718 | svn | 2017-09-02 09:26:38 +0900 (Sat, 02 Sep 2017) | 1 line

* 2017-09-02
------------------------------------------------------------------------
r59717 | suke | 2017-09-02 09:26:37 +0900 (Sat, 02 Sep 2017) | 3 lines

* ext/win32ole/win32ole.c (fole_initialize): fix typo. thanks to Gray Wolf. 
  [Feature #13828]

------------------------------------------------------------------------
r59716 | mame | 2017-09-01 23:58:52 +0900 (Fri, 01 Sep 2017) | 5 lines

ext/coverage/coverage.c: add Coverage.enabled?

* ext/coverage/coverage.c (rb_coverage_running): add to quickly
check if coverage is enabled.  patched by Burke Libbey <burke AT
libbey.me> in [ruby-core:81726].  [Feature #13667]
------------------------------------------------------------------------
r59715 | duerst | 2017-09-01 19:22:09 +0900 (Fri, 01 Sep 2017) | 4 lines

replace copyrights by explanatory text in data files for GB2312/GB12345 mappings

Replace the copyrights and explanatory texts in the data files used for mapping
GB2312/GB12345 to/from Unicode with short explanatory texts. [Bug #12598] [ci skip]
------------------------------------------------------------------------
r59714 | rhe | 2017-09-01 17:16:38 +0900 (Fri, 01 Sep 2017) | 4 lines

object.c: fix potential oob write in rb_str_to_dbl()

Ensure space for the terminating NUL byte. Note that this code path is
reachable only when Ruby is compiled with SHARABLE_MIDDLE_SUBSTRING=1.
------------------------------------------------------------------------
r59713 | hsbt | 2017-09-01 12:34:18 +0900 (Fri, 01 Sep 2017) | 4 lines

Exclude Changelog files from documentation.

  Patch from larskanis (Lars Kanis).
  [Misc #13704][ruby-core:81878]
------------------------------------------------------------------------
r59712 | ko1 | 2017-09-01 11:09:02 +0900 (Fri, 01 Sep 2017) | 2 lines

skip unless PLATFORM is darwin.

------------------------------------------------------------------------
r59711 | svn | 2017-09-01 10:13:54 +0900 (Fri, 01 Sep 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59710 | naruse | 2017-09-01 10:13:53 +0900 (Fri, 01 Sep 2017) | 3 lines

Fix C level backtrace on Darwin

SEGV caused by invalid instruction call.
------------------------------------------------------------------------
r59709 | nobu | 2017-09-01 09:58:52 +0900 (Fri, 01 Sep 2017) | 4 lines

compile.c: fix loading pathobj

* compile.c (ibf_load_iseq_each): location.pathobj may not be a
  mere string now.
------------------------------------------------------------------------
r59708 | nobu | 2017-09-01 09:43:00 +0900 (Fri, 01 Sep 2017) | 4 lines

compile.c: ensure after toplevel return

* compile.c (iseq_compile_each0): toplevel returns should fire
  ensures.  [ruby-core:82492] [Bug #13844]
------------------------------------------------------------------------
r59707 | svn | 2017-09-01 00:41:55 +0900 (Fri, 01 Sep 2017) | 1 line

* 2017-09-01
------------------------------------------------------------------------
r59706 | sorah | 2017-09-01 00:41:54 +0900 (Fri, 01 Sep 2017) | 7 lines

Skip test_open_tempfile_path on EINVAL

Looks like File::Constants::TMPFILE could be defined even when not
supported on system.  Just skip the test when we get EINVAL on open(2).

* test/ruby/test_file.rb(test_open_tempfile_path):
  Skip when EINVAL occured on File.open.
------------------------------------------------------------------------
r59705 | sorah | 2017-08-31 20:22:15 +0900 (Thu, 31 Aug 2017) | 1 line

add NEWS entry for [Feature #13568] r59704
------------------------------------------------------------------------
r59704 | sorah | 2017-08-31 20:14:36 +0900 (Thu, 31 Aug 2017) | 24 lines

File#path: Raise IOError when a file is O_TMPFILE

File#path for a file opened with O_TMPFILE has no meaning.

A filepath returned by this method isn't guarranteed about its accuracy,
but files opened with O_TMPFILE are known its recorded path has no
meaning. So let them not to return any pathname.

After a discussion in ruby-core, just returning Qnil makes guessing the
root cause difficult. Instead, this patch makes the method to raise an
error.

Other consideration is calling fnctl(2) on rb_file_path, but it adds a
overhead, and it's difficult to determine O_TMPFILE status  after fd has
been closed.

[Feature #13568]

* io.c(rb_file_open_generic): Set Qnil to fptr->pathv when opening a
  file using O_TMPFILE

* file.c(rb_file_path): Raise IOError when fptr->pathv is Qnil

* file.c(rb_file_path): [DOC] Update for the new behavior
------------------------------------------------------------------------
r59703 | naruse | 2017-08-31 17:33:35 +0900 (Thu, 31 Aug 2017) | 1 line

Added NEWS for r59702
------------------------------------------------------------------------
r59702 | naruse | 2017-08-31 17:29:38 +0900 (Thu, 31 Aug 2017) | 3 lines

Add Socket::Ifaddr.vhid on supported platforms [Feature #13803]

patched by Alan Somers
------------------------------------------------------------------------
r59701 | nobu | 2017-08-31 17:21:46 +0900 (Thu, 31 Aug 2017) | 6 lines

io.c: shrink read buffer

* io.c (io_setstrbuf): return true if the buffer is newly created.

* io.c (io_set_read_length): shrink the read buffer if it is a new
  object and is too large.  [ruby-core:81370] [Bug #13597]
------------------------------------------------------------------------
r59700 | nobu | 2017-08-31 17:07:59 +0900 (Thu, 31 Aug 2017) | 4 lines

string.c: adjust indent [ci skip]

* string.c (rb_str_enumerate_grapheme_clusters): adjust indent.
  [Feature #13780]
------------------------------------------------------------------------
r59699 | nobu | 2017-08-31 17:04:49 +0900 (Thu, 31 Aug 2017) | 4 lines

test_syntax.rb: suppress warnings

* test/ruby/test_syntax.rb (TestSyntax#test_return_toplevel):
  suppress unreachable statement warnings.
------------------------------------------------------------------------
r59698 | naruse | 2017-08-31 15:35:28 +0900 (Thu, 31 Aug 2017) | 3 lines

String#each_grapheme_cluster and String#grapheme_clusters

added to enumerate grapheme clusters [Feature #13780]
------------------------------------------------------------------------
r59697 | nobu | 2017-08-31 12:06:05 +0900 (Thu, 31 Aug 2017) | 4 lines

test_syntax.rb: assert output

* test/ruby/test_syntax.rb (TestSyntax#test_return_toplevel):
  assert expected output if given.
------------------------------------------------------------------------
r59696 | kazu | 2017-08-31 09:05:29 +0900 (Thu, 31 Aug 2017) | 3 lines

`$=` is no longer effective.  [ci skip]

* doc/globals.rdoc: [DOC] `$=` is no longer effective.
------------------------------------------------------------------------
r59695 | ko1 | 2017-08-31 07:23:45 +0900 (Thu, 31 Aug 2017) | 4 lines

to_str -> to_s

* lib/net/http/header.rb (set_field): `val` can not have `to_str`.

------------------------------------------------------------------------
r59694 | svn | 2017-08-31 02:24:05 +0900 (Thu, 31 Aug 2017) | 1 line

* 2017-08-31
------------------------------------------------------------------------
r59693 | naruse | 2017-08-31 02:24:05 +0900 (Thu, 31 Aug 2017) | 1 line

A HTTP Header value must not contain CR or LF.
------------------------------------------------------------------------
r59692 | nobu | 2017-08-30 17:26:16 +0900 (Wed, 30 Aug 2017) | 4 lines

array.c: refine binomial_coefficient

* array.c (binomial_coefficient): get rid of bignums by division
  after each multiplications.
------------------------------------------------------------------------
r59691 | nobu | 2017-08-30 16:55:19 +0900 (Wed, 30 Aug 2017) | 3 lines

array.c: refine descending_factorial

* array.c (descending_factorial): reduce factorial multipication.
------------------------------------------------------------------------
r59690 | svn | 2017-08-30 14:37:00 +0900 (Wed, 30 Aug 2017) | 1 line

* 2017-08-30
------------------------------------------------------------------------
r59689 | nobu | 2017-08-30 14:36:59 +0900 (Wed, 30 Aug 2017) | 10 lines

array.c: integer calculations

* array.c (rb_ary_cycle_size, descending_factorial): use
  rb_int_mul instead of rb_funcallv.

* array.c (binomial_coefficient): use rb_int_idiv instead of
  rb_funcallv.

* array.c (rb_ary_repeated_permutation_size): use
  rb_int_positive_pow.
------------------------------------------------------------------------
r59688 | nobu | 2017-08-29 21:13:37 +0900 (Tue, 29 Aug 2017) | 3 lines

array.c: use rb_check_array_type

* array.c (ary_join_1): simplified by rb_check_array_type.
------------------------------------------------------------------------
r59687 | svn | 2017-08-29 20:52:52 +0900 (Tue, 29 Aug 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59686 | hsbt | 2017-08-29 20:52:50 +0900 (Tue, 29 Aug 2017) | 4 lines

Merge rdoc-6.0.0.beta1.

  This version fixed strange behavior of ruby code parser.
  We will list all of impromovement to Changelog when 6.0.0 releasing.
------------------------------------------------------------------------
r59685 | nobu | 2017-08-29 20:35:35 +0900 (Tue, 29 Aug 2017) | 4 lines

array.c: nested encoding

* array.c (ary_join_1): ignore encodings in nested arrays as an
  initial encoding.
------------------------------------------------------------------------
r59684 | nobu | 2017-08-29 19:49:40 +0900 (Tue, 29 Aug 2017) | 4 lines

array.c: join encoding

* array.c (ary_join_1): copy the encoding of the converted string
  of the first element by to_str too, as an initial encoding.
------------------------------------------------------------------------
r59683 | hsbt | 2017-08-29 19:22:47 +0900 (Tue, 29 Aug 2017) | 3 lines

Partly reverted r59642. Because IO#close is idempotent since Ruby 2.3.

  Reported by Eric Wong. Thank you.
------------------------------------------------------------------------
r59682 | nobu | 2017-08-29 16:11:52 +0900 (Tue, 29 Aug 2017) | 1 line

test/ruby: tweaked heredocs
------------------------------------------------------------------------
r59681 | ko1 | 2017-08-29 16:01:27 +0900 (Tue, 29 Aug 2017) | 1 line

fix error message.
------------------------------------------------------------------------
r59680 | sonots | 2017-08-29 15:24:31 +0900 (Tue, 29 Aug 2017) | 4 lines

.gitignore: ignore run.gdb

* .gitignore: ignore run.gdb which is assumed to be generated
  by make gdb and customized manually during development
------------------------------------------------------------------------
r59679 | glass | 2017-08-29 13:58:29 +0900 (Tue, 29 Aug 2017) | 1 line

resolv.rb: remove unnecessary require statement
------------------------------------------------------------------------
r59678 | nobu | 2017-08-29 08:25:56 +0900 (Tue, 29 Aug 2017) | 5 lines

win32.c: fix function pointer

* win32/win32.c (rb_w32_set_thread_description): fix the condition
  if the API function pointer is found.
  [ruby-core:82494] [Bug #13845]
------------------------------------------------------------------------
r59677 | svn | 2017-08-29 01:05:11 +0900 (Tue, 29 Aug 2017) | 1 line

* 2017-08-29
------------------------------------------------------------------------
r59676 | naruse | 2017-08-29 01:05:11 +0900 (Tue, 29 Aug 2017) | 5 lines

Increase STACKFRAME_FOR_CALL_CFUNC

On below env, miniruby requires 568 and ruby requires 838 to pass.
* ruby -v: ruby 2.5.0dev (2017-08-28 trunk 59670) [x86_64-freebsd10.3]
* gcc8 (FreeBSD Ports Collection) 8.0.0 20170828 (experimental)
------------------------------------------------------------------------
r59675 | nobu | 2017-08-28 23:21:40 +0900 (Mon, 28 Aug 2017) | 3 lines

compile.c: compile_if

* compile.c (compile_if): extract from iseq_compile_each.
------------------------------------------------------------------------
r59674 | kazu | 2017-08-28 20:20:08 +0900 (Mon, 28 Aug 2017) | 1 line

[DOC] Fix typo in rdoc of `transform_values!` [ci skip]
------------------------------------------------------------------------
r59673 | glass | 2017-08-28 19:55:37 +0900 (Mon, 28 Aug 2017) | 4 lines

string.c: fix potential bug in String#split

* string.c (rb_str_split_m): fix potential bug when rb_memsearch()
  matches a octet in the middle of a multi-byte character sequence.
------------------------------------------------------------------------
r59672 | hsbt | 2017-08-28 17:31:28 +0900 (Mon, 28 Aug 2017) | 4 lines

Merge rubygems-2.6.13.

  see details for this update:
  http://blog.rubygems.org/2017/08/27/2.6.13-released.html
------------------------------------------------------------------------
r59671 | glass | 2017-08-28 16:54:00 +0900 (Mon, 28 Aug 2017) | 3 lines

lib/csv.rb: refactor and optimize. This change
includes the patch from marshall-lee.
close #1168
------------------------------------------------------------------------
r59670 | nobu | 2017-08-28 01:18:17 +0900 (Mon, 28 Aug 2017) | 3 lines

compile.c: compile_ensure

* compile.c (compile_ensure): extract from iseq_compile_each.
------------------------------------------------------------------------
r59669 | nobu | 2017-08-28 01:15:19 +0900 (Mon, 28 Aug 2017) | 3 lines

compile.c: compile_resbody

* compile.c (compile_resbody): extract from iseq_compile_each.
------------------------------------------------------------------------
r59668 | svn | 2017-08-28 01:04:27 +0900 (Mon, 28 Aug 2017) | 1 line

* 2017-08-28
------------------------------------------------------------------------
r59667 | nobu | 2017-08-28 01:04:26 +0900 (Mon, 28 Aug 2017) | 3 lines

compile.c: compile_rescue

* compile.c (compile_rescue): extract from iseq_compile_each.
------------------------------------------------------------------------
r59666 | shugo | 2017-08-27 15:32:00 +0900 (Sun, 27 Aug 2017) | 4 lines

lib/net/imap.rb: Accept continuation requests without response text

The IMAP server of DOCOMO returns such continuation requests.
[ruby-list:50558]
------------------------------------------------------------------------
r59665 | suke | 2017-08-27 08:39:43 +0900 (Sun, 27 Aug 2017) | 2 lines

* ext/win32ole/win32ole.c (fole_initialize): support licensed COM server. Thanks to Gray Wolf. [Feature :#13828]

------------------------------------------------------------------------
r59664 | nobu | 2017-08-27 06:02:23 +0900 (Sun, 27 Aug 2017) | 3 lines

vcs.rb: refresh after dcommit

* tool/vcs.rb (VCS::GIT#commit): refresh until sync after dcommit.
------------------------------------------------------------------------
r59663 | svn | 2017-08-27 05:55:32 +0900 (Sun, 27 Aug 2017) | 1 line

* 2017-08-27
------------------------------------------------------------------------
r59662 | nobu | 2017-08-27 05:55:31 +0900 (Sun, 27 Aug 2017) | 1 line

NEWS: Thread#name= on Windows [ci skip]
------------------------------------------------------------------------
r59661 | nobu | 2017-08-26 23:22:31 +0900 (Sat, 26 Aug 2017) | 4 lines

win32.c: fix return value

* win32/win32.c (rb_w32_set_thread_description_str): return the
  result when name is nil.
------------------------------------------------------------------------
r59660 | nobu | 2017-08-26 09:30:03 +0900 (Sat, 26 Aug 2017) | 7 lines

thread_win32.c: set thread name

* thread_win32.c (native_set_another_thread_name): set thread name
  by SetThreadDescription.

* win32/win32.c (rb_w32_set_thread_description): dynamically try
  SetThreadDescription.
------------------------------------------------------------------------
r59659 | svn | 2017-08-26 00:47:05 +0900 (Sat, 26 Aug 2017) | 1 line

* 2017-08-26
------------------------------------------------------------------------
r59658 | kazu | 2017-08-26 00:47:04 +0900 (Sat, 26 Aug 2017) | 3 lines

`$IGNORECASE` is no longer effective.  [ci skip]

* lib/English.rb: [DOC] `$IGNORECASE` is no longer effective.
------------------------------------------------------------------------
r59657 | glass | 2017-08-25 17:13:32 +0900 (Fri, 25 Aug 2017) | 7 lines

csv.rb: optimize CSV::Table#to_a and #to_csv

* lib/csv.rb (CSV::Table#to_a, #to_csv): use Array#push instead of
  Array#concat for performance improvement. This performance improvement is
  proposed by zdennis <zach.dennis@gmail.com>. The patch is from
  Mau Magnaguagno <maumagnaguagno@gmail.com>.
  close #946
------------------------------------------------------------------------
r59656 | nobu | 2017-08-25 12:41:43 +0900 (Fri, 25 Aug 2017) | 4 lines

compile.c: unreachable chunk

* compile.c (iseq_peephole_optimize): remove unreachable chunk
  which appeared by useless jump elimination.
------------------------------------------------------------------------
r59655 | nobu | 2017-08-25 12:33:32 +0900 (Fri, 25 Aug 2017) | 4 lines

compile.c: useless jump elimination

* compile.c (iseq_peephole_optimize): eliminate useless if/unless
  just before jump.
------------------------------------------------------------------------
r59654 | svn | 2017-08-25 11:37:39 +0900 (Fri, 25 Aug 2017) | 1 line

* 2017-08-25
------------------------------------------------------------------------
r59653 | nobu | 2017-08-25 11:37:38 +0900 (Fri, 25 Aug 2017) | 4 lines

compile.c: moved comments [ci skip]

* compile.c (iseq_peephole_optimize): moved comments inside proper
  blocks.
------------------------------------------------------------------------
r59652 | nobu | 2017-08-24 16:31:56 +0900 (Thu, 24 Aug 2017) | 4 lines

compile.c: show failed instructions

* compile.c (iseq_set_sequence): show failed instructions at
  adjuststack mismatch.
------------------------------------------------------------------------
r59651 | svn | 2017-08-24 16:26:06 +0900 (Thu, 24 Aug 2017) | 1 line

* 2017-08-24
------------------------------------------------------------------------
r59650 | nobu | 2017-08-24 16:26:05 +0900 (Thu, 24 Aug 2017) | 1 line

compile.c: free before adjust error
------------------------------------------------------------------------
r59649 | nobu | 2017-08-23 13:01:39 +0900 (Wed, 23 Aug 2017) | 4 lines

gc.c: restore cfp at finalizer

* gc.c (run_finalizer): restore cfp for the case an exception
  raised in a finalizer.  [ruby-core:82432] [Bug #13832]
------------------------------------------------------------------------
r59648 | nobu | 2017-08-23 12:14:05 +0900 (Wed, 23 Aug 2017) | 1 line

skip unless finalizers run
------------------------------------------------------------------------
r59647 | nobu | 2017-08-23 11:26:02 +0900 (Wed, 23 Aug 2017) | 4 lines

gc.c: run all finalizers

* gc.c (run_finalizer): revert r59155 partially. finalizing loop
  should continue even after an exception is rescued.
------------------------------------------------------------------------
r59646 | svn | 2017-08-23 11:23:48 +0900 (Wed, 23 Aug 2017) | 1 line

* 2017-08-23
------------------------------------------------------------------------
r59645 | ko1 | 2017-08-23 11:23:47 +0900 (Wed, 23 Aug 2017) | 3 lines

remove debug code.


------------------------------------------------------------------------
r59644 | nobu | 2017-08-22 22:21:18 +0900 (Tue, 22 Aug 2017) | 4 lines

parse.y: primary should not be 0

* parse.y (primary): should not be 0, since it can be a receiver.
  [ruby-core:82447] [Bug #13836]
------------------------------------------------------------------------
r59643 | hsbt | 2017-08-22 15:57:00 +0900 (Tue, 22 Aug 2017) | 3 lines

Fixed regression to convert blank value at r45497.

  [Bug #11126][ruby-core:69088]
------------------------------------------------------------------------
r59642 | hsbt | 2017-08-22 15:40:59 +0900 (Tue, 22 Aug 2017) | 3 lines

Gracefully handle CSV IO when file descriptor closed.

  [Bug #10504][ruby-core:66240]
------------------------------------------------------------------------
r59641 | hsbt | 2017-08-22 15:34:27 +0900 (Tue, 22 Aug 2017) | 3 lines

Fixed equality method fails when given the object that doesn't support table method.

  [Bug #12422][ruby-core:75707]
------------------------------------------------------------------------
r59640 | hsbt | 2017-08-22 15:17:42 +0900 (Tue, 22 Aug 2017) | 3 lines

Fixed to write_headers option behavior when given no rows.

  [Bug #9988][ruby-core:63375]
------------------------------------------------------------------------
r59639 | hsbt | 2017-08-22 14:32:34 +0900 (Tue, 22 Aug 2017) | 5 lines

Escape skip_lines string before convert to Regexp.

  It ignored all of lines when given Regexp special characters.

  [Feature #9147][ruby-core:58549]
------------------------------------------------------------------------
r59638 | nobu | 2017-08-22 13:40:16 +0900 (Tue, 22 Aug 2017) | 1 line

pack insn_operand_info and insn_len_info
------------------------------------------------------------------------
r59637 | nobu | 2017-08-22 13:37:08 +0900 (Tue, 22 Aug 2017) | 1 line

pack insns_name_info
------------------------------------------------------------------------
r59636 | nobu | 2017-08-22 13:22:01 +0900 (Tue, 22 Aug 2017) | 1 line

tool/instruction.rb: move logics to templates
------------------------------------------------------------------------
r59635 | nobu | 2017-08-22 12:07:01 +0900 (Tue, 22 Aug 2017) | 4 lines

insns.inc.tmpl: ensure info size

* template/insns.inc.tmpl (ASSERT_VM_INSTRUCTION_SIZE): static
  assertion for VM instruction info tables.
------------------------------------------------------------------------
r59634 | nobu | 2017-08-22 11:46:16 +0900 (Tue, 22 Aug 2017) | 4 lines

signal.c: fatal stack

* signal.c (check_stack_overflow): raise fatal when the last tag
  is in danger zone.
------------------------------------------------------------------------
r59633 | nobu | 2017-08-22 11:42:23 +0900 (Tue, 22 Aug 2017) | 1 line

signal.c: removed raise_stack_overflow:
------------------------------------------------------------------------
r59632 | svn | 2017-08-22 09:41:25 +0900 (Tue, 22 Aug 2017) | 1 line

* 2017-08-22
------------------------------------------------------------------------
r59631 | ko1 | 2017-08-22 09:41:24 +0900 (Tue, 22 Aug 2017) | 5 lines

split out struct cont_saved_vm_stack.

* cont.c: introduce `struct cont_saved_vm_stack` which was part of
  `struct rb_context_struct`.

------------------------------------------------------------------------
r59630 | nobu | 2017-08-21 23:15:31 +0900 (Mon, 21 Aug 2017) | 7 lines

prevent stack overflow

* gc.c: enable PREVENT_STACK_OVERFLOW.

* vm.c (invoke_iseq_block_from_c): prevent stack overflow.

* vm_eval.c (stack_check): raise preallocated exception instance.
------------------------------------------------------------------------
r59629 | yui-knk | 2017-08-21 22:38:35 +0900 (Mon, 21 Aug 2017) | 6 lines

Remove a meaningless local variable assignment

* iseq.c (rb_iseq_disasm_insn): Remove a meaningless
  local variable assignment. `insn` is never changed
  in this function, so a result of `insn_op_types(insn)`
  is also never changed.
------------------------------------------------------------------------
r59628 | svn | 2017-08-21 15:46:47 +0900 (Mon, 21 Aug 2017) | 1 line

* 2017-08-21
------------------------------------------------------------------------
r59627 | nobu | 2017-08-21 15:46:46 +0900 (Mon, 21 Aug 2017) | 7 lines

vm_core.h: ruby_error_stackfatal

* vm_core.h (ruby_special_exceptions): rename sysstack_gc as
  stackfatal.

* eval.c (Init_eval): modified the message for stackfatal error as
  "critical region".
------------------------------------------------------------------------
r59626 | nobu | 2017-08-20 15:08:25 +0900 (Sun, 20 Aug 2017) | 6 lines

non-keywords hash

* class.c (rb_scan_args), include/ruby/ruby.h (rb_scan_args_set):
  return non-keywords elements only in the last hash when keyword
  arguments are extracted from it, as well as methods defined in
  ruby level.  [ruby-core:82427] [Bug #13830]
------------------------------------------------------------------------
r59625 | svn | 2017-08-20 08:39:04 +0900 (Sun, 20 Aug 2017) | 1 line

* 2017-08-20
------------------------------------------------------------------------
r59624 | nobu | 2017-08-20 08:39:03 +0900 (Sun, 20 Aug 2017) | 7 lines

ruby.h: fix rb_scan_args_trail_idx

* include/ruby/ruby.h (rb_scan_args_trail_idx): fix the case both
  of optional and rest arguments are defined.
  [ruby-core:82427] [Bug #13830]

* include/ruby/ruby.h (rb_scan_args_n_trail): ditto.
------------------------------------------------------------------------
r59623 | ktsj | 2017-08-19 19:02:57 +0900 (Sat, 19 Aug 2017) | 1 line

gems/bundled_gems: Update to power_assert 1.1.0
------------------------------------------------------------------------
r59622 | nobu | 2017-08-19 10:04:15 +0900 (Sat, 19 Aug 2017) | 4 lines

class.c: check kw hash

* class.c (rb_keyword_error_new): get rid of an intermediate
  string and check if keys are symbols.
------------------------------------------------------------------------
r59621 | svn | 2017-08-19 09:45:23 +0900 (Sat, 19 Aug 2017) | 1 line

* 2017-08-19
------------------------------------------------------------------------
r59620 | nobu | 2017-08-19 09:45:22 +0900 (Sat, 19 Aug 2017) | 1 line

class.c: call rb_hash_keys directly
------------------------------------------------------------------------
r59619 | nobu | 2017-08-18 21:44:30 +0900 (Fri, 18 Aug 2017) | 4 lines

vm_insnhelper.c: vm_cfp_consistent_p

* vm_insnhelper.c (vm_cfp_consistent_p): extracted the conditions
  for cfp consistency.
------------------------------------------------------------------------
r59618 | nobu | 2017-08-18 21:17:59 +0900 (Fri, 18 Aug 2017) | 4 lines

vm_insnhelper.c: raise ruby_error_sysstack_gc

* vm_insnhelper.c (rb_threadptr_stack_overflow): rb_fatal is not
  available during GC.  raise the preallocated fatal error.
------------------------------------------------------------------------
r59617 | shugo | 2017-08-18 14:16:05 +0900 (Fri, 18 Aug 2017) | 3 lines

test/net/imap/test_imap.rb: Use Addrinfo.tcp in case localhost is ::1.

[ruby-dev:50208] [Bug #13825]
------------------------------------------------------------------------
r59616 | nobu | 2017-08-18 08:31:41 +0900 (Fri, 18 Aug 2017) | 4 lines

Revert r59612

* method.h (rb_method_definition_t): rb_method_type_t should be
  unsigned as it needs 5bits at least for signed extension.
------------------------------------------------------------------------
r59615 | svn | 2017-08-18 01:34:40 +0900 (Fri, 18 Aug 2017) | 1 line

* 2017-08-18
------------------------------------------------------------------------
r59614 | naruse | 2017-08-18 01:34:40 +0900 (Fri, 18 Aug 2017) | 36 lines

Add optimization for creating zerofill string

```
require 'benchmark'
n = 1 * 1024 * 1024 * 1024
Benchmark.bmbm do |x|
  x.report("*") { 0.chr * n }
  x.report("ljust") { String.new(capacity: n).ljust(n, "\0") }
end
```

Before

```% ./ruby test.rb
Rehearsal -----------------------------------------
*       0.358396   0.392753   0.751149 (  1.134231)
ljust   0.203277   0.389223   0.592500 (  0.594816)
-------------------------------- total: 1.343649sec

            user     system      total        real
*       0.282647   0.304600   0.587247 (  0.589205)
ljust   0.201834   0.283801   0.485635 (  0.487617)
```

After

```% ./ruby test.rb
Rehearsal -----------------------------------------
*       0.000522   0.000021   0.000543 (  0.000534)
ljust   0.208551   0.321030   0.529581 (  0.542083)
-------------------------------- total: 0.530124sec

            user     system      total        real
*       0.000069   0.000006   0.000075 (  0.000069)
ljust   0.206698   0.301032   0.507730 (  0.517674)
```
------------------------------------------------------------------------
r59613 | nobu | 2017-08-17 23:58:11 +0900 (Thu, 17 Aug 2017) | 5 lines

vm_method.c: alias warning at refined method

* vm_method.c (rb_method_entry_make): suppress a warning at
  refined method which will not be redefined.
  [ruby-core:82385] [Bug #13817]
------------------------------------------------------------------------
r59612 | nobu | 2017-08-17 23:36:57 +0900 (Thu, 17 Aug 2017) | 4 lines

method.h: enum rb_method_definition_t::type

* method.h (rb_method_definition_t): define type as an enum for
  debugging.
------------------------------------------------------------------------
r59611 | nobu | 2017-08-17 21:33:41 +0900 (Thu, 17 Aug 2017) | 4 lines

parse.y: unexpected tINTEGER message

* parse.y (parser_number_literal_suffix): keep token after numeric
  suffix to show the value in an error message.
------------------------------------------------------------------------
r59610 | svn | 2017-08-17 21:31:11 +0900 (Thu, 17 Aug 2017) | 1 line

* 2017-08-17
------------------------------------------------------------------------
r59609 | kazu | 2017-08-17 21:31:10 +0900 (Thu, 17 Aug 2017) | 4 lines

Use `*` instead of `**` in .editorconfig

It seems `**` is same as `*` when no `/` exist.
[ci skip]
------------------------------------------------------------------------
r59608 | hsbt | 2017-08-16 18:45:58 +0900 (Wed, 16 Aug 2017) | 3 lines

Extract files variables of ipaddr.gemspec for non git environment.

  [Bug #13808][ruby-core:82358]
------------------------------------------------------------------------
r59607 | hsbt | 2017-08-16 18:37:03 +0900 (Wed, 16 Aug 2017) | 4 lines

Added gemspec of digest library.

  standalone repository is https://github.com/ruby/digest
  [Misc #13771][ruby-core:82179]
------------------------------------------------------------------------
r59606 | nobu | 2017-08-16 16:18:45 +0900 (Wed, 16 Aug 2017) | 5 lines

vm_insnhelper.c: cfp error at stack overflow

* vm_insnhelper.c (threadptr_stack_overflow): set stack overflow
  flag until handling execptions, to get rid of cfp consistency
  error when exec tag was rewound.  [ruby-core:80618] [Bug #13412]
------------------------------------------------------------------------
r59605 | naruse | 2017-08-16 06:39:38 +0900 (Wed, 16 Aug 2017) | 3 lines

Partially revert "suppress warning: assigned but unused variable - line"

revert unexpected changes
------------------------------------------------------------------------
r59604 | naruse | 2017-08-16 06:36:16 +0900 (Wed, 16 Aug 2017) | 1 line

suppress warning: assigned but unused variable - line
------------------------------------------------------------------------
r59603 | svn | 2017-08-16 06:33:44 +0900 (Wed, 16 Aug 2017) | 1 line

* 2017-08-16
------------------------------------------------------------------------
r59602 | naruse | 2017-08-16 06:33:43 +0900 (Wed, 16 Aug 2017) | 1 line

High Sierra's APFS cannot use invalid filenames [Bug #13816]
------------------------------------------------------------------------
r59601 | nobu | 2017-08-15 22:53:38 +0900 (Tue, 15 Aug 2017) | 4 lines

parse.y: removed useless check

* parse.y (singleton): literal nodes are always value expressions,
  no check is necessary.
------------------------------------------------------------------------
r59600 | yui-knk | 2017-08-15 22:12:39 +0900 (Tue, 15 Aug 2017) | 6 lines

Remove not exist arguments from comments of insns

is_local argument was introduced on r11639 and removed on r11813.

* insns.def (getinstancevariable, setinstancevariable): Remove a not
  exist argument.
------------------------------------------------------------------------
r59599 | naruse | 2017-08-15 22:05:18 +0900 (Tue, 15 Aug 2017) | 1 line

suppress warning: assigned but unused variable - line
------------------------------------------------------------------------
r59598 | nobu | 2017-08-15 10:05:50 +0900 (Tue, 15 Aug 2017) | 4 lines

ftp.rb: fix example format [ci skip]

* lib/uri/ftp.rb: [DOC] fix format of example URLs.  patched by
  aycabta (Code Ahss) at [ruby-core:82379].  [Bug #13814]
------------------------------------------------------------------------
r59597 | nobu | 2017-08-15 09:50:22 +0900 (Tue, 15 Aug 2017) | 5 lines

ripper.rb: fix License format [ci skip]

* ext/ripper/lib/ripper.rb: [DOC] fix format of the License
  description and the author.  patched by aycabta (Code Ahss) at
  [ruby-core:82376].  [Bug #13813]
------------------------------------------------------------------------
r59596 | nobu | 2017-08-15 09:45:14 +0900 (Tue, 15 Aug 2017) | 3 lines

compile.c: compile_retry

* compile.c (compile_retry): extract from iseq_compile_each.
------------------------------------------------------------------------
r59595 | nobu | 2017-08-15 09:45:13 +0900 (Tue, 15 Aug 2017) | 3 lines

compile.c: compile_redo

* compile.c (compile_redo): extract from iseq_compile_each.
------------------------------------------------------------------------
r59594 | nobu | 2017-08-15 09:18:47 +0900 (Tue, 15 Aug 2017) | 3 lines

compile.c: compile_next

* compile.c (compile_next): extract from iseq_compile_each.
------------------------------------------------------------------------
r59593 | nobu | 2017-08-15 08:55:34 +0900 (Tue, 15 Aug 2017) | 3 lines

compile.c: compile_break

* compile.c (compile_break): extract from iseq_compile_each.
------------------------------------------------------------------------
r59592 | svn | 2017-08-15 01:04:36 +0900 (Tue, 15 Aug 2017) | 1 line

* 2017-08-15
------------------------------------------------------------------------
r59591 | duerst | 2017-08-15 01:04:35 +0900 (Tue, 15 Aug 2017) | 2 lines

fix documentation of REXML::Formatters::Default (id_hack -> ie_hack) [ci skip]

------------------------------------------------------------------------
r59590 | nobu | 2017-08-14 23:25:27 +0900 (Mon, 14 Aug 2017) | 3 lines

compile.c: compile_loop

* compile.c (compile_loop): extract from iseq_compile_each.
------------------------------------------------------------------------
r59589 | nobu | 2017-08-14 23:18:29 +0900 (Mon, 14 Aug 2017) | 1 line

type is invariant inside this block
------------------------------------------------------------------------
r59588 | svn | 2017-08-14 22:26:38 +0900 (Mon, 14 Aug 2017) | 1 line

* 2017-08-14
------------------------------------------------------------------------
r59587 | yui-knk | 2017-08-14 22:26:37 +0900 (Mon, 14 Aug 2017) | 5 lines

Fix a class of a returned value

* ext/objspace/object_tracing.c (allocation_sourceline): Fix
  a class of a returned value. allocation_sourceline returns
  an integer.
------------------------------------------------------------------------
r59586 | nobu | 2017-08-13 22:43:36 +0900 (Sun, 13 Aug 2017) | 6 lines

script.rb: skip empty directories

* spec/mspec/lib/mspec/utils/script.rb (entries): skip empty
  directories so that at least one file would run.

Merged https://github.com/ruby/spec/issues/459
------------------------------------------------------------------------
r59585 | nobu | 2017-08-13 22:34:26 +0900 (Sun, 13 Aug 2017) | 8 lines

parse.y: set used flag in gettable

* parse.y (dvar_defined_ref, dvar_defined): rename macros.  only
  gettable uses the former.  assignable should not set LVAR_USED
  flag.

* parse.y (gettable_gen): set used flag on local/dynamic variables
  instead of setting in lexer.  [ruby-core:82368] [Bug #13809]
------------------------------------------------------------------------
r59584 | kou | 2017-08-13 21:14:24 +0900 (Sun, 13 Aug 2017) | 6 lines

REXML: Fix a bug that unexpected methods can be called as a XPath function

[HackerOne:249295]

Reported by Andrea Jegher. Thanks!!!

------------------------------------------------------------------------
r59583 | nobu | 2017-08-13 16:53:04 +0900 (Sun, 13 Aug 2017) | 4 lines

stringio.c: suppress a warning [ci skip]

* ext/stringio/stringio.c (strio_read): suppress an
  implicit-fallthrough warning.
------------------------------------------------------------------------
r59582 | nobu | 2017-08-13 16:31:49 +0900 (Sun, 13 Aug 2017) | 4 lines

stringio.c: encoding at empty chomped result

* ext/stringio/stringio.c (strio_gets): should return string with
  the external encoding, at empty chomped result .
------------------------------------------------------------------------
r59581 | nobu | 2017-08-13 16:21:13 +0900 (Sun, 13 Aug 2017) | 4 lines

stringio.c: encoding at empty result

* ext/stringio/stringio.c (strio_gets): should return string with
  the external encoding, at empty result.
------------------------------------------------------------------------
r59580 | svn | 2017-08-13 02:41:49 +0900 (Sun, 13 Aug 2017) | 1 line

* 2017-08-13
------------------------------------------------------------------------
r59579 | naruse | 2017-08-13 02:41:48 +0900 (Sun, 13 Aug 2017) | 1 line

Suppress warning: shadowing outer local variable - klass
------------------------------------------------------------------------
r59578 | nobu | 2017-08-12 10:47:09 +0900 (Sat, 12 Aug 2017) | 5 lines

stringio.c: encoding at EOF

* ext/stringio/stringio.c (strio_read): should return string with
  the external encoding, at EOF too.
  [ruby-core:82349] [Bug #13806]
------------------------------------------------------------------------
r59577 | svn | 2017-08-12 10:34:14 +0900 (Sat, 12 Aug 2017) | 1 line

* 2017-08-12
------------------------------------------------------------------------
r59576 | nobu | 2017-08-12 10:34:13 +0900 (Sat, 12 Aug 2017) | 4 lines

test_stringio.rb: more assertions

* test/stringio/test_stringio.rb (test_read): add assertions
  of return value of read with a buffer string.
------------------------------------------------------------------------
r59575 | nobu | 2017-08-11 11:44:30 +0900 (Fri, 11 Aug 2017) | 1 line

enum.c: make constant argument static
------------------------------------------------------------------------
r59574 | nobu | 2017-08-11 11:05:24 +0900 (Fri, 11 Aug 2017) | 4 lines

re.c: options for sub-regexp

* re.c (rb_reg_to_s): needs embedded options to check syntax of
  sub-regexp.  [ruby-core:82328] [Bug #13798]
------------------------------------------------------------------------
r59573 | svn | 2017-08-11 10:27:25 +0900 (Fri, 11 Aug 2017) | 1 line

* 2017-08-11
------------------------------------------------------------------------
r59572 | nobu | 2017-08-11 10:27:24 +0900 (Fri, 11 Aug 2017) | 6 lines

separate hash literal and keyword arguments

* compile.c (compile_array_keyword_arg): separate keyword splat
  inside hash literal from argument list.

* parse.y (rparen): flag hash literal.
------------------------------------------------------------------------
r59571 | yui-knk | 2017-08-10 23:46:51 +0900 (Thu, 10 Aug 2017) | 5 lines

Fix types of function argument

* doc/extension.ja.rdoc: Fix types of rb_ary_aref argument

* doc/extension.rdoc: ditto
------------------------------------------------------------------------
r59570 | nagachika | 2017-08-10 21:57:07 +0900 (Thu, 10 Aug 2017) | 3 lines

fix a typo in comment.

	* cont.c (typedef struct rb_context_struct): fix a typo in comment.
------------------------------------------------------------------------
r59569 | knu | 2017-08-10 21:37:04 +0900 (Thu, 10 Aug 2017) | 3 lines

Import ruby-electric.el version 2.3.1 from upstream

It now supports [enh-ruby-mode](https://github.com/zenspider/enhanced-ruby-mode).
------------------------------------------------------------------------
r59568 | nobu | 2017-08-10 20:40:49 +0900 (Thu, 10 Aug 2017) | 4 lines

vm_core.h: unreachable VM_UNREACHABLE

* vm_core.h (VM_UNREACHABLE): tell unreachable if possible.
  suppress an invalid-noreturn warning at rb_fiber_start.
------------------------------------------------------------------------
r59567 | rhe | 2017-08-10 18:23:45 +0900 (Thu, 10 Aug 2017) | 26 lines

openssl: import v2.0.5

Import Ruby/OpenSSL 2.0.5. The full commit history since v2.0.4
(imported at r59081) can be found at:

	https://github.com/ruby/openssl/compare/v2.0.4...v2.0.5

This will fix the test failure on latest Debian sid and the "no
OPENSSL_Applink" issue on mswin.

----------------------------------------------------------------
Kazuki Yamaguchi (11):
      test/test_ssl: allow 3DES cipher suites in test_sslctx_set_params
      bio: prevent possible GC issue in ossl_obj2bio()
      bio: do not use the FILE BIO method in ossl_obj2bio()
      Rakefile: install_dependencies: install only when needed
      appveyor.yml: test against Ruby 2.4
      ossl_pem_passwd_cb: relax passphrase length constraint
      ossl_pem_passwd_cb: do not check for taintedness
      ossl_pem_passwd_cb: handle nil from the block explicitly
      ssl: remove unsupported TLS versions from SSLContext::METHODS
      ssl: fix compile error with OpenSSL 1.0.0
      Ruby/OpenSSL 2.0.5

Lars Kanis (1):
      Add msys2 library dependency tag in gem metadata
------------------------------------------------------------------------
r59566 | ko1 | 2017-08-10 15:26:52 +0900 (Thu, 10 Aug 2017) | 2 lines

use VM_UNREACHABLE() instead of rb_bug().

------------------------------------------------------------------------
r59565 | ko1 | 2017-08-10 15:01:57 +0900 (Thu, 10 Aug 2017) | 6 lines

introduce fiber_restore_thread.

* cont.c (fiber_restore_thread): added (separate from cont_restore_thread).

* cont.c (fiber_setcontext): call fiber_restore_thread() directly.

------------------------------------------------------------------------
r59564 | nobu | 2017-08-10 14:54:56 +0900 (Thu, 10 Aug 2017) | 5 lines

ruby.c: ignore non-option in shebang line

* ruby.c (moreswitches): process all words as options only in
  an environment variable, but not in a shebang line.
  [ruby-core:82267] [Bug #13786]
------------------------------------------------------------------------
r59563 | ko1 | 2017-08-10 13:55:12 +0900 (Thu, 10 Aug 2017) | 6 lines

rename rb_execution_context_t::stack(_size) to vm_stack(_size).

* vm_core.h: Ruby processes run with two stacks, a machine stack and a
  VM stack. To make it clear, this fix renames
  rb_execution_context_t::stack(_size) to vm_stack(_size).

------------------------------------------------------------------------
r59562 | nobu | 2017-08-10 13:03:48 +0900 (Thu, 10 Aug 2017) | 1 line

cont.c: fix up r59557 for !FIBER_USE_NATIVE
------------------------------------------------------------------------
r59561 | ko1 | 2017-08-10 12:34:25 +0900 (Thu, 10 Aug 2017) | 3 lines

constify some variables.


------------------------------------------------------------------------
r59560 | ko1 | 2017-08-10 12:20:39 +0900 (Thu, 10 Aug 2017) | 7 lines

Define Thread#to_s (as Thread#inspect) and make alias `inspect` as `to_s`.

* thread.c: "Thread#to_s" is not defined without any reason. So this fix
  define "Thread#to_s" which returns a string with some thread information.
  Also this fix makes alias "inspect" which refers "to_s". This manner is
  same as other objects.

------------------------------------------------------------------------
r59559 | ko1 | 2017-08-10 12:09:51 +0900 (Thu, 10 Aug 2017) | 2 lines

remove additional newline.

------------------------------------------------------------------------
r59558 | ko1 | 2017-08-10 11:58:36 +0900 (Thu, 10 Aug 2017) | 7 lines

Fiber#to_s (#inspect) return richer information.

* cont.c (fiber_to_s): return with block and status information.

* proc.c (proc_to_s_): removed and introduce rb_block_to_s() function
  to return block information string.

------------------------------------------------------------------------
r59557 | ko1 | 2017-08-10 10:47:13 +0900 (Thu, 10 Aug 2017) | 16 lines

refactoring Fiber status.

* cont.c: revisit fiber status.
  "FIBER_RUNNING" status represents fiber is resumed or suspended.
  This fix separate these two status explicitly.
  FIBER_CREATED: Just after Fiber.new. Not resumed yet.
  FIBER_RESUMED (new): Fiber#resumed. Now this fiber is running.
  FIBER_SUSPENDED (new): Suspended by Fiber.yield. Not running.
  FIBER_TERMINATED: Terminated.

  Add sevral assertions to check consistency with these status.

* cont.c (fiber_status_set): added to change status.

* cont.c (FIBER_xxx_P): added to check fiber status.

------------------------------------------------------------------------
r59556 | nobu | 2017-08-10 09:50:45 +0900 (Thu, 10 Aug 2017) | 5 lines

compile.c: fix KW_SPLAT flag condition

* compile.c (compile_array_keyword_arg): fix the condition of
  KW_SPLAT flag.  splat is value node only without key node,
  simple assoc argument is not.  [ruby-core:82291] [Bug #13793]
------------------------------------------------------------------------
r59555 | svn | 2017-08-10 09:32:13 +0900 (Thu, 10 Aug 2017) | 1 line

* 2017-08-10
------------------------------------------------------------------------
r59554 | nobu | 2017-08-10 09:32:12 +0900 (Thu, 10 Aug 2017) | 5 lines

vm_args.c: prefer optarg to keyword splat

* vm_args.c (setup_parameters_complex): prefer optional argument
  to splat keyword arguments for backward compatibility.
  [ruby-core:82280] [Bug #13791]
------------------------------------------------------------------------
r59549 | nobu | 2017-08-09 20:03:55 +0900 (Wed, 09 Aug 2017) | 13 lines

ruby.c: origarg

* ruby.c (dladdr_path, ruby_set_argv): add guards for origarg.
  [ruby-core:82272] [Bug #13788]

* ruby.c (proc_options, process_options, ruby_process_options):
  set origarg if not set yet.

* ruby.c (process_options): prefer argv in the argument to origarg
  as program name.

* ruby.c (ruby_sysinit): set origarg only if argc and argv seem
  valid.
------------------------------------------------------------------------
r59536 | svn | 2017-08-09 17:17:53 +0900 (Wed, 09 Aug 2017) | 1 line

* 2017-08-09
------------------------------------------------------------------------
r59535 | usa | 2017-08-09 17:17:52 +0900 (Wed, 09 Aug 2017) | 4 lines

Missed `#` in usage

* tool/generate-backport-changelog.rb (usage): missed `#` in usage

------------------------------------------------------------------------
r59529 | nobu | 2017-08-08 19:43:19 +0900 (Tue, 08 Aug 2017) | 5 lines

dir.c: fix up r59527

* dir.c (glob_helper): fix up r59527, dot files other than current
  directory should not be included unless FNM_DOTMATCH is given.
  [ruby-core:82266] [Bug #13785]
------------------------------------------------------------------------
r59528 | svn | 2017-08-08 17:34:11 +0900 (Tue, 08 Aug 2017) | 1 line

* 2017-08-08
------------------------------------------------------------------------
r59527 | nobu | 2017-08-08 17:34:10 +0900 (Tue, 08 Aug 2017) | 5 lines

dir.c: fix up r59481 for old kernels

* dir.c (glob_helper): fix up r59481 for old kernels, which
  provide d_type member but just always set DT_UNKNOWN for any
  entries.  [ruby-core:82266] [Bug #13785]
------------------------------------------------------------------------
r59526 | nobu | 2017-08-07 13:15:19 +0900 (Mon, 07 Aug 2017) | 1 line

enum.c: optimize for integers
------------------------------------------------------------------------
r59525 | nobu | 2017-08-07 13:08:46 +0900 (Mon, 07 Aug 2017) | 1 line

enum.c: prefer rb_funcallv to rb_funcall
------------------------------------------------------------------------
r59524 | svn | 2017-08-07 12:45:33 +0900 (Mon, 07 Aug 2017) | 1 line

* 2017-08-07
------------------------------------------------------------------------
r59523 | nobu | 2017-08-07 12:45:32 +0900 (Mon, 07 Aug 2017) | 1 line

enum.c: use predefined IDs
------------------------------------------------------------------------
r59522 | svn | 2017-08-06 14:22:27 +0900 (Sun, 06 Aug 2017) | 1 line

* 2017-08-06
------------------------------------------------------------------------
r59521 | duerst | 2017-08-06 14:22:26 +0900 (Sun, 06 Aug 2017) | 1 line

add some more assertions to test_ill_formed_utf_8_replace 
------------------------------------------------------------------------
r59519 | nobu | 2017-08-05 15:58:44 +0900 (Sat, 05 Aug 2017) | 7 lines

splat keyword hash

* compile.c (compile_array_keyword_arg): set keyword splat flag if
  explicitly splatted.  [ruby-core:68124] [Bug #10856]

* vm_args.c (setup_parameters_complex): try keyword hash splat if
  given.
------------------------------------------------------------------------
r59518 | nobu | 2017-08-05 15:51:08 +0900 (Sat, 05 Aug 2017) | 4 lines

vm_core.h: vm_call_flag_bits

* vm_core.h (vm_call_flag_bits): define VM_CALL flags by using
  enum constants.
------------------------------------------------------------------------
r59509 | svn | 2017-08-05 02:05:44 +0900 (Sat, 05 Aug 2017) | 1 line

* 2017-08-05
------------------------------------------------------------------------
r59508 | eregon | 2017-08-05 02:05:43 +0900 (Sat, 05 Aug 2017) | 1 line

* man/ruby.1: Move paragraph which is related to -S, not -s.
------------------------------------------------------------------------
r59502 | ko1 | 2017-08-04 23:57:31 +0900 (Fri, 04 Aug 2017) | 13 lines

use stable sort.

* lib/rubygems/resolver.rb (sort_dependencies): use stable sort.
  TestGemRequestSetLockfile#test_to_s_gem_dependency_non_default
  fails because this method return unstable results.
  Note that Enumerable#sort_by is unstable.

  I'm not sure the "stable" nature is required for RubyGems.
  The fact is that using stable sort, the test passed on
  mswin64+VS2017 where the sort results was reverse (unstable) order.
  Also using `-i` instead of `i` (it means forcing unstable sort)
  this test fails on other platform where the test successed before.

------------------------------------------------------------------------
r59499 | kazu | 2017-08-04 21:00:00 +0900 (Fri, 04 Aug 2017) | 1 line

Fix `NameError: uninitialized constant Net`
------------------------------------------------------------------------
r59498 | kazu | 2017-08-04 20:59:59 +0900 (Fri, 04 Aug 2017) | 1 line

Use `register_scanner` instead of `regist_scanner`
------------------------------------------------------------------------
r59497 | kazu | 2017-08-04 20:59:57 +0900 (Fri, 04 Aug 2017) | 1 line

Add deprecated warning to ERB::Compiler::SimpleScanner2
------------------------------------------------------------------------
r59496 | nobu | 2017-08-04 13:39:53 +0900 (Fri, 04 Aug 2017) | 5 lines

string.c: improve String#scan

* string.c (rb_str_rstrip_bang): improve the performance in 50%
  for a string pattern, and in 10% for a regexp pattern.  get rid
  of making MatchData in middle, which is not used.
------------------------------------------------------------------------
r59495 | svn | 2017-08-04 13:25:13 +0900 (Fri, 04 Aug 2017) | 1 line

* 2017-08-04
------------------------------------------------------------------------
r59494 | nobu | 2017-08-04 13:25:12 +0900 (Fri, 04 Aug 2017) | 1 line

benchmarks for String#scan
------------------------------------------------------------------------
r59487 | kazu | 2017-08-03 21:31:21 +0900 (Thu, 03 Aug 2017) | 1 line

Use the same variable name as in dir.c
------------------------------------------------------------------------
r59486 | svn | 2017-08-03 18:39:26 +0900 (Thu, 03 Aug 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59485 | naruse | 2017-08-03 18:39:25 +0900 (Thu, 03 Aug 2017) | 1 line

Add initial test for lldb extension
------------------------------------------------------------------------
r59484 | nobu | 2017-08-03 17:11:57 +0900 (Thu, 03 Aug 2017) | 1 line

disable rdoc for internal constants [ci skip]
------------------------------------------------------------------------
r59483 | nobu | 2017-08-03 17:09:24 +0900 (Thu, 03 Aug 2017) | 5 lines

ruby.h: NULL as empty array

* include/ruby/ruby.h (rb_yield_values, rb_funcall): call with
  NULL when no arguments, for clang which defines static array
  when an empty array is used.
------------------------------------------------------------------------
r59482 | nobu | 2017-08-03 16:08:00 +0900 (Thu, 03 Aug 2017) | 1 line

extract IDs
------------------------------------------------------------------------
r59481 | nobu | 2017-08-03 13:13:12 +0900 (Thu, 03 Aug 2017) | 5 lines

dir.c: reduce syscalls

* dir.c (glob_helper): utilize d_type even if no recursive
  pattern, to reduce stat/lstat syscalls in subsequent
  glob_helper.
------------------------------------------------------------------------
r59480 | nobu | 2017-08-03 12:41:50 +0900 (Thu, 03 Aug 2017) | 1 line

fix typo in help [ci skip]
------------------------------------------------------------------------
r59479 | nobu | 2017-08-03 12:39:33 +0900 (Thu, 03 Aug 2017) | 4 lines

dir.c: relative path Dir base

* dir.c (glob_helper): fix globbing based on a relative path Dir.
  [Feature #13056]
------------------------------------------------------------------------
r59478 | usa | 2017-08-03 12:31:38 +0900 (Thu, 03 Aug 2017) | 4 lines

Should show the entity of $PATH_SEPARATOR

* win32/configure.bat (--help): should show the entity of $PATH_SEPARATOR.

------------------------------------------------------------------------
r59477 | usa | 2017-08-03 12:25:46 +0900 (Thu, 03 Aug 2017) | 4 lines

Mention about `--with-opt-dir`

* win32/configure.bat (--help): mention about `--with-opt-dir`.

------------------------------------------------------------------------
r59476 | nobu | 2017-08-03 11:14:51 +0900 (Thu, 03 Aug 2017) | 4 lines

dir.c: relax base option

* dir.c (dir_glob_options): relax base option.  ignore when nil
  or an empty string as :base option.  [Feature #13056]
------------------------------------------------------------------------
r59475 | nobu | 2017-08-03 09:53:25 +0900 (Thu, 03 Aug 2017) | 5 lines

spec_helper.rb: pass jobserver fds

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  pass jobserver fds explicitly, because other specs might have
  set close_on_exec flags on these fds.
------------------------------------------------------------------------
r59474 | ko1 | 2017-08-03 06:48:51 +0900 (Thu, 03 Aug 2017) | 12 lines

fix stack storing for root fibers.

* cont.c (root_fiber_alloc): this function is called by fiber_current()
  and fiber_store(). fiber_current() should clear VM stack information
  in a fiber data because runnning thread knows stack information and has
  responsibility to manage it. However fiber_store() requires to remain
  VM stack information in a fiber data because the responsibility to manage
  VM stack is moved to the Fiber from the Thread (and switch to another
  fiber).

* cont.c (root_fiber_alloc): save thread's fiber and root_fiber information.

------------------------------------------------------------------------
r59473 | kazu | 2017-08-03 00:10:43 +0900 (Thu, 03 Aug 2017) | 4 lines

Fix URI::FTP.build code example typo

ref https://github.com/rurema/doctree/pull/462
[ci skip]
------------------------------------------------------------------------
r59472 | kazu | 2017-08-03 00:10:42 +0900 (Thu, 03 Aug 2017) | 3 lines

Fix variable name in example of net/pop

[ci skip]
------------------------------------------------------------------------
r59471 | kazu | 2017-08-03 00:10:40 +0900 (Thu, 03 Aug 2017) | 4 lines

Fix net/pop code example syntax error

ref https://github.com/rurema/doctree/pull/455
[ci skip]
------------------------------------------------------------------------
r59470 | svn | 2017-08-03 00:10:39 +0900 (Thu, 03 Aug 2017) | 1 line

* 2017-08-03
------------------------------------------------------------------------
r59469 | kazu | 2017-08-03 00:10:38 +0900 (Thu, 03 Aug 2017) | 4 lines

Fix cgi/core code example missing comma

ref https://github.com/rurema/doctree/pull/448
[ci skip]
------------------------------------------------------------------------
r59468 | yugui | 2017-08-02 14:27:25 +0900 (Wed, 02 Aug 2017) | 3 lines

Port more commands from .gdbinit to lldb

* misc/lldb_cury.py (dump_node, SDR, rb_count_objects): added
------------------------------------------------------------------------
r59467 | nobu | 2017-08-02 12:02:22 +0900 (Wed, 02 Aug 2017) | 1 line

suppress warnings when RUBY_USE_SETJMPEX
------------------------------------------------------------------------
r59466 | nobu | 2017-08-02 11:40:29 +0900 (Wed, 02 Aug 2017) | 9 lines

eval.c: suppress warnings

* eval.c (exc_setup_message): setup exception message as an
  exception instance, and a cause from a previous exception.
  split from setup_exception to suppress a warning when
  RUBY_USE_SETJMPEX is enabled.

* eval.c (setup_exception): make state volatile to suppress a
  warning too.
------------------------------------------------------------------------
r59465 | knu | 2017-08-02 11:20:48 +0900 (Wed, 02 Aug 2017) | 1 line

ipaddr is now a default gem with an upstream at: https://github.com/ruby/ipaddr
------------------------------------------------------------------------
r59464 | hsbt | 2017-08-02 11:19:04 +0900 (Wed, 02 Aug 2017) | 1 line

Partly reverted email notification on travis configuration.
------------------------------------------------------------------------
r59463 | nobu | 2017-08-02 09:54:13 +0900 (Wed, 02 Aug 2017) | 4 lines

eval.c: fix state type

* eval.c (setup_exception): state is a raised thread flag, not for
  EXEC_TAG.
------------------------------------------------------------------------
r59462 | ko1 | 2017-08-02 09:50:42 +0900 (Wed, 02 Aug 2017) | 16 lines

release VM stack properly.

* cont.c: r55766 change the handling method of Fiber's VM stack.
  Resumed Fiber points NULL as VM stack and running Thread has
  responsibility to manage it (marking and releasing).

  However, thread_start_func_2()@thread.c and thread_free()@vm.c
  doesn't free the VM stack if corresponding root Fiber is exist.
  This causes memory leak. [Bug #13772]

* cont.c (root_fiber_alloc): fib->cont.saved_thread.ec.stack should be NULL
  because running thread has responsibility to manage this stack.

* vm.c (rb_thread_recycle_stack_release): assert given stack is not NULL
  (callers should care it).

------------------------------------------------------------------------
r59461 | svn | 2017-08-02 09:20:42 +0900 (Wed, 02 Aug 2017) | 1 line

* 2017-08-02
------------------------------------------------------------------------
r59460 | kazu | 2017-08-02 09:20:41 +0900 (Wed, 02 Aug 2017) | 3 lines

Remove "make update-rubyspec"

because it is no-op for compatibility
------------------------------------------------------------------------
r59459 | nobu | 2017-08-01 20:59:45 +0900 (Tue, 01 Aug 2017) | 5 lines

assertions.rb: AllFailures#message encoding

* test/lib/test/unit/assertions.rb (AllFailures#message): put
  indented messages back to the original encoding, to get rid of
  Encoding::CompatibilityError when key has non-ASCII characters.
------------------------------------------------------------------------
r59458 | nobu | 2017-08-01 17:32:18 +0900 (Tue, 01 Aug 2017) | 4 lines

parse.y: simplify parse_ident

* parse.y (parse_ident): simplified selecting identifier types by
  the suffix.
------------------------------------------------------------------------
r59457 | ko1 | 2017-08-01 11:10:19 +0900 (Tue, 01 Aug 2017) | 9 lines

should not copy promoted flags.

* include/ruby/ruby.h (rb_clone_setup): should not copy some flags
  (FL_PROMOTED0|FL_PROMOTED1|FL_FINALIZE).
  [Bug #13775]

* test/ruby/test_object.rb: add a test (note that this test will fail
  only when RGENGC_CHECK_MODE >= 2).

------------------------------------------------------------------------
r59456 | svn | 2017-08-01 09:19:10 +0900 (Tue, 01 Aug 2017) | 1 line

* 2017-08-01
------------------------------------------------------------------------
r59455 | kazu | 2017-08-01 09:19:10 +0900 (Tue, 01 Aug 2017) | 1 line

Use `&.` instead of modifier if
------------------------------------------------------------------------
r59454 | nobu | 2017-07-31 13:04:10 +0900 (Mon, 31 Jul 2017) | 5 lines

configure.in: use libtool

* configure.in: use libtool on macOS to suppress a warning against
  debug_counter.o, which has no symbols unless USE_DEBUG_COUNTER
  is set to non-zero.
------------------------------------------------------------------------
r59453 | svn | 2017-07-31 12:35:23 +0900 (Mon, 31 Jul 2017) | 1 line

* 2017-07-31
------------------------------------------------------------------------
r59452 | kazu | 2017-07-31 12:35:22 +0900 (Mon, 31 Jul 2017) | 3 lines

Improve error message

ref [Bug #13761]
------------------------------------------------------------------------
r59451 | nobu | 2017-07-30 23:59:40 +0900 (Sun, 30 Jul 2017) | 5 lines

UNALIGNED_MEMBER_ACCESS only for clang

* eval_intern.h (UNALIGNED_MEMBER_ACCESS): enable only on clang.
  gcc does not complain about pointers to member of unaligned
  struct.
------------------------------------------------------------------------
r59450 | nobu | 2017-07-30 23:48:45 +0900 (Sun, 30 Jul 2017) | 4 lines

UNALIGNED_MEMBER_ACCESS

* eval_intern.h (UNALIGNED_MEMBER_ACCESS): suppress
  address-of-packed-member warnings by clang 4.0.
------------------------------------------------------------------------
r59449 | nobu | 2017-07-30 11:56:30 +0900 (Sun, 30 Jul 2017) | 5 lines

hash.c: refactor env_enc_str_new

* hash.c (env_enc_str_new): convert to the expected encoding
  without intermediate string, and set econv flags if default
  internal encoding is set too.
------------------------------------------------------------------------
r59448 | nobu | 2017-07-30 11:56:29 +0900 (Sun, 30 Jul 2017) | 5 lines

string.c: rb_str_initialize

* string.c (rb_str_initialize): new function to (re)initialize a
  string with data and encoding.  extracted from
  rb_external_str_new_with_enc.
------------------------------------------------------------------------
r59447 | svn | 2017-07-30 09:40:44 +0900 (Sun, 30 Jul 2017) | 1 line

* 2017-07-30
------------------------------------------------------------------------
r59446 | nobu | 2017-07-30 09:40:43 +0900 (Sun, 30 Jul 2017) | 4 lines

compile.c: replace adjuststack

* compile.c (iseq_set_sequence): replace adjuststack with pop, or
  remove if possible instead of two nops.
------------------------------------------------------------------------
r59445 | nobu | 2017-07-29 21:42:42 +0900 (Sat, 29 Jul 2017) | 7 lines

visibility of inherited method

* vm_insnhelper.c (vm_call_method_each_type): honor the original
  visibility of inherited methods when a refinement is defined but
  not activated.  [ruby-core:82209] [Bug #13776]

Author:    Mon_Ouie (Mon ouie) <mon.ouie@gmail.com>
------------------------------------------------------------------------
r59444 | nobu | 2017-07-29 21:42:41 +0900 (Sat, 29 Jul 2017) | 4 lines

adjust indent [ci skip]

* vm_insnhelper.c (vm_call_method_each_type): adjust indent of a
  block in switch.
------------------------------------------------------------------------
r59443 | nobu | 2017-07-29 21:11:51 +0900 (Sat, 29 Jul 2017) | 4 lines

file.c: [DOC] File.mkfifo

* file.c (rb_file_s_mkfifo): enclose rdoc by ifdef so it will be
  generated properly.
------------------------------------------------------------------------
r59442 | nobu | 2017-07-29 11:03:11 +0900 (Sat, 29 Jul 2017) | 5 lines

compile.c: fix flip-flop value

* compile.c (iseq_compile_each0): as compile_flip_flop always ends
  with a jump instruction, successive instruction is never reached,
  but caused stack consistency error without peephole optimization.
------------------------------------------------------------------------
r59441 | svn | 2017-07-29 01:47:51 +0900 (Sat, 29 Jul 2017) | 1 line

* 2017-07-29
------------------------------------------------------------------------
r59440 | odaira | 2017-07-29 01:47:50 +0900 (Sat, 29 Jul 2017) | 4 lines

Include sys/select.h when checking HAVE_RB_FD_INIT

* configure.in: include sys/select.h for fd_mask on AIX
  [Feature #13637]
------------------------------------------------------------------------
r59439 | kou | 2017-07-28 23:16:17 +0900 (Fri, 28 Jul 2017) | 6 lines

rexml: Remove needless document

[Fix GH-1671]

Patch by madblobfish. Thanks!!!

------------------------------------------------------------------------
r59438 | svn | 2017-07-28 16:46:21 +0900 (Fri, 28 Jul 2017) | 1 line

* 2017-07-28
------------------------------------------------------------------------
r59437 | glass | 2017-07-28 16:46:20 +0900 (Fri, 28 Jul 2017) | 10 lines

csv.rb: fix incompatibility introduced in r59428

* lib/csv.rb: fix incompatibility introduced in r59428.
              CSV.new takes options as keyword arguments.

* test/csv/test_features.rb: add a test to ensure it raises error againt
                             unknown options

* test/csv/test_features.rb: add a test to ensure row_sep option is properly
                             applied
------------------------------------------------------------------------
r59436 | nobu | 2017-07-27 21:54:55 +0900 (Thu, 27 Jul 2017) | 1 line

set auto-props to avoid commits setting properties
------------------------------------------------------------------------
r59435 | nobu | 2017-07-27 21:25:42 +0900 (Thu, 27 Jul 2017) | 4 lines

fix type

* spec/rubyspec/optional/capi/ext/io_spec.c (io_spec_rb_io_wait_readable):
  fix type of read(2).
------------------------------------------------------------------------
r59434 | nobu | 2017-07-27 21:17:56 +0900 (Thu, 27 Jul 2017) | 4 lines

vm_core.h: shrink trap_list size

* vm_core.h (rb_vm_struct): separate trap_list cmd and safe to
  each arrays, to shrink the size.
------------------------------------------------------------------------
r59433 | svn | 2017-07-27 21:10:42 +0900 (Thu, 27 Jul 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59432 | eregon | 2017-07-27 21:10:41 +0900 (Thu, 27 Jul 2017) | 1 line

Update to ruby/spec@c3e6b90
------------------------------------------------------------------------
r59431 | svn | 2017-07-27 21:10:24 +0900 (Thu, 27 Jul 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59430 | eregon | 2017-07-27 21:10:23 +0900 (Thu, 27 Jul 2017) | 1 line

Update to ruby/mspec@353605f
------------------------------------------------------------------------
r59429 | hsbt | 2017-07-27 20:56:54 +0900 (Thu, 27 Jul 2017) | 5 lines

Update configuration for slack notification.

  * Encrypted slack token.
  * Only notify when build fails and it recovered.
  * Only notify trunk build without pull requests.
------------------------------------------------------------------------
r59428 | glass | 2017-07-27 18:53:58 +0900 (Thu, 27 Jul 2017) | 5 lines

csv.rb: use keyword parameters

* lib/csv.rb: usb keyword parameters to receive options

* test/csv/test_features.rb: remove a test for checking options
------------------------------------------------------------------------
r59427 | svn | 2017-07-27 15:49:28 +0900 (Thu, 27 Jul 2017) | 1 line

* 2017-07-27
------------------------------------------------------------------------
r59426 | glass | 2017-07-27 15:49:27 +0900 (Thu, 27 Jul 2017) | 3 lines

csv.rb: use Array#to_h

* lib/csv.rb (CSV::Row#to_hash): use Array#to_h
------------------------------------------------------------------------
r59425 | nobu | 2017-07-26 21:44:12 +0900 (Wed, 26 Jul 2017) | 4 lines

vcs.rb: commit

* tool/vcs.rb (commit): do commit, reset svn revision to sync git
  mirror.
------------------------------------------------------------------------
r59424 | shugo | 2017-07-26 16:47:34 +0900 (Wed, 26 Jul 2017) | 3 lines

lib/net/imap.rb: support CHANGEDSINCE and MODSEQ

Patch by plehoux (Philippe-Antoine Lehoux).  [ruby-core:64272] [Feature #10119]
------------------------------------------------------------------------
r59423 | hsbt | 2017-07-26 15:06:33 +0900 (Wed, 26 Jul 2017) | 3 lines

To use slack notification instead of email notification.

  It's easily customize configuration of test notify.
------------------------------------------------------------------------
r59422 | hsbt | 2017-07-26 14:42:27 +0900 (Wed, 26 Jul 2017) | 3 lines

Removed definitions of mspec and ruby/spec.

  They are no longer used on ruby core repository.
------------------------------------------------------------------------
r59421 | hsbt | 2017-07-26 14:39:41 +0900 (Wed, 26 Jul 2017) | 1 line

Removed Ruby 2.1 from Travis CI. It's EOL status on 2017.
------------------------------------------------------------------------
r59420 | nobu | 2017-07-26 09:56:44 +0900 (Wed, 26 Jul 2017) | 6 lines

parse.y: brace after array literal arg

* parse.y (parser_yylex): array is another literal.  set state to
  END too not only ENDARG and after a literal, so that a left
  brace after it should be a primary block bound to the literal,
  which causes syntax error.  [ruby-core:81037] [Bug #13547]
------------------------------------------------------------------------
r59419 | svn | 2017-07-26 09:01:27 +0900 (Wed, 26 Jul 2017) | 1 line

* 2017-07-26
------------------------------------------------------------------------
r59418 | kazu | 2017-07-26 09:01:26 +0900 (Wed, 26 Jul 2017) | 1 line

Fix typos [ci skip]
------------------------------------------------------------------------
r59417 | nobu | 2017-07-25 17:30:11 +0900 (Tue, 25 Jul 2017) | 5 lines

parse.y: limit codepoint length

* parse.y (parser_tokadd_codepoint): limit Unicode codepoint
  length.  too long codepoint has been split unexpectedly since
  r57050.
------------------------------------------------------------------------
r59416 | normal | 2017-07-25 14:55:22 +0900 (Tue, 25 Jul 2017) | 10 lines

dir.c (ruby_brace_expand): RB_GC_GUARD safety

The lifetime of a String VALUE must match or exceed the lifetime
of its R*_PTR result; otherwise the GC can while reclaim the
VALUE while the R*_PTR result is in use.

* dir.c (ruby_brace_expand): add var parameter for GC guard
  (ruby_brace_glob_with_enc): adjust call
  (file_s_fnmatch): ditto
  (push_glob): remove misplaced GC guard
------------------------------------------------------------------------
r59415 | svn | 2017-07-25 10:08:52 +0900 (Tue, 25 Jul 2017) | 1 line

* 2017-07-25
------------------------------------------------------------------------
r59414 | nobu | 2017-07-25 10:08:51 +0900 (Tue, 25 Jul 2017) | 7 lines

socket: system getaddrinfo on Windows

* ext/socket/extconf.rb: use system getaddrinfo, getnameinfo, and
  freeaddrinfo on Windows if they are provided.  they conflict
  with addrinfo.h and cannot compile.  conftest.exe linked against
  msvcr90.dll segfaults when invoked in extconf.rb for unknown
  reason, and failed to check them.
------------------------------------------------------------------------
r59413 | svn | 2017-07-24 10:56:05 +0900 (Mon, 24 Jul 2017) | 1 line

* 2017-07-24
------------------------------------------------------------------------
r59412 | nobu | 2017-07-24 10:56:04 +0900 (Mon, 24 Jul 2017) | 5 lines

optparse.rb: case-sensitive candidate

* lib/optparse.rb (candidate): short options are case-sensitive by
  the default, should not match case-different options..
  https://github.com/mernen/completion-ruby/pull/9#issuecomment-317287946
------------------------------------------------------------------------
r59411 | svn | 2017-07-23 18:44:49 +0900 (Sun, 23 Jul 2017) | 1 line

* 2017-07-23
------------------------------------------------------------------------
r59410 | nobu | 2017-07-23 18:44:48 +0900 (Sun, 23 Jul 2017) | 4 lines

sprintf.c: width too big

* sprintf.c (rb_str_format): explicitly reject too big negative
  width, instead of an empty string.
------------------------------------------------------------------------
r59394 | svn | 2017-07-22 21:26:20 +0900 (Sat, 22 Jul 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59393 | yugui | 2017-07-22 21:26:19 +0900 (Sat, 22 Jul 2017) | 1 line

Add Doxygen comments
------------------------------------------------------------------------
r59392 | kazu | 2017-07-22 17:07:58 +0900 (Sat, 22 Jul 2017) | 1 line

Fix documents
------------------------------------------------------------------------
r59391 | kazu | 2017-07-22 17:07:56 +0900 (Sat, 22 Jul 2017) | 1 line

Fix typos and indent
------------------------------------------------------------------------
r59390 | svn | 2017-07-22 15:30:54 +0900 (Sat, 22 Jul 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59389 | yugui | 2017-07-22 15:30:53 +0900 (Sat, 22 Jul 2017) | 1 line

Add documents
------------------------------------------------------------------------
r59388 | nobu | 2017-07-22 15:01:38 +0900 (Sat, 22 Jul 2017) | 6 lines

compile.c: COMPILE_ERROR

* compile.c: raise COMPILE_ERROR instead of compile_bug which is
  very rarely (or never, actually) useful to debug instruction
  sequence.  COMPILE_ERROR is usually SyntaxError, or fatal error
  if compile_debug is enabled,
------------------------------------------------------------------------
r59387 | nobu | 2017-07-22 07:45:13 +0900 (Sat, 22 Jul 2017) | 3 lines

compile.c: dump iseq at adjust bug

* compile.c (fix_sp_depth): dump instructions at adjust bug too.
------------------------------------------------------------------------
r59386 | svn | 2017-07-22 04:06:08 +0900 (Sat, 22 Jul 2017) | 1 line

* 2017-07-22
------------------------------------------------------------------------
r59385 | normal | 2017-07-22 04:06:07 +0900 (Sat, 22 Jul 2017) | 12 lines

NEWS: add entries for thread_sync.c changes

I'm slightly worried about some external code subclassing
ConditionVariable, Queue, and SizedQueue and relying on them
being Structs.  However, they only started being Structs with
Ruby 2.1, and were implemented in pure Ruby before that; so
hopefully nobody notices that implementation detail.

Also, note the Mutex change as it may affect program design
when space can be saved.

* NEWS: entries for [Feature #13552] and [Feature #13517]
------------------------------------------------------------------------
r59384 | nobu | 2017-07-21 22:30:46 +0900 (Fri, 21 Jul 2017) | 5 lines

strscan.c: fix segfault in aref

* ext/strscan/strscan.c (strscan_aref): fix segfault after
  get_byte or getch which do not apply regexp.
  [ruby-core:82116] [Bug #13759]
------------------------------------------------------------------------
r59383 | nobu | 2017-07-21 17:31:47 +0900 (Fri, 21 Jul 2017) | 4 lines

optparse.rb: [DOC] fix keys

* lib/optparse.rb (getopts): [DOC] parameter keys are strings, not
  symbols.
------------------------------------------------------------------------
r59382 | rhe | 2017-07-21 13:29:46 +0900 (Fri, 21 Jul 2017) | 12 lines

ripper: add kwrest_param parser event

* parse.y (f_kwrest): Dispatch kwrest_param event. This is especially
  useful for unnamed kwrest parameter for which we expose the internal
  ID currently.  [ruby-core:75528] [Feature #12387]

* test/ripper/dummyparser.rb (on_kwrest_param): Add handler for
  kwrest_param parser event.

* test/ripper/test_parser_events.rb (test_params): Adapt to the change
  in DummyParser.
  (test_kwrest_param): Test that kwrest_param event handler is called.
------------------------------------------------------------------------
r59381 | kazu | 2017-07-21 08:34:03 +0900 (Fri, 21 Jul 2017) | 1 line

Use `unpack1` instead of `unpack` and `[0]`
------------------------------------------------------------------------
r59380 | sonots | 2017-07-21 01:47:26 +0900 (Fri, 21 Jul 2017) | 11 lines

logger.rb: Fix handling progname

Because progname was memoized with ||= a logger call that involved
outputting false would be nil. Example code:

  logger = Logger.new(STDOUT)
  logger.info(false)  # => nil

Perform an explicit nil check instead of ||= so that false will be output.

patched by Gavin Miller <gavingmiller@gmail.com> [Fix GH-1667]
------------------------------------------------------------------------
r59379 | sonots | 2017-07-21 01:29:20 +0900 (Fri, 21 Jul 2017) | 1 line

NEWS: Add String#delete_suffix and String#delete_suffix!
------------------------------------------------------------------------
r59378 | svn | 2017-07-21 01:29:20 +0900 (Fri, 21 Jul 2017) | 1 line

* 2017-07-21
------------------------------------------------------------------------
r59377 | sonots | 2017-07-21 01:29:19 +0900 (Fri, 21 Jul 2017) | 10 lines

string.c: add String#delete_suffix and String#delete_suffix!
to remove trailing suffix [Feature #13665] [Fix GH-1661]

* string.c (rb_str_delete_suffix_bang): add a new method
  to remove suffix destuctively.

* string.c (rb_str_delete_suffix): add a new method
  to remove suffix non-destuctively.

* test/ruby/test_string.rb: add tests.
------------------------------------------------------------------------
r59376 | yugui | 2017-07-20 20:00:39 +0900 (Thu, 20 Jul 2017) | 5 lines

Remove dead code

* eval.c (errinfo_setter): dead for 10 years since r13091.
  (rb_rubylevel_errinfo): not used and not exported.
  usually removed or hidden by linker.
------------------------------------------------------------------------
r59375 | nobu | 2017-07-20 14:48:26 +0900 (Thu, 20 Jul 2017) | 5 lines

parse.y: empty hash in defined

* parse.y (command): NODE_ARRAY with NULL is invalid.  traversal
  in defined_expr0 is simplified than iseq_compile_each0.
  [ruby-core:82113] [Bug #13756]
------------------------------------------------------------------------
r59374 | nobu | 2017-07-20 11:43:45 +0900 (Thu, 20 Jul 2017) | 5 lines

compile.c: restore stack at return

* compile.c (iseq_compile_each0): restore the stack depth after
  return to the previous depth, to fix the stack depth at
  returning from rescue iseq.  [ruby-core:82108] [Bug #13755]
------------------------------------------------------------------------
r59373 | shugo | 2017-07-20 08:38:31 +0900 (Thu, 20 Jul 2017) | 3 lines

lib/net/pop.rb: support timeout for TLS handshake

Patch by ahorek (Pavel Rosicky).  [ruby-core:80490] [Feature #13389]
------------------------------------------------------------------------
r59372 | shugo | 2017-07-20 08:08:34 +0900 (Thu, 20 Jul 2017) | 4 lines

lib/net/imap.rb: Ignore trailing space for Microsoft Exchange Server

Based on the patch by keysen (Jeremy Carlier).
[ruby-core:81641] [Bug #13649]
------------------------------------------------------------------------
r59371 | svn | 2017-07-20 00:01:01 +0900 (Thu, 20 Jul 2017) | 1 line

* 2017-07-20
------------------------------------------------------------------------
r59370 | kazu | 2017-07-20 00:01:01 +0900 (Thu, 20 Jul 2017) | 1 line

Sort entries [ci skip]
------------------------------------------------------------------------
r59369 | kazu | 2017-07-19 22:59:58 +0900 (Wed, 19 Jul 2017) | 3 lines

NEWS: Add Hash#transform_keys and Hash#transform_keys!

[Feature #13583] [ruby-core:81290] [ci skip]
------------------------------------------------------------------------
r59368 | nobu | 2017-07-19 12:16:58 +0900 (Wed, 19 Jul 2017) | 4 lines

random.c: ensure initialized

* random.c (get_rnd, try_get_rnd): ensure initialized to get rid
  of crash in forked processes.  [ruby-core:82100] [Bug #13753]
------------------------------------------------------------------------
r59367 | nobu | 2017-07-19 12:16:08 +0900 (Wed, 19 Jul 2017) | 4 lines

test_rand.rb: improved assert_fork_status

* test/ruby/test_rand.rb (assert_fork_status): deal with errors
  from children.
------------------------------------------------------------------------
r59366 | nobu | 2017-07-19 11:28:45 +0900 (Wed, 19 Jul 2017) | 1 line

st.c: adjust style
------------------------------------------------------------------------
r59365 | svn | 2017-07-19 10:35:05 +0900 (Wed, 19 Jul 2017) | 1 line

* 2017-07-19
------------------------------------------------------------------------
r59364 | normal | 2017-07-19 10:35:04 +0900 (Wed, 19 Jul 2017) | 4 lines

revert r59359, r59356, r59355, r59354

These caused numerous CI failures I haven't been able to
reproduce [ruby-core:82102]
------------------------------------------------------------------------
r59362 | hsbt | 2017-07-18 20:28:49 +0900 (Tue, 18 Jul 2017) | 4 lines

Copy openssl library finder for ext/digest from OpenSSL extention.

  * ext/digest/digest_conf.rb: Support to search variaous filenames of
    OpenSSL/LibreSSL libraries.
------------------------------------------------------------------------
r59361 | nobu | 2017-07-18 19:49:10 +0900 (Tue, 18 Jul 2017) | 1 line

fix typo
------------------------------------------------------------------------
r59360 | nobu | 2017-07-18 19:29:19 +0900 (Tue, 18 Jul 2017) | 4 lines

descriptive asssertions

* test/ruby/test_string.rb (test_uplus_minus): prefer more
  descriptive asssertions than assert_equal.
------------------------------------------------------------------------
r59359 | normal | 2017-07-18 18:52:55 +0900 (Tue, 18 Jul 2017) | 6 lines

string: preserve taint flag with String#-@ (uminus)

* string.c (tainted_fstr_update): move up
  (rb_fstring): support registering tainted strings
  (register_fstring_tainted): extract from rb_fstring_existing0
  (rb_tainted_fstring_existing): use register_fstring_tainted instead
------------------------------------------------------------------------
r59358 | nobu | 2017-07-18 17:31:02 +0900 (Tue, 18 Jul 2017) | 10 lines

vm_eval.c: rb_lambda_call

* enum.c (enum_collect): make the block arity same as the given
  block.  [Bug #13391]

* internal.h (vm_ifunc): store arity instead of unused id.

* proc.c (rb_vm_block_min_max_arity): return ifunc arity.

* vm_eval.c (rb_lambda_call): call method with lambda block.
------------------------------------------------------------------------
r59357 | nobu | 2017-07-18 16:48:37 +0900 (Tue, 18 Jul 2017) | 4 lines

proc.c: rb_block_min_max_arity

* proc.c (rb_block_min_max_arity): new function to get arity range
  from the current block.
------------------------------------------------------------------------
r59356 | normal | 2017-07-18 16:21:05 +0900 (Tue, 18 Jul 2017) | 4 lines

test/ruby/test_string.rb: ensure we do not have tainted strings

Trying to figure out [ruby-core:82092]
cf. https://gist.github.com/e2c899c453f3f66e7934095c32505486
------------------------------------------------------------------------
r59355 | normal | 2017-07-18 13:30:08 +0900 (Tue, 18 Jul 2017) | 9 lines

newhash insn reuses existing keys

This gives the newhash VM instruction the same string reuse
capabilities as rb_hash_aset.

* st.c (str_key): new wrapper function to call rb_fstring_existing
  (rb_hash_bulk_insert): use str_key
* test/ruby/test_optimization.rb (test_hash_reuse_fstring):
  ensure key reuse for newhash instructions
------------------------------------------------------------------------
r59354 | normal | 2017-07-18 11:29:59 +0900 (Tue, 18 Jul 2017) | 26 lines

hash: keep fstrings of tainted strings for string keys

The same hash keys may be loaded from tainted data sources
frequently (e.g. parsing headers from socket or loading
YAML data from a file).  If a non-tainted fstring already
exists (because the application expects the hash key),
cache and deduplicate the tainted version in the new
tainted_frozen_strings table.

For non-embedded strings, this also allows sharing with the
underlying malloc-ed data.

* vm_core.h (rb_vm_struct): add tainted_frozen_strings
* vm.c (ruby_vm_destruct): free tainted_frozen_strings
  (Init_vm_objects): initialize tainted_frozen_strings
  (rb_vm_tfstring_table): accessor for tainted_frozen_strings
* internal.h: declare rb_fstring_existing, rb_vm_tfstring_table
* hash.c (fstring_existing_str): remove (moved to string.c)
  (hash_aset_str): use rb_fstring_existing
* string.c (rb_fstring_existing): new, based on fstring_existing_str
  (tainted_fstr_update): new
  (rb_fstring_existing0): new, based on fstring_existing_str
  (rb_tainted_fstring_existing): new, special case for tainted strings
  (rb_str_free): delete from tainted_frozen_strings table
* test/ruby/test_optimization.rb (test_hash_reuse_fstring): new test
  [ruby-core:82012] [Bug #13737]
------------------------------------------------------------------------
r59353 | normal | 2017-07-18 11:10:50 +0900 (Tue, 18 Jul 2017) | 6 lines

doc/extension.rdoc: start documenting threading and IO APIs

This will hopefully be useful for folks writing C extensions.

* doc/extension.rdoc: start documenting threading and IO APIs
  [ruby-core:82016] [Feature #13740]
------------------------------------------------------------------------
r59352 | svn | 2017-07-18 10:59:29 +0900 (Tue, 18 Jul 2017) | 1 line

* 2017-07-18
------------------------------------------------------------------------
r59351 | normal | 2017-07-18 10:59:28 +0900 (Tue, 18 Jul 2017) | 8 lines

webrick: fix SNI support

* lib/webrick/https.rb: check ssl context of virtual host.
* lib/webrick/ssl.rb: ensure to return ssl context.
* test/webrick/test_https.rb: test returned cert is correct.
  [Feature #13729][ruby-dev:50173]

Author: Tietew <tietew@gmail.com>
------------------------------------------------------------------------
r59350 | nobu | 2017-07-17 10:16:07 +0900 (Mon, 17 Jul 2017) | 4 lines

gmake.mk: extract after update gems

* defs/gmake.mk (extract-gems): should wait for update-gems to
  finish when doing both.
------------------------------------------------------------------------
r59349 | nobu | 2017-07-17 09:11:38 +0900 (Mon, 17 Jul 2017) | 10 lines

parse.y: refine literal error messages

* parse.y (parser_yyerror): strip newline in error source which
  will not be printed, when lex_p has passed it.

* parse.y (parser_tokadd_utf8): unterminated Unicode escape even
  after invalid Unicode escape.

* parse.y (parser_parse_string): show the error source line when
  unterminated literal at end of file.
------------------------------------------------------------------------
r59348 | nobu | 2017-07-17 08:45:48 +0900 (Mon, 17 Jul 2017) | 7 lines

parse.y: refine invalid Unicode escape message

* parse.y (literal_flush): rename from numeric_literal_flush, as
  it is not just for numerics now.

* parse.y (parser_tokadd_codepoint): show invalid character
  position, but not the start of Unicode escape.
------------------------------------------------------------------------
r59347 | svn | 2017-07-17 00:28:51 +0900 (Mon, 17 Jul 2017) | 1 line

* 2017-07-17
------------------------------------------------------------------------
r59346 | nobu | 2017-07-17 00:28:50 +0900 (Mon, 17 Jul 2017) | 4 lines

assertions.rb: frozen string buffer

* test/lib/test/unit/assertions.rb (assert_pattern_list): make
  frozen string literals modifiable as buffers.
------------------------------------------------------------------------
r59345 | nobu | 2017-07-16 23:32:41 +0900 (Sun, 16 Jul 2017) | 1 line

parse.y (numeric_literal_flush): fix typo
------------------------------------------------------------------------
r59344 | nobu | 2017-07-16 22:39:18 +0900 (Sun, 16 Jul 2017) | 5 lines

parse.y: utf-8 codepoints

* parse.y (parser_tokadd_utf8): skip spaces in the current line,
  without advancing the line, to get rid of dangling pointer.
  [ruby-core:82029] [Bug #13742]
------------------------------------------------------------------------
r59343 | svn | 2017-07-16 20:35:27 +0900 (Sun, 16 Jul 2017) | 1 line

* 2017-07-16
------------------------------------------------------------------------
r59342 | nobu | 2017-07-16 20:35:27 +0900 (Sun, 16 Jul 2017) | 1 line

Use assert_syntax_error
------------------------------------------------------------------------
r59341 | nobu | 2017-07-15 17:29:03 +0900 (Sat, 15 Jul 2017) | 4 lines

parse.y: refine error messages

* parse.y (parser_read_escape, parser_tok_hex): refine error
  messages.  point from the backslash up to the invalid char.
------------------------------------------------------------------------
r59340 | yui-knk | 2017-07-15 16:24:12 +0900 (Sat, 15 Jul 2017) | 5 lines

test_lexer.rb: require ripper directly

* test/ripper/test_lexer.rb: This file does not use
  DummyParser, so requiring ripper directly instead of
  requiring dummyparser.
------------------------------------------------------------------------
r59339 | svn | 2017-07-15 13:35:19 +0900 (Sat, 15 Jul 2017) | 1 line

* 2017-07-15
------------------------------------------------------------------------
r59338 | kazu | 2017-07-15 13:35:18 +0900 (Sat, 15 Jul 2017) | 3 lines

Fix warning: shadowing outer local variable - a

[ci skip][Fix GH-1628]
------------------------------------------------------------------------
r59337 | nobu | 2017-07-14 22:50:00 +0900 (Fri, 14 Jul 2017) | 5 lines

zlib.c: fix unnormalized Fixnum

* ext/zlib/zlib.c (rb_gzfile_total_out): cast to long not to
  result in an unsigned long to normalized to Fixnum on LLP64
  platforms.  [ruby-core:81488]
------------------------------------------------------------------------
r59336 | nobu | 2017-07-14 19:53:35 +0900 (Fri, 14 Jul 2017) | 4 lines

io.c: textmode if newline decorator

* io.c (validate_enc_binmode): newline decorator implies text mode
  now.  [ruby-core:80270] [Bug #13350]
------------------------------------------------------------------------
r59335 | nobu | 2017-07-14 19:31:05 +0900 (Fri, 14 Jul 2017) | 7 lines

VPATH for ripper

* common.mk (ripper.c): pass the build directory path for id.h
  which may be generated there.

* ext/ripper/depend (ripper.y): search the top build directory and
  the top source directory.
------------------------------------------------------------------------
r59334 | rhe | 2017-07-14 18:41:05 +0900 (Fri, 14 Jul 2017) | 4 lines

hash.c: fix possible crash in Hash#transform_keys!

Fix up r59328. It is possible that the given block abuses
ObjectSpace.each_object to shrink the temporary array.
------------------------------------------------------------------------
r59333 | naruse | 2017-07-14 18:17:55 +0900 (Fri, 14 Jul 2017) | 3 lines

Zlib::GzipReader#pos underflows after calling #ungetbyte or #ungetc at start of file [Bug #13616]

patched by Andrew Haines <andrew@haines.org.nz> [ruby-core:81488]
------------------------------------------------------------------------
r59332 | knu | 2017-07-14 17:46:13 +0900 (Fri, 14 Jul 2017) | 1 line

Alias Set#to_s to #inspect [ruby-core:81753] [Feature #13676]
------------------------------------------------------------------------
r59331 | knu | 2017-07-14 17:46:10 +0900 (Fri, 14 Jul 2017) | 1 line

Make tests for Set#inspect more straightforward
------------------------------------------------------------------------
r59330 | hsbt | 2017-07-14 16:47:21 +0900 (Fri, 14 Jul 2017) | 1 line

Update gemspec for standalone gem that is ruby/date repository.
------------------------------------------------------------------------
r59329 | hsbt | 2017-07-14 16:13:17 +0900 (Fri, 14 Jul 2017) | 1 line

Fixup r59327. Forgot to update version number.
------------------------------------------------------------------------
r59328 | mrkn | 2017-07-14 15:44:00 +0900 (Fri, 14 Jul 2017) | 9 lines

hash.c: Add Hash#transform_keys and Hash#transform_keys!

* hash.c (transform_keys_i, rb_hash_transform_keys): Add Hash#transform_keys.
  [Feature #13583] [ruby-core:81290]

* hash.c (rb_hash_transform_keys_bang): Add Hash#transform_keys!.
  [Feature #13583] [ruby-core:81290]

* test/ruby/test_hash.rb: Add tests for above changes.
------------------------------------------------------------------------
r59327 | hsbt | 2017-07-14 15:15:58 +0900 (Fri, 14 Jul 2017) | 6 lines

Merge psych-3.0.0.beta3 from ruby/psych.

  * Rely on encoding tags to determine if string should be dumped as binary.
    https://github.com/ruby/psych/commit/8949a47b8cee31e03e21608406ba116adcf74054
  * Specify "frozen_string_literal: true".
  * Support to binary release for mingw32 platform.
------------------------------------------------------------------------
r59326 | hsbt | 2017-07-14 14:33:15 +0900 (Fri, 14 Jul 2017) | 1 line

Added psych entry to package table and fixed sync instructions.
------------------------------------------------------------------------
r59325 | nobu | 2017-07-14 13:43:16 +0900 (Fri, 14 Jul 2017) | 4 lines

process.c: null bytes

* process.c (rlimit_type_by_sym): prohibit null bytes in key
  names.  [ruby-core:82033] [Bug #13744]
------------------------------------------------------------------------
r59324 | kazu | 2017-07-14 08:55:41 +0900 (Fri, 14 Jul 2017) | 1 line

Use tr! instead of gsub!
------------------------------------------------------------------------
r59323 | svn | 2017-07-14 05:47:37 +0900 (Fri, 14 Jul 2017) | 1 line

* 2017-07-14
------------------------------------------------------------------------
r59322 | normal | 2017-07-14 05:47:36 +0900 (Fri, 14 Jul 2017) | 8 lines

process.c: handle dynamic :rlimit_* symbols in spawn execopts

* process.c (rb_execarg_addopt_rlimit): hoist out of rb_execarg_addopt
  (rlimit_type_by_sym): new wrapper for dynamic symbol
  (rb_execarg_addopt): check for dsym via rlimit_type_by_sym
* test/ruby/test_process.rb (test_execopts_rlimit): check dsym w/o pindown
  Add extra check for bogus rlimit args, too.
  [ruby-core:82033] [Bug #13744]
------------------------------------------------------------------------
r59321 | hsbt | 2017-07-13 18:46:16 +0900 (Thu, 13 Jul 2017) | 7 lines

Use Test::Unit::TestCase instead of MiniTest::Unit::TestCase. Because
tests of fiddle already used customized assertions of ruby core.

  * test/fiddle/helper.rb: Use Test::Unit::TestCase for base class of
    testcase.
  * test/fiddle/test_*.rb: Use assert_raise instead of assert_raises.
    Remove needless includes for Test::Unit::Assertions.
------------------------------------------------------------------------
r59320 | nobu | 2017-07-13 16:00:16 +0900 (Thu, 13 Jul 2017) | 4 lines

parse.y: flush debug output

* parse.y (parser_compile_error): flush debug output before
  compile error message, to keep the order.
------------------------------------------------------------------------
r59319 | normal | 2017-07-13 03:31:07 +0900 (Thu, 13 Jul 2017) | 5 lines

doc/extension.rdoc: update wikipedia link to HTTPS

Avoid the latency for HTTP -> HTTPS redirect

* doc/extension.rdoc: update wikipedia link to HTTPS
------------------------------------------------------------------------
r59318 | svn | 2017-07-13 00:02:10 +0900 (Thu, 13 Jul 2017) | 1 line

* 2017-07-13
------------------------------------------------------------------------
r59317 | kazu | 2017-07-13 00:02:09 +0900 (Thu, 13 Jul 2017) | 1 line

Fix indent [ci skip]
------------------------------------------------------------------------
r59315 | nobu | 2017-07-12 18:44:45 +0900 (Wed, 12 Jul 2017) | 1 line

disable r59314 on mswin
------------------------------------------------------------------------
r59314 | nobu | 2017-07-12 14:30:43 +0900 (Wed, 12 Jul 2017) | 5 lines

gc.c: restrict RGENGC_DEBUG

* gc.c (RGENGC_DEBUG_ENABLED): restrict runtime ruby_rgengc_debug
  level up to -RGENGC_DEBUG, to reduce runtime branches in inner
  loops.
------------------------------------------------------------------------
r59313 | svn | 2017-07-12 11:49:54 +0900 (Wed, 12 Jul 2017) | 1 line

* 2017-07-12
------------------------------------------------------------------------
r59312 | nobu | 2017-07-12 11:49:53 +0900 (Wed, 12 Jul 2017) | 4 lines

optparse.rb: get rid of eval

* lib/optparse.rb: try Float() and Integer() instead of eval,
  which does too much things.
------------------------------------------------------------------------
r59311 | svn | 2017-07-11 16:42:27 +0900 (Tue, 11 Jul 2017) | 1 line

* 2017-07-11
------------------------------------------------------------------------
r59310 | ko1 | 2017-07-11 16:42:27 +0900 (Tue, 11 Jul 2017) | 5 lines

tainted string should be tainted.

* hash.c (hash_aset_str): create frozen string for tainted objects.
  (should not use fsting table on this case).

------------------------------------------------------------------------
r59309 | nobu | 2017-07-10 20:42:07 +0900 (Mon, 10 Jul 2017) | 5 lines

compile.c: simplify defined_expr0

* compile.c (defined_expr0): exapnd defined_expr macro.

* compile.c (defined_expr0): reduce duplicate code.
------------------------------------------------------------------------
r59308 | nobu | 2017-07-10 16:37:18 +0900 (Mon, 10 Jul 2017) | 1 line

test_rubyoptions.rb: assert -00
------------------------------------------------------------------------
r59307 | takano32 | 2017-07-10 15:57:50 +0900 (Mon, 10 Jul 2017) | 7 lines

a64: fix crash on register stack mark/sweep pass

* thread_pthread.c: move 'register_stack_start' earlier.
  [ruby-core:79928] [Bug #13284] [Fix GH-1625]

Author:    Sergei Trofimovich <slyfox@gentoo.org>

------------------------------------------------------------------------
r59306 | nobu | 2017-07-10 09:41:21 +0900 (Mon, 10 Jul 2017) | 1 line

hash.c: prefer value cast to pointer cast
------------------------------------------------------------------------
r59305 | svn | 2017-07-10 08:04:44 +0900 (Mon, 10 Jul 2017) | 1 line

* 2017-07-10
------------------------------------------------------------------------
r59304 | normal | 2017-07-10 08:04:43 +0900 (Mon, 10 Jul 2017) | 19 lines

Hash#[]= deduplicates string keys if (and only if) fstring exists

In typical applications, hash entries are read after being
written to.  Blindly writing to hashes which are never read
makes little sense. So, for any hash which is read from, an
fstring entry for the key should already exist for the key.

We no longer blindly create fstrings if the code is blindly
setting random hash keys, preventing the performance regression
in the reverted r43870.

Regarding <https://bugs.ruby-lang.org/issues/9188>, this has a
minimum impact on the bm_so_k_nucleotide where hash keys are set
and not reused, performance is within 1-2% of existing cases.

* hash.c: #include gc.h for rb_objspace_garbage_object_p
  (hash_aset_str): do read-only check of fstring table and
  reuse fstring if it exists and is still alive (not garbage)
  [ruby-core:81942] [Feature #13725]
------------------------------------------------------------------------
r59292 | nobu | 2017-07-09 13:49:15 +0900 (Sun, 09 Jul 2017) | 5 lines

downloader.rb: get rid of symlinks in dist files

* tool/downloader.rb: download to the target file directly if
  CACHE_SAVE=no, to get rid of symlinks in dist files.
  [ruby-core:81887] [Bug #13709]
------------------------------------------------------------------------
r59291 | nobu | 2017-07-09 13:20:48 +0900 (Sun, 09 Jul 2017) | 4 lines

make-snapshot: generate ChangeLog iff not exist

* tool/make-snapshot (package): ChangeLog had existed in pre-2.4
  revisions, but not doc/ChangeLog-YYYY.  fix for 2..3.
------------------------------------------------------------------------
r59290 | svn | 2017-07-09 13:17:50 +0900 (Sun, 09 Jul 2017) | 1 line

* 2017-07-09
------------------------------------------------------------------------
r59289 | nobu | 2017-07-09 13:17:49 +0900 (Sun, 09 Jul 2017) | 5 lines

make-snapshot: touch-unicode-files for 2.4

* tool/make-snapshot (package): fallback touch-unicode-files for
  2.4, which has been introduced to reduce downloads on CI.
  [ruby-core:81972] [Bug #13734]
------------------------------------------------------------------------
r59288 | nobu | 2017-07-08 21:31:55 +0900 (Sat, 08 Jul 2017) | 1 line

* template/exts.mk.tmpl: extract SUBMAKEOPTS from sub exts.mk files too.  [Bug #13730]
------------------------------------------------------------------------
r59287 | nobu | 2017-07-08 11:22:20 +0900 (Sat, 08 Jul 2017) | 6 lines

assertions.rb: syntax_check for other impl

* test/lib/test/unit/assertions.rb (syntax_check): use eval
  instead of RubyVM::InstructionSequence.compile so that other
  implementations can share the tests.
  [ruby-core:81935] [Bug #13723]
------------------------------------------------------------------------
r59285 | nobu | 2017-07-08 11:05:55 +0900 (Sat, 08 Jul 2017) | 1 line

.travis.yml: update dist to trusty
------------------------------------------------------------------------
r59284 | normal | 2017-07-08 02:59:09 +0900 (Sat, 08 Jul 2017) | 1 line

NEWS: note [Feature #13517] is Linux-only (no side-effects on _*nonblock)
------------------------------------------------------------------------
r59283 | normal | 2017-07-08 02:41:08 +0900 (Sat, 08 Jul 2017) | 1 line

NEWS: entry for WEBRick SNI support [Feature #13729]
------------------------------------------------------------------------
r59282 | svn | 2017-07-08 02:09:40 +0900 (Sat, 08 Jul 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59281 | normal | 2017-07-08 02:09:39 +0900 (Sat, 08 Jul 2017) | 7 lines

webrick: add Server Name Indication (SNI)

* lib/webrick/https.rb: servername_cb implementation.
* lib/webrick/ssl.rb: abstract servername_cb.
* test/webrick/test_https.rb: test.
  [ruby-dev:50165] [Feature #13729]
  Author: Tietew <tietew@gmail.com>
------------------------------------------------------------------------
r59280 | svn | 2017-07-08 01:53:04 +0900 (Sat, 08 Jul 2017) | 1 line

* 2017-07-08
------------------------------------------------------------------------
r59279 | normal | 2017-07-08 01:53:03 +0900 (Sat, 08 Jul 2017) | 3 lines

webrick: become maintainer

<CAK6HhsrshX7s3qai4usbXknTQnA4GoRThJcQ_Ea=WgTG2Gu0QA@mail.gmail.com>
------------------------------------------------------------------------
r59278 | nobu | 2017-07-07 21:25:49 +0900 (Fri, 07 Jul 2017) | 5 lines

Run single downloader

* common.mk (update-unicode-property-files, update-unicode-files):
  download in single process for each targets, not for each files
  in parallel, to get rid of conflicts.
------------------------------------------------------------------------
r59276 | svn | 2017-07-07 11:14:58 +0900 (Fri, 07 Jul 2017) | 1 line

* 2017-07-07
------------------------------------------------------------------------
r59275 | usa | 2017-07-07 11:14:57 +0900 (Fri, 07 Jul 2017) | 3 lines

* tool/redmine-backporter.rb (show): just report and ignore if a feature ticket
  is specified instead of aborting.

------------------------------------------------------------------------
r59273 | nobu | 2017-07-06 20:49:03 +0900 (Thu, 06 Jul 2017) | 8 lines

Fix DecimalInteger converting to octal bug

Previously if the input started with a '0' then it will be converted
as octal even though it has been specified as a decimal. This commit
forces the number to be interpreted as a decimal.

[ruby-core:81927] [Bug #13722] [Fix GH-1665]
Author:    william <william.mccumstie@outlook.com>
------------------------------------------------------------------------
r59272 | rhe | 2017-07-06 16:21:17 +0900 (Thu, 06 Jul 2017) | 4 lines

string.c: preserve coderange in String#setbyte

Fix a wrong jump so replacing a byte in an ASCII-only string with an
ASCII character won't clear the coderange.
------------------------------------------------------------------------
r59271 | rhe | 2017-07-06 16:21:16 +0900 (Thu, 06 Jul 2017) | 3 lines

string.c: remove dead code in str_fill_term()

The length of a string never exceeds the capacity.
------------------------------------------------------------------------
r59270 | svn | 2017-07-06 13:12:52 +0900 (Thu, 06 Jul 2017) | 1 line

* 2017-07-06
------------------------------------------------------------------------
r59269 | nobu | 2017-07-06 13:12:51 +0900 (Thu, 06 Jul 2017) | 5 lines

lexer.rb: ignore dedented space

* ext/ripper/lib/ripper/lexer.rb (on_heredoc_dedent): replace an
  empty string content because of dedentation with :on_ignored_sp.
  an empty token makes the sorted order unstable.
------------------------------------------------------------------------
r59268 | rhe | 2017-07-05 18:05:53 +0900 (Wed, 05 Jul 2017) | 4 lines

un.rb: use OpenSSL::PKey.read instead of OpenSSL::PKey::RSA.new

Also, error out if --ssl-private-key option is not given, since
specifying only the certificate makes no sense.  [Feature #13714]
------------------------------------------------------------------------
r59266 | nobu | 2017-07-05 15:32:54 +0900 (Wed, 05 Jul 2017) | 1 line

debug.c: add FMODE constants
------------------------------------------------------------------------
r59265 | nobu | 2017-07-05 15:27:43 +0900 (Wed, 05 Jul 2017) | 5 lines

un.rb: support https

* lib/un.rb: add https support.  based on the patch by Flavio
  Castelli <flavio@castelli.name> in [ruby-core:81901].
  [Feature #13714]
------------------------------------------------------------------------
r59264 | normal | 2017-07-05 02:27:40 +0900 (Wed, 05 Jul 2017) | 5 lines

tool/mk_call_iseq_optimized.rb: fix generated comment

"tool/mkcall_iseq.rb" never existed in our repo.

* tool/mk_call_iseq_optimized.rb: fix generated comment
------------------------------------------------------------------------
r59263 | svn | 2017-07-05 01:02:20 +0900 (Wed, 05 Jul 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59262 | mame | 2017-07-05 01:02:19 +0900 (Wed, 05 Jul 2017) | 5 lines

Use lcov visualizer for gcov statistics

This experimental feature is only for Ruby-core team, not for casual users.

Usage: `./configure --enable-gcov && make && make exam && make lcov`
------------------------------------------------------------------------
r59261 | svn | 2017-07-05 01:02:18 +0900 (Wed, 05 Jul 2017) | 1 line

* 2017-07-05
------------------------------------------------------------------------
r59260 | mame | 2017-07-05 01:02:18 +0900 (Wed, 05 Jul 2017) | 7 lines

tool/run-gcov.rb: ignore rubyspec_temp directory

rubyspec compiles the extension libraries for capi specs in a temporary
directory, and after that, deletes the directory.  gcov resurrects the
directory to save coverage statistics (.gcda files).  However, the
source and profiling artifacts (.gcno files) have been deleted.
So, we need to ignore the .gcda files.
------------------------------------------------------------------------
r59259 | nobu | 2017-07-04 14:42:04 +0900 (Tue, 04 Jul 2017) | 5 lines

vm_args.c: improve keyword argument errors

* vm_args.c (argument_arity_error): improve required keyword
  argument errors when non-keyword arguments given.
  [ruby-core:79439] [Bug #13196]
------------------------------------------------------------------------
r59258 | nobu | 2017-07-04 13:23:06 +0900 (Tue, 04 Jul 2017) | 6 lines

time.c: preserve marshalled timezone

* time.c (time_add): preserve timezone name restored by Marshal.
  [ruby-core:81892] [Bug #13710]

* time.c (time_mload): reset localtime if having timezone.
------------------------------------------------------------------------
r59257 | svn | 2017-07-04 08:42:13 +0900 (Tue, 04 Jul 2017) | 1 line

* 2017-07-04
------------------------------------------------------------------------
r59256 | nobu | 2017-07-04 08:42:12 +0900 (Tue, 04 Jul 2017) | 4 lines

win32.c: restrict cursor move

* win32/win32.c (constat_apply): restrict cursor move in visible
  screen only.  [ruby-core:81883] [Bug #13707]
------------------------------------------------------------------------
r59255 | nobu | 2017-07-03 19:56:21 +0900 (Mon, 03 Jul 2017) | 4 lines

win32.c: clear relative to screen

* win32/win32.c (constat_apply): clear visible screen only, not
  the entire buffer.  [ruby-core:81883] [Bug #13707]
------------------------------------------------------------------------
r59254 | nobu | 2017-07-03 19:22:15 +0900 (Mon, 03 Jul 2017) | 4 lines

win32.c: cursor relative to screen

* win32/win32.c (constat_apply): move relative to visible screen,
  not the entire buffer.  [ruby-core:81883] [Bug #13707]
------------------------------------------------------------------------
r59253 | naruse | 2017-07-03 17:08:29 +0900 (Mon, 03 Jul 2017) | 1 line

Suppress warning: method redefined; discarding old ==
------------------------------------------------------------------------
r59252 | svn | 2017-07-03 11:13:59 +0900 (Mon, 03 Jul 2017) | 1 line

* 2017-07-03
------------------------------------------------------------------------
r59251 | hsbt | 2017-07-03 11:13:59 +0900 (Mon, 03 Jul 2017) | 4 lines

Added sync to all of default gems command.

  * Fix command of FileUtils sync operation. test/fileutils is a directory.
  * When not given gem name option, do sync all of gems.
------------------------------------------------------------------------
r59250 | ktsj | 2017-07-02 19:38:38 +0900 (Sun, 02 Jul 2017) | 6 lines

Symbol#== should be able to be redefined

* vm.c (vm_init_redefined_flag): set redefinition flag for Symbol#==.
  The bug was introduced in r58895.

* test/ruby/test_symbol.rb: test for above.
------------------------------------------------------------------------
r59249 | svn | 2017-07-02 06:17:26 +0900 (Sun, 02 Jul 2017) | 1 line

* 2017-07-02
------------------------------------------------------------------------
r59248 | eregon | 2017-07-02 06:17:25 +0900 (Sun, 02 Jul 2017) | 1 line

Used a fixed seed in Random#rand spec
------------------------------------------------------------------------
r59246 | nobu | 2017-07-01 11:01:05 +0900 (Sat, 01 Jul 2017) | 4 lines

parse.y: f_margs parser events

* parse.y (f_margs): implemented parser events for massign
  formal arguments.  [ruby-core:81848] [Bug #13701]
------------------------------------------------------------------------
r59245 | nobu | 2017-07-01 10:51:17 +0900 (Sat, 01 Jul 2017) | 4 lines

parse.y: mlhs_add_post

* parse.y (mlhs_add_post): new parser event corresponding to
  POSTARG.
------------------------------------------------------------------------
r59244 | svn | 2017-07-01 10:29:23 +0900 (Sat, 01 Jul 2017) | 1 line

* 2017-07-01
------------------------------------------------------------------------
r59243 | nobu | 2017-07-01 10:29:22 +0900 (Sat, 01 Jul 2017) | 7 lines

test_parser_events.rb: simplify

* test/ripper/dummyparser.rb (DummyParser): simplified mlhs node
  representation.

* test/ripper/test_parser_events.rb (test_mlhs_add_star):
  simplified assertions.
------------------------------------------------------------------------
r59213 | nobu | 2017-06-30 13:19:12 +0900 (Fri, 30 Jun 2017) | 4 lines

main.c: RUBY_DEBUG_ENV in devel

* main.c (RUBY_DEBUG_ENV): default to enabled in the development
  version.
------------------------------------------------------------------------
r59212 | nobu | 2017-06-30 11:09:42 +0900 (Fri, 30 Jun 2017) | 7 lines

compile.c: dump iseq

* compile.c (append_compile_error): raise a fatal error when
  compile_debug is enabled.

* compile.c (COMPILE_ERROR): dump the disassembled instruction
  instruction sequence always.
------------------------------------------------------------------------
r59211 | nobu | 2017-06-30 10:56:53 +0900 (Fri, 30 Jun 2017) | 6 lines

vm_insnhelper.c: dump iseq

* vm_insnhelper.c (vm_stack_consistency_error): raise a fatal
  error with the disassembled instruction sequence, in the
  development version, instead of very rarely useful rb_bug in
  such case.
------------------------------------------------------------------------
r59210 | normal | 2017-06-30 07:40:36 +0900 (Fri, 30 Jun 2017) | 5 lines

array.c: more predefined IDs

* array.c (id_cmp): change to macro for OPTIMIZED_CMP
  (rb_ary_repeated_permutation_size): s/id_power/idPow/
  (Init_Array): remove id_cmp and id_power
------------------------------------------------------------------------
r59209 | svn | 2017-06-30 07:34:19 +0900 (Fri, 30 Jun 2017) | 1 line

* 2017-06-30
------------------------------------------------------------------------
r59208 | normal | 2017-06-30 07:34:19 +0900 (Fri, 30 Jun 2017) | 8 lines

remove unused rb_obj_basic_to_s_p function

This hasn't been used since r36709 (2012-08-15)
("Kernel#inspect: improve consistency and do not call #to_s.")
and was never part of public API in include/ruby/

* class.c (rb_obj_basic_to_s_p): remove function
* internal.h (rb_obj_basic_to_s_p): remove declaration
------------------------------------------------------------------------
r59207 | svn | 2017-06-29 23:35:39 +0900 (Thu, 29 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59206 | svn | 2017-06-29 23:35:39 +0900 (Thu, 29 Jun 2017) | 1 line

* append newline at EOF.
------------------------------------------------------------------------
r59205 | eregon | 2017-06-29 23:35:37 +0900 (Thu, 29 Jun 2017) | 1 line

Update to ruby/spec@abf1700
------------------------------------------------------------------------
r59204 | svn | 2017-06-29 23:35:11 +0900 (Thu, 29 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59203 | eregon | 2017-06-29 23:35:09 +0900 (Thu, 29 Jun 2017) | 1 line

Update to ruby/mspec@021a119
------------------------------------------------------------------------
r59202 | nobu | 2017-06-29 13:01:30 +0900 (Thu, 29 Jun 2017) | 6 lines

compile.c: disallow next in once

* compile.c (iseq_compile_each0): turned dregx context in "once"
  into "guarded" type from "block" type, to disallow `next`,
  `break`, `redo` as well as outside "once".
  [ruby-core:81805] [Bug #13690]
------------------------------------------------------------------------
r59201 | svn | 2017-06-29 00:25:31 +0900 (Thu, 29 Jun 2017) | 1 line

* 2017-06-29
------------------------------------------------------------------------
r59200 | ko1 | 2017-06-29 00:25:30 +0900 (Thu, 29 Jun 2017) | 8 lines

introduce rb_fiber_t::first_proc.

* cont.c (rb_fiber_t): add rb_fiber_t::first_proc and do not use
  rb_thread_t::first_proc which should be thread local.
  [Bug #13689]

* test/ruby/test_thread.rb: test for [Bug #13689].

------------------------------------------------------------------------
r59199 | ko1 | 2017-06-28 23:27:49 +0900 (Wed, 28 Jun 2017) | 7 lines

move fields to ec.

* vm_core.h (rb_thread.h): move errinfo and trace_arg to
  rb_execution_context_t.

* cont.c (fiber_switch, rb_cont_call): do not restore "trace_arg" here.

------------------------------------------------------------------------
r59198 | svn | 2017-06-28 19:18:04 +0900 (Wed, 28 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59197 | hsbt | 2017-06-28 19:18:03 +0900 (Wed, 28 Jun 2017) | 1 line

Added sync tool for default gems from github master.
------------------------------------------------------------------------
r59196 | nobu | 2017-06-28 15:13:00 +0900 (Wed, 28 Jun 2017) | 4 lines

parse.y: fix token

* parse.y (parser_parse_string): return proper token tREGEXP_END
  at unterminated regexp.  [Bug #13363]
------------------------------------------------------------------------
r59195 | ko1 | 2017-06-28 15:09:06 +0900 (Wed, 28 Jun 2017) | 5 lines

move fields to ec.

* vm_core.h (rb_thread_t): move root_lep, root_svar and ensure_list
  to rb_execution_context_t.

------------------------------------------------------------------------
r59194 | nobu | 2017-06-28 14:38:27 +0900 (Wed, 28 Jun 2017) | 4 lines

parse.y: add ellipsis

* parse.y (parser_yyerror): add ellipsis properly when error line
  is truncated.
------------------------------------------------------------------------
r59193 | ko1 | 2017-06-28 13:57:02 +0900 (Wed, 28 Jun 2017) | 1 line

fix to check thread type
------------------------------------------------------------------------
r59192 | ko1 | 2017-06-28 13:49:30 +0900 (Wed, 28 Jun 2017) | 7 lines

introduce rb_thread_ptr() to replace GetThreadPtr().

* vm_core.h (rb_thread_ptr): added to replace GetThreadPtr() macro.

* thread.c (in some functions: use "target_th" instead of "th" to make clear
  that it is not a current thread.

------------------------------------------------------------------------
r59191 | nobu | 2017-06-28 13:08:51 +0900 (Wed, 28 Jun 2017) | 4 lines

parse.y: flush numeric token

* parse.y (parser_number_literal_suffix, parse_numeric): flush
  numeric token so following unexpected token part is marked.
------------------------------------------------------------------------
r59190 | ko1 | 2017-06-28 11:50:56 +0900 (Wed, 28 Jun 2017) | 4 lines

move storages to ec.

* vm_core.h (rb_thread_t): move storages to rb_execution_context_t.

------------------------------------------------------------------------
r59189 | duerst | 2017-06-28 11:28:00 +0900 (Wed, 28 Jun 2017) | 1 line

add two tests
------------------------------------------------------------------------
r59188 | nobu | 2017-06-28 11:02:38 +0900 (Wed, 28 Jun 2017) | 4 lines

parse.y: fix parser_yyerror

* parse.y (parser_yyerror): fix buffer overflow at truncation of
  error line.  [ruby-core:81790] [Bug #13687]
------------------------------------------------------------------------
r59187 | nobu | 2017-06-28 10:49:44 +0900 (Wed, 28 Jun 2017) | 1 line

parse.y: prefer enum yytokentype instead to int
------------------------------------------------------------------------
r59186 | svn | 2017-06-28 02:10:57 +0900 (Wed, 28 Jun 2017) | 1 line

* 2017-06-28
------------------------------------------------------------------------
r59185 | nobu | 2017-06-28 02:10:56 +0900 (Wed, 28 Jun 2017) | 4 lines

downloader.rb: get rid of symlinks

* tool/downloader.rb: do not save downloaded files to cache.
  [ruby-core:81780] [Bug #13684]
------------------------------------------------------------------------
r59184 | nobu | 2017-06-27 23:09:08 +0900 (Tue, 27 Jun 2017) | 5 lines

fix return in toplevel ensure

* compile.c (iseq_compile_each0): adjust stack after return in
  toplevel ensure, when the value is used.
  [ruby-core:81777] [Bug #13682]
------------------------------------------------------------------------
r59183 | nobu | 2017-06-27 15:57:34 +0900 (Tue, 27 Jun 2017) | 8 lines

fix return in toplevel rescue/ensure

* compile.c (iseq_compile_each0): throw TAG_RETURN at return in
  toplevel rescue/ensure to adjust VM stack properly.
  [ruby-core:81777] [Bug #13682]

* vm_insnhelper.c (vm_throw_start): allow return in toplevel
  rescue/ensure.
------------------------------------------------------------------------
r59182 | svn | 2017-06-27 12:45:56 +0900 (Tue, 27 Jun 2017) | 1 line

* 2017-06-27
------------------------------------------------------------------------
r59181 | nobu | 2017-06-27 12:45:55 +0900 (Tue, 27 Jun 2017) | 6 lines

vm_insnhelper.c: break in once

* vm_insnhelper.c (vm_throw_start): size of catch table has been
  included in iseq_catch_table struct, which could be NULL, since
  2.2.  e.g., proc-closure in `once'.
  [ruby-core:81775] [Bug #13680]
------------------------------------------------------------------------
r59180 | naruse | 2017-06-26 19:37:13 +0900 (Mon, 26 Jun 2017) | 1 line

webrick is _unmaintained_
------------------------------------------------------------------------
r59179 | nobu | 2017-06-26 19:31:34 +0900 (Mon, 26 Jun 2017) | 4 lines

parse.y: line number of bin op

* parse.y (call_bin_op_gen): adjust line number to the receiver,
  instead of the rhs.
------------------------------------------------------------------------
r59178 | nobu | 2017-06-26 18:40:39 +0900 (Mon, 26 Jun 2017) | 16 lines

parse.y: mark error token

* parse.y (parser_yyerror): mark the whole last token which caused
  the error, not only the end.

before:
  ```
  if end
        ^
  ```

after:
  ```
  if end
     ^~~
  ```
------------------------------------------------------------------------
r59177 | ko1 | 2017-06-26 16:56:44 +0900 (Mon, 26 Jun 2017) | 5 lines

move several fields from rb_thread_t to rb_execution_context_t.

* vm_core.h (rb_thread_t): move several fields which are copied at cont.c
  to rb_execution_context_t.

------------------------------------------------------------------------
r59176 | ko1 | 2017-06-26 16:46:11 +0900 (Mon, 26 Jun 2017) | 4 lines

copy ec on Fiber.

* cont.c (cont_restore_thread): on Fiber we only need to copy ec struct.

------------------------------------------------------------------------
r59175 | ko1 | 2017-06-26 14:36:10 +0900 (Mon, 26 Jun 2017) | 4 lines

add "FIBER_" prefix.

* cont.c (enum fiber_status): add "FIBER_" prefix for all names.

------------------------------------------------------------------------
r59174 | ko1 | 2017-06-26 14:30:07 +0900 (Mon, 26 Jun 2017) | 7 lines

Do not store/restore Thread#status on fiber switching.

* cont.c (cont_restore_thread): On Fiber switching, thread status shold be
  THREAD_RUNNABLE so that we don't need to store/restore this field.

* cont.c (cont_save_thread): ditto.

------------------------------------------------------------------------
r59173 | svn | 2017-06-26 09:59:25 +0900 (Mon, 26 Jun 2017) | 1 line

* 2017-06-26
------------------------------------------------------------------------
r59172 | nobu | 2017-06-26 09:59:24 +0900 (Mon, 26 Jun 2017) | 4 lines

compile.c: fix debug print

* compile.c (iseq_compile_each0): debugs/ruby_debug_printf do not
  support PRIsVALUE.
------------------------------------------------------------------------
r59171 | nobu | 2017-06-25 17:55:23 +0900 (Sun, 25 Jun 2017) | 4 lines

compile.c: fix_sp_depth

* compile.c (fix_sp_depth): separate fix-up of sp depth from code
  generation.
------------------------------------------------------------------------
r59170 | svn | 2017-06-25 14:10:49 +0900 (Sun, 25 Jun 2017) | 1 line

* 2017-06-25
------------------------------------------------------------------------
r59169 | nobu | 2017-06-25 14:10:48 +0900 (Sun, 25 Jun 2017) | 5 lines

compile.c: toplevel return in argument

* compile.c (iseq_compile_each0): adjust the stack before return
  in an evstr/argument (reported by Balazs <balazs@kutilovi.cz>)
  to fix stack consistency error.  [ruby-core:81761] [Bug #13678]
------------------------------------------------------------------------
r59168 | nobu | 2017-06-24 21:01:02 +0900 (Sat, 24 Jun 2017) | 1 line

Added version guards [Bug #12684]
------------------------------------------------------------------------
r59167 | nobu | 2017-06-24 12:35:29 +0900 (Sat, 24 Jun 2017) | 5 lines

Delegate to `eql?` [Fix GH-1564]

* lib/delegate.rb (eql?): Delegate to `eql?` of the inner object.
  based on the patch by giginet <giginet.net@gmail.com>.
  [ruby-core:76950] [Bug #12684]
------------------------------------------------------------------------
r59166 | nobu | 2017-06-24 10:44:49 +0900 (Sat, 24 Jun 2017) | 4 lines

mspec.rb: keep jobserver fds

* spec/mspec/lib/mspec/commands/mspec.rb (MSpecMain#run): do not
  close jobserver FDs for mspec-run.
------------------------------------------------------------------------
r59165 | normal | 2017-06-24 05:59:00 +0900 (Sat, 24 Jun 2017) | 7 lines

thread_sync.c: fix documentation for Queue#close

When Queue#closed? is true, using push/enq/<< will raise an
exception, and not return nil.

* thread_sync.c: fix documentation for Queue#close
  Thanks to John Anderson.  [ruby-core:81749] [Misc #13673]
------------------------------------------------------------------------
r59164 | svn | 2017-06-24 00:08:51 +0900 (Sat, 24 Jun 2017) | 1 line

* 2017-06-24
------------------------------------------------------------------------
r59163 | nobu | 2017-06-24 00:08:50 +0900 (Sat, 24 Jun 2017) | 4 lines

test_command_processor.rb: add suffix

* test/shell/test_command_processor.rb (test_option_type): Windows
  needs a suffix to execute.
------------------------------------------------------------------------
r59162 | nobu | 2017-06-23 20:56:48 +0900 (Fri, 23 Jun 2017) | 4 lines

parse.y: should not warn op method call

* parse.y (void_expr_gen): should warn operator expression style
  calls only, but not method style calls.  [Fix GH-1660]
------------------------------------------------------------------------
r59161 | nobu | 2017-06-23 20:20:29 +0900 (Fri, 23 Jun 2017) | 5 lines

parse.y: check multibyte char

* parse.y (parser_precise_mbclen): check invalid multibyte char at
  skipping strings following `?x` literal string, not to stuck in
  a infinite loop.  [ruby-core:81746] [Bug #13672]
------------------------------------------------------------------------
r59160 | nobu | 2017-06-23 20:15:26 +0900 (Fri, 23 Jun 2017) | 5 lines

vm_core.h: sandwich jmpbuf

* vm_core.h (rb_vm_tag): move jmpbuf which should be stored at the
  last in TH_PUSH_TAG, between tag and state so ensure to be
  accessible.  reapplied r40806.
------------------------------------------------------------------------
r59159 | ko1 | 2017-06-23 18:43:52 +0900 (Fri, 23 Jun 2017) | 5 lines

move "state" to rb_vm_tag.

* vm_core.h (rb_thread_t::tag_state): move to "rb_vm_tag::state".
  Lifetime of "state" should be same as current tag.

------------------------------------------------------------------------
r59158 | ko1 | 2017-06-23 17:48:41 +0900 (Fri, 23 Jun 2017) | 5 lines

rename th->state to th->tag_state.

* vm_core.h (rb_thread_t): rename rb_thread_t::state to tag_state
  to make it clear.

------------------------------------------------------------------------
r59157 | ko1 | 2017-06-23 17:24:54 +0900 (Fri, 23 Jun 2017) | 2 lines

rb_catch_protect() accepts enum ruby_tag_type *.

------------------------------------------------------------------------
r59156 | nobu | 2017-06-23 16:53:07 +0900 (Fri, 23 Jun 2017) | 4 lines

thread.c: suppress warning

* thread.c (exec_recursive): rb_catch_protect() uses `int*` as
  well as rb_protect.
------------------------------------------------------------------------
r59155 | ko1 | 2017-06-23 16:25:52 +0900 (Fri, 23 Jun 2017) | 12 lines

use "enum ruby_tag_type" and TAG_NONE.

Return value of EXEC_TAG() is saved by "int state".
Instead of "int", use "enum ruby_tag_type". First EXEC_TAG()
value should be 0, so that define TAG_NONE (= 0) and use it.

Some code used "status" instead of "state". To make them clear,
rename them to state.

We can change variable name from "state" to "tag_state", but this
ticket doesn't contain it.

------------------------------------------------------------------------
r59154 | ko1 | 2017-06-23 14:55:12 +0900 (Fri, 23 Jun 2017) | 1 line

use NULL instead of 0.
------------------------------------------------------------------------
r59153 | ko1 | 2017-06-23 14:52:28 +0900 (Fri, 23 Jun 2017) | 2 lines

skip on other threads (again).

------------------------------------------------------------------------
r59152 | ko1 | 2017-06-23 14:50:35 +0900 (Fri, 23 Jun 2017) | 2 lines

revert r59151 which introduce failures.

------------------------------------------------------------------------
r59151 | ko1 | 2017-06-23 14:45:50 +0900 (Fri, 23 Jun 2017) | 3 lines

skip on other threads.


------------------------------------------------------------------------
r59150 | glass | 2017-06-23 13:19:53 +0900 (Fri, 23 Jun 2017) | 3 lines

Revert "Allow IO#reopen to take a block"

This reverts r59142.
------------------------------------------------------------------------
r59149 | nobu | 2017-06-23 10:43:39 +0900 (Fri, 23 Jun 2017) | 4 lines

vm_insnhelper.c: vm_stack_consistency_error

* vm_insnhelper.c (vm_stack_consistency_error): extracted from
  insns.def for further info in the future.
------------------------------------------------------------------------
r59148 | svn | 2017-06-23 09:29:45 +0900 (Fri, 23 Jun 2017) | 1 line

* 2017-06-23
------------------------------------------------------------------------
r59147 | nobu | 2017-06-23 09:29:45 +0900 (Fri, 23 Jun 2017) | 9 lines

refinements.rdoc: [DOC] improved [Fix GH-1659]

* doc/syntax/refinements.rdocrefinements.rdoc: grammatical
  correction and code highlighting improved

* doc/syntax/refinements.rdocrefinements.rdoc: Fixnum replaced
  with Integer and Integer with Numeric

Author:    Shiva Bhusal <shivabhusal@users.noreply.github.com>
------------------------------------------------------------------------
r59146 | nobu | 2017-06-22 21:53:05 +0900 (Thu, 22 Jun 2017) | 5 lines

fix mortal_dynamic_symbol count

* test/objspace/test_objspace.rb (test_count_symbols): exclude a
  dynamic symbol which has been turned into immortal by
  define_method.
------------------------------------------------------------------------
r59145 | glass | 2017-06-22 19:56:49 +0900 (Thu, 22 Jun 2017) | 9 lines

Fix exception type in option type checker

* lib/shell/system-command.rb (SystemCommand#initialize):
  `def_e2message` wraps error message, but does not define new exception

* test/shell/test_command_processor.rb: add a test

This patch is authored by Kenichi Kamiya <kachick1@gmail.com>
close #1657
------------------------------------------------------------------------
r59144 | ko1 | 2017-06-22 17:37:53 +0900 (Thu, 22 Jun 2017) | 7 lines

use --dump option for parse rule.

* common.mk: use --dump=--dump=parsetree_with_comment,insns
  instead of tool/parse.rb. maybe nobody use this option so that
  I believe it is enough. previous "parse" rule doesn't run script
  but patched parse rule runs specified script (on miniruby).

------------------------------------------------------------------------
r59143 | ko1 | 2017-06-22 17:33:33 +0900 (Thu, 22 Jun 2017) | 7 lines

try to fix symbol duplication.

* test/objspace/test_objspace.rb (test_count_symbols): make more complex dynamic
  symbols to avoid conflict with other existing static symbols.
  Sometimes this test fails with "mortal_dynamic_symbol=>127".


------------------------------------------------------------------------
r59142 | glass | 2017-06-22 15:50:32 +0900 (Thu, 22 Jun 2017) | 8 lines

Allow IO#reopen to take a block

* io.c (rb_io_reopen): take a block and ensure the IO closed
  [Feature #2631]

* test/ruby/test_io.rb: add a test

* NEWS: add an entry for this change
------------------------------------------------------------------------
r59141 | svn | 2017-06-22 15:42:27 +0900 (Thu, 22 Jun 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59140 | ko1 | 2017-06-22 15:42:26 +0900 (Thu, 22 Jun 2017) | 5 lines

introduce heap_allocatable_pages_set().

* gc.c (heap_allocatable_pages_set): added. This function set
  heap_allocatable_pages and sorted_list atomically.

------------------------------------------------------------------------
r59139 | ko1 | 2017-06-22 14:51:43 +0900 (Thu, 22 Jun 2017) | 3 lines

catch up frozen_string_literal: true.


------------------------------------------------------------------------
r59138 | ko1 | 2017-06-22 14:03:18 +0900 (Thu, 22 Jun 2017) | 5 lines

introduce GC_ASSERT().

* gc.c (GC_ASSERT()): added. GC_ASSERT() is similar to VM_ASSERT in
  vm_core.h but turn on by RGENGC_CHECK_MODE.

------------------------------------------------------------------------
r59137 | svn | 2017-06-22 09:59:55 +0900 (Thu, 22 Jun 2017) | 1 line

* 2017-06-22
------------------------------------------------------------------------
r59136 | nobu | 2017-06-22 09:59:54 +0900 (Thu, 22 Jun 2017) | 4 lines

gc.c: expand sorted pages

* gc.c (heap_page_allocate): expand sorted pages before inserting
  allocated new page.  [Bug #12670]
------------------------------------------------------------------------
r59135 | nobu | 2017-06-21 21:51:26 +0900 (Wed, 21 Jun 2017) | 4 lines

gc.c: FL_CHECK2

* gc.c (FL_TEST2, FL_SET2, FL_UNSET2): make error messages
  consitent.
------------------------------------------------------------------------
r59134 | eregon | 2017-06-21 19:06:44 +0900 (Wed, 21 Jun 2017) | 1 line

* NEWS: Fix typo.
------------------------------------------------------------------------
r59133 | sonots | 2017-06-21 16:43:27 +0900 (Wed, 21 Jun 2017) | 6 lines

test/ruby/test_string.rb: add tests to chomp substr

* test/ruby/test_string.rb (TestString#test_chomp): add tests
  to chomp substr

* test/ruby/test_string.rb (TestString#test_chomp!): ditto
------------------------------------------------------------------------
r59132 | sonots | 2017-06-21 16:43:26 +0900 (Wed, 21 Jun 2017) | 10 lines

string.c: add String#delete_prefix and String#delete_prefix!
to remove leading substr [Feature #12694] [fix GH-1632]

* string.c (rb_str_delete_prefix_bang): add a new method
  to remove prefix destuctively.

* string.c (rb_str_delete_prefix): add a new method
  to remove prefix non-destuctively.

* test/ruby/test_string.rb: add tests.
------------------------------------------------------------------------
r59131 | nobu | 2017-06-21 13:34:25 +0900 (Wed, 21 Jun 2017) | 8 lines

RUBY_DEVEL flag

* configure.in: define RUBY_DEVEL only in the trunk.

* gc.c: enable runtime rgengc debug if RUBY_DEVEL

* ruby.c (debug_option): enable RUBY_DEBUG in --debug option only
  if RUBY_DEVEL.
------------------------------------------------------------------------
r59130 | nobu | 2017-06-21 12:27:21 +0900 (Wed, 21 Jun 2017) | 1 line

configure.in: use AS_IF
------------------------------------------------------------------------
r59129 | nobu | 2017-06-21 11:44:23 +0900 (Wed, 21 Jun 2017) | 4 lines

ruby.c: debug options in command line

* ruby.c (debug_option): parse options in --debug command line
  option same as RUBY_DEBUG env.  available only in the trunk.
------------------------------------------------------------------------
r59128 | nobu | 2017-06-21 11:25:27 +0900 (Wed, 21 Jun 2017) | 6 lines

Fix Enumerable#uniq with non single yield arguments

* enum.c (uniq_func, uniq_iter): need packed value as the unique
  key.  [ruby-core:81734] [Bug #13669] [Fix GH-1658]

Author:    Kenichi Kamiya <kachick1@gmail.com>
------------------------------------------------------------------------
r59127 | nobu | 2017-06-21 11:03:38 +0900 (Wed, 21 Jun 2017) | 1 line

KNOWNBUGS.rb: hung up on linux
------------------------------------------------------------------------
r59126 | nobu | 2017-06-21 10:34:34 +0900 (Wed, 21 Jun 2017) | 1 line

KNOWNBUGS.rb: deferred free
------------------------------------------------------------------------
r59125 | nobu | 2017-06-21 10:34:33 +0900 (Wed, 21 Jun 2017) | 1 line

bootstraptest/runner.rb: keyword argument
------------------------------------------------------------------------
r59124 | svn | 2017-06-21 00:23:51 +0900 (Wed, 21 Jun 2017) | 1 line

* 2017-06-21
------------------------------------------------------------------------
r59123 | eregon | 2017-06-21 00:23:50 +0900 (Wed, 21 Jun 2017) | 4 lines

Use a file under tmp for File.real{,dir}path specs on Windows

* The source file path could have pre-existing symlinks.
* See https://github.com/ruby/spec/issues/445.
------------------------------------------------------------------------
r59122 | hsbt | 2017-06-20 20:43:05 +0900 (Tue, 20 Jun 2017) | 1 line

Fixed missing handling for frozen object at r59121.
------------------------------------------------------------------------
r59121 | hsbt | 2017-06-20 20:10:37 +0900 (Tue, 20 Jun 2017) | 1 line

Specify frozen_string_literal: true.
------------------------------------------------------------------------
r59120 | nobu | 2017-06-20 17:23:25 +0900 (Tue, 20 Jun 2017) | 4 lines

gc.c: add newline to report [ci skip]

* gc.c (gc_sweep_finish): gc_report format should end with a
  newline, as gc_report_body does not append it.
------------------------------------------------------------------------
r59119 | svn | 2017-06-20 14:34:33 +0900 (Tue, 20 Jun 2017) | 1 line

* 2017-06-20
------------------------------------------------------------------------
r59118 | ko1 | 2017-06-20 14:34:33 +0900 (Tue, 20 Jun 2017) | 2 lines

skip unresolved issue.

------------------------------------------------------------------------
r59117 | nobu | 2017-06-19 23:36:18 +0900 (Mon, 19 Jun 2017) | 1 line

debug.c: rgengc debug option
------------------------------------------------------------------------
r59116 | nobu | 2017-06-19 23:36:17 +0900 (Mon, 19 Jun 2017) | 3 lines

test for [Bug #12670]

heap corruption by deferred free.
------------------------------------------------------------------------
r59115 | hsbt | 2017-06-19 22:03:06 +0900 (Mon, 19 Jun 2017) | 9 lines

Make string literal to frozen object on gemspec of defulte gems.

  Added following gemspecs.

    * extensions: date, dbm, etc, fiddle, gdbm, sdbm, stringio, strscan, zlib
    * pure ruby libraries: cmath, csv, fileutils, scanf, webrick

  psych and rdoc is out of scope of this commit. I will merge after
  upstream was change to `frozen_string_literal: true`.
------------------------------------------------------------------------
r59114 | svn | 2017-06-19 22:00:13 +0900 (Mon, 19 Jun 2017) | 1 line

* 2017-06-19
------------------------------------------------------------------------
r59113 | eregon | 2017-06-19 22:00:12 +0900 (Mon, 19 Jun 2017) | 3 lines

Adapt Time#zone spec to deal with differences of TZ validation on Windows

* [Bug #13591] [ruby-core:81347]
------------------------------------------------------------------------
r59112 | nobu | 2017-06-18 13:38:01 +0900 (Sun, 18 Jun 2017) | 5 lines

string.c: check just before modification

* string.c (rb_str_chomp_bang): check if modifiable after checking
  an argument and just before modification, as it can get frozen
  during the argument conversion to String.
------------------------------------------------------------------------
r59111 | nobu | 2017-06-18 13:29:05 +0900 (Sun, 18 Jun 2017) | 4 lines

test_string.rb: chomp! frozen string

* test/ruby/test_string.rb (TestString#test_chomp): should raise
  if frozen.
------------------------------------------------------------------------
r59110 | nobu | 2017-06-18 13:29:04 +0900 (Sun, 18 Jun 2017) | 5 lines

test/unit.rb: close jobserver

* test/lib/test/unit.rb (Test::Unit::Parallel#flush_job_tokens):
  close jobserver auth fds aflter flush, not to  release tokens
  more than acquired.
------------------------------------------------------------------------
r59109 | nobu | 2017-06-18 10:15:36 +0900 (Sun, 18 Jun 2017) | 5 lines

capi/spec_helper.rb: suppress logo

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  suppress logo of nmake.exe to stderr.  we want to show compiler
  warnings only.
------------------------------------------------------------------------
r59108 | svn | 2017-06-18 10:15:36 +0900 (Sun, 18 Jun 2017) | 1 line

* 2017-06-18
------------------------------------------------------------------------
r59107 | nobu | 2017-06-18 10:15:35 +0900 (Sun, 18 Jun 2017) | 4 lines

appveyor.yml: num of jobs

* appveyor.yml (test_script): stop running too many workers to get
  rid of sporadic NoMemoryError.
------------------------------------------------------------------------
r59106 | nobu | 2017-06-17 09:18:33 +0900 (Sat, 17 Jun 2017) | 7 lines

capi/spec_helper.rb: pass jobserver fds

* spec/mspec/lib/mspec/commands/mspec.rb (MSpecMain#multi_exec):
  do not close GNU make jobserver auth fds.

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  ditto.
------------------------------------------------------------------------
r59105 | nobu | 2017-06-17 09:10:54 +0900 (Sat, 17 Jun 2017) | 5 lines

capi/spec_helper.rb: use MAKE env

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  prefer MAKE environment variable to hardcoded name if set by
  parent make.
------------------------------------------------------------------------
r59104 | svn | 2017-06-17 08:59:34 +0900 (Sat, 17 Jun 2017) | 1 line

* 2017-06-17
------------------------------------------------------------------------
r59103 | nobu | 2017-06-17 08:59:33 +0900 (Sat, 17 Jun 2017) | 4 lines

default.mspec: limit cores

* spec/default.mspec (MSpecScript::JobServer#cores): limit max
  number of processors, not to acquire tokens more than necessary.
------------------------------------------------------------------------
r59102 | nobu | 2017-06-16 23:44:01 +0900 (Fri, 16 Jun 2017) | 6 lines

pathname.rb: UNC root pathname needs a separator

* ext/pathname/lib/pathname.rb (Pathname#plus): UNC root pathname
  needs a separator.  File.basename returns "/" on UNC root, as
  well as sole drive letter, even if it does not end with a
  separator.  [ruby-core:80900] [Bug #13515]
------------------------------------------------------------------------
r59101 | hsbt | 2017-06-16 16:02:22 +0900 (Fri, 16 Jun 2017) | 9 lines

Merge psych-3.0.0.beta2 from https://github.com/ruby/psych

  It contains following changes from 3.0.0.beta1

    * Preserve time zone offset when deserializing times
      https://github.com/ruby/psych/pull/316

    * Enable YAML serialization of Ruby delegators
      https://github.com/ruby/psych/pull/158
------------------------------------------------------------------------
r59100 | ko1 | 2017-06-16 13:04:53 +0900 (Fri, 16 Jun 2017) | 4 lines

require 'bigdecimal'

* test/json/json_parser_test.rb: this test needs bigdecimal.

------------------------------------------------------------------------
r59099 | hsbt | 2017-06-16 12:04:46 +0900 (Fri, 16 Jun 2017) | 3 lines

Merge json-2.1.0 from https://github.com/flori/json

  https://github.com/flori/json/blob/master/CHANGES.md#2017-04-18-210
------------------------------------------------------------------------
r59098 | svn | 2017-06-16 10:53:16 +0900 (Fri, 16 Jun 2017) | 1 line

* 2017-06-16
------------------------------------------------------------------------
r59097 | nobu | 2017-06-16 10:53:15 +0900 (Fri, 16 Jun 2017) | 1 line

removed ruby_error_print
------------------------------------------------------------------------
r59096 | usa | 2017-06-15 23:04:29 +0900 (Thu, 15 Jun 2017) | 7 lines

Clear `DESTDIR` when running make

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension): `DESTDIR` is
  the drive letter of the ruby installed path as default on mswin, but not
  builddir of the ruby.  this causes spec errors if the drive letter is
  different in the installed path and builddir.

------------------------------------------------------------------------
r59095 | eregon | 2017-06-15 22:34:32 +0900 (Thu, 15 Jun 2017) | 1 line

Update to ruby/spec@c730f07
------------------------------------------------------------------------
r59094 | svn | 2017-06-15 21:48:54 +0900 (Thu, 15 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59093 | eregon | 2017-06-15 21:48:52 +0900 (Thu, 15 Jun 2017) | 1 line

Update to ruby/spec@cd1b911
------------------------------------------------------------------------
r59092 | eregon | 2017-06-15 21:48:26 +0900 (Thu, 15 Jun 2017) | 1 line

Update to ruby/mspec@d900a49
------------------------------------------------------------------------
r59091 | nobu | 2017-06-15 20:51:39 +0900 (Thu, 15 Jun 2017) | 1 line

Revert r59084, see r57060
------------------------------------------------------------------------
r59090 | a_matsuda | 2017-06-15 19:43:17 +0900 (Thu, 15 Jun 2017) | 10 lines

Don't pollute toplevel by an IRB internal method

There actually are some libraries that requires 'irb' such as byebug, and when
'irb' is required, it requires irb/src_encoding.rb, then it defines the toplevel
default_src_encoding method that is visible from anywhere in the end users' apps.

Here's a quick oneliner that shows what's happening.

  % ruby -rpry-byebug -e 'p private_methods(false)'
  [:include, :using, :define_method, :public, :private, :DelegateClass, :default_src_encoding]
------------------------------------------------------------------------
r59089 | ko1 | 2017-06-15 16:16:17 +0900 (Thu, 15 Jun 2017) | 4 lines

Prohibit SystemStackError while GC.

* vm_insnhelper.c (rb_threadptr_stack_overflow): fatal on GC [Bug #13662]

------------------------------------------------------------------------
r59088 | nobu | 2017-06-15 12:12:32 +0900 (Thu, 15 Jun 2017) | 8 lines

common.mk: tweaked packages order

* common.mk (dist): tweaked packages order by $(DISTPKGS).
  .tar.gz comes first for the hash values in downloads page, then
  popular .zip.

* tool/make-snapshot: "all" in -packages means all of the rest
  package types now.
------------------------------------------------------------------------
r59087 | nobu | 2017-06-15 11:39:06 +0900 (Thu, 15 Jun 2017) | 1 line

make-snapshot: colorize [ci skip]
------------------------------------------------------------------------
r59086 | nobu | 2017-06-15 11:33:57 +0900 (Thu, 15 Jun 2017) | 1 line

make-snapshot: suppress output from 7z [ci skip]
------------------------------------------------------------------------
r59085 | svn | 2017-06-15 11:33:56 +0900 (Thu, 15 Jun 2017) | 1 line

* 2017-06-15
------------------------------------------------------------------------
r59084 | nobu | 2017-06-15 11:33:56 +0900 (Thu, 15 Jun 2017) | 1 line

make-snapshot: prefer default commands over 7z [ci skip]
------------------------------------------------------------------------
r59083 | nobu | 2017-06-14 23:02:33 +0900 (Wed, 14 Jun 2017) | 4 lines

proc.c: infect inspect result

* proc.c (method_inspect): the result should be infected by the
  object.
------------------------------------------------------------------------
r59082 | nobu | 2017-06-14 22:08:50 +0900 (Wed, 14 Jun 2017) | 1 line

test/ruby/test_method.rb: refined  [ruby-core:81666] [Bug #13656]
------------------------------------------------------------------------
r59081 | rhe | 2017-06-14 18:49:09 +0900 (Wed, 14 Jun 2017) | 36 lines

openssl: import v2.0.4

Import Ruby/OpenSSL 2.0.4. Only bug (and typo) fixes. The full commit
history since v2.0.3 (imported at r57482) can be found at:

  https://github.com/ruby/openssl/compare/v2.0.3...v2.0.4

This contains the fix for [Bug #11033].

----------------------------------------------------------------
Jun Aruga (1):
      Update .travis.yml and Dockerfile

Kazuki Yamaguchi (9):
      test/test_pkey_ec: do not use dummy 0 order
      test/test_ssl: fix typo in test_sysread_and_syswrite
      ssl: check return value of SSL_set_fd()
      Fix typos
      test/test_x509store: skip OpenSSL::TestX509Store#test_set_errors
      tool/sync-with-trunk: 'LASY' -> 'LAST'
      x509store: clear error queue after calling X509_LOOKUP_load_file()
      extconf.rb: simplify searching libraries logic
      Ruby/OpenSSL 2.0.4

SHIBATA Hiroshi (1):
      Fix typos

Vladimir Rybas (1):
      Fix documentation for OpenSSL::Cipher#final

nobu (2):
      openssl: fix broken openssl check
      openssl: fix broken openssl check

usa (1):
      Search SSL libraries by testing various filename patterns
------------------------------------------------------------------------
r59080 | nobu | 2017-06-14 15:03:55 +0900 (Wed, 14 Jun 2017) | 5 lines

proc.c: skip prepended modules

* proc.c (method_super_method): skip prepended modules and
  continue from the super class of the original class.
  [ruby-core:81666] [Bug #13656]
------------------------------------------------------------------------
r59079 | nobu | 2017-06-14 14:10:30 +0900 (Wed, 14 Jun 2017) | 4 lines

compile.c: dump and error before allocation

* compile.c (iseq_set_sequence): separate instruction dump and
  error, before allocation of sequence.
------------------------------------------------------------------------
r59078 | ko1 | 2017-06-14 13:27:14 +0900 (Wed, 14 Jun 2017) | 5 lines

simply call xfree().

* compile.c (BADINSN_ERROR): mixing (void) and (int) will fail solaris
  compiler. [ruby-core:81668], [Bug #13658]

------------------------------------------------------------------------
r59077 | svn | 2017-06-14 11:26:19 +0900 (Wed, 14 Jun 2017) | 1 line

* 2017-06-14
------------------------------------------------------------------------
r59076 | ko1 | 2017-06-14 11:26:18 +0900 (Wed, 14 Jun 2017) | 6 lines

remove OPT_CALL_CFUNC_WITHOUT_FRAME.

* vm_core.h (OPT_CALL_CFUNC_WITHOUT_FRAME): removed because nobody use it.
  This optimization tries to call C-methods without pushing VM frames,
  however no big improvements compare with this complexity.

------------------------------------------------------------------------
r59075 | nobu | 2017-06-13 12:20:12 +0900 (Tue, 13 Jun 2017) | 2 lines

* compile.c (dump_disasm_list_with_cursor): replace with
  dump_disasm_list_with_cursor_dest.
------------------------------------------------------------------------
r59074 | ko1 | 2017-06-13 11:52:33 +0900 (Tue, 13 Jun 2017) | 5 lines

fix to free unallocated memory.

* compile.c (iseq_set_sequence): initialize with NULL for line_info_table
  and generated_iseq and check NULL at BADINSN_ERROR.

------------------------------------------------------------------------
r59073 | nobu | 2017-06-13 10:31:32 +0900 (Tue, 13 Jun 2017) | 4 lines

compile.c: refine error message

* compile.c (insn_set_sc_state): dump the whole instructions and
  mark the destination when label state mismatch.
------------------------------------------------------------------------
r59072 | svn | 2017-06-13 10:04:57 +0900 (Tue, 13 Jun 2017) | 1 line

* 2017-06-13
------------------------------------------------------------------------
r59071 | nobu | 2017-06-13 10:04:56 +0900 (Tue, 13 Jun 2017) | 1 line

compile.c: refine error messages
------------------------------------------------------------------------
r59070 | k0kubun | 2017-06-12 20:09:10 +0900 (Mon, 12 Jun 2017) | 5 lines

array.c: [DOC] Make it clear that #<< modifies receiver

This patch is sent from @selmertsx (morioka shuhei).

[fix GH-1646]
------------------------------------------------------------------------
r59069 | ko1 | 2017-06-12 16:58:23 +0900 (Mon, 12 Jun 2017) | 1 line

add a comment for rb_thread_mark()
------------------------------------------------------------------------
r59068 | ko1 | 2017-06-12 16:49:33 +0900 (Mon, 12 Jun 2017) | 8 lines

remove rb_blocking_region_buffer::oldubf.

* thread.c (rb_blocking_region_buffer): remove oldubf because ubf should be
  NULL just before ubf setting.

* thread.c (set_unblock_function, reset_unblock_function): rename to
  unblock_function_set() and unblock_function_clear() respectively.

------------------------------------------------------------------------
r59067 | nobu | 2017-06-12 15:31:02 +0900 (Mon, 12 Jun 2017) | 4 lines

unused functions

* thread_win32.c: native_cond_signal, native_cond_wait,
  native_cond_initialize, native_cond_destroy are not used now.
------------------------------------------------------------------------
r59066 | ko1 | 2017-06-12 13:52:25 +0900 (Mon, 12 Jun 2017) | 15 lines

remove ruby_kill() introduced for  [Bug #7951].

* thread.c (rbuy_kill): removed. This function is used
  with SIGSEGV, SIGBUS, SIGKILL, SIGILL, SIGFPE and SIGSTOP
  and these signals are affect immediately. So that `kill(2)'
  is enough for them.

* signal.c (rb_f_kill): ditto.

* vm_core.h (rb_thread_t::interrupt_cond): removed because
  only `ruby_kill()' uses this field.

* test/ruby/test_signal.rb: Without this patch sending SIGSTOP to own
  process wait another interrupt even if another process sends SIGCONT.

------------------------------------------------------------------------
r59065 | nobu | 2017-06-12 13:35:53 +0900 (Mon, 12 Jun 2017) | 3 lines

iseq.c: preserve encoding

* iseq.c (iseqw_inspect): preserve path encoding in the result.
------------------------------------------------------------------------
r59064 | nobu | 2017-06-12 13:35:52 +0900 (Mon, 12 Jun 2017) | 1 line

gc.c: duplicate rb_iseq_path by RSTRING_PTR
------------------------------------------------------------------------
r59063 | ko1 | 2017-06-12 11:20:09 +0900 (Mon, 12 Jun 2017) | 7 lines


* proc.c (get_local_variable_ptr): return found env ptr. Returned env
  will be used by write barrier at `bind_local_variable_set()'.
  [Bug #13605]

* test/ruby/test_proc.rb: add a test for this issue.

------------------------------------------------------------------------
r59062 | svn | 2017-06-12 09:18:31 +0900 (Mon, 12 Jun 2017) | 1 line

* 2017-06-12
------------------------------------------------------------------------
r59061 | nobu | 2017-06-12 09:18:30 +0900 (Mon, 12 Jun 2017) | 4 lines

win32.c: rb_dir_getwd_ospath

* win32/win32.c (rb_dir_getwd_ospath): Windows implementation
  moved from dir.c.  get rid of freeing malloced memory by xfree.
------------------------------------------------------------------------
r59060 | nobu | 2017-06-11 20:21:01 +0900 (Sun, 11 Jun 2017) | 4 lines

expand ruby_sourcefile

* compile.c: expand ruby_sourcefile not to evaluate twice in
  RSTRING_PTR.
------------------------------------------------------------------------
r59059 | svn | 2017-06-11 14:36:57 +0900 (Sun, 11 Jun 2017) | 1 line

* 2017-06-11
------------------------------------------------------------------------
r59058 | nobu | 2017-06-11 14:36:56 +0900 (Sun, 11 Jun 2017) | 1 line

configure.in: link the DWARF debug information
------------------------------------------------------------------------
r59057 | svn | 2017-06-10 19:26:33 +0900 (Sat, 10 Jun 2017) | 1 line

* 2017-06-10
------------------------------------------------------------------------
r59056 | nobu | 2017-06-10 19:26:32 +0900 (Sat, 10 Jun 2017) | 7 lines

enumerator.c: fix nested maps

* enumerator.c (lazy_map_proc, lazy_grep_iter_proc): marks values
  returned by blocks are not packed in the case of nested maps, so
  that the result will be same as non-lazy version.  based on the
  patch by akihikodaki (Akihiko Odaki) at [ruby-core:81638],
  without GCC extension.  [Bug#13648]
------------------------------------------------------------------------
r59055 | nobu | 2017-06-09 23:42:15 +0900 (Fri, 09 Jun 2017) | 6 lines

thread_pthread.c: workaround for valgrind on Mac

* thread.c: revert r59053.

* thread_pthread.c (rb_thread_create_timer_thread): needs more
  stack space for valgrind.
------------------------------------------------------------------------
r59054 | nobu | 2017-06-09 23:42:14 +0900 (Fri, 09 Jun 2017) | 1 line

signal.c: do not disable handlers to dump core
------------------------------------------------------------------------
r59053 | nobu | 2017-06-09 22:58:09 +0900 (Fri, 09 Jun 2017) | 9 lines

thread.c: workaround for valgrind on Mac OS X

Without this hack, pthread_join() in rb_thread_stop_timer_thread()
segfaults.

ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G1510
valgrind-3.12.0
------------------------------------------------------------------------
r59052 | nobu | 2017-06-09 22:02:13 +0900 (Fri, 09 Jun 2017) | 4 lines

signal.c: no sigsegv handler with valgrind

* signal.c: disable handling signals to dump core, if installing
  unreserved signals failed, not valgrind to hang on Mac OS.
------------------------------------------------------------------------
r59051 | nobu | 2017-06-09 17:30:24 +0900 (Fri, 09 Jun 2017) | 1 line

signal.c: warn at unresserved signals
------------------------------------------------------------------------
r59050 | hsbt | 2017-06-09 12:20:03 +0900 (Fri, 09 Jun 2017) | 5 lines

Update bundled gems to latest versions.

  * did_you_mean 1.1.2
  * minitest 5.10.2
  * xmlrpc 0.3.0
------------------------------------------------------------------------
r59049 | a_matsuda | 2017-06-09 10:31:36 +0900 (Fri, 09 Jun 2017) | 7 lines

Fix typo.

Patch by: Sarah Duve
Signed-off-by: Akira Matsuda <ronnie@dio.jp>

[Fix GH-1643]
[ci skip]
------------------------------------------------------------------------
r59048 | svn | 2017-06-09 05:58:04 +0900 (Fri, 09 Jun 2017) | 1 line

* 2017-06-09
------------------------------------------------------------------------
r59047 | normal | 2017-06-09 05:58:03 +0900 (Fri, 09 Jun 2017) | 13 lines

tool/runruby.rb: test with smallest possible machine stack

Lets ensure none of our C functions use too much stack space and
fix all excessive stack usage before releasing the next version.
Reducing C stack usage should reduce conservative GC scanning
time and improve performance.

If there are platform-dependent test failures; excessive stack
usage should be fixed; rather than increasing minimum values or
removing these envs from testing.

* tool/runruby.rb: use smallest possible machine stack size
  [ruby-core:81597] [Feature #13637]
------------------------------------------------------------------------
r59046 | nobu | 2017-06-08 16:41:38 +0900 (Thu, 08 Jun 2017) | 6 lines

signal.c: relax installation failure

* signal.c (install_sighandler): ignore failure at unreserved
  signals.  e.g., SIGUSR2 fails under valgrind.

* signal.c (install_sighandler_fail): refine [BUG] message.
------------------------------------------------------------------------
r59045 | ko1 | 2017-06-08 14:22:49 +0900 (Thu, 08 Jun 2017) | 5 lines

vm_block_handler_verify() should not return any value.

* vm_core.h (vm_block_handler_verify): this function only checks
  the given block handler with VM_ASSERT(). No need to return any value.

------------------------------------------------------------------------
r59044 | svn | 2017-06-08 13:13:52 +0900 (Thu, 08 Jun 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r59043 | ko1 | 2017-06-08 13:13:51 +0900 (Thu, 08 Jun 2017) | 18 lines

check break target correctly.

* compile.c (iseq_compile_each0): save target child_iseq in the catch-table
  for break. This iseq is not for continuation, but for search key at
  vm_throw_start().

* vm_insnhelper.c (vm_throw_start): check saved iseq first.

* iseq.h: add comment for it.

* test/ruby/test_iterator.rb (test_ljump): add a test for the issue:
    def call b; b.call; end
    call(Proc.new{break}){} #=> (1) should raise LocalJumpError
    call(Proc.new{break})   #=> (2) shoudd raies LocalJumpError, too.
  but (1) doesn't raise LocalJumpError.

  This issue is reported by Matz.

------------------------------------------------------------------------
r59042 | ko1 | 2017-06-08 13:06:07 +0900 (Thu, 08 Jun 2017) | 5 lines

use NULL instead of 0.

* compile.c: use NULL instead of 0 for ADD_CATCH_ENTRY()
  to specify don't pass iseq.

------------------------------------------------------------------------
r59041 | nobu | 2017-06-08 11:07:42 +0900 (Thu, 08 Jun 2017) | 4 lines

ruby.c: script name in UTF-8

* ruby.c (process_options): keep script name in UTF-8 if UTF8_PATH
  to get rid of loss by conversion.
------------------------------------------------------------------------
r59040 | nobu | 2017-06-08 10:58:44 +0900 (Thu, 08 Jun 2017) | 6 lines

file.c: realpath in OS path encoding

* dir.c (rb_dir_getwd_ospath): return cwd path in the OS path
  encoding.

* file.c (rb_realpath_internal): work in the OS path encoding
------------------------------------------------------------------------
r59039 | nobu | 2017-06-08 10:58:42 +0900 (Thu, 08 Jun 2017) | 1 line

appveyor.yml: show encodings [ci skip]
------------------------------------------------------------------------
r59038 | nobu | 2017-06-08 10:19:44 +0900 (Thu, 08 Jun 2017) | 1 line

appveyor.yml: enable exam on AppVeyor
------------------------------------------------------------------------
r59037 | svn | 2017-06-08 07:25:24 +0900 (Thu, 08 Jun 2017) | 1 line

* 2017-06-08
------------------------------------------------------------------------
r59036 | odaira | 2017-06-08 07:25:23 +0900 (Thu, 08 Jun 2017) | 2 lines

* tool/make-snapshot: prefer to use a make command
  set in the MAKE or make env variable.
------------------------------------------------------------------------
r59035 | nobu | 2017-06-07 23:36:18 +0900 (Wed, 07 Jun 2017) | 4 lines

load.c: get rid of side effects

* load.c (rb_f_load, rb_require_internal): DTrace hooks should not
  have side effects, i.e., conversion to String.
------------------------------------------------------------------------
r59034 | svn | 2017-06-07 22:01:28 +0900 (Wed, 07 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59033 | kou | 2017-06-07 22:01:28 +0900 (Wed, 07 Jun 2017) | 6 lines

rexml: add close tag check on end of document to StreamParser

[ruby-core:81593] [Bug #13636]

Reported by Anton Sivakov. Thanks!!!

------------------------------------------------------------------------
r59032 | normal | 2017-06-07 09:32:07 +0900 (Wed, 07 Jun 2017) | 7 lines

common.mk: update dependencies after r58978

Using "tool/update-deps --fix"

* common.mk (file.$(OBJEXT)): depend on id.h
  (rational.$(OBJEXT)): ditto
  (string.$(OBJEXT)): sort alphabetically
------------------------------------------------------------------------
r59031 | svn | 2017-06-07 09:32:03 +0900 (Wed, 07 Jun 2017) | 1 line

* properties.
------------------------------------------------------------------------
r59030 | normal | 2017-06-07 09:32:02 +0900 (Wed, 07 Jun 2017) | 10 lines

thread.c: avoid busy looping on rb_thread_fd_close

We no longer use it this function, but extensions do, and
we need to ensure it continues to work for them.

* thread.c (rb_thread_fd_close): schedule other threads in loop
* ext/-test-/thread_fd_close/thread_fd_close.c: new file
* ext/-test-/thread_fd_close/depend: ditto
* ext/-test-/thread_fd_close/extconf.rb: ditto
* test/-ext-/thread_fd_close/test_thread_fd_close.rb: new test
------------------------------------------------------------------------
r59029 | svn | 2017-06-07 07:55:36 +0900 (Wed, 07 Jun 2017) | 1 line

* 2017-06-07
------------------------------------------------------------------------
r59028 | normal | 2017-06-07 07:55:35 +0900 (Wed, 07 Jun 2017) | 17 lines

IO#close: do not enqueue redundant interrupts (take #2)

Enqueuing multiple errors for one event causes spurious errors
down the line, as reported by Nikolay Vashchenko in
https://bugs.ruby-lang.org/issues/13632

This should fix bad interactions with test_race_gets_and_close
in test/ruby/test_io.rb since we ensure rb_notify_fd_close
continues returning the busy flag after enqueuing the interrupt.

Backporting changes to 2.4 and earlier releases will be more
challenging...

* thread.c (rb_notify_fd_close): do not enqueue multiple interrupts
  [ruby-core:81581] [Bug #13632]
* test/ruby/test_io.rb (test_single_exception_on_close):
  new test based on script from Nikolay
------------------------------------------------------------------------
r59027 | nobu | 2017-06-06 21:30:17 +0900 (Tue, 06 Jun 2017) | 1 line

debug.c: fix breaking condtions
------------------------------------------------------------------------
r59026 | duerst | 2017-06-06 19:34:10 +0900 (Tue, 06 Jun 2017) | 10 lines

add test_ill_formed_utf_8_replace to test recommended number of \uFFFD

Add test method test_ill_formed_utf_8_replace to test/ruby/test_transcode.rb
to check for the recommended number of \uFFFD replacement characters.
This is the first part, using ill-formed prefixes, with suffixes up to
the length of the original UTF-8 structure (including overlongs and
the full 31-bit space.)

For more details, see Unicode 9.0.0, Section 3.9, Best Practices for Using U+FFFD.

------------------------------------------------------------------------
r59025 | ko1 | 2017-06-06 16:11:28 +0900 (Tue, 06 Jun 2017) | 1 line

re-revert r59020
------------------------------------------------------------------------
r59024 | ko1 | 2017-06-06 16:10:19 +0900 (Tue, 06 Jun 2017) | 1 line

revert r59023 because it contans unrelated developping code
------------------------------------------------------------------------
r59023 | ko1 | 2017-06-06 15:58:54 +0900 (Tue, 06 Jun 2017) | 1 line

revert r59020 because it may fail some tests sometimes on some environment (http://ci.rvm.jp/). This revert is to check the reason of failures.
------------------------------------------------------------------------
r59022 | nobu | 2017-06-06 12:45:02 +0900 (Tue, 06 Jun 2017) | 1 line

debug.c: parse locale and filesystem codepages
------------------------------------------------------------------------
r59021 | svn | 2017-06-06 09:13:48 +0900 (Tue, 06 Jun 2017) | 1 line

* 2017-06-06
------------------------------------------------------------------------
r59020 | normal | 2017-06-06 09:13:47 +0900 (Tue, 06 Jun 2017) | 10 lines

IO#close: do not enqueue redundant interrupts

Enqueuing multiple errors for one event causes spurious errors
down the line, as reported by Nikolay Vashchenko in
https://bugs.ruby-lang.org/issues/13632

* thread.c (rb_notify_fd_close): do not enqueue multiple interrupts
  [ruby-core:81581] [Bug #13632]
* test/ruby/test_io.rb (test_single_exception_on_close):
  new test based on script from Nikolay
------------------------------------------------------------------------
r59019 | nobu | 2017-06-05 16:26:15 +0900 (Mon, 05 Jun 2017) | 4 lines

win32.c: no locale

* win32/win32.c (skipspace, w32_cmdvector): get rid of iswspace(),
  which is locale dependent.
------------------------------------------------------------------------
r59018 | ko1 | 2017-06-05 16:03:27 +0900 (Mon, 05 Jun 2017) | 1 line

revert r59017 it fails ruby/test_lambda.rb
------------------------------------------------------------------------
r59017 | ko1 | 2017-06-05 15:57:20 +0900 (Mon, 05 Jun 2017) | 5 lines

do not inform ``is_lambda".

* vm_eval.c (yield_under): do not inform Proc is lambda or not.
  After that invoke_block_from_c_bh() checks it.

------------------------------------------------------------------------
r59016 | ko1 | 2017-06-05 15:15:28 +0900 (Mon, 05 Jun 2017) | 18 lines

rename functions and clean parameters.

* internal.h (rb_yield_lambda): rename to rb_yield_force_blockarg()
  because this function prohibt lambda arg setup (strict setup).

* vm.c (invoke_iseq_block_from_c): remove splattable argument because
  it is not used.

* vm.c (invoke_block_from_c_splattable): rename to invoke_block_from_c_bh()
  because `splattable` doesn't make sense on current this function.

  Also accept `force_blockarg' parameter instead of `splattable` parameter.
  It is more clear.

* vm.c (invoke_block_from_c_unsplattable): rename to
  invoke_block_from_c_proc() and accept `proc` instead of `block'.
  This function is used only by proc block invocation.

------------------------------------------------------------------------
r59015 | svn | 2017-06-05 14:43:59 +0900 (Mon, 05 Jun 2017) | 1 line

* 2017-06-05
------------------------------------------------------------------------
r59014 | ko1 | 2017-06-05 14:43:58 +0900 (Mon, 05 Jun 2017) | 5 lines

remove arg_setup_lambda.

* vm_args.c (enum arg_setup_type): remove arg_setup_lambda because it is
  same as arg_setup_method.

------------------------------------------------------------------------
r59013 | nobu | 2017-06-04 16:29:52 +0900 (Sun, 04 Jun 2017) | 1 line

load.c: encode to OS path outside PUSH_TAG
------------------------------------------------------------------------
r59012 | nobu | 2017-06-04 15:24:04 +0900 (Sun, 04 Jun 2017) | 6 lines

test_require.rb: fix expected path

* test/ruby/test_require.rb (test_require_with_unc): remove extra
  slash.  the result of File.expand_path has a slash just follows
  the drive letter.
  https://github.com/ruby/ruby/commit/4ef849bd9014746821402e21053a53ea61b3690d#commitcomment-22391133
------------------------------------------------------------------------
r59011 | stomar | 2017-06-04 05:17:00 +0900 (Sun, 04 Jun 2017) | 5 lines

array.c: docs for Array#{sort,sort!}

* array.c: [DOC] make example in the docs for Array#{sort,sort!}
  match the call-seq and description by using the same block vars.
  Based on a patch by Roque Pinel (repinel).  [Fix GH-1628]
------------------------------------------------------------------------
r59010 | svn | 2017-06-04 02:11:44 +0900 (Sun, 04 Jun 2017) | 1 line

* 2017-06-04
------------------------------------------------------------------------
r59009 | nobu | 2017-06-04 02:11:43 +0900 (Sun, 04 Jun 2017) | 5 lines

test_require.rb: ignore EPERM at UNC

* test/ruby/test_require.rb (test_require_with_unc): ignore EPERM.
  GetFileAttributes and CreateFile with backup semantics fail at a
  symlink in a shared folder to another shared folder.
------------------------------------------------------------------------
r59008 | nobu | 2017-06-03 23:40:05 +0900 (Sat, 03 Jun 2017) | 4 lines

file.c: preserve encoding

* file.c (path_check_0): preserve encoding of path name in warning
  message.
------------------------------------------------------------------------
r59007 | nobu | 2017-06-03 21:47:11 +0900 (Sat, 03 Jun 2017) | 4 lines

ruby.c: dladdr_path is not used on cygwin

* ruby.c (dladdr_path): dladdr is provided on recent cygwin, but
  GetModuleFileNameW is used instead of it.
------------------------------------------------------------------------
r59006 | ko1 | 2017-06-03 19:07:44 +0900 (Sat, 03 Jun 2017) | 7 lines


* vm_core.h: remove VM_FRAME_MAGIC_LAMBDA and introduce
  VM_FRAME_FLAG_LAMBDA. So that lambda block frame is
  VM_FRAME_MAGIC_BLOCK | VM_FRAME_FLAG_LAMBDA.

* vm_core.h: remvoe VM_FRAME_MAGIC_PROC because nobody uses it.

------------------------------------------------------------------------
r59005 | nobu | 2017-06-03 18:35:43 +0900 (Sat, 03 Jun 2017) | 1 line

test/ruby/test_require.rb: remove duplicate assertion
------------------------------------------------------------------------
r59004 | nobu | 2017-06-03 18:18:44 +0900 (Sat, 03 Jun 2017) | 5 lines

test_require.rb: untouch default internal encoding

* test/ruby/test_require.rb (assert_require_insecure_path): get
  rid of setting Encoding.default_internal, which affects load
  path conversion.
------------------------------------------------------------------------
r59003 | normal | 2017-06-03 10:04:30 +0900 (Sat, 03 Jun 2017) | 11 lines

test: attempt to reduce failures in assert_cpu_usage_low

Try to make this test less fragile by taking into account
the worst case kernel timing resolution.
[ruby-core:81540]

* test/lib/test/unit/assertions.rb (assert_cpu_usage_low):
  clamp measurement to minimum measurable time and warn
  about tests being too short to measure
* test/ruby/test_io.rb (test_copy_stream_no_busy_wait):
  remove pct kwarg and rely on assert_cpu_usage_low defaults
------------------------------------------------------------------------
r59002 | stomar | 2017-06-03 06:29:27 +0900 (Sat, 03 Jun 2017) | 5 lines

string.c: docs for String#split

* string.c: [DOC] clarify docs for String#split when called
  with limit and capture groups.
  Reported by Cichol Tsai.  [ruby-core:81505] [Bug #13621]
------------------------------------------------------------------------
r59001 | svn | 2017-06-03 00:38:29 +0900 (Sat, 03 Jun 2017) | 1 line

* 2017-06-03
------------------------------------------------------------------------
r59000 | nobu | 2017-06-03 00:38:28 +0900 (Sat, 03 Jun 2017) | 1 line

common.mk: show locale
------------------------------------------------------------------------
r58999 | nobu | 2017-06-02 23:52:49 +0900 (Fri, 02 Jun 2017) | 4 lines

test_require.rb: assert_require_insecure_path

* test/ruby/test_require.rb (assert_require_insecure_path): more
  tests for loading insecure path.
------------------------------------------------------------------------
r58998 | nobu | 2017-06-02 13:32:47 +0900 (Fri, 02 Jun 2017) | 4 lines

test_require.rb: fallback encoding

* test/ruby/test_require.rb (assert_require_nonascii_path):
  fallback when LANG=C.
------------------------------------------------------------------------
r58997 | nobu | 2017-06-02 13:10:36 +0900 (Fri, 02 Jun 2017) | 4 lines

test_require.rb: filesystem encoding

* test/ruby/test_require.rb (assert_require_nonascii_path): the
  path in error message is converted to filesystem encoding.
------------------------------------------------------------------------
r58996 | nobu | 2017-06-02 12:54:19 +0900 (Fri, 02 Jun 2017) | 4 lines

file.c: preserve encoding

* file.c (rb_find_file_safe): preserve encoding of path in
  SecurityError messages.
------------------------------------------------------------------------
r58995 | eregon | 2017-06-02 02:26:12 +0900 (Fri, 02 Jun 2017) | 1 line

Fix DRb.start_service to use any available port
------------------------------------------------------------------------
r58994 | eregon | 2017-06-02 02:26:00 +0900 (Fri, 02 Jun 2017) | 4 lines

Remove bad spec which cannot behave nicely in a multi-process environment

* A system port might be taken by another process at any time.
* There are no useful expectations in this spec.
------------------------------------------------------------------------
r58993 | eregon | 2017-06-02 02:25:48 +0900 (Fri, 02 Jun 2017) | 1 line

Remove empty files in drb specs
------------------------------------------------------------------------
r58992 | eregon | 2017-06-02 02:08:59 +0900 (Fri, 02 Jun 2017) | 3 lines

Create the file in the File::TMPFILE spec in its own directory

* Avoids failing the spec if rubyspec_temp is not empty.
------------------------------------------------------------------------
r58991 | eregon | 2017-06-02 02:08:47 +0900 (Fri, 02 Jun 2017) | 4 lines

Open files in binary modes for copying in MSpec's #cp

* See https://bugs.ruby-lang.org/issues/13570.
* Found by MSP-Greg (Greg L).
------------------------------------------------------------------------
r58990 | ko1 | 2017-06-02 00:18:51 +0900 (Fri, 02 Jun 2017) | 5 lines

make Dir object WB protected.

* dir.c (dir_data_type): set RUBY_TYPED_WB_PROTECTED.
  Insert WBs for dir_data::path.

------------------------------------------------------------------------
r58989 | svn | 2017-06-02 00:12:15 +0900 (Fri, 02 Jun 2017) | 1 line

* 2017-06-02
------------------------------------------------------------------------
r58988 | ko1 | 2017-06-02 00:12:14 +0900 (Fri, 02 Jun 2017) | 5 lines

make Binding object WB protected.

* proc.c (ruby_binding_data_type): set RUBY_TYPED_WB_PROTECTED.
  Insert write barriers (WBs) to all of writes.

------------------------------------------------------------------------
r58987 | nobu | 2017-06-01 22:05:54 +0900 (Thu, 01 Jun 2017) | 4 lines

load.c: convert by rb_get_path_check

* load.c (rb_require_internal): convert to path name with the
  given safe level, without setting global safe level.
------------------------------------------------------------------------
r58986 | nobu | 2017-06-01 21:58:02 +0900 (Thu, 01 Jun 2017) | 1 line

file.c: rb_check_funcall_default for fallback value
------------------------------------------------------------------------
r58985 | nobu | 2017-06-01 17:02:41 +0900 (Thu, 01 Jun 2017) | 7 lines

vm_eval.c: fix rb_check_funcall_default

* vm_eval.c (check_funcall_missing): revert r58984.  should call
  method_missing if respond_to_missing is not redefined.

* vm_eval.c (rb_check_funcall_default): return the default value
  if respond_to_missing and method_missing are not defined.
------------------------------------------------------------------------
r58984 | nobu | 2017-06-01 16:46:22 +0900 (Thu, 01 Jun 2017) | 4 lines

vm_eval.c: fix for rb_check_funcall_default

* vm_eval.c (check_funcall_missing): basic_obj_respond_to_missing
  returns Qundef if respond_to_missing is not redefined.
------------------------------------------------------------------------
r58983 | ko1 | 2017-06-01 13:48:05 +0900 (Thu, 01 Jun 2017) | 1 line

fix failure on r58981
------------------------------------------------------------------------
r58982 | nobu | 2017-06-01 13:43:03 +0900 (Thu, 01 Jun 2017) | 4 lines

debug.c: more enums

* debug.c (ruby_dummy_gdb_enums): add enums for RObject, RModule,
  RString, RArray.
------------------------------------------------------------------------
r58981 | duerst | 2017-06-01 13:38:03 +0900 (Thu, 01 Jun 2017) | 5 lines

improve English for a warning message

On DOSish systems, there is a warning message for \r\n line endings on shebang line.
Improve this message from "shebang line ends with \r may cause a problem"
to "shebang line ending with \r may cause problems".
------------------------------------------------------------------------
r58980 | svn | 2017-06-01 09:05:35 +0900 (Thu, 01 Jun 2017) | 1 line

* 2017-06-01
------------------------------------------------------------------------
r58979 | ko1 | 2017-06-01 09:05:33 +0900 (Thu, 01 Jun 2017) | 27 lines

rename absolute_path to realpath internally and introduce pathobj.

* vm_core.h: rename absolute_path to realpath because it is expected name.
  external APIs (#absolute_path methods) are remained.

* vm_core.h: remove rb_iseq_location_struct::path and
  rb_iseq_location_struct::absolute_path and introduce pathobj.
  if given path equals to given absolute_path (and most of case
  it is true), pathobj is simply given path String. If it is not same,
  pathobj is Array and pathobj[0] is path and pathobj[1] is realpath.

  This size optimization reduce 8 bytes and
  sizeof(struct rb_iseq_constant_body) is 200 bytes -> 192 bytes
  on 64bit CPU.

  To support this change, the following functions are introduced:
    * pathobj_path() (defined in vm_core.h)
    * pathobj_realpath() (ditto)
    * rb_iseq_path() (decl. in vm_core.h)
    * rb_iseq_realpath() (ditto)
    * rb_iseq_pathobj_new() (ditto)
    * rb_iseq_pathobj_set() (ditto)

* vm_core.h (rb_binding_t): use pathobj instead of path. If binding
  is given at eval methods, realpath (absolute_path) was caller's
  realpath. However, they should use binding's realpath.

------------------------------------------------------------------------
r58978 | watson1978 | 2017-05-31 21:30:57 +0900 (Wed, 31 May 2017) | 50 lines

Improve performance of implicit type conversion

To convert the object implicitly, it has had two parts in convert_type() which are
  1. lookink up the method's id
  2. calling the method

Seems that strncmp() and strcmp() in convert_type() are slightly heavy to look up
the method's id for type conversion.

This patch will add and use internal APIs (rb_convert_type_with_id, rb_check_convert_type_with_id)
to call the method without looking up the method's id when convert the object.

Array#flatten -> 19 % up
Array#+       ->  3 % up

[ruby-dev:50024] [Bug #13341] [Fix GH-1537]

### Before
       Array#flatten    104.119k ({U+00B1} 1.1%) i/s -    525.690k in   5.049517s
             Array#+      1.993M ({U+00B1} 1.8%) i/s -     10.010M in   5.024258s

### After
       Array#flatten    124.005k ({U+00B1} 1.0%) i/s -    624.240k in   5.034477s
             Array#+      2.058M ({U+00B1} 4.8%) i/s -     10.302M in   5.019328s

### Test Code
require 'benchmark/ips'

class Foo
  def to_ary
    [1,2,3]
  end
end

Benchmark.ips do |x|

  ary = []
  100.times { |i| ary << i }
  array = [ary]

  x.report "Array#flatten" do |i|
    i.times { array.flatten }
  end

  x.report "Array#+" do |i|
    obj = Foo.new
    i.times { array + obj }
  end

end
------------------------------------------------------------------------
r58977 | ko1 | 2017-05-31 15:46:57 +0900 (Wed, 31 May 2017) | 9 lines

add debug counters for local variable (lavr) access.

* debug_counter.h: add the following counters:
  * lvar_get: counter for lvar get.
  * lvar_get_dynamic: counter for lvar get from upper frames.
  * lvar_set: coutner for lvar set.
  * lvar_set_dynamic: coutner for lvar set from upper frames.
  * lvar_set_slowpath: counter for lavr set using slowpath.

------------------------------------------------------------------------
r58976 | nobu | 2017-05-31 15:40:49 +0900 (Wed, 31 May 2017) | 4 lines

Makefile.sub: set ENABLE_SHARED [ci skip]

* win32/Makefile.sub (LIBRUBY_LDSHARED): mswin build always
  enables shared.
------------------------------------------------------------------------
r58975 | nobu | 2017-05-31 15:03:13 +0900 (Wed, 31 May 2017) | 3 lines

common.mk: lldb [ci skip]

* common.mk (lldb, lldb-ruby): add targets to debug with lldb.
------------------------------------------------------------------------
r58974 | nobu | 2017-05-31 11:42:10 +0900 (Wed, 31 May 2017) | 4 lines

lldb_cruby.py: eval outside frames

* misc/lldb_cruby.py (lldb_rp): evaluate without frames when no
  process is running, and show error messages.
------------------------------------------------------------------------
r58973 | svn | 2017-05-31 03:17:56 +0900 (Wed, 31 May 2017) | 1 line

* 2017-05-31
------------------------------------------------------------------------
r58972 | stomar | 2017-05-31 03:17:55 +0900 (Wed, 31 May 2017) | 8 lines

object.c: improve docs

* object.c: [DOC] add an example for Object#yield_self that
  better illustrates its purpose; other small improvements.
  Reported by Vitaly Tatarintsev (ck3g).  Patch by Marcus Stollsteimer.
  [Fix GH-1637]

* object.c: [DOC] improve docs for Object#{itself,tap}.
------------------------------------------------------------------------
r58971 | nobu | 2017-05-30 22:12:22 +0900 (Tue, 30 May 2017) | 7 lines

enum.c: check if reentered

* enum.c (cmpint_reenter_check): extract from nmin_cmp and
  nmin_block_cmp.

* enum.c (nmin_cmp): check if reentered before rb_cmpint.
  [Feature #13437]
------------------------------------------------------------------------
r58970 | nobu | 2017-05-30 21:47:58 +0900 (Tue, 30 May 2017) | 1 line

enum.c: rb_check_funcall_default for fallback value
------------------------------------------------------------------------
r58969 | nobu | 2017-05-30 20:59:26 +0900 (Tue, 30 May 2017) | 1 line

test_rubyoptions.rb: ruby-runner sets $0 to install name now
------------------------------------------------------------------------
r58968 | watson1978 | 2017-05-30 18:00:56 +0900 (Tue, 30 May 2017) | 68 lines

Improve performance of Enumerable#{sort_by,min_by,max_by,minmax_by}

This is totally same approach with r58964.

enum.c (sort_by_cmp): use OPTIMIZED_CMP() to compare the objects instead of
    `<=>' method dispatching for Fixnum/Float/String object.

enum.c (nmin_cmp): ditto.
enum.c (min_by_i): ditto.
enum.c (max_by_i): ditto.
enum.c (minmax_by_i_update): ditto.
enum.c (minmax_by_i): ditto.

    Enumerable#sort_by   -> 51 % up
    Enumerable#min_by(n) -> 34 % up
    Enumerable#min_by    -> 37 % up
    Enumerable#max_by(n) -> 61 % up
    Enumerable#max_by    -> 40 % up
    Enumerable#minmax_by -> 67 % up

    [ruby-core:80689] [Bug #13437] [Fix GH-1584]

### Before
  Enumerable#sort_by      5.692k ({U+00B1} 2.2%) i/s -     28.611k in   5.028861s
Enumerable#min_by(n)      8.496k ({U+00B1} 0.5%) i/s -     43.146k in   5.078394s
   Enumerable#min_by      8.678k ({U+00B1} 0.5%) i/s -     43.911k in   5.060128s
Enumerable#max_by(n)      3.306k ({U+00B1} 3.0%) i/s -     16.562k in   5.014727s
   Enumerable#max_by      8.322k ({U+00B1} 2.8%) i/s -     42.400k in   5.099400s
Enumerable#minmax_by      6.769k ({U+00B1} 2.6%) i/s -     34.100k in   5.041354s

### After
  Enumerable#sort_by      8.591k ({U+00B1} 3.0%) i/s -     43.316k in   5.046836s
Enumerable#min_by(n)     11.489k ({U+00B1} 1.2%) i/s -     57.732k in   5.025504s
   Enumerable#min_by     11.835k ({U+00B1} 2.7%) i/s -     60.150k in   5.086450s
Enumerable#max_by(n)      5.322k ({U+00B1} 1.1%) i/s -     26.650k in   5.008289s
   Enumerable#max_by     11.705k ({U+00B1} 0.6%) i/s -     59.262k in   5.062997s
Enumerable#minmax_by     11.323k ({U+00B1} 1.3%) i/s -     57.018k in   5.036565s

### Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  enum = (1..1000).to_a.to_enum

  x.report "Enumerable#sort_by" do
    enum.sort_by { |a| a }
  end

  x.report "Enumerable#min_by(n)" do
    enum.min_by(2) { |a| a }
  end

  x.report "Enumerable#min_by" do
    enum.min_by { |a| a }
  end

  x.report "Enumerable#max_by(n)" do
    enum.max_by(2) { |a| a }
  end

  x.report "Enumerable#max_by" do
    enum.max_by { |a| a }
  end

  x.report "Enumerable#minmax_by" do
    enum.minmax_by { |a| a }
  end
end
------------------------------------------------------------------------
r58967 | ko1 | 2017-05-30 16:05:58 +0900 (Tue, 30 May 2017) | 4 lines

add parameter names.

* vm_core.h: add parameter names for rb_iseq_new*.

------------------------------------------------------------------------
r58966 | naruse | 2017-05-30 15:50:35 +0900 (Tue, 30 May 2017) | 3 lines

Solaris 10 x86 raseis SEGV

http://rubyci.s3.amazonaws.com/unstable10x/ruby-trunk/log/20170527T221806Z.diff.html.gz
------------------------------------------------------------------------
r58965 | duerst | 2017-05-30 14:43:41 +0900 (Tue, 30 May 2017) | 5 lines

Change max byte length of UTF-8 to 4 bytes

In enc/utf_8.c, change maximum byte length of UTF-8 to 4 bytes (from 6)
to conform to definition of UTF-8. This closes issue #13590.
(This is a retry of r58954, after issue #13590 has been addressed.)
------------------------------------------------------------------------
r58964 | watson1978 | 2017-05-30 11:57:33 +0900 (Tue, 30 May 2017) | 32 lines

Improve performance of Range#{min,max}

range.c (range_min): use OPTIMIZED_CMP() to compare the objects instead of
    `<=>' method dispatching for Fixnum/Float/String object inside Range object.

range.c (range_max): ditto.

    Range#min -> 34 % up
    Range#max -> 44 % up

    [ruby-core:80713] [Bug #13443] [Fix GH-1585]

### Before
           Range#min      8.428M ({U+00B1} 1.3%) i/s -     42.141M in   5.000952s
           Range#max      8.157M ({U+00B1} 1.3%) i/s -     40.852M in   5.009297s

### After
           Range#min     11.269M ({U+00B1} 1.2%) i/s -     56.388M in   5.004611s
           Range#max     11.764M ({U+00B1} 1.3%) i/s -     58.856M in   5.003820s

### Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Range#min" do |i|
    i.times { (1..100).min }
  end

  x.report "Range#max" do |i|
    i.times { (1..100).max }
  end
end
------------------------------------------------------------------------
r58963 | svn | 2017-05-30 02:56:47 +0900 (Tue, 30 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58962 | eregon | 2017-05-30 02:56:46 +0900 (Tue, 30 May 2017) | 1 line

Clean up a bit the Process.setpriority specs
------------------------------------------------------------------------
r58961 | eregon | 2017-05-30 02:56:34 +0900 (Tue, 30 May 2017) | 1 line

Enable Process.setpriority for a single process on more platforms.
------------------------------------------------------------------------
r58960 | svn | 2017-05-30 00:34:46 +0900 (Tue, 30 May 2017) | 1 line

* 2017-05-30
------------------------------------------------------------------------
r58959 | nobu | 2017-05-30 00:34:45 +0900 (Tue, 30 May 2017) | 1 line

Run in separate process/pgrp [Bug #13609]
------------------------------------------------------------------------
r58958 | eregon | 2017-05-29 20:19:42 +0900 (Mon, 29 May 2017) | 1 line

Simplify, avoid extra exceptions and add test for concurrent mspec mkdir_p
------------------------------------------------------------------------
r58957 | k0kubun | 2017-05-29 19:53:54 +0900 (Mon, 29 May 2017) | 8 lines

rubyspec: Fix method redefinition warning

ruby/spec/rubyspec/library/erb/run_spec.rb:63: warning: method redefined; discarding old main
ruby/spec/rubyspec/library/erb/result_spec.rb:53: warning: previous definition of main was here
ruby/spec/rubyspec/library/erb/run_spec.rb:76: warning: method redefined; discarding old main1
ruby/spec/rubyspec/library/erb/result_spec.rb:67: warning: previous definition of main1 was here
ruby/spec/rubyspec/library/erb/run_spec.rb:81: warning: method redefined; discarding old main2
ruby/spec/rubyspec/library/erb/result_spec.rb:72: warning: previous definition of main2 was here
------------------------------------------------------------------------
r58956 | k0kubun | 2017-05-29 19:22:47 +0900 (Mon, 29 May 2017) | 3 lines

test/erb/test_erb.rb: Fix unused variable warning

ruby/test/erb/test_erb.rb:575: warning: assigned but unused variable - foo
------------------------------------------------------------------------
r58955 | duerst | 2017-05-29 17:59:41 +0900 (Mon, 29 May 2017) | 5 lines

revert r58954 temporarily

Revert change to maximum of 4 bytes for UTF-8 characters at r58954 temporarily.
This failed spec at https://travis-ci.org/ruby/ruby/builds/237086017, but it
is totally unclear why.
------------------------------------------------------------------------
r58954 | duerst | 2017-05-29 17:41:23 +0900 (Mon, 29 May 2017) | 4 lines

Change max byte length of UTF-8 to 4 bytes

In enc/utf_8.c, change maximum byte length of UTF-8 to 4 bytes (from 6)
to conform to definition of UTF-8. This closes issue #13590.
------------------------------------------------------------------------
r58953 | nobu | 2017-05-29 16:03:11 +0900 (Mon, 29 May 2017) | 4 lines

fix up r58952

* spec/mspec/lib/mspec/helpers/fs.rb (Object#mkdir_p): rescue
  File.stat when the target does not exist.
------------------------------------------------------------------------
r58952 | nobu | 2017-05-29 15:53:05 +0900 (Mon, 29 May 2017) | 4 lines

fix race condition

* spec/mspec/lib/mspec/helpers/fs.rb (Object#mkdir_p): fix race
  condition when multi_exec.
------------------------------------------------------------------------
r58951 | nobu | 2017-05-29 15:39:42 +0900 (Mon, 29 May 2017) | 1 line

tool/runruby.rb: exec ruby-runner
------------------------------------------------------------------------
r58950 | nobu | 2017-05-29 15:39:41 +0900 (Mon, 29 May 2017) | 1 line

ruby-runner.c: replace argv[0]
------------------------------------------------------------------------
r58949 | nobu | 2017-05-29 14:19:51 +0900 (Mon, 29 May 2017) | 5 lines

default.mspec: remove useless flags

* spec/default.mspec: removed -I options for useless or non-
  existent paths from flags.  there is no library scripts and .ext
  directory in the source directory.
------------------------------------------------------------------------
r58948 | naruse | 2017-05-29 01:41:31 +0900 (Mon, 29 May 2017) | 4 lines

suppress warning: ambiguous first argument; put parentheses or a space even after `-' operator

Introduced at r58905
http://rubyci.s3.amazonaws.com/ubuntu/ruby-trunk/log/20170526T153003Z.diff.html.gz
------------------------------------------------------------------------
r58947 | naruse | 2017-05-29 01:40:12 +0900 (Mon, 29 May 2017) | 3 lines

Revert "Update to ruby/spec@2a047c8"

This reverts commit 2531a1013b56a030f99ea4c2ee36e66dbf38a855.
------------------------------------------------------------------------
r58946 | svn | 2017-05-29 01:29:05 +0900 (Mon, 29 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58945 | svn | 2017-05-29 01:29:05 +0900 (Mon, 29 May 2017) | 1 line

* 2017-05-29
------------------------------------------------------------------------
r58944 | naruse | 2017-05-29 01:29:04 +0900 (Mon, 29 May 2017) | 8 lines

Revert r58939 and r58942

This reverts following commits because it breaks mswinci
* Update to ruby/spec@2a047c8
* Update to ruby/spec@ca32ae2

see also the result:
http://rubyci.org/logs/mswinci.japaneast.cloudapp.azure.com/vc12-x64/ruby-trunk/log/20170528T140014Z.fail.html.gz
------------------------------------------------------------------------
r58943 | nobu | 2017-05-28 23:17:25 +0900 (Sun, 28 May 2017) | 4 lines

lldb_cruby.py: constants from the target

* misc/lldb_cruby.py (lldb_init): get constants from
  ruby_dummy_gdb_enums in the target.
------------------------------------------------------------------------
r58942 | eregon | 2017-05-28 21:02:08 +0900 (Sun, 28 May 2017) | 1 line

Update to ruby/spec@ca32ae2
------------------------------------------------------------------------
r58941 | svn | 2017-05-28 20:30:57 +0900 (Sun, 28 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58940 | eregon | 2017-05-28 20:30:55 +0900 (Sun, 28 May 2017) | 1 line

Add tool to pull latest mspec/spec when commits have been synchronized
------------------------------------------------------------------------
r58939 | eregon | 2017-05-28 20:30:42 +0900 (Sun, 28 May 2017) | 1 line

Update to ruby/spec@2a047c8
------------------------------------------------------------------------
r58938 | nobu | 2017-05-28 18:49:30 +0900 (Sun, 28 May 2017) | 4 lines

ruby.c: file in load_file argument

* ruby.c (load_file): move opened file to an argument, to reduce
  open/close calls in the near future.
------------------------------------------------------------------------
r58937 | nobu | 2017-05-28 18:49:29 +0900 (Sun, 28 May 2017) | 5 lines

ruby.c: shrink ruby_cmdline_options_t

* ruby.c (ruby_cmdline_options_t): reordered members and turned
  simple flags into bit fields to reduce the size (136->104 on
  LP64).
------------------------------------------------------------------------
r58936 | normal | 2017-05-28 14:39:29 +0900 (Sun, 28 May 2017) | 14 lines

test/ruby/test_io.rb: adjust CPU usage check to 10%

I miscalculated for r58934, since we sleep 100ms, and
the worst possible case is 100 Hz in the kernel meaning
we only have 10ms resolution.  So, we need to increase
our CPU percentage to >= 10% for this.

This should be more than enough for our CI machines which
have 300 Hz kernels [ruby-core:81429]:

 http://ci.rvm.jp/results/trunk-test@sasada-8core/1495942555

* test/ruby/test_io.rb (test_copy_stream_no_busy_wait):
  override default percentage
------------------------------------------------------------------------
r58935 | k0kubun | 2017-05-28 10:48:11 +0900 (Sun, 28 May 2017) | 44 lines

process.c: Use getrusage(2) in Process.times

if getrusage(2) is available, to improve precision of Process.times and
its user like lib/benchmark.rb.

On macOS, since getrusage(2) has better precision than times(3),
they are much improved like:

* Before

Process.times
=> #<struct Process::Tms utime=0.56, stime=0.35, cutime=0.04, cstime=0.03>

puts Benchmark.measure { "a" * 1_000_000_000 }
  0.340000   0.310000   0.650000 (  0.674025)

* After

Process.times
=> #<struct Process::Tms utime=0.561899, stime=0.35076, cutime=0.046483, cstime=0.038929>

puts Benchmark.measure { "a" * 1_000_000_000 }
  0.343223   0.310037   0.653260 (  0.674025)

On Linux, since struct rusage from getrusage(2) is used instead of struct tms
from times(2), they are slightly improved like:

* Before

Process.times
=> #<struct Process::Tms utime=0.43, stime=0.11, cutime=0.0, cstime=0.0>

puts Benchmark.measure { "a" * 1_000_000_000 }
  0.120000   0.040000   0.170000 (  0.171621)

* After

Process.times
=> #<struct Process::Tms utime=0.432, stime=0.116, cutime=0.0, cstime=0.0>

puts Benchmark.measure { "a" * 1_000_000_000 }
  0.124000   0.048000   0.172000 (  0.171621)

[ruby-dev:49471] [Feature #11952]
------------------------------------------------------------------------
r58934 | normal | 2017-05-28 10:43:38 +0900 (Sun, 28 May 2017) | 11 lines

tests: increase CPU percentage threshold for assert_cpu_usage_low

When sleeping for the tick rate of 100ms (defined in
thread_pthread.c) as we do in test/ruby/test_io.rb
(test_copy_stream_no_busy_wait), it may not be possible to
measure with <= 10ms resolution on 100HZ systems (CONFIG_HZ in
the Linux kernel).  So increase the threshold to 15ms (10ms +
5ms slack for slow systems).

* test/lib/test/unit/assertions.rb (assert_cpu_usage_low):
  increase pct default value [ruby-core:81427]
------------------------------------------------------------------------
r58933 | svn | 2017-05-28 06:55:03 +0900 (Sun, 28 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58932 | svn | 2017-05-28 06:55:03 +0900 (Sun, 28 May 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r58931 | eregon | 2017-05-28 06:55:02 +0900 (Sun, 28 May 2017) | 1 line

Update to ruby/spec@2795010
------------------------------------------------------------------------
r58930 | eregon | 2017-05-28 06:54:38 +0900 (Sun, 28 May 2017) | 1 line

Update to ruby/mspec@6c95759
------------------------------------------------------------------------
r58929 | svn | 2017-05-28 02:04:32 +0900 (Sun, 28 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58928 | svn | 2017-05-28 02:04:32 +0900 (Sun, 28 May 2017) | 1 line

* 2017-05-28
------------------------------------------------------------------------
r58927 | naruse | 2017-05-28 02:04:31 +0900 (Sun, 28 May 2017) | 1 line

Initial commit of LLDB port of debug utility
------------------------------------------------------------------------
r58926 | k0kubun | 2017-05-27 22:54:09 +0900 (Sat, 27 May 2017) | 3 lines

bootstraptest/test_insns.rb: Fix typo

on test message. "torexp" insn does not exist.
------------------------------------------------------------------------
r58925 | normal | 2017-05-27 17:26:47 +0900 (Sat, 27 May 2017) | 13 lines

rb_wait_for_single_fd: do not OOM or segfault with invalid FD on select()

Instead, match the poll() implementation used on Linux for now;
as the Linux poll(2) manpage describes using negative FD to
easily ignore an FD in a larger FD set while (sleeping the given
timeout).  I'm not entirely sure if matching poll() behavior
is a good idea for a single FD, but it's better than segfaulting
or NoMemoryError.

* thread.c (init_set_fd): ignore negative FD
* test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb
  (test_wait_for_invalid_fd): check values which may trigger
  segfaults or OOM
------------------------------------------------------------------------
r58924 | normal | 2017-05-27 16:23:02 +0900 (Sat, 27 May 2017) | 8 lines

test for IO.copy_stream CPU usage (r58534)

I'm likely to make similar mistakes in the future when working
on Fiber auto-scheduling.  Start adding assertions for existing
code, first.

* test/ruby/test_io.rb (test_copy_stream_no_busy_wait): added
* test/lib/test/unit/assertions.rb (assert_cpu_usage_low): added
------------------------------------------------------------------------
r58923 | normal | 2017-05-27 16:18:52 +0900 (Sat, 27 May 2017) | 4 lines

Revert "common: "test-all" depends on "exts" target"

This reverts r58919.
Apparently skipping exts is intentional since r58759
------------------------------------------------------------------------
r58922 | watson1978 | 2017-05-27 14:41:02 +0900 (Sat, 27 May 2017) | 67 lines

Improve performance of some Time & Rational methods

rational.c (i_gcd): replace GCD algorithm from Euclidean algorithm to Stein
    algorithm (https://en.wikipedia.org/wiki/Binary_GCD_algorithm).

    Some Time methods will call internal quov() function and it calls
    Rational#quo -> f_muldiv() -> i_gcd() in rational.c
    And some Rational methods also call i_gcd().

    The implementation of Euclidean algorithm spent a long time at modulo
    operation (ie "x = y % x;").
    The Stein algorithm will replace with shift operation which is faster
    than modulo.

    Time#subsec -> 36 % up
    Time#to_r   -> 26 % up
    Rational#+  -> 14 % up
    Rational#-  -> 15 % up
    Rational#*  -> 13 % up

    [ruby-core:80843] [Bug #13503] [Fix GH-1596]

### Before
         Time#subsec      2.142M ({U+00B1} 9.8%) i/s -     10.659M in   5.022659s
           Time#to_r      2.003M ({U+00B1} 9.1%) i/s -      9.959M in   5.012445s
          Rational#+      3.843M ({U+00B1} 0.9%) i/s -     19.274M in   5.016254s
          Rational#-      3.820M ({U+00B1} 1.3%) i/s -     19.149M in   5.014137s
          Rational#*      5.198M ({U+00B1} 1.4%) i/s -     26.016M in   5.005664s
* After
         Time#subsec      2.902M ({U+00B1} 2.9%) i/s -     14.505M in   5.001815s
           Time#to_r      2.503M ({U+00B1} 4.8%) i/s -     12.512M in   5.011454s
          Rational#+      4.390M ({U+00B1} 1.2%) i/s -     22.001M in   5.012413s
          Rational#-      4.391M ({U+00B1} 1.2%) i/s -     22.013M in   5.014584s
          Rational#*      5.872M ({U+00B1} 2.2%) i/s -     29.369M in   5.003666s

* Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Time#subsec" do |t|
    time = Time.now
    t.times { time.subsec }
  end

  x.report "Time#to_r" do |t|
    time = Time.now
    t.times { time.to_r }
  end

  x.report "Rational#+" do |t|
    rat1 = 1/2r
    rat2 = 1/3r
    t.times { rat1 + rat2 }
  end

  x.report "Rational#-" do |t|
    rat1 = 1/3r
    rat2 = 1/2r
    t.times { rat1 - rat2 }
  end

  x.report "Rational#*" do |t|
    rat1 = 1/3r
    rat2 = 1/2r
    t.times { rat1 * rat2 }
  end
end
------------------------------------------------------------------------
r58921 | watson1978 | 2017-05-27 14:41:00 +0900 (Sat, 27 May 2017) | 51 lines

Improve performance of some Time methods

internal.h : add rb_numeric_quo() as internal API.
rational.c : rename numeric_quo() to rb_numeric_quo() as internal API.
time.c (quov): optimize by invoking rb_numeric_quo() to retrieve a value of
    Numeric#quo instead of method dispatching via rb_funcall().

    Time#subsec ->  7 % up
    Time#-      -> 26 % up
    Time#to_f   -> 30 % up
    Time#to_r   ->  7 % up

    [ruby-core:80915] [Bug #13519] [Fix GH-1601]

### Before
         Time#subsec      2.024M ({U+00B1} 8.7%) i/s -     10.062M in   5.009762s
              Time#-      5.049M ({U+00B1} 4.7%) i/s -     25.186M in   5.002379s
           Time#to_f      5.625M ({U+00B1} 4.2%) i/s -     28.066M in   5.000749s
           Time#to_r      1.880M ({U+00B1} 9.7%) i/s -      9.361M in   5.027527s

### After
         Time#subsec      2.155M ({U+00B1} 9.7%) i/s -     10.724M in   5.022579s
              Time#-      6.362M ({U+00B1} 2.0%) i/s -     31.824M in   5.004625s
           Time#to_f      7.287M ({U+00B1} 4.8%) i/s -     36.402M in   5.010983s
           Time#to_r      2.020M ({U+00B1} 9.4%) i/s -     10.059M in   5.021852s

### Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Time#subsec" do |t|
    time = Time.now
    t.times { time.subsec }
  end

  x.report "Time#-" do |t|
    time1 = Time.now
    time2 = Time.now
    t.times { time1 - time2 }
  end

  x.report "Time#to_f" do |t|
    time = Time.now
    t.times { time.to_f }
  end

  x.report "Time#to_r" do |t|
    time = Time.now
    t.times { time.to_r }
  end
end
------------------------------------------------------------------------
r58920 | nobu | 2017-05-27 14:18:52 +0900 (Sat, 27 May 2017) | 1 line

.travis.yml: exts is not needed for tests here
------------------------------------------------------------------------
r58919 | normal | 2017-05-27 13:35:41 +0900 (Sat, 27 May 2017) | 8 lines

common: "test-all" depends on "exts" target

This allows me to test changes to ext/ more easily by only typing:

  make test-all TESTS=/path/to/ext/test_foo.rb

I spent a few minutes wondering what was wrong before I realized
changes to exts were not taking effect.
------------------------------------------------------------------------
r58918 | nobu | 2017-05-27 12:43:02 +0900 (Sat, 27 May 2017) | 6 lines

mspec/commands/mspec.rb: formatter for multi_exec

* spec/mspec/lib/mspec/commands/mspec.rb (MSpecMain#multi_exec):
  as multi_exec children must run with yaml formatter, append the
  option for it after other options to override another formatter
  option with a warning if it is given.
------------------------------------------------------------------------
r58917 | nobu | 2017-05-27 12:14:04 +0900 (Sat, 27 May 2017) | 1 line

.travis.yml: get number of processors at runtime
------------------------------------------------------------------------
r58916 | k0kubun | 2017-05-27 12:06:55 +0900 (Sat, 27 May 2017) | 12 lines

erb.rb: Use str_uplus instead of rb_str_dup

to skip unnecessary string allocation on frozen_string_literal: false.
str_uplus can bypass calling rb_str_dup when OBJ_FROZEN is true.

* Before

erb_render      1.064

* Afete

erb_render      0.909
------------------------------------------------------------------------
r58915 | k0kubun | 2017-05-27 11:47:11 +0900 (Sat, 27 May 2017) | 6 lines

benchmark: Rename to bm_erb_render.rb

from bm_app_erb_render.rb.

I'm told from ko1 that bm_app_* is namespace for Ruby applications,
not for ERB and we should use bm_erb_* for ERB benchmark instead.
------------------------------------------------------------------------
r58914 | ko1 | 2017-05-27 11:01:41 +0900 (Sat, 27 May 2017) | 1 line

apply timeout scale
------------------------------------------------------------------------
r58913 | nobu | 2017-05-27 10:26:31 +0900 (Sat, 27 May 2017) | 4 lines

numeric.c: fix for small number

* numeric.c (flo_floor, flo_ceil): should not return zero for small
  number.  [ruby-core:81394] [Bug #13599]
------------------------------------------------------------------------
r58912 | nobu | 2017-05-27 10:04:23 +0900 (Sat, 27 May 2017) | 4 lines

dir.c: fix FD leaks

* dir.c (do_opendir): close FD when fdopendir failed, e.g.,
  ENOTDIR.  [Feature#13056]
------------------------------------------------------------------------
r58911 | nobu | 2017-05-27 02:11:15 +0900 (Sat, 27 May 2017) | 3 lines

numeric.c: remove duplicate code

* numeric.c (flo_to_i): use dbl2ival and reduce duplicate code.
------------------------------------------------------------------------
r58910 | svn | 2017-05-27 02:10:03 +0900 (Sat, 27 May 2017) | 1 line

* 2017-05-27
------------------------------------------------------------------------
r58909 | watson1978 | 2017-05-27 02:10:01 +0900 (Sat, 27 May 2017) | 24 lines

Improve Array#concat performance if only one argument is given

* array.c (rb_ary_concat_multi): concatenate the array without generating
    temporary Array object if only one argument is given.
    This is very similar with r58886.

    Array#concat will be faster around 19%.
    [Fix GH-1634]

### Before
        Array#concat      2.187M ({U+00B1} 3.5%) i/s -     10.926M in   5.002829s

### After
        Array#concat      2.598M ({U+00B1} 1.8%) i/s -     13.008M in   5.008201s

### Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Array#concat" do |i|
    other = [4]
    i.times { [1, 2, 3].concat(other) }
  end
end
------------------------------------------------------------------------
r58908 | k0kubun | 2017-05-26 23:17:55 +0900 (Fri, 26 May 2017) | 11 lines

erb.rb: Tiny improvement of compiling cost

by reducing string allocation.

* Before

app_erb 0.687

* After

app_erb 0.679
------------------------------------------------------------------------
r58907 | k0kubun | 2017-05-26 22:58:36 +0900 (Fri, 26 May 2017) | 3 lines

erb.rb: [DOC] Follow compiled code's change

introduced in r58905.
------------------------------------------------------------------------
r58906 | svn | 2017-05-26 22:49:36 +0900 (Fri, 26 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58905 | k0kubun | 2017-05-26 22:49:35 +0900 (Fri, 26 May 2017) | 34 lines

erb.rb: Generate static string with opt_str_uminus

to skip object allocation for static string.

We can't always enable frozen_string_literal pragma because we can't
freeze string literals embedded by user for backward compatibility.
So we need to use fstring for each static string.

Since adding ".freeze" to string literals in #content_dump is slow
on compiling, I used unary "-" operator instead.

benchmark/bm_app_erb_render.rb: Added rendering-only benchmark to
test rendering performance on production environment.

This benchmark is created to reproduce the behavior on Sinatra (Tilt).
Thus it doesn't use ERB#result to skip parsing compiled code.
It doesn't use ERB#def_method too to regard `title` and `content` as
local variables. If we use #def_method, `title` and `content` needs
to be method call. I wanted to avoid it.

This patch's benchmark results is:

* Before

app_erb_render  1.250
app_erb 0.704

* After

app_erb_render  1.066
app_erb 0.686

This patch optimizes rendering performance (app_erb_render) without
spoiling (total of rendering +) compiling performance (app_erb).
------------------------------------------------------------------------
r58904 | k0kubun | 2017-05-26 21:12:13 +0900 (Fri, 26 May 2017) | 80 lines

erb.rb: Use script encoding instead of force_encoding

The original intention of introducing `_erbout.force_encoding`
in r21170 was:

- "returns a string in the same character encoding as the input string."
- "When the input string has a magic comment, however, it returns a string
  in the encoding specified by the magic comment."

And they are tested by test/erb/test_erb_m17n.rb well and this patch
passes the test.
Since magic comment is always added in ERB compiled code, using ''.dup
instead of String.new will set correct encoding without calling
force_encoding method.

The benchmark results are:

* Before

$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
MatzRuby:
ruby 2.5.0dev (2017-05-26 skip-force-enc.. 58903) [x86_64-linux]
last_commit=Skip force_encoding in compiled code of erb
Ruby:

app_erb:
matz 0.715

* After

$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
MatzRuby:
ruby 2.5.0dev (2017-05-26 skip-force-enc.. 58903) [x86_64-linux]
last_commit=Skip force_encoding in compiled code of erb
Ruby:

app_erb:
matz 0.672

And perf(1) results are:

* Before

$ sudo perf stat ./ruby benchmark/bm_app_erb.rb

 Performance counter stats for './ruby benchmark/bm_app_erb.rb':

        709.571746      task-clock (msec)         #    1.000 CPUs utilized
                 5      context-switches          #    0.007 K/sec
                 1      cpu-migrations            #    0.001 K/sec
             1,337      page-faults               #    0.002 M/sec
     3,088,936,521      cycles                    #    4.353 GHz
   <not supported>      stalled-cycles-frontend
   <not supported>      stalled-cycles-backend
     4,849,564,282      instructions              #    1.57  insns per cycle
     1,027,042,087      branches                  # 1447.411 M/sec
        19,983,456      branch-misses             #    1.95% of all branches

       0.709747823 seconds time elapsed

* After

$ sudo perf stat ./ruby benchmark/bm_app_erb.rb

 Performance counter stats for './ruby benchmark/bm_app_erb.rb':

        693.494673      task-clock (msec)         #    1.000 CPUs utilized
                 7      context-switches          #    0.010 K/sec
                 1      cpu-migrations            #    0.001 K/sec
             1,316      page-faults               #    0.002 M/sec
     3,025,639,349      cycles                    #    4.363 GHz
   <not supported>      stalled-cycles-frontend
   <not supported>      stalled-cycles-backend
     4,694,848,271      instructions              #    1.55  insns per cycle
       994,496,704      branches                  # 1434.037 M/sec
        19,693,239      branch-misses             #    1.98% of all branches

       0.693724345 seconds time elapsed

[fix GH-1147]
------------------------------------------------------------------------
r58903 | nobu | 2017-05-26 18:49:20 +0900 (Fri, 26 May 2017) | 4 lines

remove extra call to OleInitialize

[Fix GH-1629]
Signed-off-by: Matt Wrock <matt@mattwrock.com>
------------------------------------------------------------------------
r58902 | normal | 2017-05-26 16:28:23 +0900 (Fri, 26 May 2017) | 9 lines

attempt to fix rb_alloc_tmp_buffer2 for ALLOCV_N

This is a confusing function to my arithmetic-challenged mind,
but nobu seems alright with this.  Anyways this lets me use
large values of elsize without segfaulting, and "make exam"
passes.

* include/ruby/ruby.h (rb_alloc_tmp_buffer2): attempt to fix
  [ruby-core:81388] [ruby-core:81391] [Bug #13595]
------------------------------------------------------------------------
r58901 | nobu | 2017-05-26 16:04:43 +0900 (Fri, 26 May 2017) | 4 lines

dir.c: yield without base part

* dir.c (glob_helper): yield globbed part only without the base
  directory path part if the base is given.  [Feature#13056]
------------------------------------------------------------------------
r58900 | nobu | 2017-05-26 16:02:51 +0900 (Fri, 26 May 2017) | 5 lines

runruby.rb: no PRELOAD on multiarch [ci skip]

* tool/runruby.rb: do not set environment to preload on multiarch
  platforms, otherwise other external commands (e.g., /bin/sh)
  fail to run.
------------------------------------------------------------------------
r58899 | sonots | 2017-05-26 15:42:11 +0900 (Fri, 26 May 2017) | 2 lines

* lib/uri/common.rb: [DOC] add rdoc to describe
  URI.unescape is obsolete [ci-skip] [fix GH-1630]
------------------------------------------------------------------------
r58898 | nobu | 2017-05-26 15:39:49 +0900 (Fri, 26 May 2017) | 4 lines

sprintf.c: remove redundant condition

* sprintf.c (rb_str_format): when `t + 1 == end` (or `t < end`),
  `*t == '%'` is always true.  [ruby-core:80153] [Bug #13315]
------------------------------------------------------------------------
r58897 | nobu | 2017-05-26 15:39:06 +0900 (Fri, 26 May 2017) | 1 line

string.c: adjust style [ci skip]
------------------------------------------------------------------------
r58896 | nobu | 2017-05-26 15:28:38 +0900 (Fri, 26 May 2017) | 7 lines

Symbol support for opt_eql_func too

* vm_insnhelper.c (comparable_by_identity): extract the condition
  where comparable by identity.  currently both are same types,
  Fixnum, Flonum, or Symbol.

* vm_insnhelper.c (opt_eql_func): support Symbol too.
------------------------------------------------------------------------
r58895 | ko1 | 2017-05-26 14:26:57 +0900 (Fri, 26 May 2017) | 5 lines

Symbol support for opt_eq_func.

* vm_insnhelper.c (opt_eq_func): optimize for symbol comparison.
  [Bug #13330] [fix GH-1540]

------------------------------------------------------------------------
r58894 | rhe | 2017-05-26 10:50:20 +0900 (Fri, 26 May 2017) | 4 lines

compile.c: fix possible use of uninitialized value

LABEL::unremovable added by r58810 is not initialized by
new_label_body(), making the optimization unstable.
------------------------------------------------------------------------
r58893 | ko1 | 2017-05-26 08:43:33 +0900 (Fri, 26 May 2017) | 7 lines

use timeout scale.

* test/lib/envutil.rb: introduce EnvUtil.apply_timeout_scale to use
  this scale from outside.

* test/ruby/test_thread.rb (test_fork_in_thread): respect timeout scale.

------------------------------------------------------------------------
r58892 | k0kubun | 2017-05-26 00:43:49 +0900 (Fri, 26 May 2017) | 3 lines

NEWS: Add entry for ERB#result_with_hash

See r58891.
------------------------------------------------------------------------
r58891 | k0kubun | 2017-05-26 00:38:25 +0900 (Fri, 26 May 2017) | 3 lines

erb.rb: Add ERB#result_with_hash

[ruby-core:55985] [Feature #8631] [fix GH-1623]
------------------------------------------------------------------------
r58890 | eregon | 2017-05-26 00:33:28 +0900 (Fri, 26 May 2017) | 5 lines

Raise ArgumentError if sprintf format string ends with %

* Add tests and specs. See ruby/spec#401.
  Patch by Yuta Iwama and Shintaro Morikawa.
  [ruby-core:80153] [Bug #13315] [Fix GH-1560]
------------------------------------------------------------------------
r58889 | svn | 2017-05-26 00:14:39 +0900 (Fri, 26 May 2017) | 1 line

* 2017-05-26
------------------------------------------------------------------------
r58888 | stomar | 2017-05-26 00:14:38 +0900 (Fri, 26 May 2017) | 4 lines

hash.c: docs for Hash#transform_values

* hash.c: [DOC] fix return value in call-seq of Hash#transform_values;
  other small fixes.
------------------------------------------------------------------------
r58887 | k0kubun | 2017-05-25 20:41:45 +0900 (Thu, 25 May 2017) | 3 lines

insns.def: [DOC] Fix description of tostring

rb_obj_as_string() calls not #to_str (idTo_str) but #to_s (idTo_s).
------------------------------------------------------------------------
r58886 | k0kubun | 2017-05-25 20:14:40 +0900 (Thu, 25 May 2017) | 31 lines

string.c: Optimize String#concat when argc is 1

Optimize performance regression introduced in r56021.

* Benchmark (i7-4790K @ 4.00GH, x86_64 GNU/Linux)

Benchmark.ips do |x|
  x.report("String#concat (1)") { "a".concat("b") }
  if RUBY_VERSION >= "2.4.0"
    x.report("String#concat (2)") { "a".concat("b", "c") }
  end
end

* Ruby 2.3

Calculating -------------------------------------
   String#concat (1)      6.003M ({U+00B1} 5.2%) i/s -     30.122M in   5.031646s

* Ruby 2.4 (Before this patch)

Calculating -------------------------------------
   String#concat (1)      4.458M ({U+00B1} 8.9%) i/s -     22.298M in   5.058084s
   String#concat (2)      3.660M ({U+00B1} 5.6%) i/s -     18.314M in   5.020527s

* Ruby 2.4 (After this patch)

Calculating -------------------------------------
   String#concat (1)      6.448M ({U+00B1} 5.2%) i/s -     32.215M in   5.010833s
   String#concat (2)      3.633M ({U+00B1} 9.0%) i/s -     18.056M in   5.022603s

[fix GH-1631]
------------------------------------------------------------------------
r58885 | stomar | 2017-05-25 17:34:13 +0900 (Thu, 25 May 2017) | 4 lines

dir.c: document base keyword argument of Dir.glob

* dir.c: [DOC] document the new `base` keyword argument of Dir.glob
  [Feature #13056]; also improve docs for Dir.glob and Dir[].
------------------------------------------------------------------------
r58884 | stomar | 2017-05-25 16:50:20 +0900 (Thu, 25 May 2017) | 3 lines

dir.c: docs for Dir.each_child and Dir.children

* dir.c: [DOC] fix examples for Dir.each_child and Dir.children.
------------------------------------------------------------------------
r58883 | nobu | 2017-05-25 16:36:47 +0900 (Thu, 25 May 2017) | 1 line

vm_insnhelper.c: remove redefinitions and undefine after used
------------------------------------------------------------------------
r58882 | nobu | 2017-05-25 14:29:35 +0900 (Thu, 25 May 2017) | 4 lines

vm_insnhelper.c: rb_eql_opt should call eql?

* vm_insnhelper.c (rb_eql_opt): should call #eql? on Float and
  String, not #==.
------------------------------------------------------------------------
r58881 | watson1978 | 2017-05-25 13:25:39 +0900 (Thu, 25 May 2017) | 37 lines

Improve performance of rb_eql()

This improvement is similar with https://github.com/ruby/ruby/pull/1552

internal.h: add declaration of rb_eql_opt() API.

vm_insnhelper.c (rb_eql_opt): add rb_eql_opt() API which provides optimized
    path for #eql? method such as rb_equal_opt().

object.c (rb_eql): optimize using rb_eql_opt() such as rb_equal().
    Array#eql? and some methods have used rb_eql() and Array#eql? will be faster
    around 20%.

    [ruby-core:80761] [Bug #13447] [Fix GH-#1589]

### Before
       user     system      total        real
   1.570000   0.000000   1.570000 (  1.569754)

### After
       user     system      total        real
   1.300000   0.000000   1.300000 (  1.303624)

### Test code
require 'benchmark'

Benchmark.bmbm do |x|
  ary1 = Array.new(1000) { rand(1000) }
  ary2 = Array.new(1000) { rand(1000) }

  x.report do
    5000000.times do
      ary1.eql?(ary2)
    end
  end

end
------------------------------------------------------------------------
r58880 | watson1978 | 2017-05-25 13:25:37 +0900 (Thu, 25 May 2017) | 62 lines

Improve performance of rb_equal()

* object.c (rb_equal): add optimized path to compare the objects using
    rb_equal_opt(). Previously, if not same objects were given, rb_equal() would
    call `==' method via rb_funcall() which took a long time.

    rb_equal_opt() has provided faster comparing for Fixnum/Float/String objects.
    Now, Time#eql? uses rb_equal() to compare with argument object and it will
    be faster around 40% on 64-bit environment.

* array.c (rb_ary_index): remove redundant rb_equal_opt() calling.
    Now, rb_equal() was optimized using rb_equal_opt().
    If rb_equal_opt() returns Qundef, it will invoke rb_equal() -> rb_equal_opt(),
    and it will cause the performance regression.

    So, this patch will remove first redundant rb_equal_opt() calling.

* array.c (rb_ary_rindex): ditto.
* array.c (rb_ary_includes): ditto.

    [ruby-core:80360] [Bug #13365] [Fix GH-#1552]

### Before
Time#eql? with other      7.309M ({U+00B1} 1.4%) i/s -     36.647M in   5.014964s
    Array#index(val)      1.433M ({U+00B1} 1.2%) i/s -      7.207M in   5.030942s
   Array#rindex(val)      1.418M ({U+00B1} 1.6%) i/s -      7.103M in   5.009164s
 Array#include?(val)      1.451M ({U+00B1} 0.9%) i/s -      7.295M in   5.026392s

### After
Time#eql? with other     10.321M ({U+00B1} 1.9%) i/s -     51.684M in   5.009203s
    Array#index(val)      1.474M ({U+00B1} 0.9%) i/s -      7.433M in   5.044384s
   Array#rindex(val)      1.449M ({U+00B1} 1.7%) i/s -      7.292M in   5.034436s
 Array#include?(val)      1.466M ({U+00B1} 1.7%) i/s -      7.373M in   5.030047s

### Test code
require 'benchmark/ips'

Benchmark.ips do |x|
  t1 = Time.now
  t2 = Time.now

  x.report "Time#eql? with other" do |i|
    i.times { t1.eql?(t2) }
  end

  # Benchmarks to check whether it didn't introduce the regression
  obj = Object.new
  x.report "Array#index(val)" do |i|
    ary = [1, 2, true, false, obj]
    i.times { ary.index(obj) }
  end

  x.report "Array#rindex(val)" do |i|
    ary = [1, 2, true, false, obj].reverse
    i.times { ary.rindex(obj) }
  end

  x.report "Array#include?(val)" do |i|
    ary = [1, 2, true, false, obj]
    i.times { ary.include?(obj) }
  end
end
------------------------------------------------------------------------
r58879 | nobu | 2017-05-25 11:50:21 +0900 (Thu, 25 May 2017) | 5 lines

dir.c: Dir.each_child and Dir.children

* dir.c (dir_s_each_child, dir_s_children): Dir.each_child and
  Dir.children which are similar to Dir.foreach and Dir.entries
  respectively, except to exclude "."  and "..".  [Feature #11302]
------------------------------------------------------------------------
r58878 | nobu | 2017-05-25 11:50:20 +0900 (Thu, 25 May 2017) | 4 lines

test_dir.rb: test Dir.entries

* test/ruby/test_dir.rb (test_entries): test class singleton
  method Dir.entries too.
------------------------------------------------------------------------
r58877 | nobu | 2017-05-25 10:46:36 +0900 (Thu, 25 May 2017) | 3 lines

dir.c: dir_each_entries

* dir.c (dir_each_entries): expand entries without method calls.
------------------------------------------------------------------------
r58876 | normal | 2017-05-25 06:26:14 +0900 (Thu, 25 May 2017) | 3 lines

string.c: fix String#crypt leak introduced in r58866

* string.c (rb_str_crypt): define LARGE_CRYPT_DATA when allocating
------------------------------------------------------------------------
r58875 | svn | 2017-05-25 03:59:25 +0900 (Thu, 25 May 2017) | 1 line

* 2017-05-25
------------------------------------------------------------------------
r58874 | normal | 2017-05-25 03:59:24 +0900 (Thu, 25 May 2017) | 14 lines

thread_pthread: retry timer thread creation w/o attr on EINVAL

Setting a small stack size can fail due to having 3rd-party
libraries (e.g. libkqueue) loaded, if those libraries use
thread-local-storage (__thread) heavily.  This causes
pthread_create to fail with small stacks; even if our
timer_thread function does not hit any of the TLS-using code
paths.

Today, some RubyGems are capable of using libkqueue (or __thread
storage directly), and future versions of Ruby may use kqueue
internally.

cf. https://www.akkadia.org/drepper/tls.pdf
------------------------------------------------------------------------
r58873 | nobu | 2017-05-24 23:26:09 +0900 (Wed, 24 May 2017) | 4 lines

dir.c: prefer NAMLEN to d_name

* dir.c (glob_helper): prefer NAMLEN, do not assume d_name is NUL
  terminated everywhere.
------------------------------------------------------------------------
r58872 | nobu | 2017-05-24 22:30:54 +0900 (Wed, 24 May 2017) | 4 lines

test_http.rb: fix r58855

* test/net/http/test_http.rb (test_s_start): git rid of error when
  failed to start a connection.
------------------------------------------------------------------------
r58871 | nobu | 2017-05-24 17:00:42 +0900 (Wed, 24 May 2017) | 4 lines

enum.c: respect method visibility

* enum.c (ary_inject_op): should respect method visibility, do not
  optimize uncallable method.  [ruby-core:81349] [Bug #13592]
------------------------------------------------------------------------
r58870 | nobu | 2017-05-24 16:57:19 +0900 (Wed, 24 May 2017) | 4 lines

test_enum.rb: test_inject_array_op_redefined

* test/ruby/test_enum.rb (test_inject_array_op_redefined): test
  other operators too.  [Bug#12178]
------------------------------------------------------------------------
r58869 | nobu | 2017-05-24 16:57:18 +0900 (Wed, 24 May 2017) | 4 lines

assertions.rb: AllFailures#foreach

* test/lib/test/unit/assertions.rb (AllFailures#foreach):
  shortcircuit for `each` and `AllFailures#for`.
------------------------------------------------------------------------
r58868 | nobu | 2017-05-24 16:11:41 +0900 (Wed, 24 May 2017) | 4 lines

duplicate method

* test/ruby/test_enum.rb (assert_float_equal): remove overridden
  definition.
------------------------------------------------------------------------
r58867 | watson1978 | 2017-05-24 15:57:08 +0900 (Wed, 24 May 2017) | 65 lines

Improve performance in where push the element into non shared Array object

* array.c (ary_ensure_room_for_push): use rb_ary_modify_check() instead of
    rb_ary_modify() to check whether the object can be modified for non shared
    Array object. rb_ary_modify() has the codes for shared Array object too.
    In here, it has condition branch for shared / non shared Array object and
    it can use rb_ary_modify_check() which is smaller function than
    rb_ary_modify() for non shared object.

    rb_ary_modify_check() will be expand as inline function.
    If it will compile with GCC, Array#<< will be faster around 8%.

    [ruby-core:81082] [Bug #13553] [Fix GH-1609]

## Clang 802.0.42
### Before
            Array#<<      9.353M ({U+00B1} 1.7%) i/s -     46.787M in   5.004123s
          Array#push      7.702M ({U+00B1} 1.1%) i/s -     38.577M in   5.009338s
     Array#values_at      6.133M ({U+00B1} 1.9%) i/s -     30.699M in   5.007772s

### After
            Array#<<      9.458M ({U+00B1} 2.0%) i/s -     47.357M in   5.009069s
          Array#push      7.921M ({U+00B1} 1.8%) i/s -     39.665M in   5.009151s
     Array#values_at      6.377M ({U+00B1} 2.3%) i/s -     31.881M in   5.001888s

### Result
Array#<<        -> 1.2% faster
Array#push      -> 2.8% faster
Array#values_at -> 3.9% faster

## GCC 7.1.0
### Before
            Array#<<     10.497M ({U+00B1} 1.1%) i/s -     52.665M in   5.017601s
          Array#push      8.527M ({U+00B1} 1.6%) i/s -     42.777M in   5.018003s
     Array#values_at      7.621M ({U+00B1} 1.7%) i/s -     38.152M in   5.007910s

### After
            Array#<<     11.403M ({U+00B1} 1.3%) i/s -     57.028M in   5.001849s
          Array#push      8.924M ({U+00B1} 1.3%) i/s -     44.609M in   4.999940s
     Array#values_at      8.291M ({U+00B1} 1.4%) i/s -     41.487M in   5.004727s

### Result
Array#<<        -> 8.3% faster
Array#push      -> 4.3% faster
Array#values_at -> 8.7% faster

## Test code
require 'benchmark/ips'

Benchmark.ips do |x|

  x.report "Array#<<" do |i|
    i.times { [1,2] << 3 }
  end

  x.report "Array#push" do |i|
    i.times { [1,2].push(3) }
  end

  x.report "Array#values_at" do |i|
    ary = [1, 2, 3, 4, 5]
    i.times { ary.values_at(0, 2, 4) }
  end

end
------------------------------------------------------------------------
r58866 | nobu | 2017-05-24 15:55:09 +0900 (Wed, 24 May 2017) | 4 lines

string.c: for small crypt_data

* string.c (rb_str_crypt): struct crypt_data defined in
  missing/crypt.h is small enough.
------------------------------------------------------------------------
r58865 | ko1 | 2017-05-24 15:46:44 +0900 (Wed, 24 May 2017) | 14 lines

Add debug counters.

* debug_counter.h: add the following counters to measure object types.
  obj_free: freed count
  obj_str_ptr: freed count of Strings they have extra buff.
  obj_str_embed: freed count of Strings they don't have extra buff.
  obj_str_shared: freed count of Strings they have shared extra buff.
  obj_str_nofree: freed count of Strings they are marked as nofree.
  obj_str_fstr: freed count of Strings they are marked as fstr.
  obj_ary_ptr: freed count of Arrays they have extra buff.
  obj_ary_embed: freed count of Arrays they don't have extra buff.
  obj_obj_ptr: freed count of Objects (T_OBJECT) they have extra buff.
  obj_obj_embed: freed count of Objects they don't have extra buff.

------------------------------------------------------------------------
r58864 | normal | 2017-05-24 12:01:44 +0900 (Wed, 24 May 2017) | 4 lines

string.c (rb_str_crypt): fix excessive stack use with crypt_r

"struct crypt_data" is 131232 bytes on x86-64 GNU/Linux,
making it unsafe to use tiny Fiber stack sizes.
------------------------------------------------------------------------
r58863 | normal | 2017-05-24 09:34:12 +0900 (Wed, 24 May 2017) | 14 lines

rubyspec/core/io/popen_spec: avoid lingering "ruby -e sleep" process

The ruby_cmd helper blindly escapes code blocks passed to it,
causing "sleep" to be quoted in the command-line.  This quoting
results in IO.popen using a subshell (/bin/sh) to run the given
string command instead of invoking the Ruby executable directly.

Thus, IO.popen would only see the PID of the subshell via
IO#pid, and merely sending SIGKILL to the subshell would not
result in the child ("ruby -e sleep") being killed.

This problem with lingering ruby processes was easier to
reproduce on slow or heavily-loaded systems using low-scheduling
priority (e.g. "chrt -i 0 make test-rubyspec")
------------------------------------------------------------------------
r58862 | svn | 2017-05-24 01:51:48 +0900 (Wed, 24 May 2017) | 1 line

* 2017-05-24
------------------------------------------------------------------------
r58861 | naruse | 2017-05-24 01:51:48 +0900 (Wed, 24 May 2017) | 5 lines

skip on Solaris 11

On Solaris 11, MSG_OOB is in readfds?
http://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11x/ruby-trunk/log/20170523T152403Z.fail.html.gz
http://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11s/ruby-trunk/log/20170523T152503Z.fail.html.gz
------------------------------------------------------------------------
r58860 | nobu | 2017-05-23 23:34:12 +0900 (Tue, 23 May 2017) | 4 lines

Dir as base option

* dir.c (glob_helper): support Dir instance as `base` option.
  [Feature#13056]
------------------------------------------------------------------------
r58859 | nobu | 2017-05-23 22:54:10 +0900 (Tue, 23 May 2017) | 4 lines

test_dir.rb: sort

* test/ruby/test_dir.rb (test_glob_base): sort the globbed result
  to compare.
------------------------------------------------------------------------
r58858 | nobu | 2017-05-23 22:47:36 +0900 (Tue, 23 May 2017) | 4 lines

Dir.glob base option

* dir.c (dir_s_aref, dir_s_glob): add new optional keyword
  argument, `base`.  [Feature#13056]
------------------------------------------------------------------------
r58857 | nobu | 2017-05-23 22:18:45 +0900 (Tue, 23 May 2017) | 3 lines

readonly srcdir

.travis.yml: make srcdir unwritable during build and tests.
------------------------------------------------------------------------
r58856 | nobu | 2017-05-23 21:42:40 +0900 (Tue, 23 May 2017) | 3 lines

out-of-place on travis

* .travis.yml (before_script, script): out-of-place build.
------------------------------------------------------------------------
r58855 | nobu | 2017-05-23 21:38:01 +0900 (Tue, 23 May 2017) | 4 lines

fix FD leaks

* test/net/http/test_http.rb (test_s_start): finish connections to
  get rid of FD leaks.
------------------------------------------------------------------------
r58854 | nobu | 2017-05-23 21:11:57 +0900 (Tue, 23 May 2017) | 3 lines

LABEL_FORMAT

* compile.c (LABEL_FORMAT): extract format string for labels.
------------------------------------------------------------------------
r58853 | nobu | 2017-05-23 20:35:54 +0900 (Tue, 23 May 2017) | 3 lines

unused member

* vsnprintf.c (__sFILE): _lbfsize is not used.
------------------------------------------------------------------------
r58852 | kou | 2017-05-23 15:02:20 +0900 (Tue, 23 May 2017) | 2 lines

Use test-unit 3.2.4

------------------------------------------------------------------------
r58851 | nobu | 2017-05-23 10:04:09 +0900 (Tue, 23 May 2017) | 3 lines

readonly srcdir

appveyor.yml: make srcdir unwritable during build and tests.
------------------------------------------------------------------------
r58850 | nobu | 2017-05-23 10:04:07 +0900 (Tue, 23 May 2017) | 1 line

appveyor.yml: remove unused UNICODE_DATA_DIR
------------------------------------------------------------------------
r58849 | svn | 2017-05-23 08:41:51 +0900 (Tue, 23 May 2017) | 1 line

* 2017-05-23
------------------------------------------------------------------------
r58848 | normal | 2017-05-23 08:41:50 +0900 (Tue, 23 May 2017) | 7 lines

variable.c (autoload_sleep_done): avoid needless list_node init

We do not need list_del_init in ensure callbacks, only list_del,
since it can only ever be called after list_del_init in
autoload_reset.  So avoid the needless re-initialization.

* variable.c (autoload_sleep_done): s/list_del_init/list_del/
------------------------------------------------------------------------
r58847 | nobu | 2017-05-22 23:25:56 +0900 (Mon, 22 May 2017) | 1 line

source directory may not be writable
------------------------------------------------------------------------
r58846 | normal | 2017-05-22 16:36:00 +0900 (Mon, 22 May 2017) | 9 lines

lib/net/protocol.rb: account read_bytes before caller sees it

Users may modify the chunk yielded to them in Net::HTTPResponse#read_body.
This will allow users to reduce memory usage by calling
String#clear on the buffer once they're done using it.

* lib/net/protocol.rb (read): increment read_bytes earlier
  (read_all): ditto
* test/net/http/test_httpresponse.rb (test_read_body_block_mod): new test
------------------------------------------------------------------------
r58845 | rhe | 2017-05-22 16:13:06 +0900 (Mon, 22 May 2017) | 4 lines

hash.c: [DOC] fix docs for Hash#transform_values!

Hash#transform_values! returns the receiver rather than a new Hash
object.
------------------------------------------------------------------------
r58844 | shugo | 2017-05-22 15:13:11 +0900 (Mon, 22 May 2017) | 4 lines

net/imap: separate @continuation_request_exception from @exception

Otherwise literal data will be sent even if NO response is returned
because @exception is set to nil in receive_responses.
------------------------------------------------------------------------
r58843 | nobu | 2017-05-22 13:10:51 +0900 (Mon, 22 May 2017) | 6 lines

downloader.rb: true symlink on cygwin

* tool/downloader.rb (Downloader.link_cache): on Cygwin, make true
  symlink only, which is provided by the OS.  as mingw/mswin ruby
  can't follow cygwin's pseudo symlink, it will fail on the same
  source tree.
------------------------------------------------------------------------
r58842 | k0kubun | 2017-05-22 12:56:16 +0900 (Mon, 22 May 2017) | 23 lines

erb.rb: Skip creating regexp

if stags and etags are not changed from default.

:putobject insn (of regexp) will be used instead of :toregexp insn.
This means that the regexp won't be compiled for every
`SimpleScanner#scan` call.

It may not be a good idea to apply this kind of optimization for all cases.
But I applied this because it is default scanner and used frequently and has
relatively large impact for benchmark like this:

* Before
app_erb 1.023

* After
app_erb 0.781

This commit fixes only the bottleneck of performance regression introduced
in r53412. For maintainability, I won't fix other small regressions like
additional overhead of method calls.

[ruby-core:73820] [Bug #12074]
------------------------------------------------------------------------
r58841 | nobu | 2017-05-22 12:18:17 +0900 (Mon, 22 May 2017) | 4 lines

fix r58833

* tool/downloader.rb (Downloader.download): just link to the cache
  when downloaded to the cache but not the target file.
------------------------------------------------------------------------
r58840 | normal | 2017-05-22 08:52:08 +0900 (Mon, 22 May 2017) | 34 lines

lib/net/protocol: clear short-lived read buffer

Using a parallel Net::HTTP downloader, this reduced memory usage
from around 120MB to 50MB on my 32-bit x86 system.

* lib/net/protocol.rb (rbuf_fill): clear temporary buffer

Test script I used:

  require 'net/http'
  require 'uri'
  require 'digest/sha1'
  url = 'http://80x24.org/git-i-forgot-to-pack/objects/pack/pack-97b25a76c03b489d4cbbd85b12d0e1ad28717e55.idx'
  uri = URI(url)
  use_ssl = "https" == uri.scheme
  thrs = 30.times.map do
    Thread.start do
      cur = Thread.current.object_id
      Net::HTTP.start(uri.host, uri.port, use_ssl: use_ssl) do |http|
        req = Net::HTTP::Get.new(uri)
        http.request(req) do |res|
          dig = Digest::SHA1.new
          res.read_body do |buf|
            dig.update(buf)
            #buf.clear # most Ruby programmers don't do this :<
          end
          warn "#{Time.now} #{cur} #{dig.hexdigest}\n"
        end
      end
      :done
    end
  end

  p thrs.map(&:value)
------------------------------------------------------------------------
r58839 | stomar | 2017-05-22 04:31:37 +0900 (Mon, 22 May 2017) | 3 lines

String#casecmp no longer raises TypeError

* See https://bugs.ruby-lang.org/issues/13312
------------------------------------------------------------------------
r58838 | stomar | 2017-05-22 04:29:58 +0900 (Mon, 22 May 2017) | 1 line

NEWS: String#{casecmp,casecmp?} [Bug #13312]
------------------------------------------------------------------------
r58837 | stomar | 2017-05-22 04:28:48 +0900 (Mon, 22 May 2017) | 9 lines

string.c: fix String#{casecmp,casecmp?} for non-string arguments

* string.c: make String#{casecmp,casecmp?} return nil for
  non-string arguments instead of raising a TypeError.

* test/ruby/test_string.rb: add tests.

Reported by Marcus Stollsteimer.  Based on a patch by Shingo Morita.
[ruby-core:80145] [Bug #13312]
------------------------------------------------------------------------
r58836 | stomar | 2017-05-22 04:27:08 +0900 (Mon, 22 May 2017) | 4 lines

test_string.rb,test_symbol.rb: add some tests

* test/ruby/test_string.rb: add more test cases for String#casecmp.
* test/ruby/test_symbol.rb: ditto for Symbol#{casecmp,casecmp?}.
------------------------------------------------------------------------
r58835 | stomar | 2017-05-22 04:25:19 +0900 (Mon, 22 May 2017) | 1 line

Use should_receive expectation instead of singleton method
------------------------------------------------------------------------
r58834 | svn | 2017-05-22 01:45:36 +0900 (Mon, 22 May 2017) | 1 line

* 2017-05-22
------------------------------------------------------------------------
r58833 | nobu | 2017-05-22 01:45:35 +0900 (Mon, 22 May 2017) | 3 lines

downloader cache

* tool/downloader.rb (Downloader.download): manage download cache.
------------------------------------------------------------------------
r58832 | nobu | 2017-05-21 23:29:00 +0900 (Sun, 21 May 2017) | 1 line

remove verify option
------------------------------------------------------------------------
r58831 | nobu | 2017-05-21 17:30:50 +0900 (Sun, 21 May 2017) | 4 lines

downloader.rb: utilize dir argument

* tool/downloader.rb (Downloader::RubyGems.download): utilize
  `dir` argument of Downloader.download.
------------------------------------------------------------------------
r58830 | kazu | 2017-05-21 16:13:11 +0900 (Sun, 21 May 2017) | 8 lines

Add missing word in transform_values methods description

Explicitly says that the methods return a new hash rather than just
stating it return a new something we don't know.

[ci skip]
[Fix GH-1619]
Author:    Nicolas Cavigneaux <nico@bounga.org>
------------------------------------------------------------------------
r58829 | watson1978 | 2017-05-21 12:36:31 +0900 (Sun, 21 May 2017) | 42 lines

Improve Time#+ & Time#- performance

* time.c (wadd): use internal addv() function to calculate internal value in
    Time object. On 64-bit machine, Time object might have Fixnum object
    internally by default and addv() can calculate Fixnum objects directly.

* time.c (wsub): use internal subv() function due the same reason in above.

    Time#+ & Time#- will be faster around 15%.

    [ruby-dev:50036] [Bug #13357] [Fix GH-1547]

### Before
             user     system      total        real
Time#+   0.820000   0.000000   0.820000 (  0.818081)
Time#-   0.810000   0.000000   0.810000 (  0.813835)

### After
             user     system      total        real
Time#+   0.710000   0.000000   0.710000 (  0.710241)
Time#-   0.710000   0.010000   0.720000 (  0.714151)

### Test code
require 'benchmark'

Benchmark.bmbm do |x|

  x.report "Time#+" do
    t = Time.now
    2000000.times do
      t + 1
    end
  end

  x.report "Time#-" do
    t = Time.now
    2000000.times do
      t - 1
    end
  end

end
------------------------------------------------------------------------
r58828 | watson1978 | 2017-05-21 12:36:30 +0900 (Sun, 21 May 2017) | 48 lines

Improve Time#<=> performance

* time.c (wcmp): use internal cmp() function for comparing internal Fixnum value
    in Time objects. On 64-bit machine, Time object might have Fixnum object
    internally by default and cmp() can compare the Fixnum objects directly.

    Time#<=> will be faster around 60% on 64-bit machine.

* time.c (cmp): add optimized path for comparing internal Bignum value by using
    rb_big_cmp() API. On 32-bit machine, Time object might have Bignum object
    internally by default.

    Time#<=> will be faster around 50% on 32-bit machine.

    [ruby-dev:50034] [Bug #13354] [Fix GH-1546]

### Before
             user     system      total        real
Fixnum   1.410000   0.000000   1.410000 (  1.407848)
Bignum   1.550000   0.000000   1.550000 (  1.549145)

### After
             user     system      total        real
Fixnum   0.880000   0.000000   0.880000 (  0.886662)
Bignum   1.050000   0.000000   1.050000 (  1.047994)

### Test code
require 'benchmark'

Benchmark.bmbm do |x|

  x.report "Fixnum" do
    t1 = Time.now
    t2 = Time.now
    10000000.times do
      t1 <=> t2
    end
  end

  x.report "Bignum" do
    t1 = Time.at(2 ** 64)
    t2 = Time.at(2 ** 64 + 1)
    10000000.times do
      t1 <=> t2
    end
  end

end
------------------------------------------------------------------------
r58827 | kazu | 2017-05-21 10:01:10 +0900 (Sun, 21 May 2017) | 4 lines

Remove redundant square brackets

Use character class directly instead of
character class in character class.
------------------------------------------------------------------------
r58826 | k0kubun | 2017-05-21 02:36:09 +0900 (Sun, 21 May 2017) | 3 lines

erb.rb: Allow trimming CR in all trim_modes

to unify a behavior with r58823 and r58825.
------------------------------------------------------------------------
r58825 | k0kubun | 2017-05-21 02:17:22 +0900 (Sun, 21 May 2017) | 5 lines

erb.rb: Allow explicit trimming carriage return

when trim_mode is "-", for Windows environments.

[ruby-core:39625] [Bug #5339]
------------------------------------------------------------------------
r58824 | k0kubun | 2017-05-21 02:03:01 +0900 (Sun, 21 May 2017) | 4 lines

doc/maintainers.rdoc: Add me to ERB maintainers

The current maintainer suggested this in ruby-dev:50113.
Please ping me if an issue happens in ERB.
------------------------------------------------------------------------
r58823 | k0kubun | 2017-05-21 01:50:33 +0900 (Sun, 21 May 2017) | 5 lines

erb.rb: Allow trimming carriage return

when trim_mode is "<>", for Windows environments.

[Bug #11464]
------------------------------------------------------------------------
r58822 | k0kubun | 2017-05-21 01:20:07 +0900 (Sun, 21 May 2017) | 3 lines

erb.rb: Prevent potential unexpected rescue

of LoadError in some method calls, not from `require "strscan"`.
------------------------------------------------------------------------
r58821 | svn | 2017-05-21 00:58:17 +0900 (Sun, 21 May 2017) | 1 line

* 2017-05-21
------------------------------------------------------------------------
r58820 | naruse | 2017-05-21 00:58:16 +0900 (Sun, 21 May 2017) | 1 line

Clean proxy
------------------------------------------------------------------------
r58819 | k0kubun | 2017-05-20 23:55:33 +0900 (Sat, 20 May 2017) | 9 lines

erb.rb: Drop unused scanner implementation

Original `SimpleScanner` was used only in tests.
Since `SimpleScanner` and `SimpleScanner2` work in the same way, I want
to drop the one which can't be used in a normal situation.

The only difference was `SimpleScanner` can be loaded without strscan
dependency but I think there's no situation that strscan is unavailable
because it's a standard library.
------------------------------------------------------------------------
r58818 | svn | 2017-05-20 22:00:42 +0900 (Sat, 20 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58817 | mame | 2017-05-20 22:00:41 +0900 (Sat, 20 May 2017) | 5 lines

Add coverage measurement mode by using gcov

This experimental feature is only for Ruby-core team, not for casual users.

Usage: `./configure --enable-gcov && make && make exam && make gcov`
------------------------------------------------------------------------
r58816 | mame | 2017-05-20 21:23:27 +0900 (Sat, 20 May 2017) | 5 lines

ripper.c should have `#line "ripper.c"`, not `#line "parse.c"`

The order of sed commands in Makefile of ripper was wrong: it tries to
replace `y.tab.c` with `ripper.c`, but before that, ytab.sed replaced
`y.tab.c` with `parse.c`, which led to a wrong result.
------------------------------------------------------------------------
r58815 | nobu | 2017-05-20 20:40:57 +0900 (Sat, 20 May 2017) | 4 lines

compile.c: optimize branches

* compile.c (compile_branch_condition, iseq_compile_each0):
  eliminate unreachable branches in NODE_IF.
------------------------------------------------------------------------
r58814 | nobu | 2017-05-20 19:27:27 +0900 (Sat, 20 May 2017) | 5 lines

compile.c: binary logop check

* compile.c (compile_branch_condition): turn recursion at binary
  logical operator into loop by goto, and check the result of RHS
  of NODE_OR.
------------------------------------------------------------------------
r58813 | stomar | 2017-05-20 19:21:44 +0900 (Sat, 20 May 2017) | 5 lines

prime.rb: remove alias after timeout test

* test/test_prime.rb: remove alias after timeout test.

* lib/prime.rb: fix typo.
------------------------------------------------------------------------
r58812 | normal | 2017-05-20 18:47:14 +0900 (Sat, 20 May 2017) | 31 lines

speed up IO#close with many threads

Today, it increases IO#close performance with many threads:

  Execution time (sec)
  name            trunk   after
  vm_thread_close 4.276   3.018

  Speedup ratio: compare with the result of `trunk' (greater is better)
  name            after
  vm_thread_close 1.417

This speedup comes because rb_notify_fd_close only scans threads
inside rb_thread_io_blocking_region, not all threads in the VM.

In the future, this type data structure may allow us to notify
waiters of multiple FDs on a single thread (when using
Fibers).

* thread.c (struct waiting_fd): declare
  (rb_thread_io_blocking_region): use on-stack list waiter
  (rb_notify_fd_close): walk vm->waiting_fds instead
  (call_without_gvl): remove old field setting
  (th_init): ditto
* vm_core.h (typedef struct rb_vm_struct): add waiting_fds list
* (typedef struct rb_thread_struct): remove waiting_fd field
  (rb_vm_living_threads_init): initialize waiting_fds list

I am now kicking myself for not thinking about this 3 years ago
when I introduced ccan/list in [Feature #9632] to optimize this
same function :<
------------------------------------------------------------------------
r58811 | watson1978 | 2017-05-20 18:23:46 +0900 (Sat, 20 May 2017) | 32 lines

Improve Hash#merge performance

* hash.c (rb_hash_merge): use rb_hash_dup() instead of rb_obj_dup() to duplicate
    Hash object. rb_hash_dup() is faster duplicating function for Hash object
    which got rid of Hash#initialize_dup method calling.

    Hash#merge will be faster around 60%.
    [ruby-dev:50026] [Bug #13343] [Fix GH-1533]

### Before
                 user     system      total        real
Hash#merge   0.160000   0.020000   0.180000 (  0.182357)

### After
                 user     system      total        real
Hash#merge   0.110000   0.010000   0.120000 (  0.114404)

### Test code
require 'benchmark'

Benchmark.bmbm do |x|
  hash1 = {}
  100.times { |i| hash1[i.to_s] = i }
  hash2 = {}
  100.times { |i| hash2[(i*2).to_s] = i*2 }

  x.report "Hash#merge" do
    10000.times do
      hash1.merge(hash2)
    end
  end
end
------------------------------------------------------------------------
r58810 | nobu | 2017-05-20 11:11:24 +0900 (Sat, 20 May 2017) | 4 lines

compile.c: fix catch-table labels optimization

* compile.c (remove_unreachable_chunk): do not eliminate chunks
  followed by labels in catch-table entries.
------------------------------------------------------------------------
r58809 | marcandre | 2017-05-20 09:36:55 +0900 (Sat, 20 May 2017) | 6 lines

lib/prime: Fix primality of some large integers [#13492].

* lib/prime.rb: Use accurate sqrt to insure all factors are tested.
  Patch by Marcus Stollsteimer.

* test/test_prime.rb: Adapt test for timeout
------------------------------------------------------------------------
r58808 | hsbt | 2017-05-20 08:39:58 +0900 (Sat, 20 May 2017) | 3 lines

Merge gemspec from ruby/fileutils.

  * Replaced homepage option to source code location as github.
------------------------------------------------------------------------
r58807 | normal | 2017-05-20 06:34:04 +0900 (Sat, 20 May 2017) | 1 line

fix off-by-one in r58806
------------------------------------------------------------------------
r58806 | normal | 2017-05-20 06:33:15 +0900 (Sat, 20 May 2017) | 4 lines

test/ruby/test_io.rb: new test for IO.select exception set

Ensure this rarely-used feature of IO.select continues
to work properly.
------------------------------------------------------------------------
r58805 | normal | 2017-05-20 03:53:11 +0900 (Sat, 20 May 2017) | 34 lines

thread_sync.c: rewrite the rest using using ccan/list

The performance improvement increases as the number of waiters
increases, due to avoiding the O(n) behavior of rb_ary_delete on
the waiting thread.  Uncontended queues and condition variables
performance is not altered significantly.

Function entry cost is slightly increased for ConditionVariable,
since the data pointer is separately allocated and not embedded
into the RVALUE slot.

[ruby-core:81235] [Feature #13552]

name                  |trunk  |built
----------------------|------:|------:
vm_thread_condvar1    |  0.858|  0.858
vm_thread_condvar2    |  1.003|  0.804
vm_thread_queue       |  0.131|  0.129
vm_thread_sized_queue |  0.265|  0.251
vm_thread_sized_queue2|  0.892|  0.859
vm_thread_sized_queue3|  0.879|  0.845
vm_thread_sized_queue4|  0.599|  0.486

Speedup ratio: compare with the result of `trunk' (greater is better)

name                  |built
----------------------|------:
vm_thread_condvar1    |  0.999
vm_thread_condvar2    |  1.246
vm_thread_queue       |  1.020
vm_thread_sized_queue |  1.057
vm_thread_sized_queue2|  1.039
vm_thread_sized_queue3|  1.041
vm_thread_sized_queue4|  1.233
------------------------------------------------------------------------
r58804 | normal | 2017-05-20 03:34:38 +0900 (Sat, 20 May 2017) | 4 lines

thread_sync.c: rename mutex_waiter struct to sync_waiter

We will reuse this struct for ConditionVariable, Queue, and SizedQueue,
so it is no longer Mutex-specific.
------------------------------------------------------------------------
r58803 | naruse | 2017-05-20 01:19:46 +0900 (Sat, 20 May 2017) | 1 line

Define classes for r58800
------------------------------------------------------------------------
r58802 | svn | 2017-05-20 01:06:26 +0900 (Sat, 20 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58801 | naruse | 2017-05-20 01:06:25 +0900 (Sat, 20 May 2017) | 5 lines

Net::HTTP::STATUS_CODES is added as HTTP Status Code Repository [Misc #12935]

Note that 418 I'm a teapot doesn't exist because RFC 2324 and
RFC 7168 are not registered in IANA repository.
https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
------------------------------------------------------------------------
r58800 | naruse | 2017-05-20 01:06:18 +0900 (Sat, 20 May 2017) | 1 line

Add more HTTP status classes
------------------------------------------------------------------------
r58799 | svn | 2017-05-20 00:13:42 +0900 (Sat, 20 May 2017) | 1 line

* 2017-05-20
------------------------------------------------------------------------
r58798 | naruse | 2017-05-20 00:13:42 +0900 (Sat, 20 May 2017) | 3 lines

Net::HTTP#start now pass :ENV to p_addr by default [Bug #13351]

To avoid this, pass nil explicitly.
------------------------------------------------------------------------
r58797 | nobu | 2017-05-19 23:58:38 +0900 (Fri, 19 May 2017) | 4 lines

compile.c: dump_disasm_list_with_cursor

* compile.c (dump_disasm_list_with_cursor): improve disassemble
  list.  show whole elemetns and mark the current element.
------------------------------------------------------------------------
r58796 | naruse | 2017-05-19 23:14:52 +0900 (Fri, 19 May 2017) | 3 lines

Merge latest dtoa.c [Bug #13545]

Apply some part of http://www.netlib.org/fp/dtoa.c with my eyes...
------------------------------------------------------------------------
r58795 | usa | 2017-05-19 21:44:46 +0900 (Fri, 19 May 2017) | 5 lines

Of course, opened file is not able to unlink on Windows

* test/test_tempfile.rb (test_create_with_block): close the tempfile before
  unlink.  fixed a failure on Windows introduced at r58791.

------------------------------------------------------------------------
r58794 | nobu | 2017-05-19 18:36:34 +0900 (Fri, 19 May 2017) | 1 line

tempfile.rb: do not call File.identical? on closed stream
------------------------------------------------------------------------
r58793 | svn | 2017-05-19 18:25:53 +0900 (Fri, 19 May 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r58792 | shugo | 2017-05-19 18:25:52 +0900 (Fri, 19 May 2017) | 3 lines

net/imap: Net::IMAP#append should not block when NO response is received

[ruby-dev:50129] [Bug#13579]
------------------------------------------------------------------------
r58791 | nobu | 2017-05-19 18:20:14 +0900 (Fri, 19 May 2017) | 4 lines

tempfile.rb: remove in Tempfile.create

* lib/tempfile.rb (Tempfile.create): should not fail even if the
  temporary file has been removed in the block, just ignore.
------------------------------------------------------------------------
r58790 | duerst | 2017-05-19 17:19:02 +0900 (Fri, 19 May 2017) | 1 line

add specs for Unicode-wide case conversions introduced in Ruby 2.4
------------------------------------------------------------------------
r58789 | duerst | 2017-05-19 17:05:56 +0900 (Fri, 19 May 2017) | 1 line

improve examples, fix one improbably should_not value
------------------------------------------------------------------------
r58788 | ko1 | 2017-05-19 16:54:04 +0900 (Fri, 19 May 2017) | 5 lines

specify unsigned (fix r58784).

* method.h (rb_method_definition_t#type): specify unsigned explicitly.
 Some compilers (includes VC) returns negative value.

------------------------------------------------------------------------
r58787 | nobu | 2017-05-19 16:34:05 +0900 (Fri, 19 May 2017) | 1 line

fix syntax error
------------------------------------------------------------------------
r58786 | nobu | 2017-05-19 16:12:45 +0900 (Fri, 19 May 2017) | 4 lines

eval_error.c: enrich backtrace

* eval_error.c (print_backtrace): add frame number when printing
  in reverse order.  [Feature #8661]
------------------------------------------------------------------------
r58785 | naruse | 2017-05-19 15:14:43 +0900 (Fri, 19 May 2017) | 1 line

Add NEWS about [Feature #8661]
------------------------------------------------------------------------
r58784 | normal | 2017-05-19 15:00:53 +0900 (Fri, 19 May 2017) | 14 lines

method.h: pack rb_method_definition_t struct

We only have 12 method types, so 4 bits is enough for
rb_method_type_t.

Size reductions:

- x86-64     48 => 40 bytes
- x86        28 => 24 bytes

* method.h (enum method_optimized_type): split out for CPP
  (struct rb_method_definition struct): pack on unaligned systems
  (rb_method_definition_t): split typedef to help ctags
  [ruby-core:81236] [Feature #13494]
------------------------------------------------------------------------
r58783 | k0kubun | 2017-05-19 00:13:30 +0900 (Fri, 19 May 2017) | 4 lines

Fix strange indentation

which I introduced at r58773.
Hard tabs and spaces are mixed...
------------------------------------------------------------------------
r58782 | svn | 2017-05-19 00:06:48 +0900 (Fri, 19 May 2017) | 1 line

* 2017-05-19
------------------------------------------------------------------------
r58781 | nobu | 2017-05-19 00:06:47 +0900 (Fri, 19 May 2017) | 5 lines

common.mk: path in parse.c

* common.mk (parse.c): replace source file name in #line pragmas
  with the path in the source directory, so that binary utilities,
  e.g. gcov, can find it.
------------------------------------------------------------------------
r58780 | nobu | 2017-05-18 20:29:42 +0900 (Thu, 18 May 2017) | 5 lines

potential memory leak

* dir.c (rb_dir_getwd): get rid of potential memory leak.

* util.c (ruby_getcwd): ditto.
------------------------------------------------------------------------
r58779 | hsbt | 2017-05-18 14:29:04 +0900 (Thu, 18 May 2017) | 1 line

Fix a wrong repository name of simplecov.
------------------------------------------------------------------------
r58778 | svn | 2017-05-18 11:42:17 +0900 (Thu, 18 May 2017) | 1 line

* 2017-05-18
------------------------------------------------------------------------
r58777 | hsbt | 2017-05-18 11:42:16 +0900 (Thu, 18 May 2017) | 47 lines

Improve CSV parsing performance.

  Patch by @joshpencheon (Josh Pencheon)
  [fix GH-1607]

  #### benchmark-ips results
  ```
  trunk:
  Warming up --------------------------------------
                         4.000  i/100ms
  Calculating -------------------------------------
                         39.661  ({U+00B1}10.1%) i/s -      2.352k in 60.034781s
  with-patch:
  Warming up --------------------------------------
                         5.000  i/100ms
  Calculating -------------------------------------
                         60.521  ({U+00B1} 9.9%) i/s -      3.595k in 60.047157s
  ```

  #### memory_profiler resuts

  ```
  trunk:
  allocated memory by class
  -----------------------------------
    35588490  String
     7454320  Array
      294000  MatchData
       37340  Regexp
       11840  Hash
        2400  CSV
        1600  Proc
        1280  Method
         800  StringIO
  with-patch:
  allocated memory by class
  -----------------------------------
    18788490  String
     3454320  Array
      294000  MatchData
       37340  Regexp
       11840  Hash
        2400  CSV
        1600  Proc
        1280  Method
         800  StringIO
  ```
------------------------------------------------------------------------
r58776 | ko1 | 2017-05-17 23:43:22 +0900 (Wed, 17 May 2017) | 6 lines

modify r58771.

* spec/rubyspec/command_line/dash_upper_s_spec.rb: enable tests on vboxsf
  (VirtualBox shared directory) and change tests to match /success$/ to
  ignore warnings. This technique is suggested by @unak.

------------------------------------------------------------------------
r58775 | k0kubun | 2017-05-17 23:11:01 +0900 (Wed, 17 May 2017) | 5 lines

spec/rubyspec: Add `ruby_version_is` guard

for future backport to ruby/spec repository.

See r58772 r58773 r58774.
------------------------------------------------------------------------
r58774 | k0kubun | 2017-05-17 22:21:09 +0900 (Wed, 17 May 2017) | 1 line

spec/rubyspec: Fix rubyspec for tilde unescape
------------------------------------------------------------------------
r58773 | k0kubun | 2017-05-17 21:34:59 +0900 (Wed, 17 May 2017) | 5 lines

cgi/util.rb: Don't escape tilde in #escape

to make it compatible with ERB::Util.url_encode.

ext/cgi/escape/escape.c: ditto.
------------------------------------------------------------------------
r58772 | k0kubun | 2017-05-17 20:58:09 +0900 (Wed, 17 May 2017) | 7 lines

erb.rb: Don't encode tilde in #url_encode

Based on patch by madeofcode (Mark Dodwell).
[ruby-core:46168] [Bug #6696] [Fix GH-54]

`~` is a unreserved character.
https://tools.ietf.org/html/rfc3986#section-2.3
------------------------------------------------------------------------
r58771 | ko1 | 2017-05-17 18:31:34 +0900 (Wed, 17 May 2017) | 4 lines

skip some tests on vboxsf.

* spec/rubyspec/command_line/dash_upper_s_spec.rb:

------------------------------------------------------------------------
r58770 | hsbt | 2017-05-17 16:56:27 +0900 (Wed, 17 May 2017) | 18 lines

Optimize CSV#shift.

  [Bug #12373][ruby-core:75462]
  Patch by Yuki Kurihara.

  Benchmark:
  ```
  Warming up --------------------------------------
           csv_shift     1.000  i/100ms
       new_csv_shift     1.000  i/100ms
Calculating -------------------------------------
           csv_shift      1.192  ({U+00B1} 0.0%) i/s -      6.000  in 5.034250s
       new_csv_shift      1.527  ({U+00B1} 0.0%) i/s -      8.000  in 5.243446s

Comparison:
       new_csv_shift:        1.5 i/s
           csv_shift:        1.2 i/s - 1.28x  slower
  ```
------------------------------------------------------------------------
r58769 | naruse | 2017-05-17 16:13:47 +0900 (Wed, 17 May 2017) | 1 line

Treat NULL reference case [Bug #13566]
------------------------------------------------------------------------
r58768 | naruse | 2017-05-17 14:38:37 +0900 (Wed, 17 May 2017) | 3 lines

Merge Onigmo 6.1.2

https://github.com/k-takata/Onigmo/commit/1364ae3488cac0acbf2d61ef3ce2b62fe0c0f528
------------------------------------------------------------------------
r58767 | nobu | 2017-05-17 13:47:05 +0900 (Wed, 17 May 2017) | 4 lines

ruby.c: encode script name

* ruby.c (process_options): encode script name to locale encoding
  instead of associate, if UTF-8 path.
------------------------------------------------------------------------
r58766 | nobu | 2017-05-17 13:44:12 +0900 (Wed, 17 May 2017) | 4 lines

.gdbinit: fix nd_tree

* .gdbinit (nd_tree): use rb_str_tmp_new to get rid of
  `__extension__'.
------------------------------------------------------------------------
r58765 | nobu | 2017-05-17 09:28:01 +0900 (Wed, 17 May 2017) | 6 lines

test_dir_m17n.rb: read in filesystem encoding

* test/ruby/test_dir_m17n.rb (test_entries_compose): read in
  filesystem encoding instead of default external encoding on
  Windows too.  these two encodings may differ on some
  environments.
------------------------------------------------------------------------
r58764 | normal | 2017-05-17 08:59:01 +0900 (Wed, 17 May 2017) | 4 lines

Revert "test/test_extilibs.rb: do not check the existence of fiddle"

This reverts r58761 since fiddle is considered critical.
[ruby-core:81201] [ruby-core:81203]
------------------------------------------------------------------------
r58763 | usa | 2017-05-17 08:15:56 +0900 (Wed, 17 May 2017) | 5 lines

ENV["HOME"] is prior as home on Windows

* spec/rubyspec/core/dir/home_spec.rb: ENV["HOME"] is prior as home on Windows.
  reported by ko1.

------------------------------------------------------------------------
r58762 | nobu | 2017-05-17 08:09:34 +0900 (Wed, 17 May 2017) | 4 lines

gmake.mk: test dependency

* defs/gmake.mk (TEST_DEPENDS): check and more tests targets need
  all to be built.
------------------------------------------------------------------------
r58761 | normal | 2017-05-17 07:05:39 +0900 (Wed, 17 May 2017) | 6 lines

test/test_extilibs.rb: do not check the existence of fiddle

libffi is not installed on all systems, and is not needed
for most of the tests.

Tested on a fresh FreeBSD 11.0 VM
------------------------------------------------------------------------
r58760 | usa | 2017-05-17 01:16:47 +0900 (Wed, 17 May 2017) | 9 lines

Should require at spec file, not fixture file

Fixed ERRORs at non-Windows platforms.

* spec/rubyspec/library/win32ole/fixtures/classes.rb (require): removed.

* spec/rubyspec/library/win32ole/win32ole/ole_get_methods_spec.rb (require):
  forgotten to require 'win32ole'.

------------------------------------------------------------------------
r58759 | nobu | 2017-05-17 00:47:44 +0900 (Wed, 17 May 2017) | 1 line

run tests without exts
------------------------------------------------------------------------
r58758 | usa | 2017-05-17 00:45:25 +0900 (Wed, 17 May 2017) | 5 lines

Should require WIN32OLE

* spec/rubyspec/library/win32ole/fixtures/classes.rb: should require WIN32OLE
  here because this file causes NameError in parallel spec.

------------------------------------------------------------------------
r58757 | svn | 2017-05-17 00:17:40 +0900 (Wed, 17 May 2017) | 1 line

* 2017-05-17
------------------------------------------------------------------------
r58756 | nobu | 2017-05-17 00:17:39 +0900 (Wed, 17 May 2017) | 4 lines

test/unit.rb: fix returning job tokens

* test/lib/test/unit.rb (_run_parallel): flush job tokens after
  quitting workers when normally finished too.
------------------------------------------------------------------------
r58755 | nobu | 2017-05-16 23:53:04 +0900 (Tue, 16 May 2017) | 5 lines

test_process.rb: compare in UTF-8

* test/ruby/test_process.rb (test_execopts_open_chdir_m17n_path):
  compare directory name in UTF-8.  encoding of `Dir.pwd` is
  affected by filesystem encoding.
------------------------------------------------------------------------
r58754 | nobu | 2017-05-16 22:57:18 +0900 (Tue, 16 May 2017) | 1 line

Use raise_error block
------------------------------------------------------------------------
r58753 | nobu | 2017-05-16 22:51:17 +0900 (Tue, 16 May 2017) | 1 line

Mac OS raises EADDRNOTAVAIL but not ECONNREFUSED
------------------------------------------------------------------------
r58752 | nobu | 2017-05-16 22:51:15 +0900 (Tue, 16 May 2017) | 1 line

Multiple exception classes at raise_error
------------------------------------------------------------------------
r58751 | usa | 2017-05-16 22:50:51 +0900 (Tue, 16 May 2017) | 2 lines

* common.mk (help): get rid of make error with nmake.

------------------------------------------------------------------------
r58750 | ko1 | 2017-05-16 22:22:42 +0900 (Tue, 16 May 2017) | 1 line

restore yes-test-rubyspec
------------------------------------------------------------------------
r58749 | nobu | 2017-05-16 22:15:12 +0900 (Tue, 16 May 2017) | 1 line

follow test-spec
------------------------------------------------------------------------
r58748 | eregon | 2017-05-16 21:29:44 +0900 (Tue, 16 May 2017) | 1 line

Avoid using a class variable in socket specs
------------------------------------------------------------------------
r58747 | eregon | 2017-05-16 21:29:30 +0900 (Tue, 16 May 2017) | 3 lines

Use a reserved port to test for a non-existing TCP server

* Avoids a race between finding an available port and another process starting a server on it.
------------------------------------------------------------------------
r58746 | usa | 2017-05-16 21:15:48 +0900 (Tue, 16 May 2017) | 5 lines

Rename rubyspec to spec

* common.mk (*-rubyspec): rename to *-spec because rubyspec is historical name.
  of course, *-rubyspec are still available for compatibility.

------------------------------------------------------------------------
r58745 | nobu | 2017-05-16 19:25:56 +0900 (Tue, 16 May 2017) | 6 lines

rb_w32_ugetcwd: UTF-8 version getcwd

* dir.c (rb_dir_getwd): convert from UTF-8.

* win32/win32.c (w32_getcwd): codepage aware getcwd using
  GetCurrentDirectoryW.
------------------------------------------------------------------------
r58744 | hsbt | 2017-05-16 18:32:32 +0900 (Tue, 16 May 2017) | 3 lines

Strip punctuation from CSV headers in symbol converter.

  Patch by @cllns. [Fix GH-957]
------------------------------------------------------------------------
r58743 | hsbt | 2017-05-16 18:17:09 +0900 (Tue, 16 May 2017) | 3 lines

Added accessor of original line when parsing.

  [Feature #11865][ruby-core:72452][fix GH-1170]
------------------------------------------------------------------------
r58742 | usa | 2017-05-16 17:03:53 +0900 (Tue, 16 May 2017) | 5 lines

Search SSL libraries by testing various filename patterns

* ext/openssl/extconf.rb (find_openssl_library): should search by more flexible
  method, especially for LibreSSL on Windows.

------------------------------------------------------------------------
r58741 | nobu | 2017-05-16 14:47:53 +0900 (Tue, 16 May 2017) | 4 lines

fix tempfile leaks on Windows

* lib/rubygems/ext/ext_conf_builder.rb (build): needs to close
  before unlink on Windows.
------------------------------------------------------------------------
r58740 | naruse | 2017-05-16 14:02:23 +0900 (Tue, 16 May 2017) | 1 line

fix words
------------------------------------------------------------------------
r58739 | ko1 | 2017-05-16 13:23:10 +0900 (Tue, 16 May 2017) | 2 lines

skip openssl related tests.

------------------------------------------------------------------------
r58738 | svn | 2017-05-16 09:15:55 +0900 (Tue, 16 May 2017) | 1 line

* 2017-05-16
------------------------------------------------------------------------
r58737 | nobu | 2017-05-16 09:15:54 +0900 (Tue, 16 May 2017) | 4 lines

enable ruby_w32_codepage on cygwin

* debug.c, localeinit.c: enable ruby_w32_codepage on cygwin too.
  [ruby-core:81163] [Bug #13567]
------------------------------------------------------------------------
r58736 | ko1 | 2017-05-15 23:40:07 +0900 (Mon, 15 May 2017) | 16 lines

refresh Gem at the end of `teardown`.

* lib/rubygems/test_case.rb (teardown): call `Gem::refresh()` at the
  end of `teardown`.
  On parallel test sometimes fails test process. The reason
  is:
  (1) previous tests remains `Gem::Specification@@stubs` value
      which points to temporary directories and the directories
      are removed by `teardown` method of previous test.
  (2) `require 'rubygems/gem_runner'` in `test_gem_gem_runner.rb`
      tries to require test utility file. However, with strange `@@stubs`
      RubyGems tries to load specification from removed directory.
      `StubSpecification#to_spec` returns `nil` and error will occur.
  The solution this patch employs is to refresh all of parameters
  includes `Gem::Specification@@stubs` by `Gem::refresh()`.

------------------------------------------------------------------------
r58735 | k0kubun | 2017-05-15 22:38:02 +0900 (Mon, 15 May 2017) | 5 lines

erb.rb: Use String#<< instead of #concat

to optimize String concatenation on rendering.

[fix GH-1612]
------------------------------------------------------------------------
r58734 | sorah | 2017-05-15 21:18:55 +0900 (Mon, 15 May 2017) | 7 lines

[DOC] File#path result can be inaccurate

* file.c(rb_file_path): [DOC] Note that the pathname returned by this
  method can be inaccurate, for instance file gets moved, renamed,
  deleted or is created with File::TMPFILE option.

  Relates to [Feature #13568]
------------------------------------------------------------------------
r58733 | nobu | 2017-05-15 20:32:35 +0900 (Mon, 15 May 2017) | 4 lines

optional/capi: use LIBRUBYARG_SHARED

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  use LIBRUBYARG_SHARED for LDSHARED.
------------------------------------------------------------------------
r58732 | nobu | 2017-05-15 20:25:56 +0900 (Mon, 15 May 2017) | 1 line

thread_spec.c: use rb_w32_pipe
------------------------------------------------------------------------
r58731 | nobu | 2017-05-15 20:19:12 +0900 (Mon, 15 May 2017) | 1 line

io_spec.c: suppress unused-variable warning
------------------------------------------------------------------------
r58730 | nobu | 2017-05-15 20:16:27 +0900 (Mon, 15 May 2017) | 4 lines

configure.in: negative time_t for mingw

* configure.in: mingw also uses MSVCRT accepts negative time_t.
  c.f. r58681.
------------------------------------------------------------------------
r58729 | nobu | 2017-05-15 20:16:26 +0900 (Mon, 15 May 2017) | 1 line

configure.in: remove dynamic option in LDSHARED
------------------------------------------------------------------------
r58728 | nobu | 2017-05-15 20:16:25 +0900 (Mon, 15 May 2017) | 5 lines

optional/capi: fix link on mingw

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  LIBRUBYARG is always necessary unless dynamic lookup is allowed.
  strip $(DEFFILE) from DLDFLAGS on mingw.
------------------------------------------------------------------------
r58727 | nobu | 2017-05-15 19:32:30 +0900 (Mon, 15 May 2017) | 1 line

default.mspec: ignore unavailable FDs
------------------------------------------------------------------------
r58726 | usa | 2017-05-15 16:35:26 +0900 (Mon, 15 May 2017) | 8 lines

Should call `ln_s` only when symlink is available

* test/fileutils/test_fileutils.rb (test_ln_s): skip if symlink is not
  available.

* test/fileutils/test_fileutils.rb (test_ln_s): remove created symlink
  certainly.

------------------------------------------------------------------------
r58725 | normal | 2017-05-15 16:33:10 +0900 (Mon, 15 May 2017) | 4 lines

test/socket/test_basicsocket.rb (socks): bind explicitly to localhost

Binding to a potentially public IP in a test can cause problems
if hit by a random port scanner or something...
------------------------------------------------------------------------
r58724 | nobu | 2017-05-15 16:04:48 +0900 (Mon, 15 May 2017) | 1 line

define RUBY_DEBUG_ENV only for main.c
------------------------------------------------------------------------
r58723 | ko1 | 2017-05-15 16:02:33 +0900 (Mon, 15 May 2017) | 3 lines

add information for debugging.


------------------------------------------------------------------------
r58722 | svn | 2017-05-15 15:17:30 +0900 (Mon, 15 May 2017) | 1 line

* 2017-05-15
------------------------------------------------------------------------
r58721 | nobu | 2017-05-15 15:17:29 +0900 (Mon, 15 May 2017) | 1 line

refer flag variables regardless RUBY_DEBUG_ENV
------------------------------------------------------------------------
r58720 | nobu | 2017-05-14 23:27:07 +0900 (Sun, 14 May 2017) | 1 line

fix typo
------------------------------------------------------------------------
r58719 | svn | 2017-05-14 23:09:58 +0900 (Sun, 14 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58718 | eregon | 2017-05-14 23:09:56 +0900 (Sun, 14 May 2017) | 1 line

Update to ruby/spec@032022ca
------------------------------------------------------------------------
r58717 | svn | 2017-05-14 23:09:30 +0900 (Sun, 14 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58716 | eregon | 2017-05-14 23:09:29 +0900 (Sun, 14 May 2017) | 1 line

Update to ruby/mspec@4b980493
------------------------------------------------------------------------
r58715 | nobu | 2017-05-14 22:01:46 +0900 (Sun, 14 May 2017) | 4 lines

suppress a warning [ci skip]

* thread_sync.c (rb_mutex_num_waiting): suppress warning C4700 by
  VC, uninitialized local variable.
------------------------------------------------------------------------
r58714 | nobu | 2017-05-14 20:45:00 +0900 (Sun, 14 May 2017) | 7 lines

object.c: use a sized enumerator with #yield_self

* object.c (rb_obj_size): The #yield_self Enumerator instance
  always has a #count of `1`.  This provides a lazy #size of `1`
  to match the count instead of `nil`.  [Fix GH-1615]

Author:    Shannon Skipper <shannonskipper@gmail.com>
------------------------------------------------------------------------
r58713 | naruse | 2017-05-14 20:36:01 +0900 (Sun, 14 May 2017) | 3 lines

Don't read non .rb file as a spec

To avoid reading `core` file on reading core/ specs.
------------------------------------------------------------------------
r58712 | nobu | 2017-05-14 12:53:59 +0900 (Sun, 14 May 2017) | 4 lines

suppress warning

* spec/rubyspec/optional/capi/ext/fixnum_spec.c: suppress
  unused-but-set-variable warning.
------------------------------------------------------------------------
r58711 | nobu | 2017-05-14 12:33:01 +0900 (Sun, 14 May 2017) | 4 lines

exts.mk.tmpl: fix multiple rubies

* template/exts.mk.tmpl: get rid of making multiple rubies
  simultaneously.  it can cause making libruby in parallel.
------------------------------------------------------------------------
r58710 | nobu | 2017-05-14 10:03:15 +0900 (Sun, 14 May 2017) | 4 lines

tgamma on mingw

* configure.in: get rid of unreliable tgamma() implemented of
  mingw, which returns NaN unexpectedly.
------------------------------------------------------------------------
r58709 | nobu | 2017-05-14 09:21:00 +0900 (Sun, 14 May 2017) | 4 lines

string.c: cut down intermediate string

* string.c (rb_external_str_new_with_enc): cut down intermediate
  string for conversion source, by appending with conversion.
------------------------------------------------------------------------
r58708 | nobu | 2017-05-14 01:04:05 +0900 (Sun, 14 May 2017) | 1 line

revert r58703 & r58705
------------------------------------------------------------------------
r58707 | svn | 2017-05-14 00:23:39 +0900 (Sun, 14 May 2017) | 1 line

* 2017-05-14
------------------------------------------------------------------------
r58706 | usa | 2017-05-14 00:23:38 +0900 (Sun, 14 May 2017) | 4 lines

The exception raised when exec/spawn unexecutable file on Windows is various

It seems that depend on OS version or filesystem

------------------------------------------------------------------------
r58705 | nobu | 2017-05-13 23:20:19 +0900 (Sat, 13 May 2017) | 6 lines

string.c: fix up r58703

* string.c (rb_external_str_new_with_enc): fix the case of
  conversion failure.  when conversion failed for some reason,
  just ignores the default internal encoding and returns in the
  given encoding.
------------------------------------------------------------------------
r58704 | nobu | 2017-05-13 22:54:52 +0900 (Sat, 13 May 2017) | 5 lines

remove wrong expectation

* spec/rubyspec/core/kernel/itself_spec.rb: `object_id` may return
  different objects for each calls, and the expectation of object
  identity is done by `equal` matcher which uses `equal?` method.
------------------------------------------------------------------------
r58703 | nobu | 2017-05-13 22:34:39 +0900 (Sat, 13 May 2017) | 4 lines

string.c: cut down intermediate string

* string.c (rb_external_str_new_with_enc): cut down intermediate
  string for conversion source, by appending with conversion.
------------------------------------------------------------------------
r58702 | nobu | 2017-05-13 21:31:01 +0900 (Sat, 13 May 2017) | 4 lines

string.c: fix one-off bug

* string.c (rb_str_cat_conv_enc_opts): fix one-off bug.  `ofs`
  equals `olen` when appending at the end.
------------------------------------------------------------------------
r58701 | nobu | 2017-05-13 18:55:23 +0900 (Sat, 13 May 2017) | 4 lines

make test-rubyspec-precheck

* common.mk (yes-test-rubyspec): make test-rubyspec-precheck for
  fake.rb to setup build configuration.
------------------------------------------------------------------------
r58700 | shugo | 2017-05-13 11:05:40 +0900 (Sat, 13 May 2017) | 1 line

test/net/imap: fix race condition in test_exception_during_idle
------------------------------------------------------------------------
r58699 | nobu | 2017-05-13 10:16:36 +0900 (Sat, 13 May 2017) | 1 line

thread_win32.c: disable currently unused functions
------------------------------------------------------------------------
r58698 | nobu | 2017-05-13 10:05:30 +0900 (Sat, 13 May 2017) | 4 lines

math.c: check argument to lgamma_r

* math.c (math_lgamma): check the argument before calling math
  function `lgamma_r` for edge cases.
------------------------------------------------------------------------
r58697 | nobu | 2017-05-13 09:50:20 +0900 (Sat, 13 May 2017) | 4 lines

math.c: check argument to tgamma

* math.c (math_gamma): check the argument before calling math
  function `tgamma` for edge cases.
------------------------------------------------------------------------
r58696 | normal | 2017-05-13 06:52:04 +0900 (Sat, 13 May 2017) | 26 lines

autoload: always wait on loading thread

We cannot assume autoload_provided/rb_feature_provided returning
TRUE means it is safe to proceed without waiting.  Another
thread may call rb_provide_feature before setting the constant
(via autoload_const_set).  So we must wait until autoload is
completed by another thread.

Note: this patch was tested with an explicit rb_thread_schedule
in rb_provide_feature to make the race condition more apparent
as suggested by <s.wanabe@gmail.com>:
> --- a/load.c
> +++ b/load.c
> @@ -563,6 +563,7 @@ rb_provide_feature(VALUE feature)
>      rb_str_freeze(feature);
>
>      rb_ary_push(features, rb_fstring(feature));
> +rb_thread_schedule();
>      features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
>      reset_loaded_features_snapshot();
>  }

* variable.c (check_autoload_required): do not assume a provided
  feature means autoload is complete, always wait if autoload is
  being performed by another thread.
  [ruby-core:81105] [Bug #11384] Thanks to <s.wanabe@gmail.com>
------------------------------------------------------------------------
r58695 | usa | 2017-05-13 05:10:16 +0900 (Sat, 13 May 2017) | 4 lines

`notepad.exe` does not always exist in `C:\Windows`

Use `%WINDIR%\system32\drivers\etc\services` instead of `notepad.exe`.

------------------------------------------------------------------------
r58694 | nobu | 2017-05-13 02:23:46 +0900 (Sat, 13 May 2017) | 4 lines

array.c: fix position in message

* array.c (rb_ary_insert): fix the position in error message, when
  it is less than -1.
------------------------------------------------------------------------
r58693 | nobu | 2017-05-13 02:02:48 +0900 (Sat, 13 May 2017) | 4 lines

array.c: check position to insert

* array.c (rb_ary_insert): check position to insert even if no
  elements to be inserted.  [ruby-core:81125] [Bug #13558]
------------------------------------------------------------------------
r58692 | naruse | 2017-05-13 02:02:25 +0900 (Sat, 13 May 2017) | 1 line

show GEM_HOME
------------------------------------------------------------------------
r58691 | nobu | 2017-05-13 01:12:46 +0900 (Sat, 13 May 2017) | 7 lines

fix tgamma for inifity

* configure.in: do not use buggy tgamma() of mingw.

* missing/tgamma.c (tgamma): merge fix for inifity from
  ruby_tgamma.  since msvcr120.dll and later have tgamma, this
  implementation will not be used.
------------------------------------------------------------------------
r58690 | svn | 2017-05-13 01:01:18 +0900 (Sat, 13 May 2017) | 1 line

* 2017-05-13
------------------------------------------------------------------------
r58689 | nobu | 2017-05-13 01:01:17 +0900 (Sat, 13 May 2017) | 1 line

tgamma.c: unify versions with/without lgamma_r
------------------------------------------------------------------------
r58688 | nobu | 2017-05-13 00:29:55 +0900 (Sat, 13 May 2017) | 4 lines

string.c: remove bare Unicode.

* string.c (rb_str_unicode_normalize): remove bare Unicode.  do
  not assume that all compilers can handle UTF-8.
------------------------------------------------------------------------
r58687 | usa | 2017-05-12 20:49:05 +0900 (Fri, 12 May 2017) | 5 lines

Encoding.default_internal should affect ENV on Windows like other platforms

* hash.c (env_str_transcode): call rb_external_str_with_enc() if
  default_internal is available.

------------------------------------------------------------------------
r58686 | usa | 2017-05-12 19:37:41 +0900 (Fri, 12 May 2017) | 2 lines

Windows does not know Unix style timezone

------------------------------------------------------------------------
r58685 | usa | 2017-05-12 19:31:52 +0900 (Fri, 12 May 2017) | 5 lines

Math.gamma(Float::INFINITY) should return +INF

* math.c (tgamma): it seems that the implementaion of mswin has similar problem
  with mingw.

------------------------------------------------------------------------
r58684 | usa | 2017-05-12 19:23:53 +0900 (Fri, 12 May 2017) | 2 lines

On LLP64 platform (mswin64), the return value of String#hash is fixnum.

------------------------------------------------------------------------
r58683 | usa | 2017-05-12 19:10:15 +0900 (Fri, 12 May 2017) | 4 lines

Skip specs which make non-socket fd nonblocking on Windows

because Windows does not support nonblocking mode except sockets.

------------------------------------------------------------------------
r58682 | usa | 2017-05-12 19:05:48 +0900 (Fri, 12 May 2017) | 2 lines

Support bulding the extension on Windows

------------------------------------------------------------------------
r58681 | usa | 2017-05-12 18:46:45 +0900 (Fri, 12 May 2017) | 2 lines

It seems that MSVCRT accepts negative time_t

------------------------------------------------------------------------
r58680 | shugo | 2017-05-12 18:39:23 +0900 (Fri, 12 May 2017) | 4 lines

net/imap: Revert read_tiemout in r58549.

get_response is called in a receiver thread, so there may be no pending
commands when get_response is called.
------------------------------------------------------------------------
r58679 | usa | 2017-05-12 18:36:57 +0900 (Fri, 12 May 2017) | 2 lines

unistd.h is only available when HAVE_UNISTD_H is 1

------------------------------------------------------------------------
r58678 | usa | 2017-05-12 18:17:10 +0900 (Fri, 12 May 2017) | 2 lines

Skip the spec which uses `fork` on Windows

------------------------------------------------------------------------
r58677 | usa | 2017-05-12 17:45:20 +0900 (Fri, 12 May 2017) | 6 lines

The title of "Desktop" may be localized

* spec/rubyspec/library/win32ole/win32ole/_invoke_spec.rb: the title of
  "Desktop" may be localized.  then, use "System32" because it seems not to be
  localized.

------------------------------------------------------------------------
r58676 | usa | 2017-05-12 17:11:35 +0900 (Fri, 12 May 2017) | 5 lines

Skip on Windows because it always fails

On Windows, when invoking ruby via runruby.rb, the pid of invoker and of invokee
are diffrent.  Therefore, this spec always fails.

------------------------------------------------------------------------
r58675 | nobu | 2017-05-12 17:10:36 +0900 (Fri, 12 May 2017) | 6 lines

remove code old versions

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension):
  remove code old versions.  `RbConfig::CONFIG["rubyhdrdir"]` is
  since 1.9, and `RbConfig::CONFIG["rubyarchhdrdir"]` is since
  2.0.0.
------------------------------------------------------------------------
r58674 | nobu | 2017-05-12 16:48:08 +0900 (Fri, 12 May 2017) | 5 lines

gc.c: checks of sizes

* gc.c (ruby_xmalloc, ruby_xmalloc2, ruby_xcalloc): move checks of
  sizes from objspace_xmalloc, objspace_xmalloc2, objspace_xcalloc,
  respectively.
------------------------------------------------------------------------
r58673 | nobu | 2017-05-12 16:48:05 +0900 (Fri, 12 May 2017) | 4 lines

gc.c: objspace_malloc_fixup

* gc.c (objspace_malloc_fixup): include allocated size
  managements.
------------------------------------------------------------------------
r58672 | usa | 2017-05-12 15:48:53 +0900 (Fri, 12 May 2017) | 2 lines

spec has been merged, then should run it in love

------------------------------------------------------------------------
r58671 | usa | 2017-05-12 15:39:43 +0900 (Fri, 12 May 2017) | 5 lines

Support building exts of spec on mswin

* spec/rubyspec/optional/capi/spec_helper.rb: building command of extensions on
  mswin differs from Unixen's one.

------------------------------------------------------------------------
r58670 | nobu | 2017-05-12 15:19:00 +0900 (Fri, 12 May 2017) | 4 lines

vm.c: free by ruby_xfree

* vm.c (ruby_vm_run_at_exit_hooks): should free by `ruby_xfree`
  memories allocated by `ALLOC`.
------------------------------------------------------------------------
r58669 | stomar | 2017-05-12 03:59:45 +0900 (Fri, 12 May 2017) | 3 lines

string.c: docs for String#match

* string.c: [DOC] add example for String#match with pos argument.
------------------------------------------------------------------------
r58668 | stomar | 2017-05-12 03:58:27 +0900 (Fri, 12 May 2017) | 4 lines

string.c: docs for Symbol

* string.c: [DOC] adopt call-seq's for Symbol#{match,match?} from
  String methods; other small improvements for Symbol docs.
------------------------------------------------------------------------
r58667 | svn | 2017-05-12 03:56:33 +0900 (Fri, 12 May 2017) | 1 line

* 2017-05-12
------------------------------------------------------------------------
r58666 | stomar | 2017-05-12 03:56:32 +0900 (Fri, 12 May 2017) | 4 lines

string.c: docs for Symbol#{match,match?}

* string.c: [DOC] mention pos argument for Symbol#{match,match?}.
  Patch by Yuki Kurihara (ksss).  [Fix GH-1606]
------------------------------------------------------------------------
r58665 | nobu | 2017-05-11 23:28:38 +0900 (Thu, 11 May 2017) | 4 lines

gc.c: skip unnecessary check

* gc.c (wmap_aset): skip unnecessary size check.
  `2*sizeof(VALUE)` is static and should never overflow.
------------------------------------------------------------------------
r58664 | nobu | 2017-05-11 23:28:37 +0900 (Thu, 11 May 2017) | 4 lines

gc.c: use the argument objspace

* gc.c (objspace_xrealloc): use the argument objspace, instead of
  the default object space.
------------------------------------------------------------------------
r58663 | shugo | 2017-05-11 16:56:52 +0900 (Thu, 11 May 2017) | 1 line

net/imap: Net::IMAP#disconnect need not do anything if already disconnected
------------------------------------------------------------------------
r58662 | nobu | 2017-05-11 11:38:09 +0900 (Thu, 11 May 2017) | 4 lines

process.c: fix error check

* process.c (obj2uid, obj2gid): check the error number returned by
  `getpwnam_r()` and `getgrnam_r()`, instead of `errno`.
------------------------------------------------------------------------
r58661 | nobu | 2017-05-11 08:52:14 +0900 (Thu, 11 May 2017) | 4 lines

fix up r57167

* test/lib/minitest/unit.rb (MiniTest::Unit#_run_anything): stop
  if any errors or failures.
------------------------------------------------------------------------
r58660 | naruse | 2017-05-11 08:38:28 +0900 (Thu, 11 May 2017) | 1 line

pass as exception
------------------------------------------------------------------------
r58659 | nobu | 2017-05-11 08:34:33 +0900 (Thu, 11 May 2017) | 1 line

.
------------------------------------------------------------------------
r58658 | nobu | 2017-05-11 08:18:07 +0900 (Thu, 11 May 2017) | 5 lines

process.c: temporary string for buffer

* process.c (obj2uid, obj2gid): use temporary string as the buffer
  instead of `rb_alloc_tmp_buffer`, which is `NODE_ALLOCA` since
  r51492.  [ruby-core:81084] [Bug #13554]
------------------------------------------------------------------------
r58657 | naruse | 2017-05-11 04:19:38 +0900 (Thu, 11 May 2017) | 1 line

Show garbages if requiring gem_runner is failed
------------------------------------------------------------------------
r58656 | svn | 2017-05-11 04:03:07 +0900 (Thu, 11 May 2017) | 1 line

* 2017-05-11
------------------------------------------------------------------------
r58655 | stomar | 2017-05-11 04:03:07 +0900 (Thu, 11 May 2017) | 4 lines

lib/uri/generic.rb: fix typos

* lib/uri/generic.rb: [DOC] fix typos in URI::Generic#== docs.
  Patch by Alyssa Ross (alyssais).  [Fix GH-1604]
------------------------------------------------------------------------
r58654 | eregon | 2017-05-10 23:35:38 +0900 (Wed, 10 May 2017) | 1 line

Use environment values to find ruby and flags instead of an argument
------------------------------------------------------------------------
r58653 | eregon | 2017-05-10 23:35:24 +0900 (Wed, 10 May 2017) | 1 line

Use ruby_cmd instead of the RUBY_EXE constant in specs
------------------------------------------------------------------------
r58652 | nobu | 2017-05-10 23:25:03 +0900 (Wed, 10 May 2017) | 1 line

gc.c: check of size in ruby_sized_xrealloc
------------------------------------------------------------------------
r58651 | eregon | 2017-05-10 23:18:23 +0900 (Wed, 10 May 2017) | 1 line

Use the Mutex to know whether we entered the signal handler in Process#kill specs
------------------------------------------------------------------------
r58650 | eregon | 2017-05-10 23:18:10 +0900 (Wed, 10 May 2017) | 1 line

Process.getpgrp and Process.setsid must be available for Process#kill group specs
------------------------------------------------------------------------
r58649 | eregon | 2017-05-10 23:17:58 +0900 (Wed, 10 May 2017) | 1 line

Use #system directly with multiple arguments in Process#kill specs
------------------------------------------------------------------------
r58648 | naruse | 2017-05-10 16:23:06 +0900 (Wed, 10 May 2017) | 1 line

confirm current process equals to gemhome's pid
------------------------------------------------------------------------
r58647 | nobu | 2017-05-10 15:38:30 +0900 (Wed, 10 May 2017) | 4 lines

test_exception.rb: test_machine_stackoverflow_by_trace

* test/ruby/test_exception.rb (test_machine_stackoverflow_by_trace):
  move from test_trace.rb and rename, to be excluded by the default.
------------------------------------------------------------------------
r58646 | nobu | 2017-05-10 09:39:26 +0900 (Wed, 10 May 2017) | 1 line

adjust styles [ci skip]
------------------------------------------------------------------------
r58645 | nobu | 2017-05-10 09:20:02 +0900 (Wed, 10 May 2017) | 1 line

math.c (ruby_lgamma_r): reduce duplicate code
------------------------------------------------------------------------
r58644 | normal | 2017-05-10 04:52:10 +0900 (Wed, 10 May 2017) | 11 lines

test/thread: relax internal implementation check in error message

Queue, SizedQueue, and ConditionVariable internal implementation
should not be tied to using arrays.  Implementation details can
change and I am working on a change to remove the dependency on
arrays (as others may attempt, too) by using ccan/list for the
waiter list.

* test/thread/test_cv.rb (test_dump): remove check for Array
* test/thread/test_queue.rb (test_dump): ditto
  [ruby-core:81001] [Misc #13541]
------------------------------------------------------------------------
r58643 | stomar | 2017-05-10 03:56:22 +0900 (Wed, 10 May 2017) | 7 lines

date_core.c: fix docs for %Z format

* ext/date/date_core.c: [DOC] fix documentation for %Z format
  of {Date,DateTime}.strftime.

  Reported by Damon Timm.  Based on a patch by nano.
  [ruby-core:79602] [Bug #13231] [Fix GH-1565]
------------------------------------------------------------------------
r58642 | naruse | 2017-05-10 02:41:10 +0900 (Wed, 10 May 2017) | 1 line

dump stub specifications if nil
------------------------------------------------------------------------
r58641 | nobu | 2017-05-10 02:20:00 +0900 (Wed, 10 May 2017) | 7 lines

parse.y: brace after literal arg

* parse.y (symbol, dsym, parser_set_number_literal, parser_yylex):
  set state to END too not only ENDARG and after a literal, so
  that a left brace after it should be a primary block bound to
  the literal, which causes syntax error.
  [ruby-core:81037] [Bug #13547]
------------------------------------------------------------------------
r58640 | nobu | 2017-05-10 02:12:43 +0900 (Wed, 10 May 2017) | 6 lines

parse.y: do after cmdarg in paren

* parse.y (parser_yylex): set state to ENDARG after a string
  literal, so that `do` after a literal should be `do_block` and
  bound to the outer method, as well as a numeric/symbol literal.
  [ruby-core:72482] [Bug #11873]
------------------------------------------------------------------------
r58639 | svn | 2017-05-10 02:02:08 +0900 (Wed, 10 May 2017) | 1 line

* 2017-05-10
------------------------------------------------------------------------
r58638 | nobu | 2017-05-10 02:02:07 +0900 (Wed, 10 May 2017) | 4 lines

test_syntax.rb: test_brace_after_local_variable

* test/ruby/test_syntax.rb (test_brace_after_local_variable):
  another test using braces.  [Bug #11873]
------------------------------------------------------------------------
r58621 | nobu | 2017-05-09 23:11:46 +0900 (Tue, 09 May 2017) | 4 lines

string.c: fix r58618

* string.c (unicode_normalize_common): aggregation type cannot be
  initialized with dynamic values, in C89.
------------------------------------------------------------------------
r58618 | duerst | 2017-05-09 20:13:45 +0900 (Tue, 09 May 2017) | 6 lines

replace hand-written argument check by call to rb_scan_args in unicode_normalize_common

In string.c, replace hand-written argument count check by call to rb_scan_args.
This allows to use rb_funcallv once, rather than using rb_funcall twice.
Thanks to Hanmac (Hans Mackowiak) for the idea, see
https://bugs.ruby-lang.org/issues/11078#note-7.
------------------------------------------------------------------------
r58617 | duerst | 2017-05-09 19:45:46 +0900 (Tue, 09 May 2017) | 6 lines

add explanations about status of module UnicodeNormalize

In lib/unicode_normalize/normalize.rb, add explanations and clarifications
about the status of the files and the module. [ci skip]
This is in response to discussions at https://github.com/ruby/spec/pull/433
and https://bugs.ruby-lang.org/issues/5481#note-58.
------------------------------------------------------------------------
r58616 | naruse | 2017-05-09 16:47:28 +0900 (Tue, 09 May 2017) | 1 line

Add one more guard to avoid mixing nil into latest_specs
------------------------------------------------------------------------
r58615 | normal | 2017-05-09 15:17:01 +0900 (Tue, 09 May 2017) | 3 lines

fixup r58614 for raspi3 and maybe other systems with odd compile

[ruby-core:81048]
------------------------------------------------------------------------
r58614 | normal | 2017-05-09 14:06:41 +0900 (Tue, 09 May 2017) | 7 lines

rb_execution_context_t: move stack, stack_size and cfp from rb_thread_t

The goal is to reduce rb_context_t and rb_fiber_t size
by removing the need to store the entire rb_thread_t in
there.

[ruby-core:81045] Work-in-progress: soon, we will move more fields here.
------------------------------------------------------------------------
r58613 | nobu | 2017-05-09 11:55:51 +0900 (Tue, 09 May 2017) | 5 lines

Ignore fail on non empty ext and gems [ci skip]

* Makefile.in ({ext,gems}/{distclean,realclean}): ignore fail on
  removal of non empty directories.  these directories should not
  be empty when in-place build.
------------------------------------------------------------------------
r58612 | svn | 2017-05-09 01:00:02 +0900 (Tue, 09 May 2017) | 1 line

* 2017-05-09
------------------------------------------------------------------------
r58611 | kazu | 2017-05-09 01:00:00 +0900 (Tue, 09 May 2017) | 1 line

Add mspec and rubyspec to LEGAL [ci skip]
------------------------------------------------------------------------
r58610 | hsbt | 2017-05-08 22:14:24 +0900 (Mon, 08 May 2017) | 3 lines

Translate missing rdoc comment for opt_send_without_block.

  fix [GH-1608], Patch by @k0kubun
------------------------------------------------------------------------
r58609 | nobu | 2017-05-08 14:31:02 +0900 (Mon, 08 May 2017) | 4 lines

separate constdefs.c and constdefs.h

* ext/socket/depend: separate constdefs.c and constdefs.h so that
  only one process will run when parallel building.
------------------------------------------------------------------------
r58608 | normal | 2017-05-08 10:59:17 +0900 (Mon, 08 May 2017) | 10 lines

reduce rb_mutex_t size from 80 bytes to 72 bytes on 64-bit

We can use existing RVALUE flags to avoid adding a 4-byte
integer to store a boolean flag.  This integer cost us 8 bytes
due to default (lack of) struct packing on x86-64

* thread_sync.c (MUTEX_ALLOW_TRAP): define as FL_USER1
  (struct rb_mutex_struct): remove allow_trap
  (rb_mutex_lock): adjust for flag check
  (rb_mutex_allow_trap): adjust for flag set/unset
------------------------------------------------------------------------
r58607 | svn | 2017-05-08 10:59:13 +0900 (Mon, 08 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58606 | normal | 2017-05-08 10:59:12 +0900 (Mon, 08 May 2017) | 5 lines

benchmark/bm_vm2_fiber_switch.rb: check for fiber performance

There are currently no benchmarks for Fiber performance, I
should've committed this years ago when [Feature #10341] was
implemented.
------------------------------------------------------------------------
r58605 | svn | 2017-05-08 09:18:54 +0900 (Mon, 08 May 2017) | 1 line

* 2017-05-08
------------------------------------------------------------------------
r58604 | normal | 2017-05-08 09:18:53 +0900 (Mon, 08 May 2017) | 57 lines

reduce rb_mutex_t size from 160 to 80 bytes on 64-bit

Instead of relying on a native condition variable and mutex for
every Ruby Mutex object, use a doubly linked-list to implement a
waiter queue in the Mutex.  The immediate benefit of this is
reducing the size of every Mutex object, as some projects have
many objects requiring synchronization.

In the future, this technique using a linked-list and on-stack
list node (struct mutex_waiter) should allow us to easily
transition to M:N threading model, as we can avoid the native
thread dependency to implement Mutex.

We already do something similar for autoload in variable.c,
and this was inspired by the Linux kernel wait queue (as
ccan/list is inspired by the Linux kernel linked-list).

Finaly, there are big performance improvements for Mutex
benchmarks, especially in contended cases:

measure target: real

name            |trunk  |built
----------------|------:|------:
loop_whileloop2 |  0.149|  0.148
vm2_mutex*      |  0.893|  0.651
vm_thread_mutex1|  0.809|  0.624
vm_thread_mutex2|  2.608|  0.628
vm_thread_mutex3| 28.227|  0.881

Speedup ratio: compare with the result of `trunk' (greater is better)

name            |built
----------------|------:
loop_whileloop2 |  1.002
vm2_mutex*      |  1.372
vm_thread_mutex1|  1.297
vm_thread_mutex2|  4.149
vm_thread_mutex3| 32.044

Tested on AMD FX-8320 8-core at 3.5GHz

* thread_sync.c (struct mutex_waiter): new on-stack struct
  (struct rb_mutex_struct): remove native lock/cond, use ccan/list
  (rb_mutex_num_waiting): new function for debug_deadlock_check
  (mutex_free): remove native_*_destroy
  (mutex_alloc): initialize waitq, remove native_*_initialize
  (rb_mutex_trylock): remove native_mutex_{lock,unlock}
  (lock_func): remove
  (lock_interrupt): remove
  (rb_mutex_lock): rewrite waiting path to use native_sleep + ccan/list
  (rb_mutex_unlock_th): rewrite to wake up from native_sleep
  using rb_threadptr_interrupt
  (rb_mutex_abandon_all): empty waitq
* thread.c (debug_deadlock_check): update for new struct
  (rb_check_deadlock): ditto
  [ruby-core:80913] [Feature #13517]
------------------------------------------------------------------------
r58603 | nobu | 2017-05-07 23:21:10 +0900 (Sun, 07 May 2017) | 4 lines

relative path as VPATH

* common.mk (ripper.c): use relative path as VPATH instead of
  absolute path of the current working directory.
------------------------------------------------------------------------
r58602 | nobu | 2017-05-07 23:03:52 +0900 (Sun, 07 May 2017) | 1 line

parse.y: export rb_parser_fatal for ripper
------------------------------------------------------------------------
r58601 | nobu | 2017-05-07 22:40:56 +0900 (Sun, 07 May 2017) | 3 lines

stale targets

* common.mk (update-mspec, update-rubyspec): empty stale targets.
------------------------------------------------------------------------
r58600 | nobu | 2017-05-07 22:06:34 +0900 (Sun, 07 May 2017) | 4 lines

extract prereq.status

* tool/make-snapshot (package): extract static config values for
  prereq and override dynamic values at runtime.
------------------------------------------------------------------------
r58599 | eregon | 2017-05-07 21:26:25 +0900 (Sun, 07 May 2017) | 1 line

Update specs to follow newlines added by r58596
------------------------------------------------------------------------
r58598 | eregon | 2017-05-07 21:17:21 +0900 (Sun, 07 May 2017) | 1 line

Rename spec/README to spec/README.md
------------------------------------------------------------------------
r58597 | svn | 2017-05-07 21:05:45 +0900 (Sun, 07 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58596 | svn | 2017-05-07 21:05:36 +0900 (Sun, 07 May 2017) | 1 line

* remove trailing spaces, append newline at EOF.
------------------------------------------------------------------------
r58595 | eregon | 2017-05-07 21:04:49 +0900 (Sun, 07 May 2017) | 8 lines

Add in-tree mspec and ruby/spec

* For easier modifications of ruby/spec by MRI developers.
* .gitignore: track changes under spec.
* spec/mspec, spec/rubyspec: add in-tree mspec and ruby/spec.
  These files can therefore be updated like any other file in MRI.
  Instructions are provided in spec/README.
  [Feature #13156] [ruby-core:79246]
------------------------------------------------------------------------
r58594 | eregon | 2017-05-07 21:01:26 +0900 (Sun, 07 May 2017) | 3 lines

make update-rubyspec is no longer needed

* Kept a no-op for compatibility.
------------------------------------------------------------------------
r58593 | eregon | 2017-05-07 21:01:12 +0900 (Sun, 07 May 2017) | 1 line

Update README about ruby/spec
------------------------------------------------------------------------
r58592 | eregon | 2017-05-07 21:00:58 +0900 (Sun, 07 May 2017) | 2 lines

* spec/default.mspec: only require rbconfig if is it not already.
  Useful when running spec/mspec/bin/mspec directly.
------------------------------------------------------------------------
r58591 | normal | 2017-05-07 17:06:02 +0900 (Sun, 07 May 2017) | 17 lines

vm_core.h (rb_thread_t): use 32-bit running_time_us

The current range based current values of:

	TIME_QUANTUM_USEC=100000
	RUBY_THREAD_PRIORITY_MAX=3
	RUBY_THREAD_PRIORITY_MIN=-3

Gives a range of 12500..800000, plenty enough for a 32-bit
integer.  Clamping this also reduces potential implementation
bugs between 32-bit and 64-bit platforms.

I may consider a further reduction to uint16_t in the future
for M:N threading, but some users may want slightly larger
time quantums.

* vm_core.h (rb_thread_t): use 32-bit running_time_us
------------------------------------------------------------------------
r58590 | normal | 2017-05-07 16:38:30 +0900 (Sun, 07 May 2017) | 7 lines

io.c (do_fcntl): update max FD for F_DUPFD_CLOEXEC, too

Somebody may pass 1030 (the value of F_DUPFD_CLOEXEC) to IO#fcntl
because they copied code from somewhere else.  Ensure we know
about FDs created that way.

* io.c (do_fcntl): update max FD for F_DUPFD_CLOEXEC, too
------------------------------------------------------------------------
r58589 | stomar | 2017-05-07 16:18:10 +0900 (Sun, 07 May 2017) | 1 line

NEWS: Integer#{round,floor,ceil,truncate} [Bug #13420]
------------------------------------------------------------------------
r58588 | svn | 2017-05-07 13:26:38 +0900 (Sun, 07 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58587 | normal | 2017-05-07 13:26:37 +0900 (Sun, 07 May 2017) | 10 lines

variable.c: cleanup waitq upon thread death

* variable.c (autoload_reset): use idempotent list_del_init
  (autoload_sleep): moved code from rb_autoload_load
  (autoload_sleep_done): cleanup for use with rb_ensure
  (rb_autoload_load): ensure list delete happens in case the
  thread dies during sleep
* test/ruby/bug-13526.rb: new script for separate execution
* test/ruby/test_autoload.rb (test_bug_13526): new test
  [ruby-core:81016] [Bug #13526]
------------------------------------------------------------------------
r58586 | stomar | 2017-05-07 04:58:12 +0900 (Sun, 07 May 2017) | 12 lines

make Integer#{round,floor,ceil,truncate} always return integer

* numeric.c (int_round): return integer (self) instead of float
  for Integer#round with positive ndigits argument, because
  conversion to float introduces errors for large integers.
* numeric.c (int_floor): ditto for Integer#floor.
* numeric.c (int_ceil): ditto for Integer#ceil.
* numeric.c (int_truncate): ditto for Integer#truncate.

* test/ruby/test_integer.rb: adjust test cases and add some more.

[ruby-core:80645] [Bug #13420]
------------------------------------------------------------------------
r58585 | svn | 2017-05-07 00:14:59 +0900 (Sun, 07 May 2017) | 1 line

* 2017-05-07
------------------------------------------------------------------------
r58584 | nobu | 2017-05-07 00:14:58 +0900 (Sun, 07 May 2017) | 6 lines

ripper/lexer.rb: nested indented heredoc

* ext/ripper/lib/ripper/lexer.rb (on_heredoc_dedent): insert
  stripped leading spaces as `on_ignored_sp` elements, so that the
  original source can be reconsructed.
  [ruby-core:80977] [Bug #13536]
------------------------------------------------------------------------
r58583 | nobu | 2017-05-06 23:12:30 +0900 (Sat, 06 May 2017) | 4 lines

fix up r58573

* common.mk: make the directory for extension shared library with
  the timestamp directory.
------------------------------------------------------------------------
r58582 | stomar | 2017-05-06 16:28:40 +0900 (Sat, 06 May 2017) | 3 lines

math.c: improve docs for Math.sqrt

* math.c: [DOC] mention Integer.sqrt in docs for Math.sqrt.
------------------------------------------------------------------------
r58581 | stomar | 2017-05-06 16:18:49 +0900 (Sat, 06 May 2017) | 4 lines

numeric.c: remove mention of Bignum from docs

* numeric.c: [DOC] remove mention of Bignum from Integer#{+,-,*,/},
  the return type does not depend on magnitude anymore.
------------------------------------------------------------------------
r58580 | stomar | 2017-05-06 16:17:41 +0900 (Sat, 06 May 2017) | 9 lines

numeric.c: revise docs

* numeric.c: [DOC] revise docs for Numeric, Integer, Float:
  * nodoc Numeric#singleton_method_added
  * mention that result for Integer#** might also be Complex
  * add / simplify / fix some examples
  * mention aliases
  * fix rdoc formatting, typos, grammar
  * clarifications and other improvements
------------------------------------------------------------------------
r58579 | duerst | 2017-05-06 13:42:58 +0900 (Sat, 06 May 2017) | 2 lines

delete enc/prelude.rb, because no longer needed

------------------------------------------------------------------------
r58578 | duerst | 2017-05-06 12:12:26 +0900 (Sat, 06 May 2017) | 3 lines

delete lib/unicode_normalize.rb, because no longer needed

(all content has been moved to string.c)
------------------------------------------------------------------------
r58577 | duerst | 2017-05-06 11:54:02 +0900 (Sat, 06 May 2017) | 5 lines

remove enc/prelude.rb from list of prelude files in common.mk

(This is a retry of r58559, it should work now that rubyspec does
no longer check for unicode_normalized to be required. See also
https://github.com/ruby/spec/commit/41176ead68b14011658c8abd0ebd67df2ae632fb.)
------------------------------------------------------------------------
r58576 | nobu | 2017-05-06 10:33:04 +0900 (Sat, 06 May 2017) | 5 lines

share `@@accept_charset`

* lib/cgi/{core,util}.rb: include CGI::Util not only extending, to
  share `@@accept_charset` class variable, so that it is always
  accessible.  [ruby-core:80986] [Bug #13539]
------------------------------------------------------------------------
r58575 | nobu | 2017-05-06 10:01:52 +0900 (Sat, 06 May 2017) | 6 lines

string.c: fix types

* string.c (id_normalize, id_normalized_p): fix types, IDs should
  be ID.

* string.c (unicode_normalize_common): ditto.
------------------------------------------------------------------------
r58574 | svn | 2017-05-06 09:54:23 +0900 (Sat, 06 May 2017) | 1 line

* 2017-05-06
------------------------------------------------------------------------
r58573 | nobu | 2017-05-06 09:54:22 +0900 (Sat, 06 May 2017) | 4 lines

timestamp for extensions

* common.mk: use the same timestamp file for architecture specific
  directory as the file used in Makefiles under ext.
------------------------------------------------------------------------
r58572 | svn | 2017-05-05 01:47:18 +0900 (Fri, 05 May 2017) | 1 line

* 2017-05-05
------------------------------------------------------------------------
r58571 | normal | 2017-05-05 01:47:17 +0900 (Fri, 05 May 2017) | 10 lines

benchmark/bm_vm_thread_pass_flood.rb: add comment

I was about to write off this benchmark while working on GVL
improvements on multi-core systems.

However I noticed it exposes a weakness in my work-in-progress
code when I tested on an old single CPU system.  Further testing
reveals setting CPU affinity ("schedtool -a 0x1" on Linux) on a
modern multi-core system is enough to reproduce the problem
exposed by this benchmark.
------------------------------------------------------------------------
r58570 | mame | 2017-05-04 22:42:47 +0900 (Thu, 04 May 2017) | 5 lines

time.c: avoid taking a pointer to a member of packed struct

clang 4.0.0 emitted a warning: "taking address of packed member
'subsecx' of class or structure 'vtm' may result in an unaligned
pointer value [-Waddress-of-packed-member]".
------------------------------------------------------------------------
r58569 | stomar | 2017-05-04 22:19:43 +0900 (Thu, 04 May 2017) | 1 line

string.c: [DOC] improve docs for String.new
------------------------------------------------------------------------
r58568 | ktsj | 2017-05-04 19:17:12 +0900 (Thu, 04 May 2017) | 3 lines

internal.h (rb_gc_resurrect): remove stale declaration

rb_gc_resurrect is no longer defined since r47444.
------------------------------------------------------------------------
r58567 | ktsj | 2017-05-04 17:59:01 +0900 (Thu, 04 May 2017) | 1 line

string.c: [DOC] Properly refer to keyword argument by its name
------------------------------------------------------------------------
r58566 | ktsj | 2017-05-04 17:58:59 +0900 (Thu, 04 May 2017) | 9 lines

dir.c: [DOC] Properly refer to keyword argument by its name [Fix GH-1543]

enc is the name of the variable used in the example, not the name of the
keyword argument (encoding).

The documentation used to wrongly suggest that the keyword argument name was
"enc" which could cause people try try to call `Dir.open("thing", enc: "utf-8")`

Author: Olivier Lacan <hi@olivierlacan.com>
------------------------------------------------------------------------
r58565 | normal | 2017-05-04 17:55:54 +0900 (Thu, 04 May 2017) | 15 lines

benchmark/bm_vm1_gc_wb_*.rb: fix GC.start args for invalid keyword

"lazy_sweep" does not appear to have ever been a valid kwarg
for GC.start, however the opposite of "lazy_sweep" appears
to be "immediate_sweep".  So use immediate_sweep, and flip
the boolean value of each arg.

I guess this only started failing with r56981 in Dec 2016
("class.c: missing unknown_keyword_error",
 commit e3f0cca2f26ba44c810ac980cdff7dda129ae533)

* benchmark/bm_vm1_gc_wb_ary.rb: "lazy_sweep: false" => "immediate_sweep: true"
* benchmark/bm_vm1_gc_wb_ary_promoted.rb: ditto
* benchmark/bm_vm1_gc_wb_obj.rb: ditto
* benchmark/bm_vm1_gc_wb_obj_promoted.rb: ditto
------------------------------------------------------------------------
r58564 | ktsj | 2017-05-04 17:13:17 +0900 (Thu, 04 May 2017) | 1 line

gems/bundled_gems: Update to power_assert 1.0.2
------------------------------------------------------------------------
r58563 | normal | 2017-05-04 16:18:33 +0900 (Thu, 04 May 2017) | 5 lines

.gitignore: ignore benchmark/bm_require.data

Followup-to r58562 in SVN

* .gitignore: ignore benchmark/bm_require.data
------------------------------------------------------------------------
r58562 | normal | 2017-05-04 16:08:39 +0900 (Thu, 04 May 2017) | 2 lines

benchmark: ignore bm_require.data/

------------------------------------------------------------------------
r58561 | nobu | 2017-05-04 15:54:11 +0900 (Thu, 04 May 2017) | 5 lines

parse.y: make shared string modifiable

* parse.y (dedent_string): ensure that the string is modifiable,
  not to set the length of shared string.
  [ruby-core:80987] [Bug #13540]
------------------------------------------------------------------------
r58560 | duerst | 2017-05-04 14:07:20 +0900 (Thu, 04 May 2017) | 1 line

revert 58559, because it fails on travis (rubyspec problem)
------------------------------------------------------------------------
r58559 | duerst | 2017-05-04 13:53:33 +0900 (Thu, 04 May 2017) | 1 line

remove enc/prelude.rb from list of prelude files in common.mk
------------------------------------------------------------------------
r58558 | duerst | 2017-05-04 11:16:27 +0900 (Thu, 04 May 2017) | 6 lines

refactor common parts of unicode normalization functions into unicode_normalize_common

In string.c, refactor the common parts (requiring of unicode_normalize/normalize.rb,
check of number of arguments) of the unicode normalization functions
(rb_str_unicode_normalize, rb_str_unicode_normalize_bang, rb_str_unicode_normalized_p)
into the new function unicode_normalize_common.
------------------------------------------------------------------------
r58557 | svn | 2017-05-04 11:13:12 +0900 (Thu, 04 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58556 | normal | 2017-05-04 11:13:11 +0900 (Thu, 04 May 2017) | 8 lines

benchmark: new single-threaded read/write benchmark with pipe

This is currently for testing GVL performance in the uncontended
case: IO#write and IO#read unconditionally release GVL for
blocking I/O with pipe.

It will also be interesting to see how this changes if we switch
to M:N threading model.
------------------------------------------------------------------------
r58555 | duerst | 2017-05-04 11:00:19 +0900 (Thu, 04 May 2017) | 9 lines

move definition of String#unicode_normalized? to C to make sure it is documented

* lib/unicode_normalize.rb: Remove definition of String#unicode_normalized?
  (including documentation). Leave a comment explaining that the file is now empty.
* string.c: Define String#unicode_normalized? in rb_str_unicode_normalized_p in C,
  (including documentation)
* lib/unicode_normalize/normalize.rb: Remove (re)definition of
  String#unicode_normalized? to avoid warnings (when $VERBOSE==true) and
  problems when String is frozen
------------------------------------------------------------------------
r58554 | svn | 2017-05-04 10:36:53 +0900 (Thu, 04 May 2017) | 1 line

* 2017-05-04
------------------------------------------------------------------------
r58553 | duerst | 2017-05-04 10:36:52 +0900 (Thu, 04 May 2017) | 9 lines

move definition of String#unicode_normalize! to C to make sure it is documented

* lib/unicode_normalize.rb: Remove definition of String#unicode_normalize!
  (including documentation)
* string.c: Define String#unicode_normalize! in rb_str_unicode_normalize_bang in C,
  (including documentation)
* lib/unicode_normalize/normalize.rb: Remove (re)definition of
  String#unicode_normalize! to avoid warnings (when $VERBOSE==true) and
  problems when String is frozen
------------------------------------------------------------------------
r58552 | kou | 2017-05-03 21:25:17 +0900 (Wed, 03 May 2017) | 8 lines

rss: Accept empty text element as valid element

Parser has been accepted it but XML serializer wasn't accepted.

Reported by stefano frabetti. Thanks!!!

[ruby-core:80965] [Bug #13531]

------------------------------------------------------------------------
r58551 | svn | 2017-05-03 21:18:37 +0900 (Wed, 03 May 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r58550 | duerst | 2017-05-03 21:18:37 +0900 (Wed, 03 May 2017) | 9 lines

move definition of String#unicode_normalize to C to make sure it is documented

* lib/unicode_normalize.rb: Remove definition of String#unicode_normalize
  (including documentation)
* string.c: Define String#unicode_normalize in rb_str_unicode_normalize in C,
  (including documentation)
* lib/unicode_normalize/normalize.rb: Remove (re)definition of
  String#unicode_normalize to avoid warnings (when $VERBOSE==true) and
  problems when String is frozen
------------------------------------------------------------------------
r58549 | shugo | 2017-05-03 20:32:22 +0900 (Wed, 03 May 2017) | 3 lines

net/imap: handle timeouts

Patch by Pavel Rosicky.  [Feature #13379] [ruby-core:80440]
------------------------------------------------------------------------
r58548 | kazu | 2017-05-03 11:02:50 +0900 (Wed, 03 May 2017) | 3 lines

Use `dd` instead of `head -c`

[Bug #13538] [ruby-dev:50106]
------------------------------------------------------------------------
r58547 | kazu | 2017-05-03 10:44:52 +0900 (Wed, 03 May 2017) | 1 line

Fix NoMethodError [ci skip]
------------------------------------------------------------------------
r58546 | svn | 2017-05-03 02:48:10 +0900 (Wed, 03 May 2017) | 1 line

* 2017-05-03
------------------------------------------------------------------------
r58545 | nobu | 2017-05-03 02:48:10 +0900 (Wed, 03 May 2017) | 5 lines

ripper/lexer.rb: nested indented heredoc

* ext/ripper/lib/ripper/lexer.rb (on_heredoc_dedent): fix for
  nested indedented here documents, where `Elem`s are nested too.
  [ruby-core:80977] [Bug #13536]
------------------------------------------------------------------------
r58544 | nobu | 2017-05-02 22:16:04 +0900 (Tue, 02 May 2017) | 4 lines

.travis.yml: tweek after-update

* .travis.yml (before_script): get rid of making miniruby at
  after-update.
------------------------------------------------------------------------
r58543 | nobu | 2017-05-02 21:45:07 +0900 (Tue, 02 May 2017) | 1 line

mkconfig.rb: remove cross_compiling
------------------------------------------------------------------------
r58542 | nobu | 2017-05-02 21:45:04 +0900 (Tue, 02 May 2017) | 4 lines

common.mk: BOOTSTRAPRUBY for enc.mk

* common.mk ($(ENC_MK)): use $(BOOTSTRAPRUBY) as well as $(RBCONFIG),
  instead of $(MINIRUBY).
------------------------------------------------------------------------
r58541 | kazu | 2017-05-02 20:26:28 +0900 (Tue, 02 May 2017) | 1 line

Use `\A` and `\z` instead of `^` and `$` [ci skip]
------------------------------------------------------------------------
r58540 | nobu | 2017-05-02 16:35:20 +0900 (Tue, 02 May 2017) | 4 lines

internal.h: rb_raise_static

* internal.h (rb_raise_static): raise with a static message string
  literal.
------------------------------------------------------------------------
r58539 | duerst | 2017-05-02 14:46:31 +0900 (Tue, 02 May 2017) | 6 lines

remove unnecessary conditions in lib/unicode_normalize.rb

Because the methods in lib/unicode_normalize.rb are overwritten
by those in lib/unicode_normalize/normalize.rb as soon as one
of them is called, the check for whether UnicodeNormalized is
defined or not is no longer necessary.
------------------------------------------------------------------------
r58538 | duerst | 2017-05-02 14:34:25 +0900 (Tue, 02 May 2017) | 5 lines

rework definition of String#unicode_normalize! and #unicode_normalized?

simplify String#unicode_normalize! and #unicode_normalized?
in lib/unicode_normalize.rb by redefining them
in lib/unicode_normalize/normalize.rb
------------------------------------------------------------------------
r58537 | duerst | 2017-05-02 14:15:04 +0900 (Tue, 02 May 2017) | 4 lines

rework definition of String#unicode_normalize

simplify String#unicode_normalize in lib/unicode_normalize.rb
by redefining it in lib/unicode_normalize/normalize.rb
------------------------------------------------------------------------
r58536 | svn | 2017-05-02 11:40:47 +0900 (Tue, 02 May 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58535 | normal | 2017-05-02 11:40:46 +0900 (Tue, 02 May 2017) | 11 lines

more benchmarks for SizedQueue and ConditionVariable

I'm working on patches to improve everything in thread_sync.c,
add these to track progress.

* benchmark/bm_vm_thread_sized_queue.rb: add description
* benchmark/bm_vm_thread_condvar1.rb: new benchmark
* benchmark/bm_vm_thread_condvar2.rb: ditto
* benchmark/bm_vm_thread_sized_queue2.rb: ditto
* benchmark/bm_vm_thread_sized_queue3.rb: ditto
* benchmark/bm_vm_thread_sized_queue4.rb: ditto
------------------------------------------------------------------------
r58534 | kosaki | 2017-05-02 11:19:32 +0900 (Tue, 02 May 2017) | 4 lines

nogvl_wait_for_single_fd must wait as its name

poll(fds, n, 0) mean no timeout and immediately return. If you want to
wait something, you need to use -1 instead.
------------------------------------------------------------------------
r58533 | svn | 2017-05-02 00:17:33 +0900 (Tue, 02 May 2017) | 1 line

* 2017-05-02
------------------------------------------------------------------------
r58532 | nobu | 2017-05-02 00:17:32 +0900 (Tue, 02 May 2017) | 4 lines

thread.c: suppress warnings [ci skip]

* thread.c (fill_thread_id_string): cast to void pointer to
  suppress warnings when pthread_t is not pointer type.
------------------------------------------------------------------------
r58531 | svn | 2017-05-01 20:40:47 +0900 (Mon, 01 May 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r58530 | hsbt | 2017-05-01 20:40:46 +0900 (Mon, 01 May 2017) | 11 lines

Merge rubygems-2.6.12 from rubygems/rubygems.

  * Details of changes:
    https://github.com/rubygems/rubygems/blob/009080040279282d7b8ddd09acab41719cb4ba00/History.txt#L3

  * I kept ko1's commmit related thread issue. It's not merged 2.6 branch on rubygems.
    https://github.com/ruby/ruby/commit/1721dfa0ea963a85d4ac1e3415eb18ef427d4d36

  * I removed test_realworld_default_gem from rubygems-2.6.12. It fails on
    Ruby trunk. Because it's differences of test suite and environment.
    https://github.com/rubygems/rubygems/pull/1899
------------------------------------------------------------------------
r58529 | hsbt | 2017-05-01 19:20:35 +0900 (Mon, 01 May 2017) | 4 lines

Merge gemspec from ruby/webrick.

  * Bump version to 1.4.0.beta1. Because https://rubygems.org/gems/webrick
    is already reserved old version of webrick.
------------------------------------------------------------------------
r58528 | nobu | 2017-05-01 16:50:53 +0900 (Mon, 01 May 2017) | 5 lines

object.c: Kernel#yield_self

* object.c (rb_obj_yield_self): new method which yields the
  receiver and returns the result.
  [ruby-core:46320] [Feature #6721]
------------------------------------------------------------------------
r58527 | kazu | 2017-05-01 11:42:34 +0900 (Mon, 01 May 2017) | 4 lines

Fix typo in documentation [ci skip]

[Fix GH-1599]
Author:    Liam Sean Brady <liamseanbrady@gmail.com>
------------------------------------------------------------------------
r58526 | nobu | 2017-05-01 11:01:38 +0900 (Mon, 01 May 2017) | 5 lines

zlib.c: no buf_filled in zstream

* ext/zlib/zlib.c (zstream): manage capacity and size of `buf`
  instead of size and separated member `buf_filled`.  reported by
  Christian Jalio (jalio) at https://hackerone.com/reports/211958
------------------------------------------------------------------------
r58525 | nobu | 2017-05-01 09:35:02 +0900 (Mon, 01 May 2017) | 4 lines

zlib.c: zstream_buffer_ungetbyte

* ext/zlib/zlib.c (zstream_buffer_ungetbyte): simplify by using
  zstream_buffer_ungets().
------------------------------------------------------------------------
r58524 | nobu | 2017-05-01 09:35:00 +0900 (Mon, 01 May 2017) | 5 lines

zlib.c: zstream_expand_buffer_non_stream

* ext/zlib/zlib.c (zstream_expand_buffer_non_stream): rename from
  zstream_expand_buffer_without_gvl() and replace duplicate code
  in zstream_expand_buffer().
------------------------------------------------------------------------
r58523 | nobu | 2017-05-01 09:32:56 +0900 (Mon, 01 May 2017) | 7 lines

rational.c: canonicalization case

* rational.c (float_numerator, float_denominator): fix for
  canonicalization case where `Float#to_r` could return an Integer
  not a Rational.  although mathn.rb has been removed in the
  trunk, fix for the backport purpose.
  [ruby-core:80942] [Bug #13528]
------------------------------------------------------------------------
r58521 | svn | 2017-05-01 06:18:31 +0900 (Mon, 01 May 2017) | 1 line

* 2017-05-01
------------------------------------------------------------------------
r58520 | usa | 2017-05-01 06:18:31 +0900 (Mon, 01 May 2017) | 4 lines

setup.mak have to handle `GIT` and `HAVE_GIT`

* win32/setup.mak: seems to be forgotten to commit at r58295.

------------------------------------------------------------------------
r58514 | usa | 2017-04-30 22:34:18 +0900 (Sun, 30 Apr 2017) | 4 lines

Typo

* tool/generate-backport-changelog.rb: fixed a typo.

------------------------------------------------------------------------
r58512 | nobu | 2017-04-30 19:53:42 +0900 (Sun, 30 Apr 2017) | 4 lines

git-refresh: fix for Solaris

* tool/git-refresh: expand for each words.
  [ruby-dev:50102] [Bug #13522]
------------------------------------------------------------------------
r58511 | normal | 2017-04-30 18:06:39 +0900 (Sun, 30 Apr 2017) | 3 lines

thread_sync.c: document SizedQueue#clear correctly [ci skip]

* thread_sync.c (rb_szqueue_clear): fix class name in RDoc
------------------------------------------------------------------------
r58510 | svn | 2017-04-30 16:24:37 +0900 (Sun, 30 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58509 | normal | 2017-04-30 16:24:36 +0900 (Sun, 30 Apr 2017) | 4 lines

new benchmark for SizedQueue

The performance of SizedQueue is a bit more complex than
regular Queue, so it deserves a separate benchmark.
------------------------------------------------------------------------
r58508 | svn | 2017-04-30 12:52:07 +0900 (Sun, 30 Apr 2017) | 1 line

* 2017-04-30
------------------------------------------------------------------------
r58507 | nobu | 2017-04-30 12:52:06 +0900 (Sun, 30 Apr 2017) | 5 lines

git-refresh: fix for Solaris

* tool/git-refresh: unset variable `branch` if it is null, to get
  rid of substitutions which are not supported old Solaris.
  [ruby-dev:50102] [Bug #13522]
------------------------------------------------------------------------
r58506 | normal | 2017-04-29 19:50:59 +0900 (Sat, 29 Apr 2017) | 8 lines

load.c: remove a redundant rb_str_freeze call

rb_file_expand_path_fast already performs the buffer shrinking
rb_str_freeze does (via expand_path macro in file.c); the
result of rb_fstring is always frozen, and that rb_fstring
call is the last use of `expanded_path` in its scope.

load.c (rb_construct_expanded_load_path): remove rb_str_freeze
------------------------------------------------------------------------
r58505 | nobu | 2017-04-29 19:27:46 +0900 (Sat, 29 Apr 2017) | 4 lines

proc.c: recursion loop

* proc.c (rb_block_min_max_arity, rb_method_entry_min_max_arity):
  turn loop by recursion into goto.
------------------------------------------------------------------------
r58504 | svn | 2017-04-29 11:58:54 +0900 (Sat, 29 Apr 2017) | 1 line

* 2017-04-29
------------------------------------------------------------------------
r58503 | nobu | 2017-04-29 11:58:53 +0900 (Sat, 29 Apr 2017) | 6 lines

node.h: sign-extend

* node.h (nd_line): should sign-extend.  shifting `VALUE` extends
  with zero bits if `sizeof(VALUE)` equals to `sizeof(int)`.  the
  zero bits are truncated if `sizeof(VALUE)` is bigger enough.
  [ruby-core:80920] [Bug #13523]
------------------------------------------------------------------------
r58502 | hsbt | 2017-04-28 21:14:56 +0900 (Fri, 28 Apr 2017) | 5 lines

Bump version to gdbm-2.0.0.beta1

  * Merge from ruby/gdbm.
  * gdbm gem is already registered in rubygems.org. I skip shipped
    version of 0.x and 1.x. Therefore We need to use 2.x.
------------------------------------------------------------------------
r58501 | nobu | 2017-04-28 20:42:58 +0900 (Fri, 28 Apr 2017) | 1 line

sprintf.c: remove unused variable
------------------------------------------------------------------------
r58500 | nobu | 2017-04-28 18:50:43 +0900 (Fri, 28 Apr 2017) | 1 line

parse.y: set_line_body is not used in ripper
------------------------------------------------------------------------
r58499 | nobu | 2017-04-28 17:06:33 +0900 (Fri, 28 Apr 2017) | 4 lines

parse.y: fix line in rescue

* parse.y (set_line_body, primary): fix line number of bodystmt as
  the beginning of the block.  [ruby-core:79388] [Bug #13181]
------------------------------------------------------------------------
r58498 | nobu | 2017-04-28 14:08:44 +0900 (Fri, 28 Apr 2017) | 4 lines

sprintf.c: ruby_ultoa

* sprintf.c (ruby_ultoa): prefixed to get rid of conflict with
  a MSVC library function.
------------------------------------------------------------------------
r58497 | nobu | 2017-04-28 11:10:51 +0900 (Fri, 28 Apr 2017) | 7 lines

sprintf.c: format by utility functions

* sprintf.c (rb_str_format, fmt_setup): format by utility
  functions in vsnprintf.c instead of `snprintf`.

* sprintf.c (rb_str_format): format and append by `rb_str_catf`
  instead of formatting by `snprintf` and then copy.
------------------------------------------------------------------------
r58496 | svn | 2017-04-28 11:05:55 +0900 (Fri, 28 Apr 2017) | 1 line

* 2017-04-28
------------------------------------------------------------------------
r58495 | nobu | 2017-04-28 11:05:54 +0900 (Fri, 28 Apr 2017) | 4 lines

sprintf.c: fix one-off bug

* sprintf.c (rb_str_format): `CHECK` just before `FILL_`, but
  after another `PUSH`.  fix one-off bug.
------------------------------------------------------------------------
r58494 | nobu | 2017-04-27 21:30:55 +0900 (Thu, 27 Apr 2017) | 6 lines

fix ripper prereq

* common.mk (ext/ripper/ripper.c): fix VPATH when out-of-place
  build, and id.h was created in the build directory too.  it has
  to include the build directory, i.e., the current directory
  before `cd`.
------------------------------------------------------------------------
r58493 | eregon | 2017-04-27 21:07:43 +0900 (Thu, 27 Apr 2017) | 6 lines

Send the backtrace of the circular require warning as a single String to Warning.warn

* load.c: send as a single string.
* error.c: expose the string formatted by rb_warning as rb_warning_string().
* test/ruby/test_exception.rb: update tests.
  [ruby-core:80850] [Bug #13505]
------------------------------------------------------------------------
r58492 | shyouhei | 2017-04-27 13:21:04 +0900 (Thu, 27 Apr 2017) | 37 lines

refactor newhash (revision 58463 another try) [fix GH-1600]

	* st.c (rb_hash_bulk_insert): new API to bulk insert entries
	  into a hash. Given arguments are first inserted into the
	  table at once, then reindexed. This is faster than inserting
	  things using rb_hash_aset() one by one.

	  This arrangement (rb_ prefixed function placed in st.c) is
	  unavoidable because it both touches table internal and write
	  barrier at once.

	* internal.h: delcare the new function.

	* hash.c (rb_hash_s_create): use the new function.

	* vm.c (core_hash_merge): ditto.

	* insns.def (newhash): ditto.

	* test/ruby/test_hash.rb: more coverage on hash creation.

	* test/ruby/test_literal.rb: ditto.

-----------------------------------------------------------
benchmark results:
minimum results in each 7 measurements.
Execution time (sec)
name    before  after
loop_whileloop2  0.136  0.137
vm2_bighash*     1.249  0.623

Speedup ratio: compare with the result of `before' (greater is better)
name    after
loop_whileloop2 0.996
vm2_bighash*    2.004


------------------------------------------------------------------------
r58491 | normal | 2017-04-27 12:16:39 +0900 (Thu, 27 Apr 2017) | 7 lines

load.c: make fstrings from C strings sooner

The underlying string objects will become fstrings anyways,
so create the fstring directly from the C string to reduce
intermediate garbage.

* load.c (rb_provide, rb_provide): create fstring
------------------------------------------------------------------------
r58490 | nobu | 2017-04-27 05:13:07 +0900 (Thu, 27 Apr 2017) | 5 lines

error.c: send as a single string

* error.c (rb_warn_m): send the arguments as a single string
  concatenated with a newline, so it can be filtered easily.
  [ruby-core:80875] [Feature #12944]
------------------------------------------------------------------------
r58489 | svn | 2017-04-27 05:09:35 +0900 (Thu, 27 Apr 2017) | 1 line

* 2017-04-27
------------------------------------------------------------------------
r58488 | stomar | 2017-04-27 05:09:34 +0900 (Thu, 27 Apr 2017) | 5 lines

error.c: improve docs

* error.c: [DOC] fix rdoc formatting (make sure `Warning.warn' is
  displayed verbatim; rdoc would render it as a link named `#warn'),
  use capitalized "Ruby", fix a typo.
------------------------------------------------------------------------
r58487 | nobu | 2017-04-26 17:11:32 +0900 (Wed, 26 Apr 2017) | 5 lines

error.c: splat warn arguments

* error.c (rb_warn_m): print array arguments with splatting.
  it is often used with `caller`.
  [ruby-core:80849] [Feature #12944]
------------------------------------------------------------------------
r58486 | nobu | 2017-04-26 09:30:05 +0900 (Wed, 26 Apr 2017) | 1 line

range.c: remove no longer used variable
------------------------------------------------------------------------
r58485 | normal | 2017-04-26 05:20:08 +0900 (Wed, 26 Apr 2017) | 1 line

thread_sync.c (rb_mutex_lock): spelling fix [ci skip]
------------------------------------------------------------------------
r58484 | eregon | 2017-04-26 04:34:07 +0900 (Wed, 26 Apr 2017) | 3 lines

Use require to load rbconfig in default.mspec

* Otherwise it would be loaded twice.
------------------------------------------------------------------------
r58483 | naruse | 2017-04-26 04:13:26 +0900 (Wed, 26 Apr 2017) | 1 line

suppress_warning
------------------------------------------------------------------------
r58482 | ko1 | 2017-04-26 02:50:34 +0900 (Wed, 26 Apr 2017) | 7 lines

add timeout.

* test/ruby/test_trace.rb (test_trace_stackoverflow): sometimes this test
  was stopped forever and killed by test process forcibly. However, this
  test only checks if this code cause some critical failure such as SEGV.
  So that we can add timeout for this code.

------------------------------------------------------------------------
r58481 | svn | 2017-04-26 02:24:07 +0900 (Wed, 26 Apr 2017) | 1 line

* 2017-04-26
------------------------------------------------------------------------
r58480 | ko1 | 2017-04-26 02:24:06 +0900 (Wed, 26 Apr 2017) | 1 line

revert r58478 and r58479 because they do not support not in-place build
------------------------------------------------------------------------
r58479 | eregon | 2017-04-25 21:45:36 +0900 (Tue, 25 Apr 2017) | 3 lines

Use require_relative to load rbconfig in default.mspec

* Otherwise it would load it twice.
------------------------------------------------------------------------
r58478 | eregon | 2017-04-25 21:45:25 +0900 (Tue, 25 Apr 2017) | 3 lines

No need to pass the config file to mspec as mspec finds it itself

* It would also #load (because .mspec cannot be #require'd) it twice.
------------------------------------------------------------------------
r58477 | eregon | 2017-04-25 21:45:14 +0900 (Tue, 25 Apr 2017) | 1 line

Remove useless else which produced a warning
------------------------------------------------------------------------
r58476 | eregon | 2017-04-25 20:42:43 +0900 (Tue, 25 Apr 2017) | 6 lines

no longer rescue exceptions of #<=> when initializing a Range

* range.c (range_init): no longer hide the user exception
  with a ArgumentError, just let the user exception go through.
* test/ruby/test_range.rb (test_new): add tests.
  [Feature #7688]
------------------------------------------------------------------------
r58475 | eregon | 2017-04-25 20:42:31 +0900 (Tue, 25 Apr 2017) | 5 lines

no longer rescue exceptions of #coerce in Integer#step

* numeric.c (num_step_negative_p): no more error hiding.
* test/ruby/test_float.rb, test/ruby/test_numeric.rb:
  follow the change. [Feature #7688]
------------------------------------------------------------------------
r58474 | eregon | 2017-04-25 20:42:20 +0900 (Tue, 25 Apr 2017) | 5 lines

no longer rescue exceptions in numeric comparison operations

* numeric.c (do_coerce): no more error hiding.
* test/ruby/test_numeric.rb: follow the change.
  [Feature #7688]
------------------------------------------------------------------------
r58473 | hsbt | 2017-04-25 18:23:04 +0900 (Tue, 25 Apr 2017) | 6 lines

Import gemspec
Import gemspec and test file from ruby/webrick.

  * webrick.gemspec: Update files and dependency for standalone gem.
  * test/webrick/utils.rb: Added explicitly loading of EnvUtil for
    test suite without ruby core test suite.
------------------------------------------------------------------------
r58472 | eregon | 2017-04-25 18:10:46 +0900 (Tue, 25 Apr 2017) | 4 lines

Document the Warning module and warn method

* error.c (Warning): add documentation. [Feature #13504]
  Author: Jeremy Evans <code@jeremyevans.net>
------------------------------------------------------------------------
r58471 | nobu | 2017-04-25 17:17:24 +0900 (Tue, 25 Apr 2017) | 4 lines

load.c: backtrace of circular require

* load.c (load_lock): print backtrace of circular require via
  `Warning.warn` [ruby-core:80850] [Bug #13505]
------------------------------------------------------------------------
r58470 | hsbt | 2017-04-25 16:55:56 +0900 (Tue, 25 Apr 2017) | 5 lines

Import gemspec and test file changes from ruby/gdbm.

  * gdbm.gemspec: Update basic configuraiton for standalone gdbm gem.
  * test/gdbm/test_gdbm.rb: In standalone environment, It needs to
    explicit loading of EnvUtil module for test suite.
------------------------------------------------------------------------
r58469 | svn | 2017-04-25 15:51:35 +0900 (Tue, 25 Apr 2017) | 1 line

* 2017-04-25
------------------------------------------------------------------------
r58468 | shyouhei | 2017-04-25 15:51:34 +0900 (Tue, 25 Apr 2017) | 4 lines

fix macro expansion bug

This previous "key" macro argument accidentally replaced `(ptr)->key` part. 

------------------------------------------------------------------------
r58467 | nobu | 2017-04-24 20:52:14 +0900 (Mon, 24 Apr 2017) | 1 line

tool/git-refresh: fix branch operations
------------------------------------------------------------------------
r58466 | nobu | 2017-04-24 15:17:55 +0900 (Mon, 24 Apr 2017) | 5 lines

parse.y: args tail at error

* parse.y (new_args_tail_gen): abandon parsing arguments after
  error.  reported by ilsani Martino Sani (ilsani) at
  https://hackerone.com/reports/221201
------------------------------------------------------------------------
r58465 | nobu | 2017-04-24 15:17:54 +0900 (Mon, 24 Apr 2017) | 6 lines

parse.y: rb_parser_fatal

* parse.y (rb_parser_fatal): abort compilation on internal parser
  error.  rb_bug() is generic use but not useful for debugging the
  parser.  this function dumps internal states, and continues with
  enabling yydebug output to stderr for the parser stack dump.
------------------------------------------------------------------------
r58464 | nobu | 2017-04-24 13:20:02 +0900 (Mon, 24 Apr 2017) | 1 line

Get rid of unnecessary GCC extension
------------------------------------------------------------------------
r58463 | shyouhei | 2017-04-24 10:40:51 +0900 (Mon, 24 Apr 2017) | 5 lines

revert newhash refactoring

We need to fix GC bug before merging this.  Revert revisions
58452, 58435, 58434, 58428, 58427 in this order.

------------------------------------------------------------------------
r58462 | svn | 2017-04-24 01:19:23 +0900 (Mon, 24 Apr 2017) | 1 line

* 2017-04-24
------------------------------------------------------------------------
r58461 | naruse | 2017-04-24 01:19:23 +0900 (Mon, 24 Apr 2017) | 5 lines

Allow Net::HTTP to fetch user/pass from http_proxy

Note that this feature is enabled only on environment variables are
multi-user safe. In this time the list includes Linux, FreeBSD, or
Darwin. [Bug #12921]
------------------------------------------------------------------------
r58460 | naruse | 2017-04-24 01:19:22 +0900 (Mon, 24 Apr 2017) | 1 line

suppress warning: shadowing outer local variable
------------------------------------------------------------------------
r58459 | nobu | 2017-04-23 23:51:08 +0900 (Sun, 23 Apr 2017) | 1 line

Add diagnostic reports section header [ci skip]
------------------------------------------------------------------------
r58458 | nobu | 2017-04-23 23:47:31 +0900 (Sun, 23 Apr 2017) | 1 line

assert_syntax_error returns the exception [ci skip]
------------------------------------------------------------------------
r58457 | nobu | 2017-04-23 10:31:37 +0900 (Sun, 23 Apr 2017) | 1 line

Document parse.y instead of ext/ripper/ripper.c
------------------------------------------------------------------------
r58456 | nobu | 2017-04-23 10:31:36 +0900 (Sun, 23 Apr 2017) | 1 line

ext/dl has been removed already [ci skip]
------------------------------------------------------------------------
r58455 | nobu | 2017-04-23 10:23:30 +0900 (Sun, 23 Apr 2017) | 4 lines

use $(srcdir).

* win32/Makefile.sub (enc/jis/props.h): build it in not builddir,
  but in srcdir.
------------------------------------------------------------------------
r58454 | nobu | 2017-04-23 10:04:40 +0900 (Sun, 23 Apr 2017) | 4 lines

Refactor "%f" % Inf/NaN

* sprintf.c (rb_str_format): as for non-finite float, calculate
  the exact needed size with the space flag.
------------------------------------------------------------------------
r58453 | nobu | 2017-04-23 10:04:39 +0900 (Sun, 23 Apr 2017) | 5 lines

Fix space flag when Inf/NaN and width==3

* sprintf.c (rb_str_format): while `"% 2f"` and `"% 4f"` result in
  `" Inf"` and `" Inf"` respectively, `"% 3f"` results in
  `"Inf"` (no space).
------------------------------------------------------------------------
r58452 | ko1 | 2017-04-23 09:20:27 +0900 (Sun, 23 Apr 2017) | 5 lines

mark Hash keys correctly.

* hash.c (rb_hash_new_from_object): same as r58434.
  Newly created frozen objects are not referred from any roots/objects.

------------------------------------------------------------------------
r58451 | nobu | 2017-04-23 01:26:15 +0900 (Sun, 23 Apr 2017) | 1 line

Ignore enc/jis/props.h
------------------------------------------------------------------------
r58450 | svn | 2017-04-23 01:19:13 +0900 (Sun, 23 Apr 2017) | 1 line

* 2017-04-23
------------------------------------------------------------------------
r58449 | stomar | 2017-04-23 01:19:12 +0900 (Sun, 23 Apr 2017) | 1 line

test/test_prime.rb: update method name in comment
------------------------------------------------------------------------
r58448 | nobu | 2017-04-22 17:32:33 +0900 (Sat, 22 Apr 2017) | 6 lines

parse.y: fix compile_error format

* parse.y (ripper_compile_error, parser_compile_error): declare as
  PRINTF_ARGS attribute.

* parse.y (id_is_var_gen): fix format specifier for string value.
------------------------------------------------------------------------
r58447 | nobu | 2017-04-22 17:19:34 +0900 (Sat, 22 Apr 2017) | 5 lines

test_file_exhaustive.rb: check case-sensitive fs

* test/ruby/test_file_exhaustive.rb (test_expand_path): dump
  expanded file name, not only appended char, for case-sensitive
  filesystem.  [ruby-dev:50093] [Bug #13489]
------------------------------------------------------------------------
r58446 | nobu | 2017-04-22 17:19:33 +0900 (Sat, 22 Apr 2017) | 1 line

adjust indent
------------------------------------------------------------------------
r58443 | kazu | 2017-04-22 11:04:35 +0900 (Sat, 22 Apr 2017) | 1 line

Remove nonexistent files and rename some files
------------------------------------------------------------------------
r58442 | normal | 2017-04-22 10:08:15 +0900 (Sat, 22 Apr 2017) | 16 lines

define PACKED_STRUCT_UNALIGNED correctly

Defining PACKED_STRUCT_UNALIGNED to a noop in ruby/config.h (via
`configure') prevents the definition in include/ruby/defines.h
from working

This should have been fixed in r46914, so there's a size
regression for some objects since Ruby 2.2+.  I do not believe
we can backport to existing releases, either, since it can
affect ABI.

Add a test for Time objects on common x86-based platforms to
check for future regressions.

* configure.in: remove PACKED_STRUCT_UNALIGNED definition
* test/ruby/test_time.rb (test_memsize): new test for x86
------------------------------------------------------------------------
r58441 | nobu | 2017-04-22 09:27:14 +0900 (Sat, 22 Apr 2017) | 1 line

Add sha512
------------------------------------------------------------------------
r58440 | nobu | 2017-04-22 09:18:08 +0900 (Sat, 22 Apr 2017) | 1 line

Update sources and include files after update
------------------------------------------------------------------------
r58439 | ko1 | 2017-04-22 09:10:28 +0900 (Sat, 22 Apr 2017) | 4 lines

use $(srcdir).

* Makefile.in (enc/jis/props.h): build it in not builddir, but in srcdir.

------------------------------------------------------------------------
r58438 | nobu | 2017-04-22 08:16:43 +0900 (Sat, 22 Apr 2017) | 7 lines

clean autogenerated files

* enc/depend (clean, clean-srcs): fix path of name2ctype.h, and
  remove casefold.h too.

* enc/jis/props.h: autogenerated file.
  [ruby-core:80823] [Bug #13493]
------------------------------------------------------------------------
r58437 | normal | 2017-04-22 05:38:58 +0900 (Sat, 22 Apr 2017) | 8 lines

test/socket/test_basicsocket: handle :wait_readable on read_nonblock

On some systems with slower local sockets, :wait_readable may
happen and we should wait on it to drain the socket.
This is a possible fix for https://bugs.ruby-lang.org/issues/13491

* test/socket/test_basicsocket.rb (test_read_write_nonblock):
  handle :wait_readable on read_nonblock
------------------------------------------------------------------------
r58436 | svn | 2017-04-22 00:00:31 +0900 (Sat, 22 Apr 2017) | 1 line

* 2017-04-22
------------------------------------------------------------------------
r58435 | ko1 | 2017-04-22 00:00:30 +0900 (Sat, 22 Apr 2017) | 4 lines

insert WB correctly.

* hash.c (hash_insert_raw): should insert WB.

------------------------------------------------------------------------
r58434 | ko1 | 2017-04-21 20:02:10 +0900 (Fri, 21 Apr 2017) | 8 lines

mark created frozen strings.

* hash.c (rb_hash_new_from_values_with_klass): before this fix,
  only a st table are filled with passed values. However, newly
  created frozen strings are not marked correctly only reference
  from st table. This patch marks such created frozen strings
  by Hash object which refers to the st table.

------------------------------------------------------------------------
r58433 | kazu | 2017-04-21 20:00:10 +0900 (Fri, 21 Apr 2017) | 2 lines

Remove empty directories

------------------------------------------------------------------------
r58432 | hsbt | 2017-04-21 15:16:11 +0900 (Fri, 21 Apr 2017) | 3 lines

Removed mathn.rb from stdlib. It's deprecated from Ruby 2.2.

  [Feature #10169][[ruby-core:64553]]
------------------------------------------------------------------------
r58431 | nobu | 2017-04-21 15:12:27 +0900 (Fri, 21 Apr 2017) | 8 lines

test_framework.rb: for case-sensitive filesystem

* test/mkmf/test_framework.rb (test_single_framework): fix header
  file name for case-sensitive filesystem.  it may not be same as
  the framework name, but should be the actual file name.
  [ruby-dev:50093] [Bug #13489]

* test/mkmf/test_framework.rb (test_multi_frameworks): ditto.
------------------------------------------------------------------------
r58430 | rhe | 2017-04-21 15:03:12 +0900 (Fri, 21 Apr 2017) | 4 lines

Remove missing/strtol.c

It is never used. We don't need it anyway as it's part of C89 which is
our current minimum requirement.
------------------------------------------------------------------------
r58429 | shyouhei | 2017-04-21 14:35:34 +0900 (Fri, 21 Apr 2017) | 2 lines

NEWS entry for [Feature #13302]

------------------------------------------------------------------------
r58428 | shyouhei | 2017-04-21 13:42:09 +0900 (Fri, 21 Apr 2017) | 2 lines

typo fix (sorry!)

------------------------------------------------------------------------
r58427 | shyouhei | 2017-04-21 13:21:14 +0900 (Fri, 21 Apr 2017) | 40 lines

refactor hash literal

Same as rb_ary_tmp_new_from_values(), it reduces vm_exec_core binary
size from 26,176 bytes to 26,080 bytes.  But this time, also with a
bit of optimizations:

  - Because we are allocating a new hash and no back references are
    introduced at all, we can safely skip write barriers.

  - Also, the iteration never recurs.  We can avoid complicated
    function callbacks by using st_insert instead of st_update.

----

	* hash.c (rb_hash_new_from_values): refactor
          extract the bulk insert into a function.

	* hash.c (rb_hash_new_from_object): also refactor.

	* hash.c (rb_hash_s_create): use the new functions.

	* insns.def (newhash): ditto.

	* vm.c (core_hash_from_ary): ditto.

	* iternal.h: export the new function.

-----------------------------------------------------------
benchmark results:
minimum results in each 7 measurements.
Execution time (sec)
name    before  after
loop_whileloop2  0.135  0.134
vm2_bighash*     1.236  0.687

Speedup ratio: compare with the result of `before' (greater is better)
name    after
loop_whileloop2 1.008
vm2_bighash*    1.798

------------------------------------------------------------------------
r58426 | nobu | 2017-04-21 12:01:12 +0900 (Fri, 21 Apr 2017) | 7 lines

ext/extmk.rb: colorize notes [Feature #13302]

* common.mk (build-ext): pass variables to colorize.

* ext/extmk.rb: colorize notes with tool/colorize.rb.

* tool/colorize.rb: extract from tool/generic_erb.rb.
------------------------------------------------------------------------
r58425 | nobu | 2017-04-21 11:43:25 +0900 (Fri, 21 Apr 2017) | 7 lines

exts.mk: refine notes [Feature #13302]

* ext/extmk.rb: split notes into header and footer, which are
  common, from bodies which are unique for each extensions.

* template/exts.mk.tmpl: now each notes are not one line, should
  not unique.
------------------------------------------------------------------------
r58424 | nobu | 2017-04-21 09:53:26 +0900 (Fri, 21 Apr 2017) | 4 lines

vm_dump.c: non-scalar thread_id

* vm_dump.c (rb_vmdebug_stack_dump_all_threads): fix for
  non-scalar thread_id platforms.  c.f. [Bug #9884]
------------------------------------------------------------------------
r58423 | nobu | 2017-04-21 09:11:56 +0900 (Fri, 21 Apr 2017) | 24 lines

Suppress a warning in ruby/win32.h [Fix GH-1591]

Fix a warning in ruby/win32.h which can cause failures with mkmf

The return value is implicit type casted from 'long double' to 'double', currently.
This causes a gcc warning like this:

```
In file included from C:\Ruby24-x64\include\ruby-2.4.0/ruby/defines.h:243:0,
                 from C:\Ruby24-x64\include\ruby-2.4.0/ruby/ruby.h:36,
                 from C:\Ruby24-x64\include\ruby-2.4.0/ruby.h:33,
                 from conftest.c:1:
C:\Ruby24-x64\include\ruby-2.4.0/ruby/win32.h: In function 'rb_w32_pow':
C:\Ruby24-x64\include\ruby-2.4.0/ruby/win32.h:786:12: warning: conversion to 'double' from 'long double' may alter its value [-Wfloat-conversion]
     return powl(x, y);
            ^~~~~~~~~~
```

This is fixed by the attached explicit type cast.

Moreover when CFLAGS is set to '-Wconversion', it prevents the compiler from
building. This is the case at the nokogiri gem.

The original issue arose at RubyInstaller2: https://github.com/oneclick/rubyinstaller2/commit/576a0eb70aa9348b366c3ecfe83c67811b7bcb9b
------------------------------------------------------------------------
r58422 | ko1 | 2017-04-21 07:52:57 +0900 (Fri, 21 Apr 2017) | 5 lines

use correct synchronization.

* test/ruby/test_thread.rb (make_handle_interrupt_test_thread1): use Queue
  to use correct synchronization.

------------------------------------------------------------------------
r58421 | ko1 | 2017-04-21 00:58:35 +0900 (Fri, 21 Apr 2017) | 4 lines

* vm_dump.c (rb_vmdebug_stack_dump_all_threads): cast to `void*`.
  Pointed out at
  <https://github.com/ruby/ruby/commit/fbc1deca89595e60af21e58b7e164f376e4bd2fc#commitcomment-21839826>

------------------------------------------------------------------------
r58420 | svn | 2017-04-21 00:02:56 +0900 (Fri, 21 Apr 2017) | 1 line

* 2017-04-21
------------------------------------------------------------------------
r58419 | ko1 | 2017-04-21 00:02:55 +0900 (Fri, 21 Apr 2017) | 8 lines

release monitor correctly.

* lib/rubygems/core_ext/kernel_require.rb: sometimes
  `Kernel.send(:gem, spec.name)` can raise some errors
  (Gem::MissingSpecError I observed) and this method
  doesn't release RUBYGEMS_ACTIVATION_MONITOR correctly.
  This patch fix this problem.

------------------------------------------------------------------------
r58418 | nobu | 2017-04-20 20:07:02 +0900 (Thu, 20 Apr 2017) | 5 lines

ruby-lex.rb: fix continued line conditions

* lib/irb/ruby-lex.rb (RubyLex#lex): fix conditions for continued
  line; empty lines, a semicolon, first line in `begin` block,
  just after `else` are not continued.
------------------------------------------------------------------------
r58417 | nobu | 2017-04-20 20:07:00 +0900 (Thu, 20 Apr 2017) | 1 line

ruby-lex.rb: merge regexps
------------------------------------------------------------------------
r58416 | shyouhei | 2017-04-20 19:32:08 +0900 (Thu, 20 Apr 2017) | 14 lines

refactor torexp to use routine in array.c

Found a part where copy&paste can be eliminated.  Reduces vm_exec_core
from 26,228 bytes to 26,176 bytes in size on my machine. I believe it
does not affect any runtime performance.

----

	* array.c (rb_ary_tmp_new_from_values): extend existing
          rb_ary_new_from_values function so that it can take
          additional value for klass.
	* array.c (rb_ary_new_from_values): use the new function.
	* insns.def (toregexp): ditto.

------------------------------------------------------------------------
r58415 | hsbt | 2017-04-20 18:11:36 +0900 (Thu, 20 Apr 2017) | 3 lines

Removed math mode from irb.

  mathn is deprecated from Ruby 2.2.
------------------------------------------------------------------------
r58414 | nobu | 2017-04-20 17:31:20 +0900 (Thu, 20 Apr 2017) | 4 lines

common.mk: separate note

* common.mk (build-ext): separate note from building extensions,
  not to be intermingled.  [ruby-core:80759] [Feature #13302]
------------------------------------------------------------------------
r58413 | hsbt | 2017-04-20 17:21:24 +0900 (Thu, 20 Apr 2017) | 4 lines

Removed deprecated extensions of mathn.

  * ext/mathn/{complex,rational}: Removed from ruby core.
    [fix GH-1542][Feature #13334][ruby-core:80247]
------------------------------------------------------------------------
r58412 | nobu | 2017-04-20 17:13:16 +0900 (Thu, 20 Apr 2017) | 6 lines

extmk.rb: fail for mandatory libraries

* ext/extmk.rb: fail if a mandatory extension library failed to
  configure.  [ruby-core:80759] [Feature #13302]

* template/exts.mk.tmpl: move `exit` at the end.
------------------------------------------------------------------------
r58411 | stomar | 2017-04-20 16:46:22 +0900 (Thu, 20 Apr 2017) | 6 lines

improve man pages

* man/ruby.1, man/erb.1, man/goruby.1, man/irb.1:
  fix document title formatting and volume name,
  improve "REPORTING BUGS" section: fix mdoc formatting error
  (wrong macro for bullet list items), small rewordings.
------------------------------------------------------------------------
r58410 | stomar | 2017-04-20 16:44:54 +0900 (Thu, 20 Apr 2017) | 9 lines

ri.1: rewrite ri man page

* man/ri.1: update the (very outdated) ri man page:
  * update document date
  * fix document title formatting and volume name
  * update descriptions and options to current ri --help text
  * fix some mdoc formatting errors (missing escaping of `\',
    wrong macro for bullet list items)
  * various rewordings and other improvements
------------------------------------------------------------------------
r58409 | stomar | 2017-04-20 16:44:01 +0900 (Thu, 20 Apr 2017) | 6 lines

ri.1: fix errors in ri man page

* man/ri.1: fix some errors in ri man page (add missing options,
  remove options that do not exist, fix formatter list).

  Reported by Josh Cheek.  [ruby-core:68065] [Bug #10838]
------------------------------------------------------------------------
r58408 | ko1 | 2017-04-20 13:50:53 +0900 (Thu, 20 Apr 2017) | 5 lines

add a debug function.

* vm_dump.c (rb_vmdebug_stack_dump_all_threads): dump stack dump
  for all living threads.

------------------------------------------------------------------------
r58407 | usa | 2017-04-20 10:36:11 +0900 (Thu, 20 Apr 2017) | 4 lines

Move test_extlibs.rb because it's not the test of ruby itself

* test/test_extlibs.rb: moved from test/ruby.

------------------------------------------------------------------------
r58406 | svn | 2017-04-20 00:14:04 +0900 (Thu, 20 Apr 2017) | 1 line

* 2017-04-20
------------------------------------------------------------------------
r58405 | nobu | 2017-04-20 00:14:03 +0900 (Thu, 20 Apr 2017) | 4 lines

fix infinite recursion

* vm_insnhelper.c (vm_once_dispatch): no guarantee that tail call
  is always optimized away.
------------------------------------------------------------------------
r58404 | rhe | 2017-04-19 23:05:26 +0900 (Wed, 19 Apr 2017) | 4 lines

extmk.rb: improve message printed when configuring extensions fails

Point to the mkmf.log if configuring an extension fails so that people
can find and fix the culprit easily.  [ruby-core:80131] [Feature #13302]
------------------------------------------------------------------------
r58403 | hsbt | 2017-04-19 20:50:03 +0900 (Wed, 19 Apr 2017) | 2 lines

Rervert r58304. Because Rubygems have specialized finder for default gems.
We need to list library entries for default gems.
------------------------------------------------------------------------
r58402 | shyouhei | 2017-04-19 16:27:03 +0900 (Wed, 19 Apr 2017) | 19 lines

refactor extract binop dispatcher

Those opt_something instructions are worth refactoring. They tend to
have similar ways of executions.  By extracting the common part,
generated vm_exec_core function shrinks from 26,816 bytes to 26,256
bytes (according to nm(1)).

This changeset introduces negligible performance impact.  3 repeated
runs of optcarrot benchmark on my machine resulted in:

   before this: 28.813363684823557, 27.523907198440366, 27.292766121965400
   after  this: 28.174038497265080, 28.999513875020405, 29.621399800428065

in fps (greater==faster).

----

	* vm_insnhelper.c (vm_opt_binop_dispatch): new function.

------------------------------------------------------------------------
r58401 | svn | 2017-04-19 10:08:17 +0900 (Wed, 19 Apr 2017) | 1 line

* 2017-04-19
------------------------------------------------------------------------
r58400 | normal | 2017-04-19 10:08:16 +0900 (Wed, 19 Apr 2017) | 19 lines

socket: avoid fcntl for read/write_nonblock on Linux

On platforms where MSG_DONTWAIT works reliably on all sockets
(so far, I know of Linux), we can avoid fcntl syscalls and
implement IO#write_nonblock and IO#read_nonblock in terms of the
socket-specific send and recv family of syscalls.

This avoids side effects on the socket, and also encourages
generic code to be written in cases where IO wrappers like
OpenSSL::SSL::SSLSocket are used.

Perhaps in the future, side-effect-free non-blocking I/O can
be standard on all files and OSes: https://cr.yp.to/unix/nonblock.html

* ext/socket/lib/socket.rb (read_nonblock, write_nonblock):
  Linux-specific wrapper without side effects
  [ruby-core:80780] [Feature #13362]
* test/socket/test_basicsocket.rb (test_read_write_nonblock):
  new test
------------------------------------------------------------------------
r58399 | nobu | 2017-04-18 22:14:08 +0900 (Tue, 18 Apr 2017) | 1 line

fixup! vm_insnhelper.c: adjust indent [ci skip]
------------------------------------------------------------------------
r58398 | nobu | 2017-04-18 22:14:06 +0900 (Tue, 18 Apr 2017) | 5 lines

compile.c: wrong optimization

* compile.c (compile_branch_condition): expression which has side
  effects should not be eliminated.
  [ruby-core:80740] [Bug #13444]
------------------------------------------------------------------------
r58397 | nobu | 2017-04-18 22:14:05 +0900 (Tue, 18 Apr 2017) | 1 line

vm_insnhelper.c: adjust indent [ci skip]
------------------------------------------------------------------------
r58396 | shyouhei | 2017-04-18 22:05:38 +0900 (Tue, 18 Apr 2017) | 4 lines

typo fix (sorry!) [ci skip]

Surprisingly this was not a syntax error on my machine.

------------------------------------------------------------------------
r58395 | nobu | 2017-04-18 22:02:56 +0900 (Tue, 18 Apr 2017) | 1 line

test_optimization.rb: heredoc code style
------------------------------------------------------------------------
r58394 | ko1 | 2017-04-18 21:30:59 +0900 (Tue, 18 Apr 2017) | 4 lines

fix compile error.

* insns.def (trace): use cast `flag` to pass compilation with clang on MacOSX.

------------------------------------------------------------------------
r58393 | hsbt | 2017-04-18 20:55:44 +0900 (Tue, 18 Apr 2017) | 3 lines

Fix heading of README.

  [Fix GH-1586] Patch by @jbampton
------------------------------------------------------------------------
r58392 | shyouhei | 2017-04-18 20:06:58 +0900 (Tue, 18 Apr 2017) | 2 lines

tabify (sorry!) [ci skip]

------------------------------------------------------------------------
r58391 | svn | 2017-04-18 19:58:50 +0900 (Tue, 18 Apr 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r58390 | shyouhei | 2017-04-18 19:58:49 +0900 (Tue, 18 Apr 2017) | 33 lines

split insns.def into functions

Contemporary C compilers are good at function inlining.  They fold
multiple functions into one.  However they are not yet smart enough to
unfold a function into several ones.  So generally speaking, it is
wiser for a C programmer to manually split C functions whenever
possible.  That should make rooms for compilers to optimize at will.

Before this changeset insns.def was converted into single HUGE
function called vm_exec_core().  By moving each instruction's core
into individual functions, generated C source code is reduced from
3,428 lines to 2,847 lines.  Looking at the generated assembly
however, it seems my compiler (gcc 6.2) is extraordinary smart so that
it inlines almost all functions I introduced in this changeset back
into that vm_exec_core.  On my machine compiled machine binary of the
function does not shrink very much in size (28,432 bytes to 26,816
bytes, according to nm(1)).

I believe this change is zero-cost.  Several benchmarks I exercised
showed no significant difference beyond error mergin.  For instance
3 repeated runs of optcarrot benchmark on my machine resulted in:

   before this: 28.330329285707490, 27.513378371065920, 29.40420215754537
   after  this: 27.107195867280414, 25.549324021385907, 30.31581919050884

in fps (greater==faster).

----

	* internal.h (rb_obj_not_equal): used from vm_insnhelper.c
	* insns.def: move vast majority of lines into vm_insnhelper.c
	* vm_insnhelper.c: moved here.

------------------------------------------------------------------------
r58389 | nobu | 2017-04-18 17:34:40 +0900 (Tue, 18 Apr 2017) | 4 lines

eval.c: fix exit inside TAG

* eval.c (setup_exception): do not exit by goto inside
  PUSH_TAG/POP_TAG.  it causes an infinite loop.
------------------------------------------------------------------------
r58388 | nobu | 2017-04-18 14:56:34 +0900 (Tue, 18 Apr 2017) | 4 lines

configure.in: honor GIT env

* configure.in (--with-git): honor environment variable GIT if
  set.
------------------------------------------------------------------------
r58387 | nobu | 2017-04-18 11:58:45 +0900 (Tue, 18 Apr 2017) | 4 lines

vcs.rb: env for command

* tool/vcs.rb (VCS::SVN::COMMAND, VCS::GIT::COMMAND): customize
  command paths by environment variables.
------------------------------------------------------------------------
r58386 | nobu | 2017-04-18 11:58:44 +0900 (Tue, 18 Apr 2017) | 4 lines

enc/depend: remove Unicode versions

* enc/depend (enc/unicode.o): remove hardcoded Unicode versions.
  this object file must be compiled by toplevel make.
------------------------------------------------------------------------
r58385 | svn | 2017-04-18 08:47:13 +0900 (Tue, 18 Apr 2017) | 1 line

* 2017-04-18
------------------------------------------------------------------------
r58384 | ko1 | 2017-04-18 08:47:12 +0900 (Tue, 18 Apr 2017) | 5 lines

should not return.

* test/ruby/test_settracefunc.rb (test_throwing_return_with_finish_frame):
  should not use `return`, but should use `next`.

------------------------------------------------------------------------
r58383 | nobu | 2017-04-17 22:38:34 +0900 (Mon, 17 Apr 2017) | 5 lines

string.c: improve insertion performace

* string.c (rb_str_splice_0): improve performace of single byte
  optimizable cases, insertion 7bit string to 7bit string.
  [ruby-dev:49984] [Bug #13228]
------------------------------------------------------------------------
r58382 | nobu | 2017-04-17 22:23:42 +0900 (Mon, 17 Apr 2017) | 4 lines

thread_win32.c: fix index

* thread_win32.c (w32_wait_events): fix wait object index in the
  case of interrupt_event is not usable.
------------------------------------------------------------------------
r58381 | nobu | 2017-04-17 11:41:00 +0900 (Mon, 17 Apr 2017) | 4 lines

eval.c: copy before cause setup

* eval.c (setup_exception): copy frozen exception before setting
  up a cause not only a backtrace.
------------------------------------------------------------------------
r58380 | nobu | 2017-04-17 11:31:35 +0900 (Mon, 17 Apr 2017) | 9 lines

eval.c: copy special exceptions before raise

* eval.c (setup_exception): consider if the exception is frozen,
  but not one of special exception objects.

* gc.c (rb_memerror): copy minimum objects.

* thread.c (rb_threadptr_execute_interrupts): prepare special
  exception queued by another thread to be raised.
------------------------------------------------------------------------
r58379 | nobu | 2017-04-17 11:08:41 +0900 (Mon, 17 Apr 2017) | 4 lines

vm_insnhelper.c: rb_threadptr_stack_overflow

* vm_insnhelper.c (rb_threadptr_stack_overflow): move from
  thread.c and integrate with vm_stackoverflow.
------------------------------------------------------------------------
r58378 | nobu | 2017-04-17 10:35:54 +0900 (Mon, 17 Apr 2017) | 5 lines

parse.y: fix for empty `__VA_ARGS__`

* parse.y (WARN_CALL, WARNING_CALL): need `##` between a comman
  and `__VA_ARGS__` in the case it is empty, not to end arguments
  with a comma.
------------------------------------------------------------------------
r58377 | nobu | 2017-04-17 10:23:50 +0900 (Mon, 17 Apr 2017) | 9 lines

vm_backtrace.c: backtrace functions per threads

* vm_backtrace.c (rb_threadptr_backtrace_object): rename and
  extern.

* vm_backtrace.c (rb_threadptr_backtrace_str_ary): rename as
  threadptr since the parameter is rb_thread_t*.

* vm_backtrace.c (rb_threadptr_backtrace_location_ary): ditto.
------------------------------------------------------------------------
r58376 | nobu | 2017-04-17 09:25:48 +0900 (Mon, 17 Apr 2017) | 4 lines

eval.c: share rb_longjmp

* eval.c (rb_longjmp, rb_raise_jump): parameterize thread, and
  share rb_longjmp.
------------------------------------------------------------------------
r58375 | nobu | 2017-04-17 09:10:47 +0900 (Mon, 17 Apr 2017) | 7 lines

gc.c: rb_threadptr_stack_check

* gc.c (rb_threadptr_stack_check): check probability of stack
  overflow for the given thread, not the current thread.

* vm_eval.c (stack_check): check the given thread, not the current
  thread.
------------------------------------------------------------------------
r58374 | nobu | 2017-04-17 09:10:45 +0900 (Mon, 17 Apr 2017) | 6 lines

gc.c: PREVENT_STACK_OVERFLOW

* gc.c (PREVENT_STACK_OVERFLOW): define TRUE to try preventing
  stack overflow before actually happens.

* gc.c (stack_check): parameterize thread pointer.
------------------------------------------------------------------------
r58373 | svn | 2017-04-17 00:54:58 +0900 (Mon, 17 Apr 2017) | 1 line

* 2017-04-17
------------------------------------------------------------------------
r58372 | stomar | 2017-04-17 00:54:57 +0900 (Mon, 17 Apr 2017) | 3 lines

test_integer.rb: simplify test

* test/ruby/test_integer.rb: simplify test for Integer.sqrt.
------------------------------------------------------------------------
r58371 | nobu | 2017-04-16 23:54:59 +0900 (Sun, 16 Apr 2017) | 4 lines

rbinstall.rb: ignore skipped exts

* tool/rbinstall.rb (default-gems): skip gemspec if corresponding
  Makefile does not exist.
------------------------------------------------------------------------
r58370 | nobu | 2017-04-16 23:27:21 +0900 (Sun, 16 Apr 2017) | 5 lines

thread_win32.c: no GVL for interrupt_event

* thread_win32.c (w32_wait_events): do not acquire GVL, to fix
  deadlock at read/close race condition.  instead, just ignore
  interrupt_event if it is closed.
------------------------------------------------------------------------
r58369 | nobu | 2017-04-16 13:16:11 +0900 (Sun, 16 Apr 2017) | 1 line

test/ruby/test_io.rb: use Thread.stop? to wait
------------------------------------------------------------------------
r58368 | usa | 2017-04-16 11:00:24 +0900 (Sun, 16 Apr 2017) | 3 lines

* test/ruby/test_io.rb (test_race_closed_stream): separate because it stops
  entire test process on Windows.

------------------------------------------------------------------------
r58367 | svn | 2017-04-16 00:29:09 +0900 (Sun, 16 Apr 2017) | 1 line

* 2017-04-16
------------------------------------------------------------------------
r58366 | nobu | 2017-04-16 00:29:09 +0900 (Sun, 16 Apr 2017) | 5 lines

bignum.c: fix inexact estimation

* bignum.c (estimate_initial_sqrt): estimated square root is
  inexact if it is not equal to its ceil, needs Newton's method.
  [ruby-core:80696] [Bug #13440]
------------------------------------------------------------------------
r58365 | svn | 2017-04-15 16:13:06 +0900 (Sat, 15 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58364 | normal | 2017-04-15 16:13:05 +0900 (Sat, 15 Apr 2017) | 11 lines

fix ext/-test-/struct/ dependencies

I started writing a template for auto-generation and
let "tool/update-deps --fix" fill in the rest.

Hopefully this fixes problems with some CI builds
after r58359.  Further changes to other ext/-test-/
files should probably add or update "depend" files, too.

* ext/-test-/struct/depend: new file
* enc/depend: auto-updated with unicode 9.0.0 headers (side-effect)
------------------------------------------------------------------------
r58363 | nobu | 2017-04-15 11:37:21 +0900 (Sat, 15 Apr 2017) | 4 lines

signal.c: last tag page condition

* signal.c (check_stack_overflow): drop the last tag when it is
  close to the fault page, not same as sp page.
------------------------------------------------------------------------
r58362 | nobu | 2017-04-15 11:09:27 +0900 (Sat, 15 Apr 2017) | 4 lines

ruby.h: check argc to rb_funcall

* include/ruby/ruby.h (rb_funcall): check if argc matches the
  number of variadic arguments, and replace with rb_funcallv.
------------------------------------------------------------------------
r58361 | nobu | 2017-04-15 11:07:01 +0900 (Sat, 15 Apr 2017) | 4 lines

signal.c: prefer pthread_sigmask

* signal.c (raise_stack_overflow): prefer pthread_sigmask to
  sigprocmask, for multithreading.
------------------------------------------------------------------------
r58360 | svn | 2017-04-15 09:46:01 +0900 (Sat, 15 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58359 | normal | 2017-04-15 09:46:00 +0900 (Sat, 15 Apr 2017) | 9 lines

fix RSTRUCT_LEN macro in public C API

rb_struct_size returns an Integer VALUE, so it must be converted
to a `long` for compatibility with previous Ruby C API versions.

* ext/-test-/struct/len.c: new
* test/-ext-/struct/test_len.rb: new
* include/ruby/ruby.h (RSTRUCT_LEN): use NUM2LONG
  [ruby-core:80692] [Bug #13439]
------------------------------------------------------------------------
r58358 | ngoto | 2017-04-15 04:12:51 +0900 (Sat, 15 Apr 2017) | 7 lines

Workaround for optimization bug of Oracle Solaris Studio 12.4 and 12.5

* pack.c (pack_unpack, AVOID_CC_BUG): Very ugly workaround for
  optimization bug of Oracle Solaris Studio 12.4 and 12.5
  (Oracle Developer Studio 12.5) on Solaris with -xO4 optimization
  option. [Bug #11684] [ruby-core:80690]

------------------------------------------------------------------------
r58357 | ko1 | 2017-04-15 03:19:37 +0900 (Sat, 15 Apr 2017) | 4 lines

sync certainly.

* test/ruby/test_io.rb (test_race_closed_stream): awit for 'sleep' state.

------------------------------------------------------------------------
r58356 | ko1 | 2017-04-15 03:14:25 +0900 (Sat, 15 Apr 2017) | 6 lines

more explicit synchronization.

* test/ruby/test_io.rb (test_race_closed_stream): wait for blocking by r.gets.
  On some systems (for example, high load average systems) can't start Thread
  correctly and can't wait r.gets in invoked Thread.

------------------------------------------------------------------------
r58355 | svn | 2017-04-15 01:07:46 +0900 (Sat, 15 Apr 2017) | 1 line

* 2017-04-15
------------------------------------------------------------------------
r58354 | nobu | 2017-04-15 01:07:45 +0900 (Sat, 15 Apr 2017) | 1 line

signal.c: add sigprocmask guard
------------------------------------------------------------------------
r58353 | nobu | 2017-04-14 21:59:59 +0900 (Fri, 14 Apr 2017) | 4 lines

signal.c: unblock signal

* signal.c (raise_stack_overflow): unblock the received signal, to
  receive the same signal again.  [ruby-core:79285] [Bug #13164]
------------------------------------------------------------------------
r58352 | nobu | 2017-04-14 21:51:46 +0900 (Fri, 14 Apr 2017) | 4 lines

configure.in: sigsetjmp sivesigs flag

* configure.in (RUBY_SETJMP_TYPE): optional flag to save signal
  mask.
------------------------------------------------------------------------
r58351 | nobu | 2017-04-14 19:03:43 +0900 (Fri, 14 Apr 2017) | 1 line

IPSocket#inspect
------------------------------------------------------------------------
r58350 | nobu | 2017-04-14 17:33:08 +0900 (Fri, 14 Apr 2017) | 4 lines

ruby.h: check argc to rb_yield_values

* include/ruby/ruby.h (rb_yield_values): check if argc matches the
  number of variadic arguments, and replace with rb_yield_values2.
------------------------------------------------------------------------
r58349 | ko1 | 2017-04-14 16:46:11 +0900 (Fri, 14 Apr 2017) | 9 lines

disable rewind hooks.

* vm.c (hook_before_rewind): skip rewind hooks if err is SystemStackError
  because rewind hooks can cause stack overflow again and again.

* thread.c (ruby_thread_stack_overflow): do not disable all hooks.
  Additionally, clearing ruby_vm_event_flags is not suitable way
  to disable hooks.

------------------------------------------------------------------------
r58348 | svn | 2017-04-14 14:19:12 +0900 (Fri, 14 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58347 | mrkn | 2017-04-14 14:19:12 +0900 (Fri, 14 Apr 2017) | 13 lines

Improve performance of type conversion using to_r

* object.c: Add to_r in conv_method_tbl.

* defs/id.def: add to_r.

* benchmark/bm_int_quo.rb: added.

* benchmark/bm_time_subsec.rb: added.

[Bug #13426]
[ruby-core:80665]
[Fix GH-1582]
------------------------------------------------------------------------
r58346 | ko1 | 2017-04-14 11:19:39 +0900 (Fri, 14 Apr 2017) | 5 lines

increase timeout seconds.

* test/ruby/test_trace.rb (test_trace_stackoverflow): on some platforms
  this test fails because of timeout.

------------------------------------------------------------------------
r58345 | nobu | 2017-04-14 09:45:49 +0900 (Fri, 14 Apr 2017) | 5 lines

rbinstall.rb: no file list for default gems

* tool/rbinstall.rb (default-gems): no file list is used now.
  all files should be installed as standard libraries.
  [ruby-core:80667] [Bug #13428]
------------------------------------------------------------------------
r58344 | nobu | 2017-04-14 09:45:48 +0900 (Fri, 14 Apr 2017) | 5 lines

git-refresh: fix abort by cd failure

* tool/git-refresh: try `cd -P` in a subshell, because Solaris10
  sh dies if it fails, not only the command.
  [ruby-dev:50074] [Bug #13433]
------------------------------------------------------------------------
r58343 | ko1 | 2017-04-14 01:32:20 +0900 (Fri, 14 Apr 2017) | 1 line

fix last commit
------------------------------------------------------------------------
r58342 | svn | 2017-04-14 01:19:46 +0900 (Fri, 14 Apr 2017) | 1 line

* 2017-04-14
------------------------------------------------------------------------
r58341 | ko1 | 2017-04-14 01:19:46 +0900 (Fri, 14 Apr 2017) | 2 lines

Terminate created threads.

------------------------------------------------------------------------
r58340 | svn | 2017-04-13 18:25:39 +0900 (Thu, 13 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58339 | mrkn | 2017-04-13 18:25:38 +0900 (Thu, 13 Apr 2017) | 9 lines

array.c: improve performance of Array#sort with block

* array.c (sort_1): improve performance of Array#sort with block

* benchmark/bm_array_sort_block.rb: added for Array#sort with block

[Bug #13344]
[ruby-dev:50027]
[Fix GH-1544]
------------------------------------------------------------------------
r58338 | svn | 2017-04-13 17:09:07 +0900 (Thu, 13 Apr 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58337 | mrkn | 2017-04-13 17:09:06 +0900 (Thu, 13 Apr 2017) | 4 lines

Add a benchmark script for Array#sort of float array

[Bug #13340]
[ruby-dev:50023]
------------------------------------------------------------------------
r58336 | nobu | 2017-04-13 17:08:04 +0900 (Thu, 13 Apr 2017) | 3 lines

git-refresh: for symlink srcdir

* tool/git-refresh: use `cd -P` for symlink srcdir.
------------------------------------------------------------------------
r58335 | nobu | 2017-04-13 16:52:05 +0900 (Thu, 13 Apr 2017) | 4 lines

git-refresh: fix expr

* tool/git-refresh (dir): surround by slashes to extract base
  name.  [ruby-dev:50070] [Bug #13424]
------------------------------------------------------------------------
r58334 | nobu | 2017-04-13 16:38:23 +0900 (Thu, 13 Apr 2017) | 6 lines

thread.c: disable VM events when stack overflow

* thread.c (ruby_thread_stack_overflow): disable VM events when
  stack overflow occurred; it causes another stack overflow again
  in making backtrace object, and crashes.
  [ruby-core:80662] [Bug #13425]
------------------------------------------------------------------------
r58333 | mrkn | 2017-04-13 16:22:35 +0900 (Thu, 13 Apr 2017) | 14 lines

array.c: Improve performance of Array#sort with float elements

* array.c (sort_2): improve performance of Array#sort with float elements.

* internal.h (cmp_opt_Float, cmp_opt_data): added for checking whether or not
  Float#<=> can be optimizable.

* numeric.c (rb_float_cmp): added for internal use.

* internal.h (rb_float_cmp): ditto.

[Bug #13340]
[ruby-dev:50023]
[Fix GH-1539]
------------------------------------------------------------------------
r58332 | rhe | 2017-04-13 15:43:17 +0900 (Thu, 13 Apr 2017) | 6 lines

array.c: report correct memsize for shared root arrays

For a shared array root, struct RArray::as.heap.aux.capa stores the
number of Arrays holding reference to that T_ARRAY instead of the actual
heap-allocated capacity. Use ARY_CAPA() macro which handles this
appropriately.
------------------------------------------------------------------------
r58331 | stomar | 2017-04-13 04:49:48 +0900 (Thu, 13 Apr 2017) | 5 lines

unicode_normalize.rb: improve docs

* lib/unicode_normalize.rb: [DOC] improve docs for
  String#{unicode_normalize,unicode_normalized?}: rdoc formatting,
  adopt style of other String methods (drop heading and "Examples").
------------------------------------------------------------------------
r58330 | svn | 2017-04-13 03:07:33 +0900 (Thu, 13 Apr 2017) | 1 line

* 2017-04-13
------------------------------------------------------------------------
r58329 | stomar | 2017-04-13 03:07:32 +0900 (Thu, 13 Apr 2017) | 6 lines

nodoc UnicodeNormalize module

* lib/unicode_normalize/normalize.rb: [DOC] nodoc the
  internal UnicodeNormalize module.
* lib/unicode_normalize/tables.rb: ditto.
* template/unicode_norm_gen.tmpl: ditto.
------------------------------------------------------------------------
r58328 | nobu | 2017-04-12 23:47:50 +0900 (Wed, 12 Apr 2017) | 4 lines

thread.c: during GC for thread

* thread.c (ruby_thread_stack_overflow): check if the given thread
  is during GC.
------------------------------------------------------------------------
r58327 | nobu | 2017-04-12 17:39:19 +0900 (Wed, 12 Apr 2017) | 5 lines

rbinstall.rb: purge `git ls-files`

* tool/rbinstall.rb (load_gemspec): purge `git ls-files` generated
  by bundle.  it is not available always everywhere everytime.
  [ruby-dev:50068] [Bug #13423]
------------------------------------------------------------------------
r58326 | hsbt | 2017-04-12 17:12:53 +0900 (Wed, 12 Apr 2017) | 4 lines

Import latest gemspec from ruby/fileutils.

  * Bump version to 0.7.1. Beucause fileutils-0.7 is alread reserverd
    on rubygems.org.
------------------------------------------------------------------------
r58325 | nobu | 2017-04-12 14:22:36 +0900 (Wed, 12 Apr 2017) | 4 lines

git-refresh: for old sh

* tool/git-refresh: get rid of matching prefix pattern removal for
  old sh.  [ruby-dev:50069] [Bug #13424]
------------------------------------------------------------------------
r58324 | hsbt | 2017-04-12 09:21:20 +0900 (Wed, 12 Apr 2017) | 1 line

Use `assert_raise` instead of `assert_raises`.
------------------------------------------------------------------------
r58323 | hsbt | 2017-04-12 09:21:18 +0900 (Wed, 12 Apr 2017) | 4 lines

Merge json-2.0.4.

  * https://github.com/flori/json/releases/tag/v2.0.4
  * https://github.com/flori/json/blob/09fabeb03e73ed88dc8ce8f19d76ac59e51dae20/CHANGES.md#2017-03-23-204
------------------------------------------------------------------------
r58322 | svn | 2017-04-12 07:41:21 +0900 (Wed, 12 Apr 2017) | 1 line

* 2017-04-12
------------------------------------------------------------------------
r58321 | hsbt | 2017-04-12 07:41:21 +0900 (Wed, 12 Apr 2017) | 4 lines

Merge upstream of ruby/etc.

  * Do not use `git ls-files` for file listing.
  * Fix extconf.rb path.
------------------------------------------------------------------------
r58320 | normal | 2017-04-11 23:56:17 +0900 (Tue, 11 Apr 2017) | 6 lines

Socket.udp_server_sockets: use symbol proc

Symbol proc is shorter human and machine code;
and also avoids needing to name variables.

* ext/socket/lib/socket.rb (Socket.udp_server_sockets): use symbol proc
------------------------------------------------------------------------
r58319 | nobu | 2017-04-11 21:28:51 +0900 (Tue, 11 Apr 2017) | 1 line

Parenthesized CHECK_CFP_CONSISTENCY [ci skip]
------------------------------------------------------------------------
r58318 | nobu | 2017-04-11 21:20:21 +0900 (Tue, 11 Apr 2017) | 5 lines

Install only files explicitly referenced by bundled gems.

[Bug #13417]
[Fix GH-1580]
Author:    Vit Ondruch <vondruch@redhat.com>
------------------------------------------------------------------------
r58317 | nobu | 2017-04-11 21:20:18 +0900 (Tue, 11 Apr 2017) | 4 lines

Spec#files are not used anymore.

[Fix GH-1579]
Author:    Vit Ondruch <vondruch@redhat.com>
------------------------------------------------------------------------
r58316 | hsbt | 2017-04-11 21:19:05 +0900 (Tue, 11 Apr 2017) | 3 lines

Fix a typo.

  Patch by @voxik. [fix GH-1581]
------------------------------------------------------------------------
r58315 | hsbt | 2017-04-11 18:46:53 +0900 (Tue, 11 Apr 2017) | 4 lines

Import gemspec from ruby/etc.

  * Update configuraiton for gem release.
  * Bump version to 0.2.1. Because 0.2.0 is already reserved on rubygems.org
------------------------------------------------------------------------
r58314 | hsbt | 2017-04-11 17:49:01 +0900 (Tue, 11 Apr 2017) | 4 lines

Import gemspec from ruby/dbm

  * Update gemspec version of beta release.
  * Bump version to 0.5.1. Because 0.5 is already reserved another implementation.
------------------------------------------------------------------------
r58313 | nobu | 2017-04-11 13:17:45 +0900 (Tue, 11 Apr 2017) | 4 lines

vm_insnhelper.c: CHECK_CFP_CONSISTENCY

* vm_insnhelper.c (CHECK_CFP_CONSISTENCY): make [BUG] messages
  consistent.
------------------------------------------------------------------------
r58312 | nobu | 2017-04-11 11:40:14 +0900 (Tue, 11 Apr 2017) | 4 lines

time.c: rename div as divv

* time.c (divv): add suffix to get rid of the name in C standard
  library, and others together.
------------------------------------------------------------------------
r58311 | nobu | 2017-04-11 11:40:13 +0900 (Tue, 11 Apr 2017) | 1 line

configure.in: need GIT to check if using git
------------------------------------------------------------------------
r58310 | nobu | 2017-04-11 10:24:13 +0900 (Tue, 11 Apr 2017) | 1 line

enc/unicode/data: no files under version control now
------------------------------------------------------------------------
r58309 | normal | 2017-04-11 03:16:58 +0900 (Tue, 11 Apr 2017) | 12 lines

time.c: use predefined IDs

This reduces rb_intern calls during startup and shortens code.

* time.c: include id.h for predefined IDs
  (id_mul, id_eq, id_ne, id_cmp): remove static variables
  (eq): replace id_eq with idEq
  (cmp, wcmp): replace id_cmp with idCmp
  (weq): replace id_eq with idEq
  (time_timespec): replace id_mul with '*'
  (Init_Time): remove rb_intern calls for removed variables
* common.mk (time.$(OBJEXT)): add depend on id.h
------------------------------------------------------------------------
r58308 | normal | 2017-04-11 03:08:16 +0900 (Tue, 11 Apr 2017) | 30 lines

time.c: Improve Time#to_i performance

Time#to_i will be faster around 80% (on 64-bit platforms).

* Before
       user     system      total        real
   2.840000   0.000000   2.840000 (  2.847238)

* After
       user     system      total        real
   1.600000   0.000000   1.600000 (  1.598911)

* Test code
require 'benchmark'

Benchmark.bmbm do |x|
  x.report do
    t = Time.now
    20000000.times do
      t.to_i
    end
  end
end

* time.c (_div): new function avoid rb_funcall
  (div): replace with new _div function
  [ruby-core:80636] [Bug #13418]
  Thanks to Watson <watson1978@gmail.com> for the patch.

From: Watson <watson1978@gmail.com>
------------------------------------------------------------------------
r58307 | stomar | 2017-04-11 02:28:18 +0900 (Tue, 11 Apr 2017) | 1 line

doc/extension.rdoc: rb_str_append grammar fix
------------------------------------------------------------------------
r58306 | nobu | 2017-04-11 00:34:37 +0900 (Tue, 11 Apr 2017) | 4 lines

extension.rdoc: rb_str_append [ci skip]

* doc/extension.rdoc: add rb_str_append and fix equivalent for
  rb_str_catf and rb_str_vcatf from rb_str_cat2.
------------------------------------------------------------------------
r58305 | svn | 2017-04-11 00:26:50 +0900 (Tue, 11 Apr 2017) | 1 line

* 2017-04-11
------------------------------------------------------------------------
r58304 | nobu | 2017-04-11 00:26:49 +0900 (Tue, 11 Apr 2017) | 9 lines

Make .gemspec slimmer.

This is the same code that RubyGems are using:

https://github.com/rubygems/rubygems/commit/a1a5ab55cb1501cbfeee29131a56cfa2e763174f

[ci skip]
[Fix GH-1578]
Author:    Vit Ondruch <vondruch@redhat.com>
------------------------------------------------------------------------
r58303 | nobu | 2017-04-11 00:26:48 +0900 (Tue, 11 Apr 2017) | 7 lines

extension.rdoc: fix rb_enc_str_new_literal

* doc/extension.rdoc: Add missing enc arg to rb_enc_str_new_literal.

[ci skip]
[Fix GH-1577]
Author:    Dylan Thacker-Smith <Dylan.Smith@shopify.com>
------------------------------------------------------------------------
r58302 | nobu | 2017-04-10 22:35:39 +0900 (Mon, 10 Apr 2017) | 1 line

svn:ignore: ignore ruby-runner
------------------------------------------------------------------------
r58301 | usa | 2017-04-10 22:30:28 +0900 (Mon, 10 Apr 2017) | 2 lines

svn:ignore: fix handling exts.mk.

------------------------------------------------------------------------
r58300 | usa | 2017-04-10 22:18:03 +0900 (Mon, 10 Apr 2017) | 2 lines

svn:ignore

------------------------------------------------------------------------
r58299 | nobu | 2017-04-10 11:13:52 +0900 (Mon, 10 Apr 2017) | 4 lines

Makefile.sub: fix HAVE_GIT

* win32/Makefile.sub (HAVE_GIT): fix missing `do`, excape `$`, and
  fix a typo.
------------------------------------------------------------------------
r58298 | nobu | 2017-04-10 10:46:24 +0900 (Mon, 10 Apr 2017) | 3 lines

configure.in: detect baseruby by default

* configure.in: default HAVE_BASERUBY to yes, for auto detection.
------------------------------------------------------------------------
r58297 | nobu | 2017-04-10 10:22:50 +0900 (Mon, 10 Apr 2017) | 4 lines

vcs.rb: remove git stuff

* tool/vcs.rb (VCS::GIT#after_export): remove git stuff not to
  distribute.  [ruby-core:80629] [Feature #13415]
------------------------------------------------------------------------
r58296 | nobu | 2017-04-10 10:22:49 +0900 (Mon, 10 Apr 2017) | 4 lines

Allow --without-baseruby option

* configure.in, win32/configure.bat: allow --without-baseruby
  option to use already generated files without baseruby.
------------------------------------------------------------------------
r58295 | nobu | 2017-04-10 10:22:48 +0900 (Mon, 10 Apr 2017) | 4 lines

Add --with-git option

* configure.in, win32/configure.bat: add --with-git option to
  tell git command to use, or not to use git.
------------------------------------------------------------------------
r58294 | svn | 2017-04-10 01:19:39 +0900 (Mon, 10 Apr 2017) | 1 line

* 2017-04-10
------------------------------------------------------------------------
r58293 | usa | 2017-04-10 01:19:37 +0900 (Mon, 10 Apr 2017) | 6 lines

Get rid of inifinity retry loop in Socket.udp_server_sockets

* ext/socket/lib/socket.rb (Socket.udp_server_sockets): remove duplicated
  addresses before passing it to ip_sockets_port0 because it causes
  Errno::EADDRINUSE and retry forever.

------------------------------------------------------------------------
r58291 | stomar | 2017-04-09 22:30:31 +0900 (Sun, 09 Apr 2017) | 4 lines

math.c: improve docs for Math.sqrt

* math.c: [DOC] mention possibly surprising behavior of Math.sqrt
  due to floating point arithmetic; also refer to BigDecimal#sqrt.
------------------------------------------------------------------------
r58290 | stomar | 2017-04-09 22:28:11 +0900 (Sun, 09 Apr 2017) | 4 lines

numeric.c: improve docs for Float

* numeric.c: [DOC] mention possibly surprising behavior of
  Float#{floor,ceil,to_i,truncate} due to floating point arithmetic.
------------------------------------------------------------------------
r58288 | kazu | 2017-04-09 20:53:53 +0900 (Sun, 09 Apr 2017) | 5 lines

io.c: ARGF.file returns $stdin instead of STDIN [ci skip]

For example:
`ruby -e '$stdin=open(IO::NULL);p [STDIN,$stdin,ARGF.file]'`
prints `[#<IO:<STDIN>>, #<File:/dev/null>, #<File:/dev/null>]`
------------------------------------------------------------------------
r58287 | nobu | 2017-04-09 20:44:01 +0900 (Sun, 09 Apr 2017) | 4 lines

configure.in: rpath with OPTDIR

* configure.in: add rpath flags which is needed for OPTDIR as well
  as -L options, when it is given.  [ruby-dev:50065] [Bug #13411]
------------------------------------------------------------------------
r58286 | nobu | 2017-04-09 14:09:44 +0900 (Sun, 09 Apr 2017) | 5 lines

thread.c: refine stream closed message

* thread.c (Init_Thread): [EXPERIMENTAL] refine the "stream
  closed" special exception message, by explicating that it is
  caused by threading.  [ruby-core:80583] [Bug #13405]
------------------------------------------------------------------------
r58285 | nobu | 2017-04-09 13:01:07 +0900 (Sun, 09 Apr 2017) | 4 lines

special exception messages are static

* vm_core.h (rb_vm_register_special_exception): make the contents
  of special exception messages static.
------------------------------------------------------------------------
r58284 | nobu | 2017-04-09 11:34:49 +0900 (Sun, 09 Apr 2017) | 5 lines

vm_core.h: ruby_error_stream_closed

* vm_core.h (ruby_special_exceptions): renamed
  ruby_error_closed_stream as ruby_error_stream_closed, like the
  message.
------------------------------------------------------------------------
r58283 | nobu | 2017-04-09 11:06:45 +0900 (Sun, 09 Apr 2017) | 4 lines

no mark of u3 in NODE_BLOCK_PASS

* node.c (rb_gc_mark_node): u3 in NODE_BLOCK_PASS is not used and
  does not need to be marked.
------------------------------------------------------------------------
r58282 | nobu | 2017-04-09 10:23:02 +0900 (Sun, 09 Apr 2017) | 5 lines

default.mspec: defer job tokens

* spec/default.mspec (MSpecScript::JobServer#cores): defer getting
  job tokens until required.  when running only one spec file,
  `-j` option has no effect.
------------------------------------------------------------------------
r58281 | svn | 2017-04-09 10:23:02 +0900 (Sun, 09 Apr 2017) | 1 line

* 2017-04-09
------------------------------------------------------------------------
r58280 | nobu | 2017-04-09 10:23:01 +0900 (Sun, 09 Apr 2017) | 4 lines

test/unit.rb: no jobserver in workers

* test/lib/test/unit.rb (Test::Unit::Parallel#process_args):
  worker processes do not access job server.
------------------------------------------------------------------------
r58279 | nobu | 2017-04-08 16:29:55 +0900 (Sat, 08 Apr 2017) | 4 lines

Show logs after PR merger

* .travis.yml (before_script): show logs of merged pull requests
  to rubyspec.
------------------------------------------------------------------------
r58278 | nobu | 2017-04-08 16:29:54 +0900 (Sat, 08 Apr 2017) | 5 lines

Split commands

* .travis.yml (before_script): split commands to prepare variables
  for pull request URLs to rubyspec, to stop when each commands
  failed.
------------------------------------------------------------------------
r58277 | nobu | 2017-04-08 12:25:50 +0900 (Sat, 08 Apr 2017) | 4 lines

basicsocket.c: proper system call name

* ext/socket/basicsocket.c (rsock_bsock_send): show proper system
  call name in the exception message.
------------------------------------------------------------------------
r58276 | suke | 2017-04-08 11:37:03 +0900 (Sat, 08 Apr 2017) | 2 lines

ext/win32ole/win32ole_variant.c (ole_val2variant_err): use FIXNUM_P, RB_TYPE_P

------------------------------------------------------------------------
r58275 | svn | 2017-04-08 01:08:50 +0900 (Sat, 08 Apr 2017) | 1 line

* 2017-04-08
------------------------------------------------------------------------
r58274 | nobu | 2017-04-08 01:08:49 +0900 (Sat, 08 Apr 2017) | 4 lines

.travis.yml: split long command [ci skip]

* .travis.yml (before_script): split long command to merge pull
  requests to rubyspec from github.
------------------------------------------------------------------------
r58273 | nobu | 2017-04-07 23:00:22 +0900 (Fri, 07 Apr 2017) | 5 lines

.travis.yml: multiple rubyspec PRs [ci skip]

* .travis.yml (before_script): merge multiple pull requests
  rubyspec to from github.  pull request numbers are given by
  RUBYSPEC_PULL_REQUEST, as a comma or space separated list.
------------------------------------------------------------------------
r58272 | nobu | 2017-04-07 22:26:12 +0900 (Fri, 07 Apr 2017) | 1 line

use dedicated assertions
------------------------------------------------------------------------
r58271 | nobu | 2017-04-07 22:26:12 +0900 (Fri, 07 Apr 2017) | 1 line

Use \A and \z to match whole string
------------------------------------------------------------------------
r58270 | usa | 2017-04-07 21:56:35 +0900 (Fri, 07 Apr 2017) | 4 lines

Classify extlibs tool

* tool/extlibs.rb (ExtLibs): classify the tool to make it able to reuse it.

------------------------------------------------------------------------
r58269 | ko1 | 2017-04-07 16:50:30 +0900 (Fri, 07 Apr 2017) | 2 lines

insert assertions for THROW_DATA_* macros.

------------------------------------------------------------------------
r58268 | ko1 | 2017-04-07 15:41:32 +0900 (Fri, 07 Apr 2017) | 5 lines

introduce imemo_type_p(v, imemo_type)

* internal.h: introduce imemo_type_p() which checks the given value is
  T_IMEMO and imemo_type() == given imemo_type.

------------------------------------------------------------------------
r58267 | nobu | 2017-04-07 13:00:56 +0900 (Fri, 07 Apr 2017) | 4 lines

fix condition of assert_not_respond_to

* test/lib/test/unit/assertions.rb (assert_not_respond_to): fix
  condition to assert.
------------------------------------------------------------------------
r58266 | nobu | 2017-04-07 12:56:16 +0900 (Fri, 07 Apr 2017) | 4 lines

assert_not_respond_to private method

* test/lib/test/unit/assertions.rb (assert_not_respond_to): allow
  private flag as well as assert_respond_to.
------------------------------------------------------------------------
r58265 | svn | 2017-04-07 12:56:16 +0900 (Fri, 07 Apr 2017) | 1 line

* 2017-04-07
------------------------------------------------------------------------
r58264 | nobu | 2017-04-07 12:56:15 +0900 (Fri, 07 Apr 2017) | 4 lines

assert_respond_to non-private method

* test/lib/test/unit/assertions.rb (assert_respond_to): do not
  call super class assert_respond_to when false priv is given.
------------------------------------------------------------------------
r58263 | nobu | 2017-04-06 13:42:41 +0900 (Thu, 06 Apr 2017) | 4 lines

internal.h: parenthesize macro argument

* internal.h (THROW_DATA_P): parenthesize the argument which is
  casted.
------------------------------------------------------------------------
r58262 | ko1 | 2017-04-06 11:56:23 +0900 (Thu, 06 Apr 2017) | 15 lines

fix TracePoint#return_value with non-local exits

* vm.c: get return_value from imemo_throw_data object (THROW_DATA_VAL()).
  imemo_throw_data (TAG_BREAK) contains returned value.
  However, imemo_throw_data (TAG_BREAK) can skip several frames so that
  we need to use it only once (at most internal frame). To record it,
  we introduced THROW_DATA_CONSUMED and check it.

* internal.h: define THROW_DATA_CONSUMED flag.

* test/ruby/test_settracefunc.rb: add tests for [Bug #13369]

* vm_insnhelper.h: add THROW_DATA_CONSUMED_P() and
  THROW_DATA_CONSUMED_SET().

------------------------------------------------------------------------
r58261 | nobu | 2017-04-06 11:33:40 +0900 (Thu, 06 Apr 2017) | 1 line

Freeze RbConfig::SIZEOF and RbConfig::LIMITS
------------------------------------------------------------------------
r58260 | nobu | 2017-04-06 11:10:40 +0900 (Thu, 06 Apr 2017) | 5 lines

Rename RbConfig::Limits as RbConfig::LIMITS

* template/limits.c.tmpl (Init_limits): rename RbConfig::Limits as
  RbConfig::LIMITS, constants other than class or module are all
  uppercase with underscores by convention.
------------------------------------------------------------------------
r58259 | hsbt | 2017-04-06 10:47:45 +0900 (Thu, 06 Apr 2017) | 1 line

Update library entry for stringio and fiddle.
------------------------------------------------------------------------
r58258 | svn | 2017-04-06 09:14:58 +0900 (Thu, 06 Apr 2017) | 1 line

* 2017-04-06
------------------------------------------------------------------------
r58257 | kazu | 2017-04-06 09:14:57 +0900 (Thu, 06 Apr 2017) | 3 lines

NEWS: mention Array#append and Array#prepend

[Feature #12746] [ci skip]
------------------------------------------------------------------------
r58256 | hsbt | 2017-04-05 22:16:32 +0900 (Wed, 05 Apr 2017) | 5 lines

Import psych-3.0.0.beta1 from ruby/psych.

  * Removed deprecated code.
  * Removed code related syck gem.
  * Fixed typos.
------------------------------------------------------------------------
r58255 | hsbt | 2017-04-05 20:04:25 +0900 (Wed, 05 Apr 2017) | 3 lines

Added initial gemspec for ruby/fiddle.

  [Feature #13403][ruby-core:80577]
------------------------------------------------------------------------
r58254 | shyouhei | 2017-04-05 17:52:31 +0900 (Wed, 05 Apr 2017) | 8 lines

fix --with-gmp (broken by r57490)

Looking at the generated shell script (also the autoconf manual), it
seems AC_SEARCH_LIBS() m4 macro does not define HAVE_LIBsomething C
preprocessor macros, unlike AC_CHECK_LIB() which does define them.
This previous change effectively killed building with GMP because
building that mode depends on existence of HAVE_LIBGMP. [Bug #13402]

------------------------------------------------------------------------
r58253 | nobu | 2017-04-05 17:34:18 +0900 (Wed, 05 Apr 2017) | 5 lines

compile.c: remove side effects by debug macros

* compile.c (debugp_param): do not evaluate arguments of debug
  macros, unless the debug mode is enabled.  these macros should
  not have side effects.
------------------------------------------------------------------------
r58252 | nobu | 2017-04-05 16:07:51 +0900 (Wed, 05 Apr 2017) | 3 lines

configure.in: HAVE_MALLOC_CONF

* configure.in: define HAVE_MALLOC_CONF when using jemalloc.
------------------------------------------------------------------------
r58251 | nobu | 2017-04-05 10:36:21 +0900 (Wed, 05 Apr 2017) | 4 lines

default.mspec: job server

* spec/default.mspec: override MSpecScript#cores by the tokens
  from the parent make job server.
------------------------------------------------------------------------
r58250 | nobu | 2017-04-05 09:12:43 +0900 (Wed, 05 Apr 2017) | 3 lines

parse.y: ID for logop

* parse.y (logop): use ID instead of token values.
------------------------------------------------------------------------
r58249 | svn | 2017-04-05 08:42:01 +0900 (Wed, 05 Apr 2017) | 1 line

* 2017-04-05
------------------------------------------------------------------------
r58248 | nobu | 2017-04-05 08:42:00 +0900 (Wed, 05 Apr 2017) | 4 lines

parse.y: use idGE for tGEQ

* parse.y (arg): use ID directly for '>=' operator, without
  TOKEN2ID macro.
------------------------------------------------------------------------
r58247 | nobu | 2017-04-04 23:19:04 +0900 (Tue, 04 Apr 2017) | 4 lines

parse.y: share with ripper

* parse.y (rb_parser_trace_lex_state, rb_parser_show_bitstack):
  share with ripper.
------------------------------------------------------------------------
r58246 | nobu | 2017-04-04 23:13:46 +0900 (Tue, 04 Apr 2017) | 4 lines

parse.y: flush debug buffer

* parse.y (rb_parser_trace_lex_state, rb_parser_show_bitstack):
  flush debug buffer before traces of lex_state and bitstack.
------------------------------------------------------------------------
r58245 | akr | 2017-04-04 21:54:42 +0900 (Tue, 04 Apr 2017) | 2 lines

Refactored using Method#owner.

------------------------------------------------------------------------
r58244 | stomar | 2017-04-04 04:23:13 +0900 (Tue, 04 Apr 2017) | 5 lines

improve docs for #truncate, #floor, and #ceil methods

* numeric.c: [DOC] improve and harmonize documentation
  for {Float,Integer,Numeric}#{truncate,floor,ceil}.
* rational.c: [DOC] ditto for Rational#{truncate,floor,ceil}.
------------------------------------------------------------------------
r58243 | svn | 2017-04-04 04:19:21 +0900 (Tue, 04 Apr 2017) | 1 line

* 2017-04-04
------------------------------------------------------------------------
r58242 | stomar | 2017-04-04 04:19:20 +0900 (Tue, 04 Apr 2017) | 5 lines

improve docs for #round methods

* numeric.c: [DOC] improve and harmonize documentation
  for {Float,Integer,Numeric}#round.
* rational.c: [DOC] ditto for Rational#round.
------------------------------------------------------------------------
r58241 | kazu | 2017-04-03 21:30:04 +0900 (Mon, 03 Apr 2017) | 1 line

Fix arguments order of IO#pwrite
------------------------------------------------------------------------
r58240 | nobu | 2017-04-03 09:10:50 +0900 (Mon, 03 Apr 2017) | 14 lines

Add IO#pread and IO#pwrite methods

These methods are useful for safe/concurrent file I/O in
multi-thread/process environments and also fairly standard
nowadays especially in systems supporting pthreads.

Based on patches by Avseyev <sergey.avseyev@gmail.com> at
[ruby-core:79290].  [Feature #4532]

* configure.in: check for pwrite(2).  pread() is already used
  internally for IO.copy_stream.

* io.c: implement wrappers for pread(2) and pwrite(2) and expose
  them in IO.
------------------------------------------------------------------------
r58239 | svn | 2017-04-03 05:16:02 +0900 (Mon, 03 Apr 2017) | 1 line

* 2017-04-03
------------------------------------------------------------------------
r58238 | normal | 2017-04-03 05:16:02 +0900 (Mon, 03 Apr 2017) | 9 lines

compile.c: avoid duplicate mark entry for string literal Range

iseq_add_mark_object is called in iseq_set_sequence later on,
so we only need to call iseq_add_mark_object_compile_time
in iseq_peephole_optimize.  Without this change, there would've
been a duplicate entry in the long-lived iseq mark_ary.

* compile.c (iseq_peephole_optimize): avoid duplicate mark object entry
  [ruby-core:80536] [Feature #13355]
------------------------------------------------------------------------
r58237 | nobu | 2017-04-02 12:05:10 +0900 (Sun, 02 Apr 2017) | 1 line

update configure by prereq [ci skip]
------------------------------------------------------------------------
r58236 | normal | 2017-04-02 10:14:14 +0900 (Sun, 02 Apr 2017) | 8 lines

thread.c: comments on M:N threading [ci skip]

I may experiment with M:N threading in coming months.  Often I
find myself yearning for the old 1.8 days when spawning threads
was really cheap for network operations.  But I also like to use
native blocking recv_io and accept calls for round-robin load
distribution and accessing files on systems with dozens of slow
rotational disks.
------------------------------------------------------------------------
r58235 | nobu | 2017-04-02 07:48:01 +0900 (Sun, 02 Apr 2017) | 4 lines

rational.c: improves Rational#round rdoc [ci skip]

* rational.c (nurat_round_n): [DOC] improves Integer#round
  documentation as well as Float#round.
------------------------------------------------------------------------
r58234 | normal | 2017-04-02 07:18:25 +0900 (Sun, 02 Apr 2017) | 5 lines

test/ruby/test_optimization.rb: quiet warnings

This quiets an old "assigned but unused variable" warning left
over after r56653 as well as two new "ambiguous first argment"
warnings introduced in r58233.
------------------------------------------------------------------------
r58233 | normal | 2017-04-02 06:38:25 +0900 (Sun, 02 Apr 2017) | 16 lines

compile.c: optimize literal String range in case/when dispatch

This is similar in spirit to opt_case_dispatch as the literal
Range here is guaranteed to be immutable when used for
checkmatch.

Normal range literals with non-frozen strings are actually
mutable, as Range#begin and Range#end exposes the strings to
modification.  So those Range objects cannot be frozen without
breaking compatibility, but Ranges in case/when dispatch can be
frozen at compile time.

* compile.c (iseq_peephole_optimize): persistent Range creation
  when String literals are used as beginning and end of range
  when used for case/when dispatch.
  [ruby-core:80290] [Feature #13355]
------------------------------------------------------------------------
r58232 | stomar | 2017-04-02 05:43:35 +0900 (Sun, 02 Apr 2017) | 1 line

doc/contributors.rdoc: [DOC] update
------------------------------------------------------------------------
r58231 | svn | 2017-04-02 05:20:00 +0900 (Sun, 02 Apr 2017) | 1 line

* 2017-04-02
------------------------------------------------------------------------
r58230 | stomar | 2017-04-02 05:19:59 +0900 (Sun, 02 Apr 2017) | 11 lines

rational.c: improve docs

* rational.c: [DOC] improve docs for Rational and related methods
  * improve class documentation for Rational
  * fix call-seq's
  * simplify examples for Rational#{floor,ceil,truncate,round}
  * fix wrong examples for #floor, subtraction, and exponentiation
  * improve docs for #<=>, Kernel#Rational, {String,Float}#to_r,
    Integer.{gcd,lcm,gcdlcm}
  * fix typos, grammar, and rdoc formatting
  * other improvements
------------------------------------------------------------------------
r58229 | eregon | 2017-04-01 19:30:48 +0900 (Sat, 01 Apr 2017) | 6 lines

ostruct.rb: improve fix for OpenStruct.allocate + #respond_to?

* lib/ostruct.rb (OpenStruct#respond_to_missing?): this makes
  OpenStruct#respond_to? works on any OpenStruct instance,
  just like Kernel#respond_to? does, without workarounds.
  [ruby-core:80292] [Bug #13358]
------------------------------------------------------------------------
r58228 | svn | 2017-04-01 16:38:13 +0900 (Sat, 01 Apr 2017) | 1 line

* 2017-04-01
------------------------------------------------------------------------
r58227 | nobu | 2017-04-01 16:38:12 +0900 (Sat, 01 Apr 2017) | 6 lines

array.c: Array#append and Array#prepend

* array.c (Init_Array): Add alias "append" to Array#push, and
  "prepend" to Array#unshift.  [Feature #12746] [Fix GH-1574]

Author:    pascbjumper2 <stowers.joshua@live.com>
------------------------------------------------------------------------
r58226 | nobu | 2017-03-31 16:34:47 +0900 (Fri, 31 Mar 2017) | 3 lines

exts.mk.tmpl: note footer [ci skip]

* template/exts.mk.tmpl: place note footer message at the end.
------------------------------------------------------------------------
r58225 | nobu | 2017-03-31 16:34:46 +0900 (Fri, 31 Mar 2017) | 3 lines

debug.c: check codepage value [ci skip]

* debug.c (set_debug_option): check garbage and overflow.
------------------------------------------------------------------------
r58224 | nobu | 2017-03-31 09:35:02 +0900 (Fri, 31 Mar 2017) | 7 lines

RUBY_DEBUG codepage option [ci skip]

* debug.c (set_debug_option): add "codepage" option to force
  locale charmap on Windows.

* localeinit.c (locale_charmap): use the codepage by debug env if
  given.
------------------------------------------------------------------------
r58223 | nobu | 2017-03-31 09:35:01 +0900 (Fri, 31 Mar 2017) | 4 lines

setup.mak: ENABLE_DEBUG_ENV [ci skip]

* win32/setup.mak (-basic-vars-): pass ENABLE_DEBUG_ENV to
  Makefile.
------------------------------------------------------------------------
r58222 | svn | 2017-03-31 00:20:52 +0900 (Fri, 31 Mar 2017) | 1 line

* 2017-03-31
------------------------------------------------------------------------
r58221 | nobu | 2017-03-31 00:20:52 +0900 (Fri, 31 Mar 2017) | 5 lines

localeinit.c: locale_charmap return value

* localeinit.c (locale_charmap): fix the return value to call conv
  function instead of encoding index on platforms where locale
  information is not available.
------------------------------------------------------------------------
r58220 | nobu | 2017-03-30 16:25:13 +0900 (Thu, 30 Mar 2017) | 1 line

.travis.yml: make tests silent [ci skip]
------------------------------------------------------------------------
r58219 | nobu | 2017-03-30 16:16:20 +0900 (Thu, 30 Mar 2017) | 1 line

.travis.yml: checkout ruby/spec PR
------------------------------------------------------------------------
r58218 | nobu | 2017-03-30 16:04:14 +0900 (Thu, 30 Mar 2017) | 4 lines

git-refresh: rewrite options

* tool/git-refresh: parse options without git-rev-parse, which is
  old on travis.
------------------------------------------------------------------------
r58217 | nobu | 2017-03-30 15:44:27 +0900 (Thu, 30 Mar 2017) | 5 lines

tool/git-refresh

* tool/git-refresh: tool to clone or update git working directory.

* Makefile.in: use git-refresh.
------------------------------------------------------------------------
r58216 | svn | 2017-03-30 04:12:02 +0900 (Thu, 30 Mar 2017) | 1 line

* 2017-03-30
------------------------------------------------------------------------
r58215 | stomar | 2017-03-30 04:12:01 +0900 (Thu, 30 Mar 2017) | 4 lines

methods.rdoc: small improvements

* doc/syntax/methods.rdoc: [DOC] small improvements: fix some typos,
  grammar, punctuation, consistently use capitalized "Ruby".
------------------------------------------------------------------------
r58212 | mame | 2017-03-29 20:49:39 +0900 (Wed, 29 Mar 2017) | 3 lines

Fix two typos

My typo checker :-) found the bugs.
------------------------------------------------------------------------
r58211 | sorah | 2017-03-29 20:33:59 +0900 (Wed, 29 Mar 2017) | 5 lines

string.c: Supress logical-op-parentheses warning

* string.c(rb_str_upcase_bang): Supress logical-op-parentheses warning
  Patch by Fukuo Kadota <fukuo-kadota@cookpad.com>,
  Closes [GH-1570] [Bug #13387].
------------------------------------------------------------------------
r58210 | nobu | 2017-03-29 18:47:42 +0900 (Wed, 29 Mar 2017) | 4 lines

vsnprintf.c: prefix with precision

* vsnprintf.c (BSD_vfprintf): sign and hex-prefix should not be
  counted in precision.  [ruby-dev:47714] [Bug #8916]
------------------------------------------------------------------------
r58209 | nobu | 2017-03-29 18:47:40 +0900 (Wed, 29 Mar 2017) | 4 lines

test_minitest_unit.rb: assert_triggered

* test/minitest/test_minitest_unit.rb (assert_triggered): rename
  to be hidden in backtraces.
------------------------------------------------------------------------
r58208 | sorah | 2017-03-29 18:31:13 +0900 (Wed, 29 Mar 2017) | 5 lines

Add documents on Process::CLOCK_* constants

* process.c: Add documents on Process::CLOCK_* constants.
  Patch by Sunao Komuro <sunao-komuro@cookpad.com>.
  Closes [GH-1567] [Bug #13386]
------------------------------------------------------------------------
r58207 | sorah | 2017-03-29 18:24:10 +0900 (Wed, 29 Mar 2017) | 8 lines

Fix `make clean` errors

Patch by Kohei Suzuki <eagletmt@gmail.com>.

* common.mk(clean-rubyspec): Supress error messages when rubyspec files
  don't exist. [GH-1563] [Bug #13384]

* Makefile.in: Fix error when files don't exist. [GH-1563] [Bug #13384]
------------------------------------------------------------------------
r58206 | nobu | 2017-03-29 14:54:14 +0900 (Wed, 29 Mar 2017) | 4 lines

parse.y: dot_or_colon

* parse.y (dot_or_colon): use the default action without type
  casts.
------------------------------------------------------------------------
r58205 | sorah | 2017-03-29 13:32:00 +0900 (Wed, 29 Mar 2017) | 9 lines

Remove unused Init_frozen_strings declaration

Init_frozen_strings definition is removed in r51511.
https://bugs.ruby-lang.org/issues/11423

Patch by Kohei Suzuki <eagletmt@gmail.com>

* internal.h: Remove declaration of unexist function
  [Fix GH-1558]
------------------------------------------------------------------------
r58204 | nobu | 2017-03-29 12:00:50 +0900 (Wed, 29 Mar 2017) | 1 line

test_symbol.rb: switch to assert_not_equal
------------------------------------------------------------------------
r58201 | svn | 2017-03-29 02:14:50 +0900 (Wed, 29 Mar 2017) | 1 line

* 2017-03-29
------------------------------------------------------------------------
r58200 | normal | 2017-03-29 02:14:49 +0900 (Wed, 29 Mar 2017) | 8 lines

test/ruby/test_symbol.rb: new test for nondeterminism

We need to ensure hashes for static symbols remain
non-deterministic to avoid DoS attacks.   This is currently the
case since 2.4+, but was not for the 2.3 series.

* test/ruby/test_symbol.rb (test_hash_nondeterministic): new test
  [ruby-core:80430] [Bug #13376]
------------------------------------------------------------------------
r58198 | kazu | 2017-03-28 22:47:45 +0900 (Tue, 28 Mar 2017) | 1 line

fix a typo [ci skip]
------------------------------------------------------------------------
r58197 | kazu | 2017-03-28 22:47:43 +0900 (Tue, 28 Mar 2017) | 1 line

Update assertion message [ci skip]
------------------------------------------------------------------------
r58195 | nobu | 2017-03-28 18:21:58 +0900 (Tue, 28 Mar 2017) | 4 lines

ostruct.rb: refine visibility failure message

* lib/ostruct.rb (method_missing): raise an exception with proper
  visibility message.
------------------------------------------------------------------------
r58192 | nobu | 2017-03-28 11:30:14 +0900 (Tue, 28 Mar 2017) | 4 lines

numeric.c: improves Integer#round rdoc [ci skip]

* numeric.c (int_round): [DOC] improves Integer#round documentation
  as well as Float#round.
------------------------------------------------------------------------
r58191 | svn | 2017-03-28 11:15:52 +0900 (Tue, 28 Mar 2017) | 1 line

* 2017-03-28
------------------------------------------------------------------------
r58190 | nobu | 2017-03-28 11:15:51 +0900 (Tue, 28 Mar 2017) | 6 lines

numeric.c: improves Float#round rdoc [ci skip]

* numeric.c (flo_round): [DOC] improves Float#round documentation
  to better highlight the half keyword.  [Fix GH-1541]

Author:    Evan Brodie <brodie.evan@gmail.com>
------------------------------------------------------------------------
r58156 | nobu | 2017-03-27 23:57:08 +0900 (Mon, 27 Mar 2017) | 10 lines

dir.c: err at glob failure

* dir.c (glob_helper): raise a SystemCallError exception when
  opendir() failed, except for ENOENT, ENOTDIR, and EACCES.  this
  behavior predates 1.0; the comments in glob.c claimed that
  glob() returned -1 on error but actualy the pointer to a global
  variable, then dir_glob() did check only -1 as the comments, and
  ignored actual errors.  [ruby-core:80226] [Bug #13276]

dir.c: ruby_glob_funcs_t
------------------------------------------------------------------------
r58150 | nobu | 2017-03-27 22:15:48 +0900 (Mon, 27 Mar 2017) | 6 lines

error.c: warning functions

* error.c: define warning functions in all combinations of
  * no errno, system errno, argument
  * without/with encoding
  * enabled/disabled by default
------------------------------------------------------------------------
r58146 | nobu | 2017-03-27 19:44:32 +0900 (Mon, 27 Mar 2017) | 7 lines

error.c: refactor warning messages

* error.c (with_warning_string): extract building warning message
  string from variadic arguments.

* error.c (syserr_warning): write warning message with the system
  error message.
------------------------------------------------------------------------
r58145 | svn | 2017-03-27 15:12:38 +0900 (Mon, 27 Mar 2017) | 1 line

* 2017-03-27
------------------------------------------------------------------------
r58144 | normal | 2017-03-27 15:12:37 +0900 (Mon, 27 Mar 2017) | 14 lines

fix redefinition optimization for -"literal string" (UMinus)

Unfortunately this enlarges insns.def by yet another
instruction.  However, it is much prettier than opt_str_freeze
in use, and maybe we can avoid having so many instructions in
the future.

[ruby-core:80368]

* insns.def (DEFINE_INSN): new instruction: opt_str_uminus (maybe temporary)
* compile.c (iseq_compile_each0): split instructions
* test/ruby/test_optimization.rb (test_string_uminus): new test
* vm.c (vm_init_redefined_flag): set redefinintion flag for uminus
* vm_core.h (enum ruby_basic_operators): add BOP_UMINUS
------------------------------------------------------------------------
r58142 | normal | 2017-03-26 19:21:45 +0900 (Sun, 26 Mar 2017) | 3 lines

NEWS: feature number for String#-@ compile-time optimization

[ruby-core:79971] [Feature #13295]
------------------------------------------------------------------------
r58138 | nobu | 2017-03-26 16:13:43 +0900 (Sun, 26 Mar 2017) | 5 lines

parse.y: unterminated content token

* parse.y (parser_parse_string): defer the end token to next
  reading, to yield tSTRING_CONTENT with the unterminated content.
  [Bug #13363]
------------------------------------------------------------------------
r58136 | nobu | 2017-03-26 10:21:57 +0900 (Sun, 26 Mar 2017) | 3 lines

gmake.mk: multi mspec

* defs/gmake.mk (MSPECOPT): enable multi exec if parallel make.
------------------------------------------------------------------------
r58135 | nobu | 2017-03-26 09:50:59 +0900 (Sun, 26 Mar 2017) | 3 lines

common.mk: test-rubyspec

* common.mk (yes-test-rubyspec): make jobserver ready.
------------------------------------------------------------------------
r58134 | svn | 2017-03-26 05:35:52 +0900 (Sun, 26 Mar 2017) | 1 line

* 2017-03-26
------------------------------------------------------------------------
r58133 | svn | 2017-03-26 05:35:52 +0900 (Sun, 26 Mar 2017) | 1 line

* properties.
------------------------------------------------------------------------
r58132 | usa | 2017-03-26 05:35:51 +0900 (Sun, 26 Mar 2017) | 4 lines

Add a tool for backporters.

* tool/generate-backport-changelog.rb: Generate ChangeLog entries from svn log.

------------------------------------------------------------------------
r58084 | nobu | 2017-03-25 16:46:12 +0900 (Sat, 25 Mar 2017) | 4 lines

configure.in: syscall is deprecated on macOS

* configure.in: syscall is no longer supported on macOS since
  10.12.  [ruby-core:80300] [Bug #13361]
------------------------------------------------------------------------
r58083 | nobu | 2017-03-25 12:23:43 +0900 (Sat, 25 Mar 2017) | 5 lines

class.c: prohibit refinement module

* class.c (ensure_includable): cannot include refinement
  module, or the type and the class do not match.
  [ruby-core:79632] [Bug #13236]
------------------------------------------------------------------------
r58082 | nobu | 2017-03-25 11:57:30 +0900 (Sat, 25 Mar 2017) | 4 lines

class.c: ensure_includable

* class.c (ensure_includable): extract checks to include and
  prepend.
------------------------------------------------------------------------
r58081 | svn | 2017-03-25 10:07:36 +0900 (Sat, 25 Mar 2017) | 1 line

* 2017-03-25
------------------------------------------------------------------------
r58080 | nobu | 2017-03-25 10:07:35 +0900 (Sat, 25 Mar 2017) | 5 lines

keep line number after unterminated string literal

* parse.y (parser_parse_string): keep line number even after an
  unterminated string literal.  it does not matter in the parser,
  ripper needs this value after this error.
------------------------------------------------------------------------
r58078 | naruse | 2017-03-24 23:05:50 +0900 (Fri, 24 Mar 2017) | 1 line

export_changelog must specify the branch's url
------------------------------------------------------------------------
r58077 | nobu | 2017-03-24 21:16:54 +0900 (Fri, 24 Mar 2017) | 5 lines

ostruct.rb: fix OpenStruct.allocate

* lib/ostruct.rb (OpenStruct.allocate): initialize an instance
  variable directly, without calling `intialize` method which may
  be overridden in a subclass.  [ruby-core:80292] [Bug #13358]
------------------------------------------------------------------------
r58076 | normal | 2017-03-24 16:29:33 +0900 (Fri, 24 Mar 2017) | 5 lines

logger: remove redundant opt_str_freeze use

Strings in "when" statements are allocation-free, so there's
never any reason to uglify the code to use opt_str_freeze over
the normal putobject instructions, here.
------------------------------------------------------------------------
r58075 | nobu | 2017-03-24 13:37:28 +0900 (Fri, 24 Mar 2017) | 4 lines

Do not update Unicode headers

* common.mk (name2ctype.h, casefold.h): use as checked out unless
  ALWAYS_UPDATE_UNICODE=yes.
------------------------------------------------------------------------
r58074 | nobu | 2017-03-24 12:42:28 +0900 (Fri, 24 Mar 2017) | 4 lines

Don't download from Unicode.org

* tool/make-snapshot: use checked out headers for Unicode, to get
  rid of downloading data files from Unicode.org.
------------------------------------------------------------------------
r58073 | nobu | 2017-03-24 11:44:21 +0900 (Fri, 24 Mar 2017) | 1 line

common.mk: touch-unicode-files
------------------------------------------------------------------------
r58072 | nobu | 2017-03-24 10:10:46 +0900 (Fri, 24 Mar 2017) | 1 line

Make Unicode data directory
------------------------------------------------------------------------
r58071 | nobu | 2017-03-24 08:55:29 +0900 (Fri, 24 Mar 2017) | 4 lines

Don't download from Unicode.org

* .travis.yml, appveyor.yml: use checked out headers for Unicode,
  to get rid of downloading data files from Unicode.org.
------------------------------------------------------------------------
r58070 | nobu | 2017-03-24 00:55:00 +0900 (Fri, 24 Mar 2017) | 4 lines

enc-unicode.rb: fix version matching

* tool/enc-unicode.rb (data_foreach): version comments do not
  include sub directory names.
------------------------------------------------------------------------
r58069 | nobu | 2017-03-24 00:49:10 +0900 (Fri, 24 Mar 2017) | 6 lines

fix GraphemeBreakProperty.txt

* tool/downloader.rb: download to the file given in ARGV.

* tool/enc-unicode.rb (parse_GraphemeBreakProperty): fix data file
  path as $(UNICODE_PROPERTY_FILES) in common.mk.
------------------------------------------------------------------------
r58068 | svn | 2017-03-24 00:47:27 +0900 (Fri, 24 Mar 2017) | 1 line

* 2017-03-24
------------------------------------------------------------------------
r58067 | nobu | 2017-03-24 00:47:26 +0900 (Fri, 24 Mar 2017) | 4 lines

common.mk: updating name2ctype.h

* common.mk (name2ctype.h): update if ALWAYS_UPDATE_UNICODE = yes,
  as well as casefold.h.
------------------------------------------------------------------------
r58066 | nobu | 2017-03-23 16:59:57 +0900 (Thu, 23 Mar 2017) | 4 lines

enc-unicode.rb: ifdef blocks

* tool/enc-unicode.rb (Unifdef#ifdef): enclose conditional blocks
  in blocks.
------------------------------------------------------------------------
r58065 | nobu | 2017-03-23 16:59:56 +0900 (Thu, 23 Mar 2017) | 1 line

enc-unicode.rb: uniname2ctype_offset
------------------------------------------------------------------------
r58064 | nobu | 2017-03-23 16:53:35 +0900 (Thu, 23 Mar 2017) | 4 lines

update name2ctype.h

* enc/unicode/9.0.0/name2ctype.h: update due to merger of Onigmo
  6.0.0.
------------------------------------------------------------------------
r58063 | svn | 2017-03-23 05:23:42 +0900 (Thu, 23 Mar 2017) | 1 line

* 2017-03-23
------------------------------------------------------------------------
r58062 | stomar | 2017-03-23 05:23:42 +0900 (Thu, 23 Mar 2017) | 3 lines

io.c: [DOC] expand docs for IO#puts

[ruby-core:80081] [Bug #13306]
------------------------------------------------------------------------
r58059 | nobu | 2017-03-22 23:06:57 +0900 (Wed, 22 Mar 2017) | 4 lines

stringio.gemspec: requires ruby 2.2

* ext/stringio/stringio.gemspec: bump up required ruby version to
  2.2, which exports rb_get_kwargs() first.
------------------------------------------------------------------------
r58057 | nobu | 2017-03-22 22:55:03 +0900 (Wed, 22 Mar 2017) | 4 lines

stringio.c: RB_INTEGER_TYPE_P

* ext/stringio/stringio.c (RB_INTEGER_TYPE_P): fallback definition
  for 2.3 or earlier.
------------------------------------------------------------------------
r58055 | kazu | 2017-03-22 21:27:53 +0900 (Wed, 22 Mar 2017) | 1 line

Use https URL instead of http URL
------------------------------------------------------------------------
r58054 | shyouhei | 2017-03-22 15:00:18 +0900 (Wed, 22 Mar 2017) | 11 lines

ruby tool/update-deps --fix

Onigumo 6 (r57045) introduced new onigumo.h header file, which is
required from quite much everywhere.  This commit adds necessary
dependencies.

Note: ruby/oniguruma.h now includes onigumo.h,
      ruby/io.h includes oniguruma.h,
      ruby/encoding.h also includes oniguruma.h,
      and internal.h includes encoding.h.

------------------------------------------------------------------------
r58050 | svn | 2017-03-22 10:58:17 +0900 (Wed, 22 Mar 2017) | 1 line

* 2017-03-22
------------------------------------------------------------------------
r58049 | nobu | 2017-03-22 10:58:17 +0900 (Wed, 22 Mar 2017) | 1 line

gemify stringio
------------------------------------------------------------------------
r58044 | nobu | 2017-03-21 17:03:49 +0900 (Tue, 21 Mar 2017) | 1 line

Download Unicode data by appveyor [ci skip]
------------------------------------------------------------------------
r58043 | nobu | 2017-03-21 16:19:23 +0900 (Tue, 21 Mar 2017) | 1 line

tool/downloader.rb: dryrun option [ci skip]
------------------------------------------------------------------------
r58042 | nobu | 2017-03-21 14:28:38 +0900 (Tue, 21 Mar 2017) | 6 lines

string.c: use the usable size

* string.c (rb_str_change_terminator_length): when called after
  the content has been copied, old terminator length no longer
  makes sense.  use the whole usable size instead of capacity
  without terminator.  [ruby-core:80257] [Bug #13339]
------------------------------------------------------------------------
r58041 | nobu | 2017-03-21 12:15:57 +0900 (Tue, 21 Mar 2017) | 4 lines

stringio.c: check range

* ext/stringio/stringio.c (strio_ungetc): raise RangeError instead
  of TypeError at too big value, as well as IO#ungetc.
------------------------------------------------------------------------
r58040 | nobu | 2017-03-21 12:15:56 +0900 (Tue, 21 Mar 2017) | 5 lines

stringio.c: check character code

* ext/stringio/stringio.c (strio_ungetc): check if the character
  code is valid in the encoding.  reported by Ahmad Sherif
  (ahmadsherif) at https://hackerone.com/reports/209593.
------------------------------------------------------------------------
r58039 | kazu | 2017-03-21 09:11:46 +0900 (Tue, 21 Mar 2017) | 4 lines

link to README.win32 instead of mentioning it in plain text

[Fix GH-1538][ci skip]
Author:    Rouan Wilsenach <Rouan.Wilsenach@tesglobal.com>
------------------------------------------------------------------------
r58038 | svn | 2017-03-21 05:30:26 +0900 (Tue, 21 Mar 2017) | 1 line

* 2017-03-21
------------------------------------------------------------------------
r58037 | stomar | 2017-03-21 05:30:25 +0900 (Tue, 21 Mar 2017) | 4 lines

docs for creating arrays

* array.c: [DOC] add example for Array.new with block and index.
  Reported by Don Cruickshank.  [ruby-core:68442] [Bug #10944]
------------------------------------------------------------------------
r58035 | hsbt | 2017-03-20 16:07:49 +0900 (Mon, 20 Mar 2017) | 3 lines

Added initial gemspec for mathn.

  [Feature #13335]
------------------------------------------------------------------------
r58034 | nobu | 2017-03-20 10:36:08 +0900 (Mon, 20 Mar 2017) | 3 lines

Avoid integer overflow in sprintf()

merged https://github.com/mruby/mruby/commit/ff03a9a61c62340cff62f8e0fdc1a1e8775b6f17
------------------------------------------------------------------------
r58033 | nobu | 2017-03-20 10:33:08 +0900 (Mon, 20 Mar 2017) | 4 lines

sprintf.c: string limits

* sprintf.c (ruby__sfvwrite): use long instead of size_t due to
  string limits.
------------------------------------------------------------------------
r58024 | svn | 2017-03-20 00:01:06 +0900 (Mon, 20 Mar 2017) | 1 line

* 2017-03-20
------------------------------------------------------------------------
r58023 | stomar | 2017-03-20 00:01:05 +0900 (Mon, 20 Mar 2017) | 7 lines

improve docs for URI::Generic

* lib/uri/generic.rb: [DOC] expand docs for URI::Generic#normalize
  to clarify what normalization means here.
  Reported by Robert Gleeson.  [ruby-core:58430] [Bug #9127]

* lib/uri/generic.rb: [DOC] fix indent for correct code block detection.
------------------------------------------------------------------------
r58021 | nobu | 2017-03-19 21:46:31 +0900 (Sun, 19 Mar 2017) | 4 lines

sprintf.c: use FILL

* sprintf.c (rb_str_format): use FILL and FILL_ macros instead of
  while loop.
------------------------------------------------------------------------
r58020 | stomar | 2017-03-19 18:51:29 +0900 (Sun, 19 Mar 2017) | 7 lines

date_core.c: fix error in DateTime docs

* ext/date/date_core.c: [DOC] fix format string for DateTime#rfc3339.
  Reported by Andreas Rayo Kniep.  [ruby-core:68418] [Bug #10936]

* ext/date/date_core.c: [DOC] ditto for DateTime#iso8601 and
  DateTime#xmlschema; other small improvements.
------------------------------------------------------------------------
r58019 | nobu | 2017-03-19 10:11:12 +0900 (Sun, 19 Mar 2017) | 9 lines

vm_args.c: arity check of lambda

* vm_eval.c (rb_yield_lambda): new function which yields an array
  to a proc and splat to a lambda.  mainly for Enumerable only.

* vm_args.c (setup_parameters_complex): remove special lambda
  splatting for [Bug #9605].  [ruby-core:77065] [Bug #12705]

* vm_insnhelper.c (vm_callee_setup_block_arg): ditto.
------------------------------------------------------------------------
r58018 | nobu | 2017-03-19 00:58:13 +0900 (Sun, 19 Mar 2017) | 1 line

test_lambda.rb: remove duplcate tests
------------------------------------------------------------------------
r58017 | svn | 2017-03-19 00:30:15 +0900 (Sun, 19 Mar 2017) | 1 line

* 2017-03-19
------------------------------------------------------------------------
r58016 | nobu | 2017-03-19 00:30:14 +0900 (Sun, 19 Mar 2017) | 5 lines

test_lambda.rb: refine test

* test/ruby/test_lambda.rb (test_lambda_as_iterator): refine a
  test for the intention of the original report.
  [ruby-core:61340] [Bug #9605]
------------------------------------------------------------------------
r58015 | nobu | 2017-03-18 23:22:15 +0900 (Sat, 18 Mar 2017) | 4 lines

vm_args.c: pass block

* vm_args.c (refine_sym_proc_call): pass block to the method when
  using refinements.  [ruby-core:80219] [Bug #13325]
------------------------------------------------------------------------
r58014 | nobu | 2017-03-18 22:15:15 +0900 (Sat, 18 Mar 2017) | 3 lines

vm.c: fix up r58012

* vm.c (invoke_iseq_block_from_c): fix stack region length.
------------------------------------------------------------------------
r58012 | nobu | 2017-03-18 20:29:35 +0900 (Sat, 18 Mar 2017) | 4 lines

vm.c: guard arguments [EXPERIMENTAL]

* vm.c (invoke_iseq_block_from_c): guard arguments on stack, not
  to be clobbered during splatting.
------------------------------------------------------------------------
r58011 | nobu | 2017-03-18 19:37:53 +0900 (Sat, 18 Mar 2017) | 4 lines

.gdbinit: suppress gdb message [ci skip]

* .gdbinit (rp): check number of instance variables to get rid of
  "Invalid number 0 of repetitions."  message at an empty object.
------------------------------------------------------------------------
r58010 | nobu | 2017-03-18 19:19:52 +0900 (Sat, 18 Mar 2017) | 4 lines

.gdbinit: RArray in history [ci skip]

* .gdbinit (rp): put the contents of RArray in value history, for
  later use.
------------------------------------------------------------------------
r58009 | duerst | 2017-03-18 10:35:03 +0900 (Sat, 18 Mar 2017) | 1 line

fix accidental reversal of r57997 in r58000
------------------------------------------------------------------------
r58008 | stomar | 2017-03-18 05:48:51 +0900 (Sat, 18 Mar 2017) | 10 lines

io.c: improve docs

* io.c: [DOC] improve and harmonize docs for IO#read and ARGF#read;
  fix invalid example code for IO#read to make it syntax highlighted.

* io.c: [DOC] various improvements for docs of IO, ARGF, and Kernel:
  fix indent to ensure correct code block detection; sync "outbuf"
  paragraph for {IO,ARGF}#read, {IO,ARGF}#readpartial, and IO#sysread;
  fix formatting of call-seq's; improve Kernel#open example to use nil?;
  fix RDoc markup and typos.
------------------------------------------------------------------------
r58007 | svn | 2017-03-18 04:59:57 +0900 (Sat, 18 Mar 2017) | 1 line

* 2017-03-18
------------------------------------------------------------------------
r58006 | normal | 2017-03-18 04:59:56 +0900 (Sat, 18 Mar 2017) | 14 lines

remove branches in dmark and dfree GC callbacks

dmark and dfree callbacks are never called in gc.c for NULL
DATA_PTR values, not even for zombie objects.

* compile.c (ibf_loader_mark): remove branch for pointer validity
* compile.c (ibf_loader_free): ditto
* cont.c (cont_free): ditto
* cont.c (fiber_free): ditto
* dir.c (dir_free): ditto
* ext/stringio/stringio.c (strio_mark): ditto
* proc.c (binding_free): ditto
* thread_sync.c (mutex_free): ditto
* vm.c (thread_free): ditto
------------------------------------------------------------------------
r58005 | kazu | 2017-03-17 22:24:14 +0900 (Fri, 17 Mar 2017) | 1 line

fix a typo [ci skip]
------------------------------------------------------------------------
r58004 | nobu | 2017-03-17 19:08:02 +0900 (Fri, 17 Mar 2017) | 4 lines

vm.c: check stack

* vm.c (invoke_iseq_block_from_c): check stack overflow before
  pushing arguments.
------------------------------------------------------------------------
r58000 | duerst | 2017-03-17 11:24:53 +0900 (Fri, 17 Mar 2017) | 6 lines

clarifiy 'codepoint' in documentation of String#each_codepoint

Make sure it's clear that the returned values are not Unicode codepoints
for encodings other than UTF-8/UTF-16(BE|LE)/UTF-32(BE|LE).

[ci skip] [Bug #13321]
------------------------------------------------------------------------
r57999 | svn | 2017-03-17 10:29:24 +0900 (Fri, 17 Mar 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r57998 | hsbt | 2017-03-17 10:29:22 +0900 (Fri, 17 Mar 2017) | 7 lines

Merge rubygems-2.6.11

  This version fixed regression of rubygems-2.6.10.
  https://github.com/rubygems/rubygems/pull/1856

  See details of changelogs for 2.6.11 release:
  https://github.com/rubygems/rubygems/blob/adfcf40502716080bd9cdfdd2e43bd4296872784/History.txt#L3
------------------------------------------------------------------------
r57997 | normal | 2017-03-17 09:55:55 +0900 (Fri, 17 Mar 2017) | 8 lines

deduplicate static rb_str_format format strings

Anybody who hits these code paths can hit them again in the
future, so try deduplicating across multiple runs of these
methods to reduce garbage.

* string.c (str_upto_each): fstring on "%.*d"
* strftime.c (rb_strftime_with_timespec): fstring on "%0*d"
------------------------------------------------------------------------
r57996 | normal | 2017-03-17 09:55:50 +0900 (Fri, 17 Mar 2017) | 6 lines

deduplicate File::NULL string

"/dev/null" is a common sight for pre-1.9.3-compatible code
targeting *nix systems, so deduplicate it here, as well.

* file.c (Init_File): use fstring for File::NULL
------------------------------------------------------------------------
r57995 | normal | 2017-03-17 09:55:45 +0900 (Fri, 17 Mar 2017) | 7 lines

deduplicate "/", ":" and "\n" strings

"/" and ":" are always statically registered in symbol.c (Init_op_tbl),
and "\n" is a commonly seen in source code.

* file.c (Init_File): fstring on File::SEPARATOR and File::PATH_SEPARATOR
* io.c (Init_IO): fstring on rb_default_rs ("\n")
------------------------------------------------------------------------
r57994 | normal | 2017-03-17 08:17:14 +0900 (Fri, 17 Mar 2017) | 5 lines

NEWS: document shorter opt_str_freeze usage

Users do not read commit messages, but maybe they read NEWS.

r57828 ("compile.c: apply opt_str_freeze to String#-@ (uminus)")
------------------------------------------------------------------------
r57993 | svn | 2017-03-17 05:58:59 +0900 (Fri, 17 Mar 2017) | 1 line

* 2017-03-17
------------------------------------------------------------------------
r57992 | stomar | 2017-03-17 05:58:58 +0900 (Fri, 17 Mar 2017) | 1 line

bignum.c: [DOC] typos and grammar
------------------------------------------------------------------------
r57991 | nobu | 2017-03-16 15:51:24 +0900 (Thu, 16 Mar 2017) | 4 lines

rational.c: initialize n

* rational.c (read_num): `n` was used uninitialized when the
  string started with a period.
------------------------------------------------------------------------
r57990 | nobu | 2017-03-16 12:35:29 +0900 (Thu, 16 Mar 2017) | 4 lines

rational.c: float denom

* rational.c (parse_rat): allow float as a denominator as well as
  a numerator.  [ruby-core:79104] [Bug #13134]
------------------------------------------------------------------------
r57989 | nobu | 2017-03-16 12:32:16 +0900 (Thu, 16 Mar 2017) | 5 lines

rational.c: read_num

* rational.c (read_num): use rb_int_parse_cstr to parse integer
  parts, and make String#to_r consistent with #to_i and #to_f.
  [ruby-core:80098] [Bug #13105]
------------------------------------------------------------------------
r57988 | nobu | 2017-03-16 12:21:12 +0900 (Thu, 16 Mar 2017) | 4 lines

bignum.c: rb_int_parse_cstr

* bignum.c (rb_int_parse_cstr): extend rb_cstr_parse_inum with
  flags.
------------------------------------------------------------------------
r57987 | nobu | 2017-03-16 12:05:34 +0900 (Thu, 16 Mar 2017) | 4 lines

test_rational.rb: invalid exponent

* test/ruby/test_rational.rb (test_parse): more checks for invalid
  exponent.  [ruby-core:80098] [Bug #13105]
------------------------------------------------------------------------
r57986 | nobu | 2017-03-16 11:02:47 +0900 (Thu, 16 Mar 2017) | 4 lines

test_rational.rb: duplicate assertions

* test/ruby/test_rational.rb (test_parse): remove duplicate
  assertions.
------------------------------------------------------------------------
r57985 | nobu | 2017-03-16 10:53:52 +0900 (Thu, 16 Mar 2017) | 4 lines

rational.c: zero division

* rational.c (read_rat_nos): denominator cannot be 0, raise zero
  division in that case.
------------------------------------------------------------------------
r57984 | svn | 2017-03-16 09:43:08 +0900 (Thu, 16 Mar 2017) | 1 line

* 2017-03-16
------------------------------------------------------------------------
r57983 | nobu | 2017-03-16 09:43:07 +0900 (Thu, 16 Mar 2017) | 4 lines

test_rational.rb: shorten

* test/ruby/test_rational.rb (test_parse): reduce repeated
  arguments.
------------------------------------------------------------------------
r57982 | nobu | 2017-03-15 21:41:56 +0900 (Wed, 15 Mar 2017) | 1 line

vm_insnhelper.c: adjust indent [ci skip]
------------------------------------------------------------------------
r57981 | svn | 2017-03-15 17:25:59 +0900 (Wed, 15 Mar 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r57980 | ko1 | 2017-03-15 17:25:58 +0900 (Wed, 15 Mar 2017) | 19 lines

add several counters to analyze ivar inline caches.

* debug_counter.h: add (and renamed) several counters:
  ivar_get_ic_hit
  ivar_get_ic_miss
  ivar_get_ic_miss_serial
  ivar_get_ic_miss_unset
  ivar_get_ic_miss_noobject
  ivar_set_ic_hit
  ivar_set_ic_miss
  ivar_set_ic_miss_serial
  ivar_set_ic_miss_unset
  ivar_set_ic_miss_oorange
  ivar_set_ic_miss_noobject
  ivar_get_base
  ivar_set_base

  See related source code to know what counters mean.

------------------------------------------------------------------------
r57979 | nobu | 2017-03-15 17:15:32 +0900 (Wed, 15 Mar 2017) | 7 lines

object.c: make String#to_f consistent with literal

* object.c (rb_cstr_to_dbl): stop at successive underscores, as
  well as Float literals.  [ruby-core:80098] [Bug #13105]

  * `_` should be within digits
  * only one `_` allowed between digits
------------------------------------------------------------------------
r57978 | nobu | 2017-03-15 16:57:11 +0900 (Wed, 15 Mar 2017) | 6 lines

string.c: shortcut argument check

* string.c (str_casecmp, str_casecmp_p): split to skip argument
  check when it is a String certainly.

* string.c (sym_casecmp, sym_casecmp_p): shortcut argument checks.
------------------------------------------------------------------------
r57977 | kazu | 2017-03-15 09:59:32 +0900 (Wed, 15 Mar 2017) | 1 line

io.c: [DOC] add missing `$`
------------------------------------------------------------------------
r57976 | marcandre | 2017-03-15 05:09:30 +0900 (Wed, 15 Mar 2017) | 2 lines

* lib/matrix.rb: Add Vector.zero and Vector#zero?
  Patch by Chia-sheng Chen [#13208]
------------------------------------------------------------------------
r57975 | svn | 2017-03-15 00:14:22 +0900 (Wed, 15 Mar 2017) | 1 line

* 2017-03-15
------------------------------------------------------------------------
r57974 | mame | 2017-03-15 00:14:21 +0900 (Wed, 15 Mar 2017) | 4 lines

Stop a global server of Rinda test

This server seemed to cause "leaked file descriptor" warnings.
Moved it into the setup/teardown framework.
------------------------------------------------------------------------
r57973 | kazu | 2017-03-14 23:46:10 +0900 (Tue, 14 Mar 2017) | 1 line

vm_insnhelper.c: undef BUILTIN_CLASS_P too
------------------------------------------------------------------------
r57972 | glass | 2017-03-14 21:53:32 +0900 (Tue, 14 Mar 2017) | 5 lines

Fix bug of Tempfile#size if nothing is written [Bug #13198]

* lib/tempfile.rb (Tempfile#size): Fix its behavior when nothing
  is written. Tempfile#size should return 0 in this case.
  The patch is from nobu <nobu@ruby-lang.org>.
------------------------------------------------------------------------
r57971 | mame | 2017-03-14 20:39:58 +0900 (Tue, 14 Mar 2017) | 6 lines

Fix a consistency bug of ISEQ_COVERAGE [Bug #13305]

There is an invariant that ISEQ_COVERAGE(iseq) must be Qnil if and only
if option->coverage_enabled is false.  This invariant was broken by
NODE_PRELUDE which updates option->coverage_enabled but not
ISEQ_COVERAGE(iseq).
------------------------------------------------------------------------
r57970 | ko1 | 2017-03-14 15:52:44 +0900 (Tue, 14 Mar 2017) | 6 lines

Fiber also has same issue. [Bug #13313]

* thread.c (rb_vm_proc_local_ep): added.

* cont.c (rb_fiber_start): use rb_vm_proc_local_ep().

------------------------------------------------------------------------
r57969 | nobu | 2017-03-14 14:54:35 +0900 (Tue, 14 Mar 2017) | 5 lines

thread.c: Thread.start with Symbol

* thread.c (thread_do_start): fix segfault at start with Symbol.
  proc created by Symbol#to_proc does not have environment unless
  using refinements.  [ruby-core:80147] [Bug #13313]
------------------------------------------------------------------------
r57968 | nobu | 2017-03-14 14:54:33 +0900 (Tue, 14 Mar 2017) | 4 lines

thread.c: thread_do_start

* thread.c (thread_do_start): extract from a macro in
  thread_start_func_2 for debugger.
------------------------------------------------------------------------
r57967 | nobu | 2017-03-14 13:16:02 +0900 (Tue, 14 Mar 2017) | 4 lines

envutil.rb: basename for diagnostic_reports

* test/lib/envutil.rb (EnvUtil.diagnostic_reports): diagnostic
  report file uses base name only.  [ci skip]
------------------------------------------------------------------------
r57966 | nobu | 2017-03-14 13:03:48 +0900 (Tue, 14 Mar 2017) | 5 lines

vm_core.h: assertions for Proc

* vm_core.h (vm_proc_block): assert before accessing.

* vm_core.h (vm_proc_iseq): remove duplicate assertion.
------------------------------------------------------------------------
r57965 | nobu | 2017-03-14 12:42:43 +0900 (Tue, 14 Mar 2017) | 4 lines

string.c: use rb_check_string_type

* string.c (rb_str_cmp_m): use rb_check_string_type for check and
  conversion, instead of calling the conversion method directly.
------------------------------------------------------------------------
r57964 | svn | 2017-03-14 05:20:40 +0900 (Tue, 14 Mar 2017) | 1 line

* 2017-03-14
------------------------------------------------------------------------
r57963 | stomar | 2017-03-14 05:20:40 +0900 (Tue, 14 Mar 2017) | 5 lines

docs for Symbol#casecmp and Symbol#casecmp?

* string.c: [DOC] improve docs of Symbol#casecmp and Symbol#casecmp?
  according to the similar String methods; fix RDoc markup and typos;
  fix call-seq's for Symbol#{upcase,downcase,capitalize,swapcase}.
------------------------------------------------------------------------
r57962 | nobu | 2017-03-13 23:59:08 +0900 (Mon, 13 Mar 2017) | 4 lines

sprintf.c: fix out-of-bound access

* sprintf.c (rb_str_format): get rid of out-of-bound access when
  single % at the end.
------------------------------------------------------------------------
r57961 | nobu | 2017-03-13 20:47:45 +0900 (Mon, 13 Mar 2017) | 1 line

string.c (rb_str_set_len): pathological check
------------------------------------------------------------------------
r57960 | nobu | 2017-03-13 18:29:19 +0900 (Mon, 13 Mar 2017) | 4 lines

file.c: join with /

* file.c (rb_file_join): join using "/" always, not a constant.
  and fix the document.  [ruby-core:79579] [Bug #13223]
------------------------------------------------------------------------
r57958 | nobu | 2017-03-13 18:12:05 +0900 (Mon, 13 Mar 2017) | 4 lines

string.c: $; is a GC-root

* string.c (Init_String): $; must be a GC-root, not to be
  collected.  [ruby-core:79582]
------------------------------------------------------------------------
r57956 | naruse | 2017-03-13 18:05:35 +0900 (Mon, 13 Mar 2017) | 4 lines

Raise error if spec is nil

With parallel test-all, the spec is sometimes nil.
To debug it raise more detailed error.
------------------------------------------------------------------------
r57955 | nobu | 2017-03-13 17:38:12 +0900 (Mon, 13 Mar 2017) | 5 lines

parse.y: relax `&' warning

* parse.y (parser_yylex): disable "`&' interpreted as argument
  prefix" warning when just followed by a symbol literal.
  [ruby-core:79926] [Misc #13283]
------------------------------------------------------------------------
r57951 | mrkn | 2017-03-13 15:03:18 +0900 (Mon, 13 Mar 2017) | 7 lines

bigdecimal: version 1.3.2

Import bigdecimal version 1.3.2.  The full commit log is here:

  https://github.com/ruby/bigdecimal/compare/v1.3.1...v1.3.2

This fixes [ruby-core:79603] [Bug #13232]
------------------------------------------------------------------------
r57950 | nobu | 2017-03-13 14:30:44 +0900 (Mon, 13 Mar 2017) | 4 lines

thread.c: rb_thread_fd_close [ci skip]

* thread.c (rb_thread_fd_close): remove deprecated. a couple of
  external libraries used it.  [ruby-core:80078] [Bug #13304]
------------------------------------------------------------------------
r57949 | nobu | 2017-03-13 12:30:11 +0900 (Mon, 13 Mar 2017) | 1 line

thread.c: rb_thread_fd_close no longer returns
------------------------------------------------------------------------
r57948 | nobu | 2017-03-13 11:14:15 +0900 (Mon, 13 Mar 2017) | 4 lines

thread.c: rb_thread_fd_close [ci skip]

* thread.c (rb_thread_fd_close): re-define only for abi-check,
  abort if called.  [ruby-core:80078] [Bug #13304]
------------------------------------------------------------------------
r57947 | nobu | 2017-03-13 09:11:25 +0900 (Mon, 13 Mar 2017) | 3 lines

compile.c: compile flip-flop

* compile.c (iseq_compile_each0): compile flip-flop directly.
------------------------------------------------------------------------
r57946 | nobu | 2017-03-13 09:11:24 +0900 (Mon, 13 Mar 2017) | 4 lines

compile.c: omit newrange

* compile.c (iseq_compile_each): omit creating literal-only range
  to be popped immediately.
------------------------------------------------------------------------
r57944 | naruse | 2017-03-13 03:40:07 +0900 (Mon, 13 Mar 2017) | 1 line

io.c: [DOC] IO#puts uses IO#write
------------------------------------------------------------------------
r57943 | svn | 2017-03-13 03:31:39 +0900 (Mon, 13 Mar 2017) | 1 line

* 2017-03-13
------------------------------------------------------------------------
r57942 | naruse | 2017-03-13 03:31:38 +0900 (Mon, 13 Mar 2017) | 1 line

Didn't work if backport field is empty
------------------------------------------------------------------------
r57908 | nobu | 2017-03-12 22:51:12 +0900 (Sun, 12 Mar 2017) | 4 lines

compile.c: compile_const_prefix

* compile.c (compile_const_prefix): rename, and check the result
  of parts of the prefix.
------------------------------------------------------------------------
r57892 | nobu | 2017-03-12 14:52:42 +0900 (Sun, 12 Mar 2017) | 4 lines

compile.c: omit newhash

* compile.c (iseq_compile_each): omit creating literal-only hash
  to be popped immediately.
------------------------------------------------------------------------
r57891 | nobu | 2017-03-12 14:48:58 +0900 (Sun, 12 Mar 2017) | 1 line

compile.c: NODE_VALUES must not be popped
------------------------------------------------------------------------
r57890 | nobu | 2017-03-12 07:44:26 +0900 (Sun, 12 Mar 2017) | 4 lines

compile.c: iseq_compile_each0

* compile.c (iseq_compile_each0): split from null node case to
  constify line and type.
------------------------------------------------------------------------
r57889 | nobu | 2017-03-12 07:37:50 +0900 (Sun, 12 Mar 2017) | 3 lines

compile.c: compile_when

* compile.c (compile_when): extract from iseq_compile_each.
------------------------------------------------------------------------
r57888 | nobu | 2017-03-12 07:25:32 +0900 (Sun, 12 Mar 2017) | 3 lines

compile.c: compile_case

* compile.c (compile_case): extract from iseq_compile_each.
------------------------------------------------------------------------
r57887 | stomar | 2017-03-12 06:32:46 +0900 (Sun, 12 Mar 2017) | 17 lines

lib/ostruct.rb: [DOC] revise docs for OpenStruct

* update paragraph on implementation:
  define_singleton_method is used, not define_method
* add call-seq with return values for each_pair
* adopt description of dig from Array and Hash
* fix description of the hash method
* :nodoc: initialize_copy, respond_to_missing?
* other small improvements, e.g. use the term `attribute' in the docs
  (instead of `member'), which is clearer for users of the class
* improve code examples: e.g. use more consistent style (always use
  double quotes, drop `p' and `puts', ...), update inspect output,
  use example data that is not prone to change (like population)
* add more code examples
* fix some small errors and grammar

[ruby-core:79265] [Bug #13159]
------------------------------------------------------------------------
r57886 | stomar | 2017-03-12 05:01:55 +0900 (Sun, 12 Mar 2017) | 5 lines

docs for String#casecmp and String#casecmp?

* string.c: [DOC] specify when String#casecmp and String#casecmp?
  return nil; modify examples to better show difference to <=>;
  fix RDoc markup and typos.
------------------------------------------------------------------------
r57883 | naruse | 2017-03-12 04:03:11 +0900 (Sun, 12 Mar 2017) | 3 lines

Generate log from svn log

When there's multiple revisions, all svn logs should be used.
------------------------------------------------------------------------
r57852 | svn | 2017-03-12 01:08:55 +0900 (Sun, 12 Mar 2017) | 1 line

* 2017-03-12
------------------------------------------------------------------------
r57851 | naruse | 2017-03-12 01:08:54 +0900 (Sun, 12 Mar 2017) | 1 line

suppress warning: shadowing outer local variable - dir & opt
------------------------------------------------------------------------
r57842 | nobu | 2017-03-11 22:24:08 +0900 (Sat, 11 Mar 2017) | 1 line

defs/gmake.mk: update again after comit [ci skip]
------------------------------------------------------------------------
r57836 | nobu | 2017-03-11 21:26:00 +0900 (Sat, 11 Mar 2017) | 6 lines

compile.c: constify flags

* compile.c (compile_cpath): return `noscoped` bit flag, instead
  of boolean flag.

* compile.c (iseq_compile_each): constify flags.
------------------------------------------------------------------------
r57835 | nobu | 2017-03-11 20:15:05 +0900 (Sat, 11 Mar 2017) | 1 line

test/ruby/test_require.rb: use squiggly heredocs
------------------------------------------------------------------------
r57829 | svn | 2017-03-11 05:09:07 +0900 (Sat, 11 Mar 2017) | 1 line

* 2017-03-11
------------------------------------------------------------------------
r57828 | normal | 2017-03-11 05:09:06 +0900 (Sat, 11 Mar 2017) | 5 lines

compile.c: apply opt_str_freeze to String#-@ (uminus)

The same optimization used for "literal string".freeze
can easily apply to uminus without introducing any
compatibility problems.
------------------------------------------------------------------------
r57827 | nobu | 2017-03-10 22:46:22 +0900 (Fri, 10 Mar 2017) | 4 lines

common.mk: ignore clean-rubyspec error [ci skip]

* common.mk (clean-rubyspec): nothing to clean before running
  rubyspec.
------------------------------------------------------------------------
r57826 | nobu | 2017-03-10 16:18:03 +0900 (Fri, 10 Mar 2017) | 7 lines

debug_counter.c: debug_counter_names [ci skip]

* debug_counter.c (debug_counter_names): stringize debug counter
  names by preprocessor.

* debug_counter.h (RB_DEBUG_COUNTER): define counter names outside
  the include guard, to expand multiple times.
------------------------------------------------------------------------
r57825 | nobu | 2017-03-10 14:34:27 +0900 (Fri, 10 Mar 2017) | 7 lines

configure.in: RUBY_SO_NAME as --with-soname

* configure.in (RUBY_SO_NAME): [EXPERIMENTAL] use the given name
  literally if --with-soname is specified.
  [ruby-core:79972] [Misc #13296]

[ci skip]
------------------------------------------------------------------------
r57824 | svn | 2017-03-10 04:48:10 +0900 (Fri, 10 Mar 2017) | 1 line

* 2017-03-10
------------------------------------------------------------------------
r57823 | stomar | 2017-03-10 04:48:09 +0900 (Fri, 10 Mar 2017) | 1 line

object.c: [DOC] simplify Object#tap example
------------------------------------------------------------------------
r57822 | nobu | 2017-03-09 15:44:57 +0900 (Thu, 09 Mar 2017) | 3 lines

rbconfig/sizeof: remove VPATH

* ext/rbconfig/sizeof/depend: remove VPATH for `make dist`.
------------------------------------------------------------------------
r57821 | normal | 2017-03-09 12:49:47 +0900 (Thu, 09 Mar 2017) | 4 lines

ext/socket/raddrinfo.c (addrinfo_mark): avoid needless branch

gc.c (gc_mark_children, case T_DATA) does not use
the dmark function pointer if DATA_PTR is NULL
------------------------------------------------------------------------
r57820 | nobu | 2017-03-09 12:38:06 +0900 (Thu, 09 Mar 2017) | 3 lines

goruby.c: FD leak [ci skip]

* goruby.c (goruby_options): fix potential FD leak.
------------------------------------------------------------------------
r57819 | nobu | 2017-03-09 12:31:53 +0900 (Thu, 09 Mar 2017) | 4 lines

rbconfig/sizeof: nmake VPATH

* ext/rbconfig/sizeof/depend: prepend VPATH for out-of-place build
  using nmake.
------------------------------------------------------------------------
r57818 | shyouhei | 2017-03-09 11:31:23 +0900 (Thu, 09 Mar 2017) | 6 lines

revert RB_FIXABLE related changesets [Bug #13288][Bug #13293][Bug #13294]

This commit is auto-generated using following command:

svn diff -r57807:57788 include internal.h bignum.c numeric.c compile.c insns.def object.c sprintf.c | patch -p0

------------------------------------------------------------------------
r57817 | nobu | 2017-03-09 11:10:27 +0900 (Thu, 09 Mar 2017) | 4 lines

fix UTF-32 valid_encoding?

* test/ruby/test_io_m17n.rb (TestIO_M17N#test_puts_widechar): do
  not use invalid codepoint.  [ruby-core:79966] [Bug #13292]
------------------------------------------------------------------------
r57816 | nobu | 2017-03-09 11:04:10 +0900 (Thu, 09 Mar 2017) | 9 lines

fix UTF-32 valid_encoding?

* enc/utf_32be.c (utf32be_mbc_enc_len): check arguments precisely.
  [ruby-core:79966] [Bug #13292]

* enc/utf_32le.c (utf32le_mbc_enc_len): ditto.

* regenc.h (UNICODE_VALID_CODEPOINT_P): predicate for valid
  Unicode codepoints.
------------------------------------------------------------------------
r57815 | nobu | 2017-03-09 10:55:43 +0900 (Thu, 09 Mar 2017) | 7 lines

test_utf16.rb: refine valid_encoding tests

* test/ruby/enc/test_utf16.rb (test_utf16be_valid_encoding):
  assert all data and use assert_predicate.

* test/ruby/enc/test_utf16.rb (test_utf16le_valid_encoding):
  ditto.
------------------------------------------------------------------------
r57814 | nobu | 2017-03-09 10:06:09 +0900 (Thu, 09 Mar 2017) | 1 line

make commit [ci skip]
------------------------------------------------------------------------
r57813 | normal | 2017-03-09 06:24:24 +0900 (Thu, 09 Mar 2017) | 3 lines

string.c (str_uminus): update doc for deduplication

As of r57698, String#-@ can return pre-existing strings.
------------------------------------------------------------------------
r57812 | svn | 2017-03-09 05:41:39 +0900 (Thu, 09 Mar 2017) | 1 line

* 2017-03-09
------------------------------------------------------------------------
r57811 | stomar | 2017-03-09 05:41:38 +0900 (Thu, 09 Mar 2017) | 9 lines

docs for FileUtils.ln methods

* lib/fileutils.rb: [DOC] add clarifying call-seq's for FileUtil.ln,
  ln_s, and ln_sf, with better argument names for the created link and
  link target.  Reported by Mike Vastola. [ruby-core:62532] [Bug #9829]

* lib/fileutils.rb: [DOC] further improve descriptions of FileUtils.ln
  and related methods; improve examples: relative links probably won't
  work in other dir, avoid `include', use more generic homedir name.
------------------------------------------------------------------------
r57810 | nobu | 2017-03-08 22:52:32 +0900 (Wed, 08 Mar 2017) | 1 line

great love
------------------------------------------------------------------------
r57809 | nobu | 2017-03-08 17:19:56 +0900 (Wed, 08 Mar 2017) | 3 lines

fix paren

* string.c (str_byte_substr): fix misplaced parenthesis at r56155.
------------------------------------------------------------------------
r57808 | nobu | 2017-03-08 16:34:13 +0900 (Wed, 08 Mar 2017) | 1 line

proc.c: preserve class name encoding in Proc#to_s
------------------------------------------------------------------------
r57807 | shyouhei | 2017-03-08 13:50:22 +0900 (Wed, 08 Mar 2017) | 10 lines

re-introduce __builtin_add_overflow

r57789 (74cdd89) was gradually "improve"d by naruse through r57793 to
r57806, resulted in reverting the efect of r57789 while retaining its
complexity.  I think the current situation is slightly worse than
before (same output complicated source code).

Here I introduce __builtin_add_overflow again, which (I think) is what
naruse wanted to do in r57793.

------------------------------------------------------------------------
r57806 | naruse | 2017-03-08 04:48:00 +0900 (Wed, 08 Mar 2017) | 1 line

Always use old RB_FIXABLE to allow double as argument
------------------------------------------------------------------------
r57805 | naruse | 2017-03-08 02:51:35 +0900 (Wed, 08 Mar 2017) | 3 lines

Revert r57803 "Avoid to cast the argument"

__builtin_add_overflow doesn't support double.
------------------------------------------------------------------------
r57804 | svn | 2017-03-08 02:46:55 +0900 (Wed, 08 Mar 2017) | 1 line

* 2017-03-08
------------------------------------------------------------------------
r57803 | naruse | 2017-03-08 02:46:54 +0900 (Wed, 08 Mar 2017) | 3 lines

Avoid to cast the argument

For 32bit environment and __int128 use cases.
------------------------------------------------------------------------
r57802 | kazu | 2017-03-07 22:04:39 +0900 (Tue, 07 Mar 2017) | 4 lines

string.c: [DOC] Fix a typo in String#dump

[Fix GH-1531][ci skip]
Author:    Alex Semyonov <alex@semyonov.us>
------------------------------------------------------------------------
r57801 | nobu | 2017-03-07 19:56:22 +0900 (Tue, 07 Mar 2017) | 5 lines

parse.y: remove trace

* parse.y (reg_named_capture_assign_iter): do not insert trace
  instructions before local variable assinments.  putobject is
  expected at first.  [ruby-core:79940] [Bug #13287]
------------------------------------------------------------------------
r57800 | nobu | 2017-03-07 18:13:41 +0900 (Tue, 07 Mar 2017) | 4 lines

string.c: negation of LONG_MIN

* string.c (rb_str_update): do not use negation of LONG_MIN, which
  is negative too.
------------------------------------------------------------------------
r57799 | nobu | 2017-03-07 18:07:57 +0900 (Tue, 07 Mar 2017) | 6 lines

string.c: fix integer overflow

* string.c (str_byte_substr): fix another integer overflow which
  can happen only when SHARABLE_MIDDLE_SUBSTRING is enabled.
  [ruby-core:79951] [Bug #13289]

------------------------------------------------------------------------
r57798 | naruse | 2017-03-07 15:33:49 +0900 (Tue, 07 Mar 2017) | 1 line

Use RB_POSFIXABLE and RB_NEGFIXABLE to avoid cast introduced at r57793
------------------------------------------------------------------------
r57797 | nobu | 2017-03-07 14:48:15 +0900 (Tue, 07 Mar 2017) | 5 lines

string.c: fix integer overflow

* string.c (rb_str_subpos): fix integer overflow which can happen
  only when SHARABLE_MIDDLE_SUBSTRING is enabled.  incorpolate
  https://github.com/mruby/mruby/commit/7db0786abdd243ba031e24683f
------------------------------------------------------------------------
r57796 | naruse | 2017-03-07 14:19:00 +0900 (Tue, 07 Mar 2017) | 1 line

suppress warning: shadowing outer local variable - e
------------------------------------------------------------------------
r57795 | naruse | 2017-03-07 14:11:02 +0900 (Tue, 07 Mar 2017) | 1 line

Supress warning: instance variable @repeat_count not initialized
------------------------------------------------------------------------
r57794 | hsbt | 2017-03-07 13:46:46 +0900 (Tue, 07 Mar 2017) | 1 line

Fix up r57788, Function is removed at readline-6.3.
------------------------------------------------------------------------
r57793 | naruse | 2017-03-07 12:35:47 +0900 (Tue, 07 Mar 2017) | 13 lines

Use ADD instead of MUL

* On recent CPUs, 2-operand MUL's latency is 3 cycle but ADD is 1 cycle.
* clang Optimizes `MUL rax,2` into `ADD rax,rax` but gcc7 doesn't.
* LONG2FIX is compiled into `lea r14,[r15+r15*1+0x1]`; this is 1cycle
  and run in parallel if the branch prediction is correct.
* Note that old (RB_POSFIXABLE(f) && RB_NEGFIXABLE(f)) is usually uses
  following instructions.
  * movabs rax,0x4000000000000000
  * add    rax,rdi
  * js
  It needs large immediate and Macro-Fusion is not applied.
  ADD and JO is much smaller though it is also Macro-Fusion unfriendly.
------------------------------------------------------------------------
r57792 | nobu | 2017-03-07 10:07:03 +0900 (Tue, 07 Mar 2017) | 7 lines

fix macro name

* tool/instruction.rb (VmBodyGenerator#make_header_prepare_stack):
  REG_CFP has been prefixed with VM_ at r56609.  [Bug #12527]

* tool/instruction.rb (VmBodyGenerator#make_footer_stack_val):
  ditto.
------------------------------------------------------------------------
r57791 | svn | 2017-03-07 04:42:37 +0900 (Tue, 07 Mar 2017) | 1 line

* 2017-03-07
------------------------------------------------------------------------
r57790 | stomar | 2017-03-07 04:42:36 +0900 (Tue, 07 Mar 2017) | 1 line

io.c: [DOC] open mode can be an integer; fix rdoc syntax
------------------------------------------------------------------------
r57789 | shyouhei | 2017-03-06 20:14:05 +0900 (Mon, 06 Mar 2017) | 9 lines

optimize FIXABLE macro

Looking at the source code, FIXABLE tends to be just before LOING2FIX
to check applicability of that operation.  Why not try computing first
then check for overflow, which should be optimial.

I also tried the same thing for unsigned types but resulted in slower
execution.  It seems RB_POSFIXABLE() is fast enough on modern CPUs.

------------------------------------------------------------------------
r57788 | hsbt | 2017-03-06 18:10:21 +0900 (Mon, 06 Mar 2017) | 1 line

Avoid to warning of clang with -Wincompatible-pointer-types.
------------------------------------------------------------------------
r57787 | nobu | 2017-03-06 17:10:20 +0900 (Mon, 06 Mar 2017) | 4 lines

readline.c: fix waiting fucntion

* ext/readline/readline.c (getc_body): use
  rb_w32_wait_events_blocking in block region.
------------------------------------------------------------------------
r57786 | shyouhei | 2017-03-06 16:25:18 +0900 (Mon, 06 Mar 2017) | 6 lines

LONG_LONG_MAX not always available

I was not aware of cases when LONG_LONG_MAX is undefined.  Sorry.

Signed-off-by: Urabe, Shyouhei <shyouhei@ruby-lang.org>

------------------------------------------------------------------------
r57785 | nobu | 2017-03-06 15:44:11 +0900 (Mon, 06 Mar 2017) | 7 lines

opt_eq_func refactor

* vm_insnhelper.c (opt_eq_func): method to dispatch is resolved by
  only the receiver's class, not including the argument class.
  even if basic operation is redefined, other class conditions
  never meet.  optimize Float and non-Float case, delegate to
  rb_float_equal directly.
------------------------------------------------------------------------
r57784 | shyouhei | 2017-03-06 15:04:52 +0900 (Mon, 06 Mar 2017) | 16 lines

use HAVE_BUILTIN___BUILTIN_MUL_OVERFLOW

We already check for __builtin_mul_overflow in configure but never
actually referred it before.  Why not call it if available, because
that should render supposedly-optimial assembly outputs.

Optionally if __builtin_mul_overflow_p is available, which is the case
for recent GCC, use that to detect fixnum overflow.  This is much
faster than the previous.  On my machine generated assembly of
numeric.c:int_pow reduces from 480 to 448 bytes, according to nm(1).
Also on my machine, following script boosts from 7.819 to 6.929 sec.

time ./miniruby -e 'i=0; while i < 30_000_000 do i += 1; 7 ** 23; end'

Signed-off-by: Urabe, Shyouhei <shyouhei@ruby-lang.org>

------------------------------------------------------------------------
r57783 | nobu | 2017-03-06 08:36:44 +0900 (Mon, 06 Mar 2017) | 5 lines

compile.c: variable type

* compile.c (iseq_compile_each): fix variable type, use VALUE for
  Symbol.
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=57772&view=revision
------------------------------------------------------------------------
r57782 | svn | 2017-03-06 04:43:11 +0900 (Mon, 06 Mar 2017) | 1 line

* 2017-03-06
------------------------------------------------------------------------
r57781 | stomar | 2017-03-06 04:43:10 +0900 (Mon, 06 Mar 2017) | 9 lines

docs for IO.{write,read}

* io.c: [DOC] improve docs for IO
  * IO.{write,read}: fix errors (:open_args is not an array of
    strings, it might include a perm or options hash argument;
    IO.write has no length argument, drop corresponding statement),
    improve formatting, call-seq, grammar.
  * IO#sync=: remove unnecessary "produces no output".
  * other improvements.
------------------------------------------------------------------------
r57780 | stomar | 2017-03-05 21:36:09 +0900 (Sun, 05 Mar 2017) | 5 lines

docs for IO#print

* io.c: [DOC] split documentation for IO#print into smaller paragraphs,
  delete duplicate sentence, fix call-seq.
  Based on a patch by Dario Daic. [ruby-core:78291] [Bug #12975]
------------------------------------------------------------------------
r57779 | nobu | 2017-03-05 10:46:20 +0900 (Sun, 05 Mar 2017) | 4 lines

math.c: more accuracy

* math.c (math_log10): calculate log10(2) for more accuracy.
  [ruby-core:79907] [Bug #13279]
------------------------------------------------------------------------
r57778 | stomar | 2017-03-05 05:08:04 +0900 (Sun, 05 Mar 2017) | 1 line

string.c: [DOC] fix doc formatting for String#==, #===
------------------------------------------------------------------------
r57777 | stomar | 2017-03-05 05:02:48 +0900 (Sun, 05 Mar 2017) | 4 lines

rdoc for String class

* lib/unicode_normalize.rb: [DOC] prevent a comment from
  showing up in the class documentation for String.
------------------------------------------------------------------------
r57776 | svn | 2017-03-05 04:52:31 +0900 (Sun, 05 Mar 2017) | 1 line

* 2017-03-05
------------------------------------------------------------------------
r57775 | stomar | 2017-03-05 04:52:30 +0900 (Sun, 05 Mar 2017) | 5 lines

nodoc OptParse

* lib/optparse.rb: [DOC] nodoc OptParse, introduced with r46126,
  to avoid leaking of its documentation (OptionParser's docs) into
  the class documentation of Object.  [ruby-core:79909] [Bug #13281]
------------------------------------------------------------------------
r57774 | nobu | 2017-03-04 23:44:05 +0900 (Sat, 04 Mar 2017) | 4 lines

compile.c: operand size check

* compile.c (ibf_load_code): raise an exception on invalid operand
  size.  should not use assert() to validate incoming data.
------------------------------------------------------------------------
r57773 | nobu | 2017-03-04 23:37:22 +0900 (Sat, 04 Mar 2017) | 4 lines

compile.c: memory leak

* compile.c (iseq_set_sequence): fix potential memory leaks on an
  invalid instruction sequence.
------------------------------------------------------------------------
r57772 | nobu | 2017-03-04 23:21:57 +0900 (Sat, 04 Mar 2017) | 4 lines

compile.c: fix invalid label message

* compile.c (validate_label): fix invalid label message.
  registered labels are Symbols, not IDs.
------------------------------------------------------------------------
r57771 | stomar | 2017-03-04 22:13:50 +0900 (Sat, 04 Mar 2017) | 5 lines

documentation for sort methods

* array.c: [DOC] fix grammar in Array#sort, #sort!, #sort_by!,
  move references below the code example, add a missing reference.
* enum.c: [DOC] fix grammar in Enumerable#sort, #sort_by.
------------------------------------------------------------------------
r57770 | stomar | 2017-03-04 22:12:20 +0900 (Sat, 04 Mar 2017) | 5 lines

enum.c: documentation for Enumerable#sort_by

* enum.c: [DOC] improve structure of docs for Enumerable#sort_by,
  adopt explanation of the comparison block from Array#sort_by,
  drop mention of 1.8, fix typos.
------------------------------------------------------------------------
r57769 | nobu | 2017-03-04 14:13:18 +0900 (Sat, 04 Mar 2017) | 4 lines

readline.c: fix type

* ext/readline/readline.c (getc_body): fix variable type, and
  extract _get_osfhandle.
------------------------------------------------------------------------
r57768 | svn | 2017-03-04 04:39:36 +0900 (Sat, 04 Mar 2017) | 1 line

* 2017-03-04
------------------------------------------------------------------------
r57767 | stomar | 2017-03-04 04:39:35 +0900 (Sat, 04 Mar 2017) | 5 lines

io.c: documentation for puts

* io.c: [DOC] clarify that the 'record separator' between
  arguments passed to 'puts' is always a newline.
  Based on a patch by Mark Amery. [ruby-core:65801] [Misc #10403]
------------------------------------------------------------------------
r57766 | nobu | 2017-03-03 18:27:27 +0900 (Fri, 03 Mar 2017) | 4 lines

zlib for mingw

* ext/zlib/extconf.rb: fix building zlib for mingw, and for
  cross-compiling.
------------------------------------------------------------------------
r57765 | stomar | 2017-03-03 17:45:04 +0900 (Fri, 03 Mar 2017) | 11 lines

proc.c: documentation for Proc#{call,yield,[]}

* proc.c: [DOC] fix and improve docs for Proc#{call,yield,[]}:

  * change order of Document-method directives as workaround for an
    RDoc rendering problem where the documentation for Proc#call displays
    a "Document-method: []" code block.  [ruby-core:79887] [Bug #13273]
  * add missing call-seq and example for Proc#yield
  * remove pointless cross reference to Proc#yield
  * update description for handling of extra or missing arguments,
    improve examples and add cross reference to #lambda?
------------------------------------------------------------------------
r57764 | nobu | 2017-03-03 15:22:47 +0900 (Fri, 03 Mar 2017) | 4 lines

MINIRUBY for cross-compling

* template/configure-ext.mk.tmpl (EXTMK_ARGS): add MINIRUBY for
  cross-compling, which is used in extmk.rb.
------------------------------------------------------------------------
r57763 | nobu | 2017-03-03 15:18:36 +0900 (Fri, 03 Mar 2017) | 4 lines

fix for mingw64

* util.c: define MINGW_HAS_SECURE_API for qsort_s on recent
  mingw64.
------------------------------------------------------------------------
r57762 | nobu | 2017-03-03 13:51:34 +0900 (Fri, 03 Mar 2017) | 6 lines

broken mingw

* configure.in: check whether frexp and modf are broken.

* include/ruby/win32.h (frexp, modf): ignore bad declarations when
  compiling as C++.  [ruby-core:79859] [Bug #13267]
------------------------------------------------------------------------
r57761 | akr | 2017-03-03 08:36:13 +0900 (Fri, 03 Mar 2017) | 2 lines

[DOC] update doc.

------------------------------------------------------------------------
r57760 | svn | 2017-03-03 08:33:07 +0900 (Fri, 03 Mar 2017) | 1 line

* 2017-03-03
------------------------------------------------------------------------
r57759 | akr | 2017-03-03 08:33:06 +0900 (Fri, 03 Mar 2017) | 6 lines

refine a warning message.

The "n" option for regexp, /.../n, is historical.
It doesn't mean the regexp works as binary match since Ruby 1.9.


------------------------------------------------------------------------
r57758 | stomar | 2017-03-02 19:31:56 +0900 (Thu, 02 Mar 2017) | 5 lines

string.c: restore documentation for String#<<

* string.c: [DOC] restore documentation for String#<<
  which became undocumented with r56021; fix a typo.
  [ruby-core:79865] [Bug #13268]
------------------------------------------------------------------------
r57757 | nobu | 2017-03-02 13:54:19 +0900 (Thu, 02 Mar 2017) | 5 lines

test: use RbConfig::Limits

* test/lib/envutil.rb: rbconfig/sizeof may not be available when
  cross-compiling.  use RbConfig::Limits instead of calculating
  limits of Fixnum with hard-coded CHAR_BIT.
------------------------------------------------------------------------
r57756 | nobu | 2017-03-02 13:54:18 +0900 (Thu, 02 Mar 2017) | 5 lines

fix for cross-compiling

* common.mk (test-rubyspec): add dependency for cross-compiling.

* defs/gmake.mk: ditto.
------------------------------------------------------------------------
r57755 | stomar | 2017-03-02 04:59:03 +0900 (Thu, 02 Mar 2017) | 5 lines

struct.c: improve rdoc for Struct

* struct.c: [DOC] improve examples for ::new, improve #dig example,
  simplify #select example, use consistent style for return values,
  fix typos and example code style, remove duplicate cross reference.
------------------------------------------------------------------------
r57754 | svn | 2017-03-02 04:57:15 +0900 (Thu, 02 Mar 2017) | 1 line

* 2017-03-02
------------------------------------------------------------------------
r57753 | stomar | 2017-03-02 04:57:14 +0900 (Thu, 02 Mar 2017) | 1 line

hash.c: [DOC] fix book title in example
------------------------------------------------------------------------
r57752 | kazu | 2017-03-01 20:37:30 +0900 (Wed, 01 Mar 2017) | 1 line

lib/e2mmap.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57751 | stomar | 2017-03-01 19:17:42 +0900 (Wed, 01 Mar 2017) | 5 lines

fileutils.rb: improve rdoc for FileUtils

* lib/fileutils.rb: [DOC] fix invalid example code to make it
  syntax highlighted, fix rdoc for lists, nodoc internal methods,
  avoid a dangerous example.
------------------------------------------------------------------------
r57750 | rhe | 2017-03-01 19:15:55 +0900 (Wed, 01 Mar 2017) | 7 lines

openssl: avoid segfault during running tests on Ubuntu trusty

Import the commit 6693a549d673 ("test/test_pkey_ec: do not use dummy 0
order", 2017-02-03) from upstream. Hopefully this will fix the segfault
on RubyCI icc16-x64:

  http://rubyci.org/logs/rubyci.s3.amazonaws.com/icc-x64/ruby-trunk/log/20170301T050002Z.fail.html.gz
------------------------------------------------------------------------
r57749 | stomar | 2017-03-01 17:54:37 +0900 (Wed, 01 Mar 2017) | 6 lines

fileutils.rb: improve docs for FileUtils.compare_file

* lib/fileutils.rb (compare_file): [DOC] clarify documentation
  by avoiding confusing return value of "maybe false".

[ruby-core:75431] [Misc #12365] reported by Robert A. Heiler.
------------------------------------------------------------------------
r57748 | nobu | 2017-03-01 16:53:15 +0900 (Wed, 01 Mar 2017) | 4 lines

common.mk: separate clean-ext

* common.mk (clean-ext): separate clean-up of makefiles and
  timestamps, and clean-up of subdirectories under ext and gems.
------------------------------------------------------------------------
r57747 | nobu | 2017-03-01 14:44:37 +0900 (Wed, 01 Mar 2017) | 4 lines

zlib: clean zlib

* ext/zlib/extconf.rb: clean zlib libraries generated in the
  place.
------------------------------------------------------------------------
r57746 | svn | 2017-03-01 10:16:27 +0900 (Wed, 01 Mar 2017) | 1 line

* 2017-03-01
------------------------------------------------------------------------
r57745 | normal | 2017-03-01 10:16:26 +0900 (Wed, 01 Mar 2017) | 9 lines

deduplicate strings sooner at load and compile

We can use rb_fstring_cstr in some places to prevent an
intermediate object from being created before deduplication
via rb_fstring.

* compile.c (iseq_compile_each): use rb_fstring_cstr
  (rb_insns_name_array): ditto
* load.c (rb_load_internal0): ditto
------------------------------------------------------------------------
r57744 | stomar | 2017-02-28 19:41:03 +0900 (Tue, 28 Feb 2017) | 1 line

lib/mathn.rb: [DOC] nodoc internal Math.rsqrt
------------------------------------------------------------------------
r57743 | nobu | 2017-02-28 17:22:00 +0900 (Tue, 28 Feb 2017) | 3 lines

clean gems

* Makefile.in (clean-ext): clean gem directories too.
------------------------------------------------------------------------
r57742 | hsbt | 2017-02-28 16:45:54 +0900 (Tue, 28 Feb 2017) | 6 lines

Added initial gemspec for SDBM module.

  [Feature #13261]

  * doc/*.rdoc: Move SDBM entry to default gem section.
  * ext/sdbm/sdbm.gemspec: first gemspec.
------------------------------------------------------------------------
r57741 | nobu | 2017-02-28 13:33:15 +0900 (Tue, 28 Feb 2017) | 5 lines

disable critical-error-handler

* win32/win32.c (rb_w32_sysinit): disable critical-error-handler
  message box even on mswin, regardless of runtime DLL version.
  [ruby-dev:49988] [Bug #13254]
------------------------------------------------------------------------
r57740 | nobu | 2017-02-28 11:58:12 +0900 (Tue, 28 Feb 2017) | 9 lines

Makefile.sub: ULL_TO_DOUBLE

* win32/Makefile.sub (config.h): define ULL_TO_DOUBLE for
  conversion from unsigned __int64 to double, which is not
  implemented in till Visual Studio.NET 2003, aka VC7.1.

* bignum.c (estimate_initial_sqrt): use ULL_TO_DOUBLE if defined.

* numeric.c (BDIGIT_DBL_TO_DOUBLE): ditto.
------------------------------------------------------------------------
r57739 | nobu | 2017-02-28 10:10:38 +0900 (Tue, 28 Feb 2017) | 4 lines

numeric.c: suppress warning

* numeric.c (DEFINE_INT_SQRT): suppress a type-limits warning
  where int is always smaller than double.
------------------------------------------------------------------------
r57738 | nobu | 2017-02-28 09:00:33 +0900 (Tue, 28 Feb 2017) | 4 lines

Makefile.in: CHDIR to srcdir

* Makefile.in (update-mspec, update-rubyspec): use CHDIR, which may
  use -P, to resolve symbolic links.
------------------------------------------------------------------------
r57737 | stomar | 2017-02-28 03:26:22 +0900 (Tue, 28 Feb 2017) | 9 lines

date_core.c: expand docs for Date shifting

* ext/date/date_core.c: [DOC] expand docs for Date shifting

  * add examples for Date#>> and Date#<< that clarify some edge cases
  * add examples for Date#next_year and Date#prev_year
  * add cross references to Date#>> and Date#<<

  [ruby-core:79584] [Bug #13225]
------------------------------------------------------------------------
r57736 | svn | 2017-02-28 03:07:12 +0900 (Tue, 28 Feb 2017) | 1 line

* 2017-02-28
------------------------------------------------------------------------
r57735 | stomar | 2017-02-28 03:07:11 +0900 (Tue, 28 Feb 2017) | 7 lines

Fix doc for Hash#dig and Struct#dig

* hash.c (rb_hash_dig): [DOC] correct argument name
  in method description; fix formatting in examples.
* struct.c (rb_struct_dig): ditto.

[ruby-core:79221] [Bug #13148]
------------------------------------------------------------------------
r57734 | nobu | 2017-02-27 22:52:08 +0900 (Mon, 27 Feb 2017) | 4 lines

fix nd_ainfo->kw_rest_arg

[Fix GH-5129]
Author:    fate0 <fate0@users.noreply.github.com>
------------------------------------------------------------------------
r57733 | nobu | 2017-02-27 22:52:07 +0900 (Mon, 27 Feb 2017) | 7 lines

kwrest arg name

* compile.c (iseq_set_arguments_keywords): make keyword rest
  argument name nd_vid consistently, regardless of whether other
  keyword arguments are present.  [Fix GH-1529]

* parse.y (new_args_tail_gen): ditto.
------------------------------------------------------------------------
r57732 | shyouhei | 2017-02-27 22:41:38 +0900 (Mon, 27 Feb 2017) | 2 lines

add NEWS for Random.urandom [ci skip]

------------------------------------------------------------------------
r57731 | nobu | 2017-02-27 22:22:05 +0900 (Mon, 27 Feb 2017) | 1 line

common.mk (distclean): clean docs too
------------------------------------------------------------------------
r57730 | hsbt | 2017-02-27 18:20:39 +0900 (Mon, 27 Feb 2017) | 6 lines

Added initial gemspec for Etc module.

  [Feature #13256]

  * doc/*.rdoc: move Etc module to default gem section.
  * ext/etc/etc.gemspec: first gemspec.
------------------------------------------------------------------------
r57729 | nobu | 2017-02-27 17:23:18 +0900 (Mon, 27 Feb 2017) | 3 lines

Makefile.in: by exts.mk

* Makefile.in (clean-ext): recurse by exts.mk in parallel first.
------------------------------------------------------------------------
r57728 | nobu | 2017-02-27 16:54:24 +0900 (Mon, 27 Feb 2017) | 4 lines

common.mk: clean-rubyspec

* common.mk (clean-rubyspec): remove OBJDIR for rubyspec C-API
  tests.
------------------------------------------------------------------------
r57727 | nobu | 2017-02-27 16:37:55 +0900 (Mon, 27 Feb 2017) | 5 lines

mkmf.rb: get rid of error messages

* lib/mkmf.rb (create_makefile): add TARGET_SO to CLEANLIBS only
  when the extension library will be build, to get rid of trying
  to remove $(TARGET_SO_DIR).
------------------------------------------------------------------------
r57726 | nobu | 2017-02-27 15:39:28 +0900 (Mon, 27 Feb 2017) | 7 lines

clean more

* Makefile.in (clean-local): remove debug symbol directories on
  Mac OS.

* common.mk (clean-ext): remove parent directories of timestamp
  directory.
------------------------------------------------------------------------
r57725 | nobu | 2017-02-27 15:31:25 +0900 (Mon, 27 Feb 2017) | 4 lines

Makefile.in: clean exts.mk files

* Makefile.in (clean-ext): remove exts.mk files in subdirectories
  underneath ext.
------------------------------------------------------------------------
r57724 | nobu | 2017-02-27 14:58:31 +0900 (Mon, 27 Feb 2017) | 1 line

ext/socket/extconf.rb: fix a typo
------------------------------------------------------------------------
r57723 | nobu | 2017-02-27 14:55:32 +0900 (Mon, 27 Feb 2017) | 4 lines

mkmf.rb: clean generated files

* lib/mkmf.rb (try_link0): remove generated files other than the
  executable file.
------------------------------------------------------------------------
r57722 | nobu | 2017-02-27 14:14:30 +0900 (Mon, 27 Feb 2017) | 10 lines

Makefile.in: verify-static-library

* Makefile.in (verify-static-library): separate from LIBRUBY_A.
  no check every times by default.

* lib/mkmf.rb (try_link): remove debugging symbol directory after
  linking, instead of try_do.

* lib/mkmf.rb (try_link): bccwin32 support has been removed long
  ago.
------------------------------------------------------------------------
r57721 | svn | 2017-02-27 09:53:27 +0900 (Mon, 27 Feb 2017) | 1 line

* 2017-02-27
------------------------------------------------------------------------
r57720 | nobu | 2017-02-27 09:53:26 +0900 (Mon, 27 Feb 2017) | 1 line

NEWS: Integer.sqrt [Feature #13219]
------------------------------------------------------------------------
r57719 | stomar | 2017-02-26 21:51:41 +0900 (Sun, 26 Feb 2017) | 4 lines

Add rdoc for Integer.sqrt

* numeric.c (rb_int_s_isqrt): [DOC] add rdoc for Integer.sqrt.
  [ruby-core:79762] [Bug #13251]
------------------------------------------------------------------------
r57718 | nobu | 2017-02-26 18:33:17 +0900 (Sun, 26 Feb 2017) | 6 lines

node.c: fix NODE_OP_ASGN1

* node.c (dump_node): fix a typo, index and rvalue.  fix
  NODE_OP_ASGN1 operator to nd_mid.  [Fix GH-1528]

Author:    fate0 <fate0@users.noreply.github.com>
------------------------------------------------------------------------
r57717 | nobu | 2017-02-26 09:33:06 +0900 (Sun, 26 Feb 2017) | 5 lines

parse.y: indent at invalid identifier

* parse.y (parser_heredoc_identifier): set indent only when valid
  identifier, not to dedent non-existent contents later.
  [ruby-core:79772] [Bug #13253]
------------------------------------------------------------------------
r57716 | svn | 2017-02-26 07:28:23 +0900 (Sun, 26 Feb 2017) | 1 line

* 2017-02-26
------------------------------------------------------------------------
r57715 | suke | 2017-02-26 07:28:22 +0900 (Sun, 26 Feb 2017) | 3 lines

ext/win32ole/win32ole.c(ole_initialize): avoid to fail in Windows nano server. 
This is experimental. Thanks to mwrock, Ethan Brown.

------------------------------------------------------------------------
r57714 | nobu | 2017-02-25 16:27:07 +0900 (Sat, 25 Feb 2017) | 1 line

bignum.c: use predefined IDs
------------------------------------------------------------------------
r57713 | nobu | 2017-02-25 14:44:39 +0900 (Sat, 25 Feb 2017) | 4 lines

bignum.c: improve estimate

* bignum.c (estimate_initial_sqrt, rb_big_isqrt): improve initial
  estimate by sqrt().  [ruby-core:79754] [Feature #13250]
------------------------------------------------------------------------
r57712 | nobu | 2017-02-25 13:13:42 +0900 (Sat, 25 Feb 2017) | 1 line

bignum.c (bary_zero_p): constify
------------------------------------------------------------------------
r57711 | nobu | 2017-02-25 11:59:47 +0900 (Sat, 25 Feb 2017) | 3 lines

.gdbinit: rp_bignum

* .gdbinit (rp_bignum): print bignum from higher digits.
------------------------------------------------------------------------
r57710 | normal | 2017-02-25 11:31:03 +0900 (Sat, 25 Feb 2017) | 4 lines

NEWS: document String#-@ change

* test/ruby/test_string.rb (test_uplus_minus): test deduplication
  [ruby-core:79747] [Feature #13077]
------------------------------------------------------------------------
r57709 | svn | 2017-02-25 08:31:08 +0900 (Sat, 25 Feb 2017) | 1 line

* 2017-02-25
------------------------------------------------------------------------
r57708 | nobu | 2017-02-25 08:31:07 +0900 (Sat, 25 Feb 2017) | 1 line

extract initial sqrt estimation [Feature #13219]
------------------------------------------------------------------------
r57707 | rhe | 2017-02-24 20:33:06 +0900 (Fri, 24 Feb 2017) | 4 lines

securerandom: fix up r57384

SecureRandom.gen_random_openssl still refers to Random.raw_seed, which
is renamed to Random.urandom by r57384.  [Bug #9569]
------------------------------------------------------------------------
r57706 | nobu | 2017-02-24 18:39:17 +0900 (Fri, 24 Feb 2017) | 4 lines

Integer.sqrt argument check

* numeric.c (rb_int_s_isqrt): check if the argument is an integer.
  [Feature #13219]
------------------------------------------------------------------------
r57705 | nobu | 2017-02-24 17:36:16 +0900 (Fri, 24 Feb 2017) | 1 line

Integer.sqrt [Feature #13219]
------------------------------------------------------------------------
r57704 | hsbt | 2017-02-24 16:55:50 +0900 (Fri, 24 Feb 2017) | 3 lines

Update maintainers and standard library docs for GDBM.

  [Feature #13248][ruby-core:79742]
------------------------------------------------------------------------
r57703 | hsbt | 2017-02-24 16:39:37 +0900 (Fri, 24 Feb 2017) | 4 lines

Update rdoc-5.1.0

  * Details of changes are following url.
    https://github.com/rdoc/rdoc/blob/master/History.rdoc#510--2017-02-24
------------------------------------------------------------------------
r57702 | hsbt | 2017-02-24 15:50:43 +0900 (Fri, 24 Feb 2017) | 1 line

gem name should be the downcase.
------------------------------------------------------------------------
r57701 | hsbt | 2017-02-24 15:48:55 +0900 (Fri, 24 Feb 2017) | 1 line

Added initial gemspec for GDBM module.
------------------------------------------------------------------------
r57700 | hsbt | 2017-02-24 15:32:48 +0900 (Fri, 24 Feb 2017) | 3 lines

Update psych-2.2.3

 * It's only typo fix for CRuby.
------------------------------------------------------------------------
r57699 | svn | 2017-02-24 10:01:24 +0900 (Fri, 24 Feb 2017) | 1 line

* 2017-02-24
------------------------------------------------------------------------
r57698 | normal | 2017-02-24 10:01:23 +0900 (Fri, 24 Feb 2017) | 59 lines

string.c (str_uminus): deduplicate strings

This exposes the rb_fstring internal function to return a
deduped and frozen string when a non-frozen string is given.
This is useful for writing all sorts of record processing key
values maybe stored, but certain keys and values are often
duplicated at a high frequency, so memory savings can
noticeable.

Use cases are many:

* email/NNTP header processing

  There are some standard header keys everybody uses
  (From/To/Cc/Date/Subject/Received/Message-ID/References/In-Reply-To),
  as well as common ones specific to a certain lists:
  (ruby-core has X-Redmine-* headers)
  It is also useful to dedupe values, as most inboxes have
  multiple messages from the same sender, or MUA.

* package management systems -
  things like RubyGems stores identical strings for licenses,
  dependency names, author names/emails, etc

* HTTP headers/trailers -
  standard headers (Host/Accept/Accept-Encoding/User-Agent/...)
  are common, but there are also uncommon ones.
  Values may be deduped, as well, as it is likely a user
  agent will make multiple/parallel requests to the same
  server.

* version control systems -
  this can be useful for deduplicating names of frequent
  committers (like "nobu" :)

  In linux.git and git.git, there are also common
  trailers such as Signed-Off-By/Acked-by/Reviewed-by/Fixes/...
  as well as less common ones.

* audio metadata -

  There are commonly used tags (Artist/Album/Title/Tracknumber),
  but Vorbis comments allows arbitrary key values to be stored.
  Music collections contain songs by the same artist or mutiple
  songs from the same album, so deduplicating values will be
  helpful there, too.

* JSON, YAML, XML, HTML processing

  Certain fields, tags and attributes are commonly used
  across the same and multiple documents

There is no security concern in this being a DoS vector by
causing immortal strings.  The fstring table is not a GC-root
and not walked during the mark phase.  GC-able dynamic symbols
since Ruby 2.2 are handled in the same manner, and that
implementation also relies on the non-immortality of fstrings.

[Feature #13077] [ruby-core:79663]
------------------------------------------------------------------------
r57697 | nobu | 2017-02-23 16:14:29 +0900 (Thu, 23 Feb 2017) | 4 lines

appveyor.yaml: matrix

* appveyor.yaml: use build matrix for platforms and compilers.
  resolve hard coded paths from these variables.
------------------------------------------------------------------------
r57696 | nobu | 2017-02-23 15:55:42 +0900 (Thu, 23 Feb 2017) | 4 lines

bignum.c: NAIVE_MUL_DIGITS

* bignum.c (NAIVE_MUL_DIGITS): share threshold for bary_sq_fast
  between bary_mul and bigsq.
------------------------------------------------------------------------
r57695 | nobu | 2017-02-23 13:10:41 +0900 (Thu, 23 Feb 2017) | 4 lines

fix circular dependencies

* defs/gmake.mk (TEST_DEPENDS): remove targets expanded as
  TEST_TARGETS, to get rid of circular dependencies.
------------------------------------------------------------------------
r57694 | nobu | 2017-02-23 11:40:17 +0900 (Thu, 23 Feb 2017) | 3 lines

Revert r57690 except for read_nonblock

https://github.com/ruby/ruby/pull/1527#issuecomment-281867551
------------------------------------------------------------------------
r57693 | nobu | 2017-02-23 11:11:16 +0900 (Thu, 23 Feb 2017) | 1 line

[DOC] mark up literals
------------------------------------------------------------------------
r57692 | nobu | 2017-02-23 11:00:28 +0900 (Thu, 23 Feb 2017) | 1 line

[DOC] keyword argument _exception_
------------------------------------------------------------------------
r57691 | nobu | 2017-02-23 10:54:13 +0900 (Thu, 23 Feb 2017) | 11 lines

socket.rb: [DOC] fix nonblock methods

* ext/socket/lib/socket.rb (BasicSocket#recv_nonblock): fix
  exception class and symbol.

* ext/socket/lib/socket.rb (BasicSocket#recvmsg_nonblock): ditto.

* ext/socket/lib/socket.rb (Socket#recvfrom_nonblock): fix the
  method name.

* ext/socket/lib/socket.rb (UDPSocket#recvfrom_nonblock): both.
------------------------------------------------------------------------
r57690 | nobu | 2017-02-23 10:15:27 +0900 (Thu, 23 Feb 2017) | 7 lines

[DOC] {read,write}_nonblock with exception: false

Update docs to reflect EOF behavior change of read_nonblock and
write_nonblock when using `exception: false`.

[Fix GH-1527]
Author:    Russell Davis <russell-stripe@users.noreply.github.com>
------------------------------------------------------------------------
r57689 | nobu | 2017-02-23 08:49:40 +0900 (Thu, 23 Feb 2017) | 4 lines

rational.c: infinity in power

* rational.c (nurat_expt): return 0 due to overflow.
  [ruby-core:79686] [Bug #13242]:
------------------------------------------------------------------------
r57688 | nobu | 2017-02-23 08:28:26 +0900 (Thu, 23 Feb 2017) | 4 lines

rational.c: infinity in power

* rational.c (nurat_expt): return Infinity due to overflow.
  [ruby-core:79686] [Bug #13242]:
------------------------------------------------------------------------
r57687 | svn | 2017-02-23 00:46:43 +0900 (Thu, 23 Feb 2017) | 1 line

* 2017-02-23
------------------------------------------------------------------------
r57686 | kazu | 2017-02-23 00:46:43 +0900 (Thu, 23 Feb 2017) | 8 lines

rational.c: fix rdoc

* rational.c: [DOC] fix wrong indentations and comment out some lines
  in code examples to make them valid Ruby code and syntax highlighted
  on the rendered page.

[ci skip] [ruby-core:79607] [Bug #13233]
Author:    Marcus Stollsteimer <sto.mar@web.de>
------------------------------------------------------------------------
r57685 | nobu | 2017-02-22 17:50:25 +0900 (Wed, 22 Feb 2017) | 5 lines

eval_error.c: backstrace in reverse order

* eval_error.c (rb_threadptr_error_print): print backtrace and
  error message in reverse order if STDERR is unchanged and a tty.
  [Feature #8661]
------------------------------------------------------------------------
r57684 | akr | 2017-02-22 16:31:25 +0900 (Wed, 22 Feb 2017) | 5 lines

refine warning message for binary regexp /.../n.

Reported by Herwin W.  [ruby-core:78592] [Bug #13024]


------------------------------------------------------------------------
r57683 | nobu | 2017-02-22 16:16:13 +0900 (Wed, 22 Feb 2017) | 4 lines

Thread#fetch

* thread.c (rb_thread_fetch): add new method Thread#fetch.
  [Feature #13009]
------------------------------------------------------------------------
r57682 | nobu | 2017-02-22 11:02:11 +0900 (Wed, 22 Feb 2017) | 8 lines

numeric.c: Numeric#clone and #dup

* numeric.c (num_clone, num_dup): no longer raises TypeError,
  returns the receiver instead as well as Integer and Float.
  [ruby-core:79636] [Bug #13237]

* object.c (rb_immutable_obj_clone): immutable object clone with
  freeze optional keyword argument.
------------------------------------------------------------------------
r57681 | svn | 2017-02-22 10:55:11 +0900 (Wed, 22 Feb 2017) | 1 line

* 2017-02-22
------------------------------------------------------------------------
r57680 | nobu | 2017-02-22 10:55:10 +0900 (Wed, 22 Feb 2017) | 7 lines

object.c: refactor rb_obj_clone and rb_obj_clone2

* object.c (rb_obj_clone2): extract option for clone, and split by
  whether the object is immutable or mutable.

* object.c (rb_obj_clone): no arguments, return immutable object
  immediately.
------------------------------------------------------------------------
r57679 | nobu | 2017-02-21 23:51:22 +0900 (Tue, 21 Feb 2017) | 3 lines

object.c: message encoding

* object.c (rb_obj_clone2): preserve encoding in error messages.
------------------------------------------------------------------------
r57678 | nobu | 2017-02-21 23:42:02 +0900 (Tue, 21 Feb 2017) | 4 lines

backward.h: RClassDeprecated

* include/ruby/backward.h (RClassDeprecated): move from
  ruby/ruby.h.
------------------------------------------------------------------------
r57677 | svn | 2017-02-21 17:18:16 +0900 (Tue, 21 Feb 2017) | 1 line

* properties.
------------------------------------------------------------------------
r57676 | ko1 | 2017-02-21 17:18:15 +0900 (Tue, 21 Feb 2017) | 38 lines

add performance counting mechanism for MRI debug/tuning purpose.

* How to enable this feature?
  * define USE_DEBUG_COUNTER as 1.
  * you can disable to output the result with
    RUBY_DEBUG_COUNTER_DISABLE environment variable
    even if USE_DEBUG_COUNTER == 1.

* How to add new counter?
  * add COUNTER(<name>) line on debug_counter.h.
  * include "debug_counter.h"
  * insert RB_DEBUG_COUNTER_INC(<name>) line on your favorite place.

* counter output example:
  [RUBY_DEBUG_COUNTER]    mc_inline_hit   999
  [RUBY_DEBUG_COUNTER]    mc_inline_miss  3
  [RUBY_DEBUG_COUNTER]    mc_global_hit   23
  [RUBY_DEBUG_COUNTER]    mc_global_miss  273
  [RUBY_DEBUG_COUNTER]    mc_global_state_miss    3
  [RUBY_DEBUG_COUNTER]    mc_class_serial_miss    0
  [RUBY_DEBUG_COUNTER]    mc_cme_complement       0
  [RUBY_DEBUG_COUNTER]    mc_cme_complement_hit   0
  [RUBY_DEBUG_COUNTER]    mc_search_super 1384
  [RUBY_DEBUG_COUNTER]    ivar_get_hit    0
  [RUBY_DEBUG_COUNTER]    ivar_get_miss   0
  [RUBY_DEBUG_COUNTER]    ivar_set_hit    0
  [RUBY_DEBUG_COUNTER]    ivar_set_miss   0
  [RUBY_DEBUG_COUNTER]    ivar_get        431
  [RUBY_DEBUG_COUNTER]    ivar_set        465

  * mc_... is related to method caching.
  * ivar_... is related to instance variable accesses.

* compare with dtrace/system tap features, there are completely
  no performacne penalties when it is disabled.

* This feature is supported only on __GNUC__ compilers.

------------------------------------------------------------------------
r57675 | nobu | 2017-02-21 15:16:50 +0900 (Tue, 21 Feb 2017) | 4 lines

backward.h: move deprecated declaration

* include/ruby/backward.h (rb_autoload): move declaration of
  deprecated function.
------------------------------------------------------------------------
r57674 | nobu | 2017-02-21 15:16:49 +0900 (Tue, 21 Feb 2017) | 1 line

variable.c: remove deprecated internal feature
------------------------------------------------------------------------
r57673 | nobu | 2017-02-21 15:07:22 +0900 (Tue, 21 Feb 2017) | 1 line

error.c: remove deprecated internal features
------------------------------------------------------------------------
r57672 | nobu | 2017-02-21 15:07:21 +0900 (Tue, 21 Feb 2017) | 4 lines

complex.c: remove deprecated functions

* complex.c (rb_complex_set_real, rb_complex_set_imag): remove
  functions deprecated at 2.2.
------------------------------------------------------------------------
r57671 | nobu | 2017-02-21 14:17:41 +0900 (Tue, 21 Feb 2017) | 4 lines

backward.h: 2.2 deprecated features

* include/ruby/backward.h (DECLARE_DEPRECATED_FEATURE): move
  features deprecated at 2.2.
------------------------------------------------------------------------
r57670 | nobu | 2017-02-21 14:16:49 +0900 (Tue, 21 Feb 2017) | 4 lines

internal.h: removed function declaration

* internal.h (rb_compile_error_str): remove declaration of removed
  internal function at r54189.
------------------------------------------------------------------------
r57669 | nobu | 2017-02-21 10:28:30 +0900 (Tue, 21 Feb 2017) | 4 lines

variable.c: noreturn in GCC

* variable.c (rb_generic_ivar_table): declare as noreturn only in
  GCC, which does not err on different attributes.
------------------------------------------------------------------------
r57668 | svn | 2017-02-21 04:12:53 +0900 (Tue, 21 Feb 2017) | 1 line

* 2017-02-21
------------------------------------------------------------------------
r57667 | ko1 | 2017-02-21 04:12:52 +0900 (Tue, 21 Feb 2017) | 4 lines

remove harmful declaration.

* variable.c (gen_ivtbl_get): declaration conflict on VC++.

------------------------------------------------------------------------
r57666 | yui-knk | 2017-02-20 23:40:56 +0900 (Mon, 20 Feb 2017) | 4 lines

compile.c: Fix a typo

* compile.c (compile_branch_condition): NODE_LIT is
  always true.
------------------------------------------------------------------------
r57665 | kazu | 2017-02-20 21:20:22 +0900 (Mon, 20 Feb 2017) | 12 lines

extension.rdoc: add document title

* doc/extension.rdoc, doc/extension.ja.rdoc: [DOC]
  add title and adapt subheading levels.

* doc/extension.rdoc: [DOC] fix subheading level of section
  about "Ruby Constants That Can Be Accessed From C".

* doc/extension.ja.rdoc: [DOC] add missing subheading.

[ruby-core:79590] [Bug #13229]
Author:    Marcus Stollsteimer <sto.mar@web.de>
------------------------------------------------------------------------
r57664 | naruse | 2017-02-20 19:59:10 +0900 (Mon, 20 Feb 2017) | 3 lines

Supress warning: function might be candidate for attribute 'noreturn'

GCC7 shows it.
------------------------------------------------------------------------
r57663 | naruse | 2017-02-20 19:59:10 +0900 (Mon, 20 Feb 2017) | 1 line

Cast as VALUE to suppress type warnings
------------------------------------------------------------------------
r57662 | naruse | 2017-02-20 19:59:09 +0900 (Mon, 20 Feb 2017) | 1 line

They are enum yytokentype, need cast
------------------------------------------------------------------------
r57661 | nobu | 2017-02-20 19:10:08 +0900 (Mon, 20 Feb 2017) | 4 lines

assertions.rb: ignore exit in child

* test/lib/test/unit/assertions.rb (assert_separately): ignore
  SystemExit.  unsuccessful exit still fails an assertion later.
------------------------------------------------------------------------
r57660 | nobu | 2017-02-20 18:46:12 +0900 (Mon, 20 Feb 2017) | 5 lines

regparse.c: initialize return values

* regparse.c (parse_char_class): initialize return values before
  depth limit check.  returned values will be freed in callers
  regardless the error.  [ruby-core:79624] [Bug #13234]
------------------------------------------------------------------------
r57659 | nobu | 2017-02-20 14:35:57 +0900 (Mon, 20 Feb 2017) | 1 line

parse.y: new_qcall
------------------------------------------------------------------------
r57658 | nobu | 2017-02-20 14:35:56 +0900 (Mon, 20 Feb 2017) | 3 lines

parse.y: ID2VAL

* parse.y (ID2VAL): split from TOKEN2VAL.
------------------------------------------------------------------------
r57657 | svn | 2017-02-20 11:16:23 +0900 (Mon, 20 Feb 2017) | 1 line

* 2017-02-20
------------------------------------------------------------------------
r57656 | nobu | 2017-02-20 11:16:22 +0900 (Mon, 20 Feb 2017) | 4 lines

envutil.rb: diagnostic_reports for ruby-runner

* test/lib/envutil.rb (EnvUtil.diagnostic_reports): ruby-runner
  execs "RUBY_INSTALL_NAME" file, so search by that name.
------------------------------------------------------------------------
r57655 | nobu | 2017-02-19 10:27:52 +0900 (Sun, 19 Feb 2017) | 5 lines

vm_insnhelper.c: super to module in refinement

* vm_insnhelper.c (vm_call_zsuper): method defined in module in
  refinement is not callable as-is.  dispatch again.
  [ruby-core:79588] [Bug #13227]
------------------------------------------------------------------------
r57654 | svn | 2017-02-19 07:38:36 +0900 (Sun, 19 Feb 2017) | 1 line

* 2017-02-19
------------------------------------------------------------------------
r57653 | nobu | 2017-02-19 07:38:35 +0900 (Sun, 19 Feb 2017) | 5 lines

COPYING: expand tabs

* COPYING: expand tabs like as the rest lines.  [Fix GH-1526]

Author: Philippe Ombredanne <pombredanne@gmail.com>
------------------------------------------------------------------------
r57652 | kazu | 2017-02-18 14:52:16 +0900 (Sat, 18 Feb 2017) | 1 line

{lib,test}/cgi: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57651 | nobu | 2017-02-18 13:23:20 +0900 (Sat, 18 Feb 2017) | 4 lines

array.c: check if numeric

* array.c (finish_exact_sum): add 0 and the initial value to check
  if the latter is numeric.  [ruby-core:79572] [Bug #13222]
------------------------------------------------------------------------
r57650 | svn | 2017-02-18 12:42:36 +0900 (Sat, 18 Feb 2017) | 1 line

* 2017-02-18
------------------------------------------------------------------------
r57649 | nobu | 2017-02-18 12:42:35 +0900 (Sat, 18 Feb 2017) | 4 lines

array.c: finish_exact_sum

* array.c (finish_exact_sum): extract duplicate code from
  rb_ary_sum.
------------------------------------------------------------------------
r57648 | nobu | 2017-02-17 22:31:43 +0900 (Fri, 17 Feb 2017) | 5 lines

test_fileutils.rb: no broken symlinks on Cygwin

* test/fileutils/test_fileutils.rb (no_broken_symlink): exclude
  test using broken symlinks on Cygwin, which are not allowed
  because of the directory flag of Windows native symlink.
------------------------------------------------------------------------
r57647 | nobu | 2017-02-17 22:31:42 +0900 (Fri, 17 Feb 2017) | 5 lines

test_fileutils.rb: fix relative symlink path

* test/fileutils/test_fileutils.rb (test_rm_symlink): fix relative
  symlink path, the target should be relative to the directory in
  which the symlink gets created.
------------------------------------------------------------------------
r57646 | nobu | 2017-02-17 19:22:10 +0900 (Fri, 17 Feb 2017) | 4 lines

test_fileutils.rb: workaround for Cygwin

* test/fileutils/test_fileutils.rb (root_in_posix): seems Cygwin
  has some different conditions for privilege.
------------------------------------------------------------------------
r57645 | nobu | 2017-02-17 19:22:09 +0900 (Fri, 17 Feb 2017) | 5 lines

test_fileutils.rb: cache distinct UIDs

* test/fileutils/test_fileutils.rb: cache distinct UIDs as
  constants at initialization.  assume no UIDs will be
  added/removed during tests.
------------------------------------------------------------------------
r57644 | svn | 2017-02-17 14:45:45 +0900 (Fri, 17 Feb 2017) | 1 line

* 2017-02-17
------------------------------------------------------------------------
r57643 | nobu | 2017-02-17 14:45:44 +0900 (Fri, 17 Feb 2017) | 6 lines

DEPRECATED_INTERNAL_FEATURE

* error.c (ruby_deprecated_internal_feature): renamed, to
  explicitly represent deprecation.

* internal.h (DEPRECATED_INTERNAL_FEATURE): ditto.
------------------------------------------------------------------------
r57642 | nobu | 2017-02-16 23:48:12 +0900 (Thu, 16 Feb 2017) | 3 lines

variable.c: fatal rb_generic_ivar_table

* variable.c (rb_generic_ivar_table): raise fatal error.
------------------------------------------------------------------------
r57641 | ko1 | 2017-02-16 18:15:26 +0900 (Thu, 16 Feb 2017) | 2 lines

use rb_iseq_check() for USE_LAZY_LOAD, too.

------------------------------------------------------------------------
r57640 | nobu | 2017-02-16 17:42:22 +0900 (Thu, 16 Feb 2017) | 6 lines

fileutils.rb: do not make root

* lib/fileutils.rb (FileUtils#mkdir_p): no need to make root
  directory which should be exist and cannot be made with mkdir
  recent Cygwin can make a directory contains a colon.
  [Bug #13214]
------------------------------------------------------------------------
r57639 | ko1 | 2017-02-16 17:24:37 +0900 (Thu, 16 Feb 2017) | 2 lines

use rb_iseq_check() for USE_LAZY_LOAD.

------------------------------------------------------------------------
r57638 | svn | 2017-02-16 11:47:22 +0900 (Thu, 16 Feb 2017) | 1 line

* 2017-02-16
------------------------------------------------------------------------
r57637 | nobu | 2017-02-16 11:47:21 +0900 (Thu, 16 Feb 2017) | 6 lines

win32.c: memcpy instead of strlcpy

* win32/win32.c (cmdglob): memcpy the exact size instead of
  strlcpy with +1.

* win32/win32.c (w32_cmdvector): ditto, with NUL-terminating.
------------------------------------------------------------------------
r57636 | nobu | 2017-02-15 20:17:53 +0900 (Wed, 15 Feb 2017) | 1 line

Update gems/bundled_gems
------------------------------------------------------------------------
r57635 | nobu | 2017-02-15 19:51:58 +0900 (Wed, 15 Feb 2017) | 4 lines

gmake.mk: mflags without -jN

* defs/gmake.mk (mflags): override the definition in common.mk
  without -jN option.
------------------------------------------------------------------------
r57634 | nobu | 2017-02-15 17:38:01 +0900 (Wed, 15 Feb 2017) | 7 lines

marshal.c: revert r57631 partially

* marshal.c (rb_marshal_dump_limited): do not free dump_arg, which
  may be dereferenced in check_dump_arg due to continuation, and
  get rid of dangling pointers.

* marshal.c (rb_marshal_load_with_proc): ditto for load_arg.
------------------------------------------------------------------------
r57633 | nobu | 2017-02-15 14:53:01 +0900 (Wed, 15 Feb 2017) | 3 lines

thread.c: fix for VC

* thread.c (rb_fd_no_init): make void same as rb_fd_init_copy.
------------------------------------------------------------------------
r57632 | svn | 2017-02-15 09:42:52 +0900 (Wed, 15 Feb 2017) | 1 line

* 2017-02-15
------------------------------------------------------------------------
r57631 | normal | 2017-02-15 09:42:51 +0900 (Wed, 15 Feb 2017) | 11 lines

marshal.c: use hidden objects to allow recycling

Hidden objects (klass == 0) are not visible to Ruby code invoked
from other threads or signal handlers, so they can never be
accessed from other contexts.  This makes it safe to call
rb_gc_force_recycle on the object slot after releasing malloc
memory.

* marshal.c (rb_marshal_dump_limited): hide dump_arg and recycle when done
  (rb_marshal_load_with_proc): hide load_arg and recycle when done
  [ruby-core:79518]
------------------------------------------------------------------------
r57630 | kou | 2017-02-14 22:29:13 +0900 (Tue, 14 Feb 2017) | 2 lines

Fix a typo

------------------------------------------------------------------------
r57629 | nobu | 2017-02-14 21:34:11 +0900 (Tue, 14 Feb 2017) | 4 lines

resolv9x.rb: fix typo

* ext/win32/lib/win32/resolv9x.rb (WsControl): fix missing close
  parenthesis at r22724.
------------------------------------------------------------------------
r57628 | nobu | 2017-02-14 21:29:56 +0900 (Tue, 14 Feb 2017) | 4 lines

string.c: assertion

* string.c (str_shared_replace): use RUBY_ASSERT for
  pre-condition.
------------------------------------------------------------------------
r57627 | hsbt | 2017-02-14 20:12:52 +0900 (Tue, 14 Feb 2017) | 3 lines

Added initial gemspec for Scanf module.

  [Feature #13213]
------------------------------------------------------------------------
r57625 | nobu | 2017-02-14 16:52:30 +0900 (Tue, 14 Feb 2017) | 6 lines

initialize variables

* string.c (rb_str_enumerate_lines): initialize conditionally
  used variable.

* thread.c (rb_fd_no_init): ditto.
------------------------------------------------------------------------
r57624 | nobu | 2017-02-14 00:28:25 +0900 (Tue, 14 Feb 2017) | 4 lines

gmake.mk: test-ruby

* defs/gmake.mk (ORDERED_TEST_TARGETS): add test-ruby target, test
  for ruby core without bundled libraries.
------------------------------------------------------------------------
r57623 | svn | 2017-02-14 00:19:13 +0900 (Tue, 14 Feb 2017) | 1 line

* 2017-02-14
------------------------------------------------------------------------
r57622 | nobu | 2017-02-14 00:19:12 +0900 (Tue, 14 Feb 2017) | 4 lines

thread.c: use ASSUME only on gcc 5 or later

* thread.c (rb_fd_no_init): on gcc 4, ASSUME macro affects
  something too much.
------------------------------------------------------------------------
r57621 | nobu | 2017-02-13 22:08:44 +0900 (Mon, 13 Feb 2017) | 4 lines

ruby.h: remove comment

* include/ruby/ruby.h (RB_GC_GUARD): remove comment unsupported by
  Solaris AS.
------------------------------------------------------------------------
r57620 | kazu | 2017-02-13 21:16:26 +0900 (Mon, 13 Feb 2017) | 1 line

lib/find.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57619 | nobu | 2017-02-13 17:14:19 +0900 (Mon, 13 Feb 2017) | 4 lines

ruby.h: RB_GC_GUARD stronger than gcc7

* include/ruby/ruby.h (RB_GC_GUARD): prevent guarded pointer from
  optimization by using as an input to inline asm.
------------------------------------------------------------------------
r57618 | nobu | 2017-02-13 14:44:15 +0900 (Mon, 13 Feb 2017) | 6 lines

suppress warnings

* string.c (rb_str_enumerate_lines): hint to suppress a
  maybe-uninitialized warning by gcc.

* thread.c (rb_fd_no_init): ditto.
------------------------------------------------------------------------
r57617 | nobu | 2017-02-13 14:23:36 +0900 (Mon, 13 Feb 2017) | 4 lines

compile.c: suppress a warning

* compile.c (iseq_build_kw): suppress an alloc-size-larger-than
  warning by gcc 7.
------------------------------------------------------------------------
r57616 | nobu | 2017-02-13 14:11:14 +0900 (Mon, 13 Feb 2017) | 3 lines

gmake.mk: tests step

* defs/gmake.mk (TEST_TARGETS): run tests step by step.
------------------------------------------------------------------------
r57615 | normal | 2017-02-13 11:04:26 +0900 (Mon, 13 Feb 2017) | 6 lines

array.c (ary_recycle_hash): use rb_gc_force_recycle

Hidden objects (RBASIC_CLASS(hash) == 0) can never become
visible to other threads or signal handlers via
ObjectSpace.each_object or similar means.  Thus it is safe to
forcibly recycle the object slot for future use, here.
------------------------------------------------------------------------
r57614 | normal | 2017-02-13 10:05:23 +0900 (Mon, 13 Feb 2017) | 6 lines

cont.c: avoid needless branch for dmark callbacks

gc.c (gc_mark_children, case T_DATA) does not use
the dmark function pointer if DATA_PTR is NULL

* cont.c (cont_mark, fiber_mark): remove branch, ptr is never NULL
------------------------------------------------------------------------
r57613 | svn | 2017-02-13 08:37:29 +0900 (Mon, 13 Feb 2017) | 1 line

* 2017-02-13
------------------------------------------------------------------------
r57612 | nobu | 2017-02-13 08:37:28 +0900 (Mon, 13 Feb 2017) | 4 lines

gmake.mk: -n for tests

* defs/gmake.mk (gnumake_recursive): do not invoke tests if -n
  option is given.
------------------------------------------------------------------------
r57611 | nobu | 2017-02-12 17:43:43 +0900 (Sun, 12 Feb 2017) | 1 line

parse.y: ripper_intern is no longer used
------------------------------------------------------------------------
r57610 | nobu | 2017-02-12 17:33:33 +0900 (Sun, 12 Feb 2017) | 6 lines

parse.y: logop

* defs/id.def (predefined): add keywords `and` and `or`.

* parse.y (log_op): unify parser and ripper, and use tokens
  instead of node types and symbols.
------------------------------------------------------------------------
r57609 | kazu | 2017-02-12 13:31:25 +0900 (Sun, 12 Feb 2017) | 1 line

ext/objspace: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57608 | nobu | 2017-02-12 13:23:16 +0900 (Sun, 12 Feb 2017) | 4 lines

parse.y: call_bin_op

* parse.y (call_bin_op): unify parser and ripper, and use IDs
  instead of tokens.
------------------------------------------------------------------------
r57607 | nobu | 2017-02-12 13:20:35 +0900 (Sun, 12 Feb 2017) | 6 lines

parse.y: call_uni_op

* defs/id.def (predefined): add keyword `not`.

* parse.y (call_uni_op): unify parser and ripper, and use IDs
  instead of tokens.
------------------------------------------------------------------------
r57606 | nobu | 2017-02-12 12:15:34 +0900 (Sun, 12 Feb 2017) | 6 lines

ripper: fix %-op on_operator_ambiguous

* parse.y (ambiguous_operator): separate token and string
  representation of operators, to fix %-operator argument.  in a
  warning message, needs to be escaped by '%' but the symbol
  should not be.
------------------------------------------------------------------------
r57605 | nobu | 2017-02-12 11:48:28 +0900 (Sun, 12 Feb 2017) | 4 lines

symbol/init.c: ID value

* ext/-test-/symbol/init.c (sym_pinneddown_p): return ID value or
  nil for debugging.
------------------------------------------------------------------------
r57604 | svn | 2017-02-12 00:08:34 +0900 (Sun, 12 Feb 2017) | 1 line

* 2017-02-12
------------------------------------------------------------------------
r57603 | naruse | 2017-02-12 00:08:33 +0900 (Sun, 12 Feb 2017) | 4 lines

Merge Onigmo 6.1.1

* Support absent operator https://github.com/k-takata/Onigmo/issues/82
* https://github.com/k-takata/Onigmo/blob/Onigmo-6.1.1/HISTORY
------------------------------------------------------------------------
r57602 | nobu | 2017-02-11 20:37:14 +0900 (Sat, 11 Feb 2017) | 1 line

appveyor.yml: extract zlib_version
------------------------------------------------------------------------
r57601 | nobu | 2017-02-11 19:33:05 +0900 (Sat, 11 Feb 2017) | 5 lines

fiddle/depend: build-libffi

* ext/fiddle/depend (build-libffi): get rid of making $(LIBFFI_A)
  a sole target, which may be empty when installed libffi is
  found.
------------------------------------------------------------------------
r57600 | kazu | 2017-02-11 12:12:59 +0900 (Sat, 11 Feb 2017) | 4 lines

appveyor.yml: Update zlib

* Update zlib to 1.2.11
* Use https instead of http
------------------------------------------------------------------------
r57599 | svn | 2017-02-11 11:14:07 +0900 (Sat, 11 Feb 2017) | 1 line

* 2017-02-11
------------------------------------------------------------------------
r57598 | nobu | 2017-02-11 11:14:06 +0900 (Sat, 11 Feb 2017) | 6 lines

parse.y: TOKEN2ID

* parse.y (TOKEN2ID): add macro which maps static tokens to IDs.

* template/id.h.tmpl (TOKEN2*ID, DEFINE_*ID_FROM_TOKEN): separate
  into macros, token to ID mapping and enum definitions.
------------------------------------------------------------------------
r57597 | mrkn | 2017-02-10 22:23:58 +0900 (Fri, 10 Feb 2017) | 5 lines

bigdecimal: version 1.3.1

Import bigdecimal version 1.3.1.  The full commit log is here:

  https://github.com/ruby/bigdecimal/compare/v1.3.0...v1.3.1
------------------------------------------------------------------------
r57596 | hsbt | 2017-02-10 18:41:15 +0900 (Fri, 10 Feb 2017) | 7 lines

Added initial gemspec for Fcntl module.

  [Feature #13206]

  * ext/fcntl/fcntl.gemspec: initial commit.
  * doc/maintainers.rdoc, doc/standard_library.rdoc: Move Fcntl module
    to Default gems section.
------------------------------------------------------------------------
r57595 | ko1 | 2017-02-10 17:15:39 +0900 (Fri, 10 Feb 2017) | 2 lines

check thread deadness correctly.

------------------------------------------------------------------------
r57594 | nobu | 2017-02-10 15:12:22 +0900 (Fri, 10 Feb 2017) | 9 lines

MFLAGS for nmake

* common.mk (mflags): pass make flags to sub-makes, for nmake
  which cannot pass them by the environment variable.

* defs/gmake.mk (mflags): filter out -j option for sub-makes.

* template/exts.mk.tmpl (MFLAGS): extract MFLAGS from sub extmk
  files for nmake.
------------------------------------------------------------------------
r57593 | nobu | 2017-02-10 13:24:08 +0900 (Fri, 10 Feb 2017) | 5 lines

fiddle: fix $(SUBMAKE_PRE)

* ext/fiddle/extconf.rb: fix $(SUBMAKE_PRE) to chdir to
  $(LIBFFI_DIR) instead of $(@D), since $(LIBFFI_A) is not
  underneath libffi but under .libs.
------------------------------------------------------------------------
r57592 | nobu | 2017-02-10 12:59:55 +0900 (Fri, 10 Feb 2017) | 4 lines

openssl: fix broken openssl check

* ext/openssl/deprecation.rb: check for broken OpenSSL only on mac
  OS.  [ruby-core:79475] [Bug #13200]
------------------------------------------------------------------------
r57591 | nobu | 2017-02-10 12:58:02 +0900 (Fri, 10 Feb 2017) | 4 lines

openssl: fix broken openssl check

* ext/openssl/extconf.rb: check for broken OpenSSL only on mac OS.
  [ruby-core:79475] [Bug #13200]
------------------------------------------------------------------------
r57590 | nobu | 2017-02-10 12:58:01 +0900 (Fri, 10 Feb 2017) | 4 lines

extmk.rb: split notes

* ext/extmk.rb: split notes and echo per lines, for multiple lines
  messages.  [ruby-core:79475] [Bug #13200]
------------------------------------------------------------------------
r57589 | nobu | 2017-02-10 10:13:22 +0900 (Fri, 10 Feb 2017) | 5 lines

parallel.rb: fix intervention

* test/lib/test/unit/parallel.rb (_report): send a response and a
  newline atomically, to get rid of intervention with "p" which
  runs in a separate thread.
------------------------------------------------------------------------
r57588 | kazu | 2017-02-10 09:58:47 +0900 (Fri, 10 Feb 2017) | 1 line

Use `unpack1` instead of `unpack` and `first`
------------------------------------------------------------------------
r57587 | kazu | 2017-02-10 09:58:45 +0900 (Fri, 10 Feb 2017) | 1 line

lib/base64.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57586 | svn | 2017-02-10 01:12:01 +0900 (Fri, 10 Feb 2017) | 1 line

* 2017-02-10
------------------------------------------------------------------------
r57585 | kazu | 2017-02-10 01:12:00 +0900 (Fri, 10 Feb 2017) | 1 line

lib/abbrev.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57584 | akr | 2017-02-09 23:28:27 +0900 (Thu, 09 Feb 2017) | 7 lines

[DOC] Update an obsolete example for slice_before.

The argument for Enumerable#slice_before is is removed at Ruby 2.3.

Reported by Shyouhei Urabe.  [Bug #13202]


------------------------------------------------------------------------
r57583 | nobu | 2017-02-09 21:08:56 +0900 (Thu, 09 Feb 2017) | 4 lines

fiddle: jobserver for libffi

* ext/fiddle/depend (libffi): use $(MAKE) explicitly for recursive
  make, so that jobserver works.
------------------------------------------------------------------------
r57582 | hsbt | 2017-02-09 20:46:32 +0900 (Thu, 09 Feb 2017) | 5 lines

Update maintainers list.

 * Added Default gems section and move some libraries to it section.
 * Added Bundled gems section and added upstream repositories of bundled gems.
 * Added upstream repositories to some default gems.
------------------------------------------------------------------------
r57581 | hsbt | 2017-02-09 20:26:21 +0900 (Thu, 09 Feb 2017) | 5 lines

Update latest infomation of standard libraries.

 * Added Bundled gems section.
 * Added IO::console to Default gems.
 * Move XMLRPC to Bundled gems section.
------------------------------------------------------------------------
r57580 | hsbt | 2017-02-09 19:49:08 +0900 (Thu, 09 Feb 2017) | 1 line

Separated default gems section.
------------------------------------------------------------------------
r57579 | svn | 2017-02-09 16:53:53 +0900 (Thu, 09 Feb 2017) | 1 line

* 2017-02-09
------------------------------------------------------------------------
r57578 | nobu | 2017-02-09 16:53:52 +0900 (Thu, 09 Feb 2017) | 5 lines

parse.y: fix idCOLON2

* defs/id.def: remove idDSTAR and idCOLON3.

* parse.y (tCOLON2): make same as id.h.
------------------------------------------------------------------------
r57577 | hsbt | 2017-02-08 19:05:13 +0900 (Wed, 08 Feb 2017) | 3 lines

Added initial gemspec for DBM module.

  [Feature #13201]
------------------------------------------------------------------------
r57576 | nobu | 2017-02-08 16:06:37 +0900 (Wed, 08 Feb 2017) | 4 lines

parse.y: named caputre into match_op_gen

* parse.y (match_op_gen): move making named capture assignment
  nodes.  remove repeated conditions.
------------------------------------------------------------------------
r57575 | ko1 | 2017-02-08 12:59:53 +0900 (Wed, 08 Feb 2017) | 2 lines

remove warning about enum and int comparison.

------------------------------------------------------------------------
r57574 | svn | 2017-02-08 10:18:56 +0900 (Wed, 08 Feb 2017) | 1 line

* 2017-02-08
------------------------------------------------------------------------
r57573 | nobu | 2017-02-08 10:18:56 +0900 (Wed, 08 Feb 2017) | 4 lines

node.c: compress logop sequence

* node.c (dump_node): compress sequence of same logical binary
  operators, NODE_AND/NODE_OR.
------------------------------------------------------------------------
r57564 | kazu | 2017-02-07 21:49:57 +0900 (Tue, 07 Feb 2017) | 1 line

{ext,test}/zlib: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57563 | nobu | 2017-02-07 17:16:50 +0900 (Tue, 07 Feb 2017) | 5 lines

test/unit.rb: old GNU make

* test/lib/test/unit.rb (Test::Unit::Parallel#non_options):
  support old GNU make, which uses --jobserver-fds option instead
  of --jobserver-auth.
------------------------------------------------------------------------
r57562 | nobu | 2017-02-07 17:09:23 +0900 (Tue, 07 Feb 2017) | 4 lines

test_parallel.rb: match the count

* test/testunit/test_parallel.rb (test_should_run_all_without_any_leaks):
  match the final test count instead of progressing indicators.
------------------------------------------------------------------------
r57561 | hsbt | 2017-02-07 16:14:22 +0900 (Tue, 07 Feb 2017) | 1 line

Fix a required ruby version on gemspec of gemified libraries.
------------------------------------------------------------------------
r57560 | hsbt | 2017-02-07 16:14:21 +0900 (Tue, 07 Feb 2017) | 1 line

Added initial gemspec for StringScanner class.
------------------------------------------------------------------------
r57559 | nobu | 2017-02-07 14:19:29 +0900 (Tue, 07 Feb 2017) | 4 lines

test/unit.rb: most-asserted

* test/lib/test/unit.rb (Statistics#record): record most asserted
  tests.
------------------------------------------------------------------------
r57558 | ko1 | 2017-02-07 13:24:44 +0900 (Tue, 07 Feb 2017) | 2 lines

TRUE is not defined here...

------------------------------------------------------------------------
r57557 | ko1 | 2017-02-07 13:14:25 +0900 (Tue, 07 Feb 2017) | 6 lines

remove compare with enum value.

* vm_core.h (vm_block_handler_verify): some compilers warn about comparison
  with enum value and 0. Real assertion is in vm_block_handler_type() so
  we only need to call vm_block_handler_type() and the value should be TRUE.

------------------------------------------------------------------------
r57556 | nobu | 2017-02-07 12:58:07 +0900 (Tue, 07 Feb 2017) | 4 lines

test/unit.rb: defined

* test/lib/test/unit.rb (Test::Unit::Statistics#record): check if
  @longest is set first.
------------------------------------------------------------------------
r57555 | nobu | 2017-02-07 12:55:47 +0900 (Tue, 07 Feb 2017) | 7 lines

test/unit: record in parallel

* test/lib/test/unit.rb (Test::Unit::Parallel#deal): deal with
  record.

* test/lib/test/unit/parallel.rb (Test::Unit::Worker#record):
  report test records to the master.
------------------------------------------------------------------------
r57554 | nobu | 2017-02-07 11:49:04 +0900 (Tue, 07 Feb 2017) | 4 lines

test/unit.rb: statistics

* test/lib/test/unit.rb (Test::Unit::Statistics): show statistics.
  only --longest option is implemented right now.
------------------------------------------------------------------------
r57553 | svn | 2017-02-07 11:49:03 +0900 (Tue, 07 Feb 2017) | 1 line

* 2017-02-07
------------------------------------------------------------------------
r57552 | nobu | 2017-02-07 11:49:02 +0900 (Tue, 07 Feb 2017) | 3 lines

rbinstall.rb: umask hack

* tool/rbinstall.rb (Gem::Installer#install): moved umask hack.
------------------------------------------------------------------------
r57551 | kazu | 2017-02-06 22:23:39 +0900 (Mon, 06 Feb 2017) | 1 line

{ext,test}/strscan: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57550 | hsbt | 2017-02-06 18:51:17 +0900 (Mon, 06 Feb 2017) | 3 lines

Added initial gemspec for FileUtils module.

  [Feature #13197]
------------------------------------------------------------------------
r57549 | nobu | 2017-02-06 16:34:13 +0900 (Mon, 06 Feb 2017) | 13 lines

date_core.c: [DOC] revise docs [ci skip]

* fix malformed rdoc for Date#today, Date._strptime,
  and DateTime._strptime
* add code examples for Date#<< and Date#>> to demonstrate
  that different dates can result in the same return value
* use Date::ITALY in call-seq instead of only ITALY
* fix some copy/paste mistakes where Date should be DateTime
* fix various errors and grammar
* fix cross references and formatting

[ruby-core:79433] [Bug #13193]
Author:    Marcus Stollsteimer <sto.mar@web.de>
------------------------------------------------------------------------
r57548 | nobu | 2017-02-06 11:35:48 +0900 (Mon, 06 Feb 2017) | 5 lines

rdoc: suppress warnings in eval

* lib/rdoc/markup/to_html.rb (RDoc::Markup::ToHtml): the argument
  text may contain warnings, which are useless to check if
  parseable.  merge rdoc/rdoc#440.
------------------------------------------------------------------------
r57547 | nobu | 2017-02-06 11:35:47 +0900 (Mon, 06 Feb 2017) | 1 line

common.mk: suppress debugging messages
------------------------------------------------------------------------
r57546 | nobu | 2017-02-06 08:52:49 +0900 (Mon, 06 Feb 2017) | 4 lines

rbinstall.rb: Gem::Installer lacks dir_mode option

* tool/rbinstall.rb (bundle-gems): Gem::Installer does not support
  directory permission option, set umask to owner writable.
------------------------------------------------------------------------
r57545 | nobu | 2017-02-06 08:52:48 +0900 (Mon, 06 Feb 2017) | 1 line

rbinstall.rb: rename tags
------------------------------------------------------------------------
r57544 | nobu | 2017-02-06 01:23:12 +0900 (Mon, 06 Feb 2017) | 1 line

tool/rbinstall.rb: add new tags
------------------------------------------------------------------------
r57543 | nobu | 2017-02-06 01:23:11 +0900 (Mon, 06 Feb 2017) | 6 lines

rbinstall.rb: default umask

* tool/rbinstall.rb: revert r49841 and default umask to just
  prohibit all from writing.  symlink(2) has no argument to set
  permissions but is affected by umask.
  [ruby-dev:49975] [Bug #13194]
------------------------------------------------------------------------
r57542 | svn | 2017-02-06 01:07:31 +0900 (Mon, 06 Feb 2017) | 1 line

* 2017-02-06
------------------------------------------------------------------------
r57541 | naruse | 2017-02-06 01:07:30 +0900 (Mon, 06 Feb 2017) | 1 line

@job_tokens is defined iff @jobserver is true
------------------------------------------------------------------------
r57540 | yui-knk | 2017-02-05 23:16:52 +0900 (Sun, 05 Feb 2017) | 3 lines

node.c: Fix a typo

* node.c (dump_node): Fix a typo of || operator example
------------------------------------------------------------------------
r57539 | nobu | 2017-02-05 20:15:49 +0900 (Sun, 05 Feb 2017) | 5 lines

rational.c: fix rdoc [ci skip]

* rational.c (rb_rational_plus): [DOC] fix an example.
  A patch by Trygve Flathen <at.ruby-lang AT flathen.net> in
  [ruby-core:71755].  [Bug #11752]
------------------------------------------------------------------------
r57538 | kazu | 2017-02-05 16:54:32 +0900 (Sun, 05 Feb 2017) | 1 line

{ext,test}/ripper: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57537 | nobu | 2017-02-05 10:26:27 +0900 (Sun, 05 Feb 2017) | 4 lines

pty/shl.rb: update [ci skip]

* sample/pty/shl.rb: leap exited child process.
  [ruby-dev:49974] [Bug #13191]
------------------------------------------------------------------------
r57536 | normal | 2017-02-05 09:22:03 +0900 (Sun, 05 Feb 2017) | 9 lines

doc: Add example for Symbol#to_s

* string.c: add example for Symbol#to_s.

The docs for Symbol#to_s only include an example for
Symbol#id2name, but not for #to_s which is an alias;
the docs should include examples for both methods.

From: Marcus Stollsteimer <sto.mar@web.de>
------------------------------------------------------------------------
r57535 | svn | 2017-02-05 03:14:43 +0900 (Sun, 05 Feb 2017) | 1 line

* 2017-02-05
------------------------------------------------------------------------
r57534 | naruse | 2017-02-05 03:14:42 +0900 (Sun, 05 Feb 2017) | 1 line

fix description for current implementation
------------------------------------------------------------------------
r57533 | nobu | 2017-02-04 19:48:15 +0900 (Sat, 04 Feb 2017) | 4 lines

pty/shl.rb: update [ci skip]

* sample/pty/shl.rb: do not manage array length separately.
  [ruby-dev:49974] [Bug #13191]
------------------------------------------------------------------------
r57532 | nobu | 2017-02-04 19:48:14 +0900 (Sat, 04 Feb 2017) | 4 lines

pty/shl.rb: update [ci skip]

* sample/pty/shl.rb: use io/console instead of stty.
  [ruby-dev:49974] [Bug #13191]
------------------------------------------------------------------------
r57531 | nobu | 2017-02-04 19:48:13 +0900 (Sat, 04 Feb 2017) | 5 lines

pty/shl.rb: update [ci skip]

* sample/pty/shl.rb: stop writer loop when the child exited.
  PTY::ChildExited no longer raises asynchronously since r20298.
  [ruby-dev:49974] [Bug #13191]
------------------------------------------------------------------------
r57530 | kazu | 2017-02-04 15:49:07 +0900 (Sat, 04 Feb 2017) | 5 lines

sample/pty/shl.rb: update sample

* Specify frozen_string_literal: true.
* Fix TypeError of raise.
* Use a character literal instead of Integer.
------------------------------------------------------------------------
r57529 | kazu | 2017-02-04 15:49:06 +0900 (Sat, 04 Feb 2017) | 1 line

sample/pty/script.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57528 | kazu | 2017-02-04 15:49:04 +0900 (Sat, 04 Feb 2017) | 5 lines

sample/pty/expect_sample.rb: Update sample

* Fix regexp capture scope bug.
* Specify frozen_string_literal: true.
* Use passive mode.
------------------------------------------------------------------------
r57527 | kazu | 2017-02-04 15:49:00 +0900 (Sat, 04 Feb 2017) | 1 line

ext/pty: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57526 | nobu | 2017-02-04 14:23:48 +0900 (Sat, 04 Feb 2017) | 5 lines

test/unit.rb: jobserver for workers

* test/lib/test/unit.rb (Test::Unit::Parallel#process_args):
  initialize @run_options to pass jobserver auth pipes to worker
  processes.
------------------------------------------------------------------------
r57525 | nobu | 2017-02-04 12:28:17 +0900 (Sat, 04 Feb 2017) | 4 lines

test/unit.rb: job tokens

* test/lib/test/unit.rb (_run_parallel): deal with job tokens for
  each workers.
------------------------------------------------------------------------
r57524 | nobu | 2017-02-04 11:17:35 +0900 (Sat, 04 Feb 2017) | 4 lines

test/unit.rb: initialize instance variable

* test/lib/test/unit.rb (Test::Unit::Parallel#non_options):
  initialize @jobserver instance variable to suppress warnings.
------------------------------------------------------------------------
r57523 | nobu | 2017-02-04 10:04:14 +0900 (Sat, 04 Feb 2017) | 4 lines

test_gem.rb: exclude default gems

* test/rubygems/test_gem.rb: check difference to exclude default
  gems from the expected results.  [Feature #13186]
------------------------------------------------------------------------
r57522 | normal | 2017-02-04 08:58:18 +0900 (Sat, 04 Feb 2017) | 14 lines

doc: restore class documentation for Struct

* struct.c: restore class documentation for Struct
  that disappeared with r46663.

Due to r46663, the class documentation for Struct disappeared.
(The revision inserted the definition of `InitVM_Struct` between
the rdoc and the definition of `Init_Struct`.)

The docs are rendered for 2.1: <https://docs.ruby-lang.org/en/2.1.0/Struct.html>,
but not for later versions, see: <https://docs.ruby-lang.org/en/2.2.0/Struct.html>
(Same for `ri` pages).

[ruby-core:79416] [Bug #13189]
------------------------------------------------------------------------
r57521 | normal | 2017-02-04 08:55:06 +0900 (Sat, 04 Feb 2017) | 8 lines

symbol.c (rb_id2str): eliminate branch to set class

Since the fstring table encompasses all strings in the
symbol table, we may reuse the fstring table walk to set
the class and eliminate the branch in rb_id2str.

* string.c (Init_String): use rb_cString immediately after definition
* symbol.c (rb_id2str): eliminate branch to set class
------------------------------------------------------------------------
r57520 | nobu | 2017-02-04 08:50:41 +0900 (Sat, 04 Feb 2017) | 5 lines

ruby.h: unused parameter

* include/ruby/ruby.h (rb_scan_args_set): remove unused parameter
  for more pedantic extension libraries.
  [ruby-core:79399] [Feature #13184]
------------------------------------------------------------------------
r57519 | normal | 2017-02-04 08:40:59 +0900 (Sat, 04 Feb 2017) | 1 line

.gitignore: add ext/rbconfig/sizeof/limits.c
------------------------------------------------------------------------
r57518 | normal | 2017-02-04 08:40:05 +0900 (Sat, 04 Feb 2017) | 3 lines

ext/rbconfig/sizeof: add limits.c to svn:ignore


------------------------------------------------------------------------
r57517 | normal | 2017-02-04 08:34:48 +0900 (Sat, 04 Feb 2017) | 8 lines

doc: Fix error for escape sequences in string literals

Backslash goes first in escape sequences, so it must be
"any other character following a backslash is interpreted as ...",
while the doc says "...followed by...".

Author: Marcus Stollsteimer <sto.mar@web.de>
[ruby-core:79418] [Bug #13190]
------------------------------------------------------------------------
r57516 | svn | 2017-02-04 03:25:29 +0900 (Sat, 04 Feb 2017) | 1 line

* 2017-02-04
------------------------------------------------------------------------
r57515 | marcandre | 2017-02-04 03:25:28 +0900 (Sat, 04 Feb 2017) | 3 lines

lib/ostruct.rb: Fix returned value of each_pair.

From a patch by Marcus Stollsteimer. [Fixes #13169]
------------------------------------------------------------------------
r57514 | nobu | 2017-02-03 21:52:09 +0900 (Fri, 03 Feb 2017) | 4 lines

test/unit.rb: share job slots

* test/lib/test/unit.rb (Test::Unit::Parallel#_run_parallel):
  share job slots with GNU 'make'.
------------------------------------------------------------------------
r57513 | nobu | 2017-02-03 21:52:08 +0900 (Fri, 03 Feb 2017) | 4 lines

test/unit.rb: job testing flag

* test/lib/test/unit.rb (Parallel#non_options): split testing flag
  and job count by OptionParser.
------------------------------------------------------------------------
r57512 | hsbt | 2017-02-03 21:39:04 +0900 (Fri, 03 Feb 2017) | 3 lines

Added initial gemspec for zlib module.

  [Feature #13186]
------------------------------------------------------------------------
r57511 | nobu | 2017-02-03 15:48:02 +0900 (Fri, 03 Feb 2017) | 4 lines

ensured.c: fix conflict

* ext/-test-/exception/ensured.c (exc_raise): get rid of conflict
  with raise(2) in the standard.  [ruby-core:79371] [Bug #13176]
------------------------------------------------------------------------
r57510 | nobu | 2017-02-03 15:23:34 +0900 (Fri, 03 Feb 2017) | 4 lines

eval.c: hide internal objects

* eval.c (rb_ensure): veil internal exception objects not to leak
  in ensure functions.  [ruby-core:79371] [Bug #13176]
------------------------------------------------------------------------
r57509 | nobu | 2017-02-03 15:11:32 +0900 (Fri, 03 Feb 2017) | 4 lines

internal.h: fix r57507

* internal.h (rb_overflowed_fix_to_int): invert sign bit.  should
  not set LSB of fixnum value, which is always set, to MSB.
------------------------------------------------------------------------
r57508 | normal | 2017-02-03 03:59:40 +0900 (Fri, 03 Feb 2017) | 10 lines

io.c: remove rb_ensure usage for rb_str_tmp_frozen_* calls

Using rb_ensure pessimizes the common case and makes the code
more difficult to read and follow.  If we hit an exceptions
during write, just let the GC handle cleanup as the exception
is already bad for garbage.

* io.c (io_fwrite): call rb_str_tmp_frozen{acquire,release} directly
  (rb_io_syswrite): ditto
  (fwrite_do, fwrite_end, swrite_do, swrite_end): remove
------------------------------------------------------------------------
r57507 | naruse | 2017-02-03 02:07:28 +0900 (Fri, 03 Feb 2017) | 1 line

fix typo and argument of r57506
------------------------------------------------------------------------
r57506 | naruse | 2017-02-03 00:54:51 +0900 (Fri, 03 Feb 2017) | 13 lines

Use carry flag to reduce instructions

NOTE:
(1) Fixnum's LSB is always 1.
    It means you can always run `x - 1` without overflow.
(2) Of course `z = x + (y-1)` may overflow.
    Now z's LSB is always 1, and the MSB of true result is also 1.
    You can get true result in long as `(1<<63)|(z>>1)`,
    and it equals to `(z<<63)|(z>>1)` == `ror(z)`.

GCC and Clang have __builtin_add_ovewflow:
* https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
* https://clang.llvm.org/docs/LanguageExtensions.html#checked-arithmetic-builtins
------------------------------------------------------------------------
r57505 | svn | 2017-02-03 00:12:30 +0900 (Fri, 03 Feb 2017) | 1 line

* 2017-02-03
------------------------------------------------------------------------
r57504 | kazu | 2017-02-03 00:12:29 +0900 (Fri, 03 Feb 2017) | 1 line

ext/fcntl: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57503 | kazu | 2017-02-02 21:38:41 +0900 (Thu, 02 Feb 2017) | 1 line

Add class name to assert messages
------------------------------------------------------------------------
r57502 | hsbt | 2017-02-02 17:38:54 +0900 (Thu, 02 Feb 2017) | 3 lines

Added initial gemspec for Date module.

  [Feature #13183]
------------------------------------------------------------------------
r57501 | nobu | 2017-02-02 17:02:36 +0900 (Thu, 02 Feb 2017) | 4 lines

escape.c: check argument

* ext/cgi/escape/escape.c (optimized_unescape): check
  accept_charset encoding argument.
------------------------------------------------------------------------
r57500 | hsbt | 2017-02-02 16:49:19 +0900 (Thu, 02 Feb 2017) | 3 lines

Added initial gemspec for CMath module.

  [Feature #13182]
------------------------------------------------------------------------
r57499 | nobu | 2017-02-02 16:03:59 +0900 (Thu, 02 Feb 2017) | 6 lines

test_cgi_util.rb: encoding tests

* test/cgi/test_cgi_util.rb (test_cgi_unescape): \u is useless on
  old versions.

* test/cgi/test_cgi_util.rb (test_cgi_include_unescape): ditto.
------------------------------------------------------------------------
r57498 | nobu | 2017-02-02 14:56:06 +0900 (Thu, 02 Feb 2017) | 5 lines

compile.c: restore catch entry sp

* compile.c (iseq_build_from_ary_exception): restore stack depth
  of catch entries.  accurate stack depths cannot be calculated
  from dumped array.
------------------------------------------------------------------------
r57497 | nobu | 2017-02-02 14:45:22 +0900 (Thu, 02 Feb 2017) | 4 lines

compile.c: restore misc params

* compile.c (rb_iseq_build_from_ary): restore misc params.
  accurate stack depths cannot be calculated from dumped array.
------------------------------------------------------------------------
r57496 | nobu | 2017-02-02 14:45:21 +0900 (Thu, 02 Feb 2017) | 4 lines

compile.c: keyword table for required kwarg

* compile.c (iseq_build_kw): keyword table is necessary also when
  required keyword argumetns only.
------------------------------------------------------------------------
r57495 | nobu | 2017-02-02 14:43:58 +0900 (Thu, 02 Feb 2017) | 6 lines

test_iseq_load.rb: refine test_require_integration

* test/-ext-/iseq_load/test_iseq_load.rb (test_require_integration):
  assert with diff.

[ci skip]
------------------------------------------------------------------------
r57494 | nobu | 2017-02-02 07:18:28 +0900 (Thu, 02 Feb 2017) | 4 lines

test_time.rb: use UTC

* test/ruby/test_time.rb (test_strftime_no_hidden_garbage): fix
  failure due to timezone offset.
------------------------------------------------------------------------
r57493 | svn | 2017-02-02 07:14:23 +0900 (Thu, 02 Feb 2017) | 1 line

* 2017-02-02
------------------------------------------------------------------------
r57492 | nobu | 2017-02-02 07:14:22 +0900 (Thu, 02 Feb 2017) | 5 lines

test_queue.rb: fix portability

* test/thread/test_queue.rb (test_queue_with_trap): fix
  portability.  use SIGINT instead of SIGUSR2 which is supported
  on not all platforms.
------------------------------------------------------------------------
r57491 | hsbt | 2017-02-01 18:12:53 +0900 (Wed, 01 Feb 2017) | 6 lines

Prepare to make CSV module to default gem.

  * lib/csv.gemspec: initial gemspec for csv gem.
  * tool/rbinstall.rb: support gemspec located under lib direcotry like `lib/foo.gemspec`

  [Feature #13177]
------------------------------------------------------------------------
r57490 | nobu | 2017-02-01 16:40:58 +0900 (Wed, 01 Feb 2017) | 5 lines

configure.in: use AC_SEARCH_LIBS

* configure.in (--with-gmp, --with-jemalloc): use AC_SEARCH_LIBS
  to check if no library is required, instead of AC_CHECK_LIB.
  [ruby-core:79368] [Bug #13175]
------------------------------------------------------------------------
r57489 | nobu | 2017-02-01 13:54:04 +0900 (Wed, 01 Feb 2017) | 7 lines

common.mk: remove explicit MFLAGS

It is unnecessary to pass MFLAGS to sub-makes, because it is
evaluated implicitly if set by make.  GNU make 4.2 sets both of
-jN and --jobserver-auth (or --jobserver-fds in older versions)
options which conflict.  And it is useless for command line macros
since Microsoft NMAKE does not set them.
------------------------------------------------------------------------
r57488 | nobu | 2017-02-01 13:54:03 +0900 (Wed, 01 Feb 2017) | 1 line

win32/setup.mak: reorder
------------------------------------------------------------------------
r57487 | svn | 2017-02-01 02:46:52 +0900 (Wed, 01 Feb 2017) | 1 line

* 2017-02-01
------------------------------------------------------------------------
r57486 | tenderlove | 2017-02-01 02:46:51 +0900 (Wed, 01 Feb 2017) | 6 lines

Add IMEMO type to heap dump output.

IMEMO objects have many types.  Without this change, we cannot see what
types of IMEMO objects are being used when dumping the heap.  Adding the
type to the IMEMO object will allow us to gather statistics about IMEMO
objects being used.
------------------------------------------------------------------------
r57485 | nobu | 2017-01-31 21:55:00 +0900 (Tue, 31 Jan 2017) | 4 lines

ruby.c: defining DATA

* ruby.c (load_file_internal): define DATA here instead of ensure
  func.
------------------------------------------------------------------------
r57484 | nobu | 2017-01-31 21:54:59 +0900 (Tue, 31 Jan 2017) | 5 lines

ruby.c: forbid options

* ruby.c (forbid_setid): constified.

* ruby.c (process_options): forbid if setid earlier.
------------------------------------------------------------------------
r57483 | naruse | 2017-01-31 19:37:50 +0900 (Tue, 31 Jan 2017) | 4 lines

Describe about RUBY_CODESIGN

With RUBY_CODESIGN people can avoid pushing many OK button of firewall
dialogs on macOS through test-all.
------------------------------------------------------------------------
r57482 | rhe | 2017-01-31 19:08:22 +0900 (Tue, 31 Jan 2017) | 24 lines

openssl: import v2.0.3

Import Ruby/OpenSSL 2.0.3. Only bugfixes. The full commit log since
2.0.2 (imported at r57146) can be found at:

  https://github.com/ruby/openssl/compare/v2.0.2...v2.0.3

----------------------------------------------------------------
Corey Bonnell (1):
      Fix for ASN1::Constructive 'each' implementation

Kazuki Yamaguchi (10):
      Fix build with static OpenSSL libraries on Windows
       ([ruby-core:78878] [Bug #13080])
      Merge pull request #96 from CBonnell/master
      Merge branch 'topic/windows-static-linking-without-pkg-config' into maint
      appveyor.yml: update OpenSSL version to 1.0.2j
      buffering: fix typo in doc
      test/envutil: fix assert_raise_with_message
      x509: fix OpenSSL::X509::Name#eql?
       ([ruby-core:79310] [Bug #13170])
      ruby-openssl-docker: update versions of Ruby and OpenSSL
      .travis.yml: test with Ruby 2.4
      Ruby/OpenSSL 2.0.3
------------------------------------------------------------------------
r57481 | hsbt | 2017-01-31 17:48:14 +0900 (Tue, 31 Jan 2017) | 3 lines

Initial commit for gem release of webrick.

  [Feature #13173]
------------------------------------------------------------------------
r57480 | nobu | 2017-01-31 17:03:08 +0900 (Tue, 31 Jan 2017) | 3 lines

mkmf.rb: message format string

* lib/mkmf.rb (checking_for): message needs format string.
------------------------------------------------------------------------
r57479 | ko1 | 2017-01-31 16:00:38 +0900 (Tue, 31 Jan 2017) | 7 lines

allow Queue operation in trap.

* thread_sync.c: allow spurious wakeup to check Queue status just after trap.
  [Bug #12405]

* test/thread/test_queue.rb: add a test for it.

------------------------------------------------------------------------
r57478 | ko1 | 2017-01-31 15:39:01 +0900 (Tue, 31 Jan 2017) | 6 lines

define rb_thread_sleep_deadly_allow_spurious_wakeup().

* thread.c, thread_sync.c: define new function
  rb_thread_sleep_deadly_allow_spurious_wakeup() and use it instead of
  using sleep_forever() directly.

------------------------------------------------------------------------
r57477 | ko1 | 2017-01-31 15:31:06 +0900 (Tue, 31 Jan 2017) | 2 lines

use TRUE/FALSE.

------------------------------------------------------------------------
r57476 | normal | 2017-01-31 11:18:58 +0900 (Tue, 31 Jan 2017) | 7 lines

time.c (time_strftime): avoid garbage in common case

strftime format strings which are dynamically-generated will benefit
from avoiding garbage, here.

* time.c (time_strftime): use rb_str_tmp_frozen_{acquire,release}
* test/ruby/test_time.rb (test_strftime_no_hidden_garbage): new test
------------------------------------------------------------------------
r57475 | nobu | 2017-01-31 11:01:31 +0900 (Tue, 31 Jan 2017) | 4 lines

limits.c.tmpl: fallback ULLONG_MAX

* template/limits.c.tmpl (ULLONG_MAX): add a fallback definition.
  On old CentOS lacks ULLONG_MAX.
------------------------------------------------------------------------
r57474 | nobu | 2017-01-31 10:18:10 +0900 (Tue, 31 Jan 2017) | 4 lines

test_io.rb: separate a test

* test/ruby/test_io.rb (test_closed_stream_in_rescue): run in a
  separated process.
------------------------------------------------------------------------
r57473 | normal | 2017-01-31 09:41:56 +0900 (Tue, 31 Jan 2017) | 8 lines

sprintf.c: avoid garbage in common (no exception) case

Format strings which are dynamically-generated will benefit
from this.  This won't cover exceptions, but exceptions for
sprintf should be too uncommon to care about (unlike IO)

* sprintf.c (rb_str_format): use rb_str_tmp_frozen_{acquire,release}
* test/ruby/test_sprintf.rb (test_no_hidden_garbage): new test
------------------------------------------------------------------------
r57472 | normal | 2017-01-31 07:03:57 +0900 (Tue, 31 Jan 2017) | 8 lines

io.c (rb_io_syswrite): avoid leaving garbage after write

As with IO#write, IO#syswrite also generates garbage which can
be harmful in hand-coded read-write loops.

* io.c (swrite_arg, swrite_do, swrite_end): new
  (rb_io_syswrite): use new functions to cleanup garbage
  [ruby-core:78898] [Bug #13085]
------------------------------------------------------------------------
r57471 | normal | 2017-01-31 06:54:32 +0900 (Tue, 31 Jan 2017) | 8 lines

string.c (rb_str_tmp_frozen_release): release embedded strings

Handle the embedded case first, since we may have an embedded
duplicate and non-embedded original string.

* string.c (rb_str_tmp_frozen_release): handled embedded strings
* test/ruby/test_io.rb (test_write_no_garbage): new test
  [ruby-core:78898] [Bug #13085]
------------------------------------------------------------------------
r57470 | svn | 2017-01-31 05:40:19 +0900 (Tue, 31 Jan 2017) | 1 line

* 2017-01-31
------------------------------------------------------------------------
r57469 | normal | 2017-01-31 05:40:18 +0900 (Tue, 31 Jan 2017) | 37 lines

io.c: recycle garbage on write

* string.c (STR_IS_SHARED_M): new flag to mark shared mulitple times
  (STR_SET_SHARED): set STR_IS_SHARED_M
  (rb_str_tmp_frozen_acquire, rb_str_tmp_frozen_release): new functions
  (str_new_frozen): set/unset STR_IS_SHARED_M as appropriate
* internal.h: declare new functions
* io.c (fwrite_arg, fwrite_do, fwrite_end): new
  (io_fwrite): use new functions

Introduce rb_str_tmp_frozen_acquire and rb_str_tmp_frozen_release
to manage a hidden, frozen string.  Reuse one bit of the embed
length for shared strings as STR_IS_SHARED_M to indicate a string
has been shared multiple times.  In the common case, the string
is only shared once so the object slot can be reclaimed immediately.

minimum results in each 3 measurements. (time and size)

Execution time (sec)
name                            trunk   built
io_copy_stream_write            0.682   0.254
io_copy_stream_write_socket     1.225   0.751

Speedup ratio: compare with the result of `trunk' (greater is better)
name    built
io_copy_stream_write            2.680
io_copy_stream_write_socket     1.630

Memory usage (last size) (B)
name                            trunk           built
io_copy_stream_write            95436800.000    6512640.000
io_copy_stream_write_socket     117628928.000   7127040.000

Memory consuming ratio (size) with the result of `trunk' (greater is better)
name    built
io_copy_stream_write            14.654
io_copy_stream_write_socket     16.505
------------------------------------------------------------------------
r57468 | nobu | 2017-01-30 21:00:34 +0900 (Mon, 30 Jan 2017) | 6 lines

common.mk: limits.c

* common.mk (ext/rbconfig/sizeof/sizes.c): specify the target
  explicitly.

* common.mk (ext/rbconfig/sizeof/limits.c): add the recipe.
------------------------------------------------------------------------
r57467 | nobu | 2017-01-30 20:45:00 +0900 (Mon, 30 Jan 2017) | 1 line

VC18 or later support stdbool.h
------------------------------------------------------------------------
r57466 | svn | 2017-01-30 19:12:19 +0900 (Mon, 30 Jan 2017) | 1 line

* properties.
------------------------------------------------------------------------
r57465 | shyouhei | 2017-01-30 19:12:18 +0900 (Mon, 30 Jan 2017) | 15 lines

make FIXNUM_MAX visible from Ruby

Because our tests now have several places where FIXNUM_MAX is needed,
we decided to provide it along with several other constants.

	* template/limits.c.tmpl: new file, defining RbConfig::Limits

	* ext/rbconfig/sizeof/depend (limits.c): rule to generate limits.c

	* test/-ext-/num2int/test_num2int.rb: use RbConfig::Limits

	* bootstraptest/test_insns.rb: ditto.

	* .gitignore: ignore new generated file.

------------------------------------------------------------------------
r57464 | ko1 | 2017-01-30 16:39:27 +0900 (Mon, 30 Jan 2017) | 2 lines

add a ticket number.

------------------------------------------------------------------------
r57463 | nobu | 2017-01-30 14:09:13 +0900 (Mon, 30 Jan 2017) | 1 line

reduce iterations for slower machines
------------------------------------------------------------------------
r57462 | nobu | 2017-01-30 13:54:52 +0900 (Mon, 30 Jan 2017) | 4 lines

fix up r57461

* internal.h: Microsoft Visual C++ has never supported C99 yet,
  even in 2017.
------------------------------------------------------------------------
r57461 | nobu | 2017-01-30 13:47:44 +0900 (Mon, 30 Jan 2017) | 4 lines

refine assertions

* test/irb/test_ruby-lex.rb (test_prompt): invert confinue flag by
  FIXME comments.  adjust line numbers.
------------------------------------------------------------------------
r57460 | shyouhei | 2017-01-30 13:42:04 +0900 (Mon, 30 Jan 2017) | 30 lines

#include <stdbool.h>

17+ years passed since standardized in ISO, 8 years since we added
AC_HEADER_STDBOOL to configure.in.  I'm quite confident that it's
already safe to use <stdbool.h>.

I understand that when we introduced AC_HEADER_STDBOOL, <stdbool.h>
was remain not included because C standard and SVR4 curses conflicted
miserably back then (#1).  Though I believe such situation has been
fixed already(#2), I'm afraid of your operating system might ship a
proprietary curses that still conflicts with the standard. So to avoid
potential problem, we limit the inclusion to our internal use only.

#1 : 1997 version of SUSv2 said bool is "defined though typedef" in
     <curses.h>, while C99 said bool is a macro, plus in C++ bool is a
     keyword.  AFASIK the curses library has never been a part of
     POSIX.

#2 : In reality ncurses and NetBSD curses both just follow C99 to
     include <stdbool.h> from <curses.h>.  I think C99 is now widely
     adopted.

----

	* internal.h: #include <stdbool.h> if present.  That is
	  believed to be the case for 99.9% systems that lives today.
	  Non-C99, non-C++ situations are intentionally left
	  undefined, advised by Motohiro Kosaki.  If you have such
	  compiler, please fill the definition appropriately.

------------------------------------------------------------------------
r57459 | nobu | 2017-01-30 12:57:46 +0900 (Mon, 30 Jan 2017) | 1 line

more checks for prompt
------------------------------------------------------------------------
r57458 | svn | 2017-01-30 12:21:16 +0900 (Mon, 30 Jan 2017) | 1 line

* 2017-01-30
------------------------------------------------------------------------
r57457 | nobu | 2017-01-30 12:21:15 +0900 (Mon, 30 Jan 2017) | 1 line

test for prompt
------------------------------------------------------------------------
r57456 | nobu | 2017-01-29 21:53:24 +0900 (Sun, 29 Jan 2017) | 1 line

test for immature statement
------------------------------------------------------------------------
r57455 | nobu | 2017-01-29 21:53:23 +0900 (Sun, 29 Jan 2017) | 1 line

test for top level statement
------------------------------------------------------------------------
r57454 | nobu | 2017-01-29 21:20:26 +0900 (Sun, 29 Jan 2017) | 1 line

test for comment
------------------------------------------------------------------------
r57453 | nobu | 2017-01-29 18:51:55 +0900 (Sun, 29 Jan 2017) | 1 line

tests for irb lexer
------------------------------------------------------------------------
r57452 | svn | 2017-01-29 10:35:24 +0900 (Sun, 29 Jan 2017) | 1 line

* 2017-01-29
------------------------------------------------------------------------
r57451 | kazu | 2017-01-29 10:35:23 +0900 (Sun, 29 Jan 2017) | 1 line

{ext,test}/etc: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57450 | nobu | 2017-01-28 20:27:32 +0900 (Sat, 28 Jan 2017) | 4 lines

test/unit.rb: minimum workers

* test/lib/test/unit.rb (_run_parallel): launch only necessary
  workers.
------------------------------------------------------------------------
r57449 | nobu | 2017-01-28 14:31:25 +0900 (Sat, 28 Jan 2017) | 4 lines

extmk.rb: remove clean and install mode

* ext/extmk.rb (parse_args): remove clean and install mode, now
  configure mode only.
------------------------------------------------------------------------
r57448 | nobu | 2017-01-28 14:23:39 +0900 (Sat, 28 Jan 2017) | 4 lines

extmk.rb: remove direct build mode

* ext/extmk.rb (parse_args): --command-output is now mandatory.
  remove direct build mode.
------------------------------------------------------------------------
r57447 | nobu | 2017-01-28 14:02:41 +0900 (Sat, 28 Jan 2017) | 5 lines

extension gems in static-linked-exts

* template/configure-ext.mk.tmpl: --no-extstatic option to gems.

* template/exts.mk.tmpl: include extension gems.
------------------------------------------------------------------------
r57446 | nobu | 2017-01-28 14:02:39 +0900 (Sat, 28 Jan 2017) | 4 lines

mkmf.rb: fix script installation

* lib/mkmf.rb (MakeMakefile): fix condition to install script
  files.
------------------------------------------------------------------------
r57445 | kazu | 2017-01-28 13:36:08 +0900 (Sat, 28 Jan 2017) | 1 line

{ext,test}/dbm: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57444 | nobu | 2017-01-28 10:43:29 +0900 (Sat, 28 Jan 2017) | 3 lines

exts.mk.tmpl: ruby names

* template/exts.mk.tmpl: extract configured ruby names.
------------------------------------------------------------------------
r57443 | svn | 2017-01-28 00:32:50 +0900 (Sat, 28 Jan 2017) | 1 line

* 2017-01-28
------------------------------------------------------------------------
r57442 | naruse | 2017-01-28 00:32:50 +0900 (Sat, 28 Jan 2017) | 1 line

fix typo
------------------------------------------------------------------------
r57441 | nobu | 2017-01-27 17:05:06 +0900 (Fri, 27 Jan 2017) | 5 lines

extmk.rb: fix for static-linked-ext

* ext/extmk.rb (extmake): fix up r57424 for static-linked-ext.
  separate maybestatic argument from basedir which is given always
  now.
------------------------------------------------------------------------
r57440 | nobu | 2017-01-27 16:51:58 +0900 (Fri, 27 Jan 2017) | 1 line

template/exts.mk.tmpl: fix missing dependencies
------------------------------------------------------------------------
r57439 | nobu | 2017-01-27 16:23:21 +0900 (Fri, 27 Jan 2017) | 1 line

template/exts.mk.tmpl: consider EXEEXT
------------------------------------------------------------------------
r57438 | nobu | 2017-01-27 16:16:36 +0900 (Fri, 27 Jan 2017) | 4 lines

exts.mk.tmpl: for not GNU makes

* template/exts.mk.tmpl: use `cd` then `make` instead of `make -C`
  when not GNU make.
------------------------------------------------------------------------
r57437 | nobu | 2017-01-27 14:01:18 +0900 (Fri, 27 Jan 2017) | 5 lines

leakchecker.rb: get rid of uninitialized Tempfile

* test/lib/leakchecker.rb (LeakChecker#find_tempfiles): get rid of
  errors on uninitialized Tempfile, which can be left when
  Dir.tmpdir failed or by Tempfile.allocate.
------------------------------------------------------------------------
r57436 | nobu | 2017-01-27 12:24:45 +0900 (Fri, 27 Jan 2017) | 3 lines

enum.c: write barrier

* enum.c (rb_nmin_run): set the class with write barrier.
------------------------------------------------------------------------
r57435 | nobu | 2017-01-27 12:24:44 +0900 (Fri, 27 Jan 2017) | 1 line

enum.c (rb_nmin_run): adjust indent [ci skip]
------------------------------------------------------------------------
r57434 | nobu | 2017-01-27 12:24:43 +0900 (Fri, 27 Jan 2017) | 9 lines

Enumerable#{min,min_by,max,max_by} [ci skip]

* enum.c: [DOC] Enumerable#{min,min_by,max,max_by} return a sorted
  array when +n+ argument is used.

* enum.c: Small typo : minimum -> maximum

[Bug #13161]
Author:    Eric Duminil <eric.duminil@gmail.com>
------------------------------------------------------------------------
r57433 | nobu | 2017-01-27 11:55:02 +0900 (Fri, 27 Jan 2017) | 4 lines

configure-ext.mk.tmpl: fix ext build

* template/configure-ext.mk.tmpl: fixed inverted names of target
  and directory, and chomp the last slash.
------------------------------------------------------------------------
r57432 | kazu | 2017-01-27 09:29:21 +0900 (Fri, 27 Jan 2017) | 1 line

{ext,test}/date: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57431 | kazu | 2017-01-27 00:14:02 +0900 (Fri, 27 Jan 2017) | 1 line

[DOC] Use Integer instead of Fixnum [ci skip]
------------------------------------------------------------------------
r57430 | svn | 2017-01-27 00:14:01 +0900 (Fri, 27 Jan 2017) | 1 line

* 2017-01-27
------------------------------------------------------------------------
r57429 | kazu | 2017-01-27 00:14:00 +0900 (Fri, 27 Jan 2017) | 1 line

lib/weakref.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57428 | kou | 2017-01-26 21:47:51 +0900 (Thu, 26 Jan 2017) | 6 lines

Add document for lib/rss/atom.rb

[fix GH-1520]

Patch by Tsehau Chao. Thanks!!!

------------------------------------------------------------------------
r57427 | ko1 | 2017-01-26 18:57:41 +0900 (Thu, 26 Jan 2017) | 5 lines

skip T_IMEMO for VMDEBUG

* vm_dump.c (vm_stack_dump_each): skip T_IMEMO object to display
  for VMDEBUG=3. [Bug #13030]

------------------------------------------------------------------------
r57426 | ko1 | 2017-01-26 18:40:25 +0900 (Thu, 26 Jan 2017) | 2 lines

* vm_dump.c: enable to compile with VMDEBUG == 3.

------------------------------------------------------------------------
r57425 | svn | 2017-01-26 17:19:35 +0900 (Thu, 26 Jan 2017) | 1 line

* 2017-01-26
------------------------------------------------------------------------
r57424 | nobu | 2017-01-26 17:19:34 +0900 (Thu, 26 Jan 2017) | 1 line

Parallel gem configuration
------------------------------------------------------------------------
r57423 | hsbt | 2017-01-26 16:09:58 +0900 (Thu, 26 Jan 2017) | 4 lines

Fix function name for DBM on extension document.

  Patch by Yuji Yaginuma, @y-yagi <yuuji.yaginuma@gmail.com>
  [ci skip][fix GH-1519]
------------------------------------------------------------------------
r57422 | nobu | 2017-01-25 23:34:07 +0900 (Wed, 25 Jan 2017) | 4 lines

io.c: close before wait

* io.c (io_close_fptr): notify then close, and wait for other
  threads before free fptr.  [ruby-core:79262] [Bug #13158]
------------------------------------------------------------------------
r57421 | kazu | 2017-01-25 23:28:42 +0900 (Wed, 25 Jan 2017) | 3 lines

[DOC] Add empty example to enum.all? and any?

[ci skip]
------------------------------------------------------------------------
r57420 | nobu | 2017-01-25 15:08:16 +0900 (Wed, 25 Jan 2017) | 3 lines

regcomp.c: debug function [ci skip]

* regcomp.c (print_indent_tree): make a function for debug static.
------------------------------------------------------------------------
r57419 | nobu | 2017-01-25 15:05:51 +0900 (Wed, 25 Jan 2017) | 4 lines

.gdbinit: fix on empty strings [ci skip]

* .gdbinit (output_string): get rid of "Invalid number 0 of
  repetitions" error on empty strings.
------------------------------------------------------------------------
r57418 | nobu | 2017-01-25 15:05:50 +0900 (Wed, 25 Jan 2017) | 3 lines

.gdbinit: op symbols [ci skip]

* .gdbinit (rp_id): add unhandled operator symbols.
------------------------------------------------------------------------
r57417 | svn | 2017-01-25 12:03:53 +0900 (Wed, 25 Jan 2017) | 1 line

* 2017-01-25
------------------------------------------------------------------------
r57416 | ko1 | 2017-01-25 12:03:52 +0900 (Wed, 25 Jan 2017) | 6 lines

swithc id_table data structure.

* id_table.c: swtich to "simple open addressing with quadratic probing"
  by Yura Sokolov.  For more detail measurements, see [Feature #12180]
* id_table.c: remove other algorithms to simplify the source code.

------------------------------------------------------------------------
r57415 | nobu | 2017-01-24 23:52:07 +0900 (Tue, 24 Jan 2017) | 4 lines

eval.c: copy special exception

* eval.c (setup_exception): make unfrozen copy of special
  exception before setting up a cause.
------------------------------------------------------------------------
r57414 | nobu | 2017-01-24 16:52:41 +0900 (Tue, 24 Jan 2017) | 1 line

parse.y (parser_yylex): remove wrong warning
------------------------------------------------------------------------
r57413 | svn | 2017-01-24 11:38:58 +0900 (Tue, 24 Jan 2017) | 1 line

* remove trailing spaces.
------------------------------------------------------------------------
r57412 | hsbt | 2017-01-24 11:38:57 +0900 (Tue, 24 Jan 2017) | 4 lines

Update Rubygems 2.6.10

 * https://github.com/rubygems/rubygems/commit/2ee5bf9fd3bd7649d3e244bc40107ff32070ef47
 * https://github.com/rubygems/rubygems/commit/be510dd4097e65c6a256a6e173d6b724a3a96472
------------------------------------------------------------------------
r57411 | naruse | 2017-01-24 02:02:08 +0900 (Tue, 24 Jan 2017) | 3 lines

Fix typo of URI#escape [Bug #13147]

patched by Steve Hill <sghill.dev@gmail.com>
------------------------------------------------------------------------
r57410 | naruse | 2017-01-24 01:58:27 +0900 (Tue, 24 Jan 2017) | 5 lines

Prevent GC by volatile [Bug #13150]

test/ruby/test_marshal.rb test_context_switch (load) and test_gc (dump)
are failed on FreeBSD 10.3 and gcc7 (FreeBSD Ports Collection) 7.0.0
20170115 (experimental); RB_GC_GUARD looks not worked well.
------------------------------------------------------------------------
r57409 | svn | 2017-01-24 00:47:33 +0900 (Tue, 24 Jan 2017) | 1 line

* 2017-01-24
------------------------------------------------------------------------
r57408 | kazu | 2017-01-24 00:47:32 +0900 (Tue, 24 Jan 2017) | 1 line

test/test_tmpdir.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57407 | nobu | 2017-01-23 15:16:04 +0900 (Mon, 23 Jan 2017) | 5 lines

object.c: no TypeError at Symbol

* object.c (special_object_p): uninterned Symbol also should not
  raise a TypeError but return itself instead, as well as interned
  Symbols.  [ruby-core:79216] [Bug #13145]
------------------------------------------------------------------------
r57406 | nobu | 2017-01-23 14:59:28 +0900 (Mon, 23 Jan 2017) | 4 lines

csv.rb: fix field_size_limit check

* lib/csv.rb (CSV#shift): the last column is an Array in extended
  column since r55985.  [ruby-dev:49964] [Bug #13149]
------------------------------------------------------------------------
r57405 | nobu | 2017-01-23 13:49:19 +0900 (Mon, 23 Jan 2017) | 6 lines

error.c: fixed doc [ci skip]

* error.c (exc_message): fixed doc regarding the presence of
  to_str.  [Fix GH-1517]

Author:    Marc Gauthier <marcg.gauthier@gmail.com>
------------------------------------------------------------------------
r57404 | nobu | 2017-01-23 13:22:23 +0900 (Mon, 23 Jan 2017) | 4 lines

configure-ext.mk.tmpl: embed macros

* template/configure-ext.mk.tmpl: embed MINIRUBY and SCRIPT_ARGS
  to get rid of quoting problems of nmake.
------------------------------------------------------------------------
r57403 | nobu | 2017-01-23 12:51:25 +0900 (Mon, 23 Jan 2017) | 11 lines

Fix for nmake

* common.mk (EXT_MK): use double-quotes and remove SCRIPT_ARGS
  which contains both types of quotes.

* template/configure-ext.mk.tmpl (all): use single-quotes for MAKE
  which is set by nmake and contains spaces in the path. do not
  use SCRIPT_ARGS.

* template/exts.mk.tmpl (all, static): separate dependency lines,
  not to become a default target unintentionally.
------------------------------------------------------------------------
r57402 | nobu | 2017-01-23 12:43:43 +0900 (Mon, 23 Jan 2017) | 4 lines

configure-ext.mk.tmpl: FORCE

* template/configure-ext.mk.tmpl (FORCE): add missing target for
  BSD make.
------------------------------------------------------------------------
r57401 | nobu | 2017-01-23 11:50:23 +0900 (Mon, 23 Jan 2017) | 7 lines

Parallel ext configuration

* ext/configure-ext.mk: configure each directories underneath ext
  in parallel.

* template/exts.mk.tmpl: then collect the results.

------------------------------------------------------------------------
r57400 | svn | 2017-01-23 11:47:17 +0900 (Mon, 23 Jan 2017) | 1 line

* properties.
------------------------------------------------------------------------
r57399 | shyouhei | 2017-01-23 11:47:16 +0900 (Mon, 23 Jan 2017) | 14 lines

improve C0 coverage of insns.def from 65.9% to 96.1%

While I was developing my private topic branch I found that the VM
itself is not tested very much in `make test` tests.  Of course
`make test-all` covers vast majority of the VM but running that task
is not an immediately possible thing when we are touching the VM.  In
order to boost development in a rapid cycle I decided to add some
tests to the bootstraptest.  Here it is.

	* test_insns.rb: new test that covers insns.def.

	* runner.rb (#assert_equal): pass extra options to the target
	  so that we can test frozen_string_literal: true situation.

------------------------------------------------------------------------
r57398 | nobu | 2017-01-23 11:19:00 +0900 (Mon, 23 Jan 2017) | 4 lines

extinit.c.tmpl: drop after dot

* template/extinit.c.tmpl: drop rest from the first dot in the
  base name of a feature is ignored since r30464.
------------------------------------------------------------------------
r57397 | svn | 2017-01-23 11:18:59 +0900 (Mon, 23 Jan 2017) | 1 line

* 2017-01-23
------------------------------------------------------------------------
r57396 | nobu | 2017-01-23 11:18:59 +0900 (Mon, 23 Jan 2017) | 5 lines

extmk.rb: EXTINITS to sub make

* ext/extmk.rb: pass EXTINITS to sub make.  if the template for
  extinit.c is modified after extinit.c got compiled, extinit.c
  will be re-generated together with ruby.
------------------------------------------------------------------------
r57395 | nobu | 2017-01-22 21:50:36 +0900 (Sun, 22 Jan 2017) | 3 lines

template/extinit.c.tmpl

* template/extinit.c.tmpl: separate from ext/extmk.rb.
------------------------------------------------------------------------
r57394 | nobu | 2017-01-22 17:04:37 +0900 (Sun, 22 Jan 2017) | 5 lines

Makefile.sub: refine distclean-ext

* win32/Makefile.sub (distclean-ext, realclean-ext): remove
  extinit.c and suppress error message when failed to remove ext
  directory.
------------------------------------------------------------------------
r57393 | shyouhei | 2017-01-22 13:14:21 +0900 (Sun, 22 Jan 2017) | 2 lines

NEWS for SecureRandom's random source [ci skip]

------------------------------------------------------------------------
r57392 | shyouhei | 2017-01-22 13:02:42 +0900 (Sun, 22 Jan 2017) | 2 lines

NEWS for SipHash13 [ci skip]

------------------------------------------------------------------------
r57391 | svn | 2017-01-22 12:06:18 +0900 (Sun, 22 Jan 2017) | 1 line

* 2017-01-22
------------------------------------------------------------------------
r57390 | kazu | 2017-01-22 12:06:17 +0900 (Sun, 22 Jan 2017) | 4 lines

Hash#fetch: fix grammar in documentation.

[Fix GH-1515][ci skip]
Author:    Alyssa Ross <hi+services.github@alyssa.is>
------------------------------------------------------------------------
r57389 | kazu | 2017-01-21 21:21:05 +0900 (Sat, 21 Jan 2017) | 1 line

lib/tempfile.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57388 | svn | 2017-01-21 15:17:08 +0900 (Sat, 21 Jan 2017) | 1 line

* 2017-01-21
------------------------------------------------------------------------
r57387 | nobu | 2017-01-21 15:17:07 +0900 (Sat, 21 Jan 2017) | 1 line

Makefile.in: clean ruby-runner [ci skip]
------------------------------------------------------------------------
r57386 | kazu | 2017-01-20 22:33:06 +0900 (Fri, 20 Jan 2017) | 5 lines

Remove deprecated rbconfig/datadir

This is deleted at
https://github.com/rubygems/rubygems/commit/0e3c2c1f04182990c4c7a0aa53435ad8427342fd
in upstream.
------------------------------------------------------------------------
r57385 | nobu | 2017-01-20 19:59:47 +0900 (Fri, 20 Jan 2017) | 4 lines

extmk.rb: ignore generated sources

* ext/extmk.rb (extract_makefile): ignore generated source files
  not to reconfigure when in-place build.
------------------------------------------------------------------------
r57384 | shyouhei | 2017-01-20 17:00:00 +0900 (Fri, 20 Jan 2017) | 24 lines

SecureRandom should try /dev/urandom first [Bug #9569]

	* random.c (InitVM_Random): rename Random.raw_seed to
	  Random.urandom.  A quick search seems there are no practical use
	  of this method than securerandom.rb so I think it's OK to rename
	  but if there are users of it, this hunk is subject to revert.

	* test/ruby/test_rand.rb (TestRand#test_urandom): test for it.

	* lib/securerandom.rb (SecureRandom.gen_random): Prefer OS-
	  provided CSPRNG if available. Otherwise falls back to OpenSSL.
	  Current preference is:

	  1. CSPRNG routine that the OS has; one of
	     - getrandom(2),
	     - arc4random(3), or
	     - CryptGenRandom()
	  2. /dev/urandom device
	  3. OpenSSL's RAND_bytes(3)

	  If none of above random number generators are available, you
	  cannot use this module.  An exception is raised that case.


------------------------------------------------------------------------
r57383 | nobu | 2017-01-20 16:45:10 +0900 (Fri, 20 Jan 2017) | 4 lines

Keep -jN option

* {cygwin,template}/GNUmakefile.in (MFLAGS, MAKEFLAGS): keep -jN
  option.
------------------------------------------------------------------------
r57382 | shyouhei | 2017-01-20 15:01:23 +0900 (Fri, 20 Jan 2017) | 16 lines

switch SipHash from SipHash24 to SipHash13 variant

SipHash13 is secure enough to be used in hash-tables,
and SipHash's author confirms that.
Rust already considered switch to SipHash13:
  https://github.com/rust-lang/rust/issues/29754#issue-116174313
Jean-Philippe Aumasson confirmation:
  https://github.com/rust-lang/rust/issues/29754#issuecomment-156073946
Merged pull request:
  https://github.com/rust-lang/rust/pull/33940

From: Sokolov Yura aka funny_falcon <funny.falcon@gmail.com>
Date: Thu, 8 Dec 2016 20:31:29 +0300
Signed-off-by: Urabe, Shyouhei <shyouhei@ruby-lang.org>
Fixes: [Feature #13017]

------------------------------------------------------------------------
r57381 | nobu | 2017-01-20 13:27:55 +0900 (Fri, 20 Jan 2017) | 5 lines

compile.c: optimization of defined? in condition

* compile.c (compile_branch_condition): trivial optimization of
  defined? expression in a branch condition, where a string is not
  needed, but just a boolean.
------------------------------------------------------------------------
r57380 | nobu | 2017-01-20 11:39:27 +0900 (Fri, 20 Jan 2017) | 5 lines

array.c: improve Array#sample

* array.c (rb_ary_sample): improve performance when many samples
  from a large array.  based on the patch by tomoya ishida
  <tomoyapenguin AT gmail.com> in [ruby-dev:49956].  [Bug #13136]
------------------------------------------------------------------------
r57379 | nobu | 2017-01-20 11:27:28 +0900 (Fri, 20 Jan 2017) | 1 line

benchmarks for Bug#13136
------------------------------------------------------------------------
r57378 | svn | 2017-01-20 10:02:38 +0900 (Fri, 20 Jan 2017) | 1 line

* 2017-01-20
------------------------------------------------------------------------
r57377 | nobu | 2017-01-20 10:02:37 +0900 (Fri, 20 Jan 2017) | 4 lines

error.c: print default RS

* error.c (rb_warn_m): print the default RS instead of an empty
  string with a newline.  [Feature #12944]
------------------------------------------------------------------------
r57376 | nobu | 2017-01-19 18:54:58 +0900 (Thu, 19 Jan 2017) | 4 lines

parse.y: rescue/else/ensure in do-end

* parse.y (do_body): allow rescue/else/ensure inside do/end
  blocks.  [Feature #12906]
------------------------------------------------------------------------
r57375 | naruse | 2017-01-19 18:34:30 +0900 (Thu, 19 Jan 2017) | 1 line

More description about the protected attribute of a method
------------------------------------------------------------------------
r57374 | shugo | 2017-01-19 17:13:03 +0900 (Thu, 19 Jan 2017) | 3 lines

string.c: rindex(//) should set $~.

This seems a bug introduced by r520 (1.4.0).  [ruby-core:79110] [Bug #13135]
------------------------------------------------------------------------
r57373 | nobu | 2017-01-19 16:18:23 +0900 (Thu, 19 Jan 2017) | 4 lines

parse.y: chomp by -l

* parse.y (rb_parser_while_loop): should chomp but not chop by -l
  option.  [ruby-core:78099] [Bug #12926]
------------------------------------------------------------------------
r57372 | hsbt | 2017-01-19 16:07:17 +0900 (Thu, 19 Jan 2017) | 3 lines

Fix documentation of options for all of methods in FileUtils.

Patch by galia traub( @galiat ). [Fix GH-1510][ci skip]
------------------------------------------------------------------------
r57371 | nobu | 2017-01-19 15:39:44 +0900 (Thu, 19 Jan 2017) | 4 lines

ENV#fetch: fix documentation of raised exception

[Fix GH-1514]
Author:    Misty De Meo <mistydemeo@github.com>
------------------------------------------------------------------------
r57370 | nobu | 2017-01-19 15:25:06 +0900 (Thu, 19 Jan 2017) | 15 lines

Change Kernel#warn to call Warning.warn

This allows Warning.warn to filter/process warning messages
generated by Kernel#warn.  Currently, Warning.warn can only handle
messages generated by the rb_warn/rb_warning C functions.

The Kernel#warn API is different than the Warning.warn API, this
tries to get similar behavior, but there are probably corner cases
where the behavior is different.

This makes str_end_with_asciichar in io.c no longer static so it
can be called from error.c.

[Feature #12944]
Author:    Jeremy Evans <code@jeremyevans.net>
------------------------------------------------------------------------
r57369 | nobu | 2017-01-19 14:24:34 +0900 (Thu, 19 Jan 2017) | 1 line

id_table.c: fix typo
------------------------------------------------------------------------
r57368 | nobu | 2017-01-19 12:42:07 +0900 (Thu, 19 Jan 2017) | 4 lines

compile.c: check err_info

* compile.c (iseq_setup): bail out if any errors found.
  [ruby-core:76531] [Bug #12613]
------------------------------------------------------------------------
r57367 | nobu | 2017-01-19 10:38:59 +0900 (Thu, 19 Jan 2017) | 3 lines

parse.y: warn space

* parse.y (parser_yylex): warn parentheses after space.
------------------------------------------------------------------------
r57366 | svn | 2017-01-19 03:23:49 +0900 (Thu, 19 Jan 2017) | 1 line

* 2017-01-19
------------------------------------------------------------------------
r57365 | svn | 2017-01-19 03:23:49 +0900 (Thu, 19 Jan 2017) | 1 line

* properties.
------------------------------------------------------------------------
r57364 | normal | 2017-01-19 03:23:49 +0900 (Thu, 19 Jan 2017) | 4 lines

another benchmark for IO.copy_stream socket writing

For testing Linux socket-only workaround for
https://bugs.ruby-lang.org/issues/13085
------------------------------------------------------------------------
r57363 | kazu | 2017-01-18 21:35:10 +0900 (Wed, 18 Jan 2017) | 1 line

lib/profiler.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57362 | nobu | 2017-01-18 14:23:53 +0900 (Wed, 18 Jan 2017) | 4 lines

vm_method.c: resolve refined method to undef

* vm_method.c (rb_undef): resolve the method entry which refines a
  prepended method entry.  [ruby-core:78944] [Bug #13096]
------------------------------------------------------------------------
r57361 | svn | 2017-01-18 12:38:53 +0900 (Wed, 18 Jan 2017) | 1 line

* 2017-01-18
------------------------------------------------------------------------
r57360 | nobu | 2017-01-18 12:38:52 +0900 (Wed, 18 Jan 2017) | 4 lines

class.c: non-keyword hash class

* class.c (rb_extract_keywords): keep the class of non-keyword
  elements hash as the original.  [ruby-core:77813] [Bug #12884]
------------------------------------------------------------------------
r57359 | nobu | 2017-01-17 21:54:35 +0900 (Tue, 17 Jan 2017) | 4 lines

uri/generic.rb: fix exception on non-IP format

* lib/uri/generic.rb (URI::Generic#find_proxy): match IP address
  no_proxy against resolved self IP address.  [Fix GH-1513]
------------------------------------------------------------------------
r57358 | kazu | 2017-01-17 21:47:38 +0900 (Tue, 17 Jan 2017) | 1 line

lib/pstore.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57355 | normal | 2017-01-17 12:31:57 +0900 (Tue, 17 Jan 2017) | 4 lines

rinda/ring.rb (make_socket): do not keep socket on failures

This prevents leaked FD warnings on test/rinda/test_rinda.rb
when testing on a machine without multicast support.
------------------------------------------------------------------------
r57354 | normal | 2017-01-17 06:42:05 +0900 (Tue, 17 Jan 2017) | 4 lines

basicsocket (rsock_bsock_send): do not truncate return value

send(2) and sendto(2) syscalls return `ssize_t', use the
proper type and macro for converting to a Numeric VALUE.
------------------------------------------------------------------------
r57353 | svn | 2017-01-17 06:08:13 +0900 (Tue, 17 Jan 2017) | 1 line

* 2017-01-17
------------------------------------------------------------------------
r57352 | normal | 2017-01-17 06:08:12 +0900 (Tue, 17 Jan 2017) | 9 lines

doc: improve documentation for Binding [ci skip]

* remove explicit return from code examples
* grammar fixes
* other small fixes

Patch by: Marcus Stollsteimer <sto.mar@web.de>

[ruby-core:79082] [Bug #13132]
------------------------------------------------------------------------
r57339 | kazu | 2017-01-16 21:37:42 +0900 (Mon, 16 Jan 2017) | 1 line

Fix a typo [ci skip]
------------------------------------------------------------------------
r57338 | nobu | 2017-01-16 11:56:28 +0900 (Mon, 16 Jan 2017) | 4 lines

test_rational.rb: messages

* test/ruby/test_rational.rb (test_parse): add messages to
  assertions.
------------------------------------------------------------------------
r57337 | svn | 2017-01-16 11:43:56 +0900 (Mon, 16 Jan 2017) | 1 line

* 2017-01-16
------------------------------------------------------------------------
r57336 | nobu | 2017-01-16 11:43:55 +0900 (Mon, 16 Jan 2017) | 4 lines

file.c: refine message

* file.c (rb_get_path_check_convert): refine the error message
  when the path name contains null byte.
------------------------------------------------------------------------
r57335 | a_matsuda | 2017-01-15 22:45:12 +0900 (Sun, 15 Jan 2017) | 7 lines

s/SaveStringValue/SafeStringValue/

Fix a typo in extension.rdoc.

Signed-off-by: Akira Matsuda <ronnie@dio.jp>

closes #1512
------------------------------------------------------------------------
r57334 | nobu | 2017-01-15 15:08:09 +0900 (Sun, 15 Jan 2017) | 4 lines

.gdbinit: refine rp [ci skip]

* .gdbinit (rp, output_string, rp): show the contents after NUL
  char.
------------------------------------------------------------------------
r57333 | nobu | 2017-01-15 14:50:41 +0900 (Sun, 15 Jan 2017) | 5 lines

rbinstall.rb: mimic rubygems wrapper script

* tool/rbinstall.rb (app_script_text): move shell script part
  after comments generated by RubyGems. '#'-lines are comments in
  both of ruby and shell script.
------------------------------------------------------------------------
r57332 | kazu | 2017-01-15 11:56:04 +0900 (Sun, 15 Jan 2017) | 1 line

lib/profile.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57331 | nobu | 2017-01-15 09:45:10 +0900 (Sun, 15 Jan 2017) | 6 lines

rbinstall.rb: do nothing if bin script is same

* tool/rbinstall.rb (check_executable_overwrite): do nothing if
  the existing file equals to the wrapper script to be generated.

* tool/rbinstall.rb (generate_bin_script): ditto.
------------------------------------------------------------------------
r57330 | svn | 2017-01-15 08:09:56 +0900 (Sun, 15 Jan 2017) | 1 line

* 2017-01-15
------------------------------------------------------------------------
r57329 | normal | 2017-01-15 08:09:55 +0900 (Sun, 15 Jan 2017) | 28 lines

mention behavior of Array#join for nested arrays [ci skip]

The current documentation for Array#join does not mention the
special treatment of nested arrays.

It says:
> Returns a string created by converting each element of the
> array to a string, separated by the given separator.

Expected behavior according to the docs would be:

    [ "a", [1, 2, [:x, :y]], "b" ].join("-")  #=> "a-[1, 2, [:x, :y]]-b"
    # because of:
    [1, 2, [:x, :y]].to_s  #=> "[1, 2, [:x, :y]]"

Actual behavior:

    [ "a", [1, 2, [:x, :y]], "b" ].join("-")  #=> "a-1-2-x-y-b"

because join is applied recursively for nested arrays.

The patch clarifies this behavior.

(Also: small markup and grammar fix.)

Patch by Marcus Stollsteimer <sto.mar@web.de>

[ruby-talk:437238] [ruby-core:79079] [Bug #13130]
------------------------------------------------------------------------
r57328 | nobu | 2017-01-14 18:38:56 +0900 (Sat, 14 Jan 2017) | 5 lines

revert r57323

StringIO.new makes the buffer IO.default_external, while
StringIO.new("".dup) makes source encoding which is defaulted to
UTF-8.
------------------------------------------------------------------------
r57327 | nobu | 2017-01-14 15:13:23 +0900 (Sat, 14 Jan 2017) | 3 lines

fix up r57322

* tool/rbinstall.rb: ruby_install_name is used too.
------------------------------------------------------------------------
r57326 | nobu | 2017-01-14 11:26:49 +0900 (Sat, 14 Jan 2017) | 4 lines

resolv.rb: byte buffer

* lib/resolv.rb (Resolv::DNS::Message::MessageDecoder): treat the
  data as a byte buffer.
------------------------------------------------------------------------
r57325 | nobu | 2017-01-14 11:26:48 +0900 (Sat, 14 Jan 2017) | 8 lines

Made #decode_rdata client to catch errors

* lib/resolv.rb (Resolv::DNS::Message::MessageDecoder#get_rr):
  re-raise an exception from decode_rdata as DecodeError, so it
  can report them to the top in more informative way.  It was not
  reflecting on errors of data and thus breaking.  Client code
  expects `DecodeError` and knows how to handle broken messages.
  [Fix GH-1511]
------------------------------------------------------------------------
r57324 | svn | 2017-01-14 11:06:23 +0900 (Sat, 14 Jan 2017) | 1 line

* 2017-01-14
------------------------------------------------------------------------
r57323 | nobu | 2017-01-14 11:06:22 +0900 (Sat, 14 Jan 2017) | 1 line

StringIO.new makes a RW buffer
------------------------------------------------------------------------
r57322 | nobu | 2017-01-13 23:15:00 +0900 (Fri, 13 Jan 2017) | 1 line

fix prolog in gem wrapper scripts
------------------------------------------------------------------------
r57321 | kazu | 2017-01-13 21:08:29 +0900 (Fri, 13 Jan 2017) | 1 line

lib/observer.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57320 | nobu | 2017-01-13 14:58:44 +0900 (Fri, 13 Jan 2017) | 4 lines

rbinstall.rb: LIBRUBY_RELATIVE

* tool/rbinstall.rb: see LIBRUBY_RELATIVE in CONFIG instead of
  reading config.h.
------------------------------------------------------------------------
r57319 | nobu | 2017-01-13 14:49:43 +0900 (Fri, 13 Jan 2017) | 4 lines

insns.def: float comparison

* insns.def (opt_lt, opt_le, opt_gt, opt_ge): optimize flonum and
  on-heap float comparison.
------------------------------------------------------------------------
r57318 | nobu | 2017-01-13 12:24:22 +0900 (Fri, 13 Jan 2017) | 4 lines

error.c: moved

* error.c (preface_dump, postscript_dump): CrashReporter directory
  was used before Mac OS X 10.6.
------------------------------------------------------------------------
r57317 | nobu | 2017-01-13 11:57:45 +0900 (Fri, 13 Jan 2017) | 5 lines

error.c: moved

* error.c (preface_dump, postscript_dump): moved from
  rb_vm_bugreport to place the last important message at the very
  last after [NOTE].
------------------------------------------------------------------------
r57316 | svn | 2017-01-13 10:46:45 +0900 (Fri, 13 Jan 2017) | 1 line

* 2017-01-13
------------------------------------------------------------------------
r57315 | nobu | 2017-01-13 10:46:45 +0900 (Fri, 13 Jan 2017) | 4 lines

vm_dump.c: postscript_dump

* vm_dump.c (postscript_dump): mention crash report log twice
  because important.
------------------------------------------------------------------------
r57314 | kazu | 2017-01-12 21:17:33 +0900 (Thu, 12 Jan 2017) | 1 line

lib/net/smtp.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57313 | nobu | 2017-01-12 16:41:35 +0900 (Thu, 12 Jan 2017) | 11 lines

immediate message mode of compile error

* compile.c (append_compile_error): set Qtrue for erred state with
  showing the message immediately.

* iseq.c (prepare_iseq_build): make immediate message mode if main
  or top level context, not to show the failed path twice in the
  first line.

* iseq.c (cleanup_iseq_build): raise default message exception if
  immediate message mode.
------------------------------------------------------------------------
r57312 | nobu | 2017-01-12 14:43:00 +0900 (Thu, 12 Jan 2017) | 4 lines

compile.c: invalid yield in main

* compile.c (iseq_compile_each): yield cannot be in the main
  context as well as a top context.
------------------------------------------------------------------------
r57311 | shugo | 2017-01-12 11:19:17 +0900 (Thu, 12 Jan 2017) | 5 lines

lib/net/protocol.rb: preserve backtrace information

BufferedIO#rbuf_fill should preserve backtrace information when raising
EOFError.  Otherwise, users get confused when EOFError is leaked out from
Net::SMTP etc.  [ruby-core:78550] [Bug #13018]
------------------------------------------------------------------------
r57310 | normal | 2017-01-12 08:53:05 +0900 (Thu, 12 Jan 2017) | 5 lines

test/rinda/test_rinda: skip multicast tests for unsupported systems

This allows "test-all" to pass on systems without multicast
support.  I leave CONFIG_IP_MULTICAST unset in my Linux kernel
.config, nowadays.
------------------------------------------------------------------------
r57309 | normal | 2017-01-12 08:46:05 +0900 (Thu, 12 Jan 2017) | 10 lines

test/fiddle/helper: remove special case for x86_64-linux

RUBY_PLATFORM is "x86_64-linux" on a 32-bit (x86) Ruby built and
running on a 64-bit Linux kernel.  I also have a /lib64
directory nowadays because I just installed multi-arch support
in userspace.  So, fall back to loading based in the size of a
packed "unsigned long" type instead of special-casing.

Tested with both x86 and x86_64 userspace on 64-bit Linux kernel,
as well as x86 with a 32-bit Linux kernel.
------------------------------------------------------------------------
r57308 | svn | 2017-01-12 07:38:51 +0900 (Thu, 12 Jan 2017) | 1 line

* 2017-01-12
------------------------------------------------------------------------
r57307 | normal | 2017-01-12 07:38:50 +0900 (Thu, 12 Jan 2017) | 10 lines

random.c (fill_random_bytes_syscall): use "__NR_" prefix on Linux

glibc still does not define the SYS_getrandom alias for
__NR_getrandom in the Linux kernel.  However, installing
up-to-date Linux kernel headers (linux-libc-dev >= 3.17 package
on Debian) will get the __NR_getrandom syscall number defined
properly without relying on glibc.

This allows users with a modern kernel+headers to use the getrandom
syscall without waiting on glibc support.
------------------------------------------------------------------------
r57306 | kazu | 2017-01-11 23:48:51 +0900 (Wed, 11 Jan 2017) | 1 line

lib/net/protocol.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57305 | nobu | 2017-01-11 13:12:56 +0900 (Wed, 11 Jan 2017) | 5 lines

variable.c: fix the condition to cache

* variable.c (rb_const_set): fix the condition to cache the class
  path and cache permanent or temporary path corresponding to the
  outer klass.  [ruby-core:79039] [Bug #13120]
------------------------------------------------------------------------
r57304 | nobu | 2017-01-11 11:31:02 +0900 (Wed, 11 Jan 2017) | 4 lines

string.c: replacement and block

* string.c (rb_enc_str_scrub): only one of replacement and block
  is allowed.  [ruby-core:79038] [Bug #13119]
------------------------------------------------------------------------
r57303 | nobu | 2017-01-11 11:18:45 +0900 (Wed, 11 Jan 2017) | 4 lines

string.c: yield invalid part

* string.c (rb_enc_str_scrub): yield the invalid part only with
  ASCII-incompatible.  [ruby-core:79039] [Bug #13120]
------------------------------------------------------------------------
r57302 | nobu | 2017-01-11 10:03:37 +0900 (Wed, 11 Jan 2017) | 4 lines

string.c: block for scrub with ASCII-incompatible

* string.c (rb_enc_str_scrub): honor the given block with
  ASCII-incompatible encoding.  [ruby-core:79039] [Bug #13120]
------------------------------------------------------------------------
r57301 | svn | 2017-01-11 00:28:12 +0900 (Wed, 11 Jan 2017) | 1 line

* 2017-01-11
------------------------------------------------------------------------
r57300 | nobu | 2017-01-11 00:28:11 +0900 (Wed, 11 Jan 2017) | 4 lines

compile.c: check compile

* compile.c (iseq_compile_each): check if sub nodes succeeded.
  [ruby-core:76531] [Bug #12613]
------------------------------------------------------------------------
r57299 | nobu | 2017-01-10 22:41:18 +0900 (Tue, 10 Jan 2017) | 4 lines

rational.c: short circuit optimization

* rational.c (nurat_reduce): short circuit when arguments are ONE,
  nothing is needed.
------------------------------------------------------------------------
r57298 | nobu | 2017-01-10 22:37:34 +0900 (Tue, 10 Jan 2017) | 3 lines

rational.c: f_idiv

* rational.c (f_idiv): call rb_int_idiv directly if possible.
------------------------------------------------------------------------
r57297 | kazu | 2017-01-10 21:32:56 +0900 (Tue, 10 Jan 2017) | 1 line

lib/net/pop.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57296 | nobu | 2017-01-10 21:18:21 +0900 (Tue, 10 Jan 2017) | 4 lines

numeric.c: short circuit optimization

* numeric.c (fix_mul): short circuit when multiplication of Bignum
  and 0 or 1 not to make a Bignum unnecessarily.
------------------------------------------------------------------------
r57295 | svn | 2017-01-10 19:57:26 +0900 (Tue, 10 Jan 2017) | 1 line

* 2017-01-10
------------------------------------------------------------------------
r57294 | nobu | 2017-01-10 19:57:26 +0900 (Tue, 10 Jan 2017) | 4 lines

thread.c: fix todo

* thread.c (rb_threadptr_pending_interrupt_check_mask): traverse
  the super class chain instead of making ancestors array.
------------------------------------------------------------------------
r57293 | nobu | 2017-01-09 11:55:39 +0900 (Mon, 09 Jan 2017) | 5 lines

vm_insnhelper.c: block argument at tailcall

* vm_insnhelper.c (vm_call_iseq_setup_tailcall): check interrupts
  after set up the new frame, not the passed block to be clobbered
  by invoked finalizers and so on.  [ruby-core:78981] [Bug #13107]
------------------------------------------------------------------------
r57292 | svn | 2017-01-09 11:45:29 +0900 (Mon, 09 Jan 2017) | 1 line

* 2017-01-09
------------------------------------------------------------------------
r57291 | nobu | 2017-01-09 11:45:28 +0900 (Mon, 09 Jan 2017) | 4 lines

slex.rb: japanese comment [ci skip]

* lib/irb/slex.rb (postproc): translated a japanese comment in
  ISO-2022-JP.  [ruby-core:79017] [Misc #13117]
------------------------------------------------------------------------
r57290 | kazu | 2017-01-08 13:17:08 +0900 (Sun, 08 Jan 2017) | 1 line

lib/getoptlong.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57289 | nobu | 2017-01-08 13:04:29 +0900 (Sun, 08 Jan 2017) | 4 lines

test_io_console.rb: fix of old CentOS5

* test/io/console/test_io_console.rb (test_winsize): on old CentOS5
  window size seems unable to be set across a pty.
------------------------------------------------------------------------
r57288 | nobu | 2017-01-08 12:51:35 +0900 (Sun, 08 Jan 2017) | 4 lines

driver.rb: measure_target option [ci skip]

* benchmark/driver.rb (BenchmarkDriver.load): restore
  measure_target option from the loaded results.
------------------------------------------------------------------------
r57287 | nobu | 2017-01-08 12:50:32 +0900 (Sun, 08 Jan 2017) | 4 lines

driver.rb: out output file when loading [ci skip]

* benchmark/driver.rb: default output file is not used when
  loading rawdata.
------------------------------------------------------------------------
r57286 | nobu | 2017-01-08 12:46:17 +0900 (Sun, 08 Jan 2017) | 4 lines

driver.rb: extract loop times [ci skip]

* benchmark/driver.rb (BenchmarkDriver.load): extract loop times
  from the loaded results to adjust the results.
------------------------------------------------------------------------
r57285 | nobu | 2017-01-08 12:45:34 +0900 (Sun, 08 Jan 2017) | 4 lines

driver.rb: adjust name width [ci skip]

* benchmark/driver.rb (show_results): count adjusted result marks
  as the name width.
------------------------------------------------------------------------
r57284 | nobu | 2017-01-08 10:59:54 +0900 (Sun, 08 Jan 2017) | 5 lines

variable.c: resolve permanent name only

* variable.c (rb_const_set): resolve and cache class name
  immediately only if the outer class/module has the name,
  otherwise just set the ID.  [ruby-core:79007] [Bug #13113]
------------------------------------------------------------------------
r57283 | nobu | 2017-01-08 10:46:10 +0900 (Sun, 08 Jan 2017) | 1 line

benchmarks for [Bug #13113] [ci skip]
------------------------------------------------------------------------
r57282 | nobu | 2017-01-08 08:02:29 +0900 (Sun, 08 Jan 2017) | 4 lines

console.c: unpaired size

* ext/io/console/console.c (console_set_winsize): reject unpaired
  pixel size.
------------------------------------------------------------------------
r57281 | svn | 2017-01-08 07:52:03 +0900 (Sun, 08 Jan 2017) | 1 line

* 2017-01-08
------------------------------------------------------------------------
r57280 | nobu | 2017-01-08 07:52:03 +0900 (Sun, 08 Jan 2017) | 4 lines

console.c: OOB access

* ext/io/console/console.c (console_set_winsize): fix
  out-of-bounds access.  [ruby-core:79004] [Bug #13112]
------------------------------------------------------------------------
r57279 | nobu | 2017-01-07 20:54:10 +0900 (Sat, 07 Jan 2017) | 1 line

adjust indent [ci skip]
------------------------------------------------------------------------
r57278 | eregon | 2017-01-07 20:31:53 +0900 (Sat, 07 Jan 2017) | 8 lines

fix optimization for hash aset/aref with fstring

Patch by Eric Wong [ruby-core:78797].
I don't like the idea of making insns.def any bigger to support
a corner case, and "test_hash_aref_fstring_identity" shows
how contrived this is.

[ruby-core:78783] [Bug #12855]
------------------------------------------------------------------------
r57277 | nobu | 2017-01-07 17:31:03 +0900 (Sat, 07 Jan 2017) | 4 lines

bignum.c: unnecessary check

* bignum.c (rb_cstr_parse_inum): remove unnecessary check.
  successive sign is rejected by conv_digit.
------------------------------------------------------------------------
r57276 | svn | 2017-01-07 11:14:08 +0900 (Sat, 07 Jan 2017) | 1 line

* 2017-01-07
------------------------------------------------------------------------
r57275 | kazu | 2017-01-07 11:14:07 +0900 (Sat, 07 Jan 2017) | 1 line

lib/fileutils.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57274 | nobu | 2017-01-06 12:11:45 +0900 (Fri, 06 Jan 2017) | 4 lines

prelude.rb: Binding#irb [ci skip]

* prelude.rb (Binding#irb): [EXPERIMENTAL] automatically require
  irb and run.  [ruby-core:78960] [Bug #13099]
------------------------------------------------------------------------
r57273 | nobu | 2017-01-06 12:02:38 +0900 (Fri, 06 Jan 2017) | 4 lines

test_io.rb: squiggly heredoc

* test/ruby/test_io.rb (test_threaded_flush): use squiggly here
  document to strip leading spaces.
------------------------------------------------------------------------
r57272 | svn | 2017-01-06 11:05:36 +0900 (Fri, 06 Jan 2017) | 1 line

* 2017-01-06
------------------------------------------------------------------------
r57271 | kazu | 2017-01-06 11:05:35 +0900 (Fri, 06 Jan 2017) | 1 line

lib/delegate.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57270 | nobu | 2017-01-05 16:27:19 +0900 (Thu, 05 Jan 2017) | 3 lines

numeric.c: short circuit

* numeric.c (int_pow): short circuit when y is 0, always return 1.
------------------------------------------------------------------------
r57269 | nobu | 2017-01-05 16:27:18 +0900 (Thu, 05 Jan 2017) | 4 lines

bignum.c: fix rb_cstr_parse_inum endp

* bignum.c (rb_cstr_parse_inum): stores the address of the first
  invalid character when str is too big or contains an underscore.
------------------------------------------------------------------------
r57268 | svn | 2017-01-05 10:00:02 +0900 (Thu, 05 Jan 2017) | 1 line

* 2017-01-05
------------------------------------------------------------------------
r57267 | kazu | 2017-01-05 10:00:01 +0900 (Thu, 05 Jan 2017) | 1 line

lib/debug.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57266 | nobu | 2017-01-04 20:06:16 +0900 (Wed, 04 Jan 2017) | 4 lines

win32/registry.rb: registry type names

* ext/win32/lib/win32/registry.rb (Win32::Registry#read): show
  registry type names instead of numeric values.
------------------------------------------------------------------------
r57265 | nobu | 2017-01-04 17:21:14 +0900 (Wed, 04 Jan 2017) | 7 lines

win32/resolv.rb: ad hoc workaround

* ext/win32/lib/win32/resolv.rb (Win32::Resolv::SZ): an ad hoc
  workaround for broken registry.  SearchList and other registry
  values must be REG_SZ, or Windows ignores anything in those
  values otherwise.  [ruby-dev:49924] [Bug #13081]
  https://github.com/rubygems/rubygems/issues/1700
------------------------------------------------------------------------
r57264 | kazu | 2017-01-04 14:47:52 +0900 (Wed, 04 Jan 2017) | 1 line

lib/cmath.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57262 | nobu | 2017-01-04 09:30:45 +0900 (Wed, 04 Jan 2017) | 1 line

adjust indent [ci skip]
------------------------------------------------------------------------
r57261 | svn | 2017-01-04 07:42:11 +0900 (Wed, 04 Jan 2017) | 1 line

* 2017-01-04
------------------------------------------------------------------------
r57260 | tenderlove | 2017-01-04 07:42:10 +0900 (Wed, 04 Jan 2017) | 16 lines

Add `full` option to `ObjectSpace.dump_all`

The `full` option includes all slots (even `T_NONE`) in the JSON output.
This is to help with debugging heap fragmentation.

Here is an example usage:

```ruby
File.open('heap.json', 'w') do |f|
  ObjectSpace.dump_all(output: f, full: true)
end
```

The `heap.json` file contains all slots, including empty slots.

[Feature #13001] [ruby-core:78468]
------------------------------------------------------------------------
r57259 | nobu | 2017-01-03 19:49:12 +0900 (Tue, 03 Jan 2017) | 4 lines

compile.c: fallback nil

* compile.c (iseq_compile_each): push fallback nil only when
  defined guard is added.
------------------------------------------------------------------------
r57258 | nobu | 2017-01-03 18:48:43 +0900 (Tue, 03 Jan 2017) | 4 lines

compile.c: omit unnecessary defined guard

* compile.c (defined_expr): omit unnecessary defined guard when
  method call has no receiver and no arguments.
------------------------------------------------------------------------
r57257 | nobu | 2017-01-03 18:47:16 +0900 (Tue, 03 Jan 2017) | 4 lines

forwardable.rb: fix branches

* lib/forwardable.rb (instance_delegate, single_delegate): fix
  inverted branches.
------------------------------------------------------------------------
r57256 | nobu | 2017-01-03 18:35:26 +0900 (Tue, 03 Jan 2017) | 5 lines

forwardable.rb: use defined?

* lib/forwardable.rb (_delegator_method): use defined? operator
  instead of binding and calling unbound Kernel#respond_to?.  a
  remedy for an performance bottleneck.
------------------------------------------------------------------------
r57255 | nobu | 2017-01-03 17:40:51 +0900 (Tue, 03 Jan 2017) | 5 lines

forwardable.rb: use defined?

* lib/forwardable.rb (_delegator_method): use defined? operator
  instead of binding and calling unbound Kernel#respond_to?.  a
  remedy for an performance bottleneck.
------------------------------------------------------------------------
r57254 | svn | 2017-01-03 11:00:02 +0900 (Tue, 03 Jan 2017) | 1 line

* 2017-01-03
------------------------------------------------------------------------
r57253 | kazu | 2017-01-03 11:00:01 +0900 (Tue, 03 Jan 2017) | 1 line

lib/benchmark.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57252 | kazu | 2017-01-02 21:20:09 +0900 (Mon, 02 Jan 2017) | 1 line

lib/English.rb: Specify frozen_string_literal: true.
------------------------------------------------------------------------
r57251 | duerst | 2017-01-02 10:40:12 +0900 (Mon, 02 Jan 2017) | 1 line

adjust spacing [ci skip]
------------------------------------------------------------------------
r57250 | nobu | 2017-01-02 09:22:46 +0900 (Mon, 02 Jan 2017) | 5 lines

object.c: rb_class_alloc

* object.c (rb_obj_alloc): add pathological check of klass for
  extension libraries which do not check given arguments properly.
  [ruby-core:78934] [Bug #13093]
------------------------------------------------------------------------
r57249 | nobu | 2017-01-02 09:03:28 +0900 (Mon, 02 Jan 2017) | 5 lines

object.c: rb_class_s_new

* object.c (rb_class_new_instance): add pathological check of
  klass for extension libraries which do not check given arguments
  properly.  [ruby-core:78934] [Bug #13093]
------------------------------------------------------------------------
r57248 | nobu | 2017-01-02 07:20:38 +0900 (Mon, 02 Jan 2017) | 4 lines

 dir.c: getattrlist on OSX 10.5

* dir.c (is_case_sensitive): use getattrlist() if fgetattrlist()
  is unavailable, on OSX 10.5.  [ruby-core:68829] [Bug #11054]
------------------------------------------------------------------------
r57247 | svn | 2017-01-02 01:42:44 +0900 (Mon, 02 Jan 2017) | 1 line

* 2017-01-02
------------------------------------------------------------------------
r57246 | naruse | 2017-01-02 01:42:43 +0900 (Mon, 02 Jan 2017) | 1 line

fix typo [Bug #13091]
------------------------------------------------------------------------
r57245 | nobu | 2017-01-01 18:17:10 +0900 (Sun, 01 Jan 2017) | 1 line

test for [Feature #11547]
------------------------------------------------------------------------
r57244 | nobu | 2017-01-01 18:07:56 +0900 (Sun, 01 Jan 2017) | 4 lines

variable.c: top-level constant look-up

* variable.c (rb_const_search): [EXPERIMENTAL] remove top-level
  constant look-up.  [Feature #11547]
------------------------------------------------------------------------
r57243 | nobu | 2017-01-01 17:22:02 +0900 (Sun, 01 Jan 2017) | 1 line

passed block should keep the lambda-ness
------------------------------------------------------------------------
r57242 | svn | 2017-01-01 07:44:32 +0900 (Sun, 01 Jan 2017) | 1 line

* 2017-01-01
------------------------------------------------------------------------
r57241 | hsbt | 2017-01-01 07:44:31 +0900 (Sun, 01 Jan 2017) | 1 line

Update submaintainer of default gems.
------------------------------------------------------------------------
r57240 | nobu | 2016-12-31 17:07:58 +0900 (Sat, 31 Dec 2016) | 6 lines

vm.c: fix return in lambda

* vm.c (invoke_block_from_c_splattable): pass lambda-ness.

* vm_eval.c (yield_under): invoke lambda proc properly.
  [ruby-core:78917] [Bug #13090]
------------------------------------------------------------------------
r57239 | svn | 2016-12-31 09:41:15 +0900 (Sat, 31 Dec 2016) | 1 line

* 2016-12-31
------------------------------------------------------------------------
r57238 | svn | 2016-12-31 09:41:15 +0900 (Sat, 31 Dec 2016) | 1 line

* properties.
------------------------------------------------------------------------
r57237 | normal | 2016-12-31 09:41:14 +0900 (Sat, 31 Dec 2016) | 4 lines

add benchmark for IO.copy_stream IO#write case

I will attempt to reduce garbage in proposed fix
for https://bugs.ruby-lang.org/issues/13085
------------------------------------------------------------------------
r57236 | nobu | 2016-12-30 17:01:34 +0900 (Fri, 30 Dec 2016) | 5 lines

rational.c: memory leak in gcd

* rational.c (rb_gcd_gmp): fix memory leak.  patched by KISHIMOTO,
  Makoto <ksmakoto AT dd.iij4u.or.jp> in [ruby-dev:49934].
  [Bug #13089]
------------------------------------------------------------------------
r57235 | svn | 2016-12-30 01:16:33 +0900 (Fri, 30 Dec 2016) | 1 line

* 2016-12-30
------------------------------------------------------------------------
r57234 | rhe | 2016-12-30 01:16:32 +0900 (Fri, 30 Dec 2016) | 9 lines

test/ruby/test_pack.rb: fix test case added by r57187

The test case for String#unpack added by r57187 is not properly testing
because the String will be filled after the block invocation.
[ruby-core:78841] [Bug #13075]

Thanks to nagachika for pointing this out:

  http://d.hatena.ne.jp/nagachika/20161226/ruby_trunk_changes_57184_57194#r57187
------------------------------------------------------------------------
r57233 | nobu | 2016-12-29 19:32:48 +0900 (Thu, 29 Dec 2016) | 4 lines

rational.c: refactor to_r

* rational.c (read_num, read_rat_nos): refactor to curtail
  creating Rational objects.
------------------------------------------------------------------------
r57232 | nobu | 2016-12-29 18:26:45 +0900 (Thu, 29 Dec 2016) | 4 lines

rational.c: fix for mathn

* rational.c (read_num, read_rat_nos): dispatch by the type of numerator, for
  mathn.  [ruby-core:78893] [Bug #13084]
------------------------------------------------------------------------
r57231 | svn | 2016-12-29 18:06:00 +0900 (Thu, 29 Dec 2016) | 1 line

* 2016-12-29
------------------------------------------------------------------------
r57230 | nobu | 2016-12-29 18:05:59 +0900 (Thu, 29 Dec 2016) | 4 lines

rational.c: canonicalization

* rational.c (canonicalization): define always regardless CANON,
  and remove unnecessary ifdefs.
------------------------------------------------------------------------
r57228 | svn | 2016-12-28 13:40:59 +0900 (Wed, 28 Dec 2016) | 1 line

* 2016-12-28
------------------------------------------------------------------------
r57227 | nobu | 2016-12-28 13:40:58 +0900 (Wed, 28 Dec 2016) | 4 lines

numeric.c: reduce fdiv

* numeric.c (rb_int_fdiv_double): reduce first for more precise
  result.  [ruby-core:78886] [Bug #13078]
------------------------------------------------------------------------
r57224 | nobu | 2016-12-27 20:43:34 +0900 (Tue, 27 Dec 2016) | 5 lines

io.c: fix race between read and close

* io.c (io_fillbuf): fix race between read and close and bail out
  in the case the IO gets closed before the reading thread achieve
  the lock.  [ruby-core:78845] [Bug #13076]
------------------------------------------------------------------------
r57206 | usa | 2016-12-27 18:07:02 +0900 (Tue, 27 Dec 2016) | 5 lines

revert a part of r57199

* io.c (io_fillbuf): revert a part of r57199 because it broke IO#getch.
  see also [Bug #13076]

------------------------------------------------------------------------
r57205 | normal | 2016-12-27 17:52:32 +0900 (Tue, 27 Dec 2016) | 4 lines

cont.c: change fiber stack size doc [ci skip]

It's many years since we had tiny 4KB fiber stacks :<
point to the manpage instead for current, larger sizes.
------------------------------------------------------------------------
r57204 | nobu | 2016-12-27 16:39:29 +0900 (Tue, 27 Dec 2016) | 1 line

io.c: use io_close to close ARGF
------------------------------------------------------------------------
r57203 | nobu | 2016-12-27 16:18:27 +0900 (Tue, 27 Dec 2016) | 4 lines

io.c: ARGF fd leak

* io.c (argf_next_argv): fix leak of fd after breaking in #each
  method.
------------------------------------------------------------------------
r57202 | nobu | 2016-12-27 16:10:11 +0900 (Tue, 27 Dec 2016) | 5 lines

thread.c: fix race between read and close

* thread.c (rb_thread_fd_close): wait until all threads using the
  fd finish the operation, not to free the buffer in use.
  [ruby-core:78845] [Bug #13076]
------------------------------------------------------------------------
r57201 | svn | 2016-12-27 10:40:40 +0900 (Tue, 27 Dec 2016) | 1 line

* 2016-12-27
------------------------------------------------------------------------
r57200 | hsbt | 2016-12-27 10:40:39 +0900 (Tue, 27 Dec 2016) | 1 line

Ignored extracted gem files.
------------------------------------------------------------------------
r57199 | nobu | 2016-12-26 23:14:18 +0900 (Mon, 26 Dec 2016) | 5 lines

io.c: fix race between read and close

* io.c (io_fillbuf): fix race between read and close, in the case
  the IO gets closed before the reading thread achieve the lock.
  [ruby-core:78845] [Bug #13076]
------------------------------------------------------------------------
r57198 | nobu | 2016-12-26 22:31:03 +0900 (Mon, 26 Dec 2016) | 4 lines

parse.y: preserve cmdarg stack

* parse.y (do_body): preserve cmdarg stack around do/end block.
  [ruby-core:78837] [Bug #13073]
------------------------------------------------------------------------
r57197 | svn | 2016-12-26 21:00:03 +0900 (Mon, 26 Dec 2016) | 1 line

* properties.
------------------------------------------------------------------------
r57196 | kazu | 2016-12-26 21:00:02 +0900 (Mon, 26 Dec 2016) | 1 line

Add NEWS for Ruby 2.5.0
------------------------------------------------------------------------
r57195 | kazu | 2016-12-26 21:00:01 +0900 (Mon, 26 Dec 2016) | 1 line

Move from NEWS to doc/NEWS-2.4.0
------------------------------------------------------------------------
r57194 | nobu | 2016-12-26 19:00:36 +0900 (Mon, 26 Dec 2016) | 4 lines

vm_eval.c: Symbol#to_proc and instance_exec

* vm_eval.c (yield_under): should evaluate the proc on the first
  argument.  [ruby-core:78839] [Bug #13074]
------------------------------------------------------------------------
r57193 | nobu | 2016-12-26 19:00:34 +0900 (Mon, 26 Dec 2016) | 1 line

test/ruby/test_symbol.rb: use begin;end; hack
------------------------------------------------------------------------
r57192 | nobu | 2016-12-26 18:32:07 +0900 (Mon, 26 Dec 2016) | 1 line

[Bug #12705]
------------------------------------------------------------------------
r57191 | nobu | 2016-12-26 18:28:48 +0900 (Mon, 26 Dec 2016) | 3 lines

get rid of sprintf

* missing/strerror.c (strerror): use snprintf instead of sprintf.
------------------------------------------------------------------------
r57190 | nobu | 2016-12-26 18:28:47 +0900 (Mon, 26 Dec 2016) | 4 lines

get rid of strcat

* regerror.c (onig_vsnprintf_with_pattern): use memcpy with the
  known length instead of strcat.
------------------------------------------------------------------------
r57189 | nobu | 2016-12-26 18:28:46 +0900 (Mon, 26 Dec 2016) | 10 lines

get rid of strcpy

* addr2line.c (follow_debuglink): insert global_debug_dir by using
  memmove instead of copying to temporary buffer.

* dln.c (dln_load): use memcpy with the known length instead of
  strcpy.

* gc.c (rb_gc_unprotect_logging): use strdup instead of malloc and
  strcpy.
------------------------------------------------------------------------
r57188 | nobu | 2016-12-26 17:01:37 +0900 (Mon, 26 Dec 2016) | 5 lines

Makefile.sub: refine configuration check

* win32/Makefile.sub (config.status): check configured target by
  reading from config.status, and remove version dependent values
  from config.h.
------------------------------------------------------------------------
r57187 | rhe | 2016-12-26 15:32:00 +0900 (Mon, 26 Dec 2016) | 7 lines

pack.c: avoid returning uninitialized String

Fix unpacking with 'b', 'B', 'h' and 'H' format. Do not return an
uninitialized String to Ruby before filling the content bytes.
Fixes r11175 ("pack.c (pack_unpack): execute block if given with
unpacked value instead of creating an array", 2006-10-15).
[ruby-core:78841] [Bug #13075]
------------------------------------------------------------------------
r57186 | nobu | 2016-12-26 14:07:54 +0900 (Mon, 26 Dec 2016) | 4 lines

Makefile.sub: fix dependency of RUBYDEF

* win32/Makefile.sub (RUBYDEF): fix dependency, win32/mkexports.rb
  requires rbconfig.rb.
------------------------------------------------------------------------
r57185 | nobu | 2016-12-26 08:56:55 +0900 (Mon, 26 Dec 2016) | 4 lines

string.c: CRLF in paragraph mode

* string.c (rb_str_enumerate_lines): allow CRLF to separate
  paragraphs.
------------------------------------------------------------------------
r57184 | nobu | 2016-12-26 08:50:09 +0900 (Mon, 26 Dec 2016) | 5 lines

string.c: consistent paragraph mode with IO

* string.c (rb_str_enumerate_lines): in paragraph mode, do not
  include newlines which separate paragraphs, so that it will be
  consistent with IO#each_line.
------------------------------------------------------------------------
r57183 | matz | 2016-12-26 01:53:00 +0900 (Mon, 26 Dec 2016) | 2 lines

include/ruby/version.h: Update API version.

------------------------------------------------------------------------
r57182 | svn | 2016-12-26 01:35:52 +0900 (Mon, 26 Dec 2016) | 1 line

* 2016-12-26
------------------------------------------------------------------------
r57181 | matz | 2016-12-26 01:35:51 +0900 (Mon, 26 Dec 2016) | 2 lines

version.h (RUBY_VERSION): 2.5.0 development has started.

------------------------------------------------------------------------
doc/alt-ruby25/README.ja.md000064400000017044151731613040011076 0ustar00# Rubyとは

Rubyはシンプルかつ強力なオブジェクト指向スクリプト言語です. Rubyは純粋なオブジェクト指向言語として設計されているので,
オブジェクト指向プログラミングを手軽に行う事が出来ます.もちろん普通の手続き型のプログラミングも可能です.

Rubyはテキスト処理関係の能力などに優れ,Perlと同じくらい強力です.さらにシンプルな文法と,
例外処理やイテレータなどの機構によって,より分かりやすいプログラミングが出来ます.

## Rubyの特長

*   シンプルな文法
*   普通のオブジェクト指向機能(クラス,メソッドコールなど)
*   特殊なオブジェクト指向機能(Mixin, 特異メソッドなど)
*   演算子オーバーロード
*   例外処理機能
*   イテレータとクロージャ
*   ガーベージコレクタ
*   ダイナミックローディング (アーキテクチャによる)
*   移植性が高い.多くのUnix-like/POSIX互換プラットフォーム上で動くだけでなく,Windows, Mac OS
    X,Haikuなどの上でも動く cf.
    https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatformsJa


## 入手法

### FTPで

以下の場所においてあります.

ftp://ftp.ruby-lang.org/pub/ruby/

### Subversionで

開発先端のソースコードは次のコマンドで取得できます.

    $ svn co https://svn.ruby-lang.org/repos/ruby/trunk/ ruby

他に開発中のブランチの一覧は次のコマンドで見られます.

    $ svn ls https://svn.ruby-lang.org/repos/ruby/branches/

### Gitで

SubversionのミラーをGitHubに公開しています. 以下のコマンドでリポジトリを取得できます.

    $ git clone git://github.com/ruby/ruby.git

## ホームページ

RubyのホームページのURLは

https://www.ruby-lang.org/

です.

## メーリングリスト

Rubyのメーリングリストがあります.参加希望の方は

mailto:ruby-list-request@ruby-lang.org

まで本文に

    subscribe

と書いて送って下さい.

Ruby開発者向けメーリングリストもあります.こちらではrubyのバグ,将来の仕様拡張など実装上の問題について議論されています. 参加希望の方は

mailto:ruby-dev-request@ruby-lang.org

までruby-listと同様の方法でメールしてください.

Ruby拡張モジュールについて話し合うruby-extメーリングリストと数学関係の話題について話し合うruby-mathメーリングリストと
英語でrubyについて話し合うruby-talkメーリングリストもあります.参加方法はどれも同じです.

## コンパイル・インストール

以下の手順で行ってください.

1.  もし `configure` ファイルが見つからない,もしくは `configure.ac` より古いようなら, `autoconf` を実行して
    新しく `configure` を生成する

2.  `configure` を実行して `Makefile` などを生成する

    環境によってはデフォルトのCコンパイラ用オプションが付きます. `configure` オプションで `optflags=..`
    `warnflags=..` 等で上書きできます.

3.  (必要ならば)`defines.h` を編集する

    多分,必要無いと思います.

4.  (必要ならば)`ext/Setup` に静的にリンクする拡張モジュールを指定する

    `ext/Setup` に記述したモジュールは静的にリンクされます.

    ダイナミックローディングをサポートしていないアーキテクチャでは `Setup` の1行目の「`option nodynamic`」という行のコ
    メントを外す必要があります.また,このアーキテクチャで拡張モジュールを利用するためには,あらかじめ静的にリンクをしておく必要があります.

5.  `make` を実行してコンパイルする

6.  `make check`でテストを行う.

    「`check succeeded`」と表示されれば成功です.ただしテストに成功しても完璧だと保証されている訳ではありません.

7.  `make install`

    以下のディレクトリを作って,そこにファイルをインストー ルします.

    *   `${DESTDIR}${prefix}/bin`
    *   `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib`
    *   `${DESTDIR}${prefix}/lib/ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/share/man/man1`
    *   `${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system`


    RubyのAPIバージョンが'*x.y.z*'であれば,`${MAJOR}`は
    '*x*'で,`${MINOR}`は'*y*',`${TEENY}`は'*z*'です.

    **注意**: APIバージョンの `teeny` は,Rubyプログラムのバージョンとは異なることがあります.

    `root` で作業する必要があるかもしれません.


もし,コンパイル時にエラーが発生した場合にはエラーのログとマシン,OSの種類を含むできるだけ詳しいレポートを作者に送って下さると他の方のためにもなります.

## 移植

UNIXであれば `configure` がほとんどの差異を吸収してくれるはずですが,思わぬ見落としがあった場合(ある事が多い),作者にその
ことを報告すれば,解決できる可能性があります.

アーキテクチャにもっとも依存するのはGC部です.RubyのGCは対象
のアーキテクチャが`setjmp()`または`getcontext()`によって全てのレジスタを `jmp_buf` や `ucontext_t`
に格納することと, `jmp_buf` や `ucontext_t` とスタックが32bitアラインメントされていることを仮定
しています.特に前者が成立しない場合の対応は非常に困難でしょう. 後者の解決は比較的簡単で, `gc.c` でスタックをマークしている
部分にアラインメントのバイト数だけずらしてマークするコードを追加するだけで済みます.`defined(__mc68000__)`で括られてい
る部分を参考にしてください.

レジスタウィンドウを持つCPUでは,レジスタウィンドウをスタックにフラッシュするアセンブラコードを追加する必要があるかもしれません.

## 配布条件

[COPYING.ja](COPYING.ja) ファイルを参照してください.

## フィードバック

Rubyに関する質問は Ruby-Talk(英語)や Ruby-List(日本語) (https://www.ruby-lang.org/ja/community/mailing-lists) や,
stackoverflow (https://ja.stackoverflow.com/) などのWebサイトに投稿してください.

バグ報告は https://bugs.ruby-lang.org で受け付けています.


## 著者

Rubyのオリジナル版は,1995年にまつもとゆきひろ氏によって設計・開発されました.

<mailto:matz@ruby-lang.org>

---
created at: Thu Aug  3 11:57:36 JST 1995
doc/alt-ruby25/NEWS000064400000041115151731613050007722 0ustar00# -*- rdoc -*-

= NEWS for Ruby 2.5.0

This document is a list of user visible feature changes made between
releases except for bug fixes.

Note that each entry is kept so brief that no reason behind or
reference information is supplied with.  For a full list of changes
with all sufficient information, see the ChangeLog file or Redmine
(e.g. <tt>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</tt>)

== Changes since the 2.4.0 release

=== Language changes

* Top-level constant look-up is removed.  [Feature #11547]

* rescue/else/ensure are allowed inside do/end blocks.  [Feature #12906]

* refinements take place in string interpolations.  [Feature #13812]

=== Core classes updates (outstanding ones only)

* Array

  * New methods:

    * Array#append  [Feature #12746]
    * Array#prepend  [Feature #12746]

* Data

  * Is deprecated. It was a base class for C extensions, and it's not
    necessary to expose in Ruby level. [Feature #3072]

* Exception

  * New methods:

    * Exception#full_message to retrieve a String expression of an exception,
      formatted in the same way in which Ruby prints out an uncaught exception.
      [Feature #14141] [experimental]

* Dir

  * Dir.glob provides new optional keyword argument, :base.
    [Feature #13056]
  * Dir.chdir (without block arg), Dir.open, Dir.new, Dir.mkdir, Dir.rmdir,
    Dir.empty? releases GVL

  * New methods:

    * Dir.children  [Feature #11302]
    * Dir.each_child  [Feature #11302]

* Enumerable

  * Enumerable#{any?,all?,none?,one?} accept a pattern argument [Feature #11286]

* File

  * File.open accepts :newline option to imply text mode.  [Bug #13350]
  * File#path raises an IOError for files opened with
    File::Constants::TMPFILE option. [Feature #13568]
  * File.stat, File.exist?, and other rb_stat()-using methods release GVL
    [Bug #13941]
  * File.rename releases GVL [Feature #13951]
  * File::Stat#{atime,mtime,ctime} support fractional second timestamps on
    Windows 8 and later  [Feature #13726]
  * File::Stat#ino and File.indentical? support ReFS 128bit ino on Windows 8.1
    and later  [Feature #13731]
  * File.readable?, File.readable_real?, File.writable?, File.writable_real?,
    File.executable?, File.executable_real?, File.mkfifo, File.readlink,
    File.truncate, File#truncate, File.chmod, File.lchmod, File.chown,
    File.lchown, File.unlink, File.utime, File.lstat release GVL

  * New method:

    * File.lutime  [Feature #4052]

* Exception

  * Exception#full_message takes :highlight and :order options [Bug #14324]

* Hash

  * New methods:

    * Hash#transform_keys  [Feature #13583]
    * Hash#transform_keys!  [Feature #13583]
    * Hash#slice  [Feature #8499]

* IO

  * IO#copy_stream tries copy offload with copy_file_range(2) [Feature #13867]

  * New methods:

    * IO#pread  [Feature #4532]
    * IO#pwrite  [Feature #4532]
    * IO#write accepts multiple arguments  [Feature #9323]

* IOError

  * IO#close might raise an error with message "stream closed",
    but it is refined to "stream closed in another thread". The new message
    is more clear for user.
    [Bug #13405]

* Integer

  * Integer#step no longer hides errors from coerce method when
    given a step value which cannot be compared with #> to 0.
    [Feature #7688]
  * Integer#{round,floor,ceil,truncate} always return an Integer.
    [Bug #13420]
  * Integer#pow accepts modulo argument for calculating modular
    exponentiation.  [Feature #12508] [Feature #11003]

  * New methods:

    * Integer#allbits?, Integer#anybits?, Integer#nobits? [Feature #12753]
    * Integer.sqrt  [Feature #13219]

* Kernel

  * Kernel#yield_self   [Feature #6721]
  * Kernel#pp  [Feature #14123]
  * Kernel#warn(..., uplevel:n)  [Feature #12882]

* Method

  * New methods:

    * Method#=== that invokes Method#call, as same as Proc#=== [Feature #14142]

* Module

  * Module#{attr,attr_accessor,attr_reader,attr_writer} become public [Feature #14132]
  * Module#{define_method,alias_method,undef_method,remove_method} become public [Feature #14133]

* Numeric

  * Numerical comparison operators (<,<=,>=,>) no longer hide exceptions
    from #coerce method internally. Return nil in #coerce if the coercion is
    impossible.  [Feature #7688]

* Process

  * Precision of Process.times is improved if getrusage(2) exists. [Feature #11952]

  * New method:

    * Process.last_status as an alias of $? [Feature #14043]

* Range
  * Range#initialize no longer hides exceptions when comparing begin and
    end with #<=> and raise a "bad value for range" ArgumentError
    but instead lets the exception from the #<=> call go through.
    [Feature #7688]

* Regexp

  * Update to Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05.

    * Support absence operator https://github.com/k-takata/Onigmo/issues/82

  * Support new 5 emoji-related Unicode character properties

* RubyVM::InstructionSequence

  * New method:

    * RubyVM::InstructionSequence#each_child
    * RubyVM::InstructionSequence#trace_points

* String

  * String#-@ deduplicates unfrozen strings.  Already-frozen
    strings remain unchanged for compatibility.  [Feature #13077]
  * -"literal" (String#-@) optimized to return the same object
    (same as "literal".freeze in Ruby 2.1+) [Feature #13295]
  * String#{casecmp,casecmp?} return nil for non-string arguments
    instead of raising a TypeError. [Bug #13312]
  * String#start_with? accepts a regexp [Feature #13712]

  * New methods:

    * String#delete_prefix, String#delete_prefix! [Feature #12694]
    * String#delete_suffix, String#delete_suffix! [Feature #13665]
    * String#each_grapheme_cluster and String#grapheme_clusters to
      enumerate grapheme clusters [Feature #13780]
    * String#undump to unescape String#dump'ed string [Feature #12275]

* Struct

  * Struct.new takes `keyword_init: true` option to initialize members
    with keyword arguments. [Feature #11925]

* Regexp/String: Update Unicode version from 9.0.0 to 10.0.0 [Feature #13685]

* Thread

  * Description set by Thread#name= is now visible on Windows 10.

  * New method:
    * Thread#fetch  [Feature #13009]

  * The default of Thread.report_on_exception is now true,
    showing unhandled exceptions terminating threads on $stderr.
    [Feature #14143]

* Time

  * Time#at receives 3rd argument which specifies the unit of 2nd argument.
    [Feature #13919]

* KeyError

  * New methods:

    * KeyError#receiver [Feature #12063]
    * KeyError#key      [Feature #12063]

* FrozenError

  * New exception class. [Feature #13224]

=== Stdlib updates (outstanding ones only)

* BigDecimal

  * Update to BigDecimal 1.3.4

  * The following features are added:

    * BigDecimal::VERSION

  * The following features have been deprecated,
    and are planned to be removed in the version 1.4.0:

    * BigDecimal.new

    * BigDecimal.ver

  * BigDecimal#clone and #dup now do not make a new instance,
    but returns the receiver itself.

* Coverage

  * Support branch coverage and method coverage measurement. [Feature #13901]
    Branch coverage tells you which branches are executed, and which not.
    Method coverage tells you which methods are invoked, and which not.
    By running a test suite with this new feature, you can know which branches
    and methods are executed by a test, and evaluate total coverage of a test
    suite more strictly.

    You can specify the measuring target by an option to `Coverage.start`:

        Coverage.start(lines: true, branches: true, methods: true)

    After some Ruby files are loaded, you can use `Coverage.result` to get
    the coverage result:

        Coverage.result
        #=> { "/path/to/file.rb"=>
        #     { :lines => [1, 2, 0, nil, ...],
        #       :branches =>
        #         { [:if, 0, 2, 1, 6, 4] =>
        #             { [:then, 1, 3, 2, 3, 8] => 0,
        #               [:else, 2, 5, 2, 5, 8] => 2
        #             }
        #         },
        #       :methods => {
        #          [Object, :foo, 1, 0, 7, 3] => 2
        #       }
        #     }
        #   }

    The result type of line coverage is not changed; it is just an array that
    contains numbers, which means the count that each line was executed,
    or `nil`s, which means that the line is not relevant.

    The result type of branch coverage is:

        { (jump base) => { (jump target) => (counter) } }

    where jump base and targets have the format

        [type, unique-id, start lineno, start column, end lineno, end column]

    For example, `[:if, 0, 2, 1, 6, 4]` reads an `if` statement that ranges from
    line 2 and column 1, to line 6 and column 4.  `[:then, 1, 3, 2, 3, 8]` reads
    a `then` clause that ranges from line 3 and column 2, to line 3 and column 8.
    Note that lineno starts from 1, and that columnno starts from 0.  So, the
    above example shows a branch from the `if` to the `then` was never executed,
    and a branch from the `if` to the `else` was executed twice.

    The result type of method coverage is:

        { (method key) => (counter) }

    where method key has the format

        [class, method-name, start lineno, start column, end lineno, end column]

    For example, `[Object, :foo, 1, 0, 7, 3]` reads `Object#foo` that ranges from
    line 1 and column 0, to line 7 and column 3.  The above example shows this
    `Object#foo` was invoked twice.

    Note: To keep compatibility, passing no option to `Coverage.start` will measure
    only line coverage, and `Coverage.result` will return the old format:

        Coverage.result
        #=> { "/path/to/file.rb"=> [1, 2, 0, nil, ...] }

* DRb

  * ACL::ACLEntry.new no longer suppresses IPAddr::InvalidPrefixError.

* ERB

  * Add ERB#result_with_hash to render a template with local variables passed
    with a Hash object. [Feature #8631]

  * Default template file encoding is changed from ASCII-8BIT to UTF-8 in erb
    command. [Bug #14095]

  * Carriage returns are changed to be trimmed properly if trim_mode is specified
    and used. Duplicated newlines will be removed on Windows. [Bug #5339] [Bug #11464]

* IPAddr

  * IPAddr no longer accepts invalid address mask. [Bug #13399]
  * IPAddr#{ipv4_compat,ipv4_compat?} are marked for deprecation. [Bug #13769]

  * New methods:

    * IPAddr#prefix
    * IPAddr#loopback?
    * IPAddr#private? [Feature #11666]
    * IPAddr#link_local? [Feature #10912]


* IRB

  * Print backtrace and error message in reverse order [Feature #8661] [experimental]
  * `binding.irb` automatically requires irb and runs [Bug #13099] [experimental]
  * `binding.irb` on its start shows source around the line where it was called
    [Feature #14124]

* Matrix

  * New methods:

    * Matrix.combine and Matrix#combine [Feature #10903]
    * Matrix#{hadamard_product,entrywise_product}

* Net::HTTP

  * Net::HTTP.new supports no_proxy parameter [Feature #11195]
  * Net::HTTP#{min_version,max_version}, [Feature #9450]
  * Add more HTTP status classes
  * Net::HTTP::STATUS_CODES is added as HTTP Status Code Repository [Misc #12935]
  * Net::HTTP#{proxy_user,proxy_pass} reflect http_proxy environment variable
    if the system's environment variable is multiuser safe. [Bug #12921]

* open-uri
  * URI.open method defined as an alias to open-uri's Kernel.open.
    open-uri's Kernel.open will be deprecated in future.

* OpenSSL

  * Updated Ruby/OpenSSL from version 2.0 to 2.1. Changes are noted in
    "Version 2.1.0" section in ext/openssl/History.md.

* Pathname

  * New method:

    * Pathname#glob [Feature #7360]

* Psych

  * Update to Psych 3.0.2.

    * Convert fallback option to a keyword argument
      https://github.com/ruby/psych/pull/342
    * Add :symbolize_names option to Psych.load, Psych.safe_load like JSON.parse
      https://github.com/ruby/psych/pull/333, https://github.com/ruby/psych/pull/337
    * Add Psych::Handler#event_location
      https://github.com/ruby/psych/pull/326
    * Make frozen string literal = true
      https://github.com/ruby/psych/pull/320
    * Preserve time zone offset when deserializing times
      https://github.com/ruby/psych/pull/316
    * Remove deprecated method aliases for syck gem
      https://github.com/ruby/psych/pull/312

* RbConfig

  * RbConfig::LIMITS is added to provide the limits of C types.
    This is available when rbconfig/sizeof is loaded.

* Ripper

  * Ripper::EXPR_BEG and so on for Ripper#state.

  * New method:

    * Ripper#state to tell the state of scanner. [Feature #13686]

* RDoc

  * Update to RDoc 6.0.1.

    * Replace IRB based lexer with Ripper.
      * https://github.com/ruby/rdoc/pull/512
      * This much improves the speed of generating documents.
      * It also facilitates supporting new syntax in the future.
    * Support many new syntaxes of Ruby from the past few years.
    * Use "frozen_string_literal: true".
      Performance survey: https://gist.github.com/aycabta/abdfaa75ea8a6877eeb734e942e73800
    * Support did_you_mean.

* Rubygems

  * Update to Rubygems 2.7.3.
    * http://blog.rubygems.org/2017/11/28/2.7.3-released.html
    * http://blog.rubygems.org/2017/11/08/2.7.2-released.html
    * http://blog.rubygems.org/2017/11/03/2.7.1-released.html
    * http://blog.rubygems.org/2017/11/01/2.7.0-released.html
    * http://blog.rubygems.org/2017/10/09/2.6.14-released.html
    * http://blog.rubygems.org/2017/08/27/2.6.13-released.html

* SecureRandom

  * New method:

    * SecureRandom.alphanumeric

* Set

  * New methods:

    * Set#to_s as alias to #inspect [Feature #13676]
    * Set#=== as alias to #include? [Feature #13801]
    * Set#reset [Feature #6589]

* StringIO

  * StringIO#write accepts multiple arguments

* StringScanner

  * New methods:

    * StringScanner#size, StringScanner#captures, StringScanner#values_at  [Feature #836]

* URI

  * Relative path operations no longer collapse consecutive slashes to a single slash. [Bug #8352]

* WEBrick

  * Add Server Name Indication (SNI) support [Feature #13729]
  * support Proc objects as body responses [Feature #855]
  * released as a RubyGem [Feature #13173]
  * avoid unintended behavior from Kernel#open [Misc #14216]

* Zlib

  * Zlib::GzipWriter#write accepts multiple arguments

=== Compatibility issues (excluding feature bug fixes)

* Socket

  * BasicSocket#read_nonblock and BasicSocket#write_nonblock no
    longer set the O_NONBLOCK file description flag as side effect
    (on Linux only) [Feature #13362]

* Random

  * Random.raw_seed renamed to become Random.urandom.  It is now
    applicable to non-seeding purposes due to [Bug #9569].

* Socket

  * Socket::Ifaddr#vhid is added [Feature #13803]

* ConditionVariable, Queue and SizedQueue reimplemented for speed.
  They no longer subclass Struct. [Feature #13552]

=== Stdlib compatibility issues (excluding feature bug fixes)

* Gemification

  * Promote following standard libraries to default gems.
    * cmath
    * csv
    * date
    * dbm
    * etc
    * fcntl
    * fiddle
    * fileutils
    * gdbm
    * ipaddr
    * scanf
    * sdbm
    * stringio
    * strscan
    * webrick
    * zlib

* Logger

  * Logger.new("| command") had been working to open a command
    unintentionally. It was prohibited, and now Logger#initialize
    treats a String argument only as a filename, as its specification.
    [Bug #14212]

* Net::HTTP

  * Net::HTTP#start now passes :ENV to p_addr by default. [Bug #13351]
    To avoid this, pass nil explicitly.

* mathn.rb

  * Removed from stdlib. [Feature #10169]

* Rubygems

  * Removed "ubygems.rb" file from stdlib. It's needless since Ruby 1.9.

=== C API updates

=== Supported platform changes

* Drop support of NaCl platform

  * https://bugs.chromium.org/p/chromium/issues/detail?id=239656#c160

=== Implementation improvements

* (This might not be a "user visible feature change" but) Hash class's
  hash function is now SipHash13. [Feature #13017]

* SecureRandom now prefers OS-provided sources than OpenSSL. [Bug #9569]

* Mutex rewritten to be smaller and faster [Feature #13517]

* Performance of block passing using block parameters is improved by
  lazy Proc allocation [Feature #14045]

* Dynamic instrumentation for TracePoint hooks instead of using "trace"
  instruction to avoid overhead [Feature #14104]

* ERB now generates code from a template which runs 2 times faster than Ruby 2.4

=== Miscellaneous changes

* Print backtrace and error message in reverse order if STDERR is unchanged and a tty.
  [Feature #8661] [experimental]

* Print error message in bold/underlined text if STDERR is unchanged and a tty.
  [Feature #14140] [experimental]

* configure option --with-ext now mandates its arguments.  So for
  instance if you run ./configure --with-ext=openssl,+ then the
  openssl library is guaranteed compiled, otherwise the build fails
  abnormally.

  Note however to always add the ",+" at the end of the argument.
  Otherwise nothing but openssl are built.  [Feature #13302]
doc/alt-ruby25/README.md000064400000013720151731613060010504 0ustar00[![Build Status](https://travis-ci.org/ruby/ruby.svg)](https://travis-ci.org/ruby/ruby)
[![Build status](https://ci.appveyor.com/api/projects/status/0sy8rrxut4o0k960/branch/trunk?svg=true)](https://ci.appveyor.com/project/ruby/ruby/branch/trunk)

# What's Ruby

Ruby is the interpreted scripting language for quick and easy object-oriented
programming. It has many features to process text files and to do system
management tasks (as in Perl). It is simple, straight-forward, and
extensible.

## Features of Ruby

*   Simple Syntax
*   **Normal** Object-oriented Features (e.g. class, method calls)
*   **Advanced** Object-oriented Features (e.g. mix-in, singleton-method)
*   Operator Overloading
*   Exception Handling
*   Iterators and Closures
*   Garbage Collection
*   Dynamic Loading of Object Files (on some architectures)
*   Highly Portable (works on many Unix-like/POSIX compatible platforms as
    well as Windows, macOS, Haiku, etc.) cf.
    https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatforms


## How to get Ruby

For a complete list of ways to install Ruby, including using third-party tools
like rvm, see:

https://www.ruby-lang.org/en/downloads/

The Ruby distribution files can be found on the following FTP site:

ftp://ftp.ruby-lang.org/pub/ruby/

The trunk of the Ruby source tree can be checked out with the following
command:

    $ svn co https://svn.ruby-lang.org/repos/ruby/trunk/ ruby

Or if you are using git then use the following command:

    $ git clone https://github.com/ruby/ruby.git

There are some other branches under development. Try the following command
to see the list of branches:

    $ svn ls https://svn.ruby-lang.org/repos/ruby/branches/

Or if you are using git then use the following command:

    $ git ls-remote git://github.com/ruby/ruby.git

## Ruby home page

The URL of the Ruby home page is:

https://www.ruby-lang.org/

## Mailing list

There is a mailing list to talk about Ruby. To subscribe to this list, please
send the following phrase:

    subscribe

in the mail body (not subject) to the address
<mailto:ruby-talk-request@ruby-lang.org>.

## How to compile and install

This is what you need to do to compile and install Ruby:

1.  If you want to use Microsoft Visual C++ to compile Ruby, read
    [win32/README.win32](win32/README.win32) instead of this document.

2.  If `./configure` does not exist or is older than `configure.ac`, run
    `autoconf` to (re)generate configure.

3.  Run `./configure`, which will generate `config.h` and `Makefile`.

    Some C compiler flags may be added by default depending on your
    environment. Specify `optflags=..` and `warnflags=..` as necessary to
    override them.

4.  Edit `defines.h` if you need. Usually this step will not be needed.

5.  Remove comment mark(`#`) before the module names from `ext/Setup` (or add
    module names if not present), if you want to link modules statically.

    If you don't want to compile non static extension modules (probably on
    architectures which do not allow dynamic loading), remove comment mark
    from the line "`#option nodynamic`" in `ext/Setup`.

    Usually this step will not be needed.

6.  Run `make`.

    * On Mac, set RUBY\_CODESIGN environment variable with a signing identity.
      It uses the identity to sign `ruby` binary. See also codesign(1).

7.  Optionally, run '`make check`' to check whether the compiled Ruby
    interpreter works well. If you see the message "`check succeeded`", your
    Ruby works as it should (hopefully).

8.  Optionally, run `make update-gems` and `make extract-gems`.

    If you want to install bundled gems, run `make update-gems` and
    `make extract-gems` before running `make install`.

9.  Run '`make install`'.

    This command will create the following directories and install files into
    them.

    *   `${DESTDIR}${prefix}/bin`
    *   `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib`
    *   `${DESTDIR}${prefix}/lib/ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
    *   `${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}`
    *   `${DESTDIR}${prefix}/share/man/man1`
    *   `${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system`


    If Ruby's API version is '*x.y.z*', the `${MAJOR}` is '*x*', the
    `${MINOR}` is '*y*', and the `${TEENY}` is '*z*'.

    **NOTE**: teeny of the API version may be different from one of Ruby's
    program version

    You may have to be a super user to install Ruby.


If you fail to compile Ruby, please send the detailed error report with the
error log and machine/OS type, to help others.

Some extension libraries may not get compiled because of lack of necessary
external libraries and/or headers, then you will need to run '`make distclean-ext`'
to remove old configuration after installing them in such case.

## Copying

See the file [COPYING](COPYING).

## Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list
(https://www.ruby-lang.org/en/community/mailing-lists) or on websites like
(https://stackoverflow.com).

Bug reports should be filed at https://bugs.ruby-lang.org. Read [HowToReport] for more information.

[HowToReport]: https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReport

## Contributing

See the file [CONTRIBUTING.md](CONTRIBUTING.md)


## The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in
1995.

<mailto:matz@ruby-lang.org>
doc/alt-ruby25/GPL000064400000043254151731613070007600 0ustar00                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
man/man8/php-fpm.8000064400000012240151732707720007634 0ustar00.TH PHP-FPM 8 "2018" "The PHP Group" "Scripting Language"
.SH NAME
.TP 15
php-fpm \- PHP FastCGI Process Manager 'PHP-FPM'
.SH SYNOPSIS
.B php-fpm
[options]
.LP
.SH DESCRIPTION
\fBPHP\fP is a widely\-used general\-purpose scripting language that is especially suited for
Web development and can be embedded into HTML. This is a variant of PHP that will run in the background as a daemon, listening for CGI requests. Output is logged to /var/log/php-fpm.log.
.LP
Most options are set in the configuration file. The configuration file is /opt/alt/php73/etc/php-fpm.conf. By default, php-fpm will respond to CGI requests listening on localhost http port 9000. Therefore php-fpm expects your webserver to forward all requests for '.php' files to port 9000 and you should edit your webserver configuration file appropriately.
.SH OPTIONS
.TP 15
.B \-C
Do not chdir to the script's directory
.TP
.PD 0
.B \-\-php\-ini \fIpath\fP|\fIfile\fP
.TP
.PD 1
.B \-c \fIpath\fP|\fIfile\fP
Look for
.B php.ini
file in the directory
.IR path
or use the specified
.IR file
.TP
.PD 0
.B \-\-no\-php\-ini
.TP
.PD 1
.B \-n
No
.B php.ini
file will be used
.TP
.PD 0
.B \-\-define \fIfoo\fP[=\fIbar\fP]
.TP
.PD 1
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry
.IR foo
with value
.IR bar
.TP
.B \-e
Generate extended information for debugger/profiler
.TP
.PD 0
.B \-\-help
.TP
.PD 1
.B \-h
This help
.TP
.PD 0
.B \-\-info
.TP
.PD 1
.B \-i
PHP information and configuration
.TP
.PD 0
.B \-\-modules
.TP
.PD 1
.B \-m
Show compiled in modules
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Version number
.B \-\-prefix \fIpath\fP
.TP
.PD 1
.B \-p
Specify alternative prefix path (the default is /opt/alt/php73)
.TP
.PD 0
.B \-\-pid \fIfile\fP
.TP
.PD 1
.B \-g
Specify the PID file location.
.TP
.PD 0
.B \-\-fpm\-config \fIfile\fP
.TP
.PD 1
.B \-y
Specify alternative path to FastCGI process manager configuration file (the default is /opt/alt/php73/etc/php-fpm.conf)
.TP
.PD 0
.B \-\-test
.TP
.PD 1
.B \-t
Test FPM configuration file and exit
If called twice (\-tt), the configuration is dumped before exiting.
.TP
.PD 0
.B \-\-daemonize
.TP
.PD 1
.B \-D
Force to run in background and ignore daemonize option from configuration file.
.TP
.PD 0
.B \-\-nodaemonize
.TP
.PD 1
.B \-F
Force to stay in foreground and ignore daemonize option from configuration file.
.TP
.PD 0
.B \-\-force-stderr
.TP
.PD 1
.B \-O
Force output to stderr in nodaemonize even if stderr is not a TTY.
.TP
.PD 0
.B \-\-allow\-to\-run\-as\-root
.TP
.PD 1
.B \-R
Allow pool to run as root (disabled by default)
.SH FILES
.TP 15
.B php-fpm.conf
The configuration file for the php-fpm daemon.
.TP
.B php.ini
The standard php configuration file.
.SH EXAMPLES
For any unix systems which use init.d for their main process manager, you should use the init script provided to start and stop the php-fpm daemon.
.P
.PD 1
.RS
sudo /etc/init.d/php-fpm start
.RE
.TP
For any unix systems which use systemd for their main process manager, you should use the unit file provided to start and stop the php-fpm daemon.
.P
.PD 1
.RS
sudo systemctl start php-fpm.service
.RE
.TP
If your installation has no appropriate init script, launch php-fpm with no arguments. It will launch as a daemon (background process) by default. The file /var/run/php-fpm.pid determines whether php-fpm is already up and running. Once started, php-fpm then responds to several POSIX signals:
.P
.PD 0
.RS
.B SIGINT,SIGTERM 	\fPimmediate termination
.TP
.B SIGQUIT 			\fPgraceful stop
.TP
.B SIGUSR1 			\fPre-open log file
.TP
.B SIGUSR2 			\fPgraceful reload of all workers + reload of fpm conf/binary
.RE
.PD 1
.P
.SH TIPS
The PHP-FPM CGI daemon will work well with most popular webservers, including Apache2, lighttpd and nginx.
.PD 1
.P
.SH SEE ALSO
The PHP-FPM website:
.PD 0
.P
.B http://php-fpm.org
.PD 1
.P
For a more or less complete description of PHP look here:
.PD 0
.P
.B http://www.php.net/manual/
.PD 1
.P
A nice introduction to PHP by Stig Bakken can be found here:
.PD 0
.P
.B http://www.zend.com/zend/art/intro.php
.PD 1
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
PHP-FPM SAPI was written by Andrei Nigmatulin. The mailing-lists are highload-php-en (English) and highload-php-ru (Russian).
.P
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphp-fpm\fP, version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.PD 0
.P
Copyright (c) 2007-2009, Andrei Nigmatulin
.PD 1
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
man/man1/phar.1000064400000025056151732707720007212 0ustar00.TH PHAR 1 "2018" "The PHP Group" "User Commands"
.SH NAME
phar, phar.phar \- PHAR (PHP archive) command line tool
.SH SYNOPSIS
.B phar
<command> [options] ...
.LP
.SH DESCRIPTION
The \fBPHAR\fP file format provides a way to put entire PHP applications into a single
file called a "phar" (PHP Archive) for easy distribution and installation.
.P
With the \fBphar\fP command you can create, update or extract PHP archives.
.P
Commands:
add compress delete extract help help-list info list meta-del
meta-get meta-set pack sign stub-get stub-set tree version

.SH add command
Add entries to a PHAR package.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B ...
Any number of input files and directories. If -i is in
use then ONLY files and matching the given regular
expression are being packed. If -x is given then files
matching that regular expression are NOT being packed.
.P
Optional arguments:
.TP 15
.PD
.B \-a \fIalias\fP
Provide an \fIalias\fP name for the phar file.
.TP
.PD
.B \-c \fIalgo\fP
Compression algorithm (see
.SM
.B COMPRESSION
)
.TP
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-l \fIlevel\fP
Number of preceding subdirectories to strip from file entries
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.

.SH compress command
Compress or uncompress all files or a selected entry.
.P
Required arguments:
.TP 15
.PD
.B \-c \fIalgo\fP
Compression algorithm (see
.SM
.B COMPRESSION
)
.TP
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).

.SH delete command
Delete entry from a PHAR archive
.P
Required arguments:
.TP 15
.PD
.B \-e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.

.SH extract command
Extract a PHAR package to a directory.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B -x \fIregex\fP
Regular expression for input files to exclude.
.TP
.PD
.B ...
Directory to extract to (defaults to '.').


.SH help command
This help or help for a selected command.
.P
Optional arguments:
.TP 15
.PD
.B ...
Optional command to retrieve help for.

.SH help-list command
Lists available commands.

.SH info command
Get information about a PHAR package.
.P
By using -k it is possible to return a single value.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH list command
List contents of a PHAR archive.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B -x \fIregex\fP
Regular expression for input files to exclude.


.SH meta-del command
Delete meta information of a PHAR entry or a PHAR package.
.P
If -k is given then the metadata is expected to be an array and the
given index is being deleted.
.P
If something was deleted the return value is 0 otherwise it is 1.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH meta-get command
Get meta information of a PHAR entry or a PHAR package in serialized from. If
no output file is specified for meta data then stdout is being used.
You can also specify a particular index using -k. In that case the
metadata is expected to be an array and the value of the given index
is returned using echo rather than using serialize. If that index does
not exist or no meta data is present then the return value is 1.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH meta-set command
Set meta data of a PHAR entry or a PHAR package using serialized input. If no
input file is specified for meta data then stdin is being used. You can
also specify a particular index using -k. In that case the metadata is
expected to be an array and the value of the given index is being set.
If the metadata is not present or empty a new array will be created.
If the metadata is present and a flat value then the return value is
1. Also using -k the input is been taken directly rather then being
serialized.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B -m \fImeta\fP
Meta data to store with entry (serialized php data).
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH pack command
Pack files into a PHAR archive.
.P
When using -s <stub>, then the stub file is being excluded from the
list of input files/dirs.To create an archive that contains PEAR class
PHP_Archive then point -p argument to PHP/Archive.php.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B ...
Any number of input files and directories. If -i is in
use then ONLY files and matching the given regular
expression are being packed. If -x is given then files
matching that regular expression are NOT being packed.
.P
Optional arguments:
.TP 15
.PD
.B \-a \fIalias\fP
Provide an \fIalias\fP name for the phar file.
.TP
.PD
.B \-b \fIbang\fP
Hash-bang line to start the archive (e.g. #!/usr/bin/php).
The hash mark itself '#!' and the newline character are optional.
.TP
.PD
.B \-c \fIalgo\fP
Compression algorithm (see
.SM
.B COMPRESSION
)
.TP
.PD
.B \-h \fIhash\fP
Selects the \fIhash\fP algorithm (see
.SM
.B HASH
)
.TP
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-l \fIlevel\fP
Number of preceding subdirectories to strip from file entries
.TP
.PD
.B \-p \fIloader\fP
Location of PHP_Archive class file (pear list-files
PHP_Archive).You can use '0' or '1' to locate it
automatically using the mentioned pear command. When
using '0' the command does not error out when the class
file cannot be located. This switch also adds some code
around the stub so that class PHP_Archive gets
registered as phar:// stream wrapper if necessary. And
finally this switch will add the file phar.inc from
this package and load it to ensure class Phar is
present.
.TP
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.
.TP
.PD
.B \-y \fIkey\fP
Private \fIkey\fP for OpenSSL signing.

.SH sign command
Set signature hash algorithm.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B \-h \fIhash\fP
Selects the \fIhash\fP algorithm (see
.SM
.B HASH
)
.P
Optional arguments:
.TP 15
.PD
.B \-y \fIkey\fP
Private \fIkey\fP for OpenSSL signing.

.SH stub-get command
Get the stub of a PHAR file. If no output file is specified as stub then stdout
is being used.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.

.SH stub-set command
Set the stub of a PHAR file. If no input file is specified as stub then stdin
is being used.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-b \fIbang\fP
Hash-bang line to start the archive (e.g. #!/usr/bin/php).
The hash mark itself '#!' and the newline character are optional.
.TP
.PD
.B \-p \fIloader\fP
Location of PHP_Archive class file (pear list-files
PHP_Archive).You can use '0' or '1' to locate it
automatically using the mentioned pear command. When
using '0' the command does not error out when the class
file cannot be located. This switch also adds some code
around the stub so that class PHP_Archive gets
registered as phar:// stream wrapper if necessary. And
finally this switch will add the file phar.inc from
this package and load it to ensure class Phar is
present.
.TP
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.


.SH tree command
Get a directory tree for a PHAR archive.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.

.SH version command
Get information about the PHAR environment and the tool version.


.SH COMPRESSION
Algorithms:
.TP 15
.PD
.B 0
No compression
.TP
.PD
.B none
No compression
.TP
.PD
.B auto
Automatically select compression algorithm
.TP
.PD
.B gz
GZip compression
.TP
.PD
.B gzip
GZip compression
.TP
.PD
.B bz2
BZip2 compression
.TP
.PD
.B bzip2
BZip2 compression

.SH HASH
Algorithms:
.TP 15
.PD
.TP
.PD
.B md5
MD5
.TP
.PD
.B sha1
SHA1
.TP
.PD
.B sha256
SHA256
.TP
.PD
.B sha512
SHA512
.TP
.PD
.B openssl
OpenSSL

.SH SEE ALSO
For a more or less complete description of PHAR look here:
.PD 0
.P
.B http://php.net/phar
.PD 1
.P
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
Work for the PHP archive was done by Gregory Beaver, Marcus Boerger.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphar\fP, version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
man/man1/php-config.1000064400000003336151732707720010307 0ustar00.TH php\-config 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
php\-config \- get information about PHP configuration and compile options
.SH SYNOPSIS
.B php\-config
[options]
.LP
.SH DESCRIPTION
.B php\-config
is a simple shell script for obtaining information about installed PHP configuration.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-prefix
Directory prefix where PHP is installed, e.g. /usr/local
.TP
.PD 0
.B \-\-includes
List of \-I options with all include files
.TP
.PD 0
.B \-\-ldflags
LD Flags which PHP was compiled with
.TP
.PD 0
.B \-\-libs
Extra libraries which PHP was compiled with
.TP
.PD 0
.B \-\-man-dir
The directory prefix where the manpages is installed
.TP
.PD 0
.B \-\-extension-dir
Directory where extensions are searched by default
.TP
.PD 0
.B \-\-include-dir
Directory prefix where header files are installed by default
.TP
.PD 0
.B \-\-php-binary
Full path to php CLI or CGI binary
.TP
.PD 0
.B \-\-php-sapis
Show all SAPI modules available
.TP
.PD 0
.B \-\-configure-options
Configure options to recreate configuration of current PHP installation
.TP
.PD 0
.B \-\-version
PHP version
.TP
.PD 0
.B \-\-vernum
PHP version as integer
.RS
.PD 1
.P
.SH SEE ALSO
.BR php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
man/man1/php-cgi.1000064400000000017151732707730007576 0ustar00.so man1/php.1
man/man1/php.1000064400000022276151732707730007051 0ustar00.TH php 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
php \- PHP Command Line Interface 'CLI'
.P
php-cgi \- PHP Common Gateway Interface 'CGI' command
.SH SYNOPSIS
.B php
[options] [
.B \-f\fP ]
.IR file
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options]
.B \-r
.IR code
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] [\-B
.IR begin_code ]
.B \-R
.IR code
[\-E
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] [\-B
.IR begin_code ]
.B \-F
.IR file
[\-E
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] \-\- [
.IR args.\|.\|. ]
.LP
\fBphp \fP[options] \fB\-a\fP
.LP
.B php
[options] \-S
.IR addr:port
[\-t
.IR docroot ]
.LP
.SH DESCRIPTION
\fBPHP\fP is a widely\-used general\-purpose scripting language that is especially suited for
Web development and can be embedded into HTML. This is the command line interface
that enables you to do the following:
.P
You can parse and execute files by using parameter \-f followed by the name of the
.IR file
to be executed.
.LP
Using parameter \-r you can directly execute PHP
.IR code
simply as you would do inside a
.B \.php
file when using the
.B eval()
function.
.LP
It is also possible to process the standard input line by line using either
the parameter \-R or \-F. In this mode each separate input line causes the
.IR code
specified by \-R or the
.IR file
specified by \-F to be executed.
You can access the input line by \fB$argn\fP. While processing the input lines
.B $argi
contains the number of the actual line being processed. Further more
the parameters \-B and \-E can be used to execute
.IR code
(see \-r) before and
after all input lines have been processed respectively. Notice that the
input is read from
.B STDIN
and therefore reading from
.B STDIN
explicitly changes the next input line or skips input lines.
.LP
PHP also contains an built-in web server for application development purpose. By using the \-S option where
.B addr:port
point to a local address and port PHP will listen to HTTP requests on that address and port and serve files from the current working directory or the
.B docroot
passed by the \-t option.
.LP
If none of \-r \-f \-B \-R \-F \-E or \-S is present but a single parameter is given
then this parameter is taken as the filename to parse and execute (same as
with \-f). If no parameter is present then the standard input is read and
executed.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-interactive
.TP
.PD 1
.B \-a
Run PHP interactively. This lets you enter snippets of PHP code that directly
get executed. When readline support is enabled you can edit the lines and also
have history support.
.TP
.PD 0
.B \-\-bindpath \fIaddress:port\fP|\fIport\fP
.TP
.PD 1
.B \-b \fIaddress:port\fP|\fIport\fP
Bind Path for external FASTCGI Server mode (CGI only).
.TP
.PD 0
.B \-\-no\-chdir
.TP
.PD 1
.B \-C
Do not chdir to the script's directory (CGI only).
.TP
.PD 0
.B \-\-no\-header
.TP
.PD 1
.B \-q
Quiet-mode. Suppress HTTP header output (CGI only).
.TP
.PD 0
.B \-\-timing \fIcount\fP
.TP
.PD 1
.B \-T \fIcount\fP
Measure execution time of script repeated count times (CGI only).
.TP
.PD 0
.B \-\-php\-ini \fIpath\fP|\fIfile\fP
.TP
.PD 1
.B \-c \fIpath\fP|\fIfile\fP
Look for
.B php.ini
file in the directory
.IR path
or use the specified
.IR file
.TP
.PD 0
.B \-\-no\-php\-ini
.TP
.PD 1
.B \-n
No
.B php.ini
file will be used
.TP
.PD 0
.B \-\-define \fIfoo\fP[=\fIbar\fP]
.TP
.PD 1
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry
.IR foo
with value
.IR bar
.TP
.B \-e
Generate extended information for debugger/profiler
.TP
.PD 0
.B \-\-file \fIfile\fP
.TP
.PD 1
.B \-f \fIfile\fP
Parse and execute
.IR file
.TP
.PD 0
.B \-\-help
.TP
.PD 1
.B \-h
This help
.TP
.PD 0
.B \-\-hide\-args
.TP
.PD 1
.B \-H
Hide script name (\fIfile\fP) and parameters (\fIargs\.\.\.\fP) from external
tools. For example you may want to use this when a php script is started as
a daemon and the command line contains sensitive data such as passwords.
.TP
.PD 0
.B \-\-info
.TP
.PD 1
.B \-i
PHP information and configuration
.TP
.PD 0
.B \-\-syntax\-check
.TP
.PD 1
.B \-l
Syntax check only (lint)
.TP
.PD 0
.B \-\-modules
.TP
.PD 1
.B \-m
Show compiled in modules
.TP
.PD 0
.B \-\-run \fIcode\fP
.TP
.PD 1
.B \-r \fIcode\fP
Run PHP
.IR code
without using script tags
.B '<?..?>'
.TP
.PD 0
.B \-\-process\-begin \fIcode\fP
.TP
.PD 1
.B \-B \fIbegin_code\fP
Run PHP
.IR begin_code
before processing input lines
.TP
.PD 0
.B \-\-process\-code \fIcode\fP
.TP
.PD 1
.B \-R \fIcode\fP
Run PHP
.IR code
for every input line
.TP
.PD 0
.B \-\-process\-file \fIfile\fP
.TP
.PD 1
.B \-F \fIfile\fP
Parse and execute
.IR file
for every input line
.TP
.PD 0
.B \-\-process\-end \fIcode\fP
.TP
.PD 1
.B \-E \fIend_code\fP
Run PHP
.IR end_code
after processing all input lines
.TP
.PD 0
.B \-\-syntax\-highlight
.TP
.PD 1
.B \-s
Output HTML syntax highlighted source
.TP
.PD 0
.B \-\-server \fIaddr:port\fP
.TP
.PD 1
.B \-S \fIaddr:port\fP
Start built-in web server on the given local address and port
.TP
.PD 0
.B \-\-docroot \fIdocroot\fP
.TP
.PD 1
.B \-t \fIdocroot\fP
Specify the document root to be used by the built-in web server
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Version number
.TP
.PD 0
.B \-\-strip
.TP
.PD 1
.B \-w
Output source with stripped comments and whitespace
.TP
.PD 0
.B \-\-zend\-extension \fIfile\fP
.TP
.PD 1
.B \-z \fIfile\fP
Load Zend extension
.IR file
.TP
.IR args.\|.\|.
Arguments passed to script. Use
.B '\-\-'
.IR args
when first argument starts with
.B '\-'
or script is read from stdin
.TP
.PD 0
.B \-\-rfunction
.IR name
.TP
.PD 1
.B \-\-rf
.IR name
Shows information about function
.B name
.TP
.PD 0
.B \-\-rclass
.IR name
.TP
.PD 1
.B \-\-rc
.IR name
Shows information about class
.B name
.TP
.PD 0
.B \-\-rextension
.IR name
.TP
.PD 1
.B \-\-re
.IR name
Shows information about extension
.B name
.TP
.PD 0
.B \-\-rzendextension
.IR name
.TP
.PD 1
.B \-\-rz
.IR name
Shows information about Zend extension
.B name
.TP
.PD 0
.B \-\-rextinfo
.IR name
.TP
.PD 1
.B \-\-ri
.IR name
Shows configuration for extension
.B name
.TP
.B \-\-ini
Show configuration file names
.SH FILES
.TP 15
.B php\-cli.ini
The configuration file for the CLI version of PHP.
.TP
.B php.ini
The standard configuration file will only be used when
.B php\-cli.ini
cannot be found.
.SH EXAMPLES
.TP 5
\fIphp \-r 'echo "Hello World\\n";'\fP
This command simply writes the text "Hello World" to standard out.
.TP
\fIphp \-r 'print_r(gd_info());'\fP
This shows the configuration of your gd extension. You can use this
to easily check which image formats you can use. If you have any
dynamic modules you may want to use the same ini file that php uses
when executed from your webserver. There are more extensions which
have such a function. For dba use:
.RS
\fIphp \-r 'print_r(dba_handlers(1));'\fP
.RE
.TP
\fIphp \-R 'echo strip_tags($argn)."\\n";'\fP
This PHP command strips off the HTML tags line by line and outputs the
result. To see how it works you can first look at the following PHP command
\'\fIphp \-d html_errors=1 \-i\fP\' which uses PHP to output HTML formatted
configuration information. If you then combine those two
\'\fIphp \.\.\.|php \.\.\.\fP\' you'll see what happens.
.TP
\fIphp \-E 'echo "Lines: $argi\\n";'\fP
Using this PHP command you can count the lines being input.
.TP
\fIphp \-R '@$l+=count(file($argn));' \-E 'echo "Lines:$l\\n";'\fP
In this example PHP expects each input line being a file. It counts all lines
of the files specified by each input line and shows the summarized result.
You may combine this with tools like find and change the php scriptlet.
.TP
\fIphp \-R 'echo "$argn\\n"; fgets(STDIN);'\fP
Since you have access to STDIN from within \-B \-R \-F and \-E you can skip
certain input lines with your code. But note that in such cases $argi only
counts the lines being processed by php itself. Having read this you will
guess what the above program does: skipping every second input line.
.SH TIPS
You can use a shebang line to automatically invoke php
from scripts. Only the CLI version of PHP will ignore
such a first line as shown below:
.P
.PD 0
.RS
#!/bin/php
.P
<?php
.P
 // your script
.P
?>
.RE
.PD 1
.P
.SH SEE ALSO
For a more or less complete description of PHP look here:
.PD 0
.P
.B http://www.php.net/manual/
.PD 1
.P
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
Additional work for the CLI sapi was done by Edin Kadribasic, Marcus Boerger and Johannes Schlueter.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
man/man1/phar.phar.1000064400000000020151732707730010124 0ustar00.so man1/phar.1
man/man1/phpdbg.1000064400000005414151732707730007521 0ustar00.TH phpdbg 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
phpdbg \- The interactive PHP debugger
.SH SYNOPSIS
.B phpdbg
[options]
[\fIfile\fP]
[\fIargs...\fP]
.SH DESCRIPTION
.B phpdbg
is a lightweight, powerful, easy to use debugging platform for PHP.
.SH OPTIONS
.TP 15
.B \-c \fIpath\fB|\fIfile\fR
Look for
.B php.ini
file in the directory
.IR path
or use the specified
.IR file
.TP
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry
.IR foo
with value
.IR bar
.TP
.B \-n
No
.B php.ini
file will be used
.TP
.B \-z \fIfile\fR
Load Zend extension
.IR file
.TP
.BR \-q
Do not print banner on startup
.TP
.B \-v
Enable oplog output
.TP
.B \-b
Disables use of color on the console
.TP
.B \-i \fIpath\fB|\fIfile\fR
Override .phpgdbinit location (implies -I)
.TP
.B \-I
Ignore .phpdbginit (default init file)
.TP
.B \-O \fIfile\fR
Set oplog output to
.IR file
.TP
.B \-r
Jump straight to run
.TP
.B -e
Generate extended information for debugger/profiler
.TP
.B \-E
Enable step through eval()
.TP
.B \-s \fIdelimiter\fP
Read code to execute from stdin with an optional
.IR delimiter
.TP
.B \-S \fIsapi_name\fP
Override SAPI name
.TP
.B \-l \fIport\fP
Setup remote console port
.TP
.B \-a \fIaddress\fP
Setup remote console bind address
.TP
.B \-x
Enable XML output
.TP
.B \-p \fIopcode\fP
Output opcodes and quit
.TP
.B \-h
Print the help overview
.TP
.B \-V
Version number
.TP
.IR args.\|.\|.
Arguments passed to script. Use
.B '\-\-'
.IR args
when first argument starts with
.B '\-'
or script is read from stdin
.SH NOTES
Passing
.B \-rr
will cause
.B phpdbg
to quit after execution, rather than returning to the console
.SH FILES
.TP 15
.B php.ini
The standard configuration file
.TP
.B .phpdbginit
The init file
.SH SEE ALSO
The online manual can be found at
.PD 0
.P
.B http://php.net/manual/book.phpdbg.php
.PD 1
.SH BUGS
You can view the list of known bugs or report any new bug you
found at
.PD 0
.P
.B http://bugs.php.net/
.PD 1
.SH AUTHORS
Written by Felipe Pena, Joe Watkins and Bob Weinand, formatted by Ondřej Surý for Debian project.
.P
A List of active developers can be found at
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphpdbg\fP, for PHP version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
man/man1/phpize.1000064400000001767151732707730007563 0ustar00.TH phpize 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
phpize \- prepare a PHP extension for compiling
.SH SYNOPSIS
.B phpize
[options]
.LP
.SH DESCRIPTION
.B phpize
is a shell script to prepare PHP extension for compiling.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-clean
Remove all created files
.TP
.PD 0
.B \-\-help
Prints usage information
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Prints API version information
.RS
.PD 1
.P
.SH SEE ALSO
.BR php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.3.33.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
pecl/vld/CREDITS000064400000000077151732707730007314 0ustar00vld
Marcus Börger, Derick Rethans, Andrei Zmievski and others
pecl/vld/README.rst000064400000001452151732707730007761 0ustar00README
======

This extension is to show low level PHP structures. It is therefore very
sensitive to changes in the PHP API. If the PECL install doesn't work, please
try the latest version from GitHub::

	git clone https://github.com/derickr/vld.git
	cd vld
	phpize
	./configure
	make && make install

If it still doesn't compile, then VLD is not for you. Patches are welcome
through Pull Requests.

How does it work?
-----------------

There are a few options in the form of ``php.ini`` settings available.

In order for VLD to do anything, you need to set ``vld.active=1``.

If you want to prevent VLD from executing code, set ``vld.execute=0``.

Other settings are also available, but not documented yet.

Please see the project page at http://derickrethans.nl/projects.html#vld for
some more information.

pecl/vld/Changelog000064400000030177151732707730010112 0ustar00Wed Nov 25 13:55:40 CET 2009 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- PHP 5.3 fixes.

Tue Oct 13 17:41:18 CEST 2009 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- The extended value is also used here, in cases assign_* is used with an
  object or array.

Fri Aug 28 13:09:00 CEST 2009 Derick Rethans <derick@derickrethans.nl>
config.w32:
- Fixed config.w32 file.

Mon Mar 30 20:36:55 CEST 2009 Derick Rethans <derick@derickrethans.nl>
vld.c:
- This ought to fix compiling on PHP < 5.3 with ZTS enabled.

Mon Mar 30 20:22:15 CEST 2009 Derick Rethans <derick@derickrethans.nl>
php_vld.h
vle/srm_oparray.c:
- Fixing some issues with va_args.

Thu Mar 05 16:42:32 CET 2009 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Fixed typo.

Tue Nov 04 17:02:45 CET 2008 Marcus B�rger <helly@php.net>
vld.c:
- Fix TSRM build

Thu Oct 23 13:05:07 CEST 2008 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- Fixed syntax errors.

Wed Oct 22 10:40:07 CEST 2008 Derick Rethans <derick@derickrethans.nl>
php_vld.h
vle/srm_oparray.c
vle/vld.c:
- Added Zoë's patch for CVS style formatting.

Fri Oct 03 16:42:47 CEST 2008 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Resolved conflicts.

Thu Oct 02 10:25:54 CEST 2008 Derick Rethans <derick@derickrethans.nl>
package.xml
vle/vld.c:
- Add the config.w32 to the package XML file.

Wed Oct 01 18:31:37 CEST 2008 Derick Rethans <derick@derickrethans.nl>
php_vld.h:
- Fixed compilation with Windows.

Tue Aug 26 19:40:56 CEST 2008 Marcus B�rger <helly@php.net>
config.w32:
- Add config.w32


Sun Aug 17 11:29:20 CEST 2008 Marcus B�rger <helly@php.net>
vld.c:
- Fix build with 5.3+


Sat Jul 12 15:19:07 CEST 2008 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- SEND_VAR_NO_REF needs to use extended value (Patch by Graham K.)

Tue Apr 01 20:00:54 CEST 2008 Derick Rethans <derick@derickrethans.nl>
package.xml
vle/package2.xml
vle/vld.c:
- Prepare for 0.9.1.

Sun Mar 30 15:01:44 CEST 2008 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c
vle/vld.c:
- Fixed off-by-one error.

Sun Jan 06 17:44:06 CET 2008 Marcus B�rger <helly@php.net>
php_vld.h
vle/vld.c:
- Fixes for HEAD
Thu Nov 29 14:13:44 CET 2007 Derick Rethans <derick@derickrethans.nl>
package.xml
vle/package2.xml:
- Updated package files for new release.

Thu Nov 29 14:12:32 CET 2007 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- Some tweaks.

Mon Nov 26 10:01:28 CET 2007 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Fix for when functions are conditionally defined. (Patch by Damjan Cvetko).

Wed Aug 01 09:12:20 CEST 2007 Derick Rethans <derick@derickrethans.nl>
vld.c:
- zend_compile_string is only in PHP 5.2 and higher. (Patch by Gopal)

Sun May 06 15:16:29 CEST 2007 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Added showing of INI entries in phpinfo() output.

Thu Feb 22 10:21:37 CET 2007 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Added support for dumping opcodes for eval() as well.

Wed Jan 17 22:14:11 CET 2007 Sara Goleman <vld@golemon.com>
srm_oparray.c:
PHP5 renamed opcodes, extra info for throw/catch, and display CV names
Sat Dec 23 21:04:40 CET 2006 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- PHP 4.4 compatibility.

Mon Nov 06 18:56:12 CET 2006 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- Make this compile with PHP 4.4 as well.

Mon Nov 06 16:00:25 CET 2006 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c:
- Make CVs not only show nulls.

Wed Oct 25 16:44:22 CEST 2006 Derick Rethans <derick@derickrethans.nl>
php_vld.h
vle/srm_oparray.c
vle/srm_oparray.h
vle/vld.c:
- Added multiple verbosity levels for dumping out information of different
  kinds.
- Added Ilia's patch to add extra verbosity as level 3.
- Added Ilia's patch to fix include's OP2 printing.

Thu Oct 19 22:39:12 CEST 2006 Derick Rethans <derick@derickrethans.nl>
srm_oparray.c
vle/vld.c:
- Improved throw dead code analysis.

Tue Sep 26 11:40:26 CEST 2006 Derick Rethans <derick@derickrethans.nl>
set.c
vle/set.h
vle/Makefile.in
vle/package.xml
vle/srm_oparray.c
vle/srm_oparray.h:
- Added dead code analysis instrumentation.

Thu Aug 31 15:18:57 CEST 2006 Derick Rethans <derick@derickrethans.nl>
vld.c:
- Make sure to handle this in RINIT instead so that it works with APC.

Mon Jun 20 02:47:25 CEST 2005 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Update to PHP 5.1

Wed Mar 02 16:08:53 CET 2005 Derick Rethans <derick@derickrethans.nl>
package2.xml:
- Added package2 xml

Sat Jan 29 23:26:51 CET 2005 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Now commit correct check for FE_RESET jump

Sat Jan 29 23:21:17 CET 2005 Marcus B�rger <helly@php.net>
srm_oparray.c:
- FE_RESET is a jump only since 4.3.11

Sat Jan 29 21:41:36 CET 2005 Marcus B�rger <helly@php.net>
srm_oparray.c
vle/srm_oparray.h:
- Show FE_RESET/FE_FETCH jumps

Wed Jan 19 15:36:00 CET 2005 Derick Rethans <derick@derickrethans.nl>
package.xml
vle/vld.c:
- Go with 0.8.0

Thu Nov 04 22:51:36 CET 2004 Marcus B�rger <helly@php.net>
srm_oparray.c
vle/srm_oparray.h:
- Fix JMPNZ
- Fix for Zend engine >= 2.1 aka PHP >= 5.1

Thu Sep 09 15:15:56 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- JMP_NO_CTOR's jump address is already valid for ZE1

Thu Sep 09 14:59:50 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Remove opcode 150 which is not yet comitted to ZE2

Thu Sep 09 14:58:02 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c
vle/srm_oparray.h:
- Show classes with prefix ':' for ZE2's ZEND_FETCH_CLASS and NEW

Thu Sep 09 13:58:29 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Fixed JMP_NO_CTOR

Tue Aug 31 09:07:25 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Don't show a comma in front of an unused optional op

Mon Aug 30 00:52:38 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Fixed QM_ASSIGN

Mon Aug 30 00:23:05 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Fixed JPNZ

Fri Aug 06 10:29:26 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- ZEND_HANDLE_EXCEPTION does not use any opcode info

Sun Jun 06 14:17:24 CEST 2004 Marcus B�rger <helly@php.net>
vld.c:
- Fix memleak

Sat Apr 17 16:27:48 CEST 2004 Marcus B�rger <helly@php.net>
vld.c:
- Added INI option vld.execute which defaults to 1. Setting it to 0 
  disables execution when vld.active=1. 
- Added INI options vld.skip_prepend and vld_skip_append which default to
  0. Setting them to 1 suppresses output and loading of auto_prepend_file
  and auto_append_file respectively if vld.active=1 and vld.execute=0.

Sat Apr 17 15:14:00 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
- Show all zval types even though this may currently not be used.
  It helps debugging the interpreter.

Fri Apr 16 21:45:29 CEST 2004 Marcus B�rger <helly@php.net>
srm_oparray.c:
The 2nd op is the constant's name in FETCH_CONSTANT's RT mode
Fri Apr 16 10:01:38 CEST 2004 Derick Rethans <derick@derickrethans.nl>
CREDITS:
- Added Marcus to the credits

Tue Dec 16 20:42:29 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/vld.dsw
/vle/vld.dsp
/vle/srm_oparray.c:
- Added windows project files
- Silence warning

Tue Nov 4 15:04:56 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c:
- Fixed jump line display

Mon Oct 20 12:08:01 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/php_vld.h
/vle/srm_oparray.h
/vle/vld.c:
- Fixed email addresses

Mon Oct 20 12:07:27 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c:
- Fixed some opcode displays

Fri Sep 19 10:44:50 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c:
- Added new opcode

Thu Sep 18 20:43:11 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/package.xml:
- Whitespace

Thu Sep 18 20:42:09 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/package.xml:
- Add PEAR package.xml file

Thu Sep 18 17:59:19 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/.cvsignore:
- Update .cvsignore file with phpize crapola

Thu Sep 18 17:56:50 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/vld.c:
- Make only user defined classes show up (Patch by Marcus B�rger)

Mon Apr 7 22:46:26 CEST 2003 Andrei Zmievski <andrei@gravitonic.com>
/vle/vld.c:
Turn off VLD by default.

Mon Apr 7 22:35:19 CEST 2003 Sterling Hughes <sterling@php.net>
/vle/srm_oparray.c
/vle/vld.c:
- Send all output to standard error, that way script output, and vld 
  output can be easily separated.

Mon Apr 7 22:25:51 CEST 2003 Sterling Hughes <sterling@php.net>
/vle/vld.c:
- Fix class handling properly.  In Zend Engine 2 classes are stored as a 
  double pointer, not a single pointer.

Mon Apr 7 22:16:28 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>:
- Fix ChangeLog

Mon Apr 7 22:14:21 CEST 2003 Sterling Hughes <sterling@php.net>
/vle/vld.c:
- Fix a segfault under Zend Engine 2, by checking for class_entry->type ==
  ZEND_USER_CLASS, instead of apply'ing on non-user classes (which causes a
  segfault).

Mon Apr 7 20:28:15 CEST 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c:
- Some layout things

Sat Mar 15 14:07:55 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/vld.c:
- Added an ini setting that turns off opcode dumping (Patch by 
  Marcus B�rger <marcus.boerger@t-online.de>)

Sun Feb 23 20:11:16 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c:
- Fixed disassembling of JMPZNZ. (patch by Stefan Esser <sesser@php.net>)
- Fixed disassembling of POST_INC, PRE_INC, POST_DEC and PRE_DEC.

Thu Jan 2 22:13:19 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/CREDITS:
- Fix CREDITS

Thu Jan 2 22:12:02 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/vld.c:
- Administrivia

Thu Jan 2 22:09:07 CET 2003 Derick Rethans <d.rethans@jdimedia.nl>:
- Fix ChangeLog

Tue Nov 26 22:07:24 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c:

Fri Nov 22 23:26:55 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c:

Fri Nov 22 22:55:11 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/vld.c:
- s/srm/vld/gi

Fri Nov 22 19:10:30 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/srm_oparray.h:
- Print extended value for function calls (# of args in that case).

Fri Nov 22 17:40:44 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c:
- urlencode strings for now
- update a couple more opcode flags
- if result of an op is unused don't display it -> looks much cleaner

Thu Nov 21 21:28:57 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/vld.c:
- Don't show empty opcodes at the end.

Thu Nov 21 17:41:07 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c:

Thu Nov 21 16:35:01 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/vld.c:
- Dump class methods info only if it contains some user functions.

Wed Nov 20 23:27:52 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/srm_oparray.h:
- More work on opcodes.

Wed Nov 20 21:23:55 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/vld.c:
- Clean up and put in the framework for better opcode display.

Wed Nov 13 21:49:56 CET 2002 Andrei Zmievski <andrei@gravitonic.com>
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/vld.c:
- Fix compilation warnings.

Mon Oct 28 16:41:40 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/vld.c:
- Fixed crash bug on parse errors

Wed Oct 23 20:55:10 CEST 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/php_vld.h
/vle/vld.c
/vle/Makefile.in
/vle/config.m4
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/php_vle.h
/vle/vle.c:
- %s/vle/vld/i

Sun Feb 17 14:47:32 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/vle.c:
- Enable optimize

Fri Feb 1 09:54:32 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/vle.c:
- Fixed hash apply functions

Fri Feb 1 09:48:38 CET 2002 Varun Shoor <plot@ript.net>
/vle/vle.c:
- Added Hashes
- Made Class Dump Stuff

Tue Jan 22 00:15:16 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/vle.c:
- Some function dumping stuff

Tue Jan 22 00:01:41 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.c
/vle/srm_oparray.h
/vle/vle.c:
- Some optimizer work

Wed Jan 2 13:53:28 CET 2002 Derick Rethans <d.rethans@jdimedia.nl>
/vle/srm_oparray.h
/vle/vle.c:
- Whitespace

doc/alt-php73-ioncube-loader/USER-GUIDE.txt000064400000026360151732707730014113 0ustar00ionCube Loader 15.5 User Guide
=====================================

This document describes the available php.ini configuration options of the
ionCube Loader that relate to processing of PHP encoded files, and also the
ionCube24 service. It also describes which encoded files can be run by each
ionCube Loader.

PERFORMANCE OF ENCODED FILES
----------------------------

We recommend that the encoded paths feature (see below) is used 
with encoded files in order to maximise performance.

ENCODED FILES  
-------------

INI entry: ioncube.loader.encoded_paths

Purpose:   Specify the locations of encoded files

  The ionCube Loader will normally examine a PHP file before processing
  to test whether it is encoded, and will run the file itself if necessary.
  Although this checking is very efficient, restricting which files the
  Loader tests for being encoded may give extra performance. If set to 
  a series of paths or files, only files in those locations are tested.

  Entries should be separated by a : on Unix and ; on Windows. 
  A path may be prefixed with + or - to add or remove that path from
  the possible locations. + is assumed if no character is given.


Examples: (... means ioncube.loader.encoded_paths)

  * Site with a single encoded module in /var/www/html/modules/RSS

... = "/var/www/html/modules/RSS"


  * As above, with a site configuration file encoded too.

... = "/var/www/html/modules/RSS:/var/www/html/config/config.php"


  * Encoded files may be anywhere except for /var/www/html/framework

... = "/:-/var/www/html/framework"


  * Site with most modules encoded except for one

... = "/var/www/html/modules:-/var/www/html/modules/plain"


  * As above, with an encoded config file in the plain directory

... = "/site/modules:-/site/modules/plain:/site/modules/plain/config.php"


Locations:

  The ioncube.loader.encoded_paths property can be set in a php.ini
  file, in a .htaccess file (when using Apache), in a .user.ini file
  (when using CGI PHP 5.3+) or using ini_set within a PHP script. In ini
  files only the last value will be used for the encoded_paths property. If
  you wish to build up the value in several lines then, for PHP 5.1+, you
  can use the following syntax:

ioncube.loader.encoded_paths = "/path1"  
ioncube.loader.encoded_paths = ${ioncube.loader.encoded_paths}":/path2"  
; etc...

LIMITATIONS OF LOADERS AND ENCODED FILES
----------------------------------------

Encoded files can, in general, run on versions of PHP equal to
or greater than the source language of the Encoder used to
produce them. So a file produced by the Encoder for PHP 7.2
can be run by the Loaders for PHP 7.2, 7.3 and 7.4, but 7.1. This 
means that the Loaders offer good backwards compatibility, 
however there are the following limitations:

  * The Loader for PHP 8.5 can run files produced by the PHP 8.2, 8.3
    and 8.4 Encoders.

  * The Loader for PHP 8.4 can run files produced by the PHP 8.2, 8.3
    and 8.4 Encoders.

  * The Loader for PHP 8.3 can run files produced by the PHP 8.2 and
    8.3 Encoders.

  * The Loader for PHP 8.2 can only run files produced for
    PHP 8.2. Updates for files produced for PHP 8.1 should
    be obtained to use them with PHP 8.2.

  * The Loader for PHP 8.1 can only run files produced for
    PHP 8.1.

  * The Loaders for PHP 7.1 through 7.4 can only run files 
    produced by the Encoders for PHP 7. 

  * The Loader for PHP 7.0 can only run files produced by the
    Encoder for PHP 5.6.

  * The Loaders for PHP 5.5 and PHP 5.6 cannot run files 
    produced by the PHP 4 Encoder.


IONCUBE24 : real-time intrusion protection and PHP error reporting
---------
### (Available for Linux 32 and 64 bit x86 servers using PHP 7)

ionCube24 (https://ioncube24.com) is an ionCube service that uses the
ionCube Loader to provide both real-time protection against the exploit of
website vulnerabilities and alerting of website errors.

Vulnerabilities in PHP applications are common, particularly in sites using 
Wordpress and other plugin based systems. Exploits result in website
defacement or customer data being compromised, and ionCube24 provides a 
uniquely powerful defense. 

PHP errors can cause intermittent or even persistent blank pages or errors for
visitors until discovered, and without active monitoring this could go
undetected indefinitely. ionCube24 active monitoring ensures you are always
aware of problems in your website code.

ionCube24 is free to try, with the server side support built into the Linux
Loaders as standard. With the Loader installed, ionCube24 can be activated
at any time to give active intrusion protection and error reporting.

## php.ini settings

ionCube24 has a powerful real-time web interface to configure, monitor and
manage things, and there are also settings that can be used in a php.ini
file as summarised below.

The setup process at https://ioncube24.com automatically gives the settings
that you need to get started, but you may wish to make changes yourself
once setup. The default values are given with each example.

### Global settings

INI entry: ic24.enable ; default 0

Purpose: Enable or disable all ionCube24 features. 

This defaults to 0 (off), and in this case no ionCube24 behaviour is
activated.

Example:

  ic24.enable = 1

----------

INI entry: ic24.api_access_key ; provided during setup

Purpose: An authentication key for adminstration requests. 

  This value is provided when adding a server to ionCube24.

----------

INI entry: ic24.api_check_ip ; default 1

Purpose: Specify whether the IP for admin requests should be validated

  If set, ionCube24 refuses access to API functions unless the calling IP
  is a known ionCube IP address. This option should be left with the
  default setting unless web requests pass through a proxy and your site
  appears to be accessed from the IP of the proxy instead of ionCube. Note
  that access to API functions will still be authenticated by access key.

----------

INI entry: ic24.api_max_timeout ; default 7

Purpose: Maximum timeout period when sending notifications to ionCube24.

  The actual period is adaptive so that a brief increase in typical latency
  will favour a timeout followed by a retry rather than a longer than usual
  timeout.

----------

INI entry: ic24.home_dir ; no default

Purpose: The home directory for ionCube24 related system files. 

  A location outside of the web root is recommended.  It should be writable
  by the web server during startup.

Example:

ic24.home_dir = /var/www/ic24_home

----------

INI entry: ic24.update_domains_retry_interval ; default 30

Purpose: The number of seconds to wait before retrying a fetch of the set
of domains being managed.


### Security related settings

INI entry: ic24.sec.enable ; default "auto"

Purpose: Enable the intrusion protection feature of ionCube24.

Accepted values:

   * "auto" (default) - allow setting from the ionCube24 control panel.
   * 1 : always enabled.
   * 0 : disabled.

----------

INI entry: ic24.sec.initial_state ; default 1

Purpose: The default for whether security should be enabled or
disabled. The default is to enable protection. Any files on a protected
domain will become blocked if they are changed, so setting this to 0 will
avoid accidental blocking when using ionCube24 for the first time.
Protection may be enabled and disabled using the ionCube24 control panel and
also via the User API.

Accepted values:

   * 1 : protection will be active when ionCube24 initialises.
   * 0 : protection will be disabled.

----------

INI entry: ic24.sec.initial_action ; default "block"

Purpose: The initial setting for how new and modified files should be
treated when about to execute. The default is to block. The action is taken
only if protection is enabled, and the setting may be changed via the
ionCube24 control panel.

Accepted values:

   * "block" : prevent execution of new or modified files
   * "allow" : allow execution of new or modified files

Note that depending on the notification settings, a notification may still
be generated when a new or modified file is about to execute even if it is
not blocked.

----------

INI entry: ic24.sec.initial_notify ; default "always"

Purpose: The initial setting for whether a notification is generated the 
first time an unacknowledged new or modified file is attempted to be
executed. This setting can be changed via the ionCube24 control panel.

Accepted values:

   * "always" : always notify of a new modification 
   * "once"   : only the first detected modification is reported
   * "never"  : never notify of new and modified files

----------

INI entry: ic24.sec.exclusion_key ; provided during setup

Purpose: A key that if present at the start of a file, will identify the
file as trusted. This value is provided when adding a server to ionCube24.

----------

INI entry: ic24.sec.trusted_include_paths ; no default

Purpose: List paths from where files can be included and automatically
trusted.

Example:

ic24.sec.trusted_include_paths = "/var/cache:/var/cache2"

Directories can be excluded from the list by prefixing with a minus
character -. e.g.

"/var/cache:-/var/cache/subdir"

This is useful if your site creates and/or modifies files by itself from
time to time, e.g. in a cache directory. Requests that *directly* access
files on a trusted include path will be blocked but the file itself will
not be blocked, so requests that use the file as intended will still work.
See ioncube24.com for more details once signed up.  As an alternative, if
possible we recommend producing files that include the exclusion key.

----------

INI entry: ic24.sec.block_uploaded_files ; default 1

Purpose: If set, block any uploaded files in ionCube24 that are processed
using the standard PHP mechanism for uploaded files. This applies even if
the file is subsequently included and where included files being
automatically approved with the previous setting.

----------

INI entry: ic24.sec.block_stdin ; default 1

Purpose: Refuse code that PHP sees via stdin.  If disabled, code via
stdin will run without security checking as there is no filepath. This
setting should be left on as PHP would normally never receive a script via
stdin.

### PHP Error reporting settings

INI entry: ic24.phperr.enable ; default "auto"

Purpose: Enable reporting of PHP errors to ionCube24.  When enabled, any
non-ignored errors are reported to ionCube24 in realtime, triggering
alerting so errors can be investigated as necessary.

Accepted values:

   * "auto" (default) - allow setting from the ionCube24 control panel.
   * 1 : always enabled.
   * 0 : disabled.

----------

### Deprecated settings

Deprecated settings are subject to removal in a future
release.

INI entry: ic24.phperr.ignore ; default 0

Purpose: Specify default error levels to always ignore for all domains.

Note that default and per-domain errors to ignore can also be set via the
web interface, and are combined with this setting. Leaving this unset and
using the web interface is recommended for maximum flexibility.

Example: 

ic24.phperr.ignore = E_NOTICE | E_DEPRECATED

(c) ionCube Ltd. 2026
doc/alt-php73-ioncube-loader/loader-wizard.php000064400000542051151732707730015216 0ustar00<?php // -*- c++ -*-

/** 
 * ionCube Loader install Wizard
 *
 * ionCube is a registered trademark of ionCube Ltd. 
 *
 * Copyright (c) ionCube Ltd. 2002-2022
 */


 

define ('ERROR_UNKNOWN_OS',1);
define ('ERROR_UNSUPPORTED_OS',2);
define ('ERROR_UNKNOWN_ARCH',3);
define ('ERROR_UNSUPPORTED_ARCH',4);
define ('ERROR_UNSUPPORTED_ARCH_OS',5);
define ('ERROR_WINDOWS_64_BIT',6);
define ('ERROR_PHP_UNSUPPORTED',7);
define ('ERROR_PHP_DEBUG_BUILD',8);
define ('ERROR_RUNTIME_EXT_DIR_NOT_FOUND',101);
define ('ERROR_RUNTIME_LOADER_FILE_NOT_FOUND',102);
define ('ERROR_INI_NOT_FIRST_ZE',201);
define ('ERROR_INI_WRONG_ZE_START',202);
define ('ERROR_INI_ZE_LINE_NOT_FOUND',203);
define ('ERROR_INI_LOADER_FILE_NOT_FOUND',204);
define ('ERROR_INI_NOT_FULL_PATH',205);
define ('ERROR_INI_NO_PATH',206);
define ('ERROR_INI_NOT_FOUND',207);
define ('ERROR_INI_NOT_READABLE',208);
define ('ERROR_INI_MULTIPLE_IC_LOADER_LINES',209);
define ('ERROR_INI_USER_INI_NOT_FOUND',210);
define ('ERROR_INI_USER_CANNOT_CREATE',211);
define ('ERROR_LOADER_UNEXPECTED_NAME',301);
define ('ERROR_LOADER_NOT_READABLE',302);
define ('ERROR_LOADER_PHP_MISMATCH',303);
define ('ERROR_LOADER_NONTS_PHP_TS',304);
define ('ERROR_LOADER_TS_PHP_NONTS',305);
define ('ERROR_LOADER_WRONG_OS',306);
define ('ERROR_LOADER_WRONG_ARCH',307);
define ('ERROR_LOADER_WRONG_GENERAL',308);
define ('ERROR_LOADER_WIN_SERVER_NONWIN',321);
define ('ERROR_LOADER_WIN_NONTS_PHP_TS',322);
define ('ERROR_LOADER_WIN_TS_PHP_NONTS',323);
define ('ERROR_LOADER_WIN_PHP_MISMATCH',324);
define ('ERROR_LOADER_WIN_COMPILER_MISMATCH',325);
define ('ERROR_LOADER_NOT_FOUND',380);
define ('ERROR_LOADER_PHP_VERSION_UNKNOWN',390);


define ('SERVER_UNKNOWN',0);
define ('HAS_PHP_INI',1);
define ('SERVER_SHARED',2); 
define ('SERVER_VPS',5); 
define ('SERVER_DEDICATED',7); 
define ('SERVER_LOCAL',9);

define ('IONCUBE_IP_ADDRESS',
			'94.101.154.134');
define  ('IONCUBE_ACCESS_ADDRESS',
			'lwaccess.ioncube.com');
define ('LOADERS_PAGE',
            'https://loaders.ioncube.com/'); 
define ('SUPPORT_SITE',
            'https://support.ioncube.com/');                                 
define ('WIZARD_SUPPORT_TICKET_DEPARTMENT',
			'3');
define ('LOADER_FORUM_URL',
            'https://forum.ioncube.com/viewforum.php?f=4');                  
define ('LOADERS_FAQ_URL',
            'https://www.ioncube.com/faqs/loaders.php');                     
define ('UNIX_ERRORS_URL',
            'https://www.ioncube.com/loaders/unix_startup_errors.php');      
define ('LOADER_WIZARD_URL',
            LOADERS_PAGE);                                                  
define ('ENCODER_URL',
            'https://www.ioncube.com/sa_encoder.php');                       
define ('LOADER_VERSION_URL',
            'https://www.ioncube.com/feeds/product_info/versions.php');    
define ('WIZARD_LATEST_VERSION_URL',
            LOADER_VERSION_URL . '?item=loader-wizard'); 
define ('PHP_COMPILERS_URL',
            LOADER_VERSION_URL . '?item=php-compilers');
define ('LOADER_PLATFORM_URL',
            LOADER_VERSION_URL . '?item=loader-platforms-all');   
define ('LOADER_LATEST_VERSIONS_URL',
            LOADER_VERSION_URL . '?item=loader-versions'); 
define ('LOADER_PHP_VERSION_URL',
            LOADER_VERSION_URL . '?item=loader-php-support'); 
define ('WIZARD_STATS_URL',
            'https://www.ioncube.com/feeds/stats/wizard.php');    
define ('IONCUBE_DOWNLOADS_SERVER',
            'https://downloads.ioncube.com/loader_downloads');          
define ('IONCUBE24_URL',
			'https://ioncube24.com');
define ('IONCUBE_CONNECT_TIMEOUT',4);

define ('DEFAULT_SELF','/ioncube/loader-wizard.php');
define ('LOADER_NAME_CHECK',true);
define ('LOADER_EXTENSION_NAME','ionCube Loader');
define ('LOADER_SUBDIR','ioncube');
define ('WINDOWS_IIS_LOADER_DIR', 'system32');
define ('ADDITIONAL_INI_FILE_NAME','00-ioncube.ini');
define ('UNIX_SYSTEM_LOADER_DIR','/usr/local/ioncube');
define ('RECENT_LOADER_VERSION','4.0.7');
define ('LATEST_LOADER_MAJOR_VERSION',12);
define ('LOADERS_PACKAGE_PREFIX','ioncube_loaders_');
define ('SESSION_LIFETIME_MINUTES',360);
define ('WIZARD_EXPIRY_MINUTES',2880);
define ('IONCUBE_WIZARD_EXPIRY_MINUTES',10080);
define ('MIN_INITIALISE_TIME',4);
define ('IC24_ENABLED_INI_PROPERTY',"ic24.enable");

    run();


function php4_http_build_query($formdata, $numeric_prefix = null, $key = null ) {
    $res = array();
    foreach ((array)$formdata as $k=>$v) {
        $tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
        if ($key) $tmp_key = $key.'['.$tmp_key.']';
        if ( is_array($v) || is_object($v) ) {
            $res[] = php4_http_build_query($v, null , $tmp_key);
        } else {
            $res[] = $tmp_key."=".urlencode($v);
        }
   }
   $separator = ini_get('arg_separator.output');
   return implode($separator, $res);
}


function script_version()
{
    return "2.74";
}

function retrieve_latest_wizard_version()
{
    $v = false;

    $s = trim(remote_file_contents(WIZARD_LATEST_VERSION_URL));
    if (preg_match('/^\d+([.]\d+)*$/', $s)) {
        $v = $s;
    }

    return $v;
}

function latest_wizard_version()
{
    if (!isset($_SESSION['latest_wizard_version'])) {
        $_SESSION['latest_wizard_version'] = retrieve_latest_wizard_version();
    } 
    return $_SESSION['latest_wizard_version'];
}

function update_is_available($lv)
{
    if (is_numeric($lv)) {
        $lv_parts = explode('.',$lv);
        $script_parts = explode('.',script_version());
        return ($lv_parts[0] > $script_parts[0] || ($lv_parts[0] == $script_parts[0] && $lv_parts[1] > $script_parts[1]));
    } else {
        return null;
    }
}

function check_for_wizard_update($echo_message = false)
{
    $latest_version = latest_wizard_version();
    $update_available = update_is_available($latest_version);

    if ($update_available) {
        if ($echo_message) {
            echo '<p class="alert">An updated version of this Wizard script is available <a href="' . LOADER_WIZARD_URL . '">here</a>.</p>';
        }
        return $latest_version;
    } else {
        return $update_available;
    }
}


function remote_file_contents($url)
{
    $remote_file_opening = ini_get('allow_url_fopen');
    $contents = false;
    if (isset($_SESSION['timing_out']) && $_SESSION['timing_out']) {
        return false;
    }
    @session_write_close();
    $timing_out = 0;
    if ($remote_file_opening) {
        $fh = @fopen($url,'rb');
        if ($fh) {
            stream_set_blocking($fh,0);
            stream_set_timeout($fh,IONCUBE_CONNECT_TIMEOUT);
            while (!feof($fh)) {
                $result = fread($fh, 8192);
                $info = stream_get_meta_data($fh);
                $timing_out = $info['timed_out']?1:0;
                if ($timing_out) {
                    break;
                }
                if ($result !== false) {
                    $contents .= $result;
                } else {
                    break;
                }
            }
            fclose($fh);
        } else {
            $timing_out = 1;
        }
    } elseif (extension_loaded('curl')) {
            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,IONCUBE_CONNECT_TIMEOUT);
            $output = curl_exec($ch);
            $info = curl_getinfo($ch);
            $timing_out = ($info['http_code'] >= 400)?1:0;
            curl_close($ch);

            if (is_string($output)) {
                $contents = $output;
            }
    } else {
        $timing_out = 1;
    }
    @session_start();
    $_SESSION['timing_out'] = $timing_out;
    return $contents;
}

function php_version()
{
    $v = explode('.',PHP_VERSION);

    return array(
           'major'      =>  $v[0],
           'minor'      =>  $v[1],
           'release'    =>  $v[2]);
}

function php_version_maj_min()
{
    $vprts = php_version();
    return ($vprts['major'] . '.' . $vprts['minor']);
}

function is_supported_php_version()
{
    $v = php_version(); 

    return ((($v['major'] == 4) && ($v['minor'] >= 1)) ||
      (($v['major'] == 5) && (($v['minor'] >= 1) || ($v['release'] >= 3))) ||
	  $v['major'] == 7 || ($v['major'] == 8 && $v['minor'] >= 1));
}

function is_php_version_or_greater($major,$minor,$release = 0)
{
    $version = php_version();
    return ($version['major'] > $major || 
            ($version['major'] == $major && $version['minor'] > $minor) ||
            ($version['major'] == $major && $version['minor'] == $minor && $version['release'] >= $release));
}

function ini_file_name()
{
    $sysinfo = get_sysinfo();
    return (!empty($sysinfo['PHP_INI'])?$sysinfo['PHP_INI_BASENAME']:'php.ini');
}

function get_remote_session_value($session_var,$remote_url,$default_function)
{
    if (!isset($_SESSION[$session_var])) {
        $serialised_res = remote_file_contents($remote_url);
        $unserialised_res = @unserialize($serialised_res);
        if (empty($unserialised_res)) {
            $unserialised_res = call_user_func($default_function);
        } else {
			$_SESSION['remote_access_successful'] = 1;
		}
        if (false === $unserialised_res) {
            $unserialised_res = '';
        }
        $_SESSION[$session_var] = $unserialised_res;
    }
    return $_SESSION[$session_var];
}

function get_file_contents($file)
{
    if (empty($file)) {
        return "";
    }
    if (function_exists('file_get_contents')) {
        $strs = @file_get_contents($file);
    } else {
        $lines = @file($file);
        $strs = join(' ',$lines);
    }
    return $strs;
}

function default_platform_list()
{
    $platforms = array();


    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC6', 'is_legacy' => 1,       'os_mod' => '_vc6',     'arch'=>'x86',  'dirname'=>'win32', 'us1-dir'=>'windows_vc6/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC6 (Non-TS)',   'is_legacy' => 1,  'os_mod' => '_nonts_vc6',   'arch'=>'x86',  'dirname'=>'win32-nonts', 'us1-dir'=>'windows_vc6/x86-nonts' );

    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC9',        'os_mod' => '_vc9',     'arch'=>'x86',  'dirname'=>'win32_vc9', 'us1-dir'=>'windows_vc9/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC9 (Non-TS)',   'os_mod' => '_nonts_vc9',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc9', 'us1-dir'=>'windows_vc9/x86-nonts' );
	
	 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11',        'os_mod' => '_vc11',     'arch'=>'x86',  'dirname'=>'win32_vc11', 'us1-dir'=>'windows_vc11/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11 (Non-TS)',   'os_mod' => '_nonts_vc11',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc11', 'us1-dir'=>'windows_vc11/x86-nonts' );
	
	$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11',        'os_mod' => '_vc11',     'arch'=>'x86-64',  'dirname'=>'win64_vc11', 'us1-dir'=>'windows_vc11/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11 (Non-TS)',   'os_mod' => '_nonts_vc11',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc11', 'us1-dir'=>'windows_vc11/amd64-nonts' );
	
	 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14',        'os_mod' => '_vc14',     'arch'=>'x86',  'dirname'=>'win32_vc14', 'us1-dir'=>'windows_vc14/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14 (Non-TS)',   'os_mod' => '_nonts_vc14',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc14', 'us1-dir'=>'windows_vc14/x86-nonts' );
	
		$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14',        'os_mod' => '_vc14',     'arch'=>'x86-64',  'dirname'=>'win64_vc14', 'us1-dir'=>'windows_vc14/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14 (Non-TS)',   'os_mod' => '_nonts_vc14',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc14', 'us1-dir'=>'windows_vc14/amd64-nonts' );
	
		 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15',        'os_mod' => '_vc15',     'arch'=>'x86',  'dirname'=>'win32_vc15', 'us1-dir'=>'windows_vc15/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15 (Non-TS)',   'os_mod' => '_nonts_vc15',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc15', 'us1-dir'=>'windows_vc15/x86-nonts' );
	
		$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15',        'os_mod' => '_vc15',     'arch'=>'x86-64',  'dirname'=>'win64_vc15', 'us1-dir'=>'windows_vc15/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15 (Non-TS)',   'os_mod' => '_nonts_vc15',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc15', 'us1-dir'=>'windows_vc15/amd64-nonts' );

    $platforms[] = array('os'=>'lin', 'os_human'=>'Linux',              'arch'=>'x86',      'dirname'=>'linux_i686-glibc2.3.4', 'us1-dir'=>'linux/x86');
    $platforms[] = array('os'=>'lin', 'os_human'=>'Linux',              'arch'=>'x86-64',   'dirname'=>'linux_x86_64-glibc2.3.4', 'us1-dir'=>'linux/x86_64');
$platforms[] = array('os'=>'lin','os_human'=>'Linux',               'arch'=>'ppc',      'dirname'=>'linux_ppc-glibc2.3.4','us1-dir'=>'linux/ppc');
            $platforms[] = array('os'=>'lin','os_human'=>'Linux',               'arch'=>'ppc64',    'dirname'=>'linux_ppc64-glibc2.5','us1-dir'=>'linux/ppc64');
    

$platforms[] = array('os'=>'dra', 'os_human'=>'DragonFly', 'arch'=>'x86',      'dirname'=>'dragonfly_i386-1.7', 'us1-dir'=>'Dragonfly/x86');

$platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 4', 'os_mod'=>'_4',  'arch'=>'x86',      'dirname'=>'freebsd_i386-4.8', 'us1-dir'=>'FreeBSD/v4');

    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 6', 'os_mod'=>'_6',  'arch'=>'x86',      'dirname'=>'freebsd_i386-6.2', 'us1-dir'=>'FreeBSD/v6/x86');

    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 6', 'os_mod'=>'_6',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-6.2', 'us1-dir'=>'FreeBSD/v6/AMD64');


    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 7', 'os_mod'=>'_7',  'arch'=>'x86',      'dirname'=>'freebsd_i386-7.3', 'us1-dir'=>'FreeBSD/v7/x86');
    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 7', 'os_mod'=>'_7',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-7.3', 'us1-dir'=>'FreeBSD/v7/AMD64');


    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 8', 'os_mod'=>'_8',  'arch'=>'x86',      'dirname'=>'freebsd_i386-8.0', 'us1-dir'=>'FreeBSD/v8/x86');
    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 8', 'os_mod'=>'_8',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-8.0', 'us1-dir'=>'FreeBSD/v8/AMD64');
    
    $platforms[] = array('os'=>'bsd', 'os_human'=>'BSDi',     'is_legacy' => 1,           'arch'=>'x86',      'dirname'=>'bsdi_i386-4.3.1');
    $platforms[] = array('os'=>'net', 'os_human'=>'NetBSD',             'arch'=>'x86',      'dirname'=>'netbsd_i386-2.1','us1-dir'=>'NetBSD/x86');
    $platforms[] = array('os'=>'net', 'os_human'=>'NetBSD',             'arch'=>'x86-64',   'dirname'=>'netbsd_amd64-2.0','us1-dir'=>'NetBSD/x86_64');
    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.2', 'os_mod'=>'_4.2',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.2', 'us1-dir'=>'OpenBSD/x86');

    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.5', 'os_mod'=>'_4.5',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.5', 'us1-dir'=>'OpenBSD/x86');
    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.6', 'os_mod'=>'_4.6',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.6', 'us1-dir'=>'OpenBSD/x86');

    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.7', 'os_mod'=>'_4.7',  'arch'=>'x86-64', 'dirname'=>'openbsd_amd64-4.7', 'us1-dir' => 'OpenBSD/x86_64');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',    'is_legacy' => 1, 'arch'=>'ppc',      'dirname'=>'osx_powerpc-8.5','us1-dir'=>'OSX/ppc');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',               'arch'=>'x86',      'dirname'=>'osx_i386-8.11','us1-dir'=>'OSX/x86');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',               'arch'=>'x86-64',       'dirname'=>'osx_x86-64-10.2','us1-dir'=>'OSX/x86_64');

    $platforms[] = array('os'=>'sun', 'os_human'=>'Solaris',  'is_legacy' => 1,          'arch'=>'sparc',    'dirname'=>'solaris_sparc-5.9', 'us1-dir'=>'Solaris/sparc');

    $platforms[] = array('os'=>'sun', 'os_human'=>'Solaris',            'arch'=>'x86',      'dirname'=>'solaris_i386-5.10','us1-dir'=>'Solaris/x86');

    return $platforms;
}

function get_loader_platforms()
{
    return get_remote_session_value('loader_platform_info',LOADER_PLATFORM_URL,'default_platform_list');
}

function get_platforminfo()
{
    static $platforminfo;

    if (empty($platforminfo)) {
        $platforminfo = get_loader_platforms();
    }
    return $platforminfo;
}

function default_php_versions()
{
	return array();
}

function get_php_versions()
{
	return get_remote_session_value('php_version_info',LOADER_PHP_VERSION_URL,'default_php_versions');
}


function get_max_php_version_supported()
{
	static $max_php_version;
	
	if (empty($max_php_version)) {
		$php_versions = get_php_versions();
		
		$dirname = calc_dirname();
		
		if (array_key_exists($dirname,$php_versions)) {
			$max_php_version = $php_versions[$dirname];
		} else {
			$max_php_version = NULL;
		}
	}
	
	return $max_php_version;
}

function is_after_max_php_version_supported()
{
	$is_too_recent_php = false;
	
	$supported_php_version = get_max_php_version_supported();
	
	if (!is_null($supported_php_version)) {
		$pversion = php_version();
		
		$supported_parts = explode('.',$supported_php_version);
		$is_too_recent_php = ($supported_parts[0] < $pversion['major'] || ($supported_parts[0] == $pversion['major'] && $supported_parts[1] < $pversion['minor']));
	}
	
	if ($is_too_recent_php) {
		return $supported_php_version;
	} else {
		return false;
	}
}

function supported_os_variants($os_code,$arch_code)
{
    if (empty($os_code)) {
        return ERROR_UNKNOWN_OS;
    }
    if (empty($arch_code)) {
        return ERROR_UNKNOWN_ARCH;
    }

    $os_found = false;
    $arch_found = false;
    $os_arch_matches = array();
    $pinfo = get_platforminfo();

    foreach ($pinfo as $p) {
        if ($p['os'] == $os_code && $p['arch'] == $arch_code) {
            $os_arch_matches[$p['os_human']] = (isset($p['os_mod']))?(0 + (int) str_replace('_','',$p['os_mod'])):'';
        } 
        if ($p['os'] == $os_code) {
            $os_found = true;
        } elseif ($p['arch'] == $arch_code) {
            $arch_found = true;
        }
    }
    if (!empty($os_arch_matches)) {
        asort($os_arch_matches);
        return $os_arch_matches;
    } elseif (!$os_found) {
        return ERROR_UNSUPPORTED_OS;
    } elseif (!$arch_found) {
        return ERROR_UNSUPPORTED_ARCH;
    } else {
        return ERROR_UNSUPPORTED_ARCH_OS;
    }
}

function default_win_compilers()
{
    return array('VC6','VC9','VC11','VC14','VC15', 'VC16');
}

function supported_win_compilers()
{
    static $win_compilers;

    if (empty($win_compilers)) {
        $win_compilers = find_win_compilers();
    }
    return $win_compilers;
}

function find_win_compilers()
{
    return get_remote_session_value('php_compilers_info',PHP_COMPILERS_URL,'default_win_compilers');
}

function server_software_info()
{
    $ss = array('full' => '','short' => '');
    $ss['full'] = $_SERVER['SERVER_SOFTWARE'];

    if (preg_match('/apache/i', $ss['full'])) {
        $ss['short'] = 'Apache';
    } else if (preg_match('/IIS/',$ss['full'])) {
        $ss['short'] = 'IIS';
    } else {
        $ss['short'] = '';
    }
    return $ss;
}

function match_arch_pattern($str)
{
    $arch = null;
    $arch_patterns = array(
             'i.?86'        => 'x86',
             'x86[-_]64'    => 'x86',
             'x86'          => 'x86',
             'amd64'        => 'x86',
             'SMP Tue Jan 01 00:00:00 CEST 2000 all GNU\/Linux' => 'x86',
             'ppc64'        => 'ppc',
             'ppc'          => 'ppc',
             'powerpc'      => 'ppc',
             'sparc'        => 'sparc',
             'sun'          => 'sparc',
			 'armv7l'       => 'armv7l',
             'aarch64'      => 'aarch64'
         );

    foreach ($arch_patterns as $token => $a) {
        if (preg_match("/$token/i", $str)) {
          $arch = $a;
          break;
        }
    }
    return $arch;
}

function required_loader_arch($mach_info,$os_code,$wordsize)
{
    if ($os_code == 'win') {
        $arch = ($wordsize == 32)?'x86':'x86-64';
    } elseif (!empty($os_code)) {
        $arch = match_arch_pattern($mach_info);
        if ($wordsize == 64) {
            if ($arch == 'x86') {
                $arch = 'x86-64';
            } elseif ($arch == 'ppc') {
                $arch = 'ppc64';
            }
        }
    } else {
        $arch = ERROR_UNKNOWN_ARCH;
    }
    return $arch;
}

function uname($part = 'a')
{
    $result = '';
    if (!function_is_disabled('php_uname')) {
        $result = @php_uname($part);
    } elseif (function_exists('posix_uname') && !function_is_disabled('posix_uname')) {
        $posix_equivs = array(
                     'm' => 'machine',
                     'n' => 'nodename',
                     'r' => 'release',
                     's' => 'sysname'
                 );
        $puname = @posix_uname();
        if ($part == 'a' || !array_key_exists($part,$posix_equivs)) {
           $result = join(' ',$puname);
        } else {
           $result = $puname[$posix_equivs[$part]];
        }
    } else {
        if (!function_is_disabled('phpinfo')) {
            ob_start();
            phpinfo(INFO_GENERAL);
            $pinfo = ob_get_contents();
            ob_end_clean();
            if (preg_match('~System.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$match)) {
                $uname = $match[2];
                if ($part == 'r') {
                    if (!empty($uname) && preg_match('/\S+\s+\S+\s+([0-9.]+)/',$uname,$matchver)) {
                        $result = $matchver[1];
                    } else {
                        $result = '';
                    }
                } else {
                    $result = $uname;
                }
            }
        } else {
            $result = '';
        }
    }
    return $result;
}

function calc_word_size($os_code)
{
    $wordsize = null;
    if ('win' === $os_code) {
        ob_start();
        phpinfo(INFO_GENERAL);
        $pinfo = ob_get_contents();
        ob_end_clean();
        if (preg_match('~Compiler.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$compmatch)) {
            if (preg_match("/(VC[0-9]+)/i",$compmatch[2],$vcmatch)) {
                $compiler = strtoupper($vcmatch[1]);
            } elseif (stripos(trim($compmatch[2]),"Visual C++ 2019") === 0) {
                $compiler = 'VC16';
            } else {
                $compiler = 'VC6';
            }
        } else {
            $compiler = 'VC6';
        }
        if ($compiler === 'VC9' || $compiler === 'VC11' || $compiler === 'VC14' 
                || $compiler === 'VC15' || $compiler === 'VC16') {
			if (preg_match('~Architecture.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$archmatch)) {
				if (preg_match("/x64/i",$archmatch[2])) {
					$wordsize = 64;
				} else {
					$wordsize = 32;
				}
            } elseif (isset($_ENV['PROCESSOR_ARCHITECTURE']) && preg_match('~(amd64|x86-64|x86_64)~i',$_ENV['PROCESSOR_ARCHITECTURE'])) {
                if (preg_match('~Configure Command.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$confmatch)) {
                    if (preg_match('~(x64|lib64|system64)~i',$confmatch[2])) {
                        $wordsize = 64;
                    }
                }
            } else {
				$wordsize = 32;
			}
        }
    }
    if (empty($wordsize)) {
        $wordsize = ((-1^0xffffffff)?64:32);
    }
    return $wordsize;
}

function required_loader($unamestr = '')
{
    $un = empty($unamestr)?uname():$unamestr;

    $php_major_version = substr(PHP_VERSION,0,3);

    $os_name = substr($un,0,strpos($un,' '));
    $os_code = empty($os_name)?'':strtolower(substr($os_name,0,3));

    $wordsize = calc_word_size($os_code);

	if ($os_code == 'win' && $wordsize == 64 && $php_major_version < '5.5') {
        $arch = ERROR_WINDOWS_64_BIT;
	} else {
		$arch = required_loader_arch($un,$os_code,$wordsize);
	}
    if (!is_string($arch)) {
        return $arch;
    }
    $os_variants = supported_os_variants($os_code,$arch);
    if (!is_array($os_variants)) {
        return $os_variants;
    }

    $os_ver = '';
    if (preg_match('/([0-9.]+)/',uname('r'),$match)) {
        $os_ver = $match[1];
    }
    $os_ver_parts = preg_split('@\.@',$os_ver);

    $os_code_h = ($os_code == 'dar' ? 'mac' : $os_code);

    $loader_sfix = (($os_code == 'win') ? 'dll' : 'so');
    $file = "ioncube_loader_{$os_code_h}_{$php_major_version}.{$loader_sfix}";

    if ($os_code == 'win') {
        $os_name = 'Windows';
        $file_ts = $file;
        $os_name_qual = 'Windows';
    } else {
        $os_names = array_keys($os_variants);
        if (count($os_variants) > 1) {
            $parts = explode(" ",$os_names[0]); 
            $os_name = $parts[0];
            $os_name_qual = $os_name . ' ' . $os_ver_parts[0] . '.' . $os_ver_parts[1];
        } else {
            $os_name = $os_names[0];
            $os_name_qual = $os_name;
        }
        $file_ts = "ioncube_loader_{$os_code_h}_{$php_major_version}_ts.{$loader_sfix}";
    }

    return array(
           'uname'      =>  $un,
           'arch'       =>  $arch,
           'oscode'     =>  $os_code,
           'oscode_h'   =>  $os_code_h,
           'osname'     =>  $os_name,
           'osnamequal' =>  $os_name_qual,
           'osvariants' =>  $os_variants,
           'osver'      =>  $os_ver,
           'osver2'     =>  $os_ver_parts,
           'file'       =>  $file,
           'file_ts'    =>  $file_ts,
           'wordsize'   =>  $wordsize
       );
}

function ic_system_info()
{
    $thread_safe = null;
    $debug_build = null;
    $cgi_cli = false;
	$is_fpm = false;
    $is_cgi = false;
    $is_cli = false;
    $php_ini_path = '';
    $php_ini_dir = '';
    $php_ini_add = '';
    $is_supported_compiler = true;
    $php_compiler = is_ms_windows()?'VC6':'';

    ob_start();
    phpinfo(INFO_GENERAL);
    $php_info = ob_get_contents();
    ob_end_clean();

    $breaker = (php_sapi_name() == 'cli')?"\n":'</tr>';
    $lines = explode($breaker,$php_info);
    foreach ($lines as $line) {
        if (preg_match('/command/i',$line)) {
          continue;
        }

        if (preg_match('/thread safety/i', $line)) {
          $thread_safe = (preg_match('/(enabled|yes)/i', $line) != 0);
        }

        if (preg_match('/debug build/i', $line)) {
          $debug_build = (preg_match('/(enabled|yes)/i', $line) != 0);
        }

        if (preg_match('~configuration file.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
          $php_ini_path = $match[2];

          if (!@file_exists($php_ini_path)) {
                $php_ini_path = '';
          }
        }
        if (preg_match('~dir for additional \.ini files.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
            $php_ini_dir = $match[2];
            if (!@file_exists($php_ini_dir)) {
                $php_ini_dir = '';
            }
        }
        if (preg_match('~additional \.ini files parsed.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
            $php_ini_add = $match[2];
        }
        if (preg_match('/compiler/i',$line)) {
            $supported_match = join('|',supported_win_compilers());
            $is_supported_compiler = preg_match("/($supported_match)/i",$line);
            if (preg_match("/(VC[0-9]+)/i",$line,$match)) {
                $php_compiler = strtoupper($match[1]);
            } elseif (preg_match("/Visual C\+\+ 2017/i",$line)) {
				$php_compiler = "VC15";
				$is_supported_compiler = true;
            } elseif (preg_match("/Visual C\+\+ 2019/i",$line)) {
				$php_compiler = "VC16";
				$is_supported_compiler = true;
			} else {
                $php_compiler = '';
            }
        }
    }
    $is_cgi = strpos(php_sapi_name(),'cgi') !== false;
    $is_cli = strpos(php_sapi_name(),'cli') !== false;
	$is_fpm = strpos(php_sapi_name(),'fpm-fcgi') !== false;
    $cgi_cli = $is_cgi || $is_cli;

    $ss = server_software_info();
	
	if ($is_fpm) {
		$ss['short'] = 'PHP-FPM';
		$ss['full'] = 'PHP-FPM ' . $ss['full'];
	}

    if (!$php_ini_path && function_exists('php_ini_loaded_file')) {
        $php_ini_path = php_ini_loaded_file();
        if ($php_ini_path === false) {
            $php_ini_path = '';
        }
    }
    if (!empty($php_ini_path)) {
        $real_path = @realpath($php_ini_path);
        if (false !== $real_path) {
            $php_ini_path = $real_path;
        }
    }

    $php_ini_basename = basename($php_ini_path);

    return array(
           'THREAD_SAFE'        => $thread_safe,
           'DEBUG_BUILD'        => $debug_build,
           'PHP_INI'            => $php_ini_path,
           'PHP_INI_BASENAME'   => $php_ini_basename,
           'PHP_INI_DIR'        => $php_ini_dir,
           'PHP_INI_ADDITIONAL' => $php_ini_add,
           'PHPRC'              => getenv('PHPRC'),
           'CGI_CLI'            => $cgi_cli,
           'IS_CGI'             => $is_cgi,
           'IS_CLI'             => $is_cli,
		   'IS_FPM'				=> $is_fpm,
           'PHP_COMPILER'       => $php_compiler,
           'SUPPORTED_COMPILER' => $is_supported_compiler,
           'FULL_SS'            => $ss['full'],
           'SS'                 => $ss['short']);
}

function is_possibly_dedicated_or_local()
{
    $sys = get_sysinfo();

    return (empty($sys['PHP_INI']) || !@file_exists($sys['PHP_INI']) || (is_readable($sys['PHP_INI']) && (0 !== strpos($sys['PHP_INI'],$_SERVER['DOCUMENT_ROOT']))));
}

function is_local()
{
    $ret = false;
    if ($_SERVER["SERVER_NAME"] == 'localhost') {
        $ret = true;
    } else {
        $ip_address = strtolower($_SERVER["REMOTE_ADDR"]);
        if (strpos(':',$ip_address) === false) {
            $ip_parts = explode('.',$ip_address);
            $ret = (($ip_parts[0] == 10) || 
                    ($ip_parts[0] == 172 && $ip_parts[1] >= 16 &&  $ip_parts[1] <= 31) ||
                    ($ip_parts[0] == 192 && $ip_parts[1] == 168));
        } else {
            $ret = ($ip_address == '::1') || (($ip_address[0] == 'f') && ($ip_address[1] >= 'c' && $ip_address[1] <= 'f'));
        }
    }
    return $ret;
}

function is_shared()
{
    return !is_local() && !is_possibly_dedicated_or_local();
}

function find_server_type($chosen_type = '',$type_must_be_chosen = false,$set_session = false)
{
    $server_type = SERVER_UNKNOWN;
    if (empty($chosen_type)) {
        if ($type_must_be_chosen) {
            $server_type = SERVER_UNKNOWN;
        } else {
            if (isset($_SESSION['server_type']) && $_SESSION['server_type'] != SERVER_UNKNOWN) {
                $server_type = $_SESSION['server_type'];
            } elseif (is_local()) {
                $server_type = SERVER_LOCAL;
            } elseif (!is_possibly_dedicated_or_local()) {
                $server_type = SERVER_SHARED;
            } else {
                $server_type = SERVER_UNKNOWN;
            } 
        }
    } else {
        switch ($chosen_type)  {
            case 's':
                $server_type = SERVER_SHARED;
                break;
            case 'd':
                $server_type = SERVER_DEDICATED;
                break;
            case 'l':
                $server_type = SERVER_LOCAL;
                break;
            default:
                $server_type = SERVER_UNKNOWN;
                break;
        }
    }
    if ($set_session) {
        $_SESSION['server_type'] = $server_type;
    }
    return $server_type;
}

function server_type_string()
{
    $server_code = find_server_type();
    switch ($server_code) {
        case SERVER_SHARED:
            $server_string = 'SHARED';
            break;
        case SERVER_LOCAL:
            $server_string = 'LOCAL';
            break;
        case SERVER_DEDICATED:
            $server_string = 'DEDICATED';
            break;
        default:
            $server_string = 'UNKNOWN';
            break;
    }
    return $server_string;
}

function server_type_code()
{
    $server_code = find_server_type();
    switch ($server_code) {
        case SERVER_SHARED:
            $server_char = 's';
            break;
        case SERVER_LOCAL:
            $server_char = 'l';
            break;
        case SERVER_DEDICATED:
            $server_char = 'd';
            break;
        default:
            $server_char = '';
            break;
    }
    return $server_char;
}

function get_sysinfo()
{
    static $sysinfo;

    if (empty($sysinfo)) {
        $sysinfo = ic_system_info();
    }
    return $sysinfo;
}

function get_loaderinfo()
{
    static $loader;

    if (empty($loader)) {
        $loader = required_loader();
    }
    return $loader;
}

function is_ms_windows()
{
    $loader_info = get_loaderinfo();
    return ($loader_info['oscode'] == 'win');
}

function function_is_disabled($fn_name)
{
    $disabled_functions=explode(',',ini_get('disable_functions'));
    return in_array($fn_name, $disabled_functions);
}

function selinux_is_enabled()
{
    $se_enabled = false;

    if (!is_ms_windows()) {
        $cmd = (string) @shell_exec('sestatus');
        $se_enabled = preg_match('/enabled/i',$cmd);
    }

    return $se_enabled;
}

function grsecurity_is_enabled()
{
    $gr_enabled = false;

    if (!is_ms_windows()) {
        $cmd = (string) @shell_exec('gradm -S');
        $gr_enabled = preg_match('/enabled/i',$cmd);
    }

    return $gr_enabled;
}

function threaded_and_not_cgi()
{
    $sys = get_sysinfo();
    return($sys['THREAD_SAFE'] && !$sys['IS_CGI']);
}

function is_restricted_server($only_safe_mode = false)
{
    $disable_functions = ini_get('disable_functions');
    $open_basedir = ini_get('open_basedir');
    $php_restrictions = !empty($disable_functions) || !empty($open_basedir);
    $system_restrictions = selinux_is_enabled() || grsecurity_is_enabled();
    $non_safe_mode_restrictions = $php_restrictions || $system_restrictions;
    return (ini_get('safe_mode') || (!$only_safe_mode && $non_safe_mode_restrictions));
}

function server_restriction_warnings()
{
    $warnings = array();

    if (find_server_type() == SERVER_SHARED) {
        if (is_restricted_server()) {
            $warnings[] = "Server restrictions are in place which might affect the operation of this Loader Wizard or prevent the installation of the Loader.";
        }
    } else {
        $warning_suffix = "This may affect the operation of this Loader Wizard.";
        if (ini_get('safe_mode')) {
            $warnings[] = "Safe mode is in effect on the server. " . $warning_suffix;
        } 
        $disabled_functions = ini_get('disable_functions');
        if (!empty($disabled_functions)) {
            $warnings[] = "Some functions are disabled through disable_functions. " . $warning_suffix;
        }
        $open_basedir = ini_get('open_basedir');
        if (!empty($open_basedir)) {
            $warnings[] = "Open basedir restrictions are in effect. " . $warning_suffix;
        }
    }
    return $warnings;
}

function own_php_ini_possible($only_safe_mode = false)
{
    $sysinfo = get_sysinfo();
    return ($sysinfo['CGI_CLI'] && !is_ms_windows() && !is_restricted_server($only_safe_mode));
}

function extension_dir()
{
    $extdir = ini_get('extension_dir');
    if ($extdir == './' || ($extdir == '.\\' && is_ms_windows())) {
        $extdir = '.';
    }
    return $extdir;
}

function possibly_selinux()
{
    $loaderinfo = get_loaderinfo();
    $se_env = (getenv("SELINUX_INIT"));
    return (strtolower($loaderinfo['osname']) == 'linux' && $se_env && ($se_env == 'Yes' || $se_env == '1'));
}

function ini_same_dir_as_wizard()
{
    $sys = get_sysinfo();
    return dirname($sys['PHP_INI']) == dirname(__FILE__); 
}

function extension_dir_path()
{
    $ext_dir = extension_dir();
    if ($ext_dir == '.' || (dirname($ext_dir) == '.')) {
        $ext_dir_path = @realpath($ext_dir);
    } else {
        $ext_dir_path = $ext_dir;
    }
    return $ext_dir_path;
}

function get_loader_name()
{
    $u = uname();
    $sys = get_sysinfo();
    $os = substr($u,0,strpos($u,' '));
    $os_code = strtolower(substr($u,0,3));

    $os_code_h = ($os_code == 'dar' ? 'mac' : $os_code);

    $php_version = phpversion();
    $php_family = substr($php_version,0,3);

    $loader_sfix = (($os_code == 'win') ? '.dll' : (($sys['THREAD_SAFE'])?'_ts.so':'.so'));
    $loader_name="ioncube_loader_{$os_code_h}_{$php_family}{$loader_sfix}";

    return $loader_name;
}

function get_reqd_version($variants)
{
    $exact_match = false;
    $nearest_version = 0;
    $loader_info = get_loaderinfo();
    $os_version = $loader_info['osver2'][0] . '.' . $loader_info['osver2'][1];
    $os_version_major = $loader_info['osver2'][0];
    foreach ($variants as $v) {
        if ($v == $os_version || (is_int($v) && $v == $os_version_major)) {
            $exact_match = true;
            $nearest_version = $v;
            break;
        } elseif ($v > $os_version) {
            break;
        } else {
            $nearest_version = $v;
        }
    }
    return (array($nearest_version,$exact_match));
}

function get_default_loader_dir_webspace()
{
    return ($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . LOADER_SUBDIR);
}

function get_loader_location($loader_dir = '')
{
    if (empty($loader_dir)) {
        $loader_dir = get_default_loader_dir_webspace();
    }
    $loader_name = get_loader_name(); 
    return ($loader_dir . DIRECTORY_SEPARATOR . $loader_name);
}

function get_loader_location_from_ini($php_ini = '')
{
    $errors = array();
    if (empty($php_ini)) {
        $sysinfo = get_sysinfo();
        $php_ini = $sysinfo['PHP_INI'];
    }
    if (!@file_exists($php_ini)) {
        if (empty($php_ini)) {
            $errors[ERROR_INI_NOT_FOUND] = "The configuration file could not be found.";
        } else {
            $errors[ERROR_INI_NOT_FOUND] = "The $php_ini file could not be found.";
        }
    } elseif (!is_readable($php_ini)) {
        $errors[ERROR_INI_NOT_READABLE] = "The $php_ini file could not be read.";
    }
    if (!empty($errors)) {
        return array('location' => '', 'errors' => $errors);
    } 
    $lines = file($php_ini);
    $ext_start = zend_extension_line_start();
    $wrong_ext_start = ($ext_start == 'zend_extension')?'zend_extension_ts':'zend_extension';
    $loader_path = '';
    $loader_name_match = "ioncube_loader";
    foreach ($lines as $l) {
        if (preg_match("/^\s*$ext_start\s*=\s*\"?([^\"]+)\"?/i",$l,$corr_matches)) {
            if (preg_match("/$loader_name_match/i",$corr_matches[1])) {
                if (!empty($loader_path)) {
                    $errors[ERROR_INI_MULTIPLE_IC_LOADER_LINES] = "It appears that multiple $ext_start lines for the ionCube Loader have been included in the configuration file, $php_ini.";
                }
                $loader_path = $corr_matches[1];
            } else {
                if (empty($loader_path)) {
                    $errors[ERROR_INI_NOT_FIRST_ZE] = "The ionCube Loader must be the first Zend extension listed in the configuration file, $php_ini.";
                }
            }
        }
        if (empty($loader_path)) {
            if (preg_match("/^\s*$wrong_ext_start\s*=\s*\"?([^\"]+)\"?/i",$l,$bad_start_matches)) {
                if (preg_match("/$loader_name_match/i",$bad_start_matches[1])) {
                    $bad_zend_ext_msg = "The line for the ionCube Loader in the configuration file, $php_ini, should start with $ext_start and <b>not</b> $wrong_ext_start.";
                    $errors[ERROR_INI_WRONG_ZE_START] = $bad_zend_ext_msg;
                    $loader_path = $bad_start_matches[1];
                }
            }
        }
    }
    $loader_path = trim($loader_path);
    if ($loader_path === '') {
        $errors[ERROR_INI_ZE_LINE_NOT_FOUND] = "The necessary zend_extension line could not be found in the configuration file, $php_ini.";
    } elseif (!@file_exists($loader_path)) {
        $errors[ERROR_INI_LOADER_FILE_NOT_FOUND] = "The loader file  $loader_path, listed in the configuration file, $php_ini, does not exist or is not accessible.";
    } elseif (basename($loader_path) == $loader_path) {
        $errors[ERROR_INI_NOT_FULL_PATH] = "A full path must be specified for the loader file in the configuration file, $php_ini.";
    }
    return array('location' => $loader_path, 'errors' => $errors);
}

function zend_extension_line_missing($ini_path)
{
    $loader_loc = get_loader_location_from_ini($ini_path);
    return (!empty($loader_loc['errors']) && array_key_exists(ERROR_INI_ZE_LINE_NOT_FOUND,$loader_loc['errors']));
}

function find_additional_ioncube_ini()
{
    $sys = get_sysinfo();
    $ioncube_ini = '';

    if (!empty($sys['PHP_INI_ADDITIONAL']) && !preg_match('/(none)/i',$sys['PHP_INI_ADDITIONAL'])) {
        $ini_files = explode(',',$sys['PHP_INI_ADDITIONAL']);
        foreach ($ini_files as $f) {
            $fn = trim($f);
            $bfn = basename($fn);
            if (preg_match('/ioncube/i',$bfn)) {
                $ioncube_ini = $fn;
                break;
            }
        }
    }
    return $ioncube_ini;
}

function get_additional_ini_files()
{
    $sys = get_sysinfo();
    $ini_files = array();
    if (!empty($sys['PHP_INI_ADDITIONAL']) && !preg_match('/(none)/i',$sys['PHP_INI_ADDITIONAL'])) {
        $ini_files = explode(',',$sys['PHP_INI_ADDITIONAL']);
    }
    return (array_map('trim',$ini_files));
}

function all_ini_contents()
{
    $sys = get_sysinfo();
    $output = '';

    $output .= ";;; *MAIN INI FILE AT {$sys['PHP_INI']}* ;;;" . PHP_EOL;
    $output .= get_file_contents($sys['PHP_INI']);
    $other_inis = get_additional_ini_files();
    foreach ($other_inis as $inif) {
        $output .= ";;; *Additional ini file at $inif* ;;;" . PHP_EOL;
        $output .= get_file_contents($inif);
    }
    $here = unix_path_dir();
    $unrec_ini_files = unrecognised_inis_webspace($here);
    foreach ($unrec_ini_files as $urinif) {
        $output .= ";;; *UNRECOGNISED INI FILE at $urinif* ;;;" . PHP_EOL;
        $output .= get_file_contents($urinif);
    }
    return $output;
}

function scan_inis_for_loader()
{
    $ldloc = array('location' => '', 'errors' => array());
    $sysinfo = get_sysinfo();
    if (empty($sysinfo['PHP_INI'])) {
        $ini_files_not_found = array("Main ini file");
        $ini_file_list = get_additional_ini_files();
    } else {
        $ini_files_not_found = array();
        $ini_file_list = array_merge(array($sysinfo['PHP_INI']),get_additional_ini_files());
    }
    $server_type = find_server_type();
    $shared_server = SERVER_SHARED == $server_type;
    foreach ($ini_file_list as $f) {
        $ldloc = get_loader_location_from_ini($f);
        if (array_key_exists(ERROR_INI_ZE_LINE_NOT_FOUND,$ldloc['errors'])) {
            unset($ldloc['errors'][ERROR_INI_ZE_LINE_NOT_FOUND]);
        } 
        if ($shared_server && array_key_exists(ERROR_INI_NOT_FOUND,$ldloc['errors'])) {
            if (false == user_ini_space_path($f)) {
                $ldloc['errors'][ERROR_INI_NOT_FOUND] = "A system ini file cannot be found or read by the Wizard - you cannot do anything about this on your shared server.";
            } else {
                $ldloc['errors'][ERROR_INI_USER_INI_NOT_FOUND] = $ldloc['errors'][ERROR_INI_NOT_FOUND];
            }
        } elseif (array_key_exists(ERROR_INI_NOT_FOUND,$ldloc['errors'])) {
            $ini_files_not_found[] = $f;
        }
        if (!empty($ldloc['location'])) {
            break;
        }
    }
    if (!empty($ini_files_not_found)) {
        $plural = (count($ini_files_not_found) > 1)?"s":"";
        $ldloc['errors'][ERROR_INI_NOT_FOUND] = "The following ini file$plural could not be found by the Wizard: " . join(',',$ini_files_not_found);
        if (is_restricted_server()) {
            $ldloc['errors'][ERROR_INI_NOT_FOUND] .= "<br> This may be due to server restrictions in place.";
        }
    }
    if (empty($ldloc['location'])) {
        $ldloc['errors'][ERROR_INI_ZE_LINE_NOT_FOUND] = "The necessary zend_extension line could not be found in the configuration.";
    }
    return $ldloc;
}

function find_loader_filesystem()
{
    $ld_inst_dir = loader_install_dir(find_server_type());
    $loader_name = get_loader_name();
    $suggested_loader_path = $ld_inst_dir . DIRECTORY_SEPARATOR . $loader_name;
    if (@file_exists($suggested_loader_path)) {
        $location = $suggested_loader_path;
    } elseif (@file_exists($loader_name)) {
        $location = @realpath($loader_name);
    } else {
        $ld_loc = get_loader_location();
        if (@file_exists($ld_loc)) {
            $location = $ld_loc;
        } else {
            $location = '';
        }
    }
    return $location;
}

function find_loader($search_directories_if_not_ini = false)
{
    $sysinfo = get_sysinfo();
    $php_ini = $sysinfo['PHP_INI'];
    $rtl_path = get_runtime_loading_path_if_applicable();
    $location = '';
    $errors = array();

    if (!empty($rtl_path)) {
        $location = $rtl_path;
    } else {
        $loader_ini = scan_inis_for_loader();
        $location = $loader_ini['location'];
        $errors = $loader_ini['errors'];
    }
    if (empty($location) && (empty($errors) || $search_directories_if_not_ini)) {
        $errors = array(); 
        $location = find_loader_filesystem();
        if (empty($location)) {
            $errors[ERROR_LOADER_NOT_FOUND] = 'The loader file could not be found in standard locations.';
        }
    }
    if (!empty($errors)) {
        return $errors;
    } else {
        return $location;
    }
}

function zend_extension_line_start()
{
    $sysinfo = get_sysinfo();
    $is_53_or_later = is_php_version_or_greater(5,3);
    return (is_bool($sysinfo['THREAD_SAFE']) && $sysinfo['THREAD_SAFE'] && !$is_53_or_later ? 'zend_extension_ts' : 'zend_extension');
}

function ioncube_loader_version_information()
{
    $old_version = true;
    $liv = "";
    $lv = "";
    $mv = 0;
    if (function_exists('ioncube_loader_iversion')) {
        $liv = ioncube_loader_iversion();
        $lv = sprintf("%d.%d.%d", $liv / 10000, ($liv / 100) % 100, $liv % 100);

        $latest_version =  get_latestversion();

        $lat_parts = explode('.',$latest_version);
        $cur_parts = explode('.',$lv);

        if (($cur_parts[0] > $lat_parts[0]) || 
            ($cur_parts[0] == $lat_parts[0] && $cur_parts[1] > $lat_parts[1]) ||
             ($cur_parts[0] == $lat_parts[0] && $cur_parts[1] == $lat_parts[1] && $cur_parts[2] >= $lat_parts[2])) {
            $old_version = false;
        } else {
            $old_version = $latest_version;
        }
        $mv = $cur_parts[0];
    }
    return array($lv,$mv,$old_version);
}

function default_loader_version_info()
{
    return array();
}

function get_loader_version_info()
{
    return get_remote_session_value('loader_version_info',LOADER_LATEST_VERSIONS_URL,'default_loader_version_info');
}

function calc_platform()
{
    $platform = array();
    $platform_info = get_platforminfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;
    if (is_array($loader) && array_key_exists('osvariants',$loader) && is_array($loader['osvariants'])) {
        $versions = array_values($loader['osvariants']);
        $multiple_os_versions = !empty($versions[0]);
    }
    if ($multiple_os_versions) {
        list($osvar,$exact_match) = get_reqd_version($loader['osvariants']);
    } else {
        $osvar = null;
        if (is_ms_windows()) {
            $sys = get_sysinfo();
            $phpc = (empty($sys['PHP_COMPILER']))?'vc6':strtolower($sys['PHP_COMPILER']); 
            $osvar = ($sys['THREAD_SAFE']?'':'nonts_') . $phpc;
        }
    }
    foreach ($platform_info as $p) {
        if ($p['os'] == $loader['oscode'] && $p['arch'] == $loader['arch'] && (empty($osvar) || $p['os_mod'] == "_" . $osvar)) {
            $platform = $p;
            break;
        }
    }
    return $platform;
}

function get_platform()
{
    static $this_platform;

    if (!isset($this_platform)) {
        $this_platform = calc_platform();
    }

    return $this_platform;
}

function is_legacy_platform()
{
    $platform = get_platform();
    return array_key_exists('is_legacy',$platform);
}

function calc_dirname()
{
    $dirname = '';
    $platform = get_platform();
    if (!empty($platform)) {
        $dirname = $platform['dirname'];
    }
    return $dirname;
}

function calc_loader_latest_version()
{
    $lv_info = get_loader_version_info();
    $latest_version = RECENT_LOADER_VERSION;
    if (!empty($lv_info)) {
        $dirname = calc_dirname();
      
        if (!empty($dirname)) {
            $compiler_specific_version = false;
            if (is_ms_windows()) {
                $sys = get_sysinfo();
                $phpc = strtolower($sys['PHP_COMPILER']);
                if (!empty($phpc)) {
                    $dirname_comp = $dirname . "_" . $phpc;
                    if (array_key_exists($dirname_comp,$lv_info)) {
                        $latest_version = $lv_info[$dirname_comp];
                        $compiler_specific_version = true;
                    }
                }
            }
            if (!$compiler_specific_version && array_key_exists($dirname,$lv_info)) {
                $latest_version = $lv_info[$dirname];
            }
        } 
    }
    return $latest_version;
}

function get_latestversion()
{
    static $latest_version;

    if (empty($latest_version)) {
        $latest_version = calc_loader_latest_version();
    }
    return $latest_version;
}


function runtime_loader_location()
{
    $loader_path = false;
    $ext_path = extension_dir_path();
    if ($ext_path !== false) {
        $id = $ext_path;
        $here = dirname(__FILE__);
        if (isset($id[1]) && $id[1] == ':') {
            $id = str_replace('\\','/',substr($id,2));
            $here = str_replace('\\','/',substr($here,2));
        }
        $rd=str_repeat('/..',substr_count($id,'/')).$here.'/';
        $i=strlen($rd);

        $loader_loc = DIRECTORY_SEPARATOR . basename($here) . DIRECTORY_SEPARATOR . get_loader_name();
        while($i--) {
            if($rd[$i]=='/') {
                $loader_path = runtime_location_exists($ext_path,$rd,$i,$loader_loc);
                if ($loader_path !== false) {
                    break;
                }
            }
        }

        if (!$loader_path && !empty($loader_loc) && @file_exists($loader_loc)) {
            $loader_path = basename($loader_loc);
        }
    }
    return $loader_path;
}

function runtime_location_exists($ext_dir,$path_str,$sep_pos,$loc_name)
{
    $sub_path = substr($path_str,0,$sep_pos);
    $lp = $sub_path . $loc_name;
    $fqlp = $ext_dir.$lp;

    if(@file_exists($fqlp)) {
        return $lp;
    } else {
        return false;
    }
}

function runtime_loading_is_possible() {
    return !((is_php_version_or_greater(5,2,5)) || is_restricted_server() || !ini_get('enable_dl') || !function_exists('dl') || function_is_disabled('dl') || threaded_and_not_cgi());
}

function shared_and_runtime_loading()
{
    return (find_server_type() == SERVER_SHARED && empty($_SESSION['use_ini_method']) && runtime_loading_is_possible());
}

function get_valid_runtime_loading_path($ignore_loading_check = false)
{
    if ($ignore_loading_check || runtime_loading_is_possible()) {
        return runtime_loader_location();
    } else {
        return false;
    }
}

function runtime_loading($rtl_path = null)
{
    if (empty($rtl_path)) {
        $rtl_path = get_valid_runtime_loading_path();
    }
    if (!empty($rtl_path) && @dl($rtl_path)) {
        return $rtl_path;
    } else {
        return false;
    }
}

function get_runtime_loading_path_if_applicable()
{
    $rtl = null;
    if (shared_and_runtime_loading()) {
        $rtl = get_valid_runtime_loading_path();
    }
    return $rtl;
}

function try_runtime_loading_if_applicable()
{
    $rtl_path = get_runtime_loading_path_if_applicable();
    if (!empty($rtl_path)) {
        return runtime_loading($rtl_path);
    } else {
        return $rtl_path;
    }
}

function runtime_loading_instructions()
{
    $default = get_default_address();
    echo '<h4>Runtime Loading Instructions</h4>';
    echo '<div class=panel>';
    echo '<p>On your shared server the Loader can be installed using the runtime loading method.';
    echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a shared server</a>.)</p>";

    if ('.' == extension_dir()) {
        $dirphrase = is_ms_windows()?'folder':'directory';
        echo "Please note that on your system the Loader <em>must</em> be present in the same " . $dirphrase . " as the first encoded file accessed.";
    }
    echo '<ol>';
    loader_download_instructions(); 
    $loader_dir = loader_install_instructions(SERVER_SHARED,dirname(__FILE__));
    shared_test_instructions();
    echo '</ol>';
    echo '</div>';
}

function runtime_loading_errors()
{
    $errors = array();
    $ext_path = extension_dir_path();
    if (false === $ext_path) {
        $errors[ERROR_RUNTIME_EXT_DIR_NOT_FOUND] = "Extensions directory cannot be found.";
    } else {
        $expected_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . get_loader_name();
        if (!@file_exists($expected_file)) {
            $errors[ERROR_RUNTIME_LOADER_FILE_NOT_FOUND] = "The Loader file was expected to be at $expected_file but could not be found.";
        } else {
            $errors = loader_compatibility_test($expected_file);
        }
    }
    return $errors;
}


function windows_package_name()
{
    $sys = get_sysinfo();
	$loader = get_loaderinfo();
    return (LOADERS_PACKAGE_PREFIX . 'win' . '_' . ($sys['THREAD_SAFE']?'':'nonts_') . strtolower($sys['PHP_COMPILER']) .  '_' . $loader['arch']);
}

function unix_package_name()
{
    $sysinfo = get_sysinfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;
    if (is_array($loader) && array_key_exists('osvariants',$loader) && is_array($loader['osvariants'])) {
        $versions = array_values($loader['osvariants']);
        $multiple_os_versions = !empty($versions[0]);
    }
    if ($multiple_os_versions) {
        list($reqd_version,$exact_match) = get_reqd_version($loader['osvariants']);
        if ($reqd_version) {
            $basename = LOADERS_PACKAGE_PREFIX . $loader['oscode'] . '_' . $reqd_version . '_' . $loader['arch'];
        } else {
            $basename = "";
        }
    } else {
        $basename = LOADERS_PACKAGE_PREFIX . $loader['oscode'] . '_' . $loader['arch'];
    }
    return array($basename,$multiple_os_versions);
}

function loader_download_instructions()
{
    $sysinfo = get_sysinfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;

    if (is_ms_windows()) {
        if (is_bool($sysinfo['THREAD_SAFE'])) {
            $download_str = '<li>Download the following archive of Windows ' . $sysinfo['PHP_COMPILER'];
            if (!$sysinfo['THREAD_SAFE']) {
                $download_str .= ' non-TS';
            }
            $download_str .= ' ' . $loader['arch'] . ' Loaders:';
            echo $download_str;
            $basename = windows_package_name();
            echo make_archive_list($basename,array('zip'));
            echo 'A Loaders archive can also be downloaded from <a href="' . LOADERS_PAGE . '" target="loaders">' . LOADERS_PAGE . '</a>.';
        } else {
            echo '<li>Download a Windows Loaders archive from <a href="' . LOADERS_PAGE  . '" target=loaders>here</a>. If PHP is built with thread safety disabled, use the Windows non-TS Loaders.';
        }
    } else {
        list($basename,$multiple_os_versions) = unix_package_name(); 
        if ($basename == "") {
            echo '<li>Download a ' . $loader['osname'] . ' ' . $loader['arch'] . ' Loaders archive from <a href="' . LOADERS_PAGE . '" target="loaders">here</a>.';
            echo "<br>Your system appears to be {$loader['osnamequal']} for {$loader['wordsize']} bit. If Loaders are not available for that exact release of {$loader['osname']}, Loaders built for an earlier release should work. Note that you may need to install back compatibility libraries for the operating system.";
            echo '<br>If you cannot find a suitable loader then please raise a ticket at <a href="'. SUPPORT_SITE . '">our support helpdesk</a>.';
        } else {
            echo '<li>Download one of the following archives of Loaders for ' . $loader['osnamequal'] . ' ' . $loader['arch'] . ':'; 
            if (SERVER_SHARED == find_server_type()) {
                $archives = array('zip','tar.gz');
            } else {
                $archives = array('tar.gz','zip');
            }
            echo make_archive_list($basename,$archives);
            echo "</p>";
            if ($multiple_os_versions && !$exact_match) {
                echo "<p>Note that you may need to install back compatibility libraries for  {$loader['osname']}.</p>";
            }
        }
    }

    echo '</li>';
}

function ini_dir()
{
    $sysinfo = get_sysinfo();
    $parent_dir = '';
    if (!empty($sysinfo['PHP_INI'])) {
        $parent_dir = dirname($sysinfo['PHP_INI']);
    } else {
        $parent_dir = $_SERVER["PHPRC"];
        if (@is_file($parent_dir)) {
            $parent_dir = dirname($parent_dir);
        }
    }
    return $parent_dir;
}

function unix_install_dir()
{
    $ext_dir = extension_dir_path();
    $cur_dir = @realpath('.');
    if (empty($ext_dir) || $ext_dir == $cur_dir) {
        $loader_dir = UNIX_SYSTEM_LOADER_DIR;
    } else {
        $loader_dir = $ext_dir;
    }
    return $loader_dir;
}

function windows_install_dir()
{
    $sysinfo = get_sysinfo();
    if ($sysinfo['SS'] == 'IIS') {
        if (false === ($ext_dir = extension_dir_path())) {
            $parent_dir = ini_dir();
            $ext_dir = $parent_dir . '\\ext';
            if (!empty($parent_dir) && @file_exists($ext_dir)) {
                $loader_dir = $ext_dir;
            } else {
                $loader_dir = $_SERVER['windir'] . '\\' . WINDOWS_IIS_LOADER_DIR;
            }
        } else {
            $loader_dir = $ext_dir;
        }
    } else {
        if (false === ($ext_dir = extension_dir_path())) {
			$parent_dir = ini_dir();
			$loader_dir = $parent_dir . '\\' . 'ioncube';
		} else {
			$loader_dir = $ext_dir;
		}
    }
    return $loader_dir;
}

function loader_install_dir($server_type)
{
    if (SERVER_SHARED == $server_type && own_php_ini_possible()) {
        $loader_dir = get_default_loader_dir_webspace();
    } elseif (is_ms_windows()) {
        $loader_dir = windows_install_dir();
    } else {
        $loader_dir = unix_install_dir();
    }
    return $loader_dir;
}

function writeable_directories()
{
    $root_path = @realpath($_SERVER['DOCUMENT_ROOT']);
    $above_root_path = @realpath($_SERVER['DOCUMENT_ROOT'] . "/..");
    $root_path_cgi_bin = @realpath($_SERVER['DOCUMENT_ROOT'] . "/cgi-bin");
    $above_root_cgi_bin = @realpath($_SERVER['DOCUMENT_ROOT'] . "/../cgi-bin");

    $paths = array();
    foreach (array($root_path,$above_root_path,$root_path_cgi_bin,$above_root_cgi_bin) as $p) {
        if (@is_writeable($p)) {
            $paths[] = $p;
        }
    }
    return $paths;
}

function loader_install_instructions($server_type,$loader_dir = '')
{
    if (empty($loader_dir)) {
        $loader_dir = loader_install_dir($server_type);
    }
    if (SERVER_LOCAL == $server_type) {
        echo "<li>Put the Loader files in <code>$loader_dir</code></li>";
    } else {
        echo "<li>Transfer the Loaders to your web server and install in <code>$loader_dir</code></li>";
    }
    return $loader_dir;
}

function zend_extension_lines($loader_dir)
{
    $zend_extension_lines = array();
    $sysinfo = get_sysinfo();
    $qt = (is_ms_windows()?'"':'');
    $loader = get_loaderinfo();

    if (!is_bool($sysinfo['THREAD_SAFE']) || !$sysinfo['THREAD_SAFE']) {
        $path = $qt . $loader_dir . DIRECTORY_SEPARATOR . $loader['file'] . $qt;
        $zend_extension_lines[] = "zend_extension = " . $path;
    }
    if ((!is_bool($sysinfo['THREAD_SAFE']) && !is_php_version_or_greater(5,3)) || $sysinfo['THREAD_SAFE']) {
        $line_start = is_php_version_or_greater(5,3)?'zend_extension':'zend_extension_ts';
        $path = $qt . $loader_dir . DIRECTORY_SEPARATOR . $loader['file_ts'] . $qt;
        $zend_extension_lines[] = $line_start . " = " . $path;
    }
    return $zend_extension_lines;
}

function user_ini_base()
{
    $doc_root_path = realpath($_SERVER['DOCUMENT_ROOT']);
    $above_root_path = @realpath($_SERVER['DOCUMENT_ROOT'] . "/..");
    if (!empty($above_root_path) && @is_writeable($above_root_path)) {
        $start_path = $above_root_path;
    } else {
        $start_path = $doc_root_path;
    }
    return $start_path;
}

function user_ini_space_path($file)
{
    $user_base = user_ini_base();
    $fpath = @realpath($file);
    if (!empty($fpath) && (0 === strpos($fpath,$user_base))) {
        return $fpath;
    } else {
        return false;
    }
}

function default_ini_path()
{
    return (realpath($_SERVER['DOCUMENT_ROOT']));
}

function shared_ini_location()
{
    $phprc = getenv('PHPRC');
    if (!empty($phprc)) {
        $phprc_path = user_ini_space_path($phprc);
        if (false !== $phprc_path) {
            return $phprc_path;
        } else {
            return default_ini_path();
        }
    } else {
        return default_ini_path();
    }
}


function zend_extension_instructions($server_type,$loader_dir)
{
    $sysinfo = get_sysinfo();
    $base = get_base_address();
    $editing_ini = true;

    $php_ini_name = ini_file_name();

    if (isset($sysinfo['PHP_INI']) && @file_exists($sysinfo['PHP_INI'])) {
        $php_ini_path = $sysinfo['PHP_INI'];
    } else {
        $php_ini_path = '';
    }

    if (is_bool($sysinfo['THREAD_SAFE'])) {
        $kwd = zend_extension_line_start();
    } else {
        $kwd = 'zend_extension/zend_extension_ts';
    }

    $server_type_code = server_type_code();

    $zend_extension_lines = zend_extension_lines($loader_dir);

    if (SERVER_SHARED == $server_type && own_php_ini_possible()) {
        $ini_dir = shared_ini_location();
        $php_ini_path = $ini_dir . DIRECTORY_SEPARATOR . $php_ini_name;
        if (@file_exists($php_ini_path)) {
            $edit_line = "<li>Edit the <code>$php_ini_name</code> in the <code>$ini_dir</code> directory";
            if (zend_extension_line_missing($php_ini_path) && @is_writeable($php_ini_path) && @is_writeable($ini_dir)) {
                if (function_exists('file_get_contents')) {
                    $ini_strs = @file_get_contents($php_ini_path);
                } else {
                    $lines = @file($php_ini_path);
                    $ini_strs = join(' ',$lines);
                }
                $fh = @fopen($php_ini_path,"wb");
                if ($fh !== false) {
                    foreach ($zend_extension_lines as $zl) {
                        fwrite($fh,$zl . PHP_EOL);
                    }
                    fwrite($fh,$ini_strs);
                    fclose($fh);
                    $editing_ini = false;
                    echo "<li>Your php.ini file at $php_ini_path has been modified to include the necessary line for the ionCube Loader.";
                } else {
                    echo $edit_line;
                }
            } else {
               echo $edit_line;
            }
        } else {
            $download_ini_file = "<li><a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=$server_type_code&amp;download=1&amp;prepend=1\">Save this  <code>$php_ini_name</code> file</a> and upload it to <code>$ini_dir</code> (full path on your server).";
            if (@is_writeable($ini_dir)) {
                $fh = @fopen($php_ini_path,"wb");
                if ($fh !== false) {
                    foreach ($zend_extension_lines as $zl) {
                       fwrite($fh,$zl . PHP_EOL);
                    }
                    if (!empty($sysinfo['PHP_INI']) && is_readable($sysinfo['PHP_INI'])) {
                        if (function_exists('file_get_contents')) {
                           $ini_strs = @file_get_contents($sysinfo['PHP_INI']);
                        } else {
                           $lines = @file($sysinfo['PHP_INI']);
                           $ini_strs = join(' ',$lines);
                        }
                        fwrite($fh,$ini_strs);
                    }
                    fclose($fh); 
                    echo "<li>A <code>$php_ini_name</code> file has been created for you in <code>$ini_dir</code>.";
                } else {
                    echo $download_ini_file;
                }
            } else {
                echo $download_ini_file;
            }
            $editing_ini = false;
        }
    } elseif (!empty($sysinfo['PHP_INI'])) {
        if (empty($sysinfo['PHP_INI_DIR'])) {
            echo "<li>Edit the file <code>{$sysinfo['PHP_INI']}</code>";
        } else {
            $php_ini_path = find_additional_ioncube_ini();
            if (empty($php_ini_path)) {
                $php_ini_name = ADDITIONAL_INI_FILE_NAME;
                echo "<li><a href=\"$base&amp;page=phpconfig&amp;download=1&amp;newlinesonly=1&amp;ininame=$php_ini_name&amp;stype=$server_type_code\">Save this $php_ini_name file</a> and put it in your ini files directory, <code>{$sysinfo['PHP_INI_DIR']}</code>";
                $editing_ini = false;
            } else {
                $php_ini_name = basename($php_ini_path);
                echo "<li>Edit the file <code>$php_ini_path</code>";
            }
        }
    } else {
        echo "<li>Edit the system <code>$php_ini_name</code> file";
    }
    if ($editing_ini) {
        echo " and <b>before</b> any other $kwd lines ensure that the following is included:<br>";
        foreach ($zend_extension_lines as $zl) {
            echo "<code>$zl</code><br>";
        }
        if (!empty($php_ini_path)) {
            if (zend_extension_line_missing($php_ini_path)) {
                echo "<a>Alternatively, replace your current <code>$php_ini_path</code> file with <a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=$server_type_code&amp;download=1&amp;prepend=1\">this new $php_ini_name file</a>."; 
            }
        }
    }
    echo '</li>';
}

function server_restart_instructions()
{
    $sysinfo = get_sysinfo();
    $base = get_base_address();

    if ($sysinfo['SS']) {
		if ($sysinfo['SS'] == 'PHP-FPM') {
			echo "<li>Restart PHP-FPM.</li>";
		} else {
			echo "<li>Restart the {$sysinfo['SS']} server software.</li>";
		}
    } else {
        echo "<li>Restart the server software.</li>";
    }

    echo "<li>When the server software has restarted, <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">click here to test the Loader</a>.</li>";

	if ($sysinfo['SS'] && $sysinfo['SS'] == 'PHP-FPM') {
		echo '<li>If the Loader installation failed, check the PHP-FPM error log file for errors.</li>';
    } elseif ($sysinfo['SS'] == 'Apache' && !is_ms_windows()) {
        echo '<li>If the Loader installation failed, check the Apache error log file for errors and see our guide to <a target="unix_errors" href="'. UNIX_ERRORS_URL . '">Unix related errors</a>.</li>';
    }
}

function shared_test_instructions()
{
    $base = get_base_address();
    echo "<li><a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">Click here to test the Loader</a>.</li>";
}

function link_to_php_ini_instructions()
{
    $default = get_default_address();
    echo "<p><a href=\"{$default}&amp;stype=s&amp;ini=1\">Please click here for instructions on using the php.ini method instead</a>.</p>";
}

function php_ini_instruction_list($server_type)
{
    echo '<h4>Installation Instructions</h4>';
    echo '<div class=panel>';
    echo '<ol>';

    loader_download_instructions(); 
    $loader_dir = loader_install_instructions($server_type);
    zend_extension_instructions($server_type,$loader_dir);
    if ($server_type != SERVER_SHARED || !own_php_ini_possible()) {
        server_restart_instructions();
    } else {
        shared_test_instructions();
    } 
    echo '</ol>';
    echo '</div>';
}

function php_ini_install_shared($give_preamble = true)
{
    $php_ini_name = ini_file_name();
    $default = get_default_address();
    if ($give_preamble) {
        echo "<p>On your <strong>shared</strong> server, the Loader should be installed using a <code>$php_ini_name</code> configuration file.";
        echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a shared server</a>.)</p>";
    }

    if (own_php_ini_possible()) {
        echo '<p>With your hosting account, you may be able to use your own PHP configuration file.</p>';
    } else {
        echo "<p>It appears that you cannot install the ionCube Loader using the <code>$php_ini_name</code> file. Your server provider or system administrator should be able to perform the installation for you. Please refer them to the following instructions.</p>";
    }

    php_ini_instruction_list(SERVER_SHARED);
}

function php_ini_install($server_type_desc = null, $server_type = SERVER_DEDICATED, $required = true)
{
    $php_ini_name = ini_file_name();
    $default = get_default_address();

    echo '<p>';
    if ($server_type_desc) {
        echo "For a <strong>$server_type_desc</strong> server ";
    } else {
        echo "For this server ";
    }

    if ($required) {
        echo "you should install the ionCube Loader using the <code>$php_ini_name</code> configuration file.";
    } else {
        echo "installing the ionCube Loader using the <code>$php_ini_name</code> file is recommended.";
    }
    if ($server_type_desc) {
        echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a $server_type_desc server</a>.)";
    }
    echo '</p>';
      
    php_ini_instruction_list($server_type);
}



function help_resources($error_list = array())
{
	$self = get_self();
    $base = get_base_address();
    $server_type_code = server_type_code();
    $server_type = find_server_type();
    $sysinfo = get_sysinfo();
    $resources = array(
            '<a target="_blank" href="' . LOADERS_FAQ_URL . '">ionCube Loaders FAQ</a>',
            '<a target="_blank" href="' . LOADER_FORUM_URL . '">ionCube Loader Forum</a>'
        );
    if (SERVER_SHARED != $server_type || own_php_ini_possible(true)) {
		$support_info = array ( 
			'department' 		=> WIZARD_SUPPORT_TICKET_DEPARTMENT,
			'subject' 			=> "ionCube Loader installation problem",
			'message' 			=> support_ticket_information()
		   );
		if (SERVER_LOCAL == $server_type && !info_should_be_disabled()) {
			$temp_files = system_info_temporary_files();
		} else {
			$temp_files = NULL;
		}
		if (!empty($temp_files)) {
			$support_info['ini'] = base64_encode(file_get_contents($temp_files['ini']));
			$support_info['phpinfo'] = base64_encode(file_get_contents($temp_files['phpinfo']));
			$support_info['additional'] = base64_encode(file_get_contents($temp_files['additional']));
			
			$loader_path = find_loader(true);
			if (is_string($loader_path)) {		
				$support_info['loader'] = base64_encode(file_get_contents($loader_path));
				$support_info['loader_name'] = basename($loader_path);
			} else {
				$support_info['loader'] = '';
				$support_info['loader_name'] = '';
			}
		} else {
			$support_info['ini'] = '';
			$support_info['phpinfo'] = '';
			$support_info['additional'] = '';
			$support_info['loader'] = '';
			$support_info['loader_name'] = '';
		}
		 
        $resources[2] = '<form action="' . SUPPORT_SITE . 'lw_index.php' .'" method="POST" id="support-ticket"><a href="" onclick="document.getElementById(\'support-ticket\').submit(); return false;">Raise a support ticket through our helpdesk</a>';
		$resources[2] .= '<input type="hidden" name="department" value="' . $support_info['department'] . '"/>';
		$resources[2] .= '<input type="hidden" name="subject" value="' . $support_info['subject'] . '"/>';
		$resources[2] .= '<input type="hidden" name="message" value="' . $support_info['message'] . '"/>';
		if (!empty($temp_files)) {
			$resources[2] .= '<input type="hidden" name="phpinfo" value="' . $support_info['phpinfo'] . '"/>';
			$resources[2] .= '<input type="hidden" name="ini" value="' . $support_info['ini'] . '"/>';
			$resources[2] .= '<input type="hidden" name="additional" value="' . $support_info['additional'] . '"/>';
			$resources[2] .= '<input type="hidden" name="loader" value="' . $support_info['loader'] . '"/>';
			$resources[2] .= '<input type="hidden" name="loader_name" value="' . $support_info['loader_name'] . '"/>';
		}
		$resources[2] .= '</form>';
    } 
	
    if (SERVER_SHARED == $server_type && own_php_ini_possible(true) && !user_ini_space_path($sysinfo['PHP_INI'])) {
        $resources[3] = '<strong>Please check with your host that you can create php.ini files that will override the system one.</strong>';
    }
    return $resources;
}

function system_info_temporary_files()
{
    $tmpfname_ini = get_tempnam("/tmp", "INI");
    $tmpfname_ini .= ".ini";
    $fh_ini = @fopen($tmpfname_ini,'wb');
    if ($fh_ini) {
        $config = all_ini_contents();
        fwrite($fh_ini,$config);
        fclose($fh_ini);
    } else {
        $tmpfname_ini = '';
    }

    $tmpfname_pinf = get_tempnam("/tmp", "PIN");
    $tmpfname_pinf .= ".html";
    $fh_pinfo = @fopen($tmpfname_pinf,'wb');
    if ($fh_pinfo) {
        ob_start();
        @phpinfo();
        $pinfo = ob_get_contents();
        ob_end_clean();
        fwrite($fh_pinfo,$pinfo);
        fclose($fh_pinfo);
    } else {
        $tmpfname_pinf = '';
    }

    $tmpfname_add = get_tempnam("/tmp", "ADD");
    $tmpfname_add .= ".html";
    $fh_add = @fopen($tmpfname_add,'wb');
    if ($fh_add) {
        ob_start();
        extra_page(false);
        $extra = ob_get_contents();
        ob_end_clean();
        fwrite($fh_add,$extra);
        fclose($fh_add);
    } else {
        $tmpfname_add = '';
    }

    if (empty($tmpfname_ini) || empty($tmpfname_pinf) || empty($tmpfname_add)) {
        return (array());
    } else {
        return (array('ini'           =>   $tmpfname_ini,
                      'phpinfo'       =>   $tmpfname_pinf,
                      'additional'    =>   $tmpfname_add));
    }
}

function get_tempnam($default_tmp_dir = '', $prefix = '')
{
	if (function_exists('sys_get_temp_dir')) {
		return tempnam(sys_get_temp_dir(),$prefix);
	} else {
		return @tempnam($default_tmp_dir, $prefix);
	}
}
function system_info_archive_page()
{
    info_disabled_check();
	$server_type = find_server_type();
	if (SERVER_LOCAL != $server_type) {
		exit;
	}
    $loader = find_loader(true);
    if (is_string($loader)) {
        $loader_file = $loader;
    } else {
        $loader_file = '';
    }
    $all_files = system_info_temporary_files();
    if (!empty($all_files)) {
        if (!empty($loader_file)) {
            $all_files['loader'] = $loader_file;
        }
        $archive_name =  get_tempnam('/tmp',"ARC");
        if (extension_loaded('zip')) {
            $archive_name .= '.zip';
            $zip = @new ZipArchive();
            $mode = @constant("ZIPARCHIVE::OVERWRITE");
            if (!$zip || $zip->open($archive_name, $mode)!==TRUE) {
                $archive_name = '';
            } else {
                foreach($all_files as $f) {
                    $zip->addFile($f,basename($f));
                }
                $zip->close();
            }
        } elseif (extension_loaded('zlib') && !is_ms_windows()) {
            $tar_name = $archive_name . ".tar";
            $all_files_str = join(' ',$all_files);
            $script = "tar -chf $tar_name $all_files_str";
            $result = @system($script,$retval);
            if ($result !== false) {
                $archive_name = $tar_name . '.gz';
                $zp = gzopen($archive_name,"w9");
                $tar_contents = get_file_contents($tar_name);
                gzwrite($zp,$tar_contents);
                gzclose($zp);
            } else {
                $archive_name = '';
            }
        } else {
            $archive_name = '';
        }
    } else {
        $archive_name = '';
    }
    if ($archive_name) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='. $archive_name);
        @readfile($archive_name);
    } else {
        $self = get_self();
        $base = get_base_address();
        $server_type_code = server_type_code();
        heading();
        echo "<p>A downloadable archive of system information could not be created.<br> 
            <strong>Please save each of the following and then attach those files to the support ticket:</strong></p>"; 
        echo "<ul>";
        echo "<li><a href=\"$base&amp;page=phpinfo\" target=\"phpinfo\">phpinfo()</a></li>";
        echo "<li><a href=\"$base&amp;page=phpconfig\" target=\"phpconfig\">config</a></li>";
        echo "<li><a href=\"$base&amp;page=extra&amp;stype=$server_type_code\" target=\"extra\">additional information</a></li>";
        echo "<li><a href=\"$self?page=loaderbin\">loader file</a></li>";
        echo "</ul>";
        footer(true);
    }
}

function support_ticket_information($error_list = array())
{
    $sys = get_sysinfo();
    $ld = get_loaderinfo();

    $ticket_strs = array();
    $ticket_strs[] = "PLEASE DO NOT REMOVE THE FOLLOWING INFORMATION\r\n";
    $ticket_strs[] = "==============\r\n";
    if (!empty($error_list)) {
        $ticket_strs[] = "[hr]";
        $ticket_strs[] = "ERRORS";
        $ticket_strs[] = "[table]";
        $ticket_strs[] = '[tr][td]' . join('[/td][/tr][tr][td]',$error_list) . '[/td][/tr]';
        $ticket_strs[] = "[/table]";
    }
    $ticket_strs[] = "[hr]";
    $ticket_strs[] = "SYSTEM INFORMATION";
    $info_lines = array();
    $info_lines["Wizard version"] = script_version();
    $info_lines["PHP uname"] = $ld['uname'];
    $info_lines["Machine architecture"] = $ld['arch'];
    $info_lines["Word size"] = $ld['wordsize'];
    $info_lines["Operating system"] = $ld['osname'] . ' ' . $ld['osver'];
    if (selinux_is_enabled() || possibly_selinux()) {
        $info_lines["Security enhancements"] = "SELinux";
    } elseif (grsecurity_is_enabled()) {
        $info_lines["Security enhancements"] = "Grsecurity";
    } else {
        $info_lines["Security enhancements"] = "None";
    }
    $info_lines["PHP version"] = PHP_VERSION; 
    if ($sys['DEBUG_BUILD']) {
        $info_lines["DEBUG BUILD"] = "DEBUG BUILD OF PHP";
    }
    if (!$sys['SUPPORTED_COMPILER']) {
        $info_lines["SUPPORTED PHP COMPILER"] = "FALSE";
        $info_lines["PHP COMPILER"] = $sys['PHP_COMPILER'];
    }
    $info_lines["Is CLI?"] = ($sys['IS_CLI']?"Yes":"No");
    $info_lines["Is CGI?"] = ($sys['IS_CGI']?"Yes":"No");
    $info_lines["Is thread-safe?"] = ($sys['THREAD_SAFE']?"Yes":"No");
    $info_lines["Web server"] = $sys['FULL_SS'];
    $info_lines["Server type"] = server_type_string();
    $info_lines["PHP ini file"] = $sys['PHP_INI'];
    if (!@file_exists($sys['PHP_INI'])) {
        $info_lines["Ini file found"] = "INI FILE NOT FOUND";
    } else {
        if (is_readable($sys['PHP_INI'])) {
            $info_lines["Ini file found"] = "INI FILE READABLE";
        } else {
            $fh = @fopen($sys['PHP_INI'],"rb");
            if ($fh === false) {
                $info_lines["Ini file found"] = "INI FILE FOUND BUT POSSIBLY NOT READABLE";
            } else {
                $info_lines["Ini file found"] = "INI FILE READABLE";
            }
        }
    }
    $info_lines["PHPRC"] = $sys['PHPRC'];
    $loader_path = find_loader();
    if (is_string($loader_path)) {
        $info_lines["Loader path"] =  $loader_path;
        $info_lines["Loader file size"] = filesize($loader_path) . " bytes.";
        $info_lines["Loader MD5 sum"] =  md5_file($loader_path);
    } else {
        $info_lines["Loader path"] =  "LOADER PATH NOT FOUND";
    }
    $server_type_code = server_type_code();
    if (!empty($_SESSION['hostprovider'])) {
      $info_lines['Hosting provider'] = $_SESSION['hostprovider'];
      $info_lines['Provider URL'] = $_SESSION['hosturl'];
    }
    $info_lines["Wizard script path"] = '[url]http://' . $_SERVER["HTTP_HOST"] . get_self() . '?stype='. $server_type_code . '[/url]';
    $ticket_strs[] = "[table]";
    foreach ($info_lines as $h => $i) {
        $value = (empty($i))?'EMPTY':$i;
        $ticket_strs[] = '[tr][td]' . $h . '[/td]' . '[td]' . $value . '[/td][/tr]';
    }
    $ticket_strs[] = '[/table]';
    $ticket_strs[] = '[hr]';
    $ticket_strs[] = "\r\n==============\r\n";
    $ticket_strs[] = "PLEASE ENTER ANY ADDITIONAL INFORMATION BELOW\r\n";

    $support_ticket_str = join('',$ticket_strs);
    return urlencode($support_ticket_str);
}

function wizard_stats_data($page_id)
{
    $data = array();

    try_runtime_loading_if_applicable();
    $sysinfo = get_sysinfo();
    $ldinfo = get_loaderinfo();

    $data['sessionid'] = session_id();
    $data['wizard_version'] = script_version();
    $data['server_type'] = server_type_code();
    $data['hostprovider'] = (isset($_SESSION['hostprovider']))?$_SESSION['hostprovider']:'';
    $data['hosturl'] = (isset($_SESSION['hosturl']))?$_SESSION['hosturl']:'';
    $data['page_id'] = $page_id;
    $data['loader_state'] = (extension_loaded(LOADER_EXTENSION_NAME))?'installed':'failure';
    $data['ini_location'] = $sysinfo['PHP_INI'];
    $data['is_cgi'] = ($sysinfo['IS_CGI'])?"yes":"no";
    $data['is_ts'] = ($sysinfo['THREAD_SAFE'])?"yes":"no";
    $data['arch'] = $ldinfo['arch'];
    $data['php_version'] = PHP_VERSION;
    $data['os'] = $ldinfo['osname'];
    $data['word_size'] = $ldinfo['wordsize'];
    $data['referrer'] =  $_SERVER["HTTP_HOST"] . get_self();

    return $data;
}

function send_stats($page_id = 'default')
{
    $server_type = find_server_type();
    $res = false;

    if (SERVER_LOCAL != $server_type) {
        $stats_data = wizard_stats_data($page_id);

        if (!isset($_SESSION['stats_sent'][$page_id][$stats_data['loader_state']])) {
            $url = WIZARD_STATS_URL;

            if (!empty($stats_data)) {
                if(function_exists('http_build_query')) {
                    $qparams = http_build_query($stats_data);
                } else {
                    $qparams = php4_http_build_query($stats_data);
                }
                $url .= '?' . $qparams;
                $res = remote_file_contents($url);
            }
            $_SESSION['stats_sent'][$page_id][$stats_data['loader_state']] = 1;
        } else {
            $res = true;
        }
    } else {
        $res = 'LOCAL';
    }
    return $res;
}

function os_arch_string_check($loader_str)
{
    $errors = array();
    if (preg_match("/target os:\s*(([^_]+)_([^-]*)-([[:graph:]]*))/i",$loader_str,$os_matches)) {
        $loader_info = get_loaderinfo();
        $dirname = calc_dirname();
        $packed_osname = preg_replace('/\s/','',strtolower($loader_info['osname']));
        if (strtolower($dirname) != $os_matches[1] && $packed_osname != $os_matches[2]) {
            $errors[ERROR_LOADER_WRONG_OS] = "You have the wrong loader for your operating system, ". $loader_info['osname'] . ".";
        } else {
            $loader_wordsize = (strpos($os_matches[3],'64') === false)?32:64;
            if ($loader_info['arch'] != ($ap = required_loader_arch($os_matches[3],$loader_info['oscode'],$loader_wordsize))) {
                $err_str = "You have the wrong loader for your machine architecture.";
                $err_str .= " Your system is " . $loader_info['arch'];
                $err_str .= " but the loader you are using is for " . $ap . ".";
                $errors[ERROR_LOADER_WRONG_ARCH] = $err_str;
            }
        }
    }
    return $errors;
}

function get_loader_strings($loader_location)
{
    if (function_exists('file_get_contents')) {
        $loader_strs = @file_get_contents($loader_location);
    } else {
        $lines = @file($loader_location);
        $loader_strs = join(' ',$lines);
    }
    return $loader_strs;
}

function loader_system($loader_location)
{
    $loader_system = array();
    $loader_strs = get_loader_strings($loader_location);

    if (!empty($loader_strs)) {

        if (preg_match("/ioncube_loader_..?\.._(.)\.(.)\.(..?)(_nonts)?(_amd64)?\.dll/i",$loader_strs,$version_matches)) {
            $loader_system['oscode'] = 'win';
            $loader_system['thread_safe'] = (isset($version_matches[4]) && $version_matches[4] == '_nonts')?0:1;
			if (preg_match("/_localtime([0-9][0-9])/i",$loader_strs,$size_matches)) {
				$loader_system['wordsize'] = ($size_matches[1] == '64')?64:32;
			} else {
				$loader_system['wordsize'] = 32;
			}
            $loader_system['arch'] = ($loader_system['wordsize'] == 64)?'x86-64':'x86';
            $loader_system['php_version_major'] = $version_matches[1];
            $loader_system['php_version_minor'] = $version_matches[2];
			if ($loader_system['php_version_major'] == 8 && $loader_system['php_version_minor'] >= 1) {
				$loader_system['compiler'] = 'VC16';
			} elseif ($loader_system['php_version_major'] == 7 && $loader_system['php_version_minor'] >= 2) {
				$loader_system['compiler'] = 'VC15'; 
			} elseif ($loader_system['php_version_major'] == 7 && $loader_system['php_version_minor'] < 2) {
				$loader_system['compiler'] = 'VC14'; 
			} elseif ($loader_system['php_version_major'] == 5 && $loader_system['php_version_minor'] >= 5) {
				$loader_system['compiler'] = 'VC11'; 
			} elseif (preg_match("/assemblyIdentity.*version=\"([^.]+)\./",$loader_strs,$compiler_matches)) {
                $loader_system['compiler'] = "VC" . strtoupper($compiler_matches[1]);
            } else {
                $loader_system['compiler'] = 'VC6';
            }
        } elseif (preg_match("/php version:\s*(.)\.(.)\.(..?)(-ts)?/i",$loader_strs,$version_matches)) {
            $loader_system['thread_safe'] = (isset($version_matches[4]) && $version_matches[4] == '-ts')?1:0;
            $loader_system['php_version_major'] = $version_matches[1];
            $loader_system['php_version_minor'] = $version_matches[2];
            if (preg_match("/target os:\s*(([^_]+)_([^-]*)-([[:graph:]]*))/i",$loader_strs,$os_matches)) {
                $loader_system['oscode'] = strtolower(substr($os_matches[2],0,3));
                $loader_system['wordsize'] = (strpos($os_matches[3],'64') === false)?32:64;
                $loader_system['arch'] = required_loader_arch($os_matches[3],$loader_system['oscode'],$loader_system['wordsize']);
                $loader_system['compiler'] = $os_matches[4];
            }
        }
        if (preg_match("/ionCube Loader Version\s+(\S+)/",$loader_strs,$loader_version)) {
            $loader_system['loader_version'] = $loader_version[1];
		} elseif (preg_match("/ioncube_loader_(\d{1,2}\.\d\.\d{1,2})\./",$loader_strs,$loader_version)){
			$loader_system['loader_version'] = $loader_version[1];
        } else {
            $loader_system['loader_version'] = 'UNKNOWN';
        }
        if (isset($loader_system['php_version_major'])) {
            $loader_system['php_version'] = $loader_system['php_version_major'] . '.' . $loader_system['php_version_minor'];
        }
    }
    return $loader_system;
}

function loader_compatibility_test($loader_location)
{
    $errors = array();

    $sysinfo = get_sysinfo();
    if (LOADER_NAME_CHECK) {
        $installed_loader_name = basename($loader_location);
        $expected_loader_name = get_loader_name();
        if ($installed_loader_name != $expected_loader_name) {
            $errors[ERROR_LOADER_UNEXPECTED_NAME] = "The installed loader (<code>$installed_loader_name</code>) does not have the name expected (<code>$expected_loader_name</code>) for your system. Please check that you have the correct loader for your system.";
        }
    }
    if (empty($errors) && !is_readable($loader_location)) {
        $execute_error = "The loader at $loader_location does not appear to be readable.";
        $execute_error .= "<br>Please check that it exists and is readable.";
        $execute_error .= "<br>Please also check the permissions of the containing ";
        $execute_error .= (is_ms_windows()?'folder':'directory') . '.';
		if ($sysinfo['SS'] == 'PHP-FPM') {
			$execute_error .= "<br>Please also check that PHP-FPM has been restarted.";
        } elseif (($sysinfo['SS'] == 'IIS') || !($sysinfo['IS_CGI'] || $sysinfo['IS_CLI'])) {
            $execute_error .= "<br>Please also check that the web server has been restarted.";
        }
        $execute_error .= ".";
        $errors[ERROR_LOADER_NOT_READABLE] = $execute_error;
    }
    $loader_strs = get_loader_strings($loader_location);
    $phpv = php_version(); 
    if (preg_match("/php version:\s*(.)\.(.)\.(..?)(-ts)?/i",$loader_strs,$version_matches)) {
        if ($version_matches[1] != $phpv['major'] || $version_matches[2]  != $phpv['minor']) {
            $loader_php = $version_matches[1] . "." . $version_matches[2];
            $server_php =  $phpv['major'] . "." .  $phpv['minor'];
            $errors[ERROR_LOADER_PHP_MISMATCH] = "The installed loader is for PHP $loader_php but your server is running PHP $server_php.";
        }
        if (is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE'] && !is_ms_windows() && !(isset($version_matches[4]) && $version_matches[4] == '-ts')) {
            $errors[ERROR_LOADER_NONTS_PHP_TS] = "Your server is running a thread-safe version of PHP but the loader is not a thread-safe version.";
        } elseif (isset($version_matches[4]) && $version_matches[4] == '-ts' && !(is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE'])) {
            $errors[ERROR_LOADER_TS_PHP_NONTS] = "Your server is running a non-thread-safe version of PHP but the loader is a thread-safe version.";
        }
    } elseif (preg_match("/ioncube_loader_..?\.._(.)\.(.)\.(..?)(_nonts)?(_amd64)?\.dll/i",$loader_strs,$version_matches)) {
        if (!is_ms_windows()) {
            $errors[ERROR_LOADER_WIN_SERVER_NONWIN] = "You have a Windows loader but your server does not appear to be running Windows.";
        } else {
            if (isset($version_matches[4]) && $version_matches[4] == '_nonts' && is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE']) {
                $errors[ERROR_LOADER_WIN_NONTS_PHP_TS] = "You have the non-thread-safe version of the Windows loader but you need the thread-safe one.";
            } elseif (!(is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE']) && !(isset($version_matches[4]) && $version_matches[4] == '_nonts')) {
                $errors[ERROR_LOADER_WIN_TS_PHP_NONTS] = "You have the thread-safe version of the Windows loader but you need the non-thread-safe one."; 
            }
            if ($version_matches[1] != $phpv['major'] || $version_matches[2]  != $phpv['minor']) {
                $loader_php = $version_matches[1] . "." . $version_matches[2];
                $server_php =  $phpv['major'] . "." .  $phpv['minor'];
                $errors[ERROR_LOADER_WIN_PHP_MISMATCH] = "The installed loader is for PHP $loader_php but your server is running PHP $server_php.";
            }
                        
            if ($version_matches[1] == 8 && $version_matches[2] >= 1) {
                $loader_compiler = 'VC16';
            } elseif ($version_matches[1] == 7 && $version_matches[2] >= 2) {
                $loader_compiler = 'VC15'; 
            } elseif ($version_matches[1] == 7) {
                $loader_compiler = 'VC14'; 
            } elseif ($version_matches[1] == 5 && $version_matches[2] >= 5) {
                $loader_compiler = 'VC11'; 
            } elseif (preg_match("/assemblyIdentity.*version=\"([^.]+)\./",$loader_strs,$compiler_matches)) {
                $loader_compiler = "VC" . strtoupper($compiler_matches[1]);
            } else {
                $loader_compiler = 'VC6';
            }
            if ($loader_compiler != $sysinfo['PHP_COMPILER']) {
                $errors[ERROR_LOADER_WIN_COMPILER_MISMATCH] = "Your loader was built using $loader_compiler but you need the loader built using {$sysinfo['PHP_COMPILER']}.";
            }
        }
    } else {
            $errors[ERROR_LOADER_PHP_VERSION_UNKNOWN] = "The PHP version for the loader cannot be determined - please check that you have a valid ionCube Loader.";
    } 
    $errors += os_arch_string_check($loader_strs);

    return $errors;
}


function shared_server()
{
    if (!$rtl_path = runtime_loading()) {
        if (empty($_SESSION['use_ini_method']) && runtime_loading_is_possible()) {
            runtime_loading_instructions();
        } else {
            php_ini_install_shared();
        }
    } else {
        list($lv,$mv,$newer_version) = ioncube_loader_version_information();
        $phpv = php_version_maj_min();
        echo "<p>The ionCube Loader $lv for PHP $phpv has been successfully installed.</p>";
        $is_legacy_loader = loader_major_version_instructions($mv);
        if ($is_legacy_loader) {
            loader_upgrade_instructions($lv,$newer_version);
        }
        successful_install_end_instructions($rtl_path);
    }
}

function dedicated_server()
{
    php_ini_install('dedicated or VPS', SERVER_DEDICATED, true);
}

function local_install()
{
    php_ini_install('local',SERVER_LOCAL, true);
}


function unregister_globals()
{
    if (!ini_get('register_globals')) {
        return;
    }

    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $input = array_merge($_GET,    $_POST,
                         $_COOKIE, $_SERVER,
                         $_ENV,    $_FILES,
                         isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach ($input as $k => $v) {
        if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset($GLOBALS[$k]);
        }
    }
}

function clear_session($persist = array())
{
    $persist['not_go_daddy'] = empty($_SESSION['not_go_daddy'])?0:1;
    $persist['use_ini_method'] = empty($_SESSION['use_ini_method'])?0:1;
    $persist['server_type'] = empty($_SESSION['server_type'])?SERVER_UNKNOWN:$_SESSION['server_type'];
    @session_destroy();
    $_SESSION = array();
    $_SESSION['CREATED'] = time();
    $_SESSION = $persist;
}

function can_archive()
{
	return (extension_loaded('zip') || (extension_loaded('zlib') && !is_ms_windows()));
}

function is_ioncube()
{
        return (($_SERVER["REMOTE_ADDR"] == IONCUBE_IP_ADDRESS) || ($_SERVER["REMOTE_ADDR"] == gethostbyname(IONCUBE_ACCESS_ADDRESS)));
}

function can_reach_ioncube()
{
	return (isset($_SESSION['remote_access_successful']));
}

function info_should_be_disabled($only_allow_ioncube = false)
{
    $elapsed = time() - max(filemtime(__FILE__),filectime(__FILE__));
	
	if (is_ioncube()) {
		$cutoff_time = IONCUBE_WIZARD_EXPIRY_MINUTES * 60;
	} else {
		if (!$only_allow_ioncube && !extension_loaded(LOADER_EXTENSION_NAME)) {
			$cutoff_time = WIZARD_EXPIRY_MINUTES * 60;
		} else {
			return true;
		}
	}
	
    return ($elapsed > $cutoff_time);
}

function info_disabled_text()
{
    return "The information you have tried to access has been disabled for security reasons. Please re-install this Loader Wizard script and try again.";
}

function info_disabled_check()
{
    if (info_should_be_disabled()) {
        heading();
        echo info_disabled_text();
        footer(true);
        exit;
    }
}

function run()
{

	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	if (preg_match('/googlebot/i',$user_agent)) {
		exit;
	}
    unregister_globals();
    if (is_php_version_or_greater(4,3,0)) {
        ini_set('session.use_only_cookies',1);
    }
    $session_ok = @session_start();

    if (!defined('PHP_EOL')) {
        if (is_ms_windows()) {
            define('PHP_EOL',"\r\n");
        } else {
            define('PHP_EOL',"\n");
        }
    }

    if (!isset($_SESSION['CREATED'])) {
        $_SESSION['CREATED'] = time();
    } elseif (time() - $_SESSION['CREATED'] > SESSION_LIFETIME_MINUTES * 60 ) {
        clear_session(); 
    }
    if (!isset($_SERVER)) $_SERVER =& $HTTP_SERVER_VARS;

    (php_sapi_name() == 'cli') && die("This script should only be run by a web server.\n");

    $page = get_request_parameter('page');
    $host = get_request_parameter('host');
    $clear = get_request_parameter('clear');
    $ini = get_request_parameter('ini');
    $timeout = get_request_parameter('timeout');

    if ($timeout) {
        $_SESSION['timing_out'] = 1;
        $_SESSION['initial_run'] = 0;
    }

    if (!empty($host)) {
        if ($host == 'ngd') {
            $_SESSION['not_go_daddy'] = 1;
        }
    }
    if (!empty($ini)) {
        $_SESSION['use_ini_method'] = 1;
    }

    if (!empty($clear)) {
        clear_session();
        unset($_SESSION['not_go_daddy']);
        unset($_SESSION['use_ini_method']);
        unset($_SESSION['server_type']);
    } else {
        $stype = get_request_parameter('stype');
        $hostprovider = get_request_parameter('hostprovider');
        $hosturl = get_request_parameter('hosturl');
        if (!empty($hostprovider)) {
            $_SESSION['hostprovider'] = $hostprovider;
            $_SESSION['hosturl'] = $hosturl;
        }
        $server_type = find_server_type($stype,false,true);
    }
    if ($session_ok && !$timeout && !isset($_SESSION['initial_run']) && empty($page)) {
        $_SESSION['initial_run'] = 1;
        initial_page();
        @session_write_close();
        exit;
    } else {
        $_SESSION['initial_run'] = 0;
    }

    if (empty($_SESSION['server_type'])) {
        $_SESSION['server_type'] = SERVER_UNKNOWN;
    }

    if (empty($page) || !function_exists($page . "_page")) {
        $page = get_default_page();
    } 

    $fn = "{$page}_page";
    $fn();

    @session_write_close();
    exit(0);
}

function wizardversion_page()
{
    $start_time = time();
    $wizard_version_only = get_request_parameter('wizard_only');
    $clear_session_info = get_request_parameter('clear_info');
    if ($clear_session_info) {
        unset($_SESSION['timing_out']);
        unset($_SESSION['latest_wizard_version']);
    }
    $wizard_version = latest_wizard_version();
    $message = '';
    if (false === $wizard_version) {
        $message = "0";
    } elseif (update_is_available($wizard_version)) {
        $message = "$wizard_version";
    } else {
        $message = "1";
    }
    echo $message;
    @session_write_close();
    exit(0);
}

function platforminfo_page()
{
    $message = '';
    $platforms = get_loader_platforms();
    $message = empty($platforms)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function loaderversion_page()
{
    $message = '';
    $loader_versions = get_loader_version_info();
    $message = empty($loader_versions)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function compilerversion_page()
{
    $message = '';
    $compiler_versions = find_win_compilers();
    $message = empty($compiler_versions)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function initial_page()
{
    $self = get_self();
    $start_page = get_default_address(false);
    $stage_timeout = 7000;
    $step_lag = 500;

    echo <<<EOT
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <title>ionCube Loader Wizard</title>
        <link rel="stylesheet" type="text/css" href="$self?page=css">
        <style type="text/css">
        body {
            height: 100%;
            width: 100%;
        }
        </style>
        <script type="text/javascript">
        var timingOut = 0;
        var xmlHttpTimeout;
        var ajax;
        var statusPar;
        var stage_timeout = $stage_timeout;
        var step_lag = $step_lag;

        function checkNextStep(ajax,expected,continuation) {
            if (ajax.readyState==4 && ajax.status==200)
            {
                clearTimeout(xmlHttpTimeout);
                if (ajax.responseText == expected) {
                   setTimeout('',step_lag);
                   continuation();
                } else {
                   statusPar.innerHTML = 'Unable to check for update<br>script continuing';
                   setTimeout("window.location.href = '$start_page&timeout=1'",1000);
                }
            }
        }

        function getXmlHttp() {
            if (window.XMLHttpRequest) {
                xmlhttp=new XMLHttpRequest();
            } else {
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xmlhttp;
        }
        var startMainLoaderWizard = function() {
            window.location.href = '$start_page';
        }
        var loaderVersionCheck = function() {
            statusPar.innerHTML = 'Stage 4/4: Getting latest loader versions';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",startMainLoaderWizard);
            }
            xmlHttp.open("GET","$self?page=loaderversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var platformCheck = function() {
            statusPar.innerHTML = 'Stage 3/4: Getting platform information';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",loaderVersionCheck);
            }
            xmlHttp.open("GET","$self?page=platforminfo",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var compilerVersionCheck = function() {
            statusPar.innerHTML = 'Stage 2/4: Getting compiler versions';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",platformCheck);
            }
            xmlHttp.open("GET","$self?page=compilerversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var startChecks = function() {
            statusPar = document.getElementById('status');
            statusPar.innerHTML = 'Stage 1/4: Getting Loader Wizard version';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",compilerVersionCheck);
            }
            xmlHttp.open("GET","$self?page=wizardversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        function ajaxTimeout(){
           ajax.abort();
           statusPar.innerHTML = 'Cannot reach server<br>script continuing';
           setTimeout("window.location.href = '$start_page&timeout=1'",1000);
        }
        </script>
    </head>
    <body>

    <div id="loading"><script type="text/javascript">document.write('<p>Initialising<br>ionCube Loader Wizard<br><span id="status"></span></p>');</script><p id="noscript">Your browser does not support JavaScript so the ionCube Loader Wizard initialisation cannot be made now. This script can get the latest loader version information from the ionCube server when you go to the next page.<br>Please choose one of the following. <br>If the script appears to hang please restart the script and choose the "NO" option.<br><br><br><a href="$start_page">YES - my server DOES have internet access</a><br><br><a href="$start_page&timeout=1">NO - my server does NOT have internet access</a></p></div>
    <script type="text/javascript">
        document.getElementById('noscript').style.display = 'none';
        window.onload = startChecks;
    </script>
    </body>
    </html>
EOT;
}

function default_page($loader_extension = LOADER_EXTENSION_NAME)
{
    $self = get_self();
    foreach (array('self') as $vn) {
        if (empty($$vn)) {
			$server_data = print_r($_SERVER,true);
            error("Unable to initialise ($vn)". ' $_SERVER is: ' . $server_data);
        }
    }

    heading();

    $wizard_update = check_for_wizard_update(true);

    $rtl = try_runtime_loading_if_applicable();

    $server_type = find_server_type();

    if (extension_loaded($loader_extension) && $server_type != SERVER_UNKNOWN) {
        loader_already_installed($rtl);
    } else {
        loader_not_installed();
    }
    send_stats('default');

    footer($wizard_update);
}

function uninstall_wizard_instructions()
{
    echo '<p><strong>For security reasons we advise that you remove this Wizard script from your server now that the ionCube Loader is installed.</strong></p>';
}

function contact_script_provider_instructions()
{
    echo '<p>Please contact the script provider if you do experience any problems running encoded files.</p>';
}

function may_need_to_copy_ini()
{
    $sys = get_sysinfo();
    if (ini_same_dir_as_wizard() && $sys['IS_CGI']) {
        $dirphrase = is_ms_windows()?'folder':'directory';
        $ini = ini_file_name();
        echo "<p>Please note that if encoded files in a different $dirphrase from the Wizard fail then you should attempt to copy the $ini file to each $dirphrase in which you have encoded files.</p>";
    }
}

function ioncube_24_is_available()
{
	$loaderinfo = get_loaderinfo();
	$php_ver = php_version();
   
	return ($loaderinfo['oscode'] == 'lin' && (($php_ver['major'] == 5 && $php_ver['minor'] >= 3) || $php_ver['major'] > 5) );
}

function ioncube_24_is_enabled()
{
	$ic24_enabled = ini_get(IC24_ENABLED_INI_PROPERTY);
	return $ic24_enabled;
}

function ioncube_24_information()
{
    if (ioncube_24_is_available() && !ioncube_24_is_enabled()) {
        $self = get_self();
        echo '<div class="ic24">';
        echo '<div class="ic24graphic">';
        echo '<a target="_blank" href="' . IONCUBE24_URL . '"><img id="ic24logo" src="' . $self . '?page=ic24logo" alt="ionCube24 logo"></a>';
        echo '</div>';
        echo '<div id="ic24info">';
        echo '<p><strong>Bonus Features!</strong> The ionCube Loader can also give ';
        echo '<strong>real-time intrusion protection</strong> to protect against malware and <strong>PHP error reporting</strong> ';
        echo 'to alert when things go wrong on your website.</p>';
        echo '<p>These features are disabled by default but easily activated. ';
        echo '<strong><a target="_blank" href="' . IONCUBE24_URL . '">visit ioncube24.com</a></strong> to find out more.</p>';
        echo '</div>';
        echo '</div>';
    }
}

function cli_install_instructions()
{

	if (is_php_version_or_greater(5,3)) {
		$cli_loader_installed = shell_exec('php -r "echo extension_loaded(\"' . LOADER_EXTENSION_NAME . '\");"');
		
		if (!$cli_loader_installed) {
			$cli_php_ini_output = shell_exec("php --ini");
			
			$ini_loader_loc = scan_inis_for_loader();
		
			if (!is_null($cli_php_ini_output)) {
				echo '<div class="panel">';
				echo '<h4>Loader Installation for Command-Line (CLI) PHP</h4>';
				echo "<p>At present it does not look like the ionCube Loader is installed for command-line (CLI) PHP.</p>";
				echo "<p>Please note that if you need to run the CLI PHP, such as for <strong>cron jobs</strong>, then please ensure the zend_extension line for the ionCube Loader is included in your CLI PHP configuration.</p>";
				
				if (!empty($ini_loader_loc['location'])) {
					echo "<p>The zend_extension line that needs to be copied is:</p>";
					echo "<p><kbd>zend_extension = " . $ini_loader_loc['location'] . "</kbd></p>";
				}
				
				echo "<p>Your CLI PHP Configuration is:</p>";
				echo '<div class="terminal">';
				echo "<pre>";
				echo $cli_php_ini_output;
				echo "</pre>";
				echo '</div>';
				echo '</div>';
			}
		}
	}
}

function successful_install_end_instructions($rtl_path = null)
{
    if (empty($rtl_path)) {
        may_need_to_copy_ini();
    } elseif (is_string($rtl_path)) {
        echo "<p>The runtime loading method of installation was used with path <code>$rtl_path</code></p>";
    }
    contact_script_provider_instructions();
    if (is_legacy_platform()) {
        legacy_platform_instructions();
    }
	
	if (!is_ms_windows() && is_php_version_or_greater(5,3)) {
		cli_install_instructions();
	}
	
    uninstall_wizard_instructions();
	
	ioncube_24_information();
}

function loader_major_version_instructions($mv)
{
    if ($mv < LATEST_LOADER_MAJOR_VERSION) {
        echo "<p><strong>The installed version of the Loader cannot run files produced by the most recent ionCube Encoder.</strong>";
        echo " You will need a version " . LATEST_LOADER_MAJOR_VERSION . " ionCube Loader to run such files.</p>";
    }
    return ($mv < LATEST_LOADER_MAJOR_VERSION);
}

function loader_already_installed($rtl = null)
{
    list($lv,$mv,$newer_version) = ioncube_loader_version_information();
    $phpv = php_version_maj_min();
    $php_str = ' for PHP ' . $phpv;
    echo '<div class="success">';
    echo '<h4>Loader Installed</h4>';
    if ($newer_version) {
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' is <strong>already installed</strong> but it is an old version.';
        echo ' It is recommended that the Loader be upgraded to the latest version if possible.</p>';
        $know_latest_version = is_string($newer_version);
        $is_legacy_loader = loader_major_version_instructions($mv);
        echo '</div>';
        loader_upgrade_instructions($lv,$newer_version);
    } else {
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' is already installed and encoded files should run without problems.</p>'; 
        echo '</div>';
        $is_legacy_loader = loader_major_version_instructions($mv,true);
        if ($is_legacy_loader) {
            loader_upgrade_instructions($lv,true);
        }
    }

    successful_install_end_instructions($rtl);
}

function loader_upgrade_instructions($installed_version,$newer_version)
{
    if ($newer_version) {
        echo '<div class="panel">';
        echo '<h4>Loader Upgrade Instructions</h4>';
        $restart_needed = true;
        $server_type = find_server_type();
        if ($server_type == SERVER_SHARED || $server_type == SERVER_UNKNOWN) {
            $loader_path = find_loader(true);
            if (!is_string($loader_path) || false === user_ini_space_path($loader_path)) {
                $verb_case = ($server_type == SERVER_UNKNOWN)?"may":"will";
                echo "<p>Please note that you $verb_case need your system administrator to do the following to upgrade. The web server will need to be restarted after the loader file is changed.</p>";
            }
            $restart_needed = false;
        }
        if (is_string($newer_version)) {
            $version_str = "version $newer_version";
        } else {
            $version_str = "a newer version";
        }
        $loader_name =  get_loader_name();
        echo "<p>To upgrade from version $installed_version to $version_str of the ionCube Loader, please replace your existing loader file, $loader_name, with
            the file of the same name from one of the following packages:</p>";
        if (is_ms_windows()) {
            $basename = windows_package_name();
        } else {
            list($basename,$multiple_os_versions) = unix_package_name();
        }
        echo make_archive_list($basename,array('zip','tar.gz'));
        if ($restart_needed) {
            echo "<p>Once you have replaced the loader file please restart your web server.</p>";
        }
        echo '</div>';
    }
}

function legacy_platform_warning()
{
    $leg_warn = '<p><strong>You are on a platform on which ionCube Loaders are no longer being developed. ';
    $leg_warn .= 'Loaders on your platform may not be able to run files produced by the latest ionCube Encoder. ';
    $leg_warn .= 'Please switch, if possible, to a platform on which loaders are currently supported. ';
    $leg_warn .= 'A list of currently supported platforms is shown on our <a href="' . LOADERS_PAGE . '" target="loaders">loaders page</a>.</strong></p>';

    return $leg_warn;
}

function legacy_platform_instructions()
{
    echo legacy_platform_warning();
}

function loader_not_installed()
{
    $loader = get_loaderinfo();
    $sysinfo = get_sysinfo();

    $stype = get_request_parameter('stype');
    $manual_select = get_request_parameter('manual');
    $host_type = find_server_type($stype,$manual_select,true);

    if ($host_type != SERVER_UNKNOWN && is_array($loader) && !$sysinfo['DEBUG_BUILD']) {
        $warnings = server_restriction_warnings();
        if (is_legacy_platform()) {
            $warnings[] = legacy_platform_warning();
        }
        if (empty($_SESSION['use_ini_method']) && $host_type == SERVER_SHARED && runtime_loading_is_possible()) {
            $errors = runtime_loading_errors();
        } else {
            $errors = ini_loader_errors();
            $warnings = array_merge($warnings,ini_loader_warnings());
        }
        if (!empty($errors)) {
            if (count($errors) > 1) {
                $problem_str = "Please note that the following problems currently exist";
            } else {
                $problem_str = "Please note that the following problem currently exists";
            }
            echo '<div class="alert">' .$problem_str . ' with the ionCube Loader installation:';
            echo make_list($errors,"ul"); 
            echo '</div>';
        }
        if (!empty($warnings)) {
            $addword = empty($errors)?'':'also';
            $plural = (count($warnings)>1)?'s':'';
            echo '<div class="warning">';
            echo "Please note $addword the following issue$plural:";
            echo make_list($warnings,"ul"); 
            echo '</div>';
        }
    }
    if (!isset($stype)) {
        echo '<p>To use files that have been protected by the <a href="' . ENCODER_URL . '" target=encoder>ionCube PHP Encoder</a>, a component called the ionCube Loader must be installed.</p>';
    }

    if (!is_supported_php_version()) {
        echo '<p>Your server is running PHP version ' . PHP_VERSION . ' and is
                unsupported by ionCube Loaders.  Recommended PHP 4 versions are PHP 4.2 or higher, 
                PHP 5.1 or higher for PHP 5, PHP 7.1 or higher for PHP 7 and PHP 8.1 or higher for PHP 8. Please note that there is not an ionCube Loader for PHP 8.0.</p>';
	} elseif ($latest_supported_php_version = is_after_max_php_version_supported()) {
		echo '<strong>Your server is running PHP version ' . PHP_VERSION . ' and is
                currently unsupported by any ionCube Loaders. <br/>This may change in the future if a Loader is produced for your PHP platform.<br/>In the meantime please downgrade PHP to version ' . $latest_supported_php_version . '.</strong>';
    } elseif ($sysinfo['DEBUG_BUILD']) {
         echo '<p>Your server is currently running a debug build of PHP. The Loader cannot be installed with a debug build of PHP. Please ensure that PHP is reconfigured with debug disabled. Note that debug builds of PHP cannot help in debugging PHP scripts.</p>'; 
    } elseif (!is_array($loader)) {
        if ($loader == ERROR_WINDOWS_64_BIT) {
            echo '<p>Loaders for 64-bit PHP on Windows are not currently available. However, if you <b>install and run 32-bit PHP</b> the corresponding 32-bit loader for Windows should work.</p>';
            if ($sysinfo['THREAD_SAFE']) {
                echo '<li>Download one of the following archives of 32-bit Windows x86 loaders:';
            } else {
                echo '<li>Download one of the following archives of 32-bit Windows non-TS x86 loaders:';
            }
            echo make_archive_list(windows_package_name());
        } else {
            echo '<p>There may not be an ionCube Loader available for your type of system at the moment. However, if you create a <a href="'  . SUPPORT_SITE . '">support ticket</a> more advice and information may be available to assist. Please include the URL for this Wizard in your ticket.</p>';
        }
    } elseif (!$sysinfo['SUPPORTED_COMPILER']) {
        $supported_compilers = supported_win_compilers();
        $supported_compiler_string = join('/',$supported_compilers);
        echo '<p>At the current time the ionCube Loader requires PHP to be built with ' . $supported_compiler_string . '. Your PHP software has been built using ' . $sysinfo['PHP_COMPILER'] . '. Supported builds of PHP are available from <a href="https://windows.php.net/download/">PHP.net</a>.';
    } else {
        switch ($host_type) {
            case SERVER_SHARED:
                shared_server();
                break;
            case SERVER_DEDICATED:
                dedicated_server();
                break;
            case SERVER_LOCAL:
                local_install();
                break;
            default:
                echo server_selection_form();
                break;
        }
    }
}

function server_selection_form()
{
    $self = get_self();
    $timeout = (isset($_SESSION['timing_out']) && $_SESSION['timing_out'])?1:0;
    $hostprovider = (!empty($_SESSION['hostprovider']))?$_SESSION['hostprovider']:'';
    $hostprovider = htmlspecialchars($hostprovider, ENT_QUOTES, 'UTF-8');
    $hosturl = (!empty($_SESSION['hosturl']))?$_SESSION['hosturl']:'';
    $hosturl =  htmlspecialchars($hosturl, ENT_QUOTES, 'UTF-8');
    $form = <<<EOT
    <p>This Wizard will give you information on how to install the ionCube Loader.</p>
    <p>Please select the type of web server that you have and then click Next.</p>
    <script type=text/javascript>
        function trim(s) {
            return s.replace(/^\s+|\s+$/g,"");
        }
        function input_ok() {
            var l = document.getElementById('local');
            if (l.checked) {
                return true;
            } 

            var s = document.getElementById('shared');
            var d = document.getElementById('dedi');

            if (!s.checked && !d.checked) {
                alert("Please select one of the server types.");
                return false;
            } else {
                var hn = document.getElementById('hostprovider');
                var hu = document.getElementById('hosturl');
                var hostprovider = trim(hn.value);
                var hosturl = trim(hu.value);

                if (!hostprovider || !hosturl) {
                    alert("Please enter both a hosting provider name and their URL.");
                    return false;
                }
                if (hostprovider.length < 1) {
                    alert("The hosting provider name should be at least 1 character in length.");
                    return false;
                }
                if (!hosturl.match(/[A-Za-z0-9-_]+\.[A-Za-z0-9-_%&\?\/.=]+/)) {
                    alert("The hosting provider URL is invalid.");
                    return false;
                }
                if (hosturl.length < 4) {
                    alert("The hosting provider URL should be at least 4 characters in length.");
                    return false;
                }
            }
            return true;
        }
    </script>
    <form method=GET action=$self>
        <input type="hidden" name="page" value="default">
        <input type="hidden" name="timeout" value="$timeout">
        <input type=radio id=shared name=stype value=s onclick="document.getElementById('hostinginfo').style.display = 'block';"><label for=shared>Shared <small>(for example, server with FTP access only and no access to php.ini)</small></label><br>
        <input type=radio id=dedi name=stype value=d onclick="document.getElementById('hostinginfo').style.display = 'block';"><label for=dedi>Dedicated or VPS <small>(server with full root ssh access)</small></label><br>
        <div id="hostinginfo" style="display: none">If you are on a shared or dedicated server, please give your hosting provider and their URL:
            <table>
                <tr><td><label for=hostprovider>Name of your hosting provider</label></td><td><input type=text id="hostprovider" name=hostprovider value="$hostprovider"></td></tr>
                <tr><td><label for=hosturl>URL of your hosting provider</label></td><td><input type=text id="hosturl" name=hosturl value="$hosturl"></td></tr>
            </table>
        </div>
        <input type=radio id=local name=stype value=l onclick="document.getElementById('hostinginfo').style.display = 'none';"><label for=local>Local install</label>
        <p><input type=submit value=Next onclick="return (input_ok(this) && showOverlay());"></p>
    </form>
EOT;
    return $form;
}

function phpinfo_page()
{
    info_disabled_check();
    if (function_is_disabled('phpinfo')) {
        echo "phpinfo is disabled on this server";
    } else {
        @phpinfo();
    }
}

function loader_check_page($ext_name = LOADER_EXTENSION_NAME)
{
    heading();

    $rtl_path = try_runtime_loading_if_applicable();
	
    if (extension_loaded($ext_name)) {
        list($lv,$mv,$newer_version) = ioncube_loader_version_information();
        $phpv = php_version_maj_min();
        $php_str = ' for PHP ' . $phpv;
        echo '<div class="success">';
        echo '<h4>Loader Installed Successfully</h4>';
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' <strong>is installed</strong> and encoded files should run successfully.';
        if ($newer_version) {
            echo ' Please note though that you have an old version of the ionCube Loader.</p>';
            $is_legacy_loader = loader_major_version_instructions($mv);
            echo '</div>';
            loader_upgrade_instructions($lv,$newer_version);
        } else {
            echo '</p>';
            $is_legacy_loader = loader_major_version_instructions($mv);
            echo '</div>';
            if ($is_legacy_loader) {
                loader_upgrade_instructions($lv,true);
            }
        }
        successful_install_end_instructions($rtl_path);
    } else {
        echo '<div class="failure">';
        echo '<h4>Loader Not Installed</h4>';
        echo '<p>The ionCube Loader is <b>not</b> currently installed successfully.</p>';
	
        if (!is_null($rtl_path)) {
            echo '<p>Runtime loading was attempted but has failed.</p>';
            echo '</div>';
            $rt_errors = runtime_loading_errors();
            if (!empty($rt_errors)) {
                list_loader_errors($rt_errors);
            } 
            link_to_php_ini_instructions();
        } else {
            echo '</div>';
            list_loader_errors();
        }
    }
	
    send_stats('check');
    footer(true);
}

function ini_loader_errors()
{
    $errors = array();
    if (SERVER_SHARED == find_server_type() && !own_php_ini_possible(true)) {
        $errors[ERROR_INI_USER_CANNOT_CREATE] = "It appears that you are not be able to create your own ini files on your shared server. <br><strong>You will need to ask your server administrator to install the ionCube Loader for you.</strong>";
    }
    $loader_loc = find_loader(false);
    if (is_string($loader_loc)) {
        if (!shared_and_runtime_loading()) {
            $sys = get_sysinfo();
            if (empty($sys['PHP_INI'])) {
                $errors[ERROR_INI_NO_PATH] = 'No file path found for the PHP configuration file (php.ini).';
            } elseif (!@file_exists($sys['PHP_INI'])) {
                $errors[ERROR_INI_NOT_FOUND] = 'The PHP configuration file (' . $sys['PHP_INI'] .') cannot be found.';
            }
        }
        $errors = $errors + loader_compatibility_test($loader_loc);
    } else {
        $errors = $errors + $loader_loc;
        $fs_location = find_loader_filesystem();
        if (!empty($fs_location)) {
            $fs_loader_errors = loader_compatibility_test($fs_location);
            if (!empty($fs_loader_errors)) {
                $errors[ERROR_LOADER_WRONG_GENERAL] = "The loader file found at $fs_location is not the correct one for your system.";
            }
            $errors = $errors + $fs_loader_errors;
        }
    } 
    return $errors;
}

function unix_path_dir($dir = '')
{
    if (empty($dir)) {
        $dir = dirname(__FILE__);
    }
    if (is_ms_windows()) {
        $dir = str_replace('\\','/',substr($dir,2));
    }
    return $dir;
}

function unrecognised_inis_webspace($startdir)
{
    $ini_list = array();

    $ini_name = ini_file_name();
    $sys = get_sysinfo();
    $depth = substr_count($startdir,'/');

    $rel_path = '';
    $rootpath = realpath($_SERVER['DOCUMENT_ROOT']);
    for ($seps = 0; $seps < $depth; $seps++) {
        $full_ini_loc = @realpath($startdir . '/' . $rel_path) . DIRECTORY_SEPARATOR . $ini_name;
        if (@file_exists($full_ini_loc) && $sys['PHP_INI'] != $full_ini_loc) {
            $ini_list[] = @realpath($full_ini_loc);
        }

        if (dirname($full_ini_loc) == $rootpath) {
            break;
        }
        $rel_path .= '../';
    }
    return $ini_list;
}

function correct_loader_wrong_location()
{
    $loader_location_pair = array();
    $loader_location = find_loader_filesystem();
    if (is_string($loader_location) && !empty($loader_location)) {
        $loader_errors = loader_compatibility_test($loader_location);
        if (empty($loader_errors)) {
            $ini_loader = scan_inis_for_loader();
            if (!empty($ini_loader['location'])) {
                $ini_loader_errors = loader_compatibility_test($ini_loader['location']);
                if (!empty($ini_loader_errors)) {
                    $loader_location_pair['loader'] = $loader_location;
                    $loader_location_pair['newloc'] = dirname($ini_loader['location']);
                }
            } else {
                $std_dir = loader_install_dir(find_server_type());
                $std_ld_path = $std_dir . DIRECTORY_SEPARATOR . get_loader_name();
                if (@file_exists($std_ld_path)) {
                    $stdloc_loader_errors = loader_compatibility_test($std_ld_path);
                } else {
                    $stdloc_loader_errors = array("Loader file does not exist.");
                }
                if (!empty($stdloc_loader_errors)) {
                    $loader_location_pair['loader'] = $loader_location;
                    $loader_location_pair['newloc'] = $std_dir;
                }
            }
        }
    }
    return $loader_location_pair;
}

function ini_loader_warnings()
{
    $warnings = array();
    if (find_server_type() == SERVER_SHARED)
    {
        if (own_php_ini_possible()) {
            $sys = get_sysinfo();
            $ini_name = ini_file_name();
            $rootpath = realpath($_SERVER['DOCUMENT_ROOT']);
            $root_ini_file = $rootpath . DIRECTORY_SEPARATOR . $ini_name;
            $cgibinpath = @realpath($_SERVER['DOCUMENT_ROOT'] . "/cgi-bin");
            $cgibin_ini_file = (empty($cgibinpath))?'':$cgibinpath . DIRECTORY_SEPARATOR . $ini_name;
            $here = unix_path_dir();
            $ini_files = unrecognised_inis_webspace($here);
            $shared_ini_loc = shared_ini_location();
            $shared_ini_file = $shared_ini_loc . DIRECTORY_SEPARATOR . $ini_name;
            $ini_dir = dirname($sys['PHP_INI']);
            $all_ini_locations_used = !empty($ini_files);
            foreach ($ini_files as $full_ini_loc) {
                $advice = "The file $full_ini_loc is not being recognised by PHP.";
                $advice .= " Please check that the name and location of the file are correct.";
                if (!ini_same_dir_as_wizard()) {
                    $ini_loc_dir = dirname($full_ini_loc);
                    if (!@file_exists($shared_ini_file) && !empty($shared_ini_loc) && $ini_loc_dir != $shared_ini_loc && $ini_dir != $shared_ini_loc) {
                        $all_ini_locations_used = false;
                        $advice .= " Please try copying the <code>$full_ini_loc</code> file to <code>" . $shared_ini_loc . "</code>.";
                    } else {
                        if (!@file_exists($root_ini_file) && $rootpath != $shared_ini_loc && $full_ini_loc != $rootpath) {
                            $all_ini_locations_used = false;
                            $advice .= " Please try copying the <code>$full_ini_loc</code> file to <code>" . $rootpath . "</code>.";
                        } 
                        if (!empty($cgibin_ini_file) && !@file_exists($cgibin_ini_file) && $cgibinpath != $shared_ini_loc && $full_ini_loc != $cgibinpath && $cgibinpath != $rootpath) {
                            $all_ini_locations_used = false;
                            $advice .= "  Please try copying the <code>$full_ini_loc</code> file to <code>" . $cgibinpath . "</code>.";
                        }
                        $herepath = realpath($here);
                        $here_ini_file = $herepath . DIRECTORY_SEPARATOR . $ini_name;
                        if (!@file_exists($here_ini_file) && $herepath != $rootpath && $herepath != $cgibinpath) {
                            $all_ini_locations_used = false;
                            $advice .= " It may be necessary to copy the <code>$full_ini_loc</code> file to <code>$herepath</code> and to all " . (is_ms_windows()?'folders':'directories') . ' in which you have encoded files';
                        }
                    }
                } else {
                    $all_ini_locations_used = false;
                }
                $warnings[] = $advice;
            }
            if ($all_ini_locations_used) {
                $warnings[] = "<strong>It looks as if ini files are not being recognised in any of the standard locations in your webspace. Please contact your hosting provider to check whether you can create your own PHP ini file and where it should go.</strong>";
            }
        } else {
            if (own_php_ini_possible(true)) {
                $warnings[] = "You may not be able to create your own ini files on your shared server. <br><strong>You might need to ask your server administrator to install the ionCube Loader for you.</strong>";
            }
        }
    } else {
        $loader_dir_pair = correct_loader_wrong_location();
        if (!empty($loader_dir_pair)) {
            $advice = "The correct loader for your system has been found at <code>{$loader_dir_pair['loader']}</code>."; 
            if ($loader_dir_pair['loader'] != $loader_dir_pair['newloc']) {
                $advice .= " Please copy the loader from <code>{$loader_dir_pair['loader']}</code> to <code>{$loader_dir_pair['newloc']}</code>.";
            }
            $warnings[] = $advice;
        }
    }
    return $warnings;
}

function list_loader_errors($errors = array(),$warnings = array(),$suggest_restart = true)
{
    $default = get_default_address();
    $retry_message = '';

    
    if (empty($errors)) {
        $errors = ini_loader_errors();
        if (empty($warnings)) {
            $warnings = ini_loader_warnings();
        }
    }
	
    if (!empty($errors)) {
        $try_again = '<a href="#" onClick="window.location.href=window.location.href">try again</a>';
	
        echo '<div class="alert">';
        if (count($errors) > 1) {
            echo 'The following problems have been found with the ionCube Loader installation:';
            $retry_message = "Please correct those errors and $try_again.";
        } else {
            echo 'The following problem has been found with the ionCube Loader installation:';
            $retry_message = "Please correct that error and $try_again.";
        }
        if (array_key_exists(ERROR_INI_USER_CANNOT_CREATE,$errors)) {
            $retry_message = '';
        }
        echo make_list($errors,"ul");
        echo '</div>';
        if (!empty($warnings)) {
            echo '<div class="warning">';
            echo 'Please also note the following:';
            echo make_list($warnings,"ul");
            echo '</div>';
        }
    } elseif (!empty($warnings)) {
        echo '<div class="warning">';
        echo 'There are the following potential problems:';
        echo make_list($warnings,"ul");
        echo '</div>';
    } elseif ($suggest_restart) {
        if (SERVER_SHARED == find_server_type()) {
            echo "<p>Please contact your server administrator about installing the ionCube Loader.</p>";
        } else {
            if (selinux_is_enabled()) {
                echo "<p>It appears that SELinux is enabled on your server. This might be solved by running the command <code>restorecon [full path to loader file]</code> as root.</p>";
            } elseif (grsecurity_is_enabled()) {
                echo "<p>It appears that grsecurity is enabled on your server. Please run the command, <code>execstack -c [full path to loader file]</code> and then restart your web server.</p>";
            } else {
                $sysinfo = get_sysinfo();
                $ss = $sysinfo['SS'];
				if ($ss == 'PHP-FPM') {
					echo "<p>Please check that PHP-FPM has been restarted.</p>";
                } elseif (!$sysinfo['CGI_CLI'] || is_ms_windows()) {
                    echo "<p>Please check that the $ss web server software has been restarted.</p>";
                } 
            }
        }
    }
    echo '<div>';
    echo $retry_message;
    echo " You may wish to view the following for further help:";
    echo make_list(help_resources($errors),"ul");
    echo '<a href="' . $default . '">Click here to go back to the start of the Loader Wizard</a>.</div>';
}

function phpconfig_page()
{
    info_disabled_check();
    $sys = get_sysinfo();
    $download = get_request_parameter('download');
    $ini_file_name = '';
    if (!empty($download)) {
        $ini_file_name = get_request_parameter('ininame');
        if (empty($ini_file_name)) {
            $ini_file_name = ini_file_name();
        } else {
			if (!preg_match('`^.*\.ini$`',$ini_file_name) || preg_match('`/`',$ini_file_name) || preg_match('`\\\`',$ini_file_name)) {
				die("Illegal file name $ini_file_name");
			}
		}
        header('Content-Type: text/plain');
        header('Content-Disposition: attachment; filename=' . $ini_file_name);
    } else {
        header('Content-Type: text/plain');
    }
    $exclude_original = get_request_parameter('newlinesonly');
    $prepend = get_request_parameter('prepend');
    $stype = get_request_parameter('stype');
    $server_type = find_server_type($stype);
    if (!empty($exclude_original) || !empty($prepend)) {
        $loader_dir = loader_install_dir($server_type);
        $zend_lines = zend_extension_lines($loader_dir);
        echo join(PHP_EOL,$zend_lines);
        echo PHP_EOL;
    }
    if (empty($ini_file_name) || empty($sys['PHP_INI_DIR']) || ($sys['PHP_INI_BASENAME'] == $ini_file_name)) {
        $original_ini_file = isset($sys['PHP_INI'])?$sys['PHP_INI']:'';
    } else {
        $original_ini_file = $sys['PHP_INI_DIR'] . DIRECTORY_SEPARATOR . $ini_file_name;
    }
    if (empty($exclude_original) && !empty($original_ini_file) && @file_exists($original_ini_file)) {
        if (!empty($download)) {
            @readfile($original_ini_file);
        } else {
            echo all_ini_contents();
        } 
    }
}

function extra_page($check_access_to_info = true)
{
    if ($check_access_to_info) {
		info_disabled_check();
	}
    heading();
    $sys = get_sysinfo();
    $ini_loader = scan_inis_for_loader();
    $ini_loader_path = $ini_loader['location'];
    $loader_path = find_loader(true);
    $ldinf = get_loaderinfo();
    $self = get_self();
    echo "<h4>Additional Information</h4>";
    echo "<table>";
    $lines = array();
    if (is_string($loader_path)) {
        $lines['Loader is at'] = $loader_path;
        $loader_system = loader_system($loader_path);
        if (!empty($loader_system)) {
            $lines['Loader OS code'] = $loader_system['oscode'];
            $lines['Loader architecture'] = $loader_system['arch'];
            $lines['Loader word size'] = $loader_system['wordsize'];
            $lines['Loader PHP version'] = $loader_system['php_version'];
            $lines['Loader thread safety'] = $loader_system['thread_safe']?'Yes':'No';
            $lines['Loader compiler'] = $loader_system['compiler'];
            $lines['Loader version'] = $loader_system['loader_version'];
            $lines['File size is'] = filesize($loader_path) . " bytes.";
            $lines['MD5 sum is'] = md5_file($loader_path);
        }
        $lines['Loader file'] = "<a href=\"$self?page=loaderbin\">Download loader file</a>";
    } else {
        $lines['Loader file'] = "Loader cannot be found.";
    }
    $lines['Loader found in ini file'] = empty($ini_loader_path)?"No":"Yes";
    if (!empty($ini_loader_path) && (!is_string($loader_path) || $ini_loader_path != $loader_path)) {
        $lines['Loader location found in ini file'] =  $ini_loader_path;
        $loader_system = loader_system($ini_loader_path);
        if (!empty($loader_system)) {
            $lines['Ini Loader OS code'] = $loader_system['oscode'];
            $lines['Ini Loader architecture'] = $loader_system['arch'];
            $lines['Ini Loader word size'] = $loader_system['wordsize'];
            $lines['Ini Loader PHP version'] = $loader_system['php_version'];
            $lines['Ini Loader thread safety'] = $loader_system['thread_safe']?'Yes':'No';
            $lines['Ini Loader compiler'] = $loader_system['compiler'];
            $lines['Ini Loader version'] = $loader_system['loader_version'];
        }
    }
    $lines["OS extra security"] = (selinux_is_enabled() || possibly_selinux())?"SELinux":(grsecurity_is_enabled()?"Grsecurity":"None");
    $lines['PHPRC is'] = $sys['PHPRC'];
    $lines['INI DIR is'] = $sys['PHP_INI_DIR'];
    $lines['Additional INI files'] = $sys['PHP_INI_ADDITIONAL'];
    $stype = get_request_parameter('stype');
    $server_type = find_server_type($stype);
    $lines['Server type is'] = server_type_string();
    $lines["PHP uname"] = $ldinf['uname'];
    $lines['Server word size is'] = $ldinf['wordsize'];
    $lines['Disabled functions'] = ini_get('disable_functions');
    $writeable_dirs = writeable_directories();
    $lines['Writeable loader locations'] = (empty($writeable_dirs))?"<em>None</em>":join(", ",$writeable_dirs);
    if (!empty($_SESSION['hostprovider'])) {
        $lines['Hosting provider'] = $_SESSION['hostprovider'];
        $lines['Provider URL'] = $_SESSION['hosturl'];
    }
    foreach ($lines as $h => $i) {
        $v = (empty($i))?'<em>EMPTY</em>':$i;
        echo '<tr><th>'. $h . ':</th>' . '<td>' . $v . '</td></tr>';
    }
    echo "</table>";
    footer(true);
}

function loaderbin_page()
{
    info_disabled_check();
    $loader_path = find_loader(true);
    if (is_string($loader_path)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='. basename($loader_path));
        @readfile($loader_path);
    }
}



function GoDaddy_root($html_root = '')
{
    if (empty($_SESSION['not_go_daddy']) && empty($_SESSION['godaddy_root'])) {
        $godaddy_pattern = "[\\/]home[\\/]content[\\/][0-9a-z][\\/][0-9a-z][\\/][0-9a-z][\\/][0-9a-z]+[\\/]html";

        if (empty($html_root)) {
            $html_root =  $_SERVER['DOCUMENT_ROOT'];
        }
        if (preg_match("@$godaddy_pattern@i",$html_root,$matches)) {
            $_SESSION['godaddy_root'] = $matches[0];
        } else {
            $_SESSION['not_go_daddy'] = 1;
            $_SESSION['godaddy_root'] = '';
        } 
    } elseif (!empty($_SESSION['not_go_daddy'])) {
        $_SESSION['godaddy_root'] = '';
    }
    if (!empty($_SESSION['godaddy_root'])) {
        $_SESSION['hostprovider'] = 'GoDaddy';
        $_SESSION['hosturl'] = 'www.godaddy.com';
    }
    return $_SESSION['godaddy_root'];
}

function GoDaddy_windows_instructions()
{
    $instr = "It appears that you are hosted on a Windows server at GoDaddy.<br/>";
    $instr .= "Please change to a Linux hosting plan at GoDaddy.<br />";
    $instr .=  "If you <a href=\"https://help.godaddy.com/\">contact their support team</a> they should be able to switch you to a Linux server.";

    echo $instr;
}

function GoDaddy_linux_instructions($html_dir)
{
    $base = get_base_address();
    $loader_name = get_loader_name();
    $zend_extension_line="<code>zend_extension = $html_dir/ioncube/$loader_name</code>";
    $php_ini_name = is_php_version_or_greater(5,0)?'php5.ini':'php.ini';
    $ini_path = $html_dir . '/' . $php_ini_name;

    $instr = array();
    $instr[] = 'In your html directory, ' . $html_dir . ', create a sub-directory called <b>ioncube</b>.';
    if (@file_exists($ini_path)) {
       $instr[] = "Edit the $php_ini_name in your  $html_dir and add the following line to the <b>top</b> of the file:<br>" . $zend_extension_line ;
    } else {
        $instr[] = "<a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=s&amp;download=1&amp;prepend=1\">Save this $php_ini_name file</a> and upload it to your html directory, $html_dir";
    }
    $instr[] = 'Download the <a target="_blank" href="' . IONCUBE_DOWNLOADS_SERVER . '"/ioncube_loaders_lin_x86.zip">Linux ionCube Loaders</a>.';
    $instr[] = 'Unzip the loaders and upload them into the ioncube directory you created previously.';
    $instr[] = 'The encoded files should now be working.';

    echo '<div class=panel>';
    echo (make_list($instr));
    echo '</div>';
}

function GoDaddy_page()
{
    $base = get_base_address();

    heading();

        $inst_str = '<h4>GoDaddy Installation Instructions</h4>';
        $inst_str .= '<p>It appears that you are hosted with GoDaddy (<a target="_blank" href="https://www.godaddy.com/">www.godaddy.com</a>). ';
        $inst_str .= "If that is <b>not</b> the case then please <a href=\"$base&amp;page=default&amp;host=ngd\">click here to go to the main page of this installation wizard</a>.</p>";
        $inst_str .= "<p>If you have already installed the loader then please <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">click here to test the loader</a>.</p>";

        echo $inst_str;

        if (is_ms_windows()) {
            GoDaddy_windows_instructions();
        } else {
            GoDaddy_linux_instructions($_SESSION['godaddy_root']);
        }

    send_stats('gd_default');

    footer(true);
}



function get_request_parameter($param_name)
{
    static $request_array;

    if (!isset($request_array)) {
        if (isset($_GET)) {
            $request_array = $_GET;
        } elseif (isset($HTTP_GET_VARS)) {
            $request_array = $HTTP_GET_VARS;
        }
    }

    if (isset($request_array[$param_name])) {
        $return_value = strip_tags($request_array[$param_name]);
    } else {
        $return_value = null;
    }
    return $return_value;
}

function make_list($list_items,$list_type='ol')
{
    $html = '';
    if (!empty($list_items)) {
        $html .= "<$list_type>";
        $html .= '<li>';
        $html .= join('</li><li>',$list_items);
        $html .= '</li>';
        $html .= "</$list_type>";
    }
    return $html;
} 

function make_archive_list($basename,$archives_list = array(),$download_server = IONCUBE_DOWNLOADS_SERVER)
{
    if (empty($archives_list)) {
        $archives_list = array('tar.gz','zip');
    }

    foreach ($archives_list as $a) {
        $link_text = $a;
        $ext_sep = '.';
        $archive_list[] = "<a href=\"$download_server/$basename$ext_sep$a\">$link_text</a>";
    }

    return make_list($archive_list,"ul");
}

function error($m)
{
    die("<b>ERROR:</b> <span class=\"error\">$m</span><p>Please help us improve this script by <a href=\"". SUPPORT_SITE . "\">reporting this error</a> and including the URL to the script so that we can test it.");
}


function filter_server_input($server_var)
{
	$res = htmlspecialchars($_SERVER[$server_var], ENT_QUOTES, "UTF-8");
	return $res;
}

function failsafe_get_self()
{
    $result = '';
    $sfn = filter_server_input('SCRIPT_FILENAME');
    $dr = $_SERVER['DOCUMENT_ROOT'];
    if (!empty($sfn) && !empty($dr)) {
        if ($dr == '/' || $dr == '\\') {
            $result = $sfn;
        } else {
            $drpos = strpos($sfn,$dr);
            if ($drpos === 0) {
                $drlen = strlen($dr);
                $result = substr($sfn,$drlen);
            }
        }
        $result = str_replace('\\','/',$result);
    }
    if (empty($result)) {
        $result = DEFAULT_SELF;
    }
    return $result;
}

function get_self()
{ 
	$page = '';
    if (empty($_SERVER['PHP_SELF'])) {
        if (empty($_SERVER['SCRIPT_NAME'])) {
            if (empty($_SERVER['REQUEST_URI'])) {
                $page = failsafe_get_self();
            } else {
                $page = filter_server_input('REQUEST_URI');
            }
        } else {
            $page = filter_server_input('SCRIPT_NAME');
        }
    } else {
        $page = filter_server_input('PHP_SELF');
    }
	return $page;
}

function get_default_page()
{
    $godaddy_root = GoDaddy_root();
    if (empty($godaddy_root)) {
         $page = 'default';
    } else {
         $page = 'GoDaddy';
    }
    return $page;
}

function get_base_address()
{
    $self = get_self();
    $remote_timeout = (isset($_SESSION['timing_out']) && $_SESSION['timing_out'])?'timeout=1':'timeout=0';
    $using_ini = (isset($_SESSION['use_ini_method']) && $_SESSION['use_ini_method'])?'ini=1':'ini=0';
    return $self . '?' . $remote_timeout . '&' . $using_ini;
}

function get_default_address($include_timeout = true)
{
    if ($include_timeout) {
        $base =  get_base_address();
        $base .= "&amp;";
    } else {
        $base = get_self();
        $base .= "?";
    }
    $page = get_default_page();

    return $base . 'page=' . $page;
}

function heading()
{
    $self = get_self();

    echo <<<EOT
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <meta name="robots" content="noindex, nofollow">
    <head>
        <title>ionCube Loader Wizard</title>
        <link rel="stylesheet" type="text/css" href="$self?page=css">
        <script type="text/javascript">
            function showOverlay()
            {
                document.getElementById('overlay').style.display = 'block';
                return true;
            }

            function hideOverlay()
            {
                document.getElementById('overlay').style.display = 'none';
                return true;
            }
        </script>
    </head>
    <body onload="hideOverlay()">
    <div id="overlay">
        <div id="inner_overlay">Checking server configuration<br>Please wait</div>
    </div>
    <div id="header">
        <img src="?page=logo" alt="ionCube logo">
    </div>
	<div id="important">
	<h3 class="important">IMPORTANT: Ensure that This Script Is Removed When No Longer Required</h3>
	</div>
    <div id="main">
    <h2>ionCube Loader Wizard</h2>
EOT;
}

function footer($update_info = null)
{
    $self = get_self();
    $base = get_base_address();
    $default = get_default_address(false);
    $year = gmdate("Y");

    echo "</div>";
    echo "<div id=\"footer\">" .
    "Copyright ionCube Ltd. 2002-$year | " .
    "Loader Wizard version " . script_version() . " ";

    if ($update_info === true) {
        $update_info = check_for_wizard_update(false);  
    }
    $loader_wizard_loc = LOADER_WIZARD_URL;
    $wizard_version_string =<<<EOT
    <script type="text/javascript">
    var xmlhttp;
    function version_check()
    { 
        var body = document.getElementsByTagName('body')[0];
        var ldel = document.getElementById('loading');
        if (!ldel) {
            body.innerHTML += '<div id="loading"></div>';
            ldel = document.getElementById('loading');
        }
        ldel.innerHTML = '<p>Retrieving Wizard version information<br>Please wait</p>';
        ldel.style.display = 'block';
        ldel.style.height = '300px';
        ldel.style.left = '200px';
        ldel.style.border = '4px #660000 solid';
        if (window.XMLHttpRequest) {
            xmlhttp=new XMLHttpRequest();
        } else {
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            var loadedOkay = 0;
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                var wizardversion = xmlhttp.responseText;
                var msg;
                clearTimeout(xmlHttpTimeout);
                buttons = '';
                if (wizardversion == '1') {
                    msg = 'You have the current version of the<br>ionCube Loader Wizard'; 
                } else if (wizardversion != '0') {
                    msg = 'A new version, ' + wizardversion + ', of the loader wizard is available';
                    buttons = '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; window.open(\'$loader_wizard_loc\'); return false">Get new version</button> &nbsp;'; 
                } else {
                    msg = 'Wizard version information cannot be obtained from the<br>ionCube server';
                }
                buttons += '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; return false">Close this box</button>'; 
                ldel.innerHTML = '<p>' + msg +  '<br>' + buttons + '</p>';
            }
        }
        xmlhttp.open("GET",'$self?page=wizardversion&wizard_only=1&clear_info=1',true);
        xmlhttp.send();
        var xmlHttpTimeout=setTimeout(ajaxTimeout,7000);
    }
    function ajaxTimeout(){
       xmlhttp.abort();
       msg = 'Wizard version information cannot be obtained from the<br>ionCube server';
       button = '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; return false">Close this box</button>';
       var ldel = document.getElementById('loading');
       ldel.innerHTML = '<p>' + msg +  '<br>' + button + '</p>';
    }
    </script>
EOT;

    $wizard_version_string .= '('; 
    if ($update_info === null) {
        $wizard_version_string .= '<a target="_blank" href="' . $loader_wizard_loc . '" onclick="version_check();return false;">check for new version</a>';
    } else if ($update_info !== false) {
        $wizard_version_string .= '<a href="' . LOADERS_PAGE .'" target="_blank">download version ' . $update_info . '</a>';
    } else {
        $wizard_version_string .=  "current";
    }
    $wizard_version_string .= ')'; 
    echo $wizard_version_string;

    $server_type_code = server_type_code();
	
	if (!info_should_be_disabled(true)) {
		echo " | <a href=\"$base&amp;page=phpinfo\" target=\"phpinfo\">phpinfo</a>";
		echo " | <a href=\"$base&amp;page=phpconfig\" target=\"phpconfig\">config</a>";
		echo " | <a href=\"$base&amp;page=extra&amp;stype=$server_type_code\" target=\"extra\">additional</a>";
	}

    echo " | <a href=\"$default\" onclick=\"showOverlay();\">wizard start</a>";
    echo " | <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">loader test</a>";
    echo ' | <a href="' . LOADERS_PAGE . '" target="loaders">loaders</a>';

    echo "</div>\n";
    echo "\n</body></html>\n";
}

function css_page()
{
    header('Content-Type: text/css');
    echo <<<EOT
    body {
        font-family: verdana, helvetica, arial, sans-serif;
        font-size: 10pt;
        line-height: 150%;
        margin: 0px;
        min-height: 400px;
        position: relative;
    }

    code {
        color: #c00080;
    }

    li {
        margin-top: 10px;
    }
    #overlay {
        display: block;
        z-index: 100;
        position: absolute;
        top: 0;
        left: 0;
        padding: 0;
        margin: 0;
        width: 100%;
        height: 100%;
        background-color: white;
    }
    #inner_overlay {
        display: block;
        z-index: 100;
        position: absolute;
        font-size: 200%;
        color: #660000;
        top: 50%;
        left: 25%;
        width: 460px;
        height: 460px;
        line-height: 200%;
        text-align: center;
        vertical-align: middle;
    }

    #loading {
        display: block;
        position: absolute;
        top: 33%;
        left: 25%;
        margin: auto;
        height: 320px;
        width: 460px;
        padding: 4px;
        color: #660000;
        background-color: white;
        z-index: 100;
    }

    #loading p {
        position: absolute;
        margin-top: 10px;
        text-align: center;
        vertical-align: middle;
        padding-left: 40px;
        padding-right: 30px;
        font-size: 200%;
        line-height: 200%;
    }

    #loading p span#status{
        font-size: 60%;
        line-height: 120%;
    }
    #loading p#noscript {
        font-size: 120%;
        line-height: 120%;
        position: absolute;
        text-align: left;
        padding-top: 10px;
        bottom: 0;
    }
    #loading p#noscript a {
        text-align: center;
    }

    #loading button {
        margin-top: 20px;
        line-height: 100%;
        padding-top: 4px;
        padding-bottom: 4px;
    }


    h4 {
        margin-bottom: 0;
        padding-bottom: 4px;
    }

    p,#main div {
        max-width: 1000px;
        width: 75%;
    }

    #hostinginfo {
        margin-top: 10px;
        margin-left: 20px;
    }
    #hostinginfo table {
        font-size: 1.00em;
    }
    #hostinginfo table td {
        padding-right: 4px;
    }
    #hostinginfo input {
        margin-top: 6px;
    }

    #hostinginfo label {
        margin-left: 6px;
    }

    th {
        text-align: left;
    }
	
	#important {
		margin-top: 12px;
	} 
	h3.important {
		margin: 0;
		border: 0;
        border-top: 1px solid #660000;
		border-bottom: 1px solid #660000;
        padding: 1ex 0 1ex 0;
        background-color: #CB2430;
		text-align: center;
        color: #ffffff; 
        width: 100%;
	}

    .alert {
        margin: 2ex 0;
        border: 1px solid #660000;
        padding: 1ex 1em;
        background-color: #ffeeee;
        color: #660000; 
        width: 75%;
    }

    .warning {
        margin: 2ex 0;
        border: 1px solid #FFBF00;
        padding: 1ex 1em;
        background-color: #FDF5E6;
        color: #000000; 
        width: 75%;
    }

    .success {
        margin: 2ex 0;
        border: 1px solid #006600;
        padding: 1ex 1em;
        background-color: #EEFFEE;
        color: #000000; 
        width: 75%;
    }

    .error {
        color: #FF0000;
    }

    .panel {
        border: 1px solid #c0c0c0;
        background-color: #f0f0f0;
        width: 75%;
        padding: 1ex 1em;
    }
	
	.terminal {
		border: none;
		background-color: #000000;
		color: #ffffff;
		width: 50%;
		padding: 1ex 1em;
	}

    #header {
        background: #fff;
    }

    #footer {
        border-top: 1px solid #404040;
        margin-top: 20px;
        padding-top: 10px;
        padding-left: 20px;
        font-size: 75%;
        text-align: left;
    }

    #main {
        margin: 20px;
    }
	
	
	#main .ic24 {
		position: relative;
		width: 75%;
		height: auto;
		border-width: 1px 1px 1px 1px;
		border-style: solid;
		border-color: #4B8DF8;   
		background-color: #EFEFFF;
		padding: 12px;
		padding-top: 16px;
		padding-bottom: 8px;
		margin-top: 20px;
		overflow: hidden;
	}
	
	#main .ic24 p {
		width: 100%;
	}
	
	
	#main .ic24graphic {
		position: relative;
		width: auto;
		height: auto;
		border: none;
		padding: 0px;
		padding-right: 16px;
		margin: 0px;
		float: left;
		
	}
	
	#main #ic24info {
		position: relative;
		width: auto;
		height: auto;
		float: left;
	}
	
	#main #ic24info a {
		color: #0B4DB8;
		text-decoration: none;
	}
	
	#main #ic24logo {
		max-width: 132px;
		max-height: 132px;
	}
	
EOT;
}

function logo_page()
{
$img_encoded = 'iVBORw0KGgoAAAANSUhEUgAAAakAAACABAMAAABD1osiAAAAKlBMVEUAAAAAAADnHCwAAAAAAAAAAAAAAAAAAABMCQ4AAADnHCznHCznHCwAAAAjcBE1AAAADHRSTlMAeDRHwSqg4BJl/PLTJLuIAAAF1UlEQVR42u2by4vTQBzHp3TTzR6EBtfXYS/+BZW6Pg6FFavgoRDBBx4KFd+HQgWFvQQqiuJhoeL7sP+LR0EPlj6yPfz+F5NMZ77TmmJjM3ZT5nNpOzvNzGcev5lMusxgMBgMBoPBYDAYDAaDwWDQwel5YRnC/jkvbZYdjFV2MFbZwVhlB2OVIVZyb2HIED/n5AfLEj/nhWUJY5UdjFV2MFbZwVgdMqzNZydXz2qrf59Kq2a1NmTsRnfVrLZOfj3VrrkrZuVb/dpBvZEJqzOOc5TNQ75rjXKDtV+ZsNoi6rJ52OhZwxONwiGwsi46zqnt1Kx8r7N8q/wmRfhP3BSsrK7VW/u13krDysGwT8o5kvilxa2YZ/U2eulEC0KhCTlLCo0UrPYff7Tfe+2lWt0glTT6qjB02e0eW6ZVjiZYaF4hq+eXlmll1yik75TL5eMeDVOxsj89hNQyrN5QyDFRm9GCVmCZVrYXBr4OE9w8ZFbBCNr+x646ycAhs/o3moFUj62Y1UY4/txVs9oLrAZs1azCAVhaNSsLgXNpVt/+dlNXZAplx4mLiXecU5hHhcBqN6lV/p3znk1xEYUltfr+t0J/4dN1jwKGWIg+VKuBdL5JAQ9EYj34ILOAjWq12lG+eE2xsk9EF/7CFN7WKOCpq9kK2/CTyp93mFUbpyKRZmwNi2oX4Y0dfgULd8QL4vRdvVavJ+6XYLVPIQjmHq9xAqvbJBTa8paTBCOtVpZHY1DrSmCF7flABotBIiuLJM+RQdJJO1qoVnUKqfLh1pBWrX10YVu0ciuRVXjlfpUiXGSmp85xdFaaT7thZUV95I5DRldaDYJPT8oXmyQqnYP0nFZetL23tgjtsT/e8uc9mKa3XsFqL3Rpy3YsCSufhwmrJgbeGmo/jxUCjd2UzWWFg1EuEzv6rJoY4ftyQapghBRElda5cxKrEfaPvGPWw+Esyx1ps8pHhaP0LqxK8p7KZwFHklt1kEqNcbsNcFfT12a1zgtEv7WFVZehB93xUGVJrPg7MXgPxotDUWlCV5dVhYtgjhV5KuLd+jixktjqYHoHmVcLw9fSt2ry8lDBlrAqKomN5FZI5aX0+Rztqmk7uqywtGKhRQ+KmbeT3AoDDN89gsJQBQ1WWFrFpmgkIruq2kpuhWCASFNBYXxN1GGFKk1XqqLWiXjeOvpv3n2gpBDm4dtL1aqnyaqAcA2bGCu0d3Ir5GkSPasKsFlO3WpNGf68P3wdVhs84tRIRZ/VEUwWfIyxwo4puRUiDh0+q2jntnJWOf6aplVv+VZ5VGMBq3tlhQuarNYnw3V9Zgzkr8PFYiByAi0xcM7ILva+7kJWNeyktVoV5l2FeSI1kluh8UKrlnar6dv2qNhejBVG6yDeaifOajg5X9tR4sH/sLIIBeFTjJV4JMImmd5KNmGFvHxfyV9Guq2mDvnQc9NWyIuOBWrD2BSzZ4fsHi6rzUq26cRdY2e2VSU+ChJ6IDdh1Zi+wylAVa9VfWqu+2y2VYFiO6uGzHsTVj01WOxgsOq3KqB0nMbMsLK96fNxKVASgrDCSogcHjpbq5WNg1WcVsRY4Zi3i1Xblqm7OLFXrHbRWn2GxUG/FduX0yIHwRlWFomD3ojrT+Vxje+KE3tYiQ6ym3JJKKidnW9rscJkuSwOiUdsphXO5P2724y9PPOI+njMMSyxOzWiTViF7/0v4kS6gzEcZA0545X0WbFmVClnk1B4vJXsDYArcPzXitUxCnhW5f070SyXHGfTw1jUYVUgMGKzrTBKQQk/LonYzSlWxToyFuOapaXRim2hqd2/WbFbJEBlLTx8k1a1QNmaai0eUMBAp5XVFFIdNtMqVqs/nhmvpGQuSJRWUmHoMsl5klzRacWsE4Sn3TOswMtH9Mfvbj+L36JNWrFzUgqcE6ofdf8X9PXN6qWjbF5eOverV51ye/ICd+NCWv549er0ha3o69vMYDAYDAaDwWAwGAwGg8FgSJffF2mwYDNbStYAAAAASUVORK5CYII=';

    header('Content-Type: image/png');
    header('Cache-Control: public');
    echo base64_decode($img_encoded);
}

function ic24logo_page()
{
	$img_encoded = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6b3NiPSJodHRwOi8vd3d3Lm9wZW5zd2F0Y2hib29rLm9yZy91cmkvMjAwOS9vc2IiCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSI2OTAiCiAgIGhlaWdodD0iNjkxLjI1IgogICB2aWV3Qm94PSIwIDAgNTUyIDU1MyIKICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIKICAgaWQ9InN2ZzMwMzUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNSByMTAwNDAiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImlvbkN1YmUyNF9jdWJlLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczMwODMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ5IgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMjczYjg7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTM1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNDMiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MzQ1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTMzNyIKICAgICAgIG9zYjpwYWludD0ic29saWQiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTI3M2I4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUzMzkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzMxIgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTMzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMjUiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzEyNzNiODtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MzI3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg4NSIKICAgICAgIG9zYjpwYWludD0ic29saWQiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTI3M2I4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDM4ODciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODc5IgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMjczYjg7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzg4MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4NzMiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzEyNzNiODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzODc1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMzNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNDEiCiAgICAgICB4MT0iNDQzNS40NDI0IgogICAgICAgeTE9IjI5NDkuMDQyIgogICAgICAgeDI9IjQ4MzQuMzkyMSIKICAgICAgIHkyPSIyOTQ5LjA0MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNDIiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNDQiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNDYiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNDgiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTAiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNTIiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTgiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjAiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNjIiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjQiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNjYiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjgiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNzAiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNzIiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNzQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNzYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxOCIKICAgICBpZD0ibmFtZWR2aWV3MzA4MSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45NjUzODc0IgogICAgIGlua3NjYXBlOmN4PSI3MjQuNTI3MjIiCiAgICAgaW5rc2NhcGU6Y3k9IjMzMy4xMTQ1MSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzAzNSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEzMDM3Ij4KQ3JlYXRlZCBieSBwb3RyYWNlIDEuMTEsIHdyaXR0ZW4gYnkgUGV0ZXIgU2VsaW5nZXIgMjAwMS0yMDEzCjxyZGY6UkRGPgogIDxjYzpXb3JrCiAgICAgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZQogICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICA8L2NjOldvcms+CjwvcmRmOlJERj4KPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMSwwLDAsLTAuMSwtNCw1NTcpIgogICAgIGlkPSJnMzAzOSIKICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO3N0cm9rZTpub25lIj4KICAgIDxwYXRoCiAgICAgICBkPSJtIDQwLDQ3MDAgMCwtODcwIDg3MCwwIDg3MCwwIC0yLDg2OCAtMyw4NjcgLTg2NywzIC04NjgsMiAwLC04NzAgeiIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTMwLDQ3MDAgMCwtODcwIDg3MCwwIDg3MCwwIDAsODcwIDAsODcwIC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNDMiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDM4MjcsNTU2MyBjIC00LC0zIC03LC0zOTUgLTcsLTg3MCBsIDAsLTg2MyA4NzAsMCA4NzAsMCAwLDg3MCAwLDg3MCAtODYzLDAgYyAtNDc1LDAgLTg2NywtMyAtODcwLC03IHoiCiAgICAgICBpZD0icGF0aDMwNDUiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDQwLDI4MDAgMCwtODcwIDg2OCwyIDg2NywzIDMsODY4IDIsODY3IC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNDciCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE5MzAsMjgwMCAwLC04NzAgODcwLDAgODcwLDAgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAwLC04NzAgeiBtIDEwMzUsNjMwIGMgODAsLTMxIDE1NCwtMTAyIDE5MSwtMTgzIDI1LC01NCAyOCwtNzQgMjksLTE1NyAwLC0xOTAgLTc0LC0zMTggLTM0NCwtNTkyIGwgLTE3NCwtMTc4IDI3NiwwIDI3NywwIDAsLTgwIDAsLTgwIC00MDcsMiAtNDA4LDMgLTMsNTYgLTMsNTUgMTgxLDE3NCBjIDM1NSwzMzkgNDUyLDQ5MyA0MjMsNjY3IC0xOSwxMDYgLTcxLDE2MiAtMTcyLDE4NCAtOTIsMjAgLTIwMiwtNiAtMjkzLC02OSBsIC00NiwtMzEgLTI2LDU4IGMgLTE0LDMyIC0yNiw2MiAtMjYsNjYgMCwyMiAxNDcsOTkgMjI4LDEyMCA4MiwyMSAyMjEsMTQgMjk3LC0xNSB6IgogICAgICAgaWQ9InBhdGgzMDQ5IgogICAgICAgc3R5bGU9ImZpbGw6IzEyNzNiODtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzODIyLDI4MDMgMywtODY4IDg2OCwtMyA4NjcsLTIgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAyLC04NjcgeiBtIDExNzgsMjQyIDAsLTM5NSA5MCwwIDkwLDAgMCwtNzAgMCwtNzAgLTkwLDAgLTkwLDAgMCwtMTcwIDAsLTE3MCAtODUsMCAtODUsMCAwLDE3MCAwLDE3MCAtMjkwLDAgLTI5MCwwIDAsNjMgMCw2NCAyODEsNDAxIDI4MSw0MDIgOTQsMCA5NCwwIDAsLTM5NSB6IgogICAgICAgaWQ9InBhdGgzMDUxIgogICAgICAgc3R5bGU9ImZpbGw6IzEyNzNiODtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybyIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA0NzkwLDMxNzMgYyAtMjQsLTQzIC0xMTEsLTE3MiAtMTk1LC0yODggLTgzLC0xMTUgLTE1NSwtMjE2IC0xNTksLTIyMiAtNiwtMTAgMzUsLTEzIDE5MywtMTMgbCAxOTksMCA0LDI5OCBjIDIsMTYzIDMsMjk4IDIsMzAwIC0xLDIgLTIxLC0zMiAtNDQsLTc1IHoiCiAgICAgICBpZD0icGF0aDMwNTMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0MSk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTg1MTYsMTc0MyBjIC0zLC04MzUgLTksLTE1NTMgLTEyLC0xNTk1IGwgLTYsLTc4IDE3MCwwIDE3MCwwIDcsODggYyAzLDQ4IDksMTI3IDEzLDE3NiBsIDcsODkgNDAsLTU5IGMgNTMsLTc3IDE2MCwtMTgxIDIyOSwtMjIzIDEyOCwtNzcgMjQ4LC0xMTEgNDIxLC0xMTggMjEwLC05IDM4NywzOCA1NTIsMTQ3IDI3NiwxODEgNDM4LDQ4MiA0NzQsODc5IDM5LDQzMyAtMTA1LDgzOSAtMzc1LDEwNTYgLTE1NSwxMjUgLTMzMCwxODUgLTU0MSwxODUgLTE5OSwwIC0zNTcsLTQwIC00OTMsLTEyNiAtNzEsLTQ1IC0xODMsLTE1MyAtMjI1LC0yMTkgbCAtMzIsLTUwIC0zLDY4MyAtMiw2ODIgLTE5NCwwIC0xOTQsMCAtNiwtMTUxNyB6IG0gMTE1NSwyMjMgYyAxNDksLTMyIDMwNSwtMTQ4IDM4OCwtMjg5IDc5LC0xMzUgMTIxLC0zMTMgMTIxLC01MTIgMCwtMTk2IC0zNSwtMzU2IC0xMDgsLTUwMCAtNDMsLTg0IC0xNzEsLTIxNyAtMjQ5LC0yNTggLTc3LC00MSAtMTkyLC02NyAtMjk0LC02NyAtMTE2LDAgLTE3NywxMyAtMjc4LDYyIC0xNDYsNjkgLTI1OCwyMDMgLTMxNywzNzggLTE3LDQ5IC0xOSw4OCAtMTksMzYwIDAsMzA1IDAsMzA1IDI3LDM4NSAzNywxMDkgOTEsMTk2IDE2OSwyNzUgNzQsNzQgMTkwLDE0MSAyODYsMTY0IDc2LDE5IDE5MSwxOSAyNzQsMiB6IgogICAgICAgaWQ9InBhdGgzMDU1IgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE3NCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTQ2MTAsMzEzOSBjIC01MTgsLTY1IC05NDQsLTM1NyAtMTE2NCwtNzk3IC0xNDEsLTI4MCAtMjAxLC02MzYgLTE2NiwtOTgzIDcyLC03MTEgNDgwLC0xMTc3IDExNDcsLTEzMTAgMjExLC00MiA1NTcsLTM2IDgxMywxMiAxMTksMjMgMzIwLDg2IDMyNiwxMDMgNiwxNyAtNzIsMzExIC04MiwzMDkgLTUsLTEgLTQ5LC0xNiAtOTcsLTMzIC0xNDcsLTUyIC0yNjIsLTcxIC00NzAsLTc3IC0yMTAsLTYgLTMyMCw0IC00NTcsNDQgLTQzNywxMjYgLTcwNSw0NzIgLTc2MSw5NzkgLTE1LDE0MCAtNSwzODggMjAsNTE0IDYwLDI5OSAxOTgsNTM2IDQwMyw2OTAgMjIzLDE2OSA0NzIsMjM4IDgwOCwyMjcgMTg0LC02IDMwNywtMjggNDQyLC03OCA0NiwtMTYgODksLTMxIDk2LC0zMiA5LC0xIDMwLDQ5IDYyLDE1MyAyNyw4NSA0OCwxNTUgNDcsMTU2IC01Miw0MCAtMjc2LDEwMSAtNDU3LDEyMyAtOTcsMTMgLTQxNCwxMiAtNTEwLDAgeiIKICAgICAgIGlkPSJwYXRoMzA1NyIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNzApIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDczNzAsMjg1NSAwLC0xOTUgMjEwLDAgMjEwLDAgMCwxOTUgMCwxOTUgLTIxMCwwIC0yMTAsMCAwLC0xOTUgeiIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNjYpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDIzODg2LDMwMjQgYyAtOTksLTE4IC0yNjQsLTczIC0zNDgsLTExNSAtNzEsLTM1IC0yMTgsLTEzMCAtMjM3LC0xNTMgLTEwLC0xMiAwLC00MCA1MCwtMTUwIDM0LC03NSA2MywtMTM2IDY1LC0xMzYgMSwwIDM2LDI0IDc3LDUzIDE2NiwxMTkgMzI0LDE3NiA1MTMsMTg0IDMwOCwxNCA1MDMsLTEwOCA1ODAsLTM2MiAxNCwtNDYgMTksLTkzIDE5LC0yMDAgLTEsLTE3MSAtMTksLTI0NyAtMTAwLC00MTAgLTEzMCwtMjYxIC0zODAsLTU0MyAtMTA0NCwtMTE4MCBsIC0yNTAsLTI0MCAtMSwtMTIyIDAsLTEyMyA5MzUsMCA5MzUsMCAwLDE2NSAwLDE2NSAtNjU3LDAgLTY1NywwIDEwOSwxMDEgYyA2MSw1NiAyMTgsMjEwIDM1MCwzNDMgMzQyLDM0NSA1MTgsNTYzIDYzNCw3ODYgMTc5LDM0NSAxOTgsNjc4IDU3LDk2NSAtODEsMTYzIC0xODgsMjcwIC0zNTEsMzUxIC0xNDEsNzAgLTIxOSw4NiAtNDI1LDkwIC0xMjUsMiAtMTk4LC0xIC0yNTQsLTEyIHoiCiAgICAgICBpZD0icGF0aDMwNjEiCiAgICAgICBzdHlsZT0iZmlsbDojMTI3M2I4O2ZpbGwtb3BhY2l0eToxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE2MikiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjY2ODEsMjk3NyBjIC02LC04IC0yOTksLTQyNSAtNjUxLC05MjggbCAtNjQwLC05MTQgMCwtMTMyIDAsLTEzMyA2ODAsMCA2ODAsMCAwLC00MDAgMCwtNDAwIDE4NSwwIDE4NSwwIDAsNDAwIDAsNDAwIDIwNSwwIDIwNSwwIDAsMTU1IDAsMTU1IC0yMDUsMCAtMjA1LDAgMCw5MDUgMCw5MDUgLTIxNCwwIGMgLTE2NiwwIC0yMTYsLTMgLTIyNSwtMTMgeiBtIDcxLC0xMDg0IC0zLC03MTMgLTQ4MCwwIGMgLTM4MiwwIC00NzksMyAtNDczLDEzIDUsNiAxNjYsMjMwIDM1OCw0OTcgMzQ3LDQ4MSAzOTksNTYwIDUzMCw3OTggMzgsNjggNjksMTIyIDcwLDEyMCAwLC0yIDAsLTMyNCAtMiwtNzE1IHoiCiAgICAgICBpZD0icGF0aDMwNjMiCiAgICAgICBzdHlsZT0iZmlsbDojMTI3M2I4O2ZpbGwtb3BhY2l0eToxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE1OCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTE5MjcsMjI4OCBjIC0xMDgsLTEwIC0yNDgsLTU1IC0zNDEsLTExMCAtODIsLTQ4IC0yMDMsLTE2MCAtMjQ3LC0yMjkgLTE3LC0yNyAtMzQsLTQ3IC0zOCwtNDQgLTMsNCAtMTAsODIgLTE2LDE3MyBsIC0xMCwxNjcgLTE3OSwzIC0xNzgsMiA2LC00NyBjIDQsLTI3IDksLTUxNyAxMiwtMTA5MCBsIDYsLTEwNDMgMTk5LDAgMTk4LDAgMyw3MjcgMyw3MjggMzEsNzIgYyAxMTMsMjYwIDM0MSwzOTggNTk4LDM2MiAxNjQsLTIyIDI3NiwtMTAzIDM0NiwtMjUxIDczLC0xNTQgNzIsLTE0OCA3NywtOTM1IGwgNSwtNzAzIDE5NCwwIDE5NCwwIDAsNzIzIGMgMCw3OTYgLTIsODI0IC02Miw5OTcgLTEyMSwzNDcgLTQyMCw1MzMgLTgwMSw0OTggeiIKICAgICAgIGlkPSJwYXRoMzA2NSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNTQpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDczOTAsMTE4MCAwLC0xMTEwIDE5MCwwIDE5MCwwIDAsMTExMCAwLDExMTAgLTE5MCwwIC0xOTAsMCAwLC0xMTEwIHoiCiAgICAgICBpZD0icGF0aDMwNjciCiAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzMTUwKSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA5MTk5LDIyODAgYyAtMjIwLC0zNyAtNDE4LC0xMzggLTU3MCwtMjg5IC0xNTAsLTE1MSAtMjQyLC0zMjkgLTI5NSwtNTcxIC0yNiwtMTE5IC0yNywtNDI5IC0xLC01NDcgNTIsLTI0NCAxNDksLTQyNiAzMDUsLTU3NSAxODcsLTE3OCAzOTYsLTI2NCA2NjgsLTI3NSA1MDAsLTIxIDkxMiwyNTEgMTA2NSw3MDQgNTQsMTYxIDY0LDIzMCA2Myw0NDggMCwxNjcgLTMsMjE1IC0yMSwyOTEgLTEwMyw0NDEgLTM5MCw3MzAgLTgwMyw4MDggLTg3LDE3IC0zMjYsMjAgLTQxMSw2IHogbSAzMzQsLTMwNSBjIDI1NSwtNjYgNDM4LC0zMDggNDg3LC02NDQgMTcsLTExNiA4LC0zNDMgLTE4LC00NDIgLTY0LC0yNDMgLTE5NywtNDIzIC0zNzQsLTUwOCAtMTA1LC01MCAtMTg0LC02NiAtMjk2LC01OCAtMjIxLDE1IC0zOTMsMTM2IC01MDgsMzU5IC02NiwxMjkgLTk1LDI1MCAtMTAxLDQyNSAtMTEsMzA4IDY3LDU0NSAyMzYsNzE0IDgxLDgxIDE1OCwxMjYgMjYxLDE1MyA3MywxOSAyNDEsMjAgMzEzLDEgeiIKICAgICAgIGlkPSJwYXRoMzA2OSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNDYpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDIxNzUwLDIyNzUgYyAtMzUyLC03MCAtNjExLC0zMDUgLTczOSwtNjY4IC01OCwtMTY1IC03NSwtMjcxIC03NSwtNDc3IC0xLC0yMDQgMTAsLTI3OSA2NiwtNDQ3IDExOSwtMzYwIDQyMCwtNTk4IDgyNiwtNjUzIDEyNywtMTggMzkyLC04IDU0MiwyMCAxMjIsMjIgMzYwLDk2IDM2MCwxMTEgMCwxOCAtNjMsMjY0IC02OSwyNzEgLTMsNCAtNTEsLTggLTEwNiwtMjcgLTE1NCwtNTEgLTI3MiwtNjggLTQ3NSwtNjggLTIwMywwIC0yNzgsMTUgLTQwOSw4MyAtMjE0LDExMSAtMzI4LDMwMiAtMzU2LDU5OCBsIC03LDcyIDc2NSwwIGMgNjg4LDAgNzY1LDIgNzcxLDE2IDEyLDMyIDYsMzAzIC05LDM5MCAtNDMsMjQ0IC0xMzQsNDMzIC0yNzcsNTcwIC0xMTUsMTEyIC0yMzUsMTc0IC00MDAsMjA4IC05NCwxOSAtMzE0LDIwIC00MDgsMSB6IG0gMzUzLC0yOTUgYyAyMDcsLTY0IDMzOCwtMjU3IDM2MywtNTM1IGwgNywtNzUgLTU3NywwIC01NzYsMCAwLDIzIGMgMCw1MiA0MiwxODcgODYsMjc1IDgyLDE2OCAyMjcsMjkyIDM3NCwzMjEgMzAsNiA2NCwxMyA3NSwxNSA0MSwxMCAxODUsLTUgMjQ4LC0yNCB6IgogICAgICAgaWQ9InBhdGgzMDcxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE0MikiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNDAsOTEwIDAsLTg3MCA4NjgsMiA4NjcsMyAzLDg2OCAyLDg2NyAtODcwLDAgLTg3MCwwIDAsLTg3MCB6IgogICAgICAgaWQ9InBhdGgzMDc1IgogICAgICAgc3R5bGU9ImZpbGw6I2MwMWQyZTtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTMwLDkxMCAwLC04NzAgODcwLDAgODcwLDAgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAwLC04NzAgeiIKICAgICAgIGlkPSJwYXRoMzA3NyIKICAgICAgIHN0eWxlPSJmaWxsOiNjMDFkMmU7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzgyMCw5MTAgMCwtODcwIDg3MCwwIDg3MCwwIDAsODcwIDAsODcwIC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNzkiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICA8L2c+Cjwvc3ZnPgo=';
	header('Content-Type: image/svg+xml');
    header('Cache-Control: public');
    echo base64_decode($img_encoded);
}
doc/alt-php73-ioncube-loader/USER-GUIDE.pdf000064400000115700151732707730014042 0ustar00%PDF-1.4
1 0 obj
<<
/Title (��Markdown To PDF)
/Creator (��wkhtmltopdf 0.12.4)
/Producer (��Qt 4.8.7)
/CreationDate (D:20260312135604Z)
>>
endobj
3 0 obj
<<
/Type /ExtGState
/SA true
/SM 0.02
/ca 1.0
/CA 1.0
/AIS false
/SMask /None>>
endobj
4 0 obj
[/Pattern /DeviceRGB]
endobj
8 0 obj
[0 /XYZ 33  
813.500000  0]
endobj
9 0 obj
[0 /XYZ 33  
749.750000  0]
endobj
10 0 obj
[0 /XYZ 33  
700.250000  0]
endobj
11 0 obj
[0 /XYZ 33  
98.7500000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
65  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  34.2500000  144.750000  43.2500000 ]
/Border [0 0 0]
/A <<
/Type /Action
/S /URI
/URI (https://ioncube24.com)
>>
>>
endobj
5 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 15 0 R
/Resources 17 0 R
/Annots 18 0 R
/MediaBox [0 0 595 842]
>>
endobj
17 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
18 0 obj
[ 14 0 R ]
endobj
15 0 obj
<<
/Length 16 0 R
/Filter /FlateDecode
>>
stream
x��][�#9�~����Γ�+�p��j`��*؇e�����k��퟿y�|��O��(�i[=��e)��P�����_?})������ߋ���Ӯ*������?��m��	������{�}�q���������_�����_>=�g��
^�G���?�������3̔��L5���🬒��5�m�{5�g����_�o�<��V���e��f���eY3����m�s%�պ�.L����'����6�W���ߛ.�8&���<��Z��g�����Ȓi�������z��r3����>}��}Ѝd(>���_��sK���.>���ow�C�;]˸�ŋk�]Se�m+l�Z�o���ȾŖ����}���E�S�vo-�o���v�bݬ��sj?Z�O~�G�2�i?��<���k�K�?�Y��3ny�-�S
U�S���ʯSz�7��vT0�>�t�0�`�=�r�Mq��/ߊ������?�����?���C���ܒ�B�7O�<��y^~޽~>T�'��y�6��T�@u��Y�5tD?��to�������zL'��SvJu�YB���z��n��Ҏם)��'TWh����T����C�b�_��S���S4@���eYɱ��+�d���}s�4�t�^L�G�GM�I�G����}_C��� ��h��s �q'��TR�
�@�>�㡤��'�K�x���N`7b��Ӎ@�����sU�Y��~��K���-��7������S�>R	v���Q�>
�Ƹ�M�ۘnx�X;4S`n��GëM�f�P$�a�DЍ-�J��8I���-՘ָO`��MAI��`�Q0�8�-
V�ur� ��(2$����qMo-��tފ��E|�_s�^�{xO�C�>�|¹����(a���=
�}\��d(5H��hY�&ӷ$oE��5�k�ᝅuM�Ys��g��5��qw�Ej���?����(`1��@�8�A=a޶�;�b����p�i��}�u�g�����h�Ӗbt����'J��?g��r�g��M+�&�8�>���0�)����q�`���`>ஏ;����_���9�q����DJ�	y'\�NX���O�EeT��թ'�q}�[���=�'���$�h]��O�8O�X�ت��9��(g����h��v5~�{)��'�܋}?��kz�U7�
GFQV�؞[�W,��5H�)b�v���j�`#±i@�v@:��`	��vr�$>�ϡ���ao��#��CY�9vLu}�3^�B6VWr��5��Wl�j3��ng€p��	kG(}�ђ�U��Qbl�Wiy��%S��w[�fY�>?�Rق��`5k���Z�S��Ye���6�^MN[l��E�
[l���&��#ly"��0k<��M)����W�?�V���M���C%	.���NU�>MF.C>5���cg��P���b�V%|!���Ң���N"H���������z3q�D���0q��1��&rQ�'n�]�y�gMph5ox�l�T�9�9ZTjd��e�-y*WW��􂐘 :!Ђ֏���$�l4�Q�E��-��m%J,HfK���)�
�O�(3��B�O\��6��hzႪ��P���f�n��*�m�7�e���C�uTUH�R"�����T+KU���v�}I4�0L@`q�j,#I���{VK�L��s�-@H2lW�O<��rb�#A�
3���2}������V���T�"M�ᱤ�^Lk,�(�$�Ǟ�$)�������.�}5���x� 5P��Zڈ��׏��r�]\�>�%�W�H������-U�Q\�X�<�-F���˺��	�q�!��!)���s�(G�#H�w��i�w:��g�4�$ ��eڣ����íir]���P�`b��.
m医(fA���サ�f�3$��m6���i"�04��b���t��K:��]��%�(8�pUQ��k��[>�T�}}ond�C�S���R$vT@��dK���J\��W����XQL�[��%ZfqA�,�ˬ_fy�2�
'�WS�����5v�E=?�@���֭����ˇv��K=5g��D�����d�,����3�J��Yu��r4�e�9�"�^L���(Yv��θuJ�l��8�	N�p/�)��de�e����n��p��͜w�䋫;S�����vFrJ��ձ���!�t��y	5�����N؎�.�2�l���4].M��M���>�.�R���G��J�6a
)D�[����T�.�v�d�kk�u_wB��VRT�M��N�����sY��~,���3��͠�qc�c���Ztr��+Ց�/���7N:j�K��I��̍�۱�D�"R����S��hB��+V�H�!�?�����f@z�`x��הAPx��ڵ$rRɂ�[s�ے�&��﷥�h�w%�Á>(gY�e�
���{m��9���s6O-:;�#���]:�n�����c�n��ch󴿛A'��Z�橕�8py��88�.j(%��v����*�¶%���P�K\��~�,���)Am�%�1�-�
).�����-?C�}3�C_H�̣�x�t����5>��"g��X*��p�(����7��3�c��[s������b�Itcu���j�tT]|d�10��͠�qc-l:��)	�[�.dr�9r�<�E���ZA��F)m�#�(�K�FLt,gt���7�ݾ�M}(83VK��8�Ea�N�0���΍����J���^��w�g�#Qt=~l�A7K�,e�)e��tc���3��Lk����]:�n�΂ҕ���t���},��w3�d�X[P
H�d���騗�m9p�v.�ʶUEK��3�L"5�E{��E�H-r�V�}'��2��1��*>W�'�|�g�y'�ê8F�v�Z�Ej�z1�.�D7Vo�������n,5��~7�Nƍ��Ѣs��[�f���͘��L\�r�%D�O��?Qi�^�J�9J-�!���0mՅ�_��X_m�#]���1��6P��ʫp}�	%�3��A��<1n�}�;P�p6^�3n��2�b��QZ�J_��]]afnD��̋c��RSK�C��ZAa�Kj�xI-�V�>�.q���
#��P����$(3�wd���G��=D۸᭭��*����R�kD8�W��/Y����ӥJ��܎|�;U����|Ԗh�2�y;[�h`�[(��www�I�d��#WI�'B��-���Q���W��)w�P�����1x��؉Tm���Ι:g���s\{y�`��9}��8^�@e)O��x���cӽwة����}0�iF��)q|w��ꞣ&΃������#���q���Z�V*!Q�}BX���]��Lu�Wa��B{G�Gҕ�YNS��\�N �^<z@�����ĸRt��ep�bA�W���t�9���r>�}�J��Í��2�cd87�C��PBh�S��g�g�+��J�s�:U�!
�JUF**�L�.37@h����0�Ԥ2_�v�B�suAծ�#^38�q�3V^�������ԡ�%J��:�FZ]<o\DN'��wI�	�'ЇB�c���=˗a|�1PɰY"�œ��N��I%��.�"����
��k����[�dP��(�)�Y^����3�r"��t� ��Ԧ�p4�&p�}e�3_���3?ײz*q*p�Xy�L�@Z&i.���ϲ�0K�#}8\�W!לּ��pgq3�q��A2���HGo�Zo�gh�l�	{�ujp`��&k�+����Y�@焿?N�3���0�0�/��|���_�1�T��F��cKѓ��>.m��I�j�;�D9�A�>xn=;1YN|*O�e�t5̛�b	c�T3^��)��=h3�V?ҍ?�wt4�o�s[`��i0i�P�
��u�9�}�s�l�6�m
ӚBQ�@��<7��#�p��/ߊ������?�����?���C���3�t��,A��$K����ϧ�$��.k�����8&���{��~
f�p��ؕ($�D7<|fM9�\�A	�DRr���+���h���8��;��+��-nxR����5X�P�u��Ȫ��Q�P����M�
²�pT�RH	eoStp*9���6�aS�
�E�Q�ܼ��{q�AT�\@Hɟ��JR�6%yv�RD�o���P�8's�ðZ^�����t��I���I�JI���ʍ��puu��u��}yo�6�
G�.D�=x7�7��,&E)��"�7ũJ`L�|��e����!Q�~ ���e�z�H�7��J�Q(�����0�)P�"6	�Y��s���
$�a��o�4��Uq�rN���Q���g�U�K�lk�(,)���2�S��1m{��n��!_N�\"�	�R�,�_�^�_�^�z�2��V�����2��w1�$�����k�g.so~��j>��w��A'��Z�2�����]8�!��b�aO�#�fyS7R���6����ގ�%�`ӾY
E�o�ڂW�j.��l����#��M���մ���`��E��~��5���^'�8�o1�~Ə�0Rk��K�d���Z|ᓡZ�j�]���Pm�2C�y�&��j
���jB�Ъ�A��E��~<�D5�D�ƫ�P����3~�š��2T�P-�0�P-C�ն��)��[JY���<PR�J��J�������E��~<���J�Ȕ����?��@I��7(e�_�&J�ߡ���-A�,��P�Y����
�\�:�N8�� ˃Mȃ@��	%�9�q�������>�/�*��+Y\�uM��`l§��"��Q�nW���U`͜���޴�v�*h[Ġ���s�+�\֝�X9v�-f���w��ͮ��C��*Ȯ�lܚ<���NE3&gT4c�S���PEw-b�O��*��oFE7����HEw-f���Vь����'��m��-��F�z,�av'�މ[&��=��1��7�.3D��B0���\e偫ds�U�hJ>�m���x�
;\E�j?G��m1�~Ə�8p�2׼�N�Y�	��0�`�M��2J�nG*�`��|�ϻ��6(i;��@����4�a?я瀒Vs@I;��Vc�Զ�A?��[(����Cެ�BB��"�L���K=q��G��{s0rQo�J�O7
OSI���z���e��47�����?�s�|��ל����3���^č�fvq�mK��o��ŷL	���ʷL�]3��s��f�i0����8�1�c�	�53��o���q�AMG�~}&�����r�F�Q���4:e֘�9nW��`���Yc��`b3�ծJ;��>07��1��Yc�G�o�}�ԁ���dC�����␸��ɷL���^�p1��+�U�O�}�.��M�@��)������
K��9c�u��/ߊ������?�����?���C����LK:T��\VsY�e5��\Vs�Ws�??;gΊ#��`����;ʉ���w�če-����;�ˎ��t0�"3-�Ѵk��M�h�����NQ����TSW���3���G��s���ͽ�p}���h;u��V�A�S��X/�'xf�%�xM�<9ZO��a֐�|mpp��ܬ�G4k����4��w	��<�����r|`4��bϐ0�_���D_�8��'�	�N
9���^�bUVYad��FV��0�F�)S�/d��C�ϝ�]���Ὁ��c
�Vp=҉���eìFKS�滬���J+q��ptvy��O0E�{h��Q>Xh|�8t�-0���U�3�&���s���D|��>��`�w\	���a����dgD���F�ۖ�)�t)��)��-xM)aLqË(e�"�&
������ �T���5R��n�"�P[J���X"��Ywf,J�Ϻb:P�"��r��+�2�.� ��e�QD
x4`2���8�)V
�j{�U��@�=��$�5.U�q���Bi�W|SK� ��c�q��DUJ
endstream
endobj
16 0 obj
6245
endobj
20 0 obj
[1 /XYZ 33  
719  0]
endobj
21 0 obj
[1 /XYZ 33  
631.250000  0]
endobj
22 0 obj
[1 /XYZ 33  
117.500000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  654.500000  175.500000  663.500000 ]
/Border [0 0 0]
/A <<
/Type /Action
/S /URI
/URI (https://ioncube24.com)
>>
>>
endobj
19 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 24 0 R
/Resources 26 0 R
/Annots 27 0 R
/MediaBox [0 0 595 842]
>>
endobj
26 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
27 0 obj
[ 23 0 R ]
endobj
24 0 obj
<<
/Length 25 0 R
/Filter /FlateDecode
>>
stream
x��]�n�H}�W�y���n^��a v������>�d�$Hf2��%��,�:-�X�,�@,�M���.�.}�������\ݽ��<��w�������z����s����/���ŻŻ������|���Z��X��ݿ�O�Kl���ߓ����kx���/�Ҕ���&�����I�bYT������?�m��O��z�ҧ���:�K��W[����5�ee�"+��7�m�U����+�?u^|�}b�������?>.>՝?u�u��2�|���F�t�V>u�}n�eU��v�]7o�k��n��M��յ۝��!O�}:M1�q���z[$�&���^��=4�~e��?��\�l��$�/�76�lݒ櫖z�i}&�S�Zl���ꡧgz&-C��V
[-w��lY���>�:<��|��SKZJ�w�f��"��ϬG�Ny�Ԙ����o�V���^��vu��g�~"�F�)��p�����
��܆Q�%8�mv=�j�������04�G�W�9���u�B��]��?�Lv@�XˇuY��\��u�S��o3o�n�ÿ�r�j�����g(N��\��ٹ�zm�nj��m|�1G������1�nX��O�I��B���0�S���YQ�B"+�pXf��m6�q�G�#)iԙ�C��ހ�@���>`��[d�'s ��G�%���~L��R��D5,�oFx>/��E�ID/�RS^Qb�q?�G��XN�G�I�bK=�ř0��>��0G"d�)Dy�D�@I��8t�m��U�|��	������F.
���ᧄ�#+�#�زX�a�*���)l�2z)C!����#�ͬ����*�Z�*�e��?�0tm�����bP�O0�=]x�y'kU
n��tdG�"0}�t黑~�ڊ�5��TDit}º�i�m�>�pn���1jy��cct	F&�à�����m��w�њ�]όM�f:���Kb��Lav���Eq1�����ՁcsmKZ���y;�-Il���J�d���#����	�ȜҊ2�>���X��� ��`�
����A��=w�,`���LM���0��!��Uj�'Co��_)˟���c�%*��v�|�_�Jdi���"��0#��Pbp?�;?��$|��P���+�O|�	�:~d1�}��ۘh*f��؄WT4�G�I�`��kZ�O��@s^ZeQڠ��-sfּ��!Y����2��68���#�55�K�`v��blZI͗�x#3��Y��@�_ᣄ@+R[�#ɞƴ
�d�3G�l�;�3����6se}bL.��d�c�-�6&�gͽ0�9� �GE�:"��#����.Q���2)��c3(�y��Dc��lf�|#-˕��=h3
��d�t����X���A`d�V����]iu�2�F�����B%d}�[x�SuHS�–Y#-��N=�#��0/>�������ݝ1f��윺e�n�τ���'��ۙ����y��>I-ӽ�y[��++LK�>����0�	��o�èw���_�����㏿>|~�����&��In���&ANͼ�S����vHO�N!˭�M�]��76Q�)pAi��#����}P�.��o*�L:�P����Y΄R�&�g#�l�S�<*G7�"�ƌ@4�P+U�1�".�	�A�#��^��b''�U��x%��7Q'��:�dD�t�/����v"�M��TdY��a�4y�S1�|�49#S�ʹ����j�T	������#)�gc�@ш�!�$��_LIR�����#5��s���-UͅXy����?��qZ�QZ7�u��/Bˋ�I�k�"n��Z�U��+5�b�j/�"�Q�t��fE�&)ݍ)i�X�慺N���B���Jb�r2�lsֱZb2s���N�"��Z�LX�V�2��3e�g�#1�$?LU��
��"�-R>Q4e���T�ה�O0�Kj��=�6F�](|A��y;%�F�*��{�4�.���WW*�A—$)%R�J�T#FI��c#�p�<#gTm
ď�g�u��Z����V�-�q��ͪ
e�i�r�,ӝ��H?�=�	���e@o7�2zg��=ڀ-�����@�/ڳl�t�c:oܸ7j�tQl�
s뭡�
3��た��'Z���?�:��Z9a������YUj�٧kOLgٿ��7��[/w��W�L��/���L5k�K���|\|
8�5C�O	�0J[M.�ed�����o�?�`�k�Ƕ)Yp�6�d��
?��CN�[b
rb
`?x>v��
�쎸������F?ȸ��	��\&~V������"L`ud���e<�x9�%P6��*�\i6��2'Z��<1;YO.�q����F��3H��¸ťm�D��	\O���>Ѻ�P�jA�n�u���~�8��3� Z�ZX��_
H����n���Ƕ͔�`�i�L>1e4��9aL����r��g��T�����X�q����fz��"��='���h��{؂G
m�8�Hf(pl����g�,d�€:�����`�k@@���u��~�6<���=%h;""3�Wz���~9���a�=�p*7�M	���@)�WeB���$�[̙��Pq��x��ƭ�Zͫq���R��
�����+�kAx�I����k!zC������_��X���
��0Q'��\T�C5�s�G=�V5�UuvpZ5�xN-8
��@�";��aƆ��k0ǚ��ר.1ִ��9!S�g��=
d��eX����S�93�sI`	Sk�("�j%�+�0D�аצ����!�9W�������(x�Ff���G��)�`� �����V��S��7f�Dt��	W�S�ƨG?CPJ;o;rZ+Κr`���,���R_�*v���t��y�����#�G0�-IR��|<����u��!���Qԕ�g����*+�4�70��8��|��'����j�s�:�2��9SP�Zb�8��Ei�k����1�)�m��e�G�S����h���uS�WEC6#���=���t�Q�d�5����Jx`8c��Rș�yb�L#+:I	^��#�ǿ+g�rm��8�!�߉V!�$���rԡ��l��	��Ռ�]����хS5�c�i�H�99f��k�aXsv�1[t9�1'_�X<6��SFp�H��I@!�L�T�
3��g��rRm�d���5"E���@�V�B��ذ�eS�����1�ǘ�g��O��L+8�#���*β�� �yµ��L`M��iT��S��2�'&)�I�Pn&eM4H�����;���	�'(��k&(R֥��*s=��U
J�S`�*�du�+�gd�h���΃���>w���ZWN0�/�f&
=P��$p��I8�Z�1A��൓.������P�K[k���䐉Hyٵ��Sި�ֵuyg�r�6�]��Ĕ��Z~"��]ˑ����������W�be����'�:����u�}n��Ղ��LwJdc1Ÿ�㄁�����r\V�����dwA�REsj�p�-��$���n��D��);�L**:���.�xa��Ϩ�pZ�S�	��rG��#��E�dLX#�e�a�.�¢�j.��T�g��.`x·�\�U�&e�=/MV��%H�sɸ���Q)���%B�E�Mޙ�JVێ�GC�z�{c������n5Q��}b���guq�iw�͈��64���3p�#mc$�����Q�D�CP�;��z����|��a4��D���M)�����1o��QV|0l��v�2��a�-^��8C�s% vM3��%#v�L���|,n�X	�̮V�P�-�]��!�`ʁ�:������00���p�p�s�Əo����x�Չ��0���ҵ*{��ZIRc3�aG�䌑�Z�;�nXfa���8��]�O@�)|aˬ���1܏��Ú뉝�zm�Z߆��k��e�w���+��";=������]��qK����#��C\��+��	E�#�3���
�e���G��	4�OӁ�	<����|��"���N��S��.� Y�K�W�}��\_'W������ǿ$�7��Mr����4Lr&ޙxG&���v���K��A�7=�x�ޟ��Y���w� ��G����+�a���؅I��g8���Ì
�{j�X̀l=��.i�F��7H�䈨
e�b���׺�V��*h�+d�L*Q�	�=��U�D�rh��������](���C���%���n�cH�@�=��6c�<�>ս�Ym��ʚߖ��������<si��s���}��5��'ݧ\x�k���S�Rv�+�����i ��V�]UaY�
b��e�e3���*��e�� 8��]ڎ��w�f{,�)��U\Mɭ6�]�sW��x�E�T(Æ(�H�"���ǰ���_�����-��.y��?�zB�
endstream
endobj
25 0 obj
4552
endobj
29 0 obj
[2 /XYZ 33  
74  0]
endobj
28 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 30 0 R
/Resources 32 0 R
/Annots 33 0 R
/MediaBox [0 0 595 842]
>>
endobj
32 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
33 0 obj
[ ]
endobj
30 0 obj
<<
/Length 31 0 R
/Filter /FlateDecode
>>
stream
x��]]�۶����u�8")�HN�6 �z1�"H�E4k��珒(�C��yEI6��1M�/���)���ˇ��g�����M��e����^����je�s����[�m�a��f���篛���6�7������_���}�軷?����nۡU�m�O�նjTS����?�����쫛G���\k����2�����5�il�z�{��ֵ6�n
�>�e�º�&o��4Z��r�u�+��3���������^]W�L�6�l�6z�U����Օ.�z�5��0�EV��Xw�t�pO�Tnj)+��CS�ߺ������ear��1�~���]���g�^ڏ��ߍ��Z쨟�e�HI?�%���>n^��2��ǟ�~;_��_6E�v��u��c����w���_7�֚´D��U�Rw-z�TuGv-F-�ی��>���R�]�]�j�h�t-�6?�G�E�Rn+���z��}��/���}����R9ȴ��-���V�{���a���=ﻖ���5qUL3\�"?uU��@�}\��Ō��~<U�=uUܫ��<�*m����x�_�6�o#]|�
��E��4՞�͛�{n�z�cwȡ��cp�j�pY䠬���>t-�6?�Dig����1��8b���Ʒ�V�E㎻}�i���Ϡ�e��Gל�Q����X?�P>\��9<���
�X8Z�Z�
�
�'�RC�yO�y[���7<7<���z�-pGq�R�f�JK��{�z<������U=��mO�N�����X
�wD0s�[�CR ̐|0L��.��T~���+��aN�h��ѣ��x>�9	W�oxn�L1��`Y�9�R괉�0p��3յ:�k�6�a�;��bV�k;\������n�:�`�ѻ}��9���?��S�3���[��si�nc�
�(A��A8�>��7��~������6�@@��e���y���Rg����.*6��S�w�8퀵���ċ�|���k��3t�
��g��C�&����Ѧ�~���BVJdp}��al��|���J�ܰ����a�k��U+�T���()C��0{M�8X0Θ@�����8�_Ӌv�����0�4����ِ�X4-��)d���t�5�D�ai��Q���!��z_���9–Z���-º|Q�;`�Zq�
Cp��h6�
q���
ƻC�ݔ$������#��Y��c��cj�CU�ߋ�� ݚ��`��A@7��L�DeNaH�[�:,C�;�X"b�p���B;E��@���qܝ�������Dz �т`�A�͞g�3b.jU���Z5'b.j�w1��8�k1�~�����Uu"��}ۏ������Ŏ��a��c.j������R�k$!o*eY�Q3*
���Y/@e��z�i�pUe����b�sƵF&�v˓AS�"��fud���-f����y2h�)2h�O���Ŏ��a��ɠ{�'i�B�+2xkڼ(�W��5)�t7�9M�Fe�֫4}�h�«
4
��w����~�Rjp������>|��i��MM�̠]I����J��� ˩�

�����H浀;	>F�a��d��J!Ϥ��c�HƳh�	U�������Y�ֳ~�`"mU)�;�}oc� �%Cb$ۡp(r,x��C�_2+e\�p
R�U��:�If��Z�R��@��&&5�,���t��Xg����&ߟ�$��9��8&{[����o�Y�i��k����X�4�WW�9��Z̨����Ě�<�%��^b]����x{���~[�A�8���"}`n�{�afx��NUb,!C"!PG3���al��3���j���1r�-��>GD�o1�~��#B�)?&B�~�|L��;�g��&'B�:���I�<���Ϳ�DPAIe>�2
��0�v2���OY�0>q'��u�&�O�sc�W����R1�Ҏ�5��M%H���,PT�U��QV+�/
p�ɃQ�$���X�Y��v�"�!by�QqM�n�,Ϸd_ڥ��*6�z�@z����rm��{��@x]��x�8���5I�p�)�>�8����!�8�yC�J��[R��ͩm������Iu�յp�\R�NcP��~{@�S��`0<扈 :J]B`�%�
֋��LҴ0�,8B�ǃ��p�H)d
�6��SoO�^B���59�������*h���zR�s
qCb
q�eL�w��B�o&�����pO'
a�o����s]ֵ�Q?ӏ�G��D!��[?�A!��Ŏ��a����t>dّ�.���*�%ǝ�ڃ%+���7�1d�,]�be1F�g#���{:Q����_�y�����L?�G�
������[쨟ƛ��
�P&Ç��Y�=%GW�6����A���m�*>�Qm29e��D%m�����F���C⳩�ىQ��	�o�uXO�o1�~��S�S�;Y�?���b��Q1�	��\ F1�&<�ɬtw�Mݝ}��%}>�b�=�����0��$@푣_t�(�;��E��{,#	G�LAFc(+�-DG1��v'V��	�}��(;x�(܇���7x4"�kg���L�{�c��J�D٘;,d���SM�'�l��+��8Z.aѽ��<S��RO-�M("�q��XI��hJ(��II�dc���9�b���0��~���������mc�l�vkI��z�O���z���N$��pd��hG�6�����jhSWY��^�z@w���*1��cT�=�23���I*%�V�Զx=Lj"�	+Zq�!Y�:�$kՉ�&&z�<<�Gq���4�B�W8Y�Ũ5(�
�5�
�d����J��0���LِzF��>���$�� �T�=LZ�n��S>˄�\Vټ��ԼE��5<��H�H��ϖI^B��Ո"��������k��U+���$'	�z��~$`8k&ٰ��'�>����'�S"��t��iw6N2�R�f�����ņV�Ո�d����w$�i��)�ͯ=��O!�
�(%�ɺ8z��,�O��1�&��o	� ��Σ%�c�[��ßs{�--�t�rSgjU�r���?�	��B���8����C�g��:3���V��0��+��<%)0�@�yI����z�R���9��Zv�vefw��x��G4��	8	HDEX�9�5S�I4)3eC-�"\������~���T�A��dv_
Y�%=3�[�����b��uُ�&Dq��:����j�OF���Й@�[Lx��oٲ[O�/Y�l��a?�	�)����R����4�V[Ӹ�F�Ւ!���؄Rh���}b�e`��5~P6��h�E{ޚ�o\���uZ�.��	*d=�h��aم)�){[��0>��{̟<c�2��l�܄Ben	9>�L���Nr	�v����#ju��50�_fOe��P�I��v�Ѓ(����7X6jS�(�R�Ϝ�~B)+ƣ�[E���ka-�)"i�=��W��#(isBX�r[NZ��kSp��)���=�5b�e��1�Ɯ)�(�k�4�D�wPr6��<CwD�G���d��&���v����_�l�Z�~��,6�� �G?R�\��)\x!J�����/I	A�LZ�:Ӷ^S�N��	��(
���@pU(�;x=8ȹ*=R���:�5��JI*��‡Xi?������R�fPH�OrOLv)��1�c��Q�o�
���'u �;T��X�Cf@����z��Ez&Մ�s$J�U9�Q��e_�\B��l�\�L9.�~Be���-��$����$�Z��<�!��U�uPg!�D
��FHe�DJ����sp=���y�#xsJ� �̨�e�ί���	K.9r?���C6%��
~��@��rx�5p�`����5�Կ�|��l:ZY{q�)�������q4�9�=l�3�\���%w�|�T-&3)�А� b9A8�4��~� �lXT�Vٸd£~���hf#��d��6�\ޤ��օ�W��U�+Z�1f�K)'��2�����f4Y�4*�/���f�Ft��:��b�s�����Z7��
U��؂3u0�Cp4u$��c8=F��� j�P��D3$S.̳b�E|�n���kDN����yjV�
�RS�*KK0$��
e�]��H9�G���I�ֻ�E�P��b�*C�~�qV��D@�Q�����l.�9�Z)���z�F^)va$�[�E��dN�W���e5��7��Ѝ�l��	&TUW�-�ϣ3����q�K�UV���5x��h��멱R�"?����I�.�f,��r��G���r�<N�h?�����s�#)�#U
�����q`��G��򳮏����8������N=x�c����_~�����ի������o�?�������������"�UHW᦮�{8 X�lAP�s����W8�_a]��^[�>�~�8QR��8N��g���p�5~����1>��C/����37�R蓺_]�˾o�1ȟ�����7d��
endstream
endobj
31 0 obj
4638
endobj
35 0 obj
[3 /XYZ 33  
714.500000  0]
endobj
36 0 obj
<<
/__WKANCHOR_2 8 0 R
/__WKANCHOR_4 9 0 R
/__WKANCHOR_6 10 0 R
/__WKANCHOR_a 11 0 R
/__WKANCHOR_8 12 0 R
/__WKANCHOR_c 13 0 R
/__WKANCHOR_e 20 0 R
/__WKANCHOR_g 21 0 R
/__WKANCHOR_i 22 0 R
/__WKANCHOR_k 29 0 R
/__WKANCHOR_m 35 0 R
>>
endobj
39 0 obj
<</Title (��PERFORMANCE OF ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_4
  /Count 0
  /Next 40 0 R
>>
endobj
40 0 obj
<</Title (��ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_6
  /Count 0
  /Next 41 0 R
  /Prev 39 0 R
>>
endobj
41 0 obj
<</Title (��LIMITATIONS OF LOADERS AND ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_8
  /Count 0
  /Next 42 0 R
  /Prev 40 0 R
>>
endobj
44 0 obj
<</Title (��\(Available for Linux 32 and 64 bit x86 servers using PHP 7\))
  /Parent 42 0 R
  /Dest /__WKANCHOR_c
  /Count 0
>>
endobj
42 0 obj
<</Title (��IONCUBE24 : real-time intrusion protection and PHP error reporting)
  /Parent 38 0 R
  /Dest /__WKANCHOR_a
  /Count 0
  /Next 43 0 R
  /Prev 41 0 R
  /First 44 0 R
  /Last 44 0 R
>>
endobj
45 0 obj
<</Title (��Global settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_g
  /Count 0
  /Next 46 0 R
>>
endobj
46 0 obj
<</Title (��Security related settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_i
  /Count 0
  /Next 47 0 R
  /Prev 45 0 R
>>
endobj
47 0 obj
<</Title (��PHP Error reporting settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_k
  /Count 0
  /Next 48 0 R
  /Prev 46 0 R
>>
endobj
48 0 obj
<</Title (��Deprecated settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_m
  /Count 0
  /Prev 47 0 R
>>
endobj
43 0 obj
<</Title (��php.ini settings)
  /Parent 38 0 R
  /Dest /__WKANCHOR_e
  /Count 0
  /Prev 42 0 R
  /First 45 0 R
  /Last 48 0 R
>>
endobj
38 0 obj
<</Title (��ionCube Loader 15.5 User Guide)
  /Parent 37 0 R
  /Dest /__WKANCHOR_2
  /Count 0
  /First 39 0 R
  /Last 43 0 R
>>
endobj
37 0 obj
<</Type /Outlines /First 38 0 R
/Last 38 0 R>>
endobj
49 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Outlines 37 0 R
/PageMode /UseOutlines
/Dests 36 0 R
>>
endobj
34 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 50 0 R
/Resources 52 0 R
/Annots 53 0 R
/MediaBox [0 0 595 842]
>>
endobj
52 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
53 0 obj
[ ]
endobj
50 0 obj
<<
/Length 51 0 R
/Filter /FlateDecode
>>
stream
x��\_o�6ק�s�($�I ;ɀ�@�=i��h�f�}�Q&e[��}��IT�N$���ǣN�}'��.N����]�NoY�J���;Y}�]��S������A<7�M���h{�����q�">����Z�~}�.�S�慯�U�l�VU��e����.k�������O��7�>�!K'�֤IE\:�OHYJ[������i��7��ekcý��I�Zu:�C'���pN
(>6��4�r�9�Nf��u-���"�p/���T��{q�wy.f�[V����E���K驑�%d:��2p�u �"��jXi���B�J��d��MZoC�7��^�q-�^�@��qj}�g�ΧR�>KH�f�<�
�c�i�{�p!��8m���3�US����I�:�g�ްī�9$�
��`�1�1O1��9�Y�:��L,!�7��&q��u�`[��G˶M-!
A�u��īYp
���$eǦ�(�J����}�]鄥�#��ok'mo��8�:���}�XÙ�ȅ��ӄ�Ӎ�It��U�4	jl�rspc�5̹��
g��C��.��W���kp<G���`���fU��4�6Z��%�0u�:c�9�r�U�ۜ�<�z'�18��(=�j-�N�'E\�<fG���31�z�t�I�s�2An�l#�o��#����K�5�b0֌x1�
�E�k1�H�Kdڂ~,���u�(�+ǻ��!])�:�69i�O��&!��;]*i�ZPo�i���*^�
��ʐLO�:�(�׼'�{_+���M�kxo9R��N;�����ٓl� �a�*�ը$Z=��(-d,g��'˯[��{,t8Mˡ#�'�b�}�%�$4H�(8䩎�ȗ�G7NX�9)za2�*F��Y�1l�D�k��� `Ѐ��Ʋ�5���8����0�)_խ�Wv��W.:�p]s�
�:�(�7w����~�4�g�?Bl��m�ۻ���^�.ܜ�l��ɸ
�^'�VQG�34���"6���1�ؘz�1�ؘ:�1�VU�ظy��~]U��ʡ;�1�S�d$U��ʼn
�b�9űT���5M��;º����A[�AR�m�δ��L��s�>�텪4���z�$�/��Ac6���R�8i�8��8�QJ�>�J��4�v�e�^�{4�4N?i3E\HX�3��ۻ{qv&N/�~������?�ٹ8?��iSu#�$_�E��o��}�yI��'�H�-]�}���z�^;cd�\�Q��#�can�@i��v̟�j.8���:x1?l�~��	,��'ͨ�f�~svqoc�U/�#����z��o���v=�I��,ģ�9ͻ�B|m����ͽՕ�AD��x&$,��p*�r¨J-�����@~j� �
y��2�k��7!W���m$�`ʀ`�!�4ƚ D3p�3U����6��q�a�� �C�G�Pn�=�����W�LU�`�9�"�̓���(���D0�2B7VY����:έ�C>J�Y
*�W�pl��*N�K�(�%�شŋ��8��akI8I����8u�D(#��#Suv��|ȱ�����c��x�a��0����a�c
椉G�r�D��7̹A�,_�-�k�<�t�}��9�Y1������n�f���nk)8X?٦�٤?m�Ӭ�~���8�d�j�g��L֕���׏f�����%d�8d��E��ˉaX�*��[�ň-8��`i��e`#�K9�Rɫ����d��m#���gǃ3SN,���c>�t�k�b?��,�sX��t�W�l�X����
�1շ���E;ߕ���]�>�����h�FB���Ѱ"� �Қ �0�x�Ĩ��P��f�6��G���Lo�nu�'3���r]����r��p�'�9Y��j�sy;�q�)y|:2�f�<���Y��7�����
endstream
endobj
51 0 obj
1948
endobj
54 0 obj
<< /Type /FontDescriptor
/FontName /QCCAAA+Roboto-Regular
/Flags 4 
/FontBBox [-736.816406 -270.996093 1148.43750 1056.15234 ]
/ItalicAngle 0 
/Ascent 927.734375 
/Descent -244.140625 
/CapHeight 927.734375 
/StemV 48.8281250 
/FontFile2 55 0 R
>>
endobj
55 0 obj
<<
/Length1 6976 
/Length 58 0 R
/Filter /FlateDecode
>>
stream
x�}X	\G����{�F�1�q�
�/�S��@D�f�A@��BEŸI�
�A�1�`Iܨ�[s=�x�&����}�3�k��UwUu�W_}翚!Ċl&!���x�ל|{Z��f�[�+��~���5��vb�����c�J�,l�����/��sx��?c��i����2	?�����BFa���i�_6�1Bh;�`:-Rp2��+d-�	��������$F��C/!1ɈH�Zy�p�}�}��8)�AjӰ�9y�<J&�R)T��ت�
*n�i.}�[�L�`���4ʉ�8�ߨ�$�|Z���MU�А�VҊ�oh��I�-MeL�� KxװE�j��s�{k=��v�2�T�+$���q�����Q�=ّ��Y�NNγܦ�Ũ$���hbG\���{[h0"r�����zO��q�L�˒�v^oj�;�P��ƶ������b!>��1>�j:7o

:�aw�jcp80l}*���^0�C~2θ�>�u�wPzk�mj������'��K9#��IA.F޷�Xm��wʞЃ�{�e��G����@���W��ut#J5RU#Uܑ�^k���G;v�M� <���ķ-͓.<�f��N_�Ⓣ�p�۪�Ƴ�o8�����磣��kn���Sl݆���udAA��YP
�b��S�/57-���+V/]1���k�i�)�ߝ���EI{(wg�٨@akd9*Q᭵W�+4(k5JB�w..�l��6��Q\ho8�8����0�xж��ZFL�7��}�I8��	]�n���u�����'3�2�R')Y��Qة�-2QʀI^�CiѨ�M�
�5���Lj~Ų洠��F񓢈(�b4Zw�8���C���E������i��]��ĵ���dԅ~�~��梲S)��C_�~��a�,��!w�#w.�m�U#S#�zdP�ՙ% C��TLTڹ0Kԩ��2�=7Ma]��ь,ز�S�~����~>�i��ق�����h�n�Y�N��zX���XJrB��xh�c�"f̈́䔧���lws��ͥ���U��?G�ck�,�X
S���T-�V
T���`�6\<W^a����ظ�#���/��k�� )m8��@n���d�X�����aC�7Z��Ym��qf����W�#�W&�0ջa���Yg�L�{A碥���t�#��؛8���
E�F�mQ�dU̧��jXC�j��X~9�~ozqVN�ee�6|�ں
6=6a![���ԭ���K�C��Ͽ�R�9�V�_�|��+���4\s��OPN�`�#L�z\C)���u������)>>�i��NN��s�88O�$�^܍�cC���r�(�(K�Q��tӖ����	�.]z�	 �����Z�e�W��a�Υ�a��N�SF15�2�V�d��ܣ�٩-�Ţ��0���GA�ۼ=6N3�'Δ�.X�����jiJL�9
���lmz���ȇg-�N3�9M�1��7f��$�U){#0`�tT��8Ϙ�7/�5q9���q����O̚��]���qL��9�㭣zo�J5U��)�d��P�T����"�и��W-M�}z���Vg@Q�%Ktb�9������x{��~	y�T�GH�ϻZa�$9�8@��Qrl���
����V�0xO��9���X�s��BІ��n#w���[�V����A����
i�֥`	���[f	�t^zx�u��wnښ�5�����^Z_i�c��#2:*�v����	�����pՆ��9dz�fm��ܚ�z3!�J\�Y�?���e3j�f�4�d�+���e��҄
H��˻*+ hL����*��hwwL3�@�����L�'�
�1��9GY�ܡ���d֭�S3���a'iY�P�
�600y�B'���y���NS�"'�ض�M��N��B��"Yl���X~����U���W���C�k2�&� Ό�I�GL���͙ǜ��q�	�a�a�O�¢�]օ�������b�͹��t_�E�g�8ȟ�́���}�Y�\\n@f�v�e{ԙ�O.�Wi��p��g������Uv���N��)�lڬ��ӊw' �)b�#�<�̴�{�c�%��$��I��O��ff��e��]4XwUU_-+,�M-?^a�;_Z�rDĶ����Eb�6��h��yu�z��Xf؃1�)y��:��}�ul*�>�fM����U�%�jT��G�׸����b,?�C<D}M��n�[/.��#k��9s����#����i��.������.У��i-�ю�g�E>%�(	
�B-[�>;Yx��S�,��寻ךm|%r�ň�Ч�-��!�C��8���ìAA%M�QF���@E�xO\O?�J�7�D'��E�4_����=�������C�1�2�c�d1�Q��s���l��o����]��<��s?�Ёi��3���0��>+��d�iX��&<�ۖ�73q[[-��Q�o!m�ų���.r^����p3p������6H�R�F�S��G��
_�2���<W�����x��9�$�ȍk�]]��-�%ج
�C-R�n���tn�ɍV�F��t��Px����6��,����`�2�p�FEϋ��˟���"j �4;�aql��	�2�(�(,z�q�ZS�X�}xX���j�i�`=J_����>���K�i���q3�)�-X��c����A��_Q����Z��(�CC������;�S�54�<df�|&3���lc�ڵ��h\<$�u��}��K��}�mijj�9wx�.h�-P��3�0��E}�8G�:\��o�8u���E�����z�f(��o:bzˌ�~G)/�a���R�Sqܻ��Ƌt�1��o��<�*��M1�q���fRr2{�����y~�P'.z�ϴx6�'���,Z�$!)ͧ 9��2JJ삃���^M�������XBN�'t|+�o�b�A�0���4�p���cR�A<V�:�`-jx�Cd�8D:�Yp�9�InK��n�([��B|����1q�T�ZO���[m5�A!V�>��$"�6gg�����/c�ڨ�oX�?O���Wp2'���H�\5�?/g��1�QWwQXNd��K��KY�+���xl�ӗ�#=�ߕJ���>x��8�`����׃1���0�)��:q�'�%�Z:h�e��Ɩ�
�
��VVnqmMN���	e���w��/��������J��o�S��z �QtE�z�8iԶ��muf|'�N{����\_�9��La��4M]e��/
����率��rܝ��>�sǒ����޽���c����9v��CC�m��Gb'�08�!䋝�h6}g���\��Jf���}�@��?�_�?�������_�Zގ�:�9�H�P�����[j4�Ò/�$��c�y�X'#�)�F�kjb3ٹ��DO�YF���O���Q^��������Ȉ�u��Fؼ�w����T.Z�i�7m鍈ظ����{�9O(��ϕ�\H]�b����1��K� $�vS`��#Ѥ���O�㮝*���Ĝ^1�z�q=���̻��l�������q{��Q�1C&H�x�!Z�Us��W�S(��?�{��לʐH*��Q�dk�c=kf(�4�s3�H)+��3Xu���%eF���f��c��Ⱦ�[�])_y��dՋ��J'쀜\�Yj���=�����y�.��}$��&�g�6`T��t"��Xt7z̓쐅�n9LWZ�����d��_ZQ�M�߻�q3,\P�Z�T���WQ������V[��!p�� pQP�U�8�39����"<y�+OY�9'1!�l^�G�EGBdԆ����*�H@PIa@PP@aAH0ʴO>cp
v^�ه�ٖ٘��y����1����q���g\�c�E������b��N<y݇�����w;/P����Ass��ukq]�$Z	;��1G�Ke��g�/Nʒ�BcrZ<��M[l�/����U�{�"p�Y����8�iI���`
N6T߬��ۮ}�m��#b��Mf*��M|)�`eR[[rj�kd�o�"�;i%\��E�OP0���qAk��K���w+��/�<(]�&�o]	�bL����!~��3mu���S�Vm�7�2�!A�A���U<��<Ѕ:�q�4�(ftt�8	��N��ۄ�Z�ƌ֔�N����27��ٙ7���r����U��ݦo���'c�Y���@�8��P���
�vS���S�;�^{��b,G�GڶQM�����ӿ��yZ'��T'��ɺ���yߡ0�҄�V�V��/��L�o~�0���o�<:�g�����1CvW�<S�����D���8�@vW���+�k!k����E���"�H��r�&-�?I�!F4��W�|���З�#���A'�]�;��I�PB�����mw�RΑfz�Xs7�
�b��d.�S���K8E���8"�d,:�F��82�{���-��]r���q�I�l�O6G���Γ�cğ�#[�%���'�៤����HV�$�;Dx8I�#���R��K?D����p�d��$t'i��FΣ<<I�MN�AAP��^��N�s�����q�sI\��]��">����w�0[J�V�S8'|&ܗM�͓m��U���c��<I^'?.�D����*ʪ����Vw���������L�4&{L���1O�y_�RY�HZ���ˆ\|�?��Z�L���:E$����a�ۖ:�����@l�QK]F��BK}<�����G/ �$
���wY�G=c�s����c���.Wr�R�P[��I<��
���#�$�d�,RJ�Q���og�_
؟G2�F
H:����ؓ��؇�J�V�3�V9>��H`(\W���U������b0d�e8���v^����>�8�f�d�g��	���j,�XH�a�����\&)�%Ӑ8���,�K+�?���D��d׀�`[���"�{�a�܉�%نg��Z��Y�{�n�EZ��!KL�(Q_��9�B�g��B,�5[���_�t�)��V�=�(��'�n��H����wΜ����i�i�Y�
řs��3
J2J�D�E��y�Ʊ��
*�
endstream
endobj
58 0 obj
5241
endobj
56 0 obj
<< /Type /Font
/Subtype /CIDFontType2
/BaseFont /Roboto-Regular
/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >>
/FontDescriptor 54 0 R
/CIDToGIDMap /Identity
/W [0 [440 241 566 547 646 547 557 526 246 534 540 559 336 557 557 261 643 512 676 592 546 519 869 324 481 241 557 344 557 626 707 195 557 557 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 562 448 210 564 557 557 557 557 618 274 409 631 317 237 ]
]
>>
endobj
57 0 obj
<< /Length 826 >>
stream
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
2 beginbfrange
<0000> <0000> <0000>
<0001> <0042> [<0069> <006F> <006E> <0043> <0075> <0062> <0065> <0020> <004C> <0061> <0064> <0072> <0031> <0035> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0034> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0033> <002B> <005F> <003B> <0071> <0037> <0038> <0030> <0036> <0042> <002D> <002F> <0056> <0022> <006A> ]
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end

endstream
endobj
6 0 obj
<< /Type /Font
/Subtype /Type0
/BaseFont /Roboto-Regular
/Encoding /Identity-H
/DescendantFonts [56 0 R]
/ToUnicode 57 0 R>>
endobj
59 0 obj
<< /Type /FontDescriptor
/FontName /QHCAAA+Consolas
/Flags 4 
/FontBBox [-432.128906 -302.246093 677.246093 1011.23046 ]
/ItalicAngle 0 
/Ascent 742.675781 
/Descent -257.324218 
/CapHeight 742.675781 
/StemV 70.3125000 
/FontFile2 60 0 R
>>
endobj
60 0 obj
<<
/Length1 11900 
/Length 63 0 R
/Filter /FlateDecode
>>
stream
x��yytǙgW7�� �H$��M���/�%ID @�hZ�%��x��-;vd[����$���x2Il����;M6;���y��y����Yٱw=~�l�W�
�e�X�+tuu�W���jR����8�P�������`����%Vf�Ux�o������c�hde��e��X�<�L�=<�����}���u<�<�6�����ߚ(ʌ�/.��[�ڨ'(ʢ�g6^��ێ��\MQ�a�͢�(1E��(
�;�kj��

i����E-�J�7��՛@��c�R]TwS���'hZ:E�)�o���bލ2S"j��D��̀�
8EJ�7;��J��:\��`��_G0P���K���f�$��Pe�_���!frMD��*U��@p@���h����.�;�c{��~Ra�K
d�R���D)SH*�*d����5��n��g���x�mv����5FCqQ�`�r����`tnZZ�T�*�R��^�����A6{��*'CN�r��`�>��{�#�3j7��2�L&/S�f���T��j��L=���S�ĔL�R���Xƿ,3�-f�N���(�c��"�Q6����*�uא����w���4j~<��+���wN�[L�M���X���}�d:1>��b���TZgecS��PsyE�R�r9C�};�B�e��[
��8]�a��
<��90��r"�����L
���Zde���[�o��k���}��:u4�&��Rt��k�e�R��ܳR����rW�<32|y�'X+˖;]����
�r��P���ڽ���!T(��ܭk�x��n~¼���sb�
`}h�?�(��üпep���@�}�����������7���V�3�N������4*�щ��	��W:�Ln�hW��~�ď�M!�,e1���NY(��pI6,R��I�y󌤦ʍ�yvx�|��Zv����ݡ�J�ԾW���x��Z���~|�������LTӆo`i]���.~!U�9s�,�o�޽���s�`���XOW�W�}�c���^�pT�ܾ@������Se������� n�x�;�j�[�*�]�������g6�r�F���3hd
�V�x�
b�΂f>O��:���
~B���yv�I�(�IN�cD����oyk�g\Nvpr���[������D|d�)d1��⨫�i�Ֆ;�Z��5ώ�AbF")�>��:��g��Ӄ[����clr����]��ju.w�	�3����_�V��h*l5�kg�:MqQQ�Fge��U�+*F��H��ZQkQ�����q��Vi���7�xt��壍�G�P�:���1?'�F�<�`����(�
�+ǝ��q����o�t+����;���yi|dϤB����~���@����;=�Z�����P���j�vn�xh���.g0������PR�˟S(d�B�!�����1��])*�����`Vi
T�؅�I���9�n�(U>恟���p�Q=�*�#�b�Q��9�/�ռxF24:>3������!�3�u�r��;w���b��^g9�H���G~z�>PQ�ӵ��/�xr_k��*�0[�
d?)hؐ�2�+RG�-(v�y�����3#���*�pEy������\�Ku~������(6Z<�mkG�.�͊f��p
��,���x�}k�7�܀=�T0/�hw(y@�k���PwV�������.?+���X��5L|5���Ţ"nJ����y����~:���k�6X��6�W)��\i���z}�~�}d��~���֦{����%�4>�Z�8R�p?{��$�L��bdU6���|fh�7/{�G�=�.W��eI���$�'��OdZ��3��$7w��Cj)������5�Ȇ��6���F���]��Lks�ɿ����ll��W[W��=911��BPf xO_s�ۣ׫U���ᕖ��;�5�xkL�B.���{&;�+���˂��\�+)�R"��Qc�F�F��hL*��Q�u{�몽����Y��P&/Ui�&�V�Ҫ4P�X�+�5���������OT<�"�V�Y�.V(����ʚ,j�m�B���ػ�c���Xs��-���%��������Kp��r��q��Ľ��V:tZTTR�**)���A��6�����֎�S˨�.r����t���
:�����j�]Q��ZSӾg�Ζ�r�x�"j�j��hJ���W@i�q�/p��k/����p���i�$wg��w�4�ɡ3�v�Gw�T榛�~��ysm�E����]���ij@5S�O�����ןC���;�7�����o���\'�큹e�8�~�5�G��[�,��u��h����Ք�d���х�7��O�(�=��"���)��]�ʆM�_���Fy�-�^j*�L�K
eE��R�J�5؞��EQiY��t�����Qo4����G�Ӛ
v��u��>���N	
����Z;B���aW�H�4��lY;�\�Y��e�C�@
�T��e1�Kp�9�/�&8/9�z�ZL0�r�|N��rhR�ĥ���/tZ��dc]�/��{����2UyECco��t�D]����Xg��Y�Q��~֊�Ck��McuMg���`��g���}�aZ2l�v�Y͞*����5��1xȫV�E�N�$T�	�6�h�p�
�!����`&X�=�����:�\NU)Bf���������3[����2}�	(��.��|��OZ�u���v��jF3�1C��"\��^��(�x2\���jƶd�������:�ƈDi���hktVZ�0�hc��M�`����\e	�\��ru�3���'8���4�%#��
�k�`�g�҉��v��)J3A7:
΂$d���^'2}-r��p�?�^G�}k��wf��K��B�S�cHI���M��Խ�zh3P�]�U'�t�[Q���v��5(WF��)�Ѩ$<�ug�}LƤ,1[�C㝡&���@Ն
��;jk�d��uLM�l<Ԥ7�45`T��
��u���D�I,�`���
G�%֘��'w��)�����q7���H$���bv���X+U�-.wm��6Y�J�i���qgW��Vo,.R��Zi0"SZf����}�m5�F�Z��c�`S(�(S�4z��+�^�5�f����Z0n�W��6{I�Q����Huj�F��i���
6-V��R�����b���#��k	�x�G?"u

 ��\�e�|��ܴq�=���3�\�LJ����v�{���xg�������B�A�W/}㟿8�}#uS�\�M5C����`d6e9��ʅ�NU�q6 ��ñ�R5�8�SƆ`CMS������'�`��r������G�5vn�:����YWoc���ͪ�6�"��@@�PG{Q���t5���DZ({�H.s�F+[�in�ꮩ1�D}$Q�J.�JD�
���q55�h�h���6�S
_��-�'Z^5���&*,f�s�4v��1'�ߥ� =�^G��;��z@�@TK�ԣ�Co�?���5Y�k���Alt�
���P��߼��͢�����:��l�{X!7�+��G�z�>���W?�W�f����6�5��9R�rt�X�w獡S�sTB��ǵ��:0
�������
F�NKꚚ�C�Cm�͵6�w�M���zg��\T��B�7:+��>X�hߧV�ڵk��'�M>���BB^懰+�4��x�v���o�ݻ�
�\VTl4y�[G{��n�9x|bp~�U���!}�ڵ��
�
�j8��U�ʖ��ZBc]����m]�ݽ}#��J��Q�QF�.ɈAP����}y�a��ƻ\�kFo";�.�?̈́W��_Y�~?q�CQ1He�s�P�wɝ�9!A�u�pb�G��M�b��깕/��ї�#���:���XG��B��v�N[n�V5�6�\.�f�d�]����U�@_�	�ҏ<u���^=B��=#Ǐ]~��N�]�=ǎ���ag�X�[
ٹ�n��9p\�ZY3z:�q�Ve)��w���vl��Zf�%U�D
!�ڲp�Cͽ}û"F�ƀ1�頻he��_s���
��_�D:�-Vi�1�Ev[}� .�Μ��{n�aO9�/��0����>�>��Nr��&�6�:Ɲ@��O�Пq�v	���W�ז8�~���7��&+Z��!��y,�8�
�ܕW��o+�{�vÁ��3��T��x�j�@��ׇ�;۷�����P(��궎�'��R��%]W���-��.g��嬘�5l0��[#�z��ҨG��o�j�����\")+-��ڂ�*����Q�,���=�q���\^P {<mm��ݶ��@�wV���K��S�E�o�Kk���_Ҷ��tPlz�;���I��p��
%�"H�T���=��x
z�"S�$kܴش����K��k��%1�y{uwˑ��t�[�ET��<[������juW
���=�������J�\����Ѷ�J�J���\Ύ��=m�J��~��N��r�ښ�G��|���nO��vt�ȑ�dNo��U��S旦ý[�pb��O�!����ƩGT��!w�yU��GE�����k��&������b�-T��P���SO��N�S7���N�\�{�C�Tn>Ư+c�����~���'�tW�؞H|���;��ػ붆�ɂ��ߌ��>X׍��m�w���~���|����g��
w�W�Y��d������������������� �z ~�q��"**������‘/s�G#���S�!���qxW���u�́���Cm�j�^lz�,������
hU���}���~��2��"mX?�0�[��]�p�e��;���ze��o���sc�ûv�j�t�8�ؤ�������]{�����F4E�H*"\<`1�h�{���+��O��yY�߁#�'���~��)ķط�ׅ%m����v��ȳ�K��F��5���D�Ǐ�YB)�/c��^��s��
wܖD�����]�F	�;���`�3p�m�p�@�愶�%h)a-�B�П��S	��C��	h^��Vh[x~��К��o�
<bd�����D����>A���oL#s��>�D�!J�>��.�'��şK�%A�i���NH�)}��t�
�>Q�O�JY�짲��Z�G~^���mE�bX1���⇊�ElQ+�n�z��۟%��멜=�B���B���ӧB_D ��S
�.�%0>%�TzW�PzP�R��q�/��'�&��W���WPy��/Bۋ� �ƒK�	�F	W���R�i�Oì
}������Q��@�)=r}	�	})u�	��C��~!���B_&�M��rj\���WP�J�ѧ�cB��J��Q߃J�j�:*�T��Pi*Ee��RY�^|��a$�$ԉ,�M%�b��06G�ûy��=��oW��c�uvG<�NeR�Y�7�^L���x*�c�	vw|n>�aw�2���X��m0	�6�d&�C�0�~�����R"�۹o����:-�ͻl7N����PJ�@YxKg@6��Ja�+h��0�,Qk�X ��1�<~3�w6�y^��fG��a�)NL��`��g�0�M����p���e��<�̥SK�x8�ZX'㱌�N��c�@�Ѵ�X�PUDh7�������/E��7���T*{7]�A>�P,���g�x���,�s��������~�҄�y�
4��^J�u��ό���%s"D�,Y���`�B��=��]�(�������2�[�'4Ä���=�%c��>9/��b��8���𔀧Cdk,JV����V|�f5�7ssz��ě�9�7)b�X��X�0�:��bLk(#�a��(C�����=*�'ފmrX�����eBiC�Q��E�+dw�;<�_\+C�()�k(����ܕ�3A,�[=}��2M�� c1�>���#���uZ�ܻ{B�;���M_H��$��9�2y�_ ��z��
҄A�	���狷-�	<�1�՘�9�x,ː��9��ab�$p��!F}I�)mX{KB8���;-ț\K�x��%�J+ٛ��y�[5�!���Uy��*�*)�Fn~�{zR���B�`��s��s4#؟�WΧp��lI�ov=��=8A�&�s���2#D���躟�OY�_�̟!=LPae]�9��3dn>�-�q{�/Ģ�l*�.ebl<�.�Ss���B<9�ƒ���Tr!��\NF�d�4��#K�l8�e�e�A6YH%S��p��Kf1��b,��C�&I=2N�#YȒ�|�p���Lx!�.ǣ�j6?cS�(�]Y�-��xf5�>�y�ga��T*
dR�H��3R�p�07���'c��t:�YL%��C;
��@0�$؉x2�Z��<F��Dx�
'�ex�ē��%���<V�.���f"��M��Tzv���˂�$I�q<F7)!��ԛZJ�ci�	V9�,C�_H�� �B?�I����i!��X2
��NPVd"�X���Xr4�����%��I,A�n���4�Ľ��B,NdZ�|>�f��l�
D�?�������$dk0Of>��cB3 ?�5����[�,6��D*�����e����6�
g�1vf�=N�`�lО	�yG[��%�<��E(�j�Z&����[����B���E���8�n�/5��.���.//�r���P���q~�6�%��C��,A�4A���9�x�lx&?��R�^��|�]ɫS��8����G��Wr���@.�1(���P,���pQRje׫�e�W��;���o ���ǕE����r<-���ȸYn���OU��M2�]�?�U�6�~mP�Ȅ|���#�T��r�f��3
���%K�˕˜>/+_�$I~�QIy=�o�i�ߍ�k{�P
�H=|*Erp�[�����_W�g16T���'8��c�l{7���]�dq�X��G�����ш�:�BL/��0!� ����ީ$�^U���������w�L'`	�M�#<P����i��V�]��|I�aWH�D*��)��9ň�2^j)���"vg�3K,n�XmU-1.��%R���/BY��0`���lx)���3���;�	
endstream
endobj
63 0 obj
7274
endobj
61 0 obj
<< /Type /Font
/Subtype /CIDFontType2
/BaseFont /Consolas
/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >>
/FontDescriptor 59 0 R
/CIDToGIDMap /Identity
/DW 545 >>
endobj
62 0 obj
<< /Length 742 >>
stream
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
2 beginbfrange
<0000> <0000> <0000>
<0001> <0036> [<0069> <006F> <006E> <0063> <0075> <0062> <0065> <002E> <006C> <0061> <0064> <0072> <005F> <0070> <0074> <0068> <0073> <003A> <003B> <002B> <002D> <002F> <0076> <0077> <006D> <0052> <0053> <0020> <003D> <0022> <0066> <0067> <006B> <0031> <0024> <007B> <007D> <0032> <0034> <0030> <0079> <0078> <0037> <0033> <0045> <004E> <004F> <0054> <0049> <0043> <007C> <0044> <0050> <0041> ]
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end

endstream
endobj
7 0 obj
<< /Type /Font
/Subtype /Type0
/BaseFont /Consolas
/Encoding /Identity-H
/DescendantFonts [61 0 R]
/ToUnicode 62 0 R>>
endobj
2 0 obj
<<
/Type /Pages
/Kids 
[
5 0 R
19 0 R
28 0 R
34 0 R
]
/Count 4
/ProcSet [/PDF /Text /ImageB /ImageC]
>>
endobj
xref
0 64
0000000000 65535 f 
0000000009 00000 n 
0000038393 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000748 00000 n 
0000029475 00000 n 
0000038259 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000566 00000 n 
0000001072 00000 n 
0000007393 00000 n 
0000000869 00000 n 
0000001045 00000 n 
0000007714 00000 n 
0000007414 00000 n 
0000007451 00000 n 
0000007495 00000 n 
0000007539 00000 n 
0000008039 00000 n 
0000012667 00000 n 
0000007836 00000 n 
0000008012 00000 n 
0000012724 00000 n 
0000012688 00000 n 
0000013042 00000 n 
0000017756 00000 n 
0000012846 00000 n 
0000013022 00000 n 
0000020135 00000 n 
0000017777 00000 n 
0000017821 00000 n 
0000019968 00000 n 
0000019794 00000 n 
0000018072 00000 n 
0000018226 00000 n 
0000018365 00000 n 
0000018761 00000 n 
0000019633 00000 n 
0000018558 00000 n 
0000019037 00000 n 
0000019165 00000 n 
0000019328 00000 n 
0000019497 00000 n 
0000020031 00000 n 
0000020453 00000 n 
0000022477 00000 n 
0000020257 00000 n 
0000020433 00000 n 
0000022498 00000 n 
0000022762 00000 n 
0000028115 00000 n 
0000028597 00000 n 
0000028094 00000 n 
0000029615 00000 n 
0000029873 00000 n 
0000037260 00000 n 
0000037465 00000 n 
0000037239 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38512
%%EOF
doc/alt-php73-ioncube-loader/LICENSE.txt000064400000025020151732707730013554 0ustar00LICENCE AGREEMENT FOR THE IONCUBE PHP LOADER, PROVIDED TO ENABLE THE USE
OF IONCUBE ENCODED FILES AND AS PART OF THE IONCUBE24 SERVICE (ioncube24.com)

YOU SHOULD CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS BEFORE USING THE
LOADER SOFTWARE. THE INSTALLATION AND/OR USE OR COPYING OF THE IONCUBE PHP
LOADER SOFTWARE INDICATES YOUR ACCEPTANCE OF THIS LICENCE AGREEMENT.  IF YOU
DO NOT ACCEPT THE TERMS OF THIS LICENCE AGREEMENT, DO NOT INSTALL, COPY
AND/OR USE THE LOADER SOFTWARE.

DEFINITIONS

The following definitions shall apply in this document:

LOADER shall mean the ionCube PHP Loader software package or collection 
of Loaders, including any modifications or upgrades to the software, used for
executing PHP scripts previously encoded with the ionCube PHP Encoder
software to render them non-humanly readable, and any associated
documentation or electronic or online materials relating to the software.

ENCODER shall mean any ionCube PHP Encoder software or service used for the
purpose of producing non-humanly readable encoded files from PHP scripts.

ENCODED FILE shall mean a non-humanly readable file produced by the 
Encoder and being derived from humanly readable PHP script source.

PROVIDER shall mean ionCube Ltd.

USER/YOU shall mean any entity who has downloaded or obtained through any
other means a version of the Loader software.


1 LICENSE ENTITLEMENT 

1.1 The Loader is provided without charge.  Title to the Loader does not pass
to the user in any circumstances.  The Loader is supplied as object code.

1.2 The provider grants a personal, non-transferable, non-exclusive licence to
use the Loader in accordance with the terms and conditions of this Licence
Agreement.

1.3 The installation or downloading and use of the Loader entitles the user
to install and use the Loader for its own internal lawful purposes.


2 DISTRIBUTION 

2.1 The Loader may be freely distributed to third parties alone or as 
part of a distribution containing other items provided that this license
is also included. 

2.2 The Loader may under no circumstances be branded as another product, 
whether distributed or not. 

2.3 Distribution as part of a commercial product is permitted provided such
distribution is in accordance with clauses 2.1 and 2.2 with respect to the 
Loader.


3 ANALYSIS / REVERSE ENGINEERING / MODIFICATION 

Except insofar as the user is permitted to do so in accordance with applicable
law:

3.1 Any analysis of the Loader and embedded data by any means and by
any entity whether human or otherwise and including but without limitation to
discover details of internal operation, to reverse engineer, to de-compile
object code, or to modify for the purposes of modifying behaviour is
forbidden.

3.2 Any analysis of encoded files by any means and by any entity whether human
or otherwise and including but without limitation to discover details of file
format or for the purposes of modifying behaviour or scope of their usage is
forbidden.


4 WARRANTY

THE LOADER SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
WARRANTIES INCLUDING BUT WITHOUT LIMITATION THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE ARE
DISCLAIMED. THE PROVIDER DOES NOT WARRANT THAT THE LOADER IS UNINTERRUPTED
OR ERROR FREE, NOR THAT THE OPERATION OF THE LOADER WILL FUNCTION IN
CONJUNCTION WITH ANY OTHER PRODUCT.  


5 LIMITATION OF LIABILITY 

5.1 IN NO EVENT WILL THE PROVIDER OF THE LOADER BE LIABLE TO THE USER OR ANY
PARTY FOR ANY DIRECT, INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR OTHER
CONSEQUENTIAL DAMAGES ARISING DIRECTLY OR INDIRECTLY FROM THIS LICENCE
AGREEMENT OR ANY USE OF THE LOADER OR ENCODED FILES, EVEN IF THE PROVIDER IS
EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

5.2 THE LOADER IS PROVIDED ON AN "AS IS" BASIS.  THE PROVIDER EXCLUDES ALL
WARRANTIES, CONDITIONS, TERMS, UNDERTAKINGS AND REPRESENTATIONS (EXCLUDING
FRAUDULENT MISREPRESENTATION) OF ANY KIND, EXPRESS OR IMPLIED, STATUTORY OR
OTHERWISE IN CONNECTION WITH THE LOADER TO THE FULLEST EXTENT PERMITTED BY
LAW.

5.3 DOWNLOADING THE LOADER IS AT YOUR OWN RISK AND THE PROVIDER DOES NOT
ACCEPT LIABILITY FOR ANY DIRECT OR INDIRECT LOSS OR DAMAGE HOWSOEVER CAUSED AS
A RESULT OF ANY COMPUTER VIRUSES, BUGS, TROJAN HORSES, WORMS, SOFTWARE BOMBS
OR OTHER SIMILAR PROGRAMS ARISING FROM YOUR USE OF THE LOADER.  WHILST THE
PROVIDER WILL DO ITS BEST TO ENSURE THAT THE LOADER IS FREE FROM SUCH
DESTRUCTIVE PROGRAMS, IT IS YOUR RESPONSIBILITY TO TAKE REASONABLE PRECAUTIONS
TO SCAN FOR SUCH DESTRUCTIVE PROGRAMS DOWNLOADED FROM THE INTERNET.

5.4 THE PROVIDER'S MAXIMUM LIABILITY FOR ANY LOSS OR DAMAGE ARISING FROM THIS
LICENCE AGREEMENT SHALL IN ANY EVENT BE LIMITED IN THE SOLE DISCRETION OF THE
PROVIDER TO THE REPLACEMENT OF THE LOADER PRODUCT.

5.5 DUE TO THE NATURE OF THE INTERNET, THE PROVIDER CANNOT GUARANTEE THAT ANY
E-MAILS OR OTHER ELECTRONIC TRANSMISSIONS WILL BE SENT TO YOU OR RECEIVED BY
THE PROVIDER OR THAT THE CONTENT OF SUCH TRANSMISSIONS WILL BE SECURE DURING
TRANSMISSION.


6 BUG FIXING AND PRODUCT SUPPORT 

6.1 The provider will use reasonable endeavours to provide support to users.
The provider will at their discretion only provide support for the latest
release.

6.2 Support comprises of fault reporting via tickets and fault diagnosis,
recommendations on workarounds, and where reasonably possible a timely
resolution.

6.3 The user accepts that on occasion the ability of the provider to meet
anticipated or published support schedules may be impaired due to, but without
limitation, Internet service provider failures or software failures that
affect the ability to communicate for an indeterminate period.

6.4 The provider reserves the right to refuse to provide support at any time.

6.5 The provider wishes to maintain and offer a product of the highest
possible quality, and accordingly may from time to time and at its discretion
make product changes for the purpose of correcting behaviour in variance to
the published specification or the user's reasonable expectations. 

6.6 The provider reserves the right to charge for support where the user does
not have a valid support plan in place, or where the support offered exceeds
the scope of the active support plan.


7 PRODUCT UPGRADES

7.1 The provider may from time to time release product upgrades. These will
be provided free of charge and attempts made to provide a timely notification
to customers of the existence of any new release.


8 ERRORS AND OMISSIONS

Whilst reasonable endeavours are made to ensure the accuracy of documentation
concerning the details of the Loader, the user accepts the possibility of
inaccuracies in information presented in any format, including email
communications and online services. The provider shall under no circumstances
be liable for any events that arise as a result of unintentional inaccuracies
or omissions.


9 USER INDEMNITY

You agree to fully indemnify, defend and hold the provider harmless
immediately upon demand from and against all actions, liability, claims,
losses, damages, costs and expenses (including legal/attorney fees) incurred
by the provider arising directly or indirectly as a result of your breach of
this Licence Agreement.


10 INTELLECTUAL PROPERTY RIGHTS

10.1 The user acknowledges that the Loader and associated documentation and
materials contain proprietary information of the provider and are and shall
remain the exclusive property of the provider and/or its licensors and all
title, copyright, trade marks, trade names, patents and other intellectual
property rights therein of whatever nature shall remain the sole property of
the provider and/or its licensors.

10.2 No title to or rights of ownership, copyright or other intellectual
property in the Loader is transferred to the user (other than the licence
rights expressly granted in this Licence Agreement).


11 TERMINATION

11.1 The provider reserves the right to terminate this Licence Agreement
immediately by notice in writing against the user if the user is in breach of
any terms and conditions of this Licence Agreement.

11.2 Termination of this Licence Agreement for any reason shall be without
prejudice to any other rights or remedies of the provider which may have
arisen on or before the date of termination under this Licence Agreement or in
law.

11.3 The provisions of the following clauses shall survive any termination of
this agreement; clause 3, 5, 10 and 13.


12 GENERAL

12.1 The provider reserves the right to transfer or assign all or any of its
rights and duties and responsibilities set out in this Licence Agreement to
another party.

12.2 Headings have been included for convenience only and will not be used in
construing any provision of this Licence Agreement.

12.3 No delay or failure by the provider to exercise any powers, rights or
remedies under this Licence Agreement will operate as a waiver of them nor
will any single or partial exercise of any such powers, rights or remedies
include any other or further exercise of them.

12.4 If any part of this Licence Agreement is found by a court of competent
jurisdiction or other competent authority to be invalid, unlawful or
unenforceable then such part shall be severed from the remainder of this
Licence Agreement which will continue to be valid and enforceable to the
fullest extent permitted by applicable law.

12.5 This Licence Agreement including the documents or other sources referred
to herein supersede all prior representations, understandings and agreements
between the user and the provider relating to the Loader and sets forth the
entire agreement and understanding between the user and the provider relating
to the Loader.

12.6 Nothing in this Licence Agreement shall be deemed to constitute a
partnership between you and the provider nor constitute either party being an
agent of the other party.

12.7 This Agreement does not create any rights or benefits enforceable by any
person not a party to it (within the meaning of the U.K.Contracts (Rights of
Third Parties) Act 1999) except that a person who under clause 12.1 is a
permitted successor or assignee of the rights or benefits of the provider may
enforce such rights or benefits.


13 GOVERNING LAW AND JURISDICTION

This License Agreement and any issues relating thereto shall be construed and
interpreted in accordance with the laws of England and subject to the
exclusive jurisdiction of the English courts.

Copyright (c) 2002-2024 ionCube Ltd.          Last revised 23-April-2015
doc/alt-php73-ioncube-loader/README.txt000064400000007747151732707740013450 0ustar00                            The ionCube Loader 
                            ------------------

This package contains:

* ionCube Loaders

* a Loader Wizard script to assist with Loader installation (loader-wizard.php)

* the License document for use of the Loader and encoded files (LICENSE.txt)

* User Guide describing options that can be configured through a php.ini file.  
  There are options that may improve performance, particularly with files on
  a network drive. Options for the ionCube24 intrusion protection and PHP error
  reporting service (ioncube24.com) are also described.


INSTALLATION
============

Quick Guide for experienced system admins
-----------------------------------------

The Loader is a PHP engine extension, so should be referenced with 
a zend_extension line in a php.ini file. It must be the first engine
extension to be installed. 

The Loader must be for the correct operating system, match the 
PHP version, and for whether PHP is built as thread-safe (TS) or not. 
All information required for installing is available on a phpinfo page. 

For example, if your web server is 64 bit Linux, thread safety is disabled,
PHP is version 8.1.8, the main php.ini file is /etc/php.ini and you
have unpacked Loaders to /usr/local/ioncube, you would:

1) edit /etc/php.ini
2) at the top of the php.ini file add

zend_extension = /usr/local/ioncube/ioncube_loader_lin_8.1.so

3) restart the PHP environment (i.e. Apache, php-fpm, etc.)

4) Check a phpinfo page and the Loader should show up in the Zend Engine box.


Assisted Installation with the Loader Wizard
--------------------------------------------

1. Upload the contents of this package to a directory/folder called ioncube
   within the top level of your web scripts area. This is sometimes called the
   "web root" or "document root". Common names for this location are "www",
   "public_html", and "htdocs", but it may be different on your server.

2. Launch the Loader Wizard script in your browser. For example:
     https://yourdomain/ioncube/loader-wizard.php

   If the wizard is not found, check carefully the location on your server
   where you uploaded the Loaders and the wizard script. 

3. Follow the steps given by the Loader Wizard. If you have full access to the 
   server then installation should be easy. If your hosting plan is more limited, 
   you may need to ask your hosting provider for assistance. 

4. The Loader Wizard can automatically create a ticket in our support system
   if installation is unsuccessful, and we are happy to assist in that case.

   YouTube with a search for "ioncube loader wizard" also gives some helpful 
   examples of installation.


WHERE TO INSTALL THE LOADERS
============================

The Loader Wizard should be used to guide the installation process but the
following are the standard locations for the Loader files. Loader file
packages can be obtained from https://www.ioncube.com/loaders.php

Please check that you have the correct package of Loaders for your system.

Installing to a remote SHARED server
------------------------------------

* Upload the Loader files to a directory/folder called ioncube within your
  main web scripts area.  (This will probably be where you placed the
  loader-wizard.php script.)


Installing to a remote UNIX/LINUX DEDICATED or VPS server
---------------------------------------------------------

* Upload the Loader files to the PHP extensions directory or, if that is
  not set, /usr/local/ioncube


** Installing to a remote WINDOWS DEDICATED or VPS server

* Upload the Loader files to the PHP extensions directory or, if that is
  not set, C:\windows\system32


64-BIT LOADERS FOR WINDOWS
--------------------------

64-bit Loaders for Windows are available for PHP 5.5 upwards.
The Loader Wizard will not give directions for installing 64-bit Loaders for
any earlier version of PHP 5.

Copyright (c) 2002-2026 ionCube Ltd.           Last revised March 2026
doc/alt-php73-snuffleupagus/README.md000064400000014667151732707740013227 0ustar00<h1 align="center">
  <br>
  <a href="https://snuffleupagus.readthedocs.io/">
    <img src="https://github.com/jvoisin/snuffleupagus/raw/master/doc/source/_static/sp.png" alt="Snuffleupagus' logo" width="200"></a>
  <br>
  Snuffleupagus
  <br>
</h1>

<h4 align="center">Security module for php7 and php8 - Killing bugclasses and virtual-patching the rest!</h4>

<p align="center">
  <a href="https://github.com/jvoisin/snuffleupagus/actions/workflows/distributions_php7.yml">
    <img src="https://github.com/jvoisin/snuffleupagus/actions/workflows/distributions_php7.yml/badge.svg"
         alt="Testing PHP7 on various Linux distributions" />
  </a>
  <a href="https://github.com/jvoisin/snuffleupagus/actions/workflows/distributions_php8.yml">
    <img src="https://github.com/jvoisin/snuffleupagus/actions/workflows/distributions_php8.yml/badge.svg"
         alt="Testing PHP8 on various Linux distributions" />
  </a>
  <a href="https://scan.coverity.com/projects/jvoisin-snuffleupagus">
    <img src="https://scan.coverity.com/projects/13821/badge.svg?flat=1"
         alt="Coverity">
  </a>
  <a href="https://bestpractices.coreinfrastructure.org/projects/1267">
      <img src="https://bestpractices.coreinfrastructure.org/projects/1267/badge"
           alt="CII Best Practises">
  </a>
  <a href="http://snuffleupagus.readthedocs.io/?badge=latest">
    <img src="https://readthedocs.org/projects/snuffleupagus/badge/?version=latest"
         alt="readthedocs.org">
  </a>
  <a href="https://coveralls.io/github/jvoisin/snuffleupagus?branch=master">
    <img src="https://coveralls.io/repos/github/jvoisin/snuffleupagus/badge.svg?branch=master"
         alt="coveralls">
  </a>
  <a href="https://twitter.com/dustriorg">
    <img src="https://img.shields.io/badge/twitter-follow-blue.svg"
         alt="twitter">
  </a>
  <a href="https://repology.org/project/php:snuffleupagus/versions">
    <img src="https://repology.org/badge/tiny-repos/php:snuffleupagus.svg"
         alt="Packaging status">
  </a>
  <a href="https://github.com/jvoisin/snuffleupagus">
    <img src="https://github.com/jvoisin/snuffleupagus/actions/workflows/codeql-analysis.yml/badge.svg"
         alt="CodeQL">
  </a>
</p>

<p align="center">
  <a href="#key-features">Key Features</a> •
  <a href="#download">Download</a> •
  <a href="#examples">Examples</a> •
  <a href="https://snuffleupagus.readthedocs.io/">Documentation</a> •
  <a href="https://github.com/jvoisin/snuffleupagus/blob/master/LICENSE">License</a> •
  <a href="#thanks">Thanks</a>
</p>

Snuffleupagus is a [PHP 7+ and 8+](https://secure.php.net/) module designed to
drastically raise the cost of attacks against websites, by killing entire bug
classes. It also provides a powerful virtual-patching system, allowing
administrator to fix specific vulnerabilities and audit suspicious behaviours
without having to touch the PHP code.

## Key Features

* No [noticeable performance impact](https://dustri.org/b/snuffleupagus-030-dentalium-elephantinum.html)
* Powerful yet simple to write virtual-patching rules
* Killing several classes of vulnerabilities
  * [Unserialize-based](https://www.owasp.org/images/9/9e/Utilizing-Code-Reuse-Or-Return-Oriented-Programming-In-PHP-Application-Exploits.pdf) code execution
  * [`mail`-based]( https://blog.ripstech.com/2016/roundcube-command-execution-via-email/ ) code execution
  * Cookie-stealing [XSS]( https://en.wikipedia.org/wiki/Cross-site_scripting )
  * File-upload based code execution
  * Weak PRNG
  * [XXE]( https://en.wikipedia.org/wiki/XML_external_entity_attack )
  * Filter based remote code execution and assorted shenanigans
* Several hardening features
  * Automatic `secure` and `samesite` flag for cookies
  * Bundled set of rules to detect post-compromissions behaviours
  * Global [strict mode]( https://secure.php.net/manual/en/migration70.new-features.php#migration70.new-features.scalar-type-declarations) and type-juggling prevention
  * Whitelisting of [stream wrappers](https://secure.php.net/manual/en/intro.stream.php)
  * Preventing writeable files execution
  * Whitelist/blacklist for `eval`
  * Enforcing TLS certificate validation when using [curl](https://secure.php.net/manual/en/book.curl.php)
  * Request dumping capability
* A relatively sane code base:
  * A [comprehensive](https://coveralls.io/github/jvoisin/snuffleupagus?branch=master) test suite close to 100% coverage
  * Every commit is tested on [several distributions](https://gitlab.com/jvoisin/snuffleupagus/pipelines)
  * An `clang-format`-enforced code style
  * A [comprehensive documentation](https://snuffleupagus.rtfd.io)
  * Usage of [coverity](https://scan.coverity.com/projects/jvoisin-snuffleupagus), codeql, [scan-build](https://clang-analyzer.llvm.org/scan-build.html), …

## Download

We've got a [download
page](https://snuffleupagus.readthedocs.io/download.html), where you can find
packages for your distribution, but you can of course just `git clone` this
repo, or check the releases on [github](https://github.com/jvoisin/snuffleupagus/releases).

## Examples

We're providing [various example rules](https://github.com/jvoisin/snuffleupagus/tree/master/config),
that are looking like this:

```python
# Harden the `chmod` function
sp.disable_function.function("chmod").param("mode").value_r("^[0-9]{2}[67]$").drop();

# Mitigate command injection in `system`
sp.disable_function.function("system").param("command").value_r("[$|;&`\\n]").drop();
```

Upon violation of a rule, you should see lines like this in your logs:

```python
[snuffleupagus][0.0.0.0][disabled_function][drop] The execution has been aborted in /var/www/index.php:2, because the return value (0) of the function 'strpos' matched a rule.
```

## Documentation

We've got a [comprehensive website](https://snuffleupagus.readthedocs.io/) with
all the documentation that you could possibly wish for. You can of course
[build it yourself](https://github.com/jvoisin/snuffleupagus/tree/master/doc).

## Thanks

Many thanks to:

- The [Suhosin project](https://suhosin.org) for being a __huge__ source of inspiration
- [NBS System](https://www.nbs-system.com) for initially sponsoring the development
- [Suhosin-ng](https://github.com/sektioneins/suhosin-ng) for their
  [experimentations](https://github.com/sektioneins/suhosin-ng/wiki/News)
  and [contributions](https://github.com/jvoisin/snuffleupagus/commits?author=bef),
  as well as [NLNet](https://nlnet.nl/project/Suhosin-NG/) for sponsoring it
- All [our contributors](https://github.com/jvoisin/snuffleupagus/graphs/contributors)

doc/alt-php73-snuffleupagus/CONTRIBUTING.md000064400000013046151732707740014167 0ustar00## Contributing

First off, thank you for considering contributing to snuffleupagus.

### 1. Where do I go from here?

If you've noticed a bug or have a question,
look at the [faq](https://snuffleupagus.readthedocs.io/faq.html) and
[search the issue tracker](https://github.com/jvoisin/snuffleupagus/issues)
to see if someone else has already created a ticket. If not, go ahead and
[make one](https://github.com/jvoisin/snuffleupagus/issues/new)!

### 2. Fork & create a branch

If this is something you think you can fix,
then [fork snuffleupagus](https://help.github.com/articles/fork-a-repo) and
create a branch with a descriptive name.

A good branch name would be (where issue #325 is the ticket you're working on):

```sh
git checkout -b 325-kill-sql-injections
```

### 3. Get the test suite running

Just type `make coverage` or `make debug`, the testsuite should be run
automatically.

Please add tests if you're fixing a bug or adding a new feature: we do have a
[high coverage](https://coveralls.io/github/jvoisin/snuffleupagus?branch=master)
(functions, lines and branches), and intend to keep it that way.

#### 3.3 Debugging failures in the test suite

If your changes have introduced run-time failures in the test-suite, you can
easily troubleshoot them by inspecting the files that
[php has generated](https://qa.php.net/write-test.php#analyzing-failing-tests)
for this purpose.

A nice trick is to edit the `.sh` file to prepend `gdb --args` to it before
launching it, in order to run the failing test inside GDB.


### 4. Did you find a bug?

* **Ensure the bug was not already reported** by
  [searching all issues](https://github.com/jvoisin/snuffleupagus/issues?q=).
* If you're unable to find an open issue addressing the problem,
  [open a new one](https://github.com/jvoisin/snuffleupagus/issues/new).
  Be sure to include a **title and clear description**,
  as much relevant information as possible, and a **code sample**
  or an **executable test case** demonstrating the expected behavior that is not
  occurring.


### 5. Get the style right

Your patch should follow the same conventions & pass the same code quality
checks as the rest of the project. We're using [clang-format](http://clang.llvm.org/docs/ClangFormat.html) to
ensure a consistent code-style. Please run it with `clang-format --style="{BasedOnStyle: google, SortIncludes: false}"`
before committing, or even better, use a [pre-commit hook](https://github.com/andrewseidl/githook-clang-format).

### 6. Make a Pull Request

At this point, you should switch back to your master branch and make sure it's
up to date with our upstream master branch:

```sh
git remote add upstream git@github.com:jvoisin/snuffleupagus.git
git checkout master
git pull upstream master
```

Then update your feature branch from your local copy of master, and push it!

```sh
git checkout 325-kill-sql-injections
git rebase master
git push --set-upstream origin 325-kill-sql-injections
```

Finally, go to GitHub and [make a Pull Request](https://help.github.com/articles/creating-a-pull-request) :D

Travis CI will [run our test suite](https://travis-ci.org/jvoisin/snuffleupagus)
against all supported PHP versions. We care about quality, so your PR won't be
merged until all tests pass. It's unlikely, but it's possible that your changes
pass tests in one PHP version but fail in another. In that case, you'll have to
setup your development environment to use the problematic PHP version, and
investigate what's going on!

### 7. Keeping your Pull Request updated

If a maintainer asks you to "rebase" your PR, they're saying that a lot of code
has changed, and that you need to update your branch so it's easier to merge.

To learn more about rebasing in Git, there are a lot of [good](http://git-scm.com/book/en/Git-Branching-Rebasing)
[resources](https://help.github.com/articles/interactive-rebase) but here's the suggested workflow:

```sh
git checkout 325-kill-sql-injections
git pull --rebase upstream master
git push --force-with-lease 325-kill-sql-injections
```

### 8. Merging a PR (maintainers only)

A PR can only be merged into master by a maintainer if:

1. It is passing CI.
2. It has been approved by at least one maintainer. If it was a maintainer who
   opened the PR, only one extra approval is needed.
3. It has no requested changes.
4. It is up to date with current master.

Any maintainer is allowed to merge a PR if all of these conditions are met.

### 9. Shipping a release (maintainers only)

Maintainers need to do the following to push out a release:

1. Make sure that all pending and mergeable pull requests are in
2. Close the corresponding
	 [milestone](https://github.com/jvoisin/snuffleupagus/milestones)
2. Run `valgrind` (by adding a `-m` after the `-q` in the Makefile) and check that everything is ok.
   Don't mind the python-related issues.
2. Run `cd src; phpize; ./configure --enable-snuffleupagus --enable-debug; scan-build make`
   and fix the possible issues.
3. Update the `src/php_snuffleupagus.h` according to [semantic versioning](https://semver.org/)
4. Update the changelog page in the documentation
5. Update the Debian changelog in `./debian/changelog` with `cd debian; dch`
6. Commit the result
7. Clean up the folder `make clean; git clean -xdf`
8. Create a tag for the release:

  ```sh
  git tag -s v$MAJOR.$MINOR.$PATCH -m "v$MAJOR.$MINOR.$PATCH"
  git push --tags
	git push origin master
  ```

9. Wait for the CI on the new tag branch to finish
10. Create the [release on github](https://github.com/jvoisin/snuffleupagus/releases)
11. Add the freshly built Debian packages from the CI to the release
12. Do the *secret release dance*
doc/pear/Mail/LICENSE000064400000002742151732707740010151 0ustar00Copyright (c) 1997-2017, Chuck Hagenbuch
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/pear/File_MARC/LICENSE000064400000063504151732707740010753 0ustar00		  GNU LESSER GENERAL PUBLIC LICENSE
		       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

		  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.
  
  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

			    NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

		     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


doc/pear/File_MARC/CHANGELOG000064400000013441151732707740011153 0ustar001.4.1
  * Reintroduce include_path to composer.json

1.4.0
  * Update File_MARC_Lint to match MARC::Lint 1.52 (thanks Demian Katz)
  * Warn about out-of-range skip indicators (thanks Demian Katz)
  * Support initialization from SimpleXMLELement object (thanks Dan Michael O. Heggø)
  * Fix Travis-CI support (thanks Daniel O'Connor)
  * Tweak composer.json to support Composer 2.0
  * Silence PEAR style errors and warnings in File/MARCBASE.php

1.3.0
  * Support reading MARC-in-JSON serializations
  * Fix positions using MARC_List's appendNode method (thanks Waldemar Bartikowski!)

1.2.0
  * Support injection of extended Record class (thanks Dan Michael O. Heggø!)
  * Support regular expression matching of subfields (thanks Waldemar Bartikowski!)
  * Fix deletion of multiple subfields at once (thanks Dan Michael O. Heggø!)

1.1.5
  * Drop support for PHP 5.3 and 5.4

1.1.4
  * Fix insertField() behaviour, which could truncate records (reported by Andreas Roussos)
  * Docs correction for Data_Field (thanks Daniel Walter)

1.1.3
  * Add a getContents() convenience method, contributed by Carsten Klee

1.1.2
  * Fetch pear_exception from Packagist [danmichaelo]

1.1.1
  * Add MARC-in-JSON serialization fix for subfield 0 json_encode() limitation
    (thanks to Bill Dueber for reporting the bug)

1.1.0
  * Enable namespaces in MARCXML handling (thanks Carsten Klee!)
  * Remove skip check for Structures/Linked_List

1.0.2
* Update MARC_Lint set of rules (thanks Demian Katz!) 

1.0.1
* Fix bug in MARC binary serialization of subfields with value '0'.
  Thanks to Mark Jordan (mjordan@sfu.ca) for the bug report.

1.0.0
* First stable release!

0.8.0-beta
* Drop Structures_LinkedList dependency in favour of SplDoublyLinkedList.
  This bumps the minimum PHP version up to 5.2.0.

0.7.3-beta
* Merge patch from Karen Coombs (librarywebchic@gmail.com) adding default
  namespace to record elements

0.7.2-beta
* Fix bug #19845 - Record::toXML() returns nothing

0.7.1-beta
* Make Validate_ISPN an optional dependency

0.6.2-beta
* Improve handling of bad leader data, including declared length and overly
  long leaders in MARCXML

0.6.1-beta
* Correct layout per bug #17704

0.6.0-beta
* Add two flavours of JSON output from File_MARC_Record: toJSON() and
  toJSONHash()

0.5.2-beta
* Enable File_MARC_Record to be invoked with a null constructor again, useful
  for building MARC records from scratch
* Add a test to check that the null constructor works to avoid future
  regressions

0.5.1-beta
* Explicitly cast results to strings to avoid returning XML objects when
  File_MARCXML is in effect; problem doesn't show up in the PHP CLI, but does
  cause problems on the Web

0.5.0-beta
* Drop MARCFLAT as it is unmaintained and, to my knowledge, unused
* Add the ability to generate a proper collection of MARCXML records
* Factor out some of the common toXML()-related methods to a new base class
* Add tests of the new toXML() functionality for both MARC and MARCXML sources

0.4.4-beta
* Enable MARCXML to handle bad tags, to match MARC
* Handle corner case where only one indicator might have been provided

0.4.3-beta
* Fix bug #16783 - handle bad MARC tags via warnings instead of bubbling an
  exception all the way up

0.4.2-beta
* Fix bug #16642 - MARCXML files return keys of an invalid type

0.4.1-beta
* Fix suggested by Dan Field (surfrdan @ gmail.com) for addWarnings() typo

0.4.0-beta
* Add formatField() convenience method to File_MARC_Field (courtesy Mark
  Matienzo @ matienzo.org)
* Move from split() to explode() to avoid PHP 5.3 deprecation warning
  (courtesy bertrand.zuchuat @ rero.ch

0.3.0-beta
* Add isControlField() and isDataField() convenience methods to File_MARC_Field

0.2.3-beta
* Handle single-record MARC21XML files with "record" as the root element

0.1.1-alpha
* Add File_MARC_Record::toXML() method for generating MARCXML output
* Add File_MARCXML class for reading MARCXML source
* Add tests for MARCXML methods

0.1.0-alpha
* Split each class out into its own file
* Do not return anything from constructors

0.0.9-alpha
* Separate getFields() from getField(), getSubfields() from getSubfield()
  to avoid forcing users to test is_array() after every call
* Add addWarnings() / getWarnings() for records to avoid throwing an
  exception for a non-fatal error
* Fix examples, touch up phpdoc in preparation for call for votes

0.0.8-alpha
* Switch to PEAR_Exception for error handling

0.0.7-alpha
* Implement useful key() overrides for key=>value iteration through
  fields and subfields 
* Adjust to new Structures_LinkedList_Double names

0.0.6-alpha
* Remove package globals, define class constants & static vars instead
* Change addField/Subfield() to append..(), prepend...(), and insert...()

0.0.5-alpha
* Work towards a more consistent API (delete getAllSubfields)
* Make PCRE expressions in getFields() and deleteFields() optional.
* Make duplicate() actually return a deep copy of a record.
* Stronger, better, faster (now with typehints)
* Iterate with foreach() everywhere now

0.0.4-alpha
* Adjust to Structures_Linked_List package name change and minor API changes
* Adhere to PEAR CS (thanks PHP_CodeSniffer!)
* Correct sloppy use of references (thanks E_STRICT!)
* Okay, this time real error handling using PEAR_ErrorStack
* Prepare first package for PEPR

0.0.3-alpha
* Split MARC into separate File_MARC and Structure_Linked_List packages (with corresponding renaming of classes and constants)
* Adopt PEAR naming conventions (s/MARC/File_MARC/)
* Initial stab at PEAR_ErrorStack error handling

0.0.2-alpha
* Fix marc_004.phpt: explicitly compare object references with === operator
* Document all constants.
* Fix MARC_Field::deleteSubfield() function
* Add this ChangeLog

0.0.1-alpha
* First publicly available release, based on MARC decoding algorithm from
the emilda.org php-marc package with a completely new API and class hierarchy
doc/pear/File_MARC/examples/read.php000064400000002273151732707740013204 0ustar00<?php

require 'File/MARC.php';

// Read MARC records from a stream (a file, in this case)
$marc_source = new File_MARC('example.mrc');

// Retrieve the first MARC record from the source
$marc_record = $marc_source->next();

// Retrieve a personal name field from the record
$names = $marc_record->getFields('100');

foreach ($names as $name_field) {
    // Now print the $a subfield
    switch ($name_field->getIndicator(1)) {
    case 0:
        print "Forename: ";
        break;

    case 1:
        print "Surname: ";
        break;

    case 2:
        print "Family name: ";
        break;
    }

    $name = $name_field->getSubfields('a');

    if (count($name) == 1) {
        print $name[0]->getData() . "\n";
    } else {
        print "Error -- \$a subfield appears more than once in this field!";
    }
}

print "\nPrint all series statement fields (4xx):\n";
// Retrieve all series statement fields
// Series statement fields start with a 4 (PCRE)
$subjects = $marc_record->getFields('^4', true);

// Iterate through all of the returned series statement fields
foreach ($subjects as $field) {
    // print with File_MARC_Field_Data's magic __toString() method
    print $field;
}

print "\n";

?>
doc/pear/File_MARC/examples/marc_yaz.php000064400000002325151732707740014074 0ustar00<?php
$dir = dirname(__FILE__);
require 'File/MARC.php';

// Define the usable fields for our CCL query
$ccl_fields = array(
    "ti" => "1=4",
    "au"  => "1=1",
    "isbn" => "1=7"
);

// Declare the array that will hold the parsed results
$ccl_results = array();

// Connect to the laurentian.ca Z39.50 server
$conn = yaz_connect('142.51.8.7:2200/UNICORN');
yaz_ccl_conf($conn, $ccl_fields);

// Define our query for a most excellent text
$ccl_query = "ti='derby' and au='scott'";

// Parse the CCL query into yaz's native format
$result = yaz_ccl_parse($conn, $ccl_query, $ccl_results);
if (!$result) {
    echo "Error: " . $ccl_results['errorstring'];
    exit();
}

// Submit the query
$rpn = $ccl_results['rpn'];
yaz_search($conn, 'rpn', $rpn);
yaz_wait();

// Any errors trying to retrieve this record?
$error = yaz_error($conn);
if ($error) {
    print "Error: $error\n";
    exit();
}

// Retrieve the first MARC record as raw MARC
$rec = yaz_record($conn, 1, "raw");
if (!$rec) {
    print "Error: Retrieved no results.\n";
    exit();
}

// Parse the retrieved MARC record
$marc_file = new File_MARC($rec, File_MARC::SOURCE_STRING); 

while ($marc_record = $marc_file->next()) {
    print $marc_record;
    print "\n";
}
?>
doc/pear/File_MARC/examples/subfields.php000064400000002401151732707740014242 0ustar00<?php
require 'File/MARC.php';

// File_MARC offers the ability to add subfields at any point within
// an existing set of subfields

// First, create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// Then, create a field including those subfields
$field = new File_MARC_Data_Field('100', $subfields, '0');

// Create some new subfields
$subfield1 = new File_MARC_Subfield('g', 'a little');
$subfield2 = new File_MARC_Subfield('k', 'a bit more');
$subfield3 = new File_MARC_Subfield('t', 'a lot');

// Append a new subfield to the existing set of subfields
// Expected order: a-z-g
$field->appendSubfield($subfield1);

// Insert a new subfield after the first subfield with code 'z'
// Expected order: a-z-k-g
$sf = $field->getSubfields('z');
// getSubfields() always returns an array; we just want the first subfield
if (count($sf) > 0) {
    $field->insertSubfield($subfield2, $sf[0]);
}

// Insert a new subfield prior to the first subfield with code 'z'
// Expected order: a-t-z-k-g
$sf = $field->getSubfield('z');
// getSubfield() simply returns the first matching subfield
if ($sf) {
    $field->insertSubfield($subfield3, $sf, true);
}

// let's see the results
print $field;
print "\n";

?>
doc/pear/File_MARC/examples/example.mrc000064400000003472151732707740013720 0ustar0001850     2200517   45000010011000000030007000110080039000180200026000570350015000830400007000980420012001050840018001170840018001350840021001530840022001741000030001962450062002262500013002882600058003013000033003594400037003925000023004295990010004527400024004627750034004868410048005208410049005688410047006178410048006648410047007128410047007598520038008068520021008448520013008658520016008788520028008948520021009229000056009439000060009999000057010599000056011169000057011729000060012299760026012890050017013150000000044EMILDA980120s1998    fi     j      000 0 swe  a9515008808cFIM 72:00  99515008808  aNB  9NB9SEE  aHcd,u2kssb/6  5NBauHc2kssb  5SEEaHcf2kssb/6  5QaHcd,uf2kssb/61 aJansson, Tove,d1914-200104aDet osynliga barnet och andra ber�ttelser /cTove Jansson  a7. uppl.  aHelsingfors :bSchildt,c1998 ;e(Falun :fScandbook)  a166, [4] s. :bill. ;c21 cm 0aMumin-biblioteket,x99-0698931-9  aOriginaluppl. 1962  aLi: S4 aDet osynliga barnet1 z951-50-0385-7w9515003857907  5Liaxab0201080u    0   4000uu   |000000e1  5SEEaxab0201080u    0   4000uu   |000000e1  5Laxab0201080u    0   4000uu   |000000e1  5NBaxab0201080u    0   4000uu   |000000e1  5Qaxab0201080u    0   4000uu   |000000e1  5Saxab0201080u    0   4000uu   |000000e1  5NBbNBcNB98:12hpliktjR, 980520  5LibLicCNBhh,u  5SEEbSEE  5QbQj98947  5LbLc0100h98/j3043 H  5SbShSv97j72351saYanson, Tobe,d1914-2001uJansson, Tove,d1914-20011saJanssonov�, Tove,d1914-2001uJansson, Tove,d1914-20011saJansone, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJansson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanssonova, Tove,d1914-2001uJansson, Tove,d1914-2001 2aHcd,ubSk�nlitteratur20050204111518.0doc/pear/Net_Socket/LICENSE000064400000002367151732707740011330 0ustar00Copyright 1997-2017 The PHP Group

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/pear/Net_Socket/README.md000064400000001753151732707740011600 0ustar00# Net_Socket - Network Socket Interface

[![Build Status](https://travis-ci.org/pear/Net_Socket.svg?branch=master)](https://travis-ci.org/pear/Net_Socket)
    

Net_Socket is a class interface to TCP sockets. It provides blocking
and non-blocking operation, with different reading and writing modes
(byte-wise, block-wise, line-wise and special formats like network
byte-order ip addresses).

[Homepage](http://pear.php.net/package/Net_Socket/)


## Installation
For a PEAR installation that downloads from the PEAR channel:

`$ pear install pear/net_socket`

For a PEAR installation from a previously downloaded tarball:

`$ pear install Net_Socket-*.tgz`

For a PEAR installation from a code clone:

`$ pear install package.xml`

For a local composer installation:

`$ composer install`

To add as a dependency to your composer-managed application:

`$composer require pear/net_socket`


## Tests
Run  the tests from a local composer installation:

`$ ./vendor/bin/phpunit`


## License
BSD-2 license
doc/pear/XML_Util/examples/example.php000064400000021710151732707740013675 0ustar00<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Examples (file #1)
 *
 * several examples for the methods of XML_Util
 * 
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   XML
 * @package    XML_Util
 * @subpackage Examples
 * @author     Stephan Schmidt <schst@php.net>
 * @copyright  2003-2008 Stephan Schmidt <schst@php.net>
 * @license    http://opensource.org/licenses/bsd-license New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/XML_Util
 */

    /**
     * set error level
     */
    error_reporting(E_ALL);

    require_once 'XML/Util.php';
    
    /**
     * replacing XML entities
     */
    print 'replace XML entities:<br>';
    print XML_Util::replaceEntities('This string contains < & >.');
    print "\n<br><br>\n";

    /**
     * reversing XML entities
     */
    print 'replace XML entities:<br>';
    print XML_Util::reverseEntities('This string contains &lt; &amp; &gt;.');
    print "\n<br><br>\n";

    /**
     * building XML declaration
     */
    print 'building XML declaration:<br>';
    print htmlspecialchars(XML_Util::getXMLDeclaration());
    print "\n<br><br>\n";

    print 'building XML declaration with additional attributes:<br>';
    print htmlspecialchars(XML_Util::getXMLDeclaration('1.0', 'UTF-8', true));
    print "\n<br><br>\n";

    /**
     * building document type declaration
     */
    print 'building DocType declaration:<br>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        'http://pear.php.net/dtd/package-1.0'));
    print "\n<br><br>\n";

    print 'building DocType declaration with public ID (does not exist):<br>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        array('uri' => 'http://pear.php.net/dtd/package-1.0', 
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1')));
    print "\n<br><br>\n";

    print 'building DocType declaration with internal DTD:<br>';
    print '<pre>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        'http://pear.php.net/dtd/package-1.0', 
        '<!ELEMENT additionalInfo (#PCDATA)>'));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * creating an attribute string
     */
    $att = array(
        'foo'  => 'bar',
        'argh' => 'tomato'
    );

    print 'converting array to string:<br>';
    print XML_Util::attributesToString($att);
    print "\n<br><br>\n";


    /**
     * creating an attribute string with linebreaks
     */
    $att = array(
        'foo'  => 'bar',
        'argh' => 'tomato'
    );

    print 'converting array to string (including line breaks):<br>';
    print '<pre>';
    print XML_Util::attributesToString($att, true, true);
    print '</pre>';
    print "\n<br><br>\n";


    /**
     * splitting a qualified tag name
     */
    print 'splitting qualified tag name:<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('xslt:stylesheet'));
    print '</pre>';
    print "\n<br>\n";


    /**
     * splitting a qualified tag name (no namespace)
     */
    print 'splitting qualified tag name (no namespace):<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('foo'));
    print '</pre>';
    print "\n<br>\n";

    /**
     * splitting a qualified tag name (no namespace, but default namespace specified)
     */
    print 'splitting qualified tag name '
        . '(no namespace, but default namespace specified):<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('foo', 'bar'));
    print '</pre>';
    print "\n<br>\n";

    /**
     * verifying XML names
     */
    print 'verifying \'My private tag\':<br>';
    print '<pre>';
    print_r(XML_Util::isValidname('My Private Tag'));
    print '</pre>';
    print "\n<br><br>\n";
    
    print 'verifying \'-MyTag\':<br>';
    print '<pre>';
    print_r(XML_Util::isValidname('-MyTag'));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'namespace'  => 'foo',
        'localPart'  => 'bar',
        'attributes' => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'    => 'I\'m inside the tag'
    );

    print 'creating a tag with namespace and local part:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'qname'        => 'foo:bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'      => 'I\'m inside the tag'
    );

    print 'creating a tag with qualified name and namespaceUri:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'qname'        => 'bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable')
    );

    print 'creating an empty tag without namespace but namespace Uri:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with more namespaces
     */
    $tag = array(
        'namespace'   => 'foo',
        'localPart'   => 'bar',
        'attributes'  => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'     => 'I\'m inside the tag',
        'namespaces'  => array(
            'bar'  => 'http://bar.com',
            'pear' => 'http://pear.php.net',
        )
    );

    print 'creating an XML tag with more namespaces:<br />';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with a CData Section
     */
    $tag = array(
        'qname'      => 'foo',
        'attributes' => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'    => 'I\'m inside the tag'
    );

    print 'creating a tag with CData section:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag, XML_UTIL_CDATA_SECTION));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with a CData Section
     */
    $tag = array(
        'qname'      => 'foo',
        'attributes' => array('key' => 'value', 'argh' => 't�t�'),
        'content'    => 
            'Also XHTML-tags can be created '
            . 'and HTML entities can be replaced � � � � <>.'
    );

    print 'creating a tag with HTML entities:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag, XML_UTIL_ENTITIES_HTML));
    print "\n<br><br>\n";

    /**
    * creating an XML tag with createTag
    */
    print 'creating a tag with createTag:<br>';
    print htmlentities(XML_Util::createTag('myNs:myTag', 
        array('foo' => 'bar'), 
        'This is inside the tag', 
        'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";

    
    /**
     * trying to create an XML tag with an array as content
     */
    $tag = array(
        'qname'   => 'bar',
        'content' => array('foo' => 'bar')
    );
    print 'trying to create an XML tag with an array as content:<br>';
    print '<pre>';
    print_r(XML_Util::createTagFromArray($tag));
    print '</pre>';
    print "\n<br><br>\n";
    
    /**
     * trying to create an XML tag without a name
     */
    $tag = array(
        'attributes' => array('foo' => 'bar'),
    );
    print 'trying to create an XML tag without a name:<br>';
    print '<pre>';
    print_r(XML_Util::createTagFromArray($tag));
    print '</pre>';
    print "\n<br><br>\n";
?>
doc/pear/XML_Util/examples/example2.php000064400000011353151732707740013761 0ustar00<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Examples (file #2)
 *
 * several examples for the methods of XML_Util
 * 
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   XML
 * @package    XML_Util
 * @subpackage Examples
 * @author     Stephan Schmidt <schst@php.net>
 * @copyright  2003-2008 Stephan Schmidt <schst@php.net>
 * @license    http://opensource.org/licenses/bsd-license New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/XML_Util
 */

    /**
     * set error level
     */
    error_reporting(E_ALL);

    require_once 'XML/Util.php';

    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print htmlentities(XML_Util::createStartElement('myNs:myTag', 
        array('foo' => 'bar'), 'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";


    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print htmlentities(XML_Util::createStartElement('myTag', 
        array(), 'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";

    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print '<pre>';
    print htmlentities(XML_Util::createStartElement('myTag', 
        array('foo' => 'bar', 'argh' => 'tomato'), 
        'http://www.w3c.org/myNs#', true));
    print '</pre>';
    print "\n<br><br>\n";


    /**
     * creating an end element
     */
    print 'creating an end element:<br>';
    print htmlentities(XML_Util::createEndElement('myNs:myTag'));
    print "\n<br><br>\n";

    /**
     * creating a CData section
     */
    print 'creating a CData section:<br>';
    print htmlentities(XML_Util::createCDataSection('I am content.'));
    print "\n<br><br>\n";

    /**
     * creating a comment
     */
    print 'creating a comment:<br>';
    print htmlentities(XML_Util::createComment('I am a comment.'));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with multiline mode
     */
    $tag = array(
        'qname'        => 'foo:bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'      => 'I\'m inside the tag & contain dangerous chars'
    );

    print 'creating a tag with qualified name and namespaceUri:<br>';
    print '<pre>';
    print htmlentities(XML_Util::createTagFromArray($tag, 
        XML_UTIL_REPLACE_ENTITIES, true));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * create an attribute string without replacing the entities
     */
    $atts = array('series' => 'Starsky &amp; Hutch', 'channel' => 'ABC');
    print 'creating a attribute string, '
        . 'entities in values already had been replaced:<br>';
    print htmlentities(XML_Util::attributesToString($atts, 
        true, false, false, false, XML_UTIL_ENTITIES_NONE));
    print "\n<br><br>\n";

    /**
     * using the array-syntax for attributesToString()
     */
    $atts = array('series' => 'Starsky &amp; Hutch', 'channel' => 'ABC');
    print 'using the array-syntax for attributesToString()<br>';
    print htmlentities(XML_Util::attributesToString($atts, 
        array('entities' => XML_UTIL_ENTITIES_NONE)));
    print "\n<br><br>\n";


?>
doc/pear/Structures_LinkedList/LICENSE000064400000026136151732707750013600 0ustar00
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
doc/pear/Structures_LinkedList/CHANGELOG000064400000001737151732707750014005 0ustar000.2.1
* Apply patch from Bertrand Zuchuat to avoid inheritance strictness alerts

0.2.0
* Adhere to CS (thanks PHP_CodeSniffer!)
* Fix docblocks for Double vs. Single confusion
* One change to API in that the protected method _getTailNode() has been renamed to getTailNode() per CS

0.0.8
* Add destructors to avoid holding onto way too much memory

0.0.7
* Correct examples
* Convert to PEAR_Exception for error handling

0.0.6

0.0.5
* Create a singly linked list (Structures_LinkedList_Single)
* Refactor Structures_LinkedList_Double to extend _Single

0.0.4
* Move most globals into class constants

0.0.3
* Separate addNode method into insertNode, appendNode, prependNode
* Prevent current node from becoming invalid when adding a new node
* Type hinting and avoiding moving current pointer with addNode()

0.0.2
* Implement basic error-handling using PEAR_ErrorStack
* Adjust "link" terminology and API to "node"

0.0.1
* First attempt at a separate package for Structures_Linked_List
doc/pear/Structures_LinkedList/examples/double_link_example.php000064400000005574151732707750021127 0ustar00<?php

require 'Structures/LinkedList/Double.php';

/* To do anything useful with a linked list, you need to
 * extend the Node class to hold data associated with the
 * node. In this case, we're just going to hold a single
 * integer in the $_my_number property.
 */
class LinkNodeTester extends Structures_LinkedList_DoubleNode {
    protected $_my_number;
    protected $_my_letter;

    function __construct($number, $letter) {
        $this->_my_number = $number;
        $this->_my_letter = $letter;
    }

    function getNumber() {
        return $this->_my_number;
    }

    function getLetter() {
        return $this->_my_letter;
    }

    function setNumb($number) {
        $this->_my_number = $number;
    }

    function __toString() {
        return "{$this->getNumber()}";
    }
}

/* To enable key=>value iteration, we must override the default key()
 * method in Structures_LinkedList_Double to return a meaningful value */
class LinkListTester extends Structures_LinkedList_Double {
    function key() {
        return $this->current()->getLetter();
    }
}

/* Now we'll create some instances of the new class */
$node1 = new LinkNodeTester(1, 'a');
$node2 = new LinkNodeTester(2, 'b');
$node3 = new LinkNodeTester(3, 'c');
$node4 = new LinkNodeTester(4, 'd');
$node5 = new LinkNodeTester(5, 'e');

/* Start by instantiating a list object.
 * You can either pass the first node to the constructor,
 * or leave it null and add nodes later.
 */
$list = new LinkListTester($node1); // 1

/* appendNode() adds a node to the end of the list */
$list->appendNode($node2);                        // 1-2

/* prependNode() adds a node to the start of the list */
$list->prependNode($node3);                       // 3-1-2

/* insertNode($new_node, $reference_node, $before) adds a node
 * before the reference node if the third parameter is true,
 * or after the reference node if the third parameter is false
 */
$list->insertNode($node4, $node1);              // 3-1-4-2
$list->insertNode($node5, $node1, true);        // 3-5-1-4-2

/* current() returns the current pointer node in the list */
$link = $list->current();
print $link->getNumber(); // "1"

/* rewind() resets the pointer to the root node of the list */
$link = $list->rewind();
print $link->getNumber(); // "3"

// iterate through the list with do...while()
do {
    print $link->getNumber();
} while ($link = $list->next()); // "35142"

/* You can also iterate through a list with foreach() */
foreach ($list as $bull) {
  print $bull->getNumber();
} // 3-1-4-2

/* Override the key() method to enable $key=>$value iteration */
foreach ($list as $key=>$value) {
  print "$key => $value\n";
}

/* end() resets the pointer to the last node of the list */
$link = $list->end();
print $link->getNumber(); // "2"

/* You can iterate backwards through a list with previous() */
do {
    print $link->getNumber();
} while ($link = $list->previous()); // "24153"

?>
doc/pear/Structures_LinkedList/examples/single_link_example.php000064400000005270151732707750021127 0ustar00<?php

require 'Structures/LinkedList/Single.php';

/* To do anything useful with a linked list, you need to
 * extend the Node class to hold data associated with the
 * node. In this case, we're just going to hold a single
 * integer in the $_my_number property.
 */
class LinkNodeTester extends Structures_LinkedList_SingleNode {
    protected $_my_number;
    protected $_my_letter;

    function __construct($num, $letter) {
        $this->_my_number = $num;
        $this->_my_letter = $letter;
    }

    function getNumber() {
        return $this->_my_number;
    }

    function getLetter() {
        return $this->_my_letter;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }

    function __toString() {
        return "{$this->getNumber()}";
    }
}

/* To enable key=>value iteration, we must override the default key()
 * method in Structures_LinkedList_Single to return a meaningful value */
class LinkListTester extends Structures_LinkedList_Single {
    function key() {
        return $this->current()->getLetter();
    }
}

/* Now we'll create some instances of the new class */
$node1 = new LinkNodeTester(1, 'a');
$node2 = new LinkNodeTester(2, 'b');
$node3 = new LinkNodeTester(3, 'c');
$node4 = new LinkNodeTester(4, 'd');
$node5 = new LinkNodeTester(5, 'e');

/* Start by instantiating a list object.
 * You can either pass the first node to the constructor,
 * or leave it null and add nodes later.
 */
$list = new LinkListTester($node1); // 1

/* appendNode() adds a node to the end of the list */
$list->appendNode($node2); // 1-2

/* prependNode() adds a node to the start of the list */
$list->prependNode($node3); // 3-1-2

/* insertNode($new_node, $reference_node, $before) adds a node
 * before the reference node if the third parameter is true,
 * or after the reference node if the third parameter is false
 */
$list->insertNode($node4, $node2, true); // 3-1-4-2

/* current() returns the current pointer node in the list */
$link = $list->current(); // 1

/* You can iterate through a list with the next() method */
do {
    print $link->getNumber();
} while ($link = $list->next()); // 1-4-2

/* rewind() resets the pointer to the root node of the list */
$link = $list->rewind(); // 3

/* You can also iterate through a list with foreach() */
foreach ($list as $bull) {
  print $bull->getNumber();
} // 3-1-4-2

/* Override the key() method to enable $key=>$value iteration */
foreach ($list as $key=>$value) {
  print "$key => $value\n";
}

/* end() resets the pointer to the last node of the list */
$link = $list->end(); // 2

/* You can iterate backwards through a list with previous() */
do {
    print $link->getNumber();
} while ($link = $list->previous()); // 2-4-1-3
?>
doc/pear/Net_SMTP/LICENSE000064400000002450151732707750010655 0ustar00Copyright 2002-2017 Jon Parise and Chuck Hagenbuch.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution..

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/pear/Net_SMTP/examples/basic.php000064400000002030151732707750013252 0ustar00<?php

require 'Net/SMTP.php';

$host = 'mail.example.com';
$from = 'user@example.com';
$rcpt = array('recipient1@example.com', 'recipient2@example.com');
$subj = "Subject: Test Message\n";
$body = "Body Line 1\nBody Line 2";

/* Create a new Net_SMTP object. */
if (! ($smtp = new Net_SMTP($host))) {
    die("Unable to instantiate Net_SMTP object\n");
}

/* Connect to the SMTP server. */
if (PEAR::isError($e = $smtp->connect())) {
    die($e->getMessage() . "\n");
}
$smtp->auth('username','password');
/* Send the 'MAIL FROM:' SMTP command. */
if (PEAR::isError($smtp->mailFrom($from))) {
    die("Unable to set sender to <$from>\n");
}

/* Address the message to each of the recipients. */
foreach ($rcpt as $to) {
    if (PEAR::isError($res = $smtp->rcptTo($to))) {
        die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
    }
}

/* Set the body of the message. */
if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
    die("Unable to send data\n");
}

/* Disconnect from the SMTP server. */
$smtp->disconnect();
doc/pear/Net_SMTP/README.rst000064400000022652151732707750011345 0ustar00======================
 The Net_SMTP Package
======================

--------------------
 User Documentation
--------------------

:Author:    Jon Parise
:Contact:   jon@php.net

.. contents:: Table of Contents
.. section-numbering::

Dependencies
============

The ``PEAR_Error`` Class
------------------------

The Net_SMTP package uses the `PEAR_Error`_ class for all of its `error
handling`_.

The ``Net_Socket`` Package
--------------------------

The Net_Socket_ package is used as the basis for all network communications.
Connection options can be specified via the `$socket_options` construction
parameter::

    $socket_options = array('ssl' => array('verify_peer_name' => false));
    $smtp = new Net_SMTP($host, null, null, false, 0, $socket_options);

**Note:** PHP 5.6 introduced `OpenSSL changes`_. Peer certificate verification
is now enabled by default. Although not recommended, `$socket_options` can be
used to disable peer verification (as shown above).

.. _OpenSSL changes: https://php.net/manual/en/migration56.openssl.php

The ``Auth_SASL`` Package
-------------------------

The `Auth_SASL`_ package is an optional dependency.  If it is available, the
Net_SMTP package will be able to support the DIGEST-MD5_ and CRAM-MD5_ SMTP
authentication methods.  Otherwise, only the LOGIN_ and PLAIN_ methods will
be available.

Error Handling
==============

All of the Net_SMTP class's public methods return a PEAR_Error_ object if an
error occurs.  The standard way to check for a PEAR_Error object is by using
`PEAR::isError()`_::

    if (PEAR::isError($error = $smtp->connect())) {
        die($error->getMessage());
    }

.. _PEAR::isError(): https://pear.php.net/manual/en/core.pear.pear.iserror.php

SMTP Authentication
===================

The Net_SMTP package supports the SMTP authentication standard (as defined
by RFC-2554_).  The Net_SMTP package supports the following authentication
methods, in order of preference:

.. _RFC-2554: https://www.ietf.org/rfc/rfc2554.txt

GSSAPI
------

The GSSAPI authentication method uses Kerberos 5 protocol (RFC-4120_).
Does not use user/password.
Requires Service Principal ``gssapi_principal`` parameter and
has an optional Credentials Cache ``gssapi_cname`` parameter.
Requires DNS and Key Distribution Center (KDC) setup.
It is considered the most secure method of SMTP authentication.

**Note:** The GSSAPI authentication method is only supported
if the krb5_ php extension is available.

.. _RFC-4120: https://tools.ietf.org/html/rfc4120
.. _krb5: https://pecl.php.net/package/krb5

DIGEST-MD5
----------

The DIGEST-MD5 authentication method uses `RSA Data Security Inc.`_'s MD5
Message Digest algorithm.  It is considered a more secure method of SMTP
authentication than PLAIN or LOGIN, while still vulnerable to MitM attacks
without TLS/SSL.

**Note:** The DIGEST-MD5 authentication method is only supported if the
AUTH_SASL_ package is available.

.. _RSA Data Security Inc.: https://www.rsasecurity.com/

CRAM-MD5
--------

The CRAM-MD5 authentication method has been superseded by the DIGEST-MD5_
method in terms of security.  It is provided here for compatibility with
older SMTP servers that may not support the newer DIGEST-MD5 algorithm.

**Note:** The CRAM-MD5 authentication method is only supported if the
AUTH_SASL_ package is available.

LOGIN
-----

The LOGIN authentication method encrypts the user's password using the
Base64_ encoding scheme.  Because decrypting a Base64-encoded string is
trivial, LOGIN is not considered a secure authentication method and should
be avoided.

.. _Base64: https://www.php.net/manual/en/function.base64-encode.php

PLAIN
-----

The PLAIN authentication method sends the user's password in plain text.
This method of authentication is not secure and should be avoided.

XOAUTH2
-------

The XOAUTH2 authentication method sends a username and an OAuth2 access token
as per `Gmail's SASL XOAUTH2 documentation`__.

.. __: https://developers.google.com/gmail/imap/xoauth2-protocol#smtp_protocol_exchange

Secure Connections
==================

If `secure socket transports`_ have been enabled in PHP, it is possible to
establish a secure connection to the remote SMTP server::

    $smtp = new Net_SMTP('ssl://mail.example.com', 465);

This example connects to ``mail.example.com`` on port 465 (a common SMTPS
port) using the ``ssl://`` transport.

TLS/SSL is enabled for authenticated connections by default (via the ``auth()``
method's ``$tls`` parameter), but the |STARTTLS|_ command can also be sent
manually using the ``starttls()`` method.

.. _secure socket transports: https://www.php.net/transports
.. |STARTTLS| replace:: ``STARTTLS``
.. _STARTTLS: https://tools.ietf.org/html/rfc3207

Sending Data
============

Message data is sent using the ``data()`` method.  The data can be supplied
as a single string or as an open file resource.

If a string is provided, it is passed through the `data quoting`_ system and
sent to the socket connection as a single block.  These operations are all
memory-based, so sending large messages may result in high memory usage.

If an open file resource is provided, the ``data()`` method will read the
message data from the file line-by-line.  Each chunk will be quoted and sent
to the socket connection individually, reducing the overall memory overhead of
this data sending operation.

Header data can be specified separately from message body data by passing it
as the optional second parameter to ``data()``.  This is especially useful
when an open file resource is being used to supply message data because it
allows header fields (like *Subject:*) to be built dynamically at runtime.

::

    $smtp->data($fp, "Subject: My Subject");

Data Quoting
============

By default, all outbound string data is quoted in accordance with SMTP
standards.  This means that all native Unix (``\n``) and Mac (``\r``) line
endings are converted to Internet-standard CRLF (``\r\n``) line endings.
Also, because the SMTP protocol uses a single leading period (``.``) to signal
an end to the message data, single leading periods in the original data
string are "doubled" (e.g. "``..``").

These string transformation can be expensive when large blocks of data are
involved.  For example, the Net_SMTP package is not aware of MIME parts (it
just sees the MIME message as one big string of characters), so it is not
able to skip non-text attachments when searching for characters that may
need to be quoted.

Because of this, it is possible to extend the Net_SMTP class in order to
implement your own custom quoting routine.  Just create a new class based on
the Net_SMTP class and reimplement the ``quotedata()`` method::

    require 'Net_SMTP.php';

    class Net_SMTP_custom extends Net_SMTP
    {
        function quotedata($data)
        {
            /* Perform custom data quoting */
        }
    }

Note that the ``$data`` parameter will be passed to the ``quotedata()``
function `by reference`_.  This means that you can operate directly on
``$data``.  It also the overhead of copying a large ``$data`` string to and
from the ``quotedata()`` method.

.. _by reference: https://www.php.net/manual/en/language.references.pass.php

Server Responses
================

The Net_SMTP package retains the server's last response for further
inspection.  The ``getResponse()`` method returns a 2-tuple (two element
array) containing the server's response code as an integer and the response's
arguments as a string.

Upon a successful connection, the server's greeting string is available via
the ``getGreeting()`` method.

Debugging
=========

The Net_SMTP package contains built-in debugging output routines (disabled by
default).  Debugging output must be explicitly enabled via the ``setDebug()``
method::

    $smtp->setDebug(true);

The debugging messages will be sent to the standard output stream by default.
If you need more control over the output, you can optionally install your own
debug handler.

::

    function debugHandler($smtp, $message)
    {
        echo "[$smtp->host] $message\n";
    }

    $smtp->setDebug(true, "debugHandler");


Examples
========

Basic Use
---------

The following script demonstrates how a simple email message can be sent
using the Net_SMTP package::

    require 'Net/SMTP.php';

    $host = 'mail.example.com';
    $from = 'user@example.com';
    $rcpt = array('recipient1@example.com', 'recipient2@example.com');
    $subj = "Subject: Test Message\n";
    $body = "Body Line 1\nBody Line 2";

    /* Create a new Net_SMTP object. */
    if (! ($smtp = new Net_SMTP($host))) {
        die("Unable to instantiate Net_SMTP object\n");
    }

    /* Connect to the SMTP server. */
    if (PEAR::isError($e = $smtp->connect())) {
        die($e->getMessage() . "\n");
    }

    /* Send the 'MAIL FROM:' SMTP command. */
    if (PEAR::isError($smtp->mailFrom($from))) {
        die("Unable to set sender to <$from>\n");
    }

    /* Address the message to each of the recipients. */
    foreach ($rcpt as $to) {
        if (PEAR::isError($res = $smtp->rcptTo($to))) {
            die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
        }
    }

    /* Set the body of the message. */
    if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
        die("Unable to send data\n");
    }

    /* Disconnect from the SMTP server. */
    $smtp->disconnect();

.. _PEAR_Error: https://pear.php.net/manual/en/core.pear.pear-error.php
.. _Net_Socket: https://pear.php.net/package/Net_Socket
.. _Auth_SASL: https://pear.php.net/package/Auth_SASL

.. vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=78 ft=rst:
doc/pear/PEAR/LICENSE000064400000002705151732707750010016 0ustar00Copyright (c) 1997-2009,
 Stig Bakken <ssb@php.net>,
 Gregory Beaver <cellog@php.net>,
 Helgi Þormar Þorbjörnsson <helgi@php.net>,
 Tomas V.V.Cox <cox@idecnet.com>,
 Martin Jansen <mj@php.net>.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/pear/PEAR/README.rst000064400000004342151732707750010477 0ustar00*************************
PEAR - The PEAR Installer
*************************
.. image:: https://travis-ci.org/pear/pear-core.svg?branch=stable
    :target: https://travis-ci.org/pear/pear-core

=========================================
What is the PEAR Installer? What is PEAR?
=========================================
PEAR is the PHP Extension and Application Repository, found at
http://pear.php.net.

The **PEAR Installer** is this software, which contains executable
files and PHP code that is used to **download and install** PEAR code
from pear.php.net.

PEAR contains useful **software libraries and applications** such as
MDB2 (database abstraction), HTML_QuickForm (HTML forms management),
PhpDocumentor (auto-documentation generator), DB_DataObject
(Data Access Abstraction), and many hundreds more.
Browse all available packages at http://pear.php.net, the list is
constantly growing and updating to reflect improvements in the PHP language.

.. warning::
  Do not run PEAR without installing it - if you downloaded this
  tarball manually, you MUST install it.  Read the instructions in INSTALL
  prior to use.


=============
Documentation
=============
Documentation for PEAR can be found at http://pear.php.net/manual/.
Installation documentation can be found in the INSTALL file included
in this tarball.


=====
Tests
=====
Run the tests without installation as follows::

  $ ./scripts/pear.sh run-tests -r tests

You should have the ``Text_Diff`` package installed to get nicer error output.

To run the tests with another PHP version, modify ``php_bin`` and set the
``PHP_PEAR_PHP_BIN`` environment variable::

  $ pear config-set php_bin /usr/local/bin/php7
  $ PHP_PEAR_PHP_BIN=/usr/local/bin/php7 ./scripts/pear.sh run-tests -r tests

Happy PHPing, we hope PEAR will be a great tool for your development work!


Test dependencies
=================
* ``zlib``


=========
Releasing
=========
Create a PEAR package, as well as phars for pear-less installation,
simply run ``build-release.sh``).

``go-pear.phar`` contains the PEAR installer installer that asks where to install it.
It is available from http://pear.php.net/go-pear.phar.

``install-pear-nozlib.phar`` installs PEAR automatically without asking anything.
It is shipped with PHP itself.
doc/pear/PEAR/INSTALL000064400000004170151732707750010040 0ustar00PEAR - The PEAR Installer
=========================
Installing the PEAR Installer.

You should install PEAR on a local development machine first.  Installing
PEAR on a remote production machine should only be done after you are
familiar with PEAR and have tested code using PEAR on your development
machine.

There are two methods of installing PEAR
 - PEAR bundled in PHP
 - go-pear

We will first examine how to install PEAR that is bundled with PHP.

Microsoft Windows
=================
If you are running PHP 5.2.0 or newer, simply download and
run the windows installer (.msi) and PEAR can be automatically
installed.

Otherwise, for older PHP versions, download the .zip of windows,
there is a script included with your PHP distribution that is called
"go-pear".  You must open a command box in order to run it.  Click
"start" then click "Run..." and type "cmd.exe" to open a command box.
Use "cd" to change directory to the location of PHP where you unzipped it,
and run the go-pear command.

Unix
====
When compiling PHP from source, you simply need to include the
--with-pear directive on the "./configure" command.  This is "on"
by default in most PHP versions, but it doesn't hurt to list it
explicitly.  You should also consider enabling the zlib extension via
--enable-zlib, so that the PEAR installer will be able to handle gzipped
files (i.e. smaller package files for faster downloads).  Later, when you
run "make install" to install PHP itself, part of the process will be
prompts that ask you where you want PEAR to be installed.

go-pear
=======
For users who cannot perform the above steps, or who wish to obtain the
latest PEAR with a slightly higher risk of failure, use go-pear.  go-pear
is obtained by downloading http://pear.php.net/go-pear and saving it as go-pear.php.
After downloading, simply run "php go-pear.php" or open it in a web browser
(windows only) to download and install PEAR.

You can always ask general installation questions on pear-general@lists.php.net,
a public mailing list devoted to support for PEAR packages and installation-
related issues.

Happy PHPing, we hope PEAR will be a great tool for your development work!
doc/pear/Structures_Graph/LICENSE000064400000016725151732707750012602 0ustar00		   GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.

  Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
doc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkg000064400000007714151732707750024064 0ustar00<refentry id="{@id package.database.structures_graph.tutorial}">
 <refnamediv>
  <refname><classname>Structures_Graph</classname> Tutorial</refname>
  <refpurpose>A first tour of graph datastructure manipulation</refpurpose>
 </refnamediv>
 <refsect1 id="{@id package.database.structures_graph.tutorial.intro}">
  <title>Introduction</title>
  <para>
  Structures_Graph is a package for creating and manipulating graph datastructures. A graph is a set of objects, called nodes, connected by arcs. When used as a datastructure, usually nodes contain data, and arcs represent relationships between nodes. When arcs have a direction, and can be travelled only one way, graphs are said to be directed. When arcs have no direction, and can always be travelled both ways, graphs are said to be non directed.
  </para>
  <para>
  Structures_Graph provides an object oriented API to create and directly query a graph, as well as a set of Manipulator classes to extract information from the graph.
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.creation}">
  <title>Creating a Graph</title>
  <para>
   Creating a graph is done using the simple constructor:
   <programlisting>
    <![CDATA[
require_once 'Structures/Graph.php';

$directedGraph =& new Structures_Graph(true);
$nonDirectedGraph =& new Structures_Graph(false);
    ]]>
   </programlisting>
   and passing the constructor a flag telling it whether the graph should be directed. A directed graph will always be directed during its lifetime. It's a permanent characteristic.
  </para>
  <para>
  To fill out the graph, we'll need to create some nodes, and then call Graph::addNode.
   <programlisting>
    <![CDATA[
require_once 'Structures/Graph/Node.php';

$nodeOne =& new Structures_Graph_Node();
$nodeTwo =& new Structures_Graph_Node();
$nodeThree =& new Structures_Graph_Node();

$directedGraph->addNode(&$nodeOne);
$directedGraph->addNode(&$nodeTwo);
$directedGraph->addNode(&$nodeThree);
    ]]>
   </programlisting>
   and then setup the arcs:
   <programlisting>
    <![CDATA[
$nodeOne->connectTo($nodeTwo);
$nodeOne->connectTo($nodeThree);
    ]]>
   </programlisting>
   Note that arcs can only be created after the nodes have been inserted into the graph. 
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.nodesanddata}">
  <title>Associating Data</title>
  <para>
  Graphs are only useful as datastructures if they can hold data. Structure_Graph stores data in nodes. Each node contains a setter and a getter for its data.
   <programlisting>
    <![CDATA[
$nodeOne->setData("Node One's Data is a String");
$nodeTwo->setData(1976);
$nodeThree->setData('Some other string');

print("NodeTwo's Data is an integer: " . $nodeTwo->getData());
    ]]>
   </programlisting>
  </para>
  <para>
  Structure_Graph nodes can also store metadata, alongside with the main data. Metadata differs from regular data just because it is stored under a key, making it possible to store more than one data reference per node. The metadata getter and setter need the key to perform the operation:
   <programlisting>
    <![CDATA[
$nodeOne->setMetadata('example key', "Node One's Sample Metadata");
print("Metadata stored under key 'example key' in node one: " . $nodeOne->getMetadata('example key'));
$nodeOne->unsetMetadata('example key');
    ]]>
   </programlisting>
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.querying}">
  <title>Querying a Graph</title>
  <para>
  Structures_Graph provides for basic querying of the graph:
   <programlisting>
    <![CDATA[
// Nodes are able to calculate their indegree and outdegree
print("NodeOne's inDegree: " . $nodeOne->inDegree());
print("NodeOne's outDegree: " . $nodeOne->outDegree());

// and naturally, nodes can report on their arcs
$arcs = $nodeOne->getNeighbours();
for ($i=0;$i<sizeof($arcs);$i++) {
    print("NodeOne has an arc to " . $arcs[$i]->getData());
}
    ]]>
   </programlisting>
  </para>
 </refsect1>
</refentry>
doc/pear/Archive_Tar/docs/Archive_Tar.txt000064400000045246151732707750014340 0ustar00Documentation for class Archive_Tar
===================================
Last update : 2001-08-15



Overview :
----------

  The Archive_Tar class helps in creating and managing GNU TAR format
  files compressed by GNU ZIP or not. 
  The class offers basic functions like creating an archive, adding
  files in the archive, extracting files from the archive and listing
  the archive content. 
  It also provide advanced functions that allow the adding and
  extraction of files with path manipulation. 


Sample :
--------

  // ----- Creating the object (uncompressed archive)
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);

  // ----- Creating the archive
  $v_list[0]="file.txt";
  $v_list[1]="data/";
  $v_list[2]="file.log";
  $tar_object->create($v_list);

  // ----- Adding files
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/";
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);

  // ----- Adding more files
  $tar_object->add("release/newfile.log release/readme.txt");

  // ----- Listing the content
  if (($v_list  =  $tar_object->listContent()) != 0)
    for ($i=0; $i<sizeof($v_list); $i++)
    {
      echo "Filename :'".$v_list[$i][filename]."'<br>";
      echo " .size :'".$v_list[$i][size]."'<br>";
      echo " .mtime :'".$v_list[$i][mtime]."' (".date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")<br>";
      echo " .mode :'".$v_list[$i][mode]."'<br>";
      echo " .uid :'".$v_list[$i][uid]."'<br>";
      echo " .gid :'".$v_list[$i][gid]."'<br>";
      echo " .typeflag :'".$v_list[$i][typeflag]."'<br>";
    }

  // ----- Extracting the archive in directory "install"
  $tar_object->extract("install");


Public arguments :
------------------

None


Public Methods :
----------------

Method : Archive_Tar($p_tarname, $compress = null)
Description :
  Archive_Tar Class constructor. This flavour of the constructor only
  declare a new Archive_Tar object, identifying it by the name of the
  tar file.
  If the compress argument is set the tar will be read or created as a
  gzip or bz2 compressed TAR file. 
Arguments :
  $p_tarname : A valid filename for the tar archive file.
  $p_compress : can be null, 'gz' or 'bz2'. For
                compatibility reason it can also be true. This
                parameter indicates if gzip or bz2 compression
                is required. 
Return value :
  The Archive_Tar object.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object_compressed = new Archive_Tar("tarname.tgz", true);
How it works :
  Initialize the object.

Method : create($p_filelist)
Description :
  This method creates the archive file and add the files / directories
  that are listed in $p_filelist. 
  If the file already exists and is writable, it is replaced by the
  new tar. It is a create and not an add. If the file exists and is
  read-only or is a directory it is not replaced. The method return
  false and a PEAR error text. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  See also createModify() method for more details.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
  string with names separated by a single blank space. 
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="file.txt";
  $v_list[1]="data/"; (Optional '/' at the end)
  $v_list[2]="file.log";
  $tar_object->create($v_list);
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $tar_object->create("file.txt data/ file.log");
How it works :
  Just calling the createModify() method with the right parameters.

Method : createModify($p_filelist, $p_add_dir, $p_remove_dir = "")
Description :
  This method creates the archive file and add the files / directories
  that are listed in $p_filelist. 
  If the file already exists and is writable, it is replaced by the
  new tar. It is a create and not an add. If the file exists and is
  read-only or is a directory it is not replaced. The method return
  false and a PEAR error text. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  The path indicated in $p_remove_dir will be removed from the
  memorized path of each file / directory listed when this path
  exists. By default nothing is removed (empty path "") 
  The path indicated in $p_add_dir will be added at the beginning of
  the memorized path of each file / directory listed. However it can
  be set to empty "". The adding of a path is done after the removing
  of path. 
  The path add/remove ability enables the user to prepare an archive
  for extraction in a different path than the origin files are. 
  See also addModify() method for file adding properties.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space.
  $p_add_dir : A string which contains a path to be added to the
               memorized path of each element in the list. 
  $p_remove_dir : A string which contains a path to be removed from
                  the memorized path of each element in the list, when
		  relevant.
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="file.txt";
  $v_list[1]="data/"; (Optional '/' at the end)
  $v_list[2]="file.log";
  $tar_object->createModify($v_list, "install");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/file.log
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->createModify($v_list, "install", "dev");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/log/file.log
How it works :
  Open the file in write mode (erasing the existing one if one),
  call the _addList() method for adding the files in an empty archive,
  add the tar footer (512 bytes block), close the tar file.


Method : addModify($p_filelist, $p_add_dir, $p_remove_dir="")
Description :
  This method add the files / directories listed in $p_filelist at the
  end of the existing archive. If the archive does not yet exists it
  is created.
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  The path indicated in $p_remove_dir will be removed from the
  memorized path of each file / directory listed when this path
  exists. By default nothing is removed (empty path "") 
  The path indicated in $p_add_dir will be added at the beginning of
  the memorized path of each file / directory listed. However it can
  be set to empty "". The adding of a path is done after the removing
  of path. 
  The path add/remove ability enables the user to prepare an archive
  for extraction in a different path than the origin files are. 
  If a file/dir is already in the archive it will only be added at the
  end of the archive. There is no update of the existing archived
  file/dir. However while extracting the archive, the last file will
  replace the first one. This results in a none optimization of the
  archive size. 
  If a file/dir does not exist the file/dir is ignored. However an
  error text is send to PEAR error. 
  If a file/dir is not readable the file/dir is ignored. However an
  error text is send to PEAR error. 
  If the resulting filename/dirname (after the add/remove option or
  not) string is greater than 99 char, the file/dir is
  ignored. However an error text is send to PEAR error. 
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space. 
  $p_add_dir : A string which contains a path to be added to the
               memorized path of each element in the list. 
  $p_remove_dir : A string which contains a path to be removed from
                  the memorized path of each element in the list, when
		  relevant.
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->addModify($v_list, "install");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/file.log
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->addModify($v_list, "install", "dev");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/log/file.log
How it works :
  If the archive does not exists it create it and add the files.
  If the archive does exists and is not compressed, it open it, jump
  before the last empty 512 bytes block (tar footer) and add the files
  at this point.
  If the archive does exists and is compressed, a temporary copy file
  is created. This temporary file is then 'gzip' read block by block
  until the last empty block. The new files are then added in the
  compressed file.
  The adding of files is done by going through the file/dir list,
  adding files per files, in a recursive way through the
  directory. Each time a path need to be added/removed it is done
  before writing the file header in the archive.

Method : add($p_filelist)
Description :
  This method add the files / directories listed in $p_filelist at the
  end of the existing archive. If the archive does not yet exists it
  is created. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  See addModify() method for details and limitations.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
  string with names separated by a single blank space. 
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tgz", true);
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);
How it works :
  Simply call the addModify() method with the right parameters.

Method : addString($p_filename, $p_string, $p_datetime, $p_params)
Description :
  This method add a single string as a file at the
  end of the existing archive. If the archive does not yet exists it
  is created.
Arguments :
  $p_filename : A string which contains the full filename path
                that will be associated with the string.
  $p_string :   The content of the file added in the archive.
  $p_datetime : (Optional) Timestamp of the file (default = now)
  $p_params :   (Optional) Various file metadata:
                    stamp - As above, timestamp of the file
                    mode - UNIX-style permissions (default 0600)
                    type - Is this a regular file or link (see TAR
                           format spec for how to create a hard/symlink)
                    uid - UNIX-style user ID (default 0 = root)
                    gid - UNIX-style group ID (default 0 = root)
Return value :
  true on success, false on error.
Sample 1 :
  $v_archive = & new Archive_Tar($p_filename);
  $v_archive->setErrorHandling(PEAR_ERROR_PRINT);
  $v_result = $v_archive->addString('data/test.txt', 'This is the text of the string');
  $v_result = $v_archive->addString(
                  'data/test.sh',
                  "#!/bin/sh\necho 'Hello'",
                  time(),
                  array( "mode" => 0755, "uid" => 34 )
              );


Method : extract($p_path = "")
Description :
  This method extract all the content of the archive in the directory
  indicated by $p_path.If $p_path is optional, if not set the archive
  is extracted in the current directory. 
  While extracting a file, if the directory path does not exists it is
  created. 
  See extractModify() for details and limitations.
Arguments :
  $p_path : Optional path where the files/dir need to by extracted.
Return value :
  true on success, false on error.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extract();
How it works :
  Simply call the extractModify() method with appropriate parameters.

Method : extractModify($p_path, $p_remove_path)
Description :
  This method extract all the content of the archive in the directory
  indicated by $p_path. When relevant the memorized path of the
  files/dir can be modified by removing the $p_remove_path path at the
  beginning of the file/dir path. 
  While extracting a file, if the directory path does not exists it is
  created. 
  While extracting a file, if the file already exists it is replaced
  without looking for last modification date. 
  While extracting a file, if the file already exists and is write
  protected, the extraction is aborted. 
  While extracting a file, if a directory with the same name already
  exists, the extraction is aborted. 
  While extracting a directory, if a file with the same name already
  exists, the extraction is aborted. 
  While extracting a file/directory if the destination directory exist
  and is write protected, or does not exist but can not be created,
  the extraction is aborted. 
  If after extraction an extracted file does not show the correct
  stored file size, the extraction is aborted. 
  When the extraction is aborted, a PEAR error text is set and false
  is returned. However the result can be a partial extraction that may
  need to be manually cleaned. 
Arguments :
  $p_path : The path of the directory where the files/dir need to by
            extracted. 
  $p_remove_path : Part of the memorized path that can be removed if
                   present at the beginning of the file/dir path. 
Return value :
  true on success, false on error.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   readme.txt
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extractModify("install", "dev");
  // Files will be extracted there :
  //   install/data/file.txt
  //   install/data/log.txt
  //   install/readme.txt
How it works :
  Open the archive and call a more generic function that can extract
  only a part of the archive or all the archive. 
  See extractList() method for more details.

Method : extractInString($p_filename)
Description :
  This method extract from the archive one file identified by $p_filename.
  The return value is a string with the file content, or NULL on error. 
Arguments :
  $p_filename : The path of the file to extract in a string. 
Return value :
  a string with the file content or NULL.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   dev/readme.txt
  $v_archive = & new Archive_Tar('tarname.tar');
  $v_archive->setErrorHandling(PEAR_ERROR_PRINT);
  $v_string = $v_archive->extractInString('dev/readme.txt');
  echo $v_string;

Method : listContent()
Description :
  This method returns an array of arrays that describe each
  file/directory present in the archive. 
  The array is not sorted, so it show the position of the file in the
  archive. 
  The file informations are :
    $file[filename] : Name and path of the file/dir.
    $file[mode] : File permissions (result of fileperms())
    $file[uid] : user id
    $file[gid] : group id
    $file[size] : filesize
    $file[mtime] : Last modification time (result of filemtime())
    $file[typeflag] : "" for file, "5" for directory
Arguments :
Return value :
  An array of arrays or 0 on error.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  if (($v_list  =  $tar_object->listContent()) != 0)
    for ($i=0; $i<sizeof($v_list); $i++)
    {
      echo "Filename :'".$v_list[$i][filename]."'<br>";
      echo " .size :'".$v_list[$i][size]."'<br>";
      echo " .mtime :'".$v_list[$i][mtime]."' (".
           date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")<br>";
      echo " .mode :'".$v_list[$i][mode]."'<br>";
      echo " .uid :'".$v_list[$i][uid]."'<br>";
      echo " .gid :'".$v_list[$i][gid]."'<br>";
      echo " .typeflag :'".$v_list[$i][typeflag]."'<br>";
    }
How it works :
  Call the same function as an extract however with a flag to only go
  through the archive without extracting the files. 

Method : extractList($p_filelist, $p_path = "", $p_remove_path = "")
Description :
  This method extract from the archive only the files indicated in the
  $p_filelist. These files are extracted in the current directory or
  in the directory indicated by the optional $p_path parameter. 
  If indicated the $p_remove_path can be used in the same way as it is
  used in extractModify() method. 
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space. 
  $p_path : The path of the directory where the files/dir need to by
            extracted. 
  $p_remove_path : Part of the memorized path that can be removed if
                   present at the beginning of the file/dir path. 
Return value :
  true on success, false on error.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   readme.txt
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extractList("dev/data/file.txt readme.txt", "install",
                           "dev");
  // Files will be extracted there :
  //   install/data/file.txt
  //   install/readme.txt
How it works :
  Go through the archive and extract only the files present in the
  list. 

licenses/alt-php73-snuffleupagus/LICENSE000064400000016743151732707750014013 0ustar00                   GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.

  Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
licenses/alt-php73-vld/LICENSE000064400000002433151732707750011700 0ustar00Copyright (c) 2002-2019, Derick Rethans

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

 - Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
 - Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
fpm/status.html000064400000046444151732707750007571 0ustar00<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
	(c) 2011 Jerome Loyet
	The PHP License, version 3.01
	This is sample real-time status page for FPM. You can change it to better fit your needs.
-->
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
		<style type="text/css">
			body {background-color: #ffffff; color: #000000;}
			body, td, th, h1, h2 {font-family: sans-serif;}
			pre {margin: 0px; font-family: monospace;}
			a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
			a:hover {text-decoration: underline;}
			table {border-collapse: collapse;}
			.center {text-align: center;}
			.center table { margin-left: auto; margin-right: auto; text-align: left;}
			.center th { text-align: center !important; }
			td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}
			h1 {font-size: 150%;}
			h2 {font-size: 125%;}
			.p {text-align: left;}
			.e {background-color: #ccccff; font-weight: bold; color: #000000;}
			.h {background-color: #9999cc; font-weight: bold; color: #000000;}

			.v {background-color: #cccccc; color: #000000;}
			.w {background-color: #ccccff; color: #000000;}

			.h th {
				cursor: pointer;
			}
			img {float: right; border: 0px;}
			hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
		</style>
	<title>PHP-FPM status page</title>
	<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head>
	<body>
		<div class="center">
			<table border="0" cellpadding="3" width="95%">
				<tr class="h">
					<td>
						<a href="http://www.php.net/"><img border="0" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAABACAYAAAA+j9gsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAD4BJREFUeNrsnXtwXFUdx8/dBGihmE21QCrQDY6oZZykon/gY5qizjgM2KQMfzFAOioOA5KEh+j4R9oZH7zT6MAMKrNphZFSQreKHRgZmspLHSCJ2Co6tBtJk7Zps7tJs5t95F5/33PvWU4293F29ybdlPzaM3df2XPv+Zzf4/zOuWc1tkjl+T0HQ3SQC6SBSlD6WKN4rusGm9F1ps/o5mPriOf8dd0YoNfi0nt4ntB1PT4zYwzQkf3kR9/sW4xtpS0CmE0SyPUFUJXFMIxZcM0jAZ4xrKMudQT7963HBF0n6EaUjkP0vI9K9OEHWqJLkNW1s8mC2WgVTwGAqWTafJzTWTKZmQuZ/k1MpAi2+eys6mpWfVaAPzcILu8EVKoCAaYFtPxrAXo8qyNwzZc7gSgzgN9Hx0Ecn3j8xr4lyHOhNrlpaJIgptM5DjCdzrJ0Jmce6bWFkOpqs0MErA4gXIBuAmY53gFmOPCcdaTXCbq+n16PPLXjewMfGcgEttECeouTpk5MplhyKsPBTiXNYyULtwIW7Cx1vlwuJyDLR9L0mQiVPb27fhA54yBbGttMpc1OWwF1cmKaH2FSF7vAjGezOZZJZ9j0dIZlMhnuRiToMO0c+N4X7oksasgEt9XS2KZCHzoem2Ixq5zpAuDTqTR14FMslZyepeEI4Ogj26n0vLj33uiigExgMWRpt+CGCsEePZqoePM738BPTaJzT7CpU0nu1yXpAXCC3VeRkCW4bfJYFZo6dmJyQTW2tvZc1nb719iyZWc5fmZ6Osu6H3uVzit52oBnMll2YizGxk8muFZLAshb/YKtzQdcaO3Y2CQ7eiy+YNGvLN+4+nJetm3bxhKJxJz316xZw1pbW9kLew+w1944XBEaPj6eYCeOx1gqNe07bK1MwIDbKcOFOR49GuePT5fcfOMX2drPXcQ0zf7y2tvbWVdXF/v1k2+yQ4dPVpQ5P0Um/NjoCX6UBMFZR6k+u7qMYVBYDIEqBW7eXAfPZX19zp2/oaGBHysNMGTFinPZik9fWggbI5Omb13zUDeB3lLsdwaK/YPeyAFU0i8Aw9/2Dwyx4SPjFQEYUlf3MTYw4Jx7CIVCbHR0oqIDNMD+FMG+ZE0dO/tsHlvAWnYS6H4qjfMC+Zld/wg92/tuv2WeeYT87j+H2aFDxysGLuSy+o/z49DQkONnmpqa2MjRyoYsZOXKGnb5Z+vZqlUrxUsAvI9At/oK+elnBpoNw+Dai9TekSMxDrgSh0KrSYshTprc2NhoRf1JtlikqirAVl98AddsSavDBDrsC+QdT7/TSoB344tzOZ39+70RbporVerqasyw1MEnC8iV6I9VTDi0uqbmfPFSq2W+gyUHXuEdb3WR5rab5jnD3i/BNMN8ChNaqsTiKa55KmBWX+Tuj0XQdQVF307nhTH0CPls+O0UPbaT5TQG/8qX68u6LpV67LQ6dNknaYgaYyPDx2TzvYGCsnhRkH8b/rsF2GDj1MCInkvxvRjOuCUlipWD/zrKx7ZOwBF0vfSSM2ShyaqAAOC1Nw+zt9/5YNbrN1zfwIdpfgnqebv/A6pnWAn4qlW1HPgHQ6OeoG3N9RO/+StMdDtmV2LxJPfBpQCGfwTgrVu38jFrKaW2tpZt2LCBdXR0sEgkwhv21u9cxQsyW3ZB1+DgoOM54btU6tu8eTPr6elhy5fr7IZNDey+e76e9/fCLcAllHpdKKinpaUlX8+111xB9VzNrYxqUAY/XVVVJYMOekLu2fFGM8VWYQRYiYkU9bD4vPlHFYnH4/zvkb1CgwACHgMoUpdyw3sFXcXUh4YHaNSHDqaxdL5jwVTXBpeXVY9oF3RcUQ+O09NT7Cayfld+4RJlP42gTIq8w66Qf/X4a6FTSSMMDcaE/NhYecMM+MdyG90OAhodWoAGkTUaSZByO5WdiA4GqwStrrM6k5vFKEXQserr63l7oR5V0NBojKctaSZtbneErOtGmFxwkGewjk0UzpCUlJSIRqMcjN8CkHLDqyRByq0PEGBBhDmdj7rQVujAaLfrrlk7xyW5gUaxpEtOmOQDr0e799NYmDVBi0+OT7FcbsaXxEQk8qprEBQMBm0vVKUBRcNjskFE8W71lSt79uzhda1d6w4ZGTUUp3NWAQ3TvW/fPvbVq+rZH/ceULOcF1/I06CY3QJohCCzNJnYdgEwwvpUKuNbUsLNpO3evZtfSGHp7+/nS2pw3LLFPVWLoA5yHQUtXvXFYjH+vU4F5yOibzsRUL38MTqC3XWh8GCWziMcDjt2BNEZUIfoUOpJkwvziT3S5ua8Jj/4yD5E0yERbPkhKv4RF4mhkN1wCMHN2rWfYZ2dnWz9+vXchNkJzBoaQ8Bxqg91wWo41YdO2dzczD+3bt06Rw0rBG4nOF8oi9M0Jsw9OgLqQ124BifLgeuHyVbN0NXUrODBmDWxgRR0pNrUYqMNgDOZGZbNzvgCuc4j0kX+GPJ2//CcMagQmKkbrm/knwVEp++SIXulM1+nhj9AY207QRDnpsnye24WA59DkuPlV/5j+z5eB2hE0W1tbTyQdNJmDpksRzFp2E9csFJAboRvDvz8gZdJgw2ek55KZphfAv+Inu8UdKnmkEUHQK93EjEZ4Rbkifq8JiactEpYAy9Nli2Gm6CjIZPn1qlKFWizleOG3BIwdKNZ+KRMxr9VHKvr1NKLXo2BhlAVFRPq1qlWW6MBr3NWyY2rTGXO5ySJlN9uDuiGsV7XTVPtl8CHYGizf/9+V5Om0hAwVV4ahuU8qia03HP26kyqFkMOTudDzjs/P/QKBUiBYa5ZNucfZJUkCG/0IhpCxYyqBF3lnLOII8q1GKqdStQ3rTh5MStwXX5O/nE1metGQzPHUH6JatA1OppQ8u1eUbpX44tO4GY5vM5Z9sduFgOfG1GwUOK6VFzaSAmrWCSfzGCuuT/O+bi6QwRdTtqXN2keJ4/ejgkJ5HedRARkbkGe6ARulgMWQ+Wc3cDAWohhoZdcue7ifJ7crfP6Me8dELd0Mv8U2begC2k9SHd3t+NnNm7cqKwRbiYUkykqvlZlmOYVLIq5bHRep46JzotOc9BhuFc0ZHGLph+CJIaXr1FZSIfxsdBiN1+LpALEK2By61Aqs0rwtV7DNBU3BMCYixYTLU6C8bM5hBwum0k1mesBpmPtlj+qXFenFsAgCVLon9DYeIxUnmh05HCdBIkCVRP6ussiepVZJZXIutCHwt2I0YGY2Kiz3AIyeG5aLNooVULQBbHy1/nAK2oEtEanheil+GO3aFg0FnwSilNC4q6OrXzywc0XCy1WMaFu/tgrCBLRuWpHuP+n1zqmRXFN0GAnwKgHeW1E1C/86UDJHFKptATZMPZTafbLXHtN3OPixKRC4ev4GwB2Gy6JxhQNEYul+KoKp79RMaGqKzy9ovzt27c7pidVZtYAGJMYOP7u6bdK1mLI1GQ+/ogSZBahwKuLO2jSZt0odw65xrUhAMNrZskLsGiIXz72F3bTjV+ixvtbWcMQr3NWCbog5VyXAIy63PLrqpJITIqHkcD9P7suSiYbG53wvTLKDbr8WBbjZqIF4F3PD3ItRn1eQd5CBF3lCM5RAIYfVp0/dgZ8SvbJ2/l8MmlvNw+8qJTjm+drWQwaAXO9KMuWncc1GBMXKkGeV/pU5ZxFIsTvzovOCu3HvDnOE7NTu3rLr+PE8fy6+IEX9947YM4n/+LbPT/88R8QqoYAuVSDrZLFKcYso2AcLBIeGDPu6h3M+yqvIE/4Y6w4LdUfi+jcr86L75KvC9+PcbVfd1hCi6U7Innwk1/+Q5rcoetsdyBg3s9aCmivBsNFifGfG9zCJUFiztmpEXAbqhMgr6SLWBPu9R1enRfm1ktrC6cVYWH+/Mqg43x6sYK1edaCex7vkRZHZkF+6P6NkXvvi/TpLNBUaqTtdcsoLtIrVTcem2EHDh7m2uq0ikMINBvafOmazzt+BkGMW9CF70DndPsOaJqb38Y1oXjdCYHOiqwbPofrKid6thMAlnxxPtMy6w4K0ubNhq73U5wd5PtVleCTd+50D2CEafLloqixyv0ufMcOGq64CVaMYN2119gfAdPpuscKOxWgCMDwxfm0pvzBhx9siRLoFt3ca7Ikf+x2yygaYzHdTSi7IT9y8fMJ2Lpdhg+ZCPA2+f05d1A88mBLHzQaoA1dL6ohVLJGi+1uQj8XQMyHIMgaGT6eDxuozMkD294LRaB7CPI27DLHQSskSFRvGa30O/zndF4fF0DMhwa//9//iZ2DcILqN7xBHn1oUweNn7eJ3WO9QHvdMlrMsphKEj8XQPgpuHVVMtGOgF0hC9CGTqbb2kHOzXx73aKiuiymEv2x22ICMYYeWSALBQ7RQ0fkoZIr4DnRtS3ohzf1dNzTG9d0PcwMLahZO8UyKTMm38wteratSVtkplq4oWj0PcfrEinPhYg14H+hvdIwCVs1bvb6O+UBMYFGl90d0LRGLRDgoHEUwYnXDniQStocTVUwfPLaKQGA/RoWOmkvtnsaG8unK+PWMKlH5e+Lznp03N27RdO0TkxmYNZKszYBlyfI3RpjsQkmMOo8ls4Wsx1EKcEVAEvayyNoeRzsO2RI+93PNRLesGYtNpBhL4l/prlgZz5ob0mbtZVFhWC301d0EuQgAHPgS7D9hssTHKyMbRfLptF213NBDRuoaqxNA2yh2VUBDnxJ1M1yRW6gOgt2x64gqXK7ht1yOWyW1+wl7bYXvhUygQXgit4KuVDuBGzSbA2bmmtayNzpRgJOGu7XosHFChZzvrGTiUKt5UMiVsmbmtsCb3+2lZmwm3hFNsA/CiYdKyfhYx3Aws8urp8nsJM72naGCG8zYwZMecjk/WHVVRbsMwU6tBVQsWJS2sNDlrgVTO0RE/vzKQtuN2+/85k5PxlUaL75D3BZwKss+JUqSFRAO/F7Eqlkmj+2gbrgYE8rZFluu+P3pOGsyWCG/Y9/GR8exC+vYfc5flxgzRdDGsDEz/8AJsxwQcBUKPCtmKOMFJO8OKMgF8r3b3sKkAm69TN+2OZCAm5ID/g9XPypwX29ufWgudq0urrKes/8nPkxgy1bdg6z/or/SFc2mzV/xs+6HwySTmdYJp2dpaWKEregYrVfn9/B0xkD2U6+e+sOaHqImTfLrycUOIZM1hJwC3oemPXbi/y5PnsrJ136bUa8pxu69BklmANWwDRkgR1wmwVaglyi3Nz6JLQ+ZG5NxQsgNdAhmIfJN7wxgoWg9fxzPQ+c/g9YAIXgeUKCyipJO4uR/wswAOIwB/5IgxvbAAAAAElFTkSuQmCC" alt="PHP Logo" /></a><h1 class="p">PHP-FPM real-time status page</h1>
					</td>
				</tr>
			</table>
			<br />
			<table border="0" cellpadding="3" width="95%">
				<tr><td class="e">Status URL</td><td class="v"><input type="text" id="url" size="45" /></td></tr>
				<tr><td class="e">Ajax status</td><td class="v" id="status"></td></tr>
				<tr><td class="e">Refresh Rate</td><td class="v"><input type="text" id="rate" value="1" /></td></tr>
				<tr>
					<td class="e">Actions</td>
					<td class="v">
						<button onclick="javascript:refresh();">Manual Refresh</button>
						<button id="play" onclick="javascript:playpause();">Play</button>
					</td>
				</tr>
			</table>
			<h1>Pool Status</h1>
			<table border="0" cellpadding="3" width="95%" id="short">
				<tr style="display: none;"><td>&nbsp;</td></tr>
			</table>
			<h1>Active Processes status</h1>
			<table border="0" cellpadding="3" width="95%" id="active">
				<tr class="h"><th>PID&darr;</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th></tr>
			</table>
			<h1>Idle Processes status</h1>
			<table border="0" cellpadding="3" width="95%" id="idle">
				<tr class="h"><th>PID&darr;</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th><th>Last Request %CPU</th><th>Last Request Memory</th></tr>
			</table>
		</div>
		<p>
			<a href="http://validator.w3.org/check?uri=referer">
				<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" />
			</a>
		 </p>
		<script type="text/javascript">
<!--
			var xhr_object = null;
			var doc_url = document.getElementById("url");
			var doc_rate = document.getElementById("rate");
			var doc_status = document.getElementById("status");
			var doc_play = document.getElementById("play");
			var doc_short = document.getElementById("short");
			var doc_active = document.getElementById("active");
			var doc_idle = document.getElementById("idle");
			var rate = 0;
			var play=0;
			var delay = 1000;
			var order_active_index = 0;
			var order_active_reverse = 0;
			var order_idle_index = 0;
			var order_idle_reverse = 0;
			var sort_index;
			var sort_order;

			doc_url.value = location.protocol + '//' + location.host + "/status?json&full";

			ths = document.getElementsByTagName("th");
			for (var i=0; i<ths.length; i++) {
				var th = ths[i];
				if (th.parentNode.className == "h") {
					th.onclick = function() { order(this); return false; };
				}
			}

			xhr_object = create_ajax();

			function create_ajax() {
				if (window.XMLHttpRequest) {
					return new XMLHttpRequest();
				}
				var names = [
					"Msxml2.XMLHTTP.6.0",
					"Msxml2.XMLHTTP.3.0",
					"Msxml2.XMLHTTP",
					"Microsoft.XMLHTTP"
				];
				for(var i in names)
				{
					try {
						return new ActiveXObject(names[i]);
					}	catch(e){}
				}
				alert("Browser not compatible ...");
			}

			function order(cell) {
				var table;

				if (cell.constructor != HTMLTableCellElement && cell.constructor != HTMLTableHeaderCellElement) {
					return;
				}

				table = cell.parentNode.parentNode.parentNode;

				if (table == doc_active) {
					if (order_active_index == cell.cellIndex) {
						if (order_active_reverse == 0) {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&uarr;");
							order_active_reverse = 1;
						} else {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&darr;");
							order_active_reverse = 0;
						}
					} else {
						var c = doc_active.rows[0].cells[order_active_index];
						c.innerHTML = c.innerHTML.replace(/.$/, "");
						cell.innerHTML = cell.innerHTML.replace(/$/, order_active_reverse == 0 ? "&darr;" : "&uarr;");
						order_active_index = cell.cellIndex;
					}
					reorder(table, order_active_index, order_active_reverse);
					return;
				}

				if (table == doc_idle) {
					if (order_idle_index == cell.cellIndex) {
						if (order_idle_reverse == 0) {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&uarr;");
							order_idle_reverse = 1;
						} else {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&darr;");
							order_idle_reverse = 0;
						}
					} else {
						var c = doc_idle.rows[0].cells[order_idle_index];
						c.innerHTML = c.innerHTML.replace(/.$/, "");
						cell.innerHTML = cell.innerHTML.replace(/$/, order_idle_reverse == 0 ? "&darr;" : "&uarr;");
						order_idle_index = cell.cellIndex;
					}
					reorder(table, order_idle_index, order_idle_reverse);
					return;
				}
			}

			function reorder(table, index, order) {
				var rows = [];
				while (table.rows.length > 1) {
					rows.push(table.rows[1]);
					table.deleteRow(1);
				}
				sort_index = index;
				sort_order = order;
				rows.sort(sort_table);
				for (var i in rows) {
					table.appendChild(rows[i]);
				}
				var odd = 1;
				for (var i=1; i<table.rows.length; i++) {
					table.rows[i].className = odd++ % 2 == 0 ? "v" : "w";
				}
				return;
			}

			function sort_table(a, b) {
				if (a.cells[0].tagName == "TH") return -1;
				if (b.cells[0].tagName == "TH") return 1;

				if (a.cells[sort_index].__search_t == 0) { /* integer */
					if (!sort_order) return a.cells[sort_index].__search_v - b.cells[sort_index].__search_v;
					return b.cells[sort_index].__search_v - a.cells[sort_index].__search_v;;
				}

				/* string */
				if (!sort_order) return a.cells[sort_index].__search_v.localeCompare(b.cells[sort_index].__search_v);
				else return b.cells[sort_index].__search_v.localeCompare(a.cells[sort_index].__search_v);
			}

			function playpause() {
				rate = 0;
				if (play) {
					play = 0;
					doc_play.innerHTML = "Play";
					doc_rate.disabled = false;
				} else {
					delay = parseInt(doc_rate.value);
					if (!delay || delay < 1) {
						doc_status.innerHTML = "Not valid 'refresh' value";
						return;
					}
					play = 1;
					doc_rate.disabled = true;
					doc_play.innerHTML = "Pause";
					setTimeout("callback()", delay * 1000);
				}
			}

			function refresh() {
				if (xhr_object == null) return;
				if (xhr_object.readyState > 0 && xhr_object.readyState < 4) {
					return; /* request is running */
				}
				xhr_object.open("GET", doc_url.value, true);
				xhr_object.onreadystatechange = function() {
					switch(xhr_object.readyState) {
						case 0:
							doc_status.innerHTML = "uninitialized";
							break;
						case 1:
							doc_status.innerHTML = "loading ...";
							break;
						case 2:
							doc_status.innerHTML = "loaded";
							break;
						case 3:
							doc_status.innerHTML = "interactive";
							break;
						case 4:
							doc_status.innerHTML = "complete";
							if (xhr_object.status == 200) {
								fpm_status(xhr_object.responseText);
							} else {
								doc_status.innerHTML = "Error " + xhr_object.status;
							}
							break;
					}
				}
				xhr_object.send();
			}

			function callback() {
				if (!play) return;
				refresh();
				setTimeout("callback()", delay * 1000);
			}

			function fpm_status(txt) {
				var json = null;

				while (doc_short.rows.length > 0) {
					doc_short.deleteRow(0);
				}

				while (doc_active.rows.length > 1) {
					doc_active.deleteRow(1);
				}

				while (doc_idle.rows.length > 1) {
					doc_idle.deleteRow(1);
				}

				try {
					json = JSON.parse(txt);
				} catch (e) {
					doc_status.innerHTML =  "Error while parsing json: '" + e + "': <br /><pre>" + txt + "</pre>";
					return;
				}

				for (var key in json) {
					if (key == "processes") continue;
					if (key == "state") continue;
					var row = doc_short.insertRow(doc_short.rows.length);
					var value = json[key];
					if (key == "start time") {
						value = new Date(value * 1000).toLocaleString();
					}
					if (key == "start since") {
						value = time_s(value);
					}
					var cell = row.insertCell(row.cells.length);
					cell.className = "e";
					cell.innerHTML = key;

					cell = row.insertCell(row.cells.length);
					cell.className = "v";
					cell.innerHTML = value;
				}

				if (json.processes) {
					process_full(json.processes, doc_active, "Idle", 0, 0);
					reorder(doc_active, order_active_index, order_active_reverse);

					process_full(json.processes, doc_idle, "Idle", 1, 1);
					reorder(doc_idle, order_idle_index, order_idle_reverse);
				}
			}

			function process_full(processes, table, state, equal, cpumem) {
				var odd = 1;

				for (var i in processes) {
					var proc = processes[i];
					if ((equal && proc.state == state) || (!equal && proc.state != state)) {
						var c = odd++ % 2 == 0 ? "v" : "w";
						var row = table.insertRow(-1);
						row.className = c;
						row.insertCell(-1).innerHTML = proc.pid;
						row.cells[row.cells.length - 1].__search_v = proc.pid;
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = date(proc['start time'] * 1000);;
						row.cells[row.cells.length - 1].__search_v = proc['start time'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = time_s(proc['start since']);
						row.cells[row.cells.length - 1].__search_v = proc['start since'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc.requests;
						row.cells[row.cells.length - 1].__search_v = proc.requests;
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = time_u(proc['request duration']);
						row.cells[row.cells.length - 1].__search_v = proc['request duration'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc['request method'];
						row.cells[row.cells.length - 1].__search_v = proc['request method'];
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc['request uri'];
						row.cells[row.cells.length - 1].__search_v = proc['request uri'];
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc['content length'];
						row.cells[row.cells.length - 1].__search_v = proc['content length'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc.user;
						row.cells[row.cells.length - 1].__search_v = proc.user;
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc.script;
						row.cells[row.cells.length - 1].__search_v = proc.script;
						row.cells[row.cells.length - 1].__search_t = 1;

						if (cpumem) {
							row.insertCell(-1).innerHTML = cpu(proc['last request cpu']);
							row.cells[row.cells.length - 1].__search_v = proc['last request cpu'];
							row.cells[row.cells.length - 1].__search_t = 0;

							row.insertCell(-1).innerHTML = memory(proc['last request memory']);
							row.cells[row.cells.length - 1].__search_v = proc['last request memory'];
							row.cells[row.cells.length - 1].__search_t = 0;
						}
					}
				}
			}

			function date(d) {
				var t = new Date(d);
				var r = "";

				r += (t.getDate() < 10 ? '0' : '') + t.getDate();
				r += '/';
				r += (t.getMonth() + 1 < 10 ? '0' : '') + (t.getMonth() + 1);
				r += '/';
				r += t.getFullYear();
				r += ' ';
				r += (t.getHours() < 10 ? '0' : '') + t.getHours();
				r += ':';
				r += (t.getMinutes() < 10 ? '0' : '') + t.getMinutes();
				r += ':';
				r += (t.getSeconds() < 10 ? '0' : '') + t.getSeconds();


				return r;
			}

			function cpu(c) {
				if (c == 0) return 0;
				return c + "%";
			}

			function memory(mem) {
				if (mem == 0) return 0;
				if (mem < 1024) {
					return mem + "B";
				}
				if (mem < 1024 * 1024) {
					return mem/1024 + "KB";
				}
				if (mem < 1024*1024*1024) {
					return mem/1024/1024 + "MB";
				}
			}

			function time_s(t) {
				var r = "";
				if (t < 60) {
					return t + 's';
				}

				r = (t % 60) + 's';
				t = Math.floor(t / 60);
				if (t < 60) {
					return t + 'm ' + r;
				}

				r = (t % 60) + 'm ' + r;
				t = Math.floor(t/60);

				if (t < 24) {
					return t + 'h ' + r;
				}

				return Math.floor(t/24) + 'd ' + (t % 24) + 'h ' + t;
			}

			function time_u(t) {
				var r = "";
				if (t < 1000) {
					return t + '&micro;s'
				}

				r = (t % 1000) + '&micro;s';
				t = Math.floor(t / 1000);
				if (t < 1000) {
					return t + 'ms ' + r;
				}

				return time_s(Math.floor(t/1000)) + ' ' + (t%1000) + 'ms ' + r;
			}
-->
		</script>
	</body>
</html>
pear/Mail/mock.php000064400000011550151732707750010037 0ustar00<?php
/**
 * Mock implementation
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org> 
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Mock implementation of the PEAR Mail:: interface for testing.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_mock extends Mail {

    /**
     * Array of messages that have been sent with the mock.
     *
     * @var array
     */
    public $sentMessages = array();

    /**
     * Callback before sending mail.
     *
     * @var callback
     */
    protected $_preSendCallback;

    /**
     * Callback after sending mai.
     *
     * @var callback
     */
    protected $_postSendCallback;

    /**
     * Constructor.
     *
     * Instantiates a new Mail_mock:: object based on the parameters
     * passed in. It looks for the following parameters, both optional:
     *     preSendCallback   Called before an email would be sent.
     *     postSendCallback  Called after an email would have been sent.
     *
     * @param array Hash containing any parameters.
     */
    public function __construct($params)
    {
        if (isset($params['preSendCallback']) &&
            is_callable($params['preSendCallback'])) {
            $this->_preSendCallback = $params['preSendCallback'];
        }

        if (isset($params['postSendCallback']) &&
            is_callable($params['postSendCallback'])) {
            $this->_postSendCallback = $params['postSendCallback'];
        }
    }

    /**
     * Implements Mail_mock::send() function. Silently discards all
     * mail.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if ($this->_preSendCallback) {
            call_user_func_array($this->_preSendCallback,
                                 array(&$this, $recipients, $headers, $body));
        }

        $entry = array('recipients' => $recipients, 'headers' => $headers, 'body' => $body);
        $this->sentMessages[] = $entry;

        if ($this->_postSendCallback) {
            call_user_func_array($this->_postSendCallback,
                                 array(&$this, $recipients, $headers, $body));
        }

        return true;
    }

}
pear/Mail/sendmail.php000064400000016476151732707750010716 0ustar00<?php
/**
 * Sendmail implementation of the PEAR Mail interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Jon Parise <jon@php.net>
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Sendmail implementation of the PEAR Mail:: interface.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_sendmail extends Mail {

    /**
     * The location of the sendmail or sendmail wrapper binary on the
     * filesystem.
     * @var string
     */
    var $sendmail_path = '/usr/sbin/sendmail';

    /**
     * Any extra command-line parameters to pass to the sendmail or
     * sendmail wrapper binary.
     * @var string
     */
    var $sendmail_args = '-i';

    /**
     * Constructor.
     *
     * Instantiates a new Mail_sendmail:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     sendmail_path    The location of the sendmail binary on the
     *                      filesystem. Defaults to '/usr/sbin/sendmail'.
     *
     *     sendmail_args    Any extra parameters to pass to the sendmail
     *                      or sendmail wrapper binary.
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @param array $params Hash containing any parameters different from the
     *              defaults.
     */
    public function __construct($params)
    {
        if (isset($params['sendmail_path'])) {
            $this->sendmail_path = $params['sendmail_path'];
        }
        if (isset($params['sendmail_args'])) {
            $this->sendmail_args = $params['sendmail_args'];
        }

        /*
         * Because we need to pass message headers to the sendmail program on
         * the commandline, we can't guarantee the use of the standard "\r\n"
         * separator.  Instead, we use the system's native line separator.
         */
        if (defined('PHP_EOL')) {
            $this->sep = PHP_EOL;
        } else {
            $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
        }
    }

    /**
     * Implements Mail::send() function using the sendmail
     * command-line binary.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            return $recipients;
        }
        $recipients = implode(' ', array_map('escapeshellarg', $recipients));

        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list($from, $text_headers) = $headerElements;

        /* Since few MTAs are going to allow this header to be forged
         * unless it's in the MAIL FROM: exchange, we'll use
         * Return-Path instead of From: if it's set. */
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }

        if (!isset($from)) {
            return PEAR::raiseError('No from address given.');
        } elseif (strpos($from, ' ') !== false ||
                  strpos($from, ';') !== false ||
                  strpos($from, '&') !== false ||
                  strpos($from, '`') !== false) {
            return PEAR::raiseError('From address specified with dangerous characters.');
        }

        $from = escapeshellarg($from); // Security bug #16200

        $mail = @popen($this->sendmail_path . (!empty($this->sendmail_args) ? ' ' . $this->sendmail_args : '') . " -f$from -- $recipients", 'w');
        if (!$mail) {
            return PEAR::raiseError('Failed to open sendmail [' . $this->sendmail_path . '] for execution.');
        }

        // Write the headers following by two newlines: one to end the headers
        // section and a second to separate the headers block from the body.
        fputs($mail, $text_headers . $this->sep . $this->sep);

        fputs($mail, $body);
        $result = pclose($mail);
        if (version_compare(phpversion(), '4.2.3') == -1) {
            // With older php versions, we need to shift the pclose
            // result to get the exit code.
            $result = $result >> 8 & 0xFF;
        }

        if ($result != 0) {
            return PEAR::raiseError('sendmail returned error code ' . $result,
                                    $result);
        }

        return true;
    }

}
pear/Mail/null.php000064400000006341151732707760010063 0ustar00<?php
/**
 * Null implementation of the PEAR Mail interface
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Phil Kernick
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Phil Kernick <philk@rotfl.com.au>
 * @copyright   2010-2017 Phil Kernick
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Null implementation of the PEAR Mail:: interface.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_null extends Mail {

    /**
     * Implements Mail_null::send() function. Silently discards all
     * mail.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        return true;
    }

}
pear/Mail/mime.php000064400000153254151732707760010046 0ustar00<?php

/**
 * The Mail_Mime class is used to create MIME E-mail messages
 *
 * The Mail_Mime class provides an OO interface to create MIME
 * enabled email messages. This way you can create emails that
 * contain plain-text bodies, HTML bodies, attachments, inline
 * images and specific headers.
 *
 * Compatible with PHP version 5, 7 and 8
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors 
 *   may be used to endorse or promote products derived from this 
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Tomas V.V. Cox <cox@idecnet.com>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 *
 *            This class is based on HTML Mime Mail class from
 *            Richard Heyes <richard@phpguru.org> which was based also
 *            in the mime_mail.class by Tobias Ratschiller <tobias@dnet.it>
 *            and Sascha Schumann <sascha@schumann.cx>
 */


require_once 'PEAR.php';
require_once 'Mail/mimePart.php';


/**
 * The Mail_Mime class provides an OO interface to create MIME
 * enabled email messages. This way you can create emails that
 * contain plain-text bodies, HTML bodies, attachments, inline
 * images and specific headers.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Tomas V.V. Cox <cox@idecnet.com>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */
class Mail_mime
{
    /**
     * Contains the plain text part of the email
     *
     * @var string
     */
    protected $txtbody = '';

    /**
     * Contains the html part of the email
     *
     * @var string
     */
    protected $htmlbody = '';

    /**
     * Contains the text/calendar part of the email
     *
     * @var string
     */
    protected $calbody = '';

    /**
     * List of the attached images
     *
     * @var array
     */
    protected $html_images = array();

    /**
     * List of the attachements
     *
     * @var array
     */
    protected $parts = array();

    /**
     * Headers for the mail
     *
     * @var array
     */
    protected $headers = array();

    /**
     * Build parameters
     *
     * @var array
     */
    protected $build_params = array(
        // What encoding to use for the headers
        // Options: quoted-printable or base64
        'head_encoding' => 'quoted-printable',
        // What encoding to use for plain text
        // Options: 7bit, 8bit, base64, or quoted-printable
        'text_encoding' => 'quoted-printable',
        // What encoding to use for html
        // Options: 7bit, 8bit, base64, or quoted-printable
        'html_encoding' => 'quoted-printable',
        // What encoding to use for calendar part
        // Options: 7bit, 8bit, base64, or quoted-printable
        'calendar_encoding' => 'quoted-printable',
        // The character set to use for html
        'html_charset'  => 'ISO-8859-1',
        // The character set to use for text
        'text_charset'  => 'ISO-8859-1',
        // The character set to use for calendar part
        'calendar_charset'  => 'UTF-8',
        // The character set to use for headers
        'head_charset'  => 'ISO-8859-1',
        // End-of-line sequence
        'eol'           => "\r\n",
        // Delay attachment files IO until building the message
        'delay_file_io' => false,
        // Default calendar method
        'calendar_method' => 'request',
        // multipart part preamble (RFC2046 5.1.1)
        'preamble' => '',
    );


    /**
     * Constructor function
     *
     * @param mixed $params Build parameters that change the way the email
     *                      is built. Should be an associative array.
     *                      See $_build_params.
     *
     * @return void
     */
    public function __construct($params = array())
    {
        // Backward-compatible EOL setting
        if (is_string($params)) {
            $this->build_params['eol'] = $params;
        } else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) {
            $this->build_params['eol'] = MAIL_MIME_CRLF;
        }

        // Update build parameters
        if (!empty($params) && is_array($params)) {
            $this->build_params = array_merge($this->build_params, $params);
        }
    }

    /**
     * Set build parameter value
     *
     * @param string $name  Parameter name
     * @param string $value Parameter value
     *
     * @return void
     * @since  1.6.0
     */
    public function setParam($name, $value)
    {
        $this->build_params[$name] = $value;
    }

    /**
     * Get build parameter value
     *
     * @param string $name Parameter name
     *
     * @return mixed Parameter value
     * @since  1.6.0
     */
    public function getParam($name)
    {
        return isset($this->build_params[$name]) ? $this->build_params[$name] : null;
    }

    /**
     * Accessor function to set the body text. Body text is used if
     * it's not an html mail being sent or else is used to fill the
     * text/plain part that emails clients who don't support
     * html should show.
     *
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile If true the first param should be treated
     *                       as a file name, else as a string (default)
     * @param bool   $append If true the text or file is appended to
     *                       the existing body, else the old body is
     *                       overwritten
     *
     * @return mixed True on success or PEAR_Error object
     */
    public function setTXTBody($data, $isfile = false, $append = false)
    {
        return $this->setBody('txtbody', $data, $isfile, $append);
    }

    /**
     * Get message text body
     *
     * @return string Text body
     * @since  1.6.0
     */
    public function getTXTBody()
    {
        return $this->txtbody;
    }

    /**
     * Adds a html part to the mail.
     *
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile A flag that determines whether $data is a
     *                       filename, or a string(false, default)
     *
     * @return bool True on success or PEAR_Error object
     */
    public function setHTMLBody($data, $isfile = false)
    {
        return $this->setBody('htmlbody', $data, $isfile);
    }

    /**
     * Get message HTML body
     *
     * @return string HTML body
     * @since  1.6.0
     */
    public function getHTMLBody()
    {
        return $this->htmlbody;
    }

    /**
     * Function to set a body of text/calendar part (not attachment)
     *
     * @param string $data     Either a string or the file name with the contents
     * @param bool   $isfile   If true the first param should be treated
     *                         as a file name, else as a string (default)
     * @param bool   $append   If true the text or file is appended to
     *                         the existing body, else the old body is
     *                         overwritten
     * @param string $method   iCalendar object method
     * @param string $charset  iCalendar character set
     * @param string $encoding Transfer encoding
     *
     * @return mixed True on success or PEAR_Error object
     * @since  1.9.0
     */
    public function setCalendarBody($data, $isfile = false, $append = false,
        $method = 'request', $charset = 'UTF-8', $encoding = 'quoted-printable'
    ) {
        $result = $this->setBody('calbody', $data, $isfile, $append);

        if ($result === true) {
            $this->build_params['calendar_method']  = $method;
            $this->build_params['calendar_charset'] = $charset;
            $this->build_params['calendar_encoding'] = $encoding;
        }
    }

    /**
     * Get body of calendar part
     *
     * @return string Calendar part body
     * @since  1.9.0
     */
    public function getCalendarBody()
    {
        return $this->calbody;
    }

    /**
     * Adds an image to the list of embedded images.
     * Images added this way will be added as related parts of the HTML message.
     *
     * To correctly match the HTML image with the related attachment
     * HTML should refer to it by a filename (specified in $file or $name
     * arguments) or by cid:<content-id> (specified in $content_id arg).
     *
     * @param string $file       The image file name OR image data itself
     * @param string $c_type     The content type
     * @param string $name       The filename of the image. Used to find
     *                           the image in HTML content.
     * @param bool   $isfile     Whether $file is a filename or not.
     *                           Defaults to true
     * @param string $content_id Desired Content-ID of MIME part
     *                           Defaults to generated unique ID
     *
     * @return bool True on success
     */
    public function addHTMLImage($file,
        $c_type = 'application/octet-stream',
        $name = '',
        $isfile = true,
        $content_id = null
    ) {
        $bodyfile = null;

        if ($isfile) {
            // Don't load file into memory
            if ($this->build_params['delay_file_io']) {
                $filedata = null;
                $bodyfile = $file;
            } else {
                if (self::isError($filedata = $this->file2str($file))) {
                    return $filedata;
                }
            }

            $filename = $name ? $name : $file;
        } else {
            $filedata = $file;
            $filename = $name;
        }

        if (!$content_id) {
            $content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true));
        }

        $this->html_images[] = array(
            'body'      => $filedata,
            'body_file' => $bodyfile,
            'name'      => $filename,
            'c_type'    => $c_type,
            'cid'       => $content_id
        );

        return true;
    }

    /**
     * Adds a file to the list of attachments.
     *
     * @param mixed  $file        The file name or the file contents itself,
     *                            it can be also Mail_mimePart object
     * @param string $c_type      The content type
     * @param string $name        The filename of the attachment
     *                            Only use if $file is the contents
     * @param bool   $isfile      Whether $file is a filename or not. Defaults to true
     * @param string $encoding    The type of encoding to use. Defaults to base64.
     *                            Possible values: 7bit, 8bit, base64 or quoted-printable.
     * @param string $disposition The content-disposition of this file
     *                            Defaults to attachment.
     *                            Possible values: attachment, inline.
     * @param string $charset     The character set of attachment's content.
     * @param string $language    The language of the attachment
     * @param string $location    The RFC 2557.4 location of the attachment
     * @param string $n_encoding  Encoding of the attachment's name in Content-Type
     *                            By default filenames are encoded using RFC2231 method
     *                            Here you can set RFC2047 encoding (quoted-printable
     *                            or base64) instead
     * @param string $f_encoding  Encoding of the attachment's filename
     *                            in Content-Disposition header.
     * @param string $description Content-Description header
     * @param string $h_charset   The character set of the headers e.g. filename
     *                            If not specified, $charset will be used
     * @param array  $add_headers Additional part headers. Array keys can be in form
     *                            of <header_name>:<parameter_name>
     *
     * @return mixed True on success or PEAR_Error object
     */
    public function addAttachment($file,
        $c_type      = 'application/octet-stream',
        $name        = '',
        $isfile      = true,
        $encoding    = 'base64',
        $disposition = 'attachment',
        $charset     = '',
        $language    = '',
        $location    = '',
        $n_encoding  = null,
        $f_encoding  = null,
        $description = '',
        $h_charset   = null,
        $add_headers = array()
    ) {
        if ($file instanceof Mail_mimePart) {
            $this->parts[] = $file;
            return true;
        }

        $bodyfile = null;

        if ($isfile) {
            // Don't load file into memory
            if ($this->build_params['delay_file_io']) {
                $filedata = null;
                $bodyfile = $file;
            } else {
                if (self::isError($filedata = $this->file2str($file))) {
                    return $filedata;
                }
            }
            // Force the name the user supplied, otherwise use $file
            $filename = ($name ? $name : $this->basename($file));
        } else {
            $filedata = $file;
            $filename = $name;
        }

        if (!strlen($filename)) {
            $msg = "The supplied filename for the attachment can't be empty";
            return self::raiseError($msg);
        }

        $this->parts[] = array(
            'body'        => $filedata,
            'body_file'   => $bodyfile,
            'name'        => $filename,
            'c_type'      => $c_type,
            'charset'     => $charset,
            'encoding'    => $encoding,
            'language'    => $language,
            'location'    => $location,
            'disposition' => $disposition,
            'description' => $description,
            'add_headers' => $add_headers,
            'name_encoding'     => $n_encoding,
            'filename_encoding' => $f_encoding,
            'headers_charset'   => $h_charset,
        );

        return true;
    }

    /**
     * Checks if the current message has many parts
     *
     * @return bool True if the message has many parts, False otherwise.
     * @since  1.9.0
     */
    public function isMultipart()
    {
        return count($this->parts) > 0 || count($this->html_images) > 0
            || (strlen($this->htmlbody) > 0 && strlen($this->txtbody) > 0);
    }

    /**
     * Get the contents of the given file name as string
     *
     * @param string $file_name Path of file to process
     *
     * @return string Contents of $file_name
     */
    protected function file2str($file_name)
    {
        // Check state of file and raise an error properly
        if (!file_exists($file_name)) {
            return self::raiseError('File not found: ' . $file_name);
        }
        if (!is_file($file_name)) {
            return self::raiseError('Not a regular file: ' . $file_name);
        }
        if (!is_readable($file_name)) {
            return self::raiseError('File is not readable: ' . $file_name);
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        $cont = file_get_contents($file_name);

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return $cont;
    }

    /**
     * Adds a text subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The text mimePart object
     */
    protected function addTextPart($obj = null)
    {
        return $this->addBodyPart($obj, $this->txtbody, 'text/plain', 'text');
    }

    /**
     * Adds a html subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The html mimePart object
     */
    protected function addHtmlPart($obj = null)
    {
        return $this->addBodyPart($obj, $this->htmlbody, 'text/html', 'html');
    }

    /**
     * Adds a calendar subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The text mimePart object
     */
    protected function addCalendarPart($obj = null)
    {
        $ctype = 'text/calendar; method='. $this->build_params['calendar_method'];

        return $this->addBodyPart($obj, $this->calbody, $ctype, 'calendar');
    }

    /**
     * Creates a new mimePart object, using multipart/mixed as
     * the initial content-type and returns it during the
     * build process.
     *
     * @param array $params Additional part parameters
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addMixedPart($params = array())
    {
        $params['content_type'] = 'multipart/mixed';
        $params['eol']          = $this->build_params['eol'];

        // Create empty multipart/mixed Mail_mimePart object to return
        return new Mail_mimePart('', $params);
    }

    /**
     * Adds a multipart/alternative part to a mimePart
     * object (or creates one), and returns it during
     * the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addAlternativePart($obj = null)
    {
        $params['content_type'] = 'multipart/alternative';
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart('', $params);
        } else {
            $ret = new Mail_mimePart('', $params);
        }

        return $ret;
    }

    /**
     * Adds a multipart/related part to a mimePart
     * object (or creates one), and returns it during
     * the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addRelatedPart($obj = null)
    {
        $params['content_type'] = 'multipart/related';
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart('', $params);
        } else {
            $ret = new Mail_mimePart('', $params);
        }

        return $ret;
    }

    /**
     * Adds an html image subpart to a mimePart object
     * and returns it during the build process.
     *
     * @param object $obj   The mimePart to add the image to
     * @param array  $value The image information
     *
     * @return object The image mimePart object
     */
    protected function addHtmlImagePart($obj, $value)
    {
        $params['content_type'] = $value['c_type'];
        $params['encoding']     = 'base64';
        $params['disposition']  = 'inline';
        $params['filename']     = $value['name'];
        $params['cid']          = $value['cid'];
        $params['body_file']    = $value['body_file'];
        $params['eol']          = $this->build_params['eol'];

        if (!empty($value['name_encoding'])) {
            $params['name_encoding'] = $value['name_encoding'];
        }
        if (!empty($value['filename_encoding'])) {
            $params['filename_encoding'] = $value['filename_encoding'];
        }

        return $obj->addSubpart($value['body'], $params);
    }

    /**
     * Adds an attachment subpart to a mimePart object
     * and returns it during the build process.
     *
     * @param object $obj   The mimePart to add the image to
     * @param mixed  $value The attachment information array or Mail_mimePart object
     *
     * @return object The image mimePart object
     */
    protected function addAttachmentPart($obj, $value)
    {
        if ($value instanceof Mail_mimePart) {
            return $obj->addSubpart($value);
        }

        $params['eol']          = $this->build_params['eol'];
        $params['filename']     = $value['name'];
        $params['encoding']     = $value['encoding'];
        $params['content_type'] = $value['c_type'];
        $params['body_file']    = $value['body_file'];
        $params['disposition']  = isset($value['disposition']) ?
                                  $value['disposition'] : 'attachment';

        // content charset
        if (!empty($value['charset'])) {
            $params['charset'] = $value['charset'];
        }
        // headers charset (filename, description)
        if (!empty($value['headers_charset'])) {
            $params['headers_charset'] = $value['headers_charset'];
        }
        if (!empty($value['language'])) {
            $params['language'] = $value['language'];
        }
        if (!empty($value['location'])) {
            $params['location'] = $value['location'];
        }
        if (!empty($value['name_encoding'])) {
            $params['name_encoding'] = $value['name_encoding'];
        }
        if (!empty($value['filename_encoding'])) {
            $params['filename_encoding'] = $value['filename_encoding'];
        }
        if (!empty($value['description'])) {
            $params['description'] = $value['description'];
        }
        if (is_array($value['add_headers'])) {
            $params['headers'] = $value['add_headers'];
        }

        return $obj->addSubpart($value['body'], $params);
    }

    /**
     * Returns the complete e-mail, ready to send using an alternative
     * mail delivery method. Note that only the mailpart that is made
     * with Mail_Mime is created. This means that,
     * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF
     * using the $headers parameter!
     *
     * @param string $separation The separation between these two parts.
     * @param array  $params     The Build parameters passed to the
     *                           get() function. See get() for more info.
     * @param array  $headers    The extra headers that should be passed
     *                           to the headers() method.
     *                           See that function for more info.
     * @param bool   $overwrite  Overwrite the existing headers with new.
     *
     * @return mixed The complete e-mail or PEAR error object
     */
    public function getMessage($separation = null, $params = null, $headers = null,
        $overwrite = false
    ) {
        if ($separation === null) {
            $separation = $this->build_params['eol'];
        }

        $body = $this->get($params);

        if (self::isError($body)) {
            return $body;
        }

        return $this->txtHeaders($headers, $overwrite) . $separation . $body;
    }

    /**
     * Returns the complete e-mail body, ready to send using an alternative
     * mail delivery method.
     *
     * @param array $params The Build parameters passed to the
     *                      get() method. See get() for more info.
     *
     * @return mixed The e-mail body or PEAR error object
     * @since  1.6.0
     */
    public function getMessageBody($params = null)
    {
        return $this->get($params, null, true);
    }

    /**
     * Writes (appends) the complete e-mail into file.
     *
     * @param string $filename  Output file location
     * @param array  $params    The Build parameters passed to the
     *                          get() method. See get() for more info.
     * @param array  $headers   The extra headers that should be passed
     *                          to the headers() function.
     *                          See that function for more info.
     * @param bool   $overwrite Overwrite the existing headers with new.
     *
     * @return mixed True or PEAR error object
     * @since  1.6.0
     */
    public function saveMessage($filename, $params = null, $headers = null, $overwrite = false)
    {
        // Check state of file and raise an error properly
        if (file_exists($filename) && !is_writable($filename)) {
            return self::raiseError('File is not writable: ' . $filename);
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        if (!($fh = fopen($filename, 'ab'))) {
            return self::raiseError('Unable to open file: ' . $filename);
        }

        // Write message headers into file (skipping Content-* headers)
        $head = $this->txtHeaders($headers, $overwrite, true);
        if (fwrite($fh, $head) === false) {
            return self::raiseError('Error writing to file: ' . $filename);
        }

        fclose($fh);

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        // Write the rest of the message into file
        $res = $this->get($params, $filename);

        return $res ? $res : true;
    }

    /**
     * Writes (appends) the complete e-mail body into file or stream.
     *
     * @param mixed $filename Output filename or file pointer where to save
     *                        the message instead of returning it
     * @param array $params   The Build parameters passed to the
     *                        get() method. See get() for more info.
     *
     * @return mixed True or PEAR error object
     * @since  1.6.0
     */
    public function saveMessageBody($filename, $params = null)
    {
        if (!is_resource($filename)) {
            // Check state of file and raise an error properly
            if (!file_exists($filename) || !is_writable($filename)) {
                return self::raiseError('File is not writable: ' . $filename);
            }

            if (!($fh = fopen($filename, 'ab'))) {
                return self::raiseError('Unable to open file: ' . $filename);
            }
        } else {
            $fh = $filename;
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        // Write the rest of the message into file
        $res = $this->get($params, $fh, true);

        if (!is_resource($filename)) {
            fclose($fh);
        }

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return $res ? $res : true;
    }

    /**
     * Builds the multipart message from the list ($this->parts) and
     * returns the mime content.
     *
     * @param array   $params    Build parameters that change the way the email
     *                           is built. Should be associative. See $_build_params.
     * @param mixed   $filename  Output filename or file pointer where to save
     *                           the message instead of returning it
     * @param boolean $skip_head True if you want to return/save only the message
     *                           without headers
     *
     * @return mixed The MIME message content string, null or PEAR error object
     */
    public function get($params = null, $filename = null, $skip_head = false)
    {
        if (!empty($params) && is_array($params)) {
            $this->build_params = array_merge($this->build_params, $params);
        }

        if (isset($this->headers['From'])) {
            // Bug #11381: Illegal characters in domain ID
            if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->headers['From'], $matches)) {
                $domainID = $matches[1];
            } else {
                $domainID = '@localhost';
            }

            foreach ($this->html_images as $i => $img) {
                $cid = $this->html_images[$i]['cid'];
                if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) {
                    $this->html_images[$i]['cid'] = $cid . $domainID;
                }
            }
        }

        if (count($this->html_images) && strlen($this->htmlbody) > 0) {
            foreach ($this->html_images as $key => $value) {
                $rval  = preg_quote($value['name'], '#');
                $regex = array(
                    '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' . $rval . '\3#',
                    '#(?i)url(?-i)\(\s*(["\']?)' . $rval . '\1\s*\)#',
                );

                $rep = array(
                    '\1\2=\3cid:' . $value['cid'] .'\3',
                    'url(\1cid:' . $value['cid'] . '\1)',
                );

                $this->htmlbody = preg_replace($regex, $rep, $this->htmlbody);
                $this->html_images[$key]['name']
                    = $this->basename($this->html_images[$key]['name']);
            }
        }

        $this->checkParams();

        $message = $this->buildBodyPart();

        if (!isset($message)) {
            return null;
        }

        // Use saved boundary
        if (!empty($this->build_params['boundary'])) {
            $boundary = $this->build_params['boundary'];
        } else {
            $boundary = null;
        }

        // Write output to file
        if ($filename) {
            // Append mimePart message headers and body into file
            $headers = $message->encodeToFile($filename, $boundary, $skip_head);
            if (self::isError($headers)) {
                return $headers;
            }
            $this->headers = array_merge($this->headers, $headers);
        } else {
            $output = $message->encode($boundary, $skip_head);
            if (self::isError($output)) {
                return $output;
            }
            $this->headers = array_merge($this->headers, $output['headers']);
        }

        // remember the boundary used, in case we'd handle headers() call later
        if (empty($boundary) && !empty($this->headers['Content-Type'])) {
            if (preg_match('/boundary="([^"]+)/', $this->headers['Content-Type'], $m)) {
                $this->build_params['boundary'] = $m[1];
            }
        }

        return $filename ? null : $output['body'];
    }

    /**
     * Builds the main body MIME part for the email body. It will add a mixed part
     * if attachments are found.  If no attachments are found  it will return an
     * alternative part if several body texts are found (text, html, calendar),
     * or a single part if only one body text is found.
     *
     * @return Mail_mimePart|null The corresponding part for the body or null.
     *
     * @see buildAlternativeParts
     * @see buildHtmlParts
     */
    protected function buildBodyPart()
    {
        $parts_count  = count($this->parts);
        $mixed_params = array('preamble' => $this->build_params['preamble']);
        $message      = null;

        if ($parts_count > 0) {
            $message = $this->addMixedPart($mixed_params);
            $this->buildAlternativeParts($message, null);
            for ($i = 0; $i < $parts_count; $i++) {
                $this->addAttachmentPart($message, $this->parts[$i]);
            }
        } else {
            $message = $this->buildAlternativeParts(null, $mixed_params);
        }

        return $message;
    }

    /**
     * Builds a single text, html, or calendar part only if one of them is found.
     * If two or more parts are found, then an alternative part containing them is built.
     *
     * @param Mail_mimePart|null $parent_part  The parent mime part to add
     *                                         the part or null
     * @param array              $mixed_params The needed params to create the
     *                                         part when no parent_part is
     *                                         received.
     *
     * @return null|object The main part built inside the method. It will be an
     *                     alternative part or text, html, or calendar part.
     *                     Null if no body texts are found.
     */
    protected function buildAlternativeParts($parent_part, $mixed_params = null)
    {
        $html               = strlen($this->htmlbody) > 0;
        $calendar           = strlen($this->calbody) > 0;
        $has_text           = strlen($this->txtbody) > 0;
        $alternatives_count = $html + $calendar + $has_text;

        if ($alternatives_count > 1) {
            $alt_part = $this->addAlternativePart($parent_part ? $parent_part : $mixed_params);
        } else {
            $alt_part = null;
        }

        $dest_part = $alt_part ? $alt_part : $parent_part;
        $part = null;

        if ($has_text) {
            $part = $this->addTextPart($dest_part);
        }

        if ($html) {
            $part = $this->buildHtmlParts($dest_part);
        }

        if ($calendar) {
            $part = $this->addCalendarPart($dest_part);
        }

        return $dest_part ? $dest_part : $part;
    }

    /**
     * Builds html part as a single part or inside a related part with the html
     * images thar were found.
     *
     * @param Mail_mimePart|null $parent_part The object to add the part to,
     *                                        or anything else if a new object
     *                                        is to be created.
     *
     * @return Mail_mimePart|null The created part or null if no htmlbody found.
     */
    protected function buildHtmlParts($parent_part)
    {
        if (!strlen($this->htmlbody)) {
            return null;
        }

        $count_html_images = count($this->html_images);

        if ($count_html_images > 0) {
            $part = $this->addRelatedPart($parent_part);
            $this->addHtmlPart($part);
        } else {
            $part = $this->addHtmlPart($parent_part);
        }

        for ($i = 0; $i < $count_html_images; $i++) {
            $this->addHtmlImagePart($part, $this->html_images[$i]);
        }

        return $part;
    }

    /**
     * Returns an array with the headers needed to prepend to the email
     * (MIME-Version and Content-Type). Format of argument is:
     * $array['header-name'] = 'header-value';
     *
     * @param array $xtra_headers Assoc array with any extra headers (optional)
     *                            (Don't set Content-Type for multipart messages here!)
     * @param bool  $overwrite    Overwrite already existing headers.
     * @param bool  $skip_content Don't return content headers: Content-Type,
     *                            Content-Disposition and Content-Transfer-Encoding
     *
     * @return array Assoc array with the mime headers
     */
    public function headers($xtra_headers = null, $overwrite = false, $skip_content = false)
    {
        // Add mime version header
        $headers['MIME-Version'] = '1.0';

        if (!empty($xtra_headers)) {
            $headers = array_merge($headers, $xtra_headers);
        }

        if ($overwrite) {
            $this->headers = array_merge($this->headers, $headers);
        } else {
            $this->headers = array_merge($headers, $this->headers);
        }

        // Always reset Content-Type/Content-Transfer-Encoding headers
        // In case the message structure changed in meantime
        unset($this->headers['Content-Type']);
        unset($this->headers['Content-Transfer-Encoding']);
        unset($this->headers['Content-Disposition']);

        $this->headers = array_merge($this->headers, $this->contentHeaders());

        $headers = $this->headers;

        if ($skip_content) {
            unset($headers['Content-Type']);
            unset($headers['Content-Transfer-Encoding']);
            unset($headers['Content-Disposition']);
        } else if (!empty($this->build_params['ctype'])) {
            $headers['Content-Type'] = $this->build_params['ctype'];
        }

        return $this->encodeHeaders($headers);
    }

    /**
     * Get the text version of the headers
     * (usefull if you want to use the PHP mail() function)
     *
     * @param array $xtra_headers Assoc array with any extra headers (optional)
     *                            (Don't set Content-Type for multipart messages here!)
     * @param bool  $overwrite    Overwrite the existing headers with new.
     * @param bool  $skip_content Don't return content headers: Content-Type,
     *                            Content-Disposition and Content-Transfer-Encoding
     *
     * @return string Plain text headers
     */
    public function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false)
    {
        $headers = $this->headers($xtra_headers, $overwrite, $skip_content);

        // Place Received: headers at the beginning of the message
        // Spam detectors often flag messages with it after the Subject: as spam
        if (isset($headers['Received'])) {
            $received = $headers['Received'];
            unset($headers['Received']);
            $headers = array('Received' => $received) + $headers;
        }

        $ret = '';
        $eol = $this->build_params['eol'];

        foreach ($headers as $key => $val) {
            if (is_array($val)) {
                foreach ($val as $value) {
                    $ret .= "$key: $value" . $eol;
                }
            } else {
                $ret .= "$key: $val" . $eol;
            }
        }

        return $ret;
    }

    /**
     * Sets message Content-Type header.
     * Use it to build messages with various content-types e.g. miltipart/raport
     * not supported by contentHeaders() function.
     *
     * @param string $type   Type name
     * @param array  $params Hash array of header parameters
     *
     * @return void
     * @since  1.7.0
     */
    public function setContentType($type, $params = array())
    {
        $header = $type;

        $eol = !empty($this->build_params['eol']) ? $this->build_params['eol'] : "\r\n";

        // add parameters
        $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';

        if (is_array($params)) {
            foreach ($params as $name => $value) {
                if ($name == 'boundary') {
                    $this->build_params['boundary'] = $value;
                } else if (!preg_match($token_regexp, $value)) {
                    $header .= ";$eol $name=$value";
                } else {
                    $value = addcslashes($value, '\\"');
                    $header .= ";$eol $name=\"$value\"";
                }
            }
        }

        // add required boundary parameter if not defined
        if (stripos($type, 'multipart/') === 0) {
            if (empty($this->build_params['boundary'])) {
                $this->build_params['boundary'] = '=_' . md5(rand() . microtime());
            }

            $header .= ";$eol boundary=\"".$this->build_params['boundary']."\"";
        }

        $this->build_params['ctype'] = $header;
    }

    /**
     * Sets the Subject header
     *
     * @param string $subject String to set the subject to.
     *
     * @return void
     */
    public function setSubject($subject)
    {
        $this->headers['Subject'] = $subject;
    }

    /**
     * Set an email to the From (the sender) header
     *
     * @param string $email The email address to use
     *
     * @return void
     */
    public function setFrom($email)
    {
        $this->headers['From'] = $email;
    }

    /**
     * Add an email to the To header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addTo($email)
    {
        if (isset($this->headers['To'])) {
            $this->headers['To'] .= ", $email";
        } else {
            $this->headers['To'] = $email;
        }
    }

    /**
     * Add an email to the Cc (carbon copy) header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addCc($email)
    {
        if (isset($this->headers['Cc'])) {
            $this->headers['Cc'] .= ", $email";
        } else {
            $this->headers['Cc'] = $email;
        }
    }

    /**
     * Add an email to the Bcc (blank carbon copy) header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addBcc($email)
    {
        if (isset($this->headers['Bcc'])) {
            $this->headers['Bcc'] .= ", $email";
        } else {
            $this->headers['Bcc'] = $email;
        }
    }

    /**
     * Since the PHP send function requires you to specify
     * recipients (To: header) separately from the other
     * headers, the To: header is not properly encoded.
     * To fix this, you can use this public method to encode
     * your recipients before sending to the send function.
     *
     * @param string $recipients A comma-delimited list of recipients
     *
     * @return string Encoded data
     */
    public function encodeRecipients($recipients)
    {
        $input  = array('To' => $recipients);
        $retval = $this->encodeHeaders($input);

        return $retval['To'] ;
    }

    /**
     * Encodes headers as per RFC2047
     *
     * @param array $input  The header data to encode
     * @param array $params Extra build parameters
     *
     * @return array Encoded data
     */
    protected function encodeHeaders($input, $params = array())
    {
        $build_params = $this->build_params;

        if (!empty($params)) {
            $build_params = array_merge($build_params, $params);
        }

        foreach ($input as $hdr_name => $hdr_value) {
            if (is_array($hdr_value)) {
                foreach ($hdr_value as $idx => $value) {
                    $input[$hdr_name][$idx] = $this->encodeHeader(
                        $hdr_name, $value,
                        $build_params['head_charset'], $build_params['head_encoding']
                    );
                }
            } else if ($hdr_value !== null) {
                $input[$hdr_name] = $this->encodeHeader(
                    $hdr_name, $hdr_value,
                    $build_params['head_charset'], $build_params['head_encoding']
                );
            } else {
                unset($input[$hdr_name]);
            }
        }

        return $input;
    }

    /**
     * Encodes a header as per RFC2047
     *
     * @param string $name     The header name
     * @param string $value    The header data to encode
     * @param string $charset  Character set name
     * @param string $encoding Encoding name (base64 or quoted-printable)
     *
     * @return string Encoded header data (without a name)
     * @since  1.5.3
     */
    public function encodeHeader($name, $value, $charset, $encoding)
    {
        return Mail_mimePart::encodeHeader(
            $name, $value, $charset, $encoding, $this->build_params['eol']
        );
    }

    /**
     * Get file's basename (locale independent)
     *
     * @param string $filename Filename
     *
     * @return string Basename
     */
    protected function basename($filename)
    {
        // basename() is not unicode safe and locale dependent
        if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
            return preg_replace('/^.*[\\\\\\/]/', '', $filename);
        } else {
            return preg_replace('/^.*[\/]/', '', $filename);
        }
    }

    /**
     * Get Content-Type and Content-Transfer-Encoding headers of the message
     *
     * @return array Headers array
     */
    protected function contentHeaders()
    {
        $attachments      = count($this->parts) > 0;
        $html_images      = count($this->html_images) > 0;
        $html             = strlen($this->htmlbody) > 0;
        $calendar         = strlen($this->calbody) > 0;
        $has_text         = strlen($this->txtbody) > 0;
        $has_alternatives = ($html + $calendar + $has_text) > 1;
        $headers          = array();

        // See get()
        switch (true) {
        case $has_text && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/plain';
            break;

        case $html && !$html_images && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/html';
            break;

        case $html && $html_images && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'multipart/related';
            break;

        case $calendar && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/calendar';
            break;

        case $has_alternatives && !$attachments:
            $headers['Content-Type'] = 'multipart/alternative';
            break;

        case $attachments:
            $headers['Content-Type'] = 'multipart/mixed';
            break;
        }

        // Note: This is outside of the above switch construct to workaround
        // opcache bug: https://bugzilla.opensuse.org/show_bug.cgi?id=1166235
        if (empty($headers)) {
            return $headers;
        }

        $this->checkParams();

        $eol = !empty($this->build_params['eol'])
            ? $this->build_params['eol'] : "\r\n";

        if ($headers['Content-Type'] == 'text/plain') {
            // single-part message: add charset and encoding
            if ($this->build_params['text_charset']) {
                $charset = 'charset=' . $this->build_params['text_charset'];
                // place charset parameter in the same line, if possible
                // 26 = strlen("Content-Type: text/plain; ")
                $headers['Content-Type']
                    .= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset";
            }

            $headers['Content-Transfer-Encoding']
                = $this->build_params['text_encoding'];
        } else if ($headers['Content-Type'] == 'text/html') {
            // single-part message: add charset and encoding
            if ($this->build_params['html_charset']) {
                $charset = 'charset=' . $this->build_params['html_charset'];
                // place charset parameter in the same line, if possible
                $headers['Content-Type']
                    .= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset";
            }
            $headers['Content-Transfer-Encoding']
                = $this->build_params['html_encoding'];
        } else if ($headers['Content-Type'] == 'text/calendar') {
            // single-part message: add charset and encoding
            if ($this->build_params['calendar_charset']) {
                $charset = 'charset=' . $this->build_params['calendar_charset'];
                $headers['Content-Type'] .= "; $charset";
            }

            if ($this->build_params['calendar_method']) {
                $method = 'method=' . $this->build_params['calendar_method'];
                $headers['Content-Type'] .= "; $method";
            }

            $headers['Content-Transfer-Encoding']
                = $this->build_params['calendar_encoding'];
        } else {
            // multipart message: and boundary
            if (!empty($this->build_params['boundary'])) {
                $boundary = $this->build_params['boundary'];
            } else if (!empty($this->headers['Content-Type'])
                && preg_match('/boundary="([^"]+)"/', $this->headers['Content-Type'], $m)
            ) {
                $boundary = $m[1];
            } else {
                $boundary = '=_' . md5(rand() . microtime());
            }

            $this->build_params['boundary'] = $boundary;
            $headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
        }

        return $headers;
    }

    /**
     * Validate and set build parameters
     *
     * @return void
     */
    protected function checkParams()
    {
        $encodings = array('7bit', '8bit', 'base64', 'quoted-printable');

        $this->build_params['text_encoding']
            = strtolower($this->build_params['text_encoding']);
        $this->build_params['html_encoding']
            = strtolower($this->build_params['html_encoding']);
        $this->build_params['calendar_encoding']
            = strtolower($this->build_params['calendar_encoding']);

        if (!in_array($this->build_params['text_encoding'], $encodings)) {
            $this->build_params['text_encoding'] = '7bit';
        }
        if (!in_array($this->build_params['html_encoding'], $encodings)) {
            $this->build_params['html_encoding'] = '7bit';
        }
        if (!in_array($this->build_params['calendar_encoding'], $encodings)) {
            $this->build_params['calendar_encoding'] = '7bit';
        }

        // text body
        if ($this->build_params['text_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['text_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->txtbody)
        ) {
            $this->build_params['text_encoding'] = 'quoted-printable';
        }
        // html body
        if ($this->build_params['html_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['html_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->htmlbody)
        ) {
            $this->build_params['html_encoding'] = 'quoted-printable';
        }
        // calendar body
        if ($this->build_params['calendar_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['calendar_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->calbody)
        ) {
            $this->build_params['calendar_encoding'] = 'quoted-printable';
        }
    }

    /**
     * Set body of specified message part
     *
     * @param string $type   One of: txtbody, calbody, htmlbody
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile If true the first param should be treated
     *                       as a file name, else as a string (default)
     * @param bool   $append If true the text or file is appended to
     *                       the existing body, else the old body is
     *                       overwritten
     *
     * @return mixed True on success or PEAR_Error object
     */
    protected function setBody($type, $data, $isfile = false, $append = false)
    {
        if ($isfile) {
            $data = $this->file2str($data);
            if (self::isError($data)) {
                return $data;
            }
        }

        if (!$append) {
            $this->{$type} = $data;
        } else {
            $this->{$type} .= $data;
        }

        return true;
    }

    /**
     * Adds a subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed  $obj   The object to add the part to, or
     *                      anything else if a new object is to be created.
     * @param string $body  Part body
     * @param string $ctype Part content type
     * @param string $type  Internal part type
     *
     * @return object The mimePart object
     */
    protected function addBodyPart($obj, $body, $ctype, $type)
    {
        $params['content_type'] = $ctype;
        $params['encoding']     = $this->build_params[$type . '_encoding'];
        $params['charset']      = $this->build_params[$type . '_charset'];
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart($body, $params);
        } else {
            $ret = new Mail_mimePart($body, $params);
        }

        return $ret;
    }

    /**
     * PEAR::isError implementation
     *
     * @param mixed $data Object
     *
     * @return bool True if object is an instance of PEAR_Error
     */
    public static function isError($data)
    {
        // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
        if (is_a($data, 'PEAR_Error')) {
            return true;
        }

        return false;
    }

    /**
     * PEAR::raiseError implementation
     *
     * @param string $message A text error message
     *
     * @return PEAR_Error Instance of PEAR_Error
     */
    public static function raiseError($message)
    {
        // PEAR::raiseError() is not PHP 5.4 compatible
        return new PEAR_Error($message);
    }
}
pear/Mail/mimePart.php000064400000133512151732707760010670 0ustar00<?php
/**
 * The Mail_mimePart class is used to create MIME E-mail messages
 *
 * This class enables you to manipulate and build a mime email
 * from the ground up. The Mail_Mime class is a userfriendly api
 * to this class for people who aren't interested in the internals
 * of mime mail.
 * This class however allows full control over the email.
 *
 * Compatible with PHP version 5, 7 and 8
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors
 *   may be used to endorse or promote products derived from this
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */

/**
 * Require PEAR
 *
 * This package depends on PEAR to raise errors.
 */
require_once 'PEAR.php';

/**
 * The Mail_mimePart class is used to create MIME E-mail messages
 *
 * This class enables you to manipulate and build a mime email
 * from the ground up. The Mail_Mime class is a userfriendly api
 * to this class for people who aren't interested in the internals
 * of mime mail.
 * This class however allows full control over the email.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */
class Mail_mimePart
{
    /**
     * The encoding type of this part
     *
     * @var string
     */
    protected $encoding;

    /**
     * An array of subparts
     *
     * @var array
     */
    protected $subparts = array();

    /**
     * The output of this part after being built
     *
     * @var string
     */
    protected $encoded;

    /**
     * Headers for this part
     *
     * @var array
     */
    protected $headers = array();

    /**
     * The body of this part (not encoded)
     *
     * @var string
     */
    protected $body;

    /**
     * The location of file with body of this part (not encoded)
     *
     * @var string
     */
    protected $body_file;

    /**
     * The short text of multipart part preamble (RFC2046 5.1.1)
     *
     * @var string
     */
    protected $preamble;

    /**
     * The end-of-line sequence
     *
     * @var string
     */
    protected $eol = "\r\n";


    /**
     * Constructor.
     *
     * Sets up the object.
     *
     * @param string $body   The body of the mime part if any.
     * @param array  $params An associative array of optional parameters:
     *                       - content_type: The content type for this part eg multipart/mixed
     *                       - encoding:  The encoding to use, 7bit, 8bit, base64, or quoted-printable
     *                       - charset: Content character set
     *                       - cid: Content ID to apply
     *                       - disposition: Content disposition, inline or attachment
     *                       - filename: Filename parameter for content disposition
     *                       - description: Content description
     *                       - name_encoding: Encoding of the attachment name (Content-Type)
     *                       By default filenames are encoded using RFC2231
     *                       Here you can set RFC2047 encoding (quoted-printable
     *                       or base64) instead
     *                       - filename_encoding: Encoding of the attachment filename (Content-Disposition)
     *                       See 'name_encoding'
     *                       - headers_charset: Charset of the headers e.g. filename, description.
     *                       If not set, 'charset' will be used
     *                       - eol: End of line sequence. Default: "\r\n"
     *                       - headers: Hash array with additional part headers. Array keys
     *                       can be in form of <header_name>:<parameter_name>
     *                       - body_file: Location of file with part's body (instead of $body)
     *                       - preamble: short text of multipart part preamble (RFC2046 5.1.1)
     */
    public function __construct($body = '', $params = array())
    {
        if (!empty($params['eol'])) {
            $this->eol = $params['eol'];
        } else if (defined('MAIL_MIMEPART_CRLF')) { // backward-copat.
            $this->eol = MAIL_MIMEPART_CRLF;
        }

        // Additional part headers
        if (!empty($params['headers']) && is_array($params['headers'])) {
            $headers = $params['headers'];
        }

        foreach ($params as $key => $value) {
            switch ($key) {
            case 'encoding':
                $this->encoding = $value;
                $headers['Content-Transfer-Encoding'] = $value;
                break;

            case 'cid':
                $headers['Content-ID'] = '<' . $value . '>';
                break;

            case 'location':
                $headers['Content-Location'] = $value;
                break;

            case 'body_file':
                $this->body_file = $value;
                break;

            case 'preamble':
                $this->preamble = $value;
                break;

            // for backward compatibility
            case 'dfilename':
                $params['filename'] = $value;
                break;
            }
        }

        // Default content-type
        if (empty($params['content_type'])) {
            $params['content_type'] = 'text/plain';
        }

        // Content-Type
        $headers['Content-Type'] = $params['content_type'];
        if (!empty($params['charset'])) {
            $charset = "charset={$params['charset']}";
            // place charset parameter in the same line, if possible
            if ((strlen($headers['Content-Type']) + strlen($charset) + 16) <= 76) {
                $headers['Content-Type'] .= '; ';
            } else {
                $headers['Content-Type'] .= ';' . $this->eol . ' ';
            }
            $headers['Content-Type'] .= $charset;

            // Default headers charset
            if (!isset($params['headers_charset'])) {
                $params['headers_charset'] = $params['charset'];
            }
        }

        // header values encoding parameters
        $h_charset  = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII';
        $h_language = !empty($params['language']) ? $params['language'] : null;
        $h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null;

        if (!empty($params['filename'])) {
            $headers['Content-Type'] .= ';' . $this->eol;
            $headers['Content-Type'] .= $this->buildHeaderParam(
                'name', $params['filename'], $h_charset, $h_language, $h_encoding
            );
        }

        // Content-Disposition
        if (!empty($params['disposition'])) {
            $headers['Content-Disposition'] = $params['disposition'];
            if (!empty($params['filename'])) {
                $headers['Content-Disposition'] .= ';' . $this->eol;
                $headers['Content-Disposition'] .= $this->buildHeaderParam(
                    'filename', $params['filename'], $h_charset, $h_language,
                    !empty($params['filename_encoding']) ? $params['filename_encoding'] : null
                );
            }

            // add attachment size
            $size = $this->body_file ? filesize($this->body_file) : strlen($body);
            if ($size) {
                $headers['Content-Disposition'] .= ';' . $this->eol . ' size=' . $size;
            }
        }

        if (!empty($params['description'])) {
            $headers['Content-Description'] = $this->encodeHeader(
                'Content-Description', $params['description'], $h_charset, $h_encoding,
                $this->eol
            );
        }

        // Search and add existing headers' parameters
        foreach ($headers as $key => $value) {
            $items = explode(':', $key);
            if (count($items) == 2) {
                $header = $items[0];
                $param  = $items[1];
                if (isset($headers[$header])) {
                    $headers[$header] .= ';' . $this->eol;
                }
                $headers[$header] .= $this->buildHeaderParam(
                    $param, $value, $h_charset, $h_language, $h_encoding
                );
                unset($headers[$key]);
            }
        }

        // Default encoding
        if (!isset($this->encoding)) {
            $this->encoding = '7bit';
        }

        // Assign stuff to member variables
        $this->encoded  = array();
        $this->headers  = $headers;
        $this->body     = $body;
    }

    /**
     * Encodes and returns the email. Also stores
     * it in the encoded member variable
     *
     * @param string $boundary Pre-defined boundary string
     *
     * @return An associative array containing two elements,
     *         body and headers. The headers element is itself
     *         an indexed array. On error returns PEAR error object.
     */
    public function encode($boundary=null)
    {
        $encoded =& $this->encoded;

        if (count($this->subparts)) {
            $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
            $eol = $this->eol;

            $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";

            $encoded['body'] = '';

            if ($this->preamble) {
                $encoded['body'] .= $this->preamble . $eol . $eol;
            }

            for ($i = 0; $i < count($this->subparts); $i++) {
                $encoded['body'] .= '--' . $boundary . $eol;
                $tmp = $this->subparts[$i]->encode();
                if (is_a($tmp, 'PEAR_Error')) {
                    return $tmp;
                }
                foreach ($tmp['headers'] as $key => $value) {
                    $encoded['body'] .= $key . ': ' . $value . $eol;
                }
                $encoded['body'] .= $eol . $tmp['body'] . $eol;
            }

            $encoded['body'] .= '--' . $boundary . '--' . $eol;
        } else if ($this->body) {
            $encoded['body'] = $this->getEncodedData($this->body, $this->encoding);
        } else if ($this->body_file) {
            // Temporarily reset magic_quotes_runtime for file reads and writes
            if (version_compare(PHP_VERSION, '5.4.0', '<')) {
                $magic_quotes = @ini_set('magic_quotes_runtime', 0);
            }
            $body = $this->getEncodedDataFromFile($this->body_file, $this->encoding);
            if (isset($magic_quotes)) {
                @ini_set('magic_quotes_runtime', $magic_quotes);
            }

            if (is_a($body, 'PEAR_Error')) {
                return $body;
            }
            $encoded['body'] = $body;
        } else {
            $encoded['body'] = '';
        }

        // Add headers to $encoded
        $encoded['headers'] =& $this->headers;

        return $encoded;
    }

    /**
     * Encodes and saves the email into file or stream.
     * Data will be appended to the file/stream.
     *
     * @param mixed   $filename  Existing file location
     *                           or file pointer resource
     * @param string  $boundary  Pre-defined boundary string
     * @param boolean $skip_head True if you don't want to save headers
     *
     * @return array An associative array containing message headers
     *               or PEAR error object
     * @since  1.6.0
     */
    public function encodeToFile($filename, $boundary = null, $skip_head = false)
    {
        if (!is_resource($filename)) {
            if (file_exists($filename) && !is_writable($filename)) {
                $err = self::raiseError('File is not writeable: ' . $filename);
                return $err;
            }

            if (!($fh = fopen($filename, 'ab'))) {
                $err = self::raiseError('Unable to open file: ' . $filename);
                return $err;
            }
        } else {
            $fh = $filename;
        }

        // Temporarily reset magic_quotes_runtime for file reads and writes
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        $res = $this->encodePartToFile($fh, $boundary, $skip_head);

        if (!is_resource($filename)) {
            fclose($fh);
        }

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return is_a($res, 'PEAR_Error') ? $res : $this->headers;
    }

    /**
     * Encodes given email part into file
     *
     * @param string  $fh        Output file handle
     * @param string  $boundary  Pre-defined boundary string
     * @param boolean $skip_head True if you don't want to save headers
     *
     * @return array True on sucess or PEAR error object
     */
    protected function encodePartToFile($fh, $boundary = null, $skip_head = false)
    {
        $eol = $this->eol;

        if (count($this->subparts)) {
            $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
            $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
        }

        if (!$skip_head) {
            foreach ($this->headers as $key => $value) {
                fwrite($fh, $key . ': ' . $value . $eol);
            }
            $f_eol = $eol;
        } else {
            $f_eol = '';
        }

        if (count($this->subparts)) {
            if ($this->preamble) {
                fwrite($fh, $f_eol . $this->preamble . $eol);
                $f_eol = $eol;
            }

            for ($i = 0; $i < count($this->subparts); $i++) {
                fwrite($fh, $f_eol . '--' . $boundary . $eol);
                $res = $this->subparts[$i]->encodePartToFile($fh);
                if (is_a($res, 'PEAR_Error')) {
                    return $res;
                }
                $f_eol = $eol;
            }

            fwrite($fh, $eol . '--' . $boundary . '--' . $eol);
        } else if ($this->body) {
            fwrite($fh, $f_eol);
            fwrite($fh, $this->getEncodedData($this->body, $this->encoding));
        } else if ($this->body_file) {
            fwrite($fh, $f_eol);
            $res = $this->getEncodedDataFromFile(
                $this->body_file, $this->encoding, $fh
            );
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Adds a subpart to current mime part and returns
     * a reference to it
     *
     * @param mixed $body   The body of the subpart or Mail_mimePart object
     * @param array $params The parameters for the subpart, same
     *                      as the $params argument for constructor
     *
     * @return Mail_mimePart A reference to the part you just added.
     */
    public function addSubpart($body, $params = null)
    {
        if ($body instanceof Mail_mimePart) {
            $part = $body;
        } else {
            $part = new Mail_mimePart($body, $params);
        }

        $this->subparts[] = $part;

        return $part;
    }

    /**
     * Returns encoded data based upon encoding passed to it
     *
     * @param string $data     The data to encode.
     * @param string $encoding The encoding type to use, 7bit, base64,
     *                         or quoted-printable.
     *
     * @return string Encoded data string
     */
    protected function getEncodedData($data, $encoding)
    {
        switch ($encoding) {
        case 'quoted-printable':
            return self::quotedPrintableEncode($data, 76, $this->eol);
            break;

        case 'base64':
            return rtrim(chunk_split(base64_encode($data), 76, $this->eol));
            break;

        case '8bit':
        case '7bit':
        default:
            return $data;
        }
    }

    /**
     * Returns encoded data based upon encoding passed to it
     *
     * @param string   $filename Data file location
     * @param string   $encoding The encoding type to use, 7bit, base64,
     *                           or quoted-printable.
     * @param resource $fh       Output file handle. If set, data will be
     *                           stored into it instead of returning it
     *
     * @return string Encoded data or PEAR error object
     */
    protected function getEncodedDataFromFile($filename, $encoding, $fh = null)
    {
        if (!is_readable($filename)) {
            $err = self::raiseError('Unable to read file: ' . $filename);
            return $err;
        }

        if (!($fd = fopen($filename, 'rb'))) {
            $err = self::raiseError('Could not open file: ' . $filename);
            return $err;
        }

        $data = '';

        switch ($encoding) {
        case 'quoted-printable':
            while (!feof($fd)) {
                $buffer = self::quotedPrintableEncode(fgets($fd), 76, $this->eol);
                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
            break;

        case 'base64':
            while (!feof($fd)) {
                // Should read in a multiple of 57 bytes so that
                // the output is 76 bytes per line. Don't use big chunks
                // because base64 encoding is memory expensive
                $buffer = fread($fd, 57 * 9198); // ca. 0.5 MB
                $buffer = base64_encode($buffer);
                $buffer = chunk_split($buffer, 76, $this->eol);
                if (feof($fd)) {
                    $buffer = rtrim($buffer);
                }

                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
            break;

        case '8bit':
        case '7bit':
        default:
            while (!feof($fd)) {
                $buffer = fread($fd, 1048576); // 1 MB
                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
        }

        fclose($fd);

        if (!$fh) {
            return $data;
        }
    }

    /**
     * Encodes data to quoted-printable standard.
     *
     * @param string $input    The data to encode
     * @param int    $line_max Optional max line length. Should
     *                         not be more than 76 chars
     * @param string $eol      End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded data
     */
    public static function quotedPrintableEncode($input , $line_max = 76, $eol = "\r\n")
    {
        /*
        // imap_8bit() is extremely fast, but doesn't handle properly some characters
        if (function_exists('imap_8bit') && $line_max == 76) {
            $input = preg_replace('/\r?\n/', "\r\n", $input);
            $input = imap_8bit($input);
            if ($eol != "\r\n") {
                $input = str_replace("\r\n", $eol, $input);
            }
            return $input;
        }
        */
        $lines  = preg_split("/\r?\n/", $input);
        $escape = '=';
        $output = '';

        foreach ($lines as $idx => $line) {
            $newline = '';
            $i = 0;

            while (isset($line[$i])) {
                $char = $line[$i];
                $dec  = ord($char);
                $i++;

                if (($dec == 32) && (!isset($line[$i]))) {
                    // convert space at eol only
                    $char = '=20';
                } elseif ($dec == 9 && isset($line[$i])) {
                    ; // Do nothing if a TAB is not on eol
                } elseif (($dec == 61) || ($dec < 32) || ($dec > 126)) {
                    // Escape unprintable chars
                    $char = $escape . sprintf('%02X', $dec);
                } elseif (($dec == 46) && (($newline == '')
                    || ((strlen($newline) + strlen(".=")) > $line_max
                    && isset($line[$i])))
                ) {
                    // Bug #9722: convert full-stop at bol,
                    // some Windows servers need this, won't break anything (cipri)
                    // Bug #11731: full-stop at bol also needs to be encoded
                    // if this line would push us over the line_max limit.
                    $char = '=2E';
                }

                // EOL is not counted
                if ((strlen($newline) + strlen($char) == $line_max)
                    && !isset($line[$i])
                ) {
                    ; // no soft break is needed if we're the last char
                } elseif ((strlen($newline) + strlen($char)) >= $line_max) {
                    // soft line break; " =\r\n" is okay
                    $output  .= $newline . $escape . $eol;
                    $newline  = '';
                }

                $newline .= $char;
            } // end of for

            $output .= $newline . $eol;
            unset($lines[$idx]);
        }

        // Don't want last crlf
        $output = substr($output, 0, -1 * strlen($eol));

        return $output;
    }

    /**
     * Encodes the parameter of a header.
     *
     * @param string $name      The name of the header-parameter
     * @param string $value     The value of the paramter
     * @param string $charset   The characterset of $value
     * @param string $language  The language used in $value
     * @param string $encoding  Parameter encoding. If not set, parameter value
     *                          is encoded according to RFC2231
     * @param int    $maxLength The maximum length of a line. Defauls to 75
     *
     * @return string
     */
    protected function buildHeaderParam($name, $value, $charset = null,
        $language = null, $encoding = null, $maxLength = 75
    ) {
        // RFC 2045:
        // value needs encoding if contains non-ASCII chars or is longer than 78 chars
        if (!preg_match('#[^\x20-\x7E]#', $value)) {
            $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
                . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
            if (!preg_match($token_regexp, $value)) {
                // token
                if (strlen($name) + strlen($value) + 3 <= $maxLength) {
                    return " {$name}={$value}";
                }
            } else {
                // quoted-string
                $quoted = addcslashes($value, '\\"');
                if (strlen($name) + strlen($quoted) + 5 <= $maxLength) {
                    return " {$name}=\"{$quoted}\"";
                }
            }
        }

        // RFC2047: use quoted-printable/base64 encoding
        if ($encoding == 'quoted-printable' || $encoding == 'base64') {
            return $this->buildRFC2047Param($name, $value, $charset, $encoding);
        }

        // RFC2231:
        $encValue = preg_replace_callback(
            '/([^\x21\x23\x24\x26\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])/',
            array($this, 'encodeReplaceCallback'), $value
        );
        $value = "$charset'$language'$encValue";

        $header = " {$name}*={$value}";
        if (strlen($header) <= $maxLength) {
            return $header;
        }

        $preLength = strlen(" {$name}*0*=");
        $maxLength = max(16, $maxLength - $preLength - 3);
        $maxLengthReg = "|(.{0,$maxLength}[^\%][^\%])|";

        $headers = array();
        $headCount = 0;
        while ($value) {
            $matches = array();
            $found = preg_match($maxLengthReg, $value, $matches);
            if ($found) {
                $headers[] = " {$name}*{$headCount}*={$matches[0]}";
                $value = substr($value, strlen($matches[0]));
            } else {
                $headers[] = " {$name}*{$headCount}*={$value}";
                $value = '';
            }
            $headCount++;
        }

        $headers = implode(';' . $this->eol, $headers);
        return $headers;
    }

    /**
     * Encodes header parameter as per RFC2047 if needed
     *
     * @param string $name      The parameter name
     * @param string $value     The parameter value
     * @param string $charset   The parameter charset
     * @param string $encoding  Encoding type (quoted-printable or base64)
     * @param int    $maxLength Encoded parameter max length. Default: 76
     *
     * @return string Parameter line
     */
    protected function buildRFC2047Param($name, $value, $charset,
        $encoding = 'quoted-printable', $maxLength = 76
    ) {
        // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in
        // parameter of a MIME Content-Type or Content-Disposition field",
        // but... it's supported by many clients/servers
        $quoted = '';

        if ($encoding == 'base64') {
            $value = base64_encode($value);
            $prefix = '=?' . $charset . '?B?';
            $suffix = '?=';

            // 2 x SPACE, 2 x '"', '=', ';'
            $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
            $len = $add_len + strlen($value);

            while ($len > $maxLength) { 
                // We can cut base64-encoded string every 4 characters
                $real_len = floor(($maxLength - $add_len) / 4) * 4;
                $_quote = substr($value, 0, $real_len);
                $value = substr($value, $real_len);

                $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
                $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
                $len = strlen($value) + $add_len;
            }
            $quoted .= $prefix . $value . $suffix;

        } else {
            // quoted-printable
            $value = $this->encodeQP($value);
            $prefix = '=?' . $charset . '?Q?';
            $suffix = '?=';

            // 2 x SPACE, 2 x '"', '=', ';'
            $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
            $len = $add_len + strlen($value);

            while ($len > $maxLength) {
                $length = $maxLength - $add_len;
                // don't break any encoded letters
                if (preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) {
                    $_quote = $matches[1];
                }

                $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
                $value = substr($value, strlen($_quote));
                $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
                $len = strlen($value) + $add_len;
            }

            $quoted .= $prefix . $value . $suffix;
        }

        return " {$name}=\"{$quoted}\"";
    }

    /**
     * Return charset for mbstring functions.
     * Replace ISO-2022-JP with ISO-2022-JP-MS to convert Windows dependent
     * characters.
     *
     * @param string $charset A original charset
     *
     * @return string A charset for mbstring
     * @since  1.10.8
     */
    protected static function mbstringCharset($charset)
    {
        $mb_charset = $charset;

        if ($charset == 'ISO-2022-JP') {
            $mb_charset = 'ISO-2022-JP-MS';
        }

        return $mb_charset;
    }

    /**
     * Encodes a header as per RFC2047
     *
     * @param string $name     The header name
     * @param string $value    The header data to encode
     * @param string $charset  Character set name
     * @param string $encoding Encoding name (base64 or quoted-printable)
     * @param string $eol      End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded header data (without a name)
     * @since  1.6.1
     */
    public static function encodeHeader($name, $value, $charset = 'ISO-8859-1',
        $encoding = 'quoted-printable', $eol = "\r\n"
    ) {
        // Structured headers
        $comma_headers = array(
            'from', 'to', 'cc', 'bcc', 'sender', 'reply-to',
            'resent-from', 'resent-to', 'resent-cc', 'resent-bcc',
            'resent-sender', 'resent-reply-to',
            'mail-reply-to', 'mail-followup-to',
            'return-receipt-to', 'disposition-notification-to',
        );
        $other_headers = array(
            'references', 'in-reply-to', 'message-id', 'resent-message-id',
        );

        $name = strtolower($name);

        if (in_array($name, $comma_headers)) {
            $separator = ',';
        } else if (in_array($name, $other_headers)) {
            $separator = ' ';
        }

        if (!$charset) {
            $charset = 'ISO-8859-1';
        }

        // exploding quoted strings as well as some regexes below do not
        // work properly with some charset e.g. ISO-2022-JP, we'll use UTF-8
        $mb = $charset != 'UTF-8' && function_exists('mb_convert_encoding');
        $mb_charset = Mail_mimePart::mbstringCharset($charset);

        // Structured header (make sure addr-spec inside is not encoded)
        if (!empty($separator)) {
            // Simple e-mail address regexp
            $email_regexp = '([^\s<]+|("[^\r\n"]+"))@[^\s"]+';

            if ($mb) {
                $value = mb_convert_encoding($value, 'UTF-8', $mb_charset);
            }

            $parts = Mail_mimePart::explodeQuotedString("[\t$separator]", $value);
            $value = '';

            foreach ($parts as $part) {
                $part = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $part);
                $part = trim($part);

                if (!$part) {
                    continue;
                }
                if ($value) {
                    $value .= $separator == ',' ? $separator . ' ' : ' ';
                } else {
                    $value = $name . ': ';
                }

                // let's find phrase (name) and/or addr-spec
                if (preg_match('/^<' . $email_regexp . '>$/', $part)) {
                    $value .= $part;
                } else if (preg_match('/^' . $email_regexp . '$/', $part)) {
                    // address without brackets and without name
                    $value .= $part;
                } else if (preg_match('/<*' . $email_regexp . '>*$/', $part, $matches)) {
                    // address with name (handle name)
                    $address = $matches[0];
                    $word    = str_replace($address, '', $part);
                    $word    = trim($word);

                    // check if phrase requires quoting
                    if ($word) {
                        // non-ASCII: require encoding
                        if (preg_match('#([^\s\x21-\x7E]){1}#', $word)) {
                            if ($word[0] == '"' && $word[strlen($word)-1] == '"') {
                                // de-quote quoted-string, encoding changes
                                // string to atom
                                $word = substr($word, 1, -1);
                                $word = preg_replace('/\\\\([\\\\"])/', '$1', $word);
                            }
                            if ($mb) {
                                $word = mb_convert_encoding($word, $mb_charset, 'UTF-8');
                            }

                            // find length of last line
                            if (($pos = strrpos($value, $eol)) !== false) {
                                $last_len = strlen($value) - $pos;
                            } else {
                                $last_len = strlen($value);
                            }

                            $word = Mail_mimePart::encodeHeaderValue(
                                $word, $charset, $encoding, $last_len, $eol
                            );
                        } else if (($word[0] != '"' || $word[strlen($word)-1] != '"')
                            && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $word)
                        ) {
                            // ASCII: quote string if needed
                            $word = '"'.addcslashes($word, '\\"').'"';
                        }
                    }

                    $value .= $word.' '.$address;
                } else {
                    if ($mb) {
                        $part = mb_convert_encoding($part, $mb_charset, 'UTF-8');
                    }
                    // addr-spec not found, don't encode (?)
                    $value .= $part;
                }

                // RFC2822 recommends 78 characters limit, use 76 from RFC2047
                $value = wordwrap($value, 76, $eol . ' ');
            }

            // remove header name prefix (there could be EOL too)
            $value = preg_replace(
                '/^'.$name.':('.preg_quote($eol, '/').')* /', '', $value
            );
        } else {
            // Unstructured header
            // non-ASCII: require encoding
            if (preg_match('#([^\s\x21-\x7E]){1}#', $value)) {
                if ($value[0] == '"' && $value[strlen($value)-1] == '"') {
                    if ($mb) {
                        $value = mb_convert_encoding($value, 'UTF-8', $mb_charset);
                    }
                    // de-quote quoted-string, encoding changes
                    // string to atom
                    $value = substr($value, 1, -1);
                    $value = preg_replace('/\\\\([\\\\"])/', '$1', $value);
                    if ($mb) {
                        $value = mb_convert_encoding($value, $mb_charset, 'UTF-8');
                    }
                }

                $value = Mail_mimePart::encodeHeaderValue(
                    $value, $charset, $encoding, strlen($name) + 2, $eol
                );
            } else if (strlen($name.': '.$value) > 78) {
                // ASCII: check if header line isn't too long and use folding
                $value = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $value);
                $tmp   = wordwrap($name . ': ' . $value, 78, $eol . ' ');
                $value = preg_replace('/^' . $name . ':\s*/', '', $tmp);
                // hard limit 998 (RFC2822)
                $value = wordwrap($value, 998, $eol . ' ', true);
            }
        }

        return $value;
    }

    /**
     * Explode quoted string
     *
     * @param string $delimiter Delimiter expression string for preg_match()
     * @param string $string    Input string
     *
     * @return array String tokens array
     */
    protected static function explodeQuotedString($delimiter, $string)
    {
        $result = array();
        $strlen = strlen($string);
        $quoted_string = '"(?:[^"\\\\]|\\\\.)*"';

        for ($p=$i=0; $i < $strlen; $i++) {
            if ($string[$i] === '"') {
                $r = preg_match("/$quoted_string/", $string, $matches, 0, $i);
                if (!$r || empty($matches[0])) {
                    break;
                }
                $i += strlen($matches[0]) - 1;
            } else if (preg_match("/$delimiter/", $string[$i])) {
                $result[] = substr($string, $p, $i - $p);
                $p = $i + 1;
            }
        }
        $result[] = substr($string, $p);
        return $result;
    }

    /**
     * Encodes a header value as per RFC2047
     *
     * @param string $value      The header data to encode
     * @param string $charset    Character set name
     * @param string $encoding   Encoding name (base64 or quoted-printable)
     * @param int    $prefix_len Prefix length. Default: 0
     * @param string $eol        End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded header data
     * @since  1.6.1
     */
    public static function encodeHeaderValue($value, $charset, $encoding, $prefix_len = 0, $eol = "\r\n")
    {
        // #17311: Use multibyte aware method (requires mbstring extension)
        if ($result = Mail_mimePart::encodeMB($value, $charset, $encoding, $prefix_len, $eol)) {
            return $result;
        }

        // Generate the header using the specified params and dynamicly
        // determine the maximum length of such strings.
        // 75 is the value specified in the RFC.
        $encoding = $encoding == 'base64' ? 'B' : 'Q';
        $prefix = '=?' . $charset . '?' . $encoding .'?';
        $suffix = '?=';
        $maxLength = 75 - strlen($prefix . $suffix);
        $maxLength1stLine = $maxLength - $prefix_len;

        if ($encoding == 'B') {
            // Base64 encode the entire string
            $value = base64_encode($value);

            // We can cut base64 every 4 characters, so the real max
            // we can get must be rounded down.
            $maxLength = $maxLength - ($maxLength % 4);
            $maxLength1stLine = $maxLength1stLine - ($maxLength1stLine % 4);

            $cutpoint = $maxLength1stLine;
            $output = '';

            while ($value) {
                // Split translated string at every $maxLength
                $part = substr($value, 0, $cutpoint);
                $value = substr($value, $cutpoint);
                $cutpoint = $maxLength;
                // RFC 2047 specifies that any split header should
                // be separated by a CRLF SPACE.
                if ($output) {
                    $output .= $eol . ' ';
                }
                $output .= $prefix . $part . $suffix;
            }
            $value = $output;
        } else {
            // quoted-printable encoding has been selected
            $value = Mail_mimePart::encodeQP($value);

            // This regexp will break QP-encoded text at every $maxLength
            // but will not break any encoded letters.
            $reg1st = "|(.{0,$maxLength1stLine}[^\=][^\=])|";
            $reg2nd = "|(.{0,$maxLength}[^\=][^\=])|";

            if (strlen($value) > $maxLength1stLine) {
                // Begin with the regexp for the first line.
                $reg = $reg1st;
                $output = '';
                while ($value) {
                    // Split translated string at every $maxLength
                    // But make sure not to break any translated chars.
                    $found = preg_match($reg, $value, $matches);

                    // After this first line, we need to use a different
                    // regexp for the first line.
                    $reg = $reg2nd;

                    // Save the found part and encapsulate it in the
                    // prefix & suffix. Then remove the part from the
                    // $value_out variable.
                    if ($found) {
                        $part = $matches[0];
                        $len = strlen($matches[0]);
                        $value = substr($value, $len);
                    } else {
                        $part = $value;
                        $value = '';
                    }

                    // RFC 2047 specifies that any split header should
                    // be separated by a CRLF SPACE
                    if ($output) {
                        $output .= $eol . ' ';
                    }
                    $output .= $prefix . $part . $suffix;
                }
                $value = $output;
            } else {
                $value = $prefix . $value . $suffix;
            }
        }

        return $value;
    }

    /**
     * Encodes the given string using quoted-printable
     *
     * @param string $str String to encode
     *
     * @return string Encoded string
     * @since  1.6.0
     */
    public static function encodeQP($str)
    {
        // Bug #17226 RFC 2047 restricts some characters
        // if the word is inside a phrase, permitted chars are only:
        // ASCII letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_"

        // "=",  "_",  "?" must be encoded
        $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';
        $str = preg_replace_callback(
            $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $str
        );

        return str_replace(' ', '_', $str);
    }

    /**
     * Encodes the given string using base64 or quoted-printable.
     * This method makes sure that encoded-word represents an integral
     * number of characters as per RFC2047.
     *
     * @param string $str        String to encode
     * @param string $charset    Character set name
     * @param string $encoding   Encoding name (base64 or quoted-printable)
     * @param int    $prefix_len Prefix length. Default: 0
     * @param string $eol        End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded string
     * @since  1.8.0
     */
    public static function encodeMB($str, $charset, $encoding, $prefix_len=0, $eol="\r\n")
    {
        if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
            return;
        }

        $encoding = $encoding == 'base64' ? 'B' : 'Q';
        // 75 is the value specified in the RFC
        $prefix = '=?' . $charset . '?'.$encoding.'?';
        $suffix = '?=';
        $maxLength = 75 - strlen($prefix . $suffix);
        $mb_charset = Mail_mimePart::mbstringCharset($charset);

        // A multi-octet character may not be split across adjacent encoded-words
        // So, we'll loop over each character
        // mb_stlen() with wrong charset will generate a warning here and return null
        $length      = mb_strlen($str, $mb_charset);
        $result      = '';
        $line_length = $prefix_len;

        if ($encoding == 'B') {
            // base64
            $start = 0;
            $prev  = '';

            for ($i=1; $i<=$length; $i++) {
                // See #17311
                $chunk = mb_substr($str, $start, $i-$start, $mb_charset);
                $chunk = base64_encode($chunk);
                $chunk_len = strlen($chunk);

                if ($line_length + $chunk_len == $maxLength || $i == $length) {
                    if ($result) {
                        $result .= "\n";
                    }
                    $result .= $chunk;
                    $line_length = 0;
                    $start = $i;
                } else if ($line_length + $chunk_len > $maxLength) {
                    if ($result) {
                        $result .= "\n";
                    }
                    if ($prev) {
                        $result .= $prev;
                    }
                    $line_length = 0;
                    $start = $i - 1;
                } else {
                    $prev = $chunk;
                }
            }
        } else {
            // quoted-printable
            // see encodeQP()
            $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';

            for ($i=0; $i<=$length; $i++) {
                $char = mb_substr($str, $i, 1, $mb_charset);
                // RFC recommends underline (instead of =20) in place of the space
                // that's one of the reasons why we're not using iconv_mime_encode()
                if ($char == ' ') {
                    $char = '_';
                    $char_len = 1;
                } else {
                    $char = preg_replace_callback(
                        $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $char
                    );
                    $char_len = strlen($char);
                }

                if ($line_length + $char_len > $maxLength) {
                    if ($result) {
                        $result .= "\n";
                    }
                    $line_length = 0;
                }

                $result      .= $char;
                $line_length += $char_len;
            }
        }

        if ($result) {
            $result = $prefix
                .str_replace("\n", $suffix.$eol.' '.$prefix, $result).$suffix;
        }

        return $result;
    }

    /**
     * Callback function to replace extended characters (\x80-xFF) with their
     * ASCII values (RFC2047: quoted-printable)
     *
     * @param array $matches Preg_replace's matches array
     *
     * @return string Encoded character string
     */
    protected static function qpReplaceCallback($matches)
    {
        return sprintf('=%02X', ord($matches[1]));
    }

    /**
     * Callback function to replace extended characters (\x80-xFF) with their
     * ASCII values (RFC2231)
     *
     * @param array $matches Preg_replace's matches array
     *
     * @return string Encoded character string
     */
    protected static function encodeReplaceCallback($matches)
    {
        return sprintf('%%%02X', ord($matches[1]));
    }

    /**
     * PEAR::raiseError implementation
     *
     * @param string $message A text error message
     *
     * @return PEAR_Error Instance of PEAR_Error
     */
    public static function raiseError($message)
    {
        // PEAR::raiseError() is not PHP 5.4 compatible
        return new PEAR_Error($message);
    }
}
pear/Mail/mimeDecode.php000064400000114671151732707760011152 0ustar00<?php
/**
 * The Mail_mimeDecode class is used to decode mail/mime messages
 *
 * This class will parse a raw mime email and return
 * the structure. Returned structure is similar to
 * that returned by imap_fetchstructure().
 *
 *  +----------------------------- IMPORTANT ------------------------------+
 *  | Usage of this class compared to native php extensions such as        |
 *  | mailparse or imap, is slow and may be feature deficient. If available|
 *  | you are STRONGLY recommended to use the php extensions.              |
 *  +----------------------------------------------------------------------+
 *
 * Compatible with PHP versions 4 and 5
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors 
 *   may be used to endorse or promote products derived from this 
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Mail
 * @package    Mail_Mime
 * @author     Richard Heyes  <richard@phpguru.org>
 * @author     George Schlossnagle <george@omniti.com>
 * @author     Cipriano Groenendal <cipri@php.net>
 * @author     Sean Coates <sean@php.net>
 * @copyright  2003-2006 PEAR <pear-group@php.net>
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version    CVS: $Id: mimeDecode.php 337165 2015-07-15 09:42:08Z alan_k $
 * @link       http://pear.php.net/package/Mail_mime
 */


/**
 * require PEAR
 *
 * This package depends on PEAR to raise errors.
 */
require_once 'PEAR.php';


/**
 * The Mail_mimeDecode class is used to decode mail/mime messages
 *
 * This class will parse a raw mime email and return the structure.
 * Returned structure is similar to that returned by imap_fetchstructure().
 *
 *  +----------------------------- IMPORTANT ------------------------------+
 *  | Usage of this class compared to native php extensions such as        |
 *  | mailparse or imap, is slow and may be feature deficient. If available|
 *  | you are STRONGLY recommended to use the php extensions.              |
 *  +----------------------------------------------------------------------+
 *
 * @category   Mail
 * @package    Mail_Mime
 * @author     Richard Heyes  <richard@phpguru.org>
 * @author     George Schlossnagle <george@omniti.com>
 * @author     Cipriano Groenendal <cipri@php.net>
 * @author     Sean Coates <sean@php.net>
 * @copyright  2003-2006 PEAR <pear-group@php.net>
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/Mail_mime
 */
class Mail_mimeDecode extends PEAR
{
    /**
     * The raw email to decode
     *
     * @var    string
     * @access private
     */
    var $_input;

    /**
     * The header part of the input
     *
     * @var    string
     * @access private
     */
    var $_header;

    /**
     * The body part of the input
     *
     * @var    string
     * @access private
     */
    var $_body;

    /**
     * If an error occurs, this is used to store the message
     *
     * @var    string
     * @access private
     */
    var $_error;

    /**
     * Flag to determine whether to include bodies in the
     * returned object.
     *
     * @var    boolean
     * @access private
     */
    var $_include_bodies;

    /**
     * Flag to determine whether to decode bodies
     *
     * @var    boolean
     * @access private
     */
    var $_decode_bodies;

    /**
     * Flag to determine whether to decode headers
     * (set to UTF8 to iconv convert headers)
     * @var    mixed 
     * @access private
     */
    var $_decode_headers;
  

    /**
     * Flag to determine whether to include attached messages
     * as body in the returned object. Depends on $_include_bodies
     *
     * @var    boolean
     * @access private
     */
    var $_rfc822_bodies;

    /**
     * Constructor.
     *
     * Sets up the object, initialise the variables, and splits and
     * stores the header and body of the input.
     *
     * @param string The input to decode
     * @access public
     */
    function __construct($input)
    {
        list($header, $body)   = $this->_splitBodyHeader($input);

        $this->_input          = $input;
        $this->_header         = $header;
        $this->_body           = $body;
        $this->_decode_bodies  = false;
        $this->_include_bodies = true;
        $this->_rfc822_bodies  = false;
    }
    // BC
    function Mail_mimeDecode($input)
    {
        $this->__construct($input);
    }
    

    /**
     * Begins the decoding process. If called statically
     * it will create an object and call the decode() method
     * of it.
     *
     * @param array An array of various parameters that determine
     *              various things:
     *              include_bodies - Whether to include the body in the returned
     *                               object.
     *              decode_bodies  - Whether to decode the bodies
     *                               of the parts. (Transfer encoding)
     *              decode_headers - Whether to decode headers,
     *                             - use "UTF8//IGNORE" to convert charset.
     *              
     *              input          - If called statically, this will be treated
     *                               as the input
     * @return object Decoded results
     * @access public
     */
    function decode($params = null)
    {
        // determine if this method has been called statically
        $isStatic = empty($this) || !is_a($this, __CLASS__);

        // Have we been called statically?
	// If so, create an object and pass details to that.
        if ($isStatic AND isset($params['input'])) {

            $obj = new Mail_mimeDecode($params['input']);
            $structure = $obj->decode($params);

        // Called statically but no input
        } elseif ($isStatic) {
            return PEAR::raiseError('Called statically and no input given');

        // Called via an object
        } else {
            $this->_include_bodies = isset($params['include_bodies']) ?
	                             $params['include_bodies'] : false;
            $this->_decode_bodies  = isset($params['decode_bodies']) ?
	                             $params['decode_bodies']  : false;
            $this->_decode_headers = isset($params['decode_headers']) ?
	                             $params['decode_headers'] : false;
            $this->_rfc822_bodies  = isset($params['rfc_822bodies']) ?
	                             $params['rfc_822bodies']  : false;
                                 
            if (is_string($this->_decode_headers) && !function_exists('iconv')) {
                 PEAR::raiseError('header decode conversion requested, however iconv is missing');
            }
                                 
            $structure = $this->_decode($this->_header, $this->_body);
            if ($structure === false) {
                $structure = $this->raiseError($this->_error);
            }
        }
    
        return $structure;
    }

    /**
     * Performs the decoding. Decodes the body string passed to it
     * If it finds certain content-types it will call itself in a
     * recursive fashion
     *
     * @param string Header section
     * @param string Body section
     * @return object Results of decoding process
     * @access private
     */
    function _decode($headers, $body, $default_ctype = 'text/plain')
    {
        $return = new stdClass;
        $return->headers = array();
        $headers = $this->_parseHeaders($headers);

        foreach ($headers as $value) {
            $value['value'] =  $this->_decodeHeader($value['value']);
            if (isset($return->headers[strtolower($value['name'])]) AND !is_array($return->headers[strtolower($value['name'])])) {
                $return->headers[strtolower($value['name'])]   = array($return->headers[strtolower($value['name'])]);
                $return->headers[strtolower($value['name'])][] = $value['value'];

            } elseif (isset($return->headers[strtolower($value['name'])])) {
                $return->headers[strtolower($value['name'])][] = $value['value'];

            } else {
                $return->headers[strtolower($value['name'])] = $value['value'];
            }
        }


        foreach ($headers as $key => $value) {
            $headers[$key]['name'] = strtolower($headers[$key]['name']);
            switch ($headers[$key]['name']) {

                case 'content-type':
                    $content_type = $this->_parseHeaderValue($headers[$key]['value']);

                    if (preg_match('/([0-9a-z+.-]+)\/([0-9a-z+.-]+)/i', $content_type['value'], $regs)) {
                        $return->ctype_primary   = $regs[1];
                        $return->ctype_secondary = $regs[2];
                    }

                    if (isset($content_type['other'])) {
                        foreach($content_type['other'] as $p_name => $p_value) {
                            $return->ctype_parameters[$p_name] = $p_value;
                        }
                    }
                    break;

                case 'content-disposition':
                    $content_disposition = $this->_parseHeaderValue($headers[$key]['value']);
                    $return->disposition   = $content_disposition['value'];
                    if (isset($content_disposition['other'])) {
                        foreach($content_disposition['other'] as $p_name => $p_value) {
                            $return->d_parameters[$p_name] = $p_value;
                        }
                    }
                    break;

                case 'content-transfer-encoding':
                    $content_transfer_encoding = $this->_parseHeaderValue($headers[$key]['value']);
                    break;
            }
        }

        if (isset($content_type)) {
            switch (strtolower($content_type['value'])) {
                case 'text/plain':
                    $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
                    break;

                case 'text/html':
                    $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
                    break;
                
                case 'multipart/signed': // PGP
                    $parts = $this->_boundarySplit($body, $content_type['other']['boundary'], true);
                    $return->parts['msg_body'] = $parts[0]; 
                    list($part_header, $part_body) = $this->_splitBodyHeader($parts[1]);
                    $return->parts['sig_hdr'] = $part_header;
                    $return->parts['sig_body'] = $part_body;
                    break;

                case 'multipart/parallel':
                case 'multipart/appledouble': // Appledouble mail
                case 'multipart/report': // RFC1892
                case 'multipart/signed': // PGP
                case 'multipart/digest':
                case 'multipart/alternative':
                case 'multipart/related':
                case 'multipart/relative': //#20431 - android
                case 'multipart/mixed':
                case 'application/vnd.wap.multipart.related':
                    if(!isset($content_type['other']['boundary'])){
                        $this->_error = 'No boundary found for ' . $content_type['value'] . ' part';
                        return false;
                    }

                    $default_ctype = (strtolower($content_type['value']) === 'multipart/digest') ? 'message/rfc822' : 'text/plain';

                    $parts = $this->_boundarySplit($body, $content_type['other']['boundary']);
                    for ($i = 0; $i < count($parts); $i++) {
                        list($part_header, $part_body) = $this->_splitBodyHeader($parts[$i]);
                        $part = $this->_decode($part_header, $part_body, $default_ctype);
                        if($part === false)
                            $part = $this->raiseError($this->_error);
                        $return->parts[] = $part;
                    }
                    break;

                case 'message/rfc822':
                case 'message/delivery-status': // #bug #18693
					if ($this->_rfc822_bodies) {
						$encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
						$return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body);
					}
                    $obj = new Mail_mimeDecode($body);
                    $return->parts[] = $obj->decode(array('include_bodies' => $this->_include_bodies,
					                                      'decode_bodies'  => $this->_decode_bodies,
														  'decode_headers' => $this->_decode_headers));
                    unset($obj);
                    break;

                default:
                    if(!isset($content_transfer_encoding['value']))
                        $content_transfer_encoding['value'] = '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $content_transfer_encoding['value']) : $body) : null;
                    break;
            }

        } else {
            $ctype = explode('/', $default_ctype);
            $return->ctype_primary   = $ctype[0];
            $return->ctype_secondary = $ctype[1];
            $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body) : $body) : null;
        }

        return $return;
    }

    /**
     * Given the output of the above function, this will return an
     * array of references to the parts, indexed by mime number.
     *
     * @param  object $structure   The structure to go through
     * @param  string $mime_number Internal use only.
     * @return array               Mime numbers
     */
    function &getMimeNumbers(&$structure, $no_refs = false, $mime_number = '', $prepend = '')
    {
        $return = array();
        if (!empty($structure->parts)) {
            if ($mime_number != '') {
                $structure->mime_id = $prepend . $mime_number;
                $return[$prepend . $mime_number] = &$structure;
            }
            for ($i = 0; $i < count($structure->parts); $i++) {

            
                if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') {
                    $prepend      = $prepend . $mime_number . '.';
                    $_mime_number = '';
                } else {
                    $_mime_number = ($mime_number == '' ? $i + 1 : sprintf('%s.%s', $mime_number, $i + 1));
                }

                $arr = &Mail_mimeDecode::getMimeNumbers($structure->parts[$i], $no_refs, $_mime_number, $prepend);
                foreach ($arr as $key => $val) {
                    $no_refs ? $return[$key] = '' : $return[$key] = &$arr[$key];
                }
            }
        } else {
            if ($mime_number == '') {
                $mime_number = '1';
            }
            $structure->mime_id = $prepend . $mime_number;
            $no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure;
        }
        
        return $return;
    }

    /**
     * Given a string containing a header and body
     * section, this function will split them (at the first
     * blank line) and return them.
     *
     * @param string Input to split apart
     * @return array Contains header and body section
     * @access private
     */
    function _splitBodyHeader($input)
    {
        if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) {
            return array($match[1], $match[2]);
        }
        // bug #17325 - empty bodies are allowed. - we just check that at least one line 
        // of headers exist..
        if (count(explode("\n",$input))) {
            return array($input, '');
        }
        $this->_error = 'Could not split header and body';
        return false;
    }

    /**
     * Parse headers given in $input and return
     * as assoc array.
     *
     * @param string Headers to parse
     * @return array Contains parsed headers
     * @access private
     */
    function _parseHeaders($input)
    {

        if ($input !== '') {
            // Unfold the input
            $input   = preg_replace("/\r?\n/", "\r\n", $input);
            //#7065 - wrapping.. with encoded stuff.. - probably not needed,
            // wrapping space should only get removed if the trailing item on previous line is a 
            // encoded character
            $input   = preg_replace("/=\r\n(\t| )+/", '=', $input);
            $input   = preg_replace("/\r\n(\t| )+/", ' ', $input);
            
            $headers = explode("\r\n", trim($input));
            $got_start = false;
            foreach ($headers as $value) {
                if (!$got_start) {
                    // munge headers for mbox style from
                    if ($value[0] == '>') {
                        $value = substring($value, 1); // remove mbox >
                    }
                    if (substr($value,0,5) == 'From ') {
                        $value = 'Return-Path: ' . substr($value, 5);
                    } else {
                        $got_start = true;
                    }
                }
                
                $hdr_name = substr($value, 0, $pos = strpos($value, ':'));
                $hdr_value = substr($value, $pos+1);
                if($hdr_value[0] == ' ') {
                    $hdr_value = substr($hdr_value, 1);
                }

                $return[] = array(
                                  'name'  => $hdr_name,
                                  'value' =>  $hdr_value
                                 );
            }
        } else {
            $return = array();
        }

        return $return;
    }

    /**
     * Function to parse a header value,
     * extract first part, and any secondary
     * parts (after ;) This function is not as
     * robust as it could be. Eg. header comments
     * in the wrong place will probably break it.
     *
     * Extra things this can handle
     *   filename*0=......
     *   filename*1=......
     *
     *  This is where lines are broken in, and need merging.
     *
     *   filename*0*=ENC'lang'urlencoded data.
     *   filename*1*=ENC'lang'urlencoded data.
     *
     * 
     *
     * @param string Header value to parse
     * @return array Contains parsed result
     * @access private
     */
    function _parseHeaderValue($input)
    {
         if (($pos = strpos($input, ';')) === false) {
            $input = $this->_decodeHeader($input);
            $return['value'] = trim($input);
            return $return;
        }



        $value = substr($input, 0, $pos);
        $value = $this->_decodeHeader($value);
        $return['value'] = trim($value);
        $input = trim(substr($input, $pos+1));

        if (!strlen($input) > 0) {
            return $return;
        }
        // at this point input contains xxxx=".....";zzzz="...."
        // since we are dealing with quoted strings, we need to handle this properly..
        $i = 0;
        $l = strlen($input);
        $key = '';
        $val = false; // our string - including quotes..
        $q = false; // in quote..
        $lq = ''; // last quote..

        while ($i < $l) {
            
            $c = $input[$i];
            //var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val));

            $escaped = false;
            if ($c == '\\') {
                $i++;
                if ($i == $l-1) { // end of string.
                    break;
                }
                $escaped = true;
                $c = $input[$i];
            }            


            // state - in key..
            if ($val === false) {
                if (!$escaped && $c == '=') {
                    $val = '';
                    $key = trim($key);
                    $i++;
                    continue;
                }
                if (!$escaped && $c == ';') {
                    if ($key) { // a key without a value..
                        $key= trim($key);
                        $return['other'][$key] = '';
                    }
                    $key = '';
                }
                $key .= $c;
                $i++;
                continue;
            }
                     
            // state - in value.. (as $val is set..)

            if ($q === false) {
                // not in quote yet.
                if ((!strlen($val) || $lq !== false) && $c == ' ' ||  $c == "\t") {
                    $i++;
                    continue; // skip leading spaces after '=' or after '"'
                }
                
                // do not de-quote 'xxx*= itesm.. 
                $key_is_trans = $key[strlen($key)-1] == '*';
                
                if (!$key_is_trans && !$escaped && ($c == '"' || $c == "'")) {
                    // start quoted area..
                    $q = $c;
                    // in theory should not happen raw text in value part..
                    // but we will handle it as a merged part of the string..
                    $val = !strlen(trim($val)) ? '' : trim($val);
                    $i++;
                    continue;
                }
                // got end....
                if (!$escaped && $c == ';') {
                     
                    $return['other'][$key] = trim($val);
                    $val = false;
                    $key = '';
                    $lq = false;
                    $i++;
                    continue;
                }

                $val .= $c;
                $i++;
                continue;
            }
            
            // state - in quote..
            if (!$escaped && $c == $q) {  // potential exit state..
                
                // end of quoted string..
                $lq = $q;
                $q = false;
                $i++;
                continue;
            }
                
            // normal char inside of quoted string..
            $val.= $c;
            $i++;
        }
        
        // do we have anything left..
        if (strlen(trim($key)) || $val !== false) {
           
            $val = trim($val);
          
            $return['other'][$key] = $val;
        }
       
        
        $clean_others = array();
        // merge added values. eg. *1[*]
        foreach($return['other'] as $key =>$val) {
            if (preg_match('/\*[0-9]+\**$/', $key)) {
                $key = preg_replace('/(.*)\*[0-9]+(\**)$/', '\1\2', $key);
                if (isset($clean_others[$key])) {
                    $clean_others[$key] .= $val;
                    continue;
                }
                
            }
            $clean_others[$key] = $val;
            
        }
         
        // handle language translation of '*' ending others.
        foreach( $clean_others as $key =>$val) {
            if ( $key[strlen($key)-1] != '*') {
                $clean_others[strtolower($key)] = $val;
                continue;
            }
            unset($clean_others[$key]);
            $key = substr($key,0,-1);
            //extended-initial-value := [charset] "'" [language] "'"
            //              extended-other-values
            $match = array();
            $info = preg_match("/^([^']+)'([^']*)'(.*)$/", $val, $match);
             
            $clean_others[$key] = urldecode($match[3]);
            $clean_others[strtolower($key)] = $clean_others[$key];
            $clean_others[strtolower($key).'-charset'] = $match[1];
            $clean_others[strtolower($key).'-language'] = $match[2];
            
            
        }
        
        
        $return['other'] = $clean_others;
        
        // decode values.
        foreach($return['other'] as $key =>$val) {
            $charset = isset($return['other'][$key . '-charset']) ?
                $return['other'][$key . '-charset']  : false;
            
            $return['other'][$key] = $this->_decodeHeader($val, $charset);
        }
        
        return $return;
    }

    /**
     * This function splits the input based
     * on the given boundary
     *
     * @param string Input to parse
     * @return array Contains array of resulting mime parts
     * @access private
     */
    function _boundarySplit($input, $boundary, $eatline = false)
    {
        $parts = array();

        $bs_possible = substr($boundary, 2, -2);
        $bs_check = '\"' . $bs_possible . '\"';

        if ($boundary == $bs_check) {
            $boundary = $bs_possible;
        }
        // eatline is used by multipart/signed.
        $tmp = $eatline ?
            preg_split("/\r?\n--".preg_quote($boundary, '/')."(|--)\n/", $input) :
            preg_split("/--".preg_quote($boundary, '/')."((?=\s)|--)/", $input);

        $len = count($tmp) -1;
        for ($i = 1; $i < $len; $i++) {
            if (strlen(trim($tmp[$i]))) {
                $parts[] = $tmp[$i];
            }
        }
        
        // add the last part on if it does not end with the 'closing indicator'
        if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') {
            $parts[] = $tmp[$len];
        }
        return $parts;
    }

    /**
     * Given a header, this function will decode it
     * according to RFC2047. Probably not *exactly*
     * conformant, but it does pass all the given
     * examples (in RFC2047).
     *
     * @param string Input header value to decode
     * @return string Decoded header value
     * @access private
     */
    function _decodeHeader($input, $default_charset=false)
    {
        if (!$this->_decode_headers) {
            return $input;
        }
        // Remove white space between encoded-words
        $input = preg_replace('/(=\?[^?]+\?(q|b)\?[^?]*\?=)(\s)+=\?/i', '\1=?', $input);

        // For each encoded-word...
        while (preg_match('/(=\?([^?]+)\?(q|b)\?([^?]*)\?=)/i', $input, $matches)) {

            $encoded  = $matches[1];
            $charset  = $matches[2];
            $encoding = $matches[3];
            $text     = $matches[4];

            switch (strtolower($encoding)) {
                case 'b':
                    $text = base64_decode($text);
                    break;

                case 'q':
                    $text = str_replace('_', ' ', $text);
                    preg_match_all('/=([a-f0-9]{2})/i', $text, $matches);
                    foreach($matches[1] as $value)
                        $text = str_replace('='.$value, chr(hexdec($value)), $text);
                    break;
            }
            if (is_string($this->_decode_headers)) {
                $conv = @iconv($charset, $this->_decode_headers, $text);
                $text = ($conv === false) ? $text : $conv;
            }
            $input = str_replace($encoded, $text, $input);
        }
        
        if ($default_charset  && is_string($this->_decode_headers)) {
            $conv = @iconv($charset, $this->_decode_headers, $input);
            $input = ($conv === false) ? $input : $conv;
        }
        
        return $input;
    }

    /**
     * Given a body string and an encoding type,
     * this function will decode and return it.
     *
     * @param  string Input body to decode
     * @param  string Encoding type to use.
     * @return string Decoded body
     * @access private
     */
    function _decodeBody($input, $encoding = '7bit')
    {
        switch (strtolower($encoding)) {
            case '7bit':
                return $input;
                break;

            case 'quoted-printable':
                return $this->_quotedPrintableDecode($input);
                break;

            case 'base64':
                return base64_decode($input);
                break;

            default:
                return $input;
        }
    }

    /**
     * Given a quoted-printable string, this
     * function will decode and return it.
     *
     * @param  string Input body to decode
     * @return string Decoded body
     * @access private
     */
    function _quotedPrintableDecode($input)
    {
        // Remove soft line breaks
        $input = preg_replace("/=\r?\n/", '', $input);

        // Replace encoded characters
		 
        $cb = create_function('$matches',  ' return chr(hexdec($matches[0]));');
         
        $input = preg_replace_callback( '/=([a-f0-9]{2})/i', $cb, $input);

        return $input;
    }

    /**
     * Checks the input for uuencoded files and returns
     * an array of them. Can be called statically, eg:
     *
     * $files =& Mail_mimeDecode::uudecode($some_text);
     *
     * It will check for the begin 666 ... end syntax
     * however and won't just blindly decode whatever you
     * pass it.
     *
     * @param  string Input body to look for attahcments in
     * @return array  Decoded bodies, filenames and permissions
     * @access public
     * @author Unknown
     */
    function &uudecode($input)
    {
        // Find all uuencoded sections
        preg_match_all("/begin ([0-7]{3}) (.+)\r?\n(.+)\r?\nend/Us", $input, $matches);

        for ($j = 0; $j < count($matches[3]); $j++) {

            $str      = $matches[3][$j];
            $filename = $matches[2][$j];
            $fileperm = $matches[1][$j];

            $file = '';
            $str = preg_split("/\r?\n/", trim($str));
            $strlen = count($str);

            for ($i = 0; $i < $strlen; $i++) {
                $pos = 1;
                $d = 0;
                $len=(int)(((ord(substr($str[$i],0,1)) -32) - ' ') & 077);

                while (($d + 3 <= $len) AND ($pos + 4 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20);
                    $c3 = (ord(substr($str[$i],$pos+3,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                    $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2));

                    $file .= chr(((($c2 - ' ') & 077) << 6) |  (($c3 - ' ') & 077));

                    $pos += 4;
                    $d += 3;
                }

                if (($d + 2 <= $len) && ($pos + 3 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                    $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2));

                    $pos += 3;
                    $d += 2;
                }

                if (($d + 1 <= $len) && ($pos + 2 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                }
            }
            $files[] = array('filename' => $filename, 'fileperm' => $fileperm, 'filedata' => $file);
        }

        return $files;
    }

    /**
     * getSendArray() returns the arguments required for Mail::send()
     * used to build the arguments for a mail::send() call 
     *
     * Usage:
     * $mailtext = Full email (for example generated by a template)
     * $decoder = new Mail_mimeDecode($mailtext);
     * $parts =  $decoder->getSendArray();
     * if (!PEAR::isError($parts) {
     *     list($recipents,$headers,$body) = $parts;
     *     $mail = Mail::factory('smtp');
     *     $mail->send($recipents,$headers,$body);
     * } else {
     *     echo $parts->message;
     * }
     * @return mixed   array of recipeint, headers,body or Pear_Error
     * @access public
     * @author Alan Knowles <alan@akbkhome.com>
     */
    function getSendArray()
    {
        // prevent warning if this is not set
        $this->_decode_headers = FALSE;
        $headerlist =$this->_parseHeaders($this->_header);
        $to = "";
        if (!$headerlist) {
            return $this->raiseError("Message did not contain headers");
        }
        foreach($headerlist as $item) {
            $header[$item['name']] = $item['value'];
            switch (strtolower($item['name'])) {
                case "to":
                case "cc":
                case "bcc":
                    $to .= ",".$item['value'];
                default:
                   break;
            }
        }
        if ($to == "") {
            return $this->raiseError("Message did not contain any recipents");
        }
        $to = substr($to,1);
        return array($to,$header,$this->_body);
    } 

    /**
     * Returns a xml copy of the output of
     * Mail_mimeDecode::decode. Pass the output in as the
     * argument. This function can be called statically. Eg:
     *
     * $output = $obj->decode();
     * $xml    = Mail_mimeDecode::getXML($output);
     *
     * The DTD used for this should have been in the package. Or
     * alternatively you can get it from cvs, or here:
     * http://www.phpguru.org/xmail/xmail.dtd.
     *
     * @param  object Input to convert to xml. This should be the
     *                output of the Mail_mimeDecode::decode function
     * @return string XML version of input
     * @access public
     */
    function getXML($input)
    {
        $crlf    =  "\r\n";
        $output  = '<?xml version=\'1.0\'?>' . $crlf .
                   '<!DOCTYPE email SYSTEM "http://www.phpguru.org/xmail/xmail.dtd">' . $crlf .
                   '<email>' . $crlf .
                   Mail_mimeDecode::_getXML($input) .
                   '</email>';

        return $output;
    }

    /**
     * Function that does the actual conversion to xml. Does a single
     * mimepart at a time.
     *
     * @param  object  Input to convert to xml. This is a mimepart object.
     *                 It may or may not contain subparts.
     * @param  integer Number of tabs to indent
     * @return string  XML version of input
     * @access private
     */
    function _getXML($input, $indent = 1)
    {
        $htab    =  "\t";
        $crlf    =  "\r\n";
        $output  =  '';
        $headers = @(array)$input->headers;

        foreach ($headers as $hdr_name => $hdr_value) {

            // Multiple headers with this name
            if (is_array($headers[$hdr_name])) {
                for ($i = 0; $i < count($hdr_value); $i++) {
                    $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value[$i], $indent);
                }

            // Only one header of this sort
            } else {
                $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value, $indent);
            }
        }

        if (!empty($input->parts)) {
            for ($i = 0; $i < count($input->parts); $i++) {
                $output .= $crlf . str_repeat($htab, $indent) . '<mimepart>' . $crlf .
                           Mail_mimeDecode::_getXML($input->parts[$i], $indent+1) .
                           str_repeat($htab, $indent) . '</mimepart>' . $crlf;
            }
        } elseif (isset($input->body)) {
            $output .= $crlf . str_repeat($htab, $indent) . '<body><![CDATA[' .
                       $input->body . ']]></body>' . $crlf;
        }

        return $output;
    }

    /**
     * Helper function to _getXML(). Returns xml of a header.
     *
     * @param  string  Name of header
     * @param  string  Value of header
     * @param  integer Number of tabs to indent
     * @return string  XML version of input
     * @access private
     */
    function _getXML_helper($hdr_name, $hdr_value, $indent)
    {
        $htab   = "\t";
        $crlf   = "\r\n";
        $return = '';

        $new_hdr_value = ($hdr_name != 'received') ? Mail_mimeDecode::_parseHeaderValue($hdr_value) : array('value' => $hdr_value);
        $new_hdr_name  = str_replace(' ', '-', ucwords(str_replace('-', ' ', $hdr_name)));

        // Sort out any parameters
        if (!empty($new_hdr_value['other'])) {
            foreach ($new_hdr_value['other'] as $paramname => $paramvalue) {
                $params[] = str_repeat($htab, $indent) . $htab . '<parameter>' . $crlf .
                            str_repeat($htab, $indent) . $htab . $htab . '<paramname>' . htmlspecialchars($paramname) . '</paramname>' . $crlf .
                            str_repeat($htab, $indent) . $htab . $htab . '<paramvalue>' . htmlspecialchars($paramvalue) . '</paramvalue>' . $crlf .
                            str_repeat($htab, $indent) . $htab . '</parameter>' . $crlf;
            }

            $params = implode('', $params);
        } else {
            $params = '';
        }

        $return = str_repeat($htab, $indent) . '<header>' . $crlf .
                  str_repeat($htab, $indent) . $htab . '<headername>' . htmlspecialchars($new_hdr_name) . '</headername>' . $crlf .
                  str_repeat($htab, $indent) . $htab . '<headervalue>' . htmlspecialchars($new_hdr_value['value']) . '</headervalue>' . $crlf .
                  $params .
                  str_repeat($htab, $indent) . '</header>' . $crlf;

        return $return;
    }

} // End of class
pear/Mail/mail.php000064400000014134151732707760010032 0ustar00<?php
/**
 * internal PHP-mail() implementation of the PEAR Mail:: interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org> 
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * internal PHP-mail() implementation of the PEAR Mail:: interface.
 * @package Mail
 * @version $Revision$
 */
class Mail_mail extends Mail {

    /**
     * Any arguments to pass to the mail() function.
     * @var string
     */
    var $_params = '';

    /**
     * Constructor.
     *
     * Instantiates a new Mail_mail:: object based on the parameters
     * passed in.
     *
     * @param array $params Extra arguments for the mail() function.
     */
    public function __construct($params = null)
    {
        // The other mail implementations accept parameters as arrays.
        // In the interest of being consistent, explode an array into
        // a string of parameter arguments.
        if (is_array($params)) {
            $this->_params = join(' ', $params);
        } else {
            $this->_params = $params;
        }

        /* Because the mail() function may pass headers as command
         * line arguments, we can't guarantee the use of the standard
         * "\r\n" separator.  Instead, we use the system's native line
         * separator. */
        if (defined('PHP_EOL')) {
            $this->sep = PHP_EOL;
        } else {
            $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
        }
    }

    /**
     * Implements Mail_mail::send() function using php's built-in mail()
     * command.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // If we're passed an array of recipients, implode it.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // Get the Subject out of the headers array so that we can
        // pass it as a seperate argument to mail().
        $subject = '';
        if (isset($headers['Subject'])) {
            $subject = $headers['Subject'];
            unset($headers['Subject']);
        }

        // Also remove the To: header.  The mail() function will add its own
        // To: header based on the contents of $recipients.
        unset($headers['To']);

        // Flatten the headers out.
        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list(, $text_headers) = $headerElements;

        // We only use mail()'s optional fifth parameter if the additional
        // parameters have been provided and we're not running in safe mode.
        if (empty($this->_params) || ini_get('safe_mode')) {
            $result = mail($recipients, $subject, $body, $text_headers);
        } else {
            $result = mail($recipients, $subject, $body, $text_headers,
                           $this->_params);
        }

        // If the mail() function returned failure, we need to create a
        // PEAR_Error object and return it instead of the boolean result.
        if ($result === false) {
            $result = PEAR::raiseError('mail() returned failure');
        }

        return $result;
    }

}
pear/Mail/smtpmx.php000064400000035505151732707760010445 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * SMTP MX
 *
 * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017 gERD Schaufelberger
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Mail
 * @package    Mail_smtpmx
 * @author     gERD Schaufelberger <gerd@php-tools.net>
 * @copyright  2010-2017 gERD Schaufelberger
 * @license    http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/Mail/
 */

require_once 'Net/SMTP.php';

/**
 * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 *
 * @access public
 * @author  gERD Schaufelberger <gerd@php-tools.net>
 * @package Mail
 * @version $Revision$
 */
class Mail_smtpmx extends Mail {

    /**
     * SMTP connection object.
     *
     * @var object
     * @access private
     */
    var $_smtp = null;

    /**
     * The port the SMTP server is on.
     * @var integer
     * @see getservicebyname()
     */
    var $port = 25;

    /**
     * Hostname or domain that will be sent to the remote SMTP server in the
     * HELO / EHLO message.
     *
     * @var string
     * @see posix_uname()
     */
    var $mailname = 'localhost';

    /**
     * SMTP connection timeout value.  NULL indicates no timeout.
     *
     * @var integer
     */
    var $timeout = 10;

    /**
     * use either PEAR:Net_DNS or getmxrr
     *
     * @var boolean
     */
    var $withNetDns = true;

    /**
     * PEAR:Net_DNS_Resolver
     *
     * @var object
     */
    var $resolver;

    /**
     * Whether to use VERP or not. If not a boolean, the string value
     * will be used as the VERP separators.
     *
     * @var mixed boolean or string
     */
    var $verp = false;

    /**
     * Whether to use VRFY or not.
     *
     * @var boolean $vrfy
     */
    var $vrfy = false;

    /**
     * Switch to test mode - don't send emails for real
     *
     * @var boolean $debug
     */
    var $test = false;

    /**
     * Turn on Net_SMTP debugging?
     *
     * @var boolean $peardebug
     */
    var $debug = false;

    /**
     * internal error codes
     *
     * translate internal error identifier to PEAR-Error codes and human
     * readable messages.
     *
     * @var boolean $debug
     * @todo as I need unique error-codes to identify what exactly went wrond
     *       I did not use intergers as it should be. Instead I added a "namespace"
     *       for each code. This avoids conflicts with error codes from different
     *       classes. How can I use unique error codes and stay conform with PEAR?
     */
    var $errorCode = array(
        'not_connected' => array(
            'code'  => 1,
            'msg'   => 'Could not connect to any mail server ({HOST}) at port {PORT} to send mail to {RCPT}.'
        ),
        'failed_vrfy_rcpt' => array(
            'code'  => 2,
            'msg'   => 'Recipient "{RCPT}" could not be veryfied.'
        ),
        'failed_set_from' => array(
            'code'  => 3,
            'msg'   => 'Failed to set sender: {FROM}.'
        ),
        'failed_set_rcpt' => array(
            'code'  => 4,
            'msg'   => 'Failed to set recipient: {RCPT}.'
        ),
        'failed_send_data' => array(
            'code'  => 5,
            'msg'   => 'Failed to send mail to: {RCPT}.'
        ),
        'no_from' => array(
            'code'  => 5,
            'msg'   => 'No from address has be provided.'
        ),
        'send_data' => array(
            'code'  => 7,
            'msg'   => 'Failed to create Net_SMTP object.'
        ),
        'no_mx' => array(
            'code'  => 8,
            'msg'   => 'No MX-record for {RCPT} found.'
        ),
        'no_resolver' => array(
            'code'  => 9,
            'msg'   => 'Could not start resolver! Install PEAR:Net_DNS or switch off "netdns"'
        ),
        'failed_rset' => array(
            'code'  => 10,
            'msg'   => 'RSET command failed, SMTP-connection corrupt.'
        ),
    );

    /**
     * Constructor.
     *
     * Instantiates a new Mail_smtp:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     mailname    The name of the local mail system (a valid hostname which matches the reverse lookup)
     *     port        smtp-port - the default comes from getservicebyname() and should work fine
     *     timeout     The SMTP connection timeout. Defaults to 30 seconds.
     *     vrfy        Whether to use VRFY or not. Defaults to false.
     *     verp        Whether to use VERP or not. Defaults to false.
     *     test        Activate test mode? Defaults to false.
     *     debug       Activate SMTP and Net_DNS debug mode? Defaults to false.
     *     netdns      whether to use PEAR:Net_DNS or the PHP build in function getmxrr, default is true
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @access public
     * @param array Hash containing any parameters different from the
     *              defaults.
     * @see _Mail_smtpmx()
     */
    function __construct($params)
    {
        if (isset($params['mailname'])) {
            $this->mailname = $params['mailname'];
        } else {
            // try to find a valid mailname
            if (function_exists('posix_uname')) {
                $uname = posix_uname();
                $this->mailname = $uname['nodename'];
            }
        }

        // port number
        if (isset($params['port'])) {
            $this->_port = $params['port'];
        } else {
            $this->_port = getservbyname('smtp', 'tcp');
        }

        if (isset($params['timeout'])) $this->timeout = $params['timeout'];
        if (isset($params['verp'])) $this->verp = $params['verp'];
        if (isset($params['test'])) $this->test = $params['test'];
        if (isset($params['peardebug'])) $this->test = $params['peardebug'];
        if (isset($params['netdns'])) $this->withNetDns = $params['netdns'];
    }

    /**
     * Constructor wrapper for PHP4
     *
     * @access public
     * @param array Hash containing any parameters different from the defaults
     * @see __construct()
     */
    function Mail_smtpmx($params)
    {
        $this->__construct($params);
        register_shutdown_function(array(&$this, '__destruct'));
    }

    /**
     * Destructor implementation to ensure that we disconnect from any
     * potentially-alive persistent SMTP connections.
     */
    function __destruct()
    {
        if (is_object($this->_smtp)) {
            $this->_smtp->disconnect();
            $this->_smtp = null;
        }
    }

    /**
     * Implements Mail::send() function using SMTP direct delivery
     *
     * @access public
     * @param mixed $recipients in RFC822 style or array
     * @param array $headers The array of headers to send with the mail.
     * @param string $body The full text of the message body,
     * @return mixed Returns true on success, or a PEAR_Error
     */
    function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // Prepare headers
        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list($from, $textHeaders) = $headerElements;

        // use 'Return-Path' if possible
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }
        if (!isset($from)) {
            return $this->_raiseError('no_from');
        }

        // Prepare recipients
        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            return $recipients;
        }

        foreach ($recipients as $rcpt) {
            list($user, $host) = explode('@', $rcpt);

            $mx = $this->_getMx($host);
            if (is_a($mx, 'PEAR_Error')) {
                return $mx;
            }

            if (empty($mx)) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('no_mx', $info);
            }

            $connected = false;
            foreach ($mx as $mserver => $mpriority) {
                $this->_smtp = new Net_SMTP($mserver, $this->port, $this->mailname);

                // configure the SMTP connection.
                if ($this->debug) {
                    $this->_smtp->setDebug(true);
                }

                // attempt to connect to the configured SMTP server.
                $res = $this->_smtp->connect($this->timeout);
                if (is_a($res, 'PEAR_Error')) {
                    $this->_smtp = null;
                    continue;
                }

                // connection established
                if ($res) {
                    $connected = true;
                    break;
                }
            }

            if (!$connected) {
                $info = array(
                    'host' => implode(', ', array_keys($mx)),
                    'port' => $this->port,
                    'rcpt' => $rcpt,
                );
                return $this->_raiseError('not_connected', $info);
            }

            // Verify recipient
            if ($this->vrfy) {
                $res = $this->_smtp->vrfy($rcpt);
                if (is_a($res, 'PEAR_Error')) {
                    $info = array('rcpt' => $rcpt);
                    return $this->_raiseError('failed_vrfy_rcpt', $info);
                }
            }

            // mail from:
            $args['verp'] = $this->verp;
            $res = $this->_smtp->mailFrom($from, $args);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('from' => $from);
                return $this->_raiseError('failed_set_from', $info);
            }

            // rcpt to:
            $res = $this->_smtp->rcptTo($rcpt);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('failed_set_rcpt', $info);
            }

            // Don't send anything in test mode
            if ($this->test) {
                $result = $this->_smtp->rset();
                $res = $this->_smtp->rset();
                if (is_a($res, 'PEAR_Error')) {
                    return $this->_raiseError('failed_rset');
                }

                $this->_smtp->disconnect();
                $this->_smtp = null;
                return true;
            }

            // Send data
            $res = $this->_smtp->data($body, $textHeaders);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('failed_send_data', $info);
            }

            $this->_smtp->disconnect();
            $this->_smtp = null;
        }

        return true;
    }

    /**
     * Recieve mx rexords for a spciefied host
     *
     * The MX records
     *
     * @access private
     * @param string $host mail host
     * @return mixed sorted
     */
    function _getMx($host)
    {
        $mx = array();

        if ($this->withNetDns) {
            $res = $this->_loadNetDns();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }

            $response = $this->resolver->query($host, 'MX');
            if (!$response) {
                return false;
            }

            foreach ($response->answer as $rr) {
                if ($rr->type == 'MX') {
                    $mx[$rr->exchange] = $rr->preference;
                }
            }
        } else {
            $mxHost = array();
            $mxWeight = array();

            if (!getmxrr($host, $mxHost, $mxWeight)) {
                return false;
            }
            for ($i = 0; $i < count($mxHost); ++$i) {
                $mx[$mxHost[$i]] = $mxWeight[$i];
            }
        }

        asort($mx);
        return $mx;
    }

    /**
     * initialize PEAR:Net_DNS_Resolver
     *
     * @access private
     * @return boolean true on success
     */
    function _loadNetDns()
    {
        if (is_object($this->resolver)) {
            return true;
        }

        if (!include_once 'Net/DNS.php') {
            return $this->_raiseError('no_resolver');
        }

        $this->resolver = new Net_DNS_Resolver();
        if ($this->debug) {
            $this->resolver->test = 1;
        }

        return true;
    }

    /**
     * raise standardized error
     *
     * include additional information in error message
     *
     * @access private
     * @param string $id maps error ids to codes and message
     * @param array $info optional information in associative array
     * @see _errorCode
     */
    function _raiseError($id, $info = array())
    {
        $code = $this->errorCode[$id]['code'];
        $msg = $this->errorCode[$id]['msg'];

        // include info to messages
        if (!empty($info)) {
            $search = array();
            $replace = array();

            foreach ($info as $key => $value) {
                array_push($search, '{' . strtoupper($key) . '}');
                array_push($replace, $value);
            }

            $msg = str_replace($search, $replace, $msg);
        }

        return PEAR::raiseError($msg, $code);
    }

}
pear/Mail/smtp.php000064400000036654151732707760010106 0ustar00<?php
/**
 * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    HTTP
 * @package     HTTP_Request
 * @author      Jon Parise <jon@php.net> 
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/** Error: Failed to create a Net_SMTP object */
define('PEAR_MAIL_SMTP_ERROR_CREATE', 10000);

/** Error: Failed to connect to SMTP server */
define('PEAR_MAIL_SMTP_ERROR_CONNECT', 10001);

/** Error: SMTP authentication failure */
define('PEAR_MAIL_SMTP_ERROR_AUTH', 10002);

/** Error: No From: address has been provided */
define('PEAR_MAIL_SMTP_ERROR_FROM', 10003);

/** Error: Failed to set sender */
define('PEAR_MAIL_SMTP_ERROR_SENDER', 10004);

/** Error: Failed to add recipient */
define('PEAR_MAIL_SMTP_ERROR_RECIPIENT', 10005);

/** Error: Failed to send data */
define('PEAR_MAIL_SMTP_ERROR_DATA', 10006);

/**
 * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_smtp extends Mail {

    /**
     * SMTP connection object.
     *
     * @var object
     * @access private
     */
    var $_smtp = null;

    /**
     * The list of service extension parameters to pass to the Net_SMTP
     * mailFrom() command.
     *
     * @var array
     */
    var $_extparams = array();

    /**
     * The SMTP host to connect to.
     *
     * @var string
     */
    var $host = 'localhost';

    /**
     * The port the SMTP server is on.
     *
     * @var integer
     */
    var $port = 25;

    /**
     * Should SMTP authentication be used?
     *
     * This value may be set to true, false or the name of a specific
     * authentication method.
     *
     * If the value is set to true, the Net_SMTP package will attempt to use
     * the best authentication method advertised by the remote SMTP server.
     *
     * @var mixed
     */
    var $auth = false;

    /**
     * The username to use if the SMTP server requires authentication.
     *
     * @var string
     */
    var $username = '';

    /**
     * The password to use if the SMTP server requires authentication.
     *
     * @var string
     */
    var $password = '';

    /**
     * Hostname or domain that will be sent to the remote SMTP server in the
     * HELO / EHLO message.
     *
     * @var string
     */
    var $localhost = 'localhost';

    /**
     * SMTP connection timeout value.  NULL indicates no timeout.
     *
     * @var integer
     */
    var $timeout = null;

    /**
     * Turn on Net_SMTP debugging?
     *
     * @var boolean $debug
     */
    var $debug = false;

    /**
     * Indicates whether or not the SMTP connection should persist over
     * multiple calls to the send() method.
     *
     * @var boolean
     */
    var $persist = false;

    /**
     * Use SMTP command pipelining (specified in RFC 2920) if the SMTP server
     * supports it. This speeds up delivery over high-latency connections. By
     * default, use the default value supplied by Net_SMTP.
     *
     * @var boolean
     */
    var $pipelining;

    /**
     * The list of socket options
     *
     * @var array
     */
    var $socket_options = array();

    /**
     * Constructor.
     *
     * Instantiates a new Mail_smtp:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     host        The server to connect to. Defaults to localhost.
     *     port        The port to connect to. Defaults to 25.
     *     auth        SMTP authentication.  Defaults to none.
     *     username    The username to use for SMTP auth. No default.
     *     password    The password to use for SMTP auth. No default.
     *     localhost   The local hostname / domain. Defaults to localhost.
     *     timeout     The SMTP connection timeout. Defaults to none.
     *     verp        Whether to use VERP or not. Defaults to false.
     *                 DEPRECATED as of 1.2.0 (use setMailParams()).
     *     debug       Activate SMTP debug mode? Defaults to false.
     *     persist     Should the SMTP connection persist?
     *     pipelining  Use SMTP command pipelining
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @param array Hash containing any parameters different from the
     *              defaults.
     */
    public function __construct($params)
    {
        if (isset($params['host'])) $this->host = $params['host'];
        if (isset($params['port'])) $this->port = $params['port'];
        if (isset($params['auth'])) $this->auth = $params['auth'];
        if (isset($params['username'])) $this->username = $params['username'];
        if (isset($params['password'])) $this->password = $params['password'];
        if (isset($params['localhost'])) $this->localhost = $params['localhost'];
        if (isset($params['timeout'])) $this->timeout = $params['timeout'];
        if (isset($params['debug'])) $this->debug = (bool)$params['debug'];
        if (isset($params['persist'])) $this->persist = (bool)$params['persist'];
        if (isset($params['pipelining'])) $this->pipelining = (bool)$params['pipelining'];
        if (isset($params['socket_options'])) $this->socket_options = $params['socket_options'];
        // Deprecated options
        if (isset($params['verp'])) {
            $this->addServiceExtensionParameter('XVERP', is_bool($params['verp']) ? null : $params['verp']);
        }
    }

    /**
     * Destructor implementation to ensure that we disconnect from any
     * potentially-alive persistent SMTP connections.
     */
    public function __destruct()
    {
        $this->disconnect();
    }

    /**
     * Implements Mail::send() function using SMTP.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (e.g., 'Subject'), and the array value
     *              is the header value (e.g., 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               MIME parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        $result = $this->send_or_fail($recipients, $headers, $body);

        /* If persistent connections are disabled, destroy our SMTP object. */
        if ($this->persist === false) {
            $this->disconnect();
        }

        return $result;
    }

    protected function send_or_fail($recipients, $headers, $body)
    {
        /* If we don't already have an SMTP object, create one. */
        $result = $this->getSMTPObject();
        if (PEAR::isError($result)) {
            return $result;
        }

        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $this->_sanitizeHeaders($headers);

        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            $this->_smtp->rset();
            return $headerElements;
        }
        list($from, $textHeaders) = $headerElements;

        /* Since few MTAs are going to allow this header to be forged
         * unless it's in the MAIL FROM: exchange, we'll use
         * Return-Path instead of From: if it's set. */
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }

        if (!isset($from)) {
            $this->_smtp->rset();
            return PEAR::raiseError('No From: address has been provided',
                                    PEAR_MAIL_SMTP_ERROR_FROM);
        }

        $params = null;
        if (!empty($this->_extparams)) {
            foreach ($this->_extparams as $key => $val) {
                $params .= ' ' . $key . (is_null($val) ? '' : '=' . $val);
            }
        }
        if (PEAR::isError($res = $this->_smtp->mailFrom($from, ltrim($params)))) {
            $error = $this->_error("Failed to set sender: $from", $res);
            $this->_smtp->rset();
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_SENDER);
        }

        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            $this->_smtp->rset();
            return $recipients;
        }

        foreach ($recipients as $recipient) {
            $res = $this->_smtp->rcptTo($recipient);
            if (is_a($res, 'PEAR_Error')) {
                $error = $this->_error("Failed to add recipient: $recipient", $res);
                $this->_smtp->rset();
                return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_RECIPIENT);
            }
        }

        /* Send the message's headers and the body as SMTP data. */
        $res = $this->_smtp->data($body, $textHeaders);
        list(,$args) = $this->_smtp->getResponse();

        if (preg_match("/ queued as (.*)/", $args, $queued)) {
            $this->queued_as = $queued[1];
        }

        /* we need the greeting; from it we can extract the authorative name of the mail server we've really connected to.
         * ideal if we're connecting to a round-robin of relay servers and need to track which exact one took the email */
        $this->greeting = $this->_smtp->getGreeting();

        if (is_a($res, 'PEAR_Error')) {
            $error = $this->_error('Failed to send data', $res);
            $this->_smtp->rset();
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_DATA);
        }

        return true;
    }

    /**
     * Connect to the SMTP server by instantiating a Net_SMTP object.
     *
     * @return mixed Returns a reference to the Net_SMTP object on success, or
     *               a PEAR_Error containing a descriptive error message on
     *               failure.
     *
     * @since  1.2.0
     */
    public function getSMTPObject()
    {
        if (is_object($this->_smtp) !== false) {
            return $this->_smtp;
        }

        include_once 'Net/SMTP.php';
        $this->_smtp = new Net_SMTP($this->host,
                                     $this->port,
                                     $this->localhost,
                                     $this->pipelining,
                                     0,
                                     $this->socket_options);

        /* If we still don't have an SMTP object at this point, fail. */
        if (is_object($this->_smtp) === false) {
            return PEAR::raiseError('Failed to create a Net_SMTP object',
                                    PEAR_MAIL_SMTP_ERROR_CREATE);
        }

        /* Configure the SMTP connection. */
        if ($this->debug) {
            $this->_smtp->setDebug(true);
        }

        /* Attempt to connect to the configured SMTP server. */
        if (PEAR::isError($res = $this->_smtp->connect($this->timeout))) {
            $error = $this->_error('Failed to connect to ' .
                                   $this->host . ':' . $this->port,
                                   $res);
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_CONNECT);
        }

        /* Attempt to authenticate if authentication has been enabled. */
        if ($this->auth) {
            $method = is_string($this->auth) ? $this->auth : '';

            if (PEAR::isError($res = $this->_smtp->auth($this->username,
                                                        $this->password,
                                                        $method))) {
                $error = $this->_error("$method authentication failure",
                                       $res);
                $this->_smtp->rset();
                return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_AUTH);
            }
        }

        return $this->_smtp;
    }

    /**
     * Add parameter associated with a SMTP service extension.
     *
     * @param string Extension keyword.
     * @param string Any value the keyword needs.
     *
     * @since 1.2.0
     */
    public function addServiceExtensionParameter($keyword, $value = null)
    {
        $this->_extparams[$keyword] = $value;
    }

    /**
     * Disconnect and destroy the current SMTP connection.
     *
     * @return boolean True if the SMTP connection no longer exists.
     *
     * @since  1.1.9
     */
    public function disconnect()
    {
        /* If we have an SMTP object, disconnect and destroy it. */
        if (is_object($this->_smtp) && $this->_smtp->disconnect()) {
            $this->_smtp = null;
        }

        /* We are disconnected if we no longer have an SMTP object. */
        return ($this->_smtp === null);
    }

    /**
     * Build a standardized string describing the current SMTP error.
     *
     * @param string $text  Custom string describing the error context.
     * @param object $error Reference to the current PEAR_Error object.
     *
     * @return string       A string describing the current SMTP error.
     *
     * @since  1.1.7
     */
    protected function _error($text, $error)
    {
        /* Split the SMTP response into a code and a response string. */
        list($code, $response) = $this->_smtp->getResponse();

        /* Build our standardized error string. */
        return $text
            . ' [SMTP: ' . $error->getMessage()
            . " (code: $code, response: $response)]";
    }

}
pear/Mail/RFC822.php000064400000075620151732707760007765 0ustar00<?php
/**
 * RFC 822 Email address list validation Utility
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2001-2017, Chuck Hagenbuch & Richard Heyes
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Richard Heyes <richard@phpguru.org>
 * @author      Chuck Hagenbuch <chuck@horde.org
 * @copyright   2001-2017 Richard Heyes
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * RFC 822 Email address list validation Utility
 *
 * What is it?
 *
 * This class will take an address string, and parse it into it's consituent
 * parts, be that either addresses, groups, or combinations. Nested groups
 * are not supported. The structure it returns is pretty straight forward,
 * and is similar to that provided by the imap_rfc822_parse_adrlist(). Use
 * print_r() to view the structure.
 *
 * How do I use it?
 *
 * $address_string = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
 * $structure = Mail_RFC822::parseAddressList($address_string, 'example.com', true)
 * print_r($structure);
 *
 * @author  Richard Heyes <richard@phpguru.org>
 * @author  Chuck Hagenbuch <chuck@horde.org>
 * @version $Revision$
 * @license BSD
 * @package Mail
 */
class Mail_RFC822 {

    /**
     * The address being parsed by the RFC822 object.
     * @var string $address
     */
    var $address = '';

    /**
     * The default domain to use for unqualified addresses.
     * @var string $default_domain
     */
    var $default_domain = 'localhost';

    /**
     * Should we return a nested array showing groups, or flatten everything?
     * @var boolean $nestGroups
     */
    var $nestGroups = true;

    /**
     * Whether or not to validate atoms for non-ascii characters.
     * @var boolean $validate
     */
    var $validate = true;

    /**
     * The array of raw addresses built up as we parse.
     * @var array $addresses
     */
    var $addresses = array();

    /**
     * The final array of parsed address information that we build up.
     * @var array $structure
     */
    var $structure = array();

    /**
     * The current error message, if any.
     * @var string $error
     */
    var $error = null;

    /**
     * An internal counter/pointer.
     * @var integer $index
     */
    var $index = null;

    /**
     * The number of groups that have been found in the address list.
     * @var integer $num_groups
     * @access public
     */
    var $num_groups = 0;

    /**
     * A variable so that we can tell whether or not we're inside a
     * Mail_RFC822 object.
     * @var boolean $mailRFC822
     */
    var $mailRFC822 = true;

    /**
    * A limit after which processing stops
    * @var int $limit
    */
    var $limit = null;

    /**
     * Sets up the object. The address must either be set here or when
     * calling parseAddressList(). One or the other.
     *
     * @param string  $address         The address(es) to validate.
     * @param string  $default_domain  Default domain/host etc. If not supplied, will be set to localhost.
     * @param boolean $nest_groups     Whether to return the structure with groups nested for easier viewing.
     * @param boolean $validate        Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
     *
     * @return object Mail_RFC822 A new Mail_RFC822 object.
     */
    public function __construct($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
    {
        if (isset($address))        $this->address        = $address;
        if (isset($default_domain)) $this->default_domain = $default_domain;
        if (isset($nest_groups))    $this->nestGroups     = $nest_groups;
        if (isset($validate))       $this->validate       = $validate;
        if (isset($limit))          $this->limit          = $limit;
    }

    /**
     * Starts the whole process. The address must either be set here
     * or when creating the object. One or the other.
     *
     * @param string  $address         The address(es) to validate.
     * @param string  $default_domain  Default domain/host etc.
     * @param boolean $nest_groups     Whether to return the structure with groups nested for easier viewing.
     * @param boolean $validate        Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
     *
     * @return array A structured array of addresses.
     */
    public function parseAddressList($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
    {
        if (!isset($this) || !isset($this->mailRFC822)) {
            $obj = new Mail_RFC822($address, $default_domain, $nest_groups, $validate, $limit);
            return $obj->parseAddressList();
        }

        if (isset($address))        $this->address        = $address;
        if (isset($default_domain)) $this->default_domain = $default_domain;
        if (isset($nest_groups))    $this->nestGroups     = $nest_groups;
        if (isset($validate))       $this->validate       = $validate;
        if (isset($limit))          $this->limit          = $limit;

        $this->structure  = array();
        $this->addresses  = array();
        $this->error      = null;
        $this->index      = null;

        // Unfold any long lines in $this->address.
        $this->address = preg_replace('/\r?\n/', "\r\n", $this->address);
        $this->address = preg_replace('/\r\n(\t| )+/', ' ', $this->address);

        while ($this->address = $this->_splitAddresses($this->address));

        if ($this->address === false || isset($this->error)) {
            require_once 'PEAR.php';
            return PEAR::raiseError($this->error);
        }

        // Validate each address individually.  If we encounter an invalid
        // address, stop iterating and return an error immediately.
        foreach ($this->addresses as $address) {
            $valid = $this->_validateAddress($address);

            if ($valid === false || isset($this->error)) {
                require_once 'PEAR.php';
                return PEAR::raiseError($this->error);
            }

            if (!$this->nestGroups) {
                $this->structure = array_merge($this->structure, $valid);
            } else {
                $this->structure[] = $valid;
            }
        }

        return $this->structure;
    }

    /**
     * Splits an address into separate addresses.
     *
     * @param string $address The addresses to split.
     * @return boolean Success or failure.
     */
    protected function _splitAddresses($address)
    {
        if (!empty($this->limit) && count($this->addresses) == $this->limit) {
            return '';
        }

        if ($this->_isGroup($address) && !isset($this->error)) {
            $split_char = ';';
            $is_group   = true;
        } elseif (!isset($this->error)) {
            $split_char = ',';
            $is_group   = false;
        } elseif (isset($this->error)) {
            return false;
        }

        // Split the string based on the above ten or so lines.
        $parts  = explode($split_char, $address);
        $string = $this->_splitCheck($parts, $split_char);

        // If a group...
        if ($is_group) {
            // If $string does not contain a colon outside of
            // brackets/quotes etc then something's fubar.

            // First check there's a colon at all:
            if (strpos($string, ':') === false) {
                $this->error = 'Invalid address: ' . $string;
                return false;
            }

            // Now check it's outside of brackets/quotes:
            if (!$this->_splitCheck(explode(':', $string), ':')) {
                return false;
            }

            // We must have a group at this point, so increase the counter:
            $this->num_groups++;
        }

        // $string now contains the first full address/group.
        // Add to the addresses array.
        $this->addresses[] = array(
                                   'address' => trim($string),
                                   'group'   => $is_group
                                   );

        // Remove the now stored address from the initial line, the +1
        // is to account for the explode character.
        $address = trim(substr($address, strlen($string) + 1));

        // If the next char is a comma and this was a group, then
        // there are more addresses, otherwise, if there are any more
        // chars, then there is another address.
        if ($is_group && substr($address, 0, 1) == ','){
            $address = trim(substr($address, 1));
            return $address;

        } elseif (strlen($address) > 0) {
            return $address;

        } else {
            return '';
        }

        // If you got here then something's off
        return false;
    }

    /**
     * Checks for a group at the start of the string.
     *
     * @param string $address The address to check.
     * @return boolean Whether or not there is a group at the start of the string.
     */
    protected function _isGroup($address)
    {
        // First comma not in quotes, angles or escaped:
        $parts  = explode(',', $address);
        $string = $this->_splitCheck($parts, ',');

        // Now we have the first address, we can reliably check for a
        // group by searching for a colon that's not escaped or in
        // quotes or angle brackets.
        if (count($parts = explode(':', $string)) > 1) {
            $string2 = $this->_splitCheck($parts, ':');
            return ($string2 !== $string);
        } else {
            return false;
        }
    }

    /**
     * A common function that will check an exploded string.
     *
     * @param array $parts The exloded string.
     * @param string $char  The char that was exploded on.
     * @return mixed False if the string contains unclosed quotes/brackets, or the string on success.
     */
    protected function _splitCheck($parts, $char)
    {
        $string = $parts[0];

        for ($i = 0; $i < count($parts); $i++) {
            if ($this->_hasUnclosedQuotes($string)
                || $this->_hasUnclosedBrackets($string, '<>')
                || $this->_hasUnclosedBrackets($string, '[]')
                || $this->_hasUnclosedBrackets($string, '()')
                || substr($string, -1) == '\\') {
                if (isset($parts[$i + 1])) {
                    $string = $string . $char . $parts[$i + 1];
                } else {
                    $this->error = 'Invalid address spec. Unclosed bracket or quotes';
                    return false;
                }
            } else {
                $this->index = $i;
                break;
            }
        }

        return $string;
    }

    /**
     * Checks if a string has unclosed quotes or not.
     *
     * @param string $string  The string to check.
     * @return boolean  True if there are unclosed quotes inside the string,
     *                  false otherwise.
     */
    protected function _hasUnclosedQuotes($string)
    {
        $string = trim($string);
        $iMax = strlen($string);
        $in_quote = false;
        $i = $slashes = 0;

        for (; $i < $iMax; ++$i) {
            switch ($string[$i]) {
            case '\\':
                ++$slashes;
                break;

            case '"':
                if ($slashes % 2 == 0) {
                    $in_quote = !$in_quote;
                }
                // Fall through to default action below.

            default:
                $slashes = 0;
                break;
            }
        }

        return $in_quote;
    }

    /**
     * Checks if a string has an unclosed brackets or not. IMPORTANT:
     * This function handles both angle brackets and square brackets;
     *
     * @param string $string The string to check.
     * @param string $chars  The characters to check for.
     * @return boolean True if there are unclosed brackets inside the string, false otherwise.
     */
    protected function _hasUnclosedBrackets($string, $chars)
    {
        $num_angle_start = substr_count($string, $chars[0]);
        $num_angle_end   = substr_count($string, $chars[1]);

        $this->_hasUnclosedBracketsSub($string, $num_angle_start, $chars[0]);
        $this->_hasUnclosedBracketsSub($string, $num_angle_end, $chars[1]);

        if ($num_angle_start < $num_angle_end) {
            $this->error = 'Invalid address spec. Unmatched quote or bracket (' . $chars . ')';
            return false;
        } else {
            return ($num_angle_start > $num_angle_end);
        }
    }

    /**
     * Sub function that is used only by hasUnclosedBrackets().
     *
     * @param string $string The string to check.
     * @param integer &$num    The number of occurences.
     * @param string $char   The character to count.
     * @return integer The number of occurences of $char in $string, adjusted for backslashes.
     */
    protected function _hasUnclosedBracketsSub($string, &$num, $char)
    {
        $parts = explode($char, $string);
        for ($i = 0; $i < count($parts); $i++){
            if (substr($parts[$i], -1) == '\\' || $this->_hasUnclosedQuotes($parts[$i]))
                $num--;
            if (isset($parts[$i + 1]))
                $parts[$i + 1] = $parts[$i] . $char . $parts[$i + 1];
        }

        return $num;
    }

    /**
     * Function to begin checking the address.
     *
     * @param string $address The address to validate.
     * @return mixed False on failure, or a structured array of address information on success.
     */
    protected function _validateAddress($address)
    {
        $is_group = false;
        $addresses = array();

        if ($address['group']) {
            $is_group = true;

            // Get the group part of the name
            $parts     = explode(':', $address['address']);
            $groupname = $this->_splitCheck($parts, ':');
            $structure = array();

            // And validate the group part of the name.
            if (!$this->_validatePhrase($groupname)){
                $this->error = 'Group name did not validate.';
                return false;
            } else {
                // Don't include groups if we are not nesting
                // them. This avoids returning invalid addresses.
                if ($this->nestGroups) {
                    $structure = new stdClass;
                    $structure->groupname = $groupname;
                }
            }

            $address['address'] = ltrim(substr($address['address'], strlen($groupname . ':')));
        }

        // If a group then split on comma and put into an array.
        // Otherwise, Just put the whole address in an array.
        if ($is_group) {
            while (strlen($address['address']) > 0) {
                $parts       = explode(',', $address['address']);
                $addresses[] = $this->_splitCheck($parts, ',');
                $address['address'] = trim(substr($address['address'], strlen(end($addresses) . ',')));
            }
        } else {
            $addresses[] = $address['address'];
        }

        // Trim the whitespace from all of the address strings.
        array_map('trim', $addresses);

        // Validate each mailbox.
        // Format could be one of: name <geezer@domain.com>
        //                         geezer@domain.com
        //                         geezer
        // ... or any other format valid by RFC 822.
        for ($i = 0; $i < count($addresses); $i++) {
            if (!$this->validateMailbox($addresses[$i])) {
                if (empty($this->error)) {
                    $this->error = 'Validation failed for: ' . $addresses[$i];
                }
                return false;
            }
        }

        // Nested format
        if ($this->nestGroups) {
            if ($is_group) {
                $structure->addresses = $addresses;
            } else {
                $structure = $addresses[0];
            }

        // Flat format
        } else {
            if ($is_group) {
                $structure = array_merge($structure, $addresses);
            } else {
                $structure = $addresses;
            }
        }

        return $structure;
    }

    /**
     * Function to validate a phrase.
     *
     * @param string $phrase The phrase to check.
     * @return boolean Success or failure.
     */
    protected function _validatePhrase($phrase)
    {
        // Splits on one or more Tab or space.
        $parts = preg_split('/[ \\x09]+/', $phrase, -1, PREG_SPLIT_NO_EMPTY);

        $phrase_parts = array();
        while (count($parts) > 0){
            $phrase_parts[] = $this->_splitCheck($parts, ' ');
            for ($i = 0; $i < $this->index + 1; $i++)
                array_shift($parts);
        }

        foreach ($phrase_parts as $part) {
            // If quoted string:
            if (substr($part, 0, 1) == '"') {
                if (!$this->_validateQuotedString($part)) {
                    return false;
                }
                continue;
            }

            // Otherwise it's an atom:
            if (!$this->_validateAtom($part)) return false;
        }

        return true;
    }

    /**
     * Function to validate an atom which from rfc822 is:
     * atom = 1*<any CHAR except specials, SPACE and CTLs>
     *
     * If validation ($this->validate) has been turned off, then
     * validateAtom() doesn't actually check anything. This is so that you
     * can split a list of addresses up before encoding personal names
     * (umlauts, etc.), for example.
     *
     * @param string $atom The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateAtom($atom)
    {
        if (!$this->validate) {
            // Validation has been turned off; assume the atom is okay.
            return true;
        }

        // Check for any char from ASCII 0 - ASCII 127
        if (!preg_match('/^[\\x00-\\x7E]+$/i', $atom, $matches)) {
            return false;
        }

        // Check for specials:
        if (preg_match('/[][()<>@,;\\:". ]/', $atom)) {
            return false;
        }

        // Check for control characters (ASCII 0-31):
        if (preg_match('/[\\x00-\\x1F]+/', $atom)) {
            return false;
        }

        return true;
    }

    /**
     * Function to validate quoted string, which is:
     * quoted-string = <"> *(qtext/quoted-pair) <">
     *
     * @param string $qstring The string to check
     * @return boolean Success or failure.
     */
    protected function _validateQuotedString($qstring)
    {
        // Leading and trailing "
        $qstring = substr($qstring, 1, -1);

        // Perform check, removing quoted characters first.
        return !preg_match('/[\x0D\\\\"]/', preg_replace('/\\\\./', '', $qstring));
    }

    /**
     * Function to validate a mailbox, which is:
     * mailbox =   addr-spec         ; simple address
     *           / phrase route-addr ; name and route-addr
     *
     * @param string &$mailbox The string to check.
     * @return boolean Success or failure.
     */
    public function validateMailbox(&$mailbox)
    {
        // A couple of defaults.
        $phrase  = '';
        $comment = '';
        $comments = array();

        // Catch any RFC822 comments and store them separately.
        $_mailbox = $mailbox;
        while (strlen(trim($_mailbox)) > 0) {
            $parts = explode('(', $_mailbox);
            $before_comment = $this->_splitCheck($parts, '(');
            if ($before_comment != $_mailbox) {
                // First char should be a (.
                $comment    = substr(str_replace($before_comment, '', $_mailbox), 1);
                $parts      = explode(')', $comment);
                $comment    = $this->_splitCheck($parts, ')');
                $comments[] = $comment;

                // +2 is for the brackets
                $_mailbox = substr($_mailbox, strpos($_mailbox, '('.$comment)+strlen($comment)+2);
            } else {
                break;
            }
        }

        foreach ($comments as $comment) {
            $mailbox = str_replace("($comment)", '', $mailbox);
        }

        $mailbox = trim($mailbox);

        // Check for name + route-addr
        if (substr($mailbox, -1) == '>' && substr($mailbox, 0, 1) != '<') {
            $parts  = explode('<', $mailbox);
            $name   = $this->_splitCheck($parts, '<');

            $phrase     = trim($name);
            $route_addr = trim(substr($mailbox, strlen($name.'<'), -1));

            if ($this->_validatePhrase($phrase) === false || ($route_addr = $this->_validateRouteAddr($route_addr)) === false) {
                return false;
            }

        // Only got addr-spec
        } else {
            // First snip angle brackets if present.
            if (substr($mailbox, 0, 1) == '<' && substr($mailbox, -1) == '>') {
                $addr_spec = substr($mailbox, 1, -1);
            } else {
                $addr_spec = $mailbox;
            }

            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        }

        // Construct the object that will be returned.
        $mbox = new stdClass();

        // Add the phrase (even if empty) and comments
        $mbox->personal = $phrase;
        $mbox->comment  = isset($comments) ? $comments : array();

        if (isset($route_addr)) {
            $mbox->mailbox = $route_addr['local_part'];
            $mbox->host    = $route_addr['domain'];
            $route_addr['adl'] !== '' ? $mbox->adl = $route_addr['adl'] : '';
        } else {
            $mbox->mailbox = $addr_spec['local_part'];
            $mbox->host    = $addr_spec['domain'];
        }

        $mailbox = $mbox;
        return true;
    }

    /**
     * This function validates a route-addr which is:
     * route-addr = "<" [route] addr-spec ">"
     *
     * Angle brackets have already been removed at the point of
     * getting to this function.
     *
     * @param string $route_addr The string to check.
     * @return mixed False on failure, or an array containing validated address/route information on success.
     */
    protected function _validateRouteAddr($route_addr)
    {
        // Check for colon.
        if (strpos($route_addr, ':') !== false) {
            $parts = explode(':', $route_addr);
            $route = $this->_splitCheck($parts, ':');
        } else {
            $route = $route_addr;
        }

        // If $route is same as $route_addr then the colon was in
        // quotes or brackets or, of course, non existent.
        if ($route === $route_addr){
            unset($route);
            $addr_spec = $route_addr;
            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        } else {
            // Validate route part.
            if (($route = $this->_validateRoute($route)) === false) {
                return false;
            }

            $addr_spec = substr($route_addr, strlen($route . ':'));

            // Validate addr-spec part.
            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        }

        if (isset($route)) {
            $return['adl'] = $route;
        } else {
            $return['adl'] = '';
        }

        $return = array_merge($return, $addr_spec);
        return $return;
    }

    /**
     * Function to validate a route, which is:
     * route = 1#("@" domain) ":"
     *
     * @param string $route The string to check.
     * @return mixed False on failure, or the validated $route on success.
     */
    protected function _validateRoute($route)
    {
        // Split on comma.
        $domains = explode(',', trim($route));

        foreach ($domains as $domain) {
            $domain = str_replace('@', '', trim($domain));
            if (!$this->_validateDomain($domain)) return false;
        }

        return $route;
    }

    /**
     * Function to validate a domain, though this is not quite what
     * you expect of a strict internet domain.
     *
     * domain = sub-domain *("." sub-domain)
     *
     * @param string $domain The string to check.
     * @return mixed False on failure, or the validated domain on success.
     */
    protected function _validateDomain($domain)
    {
        // Note the different use of $subdomains and $sub_domains
        $subdomains = explode('.', $domain);

        while (count($subdomains) > 0) {
            $sub_domains[] = $this->_splitCheck($subdomains, '.');
            for ($i = 0; $i < $this->index + 1; $i++)
                array_shift($subdomains);
        }

        foreach ($sub_domains as $sub_domain) {
            if (!$this->_validateSubdomain(trim($sub_domain)))
                return false;
        }

        // Managed to get here, so return input.
        return $domain;
    }

    /**
     * Function to validate a subdomain:
     *   subdomain = domain-ref / domain-literal
     *
     * @param string $subdomain The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateSubdomain($subdomain)
    {
        if (preg_match('|^\[(.*)]$|', $subdomain, $arr)){
            if (!$this->_validateDliteral($arr[1])) return false;
        } else {
            if (!$this->_validateAtom($subdomain)) return false;
        }

        // Got here, so return successful.
        return true;
    }

    /**
     * Function to validate a domain literal:
     *   domain-literal =  "[" *(dtext / quoted-pair) "]"
     *
     * @param string $dliteral The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateDliteral($dliteral)
    {
        return !preg_match('/(.)[][\x0D\\\\]/', $dliteral, $matches) && ((! isset($matches[1])) || $matches[1] != '\\');
    }

    /**
     * Function to validate an addr-spec.
     *
     * addr-spec = local-part "@" domain
     *
     * @param string $addr_spec The string to check.
     * @return mixed False on failure, or the validated addr-spec on success.
     */
    protected function _validateAddrSpec($addr_spec)
    {
        $addr_spec = trim($addr_spec);

        // Split on @ sign if there is one.
        if (strpos($addr_spec, '@') !== false) {
            $parts      = explode('@', $addr_spec);
            $local_part = $this->_splitCheck($parts, '@');
            $domain     = substr($addr_spec, strlen($local_part . '@'));

        // No @ sign so assume the default domain.
        } else {
            $local_part = $addr_spec;
            $domain     = $this->default_domain;
        }

        if (($local_part = $this->_validateLocalPart($local_part)) === false) return false;
        if (($domain     = $this->_validateDomain($domain)) === false) return false;

        // Got here so return successful.
        return array('local_part' => $local_part, 'domain' => $domain);
    }

    /**
     * Function to validate the local part of an address:
     *   local-part = word *("." word)
     *
     * @param string $local_part
     * @return mixed False on failure, or the validated local part on success.
     */
    protected function _validateLocalPart($local_part)
    {
        $parts = explode('.', $local_part);
        $words = array();

        // Split the local_part into words.
        while (count($parts) > 0) {
            $words[] = $this->_splitCheck($parts, '.');
            for ($i = 0; $i < $this->index + 1; $i++) {
                array_shift($parts);
            }
        }

        // Validate each word.
        foreach ($words as $word) {
            // word cannot be empty (#17317)
            if ($word === '') {
                return false;
            }
            // If this word contains an unquoted space, it is invalid. (6.2.4)
            if (strpos($word, ' ') && $word[0] !== '"')
            {
                return false;
            }

            if ($this->_validatePhrase(trim($word)) === false) return false;
        }

        // Managed to get here, so return the input.
        return $local_part;
    }

    /**
     * Returns an approximate count of how many addresses are in the
     * given string. This is APPROXIMATE as it only splits based on a
     * comma which has no preceding backslash. Could be useful as
     * large amounts of addresses will end up producing *large*
     * structures when used with parseAddressList().
     *
     * @param  string $data Addresses to count
     * @return int          Approximate count
     */
    public function approximateCount($data)
    {
        return count(preg_split('/(?<!\\\\),/', $data));
    }

    /**
     * This is a email validating function separate to the rest of the
     * class. It simply validates whether an email is of the common
     * internet form: <user>@<domain>. This can be sufficient for most
     * people. Optional stricter mode can be utilised which restricts
     * mailbox characters allowed to alphanumeric, full stop, hyphen
     * and underscore.
     *
     * @param  string  $data   Address to check
     * @param  boolean $strict Optional stricter mode
     * @return mixed           False if it fails, an indexed array
     *                         username/domain if it matches
     */
    public function isValidInetAddress($data, $strict = false)
    {
        $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
        if (preg_match($regex, trim($data), $matches)) {
            return array($matches[1], $matches[2]);
        } else {
            return false;
        }
    }

}
pear/.registry/net_smtp.reg000064400000015111151732707760011767 0ustar00a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:38:"An implementation of the SMTP protocol";s:11:"description";s:78:"Provides an implementation of the SMTP protocol using PEAR's Net_Socket class.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:10:"Jon Parise";s:4:"user";s:3:"jon";s:5:"email";s:11:"jon@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2021-03-19";s:4:"time";s:8:"18:39:33";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:47:"https://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:27:"* Add the starttls() method";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:8:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5ef820d1bc73898b55a153576953fe70";s:4:"name";s:18:"examples/basic.php";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0cd9a0c35d1ea17d46de9b5a39fb771d";s:4:"name";s:15:"tests/auth.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89135826a107455d336071f3570ccd13";s:4:"name";s:16:"tests/basic.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8517c458ae5094ee3c31a545d51c69c8";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15c9cb4ef93e0aee232b503e12fc21ee";s:4:"name";s:20:"tests/quotedata.phpt";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"00f931f5dd61430e6057f895decdb6af";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ddd7d9135cfe6e573cd757edf6855f2";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a157897ae2efc43eabd961597557243a";s:4:"name";s:12:"Net/SMTP.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}s:7:"package";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.7";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.5";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:8:{s:18:"examples/basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5ef820d1bc73898b55a153576953fe70";s:4:"name";s:18:"examples/basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:61:"/opt/alt/php73/usr/share/doc/pear/Net_SMTP/examples/basic.php";}s:15:"tests/auth.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0cd9a0c35d1ea17d46de9b5a39fb771d";s:4:"name";s:15:"tests/auth.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php73/usr/share/pear/test/Net_SMTP/tests/auth.phpt";}s:16:"tests/basic.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89135826a107455d336071f3570ccd13";s:4:"name";s:16:"tests/basic.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/test/Net_SMTP/tests/basic.phpt";}s:21:"tests/config.php.dist";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8517c458ae5094ee3c31a545d51c69c8";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:65:"/opt/alt/php73/usr/share/pear/test/Net_SMTP/tests/config.php.dist";}s:20:"tests/quotedata.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15c9cb4ef93e0aee232b503e12fc21ee";s:4:"name";s:20:"tests/quotedata.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/Net_SMTP/tests/quotedata.phpt";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"00f931f5dd61430e6057f895decdb6af";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/doc/pear/Net_SMTP/LICENSE";}s:10:"README.rst";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ddd7d9135cfe6e573cd757edf6855f2";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/doc/pear/Net_SMTP/README.rst";}s:12:"Net/SMTP.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a157897ae2efc43eabd961597557243a";s:4:"name";s:12:"Net/SMTP.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php73/usr/share/pear/Net/SMTP.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php73/usr/share/doc/pear/Net_SMTP/examples";b:1;s:42:"/opt/alt/php73/usr/share/doc/pear/Net_SMTP";b:1;s:49:"/opt/alt/php73/usr/share/pear/test/Net_SMTP/tests";b:1;s:43:"/opt/alt/php73/usr/share/pear/test/Net_SMTP";b:1;s:33:"/opt/alt/php73/usr/share/pear/Net";b:1;}s:3:"old";a:7:{s:7:"version";s:6:"1.10.0";s:12:"release_date";s:10:"2021-03-19";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:27:"* Add the starttls() method";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:10:"Net_Socket";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.0.7";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Auth_SASL";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.0.5";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:10:"Jon Parise";s:5:"email";s:11:"jon@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:3:"jon";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:3:"yes";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/file_marc.reg000064400000117050151732707770012065 0ustar00a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.9";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"File_MARC";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:38:"Parse, modify, and create MARC records";s:11:"description";s:574:"The standard for machine-readable cataloging (MARC) records is documented at http://loc.gov/marc/. This package enables you to read existing MARC records from a file, string, or (using the YAZ extension), from a Z39.50 source. You can also use this package to create new MARC records.

This package is based on the PHP MARC package, originally called "php-marc", that is part of the Emilda Project (http://www.emilda.org).  Christoffer Landtman generously agreed to make the "php-marc" code available under the GNU LGPL so it could be used as the basis of this PEAR package.";s:4:"lead";a:4:{s:4:"name";s:9:"Dan Scott";s:4:"user";s:3:"dbs";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2019-11-13";s:4:"time";s:8:"17:33:33";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:39:"http://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:33:"GNU Lesser General Public License";}s:5:"notes";s:51:"1.4.1
  * Reintroduce include_path to composer.json";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:4:"File";s:4:"name";s:1:"/";}s:4:"file";a:82:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ffe2590635f404af055fe731da105939";s:4:"name";s:27:"File/MARC/Lint/CodeData.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3b9e1c817e67f59add05593500d463e";s:4:"name";s:27:"File/MARC/Control_Field.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"acba4463f8e40d6ee4e7ba1f2dc53123";s:4:"name";s:24:"File/MARC/Data_Field.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"378f483ec1fd161cd9dfb9b05db58d66";s:4:"name";s:23:"File/MARC/Exception.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9ba69030cbf4847292b9975e9d922c6";s:4:"name";s:19:"File/MARC/Field.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c37351c7c80927ce6bb1e662510f9183";s:4:"name";s:18:"File/MARC/Lint.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c5ac39e3d25eb0108b9dd5ad8466c821";s:4:"name";s:18:"File/MARC/List.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7af6ce78cde4bb246e4e96709e90d2c0";s:4:"name";s:20:"File/MARC/Record.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"df5f97139685f0ad04e47fdbb67e3968";s:4:"name";s:22:"File/MARC/Subfield.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6e102262dfd5d65d8d5a6221dfc74edd";s:4:"name";s:13:"File/MARC.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8b64040d2d18ac4b994595a148266a66";s:4:"name";s:17:"File/MARCBASE.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f5a17a60d34e84e2ee7ca1e5c5c6c620";s:4:"name";s:16:"File/MARCXML.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6af971fd9ff5ef3e5fcba8a64a0e7a49";s:4:"name";s:20:"examples/example.mrc";s:4:"role";s:3:"doc";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"1aea40df9f1c2e32f8e065fe8da0a3b5";s:4:"name";s:21:"examples/marc_yaz.php";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"70ae317e0890d5896e3ffccdd293369a";s:4:"name";s:17:"examples/read.php";s:4:"role";s:3:"doc";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"54efb9d920ac775bfc847a83a2dec73a";s:4:"name";s:22:"examples/subfields.php";s:4:"role";s:3:"doc";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"14297da35b510c496cd1f328cf3bb301";s:4:"name";s:21:"tests/bad_example.mrc";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0dd4c6dbad6e8608d0ebf9d24425955d";s:4:"name";s:21:"tests/bad_example.xml";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"216a6f9d53f6d3d8e22d81fdc10f4bc1";s:4:"name";s:15:"tests/camel.mrc";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6af971fd9ff5ef3e5fcba8a64a0e7a49";s:4:"name";s:17:"tests/example.mrc";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"9455aec3371f79cf7d31281fd03f5171";s:4:"name";s:19:"tests/marc_001.phpt";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"577e2f5f89fd48cf1a3576a29d2958f8";s:4:"name";s:19:"tests/marc_002.phpt";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a6a586354b9a06c880c2a7470dd828d7";s:4:"name";s:19:"tests/marc_003.phpt";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b1c7e2fc5572a0f9362a771c260a1fe3";s:4:"name";s:19:"tests/marc_004.phpt";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"84f85ac7f8a2532e4e90ccde7764556a";s:4:"name";s:19:"tests/marc_005.phpt";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"889e5e906a97de7a0e94b0c5f30e70e7";s:4:"name";s:19:"tests/marc_006.phpt";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"be823dc8a8efb408de06371ab802efcc";s:4:"name";s:19:"tests/marc_007.phpt";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"af44490aafea44e5120f881cb81cdad9";s:4:"name";s:19:"tests/marc_008.phpt";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ac9f2a7aeb24900a11f5102744179ae3";s:4:"name";s:19:"tests/marc_009.phpt";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"5e43eb5cddbb4f2bd0d6405cd95b80aa";s:4:"name";s:19:"tests/marc_010.phpt";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"2e1cd8509c0bf04ec77fc0f51375f611";s:4:"name";s:19:"tests/marc_011.phpt";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"bc49ca48623102c8ac07679fa77a3dd9";s:4:"name";s:19:"tests/marc_012.phpt";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"245a3b20e0da1973535503e28efd1d3a";s:4:"name";s:19:"tests/marc_013.phpt";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ce69aa734856dd40d60d30c77bdef53a";s:4:"name";s:19:"tests/marc_014.phpt";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7b61cdd31035e60682fa92c5d519d997";s:4:"name";s:19:"tests/marc_015.phpt";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7f4f597fe1adaa3507eb87fc4875dbd2";s:4:"name";s:19:"tests/marc_016.phpt";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4262efd5fcacbd7503323681f4552430";s:4:"name";s:19:"tests/marc_017.phpt";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ee1623d7bda54ba4f741b2319b158f82";s:4:"name";s:19:"tests/marc_018.phpt";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8006c03fbab0f04377342086fafd3982";s:4:"name";s:19:"tests/marc_019.phpt";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"f5ae5b25e0ac1104314433d9e5b1f7fe";s:4:"name";s:19:"tests/marc_020.phpt";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"94d8f99e86585671a1b2d3043aeb6360";s:4:"name";s:19:"tests/marc_021.phpt";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"bb891a890effe0e77e1759043f4846d8";s:4:"name";s:19:"tests/marc_022.phpt";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"faf77dcb5cdd002c09169a14bfded65e";s:4:"name";s:19:"tests/marc_023.phpt";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0e6c4a23f5da7df64fdd4b3b1149bbee";s:4:"name";s:21:"tests/marc_16783.phpt";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4ea8b3520beda378db15960f1c50493a";s:4:"name";s:25:"tests/marc_field_001.phpt";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"743850ef61df69c4340be44a03bccb5a";s:4:"name";s:25:"tests/marc_field_002.phpt";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8c765f1398b49df257d86d22ac6e4f8d";s:4:"name";s:25:"tests/marc_field_003.phpt";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"d4216cf930a308e0d02553bd3914f294";s:4:"name";s:25:"tests/marc_field_004.phpt";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"dd59514b474b78371ad522a3e13b76b7";s:4:"name";s:25:"tests/marc_field_005.phpt";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"5295bfd02a8424acac1c91de26b552c7";s:4:"name";s:27:"tests/marc_field_21246.phpt";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6f95f09442ccf6b93df92986f58b270d";s:4:"name";s:24:"tests/marc_lint_001.phpt";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"18d721f8871edd925624ccbdd15444fb";s:4:"name";s:24:"tests/marc_lint_002.phpt";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4eb86a2f4e0a74dedcb0bf2511da6ca1";s:4:"name";s:24:"tests/marc_lint_003.phpt";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"10430fee0a1352d0528f1507b34c57e1";s:4:"name";s:24:"tests/marc_lint_004.phpt";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0dcd07a18577d7b22392a2214cd6436c";s:4:"name";s:24:"tests/marc_lint_005.phpt";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fd17798fc535562e5e64461f449516b2";s:4:"name";s:26:"tests/marc_record_001.phpt";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"141b455ccf67a60c4eac44c77960f2e2";s:4:"name";s:28:"tests/marc_subfield_001.phpt";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b1e23464ee0eec47ddca2af9a9922926";s:4:"name";s:28:"tests/marc_subfield_002.phpt";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"1d7903e8c244d647220b318b4bc758d1";s:4:"name";s:23:"tests/marc_xml_001.phpt";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"22cae3c752d843b78f583dcd92801534";s:4:"name";s:23:"tests/marc_xml_002.phpt";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"c0716d23e0f960abf8d53ad6014a413a";s:4:"name";s:23:"tests/marc_xml_003.phpt";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7645fa19e28aca041a124fc5e2c12bd3";s:4:"name";s:23:"tests/marc_xml_004.phpt";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b08b28c3251625b8b6e4d7ab376b0185";s:4:"name";s:23:"tests/marc_xml_005.phpt";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6cd0934ddbf65d2d7e9ea5d108977ff7";s:4:"name";s:23:"tests/marc_xml_006.phpt";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ffdce4aa190268fa7cbbf3bb45383abf";s:4:"name";s:23:"tests/marc_xml_007.phpt";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"998a4c1ce00ff100f39ffa9fc49a212f";s:4:"name";s:23:"tests/marc_xml_008.phpt";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a38a67c590869f2b0a4859a910fd9e89";s:4:"name";s:23:"tests/marc_xml_009.phpt";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"db39c5055a570fcda12bb7c5fa1e3b4d";s:4:"name";s:25:"tests/marc_xml_16642.phpt";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"dc075f4a271bd7182378a3874bd5b39e";s:4:"name";s:29:"tests/marc_xml_namespace.phpt";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"208200d9a979ac360c4d326e9789b6b7";s:4:"name";s:36:"tests/marc_xml_namespace_prefix.phpt";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"d87774ede82222cfc12b2c2a06f57a3a";s:4:"name";s:27:"tests/marc_xml_rsinger.phpt";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fb44e3eb69f1a37115235fc829c39542";s:4:"name";s:19:"tests/namespace.xml";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e6de4d809b0af5dd99fd352eb60616a1";s:4:"name";s:16:"tests/skipif.inc";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a0166a4ff0bc0bb283e854f11beaa793";s:4:"name";s:15:"tests/music.mrc";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"993ce494befbc25dc1326527b30b4782";s:4:"name";s:15:"tests/music.xml";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6b0c87f0cd459ed7322c25d403b164cc";s:4:"name";s:20:"tests/bigarchive.xml";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"be850aa6ab4ac52b8c6c214c30b574af";s:4:"name";s:19:"tests/onerecord.xml";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4f43fec7b276267eec5258044853ccc8";s:4:"name";s:18:"tests/sandburg.mrc";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e216b95f905dd240c9bde372950e4073";s:4:"name";s:18:"tests/sandburg.xml";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e81a92188ea0dcd9c108a63fb32b3f4f";s:4:"name";s:19:"tests/xmlescape.mrc";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8f9f63ed6a80191d89a2296fa4c1a30b";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";}}i:81;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fbc093901857fcd118f065f900982c24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:3:"5.6";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{s:4:"name";s:13:"Validate_ISPN";s:7:"channel";s:12:"pear.php.net";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:82:{s:27:"File/MARC/Lint/CodeData.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ffe2590635f404af055fe731da105939";s:4:"name";s:27:"File/MARC/Lint/CodeData.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/File/MARC/Lint/CodeData.php";}s:27:"File/MARC/Control_Field.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3b9e1c817e67f59add05593500d463e";s:4:"name";s:27:"File/MARC/Control_Field.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/File/MARC/Control_Field.php";}s:24:"File/MARC/Data_Field.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"acba4463f8e40d6ee4e7ba1f2dc53123";s:4:"name";s:24:"File/MARC/Data_Field.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/File/MARC/Data_Field.php";}s:23:"File/MARC/Exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"378f483ec1fd161cd9dfb9b05db58d66";s:4:"name";s:23:"File/MARC/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/File/MARC/Exception.php";}s:19:"File/MARC/Field.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9ba69030cbf4847292b9975e9d922c6";s:4:"name";s:19:"File/MARC/Field.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/File/MARC/Field.php";}s:18:"File/MARC/Lint.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c37351c7c80927ce6bb1e662510f9183";s:4:"name";s:18:"File/MARC/Lint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/File/MARC/Lint.php";}s:18:"File/MARC/List.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c5ac39e3d25eb0108b9dd5ad8466c821";s:4:"name";s:18:"File/MARC/List.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/File/MARC/List.php";}s:20:"File/MARC/Record.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7af6ce78cde4bb246e4e96709e90d2c0";s:4:"name";s:20:"File/MARC/Record.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/File/MARC/Record.php";}s:22:"File/MARC/Subfield.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"df5f97139685f0ad04e47fdbb67e3968";s:4:"name";s:22:"File/MARC/Subfield.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php73/usr/share/pear/File/MARC/Subfield.php";}s:13:"File/MARC.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6e102262dfd5d65d8d5a6221dfc74edd";s:4:"name";s:13:"File/MARC.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/File/MARC.php";}s:17:"File/MARCBASE.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8b64040d2d18ac4b994595a148266a66";s:4:"name";s:17:"File/MARCBASE.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/File/MARCBASE.php";}s:16:"File/MARCXML.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f5a17a60d34e84e2ee7ca1e5c5c6c620";s:4:"name";s:16:"File/MARCXML.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/File/MARCXML.php";}s:20:"examples/example.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6af971fd9ff5ef3e5fcba8a64a0e7a49";s:4:"name";s:20:"examples/example.mrc";s:4:"role";s:3:"doc";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/doc/pear/File_MARC/examples/example.mrc";}s:21:"examples/marc_yaz.php";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"1aea40df9f1c2e32f8e065fe8da0a3b5";s:4:"name";s:21:"examples/marc_yaz.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php73/usr/share/doc/pear/File_MARC/examples/marc_yaz.php";}s:17:"examples/read.php";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"70ae317e0890d5896e3ffccdd293369a";s:4:"name";s:17:"examples/read.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:61:"/opt/alt/php73/usr/share/doc/pear/File_MARC/examples/read.php";}s:22:"examples/subfields.php";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"54efb9d920ac775bfc847a83a2dec73a";s:4:"name";s:22:"examples/subfields.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/doc/pear/File_MARC/examples/subfields.php";}s:21:"tests/bad_example.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"14297da35b510c496cd1f328cf3bb301";s:4:"name";s:21:"tests/bad_example.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/bad_example.mrc";}s:21:"tests/bad_example.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0dd4c6dbad6e8608d0ebf9d24425955d";s:4:"name";s:21:"tests/bad_example.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/bad_example.xml";}s:15:"tests/camel.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"216a6f9d53f6d3d8e22d81fdc10f4bc1";s:4:"name";s:15:"tests/camel.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/camel.mrc";}s:17:"tests/example.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6af971fd9ff5ef3e5fcba8a64a0e7a49";s:4:"name";s:17:"tests/example.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/example.mrc";}s:19:"tests/marc_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"9455aec3371f79cf7d31281fd03f5171";s:4:"name";s:19:"tests/marc_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_001.phpt";}s:19:"tests/marc_002.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"577e2f5f89fd48cf1a3576a29d2958f8";s:4:"name";s:19:"tests/marc_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_002.phpt";}s:19:"tests/marc_003.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a6a586354b9a06c880c2a7470dd828d7";s:4:"name";s:19:"tests/marc_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_003.phpt";}s:19:"tests/marc_004.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b1c7e2fc5572a0f9362a771c260a1fe3";s:4:"name";s:19:"tests/marc_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_004.phpt";}s:19:"tests/marc_005.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"84f85ac7f8a2532e4e90ccde7764556a";s:4:"name";s:19:"tests/marc_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_005.phpt";}s:19:"tests/marc_006.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"889e5e906a97de7a0e94b0c5f30e70e7";s:4:"name";s:19:"tests/marc_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_006.phpt";}s:19:"tests/marc_007.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"be823dc8a8efb408de06371ab802efcc";s:4:"name";s:19:"tests/marc_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_007.phpt";}s:19:"tests/marc_008.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"af44490aafea44e5120f881cb81cdad9";s:4:"name";s:19:"tests/marc_008.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_008.phpt";}s:19:"tests/marc_009.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ac9f2a7aeb24900a11f5102744179ae3";s:4:"name";s:19:"tests/marc_009.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_009.phpt";}s:19:"tests/marc_010.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"5e43eb5cddbb4f2bd0d6405cd95b80aa";s:4:"name";s:19:"tests/marc_010.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_010.phpt";}s:19:"tests/marc_011.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"2e1cd8509c0bf04ec77fc0f51375f611";s:4:"name";s:19:"tests/marc_011.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_011.phpt";}s:19:"tests/marc_012.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"bc49ca48623102c8ac07679fa77a3dd9";s:4:"name";s:19:"tests/marc_012.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_012.phpt";}s:19:"tests/marc_013.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"245a3b20e0da1973535503e28efd1d3a";s:4:"name";s:19:"tests/marc_013.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_013.phpt";}s:19:"tests/marc_014.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ce69aa734856dd40d60d30c77bdef53a";s:4:"name";s:19:"tests/marc_014.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_014.phpt";}s:19:"tests/marc_015.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7b61cdd31035e60682fa92c5d519d997";s:4:"name";s:19:"tests/marc_015.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_015.phpt";}s:19:"tests/marc_016.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7f4f597fe1adaa3507eb87fc4875dbd2";s:4:"name";s:19:"tests/marc_016.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_016.phpt";}s:19:"tests/marc_017.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4262efd5fcacbd7503323681f4552430";s:4:"name";s:19:"tests/marc_017.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_017.phpt";}s:19:"tests/marc_018.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ee1623d7bda54ba4f741b2319b158f82";s:4:"name";s:19:"tests/marc_018.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_018.phpt";}s:19:"tests/marc_019.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8006c03fbab0f04377342086fafd3982";s:4:"name";s:19:"tests/marc_019.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_019.phpt";}s:19:"tests/marc_020.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"f5ae5b25e0ac1104314433d9e5b1f7fe";s:4:"name";s:19:"tests/marc_020.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_020.phpt";}s:19:"tests/marc_021.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"94d8f99e86585671a1b2d3043aeb6360";s:4:"name";s:19:"tests/marc_021.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_021.phpt";}s:19:"tests/marc_022.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"bb891a890effe0e77e1759043f4846d8";s:4:"name";s:19:"tests/marc_022.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_022.phpt";}s:19:"tests/marc_023.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"faf77dcb5cdd002c09169a14bfded65e";s:4:"name";s:19:"tests/marc_023.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_023.phpt";}s:21:"tests/marc_16783.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0e6c4a23f5da7df64fdd4b3b1149bbee";s:4:"name";s:21:"tests/marc_16783.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_16783.phpt";}s:25:"tests/marc_field_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4ea8b3520beda378db15960f1c50493a";s:4:"name";s:25:"tests/marc_field_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_001.phpt";}s:25:"tests/marc_field_002.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"743850ef61df69c4340be44a03bccb5a";s:4:"name";s:25:"tests/marc_field_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_002.phpt";}s:25:"tests/marc_field_003.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8c765f1398b49df257d86d22ac6e4f8d";s:4:"name";s:25:"tests/marc_field_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_003.phpt";}s:25:"tests/marc_field_004.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"d4216cf930a308e0d02553bd3914f294";s:4:"name";s:25:"tests/marc_field_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_004.phpt";}s:25:"tests/marc_field_005.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"dd59514b474b78371ad522a3e13b76b7";s:4:"name";s:25:"tests/marc_field_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_005.phpt";}s:27:"tests/marc_field_21246.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"5295bfd02a8424acac1c91de26b552c7";s:4:"name";s:27:"tests/marc_field_21246.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_field_21246.phpt";}s:24:"tests/marc_lint_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6f95f09442ccf6b93df92986f58b270d";s:4:"name";s:24:"tests/marc_lint_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_lint_001.phpt";}s:24:"tests/marc_lint_002.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"18d721f8871edd925624ccbdd15444fb";s:4:"name";s:24:"tests/marc_lint_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_lint_002.phpt";}s:24:"tests/marc_lint_003.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4eb86a2f4e0a74dedcb0bf2511da6ca1";s:4:"name";s:24:"tests/marc_lint_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_lint_003.phpt";}s:24:"tests/marc_lint_004.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"10430fee0a1352d0528f1507b34c57e1";s:4:"name";s:24:"tests/marc_lint_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_lint_004.phpt";}s:24:"tests/marc_lint_005.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"0dcd07a18577d7b22392a2214cd6436c";s:4:"name";s:24:"tests/marc_lint_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_lint_005.phpt";}s:26:"tests/marc_record_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fd17798fc535562e5e64461f449516b2";s:4:"name";s:26:"tests/marc_record_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_record_001.phpt";}s:28:"tests/marc_subfield_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"141b455ccf67a60c4eac44c77960f2e2";s:4:"name";s:28:"tests/marc_subfield_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:73:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_subfield_001.phpt";}s:28:"tests/marc_subfield_002.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b1e23464ee0eec47ddca2af9a9922926";s:4:"name";s:28:"tests/marc_subfield_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:73:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_subfield_002.phpt";}s:23:"tests/marc_xml_001.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"1d7903e8c244d647220b318b4bc758d1";s:4:"name";s:23:"tests/marc_xml_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_001.phpt";}s:23:"tests/marc_xml_002.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"22cae3c752d843b78f583dcd92801534";s:4:"name";s:23:"tests/marc_xml_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_002.phpt";}s:23:"tests/marc_xml_003.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"c0716d23e0f960abf8d53ad6014a413a";s:4:"name";s:23:"tests/marc_xml_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_003.phpt";}s:23:"tests/marc_xml_004.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"7645fa19e28aca041a124fc5e2c12bd3";s:4:"name";s:23:"tests/marc_xml_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_004.phpt";}s:23:"tests/marc_xml_005.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"b08b28c3251625b8b6e4d7ab376b0185";s:4:"name";s:23:"tests/marc_xml_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_005.phpt";}s:23:"tests/marc_xml_006.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6cd0934ddbf65d2d7e9ea5d108977ff7";s:4:"name";s:23:"tests/marc_xml_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_006.phpt";}s:23:"tests/marc_xml_007.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"ffdce4aa190268fa7cbbf3bb45383abf";s:4:"name";s:23:"tests/marc_xml_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_007.phpt";}s:23:"tests/marc_xml_008.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"998a4c1ce00ff100f39ffa9fc49a212f";s:4:"name";s:23:"tests/marc_xml_008.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_008.phpt";}s:23:"tests/marc_xml_009.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a38a67c590869f2b0a4859a910fd9e89";s:4:"name";s:23:"tests/marc_xml_009.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_009.phpt";}s:25:"tests/marc_xml_16642.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"db39c5055a570fcda12bb7c5fa1e3b4d";s:4:"name";s:25:"tests/marc_xml_16642.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_16642.phpt";}s:29:"tests/marc_xml_namespace.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"dc075f4a271bd7182378a3874bd5b39e";s:4:"name";s:29:"tests/marc_xml_namespace.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_namespace.phpt";}s:36:"tests/marc_xml_namespace_prefix.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"208200d9a979ac360c4d326e9789b6b7";s:4:"name";s:36:"tests/marc_xml_namespace_prefix.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:81:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_namespace_prefix.phpt";}s:27:"tests/marc_xml_rsinger.phpt";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"d87774ede82222cfc12b2c2a06f57a3a";s:4:"name";s:27:"tests/marc_xml_rsinger.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/marc_xml_rsinger.phpt";}s:19:"tests/namespace.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fb44e3eb69f1a37115235fc829c39542";s:4:"name";s:19:"tests/namespace.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/namespace.xml";}s:16:"tests/skipif.inc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e6de4d809b0af5dd99fd352eb60616a1";s:4:"name";s:16:"tests/skipif.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:61:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/skipif.inc";}s:15:"tests/music.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"a0166a4ff0bc0bb283e854f11beaa793";s:4:"name";s:15:"tests/music.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/music.mrc";}s:15:"tests/music.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"993ce494befbc25dc1326527b30b4782";s:4:"name";s:15:"tests/music.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/music.xml";}s:20:"tests/bigarchive.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"6b0c87f0cd459ed7322c25d403b164cc";s:4:"name";s:20:"tests/bigarchive.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:65:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/bigarchive.xml";}s:19:"tests/onerecord.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"be850aa6ab4ac52b8c6c214c30b574af";s:4:"name";s:19:"tests/onerecord.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/onerecord.xml";}s:18:"tests/sandburg.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"4f43fec7b276267eec5258044853ccc8";s:4:"name";s:18:"tests/sandburg.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/sandburg.mrc";}s:18:"tests/sandburg.xml";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e216b95f905dd240c9bde372950e4073";s:4:"name";s:18:"tests/sandburg.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/sandburg.xml";}s:19:"tests/xmlescape.mrc";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"e81a92188ea0dcd9c108a63fb32b3f4f";s:4:"name";s:19:"tests/xmlescape.mrc";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests/xmlescape.mrc";}s:9:"CHANGELOG";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"8f9f63ed6a80191d89a2296fa4c1a30b";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/doc/pear/File_MARC/CHANGELOG";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:4:"File";s:6:"md5sum";s:32:"fbc093901857fcd118f065f900982c24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/doc/pear/File_MARC/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:7:{s:44:"/opt/alt/php73/usr/share/pear/File/MARC/Lint";b:1;s:39:"/opt/alt/php73/usr/share/pear/File/MARC";b:1;s:34:"/opt/alt/php73/usr/share/pear/File";b:1;s:52:"/opt/alt/php73/usr/share/doc/pear/File_MARC/examples";b:1;s:43:"/opt/alt/php73/usr/share/doc/pear/File_MARC";b:1;s:50:"/opt/alt/php73/usr/share/pear/test/File_MARC/tests";b:1;s:44:"/opt/alt/php73/usr/share/pear/test/File_MARC";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.1";s:12:"release_date";s:10:"2019-11-13";s:13:"release_state";s:6:"stable";s:15:"release_license";s:33:"GNU Lesser General Public License";s:13:"release_notes";s:51:"1.4.1
  * Reintroduce include_path to composer.json";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:3:"5.6";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:13:"Validate_ISPN";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:9:"Dan Scott";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:3:"dbs";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/structures_linkedlist.reg000064400000033054151732707770014612 0ustar00a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.0";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:21:"Structures_LinkedList";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:41:"Implements singly and doubly-linked lists";s:11:"description";s:181:"A singly-linked list offers the ability to insert or delete
 nodes at any point within the list. A doubly-linked list also offers the
 ability to request previous nodes in the list.";s:4:"lead";a:4:{s:4:"name";s:9:"Dan Scott";s:4:"user";s:3:"dbs";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2010-08-15";s:4:"time";s:8:"10:13:00";s:7:"version";a:2:{s:7:"release";s:5:"0.2.2";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:38:"http://apache.org/licenses/LICENSE-2.0";}s:8:"_content";s:27:"Apache License, Version 2.0";}s:5:"notes";s:20:"* Fix package layout";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:4:"name";s:1:"/";}s:4:"file";a:22:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b7ac5a9d6d9a3eb2c3cbb1db76ad75a3";s:4:"name";s:32:"Structures/LinkedList/Double.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"310eefdff99016e4a3282dd02d5a7efa";s:4:"name";s:32:"Structures/LinkedList/Single.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"9b1565a45687bb631a452b152e0d3d15";s:4:"name";s:32:"examples/double_link_example.php";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"56d8c9a65cf967f09136a1b5b42fb787";s:4:"name";s:32:"examples/single_link_example.php";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"54a63c64625c0b1785d890cc0ecb6957";s:4:"name";s:20:"tests/LinkTester.php";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6138a89189609d8b0c35a69ce6995457";s:4:"name";s:26:"tests/SingleLinkTester.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"c7a6ad89f79222cf62148893e88a0b5a";s:4:"name";s:19:"tests/link_001.phpt";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"960408b3ea85cfe453f7d4b1814784ea";s:4:"name";s:19:"tests/link_002.phpt";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"392d4c38523f764091433fdf19cf4943";s:4:"name";s:19:"tests/link_003.phpt";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"88bfd20fe97800c4f69ec7577abd2ecd";s:4:"name";s:19:"tests/link_004.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"dac8403b1df9d64e16e45e87121a74fa";s:4:"name";s:19:"tests/link_005.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"bfc84666dbe64008101adadecf008677";s:4:"name";s:19:"tests/link_006.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"1a7eb8c8a63ec97fdb0154214c679cfa";s:4:"name";s:19:"tests/link_007.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"86f0c12acf2706a82d0d0dc625ab3608";s:4:"name";s:26:"tests/single_link_001.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"19c3e9b406dffe9c315e0264e0d257f8";s:4:"name";s:26:"tests/single_link_002.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"d4029576a49c41f18c35f72bdb37da7e";s:4:"name";s:26:"tests/single_link_003.phpt";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"574cb63523d7716f37fad368eefc695b";s:4:"name";s:26:"tests/single_link_004.phpt";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"4712a8421da2369e72ec789e0fe3993f";s:4:"name";s:26:"tests/single_link_005.phpt";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"a7f31515a9a3260aa1c17e003a4c352c";s:4:"name";s:26:"tests/single_link_006.phpt";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6fe94be57c862475367ed91a7284a6b2";s:4:"name";s:26:"tests/single_link_007.phpt";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6e8edc55d5a37acbe96ed9860b8680cc";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"3b83ef96387f14655fc854ddc3c6bd57";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:3:"5.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:22:{s:32:"Structures/LinkedList/Double.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b7ac5a9d6d9a3eb2c3cbb1db76ad75a3";s:4:"name";s:32:"Structures/LinkedList/Double.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/Structures/LinkedList/Double.php";}s:32:"Structures/LinkedList/Single.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"310eefdff99016e4a3282dd02d5a7efa";s:4:"name";s:32:"Structures/LinkedList/Single.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/Structures/LinkedList/Single.php";}s:32:"examples/double_link_example.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"9b1565a45687bb631a452b152e0d3d15";s:4:"name";s:32:"examples/double_link_example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList/examples/double_link_example.php";}s:32:"examples/single_link_example.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"56d8c9a65cf967f09136a1b5b42fb787";s:4:"name";s:32:"examples/single_link_example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList/examples/single_link_example.php";}s:20:"tests/LinkTester.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"54a63c64625c0b1785d890cc0ecb6957";s:4:"name";s:20:"tests/LinkTester.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/LinkTester.php";}s:26:"tests/SingleLinkTester.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6138a89189609d8b0c35a69ce6995457";s:4:"name";s:26:"tests/SingleLinkTester.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/SingleLinkTester.php";}s:19:"tests/link_001.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"c7a6ad89f79222cf62148893e88a0b5a";s:4:"name";s:19:"tests/link_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_001.phpt";}s:19:"tests/link_002.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"960408b3ea85cfe453f7d4b1814784ea";s:4:"name";s:19:"tests/link_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_002.phpt";}s:19:"tests/link_003.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"392d4c38523f764091433fdf19cf4943";s:4:"name";s:19:"tests/link_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_003.phpt";}s:19:"tests/link_004.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"88bfd20fe97800c4f69ec7577abd2ecd";s:4:"name";s:19:"tests/link_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_004.phpt";}s:19:"tests/link_005.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"dac8403b1df9d64e16e45e87121a74fa";s:4:"name";s:19:"tests/link_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_005.phpt";}s:19:"tests/link_006.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"bfc84666dbe64008101adadecf008677";s:4:"name";s:19:"tests/link_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_006.phpt";}s:19:"tests/link_007.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"1a7eb8c8a63ec97fdb0154214c679cfa";s:4:"name";s:19:"tests/link_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/link_007.phpt";}s:26:"tests/single_link_001.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"86f0c12acf2706a82d0d0dc625ab3608";s:4:"name";s:26:"tests/single_link_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_001.phpt";}s:26:"tests/single_link_002.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"19c3e9b406dffe9c315e0264e0d257f8";s:4:"name";s:26:"tests/single_link_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_002.phpt";}s:26:"tests/single_link_003.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"d4029576a49c41f18c35f72bdb37da7e";s:4:"name";s:26:"tests/single_link_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_003.phpt";}s:26:"tests/single_link_004.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"574cb63523d7716f37fad368eefc695b";s:4:"name";s:26:"tests/single_link_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_004.phpt";}s:26:"tests/single_link_005.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"4712a8421da2369e72ec789e0fe3993f";s:4:"name";s:26:"tests/single_link_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_005.phpt";}s:26:"tests/single_link_006.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"a7f31515a9a3260aa1c17e003a4c352c";s:4:"name";s:26:"tests/single_link_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_006.phpt";}s:26:"tests/single_link_007.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6fe94be57c862475367ed91a7284a6b2";s:4:"name";s:26:"tests/single_link_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests/single_link_007.phpt";}s:9:"CHANGELOG";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6e8edc55d5a37acbe96ed9860b8680cc";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList/CHANGELOG";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"3b83ef96387f14655fc854ddc3c6bd57";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:6:{s:51:"/opt/alt/php73/usr/share/pear/Structures/LinkedList";b:1;s:40:"/opt/alt/php73/usr/share/pear/Structures";b:1;s:64:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList/examples";b:1;s:55:"/opt/alt/php73/usr/share/doc/pear/Structures_LinkedList";b:1;s:62:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList/tests";b:1;s:56:"/opt/alt/php73/usr/share/pear/test/Structures_LinkedList";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"0.2.2";s:12:"release_date";s:10:"2010-08-15";s:13:"release_state";s:4:"beta";s:15:"release_license";s:27:"Apache License, Version 2.0";s:13:"release_notes";s:20:"* Fix package layout";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:3:"5.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:9:"Dan Scott";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:3:"dbs";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/pear.reg000064400000305504151732707770011076 0ustar00a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.13";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:16:"PEAR Base System";s:11:"description";s:1100:"The PEAR package contains:
 * the PEAR installer, for creating, distributing
   and installing packages
 * the PEAR_Exception PHP5 error handling mechanism
 * the PEAR_ErrorStack advanced error handling mechanism
 * the PEAR_Error error handling mechanism
 * the OS_Guess class for retrieving info about the OS
   where PHP is running on
 * the System class for quick handling of common operations
   with files and directories
 * the PEAR base class
  Features in a nutshell:
  * full support for channels
  * pre-download dependency validation
  * new package.xml 2.0 format allows tremendous flexibility while maintaining BC
  * support for optional dependency groups and limited support for sub-packaging
  * robust dependency support
  * full dependency validation on uninstall
  * remote install for hosts with only ftp access - no more problems with
    restricted host installation
  * full support for mirroring
  * support for bundling several packages into a single tarball
  * support for static dependencies on a url-based package
  * support for custom file roles and installation tasks";s:4:"lead";a:7:{i:0;a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:17:"Pierre-Alain Joye";s:4:"user";s:6:"pajoye";s:5:"email";s:14:"pierre@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:3;a:4:{s:4:"name";s:13:"Tomas V.V.Cox";s:4:"user";s:3:"cox";s:5:"email";s:15:"cox@idecnet.com";s:6:"active";s:2:"no";}i:4;a:4:{s:4:"name";s:13:"Helgi Thormar";s:4:"user";s:5:"dufuz";s:5:"email";s:13:"dufuz@php.net";s:6:"active";s:2:"no";}i:5;a:4:{s:4:"name";s:16:"Christian Weiske";s:4:"user";s:7:"cweiske";s:5:"email";s:15:"cweiske@php.net";s:6:"active";s:2:"no";}i:6;a:4:{s:4:"name";s:13:"Chuck Burgess";s:4:"user";s:7:"ashnazg";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";}}s:9:"developer";a:4:{s:4:"name";s:9:"Tias Guns";s:4:"user";s:4:"tias";s:5:"email";s:12:"tias@php.net";s:6:"active";s:2:"no";}s:6:"helper";a:3:{i:0;a:4:{s:4:"name";s:11:"Tim Jackson";s:4:"user";s:4:"timj";s:5:"email";s:12:"timj@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:15:"Bertrand Gugger";s:4:"user";s:5:"toggg";s:5:"email";s:13:"toggg@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:13:"Martin Jansen";s:4:"user";s:2:"mj";s:5:"email";s:10:"mj@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2024-11-24";s:4:"time";s:8:"22:09:42";s:7:"version";a:2:{s:7:"release";s:7:"1.10.16";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:105:{i:0;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c0482b234f269360953c87472b5cf746";s:4:"name";s:12:"OS/Guess.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:1;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b371e9c6b4d667abb8be01f2788dcf9";s:4:"name";s:27:"PEAR/ChannelFile/Parser.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fd87e64002e11fd86eb2f3fbfee6599";s:4:"name";s:21:"PEAR/Command/Auth.xml";s:4:"role";s:3:"php";}}i:3;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65b6b36c4cc53f2836ad09b070829877";s:4:"name";s:21:"PEAR/Command/Auth.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce6bb5b6fdc02e0f50e7676403fd84a4";s:4:"name";s:22:"PEAR/Command/Build.xml";s:4:"role";s:3:"php";}}i:5;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e19325f59c4013694a4a06b61e7ac3be";s:4:"name";s:22:"PEAR/Command/Build.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d5aab4d4308c3005b5f584c7783a031";s:4:"name";s:25:"PEAR/Command/Channels.xml";s:4:"role";s:3:"php";}}i:7;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56b3b36834a751f6e7b86dcba6cefe2f";s:4:"name";s:25:"PEAR/Command/Channels.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:8;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aae7cc03e9b7fe7c4f504b970dca5411";s:4:"name";s:23:"PEAR/Command/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"91f189cb9423b5e87ee0abc5ea1a2be3";s:4:"name";s:23:"PEAR/Command/Config.xml";s:4:"role";s:3:"php";}}i:10;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c5d633b0e8d4e39e9bfb286f51130a5";s:4:"name";s:23:"PEAR/Command/Config.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24d05213cae7faa3880bbb5e40998867";s:4:"name";s:24:"PEAR/Command/Install.xml";s:4:"role";s:3:"php";}}i:12;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3dab53d092878709aa16f73143600107";s:4:"name";s:24:"PEAR/Command/Install.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5cb62a04c0a268f4edd64a49a3895c92";s:4:"name";s:23:"PEAR/Command/Mirror.xml";s:4:"role";s:3:"php";}}i:14;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f5798bb62453d8d1bffa3d050584232";s:4:"name";s:23:"PEAR/Command/Mirror.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9367dcd7e4dbdde423f9c4c7d3f3a919";s:4:"name";s:24:"PEAR/Command/Package.xml";s:4:"role";s:3:"php";}}i:16;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57521ff1e89bcd23a853134f30836990";s:4:"name";s:24:"PEAR/Command/Package.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:2:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@DATA-DIR@";s:2:"to";s:8:"data_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28dc842ea725d8787b9f9c3dbca5aa22";s:4:"name";s:23:"PEAR/Command/Pickle.xml";s:4:"role";s:3:"php";}}i:18;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4025dd6411a73b19a5c19b3300060625";s:4:"name";s:23:"PEAR/Command/Pickle.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49b046cfc14747f0365e02e9c3f0e6dc";s:4:"name";s:25:"PEAR/Command/Registry.xml";s:4:"role";s:3:"php";}}i:20;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f2ea65794243f0b7287e8883f2ab60e";s:4:"name";s:25:"PEAR/Command/Registry.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29c02e823879b4e3e291f6b36fb339f1";s:4:"name";s:23:"PEAR/Command/Remote.xml";s:4:"role";s:3:"php";}}i:22;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42c51cbb21c103fe0288e5c16871f401";s:4:"name";s:23:"PEAR/Command/Remote.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a50c32015005e0761cc3b04679b29ed0";s:4:"name";s:21:"PEAR/Command/Test.xml";s:4:"role";s:3:"php";}}i:24;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbb0098fcda7fa29adaa0714a325caea";s:4:"name";s:21:"PEAR/Command/Test.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:25;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9229a9711a893a18298e473212689ab4";s:4:"name";s:27:"PEAR/Downloader/Package.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:26;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5379be9492842c3af98241c6e226d285";s:4:"name";s:21:"PEAR/Frontend/CLI.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:27;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"adae220f10a82e5f78b8689a57387753";s:4:"name";s:30:"PEAR/Installer/Role/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8c62e6275e3aaa7784290912406092c";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"role";s:3:"php";}}i:29;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d89d39dcc1c55fb4464f447ce4f84eed";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89a4a2a286e842d45a98974f40a0565c";s:4:"name";s:28:"PEAR/Installer/Role/Data.xml";s:4:"role";s:3:"php";}}i:31;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89754e8d153937f3dd3266fd8897d965";s:4:"name";s:28:"PEAR/Installer/Role/Data.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b1ce0fe105251c3b75209d6518ee69ac";s:4:"name";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"role";s:3:"php";}}i:33;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"849c557b355f78890ef47fcfd12073ab";s:4:"name";s:27:"PEAR/Installer/Role/Doc.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af71c0ad42d16a323afe24a4f884ef15";s:4:"name";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"role";s:3:"php";}}i:35;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d3dc799576b3e3d74d187de118cc3e4";s:4:"name";s:27:"PEAR/Installer/Role/Ext.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da6743f1e45cce72ea13aef5cdb14867";s:4:"name";s:27:"PEAR/Installer/Role/Man.xml";s:4:"role";s:3:"php";}}i:37;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2509a027ae42c4b96aa49557325a0ec4";s:4:"name";s:27:"PEAR/Installer/Role/Man.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef88f0321d3e481c2130c95122cf76d8";s:4:"name";s:27:"PEAR/Installer/Role/Php.xml";s:4:"role";s:3:"php";}}i:39;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7547896ec403dba2eed9825ed86ea64";s:4:"name";s:27:"PEAR/Installer/Role/Php.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"746461dc3b48af6d24094cb0211608f2";s:4:"name";s:30:"PEAR/Installer/Role/Script.xml";s:4:"role";s:3:"php";}}i:41;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"325c60df7f78be127741621561758f46";s:4:"name";s:30:"PEAR/Installer/Role/Script.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e147d63f168ea156fc2be38caaa63804";s:4:"name";s:27:"PEAR/Installer/Role/Src.xml";s:4:"role";s:3:"php";}}i:43;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"464722cee0665ebc75757f76532f0ab2";s:4:"name";s:27:"PEAR/Installer/Role/Src.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a24b596ec987aa5688fc19e8ed4e97ea";s:4:"name";s:28:"PEAR/Installer/Role/Test.xml";s:4:"role";s:3:"php";}}i:45;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a04eb2f4881ec6e6a13ae78f6a43e3cd";s:4:"name";s:28:"PEAR/Installer/Role/Test.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7641e71c5785bb33a4261ebe25ed0fd7";s:4:"name";s:27:"PEAR/Installer/Role/Www.xml";s:4:"role";s:3:"php";}}i:47;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62699034e3186c2d68a6bb56a6cc23eb";s:4:"name";s:27:"PEAR/Installer/Role/Www.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:48;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e95f2d850fce183e221912b2c2056d04";s:4:"name";s:23:"PEAR/Installer/Role.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:49;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cfa08685115d5e2d7635225d73a91f39";s:4:"name";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:50;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d264031153993866828e82129e389ab";s:4:"name";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:51;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a2206e0e32ad2ba2f4e2a0c1797f295c";s:4:"name";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:52;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3857f4b60878d64551a7cdae783437f7";s:4:"name";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:53;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a253999b2109460badc3c71ad2c069e7";s:4:"name";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:54;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44dafa313204f68b5fb54b9f61a86d0c";s:4:"name";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:55;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc1ea307bb79c0cbcff4a90a4656e96e";s:4:"name";s:23:"PEAR/PackageFile/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:56;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e6012d4ef9cb8e12e2ccadcbdcf3d24";s:4:"name";s:23:"PEAR/PackageFile/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:57;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce77cc6593d8d4eda5ff8620ff09d6ec";s:4:"name";s:16:"PEAR/REST/10.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:58;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdbd1f2e8afa2cddddecf2687579d316";s:4:"name";s:16:"PEAR/REST/11.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:59;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"11179085b6efb577d37f45cc25e42a35";s:4:"name";s:16:"PEAR/REST/13.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:60;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eb57da4993a3cfed69fe8135f10b05a";s:4:"name";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:61;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"46c1bdb9a7af8628643e639ec1c3bc58";s:4:"name";s:24:"PEAR/Task/Replace/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:62;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50e20dbde7e51bb5e11545c56482b68a";s:4:"name";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:63;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"340be01552844adb50f6e0fa37aa3ffe";s:4:"name";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:64;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec7f8db335ad3b5a25d78682745185d1";s:4:"name";s:20:"PEAR/Task/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:65;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86f240c600447fdb86bd38bd32c66c02";s:4:"name";s:31:"PEAR/Task/Postinstallscript.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:66;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c993cdedc64084a1c4b735baec048d50";s:4:"name";s:21:"PEAR/Task/Replace.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:67;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76c4ca15858c005cda208a9da1f5eb2d";s:4:"name";s:21:"PEAR/Task/Unixeol.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:68;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d790eb3aa5ba22a33e42cb7c5f99fb25";s:4:"name";s:24:"PEAR/Task/Windowseol.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:69;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b3c83ca826a4825ca2db726ed7d4b245";s:4:"name";s:23:"PEAR/Validator/PECL.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:70;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d89f25a54d100c2afd562fb3bd7c308";s:4:"name";s:16:"PEAR/Builder.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:71;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edcd484ecfd400875df90ee480c5384d";s:4:"name";s:20:"PEAR/ChannelFile.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:72;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a5d56f9d15ff6d22c12f7db851f281e8";s:4:"name";s:16:"PEAR/Command.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:73;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0af44a13df74291ac2f46949d2035e0e";s:4:"name";s:15:"PEAR/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:74;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64d0f7b2737e5f182d0ab98bc77930d2";s:4:"name";s:15:"PEAR/Config.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:75;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e8dfae09802be7f2e6170062bb80cbd";s:4:"name";s:21:"PEAR/DependencyDB.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:76;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76fdabdee883fd16b986332552b9e3dc";s:4:"name";s:20:"PEAR/Dependency2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:77;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ccb7bb2d00eae201ee7ae1eef49ad8a";s:4:"name";s:19:"PEAR/Downloader.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:78;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea807632b63d2e0acd6924db23aaa0eb";s:4:"name";s:19:"PEAR/ErrorStack.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:79;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"544ed48cab9407a936d058d09e773e22";s:4:"name";s:18:"PEAR/Exception.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:80;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31c0b91767550adf77f1c9bea92a0559";s:4:"name";s:17:"PEAR/Frontend.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:81;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8b85e42b840676ad3ae1c15e55b005b";s:4:"name";s:18:"PEAR/Installer.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:82;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2929765413405abf63574c8a544e4a04";s:4:"name";s:20:"PEAR/PackageFile.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:83;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad25a29d464b62cbaaa3ca96e622526c";s:4:"name";s:17:"PEAR/Packager.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:84;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef9d00adaeccff7516f08170096026d3";s:4:"name";s:14:"PEAR/Proxy.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:85;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae8c1dcfddb6a2717e09239bb1430dc7";s:4:"name";s:17:"PEAR/Registry.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:86;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"389d1bad72267d3ed770abf0662d8086";s:4:"name";s:13:"PEAR/REST.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:87;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df0d7022e22fd78ecd82080ff4f108d5";s:4:"name";s:16:"PEAR/RunTest.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:88;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3711c281e0234203ec7879f53bc766ab";s:4:"name";s:17:"PEAR/Validate.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:89;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da9510087eddd489945dde07260256ee";s:4:"name";s:18:"PEAR/XMLParser.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:90;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d888d06143e3cac0dae78bbb2e761366";s:4:"name";s:16:"scripts/pear.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:91;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"17d7d08ce2c6c476eeaae4763f69efcc";s:4:"name";s:19:"scripts/peardev.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:92;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1c5819d67da59739e6298d6094c58f7b";s:4:"name";s:16:"scripts/pecl.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:93;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8ac139504e80bede470aef6d405100b6";s:4:"name";s:15:"scripts/pear.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:94;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"08ea03525b4ba914dfd9ec69c4238cf4";s:4:"name";s:18:"scripts/peardev.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:95;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bde09b17fa816d58bb136375a13119c3";s:4:"name";s:15:"scripts/pecl.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:96;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9b5d5e5bd017c50df00c6b34ef32652e";s:4:"name";s:19:"scripts/pearcmd.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}}i:97;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"48867dfbb41f2532d034f56a79565893";s:4:"name";s:19:"scripts/peclcmd.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45b44486d8090de17b2a8b4211fab247";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eaac3d33068c6e67573ed44155b149ae";s:4:"name";s:7:"INSTALL";s:4:"role";s:3:"doc";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"69341ea97af9c88956568f8e7e41d4c6";s:4:"name";s:11:"package.dtd";s:4:"role";s:4:"data";}}i:101;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47aeb7eaff6438beb60bc42bc0e6c658";s:4:"name";s:8:"PEAR.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd10521cc4054923a3d2b6e15b4df493";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";}}i:103;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba9e5c5a567e51b440808a8ed53cd76d";s:4:"name";s:10:"System.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"acd010e3bc43c0f72df584acde7b9158";s:4:"name";s:13:"template.spec";s:4:"role";s:4:"data";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:4:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}s:7:"package";a:4:{i:0;a:4:{s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.9";s:11:"recommended";s:5:"1.4.4";}i:1;a:4:{s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.1.0";s:11:"recommended";s:5:"1.1.1";}i:2;a:4:{s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";s:11:"recommended";s:5:"1.4.3";}i:3;a:4:{s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:11:"recommended";s:5:"1.4.5";}}s:9:"extension";a:2:{i:0;a:1:{s:4:"name";s:3:"xml";}i:1;a:1:{s:4:"name";s:4:"pcre";}}}s:5:"group";a:3:{i:0;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:26:"PEAR's web-based installer";s:4:"name";s:12:"webinstaller";}s:7:"package";a:3:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.5.1";}}i:1;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:30:"PEAR's PHP-GTK-based installer";s:4:"name";s:12:"gtkinstaller";}s:7:"package";a:3:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.4.0";}}i:2;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:31:"PEAR's PHP-GTK2-based installer";s:4:"name";s:13:"gtk2installer";}s:7:"package";a:2:{s:4:"name";s:18:"PEAR_Frontend_Gtk2";s:7:"channel";s:12:"pear.php.net";}}}}s:10:"phprelease";a:2:{i:0;a:2:{s:17:"installconditions";a:1:{s:2:"os";a:1:{s:4:"name";s:7:"windows";}}s:8:"filelist";a:2:{s:7:"install";a:5:{i:0;a:1:{s:7:"attribs";a:2:{s:2:"as";s:8:"pear.bat";s:4:"name";s:16:"scripts/pear.bat";}}i:1;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peardev.bat";s:4:"name";s:19:"scripts/peardev.bat";}}i:2;a:1:{s:7:"attribs";a:2:{s:2:"as";s:8:"pecl.bat";s:4:"name";s:16:"scripts/pecl.bat";}}i:3;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"pearcmd.php";s:4:"name";s:19:"scripts/pearcmd.php";}}i:4;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peclcmd.php";s:4:"name";s:19:"scripts/peclcmd.php";}}}s:6:"ignore";a:3:{i:0;a:1:{s:7:"attribs";a:1:{s:4:"name";s:18:"scripts/peardev.sh";}}i:1;a:1:{s:7:"attribs";a:1:{s:4:"name";s:15:"scripts/pear.sh";}}i:2;a:1:{s:7:"attribs";a:1:{s:4:"name";s:15:"scripts/pecl.sh";}}}}}i:1;a:1:{s:8:"filelist";a:2:{s:7:"install";a:5:{i:0;a:1:{s:7:"attribs";a:2:{s:2:"as";s:4:"pear";s:4:"name";s:15:"scripts/pear.sh";}}i:1;a:1:{s:7:"attribs";a:2:{s:2:"as";s:7:"peardev";s:4:"name";s:18:"scripts/peardev.sh";}}i:2;a:1:{s:7:"attribs";a:2:{s:2:"as";s:4:"pecl";s:4:"name";s:15:"scripts/pecl.sh";}}i:3;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"pearcmd.php";s:4:"name";s:19:"scripts/pearcmd.php";}}i:4;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peclcmd.php";s:4:"name";s:19:"scripts/peclcmd.php";}}}s:6:"ignore";a:3:{i:0;a:1:{s:7:"attribs";a:1:{s:4:"name";s:16:"scripts/pear.bat";}}i:1;a:1:{s:7:"attribs";a:1:{s:4:"name";s:19:"scripts/peardev.bat";}}i:2;a:1:{s:7:"attribs";a:1:{s:4:"name";s:16:"scripts/pecl.bat";}}}}}}s:9:"changelog";a:1:{s:7:"release";a:35:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:11:"1.8.0alpha1";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-03-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:4876:"* Implement Request #10373: if pref_state=stable and installed package=beta, allow up to latest beta version [dufuz]
* Implement Request #10581: login / logout should map to channel-login / channel-logout [dufuz]
* Implement Request #10825: Only display the "invalid or missing package file"-error if it makes sense [dufuz]
* Implement Request #11170: script to generate Command/[command].xml [dufuz]
* Implement Request #11176: improve channel ... has updated its protocols message [dufuz]
* Implement Request #12706: pear list -a hard to read [dufuz]
* Implement Request #11353: upgrade-all and upgrade commands to upgrade within the same stability level [dufuz]
* Implement Request #13015: Add https discovery for channel.xml [dufuz / initial patch by Martin Roos]
* Implement Request #13927: install-pear.php should have option to set www_dir [timj]
* Implement Request #14324: Make the pear install command behave similar to apt-get [dufuz]
* Implement Request #14325: make pear upgrade with no params behave like pear upgrade-all [dufuz]
  - upgrade-all can be considered deprecated in favor of calling upgrade with no parameters to replicate
    better what other package managers are doing. upgrade-all will still work as intended.
* Implement Request #14504: add a channel parameter support to the upgrade function [dufuz]
  - Options -c ezc and --channel=ezc got added to upgrade and upgrade-all to allow for
    channel specific upgrades
* Implement Request #14556: install-pear-nozlib.phar should get download_dir config and other options [cweiske]
* Implement Request #15566: Add doc.php.net as a default channel [dufuz / saltybeagle]

* Fix PHP Bug #43857: --program-suffix not always reflected everywhere [cellog]
* Fix PHP Bug #47323: strotime warnings in make install [dufuz]

* Fix Bug #13908: pear info command and maintainers inactive not mentioned [dufuz]
* Fix Bug #13926: install-pear.php does not set cfg_dir if -d option set with no -c option [timj]
* Fix Bug #13943: tests fail when php.exe path contains spaces [dufuz / jorrit]
* Fix Bug #13953: config-set/config-show with channel alias fail [cellog]
* Fix Bug #13958: When a phpt tests exit() or die() xdebug coverage is not generated, patch by izi (David Jean Louis) [izi / dufuz]
* Fix Bug #14041: Unpredictable unit test processing sequence [dufuz]
* Fix Bug #14140: Strict warning not suppressed in the shutdown function [dufuz]
* Fix Bug #14210: pear list -ia brings warnings [dufuz]
* Fix Bug #14274: PEAR packager mangles package.xml encoding, then complains about it [dufuz]
* Fix Bug #14287: cannot upgrade from stable to beta via -beta when config is set to stable [dufuz]
* Fix Bug #14300: Package files themselves can not be served over https [dufuz / initial patch by Martin Roos]
* Fix Bug #14437: openbasedir warning when loading config [dufuz]
* Fix Bug #14558: PackageFile.php creates tmp directory outside configured temp_dir [cweiske]
* Fix Bug #14947: downloadHttp() is missing Host part of the HTTP Request when using Proxy [ifeghali]
* Fix Bug #14977: PEAR/Frontend.php doesn't require_once PEAR.php [dufuz]
* Fix Bug #15750: Unreachable code in PEAR_Downloader [dufuz]
* Fix Bug #15979: Package files incorrectly removed when splitting a package into multiple pkgs [dufuz]
* Fix Bug #15914: pear upgrade installs different version if desired version not found [dufuz]

NOTE!
Functions that have been deprecated for 3+ years in PEAR_Common, please take a moment
to migrate over to one of the alternatives that have ben provided:
* PEAR_Common->downloadHttp (use PEAR_Downloader->downloadHttp instead)
* PEAR_Common->infoFromTgzFile (use PEAR_PackageFile->fromTgzFile instead)
* PEAR_Common->infoFromDescriptionFile (use PEAR_PackageFile->fromPackageFile instead)
* PEAR_Common->infoFromString (use PEAR_PackageFile->fromXmlstring instead)
* PEAR_Common->infoFromArray (use PEAR_PackageFile->fromAnyFile instead)
* PEAR_Common->xmlFromInfo (use a PEAR_PackageFile_v* object's generator instead)
* PEAR_Common->validatePackageInfo (use the validation of PEAR_PackageFile objects)
* PEAR_Common->analyzeSourceCode (use a PEAR_PackageFile_v* object instead)
* PEAR_Common->detectDependencies (use PEAR_Downloader_Package->detectDependencies instead)
* PEAR_Common->buildProvidesArray (use PEAR_PackageFile_v1->_buildProvidesArray or
  PEAR_PackageFile_v2_Validator->_buildProvidesArray)

PHP 4.4 and 5.1.6 are now the minimum PHP requirements, for brave souls
pear upgrade -f PEAR will allow people with lower versions
to upgrade to this release but no guarantees will be made that it will work properly.

Support for XML RPC channels has been dropped - The only ones that used it
(pear.php.net and pecl.php.net) have used the REST interface for years now.
SOAP support also removed as it was only proof of concept.

Move codebase from the PHP License to New BSD 2 clause license";}i:1;a:5:{s:4:"date";s:10:"2009-03-27";s:7:"version";a:2:{s:7:"release";s:8:"1.8.0RC1";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:347:"* Fix Bug #14331: pear cvstag only works from inside the package directory [dufuz]
* Fix Bug #16045: E_Notice: Undefined index: channel in PEAR/DependencyDB.php [dufuz]

* Implemented Request #11230: better error message when mirror not in channel.xml file [dufuz]
* Implemented Request #13150: Add support for following HTTP 302 redirects [dufuz]";}i:2;a:5:{s:4:"date";s:10:"2009-04-10";s:7:"version";a:2:{s:7:"release";s:5:"1.8.0";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:5737:"Changes since RC1:
  * Fix Bug #14792: Bad md5sum for files with replaced content [dufuz]
  * Fix Bug #16057:-r is limited to 4 directories in depth [dufuz]
  * Fix Bug #16077: PEAR5::getStaticProperty does not return a reference to the property [dufuz]

  Remove custom XML_Util class in favor of using upstream XML_Util package as dependency

RC1 Release Notes:
  * Fix Bug #14331: pear cvstag only works from inside the package directory [dufuz]
  * Fix Bug #16045: E_Notice: Undefined index: channel in PEAR/DependencyDB.php [dufuz]

  * Implemented Request #11230: better error message when mirror not in channel.xml file [dufuz]
  * Implemented Request #13150: Add support for following HTTP 302 redirects [dufuz]

Alpha1 Release Notes:
  * Implement Request #10373: if pref_state=stable and installed package=beta, allow up to latest beta version [dufuz]
  * Implement Request #10581: login / logout should map to channel-login / channel-logout [dufuz]
  * Implement Request #10825: Only display the "invalid or missing package file"-error if it makes sense [dufuz]
  * Implement Request #11170: script to generate Command/[command].xml [dufuz]
  * Implement Request #11176: improve channel ... has updated its protocols message [dufuz]
  * Implement Request #12706: pear list -a hard to read [dufuz]
  * Implement Request #11353: upgrade-all and upgrade commands to upgrade within the same stability level [dufuz]
  * Implement Request #13015: Add https discovery for channel.xml [dufuz / initial patch by Martin Roos]
  * Implement Request #13927: install-pear.php should have option to set www_dir [timj]
  * Implement Request #14324: Make the pear install command behave similar to apt-get [dufuz]
  * Implement Request #14325: make pear upgrade with no params behave like pear upgrade-all [dufuz]
    - upgrade-all can be considered deprecated in favor of calling upgrade with no parameters to replicate
      better what other package managers are doing. upgrade-all will still work as intended.
  * Implement Request #14504: add a channel parameter support to the upgrade function [dufuz]
    - Options -c ezc and --channel=ezc got added to upgrade and upgrade-all to allow for
      channel specific upgrades
  * Implement Request #14556: install-pear-nozlib.phar should get download_dir config and other options [cweiske]
  * Implement Request #15566: Add doc.php.net as a default channel [dufuz / saltybeagle]

  * Fix PHP Bug #43857: --program-suffix not always reflected everywhere [cellog]
  * Fix PHP Bug #47323: strotime warnings in make install [dufuz]

  * Fix Bug #13908: pear info command and maintainers inactive not mentioned [dufuz]
  * Fix Bug #13926: install-pear.php does not set cfg_dir if -d option set with no -c option [timj]
  * Fix Bug #13943: tests fail when php.exe path contains spaces [dufuz / jorrit]
  * Fix Bug #13953: config-set/config-show with channel alias fail [cellog]
  * Fix Bug #13958: When a phpt tests exit() or die() xdebug coverage is not generated, patch by izi (David Jean Louis) [izi / dufuz]
  * Fix Bug #14041: Unpredictable unit test processing sequence [dufuz]
  * Fix Bug #14140: Strict warning not suppressed in the shutdown function [dufuz]
  * Fix Bug #14210: pear list -ia brings warnings [dufuz]
  * Fix Bug #14274: PEAR packager mangles package.xml encoding, then complains about it [dufuz]
  * Fix Bug #14287: cannot upgrade from stable to beta via -beta when config is set to stable [dufuz]
  * Fix Bug #14300: Package files themselves can not be served over https [dufuz / initial patch by Martin Roos]
  * Fix Bug #14437: openbasedir warning when loading config [dufuz]
  * Fix Bug #14558: PackageFile.php creates tmp directory outside configured temp_dir [cweiske]
  * Fix Bug #14947: downloadHttp() is missing Host part of the HTTP Request when using Proxy [ifeghali]
  * Fix Bug #14977: PEAR/Frontend.php doesn't require_once PEAR.php [dufuz]
  * Fix Bug #15750: Unreachable code in PEAR_Downloader [dufuz]
  * Fix Bug #15979: Package files incorrectly removed when splitting a package into multiple pkgs [dufuz]
  * Fix Bug #15914: pear upgrade installs different version if desired version not found [dufuz]

  NOTE!
  Functions that have been deprecated for 3+ years in PEAR_Common, please take a moment
  to migrate over to one of the alternatives that have ben provided:
  * PEAR_Common->downloadHttp (use PEAR_Downloader->downloadHttp instead)
  * PEAR_Common->infoFromTgzFile (use PEAR_PackageFile->fromTgzFile instead)
  * PEAR_Common->infoFromDescriptionFile (use PEAR_PackageFile->fromPackageFile instead)
  * PEAR_Common->infoFromString (use PEAR_PackageFile->fromXmlstring instead)
  * PEAR_Common->infoFromArray (use PEAR_PackageFile->fromAnyFile instead)
  * PEAR_Common->xmlFromInfo (use a PEAR_PackageFile_v* object's generator instead)
  * PEAR_Common->validatePackageInfo (use the validation of PEAR_PackageFile objects)
  * PEAR_Common->analyzeSourceCode (use a PEAR_PackageFile_v* object instead)
  * PEAR_Common->detectDependencies (use PEAR_Downloader_Package->detectDependencies instead)
  * PEAR_Common->buildProvidesArray (use PEAR_PackageFile_v1->_buildProvidesArray or
    PEAR_PackageFile_v2_Validator->_buildProvidesArray)

  PHP 4.4 and 5.1.6 are now the minimum PHP requirements, for brave souls
  pear upgrade -f PEAR will allow people with lower versions
  to upgrade to this release but no guarantees will be made that it will work properly.

  Support for XML RPC channels has been dropped - The only ones that used it
  (pear.php.net and pecl.php.net) have used the REST interface for years now.
  SOAP support also removed as it was only proof of concept.

  Move codebase from the PHP License to New BSD 2 clause license";}i:3;a:5:{s:4:"date";s:10:"2009-04-15";s:7:"version";a:2:{s:7:"release";s:5:"1.8.1";s:3:"api";s:5:"1.8.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:58:"* Fix Bug #16099 	PEAR crash on PHP4 (parse error) [dufuz]";}i:4;a:5:{s:4:"date";s:10:"2009-08-18";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC1";s:3:"api";s:8:"1.9.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1106:"* Implement Request #16213: add alias to list-channels output [dufuz]
* Implement Request #16378: pear svntag [dufuz]
* Implement Request #16386: PEAR_Config::remove() does not support specifying a channel [timj]
* Implement Request #16396: package-dependencies should allow package names [dufuz]

* Fix Bug #11181: pear requests channel.xml from main server instead from mirror [dufuz]
* Fix Bug #14493: pear install --offline doesn't print out errors [dufuz]
* Fix Bug #11348: pear package-dependencies isn't well explained [dufuz]
* Fix Bug #16108: PEAR_PackageFile_Generator_v2 PHP4 parse error when running upgrade-all [dufuz]
* Fix Bug #16113: Installing certain packages fails due incorrect encoding handling [dufuz]
* Fix Bug #16122: PEAR RunTest failed to run as expected [dufuz]
* Fix Bug #16366: compiling 5.2.10 leads to non-functioning pear [dufuz]
* Fix Bug #16387: channel-logout does not support logging out from a non-default channel [timj]
* Fix Bug #16444: Setting preferred mirror fails [dufuz]
* Fix the shutdown functions where a index might not exist and thus raise a notice [derick]";}i:5;a:5:{s:4:"date";s:10:"2009-08-20";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC2";s:3:"api";s:8:"1.9.0RC2";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:107:"* REST 1.4 file was occasionally being included but REST 1.4 is not intended for this release cycle [dufuz]";}i:6;a:5:{s:4:"date";s:10:"2009-08-21";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC3";s:3:"api";s:8:"1.9.0RC3";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:70:"* Improved svntag support to handle packages like PEAR it self [dufuz]";}i:7;a:5:{s:4:"date";s:10:"2009-08-23";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC4";s:3:"api";s:8:"1.9.0RC4";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:244:"* Fixed a problem where the original channel could not be set as a preferred_mirror again [dufuz]
* Make sure channel aliases can't be made to start with - [dufuz]
* Output issues with pear search [dufuz]
* Fixed couple of stray notices [dufuz]";}i:8;a:5:{s:4:"date";s:10:"2009-09-03";s:7:"version";a:2:{s:7:"release";s:5:"1.9.0";s:3:"api";s:5:"1.9.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:86:"* Fix  Bug #16547: The phar for PEAR installer uses ereg() which is deprecated [dufuz]";}i:9;a:5:{s:4:"date";s:10:"2010-05-26";s:7:"version";a:2:{s:7:"release";s:5:"1.9.1";s:3:"api";s:5:"1.9.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1111:"* svntag improvements, tag package files passed into the command and better directory checks [dufuz]
* rely on Structures_Graph minimum version instead of recommended version [saltybeagle]
* Fix Bug #12613: running go-pear.phar from C:\ fails [dufuz]
* Fix Bug #14841: Installing pear into directory with space fails [dufuz]
* Fix Bug #16644: pear.bat returns syntax error when parenthesis are in install path. [dufuz] [patch by bwaters (Bryan Waters)]
* Fix Bug #16767: Use of Depreciated HTML Attributes in the Exception class [dufuz] [patch by fuhrysteve (Stephen J. Fuhry)]
* Fix Bug #16864: "pear list-upgrades -i" issues E_WARNINGS [dufuz] [patch by rquadling (Richard Quadling)]
* Fix Bug #17220: command `pear help` outputs to stderr instead of stdout [dufuz]
* Fix Bug #17234: channel-discover adds port to HTTP Host header [dufuz]
* Fix Bug #17292: Code Coverage in PEAR_RunTest does not work with namespaces [sebastian]
* Fix Bug #17359: loadExtension() fails over missing dl() when used in multithread env [dufuz]
* Fix Bug #17378: pear info $package fails if directory with that name exists [dufuz]";}i:10;a:6:{s:4:"date";s:10:"2011-02-28";s:4:"time";s:8:"18:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.2";s:3:"api";s:5:"1.9.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1258:"Important! This is a security fix release. The advisory can be found at
http://pear.php.net/advisory-20110228.txt

    Bugs:
    * Fixed Bug #17463: Regression: On Windows, svntag [patch by doconnor]
    * Fixed Bug #17641: pecl-list doesn't sort packages by name [dufuz]
    * Fixed Bug #17781: invalid argument warning on foreach due to an empty optional dependencie [dufuz]
    * Fixed Bug #17801: PEAR run-tests wrongly detects php-cgi [patch by David Jean Louis (izi)]
    * Fixed Bug #17839: pear svntag does not tag package.xml file [dufuz]
    * Fixed Bug #17986: PEAR Installer cannot handle files moved between packages [dufuz]
    * Fixed Bug #17997: Strange output if directories are not writeable [dufuz]
    * Fixed Bug #18001: PEAR/RunTest coverage fails [dufuz]
    * Fixed Bug #18056 [SECURITY]: Symlink attack in PEAR install [dufuz]
    * Fixed Bug #18218: "pear package" does not allow the use of late static binding [dufuz and Christer Edvartsen]
    * Fixed Bug #18238: Wrong return code from "pear help" [till]
    * Fixed Bug #18308: Broken error message about missing channel validator [yunosh]

    This feature is implemented as a result of #18056
    * Implemented Request #16648: Use TMPDIR for builds instead of /var/tmp [dufuz]";}i:11;a:6:{s:4:"date";s:10:"2011-06-04";s:4:"time";s:8:"15:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.3";s:3:"api";s:5:"1.9.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:820:"* Fixed Bug #17744: Empty changelog causes fatal error in setChangelogentry [dufuz]
* Fixed Bug #18340: raiseErro typo [doconnor]
* Fixed Bug #18349: package.xml version not recognized when single quoted [dufuz]
* Fixed Bug #18364: date.timezone errors for sh/bat files when TZ is not set in php.ini [dufuz]
* Fixed Bug #18388: Parentheses error in REST.php line 232 [dufuz]
* Fixed Bug #18428: invalid preg_match patterns [glen]
* Fixed Bug #18486: REST/10.php does not check error condition [dufuz]
* Fixed a problem in RunTest and code coverage. Correctly register the
  code coverage shutdown function in case we are inside a namespace. [sebastian]
* Fixed a bug with extensions not providing their config.m4 and co in the root directory of
  their pecl package but rather in a sub directory, such as xhprof. [dufuz]";}i:12;a:6:{s:4:"date";s:10:"2011-07-06";s:4:"time";s:8:"15:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.4";s:3:"api";s:5:"1.9.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:705:"Bug Fixes:
* Bug #17350: "pear install --force" doesn't uninstall files from previous pkg versions [dufuz]
* Bug #18362: A whitespace TEMP_DIR path breaks install/upgrade functionality [dufuz]
* Bug #18440: bad tmp folder path on install : Unable to create path for C:/Program/tmp [dufuz]
* Bug #18581: "config-get -c" not returning channel's configuration when using alias [dufuz]
* Bug #18639: regression: installing xdebug fails most likely due to another fix [dufuz]

Features
* All System (the class) functions can now take in spaced paths as long as they are surrounded in quotes.
  Prior to this it was possible to do that by passing all values in as an array (by product of #18362, #18440) [dufuz]";}i:13;a:6:{s:4:"date";s:10:"2014-06-27";s:4:"time";s:8:"18:17:00";s:7:"version";a:2:{s:7:"release";s:9:"1.9.5dev1";s:3:"api";s:5:"1.9.5";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1093:"Bug fixes:
* Fix bug #18343: Entities in file names decoded during packaging [cweiske]
* Fix bug #18665: pecl extensions not enabled in empty php.ini files [Louis Opter]
* Fix bug #18834: Do not truncate cache file if it is a symlink [avb]
* Fix bug #18892: Parse error in Installer.php [ashnazg]
* Fix bug #19482: fix pearcmd for include paths with trailing backslash [cweiske]
* Fix bug #19793: PHP Notice about ob_end_clean() [cweiske]
* Fix bug #20086: Invalid regexp in PEAR_Builder::build() [avb]
* Fix bug #20203: split content-type and get real mime type [Samu Voutilainen]
* Fix bug #20283: use full path for "zend_extension=..." [cweiske]
* Fix bug #20284: Reset interpreter before running --CLEAN-- section php-cgi run [Mats Lindh]
* Fix bug #20285: fix spelling mistakes [Veres Lajos]
* Fix bug #20286: Support access of static variables on objects in validator [cweiske]
* Fix bug #20321: Correctly detect name of current user during installation [cweiske]
* Fix bug: let pear run-tests fail when there are failed tests [cweiske]
* Prepare a test for bug #18056 / bug #18834 [avb]";}i:14;a:6:{s:4:"date";s:10:"2014-07-12";s:4:"time";s:8:"14:22:23";s:7:"version";a:2:{s:7:"release";s:5:"1.9.5";s:3:"api";s:5:"1.9.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1137:"No changes since 1.9.5.dev1.

Bug fixes in 1.9.5.dev1:
* Fix bug #18343: Entities in file names decoded during packaging [cweiske]
* Fix bug #18665: pecl extensions not enabled in empty php.ini files [Louis Opter]
* Fix bug #18834: Do not truncate cache file if it is a symlink [avb]
* Fix bug #18892: Parse error in Installer.php [ashnazg]
* Fix bug #19482: fix pearcmd for include paths with trailing backslash [cweiske]
* Fix bug #19793: PHP Notice about ob_end_clean() [cweiske]
* Fix bug #20086: Invalid regexp in PEAR_Builder::build() [avb]
* Fix bug #20203: split content-type and get real mime type [Samu Voutilainen]
* Fix bug #20283: use full path for "zend_extension=..." [cweiske]
* Fix bug #20284: Reset interpreter before running --CLEAN-- section php-cgi run [Mats Lindh]
* Fix bug #20285: fix spelling mistakes [Veres Lajos]
* Fix bug #20286: Support access of static variables on objects in validator [cweiske]
* Fix bug #20321: Correctly detect name of current user during installation [cweiske]
* Fix bug: let pear run-tests fail when there are failed tests [cweiske]
* Prepare a test for bug #18056 / bug #18834 [avb]";}i:15;a:6:{s:4:"date";s:10:"2015-07-25";s:4:"time";s:8:"13:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev1";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:444:"* Implement #20488: Add support for PHP 7 [cweiske]
* Drop support for PHP 4 and 5.0 - 5.3 [cweiske]
* Remove deprecated methods [cweiske]
* Fix static warnings [cweiske]
* Fix #17045: avoid overwriting include path [glen]
* Fix #17399: "pear help" doesn't mention the "version" command [kguest]
* Add --showdiff to "pear run-tests" to print diff for failed tests [tyrael]
* Fix channel.xml downloading from https if it did not change [cweiske]";}i:16;a:6:{s:4:"date";s:10:"2015-07-31";s:4:"time";s:8:"09:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev2";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:328:"* Fix #18638 and #18405: Make PEAR::loadExtension static [cweiske]
* Fix #20319: allow pear to work when cache_dir is not writable [remicollet]
* Implement #20333: New role=man for man pages [bjori]
* Implement #20334: add "metadata_dir" configuration option [remicollet]
* Add long option names to install-pear.php [remicollet]";}i:17;a:6:{s:4:"date";s:10:"2015-09-28";s:4:"time";s:8:"09:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev3";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:227:"* Fix #20507: pear list-upgrades does not take PHP version into account [cweiske]
* Fix #20927: Use correct php-config [cweiske]
* Fix #20946: PEAR_Builder::log() declaration [remicollet]
* Remove PEAR/ErrorStack5.php [cweiske]";}i:18;a:6:{s:4:"date";s:10:"2015-10-07";s:4:"time";s:8:"11:22:42";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1068:"No changes since version 1.10.0dev3.

Changes since version 1.9.5:
* Implement #20488: Add support for PHP 7 [cweiske]
* Drop support for PHP 4 and 5.0 - 5.3 [cweiske]
* Remove deprecated methods [cweiske]
* Add --showdiff to "pear run-tests" to print diff for failed tests [tyrael]
* Implement #20333: New role=man for man pages [bjori]
* Implement #20334: add "metadata_dir" configuration option [remicollet]
* Add long option names to install-pear.php [remicollet]
* Remove PEAR/ErrorStack5.php [cweiske]
* Fix #17045: avoid overwriting include path [glen]
* Fix #17399: "pear help" doesn't mention the "version" command [kguest]
* Fix #18638 and #18405: Make PEAR::loadExtension static [cweiske]
* Fix #20319: allow pear to work when cache_dir is not writable [remicollet]
* Fix #20507: pear list-upgrades does not take PHP version into account [cweiske]
* Fix #20927: Use correct php-config [cweiske]
* Fix #20946: PEAR_Builder::log() declaration [remicollet]
* Fix channel.xml downloading from https if it did not change [cweiske]
* Fix static warnings [cweiske]";}i:19;a:6:{s:4:"date";s:10:"2015-10-17";s:4:"time";s:8:"13:22:42";s:7:"version";a:2:{s:7:"release";s:6:"1.10.1";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:229:"* Fix bug #20959: Crash on channel discovery with channel.xml redirect [cweiske]
* Fix bug #20968: Incorrect call to __construct() from PEAR() [edlman]
* Add legacy constructor for PEAR_Error for backwards compatibility [cweiske]";}i:20;a:6:{s:4:"date";s:10:"2017-02-28";s:4:"time";s:8:"07:40:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.2";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:544:"* Fix Bug #4426:  PEAR_Autoloader __call() must take only 2 arguments [kna]
* Fix Bug #20989: fatal error/bug in the postinstallscript task [kguest]
* Fix Bug #20991: Strict Standards: startSession and run methods in PEAR_Task_Postinstallscript [kguest]
* Fix Bug #21001: PEAR_ERROR_DIE exit code is 0 [danielc]

* Pull Request #52: Channel's _lastmodified is an int and not a string [sathieu]
* Pull Request #53: Add proper HTTPS proxy support through the CONNECT verb [youknow0]
* Pull Request #58: Make method signatures compatible. [yunosh]";}i:21;a:6:{s:4:"date";s:10:"2017-02-28";s:4:"time";s:8:"10:15:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.3";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:42:"* Bug #21188: Class 'PEAR_Proxy' not found";}i:22;a:5:{s:4:"date";s:10:"2017-04-25";s:7:"version";a:2:{s:7:"release";s:6:"1.10.4";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:50:"* Bug #18102:  pear install does not fail on error";}i:23;a:5:{s:4:"date";s:10:"2017-06-27";s:7:"version";a:2:{s:7:"release";s:6:"1.10.5";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:73:"* Bug #21222:  PHP 7.2 compatibility: Upgrade to Archive_Tar 1.4.3 needed";}i:24;a:5:{s:4:"date";s:10:"2018-08-22";s:7:"version";a:2:{s:7:"release";s:6:"1.10.6";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:544:"* PR #70:  Fix notice undefined variable metadata_dir
* PR #71:  fix Warning: count(): Parameter must be an array or an object
* PR #74:  Bug #23744 Remove is_executable check
  * Bug #23744:  The is_executable check in the Which method when run on Windows is unnecessary
* PR #75:  Migrate old while(list() = each()) constructs to foreach
* PR #76:  Fix PHP Warning: "continue" targeting switch is equivalent to "break"
* PR #77:  proxy server auth
  * PR #72:  Correctly authenticate at proxy server
* PR #78:  array or Countable error in 7.2";}i:25;a:5:{s:4:"date";s:10:"2018-12-05";s:7:"version";a:2:{s:7:"release";s:6:"1.10.7";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:238:"* PR #79:  Prevent Unable to find the wrapper "channel" Warning
* PR #80:  fix Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"
* PR #81:  Add flags to PECL shell script for shared extensions";}i:26;a:5:{s:4:"date";s:10:"2019-02-07";s:7:"version";a:2:{s:7:"release";s:6:"1.10.8";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:83:"* PR #83:  Drop track_errors from options
* PR #84:  Fix PHP 8 compatibility issues";}i:27;a:5:{s:4:"date";s:10:"2019-03-13";s:7:"version";a:2:{s:7:"release";s:6:"1.10.9";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:191:"* PR #85:  Fixes static calls for PHP 8
* PR #86:  Adjust silencing check for PHP 8
* PR #87:  Comparison fixes
* PR #88:  Only add bin_dir to PATH if not already there (fixes PHP Bug #75852)";}i:28;a:5:{s:4:"date";s:10:"2019-11-19";s:7:"version";a:2:{s:7:"release";s:7:"1.10.10";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:672:"* PR #89:  Fix scripts/* include paths
* PR #90:  Non-interactive configureoption answers
* PR #91:  Added missing preg quote
* PR #92:  handle "lib64" case for glibc detection
* PR #93:  Fix PHP Notice: Trying to access array offset on value of type bool with 7.4
* PR #94:  Updated logic in useLocalCache to reuse getCacheId
* PR #95:  Fix manpage warning
* PR #96:  Implement the SOURCE_DATE_EPOCH specification
* PR #97:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #98:  Fix use of null/false as array
* PR #99:  Fix Travis builds on PHP 5.4 and 5.5
* PR #100: Honor PHP temp directory config
* PR #101: Fix documentation: the `--force` is required";}i:29;a:5:{s:4:"date";s:10:"2020-04-10";s:7:"version";a:2:{s:7:"release";s:7:"1.10.11";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:230:"* PR #102: Fix logging error for urls not in cache
* PR #103: Fix undefined constant name
* PR #105: Sort list of packages
* PR #106: Update REST.php
* PR #107: Update .travis.yml to include PHP 7.4
* PR #108: Remove unneeded code";}i:30;a:5:{s:4:"date";s:10:"2020-04-19";s:7:"version";a:2:{s:7:"release";s:7:"1.10.12";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:43:"* adjust dependencies based on new releases";}i:31;a:5:{s:4:"date";s:10:"2021-08-10";s:7:"version";a:2:{s:7:"release";s:7:"1.10.13";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:116:"* PR #114: unsupported protocol - use --force to continue
* PR #117: Add $this operator to _determineIfPowerpc calls";}i:32;a:5:{s:4:"date";s:10:"2023-11-26";s:7:"version";a:2:{s:7:"release";s:7:"1.10.14";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:583:"* PR #112: Put glue and pieces parameters to implode in correct order for PHP 7.4+
* PR #121: Fix PHP bug 81653: Typo in install-pear-nozlib.phar
* PR #122: add %S EXPECTF capability
* PR #124: Fix: Creation of dynamic property PEAR_Error::$callback is deprecated
* PR #125: Fixed extension loaded check for pecl binaries
* PR #126: Remove -n option from pecl.bat for shared extensions
* PR #127: fix Using ${var} in strings is deprecated
* PR #128: fix lingering license references to PHP license
* PR #129: Exclude tests from composer classmap
* PR #131: fix private lastError name";}i:33;a:5:{s:4:"date";s:10:"2024-03-09";s:7:"version";a:2:{s:7:"release";s:7:"1.10.15";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:100:"* PR #132: cleanup uneeded test
* PR #135: Fix PHP Deprecated: Calling get_class() without arguments";}i:34;a:5:{s:4:"date";s:10:"2024-11-24";s:7:"version";a:2:{s:7:"release";s:7:"1.10.16";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";}}}s:8:"filelist";a:102:{s:12:"OS/Guess.php";a:4:{s:6:"md5sum";s:32:"c0482b234f269360953c87472b5cf746";s:4:"name";s:12:"OS/Guess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php73/usr/share/pear/OS/Guess.php";}s:27:"PEAR/ChannelFile/Parser.php";a:4:{s:6:"md5sum";s:32:"3b371e9c6b4d667abb8be01f2788dcf9";s:4:"name";s:27:"PEAR/ChannelFile/Parser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/ChannelFile/Parser.php";}s:21:"PEAR/Command/Auth.xml";a:4:{s:6:"md5sum";s:32:"8fd87e64002e11fd86eb2f3fbfee6599";s:4:"name";s:21:"PEAR/Command/Auth.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Command/Auth.xml";}s:21:"PEAR/Command/Auth.php";a:4:{s:6:"md5sum";s:32:"65b6b36c4cc53f2836ad09b070829877";s:4:"name";s:21:"PEAR/Command/Auth.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Command/Auth.php";}s:22:"PEAR/Command/Build.xml";a:4:{s:6:"md5sum";s:32:"ce6bb5b6fdc02e0f50e7676403fd84a4";s:4:"name";s:22:"PEAR/Command/Build.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php73/usr/share/pear/PEAR/Command/Build.xml";}s:22:"PEAR/Command/Build.php";a:4:{s:6:"md5sum";s:32:"e19325f59c4013694a4a06b61e7ac3be";s:4:"name";s:22:"PEAR/Command/Build.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php73/usr/share/pear/PEAR/Command/Build.php";}s:25:"PEAR/Command/Channels.xml";a:4:{s:6:"md5sum";s:32:"6d5aab4d4308c3005b5f584c7783a031";s:4:"name";s:25:"PEAR/Command/Channels.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/PEAR/Command/Channels.xml";}s:25:"PEAR/Command/Channels.php";a:4:{s:6:"md5sum";s:32:"56b3b36834a751f6e7b86dcba6cefe2f";s:4:"name";s:25:"PEAR/Command/Channels.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/PEAR/Command/Channels.php";}s:23:"PEAR/Command/Common.php";a:4:{s:6:"md5sum";s:32:"aae7cc03e9b7fe7c4f504b970dca5411";s:4:"name";s:23:"PEAR/Command/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Common.php";}s:23:"PEAR/Command/Config.xml";a:4:{s:6:"md5sum";s:32:"91f189cb9423b5e87ee0abc5ea1a2be3";s:4:"name";s:23:"PEAR/Command/Config.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Config.xml";}s:23:"PEAR/Command/Config.php";a:4:{s:6:"md5sum";s:32:"3c5d633b0e8d4e39e9bfb286f51130a5";s:4:"name";s:23:"PEAR/Command/Config.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Config.php";}s:24:"PEAR/Command/Install.xml";a:4:{s:6:"md5sum";s:32:"24d05213cae7faa3880bbb5e40998867";s:4:"name";s:24:"PEAR/Command/Install.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Command/Install.xml";}s:24:"PEAR/Command/Install.php";a:4:{s:6:"md5sum";s:32:"3dab53d092878709aa16f73143600107";s:4:"name";s:24:"PEAR/Command/Install.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Command/Install.php";}s:23:"PEAR/Command/Mirror.xml";a:4:{s:6:"md5sum";s:32:"5cb62a04c0a268f4edd64a49a3895c92";s:4:"name";s:23:"PEAR/Command/Mirror.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Mirror.xml";}s:23:"PEAR/Command/Mirror.php";a:4:{s:6:"md5sum";s:32:"2f5798bb62453d8d1bffa3d050584232";s:4:"name";s:23:"PEAR/Command/Mirror.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Mirror.php";}s:24:"PEAR/Command/Package.xml";a:4:{s:6:"md5sum";s:32:"9367dcd7e4dbdde423f9c4c7d3f3a919";s:4:"name";s:24:"PEAR/Command/Package.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Command/Package.xml";}s:24:"PEAR/Command/Package.php";a:4:{s:6:"md5sum";s:32:"a0a6b2ba1e67351359cf105b6f863806";s:4:"name";s:24:"PEAR/Command/Package.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Command/Package.php";}s:23:"PEAR/Command/Pickle.xml";a:4:{s:6:"md5sum";s:32:"28dc842ea725d8787b9f9c3dbca5aa22";s:4:"name";s:23:"PEAR/Command/Pickle.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Pickle.xml";}s:23:"PEAR/Command/Pickle.php";a:4:{s:6:"md5sum";s:32:"4025dd6411a73b19a5c19b3300060625";s:4:"name";s:23:"PEAR/Command/Pickle.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Pickle.php";}s:25:"PEAR/Command/Registry.xml";a:4:{s:6:"md5sum";s:32:"49b046cfc14747f0365e02e9c3f0e6dc";s:4:"name";s:25:"PEAR/Command/Registry.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/PEAR/Command/Registry.xml";}s:25:"PEAR/Command/Registry.php";a:4:{s:6:"md5sum";s:32:"9f2ea65794243f0b7287e8883f2ab60e";s:4:"name";s:25:"PEAR/Command/Registry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/PEAR/Command/Registry.php";}s:23:"PEAR/Command/Remote.xml";a:4:{s:6:"md5sum";s:32:"29c02e823879b4e3e291f6b36fb339f1";s:4:"name";s:23:"PEAR/Command/Remote.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Remote.xml";}s:23:"PEAR/Command/Remote.php";a:4:{s:6:"md5sum";s:32:"42c51cbb21c103fe0288e5c16871f401";s:4:"name";s:23:"PEAR/Command/Remote.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Command/Remote.php";}s:21:"PEAR/Command/Test.xml";a:4:{s:6:"md5sum";s:32:"a50c32015005e0761cc3b04679b29ed0";s:4:"name";s:21:"PEAR/Command/Test.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Command/Test.xml";}s:21:"PEAR/Command/Test.php";a:4:{s:6:"md5sum";s:32:"fbb0098fcda7fa29adaa0714a325caea";s:4:"name";s:21:"PEAR/Command/Test.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Command/Test.php";}s:27:"PEAR/Downloader/Package.php";a:4:{s:6:"md5sum";s:32:"9229a9711a893a18298e473212689ab4";s:4:"name";s:27:"PEAR/Downloader/Package.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Downloader/Package.php";}s:21:"PEAR/Frontend/CLI.php";a:4:{s:6:"md5sum";s:32:"5379be9492842c3af98241c6e226d285";s:4:"name";s:21:"PEAR/Frontend/CLI.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Frontend/CLI.php";}s:30:"PEAR/Installer/Role/Common.php";a:4:{s:6:"md5sum";s:32:"adae220f10a82e5f78b8689a57387753";s:4:"name";s:30:"PEAR/Installer/Role/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Common.php";}s:27:"PEAR/Installer/Role/Cfg.xml";a:4:{s:6:"md5sum";s:32:"d8c62e6275e3aaa7784290912406092c";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Cfg.xml";}s:27:"PEAR/Installer/Role/Cfg.php";a:4:{s:6:"md5sum";s:32:"d89d39dcc1c55fb4464f447ce4f84eed";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Cfg.php";}s:28:"PEAR/Installer/Role/Data.xml";a:4:{s:6:"md5sum";s:32:"89a4a2a286e842d45a98974f40a0565c";s:4:"name";s:28:"PEAR/Installer/Role/Data.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Data.xml";}s:28:"PEAR/Installer/Role/Data.php";a:4:{s:6:"md5sum";s:32:"89754e8d153937f3dd3266fd8897d965";s:4:"name";s:28:"PEAR/Installer/Role/Data.php";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Data.php";}s:27:"PEAR/Installer/Role/Doc.xml";a:4:{s:6:"md5sum";s:32:"b1ce0fe105251c3b75209d6518ee69ac";s:4:"name";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Doc.xml";}s:27:"PEAR/Installer/Role/Doc.php";a:4:{s:6:"md5sum";s:32:"849c557b355f78890ef47fcfd12073ab";s:4:"name";s:27:"PEAR/Installer/Role/Doc.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Doc.php";}s:27:"PEAR/Installer/Role/Ext.xml";a:4:{s:6:"md5sum";s:32:"af71c0ad42d16a323afe24a4f884ef15";s:4:"name";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Ext.xml";}s:27:"PEAR/Installer/Role/Ext.php";a:4:{s:6:"md5sum";s:32:"7d3dc799576b3e3d74d187de118cc3e4";s:4:"name";s:27:"PEAR/Installer/Role/Ext.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Ext.php";}s:27:"PEAR/Installer/Role/Man.xml";a:4:{s:6:"md5sum";s:32:"da6743f1e45cce72ea13aef5cdb14867";s:4:"name";s:27:"PEAR/Installer/Role/Man.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Man.xml";}s:27:"PEAR/Installer/Role/Man.php";a:4:{s:6:"md5sum";s:32:"2509a027ae42c4b96aa49557325a0ec4";s:4:"name";s:27:"PEAR/Installer/Role/Man.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Man.php";}s:27:"PEAR/Installer/Role/Php.xml";a:4:{s:6:"md5sum";s:32:"ef88f0321d3e481c2130c95122cf76d8";s:4:"name";s:27:"PEAR/Installer/Role/Php.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Php.xml";}s:27:"PEAR/Installer/Role/Php.php";a:4:{s:6:"md5sum";s:32:"d7547896ec403dba2eed9825ed86ea64";s:4:"name";s:27:"PEAR/Installer/Role/Php.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Php.php";}s:30:"PEAR/Installer/Role/Script.xml";a:4:{s:6:"md5sum";s:32:"746461dc3b48af6d24094cb0211608f2";s:4:"name";s:30:"PEAR/Installer/Role/Script.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Script.xml";}s:30:"PEAR/Installer/Role/Script.php";a:4:{s:6:"md5sum";s:32:"325c60df7f78be127741621561758f46";s:4:"name";s:30:"PEAR/Installer/Role/Script.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Script.php";}s:27:"PEAR/Installer/Role/Src.xml";a:4:{s:6:"md5sum";s:32:"e147d63f168ea156fc2be38caaa63804";s:4:"name";s:27:"PEAR/Installer/Role/Src.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Src.xml";}s:27:"PEAR/Installer/Role/Src.php";a:4:{s:6:"md5sum";s:32:"464722cee0665ebc75757f76532f0ab2";s:4:"name";s:27:"PEAR/Installer/Role/Src.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Src.php";}s:28:"PEAR/Installer/Role/Test.xml";a:4:{s:6:"md5sum";s:32:"a24b596ec987aa5688fc19e8ed4e97ea";s:4:"name";s:28:"PEAR/Installer/Role/Test.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Test.xml";}s:28:"PEAR/Installer/Role/Test.php";a:4:{s:6:"md5sum";s:32:"a04eb2f4881ec6e6a13ae78f6a43e3cd";s:4:"name";s:28:"PEAR/Installer/Role/Test.php";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Test.php";}s:27:"PEAR/Installer/Role/Www.xml";a:4:{s:6:"md5sum";s:32:"7641e71c5785bb33a4261ebe25ed0fd7";s:4:"name";s:27:"PEAR/Installer/Role/Www.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Www.xml";}s:27:"PEAR/Installer/Role/Www.php";a:4:{s:6:"md5sum";s:32:"62699034e3186c2d68a6bb56a6cc23eb";s:4:"name";s:27:"PEAR/Installer/Role/Www.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role/Www.php";}s:23:"PEAR/Installer/Role.php";a:4:{s:6:"md5sum";s:32:"e95f2d850fce183e221912b2c2056d04";s:4:"name";s:23:"PEAR/Installer/Role.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role.php";}s:33:"PEAR/PackageFile/Generator/v1.php";a:4:{s:6:"md5sum";s:32:"cfa08685115d5e2d7635225d73a91f39";s:4:"name";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Generator/v1.php";}s:33:"PEAR/PackageFile/Generator/v2.php";a:4:{s:6:"md5sum";s:32:"8d264031153993866828e82129e389ab";s:4:"name";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Generator/v2.php";}s:30:"PEAR/PackageFile/Parser/v1.php";a:4:{s:6:"md5sum";s:32:"a2206e0e32ad2ba2f4e2a0c1797f295c";s:4:"name";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Parser/v1.php";}s:30:"PEAR/PackageFile/Parser/v2.php";a:4:{s:6:"md5sum";s:32:"3857f4b60878d64551a7cdae783437f7";s:4:"name";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Parser/v2.php";}s:26:"PEAR/PackageFile/v2/rw.php";a:4:{s:6:"md5sum";s:32:"a253999b2109460badc3c71ad2c069e7";s:4:"name";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/v2/rw.php";}s:33:"PEAR/PackageFile/v2/Validator.php";a:4:{s:6:"md5sum";s:32:"44dafa313204f68b5fb54b9f61a86d0c";s:4:"name";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/v2/Validator.php";}s:23:"PEAR/PackageFile/v1.php";a:4:{s:6:"md5sum";s:32:"cc1ea307bb79c0cbcff4a90a4656e96e";s:4:"name";s:23:"PEAR/PackageFile/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/v1.php";}s:23:"PEAR/PackageFile/v2.php";a:4:{s:6:"md5sum";s:32:"9e6012d4ef9cb8e12e2ccadcbdcf3d24";s:4:"name";s:23:"PEAR/PackageFile/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/v2.php";}s:16:"PEAR/REST/10.php";a:4:{s:6:"md5sum";s:32:"ce77cc6593d8d4eda5ff8620ff09d6ec";s:4:"name";s:16:"PEAR/REST/10.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/REST/10.php";}s:16:"PEAR/REST/11.php";a:4:{s:6:"md5sum";s:32:"bdbd1f2e8afa2cddddecf2687579d316";s:4:"name";s:16:"PEAR/REST/11.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/REST/11.php";}s:16:"PEAR/REST/13.php";a:4:{s:6:"md5sum";s:32:"11179085b6efb577d37f45cc25e42a35";s:4:"name";s:16:"PEAR/REST/13.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/REST/13.php";}s:34:"PEAR/Task/Postinstallscript/rw.php";a:4:{s:6:"md5sum";s:32:"0eb57da4993a3cfed69fe8135f10b05a";s:4:"name";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/PEAR/Task/Postinstallscript/rw.php";}s:24:"PEAR/Task/Replace/rw.php";a:4:{s:6:"md5sum";s:32:"46c1bdb9a7af8628643e639ec1c3bc58";s:4:"name";s:24:"PEAR/Task/Replace/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Task/Replace/rw.php";}s:24:"PEAR/Task/Unixeol/rw.php";a:4:{s:6:"md5sum";s:32:"50e20dbde7e51bb5e11545c56482b68a";s:4:"name";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Task/Unixeol/rw.php";}s:27:"PEAR/Task/Windowseol/rw.php";a:4:{s:6:"md5sum";s:32:"340be01552844adb50f6e0fa37aa3ffe";s:4:"name";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/PEAR/Task/Windowseol/rw.php";}s:20:"PEAR/Task/Common.php";a:4:{s:6:"md5sum";s:32:"ec7f8db335ad3b5a25d78682745185d1";s:4:"name";s:20:"PEAR/Task/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/PEAR/Task/Common.php";}s:31:"PEAR/Task/Postinstallscript.php";a:4:{s:6:"md5sum";s:32:"86f240c600447fdb86bd38bd32c66c02";s:4:"name";s:31:"PEAR/Task/Postinstallscript.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php73/usr/share/pear/PEAR/Task/Postinstallscript.php";}s:21:"PEAR/Task/Replace.php";a:4:{s:6:"md5sum";s:32:"c993cdedc64084a1c4b735baec048d50";s:4:"name";s:21:"PEAR/Task/Replace.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Task/Replace.php";}s:21:"PEAR/Task/Unixeol.php";a:4:{s:6:"md5sum";s:32:"76c4ca15858c005cda208a9da1f5eb2d";s:4:"name";s:21:"PEAR/Task/Unixeol.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/Task/Unixeol.php";}s:24:"PEAR/Task/Windowseol.php";a:4:{s:6:"md5sum";s:32:"d790eb3aa5ba22a33e42cb7c5f99fb25";s:4:"name";s:24:"PEAR/Task/Windowseol.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/pear/PEAR/Task/Windowseol.php";}s:23:"PEAR/Validator/PECL.php";a:4:{s:6:"md5sum";s:32:"b3c83ca826a4825ca2db726ed7d4b245";s:4:"name";s:23:"PEAR/Validator/PECL.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/PEAR/Validator/PECL.php";}s:16:"PEAR/Builder.php";a:4:{s:6:"md5sum";s:32:"7d89f25a54d100c2afd562fb3bd7c308";s:4:"name";s:16:"PEAR/Builder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/Builder.php";}s:20:"PEAR/ChannelFile.php";a:4:{s:6:"md5sum";s:32:"edcd484ecfd400875df90ee480c5384d";s:4:"name";s:20:"PEAR/ChannelFile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/PEAR/ChannelFile.php";}s:16:"PEAR/Command.php";a:4:{s:6:"md5sum";s:32:"a5d56f9d15ff6d22c12f7db851f281e8";s:4:"name";s:16:"PEAR/Command.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/Command.php";}s:15:"PEAR/Common.php";a:4:{s:6:"md5sum";s:32:"0af44a13df74291ac2f46949d2035e0e";s:4:"name";s:15:"PEAR/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php73/usr/share/pear/PEAR/Common.php";}s:15:"PEAR/Config.php";a:4:{s:6:"md5sum";s:32:"64d0f7b2737e5f182d0ab98bc77930d2";s:4:"name";s:15:"PEAR/Config.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php73/usr/share/pear/PEAR/Config.php";}s:21:"PEAR/DependencyDB.php";a:4:{s:6:"md5sum";s:32:"7e8dfae09802be7f2e6170062bb80cbd";s:4:"name";s:21:"PEAR/DependencyDB.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/PEAR/DependencyDB.php";}s:20:"PEAR/Dependency2.php";a:4:{s:6:"md5sum";s:32:"76fdabdee883fd16b986332552b9e3dc";s:4:"name";s:20:"PEAR/Dependency2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/PEAR/Dependency2.php";}s:19:"PEAR/Downloader.php";a:4:{s:6:"md5sum";s:32:"2ccb7bb2d00eae201ee7ae1eef49ad8a";s:4:"name";s:19:"PEAR/Downloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/PEAR/Downloader.php";}s:19:"PEAR/ErrorStack.php";a:4:{s:6:"md5sum";s:32:"ea807632b63d2e0acd6924db23aaa0eb";s:4:"name";s:19:"PEAR/ErrorStack.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/PEAR/ErrorStack.php";}s:18:"PEAR/Exception.php";a:4:{s:6:"md5sum";s:32:"544ed48cab9407a936d058d09e773e22";s:4:"name";s:18:"PEAR/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/PEAR/Exception.php";}s:17:"PEAR/Frontend.php";a:4:{s:6:"md5sum";s:32:"31c0b91767550adf77f1c9bea92a0559";s:4:"name";s:17:"PEAR/Frontend.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/PEAR/Frontend.php";}s:18:"PEAR/Installer.php";a:4:{s:6:"md5sum";s:32:"b8b85e42b840676ad3ae1c15e55b005b";s:4:"name";s:18:"PEAR/Installer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/PEAR/Installer.php";}s:20:"PEAR/PackageFile.php";a:4:{s:6:"md5sum";s:32:"2929765413405abf63574c8a544e4a04";s:4:"name";s:20:"PEAR/PackageFile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile.php";}s:17:"PEAR/Packager.php";a:4:{s:6:"md5sum";s:32:"ad25a29d464b62cbaaa3ca96e622526c";s:4:"name";s:17:"PEAR/Packager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/PEAR/Packager.php";}s:14:"PEAR/Proxy.php";a:4:{s:6:"md5sum";s:32:"ef9d00adaeccff7516f08170096026d3";s:4:"name";s:14:"PEAR/Proxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:44:"/opt/alt/php73/usr/share/pear/PEAR/Proxy.php";}s:17:"PEAR/Registry.php";a:4:{s:6:"md5sum";s:32:"ae8c1dcfddb6a2717e09239bb1430dc7";s:4:"name";s:17:"PEAR/Registry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/PEAR/Registry.php";}s:13:"PEAR/REST.php";a:4:{s:6:"md5sum";s:32:"389d1bad72267d3ed770abf0662d8086";s:4:"name";s:13:"PEAR/REST.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/PEAR/REST.php";}s:16:"PEAR/RunTest.php";a:4:{s:6:"md5sum";s:32:"df0d7022e22fd78ecd82080ff4f108d5";s:4:"name";s:16:"PEAR/RunTest.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/PEAR/RunTest.php";}s:17:"PEAR/Validate.php";a:4:{s:6:"md5sum";s:32:"3711c281e0234203ec7879f53bc766ab";s:4:"name";s:17:"PEAR/Validate.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/PEAR/Validate.php";}s:18:"PEAR/XMLParser.php";a:4:{s:6:"md5sum";s:32:"da9510087eddd489945dde07260256ee";s:4:"name";s:18:"PEAR/XMLParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/PEAR/XMLParser.php";}s:15:"scripts/pear.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"91657547adb66070aa0e3375f5139783";s:4:"name";s:15:"scripts/pear.sh";s:4:"role";s:6:"script";s:10:"install-as";s:4:"pear";s:12:"installed_as";s:27:"/opt/alt/php73/usr/bin/pear";}s:18:"scripts/peardev.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"df58ecb1d7e9f01cd94639b33e36f3e1";s:4:"name";s:18:"scripts/peardev.sh";s:4:"role";s:6:"script";s:10:"install-as";s:7:"peardev";s:12:"installed_as";s:30:"/opt/alt/php73/usr/bin/peardev";}s:15:"scripts/pecl.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"98ee4640f46a576ad2b30466b7cead83";s:4:"name";s:15:"scripts/pecl.sh";s:4:"role";s:6:"script";s:10:"install-as";s:4:"pecl";s:12:"installed_as";s:27:"/opt/alt/php73/usr/bin/pecl";}s:19:"scripts/pearcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"cff2bee8ab676135039ec66c03008e89";s:4:"name";s:19:"scripts/pearcmd.php";s:4:"role";s:3:"php";s:10:"install-as";s:11:"pearcmd.php";s:12:"installed_as";s:41:"/opt/alt/php73/usr/share/pear/pearcmd.php";}s:19:"scripts/peclcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a995a4faa62187c78d54b8aaa3e7684c";s:4:"name";s:19:"scripts/peclcmd.php";s:4:"role";s:3:"php";s:10:"install-as";s:11:"peclcmd.php";s:12:"installed_as";s:41:"/opt/alt/php73/usr/share/pear/peclcmd.php";}s:7:"LICENSE";a:4:{s:6:"md5sum";s:32:"45b44486d8090de17b2a8b4211fab247";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/doc/pear/PEAR/LICENSE";}s:7:"INSTALL";a:4:{s:6:"md5sum";s:32:"eaac3d33068c6e67573ed44155b149ae";s:4:"name";s:7:"INSTALL";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/doc/pear/PEAR/INSTALL";}s:11:"package.dtd";a:4:{s:6:"md5sum";s:32:"69341ea97af9c88956568f8e7e41d4c6";s:4:"name";s:11:"package.dtd";s:4:"role";s:4:"data";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/data/PEAR/package.dtd";}s:8:"PEAR.php";a:4:{s:6:"md5sum";s:32:"47aeb7eaff6438beb60bc42bc0e6c658";s:4:"name";s:8:"PEAR.php";s:4:"role";s:3:"php";s:12:"installed_as";s:38:"/opt/alt/php73/usr/share/pear/PEAR.php";}s:10:"README.rst";a:4:{s:6:"md5sum";s:32:"cd10521cc4054923a3d2b6e15b4df493";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/doc/pear/PEAR/README.rst";}s:10:"System.php";a:4:{s:6:"md5sum";s:32:"ba9e5c5a567e51b440808a8ed53cd76d";s:4:"name";s:10:"System.php";s:4:"role";s:3:"php";s:12:"installed_as";s:40:"/opt/alt/php73/usr/share/pear/System.php";}s:13:"template.spec";a:4:{s:6:"md5sum";s:32:"acd010e3bc43c0f72df584acde7b9158";s:4:"name";s:13:"template.spec";s:4:"role";s:4:"data";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/data/PEAR/template.spec";}}s:12:"_lastversion";N;s:7:"dirtree";a:23:{s:32:"/opt/alt/php73/usr/share/pear/OS";b:1;s:46:"/opt/alt/php73/usr/share/pear/PEAR/ChannelFile";b:1;s:34:"/opt/alt/php73/usr/share/pear/PEAR";b:1;s:42:"/opt/alt/php73/usr/share/pear/PEAR/Command";b:1;s:45:"/opt/alt/php73/usr/share/pear/PEAR/Downloader";b:1;s:43:"/opt/alt/php73/usr/share/pear/PEAR/Frontend";b:1;s:49:"/opt/alt/php73/usr/share/pear/PEAR/Installer/Role";b:1;s:44:"/opt/alt/php73/usr/share/pear/PEAR/Installer";b:1;s:56:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Generator";b:1;s:46:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile";b:1;s:53:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/Parser";b:1;s:49:"/opt/alt/php73/usr/share/pear/PEAR/PackageFile/v2";b:1;s:39:"/opt/alt/php73/usr/share/pear/PEAR/REST";b:1;s:57:"/opt/alt/php73/usr/share/pear/PEAR/Task/Postinstallscript";b:1;s:39:"/opt/alt/php73/usr/share/pear/PEAR/Task";b:1;s:47:"/opt/alt/php73/usr/share/pear/PEAR/Task/Replace";b:1;s:47:"/opt/alt/php73/usr/share/pear/PEAR/Task/Unixeol";b:1;s:50:"/opt/alt/php73/usr/share/pear/PEAR/Task/Windowseol";b:1;s:44:"/opt/alt/php73/usr/share/pear/PEAR/Validator";b:1;s:22:"/opt/alt/php73/usr/bin";b:1;s:29:"/opt/alt/php73/usr/share/pear";b:1;s:38:"/opt/alt/php73/usr/share/doc/pear/PEAR";b:1;s:39:"/opt/alt/php73/usr/share/pear/data/PEAR";b:1;}s:3:"old";a:7:{s:7:"version";s:7:"1.10.16";s:12:"release_date";s:10:"2024-11-24";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";s:12:"release_deps";a:8:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:11:"Archive_Tar";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.9";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:16:"Structures_Graph";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.1.0";s:8:"optional";s:2:"no";}i:4;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:14:"Console_Getopt";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.1";s:8:"optional";s:2:"no";}i:5;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:8:"XML_Util";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:6;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:3:"xml";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:7;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:4:"pcre";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:11:{i:0;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:17:"Pierre-Alain Joye";s:5:"email";s:14:"pierre@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"pajoye";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:13:"Tomas V.V.Cox";s:5:"email";s:15:"cox@idecnet.com";s:6:"active";s:2:"no";s:6:"handle";s:3:"cox";s:4:"role";s:4:"lead";}i:4;a:5:{s:4:"name";s:13:"Helgi Thormar";s:5:"email";s:13:"dufuz@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"dufuz";s:4:"role";s:4:"lead";}i:5;a:5:{s:4:"name";s:16:"Christian Weiske";s:5:"email";s:15:"cweiske@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"cweiske";s:4:"role";s:4:"lead";}i:6;a:5:{s:4:"name";s:13:"Chuck Burgess";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:7:"ashnazg";s:4:"role";s:4:"lead";}i:7;a:5:{s:4:"name";s:9:"Tias Guns";s:5:"email";s:12:"tias@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"tias";s:4:"role";s:9:"developer";}i:8;a:5:{s:4:"name";s:11:"Tim Jackson";s:5:"email";s:12:"timj@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"timj";s:4:"role";s:6:"helper";}i:9;a:5:{s:4:"name";s:15:"Bertrand Gugger";s:5:"email";s:13:"toggg@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"toggg";s:4:"role";s:6:"helper";}i:10;a:5:{s:4:"name";s:13:"Martin Jansen";s:5:"email";s:10:"mj@php.net";s:6:"active";s:2:"no";s:6:"handle";s:2:"mj";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/.registry/net_idna2.reg000064400000014413151732707770012006 0ustar00a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:36:"https://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:34:"https://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:42:"https://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:151:"https://pear.php.net/dtd/tasks-1.0 https://pear.php.net/dtd/tasks-1.0.xsd https://pear.php.net/dtd/package-2.0 https://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Net_IDNA2";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:31:"Punycode encoding and decoding.";s:11:"description";s:68:"This package helps you to encode and decode punycode strings easily.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:15:"Stefan Neufeind";s:4:"user";s:8:"neufeind";s:5:"email";s:29:"pear.neufeind@speedpartner.de";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Daniel O'Connor";s:4:"user";s:8:"doconnor";s:5:"email";s:24:"daniel.oconnor@gmail.com";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-03-06";s:4:"time";s:8:"20:40:58";s:7:"version";a:2:{s:7:"release";s:5:"0.2.0";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41766020ff8f63f695c9bf7e86040e70";s:4:"name";s:13:"Net/IDNA2.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72f605f2f6d9d56e07bb6bcec099d03a";s:4:"name";s:23:"Net/IDNA2/Exception.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"06c4217024082f0f3b6c5a7e61ac7130";s:4:"name";s:32:"Net/IDNA2/Exception/Nameprep.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"999210e6bd489aba06e5121a2788956f";s:4:"name";s:23:"tests/Net_IDNA2Test.php";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2996ea57df9e5e3153da8a94fbb3c603";s:4:"name";s:42:"tests/draft-josefsson-idn-test-vectors.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:2:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.0";s:3:"api";s:5:"0.1.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2010-06-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:139:"QA Release
Bug #17430 	Multiple Net_IDNA class declarations
Warning: This package is now split between Net_IDNA (php4) and Net_IDNA2 (php5)";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.2.0";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2017-03-06";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";}}}s:8:"filelist";a:5:{s:13:"Net/IDNA2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41766020ff8f63f695c9bf7e86040e70";s:4:"name";s:13:"Net/IDNA2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Net/IDNA2.php";}s:23:"Net/IDNA2/Exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72f605f2f6d9d56e07bb6bcec099d03a";s:4:"name";s:23:"Net/IDNA2/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/Net/IDNA2/Exception.php";}s:32:"Net/IDNA2/Exception/Nameprep.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"06c4217024082f0f3b6c5a7e61ac7130";s:4:"name";s:32:"Net/IDNA2/Exception/Nameprep.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/Net/IDNA2/Exception/Nameprep.php";}s:23:"tests/Net_IDNA2Test.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"999210e6bd489aba06e5121a2788956f";s:4:"name";s:23:"tests/Net_IDNA2Test.php";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/Net_IDNA2/tests/Net_IDNA2Test.php";}s:42:"tests/draft-josefsson-idn-test-vectors.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2996ea57df9e5e3153da8a94fbb3c603";s:4:"name";s:42:"tests/draft-josefsson-idn-test-vectors.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php73/usr/share/pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:33:"/opt/alt/php73/usr/share/pear/Net";b:1;s:39:"/opt/alt/php73/usr/share/pear/Net/IDNA2";b:1;s:49:"/opt/alt/php73/usr/share/pear/Net/IDNA2/Exception";b:1;s:50:"/opt/alt/php73/usr/share/pear/test/Net_IDNA2/tests";b:1;s:44:"/opt/alt/php73/usr/share/pear/test/Net_IDNA2";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"0.2.0";s:12:"release_date";s:10:"2017-03-06";s:13:"release_state";s:4:"beta";s:15:"release_license";s:4:"LGPL";s:13:"release_notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:15:"Stefan Neufeind";s:5:"email";s:29:"pear.neufeind@speedpartner.de";s:6:"active";s:3:"yes";s:6:"handle";s:8:"neufeind";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Daniel O'Connor";s:5:"email";s:24:"daniel.oconnor@gmail.com";s:6:"active";s:2:"no";s:6:"handle";s:8:"doconnor";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/net_socket.reg000064400000010311151732707770012272 0ustar00a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:24:"Network Socket Interface";s:11:"description";s:237:"Net_Socket is a class interface to TCP sockets.  It provides blocking
  and non-blocking operation, with different reading and writing modes
  (byte-wise, block-wise, line-wise and special formats like network
  byte-order ip addresses).";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-04-13";s:4:"time";s:8:"17:15:33";s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:52:"* Bug #21178: $php_errormsg is deprecated in PHP 7.2";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:3:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f99081ef3a69bcc1faa0d90a9a616788";s:4:"name";s:14:"Net/Socket.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"61a9ed8d1604a739e6997149ea34e701";s:4:"name";s:9:"README.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"28575b04f4f2014316245d83e27343e1";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:3:{s:14:"Net/Socket.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f99081ef3a69bcc1faa0d90a9a616788";s:4:"name";s:14:"Net/Socket.php";s:4:"role";s:3:"php";s:12:"installed_as";s:44:"/opt/alt/php73/usr/share/pear/Net/Socket.php";}s:9:"README.md";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"61a9ed8d1604a739e6997149ea34e701";s:4:"name";s:9:"README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:54:"/opt/alt/php73/usr/share/doc/pear/Net_Socket/README.md";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"28575b04f4f2014316245d83e27343e1";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:52:"/opt/alt/php73/usr/share/doc/pear/Net_Socket/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:33:"/opt/alt/php73/usr/share/pear/Net";b:1;s:44:"/opt/alt/php73/usr/share/doc/pear/Net_Socket";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.2.2";s:12:"release_date";s:10:"2017-04-13";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:52:"* Bug #21178: $php_errormsg is deprecated in PHP 7.2";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/auth_sasl.reg000064400000023174151732707770012132 0ustar00a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:153:"http://pear.php.net/dtd/tasks-1.0   http://pear.php.net/dtd/tasks-1.0.xsd   http://pear.php.net/dtd/package-2.0   http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:47:"Abstraction of various SASL mechanism responses";s:11:"description";s:152:"Provides code to generate responses to common SASL mechanisms, including:
- Digest-MD5
- Cram-MD5
- Plain
- Anonymous
- Login (Pseudo mechanism)
- SCRAM";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:12:"Anish Mistry";s:4:"user";s:7:"amistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:22:"Michael Bretterklieber";s:4:"user";s:8:"mbretter";s:5:"email";s:26:"michael@bretterklieber.com";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-03-07";s:4:"time";s:8:"14:04:34";s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:9:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60f7b5ba4d05fe0e518292963b14bddb";s:4:"name";s:23:"Auth/SASL/Anonymous.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2c817e4775b6f63f07ddb0c9cbd88b5";s:4:"name";s:20:"Auth/SASL/Common.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6b3b3a4e0aec6a4e0728732ef6babc9";s:4:"name";s:21:"Auth/SASL/CramMD5.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"509e431141489a77a991401d64f15e9e";s:4:"name";s:23:"Auth/SASL/DigestMD5.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d7478dd9dc5734ec9e16c158dcb6f76";s:4:"name";s:22:"Auth/SASL/External.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a0abcf277374b24262807150451b55e";s:4:"name";s:19:"Auth/SASL/Login.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bde1dcf2780d042c1de12e20a696e945";s:4:"name";s:19:"Auth/SASL/Plain.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e99f9f71abc36d64ca8e17ad6e5e7631";s:4:"name";s:19:"Auth/SASL/SCRAM.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b93e37947e1dd90e5fb639a1734f7a71";s:4:"name";s:13:"Auth/SASL.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:7:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-03-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.6";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-09-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:102:"QA release
* Bug #18856: Authentication warnings because of wrong Auth_SASL::factory argument [kguest]";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.5";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-09-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:256:"QA release
* Added support for any mechanism of the SCRAM family; with thanks to Jehan Pagès. [kguest]
* crammd5 and digestmd5 mechanisms name deprecated in favour of IANA registered names 'cram-md5' and 'digest-md5'; with thanks to Jehan Pagès. [kguest]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-02-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:85:"QA release
* Fix bug #16624: open_basedir restriction warning in DigestMD5.php [till]";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-08-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:181:"QA release
* Move SVN to proper directory structure [cweiske]
* Fix Bug #8775: Error in package.xml
* Fix Bug #14671: Security issue due to seeding random number generator [cweiske]";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-05-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:179:"* Fixed Bug #2143 Auth_SASL_DigestMD5::getResponse() generates invalid response
* Fixed Bug #6611 Suppress PHP 5 Notice Errors
* Fixed Bug #2154 realm isn't contained in challange";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:59:"* Added authcid/authzid separation in PLAIN and DIGEST-MD5.";}}}s:8:"filelist";a:9:{s:23:"Auth/SASL/Anonymous.php";a:4:{s:6:"md5sum";s:32:"60f7b5ba4d05fe0e518292963b14bddb";s:4:"name";s:23:"Auth/SASL/Anonymous.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/Auth/SASL/Anonymous.php";}s:20:"Auth/SASL/Common.php";a:4:{s:6:"md5sum";s:32:"c2c817e4775b6f63f07ddb0c9cbd88b5";s:4:"name";s:20:"Auth/SASL/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/Auth/SASL/Common.php";}s:21:"Auth/SASL/CramMD5.php";a:4:{s:6:"md5sum";s:32:"c6b3b3a4e0aec6a4e0728732ef6babc9";s:4:"name";s:21:"Auth/SASL/CramMD5.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php73/usr/share/pear/Auth/SASL/CramMD5.php";}s:23:"Auth/SASL/DigestMD5.php";a:4:{s:6:"md5sum";s:32:"509e431141489a77a991401d64f15e9e";s:4:"name";s:23:"Auth/SASL/DigestMD5.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php73/usr/share/pear/Auth/SASL/DigestMD5.php";}s:22:"Auth/SASL/External.php";a:4:{s:6:"md5sum";s:32:"1d7478dd9dc5734ec9e16c158dcb6f76";s:4:"name";s:22:"Auth/SASL/External.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php73/usr/share/pear/Auth/SASL/External.php";}s:19:"Auth/SASL/Login.php";a:4:{s:6:"md5sum";s:32:"3a0abcf277374b24262807150451b55e";s:4:"name";s:19:"Auth/SASL/Login.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/Auth/SASL/Login.php";}s:19:"Auth/SASL/Plain.php";a:4:{s:6:"md5sum";s:32:"bde1dcf2780d042c1de12e20a696e945";s:4:"name";s:19:"Auth/SASL/Plain.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/Auth/SASL/Plain.php";}s:19:"Auth/SASL/SCRAM.php";a:4:{s:6:"md5sum";s:32:"e99f9f71abc36d64ca8e17ad6e5e7631";s:4:"name";s:19:"Auth/SASL/SCRAM.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/Auth/SASL/SCRAM.php";}s:13:"Auth/SASL.php";a:4:{s:6:"md5sum";s:32:"b93e37947e1dd90e5fb639a1734f7a71";s:4:"name";s:13:"Auth/SASL.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Auth/SASL.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:39:"/opt/alt/php73/usr/share/pear/Auth/SASL";b:1;s:34:"/opt/alt/php73/usr/share/pear/Auth";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.1.0";s:12:"release_date";s:10:"2017-03-07";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"BSD";s:13:"release_notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:12:"Anish Mistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";s:6:"handle";s:7:"amistry";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:22:"Michael Bretterklieber";s:5:"email";s:26:"michael@bretterklieber.com";s:6:"active";s:2:"no";s:6:"handle";s:8:"mbretter";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/console_getopt.reg000064400000024717151732707770013177 0ustar00a:25:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.10";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:26:"Command-line option parser";s:11:"description";s:80:"This is a PHP implementation of "getopt" supporting both
short and long options.";s:4:"lead";a:4:{s:4:"name";s:15:"Andrei Zmievski";s:4:"user";s:6:"andrei";s:5:"email";s:14:"andrei@php.net";s:6:"active";s:2:"no";}s:9:"developer";a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}s:6:"helper";a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2019-11-20";s:4:"time";s:8:"18:27:07";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63da5909aa85a0eb76e0ad0b5e00811a";s:4:"name";s:18:"Console/Getopt.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5a6fa63ce6f2370cdad11dc24a5addd0";s:4:"name";s:21:"tests/001-getopt.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7540b630cb8e7bfd8bb06fb65a010ae9";s:4:"name";s:19:"tests/bug10557.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e469de3628de85779118103b3248a44f";s:4:"name";s:19:"tests/bug11068.phpt";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cdc108b084ad8e82eeb2417f04b49ec8";s:4:"name";s:19:"tests/bug13140.phpt";s:4:"role";s:4:"test";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:3:"max";s:9:"1.999.999";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.8.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:14:{i:0;a:5:{s:4:"date";s:10:"2019-11-20";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";}i:1;a:5:{s:4:"date";s:10:"2019-02-06";s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:49:"* Remove use of each(), which is removed in PHP 8";}i:2;a:5:{s:4:"date";s:10:"2015-07-20";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:34:"* Fix unit test on PHP 7 [cweiske]";}i:3;a:5:{s:4:"date";s:10:"2015-02-22";s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:111:"* Change license to BSD-2-Clause
* Set minimum PHP version to 5.4.0
* Mark static methods with "static" keyword";}i:4;a:5:{s:4:"date";s:10:"2011-03-07";s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"* Change the minimum PEAR installer dep to be lower";}i:5;a:6:{s:4:"date";s:10:"2010-12-11";s:4:"time";s:8:"20:20:13";s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:106:"* Implement Request #13140: [PATCH] to skip unknown parameters. [patch by rquadling, improved on by dufuz]";}i:6;a:5:{s:4:"date";s:10:"2007-06-12";s:7:"version";a:2:{s:7:"release";s:5:"1.2.3";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:58:"* fix Bug #11068: No way to read plain "-" option [cardoe]";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-02-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:165:"* fix Bug #4475: An ambiguous error occurred when specifying similar longoption name.
* fix Bug #10055: Not failing properly on short options missing required values";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:126:"Fixed bugs #4448 (Long parameter values truncated with longoption parameter) and #7444 (Trailing spaces after php closing tag)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-12-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:69:"Fix to preserve BC with 1.0 and allow correct behaviour for new users";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-09-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:14:"Stable release";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:4:"0.11";s:3:"api";s:4:"0.11";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:89:"POSIX getopt compatibility fix: treat first element of args
        array as command name";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:4:"0.10";s:3:"api";s:4:"0.10";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:13:"Packaging fix";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.9";s:3:"api";s:3:"0.9";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:15:"Initial release";}}}s:8:"filelist";a:5:{s:18:"Console/Getopt.php";a:4:{s:6:"md5sum";s:32:"63da5909aa85a0eb76e0ad0b5e00811a";s:4:"name";s:18:"Console/Getopt.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/Console/Getopt.php";}s:21:"tests/001-getopt.phpt";a:4:{s:6:"md5sum";s:32:"5a6fa63ce6f2370cdad11dc24a5addd0";s:4:"name";s:21:"tests/001-getopt.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Console_Getopt/tests/001-getopt.phpt";}s:19:"tests/bug10557.phpt";a:4:{s:6:"md5sum";s:32:"7540b630cb8e7bfd8bb06fb65a010ae9";s:4:"name";s:19:"tests/bug10557.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Console_Getopt/tests/bug10557.phpt";}s:19:"tests/bug11068.phpt";a:4:{s:6:"md5sum";s:32:"e469de3628de85779118103b3248a44f";s:4:"name";s:19:"tests/bug11068.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Console_Getopt/tests/bug11068.phpt";}s:19:"tests/bug13140.phpt";a:4:{s:6:"md5sum";s:32:"cdc108b084ad8e82eeb2417f04b49ec8";s:4:"name";s:19:"tests/bug13140.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Console_Getopt/tests/bug13140.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php73/usr/share/pear/Console";b:1;s:55:"/opt/alt/php73/usr/share/pear/test/Console_Getopt/tests";b:1;s:49:"/opt/alt/php73/usr/share/pear/test/Console_Getopt";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.3";s:12:"release_date";s:10:"2019-11-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.8.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Andrei Zmievski";s:5:"email";s:14:"andrei@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"andrei";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:9:"developer";}i:2;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/.registry/mail_mime.reg000064400000162056151732707770012103 0ustar00a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd             http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:51:"Mail_Mime provides classes to create MIME messages.";s:11:"description";s:395:"Mail_Mime provides classes to deal with the creation and manipulation of MIME messages.
It allows people to create e-mail messages consisting of:
* Text Parts
* HTML Parts
* Inline HTML Images
* Attachments
* Attached messages

It supports big messages, base64 and quoted-printable encodings and
non-ASCII characters in filenames, subjects, recipients, etc. encoded
using RFC2047 and/or RFC2231.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:19:"Cipriano Groenendal";s:4:"user";s:5:"cipri";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@php.net";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2021-09-05";s:4:"time";s:8:"08:43:21";s:7:"version";a:2:{s:7:"release";s:7:"1.10.11";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:246:"* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:53:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edd138f6c5497ae2b5d63620a67a931e";s:4:"name";s:25:"tests/class-filename.phpt";s:4:"role";s:4:"test";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7ec986391d0af058316f66e5a507e059";s:4:"name";s:36:"tests/content_transfer_encoding.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c1a43360d9b2cb5f9542503a4355c277";s:4:"name";s:24:"tests/encoding_case.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bf50a200190cad5e2d4aae4e120ea09f";s:4:"name";s:32:"tests/headers_with_mbstring.phpt";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"9a2d207f873317125ff43c092f3f0d25";s:4:"name";s:35:"tests/headers_without_mbstring.phpt";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"25d4c5b9fdeaabc7810c26e6f89e95ca";s:4:"name";s:27:"tests/qp_encoding_test.phpt";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"958197f31b4a20c91dd42662595e7516";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"46675529f1f021b51a1aa0ae6c971cd2";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f8c05910737e451c7a9d4737b8d9f095";s:4:"name";s:26:"tests/test_Bug_3513_1.phpt";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edb467a375ddf09e777a9388e2e8cbb5";s:4:"name";s:26:"tests/test_Bug_3513_2.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"70c2456445eaaa80779206e9e245d685";s:4:"name";s:26:"tests/test_Bug_3513_3.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4cda500d0d7925e81a299f1d3db132a9";s:4:"name";s:26:"tests/test_Bug_7561_1.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"42a214e7e3d3afa07f8996b235222611";s:4:"name";s:26:"tests/test_Bug_8386_1.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed78099563499f60386a128cb7b96925";s:4:"name";s:26:"tests/test_Bug_8541_1.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5250a0693599b945e8642a1a289d7275";s:4:"name";s:26:"tests/test_Bug_9722_1.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7f58f54e1485c23a60c83cd3cc5563e";s:4:"name";s:27:"tests/test_Bug_10596_1.phpt";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccb53d80e7f5c9f28b11abce5fe5d490";s:4:"name";s:27:"tests/test_Bug_10816_1.phpt";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f3d92a1fff099173b8600fb3646d0614";s:4:"name";s:27:"tests/test_Bug_10999_1.phpt";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"3f2757d5db43abd8f177f094f4d53625";s:4:"name";s:25:"tests/test_Bug_11381.phpt";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c64d675e73bc02fc94f5d03b3117cfa0";s:4:"name";s:25:"tests/test_Bug_11731.phpt";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8c9305ca05f5ed2d7cd7e31e4836f17a";s:4:"name";s:25:"tests/test_Bug_12165.phpt";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"2aa2c3dfbe44500809e79da994272611";s:4:"name";s:27:"tests/test_Bug_12385_1.phpt";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ef1d726233dbd3360c540fd6a959b0d0";s:4:"name";s:25:"tests/test_Bug_12411.phpt";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a862a57ff622fcbb2328be6c805e2d05";s:4:"name";s:25:"tests/test_Bug_12466.phpt";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4eddeeac08f351feb147ab6fda439526";s:4:"name";s:25:"tests/test_Bug_13032.phpt";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"de15a0657a83694bc6991c4184ccf9bd";s:4:"name";s:25:"tests/test_Bug_13444.phpt";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"80afe9fced03288884e9d302d1e65b2d";s:4:"name";s:25:"tests/test_Bug_13962.phpt";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"89bf87e798f4a149a150d4c2a505f976";s:4:"name";s:25:"tests/test_Bug_14529.phpt";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5f9100adb1c609110ed495fafa819975";s:4:"name";s:25:"tests/test_Bug_14779.phpt";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"45eb42fe4e325da64f1ae8f149e2a396";s:4:"name";s:25:"tests/test_Bug_14780.phpt";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"609dad2083c54ba56ea691c488ca20e2";s:4:"name";s:25:"tests/test_Bug_15320.phpt";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f4ef08e416e775558e8075b531bbc814";s:4:"name";s:25:"tests/test_Bug_16539.phpt";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed1bd0fc9067b3fb8b95808bfa315916";s:4:"name";s:25:"tests/test_Bug_17025.phpt";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8a37de74fb39fed4566617a7ea38bb69";s:4:"name";s:25:"tests/test_Bug_17175.phpt";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9dee3c7c45d8c6c22f860e93c3769b9";s:4:"name";s:25:"tests/test_Bug_18083.phpt";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"96ce23ad1a1d6417facfcdd2baa9c8eb";s:4:"name";s:25:"tests/test_Bug_18772.phpt";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"dd98307b3224b173f7b54f7e403865a4";s:4:"name";s:25:"tests/test_Bug_19497.phpt";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e1194180cb6a218fab69db90f88d1cb2";s:4:"name";s:25:"tests/test_Bug_20226.phpt";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"1b7919174edcd1cf5d5fd5a622fdac9b";s:4:"name";s:25:"tests/test_Bug_20273.phpt";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"6513c4b0c9e962c900d020124752333e";s:4:"name";s:25:"tests/test_Bug_20563.phpt";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7c7a00818cb0f01fa6c52c920b9e76c6";s:4:"name";s:25:"tests/test_Bug_20564.phpt";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9e31a9c24b05dfb6166512e04e2f056";s:4:"name";s:25:"tests/test_Bug_21027.phpt";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b634a5e99aa26a8b6df8fcfae07051b4";s:4:"name";s:25:"tests/test_Bug_21098.phpt";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b21be5b099a69428bd37e60589cdd485";s:4:"name";s:25:"tests/test_Bug_21205.phpt";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bc152c12839964fba15da5673d25c4db";s:4:"name";s:25:"tests/test_Bug_21206.phpt";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccf732525be42c955eea18e78490c3e1";s:4:"name";s:25:"tests/test_Bug_21255.phpt";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"579f1e11da6c8074dbf508dc1f1dedfa";s:4:"name";s:24:"tests/test_Bug_GH16.phpt";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"df32d66d9fccf7a0956422811283272a";s:4:"name";s:24:"tests/test_Bug_GH19.phpt";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7b5b5bacc6a599cfaece35ad202ad1a";s:4:"name";s:24:"tests/test_Bug_GH26.phpt";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e08958f1bb60561f072a3508b8fd3e2e";s:4:"name";s:29:"tests/test_linebreak_dot.phpt";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8398e9bfea0bc7c4ff0770ae3d6279fe";s:4:"name";s:35:"tests/test_linebreak_larger_76.phpt";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e5c9ac7f32e53afdeafd1a84343a89ae";s:4:"name";s:13:"Mail/mime.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36128789ad1101d39d13b06ca2585576";s:4:"name";s:17:"Mail/mimePart.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.6.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:48:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2001-12-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:53:"This is the initial release of the Mime_Mail package.";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.1";s:3:"api";s:3:"1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:75:"This is a maintenance release with various bugfixes and minor enhancements.";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-07-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:180:"* Added header encoding
* Altered mimePart to put boundary parameter on newline
* Changed addFrom() to setFrom()
* Added setSubject()
* Made mimePart inherit crlf setting from mime";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-07-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:62:"* License change
* Applied a few changes From Ilia Alshanetsky";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC1";s:3:"api";s:8:"1.3.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-03-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:94:"* First release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-04-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:141:"* First (stable) release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
* one small fix after RC1 (bug #3940)";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:0:"";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-03-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:1481:"* Changed License to BSD Style license, as that's what the code was since the beginning [cipri]
* Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #4696: addAttachment crash [cipri]
* Fix Bug #5333: Only variables should be returned by reference; triggers notices since php 4.4.0 [cipri]
* Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring overload [cipri]
* Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
* Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
* Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
* Fix Bug #9347: Notices about references [cweiske]
* Fix Bug #9558: Broken multiline headers [cipri]
* Fix Bug #9956: Notices being thrown [cipri]
* Fix Bug #9976: Subject encoded twice [cipri]
* Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
* Implement Feature #3636: Allow specification of charsets and encoding [cipri]
* Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
* Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
* Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
* Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
* Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:553:"* Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
  platform [cipri]
* Fix Bug #9725: multipart/related & alternative wrong order [cipri]
* Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
* Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
* Fix Bug #10596: Incorrect handling of text and html '0' bodies [cipri]";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:162:"* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:75:"* Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:187:"* Fix Bug #10791: Unit tests fail [cipri]
* Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
* Fix Bug #10793: Long headers don't get wrapped since fix for Bug #10298 [cipri]";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:65:"* Fix Bug #10816: Unwanted linebreak at the end of output [cipri]";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:123:"* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #10838: bad use of MIME encoding in header. [cipri]";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-05-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:3343:"Release notes:
 * No more notices in PHP 5 /4.4.0.
 * Improved inline HTML image function.
 * Improved header encoding with foreign charsets.
 * Improved long header rendering.
 * More control over used Charsets and encoding schemes.
 * More configurable attachments and inline images.
 * Full RFC 2047 Support
 * Full RFC 2231 Support
 * Unit-tests

Fixed bugs:
 * Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
 * Fix Bug #3513: support of RFC2231 in header fields. [cipri]
 * Fix Bug #4696: addAttachment crash [cipri]
 * Fix Bug #5333: Only variables should be returned by reference; triggers notices since
   php 4.4.0 [cipri]
 * Fix Bug #5400: Do not return function reference [cipri]
 * Fix Bug #5710: Little reference bugs [cipri]
 * Fix Bug #5890: Only variable references should be returned by reference [cipri]
 * Fix Bug #6260: Just a notice with PHP5 [cipri]
 * Fix Bug #6261: php 5.1.1 upgrade [cipri]
 * Fix Bug #6663: Notice about reference passing [cipri]
 * Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring
   overload [cipri]
 * Fix Bug #7713: PHP5 Notice: Only variable references should be returned by reference [cipri]
 * Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
 * Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
 * Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
 * Fix Bug #8812: user header updates overwritten [cipri]
 * Fix Bug #9347: Notices about references [cweiske]
 * Fix Bug #9558: Broken multiline headers [cipri]
 * Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
   platform [cipri]
 * Fix Bug #9725: multipart/related & alternative wrong order [cipri]
 * Fix Bug #9956: Notices being thrown [cipri]
 * Fix Bug #9976: Subject encoded twice [cipri]
 * Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
 * Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
 * Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
 * Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
 * Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
 * Fix Bug #10596: Incorrect handling of text and html '0' bodies [cipri]
 * Fix Bug #10791: Unit tests fail [cipri]
 * Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
 * Fix Bug #10793: Long headers don't get wrapped since fix for Bug #10298 [cipri]
 * Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
 * Fix Bug #10838: bad use of MIME encoding in header. [cipri]
Implemented Features:
 * Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
 * Implement Feature #3636: Allow specification of charsets and encoding [cipri]
 * Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
 * Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
 * Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
 * Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
 * Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
 * Implement Feature #10604: Put an option to specify Content-Location in the header [cipri]";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.5.0a1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off mail_MimeDecode";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off mail_MimeDecode";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off Mail_MimeDecode";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:55:"* Fix Bug #11344: Error at line 644 in mime.php [cipri]";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:107:"* Fix Bug #11381: domain name is attached to content-id, trailing greater-than sign is
  not remove [cipri]";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.3.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:1264:"Fixed bugs:
 * Fix Bug #14678: srand() lowers security [clockwerx]
 * Fix Bug #12921: _file2str not binary safe [walter]
 * Fix Bug #12385: Bad regex when replacing css style attachments [cipri]
 * Fix Bug #16911: Excessive semicolon in MIME header [alec]
 * Fix Bug #15320: Attachment charset is not set in Content-Type header [alec]
 * Fix Bug #16911: Lack of semicolon separator for MIME header parameters [alec]
 * Fix Bug #16846: Use preg_replace_callback() instead of /e modifier [alec]
 * Fix Bug #14779: Problem with an empty attachment [alec]
 * Fix Bug #15913: Optimize the memory used by Mail_mimePart::encode.
                   Avoid having attachments data duplicated in memory [alec]
 * Fix Bug #16539: Headers longer than 998 characters aren't wrapped [alec]
 * Fix Bug #11238: Wrong encoding of structured headers [alec]
 * Fix Bug #13641: iconv_mime_encode() seems to work different/errorious than
                   the build in logic. Removed 'ignore_iconv' param.  [alec]
 * Fix Bug #16706: Incorrect double-quotes RFC 2231-encoded parameter values [alec]
 * Fix Bug #14232: RFC2231: tspecials encoding in _buildHeaderParam() [alec]
Implemented Features:
 * Implement Feature #10438: Function (encodeHeader) for encoding of given header [alec]";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-01-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:540:"Bugs Fixed:
 * Don't break specified headers folding [alec]
 * Bug #17025: Wrong headers() result for long unwrapable header value [alec]

Implemented Features:
 * Allow setting Content-ID for HTML Images [alec]
 * Added one setParam() in place of many set*() functions [alec]
 * Added getParam(), getTXTBody(), getHTMLBody() [alec]
 * Skip RFC2231's charset if filename contains only ASCII characters [alec]
 * Make sure that Received: headers are returned on the top [alec]
 * Added saveMessageBody() and getMessageBody() functions [alec]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:262:"Bugs Fixed:
 * Fix encoding of Return-Receipt-To and Disposition-Notification-To headers [alec]

Implemented Features:
 * Implement Feature #12466: Build parameters validation [alec]
 * Implement Feature #17175: Content-Description support for attachments [alec]";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:103:"Bugs Fixed:
 * Fix Bug #17226: Non RFC-compliant quoted-printable encoding of structured headers [alec]";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.7.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-04-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:233:"Implemented Features:
 * Added Mail_mime::setContentType() function with possibility to set various
   types in Content-Type header (also fixes problem with boundary parameter when Content-Type
   header was specified by user) [alec]";}i:25;a:5:{s:4:"date";s:10:"2010-07-29";s:7:"version";a:2:{s:7:"release";s:5:"1.8.0";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:314:"Bugs Fixed:
 * Double-addition of e-mail domain to content ID in HTML images [alec]
 * #17311: Multi-octet characters are split across adjacent 'encoded-word's [alec]
 * #17573: Place charset parameter in first line of Content-Type header (if possible) [alec]
Implemented Features:
 * #17518: addTo() method [alec]";}i:26;a:5:{s:4:"date";s:10:"2010-12-01";s:7:"version";a:2:{s:7:"release";s:5:"1.8.1";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:101:"Bugs Fixed:
 * #18083: Not possible to set separate charset for attachment content and headers [alec]";}i:27;a:5:{s:4:"date";s:10:"2011-08-10";s:7:"version";a:2:{s:7:"release";s:5:"1.8.2";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:207:"Bugs Fixed:
 * #18426: Fixed backward compatibility for "dfilename" parameter [alec]
 * Removed xmail.dtd, xmail.xsl from the package [alec]
 * Fixed handling of email addresses with quoted local part [alec]";}i:28;a:5:{s:4:"date";s:10:"2012-03-12";s:7:"version";a:2:{s:7:"release";s:5:"1.8.3";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:232:"* Request #19009: Remove error_reporting from tests [alec]
* Fixed Bug #19094: Email addresses do not have to contain a space between the name and address part [alec]
* Fixed Bug #19328: Wrong encoding of filenames with comma [alec]";}i:29;a:5:{s:4:"date";s:10:"2012-05-17";s:7:"version";a:2:{s:7:"release";s:5:"1.8.4";s:3:"api";s:5:"1.4.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:179:"* Request #19406: Allow to set individual attachment part headers [alec]
* Fixed Bug #18982: Non-static method Mail_mimePart::encodeHeader() should not be called statically [alec]";}i:30;a:5:{s:4:"date";s:10:"2012-06-09";s:7:"version";a:2:{s:7:"release";s:5:"1.8.5";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:198:"* Added possibility to set additional parameters of message part header, e.g. attachment size [alec]
* Added automatic setting of attachment size via Content-Disposition header size parameter [alec]";}i:31;a:5:{s:4:"date";s:10:"2012-10-23";s:7:"version";a:2:{s:7:"release";s:5:"1.8.6";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:235:"* Bug #19473: PEAR::isError() compatibility problem with PHP 5.4 [alec]
* Bug #19497: Attachment filename is cut on slash character [alec]
* Bug #19665: Add Mail-Reply-To and Mail-Followup-To to structured recipient headers list [alec]";}i:32;a:5:{s:4:"date";s:10:"2012-12-25";s:7:"version";a:2:{s:7:"release";s:5:"1.8.7";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:104:"* Bug #5333: Fix more return by reference errors [alec]
* Bug #19754: Fix compatibility with PHP4 [alec]";}i:33;a:5:{s:4:"date";s:10:"2013-07-05";s:7:"version";a:2:{s:7:"release";s:5:"1.8.8";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:294:"* Fixed warning/notice on (static vs. non-static) PEAR::raiseError() usage [alec]
* Fixed Bug #19761: PHP5 warnings about return by reference [alec]
* Fixed Bug #19770: Make cid generator more unique on Windows [alec]
* Fixed Bug #19987: E_STRICT warning when null is passed by reference [alec]";}i:34;a:5:{s:4:"date";s:10:"2014-05-14";s:7:"version";a:2:{s:7:"release";s:5:"1.8.9";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:219:"* Fixed Bug #20273: Incorrect handling of HTAB in encodeHeader() [alec]
* Fixed Bug #20226: Mail_mimePart::encodeHeader does not encode ISO-2022-JP string [alec]
* Fixed Bug #20222: Broken Compatybility with PHP4 [alec]";}i:35;a:6:{s:4:"date";s:10:"2015-07-05";s:4:"time";s:8:"12:50:00";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC1";s:3:"api";s:5:"2.0.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:314:"* Drop PHP4 support, Fix warnings on PHP7 [alec]
* Request #20564: Added possibility to unset headers [alec]
* Request #20563: Added isMultipart() method [alec]
* Request #20565: Accept also a file pointer in Mail_mimePart::encodeToFile(),
                  Mail_mime::get() and Mail_mime::saveMessageBody() [alec]";}i:36;a:6:{s:4:"date";s:10:"2015-08-06";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.0";s:3:"api";s:5:"1.9.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:200:"* Bug #20921: Make Mail_mimePart::encodeHeaderValue() a static method [alec]
* Bug #20931: Really remove unset headers [alec]
* Request #18772: Added methods for creating text/calendar messages [alec]";}i:37;a:6:{s:4:"date";s:10:"2015-09-13";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:156:"* Add possibility to add externally created Mail_mimePart objects as attachments [alec]
* Add possibility to set preamble text for multipart messages [alec]";}i:38;a:6:{s:4:"date";s:10:"2017-05-21";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.1";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:286:"* Fix Bug 21206: explodeQuotedString() does not handle quoted strings correctly [dfukagaw28]
* Fix Bug 21205: Invalid encoding of headers with quoted multibyte strings in non-unicode charset [dfukagaw28]
* Fix Bug 21098: Discrepancy in handling of empty (but set) plain text part [alec]";}i:39;a:6:{s:4:"date";s:10:"2017-11-17";s:4:"time";s:8:"11:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.2";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:115:"* Fix Bug #21255: Boundary gets added twice when using setContentType() [alec]
* PHP 7.2 compatibility fixes [alec]";}i:40;a:6:{s:4:"date";s:10:"2019-09-25";s:4:"time";s:8:"08:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.3";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:78:"* Fix deprecation warning for get_magic_quotes_runtime() use on PHP 7.4 [alec]";}i:41;a:6:{s:4:"date";s:10:"2019-10-13";s:4:"time";s:8:"11:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.4";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:63:"* Fix E_STRICT errors introduced in the previous release [alec]";}i:42;a:6:{s:4:"date";s:10:"2020-01-24";s:4:"time";s:8:"19:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.5";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:158:"* Make sure to not set Content-Transfer-Encoding on multipart messages [alec]
* Added support for calendar invitations with attachments/html/images [jacalben]";}i:43;a:6:{s:4:"date";s:10:"2020-01-30";s:4:"time";s:8:"08:25:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.6";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:118:"* Fix different boundary in headers and body when using headers() after get() [alec]
* Removed phail.php script [alec]";}i:44;a:6:{s:4:"date";s:10:"2020-03-01";s:4:"time";s:8:"08:50:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.7";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:84:"* Fix invalid Content-Type for messages with only html part and inline images [alec]";}i:45;a:6:{s:4:"date";s:10:"2020-06-13";s:4:"time";s:8:"08:50:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.8";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:85:"* Fix encoding issues with ISO-2022-JP-MS input labelled with ISO-2022-JP [shirosaki]";}i:46;a:6:{s:4:"date";s:10:"2020-06-27";s:4:"time";s:8:"10:30:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.9";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:63:"* Added a workaround for an opcache bug on OpenSuse 15.1 [alec]";}i:47;a:6:{s:4:"date";s:10:"2021-01-17";s:4:"time";s:8:"09:25:00";s:7:"version";a:2:{s:7:"release";s:7:"1.10.10";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:191:"* Compatibility fixes for PHP 5.2 and 5.3 [alec]
* Corrected soft line breaks handling to be RFC compliant [ixs]
* Corrected line breaks for lines ending in dots and length more than 74 [ixs]";}}}s:8:"filelist";a:53:{s:25:"tests/class-filename.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edd138f6c5497ae2b5d63620a67a931e";s:4:"name";s:25:"tests/class-filename.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/class-filename.phpt";}s:36:"tests/content_transfer_encoding.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7ec986391d0af058316f66e5a507e059";s:4:"name";s:36:"tests/content_transfer_encoding.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:81:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/content_transfer_encoding.phpt";}s:24:"tests/encoding_case.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c1a43360d9b2cb5f9542503a4355c277";s:4:"name";s:24:"tests/encoding_case.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/encoding_case.phpt";}s:32:"tests/headers_with_mbstring.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bf50a200190cad5e2d4aae4e120ea09f";s:4:"name";s:32:"tests/headers_with_mbstring.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/headers_with_mbstring.phpt";}s:35:"tests/headers_without_mbstring.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"9a2d207f873317125ff43c092f3f0d25";s:4:"name";s:35:"tests/headers_without_mbstring.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/headers_without_mbstring.phpt";}s:27:"tests/qp_encoding_test.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"25d4c5b9fdeaabc7810c26e6f89e95ca";s:4:"name";s:27:"tests/qp_encoding_test.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/qp_encoding_test.phpt";}s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"958197f31b4a20c91dd42662595e7516";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:86:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt";}s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"46675529f1f021b51a1aa0ae6c971cd2";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:86:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt";}s:26:"tests/test_Bug_3513_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f8c05910737e451c7a9d4737b8d9f095";s:4:"name";s:26:"tests/test_Bug_3513_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_1.phpt";}s:26:"tests/test_Bug_3513_2.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edb467a375ddf09e777a9388e2e8cbb5";s:4:"name";s:26:"tests/test_Bug_3513_2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_2.phpt";}s:26:"tests/test_Bug_3513_3.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"70c2456445eaaa80779206e9e245d685";s:4:"name";s:26:"tests/test_Bug_3513_3.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_3.phpt";}s:26:"tests/test_Bug_7561_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4cda500d0d7925e81a299f1d3db132a9";s:4:"name";s:26:"tests/test_Bug_7561_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_7561_1.phpt";}s:26:"tests/test_Bug_8386_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"42a214e7e3d3afa07f8996b235222611";s:4:"name";s:26:"tests/test_Bug_8386_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_8386_1.phpt";}s:26:"tests/test_Bug_8541_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed78099563499f60386a128cb7b96925";s:4:"name";s:26:"tests/test_Bug_8541_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_8541_1.phpt";}s:26:"tests/test_Bug_9722_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5250a0693599b945e8642a1a289d7275";s:4:"name";s:26:"tests/test_Bug_9722_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_9722_1.phpt";}s:27:"tests/test_Bug_10596_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7f58f54e1485c23a60c83cd3cc5563e";s:4:"name";s:27:"tests/test_Bug_10596_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_10596_1.phpt";}s:27:"tests/test_Bug_10816_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccb53d80e7f5c9f28b11abce5fe5d490";s:4:"name";s:27:"tests/test_Bug_10816_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_10816_1.phpt";}s:27:"tests/test_Bug_10999_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f3d92a1fff099173b8600fb3646d0614";s:4:"name";s:27:"tests/test_Bug_10999_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_10999_1.phpt";}s:25:"tests/test_Bug_11381.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"3f2757d5db43abd8f177f094f4d53625";s:4:"name";s:25:"tests/test_Bug_11381.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_11381.phpt";}s:25:"tests/test_Bug_11731.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c64d675e73bc02fc94f5d03b3117cfa0";s:4:"name";s:25:"tests/test_Bug_11731.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_11731.phpt";}s:25:"tests/test_Bug_12165.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8c9305ca05f5ed2d7cd7e31e4836f17a";s:4:"name";s:25:"tests/test_Bug_12165.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_12165.phpt";}s:27:"tests/test_Bug_12385_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"2aa2c3dfbe44500809e79da994272611";s:4:"name";s:27:"tests/test_Bug_12385_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_12385_1.phpt";}s:25:"tests/test_Bug_12411.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ef1d726233dbd3360c540fd6a959b0d0";s:4:"name";s:25:"tests/test_Bug_12411.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_12411.phpt";}s:25:"tests/test_Bug_12466.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a862a57ff622fcbb2328be6c805e2d05";s:4:"name";s:25:"tests/test_Bug_12466.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_12466.phpt";}s:25:"tests/test_Bug_13032.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4eddeeac08f351feb147ab6fda439526";s:4:"name";s:25:"tests/test_Bug_13032.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_13032.phpt";}s:25:"tests/test_Bug_13444.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"de15a0657a83694bc6991c4184ccf9bd";s:4:"name";s:25:"tests/test_Bug_13444.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_13444.phpt";}s:25:"tests/test_Bug_13962.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"80afe9fced03288884e9d302d1e65b2d";s:4:"name";s:25:"tests/test_Bug_13962.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_13962.phpt";}s:25:"tests/test_Bug_14529.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"89bf87e798f4a149a150d4c2a505f976";s:4:"name";s:25:"tests/test_Bug_14529.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_14529.phpt";}s:25:"tests/test_Bug_14779.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5f9100adb1c609110ed495fafa819975";s:4:"name";s:25:"tests/test_Bug_14779.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_14779.phpt";}s:25:"tests/test_Bug_14780.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"45eb42fe4e325da64f1ae8f149e2a396";s:4:"name";s:25:"tests/test_Bug_14780.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_14780.phpt";}s:25:"tests/test_Bug_15320.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"609dad2083c54ba56ea691c488ca20e2";s:4:"name";s:25:"tests/test_Bug_15320.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_15320.phpt";}s:25:"tests/test_Bug_16539.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f4ef08e416e775558e8075b531bbc814";s:4:"name";s:25:"tests/test_Bug_16539.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_16539.phpt";}s:25:"tests/test_Bug_17025.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed1bd0fc9067b3fb8b95808bfa315916";s:4:"name";s:25:"tests/test_Bug_17025.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_17025.phpt";}s:25:"tests/test_Bug_17175.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8a37de74fb39fed4566617a7ea38bb69";s:4:"name";s:25:"tests/test_Bug_17175.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_17175.phpt";}s:25:"tests/test_Bug_18083.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9dee3c7c45d8c6c22f860e93c3769b9";s:4:"name";s:25:"tests/test_Bug_18083.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_18083.phpt";}s:25:"tests/test_Bug_18772.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"96ce23ad1a1d6417facfcdd2baa9c8eb";s:4:"name";s:25:"tests/test_Bug_18772.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_18772.phpt";}s:25:"tests/test_Bug_19497.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"dd98307b3224b173f7b54f7e403865a4";s:4:"name";s:25:"tests/test_Bug_19497.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_19497.phpt";}s:25:"tests/test_Bug_20226.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e1194180cb6a218fab69db90f88d1cb2";s:4:"name";s:25:"tests/test_Bug_20226.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_20226.phpt";}s:25:"tests/test_Bug_20273.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"1b7919174edcd1cf5d5fd5a622fdac9b";s:4:"name";s:25:"tests/test_Bug_20273.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_20273.phpt";}s:25:"tests/test_Bug_20563.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"6513c4b0c9e962c900d020124752333e";s:4:"name";s:25:"tests/test_Bug_20563.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_20563.phpt";}s:25:"tests/test_Bug_20564.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7c7a00818cb0f01fa6c52c920b9e76c6";s:4:"name";s:25:"tests/test_Bug_20564.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_20564.phpt";}s:25:"tests/test_Bug_21027.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9e31a9c24b05dfb6166512e04e2f056";s:4:"name";s:25:"tests/test_Bug_21027.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_21027.phpt";}s:25:"tests/test_Bug_21098.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b634a5e99aa26a8b6df8fcfae07051b4";s:4:"name";s:25:"tests/test_Bug_21098.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_21098.phpt";}s:25:"tests/test_Bug_21205.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b21be5b099a69428bd37e60589cdd485";s:4:"name";s:25:"tests/test_Bug_21205.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_21205.phpt";}s:25:"tests/test_Bug_21206.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bc152c12839964fba15da5673d25c4db";s:4:"name";s:25:"tests/test_Bug_21206.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_21206.phpt";}s:25:"tests/test_Bug_21255.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccf732525be42c955eea18e78490c3e1";s:4:"name";s:25:"tests/test_Bug_21255.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_21255.phpt";}s:24:"tests/test_Bug_GH16.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"579f1e11da6c8074dbf508dc1f1dedfa";s:4:"name";s:24:"tests/test_Bug_GH16.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH16.phpt";}s:24:"tests/test_Bug_GH19.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"df32d66d9fccf7a0956422811283272a";s:4:"name";s:24:"tests/test_Bug_GH19.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH19.phpt";}s:24:"tests/test_Bug_GH26.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7b5b5bacc6a599cfaece35ad202ad1a";s:4:"name";s:24:"tests/test_Bug_GH26.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH26.phpt";}s:29:"tests/test_linebreak_dot.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e08958f1bb60561f072a3508b8fd3e2e";s:4:"name";s:29:"tests/test_linebreak_dot.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_linebreak_dot.phpt";}s:35:"tests/test_linebreak_larger_76.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8398e9bfea0bc7c4ff0770ae3d6279fe";s:4:"name";s:35:"tests/test_linebreak_larger_76.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests/test_linebreak_larger_76.phpt";}s:13:"Mail/mime.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e5c9ac7f32e53afdeafd1a84343a89ae";s:4:"name";s:13:"Mail/mime.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Mail/mime.php";}s:17:"Mail/mimePart.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36128789ad1101d39d13b06ca2585576";s:4:"name";s:17:"Mail/mimePart.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/Mail/mimePart.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php73/usr/share/pear/test/Mail_Mime/tests";b:1;s:44:"/opt/alt/php73/usr/share/pear/test/Mail_Mime";b:1;s:34:"/opt/alt/php73/usr/share/pear/Mail";b:1;}s:3:"old";a:7:{s:7:"version";s:7:"1.10.11";s:12:"release_date";s:10:"2021-09-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"BSD Style";s:13:"release_notes";s:246:"* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.6.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:19:"Cipriano Groenendal";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"cipri";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/xml_rpc.reg000064400000075461151732707770011621 0ustar00a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"XML_RPC";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:42:"PHP implementation of the XML-RPC protocol";s:11:"description";s:123:"A PEAR-ified version of Useful Inc's XML-RPC for PHP.

It has support for HTTP/HTTPS transport, proxies and authentication.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:16:"Daniel Convissor";s:4:"user";s:7:"danielc";s:5:"email";s:15:"danielc@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2011-08-27";s:4:"time";s:8:"01:36:28";s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:12:{i:0;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41158fbcb2d49755fdaf877f92e85362";s:4:"name";s:24:"tests/actual-request.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e9a0aa974052ee47c41ad0274c728dc6";s:4:"name";s:16:"tests/allgot.inc";s:4:"role";s:4:"test";}}i:2;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"60cd6342dd96bf0be4d4d3cbb7813cf4";s:4:"name";s:28:"tests/empty-value-struct.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:3;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2bdf63e6eba97ea12ac4f5a3a92fdc3a";s:4:"name";s:21:"tests/empty-value.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:4;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"94ab1218006a7dc8fdd362dffc48777f";s:4:"name";s:16:"tests/encode.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:5;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"74921ba059a82e2ec9c7734c187a3f2c";s:4:"name";s:21:"tests/extra-lines.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:6;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e200b7a09217395196987f1e948871a";s:4:"name";s:19:"tests/protoport.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:7;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3af6b2112368d543f80907f1b040b77";s:4:"name";s:19:"tests/test_Dump.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:8;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fb82404a22f0e751697c8ffe0557a6a";s:4:"name";s:15:"tests/types.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b361011f028738d20e8905cfa2fcefc5";s:4:"name";s:11:"XML/RPC.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2036a5c5c6e965b93533cd050442fa98";s:4:"name";s:16:"XML/RPC/Dump.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a0123129ef7eb5615505b95d0f0b72f";s:4:"name";s:18:"XML/RPC/Server.php";s:4:"role";s:3:"php";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:7:"1.4.0a1";s:3:"max";s:5:"1.4.9";}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0a1";}s:9:"extension";a:1:{s:4:"name";s:3:"xml";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:39:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2001-09-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"This is a PEAR-ified version of Useful Inc's 1.0.1 release.
Includes an urgent security fix identified by Dan Libby <dan@libby.com>.";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:48:"* E_ALL fixes
* fix HTTP response header parsing";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"* fix bug when parsing responses with boolean types";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-10-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:68:"* added HTTP proxy authorization support (thanks to Arnaud Limbourg)";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:517:"* Added support for sequential arrays to XML_RPC_encode() (mroch)
* Cleaned up new XML_RPC_encode() changes a bit (mroch, pierre)
* Remove "require_once 'PEAR.php'", include only when needed to raise an error
* Replace echo and error_log() with raiseError() (mroch)
* Make all classes extend XML_RPC_Base, which will handle common functions  (mroch)
* be tolerant of junk after methodResponse (Luca Mariano, mroch)
* Silent notice even in the error log (pierre)
* fix include of shared xml extension on win32 (pierre)";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC1";s:3:"api";s:8:"1.2.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-12-30";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:1187:"* Make things work with SSL.  Bug 2489.  (nkukard lbsd net)
* Allow array function callbacks (Matt Kane)
* Some minor speed-ups (Matt Kane)
* Add Dump.php to the package (Christian Weiske)
* Replace all line endings with \r\n.  Had only done replacements on \n.  Bug 2521.  (danielc)
* Silence fsockopen() errors.  Bug 1714.  (danielc)
* Encode empty arrays as an array. Bug 1493.  (danielc)
* Eliminate undefined index notice when submitting empty arrays to XML_RPC_Encode().  Bug 1819.  (danielc)
* Speed up check for enumerated arrays in XML_RPC_Encode().  (danielc)
* Prepend "XML_RPC_" to ERROR_NON_NUMERIC_FOUND, eliminating problem when eval()'ing error messages.  (danielc)
* Use XML_RPC_Base::raiseError() instead of PEAR::raiseError() in XML_RPC_ee() because PEAR.php is lazy loaded.  (danielc)
* Allow raiseError() to be called statically.  (danielc)
* Stop double escaping of character entities.  Bug 987.  (danielc)
  NOTICE: the following have been removed:
    * XML_RPC_dh()
    * $GLOBALS['XML_RPC_entities']
    * XML_RPC_entity_decode()
    * XML_RPC_lookup_entity()
* Determine the XML's encoding via the encoding attribute in the XML declaration.  Bug 52.  (danielc)";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC2";s:3:"api";s:8:"1.2.0RC2";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:162:"* Handle ssl:// in the $server string.  (danielc)
* Also default to port 445 for ssl:// requests as well.  (danielc)
* Enhance debugging in the server.  (danielc)";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC3";s:3:"api";s:8:"1.2.0RC3";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:29:"* ssl uses port 443, not 445.";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC4";s:3:"api";s:8:"1.2.0RC4";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:388:"* When a connection attempt fails, have the method return 0.  (danielc)
* Move the protocol/port checking/switching and the property settings from sendPayloadHTTP10() to the XML_RPC_Client constructor.  (danielc)
* Add tests for setting the client properties.  (danielc)
* Remove $GLOBALS['XML_RPC_twoslash'] since it's not used.  (danielc)
* Bundle the tests with the package.  (danielc)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC5";s:3:"api";s:8:"1.2.0RC5";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:91:"* If $port is 443 but a protocol isn't specified in $server, assume ssl:// is the protocol.";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC6";s:3:"api";s:8:"1.2.0RC6";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:71:"* Don't put the protocol in the Host field of the POST data.  (danielc)";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC7";s:3:"api";s:8:"1.2.0RC7";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-02-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:346:"* Add the setSendEncoding() method and $send_encoding
  property to XML_RPC_Message.  Request 3537.
* Allow class methods to be mapped using either syntax:
     'function' => 'hello::sayHello',
     or
     'function' => array('hello', 'sayhello'),
  Bug 3363.
* Use 8192 instead of 32768 for bytes in fread()
  in parseResponseFile().  Bug 3340.";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:160:"* Provide the "stable" release.
* Add package2.xml for compatibility with PEAR 1.4.0.
* For changes since 1.1.0, see the changelogs for the various RC releases.";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:65:"* Add isset() check before examining the dispatch map.  Bug 3658.";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:122:"* When using a proxy, add the protocol to the Request-URI, making it an "absoluteURI" as per the HTTP 1.0 spec.  Bug 3679.";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-04-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:818:"* Improve timeout handling for situations where connection to server is made but no response is not received in time. Accomplished via stream_set_timeout().  Request 3963.
* Add Fault Code 6: "The requested method didn't return an XML_RPC_Response object."  Request 4032.
* Add the createServerPayload() and createServerHeaders() methods and the $server_payload and $server_headers properties.  Request 3121.
* As in earlier versions, if the $serviceNow parameter to XML_RPC_Server() is 0, no data will be returned, but now the new $server_payload and $server_headers properties will be set.
* Convert the parser handle to an integer before using it as an index for $XML_RPC_xh[$parser].  Reduces E_STRICT notices.  Bug 3782.
* Add createHeaders() method and $headers property to XML_RPC_Client to make testing easier.";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-05-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:383:"* If XML_RPC_Message::getParam() is given an incorrect parameter, raise an error with the new XML_RPC_ERROR_INCORRECT_PARAMS code and return FALSE.
* Handle improper requests to XML_RPC_Server::verifySignature().  Bug 4231.
* Try to allow HTTP 100 responses if followed by a 200 response.  Bug 4116.
* Help Delphi users by making RPCMETHODNAME an alias for METHODNAME.  Request 4205.";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-05-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:724:"* When verifying requests against function signatures, if the number of parameters don't match, provide an appropriate message.  NOTE: this resolves a path disclosure vulnerability.  (Refines the changes made in the last commit.)  Bug 4231.
* XML_RPC_Message::getParam() now returns an XML_RPC_Response object upon error.  Changed from Release 1.3.0RC2.
* Add the XML_RPC_Value::isValue() method. For testing if an item is an XML_RPC_Value object.
* If XML_RPC_Client::send() is given an incorrect $msg parameter, raise an error with the new XML_RPC_ERROR_PROGRAMMING code and return 0.
* Improve cross-platform operation by using PEAR::loadExtension() instead of dl().
* Use <br /> instead of <br> in XML_RPC_Value::dump().";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-06-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:64:"* Stable release.  See earlier releases for changes since 1.2.2.";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-06-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:42:"* Security fix. Update highly recommended!";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:584:"* Eliminate path disclosure vulnerabilities by suppressing error messages when eval()'ing.
* Eliminate path disclosure vulnerability by catching bogus parameters submitted to XML_RPC_Value::serializeval().
* In XML_RPC_Server::service(), only call createServerPayload() and createServerHeaders() if necessary.  Fixes compatibility issue introduced in Release 1.3.0RC1 for users who set the $serviceNow parameter of XML_RPC_Server() to 0.  Bug 4757.
* Change "var $errstring" to "var $errstr".  Bug 4582.  Was put into CVS version 1.75 of RPC.php but didn't make it into RELEASE_1_3_1.";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:220:"* Eliminate memory leak by resetting $XML_RPC_xh each time parseResponse() is called.  Bug 4780.
* Using socket_set_timeout() because stream_set_timeout() was introduced in 4.3.0, but we need to support 4.2.0.  Bug 4805.";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-08-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:171:"* MAJOR SECURITY FIX: eliminate use of eval().
* Using socket_get_status() because stream_get_meta_data() was introduced in 4.3.0, but we need to support 4.2.0.  Bug 4805.";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:158:"* Don't add debug info unless debug is on.  Bug 5136.
* Use is_a() instead of class_name() so people can use their own XML_RPC_Message objects.  Request 5002.";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:53:"* Allow empty <value>'s without <types>'s.  Bug 5315.";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:72:"* Make XML_RPC_encode() properly handle dateTime.iso8601.  Request 5117.";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-10-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:46:"* Properly deal with empty values in struct's.";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-01-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:114:"* Have server send headers individualy as opposed to sending them all at once. Necessary due to changes PHP 4.4.2.";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.6";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:209:"* Add XML_RPC_Message::$remove_extra_lines property. Defaults to true. If set to false, extra lines are left in place. Bug 7088.
* Add XML_RPC_Message::$response_payload property. Makes logging responses easy.";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.7";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"* Add include_once for PEAR if need to load xml extension.  Bug 7358.
* Add dependency for xml extension in package file.  Bug 7358.";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.8";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:129:"* Characters other than alpha-numeric, punctuation, SP, TAB, LF and CR break the XML parser, encode value via Base 64.  Bug 7376.";}i:31;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC1";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2006-06-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:749:"* Provide complete multi-byte string support for systems with the mbstring extension enabled. Bug 7837.
* If PHP's mbstring extension is enabled, use mb_convert_encoding() to ensure the client payload matches the intended encoding. This is a better resolution of Bug 7376.
* Turn off the default of automatically base64 encoding strings that can generate fatal errors in PHP's SAX parser. The automatic base64 encoding can be turned on via the new XML_RPC_Client::setAutoBase64() method. The auto-encoding is a workaround for systems that don't have PHP's mbstring extension available. (The automatic base64 encoding was added in the prior release, 1.4.8, and caused problems for users who don't control the receiving end of the requests.) Bug 7837.";}i:32;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC2";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2006-06-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:127:"* If PHP's mbstring extension is enabled, use mb_convert_encoding() to ensure the server payload matches the intended encoding.";}i:33;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-07-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:134:"No changes from 1.5.0RC2.

The primary change from 1.4.8 is improved multi-byte support.  See the change log for complete information.";}i:34;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:280:"* Turn passing payload through mb_convert_encoding() off by default.  Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on.  Bug 8632.
* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar.  Bug 8251.";}i:35;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-08-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:64:"* Change license in empty-value-struct.php from PHP 3.0 to 3.01.";}i:36;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-01-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:242:"* Make licenses consistent.  Bug 12575.
* Fix serializedata() for non-sequentially indexed arrays.  Bug 16780.
* Show request information in debug mode.  Request 8240.
* Creating the payload before opening a socket connection.  Request 11981.";}i:37;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.4";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-07-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:209:"* Change ereg functions to preg due to deprecation (Request 17546 and then some.)
* Fix bugs in XML_RPC_Dump error detection process.
* Escape XML special characters in key names of struct elements. Bug 17368.";}i:38;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-08-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";}}}s:8:"filelist";a:12:{s:24:"tests/actual-request.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41158fbcb2d49755fdaf877f92e85362";s:4:"name";s:24:"tests/actual-request.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/actual-request.php";}s:16:"tests/allgot.inc";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e9a0aa974052ee47c41ad0274c728dc6";s:4:"name";s:16:"tests/allgot.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/allgot.inc";}s:28:"tests/empty-value-struct.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"60cd6342dd96bf0be4d4d3cbb7813cf4";s:4:"name";s:28:"tests/empty-value-struct.php";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/empty-value-struct.php";}s:21:"tests/empty-value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2bdf63e6eba97ea12ac4f5a3a92fdc3a";s:4:"name";s:21:"tests/empty-value.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/empty-value.php";}s:16:"tests/encode.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"94ab1218006a7dc8fdd362dffc48777f";s:4:"name";s:16:"tests/encode.php";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/encode.php";}s:21:"tests/extra-lines.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"74921ba059a82e2ec9c7734c187a3f2c";s:4:"name";s:21:"tests/extra-lines.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/extra-lines.php";}s:19:"tests/protoport.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e200b7a09217395196987f1e948871a";s:4:"name";s:19:"tests/protoport.php";s:4:"role";s:4:"test";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/protoport.php";}s:19:"tests/test_Dump.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3af6b2112368d543f80907f1b040b77";s:4:"name";s:19:"tests/test_Dump.php";s:4:"role";s:4:"test";s:12:"installed_as";s:62:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/test_Dump.php";}s:15:"tests/types.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fb82404a22f0e751697c8ffe0557a6a";s:4:"name";s:15:"tests/types.php";s:4:"role";s:4:"test";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests/types.php";}s:11:"XML/RPC.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b361011f028738d20e8905cfa2fcefc5";s:4:"name";s:11:"XML/RPC.php";s:4:"role";s:3:"php";s:12:"installed_as";s:41:"/opt/alt/php73/usr/share/pear/XML/RPC.php";}s:16:"XML/RPC/Dump.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2036a5c5c6e965b93533cd050442fa98";s:4:"name";s:16:"XML/RPC/Dump.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/pear/XML/RPC/Dump.php";}s:18:"XML/RPC/Server.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a0123129ef7eb5615505b95d0f0b72f";s:4:"name";s:18:"XML/RPC/Server.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php73/usr/share/pear/XML/RPC/Server.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:48:"/opt/alt/php73/usr/share/pear/test/XML_RPC/tests";b:1;s:42:"/opt/alt/php73/usr/share/pear/test/XML_RPC";b:1;s:33:"/opt/alt/php73/usr/share/pear/XML";b:1;s:37:"/opt/alt/php73/usr/share/pear/XML/RPC";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.5.5";s:12:"release_date";s:10:"2011-08-27";s:13:"release_state";s:6:"stable";s:15:"release_license";s:11:"PHP License";s:13:"release_notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"4.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:7:"1.4.0a1";s:8:"optional";s:2:"no";}i:2;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:3:"xml";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:16:"Daniel Convissor";s:5:"email";s:15:"danielc@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"danielc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/.registry/mail.reg000064400000024523151732707770011070 0ustar00a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"Mail";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:58:"Class that provides multiple interfaces for sending emails";s:11:"description";s:337:"PEAR's Mail package defines an interface for implementing mailers under the PEAR hierarchy.  It also provides supporting functions useful to multiple mailer backends.  Currently supported backends include: PHP's native mail() function, sendmail, and SMTP.  This package also provides a RFC822 email address list validation utility class.";s:4:"lead";a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";}s:9:"developer";a:2:{i:0;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:19:"richard@phpguru.org";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2017-04-11";s:4:"time";s:8:"17:26:44";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:44:"https://opensource.org/licenses/BSD-3-Clause";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:177:"* Loosen recognition of "queued as" server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn't close socket for smtp connection";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:16:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8210c33901d415a2692944291632bf34";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4e86cd3b980f73ef320988a1b299ee07";s:4:"name";s:13:"Mail/mail.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"360b7b613c98c7703151c50a6e74c367";s:4:"name";s:13:"Mail/mock.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"30ce63a4a2c4558b3752b1c302e6e508";s:4:"name";s:13:"Mail/null.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7199f4e7b07919082a804edb8680c811";s:4:"name";s:15:"Mail/RFC822.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5dd0b6ff126608818f44f5866b61b3d0";s:4:"name";s:17:"Mail/sendmail.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1d236356d52f3dfa13b740a48a821586";s:4:"name";s:13:"Mail/smtp.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"853b55cf4803df8caaaa0dca363971ff";s:4:"name";s:15:"Mail/smtpmx.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3077f0c01f72cc29a6f8f0175e7fc8a7";s:4:"name";s:8:"Mail.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d66aa2a2f0bfe33f8a67d749a1a4d345";s:4:"name";s:15:"tests/9137.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"75d10361f686f1cc16637a9364e3eab7";s:4:"name";s:17:"tests/9137_2.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"63715aad2b5b3ae35c6b05acf04d9ad7";s:4:"name";s:16:"tests/13659.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e99f00d8f07232e0f129dd77ae9699c7";s:4:"name";s:19:"tests/bug17178.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2036980390981cd6b89c1e5c903913e";s:4:"name";s:19:"tests/bug17317.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7b0eae971fe7595e7c1a563fbfcfee90";s:4:"name";s:17:"tests/rfc822.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67becdb1027cefcb8dff1b691da630ab";s:4:"name";s:21:"tests/smtp_error.phpt";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.5.6";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:16:{s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8210c33901d415a2692944291632bf34";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php73/usr/share/doc/pear/Mail/LICENSE";}s:13:"Mail/mail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4e86cd3b980f73ef320988a1b299ee07";s:4:"name";s:13:"Mail/mail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Mail/mail.php";}s:13:"Mail/mock.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"360b7b613c98c7703151c50a6e74c367";s:4:"name";s:13:"Mail/mock.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Mail/mock.php";}s:13:"Mail/null.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"30ce63a4a2c4558b3752b1c302e6e508";s:4:"name";s:13:"Mail/null.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Mail/null.php";}s:15:"Mail/RFC822.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7199f4e7b07919082a804edb8680c811";s:4:"name";s:15:"Mail/RFC822.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php73/usr/share/pear/Mail/RFC822.php";}s:17:"Mail/sendmail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5dd0b6ff126608818f44f5866b61b3d0";s:4:"name";s:17:"Mail/sendmail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php73/usr/share/pear/Mail/sendmail.php";}s:13:"Mail/smtp.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1d236356d52f3dfa13b740a48a821586";s:4:"name";s:13:"Mail/smtp.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Mail/smtp.php";}s:15:"Mail/smtpmx.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"853b55cf4803df8caaaa0dca363971ff";s:4:"name";s:15:"Mail/smtpmx.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php73/usr/share/pear/Mail/smtpmx.php";}s:8:"Mail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3077f0c01f72cc29a6f8f0175e7fc8a7";s:4:"name";s:8:"Mail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:38:"/opt/alt/php73/usr/share/pear/Mail.php";}s:15:"tests/9137.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d66aa2a2f0bfe33f8a67d749a1a4d345";s:4:"name";s:15:"tests/9137.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/test/Mail/tests/9137.phpt";}s:17:"tests/9137_2.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"75d10361f686f1cc16637a9364e3eab7";s:4:"name";s:17:"tests/9137_2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/test/Mail/tests/9137_2.phpt";}s:16:"tests/13659.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"63715aad2b5b3ae35c6b05acf04d9ad7";s:4:"name";s:16:"tests/13659.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:56:"/opt/alt/php73/usr/share/pear/test/Mail/tests/13659.phpt";}s:19:"tests/bug17178.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e99f00d8f07232e0f129dd77ae9699c7";s:4:"name";s:19:"tests/bug17178.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php73/usr/share/pear/test/Mail/tests/bug17178.phpt";}s:19:"tests/bug17317.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2036980390981cd6b89c1e5c903913e";s:4:"name";s:19:"tests/bug17317.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php73/usr/share/pear/test/Mail/tests/bug17317.phpt";}s:17:"tests/rfc822.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7b0eae971fe7595e7c1a563fbfcfee90";s:4:"name";s:17:"tests/rfc822.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:57:"/opt/alt/php73/usr/share/pear/test/Mail/tests/rfc822.phpt";}s:21:"tests/smtp_error.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67becdb1027cefcb8dff1b691da630ab";s:4:"name";s:21:"tests/smtp_error.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:61:"/opt/alt/php73/usr/share/pear/test/Mail/tests/smtp_error.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:38:"/opt/alt/php73/usr/share/doc/pear/Mail";b:1;s:34:"/opt/alt/php73/usr/share/pear/Mail";b:1;s:29:"/opt/alt/php73/usr/share/pear";b:1;s:45:"/opt/alt/php73/usr/share/pear/test/Mail/tests";b:1;s:39:"/opt/alt/php73/usr/share/pear/test/Mail";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.1";s:12:"release_date";s:10:"2017-04-11";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:177:"* Loosen recognition of "queued as" server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn't close socket for smtp connection";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.5.6";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:8:"Net_SMTP";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.1";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:19:"richard@phpguru.org";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:9:"developer";}i:2;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:9:"developer";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/mail_mimedecode.reg000064400000025472151732707770013247 0ustar00a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.1";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:160:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd      http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:15:"Mail_mimeDecode";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:41:"Provides a class to decode mime messages.";s:11:"description";s:157:"Provides a class to deal with the decoding and interpreting of mime messages.
 This package used to be part of the Mail_Mime package, but has been split off.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:19:"Cipriano Groenendal";s:4:"user";s:5:"cipri";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:12:"Alan Knowles";s:4:"user";s:6:"alan_k";s:5:"email";s:17:"alan@akbkhome.com";s:6:"active";s:3:"yes";}}s:9:"developer";a:4:{s:4:"name";s:19:"George Schlossnagle";s:4:"user";s:13:"gschlossnagle";s:5:"email";s:17:"george@omniti.com";s:6:"active";s:2:"no";}s:4:"date";s:10:"2016-08-29";s:4:"time";s:8:"03:04:25";s:7:"version";a:2:{s:7:"release";s:5:"1.5.6";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:245:"Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"05c45d0b58718ebe73860ebfe494dcef";s:4:"name";s:19:"Mail/mimeDecode.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"642acc06cdb217b6e64506182449d8f8";s:4:"name";s:29:"tests/parse_header_value.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a0bc0c9b68e62a19202bd8fb26104f3c";s:4:"name";s:41:"tests/semicolon_content_type_bug1724.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"194810c478066eaeb28f51116b88e25a";s:4:"name";s:9:"xmail.dtd";s:4:"role";s:4:"data";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"61cea06fb6b4bd3a4b5e2d37384e14a9";s:4:"name";s:9:"xmail.xsl";s:4:"role";s:4:"data";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.6.0";}s:7:"package";a:4:{s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:7:"exclude";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:8:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:15:"Initial Release";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.0.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:15:"Initial Release";}i:2;a:6:{s:4:"date";s:10:"2007-06-17";s:4:"time";s:8:"17:20:44";s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:55:"First release of mail_mimeDecode as a seperate package.";}i:3;a:5:{s:4:"date";s:10:"2009-12-03";s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:245:"Minor Bugfix release.


    Bug Fixes
    #----- - fix bug in getSendArray() - not handling multiple recipents
    #14129 - E_NOTICE fixes

    Requests
    #12365 - Add option to also include raw attached messages patched on the request of till";}i:4;a:5:{s:4:"date";s:10:"2010-09-02";s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:271:"Minor Bugfix release.
 
    Bug Fixes
    #4739 - regexp parsing of header values does not balance quoting correctly
           - Fix sponsored by http://webyog.com
    #17325 - empty body messages are valid messages
    #17276 - remove &new usage which throws errors now";}i:5;a:5:{s:4:"date";s:10:"2010-09-05";s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:919:"Major Bugfix release.

    Apart from a major cleanout of the bug tracker for this package, this release includes a revamped
    parseHeaderValue which removes the rather flakey regex, with a real parser, which should be considerably more
    robust.
 
    Bug Fixes
        #17844 - all regression tests fixed - remove the last of the while list each() .. this is 2010 ;)...
        #11410 - support wap multipart
        #9616  - long strings as filename etc.. aaa*0=.... aaa*1=.... aaa*2=.... (merged into aaa=.....)
        #9100  - change to preg_split for mime boundary detection , in theory should catch boundaries in nested situations better...
        #7709  - check for last element on boundary split to see if its usable
        #7065  - wrapped header lines with encoding should be concated without spaces
        #6495  - missing body in decoded object
        #11537 - better decode and multi-line support";}i:6;a:5:{s:4:"date";s:10:"2010-09-14";s:7:"version";a:2:{s:7:"release";s:5:"1.5.4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:268:"Critical Security release.
    
    It is highly recommended that users of 1.5.3 upgrade to this release, a change in the boundary detection
    code introduced a potential denial of service attack.
     
 
    Bug Fixes
        #17862 - quote boundary preg_split code";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-11-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:287:"Minor Bug fix release.

    #17959 - Boundaries ending with non-word characters - patch by Alex Adriaanese
    ------ - ignore whitespace and trailing cr/lf in last section of split
    ------ - correct spacing on multi-line headers. now only striped for encoded data. (on previous line)";}}}s:8:"filelist";a:5:{s:19:"Mail/mimeDecode.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"05c45d0b58718ebe73860ebfe494dcef";s:4:"name";s:19:"Mail/mimeDecode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php73/usr/share/pear/Mail/mimeDecode.php";}s:29:"tests/parse_header_value.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"642acc06cdb217b6e64506182449d8f8";s:4:"name";s:29:"tests/parse_header_value.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php73/usr/share/pear/test/Mail_mimeDecode/tests/parse_header_value.phpt";}s:41:"tests/semicolon_content_type_bug1724.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a0bc0c9b68e62a19202bd8fb26104f3c";s:4:"name";s:41:"tests/semicolon_content_type_bug1724.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php73/usr/share/pear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phpt";}s:9:"xmail.dtd";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"194810c478066eaeb28f51116b88e25a";s:4:"name";s:9:"xmail.dtd";s:4:"role";s:4:"data";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/data/Mail_mimeDecode/xmail.dtd";}s:9:"xmail.xsl";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"61cea06fb6b4bd3a4b5e2d37384e14a9";s:4:"name";s:9:"xmail.xsl";s:4:"role";s:4:"data";s:12:"installed_as";s:60:"/opt/alt/php73/usr/share/pear/data/Mail_mimeDecode/xmail.xsl";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:34:"/opt/alt/php73/usr/share/pear/Mail";b:1;s:56:"/opt/alt/php73/usr/share/pear/test/Mail_mimeDecode/tests";b:1;s:50:"/opt/alt/php73/usr/share/pear/test/Mail_mimeDecode";b:1;s:50:"/opt/alt/php73/usr/share/pear/data/Mail_mimeDecode";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.5.6";s:12:"release_date";s:10:"2016-08-29";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"BSD Style";s:13:"release_notes";s:245:"Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"4.3.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.6.0";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Mail_Mime";s:3:"rel";s:2:"gt";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:19:"Cipriano Groenendal";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:5:"cipri";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:12:"Alan Knowles";s:5:"email";s:17:"alan@akbkhome.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"alan_k";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:19:"George Schlossnagle";s:5:"email";s:17:"george@omniti.com";s:6:"active";s:2:"no";s:6:"handle";s:13:"gschlossnagle";s:4:"role";s:9:"developer";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/net_sieve.reg000064400000047105151732707770012130 0ustar00a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Net_Sieve";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:34:"Handles talking to a sieve server.";s:11:"description";s:160:"This package provides an API to talk to servers implementing the managesieve protocol. It can be used to install and remove sieve scripts, mark them active etc.";s:4:"lead";a:5:{i:0;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:13:"Jan Schneider";s:4:"user";s:6:"yunosh";s:5:"email";s:13:"jan@horde.org";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";}i:3;a:4:{s:4:"name";s:21:"Damian Fernandez Sosa";s:4:"user";s:6:"damian";s:5:"email";s:20:"damlists@cnba.uba.ar";s:6:"active";s:2:"no";}i:4;a:4:{s:4:"name";s:12:"Anish Mistry";s:4:"user";s:7:"amistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2021-04-24";s:4:"time";s:8:"13:33:52";s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:38:"* Support XOAUTH2 authorization method";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:3:"Net";s:4:"name";s:1:"/";}s:4:"file";a:4:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"ef8cd688674fba85cc067e06c221e43b";s:4:"name";s:21:"tests/largescript.siv";s:4:"role";s:4:"test";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"7d772fe47ee45bdb521dd581281f38c3";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"6050fac5e66a4a6bbed7913f826974ed";s:4:"name";s:19:"tests/SieveTest.php";s:4:"role";s:4:"test";}}i:3;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"2a45a03c042351957f3435929a17bca3";s:4:"name";s:9:"Sieve.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.0.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0b1";}s:7:"package";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:28:{i:0;a:5:{s:4:"date";s:10:"2018-03-04";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:31:"* Support GSSAPI authentication";}i:1;a:5:{s:4:"date";s:10:"2018-02-14";s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:78:"* Composer: Fix license identifier, don't use unbound version numbers for deps";}i:2;a:5:{s:4:"date";s:10:"2017-05-26";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:199:"* Use 8bit instead of latin1 for string length in bytes calculation
* Extend listScripts() so it's possible to get an active script name in one go
* Request #20491: Skip redundant CAPABILITY requests";}i:3;a:5:{s:4:"date";s:10:"2017-05-21";s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:129:"* Dropped PHP4 support, fixed PHP7 warnings
* Fixed E_DEPRECATED warning on Auth_SASL::factory() call
* Enable later TLS versions";}i:4;a:5:{s:4:"date";s:10:"2015-01-20";s:7:"version";a:2:{s:7:"release";s:5:"1.3.4";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:70:"* Remove erroneous and unnecessary active script caching (Bug #20472).";}i:5;a:5:{s:4:"date";s:10:"2014-09-24";s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:111:"* Fix notices from non-static calling of PEAR methods.
* Fix reading OK responses with string literal messages.";}i:6;a:5:{s:4:"date";s:10:"2011-08-06";s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:146:"* Fix referrals if host data or user credentials are passed to connect() and login() instead of the constructor (Aleksander Machniak, Bug #17107).";}i:7;a:5:{s:4:"date";s:10:"2011-08-05";s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:417:"* Query capabilities again after successful authentication (Jesse Crawford, Request #18382).
* Escape quotes and backslashes in script names, and use literal strings for script names with non-ASCII characters (Aleksander Machniak, Bug #16691).
* Work around broken STARTTLS behavior in Cyrus versions before 2.3.10 (Aleksander Machniak, Bug #18241).
* Improve string literal parsing (Aleksander Machniak, Bug #18228).";}i:8;a:5:{s:4:"date";s:10:"2010-07-01";s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:122:"* Add debug handler parameter to constructor.
* Fix LOGIN authentication (Agustín Eijo, Aleksander Machniak, Bug #17527).";}i:9;a:5:{s:4:"date";s:10:"2010-06-13";s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:57:"* Fix SASL authentication without Auth_SASL (Bug #17489).";}i:10;a:5:{s:4:"date";s:10:"2010-04-19";s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:72:"* Fix DIGEST-MD5 authentication with Dovecot (Stef Simoens, Bug #17320).";}i:11;a:5:{s:4:"date";s:10:"2010-04-01";s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:432:"Changes since version 1.2.0b1:
* Fix DIGEST-MD5 authentication (Aleksander Machniak, Bug #17285).
* Don't try to call dl() if mbstring extension isn't loaded (Bug #17038).
Changes since version 1.1.7:
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.";}i:12;a:5:{s:4:"date";s:10:"2009-10-07";s:7:"version";a:2:{s:7:"release";s:7:"1.2.0b1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:231:"* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.";}i:13;a:5:{s:4:"date";s:10:"2009-07-24";s:7:"version";a:2:{s:7:"release";s:5:"1.1.7";s:3:"api";s:5:"1.1.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:91:"* Fixed STARTTLS support (Bug #14205).
* Added connect options and EXTERNAL authentication.";}i:14;a:5:{s:4:"date";s:10:"2008-03-22";s:7:"version";a:2:{s:7:"release";s:5:"1.1.6";s:3:"api";s:5:"1.1.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:88:"* Fixed Bug #9273
* Fixed copy/paste error in CRAM and DIGEST authentication error case.";}i:15;a:5:{s:4:"date";s:10:"2006-10-24";s:7:"version";a:2:{s:7:"release";s:5:"1.1.5";s:3:"api";s:5:"1.1.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:47:"* Fixed Bug connect() bug
* Fixed Request #8071";}i:16;a:5:{s:4:"date";s:10:"2006-09-09";s:7:"version";a:2:{s:7:"release";s:5:"1.1.4";s:3:"api";s:5:"1.1.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:207:"* Fixed Bug #8452 Unterminated read loop
* Fixed Bug #7845 Add mbstring support
* Added Request #8071 Enable the ability to toggle TLS support if available.
* Added Request #8453 Clean up PHPDoc and comments";}i:17;a:5:{s:4:"date";s:10:"2006-05-21";s:7:"version";a:2:{s:7:"release";s:5:"1.1.3";s:3:"api";s:5:"1.1.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:164:"* Correctly Fixed Bug #3519 Net_Sieve w/ externally established sockets
* Fixed Bug #7197 getScript() truncates long scripts
* Added PHPUnit2 regression test script";}i:18;a:5:{s:4:"date";s:10:"2006-02-09";s:7:"version";a:2:{s:7:"release";s:5:"1.1.2";s:3:"api";s:5:"1.1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:285:"* Fixed Request #4053 Added STARTTLS support for PHP 5.1 and above
    * Fixed Bug #3519 Net_Sieve w/ externally established sockets
    * Fixed Bug #4794 drops protocol prefix, e.g. "ssl://" in referrals
    * Fixed STARTTLS detection
    * Allow $options[] to be passed to Net_Socket";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-02-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:53:"* Fixed Bug #3242 cyrus murder referrals not followed";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-12-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:61:"* Fixed Bug #2728 Linebreaks not being read using getScript()";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:17:"* Fixed BUG #1006";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.0";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:108:"* Fixed DIGEST-MD5 sasl version handling (sasl v1.xx responses are diferent than v2.xx)
* Fixed LOGIN Method";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.9.1";s:3:"api";s:5:"0.9.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-02-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:1138:"* There is an issue whith the DIGEST-MD5 method. in one installation it does not work but in my server it works perfect! please send me debug info to solve the problem if
it affects you or disable DIGEST-MD5
* some optimizations to the code
* added haveSpace() to check if the server has space to store the script. Use with care HAVESPACE seems to be broken in cyrus 2.0.16
* added hasExtension()
* added getExtensions()
* added referral support and automatic following of them. (it also handles the following of multireferrals).
* removed _getResponse replaced by _doCmd. (thanks to Etienne Goyer for this)
* added supportsAuthMech()
* if installed automatically uses Auth_SASL
* added CRAM-MD5 auth Method
* added DIGEST-MD5 auth Method
* added getAuthMechs() returns an array containing all the auth methods the server supports
* added hasAuthMech() to check if the server has a particular auth method
* _connect --> connect: now is a public method (without breaking BC)
* _login --> login: now is a public method (without breaking BC)
* fix typo  cmdAuthenticate() --->  _cmdAuthenticate()
* _doCmd() now parses string responses also.";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.9.0";s:3:"api";s:5:"0.9.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-01-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:177:"* Added setDebug() method and debugging capabilities
* added disconnect() method
* added sample file test_sieve.php
* fixed bug #591
* automagically selects the best auth method";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.8.1";s:3:"api";s:5:"0.8.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-07-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:15:"Initial release";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.8";s:3:"api";s:3:"0.8";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:15:"Initial release";}i:27;a:5:{s:4:"date";s:10:"2018-09-09";s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:70:"* Fix PHP 7.3: Declaration of case-insensitive constants is deprecated";}}}s:8:"filelist";a:4:{s:21:"tests/largescript.siv";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"ef8cd688674fba85cc067e06c221e43b";s:4:"name";s:21:"tests/largescript.siv";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/Net_Sieve/tests/largescript.siv";}s:21:"tests/config.php.dist";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"7d772fe47ee45bdb521dd581281f38c3";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/Net_Sieve/tests/config.php.dist";}s:19:"tests/SieveTest.php";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"6050fac5e66a4a6bbed7913f826974ed";s:4:"name";s:19:"tests/SieveTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/pear/test/Net_Sieve/tests/SieveTest.php";}s:9:"Sieve.php";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"2a45a03c042351957f3435929a17bca3";s:4:"name";s:9:"Sieve.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php73/usr/share/pear/Net/Sieve.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php73/usr/share/pear/test/Net_Sieve/tests";b:1;s:44:"/opt/alt/php73/usr/share/pear/test/Net_Sieve";b:1;s:33:"/opt/alt/php73/usr/share/pear/Net";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.5";s:12:"release_date";s:10:"2021-04-24";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"BSD";s:13:"release_notes";s:38:"* Support XOAUTH2 authorization method";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.0.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:7:"1.4.0b1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:10:"Net_Socket";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.0";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Auth_SASL";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.0";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:5:{i:0;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Jan Schneider";s:5:"email";s:13:"jan@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:6:"yunosh";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:21:"Damian Fernandez Sosa";s:5:"email";s:20:"damlists@cnba.uba.ar";s:6:"active";s:2:"no";s:6:"handle";s:6:"damian";s:4:"role";s:4:"lead";}i:4;a:5:{s:4:"name";s:12:"Anish Mistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";s:6:"handle";s:7:"amistry";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506463;}pear/.registry/structures_graph.reg000064400000025435151732707770013555 0ustar00a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:40:"Graph datastructure manipulation library";s:11:"description";s:293:"Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed
and undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing
as well as for characteristic extraction from the graph topology.";s:4:"lead";a:4:{s:4:"name";s:16:"Sérgio Carvalho";s:4:"user";s:9:"sergiosgc";s:5:"email";s:32:"sergio.carvalho@portugalmail.com";s:6:"active";s:3:"yes";}s:6:"helper";a:4:{s:4:"name";s:12:"Brett Bieber";s:4:"user";s:11:"saltybeagle";s:5:"email";s:22:"brett.bieber@gmail.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2015-07-20";s:4:"time";s:8:"20:04:01";s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:12:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628eb6532a8047bf5962fe24c1c245df";s:4:"name";s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4b26eecd30f8695fc3739b1a5b59518e";s:4:"name";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f857de1fbbaace54b857ed9712f399f";s:4:"name";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f8e969f0b45d3859408901c8350bb701";s:4:"name";s:25:"Structures/Graph/Node.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"88ae1ad8bcd74d4b74ad845f55611cdd";s:4:"name";s:20:"Structures/Graph.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65e4e85e573833516f5cc1d7a81db9c5";s:4:"name";s:18:"tests/AllTests.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"190fc4634be55cd98608b72bc9d0a27f";s:4:"name";s:31:"tests/TopologicalSorterTest.php";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4dc0c43f054732ec0f2fc78458ebadde";s:4:"name";s:25:"tests/AcyclicTestTest.php";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";}}i:10;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c891580ee21a7aa863ac32566c979fc5";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b52f2d57d10c4f7ee67a7eb9615d5d24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:8:"1.5.0RC3";s:3:"max";s:5:"1.9.1";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.3";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-01-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:47:"http://opensource.org/licenses/lgpl-license.php";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:130:"- Bug #9682 only variables can be returned by reference
- fix Bug #9661 notice in Structures_Graph_Manipulator_Topological::sort()";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-10-11";s:7:"license";s:12:"LGPL License";s:5:"notes";s:258:"Bugfix Release:
Version 1.0.3 is functionally equivalent to 1.0.2 but with an updated package.xml file.
* Correct invalid md5 sum preventing installation with pyrus [saltybeagle]
* Add compatible tag for PEAR 1.5.0RC3-1.9.0 [saltybeagle]
* Update package.xml";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-10-25";s:7:"license";s:12:"LGPL License";s:5:"notes";s:88:"Bugfix Release:
* Bug #17108 BasicGraph::test_directed_degree fails on PHP 5 [clockwerx]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-26";s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:128:"* Set minimum PHP version to 5.3
* Fix bug #19367: Incorrect FSF address in LICENSE
* Change license from LGPL-2.1+ to LGPL-3.0+";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-07-20";s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";}}}s:8:"filelist";a:11:{s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628eb6532a8047bf5962fe24c1c245df";s:4:"name";s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:4:"role";s:3:"doc";s:12:"installed_as";s:103:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkg";}s:44:"Structures/Graph/Manipulator/AcyclicTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4b26eecd30f8695fc3739b1a5b59518e";s:4:"name";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php73/usr/share/pear/Structures/Graph/Manipulator/AcyclicTest.php";}s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f857de1fbbaace54b857ed9712f399f";s:4:"name";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php73/usr/share/pear/Structures/Graph/Manipulator/TopologicalSorter.php";}s:25:"Structures/Graph/Node.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f8e969f0b45d3859408901c8350bb701";s:4:"name";s:25:"Structures/Graph/Node.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php73/usr/share/pear/Structures/Graph/Node.php";}s:20:"Structures/Graph.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"88ae1ad8bcd74d4b74ad845f55611cdd";s:4:"name";s:20:"Structures/Graph.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php73/usr/share/pear/Structures/Graph.php";}s:18:"tests/AllTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65e4e85e573833516f5cc1d7a81db9c5";s:4:"name";s:18:"tests/AllTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests/AllTests.php";}s:24:"tests/BasicGraphTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests/BasicGraphTest.php";}s:31:"tests/TopologicalSorterTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"190fc4634be55cd98608b72bc9d0a27f";s:4:"name";s:31:"tests/TopologicalSorterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests/TopologicalSorterTest.php";}s:25:"tests/AcyclicTestTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4dc0c43f054732ec0f2fc78458ebadde";s:4:"name";s:25:"tests/AcyclicTestTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests/AcyclicTestTest.php";}s:16:"tests/helper.inc";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"040f54b443862e07753ff6d74aa752c6";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests/helper.inc";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b52f2d57d10c4f7ee67a7eb9615d5d24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:58:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:9:{s:82:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph";b:1;s:65:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph/docs/tutorials";b:1;s:55:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph/docs";b:1;s:50:"/opt/alt/php73/usr/share/doc/pear/Structures_Graph";b:1;s:58:"/opt/alt/php73/usr/share/pear/Structures/Graph/Manipulator";b:1;s:46:"/opt/alt/php73/usr/share/pear/Structures/Graph";b:1;s:40:"/opt/alt/php73/usr/share/pear/Structures";b:1;s:57:"/opt/alt/php73/usr/share/pear/test/Structures_Graph/tests";b:1;s:51:"/opt/alt/php73/usr/share/pear/test/Structures_Graph";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.1.1";s:12:"release_date";s:10:"2015-07-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"LGPL-3.0+";s:13:"release_notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.3";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:16:"Sérgio Carvalho";s:5:"email";s:32:"sergio.carvalho@portugalmail.com";s:6:"active";s:3:"yes";s:6:"handle";s:9:"sergiosgc";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:12:"Brett Bieber";s:5:"email";s:22:"brett.bieber@gmail.com";s:6:"active";s:3:"yes";s:6:"handle";s:11:"saltybeagle";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/.registry/xml_util.reg000064400000073165151732707770012011 0ustar00a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.5";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:17:"XML utility class";s:11:"description";s:192:"Selection of methods that are often needed when working with XML documents.  Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:13:"Chuck Burgess";s:4:"user";s:7:"ashnazg";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Stephan Schmidt";s:4:"user";s:5:"schst";s:5:"email";s:19:"schst@php-tools.net";s:6:"active";s:2:"no";}}s:6:"helper";a:4:{s:4:"name";s:12:"Davey Shafik";s:4:"user";s:5:"davey";s:5:"email";s:13:"davey@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2020-04-19";s:4:"time";s:8:"14:54:10";s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:25:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2746028ae4395f549855a5e444ada7";s:4:"name";s:20:"examples/example.php";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e52f4aa372c4067c609f49c2285b8f";s:4:"name";s:21:"examples/example2.php";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d0af9354df0962e70e9e2215b5611b9c";s:4:"name";s:27:"tests/AbstractUnitTests.php";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"57ce547d64d6e1f2986c313407deffef";s:4:"name";s:25:"tests/ApiVersionTests.php";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d0427db94790df7ada24a744547edf5";s:4:"name";s:33:"tests/AttributesToStringTests.php";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"673d1438c4718a70c5da3fe019027db4";s:4:"name";s:32:"tests/CollapseEmptyTagsTests.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"46b981f91edd163f1cd021cfef5d1bb1";s:4:"name";s:33:"tests/CreateCDataSectionTests.php";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6aa925b879572e9b3f1885b7cdbb223b";s:4:"name";s:28:"tests/CreateCommentTests.php";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbc083b62a020fa245fde5a7828a4806";s:4:"name";s:31:"tests/CreateEndElementTests.php";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f58e38343ecf60811c842d4cfc8194ae";s:4:"name";s:33:"tests/CreateStartElementTests.php";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9385fba272f4ebccf4c95d43d16dcff4";s:4:"name";s:24:"tests/CreateTagTests.php";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"51e7ba1390e6dadc3c0be0c960bf171d";s:4:"name";s:33:"tests/CreateTagFromArrayTests.php";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bbb54ef4cf56dc2c0b558b295de5668";s:4:"name";s:36:"tests/GetDocTypeDeclarationTests.php";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"825b440b0ee8abd10b4df017c08bf15f";s:4:"name";s:32:"tests/GetXmlDeclarationTests.php";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6783bb330f8f2ae7225f02d56f194e4";s:4:"name";s:26:"tests/IsValidNameTests.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b273525b905ae6d5fc53adcb3ce0b8d9";s:4:"name";s:25:"tests/RaiseErrorTests.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"20befbef5e55639539336761a17c64f3";s:4:"name";s:30:"tests/ReplaceEntitiesTests.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3ceff3302e31f90130be01c312b33b3";s:4:"name";s:30:"tests/ReverseEntitiesTests.php";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aeb95108896180ef77a7dce3c310a3b8";s:4:"name";s:33:"tests/SplitQualifiedNameTests.php";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e93010b1eff68f889fefcb006bf20b63";s:4:"name";s:22:"tests/Bug4950Tests.php";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"748ffb640e13e7b960385c7e12413782";s:4:"name";s:22:"tests/Bug5392Tests.php";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"01e68b66e27a6fdb197d572c67ae6bc5";s:4:"name";s:23:"tests/Bug18343Tests.php";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d945220c38344bc773b18244439bb0cc";s:4:"name";s:23:"tests/Bug21177Tests.php";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2672bb90875c2e00f93f563bfafe70";s:4:"name";s:23:"tests/Bug21184Tests.php";s:4:"role";s:4:"test";}}i:24;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0db6fa9c169bf6904aa7e588c2325a13";s:4:"name";s:12:"XML/Util.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.9.0";}s:9:"extension";a:1:{s:4:"name";s:4:"pcre";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:31:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.1";s:3:"api";s:3:"0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:14:"inital release";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.1";s:3:"api";s:5:"0.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:41:"bugfix: removed bug in createTagFromArray";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.2";s:3:"api";s:3:"0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:39:"added XML_Util::getDocTypeDeclaration()";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.2.1";s:3:"api";s:5:"0.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:70:"fixed bug with zero as tag content in createTagFromArray and createTag";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.3";s:3:"api";s:3:"0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:49:"added createStartElement() and createEndElement()";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.4";s:3:"api";s:3:"0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"added createCDataSection(),
added support for CData sections in createTag* methods,
fixed bug #23,
fixed bug in splitQualifiedName()";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.5";s:3:"api";s:3:"0.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:170:"added support for multiline attributes in attributesToString(), createTag*() and createStartElement (requested by Yavor Shahpasov for XML_Serializer),
added createComment";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.5.1";s:3:"api";s:5:"0.5.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:102:"added default namespace parameter (optional) in splitQualifiedName() (requested by Sebastian Bergmann)";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.5.2";s:3:"api";s:5:"0.5.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-11-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:78:"now creates XHTML compliant empty tags (Davey),
minor whitespace fixes (Davey)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:10:"0.6.0beta1";s:3:"api";s:10:"0.6.0beta1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-05-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:567:"- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.6.0";s:3:"api";s:5:"0.6.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:567:"- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.6.1";s:3:"api";s:5:"0.6.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:103:"- Added check for tag name (either as local part or qualified name) in createTagFromArray() (bug #1083)";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.0";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:41:"- Added reverseEntities() (request #2639)";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-11-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:73:"- Added collapseEmptyTags (patch by Sebastian Bergmann and Thomas Duffey)";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-12-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:306:"- fixed bug in replaceEntities() and reverseEntities() in conjunction with XML_UTIL_ENTITIES_HTML
- createTag() and createTagFromArray() now accept XML_UTIL_ENTITIES_XML, XML_UTIL_ENTITIES_XML_REQUIRED, XML_UTIL_ENTITIES_HTML, XML_UTIL_ENTITIES_NONE and XML_UTIL_CDATA_SECTION as $replaceEntities parameter";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.2";s:3:"api";s:5:"1.1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:207:"- fixed bug #5419: isValidName() now checks for character classes
- implemented request #8196: added optional parameter to influence array sorting to createTag() createTagFromArray() and createStartElement()";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.4";s:3:"api";s:5:"1.1.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:61:"- Fixed bug #9561: Not allowing underscores in middle of tags";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.2.0a1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:5:"alpha";}s:4:"date";s:10:"2008-05-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:208:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|ja.doma]";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.2.0a2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:5:"alpha";}s:4:"date";s:10:"2008-05-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2008-07-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2008-07-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-12-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:68:"Fixed Bug #14760: Bug in getDocTypeDeclaration() [ashnazg|fpospisil]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:194:"QA release

Bug #18343 Entities in file names decoded during packaging
Bug #19174	upgrade PHPUnit require statements & other fixes (for PEAR QA Team)
Request #19750	examples/example.php encoding";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.3";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:40:"Bug #20293	Broken installation for 1.2.2";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:76:"* Set minimum PHP version to 5.3.0
* Mark static methods with static keyword";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:203:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Adds a new XML_UTIL_COLLAPSE_NONE option
  for preventing empty tag collapsing.

* Request #15467 CDATA sections and blank nodes";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:58:"* Bug #21177 XML_Util::collapseEmptyTags() can return NULL";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:27:"* Bug #21184 Collapse issue";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-06-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:63:"* Decrease minimum PEAR version to 1.9.0 to allow PEAR upgrades";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-12-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:29:"* PR #11: fix phplint warning";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-04-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";}}}s:8:"filelist";a:25:{s:20:"examples/example.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2746028ae4395f549855a5e444ada7";s:4:"name";s:20:"examples/example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:63:"/opt/alt/php73/usr/share/doc/pear/XML_Util/examples/example.php";}s:21:"examples/example2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e52f4aa372c4067c609f49c2285b8f";s:4:"name";s:21:"examples/example2.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:64:"/opt/alt/php73/usr/share/doc/pear/XML_Util/examples/example2.php";}s:27:"tests/AbstractUnitTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d0af9354df0962e70e9e2215b5611b9c";s:4:"name";s:27:"tests/AbstractUnitTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/AbstractUnitTests.php";}s:25:"tests/ApiVersionTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"57ce547d64d6e1f2986c313407deffef";s:4:"name";s:25:"tests/ApiVersionTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/ApiVersionTests.php";}s:33:"tests/AttributesToStringTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d0427db94790df7ada24a744547edf5";s:4:"name";s:33:"tests/AttributesToStringTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/AttributesToStringTests.php";}s:32:"tests/CollapseEmptyTagsTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"673d1438c4718a70c5da3fe019027db4";s:4:"name";s:32:"tests/CollapseEmptyTagsTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CollapseEmptyTagsTests.php";}s:33:"tests/CreateCDataSectionTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"46b981f91edd163f1cd021cfef5d1bb1";s:4:"name";s:33:"tests/CreateCDataSectionTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateCDataSectionTests.php";}s:28:"tests/CreateCommentTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6aa925b879572e9b3f1885b7cdbb223b";s:4:"name";s:28:"tests/CreateCommentTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateCommentTests.php";}s:31:"tests/CreateEndElementTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbc083b62a020fa245fde5a7828a4806";s:4:"name";s:31:"tests/CreateEndElementTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:75:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateEndElementTests.php";}s:33:"tests/CreateStartElementTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f58e38343ecf60811c842d4cfc8194ae";s:4:"name";s:33:"tests/CreateStartElementTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateStartElementTests.php";}s:24:"tests/CreateTagTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9385fba272f4ebccf4c95d43d16dcff4";s:4:"name";s:24:"tests/CreateTagTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateTagTests.php";}s:33:"tests/CreateTagFromArrayTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"51e7ba1390e6dadc3c0be0c960bf171d";s:4:"name";s:33:"tests/CreateTagFromArrayTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/CreateTagFromArrayTests.php";}s:36:"tests/GetDocTypeDeclarationTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bbb54ef4cf56dc2c0b558b295de5668";s:4:"name";s:36:"tests/GetDocTypeDeclarationTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/GetDocTypeDeclarationTests.php";}s:32:"tests/GetXmlDeclarationTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"825b440b0ee8abd10b4df017c08bf15f";s:4:"name";s:32:"tests/GetXmlDeclarationTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/GetXmlDeclarationTests.php";}s:26:"tests/IsValidNameTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6783bb330f8f2ae7225f02d56f194e4";s:4:"name";s:26:"tests/IsValidNameTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/IsValidNameTests.php";}s:25:"tests/RaiseErrorTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b273525b905ae6d5fc53adcb3ce0b8d9";s:4:"name";s:25:"tests/RaiseErrorTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/RaiseErrorTests.php";}s:30:"tests/ReplaceEntitiesTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"20befbef5e55639539336761a17c64f3";s:4:"name";s:30:"tests/ReplaceEntitiesTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/ReplaceEntitiesTests.php";}s:30:"tests/ReverseEntitiesTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3ceff3302e31f90130be01c312b33b3";s:4:"name";s:30:"tests/ReverseEntitiesTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/ReverseEntitiesTests.php";}s:33:"tests/SplitQualifiedNameTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aeb95108896180ef77a7dce3c310a3b8";s:4:"name";s:33:"tests/SplitQualifiedNameTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/SplitQualifiedNameTests.php";}s:22:"tests/Bug4950Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e93010b1eff68f889fefcb006bf20b63";s:4:"name";s:22:"tests/Bug4950Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/Bug4950Tests.php";}s:22:"tests/Bug5392Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"748ffb640e13e7b960385c7e12413782";s:4:"name";s:22:"tests/Bug5392Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/Bug5392Tests.php";}s:23:"tests/Bug18343Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"01e68b66e27a6fdb197d572c67ae6bc5";s:4:"name";s:23:"tests/Bug18343Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/Bug18343Tests.php";}s:23:"tests/Bug21177Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d945220c38344bc773b18244439bb0cc";s:4:"name";s:23:"tests/Bug21177Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/Bug21177Tests.php";}s:23:"tests/Bug21184Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2672bb90875c2e00f93f563bfafe70";s:4:"name";s:23:"tests/Bug21184Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests/Bug21184Tests.php";}s:12:"XML/Util.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0db6fa9c169bf6904aa7e588c2325a13";s:4:"name";s:12:"XML/Util.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php73/usr/share/pear/XML/Util.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php73/usr/share/doc/pear/XML_Util/examples";b:1;s:42:"/opt/alt/php73/usr/share/doc/pear/XML_Util";b:1;s:49:"/opt/alt/php73/usr/share/pear/test/XML_Util/tests";b:1;s:43:"/opt/alt/php73/usr/share/pear/test/XML_Util";b:1;s:33:"/opt/alt/php73/usr/share/pear/XML";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.5";s:12:"release_date";s:10:"2020-04-19";s:13:"release_state";s:6:"stable";s:15:"release_license";s:11:"BSD License";s:13:"release_notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.9.0";s:8:"optional";s:2:"no";}i:2;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:4:"pcre";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:13:"Chuck Burgess";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:7:"ashnazg";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Stephan Schmidt";s:5:"email";s:19:"schst@php-tools.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"schst";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:12:"Davey Shafik";s:5:"email";s:13:"davey@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"davey";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/.registry/archive_tar.reg000064400000053640151732707770012437 0ustar00a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:25:"Tar file management class";s:11:"description";s:321:"This class provides handling of tar files in PHP.
It supports creating, listing, extracting and adding to tar files.
Gzip support is available if PHP has the zlib extension built-in or
loaded. Bz2 compression is also supported with the bz2 extension loaded.
Also Lzma2 compressed archives are supported with xz extension.";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:14:"Vincent Blavet";s:4:"user";s:7:"vblavet";s:5:"email";s:22:"vincent@phpconcept.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:22:"greg@chiaraquartet.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:12:"Michiel Rook";s:4:"user";s:5:"mrook";s:5:"email";s:13:"mrook@php.net";s:6:"active";s:3:"yes";}}s:6:"helper";a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2021-07-20";s:4:"time";s:8:"19:35:29";s:7:"version";a:2:{s:7:"release";s:6:"1.4.14";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:60:"* Properly fix symbolic link path traversal (CVE-2021-32610)";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:2:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"95f04c226245ad192b52c9164c1287ad";s:4:"name";s:15:"Archive/Tar.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fb90f0be7089a45c09a0d1182792419";s:4:"name";s:20:"docs/Archive_Tar.txt";s:4:"role";s:3:"doc";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.8.0";s:3:"max";s:7:"1.10.10";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.9.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:39:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.13";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2021-02-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:81:"* Fix Bug #27010: Relative symlinks failing (out-of path file extraction) [mrook]";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.12";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2021-01-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:82:"* Fix Bug #27008: Symlink out-of-path write vulnerability (CVE-2020-36193) [mrook]";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.11";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-11-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:97:"* Fix Bug #27002: Filename manipulation vulnerabilities (CVE-2020-28948 / CVE-2020-28949) [mrook]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.10";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-09-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:165:"* Fix block padding when the file buffer length is a multiple of 512 and smaller than Archive_Tar buffer length
* Don't try to copy username/groupname in chroot jail";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.9";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-12-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:67:"* Implement Feature #23861: Add option to disallow symlinks [mrook]";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.8";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-10-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:79:"* Fix Bug #23852: PHP 7.4 - Archive_Tar->_readHeader throws deprecation [mrook]";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.7";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-04-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:53:"* Improved performance by increasing read buffer size";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.6";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-02-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:67:"* Improve path traversal detection for forward and backward slashes";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-01-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:54:"* Fix Bug #23788: Relative symlinks are broken [mrook]";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2018-12-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:127:"* Fix Bug #21058: Long symlinks are not supported [mrook]
 * Fix Bug #23782: Prevent phar:// files from being extracted [mrook]";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-06-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:103:"* Fix Bug #21218: Cannot use result of built-in function in write context in PHP
   7.2.0alpha1 [mrook]";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2016-02-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* Fix reading of archives with files > 8GB
* Performance optimizations
* Do not try to call require_once on PEAR.php if it has already been loaded by the autoloader";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-08-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:60:"* Update composer.json to use pear-core-minimal 1.10.0alpha2";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-07-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:104:"* Add support for PHP 7
* Drop support for PHP 4
* Add visibility declarations to methods and properties";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.16";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-04-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:73:"* Fix Bug #20514: invalid package.xml; not installable with pyrus [mrook]";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.15";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-03-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:33:"* Fixes composer.json parse error";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.14";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:74:"* Fix Bug #18505: Possible incorrect handling of file names in TAR [mrook]";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.13";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-09-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:16:"New BSD
 License";}s:5:"notes";s:36:"* Fix Bug #20382: gzopen fix [mrook]";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.12";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-08-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:16:"New BSD
 License";}s:5:"notes";s:350:"* Fix Bug #19964: Memory leaking in Archive_Tar [mrook]
 * Fix Bug #20246: Broken with php 5.5.9 [mrook]
 * Fix Bug #20275: "pax_global_header" looks like a regular file
 * [mrook]
 * Implement Feature #19827: pass filename to _addFile function - downstream
 * patch [mrook]
 * Implement Feature #20132: Add custom mode/uid/gid to addString() [mrook]";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.11";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2013-02-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:18:"New BSD
   License";}s:5:"notes";s:128:"* Fix Bug #19746: Broken with PHP 5.5 [mrook]
 * Implement Feature #11258: Custom date/time in files added on-the-fly
 * [mrook]";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.10";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2012-04-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:18:"New BSD
   License";}s:5:"notes";s:143:"* Fix Bug #13361: Unable to add() some files (ex. mp3) [mrook]
 * Fix Bug #19330: Class creates incorrect (non-readable) tar.gz file
 * [mrook]";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.9";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2012-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:17:"New BSD   License";}s:5:"notes";s:259:"* Fix Bug #16759: No error thrown from missing PHP zlib functions [mrook]
 * Fix Bug #18877: Incorrect handling of backslashes in filenames on Linux [mrook]
 * Fix Bug #19085: Error while packaging [mrook]
 * Fix Bug #19289: Invalid tar file generated [mrook]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.8";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-10-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:449:"* Fix Bug #17853: Test failure: dirtraversal.phpt [mrook]
 * Fix Bug #18512: dead links are not saved in tar file [mrook]
 * Fix Bug #18702: Unpacks incorrectly on long file names using header prefix [mrook]
 * Implement Feature #10145: Patch to return a Pear Error Object on failure [mrook]
 * Implement Feature #17491: Option to preserve permissions [mrook]
 * Implement Feature #17813: Prevent PHP notice when extracting corrupted archive [mrook]";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.7";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-04-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:25:"PEAR compatibility update";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.6";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:168:"* Fix Bug #16963: extractList can't extract zipped files from big tar [mrook]
 * Implement Feature #4013: Ignoring files and directories on creating an archive. [mrook]";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.5";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:64:"* Fix Bug #16958: Update 'compatible' tag in package.xml [mrook]";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-30";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:338:"* Fix Bug #11871: wrong result of ::listContent() if filename begins or ends with space [mrook]
 * Fix Bug #12462: invalid tar magic [mrook]
 * Fix Bug #13918: Long filenames may get up to 511 0x00 bytes appended on read [mrook]
 * Fix Bug #16202: Bogus modification times [mrook]
 * Implement Feature #16212: Die is not exception [mrook]";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-03-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:249:"Change the license to New BSD license

   minor bugfix release
   * fix Bug #9921 compression with bzip2 fails [cellog]
   * fix Bug #11594 _readLongHeader leaves 0 bytes in filename [jamessas]
   * fix Bug #11769 Incorrect symlink handing [fajar99]";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-01-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:484:"Correct Bug #4016
Remove duplicate remove error display with '@'
Correct Bug #3909 : Check existence of OS_WINDOWS constant
Correct Bug #5452 fix for "lone zero block" when untarring packages
Change filemode (from pear-core/Archive/Tar.php v.1.21)
Correct Bug #6486 Can not extract symlinks
Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
Correct Bug #8114 Files added on-the-fly not storing date
Correct Bug #9352 Bug on _dirCheck function over nfs path";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:17:"Correct Bug #3855";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-06";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:40:"Bugs correction (2475, 2488, 2135, 2176)";}i:31;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-05-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:71:"Add support for other separator than the space char and bug
	correction";}i:32;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.1";s:3:"api";s:3:"1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-05-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:141:"* Add support for BZ2 compression
* Add support for add and extract without using temporary files : methods addString() and extractInString()";}i:33;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:23:"Change status to stable";}i:34;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"0.10-b1";s:3:"api";s:7:"0.10-b1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2003-01-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:59:"Add support for long filenames (greater than 99 characters)";}i:35;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.9";s:3:"api";s:3:"0.9";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:25:"Auto-detect gzip'ed files";}i:36;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.4";s:3:"api";s:3:"0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"Windows bugfix: use forward slashes inside archives";}i:37;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.2";s:3:"api";s:3:"0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-02-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:29:"From initial commit to stable";}i:38;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.3";s:3:"api";s:3:"0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:47:"Windows bugfix: used wrong directory separators";}}}s:8:"filelist";a:2:{s:15:"Archive/Tar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"95f04c226245ad192b52c9164c1287ad";s:4:"name";s:15:"Archive/Tar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php73/usr/share/pear/Archive/Tar.php";}s:20:"docs/Archive_Tar.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fb90f0be7089a45c09a0d1182792419";s:4:"name";s:20:"docs/Archive_Tar.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:66:"/opt/alt/php73/usr/share/doc/pear/Archive_Tar/docs/Archive_Tar.txt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php73/usr/share/pear/Archive";b:1;s:50:"/opt/alt/php73/usr/share/doc/pear/Archive_Tar/docs";b:1;s:45:"/opt/alt/php73/usr/share/doc/pear/Archive_Tar";b:1;}s:3:"old";a:7:{s:7:"version";s:6:"1.4.14";s:12:"release_date";s:10:"2021-07-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:60:"* Properly fix symbolic link path traversal (CVE-2021-32610)";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.9.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:4:{i:0;a:5:{s:4:"name";s:14:"Vincent Blavet";s:5:"email";s:22:"vincent@phpconcept.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"vblavet";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:22:"greg@chiaraquartet.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:12:"Michiel Rook";s:5:"email";s:13:"mrook@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:5:"mrook";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747070008;}pear/Archive/Tar.php000064400000254410151732707770010341 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * File::CSV
 *
 * PHP versions 4 and 5
 *
 * Copyright (c) 1997-2008,
 * Vincent Blavet <vincent@phpconcept.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  File_Formats
 * @package   Archive_Tar
 * @author    Vincent Blavet <vincent@phpconcept.net>
 * @copyright 1997-2010 The Authors
 * @license   http://www.opensource.org/licenses/bsd-license.php New BSD License
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/Archive_Tar
 */

// If the PEAR class cannot be loaded via the autoloader,
// then try to require_once it from the PHP include path.
if (!class_exists('PEAR')) {
    require_once 'PEAR.php';
}

define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));

if (!function_exists('gzopen') && function_exists('gzopen64')) {
    function gzopen($filename, $mode, $use_include_path = 0)
    {
        return gzopen64($filename, $mode, $use_include_path);
    }
}

if (!function_exists('gztell') && function_exists('gztell64')) {
    function gztell($zp)
    {
        return gztell64($zp);
    }
}

if (!function_exists('gzseek') && function_exists('gzseek64')) {
    function gzseek($zp, $offset, $whence = SEEK_SET)
    {
        return gzseek64($zp, $offset, $whence);
    }
}

/**
 * Creates a (compressed) Tar archive
 *
 * @package Archive_Tar
 * @author  Vincent Blavet <vincent@phpconcept.net>
 * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
 * @version $Revision$
 */
class Archive_Tar extends PEAR
{
    /**
     * @var string Name of the Tar
     */
    public $_tarname = '';

    /**
     * @var boolean if true, the Tar file will be gzipped
     */
    public $_compress = false;

    /**
     * @var string Type of compression : 'none', 'gz', 'bz2' or 'lzma2'
     */
    public $_compress_type = 'none';

    /**
     * @var string Explode separator
     */
    public $_separator = ' ';

    /**
     * @var file descriptor
     */
    public $_file = 0;

    /**
     * @var string Local Tar name of a remote Tar (http:// or ftp://)
     */
    public $_temp_tarname = '';

    /**
     * @var string regular expression for ignoring files or directories
     */
    public $_ignore_regexp = '';

    /**
     * @var object PEAR_Error object
     */
    public $error_object = null;

    /**
     * Format for data extraction
     *
     * @var string
     */
    public $_fmt = '';

    /**
     * @var int Length of the read buffer in bytes
     */
    protected $buffer_length;

    /**
     * Archive_Tar Class constructor. This flavour of the constructor only
     * declare a new Archive_Tar object, identifying it by the name of the
     * tar file.
     * If the compress argument is set the tar will be read or created as a
     * gzip or bz2 compressed TAR file.
     *
     * @param string $p_tarname The name of the tar archive to create
     * @param string $p_compress can be null, 'gz', 'bz2' or 'lzma2'. This
     *               parameter indicates if gzip, bz2 or lzma2 compression
     *               is required.  For compatibility reason the
     *               boolean value 'true' means 'gz'.
     * @param int $buffer_length Length of the read buffer in bytes
     *
     * @return bool
     */
    public function __construct($p_tarname, $p_compress = null, $buffer_length = 512)
    {
        parent::__construct();

        $this->_compress = false;
        $this->_compress_type = 'none';
        if (($p_compress === null) || ($p_compress == '')) {
            if (@file_exists($p_tarname)) {
                if ($fp = @fopen($p_tarname, "rb")) {
                    // look for gzip magic cookie
                    $data = fread($fp, 2);
                    fclose($fp);
                    if ($data == "\37\213") {
                        $this->_compress = true;
                        $this->_compress_type = 'gz';
                        // No sure it's enought for a magic code ....
                    } elseif ($data == "BZ") {
                        $this->_compress = true;
                        $this->_compress_type = 'bz2';
                    } elseif (file_get_contents($p_tarname, false, null, 1, 4) == '7zXZ') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    }
                }
            } else {
                // probably a remote file or some file accessible
                // through a stream interface
                if (substr($p_tarname, -2) == 'gz') {
                    $this->_compress = true;
                    $this->_compress_type = 'gz';
                } elseif ((substr($p_tarname, -3) == 'bz2') ||
                    (substr($p_tarname, -2) == 'bz')
                ) {
                    $this->_compress = true;
                    $this->_compress_type = 'bz2';
                } else {
                    if (substr($p_tarname, -2) == 'xz') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    }
                }
            }
        } else {
            if (($p_compress === true) || ($p_compress == 'gz')) {
                $this->_compress = true;
                $this->_compress_type = 'gz';
            } else {
                if ($p_compress == 'bz2') {
                    $this->_compress = true;
                    $this->_compress_type = 'bz2';
                } else {
                    if ($p_compress == 'lzma2') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    } else {
                        $this->_error(
                            "Unsupported compression type '$p_compress'\n" .
                            "Supported types are 'gz', 'bz2' and 'lzma2'.\n"
                        );
                        return false;
                    }
                }
            }
        }
        $this->_tarname = $p_tarname;
        if ($this->_compress) { // assert zlib or bz2 or xz extension support
            if ($this->_compress_type == 'gz') {
                $extname = 'zlib';
            } else {
                if ($this->_compress_type == 'bz2') {
                    $extname = 'bz2';
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        $extname = 'xz';
                    }
                }
            }

            if (!extension_loaded($extname)) {
                PEAR::loadExtension($extname);
            }
            if (!extension_loaded($extname)) {
                $this->_error(
                    "The extension '$extname' couldn't be found.\n" .
                    "Please make sure your version of PHP was built " .
                    "with '$extname' support.\n"
                );
                return false;
            }
        }


        if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
            $this->_fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
                "a8checksum/a1typeflag/a100link/a6magic/a2version/" .
                "a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
        } else {
            $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
                "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
                "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
        }


        $this->buffer_length = $buffer_length;
    }

    public function __destruct()
    {
        $this->_close();
        // ----- Look for a local copy to delete
        if ($this->_temp_tarname != '' && (bool) preg_match('/^tar[[:alnum:]]*\.tmp$/', $this->_temp_tarname)) {
            @unlink($this->_temp_tarname);
        }
    }

    /**
     * This method creates the archive file and add the files / directories
     * that are listed in $p_filelist.
     * If a file with the same name exist and is writable, it is replaced
     * by the new tar.
     * The method return false and a PEAR error text.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * For each directory added in the archive, the files and
     * sub-directories are also added.
     * See also createModify() method for more details.
     *
     * @param array $p_filelist An array of filenames and directory names, or a
     *              single string with names separated by a single
     *              blank space.
     *
     * @return true on success, false on error.
     * @see    createModify()
     */
    public function create($p_filelist)
    {
        return $this->createModify($p_filelist, '', '');
    }

    /**
     * This method add the files / directories that are listed in $p_filelist in
     * the archive. If the archive does not exist it is created.
     * The method return false and a PEAR error text.
     * The files and directories listed are only added at the end of the archive,
     * even if a file with the same name is already archived.
     * See also createModify() method for more details.
     *
     * @param array $p_filelist An array of filenames and directory names, or a
     *              single string with names separated by a single
     *              blank space.
     *
     * @return true on success, false on error.
     * @see    createModify()
     * @access public
     */
    public function add($p_filelist)
    {
        return $this->addModify($p_filelist, '', '');
    }

    /**
     * @param string $p_path
     * @param bool $p_preserve
     * @param bool $p_symlinks
     * @return bool
     */
    public function extract($p_path = '', $p_preserve = false, $p_symlinks = true)
    {
        return $this->extractModify($p_path, '', $p_preserve, $p_symlinks);
    }

    /**
     * @return array|int
     */
    public function listContent()
    {
        $v_list_detail = array();

        if ($this->_openRead()) {
            if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
                unset($v_list_detail);
                $v_list_detail = 0;
            }
            $this->_close();
        }

        return $v_list_detail;
    }

    /**
     * This method creates the archive file and add the files / directories
     * that are listed in $p_filelist.
     * If the file already exists and is writable, it is replaced by the
     * new tar. It is a create and not an add. If the file exists and is
     * read-only or is a directory it is not replaced. The method return
     * false and a PEAR error text.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * The path indicated in $p_remove_dir will be removed from the
     * memorized path of each file / directory listed when this path
     * exists. By default nothing is removed (empty path '')
     * The path indicated in $p_add_dir will be added at the beginning of
     * the memorized path of each file / directory listed. However it can
     * be set to empty ''. The adding of a path is done after the removing
     * of path.
     * The path add/remove ability enables the user to prepare an archive
     * for extraction in a different path than the origin files are.
     * See also addModify() method for file adding properties.
     *
     * @param array $p_filelist An array of filenames and directory names,
     *                             or a single string with names separated by
     *                             a single blank space.
     * @param string $p_add_dir A string which contains a path to be added
     *                             to the memorized path of each element in
     *                             the list.
     * @param string $p_remove_dir A string which contains a path to be
     *                             removed from the memorized path of each
     *                             element in the list, when relevant.
     *
     * @return boolean true on success, false on error.
     * @see addModify()
     */
    public function createModify($p_filelist, $p_add_dir, $p_remove_dir = '')
    {
        $v_result = true;

        if (!$this->_openWrite()) {
            return false;
        }

        if ($p_filelist != '') {
            if (is_array($p_filelist)) {
                $v_list = $p_filelist;
            } elseif (is_string($p_filelist)) {
                $v_list = explode($this->_separator, $p_filelist);
            } else {
                $this->_cleanFile();
                $this->_error('Invalid file list');
                return false;
            }

            $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
        }

        if ($v_result) {
            $this->_writeFooter();
            $this->_close();
        } else {
            $this->_cleanFile();
        }

        return $v_result;
    }

    /**
     * This method add the files / directories listed in $p_filelist at the
     * end of the existing archive. If the archive does not yet exists it
     * is created.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * The path indicated in $p_remove_dir will be removed from the
     * memorized path of each file / directory listed when this path
     * exists. By default nothing is removed (empty path '')
     * The path indicated in $p_add_dir will be added at the beginning of
     * the memorized path of each file / directory listed. However it can
     * be set to empty ''. The adding of a path is done after the removing
     * of path.
     * The path add/remove ability enables the user to prepare an archive
     * for extraction in a different path than the origin files are.
     * If a file/dir is already in the archive it will only be added at the
     * end of the archive. There is no update of the existing archived
     * file/dir. However while extracting the archive, the last file will
     * replace the first one. This results in a none optimization of the
     * archive size.
     * If a file/dir does not exist the file/dir is ignored. However an
     * error text is send to PEAR error.
     * If a file/dir is not readable the file/dir is ignored. However an
     * error text is send to PEAR error.
     *
     * @param array $p_filelist An array of filenames and directory
     *                             names, or a single string with names
     *                             separated by a single blank space.
     * @param string $p_add_dir A string which contains a path to be
     *                             added to the memorized path of each
     *                             element in the list.
     * @param string $p_remove_dir A string which contains a path to be
     *                             removed from the memorized path of
     *                             each element in the list, when
     *                             relevant.
     *
     * @return true on success, false on error.
     */
    public function addModify($p_filelist, $p_add_dir, $p_remove_dir = '')
    {
        $v_result = true;

        if (!$this->_isArchive()) {
            $v_result = $this->createModify(
                $p_filelist,
                $p_add_dir,
                $p_remove_dir
            );
        } else {
            if (is_array($p_filelist)) {
                $v_list = $p_filelist;
            } elseif (is_string($p_filelist)) {
                $v_list = explode($this->_separator, $p_filelist);
            } else {
                $this->_error('Invalid file list');
                return false;
            }

            $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
        }

        return $v_result;
    }

    /**
     * This method add a single string as a file at the
     * end of the existing archive. If the archive does not yet exists it
     * is created.
     *
     * @param string $p_filename A string which contains the full
     *                           filename path that will be associated
     *                           with the string.
     * @param string $p_string The content of the file added in
     *                           the archive.
     * @param bool|int $p_datetime A custom date/time (unix timestamp)
     *                           for the file (optional).
     * @param array $p_params An array of optional params:
     *                               stamp => the datetime (replaces
     *                                   datetime above if it exists)
     *                               mode => the permissions on the
     *                                   file (600 by default)
     *                               type => is this a link?  See the
     *                                   tar specification for details.
     *                                   (default = regular file)
     *                               uid => the user ID of the file
     *                                   (default = 0 = root)
     *                               gid => the group ID of the file
     *                                   (default = 0 = root)
     *
     * @return true on success, false on error.
     */
    public function addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
    {
        $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
        $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
        $p_type = @$p_params["type"] ? $p_params["type"] : "";
        $p_uid = @$p_params["uid"] ? $p_params["uid"] : "";
        $p_gid = @$p_params["gid"] ? $p_params["gid"] : "";
        $v_result = true;

        if (!$this->_isArchive()) {
            if (!$this->_openWrite()) {
                return false;
            }
            $this->_close();
        }

        if (!$this->_openAppend()) {
            return false;
        }

        // Need to check the get back to the temporary file ? ....
        $v_result = $this->_addString($p_filename, $p_string, $p_datetime, $p_params);

        $this->_writeFooter();

        $this->_close();

        return $v_result;
    }

    /**
     * This method extract all the content of the archive in the directory
     * indicated by $p_path. When relevant the memorized path of the
     * files/dir can be modified by removing the $p_remove_path path at the
     * beginning of the file/dir path.
     * While extracting a file, if the directory path does not exists it is
     * created.
     * While extracting a file, if the file already exists it is replaced
     * without looking for last modification date.
     * While extracting a file, if the file already exists and is write
     * protected, the extraction is aborted.
     * While extracting a file, if a directory with the same name already
     * exists, the extraction is aborted.
     * While extracting a directory, if a file with the same name already
     * exists, the extraction is aborted.
     * While extracting a file/directory if the destination directory exist
     * and is write protected, or does not exist but can not be created,
     * the extraction is aborted.
     * If after extraction an extracted file does not show the correct
     * stored file size, the extraction is aborted.
     * When the extraction is aborted, a PEAR error text is set and false
     * is returned. However the result can be a partial extraction that may
     * need to be manually cleaned.
     *
     * @param string $p_path The path of the directory where the
     *                               files/dir need to by extracted.
     * @param string $p_remove_path Part of the memorized path that can be
     *                               removed if present at the beginning of
     *                               the file/dir path.
     * @param boolean $p_preserve Preserve user/group ownership of files
     * @param boolean $p_symlinks Allow symlinks.
     *
     * @return boolean true on success, false on error.
     * @see    extractList()
     */
    public function extractModify($p_path, $p_remove_path, $p_preserve = false, $p_symlinks = true)
    {
        $v_result = true;
        $v_list_detail = array();

        if ($v_result = $this->_openRead()) {
            $v_result = $this->_extractList(
                $p_path,
                $v_list_detail,
                "complete",
                0,
                $p_remove_path,
                $p_preserve,
                $p_symlinks
            );
            $this->_close();
        }

        return $v_result;
    }

    /**
     * This method extract from the archive one file identified by $p_filename.
     * The return value is a string with the file content, or NULL on error.
     *
     * @param string $p_filename The path of the file to extract in a string.
     *
     * @return a string with the file content or NULL.
     */
    public function extractInString($p_filename)
    {
        if ($this->_openRead()) {
            $v_result = $this->_extractInString($p_filename);
            $this->_close();
        } else {
            $v_result = null;
        }

        return $v_result;
    }

    /**
     * This method extract from the archive only the files indicated in the
     * $p_filelist. These files are extracted in the current directory or
     * in the directory indicated by the optional $p_path parameter.
     * If indicated the $p_remove_path can be used in the same way as it is
     * used in extractModify() method.
     *
     * @param array $p_filelist An array of filenames and directory names,
     *                               or a single string with names separated
     *                               by a single blank space.
     * @param string $p_path The path of the directory where the
     *                               files/dir need to by extracted.
     * @param string $p_remove_path Part of the memorized path that can be
     *                               removed if present at the beginning of
     *                               the file/dir path.
     * @param boolean $p_preserve Preserve user/group ownership of files
     * @param boolean $p_symlinks Allow symlinks.
     *
     * @return true on success, false on error.
     * @see    extractModify()
     */
    public function extractList($p_filelist, $p_path = '', $p_remove_path = '', $p_preserve = false, $p_symlinks = true)
    {
        $v_result = true;
        $v_list_detail = array();

        if (is_array($p_filelist)) {
            $v_list = $p_filelist;
        } elseif (is_string($p_filelist)) {
            $v_list = explode($this->_separator, $p_filelist);
        } else {
            $this->_error('Invalid string list');
            return false;
        }

        if ($v_result = $this->_openRead()) {
            $v_result = $this->_extractList(
                $p_path,
                $v_list_detail,
                "partial",
                $v_list,
                $p_remove_path,
                $p_preserve,
                $p_symlinks
            );
            $this->_close();
        }

        return $v_result;
    }

    /**
     * This method set specific attributes of the archive. It uses a variable
     * list of parameters, in the format attribute code + attribute values :
     * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
     *
     * @return true on success, false on error.
     */
    public function setAttribute()
    {
        $v_result = true;

        // ----- Get the number of variable list of arguments
        if (($v_size = func_num_args()) == 0) {
            return true;
        }

        // ----- Get the arguments
        $v_att_list = func_get_args();

        // ----- Read the attributes
        $i = 0;
        while ($i < $v_size) {

            // ----- Look for next option
            switch ($v_att_list[$i]) {
                // ----- Look for options that request a string value
                case ARCHIVE_TAR_ATT_SEPARATOR :
                    // ----- Check the number of parameters
                    if (($i + 1) >= $v_size) {
                        $this->_error(
                            'Invalid number of parameters for '
                            . 'attribute ARCHIVE_TAR_ATT_SEPARATOR'
                        );
                        return false;
                    }

                    // ----- Get the value
                    $this->_separator = $v_att_list[$i + 1];
                    $i++;
                    break;

                default :
                    $this->_error('Unknown attribute code ' . $v_att_list[$i] . '');
                    return false;
            }

            // ----- Next attribute
            $i++;
        }

        return $v_result;
    }

    /**
     * This method sets the regular expression for ignoring files and directories
     * at import, for example:
     * $arch->setIgnoreRegexp("#CVS|\.svn#");
     *
     * @param string $regexp regular expression defining which files or directories to ignore
     */
    public function setIgnoreRegexp($regexp)
    {
        $this->_ignore_regexp = $regexp;
    }

    /**
     * This method sets the regular expression for ignoring all files and directories
     * matching the filenames in the array list at import, for example:
     * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool'));
     *
     * @param array $list a list of file or directory names to ignore
     *
     * @access public
     */
    public function setIgnoreList($list)
    {
        $list = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
        $regexp = '#/' . join('$|/', $list) . '#';
        $this->setIgnoreRegexp($regexp);
    }

    /**
     * @param string $p_message
     */
    public function _error($p_message)
    {
        $this->error_object = $this->raiseError($p_message);
    }

    /**
     * @param string $p_message
     */
    public function _warning($p_message)
    {
        $this->error_object = $this->raiseError($p_message);
    }

    /**
     * @param string $p_filename
     * @return bool
     */
    public function _isArchive($p_filename = null)
    {
        if ($p_filename == null) {
            $p_filename = $this->_tarname;
        }
        clearstatcache();
        return @is_file($p_filename) && !@is_link($p_filename);
    }

    /**
     * @return bool
     */
    public function _openWrite()
    {
        if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
            $this->_file = @gzopen($this->_tarname, "wb9");
        } else {
            if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
                $this->_file = @bzopen($this->_tarname, "w");
            } else {
                if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
                    $this->_file = @xzopen($this->_tarname, 'w');
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($this->_tarname, "wb");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error(
                'Unable to open in write mode \''
                . $this->_tarname . '\''
            );
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openRead()
    {
        if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {

            // ----- Look if a local copy need to be done
            if ($this->_temp_tarname == '') {
                $this->_temp_tarname = uniqid('tar') . '.tmp';
                if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
                    $this->_error(
                        'Unable to open in read mode \''
                        . $this->_tarname . '\''
                    );
                    $this->_temp_tarname = '';
                    return false;
                }
                if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
                    $this->_error(
                        'Unable to open in write mode \''
                        . $this->_temp_tarname . '\''
                    );
                    $this->_temp_tarname = '';
                    return false;
                }
                while ($v_data = @fread($v_file_from, 1024)) {
                    @fwrite($v_file_to, $v_data);
                }
                @fclose($v_file_from);
                @fclose($v_file_to);
            }

            // ----- File to open if the local copy
            $v_filename = $this->_temp_tarname;
        } else {
            // ----- File to open if the normal Tar file

            $v_filename = $this->_tarname;
        }

        if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
            $this->_file = @gzopen($v_filename, "rb");
        } else {
            if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
                $this->_file = @bzopen($v_filename, "r");
            } else {
                if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
                    $this->_file = @xzopen($v_filename, "r");
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($v_filename, "rb");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error('Unable to open in read mode \'' . $v_filename . '\'');
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openReadWrite()
    {
        if ($this->_compress_type == 'gz') {
            $this->_file = @gzopen($this->_tarname, "r+b");
        } else {
            if ($this->_compress_type == 'bz2') {
                $this->_error(
                    'Unable to open bz2 in read/write mode \''
                    . $this->_tarname . '\' (limitation of bz2 extension)'
                );
                return false;
            } else {
                if ($this->_compress_type == 'lzma2') {
                    $this->_error(
                        'Unable to open lzma2 in read/write mode \''
                        . $this->_tarname . '\' (limitation of lzma2 extension)'
                    );
                    return false;
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($this->_tarname, "r+b");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error(
                'Unable to open in read/write mode \''
                . $this->_tarname . '\''
            );
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _close()
    {
        //if (isset($this->_file)) {
        if (is_resource($this->_file)) {
            if ($this->_compress_type == 'gz') {
                @gzclose($this->_file);
            } else {
                if ($this->_compress_type == 'bz2') {
                    @bzclose($this->_file);
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        @xzclose($this->_file);
                    } else {
                        if ($this->_compress_type == 'none') {
                            @fclose($this->_file);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }

            $this->_file = 0;
        }

        // ----- Look if a local copy need to be erase
        // Note that it might be interesting to keep the url for a time : ToDo
        if ($this->_temp_tarname != '') {
            @unlink($this->_temp_tarname);
            $this->_temp_tarname = '';
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _cleanFile()
    {
        $this->_close();

        // ----- Look for a local copy
        if ($this->_temp_tarname != '') {
            // ----- Remove the local copy but not the remote tarname
            @unlink($this->_temp_tarname);
            $this->_temp_tarname = '';
        } else {
            // ----- Remove the local tarname file
            @unlink($this->_tarname);
        }
        $this->_tarname = '';

        return true;
    }

    /**
     * @param mixed $p_binary_data
     * @param integer $p_len
     * @return bool
     */
    public function _writeBlock($p_binary_data, $p_len = null)
    {
        if (is_resource($this->_file)) {
            if ($p_len === null) {
                if ($this->_compress_type == 'gz') {
                    @gzputs($this->_file, $p_binary_data);
                } else {
                    if ($this->_compress_type == 'bz2') {
                        @bzwrite($this->_file, $p_binary_data);
                    } else {
                        if ($this->_compress_type == 'lzma2') {
                            @xzwrite($this->_file, $p_binary_data);
                        } else {
                            if ($this->_compress_type == 'none') {
                                @fputs($this->_file, $p_binary_data);
                            } else {
                                $this->_error(
                                    'Unknown or missing compression type ('
                                    . $this->_compress_type . ')'
                                );
                            }
                        }
                    }
                }
            } else {
                if ($this->_compress_type == 'gz') {
                    @gzputs($this->_file, $p_binary_data, $p_len);
                } else {
                    if ($this->_compress_type == 'bz2') {
                        @bzwrite($this->_file, $p_binary_data, $p_len);
                    } else {
                        if ($this->_compress_type == 'lzma2') {
                            @xzwrite($this->_file, $p_binary_data, $p_len);
                        } else {
                            if ($this->_compress_type == 'none') {
                                @fputs($this->_file, $p_binary_data, $p_len);
                            } else {
                                $this->_error(
                                    'Unknown or missing compression type ('
                                    . $this->_compress_type . ')'
                                );
                            }
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * @return null|string
     */
    public function _readBlock()
    {
        $v_block = null;
        if (is_resource($this->_file)) {
            if ($this->_compress_type == 'gz') {
                $v_block = @gzread($this->_file, 512);
            } else {
                if ($this->_compress_type == 'bz2') {
                    $v_block = @bzread($this->_file, 512);
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        $v_block = @xzread($this->_file, 512);
                    } else {
                        if ($this->_compress_type == 'none') {
                            $v_block = @fread($this->_file, 512);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }
        }
        return $v_block;
    }

    /**
     * @param null $p_len
     * @return bool
     */
    public function _jumpBlock($p_len = null)
    {
        if (is_resource($this->_file)) {
            if ($p_len === null) {
                $p_len = 1;
            }

            if ($this->_compress_type == 'gz') {
                @gzseek($this->_file, gztell($this->_file) + ($p_len * 512));
            } else {
                if ($this->_compress_type == 'bz2') {
                    // ----- Replace missing bztell() and bzseek()
                    for ($i = 0; $i < $p_len; $i++) {
                        $this->_readBlock();
                    }
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        // ----- Replace missing xztell() and xzseek()
                        for ($i = 0; $i < $p_len; $i++) {
                            $this->_readBlock();
                        }
                    } else {
                        if ($this->_compress_type == 'none') {
                            @fseek($this->_file, $p_len * 512, SEEK_CUR);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * @return bool
     */
    public function _writeFooter()
    {
        if (is_resource($this->_file)) {
            // ----- Write the last 0 filled block for end of archive
            $v_binary_data = pack('a1024', '');
            $this->_writeBlock($v_binary_data);
        }
        return true;
    }

    /**
     * @param array $p_list
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @return bool
     */
    public function _addList($p_list, $p_add_dir, $p_remove_dir)
    {
        $v_result = true;
        $v_header = array();

        // ----- Remove potential windows directory separator
        $p_add_dir = $this->_translateWinPath($p_add_dir);
        $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);

        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if (sizeof($p_list) == 0) {
            return true;
        }

        foreach ($p_list as $v_filename) {
            if (!$v_result) {
                break;
            }

            // ----- Skip the current tar name
            if ($v_filename == $this->_tarname) {
                continue;
            }

            if ($v_filename == '') {
                continue;
            }

            // ----- ignore files and directories matching the ignore regular expression
            if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/' . $v_filename)) {
                $this->_warning("File '$v_filename' ignored");
                continue;
            }

            if (!file_exists($v_filename) && !is_link($v_filename)) {
                $this->_warning("File '$v_filename' does not exist");
                continue;
            }

            // ----- Add the file or directory header
            if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) {
                return false;
            }

            if (@is_dir($v_filename) && !@is_link($v_filename)) {
                if (!($p_hdir = opendir($v_filename))) {
                    $this->_warning("Directory '$v_filename' can not be read");
                    continue;
                }
                while (false !== ($p_hitem = readdir($p_hdir))) {
                    if (($p_hitem != '.') && ($p_hitem != '..')) {
                        if ($v_filename != ".") {
                            $p_temp_list[0] = $v_filename . '/' . $p_hitem;
                        } else {
                            $p_temp_list[0] = $p_hitem;
                        }

                        $v_result = $this->_addList(
                            $p_temp_list,
                            $p_add_dir,
                            $p_remove_dir
                        );
                    }
                }

                unset($p_temp_list);
                unset($p_hdir);
                unset($p_hitem);
            }
        }

        return $v_result;
    }

    /**
     * @param string $p_filename
     * @param mixed $p_header
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @param null $v_stored_filename
     * @return bool
     */
    public function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename = null)
    {
        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if ($p_filename == '') {
            $this->_error('Invalid file name');
            return false;
        }

        if (is_null($v_stored_filename)) {
            // ----- Calculate the stored filename
            $p_filename = $this->_translateWinPath($p_filename, false);
            $v_stored_filename = $p_filename;

            if (strcmp($p_filename, $p_remove_dir) == 0) {
                return true;
            }

            if ($p_remove_dir != '') {
                if (substr($p_remove_dir, -1) != '/') {
                    $p_remove_dir .= '/';
                }

                if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) {
                    $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
                }
            }

            $v_stored_filename = $this->_translateWinPath($v_stored_filename);
            if ($p_add_dir != '') {
                if (substr($p_add_dir, -1) == '/') {
                    $v_stored_filename = $p_add_dir . $v_stored_filename;
                } else {
                    $v_stored_filename = $p_add_dir . '/' . $v_stored_filename;
                }
            }

            $v_stored_filename = $this->_pathReduction($v_stored_filename);
        }

        if ($this->_isArchive($p_filename)) {
            if (($v_file = @fopen($p_filename, "rb")) == 0) {
                $this->_warning(
                    "Unable to open file '" . $p_filename
                    . "' in binary read mode"
                );
                return true;
            }

            if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
                return false;
            }

            while (($v_buffer = fread($v_file, $this->buffer_length)) != '') {
                $buffer_length = strlen("$v_buffer");
                if ($buffer_length != $this->buffer_length) {
                    $pack_size = ((int)($buffer_length / 512) + ($buffer_length % 512 !== 0 ? 1 : 0)) * 512;
                    $pack_format = sprintf('a%d', $pack_size);
                } else {
                    $pack_format = sprintf('a%d', $this->buffer_length);
                }
                $v_binary_data = pack($pack_format, "$v_buffer");
                $this->_writeBlock($v_binary_data);
            }

            fclose($v_file);
        } else {
            // ----- Only header for dir
            if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
                return false;
            }
        }

        return true;
    }

    /**
     * @param string $p_filename
     * @param string $p_string
     * @param bool $p_datetime
     * @param array $p_params
     * @return bool
     */
    public function _addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
    {
        $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
        $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
        $p_type = @$p_params["type"] ? $p_params["type"] : "";
        $p_uid = @$p_params["uid"] ? $p_params["uid"] : 0;
        $p_gid = @$p_params["gid"] ? $p_params["gid"] : 0;
        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if ($p_filename == '') {
            $this->_error('Invalid file name');
            return false;
        }

        // ----- Calculate the stored filename
        $p_filename = $this->_translateWinPath($p_filename, false);

        // ----- If datetime is not specified, set current time
        if ($p_datetime === false) {
            $p_datetime = time();
        }

        if (!$this->_writeHeaderBlock(
            $p_filename,
            strlen($p_string),
            $p_stamp,
            $p_mode,
            $p_type,
            $p_uid,
            $p_gid
        )
        ) {
            return false;
        }

        $i = 0;
        while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') {
            $v_binary_data = pack("a512", $v_buffer);
            $this->_writeBlock($v_binary_data);
        }

        return true;
    }

    /**
     * @param string $p_filename
     * @param string $p_stored_filename
     * @return bool
     */
    public function _writeHeader($p_filename, $p_stored_filename)
    {
        if ($p_stored_filename == '') {
            $p_stored_filename = $p_filename;
        }

        $v_reduced_filename = $this->_pathReduction($p_stored_filename);

        if (strlen($v_reduced_filename) > 99) {
            if (!$this->_writeLongHeader($v_reduced_filename, false)) {
                return false;
            }
        }

        $v_linkname = '';
        if (@is_link($p_filename)) {
            $v_linkname = readlink($p_filename);
        }

        if (strlen($v_linkname) > 99) {
            if (!$this->_writeLongHeader($v_linkname, true)) {
                return false;
            }
        }

        $v_info = lstat($p_filename);
        $v_uid = sprintf("%07s", DecOct($v_info[4]));
        $v_gid = sprintf("%07s", DecOct($v_info[5]));
        $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));
        $v_mtime = sprintf("%011s", DecOct($v_info['mtime']));

        if (@is_link($p_filename)) {
            $v_typeflag = '2';
            $v_size = sprintf("%011s", DecOct(0));
        } elseif (@is_dir($p_filename)) {
            $v_typeflag = "5";
            $v_size = sprintf("%011s", DecOct(0));
        } else {
            $v_typeflag = '0';
            clearstatcache();
            $v_size = sprintf("%011s", DecOct($v_info['size']));
        }

        $v_magic = 'ustar ';
        $v_version = ' ';
        $v_uname = '';
        $v_gname = '';

        if (function_exists('posix_getpwuid')) {
            $userinfo = posix_getpwuid($v_info[4]);
            $groupinfo = posix_getgrgid($v_info[5]);

            if (isset($userinfo['name'])) {
                $v_uname = $userinfo['name'];
            }

            if (isset($groupinfo['name'])) {
                $v_gname = $groupinfo['name'];
            }
        }

        $v_devmajor = '';
        $v_devminor = '';
        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12a12",
            $v_reduced_filename,
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $v_typeflag,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s\0 ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        return true;
    }

    /**
     * @param string $p_filename
     * @param int $p_size
     * @param int $p_mtime
     * @param int $p_perms
     * @param string $p_type
     * @param int $p_uid
     * @param int $p_gid
     * @return bool
     */
    public function _writeHeaderBlock(
        $p_filename,
        $p_size,
        $p_mtime = 0,
        $p_perms = 0,
        $p_type = '',
        $p_uid = 0,
        $p_gid = 0
    )
    {
        $p_filename = $this->_pathReduction($p_filename);

        if (strlen($p_filename) > 99) {
            if (!$this->_writeLongHeader($p_filename, false)) {
                return false;
            }
        }

        if ($p_type == "5") {
            $v_size = sprintf("%011s", DecOct(0));
        } else {
            $v_size = sprintf("%011s", DecOct($p_size));
        }

        $v_uid = sprintf("%07s", DecOct($p_uid));
        $v_gid = sprintf("%07s", DecOct($p_gid));
        $v_perms = sprintf("%07s", DecOct($p_perms & 000777));

        $v_mtime = sprintf("%11s", DecOct($p_mtime));

        $v_linkname = '';

        $v_magic = 'ustar ';

        $v_version = ' ';

        if (function_exists('posix_getpwuid')) {
            $userinfo = posix_getpwuid($p_uid);
            $groupinfo = posix_getgrgid($p_gid);

            if ($userinfo === false || $groupinfo === false) {
                $v_uname = '';
                $v_gname = '';
            } else {
                $v_uname = $userinfo['name'];
                $v_gname = $groupinfo['name'];
            }
        } else {
            $v_uname = '';
            $v_gname = '';
        }

        $v_devmajor = '';

        $v_devminor = '';

        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12A12",
            $p_filename,
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $p_type,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        return true;
    }

    /**
     * @param string $p_filename
     * @return bool
     */
    public function _writeLongHeader($p_filename, $is_link = false)
    {
        $v_uid = sprintf("%07s", 0);
        $v_gid = sprintf("%07s", 0);
        $v_perms = sprintf("%07s", 0);
        $v_size = sprintf("%'011s", DecOct(strlen($p_filename)));
        $v_mtime = sprintf("%011s", 0);
        $v_typeflag = ($is_link ? 'K' : 'L');
        $v_linkname = '';
        $v_magic = 'ustar ';
        $v_version = ' ';
        $v_uname = '';
        $v_gname = '';
        $v_devmajor = '';
        $v_devminor = '';
        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12a12",
            '././@LongLink',
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $v_typeflag,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s\0 ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        // ----- Write the filename as content of the block
        $i = 0;
        while (($v_buffer = substr($p_filename, (($i++) * 512), 512)) != '') {
            $v_binary_data = pack("a512", "$v_buffer");
            $this->_writeBlock($v_binary_data);
        }

        return true;
    }

    /**
     * @param mixed $v_binary_data
     * @param mixed $v_header
     * @return bool
     */
    public function _readHeader($v_binary_data, &$v_header)
    {
        if (strlen($v_binary_data) == 0) {
            $v_header['filename'] = '';
            return true;
        }

        if (strlen($v_binary_data) != 512) {
            $v_header['filename'] = '';
            $this->_error('Invalid block size : ' . strlen($v_binary_data));
            return false;
        }

        if (!is_array($v_header)) {
            $v_header = array();
        }
        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        $v_binary_split = str_split($v_binary_data);
        $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 0, 148)));
        $v_checksum += array_sum(array_map('ord', array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',)));
        $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 156, 512)));


        $v_data = unpack($this->_fmt, $v_binary_data);

        if (strlen($v_data["prefix"]) > 0) {
            $v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
        }

        // ----- Extract the checksum
        $v_data_checksum = trim($v_data['checksum']);
        if (!preg_match('/^[0-7]*$/', $v_data_checksum)) {
            $this->_error(
                'Invalid checksum for file "' . $v_data['filename']
                . '" : ' . $v_data_checksum . ' extracted'
            );
            return false;
        }

        $v_header['checksum'] = OctDec($v_data_checksum);
        if ($v_header['checksum'] != $v_checksum) {
            $v_header['filename'] = '';

            // ----- Look for last block (empty block)
            if (($v_checksum == 256) && ($v_header['checksum'] == 0)) {
                return true;
            }

            $this->_error(
                'Invalid checksum for file "' . $v_data['filename']
                . '" : ' . $v_checksum . ' calculated, '
                . $v_header['checksum'] . ' expected'
            );
            return false;
        }

        // ----- Extract the properties
        $v_header['filename'] = rtrim($v_data['filename'], "\0");
        if ($this->_isMaliciousFilename($v_header['filename'])) {
            $this->_error(
                'Malicious .tar detected, file "' . $v_header['filename'] .
                '" will not install in desired directory tree'
            );
            return false;
        }
        $v_header['mode'] = OctDec(trim($v_data['mode']));
        $v_header['uid'] = OctDec(trim($v_data['uid']));
        $v_header['gid'] = OctDec(trim($v_data['gid']));
        $v_header['size'] = $this->_tarRecToSize($v_data['size']);
        $v_header['mtime'] = OctDec(trim($v_data['mtime']));
        if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
            $v_header['size'] = 0;
        }
        $v_header['link'] = trim($v_data['link']);
        /* ----- All these fields are removed form the header because
        they do not carry interesting info
        $v_header[magic] = trim($v_data[magic]);
        $v_header[version] = trim($v_data[version]);
        $v_header[uname] = trim($v_data[uname]);
        $v_header[gname] = trim($v_data[gname]);
        $v_header[devmajor] = trim($v_data[devmajor]);
        $v_header[devminor] = trim($v_data[devminor]);
        */

        return true;
    }

    /**
     * Convert Tar record size to actual size
     *
     * @param string $tar_size
     * @return size of tar record in bytes
     */
    private function _tarRecToSize($tar_size)
    {
        /*
         * First byte of size has a special meaning if bit 7 is set.
         *
         * Bit 7 indicates base-256 encoding if set.
         * Bit 6 is the sign bit.
         * Bits 5:0 are most significant value bits.
         */
        $ch = ord($tar_size[0]);
        if ($ch & 0x80) {
            // Full 12-bytes record is required.
            $rec_str = $tar_size . "\x00";

            $size = ($ch & 0x40) ? -1 : 0;
            $size = ($size << 6) | ($ch & 0x3f);

            for ($num_ch = 1; $num_ch < 12; ++$num_ch) {
                $size = ($size * 256) + ord($rec_str[$num_ch]);
            }

            return $size;

        } else {
            return OctDec(trim($tar_size));
        }
    }

    /**
     * Detect and report a malicious file name
     *
     * @param string $file
     *
     * @return bool
     */
    private function _isMaliciousFilename($file)
    {
        if (strpos($file, '://') !== false) {
            return true;
        }
        if (strpos($file, '../') !== false || strpos($file, '..\\') !== false) {
            return true;
        }
        return false;
    }

    /**
     * @param $v_header
     * @return bool
     */
    public function _readLongHeader(&$v_header)
    {
        $v_filename = '';
        $v_filesize = $v_header['size'];
        $n = floor($v_header['size'] / 512);
        for ($i = 0; $i < $n; $i++) {
            $v_content = $this->_readBlock();
            $v_filename .= $v_content;
        }
        if (($v_header['size'] % 512) != 0) {
            $v_content = $this->_readBlock();
            $v_filename .= $v_content;
        }

        // ----- Read the next header
        $v_binary_data = $this->_readBlock();

        if (!$this->_readHeader($v_binary_data, $v_header)) {
            return false;
        }

        $v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0");
        $v_header['filename'] = $v_filename;
        if ($this->_isMaliciousFilename($v_filename)) {
            $this->_error(
                'Malicious .tar detected, file "' . $v_filename .
                '" will not install in desired directory tree'
            );
            return false;
        }

        return true;
    }

    /**
     * This method extract from the archive one file identified by $p_filename.
     * The return value is a string with the file content, or null on error.
     *
     * @param string $p_filename The path of the file to extract in a string.
     *
     * @return a string with the file content or null.
     */
    private function _extractInString($p_filename)
    {
        $v_result_str = "";

        while (strlen($v_binary_data = $this->_readBlock()) != 0) {
            if (!$this->_readHeader($v_binary_data, $v_header)) {
                return null;
            }

            if ($v_header['filename'] == '') {
                continue;
            }

            switch ($v_header['typeflag']) {
                case 'L':
                    {
                        if (!$this->_readLongHeader($v_header)) {
                            return null;
                        }
                    }
                    break;

                case 'K':
                    {
                        $v_link_header = $v_header;
                        if (!$this->_readLongHeader($v_link_header)) {
                            return null;
                        }
                        $v_header['link'] = $v_link_header['filename'];
                    }
                    break;
            }

            if ($v_header['filename'] == $p_filename) {
                if ($v_header['typeflag'] == "5") {
                    $this->_error(
                        'Unable to extract in string a directory '
                        . 'entry {' . $v_header['filename'] . '}'
                    );
                    return null;
                } else {
                    $n = floor($v_header['size'] / 512);
                    for ($i = 0; $i < $n; $i++) {
                        $v_result_str .= $this->_readBlock();
                    }
                    if (($v_header['size'] % 512) != 0) {
                        $v_content = $this->_readBlock();
                        $v_result_str .= substr(
                            $v_content,
                            0,
                            ($v_header['size'] % 512)
                        );
                    }
                    return $v_result_str;
                }
            } else {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
            }
        }

        return null;
    }

    /**
     * @param string $p_path
     * @param string $p_list_detail
     * @param string $p_mode
     * @param string $p_file_list
     * @param string $p_remove_path
     * @param bool $p_preserve
     * @param bool $p_symlinks
     * @return bool
     */
    public function _extractList(
        $p_path,
        &$p_list_detail,
        $p_mode,
        $p_file_list,
        $p_remove_path,
        $p_preserve = false,
        $p_symlinks = true
    )
    {
        $v_result = true;
        $v_nb = 0;
        $v_extract_all = true;
        $v_listing = false;

        $p_path = $this->_translateWinPath($p_path, false);
        if ($p_path == '' || (substr($p_path, 0, 1) != '/'
                && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))
        ) {
            $p_path = "./" . $p_path;
        }
        $p_remove_path = $this->_translateWinPath($p_remove_path);

        // ----- Look for path to remove format (should end by /)
        if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) {
            $p_remove_path .= '/';
        }
        $p_remove_path_size = strlen($p_remove_path);

        switch ($p_mode) {
            case "complete" :
                $v_extract_all = true;
                $v_listing = false;
                break;
            case "partial" :
                $v_extract_all = false;
                $v_listing = false;
                break;
            case "list" :
                $v_extract_all = false;
                $v_listing = true;
                break;
            default :
                $this->_error('Invalid extract mode (' . $p_mode . ')');
                return false;
        }

        clearstatcache();

        while (strlen($v_binary_data = $this->_readBlock()) != 0) {
            $v_extract_file = false;
            $v_extraction_stopped = 0;

            if (!$this->_readHeader($v_binary_data, $v_header)) {
                return false;
            }

            if ($v_header['filename'] == '') {
                continue;
            }

            switch ($v_header['typeflag']) {
                case 'L':
                    {
                        if (!$this->_readLongHeader($v_header)) {
                            return null;
                        }
                    }
                    break;

                case 'K':
                    {
                        $v_link_header = $v_header;
                        if (!$this->_readLongHeader($v_link_header)) {
                            return null;
                        }
                        $v_header['link'] = $v_link_header['filename'];
                    }
                    break;
            }

            // ignore extended / pax headers
            if ($v_header['typeflag'] == 'x' || $v_header['typeflag'] == 'g') {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
                continue;
            }

            if ((!$v_extract_all) && (is_array($p_file_list))) {
                // ----- By default no unzip if the file is not found
                $v_extract_file = false;

                for ($i = 0; $i < sizeof($p_file_list); $i++) {
                    // ----- Look if it is a directory
                    if (substr($p_file_list[$i], -1) == '/') {
                        // ----- Look if the directory is in the filename path
                        if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
                            && (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
                                == $p_file_list[$i])
                        ) {
                            $v_extract_file = true;
                            break;
                        }
                    } // ----- It is a file, so compare the file names
                    elseif ($p_file_list[$i] == $v_header['filename']) {
                        $v_extract_file = true;
                        break;
                    }
                }
            } else {
                $v_extract_file = true;
            }

            // ----- Look if this file need to be extracted
            if (($v_extract_file) && (!$v_listing)) {
                if (($p_remove_path != '')
                    && (substr($v_header['filename'] . '/', 0, $p_remove_path_size)
                        == $p_remove_path)
                ) {
                    $v_header['filename'] = substr(
                        $v_header['filename'],
                        $p_remove_path_size
                    );
                    if ($v_header['filename'] == '') {
                        continue;
                    }
                }
                if (($p_path != './') && ($p_path != '/')) {
                    while (substr($p_path, -1) == '/') {
                        $p_path = substr($p_path, 0, strlen($p_path) - 1);
                    }

                    if (substr($v_header['filename'], 0, 1) == '/') {
                        $v_header['filename'] = $p_path . $v_header['filename'];
                    } else {
                        $v_header['filename'] = $p_path . '/' . $v_header['filename'];
                    }
                }
                if (file_exists($v_header['filename'])) {
                    if ((@is_dir($v_header['filename']))
                        && ($v_header['typeflag'] == '')
                    ) {
                        $this->_error(
                            'File ' . $v_header['filename']
                            . ' already exists as a directory'
                        );
                        return false;
                    }
                    if (($this->_isArchive($v_header['filename']))
                        && ($v_header['typeflag'] == "5")
                    ) {
                        $this->_error(
                            'Directory ' . $v_header['filename']
                            . ' already exists as a file'
                        );
                        return false;
                    }
                    if (!is_writeable($v_header['filename'])) {
                        $this->_error(
                            'File ' . $v_header['filename']
                            . ' already exists and is write protected'
                        );
                        return false;
                    }
                    if (filemtime($v_header['filename']) > $v_header['mtime']) {
                        // To be completed : An error or silent no replace ?
                    }
                } // ----- Check the directory availability and create it if necessary
                elseif (($v_result
                        = $this->_dirCheck(
                        ($v_header['typeflag'] == "5"
                            ? $v_header['filename']
                            : dirname($v_header['filename']))
                    )) != 1
                ) {
                    $this->_error('Unable to create path for ' . $v_header['filename']);
                    return false;
                }

                if ($v_extract_file) {
                    if ($v_header['typeflag'] == "5") {
                        if (!@file_exists($v_header['filename'])) {
                            if (!@mkdir($v_header['filename'], 0777)) {
                                $this->_error(
                                    'Unable to create directory {'
                                    . $v_header['filename'] . '}'
                                );
                                return false;
                            }
                        }
                    } elseif ($v_header['typeflag'] == "2") {
                        if (!$p_symlinks) {
                            $this->_warning('Symbolic links are not allowed. '
                                . 'Unable to extract {'
                                . $v_header['filename'] . '}'
                            );
                            return false;
                        }
                        $absolute_link = FALSE;
                        $link_depth = 0;
                        if (strpos($v_header['link'], "/") === 0 || strpos($v_header['link'], ':') !== FALSE) {
                          $absolute_link = TRUE;
                        }
                        else {
                            $s_filename = preg_replace('@^' . preg_quote($p_path) . '@', "", $v_header['filename']);
                            $s_linkname = str_replace('\\', '/', $v_header['link']);
                            foreach (explode("/", $s_filename) as $dir) {
                                if ($dir === "..") {
                                    $link_depth--;
                                } elseif ($dir !== "" && $dir !== "." ) {
                                    $link_depth++;
                                }
                            }
                            foreach (explode("/", $s_linkname) as $dir){
                                if ($link_depth <= 0) {
                                    break;
                                }
                                if ($dir === "..") {
                                    $link_depth--;
                                } elseif ($dir !== "" && $dir !== ".") {
                                    $link_depth++;
                                }
                            }
                        }
                        if ($absolute_link || $link_depth <= 0) {
                            $this->_error(
                                 'Out-of-path file extraction {'
                                 . $v_header['filename'] . ' --> ' .
                                 $v_header['link'] . '}'
                            );
                            return false;
                        }
                        if (@file_exists($v_header['filename'])) {
                            @unlink($v_header['filename']);
                        }
                        if (!@symlink($v_header['link'], $v_header['filename'])) {
                            $this->_error(
                                'Unable to extract symbolic link {'
                                . $v_header['filename'] . '}'
                            );
                            return false;
                        }
                    } else {
                        if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
                            $this->_error(
                                'Error while opening {' . $v_header['filename']
                                . '} in write binary mode'
                            );
                            return false;
                        } else {
                            $n = floor($v_header['size'] / 512);
                            for ($i = 0; $i < $n; $i++) {
                                $v_content = $this->_readBlock();
                                fwrite($v_dest_file, $v_content, 512);
                            }
                            if (($v_header['size'] % 512) != 0) {
                                $v_content = $this->_readBlock();
                                fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
                            }

                            @fclose($v_dest_file);

                            if ($p_preserve) {
                                @chown($v_header['filename'], $v_header['uid']);
                                @chgrp($v_header['filename'], $v_header['gid']);
                            }

                            // ----- Change the file mode, mtime
                            @touch($v_header['filename'], $v_header['mtime']);
                            if ($v_header['mode'] & 0111) {
                                // make file executable, obey umask
                                $mode = fileperms($v_header['filename']) | (~umask() & 0111);
                                @chmod($v_header['filename'], $mode);
                            }
                        }

                        // ----- Check the file size
                        clearstatcache();
                        if (!is_file($v_header['filename'])) {
                            $this->_error(
                                'Extracted file ' . $v_header['filename']
                                . 'does not exist. Archive may be corrupted.'
                            );
                            return false;
                        }

                        $filesize = filesize($v_header['filename']);
                        if ($filesize != $v_header['size']) {
                            $this->_error(
                                'Extracted file ' . $v_header['filename']
                                . ' does not have the correct file size \''
                                . $filesize
                                . '\' (' . $v_header['size']
                                . ' expected). Archive may be corrupted.'
                            );
                            return false;
                        }
                    }
                } else {
                    $this->_jumpBlock(ceil(($v_header['size'] / 512)));
                }
            } else {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
            }

            /* TBC : Seems to be unused ...
            if ($this->_compress)
              $v_end_of_file = @gzeof($this->_file);
            else
              $v_end_of_file = @feof($this->_file);
              */

            if ($v_listing || $v_extract_file || $v_extraction_stopped) {
                // ----- Log extracted files
                if (($v_file_dir = dirname($v_header['filename']))
                    == $v_header['filename']
                ) {
                    $v_file_dir = '';
                }
                if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) {
                    $v_file_dir = '/';
                }

                $p_list_detail[$v_nb++] = $v_header;
                if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
                    return true;
                }
            }
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openAppend()
    {
        if (filesize($this->_tarname) == 0) {
            return $this->_openWrite();
        }

        if ($this->_compress) {
            $this->_close();

            if (!@rename($this->_tarname, $this->_tarname . ".tmp")) {
                $this->_error(
                    'Error while renaming \'' . $this->_tarname
                    . '\' to temporary file \'' . $this->_tarname
                    . '.tmp\''
                );
                return false;
            }

            if ($this->_compress_type == 'gz') {
                $v_temp_tar = @gzopen($this->_tarname . ".tmp", "rb");
            } elseif ($this->_compress_type == 'bz2') {
                $v_temp_tar = @bzopen($this->_tarname . ".tmp", "r");
            } elseif ($this->_compress_type == 'lzma2') {
                $v_temp_tar = @xzopen($this->_tarname . ".tmp", "r");
            }


            if ($v_temp_tar == 0) {
                $this->_error(
                    'Unable to open file \'' . $this->_tarname
                    . '.tmp\' in binary read mode'
                );
                @rename($this->_tarname . ".tmp", $this->_tarname);
                return false;
            }

            if (!$this->_openWrite()) {
                @rename($this->_tarname . ".tmp", $this->_tarname);
                return false;
            }

            if ($this->_compress_type == 'gz') {
                $end_blocks = 0;

                while (!@gzeof($v_temp_tar)) {
                    $v_buffer = @gzread($v_temp_tar, 512);
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @gzclose($v_temp_tar);
            } elseif ($this->_compress_type == 'bz2') {
                $end_blocks = 0;

                while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @bzclose($v_temp_tar);
            } elseif ($this->_compress_type == 'lzma2') {
                $end_blocks = 0;

                while (strlen($v_buffer = @xzread($v_temp_tar, 512)) > 0) {
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @xzclose($v_temp_tar);
            }

            if (!@unlink($this->_tarname . ".tmp")) {
                $this->_error(
                    'Error while deleting temporary file \''
                    . $this->_tarname . '.tmp\''
                );
            }
        } else {
            // ----- For not compressed tar, just add files before the last
            //       one or two 512 bytes block
            if (!$this->_openReadWrite()) {
                return false;
            }

            clearstatcache();
            $v_size = filesize($this->_tarname);

            // We might have zero, one or two end blocks.
            // The standard is two, but we should try to handle
            // other cases.
            fseek($this->_file, $v_size - 1024);
            if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
                fseek($this->_file, $v_size - 1024);
            } elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
                fseek($this->_file, $v_size - 512);
            }
        }

        return true;
    }

    /**
     * @param $p_filelist
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @return bool
     */
    public function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '')
    {
        if (!$this->_openAppend()) {
            return false;
        }

        if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) {
            $this->_writeFooter();
        }

        $this->_close();

        return true;
    }

    /**
     * Check if a directory exists and create it (including parent
     * dirs) if not.
     *
     * @param string $p_dir directory to check
     *
     * @return bool true if the directory exists or was created
     */
    public function _dirCheck($p_dir)
    {
        clearstatcache();
        if ((@is_dir($p_dir)) || ($p_dir == '')) {
            return true;
        }

        $p_parent_dir = dirname($p_dir);

        if (($p_parent_dir != $p_dir) &&
            ($p_parent_dir != '') &&
            (!$this->_dirCheck($p_parent_dir))
        ) {
            return false;
        }

        if (!@mkdir($p_dir, 0777)) {
            $this->_error("Unable to create directory '$p_dir'");
            return false;
        }

        return true;
    }

    /**
     * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
     * rand emove double slashes.
     *
     * @param string $p_dir path to reduce
     *
     * @return string reduced path
     */
    private function _pathReduction($p_dir)
    {
        $v_result = '';

        // ----- Look for not empty path
        if ($p_dir != '') {
            // ----- Explode path by directory names
            $v_list = explode('/', $p_dir);

            // ----- Study directories from last to first
            for ($i = sizeof($v_list) - 1; $i >= 0; $i--) {
                // ----- Look for current path
                if ($v_list[$i] == ".") {
                    // ----- Ignore this directory
                    // Should be the first $i=0, but no check is done
                } else {
                    if ($v_list[$i] == "..") {
                        // ----- Ignore it and ignore the $i-1
                        $i--;
                    } else {
                        if (($v_list[$i] == '')
                            && ($i != (sizeof($v_list) - 1))
                            && ($i != 0)
                        ) {
                            // ----- Ignore only the double '//' in path,
                            // but not the first and last /
                        } else {
                            $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? '/'
                                    . $v_result : '');
                        }
                    }
                }
            }
        }

        if (defined('OS_WINDOWS') && OS_WINDOWS) {
            $v_result = strtr($v_result, '\\', '/');
        }

        return $v_result;
    }

    /**
     * @param $p_path
     * @param bool $p_remove_disk_letter
     * @return string
     */
    public function _translateWinPath($p_path, $p_remove_disk_letter = true)
    {
        if (defined('OS_WINDOWS') && OS_WINDOWS) {
            // ----- Look for potential disk letter
            if (($p_remove_disk_letter)
                && (($v_position = strpos($p_path, ':')) != false)
            ) {
                $p_path = substr($p_path, $v_position + 1);
            }
            // ----- Change potential windows directory separator
            if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) {
                $p_path = strtr($p_path, '\\', '/');
            }
        }
        return $p_path;
    }
}
pear/System.php000064400000050326151732707770007516 0ustar00<?php
/**
 * File/Directory manipulation
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    System
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR.php';
require_once 'Console/Getopt.php';

$GLOBALS['_System_temp_files'] = array();

/**
* System offers cross platform compatible system functions
*
* Static functions for different operations. Should work under
* Unix and Windows. The names and usage has been taken from its respectively
* GNU commands. The functions will return (bool) false on error and will
* trigger the error with the PHP trigger_error() function (you can silence
* the error by prefixing a '@' sign after the function call, but this
* is not recommended practice.  Instead use an error handler with
* {@link set_error_handler()}).
*
* Documentation on this class you can find in:
* http://pear.php.net/manual/
*
* Example usage:
* if (!@System::rm('-r file1 dir1')) {
*    print "could not delete file1 or dir1";
* }
*
* In case you need to to pass file names with spaces,
* pass the params as an array:
*
* System::rm(array('-r', $file1, $dir1));
*
* @category   pear
* @package    System
* @author     Tomas V.V. Cox <cox@idecnet.com>
* @copyright  1997-2006 The PHP Group
* @license    http://opensource.org/licenses/bsd-license.php New BSD License
* @version    Release: 1.10.16
* @link       http://pear.php.net/package/PEAR
* @since      Class available since Release 0.1
* @static
*/
class System
{
    /**
     * returns the commandline arguments of a function
     *
     * @param    string  $argv           the commandline
     * @param    string  $short_options  the allowed option short-tags
     * @param    string  $long_options   the allowed option long-tags
     * @return   array   the given options and there values
     */
    public static function _parseArgs($argv, $short_options, $long_options = null)
    {
        if (!is_array($argv) && $argv !== null) {
            /*
            // Quote all items that are a short option
            $av = preg_split('/(\A| )--?[a-z0-9]+[ =]?((?<!\\\\)((,\s*)|((?<!,)\s+))?)/i', $argv, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
            $offset = 0;
            foreach ($av as $a) {
                $b = trim($a[0]);
                if ($b[0] == '"' || $b[0] == "'") {
                    continue;
                }

                $escape = escapeshellarg($b);
                $pos = $a[1] + $offset;
                $argv = substr_replace($argv, $escape, $pos, strlen($b));
                $offset += 2;
            }
            */

            // Find all items, quoted or otherwise
            preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av);
            $argv = $av[1];
            foreach ($av[2] as $k => $a) {
                if (empty($a)) {
                    continue;
                }
                $argv[$k] = trim($a) ;
            }
        }

        return Console_Getopt::getopt2($argv, $short_options, $long_options);
    }

    /**
     * Output errors with PHP trigger_error(). You can silence the errors
     * with prefixing a "@" sign to the function call: @System::mkdir(..);
     *
     * @param mixed $error a PEAR error or a string with the error message
     * @return bool false
     */
    protected static function raiseError($error)
    {
        if (PEAR::isError($error)) {
            $error = $error->getMessage();
        }
        trigger_error($error, E_USER_WARNING);
        return false;
    }

    /**
     * Creates a nested array representing the structure of a directory
     *
     * System::_dirToStruct('dir1', 0) =>
     *   Array
     *    (
     *    [dirs] => Array
     *        (
     *            [0] => dir1
     *        )
     *
     *    [files] => Array
     *        (
     *            [0] => dir1/file2
     *            [1] => dir1/file3
     *        )
     *    )
     * @param    string  $sPath      Name of the directory
     * @param    integer $maxinst    max. deep of the lookup
     * @param    integer $aktinst    starting deep of the lookup
     * @param    bool    $silent     if true, do not emit errors.
     * @return   array   the structure of the dir
     */
    protected static function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false)
    {
        $struct = array('dirs' => array(), 'files' => array());
        if (($dir = @opendir($sPath)) === false) {
            if (!$silent) {
                System::raiseError("Could not open dir $sPath");
            }
            return $struct; // XXX could not open error
        }

        $struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ?
        $list = array();
        while (false !== ($file = readdir($dir))) {
            if ($file != '.' && $file != '..') {
                $list[] = $file;
            }
        }

        closedir($dir);
        natsort($list);
        if ($aktinst < $maxinst || $maxinst == 0) {
            foreach ($list as $val) {
                $path = $sPath . DIRECTORY_SEPARATOR . $val;
                if (is_dir($path) && !is_link($path)) {
                    $tmp    = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent);
                    $struct = array_merge_recursive($struct, $tmp);
                } else {
                    $struct['files'][] = $path;
                }
            }
        }

        return $struct;
    }

    /**
     * Creates a nested array representing the structure of a directory and files
     *
     * @param    array $files Array listing files and dirs
     * @return   array
     * @static
     * @see System::_dirToStruct()
     */
    protected static function _multipleToStruct($files)
    {
        $struct = array('dirs' => array(), 'files' => array());
        settype($files, 'array');
        foreach ($files as $file) {
            if (is_dir($file) && !is_link($file)) {
                $tmp    = System::_dirToStruct($file, 0);
                $struct = array_merge_recursive($tmp, $struct);
            } else {
                if (!in_array($file, $struct['files'])) {
                    $struct['files'][] = $file;
                }
            }
        }
        return $struct;
    }

    /**
     * The rm command for removing files.
     * Supports multiple files and dirs and also recursive deletes
     *
     * @param    string  $args   the arguments for rm
     * @return   mixed   PEAR_Error or true for success
     * @static
     * @access   public
     */
    public static function rm($args)
    {
        $opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-)
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }
        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'r') {
                $do_recursive = true;
            }
        }
        $ret = true;
        if (isset($do_recursive)) {
            $struct = System::_multipleToStruct($opts[1]);
            foreach ($struct['files'] as $file) {
                if (!@unlink($file)) {
                    $ret = false;
                }
            }

            rsort($struct['dirs']);
            foreach ($struct['dirs'] as $dir) {
                if (!@rmdir($dir)) {
                    $ret = false;
                }
            }
        } else {
            foreach ($opts[1] as $file) {
                $delete = (is_dir($file)) ? 'rmdir' : 'unlink';
                if (!@$delete($file)) {
                    $ret = false;
                }
            }
        }
        return $ret;
    }

    /**
     * Make directories.
     *
     * The -p option will create parent directories
     * @param    string  $args    the name of the director(y|ies) to create
     * @return   bool    True for success
     */
    public static function mkDir($args)
    {
        $opts = System::_parseArgs($args, 'pm:');
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }

        $mode = 0777; // default mode
        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'p') {
                $create_parents = true;
            } elseif ($opt[0] == 'm') {
                // if the mode is clearly an octal number (starts with 0)
                // convert it to decimal
                if (strlen($opt[1]) && $opt[1][0] == '0') {
                    $opt[1] = octdec($opt[1]);
                } else {
                    // convert to int
                    $opt[1] += 0;
                }
                $mode = $opt[1];
            }
        }

        $ret = true;
        if (isset($create_parents)) {
            foreach ($opts[1] as $dir) {
                $dirstack = array();
                while ((!file_exists($dir) || !is_dir($dir)) &&
                        $dir != DIRECTORY_SEPARATOR) {
                    array_unshift($dirstack, $dir);
                    $dir = dirname($dir);
                }

                while ($newdir = array_shift($dirstack)) {
                    if (!is_writeable(dirname($newdir))) {
                        $ret = false;
                        break;
                    }

                    if (!mkdir($newdir, $mode)) {
                        $ret = false;
                    }
                }
            }
        } else {
            foreach($opts[1] as $dir) {
                if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) {
                    $ret = false;
                }
            }
        }

        return $ret;
    }

    /**
     * Concatenate files
     *
     * Usage:
     * 1) $var = System::cat('sample.txt test.txt');
     * 2) System::cat('sample.txt test.txt > final.txt');
     * 3) System::cat('sample.txt test.txt >> final.txt');
     *
     * Note: as the class use fopen, urls should work also
     *
     * @param    string  $args   the arguments
     * @return   boolean true on success
     */
    public static function &cat($args)
    {
        $ret = null;
        $files = array();
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }

        $count_args = count($args);
        for ($i = 0; $i < $count_args; $i++) {
            if ($args[$i] == '>') {
                $mode = 'wb';
                $outputfile = $args[$i+1];
                break;
            } elseif ($args[$i] == '>>') {
                $mode = 'ab+';
                $outputfile = $args[$i+1];
                break;
            } else {
                $files[] = $args[$i];
            }
        }
        $outputfd = false;
        if (isset($mode)) {
            if (!$outputfd = fopen($outputfile, $mode)) {
                $err = System::raiseError("Could not open $outputfile");
                return $err;
            }
            $ret = true;
        }
        foreach ($files as $file) {
            if (!$fd = fopen($file, 'r')) {
                System::raiseError("Could not open $file");
                continue;
            }
            while ($cont = fread($fd, 2048)) {
                if (is_resource($outputfd)) {
                    fwrite($outputfd, $cont);
                } else {
                    $ret .= $cont;
                }
            }
            fclose($fd);
        }
        if (is_resource($outputfd)) {
            fclose($outputfd);
        }
        return $ret;
    }

    /**
     * Creates temporary files or directories. This function will remove
     * the created files when the scripts finish its execution.
     *
     * Usage:
     *   1) $tempfile = System::mktemp("prefix");
     *   2) $tempdir  = System::mktemp("-d prefix");
     *   3) $tempfile = System::mktemp();
     *   4) $tempfile = System::mktemp("-t /var/tmp prefix");
     *
     * prefix -> The string that will be prepended to the temp name
     *           (defaults to "tmp").
     * -d     -> A temporary dir will be created instead of a file.
     * -t     -> The target dir where the temporary (file|dir) will be created. If
     *           this param is missing by default the env vars TMP on Windows or
     *           TMPDIR in Unix will be used. If these vars are also missing
     *           c:\windows\temp or /tmp will be used.
     *
     * @param   string  $args  The arguments
     * @return  mixed   the full path of the created (file|dir) or false
     * @see System::tmpdir()
     */
    public static function mktemp($args = null)
    {
        static $first_time = true;
        $opts = System::_parseArgs($args, 't:d');
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }

        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'd') {
                $tmp_is_dir = true;
            } elseif ($opt[0] == 't') {
                $tmpdir = $opt[1];
            }
        }

        $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp';
        if (!isset($tmpdir)) {
            $tmpdir = System::tmpdir();
        }

        if (!System::mkDir(array('-p', $tmpdir))) {
            return false;
        }

        $tmp = tempnam($tmpdir, $prefix);
        if (isset($tmp_is_dir)) {
            unlink($tmp); // be careful possible race condition here
            if (!mkdir($tmp, 0700)) {
                return System::raiseError("Unable to create temporary directory $tmpdir");
            }
        }

        $GLOBALS['_System_temp_files'][] = $tmp;
        if (isset($tmp_is_dir)) {
            //$GLOBALS['_System_temp_files'][] = dirname($tmp);
        }

        if ($first_time) {
            PEAR::registerShutdownFunc(array('System', '_removeTmpFiles'));
            $first_time = false;
        }

        return $tmp;
    }

    /**
     * Remove temporary files created my mkTemp. This function is executed
     * at script shutdown time
     */
    public static function _removeTmpFiles()
    {
        if (count($GLOBALS['_System_temp_files'])) {
            $delete = $GLOBALS['_System_temp_files'];
            array_unshift($delete, '-r');
            System::rm($delete);
            $GLOBALS['_System_temp_files'] = array();
        }
    }

    /**
     * Get the path of the temporal directory set in the system
     * by looking in its environments variables.
     * Note: php.ini-recommended removes the "E" from the variables_order setting,
     * making unavaible the $_ENV array, that s why we do tests with _ENV
     *
     * @return string The temporary directory on the system
     */
    public static function tmpdir()
    {
        if (OS_WINDOWS) {
            if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) {
                return $var;
            }
            if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) {
                return $var;
            }
            if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) {
                return $var;
            }
            if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) {
                return $var;
            }
            return getenv('SystemRoot') . '\temp';
        }
        if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) {
            return $var;
        }
        return realpath(function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : '/tmp');
    }

    /**
     * The "which" command (show the full path of a command)
     *
     * @param string $program The command to search for
     * @param mixed  $fallback Value to return if $program is not found
     *
     * @return mixed A string with the full path or false if not found
     * @author Stig Bakken <ssb@php.net>
     */
    public static function which($program, $fallback = false)
    {
        // enforce API
        if (!is_string($program) || '' == $program) {
            return $fallback;
        }

        // full path given
        if (basename($program) != $program) {
            $path_elements[] = dirname($program);
            $program = basename($program);
        } else {
            $path = getenv('PATH');
            if (!$path) {
                $path = getenv('Path'); // some OSes are just stupid enough to do this
            }

            $path_elements = explode(PATH_SEPARATOR, $path);
        }

        if (OS_WINDOWS) {
            $exe_suffixes = getenv('PATHEXT')
                                ? explode(PATH_SEPARATOR, getenv('PATHEXT'))
                                : array('.exe','.bat','.cmd','.com');
            // allow passing a command.exe param
            if (strpos($program, '.') !== false) {
                array_unshift($exe_suffixes, '');
            }
        } else {
            $exe_suffixes = array('');
        }

        foreach ($exe_suffixes as $suff) {
            foreach ($path_elements as $dir) {
                $file = $dir . DIRECTORY_SEPARATOR . $program . $suff;
                // It's possible to run a .bat on Windows that is_executable
                // would return false for. The is_executable check is meaningless...
                if (OS_WINDOWS) {
                    if (file_exists($file)) {
                        return $file;
                    }
                } else {
                    if (is_executable($file)) {
                        return $file;
                    }
                }
            }
        }
        return $fallback;
    }

    /**
     * The "find" command
     *
     * Usage:
     *
     * System::find($dir);
     * System::find("$dir -type d");
     * System::find("$dir -type f");
     * System::find("$dir -name *.php");
     * System::find("$dir -name *.php -name *.htm*");
     * System::find("$dir -maxdepth 1");
     *
     * Params implemented:
     * $dir            -> Start the search at this directory
     * -type d         -> return only directories
     * -type f         -> return only files
     * -maxdepth <n>   -> max depth of recursion
     * -name <pattern> -> search pattern (bash style). Multiple -name param allowed
     *
     * @param  mixed Either array or string with the command line
     * @return array Array of found files
     */
    public static function find($args)
    {
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }
        $dir = realpath(array_shift($args));
        if (!$dir) {
            return array();
        }
        $patterns = array();
        $depth = 0;
        $do_files = $do_dirs = true;
        $args_count = count($args);
        for ($i = 0; $i < $args_count; $i++) {
            switch ($args[$i]) {
                case '-type':
                    if (in_array($args[$i+1], array('d', 'f'))) {
                        if ($args[$i+1] == 'd') {
                            $do_files = false;
                        } else {
                            $do_dirs = false;
                        }
                    }
                    $i++;
                    break;
                case '-name':
                    $name = preg_quote($args[$i+1], '#');
                    // our magic characters ? and * have just been escaped,
                    // so now we change the escaped versions to PCRE operators
                    $name = strtr($name, array('\?' => '.', '\*' => '.*'));
                    $patterns[] = '('.$name.')';
                    $i++;
                    break;
                case '-maxdepth':
                    $depth = $args[$i+1];
                    break;
            }
        }
        $path = System::_dirToStruct($dir, $depth, 0, true);
        if ($do_files && $do_dirs) {
            $files = array_merge($path['files'], $path['dirs']);
        } elseif ($do_dirs) {
            $files = $path['dirs'];
        } else {
            $files = $path['files'];
        }
        if (count($patterns)) {
            $dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
            $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
            $ret = array();
            $files_count = count($files);
            for ($i = 0; $i < $files_count; $i++) {
                // only search in the part of the file below the current directory
                $filepart = basename($files[$i]);
                if (preg_match($pattern, $filepart)) {
                    $ret[] = $files[$i];
                }
            }
            return $ret;
        }
        return $files;
    }
}
pear/File/MARCXML.php000064400000021226151732707770010211 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2007-2010 Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 * @example   read.php Retrieve specific fields and subfields from a record
 * @example   subfields.php Create new subfields and add them in specific order
 * @example   marc_yaz.php Pretty print a MARC record retrieved through the PECL yaz extension
 */

require_once 'PEAR/Exception.php';
require_once 'File/MARCBASE.php';
require_once 'File/MARC.php';
require_once 'File/MARC/Record.php';
require_once 'File/MARC/Field.php';
require_once 'File/MARC/Control_Field.php';
require_once 'File/MARC/Data_Field.php';
require_once 'File/MARC/Subfield.php';
require_once 'File/MARC/Exception.php';
require_once 'File/MARC/List.php';

// {{{ class File_MARCXML
/**
 * The main File_MARCXML class enables you to return File_MARC_Record
 * objects from an XML stream or string.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARCXML extends File_MARCBASE
{

    // {{{ constants

    /**
     * MARC records retrieved from a file
     */
    const SOURCE_FILE = 1;

    /**
     * MARC records retrieved from a binary string 
     */
    const SOURCE_STRING = 2;
    // }}}

    /**
     * MARC records retrieved from a SimpleXMLElement object
     */
    const SOURCE_SIMPLEXMLELEMENT = 3;
    // }}}

    // {{{ properties
    /**
     * Source containing raw records
     * 
     * @var resource
     */
    protected $source;

    /**
     * Source type (SOURCE_FILE or SOURCE_STRING)
     * 
     * @var int
     */
    protected $type;

    /**
     * Counter for MARCXML records in a collection
     *
     * @var int
     */
    protected $counter;

    /**
     * XMLWriter for writing collections
     * 
     * @var XMLWriter
     */
    protected $xmlwriter;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Read in MARCXML records
     *
     * This function reads in files, strings or SimpleXMLElement objects that
     * contain one or more MARCXML records.
     *
     * <code>
     * <?php
     * // Retrieve MARC records from a file
     * $journals = new File_MARC('journals.mrc', SOURCE_FILE);
     *
     * // Retrieve MARC records from a string (e.g. Z39 query results)
     * $monographs = new File_MARC($raw_marc, SOURCE_STRING);
     *
     * // Retrieve MARCXML records from a string with a namespace URL
     * $records = new File_MARCXML($xml_data, File_MARC::SOURCE_STRING,"http://www.loc.gov/MARC21/slim");
     *
     * // Retrieve MARCXML records from a file with a namespace prefix
     * $records = new File_MARCXML($xml_data, File_MARC::SOURCE_FILE,"marc",true);
     * ?>
     * </code>
     *
     * @param string|SimpleXMLElement $source        Filename, raw MARC string or SimpleXMLElement object
     * @param int                     $type          Source of the input, either SOURCE_FILE, SOURCE_STRING or SOURCE_SIMPLEXMLELEMENT
     * @param string                  $ns            URI or prefix of the namespace
     * @param bool                    $is_prefix     TRUE if $ns is a prefix, FALSE if it's a URI; defaults to FALSE
     * @param string                  $record_class  Record class, defaults to File_MARC_Record
     */
    function __construct($source, $type = self::SOURCE_FILE, $ns = "", $is_prefix = false, $record_class = null)
    {
        parent::__construct($source, $type, $record_class);

        $this->counter = 0;

        if ($source instanceof \SimpleXMLElement) {
            $type = self::SOURCE_SIMPLEXMLELEMENT;
        }

        switch ($type) {

        case self::SOURCE_SIMPLEXMLELEMENT:
            $this->type = self::SOURCE_SIMPLEXMLELEMENT;
            $this->source = $source;
            break;

        case self::SOURCE_FILE:
            $this->type = self::SOURCE_FILE;
            $this->source = simplexml_load_file($source, "SimpleXMLElement", 0, $ns, $is_prefix);
            break;

        case self::SOURCE_STRING:
            $this->type = self::SOURCE_STRING;
            $this->source = simplexml_load_string($source, "SimpleXMLElement", 0, $ns, $is_prefix);
            break;

        default:
            throw new File_MARC_Exception(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_SOURCE], File_MARC_Exception::ERROR_INVALID_SOURCE);
        }

        if (!$this->source) {
            $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_FILE], array('filename' => $source));
            throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_FILE);
        }
    }
    // }}}

    // {{{ next()
    /**
     * Return next {@link File_MARC_Record} object
     *
     * Decodes the next MARCXML record and returns the {@link File_MARC_Record}
     * object.
     * <code>
     * <?php
     * // Retrieve a set of MARCXML records from a file
     * $journals = new File_MARCXML('journals.xml', SOURCE_FILE);
     *
     * // Iterate through the retrieved records
     * while ($record = $journals->next()) {
     *     print $record;
     *     print "\n";
     * }
     *
     * ?>
     * </code>
     *
     * @return File_MARC_Record next record, or false if there are
     * no more records
     */
    function next()
    {
        if (isset($this->source->record[$this->counter])) {
            $record = $this->source->record[$this->counter++];
        } elseif ($this->source->getName() == "record" && $this->counter == 0) {
            $record = $this->source;
            $this->counter++;
        } else {
            return false;
        }

        if ($record) {
            return $this->_decode($record);
        } else {
            return false;
        }
    }
    // }}}

    // {{{ _decode()
    /**
     * Decode a given MARCXML record
     *
     * @param string $text MARCXML record element
     *
     * @return File_MARC_Record Decoded File_MARC_Record object
     */
    private function _decode($text)
    {
        $marc = new $this->record_class($this);

        // Store leader
        $marc->setLeader($text->leader);

        // go through all the control fields
        foreach ($text->controlfield as $controlfield) {
            $controlfieldattributes = $controlfield->attributes();
            $marc->appendField(new File_MARC_Control_Field((string)$controlfieldattributes['tag'], $controlfield));
        }

        // go through all the data fields
        foreach ($text->datafield as $datafield) {
            $datafieldattributes = $datafield->attributes();
            $subfield_data = array();
            foreach ($datafield->subfield as $subfield) {
                $subfieldattributes = $subfield->attributes();
                $subfield_data[] = new File_MARC_Subfield((string)$subfieldattributes['code'], $subfield);
            }
            
            // If the data is invalid, let's just ignore the one field
            try {
                $new_field = new File_MARC_Data_Field((string)$datafieldattributes['tag'], $subfield_data, $datafieldattributes['ind1'], $datafieldattributes['ind2']);
                $marc->appendField($new_field);
            } catch (Exception $e) {
                $marc->addWarning($e->getMessage());
            }
        }

        return $marc;
    }
    // }}}

}
// }}}

pear/File/MARC.php000064400000033573151732707770007640 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2010 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 * @example   read.php Retrieve specific fields and subfields from a record
 * @example   subfields.php Create new subfields and add them in specific order
 * @example   marc_yaz.php Pretty print a MARC record retrieved through the PECL yaz extension
 */

require_once 'PEAR/Exception.php';
require_once 'File/MARCBASE.php';
require_once 'File/MARC/Record.php';
require_once 'File/MARC/Field.php';
require_once 'File/MARC/Control_Field.php';
require_once 'File/MARC/Data_Field.php';
require_once 'File/MARC/Subfield.php';
require_once 'File/MARC/Exception.php';
require_once 'File/MARC/List.php';

// {{{ class File_MARC
/**
 * The main File_MARC class enables you to return File_MARC_Record
 * objects from a stream or string.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC extends File_MARCBASE
{

    // {{{ constants

    /**
     * MARC records retrieved from a file
     */
    const SOURCE_FILE = 1;

    /**
     * MARC records retrieved from a binary string 
     */
    const SOURCE_STRING = 2;

    /**
     * Hexadecimal value for Subfield indicator
     */
    const SUBFIELD_INDICATOR = "\x1F";

    /**
     * Hexadecimal value for End of Field
     */
    const END_OF_FIELD = "\x1E";

    /**
     * Hexadecimal value for End of Record
     */
    const END_OF_RECORD = "\x1D";

    /**
     * Length of the Directory
     */
    const DIRECTORY_ENTRY_LEN = 12;

    /**
     * Length of the Leader
     */
    const LEADER_LEN = 24;

    /**
     * Maximum record length
     */
    const MAX_RECORD_LENGTH = 99999;
    // }}}

    // {{{ properties
    /**
     * Source containing raw records
     * 
     * @var resource
     */
    protected $source;

    /**
     * Source type (SOURCE_FILE or SOURCE_STRING)
     * 
     * @var int
     */
    protected $type;

    /**
     * XMLWriter for writing collections
     * 
     * @var XMLWriter
     */
    protected $xmlwriter;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Read in MARC records
     *
     * This function reads in MARC record files or strings that
     * contain one or more MARC records.
     *
     * <code>
     * <?php
     * // Retrieve MARC records from a file
     * $journals = new File_MARC('journals.mrc', SOURCE_FILE);
     *
     * // Retrieve MARC records from a string (e.g. Z39 query results)
     * $monographs = new File_MARC($raw_marc, SOURCE_STRING);
     * ?>
     * </code>
     *
     * @param string $source        Name of the file, or a raw MARC string
     * @param int    $type          Source of the input, either SOURCE_FILE or SOURCE_STRING
     * @param string $record_class  Record class, defaults to File_MARC_Record
     */
    function __construct($source, $type = self::SOURCE_FILE, $record_class = null)
    {

        parent::__construct($source, $type, $record_class);

        switch ($type) {

        case self::SOURCE_FILE:
            $this->type = self::SOURCE_FILE;
            $this->source = fopen($source, 'rb');
            if (!$this->source) {
                 $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_FILE], array('filename' => $source));
                 throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_FILE);
            }
            break;

        case self::SOURCE_STRING:
            $this->type = self::SOURCE_STRING;
            $this->source = explode(File_MARC::END_OF_RECORD, $source);
            break;

        default:
            throw new File_MARC_Exception(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_SOURCE], File_MARC_Exception::ERROR_INVALID_SOURCE);
        }
    }
    // }}}

    // {{{ nextRaw()
    /**
     * Return the next raw MARC record
     *
     * Returns the next raw MARC record, unless all records already have
     * been read.
     *
     * @return string Either a raw record or false
     */
    function nextRaw()
    {
        if ($this->type == self::SOURCE_FILE) {
            $record = stream_get_line($this->source, File_MARC::MAX_RECORD_LENGTH, File_MARC::END_OF_RECORD);

            // Remove illegal stuff that sometimes occurs between records
            $record = preg_replace('/^[\\x0a\\x0d\\x00]+/', "", $record);

        } elseif ($this->type == self::SOURCE_STRING) {
            $record = array_shift($this->source);
        }

        // Exit if we are at the end of the file
        if (!$record) {
            return false;
        }

        // Append the end of record we lost during stream_get_line() or explode()
        $record .= File_MARC::END_OF_RECORD;
        return $record;
    }
    // }}}

    // {{{ next()
    /**
     * Return next {@link File_MARC_Record} object
     *
     * Decodes the next raw MARC record and returns the {@link File_MARC_Record}
     * object.
     * <code>
     * <?php
     * // Retrieve a set of MARC records from a file
     * $journals = new File_MARC('journals.mrc', SOURCE_FILE);
     *
     * // Iterate through the retrieved records
     * while ($record = $journals->next()) {
     *     print $record;
     *     print "\n";
     * }
     *
     * ?>
     * </code>
     *
     * @return File_MARC_Record next record, or false if there are
     * no more records
     */
    function next()
    {
        $raw = $this->nextRaw();
        if ($raw) {
            return $this->_decode($raw);
        } else {
            return false;
        }
    }
    // }}}

    // {{{ _decode()
    /**
     * Decode a given raw MARC record
     *
     * Port of Andy Lesters MARC::File::USMARC->decode() Perl function into PHP.
     *
     * @param string $text Raw MARC record
     *
     * @return File_MARC_Record Decoded File_MARC_Record object
     */
    private function _decode($text)
    {
        $marc = new $this->record_class($this);

        // fallback on the actual byte length
        $record_length = strlen($text);

        $matches = array();
        if (preg_match("/^(\d{5})/", $text, $matches)) {
            // Store record length
            $record_length = $matches[1];
            if ($record_length != strlen($text)) {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INCORRECT_LENGTH], array("record_length" => $record_length, "actual" => strlen($text))));
                // Real beats declared byte length
                $record_length = strlen($text);
            }
        } else {
            $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_NONNUMERIC_LENGTH], array("record_length" => substr($text, 0, 5))));
        }

        if (substr($text, -1, 1) != File_MARC::END_OF_RECORD)
             throw new File_MARC_Exception(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_TERMINATOR], File_MARC_Exception::ERROR_INVALID_TERMINATOR);

        // Store leader
        $marc->setLeader(substr($text, 0, File_MARC::LEADER_LEN));

        // bytes 12 - 16 of leader give offset to the body of the record
        $data_start = 0 + substr($text, 12, 5);

        // immediately after the leader comes the directory (no separator)
        $dir = substr($text, File_MARC::LEADER_LEN, $data_start - File_MARC::LEADER_LEN - 1);  // -1 to allow for \x1e at end of directory

        // character after the directory must be \x1e
        if (substr($text, $data_start-1, 1) != File_MARC::END_OF_FIELD) {
            $marc->addWarning(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_NO_DIRECTORY]);
        }

        // All directory entries 12 bytes long, so length % 12 must be 0
        if (strlen($dir) % File_MARC::DIRECTORY_ENTRY_LEN != 0) {
            $marc->addWarning(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_DIRECTORY_LENGTH]);
        }

        // go through all the fields
        $nfields = strlen($dir) / File_MARC::DIRECTORY_ENTRY_LEN;
        for ($n=0; $n<$nfields; $n++) {
            // As pack returns to key 1, leave place 0 in list empty
            list(, $tag) = unpack("A3", substr($dir, $n*File_MARC::DIRECTORY_ENTRY_LEN, File_MARC::DIRECTORY_ENTRY_LEN));
            list(, $len) = unpack("A3/A4", substr($dir, $n*File_MARC::DIRECTORY_ENTRY_LEN, File_MARC::DIRECTORY_ENTRY_LEN));
            list(, $offset) = unpack("A3/A4/A5", substr($dir, $n*File_MARC::DIRECTORY_ENTRY_LEN, File_MARC::DIRECTORY_ENTRY_LEN));

            // Check directory validity
            if (!preg_match("/^[0-9A-Za-z]{3}$/", $tag)) {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_DIRECTORY_TAG], array("tag" => $tag)));
            }
            if (!preg_match("/^\d{4}$/", $len)) {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_DIRECTORY_TAG_LENGTH], array("tag" => $tag, "len" => $len)));
            }
            if (!preg_match("/^\d{5}$/", $offset)) {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_DIRECTORY_OFFSET], array("tag" => $tag, "offset" => $offset)));
            }
            if ($offset + $len > $record_length) {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_DIRECTORY], array("tag" => $tag)));
            }

            $tag_data = substr($text, $data_start + $offset, $len);

            if (substr($tag_data, -1, 1) == File_MARC::END_OF_FIELD) {
                /* get rid of the end-of-tag character */
                $tag_data = substr($tag_data, 0, -1);
                $len--;
            } else {
                $marc->addWarning(File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_FIELD_EOF], array("tag" => $tag)));
            }

            if (preg_match("/^\d+$/", $tag) and ($tag < 10)) {
                $marc->appendField(new File_MARC_Control_Field($tag, $tag_data));
            } else {
                $subfields = explode(File_MARC::SUBFIELD_INDICATOR, $tag_data);
                $indicators = array_shift($subfields);

                if (strlen($indicators) != 2) {
                    $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_INDICATORS], array("tag" => $tag, "indicators" => $indicators));
                    $marc->addWarning($errorMessage);
                    // Do the best with the indicators we've got
                    if (strlen($indicators) == 1) {
                        $ind1 = $indicators;
                        $ind2 = " ";
                    } else {
                        list($ind1,$ind2) = array(" ", " ");
                    }
                } else {
                    $ind1 = substr($indicators, 0, 1);
                    $ind2 = substr($indicators, 1, 1);
                }

                // Split the subfield data into subfield name and data pairs
                $subfield_data = array();
                foreach ($subfields as $subfield) {
                    if (strlen($subfield) > 0) {
                        $subfield_data[] = new File_MARC_Subfield(substr($subfield, 0, 1), substr($subfield, 1));
                    } else {
                         $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_EMPTY_SUBFIELD], array("tag" => $tag));
                         $marc->addWarning($errorMessage);
                    }
                }

                if (!isset($subfield_data)) {
                     $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_EMPTY_SUBFIELD], array("tag" => $tag));
                     $marc->addWarning($errorMessage);
                }


                // If the data is invalid, let's just ignore the one field
                try {
                    $new_field = new File_MARC_Data_Field($tag, $subfield_data, $ind1, $ind2);
                    $marc->appendField($new_field);
                } catch (Exception $e) {
                    $marc->addWarning($e->getMessage());
                }
            }
        }

        return $marc;
    }
    // }}}

}
// }}}

pear/File/MARC/Lint.php000064400000434713151732707770010547 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Lint for MARC records
 *
 * This module is adapted from the MARC::Lint CPAN module for Perl, maintained by
 * Bryan Baldus <eijabb@cpan.org> and available at http://search.cpan.org/~eijabb/
 *
 * Current MARC::Lint version used as basis for this module: 1.52
 *
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Demian Katz <demian.katz@villanova.edu>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2019 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id: Record.php 308146 2011-02-08 20:36:20Z dbs $
 * @link      http://pear.php.net/package/File_MARC
 */
require_once 'File/MARC/Lint/CodeData.php';
require_once 'Validate/ISPN.php';

// {{{ class File_MARC_Lint
/**
 * Class for testing validity of MARC records against MARC21 standard.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Demian Katz <demian.katz@villanova.edu>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Lint
{

    // {{{ properties
    /**
     * Rules used for testing records
     * @var array
     */
    protected $rules;

    /**
     * A File_MARC_Lint_CodeData object for validating codes
     * @var File_MARC_Lint_CodeData
     */
    protected $data;

    /**
     * A Validate_ISPN object for validating ISBN numbers
     * @var Validate_ISPN
     */
    protected $validateIspn;

    /**
     * Warnings generated during analysis
     * @var array
     */
    protected $warnings = array();

    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Start function
     *
     * Set up rules for testing MARC records.
     *
     * @return true
     */
    public function __construct()
    {
        $this->parseRules();
        $this->data = new File_MARC_Lint_CodeData();
        $this->validateIspn = new Validate_ISPN();
    }
    // }}}

    // {{{ getWarnings()
    /**
     * Check the provided MARC record and return an array of warning messages.
     *
     * @param File_MARC_Record $marc Record to check
     *
     * @return array
     */
    public function checkRecord($marc)
    {
        // Reset warnings:
        $this->warnings = array();

        // Fail if we didn't get a valid object:
        if (!is_a($marc, 'File_MARC_Record')) {
            $this->warn('Must pass a File_MARC_Record object to checkRecord');
        } else {
            $this->checkDuplicate1xx($marc);
            $this->checkMissing245($marc);
            $this->standardFieldChecks($marc);
        }

        return $this->warnings;
    }
    // }}}

    // {{{ warn()
    /**
     * Add a warning.
     *
     * @param string $warning Warning to add
     *
     * @return void
     */
    protected function warn($warning)
    {
        $this->warnings[] = $warning;
    }
    // }}}

    // {{{ checkDuplicate1xx()
    /**
     * Check for multiple 1xx fields.
     *
     * @param File_MARC_Record $marc Record to check
     *
     * @return void
     */
    protected function checkDuplicate1xx($marc)
    {
        $result = $marc->getFields('1[0-9][0-9]', true);
        $count = count($result);
        if ($count > 1) {
            $this->warn(
                "1XX: Only one 1XX tag is allowed, but I found $count of them."
            );
        }
    }
    // }}}

    // {{{ checkMissing245()
    /**
     * Check for missing 245 field.
     *
     * @param File_MARC_Record $marc Record to check
     *
     * @return void
     */
    protected function checkMissing245($marc)
    {
        $result = $marc->getFields('245');
        if (count($result) == 0) {
            $this->warn('245: No 245 tag.');
        }
    }
    // }}}

    // {{{ standardFieldChecks()
    /**
     * Check all fields against the standard rules encoded in the class.
     *
     * @param File_MARC_Record $marc Record to check
     *
     * @return void
     */
    protected function standardFieldChecks($marc)
    {
        $fieldsSeen = array();
        foreach ($marc->getFields() as $current) {
            $tagNo = $current->getTag();
            // if 880 field, inherit rules from tagno in subfield _6
            if ($tagNo == 880) {
                if ($sub6 = $current->getSubfield(6)) {
                    $tagNo = substr($sub6->getData(), 0, 3);
                    $tagrules = isset($this->rules[$tagNo])
                        ? $this->rules[$tagNo] : null;
                    // 880 is repeatable, but its linked field may not be
                    if (isset($tagrules['repeatable'])
                        && $tagrules['repeatable'] == 'NR'
                        && isset($fieldsSeen['880.'.$tagNo])
                    ) {
                        $this->warn("$tagNo: Field is not repeatable.");
                    }
                    $fieldsSeen['880.'.$tagNo] = isset($fieldsSeen['880.'.$tagNo])
                        ? $fieldsSeen['880.'.$tagNo] + 1 : 1;
                } else {
                    $this->warn("880: No subfield 6.");
                    $tagRules = null;
                }
            } else {
                // Default case -- not an 880 field:
                $tagrules = isset($this->rules[$tagNo])
                    ? $this->rules[$tagNo] : null;
                if (isset($tagrules['repeatable']) && $tagrules['repeatable'] == 'NR'
                    && isset($fieldsSeen[$tagNo])
                ) {
                    $this->warn("$tagNo: Field is not repeatable.");
                }
                $fieldsSeen[$tagNo] = isset($fieldsSeen[$tagNo])
                    ? $fieldsSeen[$tagNo] + 1 : 1;
            }

            // Treat data fields differently from control fields:
            if (intval(ltrim($tagNo, '0')) >= 10) {
                if (!empty($tagrules)) {
                    $this->checkIndicators($tagNo, $current, $tagrules);
                    $this->checkSubfields($tagNo, $current, $tagrules);
                }
            } else {
                // Control field:
                if (strstr($current->toRaw(), chr(hexdec('1F')))) {
                    $this->warn(
                        "$tagNo: Subfields are not allowed in fields lower than 010"
                    );
                }
            }

            // Check to see if a checkxxx() function exists, and call it on the
            // field if it does
            $method = 'check' . $tagNo;
            if (method_exists($this, $method)) {
                $this->$method($current);
            }
        }
    }
    // }}}

    // {{{ checkIndicators()
    /**
     * Check the indicators for the provided field.
     *
     * @param string          $tagNo Tag number being checked
     * @param File_MARC_Field $field Field to check
     * @param array           $rules Rules to use for checking
     *
     * @return void
     */
    protected function checkIndicators($tagNo, $field, $rules)
    {
        for ($i = 1; $i <= 2; $i++) {
            $ind = $field->getIndicator($i);
            if ($ind === false || $ind == ' ') {
                $ind = 'b';
            }
            if (!strstr($rules['ind' . $i]['values'], $ind)) {
                // Make indicator blank value human-readable for message:
                if ($ind == 'b') {
                    $ind = 'blank';
                }
                $this->warn(
                    "$tagNo: Indicator $i must be "
                    . $rules['ind' . $i]['hr_values']
                    . " but it's \"$ind\""
                );
            }
        }
    }
    // }}}

    // {{{ checkSubfields()
    /**
     * Check the subfields for the provided field.
     *
     * @param string          $tagNo Tag number being checked
     * @param File_MARC_Field $field Field to check
     * @param array           $rules Rules to use for checking
     *
     * @return void
     */
    protected function checkSubfields($tagNo, $field, $rules)
    {
        $subSeen = array();

        foreach ($field->getSubfields() as $current) {
            $code = $current->getCode();
            $data = $current->getData();

            $subrules = isset($rules['sub' . $code])
                ? $rules['sub' . $code] : null;

            if (empty($subrules)) {
                $this->warn("$tagNo: Subfield _$code is not allowed.");
            } elseif ($subrules['repeatable'] == 'NR' && isset($subSeen[$code])) {
                $this->warn("$tagNo: Subfield _$code is not repeatable.");
            }

            if (preg_match('/\r|\t|\n/', $data)) {
                $this->warn(
                    "$tagNo: Subfield _$code has an invalid control character"
                );
            }

            $subSeen[$code] = isset($subSeen[$code]) ? $subSeen[$code]++ : 1;
        }
    }
    // }}}

    // {{{ check020()
    /**
     * Looks at 020$a and reports errors if the check digit is wrong.
     * Looks at 020$z and validates number if hyphens are present.
     *
     * @param File_MARC_Field $field Field to check
     *
     * @return void
     */
    protected function check020($field)
    {
        foreach ($field->getSubfields() as $current) {
            $data = $current->getData();
            // remove any hyphens
            $isbn = str_replace('-', '', $data);
            // remove nondigits
            $isbn = preg_replace('/^\D*(\d{9,12}[X\d])\b.*$/', '$1', $isbn);

            if ($current->getCode() == 'a') {
                if ((substr($data, 0, strlen($isbn)) != $isbn)) {
                    $this->warn("020: Subfield a may have invalid characters.");
                }

                // report error if no space precedes a qualifier in subfield a
                if (preg_match('/\(/', $data) && !preg_match('/[X0-9] \(/', $data)) {
                    $this->warn(
                        "020: Subfield a qualifier must be preceded by space, $data."
                    );
                }

                // report error if unable to find 10-13 digit string of digits in
                // subfield 'a'
                if (!preg_match('/(?:^\d{10}$)|(?:^\d{13}$)|(?:^\d{9}X$)/', $isbn)) {
                    $this->warn(
                        "020: Subfield a has the wrong number of digits, $data."
                    );
                } else {
                    if (strlen($isbn) == 10) {
                        if (!$this->validateIspn->isbn10($isbn)) {
                            $this->warn("020: Subfield a has bad checksum, $data.");
                        }
                    } else if (strlen($isbn) == 13) {
                        if (!$this->validateIspn->isbn13($isbn)) {
                            $this->warn(
                                "020: Subfield a has bad checksum (13 digit), $data."
                            );
                        }
                    }
                }
            } else if ($current->getCode() == 'z') {
                // look for valid isbn in 020$z
                if (preg_match('/^ISBN/', $data)
                    || preg_match('/^\d*\-\d+/', $data)
                ) {
                    // ##################################################
                    // ## Turned on for now--Comment to unimplement  ####
                    // ##################################################
                    if ((strlen($isbn) == 10)
                        && ($this->validateIspn->isbn10($isbn) == 1)
                    ) {
                        $this->warn("020:  Subfield z is numerically valid.");
                    }
                }
            }
        }
    }
    // }}}

    // {{{ check041()
    /**
     * Warns if subfields are not evenly divisible by 3 unless second indicator is 7
     * (future implementation would ensure that each subfield is exactly 3 characters
     * unless ind2 is 7--since subfields are now repeatable. This is not implemented
     * here due to the large number of records needing to be corrected.). Validates
     * against the MARC Code List for Languages (<http://www.loc.gov/marc/>).
     *
     * @param File_MARC_Field $field Field to check
     *
     * @return void
     */
    protected function check041($field)
    {
        // warn if length of each subfield is not divisible by 3 unless ind2 is 7
        if ($field->getIndicator(2) != '7') {
            foreach ($field->getSubfields() as $sub) {
                $code = $sub->getCode();
                $data = $sub->getData();
                if (strlen($data) % 3 != 0) {
                    $this->warn(
                        "041: Subfield _$code must be evenly divisible by 3 or "
                        . "exactly three characters if ind2 is not 7, ($data)."
                    );
                } else {
                    for ($i = 0; $i < strlen($data); $i += 3) {
                        $chk = substr($data, $i, 3);
                        if (!in_array($chk, $this->data->languageCodes)) {
                            $obs = $this->data->obsoleteLanguageCodes;
                            if (in_array($chk, $obs)) {
                                $this->warn(
                                    "041: Subfield _$code, $data, may be obsolete."
                                );
                            } else {
                                $this->warn(
                                    "041: Subfield _$code, $data ($chk),"
                                    . " is not valid."
                                );
                            }
                        }
                    }
                }
            }
        }
    }
    // }}}

    // {{{ check043()
    /**
     * Warns if each subfield a is not exactly 7 characters. Validates each code
     * against the MARC code list for Geographic Areas (<http://www.loc.gov/marc/>).
     *
     * @param File_MARC_Field $field Field to check
     *
     * @return void
     */
    protected function check043($field)
    {
        foreach ($field->getSubfields('a') as $suba) {
            // warn if length of subfield a is not exactly 7
            $data = $suba->getData();
            if (strlen($data) != 7) {
                $this->warn("043: Subfield _a must be exactly 7 characters, $data");
            } else if (!in_array($data, $this->data->geogAreaCodes)) {
                if (in_array($data, $this->data->obsoleteGeogAreaCodes)) {
                    $this->warn("043: Subfield _a, $data, may be obsolete.");
                } else {
                    $this->warn("043: Subfield _a, $data, is not valid.");
                }
            }
        }
    }
    // }}}

    // {{{ check245()
    /**
     * -Makes sure $a exists (and is first subfield).
     * -Warns if last character of field is not a period
     * --Follows LCRI 1.0C, Nov. 2003 rather than MARC21 rule
     * -Verifies that $c is preceded by / (space-/)
     * -Verifies that initials in $c are not spaced
     * -Verifies that $b is preceded by :;= (space-colon, space-semicolon,
     *  space-equals)
     * -Verifies that $h is not preceded by space unless it is dash-space
     * -Verifies that data of $h is enclosed in square brackets
     * -Verifies that $n is preceded by . (period)
     * --As part of that, looks for no-space period, or dash-space-period
     *  (for replaced elipses)
     * -Verifies that $p is preceded by , (no-space-comma) when following $n and
     *  . (period) when following other subfields.
     * -Performs rudimentary article check of 245 2nd indicator vs. 1st word of
     *  245$a (for manual verification).
     *
     * Article checking is done by internal checkArticle method, which should work
     * for 130, 240, 245, 440, 630, 730, and 830.
     *
     * @param File_MARC_Field $field Field to check
     *
     * @return void
     */
    protected function check245($field)
    {
        if (count($field->getSubfields('a')) == 0) {
            $this->warn("245: Must have a subfield _a.");
        }

        // Convert subfields to array and set flags indicating which subfields are
        // present while we're at it.
        $tmp = $field->getSubfields();
        $hasSubfields = $subfields = array();
        foreach ($tmp as $current) {
            $subfields[] = $current;
            $hasSubfields[$current->getCode()] = true;
        }

        // 245 must end in period (may want to make this less restrictive by allowing
        // trailing spaces)
        // do 2 checks--for final punctuation (MARC21 rule), and for period
        // (LCRI 1.0C, Nov. 2003)
        $lastChar = substr($subfields[count($subfields)-1]->getData(), -1);
        if (!in_array($lastChar, array('.', '?', '!'))) {
            $this->warn("245: Must end with . (period).");
        } else if ($lastChar != '.') {
            $this->warn(
                "245: MARC21 allows ? or ! as final punctuation but LCRI 1.0C, Nov."
                . " 2003 (LCPS 1.7.1 for RDA records), requires period."
            );
        }

        // Check for first subfield
        // subfield a should be first subfield (or 2nd if subfield '6' is present)
        if (isset($hasSubfields['6'])) {
            // make sure there are at least 2 subfields
            if (count($subfields) < 2) {
                $this->warn("245: May have too few subfields.");
            } else {
                $first = $subfields[0]->getCode();
                $second = $subfields[1]->getCode();
                if ($first != '6') {
                    $this->warn("245: First subfield must be _6, but it is $first");
                }
                if ($second != 'a') {
                    $this->warn(
                        "245: First subfield after subfield _6 must be _a, but it "
                        . "is _$second"
                    );
                }
            }
        } else {
            // 1st subfield must be 'a'
            $first = $subfields[0]->getCode();
            if ($first != 'a') {
                $this->warn("245: First subfield must be _a, but it is _$first");
            }
        }
        // End check for first subfield

        // subfield c, if present, must be preceded by /
        // also look for space between initials
        if (isset($hasSubfields['c'])) {
            foreach ($subfields as $i => $current) {
                // 245 subfield c must be preceded by / (space-/)
                if ($current->getCode() == 'c') {
                    if ($i > 0
                        && !preg_match('/\s\/$/', $subfields[$i-1]->getData())
                    ) {
                        $this->warn("245: Subfield _c must be preceded by /");
                    }
                    // 245 subfield c initials should not have space
                    if (preg_match('/\b\w\. \b\w\./', $current->getData())) {
                        $this->warn(
                            "245: Subfield _c initials should not have a space."
                        );
                    }
                    break;
                }
            }
        }

        // each subfield b, if present, should be preceded by :;= (colon, semicolon,
        // or equals sign)
        if (isset($hasSubfields['b'])) {
            // 245 subfield b should be preceded by space-:;= (colon, semicolon, or
            // equals sign)
            foreach ($subfields as $i => $current) {
                if ($current->getCode() == 'b' && $i > 0
                    && !preg_match('/ [:;=]$/', $subfields[$i-1]->getData())
                ) {
                    $this->warn(
                        "245: Subfield _b should be preceded by space-colon, "
                        . "space-semicolon, or space-equals sign."
                    );
                }
            }
        }

        // each subfield h, if present, should be preceded by non-space
        if (isset($hasSubfields['h'])) {
            // 245 subfield h should not be preceded by space
            foreach ($subfields as $i => $current) {
                // report error if subfield 'h' is preceded by space (unless
                // dash-space)
                if ($current->getCode() == 'h') {
                    $prev = $subfields[$i-1]->getData();
                    if ($i > 0 && !preg_match('/(\S$)|(\-\- $)/', $prev)) {
                        $this->warn(
                            "245: Subfield _h should not be preceded by space."
                        );
                    }
                    // report error if subfield 'h' does not start with open square
                    // bracket with a matching close bracket; could have check
                    // against list of valid values here
                    $data = $current->getData();
                    if (!preg_match('/^\[\w*\s*\w*\]/', $data)) {
                        $this->warn(
                            "245: Subfield _h must have matching square brackets,"
                            . " $data."
                        );
                    }
                }
            }
        }

        // each subfield n, if present, must be preceded by . (period)
        if (isset($hasSubfields['n'])) {
            // 245 subfield n must be preceded by . (period)
            foreach ($subfields as $i => $current) {
                // report error if subfield 'n' is not preceded by non-space-period
                // or dash-space-period
                if ($current->getCode() == 'n' && $i > 0) {
                    $prev = $subfields[$i-1]->getData();
                    if (!preg_match('/(\S\.$)|(\-\- \.$)/', $prev)) {
                        $this->warn(
                            "245: Subfield _n must be preceded by . (period)."
                        );
                    }
                }
            }
        }

        // each subfield p, if present, must be preceded by a , (no-space-comma)
        // if it follows subfield n, or by . (no-space-period or
        // dash-space-period) following other subfields
        if (isset($hasSubfields['p'])) {
            // 245 subfield p must be preceded by . (period) or , (comma)
            foreach ($subfields as $i => $current) {
                if ($current->getCode() == 'p' && $i > 0) {
                    $prev = $subfields[$i-1];
                    // case for subfield 'n' being field before this one (allows
                    // dash-space-comma)
                    if ($prev->getCode() == 'n'
                        && !preg_match('/(\S,$)|(\-\- ,$)/', $prev->getData())
                    ) {
                        $this->warn(
                            "245: Subfield _p must be preceded by , (comma) "
                            . "when it follows subfield _n."
                        );
                    } else if ($prev->getCode() != 'n'
                        && !preg_match('/(\S\.$)|(\-\- \.$)/', $prev->getData())
                    ) {
                        $this->warn(
                            "245: Subfield _p must be preceded by . (period)"
                            . " when it follows a subfield other than _n."
                        );
                    }
                }
            }
        }

        // check for invalid 2nd indicator
        $this->checkArticle($field);
    }
    // }}}

    // {{{ checkArticle()
    /**
     * Check of articles is based on code from Ian Hamilton. This version is more
     * limited in that it focuses on English, Spanish, French, Italian and German
     * articles. Certain possible articles have been removed if they are valid
     * English non-articles. This version also disregards 008_language/041 codes
     * and just uses the list of articles to provide warnings/suggestions.
     *
     * source for articles = <http://www.loc.gov/marc/bibliographic/bdapp-e.html>
     *
     * Should work with fields 130, 240, 245, 440, 630, 730, and 830. Reports error
     * if another field is passed in.
     *
     * @param File_MARC_Field $field Field to check
     *
     * @return void
     */
    protected function checkArticle($field)
    {
        // add articles here as needed
        // Some omitted due to similarity with valid words (e.g. the German 'die').
        static $article = array(
            'a' => 'eng glg hun por',
            'an' => 'eng',
            'das' => 'ger',
            'dem' => 'ger',
            'der' => 'ger',
            'ein' => 'ger',
            'eine' => 'ger',
            'einem' => 'ger',
            'einen' => 'ger',
            'einer' => 'ger',
            'eines' => 'ger',
            'el' => 'spa',
            'en' => 'cat dan nor swe',
            'gl' => 'ita',
            'gli' => 'ita',
            'il' => 'ita mlt',
            'l' => 'cat fre ita mlt',
            'la' => 'cat fre ita spa',
            'las' => 'spa',
            'le' => 'fre ita',
            'les' => 'cat fre',
            'lo' => 'ita spa',
            'los' => 'spa',
            'os' => 'por',
            'the' => 'eng',
            'um' => 'por',
            'uma' => 'por',
            'un' => 'cat spa fre ita',
            'una' => 'cat spa ita',
            'une' => 'fre',
            'uno' => 'ita',
        );

        // add exceptions here as needed
        // may want to make keys lowercase
        static $exceptions = array(
            'A & E',
            'A & ',
            'A-',
            'A+',
            'A is ',
            'A isn\'t ',
            'A l\'',
            'A la ',
            'A posteriori',
            'A priori',
            'A to ',
            'El Nino',
            'El Salvador',
            'L is ',
            'L-',
            'La Salle',
            'Las Vegas',
            'Lo cual',
            'Lo mein',
            'Lo que',
            'Los Alamos',
            'Los Angeles',
        );

        // get tagno to determine which indicator to check and for reporting
        $tagNo = $field->getTag();
        // retrieve tagno from subfield 6 if 880 field
        if ($tagNo == '880' && ($sub6 = $field->getSubfield('6'))) {
            $tagNo = substr($sub6->getData(), 0, 3);
        }

        // $ind holds nonfiling character indicator value
        $ind = '';
        // $first_or_second holds which indicator is for nonfiling char value
        $first_or_second = '';
        if (in_array($tagNo, array(130, 630, 730))) {
            $ind = $field->getIndicator(1);
            $first_or_second = '1st';
        } else if (in_array($tagNo, array(240, 245, 440, 830))) {
            $ind = $field->getIndicator(2);
            $first_or_second = '2nd';
        } else {
            $this->warn(
                'Internal error: ' . $tagNo
                . " is not a valid field for article checking\n"
            );
            return;
        }

        if (!is_numeric($ind)) {
            $this->warn($tagNo . ": Non-filing indicator is non-numeric");
            return;
        }

        // get subfield 'a' of the title field
        $titleField = $field->getSubfield('a');
        $title = $titleField ? $titleField->getData() : '';

        // warn about out-of-range skip indicators (note: this feature is an
        // addition to the PHP code; it is not ported directly from MARC::Lint).
        if ($ind > strlen($title)) {
            $this->warn($tagNo . ": Non-filing indicator is out of range");
            return;
        }

        $char1_notalphanum = 0;
        // check for apostrophe, quote, bracket,  or parenthesis, before first word
        // remove if found and add to non-word counter
        while (preg_match('/^["\'\[\(*]/', $title)) {
            $char1_notalphanum++;
            $title = preg_replace('/^["\'\[\(*]/', '', $title);
        }
        // split title into first word + rest on space, parens, bracket, apostrophe,
        // quote, or hyphen
        preg_match('/^([^ \(\)\[\]\'"\-]+)([ \(\)\[\]\'"\-])?(.*)/i', $title, $hits);
        $firstword = isset($hits[1]) ? $hits[1] : '';
        $separator = isset($hits[2]) ? $hits[2] : '';
        $etc = isset($hits[3]) ? $hits[3] : '';

        // get length of first word plus the number of chars removed above plus one
        // for the separator
        $nonfilingchars = strlen($firstword) + $char1_notalphanum + 1;

        // check to see if first word is an exception
        $isan_exception = false;
        foreach ($exceptions as $current) {
            if (substr($title, 0, strlen($current)) == $current) {
                $isan_exception = true;
                break;
            }
        }

        // lowercase chars of $firstword for comparison with article list
        $firstword = strtolower($firstword);

        // see if first word is in the list of articles and not an exception
        $isan_article = !$isan_exception && isset($article[$firstword]);

        // if article then $nonfilingchars should match $ind
        if ($isan_article) {
            // account for quotes, apostrophes, parens, or brackets before 2nd word
            if (strlen($separator) && preg_match('/^[ \(\)\[\]\'"\-]+/', $etc)) {
                while (preg_match('/^[ "\'\[\]\(\)*]/', $etc)) {
                    $nonfilingchars++;
                    $etc = preg_replace('/^[ "\'\[\]\(\)*]/', '', $etc);
                }
            }
            if ($nonfilingchars != $ind) {
                $this->warn(
                    $tagNo . ": First word, $firstword, may be an article, check "
                    . "$first_or_second indicator ($ind)."
                );
            }
        } else {
            // not an article so warn if $ind is not 0
            if ($ind != '0') {
                $this->warn(
                    $tagNo . ": First word, $firstword, does not appear to be an "
                    . "article, check $first_or_second indicator ($ind)."
                );
            }
        }
    }
    // }}}

    // {{{ parseRules()
    /**
     * Support method for constructor to load MARC rules.
     *
     * @return void
     */
    protected function parseRules()
    {
        // Break apart the rule data on line breaks:
        $lines = explode("\n", $this->getRawRules());

        // Each group of data is split by a blank line -- process one group
        // at a time:
        $currentGroup = array();
        foreach ($lines as $currentLine) {
            if (empty($currentLine) && !empty($currentGroup)) {
                $this->processRuleGroup($currentGroup);
                $currentGroup = array();
            } else {
                $currentGroup[] = preg_replace("/\s+/", " ", $currentLine);
            }
        }

        // Still have unprocessed data after the loop?  Handle it now:
        if (!empty($currentGroup)) {
            $this->processRuleGroup($currentGroup);
        }
    }
    // }}}

    // {{{ processRuleGroup()
    /**
     * Support method for parseRules() -- process one group of lines representing
     * a single tag.
     *
     * @param array $rules Rule lines to process
     *
     * @return void
     */
    protected function processRuleGroup($rules)
    {
        // The first line is guaranteed to exist and gives us some basic info:
        list($tag, $repeatable, $description) = explode(' ', $rules[0]);
        $this->rules[$tag] = array(
            'repeatable' => $repeatable,
            'desc' => $description
        );

        // We may or may not have additional details:
        for ($i = 1; $i < count($rules); $i++) {
            list($key, $value, $lineDesc) = explode(' ', $rules[$i] . ' ');
            if (substr($key, 0, 3) == 'ind') {
                // Expand ranges:
                $value = str_replace('0-9', '0123456789', $value);
                $this->rules[$tag][$key] = array(
                    'values' => $value,
                    'hr_values' => $this->getHumanReadableIndicatorValues($value),
                    'desc'=> $lineDesc
                );
            } else {
                if (strlen($key) <= 1) {
                    $this->rules[$tag]['sub' . $key] = array(
                        'repeatable' => $value,
                        'desc' => $lineDesc
                    );
                } elseif (strstr($key, '-')) {
                    list($startKey, $endKey) = explode('-', $key);
                    for ($key = $startKey; $key <= $endKey; $key++) {
                        $this->rules[$tag]['sub' . $key] = array(
                            'repeatable' => $value,
                            'desc' => $lineDesc
                        );
                    }
                }
            }
        }
    }
    // }}}

    // {{{ getHumanReadableIndicatorValues()
    /**
     * Turn a set of indicator rules into a human-readable list.
     *
     * @param string $rules Indicator rules
     *
     * @return string
     */
    protected function getHumanReadableIndicatorValues($rules)
    {
        // No processing needed for blank rule:
        if ($rules == 'blank') {
            return $rules;
        }

        // Create string:
        $string = '';
        $length = strlen($rules);
        for ($i = 0; $i < $length; $i++) {
            $current = substr($rules, $i, 1);
            if ($current == 'b') {
                $current = 'blank';
            }
            $string .= $current;
            if ($length - $i == 2) {
                $string .= ' or ';
            } else if ($length - $i > 2) {
                $string .= ', ';
            }
        }

        return $string;
    }
    // }}}

    // {{{ getRawRules()
    /**
     * Support method for parseRules() -- get the raw rules from MARC::Lint.
     *
     * @return string
     */
    protected function getRawRules()
    {
        // When updating rules, don't forget to escape the dollar signs in the text!
        // It would be simpler to change from HEREDOC to NOWDOC syntax, but that
        // would raise the requirements to PHP 5.3.
        // @codingStandardsIgnoreStart
        return <<<RULES
001     NR      CONTROL NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
        NR      Undefined

002     NR      LOCALLY DEFINED (UNOFFICIAL)
ind1    blank   Undefined
ind2    blank   Undefined
        NR      Undefined

003     NR      CONTROL NUMBER IDENTIFIER
ind1    blank   Undefined
ind2    blank   Undefined
        NR      Undefined

005     NR      DATE AND TIME OF LATEST TRANSACTION
ind1    blank   Undefined
ind2    blank   Undefined
        NR      Undefined

006     R       FIXED-LENGTH DATA ELEMENTS--ADDITIONAL MATERIAL CHARACTERISTICS--GENERAL INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
        R       Undefined

007     R       PHYSICAL DESCRIPTION FIXED FIELD--GENERAL INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
        R       Undefined

008     NR      FIXED-LENGTH DATA ELEMENTS--GENERAL INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
        NR      Undefined

010     NR      LIBRARY OF CONGRESS CONTROL NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      LC control number
b       R       NUCMC control number
z       R       Canceled/invalid LC control number
8       R       Field link and sequence number

013     R       PATENT CONTROL INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Number
b       NR      Country
c       NR      Type of number
d       R       Date
e       R       Status
f       R       Party to document
6       NR      Linkage
8       R       Field link and sequence number

015     R       NATIONAL BIBLIOGRAPHY NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       R       National bibliography number
q       R       Qualifying information
z       R       Canceled/Invalid national bibliography number
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

016     R       NATIONAL BIBLIOGRAPHIC AGENCY CONTROL NUMBER
ind1    b7      National bibliographic agency
ind2    blank   Undefined
a       NR      Record control number
z       R       Canceled or invalid record control number
2       NR      Source
8       R       Field link and sequence number

017     R       COPYRIGHT OR LEGAL DEPOSIT NUMBER
ind1    blank   Undefined
ind2    b8      Undefined
a       R       Copyright or legal deposit number
b       NR      Assigning agency
d       NR      Date
i       NR      Display text
z       R       Canceled/invalid copyright or legal deposit number
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

018     NR      COPYRIGHT ARTICLE-FEE CODE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Copyright article-fee code
6       NR      Linkage
8       R       Field link and sequence number

020     R       INTERNATIONAL STANDARD BOOK NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      International Standard Book Number
c       NR      Terms of availability
q       R       Qualifying information
z       R       Canceled/invalid ISBN
6       NR      Linkage
8       R       Field link and sequence number

022     R       INTERNATIONAL STANDARD SERIAL NUMBER
ind1    b01     Level of international interest
ind2    blank   Undefined
a       NR      International Standard Serial Number
l       NR      ISSN-L
m       R       Canceled ISSN-L
y       R       Incorrect ISSN
z       R       Canceled ISSN
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

024     R       OTHER STANDARD IDENTIFIER
ind1    0123478    Type of standard number or code
ind2    b01     Difference indicator
a       NR      Standard number or code
c       NR      Terms of availability
d       NR      Additional codes following the standard number or code
q       R       Qualifying information
z       R       Canceled/invalid standard number or code
2       NR      Source of number or code
6       NR      Linkage
8       R       Field link and sequence number

025     R       OVERSEAS ACQUISITION NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Overseas acquisition number
8       R       Field link and sequence number

026     R       FINGERPRINT IDENTIFIER
ind1    blank   Undefined
ind2    blank   Undefined
a       R       First and second groups of characters
b       R       Third and fourth groups of characters
c       NR      Date
d       R       Number of volume or part
e       NR      Unparsed fingerprint
2       NR      Source
5       R       Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

027     R       STANDARD TECHNICAL REPORT NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Standard technical report number
q       R       Qualifying information
z       R       Canceled/invalid number
6       NR      Linkage
8       R       Field link and sequence number

028     R       PUBLISHER NUMBER OR DISTRIBUTOR NUMBER
ind1    0123456   Type of publisher number
ind2    0123    Note/added entry controller
a       NR      Publisher or distributor number
b       NR      Source
q       R       Qualifying information
6       NR      Linkage
8       R       Field link and sequence number

030     R       CODEN DESIGNATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      CODEN
z       R       Canceled/invalid CODEN
6       NR      Linkage
8       R       Field link and sequence number

031     R       MUSICAL INCIPITS INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Number of work
b       NR      Number of movement
c       NR      Number of excerpt
d       R       Caption or heading
e       NR      Role
g       NR      Clef
m       NR      Voice/instrument
n       NR      Key signature
o       NR      Time signature
p       NR      Musical notation
q       R       General note
r       NR      Key or mode
s       R       Coded validity note
t       R       Text incipit
u       R       Uniform Resource Identifier
y       R       Link text
z       R       Public note
2       NR      System code
6       NR      Linkage
8       R       Field link and sequence number

032     R       POSTAL REGISTRATION NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Postal registration number
b       NR      Source (agency assigning number)
6       NR      Linkage
8       R       Field link and sequence number

033     R       DATE/TIME AND PLACE OF AN EVENT
ind1    b012    Type of date in subfield \$a
ind2    b012    Type of event
a       R       Formatted date/time
b       R       Geographic classification area code
c       R       Geographic classification subarea code
p       R       Place of event
0       R       Record control number
2       R       Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

034     R       CODED CARTOGRAPHIC MATHEMATICAL DATA
ind1    013     Type of scale
ind2    b01     Type of ring
a       NR      Category of scale
b       R       Constant ratio linear horizontal scale
c       R       Constant ratio linear vertical scale
d       NR      Coordinates--westernmost longitude
e       NR      Coordinates--easternmost longitude
f       NR      Coordinates--northernmost latitude
g       NR      Coordinates--southernmost latitude
h       R       Angular scale
j       NR      Declination--northern limit
k       NR      Declination--southern limit
m       NR      Right ascension--eastern limit
n       NR      Right ascension--western limit
p       NR      Equinox
r       NR      Distance from earth
s       R       G-ring latitude
t       R       G-ring longitude
x       NR      Beginning date
y       NR      Ending date
z       NR      Name of extraterrestrial body
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

035     R       SYSTEM CONTROL NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      System control number
z       R       Canceled/invalid control number
6       NR      Linkage
8       R       Field link and sequence number

036     NR      ORIGINAL STUDY NUMBER FOR COMPUTER DATA FILES
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Original study number
b       NR      Source (agency assigning number)
6       NR      Linkage
8       R       Field link and sequence number

037     R       SOURCE OF ACQUISITION
ind1    b23     Source of acquisition sequence
ind2    blank   Undefined
a       NR      Stock number
b       NR      Source of stock number/acquisition
c       R       Terms of availability
f       R       Form of issue
g       R       Additional format characteristics
n       R       Note
3       NR      Materials specified
5       R       Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

038     NR      RECORD CONTENT LICENSOR
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Record content licensor
6       NR      Linkage
8       R       Field link and sequence number

040     NR      CATALOGING SOURCE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Original cataloging agency
b       NR      Language of cataloging
c       NR      Transcribing agency
d       R       Modifying agency
e       R       Description conventions
6       NR      Linkage
8       R       Field link and sequence number

041     R       LANGUAGE CODE
ind1    b01      Translation indication
ind2    b7      Source of code
a       R       Language code of text/sound track or separate title
b       R       Language code of summary or abstract
d       R       Language code of sung or spoken text
e       R       Language code of librettos
f       R       Language code of table of contents
g       R       Language code of accompanying material other than librettos
h       R       Language code of original
j       R       Language code of subtitles or captions
k       R       Language code of intermediate translations
m       R       Language code of original accompanying materials other than librettos
n       R       Language code of original libretto
2       NR      Source of code
6       NR      Linkage
8       R       Field link and sequence number

042     NR      AUTHENTICATION CODE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Authentication code

043     NR      GEOGRAPHIC AREA CODE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Geographic area code
b       R       Local GAC code
c       R       ISO code
0       R       Authority record control number or standard number
2       R       Source of local code
6       NR      Linkage
8       R       Field link and sequence number

044     NR      COUNTRY OF PUBLISHING/PRODUCING ENTITY CODE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       MARC country code
b       R       Local subentity code
c       R       ISO country code
2       R       Source of local subentity code
6       NR      Linkage
8       R       Field link and sequence number

045     NR      TIME PERIOD OF CONTENT
ind1    b012    Type of time period in subfield \$b or \$c
ind2    blank   Undefined
a       R       Time period code
b       R       Formatted 9999 B.C. through C.E. time period
c       R       Formatted pre-9999 B.C. time period
6       NR      Linkage
8       R       Field link and sequence number

046     R       SPECIAL CODED DATES
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Type of date code
b       NR      Date 1 (B.C.E. date)
c       NR      Date 1 (C.E. date)
d       NR      Date 2 (B.C.E. date)
e       NR      Date 2 (C.E. date)
j       NR      Date resource modified
k       NR      Beginning or single date created
l       NR      Ending date created
m       NR      Beginning of date valid
n       NR      End of date valid
o       NR      Single or starting date for aggregated content
p       NR      Ending date for aggregated content
2       NR      Source of date
6       NR      Linkage
8       R       Field link and sequence number

047     R       FORM OF MUSICAL COMPOSITION CODE
ind1    blank   Undefined
ind2    b7      Source of code
a       R       Form of musical composition code
2       NR      Source of code
8       R       Field link and sequence number

048     R       NUMBER OF MUSICAL INSTRUMENTS OR VOICES CODE
ind1    blank   Undefined
ind2    b7      Source specified in subfield \$2
a       R       Performer or ensemble
b       R       Soloist
2       NR      Source of code
8       R       Field link and sequence number

050     R       LIBRARY OF CONGRESS CALL NUMBER
ind1    b01     Existence in LC collection
ind2    04      Source of call number
a       R       Classification number
b       NR      Item number
0       R       Authority record control number or standard number
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

051     R       LIBRARY OF CONGRESS COPY, ISSUE, OFFPRINT STATEMENT
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Classification number
b       NR      Item number
c       NR      Copy information
8       R       Field link and sequence number

052     R       GEOGRAPHIC CLASSIFICATION
ind1    b17     Code source
ind2    blank   Undefined
a       NR      Geographic classification area code
b       R       Geographic classification subarea code
d       R       Populated place name
0       R       Authority record control number or standard number
2       NR      Code source
6       NR      Linkage
8       R       Field link and sequence number

055     R       CLASSIFICATION NUMBERS ASSIGNED IN CANADA
ind1    b01     Existence in LAC collection
ind2    0123456789   Type, completeness, source of class/call number
a       NR      Classification number
b       NR      Item number
0       R       Authority record control number or standard number
2       NR      Source of call/class number
8       R       Field link and sequence number

060     R       NATIONAL LIBRARY OF MEDICINE CALL NUMBER
ind1    b01     Existence in NLM collection
ind2    04      Source of call number
a       R       Classification number
b       NR      Item number
0       R       Authority record control number or standard number
8       R       Field link and sequence number

061     R       NATIONAL LIBRARY OF MEDICINE COPY STATEMENT
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Classification number
b       NR      Item number
c       NR      Copy information
8       R       Field link and sequence number

066     NR      CHARACTER SETS PRESENT
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Primary G0 character set
b       NR      Primary G1 character set
c       R       Alternate G0 or G1 character set

070     R       NATIONAL AGRICULTURAL LIBRARY CALL NUMBER
ind1    b01     Existence in NAL collection
ind2    blank   Undefined
a       R       Classification number
b       NR      Item number
0       R       Authority record control number or standard number
8       R       Field link and sequence number

071     R       NATIONAL AGRICULTURAL LIBRARY COPY STATEMENT
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Classification number
b       NR      Item number
c       NR      Copy information
8       R       Field link and sequence number

072     R       SUBJECT CATEGORY CODE
ind1    blank   Undefined
ind2    07      Source specified in subfield \$2
a       NR      Subject category code
x       R       Subject category code subdivision
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

074     R       GPO ITEM NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      GPO item number
z       R       Canceled/invalid GPO item number
8       R       Field link and sequence number

080     R       UNIVERSAL DECIMAL CLASSIFICATION NUMBER
ind1    01      Type of edition
ind2    blank   Undefined
a       NR      Universal Decimal Classification number
b       NR      Item number
x       R       Common auxiliary subdivision
0       R       Authority record control number or standard number
2       NR      Edition identifier
6       NR      Linkage
8       R       Field link and sequence number

082     R       DEWEY DECIMAL CLASSIFICATION NUMBER
ind1    017     Type of edition
ind2    b04     Source of classification number
a       R       Classification number
b       NR      Item number
m       NR      Standard or optional designation
q       NR      Assigning agency
2       NR      Edition number
6       NR      Linkage
8       R       Field link and sequence number

083     R       ADDITIONAL DEWEY DECIMAL CLASSIFICATION NUMBER
ind1    017     Type of edition
ind2    blank   Undefined
a       R       Classification number
c       R       Classification number--Ending number of span
m       NR      Standard or optional designation
q       NR      Assigning agency
y       R       Table sequence number for internal subarrangement or add table
z       R       Table identification
2       NR      Edition number
6       NR      Linkage
8       R       Field link and sequence number

084     R       OTHER CLASSIFICATION NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Classification number
b       NR      Item number
q       NR      Assigning agency
0       R       Authority record control number or standard number
2       NR      Source of number
6       NR      Linkage
8       R       Field link and sequence number

085     R       SYNTHESIZED CLASSIFICATION NUMBER COMPONENTS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Number where instructions are found-single number or beginning number of span
b       R       Base number
c       R       Classification number-ending number of span
f       R       Facet designator
r       R       Root number
s       R       Digits added from classification number in schedule or external table
t       R       Digits added from internal subarrangement or add table
u       R       Number being analyzed
v       R       Number in internal subarrangement or add table where instructions are found
w       R       Table identification-Internal subarrangement or add table
y       R       Table sequence number for internal subarrangement or add table
z       R       Table identification
0       R       Authority record control number or standard number
6       NR      Linkage
8       R       Field link and sequence number

086     R       GOVERNMENT DOCUMENT CLASSIFICATION NUMBER
ind1    b01     Number source
ind2    blank   Undefined
a       NR      Classification number
z       R       Canceled/invalid classification number
0       R       Authority record control number or standard number
2       NR      Number source
6       NR      Linkage
8       R       Field link and sequence number

088     R       REPORT NUMBER
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Report number
z       R       Canceled/invalid report number
6       NR      Linkage
8       R       Field link and sequence number

100     NR      MAIN ENTRY--PERSONAL NAME
ind1    013     Type of personal name entry element
ind2    blank   Undefined
a       NR      Personal name
b       NR      Numeration
c       R       Titles and other words associated with a name
d       NR      Dates associated with a name
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
j       R       Attribution qualifier
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section of a work
p       R       Name of part/section of a work
q       NR      Fuller form of name
t       NR      Title of a work
u       NR      Affiliation
0       R       Authority record control number
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

110     NR      MAIN ENTRY--CORPORATE NAME
ind1    012     Type of corporate name entry element
ind2    blank   Undefined
a       NR      Corporate name or jurisdiction name as entry element
b       R       Subordinate unit
c       R       Location of meeting
d       R       Date of meeting or treaty signing
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
t       NR      Title of a work
u       NR      Affiliation
0       R       Authority record control number
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

111     NR      MAIN ENTRY--MEETING NAME
ind1    012     Type of meeting name entry element
ind2    blank   Undefined
a       NR      Meeting name or jurisdiction name as entry element
c       R       Location of meeting
d       NR      Date of meeting
e       R       Subordinate unit
f       NR      Date of a work
g       R       Miscellaneous information
j       R       Relator term
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
q       NR      Name of meeting following jurisdiction name entry element
t       NR      Title of a work
u       NR      Affiliation
0       R       Authority record control number
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

130     NR      MAIN ENTRY--UNIFORM TITLE
ind1    0-9     Nonfiling characters
ind2    blank   Undefined
a       NR      Uniform title
d       R       Date of treaty signing
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
0       R       Authority record control number
6       NR      Linkage
8       R       Field link and sequence number

210     R       ABBREVIATED TITLE
ind1    01      Title added entry
ind2    b0      Type
a       NR      Abbreviated title
b       NR      Qualifying information
2       R       Source
6       NR      Linkage
8       R       Field link and sequence number

222     R       KEY TITLE
ind1    blank   Specifies whether variant title and/or added entry is required
ind2    0-9     Nonfiling characters
a       NR      Key title
b       NR      Qualifying information
6       NR      Linkage
8       R       Field link and sequence number

240     NR      UNIFORM TITLE
ind1    01    Uniform title printed or displayed
ind2    0-9    Nonfiling characters
a       NR      Uniform title
d       R       Date of treaty signing
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
0       R       Authority record control number
6       NR      Linkage
8       R       Field link and sequence number

242     R       TRANSLATION OF TITLE BY CATALOGING AGENCY
ind1    01    Title added entry
ind2    0-9    Nonfiling characters
a       NR      Title
b       NR      Remainder of title
c       NR      Statement of responsibility, etc.
h       NR      Medium
n       R       Number of part/section of a work
p       R       Name of part/section of a work
y       NR      Language code of translated title
6       NR      Linkage
8       R       Field link and sequence number

243     NR      COLLECTIVE UNIFORM TITLE
ind1    01    Uniform title printed or displayed
ind2    0-9    Nonfiling characters
a       NR      Uniform title
d       R       Date of treaty signing
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
6       NR      Linkage
8       R       Field link and sequence number

245     NR      TITLE STATEMENT
ind1    01    Title added entry
ind2    0-9    Nonfiling characters
a       NR      Title
b       NR      Remainder of title
c       NR      Statement of responsibility, etc.
f       NR      Inclusive dates
g       NR      Bulk dates
h       NR      Medium
k       R       Form
n       R       Number of part/section of a work
p       R       Name of part/section of a work
s       NR      Version
6       NR      Linkage
8       R       Field link and sequence number

246     R       VARYING FORM OF TITLE
ind1    0123    Note/added entry controller
ind2    b012345678    Type of title
a       NR      Title proper/short title
b       NR      Remainder of title
f       NR      Date or sequential designation
g       R       Miscellaneous information
h       NR      Medium
i       NR      Display text
n       R       Number of part/section of a work
p       R       Name of part/section of a work
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

247     R       FORMER TITLE
ind1    01      Title added entry
ind2    01      Note controller
a       NR      Title
b       NR      Remainder of title
f       NR      Date or sequential designation
g       R       Miscellaneous information
h       NR      Medium
n       R       Number of part/section of a work
p       R       Name of part/section of a work
x       NR      International Standard Serial Number
6       NR      Linkage
8       R       Field link and sequence number

250     R       EDITION STATEMENT
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Edition statement
b       NR      Remainder of edition statement
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

254     NR      MUSICAL PRESENTATION STATEMENT
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Musical presentation statement
6       NR      Linkage
8       R       Field link and sequence number

255     R       CARTOGRAPHIC MATHEMATICAL DATA
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Statement of scale
b       NR      Statement of projection
c       NR      Statement of coordinates
d       NR      Statement of zone
e       NR      Statement of equinox
f       NR      Outer G-ring coordinate pairs
g       NR      Exclusion G-ring coordinate pairs
6       NR      Linkage
8       R       Field link and sequence number

256     NR      COMPUTER FILE CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Computer file characteristics
6       NR      Linkage
8       R       Field link and sequence number

257     R       COUNTRY OF PRODUCING ENTITY
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Country of producing entity
0       R       Authority record control number or standard number
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

258     R       PHILATELIC ISSUE DATE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Issuing jurisdiction
b       NR      Denomination
6       NR      Linkage
8       R       Field link and sequence number

260     R       PUBLICATION, DISTRIBUTION, ETC. (IMPRINT)
ind1    b23     Sequence of publishing statements
ind2    blank   Undefined
a       R       Place of publication, distribution, etc.
b       R       Name of publisher, distributor, etc.
c       R       Date of publication, distribution, etc.
d       NR      Plate or publisher's number for music (Pre-AACR 2)
e       R       Place of manufacture
f       R       Manufacturer
g       R       Date of manufacture
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

261     NR      IMPRINT STATEMENT FOR FILMS (Pre-AACR 1 Revised)
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Producing company
b       R       Releasing company (primary distributor)
d       R       Date of production, release, etc.
e       R       Contractual producer
f       R       Place of production, release, etc.
6       NR      Linkage
8       R       Field link and sequence number

262     NR      IMPRINT STATEMENT FOR SOUND RECORDINGS (Pre-AACR 2)
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Place of production, release, etc.
b       NR      Publisher or trade name
c       NR      Date of production, release, etc.
k       NR      Serial identification
l       NR      Matrix and/or take number
6       NR      Linkage
8       R       Field link and sequence number

263     NR      PROJECTED PUBLICATION DATE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Projected publication date
6       NR      Linkage
8       R       Field link and sequence number

264     R       PRODUCTION, PUBLICATION, DISTRIBUTION, MANUFACTURE, AND COPYRIGHT NOTICE
ind1    b23     Sequence of statements
ind2    01234   Function of entity
a       R       Place of production, publication, distribution, manufacture
b       R       Name of producer, publisher, distributor, manufacturer
c       R       Date of production, publication, distribution, manufacture, or copyright notice
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number (R)

270     R       ADDRESS
ind1    b12     Level
ind2    b07     Type of address
a       R       Address
b       NR      City
c       NR      State or province
d       NR      Country
e       NR      Postal code
f       NR      Terms preceding attention name
g       NR      Attention name
h       NR      Attention position
i       NR      Type of address
j       R       Specialized telephone number
k       R       Telephone number
l       R       Fax number
m       R       Electronic mail address
n       R       TDD or TTY number
p       R       Contact person
q       R       Title of contact person
r       R       Hours
z       R       Public note
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

300     R       PHYSICAL DESCRIPTION
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Extent
b       NR      Other physical details
c       R       Dimensions
e       NR      Accompanying material
f       R       Type of unit
g       R       Size of unit
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

306     NR      PLAYING TIME
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Playing time
6       NR      Linkage
8       R       Field link and sequence number

307     R       HOURS, ETC.
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Hours
b       NR      Additional information
6       NR      Linkage
8       R       Field link and sequence number

310     NR      CURRENT PUBLICATION FREQUENCY
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Current publication frequency
b       NR      Date of current publication frequency
6       NR      Linkage
8       R       Field link and sequence number

321     R       FORMER PUBLICATION FREQUENCY
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Former publication frequency
b       NR      Dates of former publication frequency
6       NR      Linkage
8       R       Field link and sequence number

336     R       CONTENT TYPE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Content type term
b       R       Content type code
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

337     R       MEDIA TYPE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Media type term
b       R       Media type code
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

338     R       CARRIER TYPE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Carrier type term
b       R       Carrier type code
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

340     R       PHYSICAL MEDIUM
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Material base and configuration
b       R       Dimensions
c       R       Materials applied to surface
d       R       Information recording technique
e       R       Support
f       R       Production rate/ratio
g       R       Color content
h       R       Location within medium
i       R       Technical specifications of medium
j       R       Generation
k       R       Layout
m       R       Book format
n       R       Font size
o       R       Polarity
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

342     R       GEOSPATIAL REFERENCE DATA
ind1    01      Geospatial reference dimension
ind2    012345678    Geospatial reference method
a       NR      Name
b       NR      Coordinate or distance units
c       NR      Latitude resolution
d       NR      Longitude resolution
e       R       Standard parallel or oblique line latitude
f       R       Oblique line longitude
g       NR      Longitude of central meridian or projection center
h       NR      Latitude of projection origin or projection center
i       NR      False easting
j       NR      False northing
k       NR      Scale factor
l       NR      Height of perspective point above surface
m       NR      Azimuthal angle
o       NR      Landsat number and path number
p       NR      Zone identifier
q       NR      Ellipsoid name
r       NR      Semi-major axis
s       NR      Denominator of flattening ratio
t       NR      Vertical resolution
u       NR      Vertical encoding method
v       NR      Local planar, local, or other projection or grid description
w       NR      Local planar or local georeference information
2       NR      Reference method used
6       NR      Linkage
8       R       Field link and sequence number

343     R       PLANAR COORDINATE DATA
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Planar coordinate encoding method
b       NR      Planar distance units
c       NR      Abscissa resolution
d       NR      Ordinate resolution
e       NR      Distance resolution
f       NR      Bearing resolution
g       NR      Bearing units
h       NR      Bearing reference direction
i       NR      Bearing reference meridian
6       NR      Linkage
8       R       Field link and sequence number

344     R       SOUND CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Type of recording
b       R       Recording medium
c       R       Playing speed
d       R       Groove characteristic
e       R       Track configuration
f       R       Tape configuration
g       R       Configuration of playback channels
h       R       Special playback characteristics
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

345     R       PROJECTION CHARACTERISTICS OF MOVING IMAGE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Presentation format
b       R       Projection speed
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

346     R       VIDEO CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Video format
b       R       Broadcast standard
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

347     R       DIGITAL FILE CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       File type
b       R       Encoding format
c       R       File size
d       R       Resolution
e       R       Regional encoding
f       R       Encoded bitrate
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

348     R       FORMAT OF NOTATED MUSIC
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Format of notated music term
b       R       Format of notated music code
0       R       Authority record control number or standard number
2       NR      Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

351     R       ORGANIZATION AND ARRANGEMENT OF MATERIALS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Organization
b       R       Arrangement
c       NR      Hierarchical level
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

352     R       DIGITAL GRAPHIC REPRESENTATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Direct reference method
b       R       Object type
c       R       Object count
d       NR      Row count
e       NR      Column count
f       NR      Vertical count
g       NR      VPF topology level
i       NR      Indirect reference description
q       R       Format of the digital image
6       NR      Linkage
8       R       Field link and sequence number

355     R       SECURITY CLASSIFICATION CONTROL
ind1    0123458    Controlled element
ind2    blank   Undefined
a       NR      Security classification
b       R       Handling instructions
c       R       External dissemination information
d       NR      Downgrading or declassification event
e       NR      Classification system
f       NR      Country of origin code
g       NR      Downgrading date
h       NR      Declassification date
j       R       Authorization
6       NR      Linkage
8       R       Field link and sequence number

357     NR      ORIGINATOR DISSEMINATION CONTROL
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Originator control term
b       R       Originating agency
c       R       Authorized recipients of material
g       R       Other restrictions
6       NR      Linkage
8       R       Field link and sequence number

362     R       DATES OF PUBLICATION AND/OR SEQUENTIAL DESIGNATION
ind1    01      Format of date
ind2    blank   Undefined
a       NR      Dates of publication and/or sequential designation
z       NR      Source of information
6       NR      Linkage
8       R       Field link and sequence number

363     R       NORMALIZED DATE AND SEQUENTIAL DESIGNATION
ind1    b01      Start/End designator
ind2    b01      State of issuanceUndefined
a       NR      First level of enumeration
b       NR      Second level of enumeration
c       NR      Third level of enumeration
d       NR      Fourth level of enumeration
e       NR      Fifth level of enumeration
f       NR      Sixth level of enumeration
g       NR      Alternative numbering scheme, first level of enumeration
h       NR      Alternative numbering scheme, second level of enumeration
i       NR      First level of chronology
j       NR      Second level of chronology
k       NR      Third level of chronology
l       NR      Fourth level of chronology
m       NR      Alternative numbering scheme, chronology
u       NR      First level textual designation
v       NR      First level of chronology, issuance
x       R       Nonpublic note
z       R       Public note
6       NR      Linkage
8       NR      Field link and sequence number

365     R       TRADE PRICE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Price type code
b       NR      Price amount
c       NR      Currency code
d       NR      Unit of pricing
e       NR      Price note
f       NR      Price effective from
g       NR      Price effective until
h       NR      Tax rate 1
i       NR      Tax rate 2
j       NR      ISO country code
k       NR      MARC country code
m       NR      Identification of pricing entity
2       NR      Source of price type code
6       NR      Linkage
8       R       Field link and sequence number

366     R       TRADE AVAILABILITY INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Publishers' compressed title identification
b       NR      Detailed date of publication
c       NR      Availability status code
d       NR      Expected next availability date
e       NR      Note
f       NR      Publishers' discount category
g       NR      Date made out of print
j       NR      ISO country code
k       NR      MARC country code
m       NR      Identification of agency
2       NR      Source of availability status code
6       NR      Linkage
8       R       Field link and sequence number

370     R       ASSOCIATED PLACE
ind1    blank   Undefined
ind2    blank   Undefined
c       R       Associated country
f       R       Other associated place
g       R       Place of origin of work or expression
i       R       Relationship information
s       NR      Start period
t       NR      End period
u       R       Uniform Resource Identifier
v       R       Source of information
0       R       Authority record control number or standard number
2       NR      Source of term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

377     R       ASSOCIATED LANGUAGE
ind1    blank   Undefined
ind2    b7      Undefined
a       R       Language code
0       R       Authority record control number or standard number
l       R       Language term
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

380     R       FORM OF WORK
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Form of work
0       R       Record control number
2       NR      Source of term
6       NR      Linkage
8       R       Field link and sequence number

381     R       OTHER DISTINGUISHING CHARACTERISTICS OF WORK OR EXPRESSION
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Other distinguishing characteristic
u       R       Uniform Resource Identifier
v       R       Source of information
0       R       Record control number
2       NR      Source of term
6       NR      Linkage
8       R       Field link and sequence number

382     R       MEDIUM OF PERFORMANCE
ind1    b01     Undefined
ind2    b01     Undefined
a       R       Medium of performance
b       R       Soloist
d       R       Doubling instrument
e       R       Number of ensembles of the same type
n       R       Number of performers of the same medium
p       R       Alternative medium of performance
r       NR      Total number of individuals performing alongside ensembles
s       NR      Total number of performers
t       NR      Total number of ensembles
v       R       Note
0       R       Record control number
2       NR      Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

383     R       NUMERIC DESIGNATION OF MUSICAL WORK
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Serial number
b       R       Opus number
c       R       Thematic index number
d       NR      Thematic index code
e       NR      Publisher associated with opus number
2       NR      Source
6       NR      Linkage
8       R       Field link and sequence number

384     NR      KEY
ind1    b01     Key type
ind2    blank   Undefined
a       NR      Key
6       NR      Linkage
8       R       Field link and sequence number

385     R       AUDIENCE CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Audience term
b       R       Audience code
m       NR      Demographic group term
n       NR      Demographic group code
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

386     R       CREATOR/CONTRIBUTOR CHARACTERISTICS
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Creator/contributor term
b       R       Creator/contributor code
i       R       Relationship information
m       NR      Demographic group term
n       NR      Demographic group code
0       R       Authority record control number or standard number
2       NR      Source
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

388     R       TIME PERIOD OF CREATION
ind1    b12     Type of time period
ind2    blank   Undefined
a       R       Time period of creation term (R)
0       R       Authority record control number or standard number (R)
2       NR      Source of term (NR)
3       NR      Materials specified (NR)
6       NR      Linkage (NR)
8       R       Field link and sequence number (R)

400     R       SERIES STATEMENT/ADDED ENTRY--PERSONAL NAME
ind1    013     Type of personal name entry element
ind2    01      Pronoun represents main entry
a       NR      Personal name
b       NR      Numeration
c       R       Titles and other words associated with a name
d       NR      Dates associated with a name
e       R       Relator term
f       NR      Date of a work
g       NR      Miscellaneous information
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section of a work
p       R       Name of part/section of a work
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume number/sequential designation
x       NR      International Standard Serial Number
4       R       Relator code
6       NR      Linkage
8       R       Field link and sequence number

410     R       SERIES STATEMENT/ADDED ENTRY--CORPORATE NAME
ind1    012     Type of corporate name entry element
ind2    01      Pronoun represents main entry
a       NR      Corporate name or jurisdiction name as entry element
b       R       Subordinate unit
c       NR      Location of meeting
d       R       Date of meeting or treaty signing
e       R       Relator term
f       NR      Date of a work
g       NR      Miscellaneous information
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume number/sequential designation
x       NR      International Standard Serial Number
4       R       Relator code
6       NR      Linkage
8       R       Field link and sequence number

411     R       SERIES STATEMENT/ADDED ENTRY--MEETING NAME
ind1    012     Type of meeting name entry element
ind2    01      Pronoun represents main entry
a       NR      Meeting name or jurisdiction name as entry element
c       NR      Location of meeting
d       NR      Date of meeting
e       R       Subordinate unit
f       NR      Date of a work
g       NR      Miscellaneous information
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
q       NR      Name of meeting following jurisdiction name entry element
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume number/sequential designation
x       NR      International Standard Serial Number
4       R       Relator code
6       NR      Linkage
8       R       Field link and sequence number

440     R       SERIES STATEMENT/ADDED ENTRY--TITLE [OBSOLETE]
ind1    blank   Undefined
ind2    0-9     Nonfiling characters
a       NR      Title
n       R       Number of part/section of a work
p       R       Name of part/section of a work
v       NR      Volume number/sequential designation
x       NR      International Standard Serial Number
w       R       Bibliographic record control number
0       R       Authority record control number
6       NR      Linkage
8       R       Field link and sequence number

490     R       SERIES STATEMENT
ind1    01      Specifies whether series is traced
ind2    blank   Undefined
a       R       Series statement
l       NR      Library of Congress call number
v       R       Volume number/sequential designation
x       R       International Standard Serial Number
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

500     R       GENERAL NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      General note
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

501     R       WITH NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      With note
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

502     R       DISSERTATION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Dissertation note
b       NR      Degree type
c       NR      Name of granting institution
d       NR      Year of degree granted
g       R       Miscellaneous information
o       R       Dissertation identifier
6       NR      Linkage
8       R       Field link and sequence number

504     R       BIBLIOGRAPHY, ETC. NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Bibliography, etc. note
b       NR      Number of references
6       NR      Linkage
8       R       Field link and sequence number

505     R       FORMATTED CONTENTS NOTE
ind1    0128    Display constant controller
ind2    b0      Level of content designation
a       NR      Formatted contents note
g       R       Miscellaneous information
r       R       Statement of responsibility
t       R       Title
u       R       Uniform Resource Identifier
6       NR      Linkage
8       R       Field link and sequence number

506     R       RESTRICTIONS ON ACCESS NOTE
ind1    b01     Restriction
ind2    blank   Undefined
a       NR      Terms governing access
b       R       Jurisdiction
c       R       Physical access provisions
d       R       Authorized users
e       R       Authorization
f       R       Standard terminology for access restiction
u       R       Uniform Resource Identifier
2       NR      Source of term
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

507     NR      SCALE NOTE FOR GRAPHIC MATERIAL
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Representative fraction of scale note
b       NR      Remainder of scale note
6       NR      Linkage
8       R       Field link and sequence number

508     R       CREATION/PRODUCTION CREDITS NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Creation/production credits note
6       NR      Linkage
8       R       Field link and sequence number

510     R       CITATION/REFERENCES NOTE
ind1    01234   Coverage/location in source
ind2    blank   Undefined
a       NR      Name of source
b       NR      Coverage of source
c       NR      Location within source
u       R       Uniform Resource Identifier
x       NR      International Standard Serial Number
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

511     R       PARTICIPANT OR PERFORMER NOTE
ind1    01      Display constant controller
ind2    blank   Undefined
a       NR      Participant or performer note
6       NR      Linkage
8       R       Field link and sequence number

513     R       TYPE OF REPORT AND PERIOD COVERED NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Type of report
b       NR      Period covered
6       NR      Linkage
8       R       Field link and sequence number

514     NR      DATA QUALITY NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Attribute accuracy report
b       R       Attribute accuracy value
c       R       Attribute accuracy explanation
d       NR      Logical consistency report
e       NR      Completeness report
f       NR      Horizontal position accuracy report
g       R       Horizontal position accuracy value
h       R       Horizontal position accuracy explanation
i       NR      Vertical positional accuracy report
j       R       Vertical positional accuracy value
k       R       Vertical positional accuracy explanation
m       NR      Cloud cover
u       R       Uniform Resource Identifier
z       R       Display note
6       NR      Linkage
8       R       Field link and sequence number

515     R       NUMBERING PECULIARITIES NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Numbering peculiarities note
6       NR      Linkage
8       R       Field link and sequence number

516     R       TYPE OF COMPUTER FILE OR DATA NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Type of computer file or data note
6       NR      Linkage
8       R       Field link and sequence number

518     R       DATE/TIME AND PLACE OF AN EVENT NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Date/time and place of an event note
d       R       Date of event
o       R       Other event information
p       R       Place of event
0       R       Record control number
2       R       Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

520     R       SUMMARY, ETC.
ind1    b012348    Display constant controller
ind2    blank   Undefined
a       NR      Summary, etc. note
b       NR      Expansion of summary note
c       NR      Assigning agency
u       R       Uniform Resource Identifier
2       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

521     R       TARGET AUDIENCE NOTE
ind1    b012348    Display constant controller
ind2    blank   Undefined
a       R       Target audience note
b       NR      Source
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

522     R       GEOGRAPHIC COVERAGE NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Geographic coverage note
6       NR      Linkage
8       R       Field link and sequence number

524     R       PREFERRED CITATION OF DESCRIBED MATERIALS NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Preferred citation of described materials note
2       NR      Source of schema used
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

525     R       SUPPLEMENT NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Supplement note
6       NR      Linkage
8       R       Field link and sequence number

526     R       STUDY PROGRAM INFORMATION NOTE
ind1    08      Display constant controller
ind2    blank   Undefined
a       NR      Program name
b       NR      Interest level
c       NR      Reading level
d       NR      Title point value
i       NR      Display text
x       R       Nonpublic note
z       R       Public note
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

530     R       ADDITIONAL PHYSICAL FORM AVAILABLE NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Additional physical form available note
b       NR      Availability source
c       NR      Availability conditions
d       NR      Order number
u       R       Uniform Resource Identifier
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

533     R       REPRODUCTION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Type of reproduction
b       R       Place of reproduction
c       R       Agency responsible for reproduction
d       NR      Date of reproduction
e       NR      Physical description of reproduction
f       R       Series statement of reproduction
m       R       Dates and/or sequential designation of issues reproduced
n       R       Note about reproduction
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
7       NR      Fixed-length data elements of reproduction
8       R       Field link and sequence number

534     R       ORIGINAL VERSION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Main entry of original
b       NR      Edition statement of original
c       NR      Publication, distribution, etc. of original
e       NR      Physical description, etc. of original
f       R       Series statement of original
k       R       Key title of original
l       NR      Location of original
m       NR      Material specific details
n       R       Note about original
o       R       Other resource identifier
p       NR      Introductory phrase
t       NR      Title statement of original
x       R       International Standard Serial Number
z       R       International Standard Book Number
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

535     R       LOCATION OF ORIGINALS/DUPLICATES NOTE
ind1    12      Additional information about custodian
ind2    blank   Undefined
a       NR      Custodian
b       R       Postal address
c       R       Country
d       R       Telecommunications address
g       NR      Repository location code
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

536     R       FUNDING INFORMATION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Text of note
b       R       Contract number
c       R       Grant number
d       R       Undifferentiated number
e       R       Program element number
f       R       Project number
g       R       Task number
h       R       Work unit number
6       NR      Linkage
8       R       Field link and sequence number

538     R       SYSTEM DETAILS NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      System details note
i       NR      Display text
u       R       Uniform Resource Identifier
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

540     R       TERMS GOVERNING USE AND REPRODUCTION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Terms governing use and reproduction
b       NR      Jurisdiction
c       NR      Authorization
d       NR      Authorized users
u       R       Uniform Resource Identifier
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

541     R       IMMEDIATE SOURCE OF ACQUISITION NOTE
ind1    b01     Undefined
ind2    blank   Undefined
a       NR      Source of acquisition
b       NR      Address
c       NR      Method of acquisition
d       NR      Date of acquisition
e       NR      Accession number
f       NR      Owner
h       NR      Purchase price
n       R       Extent
o       R       Type of unit
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

542     R       INFORMATION RELATING TO COPYRIGHT STATUS
ind1    b01     Relationship
ind2    blank   Undefined
a       NR      Personal creator
b       NR      Personal creator death date
c       NR      Corporate creator
d       R       Copyright holder
e       R       Copyright holder contact information
f       R       Copyright statement
g       NR      Copyright date
h       R       Copyright renewal date
i       NR      Publication date
j       NR      Creation date
k       R       Publisher
l       NR      Copyright status
m       NR      Publication status
n       R       Note
o       NR      Research date
q       NR      Assigning agency
r       NR      Jurisdiction of copyright assessment
s       NR      Source of information
u       R       Uniform Resource Identifier
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

544     R       LOCATION OF OTHER ARCHIVAL MATERIALS NOTE
ind1    b01     Relationship
ind2    blank   Undefined
a       R       Custodian
b       R       Address
c       R       Country
d       R       Title
e       R       Provenance
n       R       Note
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

545     R       BIOGRAPHICAL OR HISTORICAL DATA
ind1    b01     Type of data
ind2    blank   Undefined
a       NR      Biographical or historical note
b       NR      Expansion
u       R       Uniform Resource Identifier
6       NR      Linkage
8       R       Field link and sequence number

546     R       LANGUAGE NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Language note
b       R       Information code or alphabet
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

547     R       FORMER TITLE COMPLEXITY NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Former title complexity note
6       NR      Linkage
8       R       Field link and sequence number

550     R       ISSUING BODY NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Issuing body note
6       NR      Linkage
8       R       Field link and sequence number

552     R       ENTITY AND ATTRIBUTE INFORMATION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Entity type label
b       NR      Entity type definition and source
c       NR      Attribute label
d       NR      Attribute definition and source
e       R       Enumerated domain value
f       R       Enumerated domain value definition and source
g       NR      Range domain minimum and maximum
h       NR      Codeset name and source
i       NR      Unrepresentable domain
j       NR      Attribute units of measurement and resolution
k       NR      Beginning date and ending date of attribute values
l       NR      Attribute value accuracy
m       NR      Attribute value accuracy explanation
n       NR      Attribute measurement frequency
o       R       Entity and attribute overview
p       R       Entity and attribute detail citation
u       R       Uniform Resource Identifier
z       R       Display note
6       NR      Linkage
8       R       Field link and sequence number

555     R       CUMULATIVE INDEX/FINDING AIDS NOTE
ind1    b08     Display constant controller
ind2    blank   Undefined
a       NR      Cumulative index/finding aids note
b       R       Availability source
c       NR      Degree of control
d       NR      Bibliographic reference
u       R       Uniform Resource Identifier
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

556     R       INFORMATION ABOUT DOCUMENTATION NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Information about documentation note
z       R       International Standard Book Number
6       NR      Linkage
8       R       Field link and sequence number

561     R       OWNERSHIP AND CUSTODIAL HISTORY
ind1    b01     Undefined
ind2    blank   Undefined
a       NR      History
u       R       Uniform Resource Identifier
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

562     R       COPY AND VERSION IDENTIFICATION NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Identifying markings
b       R       Copy identification
c       R       Version identification
d       R       Presentation format
e       R       Number of copies
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

563     R       BINDING INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Binding note
u       R       Uniform Resource Identifier
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

565     R       CASE FILE CHARACTERISTICS NOTE
ind1    b08     Display constant controller
ind2    blank   Undefined
a       NR      Number of cases/variables
b       R       Name of variable
c       R       Unit of analysis
d       R       Universe of data
e       R       Filing scheme or code
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

567     R       METHODOLOGY NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Methodology note
b       R       Controlled term
0       R       Authority record control number or standard number
2       NR      Source of term
6       NR      Linkage
8       R       Field link and sequence number

580     R       LINKING ENTRY COMPLEXITY NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Linking entry complexity note
6       NR      Linkage
8       R       Field link and sequence number

581     R       PUBLICATIONS ABOUT DESCRIBED MATERIALS NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Publications about described materials note
z       R       International Standard Book Number
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

583     R       ACTION NOTE
ind1    b01     Undefined
ind2    blank   Undefined
a       NR      Action
b       R       Action identification
c       R       Time/date of action
d       R       Action interval
e       R       Contingency for action
f       R       Authorization
h       R       Jurisdiction
i       R       Method of action
j       R       Site of action
k       R       Action agent
l       R       Status
n       R       Extent
o       R       Type of unit
u       R       Uniform Resource Identifier
x       R       Nonpublic note
z       R       Public note
2       NR      Source of term
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

584     R       ACCUMULATION AND FREQUENCY OF USE NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Accumulation
b       R       Frequency of use
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

585     R       EXHIBITIONS NOTE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Exhibitions note
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

586     R       AWARDS NOTE
ind1    b8      Display constant controller
ind2    blank   Undefined
a       NR      Awards note
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

588     R       SOURCE OF DESCRIPTION NOTE
ind1    b01     Display constant controller
ind2    blank   Undefined
a       NR      Source of description note
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

600     R       SUBJECT ADDED ENTRY--PERSONAL NAME
ind1    013     Type of personal name entry element
ind2    01234567    Thesaurus
a       NR      Personal name
b       NR      Numeration
c       R       Titles and other words associated with a name
d       NR      Dates associated with a name
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
j       R       Attribution qualifier
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
q       NR      Fuller form of name
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

610     R       SUBJECT ADDED ENTRY--CORPORATE NAME
ind1    012     Type of corporate name entry element
ind2    01234567    Thesaurus
a       NR      Corporate name or jurisdiction name as entry element
b       R       Subordinate unit
c       R       Location of meeting
d       R       Date of meeting or treaty signing
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section/meeting
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

611     R       SUBJECT ADDED ENTRY--MEETING NAME
ind1    012     Type of meeting name entry element
ind2    01234567    Thesaurus
a       NR      Meeting name or jurisdiction name as entry element
c       R       Location of meeting
d       NR      Date of meeting
e       R       Subordinate unit
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
j       R       Relator term
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
q       NR      Name of meeting following jurisdiction name entry element
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

630     R       SUBJECT ADDED ENTRY--UNIFORM TITLE
ind1    0-9     Nonfiling characters
ind2    01234567    Thesaurus
a       NR      Uniform title
d       R       Date of treaty signing
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

647     R       SUBJECT ADDED ENTRY--NAMED EVENT
ind1    blank   Undefined
ind2    01234567    Thesaurus
a       NR      Named event
c       R       Location of named event
d       NR      Date of named event
g       R       Miscellaneous information
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number or standard number
2       NR      Source of heading or term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

648     R       SUBJECT ADDED ENTRY--CHRONOLOGICAL TERM
ind1    blank   Undefined
ind2    01234567    Thesaurus
a       NR      Chronological term
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

650     R       SUBJECT ADDED ENTRY--TOPICAL TERM
ind1    b012    Level of subject
ind2    01234567    Thesaurus
a       NR      Topical term or geographic name as entry element
b       NR      Topical term following geographic name as entry element
c       NR      Location of event
d       NR      Active dates
e       NR      Relator term
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

651     R       SUBJECT ADDED ENTRY--GEOGRAPHIC NAME
ind1    blank   Undefined
ind2    01234567    Thesaurus
a       NR      Geographic name
e       R       Relator term
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

653     R       INDEX TERM--UNCONTROLLED
ind1    b012    Level of index term
ind2    b0123456   Type of term or name
a       R       Uncontrolled term
6       NR      Linkage
8       R       Field link and sequence number

654     R       SUBJECT ADDED ENTRY--FACETED TOPICAL TERMS
ind1    b012    Level of subject
ind2    blank   Undefined
a       R       Focus term
b       R       Non-focus term
c       R       Facet/hierarchy designation
e       R       Relator term
v       R       Form subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

655     R       INDEX TERM--GENRE/FORM
ind1    b0      Type of heading
ind2    01234567    Thesaurus
a       NR      Genre/form data or focus term
b       R       Non-focus term
c       R       Facet/hierarchy designation
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of term
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

656     R       INDEX TERM--OCCUPATION
ind1    blank   Undefined
ind2    7       Source of term
a       NR      Occupation
k       NR      Form
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

657     R       INDEX TERM--FUNCTION
ind1    blank   Undefined
ind2    7       Source of term
a       NR      Function
v       R       Form subdivision
x       R       General subdivision
y       R       Chronological subdivision
z       R       Geographic subdivision
0       R       Authority record control number
2       NR      Source of term
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

658     R       INDEX TERM--CURRICULUM OBJECTIVE
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Main curriculum objective
b       R       Subordinate curriculum objective
c       NR      Curriculum code
d       NR      Correlation factor
2       NR      Source of term or code
6       NR      Linkage
8       R       Field link and sequence number

662     R       SUBJECT ADDED ENTRY--HIERARCHICAL PLACE NAME
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Country or larger entity
b       NR      First-order political jurisdiction
c       R       Intermediate political jurisdiction
d       NR      City
e       R       Relator term
f       R       City subsection
g       R       Other nonjurisdictional geographic region and feature
h       R       Extraterrestrial area
0       R       Authority record control number
2       NR      Source of heading or term
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

700     R       ADDED ENTRY--PERSONAL NAME
ind1    013     Type of personal name entry element
ind2    b2      Type of added entry
a       NR      Personal name
b       NR      Numeration
c       R       Titles and other words associated with a name
d       NR      Dates associated with a name
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
i       R       Relationship information
j       R       Attribution qualifier
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
q       NR      Fuller form of name
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

710     R       ADDED ENTRY--CORPORATE NAME
ind1    012     Type of corporate name entry element
ind2    b2      Type of added entry
a       NR      Corporate name or jurisdiction name as entry element
b       R       Subordinate unit
c       R       Location of meeting
d       R       Date of meeting or treaty signing
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
i       R       Relationship information
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section/meeting
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

711     R       ADDED ENTRY--MEETING NAME
ind1    012     Type of meeting name entry element
ind2    b2      Type of added entry
a       NR      Meeting name or jurisdiction name as entry element
c       R       Location of meeting
d       NR      Date of meeting
e       R       Subordinate unit
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
i       R       Relationship information
j       R       Relator term
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
q       NR      Name of meeting following jurisdiction name entry element
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

720     R       ADDED ENTRY--UNCONTROLLED NAME
ind1    b12     Type of name
ind2    blank   Undefined
a       NR      Name
e       R       Relator term
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

730     R       ADDED ENTRY--UNIFORM TITLE
ind1    0-9     Nonfiling characters
ind2    b2      Type of added entry
a       NR      Uniform title
d       R       Date of treaty signing
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
i       R       Relationship information
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

740     R       ADDED ENTRY--UNCONTROLLED RELATED/ANALYTICAL TITLE
ind1    0-9     Nonfiling characters
ind2    b2      Type of added entry
a       NR      Uncontrolled related/analytical title
h       NR      Medium
n       R       Number of part/section of a work
p       R       Name of part/section of a work
5       NR      Institution to which field applies
6       NR      Linkage
8       R       Field link and sequence number

751     R       ADDED ENTRY--GEOGRAPHIC NAME
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Geographic name
e       R       Relator term
0       R       Authority record control number
2       NR      Source of heading or term
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

752     R       ADDED ENTRY--HIERARCHICAL PLACE NAME
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Country or larger entity
b       NR      First-order political jurisdiction
c       NR      Intermediate political jurisdiction
d       NR      City
e       R       Relator term
f       R       City subsection
g       R       Other nonjurisdictional geographic region and feature
h       R       Extraterrestrial area
0       R       Authority record control number
2       NR      Source of heading or term
4       R       Relationship
6       NR      Linkage
8       R       Field link and sequence number

753     R       SYSTEM DETAILS ACCESS TO COMPUTER FILES
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Make and model of machine
b       NR      Programming language
c       NR      Operating system
0       R       Authority record control number or standard number
2       NR      Source of term
6       NR      Linkage
8       R       Field link and sequence number

754     R       ADDED ENTRY--TAXONOMIC IDENTIFICATION
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Taxonomic name
c       R       Taxonomic category
d       R       Common or alternative name
x       R       Non-public note
z       R       Public note
0       R       Authority record control number
2       NR      Source of taxonomic identification
6       NR      Linkage
8       R       Field link and sequence number

760     R       MAIN SERIES ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
s       NR      Uniform title
t       NR      Title
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

762     R       SUBSERIES ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
s       NR      Uniform title
t       NR      Title
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

765     R       ORIGINAL LANGUAGE ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

767     R       TRANSLATION ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

770     R       SUPPLEMENT/SPECIAL ISSUE ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

772     R       SUPPLEMENT PARENT ENTRY
ind1    01      Note controller
ind2    b08     Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Stan dard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

773     R       HOST ITEM ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
p       NR      Abbreviated title
q       NR      Enumeration and first page
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
3       NR      Materials specified
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

774     R       CONSTITUENT UNIT ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

775     R       OTHER EDITION ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
e       NR      Language code
f       NR      Country code
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

776     R       ADDITIONAL PHYSICAL FORM ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

777     R       ISSUED WITH ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
s       NR      Uniform title
t       NR      Title
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

780     R       PRECEDING ENTRY
ind1    01      Note controller
ind2    01234567    Type of relationship
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

785     R       SUCCEEDING ENTRY
ind1    01      Note controller
ind2    012345678    Type of relationship
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standa rd Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

786     R       DATA SOURCE ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
j       NR      Period of content
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
p       NR      Abbreviated title
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
v       NR      Source Contribution
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

787     R       OTHER RELATIONSHIP ENTRY
ind1    01      Note controller
ind2    b8      Display constant controller
a       NR      Main entry heading
b       NR      Edition
c       NR      Qualifying information
d       NR      Place, publisher, and date of publication
g       R       Related parts
h       NR      Physical description
i       R       Relationship information
k       R       Series data for related item
m       NR      Material-specific details
n       R       Note
o       R       Other item identifier
r       R       Report number
s       NR      Uniform title
t       NR      Title
u       NR      Standard Technical Report Number
w       R       Record control number
x       NR      International Standard Serial Number
y       NR      CODEN designation
z       R       International Standard Book Number
4       R       Relationship
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

800     R       SERIES ADDED ENTRY--PERSONAL NAME
ind1    013     Type of personal name entry element
ind2    blank   Undefined
a       NR      Personal name
b       NR      Numeration
c       R       Titles and other words associated with a name
d       NR      Dates associated with a name
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
j       R       Attribution qualifier
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
q       NR      Fuller form of name
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume/sequential designation
w       R       Bibliographic record control number
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       R       Institution to which field applies
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

810     R       SERIES ADDED ENTRY--CORPORATE NAME
ind1    012     Type of corporate name entry element
ind2    blank   Undefined
a       NR      Corporate name or jurisdiction name as entry element
b       R       Subordinate unit
c       R       Location of meeting
d       R       Date of meeting or treaty signing
e       R       Relator term
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section/meeting
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume/sequential designation
w       R       Bibliographic record control number
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       R       Institution to which field applies
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

811     R       SERIES ADDED ENTRY--MEETING NAME
ind1    012     Type of meeting name entry element
ind2    blank   Undefined
a       NR      Meeting name or jurisdiction name as entry element
c       R       Location of meeting
d       NR      Date of meeting
e       R       Subordinate unit
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
j       R       Relator term
k       R       Form subheading
l       NR      Language of a work
n       R       Number of part/section/meeting
p       R       Name of part/section of a work
q       NR      Name of meeting following jurisdiction name entry element
s       NR      Version
t       NR      Title of a work
u       NR      Affiliation
v       NR      Volume/sequential designation
w       R       Bibliographic record control number
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
4       R       Relationship
5       R       Institution to which field applies
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

830     R       SERIES ADDED ENTRY--UNIFORM TITLE
ind1    blank   Undefined
ind2    0-9     Nonfiling characters
a       NR      Uniform title
d       R       Date of treaty signing
f       NR      Date of a work
g       R       Miscellaneous information
h       NR      Medium
k       R       Form subheading
l       NR      Language of a work
m       R       Medium of performance for music
n       R       Number of part/section of a work
o       NR      Arranged statement for music
p       R       Name of part/section of a work
r       NR      Key for music
s       NR      Version
t       NR      Title of a work
v       NR      Volume/sequential designation
w       R       Bibliographic record control number
x       NR      International Standard Serial Number
0       R       Authority record control number
3       NR      Materials specified
5       R       Institution to which field applies
6       NR      Linkage
7       NR      Control subfield
8       R       Field link and sequence number

841     NR      HOLDINGS CODED DATA VALUES

842     NR      TEXTUAL PHYSICAL FORM DESIGNATOR

843     R       REPRODUCTION NOTE

844     NR      NAME OF UNIT

845     R       TERMS GOVERNING USE AND REPRODUCTION NOTE

850     R       HOLDING INSTITUTION
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Holding institution
8       R       Field link and sequence number

852     R       LOCATION
ind1    b012345678    Shelving scheme
ind2    b012    Shelving order
a       NR      Location
b       R       Sublocation or collection
c       R       Shelving location
d       R       Former shelving location
e       R       Address
f       R       Coded location qualifier
g       R       Non-coded location qualifier
h       NR      Classification part
i       R       Item part
j       NR      Shelving control number
k       R       Call number prefix
l       NR      Shelving form of title
m       R       Call number suffix
n       NR      Country code
p       NR      Piece designation
q       NR      Piece physical condition
s       R       Copyright article-fee code
t       NR      Copy number
u       R       Uniform Resource Identifier
x       R       Nonpublic note
z       R       Public note
2       NR      Source of classification or shelving scheme
3       NR      Materials specified
6       NR      Linkage
8       NR      Sequence number

853     R       CAPTIONS AND PATTERN--BASIC BIBLIOGRAPHIC UNIT

854     R       CAPTIONS AND PATTERN--SUPPLEMENTARY MATERIAL

855     R       CAPTIONS AND PATTERN--INDEXES

856     R       ELECTRONIC LOCATION AND ACCESS
ind1    b012347    Access method
ind2    b0128   Relationship
a       R       Host name
b       R       Access number
c       R       Compression information
d       R       Path
f       R       Electronic name
h       NR      Processor of request
i       R       Instruction
j       NR      Bits per second
k       NR      Password
l       NR      Logon
m       R       Contact for access assistance
n       NR      Name of location of host
o       NR      Operating system
p       NR      Port
q       NR      Electronic format type
r       NR      Settings
s       R       File size
t       R       Terminal emulation
u       R       Uniform Resource Identifier
v       R       Hours access method available
w       R       Record control number
x       R       Nonpublic note
y       R       Link text
z       R       Public note
2       NR      Access method
3       NR      Materials specified
6       NR      Linkage
8       R       Field link and sequence number

863     R       ENUMERATION AND CHRONOLOGY--BASIC BIBLIOGRAPHIC UNIT

864     R       ENUMERATION AND CHRONOLOGY--SUPPLEMENTARY MATERIAL

865     R       ENUMERATION AND CHRONOLOGY--INDEXES

866     R       TEXTUAL HOLDINGS--BASIC BIBLIOGRAPHIC UNIT

867     R       TEXTUAL HOLDINGS--SUPPLEMENTARY MATERIAL

868     R       TEXTUAL HOLDINGS--INDEXES

876     R       ITEM INFORMATION--BASIC BIBLIOGRAPHIC UNIT

877     R       ITEM INFORMATION--SUPPLEMENTARY MATERIAL

878     R       ITEM INFORMATION--INDEXES

880     R       ALTERNATE GRAPHIC REPRESENTATION
ind1            Same as associated field
ind2            Same as associated field
6       NR      Linkage

882     NR      REPLACEMENT RECORD INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       R       Replacement title
i       R       Explanatory text
w       R       Replacement bibliographic record control number
6       NR      Linkage
8       R       Field link and sequence number

883     R       MACHINE-GENERATED METADATA PROVENANCE
ind1    b01     Type of field
ind2    blank   Undefined
a       NR      Generation process
c       NR      Confidence value
d       NR      Generation date
q       NR      Generation agency
x       NR      Validity end date
u       NR      Uniform Resource Identifier
w       R       Bibliographic record control number
0       R       Authority record control number or standard number
8       R       Field link and sequence number

884     R       DESCRIPTION CONVERSION INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Conversion process
g       NR      Conversion date
k       NR      Identifier of source metadata
q       NR      Conversion agency
u       R       Uniform Resource Identifier

885     R       MATCHING INFORMATION
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Matching information
b       NR      Status of matching and its checking
c       NR      Confidence value
d       NR      Generation date
w       R       Record control number
x       R       Nonpublic note
z       R       Public note
0       R       Authority record control number or standard number
2       NR      Source
5       R       Institution to which field applies

886     R       FOREIGN MARC INFORMATION FIELD
ind1    012     Type of field
ind2    blank   Undefined
a       NR      Tag of the foreign MARC field
b       NR      Content of the foreign MARC field
c-z     NR      Foreign MARC subfield
0-1     NR      Foreign MARC subfield
2       NR      Source of data
4       NR      Source of data
3-9     NR      Source of data

887     R       NON-MARC INFORMATION FIELD
ind1    blank   Undefined
ind2    blank   Undefined
a       NR      Content of non-MARC field
2       NR      Source of data
RULES;
        // @codingStandardsIgnoreEnd
    }
    // }}}
}
// }}}

pear/File/MARC/Subfield.php000064400000013302151732707770011361 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Subfield
/**
 * The File_MARC_Subfield class represents a single subfield in a MARC
 * record field.
 *
 * Represents a subfield within a MARC field and implements all management
 * functions related to a single subfield. This class also implements
 * the possibility of duplicate subfields within a single field, for example
 * 650 _z Test1 _z Test2.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Subfield
{
    // {{{ properties
    /**
     * Subfield code, e.g. _a, _b
     * @var string
     */
    protected $code;

    /**
     * Data contained by the subfield
     * @var string
     */
    protected $data;

    /**
     * Position of the subfield
     * @var int
     */
    protected $position;

    // }}}

    // {{{ Constructor: function __construct()
    /**
     * File_MARC_Subfield constructor
     *
     * Create a new subfield to represent the code and data
     *
     * @param string $code Subfield code
     * @param string $data Subfield data
     */
    function __construct($code, $data)
    {
        $this->code = $code;
        $this->data = $data;
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Destroys the subfield
     */
    function __destruct()
    {
        $this->code = null;
        $this->data = null;
        $this->position = null;
    }
    // }}}

    // {{{ Explicit destructor: function delete()
    /**
     * Destroys the subfield
     *
     * @return true
     */
    function delete()
    {
        $this->__destruct();
    }
    // }}}

    // {{{ getCode()
    /**
     * Return code of the subfield
     *
     * @return string Tag name
     */
    function getCode()
    {
        return (string)$this->code;
    }
    // }}}

    // {{{ getData()
    /**
     * Return data of the subfield
     *
     * @return string data
     */
    function getData()
    {
        return (string)$this->data;
    }
    // }}}

    // {{{ getPosition()
    /**
     * Return position of the subfield
     *
     * @return int data
     */
    function getPosition()
    {
        return $this->position;
    }
    // }}}

    // {{{ __toString()
    /**
     * Return string representation of subfield
     *
     * @return string String representation
     */
    public function __toString()
    {
        $pretty = '[' . $this->getCode() . ']: ' . $this->getData();
        return $pretty;
    }
    // }}}

    // {{{ toRaw()
    /**
     * Return the USMARC representation of the subfield
     *
     * @return string USMARC representation
     */
    function toRaw()
    {
        $result = File_MARC::SUBFIELD_INDICATOR.$this->code.$this->data;
        return (string)$result;
    }
    // }}}

    // {{{ setCode()
    /**
     * Sets code of the subfield
     *
     * @param string $code new code for the subfield
     *
     * @return string code 
     */
    function setCode($code)
    {
        if ($code) {
            // could check more stringently; m/[a-Z]/ or the likes
            $this->code = $code;
        } else {
            // code must be _something_; raise error
            return false;
        }
        return true;
    }
    // }}}

    // {{{ setData()
    /**
     * Sets data of the subfield
     *
     * @param string $data new data for the subfield
     *
     * @return string data
     */
    function setData($data)
    {
        $this->data = $data;
        return true;
    }
    // }}}

    // {{{ setPosition()
    /**
     * Sets position of the subfield
     *
     * @param string $pos new position of the subfield
     *
     * @return void
     */
    function setPosition($pos)
    {
        $this->position = $pos;
    }
    // }}}

    // {{{ isEmpty()
    /**
     * Checks whether the subfield is empty or not
     *
     * @return bool True or false
     */
    function isEmpty()
    {
        // There is data
        if (strlen($this->data)) {
            return false;
        }

        // There is no data
        return true;
    }
    // }}}
}
// }}}

pear/File/MARC/Record.php000064400000052570151732707770011054 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Record
/**
 * Represents a single MARC record
 * 
 * A MARC record contains a leader and zero or more fields held within a
 * linked list structure. Fields are represented by {@link File_MARC_Data_Field}
 * objects.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Record
{

    // {{{ properties
    /**
     * Contains a linked list of {@link File_MARC_Data_Field} objects for
     * this record
     * @var File_MARC_List
     */
    protected $fields;

    /**
     * Record leader
     * @var string
     */
    protected $leader;

    /**
     * Non-fatal warnings generated during parsing
     * @var array
     */
    protected $warnings;

    /**
     * XMLWriter for writing collections
     * 
     * @var XMLWriter
     */
    protected $marcxml;

    /**
     * MARC instance for access to the XML header/footer methods
     * We need this so that we can properly wrap a collection of MARC records.
     * 
     * @var File_MARC
     */
    protected $marc;

    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Start function
     *
     * Set all variables to defaults to create new File_MARC_Record object
     *
     * @param File_MARC $marc MARC record from File_MARC or File_MARCXML
     *
     * @return true 
     */
    function __construct($marc = null)
    {
        $this->fields = new File_MARC_List();
        $this->setLeader(str_repeat(' ', 24));
        if (!$marc) {
            $marc = new File_MARC(null, File_MARC::SOURCE_STRING); // oh the hack
        }
        $this->marc = $marc;
        $this->marcxml = $marc->getXMLWriter();
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Destroys the data field
     */
    function __destruct()
    {
        $this->fields = null;
        $this->warnings = null;
    }
    // }}}

    // {{{ getLeader()
    /**
     * Get MARC leader
     *
     * Returns the leader for the MARC record. No validation
     * on the specified leader is performed.
     *
     * @return string returns the leader
     */
    function getLeader()
    {
        return (string)$this->leader;
    }
    // }}}

    // {{{ setLeader()
    /**
     * Set MARC record leader
     *
     * Sets the leader for the MARC record. No validation
     * on the specified leader is performed.
     *
     * @param string $leader Leader
     *
     * @return string returns the leader
     */
    function setLeader($leader)
    {
        $this->leader = $leader;
        return $this->leader;
    }
    // }}}

    // {{{ appendField()
    /**
     * Appends field to MARC record
     *
     * Adds a {@link File_MARC_Control_Field} or {@link File_MARC_Data_Field}
     * object to the end of the existing list of fields.
     *
     * @param File_MARC_Field $new_field The field to add
     *
     * @return File_MARC_Field The field that was added
     */
    function appendField(File_MARC_Field $new_field)
    {
        /* Append as the last field in the record */
        $this->fields->appendNode($new_field);
        return $new_field;
    }
    // }}}

    // {{{ prependField()
    /**
     * Prepends field to MARC record
     *
     * Adds a {@link File_MARC_Control_Field} or {@link File_MARC_Data_Field}
     * object to the start of to the existing list of fields.
     *
     * @param File_MARC_Field $new_field The field to add
     *
     * @return File_MARC_Field The field that was added
     */
    function prependField(File_MARC_Field $new_field)
    {
        $this->fields->prependNode($new_field);
        return $new_field;
    }
    // }}}

    // {{{ insertField()
    /**
     * Inserts a field in the MARC record relative to an existing field
     *
     * Inserts a {@link File_MARC_Control_Field} or {@link File_MARC_Data_Field}
     * object before or after a specified existing field.
     *
     * <code>
     * // Example: Insert a new field before the first 650 field
     *
     * // Create the new field
     * $subfields[] = new File_MARC_Subfield('a', 'Scott, Daniel.');
     * $new_field = new File_MARC_Data_Field('100', $subfields, 0, null);
     *
     * // Retrieve the target field for our insertion point
     * $subject = $record->getFields('650');
     *
     * // Insert the new field
     * if (is_array($subject)) {
     *     $record->insertField($new_field, $subject[0], true);
     * }
     * elseif ($subject) {
     *     $record->insertField($new_field, $subject, true);
     * }
     * </code>
     *
     * @param File_MARC_Field $new_field      The field to add
     * @param File_MARC_Field $existing_field The target field
     * @param bool            $before         Insert the new field before the existing field if true, after the existing field if false
     *
     * @return File_MARC_Field                The field that was added
     */
    function insertField(File_MARC_Field $new_field, File_MARC_Field $existing_field, $before = false)
    {
        $this->fields->insertNode($new_field, $existing_field, $before);
        return $new_field;
    }
    // }}}

    // {{{ _buildDirectory()
    /**
     * Build record directory
     *
     * Generate the directory of the record according to the current contents
     * of the record.
     *
     * @return array Array ($fields, $directory, $total, $base_address)
     */
    private function _buildDirectory()
    {
        // Vars
        $fields = array();
        $directory = array();
        $data_end = 0;

        foreach ($this->fields as $field) {
            // No empty fields allowed
            if (!$field->isEmpty()) {
                // Get data in raw format
                $str = $field->toRaw();
                $fields[] = $str;

                // Create directory entry
                $len = strlen($str);
                $direntry = sprintf("%03s%04d%05d", $field->getTag(), $len, $data_end);
                $directory[] = $direntry;
                $data_end += $len;
            }
        }

        /**
         * Rules from MARC::Record::USMARC
         */
        $base_address
            = File_MARC::LEADER_LEN +    // better be 24
                (count($directory) * File_MARC::DIRECTORY_ENTRY_LEN) +
                                // all the directory entries
                1;              // end-of-field marker


        $total
            = $base_address +  // stuff before first field
                $data_end +      // Length of the fields
                1;              // End-of-record marker


        return array($fields, $directory, $total, $base_address);
    }
    // }}}

    // {{{ setLeaderLengths()
    /**
     * Set MARC record leader lengths
     *
     * Set the Leader lengths of the record according to defaults specified in
     * {@link http://www.loc.gov/marc/bibliographic/ecbdldrd.html}
     *
     * @param int $record_length Record length
     * @param int $base_address  Base address of data
     *
     * @return bool              Success or failure
     */
    function setLeaderLengths($record_length, $base_address)
    {
        if (!is_int($record_length)) {
            return false;
        }
        if (!is_int($base_address)) {
            return false;
        }

        // Set record length
        $this->setLeader(substr_replace($this->getLeader(), sprintf("%05d", $record_length), 0, 5));
        $this->setLeader(substr_replace($this->getLeader(), sprintf("%05d", $base_address), File_MARC::DIRECTORY_ENTRY_LEN, 5));
        $this->setLeader(substr_replace($this->getLeader(), '22', 10, 2));
        $this->setLeader(substr_replace($this->getLeader(), '4500', 20, 4));

        if (strlen($this->getLeader()) > File_MARC::LEADER_LEN) {
            // Avoid incoming leaders that are mangled to be overly long
            $this->setLeader(substr($this->getLeader(), 0, File_MARC::LEADER_LEN));
            $this->addWarning("Input leader was too long; truncated to " . File_MARC::LEADER_LEN . " characters");
        }
        return true;
    }
    // }}}

    // {{{ getField()
    /**
     * Return the first {@link File_MARC_Data_Field} or
     * {@link File_MARC_Control_Field} object that matches the specified tag
     * name. Returns false if no match is found.
     *
     * @param string $spec tag name
     * @param bool   $pcre if true, then match as a regular expression
     *
     * @return {@link File_MARC_Data_Field}|{@link File_MARC_Control_Field} first field that matches the requested tag name
     */
    function getField($spec = null, $pcre = null)
    {
        foreach ($this->fields as $field) {
            if (($pcre
                && preg_match("/$spec/", $field->getTag()))
                || (!$pcre
                && $spec == $field->getTag())
            ) {
                return $field;
            }
        }
        return false;
    }
    // }}}

    // {{{ getFields()
    /**
     * Return an array or {@link File_MARC_List} containing all
     * {@link File_MARC_Data_Field} or  {@link File_MARC_Control_Field} objects
     * that match the specified tag name. If the tag name is omitted all
     * fields are returned.
     *
     * @param string $spec tag name
     * @param bool   $pcre if true, then match as a regular expression
     *
     * @return File_MARC_List|array {@link File_MARC_Data_Field} or
     * {@link File_MARC_Control_Field} objects that match the requested tag name
     */
    function getFields($spec = null, $pcre = null)
    {
        if (!$spec) {
            return $this->fields;
        }

        // Okay, we're actually looking for something specific
        $matches = array();
        foreach ($this->fields as $field) {
            if (($pcre && preg_match("/$spec/", $field->getTag()))
                || (!$pcre && $spec == $field->getTag())
            ) {
                $matches[] = $field;
            }
        }
        return $matches;
    }
    // }}}

    // {{{ deleteFields()
    /**
     * Delete all occurrences of a field matching a tag name from the record.
     *
     * @param string $tag  tag for the fields to be deleted
     * @param bool   $pcre if true, then match as a regular expression
     *
     * @return int         number of fields that were deleted
     */
    function deleteFields($tag, $pcre = null)
    {
        $cnt = 0;
        foreach ($this->getFields() as $field) {
            if (($pcre
                && preg_match("/$tag/", $field->getTag()))
                || (!$pcre
                && $tag == $field->getTag())
            ) {
                $field->delete();
                $cnt++;
            }
        }
        return $cnt;
    }
    // }}}

    // {{{ addWarning()
    /**
     * Add a warning to the MARC record that something non-fatal occurred during
     * parsing.
     *
     * @param string $warning warning message
     *
     * @return true
     */
    public function addWarning($warning)
    {
        $this->warnings[] = $warning;
    }
    // }}}

    // {{{ getWarnings()
    /**
     * Return the array of warnings from the MARC record.
     *
     * @return array warning messages
     */
    public function getWarnings()
    {
        return $this->warnings;
    }
    // }}}

    // {{{ output methods
    /**
     * ========== OUTPUT METHODS ==========
     */

    // {{{ toRaw()
    /**
     * Return the record in raw MARC format.
     *
     * If you have modified an existing MARC record or created a new MARC
     * record, use this method to save the record for use in other programs
     * that accept the MARC format -- for example, your integrated library
     * system.
     *
     * <code>
     * // Example: Modify a record and save the output to a file
     * $record->deleteFields('650');
     *
     * // Now that the record has no subject fields, save it to disk
     * fopen($file, '/home/dan/no_subject.mrc', 'w');
     * fwrite($file, $record->toRaw());
     * fclose($file);
     * </code>
     *
     * @return string Raw MARC data
     */
    function toRaw()
    {
        list($fields, $directory, $record_length, $base_address) = $this->_buildDirectory();
        $this->setLeaderLengths($record_length, $base_address);

        /**
         * Glue together all parts
         */
        return $this->getLeader().implode("", $directory).File_MARC::END_OF_FIELD.implode("", $fields).File_MARC::END_OF_RECORD;
    }
    // }}}

    // {{{ __toString()
    /**
     * Return the MARC record in a pretty printed string
     *
     * This method produces an easy-to-read textual display of a MARC record.
     *
     * The structure is roughly:
     * <tag> <ind1> <ind2> _<code><data>
     *                     _<code><data>
     *
     * @return string Formatted representation of MARC record
     */
    function __toString()
    {
        // Begin output
        $formatted = "LDR " . $this->getLeader() . "\n";
        foreach ($this->fields as $field) {
            if (!$field->isEmpty()) {
                $formatted .= $field->__toString() . "\n";
            }
        }
        return $formatted;
    }
    // }}}

    // {{{ toJSON()
    /**
     * Return the MARC record in JSON format
     *
     * This method produces a JSON representation of a MARC record. The input
     * encoding must be UTF8, otherwise the returned values will be corrupted.
     *
     * @return string          representation of MARC record in JSON format
     *
     * @todo Fix encoding input / output issues (PHP 6.0 required?)
     */
    function toJSON()
    {
        $json = new StdClass();
        $json->leader = utf8_encode($this->getLeader());

        /* Start fields */
        $fields = array();
        foreach ($this->fields as $field) {
            if (!$field->isEmpty()) {
                switch(get_class($field)) {
                case "File_MARC_Control_Field":
                    $fields[] = array(utf8_encode($field->getTag()) => utf8_encode($field->getData()));
                    break;

                case "File_MARC_Data_Field":
                    $subs = array();
                    foreach ($field->getSubfields() as $sf) {
                        $subs[] = array(utf8_encode($sf->getCode()) => utf8_encode($sf->getData()));
                    }
                    $contents = new StdClass();
                    $contents->ind1 = utf8_encode($field->getIndicator(1));
                    $contents->ind2 = utf8_encode($field->getIndicator(2));
                    $contents->subfields = $subs;
                    $fields[] = array(utf8_encode($field->getTag()) => $contents);
                    break;
                }
            }
        }
        /* End fields and record */

        $json->fields = $fields;
        $json_rec = json_encode($json);
        // Required because json_encode() does not let us stringify integer keys
        return preg_replace('/("subfields":)(.*?)\["([^\"]+?)"\]/', '\1\2{"0":"\3"}', $json_rec);
    }

    // }}}

    // {{{ toJSONHash()
    /**
     * Return the MARC record in Bill Dueber's MARC-HASH JSON format
     *
     * This method produces a JSON representation of a MARC record as defined
     * at http://robotlibrarian.billdueber.com/new-interest-in-marc-hash-json/
     * The input * encoding must be UTF8, otherwise the returned values will
     * be corrupted.
     *
     * @return string          representation of MARC record in JSON format
     *
     * @todo Fix encoding input / output issues (PHP 6.0 required?)
     */
    function toJSONHash()
    {
        $json = new StdClass();
        $json->type = "marc-hash";
        $json->version = array(1, 0);
        $json->leader = utf8_encode($this->getLeader());

        /* Start fields */
        $fields = array();
        foreach ($this->fields as $field) {
            if (!$field->isEmpty()) {
                switch(get_class($field)) {
                case "File_MARC_Control_Field":
                    $fields[] = array(utf8_encode($field->getTag()), utf8_encode($field->getData()));
                    break;

                case "File_MARC_Data_Field":
                    $subs = array();
                    foreach ($field->getSubfields() as $sf) {
                        $subs[] = array(utf8_encode($sf->getCode()), utf8_encode($sf->getData()));
                    }
                    $contents = array(
                        utf8_encode($field->getTag()),
                        utf8_encode($field->getIndicator(1)),
                        utf8_encode($field->getIndicator(2)),
                        $subs
                    );
                    $fields[] = $contents;
                    break;
                }
            }
        }
        /* End fields and record */

        $json->fields = $fields;
        return json_encode($json);
    }

    // }}}


    // {{{ toXML()
    /**
     * Return the MARC record in MARCXML format
     *
     * This method produces an XML representation of a MARC record that
     * attempts to adhere to the MARCXML standard documented at
     * http://www.loc.gov/standards/marcxml/
     *
     * @param string $encoding output encoding for the MARCXML record
     * @param bool   $indent   pretty-print the MARCXML record
     * @param bool   $single   wrap the <record> element in a <collection> element
     *
     * @return string          representation of MARC record in MARCXML format
     *
     * @todo Fix encoding input / output issues (PHP 6.0 required?)
     */
    function toXML($encoding = "UTF-8", $indent = true, $single = true)
    {
        $this->marcxml->setIndent($indent);
        if ($single) {
            $this->marcxml->startElement("collection");
            $this->marcxml->writeAttribute("xmlns", "http://www.loc.gov/MARC21/slim");
            $this->marcxml->startElement("record");
        } else {
            $this->marcxml->startElement("record");
            $this->marcxml->writeAttribute("xmlns", "http://www.loc.gov/MARC21/slim");
        }
        

        // MARCXML schema has some strict requirements
        // We'll set reasonable defaults to avoid invalid MARCXML
        $xmlLeader = $this->getLeader();

        // Record status
        if ($xmlLeader[5] == " ") {
            // Default to "n" (new record)
            $xmlLeader[5] = "n";
        }

        // Type of record
        if ($xmlLeader[6] == " ") {
            // Default to "a" (language material)
            $xmlLeader[6] = "a";
        }

        $this->marcxml->writeElement("leader", $xmlLeader);

        foreach ($this->fields as $field) {
            if (!$field->isEmpty()) {
                switch(get_class($field)) {
                case "File_MARC_Control_Field":
                    $this->marcxml->startElement("controlfield");
                    $this->marcxml->writeAttribute("tag", $field->getTag());
                    $this->marcxml->text($field->getData());
                    $this->marcxml->endElement(); // end control field
                    break;

                case "File_MARC_Data_Field":
                    $this->marcxml->startElement("datafield");
                    $this->marcxml->writeAttribute("tag", $field->getTag());
                    $this->marcxml->writeAttribute("ind1", $field->getIndicator(1));
                    $this->marcxml->writeAttribute("ind2", $field->getIndicator(2));
                    foreach ($field->getSubfields() as $subfield) {
                        $this->marcxml->startElement("subfield");
                        $this->marcxml->writeAttribute("code", $subfield->getCode());
                        $this->marcxml->text($subfield->getData());
                        $this->marcxml->endElement(); // end subfield
                    }
                    $this->marcxml->endElement(); // end data field
                    break;
                }
            }
        }

        $this->marcxml->endElement(); // end record
        if ($single) {
            $this->marcxml->endElement(); // end collection
            $this->marcxml->endDocument();
        }
        return $this->marcxml->outputMemory();
    }
    // }}}

}
// }}}

pear/File/MARC/Field.php000064400000014714151732707770010657 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

require_once 'File/MARC/List.php';

// {{{ class File_MARC_Field extends File_MARC_List
/**
 * The File_MARC_Field class is expected to be extended to reflect the
 * requirements of control and data fields.
 *
 * Every MARC field contains a tag name.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Field extends File_MARC_List
{

    // {{{ properties
    /**
     * The tag name of the Field
     * @var string
     */
    protected $tag;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * File_MARC_Field constructor
     *
     * Create a new {@link File_MARC_Field} object from passed arguments. We
     * define placeholders for the arguments required by child classes.
     *
     * @param string $tag       tag
     * @param string $subfields placeholder for subfields or control data
     * @param string $ind1      placeholder for first indicator
     * @param string $ind2      placeholder for second indicator
     */
    function __construct($tag, $subfields = null, $ind1 = null, $ind2 = null) 
    {
        $this->tag = $tag;

        // Check if valid tag
        if (!preg_match("/^[0-9A-Za-z]{3}$/", $tag)) {
             $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_TAG], array("tag" => $tag));
             throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_TAG);
        }

    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Destroys the data field
     */
    function __destruct()
    {
        $this->tag = null;
    }
    // }}}

    // {{{ getTag()
    /**
     * Returns the tag for this {@link File_MARC_Field} object
     *
     * @return string returns the tag number of the field
     */
    function getTag()
    {
        return (string)$this->tag;
    }
    // }}}

    // {{{ setTag()
    /**
     * Sets the tag for this {@link File_MARC_Field} object
     *
     * @param string $tag new value for the tag
     *
     * @return string returns the tag number of the field
     */
    function setTag($tag)
    {
        $this->tag = $tag;
        return $this->getTag();
    }
    // }}}

    // {{{ isEmpty()
    /**
     * Is empty
     *
     * Checks if the field is empty.
     *
     * @return bool Returns true if the field is empty, otherwise false
     */
    function isEmpty()
    {
        if ($this->getTag()) {
            return false;
        }
        // It is empty
        return true;
    }
    // }}}

    // {{{ isControlField()
    /**
     * Is control field
     *
     * Checks if the field is a control field.
     *
     * @return bool Returns true if the field is a control field, otherwise false
     */
    function isControlField()
    {
        if (get_class($this) == 'File_MARC_Control_Field') {
            return true;
        }
        return false;
    }
    // }}}

    // {{{ isDataField()
    /**
     * Is data field
     *
     * Checks if the field is a data field.
     *
     * @return bool Returns true if the field is a data field, otherwise false
     */
    function isDataField()
    {
        if (get_class($this) == 'File_MARC_Data_Field') {
            return true;
        }
        return false;
    }
    // }}}


    /**
     * ========== OUTPUT METHODS ==========
     */

    // {{{ __toString()
    /**
     * Return Field formatted
     *
     * Return Field as a formatted string.
     *
     * @return string Formatted output of Field
     */
    function __toString()
    {
        return (string)$this->getTag();
    }
    // }}}

    // {{{ toRaw()
    /**
     * Return field in raw MARC format (stub)
     *
     * Return the field formatted in raw MARC for saving into MARC files. This
     * stub method is extended by the child classes.
     *
     * @return bool Raw MARC
     */
    function toRaw()
    {
        return false;
    }
    // }}}

    // {{{ formatField()
    /**
     * Pretty print a MARC_Field object without tags, indicators, etc.
     *
     * @param array $exclude Subfields to exclude from formatted output
     * 
     * @return string Returns the formatted field data
     */

    function formatField($exclude = array('2'))
    {
        if ($this->isControlField()) {
            return $this->getData();
        } else {
            $out = '';
            foreach ($this->getSubfields() as $subfield) {
                if (substr($this->getTag(), 0, 1) == '6' and (in_array($subfield->getCode(), array('v','x','y','z')))) {
                    $out .= ' -- ' . $subfield->getData();
                } elseif (!in_array($subfield->getCode(), $exclude)) {
                    $out .= ' ' . $subfield->getData();
                }
            }
            return trim($out);
        }
    }
    // }}}
}
// }}}

pear/File/MARC/Exception.php000064400000016606151732707770011574 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Exception extends PEAR_Exception
/**
 * The File_MARC_Exception class enables error-handling
 * for the File_MARC package.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Exception extends PEAR_Exception
{
    // {{{ Error codes
    /**
     * File could not be opened
     */
    const ERROR_INVALID_FILE = -1;

    /**
     * User passed an unknown SOURCE_ constant
     */
    const ERROR_INVALID_SOURCE = -2;

    /**
     * MARC record ended with an invalid terminator
     */
    const ERROR_INVALID_TERMINATOR = -3;

    /**
     * No directory was found for the MARC record
     */
    const ERROR_NO_DIRECTORY = -4;

    /**
     * An entry in the MARC directory was not 12 bytes
     */
    const ERROR_INVALID_DIRECTORY_LENGTH = -5;

    /**
     * An entry in the MARC directory specified an invalid tag
     */
    const ERROR_INVALID_DIRECTORY_TAG = -6;

    /**
     * An entry in the MARC directory specified an invalid tag length
     */
    const ERROR_INVALID_DIRECTORY_TAG_LENGTH = -7;

    /**
     * An entry in the MARC directory specified an invalid field offset
     */
    const ERROR_INVALID_DIRECTORY_OFFSET = -8;

    /**
     * An entry in the MARC directory runs past the end of the record
     */
    const ERROR_INVALID_DIRECTORY = -9;

    /**
     * A field does not end with the expected end-of-field character
     */
    const ERROR_FIELD_EOF = -10;

    /**
     * A field has invalid indicators
     */
    const ERROR_INVALID_INDICATORS = -11;

    /**
     * A subfield is defined, but has no data
     */
    const ERROR_EMPTY_SUBFIELD = -12;

    /**
     * An indicator other than 1 or 2 was requested
     */
    const ERROR_INVALID_INDICATOR_REQUEST = -13;

    /**
     * An invalid mode for adding a field was specified
     */
    const ERROR_INSERTFIELD_MODE = -14;

    /**
     * An invalid object was passed instead of a File_MARC_Field object
     */
    const ERROR_INVALID_FIELD = -15;

    /**
     * An invalid object was passed instead of a File_MARC_Subfield object
     */
    const ERROR_INVALID_SUBFIELD = -16;

    /**
     * An invalid mode for adding a subfield was specified
     */
    const ERROR_INSERTSUBFIELD_MODE = -17;

    /**
     * The length in the MARC leader does not match the actual record length
     */
    const ERROR_INCORRECT_LENGTH = -18;

    /**
     * The length field in the leader was less than five characters long
     */
    const ERROR_MISSING_LENGTH = -19;

    /**
     * A five-digit length could not be found in the MARC leader
     */
    const ERROR_NONNUMERIC_LENGTH = -20;

    /**
     * Tag does not adhere to MARC standards
     */
    const ERROR_INVALID_TAG = -21;

    /**
     * A field has invalid indicators
     */
    const ERROR_INVALID_INDICATOR = -22;
    // }}}

    // {{{ error messages
    public static $messages = array(
        self::ERROR_EMPTY_SUBFIELD => 'No subfield data found in tag "%tag%"', 
        self::ERROR_FIELD_EOF => 'Field for tag "%tag%" does not end with an end of field character', 
        self::ERROR_INCORRECT_LENGTH => 'Invalid record length: Leader says "%record_length%" bytes; actual record length is "%actual%"', 
        self::ERROR_INSERTFIELD_MODE => 'insertField() mode "%mode%" was not recognized', 
        self::ERROR_INSERTSUBFIELD_MODE => 'insertSubfield() mode "%mode%" was not recognized', 
        self::ERROR_INVALID_DIRECTORY => 'Directory entry for tag "%tag%" runs past the end of the record', 
        self::ERROR_INVALID_DIRECTORY_LENGTH => 'Invalid directory length', 
        self::ERROR_INVALID_DIRECTORY_OFFSET => 'Invalid offset "%offset%" for tag "%tag%" in directory', 
        self::ERROR_INVALID_DIRECTORY_TAG => 'Invalid tag "%tag%" in directory', 
        self::ERROR_INVALID_DIRECTORY_TAG_LENGTH => 'Invalid length "%len%" in directory for tag "%tag%"', 
        self::ERROR_INVALID_FIELD => 'Specified field must be a File_MARC_Data_Field or File_MARC_Control_Field object, but was "%field%"', 
        self::ERROR_INVALID_FILE => 'Invalid input file "%filename%"', 
        self::ERROR_INVALID_INDICATOR_REQUEST => 'Attempt to access indicator "%indicator%" failed; 1 and 2 are the only valid indicators', 
        self::ERROR_INVALID_INDICATORS => 'Invalid indicators "%indicators%" forced to blanks for tag "%tag%"', 
        self::ERROR_INVALID_SOURCE => "Invalid source for MARC records", 
        self::ERROR_INVALID_SUBFIELD => 'Specified field must be a File_MARC_Subfield object, but was "%class%"', 
        self::ERROR_INVALID_TAG => 'Tag "%tag%" is not a valid tag.', 
        self::ERROR_INVALID_TERMINATOR => 'Invalid record terminator', 
        self::ERROR_MISSING_LENGTH => "Couldn't find record length", 
        self::ERROR_NO_DIRECTORY => 'No directory found', 
        self::ERROR_NONNUMERIC_LENGTH => 'Record length "%record_length%" is not numeric',
        self::ERROR_INVALID_INDICATOR => 'Illegal indicator "%indicator%" in field "%tag%" forced to blank', 
    );
    // }}}

    // {{{ formatError()
    /**
     * Replaces placeholder tokens in an error message with actual values.
     *
     * This method enables you to internationalize the messages for the
     * File_MARC class by simply replacing the File_MARC_Exception::$messages
     * array with translated values for the messages.
     *
     * @param string $message     Error message containing placeholders
     * @param array  $errorValues Actual values to substitute for placeholders
     *
     * @return string             Formatted message
     */
    public static function formatError($message, $errorValues)
    {
        foreach ($errorValues as $token => $value) {
            $message = preg_replace("/\%$token\%/", $value, $message);
        }
        return $message;
    }
    // }}}
}
// }}}

pear/File/MARC/List.php000064400000015550151732707770010546 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 *
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_List extends SplDoublyLinkedList
/**
 * The File_MARC_List class extends the SplDoublyLinkedList class
 * to override the key() method in a meaningful way for foreach() iterators.
 *
 * For the list of {@link File_MARC_Field} objects in a {@link File_MARC_Record}
 * object, the key() method returns the tag name of the field.
 *
 * For the list of {@link File_MARC_Subfield} objects in a {@link
 * File_MARC_Data_Field} object, the key() method returns the code of
 * the subfield.
 *
 * <code>
 * // Iterate through the fields in a record with key=>value iteration
 * foreach ($record->getFields() as $tag=>$value) {
 *     print "$tag: ";
 *     if ($value instanceof File_MARC_Control_Field) {
 *         print $value->getData();
 *     }
 *     else {
 *         // Iterate through the subfields in this data field
 *         foreach ($value->getSubfields() as $code=>$subdata) {
 *             print "_$code";
 *         }
 *     }
 *     print "\n";
 * }
 * </code>
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_List extends SplDoublyLinkedList
{

    // {{{ properties
    /**
     * Position of the subfield
     * @var int
     */
    protected $position;

    // }}}

    // {{{ key()
    /**
     * Returns the tag for a {@link File_MARC_Field} object, or the code
     * for a {@link File_MARC_Subfield} object.
     *
     * This method enables you to use a foreach iterator to retrieve
     * the tag or code as the key for the iterator.
     *
     * @return string returns the tag or code
     */
    function key()
    {
        if ($this->current() instanceof File_MARC_Field) {
            return $this->current()->getTag();
        } elseif ($this->current() instanceof File_MARC_Subfield) {
            return $this->current()->getCode();
        }
        return false;
    }
    // }}}

    // {{{ function insertNode()
    /**
     * Inserts a node into the linked list, based on a reference node that
     * already exists in the list.
     *
     * @param mixed $new_node      New node to add to the list
     * @param mixed $existing_node Reference position node
     * @param bool  $before        Insert new node before or after the existing node
     *
     * @return bool Success or failure
     **/
    public function insertNode($new_node, $existing_node, $before = false)
    {
        $pos = 0;
        $exist_pos = $existing_node->getPosition();
        $this->rewind();

        // Now add the node according to the requested mode
        switch ($before) {

        case true:
            $this->add($exist_pos, $new_node);
            break;

        // after
        case false:
            if ($this->offsetExists($exist_pos + 1)) {
                $this->add($exist_pos + 1, $new_node);
            } else {
                $this->appendNode($new_node);
                return true;
            }
            break;
        }

        // Fix positions
        $this->rewind();
        while ($n = $this->current()) {
            $n->setPosition($pos);
            $this->next();
            $pos++;
        }

        return true;
    }
    // }}}

    // {{{ function appendNode()
    /**
     * Adds a node onto the linked list.
     *
     * @param mixed $new_node New node to add to the list
     *
     * @return void
     **/
    public function appendNode($new_node)
    {
        $pos = $this->count();
        $new_node->setPosition($pos);
        $this->push($new_node);
    }
    // }}}

    // {{{ function prependNode()
    /**
     * Adds a node to the start of the linked list.
     *
     * @param mixed $new_node New node to add to the list
     *
     * @return void
     **/
    public function prependNode($new_node)
    {
        $this->insertNode($new_node, $this->bottom(), true);
    }
    // }}}

    // {{{ function deleteNode()
    /**
     * Deletes a node from the linked list.
     *
     * @param mixed $node Node to delete from the list
     *
     * @return void
     **/
    public function deleteNode($node)
    {
        $target_pos = $node->getPosition();
        $this->rewind();
        $pos = 0;

        // Omit target node and adjust pos of remainder
        $done = false;
        try {
            while ($n = $this->current()) {
                if ($pos == $target_pos && !$done) {
                    $done = true;
                    $this->next();
                    $this->offsetUnset($pos);
                } elseif ($pos >= $target_pos) {
                    $n->setPosition($pos);
                    $pos++;
                    $this->next();
                } else {
                    $pos++;
                    $this->next();
                }
            }
        }
        catch (Exception $e) {
            // no-op - shift() throws an exception, sigh
        }

    }
    // }}}

    // {{{ setPosition()
    /**
     * Sets position of the subfield
     *
     * @param string $pos new position of the subfield
     *
     * @return void
     */
    function setPosition($pos)
    {
        $this->position = $pos;
    }
    // }}}

    // {{{ getPosition()
    /**
     * Return position of the subfield
     *
     * @return int data
     */
    function getPosition()
    {
        return $this->position;
    }
    // }}}

}
// }}}

pear/File/MARC/Data_Field.php000064400000035501151732707770011605 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 *
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Data_Field extends File_MARC_Field
/**
 * The File_MARC_Data_Field class represents a single field in a MARC record.
 *
 * A MARC data field consists of a tag name, two indicators which may be null,
 * and zero or more subfields represented by {@link File_MARC_Subfield} objects.
 * Subfields are held within a linked list structure.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Data_Field extends File_MARC_Field
{

    // {{{ properties
    /**
     * Value of the first indicator
     * @var string
     */
    protected $ind1;

    /**
     * Value of the second indicator
     * @var string
     */
    protected $ind2;

    /**
     * Linked list of subfields
     * @var File_MARC_List
     */
    protected $subfields;

    // }}}

    // {{{ Constructor: function __construct()
    /**
     * {@link File_MARC_Data_Field} constructor
     *
     * Create a new {@link File_MARC_Data_Field} object. The only required
     * parameter is a tag. This enables programs to build up new fields
     * programmatically.
     *
     * <code>
     * // Example: Create a new data field
     *
     * // We can optionally create an array of subfields first
     * $subfields[] = new File_MARC_Subfield('a', 'Scott, Daniel.');
     *
     * // Create the new 100 field complete with a _a subfield and an indicator
     * $new_field = new File_MARC_Data_Field('100', $subfields, 0, null);
     * </code>
     *
     * @param string $tag       tag
     * @param array  $subfields array of {@link File_MARC_Subfield} objects
     * @param string $ind1      first indicator
     * @param string $ind2      second indicator
     */
    function __construct($tag, array $subfields = null, $ind1 = null, $ind2 = null)
    {
        $this->subfields = new File_MARC_List();

        parent::__construct($tag);

        $this->ind1 = $this->_validateIndicator($ind1);
        $this->ind2 = $this->_validateIndicator($ind2);

        // we'll let users add subfields after if they so desire
        if ($subfields) {
            $this->addSubfields($subfields);
        }
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Destroys the data field
     */
    function __destruct()
    {
        $this->subfields = null;
        $this->ind1 = null;
        $this->ind2 = null;
        parent::__destruct();
    }
    // }}}

    // {{{ Explicit destructor: function delete()
    /**
     * Destroys the data field
     *
     * @return true
     */
    function delete()
    {
        $this->__destruct();
    }
    // }}}

    // {{{ protected function _validateIndicator()
    /**
     * Validates an indicator field
     *
     * Validates the value passed in for an indicator. This routine ensures
     * that an indicator is a single character. If the indicator value is null,
     * then this method returns a single character.
     *
     * If the indicator value contains more than a single character, this
     * throws an exception.
     *
     * @param string $indicator Value of the indicator to be validated
     *
     * @return string Returns the indicator, or space if the indicator was null
     */
    private function _validateIndicator($indicator)
    {
        if ($indicator == null) {
            $indicator = ' ';
        } elseif (strlen($indicator) > 1) {
            $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_INDICATOR], array("tag" => $this->getTag(), "indicator" => $indicator));
            throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_INDICATOR);
        }
        return $indicator;
    }
    // }}}

    // {{{ appendSubfield()
    /**
     * Appends subfield to subfield list
     *
     * Adds a File_MARC_Subfield object to the end of the existing list
     * of subfields.
     *
     * @param File_MARC_Subfield $new_subfield The subfield to add
     *
     * @return File_MARC_Subfield the new File_MARC_Subfield object
     */
    function appendSubfield(File_MARC_Subfield $new_subfield)
    {
        /* Append as the last subfield in the field */
        $this->subfields->appendNode($new_subfield);
    }
    // }}}

    // {{{ prependSubfield()
    /**
     * Prepends subfield to subfield list
     *
     * Adds a File_MARC_Subfield object to the  start of the existing list
     * of subfields.
     *
     * @param File_MARC_Subfield $new_subfield The subfield to add
     *
     * @return File_MARC_Subfield the new File_MARC_Subfield object
     */
    function prependSubfield(File_MARC_Subfield $new_subfield)
    {
        $this->subfields->unshift($new_subfield);
        return $new_subfield;
    }
    // }}}

    // {{{ insertSubfield()
    /**
     * Inserts a field in the MARC record relative to an existing field
     *
     * Inserts a {@link File_MARC_Subfield} object before or after an existing
     * subfield.
     *
     * @param File_MARC_Subfield $new_field      The subfield to add
     * @param File_MARC_Subfield $existing_field The target subfield
     * @param bool               $before         Insert the subfield before the existing subfield if true; after the existing subfield if false
     *
     * @return File_MARC_Subfield                The new subfield
     */
    function insertSubfield(File_MARC_Subfield $new_field, File_MARC_Subfield $existing_field, $before = false)
    {
        $this->subfields->insertNode($new_field, $existing_field, $before);
        return $new_field;
    }
    // }}}

    // {{{ addSubfields()
    /**
     * Adds an array of subfields to a {@link File_MARC_Data_Field} object
     *
     * Appends subfields to existing subfields in the order in which
     * they appear in the array. For finer grained control of the subfield
     * order, use {@link appendSubfield()}, {@link prependSubfield()},
     * or {@link insertSubfield()} to add each subfield individually.
     *
     * @param array $subfields array of {@link File_MARC_Subfield} objects
     *
     * @return int returns the number of subfields that were added
     */
    function addSubfields(array $subfields)
    {
        /*
         * Just in case someone passes in a single File_MARC_Subfield
         * instead of an array
         */
        if ($subfields instanceof File_MARC_Subfield) {
            $this->appendSubfield($subfields);
            return 1;
        }

        // Add subfields
        $cnt = 0;
        foreach ($subfields as $subfield) {
            $this->appendSubfield($subfield);
            $cnt++;
        }

        return $cnt;
    }
    // }}}

    // {{{ deleteSubfield()
    /**
     * Delete a subfield from the field.
     *
     * @param File_MARC_Subfield $subfield The subfield to delete
     *
     * @return void
     */
    function deleteSubfield(File_MARC_Subfield $subfield)
    {
        $this->subfields->deleteNode($subfield);
    }
    // }}}

    // {{{ getIndicator()
    /**
     * Get the value of an indicator
     *
     * @param int $ind number of the indicator (1 or 2)
     *
     * @return string returns indicator value if it exists, otherwise false
     */
    function getIndicator($ind)
    {
        if ($ind == 1) {
            return (string)$this->ind1;
        } elseif ($ind == 2) {
            return (string)$this->ind2;
        } else {
             $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_INDICATOR_REQUEST], array("indicator" => $indicator));
             throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_INDICATOR_REQUEST);
        }
        return false;
    }
    // }}}

    // {{{ setIndicator()
    /**
     * Set the value of an indicator
     *
     * @param int    $ind   number of the indicator (1 or 2)
     * @param string $value value of the indicator
     *
     * @return string       returns indicator value if it exists, otherwise false
     */
    function setIndicator($ind, $value)
    {
        switch ($ind) {

        case 1:
            $this->ind1 = $this->_validateIndicator($value);
            break;

        case 2:
            $this->ind2 = $this->_validateIndicator($value);
            break;

        default:
            $errorMessage = File_MARC_Exception::formatError(File_MARC_Exception::$messages[File_MARC_Exception::ERROR_INVALID_INDICATOR_REQUEST], array("indicator" => $ind));
            throw new File_MARC_Exception($errorMessage, File_MARC_Exception::ERROR_INVALID_INDICATOR_REQUEST);
            return false;
        }

        return $this->getIndicator($ind);
    }
    // }}}

    // {{{ getSubfield()
    /**
     * Returns the first subfield that matches a requested code.
     *
     * @param string $code subfield code for which the
     * {@link File_MARC_Subfield} is retrieved
     * @param bool   $pcre if true, then match as a regular expression
     *
     * @return File_MARC_Subfield returns the first subfield that matches
     * $code, or false if no codes match $code
     */
    function getSubfield($code = null, $pcre = null)
    {
        // iterate merrily through the subfields looking for the requested code
        foreach ($this->subfields as $sf) {
            if (($pcre
                && preg_match("/$code/", $sf->getCode()))
                || (!$pcre
                && $code == $sf->getCode())
            ) {
                return $sf;
            }
        }

        // No matches were found
        return false;
    }
    // }}}

    // {{{ getSubfields()
    /**
     * Returns an array of subfields that match a requested code,
     * or a {@link File_MARC_List} that contains all of the subfields
     * if the requested code is null.
     *
     * @param string $code subfield code for which the
     * {@link File_MARC_Subfield} is retrieved
     * @param bool   $pcre if true, then match as a regular expression
     *
     * @return File_MARC_List|array returns a linked list of all subfields
     * if $code is null, an array of {@link File_MARC_Subfield} objects if
     * one or more subfields match, or an empty array if no codes match $code
     */
    function getSubfields($code = null, $pcre = null)
    {
        $results = array();

        // return all subfields if no specific subfields were requested
        if ($code === null) {
            $results = $this->subfields;
            return $results;
        }

        // iterate merrily through the subfields looking for the requested code
        foreach ($this->subfields as $sf) {
            if (($pcre
                && preg_match("/$code/", $sf->getCode()))
                || (!$pcre
                && $code == $sf->getCode())
            ) {
                $results[] = $sf;
            }
        }
        return $results;
    }
    // }}}

    // {{{ isEmpty()
    /**
     * Checks if the field is empty.
     *
     * Checks if the field is empty. If the field has at least one subfield
     * with data, it is not empty.
     *
     * @return bool Returns true if the field is empty, otherwise false
     */
    function isEmpty()
    {
        // If $this->subfields is null, we must have deleted it
        if (!$this->subfields) {
            return true;
        }

        // Iterate through the subfields looking for some data
        foreach ($this->subfields as $subfield) {
            // Check if subfield has data
            if (!$subfield->isEmpty()) {
                return false;
            }
        }
        // It is empty
        return true;
    }
    // }}}

    /**
     * ========== OUTPUT METHODS ==========
     */

    // {{{ __toString()
    /**
     * Return Field formatted
     *
     * Return Field as a formatted string.
     *
     * @return string Formatted output of Field
     */
    function __toString()
    {
        // Variables
        $lines = array();
        // Process tag and indicators
        $pre = sprintf("%3s %1s%1s", $this->tag, $this->ind1, $this->ind2);

        // Process subfields
        foreach ($this->subfields as $subfield) {
            $lines[] = sprintf("%6s _%1s%s", $pre, $subfield->getCode(), $subfield->getData());
            $pre = "";
        }

        return join("\n", $lines);
    }
    // }}}

    // {{{ toRaw()
    /**
     * Return Field in Raw MARC
     *
     * Return the Field formatted in Raw MARC for saving into MARC files
     *
     * @return string Raw MARC
     */
    function toRaw()
    {
        $subfields = array();
        foreach ($this->subfields as $subfield) {
            if (!$subfield->isEmpty()) {
                $subfields[] = $subfield->toRaw();
            }
        }
        return (string)$this->ind1.$this->ind2.implode("", $subfields).File_MARC::END_OF_FIELD;
    }
    // }}}

    // {{{ getContents()
    /**
     * Return fields data content as joined string
     *
     * Return all the fields data content as a joined string
     *
     * @param  string $joinChar A string used to join the data conntent.
     * Default is an empty string
     *
     * @return string Joined string
     */
    function getContents($joinChar = '')
    {
        $contents = array();
        foreach($this->subfields as $subfield) {
            $contents[] = $subfield->getData();
        }
        return implode($joinChar, $contents);
    }
    // }}}
}
// }}}

pear/File/MARC/Control_Field.php000064400000011027151732707770012351 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Christoffer Landtman <landtman@realnode.com>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2008 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Control_Field extends File_MARC_Field
/**
 * The File_MARC_Control_Field class represents a single control field
 * in a MARC record.
 *
 * A MARC control field consists of a tag name and control data.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Christoffer Landtman <landtman@realnode.com>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Control_Field extends File_MARC_Field
{

    // {{{ Properties
    /**
     * Value of field, if field is a Control field
     * @var string
     */
    protected $data;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Field init function
     *
     * Create a new {@link File_MARC_Control_Field} object from passed arguments
     *
     * @param string $tag  tag
     * @param string $data control field data
     * @param string $ind1 placeholder for class strictness
     * @param string $ind2 placeholder for class strictness
     */
    function __construct($tag, $data, $ind1 = null, $ind2 = null) 
    {
        $this->data = $data;
        parent::__construct($tag);

    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Destroys the control field
     */
    function __destruct()
    {
        $this->data = null;
        parent::__destruct();
    }
    // }}}

    // {{{ Explicit destructor: function delete()
    /**
     * Destroys the control field
     *
     * @return true
     */
    function delete()
    {
        $this->__destruct();
    }
    // }}}

    // {{{ getData()
    /**
     * Get control field data
     *
     * @return string returns data in control field
     */
    function getData()
    {
        return (string)$this->data;
    }
    // }}}

    // {{{ isEmpty()
    /**
     * Is empty
     *
     * Checks if the field contains data
     *
     * @return bool Returns true if the field is empty, otherwise false
     */
    function isEmpty()
    {
        return ($this->data) ? false : true;
    }
    // }}}

    // {{{ setData()
    /**
     * Set control field data
     *
     * @param string $data data for the control field
     *
     * @return bool returns the new data in the control field
     */
    function setData($data)
    {
        $this->data = $data;
        return $this->getData();
    }
    // }}}

    // {{{ __toString()
    /**
     * Return as a formatted string
     *
     * Return the control field as a formatted string for pretty printing
     *
     * @return string Formatted output of control Field
     */
    function __toString()
    {
        return sprintf("%3s     %s", $this->tag, $this->data);
    }
    // }}}

    // {{{ toRaw()
    /**
     * Return as raw MARC
     *
     * Return the control field formatted in Raw MARC for saving into MARC files
     *
     * @return string Raw MARC
     */
    function toRaw()
    {
        return (string)$this->data.File_MARC::END_OF_FIELD;
    }
    // }}}

}
// }}}

pear/File/MARC/Lint/CodeData.php000064400000040450151732707770012202 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Code Data to support Lint for MARC records
 *
 * This module is adapted from the MARC::Lint::CodeData CPAN module for Perl,
 * maintained by Bryan Baldus <eijabb@cpan.org> and available for download at
 * http://search.cpan.org/~eijabb/
 *
 * Current MARC::Lint::CodeData version used as basis for this module: 1.37
 *
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Demian Katz <demian.katz@villanova.edu>
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2003-2019 Oy Realnode Ab, Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id: Record.php 308146 2011-02-08 20:36:20Z dbs $
 * @link      http://pear.php.net/package/File_MARC
 */

// {{{ class File_MARC_Lint
/**
 * Contains codes from the MARC code lists for Geographic Areas, Languages, and
 * Countries.
 *
 * Code data is used for validating fields 008, 040, 041, and 043.
 *
 * Also, sources for subfield 2 in 600-651 and 655.
 *
 * Note: According to the official MARC documentation, Sears is not a valid 655
 * term. The code data below treats it as valid, in anticipation of a change in
 * the official documentation.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Demian Katz <demian.katz@villanova.edu>
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARC_Lint_CodeData
{

    // {{{ properties
    /**
     * Valid Geographic Area Codes
     * @var array
     */
    public $geogAreaCodes;

    /**
     * Obsolete Geographic Area Codes
     * @var array
     */
    public $obsoleteGeogAreaCodes;

    /**
     * Valid Language Codes
     * @var array
     */
    public $languageCodes;

    /**
     * Obsolete Language Codes
     * @var array
     */
    public $obsoleteLanguageCodes;

    /**
     * Valid Country Codes
     * @var array
     */
    public $countryCodes;

    /**
     * Obsolete Country Codes
     * @var array
     */
    public $obsoleteCountryCodes;

    /**
     * Valid sources for fields 600-651
     * @var array
     */
    public $sources600_651;

    /**
     * Obsolete sources for fields 600-651
     * @var array
     */
    public $obsoleteSources600_651;

    /**
     * Valid sources for field 655
     * @var array
     */
    public $sources655;

    /**
     * Obsolete sources for field 655
     * @var array
     */
    public $obsoleteSources655;

    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Start function
     *
     * Initialize code arrays.
     *
     * @return true 
     */
    public function __construct()
    {
        // @codingStandardsIgnoreStart
        // fill the valid Geographic Area Codes array
        $this->geogAreaCodes = explode("\t", "a------	a-af---	a-ai---	a-aj---	a-ba---	a-bg---	a-bn---	a-br---	a-bt---	a-bx---	a-cb---	a-cc---	a-cc-an	a-cc-ch	a-cc-cq	a-cc-fu	a-cc-ha	a-cc-he	a-cc-hh	a-cc-hk	a-cc-ho	a-cc-hp	a-cc-hu	a-cc-im	a-cc-ka	a-cc-kc	a-cc-ki	a-cc-kn	a-cc-kr	a-cc-ku	a-cc-kw	a-cc-lp	a-cc-mh	a-cc-nn	a-cc-pe	a-cc-sh	a-cc-sm	a-cc-sp	a-cc-ss	a-cc-su	a-cc-sz	a-cc-ti	a-cc-tn	a-cc-ts	a-cc-yu	a-ccg--	a-cck--	a-ccp--	a-ccs--	a-ccy--	a-ce---	a-ch---	a-cy---	a-em---	a-gs---	a-ii---	a-io---	a-iq---	a-ir---	a-is---	a-ja---	a-jo---	a-kg---	a-kn---	a-ko---	a-kr---	a-ku---	a-kz---	a-le---	a-ls---	a-mk---	a-mp---	a-my---	a-np---	a-nw---	a-ph---	a-pk---	a-pp---	a-qa---	a-si---	a-su---	a-sy---	a-ta---	a-th---	a-tk---	a-ts---	a-tu---	a-uz---	a-vt---	a-ye---	aa-----	ab-----	ac-----	ae-----	af-----	ag-----	ah-----	ai-----	ak-----	am-----	an-----	ao-----	aopf---	aoxp---	ap-----	ar-----	as-----	at-----	au-----	aw-----	awba---	awgz---	ay-----	az-----	b------	c------	cc-----	cl-----	d------	dd-----	e------	e-aa---	e-an---	e-au---	e-be---	e-bn---	e-bu---	e-bw---	e-ci---	e-cs---	e-dk---	e-er---	e-fi---	e-fr---	e-ge---	e-gi---	e-gr---	e-gw---	e-gx---	e-hu---	e-ic---	e-ie---	e-it---	e-kv---	e-lh---	e-li---	e-lu---	e-lv---	e-mc---	e-mm---	e-mo---	e-mv---	e-ne---	e-no---	e-pl---	e-po---	e-rb---	e-rm---	e-ru---	e-sm---	e-sp---	e-sw---	e-sz---	e-uk---	e-uk-en	e-uk-ni	e-uk-st	e-uk-ui	e-uk-wl	e-un---	e-ur---	e-urc--	e-ure--	e-urf--	e-urk--	e-urn--	e-urp--	e-urr--	e-urs--	e-uru--	e-urw--	e-vc---	e-xn---	e-xo---	e-xr---	e-xv---	e-yu---	ea-----	eb-----	ec-----	ed-----	ee-----	el-----	en-----	eo-----	ep-----	er-----	es-----	ev-----	ew-----	f------	f-ae---	f-ao---	f-bd---	f-bs---	f-cd---	f-cf---	f-cg---	f-cm---	f-cx---	f-dm---	f-ea---	f-eg---	f-et---	f-ft---	f-gh---	f-gm---	f-go---	f-gv---	f-iv---	f-ke---	f-lb---	f-lo---	f-ly---	f-mg---	f-ml---	f-mr---	f-mu---	f-mw---	f-mz---	f-ng---	f-nr---	f-pg---	f-rh---	f-rw---	f-sa---	f-sd---	f-sf---	f-sg---	f-sh---	f-sj---	f-sl---	f-so---	f-sq---	f-ss---	f-sx---	f-tg---	f-ti---	f-tz---	f-ua---	f-ug---	f-uv---	f-za---	fa-----	fb-----	fc-----	fd-----	fe-----	ff-----	fg-----	fh-----	fi-----	fl-----	fn-----	fq-----	fr-----	fs-----	fu-----	fv-----	fw-----	fz-----	h------	i------	i-bi---	i-cq---	i-fs---	i-hm---	i-mf---	i-my---	i-re---	i-se---	i-xa---	i-xb---	i-xc---	i-xo---	l------	ln-----	lnaz---	lnbm---	lnca---	lncv---	lnfa---	lnjn---	lnma---	lnsb---	ls-----	lsai---	lsbv---	lsfk---	lstd---	lsxj---	lsxs---	m------	ma-----	mb-----	me-----	mm-----	mr-----	n------	n-cn---	n-cn-ab	n-cn-bc	n-cn-mb	n-cn-nf	n-cn-nk	n-cn-ns	n-cn-nt	n-cn-nu	n-cn-on	n-cn-pi	n-cn-qu	n-cn-sn	n-cn-yk	n-cnh--	n-cnm--	n-cnp--	n-gl---	n-mx---	n-us---	n-us-ak	n-us-al	n-us-ar	n-us-az	n-us-ca	n-us-co	n-us-ct	n-us-dc	n-us-de	n-us-fl	n-us-ga	n-us-hi	n-us-ia	n-us-id	n-us-il	n-us-in	n-us-ks	n-us-ky	n-us-la	n-us-ma	n-us-md	n-us-me	n-us-mi	n-us-mn	n-us-mo	n-us-ms	n-us-mt	n-us-nb	n-us-nc	n-us-nd	n-us-nh	n-us-nj	n-us-nm	n-us-nv	n-us-ny	n-us-oh	n-us-ok	n-us-or	n-us-pa	n-us-ri	n-us-sc	n-us-sd	n-us-tn	n-us-tx	n-us-ut	n-us-va	n-us-vt	n-us-wa	n-us-wi	n-us-wv	n-us-wy	n-usa--	n-usc--	n-use--	n-usl--	n-usm--	n-usn--	n-uso--	n-usp--	n-usr--	n-uss--	n-ust--	n-usu--	n-xl---	nc-----	ncbh---	nccr---	nccz---	nces---	ncgt---	ncho---	ncnq---	ncpn---	nl-----	nm-----	np-----	nr-----	nw-----	nwaq---	nwaw---	nwbb---	nwbf---	nwbn---	nwcj---	nwco---	nwcu---	nwdq---	nwdr---	nweu---	nwgd---	nwgp---	nwhi---	nwht---	nwjm---	nwla---	nwli---	nwmj---	nwmq---	nwna---	nwpr---	nwsc---	nwsd---	nwsn---	nwst---	nwsv---	nwtc---	nwtr---	nwuc---	nwvb---	nwvi---	nwwi---	nwxa---	nwxi---	nwxk---	nwxm---	p------	pn-----	po-----	poas---	pobp---	poci---	pocw---	poea---	pofj---	pofp---	pogg---	pogu---	poji---	pokb---	poki---	poln---	pome---	pomi---	ponl---	ponn---	ponu---	popc---	popl---	pops---	posh---	potl---	poto---	pott---	potv---	poup---	powf---	powk---	pows---	poxd---	poxe---	poxf---	poxh---	ps-----	q------	r------	s------	s-ag---	s-bl---	s-bo---	s-ck---	s-cl---	s-ec---	s-fg---	s-gy---	s-pe---	s-py---	s-sr---	s-uy---	s-ve---	sa-----	sn-----	sp-----	t------	u------	u-ac---	u-at---	u-at-ac	u-at-ne	u-at-no	u-at-qn	u-at-sa	u-at-tm	u-at-vi	u-at-we	u-atc--	u-ate--	u-atn--	u-cs---	u-nz---	w------	x------	xa-----	xb-----	xc-----	xd-----	zd-----	zju----	zma----	zme----	zmo----	zne----	zo-----	zpl----	zs-----	zsa----	zsu----	zur----	zve----");
        
        // fill the obsolete Geographic Area Codes array
        $this->obsoleteGeogAreaCodes = explode("\t", "t-ay---	e-ur-ai	e-ur-aj	nwbc---	e-ur-bw	f-by---	pocp---	e-url--	cr-----	v------	e-ur-er	et-----	e-ur-gs	pogn---	nwga---	nwgs---	a-hk---	ei-----	f-if---	awiy---	awiw---	awiu---	e-ur-kz	e-ur-kg	e-ur-lv	e-ur-li	a-mh---	cm-----	e-ur-mv	n-usw--	a-ok---	a-pt---	e-ur-ru	pory---	nwsb---	posc---	a-sk---	posn---	e-uro--	e-ur-ta	e-ur-tk	e-ur-un	e-ur-uz	a-vn---	a-vs---	nwvr---	e-urv--	a-ys---");
        
        // fill the valid Language Codes array
        $this->languageCodes = explode("\t", "   	aar	abk	ace	ach	ada	ady	afa	afh	afr	ain	aka	akk	alb	ale	alg	alt	amh	ang	anp	apa	ara	arc	arg	arm	arn	arp	art	arw	asm	ast	ath	aus	ava	ave	awa	aym	aze	bad	bai	bak	bal	bam	ban	baq	bas	bat	bej	bel	bem	ben	ber	bho	bih	bik	bin	bis	bla	bnt	bos	bra	bre	btk	bua	bug	bul	bur	byn	cad	cai	car	cat	cau	ceb	cel	cha	chb	che	chg	chi	chk	chm	chn	cho	chp	chr	chu	chv	chy	cmc	cop	cor	cos	cpe	cpf	cpp	cre	crh	crp	csb	cus	cze	dak	dan	dar	day	del	den	dgr	din	div	doi	dra	dsb	dua	dum	dut	dyu	dzo	efi	egy	eka	elx	eng	enm	epo	est	ewe	ewo	fan	fao	fat	fij	fil	fin	fiu	fon	fre	frm	fro	frr	frs	fry	ful	fur	gaa	gay	gba	gem	geo	ger	gez	gil	gla	gle	glg	glv	gmh	goh	gon	gor	got	grb	grc	gre	grn	gsw	guj	gwi	hai	hat	hau	haw	heb	her	hil	him	hin	hit	hmn	hmo	hrv	hsb	hun	hup	iba	ibo	ice	ido	iii	ijo	iku	ile	ilo	ina	inc	ind	ine	inh	ipk	ira	iro	ita	jav	jbo	jpn	jpr	jrb	kaa	kab	kac	kal	kam	kan	kar	kas	kau	kaw	kaz	kbd	kha	khi	khm	kho	kik	kin	kir	kmb	kok	kom	kon	kor	kos	kpe	krc	krl	kro	kru	kua	kum	kur	kut	lad	lah	lam	lao	lat	lav	lez	lim	lin	lit	lol	loz	ltz	lua	lub	lug	lui	lun	luo	lus	mac	mad	mag	mah	mai	mak	mal	man	mao	map	mar	mas	may	mdf	mdr	men	mga	mic	min	mis	mkh	mlg	mlt	mnc	mni	mno	moh	mon	mos	mul	mun	mus	mwl	mwr	myn	myv	nah	nai	nap	nau	nav	nbl	nde	ndo	nds	nep	new	nia	nic	niu	nno	nob	nog	non	nor	nqo	nso	nub	nwc	nya	nym	nyn	nyo	nzi	oci	oji	ori	orm	osa	oss	ota	oto	paa	pag	pal	pam	pan	pap	pau	peo	per	phi	phn	pli	pol	pon	por	pra	pro	pus	que	raj	rap	rar	roa	roh	rom	rum	run	rup	rus	sad	sag	sah	sai	sal	sam	san	sas	sat	scn	sco	sel	sem	sga	sgn	shn	sid	sin	sio	sit	sla	slo	slv	sma	sme	smi	smj	smn	smo	sms	sna	snd	snk	sog	som	son	sot	spa	srd	srn	srp	srr	ssa	ssw	suk	sun	sus	sux	swa	swe	syc	syr	tah	tai	tam	tat	tel	tem	ter	tet	tgk	tgl	tha	tib	tig	tir	tiv	tkl	tlh	tli	tmh	tog	ton	tpi	tsi	tsn	tso	tuk	tum	tup	tur	tut	tvl	twi	tyv	udm	uga	uig	ukr	umb	und	urd	uzb	vai	ven	vie	vol	vot	wak	wal	war	was	wel	wen	wln	wol	xal	xho	yao	yap	yid	yor	ypk	zap	zbl	zen	zha	znd	zul	zun	zxx	zza");
        
        // fill the obsolete Language Codes array
        $this->obsoleteLanguageCodes = explode("\t", "ajm	esk	esp	eth	far	fri	gag	gua	int	iri	cam	kus	mla	max	mol	lan	gal	lap	sao	gae	scc	scr	sho	snh	sso	swz	tag	taj	tar	tru	tsw");
        
        // fill the valid Country Codes array
        $this->countryCodes = explode("\t", "aa 	abc	aca	ae 	af 	ag 	ai 	aj 	aku	alu	am 	an 	ao 	aq 	aru	as 	at 	au 	aw 	ay 	azu	ba 	bb 	bcc	bd 	be 	bf 	bg 	bh 	bi 	bl 	bm 	bn 	bo 	bp 	br 	bs 	bt 	bu 	bv 	bw 	bx 	ca 	cau	cb 	cc 	cd 	ce 	cf 	cg 	ch 	ci 	cj 	ck 	cl 	cm 	co 	cou	cq 	cr 	ctu	cu 	cv 	cw 	cx 	cy 	dcu	deu	dk 	dm 	dq 	dr 	ea 	ec 	eg 	em 	enk	er 	es 	et 	fa 	fg 	fi 	fj 	fk 	flu	fm 	fp 	fr 	fs 	ft 	gau	gb 	gd 	gh 	gi 	gl 	gm 	go 	gp 	gr 	gs 	gt 	gu 	gv 	gw 	gy 	gz 	hiu	hm 	ho 	ht 	hu 	iau	ic 	idu	ie 	ii 	ilu	inu	io 	iq 	ir 	is 	it 	iv 	iy 	ja 	ji 	jm 	jo 	ke 	kg 	kn 	ko 	ksu	ku 	kv 	kyu	kz 	lau	lb 	le 	lh 	li 	lo 	ls 	lu 	lv 	ly 	mau	mbc	mc 	mdu	meu	mf 	mg 	miu	mj 	mk 	ml 	mm 	mnu	mo 	mou	mp 	mq 	mr 	msu	mtu	mu 	mv 	mw 	mx 	my 	mz 	na 	nbu	ncu	ndu	ne 	nfc	ng 	nhu	nik	nju	nkc	nl 	nmu	nn 	no 	np 	nq 	nr 	nsc	ntc	nu 	nuc	nvu	nw 	nx 	nyu	nz 	ohu	oku	onc	oru	ot 	pau	pc 	pe 	pf 	pg 	ph 	pic	pk 	pl 	pn 	po 	pp 	pr 	pw 	py 	qa 	qea	quc	rb 	re 	rh 	riu	rm 	ru 	rw 	sa 	sc 	scu	sd 	sdu	se 	sf 	sg 	sh 	si 	sj 	sl 	sm 	sn 	snc	so 	sp 	sq 	sr 	ss 	st 	stk	su 	sw 	sx 	sy 	sz 	ta 	tc 	tg 	th 	ti 	tk 	tl 	tma	tnu	to 	tr 	ts 	tu 	tv 	txu	tz 	ua 	uc 	ug 	uik	un 	up 	utu	uv 	uy 	uz 	vau	vb 	vc 	ve 	vi 	vm 	vp 	vra	vtu	wau	wea	wf 	wiu	wj 	wk 	wlk	ws 	wvu	wyu	xa 	xb 	xc 	xd 	xe 	xf 	xga	xh 	xj 	xk 	xl 	xm 	xn 	xna	xo 	xoa	xp 	xr 	xra	xs 	xv 	xx 	xxc	xxk	xxu	ye 	ykc	za ");
        
        // fill the obsolete Country Codes array
        $this->obsoleteCountryCodes = explode("\t", "ai 	air	ac 	ajr	bwr	cn 	cz 	cp 	ln 	cs 	err	gsr	ge 	gn 	hk 	iw 	iu 	jn 	kzr	kgr	lvr	lir	mh 	mvr	nm 	pt 	rur	ry 	xi 	sk 	xxr	sb 	sv 	tar	tt 	tkr	unr	uk 	ui 	us 	uzr	vn 	vs 	wb 	ys 	yu ");
        
        // the codes cash, lcsh, lcshac, mesh, nal, and rvm are covered by 2nd
        // indicators in 600-655
        // they are only used when indicators are not available
        $this->sources600_651 = explode("\t", "aass	aat	abne	aedoml	afo	afset	agrifors	agrovoc	agrovocf	agrovocs	aiatsisl	aiatsisp	aiatsiss	aktp	albt	allars	apaist	armac	asft	ashlnl	asrcrfcd	asrcseo	asrctoa	asth	ated	atg	atla	aucsh	bare	barn	bhb	bella	bet	bhammf	bhashe	bib1814	bibalex	biccbmc	bicssc	bidex	bisacsh	bisacmt	bisacrt	bjornson	blcpss	blmlsh	blnpn	bokbas	bt	btr	cabt	cash	cbk	cck	ccsa	cct	ccte	cctf	cdcng	ceeus	chirosh	cht	ciesiniv	cilla	collett	conorsi	csahssa	csalsct	csapa	csh	csht	cstud	czenas	czmesh	dacs	dbn	dcs	ddcri	ddcrit	ddcut	dissao	dit	dltlt	dltt	drama	dtict	ebfem	eclas	eet	eflch	eks	embiaecid	embne	emnmus	ept	erfemn	ericd	est	eum	eurovocen	eurovocfr	eurovocsl	fast	fes	finmesh	fire	fmesh	fnhl	francis	fssh	galestne	gccst	gcipmedia	gcipplatform	gem	gemet	georeft	gnd	gnis	gst	gtt	hamsun	hapi	hkcan	helecon	henn	hlasstg	hoidokki	hrvmesh	huc	humord	iaat	ibsen	ica	icpsr	idas	idsbb	idszbz	idszbzes	idszbzna	idszbzzg	idszbzzh	idszbzzk	iescs	iest	ilot	ilpt	inist	inspect	ipat	ipsp	isis	itglit	itoamc	itrt	jhpb	jhpk	jlabsh	juho	jupo	jurivoc	kaa	kaba	kao	kassu	kauno	kaunokki	kdm	khib	kito	kitu	kkts	koko	kssbar	kta	kto	ktpt	ktta	kubikat	kula	kulo	kupu	lacnaf	lapponica	larpcal	lcac	lcdgt	lcmpt	lcsh	lcshac	lcstt	lctgm	lemac	lemb	liito	liv	lnmmbr	local	ltcsh	lua	maaq	maotao	mar	masa	mech	mero	mesh	mipfesd	mmm	mpirdes	msc	msh	mtirdes	musa	muso	muzeukc	muzeukn	muzvukci	naf	nal	nalnaf	nasat	nbdbt	nbiemnfag	ncjt	ndlsh	netc	ndllsh	nicem	nimacsc	nlgaf	nlgkk	nlgsh	nlmnaf	no-ubo-mr	noraf	noram	norbok	normesh	noubomn	noubojur	nsbncf	nskps	ntcpsc	ntcsd	ntids	ntissc	nzggn	nznb	odlt	ogst	onet	opms	ordnok	pascal	pepp	peri	pha	pkk	pleiades	pmbok	pmcsg	pmont	pmt	poliscit	popinte	precis	prvt	psychit	puho	quiding	qlsp	qrma	qrmak	qtglit	raam	ram	rasuqam	renib	reo	rero	rerovoc	rma	rpe	rswk	rswkaf	rugeo	rurkp	rvm	rvmgd	samisk	sanb	sao	sbiao	sbt	scbi	scgdst	scisshl	scot	sears	sfit	sgc	sgce	shbe	she	shsples	sigle	sipri	sk	skon	slem	smda	snt	socio	solstad	sosa	spines	ssg	sthus	stw	swd	swemesh	taika	tasmas	taxhs	tbit	tbjvp	tekord	tero	tesa	tesbhaecid	test	tgn	tha	thema	thesoz	thia	tho	thub	tips	tisa	tlka	tlsh	toit	trfarn	trfbmb	trfgr	trfoba	trfzb	trt	trtsa	tsht	tsr	ttka	ttll	tucua	udc	ukslc	ulan	umitrist	unbisn	unbist	unescot	usaidt	valo	vcaadu	vffyl	vmj	waqaf	watrest	wgst	wot	wpicsh	ysa	yso");
        $this->obsoleteSources600_651 = explode("\t", "cash	lcsh	lcshac	mesh	nal	nobomn	noubojor	reroa	rvm");
        $this->sources655 = explode("\t", "aat	afset	aiatsisl	aiatsisp	aiatsiss	aktp	alett	amg	asrcrfcd	asrcseo	asrctoa	asth	aucsh	barn	barngf	bib1814	bibalex	biccbmc	bidex	bgtchm	bisacsh	bisacmt	bisacrt	bjornson	bt	cash	chirosh	cct	cdcng	cjh	collett	conorsi	csht	czenas	dacs	dcs	dct	ddcut	eet	eflch	embne	emnmus	ept	erfemn	ericd	estc	eurovocen	eurovocsl	fast	fbg	fgtpcm	finmesh	fire	ftamc	galestne	gatbeg	gem	gmd	gmgpc	gnd	gsafd	gst	gtlm	hamsun	hapi	hkcan	hoidokki	ica	ilot	isbdcontent	isbdmedia	itglit	itrt	jhpb	jhpk	kkts	lacnaf	lcgft	lcmpt	lcsh	lcshac	lcstt	lctgm	lemac	lobt	local	maaq	mar	marccategory	marcform	marcgt	marcsmd	mech	mesh	migfg	mim	msh	muzeukc	muzeukn	muzeukv	muzvukci	nal	nalnaf	nbdbgf	nbiemnfag	ndlsh	netc	ngl	nimafc	nlgaf	nlgkk	nlgsh	nlmnaf	nmc	no-ubo-mr	noraf	noram	nsbncf	ntids	nzcoh	nzggn	nznb	onet	opms	ordnok	pkk	pmcsg	pmt	proysen	quiding	qlsp	qrmak	qtglit	raam	radfg	rasuqam	rbbin	rbgenr	rbmscv	rbpap	rbpri	rbprov	rbpub	rbtyp	rdabf	rdabs	rdacarrier	rdaco	rdacontent	rdacpc	rdact	rdafnm	rdafs	rdaft	rdagen	rdagrp	rdagw	rdalay	rdamat	rdamedia	rdamt	rdapf	rdapm	rdapo	rdarm	rdarr	rdaspc	rdatc	rdatr	rdavf	reo	rerovoc	reveal	rma	rswk	rswkaf	rugeo	rvm	rvmgf	sao	saogf	scbi	sears	sgc	sgce	sgp	sipri	skon	snt	socio	spines	ssg	stw	swd	swemesh	tbit	thema	tesa	tgfbne	thesoz	tho	thub	toit	tsht	tucua	ukslc	ulan	vgmsgg	vgmsng	vmj	waqaf");
        $this->obsoleteSources655 = explode("\t", "cash	ftamc	lcsh	lcshac	marccarrier	marccontent	marcmedia	mesh	nal	reroa	rvm");
        // @codingStandardsIgnoreEnd
    }
    // }}}
}
// }}}
pear/File/MARCBASE.php000064400000011615151732707770010264 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */

/**
 * Parser for MARC records
 *
 * This package is based on the PHP MARC package, originally called "php-marc",
 * that is part of the Emilda Project (http://www.emilda.org). Christoffer
 * Landtman generously agreed to make the "php-marc" code available under the
 * GNU LGPL so it could be used as the basis of this PEAR package.
 * 
 * PHP version 5
 *
 * LICENSE: This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category  File_Formats
 * @package   File_MARC
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2007-2010 Dan Scott
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version   CVS: $Id: MARCXML.php 301727 2010-07-30 17:30:51Z dbs $
 * @link      http://pear.php.net/package/File_MARC
 * @example   read.php Retrieve specific fields and subfields from a record
 * @example   subfields.php Create new subfields and add them in specific order
 * @example   marc_yaz.php Pretty print a MARC record retrieved via yaz extension
 */

require_once 'File/MARC/Record.php';

// {{{ class File_MARCBASE
/**
 * The main File_MARCBASE class provides common methods for File_MARC and
 * File_MARCXML - primarily for generating MARCXML output.
 *
 * @category File_Formats
 * @package  File_MARC
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @link     http://pear.php.net/package/File_MARC
 */
class File_MARCBASE
{

    /**
     * XMLWriter for writing collections
     * 
     * @var XMLWriter
     */
    protected $xmlwriter;

    /**
     * Record class
     *
     * @var string
     */
    protected $record_class;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Read in MARCXML records
     *
     * This function reads in files or strings that
     * contain one or more MARCXML records.
     *
     * <code>
     * <?php
     * // Retrieve MARC records from a file
     * $journals = new File_MARC('journals.mrc', SOURCE_FILE);
     *
     * // Retrieve MARC records from a string (e.g. Z39 query results)
     * $monographs = new File_MARC($raw_marc, SOURCE_STRING);
     * ?>
     * </code>
     *
     * @param string $source       Name of the file, or a raw MARC string
     * @param int    $type         Source of the input: SOURCE_FILE or SOURCE_STRING
     * @param string $record_class Record class, defaults to File_MARC_Record
     */
    function __construct($source, $type, $record_class)
    {
        $this->xmlwriter = new XMLWriter();
        $this->xmlwriter->openMemory();
        $this->xmlwriter->startDocument('1.0', 'UTF-8');

        $this->record_class = $record_class ?: File_MARC_Record::class;
    }
    // }}}

    // {{{ toXMLHeader()
    /**
     * Initializes the MARCXML output of a record or collection of records 
     *
     * This method produces an XML representation of a MARC record that
     * attempts to adhere to the MARCXML standard documented at
     * http://www.loc.gov/standards/marcxml/
     *
     * @return bool true if successful
     */
    function toXMLHeader()
    {
        $this->xmlwriter->startElement("collection");
        $this->xmlwriter->writeAttribute("xmlns", "http://www.loc.gov/MARC21/slim");
        return true;
    }
    // }}}

    // {{{ getXMLWriter()
    /**
     * Returns the XMLWriter object
     *
     * This method produces an XML representation of a MARC record that
     * attempts to adhere to the MARCXML standard documented at
     * http://www.loc.gov/standards/marcxml/
     *
     * @return XMLWriter XMLWriter instance
     */
    function getXMLWriter()
    {
        return $this->xmlwriter;
    }
    // }}}

    // {{{ toXMLFooter()
    /**
     * Returns the MARCXML collection footer
     *
     * This method produces an XML representation of a MARC record that
     * attempts to adhere to the MARCXML standard documented at
     * http://www.loc.gov/standards/marcxml/
     *
     * @return string           representation of MARC record in MARCXML format
     */
    function toXMLFooter()
    {
        $this->xmlwriter->endElement(); // end collection
        $this->xmlwriter->endDocument();
        return $this->xmlwriter->outputMemory();
    }
    // }}}

}
// }}}
pear/Mail.php000064400000023226151732707770007113 0ustar00<?php
/**
 * PEAR's Mail:: interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 1997-2017, Chuck Hagenbuch & Richard Heyes
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   1997-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

require_once 'PEAR.php';

/**
 * PEAR's Mail:: interface. Defines the interface for implementing
 * mailers under the PEAR hierarchy, and provides supporting functions
 * useful in multiple mailer backends.
 *
 * @version $Revision$
 * @package Mail
 */
class Mail
{
    /**
     * Line terminator used for separating header lines.
     * @var string
     */
    public $sep = "\r\n";

    /**
     * Provides an interface for generating Mail:: objects of various
     * types
     *
     * @param string $driver The kind of Mail:: object to instantiate.
     * @param array  $params The parameters to pass to the Mail:: object.
     *
     * @return object Mail a instance of the driver class or if fails a PEAR Error
     */
    public static function factory($driver, $params = array())
    {
        $driver = strtolower($driver);
        @include_once 'Mail/' . $driver . '.php';
        $class = 'Mail_' . $driver;
        if (class_exists($class)) {
            $mailer = new $class($params);
            return $mailer;
        } else {
            return PEAR::raiseError('Unable to find class for driver ' . $driver);
        }
    }

    /**
     * Implements Mail::send() function using php's built-in mail()
     * command.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     *
     * @deprecated use Mail_mail::send instead
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // if we're passed an array of recipients, implode it.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // get the Subject out of the headers array so that we can
        // pass it as a seperate argument to mail().
        $subject = '';
        if (isset($headers['Subject'])) {
            $subject = $headers['Subject'];
            unset($headers['Subject']);
        }

        // flatten the headers out.
        list(, $text_headers) = Mail::prepareHeaders($headers);

        return mail($recipients, $subject, $body, $text_headers);
    }

    /**
     * Sanitize an array of mail headers by removing any additional header
     * strings present in a legitimate header's value.  The goal of this
     * filter is to prevent mail injection attacks.
     *
     * @param array $headers The associative array of headers to sanitize.
     */
    protected function _sanitizeHeaders(&$headers)
    {
        foreach ($headers as $key => $value) {
            $headers[$key] =
                preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
                             null, $value);
        }
    }

    /**
     * Take an array of mail headers and return a string containing
     * text usable in sending a message.
     *
     * @param array $headers The array of headers to prepare, in an associative
     *              array, where the array key is the header name (ie,
     *              'Subject'), and the array value is the header
     *              value (ie, 'test'). The header produced from those
     *              values would be 'Subject: test'.
     *
     * @return mixed Returns false if it encounters a bad address,
     *               otherwise returns an array containing two
     *               elements: Any From: address found in the headers,
     *               and the plain text version of the headers.
     */
    protected function prepareHeaders($headers)
    {
        $lines = array();
        $from = null;

        foreach ($headers as $key => $value) {
            if (strcasecmp($key, 'From') === 0) {
                include_once 'Mail/RFC822.php';
                $parser = new Mail_RFC822();
                $addresses = $parser->parseAddressList($value, 'localhost', false);
                if (is_a($addresses, 'PEAR_Error')) {
                    return $addresses;
                }

                $from = $addresses[0]->mailbox . '@' . $addresses[0]->host;

                // Reject envelope From: addresses with spaces.
                if (strstr($from, ' ')) {
                    return false;
                }

                $lines[] = $key . ': ' . $value;
            } elseif (strcasecmp($key, 'Received') === 0) {
                $received = array();
                if (is_array($value)) {
                    foreach ($value as $line) {
                        $received[] = $key . ': ' . $line;
                    }
                }
                else {
                    $received[] = $key . ': ' . $value;
                }
                // Put Received: headers at the top.  Spam detectors often
                // flag messages with Received: headers after the Subject:
                // as spam.
                $lines = array_merge($received, $lines);
            } else {
                // If $value is an array (i.e., a list of addresses), convert
                // it to a comma-delimited string of its elements (addresses).
                if (is_array($value)) {
                    $value = implode(', ', $value);
                }
                $lines[] = $key . ': ' . $value;
            }
        }

        return array($from, join($this->sep, $lines));
    }

    /**
     * Take a set of recipients and parse them, returning an array of
     * bare addresses (forward paths) that can be passed to sendmail
     * or an smtp server with the rcpt to: command.
     *
     * @param mixed Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid.
     *
     * @return mixed An array of forward paths (bare addresses) or a PEAR_Error
     *               object if the address list could not be parsed.
     */
    protected function parseRecipients($recipients)
    {
        include_once 'Mail/RFC822.php';

        // if we're passed an array, assume addresses are valid and
        // implode them before parsing.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // Parse recipients, leaving out all personal info. This is
        // for smtp recipients, etc. All relevant personal information
        // should already be in the headers.
        $Mail_RFC822 = new Mail_RFC822();
        $addresses = $Mail_RFC822->parseAddressList($recipients, 'localhost', false);

        // If parseAddressList() returned a PEAR_Error object, just return it.
        if (is_a($addresses, 'PEAR_Error')) {
            return $addresses;
        }

        $recipients = array();
        if (is_array($addresses)) {
            foreach ($addresses as $ob) {
                $recipients[] = $ob->mailbox . '@' . $ob->host;
            }
        }

        return $recipients;
    }

}
pear/Auth/SASL/CramMD5.php000064400000006524151732707770011066 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of CRAM-MD5 SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_CramMD5 extends Auth_SASL_Common
{
    /**
    * Implements the CRAM-MD5 SASL mechanism
    * This DOES NOT base64 encode the return value,
    * you will need to do that yourself.
    *
    * @param string $user      Username
    * @param string $pass      Password
    * @param string $challenge The challenge supplied by the server.
    *                          this should be already base64_decoded.
    *
    * @return string The string to pass back to the server, of the form
    *                "<user> <digest>". This is NOT base64_encoded.
    */
    function getResponse($user, $pass, $challenge)
    {
        return $user . ' ' . $this->_HMAC_MD5($pass, $challenge);
    }
}
?>pear/Auth/SASL/External.php000064400000006054151732710000011432 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2008 Christoph Schulz                                   | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Christoph Schulz <develop@kristov.de>                         | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of EXTERNAL SASL mechanism
*
* @author  Christoph Schulz <develop@kristov.de>
* @access  public
* @version 1.0.3
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_External extends Auth_SASL_Common
{
    /**
    * Returns EXTERNAL response
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $authzid   Autorization id
    * @return string            EXTERNAL Response
    */
    function getResponse($authcid, $pass, $authzid = '')
    {
        return $authzid;
    }
}
?>
pear/Auth/SASL/Common.php000064400000010426151732710000011076 0ustar00<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes                                 |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net>                               |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Common functionality to SASL mechanisms
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

class Auth_SASL_Common
{
    /**
    * Function which implements HMAC MD5 digest
    *
    * @param  string $key  The secret key
    * @param  string $data The data to hash
    * @param  bool $raw_output Whether the digest is returned in binary or hexadecimal format.
    *
    * @return string       The HMAC-MD5 digest
    */
    function _HMAC_MD5($key, $data, $raw_output = FALSE)
    {
        if (strlen($key) > 64) {
            $key = pack('H32', md5($key));
        }

        if (strlen($key) < 64) {
            $key = str_pad($key, 64, chr(0));
        }

        $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
        $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);

        $inner  = pack('H32', md5($k_ipad . $data));
        $digest = md5($k_opad . $inner, $raw_output);

        return $digest;
    }

    /**
    * Function which implements HMAC-SHA-1 digest
    *
    * @param  string $key  The secret key
    * @param  string $data The data to hash
    * @param  bool $raw_output Whether the digest is returned in binary or hexadecimal format.
    * @return string       The HMAC-SHA-1 digest
    * @author Jehan <jehan.marmottard@gmail.com>
    * @access protected
    */
    protected function _HMAC_SHA1($key, $data, $raw_output = FALSE)
    {
        if (strlen($key) > 64) {
            $key = sha1($key, TRUE);
        }

        if (strlen($key) < 64) {
            $key = str_pad($key, 64, chr(0));
        }

        $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
        $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);

        $inner  = pack('H40', sha1($k_ipad . $data));
        $digest = sha1($k_opad . $inner, $raw_output);

         return $digest;
     }
}
?>
pear/Auth/SASL/Anonymous.php000064400000006575151732710000011650 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of ANONYMOUS SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Anonymous extends Auth_SASL_Common
{
    /**
    * Not much to do here except return the token supplied.
    * No encoding, hashing or encryption takes place for this
    * mechanism, simply one of:
    *  o An email address
    *  o An opaque string not containing "@" that can be interpreted
    *    by the sysadmin
    *  o Nothing
    *
    * We could have some logic here for the second option, but this
    * would by no means create something interpretable.
    *
    * @param  string $token Optional email address or string to provide
    *                       as trace information.
    * @return string        The unaltered input token
    */
    function getResponse($token = '')
    {
        return $token;
    }
}
?>pear/Auth/SASL/Login.php000064400000006117151732710000010720 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* This is technically not a SASL mechanism, however
* it's used by Net_Sieve, Net_Cyrus and potentially
* other protocols , so here is a good place to abstract
* it.
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Login extends Auth_SASL_Common
{
    /**
    * Pseudo SASL LOGIN mechanism
    *
    * @param  string $user Username
    * @param  string $pass Password
    * @return string       LOGIN string
    */
    function getResponse($user, $pass)
    {
        return sprintf('LOGIN %s %s', $user, $pass);
    }
}
?>pear/Auth/SASL/Plain.php000064400000006075151732710000010716 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of PLAIN SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Plain extends Auth_SASL_Common
{
    /**
    * Returns PLAIN response
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $authzid   Autorization id
    * @return string            PLAIN Response
    */
    function getResponse($authcid, $pass, $authzid = '')
    {
        return $authzid . chr(0) . $authcid . chr(0) . $pass;
    }
}
?>
pear/Auth/SASL/DigestMD5.php000064400000020547151732710000011400 0ustar00<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of DIGEST-MD5 SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_DigestMD5 extends Auth_SASL_Common
{
    /**
    * Provides the (main) client response for DIGEST-MD5
    * requires a few extra parameters than the other
    * mechanisms, which are unavoidable.
    * 
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $challenge The digest challenge sent by the server
    * @param  string $hostname  The hostname of the machine you're connecting to
    * @param  string $service   The servicename (eg. imap, pop, acap etc)
    * @param  string $authzid   Authorization id (username to proxy as)
    * @return string            The digest response (NOT base64 encoded)
    * @access public
    */
    function getResponse($authcid, $pass, $challenge, $hostname, $service, $authzid = '')
    {
        $challenge = $this->_parseChallenge($challenge);
        $authzid_string = '';
        if ($authzid != '') {
            $authzid_string = ',authzid="' . $authzid . '"'; 
        }

        if (!empty($challenge)) {
            $cnonce         = $this->_getCnonce();
            $digest_uri     = sprintf('%s/%s', $service, $hostname);
            $response_value = $this->_getResponseValue($authcid, $pass, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $authzid);

            if ($challenge['realm']) {
                return sprintf('username="%s",realm="%s"' . $authzid_string  .
',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
            } else {
                return sprintf('username="%s"' . $authzid_string  . ',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
            }
        } else {
            return PEAR::raiseError('Invalid digest challenge');
        }
    }
    
    /**
    * Parses and verifies the digest challenge*
    *
    * @param  string $challenge The digest challenge
    * @return array             The parsed challenge as an assoc
    *                           array in the form "directive => value".
    * @access private
    */
    function _parseChallenge($challenge)
    {
        $tokens = array();
        while (preg_match('/^([a-z-]+)=("[^"]+(?<!\\\)"|[^,]+)/i', $challenge, $matches)) {

            // Ignore these as per rfc2831
            if ($matches[1] == 'opaque' OR $matches[1] == 'domain') {
                $challenge = substr($challenge, strlen($matches[0]) + 1);
                continue;
            }

            // Allowed multiple "realm" and "auth-param"
            if (!empty($tokens[$matches[1]]) AND ($matches[1] == 'realm' OR $matches[1] == 'auth-param')) {
                if (is_array($tokens[$matches[1]])) {
                    $tokens[$matches[1]][] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
                } else {
                    $tokens[$matches[1]] = array($tokens[$matches[1]], preg_replace('/^"(.*)"$/', '\\1', $matches[2]));
                }

            // Any other multiple instance = failure
            } elseif (!empty($tokens[$matches[1]])) {
                $tokens = array();
                break;

            } else {
                $tokens[$matches[1]] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
            }

            // Remove the just parsed directive from the challenge
            $challenge = substr($challenge, strlen($matches[0]) + 1);
        }

        /**
        * Defaults and required directives
        */
        // Realm
        if (empty($tokens['realm'])) {
            $tokens['realm'] = "";
        }

        // Maxbuf
        if (empty($tokens['maxbuf'])) {
            $tokens['maxbuf'] = 65536;
        }

        // Required: nonce, algorithm
        if (empty($tokens['nonce']) OR empty($tokens['algorithm'])) {
            return array();
        }

        return $tokens;
    }

    /**
    * Creates the response= part of the digest response
    *
    * @param  string $authcid    Authentication id (username)
    * @param  string $pass       Password
    * @param  string $realm      Realm as provided by the server
    * @param  string $nonce      Nonce as provided by the server
    * @param  string $cnonce     Client nonce
    * @param  string $digest_uri The digest-uri= value part of the response
    * @param  string $authzid    Authorization id
    * @return string             The response= part of the digest response
    * @access private
    */    
    function _getResponseValue($authcid, $pass, $realm, $nonce, $cnonce, $digest_uri, $authzid = '')
    {
        if ($authzid == '') {
            $A1 = sprintf('%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce);
        } else {
            $A1 = sprintf('%s:%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce, $authzid);
        }
        $A2 = 'AUTHENTICATE:' . $digest_uri;
        return md5(sprintf('%s:%s:00000001:%s:auth:%s', md5($A1), $nonce, $cnonce, md5($A2)));
    }

    /**
    * Creates the client nonce for the response
    *
    * @return string  The cnonce value
    * @access private
    */
    function _getCnonce()
    {
        if (@file_exists('/dev/urandom') && $fd = @fopen('/dev/urandom', 'r')) {
            return base64_encode(fread($fd, 32));

        } elseif (@file_exists('/dev/random') && $fd = @fopen('/dev/random', 'r')) {
            return base64_encode(fread($fd, 32));

        } else {
            $str = '';
            for ($i=0; $i<32; $i++) {
                $str .= chr(mt_rand(0, 255));
            }
            
            return base64_encode($str);
        }
    }
}
?>
pear/Auth/SASL/SCRAM.php000064400000030373151732710000010516 0ustar00<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2011 Jehan                                              |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Jehan <jehan.marmottard@gmail.com                             |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Implementation of SCRAM-* SASL mechanisms.
* SCRAM mechanisms have 3 main steps (initial response, response to the server challenge, then server signature
* verification) which keep state-awareness. Therefore a single class instanciation must be done and reused for the whole
* authentication process.
*
* @author  Jehan <jehan.marmottard@gmail.com>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_SCRAM extends Auth_SASL_Common
{
    /**
    * Construct a SCRAM-H client where 'H' is a cryptographic hash function.
    *
    * @param string $hash The name cryptographic hash function 'H' as registered by IANA in the "Hash Function Textual
    * Names" registry.
    * @link http://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xml "Hash Function Textual
    * Names"
    * format of core PHP hash function.
    * @access public
    */
    function __construct($hash)
    {
        // Though I could be strict, I will actually also accept the naming used in the PHP core hash framework.
        // For instance "sha1" is accepted, while the registered hash name should be "SHA-1".
        $hash = strtolower($hash);
        $hashes = array('md2' => 'md2',
            'md5' => 'md5',
            'sha-1' => 'sha1',
            'sha1' => 'sha1',
            'sha-224' > 'sha224',
            'sha224' > 'sha224',
            'sha-256' => 'sha256',
            'sha256' => 'sha256',
            'sha-384' => 'sha384',
            'sha384' => 'sha384',
            'sha-512' => 'sha512',
            'sha512' => 'sha512');
        if (function_exists('hash_hmac') && isset($hashes[$hash]))
        {
            $this->hash = create_function('$data', 'return hash("' . $hashes[$hash] . '", $data, TRUE);');
            $this->hmac = create_function('$key,$str,$raw', 'return hash_hmac("' . $hashes[$hash] . '", $str, $key, $raw);');
        }
        elseif ($hash == 'md5')
        {
            $this->hash = create_function('$data', 'return md5($data, true);');
            $this->hmac = array($this, '_HMAC_MD5');
        }
        elseif (in_array($hash, array('sha1', 'sha-1')))
        {
            $this->hash = create_function('$data', 'return sha1($data, true);');
            $this->hmac = array($this, '_HMAC_SHA1');
        }
        else
            return PEAR::raiseError('Invalid SASL mechanism type');
    }

    /**
    * Provides the (main) client response for SCRAM-H.
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $challenge The challenge sent by the server.
    * If the challenge is NULL or an empty string, the result will be the "initial response".
    * @param  string $authzid   Authorization id (username to proxy as)
    * @return string|false      The response (binary, NOT base64 encoded)
    * @access public
    */
    public function getResponse($authcid, $pass, $challenge = NULL, $authzid = NULL)
    {
        $authcid = $this->_formatName($authcid);
        if (empty($authcid))
        {
            return false;
        }
        if (!empty($authzid))
        {
            $authzid = $this->_formatName($authzid);
            if (empty($authzid))
            {
                return false;
            }
        }

        if (empty($challenge))
        {
            return $this->_generateInitialResponse($authcid, $authzid);
        }
        else
        {
            return $this->_generateResponse($challenge, $pass);
        }

    }

    /**
    * Prepare a name for inclusion in a SCRAM response.
    *
    * @param string $username a name to be prepared.
    * @return string the reformated name.
    * @access private
    */
    private function _formatName($username)
    {
        // TODO: prepare through the SASLprep profile of the stringprep algorithm.
        // See RFC-4013.

        $username = str_replace('=', '=3D', $username);
        $username = str_replace(',', '=2C', $username);
        return $username;
    }

    /**
    * Generate the initial response which can be either sent directly in the first message or as a response to an empty
    * server challenge.
    *
    * @param string $authcid Prepared authentication identity.
    * @param string $authzid Prepared authorization identity.
    * @return string The SCRAM response to send.
    * @access private
    */
    private function _generateInitialResponse($authcid, $authzid)
    {
        $init_rep = '';
        $gs2_cbind_flag = 'n,'; // TODO: support channel binding.
        $this->gs2_header = $gs2_cbind_flag . (!empty($authzid)? 'a=' . $authzid : '') . ',';

        // I must generate a client nonce and "save" it for later comparison on second response.
        $this->cnonce = $this->_getCnonce();
        // XXX: in the future, when mandatory and/or optional extensions are defined in any updated RFC,
        // this message can be updated.
        $this->first_message_bare = 'n=' . $authcid . ',r=' . $this->cnonce;
        return $this->gs2_header . $this->first_message_bare;
    }

    /**
    * Parses and verifies a non-empty SCRAM challenge.
    *
    * @param  string $challenge The SCRAM challenge
    * @return string|false      The response to send; false in case of wrong challenge or if an initial response has not
    * been generated first.
    * @access private
    */
    private function _generateResponse($challenge, $password)
    {
        // XXX: as I don't support mandatory extension, I would fail on them.
        // And I simply ignore any optional extension.
        $server_message_regexp = "#^r=([\x21-\x2B\x2D-\x7E]+),s=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?),i=([0-9]*)(,[A-Za-z]=[^,])*$#";
        if (!isset($this->cnonce, $this->gs2_header)
            || !preg_match($server_message_regexp, $challenge, $matches))
        {
            return false;
        }
        $nonce = $matches[1];
        $salt = base64_decode($matches[2]);
        if (!$salt)
        {
            // Invalid Base64.
            return false;
        }
        $i = intval($matches[3]);

        $cnonce = substr($nonce, 0, strlen($this->cnonce));
        if ($cnonce <> $this->cnonce)
        {
            // Invalid challenge! Are we under attack?
            return false;
        }

        $channel_binding = 'c=' . base64_encode($this->gs2_header); // TODO: support channel binding.
        $final_message = $channel_binding . ',r=' . $nonce; // XXX: no extension.

        // TODO: $password = $this->normalize($password); // SASLprep profile of stringprep.
        $saltedPassword = $this->hi($password, $salt, $i);
        $this->saltedPassword = $saltedPassword;
        $clientKey = call_user_func($this->hmac, $saltedPassword, "Client Key", TRUE);
        $storedKey = call_user_func($this->hash, $clientKey, TRUE);
        $authMessage = $this->first_message_bare . ',' . $challenge . ',' . $final_message;
        $this->authMessage = $authMessage;
        $clientSignature = call_user_func($this->hmac, $storedKey, $authMessage, TRUE);
        $clientProof = $clientKey ^ $clientSignature;
        $proof = ',p=' . base64_encode($clientProof);

        return $final_message . $proof;
    }

    /**
    * SCRAM has also a server verification step. On a successful outcome, it will send additional data which must
    * absolutely be checked against this function. If this fails, the entity which we are communicating with is probably
    * not the server as it has not access to your ServerKey.
    *
    * @param string $data The additional data sent along a successful outcome.
    * @return bool Whether the server has been authenticated.
    * If false, the client must close the connection and consider to be under a MITM attack.
    * @access public
    */
    public function processOutcome($data)
    {
        $verifier_regexp = '#^v=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?)$#';
        if (!isset($this->saltedPassword, $this->authMessage)
            || !preg_match($verifier_regexp, $data, $matches))
        {
            // This cannot be an outcome, you never sent the challenge's response.
            return false;
        }

        $verifier = $matches[1];
        $proposed_serverSignature = base64_decode($verifier);
        $serverKey = call_user_func($this->hmac, $this->saltedPassword, "Server Key", true);
        $serverSignature = call_user_func($this->hmac, $serverKey, $this->authMessage, TRUE);
        return ($proposed_serverSignature === $serverSignature);
    }

    /**
    * Hi() call, which is essentially PBKDF2 (RFC-2898) with HMAC-H() as the pseudorandom function.
    *
    * @param string $str The string to hash.
    * @param string $hash The hash value.
    * @param int $i The iteration count.
    * @access private
    */
    private function hi($str, $salt, $i)
    {
        $int1 = "\0\0\0\1";
        $ui = call_user_func($this->hmac, $str, $salt . $int1, true);
        $result = $ui;
        for ($k = 1; $k < $i; $k++)
        {
            $ui = call_user_func($this->hmac, $str, $ui, true);
            $result = $result ^ $ui;
        }
        return $result;
    }


    /**
    * Creates the client nonce for the response
    *
    * @return string  The cnonce value
    * @access private
    * @author  Richard Heyes <richard@php.net>
    */
    private function _getCnonce()
    {
        // TODO: I reused the nonce function from the DigestMD5 class.
        // I should probably make this a protected function in Common.
        if (@file_exists('/dev/urandom') && $fd = @fopen('/dev/urandom', 'r')) {
            return base64_encode(fread($fd, 32));

        } elseif (@file_exists('/dev/random') && $fd = @fopen('/dev/random', 'r')) {
            return base64_encode(fread($fd, 32));

        } else {
            $str = '';
            for ($i=0; $i<32; $i++) {
                $str .= chr(mt_rand(0, 255));
            }

            return base64_encode($str);
        }
    }

}

?>
pear/Auth/SASL.php000064400000012325151732710000007646 0ustar00<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes                                 |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net>                               |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Client implementation of various SASL mechanisms
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('PEAR.php');

class Auth_SASL
{
    /**
    * Factory class. Returns an object of the request
    * type.
    *
    * @param string $type One of: Anonymous
    *                             Plain
    *                             CramMD5
    *                             DigestMD5
    *                             SCRAM-* (any mechanism of the SCRAM family)
    *                     Types are not case sensitive
    */
    public static function factory($type)
    {
        switch (strtolower($type)) {
            case 'anonymous':
                $filename  = 'Auth/SASL/Anonymous.php';
                $classname = 'Auth_SASL_Anonymous';
                break;

            case 'login':
                $filename  = 'Auth/SASL/Login.php';
                $classname = 'Auth_SASL_Login';
                break;

            case 'plain':
                $filename  = 'Auth/SASL/Plain.php';
                $classname = 'Auth_SASL_Plain';
                break;

            case 'external':
                $filename  = 'Auth/SASL/External.php';
                $classname = 'Auth_SASL_External';
                break;

            case 'crammd5':
                // $msg = 'Deprecated mechanism name. Use IANA-registered name: CRAM-MD5.';
                // trigger_error($msg, E_USER_DEPRECATED);
            case 'cram-md5':
                $filename  = 'Auth/SASL/CramMD5.php';
                $classname = 'Auth_SASL_CramMD5';
                break;

            case 'digestmd5':
                // $msg = 'Deprecated mechanism name. Use IANA-registered name: DIGEST-MD5.';
                // trigger_error($msg, E_USER_DEPRECATED);
            case 'digest-md5':
                // $msg = 'DIGEST-MD5 is a deprecated SASL mechanism as per RFC-6331. Using it could be a security risk.';
                // trigger_error($msg, E_USER_NOTICE);
                $filename  = 'Auth/SASL/DigestMD5.php';
                $classname = 'Auth_SASL_DigestMD5';
                break;

            default:
                $scram = '/^SCRAM-(.{1,9})$/i';
                if (preg_match($scram, $type, $matches))
                {
                    $hash = $matches[1];
                    $filename = dirname(__FILE__) .'/SASL/SCRAM.php';
                    $classname = 'Auth_SASL_SCRAM';
                    $parameter = $hash;
                    break;
                }
                return PEAR::raiseError('Invalid SASL mechanism type');
                break;
        }

        require_once($filename);
        if (isset($parameter))
            $obj = new $classname($parameter);
        else
            $obj = new $classname();
        return $obj;
    }
}

?>
pear/.depdb000064400000010271151732710000006547 0ustar00a:3:{s:8:"_version";s:3:"1.0";s:12:"dependencies";a:1:{s:12:"pear.php.net";a:6:{s:4:"pear";a:9:{i:0;a:3:{s:3:"dep";a:4:{s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:11:"recommended";s:5:"1.4.3";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:4:{s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.1.0";s:11:"recommended";s:5:"1.1.1";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:4:{s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";s:11:"recommended";s:5:"1.4.1";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:4:{s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.3.0";s:11:"recommended";s:5:"1.4.2";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:4;a:3:{s:3:"dep";a:4:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"max";s:3:"0.4";s:9:"conflicts";s:0:"";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:5;a:3:{s:3:"dep";a:5:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"max";s:5:"0.4.0";s:7:"exclude";s:5:"0.4.0";s:9:"conflicts";s:0:"";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:6;a:3:{s:3:"dep";a:3:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.5.1";}s:4:"type";s:8:"optional";s:5:"group";s:12:"webinstaller";}i:7;a:3:{s:3:"dep";a:3:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.4.0";}s:4:"type";s:8:"optional";s:5:"group";s:12:"gtkinstaller";}i:8;a:3:{s:3:"dep";a:2:{s:4:"name";s:18:"PEAR_Frontend_Gtk2";s:7:"channel";s:12:"pear.php.net";}s:4:"type";s:8:"optional";s:5:"group";s:13:"gtk2installer";}}s:9:"file_marc";a:1:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:13:"Validate_ISPN";s:7:"channel";s:12:"pear.php.net";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:4:"mail";a:1:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:15:"mail_mimedecode";a:1:{i:0;a:3:{s:3:"dep";a:4:{s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:7:"exclude";s:5:"1.4.0";}s:4:"type";s:8:"required";s:5:"group";b:0;}}s:9:"net_sieve";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:8:"net_smtp";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.7";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.5";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}}}s:8:"packages";a:1:{s:12:"pear.php.net";a:12:{s:11:"archive_tar";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:16:"structures_graph";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:14:"console_getopt";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:8:"xml_util";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_web";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_gtk";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:18:"pear_frontend_gtk2";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:13:"validate_ispn";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"file_marc";}}s:8:"net_smtp";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"mail";}}s:9:"mail_mime";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:15:"mail_mimedecode";}}s:10:"net_socket";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}s:9:"auth_sasl";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}}}}pear/.pkgxml/Pear_Mail-1.4.1.xml000064400000007510151732710000012064 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail</name>
 <channel>pear.php.net</channel>
 <summary>Class that provides multiple interfaces for sending emails</summary>
 <description>PEAR&apos;s Mail package defines an interface for implementing mailers under the PEAR hierarchy.  It also provides supporting functions useful to multiple mailer backends.  Currently supported backends include: PHP&apos;s native mail() function, sendmail, and SMTP.  This package also provides a RFC822 email address list validation utility class.</description>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>no</active>
 </lead>
 <developer>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@phpguru.org</email>
  <active>no</active>
 </developer>
 <developer>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@alec.pl</email>
  <active>yes</active>
 </developer>
 <date>2017-04-11</date>
 <time>17:26:44</time>
 <version>
  <release>1.4.1</release>
  <api>1.3.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="https://opensource.org/licenses/BSD-3-Clause">New BSD License</license>
 <notes>
* Loosen recognition of &quot;queued as&quot; server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn&apos;t close socket for smtp connection
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="8210c33901d415a2692944291632bf34" name="LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="4e86cd3b980f73ef320988a1b299ee07" name="Mail/mail.php" role="php" />
   <file baseinstalldir="/" md5sum="360b7b613c98c7703151c50a6e74c367" name="Mail/mock.php" role="php" />
   <file baseinstalldir="/" md5sum="30ce63a4a2c4558b3752b1c302e6e508" name="Mail/null.php" role="php" />
   <file baseinstalldir="/" md5sum="7199f4e7b07919082a804edb8680c811" name="Mail/RFC822.php" role="php" />
   <file baseinstalldir="/" md5sum="5dd0b6ff126608818f44f5866b61b3d0" name="Mail/sendmail.php" role="php" />
   <file baseinstalldir="/" md5sum="1d236356d52f3dfa13b740a48a821586" name="Mail/smtp.php" role="php" />
   <file baseinstalldir="/" md5sum="853b55cf4803df8caaaa0dca363971ff" name="Mail/smtpmx.php" role="php" />
   <file baseinstalldir="/" md5sum="3077f0c01f72cc29a6f8f0175e7fc8a7" name="Mail.php" role="php" />
   <file baseinstalldir="/" md5sum="d66aa2a2f0bfe33f8a67d749a1a4d345" name="tests/9137.phpt" role="test" />
   <file baseinstalldir="/" md5sum="75d10361f686f1cc16637a9364e3eab7" name="tests/9137_2.phpt" role="test" />
   <file baseinstalldir="/" md5sum="63715aad2b5b3ae35c6b05acf04d9ad7" name="tests/13659.phpt" role="test" />
   <file baseinstalldir="/" md5sum="e99f00d8f07232e0f129dd77ae9699c7" name="tests/bug17178.phpt" role="test" />
   <file baseinstalldir="/" md5sum="c2036980390981cd6b89c1e5c903913e" name="tests/bug17317.phpt" role="test" />
   <file baseinstalldir="/" md5sum="7b0eae971fe7595e7c1a563fbfcfee90" name="tests/rfc822.phpt" role="test" />
   <file baseinstalldir="/" md5sum="67becdb1027cefcb8dff1b691da630ab" name="tests/smtp_error.phpt" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.1</min>
   </php>
   <pearinstaller>
    <min>1.5.6</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Net_SMTP</name>
    <channel>pear.php.net</channel>
    <min>1.4.1</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
pear/.pkgxml/Pear_Structures_LinkedList-0.2.2.xml000064400000010455151732710000015507 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Structures_LinkedList</name>
 <channel>pear.php.net</channel>
 <summary>Implements singly and doubly-linked lists</summary>
 <description>A singly-linked list offers the ability to insert or delete
 nodes at any point within the list. A doubly-linked list also offers the
 ability to request previous nodes in the list.</description>
 <lead>
  <name>Dan Scott</name>
  <user>dbs</user>
  <email>dbs@php.net</email>
  <active>yes</active>
 </lead>
 <date>2010-08-15</date>
 <time>10:13:00</time>
 <version>
  <release>0.2.2</release>
  <api>0.2.0</api>
 </version>
 <stability>
  <release>beta</release>
  <api>beta</api>
 </stability>
 <license uri="http://apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</license>
 <notes>
* Fix package layout
 </notes>
 <contents>
  <dir baseinstalldir="Structures/LinkedList" name="/">
   <file baseinstalldir="/" md5sum="b7ac5a9d6d9a3eb2c3cbb1db76ad75a3" name="Structures/LinkedList/Double.php" role="php" />
   <file baseinstalldir="/" md5sum="310eefdff99016e4a3282dd02d5a7efa" name="Structures/LinkedList/Single.php" role="php" />
   <file baseinstalldir="Structures/LinkedList" md5sum="9b1565a45687bb631a452b152e0d3d15" name="examples/double_link_example.php" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="56d8c9a65cf967f09136a1b5b42fb787" name="examples/single_link_example.php" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="54a63c64625c0b1785d890cc0ecb6957" name="tests/LinkTester.php" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6138a89189609d8b0c35a69ce6995457" name="tests/SingleLinkTester.php" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="c7a6ad89f79222cf62148893e88a0b5a" name="tests/link_001.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="960408b3ea85cfe453f7d4b1814784ea" name="tests/link_002.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="392d4c38523f764091433fdf19cf4943" name="tests/link_003.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="88bfd20fe97800c4f69ec7577abd2ecd" name="tests/link_004.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="dac8403b1df9d64e16e45e87121a74fa" name="tests/link_005.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="bfc84666dbe64008101adadecf008677" name="tests/link_006.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="1a7eb8c8a63ec97fdb0154214c679cfa" name="tests/link_007.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="86f0c12acf2706a82d0d0dc625ab3608" name="tests/single_link_001.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="19c3e9b406dffe9c315e0264e0d257f8" name="tests/single_link_002.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="d4029576a49c41f18c35f72bdb37da7e" name="tests/single_link_003.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="574cb63523d7716f37fad368eefc695b" name="tests/single_link_004.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="4712a8421da2369e72ec789e0fe3993f" name="tests/single_link_005.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="a7f31515a9a3260aa1c17e003a4c352c" name="tests/single_link_006.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6fe94be57c862475367ed91a7284a6b2" name="tests/single_link_007.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6e8edc55d5a37acbe96ed9860b8680cc" name="CHANGELOG" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="3b83ef96387f14655fc854ddc3c6bd57" name="LICENSE" role="doc" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.0</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
pear/.pkgxml/Pear_Mail_Mime-1.10.11.xml000064400000111264151732710000013173 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd             http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail_Mime</name>
 <channel>pear.php.net</channel>
 <summary>Mail_Mime provides classes to create MIME messages.</summary>
 <description>Mail_Mime provides classes to deal with the creation and manipulation of MIME messages.
It allows people to create e-mail messages consisting of:
* Text Parts
* HTML Parts
* Inline HTML Images
* Attachments
* Attached messages

It supports big messages, base64 and quoted-printable encodings and
non-ASCII characters in filenames, subjects, recipients, etc. encoded
using RFC2047 and/or RFC2231.</description>
 <lead>
  <name>Cipriano Groenendal</name>
  <user>cipri</user>
  <email>cipri@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@php.net</email>
  <active>yes</active>
 </lead>
 <date>2021-09-05</date>
 <time>08:43:21</time>
 <version>
  <release>1.10.11</release>
  <api>1.10.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
 <notes>
* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]
 </notes>
 <contents>
  <dir name="/">
   <file baseinstalldir="Mail" md5sum="edd138f6c5497ae2b5d63620a67a931e" name="tests/class-filename.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="7ec986391d0af058316f66e5a507e059" name="tests/content_transfer_encoding.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="c1a43360d9b2cb5f9542503a4355c277" name="tests/encoding_case.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="bf50a200190cad5e2d4aae4e120ea09f" name="tests/headers_with_mbstring.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="9a2d207f873317125ff43c092f3f0d25" name="tests/headers_without_mbstring.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="25d4c5b9fdeaabc7810c26e6f89e95ca" name="tests/qp_encoding_test.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="958197f31b4a20c91dd42662595e7516" name="tests/sleep_wakeup_EOL-bug3488-part1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="46675529f1f021b51a1aa0ae6c971cd2" name="tests/sleep_wakeup_EOL-bug3488-part2.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f8c05910737e451c7a9d4737b8d9f095" name="tests/test_Bug_3513_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="edb467a375ddf09e777a9388e2e8cbb5" name="tests/test_Bug_3513_2.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="70c2456445eaaa80779206e9e245d685" name="tests/test_Bug_3513_3.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="4cda500d0d7925e81a299f1d3db132a9" name="tests/test_Bug_7561_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="42a214e7e3d3afa07f8996b235222611" name="tests/test_Bug_8386_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ed78099563499f60386a128cb7b96925" name="tests/test_Bug_8541_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="5250a0693599b945e8642a1a289d7275" name="tests/test_Bug_9722_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b7f58f54e1485c23a60c83cd3cc5563e" name="tests/test_Bug_10596_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ccb53d80e7f5c9f28b11abce5fe5d490" name="tests/test_Bug_10816_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f3d92a1fff099173b8600fb3646d0614" name="tests/test_Bug_10999_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="3f2757d5db43abd8f177f094f4d53625" name="tests/test_Bug_11381.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="c64d675e73bc02fc94f5d03b3117cfa0" name="tests/test_Bug_11731.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8c9305ca05f5ed2d7cd7e31e4836f17a" name="tests/test_Bug_12165.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="2aa2c3dfbe44500809e79da994272611" name="tests/test_Bug_12385_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ef1d726233dbd3360c540fd6a959b0d0" name="tests/test_Bug_12411.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="a862a57ff622fcbb2328be6c805e2d05" name="tests/test_Bug_12466.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="4eddeeac08f351feb147ab6fda439526" name="tests/test_Bug_13032.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="de15a0657a83694bc6991c4184ccf9bd" name="tests/test_Bug_13444.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="80afe9fced03288884e9d302d1e65b2d" name="tests/test_Bug_13962.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="89bf87e798f4a149a150d4c2a505f976" name="tests/test_Bug_14529.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="5f9100adb1c609110ed495fafa819975" name="tests/test_Bug_14779.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="45eb42fe4e325da64f1ae8f149e2a396" name="tests/test_Bug_14780.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="609dad2083c54ba56ea691c488ca20e2" name="tests/test_Bug_15320.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f4ef08e416e775558e8075b531bbc814" name="tests/test_Bug_16539.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ed1bd0fc9067b3fb8b95808bfa315916" name="tests/test_Bug_17025.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8a37de74fb39fed4566617a7ea38bb69" name="tests/test_Bug_17175.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b9dee3c7c45d8c6c22f860e93c3769b9" name="tests/test_Bug_18083.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="96ce23ad1a1d6417facfcdd2baa9c8eb" name="tests/test_Bug_18772.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="dd98307b3224b173f7b54f7e403865a4" name="tests/test_Bug_19497.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="e1194180cb6a218fab69db90f88d1cb2" name="tests/test_Bug_20226.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="1b7919174edcd1cf5d5fd5a622fdac9b" name="tests/test_Bug_20273.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="6513c4b0c9e962c900d020124752333e" name="tests/test_Bug_20563.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="7c7a00818cb0f01fa6c52c920b9e76c6" name="tests/test_Bug_20564.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b9e31a9c24b05dfb6166512e04e2f056" name="tests/test_Bug_21027.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b634a5e99aa26a8b6df8fcfae07051b4" name="tests/test_Bug_21098.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b21be5b099a69428bd37e60589cdd485" name="tests/test_Bug_21205.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="bc152c12839964fba15da5673d25c4db" name="tests/test_Bug_21206.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ccf732525be42c955eea18e78490c3e1" name="tests/test_Bug_21255.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="579f1e11da6c8074dbf508dc1f1dedfa" name="tests/test_Bug_GH16.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="df32d66d9fccf7a0956422811283272a" name="tests/test_Bug_GH19.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b7b5b5bacc6a599cfaece35ad202ad1a" name="tests/test_Bug_GH26.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="e08958f1bb60561f072a3508b8fd3e2e" name="tests/test_linebreak_dot.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8398e9bfea0bc7c4ff0770ae3d6279fe" name="tests/test_linebreak_larger_76.phpt" role="test" />
   <file baseinstalldir="/" md5sum="e5c9ac7f32e53afdeafd1a84343a89ae" name="Mail/mime.php" role="php" />
   <file baseinstalldir="/" md5sum="36128789ad1101d39d13b06ca2585576" name="Mail/mimePart.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.0</min>
   </php>
   <pearinstaller>
    <min>1.6.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.0</release>
    <api>1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2001-12-28</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
This is the initial release of the Mime_Mail package.
   </notes>
  </release>
  <release>
   <version>
    <release>1.1</release>
    <api>1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-04-03</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
This is a maintenance release with various bugfixes and minor enhancements.
   </notes>
  </release>
  <release>
   <version>
    <release>1.2</release>
    <api>1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-07-14</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* Added header encoding
* Altered mimePart to put boundary parameter on newline
* Changed addFrom() to setFrom()
* Added setSubject()
* Made mimePart inherit crlf setting from mime
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.1</release>
    <api>1.2.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-07-27</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* License change
* Applied a few changes From Ilia Alshanetsky
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0RC1</release>
    <api>1.3.0RC1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2005-03-20</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* First release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-04-01</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* First (stable) release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
* one small fix after RC1 (bug #3940)
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-07-13</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>

   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-03-08</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Changed License to BSD Style license, as that&apos;s what the code was since the beginning [cipri]
* Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #4696: addAttachment crash [cipri]
* Fix Bug #5333: Only variables should be returned by reference; triggers notices since php 4.4.0 [cipri]
* Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring overload [cipri]
* Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
* Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
* Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
* Fix Bug #9347: Notices about references [cweiske]
* Fix Bug #9558: Broken multiline headers [cipri]
* Fix Bug #9956: Notices being thrown [cipri]
* Fix Bug #9976: Subject encoded twice [cipri]
* Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
* Implement Feature #3636: Allow specification of charsets and encoding [cipri]
* Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
* Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
* Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
* Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
* Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-04-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
  platform [cipri]
* Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
* Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
* Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
* Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-04-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-12</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-22</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10791: Unit tests fail [cipri]
* Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
* Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-24</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC4</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-28</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #10838: bad use of MIME encoding in header. [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-05-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Release notes:
 * No more notices in PHP 5 /4.4.0.
 * Improved inline HTML image function.
 * Improved header encoding with foreign charsets.
 * Improved long header rendering.
 * More control over used Charsets and encoding schemes.
 * More configurable attachments and inline images.
 * Full RFC 2047 Support
 * Full RFC 2231 Support
 * Unit-tests

Fixed bugs:
 * Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
 * Fix Bug #3513: support of RFC2231 in header fields. [cipri]
 * Fix Bug #4696: addAttachment crash [cipri]
 * Fix Bug #5333: Only variables should be returned by reference; triggers notices since
   php 4.4.0 [cipri]
 * Fix Bug #5400: Do not return function reference [cipri]
 * Fix Bug #5710: Little reference bugs [cipri]
 * Fix Bug #5890: Only variable references should be returned by reference [cipri]
 * Fix Bug #6260: Just a notice with PHP5 [cipri]
 * Fix Bug #6261: php 5.1.1 upgrade [cipri]
 * Fix Bug #6663: Notice about reference passing [cipri]
 * Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring
   overload [cipri]
 * Fix Bug #7713: PHP5 Notice: Only variable references should be returned by reference [cipri]
 * Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
 * Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
 * Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
 * Fix Bug #8812: user header updates overwritten [cipri]
 * Fix Bug #9347: Notices about references [cweiske]
 * Fix Bug #9558: Broken multiline headers [cipri]
 * Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
   platform [cipri]
 * Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
 * Fix Bug #9956: Notices being thrown [cipri]
 * Fix Bug #9976: Subject encoded twice [cipri]
 * Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
 * Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
 * Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
 * Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
 * Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
 * Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
 * Fix Bug #10791: Unit tests fail [cipri]
 * Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
 * Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
 * Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
 * Fix Bug #10838: bad use of MIME encoding in header. [cipri]
Implemented Features:
 * Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
 * Implement Feature #3636: Allow specification of charsets and encoding [cipri]
 * Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
 * Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
 * Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
 * Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
 * Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
 * Implement Feature #10604: Put an option to specify Content-Location in the header [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0a1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-17</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off Mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-20</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #11344: Error at line 644 in mime.php [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-21</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #11381: domain name is attached to content-id, trailing greater-than sign is
  not remove [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.3</release>
    <api>1.3.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2009-12-29</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Fixed bugs:
 * Fix Bug #14678: srand() lowers security [clockwerx]
 * Fix Bug #12921: _file2str not binary safe [walter]
 * Fix Bug #12385: Bad regex when replacing css style attachments [cipri]
 * Fix Bug #16911: Excessive semicolon in MIME header [alec]
 * Fix Bug #15320: Attachment charset is not set in Content-Type header [alec]
 * Fix Bug #16911: Lack of semicolon separator for MIME header parameters [alec]
 * Fix Bug #16846: Use preg_replace_callback() instead of /e modifier [alec]
 * Fix Bug #14779: Problem with an empty attachment [alec]
 * Fix Bug #15913: Optimize the memory used by Mail_mimePart::encode.
                   Avoid having attachments data duplicated in memory [alec]
 * Fix Bug #16539: Headers longer than 998 characters aren&apos;t wrapped [alec]
 * Fix Bug #11238: Wrong encoding of structured headers [alec]
 * Fix Bug #13641: iconv_mime_encode() seems to work different/errorious than
                   the build in logic. Removed &apos;ignore_iconv&apos; param.  [alec]
 * Fix Bug #16706: Incorrect double-quotes RFC 2231-encoded parameter values [alec]
 * Fix Bug #14232: RFC2231: tspecials encoding in _buildHeaderParam() [alec]
Implemented Features:
 * Implement Feature #10438: Function (encodeHeader) for encoding of given header [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-01-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Don&apos;t break specified headers folding [alec]
 * Bug #17025: Wrong headers() result for long unwrapable header value [alec]

Implemented Features:
 * Allow setting Content-ID for HTML Images [alec]
 * Added one setParam() in place of many set*() functions [alec]
 * Added getParam(), getTXTBody(), getHTMLBody() [alec]
 * Skip RFC2231&apos;s charset if filename contains only ASCII characters [alec]
 * Make sure that Received: headers are returned on the top [alec]
 * Added saveMessageBody() and getMessageBody() functions [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-08</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Fix encoding of Return-Receipt-To and Disposition-Notification-To headers [alec]

Implemented Features:
 * Implement Feature #12466: Build parameters validation [alec]
 * Implement Feature #17175: Content-Description support for attachments [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-23</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Fix Bug #17226: Non RFC-compliant quoted-printable encoding of structured headers [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.7.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-04-12</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Implemented Features:
 * Added Mail_mime::setContentType() function with possibility to set various
   types in Content-Type header (also fixes problem with boundary parameter when Content-Type
   header was specified by user) [alec]
   </notes>
  </release>
  <release>
   <date>2010-07-29</date>
   <version>
    <release>1.8.0</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Double-addition of e-mail domain to content ID in HTML images [alec]
 * #17311: Multi-octet characters are split across adjacent &apos;encoded-word&apos;s [alec]
 * #17573: Place charset parameter in first line of Content-Type header (if possible) [alec]
Implemented Features:
 * #17518: addTo() method [alec]
   </notes>
  </release>
  <release>
   <date>2010-12-01</date>
   <version>
    <release>1.8.1</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * #18083: Not possible to set separate charset for attachment content and headers [alec]
   </notes>
  </release>
  <release>
   <date>2011-08-10</date>
   <version>
    <release>1.8.2</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * #18426: Fixed backward compatibility for &quot;dfilename&quot; parameter [alec]
 * Removed xmail.dtd, xmail.xsl from the package [alec]
 * Fixed handling of email addresses with quoted local part [alec]
   </notes>
  </release>
  <release>
   <date>2012-03-12</date>
   <version>
    <release>1.8.3</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Request #19009: Remove error_reporting from tests [alec]
* Fixed Bug #19094: Email addresses do not have to contain a space between the name and address part [alec]
* Fixed Bug #19328: Wrong encoding of filenames with comma [alec]
   </notes>
  </release>
  <release>
   <date>2012-05-17</date>
   <version>
    <release>1.8.4</release>
    <api>1.4.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Request #19406: Allow to set individual attachment part headers [alec]
* Fixed Bug #18982: Non-static method Mail_mimePart::encodeHeader() should not be called statically [alec]
   </notes>
  </release>
  <release>
   <date>2012-06-09</date>
   <version>
    <release>1.8.5</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Added possibility to set additional parameters of message part header, e.g. attachment size [alec]
* Added automatic setting of attachment size via Content-Disposition header size parameter [alec]
   </notes>
  </release>
  <release>
   <date>2012-10-23</date>
   <version>
    <release>1.8.6</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #19473: PEAR::isError() compatibility problem with PHP 5.4 [alec]
* Bug #19497: Attachment filename is cut on slash character [alec]
* Bug #19665: Add Mail-Reply-To and Mail-Followup-To to structured recipient headers list [alec]
   </notes>
  </release>
  <release>
   <date>2012-12-25</date>
   <version>
    <release>1.8.7</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #5333: Fix more return by reference errors [alec]
* Bug #19754: Fix compatibility with PHP4 [alec]
   </notes>
  </release>
  <release>
   <date>2013-07-05</date>
   <version>
    <release>1.8.8</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fixed warning/notice on (static vs. non-static) PEAR::raiseError() usage [alec]
* Fixed Bug #19761: PHP5 warnings about return by reference [alec]
* Fixed Bug #19770: Make cid generator more unique on Windows [alec]
* Fixed Bug #19987: E_STRICT warning when null is passed by reference [alec]
   </notes>
  </release>
  <release>
   <date>2014-05-14</date>
   <version>
    <release>1.8.9</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fixed Bug #20273: Incorrect handling of HTAB in encodeHeader() [alec]
* Fixed Bug #20226: Mail_mimePart::encodeHeader does not encode ISO-2022-JP string [alec]
* Fixed Bug #20222: Broken Compatybility with PHP4 [alec]
   </notes>
  </release>
  <release>
   <date>2015-07-05</date>
   <time>12:50:00</time>
   <version>
    <release>1.9.0RC1</release>
    <api>2.0.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Drop PHP4 support, Fix warnings on PHP7 [alec]
* Request #20564: Added possibility to unset headers [alec]
* Request #20563: Added isMultipart() method [alec]
* Request #20565: Accept also a file pointer in Mail_mimePart::encodeToFile(),
                  Mail_mime::get() and Mail_mime::saveMessageBody() [alec]
   </notes>
  </release>
  <release>
   <date>2015-08-06</date>
   <time>12:00:00</time>
   <version>
    <release>1.9.0</release>
    <api>1.9.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #20921: Make Mail_mimePart::encodeHeaderValue() a static method [alec]
* Bug #20931: Really remove unset headers [alec]
* Request #18772: Added methods for creating text/calendar messages [alec]
   </notes>
  </release>
  <release>
   <date>2015-09-13</date>
   <time>12:00:00</time>
   <version>
    <release>1.10.0</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Add possibility to add externally created Mail_mimePart objects as attachments [alec]
* Add possibility to set preamble text for multipart messages [alec]
   </notes>
  </release>
  <release>
   <date>2017-05-21</date>
   <time>12:00:00</time>
   <version>
    <release>1.10.1</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug 21206: explodeQuotedString() does not handle quoted strings correctly [dfukagaw28]
* Fix Bug 21205: Invalid encoding of headers with quoted multibyte strings in non-unicode charset [dfukagaw28]
* Fix Bug 21098: Discrepancy in handling of empty (but set) plain text part [alec]
   </notes>
  </release>
  <release>
   <date>2017-11-17</date>
   <time>11:00:00</time>
   <version>
    <release>1.10.2</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #21255: Boundary gets added twice when using setContentType() [alec]
* PHP 7.2 compatibility fixes [alec]
   </notes>
  </release>
  <release>
   <date>2019-09-25</date>
   <time>08:00:00</time>
   <version>
    <release>1.10.3</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix deprecation warning for get_magic_quotes_runtime() use on PHP 7.4 [alec]
   </notes>
  </release>
  <release>
   <date>2019-10-13</date>
   <time>11:00:00</time>
   <version>
    <release>1.10.4</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix E_STRICT errors introduced in the previous release [alec]
   </notes>
  </release>
  <release>
   <date>2020-01-24</date>
   <time>19:00:00</time>
   <version>
    <release>1.10.5</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Make sure to not set Content-Transfer-Encoding on multipart messages [alec]
* Added support for calendar invitations with attachments/html/images [jacalben]
   </notes>
  </release>
  <release>
   <date>2020-01-30</date>
   <time>08:25:00</time>
   <version>
    <release>1.10.6</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix different boundary in headers and body when using headers() after get() [alec]
* Removed phail.php script [alec]
   </notes>
  </release>
  <release>
   <date>2020-03-01</date>
   <time>08:50:00</time>
   <version>
    <release>1.10.7</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix invalid Content-Type for messages with only html part and inline images [alec]
   </notes>
  </release>
  <release>
   <date>2020-06-13</date>
   <time>08:50:00</time>
   <version>
    <release>1.10.8</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix encoding issues with ISO-2022-JP-MS input labelled with ISO-2022-JP [shirosaki]
   </notes>
  </release>
  <release>
   <date>2020-06-27</date>
   <time>10:30:00</time>
   <version>
    <release>1.10.9</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Added a workaround for an opcache bug on OpenSuse 15.1 [alec]
   </notes>
  </release>
  <release>
   <date>2021-01-17</date>
   <time>09:25:00</time>
   <version>
    <release>1.10.10</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Compatibility fixes for PHP 5.2 and 5.3 [alec]
* Corrected soft line breaks handling to be RFC compliant [ixs]
* Corrected line breaks for lines ending in dots and length more than 74 [ixs]
   </notes>
  </release>
 </changelog>
</package>
pear/.pkgxml/Pear_Net_IDNA2-0.2.0.xml000064400000006104151732710000012577 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="https://pear.php.net/dtd/package-2.0" xmlns:tasks="https://pear.php.net/dtd/tasks-1.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://pear.php.net/dtd/tasks-1.0 https://pear.php.net/dtd/tasks-1.0.xsd https://pear.php.net/dtd/package-2.0 https://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_IDNA2</name>
 <channel>pear.php.net</channel>
 <summary>Punycode encoding and decoding.</summary>
 <description>This package helps you to encode and decode punycode strings easily.</description>
 <lead>
  <name>Stefan Neufeind</name>
  <user>neufeind</user>
  <email>pear.neufeind@speedpartner.de</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Daniel O&apos;Connor</name>
  <user>doconnor</user>
  <email>daniel.oconnor@gmail.com</email>
  <active>no</active>
 </lead>
 <date>2017-03-06</date>
 <time>20:40:58</time>
 <version>
  <release>0.2.0</release>
  <api>0.2.0</api>
 </version>
 <stability>
  <release>beta</release>
  <api>beta</api>
 </stability>
 <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
 <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="41766020ff8f63f695c9bf7e86040e70" name="Net/IDNA2.php" role="php" />
   <file baseinstalldir="/" md5sum="72f605f2f6d9d56e07bb6bcec099d03a" name="Net/IDNA2/Exception.php" role="php" />
   <file baseinstalldir="/" md5sum="06c4217024082f0f3b6c5a7e61ac7130" name="Net/IDNA2/Exception/Nameprep.php" role="php" />
   <file baseinstalldir="/" md5sum="999210e6bd489aba06e5121a2788956f" name="tests/Net_IDNA2Test.php" role="test" />
   <file baseinstalldir="/" md5sum="2996ea57df9e5e3153da8a94fbb3c603" name="tests/draft-josefsson-idn-test-vectors.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1.0</release>
    <api>0.1.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2010-06-03</date>
   <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
   <notes>
QA Release
Bug #17430 	Multiple Net_IDNA class declarations
Warning: This package is now split between Net_IDNA (php4) and Net_IDNA2 (php5)
   </notes>
  </release>
  <release>
   <version>
    <release>0.2.0</release>
    <api>0.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2017-03-06</date>
   <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package
   </notes>
  </release>
 </changelog>
</package>
pear/.pkgxml/Pear_Auth_SASL-1.1.0.xml000064400000013345151732710000012724 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0   http://pear.php.net/dtd/tasks-1.0.xsd   http://pear.php.net/dtd/package-2.0   http://pear.php.net/dtd/package-2.0.xsd">
 <name>Auth_SASL</name>
 <channel>pear.php.net</channel>
 <summary>Abstraction of various SASL mechanism responses</summary>
 <description>Provides code to generate responses to common SASL mechanisms, including:
- Digest-MD5
- Cram-MD5
- Plain
- Anonymous
- Login (Pseudo mechanism)
- SCRAM</description>
 <lead>
  <name>Anish Mistry</name>
  <user>amistry</user>
  <email>amistry@am-productions.biz</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Michael Bretterklieber</name>
  <user>mbretter</user>
  <email>michael@bretterklieber.com</email>
  <active>no</active>
 </lead>
 <date>2017-03-07</date>
 <time>14:04:34</time>
 <version>
  <release>1.1.0</release>
  <api>1.1.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
 <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="60f7b5ba4d05fe0e518292963b14bddb" name="Auth/SASL/Anonymous.php" role="php" />
   <file md5sum="c2c817e4775b6f63f07ddb0c9cbd88b5" name="Auth/SASL/Common.php" role="php" />
   <file md5sum="c6b3b3a4e0aec6a4e0728732ef6babc9" name="Auth/SASL/CramMD5.php" role="php" />
   <file md5sum="509e431141489a77a991401d64f15e9e" name="Auth/SASL/DigestMD5.php" role="php" />
   <file md5sum="1d7478dd9dc5734ec9e16c158dcb6f76" name="Auth/SASL/External.php" role="php" />
   <file md5sum="3a0abcf277374b24262807150451b55e" name="Auth/SASL/Login.php" role="php" />
   <file md5sum="bde1dcf2780d042c1de12e20a696e945" name="Auth/SASL/Plain.php" role="php" />
   <file md5sum="e99f9f71abc36d64ca8e17ad6e5e7631" name="Auth/SASL/SCRAM.php" role="php" />
   <file md5sum="b93e37947e1dd90e5fb639a1734f7a71" name="Auth/SASL.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-03-07</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.6</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-09-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Bug #18856: Authentication warnings because of wrong Auth_SASL::factory argument [kguest]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.5</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-09-04</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Added support for any mechanism of the SCRAM family; with thanks to Jehan Pagès. [kguest]
* crammd5 and digestmd5 mechanisms name deprecated in favour of IANA registered names &apos;cram-md5&apos; and &apos;digest-md5&apos;; with thanks to Jehan Pagès. [kguest]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.4</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-02-07</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Fix bug #16624: open_basedir restriction warning in DigestMD5.php [till]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.3</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2009-08-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Move SVN to proper directory structure [cweiske]
* Fix Bug #8775: Error in package.xml
* Fix Bug #14671: Security issue due to seeding random number generator [cweiske]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.2</release>
    <api>1.0.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-05-21</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #2143 Auth_SASL_DigestMD5::getResponse() generates invalid response
* Fixed Bug #6611 Suppress PHP 5 Notice Errors
* Fixed Bug #2154 realm isn&apos;t contained in challange
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.1</release>
    <api>1.0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-11</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added authcid/authzid separation in PLAIN and DIGEST-MD5.
   </notes>
  </release>
 </changelog>
</package>
pear/.pkgxml/XML_Util.xml000064400000045621151732710000011236 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.5" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>XML_Util</name>
 <channel>pear.php.net</channel>
 <summary>XML utility class</summary>
 <description>Selection of methods that are often needed when working with XML documents.  Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more.</description>
 <lead>
  <name>Chuck Burgess</name>
  <user>ashnazg</user>
  <email>ashnazg@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Stephan Schmidt</name>
  <user>schst</user>
  <email>schst@php-tools.net</email>
  <active>no</active>
 </lead>
 <helper>
  <name>Davey Shafik</name>
  <user>davey</user>
  <email>davey@php.net</email>
  <active>no</active>
 </helper>
 <date>2020-04-19</date>
 <time>14:54:10</time>
 <version>
  <release>1.4.5</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
 <notes>
* PR #12: fix Trying to access array offset on value of type int
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="af2746028ae4395f549855a5e444ada7" name="examples/example.php" role="doc" />
   <file baseinstalldir="/" md5sum="b9e52f4aa372c4067c609f49c2285b8f" name="examples/example2.php" role="doc" />
   <file baseinstalldir="/" md5sum="d0af9354df0962e70e9e2215b5611b9c" name="tests/AbstractUnitTests.php" role="test" />
   <file baseinstalldir="/" md5sum="57ce547d64d6e1f2986c313407deffef" name="tests/ApiVersionTests.php" role="test" />
   <file baseinstalldir="/" md5sum="2d0427db94790df7ada24a744547edf5" name="tests/AttributesToStringTests.php" role="test" />
   <file baseinstalldir="/" md5sum="673d1438c4718a70c5da3fe019027db4" name="tests/CollapseEmptyTagsTests.php" role="test" />
   <file baseinstalldir="/" md5sum="46b981f91edd163f1cd021cfef5d1bb1" name="tests/CreateCDataSectionTests.php" role="test" />
   <file baseinstalldir="/" md5sum="6aa925b879572e9b3f1885b7cdbb223b" name="tests/CreateCommentTests.php" role="test" />
   <file baseinstalldir="/" md5sum="dbc083b62a020fa245fde5a7828a4806" name="tests/CreateEndElementTests.php" role="test" />
   <file baseinstalldir="/" md5sum="f58e38343ecf60811c842d4cfc8194ae" name="tests/CreateStartElementTests.php" role="test" />
   <file baseinstalldir="/" md5sum="9385fba272f4ebccf4c95d43d16dcff4" name="tests/CreateTagTests.php" role="test" />
   <file baseinstalldir="/" md5sum="51e7ba1390e6dadc3c0be0c960bf171d" name="tests/CreateTagFromArrayTests.php" role="test" />
   <file baseinstalldir="/" md5sum="6bbb54ef4cf56dc2c0b558b295de5668" name="tests/GetDocTypeDeclarationTests.php" role="test" />
   <file baseinstalldir="/" md5sum="825b440b0ee8abd10b4df017c08bf15f" name="tests/GetXmlDeclarationTests.php" role="test" />
   <file baseinstalldir="/" md5sum="e6783bb330f8f2ae7225f02d56f194e4" name="tests/IsValidNameTests.php" role="test" />
   <file baseinstalldir="/" md5sum="b273525b905ae6d5fc53adcb3ce0b8d9" name="tests/RaiseErrorTests.php" role="test" />
   <file baseinstalldir="/" md5sum="20befbef5e55639539336761a17c64f3" name="tests/ReplaceEntitiesTests.php" role="test" />
   <file baseinstalldir="/" md5sum="a3ceff3302e31f90130be01c312b33b3" name="tests/ReverseEntitiesTests.php" role="test" />
   <file baseinstalldir="/" md5sum="aeb95108896180ef77a7dce3c310a3b8" name="tests/SplitQualifiedNameTests.php" role="test" />
   <file baseinstalldir="/" md5sum="e93010b1eff68f889fefcb006bf20b63" name="tests/Bug4950Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="748ffb640e13e7b960385c7e12413782" name="tests/Bug5392Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="01e68b66e27a6fdb197d572c67ae6bc5" name="tests/Bug18343Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="d945220c38344bc773b18244439bb0cc" name="tests/Bug21177Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="af2672bb90875c2e00f93f563bfafe70" name="tests/Bug21184Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="0db6fa9c169bf6904aa7e588c2325a13" name="XML/Util.php" role="php">
    <tasks:replace from="@version@" to="version" type="package-info" />
   </file>
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.9.0</min>
   </pearinstaller>
   <extension>
    <name>pcre</name>
   </extension>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1</release>
    <api>0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-01</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
inital release
   </notes>
  </release>
  <release>
   <version>
    <release>0.1.1</release>
    <api>0.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-02</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
bugfix: removed bug in createTagFromArray
   </notes>
  </release>
  <release>
   <version>
    <release>0.2</release>
    <api>0.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-12</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added XML_Util::getDocTypeDeclaration()
   </notes>
  </release>
  <release>
   <version>
    <release>0.2.1</release>
    <api>0.2.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-05</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
fixed bug with zero as tag content in createTagFromArray and createTag
   </notes>
  </release>
  <release>
   <version>
    <release>0.3</release>
    <api>0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-12</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added createStartElement() and createEndElement()
   </notes>
  </release>
  <release>
   <version>
    <release>0.4</release>
    <api>0.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-21</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added createCDataSection(),
added support for CData sections in createTag* methods,
fixed bug #23,
fixed bug in splitQualifiedName()
   </notes>
  </release>
  <release>
   <version>
    <release>0.5</release>
    <api>0.5</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-23</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added support for multiline attributes in attributesToString(), createTag*() and createStartElement (requested by Yavor Shahpasov for XML_Serializer),
added createComment
   </notes>
  </release>
  <release>
   <version>
    <release>0.5.1</release>
    <api>0.5.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-26</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added default namespace parameter (optional) in splitQualifiedName() (requested by Sebastian Bergmann)
   </notes>
  </release>
  <release>
   <version>
    <release>0.5.2</release>
    <api>0.5.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-11-22</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
now creates XHTML compliant empty tags (Davey),
minor whitespace fixes (Davey)
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.0beta1</release>
    <api>0.6.0beta1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-05-24</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.0</release>
    <api>0.6.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-06-07</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.1</release>
    <api>0.6.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-10-28</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added check for tag name (either as local part or qualified name) in createTagFromArray() (bug #1083)
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0</release>
    <api>1.0.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-10-28</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added reverseEntities() (request #2639)
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-11-19</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added collapseEmptyTags (patch by Sebastian Bergmann and Thomas Duffey)
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.1</release>
    <api>1.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-12-23</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- fixed bug in replaceEntities() and reverseEntities() in conjunction with XML_UTIL_ENTITIES_HTML
- createTag() and createTagFromArray() now accept XML_UTIL_ENTITIES_XML, XML_UTIL_ENTITIES_XML_REQUIRED, XML_UTIL_ENTITIES_HTML, XML_UTIL_ENTITIES_NONE and XML_UTIL_CDATA_SECTION as $replaceEntities parameter
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.2</release>
    <api>1.1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-12-01</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- fixed bug #5419: isValidName() now checks for character classes
- implemented request #8196: added optional parameter to influence array sorting to createTag() createTagFromArray() and createStartElement()
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.4</release>
    <api>1.1.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-12-16</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug #9561: Not allowing underscores in middle of tags
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0a1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>alpha</api>
   </stability>
   <date>2008-05-04</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|ja.doma]
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0a2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>alpha</api>
   </stability>
   <date>2008-05-22</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0RC1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2008-07-12</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2008-07-26</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-12-31</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Fixed Bug #14760: Bug in getDocTypeDeclaration() [ashnazg|fpospisil]
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2014-06-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
QA release

Bug #18343 Entities in file names decoded during packaging
Bug #19174	upgrade PHPUnit require statements &amp; other fixes (for PEAR QA Team)
Request #19750	examples/example.php encoding
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.3</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2014-06-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Bug #20293	Broken installation for 1.2.2
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2015-02-27</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Set minimum PHP version to 5.3.0
* Mark static methods with static keyword
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-03</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Adds a new XML_UTIL_COLLAPSE_NONE option
  for preventing empty tag collapsing.

* Request #15467 CDATA sections and blank nodes
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Bug #21177 XML_Util::collapseEmptyTags() can return NULL
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-22</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Bug #21184 Collapse issue
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.3</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-06-28</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Decrease minimum PEAR version to 1.9.0 to allow PEAR upgrades
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.4</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2019-12-05</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* PR #11: fix phplint warning
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.5</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2020-04-19</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* PR #12: fix Trying to access array offset on value of type int
   </notes>
  </release>
 </changelog>
</package>
pear/.pkgxml/Pear.list000064400000000363151732710000010635 0ustar00pear.php.net/Auth_SASL
pear.php.net/File_MARC
pear.php.net/Mail
pear.php.net/Mail_Mime
pear.php.net/Mail_mimeDecode
pear.php.net/Net_IDNA2
pear.php.net/Net_SMTP
pear.php.net/Net_Sieve
pear.php.net/Net_Socket
pear.php.net/Structures_LinkedList
pear/.pkgxml/Pear_File_MARC-1.4.1.xml000064400000026404151732710000012666 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>File_MARC</name>
 <channel>pear.php.net</channel>
 <summary>Parse, modify, and create MARC records</summary>
 <description>The standard for machine-readable cataloging (MARC) records is documented at http://loc.gov/marc/. This package enables you to read existing MARC records from a file, string, or (using the YAZ extension), from a Z39.50 source. You can also use this package to create new MARC records.

This package is based on the PHP MARC package, originally called &quot;php-marc&quot;, that is part of the Emilda Project (http://www.emilda.org).  Christoffer Landtman generously agreed to make the &quot;php-marc&quot; code available under the GNU LGPL so it could be used as the basis of this PEAR package.</description>
 <lead>
  <name>Dan Scott</name>
  <user>dbs</user>
  <email>dbs@php.net</email>
  <active>yes</active>
 </lead>
 <date>2019-11-13</date>
 <time>17:33:33</time>
 <version>
  <release>1.4.1</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.gnu.org/copyleft/lesser.html">GNU Lesser General Public License</license>
 <notes>
1.4.1
  * Reintroduce include_path to composer.json
 </notes>
 <contents>
  <dir baseinstalldir="File" name="/">
   <file baseinstalldir="/" md5sum="ffe2590635f404af055fe731da105939" name="File/MARC/Lint/CodeData.php" role="php" />
   <file baseinstalldir="/" md5sum="a3b9e1c817e67f59add05593500d463e" name="File/MARC/Control_Field.php" role="php" />
   <file baseinstalldir="/" md5sum="acba4463f8e40d6ee4e7ba1f2dc53123" name="File/MARC/Data_Field.php" role="php" />
   <file baseinstalldir="/" md5sum="378f483ec1fd161cd9dfb9b05db58d66" name="File/MARC/Exception.php" role="php" />
   <file baseinstalldir="/" md5sum="a9ba69030cbf4847292b9975e9d922c6" name="File/MARC/Field.php" role="php" />
   <file baseinstalldir="/" md5sum="c37351c7c80927ce6bb1e662510f9183" name="File/MARC/Lint.php" role="php" />
   <file baseinstalldir="/" md5sum="c5ac39e3d25eb0108b9dd5ad8466c821" name="File/MARC/List.php" role="php" />
   <file baseinstalldir="/" md5sum="7af6ce78cde4bb246e4e96709e90d2c0" name="File/MARC/Record.php" role="php" />
   <file baseinstalldir="/" md5sum="df5f97139685f0ad04e47fdbb67e3968" name="File/MARC/Subfield.php" role="php" />
   <file baseinstalldir="/" md5sum="6e102262dfd5d65d8d5a6221dfc74edd" name="File/MARC.php" role="php" />
   <file baseinstalldir="/" md5sum="8b64040d2d18ac4b994595a148266a66" name="File/MARCBASE.php" role="php" />
   <file baseinstalldir="/" md5sum="f5a17a60d34e84e2ee7ca1e5c5c6c620" name="File/MARCXML.php" role="php" />
   <file baseinstalldir="File" md5sum="6af971fd9ff5ef3e5fcba8a64a0e7a49" name="examples/example.mrc" role="doc" />
   <file baseinstalldir="File" md5sum="1aea40df9f1c2e32f8e065fe8da0a3b5" name="examples/marc_yaz.php" role="doc" />
   <file baseinstalldir="File" md5sum="70ae317e0890d5896e3ffccdd293369a" name="examples/read.php" role="doc" />
   <file baseinstalldir="File" md5sum="54efb9d920ac775bfc847a83a2dec73a" name="examples/subfields.php" role="doc" />
   <file baseinstalldir="File" md5sum="14297da35b510c496cd1f328cf3bb301" name="tests/bad_example.mrc" role="test" />
   <file baseinstalldir="File" md5sum="0dd4c6dbad6e8608d0ebf9d24425955d" name="tests/bad_example.xml" role="test" />
   <file baseinstalldir="File" md5sum="216a6f9d53f6d3d8e22d81fdc10f4bc1" name="tests/camel.mrc" role="test" />
   <file baseinstalldir="File" md5sum="6af971fd9ff5ef3e5fcba8a64a0e7a49" name="tests/example.mrc" role="test" />
   <file baseinstalldir="File" md5sum="9455aec3371f79cf7d31281fd03f5171" name="tests/marc_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="577e2f5f89fd48cf1a3576a29d2958f8" name="tests/marc_002.phpt" role="test" />
   <file baseinstalldir="File" md5sum="a6a586354b9a06c880c2a7470dd828d7" name="tests/marc_003.phpt" role="test" />
   <file baseinstalldir="File" md5sum="b1c7e2fc5572a0f9362a771c260a1fe3" name="tests/marc_004.phpt" role="test" />
   <file baseinstalldir="File" md5sum="84f85ac7f8a2532e4e90ccde7764556a" name="tests/marc_005.phpt" role="test" />
   <file baseinstalldir="File" md5sum="889e5e906a97de7a0e94b0c5f30e70e7" name="tests/marc_006.phpt" role="test" />
   <file baseinstalldir="File" md5sum="be823dc8a8efb408de06371ab802efcc" name="tests/marc_007.phpt" role="test" />
   <file baseinstalldir="File" md5sum="af44490aafea44e5120f881cb81cdad9" name="tests/marc_008.phpt" role="test" />
   <file baseinstalldir="File" md5sum="ac9f2a7aeb24900a11f5102744179ae3" name="tests/marc_009.phpt" role="test" />
   <file baseinstalldir="File" md5sum="5e43eb5cddbb4f2bd0d6405cd95b80aa" name="tests/marc_010.phpt" role="test" />
   <file baseinstalldir="File" md5sum="2e1cd8509c0bf04ec77fc0f51375f611" name="tests/marc_011.phpt" role="test" />
   <file baseinstalldir="File" md5sum="bc49ca48623102c8ac07679fa77a3dd9" name="tests/marc_012.phpt" role="test" />
   <file baseinstalldir="File" md5sum="245a3b20e0da1973535503e28efd1d3a" name="tests/marc_013.phpt" role="test" />
   <file baseinstalldir="File" md5sum="ce69aa734856dd40d60d30c77bdef53a" name="tests/marc_014.phpt" role="test" />
   <file baseinstalldir="File" md5sum="7b61cdd31035e60682fa92c5d519d997" name="tests/marc_015.phpt" role="test" />
   <file baseinstalldir="File" md5sum="7f4f597fe1adaa3507eb87fc4875dbd2" name="tests/marc_016.phpt" role="test" />
   <file baseinstalldir="File" md5sum="4262efd5fcacbd7503323681f4552430" name="tests/marc_017.phpt" role="test" />
   <file baseinstalldir="File" md5sum="ee1623d7bda54ba4f741b2319b158f82" name="tests/marc_018.phpt" role="test" />
   <file baseinstalldir="File" md5sum="8006c03fbab0f04377342086fafd3982" name="tests/marc_019.phpt" role="test" />
   <file baseinstalldir="File" md5sum="f5ae5b25e0ac1104314433d9e5b1f7fe" name="tests/marc_020.phpt" role="test" />
   <file baseinstalldir="File" md5sum="94d8f99e86585671a1b2d3043aeb6360" name="tests/marc_021.phpt" role="test" />
   <file baseinstalldir="File" md5sum="bb891a890effe0e77e1759043f4846d8" name="tests/marc_022.phpt" role="test" />
   <file baseinstalldir="File" md5sum="faf77dcb5cdd002c09169a14bfded65e" name="tests/marc_023.phpt" role="test" />
   <file baseinstalldir="File" md5sum="0e6c4a23f5da7df64fdd4b3b1149bbee" name="tests/marc_16783.phpt" role="test" />
   <file baseinstalldir="File" md5sum="4ea8b3520beda378db15960f1c50493a" name="tests/marc_field_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="743850ef61df69c4340be44a03bccb5a" name="tests/marc_field_002.phpt" role="test" />
   <file baseinstalldir="File" md5sum="8c765f1398b49df257d86d22ac6e4f8d" name="tests/marc_field_003.phpt" role="test" />
   <file baseinstalldir="File" md5sum="d4216cf930a308e0d02553bd3914f294" name="tests/marc_field_004.phpt" role="test" />
   <file baseinstalldir="File" md5sum="dd59514b474b78371ad522a3e13b76b7" name="tests/marc_field_005.phpt" role="test" />
   <file baseinstalldir="File" md5sum="5295bfd02a8424acac1c91de26b552c7" name="tests/marc_field_21246.phpt" role="test" />
   <file baseinstalldir="File" md5sum="6f95f09442ccf6b93df92986f58b270d" name="tests/marc_lint_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="18d721f8871edd925624ccbdd15444fb" name="tests/marc_lint_002.phpt" role="test" />
   <file baseinstalldir="File" md5sum="4eb86a2f4e0a74dedcb0bf2511da6ca1" name="tests/marc_lint_003.phpt" role="test" />
   <file baseinstalldir="File" md5sum="10430fee0a1352d0528f1507b34c57e1" name="tests/marc_lint_004.phpt" role="test" />
   <file baseinstalldir="File" md5sum="0dcd07a18577d7b22392a2214cd6436c" name="tests/marc_lint_005.phpt" role="test" />
   <file baseinstalldir="File" md5sum="fd17798fc535562e5e64461f449516b2" name="tests/marc_record_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="141b455ccf67a60c4eac44c77960f2e2" name="tests/marc_subfield_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="b1e23464ee0eec47ddca2af9a9922926" name="tests/marc_subfield_002.phpt" role="test" />
   <file baseinstalldir="File" md5sum="1d7903e8c244d647220b318b4bc758d1" name="tests/marc_xml_001.phpt" role="test" />
   <file baseinstalldir="File" md5sum="22cae3c752d843b78f583dcd92801534" name="tests/marc_xml_002.phpt" role="test" />
   <file baseinstalldir="File" md5sum="c0716d23e0f960abf8d53ad6014a413a" name="tests/marc_xml_003.phpt" role="test" />
   <file baseinstalldir="File" md5sum="7645fa19e28aca041a124fc5e2c12bd3" name="tests/marc_xml_004.phpt" role="test" />
   <file baseinstalldir="File" md5sum="b08b28c3251625b8b6e4d7ab376b0185" name="tests/marc_xml_005.phpt" role="test" />
   <file baseinstalldir="File" md5sum="6cd0934ddbf65d2d7e9ea5d108977ff7" name="tests/marc_xml_006.phpt" role="test" />
   <file baseinstalldir="File" md5sum="ffdce4aa190268fa7cbbf3bb45383abf" name="tests/marc_xml_007.phpt" role="test" />
   <file baseinstalldir="File" md5sum="998a4c1ce00ff100f39ffa9fc49a212f" name="tests/marc_xml_008.phpt" role="test" />
   <file baseinstalldir="File" md5sum="a38a67c590869f2b0a4859a910fd9e89" name="tests/marc_xml_009.phpt" role="test" />
   <file baseinstalldir="File" md5sum="db39c5055a570fcda12bb7c5fa1e3b4d" name="tests/marc_xml_16642.phpt" role="test" />
   <file baseinstalldir="File" md5sum="dc075f4a271bd7182378a3874bd5b39e" name="tests/marc_xml_namespace.phpt" role="test" />
   <file baseinstalldir="File" md5sum="208200d9a979ac360c4d326e9789b6b7" name="tests/marc_xml_namespace_prefix.phpt" role="test" />
   <file baseinstalldir="File" md5sum="d87774ede82222cfc12b2c2a06f57a3a" name="tests/marc_xml_rsinger.phpt" role="test" />
   <file baseinstalldir="File" md5sum="fb44e3eb69f1a37115235fc829c39542" name="tests/namespace.xml" role="test" />
   <file baseinstalldir="File" md5sum="e6de4d809b0af5dd99fd352eb60616a1" name="tests/skipif.inc" role="test" />
   <file baseinstalldir="File" md5sum="a0166a4ff0bc0bb283e854f11beaa793" name="tests/music.mrc" role="test" />
   <file baseinstalldir="File" md5sum="993ce494befbc25dc1326527b30b4782" name="tests/music.xml" role="test" />
   <file baseinstalldir="File" md5sum="6b0c87f0cd459ed7322c25d403b164cc" name="tests/bigarchive.xml" role="test" />
   <file baseinstalldir="File" md5sum="be850aa6ab4ac52b8c6c214c30b574af" name="tests/onerecord.xml" role="test" />
   <file baseinstalldir="File" md5sum="4f43fec7b276267eec5258044853ccc8" name="tests/sandburg.mrc" role="test" />
   <file baseinstalldir="File" md5sum="e216b95f905dd240c9bde372950e4073" name="tests/sandburg.xml" role="test" />
   <file baseinstalldir="File" md5sum="e81a92188ea0dcd9c108a63fb32b3f4f" name="tests/xmlescape.mrc" role="test" />
   <file baseinstalldir="File" md5sum="8f9f63ed6a80191d89a2296fa4c1a30b" name="CHANGELOG" role="doc" />
   <file baseinstalldir="File" md5sum="fbc093901857fcd118f065f900982c24" name="LICENSE" role="doc" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.6</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Validate_ISPN</name>
    <channel>pear.php.net</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
pear/.pkgxml/Pear_Net_Socket-1.2.2.xml000064400000004010151732710000013227 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_Socket</name>
 <channel>pear.php.net</channel>
 <summary>Network Socket Interface</summary>
 <description>Net_Socket is a class interface to TCP sockets.  It provides blocking
  and non-blocking operation, with different reading and writing modes
  (byte-wise, block-wise, line-wise and special formats like network
  byte-order ip addresses).</description>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Stig Bakken</name>
  <user>ssb</user>
  <email>stig@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@php.net</email>
  <active>no</active>
 </lead>
 <date>2017-04-13</date>
 <time>17:15:33</time>
 <version>
  <release>1.2.2</release>
  <api>1.2.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
 <notes>
* Bug #21178: $php_errormsg is deprecated in PHP 7.2
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="f99081ef3a69bcc1faa0d90a9a616788" name="Net/Socket.php" role="php" />
   <file baseinstalldir="/" md5sum="61a9ed8d1604a739e6997149ea34e701" name="README.md" role="doc" />
   <file baseinstalldir="/" md5sum="28575b04f4f2014316245d83e27343e1" name="LICENSE" role="doc" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
pear/.pkgxml/Pear_Net_Sieve-1.4.5.xml000064400000037662151732710000013102 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_Sieve</name>
 <channel>pear.php.net</channel>
 <summary>Handles talking to a sieve server.</summary>
 <description>This package provides an API to talk to servers implementing the managesieve protocol. It can be used to install and remove sieve scripts, mark them active etc.</description>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@alec.pl</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Jan Schneider</name>
  <user>yunosh</user>
  <email>jan@horde.org</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Damian Fernandez Sosa</name>
  <user>damian</user>
  <email>damlists@cnba.uba.ar</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Anish Mistry</name>
  <user>amistry</user>
  <email>amistry@am-productions.biz</email>
  <active>no</active>
 </lead>
 <date>2021-04-24</date>
 <time>13:33:52</time>
 <version>
  <release>1.4.5</release>
  <api>1.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
 <notes>
* Support XOAUTH2 authorization method
 </notes>
 <contents>
  <dir baseinstalldir="Net" name="/">
   <file baseinstalldir="Net" md5sum="ef8cd688674fba85cc067e06c221e43b" name="tests/largescript.siv" role="test" />
   <file baseinstalldir="Net" md5sum="7d772fe47ee45bdb521dd581281f38c3" name="tests/config.php.dist" role="test" />
   <file baseinstalldir="Net" md5sum="6050fac5e66a4a6bbed7913f826974ed" name="tests/SieveTest.php" role="test" />
   <file baseinstalldir="Net" md5sum="2a45a03c042351957f3435929a17bca3" name="Sieve.php" role="php">
    <tasks:replace from="@package_version@" to="version" type="package-info" />
   </file>
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.0.0</min>
   </php>
   <pearinstaller>
    <min>1.4.0b1</min>
   </pearinstaller>
   <package>
    <name>Net_Socket</name>
    <channel>pear.php.net</channel>
    <min>1.0</min>
   </package>
  </required>
  <optional>
   <package>
    <name>Auth_SASL</name>
    <channel>pear.php.net</channel>
    <min>1.0</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <date>2018-03-04</date>
   <version>
    <release>1.4.3</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Support GSSAPI authentication
   </notes>
  </release>
  <release>
   <date>2018-02-14</date>
   <version>
    <release>1.4.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Composer: Fix license identifier, don&apos;t use unbound version numbers for deps
   </notes>
  </release>
  <release>
   <date>2017-05-26</date>
   <version>
    <release>1.4.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Use 8bit instead of latin1 for string length in bytes calculation
* Extend listScripts() so it&apos;s possible to get an active script name in one go
* Request #20491: Skip redundant CAPABILITY requests
   </notes>
  </release>
  <release>
   <date>2017-05-21</date>
   <version>
    <release>1.4.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Dropped PHP4 support, fixed PHP7 warnings
* Fixed E_DEPRECATED warning on Auth_SASL::factory() call
* Enable later TLS versions
   </notes>
  </release>
  <release>
   <date>2015-01-20</date>
   <version>
    <release>1.3.4</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Remove erroneous and unnecessary active script caching (Bug #20472).
   </notes>
  </release>
  <release>
   <date>2014-09-24</date>
   <version>
    <release>1.3.3</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix notices from non-static calling of PEAR methods.
* Fix reading OK responses with string literal messages.
   </notes>
  </release>
  <release>
   <date>2011-08-06</date>
   <version>
    <release>1.3.2</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix referrals if host data or user credentials are passed to connect() and login() instead of the constructor (Aleksander Machniak, Bug #17107).
   </notes>
  </release>
  <release>
   <date>2011-08-05</date>
   <version>
    <release>1.3.1</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Query capabilities again after successful authentication (Jesse Crawford, Request #18382).
* Escape quotes and backslashes in script names, and use literal strings for script names with non-ASCII characters (Aleksander Machniak, Bug #16691).
* Work around broken STARTTLS behavior in Cyrus versions before 2.3.10 (Aleksander Machniak, Bug #18241).
* Improve string literal parsing (Aleksander Machniak, Bug #18228).
   </notes>
  </release>
  <release>
   <date>2010-07-01</date>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Add debug handler parameter to constructor.
* Fix LOGIN authentication (Agustín Eijo, Aleksander Machniak, Bug #17527).
   </notes>
  </release>
  <release>
   <date>2010-06-13</date>
   <version>
    <release>1.2.2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix SASL authentication without Auth_SASL (Bug #17489).
   </notes>
  </release>
  <release>
   <date>2010-04-19</date>
   <version>
    <release>1.2.1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix DIGEST-MD5 authentication with Dovecot (Stef Simoens, Bug #17320).
   </notes>
  </release>
  <release>
   <date>2010-04-01</date>
   <version>
    <release>1.2.0</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
Changes since version 1.2.0b1:
* Fix DIGEST-MD5 authentication (Aleksander Machniak, Bug #17285).
* Don&apos;t try to call dl() if mbstring extension isn&apos;t loaded (Bug #17038).
Changes since version 1.1.7:
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.
   </notes>
  </release>
  <release>
   <date>2009-10-07</date>
   <version>
    <release>1.2.0b1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.
   </notes>
  </release>
  <release>
   <date>2009-07-24</date>
   <version>
    <release>1.1.7</release>
    <api>1.1.6</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed STARTTLS support (Bug #14205).
* Added connect options and EXTERNAL authentication.
   </notes>
  </release>
  <release>
   <date>2008-03-22</date>
   <version>
    <release>1.1.6</release>
    <api>1.1.6</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #9273
* Fixed copy/paste error in CRAM and DIGEST authentication error case.
   </notes>
  </release>
  <release>
   <date>2006-10-24</date>
   <version>
    <release>1.1.5</release>
    <api>1.1.5</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug connect() bug
* Fixed Request #8071
   </notes>
  </release>
  <release>
   <date>2006-09-09</date>
   <version>
    <release>1.1.4</release>
    <api>1.1.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #8452 Unterminated read loop
* Fixed Bug #7845 Add mbstring support
* Added Request #8071 Enable the ability to toggle TLS support if available.
* Added Request #8453 Clean up PHPDoc and comments
   </notes>
  </release>
  <release>
   <date>2006-05-21</date>
   <version>
    <release>1.1.3</release>
    <api>1.1.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Correctly Fixed Bug #3519 Net_Sieve w/ externally established sockets
* Fixed Bug #7197 getScript() truncates long scripts
* Added PHPUnit2 regression test script
   </notes>
  </release>
  <release>
   <date>2006-02-09</date>
   <version>
    <release>1.1.2</release>
    <api>1.1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Request #4053 Added STARTTLS support for PHP 5.1 and above
    * Fixed Bug #3519 Net_Sieve w/ externally established sockets
    * Fixed Bug #4794 drops protocol prefix, e.g. &quot;ssl://&quot; in referrals
    * Fixed STARTTLS detection
    * Allow $options[] to be passed to Net_Socket
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.1</release>
    <api>1.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-02-02</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #3242 cyrus murder referrals not followed
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-12-18</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #2728 Linebreaks not being read using getScript()
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.1</release>
    <api>1.0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-03-13</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed BUG #1006
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0</release>
    <api>1.0.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-03-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed DIGEST-MD5 sasl version handling (sasl v1.xx responses are diferent than v2.xx)
* Fixed LOGIN Method
   </notes>
  </release>
  <release>
   <version>
    <release>0.9.1</release>
    <api>0.9.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-02-29</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* There is an issue whith the DIGEST-MD5 method. in one installation it does not work but in my server it works perfect! please send me debug info to solve the problem if
it affects you or disable DIGEST-MD5
* some optimizations to the code
* added haveSpace() to check if the server has space to store the script. Use with care HAVESPACE seems to be broken in cyrus 2.0.16
* added hasExtension()
* added getExtensions()
* added referral support and automatic following of them. (it also handles the following of multireferrals).
* removed _getResponse replaced by _doCmd. (thanks to Etienne Goyer for this)
* added supportsAuthMech()
* if installed automatically uses Auth_SASL
* added CRAM-MD5 auth Method
* added DIGEST-MD5 auth Method
* added getAuthMechs() returns an array containing all the auth methods the server supports
* added hasAuthMech() to check if the server has a particular auth method
* _connect --&gt; connect: now is a public method (without breaking BC)
* _login --&gt; login: now is a public method (without breaking BC)
* fix typo  cmdAuthenticate() ---&gt;  _cmdAuthenticate()
* _doCmd() now parses string responses also.
   </notes>
  </release>
  <release>
   <version>
    <release>0.9.0</release>
    <api>0.9.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-01-31</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added setDebug() method and debugging capabilities
* added disconnect() method
* added sample file test_sieve.php
* fixed bug #591
* automagically selects the best auth method
   </notes>
  </release>
  <release>
   <version>
    <release>0.8.1</release>
    <api>0.8.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2002-07-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
Initial release
   </notes>
  </release>
  <release>
   <version>
    <release>0.8</release>
    <api>0.8</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2002-05-10</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
Initial release
   </notes>
  </release>
  <release>
   <date>2018-09-09</date>
   <version>
    <release>1.4.4</release>
    <api>1.4.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix PHP 7.3: Declaration of case-insensitive constants is deprecated
   </notes>
  </release>
 </changelog>
</package>
pear/.pkgxml/Pear_Net_SMTP-1.10.0.xml000064400000005007151732710000012646 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_SMTP</name>
 <channel>pear.php.net</channel>
 <summary>An implementation of the SMTP protocol</summary>
 <description>Provides an implementation of the SMTP protocol using PEAR&apos;s Net_Socket class.</description>
 <lead>
  <name>Jon Parise</name>
  <user>jon</user>
  <email>jon@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>yes</active>
 </lead>
 <date>2021-03-19</date>
 <time>18:39:33</time>
 <version>
  <release>1.10.0</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="https://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
 <notes>
* Add the starttls() method
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="5ef820d1bc73898b55a153576953fe70" name="examples/basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="0cd9a0c35d1ea17d46de9b5a39fb771d" name="tests/auth.phpt" role="test" />
   <file baseinstalldir="/" md5sum="89135826a107455d336071f3570ccd13" name="tests/basic.phpt" role="test" />
   <file baseinstalldir="/" md5sum="8517c458ae5094ee3c31a545d51c69c8" name="tests/config.php.dist" role="test" />
   <file baseinstalldir="/" md5sum="15c9cb4ef93e0aee232b503e12fc21ee" name="tests/quotedata.phpt" role="test" />
   <file baseinstalldir="/" md5sum="00f931f5dd61430e6057f895decdb6af" name="LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="9ddd7d9135cfe6e573cd757edf6855f2" name="README.rst" role="doc" />
   <file baseinstalldir="/" md5sum="a157897ae2efc43eabd961597557243a" name="Net/SMTP.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
   <package>
    <name>Net_Socket</name>
    <channel>pear.php.net</channel>
    <min>1.0.7</min>
   </package>
  </required>
  <optional>
   <package>
    <name>Auth_SASL</name>
    <channel>pear.php.net</channel>
    <min>1.0.5</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
pear/.pkgxml/Pear_Mail_mimeDecode-1.5.6.xml000064400000016326151732710000014212 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd      http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail_mimeDecode</name>
 <channel>pear.php.net</channel>
 <summary>Provides a class to decode mime messages.</summary>
 <description>Provides a class to deal with the decoding and interpreting of mime messages.
 This package used to be part of the Mail_Mime package, but has been split off.</description>
 <lead>
  <name>Cipriano Groenendal</name>
  <user>cipri</user>
  <email>cipri@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Alan Knowles</name>
  <user>alan_k</user>
  <email>alan@akbkhome.com</email>
  <active>yes</active>
 </lead>
 <developer>
  <name>George Schlossnagle</name>
  <user>gschlossnagle</user>
  <email>george@omniti.com</email>
  <active>no</active>
 </developer>
 <date>2016-08-29</date>
 <time>03:04:25</time>
 <version>
  <release>1.5.6</release>
  <api>1.3.1</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
 <notes>
Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="05c45d0b58718ebe73860ebfe494dcef" name="Mail/mimeDecode.php" role="php" />
   <file baseinstalldir="Mail" md5sum="642acc06cdb217b6e64506182449d8f8" name="tests/parse_header_value.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="a0bc0c9b68e62a19202bd8fb26104f3c" name="tests/semicolon_content_type_bug1724.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="194810c478066eaeb28f51116b88e25a" name="xmail.dtd" role="data" />
   <file baseinstalldir="Mail" md5sum="61cea06fb6b4bd3a4b5e2d37384e14a9" name="xmail.xsl" role="data" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>4.3.0</min>
   </php>
   <pearinstaller>
    <min>1.6.0</min>
   </pearinstaller>
   <package>
    <name>Mail_Mime</name>
    <channel>pear.php.net</channel>
    <min>1.4.0</min>
    <exclude>1.4.0</exclude>
   </package>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Initial Release
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Initial Release
   </notes>
  </release>
  <release>
   <date>2007-06-17</date>
   <time>17:20:44</time>
   <version>
    <release>1.5.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
First release of mail_mimeDecode as a seperate package.
   </notes>
  </release>
  <release>
   <date>2009-12-03</date>
   <version>
    <release>1.5.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bugfix release.


    Bug Fixes
    #----- - fix bug in getSendArray() - not handling multiple recipents
    #14129 - E_NOTICE fixes

    Requests
    #12365 - Add option to also include raw attached messages patched on the request of till
   </notes>
  </release>
  <release>
   <date>2010-09-02</date>
   <version>
    <release>1.5.2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bugfix release.
 
    Bug Fixes
    #4739 - regexp parsing of header values does not balance quoting correctly
           - Fix sponsored by http://webyog.com
    #17325 - empty body messages are valid messages
    #17276 - remove &amp;new usage which throws errors now
   </notes>
  </release>
  <release>
   <date>2010-09-05</date>
   <version>
    <release>1.5.3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Major Bugfix release.

    Apart from a major cleanout of the bug tracker for this package, this release includes a revamped
    parseHeaderValue which removes the rather flakey regex, with a real parser, which should be considerably more
    robust.
 
    Bug Fixes
        #17844 - all regression tests fixed - remove the last of the while list each() .. this is 2010 ;)...
        #11410 - support wap multipart
        #9616  - long strings as filename etc.. aaa*0=.... aaa*1=.... aaa*2=.... (merged into aaa=.....)
        #9100  - change to preg_split for mime boundary detection , in theory should catch boundaries in nested situations better...
        #7709  - check for last element on boundary split to see if its usable
        #7065  - wrapped header lines with encoding should be concated without spaces
        #6495  - missing body in decoded object
        #11537 - better decode and multi-line support
   </notes>
  </release>
  <release>
   <date>2010-09-14</date>
   <version>
    <release>1.5.4</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Critical Security release.
    
    It is highly recommended that users of 1.5.3 upgrade to this release, a change in the boundary detection
    code introduced a potential denial of service attack.
     
 
    Bug Fixes
        #17862 - quote boundary preg_split code
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.5</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-11-16</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bug fix release.

    #17959 - Boundaries ending with non-word characters - patch by Alex Adriaanese
    ------ - ignore whitespace and trailing cr/lf in last section of split
    ------ - correct spacing on multi-line headers. now only striped for encoded data. (on previous line)
   </notes>
  </release>
 </changelog>
</package>
pear/OS/Guess.php000064400000026376151732710000007625 0ustar00<?php
/**
 * The OS_Guess class
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Gregory Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since PEAR 0.1
 */

// {{{ uname examples

// php_uname() without args returns the same as 'uname -a', or a PHP-custom
// string for Windows.
// PHP versions prior to 4.3 return the uname of the host where PHP was built,
// as of 4.3 it returns the uname of the host running the PHP code.
//
// PC RedHat Linux 7.1:
// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
//
// PC Debian Potato:
// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
//
// PC FreeBSD 3.3:
// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.3:
// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.5:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  6 23:59:23 CET 2002     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.5 w/uname from GNU shellutils:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  i386 unknown
//
// HP 9000/712 HP-UX 10:
// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
//
// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
// HP-UX host B.10.10 A 9000/712 unknown
//
// IBM RS6000/550 AIX 4.3:
// AIX host 3 4 000003531C00
//
// AIX 4.3 w/uname from GNU shellutils:
// AIX host 3 4 000003531C00 unknown
//
// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
// IRIX64 host 6.5 01091820 IP19 mips
//
// SGI Onyx IRIX 6.5:
// IRIX64 host 6.5 01091820 IP19
//
// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
//
// SparcStation 20 Solaris 8:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
//
// Mac OS X (Darwin)
// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug  5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC  Power Macintosh
//
// Mac OS X early versions
//

// }}}

/* TODO:
 * - define endianness, to allow matchSignature("bigend") etc.
 */

/**
 * Retrieves information about the current operating system
 *
 * This class uses php_uname() to grok information about the current OS
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Gregory Beaver <cellog@php.net>
 * @copyright 1997-2020 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 0.1
 */
class OS_Guess
{
    var $sysname;
    var $nodename;
    var $cpu;
    var $release;
    var $extra;

    function __construct($uname = null)
    {
        list($this->sysname,
             $this->release,
             $this->cpu,
             $this->extra,
             $this->nodename) = $this->parseSignature($uname);
    }

    function parseSignature($uname = null)
    {
        static $sysmap = array(
            'HP-UX' => 'hpux',
            'IRIX64' => 'irix',
        );
        static $cpumap = array(
            'i586' => 'i386',
            'i686' => 'i386',
            'ppc' => 'powerpc',
        );
        if ($uname === null) {
            $uname = php_uname();
        }
        $parts = preg_split('/\s+/', trim($uname));
        $n = count($parts);

        $release  = $machine = $cpu = '';
        $sysname  = $parts[0];
        $nodename = $parts[1];
        $cpu      = $parts[$n-1];
        $extra = '';
        if ($cpu == 'unknown') {
            $cpu = $parts[$n - 2];
        }

        switch ($sysname) {
            case 'AIX' :
                $release = "$parts[3].$parts[2]";
                break;
            case 'Windows' :
                $release = $parts[1];
                if ($release == '95/98') {
                    $release = '9x';
                }
                $cpu = 'i386';
                break;
            case 'Linux' :
                $extra = $this->_detectGlibcVersion();
                // use only the first two digits from the kernel version
                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
                break;
            case 'Mac' :
                $sysname = 'darwin';
                $nodename = $parts[2];
                $release = $parts[3];
                $cpu = $this->_determineIfPowerpc($cpu, $parts);
                break;
            case 'Darwin' :
                $cpu = $this->_determineIfPowerpc($cpu, $parts);
                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
                break;
            default:
                $release = preg_replace('/-.*/', '', $parts[2]);
                break;
        }

        if (isset($sysmap[$sysname])) {
            $sysname = $sysmap[$sysname];
        } else {
            $sysname = strtolower($sysname);
        }
        if (isset($cpumap[$cpu])) {
            $cpu = $cpumap[$cpu];
        }
        return array($sysname, $release, $cpu, $extra, $nodename);
    }

    function _determineIfPowerpc($cpu, $parts)
    {
        $n = count($parts);
        if ($cpu == 'Macintosh' && $parts[$n - 2] == 'Power') {
            $cpu = 'powerpc';
        }
        return $cpu;
    }

    function _detectGlibcVersion()
    {
        static $glibc = false;
        if ($glibc !== false) {
            return $glibc; // no need to run this multiple times
        }
        $major = $minor = 0;
        include_once "System.php";

        // Let's try reading possible libc.so.6 symlinks
        $libcs = array(
            '/lib64/libc.so.6',
            '/lib/libc.so.6',
            '/lib/i386-linux-gnu/libc.so.6'
        );
        $versions = array();
        foreach ($libcs as $file) {
            $versions = $this->_readGlibCVersionFromSymlink($file);
            if ($versions != []) {
                list($major, $minor) = $versions;
                break;
            }
        }

        // Use glibc's <features.h> header file to
        // get major and minor version number:
        if (!($major && $minor)) {
            $versions = $this->_readGlibCVersionFromFeaturesHeaderFile();
        }
        if (is_array($versions) && $versions != []) {
            list($major, $minor) = $versions;
        }

        if (!($major && $minor)) {
            return $glibc = '';
        }

        return $glibc = "glibc{$major}.{$minor}";
    }

    function _readGlibCVersionFromSymlink($file)
    {
        $versions = array();
        if (@is_link($file)
            && (preg_match('/^libc-(.*)\.so$/', basename(readlink($file)), $matches))
        ) {
            $versions = explode('.', $matches[1]);
        }
        return $versions;
    }


    function _readGlibCVersionFromFeaturesHeaderFile()
    {
        $features_header_file = '/usr/include/features.h';
        if (!(@file_exists($features_header_file)
            && @is_readable($features_header_file))
        ) {
            return array();
        }
        if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
            return $this->_parseFeaturesHeaderFile($features_header_file);
        } // no cpp

        return $this->_fromGlibCTest();
    }

    function _parseFeaturesHeaderFile($features_header_file)
    {
        $features_file = fopen($features_header_file, 'rb');
        while (!feof($features_file)) {
            $line = fgets($features_file, 8192);
            if (!$this->_IsADefinition($line)) {
                continue;
            }
            if (strpos($line, '__GLIBC__')) {
                // major version number #define __GLIBC__ version
                $line = preg_split('/\s+/', $line);
                $glibc_major = trim($line[2]);
                if (isset($glibc_minor)) {
                    break;
                }
                continue;
            }

            if (strpos($line, '__GLIBC_MINOR__')) {
                // got the minor version number
                // #define __GLIBC_MINOR__ version
                $line = preg_split('/\s+/', $line);
                $glibc_minor = trim($line[2]);
                if (isset($glibc_major)) {
                    break;
                }
            }
        }
        fclose($features_file);
        if (!isset($glibc_major) || !isset($glibc_minor)) {
            return array();
        }
        return array(trim($glibc_major), trim($glibc_minor));
    }

    function _IsADefinition($line)
    {
        if ($line === false) {
            return false;
        }
        return strpos(trim($line), '#define') !== false;
    }

    function _fromGlibCTest()
    {
        $major = null;
        $minor = null;

        $tmpfile = System::mktemp("glibctest");
        $fp = fopen($tmpfile, "w");
        fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
        fclose($fp);
        $cpp = popen("/usr/bin/cpp $tmpfile", "r");
        while ($line = fgets($cpp, 1024)) {
            if ($line[0] == '#' || trim($line) == '') {
                continue;
            }

            if (list($major, $minor) = explode(' ', trim($line))) {
                break;
            }
        }
        pclose($cpp);
        unlink($tmpfile);
        if ($major !== null && $minor !== null) {
            return [$major, $minor];
        }
    }

    function getSignature()
    {
        if (empty($this->extra)) {
            return "{$this->sysname}-{$this->release}-{$this->cpu}";
        }
        return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
    }

    function getSysname()
    {
        return $this->sysname;
    }

    function getNodename()
    {
        return $this->nodename;
    }

    function getCpu()
    {
        return $this->cpu;
    }

    function getRelease()
    {
        return $this->release;
    }

    function getExtra()
    {
        return $this->extra;
    }

    function matchSignature($match)
    {
        $fragments = is_array($match) ? $match : explode('-', $match);
        $n = count($fragments);
        $matches = 0;
        if ($n > 0) {
            $matches += $this->_matchFragment($fragments[0], $this->sysname);
        }
        if ($n > 1) {
            $matches += $this->_matchFragment($fragments[1], $this->release);
        }
        if ($n > 2) {
            $matches += $this->_matchFragment($fragments[2], $this->cpu);
        }
        if ($n > 3) {
            $matches += $this->_matchFragment($fragments[3], $this->extra);
        }
        return ($matches == $n);
    }

    function _matchFragment($fragment, $value)
    {
        if (strcspn($fragment, '*?') < strlen($fragment)) {
            $expression = str_replace(
                array('*', '?', '/'),
                array('.*', '.', '\\/'),
                $fragment
            );
            $reg = '/^' . $expression . '\\z/';
            return preg_match($reg, $value);
        }
        return ($fragment == '*' || !strcasecmp($fragment, $value));
    }
}
/*
 * Local Variables:
 * indent-tabs-mode: nil
 * c-basic-offset: 4
 * End:
 */
pear/XML/RPC/Dump.php000064400000012322151732710000010171 0ustar00<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Function and class to dump XML_RPC_Value objects in a nice way
 *
 * Should be helpful as a normal var_dump(..) displays all internals which
 * doesn't really give you an overview due to too much information.
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Christian Weiske <cweiske@php.net>
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: Dump.php 300962 2010-07-03 02:24:24Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


/**
 * Pull in the XML_RPC class
 */
require_once 'XML/RPC.php';


/**
 * Generates the dump of the XML_RPC_Value and echoes it
 *
 * @param object $value  the XML_RPC_Value object to dump
 *
 * @return void
 */
function XML_RPC_Dump($value)
{
    $dumper = new XML_RPC_Dump();
    echo $dumper->generateDump($value);
}


/**
 * Class which generates a dump of a XML_RPC_Value object
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Christian Weiske <cweiske@php.net>
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Dump
{
    /**
     * The indentation array cache
     * @var array
     */
    var $arIndent      = array();

    /**
     * The spaces used for indenting the XML
     * @var string
     */
    var $strBaseIndent = '    ';

    /**
     * Returns the dump in XML format without printing it out
     *
     * @param object $value   the XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  the dump
     */
    function generateDump($value, $nLevel = 0)
    {
        if (!is_object($value) || strtolower(get_class($value)) != 'xml_rpc_value') {
            require_once 'PEAR.php';
            PEAR::raiseError('Tried to dump non-XML_RPC_Value variable' . "\r\n",
                             0, PEAR_ERROR_PRINT);
            if (is_object($value)) {
                $strType = get_class($value);
            } else {
                $strType = gettype($value);
            }
            return $this->getIndent($nLevel) . 'NOT A XML_RPC_Value: '
                   . $strType . "\r\n";
        }

        switch ($value->kindOf()) {
        case 'struct':
            $ret = $this->genStruct($value, $nLevel);
            break;
        case 'array':
            $ret = $this->genArray($value, $nLevel);
            break;
        case 'scalar':
            $ret = $this->genScalar($value->scalarval(), $nLevel);
            break;
        default:
            require_once 'PEAR.php';
            PEAR::raiseError('Illegal type "' . $value->kindOf()
                             . '" in XML_RPC_Value' . "\r\n", 0,
                             PEAR_ERROR_PRINT);
        }

        return $ret;
    }

    /**
     * Returns the scalar value dump
     *
     * @param object $value   the scalar XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genScalar($value, $nLevel)
    {
        if (gettype($value) == 'object') {
            $strClass = ' ' . get_class($value);
        } else {
            $strClass = '';
        }
        return $this->getIndent($nLevel) . gettype($value) . $strClass
               . ' ' . $value . "\r\n";
    }

    /**
     * Returns the dump of a struct
     *
     * @param object $value   the struct XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genStruct($value, $nLevel)
    {
        $value->structreset();
        $strOutput = $this->getIndent($nLevel) . 'struct' . "\r\n";
        while (list($key, $keyval) = $value->structeach()) {
            $strOutput .= $this->getIndent($nLevel + 1) . $key . "\r\n";
            $strOutput .= $this->generateDump($keyval, $nLevel + 2);
        }
        return $strOutput;
    }

    /**
     * Returns the dump of an array
     *
     * @param object $value   the array XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genArray($value, $nLevel)
    {
        $nSize     = $value->arraysize();
        $strOutput = $this->getIndent($nLevel) . 'array' . "\r\n";
        for($nA = 0; $nA < $nSize; $nA++) {
            $strOutput .= $this->getIndent($nLevel + 1) . $nA . "\r\n";
            $strOutput .= $this->generateDump($value->arraymem($nA),
                                              $nLevel + 2);
        }
        return $strOutput;
    }

    /**
     * Returns the indent for a specific level and caches it for faster use
     *
     * @param int $nLevel  the level
     *
     * @return string  the indented string
     */
    function getIndent($nLevel)
    {
        if (!isset($this->arIndent[$nLevel])) {
            $this->arIndent[$nLevel] = str_repeat($this->strBaseIndent, $nLevel);
        }
        return $this->arIndent[$nLevel];
    }
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
pear/XML/RPC/Server.php000064400000053662151732710000010546 0ustar00<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Server commands for our PHP implementation of the XML-RPC protocol
 *
 * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
 * It has support for HTTP transport, proxies and authentication.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: Server.php 315558 2011-08-26 14:42:51Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


/**
 * Pull in the XML_RPC class
 */
require_once 'XML/RPC.php';


/**
 * signature for system.listMethods: return = array,
 * parameters = a string or nothing
 * @global array $GLOBALS['XML_RPC_Server_listMethods_sig']
 */
$GLOBALS['XML_RPC_Server_listMethods_sig'] = array(
    array($GLOBALS['XML_RPC_Array'],
          $GLOBALS['XML_RPC_String']
    ),
    array($GLOBALS['XML_RPC_Array'])
);

/**
 * docstring for system.listMethods
 * @global string $GLOBALS['XML_RPC_Server_listMethods_doc']
 */
$GLOBALS['XML_RPC_Server_listMethods_doc'] = 'This method lists all the'
        . ' methods that the XML-RPC server knows how to dispatch';

/**
 * signature for system.methodSignature: return = array,
 * parameters = string
 * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig']
 */
$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array(
    array($GLOBALS['XML_RPC_Array'],
          $GLOBALS['XML_RPC_String']
    )
);

/**
 * docstring for system.methodSignature
 * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc']
 */
$GLOBALS['XML_RPC_Server_methodSignature_doc'] = 'Returns an array of known'
        . ' signatures (an array of arrays) for the method name passed. If'
        . ' no signatures are known, returns a none-array (test for type !='
        . ' array to detect missing signature)';

/**
 * signature for system.methodHelp: return = string,
 * parameters = string
 * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig']
 */
$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array(
    array($GLOBALS['XML_RPC_String'],
          $GLOBALS['XML_RPC_String']
    )
);

/**
 * docstring for methodHelp
 * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc']
 */
$GLOBALS['XML_RPC_Server_methodHelp_doc'] = 'Returns help text if defined'
        . ' for the method passed, otherwise returns an empty string';

/**
 * dispatch map for the automatically declared XML-RPC methods.
 * @global array $GLOBALS['XML_RPC_Server_dmap']
 */
$GLOBALS['XML_RPC_Server_dmap'] = array(
    'system.listMethods' => array(
        'function'  => 'XML_RPC_Server_listMethods',
        'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc']
    ),
    'system.methodHelp' => array(
        'function'  => 'XML_RPC_Server_methodHelp',
        'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc']
    ),
    'system.methodSignature' => array(
        'function'  => 'XML_RPC_Server_methodSignature',
        'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc']
    )
);

/**
 * @global string $GLOBALS['XML_RPC_Server_debuginfo']
 */
$GLOBALS['XML_RPC_Server_debuginfo'] = '';


/**
 * Lists all the methods that the XML-RPC server knows how to dispatch
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_listMethods($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $v = new XML_RPC_Value();
    $outAr = array();
    foreach ($server->dmap as $key => $val) {
        $outAr[] = new XML_RPC_Value($key, 'string');
    }
    foreach ($XML_RPC_Server_dmap as $key => $val) {
        $outAr[] = new XML_RPC_Value($key, 'string');
    }
    $v->addArray($outAr);
    return new XML_RPC_Response($v);
}

/**
 * Returns an array of known signatures (an array of arrays)
 * for the given method
 *
 * If no signatures are known, returns a none-array
 * (test for type != array to detect missing signature)
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_methodSignature($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $methName = $m->getParam(0);
    $methName = $methName->scalarval();
    if (strpos($methName, 'system.') === 0) {
        $dmap = $XML_RPC_Server_dmap;
        $sysCall = 1;
    } else {
        $dmap = $server->dmap;
        $sysCall = 0;
    }
    //  print "<!-- ${methName} -->\n";
    if (isset($dmap[$methName])) {
        if ($dmap[$methName]['signature']) {
            $sigs = array();
            $thesigs = $dmap[$methName]['signature'];
            for ($i = 0; $i < sizeof($thesigs); $i++) {
                $cursig = array();
                $inSig = $thesigs[$i];
                for ($j = 0; $j < sizeof($inSig); $j++) {
                    $cursig[] = new XML_RPC_Value($inSig[$j], 'string');
                }
                $sigs[] = new XML_RPC_Value($cursig, 'array');
            }
            $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array'));
        } else {
            $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string'));
        }
    } else {
        $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
                                  $XML_RPC_str['introspect_unknown']);
    }
    return $r;
}

/**
 * Returns help text if defined for the method passed, otherwise returns
 * an empty string
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_methodHelp($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $methName = $m->getParam(0);
    $methName = $methName->scalarval();
    if (strpos($methName, 'system.') === 0) {
        $dmap = $XML_RPC_Server_dmap;
        $sysCall = 1;
    } else {
        $dmap = $server->dmap;
        $sysCall = 0;
    }

    if (isset($dmap[$methName])) {
        if ($dmap[$methName]['docstring']) {
            $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']),
                                                        'string');
        } else {
            $r = new XML_RPC_Response(new XML_RPC_Value('', 'string'));
        }
    } else {
        $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
                                     $XML_RPC_str['introspect_unknown']);
    }
    return $r;
}

/**
 * @return void
 */
function XML_RPC_Server_debugmsg($m)
{
    global $XML_RPC_Server_debuginfo;
    $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n";
}


/**
 * A server for receiving and replying to XML RPC requests
 *
 * <code>
 * $server = new XML_RPC_Server(
 *     array(
 *         'isan8' =>
 *             array(
 *                 'function' => 'is_8',
 *                 'signature' =>
 *                      array(
 *                          array('boolean', 'int'),
 *                          array('boolean', 'int', 'boolean'),
 *                          array('boolean', 'string'),
 *                          array('boolean', 'string', 'boolean'),
 *                      ),
 *                 'docstring' => 'Is the value an 8?'
 *             ),
 *     ),
 *     1,
 *     0
 * ); 
 * </code>
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Server
{
    /**
     * Should the payload's content be passed through mb_convert_encoding()?
     *
     * @see XML_RPC_Server::setConvertPayloadEncoding()
     * @since Property available since Release 1.5.1
     * @var boolean
     */
    var $convert_payload_encoding = false;

    /**
     * The dispatch map, listing the methods this server provides.
     * @var array
     */
    var $dmap = array();

    /**
     * The present response's encoding
     * @var string
     * @see XML_RPC_Message::getEncoding()
     */
    var $encoding = '';

    /**
     * Debug mode (0 = off, 1 = on)
     * @var integer
     */
    var $debug = 0;

    /**
     * The response's HTTP headers
     * @var string
     */
    var $server_headers = '';

    /**
     * The response's XML payload
     * @var string
     */
    var $server_payload = '';


    /**
     * Constructor for the XML_RPC_Server class
     *
     * @param array $dispMap   the dispatch map. An associative array
     *                          explaining each function. The keys of the main
     *                          array are the procedure names used by the
     *                          clients. The value is another associative array
     *                          that contains up to three elements:
     *                            + The 'function' element's value is the name
     *                              of the function or method that gets called.
     *                              To define a class' method: 'class::method'.
     *                            + The 'signature' element (optional) is an
     *                              array describing the return values and
     *                              parameters
     *                            + The 'docstring' element (optional) is a
     *                              string describing what the method does
     * @param int $serviceNow  should the HTTP response be sent now?
     *                          (1 = yes, 0 = no)
     * @param int $debug       should debug output be displayed?
     *                          (1 = yes, 0 = no)
     *
     * @return void
     */
    function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0)
    {
        global $HTTP_RAW_POST_DATA;

        if ($debug) {
            $this->debug = 1;
        } else {
            $this->debug = 0;
        }

        $this->dmap = $dispMap;

        if ($serviceNow) {
            $this->service();
        } else {
            $this->createServerPayload();
            $this->createServerHeaders();
        }
    }

    /**
     * @return string  the debug information if debug debug mode is on
     */
    function serializeDebug()
    {
        global $XML_RPC_Server_debuginfo, $HTTP_RAW_POST_DATA;

        if ($this->debug) {
            XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n"
                                    . $HTTP_RAW_POST_DATA
                                    . "\n" . '^^^ END POST DATA ^^^');
        }

        if ($XML_RPC_Server_debuginfo != '') {
            return "<!-- PEAR XML_RPC SERVER DEBUG INFO:\n\n"
                   . str_replace('--', '- - ', $XML_RPC_Server_debuginfo)
                   . "-->\n";
        } else {
            return '';
        }
    }

    /**
     * Sets whether the payload's content gets passed through
     * mb_convert_encoding()
     *
     * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     *
     * @see XML_RPC_Message::getEncoding()
     * @since Method available since Release 1.5.1
     */
    function setConvertPayloadEncoding($in)
    {
        if ($in && !function_exists('mb_convert_encoding')) {
            return $this->raiseError('mb_convert_encoding() is not available',
                              XML_RPC_ERROR_PROGRAMMING);
        }
        $this->convert_payload_encoding = $in;
    }

    /**
     * Sends the response
     *
     * The encoding and content-type are determined by
     * XML_RPC_Message::getEncoding()
     *
     * @return void
     *
     * @uses XML_RPC_Server::createServerPayload(),
     *       XML_RPC_Server::createServerHeaders()
     */
    function service()
    {
        if (!$this->server_payload) {
            $this->createServerPayload();
        }
        if (!$this->server_headers) {
            $this->createServerHeaders();
        }

        /*
         * $server_headers needs to remain a string for compatibility with
         * old scripts using this package, but PHP 4.4.2 no longer allows
         * line breaks in header() calls.  So, we split each header into
         * an individual call.  The initial replace handles the off chance
         * that someone composed a single header with multiple lines, which
         * the RFCs allow.
         */
        $this->server_headers = preg_replace("@[\r\n]+[ \t]+@",
                                ' ', trim($this->server_headers));
        $headers = preg_split("@[\r\n]+@", $this->server_headers);
        foreach ($headers as $header)
        {
            header($header);
        }

        print $this->server_payload;
    }

    /**
     * Generates the payload and puts it in the $server_payload property
     *
     * If XML_RPC_Server::setConvertPayloadEncoding() was set to true,
     * the payload gets passed through mb_convert_encoding()
     * to ensure the payload matches the encoding set in the
     * XML declaration.  The encoding type can be manually set via
     * XML_RPC_Message::setSendEncoding().
     *
     * @return void
     *
     * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding,
     *       XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug()
     * @see  XML_RPC_Server::setConvertPayloadEncoding()
     */
    function createServerPayload()
    {
        $r = $this->parseRequest();
        $this->server_payload = '<?xml version="1.0" encoding="'
                              . $this->encoding . '"?>' . "\n"
                              . $this->serializeDebug()
                              . $r->serialize();
        if ($this->convert_payload_encoding) {
            $this->server_payload = mb_convert_encoding($this->server_payload,
                                                        $this->encoding);
        }
    }

    /**
     * Determines the HTTP headers and puts them in the $server_headers
     * property
     *
     * @return boolean  TRUE if okay, FALSE if $server_payload isn't set.
     *
     * @uses XML_RPC_Server::createServerPayload(),
     *       XML_RPC_Server::$server_headers
     */
    function createServerHeaders()
    {
        if (!$this->server_payload) {
            return false;
        }
        $this->server_headers = 'Content-Length: '
                              . strlen($this->server_payload) . "\r\n"
                              . 'Content-Type: text/xml;'
                              . ' charset=' . $this->encoding;
        return true;
    }

    /**
     * @return array
     */
    function verifySignature($in, $sig)
    {
        for ($i = 0; $i < sizeof($sig); $i++) {
            // check each possible signature in turn
            $cursig = $sig[$i];
            if (sizeof($cursig) == $in->getNumParams() + 1) {
                $itsOK = 1;
                for ($n = 0; $n < $in->getNumParams(); $n++) {
                    $p = $in->getParam($n);
                    // print "<!-- $p -->\n";
                    if ($p->kindOf() == 'scalar') {
                        $pt = $p->scalartyp();
                    } else {
                        $pt = $p->kindOf();
                    }
                    // $n+1 as first type of sig is return type
                    if ($pt != $cursig[$n+1]) {
                        $itsOK = 0;
                        $pno = $n+1;
                        $wanted = $cursig[$n+1];
                        $got = $pt;
                        break;
                    }
                }
                if ($itsOK) {
                    return array(1);
                }
            }
        }
        if (isset($wanted)) {
            return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
        } else {
            $allowed = array();
            foreach ($sig as $val) {
                end($val);
                $allowed[] = key($val);
            }
            $allowed = array_unique($allowed);
            $last = count($allowed) - 1;
            if ($last > 0) {
                $allowed[$last] = 'or ' . $allowed[$last];
            }
            return array(0,
                         'Signature permits ' . implode(', ', $allowed)
                                . ' parameters but the request had '
                                . $in->getNumParams());
        }
    }

    /**
     * @return object  a new XML_RPC_Response object
     *
     * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding
     */
    function parseRequest($data = '')
    {
        global $XML_RPC_xh, $HTTP_RAW_POST_DATA,
                $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
                $XML_RPC_defencoding, $XML_RPC_Server_dmap;

        if ($data == '') {
            $data = $HTTP_RAW_POST_DATA;
        }

        $this->encoding = XML_RPC_Message::getEncoding($data);
        $parser_resource = xml_parser_create($this->encoding);
        $parser = (int) $parser_resource;

        $XML_RPC_xh[$parser] = array();
        $XML_RPC_xh[$parser]['cm']     = 0;
        $XML_RPC_xh[$parser]['isf']    = 0;
        $XML_RPC_xh[$parser]['params'] = array();
        $XML_RPC_xh[$parser]['method'] = '';
        $XML_RPC_xh[$parser]['stack'] = array();	
        $XML_RPC_xh[$parser]['valuestack'] = array();	

        $plist = '';

        // decompose incoming XML into request structure

        xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
        xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
        xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
        if (!xml_parse($parser_resource, $data, 1)) {
            // return XML error as a faultCode
            $r = new XML_RPC_Response(0,
                                      $XML_RPC_errxml+xml_get_error_code($parser_resource),
                                      sprintf('XML error: %s at line %d',
                                              xml_error_string(xml_get_error_code($parser_resource)),
                                              xml_get_current_line_number($parser_resource)));
            xml_parser_free($parser_resource);
        } elseif ($XML_RPC_xh[$parser]['isf']>1) {
            $r = new XML_RPC_Response(0,
                                      $XML_RPC_err['invalid_request'],
                                      $XML_RPC_str['invalid_request']
                                      . ': '
                                      . $XML_RPC_xh[$parser]['isf_reason']);
            xml_parser_free($parser_resource);
        } else {
            xml_parser_free($parser_resource);
            $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']);
            // now add parameters in
            for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
                // print '<!-- ' . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
                $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n";
                $m->addParam($XML_RPC_xh[$parser]['params'][$i]);
            }

            if ($this->debug) {
                XML_RPC_Server_debugmsg($plist);
            }

            // now to deal with the method
            $methName = $XML_RPC_xh[$parser]['method'];
            if (strpos($methName, 'system.') === 0) {
                $dmap = $XML_RPC_Server_dmap;
                $sysCall = 1;
            } else {
                $dmap = $this->dmap;
                $sysCall = 0;
            }

            if (isset($dmap[$methName]['function'])
                && is_string($dmap[$methName]['function'])
                && strpos($dmap[$methName]['function'], '::') !== false)
            {
                $dmap[$methName]['function'] =
                        explode('::', $dmap[$methName]['function']);
            }

            if (isset($dmap[$methName]['function'])
                && is_callable($dmap[$methName]['function']))
            {
                // dispatch if exists
                if (isset($dmap[$methName]['signature'])) {
                    $sr = $this->verifySignature($m,
                                                 $dmap[$methName]['signature'] );
                }
                if (!isset($dmap[$methName]['signature']) || $sr[0]) {
                    // if no signature or correct signature
                    if ($sysCall) {
                        $r = call_user_func($dmap[$methName]['function'], $this, $m);
                    } else {
                        $r = call_user_func($dmap[$methName]['function'], $m);
                    }
                    if (!is_object($r) || !is_a($r, 'XML_RPC_Response')) {
                        $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'],
                                                  $XML_RPC_str['not_response_object']);
                    }
                } else {
                    $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
                                              $XML_RPC_str['incorrect_params']
                                              . ': ' . $sr[1]);
                }
            } else {
                // else prepare error response
                $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'],
                                          $XML_RPC_str['unknown_method']);
            }
        }
        return $r;
    }

    /**
     * Echos back the input packet as a string value
     *
     * @return void
     *
     * Useful for debugging.
     */
    function echoInput()
    {
        global $HTTP_RAW_POST_DATA;

        $r = new XML_RPC_Response(0);
        $r->xv = new XML_RPC_Value("'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string');
        print $r->serialize();
    }
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
pear/XML/Util.php000064400000076660151732710000007574 0ustar00<?php
/**
 * XML_Util
 *
 * XML Utilities package
 *
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  XML
 * @package   XML_Util
 * @author    Stephan Schmidt <schst@php.net>
 * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/XML_Util
 */

/**
 * Error code for invalid chars in XML name
 */
define('XML_UTIL_ERROR_INVALID_CHARS', 51);

/**
 * Error code for invalid chars in XML name
 */
define('XML_UTIL_ERROR_INVALID_START', 52);

/**
 * Error code for non-scalar tag content
 */
define('XML_UTIL_ERROR_NON_SCALAR_CONTENT', 60);

/**
 * Error code for missing tag name
 */
define('XML_UTIL_ERROR_NO_TAG_NAME', 61);

/**
 * Replace XML entities
 */
define('XML_UTIL_REPLACE_ENTITIES', 1);

/**
 * Embedd content in a CData Section
 */
define('XML_UTIL_CDATA_SECTION', 5);

/**
 * Do not replace entitites
 */
define('XML_UTIL_ENTITIES_NONE', 0);

/**
 * Replace all XML entitites
 * This setting will replace <, >, ", ' and &
 */
define('XML_UTIL_ENTITIES_XML', 1);

/**
 * Replace only required XML entitites
 * This setting will replace <, " and &
 */
define('XML_UTIL_ENTITIES_XML_REQUIRED', 2);

/**
 * Replace HTML entitites
 * @link http://www.php.net/htmlentities
 */
define('XML_UTIL_ENTITIES_HTML', 3);

/**
 * Do not collapse any empty tags.
 */
define('XML_UTIL_COLLAPSE_NONE', 0);

/**
 * Collapse all empty tags.
 */
define('XML_UTIL_COLLAPSE_ALL', 1);

/**
 * Collapse only empty XHTML tags that have no end tag.
 */
define('XML_UTIL_COLLAPSE_XHTML_ONLY', 2);

/**
 * Utility class for working with XML documents
 *
 * @category  XML
 * @package   XML_Util
 * @author    Stephan Schmidt <schst@php.net>
 * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   Release: 1.4.5
 * @link      http://pear.php.net/package/XML_Util
 */
class XML_Util
{
    /**
     * Return API version
     *
     * @return string $version API version
     */
    public static function apiVersion()
    {
        return '1.4';
    }

    /**
     * Replace XML entities
     *
     * With the optional second parameter, you may select, which
     * entities should be replaced.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // replace XML entites:
     * $string = XML_Util::replaceEntities('This string contains < & >.');
     * </code>
     *
     * With the optional third parameter, you may pass the character encoding
     * <code>
     * require_once 'XML/Util.php';
     *
     * // replace XML entites in UTF-8:
     * $string = XML_Util::replaceEntities(
     *     'This string contains < & > as well as ä, ö, ß, à and ê',
     *     XML_UTIL_ENTITIES_HTML,
     *     'UTF-8'
     * );
     * </code>
     *
     * @param string $string          string where XML special chars
     *                                should be replaced
     * @param int    $replaceEntities setting for entities in attribute values
     *                                (one of XML_UTIL_ENTITIES_XML,
     *                                XML_UTIL_ENTITIES_XML_REQUIRED,
     *                                XML_UTIL_ENTITIES_HTML)
     * @param string $encoding        encoding value (if any)...
     *                                must be a valid encoding as determined
     *                                by the htmlentities() function
     *
     * @return string string with replaced chars
     * @see    reverseEntities()
     */
    public static function replaceEntities(
        $string, $replaceEntities = XML_UTIL_ENTITIES_XML, $encoding = 'ISO-8859-1'
    ) {
        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_XML:
            return strtr(
                $string,
                array(
                    '&'  => '&amp;',
                    '>'  => '&gt;',
                    '<'  => '&lt;',
                    '"'  => '&quot;',
                    '\'' => '&apos;'
                )
            );
            break;
        case XML_UTIL_ENTITIES_XML_REQUIRED:
            return strtr(
                $string,
                array(
                    '&' => '&amp;',
                    '<' => '&lt;',
                    '"' => '&quot;'
                )
            );
            break;
        case XML_UTIL_ENTITIES_HTML:
            return htmlentities($string, ENT_COMPAT, $encoding);
            break;
        }
        return $string;
    }

    /**
     * Reverse XML entities
     *
     * With the optional second parameter, you may select, which
     * entities should be reversed.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // reverse XML entites:
     * $string = XML_Util::reverseEntities('This string contains &lt; &amp; &gt;.');
     * </code>
     *
     * With the optional third parameter, you may pass the character encoding
     * <code>
     * require_once 'XML/Util.php';
     *
     * // reverse XML entites in UTF-8:
     * $string = XML_Util::reverseEntities(
     *     'This string contains &lt; &amp; &gt; as well as'
     *     . ' &auml;, &ouml;, &szlig;, &agrave; and &ecirc;',
     *     XML_UTIL_ENTITIES_HTML,
     *     'UTF-8'
     * );
     * </code>
     *
     * @param string $string          string where XML special chars
     *                                should be replaced
     * @param int    $replaceEntities setting for entities in attribute values
     *                                (one of XML_UTIL_ENTITIES_XML,
     *                                XML_UTIL_ENTITIES_XML_REQUIRED,
     *                                XML_UTIL_ENTITIES_HTML)
     * @param string $encoding        encoding value (if any)...
     *                                must be a valid encoding as determined
     *                                by the html_entity_decode() function
     *
     * @return string string with replaced chars
     * @see    replaceEntities()
     */
    public static function reverseEntities(
        $string, $replaceEntities = XML_UTIL_ENTITIES_XML, $encoding = 'ISO-8859-1'
    ) {
        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_XML:
            return strtr(
                $string,
                array(
                    '&amp;'  => '&',
                    '&gt;'   => '>',
                    '&lt;'   => '<',
                    '&quot;' => '"',
                    '&apos;' => '\''
                )
            );
            break;
        case XML_UTIL_ENTITIES_XML_REQUIRED:
            return strtr(
                $string,
                array(
                    '&amp;'  => '&',
                    '&lt;'   => '<',
                    '&quot;' => '"'
                )
            );
            break;
        case XML_UTIL_ENTITIES_HTML:
            return html_entity_decode($string, ENT_COMPAT, $encoding);
            break;
        }
        return $string;
    }

    /**
     * Build an xml declaration
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // get an XML declaration:
     * $xmlDecl = XML_Util::getXMLDeclaration('1.0', 'UTF-8', true);
     * </code>
     *
     * @param string $version    xml version
     * @param string $encoding   character encoding
     * @param bool   $standalone document is standalone (or not)
     *
     * @return string xml declaration
     * @uses   attributesToString() to serialize the attributes of the
     *         XML declaration
     */
    public static function getXMLDeclaration(
        $version = '1.0', $encoding = null, $standalone = null
    ) {
        $attributes = array(
            'version' => $version,
        );
        // add encoding
        if ($encoding !== null) {
            $attributes['encoding'] = $encoding;
        }
        // add standalone, if specified
        if ($standalone !== null) {
            $attributes['standalone'] = $standalone ? 'yes' : 'no';
        }

        return sprintf(
            '<?xml%s?>',
            XML_Util::attributesToString($attributes, false)
        );
    }

    /**
     * Build a document type declaration
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // get a doctype declaration:
     * $xmlDecl = XML_Util::getDocTypeDeclaration('rootTag','myDocType.dtd');
     * </code>
     *
     * @param string $root        name of the root tag
     * @param string $uri         uri of the doctype definition
     *                            (or array with uri and public id)
     * @param string $internalDtd internal dtd entries
     *
     * @return string doctype declaration
     * @since  0.2
     */
    public static function getDocTypeDeclaration(
        $root, $uri = null, $internalDtd = null
    ) {
        if (is_array($uri)) {
            $ref = sprintf(' PUBLIC "%s" "%s"', $uri['id'], $uri['uri']);
        } elseif (!empty($uri)) {
            $ref = sprintf(' SYSTEM "%s"', $uri);
        } else {
            $ref = '';
        }

        if (empty($internalDtd)) {
            return sprintf('<!DOCTYPE %s%s>', $root, $ref);
        } else {
            return sprintf("<!DOCTYPE %s%s [\n%s\n]>", $root, $ref, $internalDtd);
        }
    }

    /**
     * Create string representation of an attribute list
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // build an attribute string
     * $att = array(
     *              'foo'   =>  'bar',
     *              'argh'  =>  'tomato'
     *            );
     *
     * $attList = XML_Util::attributesToString($att);
     * </code>
     *
     * @param array      $attributes attribute array
     * @param bool|array $sort       sort attribute list alphabetically,
     *                               may also be an assoc array containing
     *                               the keys 'sort', 'multiline', 'indent',
     *                               'linebreak' and 'entities'
     * @param bool       $multiline  use linebreaks, if more than
     *                               one attribute is given
     * @param string     $indent     string used for indentation of
     *                               multiline attributes
     * @param string     $linebreak  string used for linebreaks of
     *                               multiline attributes
     * @param int        $entities   setting for entities in attribute values
     *                               (one of XML_UTIL_ENTITIES_NONE,
     *                               XML_UTIL_ENTITIES_XML,
     *                               XML_UTIL_ENTITIES_XML_REQUIRED,
     *                               XML_UTIL_ENTITIES_HTML)
     *
     * @return string string representation of the attributes
     * @uses   replaceEntities() to replace XML entities in attribute values
     * @todo   allow sort also to be an options array
     */
    public static function attributesToString(
        $attributes, $sort = true, $multiline = false,
        $indent = '    ', $linebreak = "\n", $entities = XML_UTIL_ENTITIES_XML
    ) {
        /*
         * second parameter may be an array
         */
        if (is_array($sort)) {
            if (isset($sort['multiline'])) {
                $multiline = $sort['multiline'];
            }
            if (isset($sort['indent'])) {
                $indent = $sort['indent'];
            }
            if (isset($sort['linebreak'])) {
                $multiline = $sort['linebreak'];
            }
            if (isset($sort['entities'])) {
                $entities = $sort['entities'];
            }
            if (isset($sort['sort'])) {
                $sort = $sort['sort'];
            } else {
                $sort = true;
            }
        }
        $string = '';
        if (is_array($attributes) && !empty($attributes)) {
            if ($sort) {
                ksort($attributes);
            }
            if (!$multiline || count($attributes) == 1) {
                foreach ($attributes as $key => $value) {
                    if ($entities != XML_UTIL_ENTITIES_NONE) {
                        if ($entities === XML_UTIL_CDATA_SECTION) {
                            $entities = XML_UTIL_ENTITIES_XML;
                        }
                        $value = XML_Util::replaceEntities($value, $entities);
                    }
                    $string .= ' ' . $key . '="' . $value . '"';
                }
            } else {
                $first = true;
                foreach ($attributes as $key => $value) {
                    if ($entities != XML_UTIL_ENTITIES_NONE) {
                        $value = XML_Util::replaceEntities($value, $entities);
                    }
                    if ($first) {
                        $string .= ' ' . $key . '="' . $value . '"';
                        $first   = false;
                    } else {
                        $string .= $linebreak . $indent . $key . '="' . $value . '"';
                    }
                }
            }
        }
        return $string;
    }

    /**
     * Collapses empty tags.
     *
     * @param string $xml  XML
     * @param int    $mode Whether to collapse all empty tags (XML_UTIL_COLLAPSE_ALL)
     *                      or only XHTML (XML_UTIL_COLLAPSE_XHTML_ONLY) ones.
     *
     * @return string XML
     */
    public static function collapseEmptyTags($xml, $mode = XML_UTIL_COLLAPSE_ALL)
    {
        if (preg_match('~<([^>])+/>~s', $xml, $matches)) {
            // it's already an empty tag
            return $xml;
        }
        switch ($mode) {
            case XML_UTIL_COLLAPSE_ALL:
                $preg1 =
                    '~<' .
                        '(?:' .
                            '(https?://[^:\s]+:\w+)' .  // <http://foo.com:bar  ($1)
                            '|(\w+:\w+)' .              // <foo:bar             ($2)
                            '|(\w+)' .                  // <foo                 ($3)
                        ')+' .
                        '([^>]*)' .                     // attributes           ($4)
                    '>' .
                    '<\/(\1|\2|\3)>' .                  // 1, 2, or 3 again     ($5)
                    '~s'
                ;
                $preg2 =
                    '<' .
                        '${1}${2}${3}' .    // tag (only one should have been populated)
                        '${4}' .            // attributes
                    ' />'
                ;
                return (preg_replace($preg1, $preg2, $xml)?:$xml);
                break;
            case XML_UTIL_COLLAPSE_XHTML_ONLY:
                return (
                    preg_replace(
                        '/<(area|base(?:font)?|br|col|frame|hr|img|input|isindex|link|meta|'
                        . 'param)([^>]*)><\/\\1>/s',
                        '<\\1\\2 />',
                        $xml
                    ) ?: $xml
                );
                break;
            case XML_UTIL_COLLAPSE_NONE:
                // fall thru
            default:
                return $xml;
        }
    }

    /**
     * Create a tag
     *
     * This method will call XML_Util::createTagFromArray(), which
     * is more flexible.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML tag:
     * $tag = XML_Util::createTag('myNs:myTag',
     *     array('foo' => 'bar'),
     *     'This is inside the tag',
     *     'http://www.w3c.org/myNs#');
     * </code>
     *
     * @param string $qname           qualified tagname (including namespace)
     * @param array  $attributes      array containg attributes
     * @param mixed  $content         the content
     * @param string $namespaceUri    URI of the namespace
     * @param int    $replaceEntities whether to replace XML special chars in
     *                                content, embedd it in a CData section
     *                                or none of both
     * @param bool   $multiline       whether to create a multiline tag where
     *                                each attribute gets written to a single line
     * @param string $indent          string used to indent attributes
     *                                (_auto indents attributes so they start
     *                                at the same column)
     * @param string $linebreak       string used for linebreaks
     * @param bool   $sortAttributes  Whether to sort the attributes or not
     * @param int    $collapseTagMode How to handle a content-less, and thus collapseable, tag
     *
     * @return string XML tag
     * @see    createTagFromArray()
     * @uses   createTagFromArray() to create the tag
     */
    public static function createTag(
        $qname, $attributes = array(), $content = null,
        $namespaceUri = null, $replaceEntities = XML_UTIL_REPLACE_ENTITIES,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true, $collapseTagMode = XML_UTIL_COLLAPSE_ALL
    ) {
        $tag = array(
            'qname'      => $qname,
            'attributes' => $attributes
        );

        // add tag content
        if ($content !== null) {
            $tag['content'] = $content;
        }

        // add namespace Uri
        if ($namespaceUri !== null) {
            $tag['namespaceUri'] = $namespaceUri;
        }

        return XML_Util::createTagFromArray(
            $tag, $replaceEntities, $multiline,
            $indent, $linebreak, $sortAttributes,
            $collapseTagMode
        );
    }

    /**
     * Create a tag from an array.
     * This method awaits an array in the following format
     * <pre>
     * array(
     *     // qualified name of the tag
     *     'qname' => $qname
     *
     *     // namespace prefix (optional, if qname is specified or no namespace)
     *     'namespace' => $namespace
     *
     *     // local part of the tagname (optional, if qname is specified)
     *     'localpart' => $localpart,
     *
     *     // array containing all attributes (optional)
     *     'attributes' => array(),
     *
     *     // tag content (optional)
     *     'content' => $content,
     *
     *     // namespaceUri for the given namespace (optional)
     *     'namespaceUri' => $namespaceUri
     * )
     * </pre>
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * $tag = array(
     *     'qname'        => 'foo:bar',
     *     'namespaceUri' => 'http://foo.com',
     *     'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
     *     'content'      => 'I\'m inside the tag',
     * );
     * // creating a tag with qualified name and namespaceUri
     * $string = XML_Util::createTagFromArray($tag);
     * </code>
     *
     * @param array  $tag             tag definition
     * @param int    $replaceEntities whether to replace XML special chars in
     *                                content, embedd it in a CData section
     *                                or none of both
     * @param bool   $multiline       whether to create a multiline tag where each
     *                                attribute gets written to a single line
     * @param string $indent          string used to indent attributes
     *                                (_auto indents attributes so they start
     *                                at the same column)
     * @param string $linebreak       string used for linebreaks
     * @param bool   $sortAttributes  Whether to sort the attributes or not
     * @param int    $collapseTagMode How to handle a content-less, and thus collapseable, tag
     *
     * @return string XML tag
     *
     * @see  createTag()
     * @uses attributesToString() to serialize the attributes of the tag
     * @uses splitQualifiedName() to get local part and namespace of a qualified name
     * @uses createCDataSection()
     * @uses collapseEmptyTags()
     * @uses raiseError()
     */
    public static function createTagFromArray(
        $tag, $replaceEntities = XML_UTIL_REPLACE_ENTITIES,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true, $collapseTagMode = XML_UTIL_COLLAPSE_ALL
    ) {
        if (isset($tag['content']) && !is_scalar($tag['content'])) {
            return XML_Util::raiseError(
                'Supplied non-scalar value as tag content',
                XML_UTIL_ERROR_NON_SCALAR_CONTENT
            );
        }

        if (!isset($tag['qname']) && !isset($tag['localPart'])) {
            return XML_Util::raiseError(
                'You must either supply a qualified name '
                . '(qname) or local tag name (localPart).',
                XML_UTIL_ERROR_NO_TAG_NAME
            );
        }

        // if no attributes hav been set, use empty attributes
        if (!isset($tag['attributes']) || !is_array($tag['attributes'])) {
            $tag['attributes'] = array();
        }

        if (isset($tag['namespaces'])) {
            foreach ($tag['namespaces'] as $ns => $uri) {
                $tag['attributes']['xmlns:' . $ns] = $uri;
            }
        }

        if (!isset($tag['qname'])) {
            // qualified name is not given

            // check for namespace
            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
                $tag['qname'] = $tag['namespace'] . ':' . $tag['localPart'];
            } else {
                $tag['qname'] = $tag['localPart'];
            }
        } elseif (isset($tag['namespaceUri']) && !isset($tag['namespace'])) {
            // namespace URI is set, but no namespace

            $parts = XML_Util::splitQualifiedName($tag['qname']);

            $tag['localPart'] = $parts['localPart'];
            if (isset($parts['namespace'])) {
                $tag['namespace'] = $parts['namespace'];
            }
        }

        if (isset($tag['namespaceUri']) && !empty($tag['namespaceUri'])) {
            // is a namespace given
            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
                $tag['attributes']['xmlns:' . $tag['namespace']]
                    = $tag['namespaceUri'];
            } else {
                // define this Uri as the default namespace
                $tag['attributes']['xmlns'] = $tag['namespaceUri'];
            }
        }

        if (!array_key_exists('content', $tag)) {
            $tag['content'] = '';
        }

        // check for multiline attributes
        if ($multiline === true) {
            if ($indent === '_auto') {
                $indent = str_repeat(' ', (strlen($tag['qname'])+2));
            }
        }

        // create attribute list
        $attList = XML_Util::attributesToString(
            $tag['attributes'],
            $sortAttributes, $multiline, $indent, $linebreak
        );

        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_NONE:
            break;
        case XML_UTIL_CDATA_SECTION:
            $tag['content'] = XML_Util::createCDataSection($tag['content']);
            break;
        default:
            $tag['content'] = XML_Util::replaceEntities(
                $tag['content'], $replaceEntities
            );
            break;
        }
        $tag = sprintf(
            '<%s%s>%s</%s>', $tag['qname'], $attList, $tag['content'],
            $tag['qname']
        );

        return self::collapseEmptyTags($tag, $collapseTagMode);
    }

    /**
     * Create a start element
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createStartElement('myNs:myTag',
     *     array('foo' => 'bar') ,'http://www.w3c.org/myNs#');
     * </code>
     *
     * @param string $qname          qualified tagname (including namespace)
     * @param array  $attributes     array containg attributes
     * @param string $namespaceUri   URI of the namespace
     * @param bool   $multiline      whether to create a multiline tag where each
     *                               attribute gets written to a single line
     * @param string $indent         string used to indent attributes (_auto indents
     *                               attributes so they start at the same column)
     * @param string $linebreak      string used for linebreaks
     * @param bool   $sortAttributes Whether to sort the attributes or not
     *
     * @return string XML start element
     * @see    createEndElement(), createTag()
     */
    public static function createStartElement(
        $qname, $attributes = array(), $namespaceUri = null,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true
    ) {
        // if no attributes hav been set, use empty attributes
        if (!isset($attributes) || !is_array($attributes)) {
            $attributes = array();
        }

        if ($namespaceUri != null) {
            $parts = XML_Util::splitQualifiedName($qname);
        }

        // check for multiline attributes
        if ($multiline === true) {
            if ($indent === '_auto') {
                $indent = str_repeat(' ', (strlen($qname)+2));
            }
        }

        if ($namespaceUri != null) {
            // is a namespace given
            if (isset($parts['namespace']) && !empty($parts['namespace'])) {
                $attributes['xmlns:' . $parts['namespace']] = $namespaceUri;
            } else {
                // define this Uri as the default namespace
                $attributes['xmlns'] = $namespaceUri;
            }
        }

        // create attribute list
        $attList = XML_Util::attributesToString(
            $attributes, $sortAttributes,
            $multiline, $indent, $linebreak
        );
        $element = sprintf('<%s%s>', $qname, $attList);
        return  $element;
    }

    /**
     * Create an end element
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createEndElement('myNs:myTag');
     * </code>
     *
     * @param string $qname qualified tagname (including namespace)
     *
     * @return string XML end element
     * @see    createStartElement(), createTag()
     */
    public static function createEndElement($qname)
    {
        $element = sprintf('</%s>', $qname);
        return $element;
    }

    /**
     * Create an XML comment
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createComment('I am a comment');
     * </code>
     *
     * @param string $content content of the comment
     *
     * @return string XML comment
     */
    public static function createComment($content)
    {
        $comment = sprintf('<!-- %s -->', $content);
        return $comment;
    }

    /**
     * Create a CData section
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create a CData section
     * $tag = XML_Util::createCDataSection('I am content.');
     * </code>
     *
     * @param string $data data of the CData section
     *
     * @return string CData section with content
     */
    public static function createCDataSection($data)
    {
        return sprintf(
            '<![CDATA[%s]]>',
            preg_replace('/\]\]>/', ']]]]><![CDATA[>', strval($data))
        );
    }

    /**
     * Split qualified name and return namespace and local part
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // split qualified tag
     * $parts = XML_Util::splitQualifiedName('xslt:stylesheet');
     * </code>
     * the returned array will contain two elements:
     * <pre>
     * array(
     *     'namespace' => 'xslt',
     *     'localPart' => 'stylesheet'
     * );
     * </pre>
     *
     * @param string $qname     qualified tag name
     * @param string $defaultNs default namespace (optional)
     *
     * @return array array containing namespace and local part
     */
    public static function splitQualifiedName($qname, $defaultNs = null)
    {
        if (strstr($qname, ':')) {
            $tmp = explode(':', $qname);
            return array(
                'namespace' => $tmp[0],
                'localPart' => $tmp[1]
            );
        }
        return array(
            'namespace' => $defaultNs,
            'localPart' => $qname
        );
    }

    /**
     * Check, whether string is valid XML name
     *
     * <p>XML names are used for tagname, attribute names and various
     * other, lesser known entities.</p>
     * <p>An XML name may only consist of alphanumeric characters,
     * dashes, undescores and periods, and has to start with a letter
     * or an underscore.</p>
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // verify tag name
     * $result = XML_Util::isValidName('invalidTag?');
     * if (is_a($result, 'PEAR_Error')) {
     *    print 'Invalid XML name: ' . $result->getMessage();
     * }
     * </code>
     *
     * @param string $string string that should be checked
     *
     * @return mixed true, if string is a valid XML name, PEAR error otherwise
     *
     * @todo support for other charsets
     * @todo PEAR CS - unable to avoid 85-char limit on second preg_match
     */
    public static function isValidName($string)
    {
        // check for invalid chars
        if (!is_string($string) || !strlen($string) || !preg_match('/^[[:alpha:]_]\\z/', $string[0])) {
            return XML_Util::raiseError(
                'XML names may only start with letter or underscore',
                XML_UTIL_ERROR_INVALID_START
            );
        }

        // check for invalid chars
        $match = preg_match(
            '/^([[:alpha:]_]([[:alnum:]\-\.]*)?:)?'
            . '[[:alpha:]_]([[:alnum:]\_\-\.]+)?\\z/',
            $string
        );
        if (!$match) {
            return XML_Util::raiseError(
                'XML names may only contain alphanumeric '
                . 'chars, period, hyphen, colon and underscores',
                XML_UTIL_ERROR_INVALID_CHARS
            );
        }
        // XML name is valid
        return true;
    }

    /**
     * Replacement for XML_Util::raiseError
     *
     * Avoids the necessity to always require
     * PEAR.php
     *
     * @param string $msg  error message
     * @param int    $code error code
     *
     * @return PEAR_Error
     * @todo   PEAR CS - should this use include_once instead?
     */
    public static function raiseError($msg, $code)
    {
        include_once 'PEAR.php';
        return PEAR::raiseError($msg, $code);
    }
}
?>
pear/XML/RPC.php000064400000164717151732710000007304 0ustar00<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * PHP implementation of the XML-RPC protocol
 *
 * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
 * It has support for HTTP transport, proxies and authentication.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: RPC.php 315594 2011-08-27 01:03:57Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


if (!function_exists('xml_parser_create')) {
    include_once 'PEAR.php';
    PEAR::loadExtension('xml');
}

/**#@+
 * Error constants
 */
/**
 * Parameter values don't match parameter types
 */
define('XML_RPC_ERROR_INVALID_TYPE', 101);
/**
 * Parameter declared to be numeric but the values are not
 */
define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102);
/**
 * Communication error
 */
define('XML_RPC_ERROR_CONNECTION_FAILED', 103);
/**
 * The array or struct has already been started
 */
define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104);
/**
 * Incorrect parameters submitted
 */
define('XML_RPC_ERROR_INCORRECT_PARAMS', 105);
/**
 * Programming error by developer
 */
define('XML_RPC_ERROR_PROGRAMMING', 106);
/**#@-*/


/**
 * Data types
 * @global string $GLOBALS['XML_RPC_I4']
 */
$GLOBALS['XML_RPC_I4'] = 'i4';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Int']
 */
$GLOBALS['XML_RPC_Int'] = 'int';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Boolean']
 */
$GLOBALS['XML_RPC_Boolean'] = 'boolean';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Double']
 */
$GLOBALS['XML_RPC_Double'] = 'double';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_String']
 */
$GLOBALS['XML_RPC_String'] = 'string';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_DateTime']
 */
$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Base64']
 */
$GLOBALS['XML_RPC_Base64'] = 'base64';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Array']
 */
$GLOBALS['XML_RPC_Array'] = 'array';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Struct']
 */
$GLOBALS['XML_RPC_Struct'] = 'struct';


/**
 * Data type meta-types
 * @global array $GLOBALS['XML_RPC_Types']
 */
$GLOBALS['XML_RPC_Types'] = array(
    $GLOBALS['XML_RPC_I4']       => 1,
    $GLOBALS['XML_RPC_Int']      => 1,
    $GLOBALS['XML_RPC_Boolean']  => 1,
    $GLOBALS['XML_RPC_String']   => 1,
    $GLOBALS['XML_RPC_Double']   => 1,
    $GLOBALS['XML_RPC_DateTime'] => 1,
    $GLOBALS['XML_RPC_Base64']   => 1,
    $GLOBALS['XML_RPC_Array']    => 2,
    $GLOBALS['XML_RPC_Struct']   => 3,
);


/**
 * Error message numbers
 * @global array $GLOBALS['XML_RPC_err']
 */
$GLOBALS['XML_RPC_err'] = array(
    'unknown_method'      => 1,
    'invalid_return'      => 2,
    'incorrect_params'    => 3,
    'introspect_unknown'  => 4,
    'http_error'          => 5,
    'not_response_object' => 6,
    'invalid_request'     => 7,
);

/**
 * Error message strings
 * @global array $GLOBALS['XML_RPC_str']
 */
$GLOBALS['XML_RPC_str'] = array(
    'unknown_method'      => 'Unknown method',
    'invalid_return'      => 'Invalid return payload: enable debugging to examine incoming payload',
    'incorrect_params'    => 'Incorrect parameters passed to method',
    'introspect_unknown'  => 'Can\'t introspect: method unknown',
    'http_error'          => 'Didn\'t receive 200 OK from remote server.',
    'not_response_object' => 'The requested method didn\'t return an XML_RPC_Response object.',
    'invalid_request'     => 'Invalid request payload',
);


/**
 * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII)
 * @global string $GLOBALS['XML_RPC_defencoding']
 */
$GLOBALS['XML_RPC_defencoding'] = 'UTF-8';

/**
 * User error codes start at 800
 * @global int $GLOBALS['XML_RPC_erruser']
 */
$GLOBALS['XML_RPC_erruser'] = 800;

/**
 * XML parse error codes start at 100
 * @global int $GLOBALS['XML_RPC_errxml']
 */
$GLOBALS['XML_RPC_errxml'] = 100;


/**
 * Compose backslashes for escaping regexp
 * @global string $GLOBALS['XML_RPC_backslash']
 */
$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92);


/**
 * Should we automatically base64 encode strings that contain characters
 * which can cause PHP's SAX-based XML parser to break?
 * @global boolean $GLOBALS['XML_RPC_auto_base64']
 */
$GLOBALS['XML_RPC_auto_base64'] = false;


/**
 * Valid parents of XML elements
 * @global array $GLOBALS['XML_RPC_valid_parents']
 */
$GLOBALS['XML_RPC_valid_parents'] = array(
    'BOOLEAN' => array('VALUE'),
    'I4' => array('VALUE'),
    'INT' => array('VALUE'),
    'STRING' => array('VALUE'),
    'DOUBLE' => array('VALUE'),
    'DATETIME.ISO8601' => array('VALUE'),
    'BASE64' => array('VALUE'),
    'ARRAY' => array('VALUE'),
    'STRUCT' => array('VALUE'),
    'PARAM' => array('PARAMS'),
    'METHODNAME' => array('METHODCALL'),
    'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
    'MEMBER' => array('STRUCT'),
    'NAME' => array('MEMBER'),
    'DATA' => array('ARRAY'),
    'FAULT' => array('METHODRESPONSE'),
    'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
);


/**
 * Stores state during parsing
 *
 * quick explanation of components:
 *   + ac     = accumulates values
 *   + qt     = decides if quotes are needed for evaluation
 *   + cm     = denotes struct or array (comma needed)
 *   + isf    = indicates a fault
 *   + lv     = indicates "looking for a value": implements the logic
 *               to allow values with no types to be strings
 *   + params = stores parameters in method calls
 *   + method = stores method name
 *
 * @global array $GLOBALS['XML_RPC_xh']
 */
$GLOBALS['XML_RPC_xh'] = array();


/**
 * Start element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_se($parser_resource, $name, $attrs)
{
    global $XML_RPC_xh, $XML_RPC_valid_parents;

    $parser = (int) $parser_resource;

    // if invalid xmlrpc already detected, skip all processing
    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }

    // check for correct element nesting
    // top level element can only be of 2 types
    if (count($XML_RPC_xh[$parser]['stack']) == 0) {
        if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') {
            $XML_RPC_xh[$parser]['isf'] = 2;
            $XML_RPC_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element';
            return;
        }
    } else {
        // not top level element: see if parent is OK
        if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) {
            $name = preg_replace('@[^a-zA-Z0-9._-]@', '', $name);
            $XML_RPC_xh[$parser]['isf'] = 2;
            $XML_RPC_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$XML_RPC_xh[$parser]['stack'][0]}";
            return;
        }
    }

    switch ($name) {
    case 'STRUCT':
        $XML_RPC_xh[$parser]['cm']++;

        // turn quoting off
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array();
        $cur_val['value'] = array();
        $cur_val['members'] = 1;
        array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        break;

    case 'ARRAY':
        $XML_RPC_xh[$parser]['cm']++;

        // turn quoting off
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array();
        $cur_val['value'] = array();
        $cur_val['members'] = 0;
        array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        break;

    case 'NAME':
        $XML_RPC_xh[$parser]['ac'] = '';
        break;

    case 'FAULT':
        $XML_RPC_xh[$parser]['isf'] = 1;
        break;

    case 'PARAM':
        $XML_RPC_xh[$parser]['valuestack'] = array();
        break;

    case 'VALUE':
        $XML_RPC_xh[$parser]['lv'] = 1;
        $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        // look for a value: if this is still 1 by the
        // time we reach the first data segment then the type is string
        // by implication and we need to add in a quote
        break;

    case 'I4':
    case 'INT':
    case 'STRING':
    case 'BOOLEAN':
    case 'DOUBLE':
    case 'DATETIME.ISO8601':
    case 'BASE64':
        $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator

        if ($name == 'DATETIME.ISO8601' || $name == 'STRING') {
            $XML_RPC_xh[$parser]['qt'] = 1;

            if ($name == 'DATETIME.ISO8601') {
                $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
            }

        } elseif ($name == 'BASE64') {
            $XML_RPC_xh[$parser]['qt'] = 2;
        } else {
            // No quoting is required here -- but
            // at the end of the element we must check
            // for data format errors.
            $XML_RPC_xh[$parser]['qt'] = 0;
        }
        break;

    case 'MEMBER':
        $XML_RPC_xh[$parser]['ac'] = '';
        break;

    case 'DATA':
    case 'METHODCALL':
    case 'METHODNAME':
    case 'METHODRESPONSE':
    case 'PARAMS':
        // valid elements that add little to processing
        break;
    }


    // Save current element to stack
    array_unshift($XML_RPC_xh[$parser]['stack'], $name);

    if ($name != 'VALUE') {
        $XML_RPC_xh[$parser]['lv'] = 0;
    }
}

/**
 * End element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_ee($parser_resource, $name)
{
    global $XML_RPC_xh;

    $parser = (int) $parser_resource;

    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }

    // push this element from stack
    // NB: if XML validates, correct opening/closing is guaranteed and
    // we do not have to check for $name == $curr_elem.
    // we also checked for proper nesting at start of elements...
    $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);

    switch ($name) {
    case 'STRUCT':
    case 'ARRAY':
    $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
    $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
        $XML_RPC_xh[$parser]['cm']--;
        break;

    case 'NAME':
    $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
        break;

    case 'BOOLEAN':
        // special case here: we translate boolean 1 or 0 into PHP
        // constants true or false
        if ($XML_RPC_xh[$parser]['ac'] == '1') {
            $XML_RPC_xh[$parser]['ac'] = 'true';
        } else {
            $XML_RPC_xh[$parser]['ac'] = 'false';
        }

        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
        // Drop through intentionally.

    case 'I4':
    case 'INT':
    case 'STRING':
    case 'DOUBLE':
    case 'DATETIME.ISO8601':
    case 'BASE64':
        if ($XML_RPC_xh[$parser]['qt'] == 1) {
            // we use double quotes rather than single so backslashification works OK
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
        } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
            $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
        } elseif ($name == 'BOOLEAN') {
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
        } else {
            // we have an I4, INT or a DOUBLE
            // we must check that only 0123456789-.<space> are characters here
            if (!preg_match("@^[+-]?[0123456789 \t\.]+$@", $XML_RPC_xh[$parser]['ac'])) {
                XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE',
                                         XML_RPC_ERROR_NON_NUMERIC_FOUND);
                $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
            } else {
                // it's ok, add it on
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            }
        }

        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value
        break;

    case 'VALUE':
        if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
            if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
                // The <value> element was empty.
                $XML_RPC_xh[$parser]['value'] = '';
            }
        }

        $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);

        $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
        if (is_array($cur_val)) {
            if ($cur_val['members']==0) {
                $cur_val['value'][] = $temp;
            } else {
                $XML_RPC_xh[$parser]['value'] = $temp;
            }
            array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        } else {
            $XML_RPC_xh[$parser]['value'] = $temp;
        }
        break;

    case 'MEMBER':
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
        if (is_array($cur_val)) {
            if ($cur_val['members']==1) {
                $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
            }
            array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        }
        break;

    case 'DATA':
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        break;

    case 'PARAM':
        $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
        break;

    case 'METHODNAME':
    case 'RPCMETHODNAME':
        $XML_RPC_xh[$parser]['method'] = preg_replace("@^[\n\r\t ]+@", '',
                                                      $XML_RPC_xh[$parser]['ac']);
        break;
    }

    // if it's a valid type name, set the type
    if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
}

/**
 * Character data handler for the XML parser
 *
 * @return void
 */
function XML_RPC_cd($parser_resource, $data)
{
    global $XML_RPC_xh, $XML_RPC_backslash;

    $parser = (int) $parser_resource;

    if ($XML_RPC_xh[$parser]['lv'] != 3) {
        // "lookforvalue==3" means that we've found an entire value
        // and should discard any further character data

        if ($XML_RPC_xh[$parser]['lv'] == 1) {
            // if we've found text and we're just in a <value> then
            // turn quoting on, as this will be a string
            $XML_RPC_xh[$parser]['qt'] = 1;
            // and say we've found a value
            $XML_RPC_xh[$parser]['lv'] = 2;
        }

        // replace characters that eval would
        // do special things with
        if (!isset($XML_RPC_xh[$parser]['ac'])) {
            $XML_RPC_xh[$parser]['ac'] = '';
        }
        $XML_RPC_xh[$parser]['ac'] .= $data;
    }
}

/**
 * The common methods and properties for all of the XML_RPC classes
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Base {

    /**
     * PEAR Error handling
     *
     * @return object  PEAR_Error object
     */
    function raiseError($msg, $code)
    {
        include_once 'PEAR.php';
        if (is_object(@$this)) {
            return PEAR::raiseError(get_class($this) . ': ' . $msg, $code);
        } else {
            return PEAR::raiseError('XML_RPC: ' . $msg, $code);
        }
    }

    /**
     * Tell whether something is a PEAR_Error object
     *
     * @param mixed $value  the item to check
     *
     * @return bool  whether $value is a PEAR_Error object or not
     *
     * @access public
     */
    function isError($value)
    {
        return is_object($value) && is_a($value, 'PEAR_Error');
    }
}

/**
 * The methods and properties for submitting XML RPC requests
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Client extends XML_RPC_Base {

    /**
     * The path and name of the RPC server script you want the request to go to
     * @var string
     */
    var $path = '';

    /**
     * The name of the remote server to connect to
     * @var string
     */
    var $server = '';

    /**
     * The protocol to use in contacting the remote server
     * @var string
     */
    var $protocol = 'http://';

    /**
     * The port for connecting to the remote server
     *
     * The default is 80 for http:// connections
     * and 443 for https:// and ssl:// connections.
     *
     * @var integer
     */
    var $port = 80;

    /**
     * A user name for accessing the RPC server
     * @var string
     * @see XML_RPC_Client::setCredentials()
     */
    var $username = '';

    /**
     * A password for accessing the RPC server
     * @var string
     * @see XML_RPC_Client::setCredentials()
     */
    var $password = '';

    /**
     * The name of the proxy server to use, if any
     * @var string
     */
    var $proxy = '';

    /**
     * The protocol to use in contacting the proxy server, if any
     * @var string
     */
    var $proxy_protocol = 'http://';

    /**
     * The port for connecting to the proxy server
     *
     * The default is 8080 for http:// connections
     * and 443 for https:// and ssl:// connections.
     *
     * @var integer
     */
    var $proxy_port = 8080;

    /**
     * A user name for accessing the proxy server
     * @var string
     */
    var $proxy_user = '';

    /**
     * A password for accessing the proxy server
     * @var string
     */
    var $proxy_pass = '';

    /**
     * The error number, if any
     * @var integer
     */
    var $errno = 0;

    /**
     * The error message, if any
     * @var string
     */
    var $errstr = '';

    /**
     * The current debug mode (1 = on, 0 = off)
     * @var integer
     */
    var $debug = 0;

    /**
     * The HTTP headers for the current request.
     * @var string
     */
    var $headers = '';


    /**
     * Sets the object's properties
     *
     * @param string  $path        the path and name of the RPC server script
     *                              you want the request to go to
     * @param string  $server      the URL of the remote server to connect to.
     *                              If this parameter doesn't specify a
     *                              protocol and $port is 443, ssl:// is
     *                              assumed.
     * @param integer $port        a port for connecting to the remote server.
     *                              Defaults to 80 for http:// connections and
     *                              443 for https:// and ssl:// connections.
     * @param string  $proxy       the URL of the proxy server to use, if any.
     *                              If this parameter doesn't specify a
     *                              protocol and $port is 443, ssl:// is
     *                              assumed.
     * @param integer $proxy_port  a port for connecting to the remote server.
     *                              Defaults to 8080 for http:// connections and
     *                              443 for https:// and ssl:// connections.
     * @param string  $proxy_user  a user name for accessing the proxy server
     * @param string  $proxy_pass  a password for accessing the proxy server
     *
     * @return void
     */
    function XML_RPC_Client($path, $server, $port = 0,
                            $proxy = '', $proxy_port = 0,
                            $proxy_user = '', $proxy_pass = '')
    {
        $this->path       = $path;
        $this->proxy_user = $proxy_user;
        $this->proxy_pass = $proxy_pass;

        preg_match('@^(http://|https://|ssl://)?(.*)$@', $server, $match);
        if ($match[1] == '') {
            if ($port == 443) {
                $this->server   = $match[2];
                $this->protocol = 'ssl://';
                $this->port     = 443;
            } else {
                $this->server = $match[2];
                if ($port) {
                    $this->port = $port;
                }
            }
        } elseif ($match[1] == 'http://') {
            $this->server = $match[2];
            if ($port) {
                $this->port = $port;
            }
        } else {
            $this->server   = $match[2];
            $this->protocol = 'ssl://';
            if ($port) {
                $this->port = $port;
            } else {
                $this->port = 443;
            }
        }

        if ($proxy) {
            preg_match('@^(http://|https://|ssl://)?(.*)$@', $proxy, $match);
            if ($match[1] == '') {
                if ($proxy_port == 443) {
                    $this->proxy          = $match[2];
                    $this->proxy_protocol = 'ssl://';
                    $this->proxy_port     = 443;
                } else {
                    $this->proxy = $match[2];
                    if ($proxy_port) {
                        $this->proxy_port = $proxy_port;
                    }
                }
            } elseif ($match[1] == 'http://') {
                $this->proxy = $match[2];
                if ($proxy_port) {
                    $this->proxy_port = $proxy_port;
                }
            } else {
                $this->proxy          = $match[2];
                $this->proxy_protocol = 'ssl://';
                if ($proxy_port) {
                    $this->proxy_port = $proxy_port;
                } else {
                    $this->proxy_port = 443;
                }
            }
        }
    }

    /**
     * Change the current debug mode
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     */
    function setDebug($in)
    {
        if ($in) {
            $this->debug = 1;
        } else {
            $this->debug = 0;
        }
    }

    /**
     * Sets whether strings that contain characters which may cause PHP's
     * SAX-based XML parser to break should be automatically base64 encoded
     *
     * This is is a workaround for systems that don't have PHP's mbstring
     * extension available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     */
    function setAutoBase64($in)
    {
        if ($in) {
            $GLOBALS['XML_RPC_auto_base64'] = true;
        } else {
            $GLOBALS['XML_RPC_auto_base64'] = false;
        }
    }

    /**
     * Set username and password properties for connecting to the RPC server
     *
     * @param string $u  the user name
     * @param string $p  the password
     *
     * @return void
     *
     * @see XML_RPC_Client::$username, XML_RPC_Client::$password
     */
    function setCredentials($u, $p)
    {
        $this->username = $u;
        $this->password = $p;
    }

    /**
     * Transmit the RPC request via HTTP 1.0 protocol
     *
     * @param object $msg       the XML_RPC_Message object
     * @param int    $timeout   how many seconds to wait for the request
     *
     * @return object  an XML_RPC_Response object.  0 is returned if any
     *                  problems happen.
     *
     * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(),
     *      XML_RPC_Client::setCredentials()
     */
    function send($msg, $timeout = 0)
    {
        if (!is_object($msg) || !is_a($msg, 'XML_RPC_Message')) {
            $this->errstr = 'send()\'s $msg parameter must be an'
                          . ' XML_RPC_Message object.';
            $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING);
            return 0;
        }
        $msg->debug = $this->debug;
        return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
                                        $timeout, $this->username,
                                        $this->password);
    }

    /**
     * Transmit the RPC request via HTTP 1.0 protocol
     *
     * Requests should be sent using XML_RPC_Client send() rather than
     * calling this method directly.
     *
     * @param object $msg       the XML_RPC_Message object
     * @param string $server    the server to send the request to
     * @param int    $port      the server port send the request to
     * @param int    $timeout   how many seconds to wait for the request
     *                           before giving up
     * @param string $username  a user name for accessing the RPC server
     * @param string $password  a password for accessing the RPC server
     *
     * @return object  an XML_RPC_Response object.  0 is returned if any
     *                  problems happen.
     *
     * @access protected
     * @see XML_RPC_Client::send()
     */
    function sendPayloadHTTP10($msg, $server, $port, $timeout = 0,
                               $username = '', $password = '')
    {
        // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly
        if ($username != $this->username) {
            $this->setCredentials($username, $password);
        }

        // Only create the payload if it was not created previously
        if (empty($msg->payload)) {
            $msg->createPayload();
        }
        $this->createHeaders($msg);

        $op  = $this->headers . "\r\n\r\n";
        $op .= $msg->payload;

        if ($this->debug) {
            print "\n<pre>---SENT---\n";
            print $op;
            print "\n---END---</pre>\n";
        }

        /*
         * If we're using a proxy open a socket to the proxy server
         * instead to the xml-rpc server
         */
        if ($this->proxy) {
            if ($this->proxy_protocol == 'http://') {
                $protocol = '';
            } else {
                $protocol = $this->proxy_protocol;
            }
            if ($timeout > 0) {
                $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
                                 $this->errno, $this->errstr, $timeout);
            } else {
                $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
                                 $this->errno, $this->errstr);
            }
        } else {
            if ($this->protocol == 'http://') {
                $protocol = '';
            } else {
                $protocol = $this->protocol;
            }
            if ($timeout > 0) {
                $fp = @fsockopen($protocol . $server, $port,
                                 $this->errno, $this->errstr, $timeout);
            } else {
                $fp = @fsockopen($protocol . $server, $port,
                                 $this->errno, $this->errstr);
            }
        }

        /*
         * Just raising the error without returning it is strange,
         * but keep it here for backwards compatibility.
         */
        if (!$fp && $this->proxy) {
            $this->raiseError('Connection to proxy server '
                              . $this->proxy . ':' . $this->proxy_port
                              . ' failed. ' . $this->errstr,
                              XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        } elseif (!$fp) {
            $this->raiseError('Connection to RPC server '
                              . $server . ':' . $port
                              . ' failed. ' . $this->errstr,
                              XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        }

        if ($timeout) {
            /*
             * Using socket_set_timeout() because stream_set_timeout()
             * was introduced in 4.3.0, but we need to support 4.2.0.
             */
            socket_set_timeout($fp, $timeout);
        }

        if (!fputs($fp, $op, strlen($op))) {
            $this->errstr = 'Write error';
            return 0;
        }
        $resp = $msg->parseResponseFile($fp);

        $meta = socket_get_status($fp);
        if ($meta['timed_out']) {
            fclose($fp);
            $this->errstr = 'RPC server did not send response before timeout.';
            $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        }

        fclose($fp);
        return $resp;
    }

    /**
     * Determines the HTTP headers and puts it in the $headers property
     *
     * @param object $msg       the XML_RPC_Message object
     *
     * @return boolean  TRUE if okay, FALSE if the message payload isn't set.
     *
     * @access protected
     */
    function createHeaders($msg)
    {
        if (empty($msg->payload)) {
            return false;
        }
        if ($this->proxy) {
            $this->headers = 'POST ' . $this->protocol . $this->server;
            if ($this->proxy_port) {
                $this->headers .= ':' . $this->port;
            }
        } else {
           $this->headers = 'POST ';
        }
        $this->headers .= $this->path. " HTTP/1.0\r\n";

        $this->headers .= "User-Agent: PEAR XML_RPC\r\n";
        $this->headers .= 'Host: ' . $this->server . "\r\n";

        if ($this->proxy && $this->proxy_user) {
            $this->headers .= 'Proxy-Authorization: Basic '
                     . base64_encode("$this->proxy_user:$this->proxy_pass")
                     . "\r\n";
        }

        // thanks to Grant Rauscher <grant7@firstworld.net> for this
        if ($this->username) {
            $this->headers .= 'Authorization: Basic '
                     . base64_encode("$this->username:$this->password")
                     . "\r\n";
        }

        $this->headers .= "Content-Type: text/xml\r\n";
        $this->headers .= 'Content-Length: ' . strlen($msg->payload);
        return true;
    }
}

/**
 * The methods and properties for interpreting responses to XML RPC requests
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Response extends XML_RPC_Base
{
    var $xv;
    var $fn;
    var $fs;
    var $hdrs;

    /**
     * @return void
     */
    function XML_RPC_Response($val, $fcode = 0, $fstr = '')
    {
        if ($fcode != 0) {
            $this->fn = $fcode;
            $this->fs = htmlspecialchars($fstr);
        } else {
            $this->xv = $val;
        }
    }

    /**
     * @return int  the error code
     */
    function faultCode()
    {
        if (isset($this->fn)) {
            return $this->fn;
        } else {
            return 0;
        }
    }

    /**
     * @return string  the error string
     */
    function faultString()
    {
        return $this->fs;
    }

    /**
     * @return mixed  the value
     */
    function value()
    {
        return $this->xv;
    }

    /**
     * @return string  the error message in XML format
     */
    function serialize()
    {
        $rs = "<methodResponse>\n";
        if ($this->fn) {
            $rs .= "<fault>
  <value>
    <struct>
      <member>
        <name>faultCode</name>
        <value><int>" . $this->fn . "</int></value>
      </member>
      <member>
        <name>faultString</name>
        <value><string>" . $this->fs . "</string></value>
      </member>
    </struct>
  </value>
</fault>";
        } else {
            $rs .= "<params>\n<param>\n" . $this->xv->serialize() .
        "</param>\n</params>";
        }
        $rs .= "\n</methodResponse>";
        return $rs;
    }
}

/**
 * The methods and properties for composing XML RPC messages
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Message extends XML_RPC_Base
{
    /**
     * Should the payload's content be passed through mb_convert_encoding()?
     *
     * @see XML_RPC_Message::setConvertPayloadEncoding()
     * @since Property available since Release 1.5.1
     * @var boolean
     */
    var $convert_payload_encoding = false;

    /**
     * The current debug mode (1 = on, 0 = off)
     * @var integer
     */
    var $debug = 0;

    /**
     * The encoding to be used for outgoing messages
     *
     * Defaults to the value of <var>$GLOBALS['XML_RPC_defencoding']</var>
     *
     * @var string
     * @see XML_RPC_Message::setSendEncoding(),
     *      $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header()
     */
    var $send_encoding = '';

    /**
     * The method presently being evaluated
     * @var string
     */
    var $methodname = '';

    /**
     * @var array
     */
    var $params = array();

    /**
     * The XML message being generated
     * @var string
     */
    var $payload = '';

    /**
     * Should extra line breaks be removed from the payload?
     * @since Property available since Release 1.4.6
     * @var boolean
     */
    var $remove_extra_lines = true;

    /**
     * The XML response from the remote server
     * @since Property available since Release 1.4.6
     * @var string
     */
    var $response_payload = '';


    /**
     * @return void
     */
    function XML_RPC_Message($meth, $pars = 0)
    {
        $this->methodname = $meth;
        if (is_array($pars) && sizeof($pars) > 0) {
            for ($i = 0; $i < sizeof($pars); $i++) {
                $this->addParam($pars[$i]);
            }
        }
    }

    /**
     * Produces the XML declaration including the encoding attribute
     *
     * The encoding is determined by this class' <var>$send_encoding</var>
     * property.  If the <var>$send_encoding</var> property is not set, use
     * <var>$GLOBALS['XML_RPC_defencoding']</var>.
     *
     * @return string  the XML declaration and <methodCall> element
     *
     * @see XML_RPC_Message::setSendEncoding(),
     *      XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding']
     */
    function xml_header()
    {
        global $XML_RPC_defencoding;

        if (!$this->send_encoding) {
            $this->send_encoding = $XML_RPC_defencoding;
        }
        return '<?xml version="1.0" encoding="' . $this->send_encoding . '"?>'
               . "\n<methodCall>\n";
    }

    /**
     * @return string  the closing </methodCall> tag
     */
    function xml_footer()
    {
        return "</methodCall>\n";
    }

    /**
     * Fills the XML_RPC_Message::$payload property
     *
     * Part of the process makes sure all line endings are in DOS format
     * (CRLF), which is probably required by specifications.
     *
     * If XML_RPC_Message::setConvertPayloadEncoding() was set to true,
     * the payload gets passed through mb_convert_encoding()
     * to ensure the payload matches the encoding set in the
     * XML declaration.  The encoding type can be manually set via
     * XML_RPC_Message::setSendEncoding().
     *
     * @return void
     *
     * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer()
     * @see XML_RPC_Message::setSendEncoding(), $GLOBALS['XML_RPC_defencoding'],
     *      XML_RPC_Message::setConvertPayloadEncoding()
     */
    function createPayload()
    {
        $this->payload = $this->xml_header();
        $this->payload .= '<methodName>' . $this->methodname . "</methodName>\n";
        $this->payload .= "<params>\n";
        for ($i = 0; $i < sizeof($this->params); $i++) {
            $p = $this->params[$i];
            $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
        }
        $this->payload .= "</params>\n";
        $this->payload .= $this->xml_footer();
        if ($this->remove_extra_lines) {
            $this->payload = preg_replace("@[\r\n]+@", "\r\n", $this->payload);
        } else {
            $this->payload = preg_replace("@\r\n|\n|\r|\n\r@", "\r\n", $this->payload);
        }
        if ($this->convert_payload_encoding) {
            $this->payload = mb_convert_encoding($this->payload, $this->send_encoding);
        }
    }

    /**
     * @return string  the name of the method
     */
    function method($meth = '')
    {
        if ($meth != '') {
            $this->methodname = $meth;
        }
        return $this->methodname;
    }

    /**
     * @return string  the payload
     */
    function serialize()
    {
        $this->createPayload();
        return $this->payload;
    }

    /**
     * @return void
     */
    function addParam($par)
    {
        $this->params[] = $par;
    }

    /**
     * Obtains an XML_RPC_Value object for the given parameter
     *
     * @param int $i  the index number of the parameter to obtain
     *
     * @return object  the XML_RPC_Value object.
     *                  If the parameter doesn't exist, an XML_RPC_Response object.
     *
     * @since Returns XML_RPC_Response object on error since Release 1.3.0
     */
    function getParam($i)
    {
        global $XML_RPC_err, $XML_RPC_str;

        if (isset($this->params[$i])) {
            return $this->params[$i];
        } else {
            $this->raiseError('The submitted request did not contain this parameter',
                              XML_RPC_ERROR_INCORRECT_PARAMS);
            return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
                                        $XML_RPC_str['incorrect_params']);
        }
    }

    /**
     * @return int  the number of parameters
     */
    function getNumParams()
    {
        return sizeof($this->params);
    }

    /**
     * Sets whether the payload's content gets passed through
     * mb_convert_encoding()
     *
     * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     *
     * @see XML_RPC_Message::setSendEncoding()
     * @since Method available since Release 1.5.1
     */
    function setConvertPayloadEncoding($in)
    {
        if ($in && !function_exists('mb_convert_encoding')) {
            return $this->raiseError('mb_convert_encoding() is not available',
                              XML_RPC_ERROR_PROGRAMMING);
        }
        $this->convert_payload_encoding = $in;
    }

    /**
     * Sets the XML declaration's encoding attribute
     *
     * @param string $type  the encoding type (ISO-8859-1, UTF-8 or US-ASCII)
     *
     * @return void
     *
     * @see XML_RPC_Message::setConvertPayloadEncoding(), XML_RPC_Message::xml_header()
     * @since Method available since Release 1.2.0
     */
    function setSendEncoding($type)
    {
        $this->send_encoding = $type;
    }

    /**
     * Determine the XML's encoding via the encoding attribute
     * in the XML declaration
     *
     * If the encoding parameter is not set or is not ISO-8859-1, UTF-8
     * or US-ASCII, $XML_RPC_defencoding will be returned.
     *
     * @param string $data  the XML that will be parsed
     *
     * @return string  the encoding to be used
     *
     * @link   http://php.net/xml_parser_create
     * @since  Method available since Release 1.2.0
     */
    function getEncoding($data)
    {
        global $XML_RPC_defencoding;

        if (preg_match('@<\?xml[^>]*\s*encoding\s*=\s*[\'"]([^"\']*)[\'"]@',
                       $data, $match))
        {
            $match[1] = trim(strtoupper($match[1]));
            switch ($match[1]) {
                case 'ISO-8859-1':
                case 'UTF-8':
                case 'US-ASCII':
                    return $match[1];
                    break;

                default:
                    return $XML_RPC_defencoding;
            }
        } else {
            return $XML_RPC_defencoding;
        }
    }

    /**
     * @return object  a new XML_RPC_Response object
     */
    function parseResponseFile($fp)
    {
        $ipd = '';
        while ($data = @fread($fp, 8192)) {
            $ipd .= $data;
        }
        return $this->parseResponse($ipd);
    }

    /**
     * @return object  a new XML_RPC_Response object
     */
    function parseResponse($data = '')
    {
        global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding;

        $encoding = $this->getEncoding($data);
        $parser_resource = xml_parser_create($encoding);
        $parser = (int) $parser_resource;

        $XML_RPC_xh = array();
        $XML_RPC_xh[$parser] = array();

        $XML_RPC_xh[$parser]['cm'] = 0;
        $XML_RPC_xh[$parser]['isf'] = 0;
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = '';
        $XML_RPC_xh[$parser]['stack'] = array();
        $XML_RPC_xh[$parser]['valuestack'] = array();

        xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
        xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
        xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');

        $hdrfnd = 0;
        if ($this->debug) {
            print "\n<pre>---GOT---\n";
            print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
            print "\n---END---</pre>\n";
        }

        // See if response is a 200 or a 100 then a 200, else raise error.
        // But only do this if we're using the HTTP protocol.
        if (preg_match('@^HTTP@', $data) &&
            !preg_match('@^HTTP/[0-9\.]+ 200 @', $data) &&
            !preg_match('@^HTTP/[0-9\.]+ 10[0-9]([A-Z ]+)?[\r\n]+HTTP/[0-9\.]+ 200@', $data))
        {
                $errstr = substr($data, 0, strpos($data, "\n") - 1);
                error_log('HTTP error, got response: ' . $errstr);
                $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'],
                                          $XML_RPC_str['http_error'] . ' (' .
                                          $errstr . ')');
                xml_parser_free($parser_resource);
                return $r;
        }

        // gotta get rid of headers here
        if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) {
            $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
            $data = substr($data, $brpos + 4);
            $hdrfnd = 1;
        }

        /*
         * be tolerant of junk after methodResponse
         * (e.g. javascript automatically inserted by free hosts)
         * thanks to Luca Mariano <luca.mariano@email.it>
         */
        $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
        $this->response_payload = $data;

        if (!xml_parse($parser_resource, $data, sizeof($data))) {
            // thanks to Peter Kocks <peter.kocks@baygate.com>
            if (xml_get_current_line_number($parser_resource) == 1) {
                $errstr = 'XML error at line 1, check URL';
            } else {
                $errstr = sprintf('XML error: %s at line %d',
                                  xml_error_string(xml_get_error_code($parser_resource)),
                                  xml_get_current_line_number($parser_resource));
            }
            error_log($errstr);
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return']);
            xml_parser_free($parser_resource);
            return $r;
        }

        xml_parser_free($parser_resource);

        if ($this->debug) {
            print "\n<pre>---PARSED---\n";
            var_dump($XML_RPC_xh[$parser]['value']);
            print "---END---</pre>\n";
        }

        if ($XML_RPC_xh[$parser]['isf'] > 1) {
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']);
        } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
            // then something odd has happened
            // and it's time to generate a client side error
            // indicating something odd went on
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return']);
        } else {
            $v = $XML_RPC_xh[$parser]['value'];
            if ($XML_RPC_xh[$parser]['isf']) {
                $f = $v->structmem('faultCode');
                $fs = $v->structmem('faultString');
                $r = new XML_RPC_Response($v, $f->scalarval(),
                                          $fs->scalarval());
            } else {
                $r = new XML_RPC_Response($v);
            }
        }
        $r->hdrs = preg_split("@\r?\n@", $XML_RPC_xh[$parser]['ha']);
        return $r;
    }
}

/**
 * The methods and properties that represent data in XML RPC format
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Value extends XML_RPC_Base
{
    var $me = array();
    var $mytype = 0;

    /**
     * @return void
     */
    function XML_RPC_Value($val = -1, $type = '')
    {
        $this->me = array();
        $this->mytype = 0;
        if ($val != -1 || $type != '') {
            if ($type == '') {
                $type = 'string';
            }
            if (!array_key_exists($type, $GLOBALS['XML_RPC_Types'])) {
                // XXX
                // need some way to report this error
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 1) {
                $this->addScalar($val, $type);
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 2) {
                $this->addArray($val);
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 3) {
                $this->addStruct($val);
            }
        }
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addScalar($val, $type = 'string')
    {
        if ($this->mytype == 1) {
            $this->raiseError('Scalar can have only one value',
                              XML_RPC_ERROR_INVALID_TYPE);
            return 0;
        }
        $typeof = $GLOBALS['XML_RPC_Types'][$type];
        if ($typeof != 1) {
            $this->raiseError("Not a scalar type (${typeof})",
                              XML_RPC_ERROR_INVALID_TYPE);
            return 0;
        }

        if ($type == $GLOBALS['XML_RPC_Boolean']) {
            if (strcasecmp($val, 'true') == 0
                || $val == 1
                || ($val == true && strcasecmp($val, 'false')))
            {
                $val = 1;
            } else {
                $val = 0;
            }
        }

        if ($this->mytype == 2) {
            // we're adding to an array here
            $ar = $this->me['array'];
            $ar[] = new XML_RPC_Value($val, $type);
            $this->me['array'] = $ar;
        } else {
            // a scalar, so set the value and remember we're scalar
            $this->me[$type] = $val;
            $this->mytype = $typeof;
        }
        return 1;
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addArray($vals)
    {
        if ($this->mytype != 0) {
            $this->raiseError(
                    'Already initialized as a [' . $this->kindOf() . ']',
                    XML_RPC_ERROR_ALREADY_INITIALIZED);
            return 0;
        }
        $this->mytype = $GLOBALS['XML_RPC_Types']['array'];
        $this->me['array'] = $vals;
        return 1;
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addStruct($vals)
    {
        if ($this->mytype != 0) {
            $this->raiseError(
                    'Already initialized as a [' . $this->kindOf() . ']',
                    XML_RPC_ERROR_ALREADY_INITIALIZED);
            return 0;
        }
        $this->mytype = $GLOBALS['XML_RPC_Types']['struct'];
        $this->me['struct'] = $vals;
        return 1;
    }

    /**
     * @return void
     */
    function dump($ar)
    {
        reset($ar);
        foreach ($ar as $key => $val) {
            echo "$key => $val<br />";
            if ($key == 'array') {
                foreach ($val as $key2 => $val2) {
                    echo "-- $key2 => $val2<br />";
                }
            }
        }
    }

    /**
     * @return string  the data type of the current value
     */
    function kindOf()
    {
        switch ($this->mytype) {
        case 3:
            return 'struct';

        case 2:
            return 'array';

        case 1:
            return 'scalar';

        default:
            return 'undef';
        }
    }

    /**
     * @return string  the data in XML format
     */
    function serializedata($typ, $val)
    {
        $rs = '';
        if (!array_key_exists($typ, $GLOBALS['XML_RPC_Types'])) {
            // XXX
            // need some way to report this error
            return;
        }
        switch ($GLOBALS['XML_RPC_Types'][$typ]) {
        case 3:
            // struct
            $rs .= "<struct>\n";
            reset($val);
            foreach ($val as $key2 => $val2) {
                $rs .= "<member><name>" . htmlspecialchars($key2) . "</name>\n";
                $rs .= $this->serializeval($val2);
                $rs .= "</member>\n";
            }
            $rs .= '</struct>';
            break;

        case 2:
            // array
            $rs .= "<array>\n<data>\n";
            foreach ($val as $value) {
                $rs .= $this->serializeval($value);
            }
            $rs .= "</data>\n</array>";
            break;

        case 1:
            switch ($typ) {
            case $GLOBALS['XML_RPC_Base64']:
                $rs .= "<${typ}>" . base64_encode($val) . "</${typ}>";
                break;
            case $GLOBALS['XML_RPC_Boolean']:
                $rs .= "<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
                break;
            case $GLOBALS['XML_RPC_String']:
                $rs .= "<${typ}>" . htmlspecialchars($val). "</${typ}>";
                break;
            default:
                $rs .= "<${typ}>${val}</${typ}>";
            }
        }
        return $rs;
    }

    /**
     * @return string  the data in XML format
     */
    function serialize()
    {
        return $this->serializeval($this);
    }

    /**
     * @return string  the data in XML format
     */
    function serializeval($o)
    {
        if (!is_object($o) || empty($o->me) || !is_array($o->me)) {
            return '';
        }
        $ar = $o->me;
        reset($ar);
        list($typ, $val) = each($ar);
        return '<value>' .  $this->serializedata($typ, $val) .  "</value>\n";
    }

    /**
     * @return mixed  the contents of the element requested
     */
    function structmem($m)
    {
        return $this->me['struct'][$m];
    }

    /**
     * @return void
     */
    function structreset()
    {
        reset($this->me['struct']);
    }

    /**
     * @return  the key/value pair of the struct's current element
     */
    function structeach()
    {
        return each($this->me['struct']);
    }

    /**
     * @return mixed  the current value
     */
    function getval()
    {
        // UNSTABLE

        reset($this->me);
        $b = current($this->me);

        // contributed by I Sofer, 2001-03-24
        // add support for nested arrays to scalarval
        // i've created a new method here, so as to
        // preserve back compatibility

        if (is_array($b)) {
            foreach ($b as $id => $cont) {
                $b[$id] = $cont->scalarval();
            }
        }

        // add support for structures directly encoding php objects
        if (is_object($b)) {
            $t = get_object_vars($b);
            foreach ($t as $id => $cont) {
                $t[$id] = $cont->scalarval();
            }
            foreach ($t as $id => $cont) {
                $b->$id = $cont;
            }
        }

        // end contrib
        return $b;
    }

    /**
     * @return mixed  the current element's scalar value.  If the value is
     *                 not scalar, FALSE is returned.
     */
    function scalarval()
    {
        reset($this->me);
        $v = current($this->me);
        if (!is_scalar($v)) {
            $v = false;
        }
        return $v;
    }

    /**
     * @return string
     */
    function scalartyp()
    {
        reset($this->me);
        $a = key($this->me);
        if ($a == $GLOBALS['XML_RPC_I4']) {
            $a = $GLOBALS['XML_RPC_Int'];
        }
        return $a;
    }

    /**
     * @return mixed  the struct's current element
     */
    function arraymem($m)
    {
        return $this->me['array'][$m];
    }

    /**
     * @return int  the number of elements in the array
     */
    function arraysize()
    {
        reset($this->me);
        list($a, $b) = each($this->me);
        return sizeof($b);
    }

    /**
     * Determines if the item submitted is an XML_RPC_Value object
     *
     * @param mixed $val  the variable to be evaluated
     *
     * @return bool  TRUE if the item is an XML_RPC_Value object
     *
     * @static
     * @since Method available since Release 1.3.0
     */
    function isValue($val)
    {
        return (strtolower(get_class($val)) == 'xml_rpc_value');
    }
}

/**
 * Return an ISO8601 encoded string
 *
 * While timezones ought to be supported, the XML-RPC spec says:
 *
 * "Don't assume a timezone. It should be specified by the server in its
 * documentation what assumptions it makes about timezones."
 *
 * This routine always assumes localtime unless $utc is set to 1, in which
 * case UTC is assumed and an adjustment for locale is made when encoding.
 *
 * @return string  the formatted date
 */
function XML_RPC_iso8601_encode($timet, $utc = 0)
{
    if (!$utc) {
        $t = strftime('%Y%m%dT%H:%M:%S', $timet);
    } else {
        if (function_exists('gmstrftime')) {
            // gmstrftime doesn't exist in some versions
            // of PHP
            $t = gmstrftime('%Y%m%dT%H:%M:%S', $timet);
        } else {
            $t = strftime('%Y%m%dT%H:%M:%S', $timet - date('Z'));
        }
    }
    return $t;
}

/**
 * Convert a datetime string into a Unix timestamp
 *
 * While timezones ought to be supported, the XML-RPC spec says:
 *
 * "Don't assume a timezone. It should be specified by the server in its
 * documentation what assumptions it makes about timezones."
 *
 * This routine always assumes localtime unless $utc is set to 1, in which
 * case UTC is assumed and an adjustment for locale is made when encoding.
 *
 * @return int  the unix timestamp of the date submitted
 */
function XML_RPC_iso8601_decode($idate, $utc = 0)
{
    $t = 0;
    if (preg_match('@([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})@', $idate, $regs)) {
        if ($utc) {
            $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
        } else {
            $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
        }
    }
    return $t;
}

/**
 * Converts an XML_RPC_Value object into native PHP types
 *
 * @param object $XML_RPC_val  the XML_RPC_Value object to decode
 *
 * @return mixed  the PHP values
 */
function XML_RPC_decode($XML_RPC_val)
{
    $kind = $XML_RPC_val->kindOf();

    if ($kind == 'scalar') {
        return $XML_RPC_val->scalarval();

    } elseif ($kind == 'array') {
        $size = $XML_RPC_val->arraysize();
        $arr = array();
        for ($i = 0; $i < $size; $i++) {
            $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i));
        }
        return $arr;

    } elseif ($kind == 'struct') {
        $XML_RPC_val->structreset();
        $arr = array();
        while (list($key, $value) = $XML_RPC_val->structeach()) {
            $arr[$key] = XML_RPC_decode($value);
        }
        return $arr;
    }
}

/**
 * Converts native PHP types into an XML_RPC_Value object
 *
 * @param mixed $php_val  the PHP value or variable you want encoded
 *
 * @return object  the XML_RPC_Value object
 */
function XML_RPC_encode($php_val)
{
    $type = gettype($php_val);
    $XML_RPC_val = new XML_RPC_Value;

    switch ($type) {
    case 'array':
        if (empty($php_val)) {
            $XML_RPC_val->addArray($php_val);
            break;
        }
        $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
        if (empty($tmp)) {
           $arr = array();
           foreach ($php_val as $k => $v) {
               $arr[$k] = XML_RPC_encode($v);
           }
           $XML_RPC_val->addArray($arr);
           break;
        }
        // fall though if it's not an enumerated array

    case 'object':
        $arr = array();
        foreach ($php_val as $k => $v) {
            $arr[$k] = XML_RPC_encode($v);
        }
        $XML_RPC_val->addStruct($arr);
        break;

    case 'integer':
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Int']);
        break;

    case 'double':
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Double']);
        break;

    case 'string':
    case 'NULL':
        if (preg_match('@^[0-9]{8}\T{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}$@', $php_val)) {
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_DateTime']);
        } elseif ($GLOBALS['XML_RPC_auto_base64']
                  && preg_match("@[^ -~\t\r\n]@", $php_val))
        {
            // Characters other than alpha-numeric, punctuation, SP, TAB,
            // LF and CR break the XML parser, encode value via Base 64.
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Base64']);
        } else {
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_String']);
        }
        break;

    case 'boolean':
        // Add support for encoding/decoding of booleans, since they
        // are supported in PHP
        // by <G_Giunta_2001-02-29>
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Boolean']);
        break;

    case 'unknown type':
    default:
        $XML_RPC_val = false;
    }
    return $XML_RPC_val;
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
pear/PEAR.php000064400000106624151732710000006740 0ustar00<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * PEAR class and PEAR_Error class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Sterling Hughes <sterling@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2010 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**#@+
 * ERROR constants
 */
define('PEAR_ERROR_RETURN',     1);
define('PEAR_ERROR_PRINT',      2);
define('PEAR_ERROR_TRIGGER',    4);
define('PEAR_ERROR_DIE',        8);
define('PEAR_ERROR_CALLBACK',  16);
/**
 * WARNING: obsolete
 * @deprecated
 */
define('PEAR_ERROR_EXCEPTION', 32);
/**#@-*/

if (substr(PHP_OS, 0, 3) == 'WIN') {
    define('OS_WINDOWS', true);
    define('OS_UNIX',    false);
    define('PEAR_OS',    'Windows');
} else {
    define('OS_WINDOWS', false);
    define('OS_UNIX',    true);
    define('PEAR_OS',    'Unix'); // blatant assumption
}

$GLOBALS['_PEAR_default_error_mode']     = PEAR_ERROR_RETURN;
$GLOBALS['_PEAR_default_error_options']  = E_USER_NOTICE;
$GLOBALS['_PEAR_destructor_object_list'] = array();
$GLOBALS['_PEAR_shutdown_funcs']         = array();
$GLOBALS['_PEAR_error_handler_stack']    = array();

if(function_exists('ini_set')) {
    @ini_set('track_errors', true);
}

/**
 * Base class for other PEAR classes.  Provides rudimentary
 * emulation of destructors.
 *
 * If you want a destructor in your class, inherit PEAR and make a
 * destructor method called _yourclassname (same name as the
 * constructor, but with a "_" prefix).  Also, in your constructor you
 * have to call the PEAR constructor: $this->PEAR();.
 * The destructor method will be called without parameters.  Note that
 * at in some SAPI implementations (such as Apache), any output during
 * the request shutdown (in which destructors are called) seems to be
 * discarded.  If you need to get any debug information from your
 * destructor, use error_log(), syslog() or something similar.
 *
 * IMPORTANT! To use the emulated destructors you need to create the
 * objects by reference: $obj =& new PEAR_child;
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @see        PEAR_Error
 * @since      Class available since PHP 4.0.2
 * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear
 */
class PEAR
{
    /**
     * Whether to enable internal debug messages.
     *
     * @var     bool
     * @access  private
     */
    var $_debug = false;

    /**
     * Default error mode for this object.
     *
     * @var     int
     * @access  private
     */
    var $_default_error_mode = null;

    /**
     * Default error options used for this object when error mode
     * is PEAR_ERROR_TRIGGER.
     *
     * @var     int
     * @access  private
     */
    var $_default_error_options = null;

    /**
     * Default error handler (callback) for this object, if error mode is
     * PEAR_ERROR_CALLBACK.
     *
     * @var     string
     * @access  private
     */
    var $_default_error_handler = '';

    /**
     * Which class to use for error objects.
     *
     * @var     string
     * @access  private
     */
    var $_error_class = 'PEAR_Error';

    /**
     * An array of expected errors.
     *
     * @var     array
     * @access  private
     */
    var $_expected_errors = array();

    /**
     * List of methods that can be called both statically and non-statically.
     * @var array
     */
    protected static $bivalentMethods = array(
        'setErrorHandling' => true,
        'raiseError' => true,
        'throwError' => true,
        'pushErrorHandling' => true,
        'popErrorHandling' => true,
    );

    /**
     * Constructor.  Registers this object in
     * $_PEAR_destructor_object_list for destructor emulation if a
     * destructor object exists.
     *
     * @param string $error_class  (optional) which class to use for
     *        error objects, defaults to PEAR_Error.
     * @access public
     * @return void
     */
    function __construct($error_class = null)
    {
        $classname = strtolower(get_class($this));
        if ($this->_debug) {
            print "PEAR constructor called, class=$classname\n";
        }

        if ($error_class !== null) {
            $this->_error_class = $error_class;
        }

        while ($classname && strcasecmp($classname, "pear")) {
            $destructor = "_$classname";
            if (method_exists($this, $destructor)) {
                global $_PEAR_destructor_object_list;
                $_PEAR_destructor_object_list[] = $this;
                if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
                    register_shutdown_function("_PEAR_call_destructors");
                    $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
                }
                break;
            } else {
                $classname = get_parent_class($classname);
            }
        }
    }

    /**
     * Only here for backwards compatibility.
     * E.g. Archive_Tar calls $this->PEAR() in its constructor.
     *
     * @param string $error_class Which class to use for error objects,
     *                            defaults to PEAR_Error.
     */
    public function PEAR($error_class = null)
    {
        self::__construct($error_class);
    }

    /**
     * Destructor (the emulated type of...).  Does nothing right now,
     * but is included for forward compatibility, so subclass
     * destructors should always call it.
     *
     * See the note in the class desciption about output from
     * destructors.
     *
     * @access public
     * @return void
     */
    function _PEAR() {
        if ($this->_debug) {
            printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
        }
    }

    public function __call($method, $arguments)
    {
        if (!isset(self::$bivalentMethods[$method])) {
            trigger_error(
                'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
            );
        }
        return call_user_func_array(
            array(__CLASS__, '_' . $method),
            array_merge(array($this), $arguments)
        );
    }

    public static function __callStatic($method, $arguments)
    {
        if (!isset(self::$bivalentMethods[$method])) {
            trigger_error(
                'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
            );
        }
        return call_user_func_array(
            array(__CLASS__, '_' . $method),
            array_merge(array(null), $arguments)
        );
    }

    /**
    * If you have a class that's mostly/entirely static, and you need static
    * properties, you can use this method to simulate them. Eg. in your method(s)
    * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
    * You MUST use a reference, or they will not persist!
    *
    * @param  string $class  The calling classname, to prevent clashes
    * @param  string $var    The variable to retrieve.
    * @return mixed   A reference to the variable. If not set it will be
    *                 auto initialised to NULL.
    */
    public static function &getStaticProperty($class, $var)
    {
        static $properties;
        if (!isset($properties[$class])) {
            $properties[$class] = array();
        }

        if (!array_key_exists($var, $properties[$class])) {
            $properties[$class][$var] = null;
        }

        return $properties[$class][$var];
    }

    /**
    * Use this function to register a shutdown method for static
    * classes.
    *
    * @param  mixed $func  The function name (or array of class/method) to call
    * @param  mixed $args  The arguments to pass to the function
    *
    * @return void
    */
    public static function registerShutdownFunc($func, $args = array())
    {
        // if we are called statically, there is a potential
        // that no shutdown func is registered.  Bug #6445
        if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
            register_shutdown_function("_PEAR_call_destructors");
            $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
        }
        $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
    }

    /**
     * Tell whether a value is a PEAR error.
     *
     * @param   mixed $data   the value to test
     * @param   int   $code   if $data is an error object, return true
     *                        only if $code is a string and
     *                        $obj->getMessage() == $code or
     *                        $code is an integer and $obj->getCode() == $code
     *
     * @return  bool    true if parameter is an error
     */
    public static function isError($data, $code = null)
    {
        if (!is_a($data, 'PEAR_Error')) {
            return false;
        }

        if (is_null($code)) {
            return true;
        } elseif (is_string($code)) {
            return $data->getMessage() == $code;
        }

        return $data->getCode() == $code;
    }

    /**
     * Sets how errors generated by this object should be handled.
     * Can be invoked both in objects and statically.  If called
     * statically, setErrorHandling sets the default behaviour for all
     * PEAR objects.  If called in an object, setErrorHandling sets
     * the default behaviour for that object.
     *
     * @param object $object
     *        Object the method was called on (non-static mode)
     *
     * @param int $mode
     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
     *
     * @param mixed $options
     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
     *
     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
     *        to be the callback function or method.  A callback
     *        function is a string with the name of the function, a
     *        callback method is an array of two elements: the element
     *        at index 0 is the object, and the element at index 1 is
     *        the name of the method to call in the object.
     *
     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
     *        a printf format string used when printing the error
     *        message.
     *
     * @access public
     * @return void
     * @see PEAR_ERROR_RETURN
     * @see PEAR_ERROR_PRINT
     * @see PEAR_ERROR_TRIGGER
     * @see PEAR_ERROR_DIE
     * @see PEAR_ERROR_CALLBACK
     * @see PEAR_ERROR_EXCEPTION
     *
     * @since PHP 4.0.5
     */
    protected static function _setErrorHandling(
        $object, $mode = null, $options = null
    ) {
        if ($object !== null) {
            $setmode     = &$object->_default_error_mode;
            $setoptions  = &$object->_default_error_options;
        } else {
            $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
            $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
        }

        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $setmode = $mode;
                $setoptions = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $setmode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $setoptions = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
    }

    /**
     * This method is used to tell which errors you expect to get.
     * Expected errors are always returned with error mode
     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,
     * and this method pushes a new element onto it.  The list of
     * expected errors are in effect until they are popped off the
     * stack with the popExpect() method.
     *
     * Note that this method can not be called statically
     *
     * @param mixed $code a single error code or an array of error codes to expect
     *
     * @return int     the new depth of the "expected errors" stack
     * @access public
     */
    function expectError($code = '*')
    {
        if (is_array($code)) {
            array_push($this->_expected_errors, $code);
        } else {
            array_push($this->_expected_errors, array($code));
        }
        return count($this->_expected_errors);
    }

    /**
     * This method pops one element off the expected error codes
     * stack.
     *
     * @return array   the list of error codes that were popped
     */
    function popExpect()
    {
        return array_pop($this->_expected_errors);
    }

    /**
     * This method checks unsets an error code if available
     *
     * @param mixed error code
     * @return bool true if the error code was unset, false otherwise
     * @access private
     * @since PHP 4.3.0
     */
    function _checkDelExpect($error_code)
    {
        $deleted = false;
        foreach ($this->_expected_errors as $key => $error_array) {
            if (in_array($error_code, $error_array)) {
                unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
                $deleted = true;
            }

            // clean up empty arrays
            if (0 == count($this->_expected_errors[$key])) {
                unset($this->_expected_errors[$key]);
            }
        }

        return $deleted;
    }

    /**
     * This method deletes all occurrences of the specified element from
     * the expected error codes stack.
     *
     * @param  mixed $error_code error code that should be deleted
     * @return mixed list of error codes that were deleted or error
     * @access public
     * @since PHP 4.3.0
     */
    function delExpect($error_code)
    {
        $deleted = false;
        if ((is_array($error_code) && (0 != count($error_code)))) {
            // $error_code is a non-empty array here; we walk through it trying
            // to unset all values
            foreach ($error_code as $key => $error) {
                $deleted =  $this->_checkDelExpect($error) ? true : false;
            }

            return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
        } elseif (!empty($error_code)) {
            // $error_code comes alone, trying to unset it
            if ($this->_checkDelExpect($error_code)) {
                return true;
            }

            return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
        }

        // $error_code is empty
        return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
    }

    /**
     * This method is a wrapper that returns an instance of the
     * configured error class with this object's default error
     * handling applied.  If the $mode and $options parameters are not
     * specified, the object's defaults are used.
     *
     * @param mixed $message a text error message or a PEAR error object
     *
     * @param int $code      a numeric error code (it is up to your class
     *                  to define these if you want to use codes)
     *
     * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
     *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
     *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
     *
     * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
     *                  specifies the PHP-internal error level (one of
     *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
     *                  If $mode is PEAR_ERROR_CALLBACK, this
     *                  parameter specifies the callback function or
     *                  method.  In other error modes this parameter
     *                  is ignored.
     *
     * @param string $userinfo If you need to pass along for example debug
     *                  information, this parameter is meant for that.
     *
     * @param string $error_class The returned error object will be
     *                  instantiated from this class, if specified.
     *
     * @param bool $skipmsg If true, raiseError will only pass error codes,
     *                  the error message parameter will be dropped.
     *
     * @return object   a PEAR error object
     * @see PEAR::setErrorHandling
     * @since PHP 4.0.5
     */
    protected static function _raiseError($object,
                         $message = null,
                         $code = null,
                         $mode = null,
                         $options = null,
                         $userinfo = null,
                         $error_class = null,
                         $skipmsg = false)
    {
        // The error is yet a PEAR error object
        if (is_object($message)) {
            $code        = $message->getCode();
            $userinfo    = $message->getUserInfo();
            $error_class = $message->getType();
            $message->error_message_prefix = '';
            $message     = $message->getMessage();
        }

        if (
            $object !== null &&
            isset($object->_expected_errors) &&
            count($object->_expected_errors) > 0 &&
            count($exp = end($object->_expected_errors))
        ) {
            if ($exp[0] === "*" ||
                (is_int(reset($exp)) && in_array($code, $exp)) ||
                (is_string(reset($exp)) && in_array($message, $exp))
            ) {
                $mode = PEAR_ERROR_RETURN;
            }
        }

        // No mode given, try global ones
        if ($mode === null) {
            // Class error handler
            if ($object !== null && isset($object->_default_error_mode)) {
                $mode    = $object->_default_error_mode;
                $options = $object->_default_error_options;
            // Global error handler
            } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
                $mode    = $GLOBALS['_PEAR_default_error_mode'];
                $options = $GLOBALS['_PEAR_default_error_options'];
            }
        }

        if ($error_class !== null) {
            $ec = $error_class;
        } elseif ($object !== null && isset($object->_error_class)) {
            $ec = $object->_error_class;
        } else {
            $ec = 'PEAR_Error';
        }

        if ($skipmsg) {
            $a = new $ec($code, $mode, $options, $userinfo);
        } else {
            $a = new $ec($message, $code, $mode, $options, $userinfo);
        }

        return $a;
    }

    /**
     * Simpler form of raiseError with fewer options.  In most cases
     * message, code and userinfo are enough.
     *
     * @param mixed $message a text error message or a PEAR error object
     *
     * @param int $code      a numeric error code (it is up to your class
     *                  to define these if you want to use codes)
     *
     * @param string $userinfo If you need to pass along for example debug
     *                  information, this parameter is meant for that.
     *
     * @return object   a PEAR error object
     * @see PEAR::raiseError
     */
    protected static function _throwError($object, $message = null, $code = null, $userinfo = null)
    {
        if ($object !== null) {
            $a = $object->raiseError($message, $code, null, null, $userinfo);
            return $a;
        }

        $a = PEAR::raiseError($message, $code, null, null, $userinfo);
        return $a;
    }

    public static function staticPushErrorHandling($mode, $options = null)
    {
        $stack       = &$GLOBALS['_PEAR_error_handler_stack'];
        $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
        $def_options = &$GLOBALS['_PEAR_default_error_options'];
        $stack[] = array($def_mode, $def_options);
        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $def_mode = $mode;
                $def_options = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $def_mode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $def_options = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
        $stack[] = array($mode, $options);
        return true;
    }

    public static function staticPopErrorHandling()
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
        $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
        array_pop($stack);
        list($mode, $options) = $stack[sizeof($stack) - 1];
        array_pop($stack);
        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $setmode = $mode;
                $setoptions = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $setmode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $setoptions = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
        return true;
    }

    /**
     * Push a new error handler on top of the error handler options stack. With this
     * you can easily override the actual error handler for some code and restore
     * it later with popErrorHandling.
     *
     * @param mixed $mode (same as setErrorHandling)
     * @param mixed $options (same as setErrorHandling)
     *
     * @return bool Always true
     *
     * @see PEAR::setErrorHandling
     */
    protected static function _pushErrorHandling($object, $mode, $options = null)
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        if ($object !== null) {
            $def_mode    = &$object->_default_error_mode;
            $def_options = &$object->_default_error_options;
        } else {
            $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
            $def_options = &$GLOBALS['_PEAR_default_error_options'];
        }
        $stack[] = array($def_mode, $def_options);

        if ($object !== null) {
            $object->setErrorHandling($mode, $options);
        } else {
            PEAR::setErrorHandling($mode, $options);
        }
        $stack[] = array($mode, $options);
        return true;
    }

    /**
    * Pop the last error handler used
    *
    * @return bool Always true
    *
    * @see PEAR::pushErrorHandling
    */
    protected static function _popErrorHandling($object)
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        array_pop($stack);
        list($mode, $options) = $stack[sizeof($stack) - 1];
        array_pop($stack);
        if ($object !== null) {
            $object->setErrorHandling($mode, $options);
        } else {
            PEAR::setErrorHandling($mode, $options);
        }
        return true;
    }

    /**
    * OS independent PHP extension load. Remember to take care
    * on the correct extension name for case sensitive OSes.
    *
    * @param string $ext The extension name
    * @return bool Success or not on the dl() call
    */
    public static function loadExtension($ext)
    {
        if (extension_loaded($ext)) {
            return true;
        }

        // if either returns true dl() will produce a FATAL error, stop that
        if (
            function_exists('dl') === false ||
            ini_get('enable_dl') != 1
        ) {
            return false;
        }

        if (OS_WINDOWS) {
            $suffix = '.dll';
        } elseif (PHP_OS == 'HP-UX') {
            $suffix = '.sl';
        } elseif (PHP_OS == 'AIX') {
            $suffix = '.a';
        } elseif (PHP_OS == 'OSX') {
            $suffix = '.bundle';
        } else {
            $suffix = '.so';
        }

        return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
    }

    /**
     * Get SOURCE_DATE_EPOCH environment variable
     * See https://reproducible-builds.org/specs/source-date-epoch/
     *
     * @return int
     * @access public
     */
    static function getSourceDateEpoch()
    {
        if ($source_date_epoch = getenv('SOURCE_DATE_EPOCH')) {
            if (preg_match('/^\d+$/', $source_date_epoch)) {
                return (int) $source_date_epoch;
            } else {
            //  "If the value is malformed, the build process SHOULD exit with a non-zero error code."
            self::raiseError("Invalid SOURCE_DATE_EPOCH: $source_date_epoch");
            exit(1);
            }
        } else {
            return time();
        }
    }
}

function _PEAR_call_destructors()
{
    global $_PEAR_destructor_object_list;
    if (is_array($_PEAR_destructor_object_list) &&
        sizeof($_PEAR_destructor_object_list))
    {
        reset($_PEAR_destructor_object_list);

        $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');

        if ($destructLifoExists) {
            $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
        }

        foreach ($_PEAR_destructor_object_list as $k => $objref) {
            $classname = get_class($objref);
            while ($classname) {
                $destructor = "_$classname";
                if (method_exists($objref, $destructor)) {
                    $objref->$destructor();
                    break;
                } else {
                    $classname = get_parent_class($classname);
                }
            }
        }
        // Empty the object list to ensure that destructors are
        // not called more than once.
        $_PEAR_destructor_object_list = array();
    }

    // Now call the shutdown functions
    if (
        isset($GLOBALS['_PEAR_shutdown_funcs']) &&
        is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
        !empty($GLOBALS['_PEAR_shutdown_funcs'])
    ) {
        foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
            call_user_func_array($value[0], $value[1]);
        }
    }
}

/**
 * Standard PEAR error class for PHP 4
 *
 * This class is supserseded by {@link PEAR_Exception} in PHP 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Gregory Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/manual/en/core.pear.pear-error.php
 * @see        PEAR::raiseError(), PEAR::throwError()
 * @since      Class available since PHP 4.0.2
 */
class PEAR_Error
{
    var $error_message_prefix = '';
    var $mode                 = PEAR_ERROR_RETURN;
    var $level                = E_USER_NOTICE;
    var $code                 = -1;
    var $message              = '';
    var $userinfo             = '';
    var $backtrace            = null;
    var $callback             = null;

    /**
     * PEAR_Error constructor
     *
     * @param string $message  message
     *
     * @param int $code     (optional) error code
     *
     * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN,
     * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
     * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
     *
     * @param mixed $options   (optional) error level, _OR_ in the case of
     * PEAR_ERROR_CALLBACK, the callback function or object/method
     * tuple.
     *
     * @param string $userinfo (optional) additional user/debug info
     *
     * @access public
     *
     */
    function __construct($message = 'unknown error', $code = null,
                        $mode = null, $options = null, $userinfo = null)
    {
        if ($mode === null) {
            $mode = PEAR_ERROR_RETURN;
        }
        $this->message   = $message;
        $this->code      = $code;
        $this->mode      = $mode;
        $this->userinfo  = $userinfo;

        $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');

        if (!$skiptrace) {
            $this->backtrace = debug_backtrace();
            if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
                unset($this->backtrace[0]['object']);
            }
        }

        if ($mode & PEAR_ERROR_CALLBACK) {
            $this->level = E_USER_NOTICE;
            $this->callback = $options;
        } else {
            if ($options === null) {
                $options = E_USER_NOTICE;
            }

            $this->level = $options;
            $this->callback = null;
        }

        if ($this->mode & PEAR_ERROR_PRINT) {
            if (is_null($options) || is_int($options)) {
                $format = "%s";
            } else {
                $format = $options;
            }

            printf($format, $this->getMessage());
        }

        if ($this->mode & PEAR_ERROR_TRIGGER) {
            trigger_error($this->getMessage(), $this->level);
        }

        if ($this->mode & PEAR_ERROR_DIE) {
            $msg = $this->getMessage();
            if (is_null($options) || is_int($options)) {
                $format = "%s";
                if (substr($msg, -1) != "\n") {
                    $msg .= "\n";
                }
            } else {
                $format = $options;
            }
            printf($format, $msg);
            exit($code);
        }

        if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
            call_user_func($this->callback, $this);
        }

        if ($this->mode & PEAR_ERROR_EXCEPTION) {
            trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
            eval('$e = new Exception($this->message, $this->code);throw($e);');
        }
    }

    /**
     * Only here for backwards compatibility.
     *
     * Class "Cache_Error" still uses it, among others.
     *
     * @param string $message  Message
     * @param int    $code     Error code
     * @param int    $mode     Error mode
     * @param mixed  $options  See __construct()
     * @param string $userinfo Additional user/debug info
     */
    public function PEAR_Error(
        $message = 'unknown error', $code = null, $mode = null,
        $options = null, $userinfo = null
    ) {
        self::__construct($message, $code, $mode, $options, $userinfo);
    }

    /**
     * Get the error mode from an error object.
     *
     * @return int error mode
     * @access public
     */
    function getMode()
    {
        return $this->mode;
    }

    /**
     * Get the callback function/method from an error object.
     *
     * @return mixed callback function or object/method array
     * @access public
     */
    function getCallback()
    {
        return $this->callback;
    }

    /**
     * Get the error message from an error object.
     *
     * @return  string  full error message
     * @access public
     */
    function getMessage()
    {
        return ($this->error_message_prefix . $this->message);
    }

    /**
     * Get error code from an error object
     *
     * @return int error code
     * @access public
     */
     function getCode()
     {
        return $this->code;
     }

    /**
     * Get the name of this error/exception.
     *
     * @return string error/exception name (type)
     * @access public
     */
    function getType()
    {
        return get_class($this);
    }

    /**
     * Get additional user-supplied information.
     *
     * @return string user-supplied information
     * @access public
     */
    function getUserInfo()
    {
        return $this->userinfo;
    }

    /**
     * Get additional debug information supplied by the application.
     *
     * @return string debug information
     * @access public
     */
    function getDebugInfo()
    {
        return $this->getUserInfo();
    }

    /**
     * Get the call backtrace from where the error was generated.
     * Supported with PHP 4.3.0 or newer.
     *
     * @param int $frame (optional) what frame to fetch
     * @return array Backtrace, or NULL if not available.
     * @access public
     */
    function getBacktrace($frame = null)
    {
        if (defined('PEAR_IGNORE_BACKTRACE')) {
            return null;
        }
        if ($frame === null) {
            return $this->backtrace;
        }
        return $this->backtrace[$frame];
    }

    function addUserInfo($info)
    {
        if (empty($this->userinfo)) {
            $this->userinfo = $info;
        } else {
            $this->userinfo .= " ** $info";
        }
    }

    function __toString()
    {
        return $this->getMessage();
    }

    /**
     * Make a string representation of this object.
     *
     * @return string a string with an object summary
     * @access public
     */
    function toString()
    {
        $modes = array();
        $levels = array(E_USER_NOTICE  => 'notice',
                        E_USER_WARNING => 'warning',
                        E_USER_ERROR   => 'error');
        if ($this->mode & PEAR_ERROR_CALLBACK) {
            if (is_array($this->callback)) {
                $callback = (is_object($this->callback[0]) ?
                    strtolower(get_class($this->callback[0])) :
                    $this->callback[0]) . '::' .
                    $this->callback[1];
            } else {
                $callback = $this->callback;
            }
            return sprintf('[%s: message="%s" code=%d mode=callback '.
                           'callback=%s prefix="%s" info="%s"]',
                           strtolower(get_class($this)), $this->message, $this->code,
                           $callback, $this->error_message_prefix,
                           $this->userinfo);
        }
        if ($this->mode & PEAR_ERROR_PRINT) {
            $modes[] = 'print';
        }
        if ($this->mode & PEAR_ERROR_TRIGGER) {
            $modes[] = 'trigger';
        }
        if ($this->mode & PEAR_ERROR_DIE) {
            $modes[] = 'die';
        }
        if ($this->mode & PEAR_ERROR_RETURN) {
            $modes[] = 'return';
        }
        return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
                       'prefix="%s" info="%s"]',
                       strtolower(get_class($this)), $this->message, $this->code,
                       implode("|", $modes), $levels[$this->level],
                       $this->error_message_prefix,
                       $this->userinfo);
    }
}

/*
 * Local Variables:
 * mode: php
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */
pear/Net/Sieve.php000064400000133532151732710000010010 0ustar00<?php
/**
 * This file contains the Net_Sieve class.
 *
 * PHP version 5
 *
 * +-----------------------------------------------------------------------+
 * | All rights reserved.                                                  |
 * |                                                                       |
 * | Redistribution and use in source and binary forms, with or without    |
 * | modification, are permitted provided that the following conditions    |
 * | are met:                                                              |
 * |                                                                       |
 * | o Redistributions of source code must retain the above copyright      |
 * |   notice, this list of conditions and the following disclaimer.       |
 * | o Redistributions in binary form must reproduce the above copyright   |
 * |   notice, this list of conditions and the following disclaimer in the |
 * |   documentation and/or other materials provided with the distribution.|
 * |                                                                       |
 * | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
 * | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
 * | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
 * | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
 * | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
 * | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
 * | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
 * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
 * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
 * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
 * | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
 * +-----------------------------------------------------------------------+
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Richard Heyes <richard@phpguru.org>
 * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @author    Jan Schneider <jan@horde.org>
 * @copyright 2002-2003 Richard Heyes
 * @copyright 2006-2008 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @link      http://pear.php.net/package/Net_Sieve
 */

require_once 'PEAR.php';
require_once 'Net/Socket.php';

/**
 * Disconnected state
 *
 * @const NET_SIEVE_STATE_DISCONNECTED
 */
define('NET_SIEVE_STATE_DISCONNECTED', 1);

/**
 * Authorisation state
 *
 * @const NET_SIEVE_STATE_AUTHORISATION
 */
define('NET_SIEVE_STATE_AUTHORISATION', 2);

/**
 * Transaction state
 *
 * @const NET_SIEVE_STATE_TRANSACTION
 */
define('NET_SIEVE_STATE_TRANSACTION', 3);


/**
 * A class for talking to the timsieved server which comes with Cyrus IMAP.
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Richard Heyes <richard@phpguru.org>
 * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @author    Jan Schneider <jan@horde.org>
 * @author    Neil Munday <neil@mundayweb.com>
 * @copyright 2002-2003 Richard Heyes
 * @copyright 2006-2008 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @version   Release: 1.4.5
 * @link      http://pear.php.net/package/Net_Sieve
 * @link      http://tools.ietf.org/html/rfc5228 RFC 5228 (Sieve: An Email
 *            Filtering Language)
 * @link      http://tools.ietf.org/html/rfc5804 RFC 5804 A Protocol for
 *            Remotely Managing Sieve Scripts
 */
class Net_Sieve
{
    /**
     * The authentication methods this class supports.
     *
     * Can be overwritten if having problems with certain methods.
     *
     * @var array
     */
    var $supportedAuthMethods = array(
        'DIGEST-MD5',
        'CRAM-MD5',
        'EXTERNAL',
        'PLAIN' ,
        'LOGIN',
        'GSSAPI',
        'XOAUTH2'
    );

    /**
     * SASL authentication methods that require Auth_SASL.
     *
     * @var array
     */
    var $supportedSASLAuthMethods = array('DIGEST-MD5', 'CRAM-MD5');

    /**
     * The socket handle.
     *
     * @var resource
     */
    var $_sock;

    /**
     * Parameters and connection information.
     *
     * @var array
     */
    var $_data;

    /**
     * Current state of the connection.
     *
     * One of the NET_SIEVE_STATE_* constants.
     *
     * @var integer
     */
    var $_state;

    /**
     * PEAR object to avoid strict warnings.
     *
     * @var PEAR_Error
     */
    var $_pear;

    /**
     * Constructor error.
     *
     * @var PEAR_Error
     */
    var $_error;

    /**
     * Whether to enable debugging.
     *
     * @var boolean
     */
    var $_debug = false;

    /**
     * Debug output handler.
     *
     * This has to be a valid callback.
     *
     * @var string|array
     */
    var $_debug_handler = null;

    /**
     * Whether to pick up an already established connection.
     *
     * @var boolean
     */
    var $_bypassAuth = false;

    /**
     * Whether to use TLS if available.
     *
     * @var boolean
     */
    var $_useTLS = true;

    /**
     * Additional options for stream_context_create().
     *
     * @var array
     */
    var $_options = null;

    /**
     * Maximum number of referral loops
     *
     * @var array
     */
    var $_maxReferralCount = 15;

    /**
     * Kerberos service principal to use for GSSAPI authentication.
     *
     * @var string
     */
    var $_gssapiPrincipal = null;

    /**
     * Kerberos service cname to use for GSSAPI authentication.
     *
     * @var string
     */
    var $_gssapiCN = null;

    /**
     * Constructor.
     *
     * Sets up the object, connects to the server and logs in. Stores any
     * generated error in $this->_error, which can be retrieved using the
     * getError() method.
     *
     * @param string  $user       Login username.
     * @param string  $pass       Login password.
     * @param string  $host       Hostname of server.
     * @param string  $port       Port of server.
     * @param string  $logintype  Type of login to perform (see
     *                            $supportedAuthMethods).
     * @param string  $euser      Effective user. If authenticating as an
     *                            administrator, login as this user.
     * @param boolean $debug      Whether to enable debugging (@see setDebug()).
     * @param string  $bypassAuth Skip the authentication phase. Useful if the
     *                            socket is already open.
     * @param boolean $useTLS     Use TLS if available.
     * @param array   $options    Additional options for
     *                            stream_context_create().
     * @param mixed   $handler    A callback handler for the debug output.
     * @param string  $principal  Kerberos service principal to use
     *                            with GSSAPI authentication.
     * @param string  $cname      Kerberos service cname to use
     *                            with GSSAPI authentication.
     */
    function __construct($user = null, $pass  = null, $host = 'localhost',
        $port = 2000, $logintype = '', $euser = '',
        $debug = false, $bypassAuth = false, $useTLS = true,
        $options = null, $handler = null, $principal = null, $cname = null
    ) {
        $this->_pear = new PEAR();
        $this->_state             = NET_SIEVE_STATE_DISCONNECTED;
        $this->_data['user']      = $user;
        $this->_data['pass']      = $pass;
        $this->_data['host']      = $host;
        $this->_data['port']      = $port;
        $this->_data['logintype'] = $logintype;
        $this->_data['euser']     = $euser;
        $this->_sock              = new Net_Socket();
        $this->_bypassAuth        = $bypassAuth;
        $this->_useTLS            = $useTLS;
        $this->_options           = (array) $options;
        $this->_gssapiPrincipal   = $principal;
        $this->_gssapiCN          = $cname;

        $this->setDebug($debug, $handler);

        /* Try to include the Auth_SASL package.  If the package is not
         * available, we disable the authentication methods that depend upon
         * it. */
        if ((@include_once 'Auth/SASL.php') === false) {
            $this->_debug('Auth_SASL not present');
            $this->supportedAuthMethods = array_diff(
                $this->supportedAuthMethods,
                $this->supportedSASLAuthMethods
            );
        }

        if (strlen($user) && strlen($pass)) {
            $this->_error = $this->_handleConnectAndLogin();
        }
    }

    /**
     * Returns any error that may have been generated in the constructor.
     *
     * @return boolean|PEAR_Error  False if no error, PEAR_Error otherwise.
     */
    function getError()
    {
        return is_a($this->_error, 'PEAR_Error') ? $this->_error : false;
    }

    /**
     * Sets the debug state and handler function.
     *
     * @param boolean $debug   Whether to enable debugging.
     * @param string  $handler A custom debug handler. Must be a valid callback.
     *
     * @return void
     */
    function setDebug($debug = true, $handler = null)
    {
        $this->_debug = $debug;
        $this->_debug_handler = $handler;
    }

    /**
     * Sets the Kerberos service principal for use with GSSAPI
     * authentication.
     *
     * @param string $principal The Kerberos service principal
     *
     * @return void
     */
    function setServicePrincipal($principal)
    {
        $this->_gssapiPrincipal = $principal;
    }

    /**
     * Sets the Kerberos service CName for use with GSSAPI
     * authentication.
     *
     * @param string $cname The Kerberos service principal
     *
     * @return void
     */
    function setServiceCN($cname)
    {
        $this->_gssapiCN = $cname;
    }

    /**
     * Connects to the server and logs in.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function _handleConnectAndLogin()
    {
        $res = $this->connect($this->_data['host'], $this->_data['port'], $this->_options, $this->_useTLS);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_bypassAuth === false) {
            $res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'], $this->_data['euser'], $this->_bypassAuth);
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Handles connecting to the server and checks the response validity.
     *
     * @param string  $host    Hostname of server.
     * @param string  $port    Port of server.
     * @param array   $options List of options to pass to
     *                         stream_context_create().
     * @param boolean $useTLS  Use TLS if available.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function connect($host, $port, $options = null, $useTLS = true)
    {
        $this->_data['host'] = $host;
        $this->_data['port'] = $port;
        $this->_useTLS       = $useTLS;

        if (is_array($options)) {
            $this->_options = array_merge($this->_options, $options);
        }

        if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) {
            return $this->_pear->raiseError('Not currently in DISCONNECTED state', 1);
        }

        $res = $this->_sock->connect($host, $port, false, 5, $options);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_bypassAuth) {
            $this->_state = NET_SIEVE_STATE_TRANSACTION;

            // Reset capabilities
            $this->_parseCapability('');
        } else {
            $this->_state = NET_SIEVE_STATE_AUTHORISATION;

            $res = $this->_doCmd();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }

            // Reset capabilities (use unattended capabilities)
            $this->_parseCapability($res);
        }

        // Explicitly ask for the capabilities if needed
        if (empty($this->_capability['implementation'])) {
            $res = $this->_cmdCapability();
            if (is_a($res, 'PEAR_Error')) {
                return $this->_pear->raiseError(
                    'Failed to connect, server said: ' . $res->getMessage(), 2
                );
            }
        }

        // Check if we can enable TLS via STARTTLS.
        if ($useTLS && !empty($this->_capability['starttls'])
            && function_exists('stream_socket_enable_crypto')
        ) {
            $res = $this->_startTLS();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Disconnect from the Sieve server.
     *
     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
     *                               disconnecting.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function disconnect($sendLogoutCMD = true)
    {
        return $this->_cmdLogout($sendLogoutCMD);
    }

    /**
     * Logs into server.
     *
     * @param string  $user       Login username.
     * @param string  $pass       Login password.
     * @param string  $logintype  Type of login method to use.
     * @param string  $euser      Effective UID (perform on behalf of $euser).
     * @param boolean $bypassAuth Do not perform authentication.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function login($user, $pass, $logintype = null, $euser = '', $bypassAuth = false)
    {
        $this->_data['user']      = $user;
        $this->_data['pass']      = $pass;
        $this->_data['logintype'] = $logintype;
        $this->_data['euser']     = $euser;
        $this->_bypassAuth        = $bypassAuth;

        if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        if (!$bypassAuth ) {
            $res = $this->_cmdAuthenticate($user, $pass, $logintype, $euser);
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        $this->_state = NET_SIEVE_STATE_TRANSACTION;

        return true;
    }

    /**
     * Returns an indexed array of scripts currently on the server.
     *
     * @param string $active Will be set to the name of the active script
     *
     * @return array  Indexed array of scriptnames, PEAR_Error on failure
     */
    function listScripts(&$active = null)
    {
        if (is_array($scripts = $this->_cmdListScripts())) {
            if (isset($scripts[1])) {
                $active = $scripts[1];
            }

            return $scripts[0];
        }

        return $scripts;
    }

    /**
     * Returns the active script.
     *
     * @return string  The active scriptname.
     */
    function getActive()
    {
        if (is_array($scripts = $this->_cmdListScripts())) {
            return $scripts[1];
        }
    }

    /**
     * Sets the active script.
     *
     * @param string $scriptname The name of the script to be set as active.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function setActive($scriptname)
    {
        return $this->_cmdSetActive($scriptname);
    }

    /**
     * Retrieves a script.
     *
     * @param string $scriptname The name of the script to be retrieved.
     *
     * @return string  The script on success, PEAR_Error on failure.
     */
    function getScript($scriptname)
    {
        return $this->_cmdGetScript($scriptname);
    }

    /**
     * Adds a script to the server.
     *
     * @param string  $scriptname Name of the script.
     * @param string  $script     The script content.
     * @param boolean $makeactive Whether to make this the active script.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function installScript($scriptname, $script, $makeactive = false)
    {
        $res = $this->_cmdPutScript($scriptname, $script);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($makeactive) {
            return $this->_cmdSetActive($scriptname);
        }

        return true;
    }

    /**
     * Removes a script from the server.
     *
     * @param string $scriptname Name of the script.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function removeScript($scriptname)
    {
        return $this->_cmdDeleteScript($scriptname);
    }

    /**
     * Checks if the server has space to store the script by the server.
     *
     * @param string  $scriptname The name of the script to mark as active.
     * @param integer $size       The size of the script.
     *
     * @return boolean|PEAR_Error  True if there is space, PEAR_Error otherwise.
     *
     * @todo Rename to hasSpace()
     */
    function haveSpace($scriptname, $size)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in TRANSACTION state', 1);
        }

        $res = $this->_doCmd(sprintf('HAVESPACE %s %d', $this->_escape($scriptname), $size));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Returns the list of extensions the server supports.
     *
     * @return array  List of extensions or PEAR_Error on failure.
     */
    function getExtensions()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        return $this->_capability['extensions'];
    }

    /**
     * Returns whether the server supports an extension.
     *
     * @param string $extension The extension to check.
     *
     * @return boolean  Whether the extension is supported or PEAR_Error on
     *                  failure.
     */
    function hasExtension($extension)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        $extension = trim($this->_toUpper($extension));
        if (is_array($this->_capability['extensions'])) {
            foreach ($this->_capability['extensions'] as $ext) {
                if ($ext == $extension) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Returns the list of authentication methods the server supports.
     *
     * @return array  List of authentication methods or PEAR_Error on failure.
     */
    function getAuthMechs()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        return $this->_capability['sasl'];
    }

    /**
     * Returns whether the server supports an authentication method.
     *
     * @param string $method The method to check.
     *
     * @return boolean  Whether the method is supported or PEAR_Error on
     *                  failure.
     */
    function hasAuthMech($method)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        $method = trim($this->_toUpper($method));

        if (is_array($this->_capability['sasl'])) {
            foreach ($this->_capability['sasl'] as $sasl) {
                if ($sasl == $method) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Handles the authentication using any known method.
     *
     * @param string $uid        The userid to authenticate as.
     * @param string $pwd        The password to authenticate with.
     * @param string $userMethod The method to use. If empty, the class chooses
     *                           the best (strongest) available method.
     * @param string $euser      The effective uid to authenticate as.
     *
     * @return void
     */
    function _cmdAuthenticate($uid, $pwd, $userMethod = null, $euser = '')
    {
        $method = $this->_getBestAuthMethod($userMethod);
        if (is_a($method, 'PEAR_Error')) {
            return $method;
        }

        switch ($method) {
        case 'DIGEST-MD5':
            return $this->_authDigestMD5($uid, $pwd, $euser);
        case 'CRAM-MD5':
            $result = $this->_authCRAMMD5($uid, $pwd, $euser);
            break;
        case 'LOGIN':
            $result = $this->_authLOGIN($uid, $pwd, $euser);
            break;
        case 'PLAIN':
            $result = $this->_authPLAIN($uid, $pwd, $euser);
            break;
        case 'EXTERNAL':
            $result = $this->_authEXTERNAL($uid, $pwd, $euser);
            break;
        case 'GSSAPI':
            $result = $this->_authGSSAPI($pwd);
            break;
        case 'XOAUTH2':
            $result = $this->_authXOAUTH2($uid, $pwd, $euser);
            break;
        default :
            $result = $this->_pear->raiseError(
                $method . ' is not a supported authentication method'
            );
            break;
        }

        $res = $this->_doCmd();
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_pear->isError($res = $this->_cmdCapability())) {
            return $this->_pear->raiseError(
                'Failed to connect, server said: ' . $res->getMessage(), 2
            );
        }

        return $result;
    }

    /**
     * Authenticates the user using the PLAIN method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authPLAIN($user, $pass, $euser)
    {
        return $this->_sendCmd(
            sprintf(
                'AUTHENTICATE "PLAIN" "%s"',
                base64_encode($euser . chr(0) . $user . chr(0) . $pass)
            )
        );
    }

    /**
     * Authenticates the user using the GSSAPI method.
     *
     * @note the PHP krb5 extension is required and the service principal and cname
     *       must have been set.
     * @see  setServicePrincipal()
     *
     * @return void
     */
    function _authGSSAPI()
    {
        if (!extension_loaded('krb5')) {
            return $this->_pear->raiseError('The krb5 extension is required for GSSAPI authentication', 2);
        }

        if (!$this->_gssapiPrincipal) {
            return $this->_pear->raiseError('No Kerberos service principal set', 2);
        }

        if (!$this->_gssapiCN) {
            return $this->_pear->raiseError('No Kerberos service CName set', 2);
        }

        putenv('KRB5CCNAME=' . $this->_gssapiCN);

        try {
            $ccache = new KRB5CCache();
            $ccache->open($this->_gssapiCN);

            $gssapicontext = new GSSAPIContext();
            $gssapicontext->acquireCredentials($ccache);

            $token   = '';
            $success = $gssapicontext->initSecContext($this->_gssapiPrincipal, null, null, null, $token);
            $token   = base64_encode($token);
        }
        catch (Exception $e) {
            return $this->_pear->raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        $this->_sendCmd("AUTHENTICATE \"GSSAPI\" {" . strlen($token) . "+}");

        $response = $this->_doCmd($token, true);

        try {
            $challenge = base64_decode(substr($response, 1, -1));
            $gssapicontext->unwrap($challenge, $challenge);
            $gssapicontext->wrap($challenge, $challenge, true);
        }
        catch (Exception $e) {
            return $this->_pear->raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        $response = base64_encode($challenge);

        $this->_sendCmd("{" . strlen($response) . "+}");

        return $this->_sendCmd($response);
    }

    /**
     * Authenticates the user using the LOGIN method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as. Not used.
     *
     * @return void
     */
    function _authLOGIN($user, $pass, $euser)
    {
        $result = $this->_sendCmd('AUTHENTICATE "LOGIN"');
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $result = $this->_doCmd('"' . base64_encode($user) . '"', true);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        return $this->_doCmd('"' . base64_encode($pass) . '"', true);
    }

    /**
     * Authenticates the user using the CRAM-MD5 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as. Not used.
     *
     * @return void
     */
    function _authCRAMMD5($user, $pass, $euser)
    {
        $challenge = $this->_doCmd('AUTHENTICATE "CRAM-MD5"', true);
        if (is_a($challenge, 'PEAR_Error')) {
            return $challenge;
        }

        $auth_sasl = new Auth_SASL;
        $cram      = $auth_sasl->factory('crammd5');
        $challenge = base64_decode(trim($challenge));
        $response  = $cram->getResponse($user, $pass, $challenge);

        if (is_a($response, 'PEAR_Error')) {
            return $response;
        }

        return $this->_sendStringResponse(base64_encode($response));
    }

    /**
     * Authenticates the user using the DIGEST-MD5 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authDigestMD5($user, $pass, $euser)
    {
        $challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"', true);
        if (is_a($challenge, 'PEAR_Error')) {
            return $challenge;
        }

        $auth_sasl = new Auth_SASL;
        $digest    = $auth_sasl->factory('digestmd5');
        $challenge = base64_decode(trim($challenge));

        // @todo Really 'localhost'?
        $response = $digest->getResponse($user, $pass, $challenge, 'localhost', 'sieve', $euser);
        if (is_a($response, 'PEAR_Error')) {
            return $response;
        }

        $result = $this->_sendStringResponse(base64_encode($response));
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $result = $this->_doCmd('', true);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        if ($this->_toUpper(substr($result, 0, 2)) == 'OK') {
            return;
        }

        /* We don't use the protocol's third step because SIEVE doesn't allow
         * subsequent authentication, so we just silently ignore it. */
        $result = $this->_sendStringResponse('');
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        return $this->_doCmd();
    }

    /**
     * Authenticates the user using the EXTERNAL method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     *
     * @since 1.1.7
     */
    function _authEXTERNAL($user, $pass, $euser)
    {
        $cmd = sprintf(
            'AUTHENTICATE "EXTERNAL" "%s"',
            base64_encode(strlen($euser) ? $euser : $user)
        );

        return $this->_sendCmd($cmd);
    }

    /**
     * Authenticates the user using the XOAUTH2 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $token The token to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authXOAUTH2($user, $token, $euser)
    {
        // default to $user if $euser is not set
        if (! $euser) {
            $euser = $user;
        }

        $auth = base64_encode("user=$euser\001auth=$token\001\001");
        return $this->_sendCmd("AUTHENTICATE \"XOAUTH2\" \"$auth\"");
    }

    /**
     * Removes a script from the server.
     *
     * @param string $scriptname Name of the script to delete.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdDeleteScript($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('DELETESCRIPT %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Retrieves the contents of the named script.
     *
     * @param string $scriptname Name of the script to retrieve.
     *
     * @return string  The script if successful, PEAR_Error otherwise.
     */
    function _cmdGetScript($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('GETSCRIPT %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return preg_replace('/^{[0-9]+}\r\n/', '', $res);
    }

    /**
     * Sets the active script, i.e. the one that gets run on new mail by the
     * server.
     *
     * @param string $scriptname The name of the script to mark as active.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdSetActive($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('SETACTIVE %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Returns the list of scripts on the server.
     *
     * @return array  An array with the list of scripts in the first element
     *                and the active script in the second element on success,
     *                PEAR_Error otherwise.
     */
    function _cmdListScripts()
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd('LISTSCRIPTS');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        $scripts = array();
        $activescript = null;
        $res = explode("\r\n", $res);
        foreach ($res as $value) {
            if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) {
                $script_name = stripslashes($matches[1]);
                $scripts[] = $script_name;
                if (!empty($matches[2])) {
                    $activescript = $script_name;
                }
            }
        }

        return array($scripts, $activescript);
    }

    /**
     * Adds a script to the server.
     *
     * @param string $scriptname Name of the new script.
     * @param string $scriptdata The new script.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdPutScript($scriptname, $scriptdata)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $stringLength = $this->_getLineLength($scriptdata);
        $command      = sprintf(
            "PUTSCRIPT %s {%d+}\r\n%s",
            $this->_escape($scriptname),
            $stringLength,
            $scriptdata
        );

        $res = $this->_doCmd($command);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Logs out of the server and terminates the connection.
     *
     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
     *                               disconnecting.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdLogout($sendLogoutCMD = true)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 1);
        }

        if ($sendLogoutCMD) {
            $res = $this->_doCmd('LOGOUT');
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        $this->_sock->disconnect();
        $this->_state = NET_SIEVE_STATE_DISCONNECTED;

        return true;
    }

    /**
     * Sends the CAPABILITY command
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdCapability()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 1);
        }
        $res = $this->_doCmd('CAPABILITY');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }
        $this->_parseCapability($res);
        return true;
    }

    /**
     * Parses the response from the CAPABILITY command and stores the result
     * in $_capability.
     *
     * @param string $data The response from the capability command.
     *
     * @return void
     */
    function _parseCapability($data)
    {
        // Clear the cached capabilities.
        $this->_capability = array('sasl' => array(),
                                   'extensions' => array());

        $data = preg_split('/\r?\n/', $this->_toUpper($data), -1, PREG_SPLIT_NO_EMPTY);

        for ($i = 0; $i < count($data); $i++) {
            if (!preg_match('/^"([A-Z]+)"( "(.*)")?$/', $data[$i], $matches)) {
                continue;
            }
            switch ($matches[1]) {
            case 'IMPLEMENTATION':
                $this->_capability['implementation'] = $matches[3];
                break;

            case 'SASL':
                if (!empty($matches[3])) {
                    $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]);
                }
                break;

            case 'SIEVE':
                if (!empty($matches[3])) {
                    $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]);
                }
                break;

            case 'STARTTLS':
                $this->_capability['starttls'] = true;
                break;
            }
        }
    }

    /**
     * Sends a command to the server
     *
     * @param string $cmd The command to send.
     *
     * @return void
     */
    function _sendCmd($cmd)
    {
        $status = $this->_sock->getStatus();
        if (is_a($status, 'PEAR_Error') || $status['eof']) {
            return $this->_pear->raiseError('Failed to write to socket: connection lost');
        }
        $error = $this->_sock->write($cmd . "\r\n");
        if (is_a($error, 'PEAR_Error')) {
            return $this->_pear->raiseError(
                'Failed to write to socket: ' . $error->getMessage()
            );
        }
        $this->_debug("C: $cmd");
    }

    /**
     * Sends a string response to the server.
     *
     * @param string $str The string to send.
     *
     * @return void
     */
    function _sendStringResponse($str)
    {
        return $this->_sendCmd('{' . $this->_getLineLength($str) . "+}\r\n" . $str);
    }

    /**
     * Receives a single line from the server.
     *
     * @return string  The server response line.
     */
    function _recvLn()
    {
        $lastline = $this->_sock->gets(8192);
        if (is_a($lastline, 'PEAR_Error')) {
            return $this->_pear->raiseError(
                'Failed to read from socket: ' . $lastline->getMessage()
            );
        }

        $lastline = rtrim($lastline);
        $this->_debug("S: $lastline");

        if ($lastline === '') {
            return $this->_pear->raiseError('Failed to read from socket');
        }

        return $lastline;
    }

    /**
     * Receives a number of bytes from the server.
     *
     * @param integer $length Number of bytes to read.
     *
     * @return string The server response.
     */
    function _recvBytes($length)
    {
        $response = '';
        $response_length = 0;
        while ($response_length < $length) {
            $response .= $this->_sock->read($length - $response_length);
            $response_length = $this->_getLineLength($response);
        }
        $this->_debug('S: ' . rtrim($response));
        return $response;
    }

    /**
     * Send a command and retrieves a response from the server.
     *
     * @param string  $cmd  The command to send.
     * @param boolean $auth Whether this is an authentication command.
     *
     * @return string|PEAR_Error Reponse string if an OK response, PEAR_Error
     *                           if a NO response.
     */
    function _doCmd($cmd = '', $auth = false)
    {
        $referralCount = 0;
        while ($referralCount < $this->_maxReferralCount) {
            if (strlen($cmd)) {
                $error = $this->_sendCmd($cmd);
                if (is_a($error, 'PEAR_Error')) {
                    return $error;
                }
            }

            $response = '';
            while (true) {
                $line = $this->_recvLn();
                if (is_a($line, 'PEAR_Error')) {
                    return $line;
                }

                if (preg_match('/^(OK|NO)/i', $line, $tag)) {
                    // Check for string literal message.
                    if (preg_match('/{([0-9]+)}$/', $line, $matches)) {
                        $line = substr($line, 0, -(strlen($matches[1]) + 2))
                            . str_replace(
                                "\r\n", ' ', $this->_recvBytes($matches[1] + 2)
                            );
                    }

                    if ('OK' == $this->_toUpper($tag[1])) {
                        $response .= $line;
                        return rtrim($response);
                    }

                    return $this->_pear->raiseError(trim($response . substr($line, 2)), 3);
                }

                if (preg_match('/^BYE/i', $line)) {
                    $error = $this->disconnect(false);
                    if (is_a($error, 'PEAR_Error')) {
                        return $this->_pear->raiseError(
                            'Cannot handle BYE, the error was: '
                            . $error->getMessage(),
                            4
                        );
                    }
                    // Check for referral, then follow it.  Otherwise, carp an
                    // error.
                    if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) {
                        // Replace the old host with the referral host
                        // preserving any protocol prefix.
                        $this->_data['host'] = preg_replace(
                            '/\w+(?!(\w|\:\/\/)).*/', $matches[2],
                            $this->_data['host']
                        );
                        $error = $this->_handleConnectAndLogin();
                        if (is_a($error, 'PEAR_Error')) {
                            return $this->_pear->raiseError(
                                'Cannot follow referral to '
                                . $this->_data['host'] . ', the error was: '
                                . $error->getMessage(),
                                5
                            );
                        }
                        break;
                    }
                    return $this->_pear->raiseError(trim($response . $line), 6);
                }

                if (preg_match('/^{([0-9]+)}/', $line, $matches)) {
                    // Matches literal string responses.
                    $line = $this->_recvBytes($matches[1] + 2);
                    if (!$auth) {
                        // Receive the pending OK only if we aren't
                        // authenticating since string responses during
                        // authentication don't need an OK.
                        $this->_recvLn();
                    }
                    return $line;
                }

                if ($auth) {
                    // String responses during authentication don't need an
                    // OK.
                    $response .= $line;
                    return rtrim($response);
                }

                $response .= $line . "\r\n";
                $referralCount++;
            }
        }

        return $this->_pear->raiseError('Max referral count (' . $referralCount . ') reached. Cyrus murder loop error?', 7);
    }

    /**
     * Returns the name of the best authentication method that the server
     * has advertised.
     *
     * @param string $userMethod Only consider this method as available.
     *
     * @return string  The name of the best supported authentication method or
     *                 a PEAR_Error object on failure.
     */
    function _getBestAuthMethod($userMethod = null)
    {
        if (!isset($this->_capability['sasl'])) {
            return $this->_pear->raiseError('This server doesn\'t support any authentication methods. SASL problem?');
        }
        if (!$this->_capability['sasl']) {
            return $this->_pear->raiseError('This server doesn\'t support any authentication methods.');
        }

        if ($userMethod) {
            if (in_array($userMethod, $this->_capability['sasl'])) {
                return $userMethod;
            }

            $msg = 'No supported authentication method found. The server supports these methods: %s, but we want to use: %s';
            return $this->_pear->raiseError(
                sprintf($msg, implode(', ', $this->_capability['sasl']), $userMethod)
            );
        }

        foreach ($this->supportedAuthMethods as $method) {
            if (in_array($method, $this->_capability['sasl'])) {
                return $method;
            }
        }

        $msg = 'No supported authentication method found. The server supports these methods: %s, but we only support: %s';
        return $this->_pear->raiseError(
            sprintf($msg, implode(', ', $this->_capability['sasl']), implode(', ', $this->supportedAuthMethods))
        );
    }

    /**
     * Starts a TLS connection.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function _startTLS()
    {
        $res = $this->_doCmd('STARTTLS');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if (isset($this->_options['ssl']['crypto_method'])) {
            $crypto_method = $this->_options['ssl']['crypto_method'];
        } else {
            // There is no flag to enable all TLS methods. Net_SMTP
            // handles enabling TLS similarly.
            $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
        }

        if (!stream_socket_enable_crypto($this->_sock->fp, true, $crypto_method)) {
            return $this->_pear->raiseError('Failed to establish TLS connection', 2);
        }

        $this->_debug('STARTTLS negotiation successful');

        // The server should be sending a CAPABILITY response after
        // negotiating TLS. Read it, and ignore if it doesn't.
        // Unfortunately old Cyrus versions are broken and don't send a
        // CAPABILITY response, thus we would wait here forever. Parse the
        // Cyrus version and work around this broken behavior.
        if (!preg_match('/^CYRUS TIMSIEVED V([0-9.]+)/', $this->_capability['implementation'], $matches)
            || version_compare($matches[1], '2.3.10', '>=')
        ) {
            $res = $this->_doCmd();
        }

        // Reset capabilities (use unattended capabilities)
        $this->_parseCapability(is_string($res) ? $res : '');

        // Query the server capabilities again now that we are under encryption.
        if (empty($this->_capability['implementation'])) {
            $res = $this->_cmdCapability();
            if (is_a($res, 'PEAR_Error')) {
                return $this->_pear->raiseError(
                    'Failed to connect, server said: ' . $res->getMessage(), 2
                );
            }
        }

        return true;
    }

    /**
     * Returns the length of a string.
     *
     * @param string $string A string.
     *
     * @return integer  The length of the string.
     */
    function _getLineLength($string)
    {
        if (extension_loaded('mbstring')) {
            return mb_strlen($string, '8bit');
        } else {
            return strlen($string);
        }
    }

    /**
     * Locale independant strtoupper() implementation.
     *
     * @param string $string The string to convert to lowercase.
     *
     * @return string  The lowercased string, based on ASCII encoding.
     */
    function _toUpper($string)
    {
        $language = setlocale(LC_CTYPE, 0);
        setlocale(LC_CTYPE, 'C');
        $string = strtoupper($string);
        setlocale(LC_CTYPE, $language);
        return $string;
    }

    /**
     * Converts strings into RFC's quoted-string or literal-c2s form.
     *
     * @param string $string The string to convert.
     *
     * @return string Result string.
     */
    function _escape($string)
    {
        // Some implementations don't allow UTF-8 characters in quoted-string,
        // use literal-c2s.
        if (preg_match('/[^\x01-\x09\x0B-\x0C\x0E-\x7F]/', $string)) {
            return sprintf("{%d+}\r\n%s", $this->_getLineLength($string), $string);
        }

        return '"' . addcslashes($string, '\\"') . '"';
    }

    /**
     * Write debug text to the current debug output handler.
     *
     * @param string $message Debug message text.
     *
     * @return void
     */
    function _debug($message)
    {
        if ($this->_debug) {
            if ($this->_debug_handler) {
                call_user_func_array($this->_debug_handler, array(&$this, $message));
            } else {
                echo "$message\n";
            }
        }
    }
}
pear/Net/SMTP.php000064400000136600151732710000007517 0ustar00<?php
/** vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 5 and 7                                                  |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2021 Jon Parise and Chuck Hagenbuch               |
// | All rights reserved.                                                 |
// |                                                                      |
// | Redistribution and use in source and binary forms, with or without   |
// | modification, are permitted provided that the following conditions   |
// | are met:                                                             |
// |                                                                      |
// | 1. Redistributions of source code must retain the above copyright    |
// |    notice, this list of conditions and the following disclaimer.     |
// |                                                                      |
// | 2. Redistributions in binary form must reproduce the above copyright |
// |    notice, this list of conditions and the following disclaimer in   |
// |    the documentation and/or other materials provided with the        |
// |    distribution.                                                     |
// |                                                                      |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE       |
// | COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;     |
// | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER     |
// | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT   |
// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN    |
// | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      |
// | POSSIBILITY OF SUCH DAMAGE.                                          |
// +----------------------------------------------------------------------+
// | Authors: Chuck Hagenbuch <chuck@horde.org>                           |
// |          Jon Parise <jon@php.net>                                    |
// |          Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>      |
// +----------------------------------------------------------------------+

require_once 'PEAR.php';
require_once 'Net/Socket.php';

/**
 * Provides an implementation of the SMTP protocol using PEAR's
 * Net_Socket class.
 *
 * @package Net_SMTP
 * @author  Chuck Hagenbuch <chuck@horde.org>
 * @author  Jon Parise <jon@php.net>
 * @author  Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>
 * @license http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 *
 * @example basic.php A basic implementation of the Net_SMTP package.
 */
class Net_SMTP
{
    /**
     * The server to connect to.
     * @var string
     */
    public $host = 'localhost';

    /**
     * The port to connect to.
     * @var int
     */
    public $port = 25;

    /**
     * The value to give when sending EHLO or HELO.
     * @var string
     */
    public $localhost = 'localhost';

    /**
     * List of supported authentication methods, in preferential order.
     * @var array
     */
    public $auth_methods = array();

    /**
     * Use SMTP command pipelining (specified in RFC 2920) if the SMTP
     * server supports it.
     *
     * When pipeling is enabled, rcptTo(), mailFrom(), sendFrom(),
     * somlFrom() and samlFrom() do not wait for a response from the
     * SMTP server but return immediately.
     *
     * @var bool
     */
    public $pipelining = false;

    /**
     * Number of pipelined commands.
     * @var int
     */
    protected $pipelined_commands = 0;

    /**
     * Should debugging output be enabled?
     * @var boolean
     */
    protected $debug = false;

    /**
     * Debug output handler.
     * @var callback
     */
    protected $debug_handler = null;

    /**
     * The socket resource being used to connect to the SMTP server.
     * @var resource
     */
    protected $socket = null;

    /**
     * Array of socket options that will be passed to Net_Socket::connect().
     * @see stream_context_create()
     * @var array
     */
    protected $socket_options = null;

    /**
     * The socket I/O timeout value in seconds.
     * @var int
     */
    protected $timeout = 0;

    /**
     * The most recent server response code.
     * @var int
     */
    protected $code = -1;

    /**
     * The most recent server response arguments.
     * @var array
     */
    protected $arguments = array();

    /**
     * Stores the SMTP server's greeting string.
     * @var string
     */
    protected $greeting = null;

    /**
     * Stores detected features of the SMTP server.
     * @var array
     */
    protected $esmtp = array();

    /**
     * Instantiates a new Net_SMTP object, overriding any defaults
     * with parameters that are passed in.
     *
     * If you have SSL support in PHP, you can connect to a server
     * over SSL using an 'ssl://' prefix:
     *
     *   // 465 is a common smtps port.
     *   $smtp = new Net_SMTP('ssl://mail.host.com', 465);
     *   $smtp->connect();
     *
     * @param string  $host             The server to connect to.
     * @param integer $port             The port to connect to.
     * @param string  $localhost        The value to give when sending EHLO or HELO.
     * @param boolean $pipelining       Use SMTP command pipelining
     * @param integer $timeout          Socket I/O timeout in seconds.
     * @param array   $socket_options   Socket stream_context_create() options.
     * @param string  $gssapi_principal GSSAPI service principal name
     * @param string  $gssapi_cname     GSSAPI credentials cache
     *
     * @since 1.0
     */
    public function __construct($host = null, $port = null, $localhost = null,
        $pipelining = false, $timeout = 0, $socket_options = null,
        $gssapi_principal=null, $gssapi_cname=null
    ) {
        if (isset($host)) {
            $this->host = $host;
        }
        if (isset($port)) {
            $this->port = $port;
        }
        if (isset($localhost)) {
            $this->localhost = $localhost;
        }

        $this->pipelining       = $pipelining;
        $this->socket           = new Net_Socket();
        $this->socket_options   = $socket_options;
        $this->timeout          = $timeout;
        $this->gssapi_principal = $gssapi_principal;
        $this->gssapi_cname     = $gssapi_cname;

        /* If PHP krb5 extension is loaded, we enable GSSAPI method. */
        if (extension_loaded('krb5')) {
            $this->setAuthMethod('GSSAPI', array($this, 'authGSSAPI'));
        }

        /* Include the Auth_SASL package.  If the package is available, we
         * enable the authentication methods that depend upon it. */
        if (@include_once 'Auth/SASL.php') {
            $this->setAuthMethod('CRAM-MD5', array($this, 'authCramMD5'));
            $this->setAuthMethod('DIGEST-MD5', array($this, 'authDigestMD5'));
        }

        /* These standard authentication methods are always available. */
        $this->setAuthMethod('LOGIN', array($this, 'authLogin'), false);
        $this->setAuthMethod('PLAIN', array($this, 'authPlain'), false);
        $this->setAuthMethod('XOAUTH2', array($this, 'authXOAuth2'), false);
    }

    /**
     * Set the socket I/O timeout value in seconds plus microseconds.
     *
     * @param integer $seconds      Timeout value in seconds.
     * @param integer $microseconds Additional value in microseconds.
     *
     * @since 1.5.0
     */
    public function setTimeout($seconds, $microseconds = 0)
    {
        return $this->socket->setTimeout($seconds, $microseconds);
    }

    /**
     * Set the value of the debugging flag.
     *
     * @param boolean  $debug   New value for the debugging flag.
     * @param callback $handler Debug handler callback
     *
     * @since 1.1.0
     */
    public function setDebug($debug, $handler = null)
    {
        $this->debug         = $debug;
        $this->debug_handler = $handler;
    }

    /**
     * Write the given debug text to the current debug output handler.
     *
     * @param string $message Debug mesage text.
     *
     * @since 1.3.3
     */
    protected function debug($message)
    {
        if ($this->debug) {
            if ($this->debug_handler) {
                call_user_func_array(
                    $this->debug_handler, array(&$this, $message)
                );
            } else {
                echo "DEBUG: $message\n";
            }
        }
    }

    /**
     * Send the given string of data to the server.
     *
     * @param string $data The string of data to send.
     *
     * @return mixed The number of bytes that were actually written,
     *               or a PEAR_Error object on failure.
     *
     * @since 1.1.0
     */
    protected function send($data)
    {
        $this->debug("Send: $data");

        $result = $this->socket->write($data);
        if (!$result || PEAR::isError($result)) {
            $msg = $result ? $result->getMessage() : "unknown error";
            return PEAR::raiseError("Failed to write to socket: $msg");
        }

        return $result;
    }

    /**
     * Send a command to the server with an optional string of
     * arguments.  A carriage return / linefeed (CRLF) sequence will
     * be appended to each command string before it is sent to the
     * SMTP server - an error will be thrown if the command string
     * already contains any newline characters. Use send() for
     * commands that must contain newlines.
     *
     * @param string $command The SMTP command to send to the server.
     * @param string $args    A string of optional arguments to append
     *                        to the command.
     *
     * @return mixed The result of the send() call.
     *
     * @since 1.1.0
     */
    protected function put($command, $args = '')
    {
        if (!empty($args)) {
            $command .= ' ' . $args;
        }

        if (strcspn($command, "\r\n") !== strlen($command)) {
            return PEAR::raiseError('Commands cannot contain newlines');
        }

        return $this->send($command . "\r\n");
    }

    /**
     * Read a reply from the SMTP server.  The reply consists of a response
     * code and a response message.
     *
     * @param mixed $valid The set of valid response codes.  These
     *                     may be specified as an array of integer
     *                     values or as a single integer value.
     * @param bool  $later Do not parse the response now, but wait
     *                     until the last command in the pipelined
     *                     command group
     *
     * @return mixed True if the server returned a valid response code or
     *               a PEAR_Error object is an error condition is reached.
     *
     * @since 1.1.0
     *
     * @see getResponse
     */
    protected function parseResponse($valid, $later = false)
    {
        $this->code      = -1;
        $this->arguments = array();

        if ($later) {
            $this->pipelined_commands++;
            return true;
        }

        for ($i = 0; $i <= $this->pipelined_commands; $i++) {
            while ($line = $this->socket->readLine()) {
                $this->debug("Recv: $line");

                /* If we receive an empty line, the connection was closed. */
                if (empty($line)) {
                    $this->disconnect();
                    return PEAR::raiseError('Connection was closed');
                }

                /* Read the code and store the rest in the arguments array. */
                $code = substr($line, 0, 3);
                $this->arguments[] = trim(substr($line, 4));

                /* Check the syntax of the response code. */
                if (is_numeric($code)) {
                    $this->code = (int)$code;
                } else {
                    $this->code = -1;
                    break;
                }

                /* If this is not a multiline response, we're done. */
                if (substr($line, 3, 1) != '-') {
                    break;
                }
            }
        }

        $this->pipelined_commands = 0;

        /* Compare the server's response code with the valid code/codes. */
        if (is_int($valid) && ($this->code === $valid)) {
            return true;
        } elseif (is_array($valid) && in_array($this->code, $valid, true)) {
            return true;
        }

        return PEAR::raiseError('Invalid response code received from server', $this->code);
    }

    /**
     * Issue an SMTP command and verify its response.
     *
     * @param string $command The SMTP command string or data.
     * @param mixed  $valid   The set of valid response codes. These
     *                        may be specified as an array of integer
     *                        values or as a single integer value.
     *
     * @return mixed True on success or a PEAR_Error object on failure.
     *
     * @since 1.6.0
     */
    public function command($command, $valid)
    {
        if (PEAR::isError($error = $this->put($command))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse($valid))) {
            return $error;
        }

        return true;
    }

    /**
     * Return a 2-tuple containing the last response from the SMTP server.
     *
     * @return array A two-element array: the first element contains the
     *               response code as an integer and the second element
     *               contains the response's arguments as a string.
     *
     * @since 1.1.0
     */
    public function getResponse()
    {
        return array($this->code, join("\n", $this->arguments));
    }

    /**
     * Return the SMTP server's greeting string.
     *
     * @return string A string containing the greeting string, or null if
     *                a greeting has not been received.
     *
     * @since 1.3.3
     */
    public function getGreeting()
    {
        return $this->greeting;
    }

    /**
     * Attempt to connect to the SMTP server.
     *
     * @param int  $timeout    The timeout value (in seconds) for the
     *                         socket connection attempt.
     * @param bool $persistent Should a persistent socket connection
     *                         be used?
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function connect($timeout = null, $persistent = false)
    {
        $this->greeting = null;

        $result = $this->socket->connect(
            $this->host, $this->port, $persistent, $timeout, $this->socket_options
        );

        if (PEAR::isError($result)) {
            return PEAR::raiseError(
                'Failed to connect socket: ' . $result->getMessage()
            );
        }

        /*
         * Now that we're connected, reset the socket's timeout value for
         * future I/O operations.  This allows us to have different socket
         * timeout values for the initial connection (our $timeout parameter)
         * and all other socket operations.
         */
        if ($this->timeout > 0) {
            if (PEAR::isError($error = $this->setTimeout($this->timeout))) {
                return $error;
            }
        }

        if (PEAR::isError($error = $this->parseResponse(220))) {
            return $error;
        }

        /* Extract and store a copy of the server's greeting string. */
        list(, $this->greeting) = $this->getResponse();

        if (PEAR::isError($error = $this->negotiate())) {
            return $error;
        }

        return true;
    }

    /**
     * Attempt to disconnect from the SMTP server.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function disconnect()
    {
        if (PEAR::isError($error = $this->put('QUIT'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(221))) {
            return $error;
        }
        if (PEAR::isError($error = $this->socket->disconnect())) {
            return PEAR::raiseError(
                'Failed to disconnect socket: ' . $error->getMessage()
            );
        }

        return true;
    }

    /**
     * Attempt to send the EHLO command and obtain a list of ESMTP
     * extensions available, and failing that just send HELO.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     *
     * @since 1.1.0
     */
    protected function negotiate()
    {
        if (PEAR::isError($error = $this->put('EHLO', $this->localhost))) {
            return $error;
        }

        if (PEAR::isError($this->parseResponse(250))) {
            /* If the EHLO failed, try the simpler HELO command. */
            if (PEAR::isError($error = $this->put('HELO', $this->localhost))) {
                return $error;
            }
            if (PEAR::isError($this->parseResponse(250))) {
                return PEAR::raiseError('HELO was not accepted', $this->code);
            }

            return true;
        }

        foreach ($this->arguments as $argument) {
            $verb      = strtok($argument, ' ');
            $len       = strlen($verb);
            $arguments = substr($argument, $len + 1, strlen($argument) - $len - 1);
            $this->esmtp[$verb] = $arguments;
        }

        if (!isset($this->esmtp['PIPELINING'])) {
            $this->pipelining = false;
        }

        return true;
    }

    /**
     * Returns the name of the best authentication method that the server
     * has advertised.
     *
     * @return mixed Returns a string containing the name of the best
     *               supported authentication method or a PEAR_Error object
     *               if a failure condition is encountered.
     * @since 1.1.0
     */
    protected function getBestAuthMethod()
    {
        $available_methods = explode(' ', $this->esmtp['AUTH']);

        foreach ($this->auth_methods as $method => $callback) {
            if (in_array($method, $available_methods)) {
                return $method;
            }
        }

        return PEAR::raiseError('No supported authentication methods');
    }
    
    /**
     * Establish STARTTLS Connection.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, true on success, or false if SSL/TLS
     *               isn't available.
     * @since 1.10.0
     */
    public function starttls()
    {
        /* We can only attempt a TLS connection if one has been requested,
         * we're running PHP 5.1.0 or later, have access to the OpenSSL
         * extension, are connected to an SMTP server which supports the
         * STARTTLS extension, and aren't already connected over a secure
         * (SSL) socket connection. */
        if (version_compare(PHP_VERSION, '5.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
            ) {
                /* Start the TLS connection attempt. */
                if (PEAR::isError($result = $this->put('STARTTLS'))) {
                    return $result;
                }
                if (PEAR::isError($result = $this->parseResponse(220))) {
                    return $result;
                }
                if (isset($this->socket_options['ssl']['crypto_method'])) {
                    $crypto_method = $this->socket_options['ssl']['crypto_method'];
                } else {
                    /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
                     * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
                     * inconsistent across PHP versions. */
                    $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                    | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                    | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
                }
                if (PEAR::isError($result = $this->socket->enableCrypto(true, $crypto_method))) {
                    return $result;
                } elseif ($result !== true) {
                    return PEAR::raiseError('STARTTLS failed');
                }
                
                /* Send EHLO again to recieve the AUTH string from the
                 * SMTP server. */
                $this->negotiate();
            } else {
                return false;
            }
            
            return true;
    }
        
    /**
     * Attempt to do SMTP authentication.
     *
     * @param string $uid    The userid to authenticate as.
     * @param string $pwd    The password to authenticate with.
     * @param string $method The requested authentication method.  If none is
     *                       specified, the best supported method will be used.
     * @param bool   $tls    Flag indicating whether or not TLS should be attempted.
     * @param string $authz  An optional authorization identifier.  If specified, this
     *                       identifier will be used as the authorization proxy.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function auth($uid, $pwd , $method = '', $tls = true, $authz = '')
    {
        /* We can only attempt a TLS connection if one has been requested,
         * we're running PHP 5.1.0 or later, have access to the OpenSSL
         * extension, are connected to an SMTP server which supports the
         * STARTTLS extension, and aren't already connected over a secure
         * (SSL) socket connection. */
        if ($tls) {
            /* Start the TLS connection attempt. */
            if (PEAR::isError($starttls = $this->starttls())) {
                return $starttls;
            }
        }

        if (empty($this->esmtp['AUTH'])) {
            return PEAR::raiseError('SMTP server does not support authentication');
        }

        /* If no method has been specified, get the name of the best
         * supported method advertised by the SMTP server. */
        if (empty($method)) {
            if (PEAR::isError($method = $this->getBestAuthMethod())) {
                /* Return the PEAR_Error object from _getBestAuthMethod(). */
                return $method;
            }
        } else {
            $method = strtoupper($method);
            if (!array_key_exists($method, $this->auth_methods)) {
                return PEAR::raiseError("$method is not a supported authentication method");
            }
        }

        if (!isset($this->auth_methods[$method])) {
            return PEAR::raiseError("$method is not a supported authentication method");
        }

        if (!is_callable($this->auth_methods[$method], false)) {
            return PEAR::raiseError("$method authentication method cannot be called");
        }

        if (is_array($this->auth_methods[$method])) {
            list($object, $method) = $this->auth_methods[$method];
            $result = $object->{$method}($uid, $pwd, $authz, $this);
        } else {
            $func   = $this->auth_methods[$method];
            $result = $func($uid, $pwd, $authz, $this);
        }

        /* If an error was encountered, return the PEAR_Error object. */
        if (PEAR::isError($result)) {
            return $result;
        }

        return true;
    }

    /**
     * Add a new authentication method.
     *
     * @param string $name     The authentication method name (e.g. 'PLAIN')
     * @param mixed  $callback The authentication callback (given as the name of a
     *                         function or as an (object, method name) array).
     * @param bool   $prepend  Should the new method be prepended to the list of
     *                         available methods?  This is the default behavior,
     *                         giving the new method the highest priority.
     *
     * @return mixed True on success or a PEAR_Error object on failure.
     *
     * @since 1.6.0
     */
    public function setAuthMethod($name, $callback, $prepend = true)
    {
        if (!is_string($name)) {
            return PEAR::raiseError('Method name is not a string');
        }

        if (!is_string($callback) && !is_array($callback)) {
            return PEAR::raiseError('Method callback must be string or array');
        }

        if (is_array($callback)) {
            if (!is_object($callback[0]) || !is_string($callback[1])) {
                return PEAR::raiseError('Bad mMethod callback array');
            }
        }

        if ($prepend) {
            $this->auth_methods = array_merge(
                array($name => $callback), $this->auth_methods
            );
        } else {
            $this->auth_methods[$name] = $callback;
        }

        return true;
    }

    /**
     * Authenticates the user using the DIGEST-MD5 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authDigestMD5($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'DIGEST-MD5'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_sasl = new Auth_SASL;
        $digest    = $auth_sasl->factory('digest-md5');
        $challenge = base64_decode($this->arguments[0]);
        $auth_str  = base64_encode(
            $digest->getResponse($uid, $pwd, $challenge, $this->host, "smtp", $authz)
        );

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        /* We don't use the protocol's third step because SMTP doesn't
         * allow subsequent authentication, so we just silently ignore
         * it. */
        if (PEAR::isError($error = $this->put(''))) {
            return $error;
        }
        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }
    }

    /**
     * Authenticates the user using the CRAM-MD5 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authCRAMMD5($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'CRAM-MD5'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_sasl = new Auth_SASL;
        $challenge = base64_decode($this->arguments[0]);
        $cram      = $auth_sasl->factory('cram-md5');
        $auth_str  = base64_encode($cram->getResponse($uid, $pwd, $challenge));

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }
    }

    /**
     * Authenticates the user using the LOGIN method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authLogin($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'LOGIN'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        if (PEAR::isError($error = $this->put(base64_encode($uid)))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        if (PEAR::isError($error = $this->put(base64_encode($pwd)))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

    /**
     * Authenticates the user using the PLAIN method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authPlain($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'PLAIN'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_str = base64_encode($authz . chr(0) . $uid . chr(0) . $pwd);

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

     /**
     * Authenticates the user using the GSSAPI method.
     *
     * PHP krb5 extension is required,
     * service principal and credentials cache must be set.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     */
    protected function authGSSAPI($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'GSSAPI'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        if (!$this->gssapi_principal) {
            return PEAR::raiseError('No Kerberos service principal set', 2);
        }

        if (!empty($this->gssapi_cname)) {
            putenv('KRB5CCNAME=' . $this->gssapi_cname);
        }

        try {
            $ccache = new KRB5CCache();
            if (!empty($this->gssapi_cname)) {
                $ccache->open($this->gssapi_cname);
            }
            
            $gssapicontext = new GSSAPIContext();
            $gssapicontext->acquireCredentials($ccache);

            $token   = '';
            $success = $gssapicontext->initSecContext($this->gssapi_principal, null, null, null, $token);
            $token   = base64_encode($token);
        }
        catch (Exception $e) {
            return PEAR::raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        if (PEAR::isError($error = $this->put($token))) {
            return $error;
        }

        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        $response = $this->arguments[0];

        try {
            $challenge = base64_decode($response);
            $gssapicontext->unwrap($challenge, $challenge);
            $gssapicontext->wrap($challenge, $challenge, true);
        }
        catch (Exception $e) {
            return PEAR::raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        if (PEAR::isError($error = $this->put(base64_encode($challenge)))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

    /**
     * Authenticates the user using the XOAUTH2 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $token The access token to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.9.0
     */
    public function authXOAuth2($uid, $token, $authz, $conn)
    {
        $auth = base64_encode("user=$uid\1auth=$token\1\1");
        if (PEAR::isError($error = $this->put('AUTH', 'XOAUTH2 ' . $auth))) {
            return $error;
        }

        /* 235: Authentication successful or 334: Continue authentication */
        if (PEAR::isError($error = $this->parseResponse([235, 334]))) {
            return $error;
        }

        /* 334: Continue authentication request */
        if ($this->code === 334) {
            /* Send an empty line as response to 334 */
            if (PEAR::isError($error = $this->put(''))) {
                return $error;
            }

            /* Expect 235: Authentication successful */
            if (PEAR::isError($error = $this->parseResponse(235))) {
                return $error;
            }
        }

        return true;
    }

    /**
     * Send the HELO command.
     *
     * @param string $domain The domain name to say we are.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function helo($domain)
    {
        if (PEAR::isError($error = $this->put('HELO', $domain))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250))) {
            return $error;
        }

        return true;
    }

    /**
     * Return the list of SMTP service extensions advertised by the server.
     *
     * @return array The list of SMTP service extensions.
     * @since 1.3
     */
    public function getServiceExtensions()
    {
        return $this->esmtp;
    }

    /**
     * Send the MAIL FROM: command.
     *
     * @param string $sender The sender (reverse path) to set.
     * @param string $params String containing additional MAIL parameters,
     *                       such as the NOTIFY flags defined by RFC 1891
     *                       or the VERP protocol.
     *
     *                       If $params is an array, only the 'verp' option
     *                       is supported.  If 'verp' is true, the XVERP
     *                       parameter is appended to the MAIL command.
     *                       If the 'verp' value is a string, the full
     *                       XVERP=value parameter is appended.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function mailFrom($sender, $params = null)
    {
        $args = "FROM:<$sender>";

        /* Support the deprecated array form of $params. */
        if (is_array($params) && isset($params['verp'])) {
            if ($params['verp'] === true) {
                $args .= ' XVERP';
            } elseif (trim($params['verp'])) {
                $args .= ' XVERP=' . $params['verp'];
            }
        } elseif (is_string($params) && !empty($params)) {
            $args .= ' ' . $params;
        }

        if (PEAR::isError($error = $this->put('MAIL', $args))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the RCPT TO: command.
     *
     * @param string $recipient The recipient (forward path) to add.
     * @param string $params    String containing additional RCPT parameters,
     *                          such as the NOTIFY flags defined by RFC 1891.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     *
     * @since 1.0
     */
    public function rcptTo($recipient, $params = null)
    {
        $args = "TO:<$recipient>";
        if (is_string($params)) {
            $args .= ' ' . $params;
        }

        if (PEAR::isError($error = $this->put('RCPT', $args))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(array(250, 251), $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Quote the data so that it meets SMTP standards.
     *
     * This is provided as a separate public function to facilitate
     * easier overloading for the cases where it is desirable to
     * customize the quoting behavior.
     *
     * @param string &$data The message text to quote. The string must be passed
     *                      by reference, and the text will be modified in place.
     *
     * @since 1.2
     */
    public function quotedata(&$data)
    {
        /* Because a single leading period (.) signifies an end to the
         * data, legitimate leading periods need to be "doubled" ('..'). */
        $data = preg_replace('/^\./m', '..', $data);

        /* Change Unix (\n) and Mac (\r) linefeeds into CRLF's (\r\n). */
        $data = preg_replace('/(?:\r\n|\n|\r(?!\n))/', "\r\n", $data);
    }

    /**
     * Send the DATA command.
     *
     * @param mixed  $data    The message data, either as a string or an open
     *                        file resource.
     * @param string $headers The message headers.  If $headers is provided,
     *                        $data is assumed to contain only body data.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function data($data, $headers = null)
    {
        /* Verify that $data is a supported type. */
        if (!is_string($data) && !is_resource($data)) {
            return PEAR::raiseError('Expected a string or file resource');
        }

        /* Start by considering the size of the optional headers string.  We
         * also account for the addition 4 character "\r\n\r\n" separator
         * sequence. */
        $size = $headers_size = (is_null($headers)) ? 0 : strlen($headers) + 4;

        if (is_resource($data)) {
            $stat = fstat($data);
            if ($stat === false) {
                return PEAR::raiseError('Failed to get file size');
            }
            $size += $stat['size'];
        } else {
            $size += strlen($data);
        }

        /* RFC 1870, section 3, subsection 3 states "a value of zero indicates
         * that no fixed maximum message size is in force".  Furthermore, it
         * says that if "the parameter is omitted no information is conveyed
         * about the server's fixed maximum message size". */
        $limit = (isset($this->esmtp['SIZE'])) ? $this->esmtp['SIZE'] : 0;
        if ($limit > 0 && $size >= $limit) {
            return PEAR::raiseError('Message size exceeds server limit');
        }

        /* Initiate the DATA command. */
        if (PEAR::isError($error = $this->put('DATA'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(354))) {
            return $error;
        }

        /* If we have a separate headers string, send it first. */
        if (!is_null($headers)) {
            $this->quotedata($headers);
            if (PEAR::isError($result = $this->send($headers . "\r\n\r\n"))) {
                return $result;
            }

            /* Subtract the headers size now that they've been sent. */
            $size -= $headers_size;
        }

        /* Now we can send the message body data. */
        if (is_resource($data)) {
            /* Stream the contents of the file resource out over our socket
             * connection, line by line.  Each line must be run through the
             * quoting routine. */
            while (strlen($line = fread($data, 8192)) > 0) {
                /* If the last character is an newline, we need to grab the
                 * next character to check to see if it is a period. */
                while (!feof($data)) {
                    $char = fread($data, 1);
                    $line .= $char;
                    if ($char != "\n") {
                        break;
                    }
                }
                $this->quotedata($line);
                if (PEAR::isError($result = $this->send($line))) {
                    return $result;
                }
            }

             $last = $line;
        } else {
            /*
             * Break up the data by sending one chunk (up to 512k) at a time.
             * This approach reduces our peak memory usage.
             */
            for ($offset = 0; $offset < $size;) {
                $end = $offset + 512000;

                /*
                 * Ensure we don't read beyond our data size or span multiple
                 * lines.  quotedata() can't properly handle character data
                 * that's split across two line break boundaries.
                 */
                if ($end >= $size) {
                    $end = $size;
                } else {
                    for (; $end < $size; $end++) {
                        if ($data[$end] != "\n") {
                            break;
                        }
                    }
                }

                /* Extract our chunk and run it through the quoting routine. */
                $chunk = substr($data, $offset, $end - $offset);
                $this->quotedata($chunk);

                /* If we run into a problem along the way, abort. */
                if (PEAR::isError($result = $this->send($chunk))) {
                    return $result;
                }

                /* Advance the offset to the end of this chunk. */
                $offset = $end;
            }

            $last = $chunk;
        }

        /* Don't add another CRLF sequence if it's already in the data */
        $terminator = (substr($last, -2) == "\r\n" ? '' : "\r\n") . ".\r\n";

        /* Finally, send the DATA terminator sequence. */
        if (PEAR::isError($result = $this->send($terminator))) {
            return $result;
        }

        /* Verify that the data was successfully received by the server. */
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SEND FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function sendFrom($path)
    {
        if (PEAR::isError($error = $this->put('SEND', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SOML FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function somlFrom($path)
    {
        if (PEAR::isError($error = $this->put('SOML', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SAML FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function samlFrom($path)
    {
        if (PEAR::isError($error = $this->put('SAML', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the RSET command.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since  1.0
     */
    public function rset()
    {
        if (PEAR::isError($error = $this->put('RSET'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the VRFY command.
     *
     * @param string $string The string to verify
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function vrfy($string)
    {
        /* Note: 251 is also a valid response code */
        if (PEAR::isError($error = $this->put('VRFY', $string))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(array(250, 252)))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the NOOP command.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function noop()
    {
        if (PEAR::isError($error = $this->put('NOOP'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250))) {
            return $error;
        }

        return true;
    }

    /**
     * Backwards-compatibility method.  identifySender()'s functionality is
     * now handled internally.
     *
     * @return boolean This method always return true.
     *
     * @since 1.0
     */
    public function identifySender()
    {
        return true;
    }
}
pear/Net/Socket.php000064400000052506151732710000010166 0ustar00<?php
/**
 * Net_Socket
 *
 * PHP Version 5
 *
 * LICENSE:
 *
 * Copyright (c) 1997-2017 The PHP Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * o Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * o Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Net
 * @package   Net_Socket
 * @author    Stig Bakken <ssb@php.net>
 * @author    Chuck Hagenbuch <chuck@horde.org>
 * @copyright 1997-2017 The PHP Group
 * @license   http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link      http://pear.php.net/packages/Net_Socket
 */

require_once 'PEAR.php';

define('NET_SOCKET_READ', 1);
define('NET_SOCKET_WRITE', 2);
define('NET_SOCKET_ERROR', 4);

/**
 * Generalized Socket class.
 *
 * @category  Net
 * @package   Net_Socket
 * @author    Stig Bakken <ssb@php.net>
 * @author    Chuck Hagenbuch <chuck@horde.org>
 * @copyright 1997-2017 The PHP Group
 * @license   http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link      http://pear.php.net/packages/Net_Socket
 */
class Net_Socket extends PEAR
{
    /**
     * Socket file pointer.
     * @var resource $fp
     */
    public $fp = null;

    /**
     * Whether the socket is blocking. Defaults to true.
     * @var boolean $blocking
     */
    public $blocking = true;

    /**
     * Whether the socket is persistent. Defaults to false.
     * @var boolean $persistent
     */
    public $persistent = false;

    /**
     * The IP address to connect to.
     * @var string $addr
     */
    public $addr = '';

    /**
     * The port number to connect to.
     * @var integer $port
     */
    public $port = 0;

    /**
     * Number of seconds to wait on socket operations before assuming
     * there's no more data. Defaults to no timeout.
     * @var integer|float $timeout
     */
    public $timeout = null;

    /**
     * Number of bytes to read at a time in readLine() and
     * readAll(). Defaults to 2048.
     * @var integer $lineLength
     */
    public $lineLength = 2048;

    /**
     * The string to use as a newline terminator. Usually "\r\n" or "\n".
     * @var string $newline
     */
    public $newline = "\r\n";

    /**
     * Connect to the specified port. If called when the socket is
     * already connected, it disconnects and connects again.
     *
     * @param string $addr IP address or host name (may be with protocol prefix).
     * @param integer $port TCP port number.
     * @param boolean $persistent (optional) Whether the connection is
     *                            persistent (kept open between requests
     *                            by the web server).
     * @param integer $timeout (optional) Connection socket timeout.
     * @param array $options See options for stream_context_create.
     *
     * @access public
     *
     * @return boolean|PEAR_Error  True on success or a PEAR_Error on failure.
     */
    public function connect(
        $addr,
        $port = 0,
        $persistent = null,
        $timeout = null,
        $options = null
    ) {
        if (is_resource($this->fp)) {
            @fclose($this->fp);
            $this->fp = null;
        }

        if (!$addr) {
            return $this->raiseError('$addr cannot be empty');
        } else {
            if (strspn($addr, ':.0123456789') === strlen($addr)) {
                $this->addr = strpos($addr, ':') !== false ? '[' . $addr . ']' : $addr;
            } else {
                $this->addr = $addr;
            }
        }

        $this->port = $port % 65536;

        if ($persistent !== null) {
            $this->persistent = $persistent;
        }

        $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen';
        $errno = 0;
        $errstr = '';

        if (function_exists('error_clear_last')) {
            error_clear_last();
        } else {
            $old_track_errors = @ini_set('track_errors', 1);
        }

        if ($timeout <= 0) {
            $timeout = @ini_get('default_socket_timeout');
        }

        if ($options && function_exists('stream_context_create')) {
            $context = stream_context_create($options);

            // Since PHP 5 fsockopen doesn't allow context specification
            if (function_exists('stream_socket_client')) {
                $flags = STREAM_CLIENT_CONNECT;

                if ($this->persistent) {
                    $flags = STREAM_CLIENT_PERSISTENT;
                }

                $addr = $this->addr . ':' . $this->port;
                $fp = @stream_socket_client($addr, $errno, $errstr,
                    $timeout, $flags, $context);
            } else {
                $fp = @$openfunc($this->addr, $this->port, $errno,
                    $errstr, $timeout, $context);
            }
        } else {
            $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout);
        }

        if (!$fp) {
            if ($errno === 0 && !strlen($errstr)) {
                $errstr = '';
                if (isset($old_track_errors)) {
                    $errstr = $php_errormsg ?: '';  
                    @ini_set('track_errors', $old_track_errors);
                } else {
                    $lastError = error_get_last();
                    if (isset($lastError['message'])) {
                        $errstr = $lastError['message'];
                    }
                }
            }

            return $this->raiseError($errstr, $errno);
        }

        if (isset($old_track_errors)) {
            @ini_set('track_errors', $old_track_errors);
        }

        $this->fp = $fp;
        $this->setTimeout();

        return $this->setBlocking($this->blocking);
    }

    /**
     * Disconnects from the peer, closes the socket.
     *
     * @access public
     * @return mixed true on success or a PEAR_Error instance otherwise
     */
    public function disconnect()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        @fclose($this->fp);
        $this->fp = null;

        return true;
    }

    /**
     * Set the newline character/sequence to use.
     *
     * @param string $newline Newline character(s)
     * @return boolean True
     */
    public function setNewline($newline)
    {
        $this->newline = $newline;

        return true;
    }

    /**
     * Find out if the socket is in blocking mode.
     *
     * @access public
     * @return boolean  The current blocking mode.
     */
    public function isBlocking()
    {
        return $this->blocking;
    }

    /**
     * Sets whether the socket connection should be blocking or
     * not. A read call to a non-blocking socket will return immediately
     * if there is no data available, whereas it will block until there
     * is data for blocking sockets.
     *
     * @param boolean $mode True for blocking sockets, false for nonblocking.
     *
     * @access public
     * @return mixed true on success or a PEAR_Error instance otherwise
     */
    public function setBlocking($mode)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $this->blocking = $mode;
        stream_set_blocking($this->fp, (int)$this->blocking);

        return true;
    }

    /**
     * Sets the timeout value on socket descriptor,
     * expressed in the sum of seconds and microseconds
     *
     * @param integer $seconds Seconds.
     * @param integer $microseconds Microseconds, optional.
     *
     * @access public
     * @return mixed True on success or false on failure or
     *               a PEAR_Error instance when not connected
     */
    public function setTimeout($seconds = null, $microseconds = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if ($seconds === null && $microseconds === null) {
            $seconds = (int)$this->timeout;
            $microseconds = (int)(($this->timeout - $seconds) * 1000000);
        } else {
            $this->timeout = $seconds + $microseconds / 1000000;
        }

        if ($this->timeout > 0) {
            return stream_set_timeout($this->fp, (int)$seconds, (int)$microseconds);
        } else {
            return false;
        }
    }

    /**
     * Sets the file buffering size on the stream.
     * See php's stream_set_write_buffer for more information.
     *
     * @param integer $size Write buffer size.
     *
     * @access public
     * @return mixed on success or an PEAR_Error object otherwise
     */
    public function setWriteBuffer($size)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $returned = stream_set_write_buffer($this->fp, $size);
        if ($returned === 0) {
            return true;
        }

        return $this->raiseError('Cannot set write buffer.');
    }

    /**
     * Returns information about an existing socket resource.
     * Currently returns four entries in the result array:
     *
     * <p>
     * timed_out (bool) - The socket timed out waiting for data<br>
     * blocked (bool) - The socket was blocked<br>
     * eof (bool) - Indicates EOF event<br>
     * unread_bytes (int) - Number of bytes left in the socket buffer<br>
     * </p>
     *
     * @access public
     * @return mixed Array containing information about existing socket
     *               resource or a PEAR_Error instance otherwise
     */
    public function getStatus()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return stream_get_meta_data($this->fp);
    }

    /**
     * Get a specified line of data
     *
     * @param int $size Reading ends when size - 1 bytes have been read,
     *                  or a newline or an EOF (whichever comes first).
     *                  If no size is specified, it will keep reading from
     *                  the stream until it reaches the end of the line.
     *
     * @access public
     * @return mixed $size bytes of data from the socket, or a PEAR_Error if
     *         not connected. If an error occurs, FALSE is returned.
     */
    public function gets($size = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if (null === $size) {
            return @fgets($this->fp);
        } else {
            return @fgets($this->fp, $size);
        }
    }

    /**
     * Read a specified amount of data. This is guaranteed to return,
     * and has the added benefit of getting everything in one fread()
     * chunk; if you know the size of the data you're getting
     * beforehand, this is definitely the way to go.
     *
     * @param integer $size The number of bytes to read from the socket.
     *
     * @access public
     * @return string $size bytes of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function read($size)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return @fread($this->fp, $size);
    }

    /**
     * Write a specified amount of data.
     *
     * @param string $data Data to write.
     * @param integer $blocksize Amount of data to write at once.
     *                           NULL means all at once.
     *
     * @access public
     * @return mixed If the socket is not connected, returns an instance of
     *               PEAR_Error.
     *               If the write succeeds, returns the number of bytes written.
     *               If the write fails, returns false.
     *               If the socket times out, returns an instance of PEAR_Error.
     */
    public function write($data, $blocksize = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if (null === $blocksize && !OS_WINDOWS) {
            $written = @fwrite($this->fp, $data);

            // Check for timeout or lost connection
            if ($written === false) {
                $meta_data = $this->getStatus();

                if (!is_array($meta_data)) {
                    return $meta_data; // PEAR_Error
                }

                if (!empty($meta_data['timed_out'])) {
                    return $this->raiseError('timed out');
                }
            }

            return $written;
        } else {
            if (null === $blocksize) {
                $blocksize = 1024;
            }

            $pos = 0;
            $size = strlen($data);
            while ($pos < $size) {
                $written = @fwrite($this->fp, substr($data, $pos, $blocksize));

                // Check for timeout or lost connection
                if ($written === false) {
                    $meta_data = $this->getStatus();

                    if (!is_array($meta_data)) {
                        return $meta_data; // PEAR_Error
                    }

                    if (!empty($meta_data['timed_out'])) {
                        return $this->raiseError('timed out');
                    }

                    return $written;
                }

                $pos += $written;
            }

            return $pos;
        }
    }

    /**
     * Write a line of data to the socket, followed by a trailing newline.
     *
     * @param string $data Data to write
     *
     * @access public
     * @return mixed fwrite() result, or PEAR_Error when not connected
     */
    public function writeLine($data)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return fwrite($this->fp, $data . $this->newline);
    }

    /**
     * Tests for end-of-file on a socket descriptor.
     *
     * Also returns true if the socket is disconnected.
     *
     * @access public
     * @return bool
     */
    public function eof()
    {
        return (!is_resource($this->fp) || feof($this->fp));
    }

    /**
     * Reads a byte of data
     *
     * @access public
     * @return integer 1 byte of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readByte()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return ord(@fread($this->fp, 1));
    }

    /**
     * Reads a word of data
     *
     * @access public
     * @return integer 1 word of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readWord()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 2);

        return (ord($buf[0]) + (ord($buf[1]) << 8));
    }

    /**
     * Reads an int of data
     *
     * @access public
     * @return integer  1 int of data from the socket, or a PEAR_Error if
     *                  not connected.
     */
    public function readInt()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 4);

        return (ord($buf[0]) + (ord($buf[1]) << 8) +
            (ord($buf[2]) << 16) + (ord($buf[3]) << 24));
    }

    /**
     * Reads a zero-terminated string of data
     *
     * @access public
     * @return string, or a PEAR_Error if
     *         not connected.
     */
    public function readString()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $string = '';
        while (($char = @fread($this->fp, 1)) !== "\x00") {
            $string .= $char;
        }

        return $string;
    }

    /**
     * Reads an IP Address and returns it in a dot formatted string
     *
     * @access public
     * @return string Dot formatted string, or a PEAR_Error if
     *         not connected.
     */
    public function readIPAddress()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 4);

        return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]),
            ord($buf[2]), ord($buf[3]));
    }

    /**
     * Read until either the end of the socket or a newline, whichever
     * comes first. Strips the trailing newline from the returned data.
     *
     * @access public
     * @return string All available data up to a newline, without that
     *         newline, or until the end of the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readLine()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $line = '';

        $timeout = time() + $this->timeout;

        while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
            $line .= @fgets($this->fp, $this->lineLength);
            if (substr($line, -1) == "\n") {
                return rtrim($line, $this->newline);
            }
        }

        return $line;
    }

    /**
     * Read until the socket closes, or until there is no more data in
     * the inner PHP buffer. If the inner buffer is empty, in blocking
     * mode we wait for at least 1 byte of data. Therefore, in
     * blocking mode, if there is no data at all to be read, this
     * function will never exit (unless the socket is closed on the
     * remote end).
     *
     * @access public
     *
     * @return string  All data until the socket closes, or a PEAR_Error if
     *                 not connected.
     */
    public function readAll()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $data = '';
        $timeout = time() + $this->timeout;

        while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
            $data .= @fread($this->fp, $this->lineLength);
        }

        return $data;
    }

    /**
     * Runs the equivalent of the select() system call on the socket
     * with a timeout specified by tv_sec and tv_usec.
     *
     * @param integer $state Which of read/write/error to check for.
     * @param integer $tv_sec Number of seconds for timeout.
     * @param integer $tv_usec Number of microseconds for timeout.
     *
     * @access public
     * @return False if select fails, integer describing which of read/write/error
     *         are ready, or PEAR_Error if not connected.
     */
    public function select($state, $tv_sec, $tv_usec = 0)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $read = null;
        $write = null;
        $except = null;
        if ($state & NET_SOCKET_READ) {
            $read[] = $this->fp;
        }
        if ($state & NET_SOCKET_WRITE) {
            $write[] = $this->fp;
        }
        if ($state & NET_SOCKET_ERROR) {
            $except[] = $this->fp;
        }
        if (false === ($sr = stream_select($read, $write, $except,
                $tv_sec, $tv_usec))
        ) {
            return false;
        }

        $result = 0;
        if (count($read)) {
            $result |= NET_SOCKET_READ;
        }
        if (count($write)) {
            $result |= NET_SOCKET_WRITE;
        }
        if (count($except)) {
            $result |= NET_SOCKET_ERROR;
        }

        return $result;
    }

    /**
     * Turns encryption on/off on a connected socket.
     *
     * @param bool $enabled Set this parameter to true to enable encryption
     *                         and false to disable encryption.
     * @param integer $type Type of encryption. See stream_socket_enable_crypto()
     *                         for values.
     *
     * @see    http://se.php.net/manual/en/function.stream-socket-enable-crypto.php
     * @access public
     * @return false on error, true on success and 0 if there isn't enough data
     *         and the user should try again (non-blocking sockets only).
     *         A PEAR_Error object is returned if the socket is not
     *         connected
     */
    public function enableCrypto($enabled, $type)
    {
        if (version_compare(phpversion(), '5.1.0', '>=')) {
            if (!is_resource($this->fp)) {
                return $this->raiseError('not connected');
            }

            return @stream_socket_enable_crypto($this->fp, $enabled, $type);
        } else {
            $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';

            return $this->raiseError($msg);
        }
    }

}
pear/Net/IDNA2/Exception.php000064400000000066151732710000011463 0ustar00<?php
class Net_IDNA2_Exception extends Exception
{
}
pear/Net/IDNA2/Exception/Nameprep.php000064400000000162151732710000013227 0ustar00<?php
require_once 'Net/IDNA2/Exception.php';

class Net_IDNA2_Exception_Nameprep extends Net_IDNA2_Exception
{
}
pear/Net/IDNA2.php000064400000313255151732710010007535 0ustar00<?php

// {{{ license

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
//
// +----------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU Lesser General Public License as       |
// | published by the Free Software Foundation; either version 2.1 of the |
// | License, or (at your option) any later version.                      |
// |                                                                      |
// | This library is distributed in the hope that it will be useful, but  |
// | WITHOUT ANY WARRANTY; without even the implied warranty of           |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |
// | Lesser General Public License for more details.                      |
// |                                                                      |
// | You should have received a copy of the GNU Lesser General Public     |
// | License along with this library; if not, write to the Free Software  |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 |
// | USA.                                                                 |
// +----------------------------------------------------------------------+
//

// }}}
require_once 'Net/IDNA2/Exception.php';
require_once 'Net/IDNA2/Exception/Nameprep.php';

/**
 * Encode/decode Internationalized Domain Names.
 *
 * The class allows one to convert internationalized domain names
 * (see RFC 3490 for details) as they can be used with various registries worldwide
 * to be translated between their original (localized) form and their encoded form
 * as it will be used in the DNS (Domain Name System).
 *
 * The class provides two public methods, encode() and decode(), which do exactly
 * what you would expect them to do. You are allowed to use complete domain names,
 * simple strings and complete email addresses as well. That means, that you might
 * use any of the following notations:
 *
 * - www.n�rgler.com
 * - xn--nrgler-wxa
 * - xn--brse-5qa.xn--knrz-1ra.info
 *
 * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
 * array. Unicode output is available in the same formats.
 * You can select your preferred format via {@link set_paramter()}.
 *
 * ACE input and output is always expected to be ASCII.
 *
 * @package Net
 * @author  Markus Nix <mnix@docuverse.de>
 * @author  Matthias Sommerfeld <mso@phlylabs.de>
 * @author  Stefan Neufeind <pear.neufeind@speedpartner.de>
 * @version $Id$
 */
class Net_IDNA2
{
    // {{{ npdata
    /**
     * These Unicode codepoints are
     * mapped to nothing, See RFC3454 for details
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_map_nothing = array(
        0xAD,
        0x34F,
        0x1806,
        0x180B,
        0x180C,
        0x180D,
        0x200B,
        0x200C,
        0x200D,
        0x2060,
        0xFE00,
        0xFE01,
        0xFE02,
        0xFE03,
        0xFE04,
        0xFE05,
        0xFE06,
        0xFE07,
        0xFE08,
        0xFE09,
        0xFE0A,
        0xFE0B,
        0xFE0C,
        0xFE0D,
        0xFE0E,
        0xFE0F,
        0xFEFF
    );

    /**
     * Prohibited codepints
     *
     * @static
     * @var array
     * @access private
     */
    private static $_general_prohibited = array(
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        0xA,
        0xB,
        0xC,
        0xD,
        0xE,
        0xF,
        0x10,
        0x11,
        0x12,
        0x13,
        0x14,
        0x15,
        0x16,
        0x17,
        0x18,
        0x19,
        0x1A,
        0x1B,
        0x1C,
        0x1D,
        0x1E,
        0x1F,
        0x20,
        0x21,
        0x22,
        0x23,
        0x24,
        0x25,
        0x26,
        0x27,
        0x28,
        0x29,
        0x2A,
        0x2B,
        0x2C,
        0x2F,
        0x3B,
        0x3C,
        0x3D,
        0x3E,
        0x3F,
        0x40,
        0x5B,
        0x5C,
        0x5D,
        0x5E,
        0x5F,
        0x60,
        0x7B,
        0x7C,
        0x7D,
        0x7E,
        0x7F,
        0x3002
    );

    /**
     * Codepints prohibited by Nameprep
     * @static
     * @var array
     * @access private
     */
    private static $_np_prohibit = array(
        0xA0,
        0x1680,
        0x2000,
        0x2001,
        0x2002,
        0x2003,
        0x2004,
        0x2005,
        0x2006,
        0x2007,
        0x2008,
        0x2009,
        0x200A,
        0x200B,
        0x202F,
        0x205F,
        0x3000,
        0x6DD,
        0x70F,
        0x180E,
        0x200C,
        0x200D,
        0x2028,
        0x2029,
        0xFEFF,
        0xFFF9,
        0xFFFA,
        0xFFFB,
        0xFFFC,
        0xFFFE,
        0xFFFF,
        0x1FFFE,
        0x1FFFF,
        0x2FFFE,
        0x2FFFF,
        0x3FFFE,
        0x3FFFF,
        0x4FFFE,
        0x4FFFF,
        0x5FFFE,
        0x5FFFF,
        0x6FFFE,
        0x6FFFF,
        0x7FFFE,
        0x7FFFF,
        0x8FFFE,
        0x8FFFF,
        0x9FFFE,
        0x9FFFF,
        0xAFFFE,
        0xAFFFF,
        0xBFFFE,
        0xBFFFF,
        0xCFFFE,
        0xCFFFF,
        0xDFFFE,
        0xDFFFF,
        0xEFFFE,
        0xEFFFF,
        0xFFFFE,
        0xFFFFF,
        0x10FFFE,
        0x10FFFF,
        0xFFF9,
        0xFFFA,
        0xFFFB,
        0xFFFC,
        0xFFFD,
        0x340,
        0x341,
        0x200E,
        0x200F,
        0x202A,
        0x202B,
        0x202C,
        0x202D,
        0x202E,
        0x206A,
        0x206B,
        0x206C,
        0x206D,
        0x206E,
        0x206F,
        0xE0001
    );

    /**
     * Codepoint ranges prohibited by nameprep
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_prohibit_ranges = array(
        array(0x80,     0x9F    ),
        array(0x2060,   0x206F  ),
        array(0x1D173,  0x1D17A ),
        array(0xE000,   0xF8FF  ),
        array(0xF0000,  0xFFFFD ),
        array(0x100000, 0x10FFFD),
        array(0xFDD0,   0xFDEF  ),
        array(0xD800,   0xDFFF  ),
        array(0x2FF0,   0x2FFB  ),
        array(0xE0020,  0xE007F )
    );

    /**
     * Replacement mappings (casemapping, replacement sequences, ...)
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_replacemaps = array(
        0x41    => array(0x61),
        0x42    => array(0x62),
        0x43    => array(0x63),
        0x44    => array(0x64),
        0x45    => array(0x65),
        0x46    => array(0x66),
        0x47    => array(0x67),
        0x48    => array(0x68),
        0x49    => array(0x69),
        0x4A    => array(0x6A),
        0x4B    => array(0x6B),
        0x4C    => array(0x6C),
        0x4D    => array(0x6D),
        0x4E    => array(0x6E),
        0x4F    => array(0x6F),
        0x50    => array(0x70),
        0x51    => array(0x71),
        0x52    => array(0x72),
        0x53    => array(0x73),
        0x54    => array(0x74),
        0x55    => array(0x75),
        0x56    => array(0x76),
        0x57    => array(0x77),
        0x58    => array(0x78),
        0x59    => array(0x79),
        0x5A    => array(0x7A),
        0xB5    => array(0x3BC),
        0xC0    => array(0xE0),
        0xC1    => array(0xE1),
        0xC2    => array(0xE2),
        0xC3    => array(0xE3),
        0xC4    => array(0xE4),
        0xC5    => array(0xE5),
        0xC6    => array(0xE6),
        0xC7    => array(0xE7),
        0xC8    => array(0xE8),
        0xC9    => array(0xE9),
        0xCA    => array(0xEA),
        0xCB    => array(0xEB),
        0xCC    => array(0xEC),
        0xCD    => array(0xED),
        0xCE    => array(0xEE),
        0xCF    => array(0xEF),
        0xD0    => array(0xF0),
        0xD1    => array(0xF1),
        0xD2    => array(0xF2),
        0xD3    => array(0xF3),
        0xD4    => array(0xF4),
        0xD5    => array(0xF5),
        0xD6    => array(0xF6),
        0xD8    => array(0xF8),
        0xD9    => array(0xF9),
        0xDA    => array(0xFA),
        0xDB    => array(0xFB),
        0xDC    => array(0xFC),
        0xDD    => array(0xFD),
        0xDE    => array(0xFE),
        0xDF    => array(0x73, 0x73),
        0x100   => array(0x101),
        0x102   => array(0x103),
        0x104   => array(0x105),
        0x106   => array(0x107),
        0x108   => array(0x109),
        0x10A   => array(0x10B),
        0x10C   => array(0x10D),
        0x10E   => array(0x10F),
        0x110   => array(0x111),
        0x112   => array(0x113),
        0x114   => array(0x115),
        0x116   => array(0x117),
        0x118   => array(0x119),
        0x11A   => array(0x11B),
        0x11C   => array(0x11D),
        0x11E   => array(0x11F),
        0x120   => array(0x121),
        0x122   => array(0x123),
        0x124   => array(0x125),
        0x126   => array(0x127),
        0x128   => array(0x129),
        0x12A   => array(0x12B),
        0x12C   => array(0x12D),
        0x12E   => array(0x12F),
        0x130   => array(0x69, 0x307),
        0x132   => array(0x133),
        0x134   => array(0x135),
        0x136   => array(0x137),
        0x139   => array(0x13A),
        0x13B   => array(0x13C),
        0x13D   => array(0x13E),
        0x13F   => array(0x140),
        0x141   => array(0x142),
        0x143   => array(0x144),
        0x145   => array(0x146),
        0x147   => array(0x148),
        0x149   => array(0x2BC, 0x6E),
        0x14A   => array(0x14B),
        0x14C   => array(0x14D),
        0x14E   => array(0x14F),
        0x150   => array(0x151),
        0x152   => array(0x153),
        0x154   => array(0x155),
        0x156   => array(0x157),
        0x158   => array(0x159),
        0x15A   => array(0x15B),
        0x15C   => array(0x15D),
        0x15E   => array(0x15F),
        0x160   => array(0x161),
        0x162   => array(0x163),
        0x164   => array(0x165),
        0x166   => array(0x167),
        0x168   => array(0x169),
        0x16A   => array(0x16B),
        0x16C   => array(0x16D),
        0x16E   => array(0x16F),
        0x170   => array(0x171),
        0x172   => array(0x173),
        0x174   => array(0x175),
        0x176   => array(0x177),
        0x178   => array(0xFF),
        0x179   => array(0x17A),
        0x17B   => array(0x17C),
        0x17D   => array(0x17E),
        0x17F   => array(0x73),
        0x181   => array(0x253),
        0x182   => array(0x183),
        0x184   => array(0x185),
        0x186   => array(0x254),
        0x187   => array(0x188),
        0x189   => array(0x256),
        0x18A   => array(0x257),
        0x18B   => array(0x18C),
        0x18E   => array(0x1DD),
        0x18F   => array(0x259),
        0x190   => array(0x25B),
        0x191   => array(0x192),
        0x193   => array(0x260),
        0x194   => array(0x263),
        0x196   => array(0x269),
        0x197   => array(0x268),
        0x198   => array(0x199),
        0x19C   => array(0x26F),
        0x19D   => array(0x272),
        0x19F   => array(0x275),
        0x1A0   => array(0x1A1),
        0x1A2   => array(0x1A3),
        0x1A4   => array(0x1A5),
        0x1A6   => array(0x280),
        0x1A7   => array(0x1A8),
        0x1A9   => array(0x283),
        0x1AC   => array(0x1AD),
        0x1AE   => array(0x288),
        0x1AF   => array(0x1B0),
        0x1B1   => array(0x28A),
        0x1B2   => array(0x28B),
        0x1B3   => array(0x1B4),
        0x1B5   => array(0x1B6),
        0x1B7   => array(0x292),
        0x1B8   => array(0x1B9),
        0x1BC   => array(0x1BD),
        0x1C4   => array(0x1C6),
        0x1C5   => array(0x1C6),
        0x1C7   => array(0x1C9),
        0x1C8   => array(0x1C9),
        0x1CA   => array(0x1CC),
        0x1CB   => array(0x1CC),
        0x1CD   => array(0x1CE),
        0x1CF   => array(0x1D0),
        0x1D1   => array(0x1D2),
        0x1D3   => array(0x1D4),
        0x1D5   => array(0x1D6),
        0x1D7   => array(0x1D8),
        0x1D9   => array(0x1DA),
        0x1DB   => array(0x1DC),
        0x1DE   => array(0x1DF),
        0x1E0   => array(0x1E1),
        0x1E2   => array(0x1E3),
        0x1E4   => array(0x1E5),
        0x1E6   => array(0x1E7),
        0x1E8   => array(0x1E9),
        0x1EA   => array(0x1EB),
        0x1EC   => array(0x1ED),
        0x1EE   => array(0x1EF),
        0x1F0   => array(0x6A, 0x30C),
        0x1F1   => array(0x1F3),
        0x1F2   => array(0x1F3),
        0x1F4   => array(0x1F5),
        0x1F6   => array(0x195),
        0x1F7   => array(0x1BF),
        0x1F8   => array(0x1F9),
        0x1FA   => array(0x1FB),
        0x1FC   => array(0x1FD),
        0x1FE   => array(0x1FF),
        0x200   => array(0x201),
        0x202   => array(0x203),
        0x204   => array(0x205),
        0x206   => array(0x207),
        0x208   => array(0x209),
        0x20A   => array(0x20B),
        0x20C   => array(0x20D),
        0x20E   => array(0x20F),
        0x210   => array(0x211),
        0x212   => array(0x213),
        0x214   => array(0x215),
        0x216   => array(0x217),
        0x218   => array(0x219),
        0x21A   => array(0x21B),
        0x21C   => array(0x21D),
        0x21E   => array(0x21F),
        0x220   => array(0x19E),
        0x222   => array(0x223),
        0x224   => array(0x225),
        0x226   => array(0x227),
        0x228   => array(0x229),
        0x22A   => array(0x22B),
        0x22C   => array(0x22D),
        0x22E   => array(0x22F),
        0x230   => array(0x231),
        0x232   => array(0x233),
        0x345   => array(0x3B9),
        0x37A   => array(0x20, 0x3B9),
        0x386   => array(0x3AC),
        0x388   => array(0x3AD),
        0x389   => array(0x3AE),
        0x38A   => array(0x3AF),
        0x38C   => array(0x3CC),
        0x38E   => array(0x3CD),
        0x38F   => array(0x3CE),
        0x390   => array(0x3B9, 0x308, 0x301),
        0x391   => array(0x3B1),
        0x392   => array(0x3B2),
        0x393   => array(0x3B3),
        0x394   => array(0x3B4),
        0x395   => array(0x3B5),
        0x396   => array(0x3B6),
        0x397   => array(0x3B7),
        0x398   => array(0x3B8),
        0x399   => array(0x3B9),
        0x39A   => array(0x3BA),
        0x39B   => array(0x3BB),
        0x39C   => array(0x3BC),
        0x39D   => array(0x3BD),
        0x39E   => array(0x3BE),
        0x39F   => array(0x3BF),
        0x3A0   => array(0x3C0),
        0x3A1   => array(0x3C1),
        0x3A3   => array(0x3C3),
        0x3A4   => array(0x3C4),
        0x3A5   => array(0x3C5),
        0x3A6   => array(0x3C6),
        0x3A7   => array(0x3C7),
        0x3A8   => array(0x3C8),
        0x3A9   => array(0x3C9),
        0x3AA   => array(0x3CA),
        0x3AB   => array(0x3CB),
        0x3B0   => array(0x3C5, 0x308, 0x301),
        0x3C2   => array(0x3C3),
        0x3D0   => array(0x3B2),
        0x3D1   => array(0x3B8),
        0x3D2   => array(0x3C5),
        0x3D3   => array(0x3CD),
        0x3D4   => array(0x3CB),
        0x3D5   => array(0x3C6),
        0x3D6   => array(0x3C0),
        0x3D8   => array(0x3D9),
        0x3DA   => array(0x3DB),
        0x3DC   => array(0x3DD),
        0x3DE   => array(0x3DF),
        0x3E0   => array(0x3E1),
        0x3E2   => array(0x3E3),
        0x3E4   => array(0x3E5),
        0x3E6   => array(0x3E7),
        0x3E8   => array(0x3E9),
        0x3EA   => array(0x3EB),
        0x3EC   => array(0x3ED),
        0x3EE   => array(0x3EF),
        0x3F0   => array(0x3BA),
        0x3F1   => array(0x3C1),
        0x3F2   => array(0x3C3),
        0x3F4   => array(0x3B8),
        0x3F5   => array(0x3B5),
        0x400   => array(0x450),
        0x401   => array(0x451),
        0x402   => array(0x452),
        0x403   => array(0x453),
        0x404   => array(0x454),
        0x405   => array(0x455),
        0x406   => array(0x456),
        0x407   => array(0x457),
        0x408   => array(0x458),
        0x409   => array(0x459),
        0x40A   => array(0x45A),
        0x40B   => array(0x45B),
        0x40C   => array(0x45C),
        0x40D   => array(0x45D),
        0x40E   => array(0x45E),
        0x40F   => array(0x45F),
        0x410   => array(0x430),
        0x411   => array(0x431),
        0x412   => array(0x432),
        0x413   => array(0x433),
        0x414   => array(0x434),
        0x415   => array(0x435),
        0x416   => array(0x436),
        0x417   => array(0x437),
        0x418   => array(0x438),
        0x419   => array(0x439),
        0x41A   => array(0x43A),
        0x41B   => array(0x43B),
        0x41C   => array(0x43C),
        0x41D   => array(0x43D),
        0x41E   => array(0x43E),
        0x41F   => array(0x43F),
        0x420   => array(0x440),
        0x421   => array(0x441),
        0x422   => array(0x442),
        0x423   => array(0x443),
        0x424   => array(0x444),
        0x425   => array(0x445),
        0x426   => array(0x446),
        0x427   => array(0x447),
        0x428   => array(0x448),
        0x429   => array(0x449),
        0x42A   => array(0x44A),
        0x42B   => array(0x44B),
        0x42C   => array(0x44C),
        0x42D   => array(0x44D),
        0x42E   => array(0x44E),
        0x42F   => array(0x44F),
        0x460   => array(0x461),
        0x462   => array(0x463),
        0x464   => array(0x465),
        0x466   => array(0x467),
        0x468   => array(0x469),
        0x46A   => array(0x46B),
        0x46C   => array(0x46D),
        0x46E   => array(0x46F),
        0x470   => array(0x471),
        0x472   => array(0x473),
        0x474   => array(0x475),
        0x476   => array(0x477),
        0x478   => array(0x479),
        0x47A   => array(0x47B),
        0x47C   => array(0x47D),
        0x47E   => array(0x47F),
        0x480   => array(0x481),
        0x48A   => array(0x48B),
        0x48C   => array(0x48D),
        0x48E   => array(0x48F),
        0x490   => array(0x491),
        0x492   => array(0x493),
        0x494   => array(0x495),
        0x496   => array(0x497),
        0x498   => array(0x499),
        0x49A   => array(0x49B),
        0x49C   => array(0x49D),
        0x49E   => array(0x49F),
        0x4A0   => array(0x4A1),
        0x4A2   => array(0x4A3),
        0x4A4   => array(0x4A5),
        0x4A6   => array(0x4A7),
        0x4A8   => array(0x4A9),
        0x4AA   => array(0x4AB),
        0x4AC   => array(0x4AD),
        0x4AE   => array(0x4AF),
        0x4B0   => array(0x4B1),
        0x4B2   => array(0x4B3),
        0x4B4   => array(0x4B5),
        0x4B6   => array(0x4B7),
        0x4B8   => array(0x4B9),
        0x4BA   => array(0x4BB),
        0x4BC   => array(0x4BD),
        0x4BE   => array(0x4BF),
        0x4C1   => array(0x4C2),
        0x4C3   => array(0x4C4),
        0x4C5   => array(0x4C6),
        0x4C7   => array(0x4C8),
        0x4C9   => array(0x4CA),
        0x4CB   => array(0x4CC),
        0x4CD   => array(0x4CE),
        0x4D0   => array(0x4D1),
        0x4D2   => array(0x4D3),
        0x4D4   => array(0x4D5),
        0x4D6   => array(0x4D7),
        0x4D8   => array(0x4D9),
        0x4DA   => array(0x4DB),
        0x4DC   => array(0x4DD),
        0x4DE   => array(0x4DF),
        0x4E0   => array(0x4E1),
        0x4E2   => array(0x4E3),
        0x4E4   => array(0x4E5),
        0x4E6   => array(0x4E7),
        0x4E8   => array(0x4E9),
        0x4EA   => array(0x4EB),
        0x4EC   => array(0x4ED),
        0x4EE   => array(0x4EF),
        0x4F0   => array(0x4F1),
        0x4F2   => array(0x4F3),
        0x4F4   => array(0x4F5),
        0x4F8   => array(0x4F9),
        0x500   => array(0x501),
        0x502   => array(0x503),
        0x504   => array(0x505),
        0x506   => array(0x507),
        0x508   => array(0x509),
        0x50A   => array(0x50B),
        0x50C   => array(0x50D),
        0x50E   => array(0x50F),
        0x531   => array(0x561),
        0x532   => array(0x562),
        0x533   => array(0x563),
        0x534   => array(0x564),
        0x535   => array(0x565),
        0x536   => array(0x566),
        0x537   => array(0x567),
        0x538   => array(0x568),
        0x539   => array(0x569),
        0x53A   => array(0x56A),
        0x53B   => array(0x56B),
        0x53C   => array(0x56C),
        0x53D   => array(0x56D),
        0x53E   => array(0x56E),
        0x53F   => array(0x56F),
        0x540   => array(0x570),
        0x541   => array(0x571),
        0x542   => array(0x572),
        0x543   => array(0x573),
        0x544   => array(0x574),
        0x545   => array(0x575),
        0x546   => array(0x576),
        0x547   => array(0x577),
        0x548   => array(0x578),
        0x549   => array(0x579),
        0x54A   => array(0x57A),
        0x54B   => array(0x57B),
        0x54C   => array(0x57C),
        0x54D   => array(0x57D),
        0x54E   => array(0x57E),
        0x54F   => array(0x57F),
        0x550   => array(0x580),
        0x551   => array(0x581),
        0x552   => array(0x582),
        0x553   => array(0x583),
        0x554   => array(0x584),
        0x555   => array(0x585),
        0x556   => array(0x586),
        0x587   => array(0x565, 0x582),
        0x1E00  => array(0x1E01),
        0x1E02  => array(0x1E03),
        0x1E04  => array(0x1E05),
        0x1E06  => array(0x1E07),
        0x1E08  => array(0x1E09),
        0x1E0A  => array(0x1E0B),
        0x1E0C  => array(0x1E0D),
        0x1E0E  => array(0x1E0F),
        0x1E10  => array(0x1E11),
        0x1E12  => array(0x1E13),
        0x1E14  => array(0x1E15),
        0x1E16  => array(0x1E17),
        0x1E18  => array(0x1E19),
        0x1E1A  => array(0x1E1B),
        0x1E1C  => array(0x1E1D),
        0x1E1E  => array(0x1E1F),
        0x1E20  => array(0x1E21),
        0x1E22  => array(0x1E23),
        0x1E24  => array(0x1E25),
        0x1E26  => array(0x1E27),
        0x1E28  => array(0x1E29),
        0x1E2A  => array(0x1E2B),
        0x1E2C  => array(0x1E2D),
        0x1E2E  => array(0x1E2F),
        0x1E30  => array(0x1E31),
        0x1E32  => array(0x1E33),
        0x1E34  => array(0x1E35),
        0x1E36  => array(0x1E37),
        0x1E38  => array(0x1E39),
        0x1E3A  => array(0x1E3B),
        0x1E3C  => array(0x1E3D),
        0x1E3E  => array(0x1E3F),
        0x1E40  => array(0x1E41),
        0x1E42  => array(0x1E43),
        0x1E44  => array(0x1E45),
        0x1E46  => array(0x1E47),
        0x1E48  => array(0x1E49),
        0x1E4A  => array(0x1E4B),
        0x1E4C  => array(0x1E4D),
        0x1E4E  => array(0x1E4F),
        0x1E50  => array(0x1E51),
        0x1E52  => array(0x1E53),
        0x1E54  => array(0x1E55),
        0x1E56  => array(0x1E57),
        0x1E58  => array(0x1E59),
        0x1E5A  => array(0x1E5B),
        0x1E5C  => array(0x1E5D),
        0x1E5E  => array(0x1E5F),
        0x1E60  => array(0x1E61),
        0x1E62  => array(0x1E63),
        0x1E64  => array(0x1E65),
        0x1E66  => array(0x1E67),
        0x1E68  => array(0x1E69),
        0x1E6A  => array(0x1E6B),
        0x1E6C  => array(0x1E6D),
        0x1E6E  => array(0x1E6F),
        0x1E70  => array(0x1E71),
        0x1E72  => array(0x1E73),
        0x1E74  => array(0x1E75),
        0x1E76  => array(0x1E77),
        0x1E78  => array(0x1E79),
        0x1E7A  => array(0x1E7B),
        0x1E7C  => array(0x1E7D),
        0x1E7E  => array(0x1E7F),
        0x1E80  => array(0x1E81),
        0x1E82  => array(0x1E83),
        0x1E84  => array(0x1E85),
        0x1E86  => array(0x1E87),
        0x1E88  => array(0x1E89),
        0x1E8A  => array(0x1E8B),
        0x1E8C  => array(0x1E8D),
        0x1E8E  => array(0x1E8F),
        0x1E90  => array(0x1E91),
        0x1E92  => array(0x1E93),
        0x1E94  => array(0x1E95),
        0x1E96  => array(0x68, 0x331),
        0x1E97  => array(0x74, 0x308),
        0x1E98  => array(0x77, 0x30A),
        0x1E99  => array(0x79, 0x30A),
        0x1E9A  => array(0x61, 0x2BE),
        0x1E9B  => array(0x1E61),
        0x1EA0  => array(0x1EA1),
        0x1EA2  => array(0x1EA3),
        0x1EA4  => array(0x1EA5),
        0x1EA6  => array(0x1EA7),
        0x1EA8  => array(0x1EA9),
        0x1EAA  => array(0x1EAB),
        0x1EAC  => array(0x1EAD),
        0x1EAE  => array(0x1EAF),
        0x1EB0  => array(0x1EB1),
        0x1EB2  => array(0x1EB3),
        0x1EB4  => array(0x1EB5),
        0x1EB6  => array(0x1EB7),
        0x1EB8  => array(0x1EB9),
        0x1EBA  => array(0x1EBB),
        0x1EBC  => array(0x1EBD),
        0x1EBE  => array(0x1EBF),
        0x1EC0  => array(0x1EC1),
        0x1EC2  => array(0x1EC3),
        0x1EC4  => array(0x1EC5),
        0x1EC6  => array(0x1EC7),
        0x1EC8  => array(0x1EC9),
        0x1ECA  => array(0x1ECB),
        0x1ECC  => array(0x1ECD),
        0x1ECE  => array(0x1ECF),
        0x1ED0  => array(0x1ED1),
        0x1ED2  => array(0x1ED3),
        0x1ED4  => array(0x1ED5),
        0x1ED6  => array(0x1ED7),
        0x1ED8  => array(0x1ED9),
        0x1EDA  => array(0x1EDB),
        0x1EDC  => array(0x1EDD),
        0x1EDE  => array(0x1EDF),
        0x1EE0  => array(0x1EE1),
        0x1EE2  => array(0x1EE3),
        0x1EE4  => array(0x1EE5),
        0x1EE6  => array(0x1EE7),
        0x1EE8  => array(0x1EE9),
        0x1EEA  => array(0x1EEB),
        0x1EEC  => array(0x1EED),
        0x1EEE  => array(0x1EEF),
        0x1EF0  => array(0x1EF1),
        0x1EF2  => array(0x1EF3),
        0x1EF4  => array(0x1EF5),
        0x1EF6  => array(0x1EF7),
        0x1EF8  => array(0x1EF9),
        0x1F08  => array(0x1F00),
        0x1F09  => array(0x1F01),
        0x1F0A  => array(0x1F02),
        0x1F0B  => array(0x1F03),
        0x1F0C  => array(0x1F04),
        0x1F0D  => array(0x1F05),
        0x1F0E  => array(0x1F06),
        0x1F0F  => array(0x1F07),
        0x1F18  => array(0x1F10),
        0x1F19  => array(0x1F11),
        0x1F1A  => array(0x1F12),
        0x1F1B  => array(0x1F13),
        0x1F1C  => array(0x1F14),
        0x1F1D  => array(0x1F15),
        0x1F28  => array(0x1F20),
        0x1F29  => array(0x1F21),
        0x1F2A  => array(0x1F22),
        0x1F2B  => array(0x1F23),
        0x1F2C  => array(0x1F24),
        0x1F2D  => array(0x1F25),
        0x1F2E  => array(0x1F26),
        0x1F2F  => array(0x1F27),
        0x1F38  => array(0x1F30),
        0x1F39  => array(0x1F31),
        0x1F3A  => array(0x1F32),
        0x1F3B  => array(0x1F33),
        0x1F3C  => array(0x1F34),
        0x1F3D  => array(0x1F35),
        0x1F3E  => array(0x1F36),
        0x1F3F  => array(0x1F37),
        0x1F48  => array(0x1F40),
        0x1F49  => array(0x1F41),
        0x1F4A  => array(0x1F42),
        0x1F4B  => array(0x1F43),
        0x1F4C  => array(0x1F44),
        0x1F4D  => array(0x1F45),
        0x1F50  => array(0x3C5, 0x313),
        0x1F52  => array(0x3C5, 0x313, 0x300),
        0x1F54  => array(0x3C5, 0x313, 0x301),
        0x1F56  => array(0x3C5, 0x313, 0x342),
        0x1F59  => array(0x1F51),
        0x1F5B  => array(0x1F53),
        0x1F5D  => array(0x1F55),
        0x1F5F  => array(0x1F57),
        0x1F68  => array(0x1F60),
        0x1F69  => array(0x1F61),
        0x1F6A  => array(0x1F62),
        0x1F6B  => array(0x1F63),
        0x1F6C  => array(0x1F64),
        0x1F6D  => array(0x1F65),
        0x1F6E  => array(0x1F66),
        0x1F6F  => array(0x1F67),
        0x1F80  => array(0x1F00, 0x3B9),
        0x1F81  => array(0x1F01, 0x3B9),
        0x1F82  => array(0x1F02, 0x3B9),
        0x1F83  => array(0x1F03, 0x3B9),
        0x1F84  => array(0x1F04, 0x3B9),
        0x1F85  => array(0x1F05, 0x3B9),
        0x1F86  => array(0x1F06, 0x3B9),
        0x1F87  => array(0x1F07, 0x3B9),
        0x1F88  => array(0x1F00, 0x3B9),
        0x1F89  => array(0x1F01, 0x3B9),
        0x1F8A  => array(0x1F02, 0x3B9),
        0x1F8B  => array(0x1F03, 0x3B9),
        0x1F8C  => array(0x1F04, 0x3B9),
        0x1F8D  => array(0x1F05, 0x3B9),
        0x1F8E  => array(0x1F06, 0x3B9),
        0x1F8F  => array(0x1F07, 0x3B9),
        0x1F90  => array(0x1F20, 0x3B9),
        0x1F91  => array(0x1F21, 0x3B9),
        0x1F92  => array(0x1F22, 0x3B9),
        0x1F93  => array(0x1F23, 0x3B9),
        0x1F94  => array(0x1F24, 0x3B9),
        0x1F95  => array(0x1F25, 0x3B9),
        0x1F96  => array(0x1F26, 0x3B9),
        0x1F97  => array(0x1F27, 0x3B9),
        0x1F98  => array(0x1F20, 0x3B9),
        0x1F99  => array(0x1F21, 0x3B9),
        0x1F9A  => array(0x1F22, 0x3B9),
        0x1F9B  => array(0x1F23, 0x3B9),
        0x1F9C  => array(0x1F24, 0x3B9),
        0x1F9D  => array(0x1F25, 0x3B9),
        0x1F9E  => array(0x1F26, 0x3B9),
        0x1F9F  => array(0x1F27, 0x3B9),
        0x1FA0  => array(0x1F60, 0x3B9),
        0x1FA1  => array(0x1F61, 0x3B9),
        0x1FA2  => array(0x1F62, 0x3B9),
        0x1FA3  => array(0x1F63, 0x3B9),
        0x1FA4  => array(0x1F64, 0x3B9),
        0x1FA5  => array(0x1F65, 0x3B9),
        0x1FA6  => array(0x1F66, 0x3B9),
        0x1FA7  => array(0x1F67, 0x3B9),
        0x1FA8  => array(0x1F60, 0x3B9),
        0x1FA9  => array(0x1F61, 0x3B9),
        0x1FAA  => array(0x1F62, 0x3B9),
        0x1FAB  => array(0x1F63, 0x3B9),
        0x1FAC  => array(0x1F64, 0x3B9),
        0x1FAD  => array(0x1F65, 0x3B9),
        0x1FAE  => array(0x1F66, 0x3B9),
        0x1FAF  => array(0x1F67, 0x3B9),
        0x1FB2  => array(0x1F70, 0x3B9),
        0x1FB3  => array(0x3B1, 0x3B9),
        0x1FB4  => array(0x3AC, 0x3B9),
        0x1FB6  => array(0x3B1, 0x342),
        0x1FB7  => array(0x3B1, 0x342, 0x3B9),
        0x1FB8  => array(0x1FB0),
        0x1FB9  => array(0x1FB1),
        0x1FBA  => array(0x1F70),
        0x1FBB  => array(0x1F71),
        0x1FBC  => array(0x3B1, 0x3B9),
        0x1FBE  => array(0x3B9),
        0x1FC2  => array(0x1F74, 0x3B9),
        0x1FC3  => array(0x3B7, 0x3B9),
        0x1FC4  => array(0x3AE, 0x3B9),
        0x1FC6  => array(0x3B7, 0x342),
        0x1FC7  => array(0x3B7, 0x342, 0x3B9),
        0x1FC8  => array(0x1F72),
        0x1FC9  => array(0x1F73),
        0x1FCA  => array(0x1F74),
        0x1FCB  => array(0x1F75),
        0x1FCC  => array(0x3B7, 0x3B9),
        0x1FD2  => array(0x3B9, 0x308, 0x300),
        0x1FD3  => array(0x3B9, 0x308, 0x301),
        0x1FD6  => array(0x3B9, 0x342),
        0x1FD7  => array(0x3B9, 0x308, 0x342),
        0x1FD8  => array(0x1FD0),
        0x1FD9  => array(0x1FD1),
        0x1FDA  => array(0x1F76),
        0x1FDB  => array(0x1F77),
        0x1FE2  => array(0x3C5, 0x308, 0x300),
        0x1FE3  => array(0x3C5, 0x308, 0x301),
        0x1FE4  => array(0x3C1, 0x313),
        0x1FE6  => array(0x3C5, 0x342),
        0x1FE7  => array(0x3C5, 0x308, 0x342),
        0x1FE8  => array(0x1FE0),
        0x1FE9  => array(0x1FE1),
        0x1FEA  => array(0x1F7A),
        0x1FEB  => array(0x1F7B),
        0x1FEC  => array(0x1FE5),
        0x1FF2  => array(0x1F7C, 0x3B9),
        0x1FF3  => array(0x3C9, 0x3B9),
        0x1FF4  => array(0x3CE, 0x3B9),
        0x1FF6  => array(0x3C9, 0x342),
        0x1FF7  => array(0x3C9, 0x342, 0x3B9),
        0x1FF8  => array(0x1F78),
        0x1FF9  => array(0x1F79),
        0x1FFA  => array(0x1F7C),
        0x1FFB  => array(0x1F7D),
        0x1FFC  => array(0x3C9, 0x3B9),
        0x20A8  => array(0x72, 0x73),
        0x2102  => array(0x63),
        0x2103  => array(0xB0, 0x63),
        0x2107  => array(0x25B),
        0x2109  => array(0xB0, 0x66),
        0x210B  => array(0x68),
        0x210C  => array(0x68),
        0x210D  => array(0x68),
        0x2110  => array(0x69),
        0x2111  => array(0x69),
        0x2112  => array(0x6C),
        0x2115  => array(0x6E),
        0x2116  => array(0x6E, 0x6F),
        0x2119  => array(0x70),
        0x211A  => array(0x71),
        0x211B  => array(0x72),
        0x211C  => array(0x72),
        0x211D  => array(0x72),
        0x2120  => array(0x73, 0x6D),
        0x2121  => array(0x74, 0x65, 0x6C),
        0x2122  => array(0x74, 0x6D),
        0x2124  => array(0x7A),
        0x2126  => array(0x3C9),
        0x2128  => array(0x7A),
        0x212A  => array(0x6B),
        0x212B  => array(0xE5),
        0x212C  => array(0x62),
        0x212D  => array(0x63),
        0x2130  => array(0x65),
        0x2131  => array(0x66),
        0x2133  => array(0x6D),
        0x213E  => array(0x3B3),
        0x213F  => array(0x3C0),
        0x2145  => array(0x64),
        0x2160  => array(0x2170),
        0x2161  => array(0x2171),
        0x2162  => array(0x2172),
        0x2163  => array(0x2173),
        0x2164  => array(0x2174),
        0x2165  => array(0x2175),
        0x2166  => array(0x2176),
        0x2167  => array(0x2177),
        0x2168  => array(0x2178),
        0x2169  => array(0x2179),
        0x216A  => array(0x217A),
        0x216B  => array(0x217B),
        0x216C  => array(0x217C),
        0x216D  => array(0x217D),
        0x216E  => array(0x217E),
        0x216F  => array(0x217F),
        0x24B6  => array(0x24D0),
        0x24B7  => array(0x24D1),
        0x24B8  => array(0x24D2),
        0x24B9  => array(0x24D3),
        0x24BA  => array(0x24D4),
        0x24BB  => array(0x24D5),
        0x24BC  => array(0x24D6),
        0x24BD  => array(0x24D7),
        0x24BE  => array(0x24D8),
        0x24BF  => array(0x24D9),
        0x24C0  => array(0x24DA),
        0x24C1  => array(0x24DB),
        0x24C2  => array(0x24DC),
        0x24C3  => array(0x24DD),
        0x24C4  => array(0x24DE),
        0x24C5  => array(0x24DF),
        0x24C6  => array(0x24E0),
        0x24C7  => array(0x24E1),
        0x24C8  => array(0x24E2),
        0x24C9  => array(0x24E3),
        0x24CA  => array(0x24E4),
        0x24CB  => array(0x24E5),
        0x24CC  => array(0x24E6),
        0x24CD  => array(0x24E7),
        0x24CE  => array(0x24E8),
        0x24CF  => array(0x24E9),
        0x3371  => array(0x68, 0x70, 0x61),
        0x3373  => array(0x61, 0x75),
        0x3375  => array(0x6F, 0x76),
        0x3380  => array(0x70, 0x61),
        0x3381  => array(0x6E, 0x61),
        0x3382  => array(0x3BC, 0x61),
        0x3383  => array(0x6D, 0x61),
        0x3384  => array(0x6B, 0x61),
        0x3385  => array(0x6B, 0x62),
        0x3386  => array(0x6D, 0x62),
        0x3387  => array(0x67, 0x62),
        0x338A  => array(0x70, 0x66),
        0x338B  => array(0x6E, 0x66),
        0x338C  => array(0x3BC, 0x66),
        0x3390  => array(0x68, 0x7A),
        0x3391  => array(0x6B, 0x68, 0x7A),
        0x3392  => array(0x6D, 0x68, 0x7A),
        0x3393  => array(0x67, 0x68, 0x7A),
        0x3394  => array(0x74, 0x68, 0x7A),
        0x33A9  => array(0x70, 0x61),
        0x33AA  => array(0x6B, 0x70, 0x61),
        0x33AB  => array(0x6D, 0x70, 0x61),
        0x33AC  => array(0x67, 0x70, 0x61),
        0x33B4  => array(0x70, 0x76),
        0x33B5  => array(0x6E, 0x76),
        0x33B6  => array(0x3BC, 0x76),
        0x33B7  => array(0x6D, 0x76),
        0x33B8  => array(0x6B, 0x76),
        0x33B9  => array(0x6D, 0x76),
        0x33BA  => array(0x70, 0x77),
        0x33BB  => array(0x6E, 0x77),
        0x33BC  => array(0x3BC, 0x77),
        0x33BD  => array(0x6D, 0x77),
        0x33BE  => array(0x6B, 0x77),
        0x33BF  => array(0x6D, 0x77),
        0x33C0  => array(0x6B, 0x3C9),
        0x33C1  => array(0x6D, 0x3C9),
        /* 0x33C2  => array(0x61, 0x2E, 0x6D, 0x2E), */
        0x33C3  => array(0x62, 0x71),
        0x33C6  => array(0x63, 0x2215, 0x6B, 0x67),
        0x33C7  => array(0x63, 0x6F, 0x2E),
        0x33C8  => array(0x64, 0x62),
        0x33C9  => array(0x67, 0x79),
        0x33CB  => array(0x68, 0x70),
        0x33CD  => array(0x6B, 0x6B),
        0x33CE  => array(0x6B, 0x6D),
        0x33D7  => array(0x70, 0x68),
        0x33D9  => array(0x70, 0x70, 0x6D),
        0x33DA  => array(0x70, 0x72),
        0x33DC  => array(0x73, 0x76),
        0x33DD  => array(0x77, 0x62),
        0xFB00  => array(0x66, 0x66),
        0xFB01  => array(0x66, 0x69),
        0xFB02  => array(0x66, 0x6C),
        0xFB03  => array(0x66, 0x66, 0x69),
        0xFB04  => array(0x66, 0x66, 0x6C),
        0xFB05  => array(0x73, 0x74),
        0xFB06  => array(0x73, 0x74),
        0xFB13  => array(0x574, 0x576),
        0xFB14  => array(0x574, 0x565),
        0xFB15  => array(0x574, 0x56B),
        0xFB16  => array(0x57E, 0x576),
        0xFB17  => array(0x574, 0x56D),
        0xFF21  => array(0xFF41),
        0xFF22  => array(0xFF42),
        0xFF23  => array(0xFF43),
        0xFF24  => array(0xFF44),
        0xFF25  => array(0xFF45),
        0xFF26  => array(0xFF46),
        0xFF27  => array(0xFF47),
        0xFF28  => array(0xFF48),
        0xFF29  => array(0xFF49),
        0xFF2A  => array(0xFF4A),
        0xFF2B  => array(0xFF4B),
        0xFF2C  => array(0xFF4C),
        0xFF2D  => array(0xFF4D),
        0xFF2E  => array(0xFF4E),
        0xFF2F  => array(0xFF4F),
        0xFF30  => array(0xFF50),
        0xFF31  => array(0xFF51),
        0xFF32  => array(0xFF52),
        0xFF33  => array(0xFF53),
        0xFF34  => array(0xFF54),
        0xFF35  => array(0xFF55),
        0xFF36  => array(0xFF56),
        0xFF37  => array(0xFF57),
        0xFF38  => array(0xFF58),
        0xFF39  => array(0xFF59),
        0xFF3A  => array(0xFF5A),
        0x10400 => array(0x10428),
        0x10401 => array(0x10429),
        0x10402 => array(0x1042A),
        0x10403 => array(0x1042B),
        0x10404 => array(0x1042C),
        0x10405 => array(0x1042D),
        0x10406 => array(0x1042E),
        0x10407 => array(0x1042F),
        0x10408 => array(0x10430),
        0x10409 => array(0x10431),
        0x1040A => array(0x10432),
        0x1040B => array(0x10433),
        0x1040C => array(0x10434),
        0x1040D => array(0x10435),
        0x1040E => array(0x10436),
        0x1040F => array(0x10437),
        0x10410 => array(0x10438),
        0x10411 => array(0x10439),
        0x10412 => array(0x1043A),
        0x10413 => array(0x1043B),
        0x10414 => array(0x1043C),
        0x10415 => array(0x1043D),
        0x10416 => array(0x1043E),
        0x10417 => array(0x1043F),
        0x10418 => array(0x10440),
        0x10419 => array(0x10441),
        0x1041A => array(0x10442),
        0x1041B => array(0x10443),
        0x1041C => array(0x10444),
        0x1041D => array(0x10445),
        0x1041E => array(0x10446),
        0x1041F => array(0x10447),
        0x10420 => array(0x10448),
        0x10421 => array(0x10449),
        0x10422 => array(0x1044A),
        0x10423 => array(0x1044B),
        0x10424 => array(0x1044C),
        0x10425 => array(0x1044D),
        0x1D400 => array(0x61),
        0x1D401 => array(0x62),
        0x1D402 => array(0x63),
        0x1D403 => array(0x64),
        0x1D404 => array(0x65),
        0x1D405 => array(0x66),
        0x1D406 => array(0x67),
        0x1D407 => array(0x68),
        0x1D408 => array(0x69),
        0x1D409 => array(0x6A),
        0x1D40A => array(0x6B),
        0x1D40B => array(0x6C),
        0x1D40C => array(0x6D),
        0x1D40D => array(0x6E),
        0x1D40E => array(0x6F),
        0x1D40F => array(0x70),
        0x1D410 => array(0x71),
        0x1D411 => array(0x72),
        0x1D412 => array(0x73),
        0x1D413 => array(0x74),
        0x1D414 => array(0x75),
        0x1D415 => array(0x76),
        0x1D416 => array(0x77),
        0x1D417 => array(0x78),
        0x1D418 => array(0x79),
        0x1D419 => array(0x7A),
        0x1D434 => array(0x61),
        0x1D435 => array(0x62),
        0x1D436 => array(0x63),
        0x1D437 => array(0x64),
        0x1D438 => array(0x65),
        0x1D439 => array(0x66),
        0x1D43A => array(0x67),
        0x1D43B => array(0x68),
        0x1D43C => array(0x69),
        0x1D43D => array(0x6A),
        0x1D43E => array(0x6B),
        0x1D43F => array(0x6C),
        0x1D440 => array(0x6D),
        0x1D441 => array(0x6E),
        0x1D442 => array(0x6F),
        0x1D443 => array(0x70),
        0x1D444 => array(0x71),
        0x1D445 => array(0x72),
        0x1D446 => array(0x73),
        0x1D447 => array(0x74),
        0x1D448 => array(0x75),
        0x1D449 => array(0x76),
        0x1D44A => array(0x77),
        0x1D44B => array(0x78),
        0x1D44C => array(0x79),
        0x1D44D => array(0x7A),
        0x1D468 => array(0x61),
        0x1D469 => array(0x62),
        0x1D46A => array(0x63),
        0x1D46B => array(0x64),
        0x1D46C => array(0x65),
        0x1D46D => array(0x66),
        0x1D46E => array(0x67),
        0x1D46F => array(0x68),
        0x1D470 => array(0x69),
        0x1D471 => array(0x6A),
        0x1D472 => array(0x6B),
        0x1D473 => array(0x6C),
        0x1D474 => array(0x6D),
        0x1D475 => array(0x6E),
        0x1D476 => array(0x6F),
        0x1D477 => array(0x70),
        0x1D478 => array(0x71),
        0x1D479 => array(0x72),
        0x1D47A => array(0x73),
        0x1D47B => array(0x74),
        0x1D47C => array(0x75),
        0x1D47D => array(0x76),
        0x1D47E => array(0x77),
        0x1D47F => array(0x78),
        0x1D480 => array(0x79),
        0x1D481 => array(0x7A),
        0x1D49C => array(0x61),
        0x1D49E => array(0x63),
        0x1D49F => array(0x64),
        0x1D4A2 => array(0x67),
        0x1D4A5 => array(0x6A),
        0x1D4A6 => array(0x6B),
        0x1D4A9 => array(0x6E),
        0x1D4AA => array(0x6F),
        0x1D4AB => array(0x70),
        0x1D4AC => array(0x71),
        0x1D4AE => array(0x73),
        0x1D4AF => array(0x74),
        0x1D4B0 => array(0x75),
        0x1D4B1 => array(0x76),
        0x1D4B2 => array(0x77),
        0x1D4B3 => array(0x78),
        0x1D4B4 => array(0x79),
        0x1D4B5 => array(0x7A),
        0x1D4D0 => array(0x61),
        0x1D4D1 => array(0x62),
        0x1D4D2 => array(0x63),
        0x1D4D3 => array(0x64),
        0x1D4D4 => array(0x65),
        0x1D4D5 => array(0x66),
        0x1D4D6 => array(0x67),
        0x1D4D7 => array(0x68),
        0x1D4D8 => array(0x69),
        0x1D4D9 => array(0x6A),
        0x1D4DA => array(0x6B),
        0x1D4DB => array(0x6C),
        0x1D4DC => array(0x6D),
        0x1D4DD => array(0x6E),
        0x1D4DE => array(0x6F),
        0x1D4DF => array(0x70),
        0x1D4E0 => array(0x71),
        0x1D4E1 => array(0x72),
        0x1D4E2 => array(0x73),
        0x1D4E3 => array(0x74),
        0x1D4E4 => array(0x75),
        0x1D4E5 => array(0x76),
        0x1D4E6 => array(0x77),
        0x1D4E7 => array(0x78),
        0x1D4E8 => array(0x79),
        0x1D4E9 => array(0x7A),
        0x1D504 => array(0x61),
        0x1D505 => array(0x62),
        0x1D507 => array(0x64),
        0x1D508 => array(0x65),
        0x1D509 => array(0x66),
        0x1D50A => array(0x67),
        0x1D50D => array(0x6A),
        0x1D50E => array(0x6B),
        0x1D50F => array(0x6C),
        0x1D510 => array(0x6D),
        0x1D511 => array(0x6E),
        0x1D512 => array(0x6F),
        0x1D513 => array(0x70),
        0x1D514 => array(0x71),
        0x1D516 => array(0x73),
        0x1D517 => array(0x74),
        0x1D518 => array(0x75),
        0x1D519 => array(0x76),
        0x1D51A => array(0x77),
        0x1D51B => array(0x78),
        0x1D51C => array(0x79),
        0x1D538 => array(0x61),
        0x1D539 => array(0x62),
        0x1D53B => array(0x64),
        0x1D53C => array(0x65),
        0x1D53D => array(0x66),
        0x1D53E => array(0x67),
        0x1D540 => array(0x69),
        0x1D541 => array(0x6A),
        0x1D542 => array(0x6B),
        0x1D543 => array(0x6C),
        0x1D544 => array(0x6D),
        0x1D546 => array(0x6F),
        0x1D54A => array(0x73),
        0x1D54B => array(0x74),
        0x1D54C => array(0x75),
        0x1D54D => array(0x76),
        0x1D54E => array(0x77),
        0x1D54F => array(0x78),
        0x1D550 => array(0x79),
        0x1D56C => array(0x61),
        0x1D56D => array(0x62),
        0x1D56E => array(0x63),
        0x1D56F => array(0x64),
        0x1D570 => array(0x65),
        0x1D571 => array(0x66),
        0x1D572 => array(0x67),
        0x1D573 => array(0x68),
        0x1D574 => array(0x69),
        0x1D575 => array(0x6A),
        0x1D576 => array(0x6B),
        0x1D577 => array(0x6C),
        0x1D578 => array(0x6D),
        0x1D579 => array(0x6E),
        0x1D57A => array(0x6F),
        0x1D57B => array(0x70),
        0x1D57C => array(0x71),
        0x1D57D => array(0x72),
        0x1D57E => array(0x73),
        0x1D57F => array(0x74),
        0x1D580 => array(0x75),
        0x1D581 => array(0x76),
        0x1D582 => array(0x77),
        0x1D583 => array(0x78),
        0x1D584 => array(0x79),
        0x1D585 => array(0x7A),
        0x1D5A0 => array(0x61),
        0x1D5A1 => array(0x62),
        0x1D5A2 => array(0x63),
        0x1D5A3 => array(0x64),
        0x1D5A4 => array(0x65),
        0x1D5A5 => array(0x66),
        0x1D5A6 => array(0x67),
        0x1D5A7 => array(0x68),
        0x1D5A8 => array(0x69),
        0x1D5A9 => array(0x6A),
        0x1D5AA => array(0x6B),
        0x1D5AB => array(0x6C),
        0x1D5AC => array(0x6D),
        0x1D5AD => array(0x6E),
        0x1D5AE => array(0x6F),
        0x1D5AF => array(0x70),
        0x1D5B0 => array(0x71),
        0x1D5B1 => array(0x72),
        0x1D5B2 => array(0x73),
        0x1D5B3 => array(0x74),
        0x1D5B4 => array(0x75),
        0x1D5B5 => array(0x76),
        0x1D5B6 => array(0x77),
        0x1D5B7 => array(0x78),
        0x1D5B8 => array(0x79),
        0x1D5B9 => array(0x7A),
        0x1D5D4 => array(0x61),
        0x1D5D5 => array(0x62),
        0x1D5D6 => array(0x63),
        0x1D5D7 => array(0x64),
        0x1D5D8 => array(0x65),
        0x1D5D9 => array(0x66),
        0x1D5DA => array(0x67),
        0x1D5DB => array(0x68),
        0x1D5DC => array(0x69),
        0x1D5DD => array(0x6A),
        0x1D5DE => array(0x6B),
        0x1D5DF => array(0x6C),
        0x1D5E0 => array(0x6D),
        0x1D5E1 => array(0x6E),
        0x1D5E2 => array(0x6F),
        0x1D5E3 => array(0x70),
        0x1D5E4 => array(0x71),
        0x1D5E5 => array(0x72),
        0x1D5E6 => array(0x73),
        0x1D5E7 => array(0x74),
        0x1D5E8 => array(0x75),
        0x1D5E9 => array(0x76),
        0x1D5EA => array(0x77),
        0x1D5EB => array(0x78),
        0x1D5EC => array(0x79),
        0x1D5ED => array(0x7A),
        0x1D608 => array(0x61),
        0x1D609 => array(0x62),
        0x1D60A => array(0x63),
        0x1D60B => array(0x64),
        0x1D60C => array(0x65),
        0x1D60D => array(0x66),
        0x1D60E => array(0x67),
        0x1D60F => array(0x68),
        0x1D610 => array(0x69),
        0x1D611 => array(0x6A),
        0x1D612 => array(0x6B),
        0x1D613 => array(0x6C),
        0x1D614 => array(0x6D),
        0x1D615 => array(0x6E),
        0x1D616 => array(0x6F),
        0x1D617 => array(0x70),
        0x1D618 => array(0x71),
        0x1D619 => array(0x72),
        0x1D61A => array(0x73),
        0x1D61B => array(0x74),
        0x1D61C => array(0x75),
        0x1D61D => array(0x76),
        0x1D61E => array(0x77),
        0x1D61F => array(0x78),
        0x1D620 => array(0x79),
        0x1D621 => array(0x7A),
        0x1D63C => array(0x61),
        0x1D63D => array(0x62),
        0x1D63E => array(0x63),
        0x1D63F => array(0x64),
        0x1D640 => array(0x65),
        0x1D641 => array(0x66),
        0x1D642 => array(0x67),
        0x1D643 => array(0x68),
        0x1D644 => array(0x69),
        0x1D645 => array(0x6A),
        0x1D646 => array(0x6B),
        0x1D647 => array(0x6C),
        0x1D648 => array(0x6D),
        0x1D649 => array(0x6E),
        0x1D64A => array(0x6F),
        0x1D64B => array(0x70),
        0x1D64C => array(0x71),
        0x1D64D => array(0x72),
        0x1D64E => array(0x73),
        0x1D64F => array(0x74),
        0x1D650 => array(0x75),
        0x1D651 => array(0x76),
        0x1D652 => array(0x77),
        0x1D653 => array(0x78),
        0x1D654 => array(0x79),
        0x1D655 => array(0x7A),
        0x1D670 => array(0x61),
        0x1D671 => array(0x62),
        0x1D672 => array(0x63),
        0x1D673 => array(0x64),
        0x1D674 => array(0x65),
        0x1D675 => array(0x66),
        0x1D676 => array(0x67),
        0x1D677 => array(0x68),
        0x1D678 => array(0x69),
        0x1D679 => array(0x6A),
        0x1D67A => array(0x6B),
        0x1D67B => array(0x6C),
        0x1D67C => array(0x6D),
        0x1D67D => array(0x6E),
        0x1D67E => array(0x6F),
        0x1D67F => array(0x70),
        0x1D680 => array(0x71),
        0x1D681 => array(0x72),
        0x1D682 => array(0x73),
        0x1D683 => array(0x74),
        0x1D684 => array(0x75),
        0x1D685 => array(0x76),
        0x1D686 => array(0x77),
        0x1D687 => array(0x78),
        0x1D688 => array(0x79),
        0x1D689 => array(0x7A),
        0x1D6A8 => array(0x3B1),
        0x1D6A9 => array(0x3B2),
        0x1D6AA => array(0x3B3),
        0x1D6AB => array(0x3B4),
        0x1D6AC => array(0x3B5),
        0x1D6AD => array(0x3B6),
        0x1D6AE => array(0x3B7),
        0x1D6AF => array(0x3B8),
        0x1D6B0 => array(0x3B9),
        0x1D6B1 => array(0x3BA),
        0x1D6B2 => array(0x3BB),
        0x1D6B3 => array(0x3BC),
        0x1D6B4 => array(0x3BD),
        0x1D6B5 => array(0x3BE),
        0x1D6B6 => array(0x3BF),
        0x1D6B7 => array(0x3C0),
        0x1D6B8 => array(0x3C1),
        0x1D6B9 => array(0x3B8),
        0x1D6BA => array(0x3C3),
        0x1D6BB => array(0x3C4),
        0x1D6BC => array(0x3C5),
        0x1D6BD => array(0x3C6),
        0x1D6BE => array(0x3C7),
        0x1D6BF => array(0x3C8),
        0x1D6C0 => array(0x3C9),
        0x1D6D3 => array(0x3C3),
        0x1D6E2 => array(0x3B1),
        0x1D6E3 => array(0x3B2),
        0x1D6E4 => array(0x3B3),
        0x1D6E5 => array(0x3B4),
        0x1D6E6 => array(0x3B5),
        0x1D6E7 => array(0x3B6),
        0x1D6E8 => array(0x3B7),
        0x1D6E9 => array(0x3B8),
        0x1D6EA => array(0x3B9),
        0x1D6EB => array(0x3BA),
        0x1D6EC => array(0x3BB),
        0x1D6ED => array(0x3BC),
        0x1D6EE => array(0x3BD),
        0x1D6EF => array(0x3BE),
        0x1D6F0 => array(0x3BF),
        0x1D6F1 => array(0x3C0),
        0x1D6F2 => array(0x3C1),
        0x1D6F3 => array(0x3B8),
        0x1D6F4 => array(0x3C3),
        0x1D6F5 => array(0x3C4),
        0x1D6F6 => array(0x3C5),
        0x1D6F7 => array(0x3C6),
        0x1D6F8 => array(0x3C7),
        0x1D6F9 => array(0x3C8),
        0x1D6FA => array(0x3C9),
        0x1D70D => array(0x3C3),
        0x1D71C => array(0x3B1),
        0x1D71D => array(0x3B2),
        0x1D71E => array(0x3B3),
        0x1D71F => array(0x3B4),
        0x1D720 => array(0x3B5),
        0x1D721 => array(0x3B6),
        0x1D722 => array(0x3B7),
        0x1D723 => array(0x3B8),
        0x1D724 => array(0x3B9),
        0x1D725 => array(0x3BA),
        0x1D726 => array(0x3BB),
        0x1D727 => array(0x3BC),
        0x1D728 => array(0x3BD),
        0x1D729 => array(0x3BE),
        0x1D72A => array(0x3BF),
        0x1D72B => array(0x3C0),
        0x1D72C => array(0x3C1),
        0x1D72D => array(0x3B8),
        0x1D72E => array(0x3C3),
        0x1D72F => array(0x3C4),
        0x1D730 => array(0x3C5),
        0x1D731 => array(0x3C6),
        0x1D732 => array(0x3C7),
        0x1D733 => array(0x3C8),
        0x1D734 => array(0x3C9),
        0x1D747 => array(0x3C3),
        0x1D756 => array(0x3B1),
        0x1D757 => array(0x3B2),
        0x1D758 => array(0x3B3),
        0x1D759 => array(0x3B4),
        0x1D75A => array(0x3B5),
        0x1D75B => array(0x3B6),
        0x1D75C => array(0x3B7),
        0x1D75D => array(0x3B8),
        0x1D75E => array(0x3B9),
        0x1D75F => array(0x3BA),
        0x1D760 => array(0x3BB),
        0x1D761 => array(0x3BC),
        0x1D762 => array(0x3BD),
        0x1D763 => array(0x3BE),
        0x1D764 => array(0x3BF),
        0x1D765 => array(0x3C0),
        0x1D766 => array(0x3C1),
        0x1D767 => array(0x3B8),
        0x1D768 => array(0x3C3),
        0x1D769 => array(0x3C4),
        0x1D76A => array(0x3C5),
        0x1D76B => array(0x3C6),
        0x1D76C => array(0x3C7),
        0x1D76D => array(0x3C8),
        0x1D76E => array(0x3C9),
        0x1D781 => array(0x3C3),
        0x1D790 => array(0x3B1),
        0x1D791 => array(0x3B2),
        0x1D792 => array(0x3B3),
        0x1D793 => array(0x3B4),
        0x1D794 => array(0x3B5),
        0x1D795 => array(0x3B6),
        0x1D796 => array(0x3B7),
        0x1D797 => array(0x3B8),
        0x1D798 => array(0x3B9),
        0x1D799 => array(0x3BA),
        0x1D79A => array(0x3BB),
        0x1D79B => array(0x3BC),
        0x1D79C => array(0x3BD),
        0x1D79D => array(0x3BE),
        0x1D79E => array(0x3BF),
        0x1D79F => array(0x3C0),
        0x1D7A0 => array(0x3C1),
        0x1D7A1 => array(0x3B8),
        0x1D7A2 => array(0x3C3),
        0x1D7A3 => array(0x3C4),
        0x1D7A4 => array(0x3C5),
        0x1D7A5 => array(0x3C6),
        0x1D7A6 => array(0x3C7),
        0x1D7A7 => array(0x3C8),
        0x1D7A8 => array(0x3C9),
        0x1D7BB => array(0x3C3),
        0x3F9   => array(0x3C3),
        0x1D2C  => array(0x61),
        0x1D2D  => array(0xE6),
        0x1D2E  => array(0x62),
        0x1D30  => array(0x64),
        0x1D31  => array(0x65),
        0x1D32  => array(0x1DD),
        0x1D33  => array(0x67),
        0x1D34  => array(0x68),
        0x1D35  => array(0x69),
        0x1D36  => array(0x6A),
        0x1D37  => array(0x6B),
        0x1D38  => array(0x6C),
        0x1D39  => array(0x6D),
        0x1D3A  => array(0x6E),
        0x1D3C  => array(0x6F),
        0x1D3D  => array(0x223),
        0x1D3E  => array(0x70),
        0x1D3F  => array(0x72),
        0x1D40  => array(0x74),
        0x1D41  => array(0x75),
        0x1D42  => array(0x77),
        0x213B  => array(0x66, 0x61, 0x78),
        0x3250  => array(0x70, 0x74, 0x65),
        0x32CC  => array(0x68, 0x67),
        0x32CE  => array(0x65, 0x76),
        0x32CF  => array(0x6C, 0x74, 0x64),
        0x337A  => array(0x69, 0x75),
        0x33DE  => array(0x76, 0x2215, 0x6D),
        0x33DF  => array(0x61, 0x2215, 0x6D)
    );

    /**
     * Normalization Combining Classes; Code Points not listed
     * got Combining Class 0.
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_norm_combcls = array(
        0x334   => 1,
        0x335   => 1,
        0x336   => 1,
        0x337   => 1,
        0x338   => 1,
        0x93C   => 7,
        0x9BC   => 7,
        0xA3C   => 7,
        0xABC   => 7,
        0xB3C   => 7,
        0xCBC   => 7,
        0x1037  => 7,
        0x3099  => 8,
        0x309A  => 8,
        0x94D   => 9,
        0x9CD   => 9,
        0xA4D   => 9,
        0xACD   => 9,
        0xB4D   => 9,
        0xBCD   => 9,
        0xC4D   => 9,
        0xCCD   => 9,
        0xD4D   => 9,
        0xDCA   => 9,
        0xE3A   => 9,
        0xF84   => 9,
        0x1039  => 9,
        0x1714  => 9,
        0x1734  => 9,
        0x17D2  => 9,
        0x5B0   => 10,
        0x5B1   => 11,
        0x5B2   => 12,
        0x5B3   => 13,
        0x5B4   => 14,
        0x5B5   => 15,
        0x5B6   => 16,
        0x5B7   => 17,
        0x5B8   => 18,
        0x5B9   => 19,
        0x5BB   => 20,
        0x5Bc   => 21,
        0x5BD   => 22,
        0x5BF   => 23,
        0x5C1   => 24,
        0x5C2   => 25,
        0xFB1E  => 26,
        0x64B   => 27,
        0x64C   => 28,
        0x64D   => 29,
        0x64E   => 30,
        0x64F   => 31,
        0x650   => 32,
        0x651   => 33,
        0x652   => 34,
        0x670   => 35,
        0x711   => 36,
        0xC55   => 84,
        0xC56   => 91,
        0xE38   => 103,
        0xE39   => 103,
        0xE48   => 107,
        0xE49   => 107,
        0xE4A   => 107,
        0xE4B   => 107,
        0xEB8   => 118,
        0xEB9   => 118,
        0xEC8   => 122,
        0xEC9   => 122,
        0xECA   => 122,
        0xECB   => 122,
        0xF71   => 129,
        0xF72   => 130,
        0xF7A   => 130,
        0xF7B   => 130,
        0xF7C   => 130,
        0xF7D   => 130,
        0xF80   => 130,
        0xF74   => 132,
        0x321   => 202,
        0x322   => 202,
        0x327   => 202,
        0x328   => 202,
        0x31B   => 216,
        0xF39   => 216,
        0x1D165 => 216,
        0x1D166 => 216,
        0x1D16E => 216,
        0x1D16F => 216,
        0x1D170 => 216,
        0x1D171 => 216,
        0x1D172 => 216,
        0x302A  => 218,
        0x316   => 220,
        0x317   => 220,
        0x318   => 220,
        0x319   => 220,
        0x31C   => 220,
        0x31D   => 220,
        0x31E   => 220,
        0x31F   => 220,
        0x320   => 220,
        0x323   => 220,
        0x324   => 220,
        0x325   => 220,
        0x326   => 220,
        0x329   => 220,
        0x32A   => 220,
        0x32B   => 220,
        0x32C   => 220,
        0x32D   => 220,
        0x32E   => 220,
        0x32F   => 220,
        0x330   => 220,
        0x331   => 220,
        0x332   => 220,
        0x333   => 220,
        0x339   => 220,
        0x33A   => 220,
        0x33B   => 220,
        0x33C   => 220,
        0x347   => 220,
        0x348   => 220,
        0x349   => 220,
        0x34D   => 220,
        0x34E   => 220,
        0x353   => 220,
        0x354   => 220,
        0x355   => 220,
        0x356   => 220,
        0x591   => 220,
        0x596   => 220,
        0x59B   => 220,
        0x5A3   => 220,
        0x5A4   => 220,
        0x5A5   => 220,
        0x5A6   => 220,
        0x5A7   => 220,
        0x5AA   => 220,
        0x655   => 220,
        0x656   => 220,
        0x6E3   => 220,
        0x6EA   => 220,
        0x6ED   => 220,
        0x731   => 220,
        0x734   => 220,
        0x737   => 220,
        0x738   => 220,
        0x739   => 220,
        0x73B   => 220,
        0x73C   => 220,
        0x73E   => 220,
        0x742   => 220,
        0x744   => 220,
        0x746   => 220,
        0x748   => 220,
        0x952   => 220,
        0xF18   => 220,
        0xF19   => 220,
        0xF35   => 220,
        0xF37   => 220,
        0xFC6   => 220,
        0x193B  => 220,
        0x20E8  => 220,
        0x1D17B => 220,
        0x1D17C => 220,
        0x1D17D => 220,
        0x1D17E => 220,
        0x1D17F => 220,
        0x1D180 => 220,
        0x1D181 => 220,
        0x1D182 => 220,
        0x1D18A => 220,
        0x1D18B => 220,
        0x59A   => 222,
        0x5AD   => 222,
        0x1929  => 222,
        0x302D  => 222,
        0x302E  => 224,
        0x302F  => 224,
        0x1D16D => 226,
        0x5AE   => 228,
        0x18A9  => 228,
        0x302B  => 228,
        0x300   => 230,
        0x301   => 230,
        0x302   => 230,
        0x303   => 230,
        0x304   => 230,
        0x305   => 230,
        0x306   => 230,
        0x307   => 230,
        0x308   => 230,
        0x309   => 230,
        0x30A   => 230,
        0x30B   => 230,
        0x30C   => 230,
        0x30D   => 230,
        0x30E   => 230,
        0x30F   => 230,
        0x310   => 230,
        0x311   => 230,
        0x312   => 230,
        0x313   => 230,
        0x314   => 230,
        0x33D   => 230,
        0x33E   => 230,
        0x33F   => 230,
        0x340   => 230,
        0x341   => 230,
        0x342   => 230,
        0x343   => 230,
        0x344   => 230,
        0x346   => 230,
        0x34A   => 230,
        0x34B   => 230,
        0x34C   => 230,
        0x350   => 230,
        0x351   => 230,
        0x352   => 230,
        0x357   => 230,
        0x363   => 230,
        0x364   => 230,
        0x365   => 230,
        0x366   => 230,
        0x367   => 230,
        0x368   => 230,
        0x369   => 230,
        0x36A   => 230,
        0x36B   => 230,
        0x36C   => 230,
        0x36D   => 230,
        0x36E   => 230,
        0x36F   => 230,
        0x483   => 230,
        0x484   => 230,
        0x485   => 230,
        0x486   => 230,
        0x592   => 230,
        0x593   => 230,
        0x594   => 230,
        0x595   => 230,
        0x597   => 230,
        0x598   => 230,
        0x599   => 230,
        0x59C   => 230,
        0x59D   => 230,
        0x59E   => 230,
        0x59F   => 230,
        0x5A0   => 230,
        0x5A1   => 230,
        0x5A8   => 230,
        0x5A9   => 230,
        0x5AB   => 230,
        0x5AC   => 230,
        0x5AF   => 230,
        0x5C4   => 230,
        0x610   => 230,
        0x611   => 230,
        0x612   => 230,
        0x613   => 230,
        0x614   => 230,
        0x615   => 230,
        0x653   => 230,
        0x654   => 230,
        0x657   => 230,
        0x658   => 230,
        0x6D6   => 230,
        0x6D7   => 230,
        0x6D8   => 230,
        0x6D9   => 230,
        0x6DA   => 230,
        0x6DB   => 230,
        0x6DC   => 230,
        0x6DF   => 230,
        0x6E0   => 230,
        0x6E1   => 230,
        0x6E2   => 230,
        0x6E4   => 230,
        0x6E7   => 230,
        0x6E8   => 230,
        0x6EB   => 230,
        0x6EC   => 230,
        0x730   => 230,
        0x732   => 230,
        0x733   => 230,
        0x735   => 230,
        0x736   => 230,
        0x73A   => 230,
        0x73D   => 230,
        0x73F   => 230,
        0x740   => 230,
        0x741   => 230,
        0x743   => 230,
        0x745   => 230,
        0x747   => 230,
        0x749   => 230,
        0x74A   => 230,
        0x951   => 230,
        0x953   => 230,
        0x954   => 230,
        0xF82   => 230,
        0xF83   => 230,
        0xF86   => 230,
        0xF87   => 230,
        0x170D  => 230,
        0x193A  => 230,
        0x20D0  => 230,
        0x20D1  => 230,
        0x20D4  => 230,
        0x20D5  => 230,
        0x20D6  => 230,
        0x20D7  => 230,
        0x20DB  => 230,
        0x20DC  => 230,
        0x20E1  => 230,
        0x20E7  => 230,
        0x20E9  => 230,
        0xFE20  => 230,
        0xFE21  => 230,
        0xFE22  => 230,
        0xFE23  => 230,
        0x1D185 => 230,
        0x1D186 => 230,
        0x1D187 => 230,
        0x1D189 => 230,
        0x1D188 => 230,
        0x1D1AA => 230,
        0x1D1AB => 230,
        0x1D1AC => 230,
        0x1D1AD => 230,
        0x315   => 232,
        0x31A   => 232,
        0x302C  => 232,
        0x35F   => 233,
        0x362   => 233,
        0x35D   => 234,
        0x35E   => 234,
        0x360   => 234,
        0x361   => 234,
        0x345   => 240
    );
    // }}}

    // {{{ properties
    /**
     * @var string
     * @access private
     */
    private $_punycode_prefix = 'xn--';

    /**
     * @access private
     */
    private $_invalid_ucs = 0x80000000;

    /**
     * @access private
     */
    private $_max_ucs = 0x10FFFF;

    /**
     * @var int
     * @access private
     */
    private $_base = 36;

    /**
     * @var int
     * @access private
     */
    private $_tmin = 1;

    /**
     * @var int
     * @access private
     */
    private $_tmax = 26;

    /**
     * @var int
     * @access private
     */
    private $_skew = 38;

    /**
     * @var int
     * @access private
     */
    private $_damp = 700;

    /**
     * @var int
     * @access private
     */
    private $_initial_bias = 72;

    /**
     * @var int
     * @access private
     */
    private $_initial_n = 0x80;

    /**
     * @var int
     * @access private
     */
    private $_slast;

    /**
     * @access private
     */
    private $_sbase = 0xAC00;

    /**
     * @access private
     */
    private $_lbase = 0x1100;

    /**
     * @access private
     */
    private $_vbase = 0x1161;

    /**
     * @access private
     */
    private $_tbase = 0x11a7;

    /**
     * @var int
     * @access private
     */
    private $_lcount = 19;

    /**
     * @var int
     * @access private
     */
    private $_vcount = 21;

    /**
     * @var int
     * @access private
     */
    private $_tcount = 28;

    /**
     * vcount * tcount
     *
     * @var int
     * @access private
     */
    private $_ncount = 588;

    /**
     * lcount * tcount * vcount
     *
     * @var int
     * @access private
     */
    private $_scount = 11172;

    /**
     * Default encoding for encode()'s input and decode()'s output is UTF-8;
     * Other possible encodings are ucs4_string and ucs4_array
     * See {@link setParams()} for how to select these
     *
     * @var bool
     * @access private
     */
    private $_api_encoding = 'utf8';

    /**
     * Overlong UTF-8 encodings are forbidden
     *
     * @var bool
     * @access private
     */
    private $_allow_overlong = false;

    /**
     * Behave strict or not
     *
     * @var bool
     * @access private
     */
    private $_strict_mode = false;

    /**
     * IDNA-version to use
     *
     * Values are "2003" and "2008".
     * Defaults to "2003", since that was the original version and for
     * compatibility with previous versions of this library.
     * If you need to encode "new" characters like the German "Eszett",
     * please switch to 2008 first before encoding.
     *
     * @var bool
     * @access private
     */
    private $_version = '2003';

    /**
     * Cached value indicating whether or not mbstring function overloading is
     * on for strlen
     *
     * This is cached for optimal performance.
     *
     * @var boolean
     * @see Net_IDNA2::_byteLength()
     */
    private static $_mb_string_overload = null;
    // }}}


    // {{{ constructor
    /**
     * Constructor
     *
     * @param array $options Options to initialise the object with
     *
     * @access public
     * @see    setParams()
     */
    public function __construct($options = null)
    {
        $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;

        if (is_array($options)) {
            $this->setParams($options);
        }

        // populate mbstring overloading cache if not set
        if (self::$_mb_string_overload === null) {
            self::$_mb_string_overload = (extension_loaded('mbstring')
                && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
        }
    }
    // }}}


    /**
     * Sets a new option value. Available options and values:
     *
     * [utf8 -     Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false
     *             otherwise); The output is always UTF-8]
     * [overlong - Unicode does not allow unnecessarily long encodings of chars,
     *             to allow this, set this parameter to true, else to false;
     *             default is false.]
     * [strict -   true: strict mode, good for registration purposes - Causes errors
     *             on failures; false: loose mode, ideal for "wildlife" applications
     *             by silently ignoring errors and returning the original input instead]
     *
     * @param mixed  $option Parameter to set (string: single parameter; array of Parameter => Value pairs)
     * @param string $value  Value to use (if parameter 1 is a string)
     *
     * @return boolean       true on success, false otherwise
     * @access public
     */
    public function setParams($option, $value = false)
    {
        if (!is_array($option)) {
            $option = array($option => $value);
        }

        foreach ($option as $k => $v) {
            switch ($k) {
            case 'encoding':
                switch ($v) {
                case 'utf8':
                case 'ucs4_string':
                case 'ucs4_array':
                    $this->_api_encoding = $v;
                    break;

                default:
                    throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k);
                }

                break;

            case 'overlong':
                $this->_allow_overlong = ($v) ? true : false;
                break;

            case 'strict':
                $this->_strict_mode = ($v) ? true : false;
                break;

            case 'version':
                if (in_array($v, array('2003', '2008'))) {
                    $this->_version = $v;
                } else {
                    throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k);
                }
                break;

            default:
                return false;
            }
        }

        return true;
    }

    /**
     * Encode a given UTF-8 domain name.
     *
     * @param string $decoded           Domain name (UTF-8 or UCS-4)
     * @param string $one_time_encoding Desired input encoding, see {@link set_parameter}
     *                                  If not given will use default-encoding
     *
     * @return string Encoded Domain name (ACE string)
     * @return mixed  processed string
     * @throws Exception
     * @access public
     */
    public function encode($decoded, $one_time_encoding = false)
    {
        // Forcing conversion of input to UCS4 array
        // If one time encoding is given, use this, else the objects property
        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
        case 'utf8':
            $decoded = $this->_utf8_to_ucs4($decoded);
            break;
        case 'ucs4_string':
            $decoded = $this->_ucs4_string_to_ucs4($decoded);
        case 'ucs4_array': // No break; before this line. Catch case, but do nothing
            break;
        default:
            throw new InvalidArgumentException('Unsupported input format');
        }

        // No input, no output, what else did you expect?
        if (empty($decoded)) return '';

        // Anchors for iteration
        $last_begin = 0;
        // Output string
        $output = '';

        foreach ($decoded as $k => $v) {
            // Make sure to use just the plain dot
            switch($v) {
            case 0x3002:
            case 0xFF0E:
            case 0xFF61:
                $decoded[$k] = 0x2E;
                // It's right, no break here
                // The codepoints above have to be converted to dots anyway

            // Stumbling across an anchoring character
            case 0x2E:
            case 0x2F:
            case 0x3A:
            case 0x3F:
            case 0x40:
                // Neither email addresses nor URLs allowed in strict mode
                if ($this->_strict_mode) {
                    throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.');
                }
                // Skip first char
                if ($k) {
                    $encoded = '';
                    $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
                    if ($encoded) {
                        $output .= $encoded;
                    } else {
                        $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
                    }
                    $output .= chr($decoded[$k]);
                }
                $last_begin = $k + 1;
            }
        }
        // Catch the rest of the string
        if ($last_begin) {
            $inp_len = sizeof($decoded);
            $encoded = '';
            $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
            if ($encoded) {
                $output .= $encoded;
            } else {
                $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
            }
            return $output;
        }

        if ($output = $this->_encode($decoded)) {
            return $output;
        }

        return $this->_ucs4_to_utf8($decoded);
    }

    /**
     * Decode a given ACE domain name.
     *
     * @param string $input             Domain name (ACE string)
     * @param string $one_time_encoding Desired output encoding, see {@link set_parameter}
     *
     * @return string                   Decoded Domain name (UTF-8 or UCS-4)
     * @throws Exception
     * @access public
     */
    public function decode($input, $one_time_encoding = false)
    {
        // Optionally set
        if ($one_time_encoding) {
            switch ($one_time_encoding) {
            case 'utf8':
            case 'ucs4_string':
            case 'ucs4_array':
                break;
            default:
                throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding);
            }
        }
        // Make sure to drop any newline characters around
        $input = trim($input);

        // Negotiate input and try to determine, whether it is a plain string,
        // an email address or something like a complete URL
        if (strpos($input, '@')) { // Maybe it is an email address
            // No no in strict mode
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode');
            }
            list($email_pref, $input) = explode('@', $input, 2);
            $arr = explode('.', $input);
            foreach ($arr as $k => $v) {
                $conv = $this->_decode($v);
                if ($conv) $arr[$k] = $conv;
            }
            $return = $email_pref . '@' . join('.', $arr);
        } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
            // No no in strict mode
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode');
            }

            $parsed = parse_url($input);
            if (isset($parsed['host'])) {
                $arr = explode('.', $parsed['host']);
                foreach ($arr as $k => $v) {
                    $conv = $this->_decode($v);
                    if ($conv) $arr[$k] = $conv;
                }
                $parsed['host'] = join('.', $arr);
                if (isset($parsed['scheme'])) {
                    $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://';
                }
                $return = $this->_unparse_url($parsed);
            } else { // parse_url seems to have failed, try without it
                $arr = explode('.', $input);
                foreach ($arr as $k => $v) {
                    $conv = $this->_decode($v);
                    if ($conv) $arr[$k] = $conv;
                }
                $return = join('.', $arr);
            }
        } else { // Otherwise we consider it being a pure domain name string
            $return = $this->_decode($input);
        }
        // The output is UTF-8 by default, other output formats need conversion here
        // If one time encoding is given, use this, else the objects property
        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
        case 'utf8':
            return $return;
            break;
        case 'ucs4_string':
            return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
            break;
        case 'ucs4_array':
            return $this->_utf8_to_ucs4($return);
            break;
        default:
            throw new InvalidArgumentException('Unsupported output format');
        }
    }


    // {{{ private
    /**
     * Opposite function to parse_url()
     *
     * Inspired by code from comments of php.net-documentation for parse_url()
     *
     * @param array $parts_arr parts (strings) as returned by parse_url()
     *
     * @return string
     * @access private
     */
    private function _unparse_url($parts_arr)
    {
        if (!empty($parts_arr['scheme'])) {
            $ret_url = $parts_arr['scheme'];
        }
        if (!empty($parts_arr['user'])) {
            $ret_url .= $parts_arr['user'];
            if (!empty($parts_arr['pass'])) {
                $ret_url .= ':' . $parts_arr['pass'];
            }
            $ret_url .= '@';
        }
        $ret_url .= $parts_arr['host'];
        if (!empty($parts_arr['port'])) {
            $ret_url .= ':' . $parts_arr['port'];
        }
        $ret_url .= $parts_arr['path'];
        if (!empty($parts_arr['query'])) {
            $ret_url .= '?' . $parts_arr['query'];
        }
        if (!empty($parts_arr['fragment'])) {
            $ret_url .= '#' . $parts_arr['fragment'];
        }
        return $ret_url;
    }

    /**
     * The actual encoding algorithm.
     *
     * @param string $decoded Decoded string which should be encoded
     *
     * @return string         Encoded string
     * @throws Exception
     * @access private
     */
    private function _encode($decoded)
    {
        // We cannot encode a domain name containing the Punycode prefix
        $extract = self::_byteLength($this->_punycode_prefix);
        $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
        $check_deco = array_slice($decoded, 0, $extract);

        if ($check_pref == $check_deco) {
            throw new InvalidArgumentException('This is already a punycode string');
        }

        // We will not try to encode strings consisting of basic code points only
        $encodable = false;
        foreach ($decoded as $k => $v) {
            if ($v > 0x7a) {
                $encodable = true;
                break;
            }
        }
        if (!$encodable) {
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('The given string does not contain encodable chars');
            }

            return false;
        }

        // Do NAMEPREP
        $decoded = $this->_nameprep($decoded);

        $deco_len = count($decoded);

        // Empty array
        if (!$deco_len) {
            return false;
        }

        // How many chars have been consumed
        $codecount = 0;

        // Start with the prefix; copy it to output
        $encoded = $this->_punycode_prefix;

        $encoded = '';
        // Copy all basic code points to output
        for ($i = 0; $i < $deco_len; ++$i) {
            $test = $decoded[$i];
            // Will match [0-9a-zA-Z-]
            if ((0x2F < $test && $test < 0x40)
                || (0x40 < $test && $test < 0x5B)
                || (0x60 < $test && $test <= 0x7B)
                || (0x2D == $test)
            ) {
                $encoded .= chr($decoded[$i]);
                $codecount++;
            }
        }

        // All codepoints were basic ones
        if ($codecount == $deco_len) {
            return $encoded;
        }

        // Start with the prefix; copy it to output
        $encoded = $this->_punycode_prefix . $encoded;

        // If we have basic code points in output, add an hyphen to the end
        if ($codecount) {
            $encoded .= '-';
        }

        // Now find and encode all non-basic code points
        $is_first  = true;
        $cur_code  = $this->_initial_n;
        $bias      = $this->_initial_bias;
        $delta     = 0;

        while ($codecount < $deco_len) {
            // Find the smallest code point >= the current code point and
            // remember the last ouccrence of it in the input
            for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
                if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
                    $next_code = $decoded[$i];
                }
            }

            $delta += ($next_code - $cur_code) * ($codecount + 1);
            $cur_code = $next_code;

            // Scan input again and encode all characters whose code point is $cur_code
            for ($i = 0; $i < $deco_len; $i++) {
                if ($decoded[$i] < $cur_code) {
                    $delta++;
                } else if ($decoded[$i] == $cur_code) {
                    for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
                        $t = ($k <= $bias)?
                            $this->_tmin :
                            (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias);

                        if ($q < $t) {
                            break;
                        }

                        $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t))));
                        $q = ($q - $t) / ($this->_base - $t);
                    }

                    $encoded .= $this->_encodeDigit($q);
                    $bias = $this->_adapt($delta, $codecount + 1, $is_first);
                    $codecount++;
                    $delta = 0;
                    $is_first = false;
                }
            }

            $delta++;
            $cur_code++;
        }

        return $encoded;
    }

    /**
     * The actual decoding algorithm.
     *
     * @param string $encoded Encoded string which should be decoded
     *
     * @return string         Decoded string
     * @throws Exception
     * @access private
     */
    private function _decode($encoded)
    {
        // We do need to find the Punycode prefix
        if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) {
            return false;
        }

        $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded);

        // If nothing left after removing the prefix, it is hopeless
        if (!$encode_test) {
            return false;
        }

        // Find last occurrence of the delimiter
        $delim_pos = strrpos($encoded, '-');

        if ($delim_pos > self::_byteLength($this->_punycode_prefix)) {
            for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
                $decoded[] = ord($encoded{$k});
            }
        } else {
            $decoded = array();
        }

        $deco_len = count($decoded);
        $enco_len = self::_byteLength($encoded);

        // Wandering through the strings; init
        $is_first = true;
        $bias     = $this->_initial_bias;
        $idx      = 0;
        $char     = $this->_initial_n;

        for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
            for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
                $digit = $this->_decodeDigit($encoded{$enco_idx++});
                $idx += $digit * $w;

                $t = ($k <= $bias) ?
                    $this->_tmin :
                    (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias));

                if ($digit < $t) {
                    break;
                }

                $w = (int)($w * ($this->_base - $t));
            }

            $bias      = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
            $is_first  = false;
            $char     += (int) ($idx / ($deco_len + 1));
            $idx      %= ($deco_len + 1);

            if ($deco_len > 0) {
                // Make room for the decoded char
                for ($i = $deco_len; $i > $idx; $i--) {
                    $decoded[$i] = $decoded[($i - 1)];
                }
            }

            $decoded[$idx++] = $char;
        }

        return $this->_ucs4_to_utf8($decoded);
    }

    /**
     * Adapt the bias according to the current code point and position.
     *
     * @param int     $delta    ...
     * @param int     $npoints  ...
     * @param boolean $is_first ...
     *
     * @return int
     * @access private
     */
    private function _adapt($delta, $npoints, $is_first)
    {
        $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2));
        $delta += (int) ($delta / $npoints);

        for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
            $delta = (int) ($delta / ($this->_base - $this->_tmin));
        }

        return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
    }

    /**
     * Encoding a certain digit.
     *
     * @param int $d One digit to encode
     *
     * @return char  Encoded digit
     * @access private
     */
    private function _encodeDigit($d)
    {
        return chr($d + 22 + 75 * ($d < 26));
    }

    /**
     * Decode a certain digit.
     *
     * @param char $cp One digit (character) to decode
     *
     * @return int     Decoded digit
     * @access private
     */
    private function _decodeDigit($cp)
    {
        $cp = ord($cp);
        return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base));
    }

    /**
     * Do Nameprep according to RFC3491 and RFC3454.
     *
     * @param array $input Unicode Characters
     *
     * @return string      Unicode Characters, Nameprep'd
     * @throws Exception
     * @access private
     */
    private function _nameprep($input)
    {
        $output = array();

        // Walking through the input array, performing the required steps on each of
        // the input chars and putting the result into the output array
        // While mapping required chars we apply the canonical ordering

        foreach ($input as $v) {
            // Map to nothing == skip that code point
            if (in_array($v, self::$_np_map_nothing)) {
                continue;
            }

            // Try to find prohibited input
            if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) {
                throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v));
            }

            foreach (self::$_np_prohibit_ranges as $range) {
                if ($range[0] <= $v && $v <= $range[1]) {
                    throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v));
                }
            }

            // Hangul syllable decomposition
            if (0xAC00 <= $v && $v <= 0xD7AF) {
                foreach ($this->_hangulDecompose($v) as $out) {
                    $output[] = $out;
                }
            } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) {
                // There's a decomposition mapping for that code point
                // Decompositions only in version 2003 (original) of IDNA
                foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) {
                    $output[] = $out;
                }
            } else {
                $output[] = $v;
            }
        }

        // Combine code points

        $last_class   = 0;
        $last_starter = 0;
        $out_len      = count($output);

        for ($i = 0; $i < $out_len; ++$i) {
            $class = $this->_getCombiningClass($output[$i]);

            if ((!$last_class || $last_class != $class) && $class) {
                // Try to match
                $seq_len = $i - $last_starter;
                $out = $this->_combine(array_slice($output, $last_starter, $seq_len));

                // On match: Replace the last starter with the composed character and remove
                // the now redundant non-starter(s)
                if ($out) {
                    $output[$last_starter] = $out;

                    if (count($out) != $seq_len) {
                        for ($j = $i + 1; $j < $out_len; ++$j) {
                            $output[$j - 1] = $output[$j];
                        }

                        unset($output[$out_len]);
                    }

                    // Rewind the for loop by one, since there can be more possible compositions
                    $i--;
                    $out_len--;
                    $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]);

                    continue;
                }
            }

            // The current class is 0
            if (!$class) {
                $last_starter = $i;
            }

            $last_class = $class;
        }

        return $output;
    }

    /**
     * Decomposes a Hangul syllable
     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul).
     *
     * @param integer $char 32bit UCS4 code point
     *
     * @return array        Either Hangul Syllable decomposed or original 32bit
     *                      value as one value array
     * @access private
     */
    private function _hangulDecompose($char)
    {
        $sindex = $char - $this->_sbase;

        if ($sindex < 0 || $sindex >= $this->_scount) {
            return array($char);
        }

        $result   = array();
        $T        = $this->_tbase + $sindex % $this->_tcount;
        $result[] = (int)($this->_lbase +  $sindex / $this->_ncount);
        $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount);

        if ($T != $this->_tbase) {
            $result[] = $T;
        }

        return $result;
    }

    /**
     * Ccomposes a Hangul syllable
     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul).
     *
     * @param array $input Decomposed UCS4 sequence
     *
     * @return array       UCS4 sequence with syllables composed
     * @access private
     */
    private function _hangulCompose($input)
    {
        $inp_len = count($input);

        if (!$inp_len) {
            return array();
        }

        $result   = array();
        $last     = $input[0];
        $result[] = $last; // copy first char from input to output

        for ($i = 1; $i < $inp_len; ++$i) {
            $char = $input[$i];

            // Find out, wether two current characters from L and V
            $lindex = $last - $this->_lbase;

            if (0 <= $lindex && $lindex < $this->_lcount) {
                $vindex = $char - $this->_vbase;

                if (0 <= $vindex && $vindex < $this->_vcount) {
                    // create syllable of form LV
                    $last    = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount);
                    $out_off = count($result) - 1;
                    $result[$out_off] = $last; // reset last

                    // discard char
                    continue;
                }
            }

            // Find out, wether two current characters are LV and T
            $sindex = $last - $this->_sbase;

            if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) {
                $tindex = $char - $this->_tbase;

                if (0 <= $tindex && $tindex <= $this->_tcount) {
                    // create syllable of form LVT
                    $last += $tindex;
                    $out_off = count($result) - 1;
                    $result[$out_off] = $last; // reset last

                    // discard char
                    continue;
                }
            }

            // if neither case was true, just add the character
            $last = $char;
            $result[] = $char;
        }

        return $result;
    }

    /**
     * Returns the combining class of a certain wide char.
     *
     * @param integer $char Wide char to check (32bit integer)
     *
     * @return integer      Combining class if found, else 0
     * @access private
     */
    private function _getCombiningClass($char)
    {
        return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0;
    }

    /**
     * Apllies the canonical ordering of a decomposed UCS4 sequence.
     *
     * @param array $input Decomposed UCS4 sequence
     *
     * @return array       Ordered USC4 sequence
     * @access private
     */
    private function _applyCannonicalOrdering($input)
    {
        $swap = true;
        $size = count($input);

        while ($swap) {
            $swap = false;
            $last = $this->_getCombiningClass($input[0]);

            for ($i = 0; $i < $size - 1; ++$i) {
                $next = $this->_getCombiningClass($input[$i + 1]);

                if ($next != 0 && $last > $next) {
                    // Move item leftward until it fits
                    for ($j = $i + 1; $j > 0; --$j) {
                        if ($this->_getCombiningClass($input[$j - 1]) <= $next) {
                            break;
                        }

                        $t = $input[$j];
                        $input[$j] = $input[$j - 1];
                        $input[$j - 1] = $t;
                        $swap = 1;
                    }

                    // Reentering the loop looking at the old character again
                    $next = $last;
                }

                $last = $next;
            }
        }

        return $input;
    }

    /**
     * Do composition of a sequence of starter and non-starter.
     *
     * @param array $input UCS4 Decomposed sequence
     *
     * @return array       Ordered USC4 sequence
     * @access private
     */
    private function _combine($input)
    {
        $inp_len = count($input);

        // Is it a Hangul syllable?
        if (1 != $inp_len) {
            $hangul = $this->_hangulCompose($input);

            // This place is probably wrong
            if (count($hangul) != $inp_len) {
                return $hangul;
            }
        }

        foreach (self::$_np_replacemaps as $np_src => $np_target) {
            if ($np_target[0] != $input[0]) {
                continue;
            }

            if (count($np_target) != $inp_len) {
                continue;
            }

            $hit = false;

            foreach ($input as $k2 => $v2) {
                if ($v2 == $np_target[$k2]) {
                    $hit = true;
                } else {
                    $hit = false;
                    break;
                }
            }

            if ($hit) {
                return $np_src;
            }
        }

        return false;
    }

    /**
     * This converts an UTF-8 encoded string to its UCS-4 (array) representation
     * By talking about UCS-4 we mean arrays of 32bit integers representing
     * each of the "chars". This is due to PHP not being able to handle strings with
     * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too.
     * The following UTF-8 encodings are supported:
     *
     * bytes bits  representation
     * 1        7  0xxxxxxx
     * 2       11  110xxxxx 10xxxxxx
     * 3       16  1110xxxx 10xxxxxx 10xxxxxx
     * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
     * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     *
     * Each x represents a bit that can be used to store character data.
     *
     * @param string $input utf8-encoded string
     *
     * @return array        ucs4-encoded array
     * @throws Exception
     * @access private
     */
    private function _utf8_to_ucs4($input)
    {
        $output = array();
        $out_len = 0;
        $inp_len = self::_byteLength($input, '8bit');
        $mode = 'next';
        $test = 'none';
        for ($k = 0; $k < $inp_len; ++$k) {
            $v = ord($input{$k}); // Extract byte from input string

            if ($v < 128) { // We found an ASCII char - put into string as is
                $output[$out_len] = $v;
                ++$out_len;
                if ('add' == $mode) {
                    throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
                }
                continue;
            }
            if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
                $start_byte = $v;
                $mode = 'add';
                $test = 'range';
                if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
                    $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
                    $v = ($v - 192) << 6;
                } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
                    $next_byte = 1;
                    $v = ($v - 224) << 12;
                } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 2;
                    $v = ($v - 240) << 18;
                } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 3;
                    $v = ($v - 248) << 24;
                } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 4;
                    $v = ($v - 252) << 30;
                } else {
                    throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k);
                }
                if ('add' == $mode) {
                    $output[$out_len] = (int) $v;
                    ++$out_len;
                    continue;
                }
            }
            if ('add' == $mode) {
                if (!$this->_allow_overlong && $test == 'range') {
                    $test = 'none';
                    if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
                        throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
                    }
                }
                if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
                    $v = ($v - 128) << ($next_byte * 6);
                    $output[($out_len - 1)] += $v;
                    --$next_byte;
                } else {
                    throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
                }
                if ($next_byte < 0) {
                    $mode = 'next';
                }
            }
        } // for
        return $output;
    }

    /**
     * Convert UCS-4 array into UTF-8 string
     *
     * @param array $input ucs4-encoded array
     *
     * @return string      utf8-encoded string
     * @throws Exception
     * @access private
     */
    private function _ucs4_to_utf8($input)
    {
        $output = '';

        foreach ($input as $v) {
            // $v = ord($v);

            if ($v < 128) {
                // 7bit are transferred literally
                $output .= chr($v);
            } else if ($v < 1 << 11) {
                // 2 bytes
                $output .= chr(192 + ($v >> 6))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 16) {
                // 3 bytes
                $output .= chr(224 + ($v >> 12))
                    . chr(128 + (($v >> 6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 21) {
                // 4 bytes
                $output .= chr(240 + ($v >> 18))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 26) {
                // 5 bytes
                $output .= chr(248 + ($v >> 24))
                    . chr(128 + (($v >> 18) & 63))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 31) {
                // 6 bytes
                $output .= chr(252 + ($v >> 30))
                    . chr(128 + (($v >> 24) & 63))
                    . chr(128 + (($v >> 18) & 63))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else {
                throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input');
            }
        }

        return $output;
    }

    /**
     * Convert UCS-4 array into UCS-4 string
     *
     * @param array $input ucs4-encoded array
     *
     * @return string      ucs4-encoded string
     * @throws Exception
     * @access private
     */
    private function _ucs4_to_ucs4_string($input)
    {
        $output = '';
        // Take array values and split output to 4 bytes per value
        // The bit mask is 255, which reads &11111111
        foreach ($input as $v) {
            $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255);
        }
        return $output;
    }

    /**
     * Convert UCS-4 string into UCS-4 array
     *
     * @param string $input ucs4-encoded string
     *
     * @return array        ucs4-encoded array
     * @throws InvalidArgumentException
     * @access private
     */
    private function _ucs4_string_to_ucs4($input)
    {
        $output = array();

        $inp_len = self::_byteLength($input);
        // Input length must be dividable by 4
        if ($inp_len % 4) {
            throw new InvalidArgumentException('Input UCS4 string is broken');
        }

        // Empty input - return empty output
        if (!$inp_len) {
            return $output;
        }

        for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
            // Increment output position every 4 input bytes
            if (!$i % 4) {
                $out_len++;
                $output[$out_len] = 0;
            }
            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
        }
        return $output;
    }

    /**
     * Echo hex representation of UCS4 sequence.
     *
     * @param array   $input       UCS4 sequence
     * @param boolean $include_bit Include bitmask in output
     *
     * @return void
     * @static
     * @access private
     */
    private static function _showHex($input, $include_bit = false)
    {
        foreach ($input as $k => $v) {
            echo '[', $k, '] => ', sprintf('%X', $v);

            if ($include_bit) {
                echo ' (', Net_IDNA2::_showBitmask($v), ')';
            }

            echo "\n";
        }
    }

    /**
     * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits)
     * Output width is automagically determined
     *
     * @param int $octet ...
     *
     * @return string    Bitmask-representation
     * @static
     * @access private
     */
    private static function _showBitmask($octet)
    {
        if ($octet >= (1 << 16)) {
            $w = 31;
        } else if ($octet >= (1 << 8)) {
            $w = 15;
        } else {
            $w = 7;
        }

        $return = '';

        for ($i = $w; $i > -1; $i--) {
            $return .= ($octet & (1 << $i))? '1' : '0';
        }

        return $return;
    }

    /**
     * Gets the length of a string in bytes even if mbstring function
     * overloading is turned on
     *
     * @param string $string the string for which to get the length.
     *
     * @return integer the length of the string in bytes.
     *
     * @see Net_IDNA2::$_mb_string_overload
     */
    private static function _byteLength($string)
    {
        if (self::$_mb_string_overload) {
            return mb_strlen($string, '8bit');
        }
        return strlen((binary)$string);
    }

    // }}}}

    // {{{ factory
    /**
     * Attempts to return a concrete IDNA instance for either php4 or php5.
     *
     * @param array $params Set of paramaters
     *
     * @return Net_IDNA2
     * @access public
     */
    public static function getInstance($params = array())
    {
        return new Net_IDNA2($params);
    }
    // }}}

    // {{{ singleton
    /**
     * Attempts to return a concrete IDNA instance for either php4 or php5,
     * only creating a new instance if no IDNA instance with the same
     * parameters currently exists.
     *
     * @param array $params Set of parameters
     *
     * @return object Net_IDNA2
     * @access public
     */
    public static function singleton($params = array())
    {
        static $instances;
        if (!isset($instances)) {
            $instances = array();
        }

        $signature = serialize($params);
        if (!isset($instances[$signature])) {
            $instances[$signature] = Net_IDNA2::getInstance($params);
        }

        return $instances[$signature];
    }
    // }}}
}

?>
pear/Console/Getopt.php000064400000032503151732710010011050 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
 * PHP Version 5
 *
 * Copyright (c) 2001-2015, The PEAR developers
 *
 * This source file is subject to the BSD-2-Clause license,
 * that is bundled with this package in the file LICENSE, and is
 * available through the world-wide-web at the following url:
 * http://opensource.org/licenses/bsd-license.php.
 *
 * @category Console
 * @package  Console_Getopt
 * @author   Andrei Zmievski <andrei@php.net>
 * @license  http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @version  CVS: $Id$
 * @link     http://pear.php.net/package/Console_Getopt
 */

require_once 'PEAR.php';

/**
 * Command-line options parsing class.
 *
 * @category Console
 * @package  Console_Getopt
 * @author   Andrei Zmievski <andrei@php.net>
 * @license  http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link     http://pear.php.net/package/Console_Getopt
 */
class Console_Getopt
{

    /**
     * Parses the command-line options.
     *
     * The first parameter to this function should be the list of command-line
     * arguments without the leading reference to the running program.
     *
     * The second parameter is a string of allowed short options. Each of the
     * option letters can be followed by a colon ':' to specify that the option
     * requires an argument, or a double colon '::' to specify that the option
     * takes an optional argument.
     *
     * The third argument is an optional array of allowed long options. The
     * leading '--' should not be included in the option name. Options that
     * require an argument should be followed by '=', and options that take an
     * option argument should be followed by '=='.
     *
     * The return value is an array of two elements: the list of parsed
     * options and the list of non-option command-line arguments. Each entry in
     * the list of parsed options is a pair of elements - the first one
     * specifies the option, and the second one specifies the option argument,
     * if there was one.
     *
     * Long and short options can be mixed.
     *
     * Most of the semantics of this function are based on GNU getopt_long().
     *
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return array two-element array containing the list of parsed options and
     * the non-option arguments
     */
    public static function getopt2($args, $short_options, $long_options = null, $skip_unknown = false)
    {
        return Console_Getopt::doGetopt(2, $args, $short_options, $long_options, $skip_unknown);
    }

    /**
     * This function expects $args to start with the script name (POSIX-style).
     * Preserved for backwards compatibility.
     *
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     *
     * @see getopt2()
     * @return array two-element array containing the list of parsed options and
     * the non-option arguments
     */
    public static function getopt($args, $short_options, $long_options = null, $skip_unknown = false)
    {
        return Console_Getopt::doGetopt(1, $args, $short_options, $long_options, $skip_unknown);
    }

    /**
     * The actual implementation of the argument parsing code.
     *
     * @param int    $version       Version to use
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return array
     */
    public static function doGetopt($version, $args, $short_options, $long_options = null, $skip_unknown = false)
    {
        // in case you pass directly readPHPArgv() as the first arg
        if (PEAR::isError($args)) {
            return $args;
        }

        if (empty($args)) {
            return array(array(), array());
        }

        $non_opts = $opts = array();

        settype($args, 'array');

        if ($long_options) {
            sort($long_options);
        }

        /*
         * Preserve backwards compatibility with callers that relied on
         * erroneous POSIX fix.
         */
        if ($version < 2) {
            if (isset($args[0][0]) && $args[0][0] != '-') {
                array_shift($args);
            }
        }

        for ($i = 0; $i < count($args); $i++) {
            $arg = $args[$i];
            /* The special element '--' means explicit end of
               options. Treat the rest of the arguments as non-options
               and end the loop. */
            if ($arg == '--') {
                $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
                break;
            }

            if ($arg[0] != '-' || (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
                $non_opts = array_merge($non_opts, array_slice($args, $i));
                break;
            } elseif (strlen($arg) > 1 && $arg[1] == '-') {
                $error = Console_Getopt::_parseLongOption(substr($arg, 2),
                                                          $long_options,
                                                          $opts,
                                                          $i,
                                                          $args,
                                                          $skip_unknown);
                if (PEAR::isError($error)) {
                    return $error;
                }
            } elseif ($arg == '-') {
                // - is stdin
                $non_opts = array_merge($non_opts, array_slice($args, $i));
                break;
            } else {
                $error = Console_Getopt::_parseShortOption(substr($arg, 1),
                                                           $short_options,
                                                           $opts,
                                                           $i,
                                                           $args,
                                                           $skip_unknown);
                if (PEAR::isError($error)) {
                    return $error;
                }
            }
        }

        return array($opts, $non_opts);
    }

    /**
     * Parse short option
     *
     * @param string     $arg           Argument
     * @param string[]   $short_options Available short options
     * @param string[][] &$opts
     * @param int        &$argIdx
     * @param string[]   $args
     * @param boolean    $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return void
     */
    protected static function _parseShortOption($arg, $short_options, &$opts, &$argIdx, $args, $skip_unknown)
    {
        for ($i = 0; $i < strlen($arg); $i++) {
            $opt     = $arg[$i];
            $opt_arg = null;

            /* Try to find the short option in the specifier string. */
            if (($spec = strstr($short_options, $opt)) === false || $arg[$i] == ':') {
                if ($skip_unknown === true) {
                    break;
                }

                $msg = "Console_Getopt: unrecognized option -- $opt";
                return PEAR::raiseError($msg);
            }

            if (strlen($spec) > 1 && $spec[1] == ':') {
                if (strlen($spec) > 2 && $spec[2] == ':') {
                    if ($i + 1 < strlen($arg)) {
                        /* Option takes an optional argument. Use the remainder of
                           the arg string if there is anything left. */
                        $opts[] = array($opt, substr($arg, $i + 1));
                        break;
                    }
                } else {
                    /* Option requires an argument. Use the remainder of the arg
                       string if there is anything left. */
                    if ($i + 1 < strlen($arg)) {
                        $opts[] = array($opt,  substr($arg, $i + 1));
                        break;
                    } else if (isset($args[++$argIdx])) {
                        $opt_arg = $args[$argIdx];
                        /* Else use the next argument. */;
                        if (Console_Getopt::_isShortOpt($opt_arg)
                            || Console_Getopt::_isLongOpt($opt_arg)) {
                            $msg = "option requires an argument --$opt";
                            return PEAR::raiseError("Console_Getopt: " . $msg);
                        }
                    } else {
                        $msg = "option requires an argument --$opt";
                        return PEAR::raiseError("Console_Getopt: " . $msg);
                    }
                }
            }

            $opts[] = array($opt, $opt_arg);
        }
    }

    /**
     * Checks if an argument is a short option
     *
     * @param string $arg Argument to check
     *
     * @return bool
     */
    protected static function _isShortOpt($arg)
    {
        return strlen($arg) == 2 && $arg[0] == '-'
               && preg_match('/[a-zA-Z]/', $arg[1]);
    }

    /**
     * Checks if an argument is a long option
     *
     * @param string $arg Argument to check
     *
     * @return bool
     */
    protected static function _isLongOpt($arg)
    {
        return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
               preg_match('/[a-zA-Z]+$/', substr($arg, 2));
    }

    /**
     * Parse long option
     *
     * @param string     $arg          Argument
     * @param string[]   $long_options Available long options
     * @param string[][] &$opts
     * @param int        &$argIdx
     * @param string[]   $args
     *
     * @return void|PEAR_Error
     */
    protected static function _parseLongOption($arg, $long_options, &$opts, &$argIdx, $args, $skip_unknown)
    {
        @list($opt, $opt_arg) = explode('=', $arg, 2);

        $opt_len = strlen($opt);

        for ($i = 0; $i < count($long_options); $i++) {
            $long_opt  = $long_options[$i];
            $opt_start = substr($long_opt, 0, $opt_len);

            $long_opt_name = str_replace('=', '', $long_opt);

            /* Option doesn't match. Go on to the next one. */
            if ($long_opt_name != $opt) {
                continue;
            }

            $opt_rest = substr($long_opt, $opt_len);

            /* Check that the options uniquely matches one of the allowed
               options. */
            if ($i + 1 < count($long_options)) {
                $next_option_rest = substr($long_options[$i + 1], $opt_len);
            } else {
                $next_option_rest = '';
            }

            if ($opt_rest != '' && $opt[0] != '=' &&
                $i + 1 < count($long_options) &&
                $opt == substr($long_options[$i+1], 0, $opt_len) &&
                $next_option_rest != '' &&
                $next_option_rest[0] != '=') {

                $msg = "Console_Getopt: option --$opt is ambiguous";
                return PEAR::raiseError($msg);
            }

            if (substr($long_opt, -1) == '=') {
                if (substr($long_opt, -2) != '==') {
                    /* Long option requires an argument.
                       Take the next argument if one wasn't specified. */;
                    if (!strlen($opt_arg)) {
                        if (!isset($args[++$argIdx])) {
                            $msg = "Console_Getopt: option requires an argument --$opt";
                            return PEAR::raiseError($msg);
                        }
                        $opt_arg = $args[$argIdx];
                    }

                    if (Console_Getopt::_isShortOpt($opt_arg)
                        || Console_Getopt::_isLongOpt($opt_arg)) {
                        $msg = "Console_Getopt: option requires an argument --$opt";
                        return PEAR::raiseError($msg);
                    }
                }
            } else if ($opt_arg) {
                $msg = "Console_Getopt: option --$opt doesn't allow an argument";
                return PEAR::raiseError($msg);
            }

            $opts[] = array('--' . $opt, $opt_arg);
            return;
        }

        if ($skip_unknown === true) {
            return;
        }

        return PEAR::raiseError("Console_Getopt: unrecognized option --$opt");
    }

    /**
     * Safely read the $argv PHP array across different PHP configurations.
     * Will take care on register_globals and register_argc_argv ini directives
     *
     * @return mixed the $argv PHP array or PEAR error if not registered
     */
    public static function readPHPArgv()
    {
        global $argv;
        if (!is_array($argv)) {
            if (!@is_array($_SERVER['argv'])) {
                if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
                    $msg = "Could not read cmd args (register_argc_argv=Off?)";
                    return PEAR::raiseError("Console_Getopt: " . $msg);
                }
                return $GLOBALS['HTTP_SERVER_VARS']['argv'];
            }
            return $_SERVER['argv'];
        }
        return $argv;
    }

}
pear/pearcmd.php000064400000035223151732710010007621 0ustar00<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * Command line interface
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Tomas V.V.Cox <cox@idecnet.com>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 */

@ob_end_clean();
if (!defined('PEAR_RUNTYPE')) {
    // this is defined in peclcmd.php as 'pecl'
    define('PEAR_RUNTYPE', 'pear');
}
define('PEAR_IGNORE_BACKTRACE', 1);
/**
 * @nodep Gtk
 */
//the space is needed for windows include paths with trailing backslash
// http://pear.php.net/bugs/bug.php?id=19482
if ('/opt/alt/php73/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php73/usr/share/pear '). PATH_SEPARATOR .  get_include_path());
    $raw = false;
} else {
    // this is a raw, uninstalled pear, either a cvs checkout, or php distro
    ini_set('include_path', dirname(__DIR__) . PATH_SEPARATOR . get_include_path());
    $raw = true;
}
@ini_set('allow_url_fopen', true);
@set_time_limit(0);
ob_implicit_flush(true);
@ini_set('track_errors', true);
@ini_set('html_errors', false);
$_PEAR_PHPDIR = '#$%^&*';
set_error_handler('error_handler');

$pear_package_version = "1.10.16";

require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/Config.php';
require_once 'PEAR/Command.php';
require_once 'Console/Getopt.php';


PEAR_Command::setFrontendType('CLI');
$all_commands = PEAR_Command::getCommands();

$argv = Console_Getopt::readPHPArgv();
// fix CGI sapi oddity - the -- in pear.bat/pear is not removed
if (php_sapi_name() != 'cli' && isset($argv[1]) && $argv[1] == '--') {
    unset($argv[1]);
    $argv = array_values($argv);
}
$progname = PEAR_RUNTYPE;
array_shift($argv);
$options = Console_Getopt::getopt2($argv, "c:C:d:D:Gh?sSqu:vV");
if (PEAR::isError($options)) {
    usage($options);
}

$opts = $options[0];

$fetype = 'CLI';
if ($progname == 'gpear' || $progname == 'pear-gtk') {
    $fetype = 'Gtk2';
} else {
    foreach ($opts as $opt) {
        if ($opt[0] == 'G') {
            $fetype = 'Gtk2';
        }
    }
}

$pear_user_config = '';
$pear_system_config = '';
$store_user_config = false;
$store_system_config = false;
$verbose = 1;

foreach ($opts as $opt) {
    switch ($opt[0]) {
    case 'c':
        $pear_user_config = $opt[1];
        break;
    case 'C':
        $pear_system_config = $opt[1];
        break;
    }
}

PEAR_Command::setFrontendType($fetype);
$ui = &PEAR_Command::getFrontendObject();
$config = &PEAR_Config::singleton($pear_user_config, $pear_system_config);

if (PEAR::isError($config)) {
    $_file = '';
    if ($pear_user_config !== false) {
        $_file .= $pear_user_config;
    }
    if ($pear_system_config !== false) {
        $_file .= '/' . $pear_system_config;
    }
    if ($_file == '/') {
        $_file = 'The default config file';
    }
    $config->getMessage();
    $ui->outputData("ERROR: $_file is not a valid config file or is corrupted.");
    // We stop, we have no idea where we are :)
    exit(1);
}

// this is used in the error handler to retrieve a relative path
$_PEAR_PHPDIR = $config->get('php_dir');
$ui->setConfig($config);
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($ui, "displayFatalError"));

$verbose = $config->get("verbose");
$cmdopts = array();

if ($raw) {
    if (!$config->isDefinedLayer('user') && !$config->isDefinedLayer('system')) {
        $found = false;
        foreach ($opts as $opt) {
            if ($opt[0] == 'd' || $opt[0] == 'D') {
                // the user knows what they are doing, and are setting config values
                $found = true;
            }
        }
        if (!$found) {
            // no prior runs, try to install PEAR
            $parent = dirname(__FILE__);
            if (strpos($parent, 'scripts')) {
                $grandparent = dirname($parent);
                $packagexml = $grandparent . DIRECTORY_SEPARATOR . 'package2.xml';
                $pearbase = $grandparent;
            } else {
                $packagexml = $parent . DIRECTORY_SEPARATOR . 'package2.xml';
                $pearbase = $parent;
            }
            if (file_exists($packagexml)) {
                $options[1] = array(
                    'install',
                    $packagexml
                );
                $config->set('php_dir', $pearbase . DIRECTORY_SEPARATOR . 'php');
                $config->set('data_dir', $pearbase . DIRECTORY_SEPARATOR . 'data');
                $config->set('doc_dir', $pearbase . DIRECTORY_SEPARATOR . 'docs');
                $config->set('test_dir', $pearbase . DIRECTORY_SEPARATOR . 'tests');
                $config->set(
                    'ext_dir',
                    $pearbase . DIRECTORY_SEPARATOR . 'extensions'
                );
                $config->set('bin_dir', $pearbase);
                $config->mergeConfigFile($pearbase . 'pear.ini', false);
                $config->store();
                $config->set('auto_discover', 1);
            }
        }
    }
}
foreach ($opts as $opt) {
    $param = !empty($opt[1]) ? $opt[1] : true;
    switch ($opt[0]) {
    case 'd':
        if ($param === true) {
            die(
                'Invalid usage of "-d" option, expected -d config_value=value, ' .
                'received "-d"' . "\n"
            );
        }
        $possible = explode('=', $param);
        if (count($possible) != 2) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "' . $param . '"' . "\n"
            );
        }
        list($key, $value) = explode('=', $param);
        $config->set($key, $value, 'user');
        break;
    case 'D':
        if ($param === true) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "-d"' . "\n"
            );
        }
        $possible = explode('=', $param);
        if (count($possible) != 2) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "' . $param . '"' . "\n"
            );
        }
        list($key, $value) = explode('=', $param);
        $config->set($key, $value, 'system');
        break;
    case 's':
        $store_user_config = true;
        break;
    case 'S':
        $store_system_config = true;
        break;
    case 'u':
        $config->remove($param, 'user');
        break;
    case 'v':
        $config->set('verbose', $config->get('verbose') + 1);
        break;
    case 'q':
        $config->set('verbose', $config->get('verbose') - 1);
        break;
    case 'V':
        usage(null, 'version');
    case 'c':
    case 'C':
        break;
    default:
        // all non pear params goes to the command
        $cmdopts[$opt[0]] = $param;
        break;
    }
}

if ($store_system_config) {
    $config->store('system');
}

if ($store_user_config) {
    $config->store('user');
}

$command = (isset($options[1][0])) ? $options[1][0] : null;
if (empty($command) && ($store_user_config || $store_system_config)) {
    exit;
}

if ($fetype == 'Gtk2') {
    if (!$config->validConfiguration()) {
        PEAR::raiseError(
            "CRITICAL ERROR: no existing valid configuration files found in " .
            "files '$pear_user_config' or '$pear_system_config', " .
            "please copy an existing configuration file to one of these " .
            "locations, or use the -c and -s options to create one"
        );
    }
    Gtk::main();
} else {
    do {
        if ($command == 'help') {
            usage(null, isset($options[1][1]) ? $options[1][1] : null);
        }

        if (!$config->validConfiguration()) {
            PEAR::raiseError(
                "CRITICAL ERROR: no existing valid configuration files found " .
                "in files '$pear_user_config' or '$pear_system_config', " .
                "please copy an existing configuration file to one of " .
                "these locations, or use the -c and -s options to create one"
            );
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $cmd = PEAR_Command::factory($command, $config);
        PEAR::popErrorHandling();
        if (PEAR::isError($cmd)) {
            usage(null, isset($options[1][0]) ? $options[1][0] : null);
        }

        $short_args = $long_args = null;
        PEAR_Command::getGetoptArgs($command, $short_args, $long_args);
        array_shift($options[1]);
        $tmp = Console_Getopt::getopt2($options[1], $short_args, $long_args);

        if (PEAR::isError($tmp)) {
            break;
        }

        list($tmpopt, $params) = $tmp;
        $opts = array();
        foreach ($tmpopt as $foo => $tmp2) {
            list($opt, $value) = $tmp2;
            if ($value === null) {
                $value = true; // options without args
            }

            if (strlen($opt) == 1) {
                $cmdoptions = $cmd->getOptions($command);
                foreach ($cmdoptions as $o => $d) {
                    if (isset($d['shortopt']) && $d['shortopt'] == $opt) {
                        $opts[$o] = $value;
                    }
                }
            } else {
                if (substr($opt, 0, 2) == '--') {
                    $opts[substr($opt, 2)] = $value;
                }
            }
        }

        $ok = $cmd->run($command, $opts, $params);
        if ($ok === false) {
            PEAR::raiseError("unknown command `$command'");
        }

        if (PEAR::isError($ok)) {
            PEAR::setErrorHandling(
                PEAR_ERROR_CALLBACK, array($ui, "displayFatalError")
            );
            PEAR::raiseError($ok);
        }
    } while (false);
}

// {{{ usage()

/**
 * Display usage information
 *
 * @param mixed $error       Optional error message
 * @param mixed $helpsubject Optional subject/command to display help for
 *
 * @return void
 */
function usage($error = null, $helpsubject = null)
{
    global $progname, $all_commands;
    $stdout = fopen('php://stdout', 'w');
    if (PEAR::isError($error)) {
        fputs($stdout, $error->getMessage() . "\n");
    } elseif ($error !== null) {
        fputs($stdout, "$error\n");
    }

    if ($helpsubject != null) {
        $put = cmdHelp($helpsubject);
    } else {
        $put = "Commands:\n";
        $maxlen = max(array_map("strlen", $all_commands));
        $formatstr = "%-{$maxlen}s  %s\n";
        ksort($all_commands);
        foreach ($all_commands as $cmd => $class) {
            $put .= sprintf($formatstr, $cmd, PEAR_Command::getDescription($cmd));
        }
        $put .=
            "Usage: $progname [options] command [command-options] <parameters>\n".
            "Type \"$progname help options\" to list all options.\n".
            "Type \"$progname help shortcuts\" to list all command shortcuts.\n".
            "Type \"$progname help version\" or ".
            "\"$progname version\" to list version information.\n".
            "Type \"$progname help <command>\" to get the help ".
            "for the specified command.";
    }
    fputs($stdout, "$put\n");
    fclose($stdout);

    if ($error === null) {
        exit(0);
    }
    exit(1);
}

/**
 * Return help string for specified command
 *
 * @param string $command Command to return help for
 *
 * @return void
 */
function cmdHelp($command)
{
    global $progname, $all_commands, $config;
    if ($command == "options") {
        return
        "Options:\n".
        "     -v         increase verbosity level (default 1)\n".
        "     -q         be quiet, decrease verbosity level\n".
        "     -c file    find user configuration in `file'\n".
        "     -C file    find system configuration in `file'\n".
        "     -d foo=bar set user config variable `foo' to `bar'\n".
        "     -D foo=bar set system config variable `foo' to `bar'\n".
        "     -G         start in graphical (Gtk) mode\n".
        "     -s         store user configuration\n".
        "     -S         store system configuration\n".
        "     -u foo     unset `foo' in the user configuration\n".
        "     -h, -?     display help/usage (this message)\n".
        "     -V         version information\n";
    } elseif ($command == "shortcuts") {
        $sc = PEAR_Command::getShortcuts();
        $ret = "Shortcuts:\n";
        foreach ($sc as $s => $c) {
            $ret .= sprintf("     %-8s %s\n", $s, $c);
        }
        return $ret;

    } elseif ($command == "version") {
        return "PEAR Version: ".$GLOBALS['pear_package_version'].
               "\nPHP Version: ".phpversion().
               "\nZend Engine Version: ".zend_version().
               "\nRunning on: ".php_uname();

    } elseif ($help = PEAR_Command::getHelp($command)) {
        if (is_string($help)) {
            return "$progname $command [options] $help\n";
        }

        if ($help[1] === null) {
            return "$progname $command $help[0]";
        }

        return "$progname $command [options] $help[0]\n$help[1]";
    }

    return "Command '$command' is not valid, try '$progname help'";
}

// }}}

/**
 * error_handler
 *
 * @param mixed $errno  Error number
 * @param mixed $errmsg Message
 * @param mixed $file   Filename
 * @param mixed $line   Line number
 *
 * @access public
 * @return boolean
 */
function error_handler($errno, $errmsg, $file, $line)
{
    if ((!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) && ($errno & E_STRICT)) {
        return; // E_STRICT
    }
    if ($errno & E_DEPRECATED) {
        return; // E_DEPRECATED
    }
    if (!(error_reporting() & $errno) &&
        isset($GLOBALS['config']) &&
        $GLOBALS['config']->get('verbose') < 4
    ) {
        return false; // @silenced error, show all if debug is high enough
    }
    $errortype = array (
        E_DEPRECATED  => 'Deprecated Warning',
        E_ERROR   =>  "Error",
        E_WARNING   =>  "Warning",
        E_PARSE   =>  "Parsing Error",
        E_NOTICE   =>  "Notice",
        E_CORE_ERROR  =>  "Core Error",
        E_CORE_WARNING  =>  "Core Warning",
        E_COMPILE_ERROR  =>  "Compile Error",
        E_COMPILE_WARNING =>  "Compile Warning",
        E_USER_ERROR =>  "User Error",
        E_USER_WARNING =>  "User Warning",
        E_USER_NOTICE =>  "User Notice"
    );
    if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) {
        $errortype[E_STRICT] = 'Strict Warning';
    }
    $prefix = $errortype[$errno];
    global $_PEAR_PHPDIR;
    if (stristr($file, $_PEAR_PHPDIR)) {
        $file = substr($file, strlen($_PEAR_PHPDIR) + 1);
    } else {
        $file = basename($file);
    }
    print "\n$prefix: $errmsg in $file on line $line\n";
    return false;
}


/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * mode: php
 * End:
 */
// vim600:syn=php
pear/peclcmd.php000064400000002143151732710010007610 0ustar00<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * Command line interface
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 */

/**
 * @nodep Gtk
 */
//the space is needed for windows include paths with trailing backslash
// http://pear.php.net/bugs/bug.php?id=19482
if ('/opt/alt/php73/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php73/usr/share/pear '). PATH_SEPARATOR .  get_include_path());
    $raw = false;
} else {
    // this is a raw, uninstalled pear, either a cvs checkout, or php distro
    ini_set('include_path', __DIR__ . PATH_SEPARATOR . get_include_path());
    $raw = true;
}
define('PEAR_RUNTYPE', 'pecl');
require_once 'pearcmd.php';
/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * mode: php
 * End:
 */
// vim600:syn=php

?>
pear/Structures/LinkedList/Single.php000064400000035160151732710010013654 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker textwidth=80: */

/**
 * Linked list structure
 * 
 * This package implements a singly linked list structure. Each node
 * (Structures_LinkedList_SingleNode object) in the list
 * (Structures_LinkedList_Single) knows the the next node in the list.
 * Unlike an array, you can insert or delete nodes at arbitrary points
 * in the list.
 *
 * If your application normally traverses the linked list in a forward-only
 * direction, use the singly-linked list implemented by
 * {@link Structures_LinkedList_Single}. If, however, your application
 * needs to traverse the list backwards, or insert nodes into the list before
 * other nodes in the list, use the double-linked list implemented by
 * {@link Structures_LinkedList_Double} to give your application better
 * performance at the cost of a slightly larger memory footprint.
 *
 * Structures_LinkedList_Single implements the Iterator interface so control
 * structures like foreach($list as $node) and while($list->next()) work
 * as expected.
 *
 * To use this package, derive a child class from
 * Structures_LinkedList_SingleNode and add data to the object. Then use the
 * Structures_LinkedList_Single class to access the nodes.
 *
 * PHP version 5
 *
 * LICENSE:  Copyright 2006 Dan Scott
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @category  Structures
 * @package   Structures_LinkedList_Single
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2006 Dan Scott
 * @license   http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @version   CVS: $Id: Single.php -1   $
 * @link      http://pear.php.net/package/Structures_LinkedList_Single
 * @example   single_link_example.php
 *
 * @todo Add some actual error conditions
 **/

require_once 'PEAR/Exception.php';

// {{{ class Structures_LinkedList_Single
/**
 * The Structures_LinkedList_Single class represents a linked list structure
 * composed of {@link Structures_LinkedList_SingleNode} objects.
 *
 * @category Structures
 * @package  Structures_LinkedList_Single
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList_Single
 */
class Structures_LinkedList_Single implements Iterator
{
    // {{{ properties
    /**
     * Current node in the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $current;

    /**
     * Root node of the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $root_node;

    /**
     * The linked list contains no nodes
     */
    const ERROR_EMPTY = -1;

    public static $messages = array(
        self::ERROR_EMPTY => 'No nodes in this linked list' 
    );
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_Single constructor
     *
     * @param Structures_LinkedList_SingleNode $root root node for the
     * linked list
     */
    function __construct(Structures_LinkedList_SingleNode $root = null)
    {
        if ($root) {
            $this->root_node = $root;
            $this->current = $root;
        } else {
            $this->root_node = null;
            $this->current = null;
        }
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Structures_LinkedList_Single destructor
     *
     * If we do not destroy all of the references in the linked list,
     * we will quickly run out of memory for large / complex structures.
     *
     */
    function __destruct()
    {
        /*
         * Starting with root node, set last node = root_node
         *   get next node
         *   if next node exists, delete last node reference to next node
         */
        if (!$last_node = $this->root_node) {
            return;
        }
        while (($next_node = $last_node->next()) !== false) {
            $last_node->setNext(null);
            $temp_node = $last_node;
            $last_node = $next_node;
            unset($temp_node);
        }
        $this->current = null;
        $this->root_node = null;
        $last_node = null;
        $next_node = null;
    }
    // }}}

    // {{{ function current()
    /**
     * Returns the current node in the linked list
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function current()
    {
        return $this->current;
    }
    // }}}

    // {{{ function rewind()
    /**
     * Sets the pointer for the linked list to the root node
     *
     * @return Structures_LinkedList_SingleNode root node in the linked list
     */
    public function rewind()
    {
        if ($this->root_node) {
            $this->current = $this->root_node;
        } else {
            $this->current = null;
        }
        return $this->current;
    }
    // }}}

    // {{{ function end()
    /**
     * Sets the pointer for the linked list to the root node
     *
     * @return Structures_LinkedList_SingleNode root node in the linked list
     */
    public function end()
    {
        $this->current = $this->getTailNode();
        return $this->current;
    }
    // }}}

    // {{{ function key()
    /**
     * Stub for Iterator interface that simply returns the current node
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function key()
    {
        return $this->current;
    }
    // }}}

    // {{{ function valid()
    /**
     * Stub for Iterator interface that simply returns the current node
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function valid()
    {
        return $this->current();
    }
    // }}}

    // {{{ function next()
    /**
     * Sets the pointer for the linked list to the next node and
     * returns that node
     *
     * @return Structures_LinkedList_SingleNode next node in the linked list
     */
    public function next()
    {
        if (!$this->current) {
            return false;
        }
        $this->current = $this->current()->next();
        return $this->current;
    }
    // }}}

    // {{{ function previous()
    /**
     * Sets the pointer for the linked list to the previous node and
     * returns that node
     *
     * @return Structures_LinkedList_SingleNode previous node in the linked list
     */
    public function previous()
    {
        if (!$this->current) {
            return false;
        }
        $this->current = $this->_getPreviousNode();
        return $this->current;
    }
    // }}}

    // {{{ protected function getTailNode()
    /**
     * Returns the tail node of the linked list.
     *
     * This is an expensive operation!
     *
     * @return bool Success or failure
     **/
    protected function getTailNode()
    {
        $tail_node = $this->root_node;
        while (($y = $tail_node->next()) !== false) {
            $tail_node = $y;
        }
        return $tail_node;
    }
    // }}}

    // {{{ private function _getPreviousNode()
    /**
     * Returns the node prior to the current node in the linked list.
     *
     * This is an expensive operation for a singly linked list!
     *
     * @param Structures_LinkedList_SingleNode $node (Optional) Specific node 
     * for which we want to find the previous node
     *
     * @return Structures_LinkedList_SingleNode Previous node
     **/
    private function _getPreviousNode($node = null)
    {
        if (!$node) {
            $node = $this->current;
        }
        $prior_node = $this->root_node;
        while (($y = $prior_node->next()) !== false) {
            if ($y == $node) {
                return $prior_node;
            }
            $prior_node = $y;
        }
        return null;
    }
    // }}}

    // {{{ function appendNode()
    /**
     * Adds a {@link Structures_LinkedList_SingleNode} object to the end of
     * the linked list.
     *
     * @param Structures_LinkedList_SingleNode $new_node New node to append
     *
     * @return bool Success or failure
     **/
    public function appendNode(Structures_LinkedList_SingleNode $new_node)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // This is just a special case of insertNode()
        $this->insertNode($new_node, $this->getTailNode());

        return true;
    }
    // }}}

    // {{{ function insertNode()
    /**
     * Inserts a {@link Structures_LinkedList_SingleNode} object into the linked
     * list, based on a reference node that already exists in the list.
     *
     * @param Structures_LinkedList_SingleNode $new_node      New node to add to
     * the list
     * @param Structures_LinkedList_SingleNode $existing_node Reference
     * position node
     * @param bool                             $before        Insert new node
     * before or after the existing node
     *
     * @return bool Success or failure
     **/
    public function insertNode($new_node, $existing_node, $before = false)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // Now add the node according to the requested mode
        switch ($before) {

        case true:
            if ($existing_node === $this->root_node) {
                $this->root_node = $new_node;
            }
            $previous_node = $this->_getPreviousNode($existing_node);
            if ($previous_node) {
                $previous_node->setNext($new_node);
            }
            $new_node->setNext($existing_node);

            break;

        case false:
            $next_node = $existing_node->next();
            if ($next_node) {
                $new_node->setNext($next_node);
            }
            $existing_node->setNext($new_node);

            break;

        }

        return true;
    }
    // }}}

    // {{{ function prependNode()
    /**
     * Adds a {@link Structures_LinkedList_SingleNode} object to the start
     * of the linked list.
     *
     * @param Structures_LinkedList_SingleNode $new_node Node to prepend
     * to the list
     *
     * @return bool Success or failure
     **/
    public function prependNode(Structures_LinkedList_SingleNode $new_node)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // This is just a special case of insertNode()
        $this->insertNode($new_node, $this->root_node, true);

        return true;
    }
    // }}}

    // {{{ function deleteNode()
    /**
     * Deletes a {@link Structures_LinkedList_SingleNode} from the list.
     *
     * @param Structures_LinkedList_SingleNode $node Node to delete.
     *
     * @return null
     */
    public function deleteNode($node)
    {
        /* If this is the root node, and there are more nodes in the list,
         * make the next node the new root node before deleting this node.
         */
        if ($node === $this->root_node) {
            $this->root_node = $node->next();
        }
        
        /* If this is the current node, make the next node the current node.
         *
         * If that fails, null isn't such a bad place to be.
         */
        if ($node === $this->current) {
            if ($node->next()) {
                $this->current = $node->next();
            } else {
                $this->current = null;
            }
        }
        $node->__destruct();
    }
    // }}}

}
// }}}

// {{{ class Structures_LinkedList_SingleNode
/**
 * The Structures_LinkedList_SingleNode class represents a node in a
 * {@link Structures_LinkedList_Single} linked list structure.
 *
 * @category Structures
 * @package  Structures_LinkedList_Single
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList_Single
 */
class Structures_LinkedList_SingleNode
{
    // {{{ properties
    /**
     * Next node in the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $next;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_SingleNode constructor
     */
    public function __construct()
    {
        $this->next = null;
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Removes node from the list, adjusting the related nodes accordingly.
     *
     * This is a problem if the node is the root node for the list.
     * At this point, however, we do not have access to the list itself. Hmm.
     */
    public function __destruct()
    {
    }
    // }}}

    // {{{ function next()
    /**
     * Return the next node in the linked list
     *
     * @return Structures_LinkedList_SingleNode next node in the linked list
     */
    public function next()
    {
        if ($this->next) {
            return $this->next;
        } else {
            return false;
        }
    }
    // }}}

    // {{{ function previous()
    /**
     * Return the previous node in the linked list
     *
     * Stub method for Structures_LinkedList_DoubleNode to override.
     *
     * @return Structures_LinkedList_SingleNode previous node in the linked list
     */
    public function previous()
    {
        return false;
    }
    // }}}

    // {{{ function setNext()
    /**
     * Sets the pointer for the next node in the linked list to the
     * specified node
     *
     * @param Structures_LinkedList_SingleNode $node new next node in
     * the linked list
     *
     * @return Structures_LinkedList_SingleNode new next node in the linked list
     */
    public function setNext($node = null)
    {
        $this->next = $node;
        return $this->next;
    }
    // }}}

    // {{{ function setPrevious()
    /**
     * Sets the pointer for the next node in the linked list to the
     * specified node
     *
     * Stub method for Structures_LinkedList_DoubleNode to override.
     *
     * @param Structures_LinkedList_SingleNode $node new next node in
     * the linked list
     *
     * @return Structures_LinkedList_SingleNode new next node in the linked list
     */
    public function setPrevious($node = null)
    {
        return false;
    }
    // }}}
}

// }}}

?>
pear/Structures/LinkedList/Double.php000064400000026445151732710010013653 0ustar00<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker textwidth=80: */

/**
 * Linked list structure
 * 
 * This package implements a doubly linked list structure. Each node
 * (Structures_LinkedList_DoubleNode object) in the list
 * (Structures_LinkedList_Double) knows the previous node and the next
 * node in the list. Unlike an array, you can insert or delete nodes at
 * arbitrary points in the list.
 *
 * If your application normally traverses the linked list in a forward-only
 * direction, use the singly-linked list implemented by
 * {@link Structures_LinkedList_Single}. If, however, your application
 * needs to traverse the list backwards, or insert nodes into the list before
 * other nodes in the list, use the double-linked list implemented by
 * {@link Structures_LinkedList_Double} to give your application better
 * performance at the cost of a slightly larger memory footprint.
 *
 * Structures_LinkedList_Double implements the Iterator interface so control
 * structures like foreach($list as $node) and while($list->next()) work
 * as expected.
 *
 * To use this package, derive a child class from
 * Structures_LinkedList_DoubleNode  and add data to the object. Then use the
 * Structures_LinkedList_Double class to access the nodes.
 *
 * PHP version 5
 *
 * LICENSE:  Copyright 2006 Dan Scott
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @category  Structures
 * @package   Structures_LinkedList_Double
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2006 Dan Scott
 * @license   http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @version   CVS: $Id: Double.php -1   $
 * @link      http://pear.php.net/package/Structures_LinkedList
 * @example   double_link_example.php
 *
 * @todo Add some actual error conditions
 **/

require_once 'PEAR/Exception.php';
require_once 'Single.php';

// {{{ class Structures_LinkedList_Double
/**
 * The Structures_LinkedList_Double class represents a linked list structure
 * composed of {@link Structures_LinkedList_DoubleNode} objects.
 *
 * @category Structures
 * @package  Structures_LinkedList_Double
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList
 */
class Structures_LinkedList_Double extends Structures_LinkedList_Single implements Iterator
{
    // {{{ properties
    /**
     * Tail node of the linked list
     * @var Structures_LinkedList_DoubleNode
     */
    protected $tail_node;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_Double constructor
     *
     * @param Structures_LinkedList_DoubleNode $root root node for the
     * linked list
     */
    function __construct(Structures_LinkedList_DoubleNode $root = null)
    {
        if ($root) {
            $this->tail_node = $root;
        } else {
            $this->tail_node = null;
        }
        parent::__construct($root);
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Structures_LinkedList_Double destructor
     *
     * If we do not destroy all of the references in the linked list,
     * we will quickly run out of memory for large / complex structures.
     *
     */
    function __destruct()
    {
        /*
         * Starting with root node, set last node = root_node
         *   get next node
         *   if next node exists:
         *     delete last node's references to next node and previous node
         *     make the old next node the new last node
         */
        if (!$last_node = $this->root_node) {
            return;
        }
        while (($next_node = $last_node->next()) !== false) {
            $last_node->setNext(null);
            $last_node->setPrevious(null);
            $last_node = $next_node;
        }
        $this->current = null;
        $this->root_node = null;
        $this->tail_node = null;
        $last_node = null;
        $next_node = null;
    }
    // }}}

    // {{{ function end()
    /**
     * Sets the pointer for the linked list to its last node
     *
     * @return Structures_LinkedList_DoubleNode last node in the linked list
     */
    public function end()
    {
        if ($this->tail_node) {
            $this->current = $this->tail_node;
        } else {
            $this->current = null;
        }
        return $this->current;
    }
    // }}}

    // {{{ function previous()
    /**
     * Sets the pointer for the linked list to the previous node and
     * returns that node
     *
     * @return Structures_LinkedList_DoubleNode previous node in the linked list
     */
    public function previous()
    {
        if (!$this->current()->previous()) {
            return false;
        }
        $this->current = $this->current()->previous();
        return $this->current();
    }
    // }}}

    // {{{ function insertNode()
    /**
     * Inserts a {@link Structures_LinkedList_DoubleNode} object into the linked
     * list, based on a reference node that already exists in the list.
     *
     * @param Structures_LinkedList_DoubleNode $new_node      New node to add to the list
     * @param Structures_LinkedList_DoubleNode $existing_node Reference position node
     * @param bool                             $before        Insert new node before or after the existing node
     *
     * @return bool Success or failure
     **/
    public function insertNode($new_node, $existing_node, $before = false)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
        }

        // Now add the node according to the requested mode
        switch ($before) {

        case true:
            $previous_node = $existing_node->previous();
            if ($previous_node) {
                $previous_node->setNext($new_node);
                $new_node->setPrevious($previous_node);
            } else {
                // The existing node must be root node; make new node root
                $this->root_node = $new_node;
                $new_node->setPrevious();
            }
            $new_node->setNext($existing_node);
            $existing_node->setPrevious($new_node);

            break;

        case false:
            $new_node->setPrevious($existing_node);
            $next_node = $existing_node->next();
            if ($next_node) {
                $new_node->setNext($next_node);
                $next_node->setPrevious($new_node);
            } else {
                // The existing node must have been the tail node
                $this->tail_node = $new_node;
            }
            $existing_node->setNext($new_node);

            break;

        }

        return true;
    }
    // }}}

    // {{{ protected function getTailNode()
    /**
     * Returns the tail node of the linked list.
     *
     * This is a cheap operation for a doubly-linked list.
     *
     * @return bool Success or failure
     **/
    protected function getTailNode()
    {
        return $this->tail_node;
    }
    // }}}

    // {{{ function deleteNode()
    /**
     * Deletes a {@link Structures_LinkedList_DoubleNode} from the list.
     *
     * @param Structures_LinkedList_DoubleNode $node Node to delete.
     *
     * @return null
     */
    public function deleteNode($node)
    {
        /* If this is the root node, and there are more nodes in the list,
         * make the next node the new root node before deleting this node.
         */
        if ($node === $this->root_node) {
            $this->root_node = $node->next();
        }
        
        /* If this is the tail node, and there are more nodes in the list,
         * make the previous node the tail node before deleting this node
         */
        if ($node === $this->tail_node) {
            $this->tail_node = $node->previous();
        }

        /* If this is the current node, and there are other nodes in the list,
         * try making the previous node the current node so that next() works
         * as expected.
         *
         * If that fails, make the next node the current node.
         *
         * If that fails, null isn't such a bad place to be.
         */
        if ($node === $this->current) {
            if ($node->previous()) {
                $this->current = $node->previous();
            } elseif ($node->next()) {
                $this->current = $node->next();
            } else {
                $this->current = null;
            }
        }
        $node->__destruct();
    }
    // }}}

}
// }}}

// {{{ class Structures_LinkedList_DoubleNode
/**
 * The Structures_LinkedList_DoubleNode class represents a node in a
 * {@link Structures_LinkedList_Double} linked list structure.
 *
 * @category Structures
 * @package  Structures_LinkedList_Double
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList
 */
class Structures_LinkedList_DoubleNode extends Structures_LinkedList_SingleNode
{
    // {{{ properties
    /**
     * Previous node in the linked list
     * @var Structures_LinkedList_DoubleNode
     */
    protected $previous;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_DoubleNode constructor
     */
    public function __construct()
    {
        $this->next = null;
        $this->previous = null;
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Removes node from the list, adjusting the related nodes accordingly.
     *
     * This is a problem if the node is the root node for the list.
     * At this point, however, we do not have access to the list itself. Hmm.
     */
    public function __destruct()
    {
        $next = $this->next();
        $previous = $this->previous();
        if ($previous && $next) {
            $previous->setNext($next);
            $next->setPrevious($previous);
        } elseif ($previous) {
            $previous->setNext();
        } elseif ($next) {
            $next->setPrevious();
        }
    }
    // }}}

    // {{{ function previous()
    /**
     * Return the previous node in the linked list
     *
     * @return Structures_LinkedList_DoubleNode previous node in the linked list
     */
    public function previous()
    {
        if ($this->previous) {
            return $this->previous;
        } else {
            return false;
        }
    }
    // }}}

    // {{{ function setPrevious()
    /**
     * Sets the pointer for the previous node in the linked list
     * to the specified node
     *
     * @param Structures_LinkedList_DoubleNode $node new previous node
     * in the linked list
     *
     * @return Structures_LinkedList_DoubleNode new previous node in
     * the linked list
     */
    public function setPrevious($node = null)
    {
        $this->previous = $node;
        return $this->previous;
    }
    // }}}

}
// }}}

?>
pear/Structures/Graph/Manipulator/TopologicalSorter.php000064400000015564151732710020017407 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph is distributed in the hope that it will be useful,         |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
// | GNU Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Manipulator_TopologicalSorter class.
 * 
 * @package Structures_Graph
 */

require_once 'PEAR.php';
require_once 'Structures/Graph.php';
require_once 'Structures/Graph/Node.php';
require_once 'Structures/Graph/Manipulator/AcyclicTest.php';

/**
 * The Structures_Graph_Manipulator_TopologicalSorter is a manipulator 
 * which is able to return the set of nodes in a graph, sorted by topological 
 * order.
 *
 * A graph may only be sorted topologically iff it's a DAG. You can test it
 * with the Structures_Graph_Manipulator_AcyclicTest.
 * 
 * @author    S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright (c) 2004 by S�rgio Carvalho
 * @see       Structures_Graph_Manipulator_AcyclicTest
 * @package   Structures_Graph
 */
class Structures_Graph_Manipulator_TopologicalSorter
{
    /**
     * This is a variant of Structures_Graph::inDegree which does 
     * not count nodes marked as visited.
     *
     * @param object $node Node to check
     *
     * @return integer Number of non-visited nodes that link to this one
     */
    protected static function _nonVisitedInDegree(&$node)
    {
        $result = 0;
        $graphNodes =& $node->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ((!$graphNodes[$key]->getMetadata('topological-sort-visited'))
                && $graphNodes[$key]->connectsTo($node)
            ) {
                $result++;
            }
        }
        return $result;
        
    }

    /**
     * Sort implementation
     *
     * @param object $graph Graph to sort
     *
     * @return void
     */
    protected static function _sort(&$graph)
    {
        // Mark every node as not visited
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        $refGenerator = array();
        foreach ($nodeKeys as $key) {
            $refGenerator[] = false;
            $nodes[$key]->setMetadata(
                'topological-sort-visited',
                $refGenerator[sizeof($refGenerator) - 1]
            );
        }

        // Iteratively peel off leaf nodes
        $topologicalLevel = 0;
        do {
            // Find out which nodes are leafs (excluding visited nodes)
            $leafNodes = array();
            foreach ($nodeKeys as $key) {
                if ((!$nodes[$key]->getMetadata('topological-sort-visited'))
                    && static::_nonVisitedInDegree($nodes[$key]) == 0
                ) {
                    $leafNodes[] =& $nodes[$key];
                }
            }
            // Mark leafs as visited
            $refGenerator[] = $topologicalLevel;
            for ($i = sizeof($leafNodes) - 1; $i>=0; $i--) {
                $visited =& $leafNodes[$i]->getMetadata('topological-sort-visited');
                $visited = true;
                $leafNodes[$i]->setMetadata('topological-sort-visited', $visited);
                $leafNodes[$i]->setMetadata(
                    'topological-sort-level',
                    $refGenerator[sizeof($refGenerator) - 1]
                );
            }
            $topologicalLevel++;
        } while (sizeof($leafNodes) > 0);

        // Cleanup visited marks
        foreach ($nodeKeys as $key) {
            $nodes[$key]->unsetMetadata('topological-sort-visited');
        }
    }

    /**
     * Sort returns the graph's nodes, sorted by topological order. 
     * 
     * The result is an array with as many entries as topological levels.
     * Each entry in this array is an array of nodes within
     * the given topological level.
     *
     * @param object $graph Graph to sort
     *
     * @return array The graph's nodes, sorted by topological order.
     */
    public static function sort(&$graph)
    {
        // We only sort graphs
        if (!is_a($graph, 'Structures_Graph')) {
            return Pear::raiseError(
                'Structures_Graph_Manipulator_TopologicalSorter::sort received'
                . ' an object that is not a Structures_Graph',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }
        if (!Structures_Graph_Manipulator_AcyclicTest::isAcyclic($graph)) {
            return Pear::raiseError(
                'Structures_Graph_Manipulator_TopologicalSorter::sort'
                . ' received an graph that has cycles',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }

        Structures_Graph_Manipulator_TopologicalSorter::_sort($graph);
        $result = array();

        // Fill out result array
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        foreach ($nodeKeys as $key) {
            if (!array_key_exists($nodes[$key]->getMetadata('topological-sort-level'), $result)) {
                $result[$nodes[$key]->getMetadata('topological-sort-level')]
                    = array();
            }
            $result[$nodes[$key]->getMetadata('topological-sort-level')][]
                =& $nodes[$key];
            $nodes[$key]->unsetMetadata('topological-sort-level');
        }

        return $result;
    }
}
?>
pear/Structures/Graph/Manipulator/AcyclicTest.php000064400000013201151732710020016125 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph is distributed in the hope that it will be useful,         |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
// | GNU Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Manipulator_AcyclicTest graph manipulator.
 * 
 * @see Structures_Graph_Manipulator_AcyclicTest
 * @package Structures_Graph
 */

/* dependencies {{{ */
/** */
require_once 'PEAR.php';
/** */
require_once 'Structures/Graph.php';
/** */
require_once 'Structures/Graph/Node.php';
/* }}} */

/* class Structures_Graph_Manipulator_AcyclicTest {{{ */
/**
 * The Structures_Graph_Manipulator_AcyclicTest is a graph manipulator
 * which tests whether a graph contains a cycle. 
 * 
 * The definition of an acyclic graph used in this manipulator is that of a 
 * DAG. The graph must be directed, or else it is considered cyclic, even when 
 * there are no arcs.
 *
 * @author		S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright	(c) 2004 by S�rgio Carvalho
 * @package Structures_Graph
 */
class Structures_Graph_Manipulator_AcyclicTest {
    /* _nonVisitedInDegree {{{ */
    /**
    *
    * This is a variant of Structures_Graph::inDegree which does 
    * not count nodes marked as visited.
    *
    * @return	integer	 Number of non-visited nodes that link to this one
    */
    protected static function _nonVisitedInDegree(&$node) {
        $result = 0;
        $graphNodes =& $node->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ((!$graphNodes[$key]->getMetadata('acyclic-test-visited')) && $graphNodes[$key]->connectsTo($node)) $result++;
        }
        return $result;
        
    }
    /* }}} */

    /* _isAcyclic {{{ */
    /**
     * Check if the graph is acyclic
     */
    protected static function _isAcyclic(&$graph) {
        // Mark every node as not visited
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        $refGenerator = array();
        foreach($nodeKeys as $key) {
            $refGenerator[] = false;
            $nodes[$key]->setMetadata('acyclic-test-visited', $refGenerator[sizeof($refGenerator) - 1]);
        }

        // Iteratively peel off leaf nodes
        do {
            // Find out which nodes are leafs (excluding visited nodes)
            $leafNodes = array();
            foreach($nodeKeys as $key) {
                if ((!$nodes[$key]->getMetadata('acyclic-test-visited')) && Structures_Graph_Manipulator_AcyclicTest::_nonVisitedInDegree($nodes[$key]) == 0) {
                    $leafNodes[] =& $nodes[$key];
                }
            }
            // Mark leafs as visited
            for ($i=sizeof($leafNodes) - 1; $i>=0; $i--) {
                $visited =& $leafNodes[$i]->getMetadata('acyclic-test-visited');
                $visited = true;
                $leafNodes[$i]->setMetadata('acyclic-test-visited', $visited);
            }
        } while (sizeof($leafNodes) > 0);

        // If graph is a DAG, there should be no non-visited nodes. Let's try to prove otherwise
        $result = true;
        foreach($nodeKeys as $key) if (!$nodes[$key]->getMetadata('acyclic-test-visited')) $result = false;
        
        // Cleanup visited marks
        foreach($nodeKeys as $key) $nodes[$key]->unsetMetadata('acyclic-test-visited');

        return $result;
    }
    /* }}} */

    /* isAcyclic {{{ */
    /**
    *
    * isAcyclic returns true if a graph contains no cycles, false otherwise.
    *
    * @return	boolean	 true iff graph is acyclic
    */
    public static function isAcyclic(&$graph) {
        // We only test graphs
        if (!is_a($graph, 'Structures_Graph')) return Pear::raiseError('Structures_Graph_Manipulator_AcyclicTest::isAcyclic received an object that is not a Structures_Graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        if (!$graph->isDirected()) return false; // Only directed graphs may be acyclic

        return Structures_Graph_Manipulator_AcyclicTest::_isAcyclic($graph);
    }
    /* }}} */
}
/* }}} */
?>
pear/Structures/Graph/Node.php000064400000025440151732710020012320 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph is distributed in the hope that it will be useful,         |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
// | GNU Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Node class
 * 
 * @see Structures_Graph_Node
 * @package Structures_Graph
 */

/* dependencies {{{ */
/** */
require_once 'PEAR.php';
/** */
require_once 'Structures/Graph.php';
/* }}} */

/* class Structures_Graph_Node {{{ */
/**
 * The Structures_Graph_Node class represents a Node that can be member of a 
 * graph node set.
 *
 * A graph node can contain data. Under this API, the node contains default data, 
 * and key index data. It behaves, thus, both as a regular data node, and as a 
 * dictionary (or associative array) node.
 * 
 * Regular data is accessed via getData and setData. Key indexed data is accessed
 * via getMetadata and setMetadata.
 *
 * @author		S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright	(c) 2004 by S�rgio Carvalho
 * @package Structures_Graph
 */
/* }}} */
class Structures_Graph_Node {
    /* fields {{{ */
    /** 
     * @access private 
     */
    var $_data = null;
    /** @access private */
    var $_metadata = array();
    /** @access private */
    var $_arcs = array();
    /** @access private */
    var $_graph = null;
    /* }}} */

    /* Constructor {{{ */
    /**
    *
    * Constructor
    *
    * @access	public
    */
    function __construct() {
    }
    /* }}} */

    /* getGraph {{{ */
    /**
    *
    * Node graph getter
    *
    * @return	Structures_Graph	Graph where node is stored
    * @access	public
    */
    function &getGraph() {
        return $this->_graph;
    }
    /* }}} */

    /* setGraph {{{ */
    /**
    *
    * Node graph setter. This method should not be called directly. Use Graph::addNode instead.
    *
    * @param    Structures_Graph   Set the graph for this node. 
    * @see      Structures_Graph::addNode()
    * @access	public
    */
    function setGraph(&$graph) {
        $this->_graph =& $graph;
    }
    /* }}} */

    /* getData {{{ */
    /**
    *
    * Node data getter.
    * 
    * Each graph node can contain a reference to one variable. This is the getter for that reference.
    *
    * @return	mixed	Data stored in node
    * @access	public
    */
    function &getData() {
        return $this->_data;
    }
    /* }}} */

    /* setData {{{ */
    /**
    *
    * Node data setter
    *
    * Each graph node can contain a reference to one variable. This is the setter for that reference.
    *
    * @return	mixed	Data to store in node
    * @access	public
    */
    function setData(&$data) {
        $this->_data =& $data;
    }
    /* }}} */

    /* metadataKeyExists {{{ */
    /**
    *
    * Test for existence of metadata under a given key.
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method tests whether a given metadata key exists for this node.
    *
    * @param    string    Key to test
    * @return	boolean	 
    * @access	public
    */
    function metadataKeyExists($key) {
        return array_key_exists($key, $this->_metadata);
    }
    /* }}} */

    /* getMetadata {{{ */
    /**
    *
    * Node metadata getter
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method gets the data under the given key. If the key does
    * not exist, an error will be thrown, so testing using metadataKeyExists might be needed.
    *
    * @param    string  Key
    * @param    boolean nullIfNonexistent (defaults to false).
    * @return	mixed	Metadata Data stored in node under given key
    * @see      metadataKeyExists
    * @access	public
    */
    function &getMetadata($key, $nullIfNonexistent = false) {
        if (array_key_exists($key, $this->_metadata)) {
            return $this->_metadata[$key];
        } else {
            if ($nullIfNonexistent) {
                $a = null;
                return $a;
            } else {
                $a = Pear::raiseError('Structures_Graph_Node::getMetadata: Requested key does not exist', STRUCTURES_GRAPH_ERROR_GENERIC);
                return $a;
            }
        }
    }
    /* }}} */

    /* unsetMetadata {{{ */
    /**
    *
    * Delete metadata by key
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method removes any data that might be stored under the provided key.
    * If the key does not exist, no error is thrown, so it is safe using this method without testing for key existence.
    *
    * @param    string  Key
    * @access	public
    */
    function unsetMetadata($key) {
        if (array_key_exists($key, $this->_metadata)) unset($this->_metadata[$key]);
    }
    /* }}} */

    /* setMetadata {{{ */
    /**
    *
    * Node metadata setter
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method stores data under the given key. If the key already exists,
    * previously stored data is discarded.
    *
    * @param    string  Key
    * @param    mixed   Data 
    * @access	public
    */
    function setMetadata($key, &$data) {
        $this->_metadata[$key] =& $data;
    }
    /* }}} */

    /* _connectTo {{{ */
    /** @access private */
    function _connectTo(&$destinationNode) {
        $this->_arcs[] =& $destinationNode;
    }
    /* }}} */

    /* connectTo {{{ */
    /**
    *
    * Connect this node to another one.
    * 
    * If the graph is not directed, the reverse arc, connecting $destinationNode to $this is also created.
    *
    * @param    Structures_Graph_Node Node to connect to
    * @access	public
    */
    function connectTo(&$destinationNode) {
        // We only connect to nodes
        if (!is_a($destinationNode, 'Structures_Graph_Node')) return Pear::raiseError('Structures_Graph_Node::connectTo received an object that is not a Structures_Graph_Node', STRUCTURES_GRAPH_ERROR_GENERIC);
        // Nodes must already be in graphs to be connected
        if ($this->_graph == null) return Pear::raiseError('Structures_Graph_Node::connectTo Tried to connect a node that is not in a graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        if ($destinationNode->getGraph() == null) return Pear::raiseError('Structures_Graph_Node::connectTo Tried to connect to a node that is not in a graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        // Connect here
        $this->_connectTo($destinationNode);
        // If graph is undirected, connect back
        if (!$this->_graph->isDirected()) {
            $destinationNode->_connectTo($this);
        }
    }
    /* }}} */

    /* getNeighbours {{{ */
    /**
    *
    * Return nodes connected to this one.
    * 
    * @return   array   Array of nodes
    * @access	public
    */
    function getNeighbours() {
        return $this->_arcs;
    }
    /* }}} */

    /* connectsTo {{{ */
    /**
    *
    * Test wether this node has an arc to the target node
    *
    * @return	boolean   True if the two nodes are connected
    * @access	public
    */
    function connectsTo(&$target) {
        if (version_compare(PHP_VERSION, '5.0.0') >= 0) {
            return in_array($target, $this->getNeighbours(), true);
        }

        $copy = $target;
        $arcKeys = array_keys($this->_arcs);
        foreach($arcKeys as $key) {
            /* ZE1 chokes on this expression:
                if ($target === $arc) return true;
              so, we'll use more convoluted stuff
            */
            $arc =& $this->_arcs[$key];
            $target = true;
            if ($arc === true) {
                $target = false;
                if ($arc === false) {
                    $target = $copy;
                    return true;
                }
            }
        }
        $target = $copy;
        return false;
    }
    /* }}} */

    /* inDegree {{{ */
    /**
    *
    * Calculate the in degree of the node.
    * 
    * The indegree for a node is the number of arcs entering the node. For non directed graphs, 
    * the indegree is equal to the outdegree.
    *
    * @return	integer	 In degree of the node
    * @access	public
    */
    function inDegree() {
        if ($this->_graph == null) return 0;
        if (!$this->_graph->isDirected()) return $this->outDegree();
        $result = 0;
        $graphNodes =& $this->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ($graphNodes[$key]->connectsTo($this)) $result++;
        }
        return $result;
        
    }
    /* }}} */

    /* outDegree {{{ */
    /**
    *
    * Calculate the out degree of the node.
    *
    * The outdegree for a node is the number of arcs exiting the node. For non directed graphs,
    * the outdegree is always equal to the indegree.
    * 
    * @return	integer	 Out degree of the node
    * @access	public
    */
    function outDegree() {
        if ($this->_graph == null) return 0;
        return sizeof($this->_arcs);
    }
    /* }}} */
}
?>
pear/Structures/Graph.php000064400000014037151732710020011433 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph is distributed in the hope that it will be useful,         |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
// | GNU Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * The Graph.php file contains the definition of the Structures_Graph class 
 *
 * @package Structures_Graph
 */

/* dependencies {{{ */
require_once 'PEAR.php';
require_once 'Structures/Graph/Node.php';
/* }}} */

define('STRUCTURES_GRAPH_ERROR_GENERIC', 100);

/* class Structures_Graph {{{ */
/**
 * The Structures_Graph class represents a graph data structure. 
 *
 * A Graph is a data structure composed by a set of nodes, connected by arcs.
 * Graphs may either be directed or undirected. In a directed graph, arcs are 
 * directional, and can be traveled only one way. In an undirected graph, arcs
 * are bidirectional, and can be traveled both ways.
 *
 * @author    S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright (c) 2004 by S�rgio Carvalho
 * @package   Structures_Graph
 */
/* }}} */
class Structures_Graph
{
    /**
     * List of node objects in this graph
     * @access private
     */
    var $_nodes = array();

    /**
     * If the graph is directed or not
     * @access private
     */
    var $_directed = false;


    /**
     * Constructor
     *
     * @param boolean $directed Set to true if the graph is directed.
     *                          Set to false if it is not directed.
     */
    public function __construct($directed = true)
    {
        $this->_directed = $directed;
    }

    /**
     * Old constructor (PHP4-style; kept for BC with extending classes)
     *
     * @param boolean $directed Set to true if the graph is directed.
     *                          Set to false if it is not directed.
     *
     * @return void
     */
    public function Structures_Graph($directed = true)
    {
        $this->__construct($directed);
    }

    /**
     * Return true if a graph is directed
     *
     * @return boolean true if the graph is directed
     */
    public function isDirected()
    {
        return (boolean) $this->_directed;
    }

    /**
     * Add a Node to the Graph
     *
     * @param Structures_Graph_Node $newNode The node to be added.
     *
     * @return void
     */
    public function addNode(&$newNode)
    {
        // We only add nodes
        if (!is_a($newNode, 'Structures_Graph_Node')) {
            return Pear::raiseError(
                'Structures_Graph::addNode received an object that is not'
                . ' a Structures_Graph_Node',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }

        //Graphs are node *sets*, so duplicates are forbidden.
        // We allow nodes that are exactly equal, but disallow equal references.
        foreach ($this->_nodes as $key => $node) {
            /*
             ZE1 equality operators choke on the recursive cycle introduced
             by the _graph field in the Node object.
             So, we'll check references the hard way
             (change $this->_nodes[$key] and check if the change reflects in
             $node)
            */
            $savedData = $this->_nodes[$key];
            $referenceIsEqualFlag = false;
            $this->_nodes[$key] = true;
            if ($node === true) {
                $this->_nodes[$key] = false;
                if ($node === false) {
                    $referenceIsEqualFlag = true;
                }
            }
            $this->_nodes[$key] = $savedData;
            if ($referenceIsEqualFlag) {
                return Pear::raiseError(
                    'Structures_Graph::addNode received an object that is'
                    . ' a duplicate for this dataset',
                    STRUCTURES_GRAPH_ERROR_GENERIC
                );
            }
        }
        $this->_nodes[] =& $newNode;
        $newNode->setGraph($this);
    }

    /**
     * Remove a Node from the Graph
     *
     * @param Structures_Graph_Node $node The node to be removed from the graph
     *
     * @return void
     * @todo   This is unimplemented
     */
    public function removeNode(&$node)
    {
    }

    /**
     * Return the node set, in no particular order.
     * For ordered node sets, use a Graph Manipulator insted.
     *
     * @return array The set of nodes in this graph
     * @see    Structures_Graph_Manipulator_TopologicalSorter
     */
    public function &getNodes()
    {
        return $this->_nodes;
    }
}
?>
pear/.channels/pear.php.net.reg000064400000001050151732710030012340 0ustar00a:5:{s:14:"suggestedalias";s:4:"pear";s:4:"name";s:12:"pear.php.net";s:7:"summary";s:40:"PHP Extension and Application Repository";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:3:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:25:"http://pear.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:25:"http://pear.php.net/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:25:"http://pear.php.net/rest/";}}}}}s:13:"_lastmodified";i:1747070008;}pear/.channels/pecl.php.net.reg000064400000001053151732710030012337 0ustar00a:6:{s:14:"suggestedalias";s:4:"pecl";s:4:"name";s:12:"pecl.php.net";s:7:"summary";s:31:"PHP Extension Community Library";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:2:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:25:"http://pecl.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:25:"http://pecl.php.net/rest/";}}}}}s:15:"validatepackage";a:2:{s:8:"_content";s:19:"PEAR_Validator_PECL";s:7:"attribs";a:1:{s:7:"version";s:3:"1.0";}}s:13:"_lastmodified";i:1747070008;}pear/.channels/doc.php.net.reg000064400000001025151732710030012160 0ustar00a:5:{s:14:"suggestedalias";s:7:"phpdocs";s:4:"name";s:11:"doc.php.net";s:7:"summary";s:22:"PHP Documentation Team";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:3:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:24:"http://doc.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:24:"http://doc.php.net/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:24:"http://doc.php.net/rest/";}}}}}s:13:"_lastmodified";i:1747070008;}pear/.channels/.alias/pecl.txt000064400000000014151732710030012171 0ustar00pecl.php.netpear/.channels/.alias/pear.txt000064400000000014151732710030012175 0ustar00pear.php.netpear/.channels/.alias/phpdocs.txt000064400000000013151732710030012705 0ustar00doc.php.netpear/.channels/__uri.reg000064400000000413151732710030011135 0ustar00a:4:{s:4:"name";s:5:"__uri";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:4:"****";}}}}s:7:"summary";s:34:"Pseudo-channel for static packages";s:13:"_lastmodified";i:1747070008;}pear/PEAR/Command.php000064400000030213151732710030010307 0ustar00<?php
/**
 * PEAR_Command, command pattern class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/XMLParser.php';

/**
 * List of commands and what classes they are implemented in.
 * @var array command => implementing class
 */
$GLOBALS['_PEAR_Command_commandlist'] = array();

/**
 * List of commands and their descriptions
 * @var array command => description
 */
$GLOBALS['_PEAR_Command_commanddesc'] = array();

/**
 * List of shortcuts to common commands.
 * @var array shortcut => command
 */
$GLOBALS['_PEAR_Command_shortcuts'] = array();

/**
 * Array of command objects
 * @var array class => object
 */
$GLOBALS['_PEAR_Command_objects'] = array();

/**
 * PEAR command class, a simple factory class for administrative
 * commands.
 *
 * How to implement command classes:
 *
 * - The class must be called PEAR_Command_Nnn, installed in the
 *   "PEAR/Common" subdir, with a method called getCommands() that
 *   returns an array of the commands implemented by the class (see
 *   PEAR/Command/Install.php for an example).
 *
 * - The class must implement a run() function that is called with three
 *   params:
 *
 *    (string) command name
 *    (array)  assoc array with options, freely defined by each
 *             command, for example:
 *             array('force' => true)
 *    (array)  list of the other parameters
 *
 *   The run() function returns a PEAR_CommandResponse object.  Use
 *   these methods to get information:
 *
 *    int getStatus()   Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL)
 *                      *_PARTIAL means that you need to issue at least
 *                      one more command to complete the operation
 *                      (used for example for validation steps).
 *
 *    string getMessage()  Returns a message for the user.  Remember,
 *                         no HTML or other interface-specific markup.
 *
 *   If something unexpected happens, run() returns a PEAR error.
 *
 * - DON'T OUTPUT ANYTHING! Return text for output instead.
 *
 * - DON'T USE HTML! The text you return will be used from both Gtk,
 *   web and command-line interfaces, so for now, keep everything to
 *   plain text.
 *
 * - DON'T USE EXIT OR DIE! Always use pear errors.  From static
 *   classes do PEAR::raiseError(), from other classes do
 *   $this->raiseError().
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command
{
    // {{{ factory()

    /**
     * Get the right object for executing a command.
     *
     * @param string $command The name of the command
     * @param object $config  Instance of PEAR_Config object
     *
     * @return object the command object or a PEAR error
     */
    public static function &factory($command, &$config)
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
            $a = PEAR::raiseError("unknown command `$command'");
            return $a;
        }
        $class = $GLOBALS['_PEAR_Command_commandlist'][$command];
        if (!class_exists($class)) {
            require_once $GLOBALS['_PEAR_Command_objects'][$class];
        }
        if (!class_exists($class)) {
            $a = PEAR::raiseError("unknown command `$command'");
            return $a;
        }
        $ui =& PEAR_Command::getFrontendObject();
        $obj = new $class($ui, $config);
        return $obj;
    }

    // }}}
    // {{{ & getObject()
    public static function &getObject($command)
    {
        $class = $GLOBALS['_PEAR_Command_commandlist'][$command];
        if (!class_exists($class)) {
            require_once $GLOBALS['_PEAR_Command_objects'][$class];
        }
        if (!class_exists($class)) {
            return PEAR::raiseError("unknown command `$command'");
        }
        $ui =& PEAR_Command::getFrontendObject();
        $config = &PEAR_Config::singleton();
        $obj = new $class($ui, $config);
        return $obj;
    }

    // }}}
    // {{{ & getFrontendObject()

    /**
     * Get instance of frontend object.
     *
     * @return object|PEAR_Error
     */
    public static function &getFrontendObject()
    {
        $a = &PEAR_Frontend::singleton();
        return $a;
    }

    // }}}
    // {{{ & setFrontendClass()

    /**
     * Load current frontend class.
     *
     * @param string $uiclass Name of class implementing the frontend
     *
     * @return object the frontend object, or a PEAR error
     */
    public static function &setFrontendClass($uiclass)
    {
        $a = &PEAR_Frontend::setFrontendClass($uiclass);
        return $a;
    }

    // }}}
    // {{{ setFrontendType()

    /**
     * Set current frontend.
     *
     * @param string $uitype Name of the frontend type (for example "CLI")
     *
     * @return object the frontend object, or a PEAR error
     */
    public static function setFrontendType($uitype)
    {
        $uiclass = 'PEAR_Frontend_' . $uitype;
        return PEAR_Command::setFrontendClass($uiclass);
    }

    // }}}
    // {{{ registerCommands()

    /**
     * Scan through the Command directory looking for classes
     * and see what commands they implement.
     *
     * @param bool   (optional) if FALSE (default), the new list of
     *               commands should replace the current one.  If TRUE,
     *               new entries will be merged with old.
     *
     * @param string (optional) where (what directory) to look for
     *               classes, defaults to the Command subdirectory of
     *               the directory from where this file (__FILE__) is
     *               included.
     *
     * @return bool TRUE on success, a PEAR error on failure
     */
    public static function registerCommands($merge = false, $dir = null)
    {
        $parser = new PEAR_XMLParser;
        if ($dir === null) {
            $dir = dirname(__FILE__) . '/Command';
        }
        if (!is_dir($dir)) {
            return PEAR::raiseError("registerCommands: opendir($dir) '$dir' does not exist or is not a directory");
        }
        $dp = @opendir($dir);
        if (empty($dp)) {
            return PEAR::raiseError("registerCommands: opendir($dir) failed");
        }
        if (!$merge) {
            $GLOBALS['_PEAR_Command_commandlist'] = array();
        }

        while ($file = readdir($dp)) {
            if ($file[0] == '.' || substr($file, -4) != '.xml') {
                continue;
            }

            $f = substr($file, 0, -4);
            $class = "PEAR_Command_" . $f;
            // List of commands
            if (empty($GLOBALS['_PEAR_Command_objects'][$class])) {
                $GLOBALS['_PEAR_Command_objects'][$class] = "$dir/" . $f . '.php';
            }

            $parser->parse(file_get_contents("$dir/$file"));
            $implements = $parser->getData();
            foreach ($implements as $command => $desc) {
                if ($command == 'attribs') {
                    continue;
                }

                if (isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
                    return PEAR::raiseError('Command "' . $command . '" already registered in ' .
                        'class "' . $GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
                }

                $GLOBALS['_PEAR_Command_commandlist'][$command] = $class;
                $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc['summary'];
                if (isset($desc['shortcut'])) {
                    $shortcut = $desc['shortcut'];
                    if (isset($GLOBALS['_PEAR_Command_shortcuts'][$shortcut])) {
                        return PEAR::raiseError('Command shortcut "' . $shortcut . '" already ' .
                            'registered to command "' . $command . '" in class "' .
                            $GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
                    }
                    $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command;
                }

                if (isset($desc['options']) && $desc['options']) {
                    foreach ($desc['options'] as $oname => $option) {
                        if (isset($option['shortopt']) && strlen($option['shortopt']) > 1) {
                            return PEAR::raiseError('Option "' . $oname . '" short option "' .
                                $option['shortopt'] . '" must be ' .
                                'only 1 character in Command "' . $command . '" in class "' .
                                $class . '"');
                        }
                    }
                }
            }
        }

        ksort($GLOBALS['_PEAR_Command_shortcuts']);
        ksort($GLOBALS['_PEAR_Command_commandlist']);
        @closedir($dp);
        return true;
    }

    // }}}
    // {{{ getCommands()

    /**
     * Get the list of currently supported commands, and what
     * classes implement them.
     *
     * @return array command => implementing class
     */
    public static function getCommands()
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        return $GLOBALS['_PEAR_Command_commandlist'];
    }

    // }}}
    // {{{ getShortcuts()

    /**
     * Get the list of command shortcuts.
     *
     * @return array shortcut => command
     */
    public static function getShortcuts()
    {
        if (empty($GLOBALS['_PEAR_Command_shortcuts'])) {
            PEAR_Command::registerCommands();
        }
        return $GLOBALS['_PEAR_Command_shortcuts'];
    }

    // }}}
    // {{{ getGetoptArgs()

    /**
     * Compiles arguments for getopt.
     *
     * @param string $command     command to get optstring for
     * @param string $short_args  (reference) short getopt format
     * @param array  $long_args   (reference) long getopt format
     *
     * @return void
     */
    public static function getGetoptArgs($command, &$short_args, &$long_args)
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
            return null;
        }
        $obj = &PEAR_Command::getObject($command);
        return $obj->getGetoptArgs($command, $short_args, $long_args);
    }

    // }}}
    // {{{ getDescription()

    /**
     * Get description for a command.
     *
     * @param  string $command Name of the command
     *
     * @return string command description
     */
    public static function getDescription($command)
    {
        if (!isset($GLOBALS['_PEAR_Command_commanddesc'][$command])) {
            return null;
        }
        return $GLOBALS['_PEAR_Command_commanddesc'][$command];
    }

    // }}}
    // {{{ getHelp()

    /**
     * Get help for command.
     *
     * @param string $command Name of the command to return help for
     */
    public static function getHelp($command)
    {
        $cmds = PEAR_Command::getCommands();
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (isset($cmds[$command])) {
            $obj = &PEAR_Command::getObject($command);
            return $obj->getHelp($command);
        }
        return false;
    }
    // }}}
}pear/PEAR/REST.php000064400000040505151732710040007514 0ustar00<?php
/**
 * PEAR_REST
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * For downloading xml files
 */
require_once 'PEAR.php';
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/Proxy.php';

/**
 * Intelligently retrieve data, following hyperlinks if necessary, and re-directing
 * as well
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_REST
{
    var $config;
    var $_options;

    function __construct(&$config, $options = array())
    {
        $this->config   = &$config;
        $this->_options = $options;
    }

    /**
     * Retrieve REST data, but always retrieve the local cache if it is available.
     *
     * This is useful for elements that should never change, such as information on a particular
     * release
     * @param string full URL to this resource
     * @param array|false contents of the accept-encoding header
     * @param boolean     if true, xml will be returned as a string, otherwise, xml will be
     *                    parsed using PEAR_XMLParser
     * @return string|array
     */
    function retrieveCacheFirst($url, $accept = false, $forcestring = false, $channel = false)
    {
        $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cachefile';

        if (file_exists($cachefile)) {
            return unserialize(implode('', file($cachefile)));
        }

        return $this->retrieveData($url, $accept, $forcestring, $channel);
    }

    /**
     * Retrieve a remote REST resource
     * @param string full URL to this resource
     * @param array|false contents of the accept-encoding header
     * @param boolean     if true, xml will be returned as a string, otherwise, xml will be
     *                    parsed using PEAR_XMLParser
     * @return string|array
     */
    function retrieveData($url, $accept = false, $forcestring = false, $channel = false)
    {
        $cacheId = $this->getCacheId($url);
        if ($ret = $this->useLocalCache($url, $cacheId)) {
            return $ret;
        }

        $file = $trieddownload = false;
        if (!isset($this->_options['offline'])) {
            $trieddownload = true;
            $file = $this->downloadHttp($url, $cacheId ? $cacheId['lastChange'] : false, $accept, $channel);
        }

        if (PEAR::isError($file)) {
            if ($file->getCode() !== -9276) {
                return $file;
            }

            $trieddownload = false;
            $file = false; // use local copy if available on socket connect error
        }

        if (!$file) {
            $ret = $this->getCache($url);
            if (!PEAR::isError($ret) && $trieddownload) {
                // reset the age of the cache if the server says it was unmodified
                $result = $this->saveCache($url, $ret, null, true, $cacheId);
                if (PEAR::isError($result)) {
                    return PEAR::raiseError($result->getMessage());
                }
            }

            return $ret;
        }

        if (is_array($file)) {
            $headers      = $file[2];
            $lastmodified = $file[1];
            $content      = $file[0];
        } else {
            $headers      = array();
            $lastmodified = false;
            $content      = $file;
        }

        if ($forcestring) {
            $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId);
            if (PEAR::isError($result)) {
                return PEAR::raiseError($result->getMessage());
            }

            return $content;
        }

        if (isset($headers['content-type'])) {
            $content_type = explode(";", $headers['content-type']);
            $content_type = $content_type[0];
            switch ($content_type) {
                case 'text/xml' :
                case 'application/xml' :
                case 'text/plain' :
                    if ($content_type === 'text/plain') {
                        $check = substr($content, 0, 5);
                        if ($check !== '<?xml') {
                            break;
                        }
                    }

                    $parser = new PEAR_XMLParser;
                    PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                    $err = $parser->parse($content);
                    PEAR::popErrorHandling();
                    if (PEAR::isError($err)) {
                        return PEAR::raiseError('Invalid xml downloaded from "' . $url . '": ' .
                            $err->getMessage());
                    }
                    $content = $parser->getData();
                case 'text/html' :
                default :
                    // use it as a string
            }
        } else {
            // assume XML
            $parser = new PEAR_XMLParser;
            $parser->parse($content);
            $content = $parser->getData();
        }

        $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId);
        if (PEAR::isError($result)) {
            return PEAR::raiseError($result->getMessage());
        }

        return $content;
    }

    function useLocalCache($url, $cacheid = null)
    {
        if (!is_array($cacheid)) {
            $cacheid = $this->getCacheId($url);
        }

        $cachettl = $this->config->get('cache_ttl');
        // If cache is newer than $cachettl seconds, we use the cache!
        if (is_array($cacheid) && time() - $cacheid['age'] < $cachettl) {
            return $this->getCache($url);
        }

        return false;
    }

    /**
     * @param string $url
     *
     * @return bool|mixed
     */
    function getCacheId($url)
    {
        $cacheidfile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cacheid';

        if (!file_exists($cacheidfile)) {
            return false;
        }

        $ret = unserialize(implode('', file($cacheidfile)));
        return $ret;
    }

    function getCache($url)
    {
        $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cachefile';

        if (!file_exists($cachefile)) {
            return PEAR::raiseError('No cached content available for "' . $url . '"');
        }

        return unserialize(implode('', file($cachefile)));
    }

    /**
     * @param string full URL to REST resource
     * @param string original contents of the REST resource
     * @param array  HTTP Last-Modified and ETag headers
     * @param bool   if true, then the cache id file should be regenerated to
     *               trigger a new time-to-live value
     */
    function saveCache($url, $contents, $lastmodified, $nochange = false, $cacheid = null)
    {
        $cache_dir   = $this->config->get('cache_dir');
        $d           = $cache_dir . DIRECTORY_SEPARATOR . md5($url);
        $cacheidfile = $d . 'rest.cacheid';
        $cachefile   = $d . 'rest.cachefile';

        if (!is_dir($cache_dir)) {
            if (System::mkdir(array('-p', $cache_dir)) === false) {
              return PEAR::raiseError("The value of config option cache_dir ($cache_dir) is not a directory and attempts to create the directory failed.");
            }
        }

        if (!is_writeable($cache_dir)) {
            // If writing to the cache dir is not going to work, silently do nothing.
            // An ugly hack, but retains compat with PEAR 1.9.1 where many commands
            // work fine as non-root user (w/out write access to default cache dir).
            return true;
        }

        if ($cacheid === null && $nochange) {
            $cacheid = unserialize(implode('', file($cacheidfile)));
        }

        $idData = serialize(array(
            'age'        => time(),
            'lastChange' => ($nochange ? $cacheid['lastChange'] : $lastmodified),
        ));

        $result = $this->saveCacheFile($cacheidfile, $idData);
        if (PEAR::isError($result)) {
            return $result;
        } elseif ($nochange) {
            return true;
        }

        $result = $this->saveCacheFile($cachefile, serialize($contents));
        if (PEAR::isError($result)) {
            if (file_exists($cacheidfile)) {
              @unlink($cacheidfile);
            }

            return $result;
        }

        return true;
    }

    function saveCacheFile($file, $contents)
    {
        $len = strlen($contents);

        $cachefile_fp = @fopen($file, 'xb'); // x is the O_CREAT|O_EXCL mode
        if ($cachefile_fp !== false) { // create file
            if (fwrite($cachefile_fp, $contents, $len) < $len) {
                fclose($cachefile_fp);
                return PEAR::raiseError("Could not write $file.");
            }
        } else { // update file
            $cachefile_fp = @fopen($file, 'r+b'); // do not truncate file
            if (!$cachefile_fp) {
                return PEAR::raiseError("Could not open $file for writing.");
            }

            if (OS_WINDOWS) {
                $not_symlink     = !is_link($file); // see bug #18834
            } else {
                $cachefile_lstat = lstat($file);
                $cachefile_fstat = fstat($cachefile_fp);
                $not_symlink     = $cachefile_lstat['mode'] == $cachefile_fstat['mode']
                                   && $cachefile_lstat['ino']  == $cachefile_fstat['ino']
                                   && $cachefile_lstat['dev']  == $cachefile_fstat['dev']
                                   && $cachefile_fstat['nlink'] === 1;
            }

            if ($not_symlink) {
                ftruncate($cachefile_fp, 0); // NOW truncate
                if (fwrite($cachefile_fp, $contents, $len) < $len) {
                    fclose($cachefile_fp);
                    return PEAR::raiseError("Could not write $file.");
                }
            } else {
                fclose($cachefile_fp);
                $link = function_exists('readlink') ? readlink($file) : $file;
                return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $file . ' as it is symlinked to ' . $link . ' - Possible symlink attack');
            }
        }

        fclose($cachefile_fp);
        return true;
    }

    /**
     * Efficiently Download a file through HTTP.  Returns downloaded file as a string in-memory
     * This is best used for small files
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param string  $save_dir  directory to save file in
     * @param false|string|array $lastmodified header values to check against for caching
     *                           use false to return the header values from this download
     * @param false|array $accept Accept headers to send
     * @return string|array  Returns the contents of the downloaded file or a PEAR
     *                       error on failure.  If the error is caused by
     *                       socket-related errors, the error object will
     *                       have the fsockopen error code available through
     *                       getCode().  If caching is requested, then return the header
     *                       values.
     *
     * @access public
     */
    function downloadHttp($url, $lastmodified = null, $accept = false, $channel = false)
    {
        static $redirect = 0;
        // always reset , so we are clean case of error
        $wasredirect = $redirect;
        $redirect = 0;

        $info = parse_url($url);
        if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) {
            return PEAR::raiseError('Cannot download non-http URL "' . $url . '"');
        }

        if (!isset($info['host'])) {
            return PEAR::raiseError('Cannot download from non-URL "' . $url . '"');
        }

        $host   = isset($info['host']) ? $info['host'] : null;
        $port   = isset($info['port']) ? $info['port'] : null;
        $path   = isset($info['path']) ? $info['path'] : null;
        $schema = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http';

        $proxy = new PEAR_Proxy($this->config);

        if (empty($port)) {
            $port = (isset($info['scheme']) && $info['scheme'] == 'https')  ? 443 : 80;
        }

        if ($proxy->isProxyConfigured() && $schema === 'http') {
            $request = "GET $url HTTP/1.1\r\n";
        } else {
            $request = "GET $path HTTP/1.1\r\n";
        }

        $request .= "Host: $host\r\n";
        $ifmodifiedsince = '';
        if (is_array($lastmodified)) {
            if (isset($lastmodified['Last-Modified'])) {
                $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n";
            }

            if (isset($lastmodified['ETag'])) {
                $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n";
            }
        } else {
            $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : '');
        }

        $request .= $ifmodifiedsince .
            "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n";

        $username = $this->config->get('username', null, $channel);
        $password = $this->config->get('password', null, $channel);

        if ($username && $password) {
            $tmp = base64_encode("$username:$password");
            $request .= "Authorization: Basic $tmp\r\n";
        }

        $proxyAuth = $proxy->getProxyAuth();
        if ($proxyAuth) {
            $request .= 'Proxy-Authorization: Basic ' .
                $proxyAuth . "\r\n";
        }

        if ($accept) {
            $request .= 'Accept: ' . implode(', ', $accept) . "\r\n";
        }

        $request .= "Accept-Encoding:\r\n";
        $request .= "Connection: close\r\n";
        $request .= "\r\n";

        $secure = ($schema == 'https');
        $fp = $proxy->openSocket($host, $port, $secure);
        if (PEAR::isError($fp)) {
            return $fp;
        }

        fwrite($fp, $request);

        $headers = array();
        $reply   = 0;
        while ($line = trim(fgets($fp, 1024))) {
            if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) {
                $headers[strtolower($matches[1])] = trim($matches[2]);
            } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $reply = (int)$matches[1];
                if ($reply == 304 && ($lastmodified || ($lastmodified === false))) {
                    return false;
                }

                if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) {
                    return PEAR::raiseError("File $schema://$host:$port$path not valid (received: $line)");
                }
            }
        }

        if ($reply != 200) {
            if (!isset($headers['location'])) {
                return PEAR::raiseError("File $schema://$host:$port$path not valid (redirected but no location)");
            }

            if ($wasredirect > 4) {
                return PEAR::raiseError("File $schema://$host:$port$path not valid (redirection looped more than 5 times)");
            }

            $redirect = $wasredirect + 1;
            return $this->downloadHttp($headers['location'], $lastmodified, $accept, $channel);
        }

        $length = isset($headers['content-length']) ? $headers['content-length'] : -1;

        $data = '';
        while ($chunk = @fread($fp, 8192)) {
            $data .= $chunk;
        }
        fclose($fp);

        if ($lastmodified === false || $lastmodified) {
            if (isset($headers['etag'])) {
                $lastmodified = array('ETag' => $headers['etag']);
            }

            if (isset($headers['last-modified'])) {
                if (is_array($lastmodified)) {
                    $lastmodified['Last-Modified'] = $headers['last-modified'];
                } else {
                    $lastmodified = $headers['last-modified'];
                }
            }

            return array($data, $lastmodified, $headers);
        }

        return $data;
    }
}
pear/PEAR/Proxy.php000064400000012752151732710040010063 0ustar00<?php
/**
 * PEAR_Proxy
 *
 * HTTP Proxy handling 
 *
 * @category   pear
 * @package    PEAR
 * @author     Nico Boehr 
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 */

class PEAR_Proxy
{
    var $config = null;

    /**
     * @access private
     */
    var $proxy_host;
    /**
     * @access private
     */
    var $proxy_port;
    /**
     * @access private
     */
    var $proxy_user;
    /**
     * @access private
     */
    var $proxy_pass;
    /**
     * @access private
     */
    var $proxy_schema;

    function __construct($config = null)
    {
        $this->config = $config;
        $this->_parseProxyInfo();
    }

    /**
     * @access private
     */
    function _parseProxyInfo()
    {
        $this->proxy_host = $this->proxy_port = $this->proxy_user = $this->proxy_pass = '';
        if ($this->config->get('http_proxy')&&
              $proxy = parse_url($this->config->get('http_proxy'))
        ) {
            $this->proxy_host = isset($proxy['host']) ? $proxy['host'] : null;

            $this->proxy_port   = isset($proxy['port']) ? $proxy['port'] : 8080;
            $this->proxy_user   = isset($proxy['user']) ? urldecode($proxy['user']) : null;
            $this->proxy_pass   = isset($proxy['pass']) ? urldecode($proxy['pass']) : null;
            $this->proxy_schema = (isset($proxy['scheme']) && $proxy['scheme'] == 'https') ? 'https' : 'http';
        }
    }

    /**
     * @access private
     */
    function _httpConnect($fp, $host, $port)
    {
        fwrite($fp, "CONNECT $host:$port HTTP/1.1\r\n");
        fwrite($fp, "Host: $host:$port\r\n");
        if ($this->getProxyAuth()) {
            fwrite($fp, 'Proxy-Authorization: Basic ' . $this->getProxyAuth() . "\r\n");
        }
        fwrite($fp, "\r\n");

        while ($line = trim(fgets($fp, 1024))) {
            if (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $code = (int)$matches[1];

                /* as per RFC 2817 */
                if ($code < 200 || $code >= 300) {
                    return PEAR::raiseError("Establishing a CONNECT tunnel through proxy failed with response code $code");
                }
            }
        }

        // connection was successful -- establish SSL through
        // the tunnel
        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;

        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
        }

        // set the correct hostname for working hostname
        // verification
        stream_context_set_option($fp, 'ssl', 'peer_name', $host);

        // blocking socket needed for
        // stream_socket_enable_crypto()
        // see
        // <http://php.net/manual/en/function.stream-socket-enable-crypto.php>
        stream_set_blocking ($fp, true);
        $crypto_res = stream_socket_enable_crypto($fp, true, $crypto_method);
        if (!$crypto_res) {
            return PEAR::raiseError("Could not establish SSL connection through proxy: $crypto_res");
        }

        return true;
    }

    /**
     * get the authorization information for the proxy, encoded to be
     * passed in the Proxy-Authentication HTTP header.
     * @return null|string the encoded authentication information if a
     *                     proxy and authentication is configured, null 
     *                     otherwise.
     */
    function getProxyAuth()
    {
        if ($this->isProxyConfigured() && $this->proxy_user != '') {
            return base64_encode($this->proxy_user . ':' . $this->proxy_pass);
        }
        return null;
    }

    function getProxyUser()
    {
        return $this->proxy_user;
    }

    /**
     * Check if we are configured to use a proxy.
     *
     * @return boolean true if we are configured to use a proxy, false
     *                 otherwise.
     * @access public
     */
    function isProxyConfigured()
    {
        return $this->proxy_host != '';
    }

    /**
     * Open a socket to a remote server, possibly involving a HTTP
     * proxy.
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string $host    the host to connect to
     * @param string $port    the port to connect to
     * @param boolean $secure if true, establish a secure connection
     *                        using TLS.
     * @access public
     */
    function openSocket($host, $port, $secure = false)
    {
        if ($this->isProxyConfigured()) {
            $fp = @fsockopen(
                $this->proxy_host, $this->proxy_port, 
                $errno, $errstr, 15
            );

            if (!$fp) {
                return PEAR::raiseError("Connection to the proxy failed: $errstr", -9276);
            }

            /* HTTPS is to be used and we have a proxy, use CONNECT verb */
            if ($secure) {
                $res = $this->_httpConnect($fp, $host, $port);

                if (PEAR::isError($res)) {
                    return $res;
                }
            }
        } else {
            if ($secure) {
                $host = 'ssl://' . $host;
            }

            $fp = @fsockopen($host, $port, $errno, $errstr);
            if (!$fp) {
                return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno);
            }
        }

        return $fp;
    }
}
pear/PEAR/Downloader/Package.php000064400000224657151732710040012404 0ustar00<?php
/**
 * PEAR_Downloader_Package
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Error code when parameter initialization fails because no releases
 * exist within preferred_state, but releases do exist
 */
define('PEAR_DOWNLOADER_PACKAGE_STATE', -1003);
/**
 * Error code when parameter initialization fails because no releases
 * exist that will work with the existing PHP version
 */
define('PEAR_DOWNLOADER_PACKAGE_PHPVERSION', -1004);

/**
 * Coordinates download parameters and manages their dependencies
 * prior to downloading them.
 *
 * Input can come from three sources:
 *
 * - local files (archives or package.xml)
 * - remote files (downloadable urls)
 * - abstract package names
 *
 * The first two elements are handled cleanly by PEAR_PackageFile, but the third requires
 * accessing pearweb's xml-rpc interface to determine necessary dependencies, and the
 * format returned of dependencies is slightly different from that used in package.xml.
 *
 * This class hides the differences between these elements, and makes automatic
 * dependency resolution a piece of cake.  It also manages conflicts when
 * two classes depend on incompatible dependencies, or differing versions of the same
 * package dependency.  In addition, download will not be attempted if the php version is
 * not supported, PEAR installer version is not supported, or non-PECL extensions are not
 * installed.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Downloader_Package
{
    /**
     * @var PEAR_Downloader
     */
    var $_downloader;
    /**
     * @var PEAR_Config
     */
    var $_config;
    /**
     * @var PEAR_Registry
     */
    var $_registry;
    /**
     * Used to implement packagingroot properly
     * @var PEAR_Registry
     */
    var $_installRegistry;
    /**
     * @var PEAR_PackageFile_v1|PEAR_PackageFile|v2
     */
    var $_packagefile;
    /**
     * @var array
     */
    var $_parsedname;
    /**
     * @var array
     */
    var $_downloadURL;
    /**
     * @var array
     */
    var $_downloadDeps = array();
    /**
     * @var boolean
     */
    var $_valid = false;
    /**
     * @var boolean
     */
    var $_analyzed = false;
    /**
     * if this or a parent package was invoked with Package-state, this is set to the
     * state variable.
     *
     * This allows temporary reassignment of preferred_state for a parent package and all of
     * its dependencies.
     * @var string|false
     */
    var $_explicitState = false;
    /**
     * If this package is invoked with Package#group, this variable will be true
     */
    var $_explicitGroup = false;
    /**
     * Package type local|url
     * @var string
     */
    var $_type;
    /**
     * Contents of package.xml, if downloaded from a remote channel
     * @var string|false
     * @access private
     */
    var $_rawpackagefile;
    /**
     * @var boolean
     * @access private
     */
    var $_validated = false;

    /**
     * @param PEAR_Downloader
     */
    function __construct(&$downloader)
    {
        $this->_downloader = &$downloader;
        $this->_config = &$this->_downloader->config;
        $this->_registry = &$this->_config->getRegistry();
        $options = $downloader->getOptions();
        if (isset($options['packagingroot'])) {
            $this->_config->setInstallRoot($options['packagingroot']);
            $this->_installRegistry = &$this->_config->getRegistry();
            $this->_config->setInstallRoot(false);
        } else {
            $this->_installRegistry = &$this->_registry;
        }
        $this->_valid = $this->_analyzed = false;
    }

    /**
     * Parse the input and determine whether this is a local file, a remote uri, or an
     * abstract package name.
     *
     * This is the heart of the PEAR_Downloader_Package(), and is used in
     * {@link PEAR_Downloader::download()}
     * @param string
     * @return bool|PEAR_Error
     */
    function initialize($param)
    {
        $origErr = $this->_fromFile($param);
        if ($this->_valid) {
            return true;
        }

        $options = $this->_downloader->getOptions();
        if (isset($options['offline'])) {
            if (PEAR::isError($origErr) && !isset($options['soft'])) {
                foreach ($origErr->getUserInfo() as $userInfo) {
                    if (isset($userInfo['message'])) {
                        $this->_downloader->log(0, $userInfo['message']);
                    }
                }

                $this->_downloader->log(0, $origErr->getMessage());
            }

            return PEAR::raiseError('Cannot download non-local package "' . $param . '"');
        }

        $err = $this->_fromUrl($param);
        if (PEAR::isError($err) || !$this->_valid) {
            if ($this->_type == 'url') {
                if (PEAR::isError($err) && !isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                return PEAR::raiseError("Invalid or missing remote package file");
            }

            $err = $this->_fromString($param);
            if (PEAR::isError($err) || !$this->_valid) {
                if (PEAR::isError($err) && $err->getCode() == PEAR_DOWNLOADER_PACKAGE_STATE) {
                    return false; // instruct the downloader to silently skip
                }

                if (isset($this->_type) && $this->_type == 'local' && PEAR::isError($origErr)) {
                    if (is_array($origErr->getUserInfo())) {
                        foreach ($origErr->getUserInfo() as $err) {
                            if (is_array($err)) {
                                $err = $err['message'];
                            }

                            if (!isset($options['soft'])) {
                                $this->_downloader->log(0, $err);
                            }
                        }
                    }

                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $origErr->getMessage());
                    }

                    if (is_array($param)) {
                        $param = $this->_registry->parsedPackageNameToString($param, true);
                    }

                    if (!isset($options['soft'])) {
                        $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file");
                    }

                    // Passing no message back - already logged above
                    return PEAR::raiseError();
                }

                if (PEAR::isError($err) && !isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                if (is_array($param)) {
                    $param = $this->_registry->parsedPackageNameToString($param, true);
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file");
                }

                // Passing no message back - already logged above
                return PEAR::raiseError();
            }
        }

        return true;
    }

    /**
     * Retrieve any non-local packages
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|PEAR_Error
     */
    function &download()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile;
        }

        if (isset($this->_downloadURL['url'])) {
            $this->_isvalid = false;
            $info = $this->getParsedPackage();
            foreach ($info as $i => $p) {
                $info[$i] = strtolower($p);
            }

            $err = $this->_fromUrl($this->_downloadURL['url'],
                $this->_registry->parsedPackageNameToString($this->_parsedname, true));
            $newinfo = $this->getParsedPackage();
            foreach ($newinfo as $i => $p) {
                $newinfo[$i] = strtolower($p);
            }

            if ($info != $newinfo) {
                do {
                    if ($info['channel'] == 'pecl.php.net' && $newinfo['channel'] == 'pear.php.net') {
                        $info['channel'] = 'pear.php.net';
                        if ($info == $newinfo) {
                            // skip the channel check if a pecl package says it's a PEAR package
                            break;
                        }
                    }
                    if ($info['channel'] == 'pear.php.net' && $newinfo['channel'] == 'pecl.php.net') {
                        $info['channel'] = 'pecl.php.net';
                        if ($info == $newinfo) {
                            // skip the channel check if a pecl package says it's a PEAR package
                            break;
                        }
                    }

                    return PEAR::raiseError('CRITICAL ERROR: We are ' .
                        $this->_registry->parsedPackageNameToString($info) . ', but the file ' .
                        'downloaded claims to be ' .
                        $this->_registry->parsedPackageNameToString($this->getParsedPackage()));
                } while (false);
            }

            if (PEAR::isError($err) || !$this->_valid) {
                return $err;
            }
        }

        $this->_type = 'local';
        return $this->_packagefile;
    }

    function &getPackageFile()
    {
        return $this->_packagefile;
    }

    function &getDownloader()
    {
        return $this->_downloader;
    }

    function getType()
    {
        return $this->_type;
    }

    /**
     * Like {@link initialize()}, but operates on a dependency
     */
    function fromDepURL($dep)
    {
        $this->_downloadURL = $dep;
        if (isset($dep['uri'])) {
            $options = $this->_downloader->getOptions();
            if (!extension_loaded("zlib") || isset($options['nocompress'])) {
                $ext = '.tar';
            } else {
                $ext = '.tgz';
            }

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->_fromUrl($dep['uri'] . $ext);
            PEAR::popErrorHandling();
            if (PEAR::isError($err)) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                return PEAR::raiseError('Invalid uri dependency "' . $dep['uri'] . $ext . '", ' .
                    'cannot download');
            }
        } else {
            $this->_parsedname =
                array(
                    'package' => $dep['info']->getPackage(),
                    'channel' => $dep['info']->getChannel(),
                    'version' => $dep['version']
                );
            if (!isset($dep['nodefault'])) {
                $this->_parsedname['group'] = 'default'; // download the default dependency group
                $this->_explicitGroup = false;
            }

            $this->_rawpackagefile = $dep['raw'];
        }
    }

    function detectDependencies($params)
    {
        $options = $this->_downloader->getOptions();
        if (isset($options['downloadonly'])) {
            return;
        }

        if (isset($options['offline'])) {
            $this->_downloader->log(3, 'Skipping dependency download check, --offline specified');
            return;
        }

        $pname = $this->getParsedPackage();
        if (!$pname) {
            return;
        }

        $deps = $this->getDeps();
        if (!$deps) {
            return;
        }

        if (isset($deps['required'])) { // package.xml 2.0
            return $this->_detect2($deps, $pname, $options, $params);
        }

        return $this->_detect1($deps, $pname, $options, $params);
    }

    function setValidated()
    {
        $this->_validated = true;
    }

    function alreadyValidated()
    {
        return $this->_validated;
    }

    /**
     * Remove packages to be downloaded that are already installed
     * @param array of PEAR_Downloader_Package objects
     */
    public static function removeInstalled(&$params)
    {
        if (!isset($params[0])) {
            return;
        }

        $options = $params[0]->_downloader->getOptions();
        if (!isset($options['downloadonly'])) {
            foreach ($params as $i => $param) {
                $package = $param->getPackage();
                $channel = $param->getChannel();
                // remove self if already installed with this version
                // this does not need any pecl magic - we only remove exact matches
                if ($param->_installRegistry->packageExists($package, $channel)) {
                    $packageVersion = $param->_installRegistry->packageInfo($package, 'version', $channel);
                    if (version_compare($packageVersion, $param->getVersion(), '==')) {
                        if (!isset($options['force']) && !isset($options['packagingroot'])) {
                            $info = $param->getParsedPackage();
                            unset($info['version']);
                            unset($info['state']);
                            if (!isset($options['soft'])) {
                                $param->_downloader->log(1, 'Skipping package "' .
                                    $param->getShortName() .
                                    '", already installed as version ' . $packageVersion);
                            }
                            $params[$i] = false;
                        }
                    } elseif (!isset($options['force']) && !isset($options['upgrade']) &&
                          !isset($options['soft']) && !isset($options['packagingroot'])) {
                        $info = $param->getParsedPackage();
                        $param->_downloader->log(1, 'Skipping package "' .
                            $param->getShortName() .
                            '", already installed as version ' . $packageVersion);
                        $params[$i] = false;
                    }
                }
            }
        }

        PEAR_Downloader_Package::removeDuplicates($params);
    }

    function _detect2($deps, $pname, $options, $params)
    {
        $this->_downloadDeps = array();
        $groupnotfound = false;
        foreach (array('package', 'subpackage') as $packagetype) {
            // get required dependency group
            if (isset($deps['required'][$packagetype])) {
                if (isset($deps['required'][$packagetype][0])) {
                    foreach ($deps['required'][$packagetype] as $dep) {
                        if (isset($dep['conflicts'])) {
                            // skip any package that this package conflicts with
                            continue;
                        }
                        $ret = $this->_detect2Dep($dep, $pname, 'required', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                } else {
                    $dep = $deps['required'][$packagetype];
                    if (!isset($dep['conflicts'])) {
                        // skip any package that this package conflicts with
                        $ret = $this->_detect2Dep($dep, $pname, 'required', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                }
            }

            // get optional dependency group, if any
            if (isset($deps['optional'][$packagetype])) {
                $skipnames = array();
                if (!isset($deps['optional'][$packagetype][0])) {
                    $deps['optional'][$packagetype] = array($deps['optional'][$packagetype]);
                }

                foreach ($deps['optional'][$packagetype] as $dep) {
                    $skip = false;
                    if (!isset($options['alldeps'])) {
                        $dep['package'] = $dep['name'];
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                              $this->_registry->parsedPackageNameToString($this->getParsedPackage(),
                                    true) . '" optional dependency "' .
                                $this->_registry->parsedPackageNameToString(array('package' =>
                                    $dep['name'], 'channel' => 'pear.php.net'), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString($dep, true);
                        $skip = true;
                        unset($dep['package']);
                    }

                    $ret = $this->_detect2Dep($dep, $pname, 'optional', $params);
                    if (PEAR::isError($ret) && !isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }

                    if (!$ret) {
                        $dep['package'] = $dep['name'];
                        $skip = count($skipnames) ?
                            $skipnames[count($skipnames) - 1] : '';
                        if ($skip ==
                              $this->_registry->parsedPackageNameToString($dep, true)) {
                            array_pop($skipnames);
                        }
                    }

                    if (!$skip && is_array($ret)) {
                        $this->_downloadDeps[] = $ret;
                    }
                }

                if (count($skipnames)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(1, 'Did not download optional dependencies: ' .
                            implode(', ', $skipnames) .
                            ', use --alldeps to download automatically');
                    }
                }
            }

            // get requested dependency group, if any
            $groupname = $this->getGroup();
            $explicit  = $this->_explicitGroup;
            if (!$groupname) {
                if (!$this->canDefault()) {
                    continue;
                }

                $groupname = 'default'; // try the default dependency group
            }

            if ($groupnotfound) {
                continue;
            }

            if (isset($deps['group'])) {
                if (isset($deps['group']['attribs'])) {
                    if (strtolower($deps['group']['attribs']['name']) == strtolower($groupname)) {
                        $group = $deps['group'];
                    } elseif ($explicit) {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, 'Warning: package "' .
                                $this->_registry->parsedPackageNameToString($pname, true) .
                                '" has no dependency ' . 'group named "' . $groupname . '"');
                        }

                        $groupnotfound = true;
                        continue;
                    }
                } else {
                    $found = false;
                    foreach ($deps['group'] as $group) {
                        if (strtolower($group['attribs']['name']) == strtolower($groupname)) {
                            $found = true;
                            break;
                        }
                    }

                    if (!$found) {
                        if ($explicit) {
                            if (!isset($options['soft'])) {
                                $this->_downloader->log(0, 'Warning: package "' .
                                    $this->_registry->parsedPackageNameToString($pname, true) .
                                    '" has no dependency ' . 'group named "' . $groupname . '"');
                            }
                        }

                        $groupnotfound = true;
                        continue;
                    }
                }
            }

            if (isset($group) && isset($group[$packagetype])) {
                if (isset($group[$packagetype][0])) {
                    foreach ($group[$packagetype] as $dep) {
                        $ret = $this->_detect2Dep($dep, $pname, 'dependency group "' .
                            $group['attribs']['name'] . '"', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                } else {
                    $ret = $this->_detect2Dep($group[$packagetype], $pname,
                        'dependency group "' .
                        $group['attribs']['name'] . '"', $params);
                    if (is_array($ret)) {
                        $this->_downloadDeps[] = $ret;
                    } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }
                }
            }
        }
    }

    function _detect2Dep($dep, $pname, $group, $params)
    {
        if (isset($dep['conflicts'])) {
            return true;
        }

        $options = $this->_downloader->getOptions();
        if (isset($dep['uri'])) {
            return array('uri' => $dep['uri'], 'dep' => $dep);;
        }

        $testdep = $dep;
        $testdep['package'] = $dep['name'];
        if (PEAR_Downloader_Package::willDownload($testdep, $params)) {
            $dep['package'] = $dep['name'];
            if (!isset($options['soft'])) {
                $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group .
                    ' dependency "' .
                    $this->_registry->parsedPackageNameToString($dep, true) .
                    '", will be installed');
            }
            return false;
        }

        $options = $this->_downloader->getOptions();
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        if ($this->_explicitState) {
            $pname['state'] = $this->_explicitState;
        }

        $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
        if (PEAR::isError($url)) {
            PEAR::popErrorHandling();
            return $url;
        }

        $dep['package'] = $dep['name'];
        $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params, $group == 'optional' &&
            !isset($options['alldeps']), true);
        PEAR::popErrorHandling();
        if (PEAR::isError($ret)) {
            if (!isset($options['soft'])) {
                $this->_downloader->log(0, $ret->getMessage());
            }

            return false;
        }

        // check to see if a dep is already installed and is the same or newer
        if (!isset($dep['min']) && !isset($dep['max']) && !isset($dep['recommended'])) {
            $oper = 'has';
        } else {
            $oper = 'gt';
        }

        // do not try to move this before getDepPackageDownloadURL
        // we can't determine whether upgrade is necessary until we know what
        // version would be downloaded
        if (!isset($options['force']) && $this->isInstalled($ret, $oper)) {
            $version = $this->_installRegistry->packageInfo($dep['name'], 'version', $dep['channel']);
            $dep['package'] = $dep['name'];
            if (!isset($options['soft'])) {
                $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group .
                    ' dependency "' .
                $this->_registry->parsedPackageNameToString($dep, true) .
                    '" version ' . $url['version'] . ', already installed as version ' .
                    $version);
            }

            return false;
        }

        if (isset($dep['nodefault'])) {
            $ret['nodefault'] = true;
        }

        return $ret;
    }

    function _detect1($deps, $pname, $options, $params)
    {
        $this->_downloadDeps = array();
        $skipnames = array();
        foreach ($deps as $dep) {
            $nodownload = false;
            if (isset ($dep['type']) && $dep['type'] === 'pkg') {
                $dep['channel'] = 'pear.php.net';
                $dep['package'] = $dep['name'];
                switch ($dep['rel']) {
                    case 'not' :
                        continue 2;
                    case 'ge' :
                    case 'eq' :
                    case 'gt' :
                    case 'has' :
                        $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                            'required' :
                            'optional';
                        if (PEAR_Downloader_Package::willDownload($dep, $params)) {
                            $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group
                                . ' dependency "' .
                                $this->_registry->parsedPackageNameToString($dep, true) .
                                '", will be installed');
                            continue 2;
                        }
                        $fakedp = new PEAR_PackageFile_v1;
                        $fakedp->setPackage($dep['name']);
                        // skip internet check if we are not upgrading (bug #5810)
                        if (!isset($options['upgrade']) && $this->isInstalled(
                              $fakedp, $dep['rel'])) {
                            $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group
                                . ' dependency "' .
                                $this->_registry->parsedPackageNameToString($dep, true) .
                                '", is already installed');
                            continue 2;
                        }
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if ($this->_explicitState) {
                    $pname['state'] = $this->_explicitState;
                }

                $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
                $chan = 'pear.php.net';
                if (PEAR::isError($url)) {
                    // check to see if this is a pecl package that has jumped
                    // from pear.php.net to pecl.php.net channel
                    if (!class_exists('PEAR_Dependency2')) {
                        require_once 'PEAR/Dependency2.php';
                    }

                    $newdep = PEAR_Dependency2::normalizeDep($dep);
                    $newdep = $newdep[0];
                    $newdep['channel'] = 'pecl.php.net';
                    $chan = 'pecl.php.net';
                    $url = $this->_downloader->_getDepPackageDownloadUrl($newdep, $pname);
                    $obj = &$this->_installRegistry->getPackage($dep['name']);
                    if (PEAR::isError($url)) {
                        PEAR::popErrorHandling();
                        if ($obj !== null && $this->isInstalled($obj, $dep['rel'])) {
                            $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                                'required' :
                                'optional';
                            $dep['package'] = $dep['name'];
                            if (!isset($options['soft'])) {
                                $this->_downloader->log(3, $this->getShortName() .
                                    ': Skipping ' . $group . ' dependency "' .
                                    $this->_registry->parsedPackageNameToString($dep, true) .
                                    '", already installed as version ' . $obj->getVersion());
                            }
                            $skip = count($skipnames) ?
                                $skipnames[count($skipnames) - 1] : '';
                            if ($skip ==
                                  $this->_registry->parsedPackageNameToString($dep, true)) {
                                array_pop($skipnames);
                            }
                            continue;
                        } else {
                            if (isset($dep['optional']) && $dep['optional'] == 'yes') {
                                $this->_downloader->log(2, $this->getShortName() .
                                    ': Skipping optional dependency "' .
                                    $this->_registry->parsedPackageNameToString($dep, true) .
                                    '", no releases exist');
                                continue;
                            } else {
                                return $url;
                            }
                        }
                    }
                }

                PEAR::popErrorHandling();
                if (!isset($options['alldeps'])) {
                    if (isset($dep['optional']) && $dep['optional'] == 'yes') {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                                $this->getShortName() .
                                '" optional dependency "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $chan, 'package' =>
                                    $dep['name']), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString(
                                array('channel' => $chan, 'package' =>
                                $dep['name']), true);
                        $nodownload = true;
                    }
                }

                if (!isset($options['alldeps']) && !isset($options['onlyreqdeps'])) {
                    if (!isset($dep['optional']) || $dep['optional'] == 'no') {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                                $this->getShortName() .
                                '" required dependency "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $chan, 'package' =>
                                    $dep['name']), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString(
                                array('channel' => $chan, 'package' =>
                                $dep['name']), true);
                        $nodownload = true;
                    }
                }

                // check to see if a dep is already installed
                // do not try to move this before getDepPackageDownloadURL
                // we can't determine whether upgrade is necessary until we know what
                // version would be downloaded
                if (!isset($options['force']) && $this->isInstalled(
                        $url, $dep['rel'])) {
                    $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                        'required' :
                        'optional';
                    $dep['package'] = $dep['name'];
                    if (isset($newdep)) {
                        $version = $this->_installRegistry->packageInfo($newdep['name'], 'version', $newdep['channel']);
                    } else {
                        $version = $this->_installRegistry->packageInfo($dep['name'], 'version');
                    }

                    $dep['version'] = $url['version'];
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group .
                            ' dependency "' .
                            $this->_registry->parsedPackageNameToString($dep, true) .
                            '", already installed as version ' . $version);
                    }

                    $skip = count($skipnames) ?
                        $skipnames[count($skipnames) - 1] : '';
                    if ($skip ==
                          $this->_registry->parsedPackageNameToString($dep, true)) {
                        array_pop($skipnames);
                    }

                    continue;
                }

                if ($nodownload) {
                    continue;
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if (isset($newdep)) {
                    $dep = $newdep;
                }

                $dep['package'] = $dep['name'];
                $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params,
                    isset($dep['optional']) && $dep['optional'] == 'yes' &&
                    !isset($options['alldeps']), true);
                PEAR::popErrorHandling();
                if (PEAR::isError($ret)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }
                    continue;
                }

                $this->_downloadDeps[] = $ret;
            }
        }

        if (count($skipnames)) {
            if (!isset($options['soft'])) {
                $this->_downloader->log(1, 'Did not download dependencies: ' .
                    implode(', ', $skipnames) .
                    ', use --alldeps or --onlyreqdeps to download automatically');
            }
        }
    }

    function setDownloadURL($pkg)
    {
        $this->_downloadURL = $pkg;
    }

    /**
     * Set the package.xml object for this downloaded package
     *
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 $pkg
     */
    function setPackageFile(&$pkg)
    {
        $this->_packagefile = &$pkg;
    }

    function getShortName()
    {
        return $this->_registry->parsedPackageNameToString(array('channel' => $this->getChannel(),
            'package' => $this->getPackage()), true);
    }

    function getParsedPackage()
    {
        if (isset($this->_packagefile) || isset($this->_parsedname)) {
            return array('channel' => $this->getChannel(),
                'package' => $this->getPackage(),
                'version' => $this->getVersion());
        }

        return false;
    }

    function getDownloadURL()
    {
        return $this->_downloadURL;
    }

    function canDefault()
    {
        if (isset($this->_downloadURL) && isset($this->_downloadURL['nodefault'])) {
            return false;
        }

        return true;
    }

    function getPackage()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackage();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackage();
        }

        return false;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    function isSubpackage(&$pf)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isSubpackage($pf);
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->isSubpackage($pf);
        }

        return false;
    }

    function getPackageType()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackageType();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackageType();
        }

        return false;
    }

    function isBundle()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackageType() == 'bundle';
        }

        return false;
    }

    function getPackageXmlVersion()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackagexmlVersion();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackagexmlVersion();
        }

        return '1.0';
    }

    function getChannel()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getChannel();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getChannel();
        }

        return false;
    }

    function getURI()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getURI();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getURI();
        }

        return false;
    }

    function getVersion()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getVersion();
        } elseif (isset($this->_downloadURL['version'])) {
            return $this->_downloadURL['version'];
        }

        return false;
    }

    function isCompatible($pf)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isCompatible($pf);
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->isCompatible($pf);
        }

        return true;
    }

    function setGroup($group)
    {
        $this->_parsedname['group'] = $group;
    }

    function getGroup()
    {
        if (isset($this->_parsedname['group'])) {
            return $this->_parsedname['group'];
        }

        return '';
    }

    function isExtension($name)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isExtension($name);
        } elseif (isset($this->_downloadURL['info'])) {
            if ($this->_downloadURL['info']->getPackagexmlVersion() == '2.0') {
                return $this->_downloadURL['info']->getProvidesExtension() == $name;
            }

            return false;
        }

        return false;
    }

    function getDeps()
    {
        if (isset($this->_packagefile)) {
            $ver = $this->_packagefile->getPackagexmlVersion();
            if (version_compare($ver, '2.0', '>=')) {
                return $this->_packagefile->getDeps(true);
            }

            return $this->_packagefile->getDeps();
        } elseif (isset($this->_downloadURL['info'])) {
            $ver = $this->_downloadURL['info']->getPackagexmlVersion();
            if (version_compare($ver, '2.0', '>=')) {
                return $this->_downloadURL['info']->getDeps(true);
            }

            return $this->_downloadURL['info']->getDeps();
        }

        return array();
    }

    /**
     * @param array Parsed array from {@link PEAR_Registry::parsePackageName()} or a dependency
     *                     returned from getDepDownloadURL()
     */
    function isEqual($param)
    {
        if (is_object($param)) {
            $channel = $param->getChannel();
            $package = $param->getPackage();
            if ($param->getURI()) {
                $param = array(
                    'channel' => $param->getChannel(),
                    'package' => $param->getPackage(),
                    'version' => $param->getVersion(),
                    'uri' => $param->getURI(),
                );
            } else {
                $param = array(
                    'channel' => $param->getChannel(),
                    'package' => $param->getPackage(),
                    'version' => $param->getVersion(),
                );
            }
        } else {
            if (isset($param['uri'])) {
                if ($this->getChannel() != '__uri') {
                    return false;
                }
                return $param['uri'] == $this->getURI();
            }

            $package = isset($param['package']) ? $param['package'] : $param['info']->getPackage();
            $channel = isset($param['channel']) ? $param['channel'] : $param['info']->getChannel();
            if (isset($param['rel'])) {
                if (!class_exists('PEAR_Dependency2')) {
                    require_once 'PEAR/Dependency2.php';
                }

                $newdep = PEAR_Dependency2::normalizeDep($param);
                $newdep = $newdep[0];
            } elseif (isset($param['min'])) {
                $newdep = $param;
            }
        }

        if (isset($newdep)) {
            if (!isset($newdep['min'])) {
                $newdep['min'] = '0';
            }

            if (!isset($newdep['max'])) {
                $newdep['max'] = '100000000000000000000';
            }

            // use magic to support pecl packages suddenly jumping to the pecl channel
            // we need to support both dependency possibilities
            if ($channel == 'pear.php.net' && $this->getChannel() == 'pecl.php.net') {
                if ($package == $this->getPackage()) {
                    $channel = 'pecl.php.net';
                }
            }
            if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') {
                if ($package == $this->getPackage()) {
                    $channel = 'pear.php.net';
                }
            }

            return (strtolower($package) == strtolower($this->getPackage()) &&
                $channel == $this->getChannel() &&
                version_compare($newdep['min'], $this->getVersion(), '<=') &&
                version_compare($newdep['max'], $this->getVersion(), '>='));
        }

        // use magic to support pecl packages suddenly jumping to the pecl channel
        if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') {
            if (strtolower($package) == strtolower($this->getPackage())) {
                $channel = 'pear.php.net';
            }
        }

        if (isset($param['version'])) {
            return (strtolower($package) == strtolower($this->getPackage()) &&
                $channel == $this->getChannel() &&
                $param['version'] == $this->getVersion());
        }

        return strtolower($package) == strtolower($this->getPackage()) &&
            $channel == $this->getChannel();
    }

    function isInstalled($dep, $oper = '==')
    {
        if (!$dep) {
            return false;
        }

        if ($oper != 'ge' && $oper != 'gt' && $oper != 'has' && $oper != '==') {
            return false;
        }

        if (is_object($dep)) {
            $package = $dep->getPackage();
            $channel = $dep->getChannel();
            if ($dep->getURI()) {
                $dep = array(
                    'uri' => $dep->getURI(),
                    'version' => $dep->getVersion(),
                );
            } else {
                $dep = array(
                    'version' => $dep->getVersion(),
                );
            }
        } else {
            if (isset($dep['uri'])) {
                $channel = '__uri';
                $package = $dep['dep']['name'];
            } else {
                $channel = $dep['info']->getChannel();
                $package = $dep['info']->getPackage();
            }
        }

        $options = $this->_downloader->getOptions();
        $test    = $this->_installRegistry->packageExists($package, $channel);
        if (!$test && $channel == 'pecl.php.net') {
            // do magic to allow upgrading from old pecl packages to new ones
            $test = $this->_installRegistry->packageExists($package, 'pear.php.net');
            $channel = 'pear.php.net';
        }

        if ($test) {
            if (isset($dep['uri'])) {
                if ($this->_installRegistry->packageInfo($package, 'uri', '__uri') == $dep['uri']) {
                    return true;
                }
            }

            if (isset($options['upgrade'])) {
                $packageVersion = $this->_installRegistry->packageInfo($package, 'version', $channel);
                if (version_compare($packageVersion, $dep['version'], '>=')) {
                    return true;
                }

                return false;
            }

            return true;
        }

        return false;
    }

    /**
     * Detect duplicate package names with differing versions
     *
     * If a user requests to install Date 1.4.6 and Date 1.4.7,
     * for instance, this is a logic error.  This method
     * detects this situation.
     *
     * @param array $params array of PEAR_Downloader_Package objects
     * @param array $errorparams empty array
     * @return array array of stupid duplicated packages in PEAR_Downloader_Package obejcts
     */
    public static function detectStupidDuplicates($params, &$errorparams)
    {
        $existing = array();
        foreach ($params as $i => $param) {
            $package = $param->getPackage();
            $channel = $param->getChannel();
            $group   = $param->getGroup();
            if (!isset($existing[$channel . '/' . $package])) {
                $existing[$channel . '/' . $package] = array();
            }

            if (!isset($existing[$channel . '/' . $package][$group])) {
                $existing[$channel . '/' . $package][$group] = array();
            }

            $existing[$channel . '/' . $package][$group][] = $i;
        }

        $indices = array();
        foreach ($existing as $package => $groups) {
            foreach ($groups as $group => $dupes) {
                if (count($dupes) > 1) {
                    $indices = $indices + $dupes;
                }
            }
        }

        $indices = array_unique($indices);
        foreach ($indices as $index) {
            $errorparams[] = $params[$index];
        }

        return count($errorparams);
    }

    /**
     * @param array
     * @param bool ignore install groups - for final removal of dupe packages
     */
    public static function removeDuplicates(&$params, $ignoreGroups = false)
    {
        $pnames = array();
        foreach ($params as $i => $param) {
            if (!$param) {
                continue;
            }

            if ($param->getPackage()) {
                $group = $ignoreGroups ? '' : $param->getGroup();
                $pnames[$i] = $param->getChannel() . '/' .
                    $param->getPackage() . '-' . $param->getVersion() . '#' . $group;
            }
        }

        $pnames = array_unique($pnames);
        $unset  = array_diff(array_keys($params), array_keys($pnames));
        $testp  = array_flip($pnames);
        foreach ($params as $i => $param) {
            if (!$param) {
                $unset[] = $i;
                continue;
            }

            if (!is_a($param, 'PEAR_Downloader_Package')) {
                $unset[] = $i;
                continue;
            }

            $group = $ignoreGroups ? '' : $param->getGroup();
            if (!isset($testp[$param->getChannel() . '/' . $param->getPackage() . '-' .
                  $param->getVersion() . '#' . $group])) {
                $unset[] = $i;
            }
        }

        foreach ($unset as $i) {
            unset($params[$i]);
        }

        $ret = array();
        foreach ($params as $i => $param) {
            $ret[] = &$params[$i];
        }

        $params = array();
        foreach ($ret as $i => $param) {
            $params[] = &$ret[$i];
        }
    }

    function explicitState()
    {
        return $this->_explicitState;
    }

    function setExplicitState($s)
    {
        $this->_explicitState = $s;
    }

    /**
     */
    public static function mergeDependencies(&$params)
    {
        $bundles = $newparams = array();
        foreach ($params as $i => $param) {
            if (!$param->isBundle()) {
                continue;
            }

            $bundles[] = $i;
            $pf = &$param->getPackageFile();
            $newdeps = array();
            $contents = $pf->getBundledPackages();
            if (!is_array($contents)) {
                $contents = array($contents);
            }

            foreach ($contents as $file) {
                $filecontents = $pf->getFileContents($file);
                $dl = &$param->getDownloader();
                $options = $dl->getOptions();
                if (PEAR::isError($dir = $dl->getDownloadDir())) {
                    return $dir;
                }

                $fp = @fopen($dir . DIRECTORY_SEPARATOR . $file, 'wb');
                if (!$fp) {
                    continue;
                }

                // FIXME do symlink check

                fwrite($fp, $filecontents, strlen($filecontents));
                fclose($fp);
                if ($s = $params[$i]->explicitState()) {
                    $obj->setExplicitState($s);
                }

                $obj = new PEAR_Downloader_Package($params[$i]->getDownloader());
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if (PEAR::isError($dir = $dl->getDownloadDir())) {
                    PEAR::popErrorHandling();
                    return $dir;
                }
                $a = $dir . DIRECTORY_SEPARATOR . $file;
                $e = $obj->_fromFile($a);
                PEAR::popErrorHandling();
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $dl->log(0, $e->getMessage());
                    }
                    continue;
                }

                if (!PEAR_Downloader_Package::willDownload($obj,
                      array_merge($params, $newparams)) && !$param->isInstalled($obj)) {
                    $newparams[] = $obj;
                }
            }
        }

        foreach ($bundles as $i) {
            unset($params[$i]); // remove bundles - only their contents matter for installation
        }

        PEAR_Downloader_Package::removeDuplicates($params); // strip any unset indices
        if (count($newparams)) { // add in bundled packages for install
            foreach ($newparams as $i => $unused) {
                $params[] = &$newparams[$i];
            }
            $newparams = array();
        }

        foreach ($params as $i => $param) {
            $newdeps = array();
            foreach ($param->_downloadDeps as $dep) {
                $merge = array_merge($params, $newparams);
                if (!PEAR_Downloader_Package::willDownload($dep, $merge)
                    && !$param->isInstalled($dep)
                ) {
                    $newdeps[] = $dep;
                } else {
                    //var_dump($dep);
                    // detect versioning conflicts here
                }
            }

            // convert the dependencies into PEAR_Downloader_Package objects for the next time around
            $params[$i]->_downloadDeps = array();
            foreach ($newdeps as $dep) {
                $obj = new PEAR_Downloader_Package($params[$i]->getDownloader());
                if ($s = $params[$i]->explicitState()) {
                    $obj->setExplicitState($s);
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $e = $obj->fromDepURL($dep);
                PEAR::popErrorHandling();
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $obj->_downloader->log(0, $e->getMessage());
                    }
                    continue;
                }

                $e = $obj->detectDependencies($params);
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $obj->_downloader->log(0, $e->getMessage());
                    }
                }

                $newparams[] = $obj;
            }
        }

        if (count($newparams)) {
            foreach ($newparams as $i => $unused) {
                $params[] = &$newparams[$i];
            }
            return true;
        }

        return false;
    }


    /**
     */
    public static function willDownload($param, $params)
    {
        if (!is_array($params)) {
            return false;
        }

        foreach ($params as $obj) {
            if ($obj->isEqual($param)) {
                return true;
            }
        }

        return false;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Config
     * @param int
     * @param string
     */
    function &getPackagefileObject(&$c, $d)
    {
        $a = new PEAR_PackageFile($c, $d);
        return $a;
    }

    /**
     * This will retrieve from a local file if possible, and parse out
     * a group name as well.  The original parameter will be modified to reflect this.
     * @param string|array can be a parsed package name as well
     * @access private
     */
    function _fromFile(&$param)
    {
        $saveparam = $param;
        if (is_string($param) && substr($param, 0, 10) !== 'channel://') {
            if (!@file_exists($param)) {
                $test = explode('#', $param);
                $group = array_pop($test);
                if (@file_exists(implode('#', $test))) {
                    $this->setGroup($group);
                    $param = implode('#', $test);
                    $this->_explicitGroup = true;
                }
            }

            if (@is_file($param)) {
                $this->_type = 'local';
                $options = $this->_downloader->getOptions();
                $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->_debug);
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $pf = &$pkg->fromAnyFile($param, PEAR_VALIDATE_INSTALLING);
                PEAR::popErrorHandling();
                if (PEAR::isError($pf)) {
                    $this->_valid = false;
                    $param = $saveparam;
                    return $pf;
                }
                $this->_packagefile = &$pf;
                if (!$this->getGroup()) {
                    $this->setGroup('default'); // install the default dependency group
                }
                return $this->_valid = true;
            }
        }
        $param = $saveparam;
        return $this->_valid = false;
    }

    function _fromUrl($param, $saveparam = '')
    {
        if (!is_array($param) && (preg_match('#^(http|https|ftp)://#', $param))) {
            $options = $this->_downloader->getOptions();
            $this->_type = 'url';
            $callback = $this->_downloader->ui ?
                array(&$this->_downloader, '_downloadCallback') : null;
            $this->_downloader->pushErrorHandling(PEAR_ERROR_RETURN);
            if (PEAR::isError($dir = $this->_downloader->getDownloadDir())) {
                $this->_downloader->popErrorHandling();
                return $dir;
            }

            $this->_downloader->log(3, 'Downloading "' . $param . '"');
            $file = $this->_downloader->downloadHttp($param, $this->_downloader->ui,
                $dir, $callback, null, false, $this->getChannel());
            $this->_downloader->popErrorHandling();
            if (PEAR::isError($file)) {
                if (!empty($saveparam)) {
                    $saveparam = ", cannot download \"$saveparam\"";
                }
                $err = PEAR::raiseError('Could not download from "' . $param .
                    '"' . $saveparam . ' (' . $file->getMessage() . ')');
                    return $err;
            }

            if ($this->_rawpackagefile) {
                require_once 'Archive/Tar.php';
                $tar = new Archive_Tar($file);
                $packagexml = $tar->extractInString('package2.xml');
                if (!$packagexml) {
                    $packagexml = $tar->extractInString('package.xml');
                }

                if (str_replace(array("\n", "\r"), array('',''), $packagexml) !=
                      str_replace(array("\n", "\r"), array('',''), $this->_rawpackagefile)) {
                    if ($this->getChannel() != 'pear.php.net') {
                        return PEAR::raiseError('CRITICAL ERROR: package.xml downloaded does ' .
                            'not match value returned from xml-rpc');
                    }

                    // be more lax for the existing PEAR packages that have not-ok
                    // characters in their package.xml
                    $this->_downloader->log(0, 'CRITICAL WARNING: The "' .
                        $this->getPackage() . '" package has invalid characters in its ' .
                        'package.xml.  The next version of PEAR may not be able to install ' .
                        'this package for security reasons.  Please open a bug report at ' .
                        'http://pear.php.net/package/' . $this->getPackage() . '/bugs');
                }
            }

            // whew, download worked!
            $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->debug);

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $pf = &$pkg->fromAnyFile($file, PEAR_VALIDATE_INSTALLING);
            PEAR::popErrorHandling();
            if (PEAR::isError($pf)) {
                if (is_array($pf->getUserInfo())) {
                    foreach ($pf->getUserInfo() as $err) {
                        if (is_array($err)) {
                            $err = $err['message'];
                        }

                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, "Validation Error: $err");
                        }
                    }
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $pf->getMessage());
                }

                ///FIXME need to pass back some error code that we can use to match with to cancel all further operations
                /// At least stop all deps of this package from being installed
                $out = $saveparam ? $saveparam : $param;
                $err = PEAR::raiseError('Download of "' . $out . '" succeeded, but it is not a valid package archive');
                $this->_valid = false;
                return $err;
            }

            $this->_packagefile = &$pf;
            $this->setGroup('default'); // install the default dependency group
            return $this->_valid = true;
        }

        return $this->_valid = false;
    }

    /**
     *
     * @param string|array pass in an array of format
     *                     array(
     *                      'package' => 'pname',
     *                     ['channel' => 'channame',]
     *                     ['version' => 'version',]
     *                     ['state' => 'state',])
     *                     or a string of format [channame/]pname[-version|-state]
     */
    function _fromString($param)
    {
        $options = $this->_downloader->getOptions();
        $channel = $this->_config->get('default_channel');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $pname = $this->_registry->parsePackageName($param, $channel);
        PEAR::popErrorHandling();
        if (PEAR::isError($pname)) {
            if ($pname->getCode() == 'invalid') {
                $this->_valid = false;
                return false;
            }

            if ($pname->getCode() == 'channel') {
                $parsed = $pname->getUserInfo();
                if ($this->_downloader->discover($parsed['channel'])) {
                    if ($this->_config->get('auto_discover')) {
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        $pname = $this->_registry->parsePackageName($param, $channel);
                        PEAR::popErrorHandling();
                    } else {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, 'Channel "' . $parsed['channel'] .
                                '" is not initialized, use ' .
                                '"pear channel-discover ' . $parsed['channel'] . '" to initialize' .
                                'or pear config-set auto_discover 1');
                        }
                    }
                }

                if (PEAR::isError($pname)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $pname->getMessage());
                    }

                    if (is_array($param)) {
                        $param = $this->_registry->parsedPackageNameToString($param);
                    }

                    $err = PEAR::raiseError('invalid package name/package file "' . $param . '"');
                    $this->_valid = false;
                    return $err;
                }
            } else {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $pname->getMessage());
                }

                $err = PEAR::raiseError('invalid package name/package file "' . $param . '"');
                $this->_valid = false;
                return $err;
            }
        }

        if (!isset($this->_type)) {
            $this->_type = 'rest';
        }

        $this->_parsedname    = $pname;
        $this->_explicitState = isset($pname['state']) ? $pname['state'] : false;
        $this->_explicitGroup = isset($pname['group']) ? true : false;

        $info = $this->_downloader->_getPackageDownloadUrl($pname);
        if (PEAR::isError($info)) {
            if ($info->getCode() != -976 && $pname['channel'] == 'pear.php.net') {
                // try pecl
                $pname['channel'] = 'pecl.php.net';
                if ($test = $this->_downloader->_getPackageDownloadUrl($pname)) {
                    if (!PEAR::isError($test)) {
                        $info = PEAR::raiseError($info->getMessage() . ' - package ' .
                            $this->_registry->parsedPackageNameToString($pname, true) .
                            ' can be installed with "pecl install ' . $pname['package'] .
                            '"');
                    } else {
                        $pname['channel'] = 'pear.php.net';
                    }
                } else {
                    $pname['channel'] = 'pear.php.net';
                }
            }

            return $info;
        }

        $this->_rawpackagefile = $info['raw'];
        $ret = $this->_analyzeDownloadURL($info, $param, $pname);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if ($ret) {
            $this->_downloadURL = $ret;
            return $this->_valid = (bool) $ret;
        }
    }

    /**
     * @param array output of package.getDownloadURL
     * @param string|array|object information for detecting packages to be downloaded, and
     *                            for errors
     * @param array name information of the package
     * @param array|null packages to be downloaded
     * @param bool is this an optional dependency?
     * @param bool is this any kind of dependency?
     * @access private
     */
    function _analyzeDownloadURL($info, $param, $pname, $params = null, $optional = false,
                                 $isdependency = false)
    {
        if (!is_string($param) && PEAR_Downloader_Package::willDownload($param, $params)) {
            return false;
        }

        if ($info === false) {
            $saveparam = !is_string($param) ? ", cannot download \"$param\"" : '';

            // no releases exist
            return PEAR::raiseError('No releases for package "' .
                $this->_registry->parsedPackageNameToString($pname, true) . '" exist' . $saveparam);
        }

        if (strtolower($info['info']->getChannel()) != strtolower($pname['channel'])) {
            $err = false;
            if ($pname['channel'] == 'pecl.php.net') {
                if ($info['info']->getChannel() != 'pear.php.net') {
                    $err = true;
                }
            } elseif ($info['info']->getChannel() == 'pecl.php.net') {
                if ($pname['channel'] != 'pear.php.net') {
                    $err = true;
                }
            } else {
                $err = true;
            }

            if ($err) {
                return PEAR::raiseError('SECURITY ERROR: package in channel "' . $pname['channel'] .
                    '" retrieved another channel\'s name for download! ("' .
                    $info['info']->getChannel() . '")');
            }
        }

        $preferred_state = $this->_config->get('preferred_state');
        if (!isset($info['url'])) {
            $package_version = $this->_registry->packageInfo($info['info']->getPackage(),
            'version', $info['info']->getChannel());
            if ($this->isInstalled($info)) {
                if ($isdependency && version_compare($info['version'], $package_version, '<=')) {
                    // ignore bogus errors of "failed to download dependency"
                    // if it is already installed and the one that would be
                    // downloaded is older or the same version (Bug #7219)
                    return false;
                }
            }

            if ($info['version'] === $package_version) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . '-' . $package_version. ', additionally the suggested version' .
                        ' (' . $package_version . ') is the same as the locally installed one.');
                }

                return false;
            }

            if (version_compare($info['version'], $package_version, '<=')) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . '-' . $package_version . ', additionally the suggested version' .
                        ' (' . $info['version'] . ') is a lower version than the locally installed one (' . $package_version . ').');
                }

                return false;
            }

            $instead =  ', will instead download version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '"';
            // releases exist, but we failed to get any
            if (isset($this->_downloader->_options['force'])) {
                if (isset($pname['version'])) {
                    $vs = ', version "' . $pname['version'] . '"';
                } elseif (isset($pname['state'])) {
                    $vs = ', stability "' . $pname['state'] . '"';
                } elseif ($param == 'dependency') {
                    if (!class_exists('PEAR_Common')) {
                        require_once 'PEAR/Common.php';
                    }

                    if (!in_array($info['info']->getState(),
                          PEAR_Common::betterStates($preferred_state, true))) {
                        if ($optional) {
                            // don't spit out confusing error message
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = ' within preferred state "' . $preferred_state .
                            '"';
                    } else {
                        if (!class_exists('PEAR_Dependency2')) {
                            require_once 'PEAR/Dependency2.php';
                        }

                        if ($optional) {
                            // don't spit out confusing error message
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = PEAR_Dependency2::_getExtraString($pname);
                        $instead = '';
                    }
                } else {
                    $vs = ' within preferred state "' . $preferred_state . '"';
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . $vs . $instead);
                }

                // download the latest release
                return $this->_downloader->_getPackageDownloadUrl(
                    array('package' => $pname['package'],
                          'channel' => $pname['channel'],
                          'version' => $info['version']));
            } else {
                if (isset($info['php']) && $info['php']) {
                    $err = PEAR::raiseError('Failed to download ' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'],
                                  'package' => $pname['package']),
                                true) .
                        ', latest release is version ' . $info['php']['v'] .
                        ', but it requires PHP version "' .
                        $info['php']['m'] . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['php']['v'])) . '" to install',
                            PEAR_DOWNLOADER_PACKAGE_PHPVERSION);
                    return $err;
                }

                // construct helpful error message
                if (isset($pname['version'])) {
                    $vs = ', version "' . $pname['version'] . '"';
                } elseif (isset($pname['state'])) {
                    $vs = ', stability "' . $pname['state'] . '"';
                } elseif ($param == 'dependency') {
                    if (!class_exists('PEAR_Common')) {
                        require_once 'PEAR/Common.php';
                    }

                    if (!in_array($info['info']->getState(),
                          PEAR_Common::betterStates($preferred_state, true))) {
                        if ($optional) {
                            // don't spit out confusing error message, and don't die on
                            // optional dep failure!
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = ' within preferred state "' . $preferred_state . '"';
                    } else {
                        if (!class_exists('PEAR_Dependency2')) {
                            require_once 'PEAR/Dependency2.php';
                        }

                        if ($optional) {
                            // don't spit out confusing error message, and don't die on
                            // optional dep failure!
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = PEAR_Dependency2::_getExtraString($pname);
                    }
                } else {
                    $vs = ' within preferred state "' . $this->_downloader->config->get('preferred_state') . '"';
                }

                $options = $this->_downloader->getOptions();
                // this is only set by the "download-all" command
                if (isset($options['ignorepreferred_state'])) {
                    $err = PEAR::raiseError(
                        'Failed to download ' . $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package']),
                                true)
                         . $vs .
                        ', latest release is version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['version'])) . '" to install',
                            PEAR_DOWNLOADER_PACKAGE_STATE);
                    return $err;
                }

                // Checks if the user has a package installed already and checks the release against
                // the state against the installed package, this allows upgrades for packages
                // with lower stability than the preferred_state
                $stability = $this->_registry->packageInfo($pname['package'], 'stability', $pname['channel']);
                if (!$this->isInstalled($info)
                    || !in_array($info['info']->getState(), PEAR_Common::betterStates($stability['release'], true))
                ) {
                    $err = PEAR::raiseError(
                        'Failed to download ' . $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package']),
                                true)
                         . $vs .
                        ', latest release is version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['version'])) . '" to install');
                    return $err;
                }
            }
        }

        if (isset($info['deprecated']) && $info['deprecated']) {
            $this->_downloader->log(0,
                'WARNING: "' .
                    $this->_registry->parsedPackageNameToString(
                            array('channel' => $info['info']->getChannel(),
                                  'package' => $info['info']->getPackage()), true) .
                '" is deprecated in favor of "' .
                    $this->_registry->parsedPackageNameToString($info['deprecated'], true) .
                '"');
        }

        return $info;
    }
}
pear/PEAR/Validate.php000064400000052765151732710040010503 0ustar00<?php
/**
 * PEAR_Validate
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**#@+
 * Constants for install stage
 */
define('PEAR_VALIDATE_INSTALLING', 1);
define('PEAR_VALIDATE_UNINSTALLING', 2); // this is not bit-mapped like the others
define('PEAR_VALIDATE_NORMAL', 3);
define('PEAR_VALIDATE_DOWNLOADING', 4); // this is not bit-mapped like the others
define('PEAR_VALIDATE_PACKAGING', 7);
/**#@-*/
require_once 'PEAR/Common.php';
require_once 'PEAR/Validator/PECL.php';

/**
 * Validation class for package.xml - channel-level advanced validation
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Validate
{
    var $packageregex = _PEAR_COMMON_PACKAGE_NAME_PREG;
    /**
     * @var PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    var $_packagexml;
    /**
     * @var int one of the PEAR_VALIDATE_* constants
     */
    var $_state = PEAR_VALIDATE_NORMAL;
    /**
     * Format: ('error' => array('field' => name, 'reason' => reason), 'warning' => same)
     * @var array
     * @access private
     */
    var $_failures = array('error' => array(), 'warning' => array());

    /**
     * Override this method to handle validation of normal package names
     * @param string
     * @return bool
     * @access protected
     */
    function _validPackageName($name)
    {
        return (bool) preg_match('/^' . $this->packageregex . '\\z/', $name);
    }

    /**
     * @param string package name to validate
     * @param string name of channel-specific validation package
     * @final
     */
    function validPackageName($name, $validatepackagename = false)
    {
        if ($validatepackagename) {
            if (strtolower($name) == strtolower($validatepackagename)) {
                return (bool) preg_match('/^[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*\\z/', $name);
            }
        }
        return $this->_validPackageName($name);
    }

    /**
     * This validates a bundle name, and bundle names must conform
     * to the PEAR naming convention, so the method is final and static.
     * @param string
     * @final
     */
    public static function validGroupName($name)
    {
        return (bool) preg_match('/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/', $name);
    }

    /**
     * Determine whether $state represents a valid stability level
     * @param string
     * @return bool
     * @final
     */
    public static function validState($state)
    {
        return in_array($state, array('snapshot', 'devel', 'alpha', 'beta', 'stable'));
    }

    /**
     * Get a list of valid stability levels
     * @return array
     * @final
     */
    public static function getValidStates()
    {
        return array('snapshot', 'devel', 'alpha', 'beta', 'stable');
    }

    /**
     * Determine whether a version is a properly formatted version number that can be used
     * by version_compare
     * @param string
     * @return bool
     * @final
     */
    public static function validVersion($ver)
    {
        return (bool) preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver);
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    function setPackageFile(&$pf)
    {
        $this->_packagexml = &$pf;
    }

    /**
     * @access private
     */
    function _addFailure($field, $reason)
    {
        $this->_failures['errors'][] = array('field' => $field, 'reason' => $reason);
    }

    /**
     * @access private
     */
    function _addWarning($field, $reason)
    {
        $this->_failures['warnings'][] = array('field' => $field, 'reason' => $reason);
    }

    function getFailures()
    {
        $failures = $this->_failures;
        $this->_failures = array('warnings' => array(), 'errors' => array());
        return $failures;
    }

    /**
     * @param int one of the PEAR_VALIDATE_* constants
     */
    function validate($state = null)
    {
        if (!isset($this->_packagexml)) {
            return false;
        }
        if ($state !== null) {
            $this->_state = $state;
        }
        $this->_failures = array('warnings' => array(), 'errors' => array());
        $this->validatePackageName();
        $this->validateVersion();
        $this->validateMaintainers();
        $this->validateDate();
        $this->validateSummary();
        $this->validateDescription();
        $this->validateLicense();
        $this->validateNotes();
        if ($this->_packagexml->getPackagexmlVersion() == '1.0') {
            $this->validateState();
            $this->validateFilelist();
        } elseif ($this->_packagexml->getPackagexmlVersion() == '2.0' ||
                  $this->_packagexml->getPackagexmlVersion() == '2.1') {
            $this->validateTime();
            $this->validateStability();
            $this->validateDeps();
            $this->validateMainFilelist();
            $this->validateReleaseFilelist();
            //$this->validateGlobalTasks();
            $this->validateChangelog();
        }
        return !((bool) count($this->_failures['errors']));
    }

    /**
     * @access protected
     */
    function validatePackageName()
    {
        if ($this->_state == PEAR_VALIDATE_PACKAGING ||
              $this->_state == PEAR_VALIDATE_NORMAL) {
            if (($this->_packagexml->getPackagexmlVersion() == '2.0' ||
                 $this->_packagexml->getPackagexmlVersion() == '2.1') &&
                  $this->_packagexml->getExtends()) {
                $version = $this->_packagexml->getVersion() . '';
                $name = $this->_packagexml->getPackage();
                $a = explode('.', $version);
                $test = array_shift($a);
                if ($test == '0') {
                    return true;
                }
                $vlen = strlen($test);
                $majver = substr($name, strlen($name) - $vlen);
                while ($majver && !is_numeric($majver[0])) {
                    $majver = substr($majver, 1);
                }
                if ($majver != $test) {
                    $this->_addWarning('package', "package $name extends package " .
                        $this->_packagexml->getExtends() . ' and so the name should ' .
                        'have a postfix equal to the major version like "' .
                        $this->_packagexml->getExtends() . $test . '"');
                    return true;
                } elseif (substr($name, 0, strlen($name) - $vlen) !=
                            $this->_packagexml->getExtends()) {
                    $this->_addWarning('package', "package $name extends package " .
                        $this->_packagexml->getExtends() . ' and so the name must ' .
                        'be an extension like "' . $this->_packagexml->getExtends() .
                        $test . '"');
                    return true;
                }
            }
        }
        if (!$this->validPackageName($this->_packagexml->getPackage())) {
            $this->_addFailure('name', 'package name "' .
                $this->_packagexml->getPackage() . '" is invalid');
            return false;
        }
    }

    /**
     * @access protected
     */
    function validateVersion()
    {
        if ($this->_state != PEAR_VALIDATE_PACKAGING) {
            if (!$this->validVersion($this->_packagexml->getVersion())) {
                $this->_addFailure('version',
                    'Invalid version number "' . $this->_packagexml->getVersion() . '"');
            }
            return false;
        }
        $version = $this->_packagexml->getVersion();
        $versioncomponents = explode('.', $version);
        if (count($versioncomponents) != 3) {
            $this->_addWarning('version',
                'A version number should have 3 decimals (x.y.z)');
            return true;
        }
        $name = $this->_packagexml->getPackage();
        // version must be based upon state
        switch ($this->_packagexml->getState()) {
            case 'snapshot' :
                return true;
            case 'devel' :
                if ($versioncomponents[0] . 'a' == '0a') {
                    return true;
                }
                if ($versioncomponents[0] == 0) {
                    $versioncomponents[0] = '0';
                    $this->_addWarning('version',
                        'version "' . $version . '" should be "' .
                        implode('.' ,$versioncomponents) . '"');
                } else {
                    $this->_addWarning('version',
                        'packages with devel stability must be < version 1.0.0');
                }
                return true;
            break;
            case 'alpha' :
            case 'beta' :
                // check for a package that extends a package,
                // like Foo and Foo2
                if ($this->_state == PEAR_VALIDATE_PACKAGING) {
                    if (substr($versioncomponents[2], 1, 2) == 'rc') {
                        $this->_addFailure('version', 'Release Candidate versions ' .
                            'must have capital RC, not lower-case rc');
                        return false;
                    }
                }
                if (!$this->_packagexml->getExtends()) {
                    if ($versioncomponents[0] == '1') {
                        if ($versioncomponents[2][0] == '0') {
                            if ($versioncomponents[2] == '0') {
                                // version 1.*.0000
                                $this->_addWarning('version',
                                    'version 1.' . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return true;
                            } elseif (strlen($versioncomponents[2]) > 1) {
                                // version 1.*.0RC1 or 1.*.0beta24 etc.
                                return true;
                            } else {
                                // version 1.*.0
                                $this->_addWarning('version',
                                    'version 1.' . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return true;
                            }
                        } else {
                            $this->_addWarning('version',
                                'bugfix versions (1.3.x where x > 0) probably should ' .
                                'not be alpha or beta');
                            return true;
                        }
                    } elseif ($versioncomponents[0] != '0') {
                        $this->_addWarning('version',
                            'major versions greater than 1 are not allowed for packages ' .
                            'without an <extends> tag or an identical postfix (foo2 v2.0.0)');
                        return true;
                    }
                    if ($versioncomponents[0] . 'a' == '0a') {
                        return true;
                    }
                    if ($versioncomponents[0] == 0) {
                        $versioncomponents[0] = '0';
                        $this->_addWarning('version',
                            'version "' . $version . '" should be "' .
                            implode('.' ,$versioncomponents) . '"');
                    }
                } else {
                    $vlen = strlen($versioncomponents[0] . '');
                    $majver = substr($name, strlen($name) - $vlen);
                    while ($majver && !is_numeric($majver[0])) {
                        $majver = substr($majver, 1);
                    }
                    if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) {
                        $this->_addWarning('version', 'first version number "' .
                            $versioncomponents[0] . '" must match the postfix of ' .
                            'package name "' . $name . '" (' .
                            $majver . ')');
                        return true;
                    }
                    if ($versioncomponents[0] == $majver) {
                        if ($versioncomponents[2][0] == '0') {
                            if ($versioncomponents[2] == '0') {
                                // version 2.*.0000
                                $this->_addWarning('version',
                                    "version $majver." . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return false;
                            } elseif (strlen($versioncomponents[2]) > 1) {
                                // version 2.*.0RC1 or 2.*.0beta24 etc.
                                return true;
                            } else {
                                // version 2.*.0
                                $this->_addWarning('version',
                                    "version $majver." . $versioncomponents[1] .
                                        '.0 cannot be alpha or beta');
                                return true;
                            }
                        } else {
                            $this->_addWarning('version',
                                "bugfix versions ($majver.x.y where y > 0) should " .
                                'not be alpha or beta');
                            return true;
                        }
                    } elseif ($versioncomponents[0] != '0') {
                        $this->_addWarning('version',
                            "only versions 0.x.y and $majver.x.y are allowed for alpha/beta releases");
                        return true;
                    }
                    if ($versioncomponents[0] . 'a' == '0a') {
                        return true;
                    }
                    if ($versioncomponents[0] == 0) {
                        $versioncomponents[0] = '0';
                        $this->_addWarning('version',
                            'version "' . $version . '" should be "' .
                            implode('.' ,$versioncomponents) . '"');
                    }
                }
                return true;
            break;
            case 'stable' :
                if ($versioncomponents[0] == '0') {
                    $this->_addWarning('version', 'versions less than 1.0.0 cannot ' .
                    'be stable');
                    return true;
                }
                if (!is_numeric($versioncomponents[2])) {
                    if (preg_match('/\d+(rc|a|alpha|b|beta)\d*/i',
                          $versioncomponents[2])) {
                        $this->_addWarning('version', 'version "' . $version . '" or any ' .
                            'RC/beta/alpha version cannot be stable');
                        return true;
                    }
                }
                // check for a package that extends a package,
                // like Foo and Foo2
                if ($this->_packagexml->getExtends()) {
                    $vlen = strlen($versioncomponents[0] . '');
                    $majver = substr($name, strlen($name) - $vlen);
                    while ($majver && !is_numeric($majver[0])) {
                        $majver = substr($majver, 1);
                    }
                    if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) {
                        $this->_addWarning('version', 'first version number "' .
                            $versioncomponents[0] . '" must match the postfix of ' .
                            'package name "' . $name . '" (' .
                            $majver . ')');
                        return true;
                    }
                } elseif ($versioncomponents[0] > 1) {
                    $this->_addWarning('version', 'major version x in x.y.z may not be greater than ' .
                        '1 for any package that does not have an <extends> tag');
                }
                return true;
            break;
            default :
                return false;
            break;
        }
    }

    /**
     * @access protected
     */
    function validateMaintainers()
    {
        // maintainers can only be truly validated server-side for most channels
        // but allow this customization for those who wish it
        return true;
    }

    /**
     * @access protected
     */
    function validateDate()
    {
        if ($this->_state == PEAR_VALIDATE_NORMAL ||
              $this->_state == PEAR_VALIDATE_PACKAGING) {

            if (!preg_match('/(\d\d\d\d)\-(\d\d)\-(\d\d)/',
                  $this->_packagexml->getDate(), $res) ||
                  count($res) < 4
                  || !checkdate($res[2], $res[3], $res[1])
                ) {
                $this->_addFailure('date', 'invalid release date "' .
                    $this->_packagexml->getDate() . '"');
                return false;
            }

            if ($this->_state == PEAR_VALIDATE_PACKAGING &&
                  $this->_packagexml->getDate() != date('Y-m-d')) {
                $this->_addWarning('date', 'Release Date "' .
                    $this->_packagexml->getDate() . '" is not today');
            }
        }
        return true;
    }

    /**
     * @access protected
     */
    function validateTime()
    {
        if (!$this->_packagexml->getTime()) {
            // default of no time value set
            return true;
        }

        // packager automatically sets time, so only validate if pear validate is called
        if ($this->_state = PEAR_VALIDATE_NORMAL) {
            if (!preg_match('/\d\d:\d\d:\d\d/',
                  $this->_packagexml->getTime())) {
                $this->_addFailure('time', 'invalid release time "' .
                    $this->_packagexml->getTime() . '"');
                return false;
            }

            $result = preg_match('|\d{2}\:\d{2}\:\d{2}|', $this->_packagexml->getTime(), $matches);
            if ($result === false || empty($matches)) {
                $this->_addFailure('time', 'invalid release time "' .
                    $this->_packagexml->getTime() . '"');
                return false;
            }
        }

        return true;
    }

    /**
     * @access protected
     */
    function validateState()
    {
        // this is the closest to "final" php4 can get
        if (!PEAR_Validate::validState($this->_packagexml->getState())) {
            if (strtolower($this->_packagexml->getState() == 'rc')) {
                $this->_addFailure('state', 'RC is not a state, it is a version ' .
                    'postfix, use ' . $this->_packagexml->getVersion() . 'RC1, state beta');
            }
            $this->_addFailure('state', 'invalid release state "' .
                $this->_packagexml->getState() . '", must be one of: ' .
                implode(', ', PEAR_Validate::getValidStates()));
            return false;
        }
        return true;
    }

    /**
     * @access protected
     */
    function validateStability()
    {
        $ret = true;
        $packagestability = $this->_packagexml->getState();
        $apistability = $this->_packagexml->getState('api');
        if (!PEAR_Validate::validState($packagestability)) {
            $this->_addFailure('state', 'invalid release stability "' .
                $this->_packagexml->getState() . '", must be one of: ' .
                implode(', ', PEAR_Validate::getValidStates()));
            $ret = false;
        }
        $apistates = PEAR_Validate::getValidStates();
        array_shift($apistates); // snapshot is not allowed
        if (!in_array($apistability, $apistates)) {
            $this->_addFailure('state', 'invalid API stability "' .
                $this->_packagexml->getState('api') . '", must be one of: ' .
                implode(', ', $apistates));
            $ret = false;
        }
        return $ret;
    }

    /**
     * @access protected
     */
    function validateSummary()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateDescription()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateLicense()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateNotes()
    {
        return true;
    }

    /**
     * for package.xml 2.0 only - channels can't use package.xml 1.0
     * @access protected
     */
    function validateDependencies()
    {
        return true;
    }

    /**
     * for package.xml 1.0 only
     * @access private
     */
    function _validateFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * for package.xml 2.0 only
     * @access protected
     */
    function validateMainFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * for package.xml 2.0 only
     * @access protected
     */
    function validateReleaseFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * @access protected
     */
    function validateChangelog()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateFilelist()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateDeps()
    {
        return true;
    }
}pear/PEAR/Installer/Role/Test.xml000064400000000622151732710040012521 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>test_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Ext.php000064400000001415151732710040012332 0ustar00<?php
/**
 * PEAR_Installer_Role_Ext
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Ext extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Cfg.php000064400000007577151732710050012311 0ustar00<?php
/**
 * PEAR_Installer_Role_Cfg
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.7.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.7.0
 */
class PEAR_Installer_Role_Cfg extends PEAR_Installer_Role_Common
{
    /**
     * @var PEAR_Installer
     */
    var $installer;

    /**
     * the md5 of the original file
     *
     * @var unknown_type
     */
    var $md5 = null;

    /**
     * Do any unusual setup here
     * @param PEAR_Installer
     * @param PEAR_PackageFile_v2
     * @param array file attributes
     * @param string file name
     */
    function setup(&$installer, $pkg, $atts, $file)
    {
        $this->installer = &$installer;
        $reg = &$this->installer->config->getRegistry();
        $package = $reg->getPackage($pkg->getPackage(), $pkg->getChannel());
        if ($package) {
            $filelist = $package->getFilelist();
            if (isset($filelist[$file]) && isset($filelist[$file]['md5sum'])) {
                $this->md5 = $filelist[$file]['md5sum'];
            }
        }
    }

    function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
    {
        $test = parent::processInstallation($pkg, $atts, $file, $tmp_path, $layer);
        if (@file_exists($test[2]) && @file_exists($test[3])) {
            $md5 = md5_file($test[2]);
            // configuration has already been installed, check for mods
            if ($md5 !== $this->md5 && $md5 !== md5_file($test[3])) {
                // configuration has been modified, so save our version as
                // configfile-version
                $old = $test[2];
                $test[2] .= '.new-' . $pkg->getVersion();
                // backup original and re-install it
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $tmpcfg = $this->config->get('temp_dir');
                $newloc = System::mkdir(array('-p', $tmpcfg));
                if (!$newloc) {
                    // try temp_dir
                    $newloc = System::mktemp(array('-d'));
                    if (!$newloc || PEAR::isError($newloc)) {
                        PEAR::popErrorHandling();
                        return PEAR::raiseError('Could not save existing configuration file '.
                            $old . ', unable to install.  Please set temp_dir ' .
                            'configuration variable to a writeable location and try again');
                    }
                } else {
                    $newloc = $tmpcfg;
                }

                $temp_file = $newloc . DIRECTORY_SEPARATOR . uniqid('savefile');
                if (!@copy($old, $temp_file)) {
                    PEAR::popErrorHandling();
                    return PEAR::raiseError('Could not save existing configuration file '.
                        $old . ', unable to install.  Please set temp_dir ' .
                        'configuration variable to a writeable location and try again');
                }

                PEAR::popErrorHandling();
                $this->installer->log(0, "WARNING: configuration file $old is being installed as $test[2], you should manually merge in changes to the existing configuration file");
                $this->installer->addFileOperation('rename', array($temp_file, $old, false));
                $this->installer->addFileOperation('delete', array($temp_file));
            }
        }

        return $test;
    }
}pear/PEAR/Installer/Role/Www.php000064400000001411151732710050012353 0ustar00<?php
/**
 * PEAR_Installer_Role_Www
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.7.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.7.0
 */
class PEAR_Installer_Role_Www extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Ext.xml000064400000000502151732710050012340 0ustar00<role version="1.0">
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>ext_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension>1</phpextension>
 <config_vars />
</role>pear/PEAR/Installer/Role/Test.php000064400000001417151732710050012514 0ustar00<?php
/**
 * PEAR_Installer_Role_Test
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Test extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Php.php000064400000001415151732710050012322 0ustar00<?php
/**
 * PEAR_Installer_Role_Php
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Php extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Doc.xml000064400000000621151732710050012307 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>doc_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Man.php000064400000001445151732710060012312 0ustar00<?php
/**
 * PEAR_Installer_Role_Man
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Hannes Magnusson <bjori@php.net>
 * @copyright  2011 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    SVN: $Id: $
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.10.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Hannes Magnusson <bjori@php.net>
 * @copyright  2011 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.10.0
 */
class PEAR_Installer_Role_Man extends PEAR_Installer_Role_Common {}
?>
pear/PEAR/Installer/Role/Data.php000064400000001417151732710060012447 0ustar00<?php
/**
 * PEAR_Installer_Role_Data
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Data extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Data.xml000064400000000622151732710060012455 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>data_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Common.php000064400000014107151732710060013026 0ustar00<?php
/**
 * Base class for all installation roles.
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * Base class for all installation roles.
 *
 * This class allows extensibility of file roles.  Packages with complex
 * customization can now provide custom file roles along with the possibility of
 * adding configuration values to match.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Common
{
    /**
     * @var PEAR_Config
     * @access protected
     */
    var $config;

    /**
     * @param PEAR_Config
     */
    function __construct(&$config)
    {
        $this->config = $config;
    }

    /**
     * Retrieve configuration information about a file role from its XML info
     *
     * @param string $role Role Classname, as in "PEAR_Installer_Role_Data"
     * @return array
     */
    function getInfo($role)
    {
        if (empty($GLOBALS['_PEAR_INSTALLER_ROLES'][$role])) {
            return PEAR::raiseError('Unknown Role class: "' . $role . '"');
        }
        return $GLOBALS['_PEAR_INSTALLER_ROLES'][$role];
    }

    /**
     * This is called for each file to set up the directories and files
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param array attributes from the <file> tag
     * @param string file name
     * @return array an array consisting of:
     *
     *    1 the original, pre-baseinstalldir installation directory
     *    2 the final installation directory
     *    3 the full path to the final location of the file
     *    4 the location of the pre-installation file
     */
    function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        if (!$roleInfo['locationconfig']) {
            return false;
        }
        if ($roleInfo['honorsbaseinstall']) {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], $layer,
                $pkg->getChannel());
            if (!empty($atts['baseinstalldir'])) {
                $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
            }
        } elseif ($roleInfo['unusualbaseinstall']) {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
                    $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
            if (!empty($atts['baseinstalldir'])) {
                $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
            }
        } else {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
                    $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
        }
        if (dirname($file) != '.' && empty($atts['install-as'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
        }
        if (empty($atts['install-as'])) {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
        } else {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as'];
        }
        $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;

        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        
        list($dest_dir, $dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    array($dest_dir, $dest_file, $orig_file));
        return array($save_destdir, $dest_dir, $dest_file, $orig_file);
    }

    /**
     * Get the name of the configuration variable that specifies the location of this file
     * @return string|false
     */
    function getLocationConfig()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['locationconfig'];
    }

    /**
     * Do any unusual setup here
     * @param PEAR_Installer
     * @param PEAR_PackageFile_v2
     * @param array file attributes
     * @param string file name
     */
    function setup(&$installer, $pkg, $atts, $file)
    {
    }

    function isExecutable()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['executable'];
    }

    function isInstallable()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['installable'];
    }

    function isExtension()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['phpextension'];
    }
}
?>
pear/PEAR/Installer/Role/Doc.php000064400000001415151732710060012301 0ustar00<?php
/**
 * PEAR_Installer_Role_Doc
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Doc extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Php.xml000064400000000655151732710060012341 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>php_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile>1</phpfile>
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Src.xml000064400000000442151732710070012334 0ustar00<role version="1.0">
 <releasetypes>extsrc</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <installable>1</installable>
 <locationconfig>temp_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Src.php000064400000001562151732710070012327 0ustar00<?php
/**
 * PEAR_Installer_Role_Src
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Src extends PEAR_Installer_Role_Common
{
    function setup(&$installer, $pkg, $atts, $file)
    {
        $installer->source_files++;
    }
}
?>pear/PEAR/Installer/Role/Script.php000064400000001423151732710070013040 0ustar00<?php
/**
 * PEAR_Installer_Role_Script
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Script extends PEAR_Installer_Role_Common {}
?>pear/PEAR/Installer/Role/Www.xml000064400000000644151732710070012375 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>www_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Cfg.xml000064400000000645151732710070012311 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>cfg_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall>1</unusualbaseinstall>
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role/Man.xml000064400000000645151732710100012317 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>man_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>
pear/PEAR/Installer/Role/Script.xml000064400000000660151732710100013045 0ustar00<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>bin_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable>1</executable>
 <phpextension />
 <config_vars />
</role>pear/PEAR/Installer/Role.php000064400000017274151732710100011601 0ustar00<?php
/**
 * PEAR_Installer_Role
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base class for installer roles
 */
require_once 'PEAR/Installer/Role/Common.php';
require_once 'PEAR/XMLParser.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role
{
    /**
     * Set up any additional configuration variables that file roles require
     *
     * Never call this directly, it is called by the PEAR_Config constructor
     * @param PEAR_Config
     */
    public static function initializeConfig(&$config)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $class => $info) {
            if (!$info['config_vars']) {
                continue;
            }

            $config->_addConfigVars($class, $info['config_vars']);
        }
    }

    /**
     * @param PEAR_PackageFile_v2
     * @param string role name
     * @param PEAR_Config
     * @return PEAR_Installer_Role_Common
     */
    public static function &factory($pkg, $role, &$config)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        if (!in_array($role, PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
            $a = false;
            return $a;
        }

        $a = 'PEAR_Installer_Role_' . ucfirst($role);
        if (!class_exists($a)) {
            require_once str_replace('_', '/', $a) . '.php';
        }

        $b = new $a($config);
        return $b;
    }

    /**
     * Get a list of file roles that are valid for the particular release type.
     *
     * For instance, src files serve no purpose in regular php releases.
     * @param string
     * @param bool clear cache
     * @return array
     */
    public static function getValidRoles($release, $clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret = array();
        if ($clear) {
            $ret = array();
        }

        if (isset($ret[$release])) {
            return $ret[$release];
        }

        $ret[$release] = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if (in_array($release, $okreleases['releasetypes'])) {
                $ret[$release][] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret[$release];
    }

    /**
     * Get a list of roles that require their files to be installed
     *
     * Most roles must be installed, but src and package roles, for instance
     * are pseudo-roles.  src files are compiled into a new extension.  Package
     * roles are actually fully bundled releases of a package
     * @param bool clear cache
     * @return array
     */
    public static function getInstallableRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['installable']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Return an array of roles that are affected by the baseinstalldir attribute
     *
     * Most roles ignore this attribute, and instead install directly into:
     * PackageName/filepath
     * so a tests file tests/file.phpt is installed into PackageName/tests/filepath.php
     * @param bool clear cache
     * @return array
     */
    public static function getBaseinstallRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['honorsbaseinstall']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Return an array of file roles that should be analyzed for PHP content at package time,
     * like the "php" role.
     * @param bool clear cache
     * @return array
     */
    public static function getPhpRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['phpfile']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Scan through the Command directory looking for classes
     * and see what commands they implement.
     * @param string which directory to look for classes, defaults to
     *               the Installer/Roles subdirectory of
     *               the directory from where this file (__FILE__) is
     *               included.
     *
     * @return bool TRUE on success, a PEAR error on failure
     */
    public static function registerRoles($dir = null)
    {
        $GLOBALS['_PEAR_INSTALLER_ROLES'] = array();
        $parser = new PEAR_XMLParser;
        if ($dir === null) {
            $dir = dirname(__FILE__) . '/Role';
        }

        if (!file_exists($dir) || !is_dir($dir)) {
            return PEAR::raiseError("registerRoles: opendir($dir) failed: does not exist/is not directory");
        }

        $dp = @opendir($dir);
        if (empty($dp)) {
            return PEAR::raiseError("registerRoles: opendir($dir) failed: $php_errmsg");
        }

        while ($entry = readdir($dp)) {
            if ($entry[0] == '.' || substr($entry, -4) != '.xml') {
                continue;
            }

            $class = "PEAR_Installer_Role_".substr($entry, 0, -4);
            // List of roles
            if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'][$class])) {
                $file = "$dir/$entry";
                $parser->parse(file_get_contents($file));
                $data = $parser->getData();
                if (!is_array($data['releasetypes'])) {
                    $data['releasetypes'] = array($data['releasetypes']);
                }

                $GLOBALS['_PEAR_INSTALLER_ROLES'][$class] = $data;
            }
        }

        closedir($dp);
        ksort($GLOBALS['_PEAR_INSTALLER_ROLES']);
        PEAR_Installer_Role::getBaseinstallRoles(true);
        PEAR_Installer_Role::getInstallableRoles(true);
        PEAR_Installer_Role::getPhpRoles(true);
        PEAR_Installer_Role::getValidRoles('****', true);
        return true;
    }
}pear/PEAR/Downloader.php000064400000200731151732710110011032 0ustar00<?php
/**
 * PEAR_Downloader, the PEAR Installer's download utility class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.0
 */

/**
 * Needed for constants, extending
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/Proxy.php';

define('PEAR_INSTALLER_OK',       1);
define('PEAR_INSTALLER_FAILED',   0);
define('PEAR_INSTALLER_SKIPPED', -1);
define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2);

/**
 * Administration class used to download anything from the internet (PEAR Packages,
 * static URLs, xml files)
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.0
 */
class PEAR_Downloader extends PEAR_Common
{
    /**
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;

    /**
     * Preferred Installation State (snapshot, devel, alpha, beta, stable)
     * @var string|null
     * @access private
     */
    var $_preferredState;

    /**
     * Options from command-line passed to Install.
     *
     * Recognized options:<br />
     *  - onlyreqdeps      : install all required dependencies as well
     *  - alldeps          : install all dependencies, including optional
     *  - installroot      : base relative path to install files in
     *  - force            : force a download even if warnings would prevent it
     *  - nocompress       : download uncompressed tarballs
     *  - configureoptions : additional configure options
     * @see PEAR_Command_Install
     * @access private
     * @var array
     */
    var $_options;

    /**
     * Downloaded Packages after a call to download().
     *
     * Format of each entry:
     *
     * <code>
     * array('pkg' => 'package_name', 'file' => '/path/to/local/file',
     *    'info' => array() // parsed package.xml
     * );
     * </code>
     * @access private
     * @var array
     */
    var $_downloadedPackages = array();

    /**
     * Packages slated for download.
     *
     * This is used to prevent downloading a package more than once should it be a dependency
     * for two packages to be installed.
     * Format of each entry:
     *
     * <pre>
     * array('package_name1' => parsed package.xml, 'package_name2' => parsed package.xml,
     * );
     * </pre>
     * @access private
     * @var array
     */
    var $_toDownload = array();

    /**
     * Array of every package installed, with names lower-cased.
     *
     * Format:
     * <code>
     * array('package1' => 0, 'package2' => 1, );
     * </code>
     * @var array
     */
    var $_installed = array();

    /**
     * @var array
     * @access private
     */
    var $_errorStack = array();

    /**
     * @var boolean
     * @access private
     */
    var $_internalDownload = false;

    /**
     * Temporary variable used in sorting packages by dependency in {@link sortPkgDeps()}
     * @var array
     * @access private
     */
    var $_packageSortTree;

    /**
     * Temporary directory, or configuration value where downloads will occur
     * @var string
     */
    var $_downloadDir;

    /**
     * List of methods that can be called both statically and non-statically.
     * @var array
     */
    protected static $bivalentMethods = array(
        'setErrorHandling' => true,
        'raiseError' => true,
        'throwError' => true,
        'pushErrorHandling' => true,
        'popErrorHandling' => true,
        'downloadHttp' => true,
    );

    /**
     * @param PEAR_Frontend_*
     * @param array
     * @param PEAR_Config
     */
    function __construct($ui = null, $options = array(), $config = null)
    {
        parent::__construct();
        $this->_options = $options;
        if ($config !== null) {
            $this->config = &$config;
            $this->_preferredState = $this->config->get('preferred_state');
        }
        $this->ui = &$ui;
        if (!$this->_preferredState) {
            // don't inadvertently use a non-set preferred_state
            $this->_preferredState = null;
        }

        if ($config !== null) {
            if (isset($this->_options['installroot'])) {
                $this->config->setInstallRoot($this->_options['installroot']);
            }
            $this->_registry = &$config->getRegistry();
        }

        if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) {
            $this->_installed = $this->_registry->listAllPackages();
            foreach ($this->_installed as $key => $unused) {
                if (!count($unused)) {
                    continue;
                }
                $strtolower = function($a) { return strtolower($a); };
                array_walk($this->_installed[$key], $strtolower);
            }
        }
    }

    /**
     * Attempt to discover a channel's remote capabilities from
     * its server name
     * @param string
     * @return boolean
     */
    function discover($channel)
    {
        $this->log(1, 'Attempting to discover channel "' . $channel . '"...');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $callback = $this->ui ? array(&$this, '_downloadCallback') : null;
        if (!class_exists('System')) {
            require_once 'System.php';
        }

        $tmpdir = $this->config->get('temp_dir');
        $tmp = System::mktemp('-d -t "' . $tmpdir . '"');
        $a   = $this->downloadHttp('http://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false);
        PEAR::popErrorHandling();
        if (PEAR::isError($a)) {
            // Attempt to fallback to https automatically.
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $this->log(1, 'Attempting fallback to https instead of http on channel "' . $channel . '"...');
            $a = $this->downloadHttp('https://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false);
            PEAR::popErrorHandling();
            if (PEAR::isError($a)) {
                return false;
            }
        }

        list($a, $lastmodified) = $a;
        if (!class_exists('PEAR_ChannelFile')) {
            require_once 'PEAR/ChannelFile.php';
        }

        $b = new PEAR_ChannelFile;
        if ($b->fromXmlFile($a)) {
            unlink($a);
            if ($this->config->get('auto_discover')) {
                $this->_registry->addChannel($b, $lastmodified);
                $alias = $b->getName();
                if ($b->getName() == $this->_registry->channelName($b->getAlias())) {
                    $alias = $b->getAlias();
                }

                $this->log(1, 'Auto-discovered channel "' . $channel .
                    '", alias "' . $alias . '", adding to registry');
            }

            return true;
        }

        unlink($a);
        return false;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Downloader
     * @return PEAR_Downloader_Package
     */
    function newDownloaderPackage(&$t)
    {
        if (!class_exists('PEAR_Downloader_Package')) {
            require_once 'PEAR/Downloader/Package.php';
        }
        $a = new PEAR_Downloader_Package($t);
        return $a;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Config
     * @param array
     * @param array
     * @param int
     */
    function &getDependency2Object(&$c, $i, $p, $s)
    {
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }
        $z = new PEAR_Dependency2($c, $i, $p, $s);
        return $z;
    }

    function &download($params)
    {
        if (!count($params)) {
            $a = array();
            return $a;
        }

        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        $channelschecked = array();
        // convert all parameters into PEAR_Downloader_Package objects
        foreach ($params as $i => $param) {
            $params[$i] = $this->newDownloaderPackage($this);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = $params[$i]->initialize($param);
            PEAR::staticPopErrorHandling();
            if (!$err) {
                // skip parameters that were missed by preferred_state
                continue;
            }

            if (PEAR::isError($err)) {
                if (!isset($this->_options['soft']) && $err->getMessage() !== '') {
                    $this->log(0, $err->getMessage());
                }

                $params[$i] = false;
                if (is_object($param)) {
                    $param = $param->getChannel() . '/' . $param->getPackage();
                }

                if (!isset($this->_options['soft'])) {
                    $this->log(2, 'Package "' . $param . '" is not valid');
                }

                // Message logged above in a specific verbose mode, passing null to not show up on CLI
                $this->pushError(null, PEAR_INSTALLER_SKIPPED);
            } else {
                do {
                    if ($params[$i] && $params[$i]->getType() == 'local') {
                        // bug #7090 skip channel.xml check for local packages
                        break;
                    }

                    if ($params[$i] && !isset($channelschecked[$params[$i]->getChannel()]) &&
                          !isset($this->_options['offline'])
                    ) {
                        $channelschecked[$params[$i]->getChannel()] = true;
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        if (!class_exists('System')) {
                            require_once 'System.php';
                        }

                        $curchannel = $this->_registry->getChannel($params[$i]->getChannel());
                        if (PEAR::isError($curchannel)) {
                            PEAR::staticPopErrorHandling();
                            return $this->raiseError($curchannel);
                        }

                        if (PEAR::isError($dir = $this->getDownloadDir())) {
                            PEAR::staticPopErrorHandling();
                            break;
                        }

                        $mirror = $this->config->get('preferred_mirror', null, $params[$i]->getChannel());
                        $url    = 'http://' . $mirror . '/channel.xml';
                        $a = $this->downloadHttp($url, $this->ui, $dir, null, $curchannel->lastModified());

                        PEAR::staticPopErrorHandling();
                        if ($a === false) {
                            //channel.xml not modified
                            break;
                        } else if (PEAR::isError($a)) {
                            // Attempt fallback to https automatically
                            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                            $a = $this->downloadHttp('https://' . $mirror .
                                '/channel.xml', $this->ui, $dir, null, $curchannel->lastModified());

                            PEAR::staticPopErrorHandling();
                            if (PEAR::isError($a) || !$a) {
                                break;
                            }
                        }
                        $this->log(0, 'WARNING: channel "' . $params[$i]->getChannel() . '" has ' .
                            'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $params[$i]->getChannel() .
                            '" to update');
                    }
                } while (false);

                if ($params[$i] && !isset($this->_options['downloadonly'])) {
                    if (isset($this->_options['packagingroot'])) {
                        $checkdir = $this->_prependPath(
                            $this->config->get('php_dir', null, $params[$i]->getChannel()),
                            $this->_options['packagingroot']);
                    } else {
                        $checkdir = $this->config->get('php_dir',
                            null, $params[$i]->getChannel());
                    }

                    while ($checkdir && $checkdir != '/' && !file_exists($checkdir)) {
                        $checkdir = dirname($checkdir);
                    }

                    if ($checkdir == '.') {
                        $checkdir = '/';
                    }

                    if (!is_writeable($checkdir)) {
                        return PEAR::raiseError('Cannot install, php_dir for channel "' .
                            $params[$i]->getChannel() . '" is not writeable by the current user');
                    }
                }
            }
        }

        unset($channelschecked);
        PEAR_Downloader_Package::removeDuplicates($params);
        if (!count($params)) {
            $a = array();
            return $a;
        }

        if (!isset($this->_options['nodeps']) && !isset($this->_options['offline'])) {
            $reverify = true;
            while ($reverify) {
                $reverify = false;
                foreach ($params as $i => $param) {
                    //PHP Bug 40768 / PEAR Bug #10944
                    //Nested foreaches fail in PHP 5.2.1
                    key($params);
                    $ret = $params[$i]->detectDependencies($params);
                    if (PEAR::isError($ret)) {
                        $reverify = true;
                        $params[$i] = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $ret->getMessage());
                        }
                        continue 2;
                    }
                }
            }
        }

        if (isset($this->_options['offline'])) {
            $this->log(3, 'Skipping dependency download check, --offline specified');
        }

        if (!count($params)) {
            $a = array();
            return $a;
        }

        while (PEAR_Downloader_Package::mergeDependencies($params));
        PEAR_Downloader_Package::removeDuplicates($params, true);
        $errorparams = array();
        if (PEAR_Downloader_Package::detectStupidDuplicates($params, $errorparams)) {
            if (count($errorparams)) {
                foreach ($errorparams as $param) {
                    $name = $this->_registry->parsedPackageNameToString($param->getParsedPackage());
                    $this->pushError('Duplicate package ' . $name . ' found', PEAR_INSTALLER_FAILED);
                }
                $a = array();
                return $a;
            }
        }

        PEAR_Downloader_Package::removeInstalled($params);
        if (!count($params)) {
            $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED);
            $a = array();
            return $a;
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->analyzeDependencies($params);
        PEAR::popErrorHandling();
        if (!count($params)) {
            $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED);
            $a = array();
            return $a;
        }

        $ret = array();
        $newparams = array();
        if (isset($this->_options['pretend'])) {
            return $params;
        }

        $somefailed = false;
        foreach ($params as $i => $package) {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $pf = &$params[$i]->download();
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($pf)) {
                if (!isset($this->_options['soft'])) {
                    $this->log(1, $pf->getMessage());
                    $this->log(0, 'Error: cannot download "' .
                        $this->_registry->parsedPackageNameToString($package->getParsedPackage(),
                            true) .
                        '"');
                }
                $somefailed = true;
                continue;
            }

            $newparams[] = &$params[$i];
            $ret[] = array(
                'file' => $pf->getArchiveFile(),
                'info' => &$pf,
                'pkg'  => $pf->getPackage()
            );
        }

        if ($somefailed) {
            // remove params that did not download successfully
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->analyzeDependencies($newparams, true);
            PEAR::popErrorHandling();
            if (!count($newparams)) {
                $this->pushError('Download failed', PEAR_INSTALLER_FAILED);
                $a = array();
                return $a;
            }
        }

        $this->_downloadedPackages = $ret;
        return $newparams;
    }

    /**
     * @param array all packages to be installed
     */
    function analyzeDependencies(&$params, $force = false)
    {
        if (isset($this->_options['downloadonly'])) {
            return;
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $redo  = true;
        $reset = $hasfailed = $failed = false;
        while ($redo) {
            $redo = false;
            foreach ($params as $i => $param) {
                $deps = $param->getDeps();
                if (!$deps) {
                    $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(),
                        $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
                    $send = $param->getPackageFile();

                    $installcheck = $depchecker->validatePackage($send, $this, $params);
                    if (PEAR::isError($installcheck)) {
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $installcheck->getMessage());
                        }
                        $hasfailed  = true;
                        $params[$i] = false;
                        $reset      = true;
                        $redo       = true;
                        $failed     = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        continue 2;
                    }
                    continue;
                }

                if (!$reset && $param->alreadyValidated() && !$force) {
                    continue;
                }

                if (count($deps)) {
                    $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(),
                        $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
                    $send = $param->getPackageFile();
                    if ($send === null) {
                        $send = $param->getDownloadURL();
                    }

                    $installcheck = $depchecker->validatePackage($send, $this, $params);
                    if (PEAR::isError($installcheck)) {
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $installcheck->getMessage());
                        }
                        $hasfailed  = true;
                        $params[$i] = false;
                        $reset      = true;
                        $redo       = true;
                        $failed     = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        continue 2;
                    }

                    $failed = false;
                    if (isset($deps['required']) && is_array($deps['required'])) {
                        foreach ($deps['required'] as $type => $dep) {
                            // note: Dependency2 will never return a PEAR_Error if ignore-errors
                            // is specified, so soft is needed to turn off logging
                            if (!isset($dep[0])) {
                                if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep,
                                      true, $params))) {
                                    $failed = true;
                                    if (!isset($this->_options['soft'])) {
                                        $this->log(0, $e->getMessage());
                                    }
                                } elseif (is_array($e) && !$param->alreadyValidated()) {
                                    if (!isset($this->_options['soft'])) {
                                        $this->log(0, $e[0]);
                                    }
                                }
                            } else {
                                foreach ($dep as $d) {
                                    if (PEAR::isError($e =
                                          $depchecker->{"validate{$type}Dependency"}($d,
                                          true, $params))) {
                                        $failed = true;
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e->getMessage());
                                        }
                                    } elseif (is_array($e) && !$param->alreadyValidated()) {
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e[0]);
                                        }
                                    }
                                }
                            }
                        }

                        if (isset($deps['optional']) && is_array($deps['optional'])) {
                            foreach ($deps['optional'] as $type => $dep) {
                                if (!isset($dep[0])) {
                                    if (PEAR::isError($e =
                                          $depchecker->{"validate{$type}Dependency"}($dep,
                                          false, $params))) {
                                        $failed = true;
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e->getMessage());
                                        }
                                    } elseif (is_array($e) && !$param->alreadyValidated()) {
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e[0]);
                                        }
                                    }
                                } else {
                                    foreach ($dep as $d) {
                                        if (PEAR::isError($e =
                                              $depchecker->{"validate{$type}Dependency"}($d,
                                              false, $params))) {
                                            $failed = true;
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e->getMessage());
                                            }
                                        } elseif (is_array($e) && !$param->alreadyValidated()) {
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e[0]);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        $groupname = $param->getGroup();
                        if (isset($deps['group']) && $groupname) {
                            if (!isset($deps['group'][0])) {
                                $deps['group'] = array($deps['group']);
                            }

                            $found = false;
                            foreach ($deps['group'] as $group) {
                                if ($group['attribs']['name'] == $groupname) {
                                    $found = true;
                                    break;
                                }
                            }

                            if ($found) {
                                unset($group['attribs']);
                                foreach ($group as $type => $dep) {
                                    if (!isset($dep[0])) {
                                        if (PEAR::isError($e =
                                              $depchecker->{"validate{$type}Dependency"}($dep,
                                              false, $params))) {
                                            $failed = true;
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e->getMessage());
                                            }
                                        } elseif (is_array($e) && !$param->alreadyValidated()) {
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e[0]);
                                            }
                                        }
                                    } else {
                                        foreach ($dep as $d) {
                                            if (PEAR::isError($e =
                                                  $depchecker->{"validate{$type}Dependency"}($d,
                                                  false, $params))) {
                                                $failed = true;
                                                if (!isset($this->_options['soft'])) {
                                                    $this->log(0, $e->getMessage());
                                                }
                                            } elseif (is_array($e) && !$param->alreadyValidated()) {
                                                if (!isset($this->_options['soft'])) {
                                                    $this->log(0, $e[0]);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    } else {
                        foreach ($deps as $dep) {
                            if (PEAR::isError($e = $depchecker->validateDependency1($dep, $params))) {
                                $failed = true;
                                if (!isset($this->_options['soft'])) {
                                    $this->log(0, $e->getMessage());
                                }
                            } elseif (is_array($e) && !$param->alreadyValidated()) {
                                if (!isset($this->_options['soft'])) {
                                    $this->log(0, $e[0]);
                                }
                            }
                        }
                    }
                    $params[$i]->setValidated();
                }

                if ($failed) {
                    $hasfailed  = true;
                    $params[$i] = false;
                    $reset      = true;
                    $redo       = true;
                    $failed     = false;
                    PEAR_Downloader_Package::removeDuplicates($params);
                    continue 2;
                }
            }
        }

        PEAR::staticPopErrorHandling();
        if ($hasfailed && (isset($this->_options['ignore-errors']) ||
              isset($this->_options['nodeps']))) {
            // this is probably not needed, but just in case
            if (!isset($this->_options['soft'])) {
                $this->log(0, 'WARNING: dependencies failed');
            }
        }
    }

    /**
     * Retrieve the directory that downloads will happen in
     * @access private
     * @return string
     */
    function getDownloadDir()
    {
        if (isset($this->_downloadDir)) {
            return $this->_downloadDir;
        }

        $downloaddir = $this->config->get('download_dir');
        if (empty($downloaddir) || (is_dir($downloaddir) && !is_writable($downloaddir))) {
            if  (is_dir($downloaddir) && !is_writable($downloaddir)) {
                $this->log(0, 'WARNING: configuration download directory "' . $downloaddir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir to avoid this warning');
            }

            if (!class_exists('System')) {
                require_once 'System.php';
            }

            if (PEAR::isError($downloaddir = System::mktemp('-d'))) {
                return $downloaddir;
            }
            $this->log(3, '+ tmp dir created at ' . $downloaddir);
        }

        if (!is_writable($downloaddir)) {
            if (PEAR::isError(System::mkdir(array('-p', $downloaddir))) ||
                  !is_writable($downloaddir)) {
                return PEAR::raiseError('download directory "' . $downloaddir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir');
            }
        }

        return $this->_downloadDir = $downloaddir;
    }

    function setDownloadDir($dir)
    {
        if (!@is_writable($dir)) {
            if (PEAR::isError(System::mkdir(array('-p', $dir)))) {
                return PEAR::raiseError('download directory "' . $dir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir');
            }
        }
        $this->_downloadDir = $dir;
    }

    function configSet($key, $value, $layer = 'user', $channel = false)
    {
        $this->config->set($key, $value, $layer, $channel);
        $this->_preferredState = $this->config->get('preferred_state', null, $channel);
        if (!$this->_preferredState) {
            // don't inadvertently use a non-set preferred_state
            $this->_preferredState = null;
        }
    }

    function setOptions($options)
    {
        $this->_options = $options;
    }

    function getOptions()
    {
        return $this->_options;
    }


    /**
     * @param array output of {@link parsePackageName()}
     * @access private
     */
    function _getPackageDownloadUrl($parr)
    {
        $curchannel = $this->config->get('default_channel');
        $this->configSet('default_channel', $parr['channel']);
        // getDownloadURL returns an array.  On error, it only contains information
        // on the latest release as array(version, info).  On success it contains
        // array(version, info, download url string)
        $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state');
        if (!$this->_registry->channelExists($parr['channel'])) {
            do {
                if ($this->config->get('auto_discover') && $this->discover($parr['channel'])) {
                    break;
                }

                $this->configSet('default_channel', $curchannel);
                return PEAR::raiseError('Unknown remote channel: ' . $parr['channel']);
            } while (false);
        }

        $chan = $this->_registry->getChannel($parr['channel']);
        if (PEAR::isError($chan)) {
            return $chan;
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $version   = $this->_registry->packageInfo($parr['package'], 'version', $parr['channel']);
        $stability = $this->_registry->packageInfo($parr['package'], 'stability', $parr['channel']);
        // package is installed - use the installed release stability level
        if (!isset($parr['state']) && $stability !== null) {
            $state = $stability['release'];
        }
        PEAR::staticPopErrorHandling();
        $base2 = false;

        $preferred_mirror = $this->config->get('preferred_mirror');
        if (!$chan->supportsREST($preferred_mirror) ||
              (
               !($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror))
               &&
               !($base = $chan->getBaseURL('REST1.0', $preferred_mirror))
              )
        ) {
            return $this->raiseError($parr['channel'] . ' is using an unsupported protocol - This should never happen. Use --force to continue');
        }

        if ($base2) {
            $rest = &$this->config->getREST('1.3', $this->_options);
            $base = $base2;
        } else {
            $rest = &$this->config->getREST('1.0', $this->_options);
        }

        $downloadVersion = false;
        if (!isset($parr['version']) && !isset($parr['state']) && $version
              && !PEAR::isError($version)
              && !isset($this->_options['downloadonly'])
        ) {
            $downloadVersion = $version;
        }

        $url = $rest->getDownloadURL($base, $parr, $state, $downloadVersion, $chan->getName());
        if (PEAR::isError($url)) {
            $this->configSet('default_channel', $curchannel);
            return $url;
        }

        if ($parr['channel'] != $curchannel) {
            $this->configSet('default_channel', $curchannel);
        }

        if (!is_array($url)) {
            return $url;
        }

        $url['raw'] = false; // no checking is necessary for REST
        if (!is_array($url['info'])) {
            return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' .
                'this should never happen');
        }

        if (!isset($this->_options['force']) &&
              !isset($this->_options['downloadonly']) &&
              $version &&
              !PEAR::isError($version) &&
              !isset($parr['group'])
        ) {
            if (version_compare($version, $url['version'], '=')) {
                return PEAR::raiseError($this->_registry->parsedPackageNameToString(
                    $parr, true) . ' is already installed and is the same as the ' .
                    'released version ' . $url['version'], -976);
            }

            if (version_compare($version, $url['version'], '>')) {
                return PEAR::raiseError($this->_registry->parsedPackageNameToString(
                    $parr, true) . ' is already installed and is newer than detected ' .
                    'released version ' . $url['version'], -976);
            }
        }

        if (isset($url['info']['required']) || $url['compatible']) {
            require_once 'PEAR/PackageFile/v2.php';
            $pf = new PEAR_PackageFile_v2;
            $pf->setRawChannel($parr['channel']);
            if ($url['compatible']) {
                $pf->setRawCompatible($url['compatible']);
            }
        } else {
            require_once 'PEAR/PackageFile/v1.php';
            $pf = new PEAR_PackageFile_v1;
        }

        $pf->setRawPackage($url['package']);
        $pf->setDeps($url['info']);
        if ($url['compatible']) {
            $pf->setCompatible($url['compatible']);
        }

        $pf->setRawState($url['stability']);
        $url['info'] = &$pf;
        if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {
            $ext = '.tar';
        } else {
            $ext = '.tgz';
        }

        if (is_array($url) && isset($url['url'])) {
            $url['url'] .= $ext;
        }

        return $url;
    }

    /**
     * @param array dependency array
     * @access private
     */
    function _getDepPackageDownloadUrl($dep, $parr)
    {
        $xsdversion = isset($dep['rel']) ? '1.0' : '2.0';
        $curchannel = $this->config->get('default_channel');
        if (isset($dep['uri'])) {
            $xsdversion = '2.0';
            $chan = $this->_registry->getChannel('__uri');
            if (PEAR::isError($chan)) {
                return $chan;
            }

            $version = $this->_registry->packageInfo($dep['name'], 'version', '__uri');
            $this->configSet('default_channel', '__uri');
        } else {
            if (isset($dep['channel'])) {
                $remotechannel = $dep['channel'];
            } else {
                $remotechannel = 'pear.php.net';
            }

            if (!$this->_registry->channelExists($remotechannel)) {
                do {
                    if ($this->config->get('auto_discover')) {
                        if ($this->discover($remotechannel)) {
                            break;
                        }
                    }
                    return PEAR::raiseError('Unknown remote channel: ' . $remotechannel);
                } while (false);
            }

            $chan = $this->_registry->getChannel($remotechannel);
            if (PEAR::isError($chan)) {
                return $chan;
            }

            $version = $this->_registry->packageInfo($dep['name'], 'version', $remotechannel);
            $this->configSet('default_channel', $remotechannel);
        }

        $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state');
        if (isset($parr['state']) && isset($parr['version'])) {
            unset($parr['state']);
        }

        if (isset($dep['uri'])) {
            $info = $this->newDownloaderPackage($this);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = $info->initialize($dep);
            PEAR::staticPopErrorHandling();
            if (!$err) {
                // skip parameters that were missed by preferred_state
                return PEAR::raiseError('Cannot initialize dependency');
            }

            if (PEAR::isError($err)) {
                if (!isset($this->_options['soft'])) {
                    $this->log(0, $err->getMessage());
                }

                if (is_object($info)) {
                    $param = $info->getChannel() . '/' . $info->getPackage();
                }
                return PEAR::raiseError('Package "' . $param . '" is not valid');
            }
            return $info;
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror'))
              &&
                (
                  ($base2 = $chan->getBaseURL('REST1.3', $this->config->get('preferred_mirror')))
                    ||
                  ($base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror')))
                )
        ) {
            if ($base2) {
                $base = $base2;
                $rest = &$this->config->getREST('1.3', $this->_options);
            } else {
                $rest = &$this->config->getREST('1.0', $this->_options);
            }

            $url = $rest->getDepDownloadURL($base, $xsdversion, $dep, $parr,
                    $state, $version, $chan->getName());
            if (PEAR::isError($url)) {
                return $url;
            }

            if ($parr['channel'] != $curchannel) {
                $this->configSet('default_channel', $curchannel);
            }

            if (!is_array($url)) {
                return $url;
            }

            $url['raw'] = false; // no checking is necessary for REST
            if (!is_array($url['info'])) {
                return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' .
                    'this should never happen');
            }

            if (isset($url['info']['required'])) {
                if (!class_exists('PEAR_PackageFile_v2')) {
                    require_once 'PEAR/PackageFile/v2.php';
                }
                $pf = new PEAR_PackageFile_v2;
                $pf->setRawChannel($remotechannel);
            } else {
                if (!class_exists('PEAR_PackageFile_v1')) {
                    require_once 'PEAR/PackageFile/v1.php';
                }
                $pf = new PEAR_PackageFile_v1;

            }
            $pf->setRawPackage($url['package']);
            $pf->setDeps($url['info']);
            if ($url['compatible']) {
                $pf->setCompatible($url['compatible']);
            }

            $pf->setRawState($url['stability']);
            $url['info'] = &$pf;
            if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {
                $ext = '.tar';
            } else {
                $ext = '.tgz';
            }

            if (is_array($url) && isset($url['url'])) {
                $url['url'] .= $ext;
            }

            return $url;
        }

        return $this->raiseError($parr['channel'] . ' is using a unsupported protocol - This should never happen.');
    }

    /**
     * @deprecated in favor of _getPackageDownloadUrl
     */
    function getPackageDownloadUrl($package, $version = null, $channel = false)
    {
        if ($version) {
            $package .= "-$version";
        }
        if ($this === null || $this->_registry === null) {
            $package = "http://pear.php.net/get/$package";
        } else {
            $chan = $this->_registry->getChannel($channel);
            if (PEAR::isError($chan)) {
                return '';
            }
            $package = "http://" . $chan->getServer() . "/get/$package";
        }
        if (!extension_loaded("zlib")) {
            $package .= '?uncompress=yes';
        }
        return $package;
    }

    /**
     * Retrieve a list of downloaded packages after a call to {@link download()}.
     *
     * Also resets the list of downloaded packages.
     * @return array
     */
    function getDownloadedPackages()
    {
        $ret = $this->_downloadedPackages;
        $this->_downloadedPackages = array();
        $this->_toDownload = array();
        return $ret;
    }

    function _downloadCallback($msg, $params = null)
    {
        switch ($msg) {
            case 'saveas':
                $this->log(1, "downloading $params ...");
                break;
            case 'done':
                $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes');
                break;
            case 'bytesread':
                static $bytes;
                if (empty($bytes)) {
                    $bytes = 0;
                }
                if (!($bytes % 10240)) {
                    $this->log(1, '.', false);
                }
                $bytes += $params;
                break;
            case 'start':
                if($params[1] == -1) {
                    $length = "Unknown size";
                } else {
                    $length = number_format($params[1], 0, '', ',')." bytes";
                }
                $this->log(1, "Starting to download {$params[0]} ($length)");
                break;
        }
        if (method_exists($this->ui, '_downloadCallback'))
            $this->ui->_downloadCallback($msg, $params);
    }

    function _prependPath($path, $prepend)
    {
        if (strlen($prepend) > 0) {
            if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) {
                if (preg_match('/^[a-z]:/i', $prepend)) {
                    $prepend = substr($prepend, 2);
                } elseif ($prepend[0] != '\\') {
                    $prepend = "\\$prepend";
                }
                $path = substr($path, 0, 2) . $prepend . substr($path, 2);
            } else {
                $path = $prepend . $path;
            }
        }
        return $path;
    }

    /**
     * @param string
     * @param integer
     */
    function pushError($errmsg, $code = -1)
    {
        array_push($this->_errorStack, array($errmsg, $code));
    }

    function getErrorMsgs()
    {
        $msgs = array();
        $errs = $this->_errorStack;
        foreach ($errs as $err) {
            $msgs[] = $err[0];
        }
        $this->_errorStack = array();
        return $msgs;
    }

    /**
     * for BC
     *
     * @deprecated
     */
    function sortPkgDeps(&$packages, $uninstall = false)
    {
        $uninstall ?
            $this->sortPackagesForUninstall($packages) :
            $this->sortPackagesForInstall($packages);
    }

    /**
     * Sort a list of arrays of array(downloaded packagefilename) by dependency.
     *
     * This uses the topological sort method from graph theory, and the
     * Structures_Graph package to properly sort dependencies for installation.
     * @param array an array of downloaded PEAR_Downloader_Packages
     * @return array array of array(packagefilename, package.xml contents)
     */
    function sortPackagesForInstall(&$packages)
    {
        require_once 'Structures/Graph.php';
        require_once 'Structures/Graph/Node.php';
        require_once 'Structures/Graph/Manipulator/TopologicalSorter.php';
        $depgraph = new Structures_Graph(true);
        $nodes = array();
        $reg = &$this->config->getRegistry();
        foreach ($packages as $i => $package) {
            $pname = $reg->parsedPackageNameToString(
                array(
                    'channel' => $package->getChannel(),
                    'package' => strtolower($package->getPackage()),
                ));
            $nodes[$pname] = new Structures_Graph_Node;
            $nodes[$pname]->setData($packages[$i]);
            $depgraph->addNode($nodes[$pname]);
        }

        $deplinks = array();
        foreach ($nodes as $package => $node) {
            $pf = &$node->getData();
            $pdeps = $pf->getDeps(true);
            if (!$pdeps) {
                continue;
            }

            if ($pf->getPackagexmlVersion() == '1.0') {
                foreach ($pdeps as $dep) {
                    if ($dep['type'] != 'pkg' ||
                          (isset($dep['optional']) && $dep['optional'] == 'yes')) {
                        continue;
                    }

                    $dname = $reg->parsedPackageNameToString(
                          array(
                              'channel' => 'pear.php.net',
                              'package' => strtolower($dep['name']),
                          ));

                    if (isset($nodes[$dname])) {
                        if (!isset($deplinks[$dname])) {
                            $deplinks[$dname] = array();
                        }

                        $deplinks[$dname][$package] = 1;
                        // dependency is in installed packages
                        continue;
                    }

                    $dname = $reg->parsedPackageNameToString(
                          array(
                              'channel' => 'pecl.php.net',
                              'package' => strtolower($dep['name']),
                          ));

                    if (isset($nodes[$dname])) {
                        if (!isset($deplinks[$dname])) {
                            $deplinks[$dname] = array();
                        }

                        $deplinks[$dname][$package] = 1;
                        // dependency is in installed packages
                        continue;
                    }
                }
            } else {
                // the only ordering we care about is:
                // 1) subpackages must be installed before packages that depend on them
                // 2) required deps must be installed before packages that depend on them
                if (isset($pdeps['required']['subpackage'])) {
                    $t = $pdeps['required']['subpackage'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['group'])) {
                    if (!isset($pdeps['group'][0])) {
                        $pdeps['group'] = array($pdeps['group']);
                    }

                    foreach ($pdeps['group'] as $group) {
                        if (isset($group['subpackage'])) {
                            $t = $group['subpackage'];
                            if (!isset($t[0])) {
                                $t = array($t);
                            }

                            $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                        }
                    }
                }

                if (isset($pdeps['optional']['subpackage'])) {
                    $t = $pdeps['optional']['subpackage'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['required']['package'])) {
                    $t = $pdeps['required']['package'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['group'])) {
                    if (!isset($pdeps['group'][0])) {
                        $pdeps['group'] = array($pdeps['group']);
                    }

                    foreach ($pdeps['group'] as $group) {
                        if (isset($group['package'])) {
                            $t = $group['package'];
                            if (!isset($t[0])) {
                                $t = array($t);
                            }

                            $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                        }
                    }
                }
            }
        }

        $this->_detectDepCycle($deplinks);
        foreach ($deplinks as $dependent => $parents) {
            foreach ($parents as $parent => $unused) {
                $nodes[$dependent]->connectTo($nodes[$parent]);
            }
        }

        $installOrder = Structures_Graph_Manipulator_TopologicalSorter::sort($depgraph);
        $ret = array();
        for ($i = 0, $count = count($installOrder); $i < $count; $i++) {
            foreach ($installOrder[$i] as $index => $sortedpackage) {
                $data = &$installOrder[$i][$index]->getData();
                $ret[] = &$nodes[$reg->parsedPackageNameToString(
                          array(
                              'channel' => $data->getChannel(),
                              'package' => strtolower($data->getPackage()),
                          ))]->getData();
            }
        }

        $packages = $ret;
        return;
    }

    /**
     * Detect recursive links between dependencies and break the cycles
     *
     * @param array
     * @access private
     */
    function _detectDepCycle(&$deplinks)
    {
        do {
            $keepgoing = false;
            foreach ($deplinks as $dep => $parents) {
                foreach ($parents as $parent => $unused) {
                    // reset the parent cycle detector
                    $this->_testCycle(null, null, null);
                    if ($this->_testCycle($dep, $deplinks, $parent)) {
                        $keepgoing = true;
                        unset($deplinks[$dep][$parent]);
                        if (count($deplinks[$dep]) == 0) {
                            unset($deplinks[$dep]);
                        }

                        continue 3;
                    }
                }
            }
        } while ($keepgoing);
    }

    function _testCycle($test, $deplinks, $dep)
    {
        static $visited = array();
        if ($test === null) {
            $visited = array();
            return;
        }

        // this happens when a parent has a dep cycle on another dependency
        // but the child is not part of the cycle
        if (isset($visited[$dep])) {
            return false;
        }

        $visited[$dep] = 1;
        if ($test == $dep) {
            return true;
        }

        if (isset($deplinks[$dep])) {
            if (in_array($test, array_keys($deplinks[$dep]), true)) {
                return true;
            }

            foreach ($deplinks[$dep] as $parent => $unused) {
                if ($this->_testCycle($test, $deplinks, $parent)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Set up the dependency for installation parsing
     *
     * @param array $t dependency information
     * @param PEAR_Registry $reg
     * @param array $deplinks list of dependency links already established
     * @param array $nodes all existing package nodes
     * @param string $package parent package name
     * @access private
     */
    function _setupGraph($t, $reg, &$deplinks, &$nodes, $package)
    {
        foreach ($t as $dep) {
            $depchannel = !isset($dep['channel']) ? '__uri': $dep['channel'];
            $dname = $reg->parsedPackageNameToString(
                  array(
                      'channel' => $depchannel,
                      'package' => strtolower($dep['name']),
                  ));

            if (isset($nodes[$dname])) {
                if (!isset($deplinks[$dname])) {
                    $deplinks[$dname] = array();
                }
                $deplinks[$dname][$package] = 1;
            }
        }
    }

    function _dependsOn($a, $b)
    {
        return $this->_checkDepTree(strtolower($a->getChannel()), strtolower($a->getPackage()), $b);
    }

    function _checkDepTree($channel, $package, $b, $checked = array())
    {
        $checked[$channel][$package] = true;
        if (!isset($this->_depTree[$channel][$package])) {
            return false;
        }

        if (isset($this->_depTree[$channel][$package][strtolower($b->getChannel())]
              [strtolower($b->getPackage())])) {
            return true;
        }

        foreach ($this->_depTree[$channel][$package] as $ch => $packages) {
            foreach ($packages as $pa => $true) {
                if ($this->_checkDepTree($ch, $pa, $b, $checked)) {
                    return true;
                }
            }
        }

        return false;
    }

    function _sortInstall($a, $b)
    {
        if (!$a->getDeps() && !$b->getDeps()) {
            return 0; // neither package has dependencies, order is insignificant
        }
        if ($a->getDeps() && !$b->getDeps()) {
            return 1; // $a must be installed after $b because $a has dependencies
        }
        if (!$a->getDeps() && $b->getDeps()) {
            return -1; // $b must be installed after $a because $b has dependencies
        }
        // both packages have dependencies
        if ($this->_dependsOn($a, $b)) {
            return 1;
        }
        if ($this->_dependsOn($b, $a)) {
            return -1;
        }
        return 0;
    }

    /**
     * Download a file through HTTP.  Considers suggested file name in
     * Content-disposition: header and can run a callback function for
     * different events.  The callback will be called with two
     * parameters: the callback type, and parameters.  The implemented
     * callback types are:
     *
     *  'setup'       called at the very beginning, parameter is a UI object
     *                that should be used for all output
     *  'message'     the parameter is a string with an informational message
     *  'saveas'      may be used to save with a different file name, the
     *                parameter is the filename that is about to be used.
     *                If a 'saveas' callback returns a non-empty string,
     *                that file name will be used as the filename instead.
     *                Note that $save_dir will not be affected by this, only
     *                the basename of the file.
     *  'start'       download is starting, parameter is number of bytes
     *                that are expected, or -1 if unknown
     *  'bytesread'   parameter is the number of bytes read so far
     *  'done'        download is complete, parameter is the total number
     *                of bytes read
     *  'connfailed'  if the TCP/SSL connection fails, this callback is called
     *                with array(host,port,errno,errmsg)
     *  'writefailed' if writing to disk fails, this callback is called
     *                with array(destfile,errmsg)
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param object  $ui        PEAR_Frontend_* instance
     * @param object  $config    PEAR_Config instance
     * @param string  $save_dir  directory to save file in
     * @param mixed   $callback  function/method to call for status
     *                           updates
     * @param false|string|array $lastmodified header values to check against for caching
     *                           use false to return the header values from this download
     * @param false|array $accept Accept headers to send
     * @param false|string $channel Channel to use for retrieving authentication
     * @return mixed  Returns the full path of the downloaded file or a PEAR
     *                error on failure.  If the error is caused by
     *                socket-related errors, the error object will
     *                have the fsockopen error code available through
     *                getCode().  If caching is requested, then return the header
     *                values.
     *                If $lastmodified was given and the there are no changes,
     *                boolean false is returned.
     *
     * @access public
     */
    public static function _downloadHttp(
        $object, $url, &$ui, $save_dir = '.', $callback = null, $lastmodified = null,
        $accept = false, $channel = false
    ) {
        static $redirect = 0;
        // always reset , so we are clean case of error
        $wasredirect = $redirect;
        $redirect = 0;
        if ($callback) {
            call_user_func($callback, 'setup', array(&$ui));
        }

        $info = parse_url($url);
        if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) {
            return PEAR::raiseError('Cannot download non-http URL "' . $url . '"');
        }

        if (!isset($info['host'])) {
            return PEAR::raiseError('Cannot download from non-URL "' . $url . '"');
        }

        $host = isset($info['host']) ? $info['host'] : null;
        $port = isset($info['port']) ? $info['port'] : null;
        $path = isset($info['path']) ? $info['path'] : null;

        if ($object !== null) {
            $config = $object->config;
        } else {
            $config = &PEAR_Config::singleton();
        }

        $proxy = new PEAR_Proxy($config);

        if ($proxy->isProxyConfigured() && $callback) {
            call_user_func($callback, 'message', "Using HTTP proxy $host:$port");
        }

        if (empty($port)) {
            $port = (isset($info['scheme']) && $info['scheme'] == 'https') ? 443 : 80;
        }

        $scheme = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http';
        $secure = ($scheme == 'https');

        $fp = $proxy->openSocket($host, $port, $secure);
        if (PEAR::isError($fp)) {
            if ($callback) {
                $errno = $fp->getCode();
                $errstr = $fp->getMessage();
                call_user_func($callback, 'connfailed', array($host, $port,
                                                              $errno, $errstr));
            }
            return $fp;
        }

        $requestPath = $path;
        if ($proxy->isProxyConfigured()) {
            $requestPath = $url;
        }

        if ($lastmodified === false || $lastmodified) {
            $request  = "GET $requestPath HTTP/1.1\r\n";
        } else {
            $request  = "GET $requestPath HTTP/1.0\r\n";
        }
        $request .= "Host: $host\r\n";

        $ifmodifiedsince = '';
        if (is_array($lastmodified)) {
            if (isset($lastmodified['Last-Modified'])) {
                $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n";
            }

            if (isset($lastmodified['ETag'])) {
                $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n";
            }
        } else {
            $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : '');
        }

        $request .= $ifmodifiedsince .
            "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n";

        if ($object !== null) { // only pass in authentication for non-static calls
            $username = $config->get('username', null, $channel);
            $password = $config->get('password', null, $channel);
            if ($username && $password) {
                $tmp = base64_encode("$username:$password");
                $request .= "Authorization: Basic $tmp\r\n";
            }
        }

        $proxyAuth = $proxy->getProxyAuth();
        if ($proxyAuth) {
            $request .= 'Proxy-Authorization: Basic ' .
                $proxyAuth . "\r\n";
        }

        if ($accept) {
            $request .= 'Accept: ' . implode(', ', $accept) . "\r\n";
        }

        $request .= "Connection: close\r\n";
        $request .= "\r\n";
        fwrite($fp, $request);
        $headers = array();
        $reply = 0;
        while (trim($line = fgets($fp, 1024))) {
            if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) {
                $headers[strtolower($matches[1])] = trim($matches[2]);
            } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $reply = (int)$matches[1];
                if ($reply == 304 && ($lastmodified || ($lastmodified === false))) {
                    return false;
                }

                if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) {
                    return PEAR::raiseError("File $scheme://$host:$port$path not valid (received: $line)");
                }
            }
        }

        if ($reply != 200) {
            if (!isset($headers['location'])) {
                return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirected but no location)");
            }

            if ($wasredirect > 4) {
                return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirection looped more than 5 times)");
            }

            $redirect = $wasredirect + 1;
            return static::_downloadHttp($object, $headers['location'],
                    $ui, $save_dir, $callback, $lastmodified, $accept);
        }

        if (isset($headers['content-disposition']) &&
            preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|\\z)/', $headers['content-disposition'], $matches)) {
            $save_as = basename($matches[1]);
        } else {
            $save_as = basename($url);
        }

        if ($callback) {
            $tmp = call_user_func($callback, 'saveas', $save_as);
            if ($tmp) {
                $save_as = $tmp;
            }
        }

        $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as;
        if (is_link($dest_file)) {
            return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $dest_file . ' as it is symlinked to ' . readlink($dest_file) . ' - Possible symlink attack');
        }

        if (!$wp = @fopen($dest_file, 'wb')) {
            fclose($fp);
            if ($callback) {
                call_user_func($callback, 'writefailed',
                    array($dest_file, error_get_last()["message"]));
            }
            return PEAR::raiseError("could not open $dest_file for writing");
        }

        $length = isset($headers['content-length']) ? $headers['content-length'] : -1;

        $bytes = 0;
        if ($callback) {
            call_user_func($callback, 'start', array(basename($dest_file), $length));
        }

        while ($data = fread($fp, 1024)) {
            $bytes += strlen($data);
            if ($callback) {
                call_user_func($callback, 'bytesread', $bytes);
            }
            if (!@fwrite($wp, $data)) {
                fclose($fp);
                if ($callback) {
                    call_user_func($callback, 'writefailed',
                        array($dest_file, error_get_last()["message"]));
                }
                return PEAR::raiseError(
                    "$dest_file: write failed (" . error_get_last()["message"] . ")");
            }
        }

        fclose($fp);
        fclose($wp);
        if ($callback) {
            call_user_func($callback, 'done', $bytes);
        }

        if ($lastmodified === false || $lastmodified) {
            if (isset($headers['etag'])) {
                $lastmodified = array('ETag' => $headers['etag']);
            }

            if (isset($headers['last-modified'])) {
                if (is_array($lastmodified)) {
                    $lastmodified['Last-Modified'] = $headers['last-modified'];
                } else {
                    $lastmodified = $headers['last-modified'];
                }
            }
            return array($dest_file, $lastmodified, $headers);
        }
        return $dest_file;
    }
}
pear/PEAR/Frontend.php000064400000014772151732710110010523 0ustar00<?php
/**
 * PEAR_Frontend, the singleton-based frontend for user input/output
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Include error handling
 */
//require_once 'PEAR.php';

/**
 * Which user interface class is being used.
 * @var string class name
 */
$GLOBALS['_PEAR_FRONTEND_CLASS'] = 'PEAR_Frontend_CLI';

/**
 * Instance of $_PEAR_Command_uiclass.
 * @var object
 */
$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = null;

/**
 * Singleton-based frontend for PEAR user input/output
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Frontend extends PEAR
{
    /**
     * Retrieve the frontend object
     * @return PEAR_Frontend_CLI|PEAR_Frontend_Web|PEAR_Frontend_Gtk
     */
    public static function &singleton($type = null)
    {
        if ($type === null) {
            if (!isset($GLOBALS['_PEAR_FRONTEND_SINGLETON'])) {
                $a = false;
                return $a;
            }
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        $a = PEAR_Frontend::setFrontendClass($type);
        return $a;
    }

    /**
     * Set the frontend class that will be used by calls to {@link singleton()}
     *
     * Frontends are expected to conform to the PEAR naming standard of
     * _ => DIRECTORY_SEPARATOR (PEAR_Frontend_CLI is in PEAR/Frontend/CLI.php)
     * @param string $uiclass full class name
     * @return PEAR_Frontend
     */
    public static function &setFrontendClass($uiclass)
    {
        if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
              is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], $uiclass)) {
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        if (!class_exists($uiclass)) {
            $file = str_replace('_', '/', $uiclass) . '.php';
            if (PEAR_Frontend::isIncludeable($file)) {
                include_once $file;
            }
        }

        if (class_exists($uiclass)) {
            $obj = new $uiclass;
            // quick test to see if this class implements a few of the most
            // important frontend methods
            if (is_a($obj, 'PEAR_Frontend')) {
                $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$obj;
                $GLOBALS['_PEAR_FRONTEND_CLASS'] = $uiclass;
                return $obj;
            }

            $err = PEAR::raiseError("not a frontend class: $uiclass");
            return $err;
        }

        $err = PEAR::raiseError("no such class: $uiclass");
        return $err;
    }

    /**
     * Set the frontend class that will be used by calls to {@link singleton()}
     *
     * Frontends are expected to be a descendant of PEAR_Frontend
     * @param PEAR_Frontend
     * @return PEAR_Frontend
     */
    public static function &setFrontendObject($uiobject)
    {
        if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
              is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], get_class($uiobject))) {
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        if (!is_a($uiobject, 'PEAR_Frontend')) {
            $err = PEAR::raiseError('not a valid frontend class: (' .
                get_class($uiobject) . ')');
            return $err;
        }

        $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$uiobject;
        $GLOBALS['_PEAR_FRONTEND_CLASS'] = get_class($uiobject);
        return $uiobject;
    }

    /**
     * @param string $path relative or absolute include path
     * @return boolean
     */
    public static function isIncludeable($path)
    {
        if (file_exists($path) && is_readable($path)) {
            return true;
        }

        $fp = @fopen($path, 'r', true);
        if ($fp) {
            fclose($fp);
            return true;
        }

        return false;
    }

    /**
     * @param PEAR_Config
     */
    function setConfig(&$config)
    {
    }

    /**
     * This can be overridden to allow session-based temporary file management
     *
     * By default, all files are deleted at the end of a session.  The web installer
     * needs to be able to sustain a list over many sessions in order to support
     * user interaction with install scripts
     */
    static function addTempFile($file)
    {
        $GLOBALS['_PEAR_Common_tempfiles'][] = $file;
    }

    /**
     * Log an action
     *
     * @param string $msg the message to log
     * @param boolean $append_crlf
     * @return boolean true
     * @abstract
     */
    function log($msg, $append_crlf = true)
    {
    }

    /**
     * Run a post-installation script
     *
     * @param array $scripts array of post-install scripts
     * @abstract
     */
    function runPostinstallScripts(&$scripts)
    {
    }

    /**
     * Display human-friendly output formatted depending on the
     * $command parameter.
     *
     * This should be able to handle basic output data with no command
     * @param mixed  $data    data structure containing the information to display
     * @param string $command command from which this method was called
     * @abstract
     */
    function outputData($data, $command = '_default')
    {
    }

    /**
     * Display a modal form dialog and return the given input
     *
     * A frontend that requires multiple requests to retrieve and process
     * data must take these needs into account, and implement the request
     * handling code.
     * @param string $command  command from which this method was called
     * @param array  $prompts  associative array. keys are the input field names
     *                         and values are the description
     * @param array  $types    array of input field types (text, password,
     *                         etc.) keys have to be the same like in $prompts
     * @param array  $defaults array of default values. again keys have
     *                         to be the same like in $prompts.  Do not depend
     *                         on a default value being set.
     * @return array input sent by the user
     * @abstract
     */
    function userDialog($command, $prompts, $types = array(), $defaults = array())
    {
    }
}
pear/PEAR/Frontend/CLI.php000064400000062115151732710110011124 0ustar00<?php
/**
 * PEAR_Frontend_CLI
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */
/**
 * base class
 */
require_once 'PEAR/Frontend.php';

/**
 * Command-line Frontend for the PEAR Installer
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Frontend_CLI extends PEAR_Frontend
{
    /**
     * What type of user interface this frontend is for.
     * @var string
     * @access public
     */
    var $type = 'CLI';
    var $lp = ''; // line prefix

    var $params = array();
    var $term = array(
        'bold'   => '',
        'normal' => '',
    );

    function __construct()
    {
        parent::__construct();
        $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1
        if (function_exists('posix_isatty') && !posix_isatty(1)) {
            // output is being redirected to a file or through a pipe
        } elseif ($term) {
            if (preg_match('/^(xterm|vt220|linux)/', $term)) {
                $this->term['bold']   = sprintf("%c%c%c%c", 27, 91, 49, 109);
                $this->term['normal'] = sprintf("%c%c%c", 27, 91, 109);
            } elseif (preg_match('/^vt100/', $term)) {
                $this->term['bold']   = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0);
                $this->term['normal'] = sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0);
            }
        } elseif (OS_WINDOWS) {
            // XXX add ANSI codes here
        }
    }

    /**
     * @param object PEAR_Error object
     */
    function displayError($e)
    {
        return $this->_displayLine($e->getMessage());
    }

    /**
     * @param object PEAR_Error object
     */
    function displayFatalError($eobj)
    {
        $this->displayError($eobj);
        if (class_exists('PEAR_Config')) {
            $config = &PEAR_Config::singleton();
            if ($config->get('verbose') > 5) {
                if (function_exists('debug_print_backtrace')) {
                    debug_print_backtrace();
                    exit(1);
                }

                $raised = false;
                foreach (debug_backtrace() as $i => $frame) {
                    if (!$raised) {
                        if (isset($frame['class'])
                            && strtolower($frame['class']) == 'pear'
                            && strtolower($frame['function']) == 'raiseerror'
                        ) {
                            $raised = true;
                        } else {
                            continue;
                        }
                    }

                    $frame['class']    = !isset($frame['class'])    ? '' : $frame['class'];
                    $frame['type']     = !isset($frame['type'])     ? '' : $frame['type'];
                    $frame['function'] = !isset($frame['function']) ? '' : $frame['function'];
                    $frame['line']     = !isset($frame['line'])     ? '' : $frame['line'];
                    $this->_displayLine("#$i: $frame[class]$frame[type]$frame[function] $frame[line]");
                }
            }
        }

        exit(1);
    }

    /**
     * Instruct the runInstallScript method to skip a paramgroup that matches the
     * id value passed in.
     *
     * This method is useful for dynamically configuring which sections of a post-install script
     * will be run based on the user's setup, which is very useful for making flexible
     * post-install scripts without losing the cross-Frontend ability to retrieve user input
     * @param string
     */
    function skipParamgroup($id)
    {
        $this->_skipSections[$id] = true;
    }

    function runPostinstallScripts(&$scripts)
    {
        foreach ($scripts as $i => $script) {
            $this->runInstallScript($scripts[$i]->_params, $scripts[$i]->_obj);
        }
    }

    /**
     * @param array $xml contents of postinstallscript tag
     * @param object $script post-installation script
     * @param string install|upgrade
     */
    function runInstallScript($xml, &$script)
    {
        $this->_skipSections = array();
        if (!is_array($xml) || !isset($xml['paramgroup'])) {
            $script->run(array(), '_default');
            return;
        }

        $completedPhases = array();
        if (!isset($xml['paramgroup'][0])) {
            $xml['paramgroup'] = array($xml['paramgroup']);
        }

        foreach ($xml['paramgroup'] as $group) {
            if (isset($this->_skipSections[$group['id']])) {
                // the post-install script chose to skip this section dynamically
                continue;
            }

            if (isset($group['name'])) {
                $paramname = explode('::', $group['name']);
                if ($lastgroup['id'] != $paramname[0]) {
                    continue;
                }

                $group['name'] = $paramname[1];
                if (!isset($answers)) {
                    return;
                }

                if (isset($answers[$group['name']])) {
                    switch ($group['conditiontype']) {
                        case '=' :
                            if ($answers[$group['name']] != $group['value']) {
                                continue 2;
                            }
                        break;
                        case '!=' :
                            if ($answers[$group['name']] == $group['value']) {
                                continue 2;
                            }
                        break;
                        case 'preg_match' :
                            if (!@preg_match('/' . $group['value'] . '/',
                                  $answers[$group['name']])) {
                                continue 2;
                            }
                        break;
                        default :
                        return;
                    }
                }
            }

            $lastgroup = $group;
            if (isset($group['instructions'])) {
                $this->_display($group['instructions']);
            }

            if (!isset($group['param'][0])) {
                $group['param'] = array($group['param']);
            }

            if (isset($group['param'])) {
                if (method_exists($script, 'postProcessPrompts')) {
                    $prompts = $script->postProcessPrompts($group['param'], $group['id']);
                    if (!is_array($prompts) || count($prompts) != count($group['param'])) {
                        $this->outputData('postinstall', 'Error: post-install script did not ' .
                            'return proper post-processed prompts');
                        $prompts = $group['param'];
                    } else {
                        foreach ($prompts as $i => $var) {
                            if (!is_array($var) || !isset($var['prompt']) ||
                                  !isset($var['name']) ||
                                  ($var['name'] != $group['param'][$i]['name']) ||
                                  ($var['type'] != $group['param'][$i]['type'])
                            ) {
                                $this->outputData('postinstall', 'Error: post-install script ' .
                                    'modified the variables or prompts, severe security risk. ' .
                                    'Will instead use the defaults from the package.xml');
                                $prompts = $group['param'];
                            }
                        }
                    }

                    $answers = $this->confirmDialog($prompts);
                } else {
                    $answers = $this->confirmDialog($group['param']);
                }
            }

            if ((isset($answers) && $answers) || !isset($group['param'])) {
                if (!isset($answers)) {
                    $answers = array();
                }

                array_unshift($completedPhases, $group['id']);
                if (!$script->run($answers, $group['id'])) {
                    $script->run($completedPhases, '_undoOnError');
                    return;
                }
            } else {
                $script->run($completedPhases, '_undoOnError');
                return;
            }
        }
    }

    /**
     * Ask for user input, confirm the answers and continue until the user is satisfied
     * @param array an array of arrays, format array('name' => 'paramname', 'prompt' =>
     *              'text to display', 'type' => 'string'[, default => 'default value'])
     * @return array
     */
    function confirmDialog($params)
    {
        $answers = $prompts = $types = array();
        foreach ($params as $param) {
            $prompts[$param['name']] = $param['prompt'];
            $types[$param['name']]   = $param['type'];
            $answers[$param['name']] = isset($param['default']) ? $param['default'] : '';
        }

        $tried = false;
        do {
            if ($tried) {
                $i = 1;
                foreach ($answers as $var => $value) {
                    if (!strlen($value)) {
                        echo $this->bold("* Enter an answer for #" . $i . ": ({$prompts[$var]})\n");
                    }
                    $i++;
                }
            }

            $answers = $this->userDialog('', $prompts, $types, $answers);
            $tried   = true;
        } while (is_array($answers) && count(array_filter($answers)) != count($prompts));

        return $answers;
    }

    function userDialog($command, $prompts, $types = array(), $defaults = array(), $screensize = 20)
    {
        if (!is_array($prompts)) {
            return array();
        }

        $testprompts = array_keys($prompts);
        $result      = $defaults;

        reset($prompts);
        if (count($prompts) === 1) {
            foreach ($prompts as $key => $prompt) {
                $type    = $types[$key];
                $default = @$defaults[$key];
                print "$prompt ";
                if ($default) {
                    print "[$default] ";
                }
                print ": ";

                $line         = fgets(STDIN, 2048);
                $result[$key] =  ($default && trim($line) == '') ? $default : trim($line);
            }

            return $result;
        }

        $first_run = true;
        while (true) {
            $descLength = max(array_map('strlen', $prompts));
            $descFormat = "%-{$descLength}s";
            $last       = count($prompts);

            $i = 0;
            foreach ($prompts as $n => $var) {
                $res = isset($result[$n]) ? $result[$n] : null;
                printf("%2d. $descFormat : %s\n", ++$i, $prompts[$n], $res);
            }
            print "\n1-$last, 'all', 'abort', or Enter to continue: ";

            $tmp = trim(fgets(STDIN, 1024));
            if (empty($tmp)) {
                break;
            }

            if ($tmp == 'abort') {
                return false;
            }

            if (isset($testprompts[(int)$tmp - 1])) {
                $var     = $testprompts[(int)$tmp - 1];
                $desc    = $prompts[$var];
                $current = @$result[$var];
                print "$desc [$current] : ";
                $tmp = trim(fgets(STDIN, 1024));
                if ($tmp !== '') {
                    $result[$var] = $tmp;
                }
            } elseif ($tmp == 'all') {
                foreach ($prompts as $var => $desc) {
                    $current = $result[$var];
                    print "$desc [$current] : ";
                    $tmp = trim(fgets(STDIN, 1024));
                    if (trim($tmp) !== '') {
                        $result[$var] = trim($tmp);
                    }
                }
            }

            $first_run = false;
        }

        return $result;
    }

    function userConfirm($prompt, $default = 'yes')
    {
        trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR);
        static $positives = array('y', 'yes', 'on', '1');
        static $negatives = array('n', 'no', 'off', '0');
        print "$this->lp$prompt [$default] : ";
        $fp = fopen("php://stdin", "r");
        $line = fgets($fp, 2048);
        fclose($fp);
        $answer = strtolower(trim($line));
        if (empty($answer)) {
            $answer = $default;
        }
        if (in_array($answer, $positives)) {
            return true;
        }
        if (in_array($answer, $negatives)) {
            return false;
        }
        if (in_array($default, $positives)) {
            return true;
        }
        return false;
    }

    function outputData($data, $command = '_default')
    {
        switch ($command) {
            case 'channel-info':
                foreach ($data as $type => $section) {
                    if ($type == 'main') {
                        $section['data'] = array_values($section['data']);
                    }

                    $this->outputData($section);
                }
                break;
            case 'install':
            case 'upgrade':
            case 'upgrade-all':
                if (is_array($data) && isset($data['release_warnings'])) {
                    $this->_displayLine('');
                    $this->_startTable(array(
                        'border' => false,
                        'caption' => 'Release Warnings'
                    ));
                    $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55)));
                    $this->_endTable();
                    $this->_displayLine('');
                }

                $this->_displayLine(is_array($data) ? $data['data'] : $data);
                break;
            case 'search':
                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
                }

                $packages = array();
                foreach($data['data'] as $category) {
                    foreach($category as $name => $pkg) {
                        $packages[$pkg[0]] = $pkg;
                    }
                }

                $p = array_keys($packages);
                natcasesort($p);
                foreach ($p as $name) {
                    $this->_tableRow($packages[$name], null, array(1 => array('wrap' => 55)));
                }

                $this->_endTable();
                break;
            case 'list-all':
                if (!isset($data['data'])) {
                      $this->_displayLine('No packages in channel');
                      break;
                }

                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
                }

                $packages = array();
                foreach($data['data'] as $category) {
                    foreach($category as $name => $pkg) {
                        $packages[$pkg[0]] = $pkg;
                    }
                }

                $p = array_keys($packages);
                natcasesort($p);
                foreach ($p as $name) {
                    $pkg = $packages[$name];
                    unset($pkg[4], $pkg[5]);
                    $this->_tableRow($pkg, null, array(1 => array('wrap' => 55)));
                }

                $this->_endTable();
                break;
            case 'config-show':
                $data['border'] = false;
                $opts = array(
                    0 => array('wrap' => 30),
                    1 => array('wrap' => 20),
                    2 => array('wrap' => 35)
                );

                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), $opts);
                }

                foreach ($data['data'] as $group) {
                    foreach ($group as $value) {
                        if ($value[2] == '') {
                            $value[2] = "<not set>";
                        }

                        $this->_tableRow($value, null, $opts);
                    }
                }

                $this->_endTable();
                break;
            case 'remote-info':
                $d = $data;
                $data = array(
                    'caption' => 'Package details:',
                    'border'  => false,
                    'data'    => array(
                        array("Latest",      $data['stable']),
                        array("Installed",   $data['installed']),
                        array("Package",     $data['name']),
                        array("License",     $data['license']),
                        array("Category",    $data['category']),
                        array("Summary",     $data['summary']),
                        array("Description", $data['description']),
                    ),
                );

                if (isset($d['deprecated']) && $d['deprecated']) {
                    $conf = &PEAR_Config::singleton();
                    $reg = $conf->getRegistry();
                    $name = $reg->parsedPackageNameToString($d['deprecated'], true);
                    $data['data'][] = array('Deprecated! use', $name);
                }
            default: {
                if (is_array($data)) {
                    $this->_startTable($data);
                    $count = count($data['data'][0]);
                    if ($count == 2) {
                        $opts = array(0 => array('wrap' => 25),
                                      1 => array('wrap' => 48)
                        );
                    } elseif ($count == 3) {
                        $opts = array(0 => array('wrap' => 30),
                                      1 => array('wrap' => 20),
                                      2 => array('wrap' => 35)
                        );
                    } else {
                        $opts = null;
                    }
                    if (isset($data['headline']) && is_array($data['headline'])) {
                        $this->_tableRow($data['headline'],
                                         array('bold' => true),
                                         $opts);
                    }

                    if (is_array($data['data'])) {
                        foreach($data['data'] as $row) {
                            $this->_tableRow($row, null, $opts);
                        }
                    } else {
                        $this->_tableRow(array($data['data']), null, $opts);
                     }
                    $this->_endTable();
                } else {
                    $this->_displayLine($data);
                }
            }
        }
    }

    function log($text, $append_crlf = true)
    {
        if ($append_crlf) {
            return $this->_displayLine($text);
        }

        return $this->_display($text);
    }

    function bold($text)
    {
        if (empty($this->term['bold'])) {
            return strtoupper($text);
        }

        return $this->term['bold'] . $text . $this->term['normal'];
    }

    function _displayHeading($title)
    {
        print $this->lp.$this->bold($title)."\n";
        print $this->lp.str_repeat("=", strlen($title))."\n";
    }

    function _startTable($params = array())
    {
        $params['table_data'] = array();
        $params['widest']     = array();  // indexed by column
        $params['highest']    = array(); // indexed by row
        $params['ncols']      = 0;
        $this->params         = $params;
    }

    function _tableRow($columns, $rowparams = array(), $colparams = array())
    {
        $highest = 1;
        for ($i = 0; $i < count($columns); $i++) {
            $col = &$columns[$i];
            if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) {
                $col = wordwrap($col, $colparams[$i]['wrap']);
            }

            if (strpos($col, "\n") !== false) {
                $multiline = explode("\n", $col);
                $w = 0;
                foreach ($multiline as $n => $line) {
                    $len = strlen($line);
                    if ($len > $w) {
                        $w = $len;
                    }
                }
                $lines = count($multiline);
            } else {
                $w = strlen($col);
            }

            if (isset($this->params['widest'][$i])) {
                if ($w > $this->params['widest'][$i]) {
                    $this->params['widest'][$i] = $w;
                }
            } else {
                $this->params['widest'][$i] = $w;
            }

            $tmp = count_chars($columns[$i], 1);
            // handle unix, mac and windows formats
            $lines = (isset($tmp[10]) ? $tmp[10] : (isset($tmp[13]) ? $tmp[13] : 0)) + 1;
            if ($lines > $highest) {
                $highest = $lines;
            }
        }

        if (count($columns) > $this->params['ncols']) {
            $this->params['ncols'] = count($columns);
        }

        $new_row = array(
            'data'      => $columns,
            'height'    => $highest,
            'rowparams' => $rowparams,
            'colparams' => $colparams,
        );
        $this->params['table_data'][] = $new_row;
    }

    function _endTable()
    {
        extract($this->params);
        if (!empty($caption)) {
            $this->_displayHeading($caption);
        }

        if (count($table_data) === 0) {
            return;
        }

        if (!isset($width)) {
            $width = $widest;
        } else {
            for ($i = 0; $i < $ncols; $i++) {
                if (!isset($width[$i])) {
                    $width[$i] = $widest[$i];
                }
            }
        }

        $border = false;
        if (empty($border)) {
            $cellstart  = '';
            $cellend    = ' ';
            $rowend     = '';
            $padrowend  = false;
            $borderline = '';
        } else {
            $cellstart  = '| ';
            $cellend    = ' ';
            $rowend     = '|';
            $padrowend  = true;
            $borderline = '+';
            foreach ($width as $w) {
                $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1);
                $borderline .= '+';
            }
        }

        if ($borderline) {
            $this->_displayLine($borderline);
        }

        for ($i = 0; $i < count($table_data); $i++) {
            extract($table_data[$i]);
            if (!is_array($rowparams)) {
                $rowparams = array();
            }

            if (!is_array($colparams)) {
                $colparams = array();
            }

            $rowlines = array();
            if ($height > 1) {
                for ($c = 0; $c < count($data); $c++) {
                    $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]);
                    if (count($rowlines[$c]) < $height) {
                        $rowlines[$c] = array_pad($rowlines[$c], $height, '');
                    }
                }
            } else {
                for ($c = 0; $c < count($data); $c++) {
                    $rowlines[$c] = array($data[$c]);
                }
            }

            for ($r = 0; $r < $height; $r++) {
                $rowtext = '';
                for ($c = 0; $c < count($data); $c++) {
                    if (isset($colparams[$c])) {
                        $attribs = array_merge($rowparams, $colparams);
                    } else {
                        $attribs = $rowparams;
                    }

                    $w = isset($width[$c]) ? $width[$c] : 0;
                    //$cell = $data[$c];
                    $cell = $rowlines[$c][$r];
                    $l = strlen($cell);
                    if ($l > $w) {
                        $cell = substr($cell, 0, $w);
                    }

                    if (isset($attribs['bold'])) {
                        $cell = $this->bold($cell);
                    }

                    if ($l < $w) {
                        // not using str_pad here because we may
                        // add bold escape characters to $cell
                        $cell .= str_repeat(' ', $w - $l);
                    }

                    $rowtext .= $cellstart . $cell . $cellend;
                }

                if (!$border) {
                    $rowtext = rtrim($rowtext);
                }

                $rowtext .= $rowend;
                $this->_displayLine($rowtext);
            }
        }

        if ($borderline) {
            $this->_displayLine($borderline);
        }
    }

    function _displayLine($text)
    {
        print "$this->lp$text\n";
    }

    function _display($text)
    {
        print $text;
    }
}
pear/PEAR/Task/Postinstallscript.php000064400000034570151732710110013405 0ustar00<?php
/**
 * <tasks:postinstallscript>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the postinstallscript file task.
 *
 * Note that post-install scripts are handled separately from installation, by the
 * "pear run-scripts" command
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_Task_Postinstallscript extends PEAR_Task_Common
{
    public $type = 'script';
    public $_class;
    public $_params;
    public $_obj;
    /**
     *
     * @var PEAR_PackageFile_v2
     */
    public $_pkg;
    public $_contents;
    public $phase = PEAR_TASK_INSTALL;

    /**
     * Validate the raw xml at parsing-time.
     *
     * This also attempts to validate the script to make sure it meets the criteria
     * for a post-install script
     *
     * @param  PEAR_PackageFile_v2
     * @param  array The XML contents of the <postinstallscript> tag
     * @param  PEAR_Config
     * @param  array the entire parsed <file> tag
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($fileXml['role'] != 'php') {
            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
            $fileXml['name'].'" must be role="php"', );
        }
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $file = $pkg->getFileContents($fileXml['name']);
        if (PEAR::isError($file)) {
            PEAR::popErrorHandling();

            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                $fileXml['name'].'" is not valid: '.
                $file->getMessage(), );
        } elseif ($file === null) {
            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                $fileXml['name'].'" could not be retrieved for processing!', );
        } else {
            $analysis = $pkg->analyzeSourceCode($file, true);
            if (!$analysis) {
                PEAR::popErrorHandling();
                $warnings = '';
                foreach ($pkg->getValidationWarnings() as $warn) {
                    $warnings .= $warn['message']."\n";
                }

                return array(PEAR_TASK_ERROR_INVALID, 'Analysis of post-install script "'.
                    $fileXml['name'].'" failed: '.$warnings, );
            }
            if (count($analysis['declared_classes']) != 1) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare exactly 1 class', );
            }
            $class = $analysis['declared_classes'][0];
            if ($class != str_replace(
                array('/', '.php'), array('_', ''),
                $fileXml['name']
            ).'_postinstall') {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" class "'.$class.'" must be named "'.
                    str_replace(
                        array('/', '.php'), array('_', ''),
                        $fileXml['name']
                    ).'_postinstall"', );
            }
            if (!isset($analysis['declared_methods'][$class])) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare methods init() and run()', );
            }
            $methods = array('init' => 0, 'run' => 1);
            foreach ($analysis['declared_methods'][$class] as $method) {
                if (isset($methods[$method])) {
                    unset($methods[$method]);
                }
            }
            if (count($methods)) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare methods init() and run()', );
            }
        }
        PEAR::popErrorHandling();
        $definedparams = array();
        $tasksNamespace = $pkg->getTasksNs().':';
        if (!isset($xml[$tasksNamespace.'paramgroup']) && isset($xml['paramgroup'])) {
            // in order to support the older betas, which did not expect internal tags
            // to also use the namespace
            $tasksNamespace = '';
        }
        if (isset($xml[$tasksNamespace.'paramgroup'])) {
            $params = $xml[$tasksNamespace.'paramgroup'];
            if (!is_array($params) || !isset($params[0])) {
                $params = array($params);
            }
            foreach ($params as $param) {
                if (!isset($param[$tasksNamespace.'id'])) {
                    return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                        $fileXml['name'].'" <paramgroup> must have '.
                        'an '.$tasksNamespace.'id> tag', );
                }
                if (isset($param[$tasksNamespace.'name'])) {
                    if (!in_array($param[$tasksNamespace.'name'], $definedparams)) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" parameter "'.$param[$tasksNamespace.'name'].
                            '" has not been previously defined', );
                    }
                    if (!isset($param[$tasksNamespace.'conditiontype'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'conditiontype> tag containing either "=", '.
                            '"!=", or "preg_match"', );
                    }
                    if (!in_array(
                        $param[$tasksNamespace.'conditiontype'],
                        array('=', '!=', 'preg_match')
                    )) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'conditiontype> tag containing either "=", '.
                            '"!=", or "preg_match"', );
                    }
                    if (!isset($param[$tasksNamespace.'value'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'value> tag containing expected parameter value', );
                    }
                }
                if (isset($param[$tasksNamespace.'instructions'])) {
                    if (!is_string($param[$tasksNamespace.'instructions'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" '.$tasksNamespace.'instructions> must be simple text', );
                    }
                }
                if (!isset($param[$tasksNamespace.'param'])) {
                    continue; // <param> is no longer required
                }
                $subparams = $param[$tasksNamespace.'param'];
                if (!is_array($subparams) || !isset($subparams[0])) {
                    $subparams = array($subparams);
                }
                foreach ($subparams as $subparam) {
                    if (!isset($subparam[$tasksNamespace.'name'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter for '.
                            $tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].'" must have '.
                            'a '.$tasksNamespace.'name> tag', );
                    }
                    if (!preg_match(
                        '/[a-zA-Z0-9]+/',
                        $subparam[$tasksNamespace.'name']
                    )) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" is not a valid name.  Must contain only alphanumeric characters', );
                    }
                    if (!isset($subparam[$tasksNamespace.'prompt'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.'prompt> tag', );
                    }
                    if (!isset($subparam[$tasksNamespace.'type'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.'type> tag', );
                    }
                    $definedparams[] = $param[$tasksNamespace.'id'].'::'.
                    $subparam[$tasksNamespace.'name'];
                }
            }
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array       $xml         raw, parsed xml
     * @param array       $fileattribs attributes from the <file> tag containing
     *                                 this task
     * @param string|null $lastversion last installed version of this package,
     *                                 if any (useful for upgrades)
     */
    public function init($xml, $fileattribs, $lastversion)
    {
        $this->_class = str_replace('/', '_', $fileattribs['name']);
        $this->_filename = $fileattribs['name'];
        $this->_class = str_replace('.php', '', $this->_class).'_postinstall';
        $this->_params = $xml;
        $this->_lastversion = $lastversion;
    }

    /**
     * Strip the tasks: namespace from internal params
     *
     * @access private
     */
    public function _stripNamespace($params = null)
    {
        if ($params === null) {
            $params = array();
            if (!is_array($this->_params)) {
                return;
            }
            foreach ($this->_params as $i => $param) {
                if (is_array($param)) {
                    $param = $this->_stripNamespace($param);
                }
                $params[str_replace($this->_pkg->getTasksNs().':', '', $i)] = $param;
            }
            $this->_params = $params;
        } else {
            $newparams = array();
            foreach ($params as $i => $param) {
                if (is_array($param)) {
                    $param = $this->_stripNamespace($param);
                }
                $newparams[str_replace($this->_pkg->getTasksNs().':', '', $i)] = $param;
            }

            return $newparams;
        }
    }

    /**
     * Unlike other tasks, the installed file name is passed in instead of the
     * file contents, because this task is handled post-installation
     *
     * @param mixed  $pkg      PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param string $contents file name
     * @param string $dest     the eventual final file location (informational only)
     *
     * @return bool|PEAR_Error false to skip this file, PEAR_Error to fail
     *                         (use $this->throwError)
     */
    public function startSession($pkg, $contents, $dest)
    {
        if ($this->installphase != PEAR_TASK_INSTALL) {
            return false;
        }
        // remove the tasks: namespace if present
        $this->_pkg = $pkg;
        $this->_stripNamespace();
        $this->logger->log(
            0, 'Including external post-installation script "'.
            $contents.'" - any errors are in this script'
        );
        include_once $contents;
        if (class_exists($this->_class)) {
            $this->logger->log(0, 'Inclusion succeeded');
        } else {
            return $this->throwError(
                'init of post-install script class "'.$this->_class
                .'" failed'
            );
        }
        $this->_obj = new $this->_class();
        $this->logger->log(1, 'running post-install script "'.$this->_class.'->init()"');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $res = $this->_obj->init($this->config, $pkg, $this->_lastversion);
        PEAR::popErrorHandling();
        if ($res) {
            $this->logger->log(0, 'init succeeded');
        } else {
            return $this->throwError(
                'init of post-install script "'.$this->_class.
                '->init()" failed'
            );
        }
        $this->_contents = $contents;

        return true;
    }

    /**
     * No longer used
     *
     * @see    PEAR_PackageFile_v2::runPostinstallScripts()
     * @param  array an array of tasks
     * @param  string install or upgrade
     * @access protected
     */
    public static function run($tasks)
    {
    }
}
pear/PEAR/Task/Replace/rw.php000064400000003027151732710110011640 0ustar00<?php
/**
 * <tasks:replace> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Replace.php';
/**
 * Abstracts the replace task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Replace_rw extends PEAR_Task_Replace
{
    public function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents);
    }

    public function setInfo($from, $to, $type)
    {
        $this->_params = array('attribs' => array('from' => $from, 'to' => $to, 'type' => $type));
    }

    public function getName()
    {
        return 'replace';
    }

    public function getXml()
    {
        return $this->_params;
    }
}
pear/PEAR/Task/Postinstallscript/rw.php000064400000014034151732710110014026 0ustar00<?php
/**
 * <tasks:postinstallscript> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Postinstallscript.php';
/**
 * Abstracts the postinstallscript file task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Postinstallscript_rw extends PEAR_Task_Postinstallscript
{
    /**
     * parent package file object
     *
     * @var PEAR_PackageFile_v2_rw
     */
    public $_pkg;
    /**
     * Enter description here...
     *
     * @param PEAR_PackageFile_v2_rw $pkg     Package
     * @param PEAR_Config            $config  Config
     * @param PEAR_Frontend          $logger  Logger
     * @param array                  $fileXml XML
     *
     * @return PEAR_Task_Postinstallscript_rw
     */
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents);
    }

    public function getName()
    {
        return 'postinstallscript';
    }

    /**
     * add a simple <paramgroup> to the post-install script
     *
     * Order is significant, so call this method in the same
     * sequence the users should see the paramgroups.  The $params
     * parameter should either be the result of a call to {@link getParam()}
     * or an array of calls to getParam().
     *
     * Use {@link addConditionTypeGroup()} to add a <paramgroup> containing
     * a <conditiontype> tag
     *
     * @param string       $id           <paramgroup> id as seen by the script
     * @param array|false  $params       array of getParam() calls, or false for no params
     * @param string|false $instructions
     */
    public function addParamGroup($id, $params = false, $instructions = false)
    {
        if ($params && isset($params[0]) && !isset($params[1])) {
            $params = $params[0];
        }
        $stuff =
            array(
                $this->_pkg->getTasksNs().':id' => $id,
            );
        if ($instructions) {
            $stuff[$this->_pkg->getTasksNs().':instructions'] = $instructions;
        }
        if ($params) {
            $stuff[$this->_pkg->getTasksNs().':param'] = $params;
        }
        $this->_params[$this->_pkg->getTasksNs().':paramgroup'][] = $stuff;
    }

    /**
     * Add a complex <paramgroup> to the post-install script with conditions
     *
     * This inserts a <paramgroup> with
     *
     * Order is significant, so call this method in the same
     * sequence the users should see the paramgroups.  The $params
     * parameter should either be the result of a call to {@link getParam()}
     * or an array of calls to getParam().
     *
     * Use {@link addParamGroup()} to add a simple <paramgroup>
     *
     * @param string       $id            <paramgroup> id as seen by the script
     * @param string       $oldgroup      <paramgroup> id of the section referenced by
     *                                    <conditiontype>
     * @param string       $param         name of the <param> from the older section referenced
     *                                    by <contitiontype>
     * @param string       $value         value to match of the parameter
     * @param string       $conditiontype one of '=', '!=', 'preg_match'
     * @param array|false  $params        array of getParam() calls, or false for no params
     * @param string|false $instructions
     */
    public function addConditionTypeGroup($id,
        $oldgroup,
        $param,
        $value,
        $conditiontype = '=',
        $params = false,
        $instructions = false
    ) {
        if ($params && isset($params[0]) && !isset($params[1])) {
            $params = $params[0];
        }
        $stuff = array(
            $this->_pkg->getTasksNs().':id' => $id,
        );
        if ($instructions) {
            $stuff[$this->_pkg->getTasksNs().':instructions'] = $instructions;
        }
        $stuff[$this->_pkg->getTasksNs().':name'] = $oldgroup.'::'.$param;
        $stuff[$this->_pkg->getTasksNs().':conditiontype'] = $conditiontype;
        $stuff[$this->_pkg->getTasksNs().':value'] = $value;
        if ($params) {
            $stuff[$this->_pkg->getTasksNs().':param'] = $params;
        }
        $this->_params[$this->_pkg->getTasksNs().':paramgroup'][] = $stuff;
    }

    public function getXml()
    {
        return $this->_params;
    }

    /**
     * Use to set up a param tag for use in creating a paramgroup
     *
     * @param mixed  $name    Name of parameter
     * @param mixed  $prompt  Prompt
     * @param string $type    Type, defaults to 'string'
     * @param mixed  $default Default value
     *
     * @return array
     */
    public function getParam(
        $name, $prompt, $type = 'string', $default = null
    ) {
        if ($default !== null) {
            return
            array(
                $this->_pkg->getTasksNs().':name' => $name,
                $this->_pkg->getTasksNs().':prompt' => $prompt,
                $this->_pkg->getTasksNs().':type' => $type,
                $this->_pkg->getTasksNs().':default' => $default,
            );
        }

        return
            array(
                $this->_pkg->getTasksNs().':name' => $name,
                $this->_pkg->getTasksNs().':prompt' => $prompt,
                $this->_pkg->getTasksNs().':type' => $type,
            );
    }
}
pear/PEAR/Task/Common.php000064400000014037151732710110011070 0ustar00<?php
/**
 * PEAR_Task_Common, base class for installer tasks
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**#@+
 * Error codes for task validation routines
 */
define('PEAR_TASK_ERROR_NOATTRIBS', 1);
define('PEAR_TASK_ERROR_MISSING_ATTRIB', 2);
define('PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE', 3);
define('PEAR_TASK_ERROR_INVALID', 4);
/**#@-*/
define('PEAR_TASK_PACKAGE', 1);
define('PEAR_TASK_INSTALL', 2);
define('PEAR_TASK_PACKAGEANDINSTALL', 3);
/**
 * A task is an operation that manipulates the contents of a file.
 *
 * Simple tasks operate on 1 file.  Multiple tasks are executed after all files have been
 * processed and installed, and are designed to operate on all files containing the task.
 * The Post-install script task simply takes advantage of the fact that it will be run
 * after installation, replace is a simple task.
 *
 * Combining tasks is possible, but ordering is significant.
 *
 * <file name="test.php" role="php">
 *  <tasks:replace from="@data-dir@" to="data_dir" type="pear-config"/>
 *  <tasks:postinstallscript/>
 * </file>
 *
 * This will first replace any instance of @data-dir@ in the test.php file
 * with the path to the current data directory.  Then, it will include the
 * test.php file and run the script it contains to configure the package post-installation.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 * @abstract
 */
class PEAR_Task_Common
{
    /**
     * Valid types for this version are 'simple' and 'multiple'
     *
     * - simple tasks operate on the contents of a file and write out changes to disk
     * - multiple tasks operate on the contents of many files and write out the
     *   changes directly to disk
     *
     * Child task classes must override this property.
     *
     * @access protected
     */
    protected $type = 'simple';
    /**
     * Determines which install phase this task is executed under
     */
    public $phase = PEAR_TASK_INSTALL;
    /**
     * @access protected
     */
    protected $config;
    /**
     * @access protected
     */
    protected $registry;
    /**
     * @access protected
     */
    public $logger;
    /**
     * @access protected
     */
    protected $installphase;
    /**
     * @param PEAR_Config
     * @param PEAR_Common
     */
    function __construct(&$config, &$logger, $phase)
    {
        $this->config = &$config;
        $this->registry = &$config->getRegistry();
        $this->logger = &$logger;
        $this->installphase = $phase;
        if ($this->type == 'multiple') {
            $GLOBALS['_PEAR_TASK_POSTINSTANCES'][get_class($this)][] = &$this;
        }
    }

    /**
     * Validate the basic contents of a task tag.
     *
     * @param PEAR_PackageFile_v2
     * @param array
     * @param PEAR_Config
     * @param array the entire parsed <file> tag
     *
     * @return true|array On error, return an array in format:
     *                    array(PEAR_TASK_ERROR_???[, param1][, param2][, ...])
     *
     * For PEAR_TASK_ERROR_MISSING_ATTRIB, pass the attribute name in
     * For PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, pass the attribute name and
     * an array of legal values in
     *
     * @abstract
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
    }

    /**
     * Initialize a task instance with the parameters
     *
     * @param    array raw, parsed xml
     * @param    array attributes from the <file> tag containing this task
     * @param    string|null last installed version of this package
     * @abstract
     */
    public function init($xml, $fileAttributes, $lastVersion)
    {
    }

    /**
     * Begin a task processing session.  All multiple tasks will be processed
     * after each file has been successfully installed, all simple tasks should
     * perform their task here and return any errors using the custom
     * throwError() method to allow forward compatibility
     *
     * This method MUST NOT write out any changes to disk
     *
     * @param    PEAR_PackageFile_v2
     * @param    string file contents
     * @param    string the eventual final file location (informational only)
     * @return   string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *           (use $this->throwError), otherwise return the new contents
     * @abstract
     */
    public function startSession($pkg, $contents, $dest)
    {
    }

    /**
     * This method is used to process each of the tasks for a particular
     * multiple class type.  Simple tasks need not implement this method.
     *
     * @param    array an array of tasks
     * @access   protected
     */
    public static function run($tasks)
    {
    }

    /**
     * @final
     */
    public static function hasPostinstallTasks()
    {
        return isset($GLOBALS['_PEAR_TASK_POSTINSTANCES']);
    }

     /**
      * @final
      */
    public static function runPostinstallTasks()
    {
        foreach ($GLOBALS['_PEAR_TASK_POSTINSTANCES'] as $class => $tasks) {
            $err = call_user_func(
                array($class, 'run'),
                $GLOBALS['_PEAR_TASK_POSTINSTANCES'][$class]
            );
            if ($err) {
                return PEAR_Task_Common::throwError($err);
            }
        }
        unset($GLOBALS['_PEAR_TASK_POSTINSTANCES']);
    }

    /**
     * Determines whether a role is a script
     * @return bool
     */
    public function isScript()
    {
            return $this->type == 'script';
    }

    public function throwError($msg, $code = -1)
    {
        include_once 'PEAR.php';

        return PEAR::raiseError($msg, $code);
    }
}
pear/PEAR/Task/Unixeol.php000064400000004377151732710120011272 0ustar00<?php
/**
 * <tasks:unixeol>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the unix line endings file task.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Task_Unixeol extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGE;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($xml != '') {
            return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed');
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
    }

    /**
     * Replace all line endings with line endings customized for the current OS
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $this->logger->log(3, "replacing all line endings with \\n in $dest");

        return preg_replace("/\r\n|\n\r|\r|\n/", "\n", $contents);
    }
}
pear/PEAR/Task/Unixeol/rw.php000064400000002434151732710120011712 0ustar00<?php
/**
 * <tasks:unixeol> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Unixeol.php';
/**
 * Abstracts the unixeol task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Unixeol_rw extends PEAR_Task_Unixeol
{
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return true;
    }

    public function getName()
    {
        return 'unixeol';
    }

    public function getXml()
    {
        return '';
    }
}
?>
pear/PEAR/Task/Windowseol.php000064400000004363151732710120011774 0ustar00<?php
/**
 * <tasks:windowseol>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the windows line endsings file task.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_Task_Windowseol extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGE;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($xml != '') {
            return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed');
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
    }

    /**
     * Replace all line endings with windows line endings
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $this->logger->log(3, "replacing all line endings with \\r\\n in $dest");

        return preg_replace("/\r\n|\n\r|\r|\n/", "\r\n", $contents);
    }
}
pear/PEAR/Task/Replace.php000064400000015371151732710120011216 0ustar00<?php
/**
 * <tasks:replace>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the replace file task.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Task_Replace extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGEANDINSTALL;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if (!isset($xml['attribs'])) {
            return array(PEAR_TASK_ERROR_NOATTRIBS);
        }
        if (!isset($xml['attribs']['type'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'type');
        }
        if (!isset($xml['attribs']['to'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'to');
        }
        if (!isset($xml['attribs']['from'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'from');
        }
        if ($xml['attribs']['type'] == 'pear-config') {
            if (!in_array($xml['attribs']['to'], $config->getKeys())) {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    $config->getKeys(), );
            }
        } elseif ($xml['attribs']['type'] == 'php-const') {
            if (defined($xml['attribs']['to'])) {
                return true;
            } else {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    array('valid PHP constant'), );
            }
        } elseif ($xml['attribs']['type'] == 'package-info') {
            if (in_array(
                $xml['attribs']['to'],
                array('name', 'summary', 'channel', 'notes', 'extends', 'description',
                    'release_notes', 'license', 'release-license', 'license-uri',
                    'version', 'api-version', 'state', 'api-state', 'release_date',
                    'date', 'time', )
            )) {
                return true;
            } else {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    array('name', 'summary', 'channel', 'notes', 'extends', 'description',
                    'release_notes', 'license', 'release-license', 'license-uri',
                    'version', 'api-version', 'state', 'api-state', 'release_date',
                    'date', 'time', ), );
            }
        } else {
            return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'type', $xml['attribs']['type'],
                array('pear-config', 'package-info', 'php-const'), );
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
        $this->_replacements = isset($xml['attribs']) ? array($xml) : $xml;
    }

    /**
     * Do a package.xml 1.0 replacement, with additional package-info fields available
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $subst_from = $subst_to = array();
        foreach ($this->_replacements as $a) {
            $a = $a['attribs'];
            $to = '';
            if ($a['type'] == 'pear-config') {
                if ($this->installphase == PEAR_TASK_PACKAGE) {
                    return false;
                }
                if ($a['to'] == 'master_server') {
                    $chan = $this->registry->getChannel($pkg->getChannel());
                    if (!PEAR::isError($chan)) {
                        $to = $chan->getServer();
                    } else {
                        $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]");

                        return false;
                    }
                } else {
                    if ($this->config->isDefinedLayer('ftp')) {
                        // try the remote config file first
                        $to = $this->config->get($a['to'], 'ftp', $pkg->getChannel());
                        if (is_null($to)) {
                            // then default to local
                            $to = $this->config->get($a['to'], null, $pkg->getChannel());
                        }
                    } else {
                        $to = $this->config->get($a['to'], null, $pkg->getChannel());
                    }
                }
                if (is_null($to)) {
                    $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]");

                    return false;
                }
            } elseif ($a['type'] == 'php-const') {
                if ($this->installphase == PEAR_TASK_PACKAGE) {
                    return false;
                }
                if (defined($a['to'])) {
                    $to = constant($a['to']);
                } else {
                    $this->logger->log(0, "$dest: invalid php-const replacement: $a[to]");

                    return false;
                }
            } else {
                if ($t = $pkg->packageInfo($a['to'])) {
                    $to = $t;
                } else {
                    $this->logger->log(0, "$dest: invalid package-info replacement: $a[to]");

                    return false;
                }
            }
            if (!is_null($to)) {
                $subst_from[] = $a['from'];
                $subst_to[] = $to;
            }
        }
        $this->logger->log(
            3, "doing ".sizeof($subst_from).
            " substitution(s) for $dest"
        );
        if (sizeof($subst_from)) {
            $contents = str_replace($subst_from, $subst_to, $contents);
        }

        return $contents;
    }
}
pear/PEAR/Task/Windowseol/rw.php000064400000002451151732710120012420 0ustar00<?php
/**
 * <tasks:windowseol> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Windowseol.php';
/**
 * Abstracts the windowseol task xml.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a10
 */
class PEAR_Task_Windowseol_rw extends PEAR_Task_Windowseol
{
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return true;
    }

    public function getName()
    {
        return 'windowseol';
    }

    public function getXml()
    {
        return '';
    }
}
?>
pear/PEAR/Exception.php000064400000033155151732710120010677 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
/**
 * PEAR_Exception
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Hans Lellelid <hans@velum.net>
 * @author     Bertrand Mansion <bmansion@mamasam.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.3
 */


/**
 * Base PEAR_Exception Class
 *
 * 1) Features:
 *
 * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception))
 * - Definable triggers, shot when exceptions occur
 * - Pretty and informative error messages
 * - Added more context info available (like class, method or cause)
 * - cause can be a PEAR_Exception or an array of mixed
 *   PEAR_Exceptions/PEAR_ErrorStack warnings
 * - callbacks for specific exception classes and their children
 *
 * 2) Ideas:
 *
 * - Maybe a way to define a 'template' for the output
 *
 * 3) Inherited properties from PHP Exception Class:
 *
 * protected $message
 * protected $code
 * protected $line
 * protected $file
 * private   $trace
 *
 * 4) Inherited methods from PHP Exception Class:
 *
 * __clone
 * __construct
 * getMessage
 * getCode
 * getFile
 * getLine
 * getTraceSafe
 * getTraceSafeAsString
 * __toString
 *
 * 5) Usage example
 *
 * <code>
 *  require_once 'PEAR/Exception.php';
 *
 *  class Test {
 *     function foo() {
 *         throw new PEAR_Exception('Error Message', ERROR_CODE);
 *     }
 *  }
 *
 *  function myLogger($pear_exception) {
 *     echo $pear_exception->getMessage();
 *  }
 *  // each time a exception is thrown the 'myLogger' will be called
 *  // (its use is completely optional)
 *  PEAR_Exception::addObserver('myLogger');
 *  $test = new Test;
 *  try {
 *     $test->foo();
 *  } catch (PEAR_Exception $e) {
 *     print $e;
 *  }
 * </code>
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Hans Lellelid <hans@velum.net>
 * @author     Bertrand Mansion <bmansion@mamasam.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.3
 *
 */
class PEAR_Exception extends Exception
{
    const OBSERVER_PRINT = -2;
    const OBSERVER_TRIGGER = -4;
    const OBSERVER_DIE = -8;
    protected $cause;
    private static $_observers = array();
    private static $_uniqueid = 0;
    private $_trace;

    /**
     * Supported signatures:
     *  - PEAR_Exception(string $message);
     *  - PEAR_Exception(string $message, int $code);
     *  - PEAR_Exception(string $message, Exception $cause);
     *  - PEAR_Exception(string $message, Exception $cause, int $code);
     *  - PEAR_Exception(string $message, PEAR_Error $cause);
     *  - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
     *  - PEAR_Exception(string $message, array $causes);
     *  - PEAR_Exception(string $message, array $causes, int $code);
     * @param string exception message
     * @param int|Exception|PEAR_Error|array|null exception cause
     * @param int|null exception code or null
     */
    public function __construct($message, $p2 = null, $p3 = null)
    {
        if (is_int($p2)) {
            $code = $p2;
            $this->cause = null;
        } elseif (is_object($p2) || is_array($p2)) {
            // using is_object allows both Exception and PEAR_Error
            if (is_object($p2) && !($p2 instanceof Exception)) {
                if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
                    throw new PEAR_Exception('exception cause must be Exception, ' .
                        'array, or PEAR_Error');
                }
            }
            $code = $p3;
            if (is_array($p2) && isset($p2['message'])) {
                // fix potential problem of passing in a single warning
                $p2 = array($p2);
            }
            $this->cause = $p2;
        } else {
            $code = null;
            $this->cause = null;
        }
        parent::__construct($message, $code);
        $this->signal();
    }

    /**
     * @param mixed $callback  - A valid php callback, see php func is_callable()
     *                         - A PEAR_Exception::OBSERVER_* constant
     *                         - An array(const PEAR_Exception::OBSERVER_*,
     *                           mixed $options)
     * @param string $label    The name of the observer. Use this if you want
     *                         to remove it later with removeObserver()
     */
    public static function addObserver($callback, $label = 'default')
    {
        self::$_observers[$label] = $callback;
    }

    public static function removeObserver($label = 'default')
    {
        unset(self::$_observers[$label]);
    }

    /**
     * @return int unique identifier for an observer
     */
    public static function getUniqueId()
    {
        return self::$_uniqueid++;
    }

    private function signal()
    {
        foreach (self::$_observers as $func) {
            if (is_callable($func)) {
                call_user_func($func, $this);
                continue;
            }
            settype($func, 'array');
            switch ($func[0]) {
                case self::OBSERVER_PRINT :
                    $f = (isset($func[1])) ? $func[1] : '%s';
                    printf($f, $this->getMessage());
                    break;
                case self::OBSERVER_TRIGGER :
                    $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
                    trigger_error($this->getMessage(), $f);
                    break;
                case self::OBSERVER_DIE :
                    $f = (isset($func[1])) ? $func[1] : '%s';
                    die(printf($f, $this->getMessage()));
                    break;
                default:
                    trigger_error('invalid observer type', E_USER_WARNING);
            }
        }
    }

    /**
     * Return specific error information that can be used for more detailed
     * error messages or translation.
     *
     * This method may be overridden in child exception classes in order
     * to add functionality not present in PEAR_Exception and is a placeholder
     * to define API
     *
     * The returned array must be an associative array of parameter => value like so:
     * <pre>
     * array('name' => $name, 'context' => array(...))
     * </pre>
     * @return array
     */
    public function getErrorData()
    {
        return array();
    }

    /**
     * Returns the exception that caused this exception to be thrown
     * @access public
     * @return Exception|array The context of the exception
     */
    public function getCause()
    {
        return $this->cause;
    }

    /**
     * Function must be public to call on caused exceptions
     * @param array
     */
    public function getCauseMessage(&$causes)
    {
        $trace = $this->getTraceSafe();
        $cause = array('class'   => get_class($this),
                       'message' => $this->message,
                       'file' => 'unknown',
                       'line' => 'unknown');
        if (isset($trace[0])) {
            if (isset($trace[0]['file'])) {
                $cause['file'] = $trace[0]['file'];
                $cause['line'] = $trace[0]['line'];
            }
        }
        $causes[] = $cause;
        if ($this->cause instanceof PEAR_Exception) {
            $this->cause->getCauseMessage($causes);
        } elseif ($this->cause instanceof Exception) {
            $causes[] = array('class'   => get_class($this->cause),
                              'message' => $this->cause->getMessage(),
                              'file' => $this->cause->getFile(),
                              'line' => $this->cause->getLine());
        } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
            $causes[] = array('class' => get_class($this->cause),
                              'message' => $this->cause->getMessage(),
                              'file' => 'unknown',
                              'line' => 'unknown');
        } elseif (is_array($this->cause)) {
            foreach ($this->cause as $cause) {
                if ($cause instanceof PEAR_Exception) {
                    $cause->getCauseMessage($causes);
                } elseif ($cause instanceof Exception) {
                    $causes[] = array('class'   => get_class($cause),
                                   'message' => $cause->getMessage(),
                                   'file' => $cause->getFile(),
                                   'line' => $cause->getLine());
                } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) {
                    $causes[] = array('class' => get_class($cause),
                                      'message' => $cause->getMessage(),
                                      'file' => 'unknown',
                                      'line' => 'unknown');
                } elseif (is_array($cause) && isset($cause['message'])) {
                    // PEAR_ErrorStack warning
                    $causes[] = array(
                        'class' => $cause['package'],
                        'message' => $cause['message'],
                        'file' => isset($cause['context']['file']) ?
                                            $cause['context']['file'] :
                                            'unknown',
                        'line' => isset($cause['context']['line']) ?
                                            $cause['context']['line'] :
                                            'unknown',
                    );
                }
            }
        }
    }

    public function getTraceSafe()
    {
        if (!isset($this->_trace)) {
            $this->_trace = $this->getTrace();
            if (empty($this->_trace)) {
                $backtrace = debug_backtrace();
                $this->_trace = array($backtrace[count($backtrace)-1]);
            }
        }
        return $this->_trace;
    }

    public function getErrorClass()
    {
        $trace = $this->getTraceSafe();
        return $trace[0]['class'];
    }

    public function getErrorMethod()
    {
        $trace = $this->getTraceSafe();
        return $trace[0]['function'];
    }

    public function __toString()
    {
        if (isset($_SERVER['REQUEST_URI'])) {
            return $this->toHtml();
        }
        return $this->toText();
    }

    public function toHtml()
    {
        $trace = $this->getTraceSafe();
        $causes = array();
        $this->getCauseMessage($causes);
        $html =  '<table style="border: 1px" cellspacing="0">' . "\n";
        foreach ($causes as $i => $cause) {
            $html .= '<tr><td colspan="3" style="background: #ff9999">'
               . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
               . htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> '
               . 'on line <b>' . $cause['line'] . '</b>'
               . "</td></tr>\n";
        }
        $html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
               . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";

        foreach ($trace as $k => $v) {
            $html .= '<tr><td style="text-align: center;">' . $k . '</td>'
                   . '<td>';
            if (!empty($v['class'])) {
                $html .= $v['class'] . $v['type'];
            }
            $html .= $v['function'];
            $args = array();
            if (!empty($v['args'])) {
                foreach ($v['args'] as $arg) {
                    if (is_null($arg)) $args[] = 'null';
                    elseif (is_array($arg)) $args[] = 'Array';
                    elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
                    elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
                    elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
                    else {
                        $arg = (string)$arg;
                        $str = htmlspecialchars(substr($arg, 0, 16));
                        if (strlen($arg) > 16) $str .= '&hellip;';
                        $args[] = "'" . $str . "'";
                    }
                }
            }
            $html .= '(' . implode(', ',$args) . ')'
                   . '</td>'
                   . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
                   . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
                   . '</td></tr>' . "\n";
        }
        $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
               . '<td>{main}</td>'
               . '<td>&nbsp;</td></tr>' . "\n"
               . '</table>';
        return $html;
    }

    public function toText()
    {
        $causes = array();
        $this->getCauseMessage($causes);
        $causeMsg = '';
        foreach ($causes as $i => $cause) {
            $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
                   . $cause['message'] . ' in ' . $cause['file']
                   . ' on line ' . $cause['line'] . "\n";
        }
        return $causeMsg . $this->getTraceAsString();
    }
}pear/PEAR/ErrorStack.php000064400000102014151732710120011007 0ustar00<?php
/**
 * Error Stack Implementation
 * 
 * This is an incredibly simple implementation of a very complex error handling
 * facility.  It contains the ability
 * to track multiple errors from multiple packages simultaneously.  In addition,
 * it can track errors of many levels, save data along with the error, context
 * information such as the exact file, line number, class and function that
 * generated the error, and if necessary, it can raise a traditional PEAR_Error.
 * It has built-in support for PEAR::Log, to log errors as they occur
 * 
 * Since version 0.2alpha, it is also possible to selectively ignore errors,
 * through the use of an error callback, see {@link pushCallback()}
 * 
 * Since version 0.3alpha, it is possible to specify the exception class
 * returned from {@link push()}
 *
 * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class.  This can
 * still be done quite handily in an error callback or by manipulating the returned array
 * @category   Debugging
 * @package    PEAR_ErrorStack
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2004-2008 Greg Beaver
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR_ErrorStack
 */

/**
 * Singleton storage
 * 
 * Format:
 * <pre>
 * array(
 *  'package1' => PEAR_ErrorStack object,
 *  'package2' => PEAR_ErrorStack object,
 *  ...
 * )
 * </pre>
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON']
 */
$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array();

/**
 * Global error callback (default)
 * 
 * This is only used if set to non-false.  * is the default callback for
 * all packages, whereas specific packages may set a default callback
 * for all instances, regardless of whether they are a singleton or not.
 *
 * To exclude non-singletons, only set the local callback for the singleton
 * @see PEAR_ErrorStack::setDefaultCallback()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']
 */
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array(
    '*' => false,
);

/**
 * Global Log object (default)
 * 
 * This is only used if set to non-false.  Use to set a default log object for
 * all stacks, regardless of instantiation order or location
 * @see PEAR_ErrorStack::setDefaultLogger()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
 */
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false;

/**
 * Global Overriding Callback
 * 
 * This callback will override any error callbacks that specific loggers have set.
 * Use with EXTREME caution
 * @see PEAR_ErrorStack::staticPushCallback()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
 */
$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();

/**#@+
 * One of four possible return values from the error Callback
 * @see PEAR_ErrorStack::_errorCallback()
 */
/**
 * If this is returned, then the error will be both pushed onto the stack
 * and logged.
 */
define('PEAR_ERRORSTACK_PUSHANDLOG', 1);
/**
 * If this is returned, then the error will only be pushed onto the stack,
 * and not logged.
 */
define('PEAR_ERRORSTACK_PUSH', 2);
/**
 * If this is returned, then the error will only be logged, but not pushed
 * onto the error stack.
 */
define('PEAR_ERRORSTACK_LOG', 3);
/**
 * If this is returned, then the error is completely ignored.
 */
define('PEAR_ERRORSTACK_IGNORE', 4);
/**
 * If this is returned, then the error is logged and die() is called.
 */
define('PEAR_ERRORSTACK_DIE', 5);
/**#@-*/

/**
 * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in
 * the singleton method.
 */
define('PEAR_ERRORSTACK_ERR_NONCLASS', 1);

/**
 * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()}
 * that has no __toString() method
 */
define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
/**
 * Error Stack Implementation
 *
 * Usage:
 * <code>
 * // global error stack
 * $global_stack = &PEAR_ErrorStack::singleton('MyPackage');
 * // local error stack
 * $local_stack = new PEAR_ErrorStack('MyPackage');
 * </code>
 * @author     Greg Beaver <cellog@php.net>
 * @version    1.10.16
 * @package    PEAR_ErrorStack
 * @category   Debugging
 * @copyright  2004-2008 Greg Beaver
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR_ErrorStack
 */
class PEAR_ErrorStack {
    /**
     * Errors are stored in the order that they are pushed on the stack.
     * @since 0.4alpha Errors are no longer organized by error level.
     * This renders pop() nearly unusable, and levels could be more easily
     * handled in a callback anyway
     * @var array
     * @access private
     */
    var $_errors = array();

    /**
     * Storage of errors by level.
     *
     * Allows easy retrieval and deletion of only errors from a particular level
     * @since PEAR 1.4.0dev
     * @var array
     * @access private
     */
    var $_errorsByLevel = array();

    /**
     * Package name this error stack represents
     * @var string
     * @access protected
     */
    var $_package;
    
    /**
     * Determines whether a PEAR_Error is thrown upon every error addition
     * @var boolean
     * @access private
     */
    var $_compat = false;
    
    /**
     * If set to a valid callback, this will be used to generate the error
     * message from the error code, otherwise the message passed in will be
     * used
     * @var false|string|array
     * @access private
     */
    var $_msgCallback = false;
    
    /**
     * If set to a valid callback, this will be used to generate the error
     * context for an error.  For PHP-related errors, this will be a file
     * and line number as retrieved from debug_backtrace(), but can be
     * customized for other purposes.  The error might actually be in a separate
     * configuration file, or in a database query.
     * @var false|string|array
     * @access protected
     */
    var $_contextCallback = false;

    /**
     * If set to a valid callback, this will be called every time an error
     * is pushed onto the stack.  The return value will be used to determine
     * whether to allow an error to be pushed or logged.
     *
     * The return value must be one an PEAR_ERRORSTACK_* constant
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @var false|string|array
     * @access protected
     */
    var $_errorCallback = array();

    /**
     * PEAR::Log object for logging errors
     * @var false|Log
     * @access protected
     */
    var $_logger = false;

    /**
     * Error messages - designed to be overridden
     * @var array
     * @abstract
     */
    var $_errorMsgs = array();

    /**
     * Set up a new error stack
     *
     * @param string   $package name of the package this error stack represents
     * @param callback $msgCallback callback used for error message generation
     * @param callback $contextCallback callback used for context generation,
     *                 defaults to {@link getFileLine()}
     * @param boolean  $throwPEAR_Error
     */
    function __construct($package, $msgCallback = false, $contextCallback = false,
                         $throwPEAR_Error = false)
    {
        $this->_package = $package;
        $this->setMessageCallback($msgCallback);
        $this->setContextCallback($contextCallback);
        $this->_compat = $throwPEAR_Error;
    }
    
    /**
     * Return a single error stack for this package.
     * 
     * Note that all parameters are ignored if the stack for package $package
     * has already been instantiated
     * @param string   $package name of the package this error stack represents
     * @param callback $msgCallback callback used for error message generation
     * @param callback $contextCallback callback used for context generation,
     *                 defaults to {@link getFileLine()}
     * @param boolean  $throwPEAR_Error
     * @param string   $stackClass class to instantiate
     *
     * @return PEAR_ErrorStack
     */
    public static function &singleton(
        $package, $msgCallback = false, $contextCallback = false,
        $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
        }
        if (!class_exists($stackClass)) {
            if (function_exists('debug_backtrace')) {
                $trace = debug_backtrace();
            }
            PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS,
                'exception', array('stackclass' => $stackClass),
                'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)',
                false, $trace);
        }
        $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
            new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);

        return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
    }

    /**
     * Internal error handler for PEAR_ErrorStack class
     * 
     * Dies if the error is an exception (and would have died anyway)
     * @access private
     */
    function _handleError($err)
    {
        if ($err['level'] == 'exception') {
            $message = $err['message'];
            if (isset($_SERVER['REQUEST_URI'])) {
                echo '<br />';
            } else {
                echo "\n";
            }
            var_dump($err['context']);
            die($message);
        }
    }
    
    /**
     * Set up a PEAR::Log object for all error stacks that don't have one
     * @param Log $log 
     */
    public static function setDefaultLogger(&$log)
    {
        if (is_object($log) && method_exists($log, 'log') ) {
            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
        } elseif (is_callable($log)) {
            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
        }
    }
    
    /**
     * Set up a PEAR::Log object for this error stack
     * @param Log $log 
     */
    function setLogger(&$log)
    {
        if (is_object($log) && method_exists($log, 'log') ) {
            $this->_logger = &$log;
        } elseif (is_callable($log)) {
            $this->_logger = &$log;
        }
    }
    
    /**
     * Set an error code => error message mapping callback
     * 
     * This method sets the callback that can be used to generate error
     * messages for any instance
     * @param array|string Callback function/method
     */
    function setMessageCallback($msgCallback)
    {
        if (!$msgCallback) {
            $this->_msgCallback = array(&$this, 'getErrorMessage');
        } else {
            if (is_callable($msgCallback)) {
                $this->_msgCallback = $msgCallback;
            }
        }
    }
    
    /**
     * Get an error code => error message mapping callback
     * 
     * This method returns the current callback that can be used to generate error
     * messages
     * @return array|string|false Callback function/method or false if none
     */
    function getMessageCallback()
    {
        return $this->_msgCallback;
    }
    
    /**
     * Sets a default callback to be used by all error stacks
     * 
     * This method sets the callback that can be used to generate error
     * messages for a singleton
     * @param array|string Callback function/method
     * @param string Package name, or false for all packages
     */
    public static function setDefaultCallback($callback = false, $package = false)
    {
        if (!is_callable($callback)) {
            $callback = false;
        }
        $package = $package ? $package : '*';
        $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
    }
    
    /**
     * Set a callback that generates context information (location of error) for an error stack
     * 
     * This method sets the callback that can be used to generate context
     * information for an error.  Passing in NULL will disable context generation
     * and remove the expensive call to debug_backtrace()
     * @param array|string|null Callback function/method
     */
    function setContextCallback($contextCallback)
    {
        if ($contextCallback === null) {
            return $this->_contextCallback = false;
        }
        if (!$contextCallback) {
            $this->_contextCallback = array(&$this, 'getFileLine');
        } else {
            if (is_callable($contextCallback)) {
                $this->_contextCallback = $contextCallback;
            }
        }
    }
    
    /**
     * Set an error Callback
     * If set to a valid callback, this will be called every time an error
     * is pushed onto the stack.  The return value will be used to determine
     * whether to allow an error to be pushed or logged.
     * 
     * The return value must be one of the ERRORSTACK_* constants.
     * 
     * This functionality can be used to emulate PEAR's pushErrorHandling, and
     * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
     * the error stack or logging
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @see popCallback()
     * @param string|array $cb
     */
    function pushCallback($cb)
    {
        array_push($this->_errorCallback, $cb);
    }
    
    /**
     * Remove a callback from the error callback stack
     * @see pushCallback()
     * @return array|string|false
     */
    function popCallback()
    {
        if (!count($this->_errorCallback)) {
            return false;
        }
        return array_pop($this->_errorCallback);
    }
    
    /**
     * Set a temporary overriding error callback for every package error stack
     *
     * Use this to temporarily disable all existing callbacks (can be used
     * to emulate the @ operator, for instance)
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @see staticPopCallback(), pushCallback()
     * @param string|array $cb
     */
    public static function staticPushCallback($cb)
    {
        array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
    }
    
    /**
     * Remove a temporary overriding error callback
     * @see staticPushCallback()
     * @return array|string|false
     */
    public static function staticPopCallback()
    {
        $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
        if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
            $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
        }
        return $ret;
    }
    
    /**
     * Add an error to the stack
     * 
     * If the message generator exists, it is called with 2 parameters.
     *  - the current Error Stack object
     *  - an array that is in the same format as an error.  Available indices
     *    are 'code', 'package', 'time', 'params', 'level', and 'context'
     * 
     * Next, if the error should contain context information, this is
     * handled by the context grabbing method.
     * Finally, the error is pushed onto the proper error stack
     * @param int    $code      Package-specific error code
     * @param string $level     Error level.  This is NOT spell-checked
     * @param array  $params    associative array of error parameters
     * @param string $msg       Error message, or a portion of it if the message
     *                          is to be generated
     * @param array  $repackage If this error re-packages an error pushed by
     *                          another package, place the array returned from
     *                          {@link pop()} in this parameter
     * @param array  $backtrace Protected parameter: use this to pass in the
     *                          {@link debug_backtrace()} that should be used
     *                          to find error context
     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
     * thrown.  If a PEAR_Error is returned, the userinfo
     * property is set to the following array:
     * 
     * <code>
     * array(
     *    'code' => $code,
     *    'params' => $params,
     *    'package' => $this->_package,
     *    'level' => $level,
     *    'time' => time(),
     *    'context' => $context,
     *    'message' => $msg,
     * //['repackage' => $err] repackaged error array/Exception class
     * );
     * </code>
     * 
     * Normally, the previous array is returned.
     */
    function push($code, $level = 'error', $params = array(), $msg = false,
                  $repackage = false, $backtrace = false)
    {
        $context = false;
        // grab error context
        if ($this->_contextCallback) {
            if (!$backtrace) {
                $backtrace = debug_backtrace();
            }
            $context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
        }
        
        // save error
        $time = explode(' ', microtime());
        $time = $time[1] + $time[0];
        $err = array(
                'code' => $code,
                'params' => $params,
                'package' => $this->_package,
                'level' => $level,
                'time' => $time,
                'context' => $context,
                'message' => $msg,
               );

        if ($repackage) {
            $err['repackage'] = $repackage;
        }

        // set up the error message, if necessary
        if ($this->_msgCallback) {
            $msg = call_user_func_array($this->_msgCallback,
                                        array(&$this, $err));
            $err['message'] = $msg;
        }        
        $push = $log = true;
        $die = false;
        // try the overriding callback first
        $callback = $this->staticPopCallback();
        if ($callback) {
            $this->staticPushCallback($callback);
        }
        if (!is_callable($callback)) {
            // try the local callback next
            $callback = $this->popCallback();
            if (is_callable($callback)) {
                $this->pushCallback($callback);
            } else {
                // try the default callback
                $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ?
                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] :
                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*'];
            }
        }
        if (is_callable($callback)) {
            switch(call_user_func($callback, $err)){
            	case PEAR_ERRORSTACK_IGNORE: 
            		return $err;
        		break;
            	case PEAR_ERRORSTACK_PUSH: 
            		$log = false;
        		break;
            	case PEAR_ERRORSTACK_LOG: 
            		$push = false;
        		break;
            	case PEAR_ERRORSTACK_DIE: 
            		$die = true;
        		break;
                // anything else returned has the same effect as pushandlog
            }
        }
        if ($push) {
            array_unshift($this->_errors, $err);
            if (!isset($this->_errorsByLevel[$err['level']])) {
                $this->_errorsByLevel[$err['level']] = array();
            }
            $this->_errorsByLevel[$err['level']][] = &$this->_errors[0];
        }
        if ($log) {
            if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) {
                $this->_log($err);
            }
        }
        if ($die) {
            die();
        }
        if ($this->_compat && $push) {
            return $this->raiseError($msg, $code, null, null, $err);
        }
        return $err;
    }
    
    /**
     * Static version of {@link push()}
     * 
     * @param string $package   Package name this error belongs to
     * @param int    $code      Package-specific error code
     * @param string $level     Error level.  This is NOT spell-checked
     * @param array  $params    associative array of error parameters
     * @param string $msg       Error message, or a portion of it if the message
     *                          is to be generated
     * @param array  $repackage If this error re-packages an error pushed by
     *                          another package, place the array returned from
     *                          {@link pop()} in this parameter
     * @param array  $backtrace Protected parameter: use this to pass in the
     *                          {@link debug_backtrace()} that should be used
     *                          to find error context
     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
     *                          thrown.  see docs for {@link push()}
     */
    public static function staticPush(
        $package, $code, $level = 'error', $params = array(),
        $msg = false, $repackage = false, $backtrace = false
    ) {
        $s = &PEAR_ErrorStack::singleton($package);
        if ($s->_contextCallback) {
            if (!$backtrace) {
                if (function_exists('debug_backtrace')) {
                    $backtrace = debug_backtrace();
                }
            }
        }
        return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
    }
    
    /**
     * Log an error using PEAR::Log
     * @param array $err Error array
     * @param array $levels Error level => Log constant map
     * @access protected
     */
    function _log($err)
    {
        if ($this->_logger) {
            $logger = &$this->_logger;
        } else {
            $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'];
        }
        if (is_a($logger, 'Log')) {
            $levels = array(
                'exception' => PEAR_LOG_CRIT,
                'alert' => PEAR_LOG_ALERT,
                'critical' => PEAR_LOG_CRIT,
                'error' => PEAR_LOG_ERR,
                'warning' => PEAR_LOG_WARNING,
                'notice' => PEAR_LOG_NOTICE,
                'info' => PEAR_LOG_INFO,
                'debug' => PEAR_LOG_DEBUG);
            if (isset($levels[$err['level']])) {
                $level = $levels[$err['level']];
            } else {
                $level = PEAR_LOG_INFO;
            }
            $logger->log($err['message'], $level, $err);
        } else { // support non-standard logs
            call_user_func($logger, $err);
        }
    }

    
    /**
     * Pop an error off of the error stack
     * 
     * @return false|array
     * @since 0.4alpha it is no longer possible to specify a specific error
     * level to return - the last error pushed will be returned, instead
     */
    function pop()
    {
        $err = @array_shift($this->_errors);
        if (!is_null($err)) {
            @array_pop($this->_errorsByLevel[$err['level']]);
            if (!count($this->_errorsByLevel[$err['level']])) {
                unset($this->_errorsByLevel[$err['level']]);
            }
        }
        return $err;
    }

    /**
     * Pop an error off of the error stack, static method
     *
     * @param string package name
     * @return boolean
     * @since PEAR1.5.0a1
     */
    static function staticPop($package)
    {
        if ($package) {
            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
                return false;
            }
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
        }
    }

    /**
     * Determine whether there are any errors on the stack
     * @param string|array Level name.  Use to determine if any errors
     * of level (string), or levels (array) have been pushed
     * @return boolean
     */
    function hasErrors($level = false)
    {
        if ($level) {
            return isset($this->_errorsByLevel[$level]);
        }
        return count($this->_errors);
    }
    
    /**
     * Retrieve all errors since last purge
     * 
     * @param boolean set in order to empty the error stack
     * @param string level name, to return only errors of a particular severity
     * @return array
     */
    function getErrors($purge = false, $level = false)
    {
        if (!$purge) {
            if ($level) {
                if (!isset($this->_errorsByLevel[$level])) {
                    return array();
                } else {
                    return $this->_errorsByLevel[$level];
                }
            } else {
                return $this->_errors;
            }
        }
        if ($level) {
            $ret = $this->_errorsByLevel[$level];
            foreach ($this->_errorsByLevel[$level] as $i => $unused) {
                // entries are references to the $_errors array
                $this->_errorsByLevel[$level][$i] = false;
            }
            // array_filter removes all entries === false
            $this->_errors = array_filter($this->_errors);
            unset($this->_errorsByLevel[$level]);
            return $ret;
        }
        $ret = $this->_errors;
        $this->_errors = array();
        $this->_errorsByLevel = array();
        return $ret;
    }
    
    /**
     * Determine whether there are any errors on a single error stack, or on any error stack
     *
     * The optional parameter can be used to test the existence of any errors without the need of
     * singleton instantiation
     * @param string|false Package name to check for errors
     * @param string Level name to check for a particular severity
     * @return boolean
     */
    public static function staticHasErrors($package = false, $level = false)
    {
        if ($package) {
            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
                return false;
            }
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level);
        }
        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
            if ($obj->hasErrors($level)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Get a list of all errors since last purge, organized by package
     * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
     * @param boolean $purge Set to purge the error stack of existing errors
     * @param string  $level Set to a level name in order to retrieve only errors of a particular level
     * @param boolean $merge Set to return a flat array, not organized by package
     * @param array   $sortfunc Function used to sort a merged array - default
     *        sorts by time, and should be good for most cases
     *
     * @return array 
     */
    public static function staticGetErrors(
        $purge = false, $level = false, $merge = false,
        $sortfunc = array('PEAR_ErrorStack', '_sortErrors')
    ) {
        $ret = array();
        if (!is_callable($sortfunc)) {
            $sortfunc = array('PEAR_ErrorStack', '_sortErrors');
        }
        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
            $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level);
            if ($test) {
                if ($merge) {
                    $ret = array_merge($ret, $test);
                } else {
                    $ret[$package] = $test;
                }
            }
        }
        if ($merge) {
            usort($ret, $sortfunc);
        }
        return $ret;
    }
    
    /**
     * Error sorting function, sorts by time
     * @access private
     */
    public static function _sortErrors($a, $b)
    {
        if ($a['time'] == $b['time']) {
            return 0;
        }
        if ($a['time'] < $b['time']) {
            return 1;
        }
        return -1;
    }

    /**
     * Standard file/line number/function/class context callback
     *
     * This function uses a backtrace generated from {@link debug_backtrace()}
     * and so will not work at all in PHP < 4.3.0.  The frame should
     * reference the frame that contains the source of the error.
     * @return array|false either array('file' => file, 'line' => line,
     *         'function' => function name, 'class' => class name) or
     *         if this doesn't work, then false
     * @param unused
     * @param integer backtrace frame.
     * @param array Results of debug_backtrace()
     */
    public static function getFileLine($code, $params, $backtrace = null)
    {
        if ($backtrace === null) {
            return false;
        }
        $frame = 0;
        $functionframe = 1;
        if (!isset($backtrace[1])) {
            $functionframe = 0;
        } else {
            while (isset($backtrace[$functionframe]['function']) &&
                  $backtrace[$functionframe]['function'] == 'eval' &&
                  isset($backtrace[$functionframe + 1])) {
                $functionframe++;
            }
        }
        if (isset($backtrace[$frame])) {
            if (!isset($backtrace[$frame]['file'])) {
                $frame++;
            }
            $funcbacktrace = $backtrace[$functionframe];
            $filebacktrace = $backtrace[$frame];
            $ret = array('file' => $filebacktrace['file'],
                         'line' => $filebacktrace['line']);
            // rearrange for eval'd code or create function errors
            if (strpos($filebacktrace['file'], '(') && 
            	  preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'],
                  $matches)) {
                $ret['file'] = $matches[1];
                $ret['line'] = $matches[2] + 0;
            }
            if (isset($funcbacktrace['function']) && isset($backtrace[1])) {
                if ($funcbacktrace['function'] != 'eval') {
                    if ($funcbacktrace['function'] == '__lambda_func') {
                        $ret['function'] = 'create_function() code';
                    } else {
                        $ret['function'] = $funcbacktrace['function'];
                    }
                }
            }
            if (isset($funcbacktrace['class']) && isset($backtrace[1])) {
                $ret['class'] = $funcbacktrace['class'];
            }
            return $ret;
        }
        return false;
    }
    
    /**
     * Standard error message generation callback
     * 
     * This method may also be called by a custom error message generator
     * to fill in template values from the params array, simply
     * set the third parameter to the error message template string to use
     * 
     * The special variable %__msg% is reserved: use it only to specify
     * where a message passed in by the user should be placed in the template,
     * like so:
     * 
     * Error message: %msg% - internal error
     * 
     * If the message passed like so:
     * 
     * <code>
     * $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
     * </code>
     * 
     * The returned error message will be "Error message: server error 500 -
     * internal error"
     * @param PEAR_ErrorStack
     * @param array
     * @param string|false Pre-generated error message template
     *
     * @return string
     */
    public static function getErrorMessage(&$stack, $err, $template = false)
    {
        if ($template) {
            $mainmsg = $template;
        } else {
            $mainmsg = $stack->getErrorMessageTemplate($err['code']);
        }
        $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg);
        if (is_array($err['params']) && count($err['params'])) {
            foreach ($err['params'] as $name => $val) {
                if (is_array($val)) {
                    // @ is needed in case $val is a multi-dimensional array
                    $val = @implode(', ', $val);
                }
                if (is_object($val)) {
                    if (method_exists($val, '__toString')) {
                        $val = $val->__toString();
                    } else {
                        PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING,
                            'warning', array('obj' => get_class($val)),
                            'object %obj% passed into getErrorMessage, but has no __toString() method');
                        $val = 'Object';
                    }
                }
                $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg);
            }
        }
        return $mainmsg;
    }
    
    /**
     * Standard Error Message Template generator from code
     * @return string
     */
    function getErrorMessageTemplate($code)
    {
        if (!isset($this->_errorMsgs[$code])) {
            return '%__msg%';
        }
        return $this->_errorMsgs[$code];
    }
    
    /**
     * Set the Error Message Template array
     * 
     * The array format must be:
     * <pre>
     * array(error code => 'message template',...)
     * </pre>
     * 
     * Error message parameters passed into {@link push()} will be used as input
     * for the error message.  If the template is 'message %foo% was %bar%', and the
     * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
     * be 'message one was six'
     * @return string
     */
    function setErrorMessageTemplate($template)
    {
        $this->_errorMsgs = $template;
    }
    
    
    /**
     * emulate PEAR::raiseError()
     * 
     * @return PEAR_Error
     */
    function raiseError()
    {
        require_once 'PEAR.php';
        $args = func_get_args();
        return call_user_func_array(array('PEAR', 'raiseError'), $args);
    }
}
$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
?>
pear/PEAR/Dependency2.php000064400000142416151732710120011102 0ustar00<?php
/**
 * PEAR_Dependency2, advanced dependency validation
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Required for the PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';

/**
 * Dependency check for PEAR packages
 *
 * This class handles both version 1.0 and 2.0 dependencies
 * WARNING: *any* changes to this class must be duplicated in the
 * test_PEAR_Dependency2 class found in tests/PEAR_Dependency2/setup.php.inc,
 * or unit tests will not actually validate the changes
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Dependency2
{
    /**
     * One of the PEAR_VALIDATE_* states
     * @see PEAR_VALIDATE_NORMAL
     * @var integer
     */
    var $_state;

    /**
     * Command-line options to install/upgrade/uninstall commands
     * @param array
     */
    var $_options;

    /**
     * @var OS_Guess
     */
    var $_os;

    /**
     * @var PEAR_Registry
     */
    var $_registry;

    /**
     * @var PEAR_Config
     */
    var $_config;

    /**
     * @var PEAR_DependencyDB
     */
    var $_dependencydb;

    /**
     * Output of PEAR_Registry::parsedPackageName()
     * @var array
     */
    var $_currentPackage;

    /**
     * @param PEAR_Config
     * @param array installation options
     * @param array format of PEAR_Registry::parsedPackageName()
     * @param int installation state (one of PEAR_VALIDATE_*)
     */
    function __construct(&$config, $installoptions, $package,
                              $state = PEAR_VALIDATE_INSTALLING)
    {
        $this->_config = &$config;
        if (!class_exists('PEAR_DependencyDB')) {
            require_once 'PEAR/DependencyDB.php';
        }

        if (isset($installoptions['packagingroot'])) {
            // make sure depdb is in the right location
            $config->setInstallRoot($installoptions['packagingroot']);
        }

        $this->_registry = &$config->getRegistry();
        $this->_dependencydb = &PEAR_DependencyDB::singleton($config);
        if (isset($installoptions['packagingroot'])) {
            $config->setInstallRoot(false);
        }

        $this->_options = $installoptions;
        $this->_state = $state;
        if (!class_exists('OS_Guess')) {
            require_once 'OS/Guess.php';
        }

        $this->_os = new OS_Guess;
        $this->_currentPackage = $package;
    }

    static function _getExtraString($dep)
    {
        $extra = ' (';
        if (isset($dep['uri'])) {
            return '';
        }

        if (isset($dep['recommended'])) {
            $extra .= 'recommended version ' . $dep['recommended'];
        } else {
            if (isset($dep['min'])) {
                $extra .= 'version >= ' . $dep['min'];
            }

            if (isset($dep['max'])) {
                if ($extra != ' (') {
                    $extra .= ', ';
                }
                $extra .= 'version <= ' . $dep['max'];
            }

            if (isset($dep['exclude'])) {
                if (!is_array($dep['exclude'])) {
                    $dep['exclude'] = array($dep['exclude']);
                }

                if ($extra != ' (') {
                    $extra .= ', ';
                }

                $extra .= 'excluded versions: ';
                foreach ($dep['exclude'] as $i => $exclude) {
                    if ($i) {
                        $extra .= ', ';
                    }
                    $extra .= $exclude;
                }
            }
        }

        $extra .= ')';
        if ($extra == ' ()') {
            $extra = '';
        }

        return $extra;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getPHP_OS()
    {
        return PHP_OS;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getsysname()
    {
        return $this->_os->getSysname();
    }

    /**
     * Specify a dependency on an OS.  Use arch for detailed os/processor information
     *
     * There are two generic OS dependencies that will be the most common, unix and windows.
     * Other options are linux, freebsd, darwin (OS X), sunos, irix, hpux, aix
     */
    function validateOsDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING && $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        if ($dep['name'] == '*') {
            return true;
        }

        $not = isset($dep['conflicts']) ? true : false;
        switch (strtolower($dep['name'])) {
            case 'windows' :
                if ($not) {
                    if (strtolower(substr($this->getPHP_OS(), 0, 3)) == 'win') {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Cannot install %s on Windows");
                        }

                        return $this->warning("warning: Cannot install %s on Windows");
                    }
                } else {
                    if (strtolower(substr($this->getPHP_OS(), 0, 3)) != 'win') {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Can only install %s on Windows");
                        }

                        return $this->warning("warning: Can only install %s on Windows");
                    }
                }
            break;
            case 'unix' :
                $unices = array('linux', 'freebsd', 'darwin', 'sunos', 'irix', 'hpux', 'aix');
                if ($not) {
                    if (in_array($this->getSysname(), $unices)) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Cannot install %s on any Unix system");
                        }

                        return $this->warning( "warning: Cannot install %s on any Unix system");
                    }
                } else {
                    if (!in_array($this->getSysname(), $unices)) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Can only install %s on a Unix system");
                        }

                        return $this->warning("warning: Can only install %s on a Unix system");
                    }
                }
            break;
            default :
                if ($not) {
                    if (strtolower($dep['name']) == strtolower($this->getSysname())) {
                        if (!isset($this->_options['nodeps']) &&
                              !isset($this->_options['force'])) {
                            return $this->raiseError('Cannot install %s on ' . $dep['name'] .
                                ' operating system');
                        }

                        return $this->warning('warning: Cannot install %s on ' .
                            $dep['name'] . ' operating system');
                    }
                } else {
                    if (strtolower($dep['name']) != strtolower($this->getSysname())) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError('Cannot install %s on ' .
                                $this->getSysname() .
                                ' operating system, can only install on ' . $dep['name']);
                        }

                        return $this->warning('warning: Cannot install %s on ' .
                            $this->getSysname() .
                            ' operating system, can only install on ' . $dep['name']);
                    }
                }
        }
        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function matchSignature($pattern)
    {
        return $this->_os->matchSignature($pattern);
    }

    /**
     * Specify a complex dependency on an OS/processor/kernel version,
     * Use OS for simple operating system dependency.
     *
     * This is the only dependency that accepts an eregable pattern.  The pattern
     * will be matched against the php_uname() output parsed by OS_Guess
     */
    function validateArchDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING) {
            return true;
        }

        $not = isset($dep['conflicts']) ? true : false;
        if (!$this->matchSignature($dep['pattern'])) {
            if (!$not) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s Architecture dependency failed, does not ' .
                        'match "' . $dep['pattern'] . '"');
                }

                return $this->warning('warning: %s Architecture dependency failed, does ' .
                    'not match "' . $dep['pattern'] . '"');
            }

            return true;
        }

        if ($not) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s Architecture dependency failed, required "' .
                    $dep['pattern'] . '"');
            }

            return $this->warning('warning: %s Architecture dependency failed, ' .
                'required "' . $dep['pattern'] . '"');
        }

        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function extension_loaded($name)
    {
        return extension_loaded($name);
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function phpversion($name = null)
    {
        if ($name !== null) {
            return phpversion($name);
        }

        return phpversion();
    }

    function validateExtensionDependency($dep, $required = true)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        $loaded = $this->extension_loaded($dep['name']);
        $extra  = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (!isset($dep['min']) && !isset($dep['max']) &&
            !isset($dep['recommended']) && !isset($dep['exclude'])
        ) {
            if ($loaded) {
                if (isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with PHP extension "' .
                            $dep['name'] . '"' . $extra);
                    }

                    return $this->warning('warning: %s conflicts with PHP extension "' .
                        $dep['name'] . '"' . $extra);
                }

                return true;
            }

            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP extension "' .
                        $dep['name'] . '"' . $extra);
                }

                return $this->warning('warning: %s requires PHP extension "' .
                    $dep['name'] . '"' . $extra);
            }

            return $this->warning('%s can optionally use PHP extension "' .
                $dep['name'] . '"' . $extra);
        }

        if (!$loaded) {
            if (isset($dep['conflicts'])) {
                return true;
            }

            if (!$required) {
                return $this->warning('%s can optionally use PHP extension "' .
                    $dep['name'] . '"' . $extra);
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PHP extension "' . $dep['name'] .
                    '"' . $extra);
            }

            return $this->warning('warning: %s requires PHP extension "' . $dep['name'] .
                    '"' . $extra);
        }

        $version = (string) $this->phpversion($dep['name']);
        if (empty($version)) {
            $version = '0';
        }

        $fail = false;
        if (isset($dep['min']) && !version_compare($version, $dep['min'], '>=')) {
            $fail = true;
        }

        if (isset($dep['max']) && !version_compare($version, $dep['max'], '<=')) {
            $fail = true;
        }

        if ($fail && !isset($dep['conflicts'])) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PHP extension "' . $dep['name'] .
                    '"' . $extra . ', installed version is ' . $version);
            }

            return $this->warning('warning: %s requires PHP extension "' . $dep['name'] .
                '"' . $extra . ', installed version is ' . $version);
        } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && isset($dep['conflicts'])) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s conflicts with PHP extension "' .
                    $dep['name'] . '"' . $extra . ', installed version is ' . $version);
            }

            return $this->warning('warning: %s conflicts with PHP extension "' .
                $dep['name'] . '"' . $extra . ', installed version is ' . $version);
        }

        if (isset($dep['exclude'])) {
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==')) {
                    if (isset($dep['conflicts'])) {
                        continue;
                    }

                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PHP extension "' .
                            $dep['name'] . '" version ' .
                            $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with PHP extension "' .
                        $dep['name'] . '" version ' .
                        $exclude);
                } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with PHP extension "' .
                            $dep['name'] . '"' . $extra . ', installed version is ' . $version);
                    }

                    return $this->warning('warning: %s conflicts with PHP extension "' .
                        $dep['name'] . '"' . $extra . ', installed version is ' . $version);
                }
            }
        }

        if (isset($dep['recommended'])) {
            if (version_compare($version, $dep['recommended'], '==')) {
                return true;
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s dependency: PHP extension ' . $dep['name'] .
                    ' version "' . $version . '"' .
                    ' is not the recommended version "' . $dep['recommended'] .
                    '", but may be compatible, use --force to install');
            }

            return $this->warning('warning: %s dependency: PHP extension ' .
                $dep['name'] . ' version "' . $version . '"' .
                ' is not the recommended version "' . $dep['recommended'].'"');
        }

        return true;
    }

    function validatePhpDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        $version = $this->phpversion();
        $extra   = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (isset($dep['min'])) {
            if (!version_compare($version, $dep['min'], '>=')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP' .
                        $extra . ', installed version is ' . $version);
                }

                return $this->warning('warning: %s requires PHP' .
                    $extra . ', installed version is ' . $version);
            }
        }

        if (isset($dep['max'])) {
            if (!version_compare($version, $dep['max'], '<=')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP' .
                        $extra . ', installed version is ' . $version);
                }

                return $this->warning('warning: %s requires PHP' .
                    $extra . ', installed version is ' . $version);
            }
        }

        if (isset($dep['exclude'])) {
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==')) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PHP version ' .
                            $exclude);
                    }

                    return $this->warning(
                        'warning: %s is not compatible with PHP version ' .
                        $exclude);
                }
            }
        }

        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getPEARVersion()
    {
        return '1.10.16';
    }

    function validatePearinstallerDependency($dep)
    {
        $pearversion = $this->getPEARVersion();
        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (version_compare($pearversion, $dep['min'], '<')) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PEAR Installer' . $extra .
                    ', installed version is ' . $pearversion);
            }

            return $this->warning('warning: %s requires PEAR Installer' . $extra .
                ', installed version is ' . $pearversion);
        }

        if (isset($dep['max'])) {
            if (version_compare($pearversion, $dep['max'], '>')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PEAR Installer' . $extra .
                        ', installed version is ' . $pearversion);
                }

                return $this->warning('warning: %s requires PEAR Installer' . $extra .
                    ', installed version is ' . $pearversion);
            }
        }

        if (isset($dep['exclude'])) {
            if (!isset($dep['exclude'][0])) {
                $dep['exclude'] = array($dep['exclude']);
            }

            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($exclude, $pearversion, '==')) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PEAR Installer ' .
                            'version ' . $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with PEAR ' .
                        'Installer version ' . $exclude);
                }
            }
        }

        return true;
    }

    function validateSubpackageDependency($dep, $required, $params)
    {
        return $this->validatePackageDependency($dep, $required, $params);
    }

    /**
     * @param array dependency information (2.0 format)
     * @param boolean whether this is a required dependency
     * @param array a list of downloaded packages to be installed, if any
     * @param boolean if true, then deps on pear.php.net that fail will also check
     *                against pecl.php.net packages to accommodate extensions that have
     *                moved to pecl.php.net from pear.php.net
     */
    function validatePackageDependency($dep, $required, $params, $depv1 = false)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        if (isset($dep['providesextension'])) {
            if ($this->extension_loaded($dep['providesextension'])) {
                $save = $dep;
                $subdep = $dep;
                $subdep['name'] = $subdep['providesextension'];
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $ret = $this->validateExtensionDependency($subdep, $required);
                PEAR::popErrorHandling();
                if (!PEAR::isError($ret)) {
                    return true;
                }
            }
        }

        if ($this->_state == PEAR_VALIDATE_INSTALLING) {
            return $this->_validatePackageInstall($dep, $required, $depv1);
        }

        if ($this->_state == PEAR_VALIDATE_DOWNLOADING) {
            return $this->_validatePackageDownload($dep, $required, $params, $depv1);
        }
    }

    function _validatePackageDownload($dep, $required, $params, $depv1 = false)
    {
        $dep['package'] = $dep['name'];
        if (isset($dep['uri'])) {
            $dep['channel'] = '__uri';
        }

        $depname = $this->_registry->parsedPackageNameToString($dep, true);
        $found = false;
        foreach ($params as $param) {
            if ($param->isEqual(
                  array('package' => $dep['name'],
                        'channel' => $dep['channel']))) {
                $found = true;
                break;
            }

            if ($depv1 && $dep['channel'] == 'pear.php.net') {
                if ($param->isEqual(
                  array('package' => $dep['name'],
                        'channel' => 'pecl.php.net'))) {
                    $found = true;
                    break;
                }
            }
        }

        if (!$found && isset($dep['providesextension'])) {
            foreach ($params as $param) {
                if ($param->isExtension($dep['providesextension'])) {
                    $found = true;
                    break;
                }
            }
        }

        if ($found) {
            $version = $param->getVersion();
            $installed = false;
            $downloaded = true;
        } else {
            if ($this->_registry->packageExists($dep['name'], $dep['channel'])) {
                $installed = true;
                $downloaded = false;
                $version = $this->_registry->packageinfo($dep['name'], 'version',
                    $dep['channel']);
            } else {
                if ($dep['channel'] == 'pecl.php.net' && $this->_registry->packageExists($dep['name'],
                      'pear.php.net')) {
                    $installed = true;
                    $downloaded = false;
                    $version = $this->_registry->packageinfo($dep['name'], 'version',
                        'pear.php.net');
                } else {
                    $version = 'not installed or downloaded';
                    $installed = false;
                    $downloaded = false;
                }
            }
        }

        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude']) && !is_array($dep['exclude'])) {
            $dep['exclude'] = array($dep['exclude']);
        }

        if (!isset($dep['min']) && !isset($dep['max']) &&
              !isset($dep['recommended']) && !isset($dep['exclude'])
        ) {
            if ($installed || $downloaded) {
                $installed = $installed ? 'installed' : 'downloaded';
                if (isset($dep['conflicts'])) {
                    $rest = '';
                    if ($version) {
                        $rest = ", $installed version is " . $version;
                    }

                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . $rest);
                    }

                    return $this->warning('warning: %s conflicts with package "' . $depname . '"' . $extra . $rest);
                }

                return true;
            }

            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires package "' . $depname . '"' . $extra);
                }

                return $this->warning('warning: %s requires package "' . $depname . '"' . $extra);
            }

            return $this->warning('%s can optionally use package "' . $depname . '"' . $extra);
        }

        if (!$installed && !$downloaded) {
            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires package "' . $depname . '"' . $extra);
                }

                return $this->warning('warning: %s requires package "' . $depname . '"' . $extra);
            }

            return $this->warning('%s can optionally use package "' . $depname . '"' . $extra);
        }

        $fail = false;
        if (isset($dep['min']) && version_compare($version, $dep['min'], '<')) {
            $fail = true;
        }

        if (isset($dep['max']) && version_compare($version, $dep['max'], '>')) {
            $fail = true;
        }

        if ($fail && !isset($dep['conflicts'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            $dep['package'] = $dep['name'];
            $dep = $this->_registry->parsedPackageNameToString($dep, true);
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires package "' . $depname . '"' .
                    $extra . ", $installed version is " . $version);
            }

            return $this->warning('warning: %s requires package "' . $depname . '"' .
                $extra . ", $installed version is " . $version);
        } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail &&
              isset($dep['conflicts']) && !isset($dep['exclude'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra .
                    ", $installed version is " . $version);
            }

            return $this->warning('warning: %s conflicts with package "' . $depname . '"' .
                $extra . ", $installed version is " . $version);
        }

        if (isset($dep['exclude'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==') && !isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) &&
                          !isset($this->_options['force'])
                    ) {
                        return $this->raiseError('%s is not compatible with ' .
                            $installed . ' package "' .
                            $depname . '" version ' .
                            $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with ' .
                        $installed . ' package "' .
                        $depname . '" version ' .
                        $exclude);
                } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) {
                    $installed = $installed ? 'installed' : 'downloaded';
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with package "' . $depname . '"' .
                            $extra . ", $installed version is " . $version);
                    }

                    return $this->warning('warning: %s conflicts with package "' . $depname . '"' .
                        $extra . ", $installed version is " . $version);
                }
            }
        }

        if (isset($dep['recommended'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            if (version_compare($version, $dep['recommended'], '==')) {
                return true;
            }

            if (!$found && $installed) {
                $param = $this->_registry->getPackage($dep['name'], $dep['channel']);
            }

            if ($param) {
                $found = false;
                foreach ($params as $parent) {
                    if ($parent->isEqual($this->_currentPackage)) {
                        $found = true;
                        break;
                    }
                }

                if ($found) {
                    if ($param->isCompatible($parent)) {
                        return true;
                    }
                } else { // this is for validPackage() calls
                    $parent = $this->_registry->getPackage($this->_currentPackage['package'],
                        $this->_currentPackage['channel']);
                    if ($parent !== null && $param->isCompatible($parent)) {
                        return true;
                    }
                }
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force']) &&
                  !isset($this->_options['loose'])
            ) {
                return $this->raiseError('%s dependency package "' . $depname .
                    '" ' . $installed . ' version ' . $version .
                    ' is not the recommended version ' . $dep['recommended'] .
                    ', but may be compatible, use --force to install');
            }

            return $this->warning('warning: %s dependency package "' . $depname .
                '" ' . $installed . ' version ' . $version .
                ' is not the recommended version ' . $dep['recommended']);
        }

        return true;
    }

    function _validatePackageInstall($dep, $required, $depv1 = false)
    {
        return $this->_validatePackageDownload($dep, $required, array(), $depv1);
    }

    /**
     * Verify that uninstalling packages passed in to command line is OK.
     *
     * @param PEAR_Installer $dl
     * @return PEAR_Error|true
     */
    function validatePackageUninstall(&$dl)
    {
        if (PEAR::isError($this->_dependencydb)) {
            return $this->_dependencydb;
        }

        $params = array();
        // construct an array of "downloaded" packages to fool the package dependency checker
        // into using these to validate uninstalls of circular dependencies
        $downloaded = &$dl->getUninstallPackages();
        foreach ($downloaded as $i => $pf) {
            if (!class_exists('PEAR_Downloader_Package')) {
                require_once 'PEAR/Downloader/Package.php';
            }
            $dp = new PEAR_Downloader_Package($dl);
            $dp->setPackageFile($downloaded[$i]);
            $params[$i] = $dp;
        }

        // check cache
        $memyselfandI = strtolower($this->_currentPackage['channel']) . '/' .
            strtolower($this->_currentPackage['package']);
        if (isset($dl->___uninstall_package_cache)) {
            $badpackages = $dl->___uninstall_package_cache;
            if (isset($badpackages[$memyselfandI]['warnings'])) {
                foreach ($badpackages[$memyselfandI]['warnings'] as $warning) {
                    $dl->log(0, $warning[0]);
                }
            }

            if (isset($badpackages[$memyselfandI]['errors'])) {
                foreach ($badpackages[$memyselfandI]['errors'] as $error) {
                    if (is_array($error)) {
                        $dl->log(0, $error[0]);
                    } else {
                        $dl->log(0, $error->getMessage());
                    }
                }

                if (isset($this->_options['nodeps']) || isset($this->_options['force'])) {
                    return $this->warning(
                        'warning: %s should not be uninstalled, other installed packages depend ' .
                        'on this package');
                }

                return $this->raiseError(
                    '%s cannot be uninstalled, other installed packages depend on this package');
            }

            return true;
        }

        // first, list the immediate parents of each package to be uninstalled
        $perpackagelist = array();
        $allparents = array();
        foreach ($params as $i => $param) {
            $a = array(
                'channel' => strtolower($param->getChannel()),
                'package' => strtolower($param->getPackage())
            );

            $deps = $this->_dependencydb->getDependentPackages($a);
            if ($deps) {
                foreach ($deps as $d) {
                    $pardeps = $this->_dependencydb->getDependencies($d);
                    foreach ($pardeps as $dep) {
                        if (strtolower($dep['dep']['channel']) == $a['channel'] &&
                              strtolower($dep['dep']['name']) == $a['package']) {
                            if (!isset($perpackagelist[$a['channel'] . '/' . $a['package']])) {
                                $perpackagelist[$a['channel'] . '/' . $a['package']] = array();
                            }
                            $perpackagelist[$a['channel'] . '/' . $a['package']][]
                                = array($d['channel'] . '/' . $d['package'], $dep);
                            if (!isset($allparents[$d['channel'] . '/' . $d['package']])) {
                                $allparents[$d['channel'] . '/' . $d['package']] = array();
                            }
                            if (!isset($allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']])) {
                                $allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']] = array();
                            }
                            $allparents[$d['channel'] . '/' . $d['package']]
                                       [$a['channel'] . '/' . $a['package']][]
                                = array($d, $dep);
                        }
                    }
                }
            }
        }

        // next, remove any packages from the parents list that are not installed
        $remove = array();
        foreach ($allparents as $parent => $d1) {
            foreach ($d1 as $d) {
                if ($this->_registry->packageExists($d[0][0]['package'], $d[0][0]['channel'])) {
                    continue;
                }
                $remove[$parent] = true;
            }
        }

        // next remove any packages from the parents list that are not passed in for
        // uninstallation
        foreach ($allparents as $parent => $d1) {
            foreach ($d1 as $d) {
                foreach ($params as $param) {
                    if (strtolower($param->getChannel()) == $d[0][0]['channel'] &&
                          strtolower($param->getPackage()) == $d[0][0]['package']) {
                        // found it
                        continue 3;
                    }
                }
                $remove[$parent] = true;
            }
        }

        // remove all packages whose dependencies fail
        // save which ones failed for error reporting
        $badchildren = array();
        do {
            $fail = false;
            foreach ($remove as $package => $unused) {
                if (!isset($allparents[$package])) {
                    continue;
                }

                foreach ($allparents[$package] as $kid => $d1) {
                    foreach ($d1 as $depinfo) {
                        if ($depinfo[1]['type'] != 'optional') {
                            if (isset($badchildren[$kid])) {
                                continue;
                            }
                            $badchildren[$kid] = true;
                            $remove[$kid] = true;
                            $fail = true;
                            continue 2;
                        }
                    }
                }
                if ($fail) {
                    // start over, we removed some children
                    continue 2;
                }
            }
        } while ($fail);

        // next, construct the list of packages that can't be uninstalled
        $badpackages = array();
        $save = $this->_currentPackage;
        foreach ($perpackagelist as $package => $packagedeps) {
            foreach ($packagedeps as $parent) {
                if (!isset($remove[$parent[0]])) {
                    continue;
                }

                $packagename = $this->_registry->parsePackageName($parent[0]);
                $packagename['channel'] = $this->_registry->channelAlias($packagename['channel']);
                $pa = $this->_registry->getPackage($packagename['package'], $packagename['channel']);
                $packagename['package'] = $pa->getPackage();
                $this->_currentPackage = $packagename;
                // parent is not present in uninstall list, make sure we can actually
                // uninstall it (parent dep is optional)
                $parentname['channel'] = $this->_registry->channelAlias($parent[1]['dep']['channel']);
                $pa = $this->_registry->getPackage($parent[1]['dep']['name'], $parent[1]['dep']['channel']);
                $parentname['package'] = $pa->getPackage();
                $parent[1]['dep']['package'] = $parentname['package'];
                $parent[1]['dep']['channel'] = $parentname['channel'];
                if ($parent[1]['type'] == 'optional') {
                    $test = $this->_validatePackageUninstall($parent[1]['dep'], false, $dl);
                    if ($test !== true) {
                        $badpackages[$package]['warnings'][] = $test;
                    }
                } else {
                    $test = $this->_validatePackageUninstall($parent[1]['dep'], true, $dl);
                    if ($test !== true) {
                        $badpackages[$package]['errors'][] = $test;
                    }
                }
            }
        }

        $this->_currentPackage          = $save;
        $dl->___uninstall_package_cache = $badpackages;
        if (isset($badpackages[$memyselfandI])) {
            if (isset($badpackages[$memyselfandI]['warnings'])) {
                foreach ($badpackages[$memyselfandI]['warnings'] as $warning) {
                    $dl->log(0, $warning[0]);
                }
            }

            if (isset($badpackages[$memyselfandI]['errors'])) {
                foreach ($badpackages[$memyselfandI]['errors'] as $error) {
                    if (is_array($error)) {
                        $dl->log(0, $error[0]);
                    } else {
                        $dl->log(0, $error->getMessage());
                    }
                }

                if (isset($this->_options['nodeps']) || isset($this->_options['force'])) {
                    return $this->warning(
                        'warning: %s should not be uninstalled, other installed packages depend ' .
                        'on this package');
                }

                return $this->raiseError(
                    '%s cannot be uninstalled, other installed packages depend on this package');
            }
        }

        return true;
    }

    function _validatePackageUninstall($dep, $required, $dl)
    {
        $depname = $this->_registry->parsedPackageNameToString($dep, true);
        $version = $this->_registry->packageinfo($dep['package'], 'version', $dep['channel']);
        if (!$version) {
            return true;
        }

        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude']) && !is_array($dep['exclude'])) {
            $dep['exclude'] = array($dep['exclude']);
        }

        if (isset($dep['conflicts'])) {
            return true; // uninstall OK - these packages conflict (probably installed with --force)
        }

        if (!isset($dep['min']) && !isset($dep['max'])) {
            if (!$required) {
                return $this->warning('"' . $depname . '" can be optionally used by ' .
                        'installed package %s' . $extra);
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('"' . $depname . '" is required by ' .
                    'installed package %s' . $extra);
            }

            return $this->warning('warning: "' . $depname . '" is required by ' .
                'installed package %s' . $extra);
        }

        $fail = false;
        if (isset($dep['min']) && version_compare($version, $dep['min'], '>=')) {
            $fail = true;
        }

        if (isset($dep['max']) && version_compare($version, $dep['max'], '<=')) {
            $fail = true;
        }

        // we re-use this variable, preserve the original value
        $saverequired = $required;
        if (!$required) {
            return $this->warning($depname . $extra . ' can be optionally used by installed package' .
                    ' "%s"');
        }

        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
            return $this->raiseError($depname . $extra . ' is required by installed package' .
                ' "%s"');
        }

        return $this->raiseError('warning: ' . $depname . $extra .
            ' is required by installed package "%s"');
    }

    /**
     * validate a downloaded package against installed packages
     *
     * As of PEAR 1.4.3, this will only validate
     *
     * @param array|PEAR_Downloader_Package|PEAR_PackageFile_v1|PEAR_PackageFile_v2
     *              $pkg package identifier (either
     *                   array('package' => blah, 'channel' => blah) or an array with
     *                   index 'info' referencing an object)
     * @param PEAR_Downloader $dl
     * @param array $params full list of packages to install
     * @return true|PEAR_Error
     */
    function validatePackage($pkg, &$dl, $params = array())
    {
        if (is_array($pkg) && isset($pkg['info'])) {
            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg['info']);
        } else {
            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg);
        }

        $fail = false;
        if ($deps) {
            if (!class_exists('PEAR_Downloader_Package')) {
                require_once 'PEAR/Downloader/Package.php';
            }

            $dp = new PEAR_Downloader_Package($dl);
            if (is_object($pkg)) {
                $dp->setPackageFile($pkg);
            } else {
                $dp->setDownloadURL($pkg);
            }

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($deps as $channel => $info) {
                foreach ($info as $package => $ds) {
                    foreach ($params as $packd) {
                        if (strtolower($packd->getPackage()) == strtolower($package) &&
                              $packd->getChannel() == $channel) {
                            $dl->log(3, 'skipping installed package check of "' .
                                        $this->_registry->parsedPackageNameToString(
                                            array('channel' => $channel, 'package' => $package),
                                            true) .
                                        '", version "' . $packd->getVersion() . '" will be ' .
                                        'downloaded and installed');
                            continue 2; // jump to next package
                        }
                    }

                    foreach ($ds as $d) {
                        $checker = new PEAR_Dependency2($this->_config, $this->_options,
                            array('channel' => $channel, 'package' => $package), $this->_state);
                        $dep = $d['dep'];
                        $required = $d['type'] == 'required';
                        $ret = $checker->_validatePackageDownload($dep, $required, array(&$dp));
                        if (is_array($ret)) {
                            $dl->log(0, $ret[0]);
                        } elseif (PEAR::isError($ret)) {
                            $dl->log(0, $ret->getMessage());
                            $fail = true;
                        }
                    }
                }
            }
            PEAR::popErrorHandling();
        }

        if ($fail) {
            return $this->raiseError(
                '%s cannot be installed, conflicts with installed packages');
        }

        return true;
    }

    /**
     * validate a package.xml 1.0 dependency
     */
    function validateDependency1($dep, $params = array())
    {
        if (!isset($dep['optional'])) {
            $dep['optional'] = 'no';
        }

        list($newdep, $type) = self::normalizeDep($dep);
        if (!$newdep) {
            return $this->raiseError("Invalid Dependency");
        }

        if (method_exists($this, "validate{$type}Dependency")) {
            return $this->{"validate{$type}Dependency"}($newdep, $dep['optional'] == 'no',
                $params, true);
        }
    }

    /**
     * Convert a 1.0 dep into a 2.0 dep
     */
    static function normalizeDep($dep)
    {
        $types = array(
            'pkg' => 'Package',
            'ext' => 'Extension',
            'os' => 'Os',
            'php' => 'Php'
        );

        if (!isset($types[$dep['type']])) {
            return array(false, false);
        }

        $type = $types[$dep['type']];

        $newdep = array();
        switch ($type) {
            case 'Package' :
                $newdep['channel'] = 'pear.php.net';
            case 'Extension' :
            case 'Os' :
                $newdep['name'] = $dep['name'];
            break;
        }

        $dep['rel'] = PEAR_Dependency2::signOperator($dep['rel']);
        switch ($dep['rel']) {
            case 'has' :
                return array($newdep, $type);
            break;
            case 'not' :
                $newdep['conflicts'] = true;
            break;
            case '>=' :
            case '>' :
                $newdep['min'] = $dep['version'];
                if ($dep['rel'] == '>') {
                    $newdep['exclude'] = $dep['version'];
                }
            break;
            case '<=' :
            case '<' :
                $newdep['max'] = $dep['version'];
                if ($dep['rel'] == '<') {
                    $newdep['exclude'] = $dep['version'];
                }
            break;
            case 'ne' :
            case '!=' :
                $newdep['min'] = '0';
                $newdep['max'] = '100000';
                $newdep['exclude'] = $dep['version'];
            break;
            case '==' :
                $newdep['min'] = $dep['version'];
                $newdep['max'] = $dep['version'];
            break;
        }
        if ($type == 'Php') {
            if (!isset($newdep['min'])) {
                $newdep['min'] = '4.4.0';
            }

            if (!isset($newdep['max'])) {
                $newdep['max'] = '6.0.0';
            }
        }
        return array($newdep, $type);
    }

    /**
     * Converts text comparing operators to them sign equivalents
     *
     * Example: 'ge' to '>='
     *
     * @access public
     * @param  string Operator
     * @return string Sign equivalent
     */
    static function signOperator($operator)
    {
        switch($operator) {
            case 'lt': return '<';
            case 'le': return '<=';
            case 'gt': return '>';
            case 'ge': return '>=';
            case 'eq': return '==';
            case 'ne': return '!=';
            default:
                return $operator;
        }
    }

    function raiseError($msg)
    {
        if (isset($this->_options['ignore-errors'])) {
            return $this->warning($msg);
        }

        return PEAR::raiseError(sprintf($msg, $this->_registry->parsedPackageNameToString(
            $this->_currentPackage, true)));
    }

    function warning($msg)
    {
        return array(sprintf($msg, $this->_registry->parsedPackageNameToString(
            $this->_currentPackage, true)));
    }
}
pear/PEAR/ChannelFile.php000064400000143234151732710120011111 0ustar00<?php
/**
 * PEAR_ChannelFile, the channel handling class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR/ErrorStack.php';
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/Common.php';

/**
 * Error code if the channel.xml <channel> tag does not contain a valid version
 */
define('PEAR_CHANNELFILE_ERROR_NO_VERSION', 1);
/**
 * Error code if the channel.xml <channel> tag version is not supported (version 1.0 is the only supported version,
 * currently
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_VERSION', 2);

/**
 * Error code if parsing is attempted with no xml extension
 */
define('PEAR_CHANNELFILE_ERROR_NO_XML_EXT', 3);

/**
 * Error code if creating the xml parser resource fails
 */
define('PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER', 4);

/**
 * Error code used for all sax xml parsing errors
 */
define('PEAR_CHANNELFILE_ERROR_PARSER_ERROR', 5);

/**#@+
 * Validation errors
 */
/**
 * Error code when channel name is missing
 */
define('PEAR_CHANNELFILE_ERROR_NO_NAME', 6);
/**
 * Error code when channel name is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_NAME', 7);
/**
 * Error code when channel summary is missing
 */
define('PEAR_CHANNELFILE_ERROR_NO_SUMMARY', 8);
/**
 * Error code when channel summary is multi-line
 */
define('PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY', 9);
/**
 * Error code when channel server is missing for protocol
 */
define('PEAR_CHANNELFILE_ERROR_NO_HOST', 10);
/**
 * Error code when channel server is invalid for protocol
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_HOST', 11);
/**
 * Error code when a mirror name is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRROR', 21);
/**
 * Error code when a mirror type is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE', 22);
/**
 * Error code when an attempt is made to generate xml, but the parsed content is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID', 23);
/**
 * Error code when an empty package name validate regex is passed in
 */
define('PEAR_CHANNELFILE_ERROR_EMPTY_REGEX', 24);
/**
 * Error code when a <function> tag has no version
 */
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION', 25);
/**
 * Error code when a <function> tag has no name
 */
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME', 26);
/**
 * Error code when a <validatepackage> tag has no name
 */
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME', 27);
/**
 * Error code when a <validatepackage> tag has no version attribute
 */
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION', 28);
/**
 * Error code when a mirror does not exist but is called for in one of the set*
 * methods.
 */
define('PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND', 32);
/**
 * Error code when a server port is not numeric
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_PORT', 33);
/**
 * Error code when <static> contains no version attribute
 */
define('PEAR_CHANNELFILE_ERROR_NO_STATICVERSION', 34);
/**
 * Error code when <baseurl> contains no type attribute in a <rest> protocol definition
 */
define('PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE', 35);
/**
 * Error code when a mirror is defined and the channel.xml represents the __uri pseudo-channel
 */
define('PEAR_CHANNELFILE_URI_CANT_MIRROR', 36);
/**
 * Error code when ssl attribute is present and is not "yes"
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_SSL', 37);
/**#@-*/

/**
 * Mirror types allowed.  Currently only internet servers are recognized.
 */
$GLOBALS['_PEAR_CHANNELS_MIRROR_TYPES'] =  array('server');


/**
 * The Channel handling class
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_ChannelFile
{
    /**
     * @access private
     * @var PEAR_ErrorStack
     * @access private
     */
    var $_stack;

    /**
     * Supported channel.xml versions, for parsing
     * @var array
     * @access private
     */
    var $_supportedVersions = array('1.0');

    /**
     * Parsed channel information
     * @var array
     * @access private
     */
    var $_channelInfo;

    /**
     * index into the subchannels array, used for parsing xml
     * @var int
     * @access private
     */
    var $_subchannelIndex;

    /**
     * index into the mirrors array, used for parsing xml
     * @var int
     * @access private
     */
    var $_mirrorIndex;

    /**
     * Flag used to determine the validity of parsed content
     * @var boolean
     * @access private
     */
    var $_isValid = false;

    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_ChannelFile');
        $this->_stack->setErrorMessageTemplate($this->_getErrorMessage());
        $this->_isValid = false;
    }

    /**
     * @return array
     * @access protected
     */
    function _getErrorMessage()
    {
        return
            array(
                PEAR_CHANNELFILE_ERROR_INVALID_VERSION =>
                    'While parsing channel.xml, an invalid version number "%version% was passed in, expecting one of %versions%',
                PEAR_CHANNELFILE_ERROR_NO_VERSION =>
                    'No version number found in <channel> tag',
                PEAR_CHANNELFILE_ERROR_NO_XML_EXT =>
                    '%error%',
                PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER =>
                    'Unable to create XML parser',
                PEAR_CHANNELFILE_ERROR_PARSER_ERROR =>
                    '%error%',
                PEAR_CHANNELFILE_ERROR_NO_NAME =>
                    'Missing channel name',
                PEAR_CHANNELFILE_ERROR_INVALID_NAME =>
                    'Invalid channel %tag% "%name%"',
                PEAR_CHANNELFILE_ERROR_NO_SUMMARY =>
                    'Missing channel summary',
                PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY =>
                    'Channel summary should be on one line, but is multi-line',
                PEAR_CHANNELFILE_ERROR_NO_HOST =>
                    'Missing channel server for %type% server',
                PEAR_CHANNELFILE_ERROR_INVALID_HOST =>
                    'Server name "%server%" is invalid for %type% server',
                PEAR_CHANNELFILE_ERROR_INVALID_MIRROR =>
                    'Invalid mirror name "%name%", mirror type %type%',
                PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE =>
                    'Invalid mirror type "%type%"',
                PEAR_CHANNELFILE_ERROR_INVALID =>
                    'Cannot generate xml, contents are invalid',
                PEAR_CHANNELFILE_ERROR_EMPTY_REGEX =>
                    'packagenameregex cannot be empty',
                PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION =>
                    '%parent% %protocol% function has no version',
                PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME =>
                    '%parent% %protocol% function has no name',
                PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE =>
                    '%parent% rest baseurl has no type',
                PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME =>
                    'Validation package has no name in <validatepackage> tag',
                PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION =>
                    'Validation package "%package%" has no version',
                PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND =>
                    'Mirror "%mirror%" does not exist',
                PEAR_CHANNELFILE_ERROR_INVALID_PORT =>
                    'Port "%port%" must be numeric',
                PEAR_CHANNELFILE_ERROR_NO_STATICVERSION =>
                    '<static> tag must contain version attribute',
                PEAR_CHANNELFILE_URI_CANT_MIRROR =>
                    'The __uri pseudo-channel cannot have mirrors',
                PEAR_CHANNELFILE_ERROR_INVALID_SSL =>
                    '%server% has invalid ssl attribute "%ssl%" can only be yes or not present',
            );
    }

    /**
     * @param string contents of package.xml file
     * @return bool success of parsing
     */
    function fromXmlString($data)
    {
        if (preg_match('/<channel\s+version="([0-9]+\.[0-9]+)"/', $data, $channelversion)) {
            if (!in_array($channelversion[1], $this->_supportedVersions)) {
                $this->_stack->push(PEAR_CHANNELFILE_ERROR_INVALID_VERSION, 'error',
                    array('version' => $channelversion[1]));
                return false;
            }
            $parser = new PEAR_XMLParser;
            $result = $parser->parse($data);
            if ($result !== true) {
                if ($result->getCode() == 1) {
                    $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_XML_EXT, 'error',
                        array('error' => $result->getMessage()));
                } else {
                    $this->_stack->push(PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER, 'error');
                }
                return false;
            }
            $this->_channelInfo = $parser->getData();
            return true;
        } else {
            $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_VERSION, 'error', array('xml' => $data));
            return false;
        }
    }

    /**
     * @return array
     */
    function toArray()
    {
        if (!$this->_isValid && !$this->validate()) {
            return false;
        }
        return $this->_channelInfo;
    }

    /**
     * @param array
     *
     * @return PEAR_ChannelFile|false false if invalid
     */
    public static function &fromArray(
        $data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        $a = new PEAR_ChannelFile($compatibility, $stackClass);
        $a->_fromArray($data);
        if (!$a->validate()) {
            $a = false;
            return $a;
        }
        return $a;
    }

    /**
     * Unlike {@link fromArray()} this does not do any validation
     *
     * @param array
     *
     * @return PEAR_ChannelFile
     */
    public static function &fromArrayWithErrors(
        $data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        $a = new PEAR_ChannelFile($compatibility, $stackClass);
        $a->_fromArray($data);
        return $a;
    }

    /**
     * @param array
     * @access private
     */
    function _fromArray($data)
    {
        $this->_channelInfo = $data;
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getErrors($purge = false)
    {
        return $this->_stack->getErrors($purge);
    }

    /**
     * Unindent given string (?)
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            }
        }
        return $data;
    }

    /**
     * Parse a channel.xml file.  Expects the name of
     * a channel xml file as input.
     *
     * @param string  $descfile  name of channel xml file
     * @return bool success of parsing
     */
    function fromXmlFile($descfile)
    {
        if (!file_exists($descfile) || !is_file($descfile) || !is_readable($descfile) ||
             (!$fp = fopen($descfile, 'r'))) {
            require_once 'PEAR.php';
            return PEAR::raiseError("Unable to open $descfile");
        }

        // read the whole thing so we only get one cdata callback
        // for each block of cdata
        fclose($fp);
        $data = file_get_contents($descfile);
        return $this->fromXmlString($data);
    }

    /**
     * Parse channel information from different sources
     *
     * This method is able to extract information about a channel
     * from an .xml file or a string
     *
     * @access public
     * @param  string Filename of the source or the source itself
     * @return bool
     */
    function fromAny($info)
    {
        if (is_string($info) && file_exists($info) && strlen($info) < 255) {
            $tmp = substr($info, -4);
            if ($tmp == '.xml') {
                $info = $this->fromXmlFile($info);
            } else {
                $fp = fopen($info, "r");
                $test = fread($fp, 5);
                fclose($fp);
                if ($test == "<?xml") {
                    $info = $this->fromXmlFile($info);
                }
            }
            if (PEAR::isError($info)) {
                require_once 'PEAR.php';
                return PEAR::raiseError($info);
            }
        }
        if (is_string($info)) {
            $info = $this->fromXmlString($info);
        }
        return $info;
    }

    /**
     * Return an XML document based on previous parsing and modifications
     *
     * @return string XML data
     *
     * @access public
     */
    function toXml()
    {
        if (!$this->_isValid && !$this->validate()) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID);
            return false;
        }
        if (!isset($this->_channelInfo['attribs']['version'])) {
            $this->_channelInfo['attribs']['version'] = '1.0';
        }
        $channelInfo = $this->_channelInfo;
        $ret = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
        $ret .= "<channel version=\"" .
            $channelInfo['attribs']['version'] . "\" xmlns=\"http://pear.php.net/channel-1.0\"
  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
  xsi:schemaLocation=\"http://pear.php.net/dtd/channel-"
            . $channelInfo['attribs']['version'] . " http://pear.php.net/dtd/channel-" .
            $channelInfo['attribs']['version'] . ".xsd\">
 <name>$channelInfo[name]</name>
 <summary>" . htmlspecialchars($channelInfo['summary'])."</summary>
";
        if (isset($channelInfo['suggestedalias'])) {
            $ret .= ' <suggestedalias>' . $channelInfo['suggestedalias'] . "</suggestedalias>\n";
        }
        if (isset($channelInfo['validatepackage'])) {
            $ret .= ' <validatepackage version="' .
                $channelInfo['validatepackage']['attribs']['version']. '">' .
                htmlspecialchars($channelInfo['validatepackage']['_content']) .
                "</validatepackage>\n";
        }
        $ret .= " <servers>\n";
        $ret .= '  <primary';
        if (isset($channelInfo['servers']['primary']['attribs']['ssl'])) {
            $ret .= ' ssl="' . $channelInfo['servers']['primary']['attribs']['ssl'] . '"';
        }
        if (isset($channelInfo['servers']['primary']['attribs']['port'])) {
            $ret .= ' port="' . $channelInfo['servers']['primary']['attribs']['port'] . '"';
        }
        $ret .= ">\n";
        if (isset($channelInfo['servers']['primary']['rest'])) {
            $ret .= $this->_makeRestXml($channelInfo['servers']['primary']['rest'], '   ');
        }
        $ret .= "  </primary>\n";
        if (isset($channelInfo['servers']['mirror'])) {
            $ret .= $this->_makeMirrorsXml($channelInfo);
        }
        $ret .= " </servers>\n";
        $ret .= "</channel>";
        return str_replace("\r", "\n", str_replace("\r\n", "\n", $ret));
    }

    /**
     * Generate the <rest> tag
     * @access private
     */
    function _makeRestXml($info, $indent)
    {
        $ret = $indent . "<rest>\n";
        if (isset($info['baseurl']) && !isset($info['baseurl'][0])) {
            $info['baseurl'] = array($info['baseurl']);
        }

        if (isset($info['baseurl'])) {
            foreach ($info['baseurl'] as $url) {
                $ret .= "$indent <baseurl type=\"" . $url['attribs']['type'] . "\"";
                $ret .= ">" . $url['_content'] . "</baseurl>\n";
            }
        }
        $ret .= $indent . "</rest>\n";
        return $ret;
    }

    /**
     * Generate the <mirrors> tag
     * @access private
     */
    function _makeMirrorsXml($channelInfo)
    {
        $ret = "";
        if (!isset($channelInfo['servers']['mirror'][0])) {
            $channelInfo['servers']['mirror'] = array($channelInfo['servers']['mirror']);
        }
        foreach ($channelInfo['servers']['mirror'] as $mirror) {
            $ret .= '  <mirror host="' . $mirror['attribs']['host'] . '"';
            if (isset($mirror['attribs']['port'])) {
                $ret .= ' port="' . $mirror['attribs']['port'] . '"';
            }
            if (isset($mirror['attribs']['ssl'])) {
                $ret .= ' ssl="' . $mirror['attribs']['ssl'] . '"';
            }
            $ret .= ">\n";
            if (isset($mirror['rest'])) {
                if (isset($mirror['rest'])) {
                    $ret .= $this->_makeRestXml($mirror['rest'], '   ');
                }
                $ret .= "  </mirror>\n";
            } else {
                $ret .= "/>\n";
            }
        }
        return $ret;
    }

    /**
     * Generate the <functions> tag
     * @access private
     */
    function _makeFunctionsXml($functions, $indent, $rest = false)
    {
        $ret = '';
        if (!isset($functions[0])) {
            $functions = array($functions);
        }
        foreach ($functions as $function) {
            $ret .= "$indent<function version=\"" . $function['attribs']['version'] . "\"";
            if ($rest) {
                $ret .= ' uri="' . $function['attribs']['uri'] . '"';
            }
            $ret .= ">" . $function['_content'] . "</function>\n";
        }
        return $ret;
    }

    /**
     * Validation error.  Also marks the object contents as invalid
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateError($code, $params = array())
    {
        $this->_stack->push($code, 'error', $params);
        $this->_isValid = false;
    }

    /**
     * Validation warning.  Does not mark the object contents invalid.
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateWarning($code, $params = array())
    {
        $this->_stack->push($code, 'warning', $params);
    }

    /**
     * Validate parsed file.
     *
     * @access public
     * @return boolean
     */
    function validate()
    {
        $this->_isValid = true;
        $info = $this->_channelInfo;
        if (empty($info['name'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_NAME);
        } elseif (!$this->validChannelServer($info['name'])) {
            if ($info['name'] != '__uri') {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, array('tag' => 'name',
                    'name' => $info['name']));
            }
        }
        if (empty($info['summary'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
        } elseif (strpos(trim($info['summary']), "\n") !== false) {
            $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $info['summary']));
        }
        if (isset($info['suggestedalias'])) {
            if (!$this->validChannelServer($info['suggestedalias'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                    array('tag' => 'suggestedalias', 'name' =>$info['suggestedalias']));
            }
        }
        if (isset($info['localalias'])) {
            if (!$this->validChannelServer($info['localalias'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                    array('tag' => 'localalias', 'name' =>$info['localalias']));
            }
        }
        if (isset($info['validatepackage'])) {
            if (!isset($info['validatepackage']['_content'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME);
            }
            if (!isset($info['validatepackage']['attribs']['version'])) {
                $content = isset($info['validatepackage']['_content']) ?
                    $info['validatepackage']['_content'] :
                    null;
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION,
                    array('package' => $content));
            }
        }

        if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['port']) &&
              !is_numeric($info['servers']['primary']['attribs']['port'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_PORT,
                array('port' => $info['servers']['primary']['attribs']['port']));
        }

        if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['ssl']) &&
              $info['servers']['primary']['attribs']['ssl'] != 'yes') {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
                array('ssl' => $info['servers']['primary']['attribs']['ssl'],
                    'server' => $info['name']));
        }

        if (isset($info['servers']['primary']['rest']) &&
              isset($info['servers']['primary']['rest']['baseurl'])) {
            $this->_validateFunctions('rest', $info['servers']['primary']['rest']['baseurl']);
        }
        if (isset($info['servers']['mirror'])) {
            if ($this->_channelInfo['name'] == '__uri') {
                $this->_validateError(PEAR_CHANNELFILE_URI_CANT_MIRROR);
            }
            if (!isset($info['servers']['mirror'][0])) {
                $info['servers']['mirror'] = array($info['servers']['mirror']);
            }
            foreach ($info['servers']['mirror'] as $mirror) {
                if (!isset($mirror['attribs']['host'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_HOST,
                      array('type' => 'mirror'));
                } elseif (!$this->validChannelServer($mirror['attribs']['host'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_HOST,
                        array('server' => $mirror['attribs']['host'], 'type' => 'mirror'));
                }
                if (isset($mirror['attribs']['ssl']) && $mirror['attribs']['ssl'] != 'yes') {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
                        array('ssl' => $info['ssl'], 'server' => $mirror['attribs']['host']));
                }
                if (isset($mirror['rest'])) {
                    $this->_validateFunctions('rest', $mirror['rest']['baseurl'],
                        $mirror['attribs']['host']);
                }
            }
        }
        return $this->_isValid;
    }

    /**
     * @param string  rest - protocol name this function applies to
     * @param array the functions
     * @param string the name of the parent element (mirror name, for instance)
     */
    function _validateFunctions($protocol, $functions, $parent = '')
    {
        if (!isset($functions[0])) {
            $functions = array($functions);
        }

        foreach ($functions as $function) {
            if (!isset($function['_content']) || empty($function['_content'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME,
                    array('parent' => $parent, 'protocol' => $protocol));
            }

            if ($protocol == 'rest') {
                if (!isset($function['attribs']['type']) ||
                      empty($function['attribs']['type'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE,
                        array('parent' => $parent, 'protocol' => $protocol));
                }
            } else {
                if (!isset($function['attribs']['version']) ||
                      empty($function['attribs']['version'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION,
                        array('parent' => $parent, 'protocol' => $protocol));
                }
            }
        }
    }

    /**
     * Test whether a string contains a valid channel server.
     * @param string $ver the package version to test
     * @return bool
     */
    function validChannelServer($server)
    {
        if ($server == '__uri') {
            return true;
        }
        return (bool) preg_match(PEAR_CHANNELS_SERVER_PREG, $server);
    }

    /**
     * @return string|false
     */
    function getName()
    {
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }

        return false;
    }

    /**
     * @return string|false
     */
    function getServer()
    {
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }

        return false;
    }

    /**
     * @return int|80 port number to connect to
     */
    function getPort($mirror = false)
    {
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir['attribs']['port'])) {
                    return $mir['attribs']['port'];
                }

                if ($this->getSSL($mirror)) {
                    return 443;
                }

                return 80;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary']['attribs']['port'])) {
            return $this->_channelInfo['servers']['primary']['attribs']['port'];
        }

        if ($this->getSSL()) {
            return 443;
        }

        return 80;
    }

    /**
     * @return bool Determines whether secure sockets layer (SSL) is used to connect to this channel
     */
    function getSSL($mirror = false)
    {
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir['attribs']['ssl'])) {
                    return true;
                }

                return false;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
            return true;
        }

        return false;
    }

    /**
     * @return string|false
     */
    function getSummary()
    {
        if (isset($this->_channelInfo['summary'])) {
            return $this->_channelInfo['summary'];
        }

        return false;
    }

    /**
     * @param string protocol type
     * @param string Mirror name
     * @return array|false
     */
    function getFunctions($protocol, $mirror = false)
    {
        if ($this->getName() == '__uri') {
            return false;
        }

        $function = $protocol == 'rest' ? 'baseurl' : 'function';
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir[$protocol][$function])) {
                    return $mir[$protocol][$function];
                }
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary'][$protocol][$function])) {
            return $this->_channelInfo['servers']['primary'][$protocol][$function];
        }

        return false;
    }

    /**
     * @param string Protocol type
     * @param string Function name (null to return the
     *               first protocol of the type requested)
     * @param string Mirror name, if any
     * @return array
     */
     function getFunction($type, $name = null, $mirror = false)
     {
        $protocols = $this->getFunctions($type, $mirror);
        if (!$protocols) {
            return false;
        }

        foreach ($protocols as $protocol) {
            if ($name === null) {
                return $protocol;
            }

            if ($protocol['_content'] != $name) {
                continue;
            }

            return $protocol;
        }

        return false;
     }

    /**
     * @param string protocol type
     * @param string protocol name
     * @param string version
     * @param string mirror name
     * @return boolean
     */
    function supports($type, $name = null, $mirror = false, $version = '1.0')
    {
        $protocols = $this->getFunctions($type, $mirror);
        if (!$protocols) {
            return false;
        }

        foreach ($protocols as $protocol) {
            if ($protocol['attribs']['version'] != $version) {
                continue;
            }

            if ($name === null) {
                return true;
            }

            if ($protocol['_content'] != $name) {
                continue;
            }

            return true;
        }

        return false;
    }

    /**
     * Determines whether a channel supports Representational State Transfer (REST) protocols
     * for retrieving channel information
     * @param string
     * @return bool
     */
    function supportsREST($mirror = false)
    {
        if ($mirror == $this->_channelInfo['name']) {
            $mirror = false;
        }

        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                return isset($mir['rest']);
            }

            return false;
        }

        return isset($this->_channelInfo['servers']['primary']['rest']);
    }

    /**
     * Get the URL to access a base resource.
     *
     * Hyperlinks in the returned xml will be used to retrieve the proper information
     * needed.  This allows extreme extensibility and flexibility in implementation
     * @param string Resource Type to retrieve
     */
    function getBaseURL($resourceType, $mirror = false)
    {
        if ($mirror == $this->_channelInfo['name']) {
            $mirror = false;
        }

        if ($mirror) {
            $mir = $this->getMirror($mirror);
            if (!$mir) {
                return false;
            }

            $rest = $mir['rest'];
        } else {
            $rest = $this->_channelInfo['servers']['primary']['rest'];
        }

        if (!isset($rest['baseurl'][0])) {
            $rest['baseurl'] = array($rest['baseurl']);
        }

        foreach ($rest['baseurl'] as $baseurl) {
            if (strtolower($baseurl['attribs']['type']) == strtolower($resourceType)) {
                return $baseurl['_content'];
            }
        }

        return false;
    }

    /**
     * Since REST does not implement RPC, provide this as a logical wrapper around
     * resetFunctions for REST
     * @param string|false mirror name, if any
     */
    function resetREST($mirror = false)
    {
        return $this->resetFunctions('rest', $mirror);
    }

    /**
     * Empty all protocol definitions
     * @param string protocol type
     * @param string|false mirror name, if any
     */
    function resetFunctions($type, $mirror = false)
    {
        if ($mirror) {
            if (isset($this->_channelInfo['servers']['mirror'])) {
                $mirrors = $this->_channelInfo['servers']['mirror'];
                if (!isset($mirrors[0])) {
                    $mirrors = array($mirrors);
                }

                foreach ($mirrors as $i => $mir) {
                    if ($mir['attribs']['host'] == $mirror) {
                        if (isset($this->_channelInfo['servers']['mirror'][$i][$type])) {
                            unset($this->_channelInfo['servers']['mirror'][$i][$type]);
                        }

                        return true;
                    }
                }

                return false;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary'][$type])) {
            unset($this->_channelInfo['servers']['primary'][$type]);
        }

        return true;
    }

    /**
     * Set a channel's protocols to the protocols supported by pearweb
     */
    function setDefaultPEARProtocols($version = '1.0', $mirror = false)
    {
        switch ($version) {
            case '1.0' :
                $this->resetREST($mirror);

                if (!isset($this->_channelInfo['servers'])) {
                    $this->_channelInfo['servers'] = array('primary' =>
                        array('rest' => array()));
                } elseif (!isset($this->_channelInfo['servers']['primary'])) {
                    $this->_channelInfo['servers']['primary'] = array('rest' => array());
                }

                return true;
            break;
            default :
                return false;
            break;
        }
    }

    /**
     * @return array
     */
    function getMirrors()
    {
        if (isset($this->_channelInfo['servers']['mirror'])) {
            $mirrors = $this->_channelInfo['servers']['mirror'];
            if (!isset($mirrors[0])) {
                $mirrors = array($mirrors);
            }

            return $mirrors;
        }

        return array();
    }

    /**
     * Get the unserialized XML representing a mirror
     * @return array|false
     */
    function getMirror($server)
    {
        foreach ($this->getMirrors() as $mirror) {
            if ($mirror['attribs']['host'] == $server) {
                return $mirror;
            }
        }

        return false;
    }

    /**
     * @param string
     * @return string|false
     * @error PEAR_CHANNELFILE_ERROR_NO_NAME
     * @error PEAR_CHANNELFILE_ERROR_INVALID_NAME
     */
    function setName($name)
    {
        return $this->setServer($name);
    }

    /**
     * Set the socket number (port) that is used to connect to this channel
     * @param integer
     * @param string|false name of the mirror server, or false for the primary
     */
    function setPort($port, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        $this->_channelInfo['servers']['mirror'][$i]['attribs']['port'] = $port;
                        return true;
                    }
                }

                return false;
            } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                $this->_channelInfo['servers']['mirror']['attribs']['port'] = $port;
                $this->_isValid = false;
                return true;
            }
        }

        $this->_channelInfo['servers']['primary']['attribs']['port'] = $port;
        $this->_isValid = false;
        return true;
    }

    /**
     * Set the socket number (port) that is used to connect to this channel
     * @param bool Determines whether to turn on SSL support or turn it off
     * @param string|false name of the mirror server, or false for the primary
     */
    function setSSL($ssl = true, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        if (!$ssl) {
                            if (isset($this->_channelInfo['servers']['mirror'][$i]
                                  ['attribs']['ssl'])) {
                                unset($this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl']);
                            }
                        } else {
                            $this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl'] = 'yes';
                        }

                        return true;
                    }
                }

                return false;
            } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                if (!$ssl) {
                    if (isset($this->_channelInfo['servers']['mirror']['attribs']['ssl'])) {
                        unset($this->_channelInfo['servers']['mirror']['attribs']['ssl']);
                    }
                } else {
                    $this->_channelInfo['servers']['mirror']['attribs']['ssl'] = 'yes';
                }

                $this->_isValid = false;
                return true;
            }
        }

        if ($ssl) {
            $this->_channelInfo['servers']['primary']['attribs']['ssl'] = 'yes';
        } else {
            if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
                unset($this->_channelInfo['servers']['primary']['attribs']['ssl']);
            }
        }

        $this->_isValid = false;
        return true;
    }

    /**
     * @param string
     * @return string|false
     * @error PEAR_CHANNELFILE_ERROR_NO_SERVER
     * @error PEAR_CHANNELFILE_ERROR_INVALID_SERVER
     */
    function setServer($server, $mirror = false)
    {
        if (empty($server)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SERVER);
            return false;
        } elseif (!$this->validChannelServer($server)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                array('tag' => 'name', 'name' => $server));
            return false;
        }

        if ($mirror) {
            $found = false;
            foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                if ($mirror == $mir['attribs']['host']) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            $this->_channelInfo['mirror'][$i]['attribs']['host'] = $server;
            return true;
        }

        $this->_channelInfo['name'] = $server;
        return true;
    }

    /**
     * @param string
     * @return boolean success
     * @error PEAR_CHANNELFILE_ERROR_NO_SUMMARY
     * @warning PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY
     */
    function setSummary($summary)
    {
        if (empty($summary)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
            return false;
        } elseif (strpos(trim($summary), "\n") !== false) {
            $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $summary));
        }

        $this->_channelInfo['summary'] = $summary;
        return true;
    }

    /**
     * @param string
     * @param boolean determines whether the alias is in channel.xml or local
     * @return boolean success
     */
    function setAlias($alias, $local = false)
    {
        if (!$this->validChannelServer($alias)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                array('tag' => 'suggestedalias', 'name' => $alias));
            return false;
        }

        if ($local) {
            $this->_channelInfo['localalias'] = $alias;
        } else {
            $this->_channelInfo['suggestedalias'] = $alias;
        }

        return true;
    }

    /**
     * @return string
     */
    function getAlias()
    {
        if (isset($this->_channelInfo['localalias'])) {
            return $this->_channelInfo['localalias'];
        }
        if (isset($this->_channelInfo['suggestedalias'])) {
            return $this->_channelInfo['suggestedalias'];
        }
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }
        return '';
    }

    /**
     * Set the package validation object if it differs from PEAR's default
     * The class must be includeable via changing _ in the classname to path separator,
     * but no checking of this is made.
     * @param string|false pass in false to reset to the default packagename regex
     * @return boolean success
     */
    function setValidationPackage($validateclass, $version)
    {
        if (empty($validateclass)) {
            unset($this->_channelInfo['validatepackage']);
        }
        $this->_channelInfo['validatepackage'] = array('_content' => $validateclass);
        $this->_channelInfo['validatepackage']['attribs'] = array('version' => $version);
    }

    /**
     * Add a protocol to the provides section
     * @param string protocol type
     * @param string protocol version
     * @param string protocol name, if any
     * @param string mirror name, if this is a mirror's protocol
     * @return bool
     */
    function addFunction($type, $version, $name = '', $mirror = false)
    {
        if ($mirror) {
            return $this->addMirrorFunction($mirror, $type, $version, $name);
        }

        $set = array('attribs' => array('version' => $version), '_content' => $name);
        if (!isset($this->_channelInfo['servers']['primary'][$type]['function'])) {
            if (!isset($this->_channelInfo['servers'])) {
                $this->_channelInfo['servers'] = array('primary' =>
                    array($type => array()));
            } elseif (!isset($this->_channelInfo['servers']['primary'])) {
                $this->_channelInfo['servers']['primary'] = array($type => array());
            }

            $this->_channelInfo['servers']['primary'][$type]['function'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($this->_channelInfo['servers']['primary'][$type]['function'][0])) {
            $this->_channelInfo['servers']['primary'][$type]['function'] = array(
                $this->_channelInfo['servers']['primary'][$type]['function']);
        }

        $this->_channelInfo['servers']['primary'][$type]['function'][] = $set;
        return true;
    }
    /**
     * Add a protocol to a mirror's provides section
     * @param string mirror name (server)
     * @param string protocol type
     * @param string protocol version
     * @param string protocol name, if any
     */
    function addMirrorFunction($mirror, $type, $version, $name = '')
    {
        if (!isset($this->_channelInfo['servers']['mirror'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                array('mirror' => $mirror));
            return false;
        }

        $setmirror = false;
        if (isset($this->_channelInfo['servers']['mirror'][0])) {
            foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                if ($mirror == $mir['attribs']['host']) {
                    $setmirror = &$this->_channelInfo['servers']['mirror'][$i];
                    break;
                }
            }
        } else {
            if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                $setmirror = &$this->_channelInfo['servers']['mirror'];
            }
        }

        if (!$setmirror) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                array('mirror' => $mirror));
            return false;
        }

        $set = array('attribs' => array('version' => $version), '_content' => $name);
        if (!isset($setmirror[$type]['function'])) {
            $setmirror[$type]['function'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($setmirror[$type]['function'][0])) {
            $setmirror[$type]['function'] = array($setmirror[$type]['function']);
        }

        $setmirror[$type]['function'][] = $set;
        $this->_isValid = false;
        return true;
    }

    /**
     * @param string Resource Type this url links to
     * @param string URL
     * @param string|false mirror name, if this is not a primary server REST base URL
     */
    function setBaseURL($resourceType, $url, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            $setmirror = false;
            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        $setmirror = &$this->_channelInfo['servers']['mirror'][$i];
                        break;
                    }
                }
            } else {
                if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                    $setmirror = &$this->_channelInfo['servers']['mirror'];
                }
            }
        } else {
            $setmirror = &$this->_channelInfo['servers']['primary'];
        }

        $set = array('attribs' => array('type' => $resourceType), '_content' => $url);
        if (!isset($setmirror['rest'])) {
            $setmirror['rest'] = array();
        }

        if (!isset($setmirror['rest']['baseurl'])) {
            $setmirror['rest']['baseurl'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($setmirror['rest']['baseurl'][0])) {
            $setmirror['rest']['baseurl'] = array($setmirror['rest']['baseurl']);
        }

        foreach ($setmirror['rest']['baseurl'] as $i => $url) {
            if ($url['attribs']['type'] == $resourceType) {
                $this->_isValid = false;
                $setmirror['rest']['baseurl'][$i] = $set;
                return true;
            }
        }

        $setmirror['rest']['baseurl'][] = $set;
        $this->_isValid = false;
        return true;
    }

    /**
     * @param string mirror server
     * @param int mirror http port
     * @return boolean
     */
    function addMirror($server, $port = null)
    {
        if ($this->_channelInfo['name'] == '__uri') {
            return false; // the __uri channel cannot have mirrors by definition
        }

        $set = array('attribs' => array('host' => $server));
        if (is_numeric($port)) {
            $set['attribs']['port'] = $port;
        }

        if (!isset($this->_channelInfo['servers']['mirror'])) {
            $this->_channelInfo['servers']['mirror'] = $set;
            return true;
        }

        if (!isset($this->_channelInfo['servers']['mirror'][0])) {
            $this->_channelInfo['servers']['mirror'] =
                array($this->_channelInfo['servers']['mirror']);
        }

        $this->_channelInfo['servers']['mirror'][] = $set;
        return true;
    }

    /**
     * Retrieve the name of the validation package for this channel
     * @return string|false
     */
    function getValidationPackage()
    {
        if (!$this->_isValid && !$this->validate()) {
            return false;
        }

        if (!isset($this->_channelInfo['validatepackage'])) {
            return array('attribs' => array('version' => 'default'),
                '_content' => 'PEAR_Validate');
        }

        return $this->_channelInfo['validatepackage'];
    }

    /**
     * Retrieve the object that can be used for custom validation
     * @param string|false the name of the package to validate.  If the package is
     *                     the channel validation package, PEAR_Validate is returned
     * @return PEAR_Validate|false false is returned if the validation package
     *         cannot be located
     */
    function &getValidationObject($package = false)
    {
        if (!class_exists('PEAR_Validate')) {
            require_once 'PEAR/Validate.php';
        }

        if (!$this->_isValid) {
            if (!$this->validate()) {
                $a = false;
                return $a;
            }
        }

        if (isset($this->_channelInfo['validatepackage'])) {
            if ($package == $this->_channelInfo['validatepackage']) {
                // channel validation packages are always validated by PEAR_Validate
                $val = new PEAR_Validate;
                return $val;
            }

            if (!class_exists(str_replace('.', '_',
                  $this->_channelInfo['validatepackage']['_content']))) {
                if ($this->isIncludeable(str_replace('_', '/',
                      $this->_channelInfo['validatepackage']['_content']) . '.php')) {
                    include_once str_replace('_', '/',
                        $this->_channelInfo['validatepackage']['_content']) . '.php';
                    $vclass = str_replace('.', '_',
                        $this->_channelInfo['validatepackage']['_content']);
                    $val = new $vclass;
                } else {
                    $a = false;
                    return $a;
                }
            } else {
                $vclass = str_replace('.', '_',
                    $this->_channelInfo['validatepackage']['_content']);
                $val = new $vclass;
            }
        } else {
            $val = new PEAR_Validate;
        }

        return $val;
    }

    function isIncludeable($path)
    {
        $possibilities = explode(PATH_SEPARATOR, ini_get('include_path'));
        foreach ($possibilities as $dir) {
            if (file_exists($dir . DIRECTORY_SEPARATOR . $path)
                  && is_readable($dir . DIRECTORY_SEPARATOR . $path)) {
                return true;
            }
        }

        return false;
    }

    /**
     * This function is used by the channel updater and retrieves a value set by
     * the registry, or the current time if it has not been set
     * @return string
     */
    function lastModified()
    {
        if (isset($this->_channelInfo['_lastmodified'])) {
            return $this->_channelInfo['_lastmodified'];
        }

        return time();
    }
}
pear/PEAR/ChannelFile/Parser.php000064400000003254151732710120012342 0ustar00<?php
/**
 * PEAR_ChannelFile_Parser for parsing channel.xml
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base xml parser class
 */
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/ChannelFile.php';
/**
 * Parser for channel.xml
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_ChannelFile_Parser extends PEAR_XMLParser
{
    var $_config;
    var $_logger;
    var $_registry;

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    function parse($data, $file)
    {
        if (PEAR::isError($err = parent::parse($data, $file))) {
            return $err;
        }

        $ret = new PEAR_ChannelFile;
        $ret->setConfig($this->_config);
        if (isset($this->_logger)) {
            $ret->setLogger($this->_logger);
        }

        $ret->fromArray($this->_unserializedData);
        // make sure the filelist is in the easy to read format needed
        $ret->flattenFilelist();
        $ret->setPackagefile($file, $archive);
        return $ret;
    }
}pear/PEAR/Common.php000064400000063542151732710120010174 0ustar00<?php
/**
 * PEAR_Common, the base class for the PEAR Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1.0
 * @deprecated File deprecated since Release 1.4.0a1
 */

/**
 * Include error handling
 */
require_once 'PEAR.php';

/**
 * PEAR_Common error when an invalid PHP file is passed to PEAR_Common::analyzeSourceCode()
 */
define('PEAR_COMMON_ERROR_INVALIDPHP', 1);
define('_PEAR_COMMON_PACKAGE_NAME_PREG', '[A-Za-z][a-zA-Z0-9_]+');
define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/');

// this should allow: 1, 1.0, 1.0RC1, 1.0dev, 1.0dev123234234234, 1.0a1, 1.0b1, 1.0pl1
define('_PEAR_COMMON_PACKAGE_VERSION_PREG', '\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?');
define('PEAR_COMMON_PACKAGE_VERSION_PREG', '/^' . _PEAR_COMMON_PACKAGE_VERSION_PREG . '\\z/i');

// XXX far from perfect :-)
define('_PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '(' . _PEAR_COMMON_PACKAGE_NAME_PREG .
    ')(-([.0-9a-zA-Z]+))?');
define('PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_PACKAGE_DOWNLOAD_PREG .
    '\\z/');

define('_PEAR_CHANNELS_NAME_PREG', '[A-Za-z][a-zA-Z0-9\.]+');
define('PEAR_CHANNELS_NAME_PREG', '/^' . _PEAR_CHANNELS_NAME_PREG . '\\z/');

// this should allow any dns or IP address, plus a path - NO UNDERSCORES ALLOWED
define('_PEAR_CHANNELS_SERVER_PREG', '[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*(\/[a-zA-Z0-9\-]+)*');
define('PEAR_CHANNELS_SERVER_PREG', '/^' . _PEAR_CHANNELS_SERVER_PREG . '\\z/i');

define('_PEAR_CHANNELS_PACKAGE_PREG',  '(' ._PEAR_CHANNELS_SERVER_PREG . ')\/('
         . _PEAR_COMMON_PACKAGE_NAME_PREG . ')');
define('PEAR_CHANNELS_PACKAGE_PREG', '/^' . _PEAR_CHANNELS_PACKAGE_PREG . '\\z/i');

define('_PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '(' . _PEAR_CHANNELS_NAME_PREG . ')::('
    . _PEAR_COMMON_PACKAGE_NAME_PREG . ')(-([.0-9a-zA-Z]+))?');
define('PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_CHANNEL_DOWNLOAD_PREG . '\\z/');

/**
 * List of temporary files and directories registered by
 * PEAR_Common::addTempFile().
 * @var array
 */
$GLOBALS['_PEAR_Common_tempfiles'] = array();

/**
 * Valid maintainer roles
 * @var array
 */
$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper');

/**
 * Valid release states
 * @var array
 */
$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel');

/**
 * Valid dependency types
 * @var array
 */
$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi');

/**
 * Valid dependency relations
 * @var array
 */
$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge','not', 'ne');

/**
 * Valid file roles
 * @var array
 */
$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script');

/**
 * Valid replacement types
 * @var array
 */
$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info');

/**
 * Valid "provide" types
 * @var array
 */
$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api');

/**
 * Valid "provide" types
 * @var array
 */
$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup');

/**
 * Class providing common functionality for PEAR administration classes.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 * @deprecated This class will disappear, and its components will be spread
 *             into smaller classes, like the AT&T breakup, as of Release 1.4.0a1
 */
class PEAR_Common extends PEAR
{
    /**
     * User Interface object (PEAR_Frontend_* class).  If null,
     * the log() method uses print.
     * @var object
     */
    var $ui = null;

    /**
     * Configuration object (PEAR_Config).
     * @var PEAR_Config
     */
    var $config = null;

    /** stack of elements, gives some sort of XML context */
    var $element_stack = array();

    /** name of currently parsed XML element */
    var $current_element;

    /** array of attributes of the currently parsed XML element */
    var $current_attributes = array();

    /** assoc with information about a package */
    var $pkginfo = array();

    var $current_path = null;

    /**
     * Flag variable used to mark a valid package file
     * @var boolean
     * @access private
     */
    var $_validPackageFile;

    /**
     * PEAR_Common constructor
     *
     * @access public
     */
    function __construct()
    {
        parent::__construct();
        $this->config = &PEAR_Config::singleton();
        $this->debug = $this->config->get('verbose');
    }

    /**
     * PEAR_Common destructor
     *
     * @access private
     */
    function _PEAR_Common()
    {
        // doesn't work due to bug #14744
        //$tempfiles = $this->_tempfiles;
        $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles'];
        while ($file = array_shift($tempfiles)) {
            if (@is_dir($file)) {
                if (!class_exists('System')) {
                    require_once 'System.php';
                }

                System::rm(array('-rf', $file));
            } elseif (file_exists($file)) {
                unlink($file);
            }
        }
    }

    /**
     * Register a temporary file or directory.  When the destructor is
     * executed, all registered temporary files and directories are
     * removed.
     *
     * @param string  $file  name of file or directory
     *
     * @return void
     *
     * @access public
     */
    static function addTempFile($file)
    {
        if (!class_exists('PEAR_Frontend')) {
            require_once 'PEAR/Frontend.php';
        }
        PEAR_Frontend::addTempFile($file);
    }

    /**
     * Wrapper to System::mkDir(), creates a directory as well as
     * any necessary parent directories.
     *
     * @param string  $dir  directory name
     *
     * @return bool TRUE on success, or a PEAR error
     *
     * @access public
     */
    function mkDirHier($dir)
    {
        // Only used in Installer - move it there ?
        $this->log(2, "+ create dir $dir");
        if (!class_exists('System')) {
            require_once 'System.php';
        }
        return System::mkDir(array('-p', $dir));
    }

    /**
     * Logging method.
     *
     * @param int    $level  log level (0 is quiet, higher is noisier)
     * @param string $msg    message to write to the log
     *
     * @return void
     */
    public function log($level, $msg, $append_crlf = true)
    {
        if ($this->debug >= $level) {
            if (!class_exists('PEAR_Frontend')) {
                require_once 'PEAR/Frontend.php';
            }

            $ui = &PEAR_Frontend::singleton();
            if (is_a($ui, 'PEAR_Frontend')) {
                $ui->log($msg, $append_crlf);
            } else {
                print "$msg\n";
            }
        }
    }

    /**
     * Create and register a temporary directory.
     *
     * @param string $tmpdir (optional) Directory to use as tmpdir.
     *                       Will use system defaults (for example
     *                       /tmp or c:\windows\temp) if not specified
     *
     * @return string name of created directory
     *
     * @access public
     */
    function mkTempDir($tmpdir = '')
    {
        $topt = $tmpdir ? array('-t', $tmpdir) : array();
        $topt = array_merge($topt, array('-d', 'pear'));
        if (!class_exists('System')) {
            require_once 'System.php';
        }

        if (!$tmpdir = System::mktemp($topt)) {
            return false;
        }

        self::addTempFile($tmpdir);
        return $tmpdir;
    }

    /**
     * Set object that represents the frontend to be used.
     *
     * @param  object Reference of the frontend object
     * @return void
     * @access public
     */
    function setFrontendObject(&$ui)
    {
        $this->ui = &$ui;
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    static function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }
        if ($include) {
            $i--;
        }
        return array_slice($states, $i + 1);
    }

    /**
     * Get the valid roles for a PEAR package maintainer
     *
     * @return array
     */
    public static function getUserRoles()
    {
        return $GLOBALS['_PEAR_Common_maintainer_roles'];
    }

    /**
     * Get the valid package release states of packages
     *
     * @return array
     */
    public static function getReleaseStates()
    {
        return $GLOBALS['_PEAR_Common_release_states'];
    }

    /**
     * Get the implemented dependency types (php, ext, pkg etc.)
     *
     * @return array
     */
    public static function getDependencyTypes()
    {
        return $GLOBALS['_PEAR_Common_dependency_types'];
    }

    /**
     * Get the implemented dependency relations (has, lt, ge etc.)
     *
     * @return array
     */
    public static function getDependencyRelations()
    {
        return $GLOBALS['_PEAR_Common_dependency_relations'];
    }

    /**
     * Get the implemented file roles
     *
     * @return array
     */
    public static function getFileRoles()
    {
        return $GLOBALS['_PEAR_Common_file_roles'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getReplacementTypes()
    {
        return $GLOBALS['_PEAR_Common_replacement_types'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getProvideTypes()
    {
        return $GLOBALS['_PEAR_Common_provide_types'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getScriptPhases()
    {
        return $GLOBALS['_PEAR_Common_script_phases'];
    }

    /**
     * Test whether a string contains a valid package name.
     *
     * @param string $name the package name to test
     *
     * @return bool
     *
     * @access public
     */
    function validPackageName($name)
    {
        return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name);
    }

    /**
     * Test whether a string contains a valid package version.
     *
     * @param string $ver the package version to test
     *
     * @return bool
     *
     * @access public
     */
    function validPackageVersion($ver)
    {
        return (bool)preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver);
    }

    /**
     * @param string $path relative or absolute include path
     * @return boolean
     */
    public static function isIncludeable($path)
    {
        if (file_exists($path) && is_readable($path)) {
            return true;
        }

        $ipath = explode(PATH_SEPARATOR, ini_get('include_path'));
        foreach ($ipath as $include) {
            $test = realpath($include . DIRECTORY_SEPARATOR . $path);
            if (file_exists($test) && is_readable($test)) {
                return true;
            }
        }

        return false;
    }

    function _postProcessChecks($pf)
    {
        if (!PEAR::isError($pf)) {
            return $this->_postProcessValidPackagexml($pf);
        }

        $errs = $pf->getUserinfo();
        if (is_array($errs)) {
            foreach ($errs as $error) {
                $e = $this->raiseError($error['message'], $error['code'], null, null, $error);
            }
        }

        return $pf;
    }

    /**
     * Returns information about a package file.  Expects the name of
     * a gzipped tar file as input.
     *
     * @param string  $file  name of .tgz file
     *
     * @return array  array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromTgzFile() instead
     *
     */
    function infoFromTgzFile($file)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromTgzFile($file, PEAR_VALIDATE_NORMAL);
        return $this->_postProcessChecks($pf);
    }

    /**
     * Returns information about a package file.  Expects the name of
     * a package xml file as input.
     *
     * @param string  $descfile  name of package xml file
     *
     * @return array  array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromPackageFile() instead
     *
     */
    function infoFromDescriptionFile($descfile)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
        return $this->_postProcessChecks($pf);
    }

    /**
     * Returns information about a package file.  Expects the contents
     * of a package xml file as input.
     *
     * @param string  $data  contents of package.xml file
     *
     * @return array   array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromXmlstring() instead
     *
     */
    function infoFromString($data)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromXmlString($data, PEAR_VALIDATE_NORMAL, false);
        return $this->_postProcessChecks($pf);
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return array
     */
    function _postProcessValidPackagexml(&$pf)
    {
        if (!is_a($pf, 'PEAR_PackageFile_v2')) {
            $this->pkginfo = $pf->toArray();
            return $this->pkginfo;
        }

        // sort of make this into a package.xml 1.0-style array
        // changelog is not converted to old format.
        $arr = $pf->toArray(true);
        $arr = array_merge($arr, $arr['old']);
        unset($arr['old'], $arr['xsdversion'], $arr['contents'], $arr['compatible'],
              $arr['channel'], $arr['uri'], $arr['dependencies'], $arr['phprelease'],
              $arr['extsrcrelease'], $arr['zendextsrcrelease'], $arr['extbinrelease'],
              $arr['zendextbinrelease'], $arr['bundle'], $arr['lead'], $arr['developer'],
              $arr['helper'], $arr['contributor']);
        $arr['filelist'] = $pf->getFilelist();
        $this->pkginfo = $arr;
        return $arr;
    }

    /**
     * Returns package information from different sources
     *
     * This method is able to extract information about a package
     * from a .tgz archive or from a XML package definition file.
     *
     * @access public
     * @param  string Filename of the source ('package.xml', '<package>.tgz')
     * @return string
     * @deprecated use PEAR_PackageFile->fromAnyFile() instead
     */
    function infoFromAny($info)
    {
        if (is_string($info) && file_exists($info)) {
            $packagefile = new PEAR_PackageFile($this->config);
            $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pf)) {
                $errs = $pf->getUserinfo();
                if (is_array($errs)) {
                    foreach ($errs as $error) {
                        $e = $this->raiseError($error['message'], $error['code'], null, null, $error);
                    }
                }

                return $pf;
            }

            return $this->_postProcessValidPackagexml($pf);
        }

        return $info;
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @param array  $pkginfo  package info
     *
     * @return string XML data
     *
     * @access public
     * @deprecated use a PEAR_PackageFile_v* object's generator instead
     */
    function xmlFromInfo($pkginfo)
    {
        $config      = &PEAR_Config::singleton();
        $packagefile = new PEAR_PackageFile($config);
        $pf = &$packagefile->fromArray($pkginfo);
        $gen = &$pf->getDefaultGenerator();
        return $gen->toXml(PEAR_VALIDATE_PACKAGING);
    }

    /**
     * Validate XML package definition file.
     *
     * @param  string $info Filename of the package archive or of the
     *                package definition file
     * @param  array $errors Array that will contain the errors
     * @param  array $warnings Array that will contain the warnings
     * @param  string $dir_prefix (optional) directory where source files
     *                may be found, or empty if they are not available
     * @access public
     * @return boolean
     * @deprecated use the validation of PEAR_PackageFile objects
     */
    function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '')
    {
        $config      = &PEAR_Config::singleton();
        $packagefile = new PEAR_PackageFile($config);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        if (strpos($info, '<?xml') !== false) {
            $pf = &$packagefile->fromXmlString($info, PEAR_VALIDATE_NORMAL, '');
        } else {
            $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL);
        }

        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            $errs = $pf->getUserinfo();
            if (is_array($errs)) {
                foreach ($errs as $error) {
                    if ($error['level'] == 'error') {
                        $errors[] = $error['message'];
                    } else {
                        $warnings[] = $error['message'];
                    }
                }
            }

            return false;
        }

        return true;
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access public
     *
     */
    function buildProvidesArray($srcinfo)
    {
        $file = basename($srcinfo['source_file']);
        $pn = '';
        if (isset($this->_packageName)) {
            $pn = $this->_packageName;
        }

        $pnl = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($this->pkginfo['provides'][$key])) {
                continue;
            }

            $this->pkginfo['provides'][$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $this->pkginfo['provides'][$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }

        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($this->pkginfo['provides'][$key])) {
                    continue;
                }

                $this->pkginfo['provides'][$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($this->pkginfo['provides'][$key])) {
                continue;
            }

            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }

            $this->pkginfo['provides'][$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }
    }

    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @return mixed
     * @access public
     */
    static function analyzeSourceCode($file)
    {
        if (!class_exists('PEAR_PackageFile_v2_Validator')) {
            require_once 'PEAR/PackageFile/v2/Validator.php';
        }

        $a = new PEAR_PackageFile_v2_Validator;
        return $a->analyzeSourceCode($file);
    }

    function detectDependencies($any, $status_callback = null)
    {
        if (!function_exists("token_get_all")) {
            return false;
        }

        if (PEAR::isError($info = $this->infoFromAny($any))) {
            return $this->raiseError($info);
        }

        if (!is_array($info)) {
            return false;
        }

        $deps = array();
        $used_c = $decl_c = $decl_f = $decl_m = array();
        foreach ($info['filelist'] as $file => $fa) {
            $tmp = $this->analyzeSourceCode($file);
            $used_c = @array_merge($used_c, $tmp['used_classes']);
            $decl_c = @array_merge($decl_c, $tmp['declared_classes']);
            $decl_f = @array_merge($decl_f, $tmp['declared_functions']);
            $decl_m = @array_merge($decl_m, $tmp['declared_methods']);
            $inheri = @array_merge($inheri, $tmp['inheritance']);
        }

        $used_c = array_unique($used_c);
        $decl_c = array_unique($decl_c);
        $undecl_c = array_diff($used_c, $decl_c);

        return array('used_classes' => $used_c,
                     'declared_classes' => $decl_c,
                     'declared_methods' => $decl_m,
                     'declared_functions' => $decl_f,
                     'undeclared_classes' => $undecl_c,
                     'inheritance' => $inheri,
                     );
    }

    /**
     * Download a file through HTTP.  Considers suggested file name in
     * Content-disposition: header and can run a callback function for
     * different events.  The callback will be called with two
     * parameters: the callback type, and parameters.  The implemented
     * callback types are:
     *
     *  'setup'       called at the very beginning, parameter is a UI object
     *                that should be used for all output
     *  'message'     the parameter is a string with an informational message
     *  'saveas'      may be used to save with a different file name, the
     *                parameter is the filename that is about to be used.
     *                If a 'saveas' callback returns a non-empty string,
     *                that file name will be used as the filename instead.
     *                Note that $save_dir will not be affected by this, only
     *                the basename of the file.
     *  'start'       download is starting, parameter is number of bytes
     *                that are expected, or -1 if unknown
     *  'bytesread'   parameter is the number of bytes read so far
     *  'done'        download is complete, parameter is the total number
     *                of bytes read
     *  'connfailed'  if the TCP connection fails, this callback is called
     *                with array(host,port,errno,errmsg)
     *  'writefailed' if writing to disk fails, this callback is called
     *                with array(destfile,errmsg)
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param object  $ui        PEAR_Frontend_* instance
     * @param object  $config    PEAR_Config instance
     * @param string  $save_dir  (optional) directory to save file in
     * @param mixed   $callback  (optional) function/method to call for status
     *                           updates
     * @param false|string|array $lastmodified header values to check against
     *                                         for caching
     *                                         use false to return the header
     *                                         values from this download
     * @param false|array        $accept       Accept headers to send
     * @param false|string       $channel      Channel to use for retrieving
     *                                         authentication
     *
     * @return mixed  Returns the full path of the downloaded file or a PEAR
     *                error on failure.  If the error is caused by
     *                socket-related errors, the error object will
     *                have the fsockopen error code available through
     *                getCode().  If caching is requested, then return the header
     *                values.
     *                If $lastmodified was given and the there are no changes,
     *                boolean false is returned.
     *
     * @access public
     */
    function downloadHttp(
        $url, &$ui, $save_dir = '.', $callback = null, $lastmodified = null,
        $accept = false, $channel = false
    ) {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        return PEAR_Downloader::_downloadHttp(
            $this, $url, $ui, $save_dir, $callback, $lastmodified,
            $accept, $channel
        );
    }
}

require_once 'PEAR/Config.php';
require_once 'PEAR/PackageFile.php';
pear/PEAR/RunTest.php000064400000106632151732710130010347 0ustar00<?php
/**
 * PEAR_RunTest
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.3
 */

/**
 * for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Config.php';

define('DETAILED', 1);
putenv("PHP_PEAR_RUNTESTS=1");

/**
 * Simplified version of PHP's test suite
 *
 * Try it with:
 *
 * $ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; $o=$t->run("./pear_system.phpt");print_r($o);'
 *
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.3
 */
class PEAR_RunTest
{
    var $_headers = array();
    var $_logger;
    var $_options;
    var $_php;
    var $tests_count;
    var $xdebug_loaded;
    /**
     * Saved value of php executable, used to reset $_php when we
     * have a test that uses cgi
     *
     * @var unknown_type
     */
    var $_savephp;
    var $ini_overwrites = array(
        'output_handler=',
        'open_basedir=',
        'disable_functions=',
        'output_buffering=Off',
        'display_errors=1',
        'log_errors=0',
        'html_errors=0',
        'report_memleaks=0',
        'report_zend_debug=0',
        'docref_root=',
        'docref_ext=.html',
        'error_prepend_string=',
        'error_append_string=',
        'auto_prepend_file=',
        'auto_append_file=',
        'xdebug.default_enable=0',
        'allow_url_fopen=1',
    );

    /**
     * An object that supports the PEAR_Common->log() signature, or null
     * @param PEAR_Common|null
     */
    function __construct($logger = null, $options = array())
    {
        if (!defined('E_DEPRECATED')) {
            define('E_DEPRECATED', 0);
        }
        if (!defined('E_STRICT')) {
            define('E_STRICT', 0);
        }
        $excluded_error_reporting = E_DEPRECATED;
        if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) {
            $excluded_error_reporting |= E_STRICT;
        }
        $this->ini_overwrites[] = 'error_reporting=' . (E_ALL & ~$excluded_error_reporting);
        if (is_null($logger)) {
            require_once 'PEAR/Common.php';
            $logger = new PEAR_Common;
        }
        $this->_logger  = $logger;
        $this->_options = $options;

        $conf = &PEAR_Config::singleton();
        $this->_php = $conf->get('php_bin');
    }

    /**
     * Taken from php-src/run-tests.php
     *
     * @param string $commandline command name
     * @param array $env
     * @param string $stdin standard input to pass to the command
     * @return unknown
     */
    function system_with_timeout($commandline, $env = null, $stdin = null)
    {
        $data = '';
        $proc = proc_open($commandline, array(
            0 => array('pipe', 'r'),
            1 => array('pipe', 'w'),
            2 => array('pipe', 'w')
        ), $pipes, null, $env, array('suppress_errors' => true));

        if (!$proc) {
            return false;
        }

        if (is_string($stdin)) {
            fwrite($pipes[0], $stdin);
        }
        fclose($pipes[0]);

        while (true) {
            /* hide errors from interrupted syscalls */
            $r = $pipes;
            unset($r[0]);
            $e = $w = [];
            $n = @stream_select($r, $w, $e, 60);

            if ($n === 0) {
                /* timed out */
                $data .= "\n ** ERROR: process timed out **\n";
                proc_terminate($proc);
                return array(1234567890, $data);
            } else if ($n > 0) {
                $line = fread($pipes[1], 8192);
                if (strlen($line) == 0) {
                    /* EOF */
                    break;
                }
                $data .= $line;
            }
        }
        if (function_exists('proc_get_status')) {
            $stat = proc_get_status($proc);
            if ($stat['signaled']) {
                $data .= "\nTermsig=".$stat['stopsig'];
            }
        }
        $code = proc_close($proc);
        if (function_exists('proc_get_status')) {
            $code = $stat['exitcode'];
        }
        return array($code, $data);
    }

    /**
     * Turns a PHP INI string into an array
     *
     * Turns -d "include_path=/foo/bar" into this:
     * array(
     *   'include_path' => array(
     *          'operator' => '-d',
     *          'value'    => '/foo/bar',
     *   )
     * )
     * Works both with quotes and without
     *
     * @param string an PHP INI string, -d "include_path=/foo/bar"
     * @return array
     */
    function iniString2array($ini_string)
    {
        if (!$ini_string) {
            return array();
        }
        $split = preg_split('/[\s]|=/', $ini_string, -1, PREG_SPLIT_NO_EMPTY);
        $key   = $split[1][0] == '"'                     ? substr($split[1], 1)     : $split[1];
        $value = $split[2][strlen($split[2]) - 1] == '"' ? substr($split[2], 0, -1) : $split[2];
        // FIXME review if this is really the struct to go with
        $array = array($key => array('operator' => $split[0], 'value' => $value));
        return $array;
    }

    function settings2array($settings, $ini_settings)
    {
        foreach ($settings as $setting) {
            if (strpos($setting, '=') !== false) {
                $setting = explode('=', $setting, 2);
                $name  = trim(strtolower($setting[0]));
                $value = trim($setting[1]);
                $ini_settings[$name] = $value;
            }
        }
        return $ini_settings;
    }

    function settings2params($ini_settings)
    {
        $settings = '';
        foreach ($ini_settings as $name => $value) {
            if (is_array($value)) {
                $operator = $value['operator'];
                $value    = $value['value'];
            } else {
                $operator = '-d';
            }
            $value = addslashes($value);
            $settings .= " $operator \"$name=$value\"";
        }
        return $settings;
    }

    function _preparePhpBin($php, $file, $ini_settings)
    {
        $file = escapeshellarg($file);
        $cmd = $php . $ini_settings . ' -f ' . $file;

        return $cmd;
    }

    function runPHPUnit($file, $ini_settings = '')
    {
        if (!file_exists($file) && file_exists(getcwd() . DIRECTORY_SEPARATOR . $file)) {
            $file = realpath(getcwd() . DIRECTORY_SEPARATOR . $file);
        } elseif (file_exists($file)) {
            $file = realpath($file);
        }

        $cmd = $this->_preparePhpBin($this->_php, $file, $ini_settings);
        if (isset($this->_logger)) {
            $this->_logger->log(2, 'Running command "' . $cmd . '"');
        }

        $savedir = getcwd(); // in case the test moves us around
        chdir(dirname($file));
        echo `$cmd`;
        chdir($savedir);
        return 'PASSED'; // we have no way of knowing this information so assume passing
    }

    /**
     * Runs an individual test case.
     *
     * @param string       The filename of the test
     * @param array|string INI settings to be applied to the test run
     * @param integer      Number what the current running test is of the
     *                     whole test suite being runned.
     *
     * @return string|object Returns PASSED, WARNED, FAILED depending on how the
     *                       test came out.
     *                       PEAR Error when the tester it self fails
     */
    function run($file, $ini_settings = array(), $test_number = 1)
    {
        $this->_restorePHPBinary();

        if (empty($this->_options['cgi'])) {
            // try to see if php-cgi is in the path
            $res = $this->system_with_timeout('php-cgi -v');
            if (false !== $res && !(is_array($res) && in_array($res[0], array(-1, 127)))) {
                $this->_options['cgi'] = 'php-cgi';
            }
        }
        if (1 < $len = strlen($this->tests_count)) {
            $test_number = str_pad($test_number, $len, ' ', STR_PAD_LEFT);
            $test_nr = "[$test_number/$this->tests_count] ";
        } else {
            $test_nr = '';
        }

        $file = realpath($file);
        $section_text = $this->_readFile($file);
        if (PEAR::isError($section_text)) {
            return $section_text;
        }

        if (isset($section_text['POST_RAW']) && isset($section_text['UPLOAD'])) {
            return PEAR::raiseError("Cannot contain both POST_RAW and UPLOAD in test file: $file");
        }

        $cwd = getcwd();

        $pass_options = '';
        if (!empty($this->_options['ini'])) {
            $pass_options = $this->_options['ini'];
        }

        if (is_string($ini_settings)) {
            $ini_settings = $this->iniString2array($ini_settings);
        }

        $ini_settings = $this->settings2array($this->ini_overwrites, $ini_settings);
        if ($section_text['INI']) {
            if (strpos($section_text['INI'], '{PWD}') !== false) {
                $section_text['INI'] = str_replace('{PWD}', dirname($file), $section_text['INI']);
            }
            $ini = preg_split( "/[\n\r]+/", $section_text['INI']);
            $ini_settings = $this->settings2array($ini, $ini_settings);
        }
        $ini_settings = $this->settings2params($ini_settings);
        $shortname = str_replace($cwd . DIRECTORY_SEPARATOR, '', $file);

        $tested = trim($section_text['TEST']);
        $tested.= !isset($this->_options['simple']) ? "[$shortname]" : ' ';

        if (!empty($section_text['POST']) || !empty($section_text['POST_RAW']) ||
              !empty($section_text['UPLOAD']) || !empty($section_text['GET']) ||
              !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) {
            if (empty($this->_options['cgi'])) {
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, "SKIP $test_nr$tested (reason: --cgi option needed for this test, type 'pear help run-tests')");
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' # skip --cgi option needed for this test, "pear help run-tests" for info');
                }
                return 'SKIPPED';
            }
            $this->_savePHPBinary();
            $this->_php = $this->_options['cgi'];
        }

        $temp_dir = realpath(dirname($file));
        $main_file_name = basename($file, 'phpt');
        $diff_filename     = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'diff';
        $log_filename      = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'log';
        $exp_filename      = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'exp';
        $output_filename   = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'out';
        $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'mem';
        $temp_file         = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'php';
        $temp_skipif       = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'skip.php';
        $temp_clean        = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'clean.php';
        $tmp_post          = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.');

        // unlink old test results
        $this->_cleanupOldFiles($file);

        // Check if test should be skipped.
        $res  = $this->_runSkipIf($section_text, $temp_skipif, $tested, $ini_settings);
        if ($res == 'SKIPPED' || count($res) != 2) {
            return $res;
        }
        $info = $res['info'];
        $warn = $res['warn'];

        // We've satisfied the preconditions - run the test!
        if (isset($this->_options['coverage']) && $this->xdebug_loaded) {
            $xdebug_file = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name . 'xdebug';
            $text = "\n" . 'function coverage_shutdown() {' .
                    "\n" . '    $xdebug = var_export(xdebug_get_code_coverage(), true);';
            if (!function_exists('file_put_contents')) {
                $text .= "\n" . '    $fh = fopen(\'' . $xdebug_file . '\', "wb");' .
                        "\n" . '    if ($fh !== false) {' .
                        "\n" . '        fwrite($fh, $xdebug);' .
                        "\n" . '        fclose($fh);' .
                        "\n" . '    }';
            } else {
                $text .= "\n" . '    file_put_contents(\'' . $xdebug_file . '\', $xdebug);';
            }

            // Workaround for http://pear.php.net/bugs/bug.php?id=17292
            $lines             = explode("\n", $section_text['FILE']);
            $numLines          = count($lines);
            $namespace         = '';
            $coverage_shutdown = 'coverage_shutdown';

            if (
                substr($lines[0], 0, 2) == '<?' ||
                substr($lines[0], 0, 5) == '<?php'
            ) {
                unset($lines[0]);
            }


            for ($i = 0; $i < $numLines; $i++) {
                if (isset($lines[$i]) && substr($lines[$i], 0, 9) == 'namespace') {
                    $namespace         = substr($lines[$i], 10, -1);
                    $coverage_shutdown = $namespace . '\\coverage_shutdown';
                    $namespace         = "namespace " . $namespace . ";\n";

                    unset($lines[$i]);
                    break;
                }
            }

            $text .= "\n    xdebug_stop_code_coverage();" .
                "\n" . '} // end coverage_shutdown()' .
                "\n\n" . 'register_shutdown_function("' . $coverage_shutdown . '");';
            $text .= "\n" . 'xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);' . "\n";

            $this->save_text($temp_file, "<?php\n" . $namespace . $text  . "\n" . implode("\n", $lines));
        } else {
            $this->save_text($temp_file, $section_text['FILE']);
        }

        $args = $section_text['ARGS'] ? ' -- '.$section_text['ARGS'] : '';
        $cmd = $this->_preparePhpBin($this->_php, $temp_file, $ini_settings);
        $cmd.= "$args 2>&1";
        if (isset($this->_logger)) {
            $this->_logger->log(2, 'Running command "' . $cmd . '"');
        }

        // Reset environment from any previous test.
        $env = $this->_resetEnv($section_text, $temp_file);

        $section_text = $this->_processUpload($section_text, $file);
        if (PEAR::isError($section_text)) {
            return $section_text;
        }

        if (array_key_exists('POST_RAW', $section_text) && !empty($section_text['POST_RAW'])) {
            $post = trim($section_text['POST_RAW']);
            $raw_lines = explode("\n", $post);

            $request = '';
            $started = false;
            foreach ($raw_lines as $i => $line) {
                if (empty($env['CONTENT_TYPE']) &&
                    preg_match('/^Content-Type:(.*)/i', $line, $res)) {
                    $env['CONTENT_TYPE'] = trim(str_replace("\r", '', $res[1]));
                    continue;
                }
                if ($started) {
                    $request .= "\n";
                }
                $started = true;
                $request .= $line;
            }

            $env['CONTENT_LENGTH'] = strlen($request);
            $env['REQUEST_METHOD'] = 'POST';

            $this->save_text($tmp_post, $request);
            $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post";
        } elseif (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) {
            $post = trim($section_text['POST']);
            $this->save_text($tmp_post, $post);
            $content_length = strlen($post);

            $env['REQUEST_METHOD'] = 'POST';
            $env['CONTENT_TYPE']   = 'application/x-www-form-urlencoded';
            $env['CONTENT_LENGTH'] = $content_length;

            $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post";
        } else {
            $env['REQUEST_METHOD'] = 'GET';
            $env['CONTENT_TYPE']   = '';
            $env['CONTENT_LENGTH'] = '';
        }

        if (OS_WINDOWS && isset($section_text['RETURNS'])) {
            ob_start();
            system($cmd, $return_value);
            $out = ob_get_contents();
            ob_end_clean();
            $section_text['RETURNS'] = (int) trim($section_text['RETURNS']);
            $returnfail = ($return_value != $section_text['RETURNS']);
        } else {
            $returnfail = false;
            $stdin = isset($section_text['STDIN']) ? $section_text['STDIN'] : null;
            $out = $this->system_with_timeout($cmd, $env, $stdin);
            $return_value = $out[0];
            $out = $out[1];
        }

        $output = preg_replace('/\r\n/', "\n", trim($out));

        if (isset($tmp_post) && realpath($tmp_post) && file_exists($tmp_post)) {
            @unlink(realpath($tmp_post));
        }
        chdir($cwd); // in case the test moves us around

        /* when using CGI, strip the headers from the output */
        $output = $this->_stripHeadersCGI($output);

        if (isset($section_text['EXPECTHEADERS'])) {
            $testheaders = $this->_processHeaders($section_text['EXPECTHEADERS']);
            $missing = array_diff_assoc($testheaders, $this->_headers);
            $changed = '';
            foreach ($missing as $header => $value) {
                if (isset($this->_headers[$header])) {
                    $changed .= "-$header: $value\n+$header: ";
                    $changed .= $this->_headers[$header];
                } else {
                    $changed .= "-$header: $value\n";
                }
            }
            if ($missing) {
                // tack on failed headers to output:
                $output .= "\n====EXPECTHEADERS FAILURE====:\n$changed";
            }
        }

        $this->_testCleanup($section_text, $temp_clean);

        // Does the output match what is expected?
        do {
            if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) {
                if (isset($section_text['EXPECTF'])) {
                    $wanted = trim($section_text['EXPECTF']);
                } else {
                    $wanted = trim($section_text['EXPECTREGEX']);
                }
                $wanted_re = preg_replace('/\r\n/', "\n", $wanted);
                if (isset($section_text['EXPECTF'])) {
                    $wanted_re = preg_quote($wanted_re, '/');
                    // Stick to basics
                    $wanted_re = str_replace("%s", ".+?", $wanted_re); //not greedy
                    $wanted_re = str_replace("%S", ".*?", $wanted_re); //not greedy
                    $wanted_re = str_replace("%i", "[+\-]?[0-9]+", $wanted_re);
                    $wanted_re = str_replace("%d", "[0-9]+", $wanted_re);
                    $wanted_re = str_replace("%x", "[0-9a-fA-F]+", $wanted_re);
                    $wanted_re = str_replace("%f", "[+\-]?\.?[0-9]+\.?[0-9]*(E-?[0-9]+)?", $wanted_re);
                    $wanted_re = str_replace("%c", ".", $wanted_re);
                    // %f allows two points "-.0.0" but that is the best *simple* expression
                }

    /* DEBUG YOUR REGEX HERE
            var_dump($wanted_re);
            print(str_repeat('=', 80) . "\n");
            var_dump($output);
    */
                if (!$returnfail && preg_match("/^$wanted_re\$/s", $output)) {
                    if (file_exists($temp_file)) {
                        unlink($temp_file);
                    }
                    if (array_key_exists('FAIL', $section_text)) {
                        break;
                    }
                    if (!isset($this->_options['quiet'])) {
                        $this->_logger->log(0, "PASS $test_nr$tested$info");
                    }
                    if (isset($this->_options['tapoutput'])) {
                        return array('ok', ' - ' . $tested);
                    }
                    return 'PASSED';
                }
            } else {
                if (isset($section_text['EXPECTFILE'])) {
                    $f = $temp_dir . '/' . trim($section_text['EXPECTFILE']);
                    if (!($fp = @fopen($f, 'rb'))) {
                        return PEAR::raiseError('--EXPECTFILE-- section file ' .
                            $f . ' not found');
                    }
                    fclose($fp);
                    $section_text['EXPECT'] = file_get_contents($f);
                }

                if (isset($section_text['EXPECT'])) {
                    $wanted = preg_replace('/\r\n/', "\n", trim($section_text['EXPECT']));
                } else {
                    $wanted = '';
                }

                // compare and leave on success
                if (!$returnfail && 0 == strcmp($output, $wanted)) {
                    if (file_exists($temp_file)) {
                        unlink($temp_file);
                    }
                    if (array_key_exists('FAIL', $section_text)) {
                        break;
                    }
                    if (!isset($this->_options['quiet'])) {
                        $this->_logger->log(0, "PASS $test_nr$tested$info");
                    }
                    if (isset($this->_options['tapoutput'])) {
                        return array('ok', ' - ' . $tested);
                    }
                    return 'PASSED';
                }
            }
        } while (false);

        if (array_key_exists('FAIL', $section_text)) {
            // we expect a particular failure
            // this is only used for testing PEAR_RunTest
            $expectf  = isset($section_text['EXPECTF']) ? $wanted_re : null;
            $faildiff = $this->generate_diff($wanted, $output, null, $expectf);
            $faildiff = preg_replace('/\r/', '', $faildiff);
            $wanted   = preg_replace('/\r/', '', trim($section_text['FAIL']));
            if ($faildiff == $wanted) {
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, "PASS $test_nr$tested$info");
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' - ' . $tested);
                }
                return 'PASSED';
            }
            unset($section_text['EXPECTF']);
            $output = $faildiff;
            if (isset($section_text['RETURNS'])) {
                return PEAR::raiseError('Cannot have both RETURNS and FAIL in the same test: ' .
                    $file);
            }
        }

        // Test failed so we need to report details.
        $txt = $warn ? 'WARN ' : 'FAIL ';
        $this->_logger->log(0, $txt . $test_nr . $tested . $info);

        // write .exp
        $res = $this->_writeLog($exp_filename, $wanted);
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .out
        $res = $this->_writeLog($output_filename, $output);
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .diff
        $returns = isset($section_text['RETURNS']) ?
                        array(trim($section_text['RETURNS']), $return_value) : null;
        $expectf = isset($section_text['EXPECTF']) ? $wanted_re : null;
        $data = $this->generate_diff($wanted, $output, $returns, $expectf);
        $res  = $this->_writeLog($diff_filename, $data);
        if (isset($this->_options['showdiff'])) {
            $this->_logger->log(0, "========DIFF========");
            $this->_logger->log(0, $data);
            $this->_logger->log(0, "========DONE========");
        }
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .log
        $data = "
---- EXPECTED OUTPUT
$wanted
---- ACTUAL OUTPUT
$output
---- FAILED
";

        if ($returnfail) {
            $data .= "
---- EXPECTED RETURN
$section_text[RETURNS]
---- ACTUAL RETURN
$return_value
";
        }

        $res = $this->_writeLog($log_filename, $data);
        if (PEAR::isError($res)) {
            return $res;
        }

        if (isset($this->_options['tapoutput'])) {
            $wanted = explode("\n", $wanted);
            $wanted = "# Expected output:\n#\n#" . implode("\n#", $wanted);
            $output = explode("\n", $output);
            $output = "#\n#\n# Actual output:\n#\n#" . implode("\n#", $output);
            return array($wanted . $output . 'not ok', ' - ' . $tested);
        }
        return $warn ? 'WARNED' : 'FAILED';
    }

    function generate_diff($wanted, $output, $rvalue, $wanted_re)
    {
        $w  = explode("\n", $wanted);
        $o  = explode("\n", $output);
        $wr = explode("\n", $wanted_re);
        $w1 = array_diff_assoc($w, $o);
        $o1 = array_diff_assoc($o, $w);
        $o2 = $w2 = array();
        foreach ($w1 as $idx => $val) {
            if (!$wanted_re || !isset($wr[$idx]) || !isset($o1[$idx]) ||
                  !preg_match('/^' . $wr[$idx] . '\\z/', $o1[$idx])) {
                $w2[sprintf("%03d<", $idx)] = sprintf("%03d- ", $idx + 1) . $val;
            }
        }
        foreach ($o1 as $idx => $val) {
            if (!$wanted_re || !isset($wr[$idx]) ||
                  !preg_match('/^' . $wr[$idx] . '\\z/', $val)) {
                $o2[sprintf("%03d>", $idx)] = sprintf("%03d+ ", $idx + 1) . $val;
            }
        }
        $diff = array_merge($w2, $o2);
        ksort($diff);
        $extra = $rvalue ? "##EXPECTED: $rvalue[0]\r\n##RETURNED: $rvalue[1]" : '';
        return implode("\r\n", $diff) . $extra;
    }

    //  Write the given text to a temporary file, and return the filename.
    function save_text($filename, $text)
    {
        if (!$fp = fopen($filename, 'w')) {
            return PEAR::raiseError("Cannot open file '" . $filename . "' (save_text)");
        }
        fwrite($fp, $text);
        fclose($fp);
    if (1 < DETAILED) echo "
FILE $filename {{{
$text
}}}
";
    }

    function _cleanupOldFiles($file)
    {
        $temp_dir = realpath(dirname($file));
        $mainFileName = basename($file, 'phpt');
        $diff_filename     = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'diff';
        $log_filename      = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'log';
        $exp_filename      = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'exp';
        $output_filename   = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'out';
        $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'mem';
        $temp_file         = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'php';
        $temp_skipif       = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'skip.php';
        $temp_clean        = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'clean.php';
        $tmp_post          = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.');

        // unlink old test results
        @unlink($diff_filename);
        @unlink($log_filename);
        @unlink($exp_filename);
        @unlink($output_filename);
        @unlink($memcheck_filename);
        @unlink($temp_file);
        @unlink($temp_skipif);
        @unlink($tmp_post);
        @unlink($temp_clean);
    }

    function _runSkipIf($section_text, $temp_skipif, $tested, $ini_settings)
    {
        $info = '';
        $warn = false;
        if (array_key_exists('SKIPIF', $section_text) && trim($section_text['SKIPIF'])) {
            $this->save_text($temp_skipif, $section_text['SKIPIF']);
            $output = $this->system_with_timeout("$this->_php$ini_settings -f \"$temp_skipif\"");
            $output = $output[1];
            $loutput = ltrim($output);
            unlink($temp_skipif);
            if (!strncasecmp('skip', $loutput, 4)) {
                $skipreason = "SKIP $tested";
                if (preg_match('/^\s*skip\s*(.+)\s*/i', $output, $m)) {
                    $skipreason .= '(reason: ' . $m[1] . ')';
                }
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, $skipreason);
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' # skip ' . $reason);
                }
                return 'SKIPPED';
            }

            if (!strncasecmp('info', $loutput, 4)
                && preg_match('/^\s*info\s*(.+)\s*/i', $output, $m)) {
                $info = " (info: $m[1])";
            }

            if (!strncasecmp('warn', $loutput, 4)
                && preg_match('/^\s*warn\s*(.+)\s*/i', $output, $m)) {
                $warn = true; /* only if there is a reason */
                $info = " (warn: $m[1])";
            }
        }

        return array('warn' => $warn, 'info' => $info);
    }

    function _stripHeadersCGI($output)
    {
        $this->headers = array();
        if (!empty($this->_options['cgi']) &&
              $this->_php == $this->_options['cgi'] &&
              preg_match("/^(.*?)(?:\n\n(.*)|\\z)/s", $output, $match)) {
            $output = isset($match[2]) ? trim($match[2]) : '';
            $this->_headers = $this->_processHeaders($match[1]);
        }

        return $output;
    }

    /**
     * Return an array that can be used with array_diff() to compare headers
     *
     * @param string $text
     */
    function _processHeaders($text)
    {
        $headers = array();
        $rh = preg_split("/[\n\r]+/", $text);
        foreach ($rh as $line) {
            if (strpos($line, ':')!== false) {
                $line = explode(':', $line, 2);
                $headers[trim($line[0])] = trim($line[1]);
            }
        }
        return $headers;
    }

    function _readFile($file)
    {
        // Load the sections of the test file.
        $section_text = array(
            'TEST'   => '(unnamed test)',
            'SKIPIF' => '',
            'GET'    => '',
            'COOKIE' => '',
            'POST'   => '',
            'ARGS'   => '',
            'INI'    => '',
            'CLEAN'  => '',
        );

        if (!is_file($file) || !$fp = fopen($file, "r")) {
            return PEAR::raiseError("Cannot open test file: $file");
        }

        $section = '';
        while (!feof($fp)) {
            $line = fgets($fp);

            // Match the beginning of a section.
            if (preg_match('/^--([_A-Z]+)--/', $line, $r)) {
                $section = $r[1];
                $section_text[$section] = '';
                continue;
            } elseif (empty($section)) {
                fclose($fp);
                return PEAR::raiseError("Invalid sections formats in test file: $file");
            }

            // Add to the section text.
            $section_text[$section] .= $line;
        }
        fclose($fp);

        return $section_text;
    }

    function _writeLog($logname, $data)
    {
        if (!$log = fopen($logname, 'w')) {
            return PEAR::raiseError("Cannot create test log - $logname");
        }
        fwrite($log, $data);
        fclose($log);
    }

    function _resetEnv($section_text, $temp_file)
    {
        $env = $_ENV;
        $env['REDIRECT_STATUS'] = '';
        $env['QUERY_STRING']    = '';
        $env['PATH_TRANSLATED'] = '';
        $env['SCRIPT_FILENAME'] = '';
        $env['REQUEST_METHOD']  = '';
        $env['CONTENT_TYPE']    = '';
        $env['CONTENT_LENGTH']  = '';
        if (!empty($section_text['ENV'])) {
            if (strpos($section_text['ENV'], '{PWD}') !== false) {
                $section_text['ENV'] = str_replace('{PWD}', dirname($temp_file), $section_text['ENV']);
            }
            foreach (explode("\n", trim($section_text['ENV'])) as $e) {
                $e = explode('=', trim($e), 2);
                if (!empty($e[0]) && isset($e[1])) {
                    $env[$e[0]] = $e[1];
                }
            }
        }
        if (array_key_exists('GET', $section_text)) {
            $env['QUERY_STRING'] = trim($section_text['GET']);
        } else {
            $env['QUERY_STRING'] = '';
        }
        if (array_key_exists('COOKIE', $section_text)) {
            $env['HTTP_COOKIE'] = trim($section_text['COOKIE']);
        } else {
            $env['HTTP_COOKIE'] = '';
        }
        $env['REDIRECT_STATUS'] = '1';
        $env['PATH_TRANSLATED'] = $temp_file;
        $env['SCRIPT_FILENAME'] = $temp_file;

        return $env;
    }

    function _processUpload($section_text, $file)
    {
        if (array_key_exists('UPLOAD', $section_text) && !empty($section_text['UPLOAD'])) {
            $upload_files = trim($section_text['UPLOAD']);
            $upload_files = explode("\n", $upload_files);

            $request = "Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737\n" .
                       "-----------------------------20896060251896012921717172737\n";
            foreach ($upload_files as $fileinfo) {
                $fileinfo = explode('=', $fileinfo);
                if (count($fileinfo) != 2) {
                    return PEAR::raiseError("Invalid UPLOAD section in test file: $file");
                }
                if (!realpath(dirname($file) . '/' . $fileinfo[1])) {
                    return PEAR::raiseError("File for upload does not exist: $fileinfo[1] " .
                        "in test file: $file");
                }
                $file_contents = file_get_contents(dirname($file) . '/' . $fileinfo[1]);
                $fileinfo[1] = basename($fileinfo[1]);
                $request .= "Content-Disposition: form-data; name=\"$fileinfo[0]\"; filename=\"$fileinfo[1]\"\n";
                $request .= "Content-Type: text/plain\n\n";
                $request .= $file_contents . "\n" .
                    "-----------------------------20896060251896012921717172737\n";
            }

            if (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) {
                // encode POST raw
                $post = trim($section_text['POST']);
                $post = explode('&', $post);
                foreach ($post as $i => $post_info) {
                    $post_info = explode('=', $post_info);
                    if (count($post_info) != 2) {
                        return PEAR::raiseError("Invalid POST data in test file: $file");
                    }
                    $post_info[0] = rawurldecode($post_info[0]);
                    $post_info[1] = rawurldecode($post_info[1]);
                    $post[$i] = $post_info;
                }
                foreach ($post as $post_info) {
                    $request .= "Content-Disposition: form-data; name=\"$post_info[0]\"\n\n";
                    $request .= $post_info[1] . "\n" .
                        "-----------------------------20896060251896012921717172737\n";
                }
                unset($section_text['POST']);
            }
            $section_text['POST_RAW'] = $request;
        }

        return $section_text;
    }

    function _testCleanup($section_text, $temp_clean)
    {
        if ($section_text['CLEAN']) {
            $this->_restorePHPBinary();

            // perform test cleanup
            $this->save_text($temp_clean, $section_text['CLEAN']);
            $output = $this->system_with_timeout("$this->_php $temp_clean  2>&1");
            if (strlen($output[1])) {
                echo "BORKED --CLEAN-- section! output:\n", $output[1];
            }
            if (file_exists($temp_clean)) {
                unlink($temp_clean);
            }
        }
    }

    function _savePHPBinary()
    {
        $this->_savephp = $this->_php;
    }

    function _restorePHPBinary()
    {
        if (isset($this->_savephp))
        {
            $this->_php = $this->_savephp;
            unset($this->_savephp);
        }
    }
}
pear/PEAR/Packager.php000064400000017040151732710130010452 0ustar00<?php
/**
 * PEAR_Packager for generating releases
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/PackageFile.php';
require_once 'System.php';

/**
 * Administration class used to make a PEAR release tarball.
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Packager extends PEAR_Common
{
    /**
     * @var PEAR_Registry
     */
    var $_registry;

    function package($pkgfile = null, $compress = true, $pkg2 = null)
    {
        // {{{ validate supplied package.xml file
        if (empty($pkgfile)) {
            $pkgfile = 'package.xml';
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $pkg  = new PEAR_PackageFile($this->config, $this->debug);
        $pf   = &$pkg->fromPackageFile($pkgfile, PEAR_VALIDATE_NORMAL);
        $main = &$pf;
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            if (is_array($pf->getUserInfo())) {
                foreach ($pf->getUserInfo() as $error) {
                    $this->log(0, 'Error: ' . $error['message']);
                }
            }

            $this->log(0, $pf->getMessage());
            return $this->raiseError("Cannot package, errors in package file");
        }

        foreach ($pf->getValidationWarnings() as $warning) {
            $this->log(1, 'Warning: ' . $warning['message']);
        }

        // }}}
        if ($pkg2) {
            $this->log(0, 'Attempting to process the second package file');
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $pf2 = &$pkg->fromPackageFile($pkg2, PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($pf2)) {
                if (is_array($pf2->getUserInfo())) {
                    foreach ($pf2->getUserInfo() as $error) {
                        $this->log(0, 'Error: ' . $error['message']);
                    }
                }
                $this->log(0, $pf2->getMessage());
                return $this->raiseError("Cannot package, errors in second package file");
            }

            foreach ($pf2->getValidationWarnings() as $warning) {
                $this->log(1, 'Warning: ' . $warning['message']);
            }

            if ($pf2->getPackagexmlVersion() == '2.0' ||
                  $pf2->getPackagexmlVersion() == '2.1'
            ) {
                $main  = &$pf2;
                $other = &$pf;
            } else {
                $main  = &$pf;
                $other = &$pf2;
            }

            if ($main->getPackagexmlVersion() != '2.0' &&
                  $main->getPackagexmlVersion() != '2.1') {
                return PEAR::raiseError('Error: cannot package two package.xml version 1.0, can ' .
                    'only package together a package.xml 1.0 and package.xml 2.0');
            }

            if ($other->getPackagexmlVersion() != '1.0') {
                return PEAR::raiseError('Error: cannot package two package.xml version 2.0, can ' .
                    'only package together a package.xml 1.0 and package.xml 2.0');
            }
        }

        $main->setLogger($this);
        if (!$main->validate(PEAR_VALIDATE_PACKAGING)) {
            foreach ($main->getValidationWarnings() as $warning) {
                $this->log(0, 'Error: ' . $warning['message']);
            }
            return $this->raiseError("Cannot package, errors in package");
        }

        foreach ($main->getValidationWarnings() as $warning) {
            $this->log(1, 'Warning: ' . $warning['message']);
        }

        if ($pkg2) {
            $other->setLogger($this);
            $a = false;
            if (!$other->validate(PEAR_VALIDATE_NORMAL) || $a = !$main->isEquivalent($other)) {
                foreach ($other->getValidationWarnings() as $warning) {
                    $this->log(0, 'Error: ' . $warning['message']);
                }

                foreach ($main->getValidationWarnings() as $warning) {
                    $this->log(0, 'Error: ' . $warning['message']);
                }

                if ($a) {
                    return $this->raiseError('The two package.xml files are not equivalent!');
                }

                return $this->raiseError("Cannot package, errors in package");
            }

            foreach ($other->getValidationWarnings() as $warning) {
                $this->log(1, 'Warning: ' . $warning['message']);
            }

            $gen = &$main->getDefaultGenerator();
            $tgzfile = $gen->toTgz2($this, $other, $compress);
            if (PEAR::isError($tgzfile)) {
                return $tgzfile;
            }

            $dest_package = basename($tgzfile);
            $pkgdir       = dirname($pkgfile);

            // TAR the Package -------------------------------------------
            $this->log(1, "Package $dest_package done");
            if (file_exists("$pkgdir/CVS/Root")) {
                $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion());
                $cvstag = "RELEASE_$cvsversion";
                $this->log(1, 'Tag the released code with "pear cvstag ' .
                    $main->getPackageFile() . '"');
                $this->log(1, "(or set the CVS tag $cvstag by hand)");
            } elseif (file_exists("$pkgdir/.svn")) {
                $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion());
                $svntag = $pf->getName() . "-$svnversion";
                $this->log(1, 'Tag the released code with "pear svntag ' .
                    $main->getPackageFile() . '"');
                $this->log(1, "(or set the SVN tag $svntag by hand)");
            }
        } else { // this branch is executed for single packagefile packaging
            $gen = &$pf->getDefaultGenerator();
            $tgzfile = $gen->toTgz($this, $compress);
            if (PEAR::isError($tgzfile)) {
                $this->log(0, $tgzfile->getMessage());
                return $this->raiseError("Cannot package, errors in package");
            }

            $dest_package = basename($tgzfile);
            $pkgdir       = dirname($pkgfile);

            // TAR the Package -------------------------------------------
            $this->log(1, "Package $dest_package done");
            if (file_exists("$pkgdir/CVS/Root")) {
                $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion());
                $cvstag = "RELEASE_$cvsversion";
                $this->log(1, "Tag the released code with `pear cvstag $pkgfile'");
                $this->log(1, "(or set the CVS tag $cvstag by hand)");
            } elseif (file_exists("$pkgdir/.svn")) {
                $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion());
                $svntag = $pf->getName() . "-$svnversion";
                $this->log(1, "Tag the released code with `pear svntag $pkgfile'");
                $this->log(1, "(or set the SVN tag $svntag by hand)");
            }
        }

        return $dest_package;
    }
}pear/PEAR/XMLParser.php000064400000015377151732710130010565 0ustar00<?php
/**
 * PEAR_XMLParser
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Unserializer code)
 * @copyright  1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Parser for any xml file
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @author    Stephan Schmidt (original XML_Unserializer code)
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_XMLParser
{
    /**
     * unserilialized data
     * @var string $_serializedData
     */
    var $_unserializedData = null;

    /**
     * name of the root tag
     * @var string $_root
     */
    var $_root = null;

    /**
     * stack for all data that is found
     * @var array    $_dataStack
     */
    var $_dataStack = array();

    /**
     * stack for all values that are generated
     * @var array    $_valStack
     */
    var $_valStack = array();

    /**
     * current tag depth
     * @var int    $_depth
     */
    var $_depth = 0;

    /**
     * The XML encoding to use
     * @var string $encoding
     */
    var $encoding = 'ISO-8859-1';

    /**
     * @return array
     */
    function getData()
    {
        return $this->_unserializedData;
    }

    /**
     * @param string xml content
     * @return true|PEAR_Error
     */
    function parse($data)
    {
        if (!extension_loaded('xml')) {
            include_once 'PEAR.php';
            return PEAR::raiseError("XML Extension not found", 1);
        }
        $this->_dataStack =  $this->_valStack = array();
        $this->_depth = 0;

        if (
            strpos($data, 'encoding="UTF-8"')
            || strpos($data, 'encoding="utf-8"')
            || strpos($data, "encoding='UTF-8'")
            || strpos($data, "encoding='utf-8'")
        ) {
            $this->encoding = 'UTF-8';
        }

        $xp = xml_parser_create($this->encoding);
        xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, 0);
        xml_set_object($xp, $this);
        xml_set_element_handler($xp, 'startHandler', 'endHandler');
        xml_set_character_data_handler($xp, 'cdataHandler');
        if (!xml_parse($xp, $data)) {
            $msg = xml_error_string(xml_get_error_code($xp));
            $line = xml_get_current_line_number($xp);
            xml_parser_free($xp);
            include_once 'PEAR.php';
            return PEAR::raiseError("XML Error: '$msg' on line '$line'", 2);
        }
        xml_parser_free($xp);
        return true;
    }

    /**
     * Start element handler for XML parser
     *
     * @access private
     * @param  object $parser  XML parser object
     * @param  string $element XML element
     * @param  array  $attribs attributes of XML tag
     * @return void
     */
    function startHandler($parser, $element, $attribs)
    {
        $this->_depth++;
        $this->_dataStack[$this->_depth] = null;

        $val = array(
            'name'         => $element,
            'value'        => null,
            'type'         => 'string',
            'childrenKeys' => array(),
            'aggregKeys'   => array()
       );

        if (count($attribs) > 0) {
            $val['children'] = array();
            $val['type'] = 'array';
            $val['children']['attribs'] = $attribs;
        }

        array_push($this->_valStack, $val);
    }

    /**
     * post-process data
     *
     * @param string $data
     * @param string $element element name
     */
    function postProcess($data, $element)
    {
        return trim($data);
    }

    /**
     * End element handler for XML parser
     *
     * @access private
     * @param  object XML parser object
     * @param  string
     * @return void
     */
    function endHandler($parser, $element)
    {
        $value = array_pop($this->_valStack);
        $data  = $this->postProcess($this->_dataStack[$this->_depth], $element);

        // adjust type of the value
        switch (strtolower($value['type'])) {
            // unserialize an array
            case 'array':
                if ($data !== '') {
                    $value['children']['_content'] = $data;
                }

                $value['value'] = isset($value['children']) ? $value['children'] : array();
                break;

            /*
             * unserialize a null value
             */
            case 'null':
                $data = null;
                break;

            /*
             * unserialize any scalar value
             */
            default:
                settype($data, $value['type']);
                $value['value'] = $data;
                break;
        }

        $parent = array_pop($this->_valStack);
        if ($parent === null) {
            $this->_unserializedData = &$value['value'];
            $this->_root = &$value['name'];
            return true;
        }

        // parent has to be an array
        if (!isset($parent['children']) || !is_array($parent['children'])) {
            $parent['children'] = array();
            if ($parent['type'] != 'array') {
                $parent['type'] = 'array';
            }
        }

        if (!empty($value['name'])) {
            // there already has been a tag with this name
            if (in_array($value['name'], $parent['childrenKeys'])) {
                // no aggregate has been created for this tag
                if (!in_array($value['name'], $parent['aggregKeys'])) {
                    if (isset($parent['children'][$value['name']])) {
                        $parent['children'][$value['name']] = array($parent['children'][$value['name']]);
                    } else {
                        $parent['children'][$value['name']] = array();
                    }
                    array_push($parent['aggregKeys'], $value['name']);
                }
                array_push($parent['children'][$value['name']], $value['value']);
            } else {
                $parent['children'][$value['name']] = &$value['value'];
                array_push($parent['childrenKeys'], $value['name']);
            }
        } else {
            array_push($parent['children'],$value['value']);
        }
        array_push($this->_valStack, $parent);

        $this->_depth--;
    }

    /**
     * Handler for character data
     *
     * @access private
     * @param  object XML parser object
     * @param  string CDATA
     * @return void
     */
    function cdataHandler($parser, $cdata)
    {
        $this->_dataStack[$this->_depth] .= $cdata;
    }
}pear/PEAR/DependencyDB.php000064400000057401151732710130011226 0ustar00<?php
/**
 * PEAR_DependencyDB, advanced installed packages dependency database
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Config.php';

$GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'] = array();
/**
 * Track dependency relationships between installed packages
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Tomas V.V.Cox <cox@idec.net.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_DependencyDB
{
    // {{{ properties

    /**
     * This is initialized by {@link setConfig()}
     * @var PEAR_Config
     * @access private
     */
    var $_config;
    /**
     * This is initialized by {@link setConfig()}
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;
    /**
     * Filename of the dependency DB (usually .depdb)
     * @var string
     * @access private
     */
    var $_depdb = false;
    /**
     * File name of the lockfile (usually .depdblock)
     * @var string
     * @access private
     */
    var $_lockfile = false;
    /**
     * Open file resource for locking the lockfile
     * @var resource|false
     * @access private
     */
    var $_lockFp = false;
    /**
     * API version of this class, used to validate a file on-disk
     * @var string
     * @access private
     */
    var $_version = '1.0';
    /**
     * Cached dependency database file
     * @var array|null
     * @access private
     */
    var $_cache;

    // }}}
    // {{{ & singleton()

    /**
     * Get a raw dependency database.  Calls setConfig() and assertDepsDB()
     * @param PEAR_Config
     * @param string|false full path to the dependency database, or false to use default
     * @return PEAR_DependencyDB|PEAR_Error
     */
    public static function &singleton(&$config, $depdb = false)
    {
        $phpdir = $config->get('php_dir', null, 'pear.php.net');
        if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir])) {
            $a = new PEAR_DependencyDB;
            $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir] = &$a;
            $a->setConfig($config, $depdb);
            $e = $a->assertDepsDB();
            if (PEAR::isError($e)) {
                return $e;
            }
        }

        return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir];
    }

    /**
     * Set up the registry/location of dependency DB
     * @param PEAR_Config|false
     * @param string|false full path to the dependency database, or false to use default
     */
    function setConfig(&$config, $depdb = false)
    {
        if (!$config) {
            $this->_config = &PEAR_Config::singleton();
        } else {
            $this->_config = &$config;
        }

        $this->_registry = &$this->_config->getRegistry();
        if (!$depdb) {
            $dir = $this->_config->get('metadata_dir', null, 'pear.php.net');
            if (!$dir) {
                $dir = $this->_config->get('php_dir', null, 'pear.php.net');
            }
            $this->_depdb =  $dir . DIRECTORY_SEPARATOR . '.depdb';
        } else {
            $this->_depdb = $depdb;
        }

        $this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock';
    }
    // }}}

    function hasWriteAccess()
    {
        if (!file_exists($this->_depdb)) {
            $dir = $this->_depdb;
            while ($dir && $dir != '.') {
                $dir = dirname($dir); // cd ..
                if ($dir != '.' && file_exists($dir)) {
                    if (is_writeable($dir)) {
                        return true;
                    }

                    return false;
                }
            }

            return false;
        }

        return is_writeable($this->_depdb);
    }

    // {{{ assertDepsDB()

    /**
     * Create the dependency database, if it doesn't exist.  Error if the database is
     * newer than the code reading it.
     * @return void|PEAR_Error
     */
    function assertDepsDB()
    {
        if (!is_file($this->_depdb)) {
            $this->rebuildDB();
            return;
        }

        $depdb = $this->_getDepDB();
        // Datatype format has been changed, rebuild the Deps DB
        if ($depdb['_version'] < $this->_version) {
            $this->rebuildDB();
        }

        if ($depdb['_version'][0] > $this->_version[0]) {
            return PEAR::raiseError('Dependency database is version ' .
                $depdb['_version'] . ', and we are version ' .
                $this->_version . ', cannot continue');
        }
    }

    /**
     * Get a list of installed packages that depend on this package
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependentPackages(&$pkg)
    {
        $data = $this->_getDepDB();
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        if (isset($data['packages'][$channel][$package])) {
            return $data['packages'][$channel][$package];
        }

        return false;
    }

    /**
     * Get a list of the actual dependencies of installed packages that depend on
     * a package.
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependentPackageDependencies(&$pkg)
    {
        $data = $this->_getDepDB();
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else if (is_array($pkg)) {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        } else {
            return false;
        }

        $depend = $this->getDependentPackages($pkg);
        if (!$depend) {
            return false;
        }

        $dependencies = array();
        foreach ($depend as $info) {
            $temp = $this->getDependencies($info);
            foreach ($temp as $dep) {
                if (
                    isset($dep['dep'], $dep['dep']['channel'], $dep['dep']['name']) &&
                    strtolower($dep['dep']['channel']) == $channel &&
                    strtolower($dep['dep']['name']) == $package
                ) {
                    if (!isset($dependencies[$info['channel']])) {
                        $dependencies[$info['channel']] = array();
                    }

                    if (!isset($dependencies[$info['channel']][$info['package']])) {
                        $dependencies[$info['channel']][$info['package']] = array();
                    }
                    $dependencies[$info['channel']][$info['package']][] = $dep;
                }
            }
        }

        return $dependencies;
    }

    /**
     * Get a list of dependencies of this installed package
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependencies(&$pkg)
    {
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        $data = $this->_getDepDB();
        if (isset($data['dependencies'][$channel][$package])) {
            return $data['dependencies'][$channel][$package];
        }

        return false;
    }

    /**
     * Determine whether $parent depends on $child, near or deep
     * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
     * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
     */
    function dependsOn($parent, $child)
    {
        $c = array();
        $this->_getDepDB();
        return $this->_dependsOn($parent, $child, $c);
    }

    function _dependsOn($parent, $child, &$checked)
    {
        if (is_object($parent)) {
            $channel = strtolower($parent->getChannel());
            $package = strtolower($parent->getPackage());
        } else {
            $channel = strtolower($parent['channel']);
            $package = strtolower($parent['package']);
        }

        if (is_object($child)) {
            $depchannel = strtolower($child->getChannel());
            $deppackage = strtolower($child->getPackage());
        } else {
            $depchannel = strtolower($child['channel']);
            $deppackage = strtolower($child['package']);
        }

        if (isset($checked[$channel][$package][$depchannel][$deppackage])) {
            return false; // avoid endless recursion
        }

        $checked[$channel][$package][$depchannel][$deppackage] = true;
        if (!isset($this->_cache['dependencies'][$channel][$package])) {
            return false;
        }

        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
            if (isset($info['dep']['uri'])) {
                if (is_object($child)) {
                    if ($info['dep']['uri'] == $child->getURI()) {
                        return true;
                    }
                } elseif (isset($child['uri'])) {
                    if ($info['dep']['uri'] == $child['uri']) {
                        return true;
                    }
                }
                return false;
            }

            if (strtolower($info['dep']['channel']) == $depchannel &&
                  strtolower($info['dep']['name']) == $deppackage) {
                return true;
            }
        }

        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
            if (isset($info['dep']['uri'])) {
                if ($this->_dependsOn(array(
                        'uri' => $info['dep']['uri'],
                        'package' => $info['dep']['name']), $child, $checked)) {
                    return true;
                }
            } else {
                if ($this->_dependsOn(array(
                        'channel' => $info['dep']['channel'],
                        'package' => $info['dep']['name']), $child, $checked)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Register dependencies of a package that is being installed or upgraded
     * @param PEAR_PackageFile_v2|PEAR_PackageFile_v2
     */
    function installPackage(&$package)
    {
        $data = $this->_getDepDB();
        unset($this->_cache);
        $this->_setPackageDeps($data, $package);
        $this->_writeDepDB($data);
    }

    /**
     * Remove dependencies of a package that is being uninstalled, or upgraded.
     *
     * Upgraded packages first uninstall, then install
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array If an array, then it must have
     *        indices 'channel' and 'package'
     */
    function uninstallPackage(&$pkg)
    {
        $data = $this->_getDepDB();
        unset($this->_cache);
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        if (!isset($data['dependencies'][$channel][$package])) {
            return true;
        }

        foreach ($data['dependencies'][$channel][$package] as $dep) {
            $found      = false;
            $depchannel = isset($dep['dep']['uri']) ? '__uri' : strtolower($dep['dep']['channel']);
            $depname    = strtolower($dep['dep']['name']);
            if (isset($data['packages'][$depchannel][$depname])) {
                foreach ($data['packages'][$depchannel][$depname] as $i => $info) {
                    if ($info['channel'] == $channel && $info['package'] == $package) {
                        $found = true;
                        break;
                    }
                }
            }

            if ($found) {
                unset($data['packages'][$depchannel][$depname][$i]);
                if (!count($data['packages'][$depchannel][$depname])) {
                    unset($data['packages'][$depchannel][$depname]);
                    if (!count($data['packages'][$depchannel])) {
                        unset($data['packages'][$depchannel]);
                    }
                } else {
                    $data['packages'][$depchannel][$depname] =
                        array_values($data['packages'][$depchannel][$depname]);
                }
            }
        }

        unset($data['dependencies'][$channel][$package]);
        if (!count($data['dependencies'][$channel])) {
            unset($data['dependencies'][$channel]);
        }

        if (!count($data['dependencies'])) {
            unset($data['dependencies']);
        }

        if (!count($data['packages'])) {
            unset($data['packages']);
        }

        $this->_writeDepDB($data);
    }

    /**
     * Rebuild the dependency DB by reading registry entries.
     * @return true|PEAR_Error
     */
    function rebuildDB()
    {
        $depdb = array('_version' => $this->_version);
        if (!$this->hasWriteAccess()) {
            // allow startup for read-only with older Registry
            return $depdb;
        }

        $packages = $this->_registry->listAllPackages();
        if (PEAR::isError($packages)) {
            return $packages;
        }

        foreach ($packages as $channel => $ps) {
            foreach ($ps as $package) {
                $package = $this->_registry->getPackage($package, $channel);
                if (PEAR::isError($package)) {
                    return $package;
                }
                $this->_setPackageDeps($depdb, $package);
            }
        }

        $error = $this->_writeDepDB($depdb);
        if (PEAR::isError($error)) {
            return $error;
        }

        $this->_cache = $depdb;
        return true;
    }

    /**
     * Register usage of the dependency DB to prevent race conditions
     * @param int one of the LOCK_* constants
     * @return true|PEAR_Error
     * @access private
     */
    function _lock($mode = LOCK_EX)
    {
        if (stristr(php_uname(), 'Windows 9')) {
            return true;
        }

        if ($mode != LOCK_UN && is_resource($this->_lockFp)) {
            // XXX does not check type of lock (LOCK_SH/LOCK_EX)
            return true;
        }

        $open_mode = 'w';
        // XXX People reported problems with LOCK_SH and 'w'
        if ($mode === LOCK_SH) {
            if (!file_exists($this->_lockfile)) {
                touch($this->_lockfile);
            } elseif (!is_file($this->_lockfile)) {
                return PEAR::raiseError('could not create Dependency lock file, ' .
                    'it exists and is not a regular file');
            }
            $open_mode = 'r';
        }

        if (!is_resource($this->_lockFp)) {
            $this->_lockFp = @fopen($this->_lockfile, $open_mode);
        }

        if (!is_resource($this->_lockFp)) {
            $last_errormsg = '';
            $last_error = error_get_last();
            if (!empty($last_error['message'])) {
                $last_errormsg = $last_error['message'];
            }
            return PEAR::raiseError("could not create Dependency lock file" .
                                     (isset($last_errormsg) ? ": " . $last_errormsg : ""));
        }

        if (!(int)flock($this->_lockFp, $mode)) {
            switch ($mode) {
                case LOCK_SH: $str = 'shared';    break;
                case LOCK_EX: $str = 'exclusive'; break;
                case LOCK_UN: $str = 'unlock';    break;
                default:      $str = 'unknown';   break;
            }

            return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)");
        }

        return true;
    }

    /**
     * Release usage of dependency DB
     * @return true|PEAR_Error
     * @access private
     */
    function _unlock()
    {
        $ret = $this->_lock(LOCK_UN);
        if (is_resource($this->_lockFp)) {
            fclose($this->_lockFp);
        }
        $this->_lockFp = null;
        return $ret;
    }

    /**
     * Load the dependency database from disk, or return the cache
     * @return array|PEAR_Error
     */
    function _getDepDB()
    {
        if (!$this->hasWriteAccess()) {
            return array('_version' => $this->_version);
        }

        if (isset($this->_cache)) {
            return $this->_cache;
        }

        if (!$fp = fopen($this->_depdb, 'r')) {
            $err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'");
            return $err;
        }

        clearstatcache();
        fclose($fp);
        $data = @unserialize(file_get_contents($this->_depdb));
        $this->_cache = $data;
        return $data;
    }

    /**
     * Write out the dependency database to disk
     * @param array the database
     * @return true|PEAR_Error
     * @access private
     */
    function _writeDepDB(&$deps)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        if (!$fp = fopen($this->_depdb, 'wb')) {
            $this->_unlock();
            return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing");
        }

        fwrite($fp, serialize($deps));
        fclose($fp);
        $this->_unlock();
        $this->_cache = $deps;
        return true;
    }

    /**
     * Register all dependencies from a package in the dependencies database, in essence
     * "installing" the package's dependency information
     * @param array the database
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @access private
     */
    function _setPackageDeps(&$data, &$pkg)
    {
        $pkg->setConfig($this->_config);
        if ($pkg->getPackagexmlVersion() == '1.0') {
            $gen = &$pkg->getDefaultGenerator();
            $deps = $gen->dependenciesToV2();
        } else {
            $deps = $pkg->getDeps(true);
        }

        if (!$deps) {
            return;
        }

        if (!is_array($data)) {
            $data = array();
        }

        if (!isset($data['dependencies'])) {
            $data['dependencies'] = array();
        }

        $channel = strtolower($pkg->getChannel());
        $package = strtolower($pkg->getPackage());

        if (!isset($data['dependencies'][$channel])) {
            $data['dependencies'][$channel] = array();
        }

        $data['dependencies'][$channel][$package] = array();
        if (isset($deps['required']['package'])) {
            if (!isset($deps['required']['package'][0])) {
                $deps['required']['package'] = array($deps['required']['package']);
            }

            foreach ($deps['required']['package'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'required');
            }
        }

        if (isset($deps['optional']['package'])) {
            if (!isset($deps['optional']['package'][0])) {
                $deps['optional']['package'] = array($deps['optional']['package']);
            }

            foreach ($deps['optional']['package'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'optional');
            }
        }

        if (isset($deps['required']['subpackage'])) {
            if (!isset($deps['required']['subpackage'][0])) {
                $deps['required']['subpackage'] = array($deps['required']['subpackage']);
            }

            foreach ($deps['required']['subpackage'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'required');
            }
        }

        if (isset($deps['optional']['subpackage'])) {
            if (!isset($deps['optional']['subpackage'][0])) {
                $deps['optional']['subpackage'] = array($deps['optional']['subpackage']);
            }

            foreach ($deps['optional']['subpackage'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'optional');
            }
        }

        if (isset($deps['group'])) {
            if (!isset($deps['group'][0])) {
                $deps['group'] = array($deps['group']);
            }

            foreach ($deps['group'] as $group) {
                if (isset($group['package'])) {
                    if (!isset($group['package'][0])) {
                        $group['package'] = array($group['package']);
                    }

                    foreach ($group['package'] as $dep) {
                        $this->_registerDep($data, $pkg, $dep, 'optional',
                            $group['attribs']['name']);
                    }
                }

                if (isset($group['subpackage'])) {
                    if (!isset($group['subpackage'][0])) {
                        $group['subpackage'] = array($group['subpackage']);
                    }

                    foreach ($group['subpackage'] as $dep) {
                        $this->_registerDep($data, $pkg, $dep, 'optional',
                            $group['attribs']['name']);
                    }
                }
            }
        }

        if ($data['dependencies'][$channel][$package] == array()) {
            unset($data['dependencies'][$channel][$package]);
            if (!count($data['dependencies'][$channel])) {
                unset($data['dependencies'][$channel]);
            }
        }
    }

    /**
     * @param array the database
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param array the specific dependency
     * @param required|optional whether this is a required or an optional dep
     * @param string|false dependency group this dependency is from, or false for ordinary dep
     */
    function _registerDep(&$data, &$pkg, $dep, $type, $group = false)
    {
        $info = array(
            'dep'   => $dep,
            'type'  => $type,
            'group' => $group
        );

        $dep  = array_map('strtolower', $dep);
        $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
        if (!isset($data['dependencies'])) {
            $data['dependencies'] = array();
        }

        $channel = strtolower($pkg->getChannel());
        $package = strtolower($pkg->getPackage());

        if (!isset($data['dependencies'][$channel])) {
            $data['dependencies'][$channel] = array();
        }

        if (!isset($data['dependencies'][$channel][$package])) {
            $data['dependencies'][$channel][$package] = array();
        }

        $data['dependencies'][$channel][$package][] = $info;
        if (isset($data['packages'][$depchannel][$dep['name']])) {
            $found = false;
            foreach ($data['packages'][$depchannel][$dep['name']] as $i => $p) {
                if ($p['channel'] == $channel && $p['package'] == $package) {
                    $found = true;
                    break;
                }
            }
        } else {
            if (!isset($data['packages'])) {
                $data['packages'] = array();
            }

            if (!isset($data['packages'][$depchannel])) {
                $data['packages'][$depchannel] = array();
            }

            if (!isset($data['packages'][$depchannel][$dep['name']])) {
                $data['packages'][$depchannel][$dep['name']] = array();
            }

            $found = false;
        }

        if (!$found) {
            $data['packages'][$depchannel][$dep['name']][] = array(
                'channel' => $channel,
                'package' => $package
            );
        }
    }
}
pear/PEAR/PackageFile/v2/rw.php000064400000173137151732710130012061 0ustar00<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0, read/write version
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a8
 */
/**
 * For base class
 */
require_once 'PEAR/PackageFile/v2.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a8
 */
class PEAR_PackageFile_v2_rw extends PEAR_PackageFile_v2
{
    /**
     * @param string Extension name
     * @return bool success of operation
     */
    function setProvidesExtension($extension)
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            if (!isset($this->_packageInfo['providesextension'])) {
                // ensure that the channel tag is set up in the right location
                $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                    array('usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease',
                    'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                    'bundle', 'changelog'),
                    $extension, 'providesextension');
            }
            $this->_packageInfo['providesextension'] = $extension;
            return true;
        }
        return false;
    }

    function setPackage($package)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['attribs'])) {
            $this->_packageInfo = array_merge(array('attribs' => array(
                                 'version' => '2.0',
                                 'xmlns' => 'http://pear.php.net/dtd/package-2.0',
                                 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                                 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                                 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
    http://pear.php.net/dtd/tasks-1.0.xsd
    http://pear.php.net/dtd/package-2.0
    http://pear.php.net/dtd/package-2.0.xsd',
                             )), $this->_packageInfo);
        }
        if (!isset($this->_packageInfo['name'])) {
            return $this->_packageInfo = array_merge(array('name' => $package),
                $this->_packageInfo);
        }
        $this->_packageInfo['name'] = $package;
    }

    /**
     * set this as a package.xml version 2.1
     * @access private
     */
    function _setPackageVersion2_1()
    {
        $info = array(
                                 'version' => '2.1',
                                 'xmlns' => 'http://pear.php.net/dtd/package-2.1',
                                 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                                 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                                 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
    http://pear.php.net/dtd/tasks-1.0.xsd
    http://pear.php.net/dtd/package-2.1
    http://pear.php.net/dtd/package-2.1.xsd',
                             );
        if (!isset($this->_packageInfo['attribs'])) {
            $this->_packageInfo = array_merge(array('attribs' => $info), $this->_packageInfo);
        } else {
            $this->_packageInfo['attribs'] = $info;
        }
    }

    function setUri($uri)
    {
        unset($this->_packageInfo['channel']);
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['uri'])) {
            // ensure that the uri tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('extends', 'summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $uri, 'uri');
        }
        $this->_packageInfo['uri'] = $uri;
    }

    function setChannel($channel)
    {
        unset($this->_packageInfo['uri']);
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['channel'])) {
            // ensure that the channel tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('extends', 'summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $channel, 'channel');
        }
        $this->_packageInfo['channel'] = $channel;
    }

    function setExtends($extends)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['extends'])) {
            // ensure that the extends tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $extends, 'extends');
        }
        $this->_packageInfo['extends'] = $extends;
    }

    function setSummary($summary)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['summary'])) {
            // ensure that the summary tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $summary, 'summary');
        }
        $this->_packageInfo['summary'] = $summary;
    }

    function setDescription($desc)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['description'])) {
            // ensure that the description tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $desc, 'description');
        }
        $this->_packageInfo['description'] = $desc;
    }

    /**
     * Adds a new maintainer - no checking of duplicates is performed, use
     * updatemaintainer for that purpose.
     */
    function addMaintainer($role, $handle, $name, $email, $active = 'yes')
    {
        if (!in_array($role, array('lead', 'developer', 'contributor', 'helper'))) {
            return false;
        }
        if (isset($this->_packageInfo[$role])) {
            if (!isset($this->_packageInfo[$role][0])) {
                $this->_packageInfo[$role] = array($this->_packageInfo[$role]);
            }
            $this->_packageInfo[$role][] =
                array(
                    'name' => $name,
                    'user' => $handle,
                    'email' => $email,
                    'active' => $active,
                );
        } else {
            $testarr = array('lead',
                    'developer', 'contributor', 'helper', 'date', 'time', 'version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                    'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog');
            foreach (array('lead', 'developer', 'contributor', 'helper') as $testrole) {
                array_shift($testarr);
                if ($role == $testrole) {
                    break;
                }
            }
            if (!isset($this->_packageInfo[$role])) {
                // ensure that the extends tag is set up in the right location
                $this->_packageInfo = $this->_insertBefore($this->_packageInfo, $testarr,
                    array(), $role);
            }
            $this->_packageInfo[$role] =
                array(
                    'name' => $name,
                    'user' => $handle,
                    'email' => $email,
                    'active' => $active,
                );
        }
        $this->_isValid = 0;
    }

    function updateMaintainer($newrole, $handle, $name, $email, $active = 'yes')
    {
        $found = false;
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            if (!isset($this->_packageInfo[$role])) {
                continue;
            }
            $info = $this->_packageInfo[$role];
            if (!isset($info[0])) {
                if ($info['user'] == $handle) {
                    $found = true;
                    break;
                }
            }
            foreach ($info as $i => $maintainer) {
                if (is_array($maintainer) && $maintainer['user'] == $handle) {
                    $found = $i;
                    break 2;
                }
            }
        }
        if ($found === false) {
            return $this->addMaintainer($newrole, $handle, $name, $email, $active);
        }
        if ($found !== false) {
            if ($found === true) {
                unset($this->_packageInfo[$role]);
            } else {
                unset($this->_packageInfo[$role][$found]);
                $this->_packageInfo[$role] = array_values($this->_packageInfo[$role]);
            }
        }
        $this->addMaintainer($newrole, $handle, $name, $email, $active);
        $this->_isValid = 0;
    }

    function deleteMaintainer($handle)
    {
        $found = false;
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            if (!isset($this->_packageInfo[$role])) {
                continue;
            }
            if (!isset($this->_packageInfo[$role][0])) {
                $this->_packageInfo[$role] = array($this->_packageInfo[$role]);
            }
            foreach ($this->_packageInfo[$role] as $i => $maintainer) {
                if ($maintainer['user'] == $handle) {
                    $found = $i;
                    break;
                }
            }
            if ($found !== false) {
                unset($this->_packageInfo[$role][$found]);
                if (!count($this->_packageInfo[$role]) && $role == 'lead') {
                    $this->_isValid = 0;
                }
                if (!count($this->_packageInfo[$role])) {
                    unset($this->_packageInfo[$role]);
                    return true;
                }
                $this->_packageInfo[$role] =
                    array_values($this->_packageInfo[$role]);
                if (count($this->_packageInfo[$role]) == 1) {
                    $this->_packageInfo[$role] = $this->_packageInfo[$role][0];
                }
                return true;
            }
            if (count($this->_packageInfo[$role]) == 1) {
                $this->_packageInfo[$role] = $this->_packageInfo[$role][0];
            }
        }
        return false;
    }

    function setReleaseVersion($version)
    {
        if (isset($this->_packageInfo['version']) &&
              isset($this->_packageInfo['version']['release'])) {
            unset($this->_packageInfo['version']['release']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array(
            'version' => array('stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'release' => array('api')));
        $this->_isValid = 0;
    }

    function setAPIVersion($version)
    {
        if (isset($this->_packageInfo['version']) &&
              isset($this->_packageInfo['version']['api'])) {
            unset($this->_packageInfo['version']['api']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array(
            'version' => array('stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'api' => array()));
        $this->_isValid = 0;
    }

    /**
     * snapshot|devel|alpha|beta|stable
     */
    function setReleaseStability($state)
    {
        if (isset($this->_packageInfo['stability']) &&
              isset($this->_packageInfo['stability']['release'])) {
            unset($this->_packageInfo['stability']['release']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array(
            'stability' => array('license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'release' => array('api')));
        $this->_isValid = 0;
    }

    /**
     * @param devel|alpha|beta|stable
     */
    function setAPIStability($state)
    {
        if (isset($this->_packageInfo['stability']) &&
              isset($this->_packageInfo['stability']['api'])) {
            unset($this->_packageInfo['stability']['api']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array(
            'stability' => array('license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'api' => array()));
        $this->_isValid = 0;
    }

    function setLicense($license, $uri = false, $filesource = false)
    {
        if (!isset($this->_packageInfo['license'])) {
            // ensure that the license tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), 0, 'license');
        }
        if ($uri || $filesource) {
            $attribs = array();
            if ($uri) {
                $attribs['uri'] = $uri;
            }
            $uri = true; // for test below
            if ($filesource) {
                $attribs['filesource'] = $filesource;
            }
        }
        $license = $uri ? array('attribs' => $attribs, '_content' => $license) : $license;
        $this->_packageInfo['license'] = $license;
        $this->_isValid = 0;
    }

    function setNotes($notes)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['notes'])) {
            // ensure that the notes tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $notes, 'notes');
        }
        $this->_packageInfo['notes'] = $notes;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     * @param string file name
     * @param string installed path
     */
    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts['attribs'];
        }
    }

    /**
     * Reset the listing of package contents
     * @param string base installation dir for the whole package, if any
     */
    function clearContents($baseinstall = false)
    {
        $this->_filesValid = false;
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['contents'])) {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('compatible',
                    'dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                    'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                    'bundle', 'changelog'), array(), 'contents');
        }
        if ($this->getPackageType() != 'bundle') {
            $this->_packageInfo['contents'] =
                array('dir' => array('attribs' => array('name' => '/')));
            if ($baseinstall) {
                $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'] = $baseinstall;
            }
        } else {
            $this->_packageInfo['contents'] = array('bundledpackage' => array());
        }
    }

    /**
     * @param string relative path of the bundled package.
     */
    function addBundledPackage($path)
    {
        if ($this->getPackageType() != 'bundle') {
            return false;
        }
        $this->_filesValid = false;
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $path, array(
                'contents' => array('compatible', 'dependencies', 'providesextension',
                'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'),
                'bundledpackage' => array()));
    }

    /**
     * @param string file name
     * @param PEAR_Task_Common a read/write task
     */
    function addTaskToFile($filename, $task)
    {
        if (!method_exists($task, 'getXml')) {
            return false;
        }
        if (!method_exists($task, 'getName')) {
            return false;
        }
        if (!method_exists($task, 'validate')) {
            return false;
        }
        if (!$task->validate()) {
            return false;
        }
        if (!isset($this->_packageInfo['contents']['dir']['file'])) {
            return false;
        }
        $this->getTasksNs(); // discover the tasks namespace if not done already
        $files = $this->_packageInfo['contents']['dir']['file'];
        if (!isset($files[0])) {
            $files = array($files);
            $ind = false;
        } else {
            $ind = true;
        }
        foreach ($files as $i => $file) {
            if (isset($file['attribs'])) {
                if ($file['attribs']['name'] == $filename) {
                    if ($ind) {
                        $t = isset($this->_packageInfo['contents']['dir']['file'][$i]
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()]) ?
                              $this->_packageInfo['contents']['dir']['file'][$i]
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()] : false;
                        if ($t && !isset($t[0])) {
                            $this->_packageInfo['contents']['dir']['file'][$i]
                                [$this->_tasksNs . ':' . $task->getName()] = array($t);
                        }
                        $this->_packageInfo['contents']['dir']['file'][$i][$this->_tasksNs .
                            ':' . $task->getName()][] = $task->getXml();
                    } else {
                        $t = isset($this->_packageInfo['contents']['dir']['file']
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()]) ? $this->_packageInfo['contents']['dir']['file']
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()] : false;
                        if ($t && !isset($t[0])) {
                            $this->_packageInfo['contents']['dir']['file']
                                [$this->_tasksNs . ':' . $task->getName()] = array($t);
                        }
                        $this->_packageInfo['contents']['dir']['file'][$this->_tasksNs .
                            ':' . $task->getName()][] = $task->getXml();
                    }
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @param string path to the file
     * @param string filename
     * @param array extra attributes
     */
    function addFile($dir, $file, $attrs)
    {
        if ($this->getPackageType() == 'bundle') {
            return false;
        }
        $this->_filesValid = false;
        $this->_isValid = 0;
        $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir);
        if ($dir == '/' || $dir == '') {
            $dir = '';
        } else {
            $dir .= '/';
        }
        $attrs['name'] = $dir . $file;
        if (!isset($this->_packageInfo['contents'])) {
            // ensure that the contents tag is set up
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask',
                'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'), array(), 'contents');
        }
        if (isset($this->_packageInfo['contents']['dir']['file'])) {
            if (!isset($this->_packageInfo['contents']['dir']['file'][0])) {
                $this->_packageInfo['contents']['dir']['file'] =
                    array($this->_packageInfo['contents']['dir']['file']);
            }
            $this->_packageInfo['contents']['dir']['file'][]['attribs'] = $attrs;
        } else {
            $this->_packageInfo['contents']['dir']['file']['attribs'] = $attrs;
        }
    }

    /**
     * @param string Dependent package name
     * @param string Dependent package's channel name
     * @param string minimum version of specified package that this release is guaranteed to be
     *               compatible with
     * @param string maximum version of specified package that this release is guaranteed to be
     *               compatible with
     * @param string versions of specified package that this release is not compatible with
     */
    function addCompatiblePackage($name, $channel, $min, $max, $exclude = false)
    {
        $this->_isValid = 0;
        $set = array(
            'name' => $name,
            'channel' => $channel,
            'min' => $min,
            'max' => $max,
        );
        if ($exclude) {
            $set['exclude'] = $exclude;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'compatible' => array('dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Removes the <usesrole> tag entirely
     */
    function resetUsesrole()
    {
        if (isset($this->_packageInfo['usesrole'])) {
            unset($this->_packageInfo['usesrole']);
        }
    }

    /**
     * @param string
     * @param string package name or uri
     * @param string channel name if non-uri
     */
    function addUsesrole($role, $packageOrUri, $channel = false) {
        $set = array('role' => $role);
        if ($channel) {
            $set['package'] = $packageOrUri;
            $set['channel'] = $channel;
        } else {
            $set['uri'] = $packageOrUri;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'usesrole' => array('usestask', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Removes the <usestask> tag entirely
     */
    function resetUsestask()
    {
        if (isset($this->_packageInfo['usestask'])) {
            unset($this->_packageInfo['usestask']);
        }
    }


    /**
     * @param string
     * @param string package name or uri
     * @param string channel name if non-uri
     */
    function addUsestask($task, $packageOrUri, $channel = false) {
        $set = array('task' => $task);
        if ($channel) {
            $set['package'] = $packageOrUri;
            $set['channel'] = $channel;
        } else {
            $set['uri'] = $packageOrUri;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'usestask' => array('srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Remove all compatible tags
     */
    function clearCompatible()
    {
        unset($this->_packageInfo['compatible']);
    }

    /**
     * Reset dependencies prior to adding new ones
     */
    function clearDeps()
    {
        if (!isset($this->_packageInfo['dependencies'])) {
            $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(),
                array(
                    'dependencies' => array('providesextension', 'usesrole', 'usestask',
                        'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                        'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')));
        }
        $this->_packageInfo['dependencies'] = array();
    }

    /**
     * @param string minimum PHP version allowed
     * @param string maximum PHP version allowed
     * @param array $exclude incompatible PHP versions
     */
    function setPhpDep($min, $max = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'min' => $min,
            );
        if ($max) {
            $dep['max'] = $max;
        }
        if ($exclude) {
            if (count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if (isset($this->_packageInfo['dependencies']['required']['php'])) {
            $this->_stack->push(__FUNCTION__, 'warning', array('dep' =>
            $this->_packageInfo['dependencies']['required']['php']),
                'warning: PHP dependency already exists, overwriting');
            unset($this->_packageInfo['dependencies']['required']['php']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'php' => array('pearinstaller', 'package', 'subpackage', 'extension', 'os', 'arch')
            ));
        return true;
    }

    /**
     * @param string minimum allowed PEAR installer version
     * @param string maximum allowed PEAR installer version
     * @param string recommended PEAR installer version
     * @param array incompatible version of the PEAR installer
     */
    function setPearinstallerDep($min, $max = false, $recommended = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'min' => $min,
            );
        if ($max) {
            $dep['max'] = $max;
        }
        if ($recommended) {
            $dep['recommended'] = $recommended;
        }
        if ($exclude) {
            if (count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if (isset($this->_packageInfo['dependencies']['required']['pearinstaller'])) {
            $this->_stack->push(__FUNCTION__, 'warning', array('dep' =>
            $this->_packageInfo['dependencies']['required']['pearinstaller']),
                'warning: PEAR Installer dependency already exists, overwriting');
            unset($this->_packageInfo['dependencies']['required']['pearinstaller']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'pearinstaller' => array('package', 'subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * Mark a package as conflicting with this package
     * @param string package name
     * @param string package channel
     * @param string extension this package provides, if any
     * @param string|false minimum version required
     * @param string|false maximum version allowed
     * @param array|false versions to exclude from installation
     */
    function addConflictingPackageDepWithChannel($name, $channel,
                $providesextension = false, $min = false, $max = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, $channel, false, $min, $max, false,
            $exclude, $providesextension, false, true);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * Mark a package as conflicting with this package
     * @param string package name
     * @param string package channel
     * @param string extension this package provides, if any
     */
    function addConflictingPackageDepWithUri($name, $uri, $providesextension = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'name' => $name,
                'uri' => $uri,
                'conflicts' => '',
            );
        if ($providesextension) {
            $dep['providesextension'] = $providesextension;
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    function addDependencyGroup($name, $hint)
    {
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo,
            array('attribs' => array('name' => $name, 'hint' => $hint)),
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'group' => array(),
            ));
    }

    /**
     * @param string package name
     * @param string|false channel name, false if this is a uri
     * @param string|false uri name, false if this is a channel
     * @param string|false minimum version required
     * @param string|false maximum version allowed
     * @param string|false recommended installation version
     * @param array|false versions to exclude from installation
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @param bool if true, tells the installer to negate this dependency (conflicts)
     * @return array
     * @access private
     */
    function _constructDep($name, $channel, $uri, $min, $max, $recommended, $exclude,
                           $providesextension = false, $nodefault = false,
                           $conflicts = false)
    {
        $dep =
            array(
                'name' => $name,
            );
        if ($channel) {
            $dep['channel'] = $channel;
        } elseif ($uri) {
            $dep['uri'] = $uri;
        }
        if ($min) {
            $dep['min'] = $min;
        }
        if ($max) {
            $dep['max'] = $max;
        }
        if ($recommended) {
            $dep['recommended'] = $recommended;
        }
        if ($exclude) {
            if (is_array($exclude) && count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($nodefault) {
            $dep['nodefault'] = '';
        }
        if ($providesextension) {
            $dep['providesextension'] = $providesextension;
        }
        return $dep;
    }

    /**
     * @param package|subpackage
     * @param string group name
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array|false optional excluded versions
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @return bool false if the dependency group has not been initialized with
     *              {@link addDependencyGroup()}, or a subpackage is added with
     *              a providesextension
     */
    function addGroupPackageDepWithChannel($type, $groupname, $name, $channel, $min = false,
                                      $max = false, $recommended = false, $exclude = false,
                                      $providesextension = false, $nodefault = false)
    {
        if ($type == 'subpackage' && $providesextension) {
            return false; // subpackages must be php packages
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $providesextension, $nodefault);
        return $this->_addGroupDependency($type, $dep, $groupname);
    }

    /**
     * @param package|subpackage
     * @param string group name
     * @param string package name
     * @param string package uri
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @return bool false if the dependency group has not been initialized with
     *              {@link addDependencyGroup()}
     */
    function addGroupPackageDepWithURI($type, $groupname, $name, $uri, $providesextension = false,
                                       $nodefault = false)
    {
        if ($type == 'subpackage' && $providesextension) {
            return false; // subpackages must be php packages
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false,
            $providesextension, $nodefault);
        return $this->_addGroupDependency($type, $dep, $groupname);
    }

    /**
     * @param string group name (must be pre-existing)
     * @param string extension name
     * @param string minimum version allowed
     * @param string maximum version allowed
     * @param string recommended version
     * @param array incompatible versions
     */
    function addGroupExtensionDep($groupname, $name, $min = false, $max = false,
                                         $recommended = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        return $this->_addGroupDependency('extension', $dep, $groupname);
    }

    /**
     * @param package|subpackage|extension
     * @param array dependency contents
     * @param string name of the dependency group to add this to
     * @return boolean
     * @access private
     */
    function _addGroupDependency($type, $dep, $groupname)
    {
        $arr = array('subpackage', 'extension');
        if ($type != 'package') {
            array_shift($arr);
        }
        if ($type == 'extension') {
            array_shift($arr);
        }
        if (!isset($this->_packageInfo['dependencies']['group'])) {
            return false;
        } else {
            if (!isset($this->_packageInfo['dependencies']['group'][0])) {
                if ($this->_packageInfo['dependencies']['group']['attribs']['name'] == $groupname) {
                    $this->_packageInfo['dependencies']['group'] = $this->_mergeTag(
                        $this->_packageInfo['dependencies']['group'], $dep,
                        array(
                            $type => $arr
                        ));
                    $this->_isValid = 0;
                    return true;
                } else {
                    return false;
                }
            } else {
                foreach ($this->_packageInfo['dependencies']['group'] as $i => $group) {
                    if ($group['attribs']['name'] == $groupname) {
                    $this->_packageInfo['dependencies']['group'][$i] = $this->_mergeTag(
                        $this->_packageInfo['dependencies']['group'][$i], $dep,
                        array(
                            $type => $arr
                        ));
                        $this->_isValid = 0;
                        return true;
                    }
                }
                return false;
            }
        }
    }

    /**
     * @param optional|required
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @param array|false optional excluded versions
     */
    function addPackageDepWithChannel($type, $name, $channel, $min = false, $max = false,
                                      $recommended = false, $exclude = false,
                                      $providesextension = false, $nodefault = false)
    {
        if (!in_array($type, array('optional', 'required'), true)) {
            $type = 'required';
        }
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $providesextension, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required
     * @param string name of the package
     * @param string uri of the package
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addPackageDepWithUri($type, $name, $uri, $providesextension = false,
                                  $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false,
            $providesextension, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addSubpackageDepWithChannel($type, $name, $channel, $min = false, $max = false,
                                         $recommended = false, $exclude = false,
                                         $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'subpackage' => array('extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string package name
     * @param string package uri for download
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addSubpackageDepWithUri($type, $name, $uri, $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'subpackage' => array('extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string extension name
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     */
    function addExtensionDep($type, $name, $min = false, $max = false, $recommended = false,
                             $exclude = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'extension' => array('os', 'arch')
            ));
    }

    /**
     * @param string Operating system name
     * @param boolean true if this package cannot be installed on this OS
     */
    function addOsDep($name, $conflicts = false)
    {
        $this->_isValid = 0;
        $dep = array('name' => $name);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'os' => array('arch')
            ));
    }

    /**
     * @param string Architecture matching pattern
     * @param boolean true if this package cannot be installed on this architecture
     */
    function addArchDep($pattern, $conflicts = false)
    {
        $this->_isValid = 0;
        $dep = array('pattern' => $pattern);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'arch' => array()
            ));
    }

    /**
     * Set the kind of package, and erase all release tags
     *
     * - a php package is a PEAR-style package
     * - an extbin package is a PECL-style extension binary
     * - an extsrc package is a PECL-style source for a binary
     * - an zendextbin package is a PECL-style zend extension binary
     * - an zendextsrc package is a PECL-style source for a zend extension binary
     * - a bundle package is a collection of other pre-packaged packages
     * @param php|extbin|extsrc|zendextsrc|zendextbin|bundle
     * @return bool success
     */
    function setPackageType($type)
    {
        $this->_isValid = 0;
        if (!in_array($type, array('php', 'extbin', 'extsrc', 'zendextsrc',
                                   'zendextbin', 'bundle'))) {
            return false;
        }

        if (in_array($type, array('zendextsrc', 'zendextbin'))) {
            $this->_setPackageVersion2_1();
        }

        if ($type != 'bundle') {
            $type .= 'release';
        }

        foreach (array('phprelease', 'extbinrelease', 'extsrcrelease',
                       'zendextsrcrelease', 'zendextbinrelease', 'bundle') as $test) {
            unset($this->_packageInfo[$test]);
        }

        if (!isset($this->_packageInfo[$type])) {
            // ensure that the release tag is set up
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('changelog'),
                array(), $type);
        }

        $this->_packageInfo[$type] = array();
        return true;
    }

    /**
     * @return bool true if package type is set up
     */
    function addRelease()
    {
        if ($type = $this->getPackageType()) {
            if ($type != 'bundle') {
                $type .= 'release';
            }
            $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(),
                array($type => array('changelog')));
            return true;
        }
        return false;
    }

    /**
     * Get the current release tag in order to add to it
     * @param bool returns only releases that have installcondition if true
     * @return array|null
     */
    function &_getCurrentRelease($strict = true)
    {
        if ($p = $this->getPackageType()) {
            if ($strict) {
                if ($p == 'extsrc' || $p == 'zendextsrc') {
                    $a = null;
                    return $a;
                }
            }
            if ($p != 'bundle') {
                $p .= 'release';
            }
            if (isset($this->_packageInfo[$p][0])) {
                return $this->_packageInfo[$p][count($this->_packageInfo[$p]) - 1];
            } else {
                return $this->_packageInfo[$p];
            }
        } else {
            $a = null;
            return $a;
        }
    }

    /**
     * Add a file to the current release that should be installed under a different name
     * @param string <contents> path to file
     * @param string name the file should be installed as
     */
    function addInstallAs($path, $as)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, array('attribs' => array('name' => $path, 'as' => $as)),
            array(
                'filelist' => array(),
                'install' => array('ignore')
            ));
    }

    /**
     * Add a file to the current release that should be ignored
     * @param string <contents> path to file
     * @return bool success of operation
     */
    function addIgnore($path)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, array('attribs' => array('name' => $path)),
            array(
                'filelist' => array(),
                'ignore' => array()
            ));
    }

    /**
     * Add an extension binary package for this extension source code release
     *
     * Note that the package must be from the same channel as the extension source package
     * @param string
     */
    function addBinarypackage($package)
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }
        $r = &$this->_getCurrentRelease(false);
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, $package,
            array(
                'binarypackage' => array('filelist'),
            ));
    }

    /**
     * Add a configureoption to an extension source package
     * @param string
     * @param string
     * @param string
     */
    function addConfigureOption($name, $prompt, $default = null)
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }

        $r = &$this->_getCurrentRelease(false);
        if ($r === null) {
            return false;
        }

        $opt = array('attribs' => array('name' => $name, 'prompt' => $prompt));
        if ($default !== null) {
            $opt['attribs']['default'] = $default;
        }

        $this->_isValid = 0;
        $r = $this->_mergeTag($r, $opt,
            array(
                'configureoption' => array('binarypackage', 'filelist'),
            ));
    }

    /**
     * Set an installation condition based on php version for the current release set
     * @param string minimum version
     * @param string maximum version
     * @param false|array incompatible versions of PHP
     */
    function setPhpInstallCondition($min, $max, $exclude = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['php'])) {
            unset($r['installconditions']['php']);
        }
        $dep = array('min' => $min, 'max' => $max);
        if ($exclude) {
            if (is_array($exclude) && count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'php' => array('extension', 'os', 'arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'php' => array('extension', 'os', 'arch')
                ));
        }
    }

    /**
     * @param optional|required optional, required
     * @param string extension name
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     */
    function addExtensionInstallCondition($name, $min = false, $max = false, $recommended = false,
                                          $exclude = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'extension' => array('os', 'arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'extension' => array('os', 'arch')
                ));
        }
    }

    /**
     * Set an installation condition based on operating system for the current release set
     * @param string OS name
     * @param bool whether this OS is incompatible with the current release
     */
    function setOsInstallCondition($name, $conflicts = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['os'])) {
            unset($r['installconditions']['os']);
        }
        $dep = array('name' => $name);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'os' => array('arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'os' => array('arch')
                ));
        }
    }

    /**
     * Set an installation condition based on architecture for the current release set
     * @param string architecture pattern
     * @param bool whether this arch is incompatible with the current release
     */
    function setArchInstallCondition($pattern, $conflicts = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['arch'])) {
            unset($r['installconditions']['arch']);
        }
        $dep = array('pattern' => $pattern);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'arch' => array()
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'arch' => array()
                ));
        }
    }

    /**
     * For extension binary releases, this is used to specify either the
     * static URI to a source package, or the package name and channel of the extsrc/zendextsrc
     * package it is based on.
     * @param string Package name, or full URI to source package (extsrc/zendextsrc type)
     */
    function setSourcePackage($packageOrUri)
    {
        $this->_isValid = 0;
        if (isset($this->_packageInfo['channel'])) {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'),
                $packageOrUri, 'srcpackage');
        } else {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'), $packageOrUri, 'srcuri');
        }
    }

    /**
     * Generate a valid change log entry from the current package.xml
     * @param string|false
     */
    function generateChangeLogEntry($notes = false)
    {
        return array(
            'version' =>
                array(
                    'release' => $this->getVersion('release'),
                    'api' => $this->getVersion('api'),
                    ),
            'stability' =>
                $this->getStability(),
            'date' => $this->getDate(),
            'license' => $this->getLicense(true),
            'notes' => $notes ? $notes : $this->getNotes()
            );
    }

    /**
     * @param string release version to set change log notes for
     * @param array output of {@link generateChangeLogEntry()}
     */
    function setChangelogEntry($releaseversion, $contents)
    {
        if (!isset($this->_packageInfo['changelog'])) {
            $this->_packageInfo['changelog']['release'] = $contents;
            return;
        }
        if (!isset($this->_packageInfo['changelog']['release'][0])) {
            if ($this->_packageInfo['changelog']['release']['version']['release'] == $releaseversion) {
                $this->_packageInfo['changelog']['release'] = array(
                    $this->_packageInfo['changelog']['release']);
            } else {
                $this->_packageInfo['changelog']['release'] = array(
                    $this->_packageInfo['changelog']['release']);
                return $this->_packageInfo['changelog']['release'][] = $contents;
            }
        }
        foreach($this->_packageInfo['changelog']['release'] as $index => $changelog) {
            if (isset($changelog['version']) &&
                  strnatcasecmp($changelog['version']['release'], $releaseversion) == 0) {
                $curlog = $index;
            }
        }
        if (isset($curlog)) {
            $this->_packageInfo['changelog']['release'][$curlog] = $contents;
        } else {
            $this->_packageInfo['changelog']['release'][] = $contents;
        }
    }

    /**
     * Remove the changelog entirely
     */
    function clearChangeLog()
    {
        unset($this->_packageInfo['changelog']);
    }
}pear/PEAR/PackageFile/v2/Validator.php000064400000246200151732710130013346 0ustar00<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0, read/write version
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a8
 */
/**
 * Private validation class used by PEAR_PackageFile_v2 - do not use directly, its
 * sole purpose is to split up the PEAR/PackageFile/v2.php file to make it smaller
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a8
 * @access private
 */
class PEAR_PackageFile_v2_Validator
{
    /**
     * @var array
     */
    var $_packageInfo;
    /**
     * @var PEAR_PackageFile_v2
     */
    var $_pf;
    /**
     * @var PEAR_ErrorStack
     */
    var $_stack;
    /**
     * @var int
     */
    var $_isValid = 0;
    /**
     * @var int
     */
    var $_filesValid = 0;
    /**
     * @var int
     */
    var $_curState = 0;
    /**
     * @param PEAR_PackageFile_v2
     * @param int
     */
    function validate(&$pf, $state = PEAR_VALIDATE_NORMAL)
    {
        $this->_pf = &$pf;
        $this->_curState = $state;
        $this->_packageInfo = $this->_pf->getArray();
        $this->_isValid = $this->_pf->_isValid;
        $this->_filesValid = $this->_pf->_filesValid;
        $this->_stack = &$pf->_stack;
        $this->_stack->getErrors(true);
        if (($this->_isValid & $state) == $state) {
            return true;
        }
        if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) {
            return false;
        }
        if (!isset($this->_packageInfo['attribs']['version']) ||
              ($this->_packageInfo['attribs']['version'] != '2.0' &&
               $this->_packageInfo['attribs']['version'] != '2.1')
        ) {
            $this->_noPackageVersion();
        }
        $structure =
        array(
            'name',
            'channel|uri',
            '*extends', // can't be multiple, but this works fine
            'summary',
            'description',
            '+lead', // these all need content checks
            '*developer',
            '*contributor',
            '*helper',
            'date',
            '*time',
            'version',
            'stability',
            'license->?uri->?filesource',
            'notes',
            'contents', //special validation needed
            '*compatible',
            'dependencies', //special validation needed
            '*usesrole',
            '*usestask', // reserve these for 1.4.0a1 to implement
                         // this will allow a package.xml to gracefully say it
                         // needs a certain package installed in order to implement a role or task
            '*providesextension',
            '*srcpackage|*srcuri',
            '+phprelease|+extsrcrelease|+extbinrelease|' .
                '+zendextsrcrelease|+zendextbinrelease|bundle', //special validation needed
            '*changelog',
        );
        $test = $this->_packageInfo;
        if (isset($test['dependencies']) &&
              isset($test['dependencies']['required']) &&
              isset($test['dependencies']['required']['pearinstaller']) &&
              isset($test['dependencies']['required']['pearinstaller']['min']) &&
              '1.10.16' != '@package' . '_version@' &&
              version_compare('1.10.16',
                $test['dependencies']['required']['pearinstaller']['min'], '<')
        ) {
            $this->_pearVersionTooLow($test['dependencies']['required']['pearinstaller']['min']);
            return false;
        }
        // ignore post-installation array fields
        if (array_key_exists('filelist', $test)) {
            unset($test['filelist']);
        }
        if (array_key_exists('_lastmodified', $test)) {
            unset($test['_lastmodified']);
        }
        if (array_key_exists('#binarypackage', $test)) {
            unset($test['#binarypackage']);
        }
        if (array_key_exists('old', $test)) {
            unset($test['old']);
        }
        if (array_key_exists('_lastversion', $test)) {
            unset($test['_lastversion']);
        }
        if (!$this->_stupidSchemaValidate($structure, $test, '<package>')) {
            return false;
        }
        if (empty($this->_packageInfo['name'])) {
            $this->_tagCannotBeEmpty('name');
        }
        $test = isset($this->_packageInfo['uri']) ? 'uri' :'channel';
        if (empty($this->_packageInfo[$test])) {
            $this->_tagCannotBeEmpty($test);
        }
        if (is_array($this->_packageInfo['license']) &&
              (!isset($this->_packageInfo['license']['_content']) ||
              empty($this->_packageInfo['license']['_content']))) {
            $this->_tagCannotBeEmpty('license');
        } elseif (empty($this->_packageInfo['license'])) {
            $this->_tagCannotBeEmpty('license');
        }
        if (empty($this->_packageInfo['summary'])) {
            $this->_tagCannotBeEmpty('summary');
        }
        if (empty($this->_packageInfo['description'])) {
            $this->_tagCannotBeEmpty('description');
        }
        if (empty($this->_packageInfo['date'])) {
            $this->_tagCannotBeEmpty('date');
        }
        if (empty($this->_packageInfo['notes'])) {
            $this->_tagCannotBeEmpty('notes');
        }
        if (isset($this->_packageInfo['time']) && empty($this->_packageInfo['time'])) {
            $this->_tagCannotBeEmpty('time');
        }
        if (isset($this->_packageInfo['dependencies'])) {
            $this->_validateDependencies();
        }
        if (isset($this->_packageInfo['compatible'])) {
            $this->_validateCompatible();
        }
        if (!isset($this->_packageInfo['bundle'])) {
            if (empty($this->_packageInfo['contents'])) {
                $this->_tagCannotBeEmpty('contents');
            }
            if (!isset($this->_packageInfo['contents']['dir'])) {
                $this->_filelistMustContainDir('contents');
                return false;
            }
            if (isset($this->_packageInfo['contents']['file'])) {
                $this->_filelistCannotContainFile('contents');
                return false;
            }
        }
        $this->_validateMaintainers();
        $this->_validateStabilityVersion();
        $fail = false;
        if (array_key_exists('usesrole', $this->_packageInfo)) {
            $roles = $this->_packageInfo['usesrole'];
            if (!is_array($roles) || !isset($roles[0])) {
                $roles = array($roles);
            }
            foreach ($roles as $role) {
                if (!isset($role['role'])) {
                    $this->_usesroletaskMustHaveRoleTask('usesrole', 'role');
                    $fail = true;
                } else {
                    if (!isset($role['channel'])) {
                        if (!isset($role['uri'])) {
                            $this->_usesroletaskMustHaveChannelOrUri($role['role'], 'usesrole');
                            $fail = true;
                        }
                    } elseif (!isset($role['package'])) {
                        $this->_usesroletaskMustHavePackage($role['role'], 'usesrole');
                        $fail = true;
                    }
                }
            }
        }
        if (array_key_exists('usestask', $this->_packageInfo)) {
            $roles = $this->_packageInfo['usestask'];
            if (!is_array($roles) || !isset($roles[0])) {
                $roles = array($roles);
            }
            foreach ($roles as $role) {
                if (!isset($role['task'])) {
                    $this->_usesroletaskMustHaveRoleTask('usestask', 'task');
                    $fail = true;
                } else {
                    if (!isset($role['channel'])) {
                        if (!isset($role['uri'])) {
                            $this->_usesroletaskMustHaveChannelOrUri($role['task'], 'usestask');
                            $fail = true;
                        }
                    } elseif (!isset($role['package'])) {
                        $this->_usesroletaskMustHavePackage($role['task'], 'usestask');
                        $fail = true;
                    }
                }
            }
        }

        if ($fail) {
            return false;
        }

        $list = $this->_packageInfo['contents'];
        if (isset($list['dir']) && is_array($list['dir']) && isset($list['dir'][0])) {
            $this->_multipleToplevelDirNotAllowed();
            return $this->_isValid = 0;
        }

        $this->_validateFilelist();
        $this->_validateRelease();
        if (!$this->_stack->hasErrors()) {
            $chan = $this->_pf->_registry->getChannel($this->_pf->getChannel(), true);
            if (PEAR::isError($chan)) {
                $this->_unknownChannel($this->_pf->getChannel());
            } else {
                $valpack = $chan->getValidationPackage();
                // for channel validator packages, always use the default PEAR validator.
                // otherwise, they can't be installed or packaged
                $validator = $chan->getValidationObject($this->_pf->getPackage());
                if (!$validator) {
                    $this->_stack->push(__FUNCTION__, 'error',
                        array('channel' => $chan->getName(),
                              'package' => $this->_pf->getPackage(),
                              'name'    => $valpack['_content'],
                              'version' => $valpack['attribs']['version']),
                        'package "%channel%/%package%" cannot be properly validated without ' .
                        'validation package "%channel%/%name%-%version%"');
                    return $this->_isValid = 0;
                }
                $validator->setPackageFile($this->_pf);
                $validator->validate($state);
                $failures = $validator->getFailures();
                foreach ($failures['errors'] as $error) {
                    $this->_stack->push(__FUNCTION__, 'error', $error,
                        'Channel validator error: field "%field%" - %reason%');
                }
                foreach ($failures['warnings'] as $warning) {
                    $this->_stack->push(__FUNCTION__, 'warning', $warning,
                        'Channel validator warning: field "%field%" - %reason%');
                }
            }
        }

        $this->_pf->_isValid = $this->_isValid = !$this->_stack->hasErrors('error');
        if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$this->_filesValid) {
            if ($this->_pf->getPackageType() == 'bundle') {
                if ($this->_analyzeBundledPackages()) {
                    $this->_filesValid = $this->_pf->_filesValid = true;
                } else {
                    $this->_pf->_isValid = $this->_isValid = 0;
                }
            } else {
                if (!$this->_analyzePhpFiles()) {
                    $this->_pf->_isValid = $this->_isValid = 0;
                } else {
                    $this->_filesValid = $this->_pf->_filesValid = true;
                }
            }
        }

        if ($this->_isValid) {
            return $this->_pf->_isValid = $this->_isValid = $state;
        }

        return $this->_pf->_isValid = $this->_isValid = 0;
    }

    function _stupidSchemaValidate($structure, $xml, $root)
    {
        if (!is_array($xml)) {
            $xml = array();
        }
        $keys = array_keys($xml);
        reset($keys);
        $key = current($keys);
        while ($key == 'attribs' || $key == '_contents') {
            $key = next($keys);
        }
        $unfoundtags = $optionaltags = array();
        $ret = true;
        $mismatch = false;
        foreach ($structure as $struc) {
            if ($key) {
                $tag = $xml[$key];
            }
            $test = $this->_processStructure($struc);
            if (isset($test['choices'])) {
                $loose = true;
                foreach ($test['choices'] as $choice) {
                    if ($key == $choice['tag']) {
                        $key = next($keys);
                        while ($key == 'attribs' || $key == '_contents') {
                            $key = next($keys);
                        }
                        $unfoundtags = $optionaltags = array();
                        $mismatch = false;
                        if ($key && $key != $choice['tag'] && isset($choice['multiple'])) {
                            $unfoundtags[] = $choice['tag'];
                            $optionaltags[] = $choice['tag'];
                            if ($key) {
                                $mismatch = true;
                            }
                        }
                        $ret &= $this->_processAttribs($choice, $tag, $root);
                        continue 2;
                    } else {
                        $unfoundtags[] = $choice['tag'];
                        $mismatch = true;
                    }
                    if (!isset($choice['multiple']) || $choice['multiple'] != '*') {
                        $loose = false;
                    } else {
                        $optionaltags[] = $choice['tag'];
                    }
                }
                if (!$loose) {
                    $this->_invalidTagOrder($unfoundtags, $key, $root);
                    return false;
                }
            } else {
                if ($key != $test['tag']) {
                    if (isset($test['multiple']) && $test['multiple'] != '*') {
                        $unfoundtags[] = $test['tag'];
                        $this->_invalidTagOrder($unfoundtags, $key, $root);
                        return false;
                    } else {
                        if ($key) {
                            $mismatch = true;
                        }
                        $unfoundtags[] = $test['tag'];
                        $optionaltags[] = $test['tag'];
                    }
                    if (!isset($test['multiple'])) {
                        $this->_invalidTagOrder($unfoundtags, $key, $root);
                        return false;
                    }
                    continue;
                } else {
                    $unfoundtags = $optionaltags = array();
                    $mismatch = false;
                }
                $key = next($keys);
                while ($key == 'attribs' || $key == '_contents') {
                    $key = next($keys);
                }
                if ($key && $key != $test['tag'] && isset($test['multiple'])) {
                    $unfoundtags[] = $test['tag'];
                    $optionaltags[] = $test['tag'];
                    $mismatch = true;
                }
                $ret &= $this->_processAttribs($test, $tag, $root);
                continue;
            }
        }
        if (!$mismatch && count($optionaltags)) {
            // don't error out on any optional tags
            $unfoundtags = array_diff($unfoundtags, $optionaltags);
        }
        if (count($unfoundtags)) {
            $this->_invalidTagOrder($unfoundtags, $key, $root);
        } elseif ($key) {
            // unknown tags
            $this->_invalidTagOrder('*no tags allowed here*', $key, $root);
            while ($key = next($keys)) {
                $this->_invalidTagOrder('*no tags allowed here*', $key, $root);
            }
        }
        return $ret;
    }

    function _processAttribs($choice, $tag, $context)
    {
        if (isset($choice['attribs'])) {
            if (!is_array($tag)) {
                $tag = array($tag);
            }
            $tags = $tag;
            if (!isset($tags[0])) {
                $tags = array($tags);
            }
            $ret = true;
            foreach ($tags as $i => $tag) {
                if (!is_array($tag) || !isset($tag['attribs'])) {
                    foreach ($choice['attribs'] as $attrib) {
                        if ($attrib[0] != '?') {
                            $ret &= $this->_tagHasNoAttribs($choice['tag'],
                                $context);
                            continue 2;
                        }
                    }
                }
                foreach ($choice['attribs'] as $attrib) {
                    if ($attrib[0] != '?') {
                        if (!isset($tag['attribs'][$attrib])) {
                            $ret &= $this->_tagMissingAttribute($choice['tag'],
                                $attrib, $context);
                        }
                    }
                }
            }
            return $ret;
        }
        return true;
    }

    function _processStructure($key)
    {
        $ret = array();
        if (count($pieces = explode('|', $key)) > 1) {
            $ret['choices'] = array();
            foreach ($pieces as $piece) {
                $ret['choices'][] = $this->_processStructure($piece);
            }
            return $ret;
        }
        $multi = $key[0];
        if ($multi == '+' || $multi == '*') {
            $ret['multiple'] = $key[0];
            $key = substr($key, 1);
        }
        if (count($attrs = explode('->', $key)) > 1) {
            $ret['tag'] = array_shift($attrs);
            $ret['attribs'] = $attrs;
        } else {
            $ret['tag'] = $key;
        }
        return $ret;
    }

    function _validateStabilityVersion()
    {
        $structure = array('release', 'api');
        $a = $this->_stupidSchemaValidate($structure, $this->_packageInfo['version'], '<version>');
        $a &= $this->_stupidSchemaValidate($structure, $this->_packageInfo['stability'], '<stability>');
        if ($a) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $this->_packageInfo['version']['release'])) {
                $this->_invalidVersion('release', $this->_packageInfo['version']['release']);
            }
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $this->_packageInfo['version']['api'])) {
                $this->_invalidVersion('api', $this->_packageInfo['version']['api']);
            }
            if (!in_array($this->_packageInfo['stability']['release'],
                  array('snapshot', 'devel', 'alpha', 'beta', 'stable'))) {
                $this->_invalidState('release', $this->_packageInfo['stability']['release']);
            }
            if (!in_array($this->_packageInfo['stability']['api'],
                  array('devel', 'alpha', 'beta', 'stable'))) {
                $this->_invalidState('api', $this->_packageInfo['stability']['api']);
            }
        }
    }

    function _validateMaintainers()
    {
        $structure =
            array(
                'name',
                'user',
                'email',
                'active',
            );
        foreach (array('lead', 'developer', 'contributor', 'helper') as $type) {
            if (!isset($this->_packageInfo[$type])) {
                continue;
            }
            if (isset($this->_packageInfo[$type][0])) {
                foreach ($this->_packageInfo[$type] as $lead) {
                    $this->_stupidSchemaValidate($structure, $lead, '<' . $type . '>');
                }
            } else {
                $this->_stupidSchemaValidate($structure, $this->_packageInfo[$type],
                    '<' . $type . '>');
            }
        }
    }

    function _validatePhpDep($dep, $installcondition = false)
    {
        $structure = array(
            'min',
            '*max',
            '*exclude',
        );
        $type = $installcondition ? '<installcondition><php>' : '<dependencies><required><php>';
        $this->_stupidSchemaValidate($structure, $dep, $type);
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion($type . '<min>', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion($type . '<max>', $dep['max']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match(
                     '/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                     $exclude)) {
                    $this->_invalidVersion($type . '<exclude>', $exclude);
                }
            }
        }
    }

    function _validatePearinstallerDep($dep)
    {
        $structure = array(
            'min',
            '*max',
            '*recommended',
            '*exclude',
        );
        $this->_stupidSchemaValidate($structure, $dep, '<dependencies><required><pearinstaller>');
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><min>',
                    $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><max>',
                    $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><recommended>',
                    $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion('<dependencies><required><pearinstaller><exclude>',
                        $exclude);
                }
            }
        }
    }

    function _validatePackageDep($dep, $group, $type = '<package>')
    {
        if (isset($dep['uri'])) {
            if (isset($dep['conflicts'])) {
                $structure = array(
                    'name',
                    'uri',
                    'conflicts',
                    '*providesextension',
                );
            } else {
                $structure = array(
                    'name',
                    'uri',
                    '*providesextension',
                );
            }
        } else {
            if (isset($dep['conflicts'])) {
                $structure = array(
                    'name',
                    'channel',
                    '*min',
                    '*max',
                    '*exclude',
                    'conflicts',
                    '*providesextension',
                );
            } else {
                $structure = array(
                    'name',
                    'channel',
                    '*min',
                    '*max',
                    '*recommended',
                    '*exclude',
                    '*nodefault',
                    '*providesextension',
                );
            }
        }
        if (isset($dep['name'])) {
            $type .= '<name>' . $dep['name'] . '</name>';
        }
        $this->_stupidSchemaValidate($structure, $dep, '<dependencies>' . $group . $type);
        if (isset($dep['uri']) && (isset($dep['min']) || isset($dep['max']) ||
              isset($dep['recommended']) || isset($dep['exclude']))) {
            $this->_uriDepsCannotHaveVersioning('<dependencies>' . $group . $type);
        }
        if (isset($dep['channel']) && strtolower($dep['channel']) == '__uri') {
            $this->_DepchannelCannotBeUri('<dependencies>' . $group . $type);
        }
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<min>', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<max>', $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<recommended>',
                    $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion('<dependencies>' . $group . $type . '<exclude>',
                        $exclude);
                }
            }
        }
    }

    function _validateSubpackageDep($dep, $group)
    {
        $this->_validatePackageDep($dep, $group, '<subpackage>');
        if (isset($dep['providesextension'])) {
            $this->_subpackageCannotProvideExtension(isset($dep['name']) ? $dep['name'] : '');
        }
        if (isset($dep['conflicts'])) {
            $this->_subpackagesCannotConflict(isset($dep['name']) ? $dep['name'] : '');
        }
    }

    function _validateExtensionDep($dep, $group = false, $installcondition = false)
    {
        if (isset($dep['conflicts'])) {
            $structure = array(
                'name',
                '*min',
                '*max',
                '*exclude',
                'conflicts',
            );
        } else {
            $structure = array(
                'name',
                '*min',
                '*max',
                '*recommended',
                '*exclude',
            );
        }
        if ($installcondition) {
            $type = '<installcondition><extension>';
        } else {
            $type = '<dependencies>' . $group . '<extension>';
        }
        if (isset($dep['name'])) {
            $type .= '<name>' . $dep['name'] . '</name>';
        }
        $this->_stupidSchemaValidate($structure, $dep, $type);
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion(substr($type, 1) . '<min', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion(substr($type, 1) . '<max', $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion(substr($type, 1) . '<recommended', $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion(substr($type, 1) . '<exclude', $exclude);
                }
            }
        }
    }

    function _validateOsDep($dep, $installcondition = false)
    {
        $structure = array(
            'name',
            '*conflicts',
        );
        $type = $installcondition ? '<installcondition><os>' : '<dependencies><required><os>';
        if ($this->_stupidSchemaValidate($structure, $dep, $type)) {
            if ($dep['name'] == '*') {
                if (array_key_exists('conflicts', $dep)) {
                    $this->_cannotConflictWithAllOs($type);
                }
            }
        }
    }

    function _validateArchDep($dep, $installcondition = false)
    {
        $structure = array(
            'pattern',
            '*conflicts',
        );
        $type = $installcondition ? '<installcondition><arch>' : '<dependencies><required><arch>';
        $this->_stupidSchemaValidate($structure, $dep, $type);
    }

    function _validateInstallConditions($cond, $release)
    {
        $structure = array(
            '*php',
            '*extension',
            '*os',
            '*arch',
        );
        if (!$this->_stupidSchemaValidate($structure,
              $cond, $release)) {
            return false;
        }
        foreach (array('php', 'extension', 'os', 'arch') as $type) {
            if (isset($cond[$type])) {
                $iter = $cond[$type];
                if (!is_array($iter) || !isset($iter[0])) {
                    $iter = array($iter);
                }
                foreach ($iter as $package) {
                    if ($type == 'extension') {
                        $this->{"_validate{$type}Dep"}($package, false, true);
                    } else {
                        $this->{"_validate{$type}Dep"}($package, true);
                    }
                }
            }
        }
    }

    function _validateDependencies()
    {
        $structure = array(
            'required',
            '*optional',
            '*group->name->hint'
        );
        if (!$this->_stupidSchemaValidate($structure,
              $this->_packageInfo['dependencies'], '<dependencies>')) {
            return false;
        }
        foreach (array('required', 'optional') as $simpledep) {
            if (isset($this->_packageInfo['dependencies'][$simpledep])) {
                if ($simpledep == 'optional') {
                    $structure = array(
                        '*package',
                        '*subpackage',
                        '*extension',
                    );
                } else {
                    $structure = array(
                        'php',
                        'pearinstaller',
                        '*package',
                        '*subpackage',
                        '*extension',
                        '*os',
                        '*arch',
                    );
                }
                if ($this->_stupidSchemaValidate($structure,
                      $this->_packageInfo['dependencies'][$simpledep],
                      "<dependencies><$simpledep>")) {
                    foreach (array('package', 'subpackage', 'extension') as $type) {
                        if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) {
                            $iter = $this->_packageInfo['dependencies'][$simpledep][$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                if ($type != 'extension') {
                                    if (isset($package['uri'])) {
                                        if (isset($package['channel'])) {
                                            $this->_UrlOrChannel($type,
                                                $package['name']);
                                        }
                                    } else {
                                        if (!isset($package['channel'])) {
                                            $this->_NoChannel($type, $package['name']);
                                        }
                                    }
                                }
                                $this->{"_validate{$type}Dep"}($package, "<$simpledep>");
                            }
                        }
                    }
                    if ($simpledep == 'optional') {
                        continue;
                    }
                    foreach (array('php', 'pearinstaller', 'os', 'arch') as $type) {
                        if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) {
                            $iter = $this->_packageInfo['dependencies'][$simpledep][$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                $this->{"_validate{$type}Dep"}($package);
                            }
                        }
                    }
                }
            }
        }
        if (isset($this->_packageInfo['dependencies']['group'])) {
            $groups = $this->_packageInfo['dependencies']['group'];
            if (!isset($groups[0])) {
                $groups = array($groups);
            }
            $structure = array(
                '*package',
                '*subpackage',
                '*extension',
            );
            foreach ($groups as $group) {
                if ($this->_stupidSchemaValidate($structure, $group, '<group>')) {
                    if (!PEAR_Validate::validGroupName($group['attribs']['name'])) {
                        $this->_invalidDepGroupName($group['attribs']['name']);
                    }
                    foreach (array('package', 'subpackage', 'extension') as $type) {
                        if (isset($group[$type])) {
                            $iter = $group[$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                if ($type != 'extension') {
                                    if (isset($package['uri'])) {
                                        if (isset($package['channel'])) {
                                            $this->_UrlOrChannelGroup($type,
                                                $package['name'],
                                                $group['name']);
                                        }
                                    } else {
                                        if (!isset($package['channel'])) {
                                            $this->_NoChannelGroup($type,
                                                $package['name'],
                                                $group['name']);
                                        }
                                    }
                                }
                                $this->{"_validate{$type}Dep"}($package, '<group name="' .
                                    $group['attribs']['name'] . '">');
                            }
                        }
                    }
                }
            }
        }
    }

    function _validateCompatible()
    {
        $compat = $this->_packageInfo['compatible'];
        if (!isset($compat[0])) {
            $compat = array($compat);
        }
        $required = array('name', 'channel', 'min', 'max', '*exclude');
        foreach ($compat as $package) {
            $type = '<compatible>';
            if (is_array($package) && array_key_exists('name', $package)) {
                $type .= '<name>' . $package['name'] . '</name>';
            }
            $this->_stupidSchemaValidate($required, $package, $type);
            if (is_array($package) && array_key_exists('min', $package)) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $package['min'])) {
                    $this->_invalidVersion(substr($type, 1) . '<min', $package['min']);
                }
            }
            if (is_array($package) && array_key_exists('max', $package)) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $package['max'])) {
                    $this->_invalidVersion(substr($type, 1) . '<max', $package['max']);
                }
            }
            if (is_array($package) && array_key_exists('exclude', $package)) {
                if (!is_array($package['exclude'])) {
                    $package['exclude'] = array($package['exclude']);
                }
                foreach ($package['exclude'] as $exclude) {
                    if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                          $exclude)) {
                        $this->_invalidVersion(substr($type, 1) . '<exclude', $exclude);
                    }
                }
            }
        }
    }

    function _validateBundle($list)
    {
        if (!is_array($list) || !isset($list['bundledpackage'])) {
            return $this->_NoBundledPackages();
        }
        if (!is_array($list['bundledpackage']) || !isset($list['bundledpackage'][0])) {
            return $this->_AtLeast2BundledPackages();
        }
        foreach ($list['bundledpackage'] as $package) {
            if (!is_string($package)) {
                $this->_bundledPackagesMustBeFilename();
            }
        }
    }

    function _validateFilelist($list = false, $allowignore = false, $dirs = '')
    {
        $iscontents = false;
        if (!$list) {
            $iscontents = true;
            $list = $this->_packageInfo['contents'];
            if (isset($this->_packageInfo['bundle'])) {
                return $this->_validateBundle($list);
            }
        }
        if ($allowignore) {
            $struc = array(
                '*install->name->as',
                '*ignore->name'
            );
        } else {
            $struc = array(
                '*dir->name->?baseinstalldir',
                '*file->name->role->?baseinstalldir->?md5sum'
            );
            if (isset($list['dir']) && isset($list['file'])) {
                // stave off validation errors without requiring a set order.
                $_old = $list;
                if (isset($list['attribs'])) {
                    $list = array('attribs' => $_old['attribs']);
                }
                $list['dir'] = $_old['dir'];
                $list['file'] = $_old['file'];
            }
        }
        if (!isset($list['attribs']) || !isset($list['attribs']['name'])) {
            $unknown = $allowignore ? '<filelist>' : '<dir name="*unknown*">';
            $dirname = $iscontents ? '<contents>' : $unknown;
        } else {
            $dirname = '<dir name="' . $list['attribs']['name'] . '">';
            if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                          str_replace('\\', '/', $list['attribs']['name']))) {
                // file contains .. parent directory or . cur directory
                $this->_invalidDirName($list['attribs']['name']);
            }
        }
        $res = $this->_stupidSchemaValidate($struc, $list, $dirname);
        if ($allowignore && $res) {
            $ignored_or_installed = array();
            $this->_pf->getFilelist();
            $fcontents = $this->_pf->getContents();
            $filelist = array();
            if (!isset($fcontents['dir']['file'][0])) {
                $fcontents['dir']['file'] = array($fcontents['dir']['file']);
            }
            foreach ($fcontents['dir']['file'] as $file) {
                $filelist[$file['attribs']['name']] = true;
            }
            if (isset($list['install'])) {
                if (!isset($list['install'][0])) {
                    $list['install'] = array($list['install']);
                }
                foreach ($list['install'] as $file) {
                    if (!isset($filelist[$file['attribs']['name']])) {
                        $this->_notInContents($file['attribs']['name'], 'install');
                        continue;
                    }
                    if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) {
                        $this->_multipleInstallAs($file['attribs']['name']);
                    }
                    if (!isset($ignored_or_installed[$file['attribs']['name']])) {
                        $ignored_or_installed[$file['attribs']['name']] = array();
                    }
                    $ignored_or_installed[$file['attribs']['name']][] = 1;
                    if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                                  str_replace('\\', '/', $file['attribs']['as']))) {
                        // file contains .. parent directory or . cur directory references
                        $this->_invalidFileInstallAs($file['attribs']['name'],
                            $file['attribs']['as']);
                    }
                }
            }
            if (isset($list['ignore'])) {
                if (!isset($list['ignore'][0])) {
                    $list['ignore'] = array($list['ignore']);
                }
                foreach ($list['ignore'] as $file) {
                    if (!isset($filelist[$file['attribs']['name']])) {
                        $this->_notInContents($file['attribs']['name'], 'ignore');
                        continue;
                    }
                    if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) {
                        $this->_ignoreAndInstallAs($file['attribs']['name']);
                    }
                }
            }
        }
        if (!$allowignore && isset($list['file'])) {
            if (is_string($list['file'])) {
                $this->_oldStyleFileNotAllowed();
                return false;
            }
            if (!isset($list['file'][0])) {
                // single file
                $list['file'] = array($list['file']);
            }
            foreach ($list['file'] as $i => $file)
            {
                if (isset($file['attribs']) && isset($file['attribs']['name'])) {
                    if ($file['attribs']['name'][0] == '.' &&
                          $file['attribs']['name'][1] == '/') {
                        // name is something like "./doc/whatever.txt"
                        $this->_invalidFileName($file['attribs']['name'], $dirname);
                    }
                    if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                                  str_replace('\\', '/', $file['attribs']['name']))) {
                        // file contains .. parent directory or . cur directory
                        $this->_invalidFileName($file['attribs']['name'], $dirname);
                    }
                }
                if (isset($file['attribs']) && isset($file['attribs']['role'])) {
                    if (!$this->_validateRole($file['attribs']['role'])) {
                        if (isset($this->_packageInfo['usesrole'])) {
                            $roles = $this->_packageInfo['usesrole'];
                            if (!isset($roles[0])) {
                                $roles = array($roles);
                            }
                            foreach ($roles as $role) {
                                if ($role['role'] = $file['attribs']['role']) {
                                    $msg = 'This package contains role "%role%" and requires ' .
                                        'package "%package%" to be used';
                                    if (isset($role['uri'])) {
                                        $params = array('role' => $role['role'],
                                            'package' => $role['uri']);
                                    } else {
                                        $params = array('role' => $role['role'],
                                            'package' => $this->_pf->_registry->
                                            parsedPackageNameToString(array('package' =>
                                                $role['package'], 'channel' => $role['channel']),
                                                true));
                                    }
                                    $this->_stack->push('_mustInstallRole', 'error', $params, $msg);
                                }
                            }
                        }
                        $this->_invalidFileRole($file['attribs']['name'],
                            $dirname, $file['attribs']['role']);
                    }
                }
                if (!isset($file['attribs'])) {
                    continue;
                }
                $save = $file['attribs'];
                if ($dirs) {
                    $save['name'] = $dirs . '/' . $save['name'];
                }
                unset($file['attribs']);
                if (count($file) && $this->_curState != PEAR_VALIDATE_DOWNLOADING) { // has tasks
                    foreach ($file as $task => $value) {
                        if ($tagClass = $this->_pf->getTask($task)) {
                            if (!is_array($value) || !isset($value[0])) {
                                $value = array($value);
                            }
                            foreach ($value as $v) {
                                $ret = call_user_func(array($tagClass, 'validateXml'),
                                    $this->_pf, $v, $this->_pf->_config, $save);
                                if (is_array($ret)) {
                                    $this->_invalidTask($task, $ret, isset($save['name']) ?
                                        $save['name'] : '');
                                }
                            }
                        } else {
                            if (isset($this->_packageInfo['usestask'])) {
                                $roles = $this->_packageInfo['usestask'];
                                if (!isset($roles[0])) {
                                    $roles = array($roles);
                                }
                                foreach ($roles as $role) {
                                    if ($role['task'] = $task) {
                                        $msg = 'This package contains task "%task%" and requires ' .
                                            'package "%package%" to be used';
                                        if (isset($role['uri'])) {
                                            $params = array('task' => $role['task'],
                                                'package' => $role['uri']);
                                        } else {
                                            $params = array('task' => $role['task'],
                                                'package' => $this->_pf->_registry->
                                                parsedPackageNameToString(array('package' =>
                                                    $role['package'], 'channel' => $role['channel']),
                                                    true));
                                        }
                                        $this->_stack->push('_mustInstallTask', 'error',
                                            $params, $msg);
                                    }
                                }
                            }
                            $this->_unknownTask($task, $save['name']);
                        }
                    }
                }
            }
        }
        if (isset($list['ignore'])) {
            if (!$allowignore) {
                $this->_ignoreNotAllowed('ignore');
            }
        }
        if (isset($list['install'])) {
            if (!$allowignore) {
                $this->_ignoreNotAllowed('install');
            }
        }
        if (isset($list['file'])) {
            if ($allowignore) {
                $this->_fileNotAllowed('file');
            }
        }
        if (isset($list['dir'])) {
            if ($allowignore) {
                $this->_fileNotAllowed('dir');
            } else {
                if (!isset($list['dir'][0])) {
                    $list['dir'] = array($list['dir']);
                }
                foreach ($list['dir'] as $dir) {
                    if (isset($dir['attribs']) && isset($dir['attribs']['name'])) {
                        if ($dir['attribs']['name'] == '/' ||
                              !isset($this->_packageInfo['contents']['dir']['dir'])) {
                            // always use nothing if the filelist has already been flattened
                            $newdirs = '';
                        } elseif ($dirs == '') {
                            $newdirs = $dir['attribs']['name'];
                        } else {
                            $newdirs = $dirs . '/' . $dir['attribs']['name'];
                        }
                    } else {
                        $newdirs = $dirs;
                    }
                    $this->_validateFilelist($dir, $allowignore, $newdirs);
                }
            }
        }
    }

    function _validateRelease()
    {
        if (isset($this->_packageInfo['phprelease'])) {
            $release = 'phprelease';
            if (isset($this->_packageInfo['providesextension'])) {
                $this->_cannotProvideExtension($release);
            }
            if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                $this->_cannotHaveSrcpackage($release);
            }
            $releases = $this->_packageInfo['phprelease'];
            if (!is_array($releases)) {
                return true;
            }
            if (!isset($releases[0])) {
                $releases = array($releases);
            }
            foreach ($releases as $rel) {
                $this->_stupidSchemaValidate(array(
                    '*installconditions',
                    '*filelist',
                ), $rel, '<phprelease>');
            }
        }
        foreach (array('', 'zend') as $prefix) {
            $releasetype = $prefix . 'extsrcrelease';
            if (isset($this->_packageInfo[$releasetype])) {
                $release = $releasetype;
                if (!isset($this->_packageInfo['providesextension'])) {
                    $this->_mustProvideExtension($release);
                }
                if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                    $this->_cannotHaveSrcpackage($release);
                }
                $releases = $this->_packageInfo[$releasetype];
                if (!is_array($releases)) {
                    return true;
                }
                if (!isset($releases[0])) {
                    $releases = array($releases);
                }
                foreach ($releases as $rel) {
                    $this->_stupidSchemaValidate(array(
                        '*installconditions',
                        '*configureoption->name->prompt->?default',
                        '*binarypackage',
                        '*filelist',
                    ), $rel, '<' . $releasetype . '>');
                    if (isset($rel['binarypackage'])) {
                        if (!is_array($rel['binarypackage']) || !isset($rel['binarypackage'][0])) {
                            $rel['binarypackage'] = array($rel['binarypackage']);
                        }
                        foreach ($rel['binarypackage'] as $bin) {
                            if (!is_string($bin)) {
                                $this->_binaryPackageMustBePackagename();
                            }
                        }
                    }
                }
            }
            $releasetype = 'extbinrelease';
            if (isset($this->_packageInfo[$releasetype])) {
                $release = $releasetype;
                if (!isset($this->_packageInfo['providesextension'])) {
                    $this->_mustProvideExtension($release);
                }
                if (isset($this->_packageInfo['channel']) &&
                      !isset($this->_packageInfo['srcpackage'])) {
                    $this->_mustSrcPackage($release);
                }
                if (isset($this->_packageInfo['uri']) && !isset($this->_packageInfo['srcuri'])) {
                    $this->_mustSrcuri($release);
                }
                $releases = $this->_packageInfo[$releasetype];
                if (!is_array($releases)) {
                    return true;
                }
                if (!isset($releases[0])) {
                    $releases = array($releases);
                }
                foreach ($releases as $rel) {
                    $this->_stupidSchemaValidate(array(
                        '*installconditions',
                        '*filelist',
                    ), $rel, '<' . $releasetype . '>');
                }
            }
        }
        if (isset($this->_packageInfo['bundle'])) {
            $release = 'bundle';
            if (isset($this->_packageInfo['providesextension'])) {
                $this->_cannotProvideExtension($release);
            }
            if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                $this->_cannotHaveSrcpackage($release);
            }
            $releases = $this->_packageInfo['bundle'];
            if (!is_array($releases) || !isset($releases[0])) {
                $releases = array($releases);
            }
            foreach ($releases as $rel) {
                $this->_stupidSchemaValidate(array(
                    '*installconditions',
                    '*filelist',
                ), $rel, '<bundle>');
            }
        }
        foreach ($releases as $rel) {
            if (is_array($rel) && array_key_exists('installconditions', $rel)) {
                $this->_validateInstallConditions($rel['installconditions'],
                    "<$release><installconditions>");
            }
            if (is_array($rel) && array_key_exists('filelist', $rel)) {
                if ($rel['filelist']) {

                    $this->_validateFilelist($rel['filelist'], true);
                }
            }
        }
    }

    /**
     * This is here to allow role extension through plugins
     * @param string
     */
    function _validateRole($role)
    {
        return in_array($role, PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType()));
    }

    function _pearVersionTooLow($version)
    {
        $this->_stack->push(__FUNCTION__, 'error',
            array('version' => $version),
            'This package.xml requires PEAR version %version% to parse properly, we are ' .
            'version 1.10.16');
    }

    function _invalidTagOrder($oktags, $actual, $root)
    {
        $this->_stack->push(__FUNCTION__, 'error',
            array('oktags' => $oktags, 'actual' => $actual, 'root' => $root),
            'Invalid tag order in %root%, found <%actual%> expected one of "%oktags%"');
    }

    function _ignoreNotAllowed($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '<%type%> is not allowed inside global <contents>, only inside ' .
            '<phprelease>/<extbinrelease>/<zendextbinrelease>, use <dir> and <file> only');
    }

    function _fileNotAllowed($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '<%type%> is not allowed inside release <filelist>, only inside ' .
            '<contents>, use <ignore> and <install> only');
    }

    function _oldStyleFileNotAllowed()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Old-style <file>name</file> is not allowed.  Use' .
            '<file name="name" role="role"/>');
    }

    function _tagMissingAttribute($tag, $attr, $context)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag,
            'attribute' => $attr, 'context' => $context),
            'tag <%tag%> in context "%context%" has no attribute "%attribute%"');
    }

    function _tagHasNoAttribs($tag, $context)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag,
            'context' => $context),
            'tag <%tag%> has no attributes in context "%context%"');
    }

    function _invalidInternalStructure()
    {
        $this->_stack->push(__FUNCTION__, 'exception', array(),
            'internal array was not generated by compatible parser, or extreme parser error, cannot continue');
    }

    function _invalidFileRole($file, $dir, $role)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file, 'dir' => $dir, 'role' => $role,
            'roles' => PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType())),
            'File "%file%" in directory "%dir%" has invalid role "%role%", should be one of %roles%');
    }

    function _invalidFileName($file, $dir)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file),
            'File "%file%" in directory "%dir%" cannot begin with "./" or contain ".."');
    }

    function _invalidFileInstallAs($file, $as)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file, 'as' => $as),
            'File "%file%" <install as="%as%"/> cannot contain "./" or contain ".."');
    }

    function _invalidDirName($dir)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'dir' => $file),
            'Directory "%dir%" cannot begin with "./" or contain ".."');
    }

    function _filelistCannotContainFile($filelist)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist),
            '<%tag%> can only contain <dir>, contains <file>.  Use ' .
            '<dir name="/"> as the first dir element');
    }

    function _filelistMustContainDir($filelist)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist),
            '<%tag%> must contain <dir>.  Use <dir name="/"> as the ' .
            'first dir element');
    }

    function _tagCannotBeEmpty($tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag),
            '<%tag%> cannot be empty (<%tag%/>)');
    }

    function _UrlOrChannel($type, $name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name),
            'Required dependency <%type%> "%name%" can have either url OR ' .
            'channel attributes, and not both');
    }

    function _NoChannel($type, $name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name),
            'Required dependency <%type%> "%name%" must have either url OR ' .
            'channel attributes');
    }

    function _UrlOrChannelGroup($type, $name, $group)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name, 'group' => $group),
            'Group "%group%" dependency <%type%> "%name%" can have either url OR ' .
            'channel attributes, and not both');
    }

    function _NoChannelGroup($type, $name, $group)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name, 'group' => $group),
            'Group "%group%" dependency <%type%> "%name%" must have either url OR ' .
            'channel attributes');
    }

    function _unknownChannel($channel)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('channel' => $channel),
            'Unknown channel "%channel%"');
    }

    function _noPackageVersion()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'package.xml <package> tag has no version attribute, or version is not 2.0');
    }

    function _NoBundledPackages()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'No <bundledpackage> tag was found in <contents>, required for bundle packages');
    }

    function _AtLeast2BundledPackages()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'At least 2 packages must be bundled in a bundle package');
    }

    function _ChannelOrUri($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Bundled package "%name%" can have either a uri or a channel, not both');
    }

    function _noChildTag($child, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('child' => $child, 'tag' => $tag),
            'Tag <%tag%> is missing child tag <%child%>');
    }

    function _invalidVersion($type, $value)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value),
            'Version type <%type%> is not a valid version (%value%)');
    }

    function _invalidState($type, $value)
    {
        $states = array('stable', 'beta', 'alpha', 'devel');
        if ($type != 'api') {
            $states[] = 'snapshot';
        }
        if (strtolower($value) == 'rc') {
            $this->_stack->push(__FUNCTION__, 'error',
                array('version' => $this->_packageInfo['version']['release']),
                'RC is not a state, it is a version postfix, try %version%RC1, stability beta');
        }
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value,
            'types' => $states),
            'Stability type <%type%> is not a valid stability (%value%), must be one of ' .
            '%types%');
    }

    function _invalidTask($task, $ret, $file)
    {
        switch ($ret[0]) {
            case PEAR_TASK_ERROR_MISSING_ATTRIB :
                $info = array('attrib' => $ret[1], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> is missing attribute "%attrib%" in file %file%';
            break;
            case PEAR_TASK_ERROR_NOATTRIBS :
                $info = array('task' => $task, 'file' => $file);
                $msg = 'task <%task%> has no attributes in file %file%';
            break;
            case PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE :
                $info = array('attrib' => $ret[1], 'values' => $ret[3],
                    'was' => $ret[2], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> attribute "%attrib%" has the wrong value "%was%" '.
                    'in file %file%, expecting one of "%values%"';
            break;
            case PEAR_TASK_ERROR_INVALID :
                $info = array('reason' => $ret[1], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> in file %file% is invalid because of "%reason%"';
            break;
        }
        $this->_stack->push(__FUNCTION__, 'error', $info, $msg);
    }

    function _unknownTask($task, $file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('task' => $task, 'file' => $file),
            'Unknown task "%task%" passed in file <file name="%file%">');
    }

    function _subpackageCannotProvideExtension($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Subpackage dependency "%name%" cannot use <providesextension>, ' .
            'only package dependencies can use this tag');
    }

    function _subpackagesCannotConflict($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Subpackage dependency "%name%" cannot use <conflicts/>, ' .
            'only package dependencies can use this tag');
    }

    function _cannotProvideExtension($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages cannot use <providesextension>, only extbinrelease, extsrcrelease, zendextsrcrelease, and zendextbinrelease can provide a PHP extension');
    }

    function _mustProvideExtension($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages must use <providesextension> to indicate which PHP extension is provided');
    }

    function _cannotHaveSrcpackage($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages cannot specify a source code package, only extension binaries may use the <srcpackage> tag');
    }

    function _mustSrcPackage($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<extbinrelease>/<zendextbinrelease> packages must specify a source code package with <srcpackage>');
    }

    function _mustSrcuri($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<extbinrelease>/<zendextbinrelease> packages must specify a source code package with <srcuri>');
    }

    function _uriDepsCannotHaveVersioning($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: dependencies with a <uri> tag cannot have any versioning information');
    }

    function _conflictingDepsCannotHaveVersioning($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: conflicting dependencies cannot have versioning info, use <exclude> to ' .
            'exclude specific versions of a dependency');
    }

    function _DepchannelCannotBeUri($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: channel cannot be __uri, this is a pseudo-channel reserved for uri ' .
            'dependencies only');
    }

    function _bundledPackagesMustBeFilename()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            '<bundledpackage> tags must contain only the filename of a package release ' .
            'in the bundle');
    }

    function _binaryPackageMustBePackagename()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            '<binarypackage> tags must contain the name of a package that is ' .
            'a compiled version of this extsrc/zendextsrc package');
    }

    function _fileNotFound($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'File "%file%" in package.xml does not exist');
    }

    function _notInContents($file, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file, 'tag' => $tag),
            '<%tag% name="%file%"> is invalid, file is not in <contents>');
    }

    function _cannotValidateNoPathSet()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Cannot validate files, no path to package file is set (use setPackageFile())');
    }

    function _usesroletaskMustHaveChannelOrUri($role, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag),
            '<%tag%> for role "%role%" must contain either <uri>, or <channel> and <package>');
    }

    function _usesroletaskMustHavePackage($role, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag),
            '<%tag%> for role "%role%" must contain <package>');
    }

    function _usesroletaskMustHaveRoleTask($tag, $type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag, 'type' => $type),
            '<%tag%> must contain <%type%> defining the %type% to be used');
    }

    function _cannotConflictWithAllOs($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag),
            '%tag% cannot conflict with all OSes');
    }

    function _invalidDepGroupName($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Invalid dependency group name "%name%"');
    }

    function _multipleToplevelDirNotAllowed()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Multiple top-level <dir> tags are not allowed.  Enclose them ' .
                'in a <dir name="/">');
    }

    function _multipleInstallAs($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'Only one <install> tag is allowed for file "%file%"');
    }

    function _ignoreAndInstallAs($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'Cannot have both <ignore> and <install> tags for file "%file%"');
    }

    function _analyzeBundledPackages()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!$this->_pf->getPackageType() == 'bundle') {
            return false;
        }
        if (!isset($this->_pf->_packageFile)) {
            return false;
        }
        $dir_prefix = dirname($this->_pf->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') :
            array($common, 'log');
        $info = $this->_pf->getContents();
        $info = $info['bundledpackage'];
        if (!is_array($info)) {
            $info = array($info);
        }
        $pkg = new PEAR_PackageFile($this->_pf->_config);
        foreach ($info as $package) {
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $package)) {
                $this->_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $package);
                $this->_isValid = 0;
                continue;
            }
            call_user_func_array($log, array(1, "Analyzing bundled package $package"));
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $ret = $pkg->fromAnyFile($dir_prefix . DIRECTORY_SEPARATOR . $package,
                PEAR_VALIDATE_NORMAL);
            PEAR::popErrorHandling();
            if (PEAR::isError($ret)) {
                call_user_func_array($log, array(0, "ERROR: package $package is not a valid " .
                    'package'));
                $inf = $ret->getUserInfo();
                if (is_array($inf)) {
                    foreach ($inf as $err) {
                        call_user_func_array($log, array(1, $err['message']));
                    }
                }
                return false;
            }
        }
        return true;
    }

    function _analyzePhpFiles()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!isset($this->_pf->_packageFile)) {
            $this->_cannotValidateNoPathSet();
            return false;
        }
        $dir_prefix = dirname($this->_pf->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') :
            array(&$common, 'log');
        $info = $this->_pf->getContents();
        if (!$info || !isset($info['dir']['file'])) {
            $this->_tagCannotBeEmpty('contents><dir');
            return false;
        }
        $info = $info['dir']['file'];
        if (isset($info['attribs'])) {
            $info = array($info);
        }
        $provides = array();
        foreach ($info as $fa) {
            $fa = $fa['attribs'];
            $file = $fa['name'];
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) {
                $this->_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $file);
                $this->_isValid = 0;
                continue;
            }
            if (in_array($fa['role'], PEAR_Installer_Role::getPhpRoles()) && $dir_prefix) {
                call_user_func_array($log, array(1, "Analyzing $file"));
                $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file);
                if ($srcinfo) {
                    $provides = array_merge($provides, $this->_buildProvidesArray($srcinfo));
                }
            }
        }
        $this->_packageName = $pn = $this->_pf->getPackage();
        $pnl = strlen($pn);
        foreach ($provides as $key => $what) {
            if (isset($what['explicit']) || !$what) {
                // skip conformance checks if the provides entry is
                // specified in the package.xml file
                continue;
            }
            extract($what);
            if ($type == 'class') {
                if (!strncasecmp($name, $pn, $pnl)) {
                    continue;
                }
                $this->_stack->push(__FUNCTION__, 'warning',
                    array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn),
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"');
            } elseif ($type == 'function') {
                if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
                    continue;
                }
                $this->_stack->push(__FUNCTION__, 'warning',
                    array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn),
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"');
            }
        }
        return $this->_isValid;
    }

    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @param  boolean whether to analyze $file as the file contents
     * @return mixed
     */
    function analyzeSourceCode($file, $string = false)
    {
        if (!function_exists("token_get_all")) {
            $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
                'Parser error: token_get_all() function must exist to analyze source code, PHP may have been compiled with --disable-tokenizer');
            return false;
        }

        if (!defined('T_DOC_COMMENT')) {
            define('T_DOC_COMMENT', T_COMMENT);
        }

        if (!defined('T_INTERFACE')) {
            define('T_INTERFACE', -1);
        }

        if (!defined('T_IMPLEMENTS')) {
            define('T_IMPLEMENTS', -1);
        }

        if ($string) {
            $contents = $file;
        } else {
            if (!$fp = @fopen($file, "r")) {
                return false;
            }
            fclose($fp);
            $contents = file_get_contents($file);
        }

        // Silence this function so we can catch PHP Warnings and show our own custom message
        $tokens = @token_get_all($contents);
        if (isset($php_errormsg)) {
            if (isset($this->_stack)) {
                $pn = $this->_pf->getPackage();
                $this->_stack->push(__FUNCTION__, 'warning',
                        array('file' => $file, 'package' => $pn),
                        'in %file%: Could not process file for unknown reasons,' .
                        ' possibly a PHP parse error in %file% from %package%');
            }
        }
/*
        for ($i = 0; $i < sizeof($tokens); $i++) {
            @list($token, $data) = $tokens[$i];
            if (is_string($token)) {
                var_dump($token);
            } else {
                print token_name($token) . ' ';
                var_dump(rtrim($data));
            }
        }
*/
        $look_for = 0;
        $paren_level = 0;
        $bracket_level = 0;
        $brace_level = 0;
        $lastphpdoc = '';
        $current_class = '';
        $current_interface = '';
        $current_class_level = -1;
        $current_function = '';
        $current_function_level = -1;
        $declared_classes = array();
        $declared_interfaces = array();
        $declared_functions = array();
        $declared_methods = array();
        $used_classes = array();
        $used_functions = array();
        $extends = array();
        $implements = array();
        $nodeps = array();
        $inquote = false;
        $interface = false;
        for ($i = 0; $i < sizeof($tokens); $i++) {
            if (is_array($tokens[$i])) {
                list($token, $data) = $tokens[$i];
            } else {
                $token = $tokens[$i];
                $data = '';
            }

            if ($inquote) {
                if ($token != '"' && $token != T_END_HEREDOC) {
                    continue;
                } else {
                    $inquote = false;
                    continue;
                }
            }

            switch ($token) {
                case T_WHITESPACE :
                    continue 2;
                case ';':
                    if ($interface) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    break;
                case '"':
                case T_START_HEREDOC:
                    $inquote = true;
                    break;
                case T_CURLY_OPEN:
                case T_DOLLAR_OPEN_CURLY_BRACES:
                case '{': $brace_level++; continue 2;
                case '}':
                    $brace_level--;
                    if ($current_class_level == $brace_level) {
                        $current_class = '';
                        $current_class_level = -1;
                    }
                    if ($current_function_level == $brace_level) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    continue 2;
                case '[': $bracket_level++; continue 2;
                case ']': $bracket_level--; continue 2;
                case '(': $paren_level++;   continue 2;
                case ')': $paren_level--;   continue 2;
                case T_INTERFACE:
                    $interface = true;
                case T_CLASS:
                    if (($current_class_level != -1) || ($current_function_level != -1)) {
                        if (isset($this->_stack)) {
                            $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
                            'Parser error: invalid PHP found in file "%file%"');
                        } else {
                            PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"",
                                PEAR_COMMON_ERROR_INVALIDPHP);
                        }

                        return false;
                    }
                case T_FUNCTION:
                case T_NEW:
                case T_EXTENDS:
                case T_IMPLEMENTS:
                    $look_for = $token;
                    continue 2;
                case T_STRING:
                    if ($look_for == T_CLASS) {
                        $current_class = $data;
                        $current_class_level = $brace_level;
                        $declared_classes[] = $current_class;
                    } elseif ($look_for == T_INTERFACE) {
                        $current_interface = $data;
                        $current_class_level = $brace_level;
                        $declared_interfaces[] = $current_interface;
                    } elseif ($look_for == T_IMPLEMENTS) {
                        $implements[$current_class] = $data;
                    } elseif ($look_for == T_EXTENDS) {
                        $extends[$current_class] = $data;
                    } elseif ($look_for == T_FUNCTION) {
                        if ($current_class) {
                            $current_function = "$current_class::$data";
                            $declared_methods[$current_class][] = $data;
                        } elseif ($current_interface) {
                            $current_function = "$current_interface::$data";
                            $declared_methods[$current_interface][] = $data;
                        } else {
                            $current_function = $data;
                            $declared_functions[] = $current_function;
                        }

                        $current_function_level = $brace_level;
                        $m = array();
                    } elseif ($look_for == T_NEW) {
                        $used_classes[$data] = true;
                    }

                    $look_for = 0;
                    continue 2;
                case T_VARIABLE:
                    $look_for = 0;
                    continue 2;
                case T_DOC_COMMENT:
                case T_COMMENT:
                    if (preg_match('!^/\*\*\s!', $data)) {
                        $lastphpdoc = $data;
                        if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) {
                            $nodeps = array_merge($nodeps, $m[1]);
                        }
                    }
                    continue 2;
                case T_DOUBLE_COLON:
                    $token = $tokens[$i - 1][0];
                    if (!($token == T_WHITESPACE || $token == T_STRING || $token == T_STATIC || $token == T_VARIABLE)) {
                        if (isset($this->_stack)) {
                            $this->_stack->push(__FUNCTION__, 'warning', array('file' => $file),
                                'Parser error: invalid PHP found in file "%file%"');
                        } else {
                            PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"",
                                PEAR_COMMON_ERROR_INVALIDPHP);
                        }

                        return false;
                    }

                    $class = $tokens[$i - 1][1];
                    if (strtolower($class) != 'parent') {
                        $used_classes[$class] = true;
                    }

                    continue 2;
            }
        }

        return array(
            "source_file" => $file,
            "declared_classes" => $declared_classes,
            "declared_interfaces" => $declared_interfaces,
            "declared_methods" => $declared_methods,
            "declared_functions" => $declared_functions,
            "used_classes" => array_diff(array_keys($used_classes), $nodeps),
            "inheritance" => $extends,
            "implements" => $implements,
        );
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access private
     *
     */
    function _buildProvidesArray($srcinfo)
    {
        if (!$this->_isValid) {
            return array();
        }

        $providesret = array();
        $file        = basename($srcinfo['source_file']);
        $pn          = isset($this->_pf) ? $this->_pf->getPackage() : '';
        $pnl         = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($providesret[$key])) {
                continue;
            }

            $providesret[$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $providesret[$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }

        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($providesret[$key])) {
                    continue;
                }

                $providesret[$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($providesret[$key])) {
                continue;
            }

            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }

            $providesret[$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }

        return $providesret;
    }
}
pear/PEAR/PackageFile/v1.php000064400000142663151732710130011430 0ustar00<?php
/**
 * PEAR_PackageFile_v1, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * For error handling
 */
require_once 'PEAR/ErrorStack.php';

/**
 * Error code if parsing is attempted with no xml extension
 */
define('PEAR_PACKAGEFILE_ERROR_NO_XML_EXT', 3);

/**
 * Error code if creating the xml parser resource fails
 */
define('PEAR_PACKAGEFILE_ERROR_CANT_MAKE_PARSER', 4);

/**
 * Error code used for all sax xml parsing errors
 */
define('PEAR_PACKAGEFILE_ERROR_PARSER_ERROR', 5);

/**
 * Error code used when there is no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_NAME', 6);

/**
 * Error code when a package name is not valid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_NAME', 7);

/**
 * Error code used when no summary is parsed
 */
define('PEAR_PACKAGEFILE_ERROR_NO_SUMMARY', 8);

/**
 * Error code for summaries that are more than 1 line
 */
define('PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY', 9);

/**
 * Error code used when no description is present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION', 10);

/**
 * Error code used when no license is present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_LICENSE', 11);

/**
 * Error code used when a <version> version number is not present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_VERSION', 12);

/**
 * Error code used when a <version> version number is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_VERSION', 13);

/**
 * Error code when release state is missing
 */
define('PEAR_PACKAGEFILE_ERROR_NO_STATE', 14);

/**
 * Error code when release state is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_STATE', 15);

/**
 * Error code when release state is missing
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DATE', 16);

/**
 * Error code when release state is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DATE', 17);

/**
 * Error code when no release notes are found
 */
define('PEAR_PACKAGEFILE_ERROR_NO_NOTES', 18);

/**
 * Error code when no maintainers are found
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS', 19);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE', 20);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE', 21);

/**
 * Error code when a maintainer has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME', 22);

/**
 * Error code when a maintainer has no email
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL', 23);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_MAINTROLE', 24);

/**
 * Error code when a dependency is not a PHP dependency, but has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPNAME', 25);

/**
 * Error code when a dependency has no type (pkg, php, etc.)
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE', 26);

/**
 * Error code when a dependency has no relation (lt, ge, has, etc.)
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPREL', 27);

/**
 * Error code when a dependency is not a 'has' relation, but has no version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION', 28);

/**
 * Error code when a dependency has an invalid relation
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPREL', 29);

/**
 * Error code when a dependency has an invalid type
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPTYPE', 30);

/**
 * Error code when a dependency has an invalid optional option
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL', 31);

/**
 * Error code when a dependency is a pkg dependency, and has an invalid package name
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPNAME', 32);

/**
 * Error code when a dependency has a channel="foo" attribute, and foo is not a registered channel
 */
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_DEPCHANNEL', 33);

/**
 * Error code when rel="has" and version attribute is present.
 */
define('PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED', 34);

/**
 * Error code when type="php" and dependency name is present
 */
define('PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED', 35);

/**
 * Error code when a configure option has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_CONFNAME', 36);

/**
 * Error code when a configure option has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT', 37);

/**
 * Error code when a file in the filelist has an invalid role
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE', 38);

/**
 * Error code when a file in the filelist has no role
 */
define('PEAR_PACKAGEFILE_ERROR_NO_FILEROLE', 39);

/**
 * Error code when analyzing a php source file that has parse errors
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE', 40);

/**
 * Error code when analyzing a php source file reveals a source element
 * without a package name prefix
 */
define('PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX', 41);

/**
 * Error code when an unknown channel is specified
 */
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_CHANNEL', 42);

/**
 * Error code when no files are found in the filelist
 */
define('PEAR_PACKAGEFILE_ERROR_NO_FILES', 43);

/**
 * Error code when a file is not valid php according to _analyzeSourceCode()
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILE', 44);

/**
 * Error code when the channel validator returns an error or warning
 */
define('PEAR_PACKAGEFILE_ERROR_CHANNELVAL', 45);

/**
 * Error code when a php5 package is packaged in php4 (analysis doesn't work)
 */
define('PEAR_PACKAGEFILE_ERROR_PHP5', 46);

/**
 * Error code when a file is listed in package.xml but does not exist
 */
define('PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND', 47);

/**
 * Error code when a <dep type="php" rel="not"... is encountered (use rel="ne")
 */
define('PEAR_PACKAGEFILE_PHP_NO_NOT', 48);

/**
 * Error code when a package.xml contains non-ISO-8859-1 characters
 */
define('PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS', 49);

/**
 * Error code when a dependency is not a 'has' relation, but has no version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION', 50);

/**
 * Error code when a package has no lead developer
 */
define('PEAR_PACKAGEFILE_ERROR_NO_LEAD', 51);

/**
 * Error code when a filename begins with "."
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME', 52);
/**
 * package.xml encapsulator
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_v1
{
    /**
     * @access private
     * @var PEAR_ErrorStack
     * @access private
     */
    var $_stack;

    /**
     * A registry object, used to access the package name validation regex for non-standard channels
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;

    /**
     * An object that contains a log method that matches PEAR_Common::log's signature
     * @var object
     * @access private
     */
    var $_logger;

    /**
     * Parsed package information
     * @var array
     * @access private
     */
    var $_packageInfo;

    /**
     * path to package.xml
     * @var string
     * @access private
     */
    var $_packageFile;

    /**
     * path to package .tgz or false if this is a local/extracted package.xml
     * @var string
     * @access private
     */
    var $_archiveFile;

    /**
     * @var int
     * @access private
     */
    var $_isValid = 0;

    /**
     * Determines whether this packagefile was initialized only with partial package info
     *
     * If this package file was constructed via parsing REST, it will only contain
     *
     * - package name
     * - channel name
     * - dependencies 
     * @var boolean
     * @access private
     */
    var $_incomplete = true;

    /**
     * @param bool determines whether to return a PEAR_Error object, or use the PEAR_ErrorStack
     * @param string Name of Error Stack class to use.
     */
    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_PackageFile_v1');
        $this->_stack->setErrorMessageTemplate($this->_getErrorMessage());
        $this->_isValid = 0;
    }

    function installBinary($installer)
    {
        return false;
    }

    function isExtension($name)
    {
        return false;
    }

    function setConfig(&$config)
    {
        $this->_config = &$config;
        $this->_registry = &$config->getRegistry();
    }

    function setRequestedGroup()
    {
        // placeholder
    }

    /**
     * For saving in the registry.
     *
     * Set the last version that was installed
     * @param string
     */
    function setLastInstalledVersion($version)
    {
        $this->_packageInfo['_lastversion'] = $version;
    }

    /**
     * @return string|false
     */
    function getLastInstalledVersion()
    {
        if (isset($this->_packageInfo['_lastversion'])) {
            return $this->_packageInfo['_lastversion'];
        }
        return false;
    }

    function getInstalledBinary()
    {
        return false;
    }

    function listPostinstallScripts()
    {
        return false;
    }

    function initPostinstallScripts()
    {
        return false;
    }

    function setLogger(&$logger)
    {
        if ($logger && (!is_object($logger) || !method_exists($logger, 'log'))) {
            return PEAR::raiseError('Logger must be compatible with PEAR_Common::log');
        }
        $this->_logger = &$logger;
    }

    function setPackagefile($file, $archive = false)
    {
        $this->_packageFile = $file;
        $this->_archiveFile = $archive ? $archive : $file;
    }

    function getPackageFile()
    {
        return isset($this->_packageFile) ? $this->_packageFile : false;
    }

    function getPackageType()
    {
        return 'php';
    }

    function getArchiveFile()
    {
        return $this->_archiveFile;
    }

    function packageInfo($field)
    {
        if (!is_string($field) || empty($field) ||
            !isset($this->_packageInfo[$field])) {
            return false;
        }
        return $this->_packageInfo[$field];
    }

    function setDirtree($path)
    {
        if (!isset($this->_packageInfo['dirtree'])) {
            $this->_packageInfo['dirtree'] = array();
        }
        $this->_packageInfo['dirtree'][$path] = true;
    }

    function getDirtree()
    {
        if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) {
            return $this->_packageInfo['dirtree'];
        }
        return false;
    }

    function resetDirtree()
    {
        unset($this->_packageInfo['dirtree']);
    }

    function fromArray($pinfo)
    {
        $this->_incomplete = false;
        $this->_packageInfo = $pinfo;
    }

    function isIncomplete()
    {
        return $this->_incomplete;
    }

    function getChannel()
    {
        return 'pear.php.net';
    }

    function getUri()
    {
        return false;
    }

    function getTime()
    {
        return false;
    }

    function getExtends()
    {
        if (isset($this->_packageInfo['extends'])) {
            return $this->_packageInfo['extends'];
        }
        return false;
    }

    /**
     * @return array
     */
    function toArray()
    {
        if (!$this->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        return $this->getArray();
    }

    function getArray()
    {
        return $this->_packageInfo;
    }

    function getName()
    {
        return $this->getPackage();
    }

    function getPackage()
    {
        if (isset($this->_packageInfo['package'])) {
            return $this->_packageInfo['package'];
        }
        return false;
    }

    /**
     * WARNING - don't use this unless you know what you are doing
     */
    function setRawPackage($package)
    {
        $this->_packageInfo['package'] = $package;
    }

    function setPackage($package)
    {
        $this->_packageInfo['package'] = $package;
        $this->_isValid = false;
    }

    function getVersion()
    {
        if (isset($this->_packageInfo['version'])) {
            return $this->_packageInfo['version'];
        }
        return false;
    }

    function setVersion($version)
    {
        $this->_packageInfo['version'] = $version;
        $this->_isValid = false;
    }

    function clearMaintainers()
    {
        unset($this->_packageInfo['maintainers']);
    }

    function getMaintainers()
    {
        if (isset($this->_packageInfo['maintainers'])) {
            return $this->_packageInfo['maintainers'];
        }
        return false;
    }

    /**
     * Adds a new maintainer - no checking of duplicates is performed, use
     * updatemaintainer for that purpose.
     */
    function addMaintainer($role, $handle, $name, $email)
    {
        $this->_packageInfo['maintainers'][] =
            array('handle' => $handle, 'role' => $role, 'email' => $email, 'name' => $name);
        $this->_isValid = false;
    }

    function updateMaintainer($role, $handle, $name, $email)
    {
        $found = false;
        if (!isset($this->_packageInfo['maintainers']) ||
              !is_array($this->_packageInfo['maintainers'])) {
            return $this->addMaintainer($role, $handle, $name, $email);
        }
        foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
            if ($maintainer['handle'] == $handle) {
                $found = $i;
                break;
            }
        }
        if ($found !== false) {
            unset($this->_packageInfo['maintainers'][$found]);
            $this->_packageInfo['maintainers'] =
                array_values($this->_packageInfo['maintainers']);
        }
        $this->addMaintainer($role, $handle, $name, $email);
    }

    function deleteMaintainer($handle)
    {
        $found = false;
        foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
            if ($maintainer['handle'] == $handle) {
                $found = $i;
                break;
            }
        }
        if ($found !== false) {
            unset($this->_packageInfo['maintainers'][$found]);
            $this->_packageInfo['maintainers'] =
                array_values($this->_packageInfo['maintainers']);
            return true;
        }
        return false;
    }

    function getState()
    {
        if (isset($this->_packageInfo['release_state'])) {
            return $this->_packageInfo['release_state'];
        }
        return false;
    }

    function setRawState($state)
    {
        $this->_packageInfo['release_state'] = $state;
    }

    function setState($state)
    {
        $this->_packageInfo['release_state'] = $state;
        $this->_isValid = false;
    }

    function getDate()
    {
        if (isset($this->_packageInfo['release_date'])) {
            return $this->_packageInfo['release_date'];
        }
        return false;
    }

    function setDate($date)
    {
        $this->_packageInfo['release_date'] = $date;
        $this->_isValid = false;
    }

    function getLicense()
    {
        if (isset($this->_packageInfo['release_license'])) {
            return $this->_packageInfo['release_license'];
        }
        return false;
    }

    function setLicense($date)
    {
        $this->_packageInfo['release_license'] = $date;
        $this->_isValid = false;
    }

    function getSummary()
    {
        if (isset($this->_packageInfo['summary'])) {
            return $this->_packageInfo['summary'];
        }
        return false;
    }

    function setSummary($summary)
    {
        $this->_packageInfo['summary'] = $summary;
        $this->_isValid = false;
    }

    function getDescription()
    {
        if (isset($this->_packageInfo['description'])) {
            return $this->_packageInfo['description'];
        }
        return false;
    }

    function setDescription($desc)
    {
        $this->_packageInfo['description'] = $desc;
        $this->_isValid = false;
    }

    function getNotes()
    {
        if (isset($this->_packageInfo['release_notes'])) {
            return $this->_packageInfo['release_notes'];
        }
        return false;
    }

    function setNotes($notes)
    {
        $this->_packageInfo['release_notes'] = $notes;
        $this->_isValid = false;
    }

    function getDeps()
    {
        if (isset($this->_packageInfo['release_deps'])) {
            return $this->_packageInfo['release_deps'];
        }
        return false;
    }

    /**
     * Reset dependencies prior to adding new ones
     */
    function clearDeps()
    {
        unset($this->_packageInfo['release_deps']);
    }

    function addPhpDep($version, $rel)
    {
        $this->_isValid = false;
        $this->_packageInfo['release_deps'][] =
            array('type' => 'php',
                  'rel' => $rel,
                  'version' => $version);
    }

    function addPackageDep($name, $version, $rel, $optional = 'no')
    {
        $this->_isValid = false;
        $dep =
            array('type' => 'pkg',
                  'name' => $name,
                  'rel' => $rel,
                  'optional' => $optional);
        if ($rel != 'has' && $rel != 'not') {
            $dep['version'] = $version;
        }
        $this->_packageInfo['release_deps'][] = $dep;
    }

    function addExtensionDep($name, $version, $rel, $optional = 'no')
    {
        $this->_isValid = false;
        $this->_packageInfo['release_deps'][] =
            array('type' => 'ext',
                  'name' => $name,
                  'rel' => $rel,
                  'version' => $version,
                  'optional' => $optional);
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setDeps($deps)
    {
        $this->_packageInfo['release_deps'] = $deps;
    }

    function hasDeps()
    {
        return isset($this->_packageInfo['release_deps']) &&
            count($this->_packageInfo['release_deps']);
    }

    function getDependencyGroup($group)
    {
        return false;
    }

    function isCompatible($pf)
    {
        return false;
    }

    function isSubpackageOf($p)
    {
        return $p->isSubpackage($this);
    }

    function isSubpackage($p)
    {
        return false;
    }

    function dependsOn($package, $channel)
    {
        if (strtolower($channel) != 'pear.php.net') {
            return false;
        }
        if (!($deps = $this->getDeps())) {
            return false;
        }
        foreach ($deps as $dep) {
            if ($dep['type'] != 'pkg') {
                continue;
            }
            if (strtolower($dep['name']) == strtolower($package)) {
                return true;
            }
        }
        return false;
    }

    function getConfigureOptions()
    {
        if (isset($this->_packageInfo['configure_options'])) {
            return $this->_packageInfo['configure_options'];
        }
        return false;
    }

    function hasConfigureOptions()
    {
        return isset($this->_packageInfo['configure_options']) &&
            count($this->_packageInfo['configure_options']);
    }

    function addConfigureOption($name, $prompt, $default = false)
    {
        $o = array('name' => $name, 'prompt' => $prompt);
        if ($default !== false) {
            $o['default'] = $default;
        }
        if (!isset($this->_packageInfo['configure_options'])) {
            $this->_packageInfo['configure_options'] = array();
        }
        $this->_packageInfo['configure_options'][] = $o;
    }

    function clearConfigureOptions()
    {
        unset($this->_packageInfo['configure_options']);
    }

    function getProvides()
    {
        if (isset($this->_packageInfo['provides'])) {
            return $this->_packageInfo['provides'];
        }
        return false;
    }

    function getProvidesExtension()
    {
        return false;
    }

    function addFile($dir, $file, $attrs)
    {
        $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir);
        if ($dir == '/' || $dir == '') {
            $dir = '';
        } else {
            $dir .= '/';
        }
        $file = $dir . $file;
        $file = preg_replace('![\\/]+!', '/', $file);
        $this->_packageInfo['filelist'][$file] = $attrs;
    }

    function getInstallationFilelist()
    {
        return $this->getFilelist();
    }

    function getFilelist()
    {
        if (isset($this->_packageInfo['filelist'])) {
            return $this->_packageInfo['filelist'];
        }
        return false;
    }

    function setFileAttribute($file, $attr, $value)
    {
        $this->_packageInfo['filelist'][$file][$attr] = $value;
    }

    function resetFilelist()
    {
        $this->_packageInfo['filelist'] = array();
    }

    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts;
        }
    }

    function getChangelog()
    {
        if (isset($this->_packageInfo['changelog'])) {
            return $this->_packageInfo['changelog'];
        }
        return false;
    }

    function getPackagexmlVersion()
    {
        return '1.0';
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getValidationWarnings($purge = true)
    {
        return $this->_stack->getErrors($purge);
    }

    // }}}
    /**
     * Validation error.  Also marks the object contents as invalid
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateError($code, $params = array())
    {
        $this->_stack->push($code, 'error', $params, false, false, debug_backtrace());
        $this->_isValid = false;
    }

    /**
     * Validation warning.  Does not mark the object contents invalid.
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateWarning($code, $params = array())
    {
        $this->_stack->push($code, 'warning', $params, false, false, debug_backtrace());
    }

    /**
     * @param integer error code
     * @access protected
     */
    function _getErrorMessage()
    {
        return array(
                PEAR_PACKAGEFILE_ERROR_NO_NAME =>
                    'Missing Package Name',
                PEAR_PACKAGEFILE_ERROR_NO_SUMMARY =>
                    'No summary found',
                PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY =>
                    'Summary should be on one line',
                PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION =>
                    'Missing description',
                PEAR_PACKAGEFILE_ERROR_NO_LICENSE =>
                    'Missing license',
                PEAR_PACKAGEFILE_ERROR_NO_VERSION =>
                    'No release version found',
                PEAR_PACKAGEFILE_ERROR_NO_STATE =>
                    'No release state found',
                PEAR_PACKAGEFILE_ERROR_NO_DATE =>
                    'No release date found',
                PEAR_PACKAGEFILE_ERROR_NO_NOTES =>
                    'No release notes found',
                PEAR_PACKAGEFILE_ERROR_NO_LEAD =>
                    'Package must have at least one lead maintainer',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS =>
                    'No maintainers found, at least one must be defined',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE =>
                    'Maintainer %index% has no handle (user ID at channel server)',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE =>
                    'Maintainer %index% has no role',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME =>
                    'Maintainer %index% has no name',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL =>
                    'Maintainer %index% has no email',
                PEAR_PACKAGEFILE_ERROR_NO_DEPNAME =>
                    'Dependency %index% is not a php dependency, and has no name',
                PEAR_PACKAGEFILE_ERROR_NO_DEPREL =>
                    'Dependency %index% has no relation (rel)',
                PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE =>
                    'Dependency %index% has no type',
                PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED =>
                    'PHP Dependency %index% has a name attribute of "%name%" which will be' .
                        ' ignored!',
                PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION =>
                    'Dependency %index% is not a rel="has" or rel="not" dependency, ' .
                        'and has no version',
                PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION =>
                    'Dependency %index% is a type="php" dependency, ' .
                        'and has no version',
                PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED =>
                    'Dependency %index% is a rel="%rel%" dependency, versioning is ignored',
                PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL =>
                    'Dependency %index% has invalid optional value "%opt%", should be yes or no',
                PEAR_PACKAGEFILE_PHP_NO_NOT =>
                    'Dependency %index%: php dependencies cannot use "not" rel, use "ne"' .
                        ' to exclude specific versions',
                PEAR_PACKAGEFILE_ERROR_NO_CONFNAME =>
                    'Configure Option %index% has no name',
                PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT =>
                    'Configure Option %index% has no prompt',
                PEAR_PACKAGEFILE_ERROR_NO_FILES =>
                    'No files in <filelist> section of package.xml',
                PEAR_PACKAGEFILE_ERROR_NO_FILEROLE =>
                    'File "%file%" has no role, expecting one of "%roles%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE =>
                    'File "%file%" has invalid role "%role%", expecting one of "%roles%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME =>
                    'File "%file%" cannot start with ".", cannot package or install',
                PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE =>
                    'Parser error: invalid PHP found in file "%file%"',
                PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX =>
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILE =>
                    'Parser error: invalid PHP file "%file%"',
                PEAR_PACKAGEFILE_ERROR_CHANNELVAL =>
                    'Channel validator error: field "%field%" - %reason%',
                PEAR_PACKAGEFILE_ERROR_PHP5 =>
                    'Error, PHP5 token encountered in %file%, analysis should be in PHP5',
                PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND =>
                    'File "%file%" in package.xml does not exist',
                PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS =>
                    'Package.xml contains non-ISO-8859-1 characters, and may not validate',
            );
    }

    /**
     * Validate XML package definition file.
     *
     * @access public
     * @return boolean
     */
    function validate($state = PEAR_VALIDATE_NORMAL, $nofilechecking = false)
    {
        if (($this->_isValid & $state) == $state) {
            return true;
        }
        $this->_isValid = true;
        $info = $this->_packageInfo;
        if (empty($info['package'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NAME);
            $this->_packageName = $pn = 'unknown';
        } else {
            $this->_packageName = $pn = $info['package'];
        }

        if (empty($info['summary'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_SUMMARY);
        } elseif (strpos(trim($info['summary']), "\n") !== false) {
            $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $info['summary']));
        }
        if (empty($info['description'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION);
        }
        if (empty($info['release_license'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LICENSE);
        }
        if (empty($info['version'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_VERSION);
        }
        if (empty($info['release_state'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_STATE);
        }
        if (empty($info['release_date'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DATE);
        }
        if (empty($info['release_notes'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NOTES);
        }
        if (empty($info['maintainers'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS);
        } else {
            $haslead = false;
            $i = 1;
            foreach ($info['maintainers'] as $m) {
                if (empty($m['handle'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE,
                        array('index' => $i));
                }
                if (empty($m['role'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE,
                        array('index' => $i, 'roles' => PEAR_Common::getUserRoles()));
                } elseif ($m['role'] == 'lead') {
                    $haslead = true;
                }
                if (empty($m['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME,
                        array('index' => $i));
                }
                if (empty($m['email'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL,
                        array('index' => $i));
                }
                $i++;
            }
            if (!$haslead) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LEAD);
            }
        }
        if (!empty($info['release_deps'])) {
            $i = 1;
            foreach ($info['release_deps'] as $d) {
                if (!isset($d['type']) || empty($d['type'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE,
                        array('index' => $i, 'types' => PEAR_Common::getDependencyTypes()));
                    continue;
                }
                if (!isset($d['rel']) || empty($d['rel'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPREL,
                        array('index' => $i, 'rels' => PEAR_Common::getDependencyRelations()));
                    continue;
                }
                if (!empty($d['optional'])) {
                    if (!in_array($d['optional'], array('yes', 'no'))) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL,
                            array('index' => $i, 'opt' => $d['optional']));
                    }
                }
                if ($d['rel'] != 'has' && $d['rel'] != 'not' && empty($d['version'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION,
                        array('index' => $i));
                } elseif (($d['rel'] == 'has' || $d['rel'] == 'not') && !empty($d['version'])) {
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED,
                        array('index' => $i, 'rel' => $d['rel']));
                }
                if ($d['type'] == 'php' && !empty($d['name'])) {
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED,
                        array('index' => $i, 'name' => $d['name']));
                } elseif ($d['type'] != 'php' && empty($d['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPNAME,
                        array('index' => $i));
                }
                if ($d['type'] == 'php' && empty($d['version'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION,
                        array('index' => $i));
                }
                if (($d['rel'] == 'not') && ($d['type'] == 'php')) {
                    $this->_validateError(PEAR_PACKAGEFILE_PHP_NO_NOT,
                        array('index' => $i));
                }
                $i++;
            }
        }
        if (!empty($info['configure_options'])) {
            $i = 1;
            foreach ($info['configure_options'] as $c) {
                if (empty($c['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFNAME,
                        array('index' => $i));
                }
                if (empty($c['prompt'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT,
                        array('index' => $i));
                }
                $i++;
            }
        }
        if (empty($info['filelist'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILES);
            $errors[] = 'no files';
        } else {
            foreach ($info['filelist'] as $file => $fa) {
                if (empty($fa['role'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILEROLE,
                        array('file' => $file, 'roles' => PEAR_Common::getFileRoles()));
                    continue;
                } elseif (!in_array($fa['role'], PEAR_Common::getFileRoles())) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE,
                        array('file' => $file, 'role' => $fa['role'], 'roles' => PEAR_Common::getFileRoles()));
                }
                if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', str_replace('\\', '/', $file))) {
                    // file contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file));
                }
                if (isset($fa['install-as']) &&
                      preg_match('~/\.\.?(/|\\z)|^\.\.?/~', 
                                 str_replace('\\', '/', $fa['install-as']))) {
                    // install-as contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file . ' [installed as ' . $fa['install-as'] . ']'));
                }
                if (isset($fa['baseinstalldir']) &&
                      preg_match('~/\.\.?(/|\\z)|^\.\.?/~', 
                                 str_replace('\\', '/', $fa['baseinstalldir']))) {
                    // install-as contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file . ' [baseinstalldir ' . $fa['baseinstalldir'] . ']'));
                }
            }
        }
        if (isset($this->_registry) && $this->_isValid) {
            $chan = $this->_registry->getChannel('pear.php.net');
            if (PEAR::isError($chan)) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $chan->getMessage());
                return $this->_isValid = 0;
            }
            $validator = $chan->getValidationObject();
            $validator->setPackageFile($this);
            $validator->validate($state);
            $failures = $validator->getFailures();
            foreach ($failures['errors'] as $error) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $error);
            }
            foreach ($failures['warnings'] as $warning) {
                $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $warning);
            }
        }
        if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$nofilechecking) {
            if ($this->_analyzePhpFiles()) {
                $this->_isValid = true;
            }
        }
        if ($this->_isValid) {
            return $this->_isValid = $state;
        }
        return $this->_isValid = 0;
    }

    function _analyzePhpFiles()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!isset($this->_packageFile)) {
            return false;
        }
        $dir_prefix = dirname($this->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_logger) ? array(&$this->_logger, 'log') :
            array($common, 'log');
        $info = $this->getFilelist();
        foreach ($info as $file => $fa) {
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND,
                    array('file' => realpath($dir_prefix) . DIRECTORY_SEPARATOR . $file));
                continue;
            }
            if ($fa['role'] == 'php' && $dir_prefix) {
                call_user_func_array($log, array(1, "Analyzing $file"));
                $srcinfo = $this->_analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file);
                if ($srcinfo) {
                    $this->_buildProvidesArray($srcinfo);
                }
            }
        }
        $this->_packageName = $pn = $this->getPackage();
        $pnl = strlen($pn);
        if (isset($this->_packageInfo['provides'])) {
            foreach ((array) $this->_packageInfo['provides'] as $key => $what) {
                if (isset($what['explicit'])) {
                    // skip conformance checks if the provides entry is
                    // specified in the package.xml file
                    continue;
                }
                extract($what);
                if ($type == 'class') {
                    if (!strncasecmp($name, $pn, $pnl)) {
                        continue;
                    }
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX,
                        array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
                } elseif ($type == 'function') {
                    if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
                        continue;
                    }
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX,
                        array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
                }
            }
        }
        return $this->_isValid;
    }

    /**
     * Get the default xml generator object
     *
     * @return PEAR_PackageFile_Generator_v1
     */
    function &getDefaultGenerator()
    {
        if (!class_exists('PEAR_PackageFile_Generator_v1')) {
            require_once 'PEAR/PackageFile/Generator/v1.php';
        }
        $a = new PEAR_PackageFile_Generator_v1($this);
        return $a;
    }

    /**
     * Get the contents of a file listed within the package.xml
     * @param string
     * @return string
     */
    function getFileContents($file)
    {
        if ($this->_archiveFile == $this->_packageFile) { // unpacked
            $dir = dirname($this->_packageFile);
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            $file = str_replace(array('/', '\\'),
                array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
            if (file_exists($file) && is_readable($file)) {
                return implode('', file($file));
            }
        } else { // tgz
            if (!class_exists('Archive_Tar')) {
                require_once 'Archive/Tar.php';
            }
            $tar = new Archive_Tar($this->_archiveFile);
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($file != 'package.xml' && $file != 'package2.xml') {
                $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file;
            }
            $file = $tar->extractInString($file);
            $tar->popErrorHandling();
            if (PEAR::isError($file)) {
                return PEAR::raiseError("Cannot locate file '$file' in archive");
            }
            return $file;
        }
    }

    // {{{ analyzeSourceCode()
    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @return mixed
     * @access private
     */
    function _analyzeSourceCode($file)
    {
        if (!function_exists("token_get_all")) {
            return false;
        }
        if (!defined('T_DOC_COMMENT')) {
            define('T_DOC_COMMENT', T_COMMENT);
        }
        if (!defined('T_INTERFACE')) {
            define('T_INTERFACE', -1);
        }
        if (!defined('T_IMPLEMENTS')) {
            define('T_IMPLEMENTS', -1);
        }
        if (!$fp = @fopen($file, "r")) {
            return false;
        }
        fclose($fp);
        $contents = file_get_contents($file);
        $tokens = token_get_all($contents);
/*
        for ($i = 0; $i < sizeof($tokens); $i++) {
            @list($token, $data) = $tokens[$i];
            if (is_string($token)) {
                var_dump($token);
            } else {
                print token_name($token) . ' ';
                var_dump(rtrim($data));
            }
        }
*/
        $look_for = 0;
        $paren_level = 0;
        $bracket_level = 0;
        $brace_level = 0;
        $lastphpdoc = '';
        $current_class = '';
        $current_interface = '';
        $current_class_level = -1;
        $current_function = '';
        $current_function_level = -1;
        $declared_classes = array();
        $declared_interfaces = array();
        $declared_functions = array();
        $declared_methods = array();
        $used_classes = array();
        $used_functions = array();
        $extends = array();
        $implements = array();
        $nodeps = array();
        $inquote = false;
        $interface = false;
        for ($i = 0; $i < sizeof($tokens); $i++) {
            if (is_array($tokens[$i])) {
                list($token, $data) = $tokens[$i];
            } else {
                $token = $tokens[$i];
                $data = '';
            }
            if ($inquote) {
                if ($token != '"' && $token != T_END_HEREDOC) {
                    continue;
                } else {
                    $inquote = false;
                    continue;
                }
            }
            switch ($token) {
                case T_WHITESPACE:
                    break;
                case ';':
                    if ($interface) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    break;
                case '"':
                case T_START_HEREDOC:
                    $inquote = true;
                    break;
                case T_CURLY_OPEN:
                case T_DOLLAR_OPEN_CURLY_BRACES:
                case '{': $brace_level++; continue 2;
                case '}':
                    $brace_level--;
                    if ($current_class_level == $brace_level) {
                        $current_class = '';
                        $current_class_level = -1;
                    }
                    if ($current_function_level == $brace_level) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    continue 2;
                case '[': $bracket_level++; continue 2;
                case ']': $bracket_level--; continue 2;
                case '(': $paren_level++;   continue 2;
                case ')': $paren_level--;   continue 2;
                case T_INTERFACE:
                    $interface = true;
                case T_CLASS:
                    if (($current_class_level != -1) || ($current_function_level != -1)) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE,
                            array('file' => $file));
                        return false;
                    }
                case T_FUNCTION:
                case T_NEW:
                case T_EXTENDS:
                case T_IMPLEMENTS:
                    $look_for = $token;
                    continue 2;
                case T_STRING:
                    if ($look_for == T_CLASS) {
                        $current_class = $data;
                        $current_class_level = $brace_level;
                        $declared_classes[] = $current_class;
                    } elseif ($look_for == T_INTERFACE) {
                        $current_interface = $data;
                        $current_class_level = $brace_level;
                        $declared_interfaces[] = $current_interface;
                    } elseif ($look_for == T_IMPLEMENTS) {
                        $implements[$current_class] = $data;
                    } elseif ($look_for == T_EXTENDS) {
                        $extends[$current_class] = $data;
                    } elseif ($look_for == T_FUNCTION) {
                        if ($current_class) {
                            $current_function = "$current_class::$data";
                            $declared_methods[$current_class][] = $data;
                        } elseif ($current_interface) {
                            $current_function = "$current_interface::$data";
                            $declared_methods[$current_interface][] = $data;
                        } else {
                            $current_function = $data;
                            $declared_functions[] = $current_function;
                        }
                        $current_function_level = $brace_level;
                        $m = array();
                    } elseif ($look_for == T_NEW) {
                        $used_classes[$data] = true;
                    }
                    $look_for = 0;
                    continue 2;
                case T_VARIABLE:
                    $look_for = 0;
                    continue 2;
                case T_DOC_COMMENT:
                case T_COMMENT:
                    if (preg_match('!^/\*\*\s!', $data)) {
                        $lastphpdoc = $data;
                        if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) {
                            $nodeps = array_merge($nodeps, $m[1]);
                        }
                    }
                    continue 2;
                case T_DOUBLE_COLON:
                    if (!($tokens[$i - 1][0] == T_WHITESPACE || $tokens[$i - 1][0] == T_STRING)) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE,
                            array('file' => $file));
                        return false;
                    }
                    $class = $tokens[$i - 1][1];
                    if (strtolower($class) != 'parent') {
                        $used_classes[$class] = true;
                    }
                    continue 2;
            }
        }
        return array(
            "source_file" => $file,
            "declared_classes" => $declared_classes,
            "declared_interfaces" => $declared_interfaces,
            "declared_methods" => $declared_methods,
            "declared_functions" => $declared_functions,
            "used_classes" => array_diff(array_keys($used_classes), $nodeps),
            "inheritance" => $extends,
            "implements" => $implements,
            );
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access private
     *
     */
    function _buildProvidesArray($srcinfo)
    {
        if (!$this->_isValid) {
            return false;
        }
        $file = basename($srcinfo['source_file']);
        $pn = $this->getPackage();
        $pnl = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($this->_packageInfo['provides'][$key])) {
                continue;
            }
            $this->_packageInfo['provides'][$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $this->_packageInfo['provides'][$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }
        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($this->_packageInfo['provides'][$key])) {
                    continue;
                }
                $this->_packageInfo['provides'][$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($this->_packageInfo['provides'][$key])) {
                continue;
            }
            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }
            $this->_packageInfo['provides'][$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }
    }

    // }}}
}
?>
pear/PEAR/PackageFile/Parser/v1.php000064400000040207151732710130012653 0ustar00<?php
/**
 * package.xml parsing class, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * package.xml abstraction class
 */
require_once 'PEAR/PackageFile/v1.php';
/**
 * Parser for package.xml version 1.0
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: @PEAR-VER@
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Parser_v1
{
    var $_registry;
    var $_config;
    var $_logger;
    /**
     * BC hack to allow PEAR_Common::infoFromString() to sort of
     * work with the version 2.0 format - there's no filelist though
     * @param PEAR_PackageFile_v2
     */
    function fromV2($packagefile)
    {
        $info = $packagefile->getArray(true);
        $ret = new PEAR_PackageFile_v1;
        $ret->fromArray($info['old']);
    }

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    /**
     * @param string contents of package.xml file, version 1.0
     * @return bool success of parsing
     */
    function &parse($data, $file, $archive = false)
    {
        if (!extension_loaded('xml')) {
            return PEAR::raiseError('Cannot create xml parser for parsing package.xml, no xml extension');
        }
        $xp = xml_parser_create();
        if (!$xp) {
            $a = &PEAR::raiseError('Cannot create xml parser for parsing package.xml');
            return $a;
        }
        xml_set_object($xp, $this);
        xml_set_element_handler($xp, '_element_start_1_0', '_element_end_1_0');
        xml_set_character_data_handler($xp, '_pkginfo_cdata_1_0');
        xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false);

        $this->element_stack = array();
        $this->_packageInfo = array('provides' => array());
        $this->current_element = false;
        unset($this->dir_install);
        $this->_packageInfo['filelist'] = array();
        $this->filelist =& $this->_packageInfo['filelist'];
        $this->dir_names = array();
        $this->in_changelog = false;
        $this->d_i = 0;
        $this->cdata = '';
        $this->_isValid = true;

        if (!xml_parse($xp, $data, 1)) {
            $code = xml_get_error_code($xp);
            $line = xml_get_current_line_number($xp);
            xml_parser_free($xp);
            $a = PEAR::raiseError(sprintf("XML error: %s at line %d",
                           $str = xml_error_string($code), $line), 2);
            return $a;
        }

        xml_parser_free($xp);

        $pf = new PEAR_PackageFile_v1;
        $pf->setConfig($this->_config);
        if (isset($this->_logger)) {
            $pf->setLogger($this->_logger);
        }
        $pf->setPackagefile($file, $archive);
        $pf->fromArray($this->_packageInfo);
        return $pf;
    }
    // {{{ _unIndent()

    /**
     * Unindent given string
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            } elseif (trim(substr($line, 0, $indent_len))) {
                $data .= ltrim($line);
            }
        }
        return $data;
    }

    // Support for package DTD v1.0:
    // {{{ _element_start_1_0()

    /**
     * XML parser callback for ending elements.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  name of ending element
     *
     * @return void
     *
     * @access private
     */
    function _element_start_1_0($xp, $name, $attribs)
    {
        array_push($this->element_stack, $name);
        $this->current_element = $name;
        $spos = sizeof($this->element_stack) - 2;
        $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : '';
        $this->current_attributes = $attribs;
        $this->cdata = '';
        switch ($name) {
            case 'dir':
                if ($this->in_changelog) {
                    break;
                }
                if (array_key_exists('name', $attribs) && $attribs['name'] != '/') {
                    $attribs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                        $attribs['name']);
                    if (strrpos($attribs['name'], '/') === strlen($attribs['name']) - 1) {
                        $attribs['name'] = substr($attribs['name'], 0,
                            strlen($attribs['name']) - 1);
                    }
                    if (strpos($attribs['name'], '/') === 0) {
                        $attribs['name'] = substr($attribs['name'], 1);
                    }
                    $this->dir_names[] = $attribs['name'];
                }
                if (isset($attribs['baseinstalldir'])) {
                    $this->dir_install = $attribs['baseinstalldir'];
                }
                if (isset($attribs['role'])) {
                    $this->dir_role = $attribs['role'];
                }
                break;
            case 'file':
                if ($this->in_changelog) {
                    break;
                }
                if (isset($attribs['name'])) {
                    $path = '';
                    if (count($this->dir_names)) {
                        foreach ($this->dir_names as $dir) {
                            $path .= $dir . '/';
                        }
                    }
                    $path .= preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                        $attribs['name']);
                    unset($attribs['name']);
                    $this->current_path = $path;
                    $this->filelist[$path] = $attribs;
                    // Set the baseinstalldir only if the file don't have this attrib
                    if (!isset($this->filelist[$path]['baseinstalldir']) &&
                        isset($this->dir_install))
                    {
                        $this->filelist[$path]['baseinstalldir'] = $this->dir_install;
                    }
                    // Set the Role
                    if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
                        $this->filelist[$path]['role'] = $this->dir_role;
                    }
                }
                break;
            case 'replace':
                if (!$this->in_changelog) {
                    $this->filelist[$this->current_path]['replacements'][] = $attribs;
                }
                break;
            case 'maintainers':
                $this->_packageInfo['maintainers'] = array();
                $this->m_i = 0; // maintainers array index
                break;
            case 'maintainer':
                // compatibility check
                if (!isset($this->_packageInfo['maintainers'])) {
                    $this->_packageInfo['maintainers'] = array();
                    $this->m_i = 0;
                }
                $this->_packageInfo['maintainers'][$this->m_i] = array();
                $this->current_maintainer =& $this->_packageInfo['maintainers'][$this->m_i];
                break;
            case 'changelog':
                $this->_packageInfo['changelog'] = array();
                $this->c_i = 0; // changelog array index
                $this->in_changelog = true;
                break;
            case 'release':
                if ($this->in_changelog) {
                    $this->_packageInfo['changelog'][$this->c_i] = array();
                    $this->current_release = &$this->_packageInfo['changelog'][$this->c_i];
                } else {
                    $this->current_release = &$this->_packageInfo;
                }
                break;
            case 'deps':
                if (!$this->in_changelog) {
                    $this->_packageInfo['release_deps'] = array();
                }
                break;
            case 'dep':
                // dependencies array index
                if (!$this->in_changelog) {
                    $this->d_i++;
                    isset($attribs['type']) ? ($attribs['type'] = strtolower($attribs['type'])) : false;
                    $this->_packageInfo['release_deps'][$this->d_i] = $attribs;
                }
                break;
            case 'configureoptions':
                if (!$this->in_changelog) {
                    $this->_packageInfo['configure_options'] = array();
                }
                break;
            case 'configureoption':
                if (!$this->in_changelog) {
                    $this->_packageInfo['configure_options'][] = $attribs;
                }
                break;
            case 'provides':
                if (empty($attribs['type']) || empty($attribs['name'])) {
                    break;
                }
                $attribs['explicit'] = true;
                $this->_packageInfo['provides']["$attribs[type];$attribs[name]"] = $attribs;
                break;
            case 'package' :
                if (isset($attribs['version'])) {
                    $this->_packageInfo['xsdversion'] = trim($attribs['version']);
                } else {
                    $this->_packageInfo['xsdversion'] = '1.0';
                }
                if (isset($attribs['packagerversion'])) {
                    $this->_packageInfo['packagerversion'] = $attribs['packagerversion'];
                }
                break;
        }
    }

    // }}}
    // {{{ _element_end_1_0()

    /**
     * XML parser callback for ending elements.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  name of ending element
     *
     * @return void
     *
     * @access private
     */
    function _element_end_1_0($xp, $name)
    {
        $data = trim($this->cdata);
        switch ($name) {
            case 'name':
                switch ($this->prev_element) {
                    case 'package':
                        $this->_packageInfo['package'] = $data;
                        break;
                    case 'maintainer':
                        $this->current_maintainer['name'] = $data;
                        break;
                }
                break;
            case 'extends' :
                $this->_packageInfo['extends'] = $data;
                break;
            case 'summary':
                $this->_packageInfo['summary'] = $data;
                break;
            case 'description':
                $data = $this->_unIndent($this->cdata);
                $this->_packageInfo['description'] = $data;
                break;
            case 'user':
                $this->current_maintainer['handle'] = $data;
                break;
            case 'email':
                $this->current_maintainer['email'] = $data;
                break;
            case 'role':
                $this->current_maintainer['role'] = $data;
                break;
            case 'version':
                if ($this->in_changelog) {
                    $this->current_release['version'] = $data;
                } else {
                    $this->_packageInfo['version'] = $data;
                }
                break;
            case 'date':
                if ($this->in_changelog) {
                    $this->current_release['release_date'] = $data;
                } else {
                    $this->_packageInfo['release_date'] = $data;
                }
                break;
            case 'notes':
                // try to "de-indent" release notes in case someone
                // has been over-indenting their xml ;-)
                // Trim only on the right side
                $data = rtrim($this->_unIndent($this->cdata));
                if ($this->in_changelog) {
                    $this->current_release['release_notes'] = $data;
                } else {
                    $this->_packageInfo['release_notes'] = $data;
                }
                break;
            case 'warnings':
                if ($this->in_changelog) {
                    $this->current_release['release_warnings'] = $data;
                } else {
                    $this->_packageInfo['release_warnings'] = $data;
                }
                break;
            case 'state':
                if ($this->in_changelog) {
                    $this->current_release['release_state'] = $data;
                } else {
                    $this->_packageInfo['release_state'] = $data;
                }
                break;
            case 'license':
                if ($this->in_changelog) {
                    $this->current_release['release_license'] = $data;
                } else {
                    $this->_packageInfo['release_license'] = $data;
                }
                break;
            case 'dep':
                if ($data && !$this->in_changelog) {
                    $this->_packageInfo['release_deps'][$this->d_i]['name'] = $data;
                }
                break;
            case 'dir':
                if ($this->in_changelog) {
                    break;
                }
                array_pop($this->dir_names);
                break;
            case 'file':
                if ($this->in_changelog) {
                    break;
                }
                if ($data) {
                    $path = '';
                    if (count($this->dir_names)) {
                        foreach ($this->dir_names as $dir) {
                            $path .= $dir . '/';
                        }
                    }
                    $path .= $data;
                    $this->filelist[$path] = $this->current_attributes;
                    // Set the baseinstalldir only if the file don't have this attrib
                    if (!isset($this->filelist[$path]['baseinstalldir']) &&
                        isset($this->dir_install))
                    {
                        $this->filelist[$path]['baseinstalldir'] = $this->dir_install;
                    }
                    // Set the Role
                    if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
                        $this->filelist[$path]['role'] = $this->dir_role;
                    }
                }
                break;
            case 'maintainer':
                if (empty($this->_packageInfo['maintainers'][$this->m_i]['role'])) {
                    $this->_packageInfo['maintainers'][$this->m_i]['role'] = 'lead';
                }
                $this->m_i++;
                break;
            case 'release':
                if ($this->in_changelog) {
                    $this->c_i++;
                }
                break;
            case 'changelog':
                $this->in_changelog = false;
                break;
        }
        array_pop($this->element_stack);
        $spos = sizeof($this->element_stack) - 1;
        $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : '';
        $this->cdata = '';
    }

    // }}}
    // {{{ _pkginfo_cdata_1_0()

    /**
     * XML parser callback for character data.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  character data
     *
     * @return void
     *
     * @access private
     */
    function _pkginfo_cdata_1_0($xp, $data)
    {
        if (isset($this->cdata)) {
            $this->cdata .= $data;
        }
    }

    // }}}
}
?>pear/PEAR/PackageFile/Parser/v2.php000064400000006110151732710130012647 0ustar00<?php
/**
 * package.xml parsing class, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * base xml parser class
 */
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/PackageFile/v2.php';
/**
 * Parser for package.xml version 2.0
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: @PEAR-VER@
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Parser_v2 extends PEAR_XMLParser
{
    var $_config;
    var $_logger;
    var $_registry;

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }
    /**
     * Unindent given string
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            } else {
                $data .= $line . "\n";
            }
        }
        return $data;
    }

    /**
     * post-process data
     *
     * @param string $data
     * @param string $element element name
     */
    function postProcess($data, $element)
    {
        if ($element == 'notes') {
            return trim($this->_unIndent($data));
        }
        return trim($data);
    }

    /**
     * @param string
     * @param string file name of the package.xml
     * @param string|false name of the archive this package.xml came from, if any
     * @param string class name to instantiate and return.  This must be PEAR_PackageFile_v2 or
     *               a subclass
     * @return PEAR_PackageFile_v2
     */
    function parse($data, $file = null, $archive = false, $class = 'PEAR_PackageFile_v2')
    {
        if (PEAR::isError($err = parent::parse($data))) {
            return $err;
        }

        $ret = new $class;
        $ret->encoding = $this->encoding;
        $ret->setConfig($this->_config);
        if (isset($this->_logger)) {
            $ret->setLogger($this->_logger);
        }

        $ret->fromArray($this->_unserializedData);
        $ret->setPackagefile($file, $archive);
        return $ret;
    }
}pear/PEAR/PackageFile/Generator/v1.php000064400000142261151732710130013350 0ustar00<?php
/**
 * package.xml generation class, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * needed for PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';
require_once 'System.php';
require_once 'PEAR/PackageFile/v2.php';
/**
 * This class converts a PEAR_PackageFile_v1 object into any output format.
 *
 * Supported output formats include array, XML string, and a PEAR_PackageFile_v2
 * object, for converting package.xml 1.0 into package.xml 2.0 with no sweat.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Generator_v1
{
    /**
     * @var PEAR_PackageFile_v1
     */
    var $_packagefile;
    function __construct(&$packagefile)
    {
        $this->_packagefile = &$packagefile;
    }

    function getPackagerVersion()
    {
        return '1.10.16';
    }

    /**
     * @param PEAR_Packager
     * @param bool if true, a .tgz is written, otherwise a .tar is written
     * @param string|null directory in which to save the .tgz
     * @return string|PEAR_Error location of package or error object
     */
    function toTgz(&$packager, $compress = true, $where = null)
    {
        require_once 'Archive/Tar.php';
        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: "' . $where . '" could' .
                ' not be created');
        }
        if (file_exists($where . DIRECTORY_SEPARATOR . 'package.xml') &&
              !is_file($where . DIRECTORY_SEPARATOR . 'package.xml')) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: unable to save package.xml as' .
                ' "' . $where . DIRECTORY_SEPARATOR . 'package.xml"');
        }
        if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: invalid package file');
        }
        $pkginfo = $this->_packagefile->getArray();
        $ext = $compress ? '.tgz' : '.tar';
        $pkgver = $pkginfo['package'] . '-' . $pkginfo['version'];
        $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
        if (file_exists(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext) &&
              !is_file(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: cannot create tgz file "' .
                getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext . '"');
        }
        if ($pkgfile = $this->_packagefile->getPackageFile()) {
            $pkgdir = dirname(realpath($pkgfile));
            $pkgfile = basename($pkgfile);
        } else {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: package file object must ' .
                'be created from a real file');
        }
        // {{{ Create the package file list
        $filelist = array();
        $i = 0;

        foreach ($this->_packagefile->getFilelist() as $fname => $atts) {
            $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
            if (!file_exists($file)) {
                return PEAR::raiseError("File does not exist: $fname");
            } else {
                $filelist[$i++] = $file;
                if (!isset($atts['md5sum'])) {
                    $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($file));
                }
                $packager->log(2, "Adding file $fname");
            }
        }
        // }}}
        $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
        if ($packagexml) {
            $tar = new Archive_Tar($dest_package, $compress);
            $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
            // ----- Creates with the package.xml file
            $ok = $tar->createModify(array($packagexml), '', $where);
            if (PEAR::isError($ok)) {
                return $ok;
            } elseif (!$ok) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed');
            }
            // ----- Add the content of the package
            if (!$tar->addModify($filelist, $pkgver, $pkgdir)) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed');
            }
            return $dest_package;
        }
    }

    /**
     * @param string|null directory to place the package.xml in, or null for a temporary dir
     * @param int one of the PEAR_VALIDATE_* constants
     * @param string name of the generated file
     * @param bool if true, then no analysis will be performed on role="php" files
     * @return string|PEAR_Error path to the created file on success
     */
    function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml',
                           $nofilechecking = false)
    {
        if (!$this->_packagefile->validate($state, $nofilechecking)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: invalid package.xml',
                null, null, null, $this->_packagefile->getValidationWarnings());
        }
        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: "' . $where . '" could' .
                ' not be created');
        }
        $newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
        $np = @fopen($newpkgfile, 'wb');
        if (!$np) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: unable to save ' .
               "$name as $newpkgfile");
        }
        fwrite($np, $this->toXml($state, true));
        fclose($np);
        return $newpkgfile;
    }

    /**
     * fix both XML encoding to be UTF8, and replace standard XML entities < > " & '
     *
     * @param string $string
     * @return string
     * @access private
     */
    function _fixXmlEncoding($string)
    {
        return strtr($string, array(
                                          '&'  => '&amp;',
                                          '>'  => '&gt;',
                                          '<'  => '&lt;',
                                          '"'  => '&quot;',
                                          '\'' => '&apos;' ));
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @return string XML data
     */
    function toXml($state = PEAR_VALIDATE_NORMAL, $nofilevalidation = false)
    {
        $this->_packagefile->setDate(date('Y-m-d'));
        if (!$this->_packagefile->validate($state, $nofilevalidation)) {
            return false;
        }
        $pkginfo = $this->_packagefile->getArray();
        static $maint_map = array(
            "handle" => "user",
            "name" => "name",
            "email" => "email",
            "role" => "role",
            );
        $ret = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
        $ret .= "<!DOCTYPE package SYSTEM \"http://pear.php.net/dtd/package-1.0\">\n";
        $ret .= "<package version=\"1.0\" packagerversion=\"1.10.16\">\n" .
" <name>$pkginfo[package]</name>";
        if (isset($pkginfo['extends'])) {
            $ret .= "\n<extends>$pkginfo[extends]</extends>";
        }
        $ret .=
 "\n <summary>".$this->_fixXmlEncoding($pkginfo['summary'])."</summary>\n" .
" <description>".trim($this->_fixXmlEncoding($pkginfo['description']))."\n </description>\n" .
" <maintainers>\n";
        foreach ($pkginfo['maintainers'] as $maint) {
            $ret .= "  <maintainer>\n";
            foreach ($maint_map as $idx => $elm) {
                $ret .= "   <$elm>";
                $ret .= $this->_fixXmlEncoding($maint[$idx]);
                $ret .= "</$elm>\n";
            }
            $ret .= "  </maintainer>\n";
        }
        $ret .= "  </maintainers>\n";
        $ret .= $this->_makeReleaseXml($pkginfo, false, $state);
        if (isset($pkginfo['changelog']) && count($pkginfo['changelog']) > 0) {
            $ret .= " <changelog>\n";
            foreach ($pkginfo['changelog'] as $oldrelease) {
                $ret .= $this->_makeReleaseXml($oldrelease, true);
            }
            $ret .= " </changelog>\n";
        }
        $ret .= "</package>\n";
        return $ret;
    }

    // }}}
    // {{{ _makeReleaseXml()

    /**
     * Generate part of an XML description with release information.
     *
     * @param array  $pkginfo    array with release information
     * @param bool   $changelog  whether the result will be in a changelog element
     *
     * @return string XML data
     *
     * @access private
     */
    function _makeReleaseXml($pkginfo, $changelog = false, $state = PEAR_VALIDATE_NORMAL)
    {
        // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!!
        $indent = $changelog ? "  " : "";
        $ret = "$indent <release>\n";
        if (!empty($pkginfo['version'])) {
            $ret .= "$indent  <version>$pkginfo[version]</version>\n";
        }
        if (!empty($pkginfo['release_date'])) {
            $ret .= "$indent  <date>$pkginfo[release_date]</date>\n";
        }
        if (!empty($pkginfo['release_license'])) {
            $ret .= "$indent  <license>$pkginfo[release_license]</license>\n";
        }
        if (!empty($pkginfo['release_state'])) {
            $ret .= "$indent  <state>$pkginfo[release_state]</state>\n";
        }
        if (!empty($pkginfo['release_notes'])) {
            $ret .= "$indent  <notes>".trim($this->_fixXmlEncoding($pkginfo['release_notes']))
            ."\n$indent  </notes>\n";
        }
        if (!empty($pkginfo['release_warnings'])) {
            $ret .= "$indent  <warnings>".$this->_fixXmlEncoding($pkginfo['release_warnings'])."</warnings>\n";
        }
        if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) {
            $ret .= "$indent  <deps>\n";
            foreach ($pkginfo['release_deps'] as $dep) {
                $ret .= "$indent   <dep type=\"$dep[type]\" rel=\"$dep[rel]\"";
                if (isset($dep['version'])) {
                    $ret .= " version=\"$dep[version]\"";
                }
                if (isset($dep['optional'])) {
                    $ret .= " optional=\"$dep[optional]\"";
                }
                if (isset($dep['name'])) {
                    $ret .= ">$dep[name]</dep>\n";
                } else {
                    $ret .= "/>\n";
                }
            }
            $ret .= "$indent  </deps>\n";
        }
        if (isset($pkginfo['configure_options'])) {
            $ret .= "$indent  <configureoptions>\n";
            foreach ($pkginfo['configure_options'] as $c) {
                $ret .= "$indent   <configureoption name=\"".
                    $this->_fixXmlEncoding($c['name']) . "\"";
                if (isset($c['default'])) {
                    $ret .= " default=\"" . $this->_fixXmlEncoding($c['default']) . "\"";
                }
                $ret .= " prompt=\"" . $this->_fixXmlEncoding($c['prompt']) . "\"";
                $ret .= "/>\n";
            }
            $ret .= "$indent  </configureoptions>\n";
        }
        if (isset($pkginfo['provides'])) {
            foreach ($pkginfo['provides'] as $key => $what) {
                $ret .= "$indent  <provides type=\"$what[type]\" ";
                $ret .= "name=\"$what[name]\" ";
                if (isset($what['extends'])) {
                    $ret .= "extends=\"$what[extends]\" ";
                }
                $ret .= "/>\n";
            }
        }
        if (isset($pkginfo['filelist'])) {
            $ret .= "$indent  <filelist>\n";
            if ($state ^ PEAR_VALIDATE_PACKAGING) {
                $ret .= $this->recursiveXmlFilelist($pkginfo['filelist']);
            } else {
                foreach ($pkginfo['filelist'] as $file => $fa) {
                    if (!isset($fa['role'])) {
                        $fa['role'] = '';
                    }
                    $ret .= "$indent   <file role=\"$fa[role]\"";
                    if (isset($fa['baseinstalldir'])) {
                        $ret .= ' baseinstalldir="' .
                            $this->_fixXmlEncoding($fa['baseinstalldir']) . '"';
                    }
                    if (isset($fa['md5sum'])) {
                        $ret .= " md5sum=\"$fa[md5sum]\"";
                    }
                    if (isset($fa['platform'])) {
                        $ret .= " platform=\"$fa[platform]\"";
                    }
                    if (!empty($fa['install-as'])) {
                        $ret .= ' install-as="' .
                            $this->_fixXmlEncoding($fa['install-as']) . '"';
                    }
                    $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"';
                    if (empty($fa['replacements'])) {
                        $ret .= "/>\n";
                    } else {
                        $ret .= ">\n";
                        foreach ($fa['replacements'] as $r) {
                            $ret .= "$indent    <replace";
                            foreach ($r as $k => $v) {
                                $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"';
                            }
                            $ret .= "/>\n";
                        }
                        $ret .= "$indent   </file>\n";
                    }
                }
            }
            $ret .= "$indent  </filelist>\n";
        }
        $ret .= "$indent </release>\n";
        return $ret;
    }

    /**
     * @param array
     * @access protected
     */
    function recursiveXmlFilelist($list)
    {
        $this->_dirs = array();
        foreach ($list as $file => $attributes) {
            $this->_addDir($this->_dirs, explode('/', dirname($file)), $file, $attributes);
        }
        return $this->_formatDir($this->_dirs);
    }

    /**
     * @param array
     * @param array
     * @param string|null
     * @param array|null
     * @access private
     */
    function _addDir(&$dirs, $dir, $file = null, $attributes = null)
    {
        if ($dir == array() || $dir == array('.')) {
            $dirs['files'][basename($file)] = $attributes;
            return;
        }
        $curdir = array_shift($dir);
        if (!isset($dirs['dirs'][$curdir])) {
            $dirs['dirs'][$curdir] = array();
        }
        $this->_addDir($dirs['dirs'][$curdir], $dir, $file, $attributes);
    }

    /**
     * @param array
     * @param string
     * @param string
     * @access private
     */
    function _formatDir($dirs, $indent = '', $curdir = '')
    {
        $ret = '';
        if (!count($dirs)) {
            return '';
        }
        if (isset($dirs['dirs'])) {
            uksort($dirs['dirs'], 'strnatcasecmp');
            foreach ($dirs['dirs'] as $dir => $contents) {
                $usedir = "$curdir/$dir";
                $ret .= "$indent   <dir name=\"$dir\">\n";
                $ret .= $this->_formatDir($contents, "$indent ", $usedir);
                $ret .= "$indent   </dir> <!-- $usedir -->\n";
            }
        }
        if (isset($dirs['files'])) {
            uksort($dirs['files'], 'strnatcasecmp');
            foreach ($dirs['files'] as $file => $attribs) {
                $ret .= $this->_formatFile($file, $attribs, $indent);
            }
        }
        return $ret;
    }

    /**
     * @param string
     * @param array
     * @param string
     * @access private
     */
    function _formatFile($file, $attributes, $indent)
    {
        $ret = "$indent   <file role=\"$attributes[role]\"";
        if (isset($attributes['baseinstalldir'])) {
            $ret .= ' baseinstalldir="' .
                $this->_fixXmlEncoding($attributes['baseinstalldir']) . '"';
        }
        if (isset($attributes['md5sum'])) {
            $ret .= " md5sum=\"$attributes[md5sum]\"";
        }
        if (isset($attributes['platform'])) {
            $ret .= " platform=\"$attributes[platform]\"";
        }
        if (!empty($attributes['install-as'])) {
            $ret .= ' install-as="' .
                $this->_fixXmlEncoding($attributes['install-as']) . '"';
        }
        $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"';
        if (empty($attributes['replacements'])) {
            $ret .= "/>\n";
        } else {
            $ret .= ">\n";
            foreach ($attributes['replacements'] as $r) {
                $ret .= "$indent    <replace";
                foreach ($r as $k => $v) {
                    $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"';
                }
                $ret .= "/>\n";
            }
            $ret .= "$indent   </file>\n";
        }
        return $ret;
    }

    // {{{ _unIndent()

    /**
     * Unindent given string (?)
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            }
        }
        return $data;
    }

    /**
     * @return array
     */
    function dependenciesToV2()
    {
        $arr = array();
        $this->_convertDependencies2_0($arr);
        return $arr['dependencies'];
    }

    /**
     * Convert a package.xml version 1.0 into version 2.0
     *
     * Note that this does a basic conversion, to allow more advanced
     * features like bundles and multiple releases
     * @param string the classname to instantiate and return.  This must be
     *               PEAR_PackageFile_v2 or a descendant
     * @param boolean if true, only valid, deterministic package.xml 1.0 as defined by the
     *                strictest parameters will be converted
     * @return PEAR_PackageFile_v2|PEAR_Error
     */
    function &toV2($class = 'PEAR_PackageFile_v2', $strict = false)
    {
        if ($strict) {
            if (!$this->_packagefile->validate()) {
                $a = PEAR::raiseError('invalid package.xml version 1.0 cannot be converted' .
                    ' to version 2.0', null, null, null,
                    $this->_packagefile->getValidationWarnings(true));
                return $a;
            }
        }

        $arr = array(
            'attribs' => array(
                             'version' => '2.0',
                             'xmlns' => 'http://pear.php.net/dtd/package-2.0',
                             'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                             'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                             'xsi:schemaLocation' => "http://pear.php.net/dtd/tasks-1.0\n" .
"http://pear.php.net/dtd/tasks-1.0.xsd\n" .
"http://pear.php.net/dtd/package-2.0\n" .
'http://pear.php.net/dtd/package-2.0.xsd',
                         ),
            'name' => $this->_packagefile->getPackage(),
            'channel' => 'pear.php.net',
        );
        $arr['summary'] = $this->_packagefile->getSummary();
        $arr['description'] = $this->_packagefile->getDescription();
        $maintainers = $this->_packagefile->getMaintainers();
        foreach ($maintainers as $maintainer) {
            if ($maintainer['role'] != 'lead') {
                continue;
            }
            $new = array(
                'name' => $maintainer['name'],
                'user' => $maintainer['handle'],
                'email' => $maintainer['email'],
                'active' => 'yes',
            );
            $arr['lead'][] = $new;
        }

        if (!isset($arr['lead'])) { // some people... you know?
            $arr['lead'] = array(
                'name' => 'unknown',
                'user' => 'unknown',
                'email' => 'noleadmaintainer@example.com',
                'active' => 'no',
            );
        }

        if (count($arr['lead']) == 1) {
            $arr['lead'] = $arr['lead'][0];
        }

        foreach ($maintainers as $maintainer) {
            if ($maintainer['role'] == 'lead') {
                continue;
            }
            $new = array(
                'name' => $maintainer['name'],
                'user' => $maintainer['handle'],
                'email' => $maintainer['email'],
                'active' => 'yes',
            );
            $arr[$maintainer['role']][] = $new;
        }

        if (isset($arr['developer']) && count($arr['developer']) == 1) {
            $arr['developer'] = $arr['developer'][0];
        }

        if (isset($arr['contributor']) && count($arr['contributor']) == 1) {
            $arr['contributor'] = $arr['contributor'][0];
        }

        if (isset($arr['helper']) && count($arr['helper']) == 1) {
            $arr['helper'] = $arr['helper'][0];
        }

        $arr['date'] = $this->_packagefile->getDate();
        $arr['version'] =
            array(
                'release' => $this->_packagefile->getVersion(),
                'api' => $this->_packagefile->getVersion(),
            );
        $arr['stability'] =
            array(
                'release' => $this->_packagefile->getState(),
                'api' => $this->_packagefile->getState(),
            );
        $licensemap =
            array(
                'php' => 'http://www.php.net/license',
                'php license' => 'http://www.php.net/license',
                'lgpl' => 'http://www.gnu.org/copyleft/lesser.html',
                'bsd' => 'http://www.opensource.org/licenses/bsd-license.php',
                'bsd style' => 'http://www.opensource.org/licenses/bsd-license.php',
                'bsd-style' => 'http://www.opensource.org/licenses/bsd-license.php',
                'mit' => 'http://www.opensource.org/licenses/mit-license.php',
                'gpl' => 'http://www.gnu.org/copyleft/gpl.html',
                'apache' => 'http://www.opensource.org/licenses/apache2.0.php'
            );

        if (isset($licensemap[strtolower($this->_packagefile->getLicense())])) {
            $arr['license'] = array(
                'attribs' => array('uri' =>
                    $licensemap[strtolower($this->_packagefile->getLicense())]),
                '_content' => $this->_packagefile->getLicense()
                );
        } else {
            // don't use bogus uri
            $arr['license'] = $this->_packagefile->getLicense();
        }

        $arr['notes'] = $this->_packagefile->getNotes();
        $temp = array();
        $arr['contents'] = $this->_convertFilelist2_0($temp);
        $this->_convertDependencies2_0($arr);
        $release = ($this->_packagefile->getConfigureOptions() || $this->_isExtension) ?
            'extsrcrelease' : 'phprelease';
        if ($release == 'extsrcrelease') {
            $arr['channel'] = 'pecl.php.net';
            $arr['providesextension'] = $arr['name']; // assumption
        }

        $arr[$release] = array();
        if ($this->_packagefile->getConfigureOptions()) {
            $arr[$release]['configureoption'] = $this->_packagefile->getConfigureOptions();
            foreach ($arr[$release]['configureoption'] as $i => $opt) {
                $arr[$release]['configureoption'][$i] = array('attribs' => $opt);
            }
            if (count($arr[$release]['configureoption']) == 1) {
                $arr[$release]['configureoption'] = $arr[$release]['configureoption'][0];
            }
        }

        $this->_convertRelease2_0($arr[$release], $temp);
        if ($release == 'extsrcrelease' && count($arr[$release]) > 1) {
            // multiple extsrcrelease tags added in PEAR 1.4.1
            $arr['dependencies']['required']['pearinstaller']['min'] = '1.4.1';
        }

        if ($cl = $this->_packagefile->getChangelog()) {
            foreach ($cl as $release) {
                $rel = array();
                $rel['version'] =
                    array(
                        'release' => $release['version'],
                        'api' => $release['version'],
                    );
                if (!isset($release['release_state'])) {
                    $release['release_state'] = 'stable';
                }

                $rel['stability'] =
                    array(
                        'release' => $release['release_state'],
                        'api' => $release['release_state'],
                    );
                if (isset($release['release_date'])) {
                    $rel['date'] = $release['release_date'];
                } else {
                    $rel['date'] = date('Y-m-d');
                }

                if (isset($release['release_license'])) {
                    if (isset($licensemap[strtolower($release['release_license'])])) {
                        $uri = $licensemap[strtolower($release['release_license'])];
                    } else {
                        $uri = 'http://www.example.com';
                    }
                    $rel['license'] = array(
                            'attribs' => array('uri' => $uri),
                            '_content' => $release['release_license']
                        );
                } else {
                    $rel['license'] = $arr['license'];
                }

                if (!isset($release['release_notes'])) {
                    $release['release_notes'] = 'no release notes';
                }

                $rel['notes'] = $release['release_notes'];
                $arr['changelog']['release'][] = $rel;
            }
        }

        $ret = new $class;
        $ret->setConfig($this->_packagefile->_config);
        if (isset($this->_packagefile->_logger) && is_object($this->_packagefile->_logger)) {
            $ret->setLogger($this->_packagefile->_logger);
        }

        $ret->fromArray($arr);
        return $ret;
    }

    /**
     * @param array
     * @param bool
     * @access private
     */
    function _convertDependencies2_0(&$release, $internal = false)
    {
        $peardep = array('pearinstaller' =>
            array('min' => '1.4.0b1')); // this is a lot safer
        $required = $optional = array();
        $release['dependencies'] = array('required' => array());
        if ($this->_packagefile->hasDeps()) {
            foreach ($this->_packagefile->getDeps() as $dep) {
                if (!isset($dep['optional']) || $dep['optional'] == 'no') {
                    $required[] = $dep;
                } else {
                    $optional[] = $dep;
                }
            }
            foreach (array('required', 'optional') as $arr) {
                $deps = array();
                foreach ($$arr as $dep) {
                    // organize deps by dependency type and name
                    if (!isset($deps[$dep['type']])) {
                        $deps[$dep['type']] = array();
                    }
                    if (isset($dep['name'])) {
                        $deps[$dep['type']][$dep['name']][] = $dep;
                    } else {
                        $deps[$dep['type']][] = $dep;
                    }
                }
                do {
                    if (isset($deps['php'])) {
                        $php = array();
                        if (count($deps['php']) > 1) {
                            $php = $this->_processPhpDeps($deps['php']);
                        } else {
                            if (!isset($deps['php'][0])) {
                                // Buggy versions
                                $key = key($deps['php']);
                                $info = current($deps['php']);
                                $deps['php'] = array($info[0]);
                            }
                            $php = $this->_processDep($deps['php'][0]);
                            if (!$php) {
                                break; // poor mans throw
                            }
                        }
                        $release['dependencies'][$arr]['php'] = $php;
                    }
                } while (false);
                do {
                    if (isset($deps['pkg'])) {
                        $pkg = array();
                        $pkg = $this->_processMultipleDepsName($deps['pkg']);
                        if (!$pkg) {
                            break; // poor mans throw
                        }
                        $release['dependencies'][$arr]['package'] = $pkg;
                    }
                } while (false);
                do {
                    if (isset($deps['ext'])) {
                        $pkg = array();
                        $pkg = $this->_processMultipleDepsName($deps['ext']);
                        $release['dependencies'][$arr]['extension'] = $pkg;
                    }
                } while (false);
                // skip sapi - it's not supported so nobody will have used it
                // skip os - it's not supported in 1.0
            }
        }
        if (isset($release['dependencies']['required'])) {
            $release['dependencies']['required'] =
                array_merge($peardep, $release['dependencies']['required']);
        } else {
            $release['dependencies']['required'] = $peardep;
        }
        if (!isset($release['dependencies']['required']['php'])) {
            $release['dependencies']['required']['php'] =
                array('min' => '4.0.0');
        }
        $order = array();
        $bewm = $release['dependencies']['required'];
        $order['php'] = $bewm['php'];
        $order['pearinstaller'] = $bewm['pearinstaller'];
        isset($bewm['package']) ? $order['package'] = $bewm['package'] :0;
        isset($bewm['extension']) ? $order['extension'] = $bewm['extension'] :0;
        $release['dependencies']['required'] = $order;
    }

    /**
     * @param array
     * @access private
     */
    function _convertFilelist2_0(&$package)
    {
        $ret = array('dir' =>
                    array(
                        'attribs' => array('name' => '/'),
                        'file' => array()
                        )
                    );
        $package['platform'] =
        $package['install-as'] = array();
        $this->_isExtension = false;
        foreach ($this->_packagefile->getFilelist() as $name => $file) {
            $file['name'] = $name;
            if (isset($file['role']) && $file['role'] == 'src') {
                $this->_isExtension = true;
            }
            if (isset($file['replacements'])) {
                $repl = $file['replacements'];
                unset($file['replacements']);
            } else {
                unset($repl);
            }
            if (isset($file['install-as'])) {
                $package['install-as'][$name] = $file['install-as'];
                unset($file['install-as']);
            }
            if (isset($file['platform'])) {
                $package['platform'][$name] = $file['platform'];
                unset($file['platform']);
            }
            $file = array('attribs' => $file);
            if (isset($repl)) {
                foreach ($repl as $replace ) {
                    $file['tasks:replace'][] = array('attribs' => $replace);
                }
                if (count($repl) == 1) {
                    $file['tasks:replace'] = $file['tasks:replace'][0];
                }
            }
            $ret['dir']['file'][] = $file;
        }
        return $ret;
    }

    /**
     * Post-process special files with install-as/platform attributes and
     * make the release tag.
     *
     * This complex method follows this work-flow to create the release tags:
     *
     * <pre>
     * - if any install-as/platform exist, create a generic release and fill it with
     *   o <install as=..> tags for <file name=... install-as=...>
     *   o <install as=..> tags for <file name=... platform=!... install-as=..>
     *   o <ignore> tags for <file name=... platform=...>
     *   o <ignore> tags for <file name=... platform=... install-as=..>
     * - create a release for each platform encountered and fill with
     *   o <install as..> tags for <file name=... install-as=...>
     *   o <install as..> tags for <file name=... platform=this platform install-as=..>
     *   o <install as..> tags for <file name=... platform=!other platform install-as=..>
     *   o <ignore> tags for <file name=... platform=!this platform>
     *   o <ignore> tags for <file name=... platform=other platform>
     *   o <ignore> tags for <file name=... platform=other platform install-as=..>
     *   o <ignore> tags for <file name=... platform=!this platform install-as=..>
     * </pre>
     *
     * It does this by accessing the $package parameter, which contains an array with
     * indices:
     *
     *  - platform: mapping of file => OS the file should be installed on
     *  - install-as: mapping of file => installed name
     *  - osmap: mapping of OS => list of files that should be installed
     *    on that OS
     *  - notosmap: mapping of OS => list of files that should not be
     *    installed on that OS
     *
     * @param array
     * @param array
     * @access private
     */
    function _convertRelease2_0(&$release, $package)
    {
        //- if any install-as/platform exist, create a generic release and fill it with
        if (count($package['platform']) || count($package['install-as'])) {
            $generic = array();
            $genericIgnore = array();
            foreach ($package['install-as'] as $file => $as) {
                //o <install as=..> tags for <file name=... install-as=...>
                if (!isset($package['platform'][$file])) {
                    $generic[] = $file;
                    continue;
                }
                //o <install as=..> tags for <file name=... platform=!... install-as=..>
                if (isset($package['platform'][$file]) &&
                      $package['platform'][$file][0] == '!') {
                    $generic[] = $file;
                    continue;
                }
                //o <ignore> tags for <file name=... platform=... install-as=..>
                if (isset($package['platform'][$file]) &&
                      $package['platform'][$file][0] != '!') {
                    $genericIgnore[] = $file;
                    continue;
                }
            }
            foreach ($package['platform'] as $file => $platform) {
                if (isset($package['install-as'][$file])) {
                    continue;
                }
                if ($platform[0] != '!') {
                    //o <ignore> tags for <file name=... platform=...>
                    $genericIgnore[] = $file;
                }
            }
            if (count($package['platform'])) {
                $oses = $notplatform = $platform = array();
                foreach ($package['platform'] as $file => $os) {
                    // get a list of oses
                    if ($os[0] == '!') {
                        if (isset($oses[substr($os, 1)])) {
                            continue;
                        }
                        $oses[substr($os, 1)] = count($oses);
                    } else {
                        if (isset($oses[$os])) {
                            continue;
                        }
                        $oses[$os] = count($oses);
                    }
                }
                //- create a release for each platform encountered and fill with
                foreach ($oses as $os => $releaseNum) {
                    $release[$releaseNum]['installconditions']['os']['name'] = $os;
                    $release[$releaseNum]['filelist'] = array('install' => array(),
                        'ignore' => array());
                    foreach ($package['install-as'] as $file => $as) {
                        //o <install as=..> tags for <file name=... install-as=...>
                        if (!isset($package['platform'][$file])) {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <install as..> tags for
                        //  <file name=... platform=this platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] == $os) {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <install as..> tags for
                        //  <file name=... platform=!other platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] != "!$os" &&
                              $package['platform'][$file][0] == '!') {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for
                        //  <file name=... platform=!this platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] == "!$os") {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for
                        //  <file name=... platform=other platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file][0] != '!' &&
                              $package['platform'][$file] != $os) {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                    }
                    foreach ($package['platform'] as $file => $platform) {
                        if (isset($package['install-as'][$file])) {
                            continue;
                        }
                        //o <ignore> tags for <file name=... platform=!this platform>
                        if ($platform == "!$os") {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for <file name=... platform=other platform>
                        if ($platform[0] != '!' && $platform != $os) {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                        }
                    }
                    if (!count($release[$releaseNum]['filelist']['install'])) {
                        unset($release[$releaseNum]['filelist']['install']);
                    }
                    if (!count($release[$releaseNum]['filelist']['ignore'])) {
                        unset($release[$releaseNum]['filelist']['ignore']);
                    }
                }
                if (count($generic) || count($genericIgnore)) {
                    $release[count($oses)] = array();
                    if (count($generic)) {
                        foreach ($generic as $file) {
                            if (isset($package['install-as'][$file])) {
                                $installas = $package['install-as'][$file];
                            } else {
                                $installas = $file;
                            }
                            $release[count($oses)]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $installas,
                                    )
                                );
                        }
                    }
                    if (count($genericIgnore)) {
                        foreach ($genericIgnore as $file) {
                            $release[count($oses)]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    )
                                );
                        }
                    }
                }
                // cleanup
                foreach ($release as $i => $rel) {
                    if (isset($rel['filelist']['install']) &&
                          count($rel['filelist']['install']) == 1) {
                        $release[$i]['filelist']['install'] =
                            $release[$i]['filelist']['install'][0];
                    }
                    if (isset($rel['filelist']['ignore']) &&
                          count($rel['filelist']['ignore']) == 1) {
                        $release[$i]['filelist']['ignore'] =
                            $release[$i]['filelist']['ignore'][0];
                    }
                }
                if (count($release) == 1) {
                    $release = $release[0];
                }
            } else {
                // no platform atts, but some install-as atts
                foreach ($package['install-as'] as $file => $value) {
                    $release['filelist']['install'][] =
                        array(
                            'attribs' => array(
                                'name' => $file,
                                'as' => $value
                            )
                        );
                }
                if (count($release['filelist']['install']) == 1) {
                    $release['filelist']['install'] = $release['filelist']['install'][0];
                }
            }
        }
    }

    /**
     * @param array
     * @return array
     * @access private
     */
    function _processDep($dep)
    {
        if ($dep['type'] == 'php') {
            if ($dep['rel'] == 'has') {
                // come on - everyone has php!
                return false;
            }
        }
        $php = array();
        if ($dep['type'] != 'php') {
            $php['name'] = $dep['name'];
            if ($dep['type'] == 'pkg') {
                $php['channel'] = 'pear.php.net';
            }
        }
        switch ($dep['rel']) {
            case 'gt' :
                $php['min'] = $dep['version'];
                $php['exclude'] = $dep['version'];
            break;
            case 'ge' :
                if (!isset($dep['version'])) {
                    if ($dep['type'] == 'php') {
                        if (isset($dep['name'])) {
                            $dep['version'] = $dep['name'];
                        }
                    }
                }
                $php['min'] = $dep['version'];
            break;
            case 'lt' :
                $php['max'] = $dep['version'];
                $php['exclude'] = $dep['version'];
            break;
            case 'le' :
                $php['max'] = $dep['version'];
            break;
            case 'eq' :
                $php['min'] = $dep['version'];
                $php['max'] = $dep['version'];
            break;
            case 'ne' :
                $php['exclude'] = $dep['version'];
            break;
            case 'not' :
                $php['conflicts'] = 'yes';
            break;
        }
        return $php;
    }

    /**
     * @param array
     * @return array
     */
    function _processPhpDeps($deps)
    {
        $test = array();
        foreach ($deps as $dep) {
            $test[] = $this->_processDep($dep);
        }
        $min = array();
        $max = array();
        foreach ($test as $dep) {
            if (!$dep) {
                continue;
            }
            if (isset($dep['min'])) {
                $min[$dep['min']] = count($min);
            }
            if (isset($dep['max'])) {
                $max[$dep['max']] = count($max);
            }
        }
        if (count($min) > 0) {
            uksort($min, 'version_compare');
        }
        if (count($max) > 0) {
            uksort($max, 'version_compare');
        }
        if (count($min)) {
            // get the highest minimum
            $a = array_flip($min);
            $min = array_pop($a);
        } else {
            $min = false;
        }
        if (count($max)) {
            // get the lowest maximum
            $a = array_flip($max);
            $max = array_shift($a);
        } else {
            $max = false;
        }
        if ($min) {
            $php['min'] = $min;
        }
        if ($max) {
            $php['max'] = $max;
        }
        $exclude = array();
        foreach ($test as $dep) {
            if (!isset($dep['exclude'])) {
                continue;
            }
            $exclude[] = $dep['exclude'];
        }
        if (count($exclude)) {
            $php['exclude'] = $exclude;
        }
        return $php;
    }

    /**
     * process multiple dependencies that have a name, like package deps
     * @param array
     * @return array
     * @access private
     */
    function _processMultipleDepsName($deps)
    {
        $ret = $tests = array();
        foreach ($deps as $name => $dep) {
            foreach ($dep as $d) {
                $tests[$name][] = $this->_processDep($d);
            }
        }

        foreach ($tests as $name => $test) {
            $max = $min = $php = array();
            $php['name'] = $name;
            foreach ($test as $dep) {
                if (!$dep) {
                    continue;
                }
                if (isset($dep['channel'])) {
                    $php['channel'] = 'pear.php.net';
                }
                if (isset($dep['conflicts']) && $dep['conflicts'] == 'yes') {
                    $php['conflicts'] = 'yes';
                }
                if (isset($dep['min'])) {
                    $min[$dep['min']] = count($min);
                }
                if (isset($dep['max'])) {
                    $max[$dep['max']] = count($max);
                }
            }
            if (count($min) > 0) {
                uksort($min, 'version_compare');
            }
            if (count($max) > 0) {
                uksort($max, 'version_compare');
            }
            if (count($min)) {
                // get the highest minimum
                $a = array_flip($min);
                $min = array_pop($a);
            } else {
                $min = false;
            }
            if (count($max)) {
                // get the lowest maximum
                $a = array_flip($max);
                $max = array_shift($a);
            } else {
                $max = false;
            }
            if ($min) {
                $php['min'] = $min;
            }
            if ($max) {
                $php['max'] = $max;
            }
            $exclude = array();
            foreach ($test as $dep) {
                if (!isset($dep['exclude'])) {
                    continue;
                }
                $exclude[] = $dep['exclude'];
            }
            if (count($exclude)) {
                $php['exclude'] = $exclude;
            }
            $ret[] = $php;
        }
        return $ret;
    }
}
?>
pear/PEAR/PackageFile/Generator/v2.php000064400000100711151732710130013343 0ustar00<?php
/**
 * package.xml generation class, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Serializer code)
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * file/dir manipulation routines
 */
require_once 'System.php';
require_once 'XML/Util.php';

/**
 * This class converts a PEAR_PackageFile_v2 object into any output format.
 *
 * Supported output formats include array, XML string (using S. Schmidt's
 * XML_Serializer, slightly customized)
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Serializer code)
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Generator_v2
{
   /**
    * default options for the serialization
    * @access private
    * @var array $_defaultOptions
    */
    var $_defaultOptions = array(
        'indent'             => ' ',                    // string used for indentation
        'linebreak'          => "\n",                  // string used for newlines
        'typeHints'          => false,                 // automatically add type hin attributes
        'addDecl'            => true,                 // add an XML declaration
        'defaultTagName'     => 'XML_Serializer_Tag',  // tag used for indexed arrays or invalid names
        'classAsTagName'     => false,                 // use classname for objects in indexed arrays
        'keyAttribute'       => '_originalKey',        // attribute where original key is stored
        'typeAttribute'      => '_type',               // attribute for type (only if typeHints => true)
        'classAttribute'     => '_class',              // attribute for class of objects (only if typeHints => true)
        'scalarAsAttributes' => false,                 // scalar values (strings, ints,..) will be serialized as attribute
        'prependAttributes'  => '',                    // prepend string for attributes
        'indentAttributes'   => false,                 // indent the attributes, if set to '_auto', it will indent attributes so they all start at the same column
        'mode'               => 'simplexml',             // use 'simplexml' to use parent name as tagname if transforming an indexed array
        'addDoctype'         => false,                 // add a doctype declaration
        'doctype'            => null,                  // supply a string or an array with id and uri ({@see XML_Util::getDoctypeDeclaration()}
        'rootName'           => 'package',                  // name of the root tag
        'rootAttributes'     => array(
            'version' => '2.0',
            'xmlns' => 'http://pear.php.net/dtd/package-2.0',
            'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
            'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
            'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd',
        ),               // attributes of the root tag
        'attributesArray'    => 'attribs',                  // all values in this key will be treated as attributes
        'contentName'        => '_content',                   // this value will be used directly as content, instead of creating a new tag, may only be used in conjunction with attributesArray
        'beautifyFilelist'   => false,
        'encoding' => 'UTF-8',
    );

   /**
    * options for the serialization
    * @access private
    * @var array $options
    */
    var $options = array();

   /**
    * current tag depth
    * @var integer $_tagDepth
    */
    var $_tagDepth = 0;

   /**
    * serilialized representation of the data
    * @var string $_serializedData
    */
    var $_serializedData = null;
    /**
     * @var PEAR_PackageFile_v2
     */
    var $_packagefile;
    /**
     * @param PEAR_PackageFile_v2
     */
    function __construct(&$packagefile)
    {
        $this->_packagefile = &$packagefile;
        if (isset($this->_packagefile->encoding)) {
            $this->_defaultOptions['encoding'] = $this->_packagefile->encoding;
        }
    }

    /**
     * @return string
     */
    function getPackagerVersion()
    {
        return '1.10.16';
    }

    /**
     * @param PEAR_Packager
     * @param bool generate a .tgz or a .tar
     * @param string|null temporary directory to package in
     */
    function toTgz(&$packager, $compress = true, $where = null)
    {
        $a = null;
        return $this->toTgz2($packager, $a, $compress, $where);
    }

    /**
     * Package up both a package.xml and package2.xml for the same release
     * @param PEAR_Packager
     * @param PEAR_PackageFile_v1
     * @param bool generate a .tgz or a .tar
     * @param string|null temporary directory to package in
     */
    function toTgz2(&$packager, &$pf1, $compress = true, $where = null)
    {
        require_once 'Archive/Tar.php';
        if (!$this->_packagefile->isEquivalent($pf1)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' .
                basename($pf1->getPackageFile()) .
                '" is not equivalent to "' . basename($this->_packagefile->getPackageFile())
                . '"');
        }

        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' . $where . '" could' .
                ' not be created');
        }

        $file = $where . DIRECTORY_SEPARATOR . 'package.xml';
        if (file_exists($file) && !is_file($file)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: unable to save package.xml as' .
                ' "' . $file  .'"');
        }

        if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: invalid package.xml');
        }

        $ext = $compress ? '.tgz' : '.tar';
        $pkgver = $this->_packagefile->getPackage() . '-' . $this->_packagefile->getVersion();
        $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
        if (file_exists($dest_package) && !is_file($dest_package)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: cannot create tgz file "' .
                $dest_package . '"');
        }

        $pkgfile = $this->_packagefile->getPackageFile();
        if (!$pkgfile) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: package file object must ' .
                'be created from a real file');
        }

        $pkgdir  = dirname(realpath($pkgfile));
        $pkgfile = basename($pkgfile);

        // {{{ Create the package file list
        $filelist = array();
        $i = 0;
        $this->_packagefile->flattenFilelist();
        $contents = $this->_packagefile->getContents();
        if (isset($contents['bundledpackage'])) { // bundles of packages
            $contents = $contents['bundledpackage'];
            if (!isset($contents[0])) {
                $contents = array($contents);
            }

            $packageDir = $where;
            foreach ($contents as $i => $package) {
                $fname = $package;
                $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
                if (!file_exists($file)) {
                    return $packager->raiseError("File does not exist: $fname");
                }

                $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
                System::mkdir(array('-p', dirname($tfile)));
                copy($file, $tfile);
                $filelist[$i++] = $tfile;
                $packager->log(2, "Adding package $fname");
            }
        } else { // normal packages
            $contents = $contents['dir']['file'];
            if (!isset($contents[0])) {
                $contents = array($contents);
            }

            $packageDir = $where;
            foreach ($contents as $i => $file) {
                $fname = $file['attribs']['name'];
                $atts = $file['attribs'];
                $orig = $file;
                $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
                if (!file_exists($file)) {
                    return $packager->raiseError("File does not exist: $fname");
                }

                $origperms = fileperms($file);
                $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
                unset($orig['attribs']);
                if (count($orig)) { // file with tasks
                    // run any package-time tasks
                    $contents = file_get_contents($file);
                    foreach ($orig as $tag => $raw) {
                        $tag = str_replace(
                            array($this->_packagefile->getTasksNs() . ':', '-'),
                            array('', '_'), $tag);
                        $task = "PEAR_Task_$tag";
                        $task = new $task($this->_packagefile->_config,
                            $this->_packagefile->_logger,
                            PEAR_TASK_PACKAGE);
                        $task->init($raw, $atts, null);
                        $res = $task->startSession($this->_packagefile, $contents, $tfile);
                        if (!$res) {
                            continue; // skip this task
                        }

                        if (PEAR::isError($res)) {
                            return $res;
                        }

                        $contents = $res; // save changes
                        System::mkdir(array('-p', dirname($tfile)));
                        $wp = fopen($tfile, "wb");
                        fwrite($wp, $contents);
                        fclose($wp);
                    }
                }

                if (!file_exists($tfile)) {
                    System::mkdir(array('-p', dirname($tfile)));
                    copy($file, $tfile);
                }

                chmod($tfile, $origperms);
                $filelist[$i++] = $tfile;
                $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($tfile), $i - 1);
                $packager->log(2, "Adding file $fname");
            }
        }
            // }}}

        $name       = $pf1 !== null ? 'package2.xml' : 'package.xml';
        $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, $name);
        if ($packagexml) {
            $tar = new Archive_Tar($dest_package, $compress);
            $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
            // ----- Creates with the package.xml file
            $ok = $tar->createModify(array($packagexml), '', $where);
            if (PEAR::isError($ok)) {
                return $packager->raiseError($ok);
            } elseif (!$ok) {
                return $packager->raiseError('PEAR_Packagefile_v2::toTgz(): adding ' . $name .
                    ' failed');
            }

            // ----- Add the content of the package
            if (!$tar->addModify($filelist, $pkgver, $where)) {
                return $packager->raiseError(
                    'PEAR_Packagefile_v2::toTgz(): tarball creation failed');
            }

            // add the package.xml version 1.0
            if ($pf1 !== null) {
                $pfgen = &$pf1->getDefaultGenerator();
                $packagexml1 = $pfgen->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
                if (!$tar->addModify(array($packagexml1), '', $where)) {
                    return $packager->raiseError(
                        'PEAR_Packagefile_v2::toTgz(): adding package.xml failed');
                }
            }

            return $dest_package;
        }
    }

    function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml')
    {
        if (!$this->_packagefile->validate($state)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: invalid package.xml',
                null, null, null, $this->_packagefile->getValidationWarnings());
        }

        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: "' . $where . '" could' .
                ' not be created');
        }

        $newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
        $np = @fopen($newpkgfile, 'wb');
        if (!$np) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: unable to save ' .
               "$name as $newpkgfile");
        }
        fwrite($np, $this->toXml($state));
        fclose($np);
        return $newpkgfile;
    }

    function &toV2()
    {
        return $this->_packagefile;
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @return string XML data
     */
    function toXml($state = PEAR_VALIDATE_NORMAL, $options = array())
    {
        $this->_packagefile->setDate(date('Y-m-d'));
        $this->_packagefile->setTime(date('H:i:s'));
        if (!$this->_packagefile->validate($state)) {
            return false;
        }

        if (is_array($options)) {
            $this->options = array_merge($this->_defaultOptions, $options);
        } else {
            $this->options = $this->_defaultOptions;
        }

        $arr = $this->_packagefile->getArray();
        if (isset($arr['filelist'])) {
            unset($arr['filelist']);
        }

        if (isset($arr['_lastversion'])) {
            unset($arr['_lastversion']);
        }

        // Fix the notes a little bit
        if (isset($arr['notes'])) {
            // This trims out the indenting, needs fixing
            $arr['notes'] = "\n" . trim($arr['notes']) . "\n";
        }

        if (isset($arr['changelog']) && !empty($arr['changelog'])) {
            // Fix for inconsistency how the array is filled depending on the changelog release amount
            if (!isset($arr['changelog']['release'][0])) {
                $release = $arr['changelog']['release'];
                unset($arr['changelog']['release']);

                $arr['changelog']['release']    = array();
                $arr['changelog']['release'][0] = $release;
            }

            foreach (array_keys($arr['changelog']['release']) as $key) {
                $c =& $arr['changelog']['release'][$key];
                if (isset($c['notes'])) {
                    // This trims out the indenting, needs fixing
                    $c['notes'] = "\n" . trim($c['notes']) . "\n";
                }
            }
        }

        if ($state ^ PEAR_VALIDATE_PACKAGING && !isset($arr['bundle'])) {
            $use = $this->_recursiveXmlFilelist($arr['contents']['dir']['file']);
            unset($arr['contents']['dir']['file']);
            if (isset($use['dir'])) {
                $arr['contents']['dir']['dir'] = $use['dir'];
            }
            if (isset($use['file'])) {
                $arr['contents']['dir']['file'] = $use['file'];
            }
            $this->options['beautifyFilelist'] = true;
        }

        $arr['attribs']['packagerversion'] = '1.10.16';
        if ($this->serialize($arr, $options)) {
            return $this->_serializedData . "\n";
        }

        return false;
    }


    function _recursiveXmlFilelist($list)
    {
        $dirs = array();
        if (isset($list['attribs'])) {
            $file = $list['attribs']['name'];
            unset($list['attribs']['name']);
            $attributes = $list['attribs'];
            $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes);
        } else {
            foreach ($list as $a) {
                $file = $a['attribs']['name'];
                $attributes = $a['attribs'];
                unset($a['attribs']);
                $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes, $a);
            }
        }
        $this->_formatDir($dirs);
        $this->_deFormat($dirs);
        return $dirs;
    }

    function _addDir(&$dirs, $dir, $file = null, $attributes = null, $tasks = null)
    {
        if (!$tasks) {
            $tasks = array();
        }
        if ($dir == array() || $dir == array('.')) {
            $dirs['file'][basename($file)] = $tasks;
            $attributes['name'] = basename($file);
            $dirs['file'][basename($file)]['attribs'] = $attributes;
            return;
        }
        $curdir = array_shift($dir);
        if (!isset($dirs['dir'][$curdir])) {
            $dirs['dir'][$curdir] = array();
        }
        $this->_addDir($dirs['dir'][$curdir], $dir, $file, $attributes, $tasks);
    }

    function _formatDir(&$dirs)
    {
        if (!count($dirs)) {
            return array();
        }
        $newdirs = array();
        if (isset($dirs['dir'])) {
            $newdirs['dir'] = $dirs['dir'];
        }
        if (isset($dirs['file'])) {
            $newdirs['file'] = $dirs['file'];
        }
        $dirs = $newdirs;
        if (isset($dirs['dir'])) {
            uksort($dirs['dir'], 'strnatcasecmp');
            foreach ($dirs['dir'] as $dir => $contents) {
                $this->_formatDir($dirs['dir'][$dir]);
            }
        }
        if (isset($dirs['file'])) {
            uksort($dirs['file'], 'strnatcasecmp');
        };
    }

    function _deFormat(&$dirs)
    {
        if (!count($dirs)) {
            return array();
        }
        $newdirs = array();
        if (isset($dirs['dir'])) {
            foreach ($dirs['dir'] as $dir => $contents) {
                $newdir = array();
                $newdir['attribs']['name'] = $dir;
                $this->_deFormat($contents);
                foreach ($contents as $tag => $val) {
                    $newdir[$tag] = $val;
                }
                $newdirs['dir'][] = $newdir;
            }
            if (count($newdirs['dir']) == 1) {
                $newdirs['dir'] = $newdirs['dir'][0];
            }
        }
        if (isset($dirs['file'])) {
            foreach ($dirs['file'] as $name => $file) {
                $newdirs['file'][] = $file;
            }
            if (count($newdirs['file']) == 1) {
                $newdirs['file'] = $newdirs['file'][0];
            }
        }
        $dirs = $newdirs;
    }

    /**
    * reset all options to default options
    *
    * @access   public
    * @see      setOption(), XML_Unserializer()
    */
    function resetOptions()
    {
        $this->options = $this->_defaultOptions;
    }

   /**
    * set an option
    *
    * You can use this method if you do not want to set all options in the constructor
    *
    * @access   public
    * @see      resetOption(), XML_Serializer()
    */
    function setOption($name, $value)
    {
        $this->options[$name] = $value;
    }

   /**
    * sets several options at once
    *
    * You can use this method if you do not want to set all options in the constructor
    *
    * @access   public
    * @see      resetOption(), XML_Unserializer(), setOption()
    */
    function setOptions($options)
    {
        $this->options = array_merge($this->options, $options);
    }

   /**
    * serialize data
    *
    * @access   public
    * @param    mixed    $data data to serialize
    * @return   boolean  true on success, pear error on failure
    */
    function serialize($data, $options = null)
    {
        // if options have been specified, use them instead
        // of the previously defined ones
        if (is_array($options)) {
            $optionsBak = $this->options;
            if (isset($options['overrideOptions']) && $options['overrideOptions'] == true) {
                $this->options = array_merge($this->_defaultOptions, $options);
            } else {
                $this->options = array_merge($this->options, $options);
            }
        } else {
            $optionsBak = null;
        }

        //  start depth is zero
        $this->_tagDepth = 0;
        $this->_serializedData = '';
        // serialize an array
        if (is_array($data)) {
            $tagName = isset($this->options['rootName']) ? $this->options['rootName'] : 'array';
            $this->_serializedData .= $this->_serializeArray($data, $tagName, $this->options['rootAttributes']);
        }

        // add doctype declaration
        if ($this->options['addDoctype'] === true) {
            $this->_serializedData = XML_Util::getDoctypeDeclaration($tagName, $this->options['doctype'])
                                   . $this->options['linebreak']
                                   . $this->_serializedData;
        }

        //  build xml declaration
        if ($this->options['addDecl']) {
            $atts = array();
            $encoding = isset($this->options['encoding']) ? $this->options['encoding'] : null;
            $this->_serializedData = XML_Util::getXMLDeclaration('1.0', $encoding)
                                   . $this->options['linebreak']
                                   . $this->_serializedData;
        }


        if ($optionsBak !== null) {
            $this->options = $optionsBak;
        }

        return  true;
    }

   /**
    * get the result of the serialization
    *
    * @access public
    * @return string serialized XML
    */
    function getSerializedData()
    {
        if ($this->_serializedData === null) {
            return  $this->raiseError('No serialized data available. Use XML_Serializer::serialize() first.', XML_SERIALIZER_ERROR_NO_SERIALIZATION);
        }
        return $this->_serializedData;
    }

   /**
    * serialize any value
    *
    * This method checks for the type of the value and calls the appropriate method
    *
    * @access private
    * @param  mixed     $value
    * @param  string    $tagName
    * @param  array     $attributes
    * @return string
    */
    function _serializeValue($value, $tagName = null, $attributes = array())
    {
        if (is_array($value)) {
            $xml = $this->_serializeArray($value, $tagName, $attributes);
        } elseif (is_object($value)) {
            $xml = $this->_serializeObject($value, $tagName);
        } else {
            $tag = array(
                          'qname'      => $tagName,
                          'attributes' => $attributes,
                          'content'    => $value
                        );
            $xml = $this->_createXMLTag($tag);
        }
        return $xml;
    }

   /**
    * serialize an array
    *
    * @access   private
    * @param    array   $array       array to serialize
    * @param    string  $tagName     name of the root tag
    * @param    array   $attributes  attributes for the root tag
    * @return   string  $string      serialized data
    * @uses     XML_Util::isValidName() to check, whether key has to be substituted
    */
    function _serializeArray(&$array, $tagName = null, $attributes = array())
    {
        $_content = null;

        /**
         * check for special attributes
         */
        if ($this->options['attributesArray'] !== null) {
            if (isset($array[$this->options['attributesArray']])) {
                $attributes = $array[$this->options['attributesArray']];
                unset($array[$this->options['attributesArray']]);
            }
            /**
             * check for special content
             */
            if ($this->options['contentName'] !== null) {
                if (isset($array[$this->options['contentName']])) {
                    $_content = $array[$this->options['contentName']];
                    unset($array[$this->options['contentName']]);
                }
            }
        }

        /*
        * if mode is set to simpleXML, check whether
        * the array is associative or indexed
        */
        if (is_array($array) && $this->options['mode'] == 'simplexml') {
            $indexed = true;
            if (!count($array)) {
                $indexed = false;
            }
            foreach ($array as $key => $val) {
                if (!is_int($key)) {
                    $indexed = false;
                    break;
                }
            }

            if ($indexed && $this->options['mode'] == 'simplexml') {
                $string = '';
                foreach ($array as $key => $val) {
                    if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
                        if (!isset($this->_curdir)) {
                            $this->_curdir = '';
                        }
                        $savedir = $this->_curdir;
                        if (isset($val['attribs'])) {
                            if ($val['attribs']['name'] == '/') {
                                $this->_curdir = '/';
                            } else {
                                if ($this->_curdir == '/') {
                                    $this->_curdir = '';
                                }
                                $this->_curdir .= '/' . $val['attribs']['name'];
                            }
                        }
                    }
                    $string .= $this->_serializeValue( $val, $tagName, $attributes);
                    if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
                        $string .= ' <!-- ' . $this->_curdir . ' -->';
                        if (empty($savedir)) {
                            unset($this->_curdir);
                        } else {
                            $this->_curdir = $savedir;
                        }
                    }

                    $string .= $this->options['linebreak'];
                    // do indentation
                    if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
                        $string .= str_repeat($this->options['indent'], $this->_tagDepth);
                    }
                }
                return rtrim($string);
            }
        }

        if ($this->options['scalarAsAttributes'] === true) {
            foreach ($array as $key => $value) {
                if (is_scalar($value) && (XML_Util::isValidName($key) === true)) {
                    unset($array[$key]);
                    $attributes[$this->options['prependAttributes'].$key] = $value;
                }
            }
        }

        // check for empty array => create empty tag
        if (empty($array)) {
            $tag = array(
                            'qname'      => $tagName,
                            'content'    => $_content,
                            'attributes' => $attributes
                        );

        } else {
            $this->_tagDepth++;
            $tmp = $this->options['linebreak'];
            foreach ($array as $key => $value) {
                // do indentation
                if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
                    $tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
                }

                // copy key
                $origKey = $key;
                // key cannot be used as tagname => use default tag
                $valid = XML_Util::isValidName($key);
                if (PEAR::isError($valid)) {
                    if ($this->options['classAsTagName'] && is_object($value)) {
                        $key = get_class($value);
                    } else {
                        $key = $this->options['defaultTagName'];
                    }
                }
                $atts = array();
                if ($this->options['typeHints'] === true) {
                    $atts[$this->options['typeAttribute']] = gettype($value);
                    if ($key !== $origKey) {
                        $atts[$this->options['keyAttribute']] = (string)$origKey;
                    }

                }
                if ($this->options['beautifyFilelist'] && $key == 'dir') {
                    if (!isset($this->_curdir)) {
                        $this->_curdir = '';
                    }
                    $savedir = $this->_curdir;
                    if (isset($value['attribs'])) {
                        if ($value['attribs']['name'] == '/') {
                            $this->_curdir = '/';
                        } else {
                            $this->_curdir .= '/' . $value['attribs']['name'];
                        }
                    }
                }

                if (is_string($value) && $value && ($value[strlen($value) - 1] == "\n")) {
                    $value .= str_repeat($this->options['indent'], $this->_tagDepth);
                }
                $tmp .= $this->_createXMLTag(array(
                                                    'qname'      => $key,
                                                    'attributes' => $atts,
                                                    'content'    => $value )
                                            );
                if ($this->options['beautifyFilelist'] && $key == 'dir') {
                    if (isset($value['attribs'])) {
                        $tmp .= ' <!-- ' . $this->_curdir . ' -->';
                        if (empty($savedir)) {
                            unset($this->_curdir);
                        } else {
                            $this->_curdir = $savedir;
                        }
                    }
                }
                $tmp .= $this->options['linebreak'];
            }

            $this->_tagDepth--;
            if ($this->options['indent']!==null && $this->_tagDepth>0) {
                $tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
            }

            if (trim($tmp) === '') {
                $tmp = null;
            }

            $tag = array(
                'qname'      => $tagName,
                'content'    => $tmp,
                'attributes' => $attributes
            );
        }
        if ($this->options['typeHints'] === true) {
            if (!isset($tag['attributes'][$this->options['typeAttribute']])) {
                $tag['attributes'][$this->options['typeAttribute']] = 'array';
            }
        }

        $string = $this->_createXMLTag($tag, false);
        return $string;
    }

   /**
    * create a tag from an array
    * this method awaits an array in the following format
    * array(
    *       'qname'        => $tagName,
    *       'attributes'   => array(),
    *       'content'      => $content,      // optional
    *       'namespace'    => $namespace     // optional
    *       'namespaceUri' => $namespaceUri  // optional
    *   )
    *
    * @access   private
    * @param    array   $tag tag definition
    * @param    boolean $replaceEntities whether to replace XML entities in content or not
    * @return   string  $string XML tag
    */
    function _createXMLTag($tag, $replaceEntities = true)
    {
        if ($this->options['indentAttributes'] !== false) {
            $multiline = true;
            $indent    = str_repeat($this->options['indent'], $this->_tagDepth);

            if ($this->options['indentAttributes'] == '_auto') {
                $indent .= str_repeat(' ', (strlen($tag['qname'])+2));

            } else {
                $indent .= $this->options['indentAttributes'];
            }
        } else {
            $indent = $multiline = false;
        }

        if (is_array($tag['content'])) {
            if (empty($tag['content'])) {
                $tag['content'] = '';
            }
        } elseif(is_scalar($tag['content']) && (string)$tag['content'] == '') {
            $tag['content'] = '';
        }

        if (is_scalar($tag['content']) || is_null($tag['content'])) {
            if ($replaceEntities === true) {
                $replaceEntities = XML_UTIL_ENTITIES_XML;
            }

            $tag = XML_Util::createTagFromArray($tag, $replaceEntities, $multiline, $indent, $this->options['linebreak']);
        } elseif (is_array($tag['content'])) {
            $tag = $this->_serializeArray($tag['content'], $tag['qname'], $tag['attributes']);
        } elseif (is_object($tag['content'])) {
            $tag = $this->_serializeObject($tag['content'], $tag['qname'], $tag['attributes']);
        } elseif (is_resource($tag['content'])) {
            settype($tag['content'], 'string');
            $tag = XML_Util::createTagFromArray($tag, $replaceEntities);
        }
        return  $tag;
    }
}
pear/PEAR/PackageFile/v2.php000064400000210500151732710130011413 0ustar00<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * For error handling
 */
require_once 'PEAR/ErrorStack.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_v2
{

    /**
     * Parsed package information
     * @var array
     * @access private
     */
    var $_packageInfo = array();

    /**
     * path to package .tgz or false if this is a local/extracted package.xml
     * @var string|false
     * @access private
     */
    var $_archiveFile;

    /**
     * path to package .xml or false if this is an abstract parsed-from-string xml
     * @var string|false
     * @access private
     */
    var $_packageFile;

    /**
     * This is used by file analysis routines to log progress information
     * @var PEAR_Common
     * @access protected
     */
    var $_logger;

    /**
     * This is set to the highest validation level that has been validated
     *
     * If the package.xml is invalid or unknown, this is set to 0.  If
     * normal validation has occurred, this is set to PEAR_VALIDATE_NORMAL.  If
     * downloading/installation validation has occurred it is set to PEAR_VALIDATE_DOWNLOADING
     * or INSTALLING, and so on up to PEAR_VALIDATE_PACKAGING.  This allows validation
     * "caching" to occur, which is particularly important for package validation, so
     * that PHP files are not validated twice
     * @var int
     * @access private
     */
    var $_isValid = 0;

    /**
     * True if the filelist has been validated
     * @param bool
     */
    var $_filesValid = false;

    /**
     * @var PEAR_Registry
     * @access protected
     */
    var $_registry;

    /**
     * @var PEAR_Config
     * @access protected
     */
    var $_config;

    /**
     * Optional Dependency group requested for installation
     * @var string
     * @access private
     */
    var $_requestedGroup = false;

    /**
     * @var PEAR_ErrorStack
     * @access protected
     */
    var $_stack;

    /**
     * Namespace prefix used for tasks in this package.xml - use tasks: whenever possible
     */
    var $_tasksNs;

    /**
     * Determines whether this packagefile was initialized only with partial package info
     *
     * If this package file was constructed via parsing REST, it will only contain
     *
     * - package name
     * - channel name
     * - dependencies
     * @var boolean
     * @access private
     */
    var $_incomplete = true;

    /**
     * @var PEAR_PackageFile_v2_Validator
     */
    var $_v2Validator;

    /**
     * The constructor merely sets up the private error stack
     */
    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_PackageFile_v2', false, null);
        $this->_isValid = false;
    }

    /**
     * PHP 4 style constructor for backwards compatibility.
     * Used by PEAR_PackageFileManager2
     */
    public function PEAR_PackageFile_v2()
    {
        $this->__construct();
    }

    /**
     * To make unit-testing easier
     * @param PEAR_Frontend_*
     * @param array options
     * @param PEAR_Config
     * @return PEAR_Downloader
     * @access protected
     */
    function &getPEARDownloader(&$i, $o, &$c)
    {
        $z = new PEAR_Downloader($i, $o, $c);
        return $z;
    }

    /**
     * To make unit-testing easier
     * @param PEAR_Config
     * @param array options
     * @param array package name as returned from {@link PEAR_Registry::parsePackageName()}
     * @param int PEAR_VALIDATE_* constant
     * @return PEAR_Dependency2
     * @access protected
     */
    function &getPEARDependency2(&$c, $o, $p, $s = PEAR_VALIDATE_INSTALLING)
    {
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }
        $z = new PEAR_Dependency2($c, $o, $p, $s);
        return $z;
    }

    function getInstalledBinary()
    {
        return isset($this->_packageInfo['#binarypackage']) ? $this->_packageInfo['#binarypackage'] :
            false;
    }

    /**
     * Installation of source package has failed, attempt to download and install the
     * binary version of this package.
     * @param PEAR_Installer
     * @return array|false
     */
    function installBinary(&$installer)
    {
        if (!OS_WINDOWS) {
            $a = false;
            return $a;
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $releasetype = $this->getPackageType() . 'release';
            if (!is_array($installer->getInstallPackages())) {
                $a = false;
                return $a;
            }
            foreach ($installer->getInstallPackages() as $p) {
                if ($p->isExtension($this->_packageInfo['providesextension'])) {
                    if ($p->getPackageType() != 'extsrc' && $p->getPackageType() != 'zendextsrc') {
                        $a = false;
                        return $a; // the user probably downloaded it separately
                    }
                }
            }
            if (isset($this->_packageInfo[$releasetype]['binarypackage'])) {
                $installer->log(0, 'Attempting to download binary version of extension "' .
                    $this->_packageInfo['providesextension'] . '"');
                $params = $this->_packageInfo[$releasetype]['binarypackage'];
                if (!is_array($params) || !isset($params[0])) {
                    $params = array($params);
                }
                if (isset($this->_packageInfo['channel'])) {
                    foreach ($params as $i => $param) {
                        $params[$i] = array('channel' => $this->_packageInfo['channel'],
                            'package' => $param, 'version' => $this->getVersion());
                    }
                }
                $dl = &$this->getPEARDownloader($installer->ui, $installer->getOptions(),
                    $installer->config);
                $verbose = $dl->config->get('verbose');
                $dl->config->set('verbose', -1);
                foreach ($params as $param) {
                    PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                    $ret = $dl->download(array($param));
                    PEAR::popErrorHandling();
                    if (is_array($ret) && count($ret)) {
                        break;
                    }
                }
                $dl->config->set('verbose', $verbose);
                if (is_array($ret)) {
                    if (count($ret) == 1) {
                        $pf = $ret[0]->getPackageFile();
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        $err = $installer->install($ret[0]);
                        PEAR::popErrorHandling();
                        if (is_array($err)) {
                            $this->_packageInfo['#binarypackage'] = $ret[0]->getPackage();
                            // "install" self, so all dependencies will work transparently
                            $this->_registry->addPackage2($this);
                            $installer->log(0, 'Download and install of binary extension "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $pf->getChannel(),
                                          'package' => $pf->getPackage()), true) . '" successful');
                            $a = array($ret[0], $err);
                            return $a;
                        }
                        $installer->log(0, 'Download and install of binary extension "' .
                            $this->_registry->parsedPackageNameToString(
                                    array('channel' => $pf->getChannel(),
                                          'package' => $pf->getPackage()), true) . '" failed');
                    }
                }
            }
        }
        $a = false;
        return $a;
    }

    /**
     * @return string|false Extension name
     */
    function getProvidesExtension()
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            if (isset($this->_packageInfo['providesextension'])) {
                return $this->_packageInfo['providesextension'];
            }
        }
        return false;
    }

    /**
     * @param string Extension name
     * @return bool
     */
    function isExtension($extension)
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            return $this->_packageInfo['providesextension'] == $extension;
        }
        return false;
    }

    /**
     * Tests whether every part of the package.xml 1.0 is represented in
     * this package.xml 2.0
     * @param PEAR_PackageFile_v1
     * @return bool
     */
    function isEquivalent($pf1)
    {
        if (!$pf1) {
            return true;
        }
        if ($this->getPackageType() == 'bundle') {
            return false;
        }
        $this->_stack->getErrors(true);
        if (!$pf1->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        $pass = true;
        if ($pf1->getPackage() != $this->getPackage()) {
            $this->_differentPackage($pf1->getPackage());
            $pass = false;
        }
        if ($pf1->getVersion() != $this->getVersion()) {
            $this->_differentVersion($pf1->getVersion());
            $pass = false;
        }
        if (trim($pf1->getSummary()) != $this->getSummary()) {
            $this->_differentSummary($pf1->getSummary());
            $pass = false;
        }
        if (preg_replace('/\s+/', '', $pf1->getDescription()) !=
              preg_replace('/\s+/', '', $this->getDescription())) {
            $this->_differentDescription($pf1->getDescription());
            $pass = false;
        }
        if ($pf1->getState() != $this->getState()) {
            $this->_differentState($pf1->getState());
            $pass = false;
        }
        if (!strstr(preg_replace('/\s+/', '', $this->getNotes()),
              preg_replace('/\s+/', '', $pf1->getNotes()))) {
            $this->_differentNotes($pf1->getNotes());
            $pass = false;
        }
        $mymaintainers = $this->getMaintainers();
        $yourmaintainers = $pf1->getMaintainers();
        for ($i1 = 0; $i1 < count($yourmaintainers); $i1++) {
            $reset = false;
            for ($i2 = 0; $i2 < count($mymaintainers); $i2++) {
                if ($mymaintainers[$i2]['handle'] == $yourmaintainers[$i1]['handle']) {
                    if ($mymaintainers[$i2]['role'] != $yourmaintainers[$i1]['role']) {
                        $this->_differentRole($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['role'], $mymaintainers[$i2]['role']);
                        $pass = false;
                    }
                    if ($mymaintainers[$i2]['email'] != $yourmaintainers[$i1]['email']) {
                        $this->_differentEmail($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['email'], $mymaintainers[$i2]['email']);
                        $pass = false;
                    }
                    if ($mymaintainers[$i2]['name'] != $yourmaintainers[$i1]['name']) {
                        $this->_differentName($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['name'], $mymaintainers[$i2]['name']);
                        $pass = false;
                    }
                    unset($mymaintainers[$i2]);
                    $mymaintainers = array_values($mymaintainers);
                    unset($yourmaintainers[$i1]);
                    $yourmaintainers = array_values($yourmaintainers);
                    $reset = true;
                    break;
                }
            }
            if ($reset) {
                $i1 = -1;
            }
        }
        $this->_unmatchedMaintainers($mymaintainers, $yourmaintainers);
        $filelist = $this->getFilelist();
        foreach ($pf1->getFilelist() as $file => $atts) {
            if (!isset($filelist[$file])) {
                $this->_missingFile($file);
                $pass = false;
            }
        }
        return $pass;
    }

    function _differentPackage($package)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('package' => $package,
            'self' => $this->getPackage()),
            'package.xml 1.0 package "%package%" does not match "%self%"');
    }

    function _differentVersion($version)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('version' => $version,
            'self' => $this->getVersion()),
            'package.xml 1.0 version "%version%" does not match "%self%"');
    }

    function _differentState($state)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('state' => $state,
            'self' => $this->getState()),
            'package.xml 1.0 state "%state%" does not match "%self%"');
    }

    function _differentRole($handle, $role, $selfrole)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'role' => $role, 'self' => $selfrole),
            'package.xml 1.0 maintainer "%handle%" role "%role%" does not match "%self%"');
    }

    function _differentEmail($handle, $email, $selfemail)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'email' => $email, 'self' => $selfemail),
            'package.xml 1.0 maintainer "%handle%" email "%email%" does not match "%self%"');
    }

    function _differentName($handle, $name, $selfname)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'name' => $name, 'self' => $selfname),
            'package.xml 1.0 maintainer "%handle%" name "%name%" does not match "%self%"');
    }

    function _unmatchedMaintainers($my, $yours)
    {
        if ($my) {
            array_walk($my, function(&$i, $k) { $i = $i["handle"]; });
            $this->_stack->push(__FUNCTION__, 'error', array('handles' => $my),
                'package.xml 2.0 has unmatched extra maintainers "%handles%"');
        }
        if ($yours) {
            array_walk($yours, function(&$i, $k) { $i = $i["handle"]; });
            $this->_stack->push(__FUNCTION__, 'error', array('handles' => $yours),
                'package.xml 1.0 has unmatched extra maintainers "%handles%"');
        }
    }

    function _differentNotes($notes)
    {
        $truncnotes = strlen($notes) < 25 ? $notes : substr($notes, 0, 24) . '...';
        $truncmynotes = strlen($this->getNotes()) < 25 ? $this->getNotes() :
            substr($this->getNotes(), 0, 24) . '...';
        $this->_stack->push(__FUNCTION__, 'error', array('notes' => $truncnotes,
            'self' => $truncmynotes),
            'package.xml 1.0 release notes "%notes%" do not match "%self%"');
    }

    function _differentSummary($summary)
    {
        $truncsummary = strlen($summary) < 25 ? $summary : substr($summary, 0, 24) . '...';
        $truncmysummary = strlen($this->getsummary()) < 25 ? $this->getSummary() :
            substr($this->getsummary(), 0, 24) . '...';
        $this->_stack->push(__FUNCTION__, 'error', array('summary' => $truncsummary,
            'self' => $truncmysummary),
            'package.xml 1.0 summary "%summary%" does not match "%self%"');
    }

    function _differentDescription($description)
    {
        $truncdescription = trim(strlen($description) < 25 ? $description : substr($description, 0, 24) . '...');
        $truncmydescription = trim(strlen($this->getDescription()) < 25 ? $this->getDescription() :
            substr($this->getdescription(), 0, 24) . '...');
        $this->_stack->push(__FUNCTION__, 'error', array('description' => $truncdescription,
            'self' => $truncmydescription),
            'package.xml 1.0 description "%description%" does not match "%self%"');
    }

    function _missingFile($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'package.xml 1.0 file "%file%" is not present in <contents>');
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawState($state)
    {
        if (!isset($this->_packageInfo['stability'])) {
            $this->_packageInfo['stability'] = array();
        }
        $this->_packageInfo['stability']['release'] = $state;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawCompatible($compatible)
    {
        $this->_packageInfo['compatible'] = $compatible;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawPackage($package)
    {
        $this->_packageInfo['name'] = $package;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawChannel($channel)
    {
        $this->_packageInfo['channel'] = $channel;
    }

    function setRequestedGroup($group)
    {
        $this->_requestedGroup = $group;
    }

    function getRequestedGroup()
    {
        if (isset($this->_requestedGroup)) {
            return $this->_requestedGroup;
        }
        return false;
    }

    /**
     * For saving in the registry.
     *
     * Set the last version that was installed
     * @param string
     */
    function setLastInstalledVersion($version)
    {
        $this->_packageInfo['_lastversion'] = $version;
    }

    /**
     * @return string|false
     */
    function getLastInstalledVersion()
    {
        if (isset($this->_packageInfo['_lastversion'])) {
            return $this->_packageInfo['_lastversion'];
        }
        return false;
    }

    /**
     * Determines whether this package.xml has post-install scripts or not
     * @return array|false
     */
    function listPostinstallScripts()
    {
        $filelist = $this->getFilelist();
        $contents = $this->getContents();
        $contents = $contents['dir']['file'];
        if (!is_array($contents) || !isset($contents[0])) {
            $contents = array($contents);
        }
        $taskfiles = array();
        foreach ($contents as $file) {
            $atts = $file['attribs'];
            unset($file['attribs']);
            if (count($file)) {
                $taskfiles[$atts['name']] = $file;
            }
        }
        $common = new PEAR_Common;
        $common->debug = $this->_config->get('verbose');
        $this->_scripts = array();
        $ret = array();
        foreach ($taskfiles as $name => $tasks) {
            if (!isset($filelist[$name])) {
                // ignored files will not be in the filelist
                continue;
            }
            $atts = $filelist[$name];
            foreach ($tasks as $tag => $raw) {
                $task = $this->getTask($tag);
                $task = new $task($this->_config, $common, PEAR_TASK_INSTALL);
                if ($task->isScript()) {
                    $ret[] = $filelist[$name]['installed_as'];
                }
            }
        }
        if (count($ret)) {
            return $ret;
        }
        return false;
    }

    /**
     * Initialize post-install scripts for running
     *
     * This method can be used to detect post-install scripts, as the return value
     * indicates whether any exist
     * @return bool
     */
    function initPostinstallScripts()
    {
        $filelist = $this->getFilelist();
        $contents = $this->getContents();
        $contents = $contents['dir']['file'];
        if (!is_array($contents) || !isset($contents[0])) {
            $contents = array($contents);
        }
        $taskfiles = array();
        foreach ($contents as $file) {
            $atts = $file['attribs'];
            unset($file['attribs']);
            if (count($file)) {
                $taskfiles[$atts['name']] = $file;
            }
        }
        $common = new PEAR_Common;
        $common->debug = $this->_config->get('verbose');
        $this->_scripts = array();
        foreach ($taskfiles as $name => $tasks) {
            if (!isset($filelist[$name])) {
                // file was not installed due to installconditions
                continue;
            }
            $atts = $filelist[$name];
            foreach ($tasks as $tag => $raw) {
                $taskname = $this->getTask($tag);
                $task = new $taskname($this->_config, $common, PEAR_TASK_INSTALL);
                if (!$task->isScript()) {
                    continue; // scripts are only handled after installation
                }
                $lastversion = isset($this->_packageInfo['_lastversion']) ?
                    $this->_packageInfo['_lastversion'] : null;
                $task->init($raw, $atts, $lastversion);
                $res = $task->startSession($this, $atts['installed_as'], null);
                if (!$res) {
                    continue; // skip this file
                }
                if (PEAR::isError($res)) {
                    return $res;
                }
                $this->_scripts[] = $task;
            }
        }
        if (count($this->_scripts)) {
            return true;
        }
        return false;
    }

    function runPostinstallScripts()
    {
        if ($this->initPostinstallScripts()) {
            $ui = &PEAR_Frontend::singleton();
            if ($ui) {
                $ui->runPostinstallScripts($this->_scripts, $this);
            }
        }
    }


    /**
     * Convert a recursive set of <dir> and <file> tags into a single <dir> tag with
     * <file> tags.
     */
    function flattenFilelist()
    {
        if (isset($this->_packageInfo['bundle'])) {
            return;
        }
        $filelist = array();
        if (isset($this->_packageInfo['contents']['dir']['dir'])) {
            $this->_getFlattenedFilelist($filelist, $this->_packageInfo['contents']['dir']);
            if (!isset($filelist[1])) {
                $filelist = $filelist[0];
            }
            $this->_packageInfo['contents']['dir']['file'] = $filelist;
            unset($this->_packageInfo['contents']['dir']['dir']);
        } else {
            // else already flattened but check for baseinstalldir propagation
            if (isset($this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'])) {
                if (isset($this->_packageInfo['contents']['dir']['file'][0])) {
                    foreach ($this->_packageInfo['contents']['dir']['file'] as $i => $file) {
                        if (isset($file['attribs']['baseinstalldir'])) {
                            continue;
                        }
                        $this->_packageInfo['contents']['dir']['file'][$i]['attribs']['baseinstalldir']
                            = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'];
                    }
                } else {
                    if (!isset($this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir'])) {
                       $this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir']
                            = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'];
                    }
                }
            }
        }
    }

    /**
     * @param array the final flattened file list
     * @param array the current directory being processed
     * @param string|false any recursively inherited baeinstalldir attribute
     * @param string private recursion variable
     * @return array
     * @access protected
     */
    function _getFlattenedFilelist(&$files, $dir, $baseinstall = false, $path = '')
    {
        if (isset($dir['attribs']) && isset($dir['attribs']['baseinstalldir'])) {
            $baseinstall = $dir['attribs']['baseinstalldir'];
        }
        if (isset($dir['dir'])) {
            if (!isset($dir['dir'][0])) {
                $dir['dir'] = array($dir['dir']);
            }
            foreach ($dir['dir'] as $subdir) {
                if (!isset($subdir['attribs']) || !isset($subdir['attribs']['name'])) {
                    $name = '*unknown*';
                } else {
                    $name = $subdir['attribs']['name'];
                }
                $newpath = empty($path) ? $name :
                    $path . '/' . $name;
                $this->_getFlattenedFilelist($files, $subdir,
                    $baseinstall, $newpath);
            }
        }
        if (isset($dir['file'])) {
            if (!isset($dir['file'][0])) {
                $dir['file'] = array($dir['file']);
            }
            foreach ($dir['file'] as $file) {
                $attrs = $file['attribs'];
                $name = $attrs['name'];
                if ($baseinstall && !isset($attrs['baseinstalldir'])) {
                    $attrs['baseinstalldir'] = $baseinstall;
                }
                $attrs['name'] = empty($path) ? $name : $path . '/' . $name;
                $attrs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                    $attrs['name']);
                $file['attribs'] = $attrs;
                $files[] = $file;
            }
        }
    }

    function setConfig(&$config)
    {
        $this->_config = &$config;
        $this->_registry = &$config->getRegistry();
    }

    function setLogger(&$logger)
    {
        if (!is_object($logger) || !method_exists($logger, 'log')) {
            return PEAR::raiseError('Logger must be compatible with PEAR_Common::log');
        }
        $this->_logger = &$logger;
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setDeps($deps)
    {
        $this->_packageInfo['dependencies'] = $deps;
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setCompatible($compat)
    {
        $this->_packageInfo['compatible'] = $compat;
    }

    function setPackagefile($file, $archive = false)
    {
        $this->_packageFile = $file;
        $this->_archiveFile = $archive ? $archive : $file;
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getValidationWarnings($purge = true)
    {
        return $this->_stack->getErrors($purge);
    }

    function getPackageFile()
    {
        return $this->_packageFile;
    }

    function getArchiveFile()
    {
        return $this->_archiveFile;
    }


    /**
     * Directly set the array that defines this packagefile
     *
     * WARNING: no validation.  This should only be performed by internal methods
     * inside PEAR or by inputting an array saved from an existing PEAR_PackageFile_v2
     * @param array
     */
    function fromArray($pinfo)
    {
        unset($pinfo['old']);
        unset($pinfo['xsdversion']);
        // If the changelog isn't an array then it was passed in as an empty tag
        if (isset($pinfo['changelog']) && !is_array($pinfo['changelog'])) {
          unset($pinfo['changelog']);
        }
        $this->_incomplete = false;
        $this->_packageInfo = $pinfo;
    }

    function isIncomplete()
    {
        return $this->_incomplete;
    }

    /**
     * @return array
     */
    function toArray($forreg = false)
    {
        if (!$this->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        return $this->getArray($forreg);
    }

    function getArray($forReg = false)
    {
        if ($forReg) {
            $arr = $this->_packageInfo;
            $arr['old'] = array();
            $arr['old']['version'] = $this->getVersion();
            $arr['old']['release_date'] = $this->getDate();
            $arr['old']['release_state'] = $this->getState();
            $arr['old']['release_license'] = $this->getLicense();
            $arr['old']['release_notes'] = $this->getNotes();
            $arr['old']['release_deps'] = $this->getDeps();
            $arr['old']['maintainers'] = $this->getMaintainers();
            $arr['xsdversion'] = '2.0';
            return $arr;
        } else {
            $info = $this->_packageInfo;
            unset($info['dirtree']);
            if (isset($info['_lastversion'])) {
                unset($info['_lastversion']);
            }
            if (isset($info['#binarypackage'])) {
                unset($info['#binarypackage']);
            }
            return $info;
        }
    }

    function packageInfo($field)
    {
        $arr = $this->getArray(true);
        if ($field == 'state') {
            return $arr['stability']['release'];
        }
        if ($field == 'api-version') {
            return $arr['version']['api'];
        }
        if ($field == 'api-state') {
            return $arr['stability']['api'];
        }
        if (isset($arr['old'][$field])) {
            if (!is_string($arr['old'][$field])) {
                return null;
            }
            return $arr['old'][$field];
        }
        if (isset($arr[$field])) {
            if (!is_string($arr[$field])) {
                return null;
            }
            return $arr[$field];
        }
        return null;
    }

    function getName()
    {
        return $this->getPackage();
    }

    function getPackage()
    {
        if (isset($this->_packageInfo['name'])) {
            return $this->_packageInfo['name'];
        }
        return false;
    }

    function getChannel()
    {
        if (isset($this->_packageInfo['uri'])) {
            return '__uri';
        }
        if (isset($this->_packageInfo['channel'])) {
            return strtolower($this->_packageInfo['channel']);
        }
        return false;
    }

    function getUri()
    {
        if (isset($this->_packageInfo['uri'])) {
            return $this->_packageInfo['uri'];
        }
        return false;
    }

    function getExtends()
    {
        if (isset($this->_packageInfo['extends'])) {
            return $this->_packageInfo['extends'];
        }
        return false;
    }

    function getSummary()
    {
        if (isset($this->_packageInfo['summary'])) {
            return $this->_packageInfo['summary'];
        }
        return false;
    }

    function getDescription()
    {
        if (isset($this->_packageInfo['description'])) {
            return $this->_packageInfo['description'];
        }
        return false;
    }

    function getMaintainers($raw = false)
    {
        if (!isset($this->_packageInfo['lead'])) {
            return false;
        }
        if ($raw) {
            $ret = array('lead' => $this->_packageInfo['lead']);
            (isset($this->_packageInfo['developer'])) ?
                $ret['developer'] = $this->_packageInfo['developer'] :null;
            (isset($this->_packageInfo['contributor'])) ?
                $ret['contributor'] = $this->_packageInfo['contributor'] :null;
            (isset($this->_packageInfo['helper'])) ?
                $ret['helper'] = $this->_packageInfo['helper'] :null;
            return $ret;
        } else {
            $ret = array();
            $leads = isset($this->_packageInfo['lead'][0]) ? $this->_packageInfo['lead'] :
                array($this->_packageInfo['lead']);
            foreach ($leads as $lead) {
                $s = $lead;
                $s['handle'] = $s['user'];
                unset($s['user']);
                $s['role'] = 'lead';
                $ret[] = $s;
            }
            if (isset($this->_packageInfo['developer'])) {
                $leads = isset($this->_packageInfo['developer'][0]) ?
                    $this->_packageInfo['developer'] :
                    array($this->_packageInfo['developer']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'developer';
                    $ret[] = $s;
                }
            }
            if (isset($this->_packageInfo['contributor'])) {
                $leads = isset($this->_packageInfo['contributor'][0]) ?
                    $this->_packageInfo['contributor'] :
                    array($this->_packageInfo['contributor']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'contributor';
                    $ret[] = $s;
                }
            }
            if (isset($this->_packageInfo['helper'])) {
                $leads = isset($this->_packageInfo['helper'][0]) ?
                    $this->_packageInfo['helper'] :
                    array($this->_packageInfo['helper']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'helper';
                    $ret[] = $s;
                }
            }
            return $ret;
        }
        return false;
    }

    function getLeads()
    {
        if (isset($this->_packageInfo['lead'])) {
            return $this->_packageInfo['lead'];
        }
        return false;
    }

    function getDevelopers()
    {
        if (isset($this->_packageInfo['developer'])) {
            return $this->_packageInfo['developer'];
        }
        return false;
    }

    function getContributors()
    {
        if (isset($this->_packageInfo['contributor'])) {
            return $this->_packageInfo['contributor'];
        }
        return false;
    }

    function getHelpers()
    {
        if (isset($this->_packageInfo['helper'])) {
            return $this->_packageInfo['helper'];
        }
        return false;
    }

    function setDate($date)
    {
        if (!isset($this->_packageInfo['date'])) {
            // ensure that the extends tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('time', 'version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease',
                    'zendextbinrelease', 'bundle', 'changelog'), array(), 'date');
        }
        $this->_packageInfo['date'] = $date;
        $this->_isValid = 0;
    }

    function setTime($time)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['time'])) {
            // ensure that the time tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                    array('version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease',
                    'zendextbinrelease', 'bundle', 'changelog'), $time, 'time');
        }
        $this->_packageInfo['time'] = $time;
    }

    function getDate()
    {
        if (isset($this->_packageInfo['date'])) {
            return $this->_packageInfo['date'];
        }
        return false;
    }

    function getTime()
    {
        if (isset($this->_packageInfo['time'])) {
            return $this->_packageInfo['time'];
        }
        return false;
    }

    /**
     * @param package|api version category to return
     */
    function getVersion($key = 'release')
    {
        if (isset($this->_packageInfo['version'][$key])) {
            return $this->_packageInfo['version'][$key];
        }
        return false;
    }

    function getStability()
    {
        if (isset($this->_packageInfo['stability'])) {
            return $this->_packageInfo['stability'];
        }
        return false;
    }

    function getState($key = 'release')
    {
        if (isset($this->_packageInfo['stability'][$key])) {
            return $this->_packageInfo['stability'][$key];
        }
        return false;
    }

    function getLicense($raw = false)
    {
        if (isset($this->_packageInfo['license'])) {
            if ($raw) {
                return $this->_packageInfo['license'];
            }
            if (is_array($this->_packageInfo['license'])) {
                return $this->_packageInfo['license']['_content'];
            } else {
                return $this->_packageInfo['license'];
            }
        }
        return false;
    }

    function getLicenseLocation()
    {
        if (!isset($this->_packageInfo['license']) || !is_array($this->_packageInfo['license'])) {
            return false;
        }
        return $this->_packageInfo['license']['attribs'];
    }

    function getNotes()
    {
        if (isset($this->_packageInfo['notes'])) {
            return $this->_packageInfo['notes'];
        }
        return false;
    }

    /**
     * Return the <usesrole> tag contents, if any
     * @return array|false
     */
    function getUsesrole()
    {
        if (isset($this->_packageInfo['usesrole'])) {
            return $this->_packageInfo['usesrole'];
        }
        return false;
    }

    /**
     * Return the <usestask> tag contents, if any
     * @return array|false
     */
    function getUsestask()
    {
        if (isset($this->_packageInfo['usestask'])) {
            return $this->_packageInfo['usestask'];
        }
        return false;
    }

    /**
     * This should only be used to retrieve filenames and install attributes
     */
    function getFilelist($preserve = false)
    {
        if (isset($this->_packageInfo['filelist']) && !$preserve) {
            return $this->_packageInfo['filelist'];
        }
        $this->flattenFilelist();
        if ($contents = $this->getContents()) {
            $ret = array();
            if (!isset($contents['dir'])) {
                return false;
            }
            if (!isset($contents['dir']['file'][0])) {
                $contents['dir']['file'] = array($contents['dir']['file']);
            }
            foreach ($contents['dir']['file'] as $file) {
                if (!isset($file['attribs']['name'])) {
                    continue;
                }
                $name = $file['attribs']['name'];
                if (!$preserve) {
                    $file = $file['attribs'];
                }
                $ret[$name] = $file;
            }
            if (!$preserve) {
                $this->_packageInfo['filelist'] = $ret;
            }
            return $ret;
        }
        return false;
    }

    /**
     * Return configure options array, if any
     *
     * @return array|false
     */
    function getConfigureOptions()
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }

        $releases = $this->getReleases();
        if (isset($releases[0])) {
            $releases = $releases[0];
        }

        if (isset($releases['configureoption'])) {
            if (!isset($releases['configureoption'][0])) {
                $releases['configureoption'] = array($releases['configureoption']);
            }

            for ($i = 0; $i < count($releases['configureoption']); $i++) {
                $releases['configureoption'][$i] = $releases['configureoption'][$i]['attribs'];
            }

            return $releases['configureoption'];
        }

        return false;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function resetFilelist()
    {
        $this->_packageInfo['filelist'] = array();
    }

    /**
     * Retrieve a list of files that should be installed on this computer
     * @return array
     */
    function getInstallationFilelist($forfilecheck = false)
    {
        $contents = $this->getFilelist(true);
        if (isset($contents['dir']['attribs']['baseinstalldir'])) {
            $base = $contents['dir']['attribs']['baseinstalldir'];
        }
        if (isset($this->_packageInfo['bundle'])) {
            return PEAR::raiseError(
                'Exception: bundles should be handled in download code only');
        }
        $release = $this->getReleases();
        if ($release) {
            if (!isset($release[0])) {
                if (!isset($release['installconditions']) && !isset($release['filelist'])) {
                    if ($forfilecheck) {
                        return $this->getFilelist();
                    }
                    return $contents;
                }
                $release = array($release);
            }
            $depchecker = &$this->getPEARDependency2($this->_config, array(),
                array('channel' => $this->getChannel(), 'package' => $this->getPackage()),
                PEAR_VALIDATE_INSTALLING);
            foreach ($release as $instance) {
                if (isset($instance['installconditions'])) {
                    $installconditions = $instance['installconditions'];
                    if (is_array($installconditions)) {
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        foreach ($installconditions as $type => $conditions) {
                            if (!isset($conditions[0])) {
                                $conditions = array($conditions);
                            }
                            foreach ($conditions as $condition) {
                                $ret = $depchecker->{"validate{$type}Dependency"}($condition);
                                if (PEAR::isError($ret)) {
                                    PEAR::popErrorHandling();
                                    continue 3; // skip this release
                                }
                            }
                        }
                        PEAR::popErrorHandling();
                    }
                }
                // this is the release to use
                if (isset($instance['filelist'])) {
                    // ignore files
                    if (isset($instance['filelist']['ignore'])) {
                        $ignore = isset($instance['filelist']['ignore'][0]) ?
                            $instance['filelist']['ignore'] :
                            array($instance['filelist']['ignore']);
                        foreach ($ignore as $ig) {
                            unset ($contents[$ig['attribs']['name']]);
                        }
                    }
                    // install files as this name
                    if (isset($instance['filelist']['install'])) {
                        $installas = isset($instance['filelist']['install'][0]) ?
                            $instance['filelist']['install'] :
                            array($instance['filelist']['install']);
                        foreach ($installas as $as) {
                            $contents[$as['attribs']['name']]['attribs']['install-as'] =
                                $as['attribs']['as'];
                        }
                    }
                }
                if ($forfilecheck) {
                    foreach ($contents as $file => $attrs) {
                        $contents[$file] = $attrs['attribs'];
                    }
                }
                return $contents;
            }
        } else { // simple release - no installconditions or install-as
            if ($forfilecheck) {
                return $this->getFilelist();
            }
            return $contents;
        }
        // no releases matched
        return PEAR::raiseError('No releases in package.xml matched the existing operating ' .
            'system, extensions installed, or architecture, cannot install');
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     * @param string file name
     * @param string installed path
     */
    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    function getInstalledLocation($file)
    {
        if (isset($this->_packageInfo['filelist'][$file]['installed_as'])) {
            return $this->_packageInfo['filelist'][$file]['installed_as'];
        }
        return false;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts['attribs'];
        }
    }

    /**
     * Retrieve the contents tag
     */
    function getContents()
    {
        if (isset($this->_packageInfo['contents'])) {
            return $this->_packageInfo['contents'];
        }
        return false;
    }

    /**
     * @param string full path to file
     * @param string attribute name
     * @param string attribute value
     * @param int risky but fast - use this to choose a file based on its position in the list
     *            of files.  Index is zero-based like PHP arrays.
     * @return bool success of operation
     */
    function setFileAttribute($filename, $attr, $value, $index = false)
    {
        $this->_isValid = 0;
        if (in_array($attr, array('role', 'name', 'baseinstalldir'))) {
            $this->_filesValid = false;
        }
        if ($index !== false &&
              isset($this->_packageInfo['contents']['dir']['file'][$index]['attribs'])) {
            $this->_packageInfo['contents']['dir']['file'][$index]['attribs'][$attr] = $value;
            return true;
        }
        if (!isset($this->_packageInfo['contents']['dir']['file'])) {
            return false;
        }
        $files = $this->_packageInfo['contents']['dir']['file'];
        if (!isset($files[0])) {
            $files = array($files);
            $ind = false;
        } else {
            $ind = true;
        }
        foreach ($files as $i => $file) {
            if (isset($file['attribs'])) {
                if ($file['attribs']['name'] == $filename) {
                    if ($ind) {
                        $this->_packageInfo['contents']['dir']['file'][$i]['attribs'][$attr] = $value;
                    } else {
                        $this->_packageInfo['contents']['dir']['file']['attribs'][$attr] = $value;
                    }
                    return true;
                }
            }
        }
        return false;
    }

    function setDirtree($path)
    {
        if (!isset($this->_packageInfo['dirtree'])) {
            $this->_packageInfo['dirtree'] = array();
        }
        $this->_packageInfo['dirtree'][$path] = true;
    }

    function getDirtree()
    {
        if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) {
            return $this->_packageInfo['dirtree'];
        }
        return false;
    }

    function resetDirtree()
    {
        unset($this->_packageInfo['dirtree']);
    }

    /**
     * Determines whether this package claims it is compatible with the version of
     * the package that has a recommended version dependency
     * @param PEAR_PackageFile_v2|PEAR_PackageFile_v1|PEAR_Downloader_Package
     * @return boolean
     */
    function isCompatible($pf)
    {
        if (!isset($this->_packageInfo['compatible'])) {
            return false;
        }
        if (!isset($this->_packageInfo['channel'])) {
            return false;
        }
        $me = $pf->getVersion();
        $compatible = $this->_packageInfo['compatible'];
        if (!isset($compatible[0])) {
            $compatible = array($compatible);
        }
        $found = false;
        foreach ($compatible as $info) {
            if (strtolower($info['name']) == strtolower($pf->getPackage())) {
                if (strtolower($info['channel']) == strtolower($pf->getChannel())) {
                    $found = true;
                    break;
                }
            }
        }
        if (!$found) {
            return false;
        }
        if (isset($info['exclude'])) {
            if (!isset($info['exclude'][0])) {
                $info['exclude'] = array($info['exclude']);
            }
            foreach ($info['exclude'] as $exclude) {
                if (version_compare($me, $exclude, '==')) {
                    return false;
                }
            }
        }
        if (version_compare($me, $info['min'], '>=') && version_compare($me, $info['max'], '<=')) {
            return true;
        }
        return false;
    }

    /**
     * @return array|false
     */
    function getCompatible()
    {
        if (isset($this->_packageInfo['compatible'])) {
            return $this->_packageInfo['compatible'];
        }
        return false;
    }

    function getDependencies()
    {
        if (isset($this->_packageInfo['dependencies'])) {
            return $this->_packageInfo['dependencies'];
        }
        return false;
    }

    function isSubpackageOf($p)
    {
        return $p->isSubpackage($this);
    }

    /**
     * Determines whether the passed in package is a subpackage of this package.
     *
     * No version checking is done, only name verification.
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     */
    function isSubpackage($p)
    {
        $sub = array();
        if (isset($this->_packageInfo['dependencies']['required']['subpackage'])) {
            $sub = $this->_packageInfo['dependencies']['required']['subpackage'];
            if (!isset($sub[0])) {
                $sub = array($sub);
            }
        }
        if (isset($this->_packageInfo['dependencies']['optional']['subpackage'])) {
            $sub1 = $this->_packageInfo['dependencies']['optional']['subpackage'];
            if (!isset($sub1[0])) {
                $sub1 = array($sub1);
            }
            $sub = array_merge($sub, $sub1);
        }
        if (isset($this->_packageInfo['dependencies']['group'])) {
            $group = $this->_packageInfo['dependencies']['group'];
            if (!isset($group[0])) {
                $group = array($group);
            }
            foreach ($group as $deps) {
                if (isset($deps['subpackage'])) {
                    $sub2 = $deps['subpackage'];
                    if (!isset($sub2[0])) {
                        $sub2 = array($sub2);
                    }
                    $sub = array_merge($sub, $sub2);
                }
            }
        }
        foreach ($sub as $dep) {
            if (strtolower($dep['name']) == strtolower($p->getPackage())) {
                if (isset($dep['channel'])) {
                    if (strtolower($dep['channel']) == strtolower($p->getChannel())) {
                        return true;
                    }
                } else {
                    if ($dep['uri'] == $p->getURI()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    function dependsOn($package, $channel)
    {
        if (!($deps = $this->getDependencies())) {
            return false;
        }
        foreach (array('package', 'subpackage') as $type) {
            foreach (array('required', 'optional') as $needed) {
                if (isset($deps[$needed][$type])) {
                    if (!isset($deps[$needed][$type][0])) {
                        $deps[$needed][$type] = array($deps[$needed][$type]);
                    }
                    foreach ($deps[$needed][$type] as $dep) {
                        $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
                        if (strtolower($dep['name']) == strtolower($package) &&
                              $depchannel == $channel) {
                            return true;
                        }
                    }
                }
            }
            if (isset($deps['group'])) {
                if (!isset($deps['group'][0])) {
                    $dep['group'] = array($deps['group']);
                }
                foreach ($deps['group'] as $group) {
                    if (isset($group[$type])) {
                        if (!is_array($group[$type])) {
                            $group[$type] = array($group[$type]);
                        }
                        foreach ($group[$type] as $dep) {
                            $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
                            if (strtolower($dep['name']) == strtolower($package) &&
                                  $depchannel == $channel) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    /**
     * Get the contents of a dependency group
     * @param string
     * @return array|false
     */
    function getDependencyGroup($name)
    {
        $name = strtolower($name);
        if (!isset($this->_packageInfo['dependencies']['group'])) {
            return false;
        }
        $groups = $this->_packageInfo['dependencies']['group'];
        if (!isset($groups[0])) {
            $groups = array($groups);
        }
        foreach ($groups as $group) {
            if (strtolower($group['attribs']['name']) == $name) {
                return $group;
            }
        }
        return false;
    }

    /**
     * Retrieve a partial package.xml 1.0 representation of dependencies
     *
     * a very limited representation of dependencies is returned by this method.
     * The <exclude> tag for excluding certain versions of a dependency is
     * completely ignored.  In addition, dependency groups are ignored, with the
     * assumption that all dependencies in dependency groups are also listed in
     * the optional group that work with all dependency groups
     * @param boolean return package.xml 2.0 <dependencies> tag
     * @return array|false
     */
    function getDeps($raw = false, $nopearinstaller = false)
    {
        if (isset($this->_packageInfo['dependencies'])) {
            if ($raw) {
                return $this->_packageInfo['dependencies'];
            }
            $ret = array();
            $map = array(
                'php' => 'php',
                'package' => 'pkg',
                'subpackage' => 'pkg',
                'extension' => 'ext',
                'os' => 'os',
                'pearinstaller' => 'pkg',
                );
            foreach (array('required', 'optional') as $type) {
                $optional = ($type == 'optional') ? 'yes' : 'no';
                if (!isset($this->_packageInfo['dependencies'][$type])
                    || empty($this->_packageInfo['dependencies'][$type])) {
                    continue;
                }
                foreach ($this->_packageInfo['dependencies'][$type] as $dtype => $deps) {
                    if ($dtype == 'pearinstaller' && $nopearinstaller) {
                        continue;
                    }
                    if ((is_array($deps) && !isset($deps[0])) || !is_array($deps)) {
                        $deps = array($deps);
                    }
                    foreach ($deps as $dep) {
                        if (!isset($map[$dtype])) {
                            // no support for arch type
                            continue;
                        }
                        if ($dtype == 'pearinstaller') {
                            $dep['name'] = 'PEAR';
                            $dep['channel'] = 'pear.php.net';
                        }
                        $s = array('type' => $map[$dtype]);
                        if (isset($dep['channel'])) {
                            $s['channel'] = $dep['channel'];
                        }
                        if (isset($dep['uri'])) {
                            $s['uri'] = $dep['uri'];
                        }
                        if (isset($dep['name'])) {
                            $s['name'] = $dep['name'];
                        }
                        if (isset($dep['conflicts'])) {
                            $s['rel'] = 'not';
                        } else {
                            if (!isset($dep['min']) &&
                                  !isset($dep['max'])) {
                                $s['rel'] = 'has';
                                $s['optional'] = $optional;
                            } elseif (isset($dep['min']) &&
                                  isset($dep['max'])) {
                                $s['rel'] = 'ge';
                                $s1 = $s;
                                $s1['rel'] = 'le';
                                $s['version'] = $dep['min'];
                                $s1['version'] = $dep['max'];
                                if (isset($dep['channel'])) {
                                    $s1['channel'] = $dep['channel'];
                                }
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                    $s1['name'] = $dep['name'];
                                }
                                $s['optional'] = $optional;
                                $s1['optional'] = $optional;
                                $ret[] = $s1;
                            } elseif (isset($dep['min'])) {
                                if (isset($dep['exclude']) &&
                                      $dep['exclude'] == $dep['min']) {
                                    $s['rel'] = 'gt';
                                } else {
                                    $s['rel'] = 'ge';
                                }
                                $s['version'] = $dep['min'];
                                $s['optional'] = $optional;
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                }
                            } elseif (isset($dep['max'])) {
                                if (isset($dep['exclude']) &&
                                      $dep['exclude'] == $dep['max']) {
                                    $s['rel'] = 'lt';
                                } else {
                                    $s['rel'] = 'le';
                                }
                                $s['version'] = $dep['max'];
                                $s['optional'] = $optional;
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                }
                            }
                        }
                        $ret[] = $s;
                    }
                }
            }
            if (count($ret)) {
                return $ret;
            }
        }
        return false;
    }

    /**
     * @return php|extsrc|extbin|zendextsrc|zendextbin|bundle|false
     */
    function getPackageType()
    {
        if (isset($this->_packageInfo['phprelease'])) {
            return 'php';
        }
        if (isset($this->_packageInfo['extsrcrelease'])) {
            return 'extsrc';
        }
        if (isset($this->_packageInfo['extbinrelease'])) {
            return 'extbin';
        }
        if (isset($this->_packageInfo['zendextsrcrelease'])) {
            return 'zendextsrc';
        }
        if (isset($this->_packageInfo['zendextbinrelease'])) {
            return 'zendextbin';
        }
        if (isset($this->_packageInfo['bundle'])) {
            return 'bundle';
        }
        return false;
    }

    /**
     * @return array|false
     */
    function getReleases()
    {
        $type = $this->getPackageType();
        if ($type != 'bundle') {
            $type .= 'release';
        }
        if ($this->getPackageType() && isset($this->_packageInfo[$type])) {
            return $this->_packageInfo[$type];
        }
        return false;
    }

    /**
     * @return array
     */
    function getChangelog()
    {
        if (isset($this->_packageInfo['changelog'])) {
            return $this->_packageInfo['changelog'];
        }
        return false;
    }

    function hasDeps()
    {
        return isset($this->_packageInfo['dependencies']);
    }

    function getPackagexmlVersion()
    {
        if (isset($this->_packageInfo['zendextsrcrelease'])) {
            return '2.1';
        }
        if (isset($this->_packageInfo['zendextbinrelease'])) {
            return '2.1';
        }
        return '2.0';
    }

    /**
     * @return array|false
     */
    function getSourcePackage()
    {
        if (isset($this->_packageInfo['extbinrelease']) ||
              isset($this->_packageInfo['zendextbinrelease'])) {
            return array('channel' => $this->_packageInfo['srcchannel'],
                         'package' => $this->_packageInfo['srcpackage']);
        }
        return false;
    }

    function getBundledPackages()
    {
        if (isset($this->_packageInfo['bundle'])) {
            return $this->_packageInfo['contents']['bundledpackage'];
        }
        return false;
    }

    function getLastModified()
    {
        if (isset($this->_packageInfo['_lastmodified'])) {
            return $this->_packageInfo['_lastmodified'];
        }
        return false;
    }

    /**
     * Get the contents of a file listed within the package.xml
     * @param string
     * @return string
     */
    function getFileContents($file)
    {
        if ($this->_archiveFile == $this->_packageFile) { // unpacked
            $dir = dirname($this->_packageFile);
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            $file = str_replace(array('/', '\\'),
                array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
            if (file_exists($file) && is_readable($file)) {
                return implode('', file($file));
            }
        } else { // tgz
            $tar = new Archive_Tar($this->_archiveFile);
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($file != 'package.xml' && $file != 'package2.xml') {
                $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file;
            }
            $file = $tar->extractInString($file);
            $tar->popErrorHandling();
            if (PEAR::isError($file)) {
                return PEAR::raiseError("Cannot locate file '$file' in archive");
            }
            return $file;
        }
    }

    function &getRW()
    {
        if (!class_exists('PEAR_PackageFile_v2_rw')) {
            require_once 'PEAR/PackageFile/v2/rw.php';
        }
        $a = new PEAR_PackageFile_v2_rw;
        foreach (get_object_vars($this) as $name => $unused) {
            if (!isset($this->$name)) {
                continue;
            }
            if ($name == '_config' || $name == '_logger'|| $name == '_registry' ||
                  $name == '_stack') {
                $a->$name = &$this->$name;
            } else {
                $a->$name = $this->$name;
            }
        }
        return $a;
    }

    function &getDefaultGenerator()
    {
        if (!class_exists('PEAR_PackageFile_Generator_v2')) {
            require_once 'PEAR/PackageFile/Generator/v2.php';
        }
        $a = new PEAR_PackageFile_Generator_v2($this);
        return $a;
    }

    function analyzeSourceCode($file, $string = false)
    {
        if (!isset($this->_v2Validator) ||
              !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) {
            if (!class_exists('PEAR_PackageFile_v2_Validator')) {
                require_once 'PEAR/PackageFile/v2/Validator.php';
            }
            $this->_v2Validator = new PEAR_PackageFile_v2_Validator;
        }
        return $this->_v2Validator->analyzeSourceCode($file, $string);
    }

    function validate($state = PEAR_VALIDATE_NORMAL)
    {
        if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) {
            return false;
        }
        if (!isset($this->_v2Validator) ||
              !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) {
            if (!class_exists('PEAR_PackageFile_v2_Validator')) {
                require_once 'PEAR/PackageFile/v2/Validator.php';
            }
            $this->_v2Validator = new PEAR_PackageFile_v2_Validator;
        }
        if (isset($this->_packageInfo['xsdversion'])) {
            unset($this->_packageInfo['xsdversion']);
        }
        return $this->_v2Validator->validate($this, $state);
    }

    function getTasksNs()
    {
        if (!isset($this->_tasksNs)) {
            if (isset($this->_packageInfo['attribs'])) {
                foreach ($this->_packageInfo['attribs'] as $name => $value) {
                    if ($value == 'http://pear.php.net/dtd/tasks-1.0') {
                        $this->_tasksNs = str_replace('xmlns:', '', $name);
                        break;
                    }
                }
            }
        }
        return $this->_tasksNs;
    }

    /**
     * Determine whether a task name is a valid task.  Custom tasks may be defined
     * using subdirectories by putting a "-" in the name, as in <tasks:mycustom-task>
     *
     * Note that this method will auto-load the task class file and test for the existence
     * of the name with "-" replaced by "_" as in PEAR/Task/mycustom/task.php makes class
     * PEAR_Task_mycustom_task
     * @param string
     * @return boolean
     */
    function getTask($task)
    {
        $this->getTasksNs();
        // transform all '-' to '/' and 'tasks:' to '' so tasks:replace becomes replace
        $task = str_replace(array($this->_tasksNs . ':', '-'), array('', ' '), $task);
        $taskfile = str_replace(' ', '/', ucwords($task));
        $task = str_replace(array(' ', '/'), '_', ucwords($task));
        if (class_exists("PEAR_Task_$task")) {
            return "PEAR_Task_$task";
        }
        $fp = @fopen("PEAR/Task/$taskfile.php", 'r', true);
        if ($fp) {
            fclose($fp);
            require_once "PEAR/Task/$taskfile.php";
            return "PEAR_Task_$task";
        }
        return false;
    }

    /**
     * Key-friendly array_splice
     * @param tagname to splice a value in before
     * @param mixed the value to splice in
     * @param string the new tag name
     */
    function _ksplice($array, $key, $value, $newkey)
    {
        $offset = array_search($key, array_keys($array));
        $after = array_slice($array, $offset);
        $before = array_slice($array, 0, $offset);
        $before[$newkey] = $value;
        return array_merge($before, $after);
    }

    /**
     * @param array a list of possible keys, in the order they may occur
     * @param mixed contents of the new package.xml tag
     * @param string tag name
     * @access private
     */
    function _insertBefore($array, $keys, $contents, $newkey)
    {
        foreach ($keys as $key) {
            if (isset($array[$key])) {
                return $array = $this->_ksplice($array, $key, $contents, $newkey);
            }
        }
        $array[$newkey] = $contents;
        return $array;
    }

    /**
     * @param subsection of {@link $_packageInfo}
     * @param array|string tag contents
     * @param array format:
     * <pre>
     * array(
     *   tagname => array(list of tag names that follow this one),
     *   childtagname => array(list of child tag names that follow this one),
     * )
     * </pre>
     *
     * This allows construction of nested tags
     * @access private
     */
    function _mergeTag($manip, $contents, $order)
    {
        if (count($order)) {
            foreach ($order as $tag => $curorder) {
                if (!isset($manip[$tag])) {
                    // ensure that the tag is set up
                    $manip = $this->_insertBefore($manip, $curorder, array(), $tag);
                }
                if (count($order) > 1) {
                    $manip[$tag] = $this->_mergeTag($manip[$tag], $contents, array_slice($order, 1));
                    return $manip;
                }
            }
        } else {
            return $manip;
        }
        if (is_array($manip[$tag]) && !empty($manip[$tag]) && isset($manip[$tag][0])) {
            $manip[$tag][] = $contents;
        } else {
            if (is_array($manip[$tag]) && !count($manip[$tag])) {
                $manip[$tag] = $contents;
            } else {
                $manip[$tag] = array($manip[$tag]);
                $manip[$tag][] = $contents;
            }
        }
        return $manip;
    }
}
?>
pear/PEAR/Installer.php000064400000210711151732710130010672 0ustar00<?php
/**
 * PEAR_Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Used for installation groups in package.xml 2.0 and platform exceptions
 */
require_once 'OS/Guess.php';
require_once 'PEAR/Downloader.php';

define('PEAR_INSTALLER_NOBINARY', -240);
/**
 * Administration class used to install PEAR packages and maintain the
 * installed package database.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Installer extends PEAR_Downloader
{
    // {{{ properties

    /** name of the package directory, for example Foo-1.0
     * @var string
     */
    var $pkgdir;

    /** directory where PHP code files go
     * @var string
     */
    var $phpdir;

    /** directory where PHP extension files go
     * @var string
     */
    var $extdir;

    /** directory where documentation goes
     * @var string
     */
    var $docdir;

    /** installation root directory (ala PHP's INSTALL_ROOT or
     * automake's DESTDIR
     * @var string
     */
    var $installroot = '';

    /** debug level
     * @var int
     */
    var $debug = 1;

    /** temporary directory
     * @var string
     */
    var $tmpdir;

    /**
     * PEAR_Registry object used by the installer
     * @var PEAR_Registry
     */
    var $registry;

    /**
     * array of PEAR_Downloader_Packages
     * @var array
     */
    var $_downloadedPackages;

    /** List of file transactions queued for an install/upgrade/uninstall.
     *
     *  Format:
     *    array(
     *      0 => array("rename => array("from-file", "to-file")),
     *      1 => array("delete" => array("file-to-delete")),
     *      ...
     *    )
     *
     * @var array
     */
    var $file_operations = array();

    // }}}

    // {{{ constructor

    /**
     * PEAR_Installer constructor.
     *
     * @param object $ui user interface object (instance of PEAR_Frontend_*)
     *
     * @access public
     */
    function __construct(&$ui)
    {
        parent::__construct($ui, array(), null);
        $this->setFrontendObject($ui);
        $this->debug = $this->config->get('verbose');
    }

    function setOptions($options)
    {
        $this->_options = $options;
    }

    function setConfig(&$config)
    {
        $this->config    = &$config;
        $this->_registry = &$config->getRegistry();
    }

    // }}}

    function _removeBackups($files)
    {
        foreach ($files as $path) {
            $this->addFileOperation('removebackup', array($path));
        }
    }

    // {{{ _deletePackageFiles()

    /**
     * Delete a package's installed files, does not remove empty directories.
     *
     * @param string package name
     * @param string channel name
     * @param bool if true, then files are backed up first
     * @return bool TRUE on success, or a PEAR error on failure
     * @access protected
     */
    function _deletePackageFiles($package, $channel = false, $backup = false)
    {
        if (!$channel) {
            $channel = 'pear.php.net';
        }

        if (!strlen($package)) {
            return $this->raiseError("No package to uninstall given");
        }

        if (strtolower($package) == 'pear' && $channel == 'pear.php.net') {
            // to avoid race conditions, include all possible needed files
            require_once 'PEAR/Task/Common.php';
            require_once 'PEAR/Task/Replace.php';
            require_once 'PEAR/Task/Unixeol.php';
            require_once 'PEAR/Task/Windowseol.php';
            require_once 'PEAR/PackageFile/v1.php';
            require_once 'PEAR/PackageFile/v2.php';
            require_once 'PEAR/PackageFile/Generator/v1.php';
            require_once 'PEAR/PackageFile/Generator/v2.php';
        }

        $filelist = $this->_registry->packageInfo($package, 'filelist', $channel);
        if ($filelist == null) {
            return $this->raiseError("$channel/$package not installed");
        }

        $ret = array();
        foreach ($filelist as $file => $props) {
            if (empty($props['installed_as'])) {
                continue;
            }

            $path = $props['installed_as'];
            if ($backup) {
                $this->addFileOperation('backup', array($path));
                $ret[] = $path;
            }

            $this->addFileOperation('delete', array($path));
        }

        if ($backup) {
            return $ret;
        }

        return true;
    }

    // }}}
    // {{{ _installFile()

    /**
     * @param string filename
     * @param array attributes from <file> tag in package.xml
     * @param string path to install the file in
     * @param array options from command-line
     * @access private
     */
    function _installFile($file, $atts, $tmp_path, $options)
    {
        // {{{ return if this file is meant for another platform
        static $os;
        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        if (isset($atts['platform'])) {
            if (empty($os)) {
                $os = new OS_Guess();
            }

            if (strlen($atts['platform']) && $atts['platform'][0] == '!') {
                $negate   = true;
                $platform = substr($atts['platform'], 1);
            } else {
                $negate    = false;
                $platform = $atts['platform'];
            }

            if ((bool) $os->matchSignature($platform) === $negate) {
                $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")");
                return PEAR_INSTALLER_SKIPPED;
            }
        }
        // }}}

        $channel = $this->pkginfo->getChannel();
        // {{{ assemble the destination paths
        switch ($atts['role']) {
            case 'src':
            case 'extsrc':
                $this->source_files++;
                return;
            case 'doc':
            case 'data':
            case 'test':
                $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel) .
                            DIRECTORY_SEPARATOR . $this->pkginfo->getPackage();
                unset($atts['baseinstalldir']);
                break;
            case 'ext':
            case 'php':
                $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel);
                break;
            case 'script':
                $dest_dir = $this->config->get('bin_dir', null, $channel);
                break;
            default:
                return $this->raiseError("Invalid role `$atts[role]' for file $file");
        }

        $save_destdir = $dest_dir;
        if (!empty($atts['baseinstalldir'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
        }

        if (dirname($file) != '.' && empty($atts['install-as'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
        }

        if (empty($atts['install-as'])) {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
        } else {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as'];
        }
        $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;

        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    array($dest_file, $orig_file));
        $final_dest_file = $installed_as = $dest_file;
        if (isset($this->_options['packagingroot'])) {
            $installedas_dest_dir  = dirname($final_dest_file);
            $installedas_dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
            $final_dest_file = $this->_prependPath($final_dest_file, $this->_options['packagingroot']);
        } else {
            $installedas_dest_dir  = dirname($final_dest_file);
            $installedas_dest_file = $installedas_dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        }

        $dest_dir  = dirname($final_dest_file);
        $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) {
            return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED);
        }
        // }}}

        if (empty($this->_options['register-only']) &&
              (!file_exists($dest_dir) || !is_dir($dest_dir))) {
            if (!$this->mkDirHier($dest_dir)) {
                return $this->raiseError("failed to mkdir $dest_dir",
                                         PEAR_INSTALLER_FAILED);
            }
            $this->log(3, "+ mkdir $dest_dir");
        }

        // pretty much nothing happens if we are only registering the install
        if (empty($this->_options['register-only'])) {
            if (empty($atts['replacements'])) {
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                if (!@copy($orig_file, $dest_file)) {
                    return $this->raiseError(
                        "failed to write $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $orig_file $dest_file");
                if (isset($atts['md5sum'])) {
                    $md5sum = md5_file($dest_file);
                }
            } else {
                // {{{ file with replacements
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                $contents = file_get_contents($orig_file);
                if ($contents === false) {
                    $contents = '';
                }

                if (isset($atts['md5sum'])) {
                    $md5sum = md5($contents);
                }

                $subst_from = $subst_to = array();
                foreach ($atts['replacements'] as $a) {
                    $to = '';
                    if ($a['type'] == 'php-const') {
                        if (preg_match('/^[a-z0-9_]+\\z/i', $a['to'])) {
                            eval("\$to = $a[to];");
                        } else {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid php-const replacement: $a[to]");
                            }
                            continue;
                        }
                    } elseif ($a['type'] == 'pear-config') {
                        if ($a['to'] == 'master_server') {
                            $chan = $this->_registry->getChannel($channel);
                            if (!PEAR::isError($chan)) {
                                $to = $chan->getServer();
                            } else {
                                $to = $this->config->get($a['to'], null, $channel);
                            }
                        } else {
                            $to = $this->config->get($a['to'], null, $channel);
                        }
                        if (is_null($to)) {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid pear-config replacement: $a[to]");
                            }
                            continue;
                        }
                    } elseif ($a['type'] == 'package-info') {
                        if ($t = $this->pkginfo->packageInfo($a['to'])) {
                            $to = $t;
                        } else {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid package-info replacement: $a[to]");
                            }
                            continue;
                        }
                    }
                    if (!is_null($to)) {
                        $subst_from[] = $a['from'];
                        $subst_to[] = $to;
                    }
                }

                $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file");
                if (sizeof($subst_from)) {
                    $contents = str_replace($subst_from, $subst_to, $contents);
                }

                $wp = @fopen($dest_file, "wb");
                if (!is_resource($wp)) {
                    return $this->raiseError(
                        "failed to create $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                if (@fwrite($wp, $contents) === false) {
                    return $this->raiseError(
                        "failed writing to $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                fclose($wp);
                // }}}
            }

            // {{{ check the md5
            if (isset($md5sum)) {
                if (strtolower($md5sum) === strtolower($atts['md5sum'])) {
                    $this->log(2, "md5sum ok: $final_dest_file");
                } else {
                    if (empty($options['force'])) {
                        // delete the file
                        if (file_exists($dest_file)) {
                            unlink($dest_file);
                        }

                        if (!isset($options['ignore-errors'])) {
                            return $this->raiseError("bad md5sum for file $final_dest_file",
                                                 PEAR_INSTALLER_FAILED);
                        }

                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    } else {
                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    }
                }
            }
            // }}}
            // {{{ set file permissions
            if (!OS_WINDOWS) {
                if ($atts['role'] == 'script') {
                    $mode = 0777 & ~(int)octdec($this->config->get('umask'));
                    $this->log(3, "+ chmod +x $dest_file");
                } else {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                }

                if ($atts['role'] != 'src') {
                    $this->addFileOperation("chmod", array($mode, $dest_file));
                    if (!@chmod($dest_file, $mode)) {
                        if (!isset($options['soft'])) {
                            $this->log(0, "failed to change mode of $dest_file: " .
                                          error_get_last()["message"]);
                        }
                    }
                }
            }
            // }}}

            if ($atts['role'] == 'src') {
                rename($dest_file, $final_dest_file);
                $this->log(2, "renamed source file $dest_file to $final_dest_file");
            } else {
                $this->addFileOperation("rename", array($dest_file, $final_dest_file,
                    $atts['role'] == 'ext'));
            }
        }

        // Store the full path where the file was installed for easy unistall
        if ($atts['role'] != 'script') {
            $loc = $this->config->get($atts['role'] . '_dir');
        } else {
            $loc = $this->config->get('bin_dir');
        }

        if ($atts['role'] != 'src') {
            $this->addFileOperation("installed_as", array($file, $installed_as,
                                    $loc,
                                    dirname(substr($installedas_dest_file, strlen($loc)))));
        }

        //$this->log(2, "installed: $dest_file");
        return PEAR_INSTALLER_OK;
    }

    // }}}
    // {{{ _installFile2()

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param string filename
     * @param array attributes from <file> tag in package.xml
     * @param string path to install the file in
     * @param array options from command-line
     * @access private
     */
    function _installFile2(&$pkg, $file, &$real_atts, $tmp_path, $options)
    {
        $atts = $real_atts;
        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        $channel = $pkg->getChannel();
        // {{{ assemble the destination paths
        if (!in_array($atts['attribs']['role'],
              PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
            return $this->raiseError('Invalid role `' . $atts['attribs']['role'] .
                    "' for file $file");
        }

        $role = &PEAR_Installer_Role::factory($pkg, $atts['attribs']['role'], $this->config);
        $err  = $role->setup($this, $pkg, $atts['attribs'], $file);
        if (PEAR::isError($err)) {
            return $err;
        }

        if (!$role->isInstallable()) {
            return;
        }

        $info = $role->processInstallation($pkg, $atts['attribs'], $file, $tmp_path);
        if (PEAR::isError($info)) {
            return $info;
        }

        list($save_destdir, $dest_dir, $dest_file, $orig_file) = $info;
        if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) {
            return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED);
        }

        $final_dest_file = $installed_as = $dest_file;
        if (isset($this->_options['packagingroot'])) {
            $final_dest_file = $this->_prependPath($final_dest_file,
                $this->_options['packagingroot']);
        }

        $dest_dir  = dirname($final_dest_file);
        $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        // }}}

        if (empty($this->_options['register-only'])) {
            if (!file_exists($dest_dir) || !is_dir($dest_dir)) {
                if (!$this->mkDirHier($dest_dir)) {
                    return $this->raiseError("failed to mkdir $dest_dir",
                                             PEAR_INSTALLER_FAILED);
                }
                $this->log(3, "+ mkdir $dest_dir");
            }
        }

        $attribs = $atts['attribs'];
        unset($atts['attribs']);
        // pretty much nothing happens if we are only registering the install
        if (empty($this->_options['register-only'])) {
            if (!count($atts)) { // no tasks
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                if (!@copy($orig_file, $dest_file)) {
                    return $this->raiseError(
                        "failed to write $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $orig_file $dest_file");
                if (isset($attribs['md5sum'])) {
                    $md5sum = md5_file($dest_file);
                }
            } else { // file with tasks
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                $contents = file_get_contents($orig_file);
                if ($contents === false) {
                    $contents = '';
                }

                if (isset($attribs['md5sum'])) {
                    $md5sum = md5($contents);
                }

                foreach ($atts as $tag => $raw) {
                    $tag = str_replace(array($pkg->getTasksNs() . ':', '-'), array('', '_'), $tag);
                    $task = "PEAR_Task_$tag";
                    $task = new $task($this->config, $this, PEAR_TASK_INSTALL);
                    if (!$task->isScript()) { // scripts are only handled after installation
                        $task->init($raw, $attribs, $pkg->getLastInstalledVersion());
                        $res = $task->startSession($pkg, $contents, $final_dest_file);
                        if ($res === false) {
                            continue; // skip this file
                        }

                        if (PEAR::isError($res)) {
                            return $res;
                        }

                        $contents = $res; // save changes
                    }

                    $wp = @fopen($dest_file, "wb");
                    if (!is_resource($wp)) {
                        return $this->raiseError(
                            "failed to create $dest_file: " . error_get_last()["message"],
                            PEAR_INSTALLER_FAILED);
                    }

                    if (fwrite($wp, $contents) === false) {
                        return $this->raiseError(
                            "failed writing to $dest_file: " . error_get_last()["message"],
                            PEAR_INSTALLER_FAILED);
                    }

                    fclose($wp);
                }
            }

            // {{{ check the md5
            if (isset($md5sum)) {
                // Make sure the original md5 sum matches with expected
                if (strtolower($md5sum) === strtolower($attribs['md5sum'])) {
                    $this->log(2, "md5sum ok: $final_dest_file");

                    if (isset($contents)) {
                        // set md5 sum based on $content in case any tasks were run.
                        $real_atts['attribs']['md5sum'] = md5($contents);
                    }
                } else {
                    if (empty($options['force'])) {
                        // delete the file
                        if (file_exists($dest_file)) {
                            unlink($dest_file);
                        }

                        if (!isset($options['ignore-errors'])) {
                            return $this->raiseError("bad md5sum for file $final_dest_file",
                                                     PEAR_INSTALLER_FAILED);
                        }

                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    } else {
                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    }
                }
            } else {
                $real_atts['attribs']['md5sum'] = md5_file($dest_file);
            }

            // }}}
            // {{{ set file permissions
            if (!OS_WINDOWS) {
                if ($role->isExecutable()) {
                    $mode = 0777 & ~(int)octdec($this->config->get('umask'));
                    $this->log(3, "+ chmod +x $dest_file");
                } else {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                }

                if ($attribs['role'] != 'src') {
                    $this->addFileOperation("chmod", array($mode, $dest_file));
                    if (!@chmod($dest_file, $mode)) {
                        if (!isset($options['soft'])) {
                            $this->log(0, "failed to change mode of $dest_file: " .
                                          error_get_last()["message"]);
                        }
                    }
                }
            }
            // }}}

            if ($attribs['role'] == 'src') {
                rename($dest_file, $final_dest_file);
                $this->log(2, "renamed source file $dest_file to $final_dest_file");
            } else {
                $this->addFileOperation("rename", array($dest_file, $final_dest_file, $role->isExtension()));
            }
        }

        // Store the full path where the file was installed for easy uninstall
        if ($attribs['role'] != 'src') {
            $loc = $this->config->get($role->getLocationConfig(), null, $channel);
            $this->addFileOperation('installed_as', array($file, $installed_as,
                                $loc,
                                dirname(substr($installed_as, strlen($loc)))));
        }

        //$this->log(2, "installed: $dest_file");
        return PEAR_INSTALLER_OK;
    }

    // }}}
    // {{{ addFileOperation()

    /**
     * Add a file operation to the current file transaction.
     *
     * @see startFileTransaction()
     * @param string $type This can be one of:
     *    - rename:  rename a file ($data has 3 values)
     *    - backup:  backup an existing file ($data has 1 value)
     *    - removebackup:  clean up backups created during install ($data has 1 value)
     *    - chmod:   change permissions on a file ($data has 2 values)
     *    - delete:  delete a file ($data has 1 value)
     *    - rmdir:   delete a directory if empty ($data has 1 value)
     *    - installed_as: mark a file as installed ($data has 4 values).
     * @param array $data For all file operations, this array must contain the
     *    full path to the file or directory that is being operated on.  For
     *    the rename command, the first parameter must be the file to rename,
     *    the second its new name, the third whether this is a PHP extension.
     *
     *    The installed_as operation contains 4 elements in this order:
     *    1. Filename as listed in the filelist element from package.xml
     *    2. Full path to the installed file
     *    3. Full path from the php_dir configuration variable used in this
     *       installation
     *    4. Relative path from the php_dir that this file is installed in
     */
    function addFileOperation($type, $data)
    {
        if (!is_array($data)) {
            return $this->raiseError('Internal Error: $data in addFileOperation'
                . ' must be an array, was ' . gettype($data));
        }

        if ($type == 'chmod') {
            $octmode = decoct($data[0]);
            $this->log(3, "adding to transaction: $type $octmode $data[1]");
        } else {
            $this->log(3, "adding to transaction: $type " . implode(" ", $data));
        }
        $this->file_operations[] = array($type, $data);
    }

    // }}}
    // {{{ startFileTransaction()

    function startFileTransaction($rollback_in_case = false)
    {
        if (count($this->file_operations) && $rollback_in_case) {
            $this->rollbackFileTransaction();
        }
        $this->file_operations = array();
    }

    // }}}
    // {{{ commitFileTransaction()

    function commitFileTransaction()
    {
        // {{{ first, check permissions and such manually
        $errors = array();
        foreach ($this->file_operations as $key => $tr) {
            list($type, $data) = $tr;
            switch ($type) {
                case 'rename':
                    if (!file_exists($data[0])) {
                        $errors[] = "cannot rename file $data[0], doesn't exist";
                    }

                    // check that dest dir. is writable
                    if (!is_writable(dirname($data[1]))) {
                        $errors[] = "permission denied ($type): $data[1]";
                    }
                    break;
                case 'chmod':
                    // check that file is writable
                    if (!is_writable($data[1])) {
                        $errors[] = "permission denied ($type): $data[1] " . decoct($data[0]);
                    }
                    break;
                case 'delete':
                    if (!file_exists($data[0])) {
                        $this->log(2, "warning: file $data[0] doesn't exist, can't be deleted");
                    }
                    // check that directory is writable
                    if (file_exists($data[0])) {
                        if (!is_writable(dirname($data[0]))) {
                            $errors[] = "permission denied ($type): $data[0]";
                        } else {
                            // make sure the file to be deleted can be opened for writing
                            $fp = false;
                            if (!is_dir($data[0]) &&
                                  (!is_writable($data[0]) || !($fp = @fopen($data[0], 'a')))) {
                                $errors[] = "permission denied ($type): $data[0]";
                            } elseif ($fp) {
                                fclose($fp);
                            }
                        }

                        /* Verify we are not deleting a file owned by another package
                         * This can happen when a file moves from package A to B in
                         * an upgrade ala http://pear.php.net/17986
                         */
                        $info = array(
                            'package' => strtolower($this->pkginfo->getName()),
                            'channel' => strtolower($this->pkginfo->getChannel()),
                        );
                        $result = $this->_registry->checkFileMap($data[0], $info, '1.1');
                        if (is_array($result)) {
                            $res = array_diff($result, $info);
                            if (!empty($res)) {
                                $new = $this->_registry->getPackage($result[1], $result[0]);
                                $this->file_operations[$key] = false;
                                $pkginfoName = $this->pkginfo->getName();
                                $newChannel  = $new->getChannel();
                                $newPackage  = $new->getName();
                                $this->log(3, "file $data[0] was scheduled for removal from $pkginfoName but is owned by $newChannel/$newPackage, removal has been cancelled.");
                            }
                        }
                    }
                    break;
            }

        }
        // }}}

        $n = count($this->file_operations);
        $this->log(2, "about to commit $n file operations for " . $this->pkginfo->getName());

        $m = count($errors);
        if ($m > 0) {
            foreach ($errors as $error) {
                if (!isset($this->_options['soft'])) {
                    $this->log(1, $error);
                }
            }

            if (!isset($this->_options['ignore-errors'])) {
                return false;
            }
        }

        $this->_dirtree = array();
        // {{{ really commit the transaction
        foreach ($this->file_operations as $i => $tr) {
            if (!$tr) {
                // support removal of non-existing backups
                continue;
            }

            list($type, $data) = $tr;
            switch ($type) {
                case 'backup':
                    if (!file_exists($data[0])) {
                        $this->file_operations[$i] = false;
                        break;
                    }

                    if (!@copy($data[0], $data[0] . '.bak')) {
                        $this->log(1, 'Could not copy ' . $data[0] . ' to ' . $data[0] .
                            '.bak ' . error_get_last()["message"]);
                        return false;
                    }
                    $this->log(3, "+ backup $data[0] to $data[0].bak");
                    break;
                case 'removebackup':
                    if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) {
                        unlink($data[0] . '.bak');
                        $this->log(3, "+ rm backup of $data[0] ($data[0].bak)");
                    }
                    break;
                case 'rename':
                    $test = file_exists($data[1]) ? @unlink($data[1]) : null;
                    if (!$test && file_exists($data[1])) {
                        if ($data[2]) {
                            $extra = ', this extension must be installed manually.  Rename to "' .
                                basename($data[1]) . '"';
                        } else {
                            $extra = '';
                        }

                        if (!isset($this->_options['soft'])) {
                            $this->log(1, 'Could not delete ' . $data[1] . ', cannot rename ' .
                                $data[0] . $extra);
                        }

                        if (!isset($this->_options['ignore-errors'])) {
                            return false;
                        }
                    }

                    // permissions issues with rename - copy() is far superior
                    $perms = @fileperms($data[0]);
                    if (!@copy($data[0], $data[1])) {
                        $this->log(1, 'Could not rename ' . $data[0] . ' to ' . $data[1] .
                            ' ' . error_get_last()["message"]);
                        return false;
                    }

                    // copy over permissions, otherwise they are lost
                    @chmod($data[1], $perms);
                    @unlink($data[0]);
                    $this->log(3, "+ mv $data[0] $data[1]");
                    break;
                case 'chmod':
                    if (!@chmod($data[1], $data[0])) {
                        $this->log(1, 'Could not chmod ' . $data[1] . ' to ' .
                            decoct($data[0]) . ' ' . error_get_last()["message"]);
                        return false;
                    }

                    $octmode = decoct($data[0]);
                    $this->log(3, "+ chmod $octmode $data[1]");
                    break;
                case 'delete':
                    if (file_exists($data[0])) {
                        if (!@unlink($data[0])) {
                            $this->log(1, 'Could not delete ' . $data[0] . ' ' .
                                error_get_last()["message"]);
                            return false;
                        }
                        $this->log(3, "+ rm $data[0]");
                    }
                    break;
                case 'rmdir':
                    if (file_exists($data[0])) {
                        do {
                            $testme = opendir($data[0]);
                            while (false !== ($entry = readdir($testme))) {
                                if ($entry == '.' || $entry == '..') {
                                    continue;
                                }
                                closedir($testme);
                                break 2; // this directory is not empty and can't be
                                         // deleted
                            }

                            closedir($testme);
                            if (!@rmdir($data[0])) {
                                $this->log(1, 'Could not rmdir ' . $data[0] . ' ' .
                                    error_get_last()["message"]);
                                return false;
                            }
                            $this->log(3, "+ rmdir $data[0]");
                        } while (false);
                    }
                    break;
                case 'installed_as':
                    $this->pkginfo->setInstalledAs($data[0], $data[1]);
                    if (!isset($this->_dirtree[dirname($data[1])])) {
                        $this->_dirtree[dirname($data[1])] = true;
                        $this->pkginfo->setDirtree(dirname($data[1]));

                        while(!empty($data[3]) && dirname($data[3]) != $data[3] &&
                                $data[3] != '/' && $data[3] != '\\') {
                            $this->pkginfo->setDirtree($pp =
                                $this->_prependPath($data[3], $data[2]));
                            $this->_dirtree[$pp] = true;
                            $data[3] = dirname($data[3]);
                        }
                    }
                    break;
            }
        }
        // }}}
        $this->log(2, "successfully committed $n file operations");
        $this->file_operations = array();
        return true;
    }

    // }}}
    // {{{ rollbackFileTransaction()

    function rollbackFileTransaction()
    {
        $n = count($this->file_operations);
        $this->log(2, "rolling back $n file operations");
        foreach ($this->file_operations as $tr) {
            list($type, $data) = $tr;
            switch ($type) {
                case 'backup':
                    if (file_exists($data[0] . '.bak')) {
                        if (file_exists($data[0] && is_writable($data[0]))) {
                            unlink($data[0]);
                        }
                        @copy($data[0] . '.bak', $data[0]);
                        $this->log(3, "+ restore $data[0] from $data[0].bak");
                    }
                    break;
                case 'removebackup':
                    if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) {
                        unlink($data[0] . '.bak');
                        $this->log(3, "+ rm backup of $data[0] ($data[0].bak)");
                    }
                    break;
                case 'rename':
                    @unlink($data[0]);
                    $this->log(3, "+ rm $data[0]");
                    break;
                case 'mkdir':
                    @rmdir($data[0]);
                    $this->log(3, "+ rmdir $data[0]");
                    break;
                case 'chmod':
                    break;
                case 'delete':
                    break;
                case 'installed_as':
                    $this->pkginfo->setInstalledAs($data[0], false);
                    break;
            }
        }
        $this->pkginfo->resetDirtree();
        $this->file_operations = array();
    }

    // }}}
    // {{{ mkDirHier($dir)

    function mkDirHier($dir)
    {
        $this->addFileOperation('mkdir', array($dir));
        return parent::mkDirHier($dir);
    }

    // }}}
    // {{{ _parsePackageXml()

    function _parsePackageXml(&$descfile)
    {
        // Parse xml file -----------------------------------------------
        $pkg = new PEAR_PackageFile($this->config, $this->debug);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $p = &$pkg->fromAnyFile($descfile, PEAR_VALIDATE_INSTALLING);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($p)) {
            if (is_array($p->getUserInfo())) {
                foreach ($p->getUserInfo() as $err) {
                    $loglevel = $err['level'] == 'error' ? 0 : 1;
                    if (!isset($this->_options['soft'])) {
                        $this->log($loglevel, ucfirst($err['level']) . ': ' . $err['message']);
                    }
                }
            }
            return $this->raiseError('Installation failed: invalid package file');
        }

        $descfile = $p->getPackageFile();
        return $p;
    }

    // }}}
    /**
     * Set the list of PEAR_Downloader_Package objects to allow more sane
     * dependency validation
     * @param array
     */
    function setDownloadedPackages(&$pkgs)
    {
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->analyzeDependencies($pkgs);
        PEAR::popErrorHandling();
        if (PEAR::isError($err)) {
            return $err;
        }
        $this->_downloadedPackages = &$pkgs;
    }

    /**
     * Set the list of PEAR_Downloader_Package objects to allow more sane
     * dependency validation
     * @param array
     */
    function setUninstallPackages(&$pkgs)
    {
        $this->_downloadedPackages = &$pkgs;
    }

    function getInstallPackages()
    {
        return $this->_downloadedPackages;
    }

    // {{{ install()

    /**
     * Installs the files within the package file specified.
     *
     * @param string|PEAR_Downloader_Package $pkgfile path to the package file,
     *        or a pre-initialized packagefile object
     * @param array $options
     * recognized options:
     * - installroot   : optional prefix directory for installation
     * - force         : force installation
     * - register-only : update registry but don't install files
     * - upgrade       : upgrade existing install
     * - soft          : fail silently
     * - nodeps        : ignore dependency conflicts/missing dependencies
     * - alldeps       : install all dependencies
     * - onlyreqdeps   : install only required dependencies
     *
     * @return array|PEAR_Error package info if successful
     */
    function install($pkgfile, $options = array())
    {
        $this->_options = $options;
        $this->_registry = &$this->config->getRegistry();
        if (is_object($pkgfile)) {
            $dlpkg    = &$pkgfile;
            $pkg      = $pkgfile->getPackageFile();
            $pkgfile  = $pkg->getArchiveFile();
            $descfile = $pkg->getPackageFile();
        } else {
            $descfile = $pkgfile;
            $pkg      = $this->_parsePackageXml($descfile);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
        }

        $tmpdir = dirname($descfile);
        if (realpath($descfile) != realpath($pkgfile)) {
            // Use the temp_dir since $descfile can contain the download dir path
            $tmpdir = $this->config->get('temp_dir', null, 'pear.php.net');
            $tmpdir = System::mktemp('-d -t "' . $tmpdir . '"');

            $tar = new Archive_Tar($pkgfile);
            if (!$tar->extract($tmpdir)) {
                return $this->raiseError("unable to unpack $pkgfile");
            }
        }

        $pkgname = $pkg->getName();
        $channel = $pkg->getChannel();

        if (isset($options['installroot'])) {
            $this->config->setInstallRoot($options['installroot']);
            $this->_registry = &$this->config->getRegistry();
            $installregistry = &$this->_registry;
            $this->installroot = ''; // all done automagically now
            $php_dir = $this->config->get('php_dir', null, $channel);
        } else {
            $this->config->setInstallRoot(false);
            $this->_registry = &$this->config->getRegistry();
            if (isset($this->_options['packagingroot'])) {
                $regdir = $this->_prependPath(
                    $this->config->get('php_dir', null, 'pear.php.net'),
                    $this->_options['packagingroot']);

                $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net');
                if ($metadata_dir) {
                    $metadata_dir = $this->_prependPath(
                        $metadata_dir,
                        $this->_options['packagingroot']);
                }
                $packrootphp_dir = $this->_prependPath(
                    $this->config->get('php_dir', null, $channel),
                    $this->_options['packagingroot']);

                $installregistry = new PEAR_Registry($regdir, false, false, $metadata_dir);
                if (!$installregistry->channelExists($channel, true)) {
                    // we need to fake a channel-discover of this channel
                    $chanobj = $this->_registry->getChannel($channel, true);
                    $installregistry->addChannel($chanobj);
                }
                $php_dir = $packrootphp_dir;
            } else {
                $installregistry = &$this->_registry;
                $php_dir = $this->config->get('php_dir', null, $channel);
            }
            $this->installroot = '';
        }

        // {{{ checks to do when not in "force" mode
        if (empty($options['force']) &&
              (file_exists($this->config->get('php_dir')) &&
               is_dir($this->config->get('php_dir')))) {
            $testp = $channel == 'pear.php.net' ? $pkgname : array($channel, $pkgname);
            $instfilelist = $pkg->getInstallationFileList(true);
            if (PEAR::isError($instfilelist)) {
                return $instfilelist;
            }

            // ensure we have the most accurate registry
            $installregistry->flushFileMap();
            $test = $installregistry->checkFileMap($instfilelist, $testp, '1.1');
            if (PEAR::isError($test)) {
                return $test;
            }

            if (sizeof($test)) {
                $pkgs = $this->getInstallPackages();
                $found = false;
                foreach ($pkgs as $param) {
                    if ($pkg->isSubpackageOf($param)) {
                        $found = true;
                        break;
                    }
                }

                if ($found) {
                    // subpackages can conflict with earlier versions of parent packages
                    $parentreg = $installregistry->packageInfo($param->getPackage(), null, $param->getChannel());
                    $tmp = $test;
                    foreach ($tmp as $file => $info) {
                        if (is_array($info)) {
                            if (strtolower($info[1]) == strtolower($param->getPackage()) &&
                                  strtolower($info[0]) == strtolower($param->getChannel())
                            ) {
                                if (isset($parentreg['filelist'][$file])) {
                                    unset($parentreg['filelist'][$file]);
                                } else{
                                    $pos     = strpos($file, '/');
                                    $basedir = substr($file, 0, $pos);
                                    $file2   = substr($file, $pos + 1);
                                    if (isset($parentreg['filelist'][$file2]['baseinstalldir'])
                                        && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir
                                    ) {
                                        unset($parentreg['filelist'][$file2]);
                                    }
                                }

                                unset($test[$file]);
                            }
                        } else {
                            if (strtolower($param->getChannel()) != 'pear.php.net') {
                                continue;
                            }

                            if (strtolower($info) == strtolower($param->getPackage())) {
                                if (isset($parentreg['filelist'][$file])) {
                                    unset($parentreg['filelist'][$file]);
                                } else{
                                    $pos     = strpos($file, '/');
                                    $basedir = substr($file, 0, $pos);
                                    $file2   = substr($file, $pos + 1);
                                    if (isset($parentreg['filelist'][$file2]['baseinstalldir'])
                                        && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir
                                    ) {
                                        unset($parentreg['filelist'][$file2]);
                                    }
                                }

                                unset($test[$file]);
                            }
                        }
                    }

                    $pfk = new PEAR_PackageFile($this->config);
                    $parentpkg = &$pfk->fromArray($parentreg);
                    $installregistry->updatePackage2($parentpkg);
                }

                if ($param->getChannel() == 'pecl.php.net' && isset($options['upgrade'])) {
                    $tmp = $test;
                    foreach ($tmp as $file => $info) {
                        if (is_string($info)) {
                            // pear.php.net packages are always stored as strings
                            if (strtolower($info) == strtolower($param->getPackage())) {
                                // upgrading existing package
                                unset($test[$file]);
                            }
                        }
                    }
                }

                if (count($test)) {
                    $msg = "$channel/$pkgname: conflicting files found:\n";
                    $longest = max(array_map("strlen", array_keys($test)));
                    $fmt = "%{$longest}s (%s)\n";
                    foreach ($test as $file => $info) {
                        if (!is_array($info)) {
                            $info = array('pear.php.net', $info);
                        }
                        $info = $info[0] . '/' . $info[1];
                        $msg .= sprintf($fmt, $file, $info);
                    }

                    if (!isset($options['ignore-errors'])) {
                        return $this->raiseError($msg);
                    }

                    if (!isset($options['soft'])) {
                        $this->log(0, "WARNING: $msg");
                    }
                }
            }
        }
        // }}}

        $this->startFileTransaction();

        $usechannel = $channel;
        if ($channel == 'pecl.php.net') {
            $test = $installregistry->packageExists($pkgname, $channel);
            if (!$test) {
                $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                $usechannel = 'pear.php.net';
            }
        } else {
            $test = $installregistry->packageExists($pkgname, $channel);
        }

        if (empty($options['upgrade']) && empty($options['soft'])) {
            // checks to do only when installing new packages
            if (empty($options['force']) && $test) {
                return $this->raiseError("$channel/$pkgname is already installed");
            }
        } else {
            // Upgrade
            if ($test) {
                $v1 = $installregistry->packageInfo($pkgname, 'version', $usechannel);
                $v2 = $pkg->getVersion();
                $cmp = version_compare("$v1", "$v2", 'gt');
                if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) {
                    return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)");
                }
            }
        }

        // Do cleanups for upgrade and install, remove old release's files first
        if ($test && empty($options['register-only'])) {
            // when upgrading, remove old release's files first:
            if (PEAR::isError($err = $this->_deletePackageFiles($pkgname, $usechannel,
                  true))) {
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError($err);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: ' . $err->getMessage());
                }
            } else {
                $backedup = $err;
            }
        }

        // {{{ Copy files to dest dir ---------------------------------------

        // info from the package it self we want to access from _installFile
        $this->pkginfo = &$pkg;
        // used to determine whether we should build any C code
        $this->source_files = 0;

        $savechannel = $this->config->get('default_channel');
        if (empty($options['register-only']) && !is_dir($php_dir)) {
            if (PEAR::isError(System::mkdir(array('-p'), $php_dir))) {
                return $this->raiseError("no installation destination directory '$php_dir'\n");
            }
        }

        if (substr($pkgfile, -4) != '.xml') {
            $tmpdir .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkg->getVersion();
        }

        $this->configSet('default_channel', $channel);
        // {{{ install files

        $ver = $pkg->getPackagexmlVersion();
        if (version_compare($ver, '2.0', '>=')) {
            $filelist = $pkg->getInstallationFilelist();
        } else {
            $filelist = $pkg->getFileList();
        }

        if (PEAR::isError($filelist)) {
            return $filelist;
        }

        $p = &$installregistry->getPackage($pkgname, $channel);
        $dirtree = (empty($options['register-only']) && $p) ? $p->getDirTree() : false;

        $pkg->resetFilelist();
        $pkg->setLastInstalledVersion($installregistry->packageInfo($pkg->getPackage(),
            'version', $pkg->getChannel()));
        foreach ($filelist as $file => $atts) {
            $this->expectError(PEAR_INSTALLER_FAILED);
            if ($pkg->getPackagexmlVersion() == '1.0') {
                $res = $this->_installFile($file, $atts, $tmpdir, $options);
            } else {
                $res = $this->_installFile2($pkg, $file, $atts, $tmpdir, $options);
            }
            $this->popExpect();

            if (PEAR::isError($res)) {
                if (empty($options['ignore-errors'])) {
                    $this->rollbackFileTransaction();
                    if ($res->getMessage() == "file does not exist") {
                        $this->raiseError("file $file in package.xml does not exist");
                    }

                    return $this->raiseError($res);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, "Warning: " . $res->getMessage());
                }
            }

            $real = isset($atts['attribs']) ? $atts['attribs'] : $atts;
            if ($res == PEAR_INSTALLER_OK && $real['role'] != 'src') {
                // Register files that were installed
                $pkg->installedFile($file, $atts);
            }
        }
        // }}}

        // {{{ compile and install source files
        if ($this->source_files > 0 && empty($options['nobuild'])) {
            $configureoptions = empty($options['configureoptions']) ? '' : $options['configureoptions'];
            if (PEAR::isError($err =
                  $this->_compileSourceFiles($savechannel, $pkg, $configureoptions))) {
                return $err;
            }
        }
        // }}}

        if (isset($backedup)) {
            $this->_removeBackups($backedup);
        }

        if (!$this->commitFileTransaction()) {
            $this->rollbackFileTransaction();
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED);
        }
        // }}}

        $ret          = false;
        $installphase = 'install';
        $oldversion   = false;
        // {{{ Register that the package is installed -----------------------
        if (empty($options['upgrade'])) {
            // if 'force' is used, replace the info in registry
            $usechannel = $channel;
            if ($channel == 'pecl.php.net') {
                $test = $installregistry->packageExists($pkgname, $channel);
                if (!$test) {
                    $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                    $usechannel = 'pear.php.net';
                }
            } else {
                $test = $installregistry->packageExists($pkgname, $channel);
            }

            if (!empty($options['force']) && $test) {
                $oldversion = $installregistry->packageInfo($pkgname, 'version', $usechannel);
                $installregistry->deletePackage($pkgname, $usechannel);
            }
            $ret = $installregistry->addPackage2($pkg);
        } else {
            if ($dirtree) {
                $this->startFileTransaction();
                // attempt to delete empty directories
                uksort($dirtree, array($this, '_sortDirs'));
                foreach($dirtree as $dir => $notused) {
                    $this->addFileOperation('rmdir', array($dir));
                }
                $this->commitFileTransaction();
            }

            $usechannel = $channel;
            if ($channel == 'pecl.php.net') {
                $test = $installregistry->packageExists($pkgname, $channel);
                if (!$test) {
                    $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                    $usechannel = 'pear.php.net';
                }
            } else {
                $test = $installregistry->packageExists($pkgname, $channel);
            }

            // new: upgrade installs a package if it isn't installed
            if (!$test) {
                $ret = $installregistry->addPackage2($pkg);
            } else {
                if ($usechannel != $channel) {
                    $installregistry->deletePackage($pkgname, $usechannel);
                    $ret = $installregistry->addPackage2($pkg);
                } else {
                    $ret = $installregistry->updatePackage2($pkg);
                }
                $installphase = 'upgrade';
            }
        }

        if (!$ret) {
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError("Adding package $channel/$pkgname to registry failed");
        }
        // }}}

        $this->configSet('default_channel', $savechannel);
        if (class_exists('PEAR_Task_Common')) { // this is auto-included if any tasks exist
            if (PEAR_Task_Common::hasPostinstallTasks()) {
                PEAR_Task_Common::runPostinstallTasks($installphase);
            }
        }

        return $pkg->toArray(true);
    }

    // }}}

    // {{{ _compileSourceFiles()
    /**
     * @param string
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param mixed[] $configureoptions
     */
    function _compileSourceFiles($savechannel, &$filelist, $configureoptions)
    {
        require_once 'PEAR/Builder.php';
        $this->log(1, "$this->source_files source files, building");
        $bob = new PEAR_Builder($configureoptions, $this->ui);
        $bob->debug = $this->debug;
        $built = $bob->build($filelist, array(&$this, '_buildCallback'));
        if (PEAR::isError($built)) {
            $this->rollbackFileTransaction();
            $this->configSet('default_channel', $savechannel);
            return $built;
        }

        $this->log(1, "\nBuild process completed successfully");
        foreach ($built as $ext) {
            $bn = basename($ext['file']);
            list($_ext_name, $_ext_suff) = explode('.', $bn);
            if ($_ext_suff == 'so' || $_ext_suff == 'dll') {
                if (extension_loaded($_ext_name)) {
                    return $this->raiseError("Extension '$_ext_name' already loaded. " .
                                             'Please unload it in your php.ini file ' .
                                             'prior to install or upgrade');
                }
                $role = 'ext';
            } else {
                $role = 'src';
            }

            $dest = $ext['dest'];
            $packagingroot = '';
            if (isset($this->_options['packagingroot'])) {
                $packagingroot = $this->_options['packagingroot'];
            }

            $copyto = $this->_prependPath($dest, $packagingroot);
            $extra  = $copyto != $dest ? " as '$copyto'" : '';
            $this->log(1, "Installing '$dest'$extra");

            $copydir = dirname($copyto);
            // pretty much nothing happens if we are only registering the install
            if (empty($this->_options['register-only'])) {
                if (!file_exists($copydir) || !is_dir($copydir)) {
                    if (!$this->mkDirHier($copydir)) {
                        return $this->raiseError("failed to mkdir $copydir",
                            PEAR_INSTALLER_FAILED);
                    }

                    $this->log(3, "+ mkdir $copydir");
                }

                if (!@copy($ext['file'], $copyto)) {
                    return $this->raiseError(
                        "failed to write $copyto (" . error_get_last()["message"] . ")",
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $ext[file] $copyto");
                $this->addFileOperation('rename', array($ext['file'], $copyto));
                if (!OS_WINDOWS) {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                    $this->addFileOperation('chmod', array($mode, $copyto));
                    if (!@chmod($copyto, $mode)) {
                        $this->log(0, "failed to change mode of $copyto (" .
                                      error_get_last()["message"] . ")");
                    }
                }
            }


            $data = array(
                'role'         => $role,
                'name'         => $bn,
                'installed_as' => $dest,
                'php_api'      => $ext['php_api'],
                'zend_mod_api' => $ext['zend_mod_api'],
                'zend_ext_api' => $ext['zend_ext_api'],
            );

            if ($filelist->getPackageXmlVersion() == '1.0') {
                $filelist->installedFile($bn, $data);
            } else {
                $filelist->installedFile($bn, array('attribs' => $data));
            }
        }
    }

    // }}}
    function &getUninstallPackages()
    {
        return $this->_downloadedPackages;
    }
    // {{{ uninstall()

    /**
     * Uninstall a package
     *
     * This method removes all files installed by the application, and then
     * removes any empty directories.
     * @param string package name
     * @param array Command-line options.  Possibilities include:
     *
     *              - installroot: base installation dir, if not the default
     *              - register-only : update registry but don't remove files
     *              - nodeps: do not process dependencies of other packages to ensure
     *                        uninstallation does not break things
     */
    function uninstall($package, $options = array())
    {
        $installRoot = isset($options['installroot']) ? $options['installroot'] : '';
        $this->config->setInstallRoot($installRoot);

        $this->installroot = '';
        $this->_registry = &$this->config->getRegistry();
        if (is_object($package)) {
            $channel = $package->getChannel();
            $pkg     = $package;
            $package = $pkg->getPackage();
        } else {
            $pkg = false;
            $info = $this->_registry->parsePackageName($package,
                $this->config->get('default_channel'));
            $channel = $info['channel'];
            $package = $info['package'];
        }

        $savechannel = $this->config->get('default_channel');
        $this->configSet('default_channel', $channel);
        if (!is_object($pkg)) {
            $pkg = $this->_registry->getPackage($package, $channel);
        }

        if (!$pkg) {
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError($this->_registry->parsedPackageNameToString(
                array(
                    'channel' => $channel,
                    'package' => $package
                ), true) . ' not installed');
        }

        if ($pkg->getInstalledBinary()) {
            // this is just an alias for a binary package
            return $this->_registry->deletePackage($package, $channel);
        }

        $filelist = $pkg->getFilelist();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }

        $depchecker = new PEAR_Dependency2($this->config, $options,
            array('channel' => $channel, 'package' => $package),
            PEAR_VALIDATE_UNINSTALLING);
        $e = $depchecker->validatePackageUninstall($this);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($e)) {
            if (!isset($options['ignore-errors'])) {
                return $this->raiseError($e);
            }

            if (!isset($options['soft'])) {
                $this->log(0, 'WARNING: ' . $e->getMessage());
            }
        } elseif (is_array($e)) {
            if (!isset($options['soft'])) {
                $this->log(0, $e[0]);
            }
        }

        $this->pkginfo = &$pkg;
        // pretty much nothing happens if we are only registering the uninstall
        if (empty($options['register-only'])) {
            // {{{ Delete the files
            $this->startFileTransaction();
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            if (PEAR::isError($err = $this->_deletePackageFiles($package, $channel))) {
                PEAR::popErrorHandling();
                $this->rollbackFileTransaction();
                $this->configSet('default_channel', $savechannel);
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError($err);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: ' . $err->getMessage());
                }
            } else {
                PEAR::popErrorHandling();
            }

            if (!$this->commitFileTransaction()) {
                $this->rollbackFileTransaction();
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError("uninstall failed");
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: uninstall failed');
                }
            } else {
                $this->startFileTransaction();
                $dirtree = $pkg->getDirTree();
                if ($dirtree === false) {
                    $this->configSet('default_channel', $savechannel);
                    return $this->_registry->deletePackage($package, $channel);
                }

                // attempt to delete empty directories
                uksort($dirtree, array($this, '_sortDirs'));
                foreach($dirtree as $dir => $notused) {
                    $this->addFileOperation('rmdir', array($dir));
                }

                if (!$this->commitFileTransaction()) {
                    $this->rollbackFileTransaction();
                    if (!isset($options['ignore-errors'])) {
                        return $this->raiseError("uninstall failed");
                    }

                    if (!isset($options['soft'])) {
                        $this->log(0, 'WARNING: uninstall failed');
                    }
                }
            }
            // }}}
        }

        $this->configSet('default_channel', $savechannel);
        // Register that the package is no longer installed
        return $this->_registry->deletePackage($package, $channel);
    }

    /**
     * Sort a list of arrays of array(downloaded packagefilename) by dependency.
     *
     * It also removes duplicate dependencies
     * @param array an array of PEAR_PackageFile_v[1/2] objects
     * @return array|PEAR_Error array of array(packagefilename, package.xml contents)
     */
    function sortPackagesForUninstall(&$packages)
    {
        $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->config);
        if (PEAR::isError($this->_dependencyDB)) {
            return $this->_dependencyDB;
        }
        usort($packages, array(&$this, '_sortUninstall'));
    }

    function _sortUninstall($a, $b)
    {
        if (!$a->getDeps() && !$b->getDeps()) {
            return 0; // neither package has dependencies, order is insignificant
        }
        if ($a->getDeps() && !$b->getDeps()) {
            return -1; // $a must be installed after $b because $a has dependencies
        }
        if (!$a->getDeps() && $b->getDeps()) {
            return 1; // $b must be installed after $a because $b has dependencies
        }
        // both packages have dependencies
        if ($this->_dependencyDB->dependsOn($a, $b)) {
            return -1;
        }
        if ($this->_dependencyDB->dependsOn($b, $a)) {
            return 1;
        }
        return 0;
    }

    // }}}
    // {{{ _sortDirs()
    function _sortDirs($a, $b)
    {
        if (strnatcmp($a, $b) == -1) return 1;
        if (strnatcmp($a, $b) == 1) return -1;
        return 0;
    }

    // }}}

    // {{{ _buildCallback()

    function _buildCallback($what, $data)
    {
        if (($what == 'cmdoutput' && $this->debug > 1) ||
            ($what == 'output' && $this->debug > 0)) {
            $this->ui->outputData(rtrim($data), 'build');
        }
    }

    // }}}
}
pear/PEAR/PackageFile.php000064400000036746151732710130011106 0ustar00<?php
/**
 * PEAR_PackageFile, package.xml parsing utility class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * needed for PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';
/**
 * Error code if the package.xml <package> tag does not contain a valid version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION', 1);
/**
 * Error code if the package.xml <package> tag version is not supported (version 1.0 and 1.1 are the only supported versions,
 * currently
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_PACKAGEVERSION', 2);
/**
 * Abstraction for the package.xml package description file
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile
{
    /**
     * @var PEAR_Config
     */
    var $_config;
    var $_debug;

    var $_logger = false;
    /**
     * @var boolean
     */
    var $_rawReturn = false;

    /**
     * helper for extracting Archive_Tar errors
     * @var array
     * @access private
     */
    var $_extractErrors = array();

    /**
     *
     * @param   PEAR_Config $config
     * @param   ?   $debug
     * @param   string @tmpdir Optional temporary directory for uncompressing
     *          files
     */
    function __construct(&$config, $debug = false)
    {
        $this->_config = $config;
        $this->_debug = $debug;
    }

    /**
     * Turn off validation - return a parsed package.xml without checking it
     *
     * This is used by the package-validate command
     */
    function rawReturn()
    {
        $this->_rawReturn = true;
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    /**
     * Create a PEAR_PackageFile_Parser_v* of a given version.
     * @param   int $version
     * @return  PEAR_PackageFile_Parser_v1|PEAR_PackageFile_Parser_v1
     */
    function &parserFactory($version)
    {
        if (!in_array($version[0], array('1', '2'))) {
            $a = false;
            return $a;
        }

        include_once 'PEAR/PackageFile/Parser/v' . $version[0] . '.php';
        $version = $version[0];
        $class = "PEAR_PackageFile_Parser_v$version";
        $a = new $class;
        return $a;
    }

    /**
     * For simpler unit-testing
     * @return string
     */
    function getClassPrefix()
    {
        return 'PEAR_PackageFile_v';
    }

    /**
     * Create a PEAR_PackageFile_v* of a given version.
     * @param   int $version
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v1
     */
    function &factory($version)
    {
        if (!in_array($version[0], array('1', '2'))) {
            $a = false;
            return $a;
        }

        include_once 'PEAR/PackageFile/v' . $version[0] . '.php';
        $version = $version[0];
        $class = $this->getClassPrefix() . $version;
        $a = new $class;
        return $a;
    }

    /**
     * Create a PEAR_PackageFile_v* from its toArray() method
     *
     * WARNING: no validation is performed, the array is assumed to be valid,
     * always parse from xml if you want validation.
     * @param   array $arr
     * @return PEAR_PackageFileManager_v1|PEAR_PackageFileManager_v2
     * @uses    factory() to construct the returned object.
     */
    function &fromArray($arr)
    {
        if (isset($arr['xsdversion'])) {
            $obj = &$this->factory($arr['xsdversion']);
            if ($this->_logger) {
                $obj->setLogger($this->_logger);
            }

            $obj->setConfig($this->_config);
            $obj->fromArray($arr);
            return $obj;
        }

        if (isset($arr['package']['attribs']['version'])) {
            $obj = &$this->factory($arr['package']['attribs']['version']);
        } else {
            $obj = &$this->factory('1.0');
        }

        if ($this->_logger) {
            $obj->setLogger($this->_logger);
        }

        $obj->setConfig($this->_config);
        $obj->fromArray($arr);
        return $obj;
    }

    /**
     * Create a PEAR_PackageFile_v* from an XML string.
     * @access  public
     * @param   string $data contents of package.xml file
     * @param   int $state package state (one of PEAR_VALIDATE_* constants)
     * @param   string $file full path to the package.xml file (and the files
     *          it references)
     * @param   string $archive optional name of the archive that the XML was
     *          extracted from, if any
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    parserFactory() to construct a parser to load the package.
     */
    function &fromXmlString($data, $state, $file, $archive = false)
    {
        if (preg_match('/<package[^>]+version=[\'"]([0-9]+\.[0-9]+)[\'"]/', $data, $packageversion)) {
            if (!in_array($packageversion[1], array('1.0', '2.0', '2.1'))) {
                return PEAR::raiseError('package.xml version "' . $packageversion[1] .
                    '" is not supported, only 1.0, 2.0, and 2.1 are supported.');
            }

            $object = &$this->parserFactory($packageversion[1]);
            if ($this->_logger) {
                $object->setLogger($this->_logger);
            }

            $object->setConfig($this->_config);
            $pf = $object->parse($data, $file, $archive);
            if (PEAR::isError($pf)) {
                return $pf;
            }

            if ($this->_rawReturn) {
                return $pf;
            }

            if (!$pf->validate($state)) {;
                if ($this->_config->get('verbose') > 0
                    && $this->_logger && $pf->getValidationWarnings(false)
                ) {
                    foreach ($pf->getValidationWarnings(false) as $warning) {
                        $this->_logger->log(0, 'ERROR: ' . $warning['message']);
                    }
                }

                $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
                    2, null, null, $pf->getValidationWarnings());
                return $a;
            }

            if ($this->_logger && $pf->getValidationWarnings(false)) {
                foreach ($pf->getValidationWarnings() as $warning) {
                    $this->_logger->log(0, 'WARNING: ' . $warning['message']);
                }
            }

            if (method_exists($pf, 'flattenFilelist')) {
                $pf->flattenFilelist(); // for v2
            }

            return $pf;
        } elseif (preg_match('/<package[^>]+version=[\'"]([^"\']+)[\'"]/', $data, $packageversion)) {
            $a = PEAR::raiseError('package.xml file "' . $file .
                '" has unsupported package.xml <package> version "' . $packageversion[1] . '"');
            return $a;
        } else {
            if (!class_exists('PEAR_ErrorStack')) {
                require_once 'PEAR/ErrorStack.php';
            }

            PEAR_ErrorStack::staticPush('PEAR_PackageFile',
                PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION,
                'warning', array('xml' => $data), 'package.xml "' . $file .
                    '" has no package.xml <package> version');
            $object = &$this->parserFactory('1.0');
            $object->setConfig($this->_config);
            $pf = $object->parse($data, $file, $archive);
            if (PEAR::isError($pf)) {
                return $pf;
            }

            if ($this->_rawReturn) {
                return $pf;
            }

            if (!$pf->validate($state)) {
                $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
                    2, null, null, $pf->getValidationWarnings());
                return $a;
            }

            if ($this->_logger && $pf->getValidationWarnings(false)) {
                foreach ($pf->getValidationWarnings() as $warning) {
                    $this->_logger->log(0, 'WARNING: ' . $warning['message']);
                }
            }

            if (method_exists($pf, 'flattenFilelist')) {
                $pf->flattenFilelist(); // for v2
            }

            return $pf;
        }
    }

    /**
     * Register a temporary file or directory.  When the destructor is
     * executed, all registered temporary files and directories are
     * removed.
     *
     * @param string  $file  name of file or directory
     * @return  void
     */
    static function addTempFile($file)
    {
        $GLOBALS['_PEAR_Common_tempfiles'][] = $file;
    }

    /**
     * Create a PEAR_PackageFile_v* from a compressed Tar or Tgz file.
     * @access  public
     * @param string contents of package.xml file
     * @param int package state (one of PEAR_VALIDATE_* constants)
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @using   Archive_Tar to extract the files
     * @using   fromPackageFile() to load the package after the package.xml
     *          file is extracted.
     */
    function &fromTgzFile($file, $state)
    {
        if (!class_exists('Archive_Tar')) {
            require_once 'Archive/Tar.php';
        }

        $tar = new Archive_Tar($file);
        if ($this->_debug <= 1) {
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
        }

        $content = $tar->listContent();
        if ($this->_debug <= 1) {
            $tar->popErrorHandling();
        }

        if (!is_array($content)) {
            if (is_string($file) && strlen($file) < 255 &&
                  (!file_exists($file) || !@is_file($file))) {
                $ret = PEAR::raiseError("could not open file \"$file\"");
                return $ret;
            }

            $file = realpath($file);
            $ret = PEAR::raiseError("Could not get contents of package \"$file\"".
                                     '. Invalid tgz file.');
            return $ret;
        }

        if (!count($content) && !@is_file($file)) {
            $ret = PEAR::raiseError("could not open file \"$file\"");
            return $ret;
        }

        $xml      = null;
        $origfile = $file;
        foreach ($content as $file) {
            $name = $file['filename'];
            if ($name == 'package2.xml') { // allow a .tgz to distribute both versions
                $xml = $name;
                break;
            }

            if ($name == 'package.xml') {
                $xml = $name;
                break;
            } elseif (preg_match('/package.xml$/', $name, $match)) {
                $xml = $name;
                break;
            }
        }

        $tmpdir = System::mktemp('-t "' . $this->_config->get('temp_dir') . '" -d pear');
        if ($tmpdir === false) {
            $ret = PEAR::raiseError("there was a problem with getting the configured temp directory");
            return $ret;
        }

        PEAR_PackageFile::addTempFile($tmpdir);

        $this->_extractErrors();
        PEAR::staticPushErrorHandling(PEAR_ERROR_CALLBACK, array($this, '_extractErrors'));

        if (!$xml || !$tar->extractList(array($xml), $tmpdir)) {
            $extra = implode("\n", $this->_extractErrors());
            if ($extra) {
                $extra = ' ' . $extra;
            }

            PEAR::staticPopErrorHandling();
            $ret = PEAR::raiseError('could not extract the package.xml file from "' .
                $origfile . '"' . $extra);
            return $ret;
        }

        PEAR::staticPopErrorHandling();
        $ret = &PEAR_PackageFile::fromPackageFile("$tmpdir/$xml", $state, $origfile);
        return $ret;
    }

    /**
     * helper callback for extracting Archive_Tar errors
     *
     * @param PEAR_Error|null $err
     * @return array
     * @access private
     */
    function _extractErrors($err = null)
    {
        static $errors = array();
        if ($err === null) {
            $e = $errors;
            $errors = array();
            return $e;
        }
        $errors[] = $err->getMessage();
    }

    /**
     * Create a PEAR_PackageFile_v* from a package.xml file.
     *
     * @access public
     * @param   string  $descfile  name of package xml file
     * @param   int     $state package state (one of PEAR_VALIDATE_* constants)
     * @param   string|false $archive name of the archive this package.xml came
     *          from, if any
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    PEAR_PackageFile::fromXmlString to create the oject after the
     *          XML is loaded from the package.xml file.
     */
    function &fromPackageFile($descfile, $state, $archive = false)
    {
        $fp = false;
        if (is_string($descfile) && strlen($descfile) < 255 &&
             (
              !file_exists($descfile) || !is_file($descfile) || !is_readable($descfile)
              || (!$fp = @fopen($descfile, 'r'))
             )
        ) {
            $a = PEAR::raiseError("Unable to open $descfile");
            return $a;
        }

        // read the whole thing so we only get one cdata callback
        // for each block of cdata
        fclose($fp);
        $data = file_get_contents($descfile);
        $ret = &PEAR_PackageFile::fromXmlString($data, $state, $descfile, $archive);
        return $ret;
    }

    /**
     * Create a PEAR_PackageFile_v* from a .tgz archive or package.xml file.
     *
     * This method is able to extract information about a package from a .tgz
     * archive or from a XML package definition file.
     *
     * @access public
     * @param   string  $info file name
     * @param   int     $state package state (one of PEAR_VALIDATE_* constants)
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    fromPackageFile() if the file appears to be XML
     * @uses    fromTgzFile() to load all non-XML files
     */
    function &fromAnyFile($info, $state)
    {
        if (is_dir($info)) {
            $dir_name = realpath($info);
            if (file_exists($dir_name . '/package.xml')) {
                $info = PEAR_PackageFile::fromPackageFile($dir_name .  '/package.xml', $state);
            } elseif (file_exists($dir_name .  '/package2.xml')) {
                $info = PEAR_PackageFile::fromPackageFile($dir_name .  '/package2.xml', $state);
            } else {
                $info = PEAR::raiseError("No package definition found in '$info' directory");
            }

            return $info;
        }

        $fp = false;
        if (is_string($info) && strlen($info) < 255 &&
             (file_exists($info) || ($fp = @fopen($info, 'r')))
        ) {

            if ($fp) {
                fclose($fp);
            }

            $tmp = substr($info, -4);
            if ($tmp == '.xml') {
                $info = &PEAR_PackageFile::fromPackageFile($info, $state);
            } elseif ($tmp == '.tar' || $tmp == '.tgz') {
                $info = &PEAR_PackageFile::fromTgzFile($info, $state);
            } else {
                $fp   = fopen($info, 'r');
                $test = fread($fp, 5);
                fclose($fp);
                if ($test == '<?xml') {
                    $info = &PEAR_PackageFile::fromPackageFile($info, $state);
                } else {
                    $info = &PEAR_PackageFile::fromTgzFile($info, $state);
                }
            }

            return $info;
        }

        $info = PEAR::raiseError("Cannot open '$info' for parsing");
        return $info;
    }
}
pear/PEAR/Registry.php000064400000224270151732710130010552 0ustar00<?php
/**
 * PEAR_Registry
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * for PEAR_Error
 */
require_once 'PEAR.php';
require_once 'PEAR/DependencyDB.php';

define('PEAR_REGISTRY_ERROR_LOCK',         -2);
define('PEAR_REGISTRY_ERROR_FORMAT',       -3);
define('PEAR_REGISTRY_ERROR_FILE',         -4);
define('PEAR_REGISTRY_ERROR_CONFLICT',     -5);
define('PEAR_REGISTRY_ERROR_CHANNEL_FILE', -6);

/**
 * Administration class used to maintain the installed package database.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Registry extends PEAR
{
    /**
     * File containing all channel information.
     * @var string
     */
    var $channels = '';

    /** Directory where registry files are stored.
     * @var string
     */
    var $statedir = '';

    /** File where the file map is stored
     * @var string
     */
    var $filemap = '';

    /** Directory where registry files for channels are stored.
     * @var string
     */
    var $channelsdir = '';

    /** Name of file used for locking the registry
     * @var string
     */
    var $lockfile = '';

    /** File descriptor used during locking
     * @var resource
     */
    var $lock_fp = null;

    /** Mode used during locking
     * @var int
     */
    var $lock_mode = 0; // XXX UNUSED

    /** Cache of package information.  Structure:
     * array(
     *   'package' => array('id' => ... ),
     *   ... )
     * @var array
     */
    var $pkginfo_cache = array();

    /** Cache of file map.  Structure:
     * array( '/path/to/file' => 'package', ... )
     * @var array
     */
    var $filemap_cache = array();

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_pearChannel;

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_peclChannel;

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_docChannel;

    /**
     * @var PEAR_DependencyDB
     */
    var $_dependencyDB;

    /**
     * @var PEAR_Config
     */
    var $_config;

    /**
     * PEAR_Registry constructor.
     *
     * @param string (optional) PEAR install directory (for .php files)
     * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PEAR channel, if
     *        default values are not desired.  Only used the very first time a PEAR
     *        repository is initialized
     * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PECL channel, if
     *        default values are not desired.  Only used the very first time a PEAR
     *        repository is initialized
     *
     * @access public
     */
    function __construct($pear_install_dir = PEAR_INSTALL_DIR, $pear_channel = false,
                           $pecl_channel = false, $pear_metadata_dir = '')
    {
        parent::__construct();
        $this->setInstallDir($pear_install_dir, $pear_metadata_dir);
        $this->_pearChannel = $pear_channel;
        $this->_peclChannel = $pecl_channel;
        $this->_config      = false;
    }

    function setInstallDir($pear_install_dir = PEAR_INSTALL_DIR, $pear_metadata_dir = '')
    {
        $ds = DIRECTORY_SEPARATOR;
        $this->install_dir = $pear_install_dir;
        if (!$pear_metadata_dir) {
            $pear_metadata_dir = $pear_install_dir;
        }
        $this->channelsdir = $pear_metadata_dir.$ds.'.channels';
        $this->statedir    = $pear_metadata_dir.$ds.'.registry';
        $this->filemap     = $pear_metadata_dir.$ds.'.filemap';
        $this->lockfile    = $pear_metadata_dir.$ds.'.lock';
    }

    function hasWriteAccess()
    {
        if (!file_exists($this->install_dir)) {
            $dir = $this->install_dir;
            while ($dir && $dir != '.') {
                $olddir = $dir;
                $dir    = dirname($dir);
                if ($dir != '.' && file_exists($dir)) {
                    if (is_writeable($dir)) {
                        return true;
                    }

                    return false;
                }

                if ($dir == $olddir) { // this can happen in safe mode
                    return @is_writable($dir);
                }
            }

            return false;
        }

        return is_writeable($this->install_dir);
    }

    function setConfig(&$config, $resetInstallDir = true)
    {
        $this->_config = &$config;
        if ($resetInstallDir) {
            $this->setInstallDir($config->get('php_dir'), $config->get('metadata_dir'));
        }
    }

    function _initializeChannelDirs()
    {
        static $running = false;
        if (!$running) {
            $running = true;
            $ds = DIRECTORY_SEPARATOR;
            if (!is_dir($this->channelsdir) ||
                  !file_exists($this->channelsdir . $ds . 'pear.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . '__uri.reg')) {
                if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
                    $pear_channel = $this->_pearChannel;
                    if (!is_a($pear_channel, 'PEAR_ChannelFile') || !$pear_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $pear_channel = new PEAR_ChannelFile;
                        $pear_channel->setAlias('pear');
                        $pear_channel->setServer('pear.php.net');
                        $pear_channel->setSummary('PHP Extension and Application Repository');
                        $pear_channel->setDefaultPEARProtocols();
                        $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/');
                        $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/');
                        $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/');
                        //$pear_channel->setBaseURL('REST1.4', 'http://pear.php.net/rest/');
                    } else {
                        $pear_channel->setServer('pear.php.net');
                        $pear_channel->setAlias('pear');
                    }

                    $pear_channel->validate();
                    $this->_addChannel($pear_channel);
                }

                if (!file_exists($this->channelsdir . $ds . 'pecl.php.net.reg')) {
                    $pecl_channel = $this->_peclChannel;
                    if (!is_a($pecl_channel, 'PEAR_ChannelFile') || !$pecl_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $pecl_channel = new PEAR_ChannelFile;
                        $pecl_channel->setAlias('pecl');
                        $pecl_channel->setServer('pecl.php.net');
                        $pecl_channel->setSummary('PHP Extension Community Library');
                        $pecl_channel->setDefaultPEARProtocols();
                        $pecl_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/');
                        $pecl_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/');
                        $pecl_channel->setValidationPackage('PEAR_Validator_PECL', '1.0');
                    } else {
                        $pecl_channel->setServer('pecl.php.net');
                        $pecl_channel->setAlias('pecl');
                    }

                    $pecl_channel->validate();
                    $this->_addChannel($pecl_channel);
                }

                if (!file_exists($this->channelsdir . $ds . 'doc.php.net.reg')) {
                    $doc_channel = $this->_docChannel;
                    if (!is_a($doc_channel, 'PEAR_ChannelFile') || !$doc_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $doc_channel = new PEAR_ChannelFile;
                        $doc_channel->setAlias('phpdocs');
                        $doc_channel->setServer('doc.php.net');
                        $doc_channel->setSummary('PHP Documentation Team');
                        $doc_channel->setDefaultPEARProtocols();
                        $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/');
                        $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/');
                        $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/');
                    } else {
                        $doc_channel->setServer('doc.php.net');
                        $doc_channel->setAlias('doc');
                    }

                    $doc_channel->validate();
                    $this->_addChannel($doc_channel);
                }

                if (!file_exists($this->channelsdir . $ds . '__uri.reg')) {
                    if (!class_exists('PEAR_ChannelFile')) {
                        require_once 'PEAR/ChannelFile.php';
                    }

                    $private = new PEAR_ChannelFile;
                    $private->setName('__uri');
                    $private->setDefaultPEARProtocols();
                    $private->setBaseURL('REST1.0', '****');
                    $private->setSummary('Pseudo-channel for static packages');
                    $this->_addChannel($private);
                }
                $this->_rebuildFileMap();
            }

            $running = false;
        }
    }

    function _initializeDirs()
    {
        $ds = DIRECTORY_SEPARATOR;
        // XXX Compatibility code should be removed in the future
        // rename all registry files if any to lowercase
        if (!OS_WINDOWS && file_exists($this->statedir) && is_dir($this->statedir) &&
              $handle = opendir($this->statedir)) {
            $dest = $this->statedir . $ds;
            while (false !== ($file = readdir($handle))) {
                if (preg_match('/^.*[A-Z].*\.reg\\z/', $file)) {
                    rename($dest . $file, $dest . strtolower($file));
                }
            }
            closedir($handle);
        }

        $this->_initializeChannelDirs();
        if (!file_exists($this->filemap)) {
            $this->_rebuildFileMap();
        }
        $this->_initializeDepDB();
    }

    function _initializeDepDB()
    {
        if (!isset($this->_dependencyDB)) {
            static $initializing = false;
            if (!$initializing) {
                $initializing = true;
                if (!$this->_config) { // never used?
                    $file = OS_WINDOWS ? 'pear.ini' : '.pearrc';
                    $this->_config = new PEAR_Config($this->statedir . DIRECTORY_SEPARATOR .
                        $file);
                    $this->_config->setRegistry($this);
                    $this->_config->set('php_dir', $this->install_dir);
                }

                $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config);
                if (PEAR::isError($this->_dependencyDB)) {
                    // attempt to recover by removing the dep db
                    if (file_exists($this->_config->get('metadata_dir', null, 'pear.php.net') .
                        DIRECTORY_SEPARATOR . '.depdb')) {
                        @unlink($this->_config->get('metadata_dir', null, 'pear.php.net') .
                            DIRECTORY_SEPARATOR . '.depdb');
                    }

                    $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config);
                    if (PEAR::isError($this->_dependencyDB)) {
                        echo $this->_dependencyDB->getMessage();
                        echo 'Unrecoverable error';
                        exit(1);
                    }
                }

                $initializing = false;
            }
        }
    }

    /**
     * PEAR_Registry destructor.  Makes sure no locks are forgotten.
     *
     * @access private
     */
    function _PEAR_Registry()
    {
        parent::_PEAR();
        if (is_resource($this->lock_fp)) {
            $this->_unlock();
        }
    }

    /**
     * Make sure the directory where we keep registry files exists.
     *
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertStateDir($channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_assertChannelStateDir($channel);
        }

        static $init = false;
        if (!file_exists($this->statedir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->statedir))) {
                return $this->raiseError("could not create directory '{$this->statedir}'");
            }
            $init = true;
        } elseif (!is_dir($this->statedir)) {
            return $this->raiseError('Cannot create directory ' . $this->statedir . ', ' .
                'it already exists and is not a directory');
        }

        $ds = DIRECTORY_SEPARATOR;
        if (!file_exists($this->channelsdir)) {
            if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . '__uri.reg')) {
                $init = true;
            }
        } elseif (!is_dir($this->channelsdir)) {
            return $this->raiseError('Cannot create directory ' . $this->channelsdir . ', ' .
                'it already exists and is not a directory');
        }

        if ($init) {
            static $running = false;
            if (!$running) {
                $running = true;
                $this->_initializeDirs();
                $running = false;
                $init = false;
            }
        } else {
            $this->_initializeDepDB();
        }

        return true;
    }

    /**
     * Make sure the directory where we keep registry files exists for a non-standard channel.
     *
     * @param string channel name
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertChannelStateDir($channel)
    {
        $ds = DIRECTORY_SEPARATOR;
        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
                $this->_initializeChannelDirs();
            }
            return $this->_assertStateDir($channel);
        }

        $channelDir = $this->_channelDirectoryName($channel);
        if (!is_dir($this->channelsdir) ||
              !file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
            $this->_initializeChannelDirs();
        }

        if (!file_exists($channelDir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $channelDir))) {
                return $this->raiseError("could not create directory '" . $channelDir .
                    "'");
            }
        } elseif (!is_dir($channelDir)) {
            return $this->raiseError("could not create directory '" . $channelDir .
                "', already exists and is not a directory");
        }

        return true;
    }

    /**
     * Make sure the directory where we keep registry files for channels exists
     *
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertChannelDir()
    {
        if (!file_exists($this->channelsdir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->channelsdir))) {
                return $this->raiseError("could not create directory '{$this->channelsdir}'");
            }
        } elseif (!is_dir($this->channelsdir)) {
            return $this->raiseError("could not create directory '{$this->channelsdir}" .
                "', it already exists and is not a directory");
        }

        if (!file_exists($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->channelsdir . DIRECTORY_SEPARATOR . '.alias'))) {
                return $this->raiseError("could not create directory '{$this->channelsdir}/.alias'");
            }
        } elseif (!is_dir($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) {
            return $this->raiseError("could not create directory '{$this->channelsdir}" .
                "/.alias', it already exists and is not a directory");
        }

        return true;
    }

    /**
     * Get the name of the file where data for a given package is stored.
     *
     * @param string channel name, or false if this is a PEAR package
     * @param string package name
     *
     * @return string registry file name
     *
     * @access public
     */
    function _packageFileName($package, $channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_channelDirectoryName($channel) . DIRECTORY_SEPARATOR .
                strtolower($package) . '.reg';
        }

        return $this->statedir . DIRECTORY_SEPARATOR . strtolower($package) . '.reg';
    }

    /**
     * Get the name of the file where data for a given channel is stored.
     * @param string channel name
     * @return string registry file name
     */
    function _channelFileName($channel, $noaliases = false)
    {
        if (!$noaliases) {
            if (file_exists($this->_getChannelAliasFileName($channel))) {
                $channel = implode('', file($this->_getChannelAliasFileName($channel)));
            }
        }
        return $this->channelsdir . DIRECTORY_SEPARATOR . str_replace('/', '_',
            strtolower($channel)) . '.reg';
    }

    /**
     * @param string
     * @return string
     */
    function _getChannelAliasFileName($alias)
    {
        return $this->channelsdir . DIRECTORY_SEPARATOR . '.alias' .
              DIRECTORY_SEPARATOR . str_replace('/', '_', strtolower($alias)) . '.txt';
    }

    /**
     * Get the name of a channel from its alias
     */
    function _getChannelFromAlias($channel)
    {
        if (!$this->_channelExists($channel)) {
            if ($channel == 'pear.php.net') {
                return 'pear.php.net';
            }

            if ($channel == 'pecl.php.net') {
                return 'pecl.php.net';
            }

            if ($channel == 'doc.php.net') {
                return 'doc.php.net';
            }

            if ($channel == '__uri') {
                return '__uri';
            }

            return false;
        }

        $channel = strtolower($channel);
        if (file_exists($this->_getChannelAliasFileName($channel))) {
            // translate an alias to an actual channel
            return implode('', file($this->_getChannelAliasFileName($channel)));
        }

        return $channel;
    }

    /**
     * Get the alias of a channel from its alias or its name
     */
    function _getAlias($channel)
    {
        if (!$this->_channelExists($channel)) {
            if ($channel == 'pear.php.net') {
                return 'pear';
            }

            if ($channel == 'pecl.php.net') {
                return 'pecl';
            }

            if ($channel == 'doc.php.net') {
                return 'phpdocs';
            }

            return false;
        }

        $channel = $this->_getChannel($channel);
        if (PEAR::isError($channel)) {
            return $channel;
        }

        return $channel->getAlias();
    }

    /**
     * Get the name of the file where data for a given package is stored.
     *
     * @param string channel name, or false if this is a PEAR package
     * @param string package name
     *
     * @return string registry file name
     *
     * @access public
     */
    function _channelDirectoryName($channel)
    {
        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            return $this->statedir;
        }

        $ch = $this->_getChannelFromAlias($channel);
        if (!$ch) {
            $ch = $channel;
        }

        return $this->statedir . DIRECTORY_SEPARATOR . strtolower('.channel.' .
            str_replace('/', '_', $ch));
    }

    function _openPackageFile($package, $mode, $channel = false)
    {
        if (!$this->_assertStateDir($channel)) {
            return null;
        }

        if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) {
            return null;
        }

        $file = $this->_packageFileName($package, $channel);
        if (!file_exists($file) && $mode == 'r' || $mode == 'rb') {
            return null;
        }

        $fp = @fopen($file, $mode);
        if (!$fp) {
            return null;
        }

        return $fp;
    }

    function _closePackageFile($fp)
    {
        fclose($fp);
    }

    function _openChannelFile($channel, $mode)
    {
        if (!$this->_assertChannelDir()) {
            return null;
        }

        if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) {
            return null;
        }

        $file = $this->_channelFileName($channel);
        if (!file_exists($file) && $mode == 'r' || $mode == 'rb') {
            return null;
        }

        $fp = @fopen($file, $mode);
        if (!$fp) {
            return null;
        }

        return $fp;
    }

    function _closeChannelFile($fp)
    {
        fclose($fp);
    }

    function _rebuildFileMap()
    {
        if (!class_exists('PEAR_Installer_Role')) {
            require_once 'PEAR/Installer/Role.php';
        }

        $channels = $this->_listAllPackages();
        $files = array();
        foreach ($channels as $channel => $packages) {
            foreach ($packages as $package) {
                $version = $this->_packageInfo($package, 'version', $channel);
                $filelist = $this->_packageInfo($package, 'filelist', $channel);
                if (!is_array($filelist)) {
                    continue;
                }

                foreach ($filelist as $name => $attrs) {
                    if (isset($attrs['attribs'])) {
                        $attrs = $attrs['attribs'];
                    }

                    // it is possible for conflicting packages in different channels to
                    // conflict with data files/doc files
                    if ($name == 'dirtree') {
                        continue;
                    }

                    if (isset($attrs['role']) && !in_array($attrs['role'],
                          PEAR_Installer_Role::getInstallableRoles())) {
                        // these are not installed
                        continue;
                    }

                    if (isset($attrs['role']) && !in_array($attrs['role'],
                          PEAR_Installer_Role::getBaseinstallRoles())) {
                        $attrs['baseinstalldir'] = $package;
                    }

                    if (isset($attrs['baseinstalldir'])) {
                        $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name;
                    } else {
                        $file = $name;
                    }

                    $file = preg_replace(',^/+,', '', $file);
                    if ($channel != 'pear.php.net') {
                        if (!isset($files[$attrs['role']])) {
                            $files[$attrs['role']] = array();
                        }
                        $files[$attrs['role']][$file] = array(strtolower($channel),
                            strtolower($package));
                    } else {
                        if (!isset($files[$attrs['role']])) {
                            $files[$attrs['role']] = array();
                        }
                        $files[$attrs['role']][$file] = strtolower($package);
                    }
                }
            }
        }


        $this->_assertStateDir();
        if (!$this->hasWriteAccess()) {
            return false;
        }

        $fp = @fopen($this->filemap, 'wb');
        if (!$fp) {
            return false;
        }

        $this->filemap_cache = $files;
        fwrite($fp, serialize($files));
        fclose($fp);
        return true;
    }

    function _readFileMap()
    {
        if (!file_exists($this->filemap)) {
            return array();
        }

        $fp = @fopen($this->filemap, 'r');
        if (!$fp) {
            $last_errormsg = '';
            $last_error = error_get_last();
            if (!empty($last_error['message'])) {
                $last_errormsg = $last_error['message'];
            }
            return $this->raiseError('PEAR_Registry: could not open filemap "' . $this->filemap . '"', PEAR_REGISTRY_ERROR_FILE, null, null, $last_errormsg);
        }

        clearstatcache();
        $fsize = filesize($this->filemap);
        fclose($fp);
        $data = file_get_contents($this->filemap);
        $tmp = unserialize($data);
        if (!$tmp && $fsize > 7) {
            return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data);
        }

        $this->filemap_cache = $tmp;
        return true;
    }

    /**
     * Lock the registry.
     *
     * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN.
     *                See flock manual for more information.
     *
     * @return bool TRUE on success, FALSE if locking failed, or a
     *              PEAR error if some other error occurs (such as the
     *              lock file not being writable).
     *
     * @access private
     */
    function _lock($mode = LOCK_EX)
    {
        if (stristr(php_uname(), 'Windows 9')) {
            return true;
        }

        if ($mode != LOCK_UN && is_resource($this->lock_fp)) {
            // XXX does not check type of lock (LOCK_SH/LOCK_EX)
            return true;
        }

        if (!$this->_assertStateDir()) {
            if ($mode == LOCK_EX) {
                return $this->raiseError('Registry directory is not writeable by the current user');
            }

            return true;
        }

        $open_mode = 'w';
        // XXX People reported problems with LOCK_SH and 'w'
        if ($mode === LOCK_SH || $mode === LOCK_UN) {
            if (!file_exists($this->lockfile)) {
                touch($this->lockfile);
            }
            $open_mode = 'r';
        }

        if (!is_resource($this->lock_fp)) {
            $this->lock_fp = @fopen($this->lockfile, $open_mode);
        }

        if (!is_resource($this->lock_fp)) {
            $this->lock_fp = null;
            return $this->raiseError("could not create lock file" .
                                     (isset($php_errormsg) ? ": " . $php_errormsg : ""));
        }

        if (!(int)flock($this->lock_fp, $mode)) {
            switch ($mode) {
                case LOCK_SH: $str = 'shared';    break;
                case LOCK_EX: $str = 'exclusive'; break;
                case LOCK_UN: $str = 'unlock';    break;
                default:      $str = 'unknown';   break;
            }

            //is resource at this point, close it on error.
            fclose($this->lock_fp);
            $this->lock_fp = null;
            return $this->raiseError("could not acquire $str lock ($this->lockfile)",
                                     PEAR_REGISTRY_ERROR_LOCK);
        }

        return true;
    }

    function _unlock()
    {
        $ret = $this->_lock(LOCK_UN);
        if (is_resource($this->lock_fp)) {
            fclose($this->lock_fp);
        }

        $this->lock_fp = null;
        return $ret;
    }

    function _packageExists($package, $channel = false)
    {
        return file_exists($this->_packageFileName($package, $channel));
    }

    /**
     * Determine whether a channel exists in the registry
     *
     * @param string Channel name
     * @param bool if true, then aliases will be ignored
     * @return boolean
     */
    function _channelExists($channel, $noaliases = false)
    {
        $a = file_exists($this->_channelFileName($channel, $noaliases));
        if (!$a && $channel == 'pear.php.net') {
            return true;
        }

        if (!$a && $channel == 'pecl.php.net') {
            return true;
        }

        if (!$a && $channel == 'doc.php.net') {
            return true;
        }

        return $a;
    }

    /**
     * Determine whether a mirror exists within the default channel in the registry
     *
     * @param string Channel name
     * @param string Mirror name
     *
     * @return boolean
     */
    function _mirrorExists($channel, $mirror)
    {
        $data = $this->_channelInfo($channel);
        if (!isset($data['servers']['mirror'])) {
            return false;
        }

        foreach ($data['servers']['mirror'] as $m) {
            if ($m['attribs']['host'] == $mirror) {
                return true;
            }
        }

        return false;
    }

    /**
     * @param PEAR_ChannelFile Channel object
     * @param donotuse
     * @param string Last-Modified HTTP tag from remote request
     * @return boolean|PEAR_Error True on creation, false if it already exists
     */
    function _addChannel($channel, $update = false, $lastmodified = false)
    {
        if (!is_a($channel, 'PEAR_ChannelFile')) {
            return false;
        }

        if (!$channel->validate()) {
            return false;
        }

        if (file_exists($this->_channelFileName($channel->getName()))) {
            if (!$update) {
                return false;
            }

            $checker = $this->_getChannel($channel->getName());
            if (PEAR::isError($checker)) {
                return $checker;
            }

            if ($channel->getAlias() != $checker->getAlias()) {
                if (file_exists($this->_getChannelAliasFileName($checker->getAlias()))) {
                    @unlink($this->_getChannelAliasFileName($checker->getAlias()));
                }
            }
        } else {
            if ($update && !in_array($channel->getName(), array('pear.php.net', 'pecl.php.net', 'doc.php.net'))) {
                return false;
            }
        }

        $ret = $this->_assertChannelDir();
        if (PEAR::isError($ret)) {
            return $ret;
        }

        $ret = $this->_assertChannelStateDir($channel->getName());
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if ($channel->getAlias() != $channel->getName()) {
            if (file_exists($this->_getChannelAliasFileName($channel->getAlias())) &&
                  $this->_getChannelFromAlias($channel->getAlias()) != $channel->getName()) {
                $channel->setAlias($channel->getName());
            }

            if (!$this->hasWriteAccess()) {
                return false;
            }

            $fp = @fopen($this->_getChannelAliasFileName($channel->getAlias()), 'w');
            if (!$fp) {
                return false;
            }

            fwrite($fp, $channel->getName());
            fclose($fp);
        }

        if (!$this->hasWriteAccess()) {
            return false;
        }

        $fp = @fopen($this->_channelFileName($channel->getName()), 'wb');
        if (!$fp) {
            return false;
        }

        $info = $channel->toArray();
        if ($lastmodified) {
            $info['_lastmodified'] = $lastmodified;
        } else {
            $info['_lastmodified'] = self::getSourceDateEpoch();
        }

        fwrite($fp, serialize($info));
        fclose($fp);
        return true;
    }

    /**
     * Deletion fails if there are any packages installed from the channel
     * @param string|PEAR_ChannelFile channel name
     * @return boolean|PEAR_Error True on deletion, false if it doesn't exist
     */
    function _deleteChannel($channel)
    {
        if (!is_string($channel)) {
            if (!is_a($channel, 'PEAR_ChannelFile')) {
                return false;
            }

            if (!$channel->validate()) {
                return false;
            }
            $channel = $channel->getName();
        }

        if ($this->_getChannelFromAlias($channel) == '__uri') {
            return false;
        }

        if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') {
            return false;
        }

        if ($this->_getChannelFromAlias($channel) == 'doc.php.net') {
            return false;
        }

        if (!$this->_channelExists($channel)) {
            return false;
        }

        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            return false;
        }

        $channel = $this->_getChannelFromAlias($channel);
        if ($channel == 'pear.php.net') {
            return false;
        }

        $test = $this->_listChannelPackages($channel);
        if (count($test)) {
            return false;
        }

        $test = @rmdir($this->_channelDirectoryName($channel));
        if (!$test) {
            return false;
        }

        $file = $this->_getChannelAliasFileName($this->_getAlias($channel));
        if (file_exists($file)) {
            $test = @unlink($file);
            if (!$test) {
                return false;
            }
        }

        $file = $this->_channelFileName($channel);
        $ret = true;
        if (file_exists($file)) {
            $ret = @unlink($file);
        }

        return $ret;
    }

    /**
     * Determine whether a channel exists in the registry
     * @param string Channel Alias
     * @return boolean
     */
    function _isChannelAlias($alias)
    {
        return file_exists($this->_getChannelAliasFileName($alias));
    }

    /**
     * @param string|null
     * @param string|null
     * @param string|null
     * @return array|null
     * @access private
     */
    function _packageInfo($package = null, $key = null, $channel = 'pear.php.net')
    {
        if ($package === null) {
            if ($channel === null) {
                $channels = $this->_listChannels();
                $ret = array();
                foreach ($channels as $channel) {
                    $channel = strtolower($channel);
                    $ret[$channel] = array();
                    $packages = $this->_listPackages($channel);
                    foreach ($packages as $package) {
                        $ret[$channel][] = $this->_packageInfo($package, null, $channel);
                    }
                }

                return $ret;
            }

            $ps = $this->_listPackages($channel);
            if (!count($ps)) {
                return array();
            }
            return array_map(array(&$this, '_packageInfo'),
                             $ps, array_fill(0, count($ps), null),
                             array_fill(0, count($ps), $channel));
        }

        $fp = $this->_openPackageFile($package, 'r', $channel);
        if ($fp === null) {
            return null;
        }

        clearstatcache();
        $this->_closePackageFile($fp);
        $data = file_get_contents($this->_packageFileName($package, $channel));
        $data = @unserialize($data);
        if ($key === null) {
            return $data;
        }

        // compatibility for package.xml version 2.0
        if (isset($data['old'][$key])) {
            return $data['old'][$key];
        }

        if (isset($data[$key])) {
            return $data[$key];
        }

        return null;
    }

    /**
     * @param string Channel name
     * @param bool whether to strictly retrieve info of channels, not just aliases
     * @return array|null
     */
    function _channelInfo($channel, $noaliases = false)
    {
        if (!$this->_channelExists($channel, $noaliases)) {
            return null;
        }

        $fp = $this->_openChannelFile($channel, 'r');
        if ($fp === null) {
            return null;
        }

        clearstatcache();
        $this->_closeChannelFile($fp);
        $data = file_get_contents($this->_channelFileName($channel));
        $data = unserialize($data);
        return $data;
    }

    function _listChannels()
    {
        $channellist = array();
        if (!file_exists($this->channelsdir) || !is_dir($this->channelsdir)) {
            return array('pear.php.net', 'pecl.php.net', 'doc.php.net', '__uri');
        }

        $dp = opendir($this->channelsdir);
        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }

            if ($ent == '__uri.reg') {
                $channellist[] = '__uri';
                continue;
            }

            $channellist[] = str_replace('_', '/', substr($ent, 0, -4));
        }

        closedir($dp);
        if (!in_array('pear.php.net', $channellist)) {
            $channellist[] = 'pear.php.net';
        }

        if (!in_array('pecl.php.net', $channellist)) {
            $channellist[] = 'pecl.php.net';
        }

        if (!in_array('doc.php.net', $channellist)) {
            $channellist[] = 'doc.php.net';
        }


        if (!in_array('__uri', $channellist)) {
            $channellist[] = '__uri';
        }

        natsort($channellist);
        return $channellist;
    }

    function _listPackages($channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_listChannelPackages($channel);
        }

        if (!file_exists($this->statedir) || !is_dir($this->statedir)) {
            return array();
        }

        $pkglist = array();
        $dp = opendir($this->statedir);
        if (!$dp) {
            return $pkglist;
        }

        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }

            $pkglist[] = substr($ent, 0, -4);
        }
        closedir($dp);
        sort($pkglist);
        return $pkglist;
    }

    function _listChannelPackages($channel)
    {
        $pkglist = array();
        if (!file_exists($this->_channelDirectoryName($channel)) ||
              !is_dir($this->_channelDirectoryName($channel))) {
            return array();
        }

        $dp = opendir($this->_channelDirectoryName($channel));
        if (!$dp) {
            return $pkglist;
        }

        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }
            $pkglist[] = substr($ent, 0, -4);
        }

        closedir($dp);
        return $pkglist;
    }

    function _listAllPackages()
    {
        $ret = array();
        foreach ($this->_listChannels() as $channel) {
            $ret[$channel] = $this->_listPackages($channel);
        }

        return $ret;
    }

    /**
     * Add an installed package to the registry
     * @param string package name
     * @param array package info (parsed by PEAR_Common::infoFrom*() methods)
     * @return bool success of saving
     * @access private
     */
    function _addPackage($package, $info)
    {
        if ($this->_packageExists($package)) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'wb');
        if ($fp === null) {
            return false;
        }

        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        if (isset($info['filelist'])) {
            $this->_rebuildFileMap();
        }

        return true;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     * @access private
     */
    function _addPackage2($info)
    {
        if (!is_a($info, 'PEAR_PackageFile_v1') && !is_a($info, 'PEAR_PackageFile_v2')) {
            return false;
        }

        if (!$info->validate()) {
            if (class_exists('PEAR_Common')) {
                $ui = PEAR_Frontend::singleton();
                if ($ui) {
                    foreach ($info->getValidationWarnings() as $err) {
                        $ui->log($err['message'], true);
                    }
                }
            }
            return false;
        }

        $channel = $info->getChannel();
        $package = $info->getPackage();
        $save = $info;
        if ($this->_packageExists($package, $channel)) {
            return false;
        }

        if (!$this->_channelExists($channel, true)) {
            return false;
        }

        $info = $info->toArray(true);
        if (!$info) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'wb', $channel);
        if ($fp === null) {
            return false;
        }

        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        $this->_rebuildFileMap();
        return true;
    }

    /**
     * @param string Package name
     * @param array parsed package.xml 1.0
     * @param bool this parameter is only here for BC.  Don't use it.
     * @access private
     */
    function _updatePackage($package, $info, $merge = true)
    {
        $oldinfo = $this->_packageInfo($package);
        if (empty($oldinfo)) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'w');
        if ($fp === null) {
            return false;
        }

        if (is_object($info)) {
            $info = $info->toArray();
        }
        $info['_lastmodified'] = self::getSourceDateEpoch();

        $newinfo = $info;
        if ($merge) {
            $info = array_merge($oldinfo, $info);
        } else {
            $diff = $info;
        }

        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        if (isset($newinfo['filelist'])) {
            $this->_rebuildFileMap();
        }

        return true;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     * @access private
     */
    function _updatePackage2($info)
    {
        if (!$this->_packageExists($info->getPackage(), $info->getChannel())) {
            return false;
        }

        $fp = $this->_openPackageFile($info->getPackage(), 'w', $info->getChannel());
        if ($fp === null) {
            return false;
        }

        $save = $info;
        $info = $save->getArray(true);
        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        $this->_rebuildFileMap();
        return true;
    }

    /**
     * @param string Package name
     * @param string Channel name
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null
     * @access private
     */
    function &_getPackage($package, $channel = 'pear.php.net')
    {
        $info = $this->_packageInfo($package, null, $channel);
        if ($info === null) {
            return $info;
        }

        $a = $this->_config;
        if (!$a) {
            $this->_config = new PEAR_Config;
            $this->_config->set('php_dir', $this->statedir);
        }

        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        $pkg = new PEAR_PackageFile($this->_config);
        $pf = &$pkg->fromArray($info);
        return $pf;
    }

    /**
     * @param string channel name
     * @param bool whether to strictly retrieve channel names
     * @return PEAR_ChannelFile|PEAR_Error
     * @access private
     */
    function &_getChannel($channel, $noaliases = false)
    {
        $ch = false;
        if ($this->_channelExists($channel, $noaliases)) {
            $chinfo = $this->_channelInfo($channel, $noaliases);
            if ($chinfo) {
                if (!class_exists('PEAR_ChannelFile')) {
                    require_once 'PEAR/ChannelFile.php';
                }

                $ch = &PEAR_ChannelFile::fromArrayWithErrors($chinfo);
            }
        }

        if ($ch) {
            if ($ch->validate()) {
                return $ch;
            }

            foreach ($ch->getErrors(true) as $err) {
                $message = $err['message'] . "\n";
            }

            $ch = PEAR::raiseError($message);
            return $ch;
        }

        if ($this->_getChannelFromAlias($channel) == 'pear.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $pear_channel = new PEAR_ChannelFile;
            $pear_channel->setServer('pear.php.net');
            $pear_channel->setAlias('pear');
            $pear_channel->setSummary('PHP Extension and Application Repository');
            $pear_channel->setDefaultPEARProtocols();
            $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/');
            $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/');
            $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/');
            return $pear_channel;
        }

        if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }
            $pear_channel = new PEAR_ChannelFile;
            $pear_channel->setServer('pecl.php.net');
            $pear_channel->setAlias('pecl');
            $pear_channel->setSummary('PHP Extension Community Library');
            $pear_channel->setDefaultPEARProtocols();
            $pear_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/');
            $pear_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/');
            $pear_channel->setValidationPackage('PEAR_Validator_PECL', '1.0');
            return $pear_channel;
        }

        if ($this->_getChannelFromAlias($channel) == 'doc.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $doc_channel = new PEAR_ChannelFile;
            $doc_channel->setServer('doc.php.net');
            $doc_channel->setAlias('phpdocs');
            $doc_channel->setSummary('PHP Documentation Team');
            $doc_channel->setDefaultPEARProtocols();
            $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/');
            $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/');
            $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/');
            return $doc_channel;
        }


        if ($this->_getChannelFromAlias($channel) == '__uri') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $private = new PEAR_ChannelFile;
            $private->setName('__uri');
            $private->setDefaultPEARProtocols();
            $private->setBaseURL('REST1.0', '****');
            $private->setSummary('Pseudo-channel for static packages');
            return $private;
        }

        return $ch;
    }

    /**
     * @param string Package name
     * @param string Channel name
     * @return bool
     */
    function packageExists($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_packageExists($package, $channel);
        $this->_unlock();
        return $ret;
    }

    // }}}

    // {{{ channelExists()

    /**
     * @param string channel name
     * @param bool if true, then aliases will be ignored
     * @return bool
     */
    function channelExists($channel, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_channelExists($channel, $noaliases);
        $this->_unlock();
        return $ret;
    }

    // }}}

    /**
     * @param string channel name mirror is in
     * @param string mirror name
     *
     * @return bool
     */
    function mirrorExists($channel, $mirror)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }

        $ret = $this->_mirrorExists($channel, $mirror);
        $this->_unlock();
        return $ret;
    }

    // {{{ isAlias()

    /**
     * Determines whether the parameter is an alias of a channel
     * @param string
     * @return bool
     */
    function isAlias($alias)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_isChannelAlias($alias);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ packageInfo()

    /**
     * @param string|null
     * @param string|null
     * @param string
     * @return array|null
     */
    function packageInfo($package = null, $key = null, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_packageInfo($package, $key, $channel);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ channelInfo()

    /**
     * Retrieve a raw array of channel data.
     *
     * Do not use this, instead use {@link getChannel()} for normal
     * operations.  Array structure is undefined in this method
     * @param string channel name
     * @param bool whether to strictly retrieve information only on non-aliases
     * @return array|null|PEAR_Error
     */
    function channelInfo($channel = null, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_channelInfo($channel, $noaliases);
        $this->_unlock();
        return $ret;
    }

    // }}}

    /**
     * @param string
     */
    function channelName($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getChannelFromAlias($channel);
        $this->_unlock();
        return $ret;
    }

    /**
     * @param string
     */
    function channelAlias($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getAlias($channel);
        $this->_unlock();
        return $ret;
    }
    // {{{ listPackages()

    function listPackages($channel = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listPackages($channel);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ listAllPackages()

    function listAllPackages()
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listAllPackages();
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ listChannel()

    function listChannels()
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listChannels();
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ addPackage()

    /**
     * Add an installed package to the registry
     * @param string|PEAR_PackageFile_v1|PEAR_PackageFile_v2 package name or object
     *               that will be passed to {@link addPackage2()}
     * @param array package info (parsed by PEAR_Common::infoFrom*() methods)
     * @return bool success of saving
     */
    function addPackage($package, $info)
    {
        if (is_object($info)) {
            return $this->addPackage2($info);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_addPackage($package, $info);
        $this->_unlock();
        if ($ret) {
            if (!class_exists('PEAR_PackageFile_v1')) {
                require_once 'PEAR/PackageFile/v1.php';
            }
            $pf = new PEAR_PackageFile_v1;
            $pf->setConfig($this->_config);
            $pf->fromArray($info);
            $this->_dependencyDB->uninstallPackage($pf);
            $this->_dependencyDB->installPackage($pf);
        }
        return $ret;
    }

    // }}}
    // {{{ addPackage2()

    function addPackage2($info)
    {
        if (!is_object($info)) {
            return $this->addPackage($info['package'], $info);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_addPackage2($info);
        $this->_unlock();
        if ($ret) {
            $this->_dependencyDB->uninstallPackage($info);
            $this->_dependencyDB->installPackage($info);
        }
        return $ret;
    }

    // }}}
    // {{{ updateChannel()

    /**
     * For future expandibility purposes, separate this
     * @param PEAR_ChannelFile
     */
    function updateChannel($channel, $lastmodified = null)
    {
        if ($channel->getName() == '__uri') {
            return false;
        }
        return $this->addChannel($channel, $lastmodified, true);
    }

    // }}}
    // {{{ deleteChannel()

    /**
     * Deletion fails if there are any packages installed from the channel
     * @param string|PEAR_ChannelFile channel name
     * @return boolean|PEAR_Error True on deletion, false if it doesn't exist
     */
    function deleteChannel($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_deleteChannel($channel);
        $this->_unlock();
        if ($ret && is_a($this->_config, 'PEAR_Config')) {
            $this->_config->setChannels($this->listChannels());
        }

        return $ret;
    }

    // }}}
    // {{{ addChannel()

    /**
     * @param PEAR_ChannelFile Channel object
     * @param string Last-Modified header from HTTP for caching
     * @return boolean|PEAR_Error True on creation, false if it already exists
     */
    function addChannel($channel, $lastmodified = false, $update = false)
    {
        if (!is_a($channel, 'PEAR_ChannelFile') || !$channel->validate()) {
            return false;
        }

        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_addChannel($channel, $update, $lastmodified);
        $this->_unlock();
        if (!$update && $ret && is_a($this->_config, 'PEAR_Config')) {
            $this->_config->setChannels($this->listChannels());
        }

        return $ret;
    }

    // }}}
    // {{{ deletePackage()

    function deletePackage($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $file = $this->_packageFileName($package, $channel);
        $ret  = file_exists($file) ? @unlink($file) : false;
        $this->_rebuildFileMap();
        $this->_unlock();
        $p = array('channel' => $channel, 'package' => $package);
        $this->_dependencyDB->uninstallPackage($p);
        return $ret;
    }

    // }}}
    // {{{ updatePackage()

    function updatePackage($package, $info, $merge = true)
    {
        if (is_object($info)) {
            return $this->updatePackage2($info, $merge);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_updatePackage($package, $info, $merge);
        $this->_unlock();
        if ($ret) {
            if (!class_exists('PEAR_PackageFile_v1')) {
                require_once 'PEAR/PackageFile/v1.php';
            }
            $pf = new PEAR_PackageFile_v1;
            $pf->setConfig($this->_config);
            $pf->fromArray($this->packageInfo($package));
            $this->_dependencyDB->uninstallPackage($pf);
            $this->_dependencyDB->installPackage($pf);
        }
        return $ret;
    }

    // }}}
    // {{{ updatePackage2()

    function updatePackage2($info)
    {

        if (!is_object($info)) {
            return $this->updatePackage($info['package'], $info, $merge);
        }

        if (!$info->validate(PEAR_VALIDATE_DOWNLOADING)) {
            return false;
        }

        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_updatePackage2($info);
        $this->_unlock();
        if ($ret) {
            $this->_dependencyDB->uninstallPackage($info);
            $this->_dependencyDB->installPackage($info);
        }

        return $ret;
    }

    // }}}
    // {{{ getChannel()
    /**
     * @param string channel name
     * @param bool whether to strictly return raw channels (no aliases)
     * @return PEAR_ChannelFile|PEAR_Error
     */
    function getChannel($channel, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getChannel($channel, $noaliases);
        $this->_unlock();
        if (!$ret) {
            return PEAR::raiseError('Unknown channel: ' . $channel);
        }
        return $ret;
    }

    // }}}
    // {{{ getPackage()
    /**
     * @param string package name
     * @param string channel name
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null
     */
    function &getPackage($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $pf = &$this->_getPackage($package, $channel);
        $this->_unlock();
        return $pf;
    }

    // }}}

    /**
     * Get PEAR_PackageFile_v[1/2] objects representing the contents of
     * a dependency group that are installed.
     *
     * This is used at uninstall-time
     * @param array
     * @return array|false
     */
    function getInstalledGroup($group)
    {
        $ret = array();
        if (isset($group['package'])) {
            if (!isset($group['package'][0])) {
                $group['package'] = array($group['package']);
            }
            foreach ($group['package'] as $package) {
                $depchannel = isset($package['channel']) ? $package['channel'] : '__uri';
                $p = &$this->getPackage($package['name'], $depchannel);
                if ($p) {
                    $save = &$p;
                    $ret[] = &$save;
                }
            }
        }
        if (isset($group['subpackage'])) {
            if (!isset($group['subpackage'][0])) {
                $group['subpackage'] = array($group['subpackage']);
            }
            foreach ($group['subpackage'] as $package) {
                $depchannel = isset($package['channel']) ? $package['channel'] : '__uri';
                $p = &$this->getPackage($package['name'], $depchannel);
                if ($p) {
                    $save = &$p;
                    $ret[] = &$save;
                }
            }
        }
        if (!count($ret)) {
            return false;
        }
        return $ret;
    }

    // {{{ getChannelValidator()
    /**
     * @param string channel name
     * @return PEAR_Validate|false
     */
    function &getChannelValidator($channel)
    {
        $chan = $this->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $chan;
        }
        $val = $chan->getValidationObject();
        return $val;
    }
    // }}}
    // {{{ getChannels()
    /**
     * @param string channel name
     * @return array an array of PEAR_ChannelFile objects representing every installed channel
     */
    function &getChannels()
    {
        $ret = array();
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        foreach ($this->_listChannels() as $channel) {
            $e = &$this->_getChannel($channel);
            if (!$e || PEAR::isError($e)) {
                continue;
            }
            $ret[] = $e;
        }
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ checkFileMap()

    /**
     * Test whether a file or set of files belongs to a package.
     *
     * If an array is passed in
     * @param string|array file path, absolute or relative to the pear
     *                     install dir
     * @param string|array name of PEAR package or array('package' => name, 'channel' =>
     *                     channel) of a package that will be ignored
     * @param string API version - 1.1 will exclude any files belonging to a package
     * @param array private recursion variable
     * @return array|false which package and channel the file belongs to, or an empty
     *                     string if the file does not belong to an installed package,
     *                     or belongs to the second parameter's package
     */
    function checkFileMap($path, $package = false, $api = '1.0', $attrs = false)
    {
        if (is_array($path)) {
            static $notempty;
            if (empty($notempty)) {
                if (!class_exists('PEAR_Installer_Role')) {
                    require_once 'PEAR/Installer/Role.php';
                }
                $notempty = function($a) { return !empty($a); };
            }
            $package = is_array($package) ? array(strtolower($package[0]), strtolower($package[1]))
                : strtolower($package);
            $pkgs = array();
            foreach ($path as $name => $attrs) {
                if (is_array($attrs)) {
                    if (isset($attrs['install-as'])) {
                        $name = $attrs['install-as'];
                    }
                    if (!in_array($attrs['role'], PEAR_Installer_Role::getInstallableRoles())) {
                        // these are not installed
                        continue;
                    }
                    if (!in_array($attrs['role'], PEAR_Installer_Role::getBaseinstallRoles())) {
                        $attrs['baseinstalldir'] = is_array($package) ? $package[1] : $package;
                    }
                    if (isset($attrs['baseinstalldir'])) {
                        $name = $attrs['baseinstalldir'] . DIRECTORY_SEPARATOR . $name;
                    }
                }
                $pkgs[$name] = $this->checkFileMap($name, $package, $api, $attrs);
                if (PEAR::isError($pkgs[$name])) {
                    return $pkgs[$name];
                }
            }
            return array_filter($pkgs, $notempty);
        }
        if (empty($this->filemap_cache)) {
            if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
                return $e;
            }
            $err = $this->_readFileMap();
            $this->_unlock();
            if (PEAR::isError($err)) {
                return $err;
            }
        }
        if (!$attrs) {
            $attrs = array('role' => 'php'); // any old call would be for PHP role only
        }
        if (isset($this->filemap_cache[$attrs['role']][$path])) {
            if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) {
                return false;
            }
            return $this->filemap_cache[$attrs['role']][$path];
        }
        $l = strlen($this->install_dir);
        if (substr($path, 0, $l) == $this->install_dir) {
            $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l));
        }
        if (isset($this->filemap_cache[$attrs['role']][$path])) {
            if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) {
                return false;
            }
            return $this->filemap_cache[$attrs['role']][$path];
        }
        return false;
    }

    // }}}
    // {{{ flush()
    /**
     * Force a reload of the filemap
     * @since 1.5.0RC3
     */
    function flushFileMap()
    {
        $this->filemap_cache = null;
        clearstatcache(); // ensure that the next read gets the full, current filemap
    }

    // }}}
    // {{{ apiVersion()
    /**
     * Get the expected API version.  Channels API is version 1.1, as it is backwards
     * compatible with 1.0
     * @return string
     */
    function apiVersion()
    {
        return '1.1';
    }
    // }}}


    /**
     * Parse a package name, or validate a parsed package name array
     * @param string|array pass in an array of format
     *                     array(
     *                      'package' => 'pname',
     *                     ['channel' => 'channame',]
     *                     ['version' => 'version',]
     *                     ['state' => 'state',]
     *                     ['group' => 'groupname'])
     *                     or a string of format
     *                     [channel://][channame/]pname[-version|-state][/group=groupname]
     * @return array|PEAR_Error
     */
    function parsePackageName($param, $defaultchannel = 'pear.php.net')
    {
        $saveparam = $param;
        if (is_array($param)) {
            // convert to string for error messages
            $saveparam = $this->parsedPackageNameToString($param);
            // process the array
            if (!isset($param['package'])) {
                return PEAR::raiseError('parsePackageName(): array $param ' .
                    'must contain a valid package name in index "param"',
                    'package', null, null, $param);
            }
            if (!isset($param['uri'])) {
                if (!isset($param['channel'])) {
                    $param['channel'] = $defaultchannel;
                }
            } else {
                $param['channel'] = '__uri';
            }
        } else {
            $components = @parse_url((string) $param);
            if (isset($components['scheme'])) {
                if ($components['scheme'] == 'http') {
                    // uri package
                    $param = array('uri' => $param, 'channel' => '__uri');
                } elseif($components['scheme'] != 'channel') {
                    return PEAR::raiseError('parsePackageName(): only channel:// uris may ' .
                        'be downloaded, not "' . $param . '"', 'invalid', null, null, $param);
                }
            }
            if (!isset($components['path'])) {
                return PEAR::raiseError('parsePackageName(): array $param ' .
                    'must contain a valid package name in "' . $param . '"',
                    'package', null, null, $param);
            }
            if (isset($components['host'])) {
                // remove the leading "/"
                $components['path'] = substr($components['path'], 1);
            }
            if (!isset($components['scheme'])) {
                if (strpos($components['path'], '/') !== false) {
                    if ($components['path'][0] == '/') {
                        return PEAR::raiseError('parsePackageName(): this is not ' .
                            'a package name, it begins with "/" in "' . $param . '"',
                            'invalid', null, null, $param);
                    }
                    $parts = explode('/', $components['path']);
                    $components['host'] = array_shift($parts);
                    if (count($parts) > 1) {
                        $components['path'] = array_pop($parts);
                        $components['host'] .= '/' . implode('/', $parts);
                    } else {
                        $components['path'] = implode('/', $parts);
                    }
                } else {
                    $components['host'] = $defaultchannel;
                }
            } else {
                if (strpos($components['path'], '/')) {
                    $parts = explode('/', $components['path']);
                    $components['path'] = array_pop($parts);
                    $components['host'] .= '/' . implode('/', $parts);
                }
            }

            if (is_array($param)) {
                $param['package'] = $components['path'];
            } else {
                $param = array(
                    'package' => $components['path']
                    );
                if (isset($components['host'])) {
                    $param['channel'] = $components['host'];
                }
            }
            if (isset($components['fragment'])) {
                $param['group'] = $components['fragment'];
            }
            if (isset($components['user'])) {
                $param['user'] = $components['user'];
            }
            if (isset($components['pass'])) {
                $param['pass'] = $components['pass'];
            }
            if (isset($components['query'])) {
                parse_str($components['query'], $param['opts']);
            }
            // check for extension
            $pathinfo = pathinfo($param['package']);
            if (isset($pathinfo['extension']) &&
                  in_array(strtolower($pathinfo['extension']), array('tgz', 'tar'))) {
                $param['extension'] = $pathinfo['extension'];
                $param['package'] = substr($pathinfo['basename'], 0,
                    strlen($pathinfo['basename']) - 4);
            }
            // check for version
            if (strpos($param['package'], '-')) {
                $test = explode('-', $param['package']);
                if (count($test) != 2) {
                    return PEAR::raiseError('parsePackageName(): only one version/state ' .
                        'delimiter "-" is allowed in "' . $saveparam . '"',
                        'version', null, null, $param);
                }
                list($param['package'], $param['version']) = $test;
            }
        }
        // validation
        $info = $this->channelExists($param['channel']);
        if (PEAR::isError($info)) {
            return $info;
        }
        if (!$info) {
            return PEAR::raiseError('unknown channel "' . $param['channel'] .
                '" in "' . $saveparam . '"', 'channel', null, null, $param);
        }
        $chan = $this->getChannel($param['channel']);
        if (PEAR::isError($chan)) {
            return $chan;
        }
        if (!$chan) {
            return PEAR::raiseError("Exception: corrupt registry, could not " .
                "retrieve channel " . $param['channel'] . " information",
                'registry', null, null, $param);
        }
        $param['channel'] = $chan->getName();
        $validate = $chan->getValidationObject();
        $vpackage = $chan->getValidationPackage();
        // validate package name
        if (!$validate->validPackageName($param['package'], $vpackage['_content'])) {
            return PEAR::raiseError('parsePackageName(): invalid package name "' .
                $param['package'] . '" in "' . $saveparam . '"',
                'package', null, null, $param);
        }
        if (isset($param['group'])) {
            if (!PEAR_Validate::validGroupName($param['group'])) {
                return PEAR::raiseError('parsePackageName(): dependency group "' . $param['group'] .
                    '" is not a valid group name in "' . $saveparam . '"', 'group', null, null,
                    $param);
            }
        }
        if (isset($param['state'])) {
            if (!in_array(strtolower($param['state']), $validate->getValidStates())) {
                return PEAR::raiseError('parsePackageName(): state "' . $param['state']
                    . '" is not a valid state in "' . $saveparam . '"',
                    'state', null, null, $param);
            }
        }
        if (isset($param['version'])) {
            if (isset($param['state'])) {
                return PEAR::raiseError('parsePackageName(): cannot contain both ' .
                    'a version and a stability (state) in "' . $saveparam . '"',
                    'version/state', null, null, $param);
            }
            // check whether version is actually a state
            if (in_array(strtolower($param['version']), $validate->getValidStates())) {
                $param['state'] = strtolower($param['version']);
                unset($param['version']);
            } else {
                if (!$validate->validVersion($param['version'])) {
                    return PEAR::raiseError('parsePackageName(): "' . $param['version'] .
                        '" is neither a valid version nor a valid state in "' .
                        $saveparam . '"', 'version/state', null, null, $param);
                }
            }
        }
        return $param;
    }

    /**
     * @param array
     * @return string
     */
    function parsedPackageNameToString($parsed, $brief = false)
    {
        if (is_string($parsed)) {
            return $parsed;
        }
        if (is_object($parsed)) {
            $p = $parsed;
            $parsed = array(
                'package' => $p->getPackage(),
                'channel' => $p->getChannel(),
                'version' => $p->getVersion(),
            );
        }
        if (isset($parsed['uri'])) {
            return $parsed['uri'];
        }
        if ($brief) {
            if ($channel = $this->channelAlias($parsed['channel'])) {
                return $channel . '/' . $parsed['package'];
            }
        }
        $upass = '';
        if (isset($parsed['user'])) {
            $upass = $parsed['user'];
            if (isset($parsed['pass'])) {
                $upass .= ':' . $parsed['pass'];
            }
            $upass = "$upass@";
        }
        $ret = 'channel://' . $upass . $parsed['channel'] . '/' . $parsed['package'];
        if (isset($parsed['version']) || isset($parsed['state'])) {
            $ver = isset($parsed['version']) ? $parsed['version'] : '';
            $ver .= isset($parsed['state']) ? $parsed['state'] : '';
            $ret .= '-' . $ver;
        }
        if (isset($parsed['extension'])) {
            $ret .= '.' . $parsed['extension'];
        }
        if (isset($parsed['opts'])) {
            $ret .= '?';
            foreach ($parsed['opts'] as $name => $value) {
                $parsed['opts'][$name] = "$name=$value";
            }
            $ret .= implode('&', $parsed['opts']);
        }
        if (isset($parsed['group'])) {
            $ret .= '#' . $parsed['group'];
        }
        return $ret;
    }
}
pear/PEAR/Command/Package.xml000064400000016066151732710130011666 0ustar00<commands version="1.0">
 <package>
  <summary>Build Package</summary>
  <function>doPackage</function>
  <shortcut>p</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>Do not gzip the package file</doc>
   </nocompress>
   <showname>
    <shortopt>n</shortopt>
    <doc>Print the name of the packaged file.</doc>
   </showname>
  </options>
  <doc>[descfile] [descfile2]
Creates a PEAR package from its description file (usually called
package.xml).  If a second packagefile is passed in, then
the packager will check to make sure that one is a package.xml
version 1.0, and the other is a package.xml version 2.0.  The
package.xml version 1.0 will be saved as &quot;package.xml&quot; in the archive,
and the other as &quot;package2.xml&quot; in the archive&quot;
</doc>
 </package>
 <package-validate>
  <summary>Validate Package Consistency</summary>
  <function>doPackageValidate</function>
  <shortcut>pv</shortcut>
  <options />
  <doc>
</doc>
 </package-validate>
 <cvsdiff>
  <summary>Run a &quot;cvs diff&quot; for all files in a package</summary>
  <function>doCvsDiff</function>
  <shortcut>cd</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <reallyquiet>
    <shortopt>Q</shortopt>
    <doc>Be really quiet</doc>
   </reallyquiet>
   <date>
    <shortopt>D</shortopt>
    <doc>Diff against revision of DATE</doc>
    <arg>DATE</arg>
   </date>
   <release>
    <shortopt>R</shortopt>
    <doc>Diff against tag for package release REL</doc>
    <arg>REL</arg>
   </release>
   <revision>
    <shortopt>r</shortopt>
    <doc>Diff against revision REV</doc>
    <arg>REV</arg>
   </revision>
   <context>
    <shortopt>c</shortopt>
    <doc>Generate context diff</doc>
   </context>
   <unified>
    <shortopt>u</shortopt>
    <doc>Generate unified diff</doc>
   </unified>
   <ignore-case>
    <shortopt>i</shortopt>
    <doc>Ignore case, consider upper- and lower-case letters equivalent</doc>
   </ignore-case>
   <ignore-whitespace>
    <shortopt>b</shortopt>
    <doc>Ignore changes in amount of white space</doc>
   </ignore-whitespace>
   <ignore-blank-lines>
    <shortopt>B</shortopt>
    <doc>Ignore changes that insert or delete blank lines</doc>
   </ignore-blank-lines>
   <brief>
    <shortopt></shortopt>
    <doc>Report only whether the files differ, no details</doc>
   </brief>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt;
Compares all the files in a package.  Without any options, this
command will compare the current code with the last checked-in code.
Using the -r or -R option you may compare the current code with that
of a specific release.
</doc>
 </cvsdiff>
 <svntag>
  <summary>Set SVN Release Tag</summary>
  <function>doSvnTag</function>
  <shortcut>sv</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <slide>
    <shortopt>F</shortopt>
    <doc>Move (slide) tag if it exists</doc>
   </slide>
   <delete>
    <shortopt>d</shortopt>
    <doc>Remove tag</doc>
   </delete>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt; [files...]
 Sets a SVN tag on all files in a package.  Use this command after you have
 packaged a distribution tarball with the &quot;package&quot; command to tag what
 revisions of what files were in that release.  If need to fix something
 after running svntag once, but before the tarball is released to the public,
 use the &quot;slide&quot; option to move the release tag.

 to include files (such as a second package.xml, or tests not included in the
 release), pass them as additional parameters.
 </doc>
 </svntag>
 <cvstag>
  <summary>Set CVS Release Tag</summary>
  <function>doCvsTag</function>
  <shortcut>ct</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <reallyquiet>
    <shortopt>Q</shortopt>
    <doc>Be really quiet</doc>
   </reallyquiet>
   <slide>
    <shortopt>F</shortopt>
    <doc>Move (slide) tag if it exists</doc>
   </slide>
   <delete>
    <shortopt>d</shortopt>
    <doc>Remove tag</doc>
   </delete>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt; [files...]
Sets a CVS tag on all files in a package.  Use this command after you have
packaged a distribution tarball with the &quot;package&quot; command to tag what
revisions of what files were in that release.  If need to fix something
after running cvstag once, but before the tarball is released to the public,
use the &quot;slide&quot; option to move the release tag.

to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
</doc>
 </cvstag>
 <package-dependencies>
  <summary>Show package dependencies</summary>
  <function>doPackageDependencies</function>
  <shortcut>pd</shortcut>
  <options />
  <doc>&lt;package-file&gt; or &lt;package.xml&gt; or &lt;install-package-name&gt;
List all dependencies the package has.
Can take a tgz / tar file, package.xml or a package name of an installed package.</doc>
 </package-dependencies>
 <sign>
  <summary>Sign a package distribution file</summary>
  <function>doSign</function>
  <shortcut>si</shortcut>
  <options>
   <verbose>
    <shortopt>v</shortopt>
    <doc>Display GnuPG output</doc>
   </verbose>
  </options>
  <doc>&lt;package-file&gt;
Signs a package distribution (.tar or .tgz) file with GnuPG.</doc>
 </sign>
 <makerpm>
  <summary>Builds an RPM spec file from a PEAR package</summary>
  <function>doMakeRPM</function>
  <shortcut>rpm</shortcut>
  <options>
   <spec-template>
    <shortopt>t</shortopt>
    <doc>Use FILE as RPM spec file template</doc>
    <arg>FILE</arg>
   </spec-template>
   <rpm-pkgname>
    <shortopt>p</shortopt>
    <doc>Use FORMAT as format string for RPM package name, %s is replaced
by the PEAR package name, defaults to &quot;PEAR::%s&quot;.</doc>
    <arg>FORMAT</arg>
   </rpm-pkgname>
  </options>
  <doc>&lt;package-file&gt;

Creates an RPM .spec file for wrapping a PEAR package inside an RPM
package.  Intended to be used from the SPECS directory, with the PEAR
package tarball in the SOURCES directory:

$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
Wrote RPM spec file PEAR::Net_Geo-1.0.spec
$ rpm -bb PEAR::Net_Socket-1.0.spec
...
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
</doc>
 </makerpm>
 <convert>
  <summary>Convert a package.xml 1.0 to package.xml 2.0 format</summary>
  <function>doConvert</function>
  <shortcut>c2</shortcut>
  <options>
   <flat>
    <shortopt>f</shortopt>
    <doc>do not beautify the filelist.</doc>
   </flat>
  </options>
  <doc>[descfile] [descfile2]
Converts a package.xml in 1.0 format into a package.xml
in 2.0 format.  The new file will be named package2.xml by default,
and package.xml will be used as the old file by default.
This is not the most intelligent conversion, and should only be
used for automated conversion or learning the format.
</doc>
 </convert>
</commands>pear/PEAR/Command/Test.xml000064400000003151151732710130011241 0ustar00<commands version="1.0">
 <run-tests>
  <summary>Run Regression Tests</summary>
  <function>doRunTests</function>
  <shortcut>rt</shortcut>
  <options>
   <recur>
    <shortopt>r</shortopt>
    <doc>Run tests in child directories, recursively.  4 dirs deep maximum</doc>
   </recur>
   <ini>
    <shortopt>i</shortopt>
    <doc>actual string of settings to pass to php in format &quot; -d setting=blah&quot;</doc>
    <arg>SETTINGS</arg>
   </ini>
   <realtimelog>
    <shortopt>l</shortopt>
    <doc>Log test runs/results as they are run</doc>
   </realtimelog>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Only display detail for failed tests</doc>
   </quiet>
   <simple>
    <shortopt>s</shortopt>
    <doc>Display simple output for all tests</doc>
   </simple>
   <package>
    <shortopt>p</shortopt>
    <doc>Treat parameters as installed packages from which to run tests</doc>
   </package>
   <phpunit>
    <shortopt>u</shortopt>
    <doc>Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.</doc>
   </phpunit>
   <tapoutput>
    <shortopt>t</shortopt>
    <doc>Output run-tests.log in TAP-compliant format</doc>
   </tapoutput>
   <cgi>
    <shortopt>c</shortopt>
    <doc>CGI php executable (needed for tests with POST/GET section)</doc>
    <arg>PHPCGI</arg>
   </cgi>
   <coverage>
    <shortopt>x</shortopt>
    <doc>Generate a code coverage report (requires Xdebug 2.0.0+)</doc>
   </coverage>
  </options>
  <doc>[testfile|dir ...]
Run regression tests with PHP&#039;s regression testing script (run-tests.php).</doc>
 </run-tests>
</commands>pear/PEAR/Command/Remote.php000064400000072442151732710130011555 0ustar00<?php
/**
 * PEAR_Command_Remote (remote-info, list-upgrades, remote-list, search, list-all, download,
 * clear-cache commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';
require_once 'PEAR/REST.php';

/**
 * PEAR commands for remote server querying
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Remote extends PEAR_Command_Common
{
    var $commands = array(
        'remote-info' => array(
            'summary' => 'Information About Remote Packages',
            'function' => 'doRemoteInfo',
            'shortcut' => 'ri',
            'options' => array(),
            'doc' => '<package>
Get details on a package from the server.',
            ),
        'list-upgrades' => array(
            'summary' => 'List Available Upgrades',
            'function' => 'doListUpgrades',
            'shortcut' => 'lu',
            'options' => array(
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
            ),
            'doc' => '[preferred_state]
List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.'
            ),
        'remote-list' => array(
            'summary' => 'List Remote Packages',
            'function' => 'doRemoteList',
            'shortcut' => 'rl',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    )
                ),
            'doc' => '
Lists the packages available on the configured server along with the
latest stable release of each package.',
            ),
        'search' => array(
            'summary' => 'Search remote package database',
            'function' => 'doSearch',
            'shortcut' => 'sp',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                'allchannels' => array(
                    'shortopt' => 'a',
                    'doc' => 'search packages from all known channels',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '[packagename] [packageinfo]
Lists all packages which match the search parameters.  The first
parameter is a fragment of a packagename.  The default channel
will be used unless explicitly overridden.  The second parameter
will be used to match any portion of the summary/description',
            ),
        'list-all' => array(
            'summary' => 'List All Packages',
            'function' => 'doListAll',
            'shortcut' => 'la',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '
Lists the packages available on the configured server along with the
latest stable release of each package.',
            ),
        'download' => array(
            'summary' => 'Download Package',
            'function' => 'doDownload',
            'shortcut' => 'd',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'download an uncompressed (.tar) file',
                    ),
                ),
            'doc' => '<package>...
Download package tarballs.  The files will be named as suggested by the
server, for example if you download the DB package and the latest stable
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.',
            ),
        'clear-cache' => array(
            'summary' => 'Clear Web Services Cache',
            'function' => 'doClearCache',
            'shortcut' => 'cc',
            'options' => array(),
            'doc' => '
Clear the REST cache. See also the cache_ttl configuration
parameter.
',
            ),
        );

    /**
     * PEAR_Command_Remote constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _checkChannelForStatus($channel, $chan)
    {
        if (PEAR::isError($chan)) {
            $this->raiseError($chan);
        }
        if (!is_a($chan, 'PEAR_ChannelFile')) {
            return $this->raiseError('Internal corruption error: invalid channel "' .
                $channel . '"');
        }
        $rest = new PEAR_REST($this->config);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $mirror = $this->config->get('preferred_mirror', null,
                                     $channel);
        $a = $rest->downloadHttp('http://' . $channel .
            '/channel.xml', $chan->lastModified());
        PEAR::staticPopErrorHandling();
        if (!PEAR::isError($a) && $a) {
            $this->ui->outputData('WARNING: channel "' . $channel . '" has ' .
                'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $channel .
                '" to update');
        }
    }

    function doRemoteInfo($command, $options, $params)
    {
        if (sizeof($params) != 1) {
            return $this->raiseError("$command expects one param: the remote package name");
        }
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        $package = $params[0];
        $parsed = $reg->parsePackageName($package, $channel);
        if (PEAR::isError($parsed)) {
            return $this->raiseError('Invalid package name "' . $package . '"');
        }

        $channel = $parsed['channel'];
        $this->config->set('default_channel', $channel);
        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        $mirror = $this->config->get('preferred_mirror');
        if ($chan->supportsREST($mirror) && $base = $chan->getBaseURL('REST1.0', $mirror)) {
            $rest = &$this->config->getREST('1.0', array());
            $info = $rest->packageInfo($base, $parsed['package'], $channel);
        }

        if (!isset($info)) {
            return $this->raiseError('No supported protocol was found');
        }

        if (PEAR::isError($info)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($info);
        }

        if (!isset($info['name'])) {
            return $this->raiseError('No remote package "' . $package . '" was found');
        }

        $installed = $reg->packageInfo($info['name'], null, $channel);
        $info['installed'] = $installed ? $installed['version'] : '- no -';
        if (is_array($info['installed'])) {
            $info['installed'] = $info['installed']['release'];
        }

        $this->ui->outputData($info, $command);
        $this->config->set('default_channel', $savechannel);

        return true;
    }

    function doRemoteList($command, $options, $params)
    {
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (isset($options['channel'])) {
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError('Channel "' . $channel . '" does not exist');
            }

            $this->config->set('default_channel', $channel);
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        $list_options = false;
        if ($this->config->get('preferred_state') == 'stable') {
            $list_options = true;
        }

        $available = array();
        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))
        ) {
            // use faster list-all if available
            $rest = &$this->config->getREST('1.1', array());
            $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($available);
        }

        $i = $j = 0;
        $data = array(
            'caption' => 'Channel ' . $channel . ' Available packages:',
            'border' => true,
            'headline' => array('Package', 'Version'),
            'channel' => $channel
            );

        if (count($available) == 0) {
            $data = '(no packages available yet)';
        } else {
            foreach ($available as $name => $info) {
                $version = (isset($info['stable']) && $info['stable']) ? $info['stable'] : '-n/a-';
                $data['data'][] = array($name, $version);
            }
        }
        $this->ui->outputData($data, $command);
        $this->config->set('default_channel', $savechannel);
        return true;
    }

    function doListAll($command, $options, $params)
    {
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (isset($options['channel'])) {
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError("Channel \"$channel\" does not exist");
            }

            $this->config->set('default_channel', $channel);
        }

        $list_options = false;
        if ($this->config->get('preferred_state') == 'stable') {
            $list_options = true;
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) {
            // use faster list-all if available
            $rest = &$this->config->getREST('1.1', array());
            $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $available->getMessage() . '")');
        }

        $data = array(
            'caption' => 'All packages [Channel ' . $channel . ']:',
            'border' => true,
            'headline' => array('Package', 'Latest', 'Local'),
            'channel' => $channel,
            );

        if (isset($options['channelinfo'])) {
            // add full channelinfo
            $data['caption'] = 'Channel ' . $channel . ' All packages:';
            $data['headline'] = array('Channel', 'Package', 'Latest', 'Local',
                'Description', 'Dependencies');
        }
        $local_pkgs = $reg->listPackages($channel);

        foreach ($available as $name => $info) {
            $installed = $reg->packageInfo($name, null, $channel);
            if ($installed && is_array($installed['version'])) {
                $installed['version'] = $installed['version']['release'];
            }
            $desc = $info['summary'];
            if (isset($params[$name])) {
                $desc .= "\n\n".$info['description'];
            }
            if (isset($options['mode']))
            {
                if ($options['mode'] == 'installed' && !isset($installed['version'])) {
                    continue;
                }
                if ($options['mode'] == 'notinstalled' && isset($installed['version'])) {
                    continue;
                }
                if ($options['mode'] == 'upgrades'
                      && (!isset($installed['version']) || version_compare($installed['version'],
                      $info['stable'], '>='))) {
                    continue;
                }
            }
            $pos = array_search(strtolower($name), $local_pkgs);
            if ($pos !== false) {
                unset($local_pkgs[$pos]);
            }

            if (isset($info['stable']) && !$info['stable']) {
                $info['stable'] = null;
            }

            if (isset($options['channelinfo'])) {
                // add full channelinfo
                if ($info['stable'] === $info['unstable']) {
                    $state = $info['state'];
                } else {
                    $state = 'stable';
                }
                $latest = $info['stable'].' ('.$state.')';
                $local = '';
                if (isset($installed['version'])) {
                    $inst_state = $reg->packageInfo($name, 'release_state', $channel);
                    $local = $installed['version'].' ('.$inst_state.')';
                }

                $packageinfo = array(
                    $channel,
                    $name,
                    $latest,
                    $local,
                    isset($desc) ? $desc : null,
                    isset($info['deps']) ? $info['deps'] : null,
                );
            } else {
                $packageinfo = array(
                    $reg->channelAlias($channel) . '/' . $name,
                    isset($info['stable']) ? $info['stable'] : null,
                    isset($installed['version']) ? $installed['version'] : null,
                    isset($desc) ? $desc : null,
                    isset($info['deps']) ? $info['deps'] : null,
                );
            }
            $data['data'][$info['category']][] = $packageinfo;
        }

        if (isset($options['mode']) && in_array($options['mode'], array('notinstalled', 'upgrades'))) {
            $this->config->set('default_channel', $savechannel);
            $this->ui->outputData($data, $command);
            return true;
        }

        foreach ($local_pkgs as $name) {
            $info = &$reg->getPackage($name, $channel);
            $data['data']['Local'][] = array(
                $reg->channelAlias($channel) . '/' . $info->getPackage(),
                '',
                $info->getVersion(),
                $info->getSummary(),
                $info->getDeps()
                );
        }

        $this->config->set('default_channel', $savechannel);
        $this->ui->outputData($data, $command);
        return true;
    }

    function doSearch($command, $options, $params)
    {
        if ((!isset($params[0]) || empty($params[0]))
            && (!isset($params[1]) || empty($params[1])))
        {
            return $this->raiseError('no valid search string supplied');
        }

        $channelinfo = isset($options['channelinfo']);
        $reg = &$this->config->getRegistry();
        if (isset($options['allchannels'])) {
            // search all channels
            unset($options['allchannels']);
            $channels = $reg->getChannels();
            $errors = array();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($channels as $channel) {
                if ($channel->getName() != '__uri') {
                    $options['channel'] = $channel->getName();
                    $ret = $this->doSearch($command, $options, $params);
                    if (PEAR::isError($ret)) {
                        $errors[] = $ret;
                    }
                }
            }

            PEAR::staticPopErrorHandling();
            if (count($errors) !== 0) {
                // for now, only give first error
                return PEAR::raiseError($errors[0]);
            }

            return true;
        }

        $savechannel = $channel = $this->config->get('default_channel');
        $package = strtolower($params[0]);
        $summary = isset($params[1]) ? $params[1] : false;
        if (isset($options['channel'])) {
            $reg = &$this->config->getRegistry();
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError('Channel "' . $channel . '" does not exist');
            }

            $this->config->set('default_channel', $channel);
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, false, false, $package, $summary, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($available);
        }

        if (!$available && !$channelinfo) {
            // clean exit when not found, no error !
            $data = 'no packages found that match pattern "' . $package . '", for channel '.$channel.'.';
            $this->ui->outputData($data);
            $this->config->set('default_channel', $channel);
            return true;
        }

        if ($channelinfo) {
            $data = array(
                'caption' => 'Matched packages, channel ' . $channel . ':',
                'border' => true,
                'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'),
                'channel' => $channel
                );
        } else {
            $data = array(
                'caption' => 'Matched packages, channel ' . $channel . ':',
                'border' => true,
                'headline' => array('Package', 'Stable/(Latest)', 'Local'),
                'channel' => $channel
                );
        }

        if (!$available && $channelinfo) {
            unset($data['headline']);
            $data['data'] = 'No packages found that match pattern "' . $package . '".';
            $available = array();
        }

        foreach ($available as $name => $info) {
            $installed = $reg->packageInfo($name, null, $channel);
            $desc = $info['summary'];
            if (isset($params[$name]))
                $desc .= "\n\n".$info['description'];

            if (!isset($info['stable']) || !$info['stable']) {
                $version_remote = 'none';
            } else {
                if ($info['unstable']) {
                    $version_remote = $info['unstable'];
                } else {
                    $version_remote = $info['stable'];
                }
                $version_remote .= ' ('.$info['state'].')';
            }
            $version = is_array($installed['version']) ? $installed['version']['release'] :
                $installed['version'];
            if ($channelinfo) {
                $packageinfo = array(
                    $channel,
                    $name,
                    $version_remote,
                    $version,
                    $desc,
                );
            } else {
                $packageinfo = array(
                    $name,
                    $version_remote,
                    $version,
                    $desc,
                );
            }
            $data['data'][$info['category']][] = $packageinfo;
        }

        $this->ui->outputData($data, $command);
        $this->config->set('default_channel', $channel);
        return true;
    }

    function &getDownloader($options)
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($this->ui, $options, $this->config);
        return $a;
    }

    function doDownload($command, $options, $params)
    {
        // make certain that dependencies are ignored
        $options['downloadonly'] = 1;

        // eliminate error messages for preferred_state-related errors
        /* TODO: Should be an option, but until now download does respect
           preferred state */
        /* $options['ignorepreferred_state'] = 1; */
        // eliminate error messages for preferred_state-related errors

        $downloader = &$this->getDownloader($options);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $e = $downloader->setDownloadDir(getcwd());
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($e)) {
            return $this->raiseError('Current directory is not writeable, cannot download');
        }

        $errors = array();
        $downloaded = array();
        $err = $downloader->download($params);
        if (PEAR::isError($err)) {
            return $err;
        }

        $errors = $downloader->getErrorMsgs();
        if (count($errors)) {
            foreach ($errors as $error) {
                if ($error !== null) {
                    $this->ui->outputData($error);
                }
            }

            return $this->raiseError("$command failed");
        }

        $downloaded = $downloader->getDownloadedPackages();
        foreach ($downloaded as $pkg) {
            $this->ui->outputData("File $pkg[file] downloaded", $command);
        }

        return true;
    }

    function downloadCallback($msg, $params = null)
    {
        if ($msg == 'done') {
            $this->bytes_downloaded = $params;
        }
    }

    function doListUpgrades($command, $options, $params)
    {
        require_once 'PEAR/Common.php';
        if (isset($params[0]) && !is_array(PEAR_Common::betterStates($params[0]))) {
            return $this->raiseError($params[0] . ' is not a valid state (stable/beta/alpha/devel/etc.) try "pear help list-upgrades"');
        }

        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        foreach ($reg->listChannels() as $channel) {
            $inst = array_flip($reg->listPackages($channel));
            if (!count($inst)) {
                continue;
            }

            if ($channel == '__uri') {
                continue;
            }

            $this->config->set('default_channel', $channel);
            $state = empty($params[0]) ? $this->config->get('preferred_state') : $params[0];

            $caption = $channel . ' Available Upgrades';
            $chan = $reg->getChannel($channel);
            if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
                return $e;
            }

            $latest = array();
            $base2  = false;
            $preferred_mirror = $this->config->get('preferred_mirror');
            if ($chan->supportsREST($preferred_mirror) &&
                (
                   ($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror))
                   || ($base  = $chan->getBaseURL('REST1.0', $preferred_mirror))
                )

            ) {
                if ($base2) {
                    $rest = &$this->config->getREST('1.3', array());
                    $base = $base2;
                } else {
                    $rest = &$this->config->getREST('1.0', array());
                }

                if (empty($state) || $state == 'any') {
                    $state = false;
                } else {
                    $caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')';
                }

                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $latest = $rest->listLatestUpgrades($base, $state, $inst, $channel, $reg);
                PEAR::staticPopErrorHandling();
            }

            if (PEAR::isError($latest)) {
                $this->ui->outputData($latest->getMessage());
                continue;
            }

            $caption .= ':';
            if (PEAR::isError($latest)) {
                $this->config->set('default_channel', $savechannel);
                return $latest;
            }

            $data = array(
                'caption' => $caption,
                'border' => 1,
                'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Size'),
                'channel' => $channel
                );

            foreach ((array)$latest as $pkg => $info) {
                $package = strtolower($pkg);
                if (!isset($inst[$package])) {
                    // skip packages we don't have installed
                    continue;
                }

                extract($info);
                $inst_version = $reg->packageInfo($package, 'version', $channel);
                $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
                if (version_compare("$version", "$inst_version", "le")) {
                    // installed version is up-to-date
                    continue;
                }

                if ($filesize >= 20480) {
                    $filesize += 1024 - ($filesize % 1024);
                    $fs = sprintf("%dkB", $filesize / 1024);
                } elseif ($filesize > 0) {
                    $filesize += 103 - ($filesize % 103);
                    $fs = sprintf("%.1fkB", $filesize / 1024.0);
                } else {
                    $fs = "  -"; // XXX center instead
                }

                $data['data'][] = array($channel, $pkg, "$inst_version ($inst_state)", "$version ($state)", $fs);
            }

            if (isset($options['channelinfo'])) {
                if (empty($data['data'])) {
                    unset($data['headline']);
                    if (count($inst) == 0) {
                        $data['data'] = '(no packages installed)';
                    } else {
                        $data['data'] = '(no upgrades available)';
                    }
                }
                $this->ui->outputData($data, $command);
            } else {
                if (empty($data['data'])) {
                    $this->ui->outputData('Channel ' . $channel . ': No upgrades available');
                } else {
                    $this->ui->outputData($data, $command);
                }
            }
        }

        $this->config->set('default_channel', $savechannel);
        return true;
    }

    function doClearCache($command, $options, $params)
    {
        $cache_dir = $this->config->get('cache_dir');
        $verbose   = $this->config->get('verbose');
        $output = '';
        if (!file_exists($cache_dir) || !is_dir($cache_dir)) {
            return $this->raiseError("$cache_dir does not exist or is not a directory");
        }

        if (!($dp = @opendir($cache_dir))) {
            return $this->raiseError("opendir($cache_dir) failed: $php_errormsg");
        }

        if ($verbose >= 1) {
            $output .= "reading directory $cache_dir\n";
        }

        $num = 0;
        while ($ent = readdir($dp)) {
            if (preg_match('/rest.cache(file|id)\\z/', $ent)) {
                $path = $cache_dir . DIRECTORY_SEPARATOR . $ent;
                if (file_exists($path)) {
                    $ok = @unlink($path);
                } else {
                    $ok = false;
                    $php_errormsg = '';
                }

                if ($ok) {
                    if ($verbose >= 2) {
                        $output .= "deleted $path\n";
                    }
                    $num++;
                } elseif ($verbose >= 1) {
                    $output .= "failed to delete $path $php_errormsg\n";
                }
            }
        }

        closedir($dp);
        if ($verbose >= 1) {
            $output .= "$num cache entries cleared\n";
        }

        $this->ui->outputData(rtrim($output), $command);
        return $num;
    }
}
pear/PEAR/Command/Mirror.xml000064400000001151151732710130011572 0ustar00<commands version="1.0">
 <download-all>
  <summary>Downloads each available package from the default channel</summary>
  <function>doDownloadAll</function>
  <shortcut>da</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>
Requests a list of available packages from the default channel ({config default_channel})
and downloads them to current working directory.  Note: only
packages within preferred_state ({config preferred_state}) will be downloaded</doc>
 </download-all>
</commands>pear/PEAR/Command/Channels.php000064400000101245151732710130012047 0ustar00<?php
// /* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
 * PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add,
 * channel-update, channel-info, channel-alias, channel-discover commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

define('PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS', -500);

/**
 * PEAR commands for managing channels.
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Command_Channels extends PEAR_Command_Common
{
    var $commands = array(
        'list-channels' => array(
            'summary' => 'List Available Channels',
            'function' => 'doList',
            'shortcut' => 'lc',
            'options' => array(),
            'doc' => '
List all available channels for installation.
',
            ),
        'update-channels' => array(
            'summary' => 'Update the Channel List',
            'function' => 'doUpdateAll',
            'shortcut' => 'uc',
            'options' => array(),
            'doc' => '
List all installed packages in all channels.
'
            ),
        'channel-delete' => array(
            'summary' => 'Remove a Channel From the List',
            'function' => 'doDelete',
            'shortcut' => 'cde',
            'options' => array(),
            'doc' => '<channel name>
Delete a channel from the registry.  You may not
remove any channel that has installed packages.
'
            ),
        'channel-add' => array(
            'summary' => 'Add a Channel',
            'function' => 'doAdd',
            'shortcut' => 'ca',
            'options' => array(),
            'doc' => '<channel.xml>
Add a private channel to the channel list.  Note that all
public channels should be synced using "update-channels".
Parameter may be either a local file or remote URL to a
channel.xml.
'
            ),
        'channel-update' => array(
            'summary' => 'Update an Existing Channel',
            'function' => 'doUpdate',
            'shortcut' => 'cu',
            'options' => array(
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'will force download of new channel.xml if an existing channel name is used',
                    ),
                'channel' => array(
                    'shortopt' => 'c',
                    'arg' => 'CHANNEL',
                    'doc' => 'will force download of new channel.xml if an existing channel name is used',
                    ),
),
            'doc' => '[<channel.xml>|<channel name>]
Update a channel in the channel list directly.  Note that all
public channels can be synced using "update-channels".
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
'
            ),
        'channel-info' => array(
            'summary' => 'Retrieve Information on a Channel',
            'function' => 'doInfo',
            'shortcut' => 'ci',
            'options' => array(),
            'doc' => '<package>
List the files in an installed package.
'
            ),
        'channel-alias' => array(
            'summary' => 'Specify an alias to a channel name',
            'function' => 'doAlias',
            'shortcut' => 'cha',
            'options' => array(),
            'doc' => '<channel> <alias>
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
'
            ),
        'channel-discover' => array(
            'summary' => 'Initialize a Channel from its server',
            'function' => 'doDiscover',
            'shortcut' => 'di',
            'options' => array(),
            'doc' => '[<channel.xml>|<channel name>]
Initialize a channel from its server and create a local channel.xml.
If <channel name> is in the format "<username>:<password>@<channel>" then
<username> and <password> will be set as the login username/password for
<channel>. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system\'s process list.
'
            ),
        'channel-login' => array(
            'summary' => 'Connects and authenticates to remote channel server',
            'shortcut' => 'cli',
            'function' => 'doLogin',
            'options' => array(),
            'doc' => '<channel name>
Log in to a remote channel server.  If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.',
            ),
        'channel-logout' => array(
            'summary' => 'Logs out from the remote channel server',
            'shortcut' => 'clo',
            'function' => 'doLogout',
            'options' => array(),
            'doc' => '<channel name>
Logs out from a remote channel server.  If <channel name> is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.',
            ),
        );

    /**
     * PEAR_Command_Registry constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _sortChannels($a, $b)
    {
        return strnatcasecmp($a->getName(), $b->getName());
    }

    function doList($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $registered = $reg->getChannels();
        usort($registered, array(&$this, '_sortchannels'));
        $i = $j = 0;
        $data = array(
            'caption' => 'Registered Channels:',
            'border' => true,
            'headline' => array('Channel', 'Alias', 'Summary')
            );
        foreach ($registered as $channel) {
            $data['data'][] = array($channel->getName(),
                                    $channel->getAlias(),
                                    $channel->getSummary());
        }

        if (count($registered) === 0) {
            $data = '(no registered channels)';
        }
        $this->ui->outputData($data, $command);
        return true;
    }

    function doUpdateAll($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $channels = $reg->getChannels();

        $success = true;
        foreach ($channels as $channel) {
            if ($channel->getName() != '__uri') {
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $err = $this->doUpdate('channel-update',
                                          $options,
                                          array($channel->getName()));
                if (PEAR::isError($err)) {
                    $this->ui->outputData($err->getMessage(), $command);
                    $success = false;
                } else {
                    $success &= $err;
                }
            }
        }
        return $success;
    }

    function doInfo($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel specified");
        }

        $reg     = &$this->config->getRegistry();
        $channel = strtolower($params[0]);
        if ($reg->channelExists($channel)) {
            $chan = $reg->getChannel($channel);
            if (PEAR::isError($chan)) {
                return $this->raiseError($chan);
            }
        } else {
            if (strpos($channel, '://')) {
                $downloader = &$this->getDownloader();
                $tmpdir = $this->config->get('temp_dir');
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($loc)) {
                    return $this->raiseError('Cannot open "' . $channel .
                        '" (' . $loc->getMessage() . ')');
                } else {
                    $contents = implode('', file($loc));
                }
            } else {
                if (!file_exists($params[0])) {
                    return $this->raiseError('Unknown channel "' . $channel . '"');
                }

                $fp = fopen($params[0], 'r');
                if (!$fp) {
                    return $this->raiseError('Cannot open "' . $params[0] . '"');
                }

                $contents = '';
                while (!feof($fp)) {
                    $contents .= fread($fp, 1024);
                }
                fclose($fp);
            }

            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $chan = new PEAR_ChannelFile;
            $chan->fromXmlString($contents);
            $chan->validate();
            if ($errs = $chan->getErrors(true)) {
                foreach ($errs as $err) {
                    $this->ui->outputData($err['level'] . ': ' . $err['message']);
                }
                return $this->raiseError('Channel file "' . $params[0] . '" is not valid');
            }
        }

        if (!$chan) {
            return $this->raiseError('Serious error: Channel "' . $params[0] .
                '" has a corrupted registry entry');
        }

        $channel = $chan->getName();
        $caption = 'Channel ' . $channel . ' Information:';
        $data1 = array(
            'caption' => $caption,
            'border' => true);
        $data1['data']['server'] = array('Name and Server', $chan->getName());
        if ($chan->getAlias() != $chan->getName()) {
            $data1['data']['alias'] = array('Alias', $chan->getAlias());
        }

        $data1['data']['summary'] = array('Summary', $chan->getSummary());
        $validate = $chan->getValidationPackage();
        $data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']);
        $data1['data']['vpackageversion'] =
            array('Validation Package Version', $validate['attribs']['version']);
        $d = array();
        $d['main'] = $data1;

        $data['data'] = array();
        $data['caption'] = 'Server Capabilities';
        $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
        if ($chan->supportsREST()) {
            if ($chan->supportsREST()) {
                $funcs = $chan->getFunctions('rest');
                if (!isset($funcs[0])) {
                    $funcs = array($funcs);
                }
                foreach ($funcs as $protocol) {
                    $data['data'][] = array('rest', $protocol['attribs']['type'],
                        $protocol['_content']);
                }
            }
        } else {
            $data['data'][] = array('No supported protocols');
        }

        $d['protocols'] = $data;
        $data['data'] = array();
        $mirrors = $chan->getMirrors();
        if ($mirrors) {
            $data['caption'] = 'Channel ' . $channel . ' Mirrors:';
            unset($data['headline']);
            foreach ($mirrors as $mirror) {
                $data['data'][] = array($mirror['attribs']['host']);
                $d['mirrors'] = $data;
            }

            foreach ($mirrors as $i => $mirror) {
                $data['data'] = array();
                $data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities';
                $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
                if ($chan->supportsREST($mirror['attribs']['host'])) {
                    if ($chan->supportsREST($mirror['attribs']['host'])) {
                        $funcs = $chan->getFunctions('rest', $mirror['attribs']['host']);
                        if (!isset($funcs[0])) {
                            $funcs = array($funcs);
                        }

                        foreach ($funcs as $protocol) {
                            $data['data'][] = array('rest', $protocol['attribs']['type'],
                                $protocol['_content']);
                        }
                    }
                } else {
                    $data['data'][] = array('No supported protocols');
                }
                $d['mirrorprotocols' . $i] = $data;
            }
        }
        $this->ui->outputData($d, 'channel-info');
    }

    // }}}

    function doDelete($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('channel-delete: no channel specified');
        }

        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($params[0])) {
            return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist');
        }

        $channel = $reg->channelName($params[0]);
        if ($channel == 'pear.php.net') {
            return $this->raiseError('Cannot delete the pear.php.net channel');
        }

        if ($channel == 'pecl.php.net') {
            return $this->raiseError('Cannot delete the pecl.php.net channel');
        }

        if ($channel == 'doc.php.net') {
            return $this->raiseError('Cannot delete the doc.php.net channel');
        }

        if ($channel == '__uri') {
            return $this->raiseError('Cannot delete the __uri pseudo-channel');
        }

        if (PEAR::isError($err = $reg->listPackages($channel))) {
            return $err;
        }

        if (count($err)) {
            return $this->raiseError('Channel "' . $channel .
                '" has installed packages, cannot delete');
        }

        if (!$reg->deleteChannel($channel)) {
            return $this->raiseError('Channel "' . $channel . '" deletion failed');
        } else {
            $this->config->deleteChannel($channel);
            $this->ui->outputData('Channel "' . $channel . '" deleted', $command);
        }
    }

    function doAdd($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('channel-add: no channel file specified');
        }

        if (strpos($params[0], '://')) {
            $downloader = &$this->getDownloader();
            $tmpdir = $this->config->get('temp_dir');
            if (!file_exists($tmpdir)) {
                require_once 'System.php';
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $err = System::mkdir(array('-p', $tmpdir));
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($err)) {
                    return $this->raiseError('channel-add: temp_dir does not exist: "' .
                        $tmpdir .
                        '" - You can change this location with "pear config-set temp_dir"');
                }
            }

            if (!is_writable($tmpdir)) {
                return $this->raiseError('channel-add: temp_dir is not writable: "' .
                    $tmpdir .
                    '" - You can change this location with "pear config-set temp_dir"');
            }

            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($loc)) {
                return $this->raiseError('channel-add: Cannot open "' . $params[0] .
                    '" (' . $loc->getMessage() . ')');
            }

            list($loc, $lastmodified) = $loc;
            $contents = implode('', file($loc));
        } else {
            $lastmodified = $fp = false;
            if (file_exists($params[0])) {
                $fp = fopen($params[0], 'r');
            }

            if (!$fp) {
                return $this->raiseError('channel-add: cannot open "' . $params[0] . '"');
            }

            $contents = '';
            while (!feof($fp)) {
                $contents .= fread($fp, 1024);
            }
            fclose($fp);
        }

        if (!class_exists('PEAR_ChannelFile')) {
            require_once 'PEAR/ChannelFile.php';
        }

        $channel = new PEAR_ChannelFile;
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $result = $channel->fromXmlString($contents);
        PEAR::staticPopErrorHandling();
        if (!$result) {
            $exit = false;
            if (count($errors = $channel->getErrors(true))) {
                foreach ($errors as $error) {
                    $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
                    if (!$exit) {
                        $exit = $error['level'] == 'error' ? true : false;
                    }
                }
                if ($exit) {
                    return $this->raiseError('channel-add: invalid channel.xml file');
                }
            }
        }

        $reg = &$this->config->getRegistry();
        if ($reg->channelExists($channel->getName())) {
            return $this->raiseError('channel-add: Channel "' . $channel->getName() .
                '" exists, use channel-update to update entry', PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
        }

        $ret = $reg->addChannel($channel, $lastmodified);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if (!$ret) {
            return $this->raiseError('channel-add: adding Channel "' . $channel->getName() .
                '" to registry failed');
        }

        $this->config->setChannels($reg->listChannels());
        $this->config->writeConfigFile();
        $this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command);
    }

    function doUpdate($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel file specified");
        }

        $tmpdir = $this->config->get('temp_dir');
        if (!file_exists($tmpdir)) {
            require_once 'System.php';
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = System::mkdir(array('-p', $tmpdir));
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($err)) {
                return $this->raiseError('channel-add: temp_dir does not exist: "' .
                    $tmpdir .
                    '" - You can change this location with "pear config-set temp_dir"');
            }
        }

        if (!is_writable($tmpdir)) {
            return $this->raiseError('channel-add: temp_dir is not writable: "' .
                $tmpdir .
                '" - You can change this location with "pear config-set temp_dir"');
        }

        $reg = &$this->config->getRegistry();
        $lastmodified = false;
        if ((!file_exists($params[0]) || is_dir($params[0]))
              && $reg->channelExists(strtolower($params[0]))) {
            $c = $reg->getChannel(strtolower($params[0]));
            if (PEAR::isError($c)) {
                return $this->raiseError($c);
            }

            $this->ui->outputData("Updating channel \"$params[0]\"", $command);
            $dl = &$this->getDownloader(array());
            // if force is specified, use a timestamp of "1" to force retrieval
            $lastmodified = isset($options['force']) ? false : $c->lastModified();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml',
                $this->ui, $tmpdir, null, $lastmodified);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($contents)) {
                // Attempt to fall back to https
                $this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage());
                $this->ui->outputData("Trying channel \"$params[0]\" over https:// instead");
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml',
                    $this->ui, $tmpdir, null, $lastmodified);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($contents)) {
                    return $this->raiseError('Cannot retrieve channel.xml for channel "' .
                        $c->getName() . '" (' . $contents->getMessage() . ')');
                }
            }

            list($contents, $lastmodified) = $contents;
            if (!$contents) {
                $this->ui->outputData("Channel \"$params[0]\" is up to date");
                return;
            }

            $contents = implode('', file($contents));
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $channel = new PEAR_ChannelFile;
            $channel->fromXmlString($contents);
            if (!$channel->getErrors()) {
                // security check: is the downloaded file for the channel we got it from?
                if (strtolower($channel->getName()) != strtolower($c->getName())) {
                    if (!isset($options['force'])) {
                        return $this->raiseError('ERROR: downloaded channel definition file' .
                            ' for channel "' . $channel->getName() . '" from channel "' .
                            strtolower($c->getName()) . '"');
                    }

                    $this->ui->log(0, 'WARNING: downloaded channel definition file' .
                        ' for channel "' . $channel->getName() . '" from channel "' .
                        strtolower($c->getName()) . '"');
                }
            }
        } else {
            if (strpos($params[0], '://')) {
                $dl = &$this->getDownloader();
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $loc = $dl->downloadHttp($params[0],
                    $this->ui, $tmpdir, null, $lastmodified);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($loc)) {
                    return $this->raiseError("Cannot open " . $params[0] .
                         ' (' . $loc->getMessage() . ')');
                }

                list($loc, $lastmodified) = $loc;
                $contents = implode('', file($loc));
            } else {
                $fp = false;
                if (file_exists($params[0])) {
                    $fp = fopen($params[0], 'r');
                }

                if (!$fp) {
                    return $this->raiseError("Cannot open " . $params[0]);
                }

                $contents = '';
                while (!feof($fp)) {
                    $contents .= fread($fp, 1024);
                }
                fclose($fp);
            }

            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $channel = new PEAR_ChannelFile;
            $channel->fromXmlString($contents);
        }

        $exit = false;
        if (count($errors = $channel->getErrors(true))) {
            foreach ($errors as $error) {
                $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
                if (!$exit) {
                    $exit = $error['level'] == 'error' ? true : false;
                }
            }
            if ($exit) {
                return $this->raiseError('Invalid channel.xml file');
            }
        }

        if (!$reg->channelExists($channel->getName())) {
            return $this->raiseError('Error: Channel "' . $channel->getName() .
                '" does not exist, use channel-add to add an entry');
        }

        $ret = $reg->updateChannel($channel, $lastmodified);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if (!$ret) {
            return $this->raiseError('Updating Channel "' . $channel->getName() .
                '" in registry failed');
        }

        $this->config->setChannels($reg->listChannels());
        $this->config->writeConfigFile();
        $this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded');
    }

    function &getDownloader()
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($this->ui, array(), $this->config);
        return $a;
    }

    function doAlias($command, $options, $params)
    {
        if (count($params) === 1) {
            return $this->raiseError('No channel alias specified');
        }

        if (count($params) !== 2 || (!empty($params[1]) && $params[1][0] == '-')) {
            return $this->raiseError(
                'Invalid format, correct is: channel-alias channel alias');
        }

        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($params[0], true)) {
            $extra = '';
            if ($reg->isAlias($params[0])) {
                $extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' .
                    strtolower($params[1]) . '")';
            }

            return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra);
        }

        if ($reg->isAlias($params[1])) {
            return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' .
                'already aliased to "' . strtolower($params[1]) . '", cannot re-alias');
        }

        $chan = $reg->getChannel($params[0]);
        if (PEAR::isError($chan)) {
            return $this->raiseError('Corrupt registry?  Error retrieving channel "' . $params[0] .
                '" information (' . $chan->getMessage() . ')');
        }

        // make it a local alias
        if (!$chan->setAlias(strtolower($params[1]), true)) {
            return $this->raiseError('Alias "' . strtolower($params[1]) .
                '" is not a valid channel alias');
        }

        $reg->updateChannel($chan);
        $this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' .
            strtolower($params[1]) . '"');
    }

    /**
     * The channel-discover command
     *
     * @param string $command command name
     * @param array  $options option_name => value
     * @param array  $params  list of additional parameters.
     *               $params[0] should contain a string with either:
     *               - <channel name> or
     *               - <username>:<password>@<channel name>
     * @return null|PEAR_Error
     */
    function doDiscover($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel server specified");
        }

        // Look for the possible input format "<username>:<password>@<channel>"
        if (preg_match('/^(.+):(.+)@(.+)\\z/', $params[0], $matches)) {
            $username = $matches[1];
            $password = $matches[2];
            $channel  = $matches[3];
        } else {
            $channel = $params[0];
        }

        $reg = &$this->config->getRegistry();
        if ($reg->channelExists($channel)) {
            if (!$reg->isAlias($channel)) {
                return $this->raiseError("Channel \"$channel\" is already initialized", PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
            }

            return $this->raiseError("A channel alias named \"$channel\" " .
                'already exists, aliasing channel "' . $reg->channelName($channel)
                . '"');
        }

        $this->pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->doAdd($command, $options, array('http://' . $channel . '/channel.xml'));
        $this->popErrorHandling();
        if (PEAR::isError($err)) {
            if ($err->getCode() === PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS) {
                return $this->raiseError("Discovery of channel \"$channel\" failed (" .
                    $err->getMessage() . ')');
            }
            // Attempt fetch via https
            $this->ui->outputData("Discovering channel $channel over http:// failed with message: " . $err->getMessage());
            $this->ui->outputData("Trying to discover channel $channel over https:// instead");
            $this->pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->doAdd($command, $options, array('https://' . $channel . '/channel.xml'));
            $this->popErrorHandling();
            if (PEAR::isError($err)) {
                return $this->raiseError("Discovery of channel \"$channel\" failed (" .
                    $err->getMessage() . ')');
            }
        }

        // Store username/password if they were given
        // Arguably we should do a logintest on the channel here, but since
        // that's awkward on a REST-based channel (even "pear login" doesn't
        // do it for those), and XML-RPC is deprecated, it's fairly pointless.
        if (isset($username)) {
            $this->config->set('username', $username, 'user', $channel);
            $this->config->set('password', $password, 'user', $channel);
            $this->config->store();
            $this->ui->outputData("Stored login for channel \"$channel\" using username \"$username\"", $command);
        }

        $this->ui->outputData("Discovery of channel \"$channel\" succeeded", $command);
    }

    /**
     * Execute the 'login' command.
     *
     * @param string $command command name
     * @param array $options option_name => value
     * @param array $params list of additional parameters
     *
     * @return bool TRUE on success or
     * a PEAR error on failure
     *
     * @access public
     */
    function doLogin($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();

        // If a parameter is supplied, use that as the channel to log in to
        $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        $server   = $this->config->get('preferred_mirror', null, $channel);
        $username = $this->config->get('username',         null, $channel);
        if (empty($username)) {
            $username = isset($_ENV['USER']) ? $_ENV['USER'] : null;
        }
        $this->ui->outputData("Logging in to $server.", $command);

        list($username, $password) = $this->ui->userDialog(
            $command,
            array('Username', 'Password'),
            array('text',     'password'),
            array($username,  '')
            );
        $username = trim($username);
        $password = trim($password);

        $ourfile = $this->config->getConfFile('user');
        if (!$ourfile) {
            $ourfile = $this->config->getConfFile('system');
        }

        $this->config->set('username', $username, 'user', $channel);
        $this->config->set('password', $password, 'user', $channel);

        if ($chan->supportsREST()) {
            $ok = true;
        }

        if ($ok !== true) {
            return $this->raiseError('Login failed!');
        }

        $this->ui->outputData("Logged in.", $command);
        // avoid changing any temporary settings changed with -d
        $ourconfig = new PEAR_Config($ourfile, $ourfile);
        $ourconfig->set('username', $username, 'user', $channel);
        $ourconfig->set('password', $password, 'user', $channel);
        $ourconfig->store();

        return true;
    }

    /**
     * Execute the 'logout' command.
     *
     * @param string $command command name
     * @param array $options option_name => value
     * @param array $params list of additional parameters
     *
     * @return bool TRUE on success or
     * a PEAR error on failure
     *
     * @access public
     */
    function doLogout($command, $options, $params)
    {
        $reg     = &$this->config->getRegistry();

        // If a parameter is supplied, use that as the channel to log in to
        $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');

        $chan    = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        $server = $this->config->get('preferred_mirror', null, $channel);
        $this->ui->outputData("Logging out from $server.", $command);
        $this->config->remove('username', 'user', $channel);
        $this->config->remove('password', 'user', $channel);
        $this->config->store();
        return true;
    }
}
pear/PEAR/Command/Remote.xml000064400000006357151732710130011570 0ustar00<commands version="1.0">
 <remote-info>
  <summary>Information About Remote Packages</summary>
  <function>doRemoteInfo</function>
  <shortcut>ri</shortcut>
  <options />
  <doc>&lt;package&gt;
Get details on a package from the server.</doc>
 </remote-info>
 <list-upgrades>
  <summary>List Available Upgrades</summary>
  <function>doListUpgrades</function>
  <shortcut>lu</shortcut>
  <options>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>[preferred_state]
List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.</doc>
 </list-upgrades>
 <remote-list>
  <summary>List Remote Packages</summary>
  <function>doRemoteList</function>
  <shortcut>rl</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
 </remote-list>
 <search>
  <summary>Search remote package database</summary>
  <function>doSearch</function>
  <shortcut>sp</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
   <allchannels>
    <shortopt>a</shortopt>
    <doc>search packages from all known channels</doc>
   </allchannels>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>[packagename] [packageinfo]
Lists all packages which match the search parameters.  The first
parameter is a fragment of a packagename.  The default channel
will be used unless explicitly overridden.  The second parameter
will be used to match any portion of the summary/description</doc>
 </search>
 <list-all>
  <summary>List All Packages</summary>
  <function>doListAll</function>
  <shortcut>la</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
 </list-all>
 <download>
  <summary>Download Package</summary>
  <function>doDownload</function>
  <shortcut>d</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>download an uncompressed (.tar) file</doc>
   </nocompress>
  </options>
  <doc>&lt;package&gt;...
Download package tarballs.  The files will be named as suggested by the
server, for example if you download the DB package and the latest stable
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.</doc>
 </download>
 <clear-cache>
  <summary>Clear Web Services Cache</summary>
  <function>doClearCache</function>
  <shortcut>cc</shortcut>
  <options />
  <doc>
Clear the XML-RPC/REST cache.  See also the cache_ttl configuration
parameter.
</doc>
 </clear-cache>
</commands>pear/PEAR/Command/Registry.xml000064400000003376151732710140012144 0ustar00<commands version="1.0">
 <list>
  <summary>List Installed Packages In The Default Channel</summary>
  <function>doList</function>
  <shortcut>l</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>list installed packages from this channel</doc>
    <arg>CHAN</arg>
   </channel>
   <allchannels>
    <shortopt>a</shortopt>
    <doc>list installed packages from all channels</doc>
   </allchannels>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>&lt;package&gt;
If invoked without parameters, this command lists the PEAR packages
installed in your php_dir ({config php_dir}).  With a parameter, it
lists the files in a package.
</doc>
 </list>
 <list-files>
  <summary>List Files In Installed Package</summary>
  <function>doFileList</function>
  <shortcut>fl</shortcut>
  <options />
  <doc>&lt;package&gt;
List the files in an installed package.
</doc>
 </list-files>
 <shell-test>
  <summary>Shell Script Test</summary>
  <function>doShellTest</function>
  <shortcut>st</shortcut>
  <options />
  <doc>&lt;package&gt; [[relation] version]
Tests if a package is installed in the system. Will exit(1) if it is not.
   &lt;relation&gt;   The version comparison operator. One of:
                &lt;, lt, &lt;=, le, &gt;, gt, &gt;=, ge, ==, =, eq, !=, &lt;&gt;, ne
   &lt;version&gt;    The version to compare with
</doc>
 </shell-test>
 <info>
  <summary>Display information about a package</summary>
  <function>doInfo</function>
  <shortcut>in</shortcut>
  <options />
  <doc>&lt;package&gt;
Displays information about a package. The package argument may be a
local package file, an URL to a package file, or the name of an
installed package.</doc>
 </info>
</commands>pear/PEAR/Command/Install.php000064400000143473151732710140011734 0ustar00<?php
/**
 * PEAR_Command_Install (install, upgrade, upgrade-all, uninstall, bundle, run-scripts commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for installation or deinstallation/upgrading of
 * packages.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Install extends PEAR_Command_Common
{
    // {{{ properties

    var $commands = array(
        'install' => array(
            'summary' => 'Install Package',
            'function' => 'doInstall',
            'shortcut' => 'i',
            'options' => array(
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'will overwrite newer installed packages',
                    ),
                'loose' => array(
                    'shortopt' => 'l',
                    'doc' => 'do not check for recommended dependency version',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, install anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as installed',
                    ),
                'soft' => array(
                    'shortopt' => 's',
                    'doc' => 'soft install, fail silently, or upgrade if already installed',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'configureoptions' => array(
                    'shortopt' => 'D',
                    'arg' => 'OPTION1=VALUE[ OPTION2=VALUE]',
                    'doc' => 'space-delimited list of configure options',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM',
                    ),
                'packagingroot' => array(
                    'shortopt' => 'P',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when packaging files, like RPM packaging',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'alldeps' => array(
                    'shortopt' => 'a',
                    'doc' => 'install all required and optional dependencies',
                    ),
                'onlyreqdeps' => array(
                    'shortopt' => 'o',
                    'doc' => 'install all required dependencies',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to download any urls or contact channels',
                    ),
                'pretend' => array(
                    'shortopt' => 'p',
                    'doc' => 'Only list the packages that would be downloaded',
                    ),
                ),
            'doc' => '[channel/]<package> ...
Installs one or more PEAR packages.  You can specify a package to
install in four ways:

"Package-1.0.tgz" : installs from a local file

"http://example.com/Package-1.0.tgz" : installs from
anywhere on the net.

"package.xml" : installs the package described in
package.xml.  Useful for testing, or for wrapping a PEAR package in
another package manager such as RPM.

"Package[-version/state][.tar]" : queries your default channel\'s server
({config master_server}) and downloads the newest package with
the preferred quality/state ({config preferred_state}).

To retrieve Package version 1.1, use "Package-1.1," to retrieve
Package state beta, use "Package-beta."  To retrieve an uncompressed
file, append .tar (make sure there is no file by the same name first)

To download a package from another channel, prefix with the channel name like
"channel/Package"

More than one package may be specified at once.  It is ok to mix these
four ways of specifying packages.
'),
        'upgrade' => array(
            'summary' => 'Upgrade Package',
            'function' => 'doInstall',
            'shortcut' => 'up',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'upgrade packages from a specific channel',
                    'arg' => 'CHAN',
                    ),
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'overwrite newer installed packages',
                    ),
                'loose' => array(
                    'shortopt' => 'l',
                    'doc' => 'do not check for recommended dependency version',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, upgrade anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as upgraded',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'alldeps' => array(
                    'shortopt' => 'a',
                    'doc' => 'install all required and optional dependencies',
                    ),
                'onlyreqdeps' => array(
                    'shortopt' => 'o',
                    'doc' => 'install all required dependencies',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to download any urls or contact channels',
                    ),
                'pretend' => array(
                    'shortopt' => 'p',
                    'doc' => 'Only list the packages that would be downloaded',
                    ),
                ),
            'doc' => '<package> ...
Upgrades one or more PEAR packages.  See documentation for the
"install" command for ways to specify a package.

When upgrading, your package will be updated if the provided new
package has a higher version number (use the -f option if you need to
upgrade anyway).

More than one package may be specified at once.
'),
        'upgrade-all' => array(
            'summary' => 'Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]',
            'function' => 'doUpgradeAll',
            'shortcut' => 'ua',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'upgrade packages from a specific channel',
                    'arg' => 'CHAN',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, upgrade anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as upgraded',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'loose' => array(
                    'doc' => 'do not check for recommended dependency version',
                    ),
                ),
            'doc' => '
WARNING: This function is deprecated in favor of using the upgrade command with no params

Upgrades all packages that have a newer release available.  Upgrades are
done only if there is a release available of the state specified in
"preferred_state" (currently {config preferred_state}), or a state considered
more stable.
'),
        'uninstall' => array(
            'summary' => 'Un-install Package',
            'function' => 'doUninstall',
            'shortcut' => 'un',
            'options' => array(
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, uninstall anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not remove files, only register the packages as not installed',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to uninstall remotely',
                    ),
                ),
            'doc' => '[channel/]<package> ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel ({config default_channel})
'),
        'bundle' => array(
            'summary' => 'Unpacks a Pecl Package',
            'function' => 'doBundle',
            'shortcut' => 'bun',
            'options' => array(
                'destination' => array(
                   'shortopt' => 'd',
                    'arg' => 'DIR',
                    'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)',
                    ),
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'Force the unpacking even if there were errors in the package',
                ),
            ),
            'doc' => '<package>
Unpacks a Pecl Package into the selected location. It will download the
package if needed.
'),
        'run-scripts' => array(
            'summary' => 'Run Post-Install Scripts bundled with a package',
            'function' => 'doRunScripts',
            'shortcut' => 'rs',
            'options' => array(
            ),
            'doc' => '<package>
Run post-installation scripts in package <package>, if any exist.
'),
    );

    // }}}
    // {{{ constructor

    /**
     * PEAR_Command_Install constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    // }}}

    /**
     * For unit testing purposes
     */
    function &getDownloader(&$ui, $options, &$config)
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($ui, $options, $config);
        return $a;
    }

    /**
     * For unit testing purposes
     */
    function &getInstaller(&$ui)
    {
        if (!class_exists('PEAR_Installer')) {
            require_once 'PEAR/Installer.php';
        }
        $a = new PEAR_Installer($ui);
        return $a;
    }

    function enableExtension($binaries, $type)
    {
        if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) {
            return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location');
        }
        $ini = $this->_parseIni($phpini);
        if (PEAR::isError($ini)) {
            return $ini;
        }
        $line = 0;
        if ($type == 'extsrc' || $type == 'extbin') {
            $search = 'extensions';
            $enable = 'extension';
        } else {
            $search = 'zend_extensions';
            ob_start();
            phpinfo(INFO_GENERAL);
            $info = ob_get_contents();
            ob_end_clean();
            $debug = function_exists('leak') ? '_debug' : '';
            $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
            $enable = 'zend_extension' . $debug . $ts;
        }
        foreach ($ini[$search] as $line => $extension) {
            if (in_array($extension, $binaries, true) || in_array(
                  $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) {
                // already enabled - assume if one is, all are
                return true;
            }
        }
        if ($line) {
            $newini = array_slice($ini['all'], 0, $line);
        } else {
            $newini = array();
        }
        foreach ($binaries as $binary) {
            if ($ini['extension_dir']) {
                $binary = basename($binary);
            }
            $newini[] = $enable . '="' . $binary . '"' . (OS_UNIX ? "\n" : "\r\n");
        }
        $newini = array_merge($newini, array_slice($ini['all'], $line));
        $fp = @fopen($phpini, 'wb');
        if (!$fp) {
            return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing');
        }
        foreach ($newini as $line) {
            fwrite($fp, $line);
        }
        fclose($fp);
        return true;
    }

    function disableExtension($binaries, $type)
    {
        if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) {
            return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location');
        }
        $ini = $this->_parseIni($phpini);
        if (PEAR::isError($ini)) {
            return $ini;
        }
        $line = 0;
        if ($type == 'extsrc' || $type == 'extbin') {
            $search = 'extensions';
            $enable = 'extension';
        } else {
            $search = 'zend_extensions';
            ob_start();
            phpinfo(INFO_GENERAL);
            $info = ob_get_contents();
            ob_end_clean();
            $debug = function_exists('leak') ? '_debug' : '';
            $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
            $enable = 'zend_extension' . $debug . $ts;
        }
        $found = false;
        foreach ($ini[$search] as $line => $extension) {
            if (in_array($extension, $binaries, true) || in_array(
                  $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) {
                $found = true;
                break;
            }
        }
        if (!$found) {
            // not enabled
            return true;
        }
        $fp = @fopen($phpini, 'wb');
        if (!$fp) {
            return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing');
        }
        if ($line) {
            $newini = array_slice($ini['all'], 0, $line);
            // delete the enable line
            $newini = array_merge($newini, array_slice($ini['all'], $line + 1));
        } else {
            $newini = array_slice($ini['all'], 1);
        }
        foreach ($newini as $line) {
            fwrite($fp, $line);
        }
        fclose($fp);
        return true;
    }

    function _parseIni($filename)
    {
        if (!file_exists($filename)) {
            return PEAR::raiseError('php.ini "' . $filename . '" does not exist');
        }

        if (filesize($filename) > 300000) {
            return PEAR::raiseError('php.ini "' . $filename . '" is too large, aborting');
        }

        ob_start();
        phpinfo(INFO_GENERAL);
        $info = ob_get_contents();
        ob_end_clean();
        $debug = function_exists('leak') ? '_debug' : '';
        $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
        $zend_extension_line = 'zend_extension' . $debug . $ts;
        $all = @file($filename);
        if ($all === false) {
            return PEAR::raiseError('php.ini "' . $filename .'" could not be read');
        }
        $zend_extensions = $extensions = array();
        // assume this is right, but pull from the php.ini if it is found
        $extension_dir = ini_get('extension_dir');
        foreach ($all as $linenum => $line) {
            $line = trim($line);
            if (!$line) {
                continue;
            }
            if ($line[0] == ';') {
                continue;
            }
            if (strtolower(substr($line, 0, 13)) == 'extension_dir') {
                $line = trim(substr($line, 13));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $extension_dir = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
            if (strtolower(substr($line, 0, 9)) == 'extension') {
                $line = trim(substr($line, 9));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $extensions[$linenum] = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
            if (strtolower(substr($line, 0, strlen($zend_extension_line))) ==
                  $zend_extension_line) {
                $line = trim(substr($line, strlen($zend_extension_line)));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $zend_extensions[$linenum] = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
        }
        return array(
            'extensions' => $extensions,
            'zend_extensions' => $zend_extensions,
            'extension_dir' => $extension_dir,
            'all' => $all,
        );
    }

    // {{{ doInstall()

    function doInstall($command, $options, $params)
    {
        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        if (isset($options['installroot']) && isset($options['packagingroot'])) {
            return $this->raiseError('ERROR: cannot use both --installroot and --packagingroot');
        }

        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        if (empty($this->installer)) {
            $this->installer = &$this->getInstaller($this->ui);
        }

        if ($command == 'upgrade' || $command == 'upgrade-all') {
            // If people run the upgrade command but pass nothing, emulate a upgrade-all
            if ($command == 'upgrade' && empty($params)) {
                return $this->doUpgradeAll($command, $options, $params);
            }
            $options['upgrade'] = true;
        } else {
            $packages = $params;
        }

        $instreg = &$reg; // instreg used to check if package is installed
        if (isset($options['packagingroot']) && !isset($options['upgrade'])) {
            $packrootphp_dir = $this->installer->_prependPath(
                $this->config->get('php_dir', null, 'pear.php.net'),
                $options['packagingroot']);
            $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net');
            if ($metadata_dir) {
                $metadata_dir = $this->installer->_prependPath(
                    $metadata_dir,
                    $options['packagingroot']);
            }
            $instreg = new PEAR_Registry($packrootphp_dir, false, false, $metadata_dir); // other instreg!

            if ($this->config->get('verbose') > 2) {
                $this->ui->outputData('using package root: ' . $options['packagingroot']);
            }
        }

        $abstractpackages = $otherpackages = array();
        // parse params
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);

        foreach ($params as $param) {
            if (strpos($param, 'http://') === 0) {
                $otherpackages[] = $param;
                continue;
            }

            if (strpos($param, 'channel://') === false && @file_exists($param)) {
                if (isset($options['force'])) {
                    $otherpackages[] = $param;
                    continue;
                }

                $pkg = new PEAR_PackageFile($this->config);
                $pf  = $pkg->fromAnyFile($param, PEAR_VALIDATE_DOWNLOADING);
                if (PEAR::isError($pf)) {
                    $otherpackages[] = $param;
                    continue;
                }

                $exists   = $reg->packageExists($pf->getPackage(), $pf->getChannel());
                $pversion = $reg->packageInfo($pf->getPackage(), 'version', $pf->getChannel());
                $version_compare = version_compare($pf->getVersion(), $pversion, '<=');
                if ($exists && $version_compare) {
                    if ($this->config->get('verbose')) {
                        $this->ui->outputData('Ignoring installed package ' .
                            $reg->parsedPackageNameToString(
                            array('package' => $pf->getPackage(),
                                  'channel' => $pf->getChannel()), true));
                    }
                    continue;
                }
                $otherpackages[] = $param;
                continue;
            }

            $e = $reg->parsePackageName($param, $channel);
            if (PEAR::isError($e)) {
                $otherpackages[] = $param;
            } else {
                $abstractpackages[] = $e;
            }
        }
        PEAR::staticPopErrorHandling();

        // if there are any local package .tgz or remote static url, we can't
        // filter.  The filter only works for abstract packages
        if (count($abstractpackages) && !isset($options['force'])) {
            // when not being forced, only do necessary upgrades/installs
            if (isset($options['upgrade'])) {
                $abstractpackages = $this->_filterUptodatePackages($abstractpackages, $command);
            } else {
                $count = count($abstractpackages);
                foreach ($abstractpackages as $i => $package) {
                    if (isset($package['group'])) {
                        // do not filter out install groups
                        continue;
                    }

                    if ($instreg->packageExists($package['package'], $package['channel'])) {
                        if ($count > 1) {
                            if ($this->config->get('verbose')) {
                                $this->ui->outputData('Ignoring installed package ' .
                                    $reg->parsedPackageNameToString($package, true));
                            }
                            unset($abstractpackages[$i]);
                        } elseif ($count === 1) {
                            // Lets try to upgrade it since it's already installed
                            $options['upgrade'] = true;
                        }
                    }
                }
            }
            $abstractpackages =
                array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages);
        } elseif (count($abstractpackages)) {
            $abstractpackages =
                array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages);
        }

        $packages = array_merge($abstractpackages, $otherpackages);
        if (!count($packages)) {
            $c = '';
            if (isset($options['channel'])){
                $c .= ' in channel "' . $options['channel'] . '"';
            }
            $this->ui->outputData('Nothing to ' . $command . $c);
            return true;
        }

        $this->downloader = &$this->getDownloader($this->ui, $options, $this->config);
        $errors = $downloaded = $binaries = array();
        $downloaded = &$this->downloader->download($packages);
        if (PEAR::isError($downloaded)) {
            return $this->raiseError($downloaded);
        }

        $errors = $this->downloader->getErrorMsgs();
        if (count($errors)) {
            $err = array();
            $err['data'] = array();
            foreach ($errors as $error) {
                if ($error !== null) {
                    $err['data'][] = array($error);
                }
            }

            if (!empty($err['data'])) {
                $err['headline'] = 'Install Errors';
                $this->ui->outputData($err);
            }

            if (!count($downloaded)) {
                return $this->raiseError("$command failed");
            }
        }

        $data = array(
            'headline' => 'Packages that would be Installed'
        );

        if (isset($options['pretend'])) {
            foreach ($downloaded as $package) {
                $data['data'][] = array($reg->parsedPackageNameToString($package->getParsedPackage()));
            }
            $this->ui->outputData($data, 'pretend');
            return true;
        }

        $this->installer->setOptions($options);
        $this->installer->sortPackagesForInstall($downloaded);
        if (PEAR::isError($err = $this->installer->setDownloadedPackages($downloaded))) {
            $this->raiseError($err->getMessage());
            return true;
        }

        $binaries = $extrainfo = array();
        foreach ($downloaded as $param) {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->installer->install($param, $options);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($info)) {
                $oldinfo = $info;
                $pkg = &$param->getPackageFile();
                if ($info->getCode() != PEAR_INSTALLER_NOBINARY) {
                    if (!($info = $pkg->installBinary($this->installer))) {
                        return $this->raiseError('ERROR: ' .$oldinfo->getMessage());
                    }

                    // we just installed a different package than requested,
                    // let's change the param and info so that the rest of this works
                    $param = $info[0];
                    $info  = $info[1];
                }
            }

            if (!is_array($info)) {
                return $this->raiseError("$command failed");
            }

            if ($param->getPackageType() == 'extsrc' ||
                  $param->getPackageType() == 'extbin' ||
                  $param->getPackageType() == 'zendextsrc' ||
                  $param->getPackageType() == 'zendextbin'
            ) {
                $pkg = &$param->getPackageFile();
                if ($instbin = $pkg->getInstalledBinary()) {
                    $instpkg = &$instreg->getPackage($instbin, $pkg->getChannel());
                } else {
                    $instpkg = &$instreg->getPackage($pkg->getPackage(), $pkg->getChannel());
                }

                foreach ($instpkg->getFilelist() as $name => $atts) {
                    $pinfo = pathinfo($atts['installed_as']);
                    if (!isset($pinfo['extension']) ||
                          in_array($pinfo['extension'], array('c', 'h'))
                    ) {
                        continue; // make sure we don't match php_blah.h
                    }

                    if ((strpos($pinfo['basename'], 'php_') === 0 &&
                          $pinfo['extension'] == 'dll') ||
                          // most unices
                          $pinfo['extension'] == 'so' ||
                          // hp-ux
                          $pinfo['extension'] == 'sl') {
                        $binaries[] = array($atts['installed_as'], $pinfo);
                        break;
                    }
                }

                if (count($binaries)) {
                    foreach ($binaries as $pinfo) {
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        $ret = $this->enableExtension(array($pinfo[0]), $param->getPackageType());
                        PEAR::staticPopErrorHandling();
                        if (PEAR::isError($ret)) {
                            $extrainfo[] = $ret->getMessage();
                            if ($param->getPackageType() == 'extsrc' ||
                                  $param->getPackageType() == 'extbin') {
                                $exttype = 'extension';
                                $extpath = $pinfo[1]['basename'];
                            } else {
                                $exttype = 'zend_extension';
                                $extpath = $atts['installed_as'];
                            }
                            $extrainfo[] = 'You should add "' . $exttype . '=' .
                                $extpath . '" to php.ini';
                        } else {
                            $extrainfo[] = 'Extension ' . $instpkg->getProvidesExtension() .
                                ' enabled in php.ini';
                        }
                    }
                }
            }

            if ($this->config->get('verbose') > 0) {
                $chan = $param->getChannel();
                $label = $reg->parsedPackageNameToString(
                    array(
                        'channel' => $chan,
                        'package' => $param->getPackage(),
                        'version' => $param->getVersion(),
                    ));
                $out = array('data' => "$command ok: $label");
                if (isset($info['release_warnings'])) {
                    $out['release_warnings'] = $info['release_warnings'];
                }
                $this->ui->outputData($out, $command);

                if (!isset($options['register-only']) && !isset($options['offline'])) {
                    if ($this->config->isDefinedLayer('ftp')) {
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        $info = $this->installer->ftpInstall($param);
                        PEAR::staticPopErrorHandling();
                        if (PEAR::isError($info)) {
                            $this->ui->outputData($info->getMessage());
                            $this->ui->outputData("remote install failed: $label");
                        } else {
                            $this->ui->outputData("remote install ok: $label");
                        }
                    }
                }
            }

            $deps = $param->getDeps();
            if ($deps) {
                if (isset($deps['group'])) {
                    $groups = $deps['group'];
                    if (!isset($groups[0])) {
                        $groups = array($groups);
                    }

                    foreach ($groups as $group) {
                        if ($group['attribs']['name'] == 'default') {
                            // default group is always installed, unless the user
                            // explicitly chooses to install another group
                            continue;
                        }
                        $extrainfo[] = $param->getPackage() . ': Optional feature ' .
                            $group['attribs']['name'] . ' available (' .
                            $group['attribs']['hint'] . ')';
                    }

                    $extrainfo[] = $param->getPackage() .
                        ': To install optional features use "pear install ' .
                        $reg->parsedPackageNameToString(
                            array('package' => $param->getPackage(),
                                  'channel' => $param->getChannel()), true) .
                              '#featurename"';
                }
            }

            $pkg = &$instreg->getPackage($param->getPackage(), $param->getChannel());
            // $pkg may be NULL if install is a 'fake' install via --packagingroot
            if (is_object($pkg)) {
                $pkg->setConfig($this->config);
                if ($list = $pkg->listPostinstallScripts()) {
                    $pn = $reg->parsedPackageNameToString(array('channel' =>
                       $param->getChannel(), 'package' => $param->getPackage()), true);
                    $extrainfo[] = $pn . ' has post-install scripts:';
                    foreach ($list as $file) {
                        $extrainfo[] = $file;
                    }
                    $extrainfo[] = $param->getPackage() .
                        ': Use "pear run-scripts ' . $pn . '" to finish setup.';
                    $extrainfo[] = 'DO NOT RUN SCRIPTS FROM UNTRUSTED SOURCES';
                }
            }
        }

        if (count($extrainfo)) {
            foreach ($extrainfo as $info) {
                $this->ui->outputData($info);
            }
        }

        return true;
    }

    // }}}
    // {{{ doUpgradeAll()

    function doUpgradeAll($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $upgrade = array();

        if (isset($options['channel'])) {
            $channels = array($options['channel']);
        } else {
            $channels = $reg->listChannels();
        }

        foreach ($channels as $channel) {
            if ($channel == '__uri') {
                continue;
            }

            // parse name with channel
            foreach ($reg->listPackages($channel) as $name) {
                $upgrade[] = $reg->parsedPackageNameToString(array(
                        'channel' => $channel,
                        'package' => $name
                    ));
            }
        }

        $err = $this->doInstall($command, $options, $upgrade);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage(), $command);
        }
   }

    // }}}
    // {{{ doUninstall()

    function doUninstall($command, $options, $params)
    {
        if (count($params) < 1) {
            return $this->raiseError("Please supply the package(s) you want to uninstall");
        }

        if (empty($this->installer)) {
            $this->installer = &$this->getInstaller($this->ui);
        }

        if (isset($options['remoteconfig'])) {
            $e = $this->config->readFTPConfigFile($options['remoteconfig']);
            if (!PEAR::isError($e)) {
                $this->installer->setConfig($this->config);
            }
        }

        $reg = &$this->config->getRegistry();
        $newparams = array();
        $binaries = array();
        $badparams = array();
        foreach ($params as $pkg) {
            $channel = $this->config->get('default_channel');
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $parsed = $reg->parsePackageName($pkg, $channel);
            PEAR::staticPopErrorHandling();
            if (!$parsed || PEAR::isError($parsed)) {
                $badparams[] = $pkg;
                continue;
            }
            $package = $parsed['package'];
            $channel = $parsed['channel'];
            $info = &$reg->getPackage($package, $channel);
            if ($info === null &&
                 ($channel == 'pear.php.net' || $channel == 'pecl.php.net')) {
                // make sure this isn't a package that has flipped from pear to pecl but
                // used a package.xml 1.0
                $testc = ($channel == 'pear.php.net') ? 'pecl.php.net' : 'pear.php.net';
                $info = &$reg->getPackage($package, $testc);
                if ($info !== null) {
                    $channel = $testc;
                }
            }
            if ($info === null) {
                $badparams[] = $pkg;
            } else {
                $newparams[] = &$info;
                // check for binary packages (this is an alias for those packages if so)
                if ($installedbinary = $info->getInstalledBinary()) {
                    $this->ui->log('adding binary package ' .
                        $reg->parsedPackageNameToString(array('channel' => $channel,
                            'package' => $installedbinary), true));
                    $newparams[] = &$reg->getPackage($installedbinary, $channel);
                }
                // add the contents of a dependency group to the list of installed packages
                if (isset($parsed['group'])) {
                    $group = $info->getDependencyGroup($parsed['group']);
                    if ($group) {
                        $installed = $reg->getInstalledGroup($group);
                        if ($installed) {
                            foreach ($installed as $i => $p) {
                                $newparams[] = &$installed[$i];
                            }
                        }
                    }
                }
            }
        }
        $err = $this->installer->sortPackagesForUninstall($newparams);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage(), $command);
            return true;
        }
        $params = $newparams;
        // twist this to use it to check on whether dependent packages are also being uninstalled
        // for circular dependencies like subpackages
        $this->installer->setUninstallPackages($newparams);
        $params = array_merge($params, $badparams);
        $binaries = array();
        foreach ($params as $pkg) {
            $this->installer->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($err = $this->installer->uninstall($pkg, $options)) {
                $this->installer->popErrorHandling();
                if (PEAR::isError($err)) {
                    $this->ui->outputData($err->getMessage(), $command);
                    continue;
                }
                if ($pkg->getPackageType() == 'extsrc' ||
                      $pkg->getPackageType() == 'extbin' ||
                      $pkg->getPackageType() == 'zendextsrc' ||
                      $pkg->getPackageType() == 'zendextbin') {
                    if ($instbin = $pkg->getInstalledBinary()) {
                        continue; // this will be uninstalled later
                    }

                    foreach ($pkg->getFilelist() as $name => $atts) {
                        $pinfo = pathinfo($atts['installed_as']);
                        if (!isset($pinfo['extension']) ||
                              in_array($pinfo['extension'], array('c', 'h'))) {
                            continue; // make sure we don't match php_blah.h
                        }
                        if ((strpos($pinfo['basename'], 'php_') === 0 &&
                              $pinfo['extension'] == 'dll') ||
                              // most unices
                              $pinfo['extension'] == 'so' ||
                              // hp-ux
                              $pinfo['extension'] == 'sl') {
                            $binaries[] = array($atts['installed_as'], $pinfo);
                            break;
                        }
                    }
                    if (count($binaries)) {
                        foreach ($binaries as $pinfo) {
                            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                            $ret = $this->disableExtension(array($pinfo[0]), $pkg->getPackageType());
                            PEAR::staticPopErrorHandling();
                            if (PEAR::isError($ret)) {
                                $extrainfo[] = $ret->getMessage();
                                if ($pkg->getPackageType() == 'extsrc' ||
                                      $pkg->getPackageType() == 'extbin') {
                                    $exttype = 'extension';
                                } else {
                                    ob_start();
                                    phpinfo(INFO_GENERAL);
                                    $info = ob_get_contents();
                                    ob_end_clean();
                                    $debug = function_exists('leak') ? '_debug' : '';
                                    $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
                                    $exttype = 'zend_extension' . $debug . $ts;
                                }
                                $this->ui->outputData('Unable to remove "' . $exttype . '=' .
                                    $pinfo[1]['basename'] . '" from php.ini', $command);
                            } else {
                                $this->ui->outputData('Extension ' . $pkg->getProvidesExtension() .
                                    ' disabled in php.ini', $command);
                            }
                        }
                    }
                }
                $savepkg = $pkg;
                if ($this->config->get('verbose') > 0) {
                    if (is_object($pkg)) {
                        $pkg = $reg->parsedPackageNameToString($pkg);
                    }
                    $this->ui->outputData("uninstall ok: $pkg", $command);
                }
                if (!isset($options['offline']) && is_object($savepkg) &&
                      defined('PEAR_REMOTEINSTALL_OK')) {
                    if ($this->config->isDefinedLayer('ftp')) {
                        $this->installer->pushErrorHandling(PEAR_ERROR_RETURN);
                        $info = $this->installer->ftpUninstall($savepkg);
                        $this->installer->popErrorHandling();
                        if (PEAR::isError($info)) {
                            $this->ui->outputData($info->getMessage());
                            $this->ui->outputData("remote uninstall failed: $pkg");
                        } else {
                            $this->ui->outputData("remote uninstall ok: $pkg");
                        }
                    }
                }
            } else {
                $this->installer->popErrorHandling();
                if (!is_object($pkg)) {
                    return $this->raiseError("uninstall failed: $pkg");
                }
                $pkg = $reg->parsedPackageNameToString($pkg);
            }
        }

        return true;
    }

    // }}}


    // }}}
    // {{{ doBundle()
    /*
    (cox) It just downloads and untars the package, does not do
            any check that the PEAR_Installer::_installFile() does.
    */

    function doBundle($command, $options, $params)
    {
        $opts = array(
            'force'        => true,
            'nodeps'       => true,
            'soft'         => true,
            'downloadonly' => true
        );
        $downloader = &$this->getDownloader($this->ui, $opts, $this->config);
        $reg = &$this->config->getRegistry();
        if (count($params) < 1) {
            return $this->raiseError("Please supply the package you want to bundle");
        }

        if (isset($options['destination'])) {
            if (!is_dir($options['destination'])) {
                System::mkdir('-p ' . $options['destination']);
            }
            $dest = realpath($options['destination']);
        } else {
            $pwd  = getcwd();
            $dir  = $pwd . DIRECTORY_SEPARATOR . 'ext';
            $dest = is_dir($dir) ? $dir : $pwd;
        }
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $err = $downloader->setDownloadDir($dest);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($err)) {
            return PEAR::raiseError('download directory "' . $dest .
                '" is not writeable.');
        }
        $result = &$downloader->download(array($params[0]));
        if (PEAR::isError($result)) {
            return $result;
        }
        if (!isset($result[0])) {
            return $this->raiseError('unable to unpack ' . $params[0]);
        }
        $pkgfile = &$result[0]->getPackageFile();
        $pkgname = $pkgfile->getName();
        $pkgversion = $pkgfile->getVersion();

        // Unpacking -------------------------------------------------
        $dest .= DIRECTORY_SEPARATOR . $pkgname;
        $orig = $pkgname . '-' . $pkgversion;

        $tar = new Archive_Tar($pkgfile->getArchiveFile());
        if (!$tar->extractModify($dest, $orig)) {
            return $this->raiseError('unable to unpack ' . $pkgfile->getArchiveFile());
        }
        $this->ui->outputData("Package ready at '$dest'");
    // }}}
    }

    // }}}

    function doRunScripts($command, $options, $params)
    {
        if (!isset($params[0])) {
            return $this->raiseError('run-scripts expects 1 parameter: a package name');
        }

        $reg = &$this->config->getRegistry();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($parsed)) {
            return $this->raiseError($parsed);
        }

        $package = &$reg->getPackage($parsed['package'], $parsed['channel']);
        if (!is_object($package)) {
            return $this->raiseError('Could not retrieve package "' . $params[0] . '" from registry');
        }

        $package->setConfig($this->config);
        $package->runPostinstallScripts();
        $this->ui->outputData('Install scripts complete', $command);
        return true;
    }

    /**
     * Given a list of packages, filter out those ones that are already up to date
     *
     * @param $packages: packages, in parsed array format !
     * @return list of packages that can be upgraded
     */
    function _filterUptodatePackages($packages, $command)
    {
        $reg = &$this->config->getRegistry();
        $latestReleases = array();

        $ret = array();
        foreach ($packages as $package) {
            if (isset($package['group'])) {
                $ret[] = $package;
                continue;
            }

            $channel = $package['channel'];
            $name    = $package['package'];
            if (!$reg->packageExists($name, $channel)) {
                $ret[] = $package;
                continue;
            }

            if (!isset($latestReleases[$channel])) {
                // fill in cache for this channel
                $chan = $reg->getChannel($channel);
                if (PEAR::isError($chan)) {
                    return $this->raiseError($chan);
                }

                $base2 = false;
                $preferred_mirror = $this->config->get('preferred_mirror', null, $channel);
                if ($chan->supportsREST($preferred_mirror) &&
                    (
                       //($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) ||
                       ($base  = $chan->getBaseURL('REST1.0', $preferred_mirror))
                    )
                ) {
                    $dorest = true;
                }

                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                if (!isset($package['state'])) {
                    $state = $this->config->get('preferred_state', null, $channel);
                } else {
                    $state = $package['state'];
                }

                if ($dorest) {
                    if ($base2) {
                        $rest = &$this->config->getREST('1.4', array());
                        $base = $base2;
                    } else {
                        $rest = &$this->config->getREST('1.0', array());
                    }

                    $installed = array_flip($reg->listPackages($channel));
                    $latest    = $rest->listLatestUpgrades($base, $state, $installed, $channel, $reg);
                }

                PEAR::staticPopErrorHandling();
                if (PEAR::isError($latest)) {
                    $this->ui->outputData('Error getting channel info from ' . $channel .
                        ': ' . $latest->getMessage());
                    continue;
                }

                $latestReleases[$channel] = array_change_key_case($latest);
            }

            // check package for latest release
            $name_lower = strtolower($name);
            if (isset($latestReleases[$channel][$name_lower])) {
                // if not set, up to date
                $inst_version    = $reg->packageInfo($name, 'version', $channel);
                $channel_version = $latestReleases[$channel][$name_lower]['version'];
                if (version_compare($channel_version, $inst_version, 'le')) {
                    // installed version is up-to-date
                    continue;
                }

                // maintain BC
                if ($command == 'upgrade-all') {
                    $this->ui->outputData(array('data' => 'Will upgrade ' .
                        $reg->parsedPackageNameToString($package)), $command);
                }
                $ret[] = $package;
            }
        }

        return $ret;
    }
}
pear/PEAR/Command/Test.php000064400000027550151732710140011242 0ustar00<?php
/**
 * PEAR_Command_Test (run-tests)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */

class PEAR_Command_Test extends PEAR_Command_Common
{
    var $commands = array(
        'run-tests' => array(
            'summary' => 'Run Regression Tests',
            'function' => 'doRunTests',
            'shortcut' => 'rt',
            'options' => array(
                'recur' => array(
                    'shortopt' => 'r',
                    'doc' => 'Run tests in child directories, recursively.  4 dirs deep maximum',
                ),
                'ini' => array(
                    'shortopt' => 'i',
                    'doc' => 'actual string of settings to pass to php in format " -d setting=blah"',
                    'arg' => 'SETTINGS'
                ),
                'realtimelog' => array(
                    'shortopt' => 'l',
                    'doc' => 'Log test runs/results as they are run',
                ),
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Only display detail for failed tests',
                ),
                'simple' => array(
                    'shortopt' => 's',
                    'doc' => 'Display simple output for all tests',
                ),
                'package' => array(
                    'shortopt' => 'p',
                    'doc' => 'Treat parameters as installed packages from which to run tests',
                ),
                'phpunit' => array(
                    'shortopt' => 'u',
                    'doc' => 'Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.',
                ),
                'tapoutput' => array(
                    'shortopt' => 't',
                    'doc' => 'Output run-tests.log in TAP-compliant format',
                ),
                'cgi' => array(
                    'shortopt' => 'c',
                    'doc' => 'CGI php executable (needed for tests with POST/GET section)',
                    'arg' => 'PHPCGI',
                ),
                'coverage' => array(
                    'shortopt' => 'x',
                    'doc'      => 'Generate a code coverage report (requires Xdebug 2.0.0+)',
                ),
                'showdiff' => array(
                    'shortopt' => 'd',
                    'doc' => 'Output diff on test failure',
                ),
            ),
            'doc' => '[testfile|dir ...]
Run regression tests with PHP\'s regression testing script (run-tests.php).',
            ),
        );

    var $output;

    /**
     * PEAR_Command_Test constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doRunTests($command, $options, $params)
    {
        if (isset($options['phpunit']) && isset($options['tapoutput'])) {
            return $this->raiseError('ERROR: cannot use both --phpunit and --tapoutput at the same time');
        }

        require_once 'PEAR/Common.php';
        require_once 'System.php';
        $log = new PEAR_Common;
        $log->ui = &$this->ui; // slightly hacky, but it will work
        $tests = array();
        $depth = isset($options['recur']) ? 14 : 1;

        if (!count($params)) {
            $params[] = '.';
        }

        if (isset($options['package'])) {
            $oldparams = $params;
            $params = array();
            $reg = &$this->config->getRegistry();
            foreach ($oldparams as $param) {
                $pname = $reg->parsePackageName($param, $this->config->get('default_channel'));
                if (PEAR::isError($pname)) {
                    return $this->raiseError($pname);
                }

                $package = &$reg->getPackage($pname['package'], $pname['channel']);
                if (!$package) {
                    return PEAR::raiseError('Unknown package "' .
                        $reg->parsedPackageNameToString($pname) . '"');
                }

                $filelist = $package->getFilelist();
                foreach ($filelist as $name => $atts) {
                    if (isset($atts['role']) && $atts['role'] != 'test') {
                        continue;
                    }

                    if (isset($options['phpunit']) && preg_match('/AllTests\.php\\z/i', $name)) {
                        $params[] = $atts['installed_as'];
                        continue;
                    } elseif (!preg_match('/\.phpt\\z/', $name)) {
                        continue;
                    }
                    $params[] = $atts['installed_as'];
                }
            }
        }

        foreach ($params as $p) {
            if (is_dir($p)) {
                if (isset($options['phpunit'])) {
                    $dir = System::find(array($p, '-type', 'f',
                                                '-maxdepth', $depth,
                                                '-name', 'AllTests.php'));
                    if (count($dir)) {
                        foreach ($dir as $p) {
                            $p = realpath($p);
                            if (!count($tests) ||
                                  (count($tests) && strlen($p) < strlen($tests[0]))) {
                                // this is in a higher-level directory, use this one instead.
                                $tests = array($p);
                            }
                        }
                    }
                    continue;
                }

                $args  = array($p, '-type', 'f', '-name', '*.phpt');
            } else {
                if (isset($options['phpunit'])) {
                    if (preg_match('/AllTests\.php\\z/i', $p)) {
                        $p = realpath($p);
                        if (!count($tests) ||
                              (count($tests) && strlen($p) < strlen($tests[0]))) {
                            // this is in a higher-level directory, use this one instead.
                            $tests = array($p);
                        }
                    }
                    continue;
                }

                if (file_exists($p) && preg_match('/\.phpt$/', $p)) {
                    $tests[] = $p;
                    continue;
                }

                if (!preg_match('/\.phpt\\z/', $p)) {
                    $p .= '.phpt';
                }

                $args  = array(dirname($p), '-type', 'f', '-name', $p);
            }

            if (!isset($options['recur'])) {
                $args[] = '-maxdepth';
                $args[] = 1;
            }

            $dir   = System::find($args);
            $tests = array_merge($tests, $dir);
        }

        $ini_settings = '';
        if (isset($options['ini'])) {
            $ini_settings .= $options['ini'];
        }

        if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) {
            $ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}";
        }

        if ($ini_settings) {
            $this->ui->outputData('Using INI settings: "' . $ini_settings . '"');
        }

        $skipped = $passed = $failed = array();
        $tests_count = count($tests);
        $this->ui->outputData('Running ' . $tests_count . ' tests', $command);
        $start = time();
        if (isset($options['realtimelog']) && file_exists('run-tests.log')) {
            unlink('run-tests.log');
        }

        if (isset($options['tapoutput'])) {
            $tap = '1..' . $tests_count . "\n";
        }

        require_once 'PEAR/RunTest.php';
        $run = new PEAR_RunTest($log, $options);
        $run->tests_count = $tests_count;

        if (isset($options['coverage']) && extension_loaded('xdebug')){
            $run->xdebug_loaded = true;
        } else {
            $run->xdebug_loaded = false;
        }

        $j = $i = 1;
        foreach ($tests as $t) {
            if (isset($options['realtimelog'])) {
                $fp = @fopen('run-tests.log', 'a');
                if ($fp) {
                    fwrite($fp, "Running test [$i / $tests_count] $t...");
                    fclose($fp);
                }
            }
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            if (isset($options['phpunit'])) {
                $result = $run->runPHPUnit($t, $ini_settings);
            } else {
                $result = $run->run($t, $ini_settings, $j);
            }
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($result)) {
                $this->ui->log($result->getMessage());
                continue;
            }

            if (isset($options['tapoutput'])) {
                $tap .= $result[0] . ' ' . $i . $result[1] . "\n";
                continue;
            }

            if (isset($options['realtimelog'])) {
                $fp = @fopen('run-tests.log', 'a');
                if ($fp) {
                    fwrite($fp, "$result\n");
                    fclose($fp);
                }
            }

            if ($result == 'FAILED') {
                $failed[] = $t;
            }
            if ($result == 'PASSED') {
                $passed[] = $t;
            }
            if ($result == 'SKIPPED') {
                $skipped[] = $t;
            }

            $j++;
        }

        $total = date('i:s', time() - $start);
        if (isset($options['tapoutput'])) {
            $fp = @fopen('run-tests.log', 'w');
            if ($fp) {
                fwrite($fp, $tap, strlen($tap));
                fclose($fp);
                $this->ui->outputData('wrote TAP-format log to "' .realpath('run-tests.log') .
                    '"', $command);
            }
        } else {
            if (count($failed)) {
                $output = "TOTAL TIME: $total\n";
                $output .= count($passed) . " PASSED TESTS\n";
                $output .= count($skipped) . " SKIPPED TESTS\n";
                $output .= count($failed) . " FAILED TESTS:\n";
                foreach ($failed as $failure) {
                    $output .= $failure . "\n";
                }

                $mode = isset($options['realtimelog']) ? 'a' : 'w';
                $fp   = @fopen('run-tests.log', $mode);

                if ($fp) {
                    fwrite($fp, $output, strlen($output));
                    fclose($fp);
                    $this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command);
                }
            } elseif (file_exists('run-tests.log') && !is_dir('run-tests.log')) {
                @unlink('run-tests.log');
            }
        }
        $this->ui->outputData('TOTAL TIME: ' . $total);
        $this->ui->outputData(count($passed) . ' PASSED TESTS', $command);
        $this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command);
        if (count($failed)) {
            $this->ui->outputData(count($failed) . ' FAILED TESTS:', $command);
            foreach ($failed as $failure) {
                $this->ui->outputData($failure, $command);
            }
        }

        if (count($failed) == 0) {
            return true;
        }
        return $this->raiseError('Some tests failed');
    }
}
pear/PEAR/Command/Pickle.xml000064400000002233151732710140011532 0ustar00<commands version="1.0">
 <pickle>
  <summary>Build PECL Package</summary>
  <function>doPackage</function>
  <shortcut>pi</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>Do not gzip the package file</doc>
   </nocompress>
   <showname>
    <shortopt>n</shortopt>
    <doc>Print the name of the packaged file.</doc>
   </showname>
  </options>
  <doc>[descfile]
Creates a PECL package from its package2.xml file.

An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as &quot;package.xml&quot;.  Note that
only simple package.xml 2.0 will be converted.  package.xml 2.0 with:

 - dependency types other than required/optional PECL package/ext/php/pearinstaller
 - more than one extsrcrelease or zendextsrcrelease
 - zendextbinrelease, extbinrelease, phprelease, or bundle release type
 - dependency groups
 - ignore tags in release filelist
 - tasks other than replace
 - custom roles

will cause pickle to fail, and output an error message.  If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
</doc>
 </pickle>
</commands>pear/PEAR/Command/Package.php000064400000116322151732710140011652 0ustar00<?php
/**
 * PEAR_Command_Package (package, package-validate, cvsdiff, cvstag, package-dependencies,
 * sign, makerpm, convert commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */

class PEAR_Command_Package extends PEAR_Command_Common
{
    var $commands = array(
        'package' => array(
            'summary' => 'Build Package',
            'function' => 'doPackage',
            'shortcut' => 'p',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'Do not gzip the package file'
                    ),
                'showname' => array(
                    'shortopt' => 'n',
                    'doc' => 'Print the name of the packaged file.',
                    ),
                ),
            'doc' => '[descfile] [descfile2]
Creates a PEAR package from its description file (usually called
package.xml).  If a second packagefile is passed in, then
the packager will check to make sure that one is a package.xml
version 1.0, and the other is a package.xml version 2.0.  The
package.xml version 1.0 will be saved as "package.xml" in the archive,
and the other as "package2.xml" in the archive"
'
            ),
        'package-validate' => array(
            'summary' => 'Validate Package Consistency',
            'function' => 'doPackageValidate',
            'shortcut' => 'pv',
            'options' => array(),
            'doc' => '
',
            ),
        'cvsdiff' => array(
            'summary' => 'Run a "cvs diff" for all files in a package',
            'function' => 'doCvsDiff',
            'shortcut' => 'cd',
            'options' => array(
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Be quiet',
                    ),
                'reallyquiet' => array(
                    'shortopt' => 'Q',
                    'doc' => 'Be really quiet',
                    ),
                'date' => array(
                    'shortopt' => 'D',
                    'doc' => 'Diff against revision of DATE',
                    'arg' => 'DATE',
                    ),
                'release' => array(
                    'shortopt' => 'R',
                    'doc' => 'Diff against tag for package release REL',
                    'arg' => 'REL',
                    ),
                'revision' => array(
                    'shortopt' => 'r',
                    'doc' => 'Diff against revision REV',
                    'arg' => 'REV',
                    ),
                'context' => array(
                    'shortopt' => 'c',
                    'doc' => 'Generate context diff',
                    ),
                'unified' => array(
                    'shortopt' => 'u',
                    'doc' => 'Generate unified diff',
                    ),
                'ignore-case' => array(
                    'shortopt' => 'i',
                    'doc' => 'Ignore case, consider upper- and lower-case letters equivalent',
                    ),
                'ignore-whitespace' => array(
                    'shortopt' => 'b',
                    'doc' => 'Ignore changes in amount of white space',
                    ),
                'ignore-blank-lines' => array(
                    'shortopt' => 'B',
                    'doc' => 'Ignore changes that insert or delete blank lines',
                    ),
                'brief' => array(
                    'doc' => 'Report only whether the files differ, no details',
                    ),
                'dry-run' => array(
                    'shortopt' => 'n',
                    'doc' => 'Don\'t do anything, just pretend',
                    ),
                ),
            'doc' => '<package.xml>
Compares all the files in a package.  Without any options, this
command will compare the current code with the last checked-in code.
Using the -r or -R option you may compare the current code with that
of a specific release.
',
            ),
         'svntag' => array(
             'summary' => 'Set SVN Release Tag',
             'function' => 'doSvnTag',
             'shortcut' => 'sv',
             'options' => array(
                 'quiet' => array(
                     'shortopt' => 'q',
                     'doc' => 'Be quiet',
                     ),
                 'slide' => array(
                     'shortopt' => 'F',
                     'doc' => 'Move (slide) tag if it exists',
                     ),
                 'delete' => array(
                     'shortopt' => 'd',
                     'doc' => 'Remove tag',
                     ),
                 'dry-run' => array(
                     'shortopt' => 'n',
                     'doc' => 'Don\'t do anything, just pretend',
                     ),
                 ),
             'doc' => '<package.xml> [files...]
 Sets a SVN tag on all files in a package.  Use this command after you have
 packaged a distribution tarball with the "package" command to tag what
 revisions of what files were in that release.  If need to fix something
 after running svntag once, but before the tarball is released to the public,
 use the "slide" option to move the release tag.

 to include files (such as a second package.xml, or tests not included in the
 release), pass them as additional parameters.
 ',
             ),
        'cvstag' => array(
            'summary' => 'Set CVS Release Tag',
            'function' => 'doCvsTag',
            'shortcut' => 'ct',
            'options' => array(
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Be quiet',
                    ),
                'reallyquiet' => array(
                    'shortopt' => 'Q',
                    'doc' => 'Be really quiet',
                    ),
                'slide' => array(
                    'shortopt' => 'F',
                    'doc' => 'Move (slide) tag if it exists',
                    ),
                'delete' => array(
                    'shortopt' => 'd',
                    'doc' => 'Remove tag',
                    ),
                'dry-run' => array(
                    'shortopt' => 'n',
                    'doc' => 'Don\'t do anything, just pretend',
                    ),
                ),
            'doc' => '<package.xml> [files...]
Sets a CVS tag on all files in a package.  Use this command after you have
packaged a distribution tarball with the "package" command to tag what
revisions of what files were in that release.  If need to fix something
after running cvstag once, but before the tarball is released to the public,
use the "slide" option to move the release tag.

to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
',
            ),
        'package-dependencies' => array(
            'summary' => 'Show package dependencies',
            'function' => 'doPackageDependencies',
            'shortcut' => 'pd',
            'options' => array(),
            'doc' => '<package-file> or <package.xml> or <install-package-name>
List all dependencies the package has.
Can take a tgz / tar file, package.xml or a package name of an installed package.'
            ),
        'sign' => array(
            'summary' => 'Sign a package distribution file',
            'function' => 'doSign',
            'shortcut' => 'si',
            'options' => array(
                'verbose' => array(
                    'shortopt' => 'v',
                    'doc' => 'Display GnuPG output',
                    ),
            ),
            'doc' => '<package-file>
Signs a package distribution (.tar or .tgz) file with GnuPG.',
            ),
        'makerpm' => array(
            'summary' => 'Builds an RPM spec file from a PEAR package',
            'function' => 'doMakeRPM',
            'shortcut' => 'rpm',
            'options' => array(
                'spec-template' => array(
                    'shortopt' => 't',
                    'arg' => 'FILE',
                    'doc' => 'Use FILE as RPM spec file template'
                    ),
                'rpm-pkgname' => array(
                    'shortopt' => 'p',
                    'arg' => 'FORMAT',
                    'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced
by the PEAR package name, defaults to "PEAR::%s".',
                    ),
                ),
            'doc' => '<package-file>

Creates an RPM .spec file for wrapping a PEAR package inside an RPM
package.  Intended to be used from the SPECS directory, with the PEAR
package tarball in the SOURCES directory:

$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
Wrote RPM spec file PEAR::Net_Geo-1.0.spec
$ rpm -bb PEAR::Net_Socket-1.0.spec
...
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
',
            ),
        'convert' => array(
            'summary' => 'Convert a package.xml 1.0 to package.xml 2.0 format',
            'function' => 'doConvert',
            'shortcut' => 'c2',
            'options' => array(
                'flat' => array(
                    'shortopt' => 'f',
                    'doc' => 'do not beautify the filelist.',
                    ),
                ),
            'doc' => '[descfile] [descfile2]
Converts a package.xml in 1.0 format into a package.xml
in 2.0 format.  The new file will be named package2.xml by default,
and package.xml will be used as the old file by default.
This is not the most intelligent conversion, and should only be
used for automated conversion or learning the format.
'
            ),
        );

    var $output;

    /**
     * PEAR_Command_Package constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _displayValidationResults($err, $warn, $strict = false)
    {
        foreach ($err as $e) {
            $this->output .= "Error: $e\n";
        }
        foreach ($warn as $w) {
            $this->output .= "Warning: $w\n";
        }
        $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n",
                                       sizeof($err), sizeof($warn));
        if ($strict && count($err) > 0) {
            $this->output .= "Fix these errors and try again.";
            return false;
        }
        return true;
    }

    function &getPackager()
    {
        if (!class_exists('PEAR_Packager')) {
            require_once 'PEAR/Packager.php';
        }
        $a = new PEAR_Packager;
        return $a;
    }

    function &getPackageFile($config, $debug = false)
    {
        if (!class_exists('PEAR_Common')) {
            require_once 'PEAR/Common.php';
        }
        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }
        $a = new PEAR_PackageFile($config, $debug);
        $common = new PEAR_Common;
        $common->ui = $this->ui;
        $a->setLogger($common);
        return $a;
    }

    function doPackage($command, $options, $params)
    {
        $this->output = '';
        $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml';
        $pkg2 = isset($params[1]) ? $params[1] : null;
        if (!$pkg2 && !isset($params[0]) && file_exists('package2.xml')) {
            $pkg2 = 'package2.xml';
        }

        $packager = &$this->getPackager();
        $compress = empty($options['nocompress']) ? true : false;
        $result   = $packager->package($pkginfofile, $compress, $pkg2);
        if (PEAR::isError($result)) {
            return $this->raiseError($result);
        }

        // Don't want output, only the package file name just created
        if (isset($options['showname'])) {
            $this->output = $result;
        }

        if ($this->output) {
            $this->ui->outputData($this->output, $command);
        }

        return true;
    }

    function doPackageValidate($command, $options, $params)
    {
        $this->output = '';
        if (count($params) < 1) {
            $params[0] = 'package.xml';
        }

        $obj = &$this->getPackageFile($this->config, $this->_debug);
        $obj->rawReturn();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            $info = $obj->fromPackageFile($params[0], PEAR_VALIDATE_NORMAL);
        } else {
            $archive = $info->getArchiveFile();
            $tar = new Archive_Tar($archive);
            $tar->extract(dirname($info->getPackageFile()));
            $info->setPackageFile(dirname($info->getPackageFile()) . DIRECTORY_SEPARATOR .
                $info->getPackage() . '-' . $info->getVersion() . DIRECTORY_SEPARATOR .
                basename($info->getPackageFile()));
        }

        PEAR::staticPopErrorHandling();
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $valid = false;
        if ($info->getPackagexmlVersion() == '2.0') {
            if ($valid = $info->validate(PEAR_VALIDATE_NORMAL)) {
                $info->flattenFileList();
                $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
            }
        } else {
            $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
        }

        $err = $warn = array();
        if ($errors = $info->getValidationWarnings()) {
            foreach ($errors as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        $this->_displayValidationResults($err, $warn);
        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doSvnTag($command, $options, $params)
    {
        $this->output = '';
        $_cmd = $command;
        if (count($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $packageFile = realpath($params[0]);
        $dir = dirname($packageFile);
        $dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('SVN tag failed');
        }

        $version    = $info->getVersion();
        $package    = $info->getName();
        $svntag     = "$package-$version";

        if (isset($options['delete'])) {
            return $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options);
        }

        $path = $this->_svnFindPath($packageFile);

        // Check if there are any modified files
        $fp = popen('svn st --xml ' . dirname($packageFile), "r");
        $out = '';
        while ($line = fgets($fp, 1024)) {
            $out .= rtrim($line)."\n";
        }
        pclose($fp);

        if (!isset($options['quiet']) && strpos($out, 'item="modified"')) {
            $params = array(array(
                'name' => 'modified',
                'type' => 'yesno',
                'default' => 'no',
                'prompt' => 'You have files in your SVN checkout (' . $path['from']  . ') that have been modified but not committed, do you still want to tag ' . $version . '?',
            ));
            $answers = $this->ui->confirmDialog($params);

            if (!in_array($answers['modified'], array('y', 'yes', 'on', '1'))) {
                return true;
            }
        }

        if (isset($options['slide'])) {
            $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options);
        }

        // Check if tag already exists
        $releaseTag = $path['local']['base'] . 'tags' . DIRECTORY_SEPARATOR . $svntag;
        $existsCommand = 'svn ls ' . $path['base'] . 'tags/';

        $fp = popen($existsCommand, "r");
        $out = '';
        while ($line = fgets($fp, 1024)) {
            $out .= rtrim($line)."\n";
        }
        pclose($fp);

        if (in_array($svntag . DIRECTORY_SEPARATOR, explode("\n", $out))) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('SVN tag ' . $svntag . ' for ' . $package . ' already exists.');
        } elseif (file_exists($path['local']['base'] . 'tags') === false) {
            return $this->raiseError('Can not locate the tags directory at ' . $path['local']['base'] . 'tags');
        } elseif (is_writeable($path['local']['base'] . 'tags') === false) {
            return $this->raiseError('Can not write to the tag directory at ' . $path['local']['base'] . 'tags');
        } else {
            $makeCommand = 'svn mkdir ' . $releaseTag;
            $this->output .= "+ $makeCommand\n";
            if (empty($options['dry-run'])) {
                // We need to create the tag dir.
                $fp = popen($makeCommand, "r");
                $out = '';
                while ($line = fgets($fp, 1024)) {
                    $out .= rtrim($line)."\n";
                }
                pclose($fp);
                $this->output .= "$out\n";
            }
        }

        $command = 'svn';
        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        $command .= ' copy --parents ';

        $dir   = dirname($packageFile);
        $dir   = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1);
        $files = array_keys($info->getFilelist());
        if (!in_array(basename($packageFile), $files)) {
            $files[] = basename($packageFile);
        }

        array_shift($params);
        if (count($params)) {
            // add in additional files to be tagged (package files and such)
            $files = array_merge($files, $params);
        }

        $commands = array();
        foreach ($files as $file) {
            if (!file_exists($file)) {
                $file = $dir . DIRECTORY_SEPARATOR . $file;
            }
            $commands[] = $command . ' ' . escapeshellarg($file) . ' ' .
                          escapeshellarg($releaseTag . DIRECTORY_SEPARATOR . $file);
        }

        $this->output .= implode("\n", $commands) . "\n";
        if (empty($options['dry-run'])) {
            foreach ($commands as $command) {
                $fp = popen($command, "r");
                while ($line = fgets($fp, 1024)) {
                    $this->output .= rtrim($line)."\n";
                }
                pclose($fp);
            }
        }

        $command = 'svn ci -m "Tagging the ' . $version  . ' release" ' . $releaseTag . "\n";
        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $_cmd);
        return true;
    }

    function _svnFindPath($file)
    {
        $xml = '';
        $command = "svn info --xml $file";
        $fp = popen($command, "r");
        while ($line = fgets($fp, 1024)) {
            $xml .= rtrim($line)."\n";
        }
        pclose($fp);
        $url_tag = strpos($xml, '<url>');
        $url = substr($xml, $url_tag + 5, strpos($xml, '</url>', $url_tag + 5) - ($url_tag + 5));

        $path = array();
        $path['from'] = substr($url, 0, strrpos($url, '/'));
        $path['base'] = substr($path['from'], 0, strrpos($path['from'], '/') + 1);

        // Figure out the local paths - see http://pear.php.net/bugs/17463
        $pos = strpos($file, DIRECTORY_SEPARATOR . 'trunk' . DIRECTORY_SEPARATOR);
        if ($pos === false) {
            $pos = strpos($file, DIRECTORY_SEPARATOR . 'branches' . DIRECTORY_SEPARATOR);
        }
        $path['local']['base'] = substr($file, 0, $pos + 1);

        return $path;
    }

    function _svnRemoveTag($version, $package, $tag, $packageFile, $options)
    {
        $command = 'svn';

        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        $command .= ' remove';
        $command .= ' -m "Removing tag for the ' . $version  . ' release."';

        $path = $this->_svnFindPath($packageFile);
        $command .= ' ' . $path['base'] . 'tags/' . $tag;


        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $command\n";
        }

        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doCvsTag($command, $options, $params)
    {
        $this->output = '';
        $_cmd = $command;
        if (count($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $packageFile = realpath($params[0]);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('CVS tag failed');
        }

        $version    = $info->getVersion();
        $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version);
        $cvstag     = "RELEASE_$cvsversion";
        $files      = array_keys($info->getFilelist());
        $command = 'cvs';
        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        if (isset($options['reallyquiet'])) {
            $command .= ' -Q';
        }

        $command .= ' tag';
        if (isset($options['slide'])) {
            $command .= ' -F';
        }

        if (isset($options['delete'])) {
            $command .= ' -d';
        }

        $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]);
        array_shift($params);
        if (count($params)) {
            // add in additional files to be tagged
            $files = array_merge($files, $params);
        }

        $dir = dirname($packageFile);
        $dir = substr($dir, strrpos($dir, '/') + 1);
        foreach ($files as $file) {
            if (!file_exists($file)) {
                $file = $dir . DIRECTORY_SEPARATOR . $file;
            }
            $command .= ' ' . escapeshellarg($file);
        }

        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $command\n";
        }

        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $_cmd);
        return true;
    }

    function doCvsDiff($command, $options, $params)
    {
        $this->output = '';
        if (sizeof($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $file = realpath($params[0]);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($file, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('CVS diff failed');
        }

        $info1 = $info->getFilelist();
        $files = $info1;
        $cmd = "cvs";
        if (isset($options['quiet'])) {
            $cmd .= ' -q';
            unset($options['quiet']);
        }

        if (isset($options['reallyquiet'])) {
            $cmd .= ' -Q';
            unset($options['reallyquiet']);
        }

        if (isset($options['release'])) {
            $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']);
            $cvstag = "RELEASE_$cvsversion";
            $options['revision'] = $cvstag;
            unset($options['release']);
        }

        $execute = true;
        if (isset($options['dry-run'])) {
            $execute = false;
            unset($options['dry-run']);
        }

        $cmd .= ' diff';
        // the rest of the options are passed right on to "cvs diff"
        foreach ($options as $option => $optarg) {
            $arg = $short = false;
            if (isset($this->commands[$command]['options'][$option])) {
                $arg = $this->commands[$command]['options'][$option]['arg'];
                $short = $this->commands[$command]['options'][$option]['shortopt'];
            }
            $cmd .= $short ? " -$short" : " --$option";
            if ($arg && $optarg) {
                $cmd .= ($short ? '' : '=') . escapeshellarg($optarg);
            }
        }

        foreach ($files as $file) {
            $cmd .= ' ' . escapeshellarg($file['name']);
        }

        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $cmd\n";
        }

        if ($execute) {
            $fp = popen($cmd, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doPackageDependencies($command, $options, $params)
    {
        // $params[0] -> the PEAR package to list its information
        if (count($params) !== 1) {
            return $this->raiseError("bad parameter(s), try \"help $command\"");
        }

        $obj = &$this->getPackageFile($this->config, $this->_debug);
        if (is_file($params[0]) || strpos($params[0], '.xml') > 0) {
           $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
        } else {
            $reg  = $this->config->getRegistry();
            $info = $obj->fromArray($reg->packageInfo($params[0]));
        }

        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $deps = $info->getDeps();
        if (is_array($deps)) {
            if ($info->getPackagexmlVersion() == '1.0') {
                $data = array(
                    'caption' => 'Dependencies for pear/' . $info->getPackage(),
                    'border' => true,
                    'headline' => array("Required?", "Type", "Name", "Relation", "Version"),
                    );

                foreach ($deps as $d) {
                    if (isset($d['optional'])) {
                        if ($d['optional'] == 'yes') {
                            $req = 'No';
                        } else {
                            $req = 'Yes';
                        }
                    } else {
                        $req = 'Yes';
                    }

                    if (isset($this->_deps_rel_trans[$d['rel']])) {
                        $rel = $this->_deps_rel_trans[$d['rel']];
                    } else {
                        $rel = $d['rel'];
                    }

                    if (isset($this->_deps_type_trans[$d['type']])) {
                        $type = ucfirst($this->_deps_type_trans[$d['type']]);
                    } else {
                        $type = $d['type'];
                    }

                    if (isset($d['name'])) {
                        $name = $d['name'];
                    } else {
                        $name = '';
                    }

                    if (isset($d['version'])) {
                        $version = $d['version'];
                    } else {
                        $version = '';
                    }

                    $data['data'][] = array($req, $type, $name, $rel, $version);
                }
            } else { // package.xml 2.0 dependencies display
                require_once 'PEAR/Dependency2.php';
                $deps = $info->getDependencies();
                $reg = &$this->config->getRegistry();
                if (is_array($deps)) {
                    $data = array(
                        'caption' => 'Dependencies for ' . $info->getPackage(),
                        'border' => true,
                        'headline' => array("Required?", "Type", "Name", 'Versioning', 'Group'),
                        );
                    foreach ($deps as $type => $subd) {
                        $req = ($type == 'required') ? 'Yes' : 'No';
                        if ($type == 'group' && isset($subd['attribs']['name'])) {
                            $group = $subd['attribs']['name'];
                        } else {
                            $group = '';
                        }

                        if (!isset($subd[0])) {
                            $subd = array($subd);
                        }

                        foreach ($subd as $groupa) {
                            foreach ($groupa as $deptype => $depinfo) {
                                if ($deptype == 'attribs') {
                                    continue;
                                }

                                if ($deptype == 'pearinstaller') {
                                    $deptype = 'pear Installer';
                                }

                                if (!isset($depinfo[0])) {
                                    $depinfo = array($depinfo);
                                }

                                foreach ($depinfo as $inf) {
                                    $name = '';
                                    if (isset($inf['channel'])) {
                                        $alias = $reg->channelAlias($inf['channel']);
                                        if (!$alias) {
                                            $alias = '(channel?) ' .$inf['channel'];
                                        }
                                        $name = $alias . '/';

                                    }
                                    if (isset($inf['name'])) {
                                        $name .= $inf['name'];
                                    } elseif (isset($inf['pattern'])) {
                                        $name .= $inf['pattern'];
                                    } else {
                                        $name .= '';
                                    }

                                    if (isset($inf['uri'])) {
                                        $name .= ' [' . $inf['uri'] .  ']';
                                    }

                                    if (isset($inf['conflicts'])) {
                                        $ver = 'conflicts';
                                    } else {
                                        $ver = PEAR_Dependency2::_getExtraString($inf);
                                    }

                                    $data['data'][] = array($req, ucfirst($deptype), $name,
                                        $ver, $group);
                                }
                            }
                        }
                    }
                }
            }

            $this->ui->outputData($data, $command);
            return true;
        }

        // Fallback
        $this->ui->outputData("This package does not have any dependencies.", $command);
    }

    function doSign($command, $options, $params)
    {
        // should move most of this code into PEAR_Packager
        // so it'll be easy to implement "pear package --sign"
        if (count($params) !== 1) {
            return $this->raiseError("bad parameter(s), try \"help $command\"");
        }

        require_once 'System.php';
        require_once 'Archive/Tar.php';

        if (!file_exists($params[0])) {
            return $this->raiseError("file does not exist: $params[0]");
        }

        $obj = $this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $tar = new Archive_Tar($params[0]);

        $tmpdir = $this->config->get('temp_dir');
        $tmpdir = System::mktemp(' -t "' . $tmpdir . '" -d pearsign');
        if (!$tar->extractList('package2.xml package.xml package.sig', $tmpdir)) {
            return $this->raiseError("failed to extract tar file");
        }

        if (file_exists("$tmpdir/package.sig")) {
            return $this->raiseError("package already signed");
        }

        $packagexml = 'package.xml';
        if (file_exists("$tmpdir/package2.xml")) {
            $packagexml = 'package2.xml';
        }

        if (file_exists("$tmpdir/package.sig")) {
            unlink("$tmpdir/package.sig");
        }

        if (!file_exists("$tmpdir/$packagexml")) {
            return $this->raiseError("Extracted file $tmpdir/$packagexml not found.");
        }

        $input = $this->ui->userDialog($command,
                                       array('GnuPG Passphrase'),
                                       array('password'));
        if (!isset($input[0])) {
            //use empty passphrase
            $input[0] = '';
        }

        $devnull = (isset($options['verbose'])) ? '' : ' 2>/dev/null';
        $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/$packagexml" . $devnull, "w");
        if (!$gpg) {
            return $this->raiseError("gpg command failed");
        }

        fwrite($gpg, "$input[0]\n");
        if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) {
            return $this->raiseError("gpg sign failed");
        }

        if (!$tar->addModify("$tmpdir/package.sig", '', $tmpdir)) {
            return $this->raiseError('failed adding signature to file');
        }

        $this->ui->outputData("Package signed.", $command);
        return true;
    }

    /**
     * For unit testing purposes
     */
    function &getInstaller(&$ui)
    {
        if (!class_exists('PEAR_Installer')) {
            require_once 'PEAR/Installer.php';
        }
        $a = new PEAR_Installer($ui);
        return $a;
    }

    /**
     * For unit testing purposes
     */
    function &getCommandPackaging(&$ui, &$config)
    {
        if (!class_exists('PEAR_Command_Packaging')) {
            if ($fp = @fopen('PEAR/Command/Packaging.php', 'r', true)) {
                fclose($fp);
                include_once 'PEAR/Command/Packaging.php';
            }
        }

        if (class_exists('PEAR_Command_Packaging')) {
            $a = new PEAR_Command_Packaging($ui, $config);
        } else {
            $a = null;
        }

        return $a;
    }

    function doMakeRPM($command, $options, $params)
    {

        // Check to see if PEAR_Command_Packaging is installed, and
        // transparently switch to use the "make-rpm-spec" command from it
        // instead, if it does. Otherwise, continue to use the old version
        // of "makerpm" supplied with this package (PEAR).
        $packaging_cmd = $this->getCommandPackaging($this->ui, $this->config);
        if ($packaging_cmd !== null) {
            $this->ui->outputData('PEAR_Command_Packaging is installed; using '.
                'newer "make-rpm-spec" command instead');
            return $packaging_cmd->run('make-rpm-spec', $options, $params);
        }

        $this->ui->outputData('WARNING: "pear makerpm" is no longer available; an '.
          'improved version is available via "pear make-rpm-spec", which '.
          'is available by installing PEAR_Command_Packaging');
        return true;
    }

    function doConvert($command, $options, $params)
    {
        $packagexml    = isset($params[0]) ? $params[0] : 'package.xml';
        $newpackagexml = isset($params[1]) ? $params[1] : dirname($packagexml) .
            DIRECTORY_SEPARATOR . 'package2.xml';
        $pkg = &$this->getPackageFile($this->config, $this->_debug);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $pf = $pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            if (is_array($pf->getUserInfo())) {
                foreach ($pf->getUserInfo() as $warning) {
                    $this->ui->outputData($warning['message']);
                }
            }
            return $this->raiseError($pf);
        }

        if (is_a($pf, 'PEAR_PackageFile_v2')) {
            $this->ui->outputData($packagexml . ' is already a package.xml version 2.0');
            return true;
        }

        $gen   = &$pf->getDefaultGenerator();
        $newpf = &$gen->toV2();
        $newpf->setPackagefile($newpackagexml);
        $gen = &$newpf->getDefaultGenerator();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $state = (isset($options['flat']) ? PEAR_VALIDATE_PACKAGING : PEAR_VALIDATE_NORMAL);
        $saved = $gen->toPackageFile(dirname($newpackagexml), $state, basename($newpackagexml));
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($saved)) {
            if (is_array($saved->getUserInfo())) {
                foreach ($saved->getUserInfo() as $warning) {
                    $this->ui->outputData($warning['message']);
                }
            }

            $this->ui->outputData($saved->getMessage());
            return true;
        }

        $this->ui->outputData('Wrote new version 2.0 package.xml to "' . $saved . '"');
        return true;
    }
}
pear/PEAR/Command/Auth.php000064400000005013151732710140011212 0ustar00<?php
/**
 * PEAR_Command_Auth (login, logout commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 * @deprecated since 1.8.0alpha1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Channels.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 * @deprecated since 1.8.0alpha1
 */
class PEAR_Command_Auth extends PEAR_Command_Channels
{
    var $commands = array(
        'login' => array(
            'summary' => 'Connects and authenticates to remote server [Deprecated in favor of channel-login]',
            'shortcut' => 'li',
            'function' => 'doLogin',
            'options' => array(),
            'doc' => '<channel name>
WARNING: This function is deprecated in favor of using channel-login

Log in to a remote channel server.  If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.',
            ),
        'logout' => array(
            'summary' => 'Logs out from the remote server [Deprecated in favor of channel-logout]',
            'shortcut' => 'lo',
            'function' => 'doLogout',
            'options' => array(),
            'doc' => '
WARNING: This function is deprecated in favor of using channel-logout

Logs out from the remote server.  This command does not actually
connect to the remote server, it only deletes the stored username and
password from your user configuration.',
            )

        );

    /**
     * PEAR_Command_Auth constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }
}
pear/PEAR/Command/Common.php000064400000020026151732710140011542 0ustar00<?php
/**
 * PEAR_Command_Common base class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR.php';

/**
 * PEAR commands base class
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Common extends PEAR
{
    /**
     * PEAR_Config object used to pass user system and configuration
     * on when executing commands
     *
     * @var PEAR_Config
     */
    var $config;
    /**
     * @var PEAR_Registry
     * @access protected
     */
    var $_registry;

    /**
     * User Interface object, for all interaction with the user.
     * @var object
     */
    var $ui;

    var $_deps_rel_trans = array(
                                 'lt' => '<',
                                 'le' => '<=',
                                 'eq' => '=',
                                 'ne' => '!=',
                                 'gt' => '>',
                                 'ge' => '>=',
                                 'has' => '=='
                                 );

    var $_deps_type_trans = array(
                                  'pkg' => 'package',
                                  'ext' => 'extension',
                                  'php' => 'PHP',
                                  'prog' => 'external program',
                                  'ldlib' => 'external library for linking',
                                  'rtlib' => 'external runtime library',
                                  'os' => 'operating system',
                                  'websrv' => 'web server',
                                  'sapi' => 'SAPI backend'
                                  );

    /**
     * PEAR_Command_Common constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct();
        $this->config = &$config;
        $this->ui = &$ui;
    }

    /**
     * Return a list of all the commands defined by this class.
     * @return array list of commands
     * @access public
     */
    function getCommands()
    {
        $ret = array();
        foreach (array_keys($this->commands) as $command) {
            $ret[$command] = $this->commands[$command]['summary'];
        }

        return $ret;
    }

    /**
     * Return a list of all the command shortcuts defined by this class.
     * @return array shortcut => command
     * @access public
     */
    function getShortcuts()
    {
        $ret = array();
        foreach (array_keys($this->commands) as $command) {
            if (isset($this->commands[$command]['shortcut'])) {
                $ret[$this->commands[$command]['shortcut']] = $command;
            }
        }

        return $ret;
    }

    function getOptions($command)
    {
        $shortcuts = $this->getShortcuts();
        if (isset($shortcuts[$command])) {
            $command = $shortcuts[$command];
        }

        if (isset($this->commands[$command]) &&
              isset($this->commands[$command]['options'])) {
            return $this->commands[$command]['options'];
        }

        return null;
    }

    function getGetoptArgs($command, &$short_args, &$long_args)
    {
        $short_args = '';
        $long_args = array();
        if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) {
            return;
        }

        reset($this->commands[$command]['options']);
        foreach ($this->commands[$command]['options'] as $option => $info) {
            $larg = $sarg = '';
            if (isset($info['arg'])) {
                if ($info['arg'][0] == '(') {
                    $larg = '==';
                    $sarg = '::';
                    $arg = substr($info['arg'], 1, -1);
                } else {
                    $larg = '=';
                    $sarg = ':';
                    $arg = $info['arg'];
                }
            }

            if (isset($info['shortopt'])) {
                $short_args .= $info['shortopt'] . $sarg;
            }

            $long_args[] = $option . $larg;
        }
    }

    /**
    * Returns the help message for the given command
    *
    * @param string $command The command
    * @return mixed A fail string if the command does not have help or
    *               a two elements array containing [0]=>help string,
    *               [1]=> help string for the accepted cmd args
    */
    function getHelp($command)
    {
        $config = &PEAR_Config::singleton();
        if (!isset($this->commands[$command])) {
            return "No such command \"$command\"";
        }

        $help = null;
        if (isset($this->commands[$command]['doc'])) {
            $help = $this->commands[$command]['doc'];
        }

        if (empty($help)) {
            // XXX (cox) Fallback to summary if there is no doc (show both?)
            if (!isset($this->commands[$command]['summary'])) {
                return "No help for command \"$command\"";
            }
            $help = $this->commands[$command]['summary'];
        }

        if (preg_match_all('/{config\s+([^\}]+)}/', $help, $matches)) {
            foreach($matches[0] as $k => $v) {
                $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);
            }
        }

        return array($help, $this->getHelpArgs($command));
    }

    /**
     * Returns the help for the accepted arguments of a command
     *
     * @param  string $command
     * @return string The help string
     */
    function getHelpArgs($command)
    {
        if (isset($this->commands[$command]['options']) &&
            count($this->commands[$command]['options']))
        {
            $help = "Options:\n";
            foreach ($this->commands[$command]['options'] as $k => $v) {
                if (isset($v['arg'])) {
                    if ($v['arg'][0] == '(') {
                        $arg = substr($v['arg'], 1, -1);
                        $sapp = " [$arg]";
                        $lapp = "[=$arg]";
                    } else {
                        $sapp = " $v[arg]";
                        $lapp = "=$v[arg]";
                    }
                } else {
                    $sapp = $lapp = "";
                }

                if (isset($v['shortopt'])) {
                    $s = $v['shortopt'];
                    $help .= "  -$s$sapp, --$k$lapp\n";
                } else {
                    $help .= "  --$k$lapp\n";
                }

                $p = "        ";
                $doc = rtrim(str_replace("\n", "\n$p", $v['doc']));
                $help .= "        $doc\n";
            }

            return $help;
        }

        return null;
    }

    function run($command, $options, $params)
    {
        if (empty($this->commands[$command]['function'])) {
            // look for shortcuts
            foreach (array_keys($this->commands) as $cmd) {
                if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) {
                    if (empty($this->commands[$cmd]['function'])) {
                        return $this->raiseError("unknown command `$command'");
                    } else {
                        $func = $this->commands[$cmd]['function'];
                    }
                    $command = $cmd;

                    //$command = $this->commands[$cmd]['function'];
                    break;
                }
            }
        } else {
            $func = $this->commands[$command]['function'];
        }

        return $this->$func($command, $options, $params);
    }
}
pear/PEAR/Command/Build.php000064400000005123151732710140011352 0ustar00<?php
/**
 * PEAR_Command_Auth (build command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for building extensions.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Build extends PEAR_Command_Common
{
    var $commands = array(
        'build' => array(
            'summary' => 'Build an Extension From C Source',
            'function' => 'doBuild',
            'shortcut' => 'b',
            'options' => array(
                'configureoptions' => array(
                    'shortopt' => 'D',
                    'arg' => 'OPTION1=VALUE[ OPTION2=VALUE]',
                    'doc' => 'space-delimited list of configure options',
                    ),
                ),
            'doc' => '[package.xml]
Builds one or more extensions contained in a package.'
            ),
        );

    /**
     * PEAR_Command_Build constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doBuild($command, $options, $params)
    {
        require_once 'PEAR/Builder.php';
        if (sizeof($params) < 1) {
            $params[0] = 'package.xml';
        }

        $configureoptions = empty($options['configureoptions']) ? '' : $options['configureoptions'];
        $builder = new PEAR_Builder($configureoptions, $this->ui);
        $this->debug = $this->config->get('verbose');
        $err = $builder->build($params[0], array(&$this, 'buildCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        return true;
    }

    function buildCallback($what, $data)
    {
        if (($what == 'cmdoutput' && $this->debug > 1) ||
            ($what == 'output' && $this->debug > 0)) {
            $this->ui->outputData(rtrim($data), 'build');
        }
    }
}
pear/PEAR/Command/Pickle.php000064400000037027151732710140011532 0ustar00<?php
/**
 * PEAR_Command_Pickle (pickle command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.1
 */

class PEAR_Command_Pickle extends PEAR_Command_Common
{
    var $commands = array(
        'pickle' => array(
            'summary' => 'Build PECL Package',
            'function' => 'doPackage',
            'shortcut' => 'pi',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'Do not gzip the package file'
                    ),
                'showname' => array(
                    'shortopt' => 'n',
                    'doc' => 'Print the name of the packaged file.',
                    ),
                ),
            'doc' => '[descfile]
Creates a PECL package from its package2.xml file.

An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as "package.xml".  Note that
only simple package.xml 2.0 will be converted.  package.xml 2.0 with:

 - dependency types other than required/optional PECL package/ext/php/pearinstaller
 - more than one extsrcrelease or zendextsrcrelease
 - zendextbinrelease, extbinrelease, phprelease, or bundle release type
 - dependency groups
 - ignore tags in release filelist
 - tasks other than replace
 - custom roles

will cause pickle to fail, and output an error message.  If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
'
            ),
        );

    /**
     * PEAR_Command_Package constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    /**
     * For unit-testing ease
     *
     * @return PEAR_Packager
     */
    function &getPackager()
    {
        if (!class_exists('PEAR_Packager')) {
            require_once 'PEAR/Packager.php';
        }

        $a = new PEAR_Packager;
        return $a;
    }

    /**
     * For unit-testing ease
     *
     * @param PEAR_Config $config
     * @param bool $debug
     * @param string|null $tmpdir
     * @return PEAR_PackageFile
     */
    function &getPackageFile($config, $debug = false)
    {
        if (!class_exists('PEAR_Common')) {
            require_once 'PEAR/Common.php';
        }

        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        $a = new PEAR_PackageFile($config, $debug);
        $common = new PEAR_Common;
        $common->ui = $this->ui;
        $a->setLogger($common);
        return $a;
    }

    function doPackage($command, $options, $params)
    {
        $this->output = '';
        $pkginfofile = isset($params[0]) ? $params[0] : 'package2.xml';
        $packager = &$this->getPackager();
        if (PEAR::isError($err = $this->_convertPackage($pkginfofile))) {
            return $err;
        }

        $compress = empty($options['nocompress']) ? true : false;
        $result = $packager->package($pkginfofile, $compress, 'package.xml');
        if (PEAR::isError($result)) {
            return $this->raiseError($result);
        }

        // Don't want output, only the package file name just created
        if (isset($options['showname'])) {
            $this->ui->outputData($result, $command);
        }

        return true;
    }

    function _convertPackage($packagexml)
    {
        $pkg = &$this->getPackageFile($this->config);
        $pf2 = &$pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
        if (!is_a($pf2, 'PEAR_PackageFile_v2')) {
            return $this->raiseError('Cannot process "' .
                $packagexml . '", is not a package.xml 2.0');
        }

        require_once 'PEAR/PackageFile/v1.php';
        $pf = new PEAR_PackageFile_v1;
        $pf->setConfig($this->config);
        if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", is not an extension source package.  Using a PEAR_PackageFileManager-based ' .
            'script is an option');
        }

        if (is_array($pf2->getUsesRole())) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains custom roles.  Using a PEAR_PackageFileManager-based script or ' .
            'the convert command is an option');
        }

        if (is_array($pf2->getUsesTask())) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains custom tasks.  Using a PEAR_PackageFileManager-based script or ' .
            'the convert command is an option');
        }

        $deps = $pf2->getDependencies();
        if (isset($deps['group'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains dependency groups.  Using a PEAR_PackageFileManager-based script ' .
            'or the convert command is an option');
        }

        if (isset($deps['required']['subpackage']) ||
              isset($deps['optional']['subpackage'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains subpackage dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        if (isset($deps['required']['os'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains os dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        if (isset($deps['required']['arch'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains arch dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        $pf->setPackage($pf2->getPackage());
        $pf->setSummary($pf2->getSummary());
        $pf->setDescription($pf2->getDescription());
        foreach ($pf2->getMaintainers() as $maintainer) {
            $pf->addMaintainer($maintainer['role'], $maintainer['handle'],
                $maintainer['name'], $maintainer['email']);
        }

        $pf->setVersion($pf2->getVersion());
        $pf->setDate($pf2->getDate());
        $pf->setLicense($pf2->getLicense());
        $pf->setState($pf2->getState());
        $pf->setNotes($pf2->getNotes());
        $pf->addPhpDep($deps['required']['php']['min'], 'ge');
        if (isset($deps['required']['php']['max'])) {
            $pf->addPhpDep($deps['required']['php']['max'], 'le');
        }

        if (isset($deps['required']['package'])) {
            if (!isset($deps['required']['package'][0])) {
                $deps['required']['package'] = array($deps['required']['package']);
            }

            foreach ($deps['required']['package'] as $dep) {
                if (!isset($dep['channel'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains uri-based dependency on a package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if ($dep['channel'] != 'pear.php.net'
                    && $dep['channel'] != 'pecl.php.net'
                    && $dep['channel'] != 'doc.php.net') {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains dependency on a non-standard channel package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['conflicts'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains conflicts dependency.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addPackageDep($dep['name'], $dep['min'], 'ge');
                }

                if (isset($dep['max'])) {
                    $pf->addPackageDep($dep['name'], $dep['max'], 'le');
                }
            }
        }

        if (isset($deps['required']['extension'])) {
            if (!isset($deps['required']['extension'][0])) {
                $deps['required']['extension'] = array($deps['required']['extension']);
            }

            foreach ($deps['required']['extension'] as $dep) {
                if (isset($dep['conflicts'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains conflicts dependency.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addExtensionDep($dep['name'], $dep['min'], 'ge');
                }

                if (isset($dep['max'])) {
                    $pf->addExtensionDep($dep['name'], $dep['max'], 'le');
                }
            }
        }

        if (isset($deps['optional']['package'])) {
            if (!isset($deps['optional']['package'][0])) {
                $deps['optional']['package'] = array($deps['optional']['package']);
            }

            foreach ($deps['optional']['package'] as $dep) {
                if (!isset($dep['channel'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains uri-based dependency on a package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if ($dep['channel'] != 'pear.php.net'
                    && $dep['channel'] != 'pecl.php.net'
                    && $dep['channel'] != 'doc.php.net') {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains dependency on a non-standard channel package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addPackageDep($dep['name'], $dep['min'], 'ge', 'yes');
                }

                if (isset($dep['max'])) {
                    $pf->addPackageDep($dep['name'], $dep['max'], 'le', 'yes');
                }
            }
        }

        if (isset($deps['optional']['extension'])) {
            if (!isset($deps['optional']['extension'][0])) {
                $deps['optional']['extension'] = array($deps['optional']['extension']);
            }

            foreach ($deps['optional']['extension'] as $dep) {
                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addExtensionDep($dep['name'], $dep['min'], 'ge', 'yes');
                }

                if (isset($dep['max'])) {
                    $pf->addExtensionDep($dep['name'], $dep['max'], 'le', 'yes');
                }
            }
        }

        $contents = $pf2->getContents();
        $release  = $pf2->getReleases();
        if (isset($releases[0])) {
            return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
            . 'multiple extsrcrelease/zendextsrcrelease tags.  Using a PEAR_PackageFileManager-based script ' .
            'or the convert command is an option');
        }

        if ($configoptions = $pf2->getConfigureOptions()) {
            foreach ($configoptions as $option) {
                $default = isset($option['default']) ? $option['default'] : false;
                $pf->addConfigureOption($option['name'], $option['prompt'], $default);
            }
        }

        if (isset($release['filelist']['ignore'])) {
            return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
            . 'ignore tags.  Using a PEAR_PackageFileManager-based script or the convert' .
            ' command is an option');
        }

        if (isset($release['filelist']['install']) &&
              !isset($release['filelist']['install'][0])) {
            $release['filelist']['install'] = array($release['filelist']['install']);
        }

        if (isset($contents['dir']['attribs']['baseinstalldir'])) {
            $baseinstalldir = $contents['dir']['attribs']['baseinstalldir'];
        } else {
            $baseinstalldir = false;
        }

        if (!isset($contents['dir']['file'][0])) {
            $contents['dir']['file'] = array($contents['dir']['file']);
        }

        foreach ($contents['dir']['file'] as $file) {
            if ($baseinstalldir && !isset($file['attribs']['baseinstalldir'])) {
                $file['attribs']['baseinstalldir'] = $baseinstalldir;
            }

            $processFile = $file;
            unset($processFile['attribs']);
            if (count($processFile)) {
                foreach ($processFile as $name => $task) {
                    if ($name != $pf2->getTasksNs() . ':replace') {
                        return $this->raiseError('Cannot safely process "' . $packagexml .
                        '" contains tasks other than replace.  Using a ' .
                        'PEAR_PackageFileManager-based script is an option.');
                    }
                    $file['attribs']['replace'][] = $task;
                }
            }

            if (!in_array($file['attribs']['role'], PEAR_Common::getFileRoles())) {
                return $this->raiseError('Cannot safely convert "' . $packagexml .
                '", contains custom roles.  Using a PEAR_PackageFileManager-based script ' .
                'or the convert command is an option');
            }

            if (isset($release['filelist']['install'])) {
                foreach ($release['filelist']['install'] as $installas) {
                    if ($installas['attribs']['name'] == $file['attribs']['name']) {
                        $file['attribs']['install-as'] = $installas['attribs']['as'];
                    }
                }
            }

            $pf->addFile('/', $file['attribs']['name'], $file['attribs']);
        }

        if ($pf2->getChangeLog()) {
            $this->ui->outputData('WARNING: changelog is not translated to package.xml ' .
                '1.0, use PEAR_PackageFileManager-based script if you need changelog-' .
                'translation for package.xml 1.0');
        }

        $gen = &$pf->getDefaultGenerator();
        $gen->toPackageFile('.');
    }
}
pear/PEAR/Command/Config.xml000064400000006466151732710140011544 0ustar00<commands version="1.0">
 <config-show>
  <summary>Show All Settings</summary>
  <function>doConfigShow</function>
  <shortcut>csh</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>[layer]
Displays all configuration values.  An optional argument
may be used to tell which configuration layer to display.  Valid
configuration layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;. To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
</doc>
 </config-show>
 <config-get>
  <summary>Show One Setting</summary>
  <function>doConfigGet</function>
  <shortcut>cg</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>&lt;parameter&gt; [layer]
Displays the value of one configuration parameter.  The
first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in.  Valid configuration
layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;.  If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order
just specified.  The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
</doc>
 </config-get>
 <config-set>
  <summary>Change Setting</summary>
  <function>doConfigSet</function>
  <shortcut>cs</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>&lt;parameter&gt; &lt;value&gt; [layer]
Sets the value of one configuration parameter.  The first argument is
the name of the parameter, the second argument is the new value.  Some
parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense.  An optional
third argument may be used to specify in which layer to set the
configuration parameter.  The default layer is &quot;user&quot;.  The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
</doc>
 </config-set>
 <config-help>
  <summary>Show Information About Setting</summary>
  <function>doConfigHelp</function>
  <shortcut>ch</shortcut>
  <options />
  <doc>[parameter]
Displays help for a configuration parameter.  Without arguments it
displays help for all configuration parameters.
</doc>
 </config-help>
 <config-create>
  <summary>Create a Default configuration file</summary>
  <function>doConfigCreate</function>
  <shortcut>coc</shortcut>
  <options>
   <windows>
    <shortopt>w</shortopt>
    <doc>create a config file for a windows install</doc>
   </windows>
  </options>
  <doc>&lt;root path&gt; &lt;filename&gt;
Create a default configuration file with all directory configuration
variables set to subdirectories of &lt;root path&gt;, and save it as &lt;filename&gt;.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
</doc>
 </config-create>
</commands>pear/PEAR/Command/Build.xml000064400000000604151732710140011362 0ustar00<commands version="1.0">
 <build>
  <summary>Build an Extension From C Source</summary>
  <function>doBuild</function>
  <shortcut>b</shortcut>
  <options>
   <configureoptions>
    <shortopt>D</shortopt>
    <arg>OPTION1=VALUE[ OPTION2=VALUE]</arg>
   </configureoptions>
  </options>
  <doc>[package.xml]
Builds one or more extensions contained in a package.</doc>
 </build>
</commands>pear/PEAR/Command/Channels.xml000064400000010172151732710140012057 0ustar00<commands version="1.0">
 <list-channels>
  <summary>List Available Channels</summary>
  <function>doList</function>
  <shortcut>lc</shortcut>
  <options />
  <doc>
List all available channels for installation.
</doc>
 </list-channels>
 <update-channels>
  <summary>Update the Channel List</summary>
  <function>doUpdateAll</function>
  <shortcut>uc</shortcut>
  <options />
  <doc>
List all installed packages in all channels.
</doc>
 </update-channels>
 <channel-delete>
  <summary>Remove a Channel From the List</summary>
  <function>doDelete</function>
  <shortcut>cde</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Delete a channel from the registry.  You may not
remove any channel that has installed packages.
</doc>
 </channel-delete>
 <channel-add>
  <summary>Add a Channel</summary>
  <function>doAdd</function>
  <shortcut>ca</shortcut>
  <options />
  <doc>&lt;channel.xml&gt;
Add a private channel to the channel list.  Note that all
public channels should be synced using &quot;update-channels&quot;.
Parameter may be either a local file or remote URL to a
channel.xml.
</doc>
 </channel-add>
 <channel-update>
  <summary>Update an Existing Channel</summary>
  <function>doUpdate</function>
  <shortcut>cu</shortcut>
  <options>
   <force>
    <shortopt>f</shortopt>
    <doc>will force download of new channel.xml if an existing channel name is used</doc>
   </force>
   <channel>
    <shortopt>c</shortopt>
    <doc>will force download of new channel.xml if an existing channel name is used</doc>
    <arg>CHANNEL</arg>
   </channel>
  </options>
  <doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Update a channel in the channel list directly.  Note that all
public channels can be synced using &quot;update-channels&quot;.
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
</doc>
 </channel-update>
 <channel-info>
  <summary>Retrieve Information on a Channel</summary>
  <function>doInfo</function>
  <shortcut>ci</shortcut>
  <options />
  <doc>&lt;package&gt;
List the files in an installed package.
</doc>
 </channel-info>
 <channel-alias>
  <summary>Specify an alias to a channel name</summary>
  <function>doAlias</function>
  <shortcut>cha</shortcut>
  <options />
  <doc>&lt;channel&gt; &lt;alias&gt;
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
</doc>
 </channel-alias>
 <channel-discover>
  <summary>Initialize a Channel from its server</summary>
  <function>doDiscover</function>
  <shortcut>di</shortcut>
  <options />
  <doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Initialize a channel from its server and create a local channel.xml.
If &lt;channel name&gt; is in the format &quot;&lt;username&gt;:&lt;password&gt;@&lt;channel&gt;&quot; then
&lt;username&gt; and &lt;password&gt; will be set as the login username/password for
&lt;channel&gt;. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system&#039;s process list.
</doc>
 </channel-discover>
 <channel-login>
  <summary>Connects and authenticates to remote channel server</summary>
  <function>doLogin</function>
  <shortcut>cli</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Log in to a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
 </channel-login>
 <channel-logout>
  <summary>Logs out from the remote channel server</summary>
  <function>doLogout</function>
  <shortcut>clo</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Logs out from a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.</doc>
 </channel-logout>
</commands>pear/PEAR/Command/Registry.php000064400000132315151732710140012127 0ustar00<?php
/**
 * PEAR_Command_Registry (list, list-files, shell-test, info commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for registry manipulation
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Registry extends PEAR_Command_Common
{
    var $commands = array(
        'list' => array(
            'summary' => 'List Installed Packages In The Default Channel',
            'function' => 'doList',
            'shortcut' => 'l',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'list installed packages from this channel',
                    'arg' => 'CHAN',
                    ),
                'allchannels' => array(
                    'shortopt' => 'a',
                    'doc' => 'list installed packages from all channels',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '<package>
If invoked without parameters, this command lists the PEAR packages
installed in your php_dir ({config php_dir}).  With a parameter, it
lists the files in a package.
',
            ),
        'list-files' => array(
            'summary' => 'List Files In Installed Package',
            'function' => 'doFileList',
            'shortcut' => 'fl',
            'options' => array(),
            'doc' => '<package>
List the files in an installed package.
'
            ),
        'shell-test' => array(
            'summary' => 'Shell Script Test',
            'function' => 'doShellTest',
            'shortcut' => 'st',
            'options' => array(),
            'doc' => '<package> [[relation] version]
Tests if a package is installed in the system. Will exit(1) if it is not.
   <relation>   The version comparison operator. One of:
                <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
   <version>    The version to compare with
'),
        'info' => array(
            'summary'  => 'Display information about a package',
            'function' => 'doInfo',
            'shortcut' => 'in',
            'options'  => array(),
            'doc'      => '<package>
Displays information about a package. The package argument may be a
local package file, an URL to a package file, or the name of an
installed package.'
            )
        );

    /**
     * PEAR_Command_Registry constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _sortinfo($a, $b)
    {
        $apackage = isset($a['package']) ? $a['package'] : $a['name'];
        $bpackage = isset($b['package']) ? $b['package'] : $b['name'];
        return strcmp($apackage, $bpackage);
    }

    function doList($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $channelinfo = isset($options['channelinfo']);
        if (isset($options['allchannels']) && !$channelinfo) {
            return $this->doListAll($command, array(), $params);
        }

        if (isset($options['allchannels']) && $channelinfo) {
            // allchannels with $channelinfo
            unset($options['allchannels']);
            $channels = $reg->getChannels();
            $errors = array();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($channels as $channel) {
                $options['channel'] = $channel->getName();
                $ret = $this->doList($command, $options, $params);

                if (PEAR::isError($ret)) {
                    $errors[] = $ret;
                }
            }

            PEAR::staticPopErrorHandling();
            if (count($errors)) {
                // for now, only give first error
                return PEAR::raiseError($errors[0]);
            }

            return true;
        }

        if (count($params) === 1) {
            return $this->doFileList($command, $options, $params);
        }

        if (isset($options['channel'])) {
            if (!$reg->channelExists($options['channel'])) {
                return $this->raiseError('Channel "' . $options['channel'] .'" does not exist');
            }

            $channel = $reg->channelName($options['channel']);
        } else {
            $channel = $this->config->get('default_channel');
        }

        $installed = $reg->packageInfo(null, null, $channel);
        usort($installed, array(&$this, '_sortinfo'));

        $data = array(
            'caption' => 'Installed packages, channel ' .
                $channel . ':',
            'border' => true,
            'headline' => array('Package', 'Version', 'State'),
            'channel' => $channel,
            );
        if ($channelinfo) {
            $data['headline'] = array('Channel', 'Package', 'Version', 'State');
        }

        if (count($installed) && !isset($data['data'])) {
            $data['data'] = array();
        }

        foreach ($installed as $package) {
            $pobj = $reg->getPackage(isset($package['package']) ?
                                        $package['package'] : $package['name'], $channel);
            if ($channelinfo) {
                $packageinfo = array($pobj->getChannel(), $pobj->getPackage(), $pobj->getVersion(),
                                    $pobj->getState() ? $pobj->getState() : null);
            } else {
                $packageinfo = array($pobj->getPackage(), $pobj->getVersion(),
                                    $pobj->getState() ? $pobj->getState() : null);
            }
            $data['data'][] = $packageinfo;
        }

        if (count($installed) === 0) {
            if (!$channelinfo) {
                $data = '(no packages installed from channel ' . $channel . ')';
            } else {
                $data = array(
                    'caption' => 'Installed packages, channel ' .
                        $channel . ':',
                    'border' => true,
                    'channel' => $channel,
                    'data' => array(array('(no packages installed)')),
                );
            }
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doListAll($command, $options, $params)
    {
        // This duplicate code is deprecated over
        // list --channelinfo, which gives identical
        // output for list and list --allchannels.
        $reg = &$this->config->getRegistry();
        $installed = $reg->packageInfo(null, null, null);
        foreach ($installed as $channel => $packages) {
            usort($packages, array($this, '_sortinfo'));
            $data = array(
                'caption'  => 'Installed packages, channel ' . $channel . ':',
                'border'   => true,
                'headline' => array('Package', 'Version', 'State'),
                'channel'  => $channel
            );

            foreach ($packages as $package) {
                $p = isset($package['package']) ? $package['package'] : $package['name'];
                $pobj = $reg->getPackage($p, $channel);
                $data['data'][] = array($pobj->getPackage(), $pobj->getVersion(),
                                        $pobj->getState() ? $pobj->getState() : null);
            }

            // Adds a blank line after each section
            $data['data'][] = array();

            if (count($packages) === 0) {
                $data = array(
                    'caption' => 'Installed packages, channel ' . $channel . ':',
                    'border' => true,
                    'data' => array(array('(no packages installed)'), array()),
                    'channel' => $channel
                    );
            }
            $this->ui->outputData($data, $command);
        }
        return true;
    }

    function doFileList($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('list-files expects 1 parameter');
        }

        $reg = &$this->config->getRegistry();
        $fp = false;
        if (!is_dir($params[0]) && (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))) {
            if ($fp) {
                fclose($fp);
            }

            if (!class_exists('PEAR_PackageFile')) {
                require_once 'PEAR/PackageFile.php';
            }

            $pkg = new PEAR_PackageFile($this->config, $this->_debug);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $info = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            $headings = array('Package File', 'Install Path');
            $installed = false;
        } else {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($parsed)) {
                return $this->raiseError($parsed);
            }

            $info = &$reg->getPackage($parsed['package'], $parsed['channel']);
            $headings = array('Type', 'Install Path');
            $installed = true;
        }

        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        if ($info === null) {
            return $this->raiseError("`$params[0]' not installed");
        }

        $list = ($info->getPackagexmlVersion() == '1.0' || $installed) ?
            $info->getFilelist() : $info->getContents();
        if ($installed) {
            $caption = 'Installed Files For ' . $params[0];
        } else {
            $caption = 'Contents of ' . basename($params[0]);
        }

        $data = array(
            'caption' => $caption,
            'border' => true,
            'headline' => $headings);
        if ($info->getPackagexmlVersion() == '1.0' || $installed) {
            foreach ($list as $file => $att) {
                if ($installed) {
                    if (empty($att['installed_as'])) {
                        continue;
                    }
                    $data['data'][] = array($att['role'], $att['installed_as']);
                } else {
                    if (isset($att['baseinstalldir']) && !in_array($att['role'],
                          array('test', 'data', 'doc'))) {
                        $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR .
                            $file;
                    } else {
                        $dest = $file;
                    }
                    switch ($att['role']) {
                        case 'test':
                        case 'data':
                        case 'doc':
                            $role = $att['role'];
                            if ($role == 'test') {
                                $role .= 's';
                            }
                            $dest = $this->config->get($role . '_dir') . DIRECTORY_SEPARATOR .
                                $info->getPackage() . DIRECTORY_SEPARATOR . $dest;
                            break;
                        case 'php':
                        default:
                            $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR .
                                $dest;
                    }
                    $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
                    $dest = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    $dest);
                    $file = preg_replace('!/+!', '/', $file);
                    $data['data'][] = array($file, $dest);
                }
            }
        } else { // package.xml 2.0, not installed
            if (!isset($list['dir']['file'][0])) {
                $list['dir']['file'] = array($list['dir']['file']);
            }

            foreach ($list['dir']['file'] as $att) {
                $att = $att['attribs'];
                $file = $att['name'];
                $role = &PEAR_Installer_Role::factory($info, $att['role'], $this->config);
                $role->setup($this, $info, $att, $file);
                if (!$role->isInstallable()) {
                    $dest = '(not installable)';
                } else {
                    $dest = $role->processInstallation($info, $att, $file, '');
                    if (PEAR::isError($dest)) {
                        $dest = '(Unknown role "' . $att['role'] . ')';
                    } else {
                        list(,, $dest) = $dest;
                    }
                }
                $data['data'][] = array($file, $dest);
            }
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doShellTest($command, $options, $params)
    {
        if (count($params) < 1) {
            return PEAR::raiseError('ERROR, usage: pear shell-test packagename [[relation] version]');
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $reg = &$this->config->getRegistry();
        $info = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
        if (PEAR::isError($info)) {
            exit(1); // invalid package name
        }

        $package = $info['package'];
        $channel = $info['channel'];
        // "pear shell-test Foo"
        if (!$reg->packageExists($package, $channel)) {
            if ($channel == 'pecl.php.net') {
                if ($reg->packageExists($package, 'pear.php.net')) {
                    $channel = 'pear.php.net'; // magically change channels for extensions
                }
            }
        }

        if (count($params) === 1) {
            if (!$reg->packageExists($package, $channel)) {
                exit(1);
            }
            // "pear shell-test Foo 1.0"
        } elseif (count($params) === 2) {
            $v = $reg->packageInfo($package, 'version', $channel);
            if (!$v || !version_compare("$v", "{$params[1]}", "ge")) {
                exit(1);
            }
            // "pear shell-test Foo ge 1.0"
        } elseif (count($params) === 3) {
            $v = $reg->packageInfo($package, 'version', $channel);
            if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) {
                exit(1);
            }
        } else {
            PEAR::staticPopErrorHandling();
            $this->raiseError("$command: expects 1 to 3 parameters");
            exit(1);
        }
    }

    function doInfo($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('pear info expects 1 parameter');
        }

        $info = $fp = false;
        $reg = &$this->config->getRegistry();
        if (is_file($params[0]) && !is_dir($params[0]) &&
            (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))
        ) {
            if ($fp) {
                fclose($fp);
            }

            if (!class_exists('PEAR_PackageFile')) {
                require_once 'PEAR/PackageFile.php';
            }

            $pkg = new PEAR_PackageFile($this->config, $this->_debug);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $obj = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($obj)) {
                $uinfo = $obj->getUserInfo();
                if (is_array($uinfo)) {
                    foreach ($uinfo as $message) {
                        if (is_array($message)) {
                            $message = $message['message'];
                        }
                        $this->ui->outputData($message);
                    }
                }

                return $this->raiseError($obj);
            }

            if ($obj->getPackagexmlVersion() != '1.0') {
                return $this->_doInfo2($command, $options, $params, $obj, false);
            }

            $info = $obj->toArray();
        } else {
            $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
            if (PEAR::isError($parsed)) {
                return $this->raiseError($parsed);
            }

            $package = $parsed['package'];
            $channel = $parsed['channel'];
            $info = $reg->packageInfo($package, null, $channel);
            if (isset($info['old'])) {
                $obj = $reg->getPackage($package, $channel);
                return $this->_doInfo2($command, $options, $params, $obj, true);
            }
        }

        if (PEAR::isError($info)) {
            return $info;
        }

        if (empty($info)) {
            $this->raiseError("No information found for `$params[0]'");
            return;
        }

        unset($info['filelist']);
        unset($info['dirtree']);
        unset($info['changelog']);
        if (isset($info['xsdversion'])) {
            $info['package.xml version'] = $info['xsdversion'];
            unset($info['xsdversion']);
        }

        if (isset($info['packagerversion'])) {
            $info['packaged with PEAR version'] = $info['packagerversion'];
            unset($info['packagerversion']);
        }

        $keys = array_keys($info);
        $longtext = array('description', 'summary');
        foreach ($keys as $key) {
            if (is_array($info[$key])) {
                switch ($key) {
                    case 'maintainers': {
                        $i = 0;
                        $mstr = '';
                        foreach ($info[$key] as $m) {
                            if ($i++ > 0) {
                                $mstr .= "\n";
                            }
                            $mstr .= $m['name'] . " <";
                            if (isset($m['email'])) {
                                $mstr .= $m['email'];
                            } else {
                                $mstr .= $m['handle'] . '@php.net';
                            }
                            $mstr .= "> ($m[role])";
                        }
                        $info[$key] = $mstr;
                        break;
                    }
                    case 'release_deps': {
                        $i = 0;
                        $dstr = '';
                        foreach ($info[$key] as $d) {
                            if (isset($this->_deps_rel_trans[$d['rel']])) {
                                $rel = $this->_deps_rel_trans[$d['rel']];
                            } else {
                                $rel = $d['rel'];
                            }
                            if (isset($this->_deps_type_trans[$d['type']])) {
                                $type = ucfirst($this->_deps_type_trans[$d['type']]);
                            } else {
                                $type = $d['type'];
                            }
                            if (isset($d['name'])) {
                                $name = $d['name'] . ' ';
                            } else {
                                $name = '';
                            }
                            if (isset($d['version'])) {
                                $version = $d['version'] . ' ';
                            } else {
                                $version = '';
                            }
                            if (isset($d['optional']) && $d['optional'] == 'yes') {
                                $optional = ' (optional)';
                            } else {
                                $optional = '';
                            }
                            $dstr .= "$type $name$rel $version$optional\n";
                        }
                        $info[$key] = $dstr;
                        break;
                    }
                    case 'provides' : {
                        $debug = $this->config->get('verbose');
                        if ($debug < 2) {
                            $pstr = 'Classes: ';
                        } else {
                            $pstr = '';
                        }
                        $i = 0;
                        foreach ($info[$key] as $p) {
                            if ($debug < 2 && $p['type'] != "class") {
                                continue;
                            }
                            // Only print classes when verbosity mode is < 2
                            if ($debug < 2) {
                                if ($i++ > 0) {
                                    $pstr .= ", ";
                                }
                                $pstr .= $p['name'];
                            } else {
                                if ($i++ > 0) {
                                    $pstr .= "\n";
                                }
                                $pstr .= ucfirst($p['type']) . " " . $p['name'];
                                if (isset($p['explicit']) && $p['explicit'] == 1) {
                                    $pstr .= " (explicit)";
                                }
                            }
                        }
                        $info[$key] = $pstr;
                        break;
                    }
                    case 'configure_options' : {
                        foreach ($info[$key] as $i => $p) {
                            $info[$key][$i] = array_map(null, array_keys($p), array_values($p));
                            $info[$key][$i] = array_map(
                                function($a) { return join(" = ", $a); },
                                $info[$key][$i]);
                            $info[$key][$i] = implode(', ', $info[$key][$i]);
                        }
                        $info[$key] = implode("\n", $info[$key]);
                        break;
                    }
                    default: {
                        $info[$key] = implode(", ", $info[$key]);
                        break;
                    }
                }
            }

            if ($key == '_lastmodified') {
                $hdate = date('Y-m-d', $info[$key]);
                unset($info[$key]);
                $info['Last Modified'] = $hdate;
            } elseif ($key == '_lastversion') {
                $info['Previous Installed Version'] = $info[$key] ? $info[$key] : '- None -';
                unset($info[$key]);
            } else {
                $info[$key] = trim($info[$key]);
                if (in_array($key, $longtext)) {
                    $info[$key] = preg_replace('/  +/', ' ', $info[$key]);
                }
            }
        }

        $caption = 'About ' . $info['package'] . '-' . $info['version'];
        $data = array(
            'caption' => $caption,
            'border' => true);
        foreach ($info as $key => $value) {
            $key = ucwords(trim(str_replace('_', ' ', $key)));
            $data['data'][] = array($key, $value);
        }
        $data['raw'] = $info;

        $this->ui->outputData($data, 'package-info');
    }

    /**
     * @access private
     */
    function _doInfo2($command, $options, $params, &$obj, $installed)
    {
        $reg = &$this->config->getRegistry();
        $caption = 'About ' . $obj->getChannel() . '/' .$obj->getPackage() . '-' .
            $obj->getVersion();
        $data = array(
            'caption' => $caption,
            'border' => true);
        switch ($obj->getPackageType()) {
            case 'php' :
                $release = 'PEAR-style PHP-based Package';
            break;
            case 'extsrc' :
                $release = 'PECL-style PHP extension (source code)';
            break;
            case 'zendextsrc' :
                $release = 'PECL-style Zend extension (source code)';
            break;
            case 'extbin' :
                $release = 'PECL-style PHP extension (binary)';
            break;
            case 'zendextbin' :
                $release = 'PECL-style Zend extension (binary)';
            break;
            case 'bundle' :
                $release = 'Package bundle (collection of packages)';
            break;
        }
        $extends = $obj->getExtends();
        $extends = $extends ?
            $obj->getPackage() . ' (extends ' . $extends . ')' : $obj->getPackage();
        if ($src = $obj->getSourcePackage()) {
            $extends .= ' (source package ' . $src['channel'] . '/' . $src['package'] . ')';
        }

        $info = array(
            'Release Type' => $release,
            'Name' => $extends,
            'Channel' => $obj->getChannel(),
            'Summary' => preg_replace('/  +/', ' ', $obj->getSummary()),
            'Description' => preg_replace('/  +/', ' ', $obj->getDescription()),
            );
        $info['Maintainers'] = '';
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            $leads = $obj->{"get{$role}s"}();
            if (!$leads) {
                continue;
            }

            if (isset($leads['active'])) {
                $leads = array($leads);
            }

            foreach ($leads as $lead) {
                if (!empty($info['Maintainers'])) {
                    $info['Maintainers'] .= "\n";
                }

                $active = $lead['active'] == 'no' ? ', inactive' : '';
                $info['Maintainers'] .= $lead['name'] . ' <';
                $info['Maintainers'] .= $lead['email'] . "> ($role$active)";
            }
        }

        $info['Release Date'] = $obj->getDate();
        if ($time = $obj->getTime()) {
            $info['Release Date'] .= ' ' . $time;
        }

        $info['Release Version'] = $obj->getVersion() . ' (' . $obj->getState() . ')';
        $info['API Version'] = $obj->getVersion('api') . ' (' . $obj->getState('api') . ')';
        $info['License'] = $obj->getLicense();
        $uri = $obj->getLicenseLocation();
        if ($uri) {
            if (isset($uri['uri'])) {
                $info['License'] .= ' (' . $uri['uri'] . ')';
            } else {
                $extra = $obj->getInstalledLocation($info['filesource']);
                if ($extra) {
                    $info['License'] .= ' (' . $uri['filesource'] . ')';
                }
            }
        }

        $info['Release Notes'] = $obj->getNotes();
        if ($compat = $obj->getCompatible()) {
            if (!isset($compat[0])) {
                $compat = array($compat);
            }

            $info['Compatible with'] = '';
            foreach ($compat as $package) {
                $info['Compatible with'] .= $package['channel'] . '/' . $package['name'] .
                    "\nVersions >= " . $package['min'] . ', <= ' . $package['max'];
                if (isset($package['exclude'])) {
                    if (is_array($package['exclude'])) {
                        $package['exclude'] = implode(', ', $package['exclude']);
                    }

                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= $package['channel'] . '/' .
                        $package['name'] . "\nVersions " . $package['exclude'];
                }
            }
        }

        $usesrole = $obj->getUsesrole();
        if ($usesrole) {
            if (!isset($usesrole[0])) {
                $usesrole = array($usesrole);
            }

            foreach ($usesrole as $roledata) {
                if (isset($info['Uses Custom Roles'])) {
                    $info['Uses Custom Roles'] .= "\n";
                } else {
                    $info['Uses Custom Roles'] = '';
                }

                if (isset($roledata['package'])) {
                    $rolepackage = $reg->parsedPackageNameToString($roledata, true);
                } else {
                    $rolepackage = $roledata['uri'];
                }
                $info['Uses Custom Roles'] .= $roledata['role'] . ' (' . $rolepackage . ')';
            }
        }

        $usestask = $obj->getUsestask();
        if ($usestask) {
            if (!isset($usestask[0])) {
                $usestask = array($usestask);
            }

            foreach ($usestask as $taskdata) {
                if (isset($info['Uses Custom Tasks'])) {
                    $info['Uses Custom Tasks'] .= "\n";
                } else {
                    $info['Uses Custom Tasks'] = '';
                }

                if (isset($taskdata['package'])) {
                    $taskpackage = $reg->parsedPackageNameToString($taskdata, true);
                } else {
                    $taskpackage = $taskdata['uri'];
                }
                $info['Uses Custom Tasks'] .= $taskdata['task'] . ' (' . $taskpackage . ')';
            }
        }

        $deps = $obj->getDependencies();
        $info['Required Dependencies'] = 'PHP version ' . $deps['required']['php']['min'];
        if (isset($deps['required']['php']['max'])) {
            $info['Required Dependencies'] .= '-' . $deps['required']['php']['max'] . "\n";
        } else {
            $info['Required Dependencies'] .= "\n";
        }

        if (isset($deps['required']['php']['exclude'])) {
            if (!isset($info['Not Compatible with'])) {
                $info['Not Compatible with'] = '';
            } else {
                $info['Not Compatible with'] .= "\n";
            }

            if (is_array($deps['required']['php']['exclude'])) {
                $deps['required']['php']['exclude'] =
                    implode(', ', $deps['required']['php']['exclude']);
            }
            $info['Not Compatible with'] .= "PHP versions\n  " .
                $deps['required']['php']['exclude'];
        }

        $info['Required Dependencies'] .= 'PEAR installer version';
        if (isset($deps['required']['pearinstaller']['max'])) {
            $info['Required Dependencies'] .= 's ' .
                $deps['required']['pearinstaller']['min'] . '-' .
                $deps['required']['pearinstaller']['max'];
        } else {
            $info['Required Dependencies'] .= ' ' .
                $deps['required']['pearinstaller']['min'] . ' or newer';
        }

        if (isset($deps['required']['pearinstaller']['exclude'])) {
            if (!isset($info['Not Compatible with'])) {
                $info['Not Compatible with'] = '';
            } else {
                $info['Not Compatible with'] .= "\n";
            }

            if (is_array($deps['required']['pearinstaller']['exclude'])) {
                $deps['required']['pearinstaller']['exclude'] =
                    implode(', ', $deps['required']['pearinstaller']['exclude']);
            }
            $info['Not Compatible with'] .= "PEAR installer\n  Versions " .
                $deps['required']['pearinstaller']['exclude'];
        }

        foreach (array('Package', 'Extension') as $type) {
            $index = strtolower($type);
            if (isset($deps['required'][$index])) {
                if (isset($deps['required'][$index]['name'])) {
                    $deps['required'][$index] = array($deps['required'][$index]);
                }

                foreach ($deps['required'][$index] as $package) {
                    if (isset($package['conflicts'])) {
                        $infoindex = 'Not Compatible with';
                        if (!isset($info['Not Compatible with'])) {
                            $info['Not Compatible with'] = '';
                        } else {
                            $info['Not Compatible with'] .= "\n";
                        }
                    } else {
                        $infoindex = 'Required Dependencies';
                        $info[$infoindex] .= "\n";
                    }

                    if ($index == 'extension') {
                        $name = $package['name'];
                    } else {
                        if (isset($package['channel'])) {
                            $name = $package['channel'] . '/' . $package['name'];
                        } else {
                            $name = '__uri/' . $package['name'] . ' (static URI)';
                        }
                    }

                    $info[$infoindex] .= "$type $name";
                    if (isset($package['uri'])) {
                        $info[$infoindex] .= "\n  Download URI: $package[uri]";
                        continue;
                    }

                    if (isset($package['max']) && isset($package['min'])) {
                        $info[$infoindex] .= " \n  Versions " .
                            $package['min'] . '-' . $package['max'];
                    } elseif (isset($package['min'])) {
                        $info[$infoindex] .= " \n  Version " .
                            $package['min'] . ' or newer';
                    } elseif (isset($package['max'])) {
                        $info[$infoindex] .= " \n  Version " .
                            $package['max'] . ' or older';
                    }

                    if (isset($package['recommended'])) {
                        $info[$infoindex] .= "\n  Recommended version: $package[recommended]";
                    }

                    if (isset($package['exclude'])) {
                        if (!isset($info['Not Compatible with'])) {
                            $info['Not Compatible with'] = '';
                        } else {
                            $info['Not Compatible with'] .= "\n";
                        }

                        if (is_array($package['exclude'])) {
                            $package['exclude'] = implode(', ', $package['exclude']);
                        }

                        $package['package'] = $package['name']; // for parsedPackageNameToString
                         if (isset($package['conflicts'])) {
                            $info['Not Compatible with'] .= '=> except ';
                        }
                       $info['Not Compatible with'] .= 'Package ' .
                            $reg->parsedPackageNameToString($package, true);
                        $info['Not Compatible with'] .= "\n  Versions " . $package['exclude'];
                    }
                }
            }
        }

        if (isset($deps['required']['os'])) {
            if (isset($deps['required']['os']['name'])) {
                $dep['required']['os']['name'] = array($dep['required']['os']['name']);
            }

            foreach ($dep['required']['os'] as $os) {
                if (isset($os['conflicts']) && $os['conflicts'] == 'yes') {
                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= "$os[name] Operating System";
                } else {
                    $info['Required Dependencies'] .= "\n";
                    $info['Required Dependencies'] .= "$os[name] Operating System";
                }
            }
        }

        if (isset($deps['required']['arch'])) {
            if (isset($deps['required']['arch']['pattern'])) {
                $dep['required']['arch']['pattern'] = array($dep['required']['os']['pattern']);
            }

            foreach ($dep['required']['arch'] as $os) {
                if (isset($os['conflicts']) && $os['conflicts'] == 'yes') {
                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= "OS/Arch matching pattern '/$os[pattern]/'";
                } else {
                    $info['Required Dependencies'] .= "\n";
                    $info['Required Dependencies'] .= "OS/Arch matching pattern '/$os[pattern]/'";
                }
            }
        }

        if (isset($deps['optional'])) {
            foreach (array('Package', 'Extension') as $type) {
                $index = strtolower($type);
                if (isset($deps['optional'][$index])) {
                    if (isset($deps['optional'][$index]['name'])) {
                        $deps['optional'][$index] = array($deps['optional'][$index]);
                    }

                    foreach ($deps['optional'][$index] as $package) {
                        if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                            $infoindex = 'Not Compatible with';
                            if (!isset($info['Not Compatible with'])) {
                                $info['Not Compatible with'] = '';
                            } else {
                                $info['Not Compatible with'] .= "\n";
                            }
                        } else {
                            $infoindex = 'Optional Dependencies';
                            if (!isset($info['Optional Dependencies'])) {
                                $info['Optional Dependencies'] = '';
                            } else {
                                $info['Optional Dependencies'] .= "\n";
                            }
                        }

                        if ($index == 'extension') {
                            $name = $package['name'];
                        } else {
                            if (isset($package['channel'])) {
                                $name = $package['channel'] . '/' . $package['name'];
                            } else {
                                $name = '__uri/' . $package['name'] . ' (static URI)';
                            }
                        }

                        $info[$infoindex] .= "$type $name";
                        if (isset($package['uri'])) {
                            $info[$infoindex] .= "\n  Download URI: $package[uri]";
                            continue;
                        }

                        if ($infoindex == 'Not Compatible with') {
                            // conflicts is only used to say that all versions conflict
                            continue;
                        }

                        if (isset($package['max']) && isset($package['min'])) {
                            $info[$infoindex] .= " \n  Versions " .
                                $package['min'] . '-' . $package['max'];
                        } elseif (isset($package['min'])) {
                            $info[$infoindex] .= " \n  Version " .
                                $package['min'] . ' or newer';
                        } elseif (isset($package['max'])) {
                            $info[$infoindex] .= " \n  Version " .
                                $package['min'] . ' or older';
                        }

                        if (isset($package['recommended'])) {
                            $info[$infoindex] .= "\n  Recommended version: $package[recommended]";
                        }

                        if (isset($package['exclude'])) {
                            if (!isset($info['Not Compatible with'])) {
                                $info['Not Compatible with'] = '';
                            } else {
                                $info['Not Compatible with'] .= "\n";
                            }

                            if (is_array($package['exclude'])) {
                                $package['exclude'] = implode(', ', $package['exclude']);
                            }

                            $info['Not Compatible with'] .= "Package $package\n  Versions " .
                                $package['exclude'];
                        }
                    }
                }
            }
        }

        if (isset($deps['group'])) {
            if (!isset($deps['group'][0])) {
                $deps['group'] = array($deps['group']);
            }

            foreach ($deps['group'] as $group) {
                $info['Dependency Group ' . $group['attribs']['name']] = $group['attribs']['hint'];
                $groupindex = $group['attribs']['name'] . ' Contents';
                $info[$groupindex] = '';
                foreach (array('Package', 'Extension') as $type) {
                    $index = strtolower($type);
                    if (isset($group[$index])) {
                        if (isset($group[$index]['name'])) {
                            $group[$index] = array($group[$index]);
                        }

                        foreach ($group[$index] as $package) {
                            if (!empty($info[$groupindex])) {
                                $info[$groupindex] .= "\n";
                            }

                            if ($index == 'extension') {
                                $name = $package['name'];
                            } else {
                                if (isset($package['channel'])) {
                                    $name = $package['channel'] . '/' . $package['name'];
                                } else {
                                    $name = '__uri/' . $package['name'] . ' (static URI)';
                                }
                            }

                            if (isset($package['uri'])) {
                                if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                                    $info[$groupindex] .= "Not Compatible with $type $name";
                                } else {
                                    $info[$groupindex] .= "$type $name";
                                }

                                $info[$groupindex] .= "\n  Download URI: $package[uri]";
                                continue;
                            }

                            if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                                $info[$groupindex] .= "Not Compatible with $type $name";
                                continue;
                            }

                            $info[$groupindex] .= "$type $name";
                            if (isset($package['max']) && isset($package['min'])) {
                                $info[$groupindex] .= " \n  Versions " .
                                    $package['min'] . '-' . $package['max'];
                            } elseif (isset($package['min'])) {
                                $info[$groupindex] .= " \n  Version " .
                                    $package['min'] . ' or newer';
                            } elseif (isset($package['max'])) {
                                $info[$groupindex] .= " \n  Version " .
                                    $package['min'] . ' or older';
                            }

                            if (isset($package['recommended'])) {
                                $info[$groupindex] .= "\n  Recommended version: $package[recommended]";
                            }

                            if (isset($package['exclude'])) {
                                if (!isset($info['Not Compatible with'])) {
                                    $info['Not Compatible with'] = '';
                                } else {
                                    $info[$groupindex] .= "Not Compatible with\n";
                                }

                                if (is_array($package['exclude'])) {
                                    $package['exclude'] = implode(', ', $package['exclude']);
                                }
                                $info[$groupindex] .= "  Package $package\n  Versions " .
                                    $package['exclude'];
                            }
                        }
                    }
                }
            }
        }

        if ($obj->getPackageType() == 'bundle') {
            $info['Bundled Packages'] = '';
            foreach ($obj->getBundledPackages() as $package) {
                if (!empty($info['Bundled Packages'])) {
                    $info['Bundled Packages'] .= "\n";
                }

                if (isset($package['uri'])) {
                    $info['Bundled Packages'] .= '__uri/' . $package['name'];
                    $info['Bundled Packages'] .= "\n  (URI: $package[uri]";
                } else {
                    $info['Bundled Packages'] .= $package['channel'] . '/' . $package['name'];
                }
            }
        }

        $info['package.xml version'] = '2.0';
        if ($installed) {
            if ($obj->getLastModified()) {
                $info['Last Modified'] = date('Y-m-d H:i', $obj->getLastModified());
            }

            $v = $obj->getLastInstalledVersion();
            $info['Previous Installed Version'] = $v ? $v : '- None -';
        }

        foreach ($info as $key => $value) {
            $data['data'][] = array($key, $value);
        }

        $data['raw'] = $obj->getArray(); // no validation needed
        $this->ui->outputData($data, 'package-info');
    }
}
pear/PEAR/Command/Config.php000064400000036153151732710140011527 0ustar00<?php
/**
 * PEAR_Command_Config (config-show, config-get, config-set, config-help, config-create commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for managing configuration data.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Config extends PEAR_Command_Common
{
    var $commands = array(
        'config-show' => array(
            'summary' => 'Show All Settings',
            'function' => 'doConfigShow',
            'shortcut' => 'csh',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '[layer]
Displays all configuration values.  An optional argument
may be used to tell which configuration layer to display.  Valid
configuration layers are "user", "system" and "default". To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
',
            ),
        'config-get' => array(
            'summary' => 'Show One Setting',
            'function' => 'doConfigGet',
            'shortcut' => 'cg',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '<parameter> [layer]
Displays the value of one configuration parameter.  The
first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in.  Valid configuration
layers are "user", "system" and "default".  If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order
just specified.  The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
',
            ),
        'config-set' => array(
            'summary' => 'Change Setting',
            'function' => 'doConfigSet',
            'shortcut' => 'cs',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '<parameter> <value> [layer]
Sets the value of one configuration parameter.  The first argument is
the name of the parameter, the second argument is the new value.  Some
parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense.  An optional
third argument may be used to specify in which layer to set the
configuration parameter.  The default layer is "user".  The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
',
            ),
        'config-help' => array(
            'summary' => 'Show Information About Setting',
            'function' => 'doConfigHelp',
            'shortcut' => 'ch',
            'options' => array(),
            'doc' => '[parameter]
Displays help for a configuration parameter.  Without arguments it
displays help for all configuration parameters.
',
           ),
        'config-create' => array(
            'summary' => 'Create a Default configuration file',
            'function' => 'doConfigCreate',
            'shortcut' => 'coc',
            'options' => array(
                'windows' => array(
                    'shortopt' => 'w',
                    'doc' => 'create a config file for a windows install',
                    ),
            ),
            'doc' => '<root path> <filename>
Create a default configuration file with all directory configuration
variables set to subdirectories of <root path>, and save it as <filename>.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
',
            ),
        );

    /**
     * PEAR_Command_Config constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doConfigShow($command, $options, $params)
    {
        $layer = null;
        if (is_array($params)) {
            $layer = isset($params[0]) ? $params[0] : null;
        }

        // $params[0] -> the layer
        if ($error = $this->_checkLayer($layer)) {
            return $this->raiseError("config-show:$error");
        }

        $keys = $this->config->getKeys();
        sort($keys);
        $channel = isset($options['channel']) ? $options['channel'] :
            $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        $data = array('caption' => 'Configuration (channel ' . $channel . '):');
        foreach ($keys as $key) {
            $type = $this->config->getType($key);
            $value = $this->config->get($key, $layer, $channel);
            if ($type == 'password' && $value) {
                $value = '********';
            }

            if ($value === false) {
                $value = 'false';
            } elseif ($value === true) {
                $value = 'true';
            }

            $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value);
        }

        foreach ($this->config->getLayers() as $layer) {
            $data['data']['Config Files'][] = array(ucfirst($layer) . ' Configuration File', 'Filename' , $this->config->getConfFile($layer));
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doConfigGet($command, $options, $params)
    {
        $args_cnt = is_array($params) ? count($params) : 0;
        switch ($args_cnt) {
            case 1:
                $config_key = $params[0];
                $layer = null;
                break;
            case 2:
                $config_key = $params[0];
                $layer = $params[1];
                if ($error = $this->_checkLayer($layer)) {
                    return $this->raiseError("config-get:$error");
                }
                break;
            case 0:
            default:
                return $this->raiseError("config-get expects 1 or 2 parameters");
        }

        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        $this->ui->outputData($this->config->get($config_key, $layer, $channel), $command);
        return true;
    }

    function doConfigSet($command, $options, $params)
    {
        // $param[0] -> a parameter to set
        // $param[1] -> the value for the parameter
        // $param[2] -> the layer
        $failmsg = '';
        if (count($params) < 2 || count($params) > 3) {
            $failmsg .= "config-set expects 2 or 3 parameters";
            return PEAR::raiseError($failmsg);
        }

        if (isset($params[2]) && ($error = $this->_checkLayer($params[2]))) {
            $failmsg .= $error;
            return PEAR::raiseError("config-set:$failmsg");
        }

        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        if ($params[0] == 'default_channel' && !$reg->channelExists($params[1])) {
            return $this->raiseError('Channel "' . $params[1] . '" does not exist');
        }

        if ($params[0] == 'preferred_mirror'
            && (
                !$reg->mirrorExists($channel, $params[1]) &&
                (!$reg->channelExists($params[1]) || $channel != $params[1])
            )
        ) {
            $msg  = 'Channel Mirror "' . $params[1] . '" does not exist';
            $msg .= ' in your registry for channel "' . $channel . '".';
            $msg .= "\n" . 'Attempt to run "pear channel-update ' . $channel .'"';
            $msg .= ' if you believe this mirror should exist as you may';
            $msg .= ' have outdated channel information.';
            return $this->raiseError($msg);
        }

        if (count($params) == 2) {
            array_push($params, 'user');
            $layer = 'user';
        } else {
            $layer = $params[2];
        }

        array_push($params, $channel);
        if (!call_user_func_array(array(&$this->config, 'set'), $params)) {
            array_pop($params);
            $failmsg = "config-set (" . implode(", ", $params) . ") failed, channel $channel";
        } else {
            $this->config->store($layer);
        }

        if ($failmsg) {
            return $this->raiseError($failmsg);
        }

        $this->ui->outputData('config-set succeeded', $command);
        return true;
    }

    function doConfigHelp($command, $options, $params)
    {
        if (empty($params)) {
            $params = $this->config->getKeys();
        }

        $data['caption']  = "Config help" . ((count($params) == 1) ? " for $params[0]" : '');
        $data['headline'] = array('Name', 'Type', 'Description');
        $data['border']   = true;
        foreach ($params as $name) {
            $type = $this->config->getType($name);
            $docs = $this->config->getDocs($name);
            if ($type == 'set') {
                $docs = rtrim($docs) . "\nValid set: " .
                    implode(' ', $this->config->getSetValues($name));
            }

            $data['data'][] = array($name, $type, $docs);
        }

        $this->ui->outputData($data, $command);
    }

    function doConfigCreate($command, $options, $params)
    {
        if (count($params) != 2) {
            return PEAR::raiseError('config-create: must have 2 parameters, root path and ' .
                'filename to save as');
        }

        $root = $params[0];
        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        $root = preg_replace(array('!\\\\+!', '!/+!', "!$ds2+!"),
                             array('/', '/', '/'),
                            $root);
        if ($root[0] != '/') {
            if (!isset($options['windows'])) {
                return PEAR::raiseError('Root directory must be an absolute path beginning ' .
                    'with "/", was: "' . $root . '"');
            }

            if (!preg_match('/^[A-Za-z]:/', $root)) {
                return PEAR::raiseError('Root directory must be an absolute path beginning ' .
                    'with "\\" or "C:\\", was: "' . $root . '"');
            }
        }

        $windows = isset($options['windows']);
        if ($windows) {
            $root = str_replace('/', '\\', $root);
        }

        if (!file_exists($params[1]) && !@touch($params[1])) {
            return PEAR::raiseError('Could not create "' . $params[1] . '"');
        }

        $params[1] = realpath($params[1]);
        $config = new PEAR_Config($params[1], '#no#system#config#', false, false);
        if ($root[strlen($root) - 1] == '/') {
            $root = substr($root, 0, strlen($root) - 1);
        }

        $config->noRegistry();
        $config->set('php_dir', $windows ? "$root\\pear\\php" : "$root/pear/php", 'user');
        $config->set('data_dir', $windows ? "$root\\pear\\data" : "$root/pear/data");
        $config->set('www_dir', $windows ? "$root\\pear\\www" : "$root/pear/www");
        $config->set('cfg_dir', $windows ? "$root\\pear\\cfg" : "$root/pear/cfg");
        $config->set('ext_dir', $windows ? "$root\\pear\\ext" : "$root/pear/ext");
        $config->set('doc_dir', $windows ? "$root\\pear\\docs" : "$root/pear/docs");
        $config->set('test_dir', $windows ? "$root\\pear\\tests" : "$root/pear/tests");
        $config->set('cache_dir', $windows ? "$root\\pear\\cache" : "$root/pear/cache");
        $config->set('download_dir', $windows ? "$root\\pear\\download" : "$root/pear/download");
        $config->set('temp_dir', $windows ? "$root\\pear\\temp" : "$root/pear/temp");
        $config->set('bin_dir', $windows ? "$root\\pear" : "$root/pear");
        $config->set('man_dir', $windows ? "$root\\pear\\man" : "$root/pear/man");
        $config->writeConfigFile();
        $this->_showConfig($config);
        $this->ui->outputData('Successfully created default configuration file "' . $params[1] . '"',
            $command);
    }

    function _showConfig(&$config)
    {
        $params = array('user');
        $keys = $config->getKeys();
        sort($keys);
        $channel = 'pear.php.net';
        $data = array('caption' => 'Configuration (channel ' . $channel . '):');
        foreach ($keys as $key) {
            $type = $config->getType($key);
            $value = $config->get($key, 'user', $channel);
            if ($type == 'password' && $value) {
                $value = '********';
            }

            if ($value === false) {
                $value = 'false';
            } elseif ($value === true) {
                $value = 'true';
            }
            $data['data'][$config->getGroup($key)][] =
                array($config->getPrompt($key) , $key, $value);
        }

        foreach ($config->getLayers() as $layer) {
            $data['data']['Config Files'][] =
                array(ucfirst($layer) . ' Configuration File', 'Filename' ,
                    $config->getConfFile($layer));
        }

        $this->ui->outputData($data, 'config-show');
        return true;
    }

    /**
     * Checks if a layer is defined or not
     *
     * @param string $layer The layer to search for
     * @return mixed False on no error or the error message
     */
    function _checkLayer($layer = null)
    {
        if (!empty($layer) && $layer != 'default') {
            $layers = $this->config->getLayers();
            if (!in_array($layer, $layers)) {
                return " only the layers: \"" . implode('" or "', $layers) . "\" are supported";
            }
        }

        return false;
    }
}
pear/PEAR/Command/Install.xml000064400000020763151732710140011741 0ustar00<commands version="1.0">
 <install>
  <summary>Install Package</summary>
  <function>doInstall</function>
  <shortcut>i</shortcut>
  <options>
   <force>
    <shortopt>f</shortopt>
    <doc>will overwrite newer installed packages</doc>
   </force>
   <loose>
    <shortopt>l</shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, install anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as installed</doc>
   </register-only>
   <soft>
    <shortopt>s</shortopt>
    <doc>soft install, fail silently, or upgrade if already installed</doc>
   </soft>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <configureoptions>
    <shortopt>D</shortopt>
    <arg>OPTION1=VALUE[ OPTION2=VALUE]</arg>
   </configureoptions>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
    <arg>DIR</arg>
   </installroot>
   <packagingroot>
    <shortopt>P</shortopt>
    <doc>root directory used when packaging files, like RPM packaging</doc>
    <arg>DIR</arg>
   </packagingroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <alldeps>
    <shortopt>a</shortopt>
    <doc>install all required and optional dependencies</doc>
   </alldeps>
   <onlyreqdeps>
    <shortopt>o</shortopt>
    <doc>install all required dependencies</doc>
   </onlyreqdeps>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to download any urls or contact channels</doc>
   </offline>
   <pretend>
    <shortopt>p</shortopt>
    <doc>Only list the packages that would be downloaded</doc>
   </pretend>
  </options>
  <doc>[channel/]&lt;package&gt; ...
Installs one or more PEAR packages.  You can specify a package to
install in four ways:

&quot;Package-1.0.tgz&quot; : installs from a local file

&quot;http://example.com/Package-1.0.tgz&quot; : installs from
anywhere on the net.

&quot;package.xml&quot; : installs the package described in
package.xml.  Useful for testing, or for wrapping a PEAR package in
another package manager such as RPM.

&quot;Package[-version/state][.tar]&quot; : queries your default channel&#039;s server
({config master_server}) and downloads the newest package with
the preferred quality/state ({config preferred_state}).

To retrieve Package version 1.1, use &quot;Package-1.1,&quot; to retrieve
Package state beta, use &quot;Package-beta.&quot;  To retrieve an uncompressed
file, append .tar (make sure there is no file by the same name first)

To download a package from another channel, prefix with the channel name like
&quot;channel/Package&quot;

More than one package may be specified at once.  It is ok to mix these
four ways of specifying packages.
</doc>
 </install>
 <upgrade>
  <summary>Upgrade Package</summary>
  <function>doInstall</function>
  <shortcut>up</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>upgrade packages from a specific channel</doc>
    <arg>CHAN</arg>
   </channel>
   <force>
    <shortopt>f</shortopt>
    <doc>overwrite newer installed packages</doc>
   </force>
   <loose>
    <shortopt>l</shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, upgrade anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as upgraded</doc>
   </register-only>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <alldeps>
    <shortopt>a</shortopt>
    <doc>install all required and optional dependencies</doc>
   </alldeps>
   <onlyreqdeps>
    <shortopt>o</shortopt>
    <doc>install all required dependencies</doc>
   </onlyreqdeps>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to download any urls or contact channels</doc>
   </offline>
   <pretend>
    <shortopt>p</shortopt>
    <doc>Only list the packages that would be downloaded</doc>
   </pretend>
  </options>
  <doc>&lt;package&gt; ...
Upgrades one or more PEAR packages.  See documentation for the
&quot;install&quot; command for ways to specify a package.

When upgrading, your package will be updated if the provided new
package has a higher version number (use the -f option if you need to
upgrade anyway).

More than one package may be specified at once.
</doc>
 </upgrade>
 <upgrade-all>
  <summary>Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]</summary>
  <function>doUpgradeAll</function>
  <shortcut>ua</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>upgrade packages from a specific channel</doc>
    <arg>CHAN</arg>
   </channel>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, upgrade anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as upgraded</doc>
   </register-only>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <loose>
    <shortopt></shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
  </options>
  <doc>
WARNING: This function is deprecated in favor of using the upgrade command with no params

Upgrades all packages that have a newer release available.  Upgrades are
done only if there is a release available of the state specified in
&quot;preferred_state&quot; (currently {config preferred_state}), or a state considered
more stable.
</doc>
 </upgrade-all>
 <uninstall>
  <summary>Un-install Package</summary>
  <function>doUninstall</function>
  <shortcut>un</shortcut>
  <options>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, uninstall anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not remove files, only register the packages as not installed</doc>
   </register-only>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to uninstall remotely</doc>
   </offline>
  </options>
  <doc>[channel/]&lt;package&gt; ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel ({config default_channel})
</doc>
 </uninstall>
 <bundle>
  <summary>Unpacks a Pecl Package</summary>
  <function>doBundle</function>
  <shortcut>bun</shortcut>
  <options>
   <destination>
    <shortopt>d</shortopt>
    <doc>Optional destination directory for unpacking (defaults to current path or &quot;ext&quot; if exists)</doc>
    <arg>DIR</arg>
   </destination>
   <force>
    <shortopt>f</shortopt>
    <doc>Force the unpacking even if there were errors in the package</doc>
   </force>
  </options>
  <doc>&lt;package&gt;
Unpacks a Pecl Package into the selected location. It will download the
package if needed.
</doc>
 </bundle>
 <run-scripts>
  <summary>Run Post-Install Scripts bundled with a package</summary>
  <function>doRunScripts</function>
  <shortcut>rs</shortcut>
  <options />
  <doc>&lt;package&gt;
Run post-installation scripts in package &lt;package&gt;, if any exist.
</doc>
 </run-scripts>
</commands>pear/PEAR/Command/Auth.xml000064400000002314151732710140011224 0ustar00<commands version="1.0">
 <login>
  <summary>Connects and authenticates to remote server [Deprecated in favor of channel-login]</summary>
  <function>doLogin</function>
  <shortcut>li</shortcut>
  <options />
  <doc>&lt;channel name&gt;
WARNING: This function is deprecated in favor of using channel-login

Log in to a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
 </login>
 <logout>
  <summary>Logs out from the remote server [Deprecated in favor of channel-logout]</summary>
  <function>doLogout</function>
  <shortcut>lo</shortcut>
  <options />
  <doc>
WARNING: This function is deprecated in favor of using channel-logout

Logs out from the remote server.  This command does not actually
connect to the remote server, it only deletes the stored username and
password from your user configuration.</doc>
 </logout>
</commands>pear/PEAR/Command/Mirror.php000064400000010636151732710140011572 0ustar00<?php
/**
 * PEAR_Command_Mirror (download-all command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Alexander Merz <alexmerz@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.2.0
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for providing file mirrors
 *
 * @category   pear
 * @package    PEAR
 * @author     Alexander Merz <alexmerz@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.2.0
 */
class PEAR_Command_Mirror extends PEAR_Command_Common
{
    var $commands = array(
        'download-all' => array(
            'summary' => 'Downloads each available package from the default channel',
            'function' => 'doDownloadAll',
            'shortcut' => 'da',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                ),
            'doc' => '
Requests a list of available packages from the default channel ({config default_channel})
and downloads them to current working directory.  Note: only
packages within preferred_state ({config preferred_state}) will be downloaded'
            ),
        );

    /**
     * PEAR_Command_Mirror constructor.
     *
     * @access public
     * @param object PEAR_Frontend a reference to an frontend
     * @param object PEAR_Config a reference to the configuration data
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    /**
     * For unit-testing
     */
    function &factory($a)
    {
        $a = &PEAR_Command::factory($a, $this->config);
        return $a;
    }

    /**
    * retrieves a list of avaible Packages from master server
    * and downloads them
    *
    * @access public
    * @param string $command the command
    * @param array $options the command options before the command
    * @param array $params the stuff after the command name
    * @return bool true if successful
    * @throw PEAR_Error
    */
    function doDownloadAll($command, $options, $params)
    {
        $savechannel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] :
            $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }
        $this->config->set('default_channel', $channel);

        $this->ui->outputData('Using Channel ' . $this->config->get('default_channel'));
        $chan = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $remoteInfo = array_flip($rest->listPackages($base, $channel));
        }

        if (PEAR::isError($remoteInfo)) {
            return $remoteInfo;
        }

        $cmd = &$this->factory("download");
        if (PEAR::isError($cmd)) {
            return $cmd;
        }

        $this->ui->outputData('Using Preferred State of ' .
            $this->config->get('preferred_state'));
        $this->ui->outputData('Gathering release information, please wait...');

        /**
         * Error handling not necessary, because already done by
         * the download command
         */
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $err = $cmd->run('download', array('downloadonly' => true), array_keys($remoteInfo));
        PEAR::staticPopErrorHandling();
        $this->config->set('default_channel', $savechannel);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage());
        }

        return true;
    }
}
pear/PEAR/Config.php000064400000207035151732710140010150 0ustar00<?php
/**
 * PEAR_Config, customized configuration handling for the PEAR Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Required for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Registry.php';
require_once 'PEAR/Installer/Role.php';
require_once 'System.php';

/**
 * Last created PEAR_Config instance.
 * @var object
 */
$GLOBALS['_PEAR_Config_instance'] = null;
if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) {
    $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear';
} else {
    $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR;
}

// Below we define constants with default values for all configuration
// parameters except username/password.  All of them can have their
// defaults set through environment variables.  The reason we use the
// PHP_ prefix is for some security, PHP protects environment
// variables starting with PHP_*.

// default channel and preferred mirror is based on whether we are invoked through
// the "pear" or the "pecl" command
if (!defined('PEAR_RUNTYPE')) {
    define('PEAR_RUNTYPE', 'pear');
}

if (PEAR_RUNTYPE == 'pear') {
    define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pear.php.net');
} else {
    define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pecl.php.net');
}

if (getenv('PHP_PEAR_SYSCONF_DIR')) {
    define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR'));
} elseif (getenv('SystemRoot')) {
    define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot'));
} else {
    define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR);
}

// Default for master_server
if (getenv('PHP_PEAR_MASTER_SERVER')) {
    define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER'));
} else {
    define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net');
}

// Default for http_proxy
if (getenv('PHP_PEAR_HTTP_PROXY')) {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY'));
} elseif (getenv('http_proxy')) {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy'));
} else {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', '');
}

// Default for php_dir
if (getenv('PHP_PEAR_INSTALL_DIR')) {
    define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR);
}

// Default for metadata_dir
if (getenv('PHP_PEAR_METADATA_DIR')) {
    define('PEAR_CONFIG_DEFAULT_METADATA_DIR', getenv('PHP_PEAR_METADATA_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_METADATA_DIR', '');
}

// Default for ext_dir
if (getenv('PHP_PEAR_EXTENSION_DIR')) {
    define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR'));
} else {
    if (ini_get('extension_dir')) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir'));
    } elseif (defined('PEAR_EXTENSION_DIR') &&
              file_exists(PEAR_EXTENSION_DIR) && is_dir(PEAR_EXTENSION_DIR)) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', PEAR_EXTENSION_DIR);
    } elseif (defined('PHP_EXTENSION_DIR')) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', PHP_EXTENSION_DIR);
    } else {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', '.');
    }
}

// Default for doc_dir
if (getenv('PHP_PEAR_DOC_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DOC_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs');
}

// Default for bin_dir
if (getenv('PHP_PEAR_BIN_DIR')) {
    define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR);
}

// Default for data_dir
if (getenv('PHP_PEAR_DATA_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DATA_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data');
}

// Default for cfg_dir
if (getenv('PHP_PEAR_CFG_DIR')) {
    define('PEAR_CONFIG_DEFAULT_CFG_DIR', getenv('PHP_PEAR_CFG_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_CFG_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'cfg');
}

// Default for www_dir
if (getenv('PHP_PEAR_WWW_DIR')) {
    define('PEAR_CONFIG_DEFAULT_WWW_DIR', getenv('PHP_PEAR_WWW_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_WWW_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'www');
}

// Default for man_dir
if (getenv('PHP_PEAR_MAN_DIR')) {
    define('PEAR_CONFIG_DEFAULT_MAN_DIR', getenv('PHP_PEAR_MAN_DIR'));
} else {
    if (defined('PHP_MANDIR')) { // Added in PHP5.3.7
        define('PEAR_CONFIG_DEFAULT_MAN_DIR', PHP_MANDIR);
    } else {
        define('PEAR_CONFIG_DEFAULT_MAN_DIR', PHP_PREFIX . DIRECTORY_SEPARATOR .
           'local' . DIRECTORY_SEPARATOR .'man');
    }
}

// Default for test_dir
if (getenv('PHP_PEAR_TEST_DIR')) {
    define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_TEST_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests');
}

// Default for temp_dir
if (getenv('PHP_PEAR_TEMP_DIR')) {
    define('PEAR_CONFIG_DEFAULT_TEMP_DIR', getenv('PHP_PEAR_TEMP_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_TEMP_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'temp');
}

// Default for cache_dir
if (getenv('PHP_PEAR_CACHE_DIR')) {
    define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_CACHE_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'cache');
}

// Default for download_dir
if (getenv('PHP_PEAR_DOWNLOAD_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR', getenv('PHP_PEAR_DOWNLOAD_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'download');
}

// Default for php_bin
if (getenv('PHP_PEAR_PHP_BIN')) {
    define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN'));
} else {
    define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR.
           DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : ''));
}

// Default for verbose
if (getenv('PHP_PEAR_VERBOSE')) {
    define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE'));
} else {
    define('PEAR_CONFIG_DEFAULT_VERBOSE', 1);
}

// Default for preferred_state
if (getenv('PHP_PEAR_PREFERRED_STATE')) {
    define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE'));
} else {
    define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable');
}

// Default for umask
if (getenv('PHP_PEAR_UMASK')) {
    define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK'));
} else {
    define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask()));
}

// Default for cache_ttl
if (getenv('PHP_PEAR_CACHE_TTL')) {
    define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL'));
} else {
    define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600);
}

// Default for sig_type
if (getenv('PHP_PEAR_SIG_TYPE')) {
    define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg');
}

// Default for sig_bin
if (getenv('PHP_PEAR_SIG_BIN')) {
    define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_BIN',
           System::which(
               'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg'));
}

// Default for sig_keydir
if (getenv('PHP_PEAR_SIG_KEYDIR')) {
    define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR',
           PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys');
}

/**
 * This is a class for storing configuration data, keeping track of
 * which are system-defined, user-defined or defaulted.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Config extends PEAR
{
    /**
     * Array of config files used.
     *
     * @var array layer => config file
     */
    var $files = array(
        'system' => '',
        'user' => '',
        );

    var $layers = array();

    /**
     * Configuration data, two-dimensional array where the first
     * dimension is the config layer ('user', 'system' and 'default'),
     * and the second dimension is keyname => value.
     *
     * The order in the first dimension is important!  Earlier
     * layers will shadow later ones when a config value is
     * requested (if a 'user' value exists, it will be returned first,
     * then 'system' and finally 'default').
     *
     * @var array layer => array(keyname => value, ...)
     */
    var $configuration = array(
        'user' => array(),
        'system' => array(),
        'default' => array(),
        );

    /**
     * Configuration values that can be set for a channel
     *
     * All other configuration values can only have a global value
     * @var array
     * @access private
     */
    var $_channelConfigInfo = array(
        'php_dir', 'ext_dir', 'doc_dir', 'bin_dir', 'data_dir', 'cfg_dir',
        'test_dir', 'www_dir', 'php_bin', 'php_prefix', 'php_suffix', 'username',
        'password', 'verbose', 'preferred_state', 'umask', 'preferred_mirror', 'php_ini'
        );

    /**
     * Channels that can be accessed
     * @see setChannels()
     * @var array
     * @access private
     */
    var $_channels = array('pear.php.net', 'pecl.php.net', '__uri');

    /**
     * This variable is used to control the directory values returned
     * @see setInstallRoot();
     * @var string|false
     * @access private
     */
    var $_installRoot = false;

    /**
     * If requested, this will always refer to the registry
     * contained in php_dir
     * @var PEAR_Registry
     */
    var $_registry = array();

    /**
     * @var array
     * @access private
     */
    var $_regInitialized = array();

    /**
     * @var bool
     * @access private
     */
    var $_noRegistry = false;

    /**
     * amount of errors found while parsing config
     * @var integer
     * @access private
     */
    var $_errorsFound = 0;
    var $_lastError = null;

    /**
     * Information about the configuration data.  Stores the type,
     * default value and a documentation string for each configuration
     * value.
     *
     * @var array layer => array(infotype => value, ...)
     */
    var $configuration_info = array(
        // Channels/Internet Access
        'default_channel' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_CHANNEL,
            'doc' => 'the default channel to use for all non explicit commands',
            'prompt' => 'Default Channel',
            'group' => 'Internet Access',
            ),
        'preferred_mirror' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_CHANNEL,
            'doc' => 'the default server or mirror to use for channel actions',
            'prompt' => 'Default Channel Mirror',
            'group' => 'Internet Access',
            ),
        'remote_config' => array(
            'type' => 'password',
            'default' => '',
            'doc' => 'ftp url of remote configuration file to use for synchronized install',
            'prompt' => 'Remote Configuration File',
            'group' => 'Internet Access',
            ),
        'auto_discover' => array(
            'type' => 'integer',
            'default' => 0,
            'doc' => 'whether to automatically discover new channels',
            'prompt' => 'Auto-discover new Channels',
            'group' => 'Internet Access',
            ),
        // Internet Access
        'master_server' => array(
            'type' => 'string',
            'default' => 'pear.php.net',
            'doc' => 'name of the main PEAR server [NOT USED IN THIS VERSION]',
            'prompt' => 'PEAR server [DEPRECATED]',
            'group' => 'Internet Access',
            ),
        'http_proxy' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY,
            'doc' => 'HTTP proxy (host:port) to use when downloading packages',
            'prompt' => 'HTTP Proxy Server Address',
            'group' => 'Internet Access',
            ),
        // File Locations
        'php_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_PHP_DIR,
            'doc' => 'directory where .php files are installed',
            'prompt' => 'PEAR directory',
            'group' => 'File Locations',
            ),
        'ext_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_EXT_DIR,
            'doc' => 'directory where loadable extensions are installed',
            'prompt' => 'PHP extension directory',
            'group' => 'File Locations',
            ),
        'doc_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DOC_DIR,
            'doc' => 'directory where documentation is installed',
            'prompt' => 'PEAR documentation directory',
            'group' => 'File Locations',
            ),
        'bin_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_BIN_DIR,
            'doc' => 'directory where executables are installed',
            'prompt' => 'PEAR executables directory',
            'group' => 'File Locations',
            ),
        'data_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DATA_DIR,
            'doc' => 'directory where data files are installed',
            'prompt' => 'PEAR data directory',
            'group' => 'File Locations (Advanced)',
            ),
        'cfg_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_CFG_DIR,
            'doc' => 'directory where modifiable configuration files are installed',
            'prompt' => 'PEAR configuration file directory',
            'group' => 'File Locations (Advanced)',
            ),
        'www_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_WWW_DIR,
            'doc' => 'directory where www frontend files (html/js) are installed',
            'prompt' => 'PEAR www files directory',
            'group' => 'File Locations (Advanced)',
            ),
        'man_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_MAN_DIR,
            'doc' => 'directory where unix manual pages are installed',
            'prompt' => 'Systems manpage files directory',
            'group' => 'File Locations (Advanced)',
            ),
        'test_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_TEST_DIR,
            'doc' => 'directory where regression tests are installed',
            'prompt' => 'PEAR test directory',
            'group' => 'File Locations (Advanced)',
            ),
        'cache_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR,
            'doc' => 'directory which is used for web service cache',
            'prompt' => 'PEAR Installer cache directory',
            'group' => 'File Locations (Advanced)',
            ),
        'temp_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_TEMP_DIR,
            'doc' => 'directory which is used for all temp files',
            'prompt' => 'PEAR Installer temp directory',
            'group' => 'File Locations (Advanced)',
            ),
        'download_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR,
            'doc' => 'directory which is used for all downloaded files',
            'prompt' => 'PEAR Installer download directory',
            'group' => 'File Locations (Advanced)',
            ),
        'php_bin' => array(
            'type' => 'file',
            'default' => PEAR_CONFIG_DEFAULT_PHP_BIN,
            'doc' => 'PHP CLI/CGI binary for executing scripts',
            'prompt' => 'PHP CLI/CGI binary',
            'group' => 'File Locations (Advanced)',
            ),
        'php_prefix' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '--program-prefix for php_bin\'s ./configure, used for pecl installs',
            'prompt' => '--program-prefix passed to PHP\'s ./configure',
            'group' => 'File Locations (Advanced)',
            ),
        'php_suffix' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '--program-suffix for php_bin\'s ./configure, used for pecl installs',
            'prompt' => '--program-suffix passed to PHP\'s ./configure',
            'group' => 'File Locations (Advanced)',
            ),
        'php_ini' => array(
            'type' => 'file',
            'default' => '',
            'doc' => 'location of php.ini in which to enable PECL extensions on install',
            'prompt' => 'php.ini location',
            'group' => 'File Locations (Advanced)',
            ),
        'metadata_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR,
            'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)',
            'prompt' => 'PEAR metadata directory',
            'group' => 'File Locations (Advanced)',
            ),
        // Maintainers
        'username' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '(maintainers) your PEAR account name',
            'prompt' => 'PEAR username (for maintainers)',
            'group' => 'Maintainers',
            ),
        'password' => array(
            'type' => 'password',
            'default' => '',
            'doc' => '(maintainers) your PEAR account password',
            'prompt' => 'PEAR password (for maintainers)',
            'group' => 'Maintainers',
            ),
        // Advanced
        'verbose' => array(
            'type' => 'integer',
            'default' => PEAR_CONFIG_DEFAULT_VERBOSE,
            'doc' => 'verbosity level
0: really quiet
1: somewhat quiet
2: verbose
3: debug',
            'prompt' => 'Debug Log Level',
            'group' => 'Advanced',
            ),
        'preferred_state' => array(
            'type' => 'set',
            'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE,
            'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified',
            'valid_set' => array(
                'stable', 'beta', 'alpha', 'devel', 'snapshot'),
            'prompt' => 'Preferred Package State',
            'group' => 'Advanced',
            ),
        'umask' => array(
            'type' => 'mask',
            'default' => PEAR_CONFIG_DEFAULT_UMASK,
            'doc' => 'umask used when creating files (Unix-like systems only)',
            'prompt' => 'Unix file mask',
            'group' => 'Advanced',
            ),
        'cache_ttl' => array(
            'type' => 'integer',
            'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL,
            'doc' => 'amount of secs where the local cache is used and not updated',
            'prompt' => 'Cache TimeToLive',
            'group' => 'Advanced',
            ),
        'sig_type' => array(
            'type' => 'set',
            'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE,
            'doc' => 'which package signature mechanism to use',
            'valid_set' => array('gpg'),
            'prompt' => 'Package Signature Type',
            'group' => 'Maintainers',
            ),
        'sig_bin' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_SIG_BIN,
            'doc' => 'which package signature mechanism to use',
            'prompt' => 'Signature Handling Program',
            'group' => 'Maintainers',
            ),
        'sig_keyid' => array(
            'type' => 'string',
            'default' => '',
            'doc' => 'which key to use for signing with',
            'prompt' => 'Signature Key Id',
            'group' => 'Maintainers',
            ),
        'sig_keydir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR,
            'doc' => 'directory where signature keys are located',
            'prompt' => 'Signature Key Directory',
            'group' => 'Maintainers',
            ),
        // __channels is reserved - used for channel-specific configuration
        );

    /**
     * Constructor.
     *
     * @param string file to read user-defined options from
     * @param string file to read system-wide defaults from
     * @param bool   determines whether a registry object "follows"
     *               the value of php_dir (is automatically created
     *               and moved when php_dir is changed)
     * @param bool   if true, fails if configuration files cannot be loaded
     *
     * @access public
     *
     * @see PEAR_Config::singleton
     */
    function __construct($user_file = '', $system_file = '', $ftp_file = false,
                         $strict = true)
    {
        parent::__construct();
        PEAR_Installer_Role::initializeConfig($this);
        $sl = DIRECTORY_SEPARATOR;
        if (empty($user_file)) {
            if (OS_WINDOWS) {
                $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini';
            } else {
                $user_file = getenv('HOME') . $sl . '.pearrc';
            }
        }

        if (empty($system_file)) {
            $system_file = PEAR_CONFIG_SYSCONFDIR . $sl;
            if (OS_WINDOWS) {
                $system_file .= 'pearsys.ini';
            } else {
                $system_file .= 'pear.conf';
            }
        }

        $this->layers = array_keys($this->configuration);
        $this->files['user']   = $user_file;
        $this->files['system'] = $system_file;
        if ($user_file && file_exists($user_file)) {
            $this->pushErrorHandling(PEAR_ERROR_RETURN);
            $this->readConfigFile($user_file, 'user', $strict);
            $this->popErrorHandling();
            if ($this->_errorsFound > 0) {
                return;
            }
        }

        if ($system_file && @file_exists($system_file)) {
            $this->mergeConfigFile($system_file, false, 'system', $strict);
            if ($this->_errorsFound > 0) {
                return;
            }

        }

        if (!$ftp_file) {
            $ftp_file = $this->get('remote_config');
        }

        if ($ftp_file && defined('PEAR_REMOTEINSTALL_OK')) {
            $this->readFTPConfigFile($ftp_file);
        }

        foreach ($this->configuration_info as $key => $info) {
            $this->configuration['default'][$key] = $info['default'];
        }

        $this->_registry['default'] = new PEAR_Registry(
            $this->configuration['default']['php_dir'], false, false,
            $this->configuration['default']['metadata_dir']);
        $this->_registry['default']->setConfig($this, false);
        $this->_regInitialized['default'] = false;
        //$GLOBALS['_PEAR_Config_instance'] = &$this;
    }

    /**
     * Return the default locations of user and system configuration files
     */
    public static function getDefaultConfigFiles()
    {
        $sl = DIRECTORY_SEPARATOR;
        if (OS_WINDOWS) {
            return array(
                'user'   => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini',
                'system' =>  PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'
            );
        }

        return array(
            'user'   => getenv('HOME') . $sl . '.pearrc',
            'system' => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'
        );
    }

    /**
     * Static singleton method.  If you want to keep only one instance
     * of this class in use, this method will give you a reference to
     * the last created PEAR_Config object if one exists, or create a
     * new object.
     *
     * @param string (optional) file to read user-defined options from
     * @param string (optional) file to read system-wide defaults from
     *
     * @return object an existing or new PEAR_Config instance
     *
     * @see PEAR_Config::PEAR_Config
     */
    public static function &singleton($user_file = '', $system_file = '', $strict = true)
    {
        if (is_object($GLOBALS['_PEAR_Config_instance'])) {
            return $GLOBALS['_PEAR_Config_instance'];
        }

        $t_conf = new PEAR_Config($user_file, $system_file, false, $strict);
        if ($t_conf->_errorsFound > 0) {
             return $t_conf->_lastError;
        }

        $GLOBALS['_PEAR_Config_instance'] = &$t_conf;
        return $GLOBALS['_PEAR_Config_instance'];
    }

    /**
     * Determine whether any configuration files have been detected, and whether a
     * registry object can be retrieved from this configuration.
     * @return bool
     * @since PEAR 1.4.0a1
     */
    function validConfiguration()
    {
        if ($this->isDefinedLayer('user') || $this->isDefinedLayer('system')) {
            return true;
        }

        return false;
    }

    /**
     * Reads configuration data from a file.  All existing values in
     * the config layer are discarded and replaced with data from the
     * file.
     * @param string file to read from, if NULL or not specified, the
     *               last-used file for the same layer (second param) is used
     * @param string config layer to insert data into ('user' or 'system')
     * @return bool TRUE on success or a PEAR error on failure
     */
    function readConfigFile($file = null, $layer = 'user', $strict = true)
    {
        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config layer `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = $this->_readConfigDataFrom($file);
        if (PEAR::isError($data)) {
            if (!$strict) {
                return true;
            }

            $this->_errorsFound++;
            $this->_lastError = $data;

            return $data;
        }

        $this->files[$layer] = $file;
        $this->_decodeInput($data);
        $this->configuration[$layer] = $data;
        $this->_setupChannels();
        if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) {
            $this->_registry[$layer] = new PEAR_Registry(
                $phpdir, false, false,
                $this->get('metadata_dir', $layer, 'pear.php.net'));
            $this->_registry[$layer]->setConfig($this, false);
            $this->_regInitialized[$layer] = false;
        } else {
            unset($this->_registry[$layer]);
        }
        return true;
    }

    /**
     * @param string url to the remote config file, like ftp://www.example.com/pear/config.ini
     * @return true|PEAR_Error
     */
    function readFTPConfigFile($path)
    {
        do { // poor man's try
            if (!class_exists('PEAR_FTP')) {
                if (!class_exists('PEAR_Common')) {
                    require_once 'PEAR/Common.php';
                }
                if (PEAR_Common::isIncludeable('PEAR/FTP.php')) {
                    require_once 'PEAR/FTP.php';
                }
            }

            if (!class_exists('PEAR_FTP')) {
                return PEAR::raiseError('PEAR_RemoteInstaller must be installed to use remote config');
            }

            $this->_ftp = new PEAR_FTP;
            $this->_ftp->pushErrorHandling(PEAR_ERROR_RETURN);
            $e = $this->_ftp->init($path);
            if (PEAR::isError($e)) {
                $this->_ftp->popErrorHandling();
                return $e;
            }

            $tmp = System::mktemp('-d');
            PEAR_Common::addTempFile($tmp);
            $e = $this->_ftp->get(basename($path), $tmp . DIRECTORY_SEPARATOR .
                'pear.ini', false, FTP_BINARY);
            if (PEAR::isError($e)) {
                $this->_ftp->popErrorHandling();
                return $e;
            }

            PEAR_Common::addTempFile($tmp . DIRECTORY_SEPARATOR . 'pear.ini');
            $this->_ftp->disconnect();
            $this->_ftp->popErrorHandling();
            $this->files['ftp'] = $tmp . DIRECTORY_SEPARATOR . 'pear.ini';
            $e = $this->readConfigFile(null, 'ftp');
            if (PEAR::isError($e)) {
                return $e;
            }

            $fail = array();
            foreach ($this->configuration_info as $key => $val) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    // any directory configs must be set for this to work
                    if (!isset($this->configuration['ftp'][$key])) {
                        $fail[] = $key;
                    }
                }
            }

            if (!count($fail)) {
                return true;
            }

            $fail = '"' . implode('", "', $fail) . '"';
            unset($this->files['ftp']);
            unset($this->configuration['ftp']);
            return PEAR::raiseError('ERROR: Ftp configuration file must set all ' .
                'directory configuration variables.  These variables were not set: ' .
                $fail);
        } while (false); // poor man's catch
        unset($this->files['ftp']);
        return PEAR::raiseError('no remote host specified');
    }

    /**
     * Reads the existing configurations and creates the _channels array from it
     */
    function _setupChannels()
    {
        $set = array_flip(array_values($this->_channels));
        foreach ($this->configuration as $layer => $data) {
            $i = 1000;
            if (isset($data['__channels']) && is_array($data['__channels'])) {
                foreach ($data['__channels'] as $channel => $info) {
                    $set[$channel] = $i++;
                }
            }
        }
        $this->_channels = array_values(array_flip($set));
        $this->setChannels($this->_channels);
    }

    function deleteChannel($channel)
    {
        $ch = strtolower($channel);
        foreach ($this->configuration as $layer => $data) {
            if (isset($data['__channels']) && isset($data['__channels'][$ch])) {
                unset($this->configuration[$layer]['__channels'][$ch]);
            }
        }

        $this->_channels = array_flip($this->_channels);
        unset($this->_channels[$ch]);
        $this->_channels = array_flip($this->_channels);
    }

    /**
     * Merges data into a config layer from a file.  Does the same
     * thing as readConfigFile, except it does not replace all
     * existing values in the config layer.
     * @param string file to read from
     * @param bool whether to overwrite existing data (default TRUE)
     * @param string config layer to insert data into ('user' or 'system')
     * @param string if true, errors are returned if file opening fails
     * @return bool TRUE on success or a PEAR error on failure
     */
    function mergeConfigFile($file, $override = true, $layer = 'user', $strict = true)
    {
        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config layer `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = $this->_readConfigDataFrom($file);
        if (PEAR::isError($data)) {
            if (!$strict) {
                return true;
            }

            $this->_errorsFound++;
            $this->_lastError = $data;

            return $data;
        }

        $this->_decodeInput($data);
        if ($override) {
            $this->configuration[$layer] =
                PEAR_Config::arrayMergeRecursive($this->configuration[$layer], $data);
        } else {
            $this->configuration[$layer] =
                PEAR_Config::arrayMergeRecursive($data, $this->configuration[$layer]);
        }

        $this->_setupChannels();
        if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) {
            $this->_registry[$layer] = new PEAR_Registry(
                $phpdir, false, false,
                $this->get('metadata_dir', $layer, 'pear.php.net'));
            $this->_registry[$layer]->setConfig($this, false);
            $this->_regInitialized[$layer] = false;
        } else {
            unset($this->_registry[$layer]);
        }
        return true;
    }

    /**
     * @param array
     * @param array
     * @return array
     */
    public static function arrayMergeRecursive($arr2, $arr1)
    {
        $ret = array();
        foreach ($arr2 as $key => $data) {
            if (!isset($arr1[$key])) {
                $ret[$key] = $data;
                unset($arr1[$key]);
                continue;
            }
            if (is_array($data)) {
                if (!is_array($arr1[$key])) {
                    $ret[$key] = $arr1[$key];
                    unset($arr1[$key]);
                    continue;
                }
                $ret[$key] = PEAR_Config::arrayMergeRecursive($arr1[$key], $arr2[$key]);
                unset($arr1[$key]);
            }
        }

        return array_merge($ret, $arr1);
    }

    /**
     * Writes data into a config layer from a file.
     *
     * @param string|null file to read from, or null for default
     * @param string config layer to insert data into ('user' or
     *               'system')
     * @param string|null data to write to config file or null for internal data [DEPRECATED]
     * @return bool TRUE on success or a PEAR error on failure
     */
    function writeConfigFile($file = null, $layer = 'user', $data = null)
    {
        $this->_lazyChannelSetup($layer);
        if ($layer == 'both' || $layer == 'all') {
            foreach ($this->files as $type => $file) {
                $err = $this->writeConfigFile($file, $type, $data);
                if (PEAR::isError($err)) {
                    return $err;
                }
            }
            return true;
        }

        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config file type `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = ($data === null) ? $this->configuration[$layer] : $data;
        $this->_encodeOutput($data);
        $opt = array('-p', dirname($file));
        if (!@System::mkDir($opt)) {
            return $this->raiseError("could not create directory: " . dirname($file));
        }

        if (file_exists($file) && is_file($file) && !is_writeable($file)) {
            return $this->raiseError("no write access to $file!");
        }

        $fp = @fopen($file, "w");
        if (!$fp) {
            return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed ($php_errormsg)");
        }

        $contents = "#PEAR_Config 0.9\n" . serialize($data);
        if (!@fwrite($fp, $contents)) {
            return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed ($php_errormsg)");
        }
        return true;
    }

    /**
     * Reads configuration data from a file and returns the parsed data
     * in an array.
     *
     * @param string file to read from
     * @return array configuration data or a PEAR error on failure
     * @access private
     */
    function _readConfigDataFrom($file)
    {
        $fp = false;
        if (file_exists($file)) {
            $fp = @fopen($file, "r");
        }

        if (!$fp) {
            return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed");
        }

        $size = filesize($file);
        fclose($fp);
        $contents = file_get_contents($file);
        if (empty($contents)) {
            return $this->raiseError('Configuration file "' . $file . '" is empty');
        }

        $version = false;
        if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) {
            $version = $matches[1];
            $contents = substr($contents, strlen($matches[0]));
        } else {
            // Museum config file
            if (substr($contents,0,2) == 'a:') {
                $version = '0.1';
            }
        }

        if ($version && version_compare("$version", '1', '<')) {
            $data = @unserialize($contents);

            if (!is_array($data) && !$data) {
                if ($contents == serialize(false)) {
                    $data = array();
                } else {
                    $err = $this->raiseError("PEAR_Config: bad data in $file");
                    return $err;
                }
            }
            if (!is_array($data)) {
                if (strlen(trim($contents)) > 0) {
                    $error = "PEAR_Config: bad data in $file";
                    $err = $this->raiseError($error);
                    return $err;
                }

                $data = array();
            }
        // add parsing of newer formats here...
        } else {
            $err = $this->raiseError("$file: unknown version `$version'");
            return $err;
        }

        return $data;
    }

    /**
    * Gets the file used for storing the config for a layer
    *
    * @param string $layer 'user' or 'system'
    */
    function getConfFile($layer)
    {
        return $this->files[$layer];
    }

    /**
     * @param string Configuration class name, used for detecting duplicate calls
     * @param array information on a role as parsed from its xml file
     * @return true|PEAR_Error
     * @access private
     */
    function _addConfigVars($class, $vars)
    {
        static $called = array();
        if (isset($called[$class])) {
            return;
        }

        $called[$class] = 1;
        if (count($vars) > 3) {
            return $this->raiseError('Roles can only define 3 new config variables or less');
        }

        foreach ($vars as $name => $var) {
            if (!is_array($var)) {
                return $this->raiseError('Configuration information must be an array');
            }

            if (!isset($var['type'])) {
                return $this->raiseError('Configuration information must contain a type');
            } elseif (!in_array($var['type'],
                    array('string', 'mask', 'password', 'directory', 'file', 'set'))) {
                  return $this->raiseError(
                      'Configuration type must be one of directory, file, string, ' .
                      'mask, set, or password');
            }
            if (!isset($var['default'])) {
                return $this->raiseError(
                    'Configuration information must contain a default value ("default" index)');
            }

            if (is_array($var['default'])) {
                $real_default = '';
                foreach ($var['default'] as $config_var => $val) {
                    if (strpos($config_var, 'text') === 0) {
                        $real_default .= $val;
                    } elseif (strpos($config_var, 'constant') === 0) {
                        if (!defined($val)) {
                            return $this->raiseError(
                                'Unknown constant "' . $val . '" requested in ' .
                                'default value for configuration variable "' .
                                $name . '"');
                        }

                        $real_default .= constant($val);
                    } elseif (isset($this->configuration_info[$config_var])) {
                        $real_default .=
                            $this->configuration_info[$config_var]['default'];
                    } else {
                        return $this->raiseError(
                            'Unknown request for "' . $config_var . '" value in ' .
                            'default value for configuration variable "' .
                            $name . '"');
                    }
                }
                $var['default'] = $real_default;
            }

            if ($var['type'] == 'integer') {
                $var['default'] = (integer) $var['default'];
            }

            if (!isset($var['doc'])) {
                return $this->raiseError(
                    'Configuration information must contain a summary ("doc" index)');
            }

            if (!isset($var['prompt'])) {
                return $this->raiseError(
                    'Configuration information must contain a simple prompt ("prompt" index)');
            }

            if (!isset($var['group'])) {
                return $this->raiseError(
                    'Configuration information must contain a simple group ("group" index)');
            }

            if (isset($this->configuration_info[$name])) {
                return $this->raiseError('Configuration variable "' . $name .
                    '" already exists');
            }

            $this->configuration_info[$name] = $var;
            // fix bug #7351: setting custom config variable in a channel fails
            $this->_channelConfigInfo[] = $name;
        }

        return true;
    }

    /**
     * Encodes/scrambles configuration data before writing to files.
     * Currently, 'password' values will be base64-encoded as to avoid
     * that people spot cleartext passwords by accident.
     *
     * @param array (reference) array to encode values in
     * @return bool TRUE on success
     * @access private
     */
    function _encodeOutput(&$data)
    {
        foreach ($data as $key => $value) {
            if ($key == '__channels') {
                foreach ($data['__channels'] as $channel => $blah) {
                    $this->_encodeOutput($data['__channels'][$channel]);
                }
            }

            if (!isset($this->configuration_info[$key])) {
                continue;
            }

            $type = $this->configuration_info[$key]['type'];
            switch ($type) {
                // we base64-encode passwords so they are at least
                // not shown in plain by accident
                case 'password': {
                    $data[$key] = base64_encode($data[$key]);
                    break;
                }
                case 'mask': {
                    $data[$key] = octdec($data[$key]);
                    break;
                }
            }
        }

        return true;
    }

    /**
     * Decodes/unscrambles configuration data after reading from files.
     *
     * @param array (reference) array to encode values in
     * @return bool TRUE on success
     * @access private
     *
     * @see PEAR_Config::_encodeOutput
     */
    function _decodeInput(&$data)
    {
        if (!is_array($data)) {
            return true;
        }

        foreach ($data as $key => $value) {
            if ($key == '__channels') {
                foreach ($data['__channels'] as $channel => $blah) {
                    $this->_decodeInput($data['__channels'][$channel]);
                }
            }

            if (!isset($this->configuration_info[$key])) {
                continue;
            }

            $type = $this->configuration_info[$key]['type'];
            switch ($type) {
                case 'password': {
                    $data[$key] = base64_decode($data[$key]);
                    break;
                }
                case 'mask': {
                    $data[$key] = decoct($data[$key]);
                    break;
                }
            }
        }

        return true;
    }

    /**
     * Retrieve the default channel.
     *
     * On startup, channels are not initialized, so if the default channel is not
     * pear.php.net, then initialize the config.
     * @param string registry layer
     * @return string|false
     */
    function getDefaultChannel($layer = null)
    {
        $ret = false;
        if ($layer === null) {
            foreach ($this->layers as $layer) {
                if (isset($this->configuration[$layer]['default_channel'])) {
                    $ret = $this->configuration[$layer]['default_channel'];
                    break;
                }
            }
        } elseif (isset($this->configuration[$layer]['default_channel'])) {
            $ret = $this->configuration[$layer]['default_channel'];
        }

        if ($ret == 'pear.php.net' && defined('PEAR_RUNTYPE') && PEAR_RUNTYPE == 'pecl') {
            $ret = 'pecl.php.net';
        }

        if ($ret) {
            if ($ret != 'pear.php.net') {
                $this->_lazyChannelSetup();
            }

            return $ret;
        }

        return PEAR_CONFIG_DEFAULT_CHANNEL;
    }

    /**
     * Returns a configuration value, prioritizing layers as per the
     * layers property.
     *
     * @param string config key
     * @return mixed the config value, or NULL if not found
     * @access public
     */
    function get($key, $layer = null, $channel = false)
    {
        if (!isset($this->configuration_info[$key])) {
            return null;
        }

        if ($key == '__channels') {
            return null;
        }

        if ($key == 'default_channel') {
            return $this->getDefaultChannel($layer);
        }

        if (!$channel) {
            $channel = $this->getDefaultChannel();
        } elseif ($channel != 'pear.php.net') {
            $this->_lazyChannelSetup();
        }
        $channel = strtolower($channel);

        $test = (in_array($key, $this->_channelConfigInfo)) ?
            $this->_getChannelValue($key, $layer, $channel) :
            null;
        if ($test !== null) {
            if ($this->_installRoot) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    return $this->_prependPath($test, $this->_installRoot);
                }
            }
            return $test;
        }

        if ($layer === null) {
            foreach ($this->layers as $layer) {
                if (isset($this->configuration[$layer][$key])) {
                    $test = $this->configuration[$layer][$key];
                    if ($this->_installRoot) {
                        if (in_array($this->getGroup($key),
                              array('File Locations', 'File Locations (Advanced)')) &&
                              $this->getType($key) == 'directory') {
                            return $this->_prependPath($test, $this->_installRoot);
                        }
                    }

                    if ($key == 'preferred_mirror') {
                        $reg = &$this->getRegistry();
                        if (is_object($reg)) {
                            $chan = $reg->getChannel($channel);
                            if (PEAR::isError($chan)) {
                                return $channel;
                            }

                            if (!$chan->getMirror($test) && $chan->getName() != $test) {
                                return $channel; // mirror does not exist
                            }
                        }
                    }
                    return $test;
                }
            }
        } elseif (isset($this->configuration[$layer][$key])) {
            $test = $this->configuration[$layer][$key];
            if ($this->_installRoot) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    return $this->_prependPath($test, $this->_installRoot);
                }
            }

            if ($key == 'preferred_mirror') {
                $reg = &$this->getRegistry();
                if (is_object($reg)) {
                    $chan = $reg->getChannel($channel);
                    if (PEAR::isError($chan)) {
                        return $channel;
                    }

                    if (!$chan->getMirror($test) && $chan->getName() != $test) {
                        return $channel; // mirror does not exist
                    }
                }
            }

            return $test;
        }

        return null;
    }

    /**
     * Returns a channel-specific configuration value, prioritizing layers as per the
     * layers property.
     *
     * @param string config key
     * @return mixed the config value, or NULL if not found
     * @access private
     */
    function _getChannelValue($key, $layer, $channel)
    {
        if ($key == '__channels' || $channel == 'pear.php.net') {
            return null;
        }

        $ret = null;
        if ($layer === null) {
            foreach ($this->layers as $ilayer) {
                if (isset($this->configuration[$ilayer]['__channels'][$channel][$key])) {
                    $ret = $this->configuration[$ilayer]['__channels'][$channel][$key];
                    break;
                }
            }
        } elseif (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
            $ret = $this->configuration[$layer]['__channels'][$channel][$key];
        }

        if ($key != 'preferred_mirror') {
            return $ret;
        }


        if ($ret !== null) {
            $reg = &$this->getRegistry($layer);
            if (is_object($reg)) {
                $chan = $reg->getChannel($channel);
                if (PEAR::isError($chan)) {
                    return $channel;
                }

                if (!$chan->getMirror($ret) && $chan->getName() != $ret) {
                    return $channel; // mirror does not exist
                }
            }

            return $ret;
        }

        if ($channel != $this->getDefaultChannel($layer)) {
            return $channel; // we must use the channel name as the preferred mirror
                             // if the user has not chosen an alternate
        }

        return $this->getDefaultChannel($layer);
    }

    /**
     * Set a config value in a specific layer (defaults to 'user').
     * Enforces the types defined in the configuration_info array.  An
     * integer config variable will be cast to int, and a set config
     * variable will be validated against its legal values.
     *
     * @param string config key
     * @param string config value
     * @param string (optional) config layer
     * @param string channel to set this value for, or null for global value
     * @return bool TRUE on success, FALSE on failure
     */
    function set($key, $value, $layer = 'user', $channel = false)
    {
        if ($key == '__channels') {
            return false;
        }

        if (!isset($this->configuration[$layer])) {
            return false;
        }

        if ($key == 'default_channel') {
            // can only set this value globally
            $channel = 'pear.php.net';
            if ($value != 'pear.php.net') {
                $this->_lazyChannelSetup($layer);
            }
        }

        if ($key == 'preferred_mirror') {
            if ($channel == '__uri') {
                return false; // can't set the __uri pseudo-channel's mirror
            }

            $reg = &$this->getRegistry($layer);
            if (is_object($reg)) {
                $chan = $reg->getChannel($channel ? $channel : 'pear.php.net');
                if (PEAR::isError($chan)) {
                    return false;
                }

                if (!$chan->getMirror($value) && $chan->getName() != $value) {
                    return false; // mirror does not exist
                }
            }
        }

        if (!isset($this->configuration_info[$key])) {
            return false;
        }

        extract($this->configuration_info[$key]);
        switch ($type) {
            case 'integer':
                $value = (int)$value;
                break;
            case 'set': {
                // If a valid_set is specified, require the value to
                // be in the set.  If there is no valid_set, accept
                // any value.
                if ($valid_set) {
                    reset($valid_set);
                    if ((key($valid_set) === 0 && !in_array($value, $valid_set)) ||
                        (key($valid_set) !== 0 && empty($valid_set[$value])))
                    {
                        return false;
                    }
                }
                break;
            }
        }

        if (!$channel) {
            $channel = $this->get('default_channel', null, 'pear.php.net');
        }

        if (!in_array($channel, $this->_channels)) {
            $this->_lazyChannelSetup($layer);
            $reg = &$this->getRegistry($layer);
            if ($reg) {
                $channel = $reg->channelName($channel);
            }

            if (!in_array($channel, $this->_channels)) {
                return false;
            }
        }

        if ($channel != 'pear.php.net') {
            if (in_array($key, $this->_channelConfigInfo)) {
                $this->configuration[$layer]['__channels'][$channel][$key] = $value;
                return true;
            }

            return false;
        }

        if ($key == 'default_channel') {
            if (!isset($reg)) {
                $reg = &$this->getRegistry($layer);
                if (!$reg) {
                    $reg = &$this->getRegistry();
                }
            }

            if ($reg) {
                $value = $reg->channelName($value);
            }

            if (!$value) {
                return false;
            }
        }

        $this->configuration[$layer][$key] = $value;
        if ($key == 'php_dir' && !$this->_noRegistry) {
            if (!isset($this->_registry[$layer]) ||
                  $value != $this->_registry[$layer]->install_dir) {
                $this->_registry[$layer] = new PEAR_Registry($value);
                $this->_regInitialized[$layer] = false;
                $this->_registry[$layer]->setConfig($this, false);
            }
        }

        return true;
    }

    function _lazyChannelSetup($uselayer = false)
    {
        if ($this->_noRegistry) {
            return;
        }

        $merge = false;
        foreach ($this->_registry as $layer => $p) {
            if ($uselayer && $uselayer != $layer) {
                continue;
            }

            if (!$this->_regInitialized[$layer]) {
                if ($layer == 'default' && isset($this->_registry['user']) ||
                      isset($this->_registry['system'])) {
                    // only use the default registry if there are no alternatives
                    continue;
                }

                if (!is_object($this->_registry[$layer])) {
                    if ($phpdir = $this->get('php_dir', $layer, 'pear.php.net')) {
                        $this->_registry[$layer] = new PEAR_Registry(
                            $phpdir, false, false,
                            $this->get('metadata_dir', $layer, 'pear.php.net'));
                        $this->_registry[$layer]->setConfig($this, false);
                        $this->_regInitialized[$layer] = false;
                    } else {
                        unset($this->_registry[$layer]);
                        return;
                    }
                }

                $this->setChannels($this->_registry[$layer]->listChannels(), $merge);
                $this->_regInitialized[$layer] = true;
                $merge = true;
            }
        }
    }

    /**
     * Set the list of channels.
     *
     * This should be set via a call to {@link PEAR_Registry::listChannels()}
     * @param array
     * @param bool
     * @return bool success of operation
     */
    function setChannels($channels, $merge = false)
    {
        if (!is_array($channels)) {
            return false;
        }

        if ($merge) {
            $this->_channels = array_merge($this->_channels, $channels);
        } else {
            $this->_channels = $channels;
        }

        foreach ($channels as $channel) {
            $channel = strtolower($channel);
            if ($channel == 'pear.php.net') {
                continue;
            }

            foreach ($this->layers as $layer) {
                if (!isset($this->configuration[$layer]['__channels'])) {
                    $this->configuration[$layer]['__channels'] = array();
                }
                if (!isset($this->configuration[$layer]['__channels'][$channel])
                      || !is_array($this->configuration[$layer]['__channels'][$channel])) {
                    $this->configuration[$layer]['__channels'][$channel] = array();
                }
            }
        }

        return true;
    }

    /**
     * Get the type of a config value.
     *
     * @param string  config key
     *
     * @return string type, one of "string", "integer", "file",
     * "directory", "set" or "password".
     *
     * @access public
     *
     */
    function getType($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['type'];
        }
        return false;
    }

    /**
     * Get the documentation for a config value.
     *
     * @param string  config key
     * @return string documentation string
     *
     * @access public
     *
     */
    function getDocs($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['doc'];
        }

        return false;
    }

    /**
     * Get the short documentation for a config value.
     *
     * @param string  config key
     * @return string short documentation string
     *
     * @access public
     *
     */
    function getPrompt($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['prompt'];
        }

        return false;
    }

    /**
     * Get the parameter group for a config key.
     *
     * @param string  config key
     * @return string parameter group
     *
     * @access public
     *
     */
    function getGroup($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['group'];
        }

        return false;
    }

    /**
     * Get the list of parameter groups.
     *
     * @return array list of parameter groups
     *
     * @access public
     *
     */
    function getGroups()
    {
        $tmp = array();
        foreach ($this->configuration_info as $key => $info) {
            $tmp[$info['group']] = 1;
        }

        return array_keys($tmp);
    }

    /**
     * Get the list of the parameters in a group.
     *
     * @param string $group parameter group
     * @return array list of parameters in $group
     *
     * @access public
     *
     */
    function getGroupKeys($group)
    {
        $keys = array();
        foreach ($this->configuration_info as $key => $info) {
            if ($info['group'] == $group) {
                $keys[] = $key;
            }
        }

        return $keys;
    }

    /**
     * Get the list of allowed set values for a config value.  Returns
     * NULL for config values that are not sets.
     *
     * @param string  config key
     * @return array enumerated array of set values, or NULL if the
     *               config key is unknown or not a set
     *
     * @access public
     *
     */
    function getSetValues($key)
    {
        if (isset($this->configuration_info[$key]) &&
            isset($this->configuration_info[$key]['type']) &&
            $this->configuration_info[$key]['type'] == 'set')
        {
            $valid_set = $this->configuration_info[$key]['valid_set'];
            reset($valid_set);
            if (key($valid_set) === 0) {
                return $valid_set;
            }

            return array_keys($valid_set);
        }

        return null;
    }

    /**
     * Get all the current config keys.
     *
     * @return array simple array of config keys
     *
     * @access public
     */
    function getKeys()
    {
        $keys = array();
        foreach ($this->layers as $layer) {
            $test = $this->configuration[$layer];
            if (isset($test['__channels'])) {
                foreach ($test['__channels'] as $channel => $configs) {
                    $keys = array_merge($keys, $configs);
                }
            }

            unset($test['__channels']);
            $keys = array_merge($keys, $test);

        }
        return array_keys($keys);
    }

    /**
     * Remove the a config key from a specific config layer.
     *
     * @param string config key
     * @param string (optional) config layer
     * @param string (optional) channel (defaults to default channel)
     * @return bool TRUE on success, FALSE on failure
     *
     * @access public
     */
    function remove($key, $layer = 'user', $channel = null)
    {
        if ($channel === null) {
            $channel = $this->getDefaultChannel();
        }

        if ($channel !== 'pear.php.net') {
            if (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
                unset($this->configuration[$layer]['__channels'][$channel][$key]);
                return true;
            }
        }

        if (isset($this->configuration[$layer][$key])) {
            unset($this->configuration[$layer][$key]);
            return true;
        }

        return false;
    }

    /**
     * Temporarily remove an entire config layer.  USE WITH CARE!
     *
     * @param string config key
     * @param string (optional) config layer
     * @return bool TRUE on success, FALSE on failure
     *
     * @access public
     */
    function removeLayer($layer)
    {
        if (isset($this->configuration[$layer])) {
            $this->configuration[$layer] = array();
            return true;
        }

        return false;
    }

    /**
     * Stores configuration data in a layer.
     *
     * @param string config layer to store
     * @return bool TRUE on success, or PEAR error on failure
     *
     * @access public
     */
    function store($layer = 'user', $data = null)
    {
        return $this->writeConfigFile(null, $layer, $data);
    }

    /**
     * Tells what config layer that gets to define a key.
     *
     * @param string config key
     * @param boolean return the defining channel
     *
     * @return string|array the config layer, or an empty string if not found.
     *
     *         if $returnchannel, the return is an array array('layer' => layername,
     *         'channel' => channelname), or an empty string if not found
     *
     * @access public
     */
    function definedBy($key, $returnchannel = false)
    {
        foreach ($this->layers as $layer) {
            $channel = $this->getDefaultChannel();
            if ($channel !== 'pear.php.net') {
                if (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
                    if ($returnchannel) {
                        return array('layer' => $layer, 'channel' => $channel);
                    }
                    return $layer;
                }
            }

            if (isset($this->configuration[$layer][$key])) {
                if ($returnchannel) {
                    return array('layer' => $layer, 'channel' => 'pear.php.net');
                }
                return $layer;
            }
        }

        return '';
    }

    /**
     * Tells whether a given key exists as a config value.
     *
     * @param string config key
     * @return bool whether <config key> exists in this object
     *
     * @access public
     */
    function isDefined($key)
    {
        foreach ($this->layers as $layer) {
            if (isset($this->configuration[$layer][$key])) {
                return true;
            }
        }

        return false;
    }

    /**
     * Tells whether a given config layer exists.
     *
     * @param string config layer
     * @return bool whether <config layer> exists in this object
     *
     * @access public
     */
    function isDefinedLayer($layer)
    {
        return isset($this->configuration[$layer]);
    }

    /**
     * Returns the layers defined (except the 'default' one)
     *
     * @return array of the defined layers
     */
    function getLayers()
    {
        $cf = $this->configuration;
        unset($cf['default']);
        return array_keys($cf);
    }

    function apiVersion()
    {
        return '1.1';
    }

    /**
     * @return PEAR_Registry
     */
    function &getRegistry($use = null)
    {
        $layer = $use === null ? 'user' : $use;
        if (isset($this->_registry[$layer])) {
            return $this->_registry[$layer];
        } elseif ($use === null && isset($this->_registry['system'])) {
            return $this->_registry['system'];
        } elseif ($use === null && isset($this->_registry['default'])) {
            return $this->_registry['default'];
        } elseif ($use) {
            $a = false;
            return $a;
        }

        // only go here if null was passed in
        echo "CRITICAL ERROR: Registry could not be initialized from any value";
        exit(1);
    }

    /**
     * This is to allow customization like the use of installroot
     * @param PEAR_Registry
     * @return bool
     */
    function setRegistry(&$reg, $layer = 'user')
    {
        if ($this->_noRegistry) {
            return false;
        }

        if (!in_array($layer, array('user', 'system'))) {
            return false;
        }

        $this->_registry[$layer] = &$reg;
        if (is_object($reg)) {
            $this->_registry[$layer]->setConfig($this, false);
        }

        return true;
    }

    function noRegistry()
    {
        $this->_noRegistry = true;
    }

    /**
     * @return PEAR_REST
     */
    function &getREST($version, $options = array())
    {
        $version = str_replace('.', '', $version);
        if (!class_exists($class = 'PEAR_REST_' . $version)) {
            require_once 'PEAR/REST/' . $version . '.php';
        }

        $remote = new $class($this, $options);
        return $remote;
    }

    /**
     * The ftp server is set in {@link readFTPConfigFile()}.  It exists only if a
     * remote configuration file has been specified
     * @return PEAR_FTP|false
     */
    function &getFTP()
    {
        if (isset($this->_ftp)) {
            return $this->_ftp;
        }

        $a = false;
        return $a;
    }

    static function _prependPath($path, $prepend)
    {
        if (strlen($prepend) > 0) {
            if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) {
                if (preg_match('/^[a-z]:/i', $prepend)) {
                    $prepend = substr($prepend, 2);
                } elseif ($prepend[0] != '\\') {
                    $prepend = "\\$prepend";
                }
                $path = substr($path, 0, 2) . $prepend . substr($path, 2);
            } else {
                $path = $prepend . $path;
            }
        }
        return $path;
    }

    /**
     * @param string|false installation directory to prepend to all _dir variables, or false to
     *                     disable
     */
    function setInstallRoot($root)
    {
        if (substr($root, -1) == DIRECTORY_SEPARATOR) {
            $root = substr($root, 0, -1);
        }
        $old = $this->_installRoot;
        $this->_installRoot = $root;
        if (($old != $root) && !$this->_noRegistry) {
            foreach (array_keys($this->_registry) as $layer) {
                if ($layer == 'ftp' || !isset($this->_registry[$layer])) {
                    continue;
                }
                $this->_registry[$layer] =
                    new PEAR_Registry(
                        $this->get('php_dir', $layer, 'pear.php.net'), false, false,
                        $this->get('metadata_dir', $layer, 'pear.php.net'));
                $this->_registry[$layer]->setConfig($this, false);
                $this->_regInitialized[$layer] = false;
            }
        }
    }
}
pear/PEAR/REST/13.php000064400000035427151732710140007747 0ustar00<?php
/**
 * PEAR_REST_13
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a12
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';
require_once 'PEAR/REST/10.php';

/**
 * Implement REST 1.3
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a12
 */
class PEAR_REST_13 extends PEAR_REST_10
{
    /**
     * Retrieve information about a remote package to be downloaded from a REST server
     *
     * This is smart enough to resolve the minimum PHP version dependency prior to download
     * @param string $base The uri to prepend to all REST calls
     * @param array $packageinfo an array of format:
     * <pre>
     *  array(
     *   'package' => 'packagename',
     *   'channel' => 'channelname',
     *  ['state' => 'alpha' (or valid state),]
     *  -or-
     *  ['version' => '1.whatever']
     * </pre>
     * @param string $prefstate Current preferred_state config variable value
     * @param bool $installed the installed version of this package to compare against
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
     */
    function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases2.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        $skippedphp = false;
        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }

                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    if (!isset($this->_rest->_options['force']) &&
                          !isset($version) &&
                          version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    if (version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            }
        }

        if (!$found && $skippedphp) {
            $found = null;
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
    }

    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
                               $prefstate = 'stable', $installed = false, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $dependency['channel'];
        $package  = $dependency['name'];
        $state    = isset($dependency['state'])   ? $dependency['state']   : null;
        $version  = isset($dependency['version']) ? $dependency['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) .'/allreleases2.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
        }

        if (!is_array($info) || !isset($info['r'])) {
            return false;
        }

        $exclude = array();
        $min = $max = $recommended = false;
        if ($xsdversion == '1.0') {
            $pinfo['package'] = $dependency['name'];
            $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this
            switch ($dependency['rel']) {
                case 'ge' :
                    $min = $dependency['version'];
                break;
                case 'gt' :
                    $min = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'eq' :
                    $recommended = $dependency['version'];
                break;
                case 'lt' :
                    $max = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'le' :
                    $max = $dependency['version'];
                break;
                case 'ne' :
                    $exclude = array($dependency['version']);
                break;
            }
        } else {
            $pinfo['package'] = $dependency['name'];
            $min = isset($dependency['min']) ? $dependency['min'] : false;
            $max = isset($dependency['max']) ? $dependency['max'] : false;
            $recommended = isset($dependency['recommended']) ?
                $dependency['recommended'] : false;
            if (isset($dependency['exclude'])) {
                if (!isset($dependency['exclude'][0])) {
                    $exclude = array($dependency['exclude']);
                }
            }
        }

        $skippedphp = $found = $release = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (in_array($release['v'], $exclude)) { // skip excluded versions
                continue;
            }

            // allow newer releases to say "I'm OK with the dependent package"
            if ($xsdversion == '2.0' && isset($release['co'])) {
                if (!is_array($release['co']) || !isset($release['co'][0])) {
                    $release['co'] = array($release['co']);
                }

                foreach ($release['co'] as $entry) {
                    if (isset($entry['x']) && !is_array($entry['x'])) {
                        $entry['x'] = array($entry['x']);
                    } elseif (!isset($entry['x'])) {
                        $entry['x'] = array();
                    }

                    if ($entry['c'] == $deppackage['channel'] &&
                          strtolower($entry['p']) == strtolower($deppackage['package']) &&
                          version_compare($deppackage['version'], $entry['min'], '>=') &&
                          version_compare($deppackage['version'], $entry['max'], '<=') &&
                          !in_array($release['v'], $entry['x'])) {
                        if (version_compare($release['m'], phpversion(), '>')) {
                            // skip dependency releases that require a PHP version
                            // newer than our PHP version
                            $skippedphp = $release;
                            continue;
                        }

                        $recommended = $release['v'];
                        break;
                    }
                }
            }

            if ($recommended) {
                if ($release['v'] != $recommended) { // if we want a specific
                    // version, then skip all others
                    continue;
                }

                if (!in_array($release['s'], $states)) {
                    // the stability is too low, but we must return the
                    // recommended version if possible
                    return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
                }
            }

            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
                continue;
            }

            if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
                continue;
            }

            if ($installed && version_compare($release['v'], $installed, '<')) {
                continue;
            }

            if (in_array($release['s'], $states)) { // if in the preferred state...
                if (version_compare($release['m'], phpversion(), '>')) {
                    // skip dependency releases that require a PHP version
                    // newer than our PHP version
                    $skippedphp = $release;
                    continue;
                }

                $found = true; // ... then use it
                break;
            }
        }

        if (!$found && $skippedphp) {
            $found = null;
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
    }

    /**
     * List package upgrades but take the PHP version into account.
     */
    function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        foreach ($packagelist['p'] as $package) {
            if (!isset($installed[strtolower($package)])) {
                continue;
            }

            $inst_version = $reg->packageInfo($package, 'version', $channel);
            $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                '/allreleases2.xml', false, false, $channel);
            PEAR::popErrorHandling();
            if (PEAR::isError($info)) {
                continue; // no remote releases
            }

            if (!isset($info['r'])) {
                continue;
            }

            $release = $found = false;
            if (!is_array($info['r']) || !isset($info['r'][0])) {
                $info['r'] = array($info['r']);
            }

            // $info['r'] is sorted by version number
            usort($info['r'], array($this, '_sortReleasesByVersionNumber'));
            foreach ($info['r'] as $release) {
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
                    // not newer than the one installed
                    break;
                }
                if (version_compare($release['m'], phpversion(), '>')) {
                    // skip dependency releases that require a PHP version
                    // newer than our PHP version
                    continue;
                }

                // new version > installed version
                if (!$pref_state) {
                    // every state is a good state
                    $found = true;
                    break;
                } else {
                    $new_state = $release['s'];
                    // if new state >= installed state: go
                    if (in_array($new_state, $this->betterStates($inst_state, true))) {
                        $found = true;
                        break;
                    } else {
                        // only allow to lower the state of package,
                        // if new state >= preferred state: go
                        if (in_array($new_state, $this->betterStates($pref_state, true))) {
                            $found = true;
                            break;
                        }
                    }
                }
            }

            if (!$found) {
                continue;
            }

            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
                $release['v'] . '.xml', false, false, $channel);
            if (PEAR::isError($relinfo)) {
                return $relinfo;
            }

            $ret[$package] = array(
                'version'  => $release['v'],
                'state'    => $release['s'],
                'filesize' => $relinfo['f'],
            );
        }

        return $ret;
    }
}pear/PEAR/REST/11.php000064400000025751151732710140007744 0ustar00<?php
/**
 * PEAR_REST_11 - implement faster list-all/remote-list command
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.3
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';

/**
 * Implement REST 1.1
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.3
 */
class PEAR_REST_11
{
    /**
     * @var PEAR_REST
     */
    var $_rest;

    function __construct($config, $options = array())
    {
        $this->_rest = new PEAR_REST($config, $options);
    }

    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
    {
        $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
        if (PEAR::isError($categorylist)) {
            return $categorylist;
        }

        $ret = array();
        if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
            $categorylist['c'] = array($categorylist['c']);
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);

        foreach ($categorylist['c'] as $progress => $category) {
            $category = $category['_content'];
            $packagesinfo = $this->_rest->retrieveData($base .
                'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);

            if (PEAR::isError($packagesinfo)) {
                continue;
            }

            if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
                continue;
            }

            if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
                $packagesinfo['pi'] = array($packagesinfo['pi']);
            }

            foreach ($packagesinfo['pi'] as $packageinfo) {
                if (empty($packageinfo)) {
                    continue;
                }

                $info     = $packageinfo['p'];
                $package  = $info['n'];
                $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
                unset($latest);
                unset($unstable);
                unset($stable);
                unset($state);

                if ($releases) {
                    if (!isset($releases['r'][0])) {
                        $releases['r'] = array($releases['r']);
                    }

                    foreach ($releases['r'] as $release) {
                        if (!isset($latest)) {
                            if ($dostable && $release['s'] == 'stable') {
                                $latest = $release['v'];
                                $state = 'stable';
                            }
                            if (!$dostable) {
                                $latest = $release['v'];
                                $state = $release['s'];
                            }
                        }

                        if (!isset($stable) && $release['s'] == 'stable') {
                            $stable = $release['v'];
                            if (!isset($unstable)) {
                                $unstable = $stable;
                            }
                        }

                        if (!isset($unstable) && $release['s'] != 'stable') {
                            $unstable = $release['v'];
                            $state = $release['s'];
                        }

                        if (isset($latest) && !isset($state)) {
                            $state = $release['s'];
                        }

                        if (isset($latest) && isset($stable) && isset($unstable)) {
                            break;
                        }
                    }
                }

                if ($basic) { // remote-list command
                    if (!isset($latest)) {
                        $latest = false;
                    }

                    if ($dostable) {
                        // $state is not set if there are no releases
                        if (isset($state) && $state == 'stable') {
                            $ret[$package] = array('stable' => $latest);
                        } else {
                            $ret[$package] = array('stable' => '-n/a-');
                        }
                    } else {
                        $ret[$package] = array('stable' => $latest);
                    }

                    continue;
                }

                // list-all command
                if (!isset($unstable)) {
                    $unstable = false;
                    $state = 'stable';
                    if (isset($stable)) {
                        $latest = $unstable = $stable;
                    }
                } else {
                    $latest = $unstable;
                }

                if (!isset($latest)) {
                    $latest = false;
                }

                $deps = array();
                if ($latest && isset($packageinfo['deps'])) {
                    if (!is_array($packageinfo['deps']) ||
                          !isset($packageinfo['deps'][0])
                    ) {
                        $packageinfo['deps'] = array($packageinfo['deps']);
                    }

                    $d = false;
                    foreach ($packageinfo['deps'] as $dep) {
                        if ($dep['v'] == $latest) {
                            $d = unserialize($dep['d']);
                        }
                    }

                    if ($d) {
                        if (isset($d['required'])) {
                            if (!class_exists('PEAR_PackageFile_v2')) {
                                require_once 'PEAR/PackageFile/v2.php';
                            }

                            if (!isset($pf)) {
                                $pf = new PEAR_PackageFile_v2;
                            }

                            $pf->setDeps($d);
                            $tdeps = $pf->getDeps();
                        } else {
                            $tdeps = $d;
                        }

                        foreach ($tdeps as $dep) {
                            if ($dep['type'] !== 'pkg') {
                                continue;
                            }

                            $deps[] = $dep;
                        }
                    }
                }

                $info = array(
                    'stable'      => $latest,
                    'summary'     => $info['s'],
                    'description' => $info['d'],
                    'deps'        => $deps,
                    'category'    => $info['ca']['_content'],
                    'unstable'    => $unstable,
                    'state'       => $state
                );
                $ret[$package] = $info;
            }
        }

        PEAR::popErrorHandling();
        return $ret;
    }

    /**
     * List all categories of a REST server
     *
     * @param string $base base URL of the server
     * @return array of categorynames
     */
    function listCategories($base, $channel = false)
    {
        $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
        if (PEAR::isError($categorylist)) {
            return $categorylist;
        }

        if (!is_array($categorylist) || !isset($categorylist['c'])) {
            return array();
        }

        if (isset($categorylist['c']['_content'])) {
            // only 1 category
            $categorylist['c'] = array($categorylist['c']);
        }

        return $categorylist['c'];
    }

    /**
     * List packages in a category of a REST server
     *
     * @param string $base base URL of the server
     * @param string $category name of the category
     * @param boolean $info also download full package info
     * @return array of packagenames
     */
    function listCategory($base, $category, $info = false, $channel = false)
    {
        if ($info == false) {
            $url = '%s'.'c/%s/packages.xml';
        } else {
            $url = '%s'.'c/%s/packagesinfo.xml';
        }
        $url = sprintf($url,
                    $base,
                    urlencode($category));

        // gives '404 Not Found' error when category doesn't exist
        $packagelist = $this->_rest->retrieveData($url, false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }
        if (!is_array($packagelist)) {
            return array();
        }

        if ($info == false) {
            if (!isset($packagelist['p'])) {
                return array();
            }
            if (!is_array($packagelist['p']) ||
                !isset($packagelist['p'][0])) { // only 1 pkg
                $packagelist = array($packagelist['p']);
            } else {
                $packagelist = $packagelist['p'];
            }
            return $packagelist;
        }

        // info == true
        if (!isset($packagelist['pi'])) {
            return array();
        }

        if (!is_array($packagelist['pi']) ||
            !isset($packagelist['pi'][0])) { // only 1 pkg
            $packagelist_pre = array($packagelist['pi']);
        } else {
            $packagelist_pre = $packagelist['pi'];
        }

        $packagelist = array();
        foreach ($packagelist_pre as $i => $item) {
            // compatibility with r/<latest.txt>.xml
            if (isset($item['a']['r'][0])) {
                // multiple releases
                $item['p']['v'] = $item['a']['r'][0]['v'];
                $item['p']['st'] = $item['a']['r'][0]['s'];
            } elseif (isset($item['a'])) {
                // first and only release
                $item['p']['v'] = $item['a']['r']['v'];
                $item['p']['st'] = $item['a']['r']['s'];
            }

            $packagelist[$i] = array('attribs' => $item['p']['r'],
                                     '_content' => $item['p']['n'],
                                     'info' => $item['p']);
        }

        return $packagelist;
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }
        if ($include) {
            $i--;
        }
        return array_slice($states, $i + 1);
    }
}
?>
pear/PEAR/REST/10.php000064400000077621151732710140007746 0ustar00<?php
/**
 * PEAR_REST_10
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a12
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';

/**
 * Implement REST 1.0
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a12
 */
class PEAR_REST_10
{
    /**
     * @var PEAR_REST
     */
    var $_rest;
    function __construct($config, $options = array())
    {
        $this->_rest = new PEAR_REST($config, $options);
    }

    /**
     * Retrieve information about a remote package to be downloaded from a REST server
     *
     * @param string $base The uri to prepend to all REST calls
     * @param array $packageinfo an array of format:
     * <pre>
     *  array(
     *   'package' => 'packagename',
     *   'channel' => 'channelname',
     *  ['state' => 'alpha' (or valid state),]
     *  -or-
     *  ['version' => '1.whatever']
     * </pre>
     * @param string $prefstate Current preferred_state config variable value
     * @param bool $installed the installed version of this package to compare against
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
     */
    function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    $found = true;
                    break;
                }
                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    $found = true;
                    break;
                }
            }
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }

    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
                               $prefstate = 'stable', $installed = false, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $dependency['channel'];
        $package  = $dependency['name'];
        $state    = isset($dependency['state'])   ? $dependency['state']   : null;
        $version  = isset($dependency['version']) ? $dependency['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
        }

        if (!is_array($info) || !isset($info['r'])) {
            return false;
        }

        $exclude = array();
        $min = $max = $recommended = false;
        if ($xsdversion == '1.0') {
            switch ($dependency['rel']) {
                case 'ge' :
                    $min = $dependency['version'];
                break;
                case 'gt' :
                    $min = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'eq' :
                    $recommended = $dependency['version'];
                break;
                case 'lt' :
                    $max = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'le' :
                    $max = $dependency['version'];
                break;
                case 'ne' :
                    $exclude = array($dependency['version']);
                break;
            }
        } else {
            $min = isset($dependency['min']) ? $dependency['min'] : false;
            $max = isset($dependency['max']) ? $dependency['max'] : false;
            $recommended = isset($dependency['recommended']) ?
                $dependency['recommended'] : false;
            if (isset($dependency['exclude'])) {
                if (!isset($dependency['exclude'][0])) {
                    $exclude = array($dependency['exclude']);
                }
            }
        }
        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }
        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }
            if (in_array($release['v'], $exclude)) { // skip excluded versions
                continue;
            }
            // allow newer releases to say "I'm OK with the dependent package"
            if ($xsdversion == '2.0' && isset($release['co'])) {
                if (!is_array($release['co']) || !isset($release['co'][0])) {
                    $release['co'] = array($release['co']);
                }
                foreach ($release['co'] as $entry) {
                    if (isset($entry['x']) && !is_array($entry['x'])) {
                        $entry['x'] = array($entry['x']);
                    } elseif (!isset($entry['x'])) {
                        $entry['x'] = array();
                    }
                    if ($entry['c'] == $deppackage['channel'] &&
                          strtolower($entry['p']) == strtolower($deppackage['package']) &&
                          version_compare($deppackage['version'], $entry['min'], '>=') &&
                          version_compare($deppackage['version'], $entry['max'], '<=') &&
                          !in_array($release['v'], $entry['x'])) {
                        $recommended = $release['v'];
                        break;
                    }
                }
            }
            if ($recommended) {
                if ($release['v'] != $recommended) { // if we want a specific
                    // version, then skip all others
                    continue;
                } else {
                    if (!in_array($release['s'], $states)) {
                        // the stability is too low, but we must return the
                        // recommended version if possible
                        return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
                    }
                }
            }
            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
                continue;
            }
            if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
                continue;
            }
            if ($installed && version_compare($release['v'], $installed, '<')) {
                continue;
            }
            if (in_array($release['s'], $states)) { // if in the preferred state...
                $found = true; // ... then use it
                break;
            }
        }
        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }

    /**
     * Take raw data and return the array needed for processing a download URL
     *
     * @param string $base REST base uri
     * @param string $package Package name
     * @param array $release an array of format array('v' => version, 's' => state)
     *                       describing the release to download
     * @param array $info list of all releases as defined by allreleases.xml
     * @param bool|null $found determines whether the release was found or this is the next
     *                    best alternative.  If null, then versions were skipped because
     *                    of PHP dependency
     * @return array|PEAR_Error
     * @access private
     */
    function _returnDownloadURL($base, $package, $release, $info, $found, $phpversion = false, $channel = false)
    {
        if (!$found) {
            $release = $info['r'][0];
        }

        $packageLower = strtolower($package);
        $pinfo = $this->_rest->retrieveCacheFirst($base . 'p/' . $packageLower . '/' .
            'info.xml', false, false, $channel);
        if (PEAR::isError($pinfo)) {
            return PEAR::raiseError('Package "' . $package .
                '" does not have REST info xml available');
        }

        $releaseinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
            $release['v'] . '.xml', false, false, $channel);
        if (PEAR::isError($releaseinfo)) {
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
                '" does not have REST xml available');
        }

        $packagexml = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
            'deps.' . $release['v'] . '.txt', false, true, $channel);
        if (PEAR::isError($packagexml)) {
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
                '" does not have REST dependency information available');
        }

        $packagexml = unserialize($packagexml);
        if (!$packagexml) {
            $packagexml = array();
        }

        $allinfo = $this->_rest->retrieveData($base . 'r/' . $packageLower .
            '/allreleases.xml', false, false, $channel);
        if (PEAR::isError($allinfo)) {
            return $allinfo;
        }

        if (!is_array($allinfo['r']) || !isset($allinfo['r'][0])) {
            $allinfo['r'] = array($allinfo['r']);
        }

        $compatible = false;
        foreach ($allinfo['r'] as $release) {
            if ($release['v'] != $releaseinfo['v']) {
                continue;
            }

            if (!isset($release['co'])) {
                break;
            }

            $compatible = array();
            if (!is_array($release['co']) || !isset($release['co'][0])) {
                $release['co'] = array($release['co']);
            }

            foreach ($release['co'] as $entry) {
                $comp = array();
                $comp['name']    = $entry['p'];
                $comp['channel'] = $entry['c'];
                $comp['min']     = $entry['min'];
                $comp['max']     = $entry['max'];
                if (isset($entry['x']) && !is_array($entry['x'])) {
                    $comp['exclude'] = $entry['x'];
                }

                $compatible[] = $comp;
            }

            if (count($compatible) == 1) {
                $compatible = $compatible[0];
            }

            break;
        }

        $deprecated = false;
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
            if (is_array($pinfo['dp'])) {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']['_content']));
            } else {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']));
            }
        }

        $return = array(
            'version'    => $releaseinfo['v'],
            'info'       => $packagexml,
            'package'    => $releaseinfo['p']['_content'],
            'stability'  => $releaseinfo['st'],
            'compatible' => $compatible,
            'deprecated' => $deprecated,
        );

        if ($found) {
            $return['url'] = $releaseinfo['g'];
            return $return;
        }

        $return['php'] = $phpversion;
        return $return;
    }

    function listPackages($base, $channel = false)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return array();
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        return $packagelist['p'];
    }

    /**
     * List all categories of a REST server
     *
     * @param string $base base URL of the server
     * @return array of categorynames
     */
    function listCategories($base, $channel = false)
    {
        $categories = array();

        // c/categories.xml does not exist;
        // check for every package its category manually
        // This is SLOOOWWWW : ///
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            $ret = array();
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        foreach ($packagelist['p'] as $package) {
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
                if (PEAR::isError($inf)) {
                    PEAR::popErrorHandling();
                    return $inf;
                }
                $cat = $inf['ca']['_content'];
                if (!isset($categories[$cat])) {
                    $categories[$cat] = $inf['ca'];
                }
        }

        return array_values($categories);
    }

    /**
     * List a category of a REST server
     *
     * @param string $base base URL of the server
     * @param string $category name of the category
     * @param boolean $info also download full package info
     * @return array of packagenames
     */
    function listCategory($base, $category, $info = false, $channel = false)
    {
        // gives '404 Not Found' error when category doesn't exist
        $packagelist = $this->_rest->retrieveData($base.'c/'.urlencode($category).'/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return array();
        }

        if (!is_array($packagelist['p']) ||
            !isset($packagelist['p'][0])) { // only 1 pkg
            $packagelist = array($packagelist['p']);
        } else {
            $packagelist = $packagelist['p'];
        }

        if ($info == true) {
            // get individual package info
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($packagelist as $i => $packageitem) {
                $url = sprintf('%s'.'r/%s/latest.txt',
                        $base,
                        strtolower($packageitem['_content']));
                $version = $this->_rest->retrieveData($url, false, false, $channel);
                if (PEAR::isError($version)) {
                    break; // skipit
                }
                $url = sprintf('%s'.'r/%s/%s.xml',
                        $base,
                        strtolower($packageitem['_content']),
                        $version);
                $info = $this->_rest->retrieveData($url, false, false, $channel);
                if (PEAR::isError($info)) {
                    break; // skipit
                }
                $packagelist[$i]['info'] = $info;
            }
            PEAR::popErrorHandling();
        }

        return $packagelist;
    }


    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }
        if ($this->_rest->config->get('verbose') > 0) {
            $ui = &PEAR_Frontend::singleton();
            $ui->log('Retrieving data...0%', true);
        }
        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }
        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        // only search-packagename = quicksearch !
        if ($searchpackage && (!$searchsummary || empty($searchpackage))) {
            $newpackagelist = array();
            foreach ($packagelist['p'] as $package) {
                if (!empty($searchpackage) && stristr($package, $searchpackage) !== false) {
                    $newpackagelist[] = $package;
                }
            }
            $packagelist['p'] = $newpackagelist;
        }
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $next = .1;
        foreach ($packagelist['p'] as $progress => $package) {
            if ($this->_rest->config->get('verbose') > 0) {
                if ($progress / count($packagelist['p']) >= $next) {
                    if ($next == .5) {
                        $ui->log('50%', false);
                    } else {
                        $ui->log('.', false);
                    }
                    $next += .1;
                }
            }

            if ($basic) { // remote-list command
                if ($dostable) {
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                        '/stable.txt', false, false, $channel);
                } else {
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                        '/latest.txt', false, false, $channel);
                }
                if (PEAR::isError($latest)) {
                    $latest = false;
                }
                $info = array('stable' => $latest);
            } else { // list-all command
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
                if (PEAR::isError($inf)) {
                    PEAR::popErrorHandling();
                    return $inf;
                }
                if ($searchpackage) {
                    $found = (!empty($searchpackage) && stristr($package, $searchpackage) !== false);
                    if (!$found && !(isset($searchsummary) && !empty($searchsummary)
                        && (stristr($inf['s'], $searchsummary) !== false
                            || stristr($inf['d'], $searchsummary) !== false)))
                    {
                        continue;
                    };
                }
                $releases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                    '/allreleases.xml', false, false, $channel);
                if (PEAR::isError($releases)) {
                    continue;
                }
                if (!isset($releases['r'][0])) {
                    $releases['r'] = array($releases['r']);
                }
                unset($latest);
                unset($unstable);
                unset($stable);
                unset($state);
                foreach ($releases['r'] as $release) {
                    if (!isset($latest)) {
                        if ($dostable && $release['s'] == 'stable') {
                            $latest = $release['v'];
                            $state = 'stable';
                        }
                        if (!$dostable) {
                            $latest = $release['v'];
                            $state = $release['s'];
                        }
                    }
                    if (!isset($stable) && $release['s'] == 'stable') {
                        $stable = $release['v'];
                        if (!isset($unstable)) {
                            $unstable = $stable;
                        }
                    }
                    if (!isset($unstable) && $release['s'] != 'stable') {
                        $latest = $unstable = $release['v'];
                        $state = $release['s'];
                    }
                    if (isset($latest) && !isset($state)) {
                        $state = $release['s'];
                    }
                    if (isset($latest) && isset($stable) && isset($unstable)) {
                        break;
                    }
                }
                $deps = array();
                if (!isset($unstable)) {
                    $unstable = false;
                    $state = 'stable';
                    if (isset($stable)) {
                        $latest = $unstable = $stable;
                    }
                } else {
                    $latest = $unstable;
                }
                if (!isset($latest)) {
                    $latest = false;
                }
                if ($latest) {
                    $d = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
                        $latest . '.txt', false, false, $channel);
                    if (!PEAR::isError($d)) {
                        $d = unserialize($d);
                        if ($d) {
                            if (isset($d['required'])) {
                                if (!class_exists('PEAR_PackageFile_v2')) {
                                    require_once 'PEAR/PackageFile/v2.php';
                                }
                                if (!isset($pf)) {
                                    $pf = new PEAR_PackageFile_v2;
                                }
                                $pf->setDeps($d);
                                $tdeps = $pf->getDeps();
                            } else {
                                $tdeps = $d;
                            }
                            foreach ($tdeps as $dep) {
                                if ($dep['type'] !== 'pkg') {
                                    continue;
                                }
                                $deps[] = $dep;
                            }
                        }
                    }
                }
                if (!isset($stable)) {
                    $stable = '-n/a-';
                }
                if (!$searchpackage) {
                    $info = array('stable' => $latest, 'summary' => $inf['s'], 'description' =>
                        $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
                        'unstable' => $unstable, 'state' => $state);
                } else {
                    $info = array('stable' => $stable, 'summary' => $inf['s'], 'description' =>
                        $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
                        'unstable' => $unstable, 'state' => $state);
                }
            }
            $ret[$package] = $info;
        }
        PEAR::popErrorHandling();
        return $ret;
    }

    function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        foreach ($packagelist['p'] as $package) {
            if (!isset($installed[strtolower($package)])) {
                continue;
            }

            $inst_version = $reg->packageInfo($package, 'version', $channel);
            $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                '/allreleases.xml', false, false, $channel);
            PEAR::popErrorHandling();
            if (PEAR::isError($info)) {
                continue; // no remote releases
            }

            if (!isset($info['r'])) {
                continue;
            }

            $release = $found = false;
            if (!is_array($info['r']) || !isset($info['r'][0])) {
                $info['r'] = array($info['r']);
            }

            // $info['r'] is sorted by version number
            usort($info['r'], array($this, '_sortReleasesByVersionNumber'));
            foreach ($info['r'] as $release) {
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
                    // not newer than the one installed
                    break;
                }

                // new version > installed version
                if (!$pref_state) {
                    // every state is a good state
                    $found = true;
                    break;
                } else {
                    $new_state = $release['s'];
                    // if new state >= installed state: go
                    if (in_array($new_state, $this->betterStates($inst_state, true))) {
                        $found = true;
                        break;
                    } else {
                        // only allow to lower the state of package,
                        // if new state >= preferred state: go
                        if (in_array($new_state, $this->betterStates($pref_state, true))) {
                            $found = true;
                            break;
                        }
                    }
                }
            }

            if (!$found) {
                continue;
            }

            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
                $release['v'] . '.xml', false, false, $channel);
            if (PEAR::isError($relinfo)) {
                return $relinfo;
            }

            $ret[$package] = array(
                'version'  => $release['v'],
                'state'    => $release['s'],
                'filesize' => $relinfo['f'],
            );
        }

        return $ret;
    }

    function packageInfo($base, $package, $channel = false)
    {
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
        if (PEAR::isError($pinfo)) {
            PEAR::popErrorHandling();
            return PEAR::raiseError('Unknown package: "' . $package . '" in channel "' . $channel . '"' . "\n". 'Debug: ' .
                $pinfo->getMessage());
        }

        $releases = array();
        $allreleases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
            '/allreleases.xml', false, false, $channel);
        if (!PEAR::isError($allreleases)) {
            if (!class_exists('PEAR_PackageFile_v2')) {
                require_once 'PEAR/PackageFile/v2.php';
            }

            if (!is_array($allreleases['r']) || !isset($allreleases['r'][0])) {
                $allreleases['r'] = array($allreleases['r']);
            }

            $pf = new PEAR_PackageFile_v2;
            foreach ($allreleases['r'] as $release) {
                $ds = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
                    $release['v'] . '.txt', false, false, $channel);
                if (PEAR::isError($ds)) {
                    continue;
                }

                if (!isset($latest)) {
                    $latest = $release['v'];
                }

                $pf->setDeps(unserialize($ds));
                $ds = $pf->getDeps();
                $info = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package)
                    . '/' . $release['v'] . '.xml', false, false, $channel);

                if (PEAR::isError($info)) {
                    continue;
                }

                $releases[$release['v']] = array(
                    'doneby' => $info['m'],
                    'license' => $info['l'],
                    'summary' => $info['s'],
                    'description' => $info['d'],
                    'releasedate' => $info['da'],
                    'releasenotes' => $info['n'],
                    'state' => $release['s'],
                    'deps' => $ds ? $ds : array(),
                );
            }
        } else {
            $latest = '';
        }

        PEAR::popErrorHandling();
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
            if (is_array($pinfo['dp'])) {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']['_content']));
            } else {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']));
            }
        } else {
            $deprecated = false;
        }

        if (!isset($latest)) {
            $latest = '';
        }

        return array(
            'name' => $pinfo['n'],
            'channel' => $pinfo['c'],
            'category' => $pinfo['ca']['_content'],
            'stable' => $latest,
            'license' => $pinfo['l'],
            'summary' => $pinfo['s'],
            'description' => $pinfo['d'],
            'releases' => $releases,
            'deprecated' => $deprecated,
            );
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }

        if ($include) {
            $i--;
        }

        return array_slice($states, $i + 1);
    }

    /**
     * Sort releases by version number
     *
     * @access private
     */
    function _sortReleasesByVersionNumber($a, $b)
    {
        if (version_compare($a['v'], $b['v'], '=')) {
            return 0;
        }

        if (version_compare($a['v'], $b['v'], '>')) {
            return -1;
        }

        if (version_compare($a['v'], $b['v'], '<')) {
            return 1;
        }
    }
}
pear/PEAR/Builder.php000064400000044773151732710150010342 0ustar00<?php
/**
 * PEAR_Builder for building PHP extensions (PECL packages)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 *
 * TODO: log output parameters in PECL command line
 * TODO: msdev path in configuration
 */

/**
 * Needed for extending PEAR_Builder
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/PackageFile.php';
require_once 'System.php';

/**
 * Class to handle building (compiling) extensions.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since PHP 4.0.2
 * @see        http://pear.php.net/manual/en/core.ppm.pear-builder.php
 */
class PEAR_Builder extends PEAR_Common
{
    var $php_api_version = 0;
    var $zend_module_api_no = 0;
    var $zend_extension_api_no = 0;

    var $extensions_built = array();

    /**
     * @var string Used for reporting when it is not possible to pass function
     *             via extra parameter, e.g. log, msdevCallback
     */
    var $current_callback = null;

    // used for msdev builds
    var $_lastline = null;
    var $_firstline = null;

    /**
     * Parsed --configureoptions.
     *
     * @var mixed[]
     */
    var $_parsed_configure_options;

    /**
     * PEAR_Builder constructor.
     *
     * @param mixed[] $configureoptions
     * @param object $ui user interface object (instance of PEAR_Frontend_*)
     *
     * @access public
     */
    function __construct($configureoptions, &$ui)
    {
        parent::__construct();
        $this->setFrontendObject($ui);
        $this->_parseConfigureOptions($configureoptions);
    }

    /**
     * Parse --configureoptions string.
     *
     * @param string Options, in the form "X=1 Y=2 Z='there\'s always one'"
     */
    function _parseConfigureOptions($options)
    {
        $data = '<XML><PROPERTIES ' . $options . ' /></XML>';
        $parser = xml_parser_create('ISO-8859-1');
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_set_element_handler(
            $parser, array($this, '_parseConfigureOptionsStartElement'),
            array($this, '_parseConfigureOptionsEndElement'));
        xml_parse($parser, $data, true);
        xml_parser_free($parser);
    }

    /**
     * Handle element start.
     *
     * @see PEAR_Builder::_parseConfigureOptions()
     *
     * @param resource $parser
     * @param string $tagName
     * @param mixed[] $attribs
     */
    function _parseConfigureOptionsStartElement($parser, $tagName, $attribs)
    {
        if ($tagName !== 'PROPERTIES') {
            return;
        }
        $this->_parsed_configure_options = $attribs;
    }

    /**
     * Handle element end.
     *
     * @see PEAR_Builder::_parseConfigureOptions()
     *
     * @param resource
     * @param string $element
     */
    function _parseConfigureOptionsEndElement($parser, $element)
    {
    }

    /**
     * Build an extension from source on windows.
     * requires msdev
     */
    function _build_win32($descfile, $callback = null)
    {
        if (is_object($descfile)) {
            $pkg = $descfile;
            $descfile = $pkg->getPackageFile();
        } else {
            $pf = new PEAR_PackageFile($this->config, $this->debug);
            $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
        }
        $dir = dirname($descfile);
        $old_cwd = getcwd();

        if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
            return $this->raiseError("could not chdir to $dir");
        }

        // packages that were in a .tar have the packagefile in this directory
        $vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
        if (file_exists($dir) && is_dir($vdir)) {
            if (!chdir($vdir)) {
                return $this->raiseError("could not chdir to " . realpath($vdir));
            }

            $dir = getcwd();
        }

        $this->log(2, "building in $dir");

        $dsp = $pkg->getPackage().'.dsp';
        if (!file_exists("$dir/$dsp")) {
            return $this->raiseError("The DSP $dsp does not exist.");
        }
        // XXX TODO: make release build type configurable
        $command = 'msdev '.$dsp.' /MAKE "'.$pkg->getPackage(). ' - Release"';

        $err = $this->_runCommand($command, array(&$this, 'msdevCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        // figure out the build platform and type
        $platform = 'Win32';
        $buildtype = 'Release';
        if (preg_match('/.*?'.$pkg->getPackage().'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) {
            $platform = $matches[1];
            $buildtype = $matches[2];
        }

        if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/', $this->_lastline, $matches)) {
            if ($matches[2]) {
                // there were errors in the build
                return $this->raiseError("There were errors during compilation.");
            }
            $out = $matches[1];
        } else {
            return $this->raiseError("Did not understand the completion status returned from msdev.exe.");
        }

        // msdev doesn't tell us the output directory :/
        // open the dsp, find /out and use that directory
        $dsptext = join('', file($dsp));

        // this regex depends on the build platform and type having been
        // correctly identified above.
        $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'.
                    $pkg->getPackage().'\s-\s'.
                    $platform.'\s'.
                    $buildtype.'").*?'.
                    '\/out:"(.*?)"/is';

        if ($dsptext && preg_match($regex, $dsptext, $matches)) {
            // what we get back is a relative path to the output file itself.
            $outfile = realpath($matches[2]);
        } else {
            return $this->raiseError("Could not retrieve output information from $dsp.");
        }
        // realpath returns false if the file doesn't exist
        if ($outfile && copy($outfile, "$dir/$out")) {
            $outfile = "$dir/$out";
        }

        $built_files[] = array(
            'file' => "$outfile",
            'php_api' => $this->php_api_version,
            'zend_mod_api' => $this->zend_module_api_no,
            'zend_ext_api' => $this->zend_extension_api_no,
            );

        return $built_files;
    }
    // }}}

    // {{{ msdevCallback()
    function msdevCallback($what, $data)
    {
        if (!$this->_firstline)
            $this->_firstline = $data;
        $this->_lastline = $data;
        call_user_func($this->current_callback, $what, $data);
    }

    /**
     * @param string
     * @param string
     * @param array
     * @access private
     */
    function _harvestInstDir($dest_prefix, $dirname, &$built_files)
    {
        $d = opendir($dirname);
        if (!$d)
            return false;

        $ret = true;
        while (($ent = readdir($d)) !== false) {
            if ($ent[0] == '.')
                continue;

            $full = $dirname . DIRECTORY_SEPARATOR . $ent;
            if (is_dir($full)) {
                if (!$this->_harvestInstDir(
                        $dest_prefix . DIRECTORY_SEPARATOR . $ent,
                        $full, $built_files)) {
                    $ret = false;
                    break;
                }
            } else {
                $dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent;
                $built_files[] = array(
                        'file' => $full,
                        'dest' => $dest,
                        'php_api' => $this->php_api_version,
                        'zend_mod_api' => $this->zend_module_api_no,
                        'zend_ext_api' => $this->zend_extension_api_no,
                        );
            }
        }
        closedir($d);
        return $ret;
    }

    /**
     * Build an extension from source.  Runs "phpize" in the source
     * directory, but compiles in a temporary directory
     * (TMPDIR/pear-build-USER/PACKAGE-VERSION).
     *
     * @param string|PEAR_PackageFile_v* $descfile path to XML package description file, or
     *               a PEAR_PackageFile object
     *
     * @param mixed $callback callback function used to report output,
     * see PEAR_Builder::_runCommand for details
     *
     * @return array an array of associative arrays with built files,
     * format:
     * array( array( 'file' => '/path/to/ext.so',
     *               'php_api' => YYYYMMDD,
     *               'zend_mod_api' => YYYYMMDD,
     *               'zend_ext_api' => YYYYMMDD ),
     *        ... )
     *
     * @access public
     *
     * @see PEAR_Builder::_runCommand
     */
    function build($descfile, $callback = null)
    {
        if (preg_match('/(\\/|\\\\|^)([^\\/\\\\]+)?php([^\\/\\\\]+)?$/',
                       $this->config->get('php_bin'), $matches)) {
            if (isset($matches[2]) && strlen($matches[2]) &&
                trim($matches[2]) != trim($this->config->get('php_prefix'))) {
                $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
                           ' appears to have a prefix ' . $matches[2] . ', but' .
                           ' config variable php_prefix does not match');
            }

            if (isset($matches[3]) && strlen($matches[3]) &&
                trim($matches[3]) != trim($this->config->get('php_suffix'))) {
                $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
                           ' appears to have a suffix ' . $matches[3] . ', but' .
                           ' config variable php_suffix does not match');
            }
        }

        $this->current_callback = $callback;
        if (PEAR_OS == "Windows") {
            return $this->_build_win32($descfile, $callback);
        }

        if (PEAR_OS != 'Unix') {
            return $this->raiseError("building extensions not supported on this platform");
        }

        if (is_object($descfile)) {
            $pkg = $descfile;
            $descfile = $pkg->getPackageFile();
            if (is_a($pkg, 'PEAR_PackageFile_v1')) {
                $dir = dirname($descfile);
            } else {
                $dir = $pkg->_config->get('temp_dir') . '/' . $pkg->getName();
                // automatically delete at session end
                self::addTempFile($dir);
            }
        } else {
            $pf = new PEAR_PackageFile($this->config);
            $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
            $dir = dirname($descfile);
        }

        // Find config. outside of normal path - e.g. config.m4
        foreach (array_keys($pkg->getInstallationFileList()) as $item) {
          if (stristr(basename($item), 'config.m4') && dirname($item) != '.') {
            $dir .= DIRECTORY_SEPARATOR . dirname($item);
            break;
          }
        }

        $old_cwd = getcwd();
        if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
            return $this->raiseError("could not chdir to $dir");
        }

        $vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
        if (is_dir($vdir)) {
            chdir($vdir);
        }

        $dir = getcwd();
        $this->log(2, "building in $dir");
        $binDir = $this->config->get('bin_dir');
        if (!preg_match('@(^|:)' . preg_quote($binDir, '@') . '(:|$)@', getenv('PATH'))) {
            putenv('PATH=' . $binDir . ':' . getenv('PATH'));
        }
        $err = $this->_runCommand($this->config->get('php_prefix')
                                . "phpize" .
                                $this->config->get('php_suffix'),
                                array(&$this, 'phpizeCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        if (!$err) {
            return $this->raiseError("`phpize' failed");
        }

        // {{{ start of interactive part
        $configure_command = "$dir/configure";

        $phpConfigName = $this->config->get('php_prefix')
            . 'php-config'
            . $this->config->get('php_suffix');
        $phpConfigPath = System::which($phpConfigName);
        if ($phpConfigPath !== false) {
            $configure_command .= ' --with-php-config='
                . $phpConfigPath;
        }

        $configure_options = $pkg->getConfigureOptions();
        if ($configure_options) {
            foreach ($configure_options as $option) {
                $default = array_key_exists('default', $option) ? $option['default'] : null;
                if (array_key_exists($option['name'], $this->_parsed_configure_options)) {
                    $response = $this->_parsed_configure_options[$option['name']];
                } else {
                    list($response) = $this->ui->userDialog(
                            'build', [$option['prompt']], ['text'], [$default]);
                }
                if (substr($option['name'], 0, 5) === 'with-' &&
                    ($response === 'yes' || $response === 'autodetect')) {
                    $configure_command .= " --{$option['name']}";
                } else {
                    $configure_command .= " --{$option['name']}=".trim($response);
                }
            }
        }
        // }}} end of interactive part

        // FIXME make configurable
        if (!$user=getenv('USER')) {
            $user='defaultuser';
        }

        $tmpdir = $this->config->get('temp_dir');
        $build_basedir = System::mktemp(' -t "' . $tmpdir . '" -d "pear-build-' . $user . '"');
        $build_dir = "$build_basedir/$vdir";
        $inst_dir = "$build_basedir/install-$vdir";
        $this->log(1, "building in $build_dir");
        if (is_dir($build_dir)) {
            System::rm(array('-rf', $build_dir));
        }

        if (!System::mkDir(array('-p', $build_dir))) {
            return $this->raiseError("could not create build dir: $build_dir");
        }

        self::addTempFile($build_dir);
        if (!System::mkDir(array('-p', $inst_dir))) {
            return $this->raiseError("could not create temporary install dir: $inst_dir");
        }
        self::addTempFile($inst_dir);

        $make_command = getenv('MAKE') ? getenv('MAKE') : 'make';

        $to_run = array(
            $configure_command,
            $make_command,
            "$make_command INSTALL_ROOT=\"$inst_dir\" install",
            "find \"$inst_dir\" | xargs ls -dils"
            );
        if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) {
            return $this->raiseError("could not chdir to $build_dir");
        }
        putenv('PHP_PEAR_VERSION=1.10.16');
        foreach ($to_run as $cmd) {
            $err = $this->_runCommand($cmd, $callback);
            if (PEAR::isError($err)) {
                chdir($old_cwd);
                return $err;
            }
            if (!$err) {
                chdir($old_cwd);
                return $this->raiseError("`$cmd' failed");
            }
        }
        if (!($dp = opendir("modules"))) {
            chdir($old_cwd);
            return $this->raiseError("no `modules' directory found");
        }
        $built_files = array();
        $prefix = exec($this->config->get('php_prefix')
                        . "php-config" .
                       $this->config->get('php_suffix') . " --prefix");
        $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files);
        chdir($old_cwd);
        return $built_files;
    }

    /**
     * Message callback function used when running the "phpize"
     * program.  Extracts the API numbers used.  Ignores other message
     * types than "cmdoutput".
     *
     * @param string $what the type of message
     * @param mixed $data the message
     *
     * @return void
     *
     * @access public
     */
    function phpizeCallback($what, $data)
    {
        if ($what != 'cmdoutput') {
            return;
        }
        $this->log(1, rtrim($data));
        if (preg_match('/You should update your .aclocal.m4/', $data)) {
            return;
        }
        $matches = array();
        if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) {
            $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1]));
            $apino = (int)$matches[2];
            if (isset($this->$member)) {
                $this->$member = $apino;
                //$msg = sprintf("%-22s : %d", $matches[1], $apino);
                //$this->log(1, $msg);
            }
        }
    }

    /**
     * Run an external command, using a message callback to report
     * output.  The command will be run through popen and output is
     * reported for every line with a "cmdoutput" message with the
     * line string, including newlines, as payload.
     *
     * @param string $command the command to run
     *
     * @param mixed $callback (optional) function to use as message
     * callback
     *
     * @return bool whether the command was successful (exit code 0
     * means success, any other means failure)
     *
     * @access private
     */
    function _runCommand($command, $callback = null)
    {
        $this->log(1, "running: $command");
        $pp = popen("$command 2>&1", "r");
        if (!$pp) {
            return $this->raiseError("failed to run `$command'");
        }
        if ($callback && $callback[0]->debug == 1) {
            $olddbg = $callback[0]->debug;
            $callback[0]->debug = 2;
        }

        while ($line = fgets($pp, 1024)) {
            if ($callback) {
                call_user_func($callback, 'cmdoutput', $line);
            } else {
                $this->log(2, rtrim($line));
            }
        }
        if ($callback && isset($olddbg)) {
            $callback[0]->debug = $olddbg;
        }

        $exitcode = is_resource($pp) ? pclose($pp) : -1;
        return ($exitcode == 0);
    }

    function log($level, $msg, $append_crlf = true)
    {
        if ($this->current_callback) {
            if ($this->debug >= $level) {
                call_user_func($this->current_callback, 'output', $msg);
            }
            return;
        }
        return parent::log($level, $msg, $append_crlf);
    }
}
pear/PEAR/Validator/PECL.php000064400000004071151732710150011407 0ustar00<?php
/**
 * Channel Validator for the pecl.php.net channel
 *
 * PHP 4 and PHP 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a5
 */
/**
 * This is the parent class for all validators
 */
require_once 'PEAR/Validate.php';
/**
 * Channel Validator for the pecl.php.net channel
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a5
 */
class PEAR_Validator_PECL extends PEAR_Validate
{
    function validateVersion()
    {
        if ($this->_state == PEAR_VALIDATE_PACKAGING) {
            $version = $this->_packagexml->getVersion();
            $versioncomponents = explode('.', $version);
            $last = array_pop($versioncomponents);
            if (substr($last, 1, 2) == 'rc') {
                $this->_addFailure('version', 'Release Candidate versions must have ' .
                'upper-case RC, not lower-case rc');
                return false;
            }
        }
        return true;
    }

    function validatePackageName()
    {
        $ret = parent::validatePackageName();
        if ($this->_packagexml->getPackageType() == 'extsrc' ||
              $this->_packagexml->getPackageType() == 'zendextsrc') {
            if (strtolower($this->_packagexml->getPackage()) !=
                  strtolower($this->_packagexml->getProvidesExtension())) {
                $this->_addWarning('providesextension', 'package name "' .
                    $this->_packagexml->getPackage() . '" is different from extension name "' .
                    $this->_packagexml->getProvidesExtension() . '"');
            }
        }
        return $ret;
    }
}
?>pear/.filemap000064400000016541151732710150007122 0ustar00a:5:{s:3:"php";a:104:{s:15:"Archive/Tar.php";s:11:"archive_tar";s:18:"Console/Getopt.php";s:14:"console_getopt";s:12:"OS/Guess.php";s:4:"pear";s:27:"PEAR/ChannelFile/Parser.php";s:4:"pear";s:21:"PEAR/Command/Auth.xml";s:4:"pear";s:21:"PEAR/Command/Auth.php";s:4:"pear";s:22:"PEAR/Command/Build.xml";s:4:"pear";s:22:"PEAR/Command/Build.php";s:4:"pear";s:25:"PEAR/Command/Channels.xml";s:4:"pear";s:25:"PEAR/Command/Channels.php";s:4:"pear";s:23:"PEAR/Command/Common.php";s:4:"pear";s:23:"PEAR/Command/Config.xml";s:4:"pear";s:23:"PEAR/Command/Config.php";s:4:"pear";s:24:"PEAR/Command/Install.xml";s:4:"pear";s:24:"PEAR/Command/Install.php";s:4:"pear";s:23:"PEAR/Command/Mirror.xml";s:4:"pear";s:23:"PEAR/Command/Mirror.php";s:4:"pear";s:24:"PEAR/Command/Package.xml";s:4:"pear";s:24:"PEAR/Command/Package.php";s:4:"pear";s:23:"PEAR/Command/Pickle.xml";s:4:"pear";s:23:"PEAR/Command/Pickle.php";s:4:"pear";s:25:"PEAR/Command/Registry.xml";s:4:"pear";s:25:"PEAR/Command/Registry.php";s:4:"pear";s:23:"PEAR/Command/Remote.xml";s:4:"pear";s:23:"PEAR/Command/Remote.php";s:4:"pear";s:21:"PEAR/Command/Test.xml";s:4:"pear";s:21:"PEAR/Command/Test.php";s:4:"pear";s:27:"PEAR/Downloader/Package.php";s:4:"pear";s:21:"PEAR/Frontend/CLI.php";s:4:"pear";s:30:"PEAR/Installer/Role/Common.php";s:4:"pear";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"pear";s:28:"PEAR/Installer/Role/Data.xml";s:4:"pear";s:28:"PEAR/Installer/Role/Data.php";s:4:"pear";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Doc.php";s:4:"pear";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Ext.php";s:4:"pear";s:27:"PEAR/Installer/Role/Man.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Man.php";s:4:"pear";s:27:"PEAR/Installer/Role/Php.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Php.php";s:4:"pear";s:30:"PEAR/Installer/Role/Script.xml";s:4:"pear";s:30:"PEAR/Installer/Role/Script.php";s:4:"pear";s:27:"PEAR/Installer/Role/Src.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Src.php";s:4:"pear";s:28:"PEAR/Installer/Role/Test.xml";s:4:"pear";s:28:"PEAR/Installer/Role/Test.php";s:4:"pear";s:27:"PEAR/Installer/Role/Www.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Www.php";s:4:"pear";s:23:"PEAR/Installer/Role.php";s:4:"pear";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"pear";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"pear";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"pear";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"pear";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"pear";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"pear";s:23:"PEAR/PackageFile/v1.php";s:4:"pear";s:23:"PEAR/PackageFile/v2.php";s:4:"pear";s:16:"PEAR/REST/10.php";s:4:"pear";s:16:"PEAR/REST/11.php";s:4:"pear";s:16:"PEAR/REST/13.php";s:4:"pear";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"pear";s:24:"PEAR/Task/Replace/rw.php";s:4:"pear";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"pear";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"pear";s:20:"PEAR/Task/Common.php";s:4:"pear";s:31:"PEAR/Task/Postinstallscript.php";s:4:"pear";s:21:"PEAR/Task/Replace.php";s:4:"pear";s:21:"PEAR/Task/Unixeol.php";s:4:"pear";s:24:"PEAR/Task/Windowseol.php";s:4:"pear";s:23:"PEAR/Validator/PECL.php";s:4:"pear";s:16:"PEAR/Builder.php";s:4:"pear";s:20:"PEAR/ChannelFile.php";s:4:"pear";s:16:"PEAR/Command.php";s:4:"pear";s:15:"PEAR/Common.php";s:4:"pear";s:15:"PEAR/Config.php";s:4:"pear";s:21:"PEAR/DependencyDB.php";s:4:"pear";s:20:"PEAR/Dependency2.php";s:4:"pear";s:19:"PEAR/Downloader.php";s:4:"pear";s:19:"PEAR/ErrorStack.php";s:4:"pear";s:18:"PEAR/Exception.php";s:4:"pear";s:17:"PEAR/Frontend.php";s:4:"pear";s:18:"PEAR/Installer.php";s:4:"pear";s:20:"PEAR/PackageFile.php";s:4:"pear";s:17:"PEAR/Packager.php";s:4:"pear";s:14:"PEAR/Proxy.php";s:4:"pear";s:17:"PEAR/Registry.php";s:4:"pear";s:13:"PEAR/REST.php";s:4:"pear";s:16:"PEAR/RunTest.php";s:4:"pear";s:17:"PEAR/Validate.php";s:4:"pear";s:18:"PEAR/XMLParser.php";s:4:"pear";s:19:"scripts/pearcmd.php";s:4:"pear";s:19:"scripts/peclcmd.php";s:4:"pear";s:8:"PEAR.php";s:4:"pear";s:10:"System.php";s:4:"pear";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:16:"structures_graph";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:16:"structures_graph";s:25:"Structures/Graph/Node.php";s:16:"structures_graph";s:20:"Structures/Graph.php";s:16:"structures_graph";s:11:"XML/RPC.php";s:7:"xml_rpc";s:16:"XML/RPC/Dump.php";s:7:"xml_rpc";s:18:"XML/RPC/Server.php";s:7:"xml_rpc";s:12:"XML/Util.php";s:8:"xml_util";}s:3:"doc";a:8:{s:32:"archive_tar/docs/Archive_Tar.txt";s:11:"archive_tar";s:12:"pear/LICENSE";s:4:"pear";s:12:"pear/INSTALL";s:4:"pear";s:15:"pear/README.rst";s:4:"pear";s:69:"structures_graph/docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:16:"structures_graph";s:24:"structures_graph/LICENSE";s:16:"structures_graph";s:29:"xml_util/examples/example.php";s:8:"xml_util";s:30:"xml_util/examples/example2.php";s:8:"xml_util";}s:4:"test";a:40:{s:36:"console_getopt/tests/001-getopt.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug10557.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug11068.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug13140.phpt";s:14:"console_getopt";s:35:"structures_graph/tests/AllTests.php";s:16:"structures_graph";s:41:"structures_graph/tests/BasicGraphTest.php";s:16:"structures_graph";s:48:"structures_graph/tests/TopologicalSorterTest.php";s:16:"structures_graph";s:42:"structures_graph/tests/AcyclicTestTest.php";s:16:"structures_graph";s:33:"structures_graph/tests/helper.inc";s:16:"structures_graph";s:32:"xml_rpc/tests/actual-request.php";s:7:"xml_rpc";s:24:"xml_rpc/tests/allgot.inc";s:7:"xml_rpc";s:36:"xml_rpc/tests/empty-value-struct.php";s:7:"xml_rpc";s:29:"xml_rpc/tests/empty-value.php";s:7:"xml_rpc";s:24:"xml_rpc/tests/encode.php";s:7:"xml_rpc";s:29:"xml_rpc/tests/extra-lines.php";s:7:"xml_rpc";s:27:"xml_rpc/tests/protoport.php";s:7:"xml_rpc";s:27:"xml_rpc/tests/test_Dump.php";s:7:"xml_rpc";s:23:"xml_rpc/tests/types.php";s:7:"xml_rpc";s:36:"xml_util/tests/AbstractUnitTests.php";s:8:"xml_util";s:34:"xml_util/tests/ApiVersionTests.php";s:8:"xml_util";s:42:"xml_util/tests/AttributesToStringTests.php";s:8:"xml_util";s:41:"xml_util/tests/CollapseEmptyTagsTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateCDataSectionTests.php";s:8:"xml_util";s:37:"xml_util/tests/CreateCommentTests.php";s:8:"xml_util";s:40:"xml_util/tests/CreateEndElementTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateStartElementTests.php";s:8:"xml_util";s:33:"xml_util/tests/CreateTagTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateTagFromArrayTests.php";s:8:"xml_util";s:45:"xml_util/tests/GetDocTypeDeclarationTests.php";s:8:"xml_util";s:41:"xml_util/tests/GetXmlDeclarationTests.php";s:8:"xml_util";s:35:"xml_util/tests/IsValidNameTests.php";s:8:"xml_util";s:34:"xml_util/tests/RaiseErrorTests.php";s:8:"xml_util";s:39:"xml_util/tests/ReplaceEntitiesTests.php";s:8:"xml_util";s:39:"xml_util/tests/ReverseEntitiesTests.php";s:8:"xml_util";s:42:"xml_util/tests/SplitQualifiedNameTests.php";s:8:"xml_util";s:31:"xml_util/tests/Bug4950Tests.php";s:8:"xml_util";s:31:"xml_util/tests/Bug5392Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug18343Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug21177Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug21184Tests.php";s:8:"xml_util";}s:6:"script";a:3:{s:15:"scripts/pear.sh";s:4:"pear";s:18:"scripts/peardev.sh";s:4:"pear";s:15:"scripts/pecl.sh";s:4:"pear";}s:4:"data";a:2:{s:16:"pear/package.dtd";s:4:"pear";s:18:"pear/template.spec";s:4:"pear";}}pear/data/PEAR/template.spec000064400000003725151732710150011633 0ustar00Summary: PEAR: @summary@
Name: @rpm_package@
Version: @version@
Release: 1
License: @release_license@
Group: Development/Libraries
Source: http://@master_server@/get/@package@-%{version}.tgz
BuildRoot: %{_tmppath}/%{name}-root
URL: http://@master_server@/package/@package@
Prefix: %{_prefix}
BuildArchitectures: @arch@
@extra_headers@

%description
@description@

%prep
rm -rf %{buildroot}/*
%setup -c -T
# XXX Source files location is missing here in pear cmd
pear -v -c %{buildroot}/pearrc \
        -d php_dir=%{_libdir}/php/pear \
        -d doc_dir=/docs \
        -d bin_dir=%{_bindir} \
        -d data_dir=%{_libdir}/php/pear/data \
        -d test_dir=%{_libdir}/php/pear/tests \
        -d ext_dir=%{_libdir} \@extra_config@
        -s

%build
echo BuildRoot=%{buildroot}

%postun
# if refcount = 0 then package has been removed (not upgraded)
if [ "$1" -eq "0" ]; then
    pear uninstall --nodeps -r @possible_channel@@package@
    rm @rpm_xml_dir@/@package@.xml
fi


%post
# if refcount = 2 then package has been upgraded
if [ "$1" -ge "2" ]; then
    pear upgrade --nodeps -r @rpm_xml_dir@/@package@.xml
else
    pear install --nodeps -r @rpm_xml_dir@/@package@.xml
fi

%install
pear -c %{buildroot}/pearrc install --nodeps -R %{buildroot} \
        $RPM_SOURCE_DIR/@package@-%{version}.tgz
rm %{buildroot}/pearrc
rm %{buildroot}/%{_libdir}/php/pear/.filemap
rm %{buildroot}/%{_libdir}/php/pear/.lock
rm -rf %{buildroot}/%{_libdir}/php/pear/.registry
if [ "@doc_files@" != "" ]; then
     mv %{buildroot}/docs/@package@/* .
     rm -rf %{buildroot}/docs
fi
mkdir -p %{buildroot}@rpm_xml_dir@
tar -xzf $RPM_SOURCE_DIR/@package@-%{version}.tgz package@package2xml@.xml
cp -p package@package2xml@.xml %{buildroot}@rpm_xml_dir@/@package@.xml

#rm -rf %{buildroot}/*
#pear -q install -R %{buildroot} -n package@package2xml@.xml
#mkdir -p %{buildroot}@rpm_xml_dir@
#cp -p package@package2xml@.xml %{buildroot}@rpm_xml_dir@/@package@.xml

%files
    %defattr(-,root,root)
    %doc @doc_files@
    /
pear/data/PEAR/package.dtd000064400000006404151732710150011231 0ustar00<!--
     This is the PEAR package description, version 1.0.
     It should be used with the informal public identifier:

         "-//PHP Group//DTD PEAR Package 1.0//EN//XML"

     Copyright (c) 1997-2005 The PHP Group             


     This source file is subject to the New BSD License,
     that is bundled with this package in the file LICENSE, and is
     available at through the world-wide-web at
     http://opensource.org/licenses/bsd-license.php.
     If you did not receive a copy of the New BSD License and are unable to
     obtain it through the world-wide-web, please send a note to
     license@php.net so we can mail you a copy immediately.

     Authors:
         Stig S. Bakken <ssb@fast.no>
         Gregory Beaver <cellog@php.net>

  -->
<!ENTITY % NUMBER "CDATA">
<!ELEMENT package (name,summary,description,license?,maintainers,release,changelog?)>
<!ATTLIST package type    (source|binary|empty) "empty"
                  version CDATA                 #REQUIRED
                  packagerversion CDATA         #IMPLIED>

<!ELEMENT name (#PCDATA)>

<!ELEMENT summary (#PCDATA)>

<!ELEMENT license (#PCDATA)>

<!ELEMENT description (#PCDATA)>

<!ELEMENT maintainers (maintainer)+>

<!ELEMENT maintainer (user|role|name|email)+>

<!ELEMENT user (#PCDATA)>

<!ELEMENT role (#PCDATA)>

<!ELEMENT email (#PCDATA)>

<!ELEMENT changelog (release)+>

<!ELEMENT release (version,date,license,state,notes,warnings?,provides*,deps?,configureoptions?,filelist?)>

<!ELEMENT version (#PCDATA)>

<!ELEMENT date (#PCDATA)>

<!ELEMENT state (#PCDATA)>

<!ELEMENT notes (#PCDATA)>

<!ELEMENT warnings (#PCDATA)>

<!ELEMENT deps (dep*)>

<!ELEMENT dep (#PCDATA)>
<!ATTLIST dep type    (pkg|ext|php) #REQUIRED
	                       rel     (has|eq|lt|le|gt|ge)                          #IMPLIED
	                       version CDATA                                     #IMPLIED
	                       optional (yes|no)     'no'>

<!ELEMENT configureoptions (configureoption)+>

<!ELEMENT configureoption EMPTY>
<!ATTLIST configureoption name CDATA #REQUIRED
                                           default CDATA #IMPLIED
                                           prompt CDATA #REQUIRED>

<!ELEMENT provides EMPTY>
<!ATTLIST provides type (ext|prog|class|function|feature|api) #REQUIRED
                                name CDATA #REQUIRED
                                extends CDATA #IMPLIED>
<!ELEMENT filelist (dir|file)+>

<!ELEMENT dir (dir|file)+>
<!ATTLIST dir name           CDATA #REQUIRED
              role           (php|ext|src|test|doc|data|script) 'php'
              baseinstalldir CDATA #IMPLIED>

<!ELEMENT file (replace*)>
<!ATTLIST file role           (php|ext|src|test|doc|data|script) 'php'
               debug          (na|on|off)        'na'
               format         CDATA              #IMPLIED
               baseinstalldir CDATA              #IMPLIED
               platform       CDATA              #IMPLIED
               md5sum         CDATA              #IMPLIED
               name           CDATA              #REQUIRED
               install-as     CDATA              #IMPLIED>

<!ELEMENT replace EMPTY>
<!ATTLIST replace type (php-const|pear-config|package-info) #REQUIRED
                              from CDATA #REQUIRED
                              to CDATA #REQUIRED>


pear/data/Mail_mimeDecode/xmail.xsl000064400000004127151732710150013251 0ustar00<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:preserve-space elements="headervalue paramvalue body"/>

	<xsl:template name="mimepart">

		<xsl:variable name="boundary">
				<xsl:for-each select="./header">
					<xsl:if test="string(./headername) = 'Content-Type'">
						<xsl:for-each select="./parameter">
							<xsl:if test="string(./paramname) = 'boundary'">
								<xsl:value-of select="paramvalue"/>
							</xsl:if>
						</xsl:for-each>
					</xsl:if>
				</xsl:for-each>
		</xsl:variable>

		<xsl:for-each select="header">

			<xsl:value-of select="headername"/>
			<xsl:text>: </xsl:text>
			<xsl:value-of select="headervalue"/>

			<xsl:if test="count(./parameter) = 0">
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:if>

			<xsl:for-each select="parameter">
				<xsl:text>;&#13;&#10;&#09;</xsl:text>
				<xsl:value-of select="paramname"/>
				<xsl:text>="</xsl:text>
				<xsl:value-of select="paramvalue"/>
				<xsl:text>"</xsl:text>
			</xsl:for-each>

			<xsl:if test="count(./parameter) > 0">
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:if>

		</xsl:for-each>

		<xsl:text>&#13;&#10;</xsl:text>

		<!-- Which to do, print a body or process subparts? -->
		<xsl:choose>
			<xsl:when test="count(./mimepart) = 0">
				<xsl:value-of select="body"/>
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:when>

			<xsl:otherwise>
				<xsl:for-each select="mimepart">
					<xsl:text>--</xsl:text><xsl:value-of select="$boundary"/><xsl:text>&#13;&#10;</xsl:text>
					<xsl:call-template name="mimepart"/>
				</xsl:for-each>

				<xsl:text>--</xsl:text><xsl:value-of select="$boundary"/><xsl:text>--&#13;&#10;</xsl:text>

			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

<!-- This is where the stylesheet really starts, matching the top level email element -->
	<xsl:template match="email">
		<xsl:call-template name="mimepart"/>
	</xsl:template>

</xsl:stylesheet>pear/data/Mail_mimeDecode/xmail.dtd000064400000001066151732710150013215 0ustar00<?xml version="1.0" encoding="ISO-8859-1"?>

<!ENTITY lt "&#38;#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">
<!ENTITY crlf "&#13;&#10;">

<!ELEMENT email (header+, (body | mimepart+))>
<!ELEMENT mimepart (header+, (body | mimepart+))>
<!ELEMENT body (#PCDATA)>
<!ELEMENT header ((headername|headervalue|parameter)*)>
<!ELEMENT headername (#PCDATA)>
<!ELEMENT headervalue (#PCDATA)>
<!ELEMENT parameter ((paramname|paramvalue)+)>
<!ELEMENT paramvalue (#PCDATA)>
<!ELEMENT paramname (#PCDATA)>

pear/.lock000064400000000000151732710150006414 0ustar00pear/test/Mail/tests/9137_2.phpt000064400000002312151732710150012217 0ustar00--TEST--
Mail: Test for bug #9137, take 2
--FILE--
<?php

require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'PEAR.php';

$addresses = array(
    array('raw' => '"John Doe" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe <test@example.com>'),
);

for ($i = 0; $i < count($addresses); $i++) {
    // construct the address
    $address = $addresses[$i]['raw'];
    $parsedAddresses = Mail_RFC822::parseAddressList($address);
    if (PEAR::isError($parsedAddresses)) {
        echo $address." :: Failed to validate\n";
    } else {
        echo $address." :: Parsed\n";
    }
}

--EXPECT--
"John Doe" <test@example.com> :: Parsed
"John Doe\" <test@example.com> :: Failed to validate
"John Doe\\" <test@example.com> :: Parsed
"John Doe\\\" <test@example.com> :: Failed to validate
"John Doe\\\\" <test@example.com> :: Parsed
"John Doe <test@example.com> :: Failed to validate
pear/test/Mail/tests/bug17317.phpt000064400000000645151732710150012562 0ustar00--TEST--
Mail_RFC822::parseAddressList invalid periods in mail address
--FILE--
<?php
require "Mail/RFC822.php";

$result[] = Mail_RFC822::parseAddressList('.name@example.com');
$result[] = Mail_RFC822::parseAddressList('name.@example.com');
$result[] = Mail_RFC822::parseAddressList('name..name@example.com');

foreach ($result as $r) {
    if (is_a($r, 'PEAR_Error')) {
        echo "OK\n";
    }
}
--EXPECT--
OK
OK
OK
pear/test/Mail/tests/9137.phpt000064400000001751151732710150012004 0ustar00--TEST--
Mail: Test for bug #9137
--FILE--
<?php

require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'PEAR.php';

$addresses = array(
    array('name' => 'John Doe', 'email' => 'test@example.com'),
    array('name' => 'John Doe\\', 'email' => 'test@example.com'),
    array('name' => 'John "Doe', 'email' => 'test@example.com'),
    array('name' => 'John "Doe\\', 'email' => 'test@example.com'),
);

for ($i = 0; $i < count($addresses); $i++) {
    // construct the address
    $address = "\"" . addslashes($addresses[$i]['name']) . "\" ".
        "<".$addresses[$i]['email'].">";

    $parsedAddresses = Mail_RFC822::parseAddressList($address);
    if (is_a($parsedAddresses, 'PEAR_Error')) {
        echo $address." :: Failed to validate\n";
    } else {
        echo $address." :: Parsed\n";
    }
}

--EXPECT--
"John Doe" <test@example.com> :: Parsed
"John Doe\\" <test@example.com> :: Parsed
"John \"Doe" <test@example.com> :: Parsed
"John \"Doe\\" <test@example.com> :: Parsed
pear/test/Mail/tests/rfc822.phpt000064400000005441151732710150012407 0ustar00--TEST--
Mail_RFC822: Address Parsing
--FILE--
<?php
require_once 'Mail/RFC822.php';

$parser = new Mail_RFC822();

/* A simple, bare address. */
$address = 'user@example.com';
print_r($parser->parseAddressList($address, null, true, true));

/* Address groups. */
$address = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
print_r($parser->parseAddressList($address, null, true, true));

/* A valid address with spaces in the local part. */
$address = '<"Jon Parise"@php.net>';
print_r($parser->parseAddressList($address, null, true, true));

/* An invalid address with spaces in the local part. */
$address = '<Jon Parise@php.net>';
$result = $parser->parseAddressList($address, null, true, true);
if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";

/* A valid address with an uncommon TLD. */
$address = 'jon@host.longtld';
$result = $parser->parseAddressList($address, null, true, true);
if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";

--EXPECT--
Array
(
    [0] => stdClass Object
        (
            [personal] => 
            [comment] => Array
                (
                )

            [mailbox] => user
            [host] => example.com
        )

)
Array
(
    [0] => stdClass Object
        (
            [groupname] => My Group
            [addresses] => Array
                (
                    [0] => stdClass Object
                        (
                            [personal] => "Richard"
                            [comment] => Array
                                (
                                    [0] => A comment
                                )

                            [mailbox] => richard
                            [host] => localhost
                        )

                    [1] => stdClass Object
                        (
                            [personal] => 
                            [comment] => Array
                                (
                                    [0] => Ted Bloggs
                                )

                            [mailbox] => ted
                            [host] => example.com
                        )

                    [2] => stdClass Object
                        (
                            [personal] => 
                            [comment] => Array
                                (
                                )

                            [mailbox] => Barney
                            [host] => localhost
                        )

                )

        )

)
Array
(
    [0] => stdClass Object
        (
            [personal] => 
            [comment] => Array
                (
                )

            [mailbox] => "Jon Parise"
            [host] => php.net
        )

)
Validation failed for: <Jon Parise@php.net>
pear/test/Mail/tests/bug17178.phpt000064400000000344151732710150012563 0ustar00--TEST--
Mail_RFC822::parseAddressList does not accept RFC-valid group syntax
--FILE--
<?php
require "Mail/RFC822.php";

var_dump(Mail_RFC822::parseAddressList("empty-group:;","invalid",false,false)); 

--EXPECT--
array(0) {
} 
pear/test/Mail/tests/13659.phpt000064400000001211151732710150012057 0ustar00--TEST--
Mail: Test for bug #13659
--FILE--
<?php
//require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'Mail/RFC822.php';
require_once 'PEAR.php';

$address = '"Test Student" <test@mydomain.com> (test)';
$parser = new Mail_RFC822();
$result = $parser->parseAddressList($address, 'anydomain.com', TRUE);

if (!PEAR::isError($result) && is_array($result) && is_object($result[0]))
    if ($result[0]->personal == '"Test Student"' &&
        $result[0]->mailbox == "test" &&
	$result[0]->host == "mydomain.com" &&
	is_array($result[0]->comment) && $result[0]->comment[0] == 'test')
    {
        print("OK");
    }


?>
--EXPECT--
OK
pear/test/Mail/tests/smtp_error.phpt000064400000001363151732710150013574 0ustar00--TEST--
Mail: SMTP Error Reporting
--SKIPIF--
<?php

require_once 'PEAR/Registry.php';
$registry = new PEAR_Registry();

if (!$registry->packageExists('Net_SMTP')) die("skip\n");
--FILE--
<?php
require_once 'Mail.php';

/* Reference a bogus SMTP server address to guarantee a connection failure. */
$params = array('host' => 'bogus.host.tld');

/* Create our SMTP-based mailer object. */
$mailer = Mail::factory('smtp', $params);

/* Attempt to send an empty message in order to trigger an error. */
$e = $mailer->send(array(), array(), '');
if (is_a($e, 'PEAR_Error')) {
     $err = $e->getMessage();
     if (preg_match('/Failed to connect to bogus.host.tld:25 \[SMTP: Failed to connect socket:.*/i', $err)) {
        echo "OK";
     }
}

--EXPECT--
OKpear/test/File_MARC/tests/xmlescape.mrc000064400000001330151732710150013760 0ustar0000727nam  2200205 a 450000100110000000500170001100800410002803500200006905000220008910000220011124500520013325000260018526000420021130000200025365000560027365000560032965000560038594900740044159600060051503-001645819971103184734.0970701s1997    oru          u000 0 eng u  a(Sirsi) a35166400aML270.2b.A6 19971 aAnthony, James R.00aFrench baroque music from Beaujoyeulx to Rameau  aRev. and expanded ed.  aPortland, OR :bAmadeus Press,c1997.  a586 p. :bmusic 0aMusic<Francey16th centuryxHistory and criticism. 0aMusiczFrancey17th centuryxHistory and criticism. 0aMusiczFrancey18th centuryxHistory and criticism.  aML 270.2 A6 1997wLCi30007006841505rYtBOOKSlHUNT-CIRCmHUNTINGTON  a1
pear/test/File_MARC/tests/marc_xml_namespace_prefix.phpt000064400000001273151732710160017373 0ustar00--TEST--
marc_xml_namespace: iterate and pretty print a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'namespace.xml',File_MARC::SOURCE_FILE,"marc",true);
while ($marc_record = $marc_file->next()) {
  print $marc_record->getLeader();
  print "\n";
  $field = $marc_record->getField('050');
  print $field->getIndicator(1);
  print "\n";
  print $field->getIndicator(2);
  print "\n";
  $subfield = $field->getSubfield('a');
  print $subfield->getData();
  print "\n";
}
?>
--EXPECT--
00925njm  22002777a 4500
0
0
Atlantic 1259
01832cmma 2200349 a 4500
0
0
F204.W5
pear/test/File_MARC/tests/marc_018.phpt000064400000006151151732710160013512 0ustar00--TEST--
marc_018: iterate and print a MARC record to JSON MARC-HASH format
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toJSONHash();
  print "\n";
}
?>
--EXPECT--
{"type":"marc-hash","version":[1,0],"leader":"01850     2200517   4500","fields":[["001","0000000044"],["003","EMILDA"],["008","980120s1998    fi     j      000 0 swe"],["020"," "," ",[["a","9515008808"],["c","FIM 72:00"]]],["035"," "," ",[["9","9515008808"]]],["040"," "," ",[["a","NB"]]],["042"," "," ",[["9","NB"],["9","SEE"]]],["084"," "," ",[["a","Hcd,u"],["2","kssb\/6"]]],["084"," "," ",[["5","NB"],["a","uHc"],["2","kssb"]]],["084"," "," ",[["5","SEE"],["a","Hcf"],["2","kssb\/6"]]],["084"," "," ",[["5","Q"],["a","Hcd,uf"],["2","kssb\/6"]]],["100","1"," ",[["a","Jansson, Tove,"],["d","1914-2001"]]],["245","0","4",[["a","Det osynliga barnet och andra ber\u00e4ttelser \/"],["c","Tove Jansson"]]],["250"," "," ",[["a","7. uppl."]]],["260"," "," ",[["a","Helsingfors :"],["b","Schildt,"],["c","1998 ;"],["e","(Falun :"],["f","Scandbook)"]]],["300"," "," ",[["a","166, [4] s. :"],["b","ill. ;"],["c","21 cm"]]],["440"," ","0",[["a","Mumin-biblioteket,"],["x","99-0698931-9"]]],["500"," "," ",[["a","Originaluppl. 1962"]]],["599"," "," ",[["a","Li: S"]]],["740","4"," ",[["a","Det osynliga barnet"]]],["775","1"," ",[["z","951-50-0385-7"],["w","9515003857"],["9","07"]]],["841"," "," ",[["5","Li"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["841"," "," ",[["5","SEE"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["841"," "," ",[["5","L"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["841"," "," ",[["5","NB"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["841"," "," ",[["5","Q"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["841"," "," ",[["5","S"],["a","xa"],["b","0201080u    0   4000uu   |000000"],["e","1"]]],["852"," "," ",[["5","NB"],["b","NB"],["c","NB98:12"],["h","plikt"],["j","R, 980520"]]],["852"," "," ",[["5","Li"],["b","Li"],["c","CNB"],["h","h,u"]]],["852"," "," ",[["5","SEE"],["b","SEE"]]],["852"," "," ",[["5","Q"],["b","Q"],["j","98947"]]],["852"," "," ",[["5","L"],["b","L"],["c","0100"],["h","98\/"],["j","3043 H"]]],["852"," "," ",[["5","S"],["b","S"],["h","Sv97"],["j","7235"]]],["900","1","s",[["a","Yanson, Tobe,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["900","1","s",[["a","Janssonov\u00e1, Tove,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["900","1","s",[["a","Jansone, Tuve,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["900","1","s",[["a","Janson, Tuve,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["900","1","s",[["a","Jansson, Tuve,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["900","1","s",[["a","Janssonova, Tove,"],["d","1914-2001"],["u","Jansson, Tove,"],["d","1914-2001"]]],["976"," ","2",[["a","Hcd,u"],["b","Sk\u00f6nlitteratur"]]],["005","20050204111518.0"]]}
pear/test/File_MARC/tests/marc_field_001.phpt000064400000001577151732710160014654 0ustar00--TEST--
marc_field_001: Exercise basic methods for File_MARC_Field class
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// test constructor
$field = new File_MARC_Data_Field('100', $subfields, '0');

// test basic getter methods
print "Tag: " . $field->getTag() . "\n";
print "Get Ind1: " . $field->getIndicator(1) . "\n";
print "Get Ind2: " . $field->getIndicator(2) . "\n";

// test basic setter methods
print "Set Ind1: " . $field->setIndicator(1, '3') . "\n";

// test pretty print
print $field;
print "\n";

// test raw print
print $field->toRaw();
?>
--EXPECT--
Tag: 100
Get Ind1: 0
Get Ind2:  
Set Ind1: 3
100 3  _anothing
       _zeverything
3 anothingzeverything
pear/test/File_MARC/tests/marc_012.phpt000064400000003372151732710160013506 0ustar00--TEST--
marc_012: test isControlField() and isDataField() convenience methods
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

while ($marc_record = $marc_file->next()) {
  $fields = $marc_record->getFields();
  foreach ($fields as $field) {
    print $field->getTag();
    if ($field->isControlField()) {
      print "\tControl field!";
    }
    if ($field->isDataField()) {
      print "\tData field!";
    }
    print "\n";
  }
}

?>
--EXPECT--
001	Control field!
004	Control field!
005	Control field!
008	Control field!
010	Data field!
035	Data field!
035	Data field!
040	Data field!
050	Data field!
245	Data field!
260	Data field!
300	Data field!
500	Data field!
505	Data field!
650	Data field!
650	Data field!
700	Data field!
700	Data field!
700	Data field!
740	Data field!
852	Data field!
001	Control field!
005	Control field!
007	Control field!
008	Control field!
024	Data field!
028	Data field!
035	Data field!
040	Data field!
100	Data field!
245	Data field!
260	Data field!
300	Data field!
511	Data field!
500	Data field!
518	Data field!
500	Data field!
500	Data field!
505	Data field!
650	Data field!
700	Data field!
710	Data field!
740	Data field!
001	Control field!
005	Control field!
007	Control field!
008	Control field!
024	Data field!
028	Data field!
033	Data field!
033	Data field!
033	Data field!
033	Data field!
035	Data field!
040	Data field!
048	Data field!
110	Data field!
245	Data field!
260	Data field!
300	Data field!
440	Data field!
511	Data field!
518	Data field!
500	Data field!
500	Data field!
505	Data field!
650	Data field!
700	Data field!
700	Data field!
700	Data field!
700	Data field!
700	Data field!
852	Data field!
pear/test/File_MARC/tests/marc_field_004.phpt000064400000001651151732710160014650 0ustar00--TEST--
marc_field_004: Add subfields to an existing field (corner case)
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// create a field
$field = new File_MARC_Data_Field('100', $subfields, '0');

// create some new subfields
$subfield1 = new File_MARC_Subfield('g', 'a little');

// test the fieldpost corner case by inserting prior to the first subfield
$sf = $field->getSubfields('a');
// we might get an array back; in this case, we want the first subfield
if (is_array($sf)) {
  $field->insertSubfield($subfield1, $sf[0], true);
}
else {
  $field->insertSubfield($subfield1, $sf, true);
}

// let's see the results
print $field;
print "\n";

?>
--EXPECT--
100 0  _ga little
       _anothing
       _zeverything
pear/test/File_MARC/tests/marc_016.phpt000064400000030565151732710160013516 0ustar00--TEST--
marc_016: generate a single collection of MARCXML records from a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$records = new File_MARC($dir . '/' . 'music.mrc');

// Add the XML header and opening <collection> element
$records->toXMLHeader();

// Iterate through the retrieved records
while ($record = $records->next()) {

    // Change each 852 $c to "Audio-Visual"
    $holdings = $record->getFields('852');
    foreach ($holdings as $holding) {

        // Get the $c subfields from this field
        $formats = $holding->getSubfields('c');
        foreach ($formats as $format) {
            if ($format->getData('AV')) {
                $format->setData('Audio-Visual');
            }
        }
    }

    // Generate the XML output for this record
    print $record->toXML('UTF-8', true, false);
}
// Add the </collection> closing element and dump the XMLWriter contents
print $records->toXMLFooter();
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01145ncm  2200277 i 4500</leader>
  <controlfield tag="001">000073594</controlfield>
  <controlfield tag="004">AAJ5802</controlfield>
  <controlfield tag="005">20030415102100.0</controlfield>
  <controlfield tag="008">801107s1977    nyujza                   </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   77771106 </subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(CaOTUIC)15460184</subfield>
  </datafield>
  <datafield tag="035" ind1="9" ind2=" ">
   <subfield code="a">AAJ5802</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">LC</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">M1366</subfield>
   <subfield code="b">.M62</subfield>
   <subfield code="d">M1527.2</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="4">
   <subfield code="a">The Modern Jazz Quartet :</subfield>
   <subfield code="b">The legendary profile. --</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">New York :</subfield>
   <subfield code="b">M.J.Q. Music,</subfield>
   <subfield code="c">c1977.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">score (72 p.) ;</subfield>
   <subfield code="c">31 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">For piano, vibraphone, drums, and double bass.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">Lewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Motion picture music</subfield>
   <subfield code="v">Excerpts</subfield>
   <subfield code="v">Scores.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Lewis, John,</subfield>
   <subfield code="d">1920-</subfield>
   <subfield code="t">Selections.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Martyrs.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Legendary profile.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
   <subfield code="a">The legendary profile.</subfield>
  </datafield>
  <datafield tag="852" ind1="0" ind2="0">
   <subfield code="b">MUSIC</subfield>
   <subfield code="c">Audio-Visual</subfield>
   <subfield code="k">folio</subfield>
   <subfield code="h">M1366</subfield>
   <subfield code="i">M62</subfield>
   <subfield code="9">1</subfield>
   <subfield code="4">Marvin Duchow Music</subfield>
   <subfield code="5"></subfield>
  </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01293cjm  2200289 a 4500</leader>
  <controlfield tag="001">001878039</controlfield>
  <controlfield tag="005">20050110174900.0</controlfield>
  <controlfield tag="007">sd fungnn|||e|</controlfield>
  <controlfield tag="008">940202r19931981nyujzn   i              d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
   <subfield code="a">7464573372</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="2">
   <subfield code="a">JK 57337</subfield>
   <subfield code="b">Red Baron</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(OCoLC)29737267</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">SVP</subfield>
   <subfield code="c">SVP</subfield>
   <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Desmond, Paul,</subfield>
   <subfield code="d">1924-</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
   <subfield code="a">Paul Desmond &amp; the Modern Jazz Quartet</subfield>
   <subfield code="h">[sound recording]</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">New York, N.Y. :</subfield>
   <subfield code="b">Red Baron :</subfield>
   <subfield code="b">Manufactured by Sony Music Entertainment,</subfield>
   <subfield code="c">p1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 sound disc (39 min.) :</subfield>
   <subfield code="b">digital ;</subfield>
   <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
   <subfield code="a">Paul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">All arrangements by John Lewis.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
   <subfield code="a">Recorded live on December 25, 1971 at Town Hall, NYC.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Originally released in 1981 by Finesse as LP FW 27487.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Program notes by Irving Townsend, June 1981, on container insert.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">Greensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz</subfield>
   <subfield code="y">1971-1980.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Lewis, John,</subfield>
   <subfield code="d">1920-</subfield>
  </datafield>
  <datafield tag="710" ind1="2" ind2=" ">
   <subfield code="a">Modern Jazz Quartet.</subfield>
  </datafield>
  <datafield tag="740" ind1="0" ind2=" ">
   <subfield code="a">Paul Desmond and the Modern Jazz Quartet.</subfield>
  </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01829cjm  2200385 a 4500</leader>
  <controlfield tag="001">001964482</controlfield>
  <controlfield tag="005">20060626132700.0</controlfield>
  <controlfield tag="007">sd fzngnn|m|e|</controlfield>
  <controlfield tag="008">871211p19871957nyujzn                  d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
   <subfield code="a">4228332902</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="1">
   <subfield code="a">833 290-2</subfield>
   <subfield code="b">Verve</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">19571027</subfield>
   <subfield code="b">6299</subfield>
   <subfield code="c">D56</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">196112--</subfield>
   <subfield code="b">3804</subfield>
   <subfield code="c">N4</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">19571019</subfield>
   <subfield code="b">4104</subfield>
   <subfield code="c">C6</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">197107--</subfield>
   <subfield code="b">6299</subfield>
   <subfield code="c">V7</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(OCoLC)17222092</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">CPL</subfield>
   <subfield code="c">CPL</subfield>
   <subfield code="d">OCL</subfield>
   <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="048" ind1=" " ind2=" ">
   <subfield code="a">pz01</subfield>
   <subfield code="a">ka01</subfield>
   <subfield code="a">sd01</subfield>
   <subfield code="a">pd01</subfield>
  </datafield>
  <datafield tag="110" ind1="2" ind2=" ">
   <subfield code="a">Modern Jazz Quartet.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="4">
   <subfield code="a">The Modern Jazz Quartet plus</subfield>
   <subfield code="h">[sound recording].</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">[New York] :</subfield>
   <subfield code="b">Verve,</subfield>
   <subfield code="c">p1987.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 sound disc :</subfield>
   <subfield code="b">digital ;</subfield>
   <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="440" ind1=" " ind2="0">
   <subfield code="a">Compact jazz</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
   <subfield code="a">Modern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
   <subfield code="a">Recorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Compact disc.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Analog recording.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">The golden striker (4:08) -- On Green Dolphin Street (7:28) -- D &amp; E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Peterson, Oscar,</subfield>
   <subfield code="d">1925-</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Brown, Ray,</subfield>
   <subfield code="d">1926-2002.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Thigpen, Ed.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Hayes, Louis,</subfield>
   <subfield code="d">1937-</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="852" ind1="8" ind2="0">
   <subfield code="b">MUSIC</subfield>
   <subfield code="c">Audio-Visual</subfield>
   <subfield code="h">CD 1131</subfield>
   <subfield code="4">Marvin Duchow Music</subfield>
   <subfield code="5">Audio-Visual</subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/marc_010.phpt000064400000011140151732710160013474 0ustar00--TEST--
marc_010: iterate and pretty print MARC records from a stream
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$marc_file = new File_MARC("compress.zlib://$dir/compressed.mrc.gz");

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
650  0 _aJazz.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
650  0 _aJazz
       _y1971-1980.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
650  0 _aJazz.
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
pear/test/File_MARC/tests/marc_field_005.phpt000064400000001767151732710160014661 0ustar00--TEST--
marc_field_005: Test method getContents
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// create a field
$field = new File_MARC_Data_Field('100', $subfields, '0');

// create some new subfields
$subfield1 = new File_MARC_Subfield('g', 'a little');

// test the fieldpost corner case by inserting prior to the first subfield
$sf = $field->getSubfields('a');
// we might get an array back; in this case, we want the first subfield
if (is_array($sf)) {
  $field->insertSubfield($subfield1, $sf[0], true);
}
else {
  $field->insertSubfield($subfield1, $sf, true);
}

// let's see the results
print $field->getContents();
print "\n";
print $field->getContents('###');
print "\n";

?>
--EXPECT--
a littlenothingeverything
a little###nothing###everything
pear/test/File_MARC/tests/sandburg.mrc000064400000002166151732710160013615 0ustar0001142cam  2200301 a 4500001001300000003000400013005001700017008004100034010001700075020002500092040001800117042000900135050002600144082001600170100003200186245008600218250001200304260005200316300004900368500004000417520022800457650003300685650003300718650002400751650002100775650002300796700002100819   92005291 DLC19930521155141.9920219s1993    caua   j      000 0 eng    a   92005291   a0152038655 :c$15.95  aDLCcDLCdDLC  alcac00aPS3537.A618bA88 199300a811/.522201 aSandburg, Carl,d1878-1967.10aArithmetic /cCarl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.  a1st ed.  aSan Diego :bHarcourt Brace Jovanovich,cc1993.  a1 v. (unpaged) :bill. (some col.) ;c26 cm.  aOne Mylar sheet included in pocket.  aA poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone. 0aArithmeticxJuvenile poetry. 0aChildren's poetry, American. 1aArithmeticxPoetry. 1aAmerican poetry. 1aVisual perception.1 aRand, Ted,eill.pear/test/File_MARC/tests/marc_xml_003.phpt000064400000002731151732710160014364 0ustar00--TEST--
marc_xml_003: Round-trip a MARCXML record to MARC21 (LOC standard)
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'sandburg.xml');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toRaw();
}
?>
--EXPECT--
01142cam  2200301 a 4500001001300000003000400013005001700017008004100034010001700075020002500092040001800117042000900135050002600144082001600170100003200186245008600218250001200304260005200316300004900368500004000417520022800457650003300685650003300718650002400751650002100775650002300796700002100819   92005291 DLC19930521155141.9920219s1993    caua   j      000 0 eng    a   92005291   a0152038655 :c$15.95  aDLCcDLCdDLC  alcac00aPS3537.A618bA88 199300a811/.522201 aSandburg, Carl,d1878-1967.10aArithmetic /cCarl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.  a1st ed.  aSan Diego :bHarcourt Brace Jovanovich,cc1993.  a1 v. (unpaged) :bill. (some col.) ;c26 cm.  aOne Mylar sheet included in pocket.  aA poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone. 0aArithmeticxJuvenile poetry. 0aChildren's poetry, American. 1aArithmeticxPoetry. 1aAmerican poetry. 1aVisual perception.1 aRand, Ted,eill.
pear/test/File_MARC/tests/marc_008.phpt000064400000000736151732710160013514 0ustar00--TEST--
marc_008: Attempt to open a file that does not exist
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

try {
    $marc_file = new File_MARC('super_bogus_file');
}
catch (File_MARC_Exception $fme) {
    print $fme->getMessage();
}

?>
--EXPECTF--
Warning: fopen(super_bogus_file): failed to open stream: No such file or directory in %sMARC.php on line %d
Invalid input file "super_bogus_file"
pear/test/File_MARC/tests/marc_lint_003.phpt000064400000005353151732710160014535 0ustar00--TEST--
marc_lint_003: Tests for field 880 and for subfield 6
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
<?php include('tests/skipif_noispn.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$marc_lint = new File_MARC_Lint();

$rec = new File_MARC_Record();
$rec->setLeader("00000nam  22002538a 4500");
$rec->appendField(
    new File_MARC_Control_Field(
        '001', 'ttt07000001 '
    )
);
$rec->appendField(
    new File_MARC_Control_Field(
        '003', 'TEST '
    )
);
$rec->appendField(
    new File_MARC_Control_Field(
        '008', '070520s2007    ilu           000 0 eng d'
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '040',
        array(
            new File_MARC_Subfield('a', 'TEST'),
            new File_MARC_Subfield('c', 'TEST')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '050',
        array(
            new File_MARC_Subfield('a', 'RZ999'),
            new File_MARC_Subfield('b', '.J66 2007')
        ),
        "", "4"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '082',
        array(
            new File_MARC_Subfield('a', '615.8/9'),
            new File_MARC_Subfield('2', '22')
        ),
        "0", "4"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '100',
        array(
            new File_MARC_Subfield('a', 'Jones, John')
        ),
        "1", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '245',
        array(
            new File_MARC_Subfield('6', '880-02'),
            new File_MARC_Subfield('a', 'Test 880.')
        ),
        "1", "0"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '260',
        array(
            new File_MARC_Subfield('a', 'Mount Morris, Ill. :'),
            new File_MARC_Subfield('b', "B. Baldus,"),
            new File_MARC_Subfield('c', '2007.')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '300',
        array(
            new File_MARC_Subfield('a', '1 v. ;'),
            new File_MARC_Subfield('c', '23 cm.')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '880',
        array(
            new File_MARC_Subfield('6', '245-02/$1'),
            new File_MARC_Subfield('a', '<Title in CJK script>.')
        ),
        "1", "0"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '880',
        array(
            new File_MARC_Subfield('6', '245-02/$1'),
            new File_MARC_Subfield('a', 'Illegal duplicate field.')
        ),
        "1", "0"
    )
);
$warnings = $marc_lint->checkRecord($rec);
foreach ($warnings as $warning) {
  print $warning . "\n";
}

?>
--EXPECT--
245: Field is not repeatable.
pear/test/File_MARC/tests/marc_field_21246.phpt000064400000001454151732710160015024 0ustar00--TEST--
marc_field_21246: Delete multiple subfields
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$field = new File_MARC_Data_Field(650, [
    new File_MARC_Subfield('9', 'test1'),
    new File_MARC_Subfield('9', 'test2'),
    new File_MARC_Subfield('0', 'test3'),
    new File_MARC_Subfield('9', 'test4'),
  ]
);
echo "--- Before: ---\n$field\n\n";
foreach ($field->getSubfields('9') as $subfield) {
  echo "Deleting subfield: $subfield\n";
  $field->deleteSubfield($subfield);
}
echo "\n--- After: ---\n$field\n\n";
?>
--EXPECT--
--- Before: ---
650    _9test1
       _9test2
       _0test3
       _9test4

Deleting subfield: [9]: test1
Deleting subfield: [9]: test2
Deleting subfield: [9]: test4

--- After: ---
650    _0test3
pear/test/File_MARC/tests/marc_021.phpt000064400000011414151732710170013503 0ustar00--TEST--
marc_021: test MARC-in-JSON serialization with subfield 0
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

while ($marc_record = $marc_file->next()) {
  // create some subfields
  $subfields[] = new File_MARC_Subfield('0', 'nothing');
  $subfields[] = new File_MARC_Subfield('1', 'everything');
  $field = new File_MARC_Data_Field('999', $subfields, '', '');
  $marc_record->appendField($field);
  
  $subfields = null;
  $field = null;
  $subfields[] = new File_MARC_Subfield('a', 'bee');
  $subfields[] = new File_MARC_Subfield('0', 'cee');
  $subfields[] = new File_MARC_Subfield('d', 'eee');
  $field = new File_MARC_Data_Field('999', $subfields, '', '');

  $marc_record->appendField($field);

  print $marc_record->toJSON();
  print "\n";
}
?>
--EXPECT--
{"leader":"01850     2200517   4500","fields":[{"001":"0000000044"},{"003":"EMILDA"},{"008":"980120s1998    fi     j      000 0 swe"},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"9515008808"},{"c":"FIM 72:00"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"9":"9515008808"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"NB"}]}},{"042":{"ind1":" ","ind2":" ","subfields":[{"9":"NB"},{"9":"SEE"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"a":"Hcd,u"},{"2":"kssb\/6"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"a":"uHc"},{"2":"kssb"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"a":"Hcf"},{"2":"kssb\/6"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"a":"Hcd,uf"},{"2":"kssb\/6"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"245":{"ind1":"0","ind2":"4","subfields":[{"a":"Det osynliga barnet och andra ber\u00e4ttelser \/"},{"c":"Tove Jansson"}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"7. uppl."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Helsingfors :"},{"b":"Schildt,"},{"c":"1998 ;"},{"e":"(Falun :"},{"f":"Scandbook)"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"166, [4] s. :"},{"b":"ill. ;"},{"c":"21 cm"}]}},{"440":{"ind1":" ","ind2":"0","subfields":[{"a":"Mumin-biblioteket,"},{"x":"99-0698931-9"}]}},{"500":{"ind1":" ","ind2":" ","subfields":[{"a":"Originaluppl. 1962"}]}},{"599":{"ind1":" ","ind2":" ","subfields":[{"a":"Li: S"}]}},{"740":{"ind1":"4","ind2":" ","subfields":[{"a":"Det osynliga barnet"}]}},{"775":{"ind1":"1","ind2":" ","subfields":[{"z":"951-50-0385-7"},{"w":"9515003857"},{"9":"07"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"Li"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"L"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"S"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"b":"NB"},{"c":"NB98:12"},{"h":"plikt"},{"j":"R, 980520"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"Li"},{"b":"Li"},{"c":"CNB"},{"h":"h,u"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"b":"SEE"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"b":"Q"},{"j":"98947"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"L"},{"b":"L"},{"c":"0100"},{"h":"98\/"},{"j":"3043 H"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"S"},{"b":"S"},{"h":"Sv97"},{"j":"7235"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Yanson, Tobe,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janssonov\u00e1, Tove,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Jansone, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janson, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Jansson, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janssonova, Tove,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"976":{"ind1":" ","ind2":"2","subfields":[{"a":"Hcd,u"},{"b":"Sk\u00f6nlitteratur"}]}},{"005":"20050204111518.0"},{"999":{"ind1":" ","ind2":" ","subfields":[{"0":"nothing"},{"1":"everything"}]}},{"999":{"ind1":" ","ind2":" ","subfields":[{"a":"bee"},{"0":"cee"},{"d":"eee"}]}}]}
pear/test/File_MARC/tests/marc_002.phpt000064400000011143151732710170013501 0ustar00--TEST--
marc_002: iterate and pretty print MARC records from a file with multiple records
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
650  0 _aJazz.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
650  0 _aJazz
       _y1971-1980.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
650  0 _aJazz.
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
pear/test/File_MARC/tests/onerecord.xml000064400000006354151732710170014013 0ustar00<?xml version="1.0" encoding="UTF-8"?>
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01142cam  2200301 a 4500</leader>
  <controlfield tag="001">   92005291 </controlfield>
  <controlfield tag="003">DLC</controlfield>
  <controlfield tag="005">19930521155141.9</controlfield>
  <controlfield tag="008">920219s1993    caua   j      000 0 eng  </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   92005291 </subfield>
  </datafield>
  <datafield tag="020" ind1=" " ind2=" ">
   <subfield code="a">0152038655 :</subfield>
   <subfield code="c">$15.95</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">DLC</subfield>
   <subfield code="c">DLC</subfield>
   <subfield code="d">DLC</subfield>
  </datafield>
  <datafield tag="042" ind1=" " ind2=" ">
   <subfield code="a">lcac</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">PS3537.A618</subfield>
   <subfield code="b">A88 1993</subfield>
  </datafield>
  <datafield tag="082" ind1="0" ind2="0">
   <subfield code="a">811/.52</subfield>
   <subfield code="2">20</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Sandburg, Carl,</subfield>
   <subfield code="d">1878-1967.</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
   <subfield code="a">Arithmetic /</subfield>
   <subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
   <subfield code="a">1st ed.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">San Diego :</subfield>
   <subfield code="b">Harcourt Brace Jovanovich,</subfield>
   <subfield code="c">c1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 v. (unpaged) :</subfield>
   <subfield code="b">ill. (some col.) ;</subfield>
   <subfield code="c">26 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">One Mylar sheet included in pocket.</subfield>
  </datafield>
  <datafield tag="520" ind1=" " ind2=" ">
   <subfield code="a">A poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Juvenile poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Children's poetry, American.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">American poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Visual perception.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Rand, Ted,</subfield>
   <subfield code="e">ill.</subfield>
  </datafield>
 </record>
pear/test/File_MARC/tests/marc_xml_namespace.phpt000064400000001320151732710170016010 0ustar00--TEST--
marc_xml_namespace: iterate and pretty print a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'namespace.xml',File_MARC::SOURCE_FILE,"http://www.loc.gov/MARC21/slim");
while ($marc_record = $marc_file->next()) {
  print $marc_record->getLeader();
  print "\n";
  $field = $marc_record->getField('050');
  print $field->getIndicator(1);
  print "\n";
  print $field->getIndicator(2);
  print "\n";
  $subfield = $field->getSubfield('a');
  print $subfield->getData();
  print "\n";
}
?>
--EXPECT--
00925njm  22002777a 4500
0
0
Atlantic 1259
01832cmma 2200349 a 4500
0
0
F204.W5
pear/test/File_MARC/tests/marc_xml_16642.phpt000064400000001642151732710170014545 0ustar00--TEST--
marc_xml_16642: Fix bug 16642: ensure tag and subfield values are returned as strings
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
// Retrieve a set of MARC records from a file
$marc_file = new File_MARCXML($dir . '/' . 'onerecord.xml');
// Iterate through the retrieved records
while ($record = $marc_file->next()) {
   foreach ($record->getFields() as $tag => $subfields) {
       // Skip everything except for 650 fields
       if ($tag == '650') {
           print "Subject:";
           foreach ($subfields->getSubfields() as $code => $value) {
               print " $value";
           }
           print "\n";
       }
   }
}
?>
--EXPECT--
Subject: [a]: Arithmetic [x]: Juvenile poetry.
Subject: [a]: Children's poetry, American.
Subject: [a]: Arithmetic [x]: Poetry.
Subject: [a]: American poetry.
Subject: [a]: Visual perception.
pear/test/File_MARC/tests/marc_009.phpt000064400000003006151732710170013507 0ustar00--TEST--
marc_009: Parse a record where leader record length != real record length
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'wronglen.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
  print "WARNINGS:\n";
  foreach ($marc_record->getWarnings() as $warning) {
    print "  * $warning\n";
  }
}
?>
--EXPECT--
LDR 00727nam  2200205 a 4500
001     03-0016458
005     19971103184734.0
008     970701s1997    oru          u000 0 eng u
035    _a(Sirsi) a351664
050 00 _aML270.2
       _b.A6 1997
100 1  _aAnthony, James R.
245 00 _aFrench baroque music from Beaujoyeulx to Rameau
250    _aRev. and expanded ed.
260    _aPortland, OR :
       _bAmadeus Press,
       _c1997.
300    _a586 p. :
       _bmusic
650  0 _aMusic
       _<France
       _y16th century
       _xHistory and criticism.
650  0 _aMusic
       _zFrance
       _y17th century
       _xHistory and criticism.
650  0 _aMusic
       _zFrance
       _y18th century
       _xHistory and criticism.
949    _aML 270.2 A6 1997
       _wLC
       _i30007006841505
       _rY
       _tBOOKS
       _lHUNT-CIRC
       _mHUNEXTRALON

WARNINGS:
  * Invalid record length: Leader says "00727" bytes; actual record length is "741"
  * Field for tag "949" does not end with an end of field character
  * Field for tag "596" does not end with an end of field character
  * Invalid indicators "GSTUFF" forced to blanks for tag "596"
pear/test/File_MARC/tests/marc_xml_005.phpt000064400000002753151732710170014373 0ustar00--TEST--
marc_xml_005: Round-trip a MARCXML record with a root element of "record" to MARC21
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'onerecord.xml');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toRaw();
}
?>
--EXPECT--
01142cam  2200301 a 4500001001300000003000400013005001700017008004100034010001700075020002500092040001800117042000900135050002600144082001600170100003200186245008600218250001200304260005200316300004900368500004000417520022800457650003300685650003300718650002400751650002100775650002300796700002100819   92005291 DLC19930521155141.9920219s1993    caua   j      000 0 eng    a   92005291   a0152038655 :c$15.95  aDLCcDLCdDLC  alcac00aPS3537.A618bA88 199300a811/.522201 aSandburg, Carl,d1878-1967.10aArithmetic /cCarl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.  a1st ed.  aSan Diego :bHarcourt Brace Jovanovich,cc1993.  a1 v. (unpaged) :bill. (some col.) ;c26 cm.  aOne Mylar sheet included in pocket.  aA poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone. 0aArithmeticxJuvenile poetry. 0aChildren's poetry, American. 1aArithmeticxPoetry. 1aAmerican poetry. 1aVisual perception.1 aRand, Ted,eill.
pear/test/File_MARC/tests/skipif.inc000064400000000261151732710170013260 0ustar00<?php

// Stash the current error_reporting value
$error_reporting = error_reporting();

// Restore the error reporting to previous value
error_reporting($error_reporting);

?>
pear/test/File_MARC/tests/bad_example.xml000064400000016160151732710170014270 0ustar00<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
  <leader>01850    a2200517   4500</leader>
  <controlfield tag="001">0000000044</controlfield>
  <controlfield tag="003">EMILDA</controlfield>
  <controlfield tag="008">980120s1998    fi     j      000 0 swe</controlfield>
  <datafield tag="020" ind1=" " ind2=" ">
    <subfield code="a">9515008808</subfield>
    <subfield code="c">FIM 72:00</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="9">9515008808</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">NB</subfield>
  </datafield>
  <datafield tag="042" ind1=" " ind2=" ">
    <subfield code="9">NB</subfield>
    <subfield code="9">SEE</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
    <subfield code="a">Hcd,u</subfield>
    <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
    <subfield code="5">NB</subfield>
    <subfield code="a">uHc</subfield>
    <subfield code="2">kssb</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
    <subfield code="5">SEE</subfield>
    <subfield code="a">Hcf</subfield>
    <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
    <subfield code="5">Q</subfield>
    <subfield code="a">Hcd,uf</subfield>
    <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="245" ind1="0">
    <subfield code="a">Det osynliga barnet och andra bert̃telser /</subfield>
    <subfield code="c">Tove Jansson</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
    <subfield code="a">7. uppl.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
    <subfield code="a">Helsingfors :</subfield>
    <subfield code="b">Schildt,</subfield>
    <subfield code="c">1998 ;</subfield>
    <subfield code="e">(Falun :</subfield>
    <subfield code="f">Scandbook)</subfield>
  </datafield>
  <datafield tag="30-" ind1=" " ind2=" ">
    <subfield code="a">166, [4] s. :</subfield>
    <subfield code="b">ill. ;</subfield>
    <subfield code="c">21 cm</subfield>
  </datafield>
  <datafield tag="440" ind1=" " ind2="0">
    <subfield code="a">Mumin-biblioteket,</subfield>
    <subfield code="x">99-0698931-9</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Originaluppl. 1962</subfield>
  </datafield>
  <datafield tag="599" ind1=" " ind2=" ">
    <subfield code="a">Li: S</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
    <subfield code="a">Det osynliga barnet</subfield>
  </datafield>
  <datafield tag="775" ind1="1" ind2=" ">
    <subfield code="z">951-50-0385-7</subfield>
    <subfield code="w">9515003857</subfield>
    <subfield code="9">07</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">Li</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">SEE</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">L</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">NB</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">Q</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
    <subfield code="5">S</subfield>
    <subfield code="a">xa</subfield>
    <subfield code="b">0201080u    0   4000uu   |000000</subfield>
    <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">NB</subfield>
    <subfield code="b">NB</subfield>
    <subfield code="c">NB98:12</subfield>
    <subfield code="h">plikt</subfield>
    <subfield code="j">R, 980520</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">Li</subfield>
    <subfield code="b">Li</subfield>
    <subfield code="c">CNB</subfield>
    <subfield code="h">h,u</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">SEE</subfield>
    <subfield code="b">SEE</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">Q</subfield>
    <subfield code="b">Q</subfield>
    <subfield code="j">98947</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">L</subfield>
    <subfield code="b">L</subfield>
    <subfield code="c">0100</subfield>
    <subfield code="h">98/</subfield>
    <subfield code="j">3043 H</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
    <subfield code="5">S</subfield>
    <subfield code="b">S</subfield>
    <subfield code="h">Sv97</subfield>
    <subfield code="j">7235</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Yanson, Tobe,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Janssonov,̀ Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Jansone, Tuve,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Janson, Tuve,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Jansson, Tuve,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
    <subfield code="a">Janssonova, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
    <subfield code="u">Jansson, Tove,</subfield>
    <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="976" ind1=" " ind2="2">
    <subfield code="a">Hcd,u</subfield>
    <subfield code="b">Skn̲litteratur</subfield>
  </datafield>
  <controlfield tag="005">20050204111518.0</controlfield>
</record>
</collection>
pear/test/File_MARC/tests/marc_subfield_002.phpt000064400000002055151732710170015360 0ustar00--TEST--
marc_subfield_002: Exercise setter and isEmpty() methods for File_MARC_Subfield class
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

function testEmpty($testSubfield) {
  print "Subfield is ";
  if ($testSubfield->isEmpty()) {
    print "empty.\n";
  }
  else {
    print "not empty.\n";
  }

}

$subfield = new File_MARC_Subfield('a', 'wasssup');

// test isEmpty() scenarios
testEmpty($subfield);

$subfield->setData(null);
testEmpty($subfield);

$subfield->setData('just hangin');
testEmpty($subfield);

// test setCode() scenarios
print "\nSet code to 'z'...";
if ($subfield->setCode('z')) {
  print "\n";
  print $subfield;
}

print "\nSet code to ''...";
if ($subfield->setCode('')) {
  print "\n";
  print $subfield;
}

print "\nSet code to null...";
if ($subfield->setCode(null)) {
  print "\n";
  print $subfield;
}

?>
--EXPECT--
Subfield is not empty.
Subfield is empty.
Subfield is not empty.

Set code to 'z'...
[z]: just hangin
Set code to ''...
Set code to null...
pear/test/File_MARC/tests/marc_023.phpt000064400000001034151732710170013502 0ustar00--TEST--
marc_023: test extended Record interface
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

class MyRecord extends File_MARC_Record {
  public function myNewMethod() {
    return $this->getField('040')->getSubfield('a')->getData();
  }
}

$marc_file = new File_MARC($dir . '/' . 'example.mrc', File_MARC::SOURCE_FILE, MyRecord::class);

$rec = $marc_file->next();
print get_class($rec) . "\n";
print $rec->myNewMethod() . "\n";

?>
--EXPECT--
MyRecord
NB
pear/test/File_MARC/tests/marc_005.phpt000064400000006657151732710170013522 0ustar00--TEST--
marc_005: Ensure a duplicated record is a deep copy; test deleteFields()
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

$marc_record = $marc_file->next();
$copy_record = $marc_record;
$duplicate_record = clone $marc_record;

$num_deleted1 = $marc_record->deleteFields('020');
print "Deleted $num_deleted1 fields from the original record.\n";

$num_deleted2 = $copy_record->deleteFields('8\\d\\d', true);
print "Deleted $num_deleted2 fields from the shallow copy record.\n";

$num_deleted3 = $duplicate_record->deleteFields('9\\d\\d', true);
print "Deleted $num_deleted3 fields from the duplicate record.\n";

print "Original:\n";
print $marc_record;

print "\nCopy:\n";
print $copy_record;

print "\nDuplicate:\n";
print $duplicate_record;
print "\n";

?>
--EXPECT--
Deleted 1 fields from the original record.
Deleted 12 fields from the shallow copy record.
Deleted 7 fields from the duplicate record.
Original:
LDR 01850     2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra ber�ttelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
005     20050204111518.0

Copy:
LDR 01850     2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra ber�ttelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
005     20050204111518.0

Duplicate:
LDR 01850     2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra ber�ttelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
005     20050204111518.0
pear/test/File_MARC/tests/marc_003.phpt000064400000002550151732710170013504 0ustar00--TEST--
marc_003: getFields() with various regular expressions
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

print "Test with a simple string\n";
while ($marc_record = $marc_file->next()) {
  print "\nNext record:\n";
  $fields = $marc_record->getFields('650');
  foreach ($fields as $field) {
    print $field;
    print "\n";
  }
}

print "\nTest with regular expression\n";
$marc_file = new File_MARC($dir . '/' . 'music.mrc');
while ($marc_record = $marc_file->next()) {
  print "\nNext record:\n";
  $fields = $marc_record->getFields('00\d', true);
  foreach ($fields as $field) {
    print $field;
    print "\n";
  }
}

?>
--EXPECT--
Test with a simple string

Next record:
650  0 _aJazz.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.

Next record:
650  0 _aJazz
       _y1971-1980.

Next record:
650  0 _aJazz.

Test with regular expression

Next record:
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   

Next record:
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d

Next record:
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
pear/test/File_MARC/tests/marc_subfield_001.phpt000064400000001335151732710170015357 0ustar00--TEST--
marc_subfield_001: Exercise basic methods for File_MARC_Subfield class
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// test constructor
$subfield = new File_MARC_Subfield('a', 'wasssup');

// test get methods
print "Code: " . $subfield->getCode() . "\n";
print "Data: " . $subfield->getData() . "\n";

// test __toString implementation
print $subfield;
print "\n";

// test raw output implementation
print $subfield->toRaw() . "\n";

// test isEmpty()
if ($subfield->isEmpty()) {
    print "Subfield is empty\n";
}
else {
    print "Subfield is not empty\n";
}
?>
--EXPECT--
Code: a
Data: wasssup
[a]: wasssup
awasssup
Subfield is not empty
pear/test/File_MARC/tests/marc_004.phpt000064400000022545151732710170013513 0ustar00--TEST--
marc_004: Delete fields and subfields
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

print "\nDelete all fields with tag 650\n";
while ($marc_record = $marc_file->next()) {
  print "\nNext record:\n";
  $fields = $marc_record->getFields('650');
  foreach ($fields as $field) {
    $field->delete();
  }
  print $marc_record;
}

$marc_file = null;
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

print "\nDelete all subfields with code 'a' from fields with tag 650\n";
while ($marc_record = $marc_file->next()) {
  print "\nNext record:\n";
  $fields = $marc_record->getFields('650');
  foreach ($fields as $field) {
    $sf = $field->getSubfields('a');
    foreach ($sf as $subfield) {
      $field->deleteSubfield($subfield);
    }
  }
  print $marc_record;
}

?>
--EXPECT--
Delete all fields with tag 650

Next record:
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

Next record:
LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

Next record:
LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual

Delete all subfields with code 'a' from fields with tag 650

Next record:
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
650  0 _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

Next record:
LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
650  0 _y1971-1980.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

Next record:
LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
pear/test/File_MARC/tests/marc_006.phpt000064400000002443151732710170013510 0ustar00--TEST--
marc_006: test read.php
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php

$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Read MARC records from a stream (a file, in this case)
$marc_source = new File_MARC($dir . '/' . 'example.mrc');

// Retrieve the first MARC record from the source
$marc_record = $marc_source->next();

// Retrieve a personal name field from the record
$names = $marc_record->getFields('100');
foreach ($names as $name_field) {
    // Now print the $a subfield
    switch ($name_field->getIndicator(1)) {
    case 0:
	print "Forename: ";
	break;

    case 1:
	print "Surname: ";
	break;

    case 2:
	print "Family name: ";
	break;
    }
    $name = $name_field->getSubfields('a');
    if (count($name) == 1) {
	print $name[0]->getData() . "\n";
    }
    else {
	print "Error -- \$a subfield appears more than once in this field!";
    }
}

// Retrieve all series statement fields
// Series statement fields start with a 4 (PCRE)
$subjects = $marc_record->getFields('^4', true);

// Iterate through all of the returned series statement fields
foreach ($subjects as $field) {
    // print with File_MARC_Field_Data's magic __toString() method
    print $field;
}

?>
--EXPECT--
Surname: Jansson, Tove,
440  0 _aMumin-biblioteket,
       _x99-0698931-9
pear/test/File_MARC/tests/marc_lint_005.phpt000064400000005204151732710170014533 0ustar00--TEST--
marc_lint_005: Tests check_020() called separately
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
<?php include('tests/skipif_noispn.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Create test harness to allow direct calls to check methods:
class File_MARC_Lint_Test_Harness extends File_MARC_Lint
{
    public function check020($field)
    {
        return parent::check020($field);
    }

    // override warn method to echo instead of store in object:
    protected function warn($msg)
    {
        echo $msg . "\n";
    }
}

$marc_lint = new File_MARC_Lint_Test_Harness();

$testData = array(
    array('a' => "154879473"), //too few digits
    array('a' => "1548794743"), //invalid checksum
    array('a' => "15487947443"), //11 digits
    array('a' => "15487947443324"), //14 digits
    array('a' => "9781548794743"), //13 digit valid
    array('a' => "9781548794745"), //13 digit invalid
    array('a' => "1548794740 (10 : good checksum)"), //10 digit valid with qualifier
    array('a' => "1548794745 (10 : bad checksum)"), //10 digit invalid with qualifier
    array('a' => "1-54879-474-0 (hyphens and good checksum)"), //10 digit invalid with hyphens and qualifier
    array('a' => "1-54879-474-5 (hyphens and bad checksum)"), //10 digit invalid with hyphens and qualifier
    array('a' => "1548794740(10 : unspaced qualifier)"), //10 valid without space before qualifier
    array('a' => "1548794745(10 : unspaced qualifier : bad checksum)"), //10 invalid without space before qualifier
    array('z' => "1548794743"), //subfield z
);

foreach ($testData as $current) {
    $subfields = array();
    foreach ($current as $key => $value) {
        $subfields[] = new File_MARC_Subfield($key, $value);
    }
    $field = new File_MARC_Data_Field('020', $subfields, '', '');
    $marc_lint->check020($field);
}

?>
--EXPECT--
020: Subfield a has the wrong number of digits, 154879473.
020: Subfield a has bad checksum, 1548794743.
020: Subfield a has the wrong number of digits, 15487947443.
020: Subfield a has the wrong number of digits, 15487947443324.
020: Subfield a has bad checksum (13 digit), 9781548794745.
020: Subfield a has bad checksum, 1548794745 (10 : bad checksum).
020: Subfield a may have invalid characters.
020: Subfield a may have invalid characters.
020: Subfield a has bad checksum, 1-54879-474-5 (hyphens and bad checksum).
020: Subfield a qualifier must be preceded by space, 1548794740(10 : unspaced qualifier).
020: Subfield a qualifier must be preceded by space, 1548794745(10 : unspaced qualifier : bad checksum).
020: Subfield a has bad checksum, 1548794745(10 : unspaced qualifier : bad checksum).
pear/test/File_MARC/tests/marc_013.phpt000064400000020513151732710170013504 0ustar00--TEST--
marc_013: test formatField() convenience method
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

while ($marc_record = $marc_file->next()) {
  $fields = $marc_record->getFields();
  foreach ($fields as $field) {
    print $field;
    print "\n";
    print $field->formatField();
    print "\n";
    print $field->formatField(array('a', '2', 'c'));
    print "\n";
  }
}

?>
--EXPECT--
001     000073594
000073594
000073594
004     AAJ5802
AAJ5802
AAJ5802
005     20030415102100.0
20030415102100.0
20030415102100.0
008     801107s1977    nyujza                   
801107s1977    nyujza                   
801107s1977    nyujza                   
010    _a   77771106 
77771106

035    _a(CaOTUIC)15460184
(CaOTUIC)15460184

035 9  _aAAJ5802
AAJ5802

040    _aLC
LC

050 00 _aM1366
       _b.M62
       _dM1527.2
M1366 .M62 M1527.2
.M62 M1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
The Modern Jazz Quartet : The legendary profile. --
The legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
New York : M.J.Q. Music, c1977.
M.J.Q. Music,
300    _ascore (72 p.) ;
       _c31 cm.
score (72 p.) ; 31 cm.

500    _aFor piano, vibraphone, drums, and double bass.
For piano, vibraphone, drums, and double bass.

505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
Lewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.

650  0 _aJazz.
Jazz.

650  0 _aMotion picture music
       _vExcerpts
       _vScores.
Motion picture music -- Excerpts -- Scores.
-- Excerpts -- Scores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
Lewis, John, 1920- Selections. 1977.
1920- Selections. 1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
Jackson, Milt. Martyrs. 1977.
Martyrs. 1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
Jackson, Milt. Legendary profile. 1977.
Legendary profile. 1977.
740 4  _aThe legendary profile.
The legendary profile.

852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5
MUSIC MAIN folio M1366 M62 1 Marvin Duchow Music
MUSIC folio M1366 M62 1 Marvin Duchow Music
001     001878039
001878039
001878039
005     20050110174900.0
20050110174900.0
20050110174900.0
007     sd fungnn|||e|
sd fungnn|||e|
sd fungnn|||e|
008     940202r19931981nyujzn   i              d
940202r19931981nyujzn   i              d
940202r19931981nyujzn   i              d
024 1  _a7464573372
7464573372

028 02 _aJK 57337
       _bRed Baron
JK 57337 Red Baron
Red Baron
035    _a(OCoLC)29737267
(OCoLC)29737267

040    _aSVP
       _cSVP
       _dLGG
SVP SVP LGG
LGG
100 1  _aDesmond, Paul,
       _d1924-
Desmond, Paul, 1924-
1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
Paul Desmond & the Modern Jazz Quartet [sound recording]
[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
New York, N.Y. : Red Baron : Manufactured by Sony Music Entertainment, p1993.
Red Baron : Manufactured by Sony Music Entertainment,
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
1 sound disc (39 min.) : digital ; 4 3/4 in.
digital ;
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
Paul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.

500    _aAll arrangements by John Lewis.
All arrangements by John Lewis.

518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
Recorded live on December 25, 1971 at Town Hall, NYC.

500    _aOriginally released in 1981 by Finesse as LP FW 27487.
Originally released in 1981 by Finesse as LP FW 27487.

500    _aProgram notes by Irving Townsend, June 1981, on container insert.
Program notes by Irving Townsend, June 1981, on container insert.

505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
Greensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.

650  0 _aJazz
       _y1971-1980.
Jazz -- 1971-1980.
-- 1971-1980.
700 1  _aLewis, John,
       _d1920-
Lewis, John, 1920-
1920-
710 2  _aModern Jazz Quartet.
Modern Jazz Quartet.

740 0  _aPaul Desmond and the Modern Jazz Quartet.
Paul Desmond and the Modern Jazz Quartet.

001     001964482
001964482
001964482
005     20060626132700.0
20060626132700.0
20060626132700.0
007     sd fzngnn|m|e|
sd fzngnn|m|e|
sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
871211p19871957nyujzn                  d
871211p19871957nyujzn                  d
024 1  _a4228332902
4228332902

028 01 _a833 290-2
       _bVerve
833 290-2 Verve
Verve
033 0  _a19571027
       _b6299
       _cD56
19571027 6299 D56
6299
033 0  _a196112--
       _b3804
       _cN4
196112-- 3804 N4
3804
033 0  _a19571019
       _b4104
       _cC6
19571019 4104 C6
4104
033 0  _a197107--
       _b6299
       _cV7
197107-- 6299 V7
6299
035    _a(OCoLC)17222092
(OCoLC)17222092

040    _aCPL
       _cCPL
       _dOCL
       _dLGG
CPL CPL OCL LGG
OCL LGG
048    _apz01
       _aka01
       _asd01
       _apd01
pz01 ka01 sd01 pd01

110 2  _aModern Jazz Quartet.
       _4prf
Modern Jazz Quartet. prf
prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
The Modern Jazz Quartet plus [sound recording].
[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
[New York] : Verve, p1987.
Verve,
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
1 sound disc : digital ; 4 3/4 in.
digital ;
440  0 _aCompact jazz
Compact jazz

511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
Modern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.

518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
Recorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).

500    _aCompact disc.
Compact disc.

500    _aAnalog recording.
Analog recording.

505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
The golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).

650  0 _aJazz.
Jazz.

700 1  _aJackson, Milt.
       _4prf
Jackson, Milt. prf
prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
Peterson, Oscar, 1925- prf
1925- prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
Brown, Ray, 1926-2002. prf
1926-2002. prf
700 1  _aThigpen, Ed.
       _4prf
Thigpen, Ed. prf
prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
Hayes, Louis, 1937- prf
1937- prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
MUSIC AV CD 1131 Marvin Duchow Music Audio-Visual
MUSIC CD 1131 Marvin Duchow Music Audio-Visual
pear/test/File_MARC/tests/sandburg.xml000064400000006411151732710170013632 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record>
  <leader>01142cam  2200301 a 4500</leader>
  <controlfield tag="001">   92005291 </controlfield>
  <controlfield tag="003">DLC</controlfield>
  <controlfield tag="005">19930521155141.9</controlfield>
  <controlfield tag="008">920219s1993    caua   j      000 0 eng  </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   92005291 </subfield>
  </datafield>
  <datafield tag="020" ind1=" " ind2=" ">
   <subfield code="a">0152038655 :</subfield>
   <subfield code="c">$15.95</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">DLC</subfield>
   <subfield code="c">DLC</subfield>
   <subfield code="d">DLC</subfield>
  </datafield>
  <datafield tag="042" ind1=" " ind2=" ">
   <subfield code="a">lcac</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">PS3537.A618</subfield>
   <subfield code="b">A88 1993</subfield>
  </datafield>
  <datafield tag="082" ind1="0" ind2="0">
   <subfield code="a">811/.52</subfield>
   <subfield code="2">20</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Sandburg, Carl,</subfield>
   <subfield code="d">1878-1967.</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
   <subfield code="a">Arithmetic /</subfield>
   <subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
   <subfield code="a">1st ed.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">San Diego :</subfield>
   <subfield code="b">Harcourt Brace Jovanovich,</subfield>
   <subfield code="c">c1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 v. (unpaged) :</subfield>
   <subfield code="b">ill. (some col.) ;</subfield>
   <subfield code="c">26 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">One Mylar sheet included in pocket.</subfield>
  </datafield>
  <datafield tag="520" ind1=" " ind2=" ">
   <subfield code="a">A poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Juvenile poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Children's poetry, American.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">American poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Visual perception.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Rand, Ted,</subfield>
   <subfield code="e">ill.</subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/marc_xml_009.phpt000064400000002131151732710170014365 0ustar00--TEST--
marc_xml_009: convert a MARCXML record with an overly long leader to MARC
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'bad_leader.xml');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toRaw();
}
?>
--EXPECT--
00749cam a2200241 454500001001400000003000600014005001700020008004100037020001800078020001500096035002100111040003600132050002400168100002500192245007800217260003700295300002100332504004100353650001700394650002200411852004800433901002600481LIBN539044247OCoLC20081030150430.0070630|||||    |||           000 0 eng d  a9781856075442  a1856075443  a(OCoLC)156822300  aBTCTAcBTCTAdYDXCPdBAKERdEMT 4aBL2747.2b.W45 20061 aWhite, Stephen Ross.10aSpace for unknowing :bthe place of agnosis in faith /cStephen R. White.  aDublin :bColumba Press,cc2006.  a160 p. ;c22 cm.  aIncludes bibliographical references. 0aAgnosticism. 0aBelief and doubt.  a1h230 WHIp11111027105040t65112549p26.95  aLIBN539044247bSystem
pear/test/File_MARC/tests/marc_lint_001.phpt000064400000010645151732710170014534 0ustar00--TEST--
marc_lint_001: Full test of Lint suite
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
<?php include('tests/skipif_noispn.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_lint = new File_MARC_Lint();

print "Test records in camel.mrc\n";
$marc_file = new File_MARC($dir . '/' . 'camel.mrc');
while ($marc_record = $marc_file->next()) {
  $warnings = $marc_lint->checkRecord($marc_record);
  foreach ($warnings as $warning) {
    print $warning . "\n";
  }
}

print "\nTest from a constructed record\n";
$rec = new File_MARC_Record();
$rec->setLeader("00000nam  22002538a 4500");
$rec->appendField(
    new File_MARC_Data_Field(
        '041',
        array(
            new File_MARC_Subfield('a', 'end'),
            new File_MARC_Subfield('a', 'fren')
        ),
        "0", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '043',
        array(
            new File_MARC_Subfield('a', 'n-us-pn')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '082',
        array(
            new File_MARC_Subfield('a', '005.13/3'),
            // typo 'R' for 'W' and missing 'b' subfield
            new File_MARC_Subfield('R', 'all'),
            new File_MARC_Subfield('2', '21')
        ),
        "0", "4"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '082',
        array(
            new File_MARC_Subfield('a', '005.13'),
            new File_MARC_Subfield('b', 'Wall'),
            new File_MARC_Subfield('2', '14')
        ),
        "1", "4"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '100',
        array(
            new File_MARC_Subfield('a', 'Wall, Larry')
        ),
        "1", "4"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '110',
        array(
            new File_MARC_Subfield('a', "O'Reilly & Associates.")
        ),
        "1", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '245',
        array(
            new File_MARC_Subfield('a', 'Programming Perl / '),
            new File_MARC_Subfield('a', 'Big Book of Perl /'),
            new File_MARC_Subfield('c', 'Larry Wall, Tom Christiansen & Jon Orwant.')
        ),
        "9", "0"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '250',
        array(
            new File_MARC_Subfield('a', '3rd ed.')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '250',
        array(
            new File_MARC_Subfield('a', '3rd ed.')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '260',
        array(
            new File_MARC_Subfield('a', 'Cambridge, Mass. : '),
            new File_MARC_Subfield('b', "O'Reilly, "),
            new File_MARC_Subfield('r', '2000.')
        ),
        "", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '590',
        array(
            new File_MARC_Subfield('a', 'Personally signed by Larry.')
        ),
        "4", ""
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '650',
        array(
            new File_MARC_Subfield('a', 'Perl (Computer program language)'),
            new File_MARC_Subfield('0', '(DLC)sh 95010633')
        ),
        "", "0"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '856',
        array(
            new File_MARC_Subfield('u', 'http://www.perl.com/')
        ),
        "4", "3"
    )
);
$rec->appendField(
    new File_MARC_Data_Field(
        '886',
        array(
            new File_MARC_Subfield('4', 'Some foreign thing'),
            new File_MARC_Subfield('q', 'Another foreign thing')
        ),
        "0", ""
    )
);
$warnings = $marc_lint->checkRecord($rec);
foreach ($warnings as $warning) {
  print $warning . "\n";
}

?>
--EXPECT--
Test records in camel.mrc
100: Indicator 1 must be 0, 1 or 3 but it's "2"
007: Subfields are not allowed in fields lower than 010

Test from a constructed record
1XX: Only one 1XX tag is allowed, but I found 2 of them.
041: Subfield _a, end (end), is not valid.
041: Subfield _a must be evenly divisible by 3 or exactly three characters if ind2 is not 7, (fren).
043: Subfield _a, n-us-pn, is not valid.
082: Subfield _R is not allowed.
100: Indicator 2 must be blank but it's "4"
245: Indicator 1 must be 0 or 1 but it's "9"
245: Subfield _a is not repeatable.
260: Subfield _r is not allowed.
856: Indicator 2 must be blank, 0, 1, 2 or 8 but it's "3"
pear/test/File_MARC/tests/music.mrc000064400000010256151732710200013122 0ustar0001145ncm  2200277 i 4500001001000000004000800010005001700018008004100035010001700076035002200093035001200115040000700127050002500134245005700159260003800216300002800254500005100282505026600333650001000599650004400609700004400653700003600697700004600733740002700779852006100806000073594AAJ580220030415102100.0801107s1977    nyujza                     a   77771106   a(CaOTUIC)154601849 aAAJ5802  aLC00aM1366b.M62dM1527.204aThe Modern Jazz Quartet :bThe legendary profile. --  aNew York :bM.J.Q. Music,cc1977.  ascore (72 p.) ;c31 cm.  aFor piano, vibraphone, drums, and double bass.0 aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile. 0aJazz. 0aMotion picture musicvExcerptsvScores.12aLewis, John,d1920-tSelections.f1977.12aJackson, Milt.tMartyrs.f1977.12aJackson, Milt.tLegendary profile.f1977.4 aThe legendary profile.00bMUSICcMAINkfoliohM1366iM62914Marvin Duchow Music5
01293cjm  2200289 a 450000100100000000500170001000700150002700800410004202400150008302800240009803500200012204000180014210000260016024500620018626000850024830000510033351101380038450000360052251800580055850000590061650000700067550501420074565000210088770000240090871000250093274000460095700187803920050110174900.0sd fungnn|||e|940202r19931981nyujzn   i              d1 a746457337202aJK 57337bRed Baron  a(OCoLC)29737267  aSVPcSVPdLGG1 aDesmond, Paul,d1924-10aPaul Desmond & the Modern Jazz Quarteth[sound recording]  aNew York, N.Y. :bRed Baron :bManufactured by Sony Music Entertainment,cp1993.  a1 sound disc (39 min.) :bdigital ;c4 3/4 in.0 aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.  aAll arrangements by John Lewis.  aRecorded live on December 25, 1971 at Town Hall, NYC.  aOriginally released in 1981 by Finesse as LP FW 27487.  aProgram notes by Irving Townsend, June 1981, on container insert.0 aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove. 0aJazzy1971-1980.1 aLewis, John,d1920-2 aModern Jazz Quartet.0 aPaul Desmond and the Modern Jazz Quartet.
01829cjm  2200385 a 450000100100000000500170001000700150002700800410004202400150008302800210009803300240011903300230014303300230016603300230018903500200021204000230023204800270025511000300028224500530031226000330036530000410039844000170043951102230045651802640067950000180094350000220096150502500098365000100123370000240124370000330126770000330130070000220133370000300135585200580138500196448220060626132700.0sd fzngnn|m|e|871211p19871957nyujzn                  d1 a422833290201a833 290-2bVerve0 a19571027b6299cD560 a196112--b3804cN40 a19571019b4104cC60 a197107--b6299cV7  a(OCoLC)17222092  aCPLcCPLdOCLdLGG  apz01aka01asd01apd012 aModern Jazz Quartet.4prf14aThe Modern Jazz Quartet plush[sound recording].  a[New York] :bVerve,cp1987.  a1 sound disc :bdigital ;c4 3/4 in. 0aCompact jazz0 aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.  aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).  aCompact disc.  aAnalog recording.0 aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20). 0aJazz.1 aJackson, Milt.4prf1 aPeterson, Oscar,d1925-4prf1 aBrown, Ray,d1926-2002.4prf1 aThigpen, Ed.4prf1 aHayes, Louis,d1937-4prf80bMUSICcAVhCD 11314Marvin Duchow Music5Audio-Visual
pear/test/File_MARC/tests/marc_xml_008.phpt000064400000030602151732710200014362 0ustar00--TEST--
marc_xml_008: generate a single collection of MARCXML records from a MARCXML record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$records = new File_MARCXML($dir . '/' . 'music.xml');

// Add the XML header and opening <collection> element
$records->toXMLHeader();

// Iterate through the retrieved records
while ($record = $records->next()) {

    // Change each 852 $c to "Audio-Visual"
    $holdings = $record->getFields('852');
    foreach ($holdings as $holding) {

        // Get the $c subfields from this field
        $formats = $holding->getSubfields('c');
        foreach ($formats as $format) {
            if ($format->getData('AV')) {
                $format->setData('Audio-Visual');
            }
        }
    }

    // Generate the XML output for this record
    print $record->toXML('UTF-8', true, false);
}
// Add the </collection> closing element and dump the XMLWriter contents
print $records->toXMLFooter();
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01145ncm a2200277 i 4500</leader>
  <controlfield tag="001">000073594</controlfield>
  <controlfield tag="004">AAJ5802</controlfield>
  <controlfield tag="005">20030415102100.0</controlfield>
  <controlfield tag="008">801107s1977    nyujza                   </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   77771106 </subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(CaOTUIC)15460184</subfield>
  </datafield>
  <datafield tag="035" ind1="9" ind2=" ">
   <subfield code="a">AAJ5802</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">LC</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">M1366</subfield>
   <subfield code="b">.M62</subfield>
   <subfield code="d">M1527.2</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="4">
   <subfield code="a">The Modern Jazz Quartet :</subfield>
   <subfield code="b">The legendary profile. --</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">New York :</subfield>
   <subfield code="b">M.J.Q. Music,</subfield>
   <subfield code="c">c1977.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">score (72 p.) ;</subfield>
   <subfield code="c">31 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">For piano, vibraphone, drums, and double bass.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">Lewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B́Ư.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Motion picture music</subfield>
   <subfield code="v">Excerpts</subfield>
   <subfield code="v">Scores.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Lewis, John,</subfield>
   <subfield code="d">1920-</subfield>
   <subfield code="t">Selections.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Martyrs.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Legendary profile.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
   <subfield code="a">The legendary profile.</subfield>
  </datafield>
  <datafield tag="852" ind1="0" ind2="0">
   <subfield code="b">MUSIC</subfield>
   <subfield code="c">Audio-Visual</subfield>
   <subfield code="k">folio</subfield>
   <subfield code="h">M1366</subfield>
   <subfield code="i">M62</subfield>
   <subfield code="9">1</subfield>
   <subfield code="4">Marvin Duchow Music</subfield>
   <subfield code="5"></subfield>
  </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01293cjm a2200289 a 4500</leader>
  <controlfield tag="001">001878039</controlfield>
  <controlfield tag="005">20050110174900.0</controlfield>
  <controlfield tag="007">sd fungnn|||e|</controlfield>
  <controlfield tag="008">940202r19931981nyujzn   i              d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
   <subfield code="a">7464573372</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="2">
   <subfield code="a">JK 57337</subfield>
   <subfield code="b">Red Baron</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(OCoLC)29737267</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">SVP</subfield>
   <subfield code="c">SVP</subfield>
   <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Desmond, Paul,</subfield>
   <subfield code="d">1924-</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
   <subfield code="a">Paul Desmond &amp; the Modern Jazz Quartet</subfield>
   <subfield code="h">[sound recording]</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">New York, N.Y. :</subfield>
   <subfield code="b">Red Baron :</subfield>
   <subfield code="b">Manufactured by Sony Music Entertainment,</subfield>
   <subfield code="c">p1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 sound disc (39 min.) :</subfield>
   <subfield code="b">digital ;</subfield>
   <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
   <subfield code="a">Paul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">All arrangements by John Lewis.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
   <subfield code="a">Recorded live on December 25, 1971 at Town Hall, NYC.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Originally released in 1981 by Finesse as LP FW 27487.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Program notes by Irving Townsend, June 1981, on container insert.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">Greensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz</subfield>
   <subfield code="y">1971-1980.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Lewis, John,</subfield>
   <subfield code="d">1920-</subfield>
  </datafield>
  <datafield tag="710" ind1="2" ind2=" ">
   <subfield code="a">Modern Jazz Quartet.</subfield>
  </datafield>
  <datafield tag="740" ind1="0" ind2=" ">
   <subfield code="a">Paul Desmond and the Modern Jazz Quartet.</subfield>
  </datafield>
 </record>
 <record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>01829cjm a2200385 a 4500</leader>
  <controlfield tag="001">001964482</controlfield>
  <controlfield tag="005">20060626132700.0</controlfield>
  <controlfield tag="007">sd fzngnn|m|e|</controlfield>
  <controlfield tag="008">871211p19871957nyujzn                  d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
   <subfield code="a">4228332902</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="1">
   <subfield code="a">833 290-2</subfield>
   <subfield code="b">Verve</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">19571027</subfield>
   <subfield code="b">6299</subfield>
   <subfield code="c">D56</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">196112--</subfield>
   <subfield code="b">3804</subfield>
   <subfield code="c">N4</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">19571019</subfield>
   <subfield code="b">4104</subfield>
   <subfield code="c">C6</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
   <subfield code="a">197107--</subfield>
   <subfield code="b">6299</subfield>
   <subfield code="c">V7</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(OCoLC)17222092</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">CPL</subfield>
   <subfield code="c">CPL</subfield>
   <subfield code="d">OCL</subfield>
   <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="048" ind1=" " ind2=" ">
   <subfield code="a">pz01</subfield>
   <subfield code="a">ka01</subfield>
   <subfield code="a">sd01</subfield>
   <subfield code="a">pd01</subfield>
  </datafield>
  <datafield tag="110" ind1="2" ind2=" ">
   <subfield code="a">Modern Jazz Quartet.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="4">
   <subfield code="a">The Modern Jazz Quartet plus</subfield>
   <subfield code="h">[sound recording].</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">[New York] :</subfield>
   <subfield code="b">Verve,</subfield>
   <subfield code="c">p1987.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 sound disc :</subfield>
   <subfield code="b">digital ;</subfield>
   <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="440" ind1=" " ind2="0">
   <subfield code="a">Compact jazz</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
   <subfield code="a">Modern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
   <subfield code="a">Recorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Compact disc.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Analog recording.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">The golden striker (4:08) -- On Green Dolphin Street (7:28) -- D &amp; E (4:55) -- I'll remember April (4:51) -- Cort©·ge (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Peterson, Oscar,</subfield>
   <subfield code="d">1925-</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Brown, Ray,</subfield>
   <subfield code="d">1926-2002.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Thigpen, Ed.</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Hayes, Louis,</subfield>
   <subfield code="d">1937-</subfield>
   <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="852" ind1="8" ind2="0">
   <subfield code="b">MUSIC</subfield>
   <subfield code="c">Audio-Visual</subfield>
   <subfield code="h">CD 1131</subfield>
   <subfield code="4">Marvin Duchow Music</subfield>
   <subfield code="5">Audio-Visual</subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/marc_015.phpt000064400000011414151732710200013500 0ustar00--TEST--
marc_015: ensure that pandemonium does not occur if a record doesn't have a given field
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

while ($marc_record = $marc_file->next()) {

  // Record #2 doesn't contain an 852; getField() returns false
  $mfhd = $marc_record->getField('852');
  if ($mfhd) {
    $mfhd = $mfhd->getSubfield('b');
  }

  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
650  0 _aJazz.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
650  0 _aJazz
       _y1971-1980.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
650  0 _aJazz.
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
pear/test/File_MARC/tests/marc_xml_007.phpt000064400000001732151732710200014363 0ustar00--TEST--
marc_xml_007: test getTag(), isControlField(), and isDataField() convenience methods on MARCXML
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'bigarchive.xml');

while ($marc_record = $marc_file->next()) {
  $fields = $marc_record->getFields();
  foreach ($fields as $field) {
    print $field->getTag();
    if ($field->isControlField()) {
      print "\tControl field!";
    }
    if ($field->isDataField()) {
      print "\tData field!";
    }
    print "\n";
  }
}

?>
--EXPECT--
001	Control field!
003	Control field!
005	Control field!
006	Control field!
007	Control field!
008	Control field!
037	Data field!
040	Data field!
245	Data field!
246	Data field!
260	Data field!
300	Data field!
500	Data field!
500	Data field!
500	Data field!
510	Data field!
510	Data field!
533	Data field!
651	Data field!
830	Data field!
856	Data field!
909	Data field!
pear/test/File_MARC/tests/marc_011.phpt000064400000005303151732710200013474 0ustar00--TEST--
marc_011: iterate and pretty print a MARC record (SOURCE_STRING)
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Pull the MARC records into a string (as though we got it from YAZ)
$marc_string = file_get_contents($dir . '/' . 'example.mrc');

// Use the File_MARC::SOURCE_STRING flag to indicate that our source is a, uh, string
$marc_file = new File_MARC($marc_string, File_MARC::SOURCE_STRING);

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01850     2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
020    _a9515008808
       _cFIM 72:00
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra ber�ttelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
841    _5Li
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5SEE
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5L
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5NB
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5Q
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5S
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
852    _5NB
       _bNB
       _cNB98:12
       _hplikt
       _jR, 980520
852    _5Li
       _bLi
       _cCNB
       _hh,u
852    _5SEE
       _bSEE
852    _5Q
       _bQ
       _j98947
852    _5L
       _bL
       _c0100
       _h98/
       _j3043 H
852    _5S
       _bS
       _hSv97
       _j7235
900 1s _aYanson, Tobe,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonov�, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansone, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonova, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
976  2 _aHcd,u
       _bSk�nlitteratur
005     20050204111518.0
pear/test/File_MARC/tests/marc_022.phpt000064400000024412151732710200013500 0ustar00--TEST--
marc_022: Insert fields
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'music.mrc');

print "\nInsert a new 100 field before the first 650\n";
while ($record = $marc_file->next()) {
  print "\nNext record:\n";
  // Create the new field
  $subfields = null;
  $subfields[] = new File_MARC_Subfield('a', 'Scott, Daniel.');
  $new_field = new File_MARC_Data_Field('100', $subfields, 0, null);

  // Retrieve the target field for our insertion point
  $subject = $record->getFields('650');

  // Insert the new field
  if (is_array($subject)) {
    $record->insertField($new_field, $subject[0], true);
  }
  elseif ($subject) {
    $record->insertField($new_field, $subject, true);
  }
  print $record;
}

$record = null;
$marc_file = new File_MARC($dir . '/' . 'music.mrc');
print "\nInsert a new 100 field after the first 650\n";
while ($record = $marc_file->next()) {
  print "\nNext record:\n";
  // Create the new field
  $subfields = null;
  $subfields[] = new File_MARC_Subfield('a', 'Scott, Daniel.');
  $new_field = new File_MARC_Data_Field('100', $subfields, 0, null);

  // Retrieve the target field for our insertion point
  $subject = $record->getFields('650');

  // Insert the new field
  if (is_array($subject)) {
    $record->insertField($new_field, $subject[0]);
  }
  elseif ($subject) {
    $record->insertField($new_field, $subject);
  }
  print $record;
}
?>
--EXPECT--
Insert a new 100 field before the first 650

Next record:
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
100    _aScott, Daniel.
650  0 _aJazz.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

Next record:
LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
100    _aScott, Daniel.
650  0 _aJazz
       _y1971-1980.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

Next record:
LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
100    _aScott, Daniel.
650  0 _aJazz.
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual

Insert a new 100 field after the first 650

Next record:
LDR 01145ncm  2200277 i 4500
001     000073594
004     AAJ5802
005     20030415102100.0
008     801107s1977    nyujza                   
010    _a   77771106 
035    _a(CaOTUIC)15460184
035 9  _aAAJ5802
040    _aLC
050 00 _aM1366
       _b.M62
       _dM1527.2
245 04 _aThe Modern Jazz Quartet :
       _bThe legendary profile. --
260    _aNew York :
       _bM.J.Q. Music,
       _cc1977.
300    _ascore (72 p.) ;
       _c31 cm.
500    _aFor piano, vibraphone, drums, and double bass.
505 0  _aLewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.
650  0 _aJazz.
100    _aScott, Daniel.
650  0 _aMotion picture music
       _vExcerpts
       _vScores.
700 12 _aLewis, John,
       _d1920-
       _tSelections.
       _f1977.
700 12 _aJackson, Milt.
       _tMartyrs.
       _f1977.
700 12 _aJackson, Milt.
       _tLegendary profile.
       _f1977.
740 4  _aThe legendary profile.
852 00 _bMUSIC
       _cMAIN
       _kfolio
       _hM1366
       _iM62
       _91
       _4Marvin Duchow Music
       _5

Next record:
LDR 01293cjm  2200289 a 4500
001     001878039
005     20050110174900.0
007     sd fungnn|||e|
008     940202r19931981nyujzn   i              d
024 1  _a7464573372
028 02 _aJK 57337
       _bRed Baron
035    _a(OCoLC)29737267
040    _aSVP
       _cSVP
       _dLGG
100 1  _aDesmond, Paul,
       _d1924-
245 10 _aPaul Desmond & the Modern Jazz Quartet
       _h[sound recording]
260    _aNew York, N.Y. :
       _bRed Baron :
       _bManufactured by Sony Music Entertainment,
       _cp1993.
300    _a1 sound disc (39 min.) :
       _bdigital ;
       _c4 3/4 in.
511 0  _aPaul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.
500    _aAll arrangements by John Lewis.
518    _aRecorded live on December 25, 1971 at Town Hall, NYC.
500    _aOriginally released in 1981 by Finesse as LP FW 27487.
500    _aProgram notes by Irving Townsend, June 1981, on container insert.
505 0  _aGreensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here's that rainy day -- East of the sun -- Bags' new groove.
650  0 _aJazz
       _y1971-1980.
100    _aScott, Daniel.
700 1  _aLewis, John,
       _d1920-
710 2  _aModern Jazz Quartet.
740 0  _aPaul Desmond and the Modern Jazz Quartet.

Next record:
LDR 01829cjm  2200385 a 4500
001     001964482
005     20060626132700.0
007     sd fzngnn|m|e|
008     871211p19871957nyujzn                  d
024 1  _a4228332902
028 01 _a833 290-2
       _bVerve
033 0  _a19571027
       _b6299
       _cD56
033 0  _a196112--
       _b3804
       _cN4
033 0  _a19571019
       _b4104
       _cC6
033 0  _a197107--
       _b6299
       _cV7
035    _a(OCoLC)17222092
040    _aCPL
       _cCPL
       _dOCL
       _dLGG
048    _apz01
       _aka01
       _asd01
       _apd01
110 2  _aModern Jazz Quartet.
       _4prf
245 14 _aThe Modern Jazz Quartet plus
       _h[sound recording].
260    _a[New York] :
       _bVerve,
       _cp1987.
300    _a1 sound disc :
       _bdigital ;
       _c4 3/4 in.
440  0 _aCompact jazz
511 0  _aModern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.
518    _aRecorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).
500    _aCompact disc.
500    _aAnalog recording.
505 0  _aThe golden striker (4:08) -- On Green Dolphin Street (7:28) -- D & E (4:55) -- I'll remember April (4:51) -- Cortège (7:15) -- Now's the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- 'Round midnight (3:56) -- Three windows (7:20).
650  0 _aJazz.
100    _aScott, Daniel.
700 1  _aJackson, Milt.
       _4prf
700 1  _aPeterson, Oscar,
       _d1925-
       _4prf
700 1  _aBrown, Ray,
       _d1926-2002.
       _4prf
700 1  _aThigpen, Ed.
       _4prf
700 1  _aHayes, Louis,
       _d1937-
       _4prf
852 80 _bMUSIC
       _cAV
       _hCD 1131
       _4Marvin Duchow Music
       _5Audio-Visual
pear/test/File_MARC/tests/marc_014.phpt000064400000006763151732710200013512 0ustar00--TEST--
marc_014: Add fields to a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Get ourselves a MARC record
$marc_file = new File_MARC($dir . '/' . 'example.mrc');
$marc_record = $marc_file->next();

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// create a data field
$data_field = new File_MARC_Data_Field('100', $subfields, '0');

// append the data field
$marc_record->appendField($data_field);

// create a control field
$ctrl_field = new File_MARC_Control_Field('001', '01234567890');

// prepend the control field
$marc_record->prependField($ctrl_field);

// reproduce test case reported by Mark Jordan
$subfields_966_2[] = new File_MARC_Subfield('l', 'web');
$subfields_966_2[] = new File_MARC_Subfield('r', '0');
$subfields_966_2[] = new File_MARC_Subfield('s', 'b');
$subfields_966_2[] = new File_MARC_Subfield('i', '49');
$subfields_966_2[] = new File_MARC_Subfield('c', '1');
$field_966_2 = new File_MARC_Data_Field('966', $subfields_966_2, null, null);
$marc_record->appendField($field_966_2);

// let's see the results
print utf8_encode($marc_record);
print "\n";

?>
--EXPECT--
LDR 01850     2200517   4500
001     01234567890
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
020    _a9515008808
       _cFIM 72:00
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra berättelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
841    _5Li
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5SEE
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5L
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5NB
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5Q
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5S
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
852    _5NB
       _bNB
       _cNB98:12
       _hplikt
       _jR, 980520
852    _5Li
       _bLi
       _cCNB
       _hh,u
852    _5SEE
       _bSEE
852    _5Q
       _bQ
       _j98947
852    _5L
       _bL
       _c0100
       _h98/
       _j3043 H
852    _5S
       _bS
       _hSv97
       _j7235
900 1s _aYanson, Tobe,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonová, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansone, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonova, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
976  2 _aHcd,u
       _bSkönlitteratur
005     20050204111518.0
100 0  _anothing
       _zeverything
966    _lweb
       _r0
       _sb
       _i49
       _c1
pear/test/File_MARC/tests/marc_16783.phpt000064400000004672151732710200013673 0ustar00--TEST--
marc_16783: iterate and pretty print a non-compliant MARC record (tag = '30-')
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'bad_example.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01853    a2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
020    _a9515008808
       _cFIM 72:00
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra bert̃telser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
841    _5Li
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5SEE
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5L
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5NB
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5Q
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5S
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
852    _5NB
       _bNB
       _cNB98:12
       _hplikt
       _jR, 980520
852    _5Li
       _bLi
       _cCNB
       _hh,u
852    _5SEE
       _bSEE
852    _5Q
       _bQ
       _j98947
852    _5L
       _bL
       _c0100
       _h98/
       _j3043 H
852    _5S
       _bS
       _hSv97
       _j7235
900 1s _aYanson, Tobe,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonov,̀ Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansone, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonova, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
976  2 _aHcd,u
       _bSkn̲litteratur
005     20050204111518.0
pear/test/File_MARC/tests/marc_record_001.phpt000064400000001061151732710200015026 0ustar00--TEST--
marc_record_001: create a MARC record from scratch
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc = new File_MARC_Record();

$marc->appendField(new File_MARC_Data_Field('245', array(
        new File_MARC_Subfield('a', 'Main title: '),
        new File_MARC_Subfield('b', 'subtitle'),
        new File_MARC_Subfield('c', 'author')
    ), null, null
));

print $marc;

?>
--EXPECT--
LDR                         
245    _aMain title: 
       _bsubtitle
       _cauthor
pear/test/File_MARC/tests/marc_020.phpt000064400000007573151732710200013507 0ustar00--TEST--
marc_020: Test MARC binary output
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Get ourselves a MARC record
$marc_file = new File_MARC($dir . '/' . 'example.mrc');
$marc_record = $marc_file->next();

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// create a data field
$data_field = new File_MARC_Data_Field('100', $subfields, '0');

// append the data field
$marc_record->appendField($data_field);

// create a control field
$ctrl_field = new File_MARC_Control_Field('001', '01234567890');

// prepend the control field
$marc_record->prependField($ctrl_field);

// reproduce test case reported by Mark Jordan
$subfields_966_2[] = new File_MARC_Subfield('l', 'web');
$subfields_966_2[] = new File_MARC_Subfield('r', '0');
$subfields_966_2[] = new File_MARC_Subfield('s', 'b');
$subfields_966_2[] = new File_MARC_Subfield('i', '49');
$subfields_966_2[] = new File_MARC_Subfield('c', '1');
$field_966_2 = new File_MARC_Data_Field('966', $subfields_966_2, null, null);
$marc_record->appendField($field_966_2);

// let's see the results
print convert_uuencode($marc_record->toRaw());

?>
--EXPECT--
M,#$Y-#,@("`@(#(R,#`U-3,@("`T-3`P,#`Q,#`Q,C`P,#`P,#`Q,#`Q,3`P
M,#$R,#`S,#`P-S`P,#(S,#`X,#`S.3`P,#,P,#(P,#`R-C`P,#8Y,#,U,#`Q
M-3`P,#DU,#0P,#`P-S`P,3$P,#0R,#`Q,C`P,3$W,#@T,#`Q.#`P,3(Y,#@T
M,#`Q.#`P,30W,#@T,#`R,3`P,38U,#@T,#`R,C`P,3@V,3`P,#`S,#`P,C`X
M,C0U,#`V,C`P,C,X,C4P,#`Q,S`P,S`P,C8P,#`U.#`P,S$S,S`P,#`S,S`P
M,S<Q-#0P,#`S-S`P-#`T-3`P,#`R,S`P-#0Q-3DY,#`Q,#`P-#8T-S0P,#`R
M-#`P-#<T-S<U,#`S-#`P-#DX.#0Q,#`T.#`P-3,R.#0Q,#`T.3`P-3@P.#0Q
M,#`T-S`P-C(Y.#0Q,#`T.#`P-C<V.#0Q,#`T-S`P-S(T.#0Q,#`T-S`P-S<Q
M.#4R,#`S.#`P.#$X.#4R,#`R,3`P.#4V.#4R,#`Q,S`P.#<W.#4R,#`Q-C`P
M.#DP.#4R,#`R.#`P.3`V.#4R,#`R,3`P.3,T.3`P,#`U-C`P.34U.3`P,#`V
M,#`Q,#$Q.3`P,#`U-S`Q,#<Q.3`P,#`U-C`Q,3(X.3`P,#`U-S`Q,3@T.3`P
M,#`V,#`Q,C0Q.3<V,#`R-C`Q,S`Q,#`U,#`Q-S`Q,S(W,3`P,#`R-#`Q,S0T
M.38V,#`R,3`Q,S8X'C`Q,C,T-38W.#DP'C`P,#`P,#`P-#0>14U)3$1!'CDX
M,#$R,',Q.3DX("`@(&9I("`@("!J("`@("`@,#`P(#`@<W=E'B`@'V$Y-3$U
M,#`X.#`X'V-&24T@-S(Z,#`>("`?.3DU,34P,#@X,#@>("`?84Y"'B`@'SE.
M0A\Y4T5%'B`@'V%(8V0L=1\R:W-S8B\V'B`@'S5.0A]A=4AC'S)K<W-B'B`@
M'S53144?84AC9A\R:W-S8B\V'B`@'S51'V%(8V0L=68?,FMS<V(O-AXQ(!]A
M2F%N<W-O;BP@5&]V92P?9#$Y,30M,C`P,1XP-!]A1&5T(&]S>6YL:6=A(&)A
M<FYE="!O8V@@86YD<F$@8F5RY'1T96QS97(@+Q]C5&]V92!*86YS<V]N'B`@
M'V$W+B!U<'!L+AX@(!]A2&5L<VEN9V9O<G,@.A]B4V-H:6QD="P?8S$Y.3@@
M.Q]E*$9A;'5N(#H?9E-C86YD8F]O:RD>("`?83$V-BP@6S1=(',N(#H?8FEL
M;"X@.Q]C,C$@8VT>(#`?84UU;6EN+6)I8FQI;W1E:V5T+!]X.3DM,#8Y.#DS
M,2TY'B`@'V%/<FEG:6YA;'5P<&PN(#$Y-C(>("`?84QI.B!3'C0@'V%$970@
M;W-Y;FQI9V$@8F%R;F5T'C$@'WHY-3$M-3`M,#,X-2TW'W<Y-3$U,#`S.#4W
M'SDP-QX@(!\U3&D?87AA'V(P,C`Q,#@P=2`@("`P("`@-#`P,'5U("`@?#`P
M,#`P,!]E,1X@(!\U4T5%'V%X81]B,#(P,3`X,'4@("`@,"`@(#0P,#!U=2`@
M('PP,#`P,#`?93$>("`?-4P?87AA'V(P,C`Q,#@P=2`@("`P("`@-#`P,'5U
M("`@?#`P,#`P,!]E,1X@(!\U3D(?87AA'V(P,C`Q,#@P=2`@("`P("`@-#`P
M,'5U("`@?#`P,#`P,!]E,1X@(!\U41]A>&$?8C`R,#$P.#!U("`@(#`@("`T
M,#`P=74@("!\,#`P,#`P'V4Q'B`@'S53'V%X81]B,#(P,3`X,'4@("`@,"`@
M(#0P,#!U=2`@('PP,#`P,#`?93$>("`?-4Y"'V).0A]C3D(Y.#HQ,A]H<&QI
M:W0?:E(L(#DX,#4R,!X@(!\U3&D?8DQI'V-#3D(?:&@L=1X@(!\U4T5%'V)3
M144>("`?-5$?8E$?:CDX.30W'B`@'S5,'V),'V,P,3`P'V@Y."\?:C,P-#,@
M2!X@(!\U4Q]B4Q]H4W8Y-Q]J-S(S-1XQ<Q]A66%N<V]N+"!4;V)E+!]D,3DQ
M-"TR,#`Q'W5*86YS<V]N+"!4;W9E+!]D,3DQ-"TR,#`Q'C%S'V%*86YS<V]N
M;W;A+"!4;W9E+!]D,3DQ-"TR,#`Q'W5*86YS<V]N+"!4;W9E+!]D,3DQ-"TR
M,#`Q'C%S'V%*86YS;VYE+"!4=79E+!]D,3DQ-"TR,#`Q'W5*86YS<V]N+"!4
M;W9E+!]D,3DQ-"TR,#`Q'C%S'V%*86YS;VXL(%1U=F4L'V0Q.3$T+3(P,#$?
M=4IA;G-S;VXL(%1O=F4L'V0Q.3$T+3(P,#$>,7,?84IA;G-S;VXL(%1U=F4L
M'V0Q.3$T+3(P,#$?=4IA;G-S;VXL(%1O=F4L'V0Q.3$T+3(P,#$>,7,?84IA
M;G-S;VYO=F$L(%1O=F4L'V0Q.3$T+3(P,#$?=4IA;G-S;VXL(%1O=F4L'V0Q
M.3$T+3(P,#$>(#(?84AC9"QU'V)3:_9N;&ET=&5R871U<AXR,#`U,#(P-#$Q
M,34Q."XP'C`@'V%N;W1H:6YG'WIE=F5R>71H:6YG'B`@'VQW96(?<C`?<V(?
(:30Y'V,Q'AT`
`
pear/test/File_MARC/tests/marc_lint_002.phpt000064400000004466151732710200014533 0ustar00--TEST--
marc_lint_002: Tests check041() and check043() called separately
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
<?php include('tests/skipif_noispn.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Create test harness to allow direct calls to check methods:
class File_MARC_Lint_Test_Harness extends File_MARC_Lint
{
    public function check041($field)
    {
        return parent::check041($field);
    }

    public function check043($field)
    {
        return parent::check043($field);
    }

    // override warn method to echo instead of store in object:
    protected function warn($msg)
    {
        echo $msg . "\n";
    }
}

$marc_lint = new File_MARC_Lint_Test_Harness();

$field = new File_MARC_Data_Field(
    '041',
    array(
        new File_MARC_Subfield('a', 'end'),             // invalid
        new File_MARC_Subfield('a', 'span'),            // too long
        new File_MARC_Subfield('h', 'far')              // obsolete
    ),
    "0", ""
);
$marc_lint->check041($field);

$field = new File_MARC_Data_Field(
    '041',
    array(
        new File_MARC_Subfield('a', 'endorviwo'),       // invalid
        new File_MARC_Subfield('a', 'spanowpalasba')    // too long and invalid
    ),
    "1", ""
);
$marc_lint->check041($field);

$field = new File_MARC_Data_Field(
    '043',
    array(
        new File_MARC_Subfield('a', 'n-----'),          // 6 chars vs. 7
        new File_MARC_Subfield('a', 'n-us----'),        // 8 chars vs. 7
        new File_MARC_Subfield('a', 'n-ma-us'),         // invalid code
        new File_MARC_Subfield('a', 'e-ur-ai')          // obsolete code
    ),
    "", ""
);
$marc_lint->check043($field);

?>
--EXPECT--
041: Subfield _a, end (end), is not valid.
041: Subfield _a must be evenly divisible by 3 or exactly three characters if ind2 is not 7, (span).
041: Subfield _h, far, may be obsolete.
041: Subfield _a, endorviwo (end), is not valid.
041: Subfield _a, endorviwo (orv), is not valid.
041: Subfield _a, endorviwo (iwo), is not valid.
041: Subfield _a must be evenly divisible by 3 or exactly three characters if ind2 is not 7, (spanowpalasba).
043: Subfield _a must be exactly 7 characters, n-----
043: Subfield _a must be exactly 7 characters, n-us----
043: Subfield _a, n-ma-us, is not valid.
043: Subfield _a, e-ur-ai, may be obsolete.
pear/test/File_MARC/tests/namespace.xml000064400000017631151732710200013761 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.3 U (http://www.xmlspy.com) by Morgan Cundiff (Library of Congress) -->
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
	<marc:record>
		<marc:leader>00925njm  22002777a 4500</marc:leader>
		<marc:controlfield tag="001">5637241</marc:controlfield>
		<marc:controlfield tag="003">DLC</marc:controlfield>
		<marc:controlfield tag="005">19920826084036.0</marc:controlfield>
		<marc:controlfield tag="007">sdubumennmplu</marc:controlfield>
		<marc:controlfield tag="008">910926s1957    nyuuun              eng  </marc:controlfield>
		<marc:datafield tag="010" ind1=" " ind2=" ">
			<marc:subfield code="a">   91758335 </marc:subfield>
		</marc:datafield>
		<marc:datafield tag="028" ind1="0" ind2="0">
			<marc:subfield code="a">1259</marc:subfield>
			<marc:subfield code="b">Atlantic</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="040" ind1=" " ind2=" ">
			<marc:subfield code="a">DLC</marc:subfield>
			<marc:subfield code="c">DLC</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="050" ind1="0" ind2="0">
			<marc:subfield code="a">Atlantic 1259</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="245" ind1="0" ind2="4">
			<marc:subfield code="a">The Great Ray Charles</marc:subfield>
			<marc:subfield code="h">[sound recording].</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="260" ind1=" " ind2=" ">
			<marc:subfield code="a">New York, N.Y. :</marc:subfield>
			<marc:subfield code="b">Atlantic,</marc:subfield>
			<marc:subfield code="c">[1957?]</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="300" ind1=" " ind2=" ">
			<marc:subfield code="a">1 sound disc :</marc:subfield>
			<marc:subfield code="b">analog, 33 1/3 rpm ;</marc:subfield>
			<marc:subfield code="c">12 in.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="511" ind1="0" ind2=" ">
			<marc:subfield code="a">Ray Charles, piano &amp; celeste.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="505" ind1="0" ind2=" ">
			<marc:subfield code="a">The Ray -- My melancholy baby -- Black coffee -- There's no you -- Doodlin' -- Sweet sixteen bars -- I surrender dear -- Undecided.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="500" ind1=" " ind2=" ">
			<marc:subfield code="a">Brief record.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="650" ind1=" " ind2="0">
			<marc:subfield code="a">Jazz</marc:subfield>
			<marc:subfield code="y">1951-1960.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="650" ind1=" " ind2="0">
			<marc:subfield code="a">Piano with jazz ensemble.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="700" ind1="1" ind2=" ">
			<marc:subfield code="a">Charles, Ray,</marc:subfield>
			<marc:subfield code="d">1930-</marc:subfield>
			<marc:subfield code="4">prf</marc:subfield>
		</marc:datafield>
	</marc:record>
	<marc:record>
		<marc:leader>01832cmma 2200349 a 4500</marc:leader>
		<marc:controlfield tag="001">12149120</marc:controlfield>
		<marc:controlfield tag="005">20001005175443.0</marc:controlfield>
		<marc:controlfield tag="007">cr |||</marc:controlfield>
		<marc:controlfield tag="008">000407m19949999dcu    g   m        eng d</marc:controlfield>
		<marc:datafield tag="906" ind1=" " ind2=" ">
			<marc:subfield code="a">0</marc:subfield>
			<marc:subfield code="b">ibc</marc:subfield>
			<marc:subfield code="c">copycat</marc:subfield>
			<marc:subfield code="d">1</marc:subfield>
			<marc:subfield code="e">ncip</marc:subfield>
			<marc:subfield code="f">20</marc:subfield>
			<marc:subfield code="g">y-gencompf</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="925" ind1="0" ind2=" ">
			<marc:subfield code="a">undetermined</marc:subfield>
			<marc:subfield code="x">web preservation project (wpp)</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="955" ind1=" " ind2=" ">
			<marc:subfield code="a">vb07 (stars done) 08-19-00 to HLCD lk00; AA3s lk29 received for subject Aug 25, 2000; to DEWEY 08-25-00; aa11 08-28-00</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="010" ind1=" " ind2=" ">
			<marc:subfield code="a">   00530046 </marc:subfield>
		</marc:datafield>
		<marc:datafield tag="035" ind1=" " ind2=" ">
			<marc:subfield code="a">(OCoLC)ocm44279786</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="040" ind1=" " ind2=" ">
			<marc:subfield code="a">IEU</marc:subfield>
			<marc:subfield code="c">IEU</marc:subfield>
			<marc:subfield code="d">N@F</marc:subfield>
			<marc:subfield code="d">DLC</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="042" ind1=" " ind2=" ">
			<marc:subfield code="a">lccopycat</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="043" ind1=" " ind2=" ">
			<marc:subfield code="a">n-us-dc</marc:subfield>
			<marc:subfield code="a">n-us---</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="050" ind1="0" ind2="0">
			<marc:subfield code="a">F204.W5</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="082" ind1="1" ind2="0">
			<marc:subfield code="a">975.3</marc:subfield>
			<marc:subfield code="2">13</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="245" ind1="0" ind2="4">
			<marc:subfield code="a">The White House</marc:subfield>
			<marc:subfield code="h">[computer file].</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="256" ind1=" " ind2=" ">
			<marc:subfield code="a">Computer data.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="260" ind1=" " ind2=" ">
			<marc:subfield code="a">Washington, D.C. :</marc:subfield>
			<marc:subfield code="b">White House Web Team,</marc:subfield>
			<marc:subfield code="c">1994-</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="538" ind1=" " ind2=" ">
			<marc:subfield code="a">Mode of access: Internet.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="500" ind1=" " ind2=" ">
			<marc:subfield code="a">Title from home page as viewed on Aug. 19, 2000.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="520" ind1="8" ind2=" ">
			<marc:subfield code="a">Features the White House. Highlights the Executive Office of the President, which includes senior policy advisors and offices responsible for the President's correspondence and communications, the Office of the Vice President, and the Office of the First Lady. Posts contact information via mailing address, telephone and fax numbers, and e-mail. Contains the Interactive Citizens' Handbook with information on health, travel and tourism, education and training, and housing. Provides a tour and the history of the White House. Links to White House for Kids.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="610" ind1="2" ind2="0">
			<marc:subfield code="a">White House (Washington, D.C.)</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="610" ind1="1" ind2="0">
			<marc:subfield code="a">United States.</marc:subfield>
			<marc:subfield code="b">Executive Office of the President.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="610" ind1="1" ind2="0">
			<marc:subfield code="a">United States.</marc:subfield>
			<marc:subfield code="b">Office of the Vice President.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="610" ind1="1" ind2="0">
			<marc:subfield code="a">United States.</marc:subfield>
			<marc:subfield code="b">Office of the First Lady.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="710" ind1="2" ind2=" ">
			<marc:subfield code="a">White House Web Team.</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="856" ind1="4" ind2="0">
			<marc:subfield code="u">http://www.whitehouse.gov</marc:subfield>
		</marc:datafield>
		<marc:datafield tag="856" ind1="4" ind2="0">
			<marc:subfield code="u">http://lcweb.loc.gov/staff/wpp/whitehouse.html</marc:subfield>
			<marc:subfield code="z">Web site archive</marc:subfield>
		</marc:datafield>
	</marc:record>
</marc:collection>pear/test/File_MARC/tests/marc_xml_004.phpt000064400000005416151732710200014363 0ustar00--TEST--
marc_xml_004: test conversion to XML of subfields that need to be escaped
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'xmlescape.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toXML();
  print "\n";
}
?>
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record>
  <leader>00727nam  2200205 a 4500</leader>
  <controlfield tag="001">03-0016458</controlfield>
  <controlfield tag="005">19971103184734.0</controlfield>
  <controlfield tag="008">970701s1997    oru          u000 0 eng u</controlfield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(Sirsi) a351664</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">ML270.2</subfield>
   <subfield code="b">.A6 1997</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Anthony, James R.</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="0">
   <subfield code="a">French baroque music from Beaujoyeulx to Rameau</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
   <subfield code="a">Rev. and expanded ed.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">Portland, OR :</subfield>
   <subfield code="b">Amadeus Press,</subfield>
   <subfield code="c">1997.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">586 p. :</subfield>
   <subfield code="b">music</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Music</subfield>
   <subfield code="&lt;">France</subfield>
   <subfield code="y">16th century</subfield>
   <subfield code="x">History and criticism.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Music</subfield>
   <subfield code="z">France</subfield>
   <subfield code="y">17th century</subfield>
   <subfield code="x">History and criticism.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Music</subfield>
   <subfield code="z">France</subfield>
   <subfield code="y">18th century</subfield>
   <subfield code="x">History and criticism.</subfield>
  </datafield>
  <datafield tag="949" ind1=" " ind2=" ">
   <subfield code="a">ML 270.2 A6 1997</subfield>
   <subfield code="w">LC</subfield>
   <subfield code="i">30007006841505</subfield>
   <subfield code="r">Y</subfield>
   <subfield code="t">BOOKS</subfield>
   <subfield code="l">HUNT-CIRC</subfield>
   <subfield code="m">HUNTINGTON</subfield>
  </datafield>
  <datafield tag="596" ind1=" " ind2=" ">
   <subfield code="a">1</subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/bad_example.mrc000064400000003475151732710200014250 0ustar0001853    a2200517   450000100110000000300070001100800390001802000260005703500150008304000070009804200120010508400180011708400180013508400210015308400220017410000300019624500630022625000130028926000580030230-0033003604400037003935000023004305990010004537400024004637750034004878410048005218410049005698410047006188410048006658410047007138410047007608520038008078520021008458520013008668520016008798520028008958520021009239000056009449000061010009000057010619000056011189000057011749000060012319760027012910050017013180000000044EMILDA980120s1998    fi     j      000 0 swe  a9515008808cFIM 72:00  99515008808  aNB  9NB9SEE  aHcd,u2kssb/6  5NBauHc2kssb  5SEEaHcf2kssb/6  5QaHcd,uf2kssb/61 aJansson, Tove,d1914-200104aDet osynliga barnet och andra bert̃telser /cTove Jansson  a7. uppl.  aHelsingfors :bSchildt,c1998 ;e(Falun :fScandbook)  a166, [4] s. :bill. ;c21 cm 0aMumin-biblioteket,x99-0698931-9  aOriginaluppl. 1962  aLi: S4 aDet osynliga barnet1 z951-50-0385-7w9515003857907  5Liaxab0201080u    0   4000uu   |000000e1  5SEEaxab0201080u    0   4000uu   |000000e1  5Laxab0201080u    0   4000uu   |000000e1  5NBaxab0201080u    0   4000uu   |000000e1  5Qaxab0201080u    0   4000uu   |000000e1  5Saxab0201080u    0   4000uu   |000000e1  5NBbNBcNB98:12hpliktjR, 980520  5LibLicCNBhh,u  5SEEbSEE  5QbQj98947  5LbLc0100h98/j3043 H  5SbShSv97j72351saYanson, Tobe,d1914-2001uJansson, Tove,d1914-20011saJanssonov,̀ Tove,d1914-2001uJansson, Tove,d1914-20011saJansone, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJansson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanssonova, Tove,d1914-2001uJansson, Tove,d1914-2001 2aHcd,ubSkn̲litteratur20050204111518.0pear/test/File_MARC/tests/marc_field_002.phpt000064400000001057151732710200014641 0ustar00--TEST--
marc_field_002: Create fields with invalid indicators
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// test constructor
try {
    $field = new File_MARC_Data_Field('100', $subfields, '$@');
}
catch (Exception $e) {
    print "Error: {$e->getMessage()}\n";
}
--EXPECT--
Error: Illegal indicator "$@" in field "100" forced to blank
pear/test/File_MARC/tests/marc_019.phpt000064400000010051151732710200013500 0ustar00--TEST--
marc_019: generate a MARCXML record not in a collection element
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

$records = new File_MARC($dir . '/' . 'music.mrc');

// Iterate through the retrieved records
$record = $records->next();

// Change each 852 $c to "Audio-Visual"
$holdings = $record->getFields('852');
foreach ($holdings as $holding) {

    // Get the $c subfields from this field
    $formats = $holding->getSubfields('c');
    foreach ($formats as $format) {
        if ($format->getData('AV')) {
            $format->setData('Audio-Visual');
        }
    }
}

// Generate the XML output for this record
print($record->toXML('UTF-8', true, true));
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record>
  <leader>01145ncm  2200277 i 4500</leader>
  <controlfield tag="001">000073594</controlfield>
  <controlfield tag="004">AAJ5802</controlfield>
  <controlfield tag="005">20030415102100.0</controlfield>
  <controlfield tag="008">801107s1977    nyujza                   </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   77771106 </subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="a">(CaOTUIC)15460184</subfield>
  </datafield>
  <datafield tag="035" ind1="9" ind2=" ">
   <subfield code="a">AAJ5802</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">LC</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">M1366</subfield>
   <subfield code="b">.M62</subfield>
   <subfield code="d">M1527.2</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="4">
   <subfield code="a">The Modern Jazz Quartet :</subfield>
   <subfield code="b">The legendary profile. --</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">New York :</subfield>
   <subfield code="b">M.J.Q. Music,</subfield>
   <subfield code="c">c1977.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">score (72 p.) ;</subfield>
   <subfield code="c">31 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">For piano, vibraphone, drums, and double bass.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
   <subfield code="a">Lewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B♭.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Motion picture music</subfield>
   <subfield code="v">Excerpts</subfield>
   <subfield code="v">Scores.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Lewis, John,</subfield>
   <subfield code="d">1920-</subfield>
   <subfield code="t">Selections.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Martyrs.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
   <subfield code="a">Jackson, Milt.</subfield>
   <subfield code="t">Legendary profile.</subfield>
   <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
   <subfield code="a">The legendary profile.</subfield>
  </datafield>
  <datafield tag="852" ind1="0" ind2="0">
   <subfield code="b">MUSIC</subfield>
   <subfield code="c">Audio-Visual</subfield>
   <subfield code="k">folio</subfield>
   <subfield code="h">M1366</subfield>
   <subfield code="i">M62</subfield>
   <subfield code="9">1</subfield>
   <subfield code="4">Marvin Duchow Music</subfield>
   <subfield code="5"></subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/example.mrc000064400000003472151732710210013440 0ustar0001850     2200517   45000010011000000030007000110080039000180200026000570350015000830400007000980420012001050840018001170840018001350840021001530840022001741000030001962450062002262500013002882600058003013000033003594400037003925000023004295990010004527400024004627750034004868410048005208410049005688410047006178410048006648410047007128410047007598520038008068520021008448520013008658520016008788520028008948520021009229000056009439000060009999000057010599000056011169000057011729000060012299760026012890050017013150000000044EMILDA980120s1998    fi     j      000 0 swe  a9515008808cFIM 72:00  99515008808  aNB  9NB9SEE  aHcd,u2kssb/6  5NBauHc2kssb  5SEEaHcf2kssb/6  5QaHcd,uf2kssb/61 aJansson, Tove,d1914-200104aDet osynliga barnet och andra ber�ttelser /cTove Jansson  a7. uppl.  aHelsingfors :bSchildt,c1998 ;e(Falun :fScandbook)  a166, [4] s. :bill. ;c21 cm 0aMumin-biblioteket,x99-0698931-9  aOriginaluppl. 1962  aLi: S4 aDet osynliga barnet1 z951-50-0385-7w9515003857907  5Liaxab0201080u    0   4000uu   |000000e1  5SEEaxab0201080u    0   4000uu   |000000e1  5Laxab0201080u    0   4000uu   |000000e1  5NBaxab0201080u    0   4000uu   |000000e1  5Qaxab0201080u    0   4000uu   |000000e1  5Saxab0201080u    0   4000uu   |000000e1  5NBbNBcNB98:12hpliktjR, 980520  5LibLicCNBhh,u  5SEEbSEE  5QbQj98947  5LbLc0100h98/j3043 H  5SbShSv97j72351saYanson, Tobe,d1914-2001uJansson, Tove,d1914-20011saJanssonov�, Tove,d1914-2001uJansson, Tove,d1914-20011saJansone, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJansson, Tuve,d1914-2001uJansson, Tove,d1914-20011saJanssonova, Tove,d1914-2001uJansson, Tove,d1914-2001 2aHcd,ubSk�nlitteratur20050204111518.0pear/test/File_MARC/tests/marc_007.phpt000064400000002270151732710210013502 0ustar00--TEST--
marc_007: Use key=>value iteration for tags and codes
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

if ($marc_record = $marc_file->next()) {
    foreach ($marc_record->getFields() as $tag=>$value) {
        print "$tag: ";
	    if ($value instanceof File_MARC_Control_Field) {
                print $value->getData();
            }
	    else {
                foreach ($value->getSubfields() as $code=>$subdata) {
                    print "_$code";
                }
            }
        print "\n";
    }
}
?>
--EXPECT--
001: 0000000044
003: EMILDA
008: 980120s1998    fi     j      000 0 swe
020: _a_c
035: _9
040: _a
042: _9_9
084: _a_2
084: _5_a_2
084: _5_a_2
084: _5_a_2
100: _a_d
245: _a_c
250: _a
260: _a_b_c_e_f
300: _a_b_c
440: _a_x
500: _a
599: _a
740: _a
775: _z_w_9
841: _5_a_b_e
841: _5_a_b_e
841: _5_a_b_e
841: _5_a_b_e
841: _5_a_b_e
841: _5_a_b_e
852: _5_b_c_h_j
852: _5_b_c_h
852: _5_b
852: _5_b_j
852: _5_b_c_h_j
852: _5_b_h_j
900: _a_d_u_d
900: _a_d_u_d
900: _a_d_u_d
900: _a_d_u_d
900: _a_d_u_d
900: _a_d_u_d
976: _a_b
005: 20050204111518.0
pear/test/File_MARC/tests/marc_xml_006.phpt000064400000002657151732710210014372 0ustar00--TEST--
marc_xml_006: test getFields() in XML
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php

$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Read MARC records from a stream (a file, in this case)
$marc_source = new File_MARCXML($dir . '/' . 'sandburg.xml');

// Retrieve the first MARC record from the source
$marc_record = $marc_source->next();

// Retrieve a personal name field from the record
$names = $marc_record->getFields('100');
foreach ($names as $name_field) {
    // Now print the $a subfield
    switch ($name_field->getIndicator(1)) {
    case 0:
	print "Forename: ";
	break;

    case 1:
	print "Surname: ";
	break;

    case 2:
	print "Family name: ";
	break;
    }
    $name = $name_field->getSubfields('a');
    if (count($name) == 1) {
	print $name[0]->getData() . "\n";
    }
    else {
	print "Error -- \$a subfield appears more than once in this field!";
    }
}

// Retrieve all subject and genre fields
// Series statement fields start with a 6 (PCRE)
$subjects = $marc_record->getFields('^6', true);

// Iterate through all of the returned subject fields
foreach ($subjects as $field) {
    // print with File_MARC_Field_Data's magic __toString() method
    print "$field\n";
}

?>
--EXPECT--
Surname: Sandburg, Carl,
650  0 _aArithmetic
       _xJuvenile poetry.
650  0 _aChildren's poetry, American.
650  1 _aArithmetic
       _xPoetry.
650  1 _aAmerican poetry.
650  1 _aVisual perception.
pear/test/File_MARC/tests/marc_xml_001.phpt000064400000016735151732710210014367 0ustar00--TEST--
marc_xml_001: iterate and pretty print a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

while ($marc_record = $marc_file->next()) {
  /* Note that this adds characters to the leader to satisfy MARCXML schema */
  print $marc_record->toXML();
  print "\n";
}
?>
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record>
  <leader>01850na   2200517   4500</leader>
  <controlfield tag="001">0000000044</controlfield>
  <controlfield tag="003">EMILDA</controlfield>
  <controlfield tag="008">980120s1998    fi     j      000 0 swe</controlfield>
  <datafield tag="020" ind1=" " ind2=" ">
   <subfield code="a">9515008808</subfield>
   <subfield code="c">FIM 72:00</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
   <subfield code="9">9515008808</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">NB</subfield>
  </datafield>
  <datafield tag="042" ind1=" " ind2=" ">
   <subfield code="9">NB</subfield>
   <subfield code="9">SEE</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
   <subfield code="a">Hcd,u</subfield>
   <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
   <subfield code="5">NB</subfield>
   <subfield code="a">uHc</subfield>
   <subfield code="2">kssb</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
   <subfield code="5">SEE</subfield>
   <subfield code="a">Hcf</subfield>
   <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="084" ind1=" " ind2=" ">
   <subfield code="5">Q</subfield>
   <subfield code="a">Hcd,uf</subfield>
   <subfield code="2">kssb/6</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="4">
   <subfield code="a">Det osynliga barnet och andra ber�ttelser /</subfield>
   <subfield code="c">Tove Jansson</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
   <subfield code="a">7. uppl.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">Helsingfors :</subfield>
   <subfield code="b">Schildt,</subfield>
   <subfield code="c">1998 ;</subfield>
   <subfield code="e">(Falun :</subfield>
   <subfield code="f">Scandbook)</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">166, [4] s. :</subfield>
   <subfield code="b">ill. ;</subfield>
   <subfield code="c">21 cm</subfield>
  </datafield>
  <datafield tag="440" ind1=" " ind2="0">
   <subfield code="a">Mumin-biblioteket,</subfield>
   <subfield code="x">99-0698931-9</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">Originaluppl. 1962</subfield>
  </datafield>
  <datafield tag="599" ind1=" " ind2=" ">
   <subfield code="a">Li: S</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
   <subfield code="a">Det osynliga barnet</subfield>
  </datafield>
  <datafield tag="775" ind1="1" ind2=" ">
   <subfield code="z">951-50-0385-7</subfield>
   <subfield code="w">9515003857</subfield>
   <subfield code="9">07</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">Li</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">SEE</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">L</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">NB</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">Q</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="841" ind1=" " ind2=" ">
   <subfield code="5">S</subfield>
   <subfield code="a">xa</subfield>
   <subfield code="b">0201080u    0   4000uu   |000000</subfield>
   <subfield code="e">1</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">NB</subfield>
   <subfield code="b">NB</subfield>
   <subfield code="c">NB98:12</subfield>
   <subfield code="h">plikt</subfield>
   <subfield code="j">R, 980520</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">Li</subfield>
   <subfield code="b">Li</subfield>
   <subfield code="c">CNB</subfield>
   <subfield code="h">h,u</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">SEE</subfield>
   <subfield code="b">SEE</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">Q</subfield>
   <subfield code="b">Q</subfield>
   <subfield code="j">98947</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">L</subfield>
   <subfield code="b">L</subfield>
   <subfield code="c">0100</subfield>
   <subfield code="h">98/</subfield>
   <subfield code="j">3043 H</subfield>
  </datafield>
  <datafield tag="852" ind1=" " ind2=" ">
   <subfield code="5">S</subfield>
   <subfield code="b">S</subfield>
   <subfield code="h">Sv97</subfield>
   <subfield code="j">7235</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Yanson, Tobe,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Janssonov�, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Jansone, Tuve,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Janson, Tuve,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Jansson, Tuve,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="900" ind1="1" ind2="s">
   <subfield code="a">Janssonova, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
   <subfield code="u">Jansson, Tove,</subfield>
   <subfield code="d">1914-2001</subfield>
  </datafield>
  <datafield tag="976" ind1=" " ind2="2">
   <subfield code="a">Hcd,u</subfield>
   <subfield code="b">Sk�nlitteratur</subfield>
  </datafield>
  <controlfield tag="005">20050204111518.0</controlfield>
 </record>
</collection>
pear/test/File_MARC/tests/marc_xml_rsinger.phpt000064400000004721151732710210015530 0ustar00--TEST--
marc_xml_rsinger2: iterate and pretty print a non-compliant MARC record (uppercase subfield codes)
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARCXML($dir . '/' . 'bad_example.xml');

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01850    a2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
005     20050204111518.0
020    _a9515008808
       _cFIM 72:00
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 0  _aDet osynliga barnet och andra bert̃telser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
841    _5Li
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5SEE
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5L
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5NB
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5Q
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5S
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
852    _5NB
       _bNB
       _cNB98:12
       _hplikt
       _jR, 980520
852    _5Li
       _bLi
       _cCNB
       _hh,u
852    _5SEE
       _bSEE
852    _5Q
       _bQ
       _j98947
852    _5L
       _bL
       _c0100
       _h98/
       _j3043 H
852    _5S
       _bS
       _hSv97
       _j7235
900 1s _aYanson, Tobe,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonov,̀ Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansone, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonova, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
976  2 _aHcd,u
       _bSkn̲litteratur
pear/test/File_MARC/tests/music.xml000064400000026605151732710210013147 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
  <leader>01145ncm a2200277 i 4500</leader>
  <controlfield tag="001">000073594</controlfield>
  <controlfield tag="004">AAJ5802</controlfield>
  <controlfield tag="005">20030415102100.0</controlfield>
  <controlfield tag="008">801107s1977    nyujza                   </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
    <subfield code="a">   77771106 </subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="a">(CaOTUIC)15460184</subfield>
  </datafield>
  <datafield tag="035" ind1="9" ind2=" ">
    <subfield code="a">AAJ5802</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">LC</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
    <subfield code="a">M1366</subfield>
    <subfield code="b">.M62</subfield>
    <subfield code="d">M1527.2</subfield>
  </datafield>
  <datafield tag="245" ind1="0" ind2="4">
    <subfield code="a">The Modern Jazz Quartet :</subfield>
    <subfield code="b">The legendary profile. --</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
    <subfield code="a">New York :</subfield>
    <subfield code="b">M.J.Q. Music,</subfield>
    <subfield code="c">c1977.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
    <subfield code="a">score (72 p.) ;</subfield>
    <subfield code="c">31 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">For piano, vibraphone, drums, and double bass.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
    <subfield code="a">Lewis, J. Django.--Lewis, J. Plastic dreams (music from the film Kemek).--Lewis, J. Dancing (music from the film Kemek).--Lewis, J. Blues in A minor.--Lewis, J. Blues in B́Ư.--Lewis, J. Precious joy.--Jackson, M. The martyr.--Jackson, M. The legendary profile.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Motion picture music</subfield>
    <subfield code="v">Excerpts</subfield>
    <subfield code="v">Scores.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
    <subfield code="a">Lewis, John,</subfield>
    <subfield code="d">1920-</subfield>
    <subfield code="t">Selections.</subfield>
    <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
    <subfield code="a">Jackson, Milt.</subfield>
    <subfield code="t">Martyrs.</subfield>
    <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2="2">
    <subfield code="a">Jackson, Milt.</subfield>
    <subfield code="t">Legendary profile.</subfield>
    <subfield code="f">1977.</subfield>
  </datafield>
  <datafield tag="740" ind1="4" ind2=" ">
    <subfield code="a">The legendary profile.</subfield>
  </datafield>
  <datafield tag="852" ind1="0" ind2="0">
    <subfield code="b">MUSIC</subfield>
    <subfield code="c">MAIN</subfield>
    <subfield code="k">folio</subfield>
    <subfield code="h">M1366</subfield>
    <subfield code="i">M62</subfield>
    <subfield code="9">1</subfield>
    <subfield code="4">Marvin Duchow Music</subfield>
    <subfield code="5"></subfield>
  </datafield>
</record>
<record>
  <leader>01293cjm a2200289 a 4500</leader>
  <controlfield tag="001">001878039</controlfield>
  <controlfield tag="005">20050110174900.0</controlfield>
  <controlfield tag="007">sd fungnn|||e|</controlfield>
  <controlfield tag="008">940202r19931981nyujzn   i              d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
    <subfield code="a">7464573372</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="2">
    <subfield code="a">JK 57337</subfield>
    <subfield code="b">Red Baron</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="a">(OCoLC)29737267</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">SVP</subfield>
    <subfield code="c">SVP</subfield>
    <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a">Desmond, Paul,</subfield>
    <subfield code="d">1924-</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
    <subfield code="a">Paul Desmond &amp; the Modern Jazz Quartet</subfield>
    <subfield code="h">[sound recording]</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
    <subfield code="a">New York, N.Y. :</subfield>
    <subfield code="b">Red Baron :</subfield>
    <subfield code="b">Manufactured by Sony Music Entertainment,</subfield>
    <subfield code="c">p1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
    <subfield code="a">1 sound disc (39 min.) :</subfield>
    <subfield code="b">digital ;</subfield>
    <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
    <subfield code="a">Paul Desmond, alto saxophone; Modern Jazz Quartet: John Lewis, piano; Milt Jackson, vibraphone; Percy Heath, bass; Connie Kay, drums.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">All arrangements by John Lewis.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
    <subfield code="a">Recorded live on December 25, 1971 at Town Hall, NYC.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Originally released in 1981 by Finesse as LP FW 27487.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Program notes by Irving Townsend, June 1981, on container insert.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
    <subfield code="a">Greensleeves -- You go to my head -- Blue dove -- Jesus Christ Superstar -- Here&apos;s that rainy day -- East of the sun -- Bags&apos; new groove.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Jazz</subfield>
    <subfield code="y">1971-1980.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Lewis, John,</subfield>
    <subfield code="d">1920-</subfield>
  </datafield>
  <datafield tag="710" ind1="2" ind2=" ">
    <subfield code="a">Modern Jazz Quartet.</subfield>
  </datafield>
  <datafield tag="740" ind1="0" ind2=" ">
    <subfield code="a">Paul Desmond and the Modern Jazz Quartet.</subfield>
  </datafield>
</record>
<record>
  <leader>01829cjm a2200385 a 4500</leader>
  <controlfield tag="001">001964482</controlfield>
  <controlfield tag="005">20060626132700.0</controlfield>
  <controlfield tag="007">sd fzngnn|m|e|</controlfield>
  <controlfield tag="008">871211p19871957nyujzn                  d</controlfield>
  <datafield tag="024" ind1="1" ind2=" ">
    <subfield code="a">4228332902</subfield>
  </datafield>
  <datafield tag="028" ind1="0" ind2="1">
    <subfield code="a">833 290-2</subfield>
    <subfield code="b">Verve</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
    <subfield code="a">19571027</subfield>
    <subfield code="b">6299</subfield>
    <subfield code="c">D56</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
    <subfield code="a">196112--</subfield>
    <subfield code="b">3804</subfield>
    <subfield code="c">N4</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
    <subfield code="a">19571019</subfield>
    <subfield code="b">4104</subfield>
    <subfield code="c">C6</subfield>
  </datafield>
  <datafield tag="033" ind1="0" ind2=" ">
    <subfield code="a">197107--</subfield>
    <subfield code="b">6299</subfield>
    <subfield code="c">V7</subfield>
  </datafield>
  <datafield tag="035" ind1=" " ind2=" ">
    <subfield code="a">(OCoLC)17222092</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
    <subfield code="a">CPL</subfield>
    <subfield code="c">CPL</subfield>
    <subfield code="d">OCL</subfield>
    <subfield code="d">LGG</subfield>
  </datafield>
  <datafield tag="048" ind1=" " ind2=" ">
    <subfield code="a">pz01</subfield>
    <subfield code="a">ka01</subfield>
    <subfield code="a">sd01</subfield>
    <subfield code="a">pd01</subfield>
  </datafield>
  <datafield tag="110" ind1="2" ind2=" ">
    <subfield code="a">Modern Jazz Quartet.</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="4">
    <subfield code="a">The Modern Jazz Quartet plus</subfield>
    <subfield code="h">[sound recording].</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
    <subfield code="a">[New York] :</subfield>
    <subfield code="b">Verve,</subfield>
    <subfield code="c">p1987.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
    <subfield code="a">1 sound disc :</subfield>
    <subfield code="b">digital ;</subfield>
    <subfield code="c">4 3/4 in.</subfield>
  </datafield>
  <datafield tag="440" ind1=" " ind2="0">
    <subfield code="a">Compact jazz</subfield>
  </datafield>
  <datafield tag="511" ind1="0" ind2=" ">
    <subfield code="a">Modern Jazz Quartet (principally) ; Milt Jackson, vibraphone (2nd and 8th works) ; Oscar Peterson, piano (2nd and 8th works) ; Ray Brown, bass (2nd and 8th works) ; Ed Thigpen (2nd work), Louis Hayes (8th work), drums.</subfield>
  </datafield>
  <datafield tag="518" ind1=" " ind2=" ">
    <subfield code="a">Recorded live, Oct. 27, 1957, at the Donaueschingen Jazz Festival (1st, 5th, 7th, and 10th works); Dec. 1961, in New York (2nd work); live, Oct. 19, 1957, at the Opera House, Chicago (3rd, 4th, 6th, and 9th works); July 1971, in Villingen, Germany (8th work).</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Compact disc.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
    <subfield code="a">Analog recording.</subfield>
  </datafield>
  <datafield tag="505" ind1="0" ind2=" ">
    <subfield code="a">The golden striker (4:08) -- On Green Dolphin Street (7:28) -- D &amp; E (4:55) -- I&apos;ll remember April (4:51) -- Cort©·ge (7:15) -- Now&apos;s the time (4:43) -- J.B. blues (5:09) -- Reunion blues (6:35) -- &apos;Round midnight (3:56) -- Three windows (7:20).</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Jazz.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Jackson, Milt.</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Peterson, Oscar,</subfield>
    <subfield code="d">1925-</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Brown, Ray,</subfield>
    <subfield code="d">1926-2002.</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Thigpen, Ed.</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
    <subfield code="a">Hayes, Louis,</subfield>
    <subfield code="d">1937-</subfield>
    <subfield code="4">prf</subfield>
  </datafield>
  <datafield tag="852" ind1="8" ind2="0">
    <subfield code="b">MUSIC</subfield>
    <subfield code="c">AV</subfield>
    <subfield code="h">CD 1131</subfield>
    <subfield code="4">Marvin Duchow Music</subfield>
    <subfield code="5">Audio-Visual</subfield>
  </datafield>
</record>
</collection>
pear/test/File_MARC/tests/marc_001.phpt000064400000004713151732710210013500 0ustar00--TEST--
marc_001: iterate and pretty print a MARC record
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record;
  print "\n";
}
?>
--EXPECT--
LDR 01850     2200517   4500
001     0000000044
003     EMILDA
008     980120s1998    fi     j      000 0 swe
020    _a9515008808
       _cFIM 72:00
035    _99515008808
040    _aNB
042    _9NB
       _9SEE
084    _aHcd,u
       _2kssb/6
084    _5NB
       _auHc
       _2kssb
084    _5SEE
       _aHcf
       _2kssb/6
084    _5Q
       _aHcd,uf
       _2kssb/6
100 1  _aJansson, Tove,
       _d1914-2001
245 04 _aDet osynliga barnet och andra ber�ttelser /
       _cTove Jansson
250    _a7. uppl.
260    _aHelsingfors :
       _bSchildt,
       _c1998 ;
       _e(Falun :
       _fScandbook)
300    _a166, [4] s. :
       _bill. ;
       _c21 cm
440  0 _aMumin-biblioteket,
       _x99-0698931-9
500    _aOriginaluppl. 1962
599    _aLi: S
740 4  _aDet osynliga barnet
775 1  _z951-50-0385-7
       _w9515003857
       _907
841    _5Li
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5SEE
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5L
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5NB
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5Q
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
841    _5S
       _axa
       _b0201080u    0   4000uu   |000000
       _e1
852    _5NB
       _bNB
       _cNB98:12
       _hplikt
       _jR, 980520
852    _5Li
       _bLi
       _cCNB
       _hh,u
852    _5SEE
       _bSEE
852    _5Q
       _bQ
       _j98947
852    _5L
       _bL
       _c0100
       _h98/
       _j3043 H
852    _5S
       _bS
       _hSv97
       _j7235
900 1s _aYanson, Tobe,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonov�, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansone, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJansson, Tuve,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
900 1s _aJanssonova, Tove,
       _d1914-2001
       _uJansson, Tove,
       _d1914-2001
976  2 _aHcd,u
       _bSk�nlitteratur
005     20050204111518.0
pear/test/File_MARC/tests/marc_lint_004.phpt000064400000012107151732710210014525 0ustar00--TEST--
marc_lint_004: Tests check_245() called separately
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
<?php include('tests/skipif_noispn.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// Create test harness to allow direct calls to check methods:
class File_MARC_Lint_Test_Harness extends File_MARC_Lint
{
    public function check245($field)
    {
        return parent::check245($field);
    }

    // override warn method to echo instead of store in object:
    protected function warn($msg)
    {
        echo $msg . "\n";
    }
}

$marc_lint = new File_MARC_Lint_Test_Harness();

$testData = array(
    array(245, '0', '0', 'a', 'Subfield a.'),
    array(245, '0', '0', 'b', 'no subfield a.'),
    array(245, '0', '0', 'a', 'No period at end'),
    array(245, '0', '0', 'a', 'Other punctuation not followed by period!'),
    array(245, '0', '0', 'a', 'Other punctuation not followed by period?'),
    array(245, '0', '0', 'a', 'Precedes sub c', 'c', 'not preceded by space-slash.'),
    array(245, '0', '0', 'a', 'Precedes sub c/', 'c', 'not preceded by space-slash.'),
    array(245, '0', '0', 'a', 'Precedes sub c /', 'c', 'initials in sub c B. B.'),
    array(245, '0', '0', 'a', 'Precedes sub c /', 'c', 'initials in sub c B.B. (no warning).'),
    array(245, '0', '0', 'a', 'Precedes sub b', 'b', 'not preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b=', 'b', 'not preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b:', 'b', 'not preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b;', 'b', 'not preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b =', 'b', 'preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b :', 'b', 'preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub b ;', 'b', 'preceded by proper punctuation.'),
    array(245, '0', '0', 'a', 'Precedes sub h ', 'h', '[videorecording].'),
    array(245, '0', '0', 'a', 'Precedes sub h-- ', 'h', '[videorecording] :', 'b', 'with elipses dash before h.'),
    array(245, '0', '0', 'a', 'Precedes sub h-- ', 'h', 'videorecording :', 'b', 'without brackets around GMD.'),
    array(245, '0', '0', 'a', 'Precedes sub n.', 'n', 'Number 1.'),
    array(245, '0', '0', 'a', 'Precedes sub n', 'n', 'Number 2.'),
    array(245, '0', '0', 'a', 'Precedes sub n.', 'n', 'Number 3.', 'p', 'Sub n has period not comma.'),
    array(245, '0', '0', 'a', 'Precedes sub n.', 'n', 'Number 3,', 'p', 'Sub n has comma.'),
    array(245, '0', '0', 'a', 'Precedes sub p.', 'p', 'Sub a has period.'),
    array(245, '0', '0', 'a', 'Precedes sub p', 'p', 'Sub a has no period.'),
    array(245, '0', 'a', 'a', 'Invalid filing indicator.'),
    array(245, '0', '0', 'a', 'The article.'),
    array(245, '0', '4', 'a', 'The article.'),
    array(245, '0', '2', 'a', 'An article.'),
    array(245, '0', '0', 'a', "L'article."),
    array(245, '0', '2', 'a', 'A la mode.'),
    array(245, '0', '5', 'a', 'The "quoted article".'),
    array(245, '0', '5', 'a', 'The (parenthetical article).'),
    array(245, '0', '6', 'a', '(The) article in parentheses).'),
    array(245, '0', '9', 'a', "\"(The)\" 'article' in quotes and parentheses)."),
    array(245, '0', '5', 'a', '[The supplied title].')
);

foreach ($testData as $current) {
    $subfields = array();
    for ($i = 3; $i < count($current); $i+=2) {
        $subfields[] = new File_MARC_Subfield($current[$i], $current[$i+1]);
    }

    $field = new File_MARC_Data_Field(
        $current[0], $subfields, $current[1], $current[2]
    );
    $marc_lint->check245($field);
}

?>
--EXPECT--
245: Must have a subfield _a.
245: First subfield must be _a, but it is _b
245: Must end with . (period).
245: MARC21 allows ? or ! as final punctuation but LCRI 1.0C, Nov. 2003 (LCPS 1.7.1 for RDA records), requires period.
245: MARC21 allows ? or ! as final punctuation but LCRI 1.0C, Nov. 2003 (LCPS 1.7.1 for RDA records), requires period.
245: Subfield _c must be preceded by /
245: Subfield _c must be preceded by /
245: Subfield _c initials should not have a space.
245: Subfield _b should be preceded by space-colon, space-semicolon, or space-equals sign.
245: Subfield _b should be preceded by space-colon, space-semicolon, or space-equals sign.
245: Subfield _b should be preceded by space-colon, space-semicolon, or space-equals sign.
245: Subfield _b should be preceded by space-colon, space-semicolon, or space-equals sign.
245: Subfield _h should not be preceded by space.
245: Subfield _h must have matching square brackets, videorecording :.
245: Subfield _n must be preceded by . (period).
245: Subfield _p must be preceded by , (comma) when it follows subfield _n.
245: Subfield _p must be preceded by . (period) when it follows a subfield other than _n.
245: Non-filing indicator is non-numeric
245: First word, the, may be an article, check 2nd indicator (0).
245: First word, an, may be an article, check 2nd indicator (2).
245: First word, l, may be an article, check 2nd indicator (0).
245: First word, a, does not appear to be an article, check 2nd indicator (2).
pear/test/File_MARC/tests/marc_field_003.phpt000064400000003236151732710210014644 0ustar00--TEST--
marc_field_003: Add subfields to an existing field
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';

// create some subfields
$subfields[] = new File_MARC_Subfield('a', 'nothing');
$subfields[] = new File_MARC_Subfield('z', 'everything');

// create a field
$field = new File_MARC_Data_Field('100', $subfields, '0');

// create some new subfields
$subfield1 = new File_MARC_Subfield('g', 'a little');
$subfield2 = new File_MARC_Subfield('k', 'a bit more');
$subfield3 = new File_MARC_Subfield('t', 'a lot');
$subfield4 = new File_MARC_Subfield('0', 'first post');

// append a new subfield to the existing set of subfields
// expected order: a-z-g
$field->appendSubfield($subfield1);

// insert a new subfield after the first subfield with code 'z'
// expected order: a-z-k-g
$sf = $field->getSubfields('z');
// we might get an array back; in this case, we want the first subfield
if (is_array($sf)) {
  $field->insertSubfield($subfield2, $sf[0]);
}
else {
  $field->insertSubfield($subfield2, $sf);
}

// insert a new subfield prior to the first subfield with code 'z'
// expected order: a-t-z-k-g
$sf = $field->getSubfields('z');
// we might get an array back; in this case, we want the first subfield
if (is_array($sf)) {
  $field->insertSubfield($subfield3, $sf[0], true);
}
else {
  $field->insertSubfield($subfield3, $sf, true);
}

// insert a new subfield at the very start of the field
$field->prependSubfield($subfield4);

// let's see the results
print $field;
print "\n";

?>
--EXPECT--
100 0  _0first post
       _anothing
       _ta lot
       _zeverything
       _ka bit more
       _ga little
pear/test/File_MARC/tests/marc_xml_002.phpt000064400000007046151732710210014363 0ustar00--TEST--
marc_xml_002: iterate and pretty print a MARC record (LOC standard)
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'sandburg.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toXML();
  print "\n";
}
?>
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
 <record>
  <leader>01142cam  2200301 a 4500</leader>
  <controlfield tag="001">   92005291 </controlfield>
  <controlfield tag="003">DLC</controlfield>
  <controlfield tag="005">19930521155141.9</controlfield>
  <controlfield tag="008">920219s1993    caua   j      000 0 eng  </controlfield>
  <datafield tag="010" ind1=" " ind2=" ">
   <subfield code="a">   92005291 </subfield>
  </datafield>
  <datafield tag="020" ind1=" " ind2=" ">
   <subfield code="a">0152038655 :</subfield>
   <subfield code="c">$15.95</subfield>
  </datafield>
  <datafield tag="040" ind1=" " ind2=" ">
   <subfield code="a">DLC</subfield>
   <subfield code="c">DLC</subfield>
   <subfield code="d">DLC</subfield>
  </datafield>
  <datafield tag="042" ind1=" " ind2=" ">
   <subfield code="a">lcac</subfield>
  </datafield>
  <datafield tag="050" ind1="0" ind2="0">
   <subfield code="a">PS3537.A618</subfield>
   <subfield code="b">A88 1993</subfield>
  </datafield>
  <datafield tag="082" ind1="0" ind2="0">
   <subfield code="a">811/.52</subfield>
   <subfield code="2">20</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
   <subfield code="a">Sandburg, Carl,</subfield>
   <subfield code="d">1878-1967.</subfield>
  </datafield>
  <datafield tag="245" ind1="1" ind2="0">
   <subfield code="a">Arithmetic /</subfield>
   <subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</subfield>
  </datafield>
  <datafield tag="250" ind1=" " ind2=" ">
   <subfield code="a">1st ed.</subfield>
  </datafield>
  <datafield tag="260" ind1=" " ind2=" ">
   <subfield code="a">San Diego :</subfield>
   <subfield code="b">Harcourt Brace Jovanovich,</subfield>
   <subfield code="c">c1993.</subfield>
  </datafield>
  <datafield tag="300" ind1=" " ind2=" ">
   <subfield code="a">1 v. (unpaged) :</subfield>
   <subfield code="b">ill. (some col.) ;</subfield>
   <subfield code="c">26 cm.</subfield>
  </datafield>
  <datafield tag="500" ind1=" " ind2=" ">
   <subfield code="a">One Mylar sheet included in pocket.</subfield>
  </datafield>
  <datafield tag="520" ind1=" " ind2=" ">
   <subfield code="a">A poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Juvenile poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
   <subfield code="a">Children's poetry, American.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Arithmetic</subfield>
   <subfield code="x">Poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">American poetry.</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="1">
   <subfield code="a">Visual perception.</subfield>
  </datafield>
  <datafield tag="700" ind1="1" ind2=" ">
   <subfield code="a">Rand, Ted,</subfield>
   <subfield code="e">ill.</subfield>
  </datafield>
 </record>
</collection>
pear/test/File_MARC/tests/marc_017.phpt000064400000010104151732710210013476 0ustar00--TEST--
marc_017: iterate and print a MARC record to JSON format
--SKIPIF--
<?php include('tests/skipif.inc'); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
require __DIR__ . '/bootstrap.php';
$marc_file = new File_MARC($dir . '/' . 'example.mrc');

while ($marc_record = $marc_file->next()) {
  print $marc_record->toJSON();
  print "\n";
}
?>
--EXPECT--
{"leader":"01850     2200517   4500","fields":[{"001":"0000000044"},{"003":"EMILDA"},{"008":"980120s1998    fi     j      000 0 swe"},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"9515008808"},{"c":"FIM 72:00"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"9":"9515008808"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"NB"}]}},{"042":{"ind1":" ","ind2":" ","subfields":[{"9":"NB"},{"9":"SEE"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"a":"Hcd,u"},{"2":"kssb\/6"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"a":"uHc"},{"2":"kssb"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"a":"Hcf"},{"2":"kssb\/6"}]}},{"084":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"a":"Hcd,uf"},{"2":"kssb\/6"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"245":{"ind1":"0","ind2":"4","subfields":[{"a":"Det osynliga barnet och andra ber\u00e4ttelser \/"},{"c":"Tove Jansson"}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"7. uppl."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Helsingfors :"},{"b":"Schildt,"},{"c":"1998 ;"},{"e":"(Falun :"},{"f":"Scandbook)"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"166, [4] s. :"},{"b":"ill. ;"},{"c":"21 cm"}]}},{"440":{"ind1":" ","ind2":"0","subfields":[{"a":"Mumin-biblioteket,"},{"x":"99-0698931-9"}]}},{"500":{"ind1":" ","ind2":" ","subfields":[{"a":"Originaluppl. 1962"}]}},{"599":{"ind1":" ","ind2":" ","subfields":[{"a":"Li: S"}]}},{"740":{"ind1":"4","ind2":" ","subfields":[{"a":"Det osynliga barnet"}]}},{"775":{"ind1":"1","ind2":" ","subfields":[{"z":"951-50-0385-7"},{"w":"9515003857"},{"9":"07"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"Li"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"L"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"841":{"ind1":" ","ind2":" ","subfields":[{"5":"S"},{"a":"xa"},{"b":"0201080u    0   4000uu   |000000"},{"e":"1"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"NB"},{"b":"NB"},{"c":"NB98:12"},{"h":"plikt"},{"j":"R, 980520"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"Li"},{"b":"Li"},{"c":"CNB"},{"h":"h,u"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"SEE"},{"b":"SEE"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"Q"},{"b":"Q"},{"j":"98947"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"L"},{"b":"L"},{"c":"0100"},{"h":"98\/"},{"j":"3043 H"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"5":"S"},{"b":"S"},{"h":"Sv97"},{"j":"7235"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Yanson, Tobe,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janssonov\u00e1, Tove,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Jansone, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janson, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Jansson, Tuve,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"900":{"ind1":"1","ind2":"s","subfields":[{"a":"Janssonova, Tove,"},{"d":"1914-2001"},{"u":"Jansson, Tove,"},{"d":"1914-2001"}]}},{"976":{"ind1":" ","ind2":"2","subfields":[{"a":"Hcd,u"},{"b":"Sk\u00f6nlitteratur"}]}},{"005":"20050204111518.0"}]}
pear/test/File_MARC/tests/bigarchive.xml000064400000006672151732710210014134 0ustar00<?xml version="1.0"?>
<record xmlns="http://www.loc.gov/MARC21/slim"><leader>00000nam  2200277   4500</leader><controlfield tag="001">99865026e</controlfield><controlfield tag="003">UnM</controlfield><controlfield tag="005">19961010163452.0</controlfield><controlfield tag="006">m    g   d</controlfield><controlfield tag="007">cr bn |||a|bb|</controlfield><controlfield tag="008">940112s1649    enk     s     00| | eng d</controlfield><datafield tag="037" ind1=" " ind2=" "><subfield code="a">CL0051000003</subfield><subfield code="b">ProQuest Information and Learning. 300 N. Zeeb Rd., Ann Arbor, MI 48106</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">Cu-RivES</subfield><subfield code="c">Cu-RivES</subfield><subfield code="d">CStRLIN</subfield><subfield code="e">dcrb</subfield><subfield code="d">WaOLN</subfield></datafield><datafield tag="245" ind1="0" ind2="4"><subfield code="a">The VVelsh embassador, or the happy newes his vvorship hath brought to London.</subfield><subfield code="h">[electronic resource] :</subfield><subfield code="b">Togetherwith her thirteen articles of acreements, which her propounds to all her cousens in her principality of Wales,and her Cities of London.</subfield></datafield><datafield tag="246" ind1="2" ind2=" "><subfield code="a">Happy newes his vvorship hath brought to London</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">[London] :</subfield><subfield code="b">Printed for George Roberts, and are to be soldat the Maiden Head on Snow-Hill neer Holborn Conduit,</subfield><subfield code="c">1649.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">[2], 6 p.</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">Place of publication from Wing.</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">Annotation on Thomason copy: "May 4th".</subfield></datafield><datafield tag="500" ind1=" " ind2=" "><subfield code="a">Reproduction of the original in the British Library.</subfield></datafield><datafield tag="510" ind1="4" ind2=" "><subfield code="a">Wing (2nd ed.)</subfield><subfield code="c">W1315.</subfield></datafield><datafield tag="510" ind1="4" ind2=" "><subfield code="a">Thomason</subfield><subfield code="c">E.552[19].</subfield></datafield><datafield tag="533" ind1=" " ind2=" "><subfield code="a">Electronic reproduction.</subfield><subfield code="b">Ann Arbor, Mich. :</subfield><subfield code="c">UMI,</subfield><subfield code="d">1999-</subfield><subfield code="f">(Early English books online)</subfield><subfield code="n">Digital version of: (Thomason Tracts ; 85:E552[19])</subfield><subfield code="7">s1999    miun s</subfield></datafield><datafield tag="651" ind1=" " ind2="4"><subfield code="a">Great Britain</subfield><subfield code="x">Politics and government</subfield><subfield code="y">1642-1649</subfield><subfield code="v">Early works to 1800.</subfield></datafield><datafield tag="830" ind1=" " ind2="0"><subfield code="a">Early English books online.</subfield></datafield><datafield tag="856" ind1="4" ind2="0"><subfield code="z">E-book (Onsite access at NYPL Research Libraries)</subfield><subfield code="u">http://gateway.proquest.com/openurl?ctx_ver=Z39.88-2003&amp;res_id=xri:eebo&amp;rft_val_fmt=&amp;rft_id=xri:eebo:image:117259</subfield></datafield><datafield tag="909" ind1=" " ind2=" "><subfield code="a">Not for export in OCLC Reclamation Project</subfield></datafield></record>
pear/test/File_MARC/tests/camel.mrc000064400000015516151732710220013071 0ustar0000755cam  22002414a 4500001001300000003000600013005001700019008004100036010001700077020004300094040001800137042000800155050002600163082001700189100003100206245005400237260004200291300007200333500003300405650003700438630002500475630001300500fol05731351 IMchF20000613133448.0000107s2000    nyua          001 0 eng    a   00020737   a0471383147 (paper/cd-rom : alk. paper)  aDLCcDLCdDLC  apcc00aQA76.73.P22bM33 200000a005.13/32211 aMartinsson, Tobias,d1976-10aActivePerl with ASP and ADO /cTobias Martinsson.  aNew York :bJohn Wiley & Sons,c2000.  axxi, 289 p. :bill. ;c23 cm. +e1 computer  laser disc (4 3/4 in.)  a"Wiley Computer Publishing." 0aPerl (Computer program language)00aActive server pages.00aActiveX.00647pam  2200241 a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001800109042000800127050002600135082001500161100002600176245006700202260003800269263000900307300001100316650003700327650002500364700001600389fol05754809 IMchF20000601115601.0000203s2000    mau           001 0 eng    a   00022023   a1565926994  aDLCcDLCdDLC  apcc00aQA76.73.P22bD47 200000a005.742211 aDescartes, Alligator.10aProgramming the Perl DBI /cAlligator Descartes and Tim Bunce.  aCmabridge, MA :bO'Reilly,c2000.  a1111  ap. cm. 0aPerl (Computer program language) 0aDatabase management.1 aBunce, Tim.00605cam  22002054a 4500001001300000003000600013005001700019008004100036010001700077040001800094042000800112050002700120082001700147100002100164245005500185260004500240300002600285504005100311650003700362fol05843555 IMchF20000525142739.0000318s1999    cau      b    001 0 eng    a   00501349   aDLCcDLCdDLC  apcc00aQA76.73.P22bB763 199900a005.13/32211 aBrown, Martin C.10aPerl :bprogrammer's reference /cMartin C. Brown.  aBerkeley :bOsborne/McGraw-Hill,cc1999.  axix, 380 p. ;c22 cm.  aIncludes bibliographical references and index. 0aPerl (Computer program language)00579cam  22002054a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001800109042000800127050002700135082001700162100002100179245005500200260004500255300003600300650003700336fol05843579 IMchF20000525142716.0000318s1999    caua          001 0 eng    a   00502116   a0072120002  aDLCcDLCdDLC  apcc00aQA76.73.P22bB762 199900a005.13/32211 aBrown, Martin C.10aPerl :bthe complete reference /cMartin C. Brown.  aBerkeley :bOsborne/McGraw-Hill,cc1999.  axxxv, 1179 p. :bill. ;c24 cm. 0aPerl (Computer program language)00801nam  22002778a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001300109042000800122050002600130082001800156100002000174245008800194250003200282260004100314263000900355300001100364650003700375650003600412650002600448700002500474700002400499fol05848297 IMchF20000524125727.0000518s2000    mau           001 0 eng    a   00041664   a1565924193  aDLCcDLC  apcc00aQA76.73.P22bG84 200000a005.2/7622211 aGuelich, Scott.10aCGI programming with Perl /cScott Guelich, Shishir Gundavaram & Gunther Birznieks.  a2nd ed., expanded & updated  aCambridge, Mass. :bO'Reilly,c2000.  a0006  ap. cm. 0aPerl (Computer program language) 0aCGI (Computer network protocol) 0aInternet programming.1 aGundavaram, Shishir.1 aBirznieks, Gunther.00665nam  22002298a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001300109042000800122050002700130082001700157111005200174245008600226250001200312260004100324263000900365300001100374650005000385fol05865950 IMchF20000615103017.0000612s2000    mau           100 0 eng    a   00055759   a0596000138  aDLCcDLC  apcc00aQA76.73.P22bP475 200000a005.13/32212 aPerl Conference 4.0d(2000 :cMonterey, Calif.)10aProceedings of the Perl Conference 4.0 :bJuly 17-20, 2000, Monterey, California.  a1st ed.  aCambridge, Mass. :bO'Reilly,c2000.  a0006  ap. cm. 0aPerl (Computer program language)vCongresses.00579nam  22002178a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001300109042000800122050002600130082001700156100002800173245006200201260004100263263000900304300001100313650003700324fol05865956 IMchF20000615102948.0000612s2000    mau           000 0 eng    a   00055770   a1565926099  aDLCcDLC  apcc00aQA76.73.P22bB43 200000a005.13/32211 aBlank-Edelman, David N.10aPerl for system administration /cDavid N. Blank-Edelman.  aCambridge, Mass. :bO'Reilly,c2000.  a0006  ap. cm. 0aPerl (Computer program language)00661nam  22002538a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001300109042000800122050002600130082001700156100001700173245006700190250001200257260004100269263000900310300001100319650003700330700002300367700001700390fol05865967 IMchF20000615102611.0000614s2000    mau           000 0 eng    a   00055799   a0596000278  aDLCcDLC  apcc00aQA76.73.P22bW35 200000a005.13/32211 aWall, Larry.10aProgramming Perl /cLarry Wall, Tom Christiansen & Jon Orwant.  a3rd ed.  aCambridge, Mass. :bO'Reilly,c2000.  a0007  ap. cm. 0aPerl (Computer program language)1 aChristiansen, Tom.1 aOrwant, Jon.00603cam  22002054a 4500001001300000003000600013005001700019008004100036010001700077020001500094040001800109042000800127050002600135082001700161100003200178245006000210260005700270300003300327650003700360fol05872355 IMchF20000706095105.0000315s1999    njua          001 0 eng    a   00500678   a013020868X  aDLCcDLCdDLC  apcc00aQA76.73.P22bL69 199900a005.13/32211 aLowe, Vincentq(Vincent D.)10aPerl programmer's interactive workbook /cVincent Lowe.  aUpper Saddle River, NJ :bPrentice Hall PTP,cc1999.  axx, 633 p. :bill. ;c23 cm. 0aPerl (Computer program language)00696nam  22002538a 4500001001300000003000600013005001700019008004100036010001700077020002800094040001300122042000800135050002600143082001700169100002600186245004400212260005100256263000900307300001100316500002000327650003700347650001700384650004100401fol05882032 IMchF20000707091904.0000630s2000    cau           001 0 eng    a   00058174   a0764547291 (alk. paper)  aDLCcDLC  apcc00aQA76.73.P22bF64 200000a005.13/32212 aFoster-Johnson, Eric.10aCross-platform Perl /cEric F. Johnson.  aFoster City, CA :bIDG Books Worldwide,c2000.  a0009  ap. cm.  aIncludes index. 0aPerl (Computer program language) 0aWeb servers. 0aCross-platform software development.00399ngm  2200121 a 4500001001300000003000700013007002800020008004100048245005600089260003800145300006000183538003400243ttt05000099 TEST  avbfc dcebfaghhoiu050224s2005    ilu999            vleng d00aTest subfields in control fieldsh[videorecording].  aOregon, Ill. :bB. Baldus,c2005.  a1 videocassette (ca. 1000 min.) :bsd., col. ;c1/2 in.  aVHS format, SP playback mode.pear/test/Mail_Mime/tests/test_Bug_18772.phpt000064400000001560151732710220014670 0ustar00--TEST--
Bug #18772  Text/calendar message
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime;
$mime->setSubject('test');

// A message with text/calendar only
$mime->setCalendarBody('VCALENDAR');

echo $mime->getMessage();
echo "\n---\n";

// A message with alternative text
$mime->setTXTBody('vcalendar');
$msg = $mime->getMessage();

echo preg_replace('/=_[0-9a-z]+/', '*', $msg);
--EXPECT--
MIME-Version: 1.0
Subject: test
Content-Type: text/calendar; charset=UTF-8; method=request
Content-Transfer-Encoding: quoted-printable

VCALENDAR
---
MIME-Version: 1.0
Subject: test
Content-Type: multipart/alternative;
 boundary="*"

--*
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

vcalendar
--*
Content-Transfer-Encoding: quoted-printable
Content-Type: text/calendar; method=request; charset=UTF-8

VCALENDAR
--*--
pear/test/Mail_Mime/tests/test_Bug_17175.phpt000064400000001267151732710220014670 0ustar00--TEST--
Bug #17175  Content-Description support+ecoding
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$Mime = new Mail_Mime();
$Mime->setTXTBody('Test message.');
$Mime->addAttachment('test file contents', "text/plain",
    'test.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
    'desc');
$Mime->addAttachment('test file contents', "text/plain",
    'test2.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
    'test unicode żąśź');

$body = $Mime->getMessage();
preg_match_all('/Content-Description: (.*)/', $body, $matches);
foreach ($matches[1] as $value)
    echo $value."\n";
?>
--EXPECT--
desc
=?UTF-8?Q?test_unicode_=C5=BC=C4=85=C5=9B=C5=BA?=
pear/test/Mail_Mime/tests/test_Bug_GH16.phpt000064400000003102151732710220014637 0ustar00--TEST--
Bug GH-16  Test methods that write to a file
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->setContentType('multipart/alternative', array('boundary' => 'something'));

$temp_filename = dirname(__FILE__) . "/output1.tmp";
touch($temp_filename);
$msg = $mime->saveMessageBody($temp_filename);
echo file_get_contents($temp_filename);

$temp_filename = dirname(__FILE__) . "/output2.tmp";
touch($temp_filename);
$msg = $mime->saveMessage($temp_filename);
echo file_get_contents($temp_filename);

$temp_filename = dirname(__FILE__) . "/output3.tmp";
$mimePart = new Mail_mimePart('abc', array(
        'content_type' => 'text/plain',
        'encoding'     => 'quoted-printable',
));
$mimePart->encodeToFile($temp_filename);
echo file_get_contents($temp_filename);

?>
--CLEAN--
<?php
    for ($i = 1; $i < 4; $i++) {
        @unlink(dirname(__FILE__) . "/output{$i}.tmp");
    }
?>
--EXPECT--
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

text
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=ISO-8859-1

html
--something--
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="something"

--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

text
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=ISO-8859-1

html
--something--
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain

abc
pear/test/Mail_Mime/tests/test_Bug_9722_1.phpt000064400000000550151732710220015021 0ustar00--TEST--
Bug #9722   quotedPrintableEncode does not encode dot at start of line on Windows platform
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");
$text = "This
is a
test
...
    It is 
//really fun//
to make :(";

print_r(Mail_mimePart::quotedPrintableEncode($text, 76, "\n"));

--EXPECT--
This
is a
test
=2E..
    It is=20
//really fun//
to make :(
pear/test/Mail_Mime/tests/test_Bug_11731.phpt000064400000001254151732710220014654 0ustar00--TEST--
Bug #11731  Full stops after soft line breaks are not encoded
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
// Second full stop will be at the start of the second line after quoted-printable
// encoding (full stop '=2E' + 72 characters + line-continuation '=' = 76)
$text     = '.123456789012345678901234567890123456789012345678901234567890123456789012.3456';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);    
$mimePart = new Mail_mimePart($text, $params);
$encoded  =  $mimePart->encode();
echo $encoded['body'];
    
--EXPECT--
=2E123456789012345678901234567890123456789012345678901234567890123456789012=
=2E3456
pear/test/Mail_Mime/tests/class-filename.phpt000064400000000362151732710220015226 0ustar00--TEST--
Test class filename (bug #24)
--SKIPIF--
<?php
echo "skip This will be broken until Mail_Mime2";
?>
--FILE--
<?php
@include('Mail/Mime.php');
echo class_exists('Mail_Mime') ? 'Include OK' : 'Include failed';
?>
--EXPECT--
Include OK
pear/test/Mail_Mime/tests/test_Bug_3513_2.phpt000064400000001067151732710220015016 0ustar00--TEST--
Bug #3513   Support of RFC2231 in header fields. (UTF-8)
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$test = "Süper gröse tolle tolle grüße.txt";
$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'UTF-8', 'de');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/filename([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[1]);
}

--EXPECT--
*0*=UTF-8'de'S%C3%BCper%20gr%C3%B6se%20tolle%20tolle%20gr%C3%BC;
*1*=%C3%9Fe.txt;
pear/test/Mail_Mime/tests/test_Bug_13962.phpt000064400000000557151732710230014672 0ustar00--TEST--
Bug #13962  Multiple header support
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$mime = new Mail_mime();

$mime->setFrom('user@from.example.com');
$r = $mime->txtHeaders(array('Received' => array('Received 1', 'Received 2')));

print_r($r); 
?>
--EXPECT--
Received: Received 1
Received: Received 2
MIME-Version: 1.0
From: user@from.example.com
pear/test/Mail_Mime/tests/test_Bug_13444.phpt000064400000001236151732710230014660 0ustar00--TEST--
Bug #9725   multipart/related & alternative wrong order
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime();
$mime->setTXTBody("test");
$mime->setHTMLBody("test");
$mime->addHTMLImage("test", 'application/octet-stream', '', false);
$body = $mime->get();
$head = $mime->headers();
$headCT = $head['Content-Type'];
$headCT = explode(";", $headCT);
$headCT = $headCT[0];

$ct = preg_match_all('|Content-Type: ([^;\r\n]+)|', $body, $matches);
print($headCT);
print("\n");
foreach ($matches[1] as $match){
    print($match);
    print("\n");
}
--EXPECT--
multipart/alternative
text/plain
multipart/related
text/html
application/octet-stream
pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt000064400000001041151732710230017651 0ustar00--TEST--
Bug #3488   Sleep/Wakeup EOL Consistency - Part 1
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');
$mm = new Mail_mime("\n");
$mm->setHTMLBody('<html></html>');
$mm->setTxtBody('Blah blah');

if (version_compare(phpversion(), "5.0.0", '<')) {
    $mmCopy = $mm;
} else {
    $mmCopy = clone($mm);
}

$mm->get();
$x = $mm->headers();

$smm = serialize(array('mm' => $mmCopy, 'header' => $x['Content-Type']));
$fp = fopen('sleep_wakeup_data', 'w');
fwrite($fp, $smm);
fclose($fp);

echo "Data written";
?>
--EXPECT--
Data written
pear/test/Mail_Mime/tests/qp_encoding_test.phpt000064400000006745151732710230015704 0ustar00--TEST--
qp comprehensive test
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT

include("Mail/mimePart.php");

/**
 * Convenience function to make qp encoded output easier to verify
 *
 * @param string $text Input text to be encoded and printed
 * @param int $begin Start character to visibly print from
 * @param int $end Stop character to visibly print to
 * @param bool $special_chars Convert character such as linebreaks
 *     etc. to visible replacements.
 * @param int $break Line length before soft break
 *
 */
function debug_print($text, $begin=False, $end=False, $special_chars=True, $break=76) {
    $begin = $begin ? $begin : strlen($text);
    $end = $end ? $end : strlen($text);

    for ($i=$begin; $i <= $end; $i++) {
        $input = substr($text, 0, $i);
        $output = Mail_mimePart::quotedPrintableEncode($input, $break);

        if ($special_chars) {
            $input_vis = str_replace("\t", '\t', str_replace("\n", '\n', str_replace("\r", '\r', $input)));
        } else {
            $input_vis = $input;
        }
        printf("input: %02d: %s\n", strlen($input), $input_vis);

        $lines = explode("\r\n", $output);
        for($j=0; $j < count($lines); $j++) {
            $line = $lines[$j];
            if ($j + 1 < count($lines) && $special_chars) {
                $line_vis = str_replace("\t", '\t', $line).'\r\n';
            } else {
                $line_vis = $line;
            }
            printf("output:%02d: %s\n", strlen($line), $line_vis);
        }
        print("---\n");
    }
}

// Test linebreaks on regular long lines
$text = '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
debug_print($text, 74);

// Test linebreaks on long line with dot at end.
$text = '123456789.12';
debug_print($text, 10, False, False, 10);

$text = "\tHere's\t\na tab.\n";
debug_print($text, False, False, True, 8);

--EXPECT--
input: 74: 12345678901234567890123456789012345678901234567890123456789012345678901234
output:74: 12345678901234567890123456789012345678901234567890123456789012345678901234
---
input: 75: 123456789012345678901234567890123456789012345678901234567890123456789012345
output:75: 123456789012345678901234567890123456789012345678901234567890123456789012345
---
input: 76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
output:76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
---
input: 77: 12345678901234567890123456789012345678901234567890123456789012345678901234567
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:02: 67
---
input: 78: 123456789012345678901234567890123456789012345678901234567890123456789012345678
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:03: 678
---
input: 79: 1234567890123456789012345678901234567890123456789012345678901234567890123456789
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:04: 6789
---
input: 80: 12345678901234567890123456789012345678901234567890123456789012345678901234567890
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:05: 67890
---
input: 10: 123456789.
output:10: 123456789.
---
input: 11: 123456789.1
output:10: 123456789=
output:04: =2E1
---
input: 12: 123456789.12
output:10: 123456789=
output:05: =2E12
---
input: 16: \tHere's\t\na tab.\n
output:08: \tHere's=\r\n
output:03: =09\r\n
output:06: a tab.\r\n
output:00: 
---
pear/test/Mail_Mime/tests/test_Bug_15320.phpt000064400000000716151732710230014655 0ustar00--TEST--
Bug #15320  Charset parameter in Content-Type of mail parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$Mime = new Mail_mime();
$Mime->addAttachment('testfile', "text/plain", 'file.txt', FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
//$content = str_replace("\n", '', $content);

if (preg_match('/Content-type:([^\n]+)/i', $content, $matches)) {
    echo $matches[1];
}

?>
--EXPECT--
text/plain; charset=ISO-8859-1;

pear/test/Mail_Mime/tests/test_Bug_19497.phpt000064400000001043151732710240014673 0ustar00--TEST--
Bug #19497  Attachment filenames with a slash character
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

$filename = "test/file.txt";
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
    'base64', 'attachment', 'ISO-8859-1', '', '', 'quoted-printable', 'base64');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}
?>
--EXPECT--
"test/file.txt"
"test/file.txt";
pear/test/Mail_Mime/tests/test_Bug_8541_1.phpt000064400000000763151732710240015027 0ustar00--TEST--
Bug #8541   mimePart.php line delimiter is \r
--SKIPIF--
--FILE--
<?php
$mime = file_get_contents('Mail/mime.php', 1);
$mimePart = file_get_contents('Mail/mimePart.php', 1);
if (strpos($mime, "\r")){
    print("\\r found in mime.php\n");
}elseif (strpos($mime, "\t")){
    print("\\t found in mime.php\n");
}elseif (strpos($mimePart, "\r")){
    print("\\r found in mimePart.php\n");
}elseif (strpos($mimePart, "\t")){
    print("\\t found in mimePart.php\n");
}
print('OK');
--EXPECT--
OK
pear/test/Mail_Mime/tests/test_Bug_7561_1.phpt000064400000001205151732710240015020 0ustar00--TEST--
Bug #7561   Mail_mimePart::quotedPrintableEncode() misbehavior with mbstring overload
--INI--
mbstring.language=Neutral
mbstring.func_overload=6
mbstring.internal_encoding=UTF-8
mbstring.http_output=UTF-8
--SKIPIF--
<?php
include "PEAR.php";
if (!extension_loaded('mbstring')){
    if (!PEAR::loadExtension('mbstring')){
        print('SKIP could not load mbstring module');
    }
}
--FILE--
<?php
include("Mail/mimePart.php");
// string is UTF-8 encoded
$input = "Micha\xC3\xABl \xC3\x89ric St\xC3\xA9phane";
$rv = Mail_mimePart::quotedPrintableEncode($input, 76, "\n");
echo $rv, "\n";
--EXPECT--
Micha=C3=ABl =C3=89ric St=C3=A9phane
pear/test/Mail_Mime/tests/test_Bug_GH26.phpt000064400000001363151732710240014651 0ustar00--TEST--
Bug GH-26  Backward slash is getting added in headers
--SKIPIF--
--FILE--
<?php

require_once('Mail/mime.php');

$mail_mime = new Mail_mime("\n");

$from = '"George B@@Z"<george@cort.org.au>';
$to = <<<EOT
"austin test"<austinn@cort.org>,<reno@cort.org>,t@mail.com
EOT;
$subject = "Test mime";
$mailbody = "hello world";

$mail_mime->setTxtBody($mailbody);
$mail_mime->setHTMLBody($mailbody);
$mail_mime->setSubject($subject);
$mail_mime->setFrom($from);

$body = $mail_mime->get();

$extra_headers = array();
$extra_headers["To"] = $to;

$arr_hdrs = $mail_mime->headers($extra_headers);

echo $arr_hdrs['From'] . "\n" . $arr_hdrs['To'];

--EXPECT--
"George B@@Z" <george@cort.org.au>
"austin test" <austinn@cort.org>, <reno@cort.org>, t@mail.compear/test/Mail_Mime/tests/headers_without_mbstring.phpt000064400000020505151732710240017451 0ustar00--TEST--
Multi-test for headers encoding using base64 and quoted-printable
--SKIPIF--
<?php
if (function_exists('mb_substr') && function_exists('mb_strlen')) {
    die("skip mbstring functions found!");
}
?>
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
array('From', '<adresse@adresse.de>'),
array('From', 'adresse@adresse.de'),
array('From', 'Frank Do <adresse@adresse.de>'),
array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
array('From', '"Frank Do" <adresse@adresse.de>'),
array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
array('From', '"adresse@adresse.de" <addresse@adresse>'),
array('From', 'adresse@adresse.de <addresse@adresse>'),
array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
array('Subject', 'Short ASCII subject'),
array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
array('Subject', 'Short Unicode ż subject'),
array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl>  <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
array('To', 'Frank " \\Do <adresse@adresse.de>'),
array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
array('From', "test@nàme <user@domain.com>"),
array('From', "Test <\"test test\"@domain.com>"),
array('From', "\"test test\"@domain.com"),
array('From', "<\"test test\"@domain.com>"),
array('From', "Doe<test@domain.com>"),
array('From', "\"John Doe\"<test@domain.com>"),
array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
);

$i = 1;
foreach ($headers as $header) {
    $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'base64');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'quoted-printable');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $i++;
}
?>
--EXPECT--
[01] From: <adresse@adresse.de>
[01] From: <adresse@adresse.de>
[02] From: adresse@adresse.de
[02] From: adresse@adresse.de
[03] From: Frank Do <adresse@adresse.de>
[03] From: Frank Do <adresse@adresse.de>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[05] From: "Frank Do" <adresse@adresse.de>
[05] From: "Frank Do" <adresse@adresse.de>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
 =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
[07] Cc: <adresse@adresse.de>,
 =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz_D?=
 =?UTF-8?Q?=C5=82uga_nazwa?= <cris@domain.com>
[08] From: "adresse@adresse.de" <addresse@adresse>
[08] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
 =?UTF-8?B?ZGU+?=
[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
 =?UTF-8?Q?=2Ede=3E?=
[12] Subject: Short ASCII subject
[12] Subject: Short ASCII subject
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
 =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g=C4?=
 =?UTF-8?Q?=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zD?=
 =?UTF-8?B?n2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciEhIT8=?=
[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir?=
 =?UTF-8?Q?_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_g?=
 =?UTF-8?Q?r=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tol?=
 =?UTF-8?Q?le_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
 =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
 =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper?=
 =?UTF-8?Q?_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_t?=
 =?UTF-8?Q?olle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
 =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6sa?=
 =?UTF-8?Q?rtiger_Software_3=2E6?=
[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
[24] From: Test <"test test"@domain.com>
[24] From: Test <"test test"@domain.com>
[25] From: "test test"@domain.com
[25] From: "test test"@domain.com
[26] From: <"test test"@domain.com>
[26] From: <"test test"@domain.com>
[27] From: Doe <test@domain.com>
[27] From: Doe <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
pear/test/Mail_Mime/tests/test_Bug_3513_1.phpt000064400000000733151732710240015016 0ustar00--TEST--
Bug #3513   Support of RFC2231 in header fields. (ISO-8859-1)
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$test = "F��b�r.txt";
$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}

--EXPECT--
*=ISO-8859-1''F%F3%F3b%E6r.txt;
pear/test/Mail_Mime/tests/test_linebreak_dot.phpt000064400000003230151732710250016204 0ustar00--TEST--
Test for correct "." encoding when doing linebreaks
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT
include("Mail/mime.php");
$text     = '0123456789012345678901234567890123456789012345678901234567890123456789012...6';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);

for ($i=74; $i <= strlen($text); $i++) {
    $input = substr($text, 0, $i);
    $mimePart = new Mail_mimePart($input, $params);
    $encoded  =  $mimePart->encode();
    $output = $encoded['body'];
    printf("input: %02d: %s\n", strlen($input), $input);

    $lines = explode("\r\n", $output);
    for($j=0; $j < count($lines); $j++) {
        $line = $lines[$j];
        if ($j + 1 < count($lines)) {
            $line_vis = $line.'\r\n';
        } else {
            $line_vis = $line;
        }
        printf("output:%02d: %s\n", strlen($line), $line_vis);
    }

    print("---\n");

}
--EXPECT--
input: 74: 0123456789012345678901234567890123456789012345678901234567890123456789012.
output:74: 0123456789012345678901234567890123456789012345678901234567890123456789012.
---
input: 75: 0123456789012345678901234567890123456789012345678901234567890123456789012..
output:75: 0123456789012345678901234567890123456789012345678901234567890123456789012..
---
input: 76: 0123456789012345678901234567890123456789012345678901234567890123456789012...
output:76: 0123456789012345678901234567890123456789012345678901234567890123456789012...
---
input: 77: 0123456789012345678901234567890123456789012345678901234567890123456789012...6
output:76: 0123456789012345678901234567890123456789012345678901234567890123456789012..=\r\n
output:04: =2E6
---
pear/test/Mail_Mime/tests/test_Bug_21205.phpt000064400000002436151732710250014657 0ustar00--TEST--
Bug #21205  Handling ISO-2022-JP headers
--SKIPIF--
<?php
include "PEAR.php";
if (!extension_loaded('mbstring')) {
    if (!PEAR::loadExtension('mbstring')) {
        print('SKIP could not load mbstring module');
    }
}
--FILE--
<?php
require_once('Mail/mimePart.php');
$tests = array(
    '□京都府□',
    '∠∠∠∠',
);
$addr = ' <aaa@bbb.ccc>';
$charset = 'ISO-2022-JP';
$encoding = 'base64';
foreach ($tests as $test) {
    $test = mb_convert_encoding($test, $charset, 'UTF-8');
    print Mail_mimePart::encodeHeader("subject", $test,       $charset, $encoding) . PHP_EOL;
    print Mail_mimePart::encodeHeader("to",      $test.$addr, $charset, $encoding) . PHP_EOL;
    $test = '"' . $test . '"';
    print Mail_mimePart::encodeHeader("subject", $test,       $charset, $encoding) . PHP_EOL;
    print Mail_mimePart::encodeHeader("to",      $test.$addr, $charset, $encoding) . PHP_EOL;
}
?>
--EXPECT--
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
pear/test/Mail_Mime/tests/test_Bug_12411.phpt000064400000001211151732710250014644 0ustar00--TEST--
Bug #12411  RFC2047 encoded attachment filenames
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

// some text with polish Unicode letter at the beginning
$filename = base64_decode("xZtjaWVtYQ==");
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
    'base64', 'attachment', 'ISO-8859-1', 'pl', '',
    'quoted-printable', 'base64');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}

?>
--EXPECT--
"=?ISO-8859-1?Q?=C5=9Bciema?="
"=?ISO-8859-1?B?xZtjaWVtYQ==?=";
pear/test/Mail_Mime/tests/test_Bug_20226.phpt000064400000000525151732710250014656 0ustar00--TEST--
Bug #20226  Mail_mimePart::encodeHeader() and ISO-2022-JP encoding
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");

$subject = base64_decode("GyRCJT8lJCVIJWsbKEI=");
$mime    = new Mail_mimePart();

echo $mime->encodeHeader('subject', $subject, 'ISO-2022-JP', 'base64');
?>
--EXPECT--
=?ISO-2022-JP?B?GyRCJT8lJCVIJWsbKEI=?=
pear/test/Mail_Mime/tests/test_Bug_16539.phpt000064400000016531151732710250014676 0ustar00--TEST--
Bug #16539  Headers longer than 998 characters
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
'To' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
'Subject' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
);

echo $mime->txtHeaders($headers, true, true);
?>
--EXPECT--
MIME-Version: 1.0
To: jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com
Subject: jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.co
 m,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com
pear/test/Mail_Mime/tests/test_Bug_21206.phpt000064400000001116151732710260014653 0ustar00--TEST--
Bug #21206  Handling quoted strings
--SKIPIF--
--FILE--
<?php
require_once('Mail/mimePart.php');
class X extends Mail_mimePart {
    public static function explodeQuotedString($delimiter, $string) {
        return Mail_mimePart::explodeQuotedString($delimiter, $string);
    }
}

$tests = array(
    '"a" <a@a.a>, b <b@b.b>',
    '"c\\\\" <c@c.c>, d <d@d.d>',
);
foreach ($tests as $test) {
    $addrs = X::explodeQuotedString('[\t,]', $test);
    foreach ($addrs as $addr) {
        print trim($addr) . PHP_EOL;
    }
}
?>
--EXPECT--
"a" <a@a.a>
b <b@b.b>
"c\\" <c@c.c>
d <d@d.d>
pear/test/Mail_Mime/tests/test_Bug_12385_1.phpt000064400000001033151732710260015101 0ustar00--TEST--
Bug #12385  Bad regex when replacing css style attachments
--SKIPIF--
--FILE--
<?php
$from='user@from.example.com';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body="<style>
className {
    background-image: url('test.gif');
}
</script>
";

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg = $mime->get();

$cidtag = preg_match("|url\('cid:[^']*'\);|", $msg);
if (!$cidtag){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
pear/test/Mail_Mime/tests/headers_with_mbstring.phpt000064400000021227151732710260016725 0ustar00--TEST--
Multi-test for headers encoding using base64 and quoted-printable
--SKIPIF--
<?php
if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
    die "skip mbstring functions not found!";
}
?>
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
array('From', '<adresse@adresse.de>'),
array('From', 'adresse@adresse.de'),
array('From', 'Frank Do <adresse@adresse.de>'),
array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
array('From', '"Frank Do" <adresse@adresse.de>'),
array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
array('From', '"adresse@adresse.de" <addresse@adresse>'),
array('From', 'adresse@adresse.de <addresse@adresse>'),
array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
array('Subject', 'Short ASCII subject'),
array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
array('Subject', 'Short Unicode ż subject'),
array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl>  <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
array('To', 'Frank " \\Do <adresse@adresse.de>'),
array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
array('From', "test@nàme <user@domain.com>"),
array('From', "Test <\"test test\"@domain.com>"),
array('From', "\"test test\"@domain.com"),
array('From', "<\"test test\"@domain.com>"),
array('From', "Doe<test@domain.com>"),
array('From', "\"John Doe\"<test@domain.com>"),
array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
array('Subject', mb_convert_encoding('㈱山﨑工業', 'ISO-2022-JP-MS', 'UTF-8'), 'ISO-2022-JP'),
);

$i = 1;
foreach ($headers as $header) {
    $charset = isset($header[2]) ? $header[2] : 'UTF-8';
    $hdr = $mime->encodeHeader($header[0], $header[1], $charset, 'base64');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $hdr = $mime->encodeHeader($header[0], $header[1], $charset, 'quoted-printable');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $i++;
}
?>
--EXPECT--
[01] From: <adresse@adresse.de>
[01] From: <adresse@adresse.de>
[02] From: adresse@adresse.de
[02] From: adresse@adresse.de
[03] From: Frank Do <adresse@adresse.de>
[03] From: Frank Do <adresse@adresse.de>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[05] From: "Frank Do" <adresse@adresse.de>
[05] From: "Frank Do" <adresse@adresse.de>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
 =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz?=
 =?UTF-8?Q?_D=C5=82uga_nazwa?= <cris@domain.com>
[08] From: "adresse@adresse.de" <addresse@adresse>
[08] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
 =?UTF-8?B?ZGU+?=
[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
 =?UTF-8?Q?=2Ede=3E?=
[12] Subject: Short ASCII subject
[12] Subject: Short ASCII subject
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
 =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g?=
 =?UTF-8?Q?=C4=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7w=?=
 =?UTF-8?B?w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBt?=
 =?UTF-8?B?aXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVy?=
 =?UTF-8?B?IGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0?=
 =?UTF-8?B?b2xsZSBncsO8w59lIHZvbiBtaXIhISE/?=
[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
 =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCp?=
 =?UTF-8?Q?er_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6?=
 =?UTF-8?Q?se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr?=
 =?UTF-8?Q?=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
 =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von?=
 =?UTF-8?Q?_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S?=
 =?UTF-8?Q?=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
 =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6?=
 =?UTF-8?Q?sartiger_Software_3=2E6?=
[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
[24] From: Test <"test test"@domain.com>
[24] From: Test <"test test"@domain.com>
[25] From: "test test"@domain.com
[25] From: "test test"@domain.com
[26] From: <"test test"@domain.com>
[26] From: <"test test"@domain.com>
[27] From: Doe <test@domain.com>
[27] From: Doe <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[31] Subject: =?ISO-2022-JP?B?GyRCLWo7M3l1OSk2SBsoQg==?=
[31] Subject: =?ISO-2022-JP?Q?=24B-j=28B=24B=3B3=28B=24Byu=28B?=
 =?ISO-2022-JP?Q?=24B9=29=28B=24B6H=28B?=
pear/test/Mail_Mime/tests/test_Bug_8386_1.phpt000064400000001047151732710260015034 0ustar00--TEST--
Bug #8386   HTML body not correctly encoded if attachments present
--SKIPIF--
--FILE--
<?php
$eol = "\n#";
include("Mail/mime.php");
$encoder = new Mail_mime(array('eol'=>$eol));
$encoder->setTXTBody('test');
$encoder->setHTMLBody('<b>test</b>');
$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
$body = $encoder->get();
if (strpos($body, '--' . $eol . '--=')){
    print("FAILED\n");
    print("Single delimiter() between 2 parts found.\n");
    print($body);
}else{
    print("OK");
}
?>
--EXPECT--
OK
pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt000064400000001112151732710260017654 0ustar00--TEST--
Bug #3488   Sleep/Wakeup EOL Consistency - Part 2
--SKIPIF--
if (!is_readable('sleep_wakeup_data')) {
    echo "skip No data. Part 1 must run first.\n";
}
--FILE--
<?php
require_once('Mail/mime.php');
$filename = 'sleep_wakeup_data';
$fp = fopen($filename, 'r');
$smm = fread($fp, filesize($filename));
fclose($fp);
@unlink($filename);

$mmData = unserialize($smm);
$mmData['mm']->get();
$x = $mmData['mm']->headers();

list($h1) = explode("\n", $mmData['header']);
list($h2) = explode("\n", $x['Content-Type']);

echo ($h1 == $h2) ? "Match" : "No Match";

?>
--EXPECT--
Match
pear/test/Mail_Mime/tests/test_Bug_3513_3.phpt000064400000001167151732710260015024 0ustar00--TEST--
Bug #3513   Support of RFC2231 in header fields. (ISO-2022-JP)
--SKIPIF--
--FILE--
<?php
mb_internal_encoding('ISO-2022-JP');
$testEncoded="GyRCRnxLXDhsGyhCLnR4dA==";
$test = base64_decode($testEncoded); // Japanese filename in ISO-2022-JP charset.
require_once('Mail/mime.php');

$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'iso-2022-jp', '');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}
?>
--EXPECT--
*=iso-2022-jp''%1B$BF|K%5C8l%1B%28B.txt;

pear/test/Mail_Mime/tests/test_Bug_10816_1.phpt000064400000001072151732710270015102 0ustar00--TEST--
Bug #10816  Unwanted linebreak at the end of output
--SKIPIF--
--FILE--
<?php
$eol = "#";
include("Mail/mime.php");
$encoder = new Mail_mime(array('eol'=>$eol));
$encoder->setTXTBody('test');
$encoder->setHTMLBody('<b>test</b>');
$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
$body = $encoder->get();
$taillength = -1 * strlen($eol) * 2;
if (substr($body, $taillength) == ($eol.$eol)){
    print("FAILED\n");
    print("Body:\n");
    print("..." . substr($body, -10) . "\n");
}else{
    print("OK\n");
}
--EXPECT--
OK

pear/test/Mail_Mime/tests/test_Bug_20273.phpt000064400000000456151732710270014665 0ustar00--TEST--
Bug #20273  Mail_mimePart::encodeHeader() and TAB character
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");

$refs = "<test@domain.tld>\t<test2@domain.tld>";
$mime = new Mail_mimePart();
echo $mime->encodeHeader('References', $refs);
?>
--EXPECT--
<test@domain.tld> <test2@domain.tld>
pear/test/Mail_Mime/tests/test_Bug_10596_1.phpt000064400000000450151732710270015106 0ustar00--TEST--
Bug #10596  Incorrect handling of text and html '0' bodies
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();
$mime->setTxtBody('0');
$mime->setHTMLBody('0');
$body = $mime->get();
if ($body){
    print("OK");
}else{
    print("NO BODY FOUND");
}
--EXPECT--
OK
pear/test/Mail_Mime/tests/test_Bug_21098.phpt000064400000000606151732710270014670 0ustar00--TEST--
Bug #21098  Handling of empty plain text parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime();
$mime->setTxtBody('');
$mime->setHTMLBody('<html></html>');

$headers1 = $mime->txtHeaders();
$body     = $mime->get();
$headers2 = $mime->txtHeaders();
print strpos($headers1, 'text/html') && strpos($headers2, 'text/html') ? 'OK' : 'NOT OK';
--EXPECT--
OK
pear/test/Mail_Mime/tests/encoding_case.phpt000064400000000364151732710270015133 0ustar00--TEST--
Bug #2364   Tabs in Mail_mimePart::quotedPrintableEncode()
--SKIPIF--
--FILE--
<?php
$test = "Here's\t\na tab\n";
require_once('Mail/mimePart.php');
print Mail_mimePart::quotedPrintableEncode($test, 7);
?>
--EXPECT--
Here's=
=09
a tab
pear/test/Mail_Mime/tests/test_Bug_10999_1.phpt000064400000000753151732710270015123 0ustar00--TEST--
Bug #10999  Bad Content-ID(cid) format
--SKIPIF--
--FILE--
<?php
$from='user@from.example.com';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body='<img src="test.gif"/>';

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg=$mime->get();

$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
if (!$header){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
pear/test/Mail_Mime/tests/test_Bug_14780.phpt000064400000000537151732710270014673 0ustar00--TEST--
Bug #14780  Invalid Content-Type when headers() is called before get()
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime();
$mime->setTXTBody("test");
$mime->setHTMLBody("test");

$head1 = $mime->headers();
$body = $mime->get();
$head2 = $mime->headers();

if ($head1 === $head2) {
    echo "OK";
}

?>
--EXPECT--
OK
pear/test/Mail_Mime/tests/test_Bug_21027.phpt000064400000016177151732710270014672 0ustar00--TEST--
Bug #21027  Calendar support along with attachments and html images
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$txtBody = 'Hi, this is Plain Text Body.';
$htmlBody = '<div>This is HTML body.</div>';
$icsText = 'BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//icalcreator//NONSGML iCalcreator 2.22//
METHOD:REQUEST
BEGIN:VEVENT
UID:77@localhost
DTSTAMP:20160208T170811Z
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;CN=Jacob Alvarez:MAILTO:fake1@mailinator.com
CREATED:20160208T170810Z
DTSTART:20160215T180000Z
DTEND:20160215T190000Z
ORGANIZER;CN=-:MAILTO:fake2@mailinator.com
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:Prueba 69
TRANSP:OPAQUE
URL:http://localhost/event/77
END:VEVENT
END:VCALENDAR';

function printPartsStartAndEnd($body) {
    $matches  = array();
    preg_match_all('/--(=_[a-z0-9]+)--|Content-Type: ([^;\r\n]+)/', $body, $matches);
    $tab = "    ";
    foreach ($matches[0] as $match){
        if (strpos($match, '--') === false) {
            printf("%s%s\n", $tab, $match);
            if (stripos($match, "multipart")) {
                $tab .= "    ";
            }
        } else {
            $tab = substr($tab, 0, -4);
            printf("%sEnd part\n", $tab);
        }
    }
}

function printHeaderContentType($headers) {
    $headerContentType = array();
    preg_match('/([^;\r\n]+)/', $headers['Content-Type'], $headerContentType);
    printf("Content-Type: %s\n", $headerContentType[0]);
}

print "TEST: text\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: attachments\n";
$mime = new Mail_mime();
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: text + attachments\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html + attachments\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html + inline images\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage("aaaaaaaaaa", 'image/gif', 'image.gif', false, 'contentid');
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print("TEST: txt, html and attachment\n");
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addAttachment("test", 'application/octet-stream', 'attachment', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: calendar\n";
$mime = new Mail_mime();
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt + calendar\n";
$mime->setTXTBody($txtBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html, calendar\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html + html images, and calendar\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage('testimage', 'image/gif', "bus.gif", false);
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print("TEST: txt, html, calendar and attachment\n");
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->setCalendarBody($icsText);
$mime->addAttachment("test", 'application/octet-stream', 'attachment', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html + html images, calendar, and attachment\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage('testimage', 'image/gif', "bus.gif", false);
$mime->setCalendarBody($icsText);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");
?>
--EXPECT--
TEST: text
Content-Type: text/plain

TEST: html
Content-Type: text/html

TEST: attachments
Content-Type: multipart/mixed
    Content-Type: application/ics
End part

TEST: text + attachments
Content-Type: multipart/mixed
    Content-Type: text/plain
    Content-Type: application/ics
End part

TEST: html + attachments
Content-Type: multipart/mixed
    Content-Type: text/html
    Content-Type: application/ics
End part

TEST: html + inline images
Content-Type: multipart/related
    Content-Type: text/html
    Content-Type: image/gif
End part

TEST: txt, html and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: text/html
    End part
    Content-Type: application/octet-stream
End part

TEST: calendar
Content-Type: text/calendar

TEST: txt + calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: text/calendar
End part

TEST: txt, html, calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: text/html
    Content-Type: text/calendar
End part

TEST: txt, html + html images, and calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: multipart/related
        Content-Type: text/html
        Content-Type: image/gif
    End part
    Content-Type: text/calendar
End part

TEST: txt, html, calendar and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: text/html
        Content-Type: text/calendar
    End part
    Content-Type: application/octet-stream
End part

TEST: txt, html + html images, calendar, and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: multipart/related
            Content-Type: text/html
            Content-Type: image/gif
        End part
        Content-Type: text/calendar
    End part
    Content-Type: application/ics
End part
pear/test/Mail_Mime/tests/test_Bug_17025.phpt000064400000000634151732710270014664 0ustar00--TEST--
Bug #16539  Headers longer than 998 characters
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$headers['From'] = 'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh';
# over than 76 chars
$mime = new Mail_mime();
$hdrs = $mime->headers($headers);
print_r($hdrs['From']); 
?>
--EXPECT--
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh
pear/test/Mail_Mime/tests/test_Bug_18083.phpt000064400000001120151732710270014660 0ustar00--TEST--
Bug #18083  Separate charset for attachment's content and headers
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

$Mime->addAttachment('testfile', "text/plain",
    base64_decode("xZtjaWVtYQ=="), FALSE,
    'base64', 'attachment', 'ISO-8859-1', 'pl', '',
    'quoted-printable', 'base64', '', 'UTF-8');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}
?>
--EXPECT--
"=?UTF-8?Q?=C5=9Bciema?="
"=?UTF-8?B?xZtjaWVtYQ==?=";
pear/test/Mail_Mime/tests/test_Bug_12165.phpt000064400000000575151732710270014670 0ustar00--TEST--
Bug #12165  Dot at the end of the line disappeared
--SKIPIF--
--FILE--
<?php
include ("Mail/mime.php");
$string='http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com';
$mime = new Mail_mime();
$mime->setHTMLBody($string);
print_r($mime->get());
    
--EXPECT--
http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
=2Ecom
pear/test/Mail_Mime/tests/test_Bug_14779.phpt000064400000000751151732710270014701 0ustar00--TEST--
Bug #14779  Proper header-body separator for empty attachment
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$m = new Mail_mime();
$m->addAttachment('', "text/plain", 'file.txt', FALSE, 'base64', 'attachment');
$result = $m->get();

if (preg_match('/(Content.*)--=.*/s', $result, $matches)) {
    print_r($matches[1]."END");
}

?>
--EXPECT--
Content-Transfer-Encoding: base64
Content-Type: text/plain;
 name=file.txt
Content-Disposition: attachment;
 filename=file.txt


END
pear/test/Mail_Mime/tests/test_Bug_20563.phpt000064400000000572151732710270014666 0ustar00--TEST--
Bug #20563  isMultipart() method tests
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime;

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

$mime->setTXTBody('test');

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

$mime->setHTMLBody('test');

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

--EXPECT--
FALSE
FALSE
TRUE
pear/test/Mail_Mime/tests/test_Bug_12466.phpt000064400000000675151732710270014675 0ustar00--TEST--
Bug #12466  Content-Transfer-Encoding checking
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$params = array(
    'text_encoding' => '7bit',
    'html_encoding' => '7bit',
);
$mime = new Mail_mime($params);
$mime->setTXTBody("ż");
$mime->setHTMLBody("z");
$body = $mime->getMessage();

preg_match_all('/Content-Transfer-Encoding: (.*)/', $body, $m);
echo trim($m[1][0])."\n".trim($m[1][1]);

?>
--EXPECT--
quoted-printable
7bit
pear/test/Mail_Mime/tests/test_Bug_21255.phpt000064400000000540151732710300014652 0ustar00--TEST--
Bug #21255  Boundary gets added twice
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->setContentType('multipart/alternative', array('boundary' => 'something'));

$msg = $mime->getMessage();

echo substr_count($msg, 'boundary=');

?>
--EXPECT--
1
pear/test/Mail_Mime/tests/test_Bug_GH19.phpt000064400000001745151732710300014654 0ustar00--TEST--
Bug GH-19  Test boundary value with different headers()/get() call order
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

// Test get() before headers()

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');

$body = $mime->get();
$hdrs = $mime->headers(array(
        'From'    => 'test@domain.tld',
        'Subject' => 'Subject',
        'To'      => 'to@domain.tld'
));

preg_match('/boundary="([^"]+)/', $hdrs['Content-Type'], $matches);
$boundary = $matches[1];

echo substr_count($body, "--$boundary") . "\n";

// Test headers() before get()

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');

$hdrs = $mime->headers(array(
        'From'    => 'test@domain.tld',
        'Subject' => 'Subject',
        'To'      => 'to@domain.tld'
));
$body = $mime->get();

preg_match('/boundary="([^"]+)/', $hdrs['Content-Type'], $matches);
$boundary = $matches[1];

echo substr_count($body, "--$boundary");
--EXPECT--
3
3
pear/test/Mail_Mime/tests/test_Bug_13032.phpt000064400000001033151732710300014642 0ustar00--TEST--
Bug #13032  Proper (different) boundary for nested parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->addAttachment('file.pdf', 'application/pdf', 'file.pdf', false, 'base64', 'inline');
$msg = $mime->getMessage();

if (preg_match_all('/boundary="([^"]+)"/', $msg, $matches)) {
    if (count($matches) == 2 && count($matches[1]) == 2 &&
        $matches[1][0] != $matches[1][1]) {
            print('OK');
    }
}
?>
--EXPECT--
OK
pear/test/Mail_Mime/tests/content_transfer_encoding.phpt000064400000001634151732710300017571 0ustar00--TEST--
Test empty Content-Transfer-Encoding on multipart messages
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$mime = new Mail_mime("\r\n");
$mime->setParam('text_encoding', 'quoted-printable');
$mime->setParam('html_encoding', 'quoted-printable');
$mime->setParam('head_encoding', 'quoted-printable');

// This specific order used to set Content-Transfer-Encoding: quoted-printable
// which is invalid according to RFC 2045 on multipart messages
$mime->setTXTBody('text');
$mime->headers(array('From' => 'from@domain.tld'));
$mime->addAttachment('file.pdf', 'application/pdf', 'file.pdf', false, 'base64', 'inline');
echo $mime->txtHeaders();
list ($header, $body) = explode("\r\n\r\n", $mime->getMessage());
echo $header;
?>
--EXPECTF--
MIME-Version: 1.0
From: from@domain.tld
Content-Type: multipart/mixed;
 boundary="=_%x"
MIME-Version: 1.0
From: from@domain.tld
Content-Type: multipart/mixed;
 boundary="=_%x"
pear/test/Mail_Mime/tests/test_Bug_11381.phpt000064400000001055151732710300014653 0ustar00--TEST--
Bug #11381  Domain name is attached to content-id, trailing greater-than sign is not removed
--SKIPIF--
--FILE--
<?php
$from='Test User <user@from.example.com>';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body='<img src="test.gif"/>';

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg=$mime->get();

$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
if (!$header){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
pear/test/Mail_Mime/tests/test_Bug_14529.phpt000064400000001011151732710300014652 0ustar00--TEST--
Bug #14529  basename() workaround
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$Mime = new Mail_mime();
// some text with polish Unicode letter at the beginning
$filename = base64_decode("xZtjaWVtYQ==");
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}
?>
--EXPECT--
*=ISO-8859-1''%C5%9Bciema;
pear/test/Mail_Mime/tests/test_Bug_20564.phpt000064400000000416151732710300014656 0ustar00--TEST--
Bug #20564  Unsetting headers
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime;
$mime->setSubject('test');

$headers = $mime->headers(array('Subject' => null), true);
echo array_key_exists('Subject', $headers) ? '1' : '0';
--EXPECT--
0pear/test/Mail_Mime/tests/test_linebreak_larger_76.phpt000064400000004403151732710310017206 0ustar00--TEST--
Test for correct linebreaks for lines _longer_ than 76 chars.
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT

include("Mail/mime.php");
$text     = '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);

for ($i=74; $i <= strlen($text); $i++) {
    $input = substr($text, 0, $i);
    $mimePart = new Mail_mimePart($input, $params);
    $encoded  =  $mimePart->encode();
    $output = $encoded['body'];
    printf("input: %02d: %s\n", strlen($input), $input);

    $lines = explode("\r\n", $output);
    for($j=0; $j < count($lines); $j++) {
        $line = $lines[$j];
        if ($j + 1 < count($lines)) {
            $line_vis = $line.'\r\n';
        } else {
            $line_vis = $line;
        }
        printf("output:%02d: %s\n", strlen($line), $line_vis);
    }
    print("---\n");
}
--EXPECT--
input: 74: 12345678901234567890123456789012345678901234567890123456789012345678901234
output:74: 12345678901234567890123456789012345678901234567890123456789012345678901234
---
input: 75: 123456789012345678901234567890123456789012345678901234567890123456789012345
output:75: 123456789012345678901234567890123456789012345678901234567890123456789012345
---
input: 76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
output:76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
---
input: 77: 12345678901234567890123456789012345678901234567890123456789012345678901234567
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:02: 67
---
input: 78: 123456789012345678901234567890123456789012345678901234567890123456789012345678
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:03: 678
---
input: 79: 1234567890123456789012345678901234567890123456789012345678901234567890123456789
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:04: 6789
---
input: 80: 12345678901234567890123456789012345678901234567890123456789012345678901234567890
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:05: 67890
---
pear/test/XML_Util/tests/Bug5392Tests.php000064400000001377151732710310014055 0ustar00<?php

/**
 * Bug #5392 "encoding of ISO-8859-1 is the only supported encoding"
 *
 * Original characters of the given encoding that are "replaced"
 * should then "reverse" back to perfectly match the original.
 *
 * @link https://pear.php.net/bugs/bug.php?id=5392
 */
class Bug5392Tests extends AbstractUnitTests
{
    public function testReplaceEntitiesForBug5392()
    {
        $original = 'This data contains special chars like <, >, & and " as well as ä, ö, ß, à and ê';
        $replacedResult = XML_Util::replaceEntities($original, XML_UTIL_ENTITIES_HTML, "UTF-8");
        $reversedResult = XML_Util::reverseEntities($replacedResult, XML_UTIL_ENTITIES_HTML, "UTF-8");
        $this->assertEquals($original, $reversedResult, "Failed bugcheck.");
    }
}
pear/test/XML_Util/tests/SplitQualifiedNameTests.php000064400000001507151732710310016530 0ustar00<?php

class SplitQualifiedNameTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::splitQualifiedName()
     */
    public function testSplitQualifiedNameWithoutNamespace()
    {
        $original = "xslt:stylesheet";
        $expected = array(
            'namespace' => 'xslt',
            'localPart' => 'stylesheet',
        );
        $this->assertEquals($expected, XML_Util::splitQualifiedName($original));
    }

    /**
     * @covers XML_Util::splitQualifiedName()
     */
    public function testSplitQualifiedNameWithNamespace()
    {
        $original = "stylesheet";
        $namespace = "myNs";
        $expected = array(
            'namespace' => 'myNs',
            'localPart' => 'stylesheet',
        );
        $this->assertEquals($expected, XML_Util::splitQualifiedName($original, $namespace));
    }
}
pear/test/XML_Util/tests/RaiseErrorTests.php000064400000000700151732710310015057 0ustar00<?php

class RaiseErrorTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::raiseError()
     */
    public function testRaiseError()
    {
        $code = 12345;
        $message = "I am an error";
        $error = XML_Util::raiseError($message, $code);
        $this->assertInstanceOf('PEAR_Error', $error);
        $this->assertEquals($message, $error->getMessage());
        $this->assertEquals($code, $error->getCode());
    }
}
pear/test/XML_Util/tests/ReverseEntitiesTests.php000064400000010326151732710310016127 0ustar00<?php

class ReverseEntitiesTests extends AbstractUnitTests
{
    protected function getSimpleData()
    {
        return 'This string contains &lt; &amp; &gt;.';
    }

    protected function getUtf8Data()
    {
        return 'This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;';
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleData()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData()));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithInvalidOptionReturnsOriginalData()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), 'INVALID_OPTION'));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXml()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML), $encoding);
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, >, & and \" as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML), $encoding);
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlRequired()
    {
        $expected = "This string contains < & &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, &gt;, & and \" as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesHtml()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, >, & and \" as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_HTML, $encoding));
    }
}
pear/test/XML_Util/tests/CreateCommentTests.php000064400000000524151732710310015534 0ustar00<?php

class CreateCommentTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createComment()
     */
    public function testCreateCommentBasicUsage()
    {
        $original = "I am comment.";
        $expected = "<!-- I am comment. -->";
        $this->assertEquals($expected, XML_Util::createComment($original));
    }
}
pear/test/XML_Util/tests/IsValidNameTests.php000064400000003677151732710320015157 0ustar00<?php

class IsValidNameTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameThatIsValid()
    {
        $tagName = "alpha-x_y_z.123";
        $result = XML_Util::isValidName($tagName);
        $this->assertTrue($result);
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameWithInvalidCharacter()
    {
        $tagName = "invalidTag?";
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only contain alphanumeric chars, period, hyphen, colon and underscores";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameWithInvalidStartingCharacter()
    {
        $tagName = "1234five";
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForInt()
    {
        $tagName = 1;
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForEmptyString()
    {
        $tagName = '';
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }
}
pear/test/XML_Util/tests/CreateEndElementTests.php000064400000001145151732710320016153 0ustar00<?php

class CreateEndElementTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createEndElement()
     */
    public function testCreateEndElementBasicUsage()
    {
        $original = "myTag";
        $expected = "</myTag>";
        $this->assertEquals($expected, XML_Util::createEndElement($original));
    }

    /**
     * @covers XML_Util::createEndElement()
     */
    public function testCreateEndElementWithNamespacedTag()
    {
        $original = "myNs:myTag";
        $expected = "</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createEndElement($original));
    }
}
pear/test/XML_Util/tests/CreateTagFromArrayTests.php000064400000032264151732710320016477 0ustar00<?php

class CreateTagFromArrayTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQname()
    {
        $original = array(
            "qname" => "foo:bar",
        );
        $expected = "<foo:bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespace()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
        );
        $expected = "<foo:bar xmlns:foo=\"http://foo.com\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributes()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndAttributesAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithEntitiesNone()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I'm inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_ENTITIES_NONE));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntities()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineFalse()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = false;
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrue()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $expected =
<<< EOF
<foo:bar argh="fruit&amp;vegetable"
         key="value"
         xmlns:foo="http://foo.com">I&apos;m inside the tag</foo:bar>
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $expected =
<<< EOF
<foo:bar argh="fruit&amp;vegetable"
  key="value"
  xmlns:foo="http://foo.com">I&apos;m inside the tag</foo:bar>
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreak()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\"^  key=\"value\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesTrue()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\"^  key=\"value\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesFalse()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $expected = "<foo:bar key=\"value\"^  argh=\"fruit&amp;vegetable\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithInvalidArray()
    {
        $badArray = array(
            "foo" => "bar",
        );
        $expectedError = "You must either supply a qualified name (qname) or local tag name (localPart).";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($badArray));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithNamespaceAndAttributesAndContentButWithoutQname()
    {
        $original = array(
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expectedError = "You must either supply a qualified name (qname) or local tag name (localPart).";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithNonScalarContent()
    {
        $badArray = array(
            'content' => array('foo', 'bar'),
        );
        $expectedError = "Supplied non-scalar value as tag content";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($badArray));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithArrayOfNamespaces()
    {
        $original = array(
            'qname'        => 'foo:bar',
            'namespaces'   => array('ns1' => 'uri1', 'ns2' => 'uri2'),
        );
        $expected = "<foo:bar xmlns:ns1=\"uri1\" xmlns:ns2=\"uri2\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromNamespaceUriAndLocalPart()
    {
        $original = array(
            'namespaceUri' => 'http://bar.org',
            'localPart'    => 'foo'
        );
        $expected = "<foo xmlns=\"http://bar.org\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromNamespaceAndLocalPart()
    {
        $original = array(
            'namespace'    => 'http://foo.org',
            'localPart'    => 'bar'
        );
        $expected = "<http://foo.org:bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromLocalPart()
    {
        $original = array(
            'namespace'    => '',
            'localPart'    => 'bar'
        );
        $expected = "<bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithImplicitlyEmptyContentAndCollapseNoneDoesNotCollapseTag()
    {
        $original = array('qname' => 'tag1');
        $expected = "<tag1></tag1>";
        $actual = XML_Util::createTagFromArray(
            $original,
            XML_UTIL_REPLACE_ENTITIES,  // default $replaceEntities
            false,                      // default $multiline
            '_auto',                    // default $indent
            "\n",                       // default $linebreak
            true,                       // default $sortAttributes
            XML_UTIL_COLLAPSE_NONE
        );
        $this->assertEquals($expected, $actual);
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayForCdataWithExplicitlyEmptyContentDoesNotCollapseTag()
    {
        $original = array('qname' => 'tag1', 'content' => '');
        $expected = "<tag1><![CDATA[]]></tag1>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_CDATA_SECTION));
    }
}
pear/test/XML_Util/tests/ReplaceEntitiesTests.php000064400000010341151732710320016065 0ustar00<?php

class ReplaceEntitiesTests extends AbstractUnitTests
{
    protected function getSimpleData()
    {
        return 'This string contains < & >.';
    }

    protected function getUtf8Data()
    {
        return 'This data contains special chars like <, >, & and " as well as ä, ö, ß, à and ê';
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleData()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData()));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithInvalidOptionReturnsOriginalData()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), 'INVALID_OPTION'));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXml()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlRequired()
    {
        $expected = "This string contains &lt; &amp; >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, >, &amp; and &quot; as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesHtml()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_HTML, $encoding));
    }
}
pear/test/XML_Util/tests/GetDocTypeDeclarationTests.php000064400000003363151732710320017170 0ustar00<?php

class GetDocTypeDeclarationTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRoot()
    {
        $expected = "<!DOCTYPE rootTag>";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag"));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndStringUri()
    {
        $expected = "<!DOCTYPE rootTag SYSTEM \"myDocType.dtd\">";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", "myDocType.dtd"));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndArrayUri()
    {
        $uri = array(
            'uri' => 'http://pear.php.net/dtd/package-1.0',
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1'
        );
        $expected = "<!DOCTYPE rootTag PUBLIC \"-//PHP//PEAR/DTD PACKAGE 0.1\" \"http://pear.php.net/dtd/package-1.0\">";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", $uri));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndArrayUriAndInternalDtd()
    {
        $uri = array(
            'uri' => 'http://pear.php.net/dtd/package-1.0',
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1'
        );
        $dtdEntry = '<!ELEMENT additionalInfo (#PCDATA)>';
        $expected =
<<< EOF
<!DOCTYPE rootTag PUBLIC "-//PHP//PEAR/DTD PACKAGE 0.1" "http://pear.php.net/dtd/package-1.0" [
<!ELEMENT additionalInfo (#PCDATA)>
]>
EOF;
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", $uri, $dtdEntry));
    }
}
pear/test/XML_Util/tests/AttributesToStringTests.php000064400000017026151732710320016634 0ustar00<?php

class AttributesToStringTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringBasicUsage()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitSortTrue()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $sort = true;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitSortFalse()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " foo=\"bar\" boo=\"baz\"";
        $sort = false;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithMultilineFalse()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $sort = true;
        $multiline = false;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithMultilineTrue()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected =
<<< EOF
 boo="baz"
    foo="bar"
EOF;
        $sort = true;
        $multiline = true;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitIndent()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\"\n        foo=\"bar\"";
        $sort = true;
        $multiline = true;
        $indent = '        '; // 8 spaces
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $indent));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitLinebreak()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\"\n^foo=\"bar\"";
        $sort = true;
        $multiline = true;
        $linebreak = '^'; // some dummy character
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithOptionsThatIncludesSort()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $options = array(
            'multiline' => true,
            'indent'    => '----',
            'linebreak' => "^",
            'entities'  => XML_UTIL_ENTITIES_XML,
            'sort'      => true,
        );

        $expected = " boo=\"baz\"\n----foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithOptionsThatExcludesSort()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $options = array(
            'multiline' => true,
            'indent'    => '----',
            'linebreak' => "^",
            'entities'  => XML_UTIL_ENTITIES_XML,
        );

        $expected = " boo=\"baz\"\n----foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesNone()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b><z\" foo=\"b@&r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_NONE));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesXml()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b&gt;&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesXmlRequired()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b>&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesHtml()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b&gt;&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_HTML));
    }

    /**
     * Tag attributes should not be treated as CDATA,
     * so the operation will instead quietly use XML_UTIL_ENTITIES_XML.
     *
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithCDataSectionForSingleAttribute()
    {
        $original = array('foo' => 'bar'); // need exactly one attribute here
        $options = array(
            'sort'      => true,   // doesn't matter for this testcase
            'multiline' => false,  // doesn't matter for this testcase
            'indent'    => null,   // doesn't matter for this testcase
            'linebreak' => null,   // doesn't matter for this testcase
            'entities'  => XML_UTIL_CDATA_SECTION, // DOES matter for this testcase
        );
        $expected = " foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * Tag attributes should not be treated as CDATA,
     * so the operation will instead quietly use XML_UTIL_ENTITIES_XML.
     *
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithCDataSectionForMultipleAttributesAndMultilineFalse()
    {
        $original = array('foo' => 'bar', 'boo' => 'baz'); // need more than one attribute here
        $options = array(
            'sort'      => true,   // doesn't matter for this testcase
            'multiline' => false,  // DOES matter for this testcase, must be false
            'indent'    => null,   // doesn't matter for this testcase
            'linebreak' => null,   // doesn't matter for this testcase
            'entities'  => XML_UTIL_CDATA_SECTION, // DOES matter for this testcase
        );
        $expected = " boo=\"baz\" foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }
}
pear/test/XML_Util/tests/CreateTagTests.php000064400000017452151732710330014657 0ustar00<?php

class CreateTagTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $expected = "<myNs:myTag foo=\"bar\" />";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag";
        $expected = "<myNs:myTag foo=\"bar\">This is inside the tag</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespace()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace));
    }


    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithCDataSection()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\"><![CDATA[This is inside the tag and has < & @ > in it]]></myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_CDATA_SECTION));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntities()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = false;
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $expected =
<<< EOF
<myNs:myTag foo="bar"
            xmlns:myNs="http://www.w3c.org/myNs#">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>
EOF;
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
  xmlns:myNs="http://www.w3c.org/myNs#">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>
EOF;

        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreak()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $expected = "<myNs:myTag foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $expected = "<myNs:myTag boo=\"baz\"^  foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $expected = "<myNs:myTag foo=\"bar\"^  boo=\"baz\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }
}
pear/test/XML_Util/tests/Bug21184Tests.php000064400000000702151732710330014123 0ustar00<?php

/**
 * Bug #21184
 *
 * PREG returns NULL when it encounters an error.
 * In this case, it was encountering PREG_BACKTRACK_LIMIT_ERROR.
 *
 * @link https://pear.php.net/bugs/bug.php?id=21177
 */
class Bug21184 extends AbstractUnitTests
{
    public function testBug21184()
    {
        $xml = '<XML_Serializer_Tag>one</XML_Serializer_Tag>';
        $this->assertEquals($xml, XML_Util::collapseEmptyTags($xml, XML_UTIL_COLLAPSE_ALL));
    }
}
pear/test/XML_Util/tests/CreateStartElementTests.php000064400000012442151732710330016545 0ustar00<?php

class CreateStartElementTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagOnly()
    {
        $original = "myNs:myTag";
        $expected = "<myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createStartElement($original));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $expected = "<myNs:myTag foo=\"bar\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithEmptyAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = "";
        $expected = "<myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespace()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithEmptyAttributesAndNonUriNamespace()
    {
        $originalTag = "myTag";
        $originalAttributes = "";
        $originalNamespace = "foo";
        $expected = "<myTag xmlns=\"foo\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultiline()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
            xmlns:myNs="http://www.w3c.org/myNs#">
EOF;
        $multiline = true;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
  xmlns:myNs="http://www.w3c.org/myNs#">
EOF;
        $multiline = true;
        $indent = "  ";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreak()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreakAndSortAttributesIsTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag boo=\"baz\"^  foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreakAndSortAttributesIsFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\"^  boo=\"baz\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak, $sortAttributes));
    }
}
pear/test/XML_Util/tests/CollapseEmptyTagsTests.php000064400000010401151732710330016403 0ustar00<?php

class CollapseEmptyTagsTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsBasicUsage()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsBasicUsageAlongsideNonemptyTag()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagAlongsideEmptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar><foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyPrefixedTagAlongsideNonemptyTagAlongsideEmptyPrefixedTagWithCollapseAll()
    {
        $emptyTag = "<foo:foo2></foo:foo2>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo:foo2 /><bar>baz</bar><foo:foo2 />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyNsPrefixedTagAlongsideNonemptyTagAlongsideEmptyNsPrefixedTagWithCollapseAll()
    {
        $emptyTag = "<http://foo.com:foo2></http://foo.com:foo2>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<http://foo.com:foo2 /><bar>baz</bar><http://foo.com:foo2 />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseXhtml()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo></foo>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_XHTML_ONLY));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseXhtml()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $xhtmlTag = "<br></br>";
        $expected = "<foo></foo><br /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $xhtmlTag . $otherTag, XML_UTIL_COLLAPSE_XHTML_ONLY));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseNone()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo></foo>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_NONE));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseNone()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo></foo><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag, XML_UTIL_COLLAPSE_NONE));
    }
}
pear/test/XML_Util/tests/ApiVersionTests.php000064400000000335151732710330015067 0ustar00<?php

class ApiVersionTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::apiVersion()
     */
    public function testApiVersion()
    {
        $this->assertEquals('1.4', XML_Util::apiVersion());
    }
}pear/test/XML_Util/tests/Bug18343Tests.php000064400000003316151732710330014132 0ustar00<?php

/**
 * Bug #18343 "Entities in file names decoded during packaging"
 *
 * No matter what flags are given to createTagFromArray(),
 * an attribute must *always* be at least ENTITIES_XML encoded.
 *
 * @link https://pear.php.net/bugs/bug.php?id=18343
 */
class Bug18343Tests extends AbstractUnitTests
{
    private $tagArray = array(
        "qname"      => "install",
        "attributes" => array(
            "as"    => "Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&s=Newsweek",
            "name"  => "test/Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&s=Newsweek",
        )
    );

    public function getFlagsToTest()
    {
        new XML_Util(); // for constants to be declared

        return array(
            array('no flag', null),
            array('false', false),
            array('ENTITIES_NONE', XML_UTIL_ENTITIES_NONE),
            array('ENTITIES_XML', XML_UTIL_ENTITIES_XML),
            array('ENTITIES_XML_REQUIRED', XML_UTIL_ENTITIES_XML_REQUIRED),
            array('ENTITIES_HTML', XML_UTIL_ENTITIES_HTML),
            array('REPLACE_ENTITIES', XML_UTIL_REPLACE_ENTITIES),
        );
    }

    /**
     * @dataProvider getFlagsToTest()
     */
    public function testCreateTagFromArrayForBug18343($key, $flag)
    {
        // all flags for the candidate input should return the same result
        $expected =
<<< EOF
<install as="Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&amp;s=Newsweek" name="test/Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&amp;s=Newsweek" />
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($this->tagArray, $flag), "Failed bugcheck for $key.");
    }
}
pear/test/XML_Util/tests/AbstractUnitTests.php000064400000000650151732710330015413 0ustar00<?php

/*
 * Allow for PHPUnit 4.* while XML_Util is still usable on PHP 5.4
 */
if (!class_exists('PHPUnit_Framework_TestCase')) {
    class PHPUnit_Framework_TestCase extends \PHPUnit\Framework\TestCase {}
}

abstract class AbstractUnitTests extends \PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        // ensure the class is defined, and thus its constants are declared
        new XML_Util();
    }
}
pear/test/XML_Util/tests/Bug21177Tests.php000064400000002036151732710340014130 0ustar00<?php

/**
 * Bug #21177 "XML_Util::collapseEmptyTags() can return NULL"
 *
 * PREG returns NULL when it encounters an error.
 * In this case, it was encountering PREG_BACKTRACK_LIMIT_ERROR.
 *
 * @link https://pear.php.net/bugs/bug.php?id=21177
 */
class Bug21177Tests extends AbstractUnitTests
{
    public function getTestCandidate()
    {
        $expected = '<id_mytest_yesorno />';

        return array(
            array('<idmytestyesorno></idmytestyesorno>',        '<idmytestyesorno />'),
            array('<idmytestyesorno />',                        '<idmytestyesorno />'),

            array('<id_mytest_yesorno></id_mytest_yesorno>',    '<id_mytest_yesorno />'),
            array('<id_mytest_yesorno />',                      '<id_mytest_yesorno />'),
        );
    }

    /**
     * @dataProvider getTestCandidate()
     */
    public function testCollapseEmptyTagsForBug21177($original, $expected)
    {
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($original, XML_UTIL_COLLAPSE_ALL), "Failed bugcheck.");
    }
}
pear/test/XML_Util/tests/Bug4950Tests.php000064400000001331151732710340014045 0ustar00<?php

/**
 * Bug #4950 "Incorrect CDATA serializing"
 *
 * Content that looks like CDATA end characters and tags
 * should still be recognized solely as content text.
 *
 * @link https://pear.php.net/bugs/bug.php?id=4950
 */
class Bug4950Tests extends AbstractUnitTests
{
    public function testCreateTagForBug4950()
    {
        $qname = "test";
        $attributes = array();
        $content = "Content ]]></test> here!";
        $namespaceUrl = null;
        $expected = "<test><![CDATA[Content ]]]]><![CDATA[></test> here!]]></test>";
        $result = XML_Util::createTag($qname, $attributes, $content, $namespaceUrl, XML_UTIL_CDATA_SECTION);
        $this->assertEquals($expected, $result, "Failed bugcheck.");
    }
}
pear/test/XML_Util/tests/GetXmlDeclarationTests.php000064400000002214151732710340016355 0ustar00<?php

class GetXMLDeclarationTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersion()
    {
        $version = "1.0";
        $expected = "<?xml version=\"1.0\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version));
    }

    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersionAndEncodingAndStandalone()
    {
        $version = "1.0";
        $encoding = "UTF-8";
        $standalone = true;
        $expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version, $encoding, $standalone));
    }

    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersionAndStandalone()
    {
        $version = "1.0";
        $encoding = null;
        $standalone = true;
        $expected = "<?xml version=\"1.0\" standalone=\"yes\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version, $encoding, $standalone));
    }
}
pear/test/XML_Util/tests/CreateCDataSectionTests.php000064400000000552151732710340016437 0ustar00<?php

class CreateCDataSectionTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createCDataSection()
     */
    public function testCreateCDataSectionBasicUsage()
    {
        $original = "I am content.";
        $expected ="<![CDATA[I am content.]]>";
        $this->assertEquals($expected, XML_Util::createCDataSection($original));
    }
}
pear/test/XML_RPC/tests/protoport.php000064400000025007151732710340013550 0ustar00<?php

/**
 * Tests that properties of XML_RPC_Client get properly set
 *
 * Any individual tests that fail will have their name, expected result
 * and actual result printed out.  So seeing no output when executing
 * this file is a good thing.
 *
 * Can be run via CLI or a web server.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: protoport.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.2
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


/**
 * Compare the test result to the expected result
 *
 * If the test fails, echo out the results.
 *
 * @param array  $expect     the array of object properties you expect
 *                            from the test
 * @param object $actual     the object results from the test
 * @param string $test_name  the name of the test
 *
 * @return void
 */
function compare($expect, $actual, $test_name) {
    $actual = get_object_vars($actual);
    if (count(array_diff($actual, $expect))) {
        echo "$test_name failed.\nExpect: ";
        print_r($expect);
        echo "Actual: ";
        print_r($actual);
        echo "\n";
    }
}

if (php_sapi_name() != 'cli') {
    echo "<pre>\n";
}


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver');
compare($x, $c, 'defaults');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver');
compare($x, $c, 'defaults with http');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver');
compare($x, $c, 'defaults with https');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver');
compare($x, $c, 'defaults with ssl');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 65);
compare($x, $c, 'port 65');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 65);
compare($x, $c, 'port 65 with http');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 65);
compare($x, $c, 'port 65 with https');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65);
compare($x, $c, 'port 65 with ssl');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 0,
                        'theproxy');
compare($x, $c, 'defaults proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 0,
                        'http://theproxy');
compare($x, $c, 'defaults with http proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 0,
                        'https://theproxy');
compare($x, $c, 'defaults with https proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 0,
                        'ssl://theproxy');
compare($x, $c, 'defaults with ssl proxy');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 65,
                        'theproxy', 6565);
compare($x, $c, 'port 65 proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 65,
                        'http://theproxy', 6565);
compare($x, $c, 'port 65 with http proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 65,
                        'https://theproxy', 6565);
compare($x, $c, 'port 65 with https proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65,
                        'ssl://theproxy', 6565);
compare($x, $c, 'port 65 with ssl proxy 6565');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 443,
                        'theproxy', 443);
compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 0,
                        'ssl://theproxy', 6565);
compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');

echo "\nIf no other output was produced, these tests passed.\n";
pear/test/XML_RPC/tests/actual-request.php000064400000003451151732710340014436 0ustar00<?php

/**
 * Actually performs an XML_RPC request.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: actual-request.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.5.3
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Dump.php';


$debug = 0;

$params = array(
    new XML_RPC_Value('php.net', 'string'),
);
$msg = new XML_RPC_Message('domquery', $params);
$client = new XML_RPC_Client('/api/xmlrpc', 'www.adamsnames.com');
$client->setDebug($debug);

$resp = $client->send($msg);
if (!$resp) {
    echo 'Communication error: ' . $client->errstr;
    exit(1);
}
if ($resp->faultCode()) {
    /*
     * Display problems that have been gracefully cought and
     * reported by the xmlrpc.php script
     */
    echo 'Fault Code: ' . $resp->faultCode() . "\n";
    echo 'Fault Reason: ' . $resp->faultString() . "\n";
    exit(1);
}

$val = $resp->value();
XML_RPC_Dump($val);
pear/test/XML_RPC/tests/allgot.inc000064400000002400151732710340012734 0ustar00<?php

/**
 * Parses the "return" value from some of our test scripts.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: allgot.inc 293223 2010-01-07 15:32:19Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

ob_start();

function returnAllGot($params) {
    $out = '';
    $count = count($params->params);
    for ($i = 0; $i < $count; $i++) {
        $param = $params->getParam($i);
        if (!XML_RPC_Value::isValue($param)) {
            $out .= "parameter $i was error: $param\n";
            continue;
        }
        $got = XML_RPC_Decode($param);
        $out .= "param $i: " . var_export($got, true) . "\n";
    }
    $val = new XML_RPC_Value($out, 'string');
    return new XML_RPC_Response($val);
}

$server = new XML_RPC_Server(
    array(
        'allgot' => array(
            'function' => 'returnAllGot',
        ),
    )
);

$got = ob_get_clean();

if ($got == $expect) {
    echo "passed\n";
} else {
    echo "FAILED\n";
    echo "Expected:\n$expect\n";
    echo "Got:\n$got\n";
}
pear/test/XML_RPC/tests/encode.php000064400000004321151732710340012731 0ustar00<?php

/**
 * Tests encoding values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: extra-lines.php 293218 2010-01-07 14:20:08Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.5.3
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


$input = array(10, 11, 12);

$expect = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>nada</methodName>
<params>
<param>
<value><array>
<data>
<value><int>10</int></value>
<value><int>11</int></value>
<value><int>12</int></value>
</data>
</array></value>
</param>
</params>
</methodCall>
EOT;

$expect = trim(preg_replace("/\r\n/", "\n", $expect));

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->createPayload();
$actual = trim(preg_replace("/\r\n/", "\n", $msg->payload));
if ($actual == $expect) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
    echo $actual;
}

$msg = new XML_RPC_Message('nada',
    array(
        new XML_RPC_Value(
            array(
                new XML_RPC_Value(10, 'int'),
                new XML_RPC_Value(11, 'int'),
                new XML_RPC_Value(12, 'int'),
            ),
            'array'
        )
    )
);
$msg->createPayload();
$actual = trim(preg_replace("/\r\n/", "\n", $msg->payload));
if ($actual == $expect) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
    echo $actual;
}
pear/test/XML_RPC/tests/empty-value.php000064400000003371151732710340013750 0ustar00<?php

/**
 * Tests how the XML_RPC server handles parameters with empty values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: empty-value.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param><value><string></string></value></param>
   <param><value>first</value></param>
   <param><value>  </value></param>
   <param><value></value></param>
  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: ''
param 1: 'first'
param 2: '  '
param 3: ''
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
pear/test/XML_RPC/tests/empty-value-struct.php000064400000003413151732710340015267 0ustar00<?php

/**
 * Tests how the XML_RPC server handles a parameter with an empty struct without
 * any spaces in the XML after the empty value.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: empty-value-struct.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param>
    <value>
     <struct>
      <member>
      <name>fld1</name><value></value></member></struct></value>
   </param>
  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: array (
  'fld1' =&gt; '',
)
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
pear/test/XML_RPC/tests/extra-lines.php000064400000004311151732710350013727 0ustar00<?php

/**
 * Tests how the XML_RPC server handles parameters with empty values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: extra-lines.php 300958 2010-07-02 23:58:51Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


$input = "First lfs\n\nSecond crlfs\r\n\r\nThird crs\r\rFourth line";

$expect_removed = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n<methodName>nada</methodName>\r\n<params>\r\n<param>\r\n<value><string>First lfs\r\nSecond crlfs\r\nThird crs\r\nFourth line</string></value>\r\n</param>\r\n</params>\r\n</methodCall>\r\n";

$expect_not_removed = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n<methodName>nada</methodName>\r\n<params>\r\n<param>\r\n<value><string>First lfs\r\n\r\nSecond crlfs\r\n\r\nThird crs\r\n\r\nFourth line</string></value>\r\n</param>\r\n</params>\r\n</methodCall>\r\n";

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->createPayload();
if ($msg->payload == $expect_removed) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
}

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->remove_extra_lines = false;
$msg->createPayload();
if ($msg->payload == $expect_not_removed) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
}
pear/test/XML_RPC/tests/types.php000064400000004767151732710350012657 0ustar00<?php

/**
 * Tests how the XML_RPC server handles a bunch of different parameter
 * data types.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: types.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param><value>default to string</value></param>
   <param><value><string>inside string</string></value></param>
   <param><value><int>8</int></value></param>
   <param><value><datetime.iso8601>20050809T01:33:44</datetime.iso8601></value></param>

   <param>
    <value>
     <array>
      <data>
       <value>
        <string>a</string>
       </value>
       <value>
        <string>b</string>
       </value>
      </data>
     </array>
    </value>
   </param>

   <param>
    <value>
     <struct>
      <member>
       <name>a</name>
       <value>
        <string>ay</string>
       </value>
      </member>
      <member>
       <name>b</name>
       <value>
        <string>be</string>
       </value>
      </member>
     </struct>
    </value>
   </param>

  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: 'default to string'
param 1: 'inside string'
param 2: '8'
param 3: '20050809T01:33:44'
param 4: array (
  0 =&gt; 'a',
  1 =&gt; 'b',
)
param 5: array (
  'a' =&gt; 'ay',
  'b' =&gt; 'be',
)
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
pear/test/XML_RPC/tests/test_Dump.php000064400000004130151732710350013437 0ustar00<?php

/**
 * Actually performs an XML_RPC request.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: test_Dump.php 300962 2010-07-03 02:24:24Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Dump.php';


$val = new XML_RPC_Value(array(
    'title'    =>new XML_RPC_Value('das ist der Titel', 'string'),
    'startDate'=>new XML_RPC_Value(mktime(0,0,0,13,11,2004), 'dateTime.iso8601'),
    'endDate'  =>new XML_RPC_Value(mktime(0,0,0,15,11,2004), 'dateTime.iso8601'),
    'arkey'    => new XML_RPC_Value( array(
        new XML_RPC_Value('simple string'),
        new XML_RPC_Value(12345, 'int')
        ), 'array')
    )
    ,'struct');

XML_RPC_Dump($val);

echo '==============' . "\r\n";
$val2 = new XML_RPC_Value(44353, 'int');
XML_RPC_Dump($val2);

echo '==============' . "\r\n";
$val3 = new XML_RPC_Value('this should be a string', 'string');
XML_RPC_Dump($val3);

echo '==============' . "\r\n";
$val4 = new XML_RPC_Value(true, 'boolean');
XML_RPC_Dump($val4);

echo '==============' . "\r\n";
echo 'Next we will test the error handling...' . "\r\n";
$val5 = new XML_RPC_Value(array(
    'foo' => 'bar'
    ), 'struct');
XML_RPC_Dump($val5);

echo '==============' . "\r\n";
echo 'DONE' . "\r\n";
pear/test/Structures_LinkedList/tests/LinkTester.php000064400000000754151732710350016730 0ustar00<?php
class LinkTester extends Structures_LinkedList_DoubleNode {
    protected $_my_number;

    function __construct($num) {
        $this->_my_number = $num;
    }

    function getNumb() {
        return $this->_my_number;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }
}

$tester1 = new LinkTester(1);
$tester2 = new LinkTester(2);
$tester3 = new LinkTester(3);
$tester4 = new LinkTester(4);
$tester5 = new LinkTester(5);
$tester6 = new LinkTester(6);

?>
pear/test/Structures_LinkedList/tests/link_006.phpt000064400000001737151732710350016354 0ustar00--TEST--
link_006: Corner case: add a node before the root
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();
$xyy->prependNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

// Ensure we can increment the current node without messing up the list
print "\nCurrent: " . $xyy->current()->getNumb() . "\n";
$link = $xyy->next();
print "Current: " . $link->getNumb() . "\n";

$xyy->insertNode($tester5, $tester1, true);

print "\n";

$link = $xyy->current();
print "Current: " . $link->getNumb();

print "\n\nWhile: ";
// test iteration with while()
$link = $xyy->rewind();
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\n\nForeach: ";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
Current: 1
Current: 4

Current: 4

While: 51423

Foreach: 51423
pear/test/Structures_LinkedList/tests/link_001.phpt000064400000001733151732710350016343 0ustar00--TEST--
link_001: Test linked list constructed with an initial link
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

$link = $xyy->current();
print "Current: " . $link->getNumb() . "\n";

print "While: ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\nRewind: ";
$link = $xyy->rewind();
print $link->getNumb();
print "\n";

print "Foreach: ";
// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}

print "\nEnd: ";
$link = $xyy->end();
print $link->getNumb();
print "\n";

print "While (in reverse): ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->previous());


?>
--EXPECT--
Current: 1
While: 1234
Rewind: 1
Foreach: 1234
End: 4
While (in reverse): 4321
pear/test/Structures_LinkedList/tests/single_link_004.phpt000064400000001055151732710350017704 0ustar00--TEST--
single_link_004: Delete every link in the list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

// Delete all nodes from the list
while ($link = $xyy->rewind()) {
    print "Deleted " . $link->getNumb() . "\n";
    $xyy->deleteNode($link);
}
$link = $xyy->rewind();
print "Done\n";
?>
--EXPECT--
Deleted 1
Deleted 2
Deleted 3
Deleted 4
Done
pear/test/Structures_LinkedList/tests/link_004.phpt000064400000001040151732710350016335 0ustar00--TEST--
link_004: Delete every link in the list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

// Delete all nodes from the list
while ($link = $xyy->rewind()) {
    print "Deleted " . $link->getNumb() . "\n";
    $xyy->deleteNode($link);
}
$link = $xyy->rewind();
print "Done\n";
?>
--EXPECT--
Deleted 1
Deleted 2
Deleted 3
Deleted 4
Done
pear/test/Structures_LinkedList/tests/single_link_001.phpt000064400000001750151732710350017703 0ustar00--TEST--
single_link_001: Test linked list constructed with an initial link
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

$link = $xyy->current();
print "Current: " . $link->getNumb() . "\n";

print "While: ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\nRewind: ";
$link = $xyy->rewind();
print $link->getNumb();
print "\n";

print "Foreach: ";
// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}

print "\nEnd: ";
$link = $xyy->end();
print $link->getNumb();
print "\n";

print "While (in reverse): ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->previous());


?>
--EXPECT--
Current: 1
While: 1234
Rewind: 1
Foreach: 1234
End: 4
While (in reverse): 4321
pear/test/Structures_LinkedList/tests/link_002.phpt000064400000001243151732710350016340 0ustar00--TEST--
link_002: Append links to an initially empty linked list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();
$xyy->appendNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

$link = $xyy->current();
print $link->getNumb();

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1423
1
1423
pear/test/Structures_LinkedList/tests/SingleLinkTester.php000064400000000716151732710350020070 0ustar00<?php
class LinkTester extends Structures_LinkedList_SingleNode {
    protected $_my_number;

    function __construct($num) {
        $this->_my_number = $num;
    }

    function getNumb() {
        return $this->_my_number;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }
}

$tester1 = new LinkTester(1);
$tester2 = new LinkTester(2);
$tester3 = new LinkTester(3);
$tester4 = new LinkTester(4);
$tester5 = new LinkTester(5);

?>
pear/test/Structures_LinkedList/tests/single_link_005.phpt000064400000002342151732710350017705 0ustar00--TEST--
single_link_005: Pass different class types to constructors
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';

class TesterExtend extends Structures_LinkedList_SingleNode {
    protected $_my_number;

    function __construct($tester, $num) {
        $this->_my_number = $num;
        parent::__construct($tester);
    }
}

class TesterFail {
    protected $summary;
    protected $fulltext;

    function __construct($summary, $fulltext) {
        $this->summary = $summary;
        $this->fulltext = $fulltext;
    }
}


// This should work: TesterExtend extends the Structure_LinkedList_SingleNode class
$tester_extend = new TesterExtend(null, 1);
$xyy = new Structures_LinkedList_Single($tester_extend);
print "Checking for errors in the expected success case:\n";

// This should fail
print "Checking for errors in the expected failure case:\n";
$tester_fail = new TesterFail(null, 1);
$xyy_fail = new Structures_LinkedList_Single($tester_fail);
?>
--EXPECTF--
Checking for errors in the expected success case:
Checking for errors in the expected failure case:

%satal error: Argument 1 passed to Structures_LinkedList_Single::__construct() must be an instance of Structures_LinkedList_SingleNode%s
pear/test/Structures_LinkedList/tests/single_link_002.phpt000064400000001260151732710350017700 0ustar00--TEST--
single_link_002: Append links to an initially empty linked list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();
$xyy->appendNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

$link = $xyy->current();
print $link->getNumb();

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1423
1
1423
pear/test/Structures_LinkedList/tests/link_007.phpt000064400000002510151732710350016343 0ustar00--TEST--
link_007: Test many corner cases
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();

// prepend to an empty list corner case: 1
$xyy->prependNode($tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// prepend to a list with only one element: 21
$xyy->prependNode($tester2);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after tail node corner case: 213
$xyy->insertNode($tester3, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before root node corner case: 4213
$xyy->insertNode($tester4, $tester2, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before tail node corner case: 42153
$xyy->insertNode($tester5, $tester3, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after root node corner case: 421653
$xyy->insertNode($tester6, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

print "Foreach: ";
foreach ($xyy as $node) {
    print $node->getNumb();
}

print "\nWhile (in reverse): ";
// test reverse iteration with while()
$link = $xyy->end();
do {
    print $link->getNumb();
} while ($link = $xyy->previous());
?>
--EXPECT--
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Foreach: 421653
While (in reverse): 356124
pear/test/Structures_LinkedList/tests/single_link_006.phpt000064400000001754151732710350017714 0ustar00--TEST--
single_link_006: Corner case: add a node before the root
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();
$xyy->prependNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

// Ensure we can increment the current node without messing up the list
print "\nCurrent: " . $xyy->current()->getNumb() . "\n";
$link = $xyy->next();
print "Current: " . $link->getNumb() . "\n";

$xyy->insertNode($tester5, $tester1, true);

print "\n";

$link = $xyy->current();
print "Current: " . $link->getNumb();

print "\n\nWhile: ";
// test iteration with while()
$link = $xyy->rewind();
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\n\nForeach: ";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
Current: 1
Current: 4

Current: 4

While: 51423

Foreach: 51423
pear/test/Structures_LinkedList/tests/single_link_007.phpt000064400000002302151732710350017703 0ustar00--TEST--
single_link_007: Test many corner cases
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();

// prepend to an empty list corner case: 1
$xyy->prependNode($tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// prepend to a list with only one element: 21
$xyy->prependNode($tester2);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after tail node corner case: 213
$xyy->insertNode($tester3, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before root node corner case: 4213
$xyy->insertNode($tester4, $tester2, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before tail node corner case: 42153
$xyy->insertNode($tester5, $tester3, true);
print "Current: {$xyy->current()->getNumb()}\n";

print "Foreach: ";
foreach ($xyy as $node) {
    print $node->getNumb();
}

print "\nWhile (in reverse): ";
// test reverse iteration with while()
$link = $xyy->end();
do {
    print $link->getNumb();
} while ($link = $xyy->previous());
?>
--EXPECT--
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Foreach: 42153
While (in reverse): 35124
pear/test/Structures_LinkedList/tests/single_link_003.phpt000064400000001765151732710350017713 0ustar00--TEST--
single_link_003: Append links in a specific order
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();

// add initial link in the list
$xyy->appendNode($tester1);
print $tester1->getNumb() . "\n";

// add after initial link
$xyy->appendNode($tester2);
print $tester2->getNumb() . "\n";

// add after initial link, bumping #2 up
$xyy->insertNode($tester3, $tester1);
print $tester3->getNumb() . "\n";

// add after link #3, bumping #2 up again
$xyy->insertNode($tester4, $tester3);
print $tester4->getNumb() . "\n";

print "\n";

$link = $xyy->current();
print $link->getNumb();
print "\n";

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
    print "\n";
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1
2
3
4

1
3
4
2

1
1342
pear/test/Structures_LinkedList/tests/link_005.phpt000064400000002333151732710350016344 0ustar00--TEST--
link_005: Pass different class types to constructors
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';

class TesterExtend extends Structures_LinkedList_DoubleNode {
    protected $_my_number;

    function __construct($tester, $num) {
        $this->_my_number = $num;
        parent::__construct($tester);
    }
}

class TesterFail {
    protected $summary;
    protected $fulltext;

    function __construct($summary, $fulltext) {
        $this->summary = $summary;
        $this->fulltext = $fulltext;
    }
}


// This should work: TesterExtend extends the Structure_LinkedList_DoubleNode class
$tester_extend = new TesterExtend(null, 1);
$xyy = new Structures_LinkedList_Double($tester_extend);
print "Checking for errors in the expected success case:\n";

// This should fail
print "Checking for errors in the expected failure case:\n";
$tester_fail = new TesterFail(null, 1);
$xyy_fail = new Structures_LinkedList_Double($tester_fail);
?>
--EXPECTF--
Checking for errors in the expected success case:
Checking for errors in the expected failure case:

%satal error: Argument 1 passed to Structures_LinkedList_Double::__construct() must be an instance of Structures_LinkedList_DoubleNode%s
pear/test/Structures_LinkedList/tests/link_003.phpt000064400000001750151732710350016344 0ustar00--TEST--
link_003: Append links in a specific order
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();

// add initial link in the list
$xyy->appendNode($tester1);
print $tester1->getNumb() . "\n";

// add after initial link
$xyy->appendNode($tester2);
print $tester2->getNumb() . "\n";

// add after initial link, bumping #2 up
$xyy->insertNode($tester3, $tester1);
print $tester3->getNumb() . "\n";

// add after link #3, bumping #2 up again
$xyy->insertNode($tester4, $tester3);
print $tester4->getNumb() . "\n";

print "\n";

$link = $xyy->current();
print $link->getNumb();
print "\n";

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
    print "\n";
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1
2
3
4

1
3
4
2

1
1342
pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.php000064400000042427151732710350020264 0ustar00<?php
require_once 'Net/IDNA2.php';

// Test cases from https://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html

define('IDNA_ACE_PREFIX', 'xn--');

class IDNATest extends PHPUnit_Framework_TestCase {

    public function setUp() {
        $this->idn = new Net_IDNA2();
    }

    static function unichr($chr) {
        return mb_convert_encoding('&#' . intval($chr) . ';', 'UTF-8', 'HTML-ENTITIES');
    }

    private function hexarray2string($arr) {
        return implode('', array_map(array('self', 'unichr'), $arr));
    }

    public function testDecode1() {
        // Arabic (Egyptian)
        $expected = $this->hexarray2string(array(
            0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
	        0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
	        0x061F
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."egbpdaj6bu4bxfgehfvwxn");
        $this->assertSame($expected, $result);
    }

    public function testDecode2() {
        // Chinese (simplified)
        $expected = $this->hexarray2string(array(
            0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."ihqwcrb4cv8a8dqg056pqjye");
        $this->assertSame($expected, $result);
    }

    public function testDecode3() {
        // Chinese (traditional)
        $expected = $this->hexarray2string(array(
            0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."ihqwctvzc91f659drss3x8bo0yb");
        $this->assertSame($expected, $result);
    }

    public function testDecode4() {
        // Czech
        $expected = $this->hexarray2string(array(
            0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
	        0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
	        0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."Proprostnemluvesky-uyb24dma41a");
        $this->assertSame($expected, $result);
    }

    public function testDecode5() {
        // Hebrew
        $expected = $this->hexarray2string(array(
            0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
	        0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
	        0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."4dbcagdahymbxekheh6e0a7fei0b");
        $this->assertSame($expected, $result);
    }

      public function testDecode6() {
        // Hindi (Devanagari)
        $expected = $this->hexarray2string(array(
            0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
        	0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
	        0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
	        0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd");
        $this->assertSame($expected, $result);
    }

    public function testDecode7() {
        // Japanese (kanji and hiragana)
        $expected = $this->hexarray2string(array(
            0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
        	0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
        	0x306E, 0x304B
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa");
        $this->assertSame($expected, $result);
    }

    public function testDecode8() {
        // Russian (Cyrillic)
        $expected = $this->hexarray2string(array(
            0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
        	0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
        	0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
        	0x0441, 0x0441, 0x043A, 0x0438
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l");
        $this->assertSame($expected, $result);
    }

    public function testDecode9() {
        // Spanish
        $expected = $this->hexarray2string(array(
            0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
        	0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
        	0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
        	0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
        	0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."PorqunopuedensimplementehablarenEspaol-fmd56a");
        $this->assertSame($expected, $result);
    }

    public function testDecode10() {
        // Vietnamese
        $expected = $this->hexarray2string(array(
            0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
        	0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
        	0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
        	0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g");
        $this->assertSame($expected, $result);
    }

    public function testDecode11() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."3B-ww4c5e180e575a65lsy2b");
        $this->assertSame($expected, $result);
    }

    public function testDecode12() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
        	0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
        	0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n");
        $this->assertSame($expected, $result);
    }

    public function testDecode13() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
	        0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
        	0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
        	0x6240
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."Hello-Another-Way--fc4qua05auwb3674vfr0b");
        $this->assertSame($expected, $result);
    }

    public function testDecode14() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."2-u9tlzr9756bt3uc0v");
        $this->assertSame($expected, $result);
    }

    public function testDecode15() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
        	0x3059, 0x308B, 0x0035, 0x79D2, 0x524D
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."MajiKoi5-783gue6qz075azm5e");
        $this->assertSame($expected, $result);
    }

    public function testDecode16() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."de-jg4avhby1noc0d");
        $this->assertSame($expected, $result);
    }

    public function testDecode17() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."d9juau41awczczp");
        $this->assertSame($expected, $result);
    }

    public function testDecode18() {
        // Greek
        $expected = $this->hexarray2string(array(
            0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."hxargifdar");
        $this->assertSame($expected, $result);
    }

    public function testDecode19() {
        // Maltese (Malti)
        $expected = $this->hexarray2string(array(
            0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
            0x0127, 0x0061
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."bonusaa-5bb1da");
        $this->assertSame($expected, $result);
    }

    public function testDecode20() {
        // Russian (Cyrillic)
        $expected = $this->hexarray2string(array(
            0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
            0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
            0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
            0x0441, 0x0441, 0x043a, 0x0438
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l");
        $this->assertSame($expected, $result);
    }

    public function testEncode1() {
        // Arabic (Egyptian)
        $idna = $this->hexarray2string(array(
            0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
	        0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
	        0x061F
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."egbpdaj6bu4bxfgehfvwxn", $result);
    }

    public function testEncode2() {
        // Chinese (simplified)
        $idna = $this->hexarray2string(array(
            0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."ihqwcrb4cv8a8dqg056pqjye", $result);
    }

    public function testEncode3() {
        // Chinese (traditional)
        $idna = $this->hexarray2string(array(
            0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."ihqwctvzc91f659drss3x8bo0yb", $result);
    }

    public function testEncode4() {
        // Czech
        $idna = $this->hexarray2string(array(
            0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
	        0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
	        0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."proprostnemluvesky-uyb24dma41a", $result);
    }

    public function testEncode5() {
        // Hebrew
        $idna = $this->hexarray2string(array(
            0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
	        0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
	        0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."4dbcagdahymbxekheh6e0a7fei0b", $result);
    }

      public function testEncode6() {
        // Hindi (Devanagari)
        $idna = $this->hexarray2string(array(
            0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
        	0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
	        0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
	        0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", $result);
    }

    public function testEncode7() {
        // Japanese (kanji and hiragana)
        $idna = $this->hexarray2string(array(
            0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
        	0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
        	0x306E, 0x304B
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", $result);
    }

    public function testEncode8() {
        // Russian (Cyrillic)
        $idna = $this->hexarray2string(array(
            0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
        	0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
        	0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
        	0x0441, 0x0441, 0x043A, 0x0438
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l", $result);
    }

    public function testEncode9() {
        // Spanish
        $idna = $this->hexarray2string(array(
            0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
        	0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
        	0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
        	0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
        	0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."porqunopuedensimplementehablarenespaol-fmd56a", $result);
    }

    public function testEncode10() {
        // Vietnamese
        $idna = $this->hexarray2string(array(
            0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
        	0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
        	0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
        	0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."tisaohkhngthchnitingvit-kjcr8268qyxafd2f1b9g", $result);
    }

    public function testEncode11() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."3b-ww4c5e180e575a65lsy2b", $result);
    }

    public function testEncode12() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
        	0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
        	0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."-with-super-monkeys-pc58ag80a8qai00g7n9n", $result);
    }

    public function testEncode13() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
	        0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
        	0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
        	0x6240
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."hello-another-way--fc4qua05auwb3674vfr0b", $result);
    }

    public function testEncode14() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."2-u9tlzr9756bt3uc0v", $result);
    }

    public function testEncode15() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
        	0x3059, 0x308B, 0x0035, 0x79D2, 0x524D
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."majikoi5-783gue6qz075azm5e", $result);
    }

    public function testEncode16() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."de-jg4avhby1noc0d", $result);
    }

    public function testEncode17() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."d9juau41awczczp", $result);
    }

    public function testEncode18() {
        // Greek
        $idna = $this->hexarray2string(array(
            0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."hxargifdar", $result);
    }

    public function testEncode19() {
        // Maltese (Malti)
        $idna = $this->hexarray2string(array(
            0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
            0x0127, 0x0061
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."bonusaa-5bb1da", $result);
    }

    public function testEncode20() {
        // Russian (Cyrillic)
        $idna = $this->hexarray2string(array(
            0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
            0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
            0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
            0x0441, 0x0441, 0x043a, 0x0438
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l", $result);
    }

}

pear/test/Net_IDNA2/tests/Net_IDNA2Test.php000064400000004155151732710350014204 0ustar00<?php
require_once 'Net/IDNA2.php';

class Net_IDNA2Test extends PHPUnit_Framework_TestCase
{
    /**
     * Initialise tests
     *
     * @return void
     */
    public function setUp()
    {
        $this->idn = new Net_IDNA2();
    }

    /**
     * Test if a complete URL consisting also of port-number etc. will be decoded just fine, test 1
     *
     * @return void
     */
    public function testShouldDecodePortNumbersFragmentsAndUrisCorrectly1()
    {
        $result = $this->idn->decode('http://www.xn--ml-6kctd8d6a.org:8080/test.php?arg1=1&arg2=2#fragment');
        $this->assertSame("http://www.\xD0\xB5\xD1\x85\xD0\xB0m\xD1\x80l\xD0\xB5.org:8080/test.php?arg1=1&arg2=2#fragment", $result);
    }

    /**
     * Test if a complete URL consisting also of port-number etc. will be decoded just fine, test 2
     *
     * @return void
     */
    public function testShouldDecodePortNumbersFragmentsAndUrisCorrectly2()
    {
        $result = $this->idn->decode('http://xn--tst-qla.example.com:8080/test.php?arg1=1&arg2=2#fragment');
        $this->assertSame("http://täst.example.com:8080/test.php?arg1=1&arg2=2#fragment", $result);
    }

    /**
     * Test encoding of German letter Eszett according to the original standard (IDNA2003)
     *
     * @return void
     */
    public function testEncodingForGermanEszettUsingIDNA2003()
    {
        // make sure to use 2003-encoding
        $this->idn->setParams('version', '2003');
        $result = $this->idn->encode('http://www.straße.example.com/');

        $this->assertSame("http://www.strasse.example.com/", $result);
    }

    /**
     * Test encoding of German letter Eszett according to the "new" standard (IDNA2005/IDNAbis)
     *
     * @return void
     */
    public function testEncodingForGermanEszettUsingIDNA2008()
    {
        // make sure to use 2008-encoding
        $this->idn->setParams('version', '2008');
        $result = $this->idn->encode('http://www.straße.example.com/');
        // switch back for other testcases
        $this->idn->setParams('version', '2003');

        $this->assertSame("http://www.xn--strae-oqa.example.com/", $result);
    }
}
pear/test/Net_SMTP/tests/quotedata.phpt000064400000003625151732710350014103 0ustar00--TEST--
Net_SMTP: quotedata()
--FILE--
<?php

require_once 'Net/SMTP.php';

$tests = array(
    /* Newlines */
    "\n"               => "\r\n",
    "\r\n"             => "\r\n",
    "\nxx"             => "\r\nxx",
    "xx\n"             => "xx\r\n",
    "xx\nxx"           => "xx\r\nxx",
    "\n\nxx"           => "\r\n\r\nxx",
    "xx\n\nxx"         => "xx\r\n\r\nxx",
    "xx\n\n"           => "xx\r\n\r\n",
    "\r\nxx"           => "\r\nxx",
    "xx\r\n"           => "xx\r\n",
    "xx\r\nxx"         => "xx\r\nxx",
    "\r\n\r\nxx"       => "\r\n\r\nxx",
    "xx\r\n\r\nxx"     => "xx\r\n\r\nxx",
    "xx\r\n\r\n"       => "xx\r\n\r\n",
    "\r\n\nxx"         => "\r\n\r\nxx",
    "\n\r\nxx"         => "\r\n\r\nxx",
    "xx\r\n\nxx"       => "xx\r\n\r\nxx",
    "xx\n\r\nxx"       => "xx\r\n\r\nxx",
    "xx\r\n\n"         => "xx\r\n\r\n",
    "xx\n\r\n"         => "xx\r\n\r\n",
    "\r"               => "\r\n",
    "\rxx"             => "\r\nxx",
    "xx\rxx"           => "xx\r\nxx",
    "xx\r"             => "xx\r\n",
    "\r\r"             => "\r\n\r\n",
    "\r\rxx"           => "\r\n\r\nxx",
    "xx\r\rxx"         => "xx\r\n\r\nxx",
    "xx\r\r"           => "xx\r\n\r\n",
    "xx\rxx\nxx\r\nxx" => "xx\r\nxx\r\nxx\r\nxx",
    "\r\r\n\n"         => "\r\n\r\n\r\n",

    /* Dots */
    "."                 => "..",
    "xxx\n."            => "xxx\r\n..",
    "xxx\n.\nxxx"       => "xxx\r\n..\r\nxxx",
    "xxx.\n.xxx"        => "xxx.\r\n..xxx",
);

function literal($x)
{
    return str_replace(array("\r", "\n"), array('\r', '\n'), $x);
}

$smtp = new Net_SMTP();
$error = false;
foreach ($tests as $input => $expected) {
    $output = $input;
    $smtp->quotedata($output);
    if ($output != $expected) {
        printf("Error: '%s' => '%s' (expected: '%s')",
            literal($input), literal($output), literal($expected));
        $error = true;
    }
}

if (!$error) {
    echo "success\n";
}

--EXPECT--
success
pear/test/Net_SMTP/tests/auth.phpt000064400000001041151732710350013043 0ustar00--TEST--
Net_SMTP: SMTP Authentication
--SKIPIF--
<?php if (!@include('config.php')) die("skip\n");
--FILE--
<?php

require_once 'Net/SMTP.php';
require_once 'config.php';

if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
	die("Unable to instantiate Net_SMTP object\n");
}

if (PEAR::isError($e = $smtp->connect())) {
	die($e->getMessage() . "\n");
}

if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
	die("Authentication failure\n");
}

$smtp->disconnect();

echo 'Success!';

--EXPECT--
Success!
pear/test/Net_SMTP/tests/config.php.dist000064400000000750151732710350014133 0ustar00<?php
/**
 * Copy this file to config.php and customize the following values to
 * suit your configuration.
 */

define('TEST_HOSTNAME',     'localhost');
define('TEST_PORT',         25);
define('TEST_LOCALHOST',    'localhost');
define('TEST_AUTH_USER',    'jon');
define('TEST_AUTH_PASS',    'secret');
define('TEST_FROM',         'from@example.com');
define('TEST_TO',           'to@example.com');
define('TEST_SUBJECT',      'Test Subject');
define('TEST_BODY',         'Test Body');
pear/test/Net_SMTP/tests/basic.phpt000064400000001656151732710350013177 0ustar00--TEST--
Net_SMTP: Basic Functionality
--SKIPIF--
<?php if (!@include('config.php')) die("skip\n");
--FILE--
<?php

require_once 'Net/SMTP.php';
require_once 'config.php';

if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
    die("Unable to instantiate Net_SMTP object\n");
}

if (PEAR::isError($e = $smtp->connect())) {
    die($e->getMessage() . "\n");
}

if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
    die("Authentication failure\n");
}

if (PEAR::isError($smtp->mailFrom(TEST_FROM))) {
    die('Unable to set sender to <' . TEST_FROM . ">\n");
}

if (PEAR::isError($res = $smtp->rcptTo(TEST_TO))) {
    die('Unable to add recipient <' . TEST_TO . '>: ' .
        $res->getMessage() . "\n");
}

$headers = 'Subject: ' . TEST_SUBJECT;
if (PEAR::isError($smtp->data(TEST_BODY, $headers))) {
    die("Unable to send data\n");
}

$smtp->disconnect();

echo 'Success!';

--EXPECT--
Success!
pear/test/Console_Getopt/tests/bug10557.phpt000064400000000756151732710350014630 0ustar00--TEST--
Console_Getopt [bug 10557]
--SKIPIF--
--FILE--
<?php
$_SERVER['argv'] =
$argv = array('hi', '-fjjohnston@mail.com', '--to', '--mailpack', '--debug');
require_once 'Console/Getopt.php';
$ret = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), 'f:t:',
array('from=','to=','mailpack=','direction=','verbose','debug'));
if(PEAR::isError($ret))
{
	echo $ret->getMessage()."\n";
	echo 'FATAL';
	exit;
}

print_r($ret);
?>
--EXPECT--
Console_Getopt: option requires an argument --to
FATALpear/test/Console_Getopt/tests/bug11068.phpt000064400000001431151732710350014615 0ustar00--TEST--
Console_Getopt [bug 11068]
--SKIPIF--
--FILE--
<?php
$_SERVER['argv'] =
$argv = array('hi', '-fjjohnston@mail.com', '--to', 'hi', '-');
require_once 'Console/Getopt.php';
$ret = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), 'f:t:',
array('from=','to=','mailpack=','direction=','verbose','debug'));
if(PEAR::isError($ret))
{
	echo $ret->getMessage()."\n";
	echo 'FATAL';
	exit;
}

print_r($ret);
?>
--EXPECT--
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => f
                    [1] => jjohnston@mail.com
                )

            [1] => Array
                (
                    [0] => --to
                    [1] => hi
                )

        )

    [1] => Array
        (
            [0] => -
        )

)pear/test/Console_Getopt/tests/001-getopt.phpt000064400000002316151732710350015243 0ustar00--TEST--
Console_Getopt
--FILE--
<?php
require_once 'Console/Getopt.php';
PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s\n\n");

function test($argstr, $optstr) {
    $argv = preg_split('/[[:space:]]+/', $argstr);
    if (PEAR::isError($options = Console_Getopt::getopt($argv, $optstr))) {
        return;
    }
    $opts = $options[0];
    $non_opts = $options[1];
    $i = 0;
    print "options: ";
    foreach ($opts as $o => $d) {
        if ($i++ > 0) {
            print ", ";
        }
        print $d[0] . '=' . $d[1];
    }
    print "\n";
    print "params: " . implode(", ", $non_opts) . "\n";
    print "\n";
}

test("-abc", "abc");
test("-abc foo", "abc");
test("-abc foo", "abc:");
test("-abc foo bar gazonk", "abc");
test("-abc foo bar gazonk", "abc:");
test("-a -b -c", "abc");
test("-a -b -c", "abc:");
test("-abc", "ab:c");
test("-abc foo -bar gazonk", "abc");
?>
--EXPECT--
options: a=, b=, c=
params: 

options: a=, b=, c=
params: foo

options: a=, b=, c=foo
params: 

options: a=, b=, c=
params: foo, bar, gazonk

options: a=, b=, c=foo
params: bar, gazonk

options: a=, b=, c=
params: 

Console_Getopt: option requires an argument --c

options: a=, b=c
params: 

options: a=, b=, c=
params: foo, -bar, gazonk
pear/test/Console_Getopt/tests/bug13140.phpt000064400000002505151732710350014611 0ustar00--TEST--
Console_Getopt [bug 13140]
--SKIPIF--
--FILE--
<?php
$_SERVER['argv'] = $argv =
    array('--bob', '--foo' , '-bar', '--test', '-rq', 'thisshouldbehere');

require_once 'Console/Getopt.php';
$cg = new Console_GetOpt();

print_r($cg->getopt2($cg->readPHPArgv(), 't', array('test'), true));
print_r($cg->getopt2($cg->readPHPArgv(), 'bar', array('foo'), true));
?>
--EXPECT--
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => --test
                    [1] => 
                )

        )

    [1] => Array
        (
            [0] => thisshouldbehere
        )

)
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => --foo
                    [1] => 
                )

            [1] => Array
                (
                    [0] => b
                    [1] => 
                )

            [2] => Array
                (
                    [0] => a
                    [1] => 
                )

            [3] => Array
                (
                    [0] => r
                    [1] => 
                )

            [4] => Array
                (
                    [0] => r
                    [1] => 
                )

        )

    [1] => Array
        (
            [0] => thisshouldbehere
        )

)
pear/test/Net_Sieve/tests/largescript.siv000064400000616733151732710350014563 0ustar00require ["fileinto", "reject", "vacation", "regex", "relational", "comparator-i;ascii-numeric"];
if header :is ["X-Spam-Flag", "X-Spam-Status"] ["YES","Yes"] {
fileinto "INBOX.Spam";
stop;
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["cvs-all.freebsd.org"] {
fileinto "INBOX.FreeBSD.CVS All";
}
if header :contains ["List-Id"] ["freebsd-acpi.freebsd.org"] {
fileinto "INBOX.FreeBSD.ACPI";
}
if header :contains ["List-Id"] ["freebsd-current.freebsd.org"] {
fileinto "INBOX.FreeBSD.Current";
}
if header :contains ["List-Id"] ["freebsd-hackers.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hackers";
}
if header :contains ["List-Id"] ["freebsd-multimedia.freebsd.org"] {
fileinto "INBOX.FreeBSD.Multimedia";
}
if header :contains ["List-Id"] ["freebsd-questions.freebsd.org"] {
fileinto "INBOX.FreeBSD.Questions";
}
if header :contains ["List-Id"] ["freebsd-stable.freebsd.org"] {
fileinto "INBOX.FreeBSD.Stable";
}
if header :contains ["List-Id"] ["freebsd-mobile.freebsd.org"] {
fileinto "INBOX.FreeBSD.Mobile";
}
if header :contains ["List-Id"] ["wine-devel.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Devel";
}
if header :contains ["List-Id"] ["wine-users.winehq.org"] {
fileinto "INBOX.FreeBSD.Wine.Users";
}
if header :contains ["List-Id"] ["dri-devel.lists.sourceforge.net"] {
fileinto "INBOX.FreeBSD.dri-devel";
}
if header :contains ["List-Id"] ["freebsd-threads.freebsd.org"] {
fileinto "INBOX.FreeBSD.Threads";
}
if header :contains ["List-Id"] ["freebsd-hardware.freebsd.org"] {
fileinto "INBOX.FreeBSD.Hardware";
}
if header :contains ["List-Id"] ["freebsd-usb.freebsd.org"] {
fileinto "INBOX.FreeBSD.USB";
}
if header :contains ["List-Id"] ["freebsd-ports.freebsd.org"] {
fileinto "INBOX.FreeBSD.Ports";
}
if header :contains ["To"] ["amistry@php.net"] {
fileinto "INBOX.PEAR.Account";
}
if header :contains ["list-post"] ["pear-qa@lists.php.net"] {
fileinto "INBOX.PEAR.QA";
}
if header :contains ["Delivered-To"] ["php-general@lists.php.net"] {
fileinto "INBOX.PHP.General";
}
if header :contains ["Delivered-to"] ["internals@lists.php.net"] {
fileinto "INBOX.PEAR.Internals";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
if header :contains ["List-Id"] ["suphp.lists.marsching.biz"] {
fileinto "INBOX.suPHP";
}
pear/test/Net_Sieve/tests/SieveTest.php000064400000026676151732710350014146 0ustar00<?php
/**
 * This file contains the PHPUnit test case for Net_Sieve.
 *
 * PHP version 5
 *
 * +-----------------------------------------------------------------------+
 * | All rights reserved.                                                  |
 * |                                                                       |
 * | Redistribution and use in source and binary forms, with or without    |
 * | modification, are permitted provided that the following conditions    |
 * | are met:                                                              |
 * |                                                                       |
 * | o Redistributions of source code must retain the above copyright      |
 * |   notice, this list of conditions and the following disclaimer.       |
 * | o Redistributions in binary form must reproduce the above copyright   |
 * |   notice, this list of conditions and the following disclaimer in the |
 * |   documentation and/or other materials provided with the distribution.|
 * |                                                                       |
 * | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
 * | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
 * | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
 * | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
 * | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
 * | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
 * | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
 * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
 * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
 * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
 * | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
 * +-----------------------------------------------------------------------+
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @copyright 2006 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @version   SVN: $Id$
 * @link      http://pear.php.net/package/Net_Sieve
 */

require_once dirname(__FILE__) . '/../Sieve.php';

/**
 * PHPUnit test case for Net_Sieve.
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @copyright 2006 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Net_Sieve
 */
class SieveTest extends PHPUnit\Framework\TestCase
{
    // contains the object handle of the string class
    protected $fixture;

    protected function setUp()
    {
        if (!file_exists(dirname(__FILE__) . '/config.php')) {
            $this->markTestSkipped('Test configuration incomplete. Copy config.php.dist to config.php.');
        }
        require_once dirname(__FILE__) . '/config.php';

        // Create a new instance of Net_Sieve.
        $this->_pear = new PEAR();
        $this->fixture = new Net_Sieve();
        $this->scripts = array(
            'test script1' => "require \"fileinto\";\r\nif header :contains \"From\" \"@cnba.uba.ar\" \r\n{fileinto \"INBOX.Test1\";}\r\nelse \r\n{fileinto \"INBOX\";}",
            'test script2' => "require \"fileinto\";\r\nif header :contains \"From\" \"@cnba.uba.ar\" \r\n{fileinto \"INBOX.Test\";}\r\nelse \r\n{fileinto \"INBOX\";}",
            'test"scriptäöü3' => "require \"vacation\";\nvacation\n:days 7\n:addresses [\"matthew@de-construct.com\"]\n:subject \"This is a test\"\n\"I'm on my holiday!\nsadfafs\";",
            'test script4' => file_get_contents(dirname(__FILE__) . '/largescript.siv'));
    }
    
    protected function tearDown()
    {
        // Delete the instance.
        unset($this->fixture);
    }
    
    protected function login()
    {
        $result = $this->fixture->connect(HOST, PORT);
        $this->assertTrue($this->check($result), 'Can not connect');
        $result = $this->fixture->login(USERNAME, PASSWORD, null, '', false);
        $this->assertTrue($this->check($result), 'Can not login');
    }

    protected function logout()
    {
        $result = $this->fixture->disconnect();
        $this->assertFalse($this->_pear->isError($result), 'Error on disconnect');
    }

    protected function clear()
    {
        // Clear all the scripts in the account.
        $this->login();
        $active = $this->fixture->getActive();
        if (isset($this->scripts[$active])) {
            $this->fixture->setActive(null);
        }
        foreach (array_keys($this->scripts) as $script) {
            $this->fixture->removeScript($script);
        }
        $this->logout();
    }

    protected function check($result)
    {
        if ($this->_pear->isError($result)) {
            throw new Exception($result->getMessage());
        }
        return $result;
    }

    public function testConnect()
    {
        $result = $this->fixture->connect(HOST, PORT);
        $this->assertTrue($this->check($result), 'Cannot connect');
    }
    
    public function testLogin()
    {
        $result = $this->fixture->connect(HOST, PORT);
        $this->assertTrue($this->check($result), 'Cannot connect');
        $result = $this->fixture->login(USERNAME, PASSWORD, null, '', false);
        $this->assertTrue($this->check($result), 'Cannot login');
    }

    public function testDisconnect()
    {
        $result = $this->fixture->connect(HOST, PORT);
        $this->assertFalse($this->_pear->isError($result), 'Cannot connect');
        $result = $this->fixture->login(USERNAME, PASSWORD, null, '', false);
        $this->assertFalse($this->_pear->isError($result), 'Cannot login');
        $result = $this->fixture->disconnect();
        $this->assertFalse($this->_pear->isError($result), 'Error on disconnect');
    }

    public function testListScripts()
    {
        $this->login();
        $scripts = $this->fixture->listScripts();
        $this->logout();
        $this->assertFalse($this->_pear->isError($scripts), 'Can not list scripts');
    }

    public function testInstallScript()
    {
        $this->clear();
        $this->login();

        // First script.
        $scriptname = 'test script1';
        $before_scripts = $this->fixture->listScripts();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $this->assertFalse($this->_pear->isError($result), 'Can not install script ' . $scriptname);
        $after_scripts = $this->fixture->listScripts();
        $diff_scripts = array_values(array_diff($after_scripts, $before_scripts));
        $this->assertTrue(count($diff_scripts) > 0, 'Script not installed');
        $this->assertEquals($scriptname, $diff_scripts[0], 'Added script has a different name');

        // Second script (install and activate)
        $scriptname = 'test script2';
        $before_scripts = $this->fixture->listScripts();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname], true);
        $this->assertFalse($this->_pear->isError($result), 'Can not install script ' . $scriptname);
        $after_scripts = $this->fixture->listScripts();
        $diff_scripts = array_values(array_diff($after_scripts, $before_scripts));
        $this->assertTrue(count($diff_scripts) > 0, 'Script not installed');
        $this->assertEquals($scriptname, $diff_scripts[0], 'Added script has a different name');
        $active_script = $this->fixture->getActive();
        $this->assertEquals($scriptname, $active_script, 'Added script has a different name');
        $this->logout();
    }

    /**
     * There is a good chance that this test will fail since most servers have
     * a 32KB limit on uploaded scripts.
     */
    public function testInstallScriptLarge()
    {
        $this->clear();
        $this->login();
        $scriptname = 'test script4';
        $before_scripts = $this->fixture->listScripts();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $this->assertFalse($this->_pear->isError($result), 'Unable to upload large script (expected behavior for most servers)');
        $after_scripts = $this->fixture->listScripts();
        $diff_scripts = array_diff($after_scripts, $before_scripts);
        $this->assertEquals($scriptname, reset($diff_scripts), 'Added script has a different name');
        $this->logout();
    }

    /**
     * See bug #16691.
     */
    public function testInstallNonAsciiScript()
    {
        $this->clear();
        $this->login();

        $scriptname = 'test"scriptäöü3';
        $before_scripts = $this->fixture->listScripts();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $this->assertFalse($this->_pear->isError($result), 'Can not install script ' . $scriptname);
        $after_scripts = $this->fixture->listScripts();
        $diff_scripts = array_values(array_diff($after_scripts, $before_scripts));
        $this->assertTrue(count($diff_scripts) > 0, 'Script not installed');
        $this->assertEquals($scriptname, $diff_scripts[0], 'Added script has a different name');

        $this->logout();
    }

    public function testGetScript()
    {
        $this->clear();
        $this->login();
        $scriptname = 'test script1';
        $before_scripts = $this->fixture->listScripts();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $this->assertFalse($this->_pear->isError($result), 'Can not install script ' . $scriptname);
        $after_scripts = $this->fixture->listScripts();
        $diff_scripts = array_values(array_diff($after_scripts, $before_scripts));
        $this->assertTrue(count($diff_scripts) > 0);
        $this->assertEquals($scriptname, $diff_scripts[0], 'Added script has a different name');
        $script = $this->fixture->getScript($scriptname);
        $this->assertEquals(trim($this->scripts[$scriptname]), trim($script), 'Script installed is not the same script retrieved');
        $this->logout();
    }

    public function testGetActive()
    {
        $this->clear();
        $this->login();
        $active_script = $this->fixture->getActive();
        $this->assertFalse($this->_pear->isError($active_script), 'Error getting the active script');
        $this->logout();
    }

    public function testSetActive()
    {
        $this->clear();
        $scriptname = 'test script1';
        $this->login();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $result = $this->fixture->setActive($scriptname);
        $this->assertFalse($this->_pear->isError($result), 'Can not set active script');
        $active_script = $this->fixture->getActive();
        $this->assertEquals($scriptname, $active_script, 'Active script does not match');

        // Test for non-existant script.
        $result = $this->fixture->setActive('non existant script');
        $this->assertTrue($this->_pear->isError($result));
        $this->logout();
    }

    public function testRemoveScript()
    {
        $this->clear();
        $scriptname = 'test script1';
        $this->login();
        $result = $this->fixture->installScript($scriptname, $this->scripts[$scriptname]);
        $result = $this->fixture->removeScript($scriptname);
        $this->assertFalse($this->_pear->isError($result), 'Error removing active script');
        $this->logout();
    }
}
pear/test/Net_Sieve/tests/config.php.dist000064400000000160151732710350014416 0ustar00<?php
define('HOST', 'localhost');
define('PORT', 4190);
define('USERNAME', 'user');
define('PASSWORD', 'pass');pear/test/Structures_Graph/tests/TopologicalSorterTest.php000064400000003525151732710350020155 0ustar00<?php
require_once dirname(__FILE__) . '/helper.inc';
require_once 'Structures/Graph/Manipulator/TopologicalSorter.php';

class TopologicalSorterTest extends PHPUnit_Framework_TestCase
{
    public function testSort()
    {
        $graph = new Structures_Graph();

        $name1 = 'node1';
        $node1 = new Structures_Graph_Node();
        $node1->setData($name1);
        $graph->addNode($node1);

        $name11 = 'node11';
        $node11 = new Structures_Graph_Node();
        $node11->setData($name11);
        $graph->addNode($node11);
        $node1->connectTo($node11);

        $name12 = 'node12';
        $node12 = new Structures_Graph_Node();
        $node12->setData($name12);
        $graph->addNode($node12);
        $node1->connectTo($node12);

        $name121 = 'node121';
        $node121 = new Structures_Graph_Node();
        $node121->setData($name121);
        $graph->addNode($node121);
        $node12->connectTo($node121);

        $name2 = 'node2';
        $node2 = new Structures_Graph_Node();
        $node2->setData($name2);
        $graph->addNode($node2);

        $name21 = 'node21';
        $node21 = new Structures_Graph_Node();
        $node21->setData($name21);
        $graph->addNode($node21);
        $node2->connectTo($node21);

        $nodes = Structures_Graph_Manipulator_TopologicalSorter::sort($graph);
        $this->assertCount(2, $nodes[0]);
        $this->assertEquals('node1', $nodes[0][0]->getData());
        $this->assertEquals('node2', $nodes[0][1]->getData());

        $this->assertCount(3, $nodes[1]);
        $this->assertEquals('node11', $nodes[1][0]->getData());
        $this->assertEquals('node12', $nodes[1][1]->getData());
        $this->assertEquals('node21', $nodes[1][2]->getData());

        $this->assertCount(1, $nodes[2]);
        $this->assertEquals('node121', $nodes[2][0]->getData());
    }
}
?>
pear/test/Structures_Graph/tests/AllTests.php000064400000000674151732710350015377 0ustar00<?php
require_once dirname(__FILE__) . '/helper.inc';

class Structures_Graph_AllTests
{
    public static function main()
    {
        PHPUnit_TextUI_TestRunner::run(self::suite());
    }

    public static function suite()
    {
        $suite = new PHPUnit_Framework_TestSuite('Structures_Graph Tests');

        $dir = new GlobIterator(dirname(__FILE__) . '/*Test.php');
        $suite->addTestFiles($dir);

        return $suite;
    }
}
pear/test/Structures_Graph/tests/BasicGraphTest.php000064400000021552151732710350016505 0ustar00<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph is distributed in the hope that it will be useful,         |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
// | GNU Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//

require_once dirname(__FILE__) . '/helper.inc';

/**
 * @access private
 */
class BasicGraph extends PHPUnit_Framework_TestCase
{
    var $_graph = null;

    function test_create_graph() {
        $this->_graph = new Structures_Graph();
        $this->assertTrue(is_a($this->_graph, 'Structures_Graph')); 
    }

    function test_add_node() {
        $this->_graph = new Structures_Graph();
        $data = 1;
        $node = new Structures_Graph_Node($data);
        $this->_graph->addNode($node);
        $node = new Structures_Graph_Node($data);
        $this->_graph->addNode($node);
        $node = new Structures_Graph_Node($data);
        $this->_graph->addNode($node);
    }

    function test_connect_node() {
        $this->_graph = new Structures_Graph();
        $data = 1;
        $node1 = new Structures_Graph_Node($data);
        $node2 = new Structures_Graph_Node($data);
        $this->_graph->addNode($node1);
        $this->_graph->addNode($node2);
        $node1->connectTo($node2);

        $node =& $this->_graph->getNodes();
        $node =& $node[0];
        $node = $node->getNeighbours();
        $node =& $node[0];
        /* 
         ZE1 == and === operators fail on $node,$node2 because of the recursion introduced
         by the _graph field in the Node object. So, we'll use the stupid method for reference
         testing
        */
        $node = true;
        $this->assertTrue($node2);
        $node = false;
        $this->assertFalse($node2);
    }

    function test_data_references() {
        $this->_graph = new Structures_Graph();
        $data = 1;
        $node = new Structures_Graph_Node();
        $node->setData($data);
        $this->_graph->addNode($node);
        $data = 2;
        $dataInNode =& $this->_graph->getNodes();
        $dataInNode =& $dataInNode[0];
        $dataInNode =& $dataInNode->getData();
        $this->assertEquals($data, $dataInNode);
    }

    function test_metadata_references() {
        $this->_graph = new Structures_Graph();
        $data = 1;
        $node = new Structures_Graph_Node();
        $node->setMetadata('5', $data);
        $data = 2;
        $dataInNode =& $node->getMetadata('5');
        $this->assertEquals($data, $dataInNode);
    }
   
    function test_metadata_key_exists() {
        $this->_graph = new Structures_Graph();
        $data = 1;
        $node = new Structures_Graph_Node();
        $node->setMetadata('5', $data);
        $this->assertTrue($node->metadataKeyExists('5'));
        $this->assertFalse($node->metadataKeyExists('1'));
    }

    function test_directed_degree() {
        $this->_graph = new Structures_Graph(true);
        $node = array();
        $node[] = new Structures_Graph_Node();
        $node[] = new Structures_Graph_Node();
        $node[] = new Structures_Graph_Node();
        $this->_graph->addNode($node[0]);
        $this->_graph->addNode($node[1]);
        $this->_graph->addNode($node[2]);
        $this->assertEquals(0, $node[0]->inDegree(), 'inDegree test failed for node 0 with 0 arcs');
        $this->assertEquals(0, $node[1]->inDegree(), 'inDegree test failed for node 1 with 0 arcs');
        $this->assertEquals(0, $node[2]->inDegree(), 'inDegree test failed for node 2 with 0 arcs');
        $this->assertEquals(0, $node[0]->outDegree(), 'outDegree test failed for node 0 with 0 arcs');
        $this->assertEquals(0, $node[1]->outDegree(), 'outDegree test failed for node 1 with 0 arcs');
        $this->assertEquals(0, $node[2]->outDegree(), 'outDegree test failed for node 2 with 0 arcs');
        $node[0]->connectTo($node[1]);
        $this->assertEquals(0, $node[0]->inDegree(), 'inDegree test failed for node 0 with 1 arc');
        $this->assertEquals(1, $node[1]->inDegree(), 'inDegree test failed for node 1 with 1 arc');
        $this->assertEquals(0, $node[2]->inDegree(), 'inDegree test failed for node 2 with 1 arc');
        $this->assertEquals(1, $node[0]->outDegree(), 'outDegree test failed for node 0 with 1 arc');
        $this->assertEquals(0, $node[1]->outDegree(), 'outDegree test failed for node 1 with 1 arc');
        $this->assertEquals(0, $node[2]->outDegree(), 'outDegree test failed for node 2 with 1 arc');
        $node[0]->connectTo($node[2]);
        $this->assertEquals(0, $node[0]->inDegree(), 'inDegree test failed for node 0 with 2 arcs');
        $this->assertEquals(1, $node[1]->inDegree(), 'inDegree test failed for node 1 with 2 arcs');
        $this->assertEquals(1, $node[2]->inDegree(), 'inDegree test failed for node 2 with 2 arcs');
        $this->assertEquals(2, $node[0]->outDegree(), 'outDegree test failed for node 0 with 2 arcs');
        $this->assertEquals(0, $node[1]->outDegree(), 'outDegree test failed for node 1 with 2 arcs');
        $this->assertEquals(0, $node[2]->outDegree(), 'outDegree test failed for node 2 with 2 arcs');
    }

    function test_undirected_degree() {
        $this->_graph = new Structures_Graph(false);
        $node = array();
        $node[] = new Structures_Graph_Node();
        $node[] = new Structures_Graph_Node();
        $node[] = new Structures_Graph_Node();
        $this->_graph->addNode($node[0]);
        $this->_graph->addNode($node[1]);
        $this->_graph->addNode($node[2]);
        $this->assertEquals(0, $node[0]->inDegree(), 'inDegree test failed for node 0 with 0 arcs');
        $this->assertEquals(0, $node[1]->inDegree(), 'inDegree test failed for node 1 with 0 arcs');
        $this->assertEquals(0, $node[2]->inDegree(), 'inDegree test failed for node 2 with 0 arcs');
        $this->assertEquals(0, $node[0]->outDegree(), 'outDegree test failed for node 0 with 0 arcs');
        $this->assertEquals(0, $node[1]->outDegree(), 'outDegree test failed for node 1 with 0 arcs');
        $this->assertEquals(0, $node[2]->outDegree(), 'outDegree test failed for node 2 with 0 arcs');
        $node[0]->connectTo($node[1]);
        $this->assertEquals(1, $node[0]->inDegree(), 'inDegree test failed for node 0 with 1 arc');
        $this->assertEquals(1, $node[1]->inDegree(), 'inDegree test failed for node 1 with 1 arc');
        $this->assertEquals(0, $node[2]->inDegree(), 'inDegree test failed for node 2 with 1 arc');
        $this->assertEquals(1, $node[0]->outDegree(), 'outDegree test failed for node 0 with 1 arc');
        $this->assertEquals(1, $node[1]->outDegree(), 'outDegree test failed for node 1 with 1 arc');
        $this->assertEquals(0, $node[2]->outDegree(), 'outDegree test failed for node 2 with 1 arc');
        $node[0]->connectTo($node[2]);
        $this->assertEquals(2, $node[0]->inDegree(), 'inDegree test failed for node 0 with 2 arcs');
        $this->assertEquals(1, $node[1]->inDegree(), 'inDegree test failed for node 1 with 2 arcs');
        $this->assertEquals(1, $node[2]->inDegree(), 'inDegree test failed for node 2 with 2 arcs');
        $this->assertEquals(2, $node[0]->outDegree(), 'outDegree test failed for node 0 with 2 arcs');
        $this->assertEquals(1, $node[1]->outDegree(), 'outDegree test failed for node 1 with 2 arcs');
        $this->assertEquals(1, $node[2]->outDegree(), 'outDegree test failed for node 2 with 2 arcs');
    }
}
?>
pear/test/Structures_Graph/tests/helper.inc000064400000000551151732710350015077 0ustar00<?php
if ('/opt/alt/php73/usr/share/pear' == '@'.'php_dir'.'@') {
    // This package hasn't been installed.
    // Adjust path to ensure includes find files in working directory.
    set_include_path(dirname(dirname(__FILE__))
        . PATH_SEPARATOR . dirname(__FILE__)
        . PATH_SEPARATOR . get_include_path());
}

require_once 'Structures/Graph.php';
pear/test/Structures_Graph/tests/AcyclicTestTest.php000064400000002434151732710350016707 0ustar00<?php
require_once dirname(__FILE__) . '/helper.inc';
require_once 'Structures/Graph/Manipulator/AcyclicTest.php';

class AcyclicTestTest extends PHPUnit_Framework_TestCase
{
    public function testIsAcyclicFalse()
    {
        $graph = new Structures_Graph();
        $node1 = new Structures_Graph_Node();
        $graph->addNode($node1);

        $node2 = new Structures_Graph_Node();
        $graph->addNode($node2);
        $node1->connectTo($node2);

        $node3 = new Structures_Graph_Node();
        $graph->addNode($node3);
        $node2->connectTo($node3);

        $node3->connectTo($node1);

        $this->assertFalse(
            Structures_Graph_Manipulator_AcyclicTest::isAcyclic($graph),
            'Graph is cyclic'
        );
    }

    public function testIsAcyclicTrue()
    {
        $graph = new Structures_Graph();
        $node1 = new Structures_Graph_Node();
        $graph->addNode($node1);

        $node2 = new Structures_Graph_Node();
        $graph->addNode($node2);
        $node1->connectTo($node2);

        $node3 = new Structures_Graph_Node();
        $graph->addNode($node3);
        $node2->connectTo($node3);

        $this->assertTrue(
            Structures_Graph_Manipulator_AcyclicTest::isAcyclic($graph),
            'Graph is acyclic'
        );
    }
}
?>
pear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phpt000064400000001631151732710350021451 0ustar00--TEST--
Bug #1724   Quoted Semicolons in Content-Type
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$Mime = new Mail_Mime();
$Mime->setTXTBody('Test message.');
$Mime->addAttachment('test file contents', 'text/plain; testparam="test1;semicolon"', 'test.txt', FALSE);

$body = $Mime->get();

$hdrs = '';
foreach ($Mime->headers() AS $name => $val) {
    $hdrs .= "$name: $val\n";
}
$hdrs .= "To: Receiver <receiver@example.com>\n";
$hdrs .= "From: Sender <sender@example.com>\n";
$hdrs .= "Subject: PEAR::Mail_Mime test mail\n";

require_once('Mail/mimeDecode.php');

$mime_message = "$hdrs\n$body";
$Decoder = new Mail_mimeDecode($mime_message);
$params = array(
    'include_bodies' => TRUE,
    'decode_bodies'  => TRUE,
    'decode_headers' => TRUE
);
$Decoded = $Decoder->decode($params);
$test_param = $Decoded->parts[1]->ctype_parameters['testparam'];

echo $test_param;

?>
--EXPECT--
test1;semicolon
pear/test/Mail_mimeDecode/tests/parse_header_value.phpt000064400000003624151732710350017335 0ustar00--TEST--
Tests for _parseHeaderValue
--SKIPIF--
--FILE--
<?php
require_once 'Mail/mime.php';

$Mime = new Mail_Mime();
$Mime->setTXTBody('Test message.');
$contentAppend = 'testparam1="test1;semicolon";testparam2=two; testparam3="three"; '
                .'testparam4="four\;4\;four"; testparam5=five\;5\;five; '
                ."testparam6='six'; testparam7='seven;7';testparam8='eight\;8'; "
                .'testparam9="nine;9";testparam10="ten\;10"; '
                .'testparam11=\'a "double" quote\'; testparam12="a \'simple\' quote"; '
                .'testparam13=\'another " quote\'; testparam14="another \' quote";'
                .'testparam15=last';

$Mime->addAttachment('test file contents', "text/plain; $contentAppend", 'test.txt', FALSE);

$body = $Mime->get();

$hdrs = '';
foreach ($Mime->headers() AS $name => $val) {
    $hdrs .= "$name: $val\n";
}
$hdrs .= "To: Receiver <receiver@example.com>\n";
$hdrs .= "From: Sender <sender@example.com>\n";
$hdrs .= "Subject: PEAR::Mail_Mime test mail\n";

require_once 'Mail/mimeDecode.php';

$mime_message = "$hdrs\n$body";
$Decoder = new Mail_mimeDecode($mime_message);
$params = array(
    'include_bodies' => TRUE,
    'decode_bodies'  => TRUE,
    'decode_headers' => TRUE
);
$Decoded = $Decoder->decode($params);
$decodedParts = $Decoded->parts[1]->ctype_parameters;
//Bug #4057: Content-type params now have a name attribute.
unset($decodedParts['name']);
print_r($decodedParts);
?>
--EXPECT--
Array
(
    [testparam1] => test1;semicolon
    [testparam2] => two
    [testparam3] => three
    [testparam4] => four;4;four
    [testparam5] => five;5;five
    [testparam6] => six
    [testparam7] => seven;7
    [testparam8] => eight;8
    [testparam9] => nine;9
    [testparam10] => ten;10
    [testparam11] => a "double" quote
    [testparam12] => a 'simple' quote
    [testparam13] => another " quote
    [testparam14] => another ' quote
    [testparam15] => last
)
pear/.depdblock000064400000000000151732710350007415 0ustar00man/man1/python3.8.1000064400000044646151732726220010034 0ustar00.TH PYTHON "1"

.\" To view this file while editing, run it through groff:
.\"   groff -Tascii -man python.man | less

.SH NAME
python \- an interpreted, interactive, object-oriented programming language
.SH SYNOPSIS
.B python
[
.B \-B
]
[
.B \-b
]
[
.B \-d
]
[
.B \-E
]
[
.B \-h
]
[
.B \-i
]
[
.B \-I
]
.br
       [
.B \-m
.I module-name
]
[
.B \-q
]
[
.B \-O
]
[
.B \-OO
]
[
.B \-s
]
[
.B \-S
]
[
.B \-u
]
.br
       [
.B \-v
]
[
.B \-V
]
[
.B \-W
.I argument
]
[
.B \-x
]
[
[
.B \-X
.I option
]
.B \-?
]
.br
       [
.B \--check-hash-based-pycs
.I default
|
.I always
|
.I never
]
.br
       [
.B \-c
.I command
|
.I script
|
\-
]
[
.I arguments
]
.SH DESCRIPTION
Python is an interpreted, interactive, object-oriented programming
language that combines remarkable power with very clear syntax.
For an introduction to programming in Python, see the Python Tutorial.
The Python Library Reference documents built-in and standard types,
constants, functions and modules.
Finally, the Python Reference Manual describes the syntax and
semantics of the core language in (perhaps too) much detail.
(These documents may be located via the
.B "INTERNET RESOURCES"
below; they may be installed on your system as well.)
.PP
Python's basic power can be extended with your own modules written in
C or C++.
On most systems such modules may be dynamically loaded.
Python is also adaptable as an extension language for existing
applications.
See the internal documentation for hints.
.PP
Documentation for installed Python modules and packages can be
viewed by running the
.B pydoc
program.
.SH COMMAND LINE OPTIONS
.TP
.B \-B
Don't write
.I .pyc
files on import. See also PYTHONDONTWRITEBYTECODE.
.TP
.B \-b
Issue warnings about str(bytes_instance), str(bytearray_instance)
and comparing bytes/bytearray with str. (-bb: issue errors)
.TP
.BI "\-c " command
Specify the command to execute (see next section).
This terminates the option list (following options are passed as
arguments to the command).
.TP
.BI "\-\-check-hash-based-pycs " mode
Configure how Python evaluates the up-to-dateness of hash-based .pyc files.
.TP
.B \-d
Turn on parser debugging output (for expert only, depending on
compilation options).
.TP
.B \-E
Ignore environment variables like PYTHONPATH and PYTHONHOME that modify
the behavior of the interpreter.
.TP
.B \-h ", " \-? ", "\-\-help
Prints the usage for the interpreter executable and exits.
.TP
.B \-i
When a script is passed as first argument or the \fB\-c\fP option is
used, enter interactive mode after executing the script or the
command.  It does not read the $PYTHONSTARTUP file.  This can be
useful to inspect global variables or a stack trace when a script
raises an exception.
.TP
.B \-I
Run Python in isolated mode. This also implies \fB\-E\fP and \fB\-s\fP. In
isolated mode sys.path contains neither the script's directory nor the user's
site-packages directory. All PYTHON* environment variables are ignored, too.
Further restrictions may be imposed to prevent the user from injecting
malicious code.
.TP
.BI "\-m " module-name
Searches
.I sys.path
for the named module and runs the corresponding
.I .py
file as a script.
.TP
.B \-O
Remove assert statements and any code conditional on the value of
__debug__; augment the filename for compiled (bytecode) files by
adding .opt-1 before the .pyc extension.
.TP
.B \-OO
Do \fB-O\fP and also discard docstrings; change the filename for
compiled (bytecode) files by adding .opt-2 before the .pyc extension.
.TP
.B \-q
Do not print the version and copyright messages. These messages are
also suppressed in non-interactive mode.
.TP
.B \-s
Don't add user site directory to sys.path.
.TP
.B \-S
Disable the import of the module
.I site
and the site-dependent manipulations of
.I sys.path
that it entails.  Also disable these manipulations if
.I site
is explicitly imported later.
.TP
.B \-u
Force the stdout and stderr streams to be unbuffered.
This option has no effect on the stdin stream.
.TP
.B \-v
Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  When given
twice, print a message for each file that is checked for when
searching for a module.  Also provides information on module cleanup
at exit.
.TP
.B \-V ", " \-\-version
Prints the Python version number of the executable and exits.  When given
twice, print more information about the build.
.TP
.BI "\-W " argument
Warning control.  Python sometimes prints warning message to
.IR sys.stderr .
A typical warning message has the following form:
.IB file ":" line ": " category ": " message.
By default, each warning is printed once for each source line where it
occurs.  This option controls how often warnings are printed.
Multiple
.B \-W
options may be given; when a warning matches more than one
option, the action for the last matching option is performed.
Invalid
.B \-W
options are ignored (a warning message is printed about invalid
options when the first warning is issued).  Warnings can also be
controlled from within a Python program using the
.I warnings
module.

The simplest form of
.I argument
is one of the following
.I action
strings (or a unique abbreviation):
.B ignore
to ignore all warnings;
.B default
to explicitly request the default behavior (printing each warning once
per source line);
.B all
to print a warning each time it occurs (this may generate many
messages if a warning is triggered repeatedly for the same source
line, such as inside a loop);
.B module
to print each warning only the first time it occurs in each
module;
.B once
to print each warning only the first time it occurs in the program; or
.B error
to raise an exception instead of printing a warning message.

The full form of
.I argument
is
.IB action : message : category : module : line.
Here,
.I action
is as explained above but only applies to messages that match the
remaining fields.  Empty fields match all values; trailing empty
fields may be omitted.  The
.I message
field matches the start of the warning message printed; this match is
case-insensitive.  The
.I category
field matches the warning category.  This must be a class name; the
match test whether the actual warning category of the message is a
subclass of the specified warning category.  The full class name must
be given.  The
.I module
field matches the (fully-qualified) module name; this match is
case-sensitive.  The
.I line
field matches the line number, where zero matches all line numbers and
is thus equivalent to an omitted line number.
.TP
.BI "\-X " option
Set implementation specific option. The following options are available:

    -X faulthandler: enable faulthandler

    -X showrefcount: output the total reference count and number of used
        memory blocks when the program finishes or after each statement in the
        interactive interpreter. This only works on debug builds

    -X tracemalloc: start tracing Python memory allocations using the
        tracemalloc module. By default, only the most recent frame is stored in a
        traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a
        traceback limit of NFRAME frames

    -X showalloccount: output the total count of allocated objects for each
        type when the program finishes. This only works when Python was built with
        COUNT_ALLOCS defined

    -X importtime: show how long each import takes. It shows module name,
        cumulative time (including nested imports) and self time (excluding
        nested imports). Note that its output may be broken in multi-threaded
        application. Typical usage is python3 -X importtime -c 'import asyncio'

    -X dev: enable CPython's "development mode", introducing additional runtime
        checks which are too expensive to be enabled by default. It will not be
        more verbose than the default if the code is correct: new warnings are
        only emitted when an issue is detected. Effect of the developer mode:
           * Add default warning filter, as -W default
           * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function
           * Enable the faulthandler module to dump the Python traceback on a crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True
           * io.IOBase destructor logs close() exceptions

    -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
        locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
        otherwise activate automatically). See PYTHONUTF8 for more details

    -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the
         given directory instead of to the code tree.

    -X int_max_str_digits=number: limit the size of int<->str conversions.
       This helps avoid denial of service attacks when parsing untrusted data.
       The default is sys.int_info.default_max_str_digits.  0 disables.

.TP
.B \-x
Skip the first line of the source.  This is intended for a DOS
specific hack only.  Warning: the line numbers in error messages will
be off by one!
.SH INTERPRETER INTERFACE
The interpreter interface resembles that of the UNIX shell: when
called with standard input connected to a tty device, it prompts for
commands and executes them until an EOF is read; when called with a
file name argument or with a file as standard input, it reads and
executes a
.I script
from that file;
when called with
.B \-c
.IR command ,
it executes the Python statement(s) given as
.IR command .
Here
.I command
may contain multiple statements separated by newlines.
Leading whitespace is significant in Python statements!
In non-interactive mode, the entire input is parsed before it is
executed.
.PP
If available, the script name and additional arguments thereafter are
passed to the script in the Python variable
.IR sys.argv ,
which is a list of strings (you must first
.I import sys
to be able to access it).
If no script name is given,
.I sys.argv[0]
is an empty string; if
.B \-c
is used,
.I sys.argv[0]
contains the string
.I '-c'.
Note that options interpreted by the Python interpreter itself
are not placed in
.IR sys.argv .
.PP
In interactive mode, the primary prompt is `>>>'; the second prompt
(which appears when a command is not complete) is `...'.
The prompts can be changed by assignment to
.I sys.ps1
or
.IR sys.ps2 .
The interpreter quits when it reads an EOF at a prompt.
When an unhandled exception occurs, a stack trace is printed and
control returns to the primary prompt; in non-interactive mode, the
interpreter exits after printing the stack trace.
The interrupt signal raises the
.I Keyboard\%Interrupt
exception; other UNIX signals are not caught (except that SIGPIPE is
sometimes ignored, in favor of the
.I IOError
exception).  Error messages are written to stderr.
.SH FILES AND DIRECTORIES
These are subject to difference depending on local installation
conventions; ${prefix} and ${exec_prefix} are installation-dependent
and should be interpreted as for GNU software; they may be the same.
The default for both is \fI/usr/local\fP.
.IP \fI${exec_prefix}/bin/python\fP
Recommended location of the interpreter.
.PP
.I ${prefix}/lib/python<version>
.br
.I ${exec_prefix}/lib/python<version>
.RS
Recommended locations of the directories containing the standard
modules.
.RE
.PP
.I ${prefix}/include/python<version>
.br
.I ${exec_prefix}/include/python<version>
.RS
Recommended locations of the directories containing the include files
needed for developing Python extensions and embedding the
interpreter.
.RE
.SH ENVIRONMENT VARIABLES
.IP PYTHONHOME
Change the location of the standard Python libraries.  By default, the
libraries are searched in ${prefix}/lib/python<version> and
${exec_prefix}/lib/python<version>, where ${prefix} and ${exec_prefix}
are installation-dependent directories, both defaulting to
\fI/usr/local\fP.  When $PYTHONHOME is set to a single directory, its value
replaces both ${prefix} and ${exec_prefix}.  To specify different values
for these, set $PYTHONHOME to ${prefix}:${exec_prefix}.
.IP PYTHONPATH
Augments the default search path for module files.
The format is the same as the shell's $PATH: one or more directory
pathnames separated by colons.
Non-existent directories are silently ignored.
The default search path is installation dependent, but generally
begins with ${prefix}/lib/python<version> (see PYTHONHOME above).
The default search path is always appended to $PYTHONPATH.
If a script argument is given, the directory containing the script is
inserted in the path in front of $PYTHONPATH.
The search path can be manipulated from within a Python program as the
variable
.IR sys.path .
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str and bytes objects.

If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
generating the hash() of the types covered by the hash randomization.  Its
purpose is to allow repeatable hashing, such as for selftests for the
interpreter itself, or to allow a cluster of python processes to share hash
values.

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP PYTHONINTMAXSTRDIGITS
Limit the maximum digit characters in an int value
when converting from a string and when converting an int back to a str.
A value of 0 disables the limit.  Conversions to or from bases 2, 4, 8,
16, and 32 are never limited.
.IP PYTHONMALLOC
Set the Python memory allocators and/or install debug hooks. The available
memory allocators are
.IR malloc
and
.IR pymalloc .
The available debug hooks are
.IR debug ,
.IR malloc_debug ,
and
.IR pymalloc_debug .
.IP
When Python is compiled in debug mode, the default is
.IR pymalloc_debug
and the debug hooks are automatically used. Otherwise, the default is
.IR pymalloc .
.IP PYTHONMALLOCSTATS
If set to a non-empty string, Python will print statistics of the pymalloc
memory allocator every time a new pymalloc object arena is created, and on
shutdown.
.IP
This variable is ignored if the
.RB $ PYTHONMALLOC
environment variable is used to force the
.BR malloc (3)
allocator of the C library, or if Python is configured without pymalloc support.
.IP PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHONTRACEMALLOC
If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the tracemalloc module.
.IP
The value of the variable is the maximum number of frames stored in a
traceback of a trace. For example,
.IB PYTHONTRACEMALLOC=1
stores only the most recent frame.
.IP PYTHONFAULTHANDLER
If this environment variable is set to a non-empty string,
.IR faulthandler.enable()
is called at startup: install a handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS
and SIGILL signals to dump the Python traceback.
.IP
This is equivalent to the \fB-X faulthandler\fP option.
.IP PYTHONEXECUTABLE
If this environment variable is set,
.IB sys.argv[0]
will be set to its value instead of the value got through the C runtime. Only
works on Mac OS X.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site-packages
directory and Distutils installation paths for
.IR "python setup\.py install \-\-user" .
.IP PYTHONPROFILEIMPORTTIME
If this environment variable is set to a non-empty string, Python will
show how long each import takes. This is exactly equivalent to setting
\fB\-X importtime\fP on the command line.
.IP PYTHONBREAKPOINT
If this environment variable is set to 0, it disables the default debugger. It
can be set to the callable of your debugger of choice.
.SS Debug-mode variables
Setting these variables only has an effect in a debug build of Python, that is,
if Python was configured with the
\fB\--with-pydebug\fP build option.
.IP PYTHONTHREADDEBUG
If this environment variable is set, Python will print threading debug info.
.IP PYTHONDUMPREFS
If this environment variable is set, Python will dump objects and reference
counts still alive after shutting down the interpreter.
.SH AUTHOR
The Python Software Foundation: https://www.python.org/psf/
.SH INTERNET RESOURCES
Main website:  https://www.python.org/
.br
Documentation:  https://docs.python.org/
.br
Developer resources:  https://devguide.python.org/
.br
Downloads:  https://www.python.org/downloads/
.br
Module repository:  https://pypi.org/
.br
Newsgroups:  comp.lang.python, comp.lang.python.announce
.SH LICENSING
Python is distributed under an Open Source license.  See the file
"LICENSE" in the Python source distribution for information on terms &
conditions for accessing and otherwise using Python and for a
DISCLAIMER OF ALL WARRANTIES.
doc/alt-python38-sentry-sdk/CHANGES.md000064400000020772151732726220013275 0ustar00## 0.7.10

* Add more event trimming.
* Log Sentry's response body in debug mode.
* Fix a few bad typehints causing issues in IDEs.
* Fix a bug in the Bottle integration that would report HTTP exceptions (e.g.
  redirects) as errors.
* Fix a bug that would prevent use of `in_app_exclude` without
  setting `in_app_include`.
* Fix a bug where request bodies of Django Rest Framework apps were not captured.
* Suppress errors during SQL breadcrumb capturing in Django
  integration. Also change order in which formatting strategies
  are tried.

## 0.7.9

* New integration for the Bottle web framework. Thanks to Stepan Henek!
* Self-protect against broken mapping implementations and other broken reprs
  instead of dropping all local vars from a stacktrace. Thanks to Marco
  Neumann!

## 0.7.8

* Add support for Sanic versions 18 and 19.
* Fix a bug that causes an SDK crash when using composed SQL from psycopg2.

## 0.7.7

* Fix a bug that would not capture request bodies if they were empty JSON
  arrays, objects or strings.
* New GNU backtrace integration parses stacktraces from exception messages and
  appends them to existing stacktrace.
* Capture Tornado formdata.
* Support Python 3.6 in Sanic and AIOHTTP integration.
* Clear breadcrumbs before starting a new request.
* Fix a bug in the Celery integration that would drop pending events during
  worker shutdown (particularly an issue when running with `max_tasks_per_child
  = 1`)
* Fix a bug with `repr`ing locals whose `__repr__` simultaneously changes the
  WSGI environment or other data that we're also trying to serialize at the
  same time.

## 0.7.6

* Fix a bug where artificial frames for Django templates would not be marked as
  in-app and would always appear as the innermost frame. Implement a heuristic
  to show template frame closer to `render` or `parse` invocation.

## 0.7.5

* Fix bug into Tornado integration that would send broken cookies to the server.
* Fix a bug in the logging integration that would ignore the client
  option `with_locals`.

## 0.7.4

* Read release and environment from process environment like the Raven SDK
  does. The keys are called `SENTRY_RELEASE` and `SENTRY_ENVIRONMENT`.
* Fix a bug in the `serverless` integration where it would not push a new scope
  for each function call (leaking tags and other things across calls).
* Experimental support for type hints.

## 0.7.3

* Fix crash in AIOHTTP integration when integration was set up but disabled.
* Flask integration now adds usernames, email addresses based on the protocol
  Flask-User defines on top of Flask-Login.
* New threading integration catches exceptions from crashing threads.
* New method `flush` on hubs and clients. New global `flush` function.
* Add decorator for serverless functions to fix common problems in those
  environments.
* Fix a bug in the logging integration where using explicit handlers required
  enabling the integration.

## 0.7.2

* Fix `celery.exceptions.Retry` spamming in Celery integration.

## 0.7.1

* Fix `UnboundLocalError` crash in Celery integration.

## 0.7.0

* Properly display chained exceptions (PEP-3134).
* Rewrite celery integration to monkeypatch instead of using signals due to
  bugs in Celery 3's signal handling. The Celery scope is also now available in
  prerun and postrun signals.
* Fix Tornado integration to work with Tornado 6.
* Do not evaluate Django `QuerySet` when trying to capture local variables.
  Also an internal hook was added to overwrite `repr` for local vars.

## 0.6.9

* Second attempt at fixing the bug that was supposed to be fixed in 0.6.8.

  > No longer access arbitrary sequences in local vars due to possible side effects.

## 0.6.8

* No longer access arbitrary sequences in local vars due to possible side effects.

## 0.6.7

* Sourcecode Django templates is now displayed in stackframes like Jinja templates in Flask already were.
* Updates to AWS Lambda integration for changes Amazon did to their Python 3.7 runtime.
* Fix a bug in the AIOHTTP integration that would report 300s and other HTTP status codes as errors.
* Fix a bug where a crashing `before_send` would crash the SDK and app.
* Fix a bug where cyclic references in e.g. local variables or `extra` data would crash the SDK.

## 0.6.6

* Un-break API of internal `Auth` object that we use in Sentry itself.

## 0.6.5

* Capture WSGI request data eagerly to save memory and avoid issues with uWSGI.
* Ability to use subpaths in DSN.
* Ignore `django.request` logger.

## 0.6.4

* Fix bug that would lead to an `AssertionError: stack must have at least one layer`, at least in testsuites for Flask apps.

## 0.6.3

* New integration for Tornado
* Fix request data in Django, Flask and other WSGI frameworks leaking between events.
* Fix infinite recursion when sending more events in `before_send`.

## 0.6.2

* Fix crash in AWS Lambda integration when using Zappa. This only silences the error, the underlying bug is still in Zappa.

## 0.6.1

* New integration for aiohttp-server.
* Fix crash when reading hostname in broken WSGI environments.

## 0.6.0

* Fix bug where a 429 without Retry-After would not be honored.
* Fix bug where proxy setting would not fall back to `http_proxy` for HTTPs traffic.
* A WSGI middleware is now available for catching errors and adding context about the current request to them.
* Using `logging.debug("test", exc_info=True)` will now attach the current stacktrace if no `sys.exc_info` is available.
* The Python 3.7 runtime for AWS Lambda is now supported.
* Fix a bug that would drop an event or parts of it when it contained bytes that were not UTF-8 encoded.
* Logging an exception will no longer add the exception as breadcrumb to the exception's own event.

## 0.5.5

* New client option `ca_certs`.
* Fix crash with Django and psycopg2.

## 0.5.4

* Fix deprecation warning in relation to the `collections` stdlib module.
* Fix bug that would crash Django and Flask when streaming responses are failing halfway through.

## 0.5.3

* Fix bug where using `push_scope` with a callback would not pop the scope.
* Fix crash when initializing the SDK in `push_scope`.
* Fix bug where IP addresses were sent when `send_default_pii=False`.

## 0.5.2

* Fix bug where events sent through the RQ integration were sometimes lost.
* Remove a deprecation warning about usage of `logger.warn`.
* Fix bug where large frame local variables would lead to the event being rejected by Sentry.

## 0.5.1

* Integration for Redis Queue (RQ)

## 0.5.0

* Fix a bug that would omit several debug logs during SDK initialization.
* Fix issue that sent a event key `""` Sentry wouldn't understand.
* **Breaking change:** The `level` and `event_level` options in the logging integration now work separately from each other.
* Fix a bug in the Sanic integration that would report the exception behind any HTTP error code.
* Fix a bug that would spam breadcrumbs in the Celery integration. Ignore logger `celery.worker.job`.
* Additional attributes on log records are now put into `extra`.
* Integration for Pyramid.
* `sys.argv` is put into extra automatically.

## 0.4.3

* Fix a bug that would leak WSGI responses.

## 0.4.2

* Fix a bug in the Sanic integration that would leak data between requests.
* Fix a bug that would hide all debug logging happening inside of the built-in transport.
* Fix a bug that would report errors for typos in Django's shell.

## 0.4.1

* Fix bug that would only show filenames in stacktraces but not the parent
  directories.

## 0.4.0

* Changed how integrations are initialized. Integrations are now
  configured and enabled per-client.

## 0.3.11

* Fix issue with certain deployment tools and the AWS Lambda integration.

## 0.3.10

* Set transactions for Django like in Raven. Which transaction behavior is used
  can be configured.
* Fix a bug which would omit frame local variables from stacktraces in Celery.
* New option: `attach_stacktrace`

## 0.3.9

* Bugfixes for AWS Lambda integration: Using Zappa did not catch any exceptions.

## 0.3.8

* Nicer log level for internal errors.

## 0.3.7

* Remove `repos` configuration option. There was never a way to make use of
  this feature.
* Fix a bug in `last_event_id`.
* Add Django SQL queries to breadcrumbs.
* Django integration won't set user attributes if they were already set.
* Report correct SDK version to Sentry.

## 0.3.6

* Integration for Sanic

## 0.3.5

* Integration for AWS Lambda
* Fix mojibake when encoding local variable values

## 0.3.4

* Performance improvement when storing breadcrumbs

## 0.3.3

* Fix crash when breadcrumbs had to be trunchated

## 0.3.2

* Fixed an issue where some paths where not properly sent as absolute paths
doc/alt-python38-sentry-sdk/LICENSE000064400000002462151732726220012704 0ustar00Copyright (c) 2018 Sentry (https://sentry.io) and individual contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/alt-python38-sentry-sdk/README.md000064400000003103151732726220013147 0ustar00<p align="center">
    <a href="https://sentry.io" target="_blank" align="center">
        <img src="https://sentry-brand.storage.googleapis.com/sentry-logo-black.png" width="280">
    </a>
</p>

# sentry-python - Sentry SDK for Python

[![Build Status](https://travis-ci.com/getsentry/sentry-python.svg?branch=master)](https://travis-ci.com/getsentry/sentry-python)
[![PyPi page link -- version](https://img.shields.io/pypi/v/sentry-sdk.svg)](https://pypi.python.org/pypi/sentry-sdk)

This is the next line of the Python SDK for [Sentry](http://sentry.io/), intended to replace the `raven` package on PyPI.

```python
from sentry_sdk import init, capture_message

init("mydsn@sentry.io/123")

capture_message("Hello World")  # Will create an event.

raise ValueError()  # Will also create an event.
```

To learn more about how to use the SDK:

- [Getting started with the new SDK](https://docs.sentry.io/quickstart/?platform=python)
- [Configuration options](https://docs.sentry.io/error-reporting/configuration/?platform=python)
- [Setting context (tags, user, extra information)](https://docs.sentry.io/enriching-error-data/context/?platform=python)
- [Integrations](https://docs.sentry.io/platforms/python/)

Are you coming from raven-python?

- [Cheatsheet: Migrating to the new SDK from Raven](https://forum.sentry.io/t/switching-to-sentry-python/4733)

To learn about internals:

- [API Reference (using pdoc)](https://getsentry.github.io/sentry-python/)
- [API Reference (using sphinx)](https://www.pydoc.io/search/?package=sentry-sdk)

# License

Licensed under the BSD license, see `LICENSE`
doc/alt-python38-sentry-sdk/CONTRIBUTING.md000064400000001617151732726220014131 0ustar00# How to contribute to the Sentry Python SDK

`sentry-sdk` is an ordinary Python package. You can install it with `pip
install -e .` into some virtualenv, edit the sourcecode and test out your
changes manually.

## Running tests and linters

Make sure you have `virtualenv` installed, and the Python versions you care
about. You should have Python 2.7 and the latest Python 3 installed.

You don't need to `workon` or `activate` anything, the `Makefile` will create
one for you. Run `make` or `make help` to list commands.

## Releasing a new version

We use [craft](https://github.com/getsentry/craft#python-package-index-pypi) to
release new versions. You need credentials for the `getsentry` PyPI user, and
must have `twine` installed globally.

The usual release process goes like this:

1. Go through git log and write new entry into `CHANGELOG.md`, commit to master
2. `craft p a.b.c`
3. `craft pp a.b.c`
doc/alt-python38-certifi/LICENSE000064400000002030151732726220012215 0ustar00This packge contains a modified version of ca-bundle.crt:

ca-bundle.crt -- Bundle of CA Root Certificates

Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011#
This is a bundle of X.509 certificates of public Certificate Authorities
(CA). These were automatically extracted from Mozilla's root certificates
file (certdata.txt).  This file can be found in the mozilla source tree:
http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1#
It contains the certificates in PEM format and therefore
can be directly used with curl / libcurl / php_curl, or with
an Apache+mod_ssl webserver for SSL client authentication.
Just configure this file as the SSLCACertificateFile.#

***** BEGIN LICENSE BLOCK *****
This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at http://mozilla.org/MPL/2.0/.

***** END LICENSE BLOCK *****
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
doc/alt-python38-certifi/README.rst000064400000003215151732726220012705 0ustar00Certifi: Python SSL Certificates
================================

`Certifi`_ is a carefully curated collection of Root Certificates for
validating the trustworthiness of SSL certificates while verifying the identity
of TLS hosts. It has been extracted from the `Requests`_ project.

Installation
------------

``certifi`` is available on PyPI. Simply install it with ``pip``::

    $ pip install certifi

Usage
-----

To reference the installed certificate authority (CA) bundle, you can use the
built-in function::

    >>> import certifi

    >>> certifi.where()
    '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem'

Enjoy!

1024-bit Root Certificates
~~~~~~~~~~~~~~~~~~~~~~~~~~

Browsers and certificate authorities have concluded that 1024-bit keys are
unacceptably weak for certificates, particularly root certificates. For this
reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its
bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key)
certificate from the same CA. Because Mozilla removed these certificates from
its bundle, ``certifi`` removed them as well.

In previous versions, ``certifi`` provided the ``certifi.old_where()`` function
to intentionally re-add the 1024-bit roots back into your bundle. This was not
recommended in production and therefore was removed. To assist in migrating old
code, the function ``certifi.old_where()`` continues to exist as an alias of
``certifi.where()``. Please update your code to use ``certifi.where()``
instead. ``certifi.old_where()`` will be removed in 2018.

.. _`Certifi`: http://certifi.io/en/latest/
.. _`Requests`: http://docs.python-requests.org/en/latest/
doc/alt-python38-libs/README.rst000064400000023464151732726220012221 0ustar00This is Python version 3.8.20
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.8
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.org/python/cpython/branches

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.8
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.8

.. image:: https://codecov.io/gh/python/cpython/branch/3.8/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.8

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues/
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/setup/#install-dependencies>`_
section of the `Developer Guide`_ for current detailed information on
dependencies for various Linux distributions and macOS.

On macOS, there are additional configure and build options related
to macOS framework and universal builds.  Refer to `Mac/README.rst
<https://github.com/python/cpython/blob/3.8/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.8/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavour. Note that this is just an intermediary step.  The
binary resulting from this step is not good for real life workloads as it has
profiling instructions embedded inside.

After the instrumented interpreter is built, the Makefile will run a training
workload.  This is necessary in order to profile the interpreter execution.
Note also that any output, both stdout and stderr, that may appear at this step
is suppressed.

The final step is to build the actual interpreter, using the information
collected from the instrumented one.  The end result will be a Python binary
that is optimized; suitable for distribution or production installation.


Link Time Optimization
^^^^^^^^^^^^^^^^^^^^^^

Enabled via configure's ``--with-lto`` flag.  LTO takes advantage of the
ability of recent compiler toolchains to optimize across the otherwise
arbitrary ``.o`` file boundary when building final executables or shared
libraries for additional performance gains.


What's New
----------

We have a comprehensive overview of the changes in the `What's New in Python
3.8 <https://docs.python.org/3.8/whatsnew/3.8.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.8/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.8>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


Documentation
-------------

`Documentation for Python 3.8 <https://docs.python.org/3.8/>`_ is online,
updated daily.

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

For information about building Python's documentation, refer to `Doc/README.rst
<https://github.com/python/cpython/blob/3.8/Doc/README.rst>`_.


Converting From Python 2.x to 3.x
---------------------------------

Significant backward incompatible changes were made for the release of Python
3.0, which may cause programs written for Python 2 to fail when run with Python
3.  For more information about porting your code from Python 2 to Python 3, see
the `Porting HOWTO <https://docs.python.org/3/howto/pyporting.html>`_.


Testing
-------

To test the interpreter, type ``make test`` in the top-level directory.  The
test set produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.  If a message
is printed about a failed test or a traceback or core dump is produced,
something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run ``make testall``.

If any tests fail, you can re-run the failing test(s) in verbose mode.  For
example, if ``test_os`` and ``test_gdb`` failed, you can run::

    make test TESTOPTS="-v test_os test_gdb"

If the failure persists and appears to be a problem with Python rather than
your environment, you can `file a bug report <https://github.com/python/cpython/issues/>`_ and
include relevant output from that command to show the issue.

See `Running & Writing Tests <https://devguide.python.org/runtests/>`_
for more on running tests.

Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (``--prefix`` argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using ``make altinstall`` contain the major and minor
version and can thus live side-by-side.  ``make install`` also creates
``${prefix}/bin/python3`` which refers to ``${prefix}/bin/pythonX.Y``.  If you
intend to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using ``make
install``.  Install all other versions using ``make altinstall``.

For example, if you want to install Python 2.7, 3.6, and 3.8 with 3.8 being the
primary version, you would execute ``make install`` in your 3.8 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://github.com/python/cpython/issues/>`_ to report bugs, and/or submit pull requests `on
GitHub <https://github.com/python/cpython>`_.

You can also follow development discussion on the `python-dev mailing list
<https://mail.python.org/mailman/listinfo/python-dev/>`_.


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A
Python Enhancement Proposal (PEP) may be submitted if your idea gains ground.
All current PEPs, as well as guidelines for submitting a new PEP, are listed at
`python.org/dev/peps/ <https://www.python.org/dev/peps/>`_.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/


Release Schedule
----------------

See :pep:`569` for Python 3.8 release details.


Copyright and License Information
---------------------------------

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

Copyright © 2000 BeOpen.com.  All rights reserved.

Copyright © 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software, terms &
conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
doc/alt-python38-setuptools/index.rst000064400000000715151732726220013655 0ustar00setuptools
==========

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects.

.. toctree::
   :maxdepth: 1
   :hidden:

   User guide <userguide/index>
   build_meta
   pkg_resources
   references/keywords
   roadmap
   setuptools
   Development guide <development/index>
   Backward compatibility & deprecated practice <deprecated/index>
   Changelog <history>

.. tidelift-referral-banner::
doc/alt-python38-setuptools/deprecated/easy_install.rst000064400000145652151732726220017347 0ustar00============
Easy Install
============

.. warning::
    Easy Install is deprecated. Do not use it. Instead use pip. If
    you think you need Easy Install, please reach out to the PyPA
    team (a ticket to pip or setuptools is fine), describing your
    use-case.

Easy Install is a python module (``easy_install``) bundled with ``setuptools``
that lets you automatically download, build, install, and manage Python
packages.

Please share your experiences with us! If you encounter difficulty installing
a package, please contact us via the `distutils mailing list
<http://mail.python.org/pipermail/distutils-sig/>`_.  (Note: please DO NOT send
private email directly to the author of setuptools; it will be discarded.  The
mailing list is a searchable archive of previously-asked and answered
questions; you should begin your research there before reporting something as a
bug -- and then do so via list discussion first.)

(Also, if you'd like to learn about how you can use ``setuptools`` to make your
own packages work better with EasyInstall, or provide EasyInstall-like features
without requiring your users to use EasyInstall directly, you'll probably want
to check out the full documentation as well.)

Using "Easy Install"
====================


.. _installation instructions:

Installing "Easy Install"
-------------------------

Please see the `setuptools PyPI page <https://pypi.org/project/setuptools/>`_
for download links and basic installation instructions for each of the
supported platforms.

You will need at least Python 3.5 or 2.7.  An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform.

Note that the instructions on the setuptools PyPI page assume that you are
are installing to Python's primary ``site-packages`` directory.  If this is
not the case, you should consult the section below on `Custom Installation
Locations`_ before installing.  (And, on Windows, you should not use the
``.exe`` installer when installing to an alternate location.)

Note that ``easy_install`` normally works by downloading files from the
internet.  If you are behind an NTLM-based firewall that prevents Python
programs from accessing the net directly, you may wish to first install and use
the `APS proxy server <http://ntlmaps.sf.net/>`_, which lets you get past such
firewalls in the same way that your web browser(s) do.

(Alternately, if you do not wish easy_install to actually download anything, you
can restrict it from doing so with the ``--allow-hosts`` option; see the
sections on `restricting downloads with --allow-hosts`_ and `command-line
options`_ for more details.)


Troubleshooting
~~~~~~~~~~~~~~~

If EasyInstall/setuptools appears to install correctly, and you can run the
``easy_install`` command but it fails with an ``ImportError``, the most likely
cause is that you installed to a location other than ``site-packages``,
without taking any of the steps described in the `Custom Installation
Locations`_ section below.  Please see that section and follow the steps to
make sure that your custom location will work correctly.  Then re-install.

Similarly, if you can run ``easy_install``, and it appears to be installing
packages, but then you can't import them, the most likely issue is that you
installed EasyInstall correctly but are using it to install packages to a
non-standard location that hasn't been properly prepared.  Again, see the
section on `Custom Installation Locations`_ for more details.


Windows Notes
~~~~~~~~~~~~~

Installing setuptools will provide an ``easy_install`` command according to
the techniques described in `Executables and Launchers`_. If the
``easy_install`` command is not available after installation, that section
provides details on how to configure Windows to make the commands available.


Downloading and Installing a Package
------------------------------------

For basic use of ``easy_install``, you need only supply the filename or URL of
a source distribution or .egg file (`Python Egg`__).

__ http://peak.telecommunity.com/DevCenter/PythonEggs

**Example 1**. Install a package by name, searching PyPI for the latest
version, and automatically downloading, building, and installing it::

    easy_install SQLObject

**Example 2**. Install or upgrade a package by name and version by finding
links on a given "download page"::

    easy_install -f http://pythonpaste.org/package_index.html SQLObject

**Example 3**. Download a source distribution from a specified URL,
automatically building and installing it::

    easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

**Example 4**. Install an already-downloaded .egg file::

    easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

**Example 5**.  Upgrade an already-installed package to the latest version
listed on PyPI::

    easy_install --upgrade PyProtocols

**Example 6**.  Install a source distribution that's already downloaded and
extracted in the current directory (New in 0.5a9)::

    easy_install .

**Example 7**.  (New in 0.6a1) Find a source distribution or Subversion
checkout URL for a package, and extract it or check it out to
``~/projects/sqlobject`` (the name will always be in all-lowercase), where it
can be examined or edited.  (The package will not be installed, but it can
easily be installed with ``easy_install ~/projects/sqlobject``.  See `Editing
and Viewing Source Packages`_ below for more info.)::

    easy_install --editable --build-directory ~/projects SQLObject

**Example 7**. (New in 0.6.11) Install a distribution within your home dir::

    easy_install --user SQLAlchemy

Easy Install accepts URLs, filenames, PyPI package names (i.e., ``distutils``
"distribution" names), and package+version specifiers.  In each case, it will
attempt to locate the latest available version that meets your criteria.

When downloading or processing downloaded files, Easy Install recognizes
distutils source distribution files with extensions of .tgz, .tar, .tar.gz,
.tar.bz2, or .zip.  And of course it handles already-built .egg
distributions as well as ``.win32.exe`` installers built using distutils.

By default, packages are installed to the running Python installation's
``site-packages`` directory, unless you provide the ``-d`` or ``--install-dir``
option to specify an alternative directory, or specify an alternate location
using distutils configuration files.  (See `Configuration Files`_, below.)

By default, any scripts included with the package are installed to the running
Python installation's standard script installation location.  However, if you
specify an installation directory via the command line or a config file, then
the default directory for installing scripts will be the same as the package
installation directory, to ensure that the script will have access to the
installed package.  You can override this using the ``-s`` or ``--script-dir``
option.

Installed packages are added to an ``easy-install.pth`` file in the install
directory, so that Python will always use the most-recently-installed version
of the package.  If you would like to be able to select which version to use at
runtime, you should use the ``-m`` or ``--multi-version`` option.


Upgrading a Package
-------------------

You don't need to do anything special to upgrade a package: just install the
new version, either by requesting a specific version, e.g.::

    easy_install "SomePackage==2.0"

a version greater than the one you have now::

    easy_install "SomePackage>2.0"

using the upgrade flag, to find the latest available version on PyPI::

    easy_install --upgrade SomePackage

or by using a download page, direct download URL, or package filename::

    easy_install -f http://example.com/downloads ExamplePackage

    easy_install http://example.com/downloads/ExamplePackage-2.0-py2.4.egg

    easy_install my_downloads/ExamplePackage-2.0.tgz

If you're using ``-m`` or ``--multi-version`` , using the ``require()``
function at runtime automatically selects the newest installed version of a
package that meets your version criteria.  So, installing a newer version is
the only step needed to upgrade such packages.

If you're installing to a directory on PYTHONPATH, or a configured "site"
directory (and not using ``-m``), installing a package automatically replaces
any previous version in the ``easy-install.pth`` file, so that Python will
import the most-recently installed version by default.  So, again, installing
the newer version is the only upgrade step needed.

If you haven't suppressed script installation (using ``--exclude-scripts`` or
``-x``), then the upgraded version's scripts will be installed, and they will
be automatically patched to ``require()`` the corresponding version of the
package, so that you can use them even if they are installed in multi-version
mode.

``easy_install`` never actually deletes packages (unless you're installing a
package with the same name and version number as an existing package), so if
you want to get rid of older versions of a package, please see `Uninstalling
Packages`_, below.


Changing the Active Version
---------------------------

If you've upgraded a package, but need to revert to a previously-installed
version, you can do so like this::

    easy_install PackageName==1.2.3

Where ``1.2.3`` is replaced by the exact version number you wish to switch to.
If a package matching the requested name and version is not already installed
in a directory on ``sys.path``, it will be located via PyPI and installed.

If you'd like to switch to the latest installed version of ``PackageName``, you
can do so like this::

    easy_install PackageName

This will activate the latest installed version.  (Note: if you have set any
``find_links`` via distutils configuration files, those download pages will be
checked for the latest available version of the package, and it will be
downloaded and installed if it is newer than your current version.)

Note that changing the active version of a package will install the newly
active version's scripts, unless the ``--exclude-scripts`` or ``-x`` option is
specified.


Uninstalling Packages
---------------------

If you have replaced a package with another version, then you can just delete
the package(s) you don't need by deleting the PackageName-versioninfo.egg file
or directory (found in the installation directory).

If you want to delete the currently installed version of a package (or all
versions of a package), you should first run::

    easy_install -m PackageName

This will ensure that Python doesn't continue to search for a package you're
planning to remove. After you've done this, you can safely delete the .egg
files or directories, along with any scripts you wish to remove.


Managing Scripts
----------------

Whenever you install, upgrade, or change versions of a package, EasyInstall
automatically installs the scripts for the selected package version, unless
you tell it not to with ``-x`` or ``--exclude-scripts``.  If any scripts in
the script directory have the same name, they are overwritten.

Thus, you do not normally need to manually delete scripts for older versions of
a package, unless the newer version of the package does not include a script
of the same name.  However, if you are completely uninstalling a package, you
may wish to manually delete its scripts.

EasyInstall's default behavior means that you can normally only run scripts
from one version of a package at a time.  If you want to keep multiple versions
of a script available, however, you can simply use the ``--multi-version`` or
``-m`` option, and rename the scripts that EasyInstall creates.  This works
because EasyInstall installs scripts as short code stubs that ``require()`` the
matching version of the package the script came from, so renaming the script
has no effect on what it executes.

For example, suppose you want to use two versions of the ``rst2html`` tool
provided by the `docutils <http://docutils.sf.net/>`_ package.  You might
first install one version::

    easy_install -m docutils==0.3.9

then rename the ``rst2html.py`` to ``r2h_039``, and install another version::

    easy_install -m docutils==0.3.10

This will create another ``rst2html.py`` script, this one using docutils
version 0.3.10 instead of 0.3.9.  You now have two scripts, each using a
different version of the package.  (Notice that we used ``-m`` for both
installations, so that Python won't lock us out of using anything but the most
recently-installed version of the package.)


Executables and Launchers
-------------------------

On Unix systems, scripts are installed with as natural files with a "#!"
header and no extension and they launch under the Python version indicated in
the header.

On Windows, there is no mechanism to "execute" files without extensions, so
EasyInstall provides two techniques to mirror the Unix behavior. The behavior
is indicated by the SETUPTOOLS_LAUNCHER environment variable, which may be
"executable" (default) or "natural".

Regardless of the technique used, the script(s) will be installed to a Scripts
directory (by default in the Python installation directory). It is recommended
for EasyInstall that you ensure this directory is in the PATH environment
variable. The easiest way to ensure the Scripts directory is in the PATH is
to run ``Tools\Scripts\win_add2path.py`` from the Python directory.

Note that instead of changing your ``PATH`` to include the Python scripts
directory, you can also retarget the installation location for scripts so they
go on a directory that's already on the ``PATH``.  For more information see
`Command-Line Options`_ and `Configuration Files`_.  During installation,
pass command line options (such as ``--script-dir``) to control where
scripts will be installed.


Windows Executable Launcher
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the "executable" launcher is used, EasyInstall will create a '.exe'
launcher of the same name beside each installed script (including
``easy_install`` itself). These small .exe files launch the script of the
same name using the Python version indicated in the '#!' header.

This behavior is currently default. To force
the use of executable launchers, set ``SETUPTOOLS_LAUNCHER`` to "executable".

Natural Script Launcher
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall also supports deferring to an external launcher such as
`pylauncher <https://bitbucket.org/pypa/pylauncher>`_ for launching scripts.
Enable this experimental functionality by setting the
``SETUPTOOLS_LAUNCHER`` environment variable to "natural". EasyInstall will
then install scripts as simple
scripts with a .pya (or .pyw) extension appended. If these extensions are
associated with the pylauncher and listed in the PATHEXT environment variable,
these scripts can then be invoked simply and directly just like any other
executable. This behavior may become default in a future version.

EasyInstall uses the .pya extension instead of simply
the typical '.py' extension. This distinct extension is necessary to prevent
Python
from treating the scripts as importable modules (where name conflicts exist).
Current releases of pylauncher do not yet associate with .pya files by
default, but future versions should do so.


Tips & Techniques
-----------------

Multiple Python Versions
~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall installs itself under two names:
``easy_install`` and ``easy_install-N.N``, where ``N.N`` is the Python version
used to install it.  Thus, if you install EasyInstall for both Python 3.2 and
2.7, you can use the ``easy_install-3.2`` or ``easy_install-2.7`` scripts to
install packages for the respective Python version.

Setuptools also supplies easy_install as a runnable module which may be
invoked using ``python -m easy_install`` for any Python with Setuptools
installed.

Restricting Downloads with ``--allow-hosts``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the ``--allow-hosts`` (``-H``) option to restrict what domains
EasyInstall will look for links and downloads on.  ``--allow-hosts=None``
prevents downloading altogether.  You can also use wildcards, for example
to restrict downloading to hosts in your own intranet.  See the section below
on `Command-Line Options`_ for more details on the ``--allow-hosts`` option.

By default, there are no host restrictions in effect, but you can change this
default by editing the appropriate `configuration files`_ and adding:

.. code-block:: ini

    [easy_install]
    allow_hosts = *.myintranet.example.com,*.python.org

The above example would then allow downloads only from hosts in the
``python.org`` and ``myintranet.example.com`` domains, unless overridden on the
command line.


Installing on Un-networked Machines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Just copy the eggs or source packages you need to a directory on the target
machine, then use the ``-f`` or ``--find-links`` option to specify that
directory's location.  For example::

    easy_install -H None -f somedir SomePackage

will attempt to install SomePackage using only eggs and source packages found
in ``somedir`` and disallowing all remote access.  You should of course make
sure you have all of SomePackage's dependencies available in somedir.

If you have another machine of the same operating system and library versions
(or if the packages aren't platform-specific), you can create the directory of
eggs using a command like this::

    easy_install -zmaxd somedir SomePackage

This will tell EasyInstall to put zipped eggs or source packages for
SomePackage and all its dependencies into ``somedir``, without creating any
scripts or .pth files.  You can then copy the contents of ``somedir`` to the
target machine.  (``-z`` means zipped eggs, ``-m`` means multi-version, which
prevents .pth files from being used, ``-a`` means to copy all the eggs needed,
even if they're installed elsewhere on the machine, and ``-d`` indicates the
directory to place the eggs in.)

You can also build the eggs from local development packages that were installed
with the ``setup.py develop`` command, by including the ``-l`` option, e.g.::

    easy_install -zmaxld somedir SomePackage

This will use locally-available source distributions to build the eggs.


Packaging Others' Projects As Eggs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Need to distribute a package that isn't published in egg form?  You can use
EasyInstall to build eggs for a project.  You'll want to use the ``--zip-ok``,
``--exclude-scripts``, and possibly ``--no-deps`` options (``-z``, ``-x`` and
``-N``, respectively).  Use ``-d`` or ``--install-dir`` to specify the location
where you'd like the eggs placed.  By placing them in a directory that is
published to the web, you can then make the eggs available for download, either
in an intranet or to the internet at large.

If someone distributes a package in the form of a single ``.py`` file, you can
wrap it in an egg by tacking an ``#egg=name-version`` suffix on the file's URL.
So, something like this::

    easy_install -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will install the package as an egg, and this::

    easy_install -zmaxd. \
        -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will create a ``.egg`` file in the current directory.


Creating your own Package Index
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition to local directories and the Python Package Index, EasyInstall can
find download links on most any web page whose URL is given to the ``-f``
(``--find-links``) option.  In the simplest case, you can simply have a web
page with links to eggs or Python source packages, even an automatically
generated directory listing (such as the Apache web server provides).

If you are setting up an intranet site for package downloads, you may want to
configure the target machines to use your download site by default, adding
something like this to their `configuration files`_:

.. code-block:: ini

    [easy_install]
    find_links = http://mypackages.example.com/somedir/
                 http://turbogears.org/download/
                 http://peak.telecommunity.com/dist/

As you can see, you can list multiple URLs separated by whitespace, continuing
on multiple lines if necessary (as long as the subsequent lines are indented.

If you are more ambitious, you can also create an entirely custom package index
or PyPI mirror.  See the ``--index-url`` option under `Command-Line Options`_,
below, and also the section on `Package Index "API"`_.


Password-Protected Sites
------------------------

If a site you want to download from is password-protected using HTTP "Basic"
authentication, you can specify your credentials in the URL, like so::

    http://some_userid:some_password@some.example.com/some_path/

You can do this with both index page URLs and direct download URLs.  As long
as any HTML pages read by easy_install use *relative* links to point to the
downloads, the same user ID and password will be used to do the downloading.

Using .pypirc Credentials
-------------------------

In additional to supplying credentials in the URL, ``easy_install`` will also
honor credentials if present in the .pypirc file. Teams maintaining a private
repository of packages may already have defined access credentials for
uploading packages according to the distutils documentation. ``easy_install``
will attempt to honor those if present. Refer to the distutils documentation
for Python 2.5 or later for details on the syntax.

Controlling Build Options
~~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall respects standard distutils `Configuration Files`_, so you can use
them to configure build options for packages that it installs from source.  For
example, if you are on Windows using the MinGW compiler, you can configure the
default compiler by putting something like this:

.. code-block:: ini

    [build]
    compiler = mingw32

into the appropriate distutils configuration file.  In fact, since this is just
normal distutils configuration, it will affect any builds using that config
file, not just ones done by EasyInstall.  For example, if you add those lines
to ``distutils.cfg`` in the ``distutils`` package directory, it will be the
default compiler for *all* packages you build.  See `Configuration Files`_
below for a list of the standard configuration file locations, and links to
more documentation on using distutils configuration files.


Editing and Viewing Source Packages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sometimes a package's source distribution  contains additional documentation,
examples, configuration files, etc., that are not part of its actual code.  If
you want to be able to examine these files, you can use the ``--editable``
option to EasyInstall, and EasyInstall will look for a source distribution
or Subversion URL for the package, then download and extract it or check it out
as a subdirectory of the ``--build-directory`` you specify.  If you then wish
to install the package after editing or configuring it, you can do so by
rerunning EasyInstall with that directory as the target.

Note that using ``--editable`` stops EasyInstall from actually building or
installing the package; it just finds, obtains, and possibly unpacks it for
you.  This allows you to make changes to the package if necessary, and to
either install it in development mode using ``setup.py develop`` (if the
package uses setuptools, that is), or by running ``easy_install projectdir``
(where ``projectdir`` is the subdirectory EasyInstall created for the
downloaded package.

In order to use ``--editable`` (``-e`` for short), you *must* also supply a
``--build-directory`` (``-b`` for short).  The project will be placed in a
subdirectory of the build directory.  The subdirectory will have the same
name as the project itself, but in all-lowercase.  If a file or directory of
that name already exists, EasyInstall will print an error message and exit.

Also, when using ``--editable``, you cannot use URLs or filenames as arguments.
You *must* specify project names (and optional version requirements) so that
EasyInstall knows what directory name(s) to create.  If you need to force
EasyInstall to use a particular URL or filename, you should specify it as a
``--find-links`` item (``-f`` for short), and then also specify
the project name, e.g.::

    easy_install -eb ~/projects \
     -fhttp://prdownloads.sourceforge.net/ctypes/ctypes-0.9.6.tar.gz?download \
     ctypes==0.9.6


Dealing with Installation Conflicts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(NOTE: As of 0.6a11, this section is obsolete; it is retained here only so that
people using older versions of EasyInstall can consult it.  As of version
0.6a11, installation conflicts are handled automatically without deleting the
old or system-installed packages, and without ignoring the issue.  Instead,
eggs are automatically shifted to the front of ``sys.path`` using special
code added to the ``easy-install.pth`` file.  So, if you are using version
0.6a11 or better of setuptools, you do not need to worry about conflicts,
and the following issues do not apply to you.)

EasyInstall installs distributions in a "managed" way, such that each
distribution can be independently activated or deactivated on ``sys.path``.
However, packages that were not installed by EasyInstall are "unmanaged",
in that they usually live all in one directory and cannot be independently
activated or deactivated.

As a result, if you are using EasyInstall to upgrade an existing package, or
to install a package with the same name as an existing package, EasyInstall
will warn you of the conflict.  (This is an improvement over ``setup.py
install``, because the ``distutils`` just install new packages on top of old
ones, possibly combining two unrelated packages or leaving behind modules that
have been deleted in the newer version of the package.)

EasyInstall will stop the installation if it detects a conflict
between an existing, "unmanaged" package, and a module or package in any of
the distributions you're installing.  It will display a list of all of the
existing files and directories that would need to be deleted for the new
package to be able to function correctly.  To proceed, you must manually
delete these conflicting files and directories and re-run EasyInstall.

Of course, once you've replaced all of your existing "unmanaged" packages with
versions managed by EasyInstall, you won't have any more conflicts to worry
about!


Compressed Installation
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall tries to install packages in zipped form, if it can.  Zipping
packages can improve Python's overall import performance if you're not using
the ``--multi-version`` option, because Python processes zipfile entries on
``sys.path`` much faster than it does directories.

As of version 0.5a9, EasyInstall analyzes packages to determine whether they
can be safely installed as a zipfile, and then acts on its analysis.  (Previous
versions would not install a package as a zipfile unless you used the
``--zip-ok`` option.)

The current analysis approach is fairly conservative; it currently looks for:

 * Any use of the ``__file__`` or ``__path__`` variables (which should be
   replaced with ``pkg_resources`` API calls)

 * Possible use of ``inspect`` functions that expect to manipulate source files
   (e.g. ``inspect.getsource()``)

 * Top-level modules that might be scripts used with ``python -m`` (Python 2.4)

If any of the above are found in the package being installed, EasyInstall will
assume that the package cannot be safely run from a zipfile, and unzip it to
a directory instead.  You can override this analysis with the ``-zip-ok`` flag,
which will tell EasyInstall to install the package as a zipfile anyway.  Or,
you can use the ``--always-unzip`` flag, in which case EasyInstall will always
unzip, even if its analysis says the package is safe to run as a zipfile.

Normally, however, it is simplest to let EasyInstall handle the determination
of whether to zip or unzip, and only specify overrides when needed to work
around a problem.  If you find you need to override EasyInstall's guesses, you
may want to contact the package author and the EasyInstall maintainers, so that
they can make appropriate changes in future versions.

(Note: If a package uses ``setuptools`` in its setup script, the package author
has the option to declare the package safe or unsafe for zipped usage via the
``zip_safe`` argument to ``setup()``.  If the package author makes such a
declaration, EasyInstall believes the package's author and does not perform its
own analysis.  However, your command-line option, if any, will still override
the package author's choice.)


Reference Manual
================

Configuration Files
-------------------

(New in 0.4a2)

You may specify default options for EasyInstall using the standard
distutils configuration files, under the command heading ``easy_install``.
EasyInstall will look first for a ``setup.cfg`` file in the current directory,
then a ``~/.pydistutils.cfg`` or ``$HOME\\pydistutils.cfg`` (on Unix-like OSes
and Windows, respectively), and finally a ``distutils.cfg`` file in the
``distutils`` package directory.  Here's a simple example:

.. code-block:: ini

    [easy_install]

    # set the default location to install packages
    install_dir = /home/me/lib/python

    # Notice that indentation can be used to continue an option
    # value; this is especially useful for the "--find-links"
    # option, which tells easy_install to use download links on
    # these pages before consulting PyPI:
    #
    find_links = http://sqlobject.org/
                 http://peak.telecommunity.com/dist/

In addition to accepting configuration for its own options under
``[easy_install]``, EasyInstall also respects defaults specified for other
distutils commands.  For example, if you don't set an ``install_dir`` for
``[easy_install]``, but *have* set an ``install_lib`` for the ``[install]``
command, this will become EasyInstall's default installation directory.  Thus,
if you are already using distutils configuration files to set default install
locations, build options, etc., EasyInstall will respect your existing settings
until and unless you override them explicitly in an ``[easy_install]`` section.

For more information, see also the current Python documentation on the `use and
location of distutils configuration files <https://docs.python.org/install/index.html#inst-config-files>`_.

Notice that ``easy_install`` will use the ``setup.cfg`` from the current
working directory only if it was triggered from ``setup.py`` through the
``install_requires`` option. The standalone command will not use that file.

Command-Line Options
--------------------

``--zip-ok, -z``
    Install all packages as zip files, even if they are marked as unsafe for
    running as a zipfile.  This can be useful when EasyInstall's analysis
    of a non-setuptools package is too conservative, but keep in mind that
    the package may not work correctly.  (Changed in 0.5a9; previously this
    option was required in order for zipped installation to happen at all.)

``--always-unzip, -Z``
    Don't install any packages as zip files, even if the packages are marked
    as safe for running as a zipfile.  This can be useful if a package does
    something unsafe, but not in a way that EasyInstall can easily detect.
    EasyInstall's default analysis is currently very conservative, however, so
    you should only use this option if you've had problems with a particular
    package, and *after* reporting the problem to the package's maintainer and
    to the EasyInstall maintainers.

    (Note: the ``-z/-Z`` options only affect the installation of newly-built
    or downloaded packages that are not already installed in the target
    directory; if you want to convert an existing installed version from
    zipped to unzipped or vice versa, you'll need to delete the existing
    version first, and re-run EasyInstall.)

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``easy_install`` from
    adding an ``easy-install.pth`` entry for the package being installed, and
    if an entry for any version the package already exists, it will be removed
    upon successful installation. In multi-version mode, no specific version of
    the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``. This can be as
    simple as::

        from pkg_resources import require
        require("SomePackage", "OtherPackage", "MyPackage")

    which will put the latest installed version of the specified packages on
    ``sys.path`` for you. (For more advanced uses, like selecting specific
    versions and enabling optional dependencies, see the ``pkg_resources`` API
    doc.)

    Changed in 0.6a10: this option is no longer silently enabled when
    installing to a non-PYTHONPATH, non-"site" directory.  You must always
    explicitly use this option if you want it to be active.

``--upgrade, -U``   (New in 0.5a4)
    By default, EasyInstall only searches online if a project/version
    requirement can't be met by distributions already installed
    on sys.path or the installation directory.  However, if you supply the
    ``--upgrade`` or ``-U`` flag, EasyInstall will always check the package
    index and ``--find-links`` URLs before selecting a version to install.  In
    this way, you can force EasyInstall to use the latest available version of
    any package it installs (subject to any version requirements that might
    exclude such later versions).

``--install-dir=DIR, -d DIR``
    Set the installation directory. It is up to you to ensure that this
    directory is on ``sys.path`` at runtime, and to use
    ``pkg_resources.require()`` to enable the installed package(s) that you
    need.

    (New in 0.4a2) If this option is not directly specified on the command line
    or in a distutils configuration file, the distutils default installation
    location is used.  Normally, this would be the ``site-packages`` directory,
    but if you are using distutils configuration files, setting things like
    ``prefix`` or ``install_lib``, then those settings are taken into
    account when computing the default installation directory, as is the
    ``--prefix`` option.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't install scripts.  This is useful if you need to install multiple
    versions of a package, but do not want to reset the version that will be
    run by scripts that are already installed.

``--user`` (New in 0.6.11)
    Use the user-site-packages as specified in :pep:`370`
    instead of the global site-packages.

``--always-copy, -a``   (New in 0.5a4)
    Copy all needed distributions to the installation directory, even if they
    are already present in a directory on sys.path.  In older versions of
    EasyInstall, this was the default behavior, but now you must explicitly
    request it.  By default, EasyInstall will no longer copy such distributions
    from other sys.path directories to the installation directory, unless you
    explicitly gave the distribution's filename on the command line.

    Note that as of 0.6a10, using this option excludes "system" and
    "development" eggs from consideration because they can't be reliably
    copied.  This may cause EasyInstall to choose an older version of a package
    than what you expected, or it may cause downloading and installation of a
    fresh copy of something that's already installed.  You will see warning
    messages for any eggs that EasyInstall skips, before it falls back to an
    older version or attempts to download a fresh copy.

``--find-links=URLS_OR_FILENAMES, -f URLS_OR_FILENAMES``
    Scan the specified "download pages" or directories for direct links to eggs
    or other distributions.  Any existing file or directory names or direct
    download URLs are immediately added to EasyInstall's search cache, and any
    indirect URLs (ones that don't point to eggs or other recognized archive
    formats) are added to a list of additional places to search for download
    links.  As soon as EasyInstall has to go online to find a package (either
    because it doesn't exist locally, or because ``--upgrade`` or ``-U`` was
    used), the specified URLs will be downloaded and scanned for additional
    direct links.

    Eggs and archives found by way of ``--find-links`` are only downloaded if
    they are needed to meet a requirement specified on the command line; links
    to unneeded packages are ignored.

    If all requested packages can be found using links on the specified
    download pages, the Python Package Index will not be consulted unless you
    also specified the ``--upgrade`` or ``-U`` option.

    (Note: if you want to refer to a local HTML file containing links, you must
    use a ``file:`` URL, as filenames that do not refer to a directory, egg, or
    archive are ignored.)

    You may specify multiple URLs or file/directory names with this option,
    separated by whitespace.  Note that on the command line, you will probably
    have to surround the URL list with quotes, so that it is recognized as a
    single option value.  You can also specify URLs in a configuration file;
    see `Configuration Files`_, above.

    Changed in 0.6a10: previously all URLs and directories passed to this
    option were scanned as early as possible, but from 0.6a10 on, only
    directories and direct archive links are scanned immediately; URLs are not
    retrieved unless a package search was already going to go online due to a
    package not being available locally, or due to the use of the ``--update``
    or ``-U`` option.

``--no-find-links`` Blocks the addition of any link.
    This parameter is useful if you want to avoid adding links defined in a
    project easy_install is installing (whether it's a requested project or a
    dependency). When used, ``--find-links`` is ignored.

    Added in Distribute 0.6.11 and Setuptools 0.7.

``--index-url=URL, -i URL`` (New in 0.4a1; default changed in 0.6c7)
    Specifies the base URL of the Python Package Index.  The default is
    https://pypi.org/simple/ if not specified.  When a package is requested
    that is not locally available or linked from a ``--find-links`` download
    page, the package index will be searched for download pages for the needed
    package, and those download pages will be searched for links to download
    an egg or source distribution.

``--editable, -e`` (New in 0.6a1)
    Only find and download source distributions for the specified projects,
    unpacking them to subdirectories of the specified ``--build-directory``.
    EasyInstall will not actually build or install the requested projects or
    their dependencies; it will just find and extract them for you.  See
    `Editing and Viewing Source Packages`_ above for more details.

``--build-directory=DIR, -b DIR`` (UPDATED in 0.6a1)
    Set the directory used to build source packages.  If a package is built
    from a source distribution or checkout, it will be extracted to a
    subdirectory of the specified directory.  The subdirectory will have the
    same name as the extracted distribution's project, but in all-lowercase.
    If a file or directory of that name already exists in the given directory,
    a warning will be printed to the console, and the build will take place in
    a temporary directory instead.

    This option is most useful in combination with the ``--editable`` option,
    which forces EasyInstall to *only* find and extract (but not build and
    install) source distributions.  See `Editing and Viewing Source Packages`_,
    above, for more information.

``--verbose, -v, --quiet, -q`` (New in 0.4a4)
    Control the level of detail of EasyInstall's progress messages.  The
    default detail level is "info", which prints information only about
    relatively time-consuming operations like running a setup script, unpacking
    an archive, or retrieving a URL.  Using ``-q`` or ``--quiet`` drops the
    detail level to "warn", which will only display installation reports,
    warnings, and errors.  Using ``-v`` or ``--verbose`` increases the detail
    level to include individual file-level operations, link analysis messages,
    and distutils messages from any setup scripts that get run.  If you include
    the ``-v`` option more than once, the second and subsequent uses are passed
    down to any setup scripts, increasing the verbosity of their reporting as
    well.

``--dry-run, -n`` (New in 0.4a4)
    Don't actually install the package or scripts.  This option is passed down
    to any setup scripts run, so packages should not actually build either.
    This does *not* skip downloading, nor does it skip extracting source
    distributions to a temporary/build directory.

``--optimize=LEVEL``, ``-O LEVEL`` (New in 0.4a4)
    If you are installing from a source distribution, and are *not* using the
    ``--zip-ok`` option, this option controls the optimization level for
    compiling installed ``.py`` files to ``.pyo`` files.  It does not affect
    the compilation of modules contained in ``.egg`` files, only those in
    ``.egg`` directories.  The optimization level can be set to 0, 1, or 2;
    the default is 0 (unless it's set under ``install`` or ``install_lib`` in
    one of your distutils configuration files).

``--record=FILENAME``  (New in 0.5a4)
    Write a record of all installed files to FILENAME.  This is basically the
    same as the same option for the standard distutils "install" command, and
    is included for compatibility with tools that expect to pass this option
    to "setup.py install".

``--site-dirs=DIRLIST, -S DIRLIST``   (New in 0.6a1)
    Specify one or more custom "site" directories (separated by commas).
    "Site" directories are directories where ``.pth`` files are processed, such
    as the main Python ``site-packages`` directory.  As of 0.6a10, EasyInstall
    automatically detects whether a given directory processes ``.pth`` files
    (or can be made to do so), so you should not normally need to use this
    option.  It is is now only necessary if you want to override EasyInstall's
    judgment and force an installation directory to be treated as if it
    supported ``.pth`` files.

``--no-deps, -N``  (New in 0.6a6)
    Don't install any dependencies.  This is intended as a convenience for
    tools that wrap eggs in a platform-specific packaging system.  (We don't
    recommend that you use it for anything else.)

``--allow-hosts=PATTERNS, -H PATTERNS``   (New in 0.6a6)
    Restrict downloading and spidering to hosts matching the specified glob
    patterns.  E.g. ``-H *.python.org`` restricts web access so that only
    packages listed and downloadable from machines in the ``python.org``
    domain.  The glob patterns must match the *entire* user/host/port section of
    the target URL(s).  For example, ``*.python.org`` will NOT accept a URL
    like ``http://python.org/foo`` or ``http://www.python.org:8080/``.
    Multiple patterns can be specified by separating them with commas.  The
    default pattern is ``*``, which matches anything.

    In general, this option is mainly useful for blocking EasyInstall's web
    access altogether (e.g. ``-Hlocalhost``), or to restrict it to an intranet
    or other trusted site.  EasyInstall will do the best it can to satisfy
    dependencies given your host restrictions, but of course can fail if it
    can't find suitable packages.  EasyInstall displays all blocked URLs, so
    that you can adjust your ``--allow-hosts`` setting if it is more strict
    than you intended.  Some sites may wish to define a restrictive default
    setting for this option in their `configuration files`_, and then manually
    override the setting on the command line as needed.

``--prefix=DIR`` (New in 0.6a10)
    Use the specified directory as a base for computing the default
    installation and script directories.  On Windows, the resulting default
    directories will be ``prefix\\Lib\\site-packages`` and ``prefix\\Scripts``,
    while on other platforms the defaults will be
    ``prefix/lib/python2.X/site-packages`` (with the appropriate version
    substituted) for libraries and ``prefix/bin`` for scripts.

    Note that the ``--prefix`` option only sets the *default* installation and
    script directories, and does not override the ones set on the command line
    or in a configuration file.

``--local-snapshots-ok, -l`` (New in 0.6c6)
    Normally, EasyInstall prefers to only install *released* versions of
    projects, not in-development ones, because such projects may not
    have a currently-valid version number.  So, it usually only installs them
    when their ``setup.py`` directory is explicitly passed on the command line.

    However, if this option is used, then any in-development projects that were
    installed using the ``setup.py develop`` command, will be used to build
    eggs, effectively upgrading the "in-development" project to a snapshot
    release.  Normally, this option is used only in conjunction with the
    ``--always-copy`` option to create a distributable snapshot of every egg
    needed to run an application.

    Note that if you use this option, you must make sure that there is a valid
    version number (such as an SVN revision number tag) for any in-development
    projects that may be used, as otherwise EasyInstall may not be able to tell
    what version of the project is "newer" when future installations or
    upgrades are attempted.


.. _non-root installation:

Custom Installation Locations
-----------------------------

By default, EasyInstall installs python packages into Python's main ``site-packages`` directory,
and manages them using a custom ``.pth`` file in that same directory.

Very often though, a user or developer wants ``easy_install`` to install and manage python packages
in an alternative location, usually for one of 3 reasons:

1. They don't have access to write to the main Python site-packages directory.

2. They want a user-specific stash of packages, that is not visible to other users.

3. They want to isolate a set of packages to a specific python application, usually to minimize
   the possibility of version conflicts.

Historically, there have been many approaches to achieve custom installation.
The following section lists only the easiest and most relevant approaches [1]_.

`Use the "--user" option`_

`Use the "--user" option and customize "PYTHONUSERBASE"`_

`Use "virtualenv"`_

.. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_.

.. _PEP-370: http://www.python.org/dev/peps/pep-0370/


Use the "--user" option
~~~~~~~~~~~~~~~~~~~~~~~
Python provides a User scheme for installation, which means that all
python distributions support an alternative install location that is specific to a user [3]_.
The Default location for each OS is explained in the python documentation
for the ``site.USER_BASE`` variable.  This mode of installation can be turned on by
specifying the ``--user`` option to ``setup.py install`` or ``easy_install``.
This approach serves the need to have a user-specific stash of packages.

.. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized.

Use the "--user" option and customize "PYTHONUSERBASE"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The User scheme install location can be customized by setting the ``PYTHONUSERBASE`` environment
variable, which updates the value of ``site.USER_BASE``.  To isolate packages to a specific
application, simply set the OS environment of that application to a specific value of
``PYTHONUSERBASE``, that contains just those packages.

Use "virtualenv"
~~~~~~~~~~~~~~~~
"virtualenv" is a 3rd-party python package that effectively "clones" a python installation, thereby
creating an isolated location to install packages.  The evolution of "virtualenv" started before the existence
of the User installation scheme.  "virtualenv" provides a version of ``easy_install`` that is
scoped to the cloned python install and is used in the normal way. "virtualenv" does offer various features
that the User installation scheme alone does not provide, e.g. the ability to hide the main python site-packages.

Please refer to the `virtualenv`_ documentation for more details.

.. _virtualenv: https://pypi.org/project/virtualenv/



Package Index "API"
-------------------

Custom package indexes (and PyPI) must follow the following rules for
EasyInstall to be able to look up and download packages:

1. Except where stated otherwise, "pages" are HTML or XHTML, and "links"
   refer to ``href`` attributes.

2. Individual project version pages' URLs must be of the form
   ``base/projectname/version``, where ``base`` is the package index's base URL.

3. Omitting the ``/version`` part of a project page's URL (but keeping the
   trailing ``/``) should result in a page that is either:

   a) The single active version of that project, as though the version had been
      explicitly included, OR

   b) A page with links to all of the active version pages for that project.

4. Individual project version pages should contain direct links to downloadable
   distributions where possible.  It is explicitly permitted for a project's
   "long_description" to include URLs, and these should be formatted as HTML
   links by the package index, as EasyInstall does no special processing to
   identify what parts of a page are index-specific and which are part of the
   project's supplied description.

5. Where available, MD5 information should be added to download URLs by
   appending a fragment identifier of the form ``#md5=...``, where ``...`` is
   the 32-character hex MD5 digest.  EasyInstall will verify that the
   downloaded file's MD5 digest matches the given value.

6. Individual project version pages should identify any "homepage" or
   "download" URLs using ``rel="homepage"`` and ``rel="download"`` attributes
   on the HTML elements linking to those URLs. Use of these attributes will
   cause EasyInstall to always follow the provided links, unless it can be
   determined by inspection that they are downloadable distributions. If the
   links are not to downloadable distributions, they are retrieved, and if they
   are HTML, they are scanned for download links. They are *not* scanned for
   additional "homepage" or "download" links, as these are only processed for
   pages that are part of a package index site.

7. The root URL of the index, if retrieved with a trailing ``/``, must result
   in a page containing links to *all* projects' active version pages.

   (Note: This requirement is a workaround for the absence of case-insensitive
   ``safe_name()`` matching of project names in URL paths. If project names are
   matched in this fashion (e.g. via the PyPI server, mod_rewrite, or a similar
   mechanism), then it is not necessary to include this all-packages listing
   page.)

8. If a package index is accessed via a ``file://`` URL, then EasyInstall will
   automatically use ``index.html`` files, if present, when trying to read a
   directory with a trailing ``/`` on the URL.
doc/alt-python38-setuptools/deprecated/index.rst000064400000001417151732726220015755 0ustar00======================================================
Guides on backward compatibility & deprecated practice
======================================================

``Setuptools`` has undergone tremendous changes since its first debut. As its
development continues to roll forward, many of the practice and mechanisms it
had established are now considered deprecated. But they still remain relevant
as a plethora of libraries continue to depend on them. Many people also find
it necessary to equip themselves with the knowledge to better support backward
compatibility. This guide aims to provide the essential information for such
objectives.

.. toctree::
    :maxdepth: 1

    python3
    python_eggs
    easy_install
    distutils/index
    distutils-legacy
    functionalities
doc/alt-python38-setuptools/deprecated/distutils/index.rst000064400000002353151732726220020001 0ustar00.. _distutils-index:

##############################################
  Distributing Python Modules (Legacy version)
##############################################

:Authors: Greg Ward, Anthony Baxter
:Email: distutils-sig@python.org

.. seealso::

   :ref:`distributing-index`
      The up to date module distribution documentations

.. include:: ./_setuptools_disclaimer.rst

.. note::

   This guide only covers the basic tools for building and distributing
   extensions that are provided as part of this version of Python. Third party
   tools offer easier to use and more secure alternatives. Refer to the `quick
   recommendations section <https://packaging.python.org/guides/tool-recommendations/>`__
   in the Python Packaging User Guide for more information.

This document describes the Python Distribution Utilities ("Distutils") from
the module developer's point of view, describing the underlying capabilities
that ``setuptools`` builds on to allow Python developers to make Python modules
and extensions readily available to a wider audience.

.. toctree::
   :maxdepth: 2
   :numbered:

   introduction.rst
   setupscript.rst
   configfile.rst
   sourcedist.rst
   builtdist.rst
   examples.rst
   extending.rst
   commandref.rst
   apiref.rst
doc/alt-python38-setuptools/deprecated/distutils/extending.rst000064400000010760151732726220020660 0ustar00.. _extending-distutils:

*******************
Extending Distutils
*******************

.. include:: ./_setuptools_disclaimer.rst

Distutils can be extended in various ways.  Most extensions take the form of new
commands or replacements for existing commands.  New commands may be written to
support new types of platform-specific packaging, for example, while
replacements for existing commands may be made to modify details of how the
command operates on a package.

Most extensions of the distutils are made within :file:`setup.py` scripts that
want to modify existing commands; many simply add a few file extensions that
should be copied into packages in addition to :file:`.py` files as a
convenience.

Most distutils command implementations are subclasses of the
:class:`distutils.cmd.Command` class.  New commands may directly inherit from
:class:`~distutils.cmd.Command`, while replacements often derive from :class:`~distutils.cmd.Command`
indirectly, directly subclassing the command they are replacing.  Commands are
required to derive from :class:`~distutils.cmd.Command`.

.. % \section{Extending existing commands}
.. % \label{extend-existing}

.. % \section{Writing new commands}
.. % \label{new-commands}
.. % \XXX{Would an uninstall command be a good example here?}


Integrating new commands
========================

There are different ways to integrate new command implementations into
distutils.  The most difficult is to lobby for the inclusion of the new features
in distutils itself, and wait for (and require) a version of Python that
provides that support.  This is really hard for many reasons.

The most common, and possibly the most reasonable for most needs, is to include
the new implementations with your :file:`setup.py` script, and cause the
:func:`distutils.core.setup` function use them::

   from distutils.command.build_py import build_py as _build_py
   from distutils.core import setup

   class build_py(_build_py):
       """Specialized Python source builder."""

       # implement whatever needs to be different...

   setup(cmdclass={'build_py': build_py},
         ...)

This approach is most valuable if the new implementations must be used to use a
particular package, as everyone interested in the package will need to have the
new command implementation.

Beginning with Python 2.4, a third option is available, intended to allow new
commands to be added which can support existing :file:`setup.py` scripts without
requiring modifications to the Python installation.  This is expected to allow
third-party extensions to provide support for additional packaging systems, but
the commands can be used for anything distutils commands can be used for.  A new
configuration option, ``command_packages`` (command-line option
:option:`!--command-packages`), can be used to specify additional packages to be
searched for modules implementing commands.  Like all distutils options, this
can be specified on the command line or in a configuration file.  This option
can only be set in the ``[global]`` section of a configuration file, or before
any commands on the command line.  If set in a configuration file, it can be
overridden from the command line; setting it to an empty string on the command
line causes the default to be used.  This should never be set in a configuration
file provided with a package.

This new option can be used to add any number of packages to the list of
packages searched for command implementations; multiple package names should be
separated by commas.  When not specified, the search is only performed in the
:mod:`distutils.command` package.  When :file:`setup.py` is run with the option
``--command-packages distcmds,buildcmds``, however, the packages
:mod:`distutils.command`, ``distcmds``, and ``buildcmds`` will be searched
in that order.  New commands are expected to be implemented in modules of the
same name as the command by classes sharing the same name.  Given the example
command line option above, the command :command:`bdist_openpkg` could be
implemented by the class ``distcmds.bdist_openpkg.bdist_openpkg`` or
``buildcmds.bdist_openpkg.bdist_openpkg``.


Adding new distribution types
=============================

Commands that create distributions (files in the :file:`dist/` directory) need
to add ``(command, filename)`` pairs to ``self.distribution.dist_files`` so that
:command:`upload` can upload it to PyPI.  The *filename* in the pair contains no
path information, only the name of the file itself.  In dry-run mode, pairs
should still be added to represent what would have been created.


doc/alt-python38-setuptools/deprecated/distutils/sourcedist.rst000064400000023015151732726220021054 0ustar00.. _source-dist:

******************************
Creating a Source Distribution
******************************

.. include:: ./_setuptools_disclaimer.rst

As shown in section :ref:`distutils-simple-example`, you use the :command:`sdist` command
to create a source distribution.  In the simplest case, ::

   python setup.py sdist

(assuming you haven't specified any :command:`sdist` options in the setup script
or config file), :command:`sdist` creates the archive of the default format for
the current platform.  The default format is a gzip'ed tar file
(:file:`.tar.gz`) on Unix, and ZIP file on Windows.

You can specify as many formats as you like using the :option:`!--formats`
option, for example::

   python setup.py sdist --formats=gztar,zip

to create a gzipped tarball and a zip file.  The available formats are:

+-----------+-------------------------+---------+
| Format    | Description             | Notes   |
+===========+=========================+=========+
| ``zip``   | zip file (:file:`.zip`) | (1),(3) |
+-----------+-------------------------+---------+
| ``gztar`` | gzip'ed tar file        | \(2)    |
|           | (:file:`.tar.gz`)       |         |
+-----------+-------------------------+---------+
| ``bztar`` | bzip2'ed tar file       |         |
|           | (:file:`.tar.bz2`)      |         |
+-----------+-------------------------+---------+
| ``xztar`` | xz'ed tar file          |         |
|           | (:file:`.tar.xz`)       |         |
+-----------+-------------------------+---------+
| ``ztar``  | compressed tar file     | \(4)    |
|           | (:file:`.tar.Z`)        |         |
+-----------+-------------------------+---------+
| ``tar``   | tar file (:file:`.tar`) |         |
+-----------+-------------------------+---------+

.. versionchanged:: 3.5
   Added support for the ``xztar`` format.

Notes:

(1)
   default on Windows

(2)
   default on Unix

(3)
   requires either external :program:`zip` utility or :mod:`zipfile` module (part
   of the standard Python library since Python 1.6)

(4)
   requires the :program:`compress` program. Notice that this format is now
   pending for deprecation and will be removed in the future versions of Python.

When using any ``tar`` format (``gztar``, ``bztar``, ``xztar``, ``ztar`` or
``tar``), under Unix you can specify the ``owner`` and ``group`` names
that will be set for each member of the archive.

For example, if you want all files of the archive to be owned by root::

    python setup.py sdist --owner=root --group=root


.. _manifest:

Specifying the files to distribute
==================================

If you don't supply an explicit list of files (or instructions on how to
generate one), the :command:`sdist` command puts a minimal default set into the
source distribution:

* all Python source files implied by the ``py_modules`` and
  ``packages`` options

* all C source files mentioned in the ``ext_modules`` or
  ``libraries`` options

  .. XXX getting C library sources currently broken---no
         :meth:`get_source_files` method in :file:`build_clib.py`!

* scripts identified by the ``scripts`` option
  See :ref:`distutils-installing-scripts`.

* anything that looks like a test script: :file:`test/test\*.py` (currently, the
  Distutils don't do anything with test scripts except include them in source
  distributions, but in the future there will be a standard for testing Python
  module distributions)

* Any of the standard README files (:file:`README`, :file:`README.txt`,
  or :file:`README.rst`), :file:`setup.py` (or whatever you called your setup
  script), and :file:`setup.cfg`.

* all files that matches the ``package_data`` metadata.
  See :ref:`distutils-installing-package-data`.

* all files that matches the ``data_files`` metadata.
  See :ref:`distutils-additional-files`.

Sometimes this is enough, but usually you will want to specify additional files
to distribute.  The typical way to do this is to write a *manifest template*,
called :file:`MANIFEST.in` by default.  The manifest template is just a list of
instructions for how to generate your manifest file, :file:`MANIFEST`, which is
the exact list of files to include in your source distribution.  The
:command:`sdist` command processes this template and generates a manifest based
on its instructions and what it finds in the filesystem.

If you prefer to roll your own manifest file, the format is simple: one filename
per line, regular files (or symlinks to them) only.  If you do supply your own
:file:`MANIFEST`, you must specify everything: the default set of files
described above does not apply in this case.

.. versionchanged:: 3.1
   An existing generated :file:`MANIFEST` will be regenerated without
   :command:`sdist` comparing its modification time to the one of
   :file:`MANIFEST.in` or :file:`setup.py`.

.. versionchanged:: 3.1.3
   :file:`MANIFEST` files start with a comment indicating they are generated.
   Files without this comment are not overwritten or removed.

.. versionchanged:: 3.2.2
   :command:`sdist` will read a :file:`MANIFEST` file if no :file:`MANIFEST.in`
   exists, like it used to do.

.. versionchanged:: 3.7
   :file:`README.rst` is now included in the list of distutils standard READMEs.


The manifest template has one command per line, where each command specifies a
set of files to include or exclude from the source distribution.  For an
example, again we turn to the Distutils' own manifest template:

.. code-block:: none

   include *.txt
   recursive-include examples *.txt *.py
   prune examples/sample?/build

The meanings should be fairly clear: include all files in the distribution root
matching :file:`\*.txt`, all files anywhere under the :file:`examples` directory
matching :file:`\*.txt` or :file:`\*.py`, and exclude all directories matching
:file:`examples/sample?/build`.  All of this is done *after* the standard
include set, so you can exclude files from the standard set with explicit
instructions in the manifest template.  (Or, you can use the
:option:`!--no-defaults` option to disable the standard set entirely.)  There are
several other commands available in the manifest template mini-language; see
section :ref:`sdist-cmd`.

The order of commands in the manifest template matters: initially, we have the
list of default files as described above, and each command in the template adds
to or removes from that list of files.  Once we have fully processed the
manifest template, we remove files that should not be included in the source
distribution:

* all files in the Distutils "build" tree (default :file:`build/`)

* all files in directories named :file:`RCS`, :file:`CVS`, :file:`.svn`,
  :file:`.hg`, :file:`.git`, :file:`.bzr` or :file:`_darcs`

Now we have our complete list of files, which is written to the manifest for
future reference, and then used to build the source distribution archive(s).

You can disable the default set of included files with the
:option:`!--no-defaults` option, and you can disable the standard exclude set
with :option:`!--no-prune`.

Following the Distutils' own manifest template, let's trace how the
:command:`sdist` command builds the list of files to include in the Distutils
source distribution:

#. include all Python source files in the :file:`distutils` and
   :file:`distutils/command` subdirectories (because packages corresponding to
   those two directories were mentioned in the ``packages`` option in the
   setup script---see section :ref:`setup-script`)

#. include :file:`README.txt`, :file:`setup.py`, and :file:`setup.cfg` (standard
   files)

#. include :file:`test/test\*.py` (standard files)

#. include :file:`\*.txt` in the distribution root (this will find
   :file:`README.txt` a second time, but such redundancies are weeded out later)

#. include anything matching :file:`\*.txt` or :file:`\*.py` in the sub-tree
   under :file:`examples`,

#. exclude all files in the sub-trees starting at directories matching
   :file:`examples/sample?/build`\ ---this may exclude files included by the
   previous two steps, so it's important that the ``prune`` command in the manifest
   template comes after the ``recursive-include`` command

#. exclude the entire :file:`build` tree, and any :file:`RCS`, :file:`CVS`,
   :file:`.svn`, :file:`.hg`, :file:`.git`, :file:`.bzr` and :file:`_darcs`
   directories

Just like in the setup script, file and directory names in the manifest template
should always be slash-separated; the Distutils will take care of converting
them to the standard representation on your platform. That way, the manifest
template is portable across operating systems.


.. _manifest-options:

Manifest-related options
========================

The normal course of operations for the :command:`sdist` command is as follows:

* if the manifest file (:file:`MANIFEST` by default) exists and the first line
  does not have a comment indicating it is generated from :file:`MANIFEST.in`,
  then it is used as is, unaltered

* if the manifest file doesn't exist or has been previously automatically
  generated, read :file:`MANIFEST.in` and create the manifest

* if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest
  with just the default file set

* use the list of files now in :file:`MANIFEST` (either just generated or read
  in) to create the source distribution archive(s)

There are a couple of options that modify this behaviour.  First, use the
:option:`!--no-defaults` and :option:`!--no-prune` to disable the standard
"include" and "exclude" sets.

Second, you might just want to (re)generate the manifest, but not create a source
distribution::

   python setup.py sdist --manifest-only

:option:`!-o` is a shortcut for :option:`!--manifest-only`.
doc/alt-python38-setuptools/deprecated/distutils/examples.rst000064400000024240151732726220020507 0ustar00.. _distutils_examples:

******************
Distutils Examples
******************

.. include:: ./_setuptools_disclaimer.rst

This chapter provides a number of basic examples to help get started with
distutils.  Additional information about using distutils can be found in the
Distutils Cookbook.


.. seealso::

   `Distutils Cookbook <https://wiki.python.org/moin/Distutils/Cookbook>`_
      Collection of recipes showing how to achieve more control over distutils.


.. _pure-mod:

Pure Python distribution (by module)
====================================

If you're just distributing a couple of modules, especially if they don't live
in a particular package, you can specify them individually using the
``py_modules`` option in the setup script.

In the simplest case, you'll have two files to worry about: a setup script and
the single module you're distributing, :file:`foo.py` in this example::

   <root>/
           setup.py
           foo.py

(In all diagrams in this section, *<root>* will refer to the distribution root
directory.)  A minimal setup script to describe this situation would be::

   from distutils.core import setup
   setup(name='foo',
         version='1.0',
         py_modules=['foo'],
         )

Note that the name of the distribution is specified independently with the
``name`` option, and there's no rule that says it has to be the same as
the name of the sole module in the distribution (although that's probably a good
convention to follow).  However, the distribution name is used to generate
filenames, so you should stick to letters, digits, underscores, and hyphens.

Since ``py_modules`` is a list, you can of course specify multiple
modules, eg. if you're distributing modules ``foo`` and ``bar``, your
setup might look like this::

   <root>/
           setup.py
           foo.py
           bar.py

and the setup script might be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         py_modules=['foo', 'bar'],
         )

You can put module source files into another directory, but if you have enough
modules to do that, it's probably easier to specify modules by package rather
than listing them individually.


.. _pure-pkg:

Pure Python distribution (by package)
=====================================

If you have more than a couple of modules to distribute, especially if they are
in multiple packages, it's probably easier to specify whole packages rather than
individual modules.  This works even if your modules are not in a package; you
can just tell the Distutils to process modules from the root package, and that
works the same as any other package (except that you don't have to have an
:file:`__init__.py` file).

The setup script from the last example could also be written as  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=[''],
         )

(The empty string stands for the root package.)

If those two files are moved into a subdirectory, but remain in the root
package, e.g.::

   <root>/
           setup.py
           src/      foo.py
                     bar.py

then you would still specify the root package, but you have to tell the
Distutils where source files in the root package live::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'': 'src'},
         packages=[''],
         )

More typically, though, you will want to distribute multiple modules in the same
package (or in sub-packages).  For example, if the ``foo``  and ``bar``
modules belong in package ``foobar``, one way to layout your source tree is
::

   <root>/
           setup.py
           foobar/
                    __init__.py
                    foo.py
                    bar.py

This is in fact the default layout expected by the Distutils, and the one that
requires the least work to describe in your setup script::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=['foobar'],
         )

If you want to put modules in directories not named for their package, then you
need to use the ``package_dir`` option again.  For example, if the
:file:`src` directory holds modules in the ``foobar`` package::

   <root>/
           setup.py
           src/
                    __init__.py
                    foo.py
                    bar.py

an appropriate setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'foobar': 'src'},
         packages=['foobar'],
         )

Or, you might put modules from your main package right in the distribution
root::

   <root>/
           setup.py
           __init__.py
           foo.py
           bar.py

in which case your setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'foobar': ''},
         packages=['foobar'],
         )

(The empty string also stands for the current directory.)

If you have sub-packages, they must be explicitly listed in ``packages``,
but any entries in ``package_dir`` automatically extend to sub-packages.
(In other words, the Distutils does *not* scan your source tree, trying to
figure out which directories correspond to Python packages by looking for
:file:`__init__.py` files.)  Thus, if the default layout grows a sub-package::

   <root>/
           setup.py
           foobar/
                    __init__.py
                    foo.py
                    bar.py
                    subfoo/
                              __init__.py
                              blah.py

then the corresponding setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=['foobar', 'foobar.subfoo'],
         )


.. _single-ext:

Single extension module
=======================

Extension modules are specified using the ``ext_modules`` option.
``package_dir`` has no effect on where extension source files are found;
it only affects the source for pure Python modules.  The simplest  case, a
single extension module in a single C source file, is::

   <root>/
           setup.py
           foo.c

If the ``foo`` extension belongs in the root package, the setup script for
this could be  ::

   from distutils.core import setup
   from distutils.extension import Extension
   setup(name='foobar',
         version='1.0',
         ext_modules=[Extension('foo', ['foo.c'])],
         )

If the extension actually belongs in a package, say ``foopkg``, then

With exactly the same source tree layout, this extension can be put in the
``foopkg`` package simply by changing the name of the extension::

   from distutils.core import setup
   from distutils.extension import Extension
   setup(name='foobar',
         version='1.0',
         ext_modules=[Extension('foopkg.foo', ['foo.c'])],
         )

Checking a package
==================

The ``check`` command allows you to verify if your package meta-data
meet the minimum requirements to build a distribution.

To run it, just call it using your :file:`setup.py` script. If something is
missing, ``check`` will display a warning.

Let's take an example with a simple script::

    from distutils.core import setup

    setup(name='foobar')

Running the ``check`` command will display some warnings:

.. code-block:: shell-session

    $ python setup.py check
    running check
    warning: check: missing required meta-data: version, url
    warning: check: missing meta-data: either (author and author_email) or
             (maintainer and maintainer_email) should be supplied


If you use the reStructuredText syntax in the ``long_description`` field and
`docutils`_  is installed you can check if the syntax is fine with the
``check`` command, using the ``restructuredtext`` option.

For example, if the :file:`setup.py` script is changed like this::

    from distutils.core import setup

    desc = """\
    My description
    ==============

    This is the description of the ``foobar`` package.
    """

    setup(name='foobar', version='1', author='tarek',
        author_email='tarek@ziade.org',
        url='http://example.com', long_description=desc)

Where the long description is broken, ``check`` will be able to detect it
by using the :mod:`docutils` parser:

.. code-block:: shell-session

    $ python setup.py check --restructuredtext
    running check
    warning: check: Title underline too short. (line 2)
    warning: check: Could not finish the parsing.

Reading the metadata
=====================

The :func:`distutils.core.setup` function provides a command-line interface
that allows you to query the metadata fields of a project through the
``setup.py`` script of a given project:

.. code-block:: shell-session

    $ python setup.py --name
    distribute

This call reads the ``name`` metadata by running the
:func:`distutils.core.setup`  function. Although, when a source or binary
distribution is created with Distutils, the metadata fields are written
in a static file called :file:`PKG-INFO`. When a Distutils-based project is
installed in Python, the :file:`PKG-INFO` file is copied alongside the modules
and packages of the distribution under :file:`NAME-VERSION-pyX.X.egg-info`,
where ``NAME`` is the name of the project, ``VERSION`` its version as defined
in the Metadata, and ``pyX.X`` the major and minor version of Python like
``2.7`` or ``3.2``.

You can read back this static file, by using the
:class:`distutils.dist.DistributionMetadata` class and its
:func:`~distutils.dist.DistributionMetadata.read_pkg_file` method::

    >>> from distutils.dist import DistributionMetadata
    >>> metadata = DistributionMetadata()
    >>> metadata.read_pkg_file(open('distribute-0.6.8-py2.7.egg-info'))
    >>> metadata.name
    'distribute'
    >>> metadata.version
    '0.6.8'
    >>> metadata.description
    'Easily download, build, install, upgrade, and uninstall Python packages'

Notice that the class can also be instantiated with a metadata file path to
loads its values::

    >>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info'
    >>> DistributionMetadata(pkg_info_path).name
    'distribute'


.. % \section{Multiple extension modules}
.. % \label{multiple-ext}

.. % \section{Putting it all together}


.. _docutils: http://docutils.sourceforge.net
doc/alt-python38-setuptools/deprecated/distutils/setupscript.rst000064400000075204151732726220021264 0ustar00.. _setup-script:

************************
Writing the Setup Script
************************

.. include:: ./_setuptools_disclaimer.rst

The setup script is the centre of all activity in building, distributing, and
installing modules using the Distutils.  The main purpose of the setup script is
to describe your module distribution to the Distutils, so that the various
commands that operate on your modules do the right thing.  As we saw in section
:ref:`distutils-simple-example` above, the setup script consists mainly of a call to :func:`~distutils.core.setup`, and most information
supplied to the Distutils by the module developer is supplied as keyword
arguments to :func:`~distutils.core.setup`.

Here's a slightly more involved example, which we'll follow for the next couple
of sections: the Distutils' own setup script.  (Keep in mind that although the
Distutils are included with Python 1.6 and later, they also have an independent
existence so that Python 1.5.2 users can use them to install other module
distributions.  The Distutils' own setup script, shown here, is used to install
the package into Python 1.5.2.) ::

    #!/usr/bin/env python

    from distutils.core import setup

    setup(name='Distutils',
          version='1.0',
          description='Python Distribution Utilities',
          author='Greg Ward',
          author_email='gward@python.net',
          url='https://www.python.org/sigs/distutils-sig/',
          packages=['distutils', 'distutils.command'],
         )

There are only two differences between this and the trivial one-file
distribution presented in section :ref:`distutils-simple-example`: more metadata, and the
specification of pure Python modules by package, rather than by module.  This is
important since the Distutils consist of a couple of dozen modules split into
(so far) two packages; an explicit list of every module would be tedious to
generate and difficult to maintain.  For more information on the additional
meta-data, see section :ref:`meta-data`.

Note that any pathnames (files or directories) supplied in the setup script
should be written using the Unix convention, i.e. slash-separated.  The
Distutils will take care of converting this platform-neutral representation into
whatever is appropriate on your current platform before actually using the
pathname.  This makes your setup script portable across operating systems, which
of course is one of the major goals of the Distutils.  In this spirit, all
pathnames in this document are slash-separated.

This, of course, only applies to pathnames given to Distutils functions.  If
you, for example, use standard Python functions such as :func:`glob.glob` or
:func:`os.listdir` to specify files, you should be careful to write portable
code instead of hardcoding path separators::

    glob.glob(os.path.join('mydir', 'subdir', '*.html'))
    os.listdir(os.path.join('mydir', 'subdir'))


.. _listing-packages:

Listing whole packages
======================

The ``packages`` option tells the Distutils to process (build, distribute,
install, etc.) all pure Python modules found in each package mentioned in the
``packages`` list.  In order to do this, of course, there has to be a
correspondence between package names and directories in the filesystem.  The
default correspondence is the most obvious one, i.e. package :mod:`distutils` is
found in the directory :file:`distutils` relative to the distribution root.
Thus, when you say ``packages = ['foo']`` in your setup script, you are
promising that the Distutils will find a file :file:`foo/__init__.py` (which
might be spelled differently on your system, but you get the idea) relative to
the directory where your setup script lives.  If you break this promise, the
Distutils will issue a warning but still process the broken package anyway.

If you use a different convention to lay out your source directory, that's no
problem: you just have to supply the ``package_dir`` option to tell the
Distutils about your convention.  For example, say you keep all Python source
under :file:`lib`, so that modules in the "root package" (i.e., not in any
package at all) are in :file:`lib`, modules in the ``foo`` package are in
:file:`lib/foo`, and so forth.  Then you would put ::

    package_dir = {'': 'lib'}

in your setup script.  The keys to this dictionary are package names, and an
empty package name stands for the root package.  The values are directory names
relative to your distribution root.  In this case, when you say ``packages =
['foo']``, you are promising that the file :file:`lib/foo/__init__.py` exists.

Another possible convention is to put the ``foo`` package right in
:file:`lib`, the ``foo.bar`` package in :file:`lib/bar`, etc.  This would be
written in the setup script as ::

    package_dir = {'foo': 'lib'}

A ``package: dir`` entry in the ``package_dir`` dictionary implicitly
applies to all packages below *package*, so the ``foo.bar`` case is
automatically handled here.  In this example, having ``packages = ['foo',
'foo.bar']`` tells the Distutils to look for :file:`lib/__init__.py` and
:file:`lib/bar/__init__.py`.  (Keep in mind that although ``package_dir``
applies recursively, you must explicitly list all packages in
``packages``: the Distutils will *not* recursively scan your source tree
looking for any directory with an :file:`__init__.py` file.)


.. _listing-modules:

Listing individual modules
==========================

For a small module distribution, you might prefer to list all modules rather
than listing packages---especially the case of a single module that goes in the
"root package" (i.e., no package at all).  This simplest case was shown in
section :ref:`distutils-simple-example`; here is a slightly more involved example::

    py_modules = ['mod1', 'pkg.mod2']

This describes two modules, one of them in the "root" package, the other in the
``pkg`` package.  Again, the default package/directory layout implies that
these two modules can be found in :file:`mod1.py` and :file:`pkg/mod2.py`, and
that :file:`pkg/__init__.py` exists as well. And again, you can override the
package/directory correspondence using the ``package_dir`` option.


.. _describing-extensions:

Describing extension modules
============================

Just as writing Python extension modules is a bit more complicated than writing
pure Python modules, describing them to the Distutils is a bit more complicated.
Unlike pure modules, it's not enough just to list modules or packages and expect
the Distutils to go out and find the right files; you have to specify the
extension name, source file(s), and any compile/link requirements (include
directories, libraries to link with, etc.).

.. XXX read over this section

All of this is done through another keyword argument to
:func:`~distutils.core.setup`, the
``ext_modules`` option.  ``ext_modules`` is just a list of
:class:`~distutils.core.Extension` instances, each of which describes a
single extension module.
Suppose your distribution includes a single extension, called ``foo`` and
implemented by :file:`foo.c`.  If no additional instructions to the
compiler/linker are needed, describing this extension is quite simple::

    Extension('foo', ['foo.c'])

The :class:`~distutils.extension.Extension` class can be imported from :mod:`distutils.core` along
with :func:`~distutils.core.setup`.  Thus, the setup script for a module distribution that
contains only this one extension and nothing else might be::

    from distutils.core import setup, Extension
    setup(name='foo',
          version='1.0',
          ext_modules=[Extension('foo', ['foo.c'])],
          )

The :class:`~distutils.extension.Extension` class (actually, the underlying extension-building
machinery implemented by the :command:`build_ext` command) supports a great deal
of flexibility in describing Python extensions, which is explained in the
following sections.


Extension names and packages
----------------------------

The first argument to the :class:`~distutils.core.Extension` constructor is
always the name of the extension, including any package names.  For example, ::

    Extension('foo', ['src/foo1.c', 'src/foo2.c'])

describes an extension that lives in the root package, while ::

    Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])

describes the same extension in the ``pkg`` package.  The source files and
resulting object code are identical in both cases; the only difference is where
in the filesystem (and therefore where in Python's namespace hierarchy) the
resulting extension lives.

If you have a number of extensions all in the same package (or all under the
same base package), use the ``ext_package`` keyword argument to
:func:`~distutils.core.setup`.  For example, ::

    setup(...,
          ext_package='pkg',
          ext_modules=[Extension('foo', ['foo.c']),
                       Extension('subpkg.bar', ['bar.c'])],
         )

will compile :file:`foo.c` to the extension ``pkg.foo``, and
:file:`bar.c` to ``pkg.subpkg.bar``.


Extension source files
----------------------

The second argument to the :class:`~distutils.core.Extension` constructor is
a list of source
files.  Since the Distutils currently only support C, C++, and Objective-C
extensions, these are normally C/C++/Objective-C source files.  (Be sure to use
appropriate extensions to distinguish C++ source files: :file:`.cc` and
:file:`.cpp` seem to be recognized by both Unix and Windows compilers.)

However, you can also include SWIG interface (:file:`.i`) files in the list; the
:command:`build_ext` command knows how to deal with SWIG extensions: it will run
SWIG on the interface file and compile the resulting C/C++ file into your
extension.

.. XXX SWIG support is rough around the edges and largely untested!

This warning notwithstanding, options to SWIG can be currently passed like
this::

    setup(...,
          ext_modules=[Extension('_foo', ['foo.i'],
                                 swig_opts=['-modern', '-I../include'])],
          py_modules=['foo'],
         )

Or on the commandline like this::

    > python setup.py build_ext --swig-opts="-modern -I../include"

On some platforms, you can include non-source files that are processed by the
compiler and included in your extension.  Currently, this just means Windows
message text (:file:`.mc`) files and resource definition (:file:`.rc`) files for
Visual C++. These will be compiled to binary resource (:file:`.res`) files and
linked into the executable.


Preprocessor options
--------------------

Three optional arguments to :class:`~distutils.core.Extension` will help if
you need to specify include directories to search or preprocessor macros to
define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``.

For example, if your extension requires header files in the :file:`include`
directory under your distribution root, use the ``include_dirs`` option::

    Extension('foo', ['foo.c'], include_dirs=['include'])

You can specify absolute directories there; if you know that your extension will
only be built on Unix systems with X11R6 installed to :file:`/usr`, you can get
away with ::

    Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])

You should avoid this sort of non-portable usage if you plan to distribute your
code: it's probably better to write C code like  ::

    #include <X11/Xlib.h>

If you need to include header files from some other Python extension, you can
take advantage of the fact that header files are installed in a consistent way
by the Distutils :command:`install_headers` command.  For example, the Numerical
Python header files are installed (on a standard Unix installation) to
:file:`/usr/local/include/python1.5/Numerical`. (The exact location will differ
according to your platform and Python installation.)  Since the Python include
directory---\ :file:`/usr/local/include/python1.5` in this case---is always
included in the search path when building Python extensions, the best approach
is to write C code like  ::

    #include <Numerical/arrayobject.h>

If you must put the :file:`Numerical` include directory right into your header
search path, though, you can find that directory using the Distutils
:mod:`distutils.sysconfig` module::

    from distutils.sysconfig import get_python_inc
    incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical')
    setup(...,
          Extension(..., include_dirs=[incdir]),
          )

Even though this is quite portable---it will work on any Python installation,
regardless of platform---it's probably easier to just write your C code in the
sensible way.

You can define and undefine pre-processor macros with the ``define_macros`` and
``undef_macros`` options. ``define_macros`` takes a list of ``(name, value)``
tuples, where ``name`` is the name of the macro to define (a string) and
``value`` is its value: either a string or ``None``.  (Defining a macro ``FOO``
to ``None`` is the equivalent of a bare ``#define FOO`` in your C source: with
most compilers, this sets ``FOO`` to the string ``1``.)  ``undef_macros`` is
just a list of macros to undefine.

For example::

    Extension(...,
              define_macros=[('NDEBUG', '1'),
                             ('HAVE_STRFTIME', None)],
              undef_macros=['HAVE_FOO', 'HAVE_BAR'])

is the equivalent of having this at the top of every C source file::

    #define NDEBUG 1
    #define HAVE_STRFTIME
    #undef HAVE_FOO
    #undef HAVE_BAR


Library options
---------------

You can also specify the libraries to link against when building your extension,
and the directories to search for those libraries.  The ``libraries`` option is
a list of libraries to link against, ``library_dirs`` is a list of directories
to search for libraries at  link-time, and ``runtime_library_dirs`` is a list of
directories to  search for shared (dynamically loaded) libraries at run-time.

For example, if you need to link against libraries known to be in the standard
library search path on target systems ::

    Extension(...,
              libraries=['gdbm', 'readline'])

If you need to link with libraries in a non-standard location, you'll have to
include the location in ``library_dirs``::

    Extension(...,
              library_dirs=['/usr/X11R6/lib'],
              libraries=['X11', 'Xt'])

(Again, this sort of non-portable construct should be avoided if you intend to
distribute your code.)

.. XXX Should mention clib libraries here or somewhere else!


Other options
-------------

There are still some other options which can be used to handle special cases.

The ``optional`` option is a boolean; if it is true,
a build failure in the extension will not abort the build process, but
instead simply not install the failing extension.

The ``extra_objects`` option is a list of object files to be passed to the
linker. These files must not have extensions, as the default extension for the
compiler is used.

``extra_compile_args`` and ``extra_link_args`` can be used to
specify additional command line options for the respective compiler and linker
command lines.

``export_symbols`` is only useful on Windows.  It can contain a list of
symbols (functions or variables) to be exported. This option is not needed when
building compiled extensions: Distutils  will automatically add ``initmodule``
to the list of exported symbols.

The ``depends`` option is a list of files that the extension depends on
(for example header files). The build command will call the compiler on the
sources to rebuild extension if any on this files has been modified since the
previous build.

Relationships between Distributions and Packages
================================================

A distribution may relate to packages in three specific ways:

#. It can require packages or modules.

#. It can provide packages or modules.

#. It can obsolete packages or modules.

These relationships can be specified using keyword arguments to the
:func:`distutils.core.setup` function.

Dependencies on other Python modules and packages can be specified by supplying
the *requires* keyword argument to :func:`~distutils.core.setup`. The
value must be a list of
strings.  Each string specifies a package that is required, and optionally what
versions are sufficient.

To specify that any version of a module or package is required, the string
should consist entirely of the module or package name. Examples include
``'mymodule'`` and ``'xml.parsers.expat'``.

If specific versions are required, a sequence of qualifiers can be supplied in
parentheses.  Each qualifier may consist of a comparison operator and a version
number.  The accepted comparison operators are::

    <    >    ==
    <=   >=   !=

These can be combined by using multiple qualifiers separated by commas (and
optional whitespace).  In this case, all of the qualifiers must be matched; a
logical AND is used to combine the evaluations.

Let's look at a bunch of examples:

+-------------------------+----------------------------------------------+
| Requires Expression     | Explanation                                  |
+=========================+==============================================+
| ``==1.0``               | Only version ``1.0`` is compatible           |
+-------------------------+----------------------------------------------+
| ``>1.0, !=1.5.1, <2.0`` | Any version after ``1.0`` and before ``2.0`` |
|                         | is compatible, except ``1.5.1``              |
+-------------------------+----------------------------------------------+

Now that we can specify dependencies, we also need to be able to specify what we
provide that other distributions can require.  This is done using the *provides*
keyword argument to :func:`~distutils.core.setup`. The value for this keyword is a list of
strings, each of which names a Python module or package, and optionally
identifies the version.  If the version is not specified, it is assumed to match
that of the distribution.

Some examples:

+---------------------+----------------------------------------------+
| Provides Expression | Explanation                                  |
+=====================+==============================================+
| ``mypkg``           | Provide ``mypkg``, using the distribution    |
|                     | version                                      |
+---------------------+----------------------------------------------+
| ``mypkg (1.1)``     | Provide ``mypkg`` version 1.1, regardless of |
|                     | the distribution version                     |
+---------------------+----------------------------------------------+

A package can declare that it obsoletes other packages using the *obsoletes*
keyword argument.  The value for this is similar to that of the *requires*
keyword: a list of strings giving module or package specifiers.  Each specifier
consists of a module or package name optionally followed by one or more version
qualifiers.  Version qualifiers are given in parentheses after the module or
package name.

The versions identified by the qualifiers are those that are obsoleted by the
distribution being described.  If no qualifiers are given, all versions of the
named module or package are understood to be obsoleted.

.. _distutils-installing-scripts:

Installing Scripts
==================

So far we have been dealing with pure and non-pure Python modules, which are
usually not run by themselves but imported by scripts.

Scripts are files containing Python source code, intended to be started from the
command line.  Scripts don't require Distutils to do anything very complicated.
The only clever feature is that if the first line of the script starts with
``#!`` and contains the word "python", the Distutils will adjust the first line
to refer to the current interpreter location. By default, it is replaced with
the current interpreter location.  The :option:`!--executable` (or :option:`!-e`)
option will allow the interpreter path to be explicitly overridden.

The ``scripts`` option simply is a list of files to be handled in this
way.  From the PyXML setup script::

    setup(...,
          scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
          )

.. versionchanged:: 3.1
   All the scripts will also be added to the ``MANIFEST`` file if no template is
   provided.  See :ref:`manifest`.


.. _distutils-installing-package-data:

Installing Package Data
=======================

Often, additional files need to be installed into a package.  These files are
often data that's closely related to the package's implementation, or text files
containing documentation that might be of interest to programmers using the
package.  These files are called :dfn:`package data`.

Package data can be added to packages using the ``package_data`` keyword
argument to the :func:`~distutils.core.setup` function.  The value must be a mapping from
package name to a list of relative path names that should be copied into the
package.  The paths are interpreted as relative to the directory containing the
package (information from the ``package_dir`` mapping is used if appropriate);
that is, the files are expected to be part of the package in the source
directories. They may contain glob patterns as well.

The path names may contain directory portions; any necessary directories will be
created in the installation.

For example, if a package should contain a subdirectory with several data files,
the files can be arranged like this in the source tree::

    setup.py
    src/
        mypkg/
            __init__.py
            module.py
            data/
                tables.dat
                spoons.dat
                forks.dat

The corresponding call to :func:`~distutils.core.setup` might be::

    setup(...,
          packages=['mypkg'],
          package_dir={'mypkg': 'src/mypkg'},
          package_data={'mypkg': ['data/*.dat']},
          )


.. versionchanged:: 3.1
   All the files that match ``package_data`` will be added to the ``MANIFEST``
   file if no template is provided.  See :ref:`manifest`.


.. _distutils-additional-files:

Installing Additional Files
===========================

The ``data_files`` option can be used to specify additional files needed
by the module distribution: configuration files, message catalogs, data files,
anything which doesn't fit in the previous categories.

``data_files`` specifies a sequence of (*directory*, *files*) pairs in the
following way::

    setup(...,
          data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                      ('config', ['cfg/data.cfg'])],
         )

Each (*directory*, *files*) pair in the sequence specifies the installation
directory and the files to install there.

Each file name in *files* is interpreted relative to the :file:`setup.py`
script at the top of the package source distribution. Note that you can
specify the directory where the data files will be installed, but you cannot
rename the data files themselves.

The *directory* should be a relative path. It is interpreted relative to the
installation prefix (Python's ``sys.prefix`` for system installations;
``site.USER_BASE`` for user installations). Distutils allows *directory* to be
an absolute installation path, but this is discouraged since it is
incompatible with the wheel packaging format. No directory information from
*files* is used to determine the final location of the installed file; only
the name of the file is used.

You can specify the ``data_files`` options as a simple sequence of files
without specifying a target directory, but this is not recommended, and the
:command:`install` command will print a warning in this case. To install data
files directly in the target directory, an empty string should be given as the
directory.

.. versionchanged:: 3.1
   All the files that match ``data_files`` will be added to the ``MANIFEST``
   file if no template is provided.  See :ref:`manifest`.


.. _meta-data:

Additional meta-data
====================

The setup script may include additional meta-data beyond the name and version.
This information includes:

+----------------------+---------------------------+-----------------+--------+
| Meta-Data            | Description               | Value           | Notes  |
+======================+===========================+=================+========+
| ``name``             | name of the package       | short string    | \(1)   |
+----------------------+---------------------------+-----------------+--------+
| ``version``          | version of this release   | short string    | (1)(2) |
+----------------------+---------------------------+-----------------+--------+
| ``author``           | package author's name     | short string    | \(3)   |
+----------------------+---------------------------+-----------------+--------+
| ``author_email``     | email address of the      | email address   | \(3)   |
|                      | package author            |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``maintainer``       | package maintainer's name | short string    | \(3)   |
+----------------------+---------------------------+-----------------+--------+
| ``maintainer_email`` | email address of the      | email address   | \(3)   |
|                      | package maintainer        |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``url``              | home page for the package | URL             | \(1)   |
+----------------------+---------------------------+-----------------+--------+
| ``description``      | short, summary            | short string    |        |
|                      | description of the        |                 |        |
|                      | package                   |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``long_description`` | longer description of the | long string     | \(4)   |
|                      | package                   |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``download_url``     | location where the        | URL             |        |
|                      | package may be downloaded |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``classifiers``      | a list of classifiers     | list of strings | (6)(7) |
+----------------------+---------------------------+-----------------+--------+
| ``platforms``        | a list of platforms       | list of strings | (6)(8) |
+----------------------+---------------------------+-----------------+--------+
| ``keywords``         | a list of keywords        | list of strings | (6)(8) |
+----------------------+---------------------------+-----------------+--------+
| ``license``          | license for the package   | short string    | \(5)   |
+----------------------+---------------------------+-----------------+--------+

Notes:

(1)
    These fields are required.

(2)
    It is recommended that versions take the form *major.minor[.patch[.sub]]*.

(3)
    Either the author or the maintainer must be identified. If maintainer is
    provided, distutils lists it as the author in :file:`PKG-INFO`.

(4)
    The ``long_description`` field is used by PyPI when you publish a package,
    to build its project page.

(5)
    The ``license`` field is a text indicating the license covering the
    package where the license is not a selection from the "License" Trove
    classifiers. See the ``Classifier`` field. Notice that
    there's a ``licence`` distribution option which is deprecated but still
    acts as an alias for ``license``.

(6)
    This field must be a list.

(7)
    The valid classifiers are listed on
    `PyPI <https://pypi.org/classifiers>`_.

(8)
    To preserve backward compatibility, this field also accepts a string. If
    you pass a comma-separated string ``'foo, bar'``, it will be converted to
    ``['foo', 'bar']``, Otherwise, it will be converted to a list of one
    string.

'short string'
    A single line of text, not more than 200 characters.

'long string'
    Multiple lines of plain text in reStructuredText format (see
    http://docutils.sourceforge.net/).

'list of strings'
    See below.

Encoding the version information is an art in itself. Python packages generally
adhere to the version format *major.minor[.patch][sub]*. The major number is 0
for initial, experimental releases of software. It is incremented for releases
that represent major milestones in a package. The minor number is incremented
when important new features are added to the package. The patch number
increments when bug-fix releases are made. Additional trailing version
information is sometimes used to indicate sub-releases.  These are
"a1,a2,...,aN" (for alpha releases, where functionality and API may change),
"b1,b2,...,bN" (for beta releases, which only fix bugs) and "pr1,pr2,...,prN"
(for final pre-release release testing). Some examples:

0.1.0
    the first, experimental release of a package

1.0.1a2
    the second alpha release of the first patch version of 1.0

``classifiers`` must be specified in a list::

    setup(...,
          classifiers=[
              'Development Status :: 4 - Beta',
              'Environment :: Console',
              'Environment :: Web Environment',
              'Intended Audience :: End Users/Desktop',
              'Intended Audience :: Developers',
              'Intended Audience :: System Administrators',
              'License :: OSI Approved :: Python Software Foundation License',
              'Operating System :: MacOS :: MacOS X',
              'Operating System :: Microsoft :: Windows',
              'Operating System :: POSIX',
              'Programming Language :: Python',
              'Topic :: Communications :: Email',
              'Topic :: Office/Business',
              'Topic :: Software Development :: Bug Tracking',
              ],
          )

.. versionchanged:: 3.7
   :class:`~distutils.core.setup` now warns when ``classifiers``, ``keywords``
   or ``platforms`` fields are not specified as a list or a string.

.. _debug-setup-script:

Debugging the setup script
==========================

Sometimes things go wrong, and the setup script doesn't do what the developer
wants.

Distutils catches any exceptions when running the setup script, and print a
simple error message before the script is terminated.  The motivation for this
behaviour is to not confuse administrators who don't know much about Python and
are trying to install a package.  If they get a big long traceback from deep
inside the guts of Distutils, they may think the package or the Python
installation is broken because they don't read all the way down to the bottom
and see that it's a permission problem.

On the other hand, this doesn't help the developer to find the cause of the
failure. For this purpose, the :envvar:`DISTUTILS_DEBUG` environment variable can be set
to anything except an empty string, and distutils will now print detailed
information about what it is doing, dump the full traceback when an exception
occurs, and print the whole command line when an external program (like a C
compiler) fails.
doc/alt-python38-setuptools/deprecated/distutils/commandref.rst000064400000011035151732726220021002 0ustar00.. _reference:

*****************
Command Reference
*****************

.. include:: ./_setuptools_disclaimer.rst

.. % \section{Building modules: the \protect\command{build} command family}
.. % \label{build-cmds}
.. % \subsubsection{\protect\command{build}}
.. % \label{build-cmd}
.. % \subsubsection{\protect\command{build\_py}}
.. % \label{build-py-cmd}
.. % \subsubsection{\protect\command{build\_ext}}
.. % \label{build-ext-cmd}
.. % \subsubsection{\protect\command{build\_clib}}
.. % \label{build-clib-cmd}


.. _install-cmd:

Installing modules: the :command:`install` command family
=========================================================

The install command ensures that the build commands have been run and then runs
the subcommands :command:`install_lib`, :command:`install_data` and
:command:`install_scripts`.

.. % \subsubsection{\protect\command{install\_lib}}
.. % \label{install-lib-cmd}


.. _install-data-cmd:

:command:`install_data`
-----------------------

This command installs all data files provided with the distribution.


.. _install-scripts-cmd:

:command:`install_scripts`
--------------------------

This command installs all (Python) scripts in the distribution.

.. % \subsection{Cleaning up: the \protect\command{clean} command}
.. % \label{clean-cmd}


.. _sdist-cmd:

Creating a source distribution: the :command:`sdist` command
============================================================

.. XXX fragment moved down from above: needs context!

The manifest template commands are:

+-------------------------------------------+-----------------------------------------------+
| Command                                   | Description                                   |
+===========================================+===============================================+
| :command:`include pat1 pat2 ...`          | include all files matching any of the listed  |
|                                           | patterns                                      |
+-------------------------------------------+-----------------------------------------------+
| :command:`exclude pat1 pat2 ...`          | exclude all files matching any of the listed  |
|                                           | patterns                                      |
+-------------------------------------------+-----------------------------------------------+
| :command:`recursive-include dir pat1 pat2 | include all files under *dir* matching any of |
| ...`                                      | the listed patterns                           |
+-------------------------------------------+-----------------------------------------------+
| :command:`recursive-exclude dir pat1 pat2 | exclude all files under *dir* matching any of |
| ...`                                      | the listed patterns                           |
+-------------------------------------------+-----------------------------------------------+
| :command:`global-include pat1 pat2 ...`   | include all files anywhere in the source tree |
|                                           | matching --- & any of the listed patterns     |
+-------------------------------------------+-----------------------------------------------+
| :command:`global-exclude pat1 pat2 ...`   | exclude all files anywhere in the source tree |
|                                           | matching --- & any of the listed patterns     |
+-------------------------------------------+-----------------------------------------------+
| :command:`prune dir`                      | exclude all files under *dir*                 |
+-------------------------------------------+-----------------------------------------------+
| :command:`graft dir`                      | include all files under *dir*                 |
+-------------------------------------------+-----------------------------------------------+

The patterns here are Unix-style "glob" patterns: ``*`` matches any sequence of
regular filename characters, ``?`` matches any single regular filename
character, and ``[range]`` matches any of the characters in *range* (e.g.,
``a-z``, ``a-zA-Z``, ``a-f0-9_.``).  The definition of "regular filename
character" is platform-specific: on Unix it is anything except slash; on Windows
anything except backslash or colon.

.. XXX Windows support not there yet

.. % \section{Creating a built distribution: the
.. % \protect\command{bdist} command family}
.. % \label{bdist-cmds}

.. % \subsection{\protect\command{bdist}}
.. % \subsection{\protect\command{bdist\_dumb}}
.. % \subsection{\protect\command{bdist\_rpm}}
.. % \subsection{\protect\command{bdist\_wininst}}


doc/alt-python38-setuptools/deprecated/distutils/builtdist.rst000064400000055021151732726220020675 0ustar00.. _built-dist:

****************************
Creating Built Distributions
****************************

.. include:: ./_setuptools_disclaimer.rst

A "built distribution" is what you're probably used to thinking of either as a
"binary package" or an "installer" (depending on your background).  It's not
necessarily binary, though, because it might contain only Python source code
and/or byte-code; and we don't call it a package, because that word is already
spoken for in Python.  (And "installer" is a term specific to the world of
mainstream desktop systems.)

A built distribution is how you make life as easy as possible for installers of
your module distribution: for users of RPM-based Linux systems, it's a binary
RPM; for Windows users, it's an executable installer; for Debian-based Linux
users, it's a Debian package; and so forth.  Obviously, no one person will be
able to create built distributions for every platform under the sun, so the
Distutils are designed to enable module developers to concentrate on their
specialty---writing code and creating source distributions---while an
intermediary species called *packagers* springs up to turn source distributions
into built distributions for as many platforms as there are packagers.

Of course, the module developer could be their own packager; or the packager could
be a volunteer "out there" somewhere who has access to a platform which the
original developer does not; or it could be software periodically grabbing new
source distributions and turning them into built distributions for as many
platforms as the software has access to.  Regardless of who they are, a packager
uses the setup script and the :command:`bdist` command family to generate built
distributions.

As a simple example, if I run the following command in the Distutils source
tree::

   python setup.py bdist

then the Distutils builds my module distribution (the Distutils itself in this
case), does a "fake" installation (also in the :file:`build` directory), and
creates the default type of built distribution for my platform.  The default
format for built distributions is a "dumb" tar file on Unix, and a simple
executable installer on Windows.  (That tar file is considered "dumb" because it
has to be unpacked in a specific location to work.)

Thus, the above command on a Unix system creates
:file:`Distutils-1.0.{plat}.tar.gz`; unpacking this tarball from the right place
installs the Distutils just as though you had downloaded the source distribution
and run ``python setup.py install``.  (The "right place" is either the root of
the filesystem or  Python's :file:`{prefix}` directory, depending on the options
given to the :command:`bdist_dumb` command; the default is to make dumb
distributions relative to :file:`{prefix}`.)

Obviously, for pure Python distributions, this isn't any simpler than just
running ``python setup.py install``\ ---but for non-pure distributions, which
include extensions that would need to be compiled, it can mean the difference
between someone being able to use your extensions or not.  And creating "smart"
built distributions, such as an RPM package or an executable installer for
Windows, is far more convenient for users even if your distribution doesn't
include any extensions.

The :command:`bdist` command has a :option:`!--formats` option, similar to the
:command:`sdist` command, which you can use to select the types of built
distribution to generate: for example, ::

   python setup.py bdist --format=zip

would, when run on a Unix system, create
:file:`Distutils-1.0.{plat}.zip`\ ---again, this archive would be unpacked
from the root directory to install the Distutils.

The available formats for built distributions are:

+-------------+------------------------------+---------+
| Format      | Description                  | Notes   |
+=============+==============================+=========+
| ``gztar``   | gzipped tar file             | \(1)    |
|             | (:file:`.tar.gz`)            |         |
+-------------+------------------------------+---------+
| ``bztar``   | bzipped tar file             |         |
|             | (:file:`.tar.bz2`)           |         |
+-------------+------------------------------+---------+
| ``xztar``   | xzipped tar file             |         |
|             | (:file:`.tar.xz`)            |         |
+-------------+------------------------------+---------+
| ``ztar``    | compressed tar file          | \(3)    |
|             | (:file:`.tar.Z`)             |         |
+-------------+------------------------------+---------+
| ``tar``     | tar file (:file:`.tar`)      |         |
+-------------+------------------------------+---------+
| ``zip``     | zip file (:file:`.zip`)      | (2),(4) |
+-------------+------------------------------+---------+
| ``rpm``     | RPM                          | \(5)    |
+-------------+------------------------------+---------+
| ``pkgtool`` | Solaris :program:`pkgtool`   |         |
+-------------+------------------------------+---------+
| ``sdux``    | HP-UX :program:`swinstall`   |         |
+-------------+------------------------------+---------+
| ``wininst`` | self-extracting ZIP file for | \(4)    |
|             | Windows                      |         |
+-------------+------------------------------+---------+
| ``msi``     | Microsoft Installer.         |         |
+-------------+------------------------------+---------+

.. versionchanged:: 3.5
   Added support for the ``xztar`` format.


Notes:

(1)
   default on Unix

(2)
   default on Windows

(3)
   requires external :program:`compress` utility.

(4)
   requires either external :program:`zip` utility or :mod:`zipfile` module (part
   of the standard Python library since Python 1.6)

(5)
   requires external :program:`rpm` utility, version 3.0.4 or better (use ``rpm
   --version`` to find out which version you have)

You don't have to use the :command:`bdist` command with the :option:`!--formats`
option; you can also use the command that directly implements the format you're
interested in.  Some of these :command:`bdist` "sub-commands" actually generate
several similar formats; for instance, the :command:`bdist_dumb` command
generates all the "dumb" archive formats (``tar``, ``gztar``, ``bztar``,
``xztar``, ``ztar``, and ``zip``), and :command:`bdist_rpm` generates both
binary and source RPMs.  The :command:`bdist` sub-commands, and the formats
generated by each, are:

+--------------------------+-------------------------------------+
| Command                  | Formats                             |
+==========================+=====================================+
| :command:`bdist_dumb`    | tar, gztar, bztar, xztar, ztar, zip |
+--------------------------+-------------------------------------+
| :command:`bdist_rpm`     | rpm, srpm                           |
+--------------------------+-------------------------------------+
| :command:`bdist_wininst` | wininst                             |
+--------------------------+-------------------------------------+
| :command:`bdist_msi`     | msi                                 |
+--------------------------+-------------------------------------+

.. note::
   bdist_wininst is deprecated since Python 3.8.

.. note::
   bdist_msi is deprecated since Python 3.9.

The following sections give details on the individual :command:`bdist_\*`
commands.


.. .. _creating-dumb:

.. Creating dumb built distributions
.. =================================

.. XXX Need to document absolute vs. prefix-relative packages here, but first
   I have to implement it!


.. _creating-rpms:

Creating RPM packages
=====================

The RPM format is used by many popular Linux distributions, including Red Hat,
SuSE, and Mandrake.  If one of these (or any of the other RPM-based Linux
distributions) is your usual environment, creating RPM packages for other users
of that same distribution is trivial. Depending on the complexity of your module
distribution and differences between Linux distributions, you may also be able
to create RPMs that work on different RPM-based distributions.

The usual way to create an RPM of your module distribution is to run the
:command:`bdist_rpm` command::

   python setup.py bdist_rpm

or the :command:`bdist` command with the :option:`!--format` option::

   python setup.py bdist --formats=rpm

The former allows you to specify RPM-specific options; the latter allows  you to
easily specify multiple formats in one run.  If you need to do both, you can
explicitly specify multiple :command:`bdist_\*` commands and their options::

   python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>" \
                   bdist_wininst --target-version="2.0"

Creating RPM packages is driven by a :file:`.spec` file, much as using the
Distutils is driven by the setup script.  To make your life easier, the
:command:`bdist_rpm` command normally creates a :file:`.spec` file based on the
information you supply in the setup script, on the command line, and in any
Distutils configuration files.  Various options and sections in the
:file:`.spec` file are derived from options in the setup script as follows:

+------------------------------------------+----------------------------------------------+
| RPM :file:`.spec` file option or section | Distutils setup script option                |
+==========================================+==============================================+
| Name                                     | ``name``                                     |
+------------------------------------------+----------------------------------------------+
| Summary (in preamble)                    | ``description``                              |
+------------------------------------------+----------------------------------------------+
| Version                                  | ``version``                                  |
+------------------------------------------+----------------------------------------------+
| Vendor                                   | ``author`` and ``author_email``,             |
|                                          | or  --- & ``maintainer`` and                 |
|                                          | ``maintainer_email``                         |
+------------------------------------------+----------------------------------------------+
| Copyright                                | ``license``                                  |
+------------------------------------------+----------------------------------------------+
| Url                                      | ``url``                                      |
+------------------------------------------+----------------------------------------------+
| %description (section)                   | ``long_description``                         |
+------------------------------------------+----------------------------------------------+

Additionally, there are many options in :file:`.spec` files that don't have
corresponding options in the setup script.  Most of these are handled through
options to the :command:`bdist_rpm` command as follows:

+-------------------------------+-----------------------------+-------------------------+
| RPM :file:`.spec` file option | :command:`bdist_rpm` option | default value           |
| or section                    |                             |                         |
+===============================+=============================+=========================+
| Release                       | ``release``                 | "1"                     |
+-------------------------------+-----------------------------+-------------------------+
| Group                         | ``group``                   | "Development/Libraries" |
+-------------------------------+-----------------------------+-------------------------+
| Vendor                        | ``vendor``                  | (see above)             |
+-------------------------------+-----------------------------+-------------------------+
| Packager                      | ``packager``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Provides                      | ``provides``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Requires                      | ``requires``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Conflicts                     | ``conflicts``               | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Obsoletes                     | ``obsoletes``               | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Distribution                  | ``distribution_name``       | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| BuildRequires                 | ``build_requires``          | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Icon                          | ``icon``                    | (none)                  |
+-------------------------------+-----------------------------+-------------------------+

Obviously, supplying even a few of these options on the command-line would be
tedious and error-prone, so it's usually best to put them in the setup
configuration file, :file:`setup.cfg`\ ---see section :ref:`setup-config`.  If
you distribute or package many Python module distributions, you might want to
put options that apply to all of them in your personal Distutils configuration
file (:file:`~/.pydistutils.cfg`).  If you want to temporarily disable
this file, you can pass the :option:`!--no-user-cfg` option to :file:`setup.py`.

There are three steps to building a binary RPM package, all of which are
handled automatically by the Distutils:

#. create a :file:`.spec` file, which describes the package (analogous  to the
   Distutils setup script; in fact, much of the information in the  setup script
   winds up in the :file:`.spec` file)

#. create the source RPM

#. create the "binary" RPM (which may or may not contain binary code, depending
   on whether your module distribution contains Python extensions)

Normally, RPM bundles the last two steps together; when you use the Distutils,
all three steps are typically bundled together.

If you wish, you can separate these three steps.  You can use the
:option:`!--spec-only` option to make :command:`bdist_rpm` just create the
:file:`.spec` file and exit; in this case, the :file:`.spec` file will be
written to the "distribution directory"---normally :file:`dist/`, but
customizable with the :option:`!--dist-dir` option.  (Normally, the :file:`.spec`
file winds up deep in the "build tree," in a temporary directory created by
:command:`bdist_rpm`.)

.. % \XXX{this isn't implemented yet---is it needed?!}
.. % You can also specify a custom \file{.spec} file with the
.. % \longprogramopt{spec-file} option; used in conjunction with
.. % \longprogramopt{spec-only}, this gives you an opportunity to customize
.. % the \file{.spec} file manually:
.. %
.. % \ begin{verbatim}
.. % > python setup.py bdist_rpm --spec-only
.. % # ...edit dist/FooBar-1.0.spec
.. % > python setup.py bdist_rpm --spec-file=dist/FooBar-1.0.spec
.. % \ end{verbatim}
.. %
.. % (Although a better way to do this is probably to override the standard
.. % \command{bdist\_rpm} command with one that writes whatever else you want
.. % to the \file{.spec} file.)


.. _creating-wininst:

Creating Windows Installers
===========================

.. warning::
   bdist_wininst is deprecated since Python 3.8.

.. warning::
   bdist_msi is deprecated since Python 3.9.

Executable installers are the natural format for binary distributions on
Windows.  They display a nice graphical user interface, display some information
about the module distribution to be installed taken from the metadata in the
setup script, let the user select a few options, and start or cancel the
installation.

Since the metadata is taken from the setup script, creating Windows installers
is usually as easy as running::

   python setup.py bdist_wininst

or the :command:`bdist` command with the :option:`!--formats` option::

   python setup.py bdist --formats=wininst

If you have a pure module distribution (only containing pure Python modules and
packages), the resulting installer will be version independent and have a name
like :file:`foo-1.0.win32.exe`. Note that creating ``wininst`` binary
distributions in only supported on Windows systems.

If you have a non-pure distribution, the extensions can only be created on a
Windows platform, and will be Python version dependent. The installer filename
will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`.  You
have to create a separate installer for every Python version you want to
support.

The installer will try to compile pure modules into :term:`bytecode` after installation
on the target system in normal and optimizing mode.  If you don't want this to
happen for some reason, you can run the :command:`bdist_wininst` command with
the :option:`!--no-target-compile` and/or the :option:`!--no-target-optimize`
option.

By default the installer will display the cool "Python Powered" logo when it is
run, but you can also supply your own 152x261 bitmap which must be a Windows
:file:`.bmp` file with the :option:`!--bitmap` option.

The installer will also display a large title on the desktop background window
when it is run, which is constructed from the name of your distribution and the
version number.  This can be changed to another text by using the
:option:`!--title` option.

The installer file will be written to the "distribution directory" --- normally
:file:`dist/`, but customizable with the :option:`!--dist-dir` option.

.. _cross-compile-windows:

Cross-compiling on Windows
==========================

Starting with Python 2.6, distutils is capable of cross-compiling between
Windows platforms.  In practice, this means that with the correct tools
installed, you can use a 32bit version of Windows to create 64bit extensions
and vice-versa.

To build for an alternate platform, specify the :option:`!--plat-name` option
to the build command.  Valid values are currently 'win32', and  'win-amd64'.
For example, on a 32bit version of Windows, you could execute::

   python setup.py build --plat-name=win-amd64

to build a 64bit version of your extension.  The Windows Installers also
support this option, so the command::

   python setup.py build --plat-name=win-amd64 bdist_wininst

would create a 64bit installation executable on your 32bit version of Windows.

To cross-compile, you must download the Python source code and cross-compile
Python itself for the platform you are targeting - it is not possible from a
binary installation of Python (as the .lib etc file for other platforms are
not included.)  In practice, this means the user of a 32 bit operating
system will need to use Visual Studio 2008 to open the
:file:`PCbuild/PCbuild.sln` solution in the Python source tree and build the
"x64" configuration of the 'pythoncore' project before cross-compiling
extensions is possible.

Note that by default, Visual Studio 2008 does not install 64bit compilers or
tools.  You may need to reexecute the Visual Studio setup process and select
these tools (using Control Panel->[Add/Remove] Programs is a convenient way to
check or modify your existing install.)

.. _postinstallation-script:

The Postinstallation script
---------------------------

Starting with Python 2.3, a postinstallation script can be specified with the
:option:`!--install-script` option.  The basename of the script must be
specified, and the script filename must also be listed in the scripts argument
to the setup function.

This script will be run at installation time on the target system after all the
files have been copied, with ``argv[1]`` set to :option:`!-install`, and again at
uninstallation time before the files are removed with ``argv[1]`` set to
:option:`!-remove`.

The installation script runs embedded in the windows installer, every output
(``sys.stdout``, ``sys.stderr``) is redirected into a buffer and will be
displayed in the GUI after the script has finished.

Some functions especially useful in this context are available as additional
built-in functions in the installation script.


.. function:: directory_created(path)
              file_created(path)

   These functions should be called when a directory or file is created by the
   postinstall script at installation time.  It will register *path* with the
   uninstaller, so that it will be removed when the distribution is uninstalled.
   To be safe, directories are only removed if they are empty.


.. function:: get_special_folder_path(csidl_string)

   This function can be used to retrieve special folder locations on Windows like
   the Start Menu or the Desktop.  It returns the full path to the folder.
   *csidl_string* must be one of the following strings::

      "CSIDL_APPDATA"

      "CSIDL_COMMON_STARTMENU"
      "CSIDL_STARTMENU"

      "CSIDL_COMMON_DESKTOPDIRECTORY"
      "CSIDL_DESKTOPDIRECTORY"

      "CSIDL_COMMON_STARTUP"
      "CSIDL_STARTUP"

      "CSIDL_COMMON_PROGRAMS"
      "CSIDL_PROGRAMS"

      "CSIDL_FONTS"

   If the folder cannot be retrieved, :exc:`OSError` is raised.

   Which folders are available depends on the exact Windows version, and probably
   also the configuration.  For details refer to Microsoft's documentation of the
   :c:func:`SHGetSpecialFolderPath` function.


.. function:: create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])

   This function creates a shortcut. *target* is the path to the program to be
   started by the shortcut. *description* is the description of the shortcut.
   *filename* is the title of the shortcut that the user will see. *arguments*
   specifies the command line arguments, if any. *workdir* is the working directory
   for the program. *iconpath* is the file containing the icon for the shortcut,
   and *iconindex* is the index of the icon in the file *iconpath*.  Again, for
   details consult the Microsoft documentation for the :class:`IShellLink`
   interface.


Vista User Access Control (UAC)
===============================

Starting with Python 2.6, bdist_wininst supports a :option:`!--user-access-control`
option.  The default is 'none' (meaning no UAC handling is done), and other
valid values are 'auto' (meaning prompt for UAC elevation if Python was
installed for all users) and 'force' (meaning always prompt for elevation).

.. note::
   bdist_wininst is deprecated since Python 3.8.

.. note::
   bdist_msi is deprecated since Python 3.9.
doc/alt-python38-setuptools/deprecated/distutils/uploading.rst000064400000000342151732726220020650 0ustar00:orphan:

***************************************
Uploading Packages to the Package Index
***************************************

References to up to date PyPI documentation can be found at
:ref:`publishing-python-packages`.
doc/alt-python38-setuptools/deprecated/distutils/_setuptools_disclaimer.rst000064400000000357151732726220023450 0ustar00.. note::

   This document is being retained solely until the ``setuptools`` documentation
   at https://setuptools.readthedocs.io/en/latest/setuptools.html
   independently covers all of the relevant information currently included here.
doc/alt-python38-setuptools/deprecated/distutils/introduction.rst000064400000020607151732726220021415 0ustar00.. _distutils-intro:

****************************
An Introduction to Distutils
****************************

.. include:: ./_setuptools_disclaimer.rst

This document covers using the Distutils to distribute your Python modules,
concentrating on the role of developer/distributor: if you're looking for
information on installing Python modules, you should refer to the
:ref:`install-index` chapter.


.. _distutils-concepts:

Concepts & Terminology
======================

Using the Distutils is quite simple, both for module developers and for
users/administrators installing third-party modules.  As a developer, your
responsibilities (apart from writing solid, well-documented and well-tested
code, of course!) are:

* write a setup script (:file:`setup.py` by convention)

* (optional) write a setup configuration file

* create a source distribution

* (optional) create one or more built (binary) distributions

Each of these tasks is covered in this document.

Not all module developers have access to a multitude of platforms, so it's not
always feasible to expect them to create a multitude of built distributions.  It
is hoped that a class of intermediaries, called *packagers*, will arise to
address this need.  Packagers will take source distributions released by module
developers, build them on one or more platforms, and release the resulting built
distributions.  Thus, users on the most popular platforms will be able to
install most popular Python module distributions in the most natural way for
their platform, without having to run a single setup script or compile a line of
code.


.. _distutils-simple-example:

A Simple Example
================

The setup script is usually quite simple, although since it's written in Python,
there are no arbitrary limits to what you can do with it, though you should be
careful about putting arbitrarily expensive operations in your setup script.
Unlike, say, Autoconf-style configure scripts, the setup script may be run
multiple times in the course of building and installing your module
distribution.

If all you want to do is distribute a module called ``foo``, contained in a
file :file:`foo.py`, then your setup script can be as simple as this::

   from distutils.core import setup
   setup(name='foo',
         version='1.0',
         py_modules=['foo'],
         )

Some observations:

* most information that you supply to the Distutils is supplied as keyword
  arguments to the :func:`~distutils.core.setup` function

* those keyword arguments fall into two categories: package metadata (name,
  version number) and information about what's in the package (a list of pure
  Python modules, in this case)

* modules are specified by module name, not filename (the same will hold true
  for packages and extensions)

* it's recommended that you supply a little more metadata, in particular your
  name, email address and a URL for the project (see section :ref:`setup-script`
  for an example)

To create a source distribution for this module, you would create a setup
script, :file:`setup.py`, containing the above code, and run this command from a
terminal::

   python setup.py sdist

For Windows, open a command prompt window (:menuselection:`Start -->
Accessories`) and change the command to::

   setup.py sdist

:command:`sdist` will create an archive file (e.g., tarball on Unix, ZIP file on Windows)
containing your setup script :file:`setup.py`, and your module :file:`foo.py`.
The archive file will be named :file:`foo-1.0.tar.gz` (or :file:`.zip`), and
will unpack into a directory :file:`foo-1.0`.

If an end-user wishes to install your ``foo`` module, all they have to do is
download :file:`foo-1.0.tar.gz` (or :file:`.zip`), unpack it, and---from the
:file:`foo-1.0` directory---run ::

   python setup.py install

which will ultimately copy :file:`foo.py` to the appropriate directory for
third-party modules in their Python installation.

This simple example demonstrates some fundamental concepts of the Distutils.
First, both developers and installers have the same basic user interface, i.e.
the setup script.  The difference is which Distutils *commands* they use: the
:command:`sdist` command is almost exclusively for module developers, while
:command:`install` is more often for installers (although most developers will
want to install their own code occasionally).

If you want to make things really easy for your users, you can create one or
more built distributions for them.  For instance, if you are running on a
Windows machine, and want to make things easy for other Windows users, you can
create an executable installer (the most appropriate type of built distribution
for this platform) with the :command:`bdist_wininst` command.  For example::

   python setup.py bdist_wininst

will create an executable installer, :file:`foo-1.0.win32.exe`, in the current
directory.

Other useful built distribution formats are RPM, implemented by the
:command:`bdist_rpm` command, Solaris :program:`pkgtool`
(:command:`bdist_pkgtool`), and HP-UX :program:`swinstall`
(:command:`bdist_sdux`).  For example, the following command will create an RPM
file called :file:`foo-1.0.noarch.rpm`::

   python setup.py bdist_rpm

(The :command:`bdist_rpm` command uses the :command:`rpm` executable, therefore
this has to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or
Mandrake Linux.)

You can find out what distribution formats are available at any time by running
::

   python setup.py bdist --help-formats


.. _python-terms:

General Python terminology
==========================

If you're reading this document, you probably have a good idea of what modules,
extensions, and so forth are.  Nevertheless, just to be sure that everyone is
operating from a common starting point, we offer the following glossary of
common Python terms:

module
   the basic unit of code reusability in Python: a block of code imported by some
   other code.  Three types of modules concern us here: pure Python modules,
   extension modules, and packages.

pure Python module
   a module written in Python and contained in a single :file:`.py` file (and
   possibly associated :file:`.pyc` files).  Sometimes referred to as a
   "pure module."

extension module
   a module written in the low-level language of the Python implementation: C/C++
   for Python, Java for Jython. Typically contained in a single dynamically
   loadable pre-compiled file, e.g. a shared object (:file:`.so`) file for Python
   extensions on Unix, a DLL (given the :file:`.pyd` extension) for Python
   extensions on Windows, or a Java class file for Jython extensions.  (Note that
   currently, the Distutils only handles C/C++ extensions for Python.)

package
   a module that contains other modules; typically contained in a directory in the
   filesystem and distinguished from other directories by the presence of a file
   :file:`__init__.py`.

root package
   the root of the hierarchy of packages.  (This isn't really a package, since it
   doesn't have an :file:`__init__.py` file.  But we have to call it something.)
   The vast majority of the standard library is in the root package, as are many
   small, standalone third-party modules that don't belong to a larger module
   collection. Unlike regular packages, modules in the root package can be found in
   many directories: in fact, every directory listed in ``sys.path`` contributes
   modules to the root package.


.. _distutils-term:

Distutils-specific terminology
==============================

The following terms apply more specifically to the domain of distributing Python
modules using the Distutils:

module distribution
   a collection of Python modules distributed together as a single downloadable
   resource and meant to be installed *en masse*.  Examples of some well-known
   module distributions are NumPy, SciPy, Pillow,
   or mxBase.  (This would be called a *package*, except that term is
   already taken in the Python context: a single module distribution may contain
   zero, one, or many Python packages.)

pure module distribution
   a module distribution that contains only pure Python modules and packages.
   Sometimes referred to as a "pure distribution."

non-pure module distribution
   a module distribution that contains at least one extension module.  Sometimes
   referred to as a "non-pure distribution."

distribution root
   the top-level directory of your source tree (or  source distribution); the
   directory where :file:`setup.py` exists.  Generally  :file:`setup.py` will be
   run from this directory.
doc/alt-python38-setuptools/deprecated/distutils/packageindex.rst000064400000000700151732726220021307 0ustar00:orphan:

.. _package-index:

*******************************
The Python Package Index (PyPI)
*******************************

The `Python Package Index (PyPI)`_ stores metadata describing distributions
packaged with distutils and other publishing tools, as well the distribution
archives themselves.

References to up to date PyPI documentation can be found at
:ref:`publishing-python-packages`.

.. _Python Package Index (PyPI): https://pypi.org
doc/alt-python38-setuptools/deprecated/distutils/configfile.rst000064400000013644151732726220021004 0ustar00.. _setup-config:

************************************
Writing the Setup Configuration File
************************************

.. include:: ./_setuptools_disclaimer.rst

Often, it's not possible to write down everything needed to build a distribution
*a priori*: you may need to get some information from the user, or from the
user's system, in order to proceed.  As long as that information is fairly
simple---a list of directories to search for C header files or libraries, for
example---then providing a configuration file, :file:`setup.cfg`, for users to
edit is a cheap and easy way to solicit it.  Configuration files also let you
provide default values for any command option, which the installer can then
override either on the command-line or by editing the config file.

The setup configuration file is a useful middle-ground between the setup
script---which, ideally, would be opaque to installers [#]_---and the command-line to
the setup script, which is outside of your control and entirely up to the
installer.  In fact, :file:`setup.cfg` (and any other Distutils configuration
files present on the target system) are processed after the contents of the
setup script, but before the command-line.  This has  several useful
consequences:

.. % (If you have more advanced needs, such as determining which extensions
.. % to build based on what capabilities are present on the target system,
.. % then you need the Distutils ``auto-configuration'' facility.  This
.. % started to appear in Distutils 0.9 but, as of this writing, isn't mature
.. % or stable enough yet for real-world use.)

* installers can override some of what you put in :file:`setup.py` by editing
  :file:`setup.cfg`

* you can provide non-standard defaults for options that are not easily set in
  :file:`setup.py`

* installers can override anything in :file:`setup.cfg` using the command-line
  options to :file:`setup.py`

The basic syntax of the configuration file is simple:

.. code-block:: ini

   [command]
   option=value
   ...

where *command* is one of the Distutils commands (e.g. :command:`build_py`,
:command:`install`), and *option* is one of the options that command supports.
Any number of options can be supplied for each command, and any number of
command sections can be included in the file.  Blank lines are ignored, as are
comments, which run from a ``'#'`` character until the end of the line.  Long
option values can be split across multiple lines simply by indenting the
continuation lines.

You can find out the list of options supported by a particular command with the
universal :option:`!--help` option, e.g.

.. code-block:: shell-session

   $ python setup.py --help build_ext
   [...]
   Options for 'build_ext' command:
     --build-lib (-b)     directory for compiled extension modules
     --build-temp (-t)    directory for temporary files (build by-products)
     --inplace (-i)       ignore build-lib and put compiled extensions into the
                          source directory alongside your pure Python modules
     --include-dirs (-I)  list of directories to search for header files
     --define (-D)        C preprocessor macros to define
     --undef (-U)         C preprocessor macros to undefine
     --swig-opts          list of SWIG command line options
   [...]

Note that an option spelled :option:`!--foo-bar` on the command-line  is spelled
``foo_bar`` in configuration files.

.. _distutils-build-ext-inplace:

For example, say you want your extensions to be built "in-place"---that is, you
have an extension ``pkg.ext``, and you want the compiled extension file
(:file:`ext.so` on Unix, say) to be put in the same source directory as your
pure Python modules ``pkg.mod1`` and ``pkg.mod2``.  You can always use the
:option:`!--inplace` option on the command-line to ensure this:

.. code-block:: sh

   python setup.py build_ext --inplace

But this requires that you always specify the :command:`build_ext` command
explicitly, and remember to provide :option:`!--inplace`. An easier way is to
"set and forget" this option, by encoding it in :file:`setup.cfg`, the
configuration file for this distribution:

.. code-block:: ini

   [build_ext]
   inplace=1

This will affect all builds of this module distribution, whether or not you
explicitly specify :command:`build_ext`.  If you include :file:`setup.cfg` in
your source distribution, it will also affect end-user builds---which is
probably a bad idea for this option, since always building extensions in-place
would break installation of the module distribution.  In certain peculiar cases,
though, modules are built right in their installation directory, so this is
conceivably a useful ability.  (Distributing extensions that expect to be built
in their installation directory is almost always a bad idea, though.)

Another example: certain commands take a lot of options that don't change from
run to run; for example, :command:`bdist_rpm` needs to know everything required
to generate a "spec" file for creating an RPM distribution.  Some of this
information comes from the setup script, and some is automatically generated by
the Distutils (such as the list of files installed).  But some of it has to be
supplied as options to :command:`bdist_rpm`, which would be very tedious to do
on the command-line for every run.  Hence, here is a snippet from the Distutils'
own :file:`setup.cfg`:

.. code-block:: ini

   [bdist_rpm]
   release = 1
   packager = Greg Ward <gward@python.net>
   doc_files = CHANGES.txt
               README.txt
               USAGE.txt
               doc/
               examples/

Note that the ``doc_files`` option is simply a whitespace-separated string
split across multiple lines for readability.


.. seealso::

   :ref:`inst-config-syntax` in "Installing Python Modules"
      More information on the configuration files is available in the manual for
      system administrators.


.. rubric:: Footnotes

.. [#] This ideal probably won't be achieved until auto-configuration is fully
   supported by the Distutils.

doc/alt-python38-setuptools/deprecated/distutils/apiref.rst000064400000275170151732726220020151 0ustar00.. _api-reference:

*************
API Reference
*************

.. seealso::

   `New and changed setup.py arguments in setuptools`_
      The ``setuptools`` project adds new capabilities to the ``setup`` function
      and other APIs, makes the API consistent across different Python versions,
      and is hence recommended over using ``distutils`` directly.

.. _New and changed setup.py arguments in setuptools: https://setuptools.readthedocs.io/en/latest/setuptools.html#new-and-changed-setup-keywords

.. include:: ./_setuptools_disclaimer.rst

:mod:`distutils.core` --- Core Distutils functionality
======================================================

.. module:: distutils.core
   :synopsis: The core Distutils functionality


The :mod:`distutils.core` module is the only module that needs to be installed
to use the Distutils. It provides the :func:`setup` (which is called from the
setup script). Indirectly provides the  :class:`distutils.dist.Distribution` and
:class:`distutils.cmd.Command` class.


.. function:: setup(arguments)

   The basic do-everything function that does most everything you could ever ask
   for from a Distutils method.

   The setup function takes a large number of arguments. These are laid out in the
   following table.

   .. tabularcolumns:: |l|L|L|

   +--------------------+--------------------------------+-------------------------------------------------------------+
   | argument name      | value                          | type                                                        |
   +====================+================================+=============================================================+
   | *name*             | The name of the package        | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *version*          | The version number of the      | a string                                                    |
   |                    | package; see                   |                                                             |
   |                    | :mod:`distutils.version`       |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *description*      | A single line describing the   | a string                                                    |
   |                    | package                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *long_description* | Longer description of the      | a string                                                    |
   |                    | package                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *author*           | The name of the package author | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *author_email*     | The email address of the       | a string                                                    |
   |                    | package author                 |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *maintainer*       | The name of the current        | a string                                                    |
   |                    | maintainer, if different from  |                                                             |
   |                    | the author. Note that if       |                                                             |
   |                    | the maintainer is provided,    |                                                             |
   |                    | distutils will use it as the   |                                                             |
   |                    | author in :file:`PKG-INFO`     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *maintainer_email* | The email address of the       | a string                                                    |
   |                    | current maintainer, if         |                                                             |
   |                    | different from the author      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *url*              | A URL for the package          | a string                                                    |
   |                    | (homepage)                     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *download_url*     | A URL to download the package  | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *packages*         | A list of Python packages that | a list of strings                                           |
   |                    | distutils will manipulate      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *py_modules*       | A list of Python modules that  | a list of strings                                           |
   |                    | distutils will manipulate      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *scripts*          | A list of standalone script    | a list of strings                                           |
   |                    | files to be built and          |                                                             |
   |                    | installed                      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *ext_modules*      | A list of Python extensions to | a list of instances of                                      |
   |                    | be built                       | :class:`distutils.core.Extension`                           |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *classifiers*      | A list of categories for the   | a list of strings; valid classifiers are listed on `PyPI    |
   |                    | package                        | <https://pypi.org/classifiers>`_.                           |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *distclass*        | the :class:`Distribution`      | a subclass of                                               |
   |                    | class to use                   | :class:`distutils.core.Distribution`                        |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *script_name*      | The name of the setup.py       | a string                                                    |
   |                    | script - defaults to           |                                                             |
   |                    | ``sys.argv[0]``                |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *script_args*      | Arguments to supply to the     | a list of strings                                           |
   |                    | setup script                   |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *options*          | default options for the setup  | a dictionary                                                |
   |                    | script                         |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *license*          | The license for the package    | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *keywords*         | Descriptive meta-data, see     | a list of strings or a comma-separated string               |
   |                    | :pep:`314`                     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *platforms*        |                                | a list of strings or a comma-separated string               |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *cmdclass*         | A mapping of command names to  | a dictionary                                                |
   |                    | :class:`Command` subclasses    |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *data_files*       | A list of data files to        | a list                                                      |
   |                    | install                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *package_dir*      | A mapping of package to        | a dictionary                                                |
   |                    | directory names                |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+



.. function:: run_setup(script_name[, script_args=None, stop_after='run'])

   Run a setup script in a somewhat controlled environment, and return  the
   :class:`distutils.dist.Distribution` instance that drives things.   This is
   useful if you need to find out the distribution meta-data  (passed as keyword
   args from *script* to :func:`setup`), or  the contents of the config files or
   command-line.

   *script_name* is a file that will be read and run with :func:`exec`.  ``sys.argv[0]``
   will be replaced with *script* for the duration of the call.  *script_args* is a
   list of strings; if supplied, ``sys.argv[1:]`` will be replaced by *script_args*
   for the duration  of the call.

   *stop_after* tells :func:`setup` when to stop processing; possible  values:

   .. tabularcolumns:: |l|L|

   +---------------+---------------------------------------------+
   | value         | description                                 |
   +===============+=============================================+
   | *init*        | Stop after the :class:`Distribution`        |
   |               | instance has been created  and populated    |
   |               | with the keyword arguments to :func:`setup` |
   +---------------+---------------------------------------------+
   | *config*      | Stop after config files have been parsed    |
   |               | (and their data stored in the               |
   |               | :class:`Distribution` instance)             |
   +---------------+---------------------------------------------+
   | *commandline* | Stop after the command-line                 |
   |               | (``sys.argv[1:]`` or  *script_args*) have   |
   |               | been parsed (and the data stored in the     |
   |               | :class:`Distribution` instance.)            |
   +---------------+---------------------------------------------+
   | *run*         | Stop after all commands have been run (the  |
   |               | same as  if :func:`setup` had been called   |
   |               | in the usual way). This is the default      |
   |               | value.                                      |
   +---------------+---------------------------------------------+

In addition, the :mod:`distutils.core` module exposed a number of  classes that
live elsewhere.

* :class:`~distutils.extension.Extension` from :mod:`distutils.extension`

* :class:`~distutils.cmd.Command` from :mod:`distutils.cmd`

* :class:`~distutils.dist.Distribution` from :mod:`distutils.dist`

A short description of each of these follows, but see the relevant module for
the full reference.


.. class:: Extension

   The Extension class describes a single C or C++ extension module in a setup
   script. It accepts the following keyword arguments in its constructor:

   .. tabularcolumns:: |l|L|l|

   +------------------------+--------------------------------+---------------------------+
   | argument name          | value                          | type                      |
   +========================+================================+===========================+
   | *name*                 | the full name of the           | a string                  |
   |                        | extension, including any       |                           |
   |                        | packages --- ie. *not* a       |                           |
   |                        | filename or pathname, but      |                           |
   |                        | Python dotted name             |                           |
   +------------------------+--------------------------------+---------------------------+
   | *sources*              | list of source filenames,      | a list of strings         |
   |                        | relative to the distribution   |                           |
   |                        | root (where the setup script   |                           |
   |                        | lives), in Unix form           |                           |
   |                        | (slash-separated) for          |                           |
   |                        | portability.                   |                           |
   |                        | Source files may be C, C++,    |                           |
   |                        | SWIG (.i), platform-specific   |                           |
   |                        | resource files, or whatever    |                           |
   |                        | else is recognized by the      |                           |
   |                        | :command:`build_ext` command   |                           |
   |                        | as source for a Python         |                           |
   |                        | extension.                     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *include_dirs*         | list of directories to search  | a list of strings         |
   |                        | for C/C++ header files (in     |                           |
   |                        | Unix form for portability)     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *define_macros*        | list of macros to define; each | a list of tuples          |
   |                        | macro is defined using a       |                           |
   |                        | 2-tuple ``(name, value)``,     |                           |
   |                        | where *value* is               |                           |
   |                        | either the string to define it |                           |
   |                        | to or ``None`` to define it    |                           |
   |                        | without a particular value     |                           |
   |                        | (equivalent of ``#define FOO`` |                           |
   |                        | in source or :option:`!-DFOO`  |                           |
   |                        | on Unix C compiler command     |                           |
   |                        | line)                          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *undef_macros*         | list of macros to undefine     | a list of strings         |
   |                        | explicitly                     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *library_dirs*         | list of directories to search  | a list of strings         |
   |                        | for C/C++ libraries at link    |                           |
   |                        | time                           |                           |
   +------------------------+--------------------------------+---------------------------+
   | *libraries*            | list of library names (not     | a list of strings         |
   |                        | filenames or paths) to link    |                           |
   |                        | against                        |                           |
   +------------------------+--------------------------------+---------------------------+
   | *runtime_library_dirs* | list of directories to search  | a list of strings         |
   |                        | for C/C++ libraries at run     |                           |
   |                        | time (for shared extensions,   |                           |
   |                        | this is when the extension is  |                           |
   |                        | loaded)                        |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_objects*        | list of extra files to link    | a list of strings         |
   |                        | with (eg. object files not     |                           |
   |                        | implied by 'sources', static   |                           |
   |                        | library that must be           |                           |
   |                        | explicitly specified, binary   |                           |
   |                        | resource files, etc.)          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_compile_args*   | any extra platform- and        | a list of strings         |
   |                        | compiler-specific information  |                           |
   |                        | to use when compiling the      |                           |
   |                        | source files in 'sources'. For |                           |
   |                        | platforms and compilers where  |                           |
   |                        | a command line makes sense,    |                           |
   |                        | this is typically a list of    |                           |
   |                        | command-line arguments, but    |                           |
   |                        | for other platforms it could   |                           |
   |                        | be anything.                   |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_link_args*      | any extra platform- and        | a list of strings         |
   |                        | compiler-specific information  |                           |
   |                        | to use when linking object     |                           |
   |                        | files together to create the   |                           |
   |                        | extension (or to create a new  |                           |
   |                        | static Python interpreter).    |                           |
   |                        | Similar interpretation as for  |                           |
   |                        | 'extra_compile_args'.          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *export_symbols*       | list of symbols to be exported | a list of strings         |
   |                        | from a shared extension. Not   |                           |
   |                        | used on all platforms, and not |                           |
   |                        | generally necessary for Python |                           |
   |                        | extensions, which typically    |                           |
   |                        | export exactly one symbol:     |                           |
   |                        | ``init`` + extension_name.     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *depends*              | list of files that the         | a list of strings         |
   |                        | extension depends on           |                           |
   +------------------------+--------------------------------+---------------------------+
   | *language*             | extension language (i.e.       | a string                  |
   |                        | ``'c'``, ``'c++'``,            |                           |
   |                        | ``'objc'``). Will be detected  |                           |
   |                        | from the source extensions if  |                           |
   |                        | not provided.                  |                           |
   +------------------------+--------------------------------+---------------------------+
   | *optional*             | specifies that a build failure | a boolean                 |
   |                        | in the extension should not    |                           |
   |                        | abort the build process, but   |                           |
   |                        | simply skip the extension.     |                           |
   +------------------------+--------------------------------+---------------------------+

   .. versionchanged:: 3.8

      On Unix, C extensions are no longer linked to libpython except on
      Android and Cygwin.


.. class:: Distribution

   A :class:`Distribution` describes how to build, install and package up a Python
   software package.

   See the :func:`setup` function for a list of keyword arguments accepted  by the
   Distribution constructor. :func:`setup` creates a Distribution instance.

   .. versionchanged:: 3.7
      :class:`~distutils.core.Distribution` now warns if ``classifiers``,
      ``keywords`` and ``platforms`` fields are not specified as a list or
      a string.

.. class:: Command

   A :class:`Command` class (or rather, an instance of one of its subclasses)
   implement a single distutils command.


:mod:`distutils.ccompiler` --- CCompiler base class
===================================================

.. module:: distutils.ccompiler
   :synopsis: Abstract CCompiler class


This module provides the abstract base class for the :class:`CCompiler`
classes.  A :class:`CCompiler` instance can be used for all the compile  and
link steps needed to build a single project. Methods are provided to  set
options for the compiler --- macro definitions, include directories,  link path,
libraries and the like.

This module provides the following functions.


.. function:: gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)

   Generate linker options for searching library directories and linking with
   specific libraries.  *libraries* and *library_dirs* are, respectively, lists of
   library names (not filenames!) and search directories.  Returns a list of
   command-line options suitable for use with some compiler (depending on the two
   format strings passed in).


.. function:: gen_preprocess_options(macros, include_dirs)

   Generate C pre-processor options (:option:`!-D`, :option:`!-U`, :option:`!-I`) as
   used by at least two types of compilers: the typical Unix compiler and Visual
   C++. *macros* is the usual thing, a list of 1- or 2-tuples, where ``(name,)``
   means undefine (:option:`!-U`) macro *name*, and ``(name, value)`` means define
   (:option:`!-D`) macro *name* to *value*.  *include_dirs* is just a list of
   directory names to be added to the header file search path (:option:`!-I`).
   Returns a list of command-line options suitable for either Unix compilers or
   Visual C++.


.. function:: get_default_compiler(osname, platform)

   Determine the default compiler to use for the given platform.

   *osname* should be one of the standard Python OS names (i.e. the ones returned
   by ``os.name``) and *platform* the common value returned by ``sys.platform`` for
   the platform in question.

   The default values are ``os.name`` and ``sys.platform`` in case the parameters
   are not given.


.. function:: new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0)

   Factory function to generate an instance of some CCompiler subclass for the
   supplied platform/compiler combination. *plat* defaults to ``os.name`` (eg.
   ``'posix'``, ``'nt'``), and *compiler*  defaults to the default compiler for
   that platform. Currently only ``'posix'`` and ``'nt'`` are supported, and the
   default compilers are "traditional Unix interface" (:class:`UnixCCompiler`
   class) and Visual C++ (:class:`MSVCCompiler` class).  Note that it's perfectly
   possible to ask for a Unix compiler object under Windows, and a Microsoft
   compiler object under Unix---if you supply a value for *compiler*, *plat* is
   ignored.

   .. % Is the posix/nt only thing still true? Mac OS X seems to work, and
   .. % returns a UnixCCompiler instance. How to document this... hmm.


.. function:: show_compilers()

   Print list of available compilers (used by the :option:`!--help-compiler` options
   to :command:`build`, :command:`build_ext`, :command:`build_clib`).


.. class:: CCompiler([verbose=0, dry_run=0, force=0])

   The abstract base class :class:`CCompiler` defines the interface that  must be
   implemented by real compiler classes.  The class also has  some utility methods
   used by several compiler classes.

   The basic idea behind a compiler abstraction class is that each instance can be
   used for all the compile/link steps in building a single project.  Thus,
   attributes common to all of those compile and link steps --- include
   directories, macros to define, libraries to link against, etc. --- are
   attributes of the compiler instance.  To allow for variability in how individual
   files are treated, most of those attributes may be varied on a per-compilation
   or per-link basis.

   The constructor for each subclass creates an instance of the Compiler object.
   Flags are *verbose* (show verbose output), *dry_run* (don't actually execute the
   steps) and *force* (rebuild everything, regardless of dependencies). All of
   these flags default to ``0`` (off). Note that you probably don't want to
   instantiate :class:`CCompiler` or one of its subclasses directly - use the
   :func:`distutils.CCompiler.new_compiler` factory function instead.

   The following methods allow you to manually alter compiler options for  the
   instance of the Compiler class.


   .. method:: CCompiler.add_include_dir(dir)

      Add *dir* to the list of directories that will be searched for header files.
      The compiler is instructed to search directories in the order in which they are
      supplied by successive calls to :meth:`add_include_dir`.


   .. method:: CCompiler.set_include_dirs(dirs)

      Set the list of directories that will be searched to *dirs* (a list of strings).
      Overrides any preceding calls to :meth:`add_include_dir`; subsequent calls to
      :meth:`add_include_dir` add to the list passed to :meth:`set_include_dirs`.
      This does not affect any list of standard include directories that the compiler
      may search by default.


   .. method:: CCompiler.add_library(libname)

      Add *libname* to the list of libraries that will be included in all links driven
      by this compiler object.  Note that *libname* should \*not\* be the name of a
      file containing a library, but the name of the library itself: the actual
      filename will be inferred by the linker, the compiler, or the compiler class
      (depending on the platform).

      The linker will be instructed to link against libraries in the order they were
      supplied to :meth:`add_library` and/or :meth:`set_libraries`.  It is perfectly
      valid to duplicate library names; the linker will be instructed to link against
      libraries as many times as they are mentioned.


   .. method:: CCompiler.set_libraries(libnames)

      Set the list of libraries to be included in all links driven by this compiler
      object to *libnames* (a list of strings).  This does not affect any standard
      system libraries that the linker may include by default.


   .. method:: CCompiler.add_library_dir(dir)

      Add *dir* to the list of directories that will be searched for libraries
      specified to :meth:`add_library` and :meth:`set_libraries`.  The linker will be
      instructed to search for libraries in the order they are supplied to
      :meth:`add_library_dir` and/or :meth:`set_library_dirs`.


   .. method:: CCompiler.set_library_dirs(dirs)

      Set the list of library search directories to *dirs* (a list of strings).  This
      does not affect any standard library search path that the linker may search by
      default.


   .. method:: CCompiler.add_runtime_library_dir(dir)

      Add *dir* to the list of directories that will be searched for shared libraries
      at runtime.


   .. method:: CCompiler.set_runtime_library_dirs(dirs)

      Set the list of directories to search for shared libraries at runtime to *dirs*
      (a list of strings).  This does not affect any standard search path that the
      runtime linker may search by default.


   .. method:: CCompiler.define_macro(name[, value=None])

      Define a preprocessor macro for all compilations driven by this compiler object.
      The optional parameter *value* should be a string; if it is not supplied, then
      the macro will be defined without an explicit value and the exact outcome
      depends on the compiler used.

      .. XXX true? does ANSI say anything about this?


   .. method:: CCompiler.undefine_macro(name)

      Undefine a preprocessor macro for all compilations driven by this compiler
      object.  If the same macro is defined by :meth:`define_macro` and
      undefined by :meth:`undefine_macro` the last call takes precedence
      (including multiple redefinitions or undefinitions).  If the macro is
      redefined/undefined on a per-compilation basis (ie. in the call to
      :meth:`compile`), then that takes precedence.


   .. method:: CCompiler.add_link_object(object)

      Add *object* to the list of object files (or analogues, such as explicitly named
      library files or the output of "resource compilers") to be included in every
      link driven by this compiler object.


   .. method:: CCompiler.set_link_objects(objects)

      Set the list of object files (or analogues) to be included in every link to
      *objects*.  This does not affect any standard object files that the linker may
      include by default (such as system libraries).

   The following methods implement methods for autodetection of compiler  options,
   providing some functionality similar to GNU :program:`autoconf`.


   .. method:: CCompiler.detect_language(sources)

      Detect the language of a given file, or list of files. Uses the  instance
      attributes :attr:`~CCompiler.language_map` (a dictionary), and  :attr:`~CCompiler.language_order` (a
      list) to do the job.


   .. method:: CCompiler.find_library_file(dirs, lib[, debug=0])

      Search the specified list of directories for a static or shared library file
      *lib* and return the full path to that file.  If *debug* is true, look for a
      debugging version (if that makes sense on the current platform).  Return
      ``None`` if *lib* wasn't found in any of the specified directories.


   .. method:: CCompiler.has_function(funcname [, includes=None, include_dirs=None, libraries=None, library_dirs=None])

      Return a boolean indicating whether *funcname* is supported on the current
      platform.  The optional arguments can be used to augment the compilation
      environment by providing additional include files and paths and libraries and
      paths.


   .. method:: CCompiler.library_dir_option(dir)

      Return the compiler option to add *dir* to the list of directories searched for
      libraries.


   .. method:: CCompiler.library_option(lib)

      Return the compiler option to add *lib* to the list of libraries linked into the
      shared library or executable.


   .. method:: CCompiler.runtime_library_dir_option(dir)

      Return the compiler option to add *dir* to the list of directories searched for
      runtime libraries.


   .. method:: CCompiler.set_executables(**args)

      Define the executables (and options for them) that will be run to perform the
      various stages of compilation.  The exact set of executables that may be
      specified here depends on the compiler class (via the 'executables' class
      attribute), but most will have:

      +--------------+------------------------------------------+
      | attribute    | description                              |
      +==============+==========================================+
      | *compiler*   | the C/C++ compiler                       |
      +--------------+------------------------------------------+
      | *linker_so*  | linker used to create shared objects and |
      |              | libraries                                |
      +--------------+------------------------------------------+
      | *linker_exe* | linker used to create binary executables |
      +--------------+------------------------------------------+
      | *archiver*   | static library creator                   |
      +--------------+------------------------------------------+

      On platforms with a command-line (Unix, DOS/Windows), each of these is a string
      that will be split into executable name and (optional) list of arguments.
      (Splitting the string is done similarly to how Unix shells operate: words are
      delimited by spaces, but quotes and backslashes can override this.  See
      :func:`distutils.util.split_quoted`.)

   The following methods invoke stages in the build process.


   .. method:: CCompiler.compile(sources[, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None])

      Compile one or more source files. Generates object files (e.g.  transforms a
      :file:`.c` file to a :file:`.o` file.)

      *sources* must be a list of filenames, most likely C/C++ files, but in reality
      anything that can be handled by a particular compiler and compiler class (eg.
      :class:`MSVCCompiler` can handle resource files in *sources*).  Return a list of
      object filenames, one per source filename in *sources*.  Depending on the
      implementation, not all source files will necessarily be compiled, but all
      corresponding object filenames will be returned.

      If *output_dir* is given, object files will be put under it, while retaining
      their original path component.  That is, :file:`foo/bar.c` normally compiles to
      :file:`foo/bar.o` (for a Unix implementation); if *output_dir* is *build*, then
      it would compile to :file:`build/foo/bar.o`.

      *macros*, if given, must be a list of macro definitions.  A macro definition is
      either a ``(name, value)`` 2-tuple or a ``(name,)`` 1-tuple. The former defines
      a macro; if the value is ``None``, the macro is defined without an explicit
      value.  The 1-tuple case undefines a macro.  Later
      definitions/redefinitions/undefinitions take precedence.

      *include_dirs*, if given, must be a list of strings, the directories to add to
      the default include file search path for this compilation only.

      *debug* is a boolean; if true, the compiler will be instructed to output debug
      symbols in (or alongside) the object file(s).

      *extra_preargs* and *extra_postargs* are implementation-dependent. On platforms
      that have the notion of a command-line (e.g. Unix, DOS/Windows), they are most
      likely lists of strings: extra command-line arguments to prepend/append to the
      compiler command line.  On other platforms, consult the implementation class
      documentation.  In any event, they are intended as an escape hatch for those
      occasions when the abstract compiler framework doesn't cut the mustard.

      *depends*, if given, is a list of filenames that all targets depend on.  If a
      source file is older than any file in depends, then the source file will be
      recompiled.  This supports dependency tracking, but only at a coarse
      granularity.

      Raises :exc:`CompileError` on failure.


   .. method:: CCompiler.create_static_lib(objects, output_libname[, output_dir=None, debug=0, target_lang=None])

      Link a bunch of stuff together to create a static library file. The "bunch of
      stuff" consists of the list of object files supplied as *objects*, the extra
      object files supplied to :meth:`add_link_object` and/or
      :meth:`set_link_objects`, the libraries supplied to :meth:`add_library` and/or
      :meth:`set_libraries`, and the libraries supplied as *libraries* (if any).

      *output_libname* should be a library name, not a filename; the filename will be
      inferred from the library name.  *output_dir* is the directory where the library
      file will be put.

      .. XXX defaults to what?

      *debug* is a boolean; if true, debugging information will be included in the
      library (note that on most platforms, it is the compile step where this matters:
      the *debug* flag is included here just for consistency).

      *target_lang* is the target language for which the given objects are being
      compiled. This allows specific linkage time treatment of certain languages.

      Raises :exc:`LibError` on failure.


   .. method:: CCompiler.link(target_desc, objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a bunch of stuff together to create an executable or shared library file.

      The "bunch of stuff" consists of the list of object files supplied as *objects*.
      *output_filename* should be a filename.  If *output_dir* is supplied,
      *output_filename* is relative to it (i.e. *output_filename* can provide
      directory components if needed).

      *libraries* is a list of libraries to link against.  These are library names,
      not filenames, since they're translated into filenames in a platform-specific
      way (eg. *foo* becomes :file:`libfoo.a` on Unix and :file:`foo.lib` on
      DOS/Windows).  However, they can include a directory component, which means the
      linker will look in that specific directory rather than searching all the normal
      locations.

      *library_dirs*, if supplied, should be a list of directories to search for
      libraries that were specified as bare library names (ie. no directory
      component).  These are on top of the system default and those supplied to
      :meth:`add_library_dir` and/or :meth:`set_library_dirs`.  *runtime_library_dirs*
      is a list of directories that will be embedded into the shared library and used
      to search for other shared libraries that \*it\* depends on at run-time.  (This
      may only be relevant on Unix.)

      *export_symbols* is a list of symbols that the shared library will export.
      (This appears to be relevant only on Windows.)

      *debug* is as for :meth:`compile` and :meth:`create_static_lib`,  with the
      slight distinction that it actually matters on most platforms (as opposed to
      :meth:`create_static_lib`, which includes a *debug* flag mostly for form's
      sake).

      *extra_preargs* and *extra_postargs* are as for :meth:`compile`  (except of
      course that they supply command-line arguments for the particular linker being
      used).

      *target_lang* is the target language for which the given objects are being
      compiled. This allows specific linkage time treatment of certain languages.

      Raises :exc:`LinkError` on failure.


   .. method:: CCompiler.link_executable(objects, output_progname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, target_lang=None])

      Link an executable.  *output_progname* is the name of the file executable, while
      *objects* are a list of object filenames to link in. Other arguments  are as for
      the :meth:`link` method.


   .. method:: CCompiler.link_shared_lib(objects, output_libname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a shared library. *output_libname* is the name of the output  library,
      while *objects* is a list of object filenames to link in.  Other arguments are
      as for the :meth:`link` method.


   .. method:: CCompiler.link_shared_object(objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a shared object. *output_filename* is the name of the shared object that
      will be created, while *objects* is a list of object filenames  to link in.
      Other arguments are as for the :meth:`link` method.


   .. method:: CCompiler.preprocess(source[, output_file=None, macros=None, include_dirs=None, extra_preargs=None, extra_postargs=None])

      Preprocess a single C/C++ source file, named in *source*. Output will be written
      to file named *output_file*, or *stdout* if *output_file* not supplied.
      *macros* is a list of macro definitions as for :meth:`compile`, which will
      augment the macros set with :meth:`define_macro` and :meth:`undefine_macro`.
      *include_dirs* is a list of directory names that will be added to the  default
      list, in the same way as :meth:`add_include_dir`.

      Raises :exc:`PreprocessError` on failure.

   The following utility methods are defined by the :class:`CCompiler` class, for
   use by the various concrete subclasses.


   .. method:: CCompiler.executable_filename(basename[, strip_dir=0, output_dir=''])

      Returns the filename of the executable for the given *basename*.  Typically for
      non-Windows platforms this is the same as the basename,  while Windows will get
      a :file:`.exe` added.


   .. method:: CCompiler.library_filename(libname[, lib_type='static', strip_dir=0, output_dir=''])

      Returns the filename for the given library name on the current platform. On Unix
      a library with *lib_type* of ``'static'`` will typically  be of the form
      :file:`liblibname.a`, while a *lib_type* of ``'dynamic'``  will be of the form
      :file:`liblibname.so`.


   .. method:: CCompiler.object_filenames(source_filenames[, strip_dir=0, output_dir=''])

      Returns the name of the object files for the given source files.
      *source_filenames* should be a list of filenames.


   .. method:: CCompiler.shared_object_filename(basename[, strip_dir=0, output_dir=''])

      Returns the name of a shared object file for the given file name *basename*.


   .. method:: CCompiler.execute(func, args[, msg=None, level=1])

      Invokes :func:`distutils.util.execute`. This method invokes a  Python function
      *func* with the given arguments *args*, after  logging and taking into account
      the *dry_run* flag.


   .. method:: CCompiler.spawn(cmd)

      Invokes :func:`distutils.spawn.spawn`. This invokes an external  process to run
      the given command.


   .. method:: CCompiler.mkpath(name[, mode=511])

      Invokes :func:`distutils.dir_util.mkpath`. This creates a directory  and any
      missing ancestor directories.


   .. method:: CCompiler.move_file(src, dst)

      Invokes :meth:`distutils.file_util.move_file`. Renames *src* to  *dst*.


   .. method:: CCompiler.announce(msg[, level=1])

      Write a message using :func:`distutils.log.debug`.


   .. method:: CCompiler.warn(msg)

      Write a warning message *msg* to standard error.


   .. method:: CCompiler.debug_print(msg)

      If the *debug* flag is set on this :class:`CCompiler` instance, print  *msg* to
      standard output, otherwise do nothing.

.. % \subsection{Compiler-specific modules}
.. %
.. % The following modules implement concrete subclasses of the abstract
.. % \class{CCompiler} class. They should not be instantiated directly, but should
.. % be created using \function{distutils.ccompiler.new_compiler()} factory
.. % function.


:mod:`distutils.unixccompiler` --- Unix C Compiler
==================================================

.. module:: distutils.unixccompiler
   :synopsis: UNIX C Compiler


This module provides the :class:`UnixCCompiler` class, a subclass of
:class:`CCompiler` that handles the typical Unix-style command-line  C compiler:

* macros defined with :option:`!-Dname[=value]`

* macros undefined with :option:`!-Uname`

* include search directories specified with :option:`!-Idir`

* libraries specified with :option:`!-llib`

* library search directories specified with :option:`!-Ldir`

* compile handled by :program:`cc` (or similar) executable with :option:`!-c`
  option: compiles :file:`.c` to :file:`.o`

* link static library handled by :program:`ar` command (possibly with
  :program:`ranlib`)

* link shared library handled by :program:`cc` :option:`!-shared`


:mod:`distutils.msvccompiler` --- Microsoft Compiler
====================================================

.. module:: distutils.msvccompiler
   :synopsis: Microsoft Compiler

.. XXX: This is *waaaaay* out of date!

This module provides :class:`MSVCCompiler`, an implementation of the abstract
:class:`CCompiler` class for Microsoft Visual Studio. Typically, extension
modules need to be compiled with the same compiler that was used to compile
Python. For Python 2.3 and earlier, the compiler was Visual Studio 6. For Python
2.4 and 2.5, the compiler is Visual Studio .NET 2003.

:class:`MSVCCompiler` will normally choose the right compiler, linker etc. on
its own. To override this choice, the environment variables *DISTUTILS_USE_SDK*
and *MSSdk* must be both set. *MSSdk* indicates that the current environment has
been setup by the SDK's ``SetEnv.Cmd`` script, or that the environment variables
had been registered when the SDK was installed; *DISTUTILS_USE_SDK* indicates
that the distutils user has made an explicit choice to override the compiler
selection by :class:`MSVCCompiler`.


:mod:`distutils.bcppcompiler` --- Borland Compiler
==================================================

.. module:: distutils.bcppcompiler


This module provides :class:`BorlandCCompiler`, a subclass of the abstract
:class:`CCompiler` class for the Borland C++ compiler.


:mod:`distutils.cygwinccompiler` --- Cygwin Compiler
====================================================

.. module:: distutils.cygwinccompiler


This module provides the :class:`CygwinCCompiler` class, a subclass of
:class:`UnixCCompiler` that handles the Cygwin port of the GNU C compiler to
Windows.  It also contains the Mingw32CCompiler class which handles the mingw32
port of GCC (same as cygwin in no-cygwin mode).


:mod:`distutils.archive_util` ---  Archiving utilities
======================================================

.. module:: distutils.archive_util
   :synopsis: Utility functions for creating archive files (tarballs, zip files, ...)


This module provides a few functions for creating archive files, such as
tarballs or zipfiles.


.. function:: make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=0, dry_run=0])

   Create an archive file (eg. ``zip`` or ``tar``).  *base_name*  is the name of
   the file to create, minus any format-specific extension;  *format* is the
   archive format: one of ``zip``, ``tar``, ``gztar``, ``bztar``, ``xztar``, or
   ``ztar``. *root_dir* is a directory that will be the root directory of the
   archive; ie. we typically ``chdir`` into *root_dir* before  creating the
   archive.  *base_dir* is the directory where we start  archiving from; ie.
   *base_dir* will be the common prefix of all files and directories in the
   archive.  *root_dir* and *base_dir* both default to the current directory.
   Returns the name of the archive file.

   .. versionchanged:: 3.5
      Added support for the ``xztar`` format.


.. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0])

   'Create an (optional compressed) archive as a tar file from all files in and
   under *base_dir*. *compress* must be ``'gzip'`` (the default),
   ``'bzip2'``, ``'xz'``, ``'compress'``, or ``None``.  For the ``'compress'``
   method the compression utility named by :program:`compress` must be on the
   default program search path, so this is probably Unix-specific.  The output
   tar file will be named :file:`base_dir.tar`, possibly plus the appropriate
   compression extension (``.gz``, ``.bz2``, ``.xz`` or ``.Z``).  Return the
   output filename.

   .. versionchanged:: 3.5
      Added support for the ``xz`` compression.


.. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0])

   Create a zip file from all files in and under *base_dir*.  The output zip file
   will be named *base_name* + :file:`.zip`.  Uses either the  :mod:`zipfile` Python
   module (if available) or the InfoZIP :file:`zip`  utility (if installed and
   found on the default search path).  If neither  tool is available, raises
   :exc:`DistutilsExecError`.   Returns the name of the output zip file.


:mod:`distutils.dep_util` --- Dependency checking
=================================================

.. module:: distutils.dep_util
   :synopsis: Utility functions for simple dependency checking


This module provides functions for performing simple, timestamp-based
dependency of files and groups of files; also, functions based entirely  on such
timestamp dependency analysis.


.. function:: newer(source, target)

   Return true if *source* exists and is more recently modified than *target*, or
   if *source* exists and *target* doesn't. Return false if both exist and *target*
   is the same age or newer  than *source*. Raise :exc:`DistutilsFileError` if
   *source* does not exist.


.. function:: newer_pairwise(sources, targets)

   Walk two filename lists in parallel, testing if each source is newer than its
   corresponding target.  Return a pair of lists (*sources*, *targets*) where
   source is newer than target, according to the semantics of :func:`newer`.

   .. % % equivalent to a listcomp...


.. function:: newer_group(sources, target[, missing='error'])

   Return true if *target* is out-of-date with respect to any file listed in
   *sources*.  In other words, if *target* exists and is newer than every file in
   *sources*, return false; otherwise return true. *missing* controls what we do
   when a source file is missing; the default (``'error'``) is to blow up with an
   :exc:`OSError` from  inside :func:`os.stat`; if it is ``'ignore'``, we silently
   drop any missing source files; if it is ``'newer'``, any missing source files
   make us assume that *target* is out-of-date (this is handy in "dry-run" mode:
   it'll make you pretend to carry out commands that wouldn't work because inputs
   are missing, but that doesn't matter because you're not actually going to run
   the commands).


:mod:`distutils.dir_util` --- Directory tree operations
=======================================================

.. module:: distutils.dir_util
   :synopsis: Utility functions for operating on directories and directory trees


This module provides functions for operating on directories and trees of
directories.


.. function:: mkpath(name[, mode=0o777, verbose=0, dry_run=0])

   Create a directory and any missing ancestor directories.  If the directory
   already exists (or if *name* is the empty string, which means the current
   directory, which of course exists), then do nothing.  Raise
   :exc:`DistutilsFileError` if unable to create some directory along the way (eg.
   some sub-path exists, but is a file rather than a directory).  If *verbose* is
   true, print a one-line summary of each mkdir to stdout.  Return the list of
   directories actually created.


.. function:: create_tree(base_dir, files[, mode=0o777, verbose=0, dry_run=0])

   Create all the empty directories under *base_dir* needed to put *files* there.
   *base_dir* is just the name of a directory which doesn't necessarily exist
   yet; *files* is a list of filenames to be interpreted relative to *base_dir*.
   *base_dir* + the directory portion of every file in *files* will be created if
   it doesn't already exist.  *mode*, *verbose* and *dry_run* flags  are as for
   :func:`mkpath`.


.. function:: copy_tree(src, dst[, preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=0, verbose=0, dry_run=0])

   Copy an entire directory tree *src* to a new location *dst*.  Both *src* and
   *dst* must be directory names.  If *src* is not a directory, raise
   :exc:`DistutilsFileError`.  If *dst* does  not exist, it is created with
   :func:`mkpath`.  The end result of the  copy is that every file in *src* is
   copied to *dst*, and  directories under *src* are recursively copied to *dst*.
   Return the list of files that were copied or might have been copied, using their
   output name. The return value is unaffected by *update* or *dry_run*: it is
   simply the list of all files under *src*, with the names changed to be under
   *dst*.

   *preserve_mode* and *preserve_times* are the same as for
   :func:`distutils.file_util.copy_file`; note that they only apply to
   regular files, not to
   directories.  If *preserve_symlinks* is true, symlinks will be copied as
   symlinks (on platforms that support them!); otherwise (the default), the
   destination of the symlink will be copied.  *update* and *verbose* are the same
   as for :func:`~distutils.file_util.copy_file`.

   Files in *src* that begin with :file:`.nfs` are skipped (more information on
   these files is available in answer D2 of the `NFS FAQ page
   <http://nfs.sourceforge.net/#section_d>`_).

   .. versionchanged:: 3.3.1
      NFS files are ignored.

.. function:: remove_tree(directory[, verbose=0, dry_run=0])

   Recursively remove *directory* and all files and directories underneath it. Any
   errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is
   true).


:mod:`distutils.file_util` --- Single file operations
=====================================================

.. module:: distutils.file_util
   :synopsis: Utility functions for operating on single files


This module contains some utility functions for operating on individual files.


.. function:: copy_file(src, dst[, preserve_mode=1, preserve_times=1, update=0, link=None, verbose=0, dry_run=0])

   Copy file *src* to *dst*. If *dst* is a directory, then *src* is copied there
   with the same name; otherwise, it must be a filename. (If the file exists, it
   will be ruthlessly clobbered.) If *preserve_mode* is true (the default), the
   file's mode (type and permission bits, or whatever is analogous on the
   current platform) is copied. If *preserve_times* is true (the default), the
   last-modified and last-access times are copied as well. If *update* is true,
   *src* will only be copied if *dst* does not exist, or if *dst* does exist but
   is older than *src*.

   *link* allows you to make hard links (using :func:`os.link`) or symbolic links
   (using :func:`os.symlink`) instead of copying: set it to ``'hard'`` or
   ``'sym'``; if it is ``None`` (the default), files are copied. Don't set *link*
   on systems that don't support it: :func:`copy_file` doesn't check if hard or
   symbolic linking is available.  It uses :func:`~distutils.file_util._copy_file_contents` to copy file
   contents.

   Return a tuple ``(dest_name, copied)``: *dest_name* is the actual  name of the
   output file, and *copied* is true if the file was copied  (or would have been
   copied, if *dry_run* true).

   .. % XXX if the destination file already exists, we clobber it if
   .. % copying, but blow up if linking.  Hmmm.  And I don't know what
   .. % macostools.copyfile() does.  Should definitely be consistent, and
   .. % should probably blow up if destination exists and we would be
   .. % changing it (ie. it's not already a hard/soft link to src OR
   .. % (not update) and (src newer than dst)).


.. function:: move_file(src, dst[, verbose, dry_run])

   Move file *src* to *dst*. If *dst* is a directory, the file will be moved into
   it with the same name; otherwise, *src* is just renamed to *dst*.  Returns the
   new full name of the file.

   .. warning::

      Handles cross-device moves on Unix using :func:`copy_file`.  What about
      other systems?


.. function:: write_file(filename, contents)

   Create a file called *filename* and write *contents* (a sequence of strings
   without line terminators) to it.


:mod:`distutils.util` --- Miscellaneous other utility functions
===============================================================

.. module:: distutils.util
   :synopsis: Miscellaneous other utility functions


This module contains other assorted bits and pieces that don't fit into  any
other utility module.


.. function:: get_platform()

   Return a string that identifies the current platform.  This is used mainly to
   distinguish platform-specific build directories and platform-specific built
   distributions.  Typically includes the OS name and version and the
   architecture (as supplied by 'os.uname()'), although the exact information
   included depends on the OS; e.g., on Linux, the kernel version isn't
   particularly important.

   Examples of returned values:

   * ``linux-i586``
   * ``linux-alpha``
   * ``solaris-2.6-sun4u``

   For non-POSIX platforms, currently just returns ``sys.platform``.

   For Mac OS X systems the OS version reflects the minimal version on which
   binaries will run (that is, the value of ``MACOSX_DEPLOYMENT_TARGET``
   during the build of Python), not the OS version of the current system.

   For universal binary builds on Mac OS X the architecture value reflects
   the universal binary status instead of the architecture of the current
   processor. For 32-bit universal binaries the architecture is ``fat``,
   for 64-bit universal binaries the architecture is ``fat64``, and
   for 4-way universal binaries the architecture is ``universal``. Starting
   from Python 2.7 and Python 3.2 the architecture ``fat3`` is used for
   a 3-way universal build (ppc, i386, x86_64) and ``intel`` is used for
   a universal build with the i386 and x86_64 architectures

   Examples of returned values on Mac OS X:

   * ``macosx-10.3-ppc``

   * ``macosx-10.3-fat``

   * ``macosx-10.5-universal``

   * ``macosx-10.6-intel``

   For AIX, Python 3.9 and later return a string starting with "aix", followed
   by additional fields (separated by ``'-'``) that represent the combined
   values of AIX Version, Release and Technology Level (first field), Build Date
   (second field), and bit-size (third field). Python 3.8 and earlier returned
   only a single additional field with the AIX Version and Release.

   Examples of returned values on AIX:

   * ``aix-5307-0747-32`` # 32-bit build on AIX ``oslevel -s``: 5300-07-00-0000

   * ``aix-7105-1731-64`` # 64-bit build on AIX ``oslevel -s``: 7100-05-01-1731

   * ``aix-7.2``          # Legacy form reported in Python 3.8 and earlier

   .. versionchanged:: 3.9
      The AIX platform string format now also includes the technology level,
      build date, and ABI bit-size.


.. function:: convert_path(pathname)

   Return 'pathname' as a name that will work on the native filesystem, i.e. split
   it on '/' and put it back together again using the current directory separator.
   Needed because filenames in the setup script are always supplied in Unix style,
   and have to be converted to the local convention before we can actually use them
   in the filesystem.  Raises :exc:`ValueError` on non-Unix-ish systems if
   *pathname* either  starts or ends with a slash.


.. function:: change_root(new_root, pathname)

   Return *pathname* with *new_root* prepended.  If *pathname* is relative, this is
   equivalent to ``os.path.join(new_root,pathname)`` Otherwise, it requires making
   *pathname* relative and then joining the two, which is tricky on DOS/Windows.


.. function:: check_environ()

   Ensure that 'os.environ' has all the environment variables we guarantee that
   users can use in config files, command-line options, etc.  Currently this
   includes:

   * :envvar:`HOME` - user's home directory (Unix only)
   * :envvar:`PLAT` - description of the current platform, including hardware and
     OS (see :func:`get_platform`)


.. function:: subst_vars(s, local_vars)

   Perform shell/Perl-style variable substitution on *s*.  Every occurrence of
   ``$`` followed by a name is considered a variable, and variable is substituted
   by the value found in the *local_vars* dictionary, or in ``os.environ`` if it's
   not in *local_vars*. *os.environ* is first checked/augmented to guarantee that
   it contains certain values: see :func:`check_environ`.  Raise :exc:`ValueError`
   for any variables not found in either *local_vars* or ``os.environ``.

   Note that this is not a fully-fledged string interpolation function. A valid
   ``$variable`` can consist only of upper and lower case letters, numbers and an
   underscore. No { } or ( ) style quoting is available.


.. function:: split_quoted(s)

   Split a string up according to Unix shell-like rules for quotes and backslashes.
   In short: words are delimited by spaces, as long as those spaces are not escaped
   by a backslash, or inside a quoted string. Single and double quotes are
   equivalent, and the quote characters can be backslash-escaped.  The backslash is
   stripped from any two-character escape sequence, leaving only the escaped
   character.  The quote characters are stripped from any quoted string.  Returns a
   list of words.

   .. % Should probably be moved into the standard library.


.. function:: execute(func, args[, msg=None, verbose=0, dry_run=0])

   Perform some action that affects the outside world (for instance, writing to the
   filesystem).  Such actions are special because they are disabled by the
   *dry_run* flag.  This method takes  care of all that bureaucracy for you; all
   you have to do is supply the function to call and an argument tuple for it (to
   embody the "external action" being performed), and an optional message to print.


.. function:: strtobool(val)

   Convert a string representation of truth to true (1) or false (0).

   True values are ``y``, ``yes``, ``t``, ``true``, ``on``  and ``1``; false values
   are ``n``, ``no``, ``f``, ``false``,  ``off`` and ``0``.  Raises
   :exc:`ValueError` if *val*  is anything else.


.. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None])

   Byte-compile a collection of Python source files to :file:`.pyc` files in a
   :file:`__pycache__` subdirectory (see :pep:`3147` and :pep:`488`).
   *py_files* is a list of files to compile; any files that don't end in
   :file:`.py` are silently skipped.  *optimize* must be one of the following:

   * ``0`` - don't optimize
   * ``1`` - normal optimization (like ``python -O``)
   * ``2`` - extra optimization (like ``python -OO``)

   If *force* is true, all files are recompiled regardless of timestamps.

   The source filename encoded in each :term:`bytecode` file defaults to the filenames
   listed in *py_files*; you can modify these with *prefix* and *basedir*.
   *prefix* is a string that will be stripped off of each source filename, and
   *base_dir* is a directory name that will be prepended (after *prefix* is
   stripped).  You can supply either or both (or neither) of *prefix* and
   *base_dir*, as you wish.

   If *dry_run* is true, doesn't actually do anything that would affect the
   filesystem.

   Byte-compilation is either done directly in this interpreter process with the
   standard :mod:`py_compile` module, or indirectly by writing a temporary script
   and executing it.  Normally, you should let :func:`byte_compile` figure out to
   use direct compilation or not (see the source for details).  The *direct* flag
   is used by the script generated in indirect mode; unless you know what you're
   doing, leave it set to ``None``.

   .. versionchanged:: 3.2.3
      Create ``.pyc`` files with an :func:`import magic tag
      <imp.get_tag>` in their name, in a :file:`__pycache__` subdirectory
      instead of files without tag in the current directory.

   .. versionchanged:: 3.5
      Create ``.pyc`` files according to :pep:`488`.


.. function:: rfc822_escape(header)

   Return a version of *header* escaped for inclusion in an :rfc:`822` header, by
   ensuring there are 8 spaces space after each newline. Note that it does no other
   modification of the string.

   .. % this _can_ be replaced

.. % \subsection{Distutils objects}


:mod:`distutils.dist` --- The Distribution class
================================================

.. module:: distutils.dist
   :synopsis: Provides the Distribution class, which represents the module distribution being
              built/installed/distributed


This module provides the :class:`~distutils.core.Distribution` class, which
represents the module distribution being built/installed/distributed.


:mod:`distutils.extension` --- The Extension class
==================================================

.. module:: distutils.extension
   :synopsis: Provides the Extension class, used to describe C/C++ extension modules in setup
              scripts


This module provides the :class:`~distutils.extension.Extension` class,
used to describe C/C++ extension modules in setup scripts.

.. % \subsection{Ungrouped modules}
.. % The following haven't been moved into a more appropriate section yet.


:mod:`distutils.debug` --- Distutils debug mode
===============================================

.. module:: distutils.debug
   :synopsis: Provides the debug flag for distutils


This module provides the DEBUG flag.


:mod:`distutils.errors` --- Distutils exceptions
================================================

.. module:: distutils.errors
   :synopsis: Provides standard distutils exceptions


Provides exceptions used by the Distutils modules.  Note that Distutils modules
may raise standard exceptions; in particular, SystemExit is usually raised for
errors that are obviously the end-user's fault (eg. bad command-line arguments).

This module is safe to use in ``from ... import *`` mode; it only exports
symbols whose names start with ``Distutils`` and end with ``Error``.


:mod:`distutils.fancy_getopt` --- Wrapper around the standard getopt module
===========================================================================

.. module:: distutils.fancy_getopt
   :synopsis: Additional getopt functionality


This module provides a wrapper around the standard :mod:`getopt`  module that
provides the following additional features:

* short and long options are tied together

* options have help strings, so :func:`fancy_getopt` could potentially  create a
  complete usage summary

* options set attributes of a passed-in object

* boolean options can have "negative aliases" --- eg. if :option:`!--quiet` is
  the "negative alias" of :option:`!--verbose`, then :option:`!--quiet` on the
  command line sets *verbose* to false.

.. function:: fancy_getopt(options, negative_opt, object, args)

   Wrapper function. *options* is a list of ``(long_option, short_option,
   help_string)`` 3-tuples as described in the constructor for
   :class:`FancyGetopt`. *negative_opt* should be a dictionary mapping option names
   to option names, both the key and value should be in the *options* list.
   *object* is an object which will be used to store values (see the :meth:`~FancyGetopt.getopt`
   method of the :class:`FancyGetopt` class). *args* is the argument list. Will use
   ``sys.argv[1:]`` if you  pass ``None`` as *args*.


.. function:: wrap_text(text, width)

   Wraps *text* to less than *width* wide.


.. class:: FancyGetopt([option_table=None])

   The option_table is a list of 3-tuples: ``(long_option, short_option,
   help_string)``

   If an option takes an argument, its *long_option* should have ``'='`` appended;
   *short_option* should just be a single character, no ``':'`` in any case.
   *short_option* should be ``None`` if a *long_option*  doesn't have a
   corresponding *short_option*. All option tuples must have long options.

The :class:`FancyGetopt` class provides the following methods:


.. method:: FancyGetopt.getopt([args=None, object=None])

   Parse command-line options in args. Store as attributes on *object*.

   If *args* is ``None`` or not supplied, uses ``sys.argv[1:]``.  If *object* is
   ``None`` or not supplied, creates a new :class:`OptionDummy` instance, stores
   option values there, and returns a tuple ``(args, object)``.  If *object* is
   supplied, it is modified in place and :func:`getopt` just returns *args*; in
   both cases, the returned *args* is a modified copy of the passed-in *args* list,
   which is left untouched.

   .. % and args returned are?


.. method:: FancyGetopt.get_option_order()

   Returns the list of ``(option, value)`` tuples processed by the previous run of
   :meth:`getopt`  Raises :exc:`RuntimeError` if :meth:`getopt` hasn't been called
   yet.


.. method:: FancyGetopt.generate_help([header=None])

   Generate help text (a list of strings, one per suggested line of output) from
   the option table for this :class:`FancyGetopt` object.

   If supplied, prints the supplied *header* at the top of the help.


:mod:`distutils.filelist` --- The FileList class
================================================

.. module:: distutils.filelist
   :synopsis: The FileList class, used for poking about the file system and
              building lists of files.


This module provides the :class:`FileList` class, used for poking about the
filesystem and building lists of files.


:mod:`distutils.log` --- Simple :pep:`282`-style logging
========================================================

.. module:: distutils.log
   :synopsis: A simple logging mechanism, :pep:`282`-style


:mod:`distutils.spawn` --- Spawn a sub-process
==============================================

.. module:: distutils.spawn
   :synopsis: Provides the spawn() function


This module provides the :func:`~distutils.spawn.spawn` function, a
front-end to  various platform-specific functions for launching another
program in a  sub-process.
Also provides :func:`~distutils.spawn.find_executable` to search the path for a given executable
name.


:mod:`distutils.sysconfig` --- System configuration information
===============================================================

.. module:: distutils.sysconfig
   :synopsis: Low-level access to configuration information of the Python interpreter.
.. moduleauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
.. moduleauthor:: Greg Ward <gward@python.net>
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>


The :mod:`distutils.sysconfig` module provides access to Python's low-level
configuration information.  The specific configuration variables available
depend heavily on the platform and configuration. The specific variables depend
on the build process for the specific version of Python being run; the variables
are those found in the :file:`Makefile` and configuration header that are
installed with Python on Unix systems.  The configuration header is called
:file:`pyconfig.h` for Python versions starting with 2.2, and :file:`config.h`
for earlier versions of Python.

Some additional functions are provided which perform some useful manipulations
for other parts of the :mod:`distutils` package.


.. data:: PREFIX

   The result of ``os.path.normpath(sys.prefix)``.


.. data:: EXEC_PREFIX

   The result of ``os.path.normpath(sys.exec_prefix)``.


.. function:: get_config_var(name)

   Return the value of a single variable.  This is equivalent to
   ``get_config_vars().get(name)``.


.. function:: get_config_vars(...)

   Return a set of variable definitions.  If there are no arguments, this returns a
   dictionary mapping names of configuration variables to values.  If arguments are
   provided, they should be strings, and the return value will be a sequence giving
   the associated values. If a given name does not have a corresponding value,
   ``None`` will be included for that variable.


.. function:: get_config_h_filename()

   Return the full path name of the configuration header.  For Unix, this will be
   the header generated by the :program:`configure` script; for other platforms the
   header will have been supplied directly by the Python source distribution.  The
   file is a platform-specific text file.


.. function:: get_makefile_filename()

   Return the full path name of the :file:`Makefile` used to build Python.  For
   Unix, this will be a file generated by the :program:`configure` script; the
   meaning for other platforms will vary.  The file is a platform-specific text
   file, if it exists. This function is only useful on POSIX platforms.


.. function:: get_python_inc([plat_specific[, prefix]])

   Return the directory for either the general or platform-dependent C include
   files.  If *plat_specific* is true, the platform-dependent include directory is
   returned; if false or omitted, the platform-independent directory is returned.
   If *prefix* is given, it is used as either the prefix instead of
   :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
   *plat_specific* is true.


.. function:: get_python_lib([plat_specific[, standard_lib[, prefix]]])

   Return the directory for either the general or platform-dependent library
   installation.  If *plat_specific* is true, the platform-dependent include
   directory is returned; if false or omitted, the platform-independent directory
   is returned.  If *prefix* is given, it is used as either the prefix instead of
   :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
   *plat_specific* is true.  If *standard_lib* is true, the directory for the
   standard library is returned rather than the directory for the installation of
   third-party extensions.

The following function is only intended for use within the :mod:`distutils`
package.


.. function:: customize_compiler(compiler)

   Do any platform-specific customization of a
   :class:`distutils.ccompiler.CCompiler` instance.

   This function is only needed on Unix at this time, but should be called
   consistently to support forward-compatibility.  It inserts the information that
   varies across Unix flavors and is stored in Python's :file:`Makefile`.  This
   information includes the selected compiler, compiler and linker options, and the
   extension used by the linker for shared objects.

This function is even more special-purpose, and should only be used from
Python's own build procedures.


.. function:: set_python_build()

   Inform the :mod:`distutils.sysconfig` module that it is being used as part of
   the build process for Python.  This changes a lot of relative locations for
   files, allowing them to be located in the build area rather than in an installed
   Python.


:mod:`distutils.text_file` --- The TextFile class
=================================================

.. module:: distutils.text_file
   :synopsis: Provides the TextFile class, a simple interface to text files


This module provides the :class:`TextFile` class, which gives an interface  to
text files that (optionally) takes care of stripping comments, ignoring  blank
lines, and joining lines with backslashes.


.. class:: TextFile([filename=None, file=None, **options])

   This class provides a file-like object that takes care of all  the things you
   commonly want to do when processing a text file  that has some line-by-line
   syntax: strip comments (as long as ``#``  is your comment character), skip blank
   lines, join adjacent lines by escaping the newline (ie. backslash at end of
   line), strip leading and/or trailing whitespace.  All of these are optional and
   independently controllable.

   The class provides a :meth:`warn` method so you can generate  warning messages
   that report physical line number, even if the  logical line in question spans
   multiple physical lines.  Also  provides :meth:`unreadline` for implementing
   line-at-a-time lookahead.

   :class:`TextFile` instances are create with either *filename*, *file*, or both.
   :exc:`RuntimeError` is raised if both are ``None``. *filename* should be a
   string, and *file* a file object (or something that provides :meth:`readline`
   and :meth:`close`  methods).  It is recommended that you supply at least
   *filename*,  so that :class:`TextFile` can include it in warning messages.  If
   *file* is not supplied, :class:`TextFile` creates its own using the
   :func:`open` built-in function.

   The options are all boolean, and affect the values returned by :meth:`readline`

   .. tabularcolumns:: |l|L|l|

   +------------------+--------------------------------+---------+
   | option name      | description                    | default |
   +==================+================================+=========+
   | *strip_comments* | strip from ``'#'`` to          | true    |
   |                  | end-of-line, as well as any    |         |
   |                  | whitespace leading up to the   |         |
   |                  | ``'#'``\ ---unless it is       |         |
   |                  | escaped by a backslash         |         |
   +------------------+--------------------------------+---------+
   | *lstrip_ws*      | strip leading whitespace from  | false   |
   |                  | each line before returning it  |         |
   +------------------+--------------------------------+---------+
   | *rstrip_ws*      | strip trailing whitespace      | true    |
   |                  | (including line terminator!)   |         |
   |                  | from each line before          |         |
   |                  | returning it.                  |         |
   +------------------+--------------------------------+---------+
   | *skip_blanks*    | skip lines that are empty      | true    |
   |                  | \*after\* stripping comments   |         |
   |                  | and whitespace.  (If both      |         |
   |                  | lstrip_ws and rstrip_ws are    |         |
   |                  | false, then some lines may     |         |
   |                  | consist of solely whitespace:  |         |
   |                  | these will \*not\* be skipped, |         |
   |                  | even if *skip_blanks* is       |         |
   |                  | true.)                         |         |
   +------------------+--------------------------------+---------+
   | *join_lines*     | if a backslash is the last     | false   |
   |                  | non-newline character on a     |         |
   |                  | line after stripping comments  |         |
   |                  | and whitespace, join the       |         |
   |                  | following line to it to form   |         |
   |                  | one logical line; if N         |         |
   |                  | consecutive lines end with a   |         |
   |                  | backslash, then N+1 physical   |         |
   |                  | lines will be joined to form   |         |
   |                  | one logical line.              |         |
   +------------------+--------------------------------+---------+
   | *collapse_join*  | strip leading whitespace from  | false   |
   |                  | lines that are joined to their |         |
   |                  | predecessor; only matters if   |         |
   |                  | ``(join_lines and not          |         |
   |                  | lstrip_ws)``                   |         |
   +------------------+--------------------------------+---------+

   Note that since *rstrip_ws* can strip the trailing newline, the semantics of
   :meth:`readline` must differ from those of the built-in file object's
   :meth:`readline` method!  In particular, :meth:`readline`  returns ``None`` for
   end-of-file: an empty string might just be a  blank line (or an all-whitespace
   line), if *rstrip_ws* is true  but *skip_blanks* is not.


   .. method:: TextFile.open(filename)

      Open a new file *filename*.  This overrides any *file* or *filename*
      constructor arguments.


   .. method:: TextFile.close()

      Close the current file and forget everything we know about it (including the
      filename and the current line number).


   .. method:: TextFile.warn(msg[,line=None])

      Print (to stderr) a warning message tied to the current logical line in the
      current file.  If the current logical line in the file spans multiple physical
      lines, the warning refers to the whole range, such as ``"lines 3-5"``.  If
      *line* is supplied,  it overrides the current line number; it may be a list or
      tuple  to indicate a range of physical lines, or an integer for a  single
      physical line.


   .. method:: TextFile.readline()

      Read and return a single logical line from the current file (or from an internal
      buffer if lines have previously been "unread" with :meth:`unreadline`).  If the
      *join_lines* option  is true, this may involve reading multiple physical lines
      concatenated into a single string.  Updates the current line number,  so calling
      :meth:`warn` after :meth:`readline` emits a warning  about the physical line(s)
      just read.  Returns ``None`` on end-of-file,  since the empty string can occur
      if *rstrip_ws* is true but  *strip_blanks* is not.


   .. method:: TextFile.readlines()

      Read and return the list of all logical lines remaining in the current file.
      This updates the current line number to the last line of the file.


   .. method:: TextFile.unreadline(line)

      Push *line* (a string) onto an internal buffer that will be checked by future
      :meth:`readline` calls.  Handy for implementing a parser with line-at-a-time
      lookahead. Note that lines that are "unread" with :meth:`unreadline` are not
      subsequently re-cleansed (whitespace  stripped, or whatever) when read with
      :meth:`readline`. If multiple calls are made to :meth:`unreadline` before a call
      to :meth:`readline`, the lines will be returned most in most recent first order.


:mod:`distutils.version` --- Version number classes
===================================================

.. module:: distutils.version
   :synopsis: Implements classes that represent module version numbers.


.. % todo
.. % \section{Distutils Commands}
.. %
.. % This part of Distutils implements the various Distutils commands, such
.. % as \code{build}, \code{install} \&c. Each command is implemented as a
.. % separate module, with the command name as the name of the module.


:mod:`distutils.cmd` --- Abstract base class for Distutils commands
===================================================================

.. module:: distutils.cmd
   :synopsis: Provides the abstract base class :class:`~distutils.cmd.Command`. This class
              is subclassed by the modules in the distutils.command subpackage.


This module supplies the abstract base class :class:`Command`.


.. class:: Command(dist)

   Abstract base class for defining command classes, the "worker bees" of the
   Distutils.  A useful analogy for command classes is to think of them as
   subroutines with local variables called *options*.  The options are declared
   in :meth:`initialize_options` and defined (given their final values) in
   :meth:`finalize_options`, both of which must be defined by every command
   class.  The distinction between the two is necessary because option values
   might come from the outside world (command line, config file, ...), and any
   options dependent on other options must be computed after these outside
   influences have been processed --- hence :meth:`finalize_options`.  The body
   of the subroutine, where it does all its work based on the values of its
   options, is the :meth:`run` method, which must also be implemented by every
   command class.

   The class constructor takes a single argument *dist*, a
   :class:`~distutils.core.Distribution` instance.


Creating a new Distutils command
================================

This section outlines the steps to create a new Distutils command.

A new command lives in a module in the :mod:`distutils.command` package. There
is a sample template in that directory called :file:`command_template`.  Copy
this file to a new module with the same name as the new command you're
implementing.  This module should implement a class with the same name as the
module (and the command).  So, for instance, to create the command
``peel_banana`` (so that users can run ``setup.py peel_banana``), you'd copy
:file:`command_template` to :file:`distutils/command/peel_banana.py`, then edit
it so that it's implementing the class ``peel_banana``, a subclass of
:class:`distutils.cmd.Command`.

Subclasses of :class:`Command` must define the following methods.

.. method:: Command.initialize_options()

   Set default values for all the options that this command supports.  Note that
   these defaults may be overridden by other commands, by the setup script, by
   config files, or by the command-line.  Thus, this is not the place to code
   dependencies between options; generally, :meth:`initialize_options`
   implementations are just a bunch of ``self.foo = None`` assignments.


.. method:: Command.finalize_options()

   Set final values for all the options that this command supports. This is
   always called as late as possible, ie.  after any option assignments from the
   command-line or from other commands have been done.  Thus, this is the place
   to code option dependencies: if *foo* depends on *bar*, then it is safe to
   set *foo* from *bar* as long as *foo* still has the same value it was
   assigned in :meth:`initialize_options`.


.. method:: Command.run()

   A command's raison d'etre: carry out the action it exists to perform, controlled
   by the options initialized in :meth:`initialize_options`, customized by other
   commands, the setup script, the command-line, and config files, and finalized in
   :meth:`finalize_options`.  All terminal output and filesystem interaction should
   be done by :meth:`run`.


.. attribute:: Command.sub_commands

   *sub_commands* formalizes the notion of a "family" of commands,
   e.g. ``install`` as the parent with sub-commands ``install_lib``,
   ``install_headers``, etc.  The parent of a family of commands defines
   *sub_commands* as a class attribute; it's a list of 2-tuples ``(command_name,
   predicate)``, with *command_name* a string and *predicate* a function, a
   string or ``None``.  *predicate* is a method of the parent command that
   determines whether the corresponding command is applicable in the current
   situation.  (E.g. ``install_headers`` is only applicable if we have any C
   header files to install.)  If *predicate* is ``None``, that command is always
   applicable.

   *sub_commands* is usually defined at the *end* of a class, because
   predicates can be methods of the class, so they must already have been
   defined.  The canonical example is the :command:`install` command.


:mod:`distutils.command` --- Individual Distutils commands
==========================================================

.. module:: distutils.command
   :synopsis: Contains one module for each standard Distutils command.


.. % \subsubsection{Individual Distutils commands}
.. % todo


:mod:`distutils.command.bdist` --- Build a binary installer
===========================================================

.. module:: distutils.command.bdist
   :synopsis: Build a binary installer for a package


.. % todo


:mod:`distutils.command.bdist_packager` --- Abstract base class for packagers
=============================================================================

.. module:: distutils.command.bdist_packager
   :synopsis: Abstract base class for packagers


.. % todo


:mod:`distutils.command.bdist_dumb` --- Build a "dumb" installer
================================================================

.. module:: distutils.command.bdist_dumb
   :synopsis: Build a "dumb" installer - a simple archive of files


.. % todo


:mod:`distutils.command.bdist_msi` --- Build a Microsoft Installer binary package
=================================================================================

.. module:: distutils.command.bdist_msi
   :synopsis: Build a binary distribution as a Windows MSI file

.. class:: bdist_msi

.. deprecated:: 3.9
   Use bdist_wheel (wheel packages) instead.

   Builds a `Windows Installer`_ (.msi) binary package.

   .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx

   In most cases, the ``bdist_msi`` installer is a better choice than the
   ``bdist_wininst`` installer, because it provides better support for
   Win64 platforms, allows administrators to perform non-interactive
   installations, and allows installation through group policies.


:mod:`distutils.command.bdist_rpm` --- Build a binary distribution as a Redhat RPM and SRPM
===========================================================================================

.. module:: distutils.command.bdist_rpm
   :synopsis: Build a binary distribution as a Redhat RPM and SRPM


.. % todo


:mod:`distutils.command.bdist_wininst` --- Build a Windows installer
====================================================================

.. module:: distutils.command.bdist_wininst
   :synopsis: Build a Windows installer

.. deprecated:: 3.8
   Use bdist_wheel (wheel packages) instead.


.. % todo


:mod:`distutils.command.sdist` --- Build a source distribution
==============================================================

.. module:: distutils.command.sdist
   :synopsis: Build a source distribution


.. % todo


:mod:`distutils.command.build` --- Build all files of a package
===============================================================

.. module:: distutils.command.build
   :synopsis: Build all files of a package


.. % todo


:mod:`distutils.command.build_clib` --- Build any C libraries in a package
==========================================================================

.. module:: distutils.command.build_clib
   :synopsis: Build any C libraries in a package


.. % todo


:mod:`distutils.command.build_ext` --- Build any extensions in a package
========================================================================

.. module:: distutils.command.build_ext
   :synopsis: Build any extensions in a package


.. % todo


:mod:`distutils.command.build_py` --- Build the .py/.pyc files of a package
===========================================================================

.. module:: distutils.command.build_py
   :synopsis: Build the .py/.pyc files of a package


.. class:: build_py


:mod:`distutils.command.build_scripts` --- Build the scripts of a package
=========================================================================

.. module:: distutils.command.build_scripts
   :synopsis: Build the scripts of a package


.. % todo


:mod:`distutils.command.clean` --- Clean a package build area
=============================================================

.. module:: distutils.command.clean
   :synopsis: Clean a package build area

This command removes the temporary files created by :command:`build`
and its subcommands, like intermediary compiled object files.  With
the ``--all`` option, the complete build directory will be removed.

Extension modules built :ref:`in place <distutils-build-ext-inplace>`
will not be cleaned, as they are not in the build directory.


:mod:`distutils.command.config` --- Perform package configuration
=================================================================

.. module:: distutils.command.config
   :synopsis: Perform package configuration


.. % todo


:mod:`distutils.command.install` --- Install a package
======================================================

.. module:: distutils.command.install
   :synopsis: Install a package


.. % todo


:mod:`distutils.command.install_data` --- Install data files from a package
===========================================================================

.. module:: distutils.command.install_data
   :synopsis: Install data files from a package


.. % todo


:mod:`distutils.command.install_headers` --- Install C/C++ header files from a package
======================================================================================

.. module:: distutils.command.install_headers
   :synopsis: Install C/C++ header files from a package


.. % todo


:mod:`distutils.command.install_lib` --- Install library files from a package
=============================================================================

.. module:: distutils.command.install_lib
   :synopsis: Install library files from a package


.. % todo


:mod:`distutils.command.install_scripts` --- Install script files from a package
================================================================================

.. module:: distutils.command.install_scripts
   :synopsis: Install script files from a package


.. % todo


:mod:`distutils.command.register` --- Register a module with the Python Package Index
=====================================================================================

.. module:: distutils.command.register
   :synopsis: Register a module with the Python Package Index


The ``register`` command registers the package with the Python Package  Index.
This is described in more detail in :pep:`301`.

.. % todo


:mod:`distutils.command.check` --- Check the meta-data of a package
===================================================================

.. module:: distutils.command.check
   :synopsis: Check the meta-data of a package


The ``check`` command performs some tests on the meta-data of a package.
For example, it verifies that all required meta-data are provided as
the arguments passed to the :func:`~distutils.core.setup` function.

.. % todo
doc/alt-python38-setuptools/deprecated/distutils-legacy.rst000064400000002602151732726220020131 0ustar00Porting from Distutils
======================

Setuptools and the PyPA have a `stated goal <https://github.com/pypa/packaging-problems/issues/127>`_ to make Setuptools the reference API for distutils.

Since the 49.1.2 release, Setuptools includes a local, vendored copy of distutils (from late copies of CPython) that is disabled by default. To enable the use of this copy of distutils when invoking setuptools, set the enviroment variable:

	SETUPTOOLS_USE_DISTUTILS=local

This behavior is planned to become the default.

Prefer Setuptools
-----------------

As Distutils is deprecated, any usage of functions or objects from distutils is similarly discouraged, and Setuptools aims to replace or deprecate all such uses. This section describes the recommended replacements.

``distutils.core.setup`` → ``setuptools.setup``

``distutils.cmd.Command`` → ``setuptools.Command``

``distutils.log`` → (no replacement yet)

``distutils.version.*`` → ``packaging.version.*``

If a project relies on uses of ``distutils`` that do not have a suitable replacement above, please search the `Setuptools issue tracker <https://github.com/pypa/setuptools/issues/>`_ and file a request, describing the use-case so that Setuptools' maintainers can investigate. Please provide enough detail to help the maintainers understand how distutils is used, what value it provides, and why that behavior should be supported.
doc/alt-python38-setuptools/deprecated/functionalities.rst000064400000002652151732726220020050 0ustar00"Eggsecutable" Scripts
----------------------

.. deprecated:: 45.3.0

Occasionally, there are situations where it's desirable to make an ``.egg``
file directly executable.  You can do this by including an entry point such
as the following::

    setup(
        # other arguments here...
        entry_points={
            "setuptools.installation": [
                "eggsecutable = my_package.some_module:main_func",
            ]
        }
    )

Any eggs built from the above setup script will include a short executable
prelude that imports and calls ``main_func()`` from ``my_package.some_module``.
The prelude can be run on Unix-like platforms (including Mac and Linux) by
invoking the egg with ``/bin/sh``, or by enabling execute permissions on the
``.egg`` file.  For the executable prelude to run, the appropriate version of
Python must be available via the ``PATH`` environment variable, under its
"long" name.  That is, if the egg is built for Python 2.3, there must be a
``python2.3`` executable present in a directory on ``PATH``.

IMPORTANT NOTE: Eggs with an "eggsecutable" header cannot be renamed, or
invoked via symlinks.  They *must* be invoked using their original filename, in
order to ensure that, once running, ``pkg_resources`` will know what project
and version is in use.  The header script will check this and exit with an
error if the ``.egg`` file has been renamed or is invoked via a symlink that
changes its base name.doc/alt-python38-setuptools/deprecated/python_eggs.rst000064400000074337151732726220017207 0ustar00=====================================
The Internal Structure of Python Eggs
=====================================

STOP! This is not the first document you should read!



----------------------
Eggs and their Formats
----------------------

A "Python egg" is a logical structure embodying the release of a
specific version of a Python project, comprising its code, resources,
and metadata. There are multiple formats that can be used to physically
encode a Python egg, and others can be developed. However, a key
principle of Python eggs is that they should be discoverable and
importable. That is, it should be possible for a Python application to
easily and efficiently find out what eggs are present on a system, and
to ensure that the desired eggs' contents are importable.

There are two basic formats currently implemented for Python eggs:

1. ``.egg`` format: a directory or zipfile *containing* the project's
   code and resources, along with an ``EGG-INFO`` subdirectory that
   contains the project's metadata

2. ``.egg-info`` format: a file or directory placed *adjacent* to the
   project's code and resources, that directly contains the project's
   metadata.

Both formats can include arbitrary Python code and resources, including
static data files, package and non-package directories, Python
modules, C extension modules, and so on.  But each format is optimized
for different purposes.

The ``.egg`` format is well-suited to distribution and the easy
uninstallation or upgrades of code, since the project is essentially
self-contained within a single directory or file, unmingled with any
other projects' code or resources.  It also makes it possible to have
multiple versions of a project simultaneously installed, such that
individual programs can select the versions they wish to use.

The ``.egg-info`` format, on the other hand, was created to support
backward-compatibility, performance, and ease of installation for system
packaging tools that expect to install all projects' code and resources
to a single directory (e.g. ``site-packages``).  Placing the metadata
in that same directory simplifies the installation process, since it
isn't necessary to create ``.pth`` files or otherwise modify
``sys.path`` to include each installed egg.

Its disadvantage, however, is that it provides no support for clean
uninstallation or upgrades, and of course only a single version of a
project can be installed to a given directory. Thus, support from a
package management tool is required. (This is why setuptools' "install"
command refers to this type of egg installation as "single-version,
externally managed".)  Also, they lack sufficient data to allow them to
be copied from their installation source.  easy_install can "ship" an
application by copying ``.egg`` files or directories to a target
location, but it cannot do this for ``.egg-info`` installs, because
there is no way to tell what code and resources belong to a particular
egg -- there may be several eggs "scrambled" together in a single
installation location, and the ``.egg-info`` format does not currently
include a way to list the files that were installed.  (This may change
in a future version.)


Code and Resources
==================

The layout of the code and resources is dictated by Python's normal
import layout, relative to the egg's "base location".

For the ``.egg`` format, the base location is the ``.egg`` itself. That
is, adding the ``.egg`` filename or directory name to ``sys.path``
makes its contents importable.

For the ``.egg-info`` format, however, the base location is the
directory that *contains* the ``.egg-info``, and thus it is the
directory that must be added to ``sys.path`` to make the egg importable.
(Note that this means that the "normal" installation of a package to a
``sys.path`` directory is sufficient to make it an "egg" if it has an
``.egg-info`` file or directory installed alongside of it.)


Project Metadata
=================

If eggs contained only code and resources, there would of course be
no difference between them and any other directory or zip file on
``sys.path``.  Thus, metadata must also be included, using a metadata
file or directory.

For the ``.egg`` format, the metadata is placed in an ``EGG-INFO``
subdirectory, directly within the ``.egg`` file or directory.  For the
``.egg-info`` format, metadata is stored directly within the
``.egg-info`` directory itself.

The minimum project metadata that all eggs must have is a standard
Python ``PKG-INFO`` file, named ``PKG-INFO`` and placed within the
metadata directory appropriate to the format.  Because it's possible for
this to be the only metadata file included, ``.egg-info`` format eggs
are not required to be a directory; they can just be a ``.egg-info``
file that directly contains the ``PKG-INFO`` metadata.  This eliminates
the need to create a directory just to store one file.  This option is
*not* available for ``.egg`` formats, since setuptools always includes
other metadata.  (In fact, setuptools itself never generates
``.egg-info`` files, either; the support for using files was added so
that the requirement could easily be satisfied by other tools, such
as distutils).

In addition to the ``PKG-INFO`` file, an egg's metadata directory may
also include files and directories representing various forms of
optional standard metadata (see the section on `Standard Metadata`_,
below) or user-defined metadata required by the project.  For example,
some projects may define a metadata format to describe their application
plugins, and metadata in this format would then be included by plugin
creators in their projects' metadata directories.


Filename-Embedded Metadata
==========================

To allow introspection of installed projects and runtime resolution of
inter-project dependencies, a certain amount of information is embedded
in egg filenames.  At a minimum, this includes the project name, and
ideally will also include the project version number.  Optionally, it
can also include the target Python version and required runtime
platform if platform-specific C code is included.  The syntax of an
egg filename is as follows::

    name ["-" version ["-py" pyver ["-" required_platform]]] "." ext

The "name" and "version" should be escaped using the ``to_filename()``
function provided by ``pkg_resources``, after first processing them with
``safe_name()`` and ``safe_version()`` respectively.  These latter two
functions can also be used to later "unescape" these parts of the
filename.  (For a detailed description of these transformations, please
see the "Parsing Utilities" section of the ``pkg_resources`` manual.)

The "pyver" string is the Python major version, as found in the first
3 characters of ``sys.version``.  "required_platform" is essentially
a distutils ``get_platform()`` string, but with enhancements to properly
distinguish Mac OS versions.  (See the ``get_build_platform()``
documentation in the "Platform Utilities" section of the
``pkg_resources`` manual for more details.)

Finally, the "ext" is either ``.egg`` or ``.egg-info``, as appropriate
for the egg's format.

Normally, an egg's filename should include at least the project name and
version, as this allows the runtime system to find desired project
versions without having to read the egg's PKG-INFO to determine its
version number.

Setuptools, however, only includes the version number in the filename
when an ``.egg`` file is built using the ``bdist_egg`` command, or when
an ``.egg-info`` directory is being installed by the
``install_egg_info`` command. When generating metadata for use with the
original source tree, it only includes the project name, so that the
directory will not have to be renamed each time the project's version
changes.

This is especially important when version numbers change frequently, and
the source metadata directory is kept under version control with the
rest of the project.  (As would be the case when the project's source
includes project-defined metadata that is not generated from by
setuptools from data in the setup script.)


Egg Links
=========

In addition to the ``.egg`` and ``.egg-info`` formats, there is a third
egg-related extension that you may encounter on occasion: ``.egg-link``
files.

These files are not eggs, strictly speaking. They simply provide a way
to reference an egg that is not physically installed in the desired
location. They exist primarily as a cross-platform alternative to
symbolic links, to support "installing" code that is being developed in
a different location than the desired installation location. For
example, if a user is developing an application plugin in their home
directory, but the plugin needs to be "installed" in an application
plugin directory, running "setup.py develop -md /path/to/app/plugins"
will install an ``.egg-link`` file in ``/path/to/app/plugins``, that
tells the egg runtime system where to find the actual egg (the user's
project source directory and its ``.egg-info`` subdirectory).

``.egg-link`` files are named following the format for ``.egg`` and
``.egg-info`` names, but only the project name is included; no version,
Python version, or platform information is included.  When the runtime
searches for available eggs, ``.egg-link`` files are opened and the
actual egg file/directory name is read from them.

Each ``.egg-link`` file should contain a single file or directory name,
with no newlines.  This filename should be the base location of one or
more eggs.  That is, the name must either end in ``.egg``, or else it
should be the parent directory of one or more ``.egg-info`` format eggs.

As of setuptools 0.6c6, the path may be specified as a platform-independent
(i.e. ``/``-separated) relative path from the directory containing the
``.egg-link`` file, and a second line may appear in the file, specifying a
platform-independent relative path from the egg's base directory to its
setup script directory.  This allows installation tools such as EasyInstall
to find the project's setup directory and build eggs or perform other setup
commands on it.


-----------------
Standard Metadata
-----------------

In addition to the minimum required ``PKG-INFO`` metadata, projects can
include a variety of standard metadata files or directories, as
described below.  Except as otherwise noted, these files and directories
are automatically generated by setuptools, based on information supplied
in the setup script or through analysis of the project's code and
resources.

Most of these files and directories are generated via "egg-info
writers" during execution of the setuptools ``egg_info`` command, and
are listed in the ``egg_info.writers`` entry point group defined by
setuptools' own ``setup.py`` file.

Project authors can register their own metadata writers as entry points
in this group (as described in the setuptools manual under "Adding new
EGG-INFO Files") to cause setuptools to generate project-specific
metadata files or directories during execution of the ``egg_info``
command.  It is up to project authors to document these new metadata
formats, if they create any.


``.txt`` File Formats
=====================

Files described in this section that have ``.txt`` extensions have a
simple lexical format consisting of a sequence of text lines, each line
terminated by a linefeed character (regardless of platform).  Leading
and trailing whitespace on each line is ignored, as are blank lines and
lines whose first nonblank character is a ``#`` (comment symbol).  (This
is the parsing format defined by the ``yield_lines()`` function of
the ``pkg_resources`` module.)

All ``.txt`` files defined by this section follow this format, but some
are also "sectioned" files, meaning that their contents are divided into
sections, using square-bracketed section headers akin to Windows
``.ini`` format.  Note that this does *not* imply that the lines within
the sections follow an ``.ini`` format, however.  Please see an
individual metadata file's documentation for a description of what the
lines and section names mean in that particular file.

Sectioned files can be parsed using the ``split_sections()`` function;
see the "Parsing Utilities" section of the ``pkg_resources`` manual for
for details.


Dependency Metadata
===================


``requires.txt``
----------------

This is a "sectioned" text file.  Each section is a sequence of
"requirements", as parsed by the ``parse_requirements()`` function;
please see the ``pkg_resources`` manual for the complete requirement
parsing syntax.

The first, unnamed section (i.e., before the first section header) in
this file is the project's core requirements, which must be installed
for the project to function.  (Specified using the ``install_requires``
keyword to ``setup()``).

The remaining (named) sections describe the project's "extra"
requirements, as specified using the ``extras_require`` keyword to
``setup()``.  The section name is the name of the optional feature, and
the section body lists that feature's dependencies.

Note that it is not normally necessary to inspect this file directly;
``pkg_resources.Distribution`` objects have a ``requires()`` method
that can be used to obtain ``Requirement`` objects describing the
project's core and optional dependencies.


``setup_requires.txt``
----------------------

Much like ``requires.txt`` except represents the requirements
specified by the ``setup_requires`` parameter to the Distribution.


``dependency_links.txt``
------------------------

A list of dependency URLs, one per line, as specified using the
``dependency_links`` keyword to ``setup()``.  These may be direct
download URLs, or the URLs of web pages containing direct download
links. Please see the setuptools manual for more information on
specifying this option.


``depends.txt`` -- Obsolete, do not create!
-------------------------------------------

This file follows an identical format to ``requires.txt``, but is
obsolete and should not be used.  The earliest versions of setuptools
required users to manually create and maintain this file, so the runtime
still supports reading it, if it exists.  The new filename was created
so that it could be automatically generated from ``setup()`` information
without overwriting an existing hand-created ``depends.txt``, if one
was already present in the project's source ``.egg-info`` directory.


``namespace_packages.txt`` -- Namespace Package Metadata
========================================================

A list of namespace package names, one per line, as supplied to the
``namespace_packages`` keyword to ``setup()``.  Please see the manuals
for setuptools and ``pkg_resources`` for more information about
namespace packages.


``entry_points.txt`` -- "Entry Point"/Plugin Metadata
=====================================================

This is a "sectioned" text file, whose contents encode the
``entry_points`` keyword supplied to ``setup()``.  All sections are
named, as the section names specify the entry point groups in which the
corresponding section's entry points are registered.

Each section is a sequence of "entry point" lines, each parseable using
the ``EntryPoint.parse`` classmethod; please see the ``pkg_resources``
manual for the complete entry point parsing syntax.

Note that it is not necessary to parse this file directly; the
``pkg_resources`` module provides a variety of APIs to locate and load
entry points automatically.  Please see the setuptools and
``pkg_resources`` manuals for details on the nature and uses of entry
points.


The ``scripts`` Subdirectory
============================

This directory is currently only created for ``.egg`` files built by
the setuptools ``bdist_egg`` command.  It will contain copies of all
of the project's "traditional" scripts (i.e., those specified using the
``scripts`` keyword to ``setup()``).  This is so that they can be
reconstituted when an ``.egg`` file is installed.

The scripts are placed here using the distutils' standard
``install_scripts`` command, so any ``#!`` lines reflect the Python
installation where the egg was built.  But instead of copying the
scripts to the local script installation directory, EasyInstall writes
short wrapper scripts that invoke the original scripts from inside the
egg, after ensuring that sys.path includes the egg and any eggs it
depends on.  For more about `script wrappers`_, see the section below on
`Installation and Path Management Issues`_.


Zip Support Metadata
====================


``native_libs.txt``
-------------------

A list of C extensions and other dynamic link libraries contained in
the egg, one per line.  Paths are ``/``-separated and relative to the
egg's base location.

This file is generated as part of ``bdist_egg`` processing, and as such
only appears in ``.egg`` files (and ``.egg`` directories created by
unpacking them).  It is used to ensure that all libraries are extracted
from a zipped egg at the same time, in case there is any direct linkage
between them.  Please see the `Zip File Issues`_ section below for more
information on library and resource extraction from ``.egg`` files.


``eager_resources.txt``
-----------------------

A list of resource files and/or directories, one per line, as specified
via the ``eager_resources`` keyword to ``setup()``.  Paths are
``/``-separated and relative to the egg's base location.

Resource files or directories listed here will be extracted
simultaneously, if any of the named resources are extracted, or if any
native libraries listed in ``native_libs.txt`` are extracted.  Please
see the setuptools manual for details on what this feature is used for
and how it works, as well as the `Zip File Issues`_ section below.


``zip-safe`` and ``not-zip-safe``
---------------------------------

These are zero-length files, and either one or the other should exist.
If ``zip-safe`` exists, it means that the project will work properly
when installed as an ``.egg`` zipfile, and conversely the existence of
``not-zip-safe`` means the project should not be installed as an
``.egg`` file.  The ``zip_safe`` option to setuptools' ``setup()``
determines which file will be written. If the option isn't provided,
setuptools attempts to make its own assessment of whether the package
can work, based on code and content analysis.

If neither file is present at installation time, EasyInstall defaults
to assuming that the project should be unzipped.  (Command-line options
to EasyInstall, however, take precedence even over an existing
``zip-safe`` or ``not-zip-safe`` file.)

Note that these flag files appear only in ``.egg`` files generated by
``bdist_egg``, and in ``.egg`` directories created by unpacking such an
``.egg`` file.



``top_level.txt`` -- Conflict Management Metadata
=================================================

This file is a list of the top-level module or package names provided
by the project, one Python identifier per line.

Subpackages are not included; a project containing both a ``foo.bar``
and a ``foo.baz`` would include only one line, ``foo``, in its
``top_level.txt``.

This data is used by ``pkg_resources`` at runtime to issue a warning if
an egg is added to ``sys.path`` when its contained packages may have
already been imported.

(It was also once used to detect conflicts with non-egg packages at
installation time, but in more recent versions, setuptools installs eggs
in such a way that they always override non-egg packages, thus
preventing a problem from arising.)


``SOURCES.txt`` -- Source Files Manifest
========================================

This file is roughly equivalent to the distutils' ``MANIFEST`` file.
The differences are as follows:

* The filenames always use ``/`` as a path separator, which must be
  converted back to a platform-specific path whenever they are read.

* The file is automatically generated by setuptools whenever the
  ``egg_info`` or ``sdist`` commands are run, and it is *not*
  user-editable.

Although this metadata is included with distributed eggs, it is not
actually used at runtime for any purpose.  Its function is to ensure
that setuptools-built *source* distributions can correctly discover
what files are part of the project's source, even if the list had been
generated using revision control metadata on the original author's
system.

In other words, ``SOURCES.txt`` has little or no runtime value for being
included in distributed eggs, and it is possible that future versions of
the ``bdist_egg`` and ``install_egg_info`` commands will strip it before
installation or distribution.  Therefore, do not rely on its being
available outside of an original source directory or source
distribution.


------------------------------
Other Technical Considerations
------------------------------


Zip File Issues
===============

Although zip files resemble directories, they are not fully
substitutable for them.  Most platforms do not support loading dynamic
link libraries contained in zipfiles, so it is not possible to directly
import C extensions from ``.egg`` zipfiles.  Similarly, there are many
existing libraries -- whether in Python or C -- that require actual
operating system filenames, and do not work with arbitrary "file-like"
objects or in-memory strings, and thus cannot operate directly on the
contents of zip files.

To address these issues, the ``pkg_resources`` module provides a
"resource API" to support obtaining either the contents of a resource,
or a true operating system filename for the resource.  If the egg
containing the resource is a directory, the resource's real filename
is simply returned.  However, if the egg is a zipfile, then the
resource is first extracted to a cache directory, and the filename
within the cache is returned.

The cache directory is determined by the ``pkg_resources`` API; please
see the ``set_cache_path()`` and ``get_default_cache()`` documentation
for details.


The Extraction Process
----------------------

Resources are extracted to a cache subdirectory whose name is based
on the enclosing ``.egg`` filename and the path to the resource.  If
there is already a file of the correct name, size, and timestamp, its
filename is returned to the requester.  Otherwise, the desired file is
extracted first to a temporary name generated using
``mkstemp(".$extract",target_dir)``, and then its timestamp is set to
match the one in the zip file, before renaming it to its final name.
(Some collision detection and resolution code is used to handle the
fact that Windows doesn't overwrite files when renaming.)

If a resource directory is requested, all of its contents are
recursively extracted in this fashion, to ensure that the directory
name can be used as if it were valid all along.

If the resource requested for extraction is listed in the
``native_libs.txt`` or ``eager_resources.txt`` metadata files, then
*all* resources listed in *either* file will be extracted before the
requested resource's filename is returned, thus ensuring that all
C extensions and data used by them will be simultaneously available.


Extension Import Wrappers
-------------------------

Since Python's built-in zip import feature does not support loading
C extension modules from zipfiles, the setuptools ``bdist_egg`` command
generates special import wrappers to make it work.

The wrappers are ``.py`` files (along with corresponding ``.pyc``
and/or ``.pyo`` files) that have the same module name as the
corresponding C extension.  These wrappers are located in the same
package directory (or top-level directory) within the zipfile, so that
say, ``foomodule.so`` will get a corresponding ``foo.py``, while
``bar/baz.pyd`` will get a corresponding ``bar/baz.py``.

These wrapper files contain a short stanza of Python code that asks
``pkg_resources`` for the filename of the corresponding C extension,
then reloads the module using the obtained filename.  This will cause
``pkg_resources`` to first ensure that all of the egg's C extensions
(and any accompanying "eager resources") are extracted to the cache
before attempting to link to the C library.

Note, by the way, that ``.egg`` directories will also contain these
wrapper files.  However, Python's default import priority is such that
C extensions take precedence over same-named Python modules, so the
import wrappers are ignored unless the egg is a zipfile.


Installation and Path Management Issues
=======================================

Python's initial setup of ``sys.path`` is very dependent on the Python
version and installation platform, as well as how Python was started
(i.e., script vs. ``-c`` vs. ``-m`` vs. interactive interpreter).
In fact, Python also provides only two relatively robust ways to affect
``sys.path`` outside of direct manipulation in code: the ``PYTHONPATH``
environment variable, and ``.pth`` files.

However, with no cross-platform way to safely and persistently change
environment variables, this leaves ``.pth`` files as EasyInstall's only
real option for persistent configuration of ``sys.path``.

But ``.pth`` files are rather strictly limited in what they are allowed
to do normally.  They add directories only to the *end* of ``sys.path``,
after any locally-installed ``site-packages`` directory, and they are
only processed *in* the ``site-packages`` directory to start with.

This is a double whammy for users who lack write access to that
directory, because they can't create a ``.pth`` file that Python will
read, and even if a sympathetic system administrator adds one for them
that calls ``site.addsitedir()`` to allow some other directory to
contain ``.pth`` files, they won't be able to install newer versions of
anything that's installed in the systemwide ``site-packages``, because
their paths will still be added *after* ``site-packages``.

So EasyInstall applies two workarounds to solve these problems.

The first is that EasyInstall leverages ``.pth`` files' "import" feature
to manipulate ``sys.path`` and ensure that anything EasyInstall adds
to a ``.pth`` file will always appear before both the standard library
and the local ``site-packages`` directories.  Thus, it is always
possible for a user who can write a Python-read ``.pth`` file to ensure
that their packages come first in their own environment.

Second, when installing to a ``PYTHONPATH`` directory (as opposed to
a "site" directory like ``site-packages``) EasyInstall will also install
a special version of the ``site`` module.  Because it's in a
``PYTHONPATH`` directory, this module will get control before the
standard library version of ``site`` does.  It will record the state of
``sys.path`` before invoking the "real" ``site`` module, and then
afterwards it processes any ``.pth`` files found in ``PYTHONPATH``
directories, including all the fixups needed to ensure that eggs always
appear before the standard library in sys.path, but are in a relative
order to one another that is defined by their ``PYTHONPATH`` and
``.pth``-prescribed sequence.

The net result of these changes is that ``sys.path`` order will be
as follows at runtime:

1. The ``sys.argv[0]`` directory, or an empty string if no script
   is being executed.

2. All eggs installed by EasyInstall in any ``.pth`` file in each
   ``PYTHONPATH`` directory, in order first by ``PYTHONPATH`` order,
   then normal ``.pth`` processing order (which is to say alphabetical
   by ``.pth`` filename, then by the order of listing within each
   ``.pth`` file).

3. All eggs installed by EasyInstall in any ``.pth`` file in each "site"
   directory (such as ``site-packages``), following the same ordering
   rules as for the ones on ``PYTHONPATH``.

4. The ``PYTHONPATH`` directories themselves, in their original order

5. Any paths from ``.pth`` files found on ``PYTHONPATH`` that were *not*
   eggs installed by EasyInstall, again following the same relative
   ordering rules.

6. The standard library and "site" directories, along with the contents
   of any ``.pth`` files found in the "site" directories.

Notice that sections 1, 4, and 6 comprise the "normal" Python setup for
``sys.path``.  Sections 2 and 3 are inserted to support eggs, and
section 5 emulates what the "normal" semantics of ``.pth`` files on
``PYTHONPATH`` would be if Python natively supported them.

For further discussion of the tradeoffs that went into this design, as
well as notes on the actual magic inserted into ``.pth`` files to make
them do these things, please see also the following messages to the
distutils-SIG mailing list:

* http://mail.python.org/pipermail/distutils-sig/2006-February/006026.html
* http://mail.python.org/pipermail/distutils-sig/2006-March/006123.html


Script Wrappers
---------------

EasyInstall never directly installs a project's original scripts to
a script installation directory.  Instead, it writes short wrapper
scripts that first ensure that the project's dependencies are active
on sys.path, before invoking the original script.  These wrappers
have a #! line that points to the version of Python that was used to
install them, and their second line is always a comment that indicates
the type of script wrapper, the project version required for the script
to run, and information identifying the script to be invoked.

The format of this marker line is::

    "# EASY-INSTALL-" script_type ": " tuple_of_strings "\n"

The ``script_type`` is one of ``SCRIPT``, ``DEV-SCRIPT``, or
``ENTRY-SCRIPT``.  The ``tuple_of_strings`` is a comma-separated
sequence of Python string constants.  For ``SCRIPT`` and ``DEV-SCRIPT``
wrappers, there are two strings: the project version requirement, and
the script name (as a filename within the ``scripts`` metadata
directory).  For ``ENTRY-SCRIPT`` wrappers, there are three:
the project version requirement, the entry point group name, and the
entry point name.  (See the "Automatic Script Creation" section in the
setuptools manual for more information about entry point scripts.)

In each case, the project version requirement string will be a string
parseable with the ``pkg_resources`` modules' ``Requirement.parse()``
classmethod.  The only difference between a ``SCRIPT`` wrapper and a
``DEV-SCRIPT`` is that a ``DEV-SCRIPT`` actually executes the original
source script in the project's source tree, and is created when the
"setup.py develop" command is run.  A ``SCRIPT`` wrapper, on the other
hand, uses the "installed" script written to the ``EGG-INFO/scripts``
subdirectory of the corresponding ``.egg`` zipfile or directory.
(``.egg-info`` eggs do not have script wrappers associated with them,
except in the "setup.py develop" case.)

The purpose of including the marker line in generated script wrappers is
to facilitate introspection of installed scripts, and their relationship
to installed eggs.  For example, an uninstallation tool could use this
data to identify what scripts can safely be removed, and/or identify
what scripts would stop working if a particular egg is uninstalled.
doc/alt-python38-setuptools/pkg_resources.rst000064400000270160151732726220015424 0ustar00=============================================================
Package Discovery and Resource Access using ``pkg_resources``
=============================================================

The ``pkg_resources`` module distributed with ``setuptools`` provides an API
for Python libraries to access their resource files, and for extensible
applications and frameworks to automatically discover plugins.  It also
provides runtime support for using C extensions that are inside zipfile-format
eggs, support for merging packages that have separately-distributed modules or
subpackages, and APIs for managing Python's current "working set" of active
packages.

Use of ``pkg_resources`` is discouraged in favor of
`importlib.resources <https://docs.python.org/3/library/importlib.html#module-importlib.resources>`_,
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_,
and their backports (`resources <https://pypi.org/project/importlib_resources>`_,
`metadata <https://pypi.org/project/importlib_metadata>`_).
Please consider using those libraries instead of pkg_resources.


--------
Overview
--------

The ``pkg_resources`` module provides runtime facilities for finding,
introspecting, activating and using installed Python distributions. Some
of the more advanced features (notably the support for parallel installation
of multiple versions) rely specifically on the "egg" format (either as a
zip archive or subdirectory), while others (such as plugin discovery) will
work correctly so long as "egg-info" metadata directories are available for
relevant distributions.

Eggs are a distribution format for Python modules, similar in concept to
Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
However, unlike a pure distribution format, eggs can also be installed and
added directly to ``sys.path`` as an import location. When installed in
this way, eggs are *discoverable*, meaning that they carry metadata that
unambiguously identifies their contents and dependencies. This means that
an installed egg can be *automatically* found and added to ``sys.path`` in
response to simple requests of the form, "get me everything I need to use
docutils' PDF support". This feature allows mutually conflicting versions of
a distribution to co-exist in the same Python installation, with individual
applications activating the desired version at runtime by manipulating the
contents of ``sys.path`` (this differs from the virtual environment
approach, which involves creating isolated environments for each
application).

The following terms are needed in order to explain the capabilities offered
by this module:

project
    A library, framework, script, plugin, application, or collection of data
    or other resources, or some combination thereof.  Projects are assumed to
    have "relatively unique" names, e.g. names registered with PyPI.

release
    A snapshot of a project at a particular point in time, denoted by a version
    identifier.

distribution
    A file or files that represent a particular release.

importable distribution
    A file or directory that, if placed on ``sys.path``, allows Python to
    import any modules contained within it.

pluggable distribution
    An importable distribution whose filename unambiguously identifies its
    release (i.e. project and version), and whose contents unambiguously
    specify what releases of other projects will satisfy its runtime
    requirements.

extra
    An "extra" is an optional feature of a release, that may impose additional
    runtime requirements.  For example, if docutils PDF support required a
    PDF support library to be present, docutils could define its PDF support as
    an "extra", and list what other project releases need to be available in
    order to provide it.

environment
    A collection of distributions potentially available for importing, but not
    necessarily active.  More than one distribution (i.e. release version) for
    a given project may be present in an environment.

working set
    A collection of distributions actually available for importing, as on
    ``sys.path``.  At most one distribution (release version) of a given
    project may be present in a working set, as otherwise there would be
    ambiguity as to what to import.

eggs
    Eggs are pluggable distributions in one of the three formats currently
    supported by ``pkg_resources``.  There are built eggs, development eggs,
    and egg links.  Built eggs are directories or zipfiles whose name ends
    with ``.egg`` and follows the egg naming conventions, and contain an
    ``EGG-INFO`` subdirectory (zipped or otherwise).  Development eggs are
    normal directories of Python code with one or more ``ProjectName.egg-info``
    subdirectories. The development egg format is also used to provide a
    default version of a distribution that is available to software that
    doesn't use ``pkg_resources`` to request specific versions. Egg links
    are ``*.egg-link`` files that contain the name of a built or
    development egg, to support symbolic linking on platforms that do not
    have native symbolic links (or where the symbolic link support is
    limited).

(For more information about these terms and concepts, see also this
`architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)

.. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html


.. -----------------
.. Developer's Guide
.. -----------------

.. This section isn't written yet.  Currently planned topics include
    Accessing Resources
    Finding and Activating Package Distributions
        get_provider()
        require()
        WorkingSet
        iter_distributions
    Running Scripts
    Configuration
    Namespace Packages
    Extensible Applications and Frameworks
        Locating entry points
        Activation listeners
        Metadata access
        Extended Discovery and Installation
    Supporting Custom PEP 302 Implementations
.. For now, please check out the extensive `API Reference`_ below.


-------------
API Reference
-------------

Namespace Package Support
=========================

A namespace package is a package that only contains other packages and modules,
with no direct contents of its own.  Such packages can be split across
multiple, separately-packaged distributions.  They are normally used to split
up large packages produced by a single organization, such as in the ``zope``
namespace package for Zope Corporation packages, and the ``peak`` namespace
package for the Python Enterprise Application Kit.

To create a namespace package, you list it in the ``namespace_packages``
argument to ``setup()``, in your project's ``setup.py``.  (See the
:ref:`setuptools documentation on namespace packages <Namespace Packages>` for
more information on this.)  Also, you must add a ``declare_namespace()`` call
in the package's ``__init__.py`` file(s):

``declare_namespace(name)``
    Declare that the dotted package name ``name`` is a "namespace package" whose
    contained packages and modules may be spread across multiple distributions.
    The named package's ``__path__`` will be extended to include the
    corresponding package in all distributions on ``sys.path`` that contain a
    package of that name.  (More precisely, if an importer's
    ``find_module(name)`` returns a loader, then it will also be searched for
    the package's contents.)  Whenever a Distribution's ``activate()`` method
    is invoked, it checks for the presence of namespace packages and updates
    their ``__path__`` contents accordingly.

Applications that manipulate namespace packages or directly alter ``sys.path``
at runtime may also need to use this API function:

``fixup_namespace_packages(path_item)``
    Declare that ``path_item`` is a newly added item on ``sys.path`` that may
    need to be used to update existing namespace packages.  Ordinarily, this is
    called for you when an egg is automatically added to ``sys.path``, but if
    your application modifies ``sys.path`` to include locations that may
    contain portions of a namespace package, you will need to call this
    function to ensure they are added to the existing namespace packages.

Although by default ``pkg_resources`` only supports namespace packages for
filesystem and zip importers, you can extend its support to other "importers"
compatible with PEP 302 using the ``register_namespace_handler()`` function.
See the section below on `Supporting Custom Importers`_ for details.


``WorkingSet`` Objects
======================

The ``WorkingSet`` class provides access to a collection of "active"
distributions.  In general, there is only one meaningful ``WorkingSet``
instance: the one that represents the distributions that are currently active
on ``sys.path``.  This global instance is available under the name
``working_set`` in the ``pkg_resources`` module.  However, specialized
tools may wish to manipulate working sets that don't correspond to
``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.

It's important to note that the global ``working_set`` object is initialized
from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs.  If
you manually modify ``sys.path``, you must invoke the appropriate methods on
the ``working_set`` instance to keep it in sync.  Unfortunately, Python does
not provide any way to detect arbitrary changes to a list object like
``sys.path``, so ``pkg_resources`` cannot automatically update the
``working_set`` based on changes to ``sys.path``.

``WorkingSet(entries=None)``
    Create a ``WorkingSet`` from an iterable of path entries.  If ``entries``
    is not supplied, it defaults to the value of ``sys.path`` at the time
    the constructor is called.

    Note that you will not normally construct ``WorkingSet`` instances
    yourself, but instead you will implicitly or explicitly use the global
    ``working_set`` instance.  For the most part, the ``pkg_resources`` API
    is designed so that the ``working_set`` is used by default, such that you
    don't have to explicitly refer to it most of the time.

All distributions available directly on ``sys.path`` will be activated
automatically when ``pkg_resources`` is imported. This behaviour can cause
version conflicts for applications which require non-default versions of
those distributions. To handle this situation, ``pkg_resources`` checks for a
``__requires__`` attribute in the ``__main__`` module when initializing the
default working set, and uses this to ensure a suitable version of each
affected distribution is activated. For example::

    __requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
    import pkg_resources


Basic ``WorkingSet`` Methods
----------------------------

The following methods of ``WorkingSet`` objects are also available as module-
level functions in ``pkg_resources`` that apply to the default ``working_set``
instance.  Thus, you can use e.g. ``pkg_resources.require()`` as an
abbreviation for ``pkg_resources.working_set.require()``:


``require(*requirements)``
    Ensure that distributions matching ``requirements`` are activated

    ``requirements`` must be a string or a (possibly-nested) sequence
    thereof, specifying the distributions and versions required.  The
    return value is a sequence of the distributions that needed to be
    activated to fulfill the requirements; all relevant distributions are
    included, even if they were already activated in this working set.

    For the syntax of requirement specifiers, see the section below on
    `Requirements Parsing`_.

    In general, it should not be necessary for you to call this method
    directly.  It's intended more for use in quick-and-dirty scripting and
    interactive interpreter hacking than for production use. If you're creating
    an actual library or application, it's strongly recommended that you create
    a "setup.py" script using ``setuptools``, and declare all your requirements
    there.  That way, tools like pip can automatically detect what requirements
    your package has, and deal with them accordingly.

    Note that calling ``require('SomePackage')`` will not install
    ``SomePackage`` if it isn't already present.  If you need to do this, you
    should use the ``resolve()`` method instead, which allows you to pass an
    ``installer`` callback that will be invoked when a needed distribution
    can't be found on the local machine.  You can then have this callback
    display a dialog, automatically download the needed distribution, or
    whatever else is appropriate for your application. See the documentation
    below on the ``resolve()`` method for more information, and also on the
    ``obtain()`` method of ``Environment`` objects.

``run_script(requires, script_name)``
    Locate distribution specified by ``requires`` and run its ``script_name``
    script.  ``requires`` must be a string containing a requirement specifier.
    (See `Requirements Parsing`_ below for the syntax.)

    The script, if found, will be executed in *the caller's globals*.  That's
    because this method is intended to be called from wrapper scripts that
    act as a proxy for the "real" scripts in a distribution.  A wrapper script
    usually doesn't need to do anything but invoke this function with the
    correct arguments.

    If you need more control over the script execution environment, you
    probably want to use the ``run_script()`` method of a ``Distribution``
    object's `Metadata API`_ instead.

``iter_entry_points(group, name=None)``
    Yield entry point objects from ``group`` matching ``name``

    If ``name`` is None, yields all entry points in ``group`` from all
    distributions in the working set, otherwise only ones matching both
    ``group`` and ``name`` are yielded.  Entry points are yielded from the active
    distributions in the order that the distributions appear in the working
    set.  (For the global ``working_set``, this should be the same as the order
    that they are listed in ``sys.path``.)  Note that within the entry points
    advertised by an individual distribution, there is no particular ordering.

    Please see the section below on `Entry Points`_ for more information.


``WorkingSet`` Methods and Attributes
-------------------------------------

These methods are used to query or manipulate the contents of a specific
working set, so they must be explicitly invoked on a particular ``WorkingSet``
instance:

``add_entry(entry)``
    Add a path item to the ``entries``, finding any distributions on it.  You
    should use this when you add additional items to ``sys.path`` and you want
    the global ``working_set`` to reflect the change.  This method is also
    called by the ``WorkingSet()`` constructor during initialization.

    This method uses ``find_distributions(entry,True)`` to find distributions
    corresponding to the path entry, and then ``add()`` them.  ``entry`` is
    always appended to the ``entries`` attribute, even if it is already
    present, however. (This is because ``sys.path`` can contain the same value
    more than once, and the ``entries`` attribute should be able to reflect
    this.)

``__contains__(dist)``
    True if ``dist`` is active in this ``WorkingSet``.  Note that only one
    distribution for a given project can be active in a given ``WorkingSet``.

``__iter__()``
    Yield distributions for non-duplicate projects in the working set.
    The yield order is the order in which the items' path entries were
    added to the working set.

``find(req)``
    Find a distribution matching ``req`` (a ``Requirement`` instance).
    If there is an active distribution for the requested project, this
    returns it, as long as it meets the version requirement specified by
    ``req``.  But, if there is an active distribution for the project and it
    does *not* meet the ``req`` requirement, ``VersionConflict`` is raised.
    If there is no active distribution for the requested project, ``None``
    is returned.

``resolve(requirements, env=None, installer=None)``
    List all distributions needed to (recursively) meet ``requirements``

    ``requirements`` must be a sequence of ``Requirement`` objects.  ``env``,
    if supplied, should be an ``Environment`` instance.  If
    not supplied, an ``Environment`` is created from the working set's
    ``entries``.  ``installer``, if supplied, will be invoked with each
    requirement that cannot be met by an already-installed distribution; it
    should return a ``Distribution`` or ``None``.  (See the ``obtain()`` method
    of `Environment Objects`_, below, for more information on the ``installer``
    argument.)

``add(dist, entry=None)``
    Add ``dist`` to working set, associated with ``entry``

    If ``entry`` is unspecified, it defaults to ``dist.location``.  On exit from
    this routine, ``entry`` is added to the end of the working set's ``.entries``
    (if it wasn't already present).

    ``dist`` is only added to the working set if it's for a project that
    doesn't already have a distribution active in the set.  If it's
    successfully added, any  callbacks registered with the ``subscribe()``
    method will be called.  (See `Receiving Change Notifications`_, below.)

    Note: ``add()`` is automatically called for you by the ``require()``
    method, so you don't normally need to use this method directly.

``entries``
    This attribute represents a "shadow" ``sys.path``, primarily useful for
    debugging.  If you are experiencing import problems, you should check
    the global ``working_set`` object's ``entries`` against ``sys.path``, to
    ensure that they match.  If they do not, then some part of your program
    is manipulating ``sys.path`` without updating the ``working_set``
    accordingly.  IMPORTANT NOTE: do not directly manipulate this attribute!
    Setting it equal to ``sys.path`` will not fix your problem, any more than
    putting black tape over an "engine warning" light will fix your car!  If
    this attribute is out of sync with ``sys.path``, it's merely an *indicator*
    of the problem, not the cause of it.


Receiving Change Notifications
------------------------------

Extensible applications and frameworks may need to receive notification when
a new distribution (such as a plug-in component) has been added to a working
set.  This is what the ``subscribe()`` method and ``add_activation_listener()``
function are for.

``subscribe(callback)``
    Invoke ``callback(distribution)`` once for each active distribution that is
    in the set now, or gets added later.  Because the callback is invoked for
    already-active distributions, you do not need to loop over the working set
    yourself to deal with the existing items; just register the callback and
    be prepared for the fact that it will be called immediately by this method.

    Note that callbacks *must not* allow exceptions to propagate, or they will
    interfere with the operation of other callbacks and possibly result in an
    inconsistent working set state.  Callbacks should use a try/except block
    to ignore, log, or otherwise process any errors, especially since the code
    that caused the callback to be invoked is unlikely to be able to handle
    the errors any better than the callback itself.

``pkg_resources.add_activation_listener()`` is an alternate spelling of
``pkg_resources.working_set.subscribe()``.


Locating Plugins
----------------

Extensible applications will sometimes have a "plugin directory" or a set of
plugin directories, from which they want to load entry points or other
metadata.  The ``find_plugins()`` method allows you to do this, by scanning an
environment for the newest version of each project that can be safely loaded
without conflicts or missing requirements.

``find_plugins(plugin_env, full_env=None, fallback=True)``
   Scan ``plugin_env`` and identify which distributions could be added to this
   working set without version conflicts or missing requirements.

   Example usage::

       distributions, errors = working_set.find_plugins(
           Environment(plugin_dirlist)
       )
       map(working_set.add, distributions)  # add plugins+libs to sys.path
       print "Couldn't load", errors        # display errors

   The ``plugin_env`` should be an ``Environment`` instance that contains only
   distributions that are in the project's "plugin directory" or directories.
   The ``full_env``, if supplied, should be an ``Environment`` instance that
   contains all currently-available distributions.

   If ``full_env`` is not supplied, one is created automatically from the
   ``WorkingSet`` this method is called on, which will typically mean that
   every directory on ``sys.path`` will be scanned for distributions.

   This method returns a 2-tuple: (``distributions``, ``error_info``), where
   ``distributions`` is a list of the distributions found in ``plugin_env`` that
   were loadable, along with any other distributions that are needed to resolve
   their dependencies.  ``error_info`` is a dictionary mapping unloadable plugin
   distributions to an exception instance describing the error that occurred.
   Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
   instance.

   Most applications will use this method mainly on the master ``working_set``
   instance in ``pkg_resources``, and then immediately add the returned
   distributions to the working set so that they are available on sys.path.
   This will make it possible to find any entry points, and allow any other
   metadata tracking and hooks to be activated.

   The resolution algorithm used by ``find_plugins()`` is as follows.  First,
   the project names of the distributions present in ``plugin_env`` are sorted.
   Then, each project's eggs are tried in descending version order (i.e.,
   newest version first).

   An attempt is made to resolve each egg's dependencies. If the attempt is
   successful, the egg and its dependencies are added to the output list and to
   a temporary copy of the working set.  The resolution process continues with
   the next project name, and no older eggs for that project are tried.

   If the resolution attempt fails, however, the error is added to the error
   dictionary.  If the ``fallback`` flag is true, the next older version of the
   plugin is tried, until a working version is found.  If false, the resolution
   process continues with the next plugin project name.

   Some applications may have stricter fallback requirements than others. For
   example, an application that has a database schema or persistent objects
   may not be able to safely downgrade a version of a package. Others may want
   to ensure that a new plugin configuration is either 100% good or else
   revert to a known-good configuration.  (That is, they may wish to revert to
   a known configuration if the ``error_info`` return value is non-empty.)

   Note that this algorithm gives precedence to satisfying the dependencies of
   alphabetically prior project names in case of version conflicts. If two
   projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
   of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
   disabled due to version conflict.


``Environment`` Objects
=======================

An "environment" is a collection of ``Distribution`` objects, usually ones
that are present and potentially importable on the current platform.
``Environment`` objects are used by ``pkg_resources`` to index available
distributions during dependency resolution.

``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
    Create an environment snapshot by scanning ``search_path`` for distributions
    compatible with ``platform`` and ``python``.  ``search_path`` should be a
    sequence of strings such as might be used on ``sys.path``.  If a
    ``search_path`` isn't supplied, ``sys.path`` is used.

    ``platform`` is an optional string specifying the name of the platform
    that platform-specific distributions must be compatible with.  If
    unspecified, it defaults to the current platform.  ``python`` is an
    optional string naming the desired version of Python (e.g. ``'2.4'``);
    it defaults to the currently-running version.

    You may explicitly set ``platform`` (and/or ``python``) to ``None`` if you
    wish to include *all* distributions, not just those compatible with the
    running platform or Python version.

    Note that ``search_path`` is scanned immediately for distributions, and the
    resulting ``Environment`` is a snapshot of the found distributions.  It
    is not automatically updated if the system's state changes due to e.g.
    installation or removal of distributions.

``__getitem__(project_name)``
    Returns a list of distributions for the given project name, ordered
    from newest to oldest version.  (And highest to lowest format precedence
    for distributions that contain the same version of the project.)  If there
    are no distributions for the project, returns an empty list.

``__iter__()``
    Yield the unique project names of the distributions in this environment.
    The yielded names are always in lower case.

``add(dist)``
    Add ``dist`` to the environment if it matches the platform and python version
    specified at creation time, and only if the distribution hasn't already
    been added. (i.e., adding the same distribution more than once is a no-op.)

``remove(dist)``
    Remove ``dist`` from the environment.

``can_add(dist)``
    Is distribution ``dist`` acceptable for this environment?  If it's not
    compatible with the ``platform`` and ``python`` version values specified
    when the environment was created, a false value is returned.

``__add__(dist_or_env)``  (``+`` operator)
    Add a distribution or environment to an ``Environment`` instance, returning
    a *new* environment object that contains all the distributions previously
    contained by both.  The new environment will have a ``platform`` and
    ``python`` of ``None``, meaning that it will not reject any distributions
    from being added to it; it will simply accept whatever is added.  If you
    want the added items to be filtered for platform and Python version, or
    you want to add them to the *same* environment instance, you should use
    in-place addition (``+=``) instead.

``__iadd__(dist_or_env)``  (``+=`` operator)
    Add a distribution or environment to an ``Environment`` instance
    *in-place*, updating the existing instance and returning it.  The
    ``platform`` and ``python`` filter attributes take effect, so distributions
    in the source that do not have a suitable platform string or Python version
    are silently ignored.

``best_match(req, working_set, installer=None)``
    Find distribution best matching ``req`` and usable on ``working_set``

    This calls the ``find(req)`` method of the ``working_set`` to see if a
    suitable distribution is already active.  (This may raise
    ``VersionConflict`` if an unsuitable version of the project is already
    active in the specified ``working_set``.)  If a suitable distribution isn't
    active, this method returns the newest distribution in the environment
    that meets the ``Requirement`` in ``req``.  If no suitable distribution is
    found, and ``installer`` is supplied, then the result of calling
    the environment's ``obtain(req, installer)`` method will be returned.

``obtain(requirement, installer=None)``
    Obtain a distro that matches requirement (e.g. via download).  In the
    base ``Environment`` class, this routine just returns
    ``installer(requirement)``, unless ``installer`` is None, in which case
    None is returned instead.  This method is a hook that allows subclasses
    to attempt other ways of obtaining a distribution before falling back
    to the ``installer`` argument.

``scan(search_path=None)``
    Scan ``search_path`` for distributions usable on ``platform``

    Any distributions found are added to the environment.  ``search_path`` should
    be a sequence of strings such as might be used on ``sys.path``.  If not
    supplied, ``sys.path`` is used.  Only distributions conforming to
    the platform/python version defined at initialization are added.  This
    method is a shortcut for using the ``find_distributions()`` function to
    find the distributions from each item in ``search_path``, and then calling
    ``add()`` to add each one to the environment.


``Requirement`` Objects
=======================

``Requirement`` objects express what versions of a project are suitable for
some purpose.  These objects (or their string form) are used by various
``pkg_resources`` APIs in order to find distributions that a script or
distribution needs.


Requirements Parsing
--------------------

``parse_requirements(s)``
    Yield ``Requirement`` objects for a string or iterable of lines.  Each
    requirement must start on a new line.  See below for syntax.

``Requirement.parse(s)``
    Create a ``Requirement`` object from a string or iterable of lines.  A
    ``ValueError`` is raised if the string or lines do not contain a valid
    requirement specifier, or if they contain more than one specifier.  (To
    parse multiple specifiers from a string or iterable of strings, use
    ``parse_requirements()`` instead.)

    The syntax of a requirement specifier is defined in full in PEP 508.

    Some examples of valid requirement specifiers::

        FooProject >= 1.2
        Fizzy [foo, bar]
        PickyThing>1.6,<=1.9,!=1.8.6
        SomethingWhoseVersionIDontCareAbout
        SomethingWithMarker[foo]>1.0;python_version<"2.7"

    The project name is the only required portion of a requirement string, and
    if it's the only thing supplied, the requirement will accept any version
    of that project.

    The "extras" in a requirement are used to request optional features of a
    project, that may require additional project distributions in order to
    function.  For example, if the hypothetical "Report-O-Rama" project offered
    optional PDF support, it might require an additional library in order to
    provide that support.  Thus, a project needing Report-O-Rama's PDF features
    could use a requirement of ``Report-O-Rama[PDF]`` to request installation
    or activation of both Report-O-Rama and any libraries it needs in order to
    provide PDF support.  For example, you could use::

        pip install Report-O-Rama[PDF]

    To install the necessary packages using pip, or call
    ``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
    distributions to sys.path at runtime.

    The "markers" in a requirement are used to specify when a requirement
    should be installed -- the requirement will be installed if the marker
    evaluates as true in the current environment. For example, specifying
    ``argparse;python_version<"3.0"`` will not install in an Python 3
    environment, but will in a Python 2 environment.

``Requirement`` Methods and Attributes
--------------------------------------

``__contains__(dist_or_version)``
    Return true if ``dist_or_version`` fits the criteria for this requirement.
    If ``dist_or_version`` is a ``Distribution`` object, its project name must
    match the requirement's project name, and its version must meet the
    requirement's version criteria.  If ``dist_or_version`` is a string, it is
    parsed using the ``parse_version()`` utility function.  Otherwise, it is
    assumed to be an already-parsed version.

    The ``Requirement`` object's version specifiers (``.specs``) are internally
    sorted into ascending version order, and used to establish what ranges of
    versions are acceptable.  Adjacent redundant conditions are effectively
    consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
    ``"<2,<3"`` produces the same results as ``"<2"``). ``"!="`` versions are
    excised from the ranges they fall within.  The version being tested for
    acceptability is then checked for membership in the resulting ranges.

``__eq__(other_requirement)``
    A requirement compares equal to another requirement if they have
    case-insensitively equal project names, version specifiers, and "extras".
    (The order that extras and version specifiers are in is also ignored.)
    Equal requirements also have equal hashes, so that requirements can be
    used in sets or as dictionary keys.

``__str__()``
    The string form of a ``Requirement`` is a string that, if passed to
    ``Requirement.parse()``, would return an equal ``Requirement`` object.

``project_name``
    The name of the required project

``key``
    An all-lowercase version of the ``project_name``, useful for comparison
    or indexing.

``extras``
    A tuple of names of "extras" that this requirement calls for.  (These will
    be all-lowercase and normalized using the ``safe_extra()`` parsing utility
    function, so they may not exactly equal the extras the requirement was
    created with.)

``specs``
    A list of ``(op,version)`` tuples, sorted in ascending parsed-version
    order.  The ``op`` in each tuple is a comparison operator, represented as
    a string.  The ``version`` is the (unparsed) version number.

``marker``
    An instance of ``packaging.markers.Marker`` that allows evaluation
    against the current environment. May be None if no marker specified.

``url``
    The location to download the requirement from if specified.

Entry Points
============

Entry points are a simple way for distributions to "advertise" Python objects
(such as functions or classes) for use by other distributions.  Extensible
applications and frameworks can search for entry points with a particular name
or group, either from a specific distribution or from all active distributions
on sys.path, and then inspect or load the advertised objects at will.

Entry points belong to "groups" which are named with a dotted name similar to
a Python package or module name.  For example, the ``setuptools`` package uses
an entry point named ``distutils.commands`` in order to find commands defined
by distutils extensions.  ``setuptools`` treats the names of entry points
defined in that group as the acceptable commands for a setup script.

In a similar way, other packages can define their own entry point groups,
either using dynamic names within the group (like ``distutils.commands``), or
possibly using predefined names within the group.  For example, a blogging
framework that offers various pre- or post-publishing hooks might define an
entry point group and look for entry points named "pre_process" and
"post_process" within that group.

To advertise an entry point, a project needs to use ``setuptools`` and provide
an ``entry_points`` argument to ``setup()`` in its setup script, so that the
entry points will be included in the distribution's metadata.  For more
details, see :ref:`Advertising Behavior<dynamic discovery of services and plugins>`.

Each project distribution can advertise at most one entry point of a given
name within the same entry point group.  For example, a distutils extension
could advertise two different ``distutils.commands`` entry points, as long as
they had different names.  However, there is nothing that prevents *different*
projects from advertising entry points of the same name in the same group.  In
some cases, this is a desirable thing, since the application or framework that
uses the entry points may be calling them as hooks, or in some other way
combining them.  It is up to the application or framework to decide what to do
if multiple distributions advertise an entry point; some possibilities include
using both entry points, displaying an error message, using the first one found
in sys.path order, etc.


Convenience API
---------------

In the following functions, the ``dist`` argument can be a ``Distribution``
instance, a ``Requirement`` instance, or a string specifying a requirement
(i.e. project name, version, etc.).  If the argument is a string or
``Requirement``, the specified distribution is located (and added to sys.path
if not already present).  An error will be raised if a matching distribution is
not available.

The ``group`` argument should be a string containing a dotted identifier,
identifying an entry point group.  If you are defining an entry point group,
you should include some portion of your package's name in the group name so as
to avoid collision with other packages' entry point groups.

``load_entry_point(dist, group, name)``
    Load the named entry point from the specified distribution, or raise
    ``ImportError``.

``get_entry_info(dist, group, name)``
    Return an ``EntryPoint`` object for the given ``group`` and ``name`` from
    the specified distribution.  Returns ``None`` if the distribution has not
    advertised a matching entry point.

``get_entry_map(dist, group=None)``
    Return the distribution's entry point map for ``group``, or the full entry
    map for the distribution.  This function always returns a dictionary,
    even if the distribution advertises no entry points.  If ``group`` is given,
    the dictionary maps entry point names to the corresponding ``EntryPoint``
    object.  If ``group`` is None, the dictionary maps group names to
    dictionaries that then map entry point names to the corresponding
    ``EntryPoint`` instance in that group.

``iter_entry_points(group, name=None)``
    Yield entry point objects from ``group`` matching ``name``.

    If ``name`` is None, yields all entry points in ``group`` from all
    distributions in the working set on sys.path, otherwise only ones matching
    both ``group`` and ``name`` are yielded.  Entry points are yielded from
    the active distributions in the order that the distributions appear on
    sys.path.  (Within entry points for a particular distribution, however,
    there is no particular ordering.)

    (This API is actually a method of the global ``working_set`` object; see
    the section above on `Basic WorkingSet Methods`_ for more information.)


Creating and Parsing
--------------------

``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
    Create an ``EntryPoint`` instance.  ``name`` is the entry point name.  The
    ``module_name`` is the (dotted) name of the module containing the advertised
    object.  ``attrs`` is an optional tuple of names to look up from the
    module to obtain the advertised object.  For example, an ``attrs`` of
    ``("foo","bar")`` and a ``module_name`` of ``"baz"`` would mean that the
    advertised object could be obtained by the following code::

        import baz
        advertised_object = baz.foo.bar

    The ``extras`` are an optional tuple of "extra feature" names that the
    distribution needs in order to provide this entry point.  When the
    entry point is loaded, these extra features are looked up in the ``dist``
    argument to find out what other distributions may need to be activated
    on sys.path; see the ``load()`` method for more details.  The ``extras``
    argument is only meaningful if ``dist`` is specified.  ``dist`` must be
    a ``Distribution`` instance.

``EntryPoint.parse(src, dist=None)`` (classmethod)
    Parse a single entry point from string ``src``

    Entry point syntax follows the form::

        name = some.module:some.attr [extra1,extra2]

    The entry name and module name are required, but the ``:attrs`` and
    ``[extras]`` parts are optional, as is the whitespace shown between
    some of the items.  The ``dist`` argument is passed through to the
    ``EntryPoint()`` constructor, along with the other values parsed from
    ``src``.

``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
    Parse ``lines`` (a string or sequence of lines) to create a dictionary
    mapping entry point names to ``EntryPoint`` objects.  ``ValueError`` is
    raised if entry point names are duplicated, if ``group`` is not a valid
    entry point group name, or if there are any syntax errors.  (Note: the
    ``group`` parameter is used only for validation and to create more
    informative error messages.)  If ``dist`` is provided, it will be used to
    set the ``dist`` attribute of the created ``EntryPoint`` objects.

``EntryPoint.parse_map(data, dist=None)`` (classmethod)
    Parse ``data`` into a dictionary mapping group names to dictionaries mapping
    entry point names to ``EntryPoint`` objects.  If ``data`` is a dictionary,
    then the keys are used as group names and the values are passed to
    ``parse_group()`` as the ``lines`` argument.  If ``data`` is a string or
    sequence of lines, it is first split into .ini-style sections (using
    the ``split_sections()`` utility function) and the section names are used
    as group names.  In either case, the ``dist`` argument is passed through to
    ``parse_group()`` so that the entry points will be linked to the specified
    distribution.


``EntryPoint`` Objects
----------------------

For simple introspection, ``EntryPoint`` objects have attributes that
correspond exactly to the constructor argument names: ``name``,
``module_name``, ``attrs``, ``extras``, and ``dist`` are all available.  In
addition, the following methods are provided:

``load()``
    Load the entry point, returning the advertised Python object.  Effectively
    calls ``self.require()`` then returns ``self.resolve()``.

``require(env=None, installer=None)``
    Ensure that any "extras" needed by the entry point are available on
    sys.path.  ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
    but no ``dist``, or if the named extras are not defined by the
    distribution.  If ``env`` is supplied, it must be an ``Environment``, and it
    will be used to search for needed distributions if they are not already
    present on sys.path.  If ``installer`` is supplied, it must be a callable
    taking a ``Requirement`` instance and returning a matching importable
    ``Distribution`` instance or None.

``resolve()``
    Resolve the entry point from its module and attrs, returning the advertised
    Python object. Raises ``ImportError`` if it cannot be obtained.

``__str__()``
    The string form of an ``EntryPoint`` is a string that could be passed to
    ``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.


``Distribution`` Objects
========================

``Distribution`` objects represent collections of Python code that may or may
not be importable, and may or may not have metadata and resources associated
with them.  Their metadata may include information such as what other projects
the distribution depends on, what entry points the distribution advertises, and
so on.


Getting or Creating Distributions
---------------------------------

Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
an ``Environment``.  (See the sections above on `WorkingSet Objects`_ and
`Environment Objects`_, which are containers for active distributions and
available distributions, respectively.)  You can also obtain ``Distribution``
objects from one of these high-level APIs:

``find_distributions(path_item, only=False)``
    Yield distributions accessible via ``path_item``.  If ``only`` is true, yield
    only distributions whose ``location`` is equal to ``path_item``.  In other
    words, if ``only`` is true, this yields any distributions that would be
    importable if ``path_item`` were on ``sys.path``.  If ``only`` is false, this
    also yields distributions that are "in" or "under" ``path_item``, but would
    not be importable unless their locations were also added to ``sys.path``.

``get_distribution(dist_spec)``
    Return a ``Distribution`` object for a given ``Requirement`` or string.
    If ``dist_spec`` is already a ``Distribution`` instance, it is returned.
    If it is a ``Requirement`` object or a string that can be parsed into one,
    it is used to locate and activate a matching distribution, which is then
    returned.

However, if you're creating specialized tools for working with distributions,
or creating a new distribution format, you may also need to create
``Distribution`` objects directly, using one of the three constructors below.

These constructors all take an optional ``metadata`` argument, which is used to
access any resources or metadata associated with the distribution.  ``metadata``
must be an object that implements the ``IResourceProvider`` interface, or None.
If it is None, an ``EmptyProvider`` is used instead.  ``Distribution`` objects
implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
delegating them to the ``metadata`` object.

``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
    Create a distribution for ``location``, which must be a string such as a
    URL, filename, or other string that might be used on ``sys.path``.
    ``basename`` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
    If ``basename`` ends with ``.egg``, then the project's name, version, python
    version and platform are extracted from the filename and used to set those
    properties of the created distribution.  Any additional keyword arguments
    are forwarded to the ``Distribution()`` constructor.

``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
    Create a distribution by parsing a local filename.  This is a shorter way
    of saying  ``Distribution.from_location(normalize_path(filename),
    os.path.basename(filename), metadata)``.  In other words, it creates a
    distribution whose location is the normalize form of the filename, parsing
    name and version information from the base portion of the filename.  Any
    additional keyword arguments are forwarded to the ``Distribution()``
    constructor.

``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
    Create a distribution by setting its properties.  All arguments are
    optional and default to None, except for ``py_version`` (which defaults to
    the current Python version) and ``precedence`` (which defaults to
    ``EGG_DIST``; for more details see ``precedence`` under `Distribution
    Attributes`_ below).  Note that it's usually easier to use the
    ``from_filename()`` or ``from_location()`` constructors than to specify
    all these arguments individually.


``Distribution`` Attributes
---------------------------

location
    A string indicating the distribution's location.  For an importable
    distribution, this is the string that would be added to ``sys.path`` to
    make it actively importable.  For non-importable distributions, this is
    simply a filename, URL, or other way of locating the distribution.

project_name
    A string, naming the project that this distribution is for.  Project names
    are defined by a project's setup script, and they are used to identify
    projects on PyPI.  When a ``Distribution`` is constructed, the
    ``project_name`` argument is passed through the ``safe_name()`` utility
    function to filter out any unacceptable characters.

key
    ``dist.key`` is short for ``dist.project_name.lower()``.  It's used for
    case-insensitive comparison and indexing of distributions by project name.

extras
    A list of strings, giving the names of extra features defined by the
    project's dependency list (the ``extras_require`` argument specified in
    the project's setup script).

version
    A string denoting what release of the project this distribution contains.
    When a ``Distribution`` is constructed, the ``version`` argument is passed
    through the ``safe_version()`` utility function to filter out any
    unacceptable characters.  If no ``version`` is specified at construction
    time, then attempting to access this attribute later will cause the
    ``Distribution`` to try to discover its version by reading its ``PKG-INFO``
    metadata file.  If ``PKG-INFO`` is unavailable or can't be parsed,
    ``ValueError`` is raised.

parsed_version
    The ``parsed_version`` is an object representing a "parsed" form of the
    distribution's ``version``.  ``dist.parsed_version`` is a shortcut for
    calling ``parse_version(dist.version)``.  It is used to compare or sort
    distributions by version.  (See the `Parsing Utilities`_ section below for
    more information on the ``parse_version()`` function.)  Note that accessing
    ``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
    was constructed without a ``version`` and without ``metadata`` capable of
    supplying the missing version info.

py_version
    The major/minor Python version the distribution supports, as a string.
    For example, "2.7" or "3.4".  The default is the current version of Python.

platform
    A string representing the platform the distribution is intended for, or
    ``None`` if the distribution is "pure Python" and therefore cross-platform.
    See `Platform Utilities`_ below for more information on platform strings.

precedence
    A distribution's ``precedence`` is used to determine the relative order of
    two distributions that have the same ``project_name`` and
    ``parsed_version``.  The default precedence is ``pkg_resources.EGG_DIST``,
    which is the highest (i.e. most preferred) precedence.  The full list
    of predefined precedences, from most preferred to least preferred, is:
    ``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
    ``DEVELOP_DIST``.  Normally, precedences other than ``EGG_DIST`` are used
    only by the ``setuptools.package_index`` module, when sorting distributions
    found in a package index to determine their suitability for installation.
    "System" and "Development" eggs (i.e., ones that use the ``.egg-info``
    format), however, are automatically given a precedence of ``DEVELOP_DIST``.



``Distribution`` Methods
------------------------

``activate(path=None)``
    Ensure distribution is importable on ``path``.  If ``path`` is None,
    ``sys.path`` is used instead.  This ensures that the distribution's
    ``location`` is in the ``path`` list, and it also performs any necessary
    namespace package fixups or declarations.  (That is, if the distribution
    contains namespace packages, this method ensures that they are declared,
    and that the distribution's contents for those namespace packages are
    merged with the contents provided by any other active distributions.  See
    the section above on `Namespace Package Support`_ for more information.)

    ``pkg_resources`` adds a notification callback to the global ``working_set``
    that ensures this method is called whenever a distribution is added to it.
    Therefore, you should not normally need to explicitly call this method.
    (Note that this means that namespace packages on ``sys.path`` are always
    imported as soon as ``pkg_resources`` is, which is another reason why
    namespace packages should not contain any code or import statements.)

``as_requirement()``
    Return a ``Requirement`` instance that matches this distribution's project
    name and version.

``requires(extras=())``
    List the ``Requirement`` objects that specify this distribution's
    dependencies.  If ``extras`` is specified, it should be a sequence of names
    of "extras" defined by the distribution, and the list returned will then
    include any dependencies needed to support the named "extras".

``clone(**kw)``
    Create a copy of the distribution.  Any supplied keyword arguments override
    the corresponding argument to the ``Distribution()`` constructor, allowing
    you to change some of the copied distribution's attributes.

``egg_name()``
    Return what this distribution's standard filename should be, not including
    the ".egg" extension.  For example, a distribution for project "Foo"
    version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
    of ``Foo-1.2-py2.3-win32``.  Any dashes in the name or version are
    converted to underscores.  (``Distribution.from_location()`` will convert
    them back when parsing a ".egg" file name.)

``__cmp__(other)``, ``__hash__()``
    Distribution objects are hashed and compared on the basis of their parsed
    version and precedence, followed by their key (lowercase project name),
    location, Python version, and platform.

The following methods are used to access ``EntryPoint`` objects advertised
by the distribution.  See the section above on `Entry Points`_ for more
detailed information about these operations:

``get_entry_info(group, name)``
    Return the ``EntryPoint`` object for ``group`` and ``name``, or None if no
    such point is advertised by this distribution.

``get_entry_map(group=None)``
    Return the entry point map for ``group``.  If ``group`` is None, return
    a dictionary mapping group names to entry point maps for all groups.
    (An entry point map is a dictionary of entry point names to ``EntryPoint``
    objects.)

``load_entry_point(group, name)``
    Short for ``get_entry_info(group, name).load()``.  Returns the object
    advertised by the named entry point, or raises ``ImportError`` if
    the entry point isn't advertised by this distribution, or there is some
    other import problem.

In addition to the above methods, ``Distribution`` objects also implement all
of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
documented in later sections):

* ``has_metadata(name)``
* ``metadata_isdir(name)``
* ``metadata_listdir(name)``
* ``get_metadata(name)``
* ``get_metadata_lines(name)``
* ``run_script(script_name, namespace)``
* ``get_resource_filename(manager, resource_name)``
* ``get_resource_stream(manager, resource_name)``
* ``get_resource_string(manager, resource_name)``
* ``has_resource(resource_name)``
* ``resource_isdir(resource_name)``
* ``resource_listdir(resource_name)``

If the distribution was created with a ``metadata`` argument, these resource and
metadata access methods are all delegated to that ``metadata`` provider.
Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
will appear to have no resources or metadata.  This delegation approach is used
so that supporting custom importers or new distribution formats can be done
simply by creating an appropriate `IResourceProvider`_ implementation; see the
section below on `Supporting Custom Importers`_ for more details.

.. _ResourceManager API:

``ResourceManager`` API
=======================

The ``ResourceManager`` class provides uniform access to package resources,
whether those resources exist as files and directories or are compressed in
an archive of some kind.

Normally, you do not need to create or explicitly manage ``ResourceManager``
instances, as the ``pkg_resources`` module creates a global instance for you,
and makes most of its methods available as top-level names in the
``pkg_resources`` module namespace.  So, for example, this code actually
calls the ``resource_string()`` method of the global ``ResourceManager``::

    import pkg_resources
    my_data = pkg_resources.resource_string(__name__, "foo.dat")

Thus, you can use the APIs below without needing an explicit
``ResourceManager`` instance; just import and use them as needed.


Basic Resource Access
---------------------

In the following methods, the ``package_or_requirement`` argument may be either
a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
If it is a package or module name, the named module or package must be
importable (i.e., be in a distribution or directory on ``sys.path``), and the
``resource_name`` argument is interpreted relative to the named package.  (Note
that if a module name is used, then the resource name is relative to the
package immediately containing the named module.  Also, you should not use use
a namespace package name, because a namespace package can be spread across
multiple distributions, and is therefore ambiguous as to which distribution
should be searched for the resource.)

If it is a ``Requirement``, then the requirement is automatically resolved
(searching the current ``Environment`` if necessary) and a matching
distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
already present.  (Unless the ``Requirement`` can't be satisfied, in which
case an exception is raised.)  The ``resource_name`` argument is then interpreted
relative to the root of the identified distribution; i.e. its first path
segment will be treated as a peer of the top-level modules or packages in the
distribution.

Note that resource names must be ``/``-separated paths rooted at the package,
cannot contain relative names like ``".."``, and cannot be absolute.  Do *not* use
``os.path`` routines to manipulate resource paths, as they are *not* filesystem
paths.

``resource_exists(package_or_requirement, resource_name)``
    Does the named resource exist?  Return ``True`` or ``False`` accordingly.

``resource_stream(package_or_requirement, resource_name)``
    Return a readable file-like object for the specified resource; it may be
    an actual file, a ``StringIO``, or some similar object.  The stream is
    in "binary mode", in the sense that whatever bytes are in the resource
    will be read as-is.

``resource_string(package_or_requirement, resource_name)``
    Return the specified resource as a string.  The resource is read in
    binary fashion, such that the returned string contains exactly the bytes
    that are stored in the resource.

``resource_isdir(package_or_requirement, resource_name)``
    Is the named resource a directory?  Return ``True`` or ``False``
    accordingly.

``resource_listdir(package_or_requirement, resource_name)``
    List the contents of the named resource directory, just like ``os.listdir``
    except that it works even if the resource is in a zipfile.

Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
as to the resource type.  You cannot use ``resource_listdir()`` on a file
resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
directory resources.  Using an inappropriate method for the resource type may
result in an exception or undefined behavior, depending on the platform and
distribution format involved.


Resource Extraction
-------------------

``resource_filename(package_or_requirement, resource_name)``
    Sometimes, it is not sufficient to access a resource in string or stream
    form, and a true filesystem filename is needed.  In such cases, you can
    use this method (or module-level function) to obtain a filename for a
    resource.  If the resource is in an archive distribution (such as a zipped
    egg), it will be extracted to a cache directory, and the filename within
    the cache will be returned.  If the named resource is a directory, then
    all resources within that directory (including subdirectories) are also
    extracted.  If the named resource is a C extension or "eager resource"
    (see the ``setuptools`` documentation for details), then all C extensions
    and eager resources are extracted at the same time.

    Archived resources are extracted to a cache location that can be managed by
    the following two methods:

``set_extraction_path(path)``
    Set the base path where resources will be extracted to, if needed.

    If you do not call this routine before any extractions take place, the
    path defaults to the return value of ``get_default_cache()``.  (Which is
    based on the ``PYTHON_EGG_CACHE`` environment variable, with various
    platform-specific fallbacks.  See that routine's documentation for more
    details.)

    Resources are extracted to subdirectories of this path based upon
    information given by the resource provider.  You may set this to a
    temporary directory, but then you must call ``cleanup_resources()`` to
    delete the extracted files when done.  There is no guarantee that
    ``cleanup_resources()`` will be able to remove all extracted files.  (On
    Windows, for example, you can't unlink .pyd or .dll files that are still
    in use.)

    Note that you may not change the extraction path for a given resource
    manager once resources have been extracted, unless you first call
    ``cleanup_resources()``.

``cleanup_resources(force=False)``
    Delete all extracted resource files and directories, returning a list
    of the file and directory names that could not be successfully removed.
    This function does not have any concurrency protection, so it should
    generally only be called when the extraction path is a temporary
    directory exclusive to a single process.  This method is not
    automatically called; you must call it explicitly or register it as an
    ``atexit`` function if you wish to ensure cleanup of a temporary
    directory used for extractions.


"Provider" Interface
--------------------

If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
for a new distribution archive format, you may need to use the following
``IResourceManager`` methods to coordinate extraction of resources to the
filesystem.  If you're not implementing an archive format, however, you have
no need to use these methods.  Unlike the other methods listed above, they are
*not* available as top-level functions tied to the global ``ResourceManager``;
you must therefore have an explicit ``ResourceManager`` instance to use them.

``get_cache_path(archive_name, names=())``
    Return absolute location in cache for ``archive_name`` and ``names``

    The parent directory of the resulting path will be created if it does
    not already exist.  ``archive_name`` should be the base filename of the
    enclosing egg (which may not be the name of the enclosing zipfile!),
    including its ".egg" extension.  ``names``, if provided, should be a
    sequence of path name parts "under" the egg's extraction location.

    This method should only be called by resource providers that need to
    obtain an extraction location, and only for names they intend to
    extract, as it tracks the generated names for possible cleanup later.

``extraction_error()``
    Raise an ``ExtractionError`` describing the active exception as interfering
    with the extraction process.  You should call this if you encounter any
    OS errors extracting the file to the cache path; it will format the
    operating system exception for you, and add other information to the
    ``ExtractionError`` instance that may be needed by programs that want to
    wrap or handle extraction errors themselves.

``postprocess(tempname, filename)``
    Perform any platform-specific postprocessing of ``tempname``.
    Resource providers should call this method ONLY after successfully
    extracting a compressed resource.  They must NOT call it on resources
    that are already in the filesystem.

    ``tempname`` is the current (temporary) name of the file, and ``filename``
    is the name it will be renamed to by the caller after this routine
    returns.


Metadata API
============

The metadata API is used to access metadata resources bundled in a pluggable
distribution.  Metadata resources are virtual files or directories containing
information about the distribution, such as might be used by an extensible
application or framework to connect "plugins".  Like other kinds of resources,
metadata resource names are ``/``-separated and should not contain ``..`` or
begin with a ``/``.  You should not use ``os.path`` routines to manipulate
resource paths.

The metadata API is provided by objects implementing the ``IMetadataProvider``
or ``IResourceProvider`` interfaces.  ``Distribution`` objects implement this
interface, as do objects returned by the ``get_provider()`` function:

``get_provider(package_or_requirement)``
    If a package name is supplied, return an ``IResourceProvider`` for the
    package.  If a ``Requirement`` is supplied, resolve it by returning a
    ``Distribution`` from the current working set (searching the current
    ``Environment`` if necessary and adding the newly found ``Distribution``
    to the working set).  If the named package can't be imported, or the
    ``Requirement`` can't be satisfied, an exception is raised.

    NOTE: if you use a package name rather than a ``Requirement``, the object
    you get back may not be a pluggable distribution, depending on the method
    by which the package was installed.  In particular, "development" packages
    and "single-version externally-managed" packages do not have any way to
    map from a package name to the corresponding project's metadata.  Do not
    write code that passes a package name to ``get_provider()`` and then tries
    to retrieve project metadata from the returned object.  It may appear to
    work when the named package is in an ``.egg`` file or directory, but
    it will fail in other installation scenarios.  If you want project
    metadata, you need to ask for a *project*, not a package.


``IMetadataProvider`` Methods
-----------------------------

The methods provided by objects (such as ``Distribution`` instances) that
implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:

``has_metadata(name)``
    Does the named metadata resource exist?

``metadata_isdir(name)``
    Is the named metadata resource a directory?

``metadata_listdir(name)``
    List of metadata names in the directory (like ``os.listdir()``)

``get_metadata(name)``
    Return the named metadata resource as a string.  The data is read in binary
    mode; i.e., the exact bytes of the resource file are returned.

``get_metadata_lines(name)``
    Yield named metadata resource as list of non-blank non-comment lines.  This
    is short for calling ``yield_lines(provider.get_metadata(name))``.  See the
    section on `yield_lines()`_ below for more information on the syntax it
    recognizes.

``run_script(script_name, namespace)``
    Execute the named script in the supplied namespace dictionary.  Raises
    ``ResolutionError`` if there is no script by that name in the ``scripts``
    metadata directory.  ``namespace`` should be a Python dictionary, usually
    a module dictionary if the script is being run as a module.


Exceptions
==========

``pkg_resources`` provides a simple exception hierarchy for problems that may
occur when processing requests to locate and activate packages::

    ResolutionError
        DistributionNotFound
        VersionConflict
        UnknownExtra

    ExtractionError

``ResolutionError``
    This class is used as a base class for the other three exceptions, so that
    you can catch all of them with a single "except" clause.  It is also raised
    directly for miscellaneous requirement-resolution problems like trying to
    run a script that doesn't exist in the distribution it was requested from.

``DistributionNotFound``
    A distribution needed to fulfill a requirement could not be found.

``VersionConflict``
    The requested version of a project conflicts with an already-activated
    version of the same project.

``UnknownExtra``
    One of the "extras" requested was not recognized by the distribution it
    was requested from.

``ExtractionError``
    A problem occurred extracting a resource to the Python Egg cache.  The
    following attributes are available on instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail


Supporting Custom Importers
===========================

By default, ``pkg_resources`` supports normal filesystem imports, and
``zipimport`` importers.  If you wish to use the ``pkg_resources`` features
with other (PEP 302-compatible) importers or module loaders, you may need to
register various handlers and support functions using these APIs:

``register_finder(importer_type, distribution_finder)``
    Register ``distribution_finder`` to find distributions in ``sys.path`` items.
    ``importer_type`` is the type or class of a PEP 302 "Importer" (``sys.path``
    item handler), and ``distribution_finder`` is a callable that, when passed a
    path item, the importer instance, and an ``only`` flag, yields
    ``Distribution`` instances found under that path item.  (The ``only`` flag,
    if true, means the finder should yield only ``Distribution`` objects whose
    ``location`` is equal to the path item provided.)

    See the source of the ``pkg_resources.find_on_path`` function for an
    example finder function.

``register_loader_type(loader_type, provider_factory)``
    Register ``provider_factory`` to make ``IResourceProvider`` objects for
    ``loader_type``.  ``loader_type`` is the type or class of a PEP 302
    ``module.__loader__``, and ``provider_factory`` is a function that, when
    passed a module object, returns an `IResourceProvider`_ for that module,
    allowing it to be used with the `ResourceManager API`_.

``register_namespace_handler(importer_type, namespace_handler)``
    Register ``namespace_handler`` to declare namespace packages for the given
    ``importer_type``.  ``importer_type`` is the type or class of a PEP 302
    "importer" (sys.path item handler), and ``namespace_handler`` is a callable
    with a signature like this::

        def namespace_handler(importer, path_entry, moduleName, module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the relevant importer object has
    already agreed that it can handle the relevant path item.  The handler
    should only return a subpath if the module ``__path__`` does not already
    contain an equivalent subpath.  Otherwise, it should return None.

    For an example namespace handler, see the source of the
    ``pkg_resources.file_ns_handler`` function, which is used for both zipfile
    importing and regular importing.


IResourceProvider
-----------------

``IResourceProvider`` is an abstract class that documents what methods are
required of objects returned by a ``provider_factory`` registered with
``register_loader_type()``.  ``IResourceProvider`` is a subclass of
``IMetadataProvider``, so objects that implement this interface must also
implement all of the `IMetadataProvider Methods`_ as well as the methods
shown here.  The ``manager`` argument to the methods below must be an object
that supports the full `ResourceManager API`_ documented above.

``get_resource_filename(manager, resource_name)``
    Return a true filesystem path for ``resource_name``, coordinating the
    extraction with ``manager``, if the resource must be unpacked to the
    filesystem.

``get_resource_stream(manager, resource_name)``
    Return a readable file-like object for ``resource_name``.

``get_resource_string(manager, resource_name)``
    Return a string containing the contents of ``resource_name``.

``has_resource(resource_name)``
    Does the package contain the named resource?

``resource_isdir(resource_name)``
    Is the named resource a directory?  Return a false value if the resource
    does not exist or is not a directory.

``resource_listdir(resource_name)``
    Return a list of the contents of the resource directory, ala
    ``os.listdir()``.  Requesting the contents of a non-existent directory may
    raise an exception.

Note, by the way, that your provider classes need not (and should not) subclass
``IResourceProvider`` or ``IMetadataProvider``!  These classes exist solely
for documentation purposes and do not provide any useful implementation code.
You may instead wish to subclass one of the `built-in resource providers`_.


Built-in Resource Providers
---------------------------

``pkg_resources`` includes several provider classes that are automatically used
where appropriate.  Their inheritance tree looks like this::

    NullProvider
        EggProvider
            DefaultProvider
                PathMetadata
            ZipProvider
                EggMetadata
        EmptyProvider
            FileMetadata


``NullProvider``
    This provider class is just an abstract base that provides for common
    provider behaviors (such as running scripts), given a definition for just
    a few abstract methods.

``EggProvider``
    This provider class adds in some egg-specific features that are common
    to zipped and unzipped eggs.

``DefaultProvider``
    This provider class is used for unpacked eggs and "plain old Python"
    filesystem modules.

``ZipProvider``
    This provider class is used for all zipped modules, whether they are eggs
    or not.

``EmptyProvider``
    This provider class always returns answers consistent with a provider that
    has no metadata or resources.  ``Distribution`` objects created without
    a ``metadata`` argument use an instance of this provider class instead.
    Since all ``EmptyProvider`` instances are equivalent, there is no need
    to have more than one instance.  ``pkg_resources`` therefore creates a
    global instance of this class under the name ``empty_provider``, and you
    may use it if you have need of an ``EmptyProvider`` instance.

``PathMetadata(path, egg_info)``
    Create an ``IResourceProvider`` for a filesystem-based distribution, where
    ``path`` is the filesystem location of the importable modules, and ``egg_info``
    is the filesystem location of the distribution's metadata directory.
    ``egg_info`` should usually be the ``EGG-INFO`` subdirectory of ``path`` for an
    "unpacked egg", and a ``ProjectName.egg-info`` subdirectory of ``path`` for
    a "development egg".  However, other uses are possible for custom purposes.

``EggMetadata(zipimporter)``
    Create an ``IResourceProvider`` for a zipfile-based distribution.  The
    ``zipimporter`` should be a ``zipimport.zipimporter`` instance, and may
    represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
    a specific egg *within* a basket, or a zipfile egg (where the zipfile
    itself is a ".egg").  It can also be a combination, such as a zipfile egg
    that also contains other eggs.

``FileMetadata(path_to_pkg_info)``
    Create an ``IResourceProvider`` that provides exactly one metadata
    resource: ``PKG-INFO``.  The supplied path should be a distutils PKG-INFO
    file.  This is basically the same as an ``EmptyProvider``, except that
    requests for ``PKG-INFO`` will be answered using the contents of the
    designated file.  (This provider is used to wrap ``.egg-info`` files
    installed by vendor-supplied system packages.)


Utility Functions
=================

In addition to its high-level APIs, ``pkg_resources`` also includes several
generally-useful utility routines.  These routines are used to implement the
high-level APIs, but can also be quite useful by themselves.


Parsing Utilities
-----------------

``parse_version(version)``
    Parsed a project's version string as defined by PEP 440. The returned
    value will be an object that represents the version. These objects may
    be compared to each other and sorted. The sorting algorithm is as defined
    by PEP 440 with the addition that any version which is not a valid PEP 440
    version will be considered less than any valid PEP 440 version and the
    invalid versions will continue sorting using the original algorithm.

.. _yield_lines():

``yield_lines(strs)``
    Yield non-empty/non-comment lines from a string/unicode or a possibly-
    nested sequence thereof.  If ``strs`` is an instance of ``basestring``, it
    is split into lines, and each non-blank, non-comment line is yielded after
    stripping leading and trailing whitespace.  (Lines whose first non-blank
    character is ``#`` are considered comment lines.)

    If ``strs`` is not an instance of ``basestring``, it is iterated over, and
    each item is passed recursively to ``yield_lines()``, so that an arbitrarily
    nested sequence of strings, or sequences of sequences of strings can be
    flattened out to the lines contained therein.  So for example, passing
    a file object or a list of strings to ``yield_lines`` will both work.
    (Note that between each string in a sequence of strings there is assumed to
    be an implicit line break, so lines cannot bridge two strings in a
    sequence.)

    This routine is used extensively by ``pkg_resources`` to parse metadata
    and file formats of various kinds, and most other ``pkg_resources``
    parsing functions that yield multiple values will use it to break up their
    input.  However, this routine is idempotent, so calling ``yield_lines()``
    on the output of another call to ``yield_lines()`` is completely harmless.

``split_sections(strs)``
    Split a string (or possibly-nested iterable thereof), yielding ``(section,
    content)`` pairs found using an ``.ini``-like syntax.  Each ``section`` is
    a whitespace-stripped version of the section name ("``[section]``")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any non-blank, non-comment lines before
    the first section header, they're yielded in a first ``section`` of
    ``None``.

    This routine uses ``yield_lines()`` as its front end, so you can pass in
    anything that ``yield_lines()`` accepts, such as an open text file, string,
    or sequence of strings.  ``ValueError`` is raised if a malformed section
    header is found (i.e. a line starting with ``[`` but not ending with
    ``]``).

    Note that this simplistic parser assumes that any line whose first nonblank
    character is ``[`` is a section heading, so it can't support .ini format
    variations that allow ``[`` as the first nonblank character on other lines.

``safe_name(name)``
    Return a "safe" form of a project's name, suitable for use in a
    ``Requirement`` string, as a distribution name, or a PyPI project name.
    All non-alphanumeric runs are condensed to single "-" characters, such that
    a name like "The $$$ Tree" becomes "The-Tree".  Note that if you are
    generating a filename from this value you should combine it with a call to
    ``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
    See ``to_filename()``.

``safe_version(version)``
    This will return the normalized form of any PEP 440 version. If the version
    string is not PEP 440 compatible, this function behaves similar to
    ``safe_name()`` except that spaces in the input become dots, and dots are
    allowed to exist in the output.  As with ``safe_name()``, if you are
    generating a filename from this you should replace any "-" characters in
    the output with underscores.

``safe_extra(extra)``
    Return a "safe" form of an extra's name, suitable for use in a requirement
    string or a setup script's ``extras_require`` keyword.  This routine is
    similar to ``safe_name()`` except that non-alphanumeric runs are replaced
    by a single underbar (``_``), and the result is lowercased.

``to_filename(name_or_version)``
    Escape a name or version string so it can be used in a dash-separated
    filename (or ``#egg=name-version`` tag) without ambiguity.  You
    should only pass in values that were returned by ``safe_name()`` or
    ``safe_version()``.


Platform Utilities
------------------

``get_build_platform()``
    Return this platform's identifier string.  For Windows, the return value
    is ``"win32"``, and for macOS it is a string of the form
    ``"macosx-10.4-ppc"``.  All other platforms return the same uname-based
    string that the ``distutils.util.get_platform()`` function returns.
    This string is the minimum platform version required by distributions built
    on the local machine.  (Backward compatibility note: setuptools versions
    prior to 0.6b1 called this function ``get_platform()``, and the function is
    still available under that name for backward compatibility reasons.)

``get_supported_platform()`` (New in 0.6b1)
    This is the similar to ``get_build_platform()``, but is the maximum
    platform version that the local machine supports.  You will usually want
    to use this value as the ``provided`` argument to the
    ``compatible_platforms()`` function.

``compatible_platforms(provided, required)``
    Return true if a distribution built on the ``provided`` platform may be used
    on the ``required`` platform.  If either platform value is ``None``, it is
    considered a wildcard, and the platforms are therefore compatible.
    Likewise, if the platform strings are equal, they're also considered
    compatible, and ``True`` is returned.  Currently, the only non-equal
    platform strings that are considered compatible are macOS platform
    strings with the same hardware type (e.g. ``ppc``) and major version
    (e.g. ``10``) with the ``provided`` platform's minor version being less than
    or equal to the ``required`` platform's minor version.

``get_default_cache()``
    Determine the default cache location for extracting resources from zipped
    eggs.  This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
    if set.  Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
    the user's "Application Data" directory.  On all other systems, it returns
    ``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
    set.


PEP 302 Utilities
-----------------

``get_importer(path_item)``
    A deprecated alias for ``pkgutil.get_importer()``


File/Path Utilities
-------------------

``ensure_directory(path)``
    Ensure that the parent directory (``os.path.dirname``) of ``path`` actually
    exists, using ``os.makedirs()`` if necessary.

``normalize_path(path)``
    Return a "normalized" version of ``path``, such that two paths represent
    the same filesystem location if they have equal ``normalized_path()``
    values.  Specifically, this is a shortcut for calling ``os.path.realpath``
    and ``os.path.normcase`` on ``path``.  Unfortunately, on certain platforms
    (notably Cygwin and macOS) the ``normcase`` function does not accurately
    reflect the platform's case-sensitivity, so there is always the possibility
    of two apparently-different paths being equal on such platforms.

History
-------

0.6c9
 * Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.

0.6c7
 * Fix package precedence problem where single-version eggs installed in
   ``site-packages`` would take precedence over ``.egg`` files (or directories)
   installed in ``site-packages``.

0.6c6
 * Fix extracted C extensions not having executable permissions under Cygwin.

 * Allow ``.egg-link`` files to contain relative paths.

 * Fix cache dir defaults on Windows when multiple environment vars are needed
   to construct a path.

0.6c4
 * Fix "dev" versions being considered newer than release candidates.

0.6c3
 * Python 2.5 compatibility fixes.

0.6c2
 * Fix a problem with eggs specified directly on ``PYTHONPATH`` on
   case-insensitive filesystems possibly not showing up in the default
   working set, due to differing normalizations of ``sys.path`` entries.

0.6b3
 * Fixed a duplicate path insertion problem on case-insensitive filesystems.

0.6b1
 * Split ``get_platform()`` into ``get_supported_platform()`` and
   ``get_build_platform()`` to work around a Mac versioning problem that caused
   the behavior of ``compatible_platforms()`` to be platform specific.

 * Fix entry point parsing when a standalone module name has whitespace
   between it and the extras.

0.6a11
 * Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
   cache permission problems get a more user-friendly explanation of the
   problem, and so that programs can catch and handle extraction errors if they
   need to.

0.6a10
 * Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
   method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
   to ``Environment``.

 * ``safe_name()`` now allows dots in project names.

 * There is a new ``to_filename()`` function that escapes project names and
   versions for safe use in constructing egg filenames from a Distribution
   object's metadata.

 * Added ``Distribution.clone()`` method, and keyword argument support to other
   ``Distribution`` constructors.

 * Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
   eggs using ``.egg-info`` format.

0.6a9
 * Don't raise an error when an invalid (unfinished) distribution is found
   unless absolutely necessary.  Warn about skipping invalid/unfinished eggs
   when building an Environment.

 * Added support for ``.egg-info`` files or directories with version/platform
   information embedded in the filename, so that system packagers have the
   option of including ``PKG-INFO`` files to indicate the presence of a
   system-installed egg, without needing to use ``.egg`` directories, zipfiles,
   or ``.pth`` manipulation.

 * Changed ``parse_version()`` to remove dashes before pre-release tags, so
   that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
   to ``0.2rc1``.  The idea that a dash *always* meant a post-release version
   was highly non-intuitive to setuptools users and Python developers, who
   seem to want to use ``-rc`` version numbers a lot.

0.6a8
 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version
   conflicts from being detected at runtime.

 * Improved runtime conflict warning message to identify a line in the user's
   program, rather than flagging the ``warn()`` call in ``pkg_resources``.

 * Avoid giving runtime conflict warnings for namespace packages, even if they
   were declared by a different package than the one currently being activated.

 * Fix path insertion algorithm for case-insensitive filesystems.

 * Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
   being set as an attribute of their parent package.

0.6a6
 * Activated distributions are now inserted in ``sys.path`` (and the working
   set) just before the directory that contains them, instead of at the end.
   This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
   the same location, and allows eggs found earlier on ``sys.path`` to override
   ones found later.

 * When a distribution is activated, it now checks whether any contained
   non-namespace modules have already been imported and issues a warning if
   a conflicting module has already been imported.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.

 * Fixed a problem extracting zipped files on Windows, when the egg in question
   has had changed contents but still has the same version number.

0.6a4
 * Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.

0.6a3
 * Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
   EntryPoint, and Distribution objects' extras handling.

0.6a1
 * Enhanced performance of ``require()`` and related operations when all
   requirements are already in the working set, and enhanced performance of
   directory scanning for distributions.

 * Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
   ``zipimport``, and the previously-broken "eager resource" support.

 * Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
   some other resource API bugs.

 * Many API changes and enhancements:

   * Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
     ``get_entry_info`` APIs for dynamic plugin discovery.

   * ``list_resources`` is now ``resource_listdir`` (and it actually works)

   * Resource API functions like ``resource_string()`` that accepted a package
     name and resource name, will now also accept a ``Requirement`` object in
     place of the package name (to allow access to non-package data files in
     an egg).

   * ``get_provider()`` will now accept a ``Requirement`` instance or a module
     name.  If it is given a ``Requirement``, it will return a corresponding
     ``Distribution`` (by calling ``require()`` if a suitable distribution
     isn't already in the working set), rather than returning a metadata and
     resource provider for a specific module.  (The difference is in how
     resource paths are interpreted; supplying a module name means resources
     path will be module-relative, rather than relative to the distribution's
     root.)

   * ``Distribution`` objects now implement the ``IResourceProvider`` and
     ``IMetadataProvider`` interfaces, so you don't need to reference the (no
     longer available) ``metadata`` attribute to get at these interfaces.

   * ``Distribution`` and ``Requirement`` both have a ``project_name``
     attribute for the project name they refer to.  (Previously these were
     ``name`` and ``distname`` attributes.)

   * The ``path`` attribute of ``Distribution`` objects is now ``location``,
     because it isn't necessarily a filesystem path (and hasn't been for some
     time now).  The ``location`` of ``Distribution`` objects in the filesystem
     should always be normalized using ``pkg_resources.normalize_path()``; all
     of the setuptools' code that generates distributions from the filesystem
     (including ``Distribution.from_filename()``) ensure this invariant, but if
     you use a more generic API like ``Distribution()`` or
     ``Distribution.from_location()`` you should take care that you don't
     create a distribution with an un-normalized filesystem path.

   * ``Distribution`` objects now have an ``as_requirement()`` method that
     returns a ``Requirement`` for the distribution's project name and version.

   * Distribution objects no longer have an ``installed_on()`` method, and the
     ``install_on()`` method is now ``activate()`` (but may go away altogether
     soon).  The ``depends()`` method has also been renamed to ``requires()``,
     and ``InvalidOption`` is now ``UnknownExtra``.

   * ``find_distributions()`` now takes an additional argument called ``only``,
     that tells it to only yield distributions whose location is the passed-in
     path.  (It defaults to False, so that the default behavior is unchanged.)

   * ``AvailableDistributions`` is now called ``Environment``, and the
     ``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
     because they weren't particularly useful.  ``__getitem__()`` no longer
     raises ``KeyError``; it just returns an empty list if there are no
     distributions for the named project.

   * The ``resolve()`` method of ``Environment`` is now a method of
     ``WorkingSet`` instead, and the ``best_match()`` method now uses a working
     set instead of a path list as its second argument.

   * There is a new ``pkg_resources.add_activation_listener()`` API that lets
     you register a callback for notifications about distributions added to
     ``sys.path`` (including the distributions already on it).  This is
     basically a hook for extensible applications and frameworks to be able to
     search for plugin metadata in distributions added at runtime.

0.5a13
 * Fixed a bug in resource extraction from nested packages in a zipped egg.

0.5a12
 * Updated extraction/cache mechanism for zipped resources to avoid inter-
   process and inter-thread races during extraction.  The default cache
   location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
   and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
   current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
   variable isn't set.

0.5a10
 * Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
   ``sys.path`` (e.g. if a user deletes an egg without removing it from the
   ``easy-install.pth`` file).

 * Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
   never actually went inside ``.egg`` files.

 * Made ``pkg_resources`` import the module you request resources from, if it's
   not already imported.

0.5a4
 * ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
   accept an ``installer`` argument: a callable taking one argument, a
   ``Requirement`` instance.  The callable must return a ``Distribution``
   object, or ``None`` if no distribution is found.  This feature is used by
   EasyInstall to resolve dependencies by recursively invoking itself.

0.4a4
 * Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
   directory extraction for zipped eggs.

0.4a3
 * Fixed scripts not being able to see a ``__file__`` variable in ``__main__``

 * Fixed a problem with ``resource_isdir()`` implementation that was introduced
   in 0.4a2.

0.4a1
 * Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
   ``!=``) when only one condition was included.

 * Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
   arbitrary distribution names and versions found on PyPI.

0.3a4
 * ``pkg_resources`` now supports resource directories, not just the resources
   in them.  In particular, there are ``resource_listdir()`` and
   ``resource_isdir()`` APIs.

 * ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
   multiple distributions in subdirectories whose names end with ``.egg``.
   Having such a "basket" in a directory on ``sys.path`` is equivalent to
   having the individual eggs in that directory, but the contained eggs can
   be individually added (or not) to ``sys.path``.  Currently, however, there
   is no automated way to create baskets.

 * Namespace package manipulation is now protected by the Python import lock.

0.3a1
 * Initial release.
doc/alt-python38-setuptools/references/keywords.rst000064400000033713151732726220016542 0ustar00========
Keywords
========

``name``
    A string specifying the name of the package.

``version``
    A string specifying the version number of the package.

``description``
    A string describing the package in a single line.

``long_description``
    A string providing a longer description of the package.

``long_description_content_type``
    A string specifying the content type is used for the ``long_description``
    (e.g. ``text/markdown``)

``author``
    A string specifying the author of the package.

``author_email``
    A string specifying the email address of the package author.

``maintainer``
    A string specifying the name of the current maintainer, if different from
    the author. Note that if the maintainer is provided, setuptools will use it
    as the author in ``PKG-INFO``.

``maintainer_email``
    A string specifying the email address of the current maintainer, if
    different from the author.

``url``
    A string specifying the URL for the package homepage.

``download_url``
    A string specifying the URL to download the package.

``packages``
    A list of strings specifying the packages that setuptools will manipulate.

``py_modules``
    A list of strings specifying the modules that setuptools will manipulate.

``scripts``
    A list of strings specifying the standalone script files to be built and
    installed.

``ext_package``
    A string specifying the base package name for the extensions provided by
    this package.

``ext_modules``
    A list of instances of ``setuptools.Extension`` providing the list of
    Python extensions to be built.

``classifiers``
    A list of strings describing the categories for the package.

``distclass``
    A subclass of ``Distribution`` to use.

``script_name``
    A string specifying the name of the setup.py script -- defaults to
    ``sys.argv[0]``

``script_args``
    A list of strings defining the arguments to supply to the setup script.

``options``
    A dictionary providing the default options for the setup script.

``license``
    A string specifying the license of the package.

``license_file``

    .. warning::
        ``license_file`` is deprecated. Use ``license_files`` instead.

``license_files``

    A list of glob patterns for license related files that should be included.
    If neither ``license_file`` nor ``license_files`` is specified, this option
    defaults to ``LICEN[CS]E*``, ``COPYING*``, ``NOTICE*``, and ``AUTHORS*``.

``keywords``
    A list of strings or a comma-separated string providing descriptive
    meta-data. See: `PEP 0314`_.

.. _PEP 0314: https://www.python.org/dev/peps/pep-0314/

``platforms``
    A list of strings or comma-separated string.

``cmdclass``
    A dictionary providing a mapping of command names to ``Command``
    subclasses.

``data_files``

    .. warning::
        ``data_files`` is deprecated. It does not work with wheels, so it
        should be avoided.

    A list of strings specifying the data files to install.

``package_dir``
    A dictionary providing a mapping of package to directory names.

``requires``

   .. warning::
      ``requires`` is superseded by ``install_requires`` and should not be used
      anymore.

``obsoletes``

   .. warning::
      ``obsoletes`` is currently ignored by ``pip``.

   List of strings describing packages which this package renders obsolete,
   meaning that the two projects should not be installed at the same time.

   Version declarations can be supplied. Version numbers must be in the format
   specified in Version specifiers (e.g. ``foo (<3.0)``).

   This field may be followed by an environment marker after a semicolon (e.g.
   ``foo; os_name == "posix"``)

   The most common use of this field will be in case a project name changes,
   e.g. Gorgon 2.3 gets subsumed into Torqued Python 1.0. When you install
   Torqued Python, the Gorgon distribution should be removed.

``provides``

   .. warning::
      ``provides`` is currently ignored by ``pip``.

   List of strings describing package- and virtual package names contained
   within this package.

   A package may provide additional names, e.g. to indicate that multiple
   projects have been bundled together. For instance, source distributions of
   the ZODB project have historically included the transaction project, which
   is now available as a separate distribution. Installing such a source
   distribution satisfies requirements for both ZODB and transaction.

   A package may also provide a “virtual” project name, which does not
   correspond to any separately-distributed project: such a name might be used
   to indicate an abstract capability which could be supplied by one of
   multiple projects. E.g., multiple projects might supply RDBMS bindings for
   use by a given ORM: each project might declare that it provides
   ORM-bindings, allowing other projects to depend only on having at most one
   of them installed.

   A version declaration may be supplied and must follow the rules described in
   Version specifiers. The distribution’s version number will be implied if
   none is specified (e.g. ``foo (<3.0)``).

   Each package may be followed by an environment marker after a semicolon
   (e.g. ``foo; os_name == "posix"``).

.. Below are setuptools keywords, above are distutils

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section on
    :ref:`Including Data Files`.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section on :ref:`Including Data Files`.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section on :ref:`Including Data
    Files`.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See :ref:`Dynamic
    Discovery of Services and Plugins` for details and examples of the format
    of this argument.  In addition, this keyword is used to support
    :ref:`Automatic Script Creation <entry_points>`.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``

    .. warning::
        Using ``setup_requires`` is discouraged in favor of `PEP-518`_

    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (even going so far as to download them using
    ``EasyInstall``) before processing the rest of the setup script or commands.
    This argument is needed if you are using distutils extensions as part of
    your build process; for example, extensions that process setup() arguments
    and turn them into EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

.. _PEP-518: http://www.python.org/dev/peps/pep-0518/

``dependency_links``

    .. warning::
        ``dependency_links`` is deprecated. It is not supported anymore by pip.

    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use by tools like EasyInstall to use when installing
    an ``.egg`` file.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section on :ref:`Namespace Packages` for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the :ref:`test` command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    :ref:`test` command below for more details.

    New in 41.5.0: Deprecated the test command.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (even going
    so far as to download them using ``EasyInstall``).  Note that these
    required projects will *not* be installed on the system where the tests
    are run, but only downloaded to the project's setup directory if they're
    not already installed locally.

    New in 41.5.0: Deprecated the test command.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the ``names`` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

    New in 41.5.0: Deprecated the test command.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be '/'-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on :ref:`Automatic Resource Extraction`.

``project_urls``
    An arbitrary map of URL names to hyperlinks, allowing more extensible
    documentation of where various resources can be found than the simple
    ``url`` and ``download_url`` options provide.
doc/alt-python38-setuptools/CHANGES.rst000064400000527514151732726220013631 0ustar00v58.3.0
-------


Changes
^^^^^^^
* #917: ``setup.py install`` and ``easy_install`` commands are now officially deprecated. Use other standards-based installers (like pip) and builders (like build). Workloads reliant on this behavior should pin to this major version of Setuptools.
* #1988: Deprecated the ``bdist_rpm`` command. Binary packages should be built as wheels instead.
  -- by :user:`hugovk`
* #2785: Replace confirparser's readfp with read_file, deprecated since Python 3.2.
  -- by :user:`hugovk`
* #2823: Officially deprecated support for ``setup_requires``. Users are encouraged instead to migrate to PEP 518 ``build-system.requires`` in ``pyproject.toml``. Users reliant on ``setup_requires`` should consider pinning to this major version to avoid disruption.

Misc
^^^^
* #2762: Changed codecov.yml to configure the threshold to be lower
  -- by :user:`tanvimoharir`


v58.2.0
-------


Changes
^^^^^^^
* #2757: Add windows arm64 launchers for scripts generated by easy_install.
* #2800: Added ``--owner`` and ``--group`` options to the ``sdist`` command,
  for specifying file ownership within the produced tarball (similarly
  to the corresponding distutils ``sdist`` options).

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2792: Document how the legacy and non-legacy versions are compared, and reference to the `PEP 440 <https://www.python.org/dev/peps/pep-0440/>`_ scheme.


v58.1.0
-------


Changes
^^^^^^^
* #2796: Merge with pypa/distutils@02e9f65ab0


v58.0.4
-------


Misc
^^^^
* #2773: Retain case in setup.cfg during sdist.


v58.0.3
-------


Misc
^^^^
* #2777: Build does not fail fast when ``use_2to3`` is supplied but set to a false value.


v58.0.2
-------


Misc
^^^^
* #2769: Build now fails fast when ``use_2to3`` is supplied.


v58.0.1
-------


Misc
^^^^
* #2765: In Distribution.finalize_options, suppress known removed entry points to avoid issues with older Setuptools.


v58.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2086: Removed support for 2to3 during builds. Projects should port to a unified codebase or pin to an older version of Setuptools using PEP 518 build-requires.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2746: add python_requires example


v57.5.0
-------


Changes
^^^^^^^
* #2712: Added implicit globbing support for `[options.data_files]` values.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2737: fix various syntax and style errors in code snippets in docs


v57.4.0
-------


Changes
^^^^^^^
* #2722: Added support for ``SETUPTOOLS_EXT_SUFFIX`` environment variable to override the suffix normally detected from the ``sysconfig`` module.


v57.3.0
-------


Changes
^^^^^^^
* #2465: Documentation is now published using the Furo theme.


v57.2.0
-------


Changes
^^^^^^^
* #2724: Added detection of Windows ARM64 build environments using the ``VSCMD_ARG_TGT_ARCH`` environment variable.


v57.1.0
-------


Changes
^^^^^^^
* #2692: Globs are now sorted in 'license_files' restoring reproducibility by eliminating variance from disk order.
* #2714: Update to distutils at pypa/distutils@e2627b7.
* #2715: Removed reliance on deprecated ssl.match_hostname by removing the ssl support. Now any index operations rely on the native SSL implementation.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2604: Revamped the backward/cross tool compatibility section to remove
  some confusion.
  Add some examples and the version since when ``entry_points`` are
  supported in declarative configuration.
  Tried to make the reading flow a bit leaner, gather some informations
  that were a bit dispersed.


v57.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2645: License files excluded via the ``MANIFEST.in`` but matched by either
  the ``license_file`` (deprecated) or ``license_files`` options,
  will be nevertheless included in the source distribution. - by :user:`cdce8p`

Changes
^^^^^^^
* #2628: Write long description in message payload of PKG-INFO file. - by :user:`cdce8p`
* #2645: Added ``License-File`` (multiple) to the output package metadata.
  The field will contain the path of a license file, matched by the
  ``license_file`` (deprecated) and ``license_files`` options,
  relative to ``.dist-info``. - by :user:`cdce8p`
* #2678: Moved Setuptools' own entry points into declarative config.
* #2680: Vendored `more_itertools <https://pypi.org/project/more-itertools>`_ for Setuptools.
* #2681: Setuptools own setup.py no longer declares setup_requires, but instead expects wheel to be installed as declared by pyproject.toml.

Misc
^^^^
* #2650: Updated the docs build tooling to support the latest version of
  Towncrier and show the previews of not-yet-released setuptools versions
  in the changelog -- :user:`webknjaz`


v56.2.0
-------


Changes
^^^^^^^
* #2640: Fixed handling of multiline license strings. - by :user:`cdce8p`
* #2641: Setuptools will now always try to use the latest supported
  metadata version for ``PKG-INFO``. - by :user:`cdce8p`


v56.1.0
-------


Changes
^^^^^^^
* #2653: Incorporated assorted changes from pypa/distutils.
* #2657: Adopted docs from distutils.
* #2663: Added Visual Studio Express 2017 support -- by :user:`dofuuz`

Misc
^^^^
* #2644: Fixed ``DeprecationWarning`` due to ``threading.Thread.setDaemon`` in tests -- by :user:`tirkarthi`
* #2654: Made the changelog generator compatible
  with Towncrier >= 19.9 -- :user:`webknjaz`
* #2664: Relax the deprecation message in the distutils hack.


v56.0.0
-------


Deprecations
^^^^^^^^^^^^
* #2620: The ``license_file`` option is now marked as deprecated.
  Use ``license_files`` instead. -- by :user:`cdce8p`

Breaking Changes
^^^^^^^^^^^^^^^^
* #2620: If neither ``license_file`` nor ``license_files`` is specified, the ``sdist``
  option will now auto-include files that match the following patterns:
  ``LICEN[CS]E*``, ``COPYING*``, ``NOTICE*``, ``AUTHORS*``.
  This matches the behavior of ``bdist_wheel``. -- by :user:`cdce8p`

Changes
^^^^^^^
* #2620: The ``license_file`` and ``license_files`` options now support glob patterns. -- by :user:`cdce8p`
* #2632: Implemented ``VendorImporter.find_spec()`` method to get rid
  of ``ImportWarning`` that Python 3.10 emits when only the old-style
  importer hooks are present -- by :user:`webknjaz`

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2620: Added documentation for the ``license_files`` option. -- by :user:`cdce8p`


v55.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2566: Remove the deprecated ``bdist_wininst`` command. Binary packages should be built as wheels instead. -- by :user:`hroncok`


v54.2.0
-------


Changes
^^^^^^^
* #2608: Added informative error message to PEP 517 build failures owing to
  an empty ``setup.py`` -- by :user:`layday`


v54.1.3
-------

No significant changes.


v54.1.2
-------


Misc
^^^^
* #2595: Reduced scope of dash deprecation warning to Setuptools/distutils only -- by :user:`melissa-kun-li`


v54.1.1
-------


Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2584: Added ``sphinx-inline-tabs`` extension to allow for comparison of ``setup.py`` and its equivalent ``setup.cfg`` -- by :user:`amy-lei`

Misc
^^^^
* #2592: Made option keys in the ``[metadata]`` section of ``setup.cfg`` case-sensitive. Users having
  uppercase option spellings will get a warning suggesting to make them to lowercase
  -- by :user:`melissa-kun-li`


v54.1.0
-------


Changes
^^^^^^^
* #1608: Removed the conversion of dashes to underscores in the :code:`extras_require` and :code:`data_files` of :code:`setup.cfg` to support the usage of dashes. Method will warn users when they use a dash-separated key which in the future will only allow an underscore. Note: the method performs the dash to underscore conversion to preserve compatibility, but future versions will no longer support it -- by :user:`melissa-kun-li`


v54.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2582: Simplified build-from-source story by providing bootstrapping metadata in a separate egg-info directory. Build requirements no longer include setuptools itself. Sdist once again includes the pyproject.toml. Project can no longer be installed from source on pip 19.x, but install from source is still supported on pip < 19 and pip >= 20 and install from wheel is still supported with pip >= 9.

Changes
^^^^^^^
* #1932: Handled :code:`AttributeError` by raising :code:`DistutilsSetupError` in :code:`dist.check_specifier()` when specifier is not a string -- by :user:`melissa-kun-li`
* #2570: Correctly parse cmdclass in setup.cfg.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2553: Added userguide example for markers in extras_require -- by :user:`pwoolvett`


v53.1.0
-------


Changes
^^^^^^^
* #1937: Preserved case-sensitivity of keys in setup.cfg so that entry point names are case-sensitive. Changed sensitivity of configparser. NOTE: Any projects relying on case-insensitivity will need to adapt to accept the original case as published. -- by :user:`melissa-kun-li`
* #2573: Fixed error in uploading a Sphinx doc with the :code:`upload_docs` command. An html builder will be used.
  Note: :code:`upload_docs` is deprecated for PyPi, but is supported for other sites -- by :user:`melissa-kun-li`


v53.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #1527: Removed bootstrap script. Now Setuptools requires pip or another pep517-compliant builder such as 'build' to build. Now Setuptools can be installed from Github main branch.


v52.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2537: Remove fallback support for fetch_build_eggs using easy_install. Now pip is required for setup_requires to succeed.
* #2544: Removed 'easy_install' top-level model (runpy entry point) and 'easy_install' console script.
* #2545: Removed support for eggsecutables.

Changes
^^^^^^^
* #2459: Tests now run in parallel via pytest-xdist, completing in about half the time. Special thanks to :user:`webknjaz` for hard work implementing test isolation. To run without parallelization, disable the plugin with ``tox -- -p no:xdist``.


v51.3.3
-------


Misc
^^^^
* #2539: Fix AttributeError in Description validation.


v51.3.2
-------


Misc
^^^^
* #1390: Validation of Description field now is more lenient, emitting a warning and mangling the value to be valid (replacing newlines with spaces).


v51.3.1
-------


Misc
^^^^
* #2536: Reverted tag deduplication handling.


v51.3.0
-------


Changes
^^^^^^^
* #1390: Newlines in metadata description/Summary now trigger a ValueError.
* #2481: Define ``create_module()`` and ``exec_module()`` methods in ``VendorImporter``
  to get rid of ``ImportWarning`` -- by :user:`hroncok`
* #2489: ``pkg_resources`` behavior for zipimport now matches the regular behavior, and finds
  ``.egg-info`` (previoulsy would only find ``.dist-info``) -- by :user:`thatch`
* #2529: Fixed an issue where version tags may be added multiple times


v51.2.0
-------


Changes
^^^^^^^
* #2493: Use importlib.import_module() rather than the deprecated loader.load_module()
  in pkg_resources namespace delaration -- by :user:`encukou`

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2525: Fix typo in the document page about entry point. -- by :user:`jtr109`

Misc
^^^^
* #2534: Avoid hitting network during test_easy_install.


v51.1.2
-------


Misc
^^^^
* #2505: Disable inclusion of package data as it causes 'tests' to be included as data.


v51.1.1
-------


Misc
^^^^
* #2534: Avoid hitting network during test_virtualenv.test_test_command.


v51.1.0
-------


Changes
^^^^^^^
* #2486: Project adopts jaraco/skeleton for shared package maintenance.

Misc
^^^^
* #2477: Restore inclusion of rst files in sdist.
* #2484: Setuptools has replaced the master branch with the main branch.
* #2485: Fixed failing test when pip 20.3+ is present.
  -- by :user:`yan12125`
* #2487: Fix tests with pytest 6.2
  -- by :user:`yan12125`


v51.0.0
-------


Breaking Changes
^^^^^^^^^^^^^^^^
* #2435: Require Python 3.6 or later.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2430: Fixed inconsistent RST title nesting levels caused by #2399
  -- by :user:`webknjaz`
* #2430: Fixed a typo in Sphinx docs that made docs dev section disappear
  as a result of PR #2426 -- by :user:`webknjaz`

Misc
^^^^
* #2471: Removed the tests that guarantee that the vendored dependencies can be built by distutils.


v50.3.2
-------



Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2394: Extended towncrier news template to include change note categories.
  This allows to see what types of changes a given version introduces
  -- by :user:`webknjaz`
* #2427: Started enforcing strict syntax and reference validation
  in the Sphinx docs -- by :user:`webknjaz`
* #2428: Removed redundant Sphinx ``Makefile`` support -- by :user:`webknjaz`

Misc
^^^^
* #2401: Enabled test results reporting in AppVeyor CI
  -- by :user:`webknjaz`
* #2420: Replace Python 3.9.0 beta with 3.9.0 final on GitHub Actions.
* #2421: Python 3.9 Trove classifier got added to the dist metadata
  -- by :user:`webknjaz`


v50.3.1
-------



Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2093: Finalized doc revamp.
* #2097: doc: simplify index and group deprecated files
* #2102: doc overhaul step 2: break main doc into multiple sections
* #2111: doc overhaul step 3: update userguide
* #2395: Added a ``:user:`` role to Sphinx config -- by :user:`webknjaz`
* #2395: Added an illustrative explanation about the change notes to fragments dir -- by :user:`webknjaz`

Misc
^^^^
* #2379: Travis CI test suite now tests against PPC64.
* #2413: Suppress EOF errors (and other exceptions) when importing lib2to3.


v50.3.0
-------



Changes
^^^^^^^
* #2368: In distutils, restore support for monkeypatched CCompiler.spawn per pypa/distutils#15.


v50.2.0
-------



Changes
^^^^^^^
* #2355: When pip is imported as part of a build, leave distutils patched.
* #2380: There are some setuptools specific changes in the
  ``setuptools.command.bdist_rpm`` module that are no longer needed, because
  they are part of the ``bdist_rpm`` module in distutils in Python
  3.5.0. Therefore, code was removed from ``setuptools.command.bdist_rpm``.


v50.1.0
-------



Changes
^^^^^^^
* #2350: Setuptools reverts using the included distutils by default. Platform maintainers and system integrators and others are *strongly* encouraged to set ``SETUPTOOLS_USE_DISTUTILS=local`` to help identify and work through the reported issues with distutils adoption, mainly to file issues and pull requests with pypa/distutils such that distutils performs as needed across every supported environment.


v50.0.3
-------



Misc
^^^^
* #2363: Restore link_libpython support on Python 3.7 and earlier (see pypa/distutils#9).


v50.0.2
-------



Misc
^^^^
* #2352: In distutils hack, use absolute import rather than relative to avoid bpo-30876.


v50.0.1
-------



Misc
^^^^
* #2357: Restored Python 3.5 support in distutils.util for missing ``subprocess._optim_args_from_interpreter_flags``.
* #2358: Restored AIX support on Python 3.8 and earlier.
* #2361: Add Python 3.10 support to _distutils_hack. Get the 'Loader' abstract class
  from importlib.abc rather than importlib.util.abc (alias removed in Python
  3.10).


v50.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #2232: Once again, Setuptools overrides the stdlib distutils on import. For environments or invocations where this behavior is undesirable, users are provided with a temporary escape hatch. If the environment variable ``SETUPTOOLS_USE_DISTUTILS`` is set to ``stdlib``, Setuptools will fall back to the legacy behavior. Use of this escape hatch is discouraged, but it is provided to ease the transition while proper fixes for edge cases can be addressed.

Changes
^^^^^^^
* #2334: In MSVC module, refine text in error message.


v49.6.0
-------



Changes
^^^^^^^
* #2129: In pkg_resources, no longer detect any pathname ending in .egg as a Python egg. Now the path must be an unpacked egg or a zip file.


v49.5.0
-------



Changes
^^^^^^^
* #2306: When running as a PEP 517 backend, setuptools does not try to install
  ``setup_requires`` itself. They are reported as build requirements for the
  frontend to install.


v49.4.0
-------



Changes
^^^^^^^
* #2310: Updated vendored packaging version to 20.4.


v49.3.2
-------



Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2300: Improve the ``safe_version`` function documentation

Misc
^^^^
* #2297: Once again, in stubs prefer exec_module to the deprecated load_module.


v49.3.1
-------



Changes
^^^^^^^
* #2316: Removed warning when ``distutils`` is imported before ``setuptools`` when ``distutils`` replacement is not enabled.


v49.3.0
-------



Changes
^^^^^^^
* #2259: Setuptools now provides a .pth file (except for editable installs of setuptools) to the target environment to ensure that when enabled, the setuptools-provided distutils is preferred before setuptools has been imported (and even if setuptools is never imported). Honors the SETUPTOOLS_USE_DISTUTILS environment variable.


v49.2.1
-------



Misc
^^^^
* #2257: Fixed two flaws in distutils._msvccompiler.MSVCCompiler.spawn.


v49.2.0
-------



Changes
^^^^^^^
* #2230: Now warn the user when setuptools is imported after distutils modules have been loaded (exempting PyPy for 3.6), directing the users of packages to import setuptools first.


v49.1.3
-------



Misc
^^^^
* #2212: (Distutils) Allow spawn to accept environment. Avoid monkey-patching global state.
* #2249: Fix extension loading technique in stubs.


v49.1.2
-------



Changes
^^^^^^^
* #2232: In preparation for re-enabling a local copy of distutils, Setuptools now honors an environment variable, SETUPTOOLS_USE_DISTUTILS. If set to 'stdlib' (current default), distutils will be used from the standard library. If set to 'local' (default in a imminent backward-incompatible release), the local copy of distutils will be used.


v49.1.1
-------



Misc
^^^^
* #2094: Removed pkg_resources.py2_warn module, which is no longer reachable.


v49.0.1
-------



Misc
^^^^
* #2228: Applied fix for pypa/distutils#3, restoring expectation that spawn will raise a DistutilsExecError when attempting to execute a missing file.


v49.1.0
-------



Changes
^^^^^^^
* #2228: Disabled distutils adoption for now while emergent issues are addressed.


v49.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #2165: Setuptools no longer installs a site.py file during easy_install or develop installs. As a result, .eggs on PYTHONPATH will no longer take precedence over other packages on sys.path. If this issue affects your production environment, please reach out to the maintainers at #2165.

Changes
^^^^^^^
* #2137: Removed (private) pkg_resources.RequirementParseError, now replaced by packaging.requirements.InvalidRequirement. Kept the name for compatibility, but users should catch InvalidRequirement instead.
* #2180: Update vendored packaging in pkg_resources to 19.2.

Misc
^^^^
* #2199: Fix exception causes all over the codebase by using ``raise new_exception from old_exception``


v48.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #2143: Setuptools adopts distutils from the Python 3.9 standard library and no longer depends on distutils in the standard library. When importing ``setuptools`` or ``setuptools.distutils_patch``, Setuptools will expose its bundled version as a top-level ``distutils`` package (and unload any previously-imported top-level distutils package), retaining the expectation that ``distutils``' objects are actually Setuptools objects.
  To avoid getting any legacy behavior from the standard library, projects are advised to always "import setuptools" prior to importing anything from distutils. This behavior happens by default when using ``pip install`` or ``pep517.build``. Workflows that rely on ``setup.py (anything)`` will need to first ensure setuptools is imported. One way to achieve this behavior without modifying code is to invoke Python thus: ``python -c "import setuptools; exec(open('setup.py').read())" (anything)``.


v47.3.2
-------



Misc
^^^^
* #2071: Replaced references to the deprecated imp package with references to importlib


v47.3.1
-------



Misc
^^^^
* #1973: Removed ``pkg_resources.py31compat.makedirs`` in favor of the stdlib. Use ``os.makedirs()`` instead.
* #2198: Restore ``__requires__`` directive in easy-install wrapper scripts.


v47.3.0
-------



Changes
^^^^^^^
* #2197: Console script wrapper for editable installs now has a unified template and honors importlib_metadata if present for faster script execution on older Pythons.

Misc
^^^^
* #2195: Fix broken entry points generated by easy-install (pip editable installs).


v47.2.0
-------



Changes
^^^^^^^
* #2194: Editable-installed entry points now load significantly faster on Python versions 3.8+.
* #1471: Incidentally fixed by #2194 on Python 3.8 or when importlib_metadata is present.


v47.1.1
-------



Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2156: Update mailing list pointer in developer docs

Incorporate changes from v44.1.1:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* #2158: Avoid loading working set during ``Distribution.finalize_options`` prior to invoking ``_install_setup_requires``, broken since v42.0.0.


v44.1.1
-------



Misc
^^^^
* #2158: Avoid loading working set during ``Distribution.finalize_options`` prior to invoking ``_install_setup_requires``, broken since v42.0.0.


v47.1.0
-------



Changes
^^^^^^^
* #2070: In wheel-to-egg conversion, use simple pkg_resources-style namespace declaration for packages that declare namespace_packages.


v47.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #2094: Setuptools now actively crashes under Python 2. Python 3.5 or later is required. Users of Python 2 should use ``setuptools<45``.

Changes
^^^^^^^
* #1700: Document all supported keywords by migrating the ones from distutils.


v46.4.0
-------



Changes
^^^^^^^
* #1753: ``attr:`` now extracts variables through rudimentary examination of the AST,
  thereby supporting modules with third-party imports. If examining the AST
  fails to find the variable, ``attr:`` falls back to the old behavior of
  importing the module. Works on Python 3 only.


v46.3.1
-------

No significant changes.


v46.3.0
-------



Changes
^^^^^^^
* #2089: Package index functionality no longer attempts to remove an md5 fragment from the index URL. This functionality, added for distribute #163 is no longer relevant.

Misc
^^^^
* #2041: Preserve file modes during pkg files copying, but clear read only flag for target afterwards.
* #2105: Filter ``2to3`` deprecation warnings from ``TestDevelop.test_2to3_user_mode``.


v46.2.0
-------



Changes
^^^^^^^
* #2040: Deprecated the ``bdist_wininst`` command. Binary packages should be built as wheels instead.
* #2062: Change 'Mac OS X' to 'macOS' in code.
* #2075: Stop recognizing files ending with ``.dist-info`` as distribution metadata.
* #2086: Deprecate 'use_2to3' functionality. Packagers are encouraged to use single-source solutions or build tool chains to manage conversions outside of setuptools.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1698: Added documentation for ``build_meta`` (a bare minimum, not completed).

Misc
^^^^
* #2082: Filter ``lib2to3`` ``PendingDeprecationWarning`` and ``DeprecationWarning`` in tests,
  because ``lib2to3`` is `deprecated in Python 3.9 <https://bugs.python.org/issue40360>`_.


v46.1.3
-------

No significant changes.


v46.1.2
-------



Misc
^^^^
* #1458: Added template for reporting Python 2 incompatibilities.


v46.1.1
-------

No significant changes.


v46.1.0
-------



Changes
^^^^^^^
* #308: Allow version number normalization to be bypassed by wrapping in a 'setuptools.sic()' call.
* #1424: Prevent keeping files mode for package_data build. It may break a build if user's package data has read only flag.
* #1431: In ``easy_install.check_site_dir``, ensure the installation directory exists.
* #1563: In ``pkg_resources`` prefer ``find_spec`` (PEP 451) to ``find_module``.

Incorporate changes from v44.1.0:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* #1704: Set sys.argv[0] in setup script run by build_meta.__legacy__
* #1959: Fix for Python 4: replace unsafe six.PY3 with six.PY2
* #1994: Fixed a bug in the "setuptools.finalize_distribution_options" hook that lead to ignoring the order attribute of entry points managed by this hook.


v44.1.0
-------



Changes
^^^^^^^
* #1704: Set sys.argv[0] in setup script run by build_meta.__legacy__
* #1959: Fix for Python 4: replace unsafe six.PY3 with six.PY2
* #1994: Fixed a bug in the "setuptools.finalize_distribution_options" hook that lead to ignoring the order attribute of entry points managed by this hook.


v46.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #65: Once again as in 3.0, removed the Features feature.

Changes
^^^^^^^
* #1890: Fix vendored dependencies so importing ``setuptools.extern.some_module`` gives the same object as ``setuptools._vendor.some_module``. This makes Metadata picklable again.
* #1899: Test suite now fails on warnings.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #2011: Fix broken link to distutils docs on package_data

Misc
^^^^
* #1991: Include pkg_resources test data in sdist, so tests can be executed from it.


v45.3.0
-------



Changes
^^^^^^^
* #1557: Deprecated eggsecutable scripts and updated docs.
* #1904: Update msvc.py to use CPython 3.8.0 mechanism to find msvc 14+


v45.2.0
-------



Changes
^^^^^^^
* #1905: Fixed defect in _imp, introduced in 41.6.0 when the 'tests' directory is not present.
* #1941: Improve editable installs with PEP 518 build isolation:

  * The ``--user`` option is now always available. A warning is issued if the user site directory is not available.
  * The error shown when the install directory is not in ``PYTHONPATH`` has been turned into a warning.
* #1981: Setuptools now declares its ``tests`` and ``docs`` dependencies in metadata (extras).
* #1985: Add support for installing scripts in environments where bdist_wininst is missing (i.e. Python 3.9).

Misc
^^^^
* #1968: Add flake8-2020 to check for misuse of sys.version or sys.version_info.


v45.1.0
-------



Changes
^^^^^^^
* #1458: Add minimum sunset date and preamble to Python 2 warning.
* #1704: Set sys.argv[0] in setup script run by build_meta.__legacy__
* #1974: Add Python 3 Only Trove Classifier and remove universal wheel declaration for more complete transition from Python 2.


v45.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1458: Drop support for Python 2. Setuptools now requires Python 3.5 or later. Install setuptools using pip >=9 or pin to Setuptools <45 to maintain 2.7 support.

Changes
^^^^^^^
* #1959: Fix for Python 4: replace unsafe six.PY3 with six.PY2


v44.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1908: Drop support for Python 3.4.


v43.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1634: Include ``pyproject.toml`` in source distribution by default. Projects relying on the previous behavior where ``pyproject.toml`` was excluded by default should stop relying on that behavior or add ``exclude pyproject.toml`` to their MANIFEST.in file.

Changes
^^^^^^^
* #1927: Setuptools once again declares 'setuptools' in the ``build-system.requires`` and adds PEP 517 build support by declaring itself as the ``build-backend``. It additionally specifies ``build-system.backend-path`` to rely on itself for those builders that support it.


v42.0.2
-------

Changes
^^^^^^^

* #1921: Fix support for easy_install's ``find-links`` option in ``setup.cfg``.
* #1922: Build dependencies (setup_requires and tests_require) now install transitive dependencies indicated by extras.


v42.0.1
-------



Changes
^^^^^^^
* #1918: Fix regression in handling wheels compatibility tags.


v42.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1830, #1909: Mark the easy_install script and setuptools command as deprecated, and use `pip <https://pip.pypa.io/en/stable/>`_ when available to fetch/build wheels for missing ``setup_requires``/``tests_require`` requirements, with the following differences in behavior:
   * support for ``python_requires``
   * better support for wheels (proper handling of priority with respect to PEP 425 tags)
   * PEP 517/518 support
   * eggs are not supported
   * no support for the ``allow_hosts`` easy_install option (``index_url``/``find_links`` are still honored)
   * pip environment variables are honored (and take precedence over easy_install options)
* #1898: Removed the "upload" and "register" commands in favor of `twine <https://pypi.org/p/twine>`_.

Changes
^^^^^^^
* #1767: Add support for the ``license_files`` option in ``setup.cfg`` to automatically
  include multiple license files in a source distribution.
* #1829: Update handling of wheels compatibility tags:
  * add support for manylinux2010
  * fix use of removed 'm' ABI flag in Python 3.8 on Windows
* #1861: Fix empty namespace package installation from wheel.
* #1877: Setuptools now exposes a new entry point hook "setuptools.finalize_distribution_options", enabling plugins like `setuptools_scm <https://pypi.org/project/setuptools_scm>`_ to configure options on the distribution at finalization time.


v41.6.0
-------



Changes
^^^^^^^
* #479: Replace usage of deprecated ``imp`` module with local re-implementation in ``setuptools._imp``.


v41.5.1
-------



Changes
^^^^^^^
* #1891: Fix code for detecting Visual Studio's version on Windows under Python 2.


v41.5.0
-------



Changes
^^^^^^^
* #1811: Improve Visual C++ 14.X support, mainly for Visual Studio 2017 and 2019.
* #1814: Fix ``pkg_resources.Requirement`` hash/equality implementation: take PEP 508 direct URL into account.
* #1824: Fix tests when running under ``python3.10``.
* #1878: Formally deprecated the ``test`` command, with the recommendation that users migrate to ``tox``.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1860: Update documentation to mention the egg format is not supported by pip and dependency links support was dropped starting with pip 19.0.
* #1862: Drop ez_setup documentation: deprecated for some time (last updated in 2016), and still relying on easy_install (deprecated too).
* #1868: Drop most documentation references to (deprecated) EasyInstall.
* #1884: Added a trove classifier to document support for Python 3.8.

Misc
^^^^
* #1886: Added Python 3.8 release to the Travis test matrix.


v41.4.0
-------



Changes
^^^^^^^
* #1847: In declarative config, now traps errors when invalid ``python_requires`` values are supplied.


v41.3.0
-------



Changes
^^^^^^^
* #1690: When storing extras, rely on OrderedSet to retain order of extras as indicated by the packager, which will also be deterministic on Python 2.7 (with PYTHONHASHSEED unset) and Python 3.6+.

Misc
^^^^
* #1858: Fixed failing integration test triggered by 'long_description_content_type' in packaging.


v41.2.0
-------



Changes
^^^^^^^
* #479: Remove some usage of the deprecated ``imp`` module.

Misc
^^^^
* #1565: Changed html_sidebars from string to list of string as per
  https://www.sphinx-doc.org/en/master/changes.html#id58


v41.1.0
-------



Misc
^^^^
* #1697: Moved most of the constants from setup.py to setup.cfg
* #1749: Fixed issue with the PEP 517 backend where building a source distribution would fail if any tarball existed in the destination directory.
* #1750: Fixed an issue with PEP 517 backend where wheel builds would fail if the destination directory did not already exist.
* #1756: Force metadata-version >= 1.2. when project urls are present.
* #1769: Improve ``package_data`` check: ensure the dictionary values are lists/tuples of strings.
* #1788: Changed compatibility fallback logic for ``html.unescape`` to avoid accessing ``HTMLParser.unescape`` when not necessary. ``HTMLParser.unescape`` is deprecated and will be removed in Python 3.9.
* #1790: Added the file path to the error message when a ``UnicodeDecodeError`` occurs while reading a metadata file.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1776: Use license classifiers rather than the license field.


v41.0.1
-------



Changes
^^^^^^^
* #1671: Fixed issue with the PEP 517 backend that prevented building a wheel when the ``dist/`` directory contained existing ``.whl`` files.
* #1709: In test.paths_on_python_path, avoid adding unnecessary duplicates to the PYTHONPATH.
* #1741: In package_index, now honor "current directory" during a checkout of git and hg repositories under Windows


v41.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1735: When parsing setup.cfg files, setuptools now requires the files to be encoded as UTF-8. Any other encoding will lead to a UnicodeDecodeError. This change removes support for specifying an encoding using a 'coding: ' directive in the header of the file, a feature that was introduces in 40.7. Given the recent release of the aforementioned feature, it is assumed that few if any projects are utilizing the feature to specify an encoding other than UTF-8.


v40.9.0
-------



Changes
^^^^^^^
* #1675: Added support for ``setup.cfg``-only projects when using the ``setuptools.build_meta`` backend. Projects that have enabled PEP 517 no longer need to have a ``setup.py`` and can use the purely declarative ``setup.cfg`` configuration file instead.
* #1720: Added support for ``pkg_resources.parse_requirements``-style requirements in ``setup_requires`` when ``setup.py`` is invoked from the ``setuptools.build_meta`` build backend.
* #1664: Added the path to the ``PKG-INFO`` or ``METADATA`` file in the exception
  text when the ``Version:`` header can't be found.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1705: Removed some placeholder documentation sections referring to deprecated features.


v40.8.0
-------



Changes
^^^^^^^
* #1652: Added the ``build_meta:__legacy__`` backend, a "compatibility mode" PEP 517 backend that can be used as the default when ``build-backend`` is left unspecified in ``pyproject.toml``.
* #1635: Resource paths are passed to ``pkg_resources.resource_string`` and similar no longer accept paths that traverse parents, that begin with a leading ``/``. Violations of this expectation raise DeprecationWarnings and will become errors. Additionally, any paths that are absolute on Windows are strictly disallowed and will raise ValueErrors.
* #1536: ``setuptools`` will now automatically include licenses if ``setup.cfg`` contains a ``license_file`` attribute, unless this file is manually excluded inside ``MANIFEST.in``.


v40.7.3
-------



Changes
^^^^^^^
* #1670: In package_index, revert to using a copy of splituser from Python 3.8. Attempts to use ``urllib.parse.urlparse`` led to problems as reported in #1663 and #1668. This change serves as an alternative to #1499 and fixes #1668.


v40.7.2
-------



Changes
^^^^^^^
* #1666: Restore port in URL handling in package_index.


v40.7.1
-------



Changes
^^^^^^^
* #1660: On Python 2, when reading config files, downcast options from text to bytes to satisfy distutils expectations.


v40.7.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1551: File inputs for the ``license`` field in ``setup.cfg`` files now explicitly raise an error.

Changes
^^^^^^^
* #1180: Add support for non-ASCII in setup.cfg (#1062). Add support for native strings on some parameters (#1136).
* #1499: ``setuptools.package_index`` no longer relies on the deprecated ``urllib.parse.splituser`` per Python #27485.
* #1544: Added tests for PackageIndex.download (for git URLs).
* #1625: In PEP 517 build_meta builder, ensure that sdists are built as gztar per the spec.


v40.6.3
-------



Changes
^^^^^^^
* #1594: PEP 517 backend no longer declares setuptools as a dependency as it can be assumed.


v40.6.2
-------



Changes
^^^^^^^
* #1592: Fix invalid dependency on external six module (instead of vendored version).


v40.6.1
-------



Changes
^^^^^^^
* #1590: Fixed regression where packages without ``author`` or ``author_email`` fields generated malformed package metadata.


v40.6.0
-------



Deprecations
^^^^^^^^^^^^
* #1541: Officially deprecated the ``requires`` parameter in ``setup()``.

Changes
^^^^^^^
* #1519: In ``pkg_resources.normalize_path``, additional path normalization is now performed to ensure path values to a directory is always the same, preventing false positives when checking scripts have a consistent prefix to set up on Windows.
* #1545: Changed the warning class of all deprecation warnings; deprecation warning classes are no longer derived from ``DeprecationWarning`` and are thus visible by default.
* #1554: ``build_meta.build_sdist`` now includes ``setup.py`` in source distributions by default.
* #1576: Started monkey-patching ``get_metadata_version`` and ``read_pkg_file`` onto ``distutils.DistributionMetadata`` to retain the correct version on the ``PKG-INFO`` file in the (deprecated) ``upload`` command.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1395: Changed Pyrex references to Cython in the documentation.
* #1456: Documented that the ``rpmbuild`` packages is required for the ``bdist_rpm`` command.
* #1537: Documented how to use ``setup.cfg`` for ``src/ layouts``
* #1539: Added minimum version column in ``setup.cfg`` metadata table.
* #1552: Fixed a minor typo in the python 2/3 compatibility documentation.
* #1553: Updated installation instructions to point to ``pip install`` instead of ``ez_setup.py``.
* #1560: Updated ``setuptools`` distribution documentation to remove some outdated information.
* #1564: Documented ``setup.cfg`` minimum version for version and project_urls.

Misc
^^^^
* #1533: Restricted the ``recursive-include setuptools/_vendor`` to contain only .py and .txt files.
* #1572: Added the ``concurrent.futures`` backport ``futures`` to the Python 2.7 test suite requirements.


v40.5.0
-------



Changes
^^^^^^^
* #1335: In ``pkg_resources.normalize_path``, fix issue on Cygwin when cwd contains symlinks.
* #1502: Deprecated support for downloads from Subversion in package_index/easy_install.
* #1517: Dropped use of six.u in favor of ``u""`` literals.
* #1520: Added support for ``data_files`` in ``setup.cfg``.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1525: Fixed rendering of the deprecation warning in easy_install doc.


v40.4.3
-------



Changes
^^^^^^^
* #1480: Bump vendored pyparsing in pkg_resources to 2.2.1.


v40.4.2
-------



Misc
^^^^
* #1497: Updated gitignore in repo.


v40.4.1
-------



Changes
^^^^^^^
* #1480: Bump vendored pyparsing to 2.2.1.


v40.4.0
-------



Changes
^^^^^^^
* #1481: Join the sdist ``--dist-dir`` and the ``build_meta`` sdist directory argument to point to the same target (meaning the build frontend no longer needs to clean manually the dist dir to avoid multiple sdist presence, and setuptools no longer needs to handle conflicts between the two).


v40.3.0
-------



Changes
^^^^^^^
* #1402: Fixed a bug with namespace packages under Python 3.6 when one package in
  current directory hides another which is installed.
* #1427: Set timestamp of ``.egg-info`` directory whenever ``egg_info`` command is run.
* #1474: ``build_meta.get_requires_for_build_sdist`` now does not include the ``wheel`` package anymore.
* #1486: Suppress warnings in pkg_resources.handle_ns.

Misc
^^^^
* #1479: Remove internal use of six.binary_type.


v40.2.0
-------



Changes
^^^^^^^
* #1466: Fix handling of Unicode arguments in PEP 517 backend


v40.1.1
--------



Changes
^^^^^^^
* #1465: Fix regression with ``egg_info`` command when tagging is used.


v40.1.0
-------



Changes
^^^^^^^
* #1410: Deprecated ``upload`` and ``register`` commands.
* #1312: Introduced find_namespace_packages() to find PEP 420 namespace packages.
* #1420: Added find_namespace: directive to config parser.
* #1418: Solved race in when creating egg cache directories.
* #1450: Upgraded vendored PyParsing from 2.1.10 to 2.2.0.
* #1451: Upgraded vendored appdirs from 1.4.0 to 1.4.3.
* #1388: Fixed "Microsoft Visual C++ Build Tools" link in exception when Visual C++ not found.
* #1389: Added support for scripts which have unicode content.
* #1416: Moved several Python version checks over to using ``six.PY2`` and ``six.PY3``.

Misc
^^^^
* #1441: Removed spurious executable permissions from files that don't need them.


v40.0.0
-------



Breaking Changes
^^^^^^^^^^^^^^^^
* #1342: Drop support for Python 3.3.

Changes
^^^^^^^
* #1366: In package_index, fixed handling of encoded entities in URLs.
* #1383: In pkg_resources VendorImporter, avoid removing packages imported from the root.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1379: Minor doc fixes after actually using the new release process.
* #1385: Removed section on non-package data files.
* #1403: Fix developer's guide.

Misc
^^^^
* #1404: Fix PEP 518 configuration: set build requirements in ``pyproject.toml`` to ``["wheel"]``.


v39.2.0
-------



Changes
^^^^^^^
* #1359: Support using "file:" to load a PEP 440-compliant package version from
  a text file.
* #1360: Fixed issue with a mismatch between the name of the package and the
  name of the .dist-info file in wheel files
* #1364: Add ``__dir__()`` implementation to ``pkg_resources.Distribution()`` that
  includes the attributes in the ``_provider`` instance variable.
* #1365: Take the package_dir option into account when loading the version from
  a module attribute.

Documentation changes
^^^^^^^^^^^^^^^^^^^^^
* #1353: Added coverage badge to README.
* #1356: Made small fixes to the developer guide documentation.
* #1357: Fixed warnings in documentation builds and started enforcing that the
  docs build without warnings in tox.
* #1376: Updated release process docs.

Misc
^^^^
* #1343: The ``setuptools`` specific ``long_description_content_type``,
  ``project_urls`` and ``provides_extras`` fields are now set consistently
  after any ``distutils`` ``setup_keywords`` calls, allowing them to override
  values.
* #1352: Added ``tox`` environment for documentation builds.
* #1354: Added ``towncrier`` for changelog management.
* #1355: Add PR template.
* #1368: Fixed tests which failed without network connectivity.
* #1369: Added unit tests for PEP 425 compatibility tags support.
* #1372: Stop testing Python 3.3 in Travis CI, now that the latest version of
  ``wheel`` no longer installs on it.

v39.1.0
-------

* #1340: Update all PyPI URLs to reflect the switch to the
  new Warehouse codebase.
* #1337: In ``pkg_resources``, now support loading resources
  for modules loaded by the ``SourcelessFileLoader``.
* #1332: Silence spurious wheel related warnings on Windows.

v39.0.1
-------

* #1297: Restore Unicode handling for Maintainer fields in
  metadata.

v39.0.0
-------

* #1296: Setuptools now vendors its own direct dependencies, no
  longer relying on the dependencies as vendored by pkg_resources.

* #296: Removed long-deprecated support for iteration on
  Version objects as returned by ``pkg_resources.parse_version``.
  Removed the ``SetuptoolsVersion`` and
  ``SetuptoolsLegacyVersion`` names as well. They should not
  have been used, but if they were, replace with
  ``Version`` and ``LegacyVersion`` from ``packaging.version``.

v38.7.0
-------

* #1288: Add support for maintainer in PKG-INFO.

v38.6.1
-------

* #1292: Avoid generating ``Provides-Extra`` in metadata when
  no extra is present (but environment markers are).

v38.6.0
-------

* #1286: Add support for Metadata 2.1 (PEP 566).

v38.5.2
-------

* #1285: Fixed RuntimeError in pkg_resources.parse_requirements
  on Python 3.7 (stemming from PEP 479).

v38.5.1
-------

* #1271: Revert to Cython legacy ``build_ext`` behavior for
  compatibility.

v38.5.0
-------

* #1229: Expand imports in ``build_ext`` to refine detection of
  Cython availability.

* #1270: When Cython is available, ``build_ext`` now uses the
  new_build_ext.

v38.4.1
-------

* #1257: In bdist_egg.scan_module, fix ValueError on Python 3.7.

v38.4.0
-------

* #1231: Removed warning when PYTHONDONTWRITEBYTECODE is enabled.

v38.3.0
-------

* #1210: Add support for PEP 345 Project-URL metadata.
* #1207: Add support for ``long_description_type`` to setup.cfg
  declarative config as intended and documented.

v38.2.5
-------

* #1232: Fix trailing slash handling in ``pkg_resources.ZipProvider``.

v38.2.4
-------

* #1220: Fix ``data_files`` handling when installing from wheel.

v38.2.3
-------

* fix Travis' Python 3.3 job.

v38.2.2
-------

* #1214: fix handling of namespace packages when installing
  from a wheel.

v38.2.1
-------

* #1212: fix encoding handling of metadata when installing
  from a wheel.

v38.2.0
-------

* #1200: easy_install now support installing from wheels:
  they will be installed as standalone unzipped eggs.

v38.1.0
-------

* #1208: Improve error message when failing to locate scripts
  in egg-info metadata.

v38.0.0
-------

* #458: In order to support deterministic builds, Setuptools no
  longer allows packages to declare ``install_requires`` as
  unordered sequences (sets or dicts).

v37.0.0
-------

* #878: Drop support for Python 2.6. Python 2.6 users should
  rely on 'setuptools < 37dev'.

v36.8.0
-------

* #1190: In SSL support for package index operations, use SNI
  where available.

v36.7.3
-------

* #1175: Bug fixes to ``build_meta`` module.

v36.7.2
-------

* #701: Fixed duplicate test discovery on Python 3.

v36.7.1
-------

* #1193: Avoid test failures in bdist_egg when
  PYTHONDONTWRITEBYTECODE is set.

v36.7.0
-------

* #1054: Support ``setup_requires`` in ``setup.cfg`` files.

v36.6.1
-------

* #1132: Removed redundant and costly serialization/parsing step
  in ``EntryPoint.__init__``.

* #844: ``bdist_egg --exclude-source-files`` now tested and works
  on Python 3.

v36.6.0
-------

* #1143: Added ``setuptools.build_meta`` module, an implementation
  of PEP-517 for Setuptools-defined packages.

* #1143: Added ``dist_info`` command for producing dist_info
  metadata.

v36.5.0
-------

* #170: When working with Mercurial checkouts, use Windows-friendly
  syntax for suppressing output.

* Inspired by #1134, performed substantial refactoring of
  ``pkg_resources.find_on_path`` to facilitate an optimization
  for paths with many non-version entries.

v36.4.0
-------

* #1075: Add new ``Description-Content-Type`` metadata field. `See here for
  documentation on how to use this field.
  <https://packaging.python.org/specifications/#description-content-type>`_

* #1068: Sort files and directories when building eggs for
  deterministic order.

* #196: Remove caching of easy_install command in fetch_build_egg.
  Fixes issue where ``pytest-runner-N.N`` would satisfy the installation
  of ``pytest``.

* #1129: Fix working set dependencies handling when replacing conflicting
  distributions (e.g. when using ``setup_requires`` with a conflicting
  transitive dependency, fix #1124).

* #1133: Improved handling of README files extensions and added
  Markdown to the list of searched READMES.

* #1135: Improve performance of pkg_resources import by not invoking
  ``access`` or ``stat`` and using ``os.listdir`` instead.

v36.3.0
-------

* #1131: Make possible using several files within ``file:`` directive
  in metadata.long_description in ``setup.cfg``.

v36.2.7
-------

* fix #1105: Fix handling of requirements with environment
  markers when declared in ``setup.cfg`` (same treatment as
  for #1081).

v36.2.6
-------

* #462: Don't assume a directory is an egg by the ``.egg``
  extension alone.

v36.2.5
-------

* #1093: Fix test command handler with extras_require.
* #1112, #1091, #1115: Now using Trusty containers in
  Travis for CI and CD.

v36.2.4
-------

* #1092: ``pkg_resources`` now uses ``inspect.getmro`` to
  resolve classes in method resolution order.

v36.2.3
-------

* #1102: Restore behavior for empty extras.

v36.2.2
-------

* #1099: Revert commit a3ec721, restoring intended purpose of
  extras as part of a requirement declaration.

v36.2.1
-------

* fix #1086
* fix #1087
* support extras specifiers in install_requires requirements

v36.2.0
-------

* #1081: Environment markers indicated in ``install_requires``
  are now processed and treated as nameless ``extras_require``
  with markers, allowing their metadata in requires.txt to be
  correctly generated.

* #1053: Tagged commits are now released using Travis-CI
  build stages, meaning releases depend on passing tests on
  all supported Python versions (Linux) and not just the latest
  Python version.

v36.1.1
-------

* #1083: Correct ``py31compat.makedirs`` to correctly honor
  ``exist_ok`` parameter.
* #1083: Also use makedirs compatibility throughout setuptools.

v36.1.0
-------

* #1083: Avoid race condition on directory creation in
  ``pkg_resources.ensure_directory``.

* Removed deprecation of and restored support for
  ``upload_docs`` command for sites other than PyPI.
  Only warehouse is dropping support, but services like
  `devpi <http://doc.devpi.net/latest/>`_ continue to
  support docs built by setuptools' plugins. See
  `this comment <https://bitbucket.org/hpk42/devpi/issues/388/support-rtd-model-for-building-uploading#comment-34292423>`_
  for more context on the motivation for this change.

v36.0.1
-------

* #1042: Fix import in py27compat module that still
  referenced six directly, rather than through the externs
  module (vendored packages hook).

v36.0.0
-------

* #980 and others: Once again, Setuptools vendors all
  of its dependencies. It seems to be the case that in
  the Python ecosystem, all build tools must run without
  any dependencies (build, runtime, or otherwise). At
  such a point that a mechanism exists that allows
  build tools to have dependencies, Setuptools will adopt
  it.

v35.0.2
-------

* #1015: Fix test failures on Python 3.7.

* #1024: Add workaround for Jython #2581 in monkey module.

v35.0.1
-------

* #992: Revert change introduced in v34.4.1, now
  considered invalid.

* #1016: Revert change introduced in v35.0.0 per #1014,
  referencing #436. The approach had unintended
  consequences, causing sdist installs to be missing
  files.

v35.0.0
-------

* #436: In egg_info.manifest_maker, no longer read
  the file list from the manifest file, and instead
  re-build it on each build. In this way, files removed
  from the specification will not linger in the manifest.
  As a result, any files manually added to the manifest
  will be removed on subsequent egg_info invocations.
  No projects should be manually adding files to the
  manifest and should instead use MANIFEST.in or SCM
  file finders to force inclusion of files in the manifest.

v34.4.1
-------

* #1008: In MSVC support, use always the last version available for Windows SDK and UCRT SDK.

* #1008: In MSVC support, fix "vcruntime140.dll" returned path with Visual Studio 2017.

* #992: In msvc.msvc9_query_vcvarsall, ensure the
  returned dicts have str values and not Unicode for
  compatibility with os.environ.

v34.4.0
-------

* #995: In MSVC support, add support for "Microsoft Visual Studio 2017" and "Microsoft Visual Studio Build Tools 2017".

* #999 via #1007: Extend support for declarative package
  config in a setup.cfg file to include the options
  ``python_requires`` and ``py_modules``.

v34.3.3
-------

* #967 (and #997): Explicitly import submodules of
  packaging to account for environments where the imports
  of those submodules is not implied by other behavior.

v34.3.2
-------

* #993: Fix documentation upload by correcting
  rendering of content-type in _build_multipart
  on Python 3.

v34.3.1
-------

* #988: Trap ``os.unlink`` same as ``os.remove`` in
  ``auto_chmod`` error handler.

* #983: Fixes to invalid escape sequence deprecations on
  Python 3.6.

v34.3.0
-------

* #941: In the upload command, if the username is blank,
  default to ``getpass.getuser()``.

* #971: Correct distutils findall monkeypatch to match
  appropriate versions (namely Python 3.4.6).

v34.2.0
-------

* #966: Add support for reading dist-info metadata and
  thus locating Distributions from zip files.

* #968: Allow '+' and '!' in egg fragments
  so that it can take package names that contain
  PEP 440 conforming version specifiers.

v34.1.1
-------

* #953: More aggressively employ the compatibility issue
  originally added in #706.

v34.1.0
-------

* #930: ``build_info`` now accepts two new parameters
  to optimize and customize the building of C libraries.

v34.0.3
-------

* #947: Loosen restriction on the version of six required,
  restoring compatibility with environments relying on
  six 1.6.0 and later.

v34.0.2
-------

* #882: Ensure extras are honored when building the
  working set.
* #913: Fix issue in develop if package directory has
  a trailing slash.

v34.0.1
-------

* #935: Fix glob syntax in graft.

v34.0.0
-------

* #581: Instead of vendoring the growing list of
  dependencies that Setuptools requires to function,
  Setuptools now requires these dependencies just like
  any other project. Unlike other projects, however,
  Setuptools cannot rely on ``setup_requires`` to
  demand the dependencies it needs to install because
  its own machinery would be necessary to pull those
  dependencies if not present (a bootstrapping problem).
  As a result, Setuptools no longer supports self upgrade or
  installation in the general case. Instead, users are
  directed to use pip to install and upgrade using the
  ``wheel`` distributions of setuptools.

  Users are welcome to contrive other means to install
  or upgrade Setuptools using other means, such as
  pre-installing the Setuptools dependencies with pip
  or a bespoke bootstrap tool, but such usage is not
  recommended and is not supported.

  As discovered in #940, not all versions of pip will
  successfully install Setuptools from its pre-built
  wheel. If you encounter issues with "No module named
  six" or "No module named packaging", especially
  following a line "Running setup.py egg_info for package
  setuptools", then your pip is not new enough.

  There's an additional issue in pip where setuptools
  is upgraded concurrently with other source packages,
  described in pip #4253. The proposed workaround is to
  always upgrade Setuptools first prior to upgrading
  other packages that would upgrade Setuptools.

v33.1.1
-------

* #921: Correct issue where certifi fallback not being
  reached on Windows.

v33.1.0
-------

Installation via pip, as indicated in the `Python Packaging
User's Guide <https://packaging.python.org/installing/>`_,
is the officially-supported mechanism for installing
Setuptools, and this recommendation is now explicit in the
much more concise README.

Other edits and tweaks were made to the documentation. The
codebase is unchanged.

v33.0.0
-------

* #619: Removed support for the ``tag_svn_revision``
  distribution option. If Subversion tagging support is
  still desired, consider adding the functionality to
  setuptools_svn in setuptools_svn #2.

v32.3.1
-------

* #866: Use ``dis.Bytecode`` on Python 3.4 and later in
  ``setuptools.depends``.

v32.3.0
-------

* #889: Backport proposed fix for disabling interpolation in
  distutils.Distribution.parse_config_files.

v32.2.0
-------

* #884: Restore support for running the tests under
  `pytest-runner <https://github.com/pytest-dev/pytest-runner>`_
  by ensuring that PYTHONPATH is honored in tests invoking
  a subprocess.

v32.1.3
-------

* #706: Add rmtree compatibility shim for environments where
  rmtree fails when passed a unicode string.

v32.1.2
-------

* #893: Only release sdist in zip format as warehouse now
  disallows releasing two different formats.

v32.1.1
-------

* #704: More selectively ensure that 'rmtree' is not invoked with
  a byte string, enabling it to remove files that are non-ascii,
  even on Python 2.

* #712: In 'sandbox.run_setup', ensure that ``__file__`` is
  always a ``str``, modeling the behavior observed by the
  interpreter when invoking scripts and modules.

v32.1.0
-------

* #891: In 'test' command on test failure, raise DistutilsError,
  suppression invocation of subsequent commands.

v32.0.0
-------

* #890: Revert #849. ``global-exclude .foo`` will not match all
  ``*.foo`` files any more. Package authors must add an explicit
  wildcard, such as ``global-exclude *.foo``, to match all
  ``.foo`` files. See #886, #849.

v31.0.1
-------

* #885: Fix regression where 'pkg_resources._rebuild_mod_path'
  would fail when a namespace package's '__path__' was not
  a list with a sort attribute.

v31.0.0
-------

* #250: Install '-nspkg.pth' files for packages installed
  with 'setup.py develop'. These .pth files allow
  namespace packages installed by pip or develop to
  co-mingle. This change required the removal of the
  change for #805 and pip #1924, introduced in 28.3.0 and implicated
  in #870, but means that namespace packages not in a
  site packages directory will no longer work on Python
  earlier than 3.5, whereas before they would work on
  Python not earlier than 3.3.

v30.4.0
-------

* #879: For declarative config:

  - read_configuration() now accepts ignore_option_errors argument. This allows scraping tools to read metadata without a need to download entire packages. E.g. we can gather some stats right from GitHub repos just by downloading setup.cfg.

  - packages find: directive now supports fine tuning from a subsection. The same arguments as for find() are accepted.

v30.3.0
-------

* #394 via #862: Added support for `declarative package
  config in a setup.cfg file
  <https://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files>`_.

v30.2.1
-------

* #850: In test command, invoke unittest.main with
  indication not to exit the process.

v30.2.0
-------

* #854: Bump to vendored Packaging 16.8.

v30.1.0
-------

* #846: Also trap 'socket.error' when opening URLs in
  package_index.

* #849: Manifest processing now matches the filename
  pattern anywhere in the filename and not just at the
  start. Restores behavior found prior to 28.5.0.

v30.0.0
-------

* #864: Drop support for Python 3.2. Systems requiring
  Python 3.2 support must use 'setuptools < 30'.

* #825: Suppress warnings for single files.

* #830 via #843: Once again restored inclusion of data
  files to sdists, but now trap TypeError caused by
  techniques employed rjsmin and similar.

v29.0.1
-------

* #861: Re-release of v29.0.1 with the executable script
  launchers bundled. Now, launchers are included by default
  and users that want to disable this behavior must set the
  environment variable
  'SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES' to
  a false value like "false" or "0".

v29.0.0
-------

* #841: Drop special exception for packages invoking
  win32com during the build/install process. See
  Distribute #118 for history.

v28.8.0
-------

* #629: Per the discussion, refine the sorting to use version
  value order for more accurate detection of the latest
  available version when scanning for packages. See also
  #829.

* #837: Rely on the config var "SO" for Python 3.3.0 only
  when determining the ext filename.

v28.7.1
-------

* #827: Update PyPI root for dependency links.

* #833: Backed out changes from #830 as the implementation
  seems to have problems in some cases.

v28.7.0
-------

* #832: Moved much of the namespace package handling
  functionality into a separate module for re-use in something
  like #789.
* #830: ``sdist`` command no longer suppresses the inclusion
  of data files, re-aligning with the expectation of distutils
  and addressing #274 and #521.

v28.6.1
-------

* #816: Fix manifest file list order in tests.

v28.6.0
-------

* #629: When scanning for packages, ``pkg_resources`` now
  ignores empty egg-info directories and gives precedence to
  packages whose versions are lexicographically greatest,
  a rough approximation for preferring the latest available
  version.

v28.5.0
-------

* #810: Tests are now invoked with tox and not setup.py test.
* #249 and #450 via #764: Avoid scanning the whole tree
  when building the manifest. Also fixes a long-standing bug
  where patterns in ``MANIFEST.in`` had implicit wildcard
  matching. This caused ``global-exclude .foo`` to exclude
  all ``*.foo`` files, but also ``global-exclude bar.py`` to
  exclude ``foo_bar.py``.

v28.4.0
-------

* #732: Now extras with a hyphen are honored per PEP 426.
* #811: Update to pyparsing 2.1.10.
* Updated ``setuptools.command.sdist`` to re-use most of
  the functionality directly from ``distutils.command.sdist``
  for the ``add_defaults`` method with strategic overrides.
  See #750 for rationale.
* #760 via #762: Look for certificate bundle where SUSE
  Linux typically presents it. Use ``certifi.where()`` to locate
  the bundle.

v28.3.0
-------

* #809: In ``find_packages()``, restore support for excluding
  a parent package without excluding a child package.

* #805: Disable ``-nspkg.pth`` behavior on Python 3.3+ where
  PEP-420 functionality is adequate. Fixes pip #1924.

v28.1.0
-------

* #803: Bump certifi to 2016.9.26.

v28.0.0
-------

* #733: Do not search excluded directories for packages.
  This introduced a backwards incompatible change in ``find_packages()``
  so that ``find_packages(exclude=['foo']) == []``, excluding subpackages of ``foo``.
  Previously, ``find_packages(exclude=['foo']) == ['foo.bar']``,
  even though the parent ``foo`` package was excluded.

* #795: Bump certifi.

* #719: Suppress decoding errors and instead log a warning
  when metadata cannot be decoded.

v27.3.1
-------

* #790: In MSVC monkeypatching, explicitly patch each
  function by name in the target module instead of inferring
  the module from the function's ``__module__``. Improves
  compatibility with other packages that might have previously
  patched distutils functions (i.e. NumPy).

v27.3.0
-------

* #794: In test command, add installed eggs to PYTHONPATH
  when invoking tests so that subprocesses will also have the
  dependencies available. Fixes `tox 330
  <https://github.com/tox-dev/tox/issues/330>`_.

* #795: Update vendored pyparsing 2.1.9.

v27.2.0
-------

* #520 and #513: Suppress ValueErrors in fixup_namespace_packages
  when lookup fails.

* Nicer, more consistent interfaces for msvc monkeypatching.

v27.1.2
-------

* #779 via #781: Fix circular import.

v27.1.1
-------

* #778: Fix MSVC monkeypatching.

v27.1.0
-------

* Introduce the (private) ``monkey`` module to encapsulate
  the distutils monkeypatching behavior.

v27.0.0
-------

* Now use Warehouse by default for
  ``upload``, patching ``distutils.config.PyPIRCCommand`` to
  affect default behavior.

  Any config in .pypirc should be updated to replace

    https://pypi.python.org/pypi/

  with

    https://upload.pypi.org/legacy/

  Similarly, any passwords stored in the keyring should be
  updated to use this new value for "system".

  The ``upload_docs`` command will continue to use the python.org
  site, but the command is now deprecated. Users are urged to use
  Read The Docs instead.

* #776: Use EXT_SUFFIX for py_limited_api renaming.

* #774 and #775: Use LegacyVersion from packaging when
  detecting numpy versions.

v26.1.1
-------

* Re-release of 26.1.0 with pytest pinned to allow for automated
  deployment and thus proper packaging environment variables,
  fixing issues with missing executable launchers.

v26.1.0
-------

* #763: ``pkg_resources.get_default_cache`` now defers to the
  `appdirs project <https://pypi.org/project/appdirs>`_ to
  resolve the cache directory. Adds a vendored dependency on
  appdirs to pkg_resources.

v26.0.0
-------

* #748: By default, sdists are now produced in gzipped tarfile
  format by default on all platforms, adding forward compatibility
  for the same behavior in Python 3.6 (See Python #27819).

* #459 via #736: On Windows with script launchers,
  sys.argv[0] now reflects
  the name of the entry point, consistent with the behavior in
  distlib and pip wrappers.

* #752 via #753: When indicating ``py_limited_api`` to Extension,
  it must be passed as a keyword argument.

v25.4.0
-------

* Add Extension(py_limited_api=True). When set to a truthy value,
  that extension gets a filename appropriate for code using Py_LIMITED_API.
  When used correctly this allows a single compiled extension to work on
  all future versions of CPython 3.
  The py_limited_api argument only controls the filename. To be
  compatible with multiple versions of Python 3, the C extension
  will also need to set -DPy_LIMITED_API=... and be modified to use
  only the functions in the limited API.

v25.3.0
-------

* #739 Fix unquoted libpaths by fixing compatibility between ``numpy.distutils`` and ``distutils._msvccompiler`` for numpy < 1.11.2 (Fix issue #728, error also fixed in Numpy).

* #731: Bump certifi.

* Style updates. See #740, #741, #743, #744, #742, #747.

* #735: include license file.

v25.2.0
-------

* #612 via #730: Add a LICENSE file which needs to be provided by the terms of
  the MIT license.

v25.1.6
-------

* #725: revert ``library_dir_option`` patch (Error is related to ``numpy.distutils`` and make errors on non Numpy users).

v25.1.5
-------

* #720
* #723: Improve patch for ``library_dir_option``.

v25.1.4
-------

* #717
* #713
* #707: Fix Python 2 compatibility for MSVC by catching errors properly.
* #715: Fix unquoted libpaths by patching ``library_dir_option``.

v25.1.3
-------

* #714 and #704: Revert fix as it breaks other components
  downstream that can't handle unicode. See #709, #710,
  and #712.

v25.1.2
-------

* #704: Fix errors when installing a zip sdist that contained
  files named with non-ascii characters on Windows would
  crash the install when it attempted to clean up the build.
* #646: MSVC compatibility - catch errors properly in
  RegistryInfo.lookup.
* #702: Prevent UnboundLocalError when initial working_set
  is empty.

v25.1.1
-------

* #686: Fix issue in sys.path ordering by pkg_resources when
  rewrite technique is "raw".
* #699: Fix typo in msvc support.

v25.1.0
-------

* #609: Setuptools will now try to download a distribution from
  the next possible download location if the first download fails.
  This means you can now specify multiple links as ``dependency_links``
  and all links will be tried until a working download link is encountered.

v25.0.2
-------

* #688: Fix AttributeError in setup.py when invoked not from
  the current directory.

v25.0.1
-------

* Cleanup of setup.py script.

* Fixed documentation builders by allowing setup.py
  to be imported without having bootstrapped the
  metadata.

* More style cleanup. See #677, #678, #679, #681, #685.

v25.0.0
-------

* #674: Default ``sys.path`` manipulation by easy-install.pth
  is now "raw", meaning that when writing easy-install.pth
  during any install operation, the ``sys.path`` will not be
  rewritten and will no longer give preference to easy_installed
  packages.

  To retain the old behavior when using any easy_install
  operation (including ``setup.py install`` when setuptools is
  present), set the environment variable:

    SETUPTOOLS_SYS_PATH_TECHNIQUE=rewrite

  This project hopes that that few if any environments find it
  necessary to retain the old behavior, and intends to drop
  support for it altogether in a future release. Please report
  any relevant concerns in the ticket for this change.

v24.3.1
-------

* #398: Fix shebang handling on Windows in script
  headers where spaces in ``sys.executable`` would
  produce an improperly-formatted shebang header,
  introduced in 12.0 with the fix for #188.

* #663, #670: More style updates.

v24.3.0
-------

* #516: Disable ``os.link`` to avoid hard linking
  in ``sdist.make_distribution``, avoiding errors on
  systems that support hard links but not on the
  file system in which the build is occurring.

v24.2.1
-------

* #667: Update Metadata-Version to 1.2 when
  ``python_requires`` is supplied.

v24.2.0
-------

* #631: Add support for ``python_requires`` keyword.

v24.1.1
-------

* More style updates. See #660, #661, #641.

v24.1.0
-------

* #659: ``setup.py`` now will fail fast and with a helpful
  error message when the necessary metadata is missing.
* More style updates. See #656, #635, #640,
  #644, #650, #652, and #655.

v24.0.3
-------

* Updated style in much of the codebase to match
  community expectations. See #632, #633, #634,
  #637, #639, #638, #642, #648.

v24.0.2
-------

* If MSVC++14 is needed ``setuptools.msvc`` now redirect
  user to Visual C++ Build Tools web page.

v24.0.1
-------

* #625 and #626: Fixes on ``setuptools.msvc`` mainly
  for Python 2 and Linux.

v24.0.0
-------

* Pull Request #174: Add more aggressive support for
  standalone Microsoft Visual C++ compilers in
  msvc9compiler patch.
  Particularly : Windows SDK 6.1 and 7.0
  (MSVC++ 9.0), Windows SDK 7.1 (MSVC++ 10.0),
  Visual C++ Build Tools 2015 (MSVC++14)
* Renamed ``setuptools.msvc9_support`` to
  ``setuptools.msvc``.

v23.2.1
-------

Re-release of v23.2.0, which was missing the intended
commits.

* #623: Remove used of deprecated 'U' flag when reading
  manifests.

v23.1.0
-------

* #619: Deprecated ``tag_svn_revision`` distribution
  option.

v23.0.0
-------

* #611: Removed ARM executables for CLI and GUI script
  launchers on Windows. If this was a feature you cared
  about, please comment in the ticket.
* #604: Removed docs building support. The project
  now relies on documentation hosted at
  https://setuptools.readthedocs.io/.

v22.0.5
-------

* #604: Restore repository for upload_docs command
  to restore publishing of docs during release.

v22.0.4
-------

* #589: Upload releases to pypi.io using the upload
  hostname and legacy path.

v22.0.3
-------

* #589: Releases are now uploaded to pypi.io (Warehouse)
  even when releases are made on Twine via Travis.

v22.0.2
-------

* #589: Releases are now uploaded to pypi.io (Warehouse).

v22.0.1
-------

* #190: On Python 2, if unicode is passed for packages to
  ``build_py`` command, it will be handled just as with
  text on Python 3.

v22.0.0
-------

Intended to be v21.3.0, but jaraco accidentally released as
a major bump.

* #598: Setuptools now lists itself first in the User-Agent
  for web requests, better following the guidelines in
  `RFC 7231
  <https://tools.ietf.org/html/rfc7231#section-5.5.3>`_.

v21.2.2
-------

* Minor fixes to changelog and docs.

v21.2.1
-------

* #261: Exclude directories when resolving globs in
  package_data.

v21.2.0
-------

* #539: In the easy_install get_site_dirs, honor all
  paths found in ``site.getsitepackages``.

v21.1.0
-------

* #572: In build_ext, now always import ``_CONFIG_VARS``
  from ``distutils`` rather than from ``sysconfig``
  to allow ``distutils.sysconfig.customize_compiler``
  configure the OS X compiler for ``-dynamiclib``.

v21.0.0
-------

* Removed ez_setup.py from Setuptools sdist. The
  bootstrap script will be maintained in its own
  branch and should be generally be retrieved from
  its canonical location at
  https://bootstrap.pypa.io/ez_setup.py.

v20.10.0
--------

* #553: egg_info section is now generated in a
  deterministic order, matching the order generated
  by earlier versions of Python. Except on Python 2.6,
  order is preserved when existing settings are present.
* #556: Update to Packaging 16.7, restoring support
  for deprecated ``python_implmentation`` marker.
* #555: Upload command now prompts for a password
  when uploading to PyPI (or other repository) if no
  password is present in .pypirc or in the keyring.

v20.9.0
-------

* #548: Update certify version to 2016.2.28
* #545: Safely handle deletion of non-zip eggs in rotate
  command.

v20.8.1
-------

* Issue #544: Fix issue with extra environment marker
  processing in WorkingSet due to refactor in v20.7.0.

v20.8.0
-------

* Issue #543: Re-release so that latest release doesn't
  cause déjà vu with distribute and setuptools 0.7 in
  older environments.

v20.7.0
-------

* Refactored extra environment marker processing
  in WorkingSet.
* Issue #533: Fixed intermittent test failures.
* Issue #536: In msvc9_support, trap additional exceptions
  that might occur when importing
  ``distutils.msvc9compiler`` in mingw environments.
* Issue #537: Provide better context when package
  metadata fails to decode in UTF-8.

v20.6.8
-------

* Issue #523: Restored support for environment markers,
  now honoring 'extra' environment markers.

v20.6.7
-------

* Issue #523: Disabled support for environment markers
  introduced in v20.5.

v20.6.6
-------

* Issue #503: Restore support for PEP 345 environment
  markers by updating to Packaging 16.6.

v20.6.0
-------

* New release process that relies on
  `bumpversion <https://github.com/peritus/bumpversion>`_
  and Travis CI for continuous deployment.
* Project versioning semantics now follow
  `semver <https://semver.org>`_ precisely.
  The 'v' prefix on version numbers now also allows
  version numbers to be referenced in the changelog,
  e.g. http://setuptools.readthedocs.io/en/latest/history.html#v20-6-0.

20.5
----

* BB Pull Request #185, #470: Add support for environment markers
  in requirements in install_requires, setup_requires,
  tests_require as well as adding a test for the existing
  extra_requires machinery.

20.4
----

* Issue #422: Moved hosting to
  `Github <https://github.com/pypa/setuptools>`_
  from `Bitbucket <https://bitbucket.org/pypa/setuptools>`_.
  Issues have been migrated, though all issues and comments
  are attributed to bb-migration. So if you have a particular
  issue or issues to which you've been subscribed, you will
  want to "watch" the equivalent issue in Github.
  The Bitbucket project will be retained for the indefinite
  future, but Github now hosts the canonical project repository.

20.3.1
------

* Issue #519: Remove import hook when reloading the
  ``pkg_resources`` module.
* BB Pull Request #184: Update documentation in ``pkg_resources``
  around new ``Requirement`` implementation.

20.3
----

* BB Pull Request #179: ``pkg_resources.Requirement`` objects are
  now a subclass of ``packaging.requirements.Requirement``,
  allowing any environment markers and url (if any) to be
  affiliated with the requirement
* BB Pull Request #179: Restore use of RequirementParseError
  exception unintentionally dropped in 20.2.

20.2.2
------

* Issue #502: Correct regression in parsing of multiple
  version specifiers separated by commas and spaces.

20.2.1
------

* Issue #499: Restore compatibility for legacy versions
  by bumping to packaging 16.4.

20.2
----

* Changelog now includes release dates and links to PEPs.
* BB Pull Request #173: Replace dual PEP 345 _markerlib implementation
  and PEP 426 implementation of environment marker support from
  packaging 16.1 and PEP 508. Fixes Issue #122.
  See also BB Pull Request #175, BB Pull Request #168, and
  BB Pull Request #164. Additionally:

   - ``Requirement.parse`` no longer retains the order of extras.
   - ``parse_requirements`` now requires that all versions be
     PEP-440 compliant, as revealed in #499. Packages released
     with invalid local versions should be re-released using
     the proper local version syntax, e.g. ``mypkg-1.0+myorg.1``.

20.1.1
------

* Update ``upload_docs`` command to also honor keyring
  for password resolution.

20.1
----

* Added support for using passwords from keyring in the upload
  command. See `the upload docs
  <https://setuptools.readthedocs.io/en/latest/setuptools.html#upload-upload-source-and-or-egg-distributions-to-pypi>`_
  for details.

20.0
----

* Issue #118: Once again omit the package metadata (egg-info)
  from the list of outputs in ``--record``. This version of setuptools
  can no longer be used to upgrade pip earlier than 6.0.

19.7
----

* Off-project PR: `0dcee79 <https://github.com/pypa/setuptools/commit/0dcee791dfdcfacddaaec79b29f30a347a147413>`_ and `f9bd9b9 <https://github.com/pypa/setuptools/commit/f9bd9b9f5df54ef5a0bf8d16c3a889ab8c640580>`_
  For FreeBSD, also `honor root certificates from ca_root_nss <https://github.com/pypa/setuptools/commit/3ae46c30225eb46e1f5aada1a19e88b79f04dc72>`_.

19.6.2
------

* Issue #491: Correct regression incurred in 19.4 where
  a double-namespace package installed using pip would
  cause a TypeError.

19.6.1
------

* Restore compatibility for PyPy 3 compatibility lost in
  19.4.1 addressing Issue #487.
* ``setuptools.launch`` shim now loads scripts in a new
  namespace, avoiding getting relative imports from
  the setuptools package on Python 2.

19.6
----

* Added a new entry script ``setuptools.launch``,
  implementing the shim found in
  ``pip.util.setuptools_build``. Use this command to launch
  distutils-only packages under setuptools in the same way that
  pip does, causing the setuptools monkeypatching of distutils
  to be invoked prior to invoking a script. Useful for debugging
  or otherwise installing a distutils-only package under
  setuptools when pip isn't available or otherwise does not
  expose the desired functionality. For example::

    $ python -m setuptools.launch setup.py develop

* Issue #488: Fix dual manifestation of Extension class in
  extension packages installed as dependencies when Cython
  is present.

19.5
----

* Issue #486: Correct TypeError when getfilesystemencoding
  returns None.
* Issue #139: Clarified the license as MIT.
* BB Pull Request #169: Removed special handling of command
  spec in scripts for Jython.

19.4.1
------

* Issue #487: Use direct invocation of ``importlib.machinery``
  in ``pkg_resources`` to avoid missing detection on relevant
  platforms.

19.4
----

* Issue #341: Correct error in path handling of package data
  files in ``build_py`` command when package is empty.
* Distribute #323, Issue #141, Issue #207, and
  BB Pull Request #167: Another implementation of
  ``pkg_resources.WorkingSet`` and ``pkg_resources.Distribution``
  that supports replacing an extant package with a new one,
  allowing for setup_requires dependencies to supersede installed
  packages for the session.

19.3
----

* Issue #229: Implement new technique for readily incorporating
  dependencies conditionally from vendored copies or primary
  locations. Adds a new dependency on six.

19.2
----

* BB Pull Request #163: Add get_command_list method to Distribution.
* BB Pull Request #162: Add missing whitespace to multiline string
  literals.

19.1.1
------

* Issue #476: Cast version to string (using default encoding)
  to avoid creating Unicode types on Python 2 clients.
* Issue #477: In Powershell downloader, use explicit rendering
  of strings, rather than rely on ``repr``, which can be
  incorrect (especially on Python 2).

19.1
----

* Issue #215: The bootstrap script ``ez_setup.py`` now
  automatically detects
  the latest version of setuptools (using PyPI JSON API) rather
  than hard-coding a particular value.
* Issue #475: Fix incorrect usage in _translate_metadata2.

19.0
----

* Issue #442: Use RawConfigParser for parsing .pypirc file.
  Interpolated values are no longer honored in .pypirc files.

18.8.1
------

* Issue #440: Prevent infinite recursion when a SandboxViolation
  or other UnpickleableException occurs in a sandbox context
  with setuptools hidden. Fixes regression introduced in Setuptools
  12.0.

18.8
----

* Deprecated ``egg_info.get_pkg_info_revision``.
* Issue #471: Don't rely on repr for an HTML attribute value in
  package_index.
* Issue #419: Avoid errors in FileMetadata when the metadata directory
  is broken.
* Issue #472: Remove deprecated use of 'U' in mode parameter
  when opening files.

18.7.1
------

* Issue #469: Refactored logic for Issue #419 fix to re-use metadata
  loading from Provider.

18.7
----

* Update dependency on certify.
* BB Pull Request #160: Improve detection of gui script in
  ``easy_install._adjust_header``.
* Made ``test.test_args`` a non-data property; alternate fix
  for the issue reported in BB Pull Request #155.
* Issue #453: In ``ez_setup`` bootstrap module, unload all
  ``pkg_resources`` modules following download.
* BB Pull Request #158: Honor PEP-488 when excluding
  files for namespace packages.
* Issue #419 and BB Pull Request #144: Add experimental support for
  reading the version info from distutils-installed metadata rather
  than using the version in the filename.

18.6.1
------

* Issue #464: Correct regression in invocation of superclass on old-style
  class on Python 2.

18.6
----

* Issue #439: When installing entry_point scripts under development,
  omit the version number of the package, allowing any version of the
  package to be used.

18.5
----

* In preparation for dropping support for Python 3.2, a warning is
  now logged when pkg_resources is imported on Python 3.2 or earlier
  Python 3 versions.
* `Add support for python_platform_implementation environment marker
  <https://github.com/pypa/setuptools/commit/94416707fd59a65f4a8f7f70541d6b3fc018b626>`_.
* `Fix dictionary mutation during iteration
  <https://github.com/pypa/setuptools/commit/57ebfa41e0f96b97e599ecd931b7ae8a143e096e>`_.

18.4
----

* Issue #446: Test command now always invokes unittest, even
  if no test suite is supplied.

18.3.2
------

* Correct another regression in setuptools.findall
  where the fix for Python #12885 was lost.

18.3.1
------

* Issue #425: Correct regression in setuptools.findall.

18.3
----

* BB Pull Request #135: Setuptools now allows disabling of
  the manipulation of the sys.path
  during the processing of the easy-install.pth file. To do so, set
  the environment variable ``SETUPTOOLS_SYS_PATH_TECHNIQUE`` to
  anything but "rewrite" (consider "raw"). During any install operation
  with manipulation disabled, setuptools packages will be appended to
  sys.path naturally.

  Future versions may change the default behavior to disable
  manipulation. If so, the default behavior can be retained by setting
  the variable to "rewrite".

* Issue #257: ``easy_install --version`` now shows more detail
  about the installation location and Python version.

* Refactor setuptools.findall in preparation for re-submission
  back to distutils.

18.2
----

* Issue #412: More efficient directory search in ``find_packages``.

18.1
----

* Upgrade to vendored packaging 15.3.

18.0.1
------

* Issue #401: Fix failure in test suite.

18.0
----

* Dropped support for builds with Pyrex. Only Cython is supported.
* Issue #288: Detect Cython later in the build process, after
  ``setup_requires`` dependencies are resolved.
  Projects backed by Cython can now be readily built
  with a ``setup_requires`` dependency. For example::

    ext = setuptools.Extension('mylib', ['src/CythonStuff.pyx', 'src/CStuff.c'])
    setuptools.setup(
        ...
        ext_modules=[ext],
        setup_requires=['cython'],
    )

  For compatibility with older versions of setuptools, packagers should
  still include ``src/CythonMod.c`` in the source distributions or
  require that Cython be present before building source distributions.
  However, for systems with this build of setuptools, Cython will be
  downloaded on demand.
* Issue #396: Fixed test failure on OS X.
* BB Pull Request #136: Remove excessive quoting from shebang headers
  for Jython.

17.1.1
------

* Backed out unintended changes to pkg_resources, restoring removal of
  deprecated imp module (`ref
  <https://bitbucket.org/pypa/setuptools/commits/f572ec9563d647fa8d4ffc534f2af8070ea07a8b#comment-1881283>`_).

17.1
----

* Issue #380: Add support for range operators on environment
  marker evaluation.

17.0
----

* Issue #378: Do not use internal importlib._bootstrap module.
* Issue #390: Disallow console scripts with path separators in
  the name. Removes unintended functionality and brings behavior
  into parity with pip.

16.0
----

* BB Pull Request #130: Better error messages for errors in
  parsed requirements.
* BB Pull Request #133: Removed ``setuptools.tests`` from the
  installed packages.
* BB Pull Request #129: Address deprecation warning due to usage
  of imp module.

15.2
----

* Issue #373: Provisionally expose
  ``pkg_resources._initialize_master_working_set``, allowing for
  imperative re-initialization of the master working set.

15.1
----

* Updated to Packaging 15.1 to address Packaging #28.
* Fix ``setuptools.sandbox._execfile()`` with Python 3.1.

15.0
----

* BB Pull Request #126: DistributionNotFound message now lists the package or
  packages that required it. E.g.::

      pkg_resources.DistributionNotFound: The 'colorama>=0.3.1' distribution was not found and is required by smlib.log.

  Note that zc.buildout once dependended on the string rendering of this
  message to determine the package that was not found. This expectation
  has since been changed, but older versions of buildout may experience
  problems. See Buildout #242 for details.

14.3.1
------

* Issue #307: Removed PEP-440 warning during parsing of versions
  in ``pkg_resources.Distribution``.
* Issue #364: Replace deprecated usage with recommended usage of
  ``EntryPoint.load``.

14.3
----

* Issue #254: When creating temporary egg cache on Unix, use mode 755
  for creating the directory to avoid the subsequent warning if
  the directory is group writable.

14.2
----

* Issue #137: Update ``Distribution.hashcmp`` so that Distributions with
  None for pyversion or platform can be compared against Distributions
  defining those attributes.

14.1.1
------

* Issue #360: Removed undesirable behavior from test runs, preventing
  write tests and installation to system site packages.

14.1
----

* BB Pull Request #125: Add ``__ne__`` to Requirement class.
* Various refactoring of easy_install.

14.0
----

* Bootstrap script now accepts ``--to-dir`` to customize save directory or
  allow for re-use of existing repository of setuptools versions. See
  BB Pull Request #112 for background.
* Issue #285: ``easy_install`` no longer will default to installing
  packages to the "user site packages" directory if it is itself installed
  there. Instead, the user must pass ``--user`` in all cases to install
  packages to the user site packages.
  This behavior now matches that of "pip install". To configure
  an environment to always install to the user site packages, consider
  using the "install-dir" and "scripts-dir" parameters to easy_install
  through an appropriate distutils config file.

13.0.2
------

* Issue #359: Include pytest.ini in the sdist so invocation of py.test on the
  sdist honors the pytest configuration.

13.0.1
------

Re-release of 13.0. Intermittent connectivity issues caused the release
process to fail and PyPI uploads no longer accept files for 13.0.

13.0
----

* Issue #356: Back out BB Pull Request #119 as it requires Setuptools 10 or later
  as the source during an upgrade.
* Removed build_py class from setup.py. According to 892f439d216e, this
  functionality was added to support upgrades from old Distribute versions,
  0.6.5 and 0.6.6.

12.4
----

* BB Pull Request #119: Restore writing of ``setup_requires`` to metadata
  (previously added in 8.4 and removed in 9.0).

12.3
----

* Documentation is now linked using the rst.linker package.
* Fix ``setuptools.command.easy_install.extract_wininst_cfg()``
  with Python 2.6 and 2.7.
* Issue #354. Added documentation on building setuptools
  documentation.

12.2
----

* Issue #345: Unload all modules under pkg_resources during
  ``ez_setup.use_setuptools()``.
* Issue #336: Removed deprecation from ``ez_setup.use_setuptools``,
  as it is clearly still used by buildout's bootstrap. ``ez_setup``
  remains deprecated for use by individual packages.
* Simplified implementation of ``ez_setup.use_setuptools``.

12.1
----

* BB Pull Request #118: Soften warning for non-normalized versions in
  Distribution.

12.0.5
------

* Issue #339: Correct Attribute reference in ``cant_write_to_target``.
* Issue #336: Deprecated ``ez_setup.use_setuptools``.

12.0.4
------

* Issue #335: Fix script header generation on Windows.

12.0.3
------

* Fixed incorrect class attribute in ``install_scripts``. Tests would be nice.

12.0.2
------

* Issue #331: Fixed ``install_scripts`` command on Windows systems corrupting
  the header.

12.0.1
------

* Restore ``setuptools.command.easy_install.sys_executable`` for pbr
  compatibility. For the future, tools should construct a CommandSpec
  explicitly.

12.0
----

* Issue #188: Setuptools now support multiple entities in the value for
  ``build.executable``, such that an executable of "/usr/bin/env my-python" may
  be specified. This means that systems with a specified executable whose name
  has spaces in the path must be updated to escape or quote that value.
* Deprecated ``easy_install.ScriptWriter.get_writer``, replaced by ``.best()``
  with slightly different semantics (no force_windows flag).

11.3.1
------

* Issue #327: Formalize and restore support for any printable character in an
  entry point name.

11.3
----

* Expose ``EntryPoint.resolve`` in place of EntryPoint._load, implementing the
  simple, non-requiring load. Deprecated all uses of ``EntryPoint._load``
  except for calling with no parameters, which is just a shortcut for
  ``ep.require(); ep.resolve();``.

  Apps currently invoking ``ep.load(require=False)`` should instead do the
  following if wanting to avoid the deprecating warning::

    getattr(ep, "resolve", lambda: ep.load(require=False))()

11.2
----

* Pip #2326: Report deprecation warning at stacklevel 2 for easier diagnosis.

11.1
----

* Issue #281: Since Setuptools 6.1 (Issue #268), a ValueError would be raised
  in certain cases where VersionConflict was raised with two arguments, which
  occurred in ``pkg_resources.WorkingSet.find``. This release adds support
  for indicating the dependent packages while maintaining support for
  a VersionConflict when no dependent package context is known. New unit tests
  now capture the expected interface.

11.0
----

* Interop #3: Upgrade to Packaging 15.0; updates to PEP 440 so that >1.7 does
  not exclude 1.7.1 but does exclude 1.7.0 and 1.7.0.post1.

10.2.1
------

* Issue #323: Fix regression in entry point name parsing.

10.2
----

* Deprecated use of EntryPoint.load(require=False). Passing a boolean to a
  function to select behavior is an anti-pattern. Instead use
  ``Entrypoint._load()``.
* Substantial refactoring of all unit tests. Tests are now much leaner and
  re-use a lot of fixtures and contexts for better clarity of purpose.

10.1
----

* Issue #320: Added a compatibility implementation of
  ``sdist._default_revctrl``
  so that systems relying on that interface do not fail (namely, Ubuntu 12.04
  and similar Debian releases).

10.0.1
------

* Issue #319: Fixed issue installing pure distutils packages.

10.0
----

* Issue #313: Removed built-in support for subversion. Projects wishing to
  retain support for subversion will need to use a third party library. The
  extant implementation is being ported to `setuptools_svn
  <https://pypi.org/project/setuptools_svn/>`_.
* Issue #315: Updated setuptools to hide its own loaded modules during
  installation of another package. This change will enable setuptools to
  upgrade (or downgrade) itself even when its own metadata and implementation
  change.

9.1
---

* Prefer vendored packaging library `as recommended
  <https://github.com/pypa/setuptools/commit/170657b68f4b92e7e1bf82f5e19a831f5744af67>`_.

9.0.1
-----

* Issue #312: Restored presence of pkg_resources API tests (doctest) to sdist.

9.0
---

* Issue #314: Disabled support for ``setup_requires`` metadata to avoid issue
  where Setuptools was unable to upgrade over earlier versions.

8.4
---

* BB Pull Request #106: Now write ``setup_requires`` metadata.

8.3
---

* Issue #311: Decoupled pkg_resources from setuptools once again.
  ``pkg_resources`` is now a package instead of a module.

8.2.1
-----

* Issue #306: Suppress warnings about Version format except in select scenarios
  (such as installation).

8.2
---

* BB Pull Request #85: Search egg-base when adding egg-info to manifest.

8.1
---

* Upgrade ``packaging`` to 14.5, giving preference to "rc" as designator for
  release candidates over "c".
* PEP-440 warnings are now raised as their own class,
  ``pkg_resources.PEP440Warning``, instead of RuntimeWarning.
* Disabled warnings on empty versions.

8.0.4
-----

* Upgrade ``packaging`` to 14.4, fixing an error where there is a
  different result for if 2.0.5 is contained within >2.0dev and >2.0.dev even
  though normalization rules should have made them equal.
* Issue #296: Add warning when a version is parsed as legacy. This warning will
  make it easier for developers to recognize deprecated version numbers.

8.0.3
-----

* Issue #296: Restored support for ``__hash__`` on parse_version results.

8.0.2
-----

* Issue #296: Restored support for ``__getitem__`` and sort operations on
  parse_version result.

8.0.1
-----

* Issue #296: Restore support for iteration over parse_version result, but
  deprecated that usage with a warning. Fixes failure with buildout.

8.0
---

* Implement PEP 440 within
  pkg_resources and setuptools. This change
  deprecates some version numbers such that they will no longer be installable
  without using the ``===`` escape hatch. See `the changes to test_resources
  <https://bitbucket.org/pypa/setuptools/commits/dcd552da643c4448056de84c73d56da6d70769d5#chg-setuptools/tests/test_resources.py>`_
  for specific examples of version numbers and specifiers that are no longer
  supported. Setuptools now "vendors" the `packaging
  <https://github.com/pypa/packaging>`_ library.

7.0
---

* Issue #80, Issue #209: Eggs that are downloaded for ``setup_requires``,
  ``test_requires``, etc. are now placed in a ``./.eggs`` directory instead of
  directly in the current directory. This choice of location means the files
  can be readily managed (removed, ignored). Additionally,
  later phases or invocations of setuptools will not detect the package as
  already installed and ignore it for permanent install (See #209).

  This change is indicated as backward-incompatible as installations that
  depend on the installation in the current directory will need to account for
  the new location. Systems that ignore ``*.egg`` will probably need to be
  adapted to ignore ``.eggs``. The files will need to be manually moved or
  will be retrieved again. Most use cases will require no attention.

6.1
---

* Issue #268: When resolving package versions, a VersionConflict now reports
  which package previously required the conflicting version.

6.0.2
-----

* Issue #262: Fixed regression in pip install due to egg-info directories
  being omitted. Re-opens Issue #118.

6.0.1
-----

* Issue #259: Fixed regression with namespace package handling on ``single
  version, externally managed`` installs.

6.0
---

* Issue #100: When building a distribution, Setuptools will no longer match
  default files using platform-dependent case sensitivity, but rather will
  only match the files if their case matches exactly. As a result, on Windows
  and other case-insensitive file systems, files with names such as
  'readme.txt' or 'README.TXT' will be omitted from the distribution and a
  warning will be issued indicating that 'README.txt' was not found. Other
  filenames affected are:

    - README.rst
    - README
    - setup.cfg
    - setup.py (or the script name)
    - test/test*.py

  Any users producing distributions with filenames that match those above
  case-insensitively, but not case-sensitively, should rename those files in
  their repository for better portability.
* BB Pull Request #72: When using ``single_version_externally_managed``, the
  exclusion list now includes Python 3.2 ``__pycache__`` entries.
* BB Pull Request #76 and BB Pull Request #78: lines in top_level.txt are now
  ordered deterministically.
* Issue #118: The egg-info directory is now no longer included in the list
  of outputs.
* Issue #258: Setuptools now patches distutils msvc9compiler to
  recognize the specially-packaged compiler package for easy extension module
  support on Python 2.6, 2.7, and 3.2.

5.8
---

* Issue #237: ``pkg_resources`` now uses explicit detection of Python 2 vs.
  Python 3, supporting environments where builtins have been patched to make
  Python 3 look more like Python 2.

5.7
---

* Issue #240: Based on real-world performance measures against 5.4, zip
  manifests are now cached in all circumstances. The
  ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` environment variable is no longer
  relevant. The observed "memory increase" referenced in the 5.4 release
  notes and detailed in Issue #154 was likely not an increase over the status
  quo, but rather only an increase over not storing the zip info at all.

5.6
---

* Issue #242: Use absolute imports in svn_utils to avoid issues if the
  installing package adds an xml module to the path.

5.5.1
-----

* Issue #239: Fix typo in 5.5 such that fix did not take.

5.5
---

* Issue #239: Setuptools now includes the setup_requires directive on
  Distribution objects and validates the syntax just like install_requires
  and tests_require directives.

5.4.2
-----

* Issue #236: Corrected regression in execfile implementation for Python 2.6.

5.4.1
-----

* Python #7776: (ssl_support) Correct usage of host for validation when
  tunneling for HTTPS.

5.4
---

* Issue #154: ``pkg_resources`` will now cache the zip manifests rather than
  re-processing the same file from disk multiple times, but only if the
  environment variable ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` is set. Clients
  that package many modules in the same zip file will see some improvement
  in startup time by enabling this feature. This feature is not enabled by
  default because it causes a substantial increase in memory usage.

5.3
---

* Issue #185: Make svn tagging work on the new style SVN metadata.
  Thanks cazabon!
* Prune revision control directories (e.g .svn) from base path
  as well as sub-directories.

5.2
---

* Added a `Developer Guide
  <https://setuptools.readthedocs.io/en/latest/developer-guide.html>`_ to the official
  documentation.
* Some code refactoring and cleanup was done with no intended behavioral
  changes.
* During install_egg_info, the generated lines for namespace package .pth
  files are now processed even during a dry run.

5.1
---

* Issue #202: Implemented more robust cache invalidation for the ZipImporter,
  building on the work in Issue #168. Special thanks to Jurko Gospodnetic and
  PJE.

5.0.2
-----

* Issue #220: Restored script templates.

5.0.1
-----

* Renamed script templates to end with .tmpl now that they no longer need
  to be processed by 2to3. Fixes spurious syntax errors during build/install.

5.0
---

* Issue #218: Re-release of 3.8.1 to signal that it supersedes 4.x.
* Incidentally, script templates were updated not to include the triple-quote
  escaping.

3.7.1 and 3.8.1 and 4.0.1
-------------------------

* Issue #213: Use legacy StringIO behavior for compatibility under pbr.
* Issue #218: Setuptools 3.8.1 superseded 4.0.1, and 4.x was removed
  from the available versions to install.

4.0
---

* Issue #210: ``setup.py develop`` now copies scripts in binary mode rather
  than text mode, matching the behavior of the ``install`` command.

3.8
---

* Extend Issue #197 workaround to include all Python 3 versions prior to
  3.2.2.

3.7
---

* Issue #193: Improved handling of Unicode filenames when building manifests.

3.6
---

* Issue #203: Honor proxy settings for Powershell downloader in the bootstrap
  routine.

3.5.2
-----

* Issue #168: More robust handling of replaced zip files and stale caches.
  Fixes ZipImportError complaining about a 'bad local header'.

3.5.1
-----

* Issue #199: Restored ``install._install`` for compatibility with earlier
  NumPy versions.

3.5
---

* Issue #195: Follow symbolic links in find_packages (restoring behavior
  broken in 3.4).
* Issue #197: On Python 3.1, PKG-INFO is now saved in a UTF-8 encoding instead
  of ``sys.getpreferredencoding`` to match the behavior on Python 2.6-3.4.
* Issue #192: Preferred bootstrap location is now
  https://bootstrap.pypa.io/ez_setup.py (mirrored from former location).

3.4.4
-----

* Issue #184: Correct failure where find_package over-matched packages
  when directory traversal isn't short-circuited.

3.4.3
-----

* Issue #183: Really fix test command with Python 3.1.

3.4.2
-----

* Issue #183: Fix additional regression in test command on Python 3.1.

3.4.1
-----

* Issue #180: Fix regression in test command not caught by py.test-run tests.

3.4
---

* Issue #176: Add parameter to the test command to support a custom test
  runner: --test-runner or -r.
* Issue #177: Now assume most common invocation to install command on
  platforms/environments without stack support (issuing a warning). Setuptools
  now installs naturally on IronPython. Behavior on CPython should be
  unchanged.

3.3
---

* Add ``include`` parameter to ``setuptools.find_packages()``.

3.2
---

* BB Pull Request #39: Add support for C++ targets from Cython ``.pyx`` files.
* Issue #162: Update dependency on certifi to 1.0.1.
* Issue #164: Update dependency on wincertstore to 0.2.

3.1
---

* Issue #161: Restore Features functionality to allow backward compatibility
  (for Features) until the uses of that functionality is sufficiently removed.

3.0.2
-----

* Correct typo in previous bugfix.

3.0.1
-----

* Issue #157: Restore support for Python 2.6 in bootstrap script where
  ``zipfile.ZipFile`` does not yet have support for context managers.

3.0
---

* Issue #125: Prevent Subversion support from creating a ~/.subversion
  directory just for checking the presence of a Subversion repository.
* Issue #12: Namespace packages are now imported lazily. That is, the mere
  declaration of a namespace package in an egg on ``sys.path`` no longer
  causes it to be imported when ``pkg_resources`` is imported. Note that this
  change means that all of a namespace package's ``__init__.py`` files must
  include a ``declare_namespace()`` call in order to ensure that they will be
  handled properly at runtime. In 2.x it was possible to get away without
  including the declaration, but only at the cost of forcing namespace
  packages to be imported early, which 3.0 no longer does.
* Issue #148: When building (bdist_egg), setuptools no longer adds
  ``__init__.py`` files to namespace packages. Any packages that rely on this
  behavior will need to create ``__init__.py`` files and include the
  ``declare_namespace()``.
* Issue #7: Setuptools itself is now distributed as a zip archive in addition to
  tar archive. ez_setup.py now uses zip archive. This approach avoids the potential
  security vulnerabilities presented by use of tar archives in ez_setup.py.
  It also leverages the security features added to ZipFile.extract in Python 2.7.4.
* Issue #65: Removed deprecated Features functionality.
* BB Pull Request #28: Remove backport of ``_bytecode_filenames`` which is
  available in Python 2.6 and later, but also has better compatibility with
  Python 3 environments.
* Issue #156: Fix spelling of __PYVENV_LAUNCHER__ variable.

2.2
---

* Issue #141: Restored fix for allowing setup_requires dependencies to
  override installed dependencies during setup.
* Issue #128: Fixed issue where only the first dependency link was honored
  in a distribution where multiple dependency links were supplied.

2.1.2
-----

* Issue #144: Read long_description using codecs module to avoid errors
  installing on systems where LANG=C.

2.1.1
-----

* Issue #139: Fix regression in re_finder for CVS repos (and maybe Git repos
  as well).

2.1
---

* Issue #129: Suppress inspection of ``*.whl`` files when searching for files
  in a zip-imported file.
* Issue #131: Fix RuntimeError when constructing an egg fetcher.

2.0.2
-----

* Fix NameError during installation with Python implementations (e.g. Jython)
  not containing parser module.
* Fix NameError in ``sdist:re_finder``.

2.0.1
-----

* Issue #124: Fixed error in list detection in upload_docs.

2.0
---

* Issue #121: Exempt lib2to3 pickled grammars from DirectorySandbox.
* Issue #41: Dropped support for Python 2.4 and Python 2.5. Clients requiring
  setuptools for those versions of Python should use setuptools 1.x.
* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
  expecting this boolean variable should use ``site.ENABLE_USER_SITE``
  instead.
* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
  should use ``pkgutil.ImpImporter`` instead.

1.4.2
-----

* Issue #116: Correct TypeError when reading a local package index on Python
  3.

1.4.1
-----

* Issue #114: Use ``sys.getfilesystemencoding`` for decoding config in
  ``bdist_wininst`` distributions.

* Issue #105 and Issue #113: Establish a more robust technique for
  determining the terminal encoding::

    1. Try ``getpreferredencoding``
    2. If that returns US_ASCII or None, try the encoding from
       ``getdefaultlocale``. If that encoding was a "fallback" because Python
       could not figure it out from the environment or OS, encoding remains
       unresolved.
    3. If the encoding is resolved, then make sure Python actually implements
       the encoding.
    4. On the event of an error or unknown codec, revert to fallbacks
       (UTF-8 on Darwin, ASCII on everything else).
    5. On the encoding is 'mac-roman' on Darwin, use UTF-8 as 'mac-roman' was
       a bug on older Python releases.

    On a side note, it would seem that the encoding only matters for when SVN
    does not yet support ``--xml`` and when getting repository and svn version
    numbers. The ``--xml`` technique should yield UTF-8 according to some
    messages on the SVN mailing lists. So if the version numbers are always
    7-bit ASCII clean, it may be best to only support the file parsing methods
    for legacy SVN releases and support for SVN without the subprocess command
    would simple go away as support for the older SVNs does.

1.4
---

* Issue #27: ``easy_install`` will now use credentials from .pypirc if
  present for connecting to the package index.
* BB Pull Request #21: Omit unwanted newlines in ``package_index._encode_auth``
  when the username/password pair length indicates wrapping.

1.3.2
-----

* Issue #99: Fix filename encoding issues in SVN support.

1.3.1
-----

* Remove exuberant warning in SVN support when SVN is not used.

1.3
---

* Address security vulnerability in SSL match_hostname check as reported in
  Python #17997.
* Prefer `backports.ssl_match_hostname
  <https://pypi.org/project/backports.ssl_match_hostname/>`_ for backport
  implementation if present.
* Correct NameError in ``ssl_support`` module (``socket.error``).

1.2
---

* Issue #26: Add support for SVN 1.7. Special thanks to Philip Thiem for the
  contribution.
* Issue #93: Wheels are now distributed with every release. Note that as
  reported in Issue #108, as of Pip 1.4, scripts aren't installed properly
  from wheels. Therefore, if using Pip to install setuptools from a wheel,
  the ``easy_install`` command will not be available.
* Setuptools "natural" launcher support, introduced in 1.0, is now officially
  supported.

1.1.7
-----

* Fixed behavior of NameError handling in 'script template (dev).py' (script
  launcher for 'develop' installs).
* ``ez_setup.py`` now ensures partial downloads are cleaned up following
  a failed download.
* Distribute #363 and Issue #55: Skip an sdist test that fails on locales
  other than UTF-8.

1.1.6
-----

* Distribute #349: ``sandbox.execfile`` now opens the target file in binary
  mode, thus honoring a BOM in the file when compiled.

1.1.5
-----

* Issue #69: Second attempt at fix (logic was reversed).

1.1.4
-----

* Issue #77: Fix error in upload command (Python 2.4).

1.1.3
-----

* Fix NameError in previous patch.

1.1.2
-----

* Issue #69: Correct issue where 404 errors are returned for URLs with
  fragments in them (such as #egg=).

1.1.1
-----

* Issue #75: Add ``--insecure`` option to ez_setup.py to accommodate
  environments where a trusted SSL connection cannot be validated.
* Issue #76: Fix AttributeError in upload command with Python 2.4.

1.1
---

* Issue #71 (Distribute #333): EasyInstall now puts less emphasis on the
  condition when a host is blocked via ``--allow-hosts``.
* Issue #72: Restored Python 2.4 compatibility in ``ez_setup.py``.

1.0
---

* Issue #60: On Windows, Setuptools supports deferring to another launcher,
  such as Vinay Sajip's `pylauncher <https://bitbucket.org/pypa/pylauncher>`_
  (included with Python 3.3) to launch console and GUI scripts and not install
  its own launcher executables. This experimental functionality is currently
  only enabled if  the ``SETUPTOOLS_LAUNCHER`` environment variable is set to
  "natural". In the future, this behavior may become default, but only after
  it has matured and seen substantial adoption. The ``SETUPTOOLS_LAUNCHER``
  also accepts "executable" to force the default behavior of creating launcher
  executables.
* Issue #63: Bootstrap script (ez_setup.py) now prefers Powershell, curl, or
  wget for retrieving the Setuptools tarball for improved security of the
  install. The script will still fall back to a simple ``urlopen`` on
  platforms that do not have these tools.
* Issue #65: Deprecated the ``Features`` functionality.
* Issue #52: In ``VerifyingHTTPSConn``, handle a tunnelled (proxied)
  connection.

Backward-Incompatible Changes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This release includes a couple of backward-incompatible changes, but most if
not all users will find 1.0 a drop-in replacement for 0.9.

* Issue #50: Normalized API of environment marker support. Specifically,
  removed line number and filename from SyntaxErrors when returned from
  ``pkg_resources.invalid_marker``. Any clients depending on the specific
  string representation of exceptions returned by that function may need to
  be updated to account for this change.
* Issue #50: SyntaxErrors generated by ``pkg_resources.invalid_marker`` are
  normalized for cross-implementation consistency.
* Removed ``--ignore-conflicts-at-my-risk`` and ``--delete-conflicting``
  options to easy_install. These options have been deprecated since 0.6a11.

0.9.8
-----

* Issue #53: Fix NameErrors in ``_vcs_split_rev_from_url``.

0.9.7
-----

* Issue #49: Correct AttributeError on PyPy where a hashlib.HASH object does
  not have a ``.name`` attribute.
* Issue #34: Documentation now refers to bootstrap script in code repository
  referenced by bookmark.
* Add underscore-separated keys to environment markers (markerlib).

0.9.6
-----

* Issue #44: Test failure on Python 2.4 when MD5 hash doesn't have a ``.name``
  attribute.

0.9.5
-----

* Python #17980: Fix security vulnerability in SSL certificate validation.

0.9.4
-----

* Issue #43: Fix issue (introduced in 0.9.1) with version resolution when
  upgrading over other releases of Setuptools.

0.9.3
-----

* Issue #42: Fix new ``AttributeError`` introduced in last fix.

0.9.2
-----

* Issue #42: Fix regression where blank checksums would trigger an
  ``AttributeError``.

0.9.1
-----

* Distribute #386: Allow other positional and keyword arguments to os.open.
* Corrected dependency on certifi mis-referenced in 0.9.

0.9
---

* ``package_index`` now validates hashes other than MD5 in download links.

0.8
---

* Code base now runs on Python 2.4 - Python 3.3 without Python 2to3
  conversion.

0.7.8
-----

* Distribute #375: Yet another fix for yet another regression.

0.7.7
-----

* Distribute #375: Repair AttributeError created in last release (redo).
* Issue #30: Added test for get_cache_path.

0.7.6
-----

* Distribute #375: Repair AttributeError created in last release.

0.7.5
-----

* Issue #21: Restore Python 2.4 compatibility in ``test_easy_install``.
* Distribute #375: Merged additional warning from Distribute 0.6.46.
* Now honor the environment variable
  ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now
  deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``.

0.7.4
-----

* Issue #20: Fix comparison of parsed SVN version on Python 3.

0.7.3
-----

* Issue #1: Disable installation of Windows-specific files on non-Windows systems.
* Use new sysconfig module with Python 2.7 or >=3.2.

0.7.2
-----

* Issue #14: Use markerlib when the ``parser`` module is not available.
* Issue #10: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.

0.7.1
-----

* Fix NameError (Issue #3) again - broken in bad merge.

0.7
---

* Merged Setuptools and Distribute. See docs/merge.txt for details.

Added several features that were slated for setuptools 0.6c12:

* Index URL now defaults to HTTPS.
* Added experimental environment marker support. Now clients may designate a
  PEP-426 environment marker for "extra" dependencies. Setuptools uses this
  feature in ``setup.py`` for optional SSL and certificate validation support
  on older platforms. Based on Distutils-SIG discussions, the syntax is
  somewhat tentative. There should probably be a PEP with a firmer spec before
  the feature should be considered suitable for use.
* Added support for SSL certificate validation when installing packages from
  an HTTPS service.

0.7b4
-----

* Issue #3: Fixed NameError in SSL support.

0.6.49
------

* Move warning check in ``get_cache_path`` to follow the directory creation
  to avoid errors when the cache path does not yet exist. Fixes the error
  reported in Distribute #375.

0.6.48
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46 (redo).

0.6.47
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46.

0.6.46
------

* Distribute #375: Issue a warning if the PYTHON_EGG_CACHE or otherwise
  customized egg cache location specifies a directory that's group- or
  world-writable.

0.6.45
------

* Distribute #379: ``distribute_setup.py`` now traps VersionConflict as well,
  restoring ability to upgrade from an older setuptools version.

0.6.44
------

* ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to
  satisfy use_setuptools.

0.6.43
------

* Distribute #378: Restore support for Python 2.4 Syntax (regression in 0.6.42).

0.6.42
------

* External links finder no longer yields duplicate links.
* Distribute #337: Moved site.py to setuptools/site-patch.py (graft of very old
  patch from setuptools trunk which inspired PR #31).

0.6.41
------

* Distribute #27: Use public api for loading resources from zip files rather than
  the private method ``_zip_directory_cache``.
* Added a new function ``easy_install.get_win_launcher`` which may be used by
  third-party libraries such as buildout to get a suitable script launcher.

0.6.40
------

* Distribute #376: brought back cli.exe and gui.exe that were deleted in the
  previous release.

0.6.39
------

* Add support for console launchers on ARM platforms.
* Fix possible issue in GUI launchers where the subsystem was not supplied to
  the linker.
* Launcher build script now refactored for robustness.
* Distribute #375: Resources extracted from a zip egg to the file system now also
  check the contents of the file against the zip contents during each
  invocation of get_resource_filename.

0.6.38
------

* Distribute #371: The launcher manifest file is now installed properly.

0.6.37
------

* Distribute #143: Launcher scripts, including easy_install itself, are now
  accompanied by a manifest on 32-bit Windows environments to avoid the
  Installer Detection Technology and thus undesirable UAC elevation described
  in `this Microsoft article
  <http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx>`_.

0.6.36
------

* BB Pull Request #35: In Buildout #64, it was reported that
  under Python 3, installation of distutils scripts could attempt to copy
  the ``__pycache__`` directory as a file, causing an error, apparently only
  under Windows. Easy_install now skips all directories when processing
  metadata scripts.

0.6.35
------


Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
how it parses version numbers.

* Distribute #278: Restored compatibility with distribute 0.6.22 and setuptools
  0.6. Updated the documentation to match more closely with the version
  parsing as intended in setuptools 0.6.

0.6.34
------

* Distribute #341: 0.6.33 fails to build under Python 2.4.

0.6.33
------

* Fix 2 errors with Jython 2.5.
* Fix 1 failure with Jython 2.5 and 2.7.
* Disable workaround for Jython scripts on Linux systems.
* Distribute #336: ``setup.py`` no longer masks failure exit code when tests fail.
* Fix issue in pkg_resources where try/except around a platform-dependent
  import would trigger hook load failures on Mercurial. See pull request 32
  for details.
* Distribute #341: Fix a ResourceWarning.

0.6.32
------

* Fix test suite with Python 2.6.
* Fix some DeprecationWarnings and ResourceWarnings.
* Distribute #335: Backed out ``setup_requires`` superceding installed requirements
  until regression can be addressed.

0.6.31
------

* Distribute #303: Make sure the manifest only ever contains UTF-8 in Python 3.
* Distribute #329: Properly close files created by tests for compatibility with
  Jython.
* Work around Jython #1980 and Jython #1981.
* Distribute #334: Provide workaround for packages that reference ``sys.__stdout__``
  such as numpy does. This change should address
  `virtualenv #359 <https://github.com/pypa/virtualenv/issues/359>`_ as long
  as the system encoding is UTF-8 or the IO encoding is specified in the
  environment, i.e.::

     PYTHONIOENCODING=utf8 pip install numpy

* Fix for encoding issue when installing from Windows executable on Python 3.
* Distribute #323: Allow ``setup_requires`` requirements to supercede installed
  requirements. Added some new keyword arguments to existing pkg_resources
  methods. Also had to updated how __path__ is handled for namespace packages
  to ensure that when a new egg distribution containing a namespace package is
  placed on sys.path, the entries in __path__ are found in the same order they
  would have been in had that egg been on the path when pkg_resources was
  first imported.

0.6.30
------

* Distribute #328: Clean up temporary directories in distribute_setup.py.
* Fix fatal bug in distribute_setup.py.

0.6.29
------

* BB Pull Request #14: Honor file permissions in zip files.
* Distribute #327: Merged pull request #24 to fix a dependency problem with pip.
* Merged pull request #23 to fix https://github.com/pypa/virtualenv/issues/301.
* If Sphinx is installed, the ``upload_docs`` command now runs ``build_sphinx``
  to produce uploadable documentation.
* Distribute #326: ``upload_docs`` provided mangled auth credentials under Python 3.
* Distribute #320: Fix check for "createable" in distribute_setup.py.
* Distribute #305: Remove a warning that was triggered during normal operations.
* Distribute #311: Print metadata in UTF-8 independent of platform.
* Distribute #303: Read manifest file with UTF-8 encoding under Python 3.
* Distribute #301: Allow to run tests of namespace packages when using 2to3.
* Distribute #304: Prevent import loop in site.py under Python 3.3.
* Distribute #283: Reenable scanning of ``*.pyc`` / ``*.pyo`` files on Python 3.3.
* Distribute #299: The develop command didn't work on Python 3, when using 2to3,
  as the egg link would go to the Python 2 source. Linking to the 2to3'd code
  in build/lib makes it work, although you will have to rebuild the module
  before testing it.
* Distribute #306: Even if 2to3 is used, we build in-place under Python 2.
* Distribute #307: Prints the full path when .svn/entries is broken.
* Distribute #313: Support for sdist subcommands (Python 2.7)
* Distribute #314: test_local_index() would fail an OS X.
* Distribute #310: Non-ascii characters in a namespace __init__.py causes errors.
* Distribute #218: Improved documentation on behavior of ``package_data`` and
  ``include_package_data``. Files indicated by ``package_data`` are now included
  in the manifest.
* ``distribute_setup.py`` now allows a ``--download-base`` argument for retrieving
  distribute from a specified location.

0.6.28
------

* Distribute #294: setup.py can now be invoked from any directory.
* Scripts are now installed honoring the umask.
* Added support for .dist-info directories.
* Distribute #283: Fix and disable scanning of ``*.pyc`` / ``*.pyo`` files on
  Python 3.3.

0.6.27
------

* Support current snapshots of CPython 3.3.
* Distribute now recognizes README.rst as a standard, default readme file.
* Exclude 'encodings' modules when removing modules from sys.modules.
  Workaround for #285.
* Distribute #231: Don't fiddle with system python when used with buildout
  (bootstrap.py)

0.6.26
------

* Distribute #183: Symlinked files are now extracted from source distributions.
* Distribute #227: Easy_install fetch parameters are now passed during the
  installation of a source distribution; now fulfillment of setup_requires
  dependencies will honor the parameters passed to easy_install.

0.6.25
------

* Distribute #258: Workaround a cache issue
* Distribute #260: distribute_setup.py now accepts the --user parameter for
  Python 2.6 and later.
* Distribute #262: package_index.open_with_auth no longer throws LookupError
  on Python 3.
* Distribute #269: AttributeError when an exception occurs reading Manifest.in
  on late releases of Python.
* Distribute #272: Prevent TypeError when namespace package names are unicode
  and single-install-externally-managed is used. Also fixes PIP issue
  449.
* Distribute #273: Legacy script launchers now install with Python2/3 support.

0.6.24
------

* Distribute #249: Added options to exclude 2to3 fixers

0.6.23
------

* Distribute #244: Fixed a test
* Distribute #243: Fixed a test
* Distribute #239: Fixed a test
* Distribute #240: Fixed a test
* Distribute #241: Fixed a test
* Distribute #237: Fixed a test
* Distribute #238: easy_install now uses 64bit executable wrappers on 64bit Python
* Distribute #208: Fixed parsed_versions, it now honors post-releases as noted in the documentation
* Distribute #207: Windows cli and gui wrappers pass CTRL-C to child python process
* Distribute #227: easy_install now passes its arguments to setup.py bdist_egg
* Distribute #225: Fixed a NameError on Python 2.5, 2.4

0.6.21
------

* Distribute #225: FIxed a regression on py2.4

0.6.20
------

* Distribute #135: Include url in warning when processing URLs in package_index.
* Distribute #212: Fix issue where easy_instal fails on Python 3 on windows installer.
* Distribute #213: Fix typo in documentation.

0.6.19
------

* Distribute #206: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'

0.6.18
------

* Distribute #210: Fixed a regression introduced by Distribute #204 fix.

0.6.17
------

* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
  variable to allow to disable installation of easy_install-${version} script.
* Support Python >=3.1.4 and >=3.2.1.
* Distribute #204: Don't try to import the parent of a namespace package in
  declare_namespace
* Distribute #196: Tolerate responses with multiple Content-Length headers
* Distribute #205: Sandboxing doesn't preserve working_set. Leads to setup_requires
  problems.

0.6.16
------

* Builds sdist gztar even on Windows (avoiding Distribute #193).
* Distribute #192: Fixed metadata omitted on Windows when package_dir
  specified with forward-slash.
* Distribute #195: Cython build support.
* Distribute #200: Issues with recognizing 64-bit packages on Windows.

0.6.15
------

* Fixed typo in bdist_egg
* Several issues under Python 3 has been solved.
* Distribute #146: Fixed missing DLL files after easy_install of windows exe package.

0.6.14
------

* Distribute #170: Fixed unittest failure. Thanks to Toshio.
* Distribute #171: Fixed race condition in unittests cause deadlocks in test suite.
* Distribute #143: Fixed a lookup issue with easy_install.
  Thanks to David and Zooko.
* Distribute #174: Fixed the edit mode when its used with setuptools itself

0.6.13
------

* Distribute #160: 2.7 gives ValueError("Invalid IPv6 URL")
* Distribute #150: Fixed using ~/.local even in a --no-site-packages virtualenv
* Distribute #163: scan index links before external links, and don't use the md5 when
  comparing two distributions

0.6.12
------

* Distribute #149: Fixed various failures on 2.3/2.4

0.6.11
------

* Found another case of SandboxViolation - fixed
* Distribute #15 and Distribute #48: Introduced a socket timeout of 15 seconds on url openings
* Added indexsidebar.html into MANIFEST.in
* Distribute #108: Fixed TypeError with Python3.1
* Distribute #121: Fixed --help install command trying to actually install.
* Distribute #112: Added an os.makedirs so that Tarek's solution will work.
* Distribute #133: Added --no-find-links to easy_install
* Added easy_install --user
* Distribute #100: Fixed develop --user not taking '.' in PYTHONPATH into account
* Distribute #134: removed spurious UserWarnings. Patch by VanLindberg
* Distribute #138: cant_write_to_target error when setup_requires is used.
* Distribute #147: respect the sys.dont_write_bytecode flag

0.6.10
------

* Reverted change made for the DistributionNotFound exception because
  zc.buildout uses the exception message to get the name of the
  distribution.

0.6.9
-----

* Distribute #90: unknown setuptools version can be added in the working set
* Distribute #87: setupt.py doesn't try to convert distribute_setup.py anymore
  Initial Patch by arfrever.
* Distribute #89: added a side bar with a download link to the doc.
* Distribute #86: fixed missing sentence in pkg_resources doc.
* Added a nicer error message when a DistributionNotFound is raised.
* Distribute #80: test_develop now works with Python 3.1
* Distribute #93: upload_docs now works if there is an empty sub-directory.
* Distribute #70: exec bit on non-exec files
* Distribute #99: now the standalone easy_install command doesn't uses a
  "setup.cfg" if any exists in the working directory. It will use it
  only if triggered by ``install_requires`` from a setup.py call
  (install, develop, etc).
* Distribute #101: Allowing ``os.devnull`` in Sandbox
* Distribute #92: Fixed the "no eggs" found error with MacPort
  (platform.mac_ver() fails)
* Distribute #103: test_get_script_header_jython_workaround not run
  anymore under py3 with C or POSIX local. Contributed by Arfrever.
* Distribute #104: removed the assertion when the installation fails,
  with a nicer message for the end user.
* Distribute #100: making sure there's no SandboxViolation when
  the setup script patches setuptools.

0.6.8
-----

* Added "check_packages" in dist. (added in Setuptools 0.6c11)
* Fixed the DONT_PATCH_SETUPTOOLS state.

0.6.7
-----

* Distribute #58: Added --user support to the develop command
* Distribute #11: Generated scripts now wrap their call to the script entry point
  in the standard "if name == 'main'"
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
  can drive an installation that doesn't patch a global setuptools.
* Reviewed unladen-swallow specific change from
  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
  and determined that it no longer applies. Distribute should work fine with
  Unladen Swallow 2009Q3.
* Distribute #21: Allow PackageIndex.open_url to gracefully handle all cases of a
  httplib.HTTPException instead of just InvalidURL and BadStatusLine.
* Removed virtual-python.py from this distribution and updated documentation
  to point to the actively maintained virtualenv instead.
* Distribute #64: use_setuptools no longer rebuilds the distribute egg every
  time it is run
* use_setuptools now properly respects the requested version
* use_setuptools will no longer try to import a distribute egg for the
  wrong Python version
* Distribute #74: no_fake should be True by default.
* Distribute #72: avoid a bootstrapping issue with easy_install -U

0.6.6
-----

* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
  (patch by Holger Krekel)

0.6.5
-----

* Distribute #65: cli.exe and gui.exe are now generated at build time,
  depending on the platform in use.

* Distribute #67: Fixed doc typo (PEP 381/PEP 382).

* Distribute no longer shadows setuptools if we require a 0.7-series
  setuptools. And an error is raised when installing a 0.7 setuptools with
  distribute.

* When run from within buildout, no attempt is made to modify an existing
  setuptools egg, whether in a shared egg directory or a system setuptools.

* Fixed a hole in sandboxing allowing builtin file to write outside of
  the sandbox.

0.6.4
-----

* Added the generation of ``distribute_setup_3k.py`` during the release.
  This closes Distribute #52.

* Added an upload_docs command to easily upload project documentation to
  PyPI's https://pythonhosted.org. This close issue Distribute #56.

* Fixed a bootstrap bug on the use_setuptools() API.

0.6.3
-----

setuptools
^^^^^^^^^^

* Fixed a bunch of calls to file() that caused crashes on Python 3.

bootstrapping
^^^^^^^^^^^^^

* Fixed a bug in sorting that caused bootstrap to fail on Python 3.

0.6.2
-----

setuptools
^^^^^^^^^^

* Added Python 3 support; see docs/python3.txt.
  This closes Old Setuptools #39.

* Added option to run 2to3 automatically when installing on Python 3.
  This closes issue Distribute #31.

* Fixed invalid usage of requirement.parse, that broke develop -d.
  This closes Old Setuptools #44.

* Fixed script launcher for 64-bit Windows.
  This closes Old Setuptools #2.

* KeyError when compiling extensions.
  This closes Old Setuptools #41.

bootstrapping
^^^^^^^^^^^^^

* Fixed bootstrap not working on Windows. This closes issue Distribute #49.

* Fixed 2.6 dependencies. This closes issue Distribute #50.

* Make sure setuptools is patched when running through easy_install
  This closes Old Setuptools #40.

0.6.1
-----

setuptools
^^^^^^^^^^

* package_index.urlopen now catches BadStatusLine and malformed url errors.
  This closes Distribute #16 and Distribute #18.

* zip_ok is now False by default. This closes Old Setuptools #33.

* Fixed invalid URL error catching. Old Setuptools #20.

* Fixed invalid bootstraping with easy_install installation (Distribute #40).
  Thanks to Florian Schulze for the help.

* Removed buildout/bootstrap.py. A new repository will create a specific
  bootstrap.py script.


bootstrapping
^^^^^^^^^^^^^

* The bootstrap process leave setuptools alone if detected in the system
  and --root or --prefix is provided, but is not in the same location.
  This closes Distribute #10.

0.6
---

setuptools
^^^^^^^^^^

* Packages required at build time where not fully present at install time.
  This closes Distribute #12.

* Protected against failures in tarfile extraction. This closes Distribute #10.

* Made Jython api_tests.txt doctest compatible. This closes Distribute #7.

* sandbox.py replaced builtin type file with builtin function open. This
  closes Distribute #6.

* Immediately close all file handles. This closes Distribute #3.

* Added compatibility with Subversion 1.6. This references Distribute #1.

pkg_resources
^^^^^^^^^^^^^

* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
  instead. Based on a patch from ronaldoussoren. This closes issue #5.

* Fixed a SandboxViolation for mkdir that could occur in certain cases.
  This closes Distribute #13.

* Allow to find_on_path on systems with tight permissions to fail gracefully.
  This closes Distribute #9.

* Corrected inconsistency between documentation and code of add_entry.
  This closes Distribute #8.

* Immediately close all file handles. This closes Distribute #3.

easy_install
^^^^^^^^^^^^

* Immediately close all file handles. This closes Distribute #3.

0.6c9
-----

 * Fixed a missing files problem when using Windows source distributions on
   non-Windows platforms, due to distutils not handling manifest file line
   endings correctly.

 * Updated Pyrex support to work with Pyrex 0.9.6 and higher.

 * Minor changes for Jython compatibility, including skipping tests that can't
   work on Jython.

 * Fixed not installing eggs in ``install_requires`` if they were also used for
   ``setup_requires`` or ``tests_require``.

 * Fixed not fetching eggs in ``install_requires`` when running tests.

 * Allow ``ez_setup.use_setuptools()`` to upgrade existing setuptools
   installations when called from a standalone ``setup.py``.

 * Added a warning if a namespace package is declared, but its parent package
   is not also declared as a namespace.

 * Support Subversion 1.5

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Fixed ``bdist_wininst upload`` trying to upload the ``.exe`` twice

 * Fixed ``bdist_egg`` putting a ``native_libs.txt`` in the source package's
   ``.egg-info``, when it should only be in the built egg's ``EGG-INFO``.

 * Ensure that _full_name is set on all shared libs before extensions are
   checked for shared lib usage.  (Fixes a bug in the experimental shared
   library build support.)

 * Fix to allow unpacked eggs containing native libraries to fail more
   gracefully under Google App Engine (with an ``ImportError`` loading the
   C-based module, instead of getting a ``NameError``).

 * Fixed ``win32.exe`` support for .pth files, so unnecessary directory nesting
   is flattened out in the resulting egg.  (There was a case-sensitivity
   problem that affected some distributions, notably ``pywin32``.)

 * Prevent ``--help-commands`` and other junk from showing under Python 2.5
   when running ``easy_install --help``.

 * Fixed GUI scripts sometimes not executing on Windows

 * Fixed not picking up dependency links from recursive dependencies.

 * Only make ``.py``, ``.dll`` and ``.so`` files executable when unpacking eggs

 * Changes for Jython compatibility

 * Improved error message when a requirement is also a directory name, but the
   specified directory is not a source package.

 * Fixed ``--allow-hosts`` option blocking ``file:`` URLs

 * Fixed HTTP SVN detection failing when the page title included a project
   name (e.g. on SourceForge-hosted SVN)

 * Fix Jython script installation to handle ``#!`` lines better when
   ``sys.executable`` is a script.

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Keep site directories (e.g. ``site-packages``) from being included in
   ``.pth`` files.

0.6c7
-----

 * Fixed ``distutils.filelist.findall()`` crashing on broken symlinks, and
   ``egg_info`` command failing on new, uncommitted SVN directories.

 * Fix import problems with nested namespace packages installed via
   ``--root`` or ``--single-version-externally-managed``, due to the
   parent package not having the child package as an attribute.

 * ``ftp:`` download URLs now work correctly.

 * The default ``--index-url`` is now ``https://pypi.python.org/simple``, to use
   the Python Package Index's new simpler (and faster!) REST API.

0.6c6
-----

 * Added ``--egg-path`` option to ``develop`` command, allowing you to force
   ``.egg-link`` files to use relative paths (allowing them to be shared across
   platforms on a networked drive).

 * Fix not building binary RPMs correctly.

 * Fix "eggsecutables" (such as setuptools' own egg) only being runnable with
   bash-compatible shells.

 * Fix ``#!`` parsing problems in Windows ``.exe`` script wrappers, when there
   was whitespace inside a quoted argument or at the end of the ``#!`` line
   (a regression introduced in 0.6c4).

 * Fix ``test`` command possibly failing if an older version of the project
   being tested was installed on ``sys.path`` ahead of the test source
   directory.

 * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in
   their names as packages.

 * EasyInstall no longer aborts the installation process if a URL it wants to
   retrieve can't be downloaded, unless the URL is an actual package download.
   Instead, it issues a warning and tries to keep going.

 * Fixed distutils-style scripts originally built on Windows having their line
   endings doubled when installed on any platform.

 * Added ``--local-snapshots-ok`` flag, to allow building eggs from projects
   installed using ``setup.py develop``.

 * Fixed not HTML-decoding URLs scraped from web pages

0.6c5
-----

 * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg``
   packages under Python versions less than 2.5.

 * Fix uploaded ``bdist_wininst`` packages being described as suitable for
   "any" version by Python 2.5, even if a ``--target-version`` was specified.

 * Fixed ``.dll`` files on Cygwin not having executable permissions when an egg
   is installed unzipped.

0.6c4
-----

 * Overhauled Windows script wrapping to support ``bdist_wininst`` better.
   Scripts installed with ``bdist_wininst`` will always use ``#!python.exe`` or
   ``#!pythonw.exe`` as the executable name (even when built on non-Windows
   platforms!), and the wrappers will look for the executable in the script's
   parent directory (which should find the right version of Python).

 * Fix ``upload`` command not uploading files built by ``bdist_rpm`` or
   ``bdist_wininst`` under Python 2.3 and 2.4.

 * Add support for "eggsecutable" headers: a ``#!/bin/sh`` script that is
   prepended to an ``.egg`` file to allow it to be run as a script on Unix-ish
   platforms.  (This is mainly so that setuptools itself can have a single-file
   installer on Unix, without doing multiple downloads, dealing with firewalls,
   etc.)

 * Fix problem with empty revision numbers in Subversion 1.4 ``entries`` files

 * Use cross-platform relative paths in ``easy-install.pth`` when doing
   ``develop`` and the source directory is a subdirectory of the installation
   target directory.

 * Fix a problem installing eggs with a system packaging tool if the project
   contained an implicit namespace package; for example if the ``setup()``
   listed a namespace package ``foo.bar`` without explicitly listing ``foo``
   as a namespace package.

 * Added support for HTTP "Basic" authentication using ``http://user:pass@host``
   URLs.  If a password-protected page contains links to the same host (and
   protocol), those links will inherit the credentials used to access the
   original page.

 * Removed all special support for Sourceforge mirrors, as Sourceforge's
   mirror system now works well for non-browser downloads.

 * Fixed not recognizing ``win32.exe`` installers that included a custom
   bitmap.

 * Fixed not allowing ``os.open()`` of paths outside the sandbox, even if they
   are opened read-only (e.g. reading ``/dev/urandom`` for random numbers, as
   is done by ``os.urandom()`` on some platforms).

 * Fixed a problem with ``.pth`` testing on Windows when ``sys.executable``
   has a space in it (e.g., the user installed Python to a ``Program Files``
   directory).

0.6c3
-----

 * Fixed breakages caused by Subversion 1.4's new "working copy" format

 * You can once again use "python -m easy_install" with Python 2.4 and above.

 * Python 2.5 compatibility fixes added.

0.6c2
-----

 * The ``ez_setup`` module displays the conflicting version of setuptools (and
   its installation location) when a script requests a version that's not
   available.

 * Running ``setup.py develop`` on a setuptools-using project will now install
   setuptools if needed, instead of only downloading the egg.

 * Windows script wrappers now support quoted arguments and arguments
   containing spaces.  (Patch contributed by Jim Fulton.)

 * The ``ez_setup.py`` script now actually works when you put a setuptools
   ``.egg`` alongside it for bootstrapping an offline machine.

 * A writable installation directory on ``sys.path`` is no longer required to
   download and extract a source distribution using ``--editable``.

 * Generated scripts now use ``-x`` on the ``#!`` line when ``sys.executable``
   contains non-ASCII characters, to prevent deprecation warnings about an
   unspecified encoding when the script is run.

0.6c1
-----

 * Fixed ``AttributeError`` when trying to download a ``setup_requires``
   dependency when a distribution lacks a ``dependency_links`` setting.

 * Made ``zip-safe`` and ``not-zip-safe`` flag files contain a single byte, so
   as to play better with packaging tools that complain about zero-length
   files.

 * Made ``setup.py develop`` respect the ``--no-deps`` option, which it
   previously was ignoring.

 * Support ``extra_path`` option to ``setup()`` when ``install`` is run in
   backward-compatibility mode.

 * Source distributions now always include a ``setup.cfg`` file that explicitly
   sets ``egg_info`` options such that they produce an identical version number
   to the source distribution's version number.  (Previously, the default
   version number could be different due to the use of ``--tag-date``, or if
   the version was overridden on the command line that built the source
   distribution.)

 * EasyInstall now includes setuptools version information in the
   ``User-Agent`` string sent to websites it visits.

0.6b4
-----

 * Fix ``register`` not obeying name/version set by ``egg_info`` command, if
   ``egg_info`` wasn't explicitly run first on the same command line.

 * Added ``--no-date`` and ``--no-svn-revision`` options to ``egg_info``
   command, to allow suppressing tags configured in ``setup.cfg``.

 * Fixed redundant warnings about missing ``README`` file(s); it should now
   appear only if you are actually a source distribution.

 * Fix creating Python wrappers for non-Python scripts

 * Fix ``ftp://`` directory listing URLs from causing a crash when used in the
   "Home page" or "Download URL" slots on PyPI.

 * Fix ``sys.path_importer_cache`` not being updated when an existing zipfile
   or directory is deleted/overwritten.

 * Fix not recognizing HTML 404 pages from package indexes.

 * Allow ``file://`` URLs to be used as a package index.  URLs that refer to
   directories will use an internally-generated directory listing if there is
   no ``index.html`` file in the directory.

 * Allow external links in a package index to be specified using
   ``rel="homepage"`` or ``rel="download"``, without needing the old
   PyPI-specific visible markup.

 * Suppressed warning message about possibly-misspelled project name, if an egg
   or link for that project name has already been seen.

0.6b3
-----

 * Fix ``bdist_egg`` not including files in subdirectories of ``.egg-info``.

 * Allow ``.py`` files found by the ``include_package_data`` option to be
   automatically included. Remove duplicate data file matches if both
   ``include_package_data`` and ``package_data`` are used to refer to the same
   files.

 * Fix local ``--find-links`` eggs not being copied except with
   ``--always-copy``.

 * Fix sometimes not detecting local packages installed outside of "site"
   directories.

 * Fix mysterious errors during initial ``setuptools`` install, caused by
   ``ez_setup`` trying to run ``easy_install`` twice, due to a code fallthru
   after deleting the egg from which it's running.

0.6b2
-----

 * Don't install or update a ``site.py`` patch when installing to a
   ``PYTHONPATH`` directory with ``--multi-version``, unless an
   ``easy-install.pth`` file is already in use there.

 * Construct ``.pth`` file paths in such a way that installing an egg whose
   name begins with ``import`` doesn't cause a syntax error.

 * Fixed a bogus warning message that wasn't updated since the 0.5 versions.

0.6b1
-----

 * Strip ``module`` from the end of compiled extension modules when computing
   the name of a ``.py`` loader/wrapper.  (Python's import machinery ignores
   this suffix when searching for an extension module.)

 * Better ambiguity management: accept ``#egg`` name/version even if processing
   what appears to be a correctly-named distutils file, and ignore ``.egg``
   files with no ``-``, since valid Python ``.egg`` files always have a version
   number (but Scheme eggs often don't).

 * Support ``file://`` links to directories in ``--find-links``, so that
   easy_install can build packages from local source checkouts.

 * Added automatic retry for Sourceforge mirrors.  The new download process is
   to first just try dl.sourceforge.net, then randomly select mirror IPs and
   remove ones that fail, until something works.  The removed IPs stay removed
   for the remainder of the run.

 * Ignore bdist_dumb distributions when looking at download URLs.

0.6a11
------

 * Added ``test_loader`` keyword to support custom test loaders

 * Added ``setuptools.file_finders`` entry point group to allow implementing
   revision control plugins.

 * Added ``--identity`` option to ``upload`` command.

 * Added ``dependency_links`` to allow specifying URLs for ``--find-links``.

 * Enhanced test loader to scan packages as well as modules, and call
   ``additional_tests()`` if present to get non-unittest tests.

 * Support namespace packages in conjunction with system packagers, by omitting
   the installation of any ``__init__.py`` files for namespace packages, and
   adding a special ``.pth`` file to create a working package in
   ``sys.modules``.

 * Made ``--single-version-externally-managed`` automatic when ``--root`` is
   used, so that most system packagers won't require special support for
   setuptools.

 * Fixed ``setup_requires``, ``tests_require``, etc. not using ``setup.cfg`` or
   other configuration files for their option defaults when installing, and
   also made the install use ``--multi-version`` mode so that the project
   directory doesn't need to support .pth files.

 * ``MANIFEST.in`` is now forcibly closed when any errors occur while reading
   it. Previously, the file could be left open and the actual error would be
   masked by problems trying to remove the open file on Windows systems.

 * Process ``dependency_links.txt`` if found in a distribution, by adding the
   URLs to the list for scanning.

 * Use relative paths in ``.pth`` files when eggs are being installed to the
   same directory as the ``.pth`` file.  This maximizes portability of the
   target directory when building applications that contain eggs.

 * Added ``easy_install-N.N`` script(s) for convenience when using multiple
   Python versions.

 * Added automatic handling of installation conflicts.  Eggs are now shifted to
   the front of sys.path, in an order consistent with where they came from,
   making EasyInstall seamlessly co-operate with system package managers.

   The ``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk`` options
   are now no longer necessary, and will generate warnings at the end of a
   run if you use them.

 * Don't recursively traverse subdirectories given to ``--find-links``.

0.6a10
------

 * Fixed the ``develop`` command ignoring ``--find-links``.

 * Added exhaustive testing of the install directory, including a spawn test
   for ``.pth`` file support, and directory writability/existence checks.  This
   should virtually eliminate the need to set or configure ``--site-dirs``.

 * Added ``--prefix`` option for more do-what-I-mean-ishness in the absence of
   RTFM-ing.  :)

 * Enhanced ``PYTHONPATH`` support so that you don't have to put any eggs on it
   manually to make it work.  ``--multi-version`` is no longer a silent
   default; you must explicitly use it if installing to a non-PYTHONPATH,
   non-"site" directory.

 * Expand ``$variables`` used in the ``--site-dirs``, ``--build-directory``,
   ``--install-dir``, and ``--script-dir`` options, whether on the command line
   or in configuration files.

 * Improved SourceForge mirror processing to work faster and be less affected
   by transient HTML changes made by SourceForge.

 * PyPI searches now use the exact spelling of requirements specified on the
   command line or in a project's ``install_requires``.  Previously, a
   normalized form of the name was used, which could lead to unnecessary
   full-index searches when a project's name had an underscore (``_``) in it.

 * EasyInstall can now download bare ``.py`` files and wrap them in an egg,
   as long as you include an ``#egg=name-version`` suffix on the URL, or if
   the ``.py`` file is listed as the "Download URL" on the project's PyPI page.
   This allows third parties to "package" trivial Python modules just by
   linking to them (e.g. from within their own PyPI page or download links
   page).

 * The ``--always-copy`` option now skips "system" and "development" eggs since
   they can't be reliably copied.  Note that this may cause EasyInstall to
   choose an older version of a package than what you expected, or it may cause
   downloading and installation of a fresh version of what's already installed.

 * The ``--find-links`` option previously scanned all supplied URLs and
   directories as early as possible, but now only directories and direct
   archive links are scanned immediately.  URLs are not retrieved unless a
   package search was already going to go online due to a package not being
   available locally, or due to the use of the ``--update`` or ``-U`` option.

 * Fixed the annoying ``--help-commands`` wart.

0.6a9
-----

 * The ``sdist`` command no longer uses the traditional ``MANIFEST`` file to
   create source distributions.  ``MANIFEST.in`` is still read and processed,
   as are the standard defaults and pruning. But the manifest is built inside
   the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
   every time the ``egg_info`` command is run.

 * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
   automatically include any package data listed in revision control or
   ``MANIFEST.in``

 * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to
   trim back files included via the ``package_data`` and
   ``include_package_data`` options.

 * Fixed ``--tag-svn-revision`` not working when run from a source
   distribution.

 * Added warning for namespace packages with missing ``declare_namespace()``

 * Added ``tests_require`` keyword to ``setup()``, so that e.g. packages
   requiring ``nose`` to run unit tests can make this dependency optional
   unless the ``test`` command is run.

 * Made all commands that use ``easy_install`` respect its configuration
   options, as this was causing some problems with ``setup.py install``.

 * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so
   that you can process a directory tree through a processing filter as if it
   were a zipfile or tarfile.

 * Added an internal ``install_egg_info`` command to use as part of old-style
   ``install`` operations, that installs an ``.egg-info`` directory with the
   package.

 * Added a ``--single-version-externally-managed`` option to the ``install``
   command so that you can more easily wrap a "flat" egg in a system package.

 * Enhanced ``bdist_rpm`` so that it installs single-version eggs that
   don't rely on a ``.pth`` file. The ``--no-egg`` option has been removed,
   since all RPMs are now built in a more backwards-compatible format.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format. Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.

 * Fixed ``.pth`` file processing picking up nested eggs (i.e. ones inside
   "baskets") when they weren't explicitly listed in the ``.pth`` file.

 * If more than one URL appears to describe the exact same distribution, prefer
   the shortest one.  This helps to avoid "table of contents" CGI URLs like the
   ones on effbot.org.

 * Quote arguments to python.exe (including python's path) to avoid problems
   when Python (or a script) is installed in a directory whose name contains
   spaces on Windows.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.

0.6a8
-----

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

 * Made ``develop`` command accept all the same options as ``easy_install``,
   and use the ``easy_install`` command's configuration settings as defaults.

 * Made ``egg_info --tag-svn-revision`` fall back to extracting the revision
   number from ``PKG-INFO`` in case it is being run on a source distribution of
   a snapshot taken from a Subversion-based project.

 * Automatically detect ``.dll``, ``.so`` and ``.dylib`` files that are being
   installed as data, adding them to ``native_libs.txt`` automatically.

 * Fixed some problems with fresh checkouts of projects that don't include
   ``.egg-info/PKG-INFO`` under revision control and put the project's source
   code directly in the project directory. If such a package had any
   requirements that get processed before the ``egg_info`` command can be run,
   the setup scripts would fail with a "Missing 'Version:' header and/or
   PKG-INFO file" error, because the egg runtime interpreted the unbuilt
   metadata in a directory on ``sys.path`` (i.e. the current directory) as
   being a corrupted egg. Setuptools now monkeypatches the distribution
   metadata cache to pretend that the egg has valid version information, until
   it has a chance to make it actually be so (via the ``egg_info`` command).

 * Update for changed SourceForge mirror format

 * Fixed not installing dependencies for some packages fetched via Subversion

 * Fixed dependency installation with ``--always-copy`` not using the same
   dependency resolution procedure as other operations.

 * Fixed not fully removing temporary directories on Windows, if a Subversion
   checkout left read-only files behind

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

0.6a7
-----

 * Fixed not being able to install Windows script wrappers using Python 2.3

0.6a6
-----

 * Added support for "traditional" PYTHONPATH-based non-root installation, and
   also the convenient ``virtual-python.py`` script, based on a contribution
   by Ian Bicking.  The setuptools egg now contains a hacked ``site`` module
   that makes the PYTHONPATH-based approach work with .pth files, so that you
   can get the full EasyInstall feature set on such installations.

 * Added ``--no-deps`` and ``--allow-hosts`` options.

 * Improved Windows ``.exe`` script wrappers so that the script can have the
   same name as a module without confusing Python.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.
   Also, ensure that currently installed/selected packages aren't given
   precedence over ones desired by a package being installed, which could
   cause conflict errors.

0.6a5
-----

 * Fixed missing gui/cli .exe files in distribution. Fixed bugs in tests.

0.6a3
-----

 * Added ``gui_scripts`` entry point group to allow installing GUI scripts
   on Windows and other platforms.  (The special handling is only for Windows;
   other platforms are treated the same as for ``console_scripts``.)

 * Improved error message when trying to use old ways of running
   ``easy_install``.  Removed the ability to run via ``python -m`` or by
   running ``easy_install.py``; ``easy_install`` is the command to run on all
   supported platforms.

 * Improved wrapper script generation and runtime initialization so that a
   VersionConflict doesn't occur if you later install a competing version of a
   needed package as the default version of that package.

 * Fixed a problem parsing version numbers in ``#egg=`` links.

0.6a2
-----

 * Added ``console_scripts`` entry point group to allow installing scripts
   without the need to create separate script files. On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name. On other
   platforms, the scripts are written without a file extension.

 * EasyInstall can now install "console_scripts" defined by packages that use
   ``setuptools`` and define appropriate entry points.  On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name.  On other
   platforms, the scripts are installed without a file extension.

 * Using ``python -m easy_install`` or running ``easy_install.py`` is now
   DEPRECATED, since an ``easy_install`` wrapper is now available on all
   platforms.

0.6a1
-----

 * Added support for building "old-style" RPMs that don't install an egg for
   the target package, using a ``--no-egg`` option.

 * The ``build_ext`` command now works better when using the ``--inplace``
   option and multiple Python versions. It now makes sure that all extensions
   match the current Python version, even if newer copies were built for a
   different Python version.

 * The ``upload`` command no longer attaches an extra ``.zip`` when uploading
   eggs, as PyPI now supports egg uploads without trickery.

 * The ``ez_setup`` script/module now displays a warning before downloading
   the setuptools egg, and attempts to check the downloaded egg against an
   internal MD5 checksum table.

 * Fixed the ``--tag-svn-revision`` option of ``egg_info`` not finding the
   latest revision number; it was using the revision number of the directory
   containing ``setup.py``, not the highest revision number in the project.

 * Added ``eager_resources`` setup argument

 * The ``sdist`` command now recognizes Subversion "deleted file" entries and
   does not include them in source distributions.

 * ``setuptools`` now embeds itself more thoroughly into the distutils, so that
   other distutils extensions (e.g. py2exe, py2app) will subclass setuptools'
   versions of things, rather than the native distutils ones.

 * Added ``entry_points`` and ``setup_requires`` arguments to ``setup()``;
   ``setup_requires`` allows you to automatically find and download packages
   that are needed in order to *build* your project (as opposed to running it).

 * ``setuptools`` now finds its commands, ``setup()`` argument validators, and
   metadata writers using entry points, so that they can be extended by
   third-party packages. See `Creating distutils Extensions
   <https://setuptools.readthedocs.io/en/latest/setuptools.html#creating-distutils-extensions>`_
   for more details.

 * The vestigial ``depends`` command has been removed. It was never finished
   or documented, and never would have worked without EasyInstall - which it
   pre-dated and was never compatible with.

 * EasyInstall now does MD5 validation of downloads from PyPI, or from any link
   that has an "#md5=..." trailer with a 32-digit lowercase hex md5 digest.

 * EasyInstall now handles symlinks in target directories by removing the link,
   rather than attempting to overwrite the link's destination.  This makes it
   easier to set up an alternate Python "home" directory (as described in
   the Non-Root Installation section of the docs).

 * Added support for handling MacOS platform information in ``.egg`` filenames,
   based on a contribution by Kevin Dangoor.  You may wish to delete and
   reinstall any eggs whose filename includes "darwin" and "Power_Macintosh",
   because the format for this platform information has changed so that minor
   OS X upgrades (such as 10.4.1 to 10.4.2) do not cause eggs built with a
   previous OS version to become obsolete.

 * easy_install's dependency processing algorithms have changed.  When using
   ``--always-copy``, it now ensures that dependencies are copied too.  When
   not using ``--always-copy``, it tries to use a single resolution loop,
   rather than recursing.

 * Fixed installing extra ``.pyc`` or ``.pyo`` files for scripts with ``.py``
   extensions.

 * Added ``--site-dirs`` option to allow adding custom "site" directories.
   Made ``easy-install.pth`` work in platform-specific alternate site
   directories (e.g. ``~/Library/Python/2.x/site-packages`` on Mac OS X).

 * If you manually delete the current version of a package, the next run of
   EasyInstall against the target directory will now remove the stray entry
   from the ``easy-install.pth`` file.

 * EasyInstall now recognizes URLs with a ``#egg=project_name`` fragment ID
   as pointing to the named project's source checkout.  Such URLs have a lower
   match precedence than any other kind of distribution, so they'll only be
   used if they have a higher version number than any other available
   distribution, or if you use the ``--editable`` option.  The ``#egg``
   fragment can contain a version if it's formatted as ``#egg=proj-ver``,
   where ``proj`` is the project name, and ``ver`` is the version number.  You
   *must* use the format for these values that the ``bdist_egg`` command uses;
   i.e., all non-alphanumeric runs must be condensed to single underscore
   characters.

 * Added the ``--editable`` option; see Editing and Viewing Source Packages
   in the docs.  Also, slightly changed the behavior of the
   ``--build-directory`` option.

 * Fixed the setup script sandbox facility not recognizing certain paths as
   valid on case-insensitive platforms.

0.5a12
------

 * The zip-safety scanner now checks for modules that might be used with
   ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't
   handle ``-m`` on zipped modules.

 * Fix ``python -m easy_install`` not working due to setuptools being installed
   as a zipfile.  Update safety scanner to check for modules that might be used
   as ``python -m`` scripts.

 * Misc. fixes for win32.exe support, including changes to support Python 2.4's
   changed ``bdist_wininst`` format.

0.5a11
------

 * Fix breakage of the "develop" command that was caused by the addition of
   ``--always-unzip`` to the ``easy_install`` command.

0.5a10
------

 * Put the ``easy_install`` module back in as a module, as it's needed for
   ``python -m`` to run it!

 * Allow ``--find-links/-f`` to accept local directories or filenames as well
   as URLs.

0.5a9
-----

 * Include ``svn:externals`` directories in source distributions as well as
   normal subversion-controlled files and directories.

 * Added ``exclude=patternlist`` option to ``setuptools.find_packages()``

 * Changed --tag-svn-revision to include an "r" in front of the revision number
   for better readability.

 * Added ability to build eggs without including source files (except for any
   scripts, of course), using the ``--exclude-source-files`` option to
   ``bdist_egg``.

 * ``setup.py install`` now automatically detects when an "unmanaged" package
   or module is going to be on ``sys.path`` ahead of a package being installed,
   thereby preventing the newer version from being imported. If this occurs,
   a warning message is output to ``sys.stderr``, but installation proceeds
   anyway. The warning message informs the user what files or directories
   need deleting, and advises them they can also use EasyInstall (with the
   ``--delete-conflicting`` option) to do it automatically.

 * The ``egg_info`` command now adds a ``top_level.txt`` file to the metadata
   directory that lists all top-level modules and packages in the distribution.
   This is used by the ``easy_install`` command to find possibly-conflicting
   "unmanaged" packages when installing the distribution.

 * Added ``zip_safe`` and ``namespace_packages`` arguments to ``setup()``.
   Added package analysis to determine zip-safety if the ``zip_safe`` flag
   is not given, and advise the author regarding what code might need changing.

 * Fixed the swapped ``-d`` and ``-b`` options of ``bdist_egg``.

 * EasyInstall now automatically detects when an "unmanaged" package or
   module is going to be on ``sys.path`` ahead of a package you're installing,
   thereby preventing the newer version from being imported.  By default, it
   will abort installation to alert you of the problem, but there are also
   new options (``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk``)
   available to change the default behavior.  (Note: this new feature doesn't
   take effect for egg files that were built with older ``setuptools``
   versions, because they lack the new metadata file required to implement it.)

 * The ``easy_install`` distutils command now uses ``DistutilsError`` as its
   base error type for errors that should just issue a message to stderr and
   exit the program without a traceback.

 * EasyInstall can now be given a path to a directory containing a setup
   script, and it will attempt to build and install the package there.

 * EasyInstall now performs a safety analysis on module contents to determine
   whether a package is likely to run in zipped form, and displays
   information about what modules may be doing introspection that would break
   when running as a zipfile.

 * Added the ``--always-unzip/-Z`` option, to force unzipping of packages that
   would ordinarily be considered safe to unzip, and changed the meaning of
   ``--zip-ok/-z`` to "always leave everything zipped".

0.5a8
-----

 * The "egg_info" command now always sets the distribution metadata to "safe"
   forms of the distribution name and version, so that distribution files will
   be generated with parseable names (i.e., ones that don't include '-' in the
   name or version). Also, this means that if you use the various ``--tag``
   options of "egg_info", any distributions generated will use the tags in the
   version, not just egg distributions.

 * Added support for defining command aliases in distutils configuration files,
   under the "[aliases]" section. To prevent recursion and to allow aliases to
   call the command of the same name, a given alias can be expanded only once
   per command-line invocation. You can define new aliases with the "alias"
   command, either for the local, global, or per-user configuration.

 * Added "rotate" command to delete old distribution files, given a set of
   patterns to match and the number of files to keep.  (Keeps the most
   recently-modified distribution files matching each pattern.)

 * Added "saveopts" command that saves all command-line options for the current
   invocation to the local, global, or per-user configuration file. Useful for
   setting defaults without having to hand-edit a configuration file.

 * Added a "setopt" command that sets a single option in a specified distutils
   configuration file.

 * There is now a separate documentation page for setuptools; revision
   history that's not specific to EasyInstall has been moved to that page.

0.5a7
-----

 * Added "upload" support for egg and source distributions, including a bug
   fix for "upload" and a temporary workaround for lack of .egg support in
   PyPI.

0.5a6
-----

 * Beefed up the "sdist" command so that if you don't have a MANIFEST.in, it
   will include all files under revision control (CVS or Subversion) in the
   current directory, and it will regenerate the list every time you create a
   source distribution, not just when you tell it to. This should make the
   default "do what you mean" more often than the distutils' default behavior
   did, while still retaining the old behavior in the presence of MANIFEST.in.

 * Fixed the "develop" command always updating .pth files, even if you
   specified ``-n`` or ``--dry-run``.

 * Slightly changed the format of the generated version when you use
   ``--tag-build`` on the "egg_info" command, so that you can make tagged
   revisions compare *lower* than the version specified in setup.py (e.g. by
   using ``--tag-build=dev``).

0.5a5
-----

 * Added ``develop`` command to ``setuptools``-based packages. This command
   installs an ``.egg-link`` pointing to the package's source directory, and
   script wrappers that ``execfile()`` the source versions of the package's
   scripts. This lets you put your development checkout(s) on sys.path without
   having to actually install them.  (To uninstall the link, use
   use ``setup.py develop --uninstall``.)

 * Added ``egg_info`` command to ``setuptools``-based packages. This command
   just creates or updates the "projectname.egg-info" directory, without
   building an egg.  (It's used by the ``bdist_egg``, ``test``, and ``develop``
   commands.)

 * Enhanced the ``test`` command so that it doesn't install the package, but
   instead builds any C extensions in-place, updates the ``.egg-info``
   metadata, adds the source directory to ``sys.path``, and runs the tests
   directly on the source. This avoids an "unmanaged" installation of the
   package to ``site-packages`` or elsewhere.

 * Made ``easy_install`` a standard ``setuptools`` command, moving it from
   the ``easy_install`` module to ``setuptools.command.easy_install``. Note
   that if you were importing or extending it, you must now change your imports
   accordingly.  ``easy_install.py`` is still installed as a script, but not as
   a module.

0.5a4
-----

 * Setup scripts using setuptools can now list their dependencies directly in
   the setup.py file, without having to manually create a ``depends.txt`` file.
   The ``install_requires`` and ``extras_require`` arguments to ``setup()``
   are used to create a dependencies file automatically. If you are manually
   creating ``depends.txt`` right now, please switch to using these setup
   arguments as soon as practical, because ``depends.txt`` support will be
   removed in the 0.6 release cycle. For documentation on the new arguments,
   see the ``setuptools.dist.Distribution`` class.

 * Setup scripts using setuptools now always install using ``easy_install``
   internally, for ease of uninstallation and upgrading.

 * Added ``--always-copy/-a`` option to always copy needed packages to the
   installation directory, even if they're already present elsewhere on
   sys.path. (In previous versions, this was the default behavior, but now
   you must request it.)

 * Added ``--upgrade/-U`` option to force checking PyPI for latest available
   version(s) of all packages requested by name and version, even if a matching
   version is available locally.

 * Added automatic installation of dependencies declared by a distribution
   being installed.  These dependencies must be listed in the distribution's
   ``EGG-INFO`` directory, so the distribution has to have declared its
   dependencies by using setuptools.  If a package has requirements it didn't
   declare, you'll still have to deal with them yourself.  (E.g., by asking
   EasyInstall to find and install them.)

 * Added the ``--record`` option to ``easy_install`` for the benefit of tools
   that run ``setup.py install --record=filename`` on behalf of another
   packaging system.)

0.5a3
-----

 * Fixed not setting script permissions to allow execution.

 * Improved sandboxing so that setup scripts that want a temporary directory
   (e.g. pychecker) can still run in the sandbox.

0.5a2
-----

 * Fix stupid stupid refactoring-at-the-last-minute typos.  :(

0.5a1
-----

 * Added support for "self-installation" bootstrapping. Packages can now
   include ``ez_setup.py`` in their source distribution, and add the following
   to their ``setup.py``, in order to automatically bootstrap installation of
   setuptools as part of their setup process::

    from ez_setup import use_setuptools
    use_setuptools()

    from setuptools import setup
    # etc...

 * Added support for converting ``.win32.exe`` installers to eggs on the fly.
   EasyInstall will now recognize such files by name and install them.

 * Fixed a problem with picking the "best" version to install (versions were
   being sorted as strings, rather than as parsed values)

0.4a4
-----

 * Added support for the distutils "verbose/quiet" and "dry-run" options, as
   well as the "optimize" flag.

 * Support downloading packages that were uploaded to PyPI (by scanning all
   links on package pages, not just the homepage/download links).

0.4a3
-----

 * Add progress messages to the search/download process so that you can tell
   what URLs it's reading to find download links.  (Hopefully, this will help
   people report out-of-date and broken links to package authors, and to tell
   when they've asked for a package that doesn't exist.)

0.4a2
-----

 * Added ``ez_setup.py`` installer/bootstrap script to make initial setuptools
   installation easier, and to allow distributions using setuptools to avoid
   having to include setuptools in their source distribution.

 * All downloads are now managed by the ``PackageIndex`` class (which is now
   subclassable and replaceable), so that embedders can more easily override
   download logic, give download progress reports, etc. The class has also
   been moved to the new ``setuptools.package_index`` module.

 * The ``Installer`` class no longer handles downloading, manages a temporary
   directory, or tracks the ``zip_ok`` option. Downloading is now handled
   by ``PackageIndex``, and ``Installer`` has become an ``easy_install``
   command class based on ``setuptools.Command``.

 * There is a new ``setuptools.sandbox.run_setup()`` API to invoke a setup
   script in a directory sandbox, and a new ``setuptools.archive_util`` module
   with an ``unpack_archive()`` API. These were split out of EasyInstall to
   allow reuse by other tools and applications.

 * ``setuptools.Command`` now supports reinitializing commands using keyword
   arguments to set/reset options. Also, ``Command`` subclasses can now set
   their ``command_consumes_arguments`` attribute to ``True`` in order to
   receive an ``args`` option containing the rest of the command line.

 * Added support for installing scripts

 * Added support for setting options via distutils configuration files, and
   using distutils' default options as a basis for EasyInstall's defaults.

 * Renamed ``--scan-url/-s`` to ``--find-links/-f`` to free up ``-s`` for the
   script installation directory option.

 * Use ``urllib2`` instead of ``urllib``, to allow use of ``https:`` URLs if
   Python includes SSL support.

0.4a1
-----

 * Added ``--scan-url`` and ``--index-url`` options, to scan download pages
   and search PyPI for needed packages.

0.3a4
-----

 * Restrict ``--build-directory=DIR/-b DIR`` option to only be used with single
   URL installs, to avoid running the wrong setup.py.

0.3a3
-----

 * Added ``--build-directory=DIR/-b DIR`` option.

 * Added "installation report" that explains how to use 'require()' when doing
   a multiversion install or alternate installation directory.

 * Added SourceForge mirror auto-select (Contributed by Ian Bicking)

 * Added "sandboxing" that stops a setup script from running if it attempts to
   write to the filesystem outside of the build area

 * Added more workarounds for packages with quirky ``install_data`` hacks

0.3a2
-----

 * Added new options to ``bdist_egg`` to allow tagging the egg's version number
   with a subversion revision number, the current date, or an explicit tag
   value. Run ``setup.py bdist_egg --help`` to get more information.

 * Added subversion download support for ``svn:`` and ``svn+`` URLs, as well as
   automatic recognition of HTTP subversion URLs (Contributed by Ian Bicking)

 * Misc. bug fixes

0.3a1
-----

 * Initial release.

doc/alt-python38-setuptools/README.rst000064400000004551151732726220013505 0ustar00.. image:: https://img.shields.io/pypi/v/setuptools.svg
   :target: `PyPI link`_

.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg
   :target: `PyPI link`_

.. _PyPI link: https://pypi.org/project/setuptools

.. image:: https://github.com/pypa/setuptools/workflows/tests/badge.svg
   :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22
   :alt: tests

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
   :target: https://github.com/psf/black
   :alt: Code style: Black

.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg
    :target: https://setuptools.readthedocs.io

.. image:: https://img.shields.io/badge/skeleton-2021-informational
   :target: https://blog.jaraco.com/skeleton

.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
   :target: https://codecov.io/gh/pypa/setuptools

.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat
   :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme

See the `Installation Instructions
<https://packaging.python.org/installing/>`_ in the Python Packaging
User's Guide for instructions on installing, upgrading, and uninstalling
Setuptools.

Questions and comments should be directed to the `distutils-sig
mailing list <http://mail.python.org/pipermail/distutils-sig/>`_.
Bug reports and especially tested patches may be
submitted directly to the `bug tracker
<https://github.com/pypa/setuptools/issues>`_.


Code of Conduct
===============

Everyone interacting in the setuptools project's codebases, issue trackers,
chat rooms, and mailing lists is expected to follow the
`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.


For Enterprise
==============

Available as part of the Tidelift Subscription.

Setuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.

`Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.


Security Contact
================

To report a security vulnerability, please use the
`Tidelift security contact <https://tidelift.com/security>`_.
Tidelift will coordinate the fix and disclosure.
doc/alt-python38-setuptools/build_meta.rst000064400000006163151732726220014656 0ustar00=======================================
Build System Support
=======================================

What is it?
-------------

Python packaging has come `a long way <https://bernat.tech/posts/pep-517-518/>`_.

The traditional ``setuptools`` way of packaging Python modules
uses a ``setup()`` function within the ``setup.py`` script. Commands such as
``python setup.py bdist`` or ``python setup.py bdist_wheel`` generate a 
distribution bundle and ``python setup.py install`` installs the distribution. 
This interface makes it difficult to choose other packaging tools without an 
overhaul. Because ``setup.py`` scripts allowed for arbitrary execution, it
proved difficult to provide a reliable user experience across environments
and history.

`PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ therefore came to
rescue and specified a new standard to 
package and distribute Python modules. Under PEP 517:

    a ``pyproject.toml`` file is used to specify what program to use
    for generating distribution. 

    Then, two functions provided by the program, ``build_wheel(directory: str)`` 
    and ``build_sdist(directory: str)`` create the distribution bundle at the 
    specified ``directory``. The program is free to use its own configuration 
    script or extend the ``.toml`` file. 

    Lastly, ``pip install *.whl`` or ``pip install *.tar.gz`` does the actual
    installation. If ``*.whl`` is available, ``pip`` will go ahead and copy
    the files into ``site-packages`` directory. If not, ``pip`` will look at
    ``pyproject.toml`` and decide what program to use to 'build from source' 
    (the default is ``setuptools``)

With this standard, switching between packaging tools becomes a lot easier. ``build_meta``
implements ``setuptools``' build system support.

How to use it?
--------------

Starting with a package that you want to distribute. You will need your source
scripts, a ``pyproject.toml`` file and a ``setup.cfg`` file::

    ~/meowpkg/
        pyproject.toml
        setup.cfg
        meowpkg/__init__.py

The pyproject.toml file is required to specify the build system (i.e. what is 
being used to package your scripts and install from source). To use it with 
setuptools, the content would be::

    [build-system]
    requires = ["setuptools", "wheel"]
    build-backend = "setuptools.build_meta"

The ``setuptools`` package implements the ``build_sdist``
command and the ``wheel`` package implements the ``build_wheel``
command; both are required to be compliant with PEP 517.

Use ``setuptools``' :ref:`declarative config <declarative config>` to
specify the package information::

    [metadata]
    name = meowpkg
    version = 0.0.1
    description = a package that meows
    
    [options]
    packages = find:

Now generate the distribution. To build the package, use
`PyPA build <https://pypa-build.readthedocs.io/en/latest/>`_::

    $ pip install -q build
    $ python -m build

And now it's done! The ``.whl`` file  and ``.tar.gz`` can then be distributed 
and installed::

    dist/
        meowpkg-0.0.1.whl
        meowpkg-0.0.1.tar.gz

    $ pip install dist/meowpkg-0.0.1.whl

or::

    $ pip install dist/meowpkg-0.0.1.tar.gz
doc/alt-python38-setuptools/setuptools.rst000064400000014322151732726220014766 0ustar00==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.

Feature Highlights:

* Create `Python Eggs <http://peak.telecommunity.com/DevCenter/PythonEggs>`_ -
  a single-file importable distribution format

* Enhanced support for accessing data files hosted in zipped packages.

* Automatically include all packages in your source tree, without listing them
  individually in setup.py

* Automatically include all relevant files in your source distributions,
  without needing to create a ``MANIFEST.in`` file, and without having to force
  regeneration of the ``MANIFEST`` file when your source tree changes.

* Automatically generate wrapper scripts or Windows (console and GUI) .exe
  files for any number of "main" functions in your project.  (Note: this is not
  a py2exe replacement; the .exe files rely on the local Python installation.)

* Transparent Cython support, so that your setup.py can list ``.pyx`` files and
  still work even when the end-user doesn't have Cython installed (as long as
  you include the Cython-generated C in your source distribution)

* Command aliases - create project-specific, per-user, or site-wide shortcut
  names for commonly used commands and options

* Deploy your project in "development mode", such that it's available on
  ``sys.path``, yet can still be edited directly from its source checkout.

* Easily extend the distutils with new commands or ``setup()`` arguments, and
  distribute/reuse your extensions for multiple projects, without copying code.

* Create extensible applications and frameworks that automatically discover
  extensions, using simple "entry points" declared in a project's setup script.

* Full support for PEP 420 via ``find_namespace_packages()``, which is also backwards
  compatible to the existing ``find_packages()`` for Python >= 3.3.

-----------------
Developer's Guide
-----------------

The developer's guide has been updated. See the :doc:`most recent version <userguide/index>`.































TRANSITIONAL NOTE
~~~~~~~~~~~~~~~~~

Setuptools automatically calls ``declare_namespace()`` for you at runtime,
but future versions may *not*.  This is because the automatic declaration
feature has some negative side effects, such as needing to import all namespace
packages during the initialization of the ``pkg_resources`` runtime, and also
the need for ``pkg_resources`` to be explicitly imported before any namespace
packages work at all.  In some future releases, you'll be responsible
for including your own declaration lines, and the automatic declaration feature
will be dropped to get rid of the negative side effects.

During the remainder of the current development cycle, therefore, setuptools
will warn you about missing ``declare_namespace()`` calls in your
``__init__.py`` files, and you should correct these as soon as possible
before the compatibility support is removed.
Namespace packages without declaration lines will not work
correctly once a user has upgraded to a later version, so it's important that
you make this change now in order to avoid having your code break in the field.
Our apologies for the inconvenience, and thank you for your patience.

















setup.cfg-only projects
=======================

.. versionadded:: 40.9.0

If ``setup.py`` is missing from the project directory when a :pep:`517`
build is invoked, ``setuptools`` emulates a dummy ``setup.py`` file containing
only a ``setuptools.setup()`` call.

.. note::

    :pep:`517` doesn't support editable installs so this is currently
    incompatible with ``pip install -e .``.

This means that you can have a Python project with all build configuration
specified in ``setup.cfg``, without a ``setup.py`` file, if you **can rely
on** your project always being built by a :pep:`517`/:pep:`518` compatible
frontend.

To use this feature:

* Specify build requirements and :pep:`517` build backend in
  ``pyproject.toml``.
  For example:

  .. code-block:: toml

      [build-system]
      requires = [
        "setuptools >= 40.9.0",
        "wheel",
      ]
      build-backend = "setuptools.build_meta"

* Use a :pep:`517` compatible build frontend, such as ``pip >= 19`` or ``build``.

  .. warning::

      As :pep:`517` is new, support is not universal, and frontends that
      do support it may still have bugs. For compatibility, you may want to
      put a ``setup.py`` file containing only a ``setuptools.setup()``
      invocation.


Configuration API
=================

Some automation tools may wish to access data from a configuration file.

``Setuptools`` exposes a ``read_configuration()`` function for
parsing ``metadata`` and ``options`` sections into a dictionary.


.. code-block:: python

    from setuptools.config import read_configuration

    conf_dict = read_configuration("/home/user/dev/package/setup.cfg")


By default, ``read_configuration()`` will read only the file provided
in the first argument. To include values from other configuration files
which could be in various places, set the ``find_others`` keyword argument
to ``True``.

If you have only a configuration file but not the whole package, you can still
try to get data out of it with the help of the ``ignore_option_errors`` keyword
argument. When it is set to ``True``, all options with errors possibly produced
by directives, such as ``attr:`` and others, will be silently ignored.
As a consequence, the resulting dictionary will include no such options.











Mailing List and Bug Tracker
============================

Please use the `distutils-sig mailing list`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the list are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
.. _setuptools bug tracker: https://github.com/pypa/setuptools/
doc/alt-python38-setuptools/userguide/index.rst000064400000002173151732726220015651 0ustar00==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.

Transition to PEP517
====================

Since setuptools no longer serves as the default build tool, one must explicitly
opt in (by providing a :file:`pyproject.toml` file) to use this library. The user
facing part is provided by tools such as pip and
backend interface is described :doc:`in this document <../build_meta>`. The
quickstart provides an overview of the new workflow.

.. toctree::
    :maxdepth: 1

    quickstart
    package_discovery
    entry_point
    dependency_management
    datafiles
    development_mode
    distribution
    extension
    declarative_config
    keywords
    commands
    functionalities_rewrite
    miscellaneous
doc/alt-python38-setuptools/userguide/development_mode.rst000064400000005364151732726220020075 0ustar00"Development Mode"
==================

Under normal circumstances, the ``distutils`` assume that you are going to
build a distribution of your project, not use it in its "raw" or "unbuilt"
form.  However, if you were to use the ``distutils`` to build a distribution,
you would have to rebuild and reinstall your project every time you made a
change to it during development.

Another problem that sometimes comes up with the ``distutils`` is that you may
need to do development on two related projects at the same time.  You may need
to put both projects' packages in the same directory to run them, but need to
keep them separate for revision control purposes.  How can you do this?

Setuptools allows you to deploy your projects for use in a common directory or
staging area, but without copying any files.  Thus, you can edit each project's
code in its checkout directory, and only need to run build commands when you
change a project's C extensions or similarly compiled files.  You can even
deploy a project into another project's checkout directory, if that's your
preferred way of working (as opposed to using a common independent staging area
or the site-packages directory).

To do this, use the ``setup.py develop`` command.  It works very similarly to
``setup.py install``, except that it doesn't actually install anything.
Instead, it creates a special ``.egg-link`` file in the deployment directory,
that links to your project's source code.  And, if your deployment directory is
Python's ``site-packages`` directory, it will also update the
``easy-install.pth`` file to include your project's source code, thereby making
it available on ``sys.path`` for all programs using that Python installation.

In addition, the ``develop`` command creates wrapper scripts in the target
script directory that will run your in-development scripts after ensuring that
all your ``install_requires`` packages are available on ``sys.path``.

You can deploy the same project to multiple staging areas, e.g. if you have
multiple projects on the same machine that are sharing the same project you're
doing development work.

When you're done with a given development task, you can remove the project
source from a staging area using ``setup.py develop --uninstall``, specifying
the desired staging area if it's not the default.

There are several options to control the precise behavior of the ``develop``
command; see the section on the :ref:`develop <develop>` command below for more details.

Note that you can also apply setuptools commands to non-setuptools projects,
using commands like this::

   python -c "import setuptools; with open('setup.py') as f: exec(compile(f.read(), 'setup.py', 'exec'))" develop

That is, you can simply list the normal setup commands and options following
the quoted part.
doc/alt-python38-setuptools/userguide/quickstart.rst000064400000017751151732726220016744 0ustar00==========================
``setuptools`` Quickstart
==========================

Installation
============

To install the latest version of setuptools, use::

    pip install --upgrade setuptools


Python packaging at a glance
============================
The landscape of Python packaging is shifting and ``Setuptools`` has evolved to
only provide backend support, no longer being the de-facto packaging tool in
the market. All python package must provide a ``pyproject.toml`` and specify
the backend (build system) it wants to use. The distribution can then
be generated with whatever tools that provides a ``build sdist``-alike
functionality. While this may appear cumbersome, given the added pieces,
it in fact tremendously enhances the portability of your package. The
change is driven under :pep:`PEP 517 <517#build-requirements>`. To learn more about Python packaging in general,
navigate to the :ref:`bottom <packaging-resources>` of this page.


Basic Use
=========
For basic use of setuptools, you will need a ``pyproject.toml`` with the
exact following info, which declares you want to use ``setuptools`` to
package your project:

.. code-block:: toml

    [build-system]
    requires = ["setuptools", "wheel"]
    build-backend = "setuptools.build_meta"

Then, you will need a ``setup.cfg`` or ``setup.py`` to specify your package
information, such as metadata, contents, dependencies, etc. Here we demonstrate
the minimum

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = mypackage
        version = 0.0.1

        [options]
        packages = mypackage
        install_requires =
            requests
            importlib; python_version == "2.6"

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            name='mypackage',
            version='0.0.1',
            packages=['mypackage'],
            install_requires=[
                'requests',
                'importlib; python_version == "2.6"',
            ],
        )

This is what your project would look like::

    ~/mypackage/
        pyproject.toml
        setup.cfg # or setup.py
        mypackage/__init__.py

Then, you need an builder, such as :std:doc:`PyPA build <pypa-build:index>`
which you can obtain via ``pip install build``. After downloading it, invoke
the builder::

    python -m build

You now have your distribution ready (e.g. a ``tar.gz`` file and a ``.whl``
file in the ``dist`` directory), which you can upload to PyPI!

Of course, before you release your project to PyPI, you'll want to add a bit
more information to your setup script to help people find or learn about your
project.  And maybe your project will have grown by then to include a few
dependencies, and perhaps some data files and scripts. In the next few sections,
we will walk through those additional but essential information you need
to specify to properly package your project.


Automatic package discovery
===========================
For simple projects, it's usually easy enough to manually add packages to
the ``packages`` keyword in ``setup.cfg``.  However, for very large projects
, it can be a big burden to keep the package list updated. ``setuptools``
therefore provides two convenient tools to ease the burden: :literal:`find:\ ` and
:literal:`find_namespace:\ `. To use it in your project:

.. code-block:: ini

    [options]
    packages = find:

    [options.packages.find] #optional
    include=pkg1, pkg2
    exclude=pk3, pk4

When you pass the above information, alongside other necessary ones,
``setuptools`` walks through the directory specified in ``where`` (omitted
here as the package reside in current directory) and filters the packages
it can find following the ``include``  (default to none), then remove
those that match the ``exclude`` and return a list of Python packages. Note
that each entry in the ``[options.packages.find]`` is optional. The above
setup also allows you to adopt a ``src/`` layout. For more details and advanced
use, go to :ref:`package_discovery`


Entry points and automatic script creation
===========================================
Setuptools support automatic creation of scripts upon installation, that runs
code within your package if you specify them with the ``entry_points`` keyword.
This is what allows you to run commands like ``pip install`` instead of having
to type ``python -m pip install``. To accomplish this, add the entry_points
keyword in your ``setup.cfg``:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        main = mypkg:some_func

When this project is installed, a ``main`` script will be installed and will
invoke the ``some_func`` in the ``__init__.py`` file when called by the user.
For detailed usage, including managing the additional or optional dependencies,
go to :doc:`entry_point`.


Dependency management
=====================
``setuptools`` supports automatically installing dependencies when a package is
installed. The simplest way to include requirement specifiers is to use the
``install_requires`` argument to ``setup.cfg``.  It takes a string or list of
strings containing requirement specifiers (A version specifier is one of the
operators <, >, <=, >=, == or !=, followed by a version identifier):

.. code-block:: ini

    [options]
    install_requires =
        docutils >= 0.3
        requests <= 0.4

When your project is installed, all of the dependencies not already installed
will be located (via PyPI), downloaded, built (if necessary), and installed.
This, of course, is a simplified scenarios. ``setuptools`` also provide
additional keywords such as ``setup_requires`` that allows you to install
dependencies before running the script, and ``extras_requires`` that take
care of those needed by automatically generated scripts. It also provides
mechanisms to handle dependencies that are not in PyPI. For more advanced use,
see :doc:`dependency_management`


.. _Including Data Files:

Including Data Files
====================
The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location. Setuptools offers three ways to
specify data files to be included in your packages. For the simplest use, you
can simply use the ``include_package_data`` keyword:

.. code-block:: ini

    [options]
    include_package_data = True

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
For more details, see :doc:`datafiles`


Development mode
================
``setuptools`` allows you to install a package without copying any files
to your interpreter directory (e.g. the ``site-packages`` directory). This
allows you to modify your source code and have the changes take effect without
you having to rebuild and reinstall. This is currently incompatible with
PEP 517 and therefore it requires a ``setup.py`` script with the following
content::

    import setuptools
    setuptools.setup()

Then::

    pip install --editable .

This creates a link file in your interpreter site package directory which
associate with your source code. For more information, see :doc:`development_mode`.


Uploading your package to PyPI
==============================
After generating the distribution files, next step would be to upload your
distribution so others can use it. This functionality is provided by
`twine <https://pypi.org/project/twine/>`_ and we will only demonstrate the
basic use here.


Transitioning from ``setup.py`` to ``setup.cfg``
================================================
To avoid executing arbitrary scripts and boilerplate code, we are transitioning
into a full-fledged ``setup.cfg`` to declare your package information instead
of running ``setup()``. This inevitably brings challenges due to a different
syntax. Here we provide a quick guide to understanding how ``setup.cfg`` is
parsed by ``setuptool`` to ease the pain of transition.

.. _packaging-resources:

Resources on Python packaging
=============================
Packaging in Python is hard. Here we provide a list of links for those that
want to learn more.
doc/alt-python38-setuptools/userguide/datafiles.rst000064400000017301151732726220016475 0ustar00====================
Data Files Support
====================

The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location.  However, the most common use case
for data files distributed with a package is for use *by* the package, usually
by including the data files in the package directory.

Setuptools offers three ways to specify data files to be included in your
packages.  First, you can simply use the ``include_package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        include_package_data=True
    )

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
(They can also be tracked by a revision control system, using an appropriate
plugin.  See the section below on :ref:`Adding Support for Revision
Control Systems` for information on how to write such plugins.)

If you want finer-grained control over what files are included (for example,
if you have documentation files in your package directories and want to exclude
them from installation), then you can also use the ``package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        package_data={
            # If any package contains *.txt or *.rst files, include them:
            "": ["*.txt", "*.rst"],
            # And include any *.msg files found in the "hello" package, too:
            "hello": ["*.msg"],
        }
    )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns.  The globs may include subdirectory names, if the data
files are contained in a subdirectory of the package.  For example, if the
package tree looks like this::

    setup.py
    src/
        mypkg/
            __init__.py
            mypkg.txt
            data/
                somefile.dat
                otherdata.dat

The setuptools setup file might look like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages("src"),  # include all packages under src
        package_dir={"": "src"},   # tell distutils packages are under src

        package_data={
            # If any package contains *.txt files, include them:
            "": ["*.txt"],
            # And include any *.dat files found in the "data" subdirectory
            # of the "mypkg" package, also:
            "mypkg": ["data/*.dat"],
        }
    )

Notice that if you list patterns in ``package_data`` under the empty string,
these patterns are used to find files in every package, even ones that also
have their own patterns listed.  Thus, in the above example, the ``mypkg.txt``
file gets included even though it's not listed in the patterns for ``mypkg``.

Also notice that if you use paths, you *must* use a forward slash (``/``) as
the path separator, even if you are on Windows.  Setuptools automatically
converts slashes to appropriate platform-specific separators at build time.

If datafiles are contained in a subdirectory of a package that isn't a package
itself (no ``__init__.py``), then the subdirectory names (or ``*``) are required
in the ``package_data`` argument (as shown above with ``"data/*.dat"``).

When building an ``sdist``, the datafiles are also drawn from the
``package_name.egg-info/SOURCES.txt`` file, so make sure that this is removed if
the ``setup.py`` ``package_data`` list is updated before calling ``setup.py``.

(Note: although the ``package_data`` argument was previously only available in
``setuptools``, it was also added to the Python ``distutils`` package as of
Python 2.4; there is `some documentation for the feature`__ available on the
python.org website.  If using the setuptools-specific ``include_package_data``
argument, files specified by ``package_data`` will *not* be automatically
added to the manifest unless they are listed in the MANIFEST.in file.)

__ https://docs.python.org/3/distutils/setupscript.html#installing-package-data

Sometimes, the ``include_package_data`` or ``package_data`` options alone
aren't sufficient to precisely define what files you want included.  For
example, you may want to include package README files in your revision control
system and source distributions, but exclude them from being installed.  So,
setuptools offers an ``exclude_package_data`` option as well, that allows you
to do things like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages("src"),  # include all packages under src
        package_dir={"": "src"},   # tell distutils packages are under src

        include_package_data=True,    # include everything in source control

        # ...but exclude README.txt from all packages
        exclude_package_data={"": ["README.txt"]},
    )

The ``exclude_package_data`` option is a dictionary mapping package names to
lists of wildcard patterns, just like the ``package_data`` option.  And, just
as with that option, a key of ``""`` will apply the given pattern(s) to all
packages.  However, any files that match these patterns will be *excluded*
from installation, even if they were listed in ``package_data`` or were
included as a result of using ``include_package_data``.

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by ``MANIFEST.in``.

``package_data``
    Specify additional patterns to match files that may or may
    not be matched by ``MANIFEST.in`` or found in source control.

``exclude_package_data``
    Specify patterns for data files and directories that should *not* be
    included when a package is installed, even if they would otherwise have
    been included due to the use of the preceding options.

NOTE: Due to the way the distutils build process works, a data file that you
include in your project and then stop including may be "orphaned" in your
project's build directories, requiring you to run ``setup.py clean --all`` to
fully remove them.  This may also be important for your users and contributors
if they track intermediate revisions of your project using Subversion; be sure
to let them know when you make changes that remove files from inclusion so they
can run ``setup.py clean --all``.


.. _Accessing Data Files at Runtime:

Accessing Data Files at Runtime
-------------------------------

Typically, existing programs manipulate a package's ``__file__`` attribute in
order to find the location of data files.  However, this manipulation isn't
compatible with PEP 302-based import hooks, including importing from zip files
and Python Eggs.  It is strongly recommended that, if you are using data files,
you should use the :ref:`ResourceManager API` of ``pkg_resources`` to access
them.  The ``pkg_resources`` module is distributed as part of setuptools, so if
you're using setuptools to distribute your package, there is no reason not to
use its resource management API.  See also `Importlib Resources`_ for
a quick example of converting code that uses ``__file__`` to use
``pkg_resources`` instead.

.. _Importlib Resources: https://docs.python.org/3/library/importlib.html#module-importlib.resources


Non-Package Data Files
----------------------

Historically, ``setuptools`` by way of ``easy_install`` would encapsulate data
files from the distribution into the egg (see `the old docs
<https://github.com/pypa/setuptools/blob/52aacd5b276fedd6849c3a648a0014f5da563e93/docs/setuptools.txt#L970-L1001>`_). As eggs are deprecated and pip-based installs
fall back to the platform-specific location for installing data files, there is
no supported facility to reliably retrieve these resources.

Instead, the PyPA recommends that any data files you wish to be accessible at
run time be included in the package.
doc/alt-python38-setuptools/userguide/declarative_config.rst000064400000024556151732726220020363 0ustar00.. _declarative config:

-----------------------------------------
Configuring setup() using setup.cfg files
-----------------------------------------

.. note:: New in 30.3.0 (8 Dec 2016).

.. important::
    If compatibility with legacy builds (i.e. those not using the :pep:`517`
    build API) is desired, a ``setup.py`` file containing a ``setup()`` function
    call is still required even if your configuration resides in ``setup.cfg``.

``Setuptools`` allows using configuration files (usually :file:`setup.cfg`)
to define a package’s metadata and other options that are normally supplied
to the ``setup()`` function (declarative config).

This approach not only allows automation scenarios but also reduces
boilerplate code in some cases.

.. _example-setup-config:

.. code-block:: ini

    [metadata]
    name = my_package
    version = attr: src.VERSION
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD 3-Clause License
    classifiers =
        Framework :: Django
        License :: OSI Approved :: BSD License
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.5

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    scripts =
        bin/first.py
        bin/second.py
    install_requires =
        requests
        importlib; python_version == "2.6"

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.entry_points]
    console_scripts =
        executable-name = package.module:function

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        src.subpackage1
        src.subpackage2

    [options.data_files]
    /etc/my_package =
        site.d/00_default.conf
        host.d/00_default.conf
    data = data/img/logo.png, data/svg/icon.svg
    fonts = data/fonts/*.ttf, data/fonts/*.otf

Metadata and options are set in the config sections of the same name.

* Keys are the same as the keyword arguments one provides to the ``setup()``
  function.

* Complex values can be written comma-separated or placed one per line
  in *dangling* config values. The following are equivalent:

  .. code-block:: ini

      [metadata]
      keywords = one, two

      [metadata]
      keywords =
          one
          two

* In some cases, complex values can be provided in dedicated subsections for
  clarity.

* Some keys allow ``file:``, ``attr:``, ``find:``, and ``find_namespace:`` directives in
  order to cover common usecases.

* Unknown keys are ignored.


Using a ``src/`` layout
=======================

One commonly used package configuration has all the module source code in a
subdirectory (often called the ``src/`` layout), like this::

    ├── src
    │   └── mypackage
    │       ├── __init__.py
    │       └── mod1.py
    ├── setup.py
    └── setup.cfg

You can set up your ``setup.cfg`` to automatically find all your packages in
the subdirectory like this:

.. code-block:: ini

    # This example contains just the necessary options for a src-layout, set up
    # the rest of the file as described above.

    [options]
    package_dir=
        =src
    packages=find:

    [options.packages.find]
    where=src

Specifying values
=================

Some values are treated as simple strings, some allow more logic.

Type names used below:

* ``str`` - simple string
* ``list-comma`` - dangling list or string of comma-separated values
* ``list-semi`` - dangling list or string of semicolon-separated values
* ``bool`` - ``True`` is 1, yes, true
* ``dict`` - list-comma where keys are separated from values by ``=``
* ``section`` - values are read from a dedicated (sub)section


Special directives:

* ``attr:`` - Value is read from a module attribute.  ``attr:`` supports
  callables and iterables; unsupported types are cast using ``str()``.

  In order to support the common case of a literal value assigned to a variable
  in a module containing (directly or indirectly) third-party imports,
  ``attr:`` first tries to read the value from the module by examining the
  module's AST.  If that fails, ``attr:`` falls back to importing the module.

* ``file:`` - Value is read from a list of files and then concatenated

  .. note::
      The ``file:`` directive is sandboxed and won't reach anything outside
      the directory containing ``setup.py``.


Metadata
--------

.. note::
    The aliases given below are supported for compatibility reasons,
    but their use is not advised.

==============================  =================  =================  =============== ==========
Key                             Aliases            Type               Minimum Version Notes
==============================  =================  =================  =============== ==========
name                                               str
version                                            attr:, file:, str  39.2.0          [#meta-1]_
url                             home-page          str
download_url                    download-url       str
project_urls                                       dict               38.3.0
author                                             str
author_email                    author-email       str
maintainer                                         str
maintainer_email                maintainer-email   str
classifiers                     classifier         file:, list-comma
license                                            str
license_files                   license_file       list-comma         42.0.0
description                     summary            file:, str
long_description                long-description   file:, str
long_description_content_type                      str                38.6.0
keywords                                           list-comma
platforms                       platform           list-comma
provides                                           list-comma
requires                                           list-comma
obsoletes                                          list-comma
==============================  =================  =================  =============== ==========

**Notes**:

.. [#meta-1] The ``version`` file attribute has only been supported since 39.2.0.

   A version loaded using the ``file:`` directive must comply with PEP 440.
   It is easy to accidentally put something other than a valid version
   string in such a file, so validation is stricter in this case.


Options
-------

=======================  ===================================  =============== =========
Key                      Type                                 Minimum Version Notes
=======================  ===================================  =============== =========
zip_safe                 bool
setup_requires           list-semi                            36.7.0
install_requires         list-semi
extras_require           section                                              [#opt-2]_
python_requires          str                                  34.4.0
entry_points             file:, section                       51.0.0
scripts                  list-comma
eager_resources          list-comma
dependency_links         list-comma
tests_require            list-semi
include_package_data     bool
packages                 find:, find_namespace:, list-comma                   [#opt-3]_
package_dir              dict
package_data             section                                              [#opt-1]_
exclude_package_data     section
namespace_packages       list-comma
py_modules               list-comma                            34.4.0
data_files               dict                                 40.6.0
=======================  ===================================  =============== =========

**Notes**:

.. [#opt-1] In the ``package_data`` section, a key named with a single asterisk
   (``*``) refers to all packages, in lieu of the empty string used in ``setup.py``.
 
.. [#opt-2] In the ``extras_require`` section, values are parsed as ``list-semi``.
   This implies that in order to include markers, they **must** be *dangling*:
 
   .. code-block:: ini

      [options.extras_require]
      rest = docutils>=0.3; pack ==1.1, ==1.3
      pdf =
        ReportLab>=1.2
        RXP
        importlib-metadata; python_version < "3.8"

.. [#opt-3] The ``find:`` and ``find_namespace:`` directive can be further configured
   in a dedicated subsection ``options.packages.find``. This subsection accepts the
   same keys as the ``setuptools.find_packages`` and the
   ``setuptools.find_namespace_packages`` function:
   ``where``, ``include``, and ``exclude``.

   The ``find_namespace:`` directive is supported since Python >=3.3.


Compatibility with other tools
==============================

Historically, several tools explored declarative package configuration
in parallel. And several of them chose to place the packaging
configuration within the project's :file:`setup.cfg` file.
One of the first was ``distutils2``, which development has stopped in
2013. Other include ``pbr`` which is still under active development or
``d2to1``, which was a plug-in that backports declarative configuration
to ``distutils``, but has had no release since Oct. 2015.
As a way to harmonize packaging tools, ``setuptools``, having held the
position of *de facto* standard, has gradually integrated those
features as part of its core features.

Still this has lead to some confusion and feature incompatibilities:

- some tools support features others don't;
- some have similar features but the declarative syntax differs;

The table below tries to summarize the differences. But, please, refer
to each tool documentation for up-to-date information.

=========================== ========== ========== ===== ===
feature                     setuptools distutils2 d2to1 pbr
=========================== ========== ========== ===== ===
[metadata] description-file S          Y          Y     Y
[files]                     S          Y          Y     Y
entry_points                Y          Y          Y     S
[backwards_compat]          N          Y          Y     Y
=========================== ========== ========== ===== ===

Y: supported, N: unsupported, S: syntax differs (see
:ref:`above example<example-setup-config>`).

Also note that some features were only recently added to ``setuptools``.
Please refer to the previous sections to find out when.
doc/alt-python38-setuptools/userguide/package_discovery.rst000064400000015621151732726220020226 0ustar00.. _`package_discovery`:

========================================
Package Discovery and Namespace Package
========================================

.. note::
    a full specification for the keyword supplied to ``setup.cfg`` or
    ``setup.py`` can be found at :doc:`keywords reference <keywords>`

.. note::
    the examples provided here are only to demonstrate the functionality
    introduced. More metadata and options arguments need to be supplied
    if you want to replicate them on your system. If you are completely
    new to setuptools, the :doc:`quickstart section <quickstart>` is a good
    place to start.

``Setuptools`` provide powerful tools to handle package discovery, including
support for namespace package. Normally, you would specify the package to be
included manually in the following manner:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        packages =
            mypkg1
            mypkg2

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=['mypkg1', 'mypkg2']
        )

This can get tiresome really quickly. To speed things up, we introduce two
functions provided by setuptools:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find:
        #or
        packages = find_namespace:

.. tab:: setup.py

    .. code-block:: python

        from setuptools import find_packages

        # or
        from setuptools import find_namespace_packages


Using ``find:`` or ``find_packages``
====================================
Let's start with the first tool. ``find:`` (``find_packages``) takes a source
directory and two lists of package name patterns to exclude and include, and
then return a list of ``str`` representing the packages it could find. To use
it, consider the following directory

.. code-block:: bash

    mypkg/
        src/
            pkg1/__init__.py
            pkg2/__init__.py
            additional/__init__.py

        setup.cfg #or setup.py

To have your setup.cfg or setup.py to automatically include packages found
in ``src`` that starts with the name ``pkg`` and not ``additional``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find:
        package_dir =
            =src

        [options.packages.find]
        where = src
        include = pkg*
        exclude = additional

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_packages(
                where='src',
                include=['pkg*'],
                exclude=['additional'],
            ),
            package_dir={"": "src"}
            # ...
        )


.. _Namespace Packages:

Using ``find_namespace:`` or ``find_namespace_packages``
========================================================
``setuptools``  provides the ``find_namespace:`` (``find_namespace_packages``)
which behaves similarly to ``find:`` but works with namespace package. Before
diving in, it is important to have a good understanding of what namespace
packages are. Here is a quick recap:

Suppose you have two packages named as follows:

.. code-block:: bash

    /Users/Desktop/timmins/foo/__init__.py
    /Library/timmins/bar/__init__.py

If both ``Desktop`` and ``Library`` are on your ``PYTHONPATH``, then a
namespace package called ``timmins`` will be created automatically for you when
you invoke the import mechanism, allowing you to accomplish the following

.. code-block:: pycon

    >>> import timmins.foo
    >>> import timmins.bar

as if there is only one ``timmins`` on your system. The two packages can then
be distributed separately and installed individually without affecting the
other one. Suppose you are packaging the ``foo`` part:

.. code-block:: bash

    foo/
        src/
            timmins/foo/__init__.py
        setup.cfg # or setup.py

and you want the ``foo`` to be automatically included, ``find:`` won't work
because timmins doesn't contain ``__init__.py`` directly, instead, you have
to use ``find_namespace:``:

.. code-block:: ini

    [options]
    package_dir =
        =src
    packages = find_namespace:

    [options.packages.find]
    where = src

When you install the zipped distribution, ``timmins.foo`` would become
available to your interpreter.

You can think of ``find_namespace:`` as identical to ``find:`` except it
would count a directory as a package even if it doesn't contain ``__init__.py``
file directly. As a result, this creates an interesting side effect. If you
organize your package like this:

.. code-block:: bash

    foo/
        timmins/
            foo/__init__.py
        setup.cfg # or setup.py
        tests/
            test_foo/__init__.py

a naive ``find_namespace:`` would include tests as part of your package to
be installed. A simple way to fix it is to adopt the aforementioned
``src`` layout.


Legacy Namespace Packages
=========================
The fact you can create namespace package so effortlessly above is credited
to `PEP 420 <https://www.python.org/dev/peps/pep-0420/>`_. It use to be more
cumbersome to accomplish the same result. Historically, there were two methods
to create namespace packages. One is the ``pkg_resources`` style supported by
``setuptools`` and the other one being ``pkgutils`` style offered by
``pkgutils`` module in Python. Both are now considered deprecated despite the
fact they still linger in many existing packages. These two differ in many
subtle yet significant aspects and you can find out more on `Python packaging
user guide <https://packaging.python.org/guides/packaging-namespace-packages/>`_


``pkg_resource`` style namespace package
----------------------------------------
This is the method ``setuptools`` directly supports. Starting with the same
layout, there are two pieces you need to add to it. First, an ``__init__.py``
file directly under your namespace package directory that contains the
following:

.. code-block:: python

    __import__("pkg_resources").declare_namespace(__name__)

And the ``namespace_packages`` keyword in your ``setup.cfg`` or ``setup.py``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        namespace_packages = timmins

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            namespace_packages=['timmins']
        )

And your directory should look like this

.. code-block:: bash

    /foo/
        src/
            timmins/
                __init__.py
                foo/__init__.py
        setup.cfg #or setup.py

Repeat the same for other packages and you can achieve the same result as
the previous section.

``pkgutil`` style namespace package
-----------------------------------
This method is almost identical to the ``pkg_resource`` except that the
``namespace_packages`` declaration is omitted and the ``__init__.py``
file contains the following:

.. code-block:: python

    __path__ = __import__('pkgutil').extend_path(__path__, __name__)

The project layout remains the same and ``setup.cfg`` remains the same.
doc/alt-python38-setuptools/userguide/extension.rst000064400000025035151732726220016560 0ustar00.. _Creating ``distutils`` Extensions:

Creating ``distutils`` Extensions
=================================

It can be hard to add new commands or setup arguments to the distutils.  But
the ``setuptools`` package makes it a bit easier, by allowing you to distribute
a distutils extension as a separate project, and then have projects that need
the extension just refer to it in their ``setup_requires`` argument.

With ``setuptools``, your distutils extension projects can hook in new
commands and ``setup()`` arguments just by defining "entry points".  These
are mappings from command or argument names to a specification of where to
import a handler from.  (See the section on :ref:`Dynamic Discovery of
Services and Plugins` above for some more background on entry points.)


Adding Commands
---------------

You can add new ``setup`` commands by defining entry points in the
``distutils.commands`` group.  For example, if you wanted to add a ``foo``
command, you might add something like this to your distutils extension
project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
        },
    )

(Assuming, of course, that the ``foo`` class in ``mypackage.some_module`` is
a ``setuptools.Command`` subclass.)

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running "install" or "develop" with a site-packages installation
directory) the command(s) will be available to any ``setuptools``-based setup
scripts.  It is not necessary to use the ``--command-packages`` option or
to monkeypatch the ``distutils.command`` package to install your commands;
``setuptools`` automatically adds a wrapper to the distutils to search for
entry points in the active distributions on ``sys.path``.  In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!

Adding ``setup()`` Arguments
----------------------------

.. warning:: Adding arguments to setup is discouraged as such arguments
   are only supported through imperative execution and not supported through
   declarative config.

Sometimes, your commands may need additional arguments to the ``setup()``
call.  You can enable this by defining entry points in the
``distutils.setup_keywords`` group.  For example, if you wanted a ``setup()``
argument called ``bar_baz``, you might add something like this to your
distutils extension project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
            "distutils.setup_keywords": [
                "bar_baz = mypackage.some_module:validate_bar_baz",
            ],
        },
    )

The idea here is that the entry point defines a function that will be called
to validate the ``setup()`` argument, if it's supplied.  The ``Distribution``
object will have the initial value of the attribute set to ``None``, and the
validation function will only be called if the ``setup()`` call sets it to
a non-None value.  Here's an example validation function::

    def assert_bool(dist, attr, value):
        """Verify that value is True, False, 0, or 1"""
        if bool(value) != value:
            raise DistutilsSetupError(
                "%r must be a boolean value (got %r)" % (attr,value)
            )

Your function should accept three arguments: the ``Distribution`` object,
the attribute name, and the attribute value.  It should raise a
``DistutilsSetupError`` (from the ``distutils.errors`` module) if the argument
is invalid.  Remember, your function will only be called with non-None values,
and the default value of arguments defined this way is always None.  So, your
commands should always be prepared for the possibility that the attribute will
be ``None`` when they access it later.

If more than one active distribution defines an entry point for the same
``setup()`` argument, *all* of them will be called.  This allows multiple
distutils extensions to define a common argument, as long as they agree on
what values of that argument are valid.

Also note that as with commands, it is not necessary to subclass or monkeypatch
the distutils ``Distribution`` class in order to add your arguments; it is
sufficient to define the entry points in your extension, as long as any setup
script using your extension lists your project in its ``setup_requires``
argument.


Customizing Distribution Options
--------------------------------

Plugins may wish to extend or alter the options on a Distribution object to
suit the purposes of that project. For example, a tool that infers the
``Distribution.version`` from SCM-metadata may need to hook into the
option finalization. To enable this feature, Setuptools offers an entry
point "setuptools.finalize_distribution_options". That entry point must
be a callable taking one argument (the Distribution instance).

If the callable has an ``.order`` property, that value will be used to
determine the order in which the hook is called. Lower numbers are called
first and the default is zero (0).

Plugins may read, alter, and set properties on the distribution, but each
plugin is encouraged to load the configuration/settings for their behavior
independently.


.. _Adding new EGG-INFO Files:

Adding new EGG-INFO Files
-------------------------

Some extensible applications or frameworks may want to allow third parties to
develop plugins with application or framework-specific metadata included in
the plugins' EGG-INFO directory, for easy access via the ``pkg_resources``
metadata API.  The easiest way to allow this is to create a distutils extension
to be used from the plugin projects' setup scripts (via ``setup_requires``)
that defines a new setup keyword, and then uses that data to write an EGG-INFO
file when the ``egg_info`` command is run.

The ``egg_info`` command looks for extension points in an ``egg_info.writers``
group, and calls them to write the files.  Here's a simple example of a
distutils extension defining a setup argument ``foo_bar``, which is a list of
lines that will be written to ``foo_bar.txt`` in the EGG-INFO directory of any
project that uses the argument::

    setup(
        # ...
        entry_points={
            "distutils.setup_keywords": [
                "foo_bar = setuptools.dist:assert_string_list",
            ],
            "egg_info.writers": [
                "foo_bar.txt = setuptools.command.egg_info:write_arg",
            ],
        },
    )

This simple example makes use of two utility functions defined by setuptools
for its own use: a routine to validate that a setup keyword is a sequence of
strings, and another one that looks up a setup argument and writes it to
a file.  Here's what the writer utility looks like::

    def write_arg(cmd, basename, filename):
        argname = os.path.splitext(basename)[0]
        value = getattr(cmd.distribution, argname, None)
        if value is not None:
            value = "\n".join(value) + "\n"
        cmd.write_or_delete_file(argname, filename, value)

As you can see, ``egg_info.writers`` entry points must be a function taking
three arguments: a ``egg_info`` command instance, the basename of the file to
write (e.g. ``foo_bar.txt``), and the actual full filename that should be
written to.

In general, writer functions should honor the command object's ``dry_run``
setting when writing files, and use the ``distutils.log`` object to do any
console output.  The easiest way to conform to this requirement is to use
the ``cmd`` object's ``write_file()``, ``delete_file()``, and
``write_or_delete_file()`` methods exclusively for your file operations.  See
those methods' docstrings for more details.


.. _Adding Support for Revision Control Systems:

Adding Support for Revision Control Systems
-------------------------------------------------

If the files you want to include in the source distribution are tracked using
Git, Mercurial or SVN, you can use the following packages to achieve that:

- Git and Mercurial: `setuptools_scm <https://pypi.org/project/setuptools_scm/>`_
- SVN: `setuptools_svn <https://pypi.org/project/setuptools_svn/>`_

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        ...  # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this::

    entry_points={
        "setuptools.file_finders": [
            "foobar = my_foobar_module:find_files_for_foobar",
        ]
    }

Then, anyone who wants to use your plugin can simply install it, and their
local setuptools installation will be able to find the necessary files.

It is not necessary to distribute source control plugins with projects that
simply use the other source control system, or to specify the plugins in
``setup_requires``.  When you create a source distribution with the ``sdist``
command, setuptools automatically records what files were found in the
``SOURCES.txt`` file.  That way, recipients of source distributions don't need
to have revision control at all.  However, if someone is working on a package
by checking out with that system, they will need the same plugin(s) that the
original author is using.

A few important points for writing revision control file finders:

* Your finder function MUST return relative paths, created by appending to the
  passed-in directory name.  Absolute paths are NOT allowed, nor are relative
  paths that reference a parent directory of the passed-in directory.

* Your finder function MUST accept an empty string as the directory name,
  meaning the current directory.  You MUST NOT convert this to a dot; just
  yield relative paths.  So, yielding a subdirectory named ``some/dir`` under
  the current directory should NOT be rendered as ``./some/dir`` or
  ``/somewhere/some/dir``, but *always* as simply ``some/dir``

* Your finder function SHOULD NOT raise any errors, and SHOULD deal gracefully
  with the absence of needed programs (i.e., ones belonging to the revision
  control system itself.  It *may*, however, use ``distutils.log.warn()`` to
  inform the user of the missing program(s).
doc/alt-python38-setuptools/userguide/keywords.rst000064400000021332151732726220016407 0ustar00New and Changed ``setup()`` Keywords
====================================

The following keyword arguments to ``setup()`` are added or changed by
``setuptools``.  All of them are optional; you do not have to supply them
unless you need the associated ``setuptools`` feature.

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section on
    :ref:`Including Data Files`.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section on :ref:`Including Data Files`.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section on :ref:`Including
    Data Files`.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See :ref:`Dynamic
    Discovery of Services and Plugins` for details and examples of the format
    of this argument.  In addition, this keyword is used to support
    :ref:`Automatic Script Creation <entry_points>`.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``
    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (using pip if available) before processing the
    rest of the setup script or commands.  This argument is needed if you
    are using distutils extensions as part of your build process; for
    example, extensions that process setup() arguments and turn them into
    EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

``dependency_links``
    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use during install by tools that support them.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section below on :ref:`Namespace Packages` for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the :ref:`test <test>` command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    :ref:`test <test>` command below for more details.

    New in 41.5.0: Deprecated the test command.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (using pip if
    available).  Note that these required projects will *not* be installed on
    the system where the tests are run, but only downloaded to the project's setup
    directory if they're not already installed locally.

    New in 41.5.0: Deprecated the test command.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the ``names`` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

    New in 41.5.0: Deprecated the test command.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be "/"-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on :ref:`Automatic Resource Extraction`.

``project_urls``
    An arbitrary map of URL names to hyperlinks, allowing more extensible
    documentation of where various resources can be found than the simple
    ``url`` and ``download_url`` options provide.
doc/alt-python38-setuptools/userguide/dependency_management.rst000064400000025273151732726220021062 0ustar00=====================================
Dependencies Management in Setuptools
=====================================

There are three types of dependency styles offered by setuptools:
1) build system requirement, 2) required dependency and 3) optional
dependency.

.. Note::
    Packages that are added to dependency can be optionally specified with the
    version by following `PEP 440 <https://www.python.org/dev/peps/pep-0440/>`_


Build system requirement
========================

Package requirement
-------------------
After organizing all the scripts and files and getting ready for packaging,
there needs to be a way to tell Python what programs it needs to actually
do the packaging (in our case, ``setuptools`` of course). Usually,
you also need the ``wheel`` package as well since it is recommended that you
upload a ``.whl`` file to PyPI alongside your ``.tar.gz`` file. Unlike the
other two types of dependency keyword, this one is specified in your
``pyproject.toml`` file (if you have forgot what this is, go to
:doc:`quickstart` or (WIP)):

.. code-block:: ini

    [build-system]
    requires = ["setuptools", "wheel"]
    #...

.. note::
    This used to be accomplished with the ``setup_requires`` keyword but is
    now considered deprecated in favor of the PEP 517 style described above.
    To peek into how this legacy keyword is used, consult our :doc:`guide on
    deprecated practice (WIP) <../deprecated/index>`


.. _Declaring Dependencies:

Declaring required dependency
=============================
This is where a package declares its core dependencies, without which it won't
be able to run. ``setuptools`` support automatically download and install
these dependencies when the package is installed. Although there is more
finesse to it, let's start with a simple example.

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            docutils
            BazSpam ==1.1

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                'docutils',
                'BazSpam ==1.1',
            ],
        )


When your project is installed (e.g. using pip), all of the dependencies not
already installed will be located (via PyPI), downloaded, built (if necessary),
and installed and 2) Any scripts in your project will be installed with wrappers
that verify the availability of the specified dependencies at runtime.


Platform specific dependencies
------------------------------
Setuptools offer the capability to evaluate certain conditions before blindly
installing everything listed in ``install_requires``. This is great for platform
specific dependencies. For example, the ``enum`` package was added in Python
3.4, therefore, package that depends on it can elect to install it only when
the Python version is older than 3.4. To accomplish this

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            enum34;python_version<'3.4'

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                "enum34;python_version<'3.4'",
            ],
        )

Similarly, if you also wish to declare ``pywin32`` with a minimal version of 1.0
and only install it if the user is using a Windows operating system:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            enum34;python_version<'3.4'
            pywin32 >= 1.0;platform_system=='Windows'

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                "enum34;python_version<'3.4'",
                "pywin32 >= 1.0;platform_system=='Windows'",
            ],
        )

The environmental markers that may be used for testing platform types are
detailed in `PEP 508 <https://www.python.org/dev/peps/pep-0508/>`_.


Dependencies that aren't in PyPI
--------------------------------
.. warning::
    Dependency links support has been dropped by pip starting with version
    19.0 (released 2019-01-22).

If your project depends on packages that don't exist on PyPI, you may still be
able to depend on them, as long as they are available for download as:

- an egg, in the standard distutils ``sdist`` format,
- a single ``.py`` file, or
- a VCS repository (Subversion, Mercurial, or Git).

You just need to add some URLs to the ``dependency_links`` argument to
``setup()``.

The URLs must be either:

1. direct download URLs,
2. the URLs of web pages that contain direct download links, or
3. the repository's URL

In general, it's better to link to web pages, because it is usually less
complex to update a web page than to release a new version of your project.
You can also use a SourceForge ``showfiles.php`` link in the case where a
package you depend on is distributed via SourceForge.

If you depend on a package that's distributed as a single ``.py`` file, you
must include an ``"#egg=project-version"`` suffix to the URL, to give a project
name and version number.  (Be sure to escape any dashes in the name or version
by replacing them with underscores.)  EasyInstall will recognize this suffix
and automatically create a trivial ``setup.py`` to wrap the single ``.py`` file
as an egg.

In the case of a VCS checkout, you should also append ``#egg=project-version``
in order to identify for what package that checkout should be used. You can
append ``@REV`` to the URL's path (before the fragment) to specify a revision.
Additionally, you can also force the VCS being used by prepending the URL with
a certain prefix. Currently available are:

-  ``svn+URL`` for Subversion,
-  ``git+URL`` for Git, and
-  ``hg+URL`` for Mercurial

A more complete example would be:

    ``vcs+proto://host/path@revision#egg=project-version``

Be careful with the version. It should match the one inside the project files.
If you want to disregard the version, you have to omit it both in the
``requires`` and in the URL's fragment.

This will do a checkout (or a clone, in Git and Mercurial parlance) to a
temporary folder and run ``setup.py bdist_egg``.

The ``dependency_links`` option takes the form of a list of URL strings.  For
example, this will cause a search of the specified page for eggs or source
distributions, if the package's dependencies aren't already installed:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        dependency_links = http://peak.telecommunity.com/snapshots/

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            dependency_links=[
                "http://peak.telecommunity.com/snapshots/",
            ],
        )


Optional dependencies
=====================
Setuptools allows you to declare dependencies that only get installed under
specific circumstances. These dependencies are specified with ``extras_require``
keyword and are only installed if another package depends on it (either
directly or indirectly) This makes it convenient to declare dependencies for
ancillary functions such as "tests" and "docs".

.. note::
    ``tests_require`` is now deprecated

For example, Package-A offers optional PDF support and requires two other
dependencies for it to work:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-A

        [options.extras_require]
        PDF = ReportLab>=1.2; RXP


.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-A",
            ...,
            extras_require={
                "PDF": ["ReportLab>=1.2", "RXP"],
            },
        )

The name ``PDF`` is an arbitrary identifier of such a list of dependencies, to
which other components can refer and have them installed. There are two common
use cases.

First is the console_scripts entry point:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project A
        #...

        [options]
        #...
        entry_points=
            [console_scripts]
            rst2pdf = project_a.tools.pdfgen [PDF]
            rst2html = project_a.tools.htmlgen

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-A",
            ...,
            entry_points={
                "console_scripts": [
                    "rst2pdf = project_a.tools.pdfgen [PDF]",
                    "rst2html = project_a.tools.htmlgen",
                ],
            },
        )

This syntax indicates that the entry point (in this case a console script)
is only valid when the PDF extra is installed. It is up to the installer
to determine how to handle the situation where PDF was not indicated
(e.g. omit the console script, provide a warning when attempting to load
the entry point, assume the extras are present and let the implementation
fail later).

The second use case is that other package can use this "extra" for their
own dependencies. For example, if "Project-B" needs "project A" with PDF support
installed, it might declare the dependency like this:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project-B
        #...

        [options]
        #...
        install_requires =
            Project-A[PDF]

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-B",
            install_requires=["Project-A[PDF]"],
            ...,
        )

This will cause ReportLab to be installed along with project A, if project B is
installed -- even if project A was already installed.  In this way, a project
can encapsulate groups of optional "downstream dependencies" under a feature
name, so that packages that depend on it don't have to know what the downstream
dependencies are.  If a later version of Project A builds in PDF support and
no longer needs ReportLab, or if it ends up needing other dependencies besides
ReportLab in order to provide PDF support, Project B's setup information does
not need to change, but the right packages will still be installed if needed.

.. note::
    Best practice: if a project ends up not needing any other packages to
    support a feature, it should keep an empty requirements list for that feature
    in its ``extras_require`` argument, so that packages depending on that feature
    don't break (due to an invalid feature name).


Python requirement
==================
In some cases, you might need to specify the minimum required python version.
This is handled with the ``python_requires`` keyword supplied to ``setup.cfg``
or ``setup.py``.


.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project-B
        #...

        [options]
        #...
        python_requires = >=3.6

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-B",
            python_requires=[">=3.6"],
            ...,
        )
doc/alt-python38-setuptools/userguide/distribution.rst000064400000030714151732726220017263 0ustar00Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

When a set of related projects are under development, it may be important to
track finer-grained version increments than you would normally use for e.g.
"stable" releases.  While stable releases might be measured in dotted numbers
with alpha/beta/etc. status codes, development versions of a project often
need to be tracked by revision or build number or even build date.  This is
especially true when projects in development need to refer to one another, and
therefore may literally need an up-to-the-minute version of something!

To support these scenarios, ``setuptools`` allows you to "tag" your source and
egg distributions by adding one or more of the following to the project's
"official" version identifier:

* A manually-specified pre-release tag, such as "build" or "dev", or a
  manually-specified post-release tag, such as a build or revision number
  (``--tag-build=STRING, -bSTRING``)

* An 8-character representation of the build date (``--tag-date, -d``), as
  a postrelease tag

You can add these tags by adding ``egg_info`` and the desired options to
the command line ahead of the ``sdist`` or ``bdist`` commands that you want
to generate a daily build or snapshot for.  See the section below on the
:ref:`egg_info <egg_info>` command for more details.

(Also, before you release your project, be sure to see the section on
:ref:`Specifying Your Project's Version` for more information about how pre- and
post-release tags affect how version numbers are interpreted.  This is
important in order to make sure that dependency processing tools will know
which versions of your project are newer than others.)

Finally, if you are creating builds frequently, and either building them in a
downloadable location or are copying them to a distribution server, you should
probably also check out the :ref:`rotate <rotate>` command, which lets you automatically
delete all but the N most-recently-modified distributions matching a glob
pattern.  So, you can use a command line like::

    setup.py egg_info -rbDEV bdist_egg rotate -m.egg -k3

to build an egg whose version info includes "DEV-rNNNN" (where NNNN is the
most recent Subversion revision that affected the source tree), and then
delete any egg files from the distribution directory except for the three
that were built most recently.

If you have to manage automated builds for multiple packages, each with
different tagging and rotation policies, you may also want to check out the
:ref:`alias <alias>` command, which would let each package define an alias like ``daily``
that would perform the necessary tag, build, and rotate commands.  Then, a
simpler script or cron job could just run ``setup.py daily`` in each project
directory.  (And, you could also define sitewide or per-user default versions
of the ``daily`` alias, so that projects that didn't define their own would
use the appropriate defaults.)

Generating Source Distributions
-------------------------------

``setuptools`` enhances the distutils' default algorithm for source file
selection with pluggable endpoints for looking up files to include. If you are
using a revision control system, and your source distributions only need to
include files that you're tracking in revision control, use a corresponding
plugin instead of writing a ``MANIFEST.in`` file. See the section below on
:ref:`Adding Support for Revision Control Systems` for information on plugins.

If you need to include automatically generated files, or files that are kept in
an unsupported revision control system, you'll need to create a ``MANIFEST.in``
file to specify any files that the default file location algorithm doesn't
catch.  See the distutils documentation for more information on the format of
the ``MANIFEST.in`` file.

But, be sure to ignore any part of the distutils documentation that deals with
``MANIFEST`` or how it's generated from ``MANIFEST.in``; setuptools shields you
from these issues and doesn't work the same way in any case.  Unlike the
distutils, setuptools regenerates the source distribution manifest file
every time you build a source distribution, and it builds it inside the
project's ``.egg-info`` directory, out of the way of your main project
directory.  You therefore need not worry about whether it is up-to-date or not.

Indeed, because setuptools' approach to determining the contents of a source
distribution is so much simpler, its ``sdist`` command omits nearly all of
the options that the distutils' more complex ``sdist`` process requires.  For
all practical purposes, you'll probably use only the ``--formats`` option, if
you use any option at all.


Making "Official" (Non-Snapshot) Releases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When you make an official release, creating source or binary distributions,
you will need to override the tag settings from ``setup.cfg``, so that you
don't end up registering versions like ``foobar-0.7a1.dev-r34832``.  This is
easy to do if you are developing on the trunk and using tags or branches for
your releases - just make the change to ``setup.cfg`` after branching or
tagging the release, so the trunk will still produce development snapshots.

Alternately, if you are not branching for releases, you can override the
default version options on the command line, using something like::

    setup.py egg_info -Db "" sdist bdist_egg

The first part of this command (``egg_info -Db ""``) will override the
configured tag information, before creating source and binary eggs. Thus, these
commands will use the plain version from your ``setup.py``, without adding the
build designation string.

Of course, if you will be doing this a lot, you may wish to create a personal
alias for this operation, e.g.::

    setup.py alias -u release egg_info -Db ""

You can then use it like this::

    setup.py release sdist bdist_egg

Or of course you can create more elaborate aliases that do all of the above.
See the sections below on the :ref:`egg_info <egg_info>` and
:ref:`alias <alias>` commands for more ideas.

Distributing Extensions compiled with Cython
--------------------------------------------

``setuptools`` will detect at build time whether Cython is installed or not.
If Cython is not found ``setuptools`` will ignore pyx files.

To ensure Cython is available, include Cython in the build-requires section
of your pyproject.toml::

    [build-system]
    requires=[..., "cython"]

Built with pip 10 or later, that declaration is sufficient to include Cython
in the build. For broader compatibility, declare the dependency in your
setup-requires of setup.cfg::

    [options]
    setup_requires =
        ...
        cython

As long as Cython is present in the build environment, ``setuptools`` includes
transparent support for building Cython extensions, as
long as extensions are defined using ``setuptools.Extension``.

If you follow these rules, you can safely list ``.pyx`` files as the source
of your ``Extension`` objects in the setup script.  If it is, then ``setuptools``
will use it.

Of course, for this to work, your source distributions must include the C
code generated by Cython, as well as your original ``.pyx`` files.  This means
that you will probably want to include current ``.c`` files in your revision
control system, rebuilding them whenever you check changes in for the ``.pyx``
source files.  This will ensure that people tracking your project in a revision
control system will be able to build it even if they don't have Cython
installed, and that your source releases will be similarly usable with or
without Cython.


.. _Specifying Your Project's Version:

Specifying Your Project's Version
---------------------------------

Setuptools can work well with most versioning schemes. Over the years,
setuptools has tried to closely follow the 
`PEP 440 <https://www.python.org/dev/peps/pep-0440/>`_ scheme, but it
also supports legacy versions. There are, however, a
few special things to watch out for, in order to ensure that setuptools and
other tools can always tell what version of your package is newer than another
version.  Knowing these things will also help you correctly specify what
versions of other projects your project depends on.

A version consists of an alternating series of release numbers and pre-release
or post-release tags.  A release number is a series of digits punctuated by
dots, such as ``2.4`` or ``0.5``.  Each series of digits is treated
numerically, so releases ``2.1`` and ``2.1.0`` are different ways to spell the
same release number, denoting the first subrelease of release 2.  But  ``2.10``
is the *tenth* subrelease of release 2, and so is a different and newer release
from ``2.1`` or ``2.1.0``.  Leading zeros within a series of digits are also
ignored, so ``2.01`` is the same as ``2.1``, and different from ``2.0.1``.

Following a release number, you can have either a pre-release or post-release
tag.  Pre-release tags make a version be considered *older* than the version
they are appended to.  So, revision ``2.4`` is *newer* than revision ``2.4c1``,
which in turn is newer than ``2.4b1`` or ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4-1`` are newer than ``2.4``, but *older*
than ``2.4.1`` (which has a higher release number).

In the case of legacy versions (for example, ``2.4pl1``), they are considered
older than non-legacy versions. Taking that in count, a revision ``2.4pl1``
is *older* than ``2.4``

A pre-release tag is a series of letters that are alphabetically before
"final".  Some examples of prerelease tags would include ``alpha``, ``beta``,
``a``, ``c``, ``dev``, and so on.  You do not have to place a dot or dash
before the prerelease tag if it's immediately after a number, but it's okay to
do so if you prefer.  Thus, ``2.4c1`` and ``2.4.c1`` and ``2.4-c1`` all
represent release candidate 1 of version ``2.4``, and are treated as identical
by setuptools.

In addition, there are three special prerelease tags that are treated as if
they were the letter ``c``: ``pre``, ``preview``, and ``rc``.  So, version
``2.4rc1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4c1``, and are treated as identical by setuptools.

A post-release tag is either a series of letters that are alphabetically
greater than or equal to "final", or a dash (``-``).  Post-release tags are
generally used to separate patch numbers, port numbers, build numbers, revision
numbers, or date stamps from the release number.  For example, the version
``2.4-r1263`` might denote Subversion revision 1263 of a post-release patch of
version ``2.4``.  Or you might use ``2.4-20051127`` to denote a date-stamped
post-release.

Notice that after each pre or post-release tag, you are free to place another
release number, followed again by more pre- or post-release tags.  For example,
``0.6a9.dev-r41475`` could denote Subversion revision 41475 of the in-
development version of the ninth alpha of release 0.6.  Notice that ``dev`` is
a pre-release tag, so this version is a *lower* version number than ``0.6a9``,
which would be the actual ninth alpha of release 0.6.  But the ``-r41475`` is
a post-release tag, so this version is *newer* than ``0.6a9.dev``.

For the most part, setuptools' interpretation of version numbers is intuitive,
but here are a few tips that will keep you out of trouble in the corner cases:

* Don't stick adjoining pre-release tags together without a dot or number
  between them.  Version ``1.9adev`` is the ``adev`` prerelease of ``1.9``,
  *not* a development pre-release of ``1.9a``.  Use ``.dev`` instead, as in
  ``1.9a.dev``, or separate the prerelease tags with a number, as in
  ``1.9a0dev``.  ``1.9a.dev``, ``1.9a0dev``, and even ``1.9.a.dev`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer.

* If you want to be certain that your chosen numbering scheme works the way
  you think it will, you can use the ``pkg_resources.parse_version()`` function
  to compare different version numbers::

    >>> from pkg_resources import parse_version
    >>> parse_version("1.9.a.dev") == parse_version("1.9a0dev")
    True
    >>> parse_version("2.1-rc2") < parse_version("2.1")
    True
    >>> parse_version("0.6a9dev-r41475") < parse_version("0.6a9")
    True

Once you've decided on a version numbering scheme for your project, you can
have setuptools automatically tag your in-development releases with various
pre- or post-release tags.  See the following sections for more details:

* `Tagging and "Daily Build" or "Snapshot" Releases`_
* The :ref:`egg_info <egg_info>` command
doc/alt-python38-setuptools/userguide/entry_point.rst000064400000012211151732726220017106 0ustar00.. _`entry_points`:

============
Entry Points
============

Packages may provide commands to be run at the console (console scripts),
such as the ``pip`` command. These commands are defined for a package
as a specific kind of entry point in the ``setup.cfg`` or
``setup.py``.


Console Scripts
===============

First consider an example without entry points. Imagine a package
defined thus:

.. code-block:: bash

    timmins/
        timmins/__init__.py
        timmins/__main__.py
        setup.cfg # or setup.py
        #other necessary files

with ``__init__.py`` as:

.. code-block:: python

    def hello_world():
        print("Hello world")

and ``__main__.py`` providing a hook:

.. code-block:: python

    from . import hello_world

    if __name__ == '__main__':
        hello_world()

After installing the package, the function may be invoked through the
`runpy <https://docs.python.org/3/library/runpy.html>`_ module:

.. code-block:: bash

    python -m timmins

Adding a console script entry point allows the package to define a
user-friendly name for installers of the package to execute. Installers
like pip will create wrapper scripts to execute a function. In the
above example, to create a command ``hello-world`` that invokes
``timmins.hello_world``, add a console script entry point to
``setup.cfg``:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        hello-world = timmins:hello_world

After installing the package, a user may invoke that function by simply calling
``hello-world`` on the command line.

The syntax for entry points is specified as follows:

.. code-block:: ini

    <name> = [<package>.[<subpackage>.]]<module>[:<object>.<object>]

where ``name`` is the name for the script you want to create, the left hand
side of ``:`` is the module that contains your function and the right hand
side is the object you want to invoke (e.g. a function).

In addition to ``console_scripts``, Setuptools supports ``gui_scripts``, which
will launch a GUI application without running in a terminal window.


.. _dynamic discovery of services and plugins:

Advertising Behavior
====================

Console scripts are one use of the more general concept of entry points. Entry
points more generally allow a packager to advertise behavior for discovery by
other libraries and applications. This feature enables "plug-in"-like
functionality, where one library solicits entry points and any number of other
libraries provide those entry points.

A good example of this plug-in behavior can be seen in
`pytest plugins <https://docs.pytest.org/en/latest/writing_plugins.html>`_,
where pytest is a test framework that allows other libraries to extend
or modify its functionality through the ``pytest11`` entry point.

The console scripts work similarly, where libraries advertise their commands
and tools like ``pip`` create wrapper scripts that invoke those commands.

For a project wishing to solicit entry points, Setuptools recommends the
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_
module (part of stdlib since Python 3.8) or its backport,
`importlib_metadata <https://pypi.org/project/importlib_metadata>`_.

For example, to find the console script entry points from the example above:

.. code-block:: pycon

    >>> from importlib import metadata
    >>> eps = metadata.entry_points()['console_scripts']

``eps`` is now a list of ``EntryPoint`` objects, one of which corresponds
to the ``hello-world = timmins:hello_world`` defined above. Each ``EntryPoint``
contains the ``name``, ``group``, and ``value``. It also supplies a ``.load()``
method to import and load that entry point (module or object).

.. code-block:: ini

    [options.entry_points]
    my.plugins =
        hello-world = timmins:hello_world

Then, a different project wishing to load 'my.plugins' plugins could run
the following routine to load (and invoke) such plugins:

.. code-block:: pycon

    >>> from importlib import metadata
    >>> eps = metadata.entry_points()['my.plugins']
    >>> for ep in eps:
    ...     plugin = ep.load()
    ...     plugin()
    ...

The project soliciting the entry points needs not to have any dependency
or prior knowledge about the libraries implementing the entry points, and
downstream users are able to compose functionality by pulling together
libraries implementing the entry points.


Dependency Management
=====================

Some entry points may require additional dependencies to properly function.
For such an entry point, declare in square brackets any number of dependency
``extras`` following the entry point definition. Such entry points will only
be viable if their extras were declared and installed. See the
:doc:`guide on dependencies management <dependency_management>` for
more information on defining extra requirements. Consider from the
above example:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        hello-world = timmins:hello_world [pretty-printer]

In this case, the ``hello-world`` script is only viable if the ``pretty-printer``
extra is indicated, and so a plugin host might exclude that entry point
(i.e. not install a console script) if the relevant extra dependencies are not
installed.
doc/alt-python38-setuptools/userguide/functionalities_rewrite.rst000064400000000526151732726220021503 0ustar00========================================================
Using setuptools to package and distribute your project
========================================================

``setuptools`` offers a variety of functionalities that make it easy to
build and distribute your python package. Here we provide an overview on
the commonly used ones.


doc/alt-python38-setuptools/userguide/commands.rst000064400000065360151732726220016352 0ustar00-----------------
Command Reference
-----------------

.. _alias:

``alias`` - Define shortcuts for commonly used commands
=======================================================

Sometimes, you need to use the same commands over and over, but you can't
necessarily set them as defaults.  For example, if you produce both development
snapshot releases and "stable" releases of a project, you may want to put
the distributions in different places, or use different ``egg_info`` tagging
options, etc.  In these cases, it doesn't make sense to set the options in
a distutils configuration file, because the values of the options changed based
on what you're trying to do.

Setuptools therefore allows you to define "aliases" - shortcut names for
an arbitrary string of commands and options, using ``setup.py alias aliasname
expansion``, where aliasname is the name of the new alias, and the remainder of
the command line supplies its expansion.  For example, this command defines
a sitewide alias called "daily", that sets various ``egg_info`` tagging
options::

    setup.py alias --global-config daily egg_info --tag-build=development

Once the alias is defined, it can then be used with other setup commands,
e.g.::

    setup.py daily bdist_egg        # generate a daily-build .egg file
    setup.py daily sdist            # generate a daily-build source distro
    setup.py daily sdist bdist_egg  # generate both

The above commands are interpreted as if the word ``daily`` were replaced with
``egg_info --tag-build=development``.

Note that setuptools will expand each alias *at most once* in a given command
line.  This serves two purposes.  First, if you accidentally create an alias
loop, it will have no effect; you'll instead get an error message about an
unknown command.  Second, it allows you to define an alias for a command, that
uses that command.  For example, this (project-local) alias::

    setup.py alias bdist_egg bdist_egg rotate -k1 -m.egg

redefines the ``bdist_egg`` command so that it always runs the ``rotate``
command afterwards to delete all but the newest egg file.  It doesn't loop
indefinitely on ``bdist_egg`` because the alias is only expanded once when
used.

You can remove a defined alias with the ``--remove`` (or ``-r``) option, e.g.::

    setup.py alias --global-config --remove daily

would delete the "daily" alias we defined above.

Aliases can be defined on a project-specific, per-user, or sitewide basis.  The
default is to define or remove a project-specific alias, but you can use any of
the `configuration file options`_ (listed under the `saveopts`_ command, below)
to determine which distutils configuration file an aliases will be added to
(or removed from).

Note that if you omit the "expansion" argument to the ``alias`` command,
you'll get output showing that alias' current definition (and what
configuration file it's defined in).  If you omit the alias name as well,
you'll get a listing of all current aliases along with their configuration
file locations.


``bdist_egg`` - Create a Python Egg for the project
===================================================

.. warning::
    **eggs** are deprecated in favor of wheels, and not supported by pip.

This command generates a Python Egg (``.egg`` file) for the project.  Python
Eggs are the preferred binary distribution format for EasyInstall, because they
are cross-platform (for "pure" packages), directly importable, and contain
project metadata including scripts and information about the project's
dependencies.  They can be simply downloaded and added to ``sys.path``
directly, or they can be placed in a directory on ``sys.path`` and then
automatically discovered by the egg runtime system.

This command runs the `egg_info`_ command (if it hasn't already run) to update
the project's metadata (``.egg-info``) directory.  If you have added any extra
metadata files to the ``.egg-info`` directory, those files will be included in
the new egg file's metadata directory, for use by the egg runtime system or by
any applications or frameworks that use that metadata.

You won't usually need to specify any special options for this command; just
use ``bdist_egg`` and you're done.  But there are a few options that may
be occasionally useful:

``--dist-dir=DIR, -d DIR``
    Set the directory where the ``.egg`` file will be placed.  If you don't
    supply this, then the ``--dist-dir`` setting of the ``bdist`` command
    will be used, which is usually a directory named ``dist`` in the project
    directory.

``--plat-name=PLATFORM, -p PLATFORM``
    Set the platform name string that will be embedded in the egg's filename
    (assuming the egg contains C extensions).  This can be used to override
    the distutils default platform name with something more meaningful.  Keep
    in mind, however, that the egg runtime system expects to see eggs with
    distutils platform names, so it may ignore or reject eggs with non-standard
    platform names.  Similarly, the EasyInstall program may ignore them when
    searching web pages for download links.  However, if you are
    cross-compiling or doing some other unusual things, you might find a use
    for this option.

``--exclude-source-files``
    Don't include any modules' ``.py`` files in the egg, just compiled Python,
    C, and data files.  (Note that this doesn't affect any ``.py`` files in the
    EGG-INFO directory or its subdirectories, since for example there may be
    scripts with a ``.py`` extension which must still be retained.)  We don't
    recommend that you use this option except for packages that are being
    bundled for proprietary end-user applications, or for "embedded" scenarios
    where space is at an absolute premium.  On the other hand, if your package
    is going to be installed and used in compressed form, you might as well
    exclude the source because Python's ``traceback`` module doesn't currently
    understand how to display zipped source code anyway, or how to deal with
    files that are in a different place from where their code was compiled.

There are also some options you will probably never need, but which are there
because they were copied from similar ``bdist`` commands used as an example for
creating this one.  They may be useful for testing and debugging, however,
which is why we kept them:

``--keep-temp, -k``
    Keep the contents of the ``--bdist-dir`` tree around after creating the
    ``.egg`` file.

``--bdist-dir=DIR, -b DIR``
    Set the temporary directory for creating the distribution.  The entire
    contents of this directory are zipped to create the ``.egg`` file, after
    running various installation commands to copy the package's modules, data,
    and extensions here.

``--skip-build``
    Skip doing any "build" commands; just go straight to the
    install-and-compress phases.


.. _develop:

``develop`` - Deploy the project source in "Development Mode"
=============================================================

This command allows you to deploy your project's source for use in one or more
"staging areas" where it will be available for importing.  This deployment is
done in such a way that changes to the project source are immediately available
in the staging area(s), without needing to run a build or install step after
each change.

The ``develop`` command works by creating an ``.egg-link`` file (named for the
project) in the given staging area.  If the staging area is Python's
``site-packages`` directory, it also updates an ``easy-install.pth`` file so
that the project is on ``sys.path`` by default for all programs run using that
Python installation.

The ``develop`` command also installs wrapper scripts in the staging area (or
a separate directory, as specified) that will ensure the project's dependencies
are available on ``sys.path`` before running the project's source scripts.
And, it ensures that any missing project dependencies are available in the
staging area, by downloading and installing them if necessary.

Last, but not least, the ``develop`` command invokes the ``build_ext -i``
command to ensure any C extensions in the project have been built and are
up-to-date, and the ``egg_info`` command to ensure the project's metadata is
updated (so that the runtime and wrappers know what the project's dependencies
are).  If you make any changes to the project's setup script or C extensions,
you should rerun the ``develop`` command against all relevant staging areas to
keep the project's scripts, metadata and extensions up-to-date.  Most other
kinds of changes to your project should not require any build operations or
rerunning ``develop``, but keep in mind that even minor changes to the setup
script (e.g. changing an entry point definition) require you to re-run the
``develop`` or ``test`` commands to keep the distribution updated.

Here are some of the options that the ``develop`` command accepts.  Note that
they affect the project's dependencies as well as the project itself, so if you
have dependencies that need to be installed and you use ``--exclude-scripts``
(for example), the dependencies' scripts will not be installed either!  For
this reason, you may want to use pip to install the project's dependencies
before using the ``develop`` command, if you need finer control over the
installation options for dependencies.

``--uninstall, -u``
    Un-deploy the current project.  You may use the ``--install-dir`` or ``-d``
    option to designate the staging area.  The created ``.egg-link`` file will
    be removed, if present and it is still pointing to the project directory.
    The project directory will be removed from ``easy-install.pth`` if the
    staging area is Python's ``site-packages`` directory.

    Note that this option currently does *not* uninstall script wrappers!  You
    must uninstall them yourself, or overwrite them by using pip to install a
    different version of the package.  You can also avoid installing script
    wrappers in the first place, if you use the ``--exclude-scripts`` (aka
    ``-x``) option when you run ``develop`` to deploy the project.

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``develop`` from
    adding an ``easy-install.pth`` entry for the project(s) being deployed, and
    if an entry for any version of a project already exists, the entry will be
    removed upon successful deployment.  In multi-version mode, no specific
    version of the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``, or you are running
    a wrapper script generated by ``setuptools``.  (In which case the wrapper
    script calls ``require()`` for you.)

    Note that if you install to a directory other than ``site-packages``,
    this option is automatically in effect, because ``.pth`` files can only be
    used in ``site-packages`` (at least in Python 2.3 and 2.4). So, if you use
    the ``--install-dir`` or ``-d`` option (or they are set via configuration
    file(s)) your project and its dependencies will be deployed in multi-
    version mode.

``--install-dir=DIR, -d DIR``
    Set the installation directory (staging area).  If this option is not
    directly specified on the command line or in a distutils configuration
    file, the distutils default installation location is used.  Normally, this
    will be the ``site-packages`` directory, but if you are using distutils
    configuration files, setting things like ``prefix`` or ``install_lib``,
    then those settings are taken into account when computing the default
    staging area.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't deploy script wrappers.  This is useful if you don't want to disturb
    existing versions of the scripts in the staging area.

``--always-copy, -a``
    Copy all needed distributions to the staging area, even if they
    are already present in another directory on ``sys.path``.  By default, if
    a requirement can be met using a distribution that is already available in
    a directory on ``sys.path``, it will not be copied to the staging area.

``--egg-path=DIR``
    Force the generated ``.egg-link`` file to use a specified relative path
    to the source directory.  This can be useful in circumstances where your
    installation directory is being shared by code running under multiple
    platforms (e.g. Mac and Windows) which have different absolute locations
    for the code under development, but the same *relative* locations with
    respect to the installation directory.  If you use this option when
    installing, you must supply the same relative path when uninstalling.

In addition to the above options, the ``develop`` command also accepts all of
the same options accepted by ``easy_install``.  If you've configured any
``easy_install`` settings in your ``setup.cfg`` (or other distutils config
files), the ``develop`` command will use them as defaults, unless you override
them in a ``[develop]`` section or on the command line.


.. _egg_info:

``egg_info`` - Create egg metadata and set build tags
=====================================================

This command performs two operations: it updates a project's ``.egg-info``
metadata directory (used by the ``bdist_egg``, ``develop``, and ``test``
commands), and it allows you to temporarily change a project's version string,
to support "daily builds" or "snapshot" releases.  It is run automatically by
the ``sdist``, ``bdist_egg``, ``develop``, and ``test`` commands in order to
update the project's metadata, but you can also specify it explicitly in order
to temporarily change the project's version string while executing other
commands.  (It also generates the ``.egg-info/SOURCES.txt`` manifest file, which
is used when you are building source distributions.)

In addition to writing the core egg metadata defined by ``setuptools`` and
required by ``pkg_resources``, this command can be extended to write other
metadata files as well, by defining entry points in the ``egg_info.writers``
group.  See the section on :ref:`Adding new EGG-INFO Files` below for more details.
Note that using additional metadata writers may require you to include a
``setup_requires`` argument to ``setup()`` in order to ensure that the desired
writers are available on ``sys.path``.


Release Tagging Options
-----------------------

The following options can be used to modify the project's version string for
all remaining commands on the setup command line.  The options are processed
in the order shown, so if you use more than one, the requested tags will be
added in the following order:

``--tag-build=NAME, -b NAME``
    Append NAME to the project's version string.  Due to the way setuptools
    processes "pre-release" version suffixes beginning with the letters "a"
    through "e" (like "alpha", "beta", and "candidate"), you will usually want
    to use a tag like ".build" or ".dev", as this will cause the version number
    to be considered *lower* than the project's default version.  (If you
    want to make the version number *higher* than the default version, you can
    always leave off --tag-build and then use one or both of the following
    options.)

    If you have a default build tag set in your ``setup.cfg``, you can suppress
    it on the command line using ``-b ""`` or ``--tag-build=""`` as an argument
    to the ``egg_info`` command.

``--tag-date, -d``
    Add a date stamp of the form "-YYYYMMDD" (e.g. "-20050528") to the
    project's version number.

``--no-date, -D``
    Don't include a date stamp in the version number.  This option is included
    so you can override a default setting in ``setup.cfg``.


(Note: Because these options modify the version number used for source and
binary distributions of your project, you should first make sure that you know
how the resulting version numbers will be interpreted by automated tools
like pip.  See the section above on :ref:`Specifying Your Project's Version` for an
explanation of pre- and post-release tags, as well as tips on how to choose and
verify a versioning scheme for your project.)

For advanced uses, there is one other option that can be set, to change the
location of the project's ``.egg-info`` directory.  Commands that need to find
the project's source directory or metadata should get it from this setting:


Other ``egg_info`` Options
--------------------------

``--egg-base=SOURCEDIR, -e SOURCEDIR``
    Specify the directory that should contain the .egg-info directory.  This
    should normally be the root of your project's source tree (which is not
    necessarily the same as your project directory; some projects use a ``src``
    or ``lib`` subdirectory as the source root).  You should not normally need
    to specify this directory, as it is normally determined from the
    ``package_dir`` argument to the ``setup()`` function, if any.  If there is
    no ``package_dir`` set, this option defaults to the current directory.


``egg_info`` Examples
---------------------

Creating a dated "nightly build" snapshot egg::

    setup.py egg_info --tag-date --tag-build=DEV bdist_egg

Creating a release with no version tags, even if some default tags are
specified in ``setup.cfg``::

    setup.py egg_info -RDb "" sdist bdist_egg

(Notice that ``egg_info`` must always appear on the command line *before* any
commands that you want the version changes to apply to.)

.. _rotate:

``rotate`` - Delete outdated distribution files
===============================================

As you develop new versions of your project, your distribution (``dist``)
directory will gradually fill up with older source and/or binary distribution
files.  The ``rotate`` command lets you automatically clean these up, keeping
only the N most-recently modified files matching a given pattern.

``--match=PATTERNLIST, -m PATTERNLIST``
    Comma-separated list of glob patterns to match.  This option is *required*.
    The project name and ``-*`` is prepended to the supplied patterns, in order
    to match only distributions belonging to the current project (in case you
    have a shared distribution directory for multiple projects).  Typically,
    you will use a glob pattern like ``.zip`` or ``.egg`` to match files of
    the specified type.  Note that each supplied pattern is treated as a
    distinct group of files for purposes of selecting files to delete.

``--keep=COUNT, -k COUNT``
    Number of matching distributions to keep.  For each group of files
    identified by a pattern specified with the ``--match`` option, delete all
    but the COUNT most-recently-modified files in that group.  This option is
    *required*.

``--dist-dir=DIR, -d DIR``
    Directory where the distributions are.  This defaults to the value of the
    ``bdist`` command's ``--dist-dir`` option, which will usually be the
    project's ``dist`` subdirectory.

**Example 1**: Delete all .tar.gz files from the distribution directory, except
for the 3 most recently modified ones::

    setup.py rotate --match=.tar.gz --keep=3

**Example 2**: Delete all Python 2.3 or Python 2.4 eggs from the distribution
directory, except the most recently modified one for each Python version::

    setup.py rotate --match=-py2.3*.egg,-py2.4*.egg --keep=1


.. _saveopts:

``saveopts`` - Save used options to a configuration file
========================================================

Finding and editing ``distutils`` configuration files can be a pain, especially
since you also have to translate the configuration options from command-line
form to the proper configuration file format.  You can avoid these hassles by
using the ``saveopts`` command.  Just add it to the command line to save the
options you used.  For example, this command builds the project using
the ``mingw32`` C compiler, then saves the --compiler setting as the default
for future builds (even those run implicitly by the ``install`` command)::

    setup.py build --compiler=mingw32 saveopts

The ``saveopts`` command saves all options for every command specified on the
command line to the project's local ``setup.cfg`` file, unless you use one of
the `configuration file options`_ to change where the options are saved.  For
example, this command does the same as above, but saves the compiler setting
to the site-wide (global) distutils configuration::

    setup.py build --compiler=mingw32 saveopts -g

Note that it doesn't matter where you place the ``saveopts`` command on the
command line; it will still save all the options specified for all commands.
For example, this is another valid way to spell the last example::

    setup.py saveopts -g build --compiler=mingw32

Note, however, that all of the commands specified are always run, regardless of
where ``saveopts`` is placed on the command line.


Configuration File Options
--------------------------

Normally, settings such as options and aliases are saved to the project's
local ``setup.cfg`` file.  But you can override this and save them to the
global or per-user configuration files, or to a manually-specified filename.

``--global-config, -g``
    Save settings to the global ``distutils.cfg`` file inside the ``distutils``
    package directory.  You must have write access to that directory to use
    this option.  You also can't combine this option with ``-u`` or ``-f``.

``--user-config, -u``
    Save settings to the current user's ``~/.pydistutils.cfg`` (POSIX) or
    ``$HOME/pydistutils.cfg`` (Windows) file.  You can't combine this option
    with ``-g`` or ``-f``.

``--filename=FILENAME, -f FILENAME``
    Save settings to the specified configuration file to use.  You can't
    combine this option with ``-g`` or ``-u``.  Note that if you specify a
    non-standard filename, the ``distutils`` and ``setuptools`` will not
    use the file's contents.  This option is mainly included for use in
    testing.

These options are used by other ``setuptools`` commands that modify
configuration files, such as the `alias`_ and `setopt`_ commands.


.. _setopt:

``setopt`` - Set a distutils or setuptools option in a config file
==================================================================

This command is mainly for use by scripts, but it can also be used as a quick
and dirty way to change a distutils configuration option without having to
remember what file the options are in and then open an editor.

**Example 1**.  Set the default C compiler to ``mingw32`` (using long option
names)::

    setup.py setopt --command=build --option=compiler --set-value=mingw32

**Example 2**.  Remove any setting for the distutils default package
installation directory (short option names)::

    setup.py setopt -c install -o install_lib -r


Options for the ``setopt`` command:

``--command=COMMAND, -c COMMAND``
    Command to set the option for.  This option is required.

``--option=OPTION, -o OPTION``
    The name of the option to set.  This option is required.

``--set-value=VALUE, -s VALUE``
    The value to set the option to.  Not needed if ``-r`` or ``--remove`` is
    set.

``--remove, -r``
    Remove (unset) the option, instead of setting it.

In addition to the above options, you may use any of the `configuration file
options`_ (listed under the `saveopts`_ command, above) to determine which
distutils configuration file the option will be added to (or removed from).


.. _test:

``test`` - Build package and run a unittest suite
=================================================

.. warning::
    ``test`` is deprecated and will be removed in a future version. Users
    looking for a generic test entry point independent of test runner are
    encouraged to use `tox <https://tox.readthedocs.io>`_.

When doing test-driven development, or running automated builds that need
testing before they are deployed for downloading or use, it's often useful
to be able to run a project's unit tests without actually deploying the project
anywhere, even using the ``develop`` command.  The ``test`` command runs a
project's unit tests without actually deploying it, by temporarily putting the
project's source on ``sys.path``, after first running ``build_ext -i`` and
``egg_info`` to ensure that any C extensions and project metadata are
up-to-date.

To use this command, your project's tests must be wrapped in a ``unittest``
test suite by either a function, a ``TestCase`` class or method, or a module
or package containing ``TestCase`` classes.  If the named suite is a module,
and the module has an ``additional_tests()`` function, it is called and the
result (which must be a ``unittest.TestSuite``) is added to the tests to be
run.  If the named suite is a package, any submodules and subpackages are
recursively added to the overall test suite.  (Note: if your project specifies
a ``test_loader``, the rules for processing the chosen ``test_suite`` may
differ; see the :ref:`test_loader <test_loader>` documentation for more details.)

Note that many test systems including ``doctest`` support wrapping their
non-``unittest`` tests in ``TestSuite`` objects.  So, if you are using a test
package that does not support this, we suggest you encourage its developers to
implement test suite support, as this is a convenient and standard way to
aggregate a collection of tests to be run under a common test harness.

By default, tests will be run in the "verbose" mode of the ``unittest``
package's text test runner, but you can get the "quiet" mode (just dots) if
you supply the ``-q`` or ``--quiet`` option, either as a global option to
the setup script (e.g. ``setup.py -q test``) or as an option for the ``test``
command itself (e.g. ``setup.py test -q``).  There is one other option
available:

``--test-suite=NAME, -s NAME``
    Specify the test suite (or module, class, or method) to be run
    (e.g. ``some_module.test_suite``).  The default for this option can be
    set by giving a ``test_suite`` argument to the ``setup()`` function, e.g.::

        setup(
            # ...
            test_suite="my_package.tests.test_all"
        )

    If you did not set a ``test_suite`` in your ``setup()`` call, and do not
    provide a ``--test-suite`` option, an error will occur.

New in 41.5.0: Deprecated the test command.


.. _upload:

``upload`` - Upload source and/or egg distributions to PyPI
===========================================================

The ``upload`` command was deprecated in version 40.0 and removed in version
42.0. Use `twine <https://pypi.org/p/twine>`_ instead.

For  more information on the current best practices in uploading your packages
to PyPI, see the Python Packaging User Guide's "Packaging Python Projects"
tutorial specifically the section on `uploading the distribution archives
<https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives>`_.
doc/alt-python38-setuptools/userguide/miscellaneous.rst000064400000013047151732726220017407 0ustar00.. _Automatic Resource Extraction:

Automatic Resource Extraction
-----------------------------

If you are using tools that expect your resources to be "real" files, or your
project includes non-extension native libraries or other files that your C
extensions expect to be able to access, you may need to list those files in
the ``eager_resources`` argument to ``setup()``, so that the files will be
extracted together, whenever a C extension in the project is imported.

This is especially important if your project includes shared libraries *other*
than distutils-built C extensions, and those shared libraries use file
extensions other than ``.dll``, ``.so``, or ``.dylib``, which are the
extensions that setuptools 0.6a8 and higher automatically detects as shared
libraries and adds to the ``native_libs.txt`` file for you.  Any shared
libraries whose names do not end with one of those extensions should be listed
as ``eager_resources``, because they need to be present in the filesystem when
he C extensions that link to them are used.

The ``pkg_resources`` runtime for compressed packages will automatically
extract *all* C extensions and ``eager_resources`` at the same time, whenever
*any* C extension or eager resource is requested via the ``resource_filename()``
API.  (C extensions are imported using ``resource_filename()`` internally.)
This ensures that C extensions will see all of the "real" files that they
expect to see.

Note also that you can list directory resource names in ``eager_resources`` as
well, in which case the directory's contents (including subdirectories) will be
extracted whenever any C extension or eager resource is requested.

Please note that if you're not sure whether you need to use this argument, you
don't!  It's really intended to support projects with lots of non-Python
dependencies and as a last resort for crufty projects that can't otherwise
handle being compressed.  If your package is pure Python, Python plus data
files, or Python plus C, you really don't need this.  You've got to be using
either C or an external program that needs "real" files in your project before
there's any possibility of ``eager_resources`` being relevant to your project.

Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata to include in eggs, which they can then access using the
``pkg_resources`` metadata APIs.  Ordinarily, this is done by having plugin
developers include additional files in their ``ProjectName.egg-info``
directory.  However, since it can be tedious to create such files by hand, you
may want to create a distutils extension that will create the necessary files
from arguments to ``setup()``, in much the same way that ``setuptools`` does
for many of the ``setup()`` arguments it adds.  See the section below on
:ref:`Creating ``distutils\`\` Extensions` for more details, especially the
subsection on :ref:`Adding new EGG-INFO Files`.

Setting the ``zip_safe`` flag
-----------------------------

For some use cases (such as bundling as part of a larger application), Python
packages may be run directly from a zip file.
Not all packages, however, are capable of running in compressed form, because
they may expect to be able to access either source code or data files as
normal operating system files.  So, ``setuptools`` can install your project
as a zipfile or a directory, and its default choice is determined by the
project's ``zip_safe`` flag.

You can pass a True or False value for the ``zip_safe`` argument to the
``setup()`` function, or you can omit it.  If you omit it, the ``bdist_egg``
command will analyze your project's contents to see if it can detect any
conditions that would prevent it from working in a zipfile.  It will output
notices to the console about any such conditions that it finds.

Currently, this analysis is extremely conservative: it will consider the
project unsafe if it contains any C extensions or datafiles whatsoever.  This
does *not* mean that the project can't or won't work as a zipfile!  It just
means that the ``bdist_egg`` authors aren't yet comfortable asserting that
the project *will* work.  If the project contains no C or data files, and does
no ``__file__`` or ``__path__`` introspection or source code manipulation, then
there is an extremely solid chance the project will work when installed as a
zipfile.  (And if the project uses ``pkg_resources`` for all its data file
access, then C extensions and other data files shouldn't be a problem at all.
See the :ref:`Accessing Data Files at Runtime` section above for more information.)

However, if ``bdist_egg`` can't be *sure* that your package will work, but
you've checked over all the warnings it issued, and you are either satisfied it
*will* work (or if you want to try it for yourself), then you should set
``zip_safe`` to ``True`` in your ``setup()`` call.  If it turns out that it
doesn't work, you can always change it to ``False``, which will force
``setuptools`` to install your project as a directory rather than as a zipfile.

In the future, as we gain more experience with different packages and become
more satisfied with the robustness of the ``pkg_resources`` runtime, the
"zip safety" analysis may become less conservative.  However, we strongly
recommend that you determine for yourself whether your project functions
correctly when installed as a zipfile, correct any problems if you can, and
then make an explicit declaration of ``True`` or ``False`` for the ``zip_safe``
flag, so that it will not be necessary for ``bdist_egg`` to try to guess
whether your project can work as a zipfile.
doc/alt-python38-setuptools/python 2 sunset.rst000064400000006722151732726220015517 0ustar00:orphan:

Python 2 Sunset
===============

Since January 2020 and the release of Setuptools 45, Python 2 is no longer
supported by the most current release (`discussion
<https://github.com/pypa/setuptools/issues/1458>`_). Setuptools as a project
continues to support Python 2 with bugfixes and important features on
Setuptools 44.x.

By design, most users will be unaffected by this change. That's because
Setuptools 45 declares its supported Python versions to exclude Python 2.7,
and installers such as pip 9 or later will honor this declaration and prevent
installation of Setuptools 45 or later in Python 2 environments.

Users that do import any portion of Setuptools 45 or later on Python 2 are
directed to this documentation to provide guidance on how to work around the
issues.

Workarounds
-----------

The best recommendation is to avoid Python 2 and move to Python 3 where
possible. This project acknowledges that not all environments can drop Python
2 support, so provides other options.

In less common scenarios, later versions of Setuptools can be installed on
unsupported Python versions. In these environments, the installer is advised
to first install ``setuptools<45`` to "pin Setuptools" to a compatible
version.

- When using older versions of pip (before 9.0), the ``Requires-Python``
  directive is not honored and invalid versions can be installed. Users are
  advised first to upgrade pip and retry or to pin Setuptools. Use ``pip
  --version`` to determine the version of pip.
- When using ``easy_install``, ``Requires-Python`` is not honored and later
  versions can be installed. In this case, users are advised to pin
  Setuptools. This applies to ``setup.py install`` invocations as well, as
  they use Setuptools under the hood.

It's still not working
----------------------

If after trying the above steps, the Python environment still has incompatible
versions of Setuptools installed, here are some things to try.

1. Uninstall and reinstall Setuptools. Run ``pip uninstall -y setuptools`` for
   the relevant environment. Repeat until there is no Setuptools installed.
   Then ``pip install setuptools``.
2. If possible, attempt to replicate the problem in a second environment
   (virtual machine, friend's computer, etc). If the issue is isolated to just
   one unique environment, first determine what is different about those
   environments (or reinstall/reset the failing one to defaults).
3. End users who are not themselves the maintainers for the package they are
   trying to install should contact the support channels for the relevant
   application. Please be considerate of those projects by searching for
   existing issues and following the latest guidance before reaching out for
   support. When filing an issue, be sure to give as much detail as possible
   to help the maintainers understand what factors led to the issue after
   following their recommended guidance.
4. Reach out to your local support groups. There's a good chance someone
   nearby has the expertise and willingness to help.
5. If all else fails, `file this template
   <https://github.com/pypa/setuptools/issues/new?assignees=&labels=Python+2&template=setuptools-warns-about-python-2-incompatibility.md&title=Incompatible+install+in+(summarize+your+environment)>`_
   with Setuptools. Please complete the whole template, providing as much
   detail about what factors led to the issue. Setuptools maintainers will
   summarily close tickets filed without any meaningful detail or engagement
   with the issue.
doc/alt-python38-setuptools/conf.py000064400000013120151732726230013306 0ustar00extensions = ['sphinx.ext.autodoc', 'jaraco.packaging.sphinx', 'rst.linker']

master_doc = "index"

link_files = {
    '../CHANGES.rst': dict(
        using=dict(
            BB='https://bitbucket.org',
            GH='https://github.com',
        ),
        replace=[
            dict(
                pattern=r'(Issue )?#(?P<issue>\d+)',
                url='{package_url}/issues/{issue}',
            ),
            dict(
                pattern=r'BB Pull Request ?#(?P<bb_pull_request>\d+)',
                url='{BB}/pypa/setuptools/pull-request/{bb_pull_request}',
            ),
            dict(
                pattern=r'Distribute #(?P<distribute>\d+)',
                url='{BB}/tarek/distribute/issue/{distribute}',
            ),
            dict(
                pattern=r'Buildout #(?P<buildout>\d+)',
                url='{GH}/buildout/buildout/issues/{buildout}',
            ),
            dict(
                pattern=r'Old Setuptools #(?P<old_setuptools>\d+)',
                url='http://bugs.python.org/setuptools/issue{old_setuptools}',
            ),
            dict(
                pattern=r'Jython #(?P<jython>\d+)',
                url='http://bugs.jython.org/issue{jython}',
            ),
            dict(
                pattern=r'(Python #|bpo-)(?P<python>\d+)',
                url='http://bugs.python.org/issue{python}',
            ),
            dict(
                pattern=r'Interop #(?P<interop>\d+)',
                url='{GH}/pypa/interoperability-peps/issues/{interop}',
            ),
            dict(
                pattern=r'Pip #(?P<pip>\d+)',
                url='{GH}/pypa/pip/issues/{pip}',
            ),
            dict(
                pattern=r'Packaging #(?P<packaging>\d+)',
                url='{GH}/pypa/packaging/issues/{packaging}',
            ),
            dict(
                pattern=r'[Pp]ackaging (?P<packaging_ver>\d+(\.\d+)+)',
                url='{GH}/pypa/packaging/blob/{packaging_ver}/CHANGELOG.rst',
            ),
            dict(
                pattern=r'PEP[- ](?P<pep_number>\d+)',
                url='https://www.python.org/dev/peps/pep-{pep_number:0>4}/',
            ),
            dict(
                pattern=r'setuptools_svn #(?P<setuptools_svn>\d+)',
                url='{GH}/jaraco/setuptools_svn/issues/{setuptools_svn}',
            ),
            dict(
                pattern=r'pypa/distutils#(?P<distutils>\d+)',
                url='{GH}/pypa/distutils/issues/{distutils}',
            ),
            dict(
                pattern=r'^(?m)((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n',
                with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n',
            ),
        ],
    ),
}

# Be strict about any broken references:
nitpicky = True

intersphinx_mapping = {
    'pypa-build': ('https://pypa-build.readthedocs.io/en/latest/', None)
}

# Add support for linking usernames
github_url = 'https://github.com'
github_sponsors_url = f'{github_url}/sponsors'
extlinks = {
    'user': (f'{github_sponsors_url}/%s', '@'),  # noqa: WPS323
}
extensions += ['sphinx.ext.extlinks', 'sphinx.ext.intersphinx']

# Ref: https://github.com/python-attrs/attrs/pull/571/files\
#      #diff-85987f48f1258d9ee486e3191495582dR82
default_role = 'any'

# HTML theme
html_theme = 'furo'

# Add support for inline tabs
extensions += ['sphinx_inline_tabs']

# Support for distutils

# Ref: https://stackoverflow.com/a/30624034/595220
nitpick_ignore = [
    ('c:func', 'SHGetSpecialFolderPath'),  # ref to MS docs
    ('envvar', 'DISTUTILS_DEBUG'),  # undocumented
    ('envvar', 'HOME'),  # undocumented
    ('envvar', 'PLAT'),  # undocumented
    ('py:attr', 'CCompiler.language_map'),  # undocumented
    ('py:attr', 'CCompiler.language_order'),  # undocumented
    ('py:class', 'distutils.dist.Distribution'),  # undocumented
    ('py:class', 'distutils.extension.Extension'),  # undocumented
    ('py:class', 'BorlandCCompiler'),  # undocumented
    ('py:class', 'CCompiler'),  # undocumented
    ('py:class', 'CygwinCCompiler'),  # undocumented
    ('py:class', 'distutils.dist.DistributionMetadata'),  # undocumented
    ('py:class', 'FileList'),  # undocumented
    ('py:class', 'IShellLink'),  # ref to MS docs
    ('py:class', 'MSVCCompiler'),  # undocumented
    ('py:class', 'OptionDummy'),  # undocumented
    ('py:class', 'UnixCCompiler'),  # undocumented
    ('py:exc', 'CompileError'),  # undocumented
    ('py:exc', 'DistutilsExecError'),  # undocumented
    ('py:exc', 'DistutilsFileError'),  # undocumented
    ('py:exc', 'LibError'),  # undocumented
    ('py:exc', 'LinkError'),  # undocumented
    ('py:exc', 'PreprocessError'),  # undocumented
    ('py:func', 'distutils.CCompiler.new_compiler'),  # undocumented
    # undocumented:
    ('py:func', 'distutils.dist.DistributionMetadata.read_pkg_file'),
    ('py:func', 'distutils.file_util._copy_file_contents'),  # undocumented
    ('py:func', 'distutils.log.debug'),  # undocumented
    ('py:func', 'distutils.spawn.find_executable'),  # undocumented
    ('py:func', 'distutils.spawn.spawn'),  # undocumented
    # TODO: check https://docutils.rtfd.io in the future
    ('py:mod', 'docutils'),  # there's no Sphinx site documenting this
]

# Allow linking objects on other Sphinx sites seamlessly:
intersphinx_mapping.update(
    python=('https://docs.python.org/3', None),
    python2=('https://docs.python.org/2', None),
)

# Add support for the unreleased "next-version" change notes
extensions += ['sphinxcontrib.towncrier']
# Extension needs a path from here to the towncrier config.
towncrier_draft_working_directory = '..'
# Avoid an empty section for unpublished changes.
towncrier_draft_include_empty = False

extensions += ['jaraco.tidelift']
doc/alt-python38-setuptools/roadmap.rst000064400000000241151732726230014164 0ustar00=======
Roadmap
=======

Setuptools maintains a series of `milestones
<https://github.com/pypa/setuptools/milestones>`_ to track
a roadmap of large-scale goals.
doc/alt-python38-setuptools/history.rst000064400000003560151732726230014251 0ustar00:tocdepth: 2

.. _changes:

History
*******

.. towncrier-draft-entries:: DRAFT, unreleased as on |today|

.. include:: ../CHANGES (links).rst

Credits
*******

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
  version of ``pkg_resources``, and supplied the macOS operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories. Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application. In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Tarek Ziadé is the principal author of the Distribute fork, which
  re-invigorated the community on the project, encouraged renewed innovation,
  and addressed many defects.

* Jason R. Coombs performed the merge with Distribute, maintaining the
  project for several years in coordination with the Python Packaging
  Authority (PyPA).
doc/alt-python38-setuptools/development/index.rst000064400000002657151732726230016207 0ustar00-------------------------
Development on Setuptools
-------------------------

Setuptools is maintained by the Python community under the Python Packaging
Authority (PyPA) and led by Jason R. Coombs.

This document describes the process by which Setuptools is developed.
This document assumes the reader has some passing familiarity with
*using* setuptools, the ``pkg_resources`` module, and pip.  It
does not attempt to explain basic concepts like inter-project
dependencies, nor does it contain detailed lexical syntax for most
file formats.  Neither does it explain concepts like "namespace
packages" or "resources" in any detail, as all of these subjects are
covered at length in the setuptools developer's guide and the
``pkg_resources`` reference manual.

Instead, this is **internal** documentation for how those concepts and
features are *implemented* in concrete terms.  It is intended for people
who are working on the setuptools code base, who want to be able to
troubleshoot setuptools problems, want to write code that reads the file
formats involved, or want to otherwise tinker with setuptools-generated
files and directories.

Note, however, that these are all internal implementation details and
are therefore subject to change; stick to the published API if you don't
want to be responsible for keeping your code from breaking when
setuptools changes.  You have been warned.

.. toctree::
   :maxdepth: 1

   developer-guide
   releases
doc/alt-python38-setuptools/development/releases.rst000064400000002615151732726230016675 0ustar00===============
Release Process
===============

In order to allow for rapid, predictable releases, Setuptools uses a
mechanical technique for releases, enacted on tagged commits by
continuous integration.

To finalize a release, run ``tox -e finalize``, review, then push
the changes.

If tests pass, the release will be uploaded to PyPI.

Release Frequency
-----------------

Some have asked why Setuptools is released so frequently. Because Setuptools
uses a mechanical release process, it's very easy to make releases whenever the
code is stable (tests are passing). As a result, the philosophy is to release
early and often.

While some find the frequent releases somewhat surprising, they only empower
the user. Although releases are made frequently, users can choose the frequency
at which they use those releases. If instead Setuptools contributions were only
released in batches, the user would be constrained to only use Setuptools when
those official releases were made. With frequent releases, the user can govern
exactly how often he wishes to update.

Frequent releases also then obviate the need for dev or beta releases in most
cases. Because releases are made early and often, bugs are discovered and
corrected quickly, in many cases before other users have yet to encounter them.

Release Managers
----------------

Additionally, anyone with push access to the master branch has access to cut
releases.
doc/alt-python38-setuptools/development/developer-guide.rst000064400000010632151732726230020150 0ustar00================================
Developer's Guide for Setuptools
================================

If you want to know more about contributing on Setuptools, this is the place.


-------------------
Recommended Reading
-------------------

Please read `How to write the perfect pull request
<https://blog.jaraco.com/how-to-write-perfect-pull-request/>`_ for some tips
on contributing to open source projects. Although the article is not
authoritative, it was authored by the maintainer of Setuptools, so reflects
his opinions and will improve the likelihood of acceptance and quality of
contribution.

------------------
Project Management
------------------

Setuptools is maintained primarily in GitHub at `this home
<https://github.com/pypa/setuptools>`_. Setuptools is maintained under the
Python Packaging Authority (PyPA) with several core contributors. All bugs
for Setuptools are filed and the canonical source is maintained in GitHub.

User support and discussions are done through the issue tracker (for specific)
issues, through the `distutils-sig mailing list <https://mail.python.org/mailman3/lists/distutils-sig.python.org/>`_, or on IRC (Freenode) at
#pypa.

Discussions about development happen on the distutils-sig mailing list or on
`Gitter <https://gitter.im/pypa/setuptools>`_.

-----------------
Authoring Tickets
-----------------

Before authoring any source code, it's often prudent to file a ticket
describing the motivation behind making changes. First search to see if a
ticket already exists for your issue. If not, create one. Try to think from
the perspective of the reader. Explain what behavior you expected, what you
got instead, and what factors might have contributed to the unexpected
behavior. In GitHub, surround a block of code or traceback with the triple
backtick "\`\`\`" so that it is formatted nicely.

Filing a ticket provides a forum for justification, discussion, and
clarification. The ticket provides a record of the purpose for the change and
any hard decisions that were made. It provides a single place for others to
reference when trying to understand why the software operates the way it does
or why certain changes were made.

Setuptools makes extensive use of hyperlinks to tickets in the changelog so
that system integrators and other users can get a quick summary, but then
jump to the in-depth discussion about any subject referenced.

---------------------
Making a pull request
---------------------

When making a pull request, please
:ref:`include a short summary of the changes <Adding change notes
with your PRs>` and a reference to any issue tickets that the PR is
intended to solve.
All PRs with code changes should include tests. All changes should
include a changelog entry.

.. include:: ../../changelog.d/README.rst

-------------------
Auto-Merge Requests
-------------------

To support running all code through CI, even lightweight contributions,
the project employs Mergify to auto-merge pull requests tagged as
auto-merge.

Use ``hub pull-request -l auto-merge`` to create such a pull request
from the command line after pushing a new branch.

-------
Testing
-------

The primary tests are run using tox.  Make sure you have tox installed,
and invoke it::

    $ tox

Under continuous integration, additional tests may be run. See the
``.travis.yml`` file for full details on the tests run under Travis-CI.

-------------------
Semantic Versioning
-------------------

Setuptools follows ``semver``.

.. explain value of reflecting meaning in versions.

----------------------
Building Documentation
----------------------

Setuptools relies on the `Sphinx`_ system for building documentation.
The `published documentation`_ is hosted on Read the Docs.

To build the docs locally, use tox::

    $ tox -e docs

.. _Sphinx: http://www.sphinx-doc.org/en/master/
.. _published documentation: https://setuptools.readthedocs.io/en/latest/

---------------------
Vendored Dependencies
---------------------

Setuptools has some dependencies, but due to `bootstrapping issues
<https://github.com/pypa/setuptools/issues/980>`_, those dependencies
cannot be declared as they won't be resolved soon enough to build
setuptools from source. Eventually, this limitation may be lifted as
PEP 517/518 reach ubiquitous adoption, but for now, Setuptools
cannot declare dependencies other than through
``setuptools/_vendor/vendored.txt`` and
``pkg_resources/_vendor/vendored.txt`` and refreshed by way of
``paver update_vendored`` (pavement.py).
doc/alt-python38-pip/README.rst000064400000005710151732726230012053 0ustar00pip - The Python Package Installer
==================================

.. image:: https://img.shields.io/pypi/v/pip.svg
   :target: https://pypi.org/project/pip/

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest

pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.

Please take a look at our documentation for how to install and use pip:

* `Installation`_
* `Usage`_

We release updates regularly, with a new version every 3 months. Find more details in our documentation:

* `Release notes`_
* `Release process`_

In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.

**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

Code of Conduct
---------------

Everyone interacting in the pip project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installation/
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
doc/alt-python38-urllib3/LICENSE.txt000064400000002133151732726230012767 0ustar00MIT License

Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)

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

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

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

1.26.6 (2021-06-25)
-------------------

* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support
  it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.
  If you are a user of this module please leave a comment.
* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple
  ``Transfer-Encoding`` headers in the case that one is already specified.
* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.


1.26.5 (2021-05-26)
-------------------

* Fixed deprecation warnings emitted in Python 3.10.
* Updated vendored ``six`` library to 1.16.0.
* Improved performance of URL parser when splitting
  the authority component.


1.26.4 (2021-03-15)
-------------------

* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.


1.26.3 (2021-01-26)
-------------------

* Fixed bytes and string comparison issue with headers (Pull #2141)

* Changed ``ProxySchemeUnknown`` error message to be
  more actionable if the user supplies a proxy URL without
  a scheme. (Pull #2107)


1.26.2 (2020-11-12)
-------------------

* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't
  be imported properly on Python 2.7.8 and earlier (Pull #2052)


1.26.1 (2020-11-11)
-------------------

* Fixed an issue where two ``User-Agent`` headers would be sent if a
  ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)


1.26.0 (2020-11-10)
-------------------

* **NOTE: urllib3 v2.0 will drop support for Python 2**.
  `Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>`_.

* Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)

* Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that
  still wish to use TLS earlier than 1.2 without a deprecation warning
  should opt-in explicitly by setting ``ssl_version=ssl.PROTOCOL_TLSv1_1`` (Pull #2002)
  **Starting in urllib3 v2.0: Connections that receive a ``DeprecationWarning`` will fail**

* Deprecated ``Retry`` options ``Retry.DEFAULT_METHOD_WHITELIST``, ``Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST``
  and ``Retry(method_whitelist=...)`` in favor of ``Retry.DEFAULT_ALLOWED_METHODS``,
  ``Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT``, and ``Retry(allowed_methods=...)``
  (Pull #2000) **Starting in urllib3 v2.0: Deprecated options will be removed**

* Added default ``User-Agent`` header to every request (Pull #1750)

* Added ``urllib3.util.SKIP_HEADER`` for skipping ``User-Agent``, ``Accept-Encoding``, 
  and ``Host`` headers from being automatically emitted with requests (Pull #2018)

* Collapse ``transfer-encoding: chunked`` request data and framing into
  the same ``socket.send()`` call (Pull #1906)

* Send ``http/1.1`` ALPN identifier with every TLS handshake by default (Pull #1894)

* Properly terminate SecureTransport connections when CA verification fails (Pull #1977)

* Don't emit an ``SNIMissingWarning`` when passing ``server_hostname=None``
  to SecureTransport (Pull #1903)

* Disabled requesting TLSv1.2 session tickets as they weren't being used by urllib3 (Pull #1970)

* Suppress ``BrokenPipeError`` when writing request body after the server
  has closed the socket (Pull #1524)

* Wrap ``ssl.SSLError`` that can be raised from reading a socket (e.g. "bad MAC")
  into an ``urllib3.exceptions.SSLError`` (Pull #1939)


1.25.11 (2020-10-19)
--------------------

* Fix retry backoff time parsed from ``Retry-After`` header when given
  in the HTTP date format. The HTTP date was parsed as the local timezone
  rather than accounting for the timezone in the HTTP date (typically
  UTC) (Pull #1932, Pull #1935, Pull #1938, Pull #1949)

* Fix issue where an error would be raised when the ``SSLKEYLOGFILE``
  environment variable was set to the empty string. Now ``SSLContext.keylog_file``
  is not set in this situation (Pull #2016)


1.25.10 (2020-07-22)
--------------------

* Added support for ``SSLKEYLOGFILE`` environment variable for
  logging TLS session keys with use with programs like
  Wireshark for decrypting captured web traffic (Pull #1867)

* Fixed loading of SecureTransport libraries on macOS Big Sur
  due to the new dynamic linker cache (Pull #1905)

* Collapse chunked request bodies data and framing into one
  call to ``send()`` to reduce the number of TCP packets by 2-4x (Pull #1906)

* Don't insert ``None`` into ``ConnectionPool`` if the pool
  was empty when requesting a connection (Pull #1866)

* Avoid ``hasattr`` call in ``BrotliDecoder.decompress()`` (Pull #1858)


1.25.9 (2020-04-16)
-------------------

* Added ``InvalidProxyConfigurationWarning`` which is raised when
  erroneously specifying an HTTPS proxy URL. urllib3 doesn't currently
  support connecting to HTTPS proxies but will soon be able to
  and we would like users to migrate properly without much breakage.

  See `this GitHub issue <https://github.com/urllib3/urllib3/issues/1850>`_
  for more information on how to fix your proxy config. (Pull #1851)

* Drain connection after ``PoolManager`` redirect (Pull #1817)

* Ensure ``load_verify_locations`` raises ``SSLError`` for all backends (Pull #1812)

* Rename ``VerifiedHTTPSConnection`` to ``HTTPSConnection`` (Pull #1805)

* Allow the CA certificate data to be passed as a string (Pull #1804)

* Raise ``ValueError`` if method contains control characters (Pull #1800)

* Add ``__repr__`` to ``Timeout`` (Pull #1795)


1.25.8 (2020-01-20)
-------------------

* Drop support for EOL Python 3.4 (Pull #1774)

* Optimize _encode_invalid_chars (Pull #1787)


1.25.7 (2019-11-11)
-------------------

* Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734)

* Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470)

* Fix issue where URL fragment was sent within the request target. (Pull #1732)

* Fix issue where an empty query section in a URL would fail to parse. (Pull #1732)

* Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703)


1.25.6 (2019-09-24)
-------------------

* Fix issue where tilde (``~``) characters were incorrectly
  percent-encoded in the path. (Pull #1692)


1.25.5 (2019-09-19)
-------------------

* Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which
  caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``.
  (Issue #1682)


1.25.4 (2019-09-19)
-------------------

* Propagate Retry-After header settings to subsequent retries. (Pull #1607)

* Fix edge case where Retry-After header was still respected even when
  explicitly opted out of. (Pull #1607)

* Remove dependency on ``rfc3986`` for URL parsing.

* Fix issue where URLs containing invalid characters within ``Url.auth`` would
  raise an exception instead of percent-encoding those characters.

* Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses
  work well with BufferedReaders and other ``io`` module features. (Pull #1652)

* Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673)


1.25.3 (2019-05-23)
-------------------

* Change ``HTTPSConnection`` to load system CA certificates
  when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are
  unspecified. (Pull #1608, Issue #1603)

* Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605)


1.25.2 (2019-04-28)
-------------------

* Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583)

* Change ``parse_url`` to percent-encode invalid characters within the
  path, query, and target components. (Pull #1586)


1.25.1 (2019-04-24)
-------------------

* Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579)

* Upgrade bundled rfc3986 to v1.3.1 (Pull #1578)


1.25 (2019-04-22)
-----------------

* Require and validate certificates by default when using HTTPS (Pull #1507)

* Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487)

* Added support for ``key_password`` for ``HTTPSConnectionPool`` to use
  encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489)

* Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``
  implementations. (Pull #1496)

* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, Pull #1492)

* Fixed issue where OpenSSL would block if an encrypted client private key was
  given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)

* Added support for Brotli content encoding. It is enabled automatically if
  ``brotlipy`` package is installed which can be requested with
  ``urllib3[brotli]`` extra. (Pull #1532)

* Drop ciphers using DSS key exchange from default TLS cipher suites.
  Improve default ciphers when using SecureTransport. (Pull #1496)

* Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483)

1.24.3 (2019-05-01)
-------------------

* Apply fix for CVE-2019-9740. (Pull #1591)

1.24.2 (2019-04-17)
-------------------

* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or
  ``ssl_context`` parameters are specified.

* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510)

* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269)


1.24.1 (2018-11-02)
-------------------

* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467)

* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462)


1.24 (2018-10-16)
-----------------

* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)

* Test against Python 3.7 on AppVeyor. (Pull #1453)

* Early-out ipv6 checks when running on App Engine. (Pull #1450)

* Change ambiguous description of backoff_factor (Pull #1436)

* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)

* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).

* Add a server_hostname parameter to HTTPSConnection which allows for
  overriding the SNI hostname sent in the handshake. (Pull #1397)

* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)

* Fixed bug where responses with header Content-Type: message/* erroneously
  raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)

* Move urllib3 to src/urllib3 (Pull #1409)


1.23 (2018-06-04)
-----------------

* Allow providing a list of headers to strip from requests when redirecting
  to a different host. Defaults to the ``Authorization`` header. Different
  headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)

* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).

* Dropped Python 3.3 support. (Pull #1242)

* Put the connection back in the pool when calling stream() or read_chunked() on
  a chunked HEAD response. (Issue #1234)

* Fixed pyOpenSSL-specific ssl client authentication issue when clients
  attempted to auth via certificate + chain (Issue #1060)

* Add the port to the connectionpool connect print (Pull #1251)

* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)

* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)

* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)

* Added support for auth info in url for SOCKS proxy (Pull #1363)


1.22 (2017-07-20)
-----------------

* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via
  IPv6 proxy. (Issue #1222)

* Made the connection pool retry on ``SSLError``.  The original ``SSLError``
  is available on ``MaxRetryError.reason``. (Issue #1112)

* Drain and release connection before recursing on retry/redirect.  Fixes
  deadlocks with a blocking connectionpool. (Issue #1167)

* Fixed compatibility for cookiejar. (Issue #1229)

* pyopenssl: Use vendored version of ``six``. (Issue #1231)


1.21.1 (2017-05-02)
-------------------

* Fixed SecureTransport issue that would cause long delays in response body
  delivery. (Pull #1154)

* Fixed regression in 1.21 that threw exceptions when users passed the
  ``socket_options`` flag to the ``PoolManager``.  (Issue #1165)

* Fixed regression in 1.21 that threw exceptions when users passed the
  ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.
  (Pull #1157)


1.21 (2017-04-25)
-----------------

* Improved performance of certain selector system calls on Python 3.5 and
  later. (Pull #1095)

* Resolved issue where the PyOpenSSL backend would not wrap SysCallError
  exceptions appropriately when sending data. (Pull #1125)

* Selectors now detects a monkey-patched select module after import for modules
  that patch the select module like eventlet, greenlet. (Pull #1128)

* Reduced memory consumption when streaming zlib-compressed responses
  (as opposed to raw deflate streams). (Pull #1129)

* Connection pools now use the entire request context when constructing the
  pool key. (Pull #1016)

* ``PoolManager.connection_from_*`` methods now accept a new keyword argument,
  ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.
  (Pull #1016)

* Add retry counter for ``status_forcelist``. (Issue #1147)

* Added ``contrib`` module for using SecureTransport on macOS:
  ``urllib3.contrib.securetransport``.  (Pull #1122)

* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:
  for schemes it does not recognise, it assumes they are case-sensitive and
  leaves them unchanged.
  (Issue #1080)


1.20 (2017-01-19)
-----------------

* Added support for waiting for I/O using selectors other than select,
  improving urllib3's behaviour with large numbers of concurrent connections.
  (Pull #1001)

* Updated the date for the system clock check. (Issue #1005)

* ConnectionPools now correctly consider hostnames to be case-insensitive.
  (Issue #1032)

* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module
  to fail when it is injected, rather than at first use. (Pull #1063)

* Outdated versions of cryptography now cause the PyOpenSSL contrib module
  to fail when it is injected, rather than at first use. (Issue #1044)

* Automatically attempt to rewind a file-like body object when a request is
  retried or redirected. (Pull #1039)

* Fix some bugs that occur when modules incautiously patch the queue module.
  (Pull #1061)

* Prevent retries from occurring on read timeouts for which the request method
  was not in the method whitelist. (Issue #1059)

* Changed the PyOpenSSL contrib module to lazily load idna to avoid
  unnecessarily bloating the memory of programs that don't need it. (Pull
  #1076)

* Add support for IPv6 literals with zone identifiers. (Pull #1013)

* Added support for socks5h:// and socks4a:// schemes when working with SOCKS
  proxies, and controlled remote DNS appropriately. (Issue #1035)


1.19.1 (2016-11-16)
-------------------

* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)


1.19 (2016-11-03)
-----------------

* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when
  using the default retry logic. (Pull #955)

* Remove markers from setup.py to assist ancient setuptools versions. (Issue
  #986)

* Disallow superscripts and other integerish things in URL ports. (Issue #989)

* Allow urllib3's HTTPResponse.stream() method to continue to work with
  non-httplib underlying FPs. (Pull #990)

* Empty filenames in multipart headers are now emitted as such, rather than
  being suppressed. (Issue #1015)

* Prefer user-supplied Host headers on chunked uploads. (Issue #1009)


1.18.1 (2016-10-27)
-------------------

* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with
  PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This
  release fixes a vulnerability whereby urllib3 in the above configuration
  would silently fail to validate TLS certificates due to erroneously setting
  invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous
  flags do not cause a problem in OpenSSL versions before 1.1.0, which
  interprets the presence of any flag as requesting certificate validation.

  There is no PR for this patch, as it was prepared for simultaneous disclosure
  and release. The master branch received the same fix in Pull #1010.


1.18 (2016-09-26)
-----------------

* Fixed incorrect message for IncompleteRead exception. (Pull #973)

* Accept ``iPAddress`` subject alternative name fields in TLS certificates.
  (Issue #258)

* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.
  (Issue #977)

* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)


1.17 (2016-09-06)
-----------------

* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)

* ConnectionPool debug log now includes scheme, host, and port. (Issue #897)

* Substantially refactored documentation. (Issue #887)

* Used URLFetch default timeout on AppEngine, rather than hardcoding our own.
  (Issue #858)

* Normalize the scheme and host in the URL parser (Issue #833)

* ``HTTPResponse`` contains the last ``Retry`` object, which now also
  contains retries history. (Issue #848)

* Timeout can no longer be set as boolean, and must be greater than zero.
  (Pull #924)

* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
  now use cryptography and idna, both of which are already dependencies of
  PyOpenSSL. (Pull #930)

* Fixed infinite loop in ``stream`` when amt=None. (Issue #928)

* Try to use the operating system's certificates when we are using an
  ``SSLContext``. (Pull #941)

* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
  ChaCha20, but ChaCha20 is then preferred to everything else. (Pull #947)

* Updated cipher suite list to remove 3DES-based cipher suites. (Pull #958)

* Removed the cipher suite fallback to allow HIGH ciphers. (Pull #958)

* Implemented ``length_remaining`` to determine remaining content
  to be read. (Pull #949)

* Implemented ``enforce_content_length`` to enable exceptions when
  incomplete data chunks are received. (Pull #949)

* Dropped connection start, dropped connection reset, redirect, forced retry,
  and new HTTPS connection log levels to DEBUG, from INFO. (Pull #967)


1.16 (2016-06-11)
-----------------

* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)

* Provide ``key_fn_by_scheme`` pool keying mechanism that can be
  overridden. (Issue #830)

* Normalize scheme and host to lowercase for pool keys, and include
  ``source_address``. (Issue #830)

* Cleaner exception chain in Python 3 for ``_make_request``.
  (Issue #861)

* Fixed installing ``urllib3[socks]`` extra. (Issue #864)

* Fixed signature of ``ConnectionPool.close`` so it can actually safely be
  called by subclasses. (Issue #873)

* Retain ``release_conn`` state across retries. (Issues #651, #866)

* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to
  ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)


1.15.1 (2016-04-11)
-------------------

* Fix packaging to include backports module. (Issue #841)


1.15 (2016-04-06)
-----------------

* Added Retry(raise_on_status=False). (Issue #720)

* Always use setuptools, no more distutils fallback. (Issue #785)

* Dropped support for Python 3.2. (Issue #786)

* Chunked transfer encoding when requesting with ``chunked=True``.
  (Issue #790)

* Fixed regression with IPv6 port parsing. (Issue #801)

* Append SNIMissingWarning messages to allow users to specify it in
  the PYTHONWARNINGS environment variable. (Issue #816)

* Handle unicode headers in Py2. (Issue #818)

* Log certificate when there is a hostname mismatch. (Issue #820)

* Preserve order of request/response headers. (Issue #821)


1.14 (2015-12-29)
-----------------

* contrib: SOCKS proxy support! (Issue #762)

* Fixed AppEngine handling of transfer-encoding header and bug
  in Timeout defaults checking. (Issue #763)


1.13.1 (2015-12-18)
-------------------

* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)


1.13 (2015-12-14)
-----------------

* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)

* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)

* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)

* Close connections more defensively on exception. (Issue #734)

* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without
  repeatedly flushing the decoder, to function better on Jython. (Issue #743)

* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)


1.12 (2015-09-03)
-----------------

* Rely on ``six`` for importing ``httplib`` to work around
  conflicts with other Python 3 shims. (Issue #688)

* Add support for directories of certificate authorities, as supported by
  OpenSSL. (Issue #701)

* New exception: ``NewConnectionError``, raised when we fail to establish
  a new connection, usually ``ECONNREFUSED`` socket error.


1.11 (2015-07-21)
-----------------

* When ``ca_certs`` is given, ``cert_reqs`` defaults to
  ``'CERT_REQUIRED'``. (Issue #650)

* ``pip install urllib3[secure]`` will install Certifi and
  PyOpenSSL as dependencies. (Issue #678)

* Made ``HTTPHeaderDict`` usable as a ``headers`` input value
  (Issues #632, #679)

* Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_
  which has an ``AppEngineManager`` for using ``URLFetch`` in a
  Google AppEngine environment. (Issue #664)

* Dev: Added test suite for AppEngine. (Issue #631)

* Fix performance regression when using PyOpenSSL. (Issue #626)

* Passing incorrect scheme (e.g. ``foo://``) will raise
  ``ValueError`` instead of ``AssertionError`` (backwards
  compatible for now, but please migrate). (Issue #640)

* Fix pools not getting replenished when an error occurs during a
  request using ``release_conn=False``. (Issue #644)

* Fix pool-default headers not applying for url-encoded requests
  like GET. (Issue #657)

* log.warning in Python 3 when headers are skipped due to parsing
  errors. (Issue #642)

* Close and discard connections if an error occurs during read.
  (Issue #660)

* Fix host parsing for IPv6 proxies. (Issue #668)

* Separate warning type SubjectAltNameWarning, now issued once
  per host. (Issue #671)

* Fix ``httplib.IncompleteRead`` not getting converted to
  ``ProtocolError`` when using ``HTTPResponse.stream()``
  (Issue #674)

1.10.4 (2015-05-03)
-------------------

* Migrate tests to Tornado 4. (Issue #594)

* Append default warning configuration rather than overwrite.
  (Issue #603)

* Fix streaming decoding regression. (Issue #595)

* Fix chunked requests losing state across keep-alive connections.
  (Issue #599)

* Fix hanging when chunked HEAD response has no body. (Issue #605)


1.10.3 (2015-04-21)
-------------------

* Emit ``InsecurePlatformWarning`` when SSLContext object is missing.
  (Issue #558)

* Fix regression of duplicate header keys being discarded.
  (Issue #563)

* ``Response.stream()`` returns a generator for chunked responses.
  (Issue #560)

* Set upper-bound timeout when waiting for a socket in PyOpenSSL.
  (Issue #585)

* Work on platforms without `ssl` module for plain HTTP requests.
  (Issue #587)

* Stop relying on the stdlib's default cipher list. (Issue #588)


1.10.2 (2015-02-25)
-------------------

* Fix file descriptor leakage on retries. (Issue #548)

* Removed RC4 from default cipher list. (Issue #551)

* Header performance improvements. (Issue #544)

* Fix PoolManager not obeying redirect retry settings. (Issue #553)


1.10.1 (2015-02-10)
-------------------

* Pools can be used as context managers. (Issue #545)

* Don't re-use connections which experienced an SSLError. (Issue #529)

* Don't fail when gzip decoding an empty stream. (Issue #535)

* Add sha256 support for fingerprint verification. (Issue #540)

* Fixed handling of header values containing commas. (Issue #533)


1.10 (2014-12-14)
-----------------

* Disabled SSLv3. (Issue #473)

* Add ``Url.url`` property to return the composed url string. (Issue #394)

* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)

* ``MaxRetryError.reason`` will always be an exception, not string.
  (Issue #481)

* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492)

* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473)

* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.
  (Issue #496)

* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.
  (Issue #499)

* Close and discard sockets which experienced SSL-related errors.
  (Issue #501)

* Handle ``body`` param in ``.request(...)``. (Issue #513)

* Respect timeout with HTTPS proxy. (Issue #505)

* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)


1.9.1 (2014-09-13)
------------------

* Apply socket arguments before binding. (Issue #427)

* More careful checks if fp-like object is closed. (Issue #435)

* Fixed packaging issues of some development-related files not
  getting included. (Issue #440)

* Allow performing *only* fingerprint verification. (Issue #444)

* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)

* Fixed PyOpenSSL compatibility with PyPy. (Issue #450)

* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.
  (Issue #443)



1.9 (2014-07-04)
----------------

* Shuffled around development-related files. If you're maintaining a distro
  package of urllib3, you may need to tweak things. (Issue #415)

* Unverified HTTPS requests will trigger a warning on the first request. See
  our new `security documentation
  <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.
  (Issue #426)

* New retry logic and ``urllib3.util.retry.Retry`` configuration object.
  (Issue #326)

* All raised exceptions should now wrapped in a
  ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326)

* All errors during a retry-enabled request should be wrapped in
  ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions
  which were previously exempt. Underlying error is accessible from the
  ``.reason`` property. (Issue #326)

* ``urllib3.exceptions.ConnectionError`` renamed to
  ``urllib3.exceptions.ProtocolError``. (Issue #326)

* Errors during response read (such as IncompleteRead) are now wrapped in
  ``urllib3.exceptions.ProtocolError``. (Issue #418)

* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``.
  (Issue #417)

* Catch read timeouts over SSL connections as
  ``urllib3.exceptions.ReadTimeoutError``. (Issue #419)

* Apply socket arguments before connecting. (Issue #427)


1.8.3 (2014-06-23)
------------------

* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)

* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)

* Wrap ``socket.timeout`` exception with
  ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)

* Fixed proxy-related bug where connections were being reused incorrectly.
  (Issues #366, #369)

* Added ``socket_options`` keyword parameter which allows to define
  ``setsockopt`` configuration of new sockets. (Issue #397)

* Removed ``HTTPConnection.tcp_nodelay`` in favor of
  ``HTTPConnection.default_socket_options``. (Issue #397)

* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)


1.8.2 (2014-04-17)
------------------

* Fix ``urllib3.util`` not being included in the package.


1.8.1 (2014-04-17)
------------------

* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)

* Don't install ``dummyserver`` into ``site-packages`` as it's only needed
  for the test suite. (Issue #362)

* Added support for specifying ``source_address``. (Issue #352)


1.8 (2014-03-04)
----------------

* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in
  username, and blank ports like 'hostname:').

* New ``urllib3.connection`` module which contains all the HTTPConnection
  objects.

* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor
  signature to a more sensible order. [Backwards incompatible]
  (Issues #252, #262, #263)

* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)

* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which
  returns the number of bytes read so far. (Issue #277)

* Support for platforms without threading. (Issue #289)

* Expand default-port comparison in ``HTTPConnectionPool.is_same_host``
  to allow a pool with no specified port to be considered equal to to an
  HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305)

* Improved default SSL/TLS settings to avoid vulnerabilities.
  (Issue #309)

* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors.
  (Issue #310)

* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests
  will send the entire HTTP request ~200 milliseconds faster; however, some of
  the resulting TCP packets will be smaller. (Issue #254)

* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl``
  from the default 64 to 1024 in a single certificate. (Issue #318)

* Headers are now passed and stored as a custom
  ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.
  (Issue #329, #333)

* Headers no longer lose their case on Python 3. (Issue #236)

* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA
  certificates on inject. (Issue #332)

* Requests with ``retries=False`` will immediately raise any exceptions without
  wrapping them in ``MaxRetryError``. (Issue #348)

* Fixed open socket leak with SSL-related failures. (Issue #344, #348)


1.7.1 (2013-09-25)
------------------

* Added granular timeout support with new ``urllib3.util.Timeout`` class.
  (Issue #231)

* Fixed Python 3.4 support. (Issue #238)


1.7 (2013-08-14)
----------------

* More exceptions are now pickle-able, with tests. (Issue #174)

* Fixed redirecting with relative URLs in Location header. (Issue #178)

* Support for relative urls in ``Location: ...`` header. (Issue #179)

* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus
  file-like functionality. (Issue #187)

* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will
  skip hostname verification for SSL connections. (Issue #194)

* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a
  generator wrapped around ``.read(...)``. (Issue #198)

* IPv6 url parsing enforces brackets around the hostname. (Issue #199)

* Fixed thread race condition in
  ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)

* ``ProxyManager`` requests now include non-default port in ``Host: ...``
  header. (Issue #217)

* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)

* New ``RequestField`` object can be passed to the ``fields=...`` param which
  can specify headers. (Issue #220)

* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.
  (Issue #221)

* Use international headers when posting file names. (Issue #119)

* Improved IPv6 support. (Issue #203)


1.6 (2013-04-25)
----------------

* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)

* ``ProxyManager`` automatically adds ``Host: ...`` header if not given.

* Improved SSL-related code. ``cert_req`` now optionally takes a string like
  "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23"
  The string values reflect the suffix of the respective constant variable.
  (Issue #130)

* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly
  closed proxy connections and larger read buffers. (Issue #135)

* Ensure the connection is closed if no data is received, fixes connection leak
  on some platforms. (Issue #133)

* Added SNI support for SSL/TLS connections on Py32+. (Issue #89)

* Tests fixed to be compatible with Py26 again. (Issue #125)

* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant
  to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109)

* Allow an explicit content type to be specified when encoding file fields.
  (Issue #126)

* Exceptions are now pickleable, with tests. (Issue #101)

* Fixed default headers not getting passed in some cases. (Issue #99)

* Treat "content-encoding" header value as case-insensitive, per RFC 2616
  Section 3.5. (Issue #110)

* "Connection Refused" SocketErrors will get retried rather than raised.
  (Issue #92)

* Updated vendored ``six``, no longer overrides the global ``six`` module
  namespace. (Issue #113)

* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding
  the exception that prompted the final retry. If ``reason is None`` then it
  was due to a redirect. (Issue #92, #114)

* Fixed ``PoolManager.urlopen()`` from not redirecting more than once.
  (Issue #149)

* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters
  that are not files. (Issue #111)

* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122)

* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or
  against an arbitrary hostname (when connecting by IP or for misconfigured
  servers). (Issue #140)

* Streaming decompression support. (Issue #159)


1.5 (2012-08-02)
----------------

* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug
  logging in urllib3.

* Native full URL parsing (including auth, path, query, fragment) available in
  ``urllib3.util.parse_url(url)``.

* Built-in redirect will switch method to 'GET' if status code is 303.
  (Issue #11)

* ``urllib3.PoolManager`` strips the scheme and host before sending the request
  uri. (Issue #8)

* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding,
  based on the Content-Type header, fails.

* Fixed bug with pool depletion and leaking connections (Issue #76). Added
  explicit connection closing on pool eviction. Added
  ``urllib3.PoolManager.clear()``.

* 99% -> 100% unit test coverage.


1.4 (2012-06-16)
----------------

* Minor AppEngine-related fixes.

* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.

* Improved url parsing. (Issue #73)

* IPv6 url support. (Issue #72)


1.3 (2012-03-25)
----------------

* Removed pre-1.0 deprecated API.

* Refactored helpers into a ``urllib3.util`` submodule.

* Fixed multipart encoding to support list-of-tuples for keys with multiple
  values. (Issue #48)

* Fixed multiple Set-Cookie headers in response not getting merged properly in
  Python 3. (Issue #53)

* AppEngine support with Py27. (Issue #61)

* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs
  bytes.


1.2.2 (2012-02-06)
------------------

* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)


1.2.1 (2012-02-05)
------------------

* Fixed another bug related to when ``ssl`` module is not available. (Issue #41)

* Location parsing errors now raise ``urllib3.exceptions.LocationParseError``
  which inherits from ``ValueError``.


1.2 (2012-01-29)
----------------

* Added Python 3 support (tested on 3.2.2)

* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)

* Use ``select.poll`` instead of ``select.select`` for platforms that support
  it.

* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive
  connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.

* Fixed ``ImportError`` during install when ``ssl`` module is not available.
  (Issue #41)

* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not
  completing properly. (Issue #28, uncovered by Issue #10 in v1.1)

* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +
  ``eventlet``. Removed extraneous unsupported dummyserver testing backends.
  Added socket-level tests.

* More tests. Achievement Unlocked: 99% Coverage.


1.1 (2012-01-07)
----------------

* Refactored ``dummyserver`` to its own root namespace module (used for
  testing).

* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in
  Py32's ``ssl_match_hostname``. (Issue #25)

* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)

* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue
  #27)

* Fixed timeout-related bugs. (Issues #17, #23)


1.0.2 (2011-11-04)
------------------

* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if
  you're using the object manually. (Thanks pyos)

* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by
  wrapping the access log in a mutex. (Thanks @christer)

* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and
  ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.


1.0.1 (2011-10-10)
------------------

* Fixed a bug where the same connection would get returned into the pool twice,
  causing extraneous "HttpConnectionPool is full" log warnings.


1.0 (2011-10-08)
----------------

* Added ``PoolManager`` with LRU expiration of connections (tested and
  documented).
* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works
  with HTTPS proxies).
* Added optional partial-read support for responses when
  ``preload_content=False``. You can now make requests and just read the headers
  without loading the content.
* Made response decoding optional (default on, same as before).
* Added optional explicit boundary string for ``encode_multipart_formdata``.
* Convenience request methods are now inherited from ``RequestMethods``. Old
  helpers like ``get_url`` and ``post_url`` should be abandoned in favour of
  the new ``request(method, url, ...)``.
* Refactored code to be even more decoupled, reusable, and extendable.
* License header added to ``.py`` files.
* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
  and docs in ``docs/`` and on https://urllib3.readthedocs.io/.
* Embettered all the things!
* Started writing this file.


0.4.1 (2011-07-17)
------------------

* Minor bug fixes, code cleanup.


0.4 (2011-03-01)
----------------

* Better unicode support.
* Added ``VerifiedHTTPSConnection``.
* Added ``NTLMConnectionPool`` in contrib.
* Minor improvements.


0.3.1 (2010-07-13)
------------------

* Added ``assert_host_name`` optional parameter. Now compatible with proxies.


0.3 (2009-12-10)
----------------

* Added HTTPS support.
* Minor bug fixes.
* Refactored, broken backwards compatibility with 0.2.
* API to be treated as stable from this version forward.


0.2 (2008-11-17)
----------------

* Added unit tests.
* Bug fixes.


0.1 (2008-11-16)
----------------

* First release.
doc/alt-python38-urllib3/README.rst000064400000010433151732726230012635 0ustar00.. raw:: html

   <p align="center">
      <a href="https://github.com/urllib3/urllib3">
         <img src="./docs/images/banner.svg" width="60%" alt="urllib3" />
      </a>
   </p>
   <p align="center">
      <a href="https://pypi.org/project/urllib3"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400" /></a>
      <a href="https://pypi.org/project/urllib3"><img alt="Python Versions" src="https://img.shields.io/pypi/pyversions/urllib3.svg?maxAge=86400" /></a>
      <a href="https://discord.gg/CHEgCZN"><img alt="Join our Discord" src="https://img.shields.io/discord/756342717725933608?color=%237289da&label=discord" /></a>
      <a href="https://codecov.io/gh/urllib3/urllib3"><img alt="Coverage Status" src="https://img.shields.io/codecov/c/github/urllib3/urllib3.svg" /></a>
      <a href="https://github.com/urllib3/urllib3/actions?query=workflow%3ACI"><img alt="Build Status on GitHub" src="https://github.com/urllib3/urllib3/workflows/CI/badge.svg" /></a>
      <a href="https://travis-ci.org/urllib3/urllib3"><img alt="Build Status on Travis" src="https://travis-ci.org/urllib3/urllib3.svg?branch=master" /></a>
      <a href="https://urllib3.readthedocs.io"><img alt="Documentation Status" src="https://readthedocs.org/projects/urllib3/badge/?version=latest" /></a>
   </p>

urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the
Python ecosystem already uses urllib3 and you should too.
urllib3 brings many critical features that are missing from the Python
standard libraries:

- Thread safety.
- Connection pooling.
- Client-side SSL/TLS verification.
- File uploads with multipart encoding.
- Helpers for retrying requests and dealing with HTTP redirects.
- Support for gzip, deflate, and brotli encoding.
- Proxy support for HTTP and SOCKS.
- 100% test coverage.

urllib3 is powerful and easy to use:

.. code-block:: python

    >>> import urllib3
    >>> http = urllib3.PoolManager()
    >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
    >>> r.status
    200
    >>> r.data
    'User-agent: *\nDisallow: /deny\n'


Installing
----------

urllib3 can be installed with `pip <https://pip.pypa.io>`_::

    $ python -m pip install urllib3

Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::

    $ git clone git://github.com/urllib3/urllib3.git
    $ python setup.py install


Documentation
-------------

urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.


Contributing
------------

urllib3 happily accepts contributions. Please see our
`contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_
for some tips on getting started.


Security Disclosures
--------------------

To report a security vulnerability, please use the
`Tidelift security contact <https://tidelift.com/security>`_.
Tidelift will coordinate the fix and disclosure with maintainers.


Maintainers
-----------

- `@sethmlarson <https://github.com/sethmlarson>`__ (Seth M. Larson)
- `@pquentin <https://github.com/pquentin>`__ (Quentin Pradet)
- `@theacodes <https://github.com/theacodes>`__ (Thea Flowers)
- `@haikuginger <https://github.com/haikuginger>`__ (Jess Shapiro)
- `@lukasa <https://github.com/lukasa>`__ (Cory Benfield)
- `@sigmavirus24 <https://github.com/sigmavirus24>`__ (Ian Stapleton Cordasco)
- `@shazow <https://github.com/shazow>`__ (Andrey Petrov)

👋


Sponsorship
-----------

If your company benefits from this library, please consider `sponsoring its
development <https://urllib3.readthedocs.io/en/latest/sponsors.html>`_.


For Enterprise
--------------

.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
   :width: 75
   :alt: Tidelift

.. list-table::
   :widths: 10 100

   * - |tideliftlogo|
     - Professional support for urllib3 is available as part of the `Tidelift
       Subscription`_.  Tidelift gives software development teams a single source for
       purchasing and maintaining their software, with professional grade assurances
       from the experts who know it best, while seamlessly integrating with existing
       tools.

.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme
doc/alt-python38-six/CHANGES000064400000017771151732726230011404 0ustar00Changelog for six
=================

This file lists the changes in each six version.

1.12.0
------

- Issue #259, pull request #260: `six.add_metaclass` now preserves
  `__qualname__` from the original class.

- Pull request #204: Add `six.ensure_binary`, `six.ensure_text`, and
  `six.ensure_str`.

1.11.0
------

- Pull request #178: `with_metaclass` now properly proxies `__prepare__` to the
  underlying metaclass.

- Pull request #191: Allow `with_metaclass` to work with metaclasses implemented
  in C.

- Pull request #203: Add parse_http_list and parse_keqv_list to moved
  urllib.request.

- Pull request #172 and issue #171: Add unquote_to_bytes to moved urllib.parse.

- Pull request #167: Add `six.moves.getoutput`.

- Pull request #80: Add `six.moves.urllib_parse.splitvalue`.

- Pull request #75: Add `six.moves.email_mime_image`.

- Pull request #72: Avoid creating reference cycles through tracebacks in
  `reraise`.

1.10.0
------

- Issue #122: Improve the performance of `six.int2byte` on Python 3.

- Pull request #55 and issue #99: Don't add the `winreg` module to `six.moves`
  on non-Windows platforms.

- Pull request #60 and issue #108: Add `six.moves.getcwd` and
  `six.moves.getcwdu`.

- Pull request #64: Add `create_unbound_method` to create unbound methods.

1.9.0
-----

- Issue #106: Support the `flush` parameter to `six.print_`.

- Pull request #48 and issue #15: Add the `python_2_unicode_compatible`
  decorator.

- Pull request #57 and issue #50: Add several compatibility methods for unittest
  assertions that were renamed between Python 2 and 3.

- Issue #105 and pull request #58: Ensure `six.wraps` respects the *updated* and
  *assigned* arguments.

- Issue #102: Add `raise_from` to abstract out Python 3's raise from syntax.

- Issue #97: Optimize `six.iterbytes` on Python 2.

- Issue #98: Fix `six.moves` race condition in multi-threaded code.

- Pull request #51: Add `six.view(keys|values|itmes)`, which provide dictionary
  views on Python 2.7+.

- Issue #112: `six.moves.reload_module` now uses the importlib module on
  Python 3.4+.

1.8.0
-----

- Issue #90: Add `six.moves.shlex_quote`.

- Issue #59: Add `six.moves.intern`.

- Add `six.urllib.parse.uses_(fragment|netloc|params|query|relative)`.

- Issue #88: Fix add_metaclass when the class has `__slots__` containing
  `__weakref__` or `__dict__`.

- Issue #89: Make six use absolute imports.

- Issue #85: Always accept *updated* and *assigned* arguments for `wraps()`.

- Issue #86: In `reraise()`, instantiate the exception if the second argument is
  `None`.

- Pull request #45: Add `six.moves.email_mime_nonmultipart`.

- Issue #81: Add `six.urllib.request.splittag` mapping.

- Issue #80: Add `six.urllib.request.splituser` mapping.

1.7.3
-----

- Issue #77: Fix import six on Python 3.4 with a custom loader.

- Issue #74: `six.moves.xmlrpc_server` should map to `SimpleXMLRPCServer` on Python
  2 as documented not `xmlrpclib`.

1.7.2
-----

- Issue #72: Fix installing on Python 2.

1.7.1
-----

- Issue #71: Make the six.moves meta path importer handle reloading of the six
  module gracefully.

1.7.0
-----

- Pull request #30: Implement six.moves with a PEP 302 meta path hook.

- Pull request #32: Add six.wraps, which is like functools.wraps but always sets
  the __wrapped__ attribute.

- Pull request #35: Improve add_metaclass, so that it doesn't end up inserting
  another class into the hierarchy.

- Pull request #34: Add import mappings for dummy_thread.

- Pull request #33: Add import mappings for UserDict and UserList.

- Pull request #31: Select the implementations of dictionary iterator routines
  at import time for a 20% speed boost.

1.6.1
-----

- Raise an AttributeError for six.moves.X when X is a module not available in
  the current interpreter.

1.6.0
-----

- Raise an AttributeError for every attribute of unimportable modules.

- Issue #56: Make the fake modules six.moves puts into sys.modules appear not to
  have a __path__ unless they are loaded.

- Pull request #28: Add support for SplitResult.

- Issue #55: Add move mapping for xmlrpc.server.

- Pull request #29: Add move for urllib.parse.splitquery.

1.5.2
-----

- Issue #53: Make the fake modules six.moves puts into sys.modules appear not to
  have a __name__ unless they are loaded.

1.5.1
-----

- Issue #51: Hack around the Django autoreloader after recent six.moves changes.

1.5.0
-----

- Removed support for Python 2.4. This is because py.test no longer supports
  2.4.

- Fix various import problems including issues #19 and #41. six.moves modules
  are now lazy wrappers over the underlying modules instead of the actual
  modules themselves.

- Issue #49: Add six.moves mapping for tkinter.ttk.

- Pull request #24: Add __dir__ special method to six.moves modules.

- Issue #47: Fix add_metaclass on classes with a string for the __slots__
  variable.

- Issue #44: Fix interpretation of backslashes on Python 2 in the u() function.

- Pull request #21: Add import mapping for urllib's proxy_bypass function.

- Issue #43: Add import mapping for the Python 2 xmlrpclib module.

- Issue #39: Add import mapping for the Python 2 thread module.

- Issue #40: Add import mapping for the Python 2 gdbm module.

- Issue #35: On Python versions less than 2.7, print_ now encodes unicode
  strings when outputing to standard streams. (Python 2.7 handles this
  automatically.)

1.4.1
-----

- Issue #32: urllib module wrappings don't work when six is not a toplevel file.

1.4.0
-----

- Issue #31: Add six.moves mapping for UserString.

- Pull request #12: Add six.add_metaclass, a decorator for adding a metaclass to
  a class.

- Add six.moves.zip_longest and six.moves.filterfalse, which correspond
  respectively to itertools.izip_longest and itertools.ifilterfalse on Python 2
  and itertools.zip_longest and itertools.filterfalse on Python 3.

- Issue #25: Add the unichr function, which returns a string for a Unicode
  codepoint.

- Issue #26: Add byte2int function, which complements int2byte.

- Add a PY2 constant with obvious semantics.

- Add helpers for indexing and iterating over bytes: iterbytes and indexbytes.

- Add create_bound_method() wrapper.

- Issue #23: Allow multiple base classes to be passed to with_metaclass.

- Issue #24: Add six.moves.range alias. This exactly the same as the current
  xrange alias.

- Pull request #5: Create six.moves.urllib, which contains abstractions for a
  bunch of things which are in urllib in Python 3 and spread out across urllib,
  urllib2, and urlparse in Python 2.

1.3.0
-----

- Issue #21: Add methods to access the closure and globals of a function.

- In six.iter(items/keys/values/lists), passed keyword arguments through to the
  underlying method.

- Add six.iterlists().

- Issue #20: Fix tests if tkinter is not available.

- Issue #17: Define callable to be builtin callable when it is available again
  in Python 3.2+.

- Issue #16: Rename Python 2 exec_'s arguments, so casually calling exec_ with
  keyword arguments will raise.

- Issue #14: Put the six.moves package in sys.modules based on the name six is
  imported under.

- Fix Jython detection.

- Pull request #4: Add email_mime_multipart, email_mime_text, and
  email_mime_base to six.moves.

1.2.0
-----

- Issue #13: Make iterkeys/itervalues/iteritems return iterators on Python 3
  instead of iterables.

- Issue #11: Fix maxsize support on Jython.

- Add six.next() as an alias for six.advance_iterator().

- Use the builtin next() function for advance_iterator() where is available
  (2.6+), not just Python 3.

- Add the Iterator class for writing portable iterators.

1.1.0
-----

- Add the int2byte function.

- Add compatibility mappings for iterators over the keys, values, and items of a
  dictionary.

- Fix six.MAXSIZE on platforms where sizeof(long) != sizeof(Py_ssize_t).

- Issue #3: Add six.moves mappings for filter, map, and zip.

1.0.0
-----

- Issue #2: u() on Python 2.x now resolves unicode escapes.

- Expose an API for adding mappings to six.moves.

1.0 beta 1
----------

- Reworked six into one .py file.  This breaks imports.  Please tell me if you
  are interested in an import compatibility layer.
doc/alt-python38-six/PKG-INFO000064400000004237151732726230011477 0ustar00Metadata-Version: 1.2
Name: six
Version: 1.12.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
Description: .. image:: https://img.shields.io/pypi/v/six.svg
           :target: https://pypi.org/project/six/
           :alt: six on PyPI
        
        .. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
           :target: https://travis-ci.org/benjaminp/six
           :alt: six on TravisCI
        
        .. image:: https://readthedocs.org/projects/six/badge/?version=latest
           :target: https://six.readthedocs.io/
           :alt: six's documentation on Read the Docs
        
        .. image:: https://img.shields.io/badge/license-MIT-green.svg
           :target: https://github.com/benjaminp/six/blob/master/LICENSE
           :alt: MIT License badge
        
        Six is a Python 2 and 3 compatibility library.  It provides utility functions
        for smoothing over the differences between the Python versions with the goal of
        writing Python code that is compatible on both Python versions.  See the
        documentation for more information on what is provided.
        
        Six supports every Python version since 2.6.  It is contained in only one Python
        file, so it can be easily copied into your project. (The copyright and license
        notice must be retained.)
        
        Online documentation is at https://six.readthedocs.io/.
        
        Bugs can be reported to https://github.com/benjaminp/six.  The code can also
        be found there.
        
        For questions about six or porting in general, email the python-porting mailing
        list: https://mail.python.org/mailman/listinfo/python-porting
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
Requires-Python: >=2.6, !=3.0.*, !=3.1.*
doc/alt-python38-six/LICENSE000064400000002052151732726230011400 0ustar00Copyright (c) 2010-2018 Benjamin Peterson

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
doc/alt-python38-six/README.rst000064400000002464151732726230012071 0ustar00.. image:: https://img.shields.io/pypi/v/six.svg
   :target: https://pypi.org/project/six/
   :alt: six on PyPI

.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
   :target: https://travis-ci.org/benjaminp/six
   :alt: six on TravisCI

.. image:: https://readthedocs.org/projects/six/badge/?version=latest
   :target: https://six.readthedocs.io/
   :alt: six's documentation on Read the Docs

.. image:: https://img.shields.io/badge/license-MIT-green.svg
   :target: https://github.com/benjaminp/six/blob/master/LICENSE
   :alt: MIT License badge

Six is a Python 2 and 3 compatibility library.  It provides utility functions
for smoothing over the differences between the Python versions with the goal of
writing Python code that is compatible on both Python versions.  See the
documentation for more information on what is provided.

Six supports every Python version since 2.6.  It is contained in only one Python
file, so it can be easily copied into your project. (The copyright and license
notice must be retained.)

Online documentation is at https://six.readthedocs.io/.

Bugs can be reported to https://github.com/benjaminp/six.  The code can also
be found there.

For questions about six or porting in general, email the python-porting mailing
list: https://mail.python.org/mailman/listinfo/python-porting
doc/alt-python38-devel/valgrind-python.supp000064400000021173151732726230014732 0ustar00#
# This is a valgrind suppression file that should be used when using valgrind.
#
#  Here's an example of running valgrind:
#
#	cd python/dist/src
#	valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \
#		./python -E ./Lib/test/regrtest.py -u gui,network
#
# You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER
# to use the preferred suppressions with address_in_range.
#
# If you do not want to recompile Python, you can uncomment
# suppressions for _PyObject_Free and _PyObject_Realloc.
#
# See Misc/README.valgrind for more information.

# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Addr4
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Value4
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
   Memcheck:Value8
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
   Memcheck:Cond
   fun:address_in_range
}

#
# Leaks (including possible leaks)
#    Hmmm, I wonder if this masks some real leaks.  I think it does.
#    Will need to fix that.
#

{
   Suppress leaking the GIL.  Happens once per process, see comment in ceval.c.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_InitThreads
}

{
   Suppress leaking the GIL after a fork.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_ReInitThreads
}

{
   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_create_key
   fun:_PyGILState_Init
   fun:Py_InitializeEx
   fun:Py_Main
}

{
   Hmmm, is this a real leak or like the GIL?
   Memcheck:Leak
   fun:malloc
   fun:PyThread_ReInitTLS
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:realloc
   fun:_PyObject_GC_Resize
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_New
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_NewVar
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

#
# Non-python specific leaks
#

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:memalign
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:_PyObject_Free
###}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:_PyObject_Realloc
###}

###
### All the suppressions below are for errors that occur within libraries
### that Python uses.  The problems to not appear to be related to Python's
### use of the libraries.
###

{
   Generic ubuntu ld problems
   Memcheck:Addr8
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
}

{
   Generic gentoo ld problems
   Memcheck:Cond
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
}

{
   DBM problems, see test_dbm
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_close
}

{
   DBM problems, see test_dbm
   Memcheck:Value8
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   GDBM problems, see test_gdbm
   Memcheck:Param
   write(buf)
   fun:write
   fun:gdbm_open

}

{
   Uninitialised byte(s) false alarm, see bpo-35561
   Memcheck:Param
   epoll_ctl(event)
   fun:epoll_ctl
   fun:pyepoll_internal_ctl
}

{
   ZLIB problems, see test_gzip
   Memcheck:Cond
   obj:/lib/libz.so.1.2.3
   obj:/lib/libz.so.1.2.3
   fun:deflate
}

{
   Avoid problems w/readline doing a putenv and leaking on exit
   Memcheck:Leak
   fun:malloc
   fun:xmalloc
   fun:sh_set_lines_and_columns
   fun:_rl_get_screen_size
   fun:_rl_init_terminal_io
   obj:/lib/libreadline.so.4.3
   fun:rl_initialize
}

# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
# false alarms on GCC builtin strcmp() function. The GCC code is correct.
#
# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
{
   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
   Memcheck:Cond
   fun:PyUnicode_Decode
}


###
### These occur from somewhere within the SSL, when running
###  test_socket_sll.  They are too general to leave on by default.
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:memset
###}
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:memset
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:MD5_Update
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:MD5_Update
###}

# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
# See http://bugs.python.org/issue14171
{
   openssl 1.0.1 prng 1
   Memcheck:Cond
   fun:bcmp
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 2
   Memcheck:Cond
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 3
   Memcheck:Value8
   fun:_x86_64_AES_encrypt_compact
   fun:AES_encrypt
}

#
# All of these problems come from using test_socket_ssl
#
{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_bin2bn
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont
}

{
   from test_socket_ssl
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libcrypto.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_set_key_unchecked
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_encrypt2
}

{
   from test_socket_ssl
   Memcheck:Cond
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Value4
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BUF_MEM_grow_clean
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:memcpy
   fun:ssl3_read_bytes
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:SHA1_Update
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:SHA1_Update
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

{
   wcscmp_false_positive
   Memcheck:Addr8
   fun:wcscmp
   fun:_PyOS_GetOpt
   fun:Py_Main
   fun:main
}

# Additional suppressions for the unified decimal tests:
{
   test_decimal
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_decimal2
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

doc/alt-python38-devel/gdbinit000064400000011543151732726230012237 0ustar00# If you use the GNU debugger gdb to debug the Python C runtime, you
# might find some of the following commands useful.  Copy this to your
# ~/.gdbinit file and it'll get loaded into gdb automatically when you
# start it up.  Then, at the gdb prompt you can do things like:
#
#    (gdb) pyo apyobjectptr
#    <module 'foobar' (built-in)>
#    refcounts: 1
#    address    : 84a7a2c
#    $1 = void
#    (gdb)
#
# NOTE: If you have gdb 7 or later, it supports debugging of Python directly
# with embedded macros that you may find superior to what is in here.
# See Tools/gdb/libpython.py and http://bugs.python.org/issue8032.

define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end
document pyo
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyObject*
end

define pyg
    print _PyGC_Dump($arg0)
end
document pyg
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyGC_Head*
end

define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = f->f_code->co_varnames
	    set $_name = PyUnicode_AsUTF8(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end
document pylocals
  Print the local variables of the current frame.
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

define pyframev
    pyframe
    pylocals
end
document pyframev
  Print the current frame - verbose
end

define pyframe
    set $__fn = PyUnicode_AsUTF8(f->f_code->co_filename)
    set $__n = PyUnicode_AsUTF8(f->f_code->co_name)
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end
document pystack
  Print the entire Python call stack
end

define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end
document pystackv
  Print the entire Python call stack - verbose mode
end

define pu
  set $uni = $arg0
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80)
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
document pu
  Generally useful macro to print a Unicode string
end
doc/alt-python38-devel/README.valgrind000064400000011445151732726230013362 0ustar00This document describes some caveats about the use of Valgrind with
Python.  Valgrind is used periodically by Python developers to try
to ensure there are no memory leaks or invalid memory reads/writes.

If you want to enable valgrind support in Python, you will need to
configure Python --with-valgrind option or an older option
--without-pymalloc.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must do one of the following:

  * Uncomment Py_USING_MEMORY_DEBUGGER in Objects/obmalloc.c,
    then rebuild Python
  * Uncomment the lines in Misc/valgrind-python.supp that
    suppress the warnings for PyObject_Free and PyObject_Realloc

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

PyMalloc uses 256KB chunks of memory, so it can't detect anything
wrong within these blocks.  For that reason, compiling Python
--without-pymalloc usually increases the usefulness of other tools.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
doc/alt-python38/README.rst000064400000023464151732726230011273 0ustar00This is Python version 3.8.20
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.8
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.org/python/cpython/branches

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.8
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.8

.. image:: https://codecov.io/gh/python/cpython/branch/3.8/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.8

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues/
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/setup/#install-dependencies>`_
section of the `Developer Guide`_ for current detailed information on
dependencies for various Linux distributions and macOS.

On macOS, there are additional configure and build options related
to macOS framework and universal builds.  Refer to `Mac/README.rst
<https://github.com/python/cpython/blob/3.8/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.8/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavour. Note that this is just an intermediary step.  The
binary resulting from this step is not good for real life workloads as it has
profiling instructions embedded inside.

After the instrumented interpreter is built, the Makefile will run a training
workload.  This is necessary in order to profile the interpreter execution.
Note also that any output, both stdout and stderr, that may appear at this step
is suppressed.

The final step is to build the actual interpreter, using the information
collected from the instrumented one.  The end result will be a Python binary
that is optimized; suitable for distribution or production installation.


Link Time Optimization
^^^^^^^^^^^^^^^^^^^^^^

Enabled via configure's ``--with-lto`` flag.  LTO takes advantage of the
ability of recent compiler toolchains to optimize across the otherwise
arbitrary ``.o`` file boundary when building final executables or shared
libraries for additional performance gains.


What's New
----------

We have a comprehensive overview of the changes in the `What's New in Python
3.8 <https://docs.python.org/3.8/whatsnew/3.8.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.8/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.8>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


Documentation
-------------

`Documentation for Python 3.8 <https://docs.python.org/3.8/>`_ is online,
updated daily.

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

For information about building Python's documentation, refer to `Doc/README.rst
<https://github.com/python/cpython/blob/3.8/Doc/README.rst>`_.


Converting From Python 2.x to 3.x
---------------------------------

Significant backward incompatible changes were made for the release of Python
3.0, which may cause programs written for Python 2 to fail when run with Python
3.  For more information about porting your code from Python 2 to Python 3, see
the `Porting HOWTO <https://docs.python.org/3/howto/pyporting.html>`_.


Testing
-------

To test the interpreter, type ``make test`` in the top-level directory.  The
test set produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.  If a message
is printed about a failed test or a traceback or core dump is produced,
something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run ``make testall``.

If any tests fail, you can re-run the failing test(s) in verbose mode.  For
example, if ``test_os`` and ``test_gdb`` failed, you can run::

    make test TESTOPTS="-v test_os test_gdb"

If the failure persists and appears to be a problem with Python rather than
your environment, you can `file a bug report <https://github.com/python/cpython/issues/>`_ and
include relevant output from that command to show the issue.

See `Running & Writing Tests <https://devguide.python.org/runtests/>`_
for more on running tests.

Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (``--prefix`` argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using ``make altinstall`` contain the major and minor
version and can thus live side-by-side.  ``make install`` also creates
``${prefix}/bin/python3`` which refers to ``${prefix}/bin/pythonX.Y``.  If you
intend to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using ``make
install``.  Install all other versions using ``make altinstall``.

For example, if you want to install Python 2.7, 3.6, and 3.8 with 3.8 being the
primary version, you would execute ``make install`` in your 3.8 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://github.com/python/cpython/issues/>`_ to report bugs, and/or submit pull requests `on
GitHub <https://github.com/python/cpython>`_.

You can also follow development discussion on the `python-dev mailing list
<https://mail.python.org/mailman/listinfo/python-dev/>`_.


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A
Python Enhancement Proposal (PEP) may be submitted if your idea gains ground.
All current PEPs, as well as guidelines for submitting a new PEP, are listed at
`python.org/dev/peps/ <https://www.python.org/dev/peps/>`_.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/


Release Schedule
----------------

See :pep:`569` for Python 3.8 release details.


Copyright and License Information
---------------------------------

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

Copyright © 2000 BeOpen.com.  All rights reserved.

Copyright © 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software, terms &
conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
doc/alt-python38-pysocks/LICENSE000064400000002571151732726230012276 0ustar00Copyright 2006 Dan-Haim. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
3. Neither the name of Dan Haim nor the names of his contributors may be used
   to endorse or promote products derived from this software without specific
   prior written permission.
   
THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE.
doc/alt-python38-pysocks/README.md000064400000030072151732726230012545 0ustar00PySocks
=======

Updated and semi-actively maintained version of [SocksiPy](http://socksipy.sourceforge.net/), with bug fixes and extra features.

Acts as a drop-in replacement to the socket module.

----------------

Features
========

* SOCKS proxy client for Python 2.6 - 3.x
* TCP and UDP both supported
* HTTP proxy client included but not supported or recommended (you should use urllib2's or requests' own HTTP proxy interface)
* urllib2 handler included. `pip install` / `setup.py install` will automatically install the `sockshandler` module.

Installation
============

    pip install PySocks

Or download the tarball / `git clone` and...

    python setup.py install

These will install both the `socks` and `sockshandler` modules.

Alternatively, include just `socks.py` in your project.

--------------------------------------------

*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP (not SOCKS) proxies, it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead.

--------------------------------------------

Usage
=====

## socks.socksocket ##

    import socks

    s = socks.socksocket() # Same API as socket.socket in the standard lib

    s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default
    # Or
    s.set_proxy(socks.SOCKS4, "localhost", 4444)
    # Or
    s.set_proxy(socks.HTTP, "5.5.5.5", 8888)

    # Can be treated identical to a regular socket object
    s.connect(("www.somesite.com", 80))
    s.sendall("GET / HTTP/1.1 ...")
    print s.recv(4096)

## Monkeypatching ##

To monkeypatch the entire standard library with a single default proxy:

    import urllib2
    import socket
    import socks

    socks.set_default_proxy(socks.SOCKS5, "localhost")
    socket.socket = socks.socksocket

    urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy

Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. Monkeypatching is usually an anti-pattern in Python.

## urllib2 Handler ##

Example use case with the `sockshandler` urllib2 handler. Note that you must import both `socks` and `sockshandler`, as the handler is its own module separate from PySocks. The module is included in the PyPI package.

    import urllib2
    import socks
    from sockshandler import SocksiPyHandler

    opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050))
    print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy

--------------------------------------------

Original SocksiPy README attached below, amended to reflect API changes.

--------------------------------------------

SocksiPy

A Python SOCKS module.

(C) 2006 Dan-Haim. All rights reserved.

See LICENSE file for details.


*WHAT IS A SOCKS PROXY?*

A SOCKS proxy is a proxy server at the TCP level. In other words, it acts as
a tunnel, relaying all traffic going through it without modifying it.
SOCKS proxies can be used to relay traffic using any network protocol that
uses TCP.

*WHAT IS SOCKSIPY?*

This Python module allows you to create TCP connections through a SOCKS
proxy without any special effort.
It also supports relaying UDP packets with a SOCKS5 proxy.

*PROXY COMPATIBILITY*

SocksiPy is compatible with three different types of proxies:

1. SOCKS Version 4 (SOCKS4), including the SOCKS4a extension.
2. SOCKS Version 5 (SOCKS5).
3. HTTP Proxies which support tunneling using the CONNECT method.

*SYSTEM REQUIREMENTS*

Being written in Python, SocksiPy can run on any platform that has a Python
interpreter and TCP/IP support.
This module has been tested with Python 2.3 and should work with greater versions
just as well.


INSTALLATION
-------------

Simply copy the file "socks.py" to your Python's `lib/site-packages` directory,
and you're ready to go. [Editor's note: it is better to use `python setup.py install` for PySocks]


USAGE
------

First load the socks module with the command:

    >>> import socks
    >>>

The socks module provides a class called `socksocket`, which is the base to all of the module's functionality.

The `socksocket` object has the same initialization parameters as the normal socket
object to ensure maximal compatibility, however it should be noted that `socksocket` will only function with family being `AF_INET` and
type being either `SOCK_STREAM` or `SOCK_DGRAM`.
Generally, it is best to initialize the `socksocket` object with no parameters

    >>> s = socks.socksocket()
    >>>

The `socksocket` object has an interface which is very similiar to socket's (in fact
the `socksocket` class is derived from socket) with a few extra methods.
To select the proxy server you would like to use, use the `set_proxy` method, whose
syntax is:

    set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]])

Explanation of the parameters:

`proxy_type` - The type of the proxy server. This can be one of three possible
choices: `PROXY_TYPE_SOCKS4`, `PROXY_TYPE_SOCKS5` and `PROXY_TYPE_HTTP` for SOCKS4,
SOCKS5 and HTTP servers respectively. `SOCKS4`, `SOCKS5`, and `HTTP` are all aliases, respectively.

`addr` - The IP address or DNS name of the proxy server.

`port` - The port of the proxy server. Defaults to 1080 for socks and 8080 for http.

`rdns` - This is a boolean flag than modifies the behavior regarding DNS resolving.
If it is set to True, DNS resolving will be preformed remotely, on the server.
If it is set to False, DNS resolving will be preformed locally. Please note that
setting this to True with SOCKS4 servers actually use an extension to the protocol,
called SOCKS4a, which may not be supported on all servers (SOCKS5 and http servers
always support DNS). The default is True.

`username` - For SOCKS5 servers, this allows simple username / password authentication
with the server. For SOCKS4 servers, this parameter will be sent as the userid.
This parameter is ignored if an HTTP server is being used. If it is not provided,
authentication will not be used (servers may accept unauthenticated requests).

`password` - This parameter is valid only for SOCKS5 servers and specifies the
respective password for the username provided.

Example of usage:

    >>> s.set_proxy(socks.SOCKS5, "socks.example.com") # uses default port 1080
    >>> s.set_proxy(socks.SOCKS4, "socks.test.com", 1081)

After the set_proxy method has been called, simply call the connect method with the
traditional parameters to establish a connection through the proxy:

    >>> s.connect(("www.sourceforge.net", 80))
    >>>

Connection will take a bit longer to allow negotiation with the proxy server.
Please note that calling connect without calling `set_proxy` earlier will connect
without a proxy (just like a regular socket).

Errors: Any errors in the connection process will trigger exceptions. The exception
may either be generated by the underlying socket layer or may be custom module
exceptions, whose details follow:

class `ProxyError` - This is a base exception class. It is not raised directly but
rather all other exception classes raised by this module are derived from it.
This allows an easy way to catch all proxy-related errors. It descends from `IOError`.

All `ProxyError` exceptions have an attribute `socket_err`, which will contain either a
caught `socket.error` exception, or `None` if there wasn't any.

class `GeneralProxyError` - When thrown, it indicates a problem which does not fall
into another category.

* `Sent invalid data` - This error means that unexpected data has been received from
the server. The most common reason is that the server specified as the proxy is
not really a SOCKS4/SOCKS5/HTTP proxy, or maybe the proxy type specified is wrong.

* `Connection closed unexpectedly` - The proxy server unexpectedly closed the connection.
This may indicate that the proxy server is experiencing network or software problems.

* `Bad proxy type` - This will be raised if the type of the proxy supplied to the
set_proxy function was not one of `SOCKS4`/`SOCKS5`/`HTTP`.

* `Bad input` - This will be raised if the `connect()` method is called with bad input
parameters.

class `SOCKS5AuthError` - This indicates that the connection through a SOCKS5 server
failed due to an authentication problem.

* `Authentication is required` - This will happen if you use a SOCKS5 server which
requires authentication without providing a username / password at all.

* `All offered authentication methods were rejected` - This will happen if the proxy
requires a special authentication method which is not supported by this module.

* `Unknown username or invalid password` - Self descriptive.

class `SOCKS5Error` - This will be raised for SOCKS5 errors which are not related to
authentication.
The parameter is a tuple containing a code, as given by the server,
and a description of the
error. The possible errors, according to the RFC, are:

* `0x01` - General SOCKS server failure - If for any reason the proxy server is unable to
fulfill your request (internal server error).
* `0x02` - connection not allowed by ruleset - If the address you're trying to connect to
is blacklisted on the server or requires authentication.
* `0x03` - Network unreachable - The target could not be contacted. A router on the network
had replied with a destination net unreachable error.
* `0x04` - Host unreachable - The target could not be contacted. A router on the network
had replied with a destination host unreachable error.
* `0x05` - Connection refused - The target server has actively refused the connection
(the requested port is closed).
* `0x06` - TTL expired - The TTL value of the SYN packet from the proxy to the target server
has expired. This usually means that there are network problems causing the packet
to be caught in a router-to-router "ping-pong".
* `0x07` - Command not supported - For instance if the server does not support UDP.
* `0x08` - Address type not supported - The client has provided an invalid address type.
When using this module, this error should not occur.

class `SOCKS4Error` - This will be raised for SOCKS4 errors. The parameter is a tuple
containing a code and a description of the error, as given by the server. The
possible error, according to the specification are:

* `0x5B` - Request rejected or failed - Will be raised in the event of an failure for any
reason other then the two mentioned next.
* `0x5C` - request rejected because SOCKS server cannot connect to identd on the client -
The Socks server had tried an ident lookup on your computer and has failed. In this
case you should run an identd server and/or configure your firewall to allow incoming
connections to local port 113 from the remote server.
* `0x5D` - request rejected because the client program and identd report different user-ids -
The Socks server had performed an ident lookup on your computer and has received a
different userid than the one you have provided. Change your userid (through the
username parameter of the set_proxy method) to match and try again.

class `HTTPError` - This will be raised for HTTP errors. The message will contain
the HTTP status code and provided error message.

After establishing the connection, the object behaves like a standard socket.

Methods like `makefile()` and `settimeout()` should behave just like regular sockets.
Call the `close()` method to close the connection.

In addition to the `socksocket` class, an additional function worth mentioning is the
`set_default_proxy` function. The parameters are the same as the `set_proxy` method.
This function will set default proxy settings for newly created `socksocket` objects,
in which the proxy settings haven't been changed via the `set_proxy` method.
This is quite useful if you wish to force 3rd party modules to use a SOCKS proxy,
by overriding the socket object.
For example:

    >>> socks.set_default_proxy(socks.SOCKS5, "socks.example.com")
    >>> socket.socket = socks.socksocket
    >>> urllib.urlopen("http://www.sourceforge.net/")


PROBLEMS
---------

Please open a GitHub issue at https://github.com/Anorov/PySocks
licenses/alt-python38-setuptools/LICENSE000064400000002032151732726230014054 0ustar00Copyright Jason R. Coombs

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
licenses/alt-python38-pip-wheel/LICENSE.txt000064400000002105151732726230014344 0ustar00Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
licenses/alt-python38-pip/LICENSE.txt000064400000002105151732726230013242 0ustar00Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

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

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

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

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
python-wheels/pip-22.2.1-py3-none-any.whl000075500007152367151732726230013671 0ustar00PKE��T���f�epip/__init__.py=P�J�@��W�^ta�bԂ�A��mY�l���vfHR����.�y��<^�a�#�h��>It�Q)x7SUȒ���Ȋ��>3�4�����:^��(���<����ki U�e�=	�v~�����|@��#:���IN3D�7��^€ 5ST�f|OT�4ty
��A� �ЫF)�#��Ø�9�<i�$2���Ovs��v	%1l����&I�^y�!���U��ň|�¨�+�&�3�PKE��T#�m�pip/__main__.py]S�n�0��#rXvEH�Q�R�^r�!��CS!��Z��m�l��o�&��7o޼��`] �=����wR�hs�IrCO���fC��T�αº#Tk�U��L��=�����ȝn!.ڜtC�c/��:Y]��g��!T�@��{��T�\s$b�� 3>��˩��'�|k��S��'{䚔��Zk趏|_�o��j�}�G�ei�Ò���l�}Hߊ*;d�[�屡�I9&71k6@Ir�(U�эx�jW�j�'H����ѫ�*!�vWLmw'b�"��"�,US���S��*o���Nn����,{�MY�y��m��F�L�$��K�6o69y�������~삘 Jv)+��j���f	�R�9��Z)�oEd�������F,����Ձ�}��#�����6J���Z���gL8�kG37�����*������OBȦ��f����k������1�%�e��fC������@���Xǻ�z�����ԌU�TИ�V
P��
�mA�Xc���fE�bs��%KJ��@��|�"�\=��z[���b7O"._^�;T��ĥ���	�ꊪӅx�J��(*6 ���_u���0�PKE��T�}�3=pip/__pip-runner__.py}S�n�0��+8�p�u�e2�:���A���@Pl:`K�$w�ߏ���a:��H>�I�<�`�y|�oz�W�Ԧ]��&�?�l
T��Ѣ��YZ�Z�g���
��h��@z:��5y��"1?з��Ȼꃇ3�Z��'سL����C�$IͶS���w����nG�F��V��<�~"�c�
�)l�����B;����&�J�P�pG�R]���x��hR���U�)<)21�}��}���]Q`3-�?�A-ΗK�X��`+�c��!ya�)ؐښ�oѭE�U4TX���JYDSX�:���iB�5iigs(r}��8�p�ϽGz8B�N'��V8c����Q�l��@�!KX}�}g�O���oy»
$�t�|�E�YY�\)�P��
�Y��/����8�c	�	���bO,��[v3bL( ��á�^��{��y~�y��Y����F�TO.����ww��|fԳ����2�B����?=��2��yȅsؐV��B*Γ�{����A>tE;�|�3fHJ�U�0aq�2��⧁#Fټ Ol���`;�/PKE��T��5�pip/py.typed%��N�0E�~��X��lo@b6�i-%v�8��=N-�s�Ha��Iw$QF�vT�+>OI��H.�3��Q<���̧f,t�$���o����Ƚ9��Ÿ��X�����|�������h�dr1��h�d7����*��4�;#�)!�*��W���|�J��߱��7���g����]R915n��PK�mWb�=�_Kpip/_internal/__init__.pyu�A��0����e*
�	i9rZ�eo��(ۺ�Q��e����!A.����/σ�l��#�\�<��	�U��)��&W��Bl(���(k$���]�E�$��p\~�0l�xw�t�e��ɶzt�c�/]�{��"��]+��G�/Q���\'�&�R��
�nc�sq˹�KF�a��B���1ɨg8�x�yR�����kal��g��s?���q"��BT��N��Pr]a-A;�j
69؜VPO"o�P�;����b؋/n���^1�GK�	&���ɦ�%ven�ZS�i�������o����}Dd��W���*[����]��{D'�p�&�GY�	�PKE��Tp�Ppq?%pip/_internal/build_env.py�]s۸�]�eJ�$��Ӎ�j�8J���ε7
�&!5E�Ҷ���]|�I9�N_N��.�{KA�cUI���Ӻ%��%�qA��U�2^����%�d�%7��� �o�hI�ooq�<ri5y{W��(�NK��G�7���{R��&��%�|ϊV�r�����������CC{�k��&/�a��G1,�O�����䟧�cr�R��T4&g eL.d&�brE��kpO��֤��K.҂���%�x�O��&G5����1AQ�=ß���P��h���~x�Y�c�2�K\�*^(c:�Y
2��iQ�T�nj f�yC��,��Xz�38X;����-3X�f��a�ޞ�y���K�����ڌ��8s���U2��M#xAe�b�WU6,Gm��J&z_��`����܆��ե��δ\��p�dlI�>��q�W?���
6W6�R�L��YV�{�l�X,�*�K�j}.(
��j�fY(i��U.�lED���s^S
��H��/CҶk`�C^I�oݰZ�h5�a�C�'�ۀ�n�L�a�Z�%
�H�pɞ�������znrI��b*xp-g�e@�6�,kZl}�ՐEiyt2D*�B�/�]]c�h��hL+
R�Gڒ�`L���v���塽�p�O��Z�@`h�������:$H�z�B��c�R'\���\4֙��-�.����4<F�dEԉ�Բ��%�DA��A�%|�nf� -A��a�lk>��5o
��ITi
�FK��;�$wy�q$�S�4-��\��J
���+�є����֡Y��c�*�kT��'�
���<T�h�Psi��:8�N���%5��O$����$TdY��!�TEt
b�'��-��.�>�!X�)�`BG�hNc4m��F��9�3q٧���}BL:+/�ワ�����?Bv��
�z�4���ZtV%}\�H��p���!mlsK�D�I��YZ�R�E���~�ž�$j.�y@s(`U�
��w̝�,r�J�L�F7���ltC��Ȅ�X:iV�zH�2!��>C�r�2�h6F3����.;"�!'�l���B�d-f7�p+	U��
�hp:x���ld�"���*z��1��4]Sv�E���&:³'�57C1D�H�TQC�:=�b�gx�
эc��S�9^b��E�O`E�$G��=&�T��@��脳�+�|\�WaM�R,>�k��$�Uе��`pp�v��ܮI��Əm�Ӓ�`�)~lZw?}�+Ū۞@�!���*o�$�	��*��b�N0�`Њ��BdfZ����Yn'�5�ug���
�	��Q$��z����rVr�M��o4�v笕�{z�9��j��I�~aԕ��G^5QX4��)�9=ofOV����Y4ݔ͈�BLK�+iBa*�Cz��^A=�˘�	dS���x�����s�J��E����*�t�zT}��)��f�f�Zq.B�t��ʏ��+�!&�ݕ_I�"���x�8�I��?P�7M2=�%���_�aj?�y��_����5���O��_�֟�N��Ú�pkA������Y�We�Y	6�����6�BU`݊�������bܨfކ���������K�(�?O}Aq�$é��(ωg��
]���(�1�4�3���ѓjH=��S��eُF68
ټ��~*�Z�n}�xtD��%�o�g�7�eQ;+X�q*~=�I��{���6G�h�غ�M�7�
�׾��1�إ��/�hq�����%��ͮT��wЌPm�h�ѿ`7�[X'X
z;��鳾!�k�v�C�
���!	ߑ��m(����O)�H�GK�ԞIy�����-ָip�1M�7��w�?�!���ZC�.�y�
3Q	z�`
�G�W�8��O�� D��7��<��U�ə�e���/�{���	r^���L(z]�4��_��B����S+r�|�Ǻp�
>QG}Q�S��՗@�@����k&��Bq�KdC�c�>i��k��\��XL*�f�ƍ�vj��s��a�^��~wt���+(U��G�n:�B�U5�������3��=�q�����20D�'�olG�Gd�C3���"���J�Z=��^�M�|�6�_%nt�(�!��������,�H(
��G�k���x8a3�Q��ȇ���^���R�t���糿��L�Q���͹���t�9/8�7�uJ��1��?�B�KxQC�a��O9�3��LJV��f|��w�}��o�q�b?CF��󞔞m��GM�����$��}����Y9G�௩�qF��	�ܵ��S�ʡ�z�k�Z�G��:��N�G����x��ioL��ע#��݌z� I�-��>��5O:��l̾T0Ψ�3��7K�k���
�eC���������=��
#������/}�F�b�<8�V~}5�0
^ٹ)ލrqP�Ӻ:��Q.Ը�E��S��>�xtH4e�\�&y��*I���TЦ�>2d;	f�8
9̌��!C+��9X��~P�g�g���8��-�D��0�\�3&2:�	�͟��iǦ��LA�����i���(�Da%���ā�sܴ,��^�pFnU����_��.x�p��bEc����q�:t[�I0b��_!m@��yC�?f�9�N�U\0G	��
;_����������ǎ�=M׌� �<�̮�ߞ�{vq��N֟���U�7F��P�7��.8^>c�~	�|��^xOc���W��{��"��.�_I��S
�����x:YyO�8�͋�s~ь_΅ㅨ]���7j̝�۔JJ����W�����b7��MZ|
źk�M��vW,r��sޞ�J�K˵\�E��PKE��T<l�[�)pip/_internal/cache.py�Zm�����_�U`�*d^b8n+@E���K`;�ÁX�+�>��pɓ������.��.�h�
�Y����<���|�\�{%��\��A��l>��f��e%���t�<~6:o�gz�K�]��l[�(dE+�{�#�@u*0�y�,?-�i\-����ﻢJu.��������at��D�a!�I��ܙ��G�[�4�TY�
�\T�ͭ*
(�E��Ҭ%�\�i,����|f�0�՗X1��W�-�$��Je/�L�҉���̄IZ����2k|�o~*�;Vmuy�U�*u���}n_ޱ:K�f�k|�c��h�LS�Yqa�EyZ���
�KX��1ݤyb�S�&Z]�E�&��f�h�����^� bE�b6{�����F���m�ٛK̟�2ł��.=K�VD��`6��d�xe�r)��z!����f��{U�e.$^�M����Ǐ���+"A[�B
Za�'�&��0A�&�Q'��X��K�
YJ�Ŭ��r���|�*7u�"i�4��W��]�v���*�a�`���E�W_�t�L@�8���V�g�b�d��G�(�m�(���8��x7���`k��&Z+�`���W�#֖ZW��
�y(�'��v��z��ђ��:�*�=i�D�I�hbl�(��J&���
e��J"��Y��>���C�n��[
��:K`g]:R�	�Ƨ�B�xht]�
��:�N�^�_+�hn��GO�(
Z�Feۥ�B����z�Y�eB�$׽f��ou�,λ�"d��/�!�X!�r]u\�\��"/L
�%h�=��nɺ����O���@�䁄�=x3k�G�j����[�PHY��9wj����A��B�׃-<s"�DVl�R��֤(+άl*ll��(���!}�/�JjS��[|�i�:�վ�r�X�J|R�(��e�r�̢ੂj
^�Oإ.��#-����U��#��X(�#ZH�����(���t�'Dp&1�t�̎����m)w:z4�v1E�����Ƌ2�e��v��k�*BD�cMԐ﬚n�,N�TDjإ�
y�v��l���O��M�f���7M�<���#<�g�[“4|���N��e�E7��F���!K����b](�Ji�=�(2"�]5�6u��Gem�U%X�<2�*��(�jk������x�4`P���8��]������/�S�J�Ԛ�c�r�� ݤYZ�!��#���¬..v��ބ�|Q�
yXq��<|��y:����+�A�/�Tyf�z�ڽ�:ܱ{i��@9O��-���Lبc��!��0��GϨ�.I/����F��}�t	SV����V��T���
�п���TCc�E(^"E�Ҳ�]�3�A� ��ƨ~��Y���Kb��.�������}4�*zq&��7������ �KN�&��x�3 хG-ä���H�Q��ɍ}�f\����=�̣��C'Q����hW���K'���Փ����i��tu}�I����D�W�eװD���]��������DH����mJ���Z|0E�%6��أ�O�N�+O�|O�B�ѠZ��,|ZQ����.N�=h*����i��{��'N�jD*	�O��YA�}lM��EPS�f�3�������%3�X��[�yؘ�I4�6F�񛣶�q"m�P����^�*1K2Efx��W�"��\��.����ɋ�,~4g
ºI@��e�7���l�|�;7�
���5�������������PI]Z�t$�J�/<.�H>�j\��!�1n͹���k�@.�Rn��m
v���f躧[��Сܧi	i-�ؾ�ox���a���\�0f}�O��I�d��`�u�n-1B^lP���K�>x ���?sؿ��Hc��7T���KCDf�"�u�~r-(�����"
7l�u�)w�'�ۋ¥t�ќ�5��+:��<u�&����:�0܎n~�98%atV?�*��.ᅋL��H�/*�6�qG�Ң��'�5��X�u�u�4�-M�x�����c|��I(Ȅ4L��g���0�S���$#���k� �O���"�p^p� �,�=z``w�n��.5�
���2�n���߶!���΋�p�e�S��W*�F4��F�m�����~?{X�����觅30h=>-���u�̝P��|h��,���p7@Uy���k{xt{/z3�9����@*H�Z�,�(��y;�9�:�����Ի`4J���Z^�]?��6=�?�+��|zq��=	@��TP@��B�e���[���r��g�����Ǘ<cqo��V�ml�(�@�_��8Ir%�Z}��_�2�_�*�c�9Z7m�ۀ��(���m�o��ה���N�{$�hy&��t(�q3���#�%ڎ��b���X�C}C��ᘭ�q�8/��C�c�4�������6��^���D}O���u��(�������������g�_^������3��-���#P�g�M1�np�r��	������Sѱ��h`[��bD��w�<�-�p�Пdo����^0ҩU��N��;���t}���tm�C�SDž^����I��풂A����-�!]�Dt��!G�A0�*���|c��(�8�ⅱ������������B:g��gW�Xmk�!H����vu5����1�G;	'S�i�#뭮	�Z�f�?�ئ���F��]+׏~�њC�Q{��k��3̈��mt�[�I��G��=���f����d�מ��MvT�%�#2��=04بw|�SD`��q�=x�
��X�g���viWY�Ϝ;u3��_?�Bn���B�Tm�8u���֕i�駞�"���ΩJ����q�h.چvD��O����W��<��+|��р�Z�;�n��#{^�)?�+��J�o6�I<��_��D�E�*���L��Z��
9n]&QؙiTm[уayj��|�W��L�x�����;���A�}������}�n�wa�s�B��5��J������o�>�	};:��Z�����:����(�X�L��*�~�t��6�<�ӻ^{�l���rS���7�~QC?�z'�M�{�mʚs���s�y'��x�1&�G������,�7���4�䱯�ϼbM��y]m�y���PKE��T��y�6�4pip/_internal/configuration.py��o�w����QG��a5�mi���%Ar-CU,:�"K)���߾�I���$����Ŗ�����(�~*����ȴe��i���5/j�x����r�Y��Ze^��&�V�k>`�P��u�&
� @l)r�bXt��\�	��T�r!Қgl+�K5�v�w��~���(�
Q�R�Ă��/1�t)ҢF,��M�ٶ�˸ZH`n�v�%���5K#�x@ȱ*�-��,׃(���JY�-U*��Y^.Ҝ�_����N
�wl�1;�z�N���u���T(�}Ʒv�<��4��
`k8���D�	^�˂�2e!�l�<�KY�q��[�O�&���G~Z��ƃQ�9�Z��iUeB���bV��v�瓳���W�����8���)<��ݱja��Bm$O�1|߬��t�� ��'�8|�^��@Z�E6�Yl0BF�;3U��`���ۓwɏ�W�g��a]�؉BDL,-����7xn48>���������n��R�v��y��}}��+��b*�U��T�x��L�Z-�WǗ�h�<��#�uU�X��xwz����4����4׫�v��k�Yd��\�|8�FJ�\��}�ޤ��wB�پH�F���H^'�a�ۓ�c�,�txIK������	
LA��:��<9:N�/��/�Z�:�t��/��~G��w8��G>��%��G���
@�9�",o�r�$�i�4�vv��x�ާ�k�@�TJ��/,�kp8����(�:�ſ9z��0�K�4/����Ʊ����	�<����_ �$�Iel#�Q�F.8r���$�;B/��”���m��Q,y��P�u� �JPkZ��T�
��0:������[��U�/�qy	�
�P�AB���M}&��'���|�3�1�Xt�8V�Vhi�G7�[�)�hؼ!���w,+����:Y��EQ���b� .�\��b�röa`���J�U|��
�����ͣx�"��:B��2��몇%��q��rQ�c�fd�ڙx#�`;$&b���'��4�x��z�n��X�\�*�W)�!~�������Ć�������N���]�ù�i:cT"�{&�A���@t��_*.:�a�h4nz]'��vU��~��)��1L,_�h�/�-{4B�o�w�ԤOv�`)��	�������º.G�!af���"���qU�6�.9Ic�b���������%x!��t�����?a3)%A���i�`�Z�j�^��w�Ĥ?�Xd�FL�а"�:�\�Bx��\U��S��Yk'[��Ȧ����Ƨ��"�4�ȀR��{,�L
��.�$��({�=�t��bw�Zc�x�v�M-<j��N<�ei�j�"� ��d FȚ�␡�:I ϗcX]�ȡ	 ^B�Cn�`T�4Y-��9�Ze��K�֛�MEa��<4�L��zt�M��oL�"����{}����}G�@	DfT��w��
�i�"�~�Y�߁G0!�j��N�!D`�atG��N�I�y[�g�WA��E����#_�Ӷ����2]�"5�h��7��FA�<�NHt��&��C���1��u�ޣ��q���j�e�g�ͮ����0��C����u�A~̳�
OҎ!w�Z��,��.��RS��b.�c�dN*h3�]�7�G���!9��ۏ�9%�)k�6=A�I]&<�쥡��m�gȼ��]/�Tr�+q��?'J)�]�^0t�bb)�P���w�uV�ti�S}�~�C�Z#��.p#:Rkn �Z�H.��n8��iަ�T���_���BC[B_��o�m��it/���b��J"S�5�C���@J��9�`��#֚�*w�_-�6�<
�q����R#%�\����
�X�Q�H�҂��gʴ�g�:���G�/X[�[9( �(��*V�M�f�C@n���],:+!,.VHM��j�T{d�S��Um_S�_�k�Y��Rj���xBl�!�.>��-�"G�j���Z�x��{O���/i�D�kY���*��I����m4o�w�*�\z�轜��p�O�KI�ƶ��M��K�ߦo�kpAL?l���m[�#1���i�uzց؇=F��n�������l��ݱN�m8�8;��ަا|�
��?_߾��!jBģL��3���>m��ߣ����&�0�%_��{�}m
R�9�f��ʶ�&J�����W���B^�Cv�{�&>�D6}3�����5��1�\on���*>8��:�Qj�� �J���X]�z��=�MI���Ϗ���a��x���p���#	���ƾ��S������q7k~�x�v�m���N��qB7�cQ,�a�Y
���쥂jq��3�1!Ɇ�"�T�]{O2��)�N�IC
�R�]V��B����m�W�x����_v!�0��r����w���=�˞t��M�Z��l��s���O#�����HD���m)o�*��R5�"�7F��%��$pTֻ��6�l)�kTOUY�a_�H̲�G��t����6�w`�\���U9F�Xa��p�c!���'h��h��Xh?�汷����wx�We��гza��&Gɺe�S`��
��()�/��jl��v_͚{���O�7�M�,6�w�&���B�f�guu+*�wF�tOY�!��F��)�_��f�!���F�A,��4�B^�֍>��[�崮/6�,�})N	X+�چ9����t�y�U�j��´�J������=y�I��7�`e����[y��z�R�bæc�R�l��c��C��(6|�y�u��5l���4�~��e�i�E��Z7���څ�5�ia'�Z3����ɷ�/�~�$��w\^�����WB�������Z��ј����?����fa��a�=�g���V6�=�h?��Ϳz�M�>��P2L�U��Qק���V
�0���W��g8��֮�Q�bE�Re%6=��,_-+O65[��7�%TS,��n��oU��G�,=*u|�C��M��m�����;k�j�v�	5\a�
� 1��1����\�(N�q��EI�N͓�1}�.!��÷��¦��j�#�Z��D��},��G���i.\q�Vu]����7�Bm�ql�u���ו�^�6\�������9�T�,Sut���.#3��K�����X��� x+����K=Xw<]'�`N�W6����g>�GO�|��+r)w>���t-�¼a�Ƒ���ЫE8hbr�S���EK�_B(Rc�M#���dG�6?�؟����p�~�8Z�:n�5�,�bV;�HCG��-pn�����}
�����Ձ�������h�R�|wP�b�>�ش1
j�z��]5)��)�o{G�|�k�tZ������K
OS�yq&j��%Hl���L�BB�
(F�w�D�e2�o���@�O�ukЛ�"�=-�l���'s;֗��J�m�L4��;�!�6�5m��/�L����+=���W�qa.�䞪-C8��K�WĤ��Q�{/K;��]�W�5e��J�&F�j��O|z:a�˻fY��aS���Zn
����:M���+�s7�W��$�>��Z7��|%�d�)P�wp���	̙;7�,�ɪ�6�}�+=��?���܆]�z��������s3�ba'A{
s�j�Wqy��]�N�K��i��������Գ��ve�+��y��4G�{P�,�M��ܹ};(��"���]�+��o�E{���l{��/<^.Er����1(j�R%�8��5������9_�}WOw>*�aJ_]�Tǫj
����`��{_TjN*�{��x�G�J&W����4p�L@�d��#�����l1?
*����*]{]����:T\���7qP�8Al����G���|�w\~����;��{��y��fһ3�Vr^�fo�_�#a�m�$�P
z�rı*�����M�#��r����ی�5������	���H�?
��u��#�L��N�?��эo��(�PKE��Tܭ����Qpip/_internal/exceptions.py�<�n��z��n���{�srP�ug׻kd/�7���9�S$�!��}�S�5�}�<I���px��������$r��|���C��N?�2/�,U�R2�Ȫ�:�J��M������:Vb�EU"���/ě��,���D�ɳ��"ۈ ݖ�8]��?�u�<NKY�Ar
Ï�\A)}A0�?�1�a�3gb!5�`3�O�$�8��-��HU�@M�Z�&B�ʓH�Y)"��4
�G���ՆY��WyP(Y�k�<�cXm�e�2��� N'b���	�eP��r�#�z�ſ��Ο�<}��ٛ�,ˉx+��-9H&�C
_��q��-,3+�B�RIU*-�����	|Q9�I�<�kPRYb(��ω���+�F�`UR���M�HR�A>4k)?�{�^6�0;�GO��N�?	��MR�B6�Q}�!K�F�A���}��3�t/*�t�9�2�T�r�?�H츐�&G����a�\fIK�ߑ\�y��7r,�!�9R3����;��atYVE
@�2\�
��.��_��M�s��?x �c�(�o�TŒ?/�2�8GY�eF����Hv.����jB74�g��t�K�`h�H�� �Z7��u�bE�IC@mB��|����B�Rٹ��4F1��$#5>r��3��8٭,�Ivw�ū4+�7_����.���#��z���c��,NG�@_�I\�����|����EQ�1��(L��y��EV��b���XK���H	��|R*��gq��2-�q�򓨰���`�JD�a`�2+@nbT]j/Tͅ�T$�	4)A))�E��k�-E���p�OȔ�'�.˭����*x	n#��|q�!V�D�U���-%?��1a�� Q`�0�"IЂ(�Y��IN*�D%�Pܥ�N���
iV6e��;-
0ԓ�U�\v:<2�M�K��B��X��X���'H̀uR9���̓�.�8���
���j�i��5ڥ�5�r>�eQ�d9�����ހ���c��.=ZH�w)�Żz�\��93�q�{Ƣ��j�����U=D3Á��Fv�6�8����΢�	7�!F�	��8MU��ĠQ���n�HF�}�YcDɫ��U�a
J�T�B�ه��D��������W:&q�텣֌-#b�M��T�����/�p��Q�`N�h�pWT/�9�l�c#I��ZvX��d��-�a���b%
���-0(p?�;�y4��n[z�����9)����F���5q����[0p����nd�F
��7��k
�����E���FkZ�W�HMv=R��iɯ��߽�-'�h�F7�z���M���k=�����-����Z���́��;��y�ӝ}`�)�(��J��Ξ�����w�c8{pݒ�jga�/�\�ĥs�*�� ylX
j���0��Y�l���8g�G&�L���	[�B&�6HK�����7=]c�:�ds�z��f�ϕ�I�O���9v�|�?��^�x^Jc�����ƿr�I�]���?��׿��w��!\=æ��[p���.a��JO܏X)F�]�o�v���jlߖUs�`�[mp��at���	�K�A�Znn���DH��zWs�Z�<&��xZ���g�����D0��dK�[���ť��|���t��$,+�(tTp��˧���
����2�(CH�b��O�!�N{|"Ĩ*8��v���[�V��ױR0�|{^d?˰�C6��Q�n�]O�.�1�y���ȷ9?��&A�_\S�7U[�*7���K�g�2��p�k��#���M-�����<�Đw|91)�:�Ԕ��;�+�Q.�� �:L	��qo����-�6&�jݝ�Qdm��H���6H�MML�?�]�KɓK�"W�Ӽ�Zf�iW(��2+���RB��߄9nbP{����"���M*X0��,�[p��Vq��R;�Dt��\|��?�%���2����2��qHR�{���v#����0��V?��	,f���G�;@0�7ԛ]1^zMꃬ���D~�։�!��Jb"�p��M�?V�{}zq�����C��;������󷞛�S�*�%I�������p,3�(�q��[v
Ig�b�1���*�����7Y�<�҈���&�%�h��>�6�9 ۛl)'�	�U�@*9�
��իM�żLT�8Y�ӵ�@U+�xH�0��3i4�t)�d�{����<(����$l� �n�m̈́:�a�A��$! q�QCHG�(*
	���],9E�T�T��NY9�ĕ��%5�8��y$>�x t�'Wl2b�b�#�ҕ�A��
i!��D$�$���@�,�H2�	۹'�b��ޑgY�ˑ�-�����4^�8��}շ����jk5�8�N5CL�X������cJ*��ezY�J�T�����om���e����:L�:$_A;�Z���k��!f��f�E�&�h=���\"���N���%�Jc�T��D�����M���q #G���1�=	Ǯ~܃bYI��-3Ւ`��}<j(�a
��
��j	�Ou-�u�B�z�Et6/be|�̄aU��.�)qfV��!:��Z� a?�:I�G[=���Y����U>-�)l�zw�Z�F͠	Ll�7�D S�>0-��+��H�O�%���5�C�0���S�B>z~�� NQӝἐ�qV)rB���S=VT��)�L�D֑7U�Jw�7��ˊ�aS�yO\������a��!�G�7je�Qn����	Sa2:jf�+�C����F�����9�^$�d�Y�u��&���1E�l�=��^k޶������1vN�1��ذ��`
j�h�W���oz�Qc5��:��ů�e�-�ҥ�����/k)Thc�S|z<n��1>��!R��P$���3�A6 ��;dQ#�|�lEQ�����k�Ō�w��?Vr6K�Â^�r�8a�~ۧ�k�tz����?�Y0`*M>MO�GA��裸��tVG�}C%Y�~��p���u�Z=	E�u�AT5G�:���a�H��2�}�VD��n��!z�״A(��4PT�MQ�� Nz$W�c��h-�G.�/�t{��?Zb�S��r�����>�t���?�7.ܡ��-���7�[�y��r�'�&���κ��cj�!����A�h�~Zq0��jkK��j��o�4q3q(1qP���+�
B�4=�*����W+H��/�eX��O��|k��SB�N���g�8��sC��ܒw
���0`W��(�-�3Ș�ׁ\SkYCyJ�P�B݃d;�4��I~�dѸ7�Z��b]�O�7�SDأK���lc=x*?B�M�)�w��W�]\�
�8�����,#,q��s�ӄ���ԉt5�O��������@w��+Sg�ڢ�{�C�p��M��8͹gw��������]�x/xř������O��-���C���эE��E�tI���|���t��n�.�U!eze��=R1ƞ
K�q-*��*JU-�$��+�ʎ`��Y9�?�k�C�oC�������b�x��W��fr���'B��y7�2�=yl�/�a}B�b�q�Q����ֹ�
F
11�?��
-a/X�0B������G|�9i��=�qX
6��teaOY%~�~�3}����ϽHi?�B��J֖����Ͳ�Ac|����/l�'ɠe���,,��������T���2΁�v�0��2d�lB��	L/�'C?l�цi.G��4ʥg'����xjf�dT�������Oӯ�	�v���Sʣ�=N��"
(d�gE$�ژ qBp�t�e�-�!�Iͩ'��Q.$���JGЪB�_c��g�:��/�h;�0u�7��h�aǣ�H#6�lo;���;8q�Z@q��.�㮔�'��yb\Ut�!(�)Cl�_�0�-�M�ݥ�U�Qh-�u�h��c3q���R(�c紀к@[0��e��Xv���!��%��$C!qW��HY��q	�c�L�,qJ
TV"�<NQChd�k�")�Ϝԋ�����0���om"	�%�!_���`�6�^���Pb�0����w��B��:����1�%!��Zg��1�.�8n'؞�hL�'>�q
߱�׍�9�P�DZ"�PZ7Ğ�s앭�,)���mHJ+7X#�8ŵǔj���m�\����:��$�g`�����@\��]�ZjOg@H"Q����zc�F��U��m�^x!�'�G*lY&�5��ڇ"��,�6�>Kh�lF��;qJp\�K�5��%(N�ęGWp�-e�n���z�
(u���[^%�r����Re	lM`���Ġ���#�~]��6{*_��O�'I��)����:S=��.?\��F�v^88n���b	Uu�j������6�
0ƶg�j�_������=�C���7���ps�����������ApeLS�m#�h�#pwT6*ll��g�3��pX���1m`ػp7w��b��is���Ũ�UFv5%=���`ˍ'��)j�H������>u�lu=�C������Ϣ)�7gO����l]���^4��@}�C����JY��ݖ��f�[t1�fӗ�P���S�7���qmN��8�AҴ6r>�4��/M��4�P��3�� f@J�F:z
�5F��.M���:��;�ٴ"pO�H{ަIE�w��s5�
<�\��+�-��`�����l��<�>�ڡ�K� �M�P(����6D?�*3,m�7������=�$���!��)�UV��4�C�䞶��S��FC�`��xA�W�X��&l�ҟ�8_ͪ�9IK;3�d:��T�gYD
��h��{]n�9_�qk>���O~|����t������7+Ď�i�w:���_D�}x������6>�ՙ���))SӴ����|MX�6ݎ�G&fйyݭ�*	�fyl��޹�DZj��`����=�sH��H�)�%	@*����@1k<�\�q��꺆����B��w#�a%K{j�'U�7!�h'z�7����J��n?ji3Ŧ���2iJ礳o�,�cP>蠯ߢ��T��+uo�z�8�M����[��u��q�ޜ
���4�N�Ig��(B=�2#Kq|��*x.YY~YEQ��0Jی}!�\��A����I��w��v�Ln�����9�Q���]��_��6�?��6�2���+n�l4|��Kò?
�����Sq~����ų��b��'O_
�'P(��wo_��w���������7�]�=?{u�m?��UQp��Ȱv" z�]σ\@�K���b샑�
F.4�ʌ��BR!�\HF�`�3KYz�
�!CK�ِь^��opJlhє{ϣ�xW��c��uH�S��@a��
�lt0u]�+Ń�fZ~ +|�N��W�Ρ7m��[�k���_r�8Q�*��Ӑ���
��j�����S�#������A�\kߡ@\kWҫ�0�}b����+훃1��n��)�3��j�}C��n���6�lv� ;���u�ͷ� ��tl��*��o���o������.���;��%Qh�γbD?�-�Gﲢ
���XW67|t$dHRMJ��SP��S��N���@Z��2�
L�B�JiK��y�M(��W���
G�v�W�[#�)��.�[��,#�8�;� ��C�7�ڨQ��G��T���a��3߬L���l�+�<!l49v�f�U=�.Vtf��������{� �}Ќ�G�<�v墧��|�m���ms��E�Y�ל��2dc�L]�l�U;'a��)�/�MV~/_Q86Ʝ�������|���)Fsܾ�8mK����8��0W��-x9��%��_��xv���;�P|��;����
>�����K��R�|.m���>��Q>4�k�$�;x[{vs��K�Ԯ~r�4>t;p��z�U�Ew��MꙞۻM&�!����W�Бu��/PKE��T'���Tpip/_internal/main.py=��j�0��~
��
�}llǝ�v٭��&J"pl!)y��)�HH���?H��V�<�\�����F%���q�9R~�2j{�.�59�
�J�<�ek�h��g"��,�(���PJ�+YKB�N�M��h��
j���]%��ȼۚ�*���УEJ�E�Ɍ�
a$�����x��8����^_�
p��Ńz�O�����R��l�r�S��s��ȌrE�E�}��s�PKE��T���.�	�pip/_internal/pyproject.py�Y�o�8~��B�>d�8-p��
0{��vq�{���=�@c�5�'�IE��#)ɖ�G��+
$�I��ȏ��qLҏNn���n������=�u׉�I�l�d��Eㆾ^�z��ן�a�>H���=��n��z�W�g�m���N�|�z^?�G0Z��A�ʍ�ߪg�����ӂ%�jR9a��J|�E��b>c��VYǻ���h��i��Ýџa����Z/�<�$R�f�F�l#�hlt������
cT��Ol�u�"kF��(&�$8�j����%�a��<�*��/,Y��G&���?�M�w����|PY�l�L-6
�Z;m+o
\���G�V�Z}�R]�_�b\��C-�
�ǃ�~��βu�=��S�b��p�PlqU��N�O�;�X�0ƻӼI����u����}5&�=�Â��.�S��٠��8�X�fN���X�p���`y�X+;Q�H�0�j�V�.[�qK&�AGK5��C�[���?�����^p���q��_�N��uf{Q�V��
�O>�j���o����7���|�	U ��ư��'�_�j�
�E\��͡,��A`��*bȕ���dOad������54Z���>.6��ނixm^$|���b�2�<Ȱ�cT�E&w9����W*�!"��$o!�0ȸ��=mn��̄z�F+�Th,w�8�qu��~g��D�rq�����m$i���nJ�2����*�$B���1�<W�Q���T<�d�8k�����-�O	b8�I��O�-����-,Y�}/���o1e�n��\��Ȅ�]��+�'��A5U�/n,�Դ���t/�Q���ސ&�bp�����{�	k��+^;o�c�f^��,���8�pP����m�^EtV�.)���7�-����^s���Q���	���"�U&�����ZR��i��?�������g05�g�� /�J/���/P1��� �[�a0��^[��
���z0�e'-╤żx�
H?K.I����|�Z�%��G�PX��v�c�!Z<�+�ɜ�8/C�ǀ�3ța�@)�G8{���؍�WVg�뵚�$��W�z|H�t�s?Rm��J��m�vG\Rzfw\f��0V�?c����U�O6�f�� B&�~��]����#���+����#6h^_��SŬ��b���n���(T��?��-�o<Dd:/�uezpXe�P	Z��p���1~�*9���!^��RDMX���j<���������`�z�`��:+垃��l�3���;��t ��'��x4�$��f��͇���X���{M��E[�߰�s�]]_7�փ�.K
�����]|,�S�i�e�<e	�YBT����V,a׀w��~������L���Y��>�#pz�fr�V�䀙;/&��2F�gd4��0�p	���˘6�l>j��<�|����q�7KN�3P�������;k��
���H91�>��nr��Nb�����#-��L&2�4K[zb�;��GfT�X0����S��LR���i�M�n}�[�y�@��aT*@�H�p���3��l����F�A+w�~�4`%f���Sb��Ӝ#��z�K#�.�Y&:|�zÞa:cS��a��;<�U{�D}�`t��W0tO�Z��muS��Q�<*r���#��K�L�W��O�ͦ�|�P�����T�M��8™i
S-��@gI�ŷ1eĵ?�D���=�VU��j7v"����`�����.C��j;ƅ��&84�d��b��J
�3���nƶ�<D���:�Xx�N2\[�tx�3����z��x.��]����u�F&�B
V
1�t9F�����*H�Y�%FR�<���R��ʅ`ά��s<�s�պ�u7R%�2ł׻�ƃf�-
��7�Q�ooH��&S�3�ۛv��!'��E�<ўؖ�I=s	�>���y6���~�8�H�}ǁ���$�}ž&O1ߊ�\��|��0�'Q:�F�+Sy��<��܆��f�4����t���N��ȷ	5�Ar��琂�����+�Jڠ�6����4����Y%�C�,U�
0��@�z�IH]lR��qrQ��3s/��!D3!w�)1��Yf�m+�Q�
�'E��@@Uh����Ca1�5P��N�D��xK��)����]�Kw�����J��x�Z��E��\���K,��(Hw�)�$v��Z��{��2�����x:�܀r���N��)���	C�"F"���),E+`�
_`�hc�;�F�{�Q�N�L���IS���cw�r/;nB@afL�	D�#��:�L#[�� �����k����Q�/��S��A9���fS%��E�$��PKE��TZB٤
T$pip/_internal/self_outdated_check.py�Yk����_�z1�x�"�¨�n���d�I�v0h�sGU�����s��DY�ݤ�0cQ��}���<4�5��Fy�ˮ΍R�{���܅�Z��{���d}Uc�ꞔ�i��><�^��:Е<���B3�s��sj@7�|^����*��Ě���Y�������hd�f�.T�K�{N�����Y���K�ߞhe�OsUkU�p����'�x{�5a��9o�[�x4a�5��ٗ�-DJe]�G0PU�h�7���>��YI���wn��]�;|��;a�B���L&�٪� j�kG�׽�^JmZ���L?�iz8�
Q�T{��e�Wa�VE+�\�9*�0G�ރ���l����!���su����|��˷�\=�*hO��j�d�`���vBxP9������^��֟��d��^/VO__�J ��8��y���*3�&��k��E~�Q�e�X�v�Z�T�4݃�y��Z��],��ϯ_e���f[�������򢸾�vs����?��bA(?�8H!���dY�"�V�_b��
 ��/�{q�0�ʊ]~C�7VOX�v'���w�=��$+���a�#S������N�#�t/y5��0][�s��
�V��uE��[-�P�4Y��%K�C�����T�Ӈ��N��Ŧ�[h݂��6Z��>�A���g�=1��L^0�L<"�
��~�,G����r�G��=|7�Ч��fK"`]h������^ET�'��쒣'�u2��Y#C��3��_�+��~�9�����SJ�K�c1_�1
B��ի�U��g^u���8�o�󫞱W�M%si��]���*� �X�r�����°#�
L9CK�-Lu��HF��g�.�����W�H�N6�!��ߛ�lͩ�[Ī5�#�x�l���q��u��wmkQ����
���R
9�<�v��\.m �0~��dY��%$$��L�G^���'��#Q8E�{)�p��%��d�_-Y�"
*�P�N2Z �g?i H�
������K����?�?�`)��Y��Z@;�~�	���� -H��)�e�2�����n��W#�-����,�#{�1�J�2�
�&��F���ͼ�>C���ǒEv�[��=�a1��|=�g����
��Ya-��^���)حe�?P:��oN������U~�@z�k�jK���M�ݶ0<M�VI�81����S,�����/�
W41+ftg�vHj(qX�����bwjD�����TD�@ʶ'*Qp��!��A�C���Bק���0z�W]!�P�W�����6I�{�TT�c���<!Cw�`��内L��_��u9+�wi�{����( 6��;?�ۆ�'΢;4�eN$3��x��붣g����z�,�(
���X�6���󪧼^�V��V�?}�7"VP<cW!݆p���R7"��̽U]I|�[���6*
ڱWÐ�@-�&#�8V���=�IPت:)S�ld��K_yL���U&J�&����߇�կ?5w-��;T�q�TUX�sE�8��QeK-��l-�٦v3������P�M����`��Gvi��!���OQ�T딌��&s�������� Q
s{�Cw��K���?
��<b��+a�ȓID�ZJ}S����Jq�~d�I��	������.6l9s����ߏ�]2��]+D�߁��3Q���{�X�6�ۮ~�?υ�k$�l0��������bl�	o�<rJ���(аY7�wC�S�r�*K��6�b#Q`=�,���R��2��}��BjD��bx����Qċښ�ݬ�C���o��X��?$1���JQ���kQ����ouhݼόR�Ujߌ%���e��	C%�͐K�3�n��40ێ��5Zq@N"�,�J6�ɚx��l�I^j�#��{�g�0V��T�����Q��
��I��$N[���a���g[����zng�n���EhͲZev���{�c��'T��ى��ؾ�'J�}�; x��N�qO��
B�^��k;;�d:�=y��Dˣ�������^nߍ��ӿml�3�Ɔ�Ə#���m'�A���9rm!WT9NR���/�ȫ4^uXN	!�|\����I|,���	aiWce����SɗN?͉GD��'z��B���cf:L}���à���5��E�|G�߷�1� dy+AL�­�~g���x��9ף��]J��ٸ�Z-fX�h8?Ce�ULƴ��.Y�hw�(��]��zr���7d����tdJ�2��4������\|��_�wJ=�L�7w����(�m8��ؔ�x[۱���ȡ�}1��܍3�b�O,���c���u��А����������������y��$��$��-�Cl�5Uk�9[Lt�уt~ �oJ���B?<C�5�r�>
�x#ҥԲ��IN䦹����:��9
q�2�WdX
�U��œt�$:�t$�&�"���F�3�I��hr�z�c��o_e/����_PR�X�A"�S~���V6��E�Bhp��^�"Ȼ~Lm>#D���x$+�\��4��6NI?*�GگLJ�1�m�gu��ku����ncQC6�O���7��ɫ�.�e�/��'?]؇o0�Dӣ�u3��bᑷ5j�dyCU8����A`L�]��Wa�Y<E�:x�+ ����ٖrCq�~�\M	z��Ba�(�lhZz`��Ke����PKE��T{
�'
�1pip/_internal/wheel_builder.py�k��6��E	�ꚢ�;.Ц�!@�I���ĵՕ%U�v���73|��$�z�$k����p�dE��� �����
������=�?QKvӷG������◱��Q4��6Qm6ձk����~@�g+����<�CUo�p�p=�UsJ�3؄_�"e/ѫo�VrH٫n�چ�){;v��(]�e��hʶ�
�[�Dd��4x޴MU�U�
?Fo�N�0��/�;-R�)�_\���j���x
�?P��pdi�x_bR؋���9v8/����x�n0!�<�A	$e{1�t�y	���q�0�jKP����[��[�~f)�x^Z�vp��nF*�ѐ���gO�x<�\�Հ�����t���ⴄL�,���/��p�
�h	��7�&e@����9���+Y��Ԥp�}�\�
����vM�(��I1��ж�̉k���oE�L��M��<�k���1̺Χ�uP���0�o�7 �\֢���ON�Q>�9�-�v%|�lP�g;��20�oi,�ɇ�y���b�7m�Xۋ�h�H9��_��������G���냏.a Jq�˿���g_�yȾ�ޟ���^�?��q�WWs�y��k8�w���x^9�����B���6�n�ٔ��E��r�-7���/i���7Dx���b8���?\��[��duu+o���mx�� ~;A-U/Eƞg��Q{�I��lF{л�!*b�@[9IJX&�aC�l�t7��l�0��Fm�[B�F�[��5O��l��q����^+z�x@��]r/h� 	�Bpf8�n�~P��5,Q{����(����a΃���E/�����2}�k)ܭ���6�	GLv?�h2Ro����(�(SV���׽��	ض�F�3X��B�7�,So�_��U�ؾ�,eM;�O�C�o�Qc�`/(e9T�u-/U�A��Ij�`���7%k���1�M;"6�&rہ����䵷���&����Rk��`��1��U�p�_�2�N�k#f�x��R��<�t��lɆb@�L���3i�Jc��:�D�+!�*AN��e�*�\�R&�a8�$|�6Ot��t��"`�I�T(m~X
?J�
�
�Yw2(�X�D>@����
���2��	�;u��́2-9m��j�3��1��.������X��ѧ%�H
q�O��E�	�̑�W�[ܨ� "���)��(��a����LG���%F3	)�a�(���!��"6eDXʸ��R��pgPW��tY�.���L�pYir�҄N��$�#k���Q6t��(�{�O�;m*��
��,d��6?={�����}�*'J��hljʦ��M�E�qTt�2�,&���9Hs
��
�}�Y�3�g2��3c3B�$�ȣ�-s�w�w���3�b��@~w��L�!�OR�m��&ߴ~4ӈ�Ʈ9�x?Pjo���j�1�u�b���ə�x�^���W�A�n������LK��Gx'�ob���C����y�!`���V�����B�N"��c�hn�ڔ��8����,�!6�L&�B�^A9:?��XaKw7+������U-���#xс��ť��"1G넧8�bl9X8�{V��)obtQ
4�H�T�}[}�F�,04k��&	@e�"��=�$u�u�/Ce���~I2�S��P&�]@�c/c���D4G�l��3>X�!�c�}�>ˌ�`u8ep`G>�>= @Ej�a����@��F�+�4�xBG=��
��qĴ�%�'c֗�����ߋ�!�kEl�����QII4��
���Ȯ]�8����c��\꾮V��?M8½�6�:^&C�j�
d����H��(ٲߖ��=��N�ž����f�D	9TU�Pf5�����=ө�ƾF�l�0ӆ�XR���3�=�#�-�#]�,�S⨐v�*�G�p������ՠ�n/H�T]����wjv_��`�kӶZ��l�٠L�<��u&l:f*��ٍ6X��L�ش5�c���a�90[��aD�P��Zd��&�YDx��LM�x����<�{�\��U���o��%���@}(uY�i��נR5<T�Eg�Y��δ�h�����7eDS.��~��:<VÁ6W�"����)��'��ҳ*��CRG/S_��@�R6�䭽;;�]k����O�^���$7}����t��}pμB�ru��YO�˜�"<M���9�����+�jy7�mՔ;m�$`sQ2��ɟQ^n�����l��:��R!�Uuz�@��6�����7-�\^*|�
p3�\��ʕq~�s	�O�柦��Ȝ�~��s4KW��D㶻e�i>�hw��^^?םݲJ-��:�;��Tn�����%���?��\�rPm��u���D(i�7�`�4�zl�1-�|_��w� �͖{F��#�l�r���é���$i]Z�+�=�R�������M&�>�,�Ot`0e���ھX%�Ί^�d��]�ND�A���'z���j�@����<���u�a	��O>�|7K���eNBZ�W�8K]Ӄx_V{`8N�<!����j��0S�٢��
�n*�zn
-$U�C�M�ݣXϳ'�Ή}axbk�B��Y��Ƭ��i8 9To@^r3֙ku�a����G(��ioF���(V�~��a�rkm5�:wӻ���G3��Ϛ}��n����c�J��!m���I8z��_�&�Ss՝��������7���{(nf�b����*H��e� �U{!��t��5N���F��T���l�s��5*A_k��俱�@:�	����RǠ��e{�t[GoD�XB���Oȸ���@�܇��]�i#����ջ��B\qd/e6�o�3UDm]������g��T���n���]J�	NnEn�59*Φz��u�$[(��)�QRc/�1h�
�
�ڬ\p�)��#���A?��	���f�3��hf�v�������r��wA�OenT;����W����˦t�<�^�עh{��e{��-/�w{8!}��_�:��"C���)��`?�7�s�&�Sp�����bW�.���D���qP����x���(�@�V��bx�@x�1�lq�{[֓4sˤ�d<��\h�4��a�X{���_d�	���;z�;oA���\[���&1�w�vp�Z�gt+`�Cƻ�G��|DY�{X;P�40<�7��^j�q����b�Ő��'f�<U��O�Zr����V+~�P��c�|���H���4^��1܆�� 8�$C=f=$6�PKE��T�w�4h�pip/_internal/cli/__init__.py%�1!{^�"E�|��b�����>HigF�s~�Ǡr��(nAbb'H�0d<�潓U�C,x6*��J�u��)���,4�g!n{�Eu^0H>�>��[y�PKE��T@�_�#pip/_internal/cli/autocompletion.py�XM��6��W`�Ðe
��D�r%S���f�l�rP�HI�)��3ҿO7>H���vt������H��8��#դ�L*B;-*qjk��ho��u�v��Bʲ�-f�2_$I�X�S+�&��-�������.j���D�fRQ+�f�#卝ӗ�7?�,�{XNk�$��Kr�⾴^X	8N^��X^�<?���B�;HF5+��Yaq:�f7��/v����7:���4�QM���Ŏ�iW�5O\����X,`4�������.�Z��w��� @;�`NĞ�)�AT��N��ì�����M47�K2��CT�T���ЭT�@���,7@ yx�P����}��>�}�KH#4D�6wV�C�G2������0��M�J�?�?��)�檭�N�͛�v�09���R�63+�aϪ�`A����%o�Zv�X��f��wR
9'�1�#.p�31�ڽ�Ѹ�2�"Ůr΀��¹c�)*zb�>�7J�-Hb<���c�nmL���d��N�E�%�`��9�>Ɗ�2�0�Sв�ӚTT�Y7GV�7�V@���_�`
�A�dd�����&��-z�Ԣ�$��aeUG�lr�k�t���zW��b]c]��0*�z�&�I6�F�OC6��4Y�c����6Be�81"�,p�+��f�ں�vf�H�������mD�\c�d
��8H��?��)�;��8�M}Y��&���MC��T
2#��ˑ�'�)�y�{�#��P��.~zS�d����}Hd�'W�7��e�i%r$.����K��*�Si������+ʾ�f��24��������/$V�Jݙ�$��I6��b���U���h=��ӑ��<smno�ܺ��	6�ƞ�����kݗI��?>�}�T�����|H����ܸ���Es(�"��,��_жe`^�.�tC�Ae����l%���P�'.:j�u�Y'S�'ʍ?'l����@"gw�'�$��5���,$+2\�C�hz^���H��3��}b�og�r롔�w?o�N�n��������ӕ�;�E�����6�t�r��g�R-��1ҋ�T��v��t,�j(/g{bV��q�d��3TY�Y�P7���g��,����'��	�B>i�cސ�"��4�t�-ɏY�NF�v�	�S�ҫ����j�v F׌MNr���E���:BQ�����fX��ْ!r@�f�vk���6���p�װd���XtX��
k'ӄ��ٟoq86Dy�*���E�\XF�A��^��;Hѵ*���æq:8q_S�YU����9�U�]3��薺r�M/)��.S��!��'l0^��J����G�O�FBP�\�q�|9�qD3�)���<�u[ߕ��f;!I�t���<�B�.x��r{���0���l�6�|a:;��
�\s	ä�ؼk.ۅy
����Y���P�G�'�޲R��,�L-�����r*�j�D$=��SX�Ac�ڃ���'*�	���wGʡ���a�X�E�3�N�9�:��v�+�ʰ�o@�6��������-�05p���v{��i�nݱD�
!'���*�h�tC�e����Y,��c��V�FDUb��<*�h���\�Y�2	�ڲ�s���$2,��x�p�� �,���jW�aEL�;f5�֧`�o�0ć��Tl|-��d���L]d��k#P�܉1���s��OD`�����Q�Z�&������2����W�]�x�\�E	6�K�,N�w��
�1n�1*����-�y��/K��=]	��.�<;[���߃��Q�w�����Gm�h~�(NR��B��J3��{.q�cq��	;Xb��y������qd�2������^�q(���T��W�ӀAt�̰�4�,���lYOr{S������e���/P�(��0����)B�Ӎ{�����9Ma��zF͊�O ����3�ʹ�����\�F��cR�pV��/p%W��k±o�&`m��PKE��T$�-^
�!pip/_internal/cli/base_command.py�Ymo�6�OA(j���`���I7c]�Nw@�Dۼʢ���}���IQ�ܵ�b�P4��3Eѥ����ۭ�S�d��)�W#3QJ��U�ri�(�ԶЦd�*OJ�32�^�|}�':_�fUe!���wn��kiD"�"�<Z�m`X��Id��~�� v��){'�L,39e�-��(��E6e����������Smb��
;�̈́e��[n:�*/��8�TM��v�쉃ЅS1�NJ�R�Z���/�e����aZ@ҭ���L�C�
k}%W��J��̊��lE	4���R��_���x��\����O��������G~�0�pů���p����7ݥO�����7���킿�}����&CLȗDz��_��֎GY\��_�Rb�k[��N��y��	���|#˝6���\&{wF>+]��Je�2���\�����x�2	�.��L>�B��w��)<l9����2�X��~��gV�U�CܝķU6	�ֲ���)��'2�_�x:


������n�<m��}!��qf�0�fX�z��L/E�i�6k��`��2e%2�?���a�5��T��F�Ò��{�j���F#�$�k��.h�[s����|2�\��8�Ʌ��B������|�H��
:��|��H�8�^dH��X*W�CBUr>�2[�^���H�}���vY��g���nt.=/�ت�$��A<�{�	�ӟ�FM{�[�NJ��|4nN6�9�:��_�V�o�GǓ��o���Q��*�����x�i�78�}��9=�����_FVL��P�{�S�p�?1/�����R�!���[g��,�]e)	����J�ʍ��7[�t
(��-
e7��Q��eR���F}�Q�H{��*�䏄w�q�i�ڤ+�[0\n$�����	�2mQ��ⳬm��suN�x�����v�3���������!�(���tn $d�`�f�Ǫ@b0���Qg��E�
����^�����`�C��Y�(�
K5�?d�g5���#$t�~�a��d;9��3�r
��+���gLIa��y�R��$�9���m�5�E��e��<2����֚5��3|Dx=9%���:4B�ռ��|�nqF�o7Z��?8a��!u��c ��=]t�]	��h�Q�)��ܡ�X�L�m�5��&�yf���#�V��L�$��Ӌ��*7��	]�x�?u�w4=a��ʲ��M�ff�wc��g�Wɶ�E�B�\��Yo)�E�N��i%4V͎���.?�T�uvl�2*��R2�$�Z�a���aU[��I&E���}\D�~�8�TOi�|�4�><5�L:�8��R����K
�����5��v�Re�s�L�Ӧ[��XZwr
}?Şx�MO��HXj�>ti<8��pGtK�\�rP��?{?BD$����&�)$26�,D���;����p(�k��7+��d�����x^m����u��Ӡ���4
ʴ�za��"�ivh�ba��8c�۫����T��D�J
Ma����t.���y�>�3zf6maX4̈|mt�z����2�4�<�6][�e�=��[��堣�U�O-���#$���=,"j���AT�1c�p�ݗ�]�k�q�}����x�,������M	v;y'+��
C�~�!3�� ��`ږ��ɍt�__i�2��s��u�r��rb4���E6�R�6�ɜ���Έ��j����+�]RW9��U�HJC��i$�
��#�!�N�`'��&?
��DDTȜ{��;���x+x?2Rbg�%^���E����(�Sn��8|�bFd��;����-�Ic��9��Ȥ�*kݔ@��tB��2�gAbrV�"��%	j�|�P�z��
��	l���}e�Ol��u|0Յ��J�ǎ�o�i�c�"z���s�tRu�[I��FZ.s�����KN��C��ɬGv|Nd��t�r:���;���!v�pM�.��Γ=k�C�B�R�Ne\�_R`Kjdk ��u��*ue.�,2��NR._���|8�_4W��qO	��-]������R9�Q�q@�78�.BM�t��6��;Ƿ���g�Q�
�	4=�cW���H�u��0�؃;��AB���������{I�y���Yu=փ�9][?��l4%�avj�T.��8�ׯ��߮P���fSug�����)��V�F��L��4�8�n�OI8\*N�B>���C���/]ow��_Z�_Tt�'�o�"�KEĩk�aY���:{�+Ss�85�#i��ڼ�̊���O�%�DCuA����*r!�!�.���k;�?�\P�c�-�Ԇ�����~h/߯�/~�=��r�cɕ�#���u~���&�qۘ��$���-ꐿHH�,d
B{׿
4���	+"_)T{���$�?Y����R]���gs*�[�ʁ�*G)?ٿ�
g�&�[�S���v�7���ct�;���ZS��=e�B�n�'o�kL��PKE��T�iMT�!upip/_internal/cli/cmdoptions.py�=ko�H��+z$�IL2��9�ƃ�z�����a{f��ZJjIS$���h����W�(�q�	�pb[dwuwUu���E�Q�J*=WE٤E^�$��eUl���z�UY��,-3�V��*�US��^���}�|��j�i��J�I�&M���^-�b�d�6V�[�����T���'��6+����q/)K��{j��𿪶
�6�h���sU&U��X�i)���u�d^��`�y������U���y�9*�gπcu]���z�u���g�79��(��x�Y"�N�y|��)���u͊�@�`����0
뭋5`�����Ej�i6���z[n�0�*�5#;Ɏ��d�>:J�eQA'����xӤ�y��%m>����*)�U����YSY-`y@���ˆ�L��ꗋ�˳��ɛ��C��&d~�FF1.�[5T�&�F�͌l���"�%"Jޜ�@�S�w2̀�~���I6T�`�#��'��E���.�U&쒀g�<�%Y�O=ɓu���C<�Ҙ[�~�E�H��z���3-La���ZgUUt�ȊYt����rrzr��l���8����lRV���w�Xs����I3&m�"3�LOO��#��|�ߛNۋ�G�6I��*��
����/Q!^%�J۵^]_�������՛�����i=3]���b
Lzt�\
:6��o�YB��LGGG �T�����h�E��;n�(7[n^�K�r5�A�\�z|��nl�}�pAtH?�6Ⱥ4����<P̣�#�xR-k���	��'#�r{�ۙ��v;-h�(4x|�cq0_h�ZD�Gn8V��G��ٞ�d[?RQ��>���2K��`08r���k��urgNZ�O?Ǵo�C�طC���
F8��I��b�AMT1�M�j@�)5)��5�׆��&����L�#��Y�Swz[{+���~�������y�&�\n"/�e�v5\�^�,�[�!�8���}�%d�~c!�l�gw�,�L7i6����{���"���>6������
q���E�zXi�w�J]�j�Y�[�����B��
c�S�vSA�l���)稒�~�co���t�Q���f�$���&-\��I�h�u���kC�`B�s'K,Zq8PBG�4M� $y��$w1U
�U����f֖��:���s2��[�h����i7��h�L�i�T���ۆ�v��T9Ǿ}NgB������V,;�7���M^�F�n1�T�z�
�>4ȣ8�N�`���I���r�mg��*+�H� 2�vwƟѰ�)টkPn�4'���
�,i��!,�g�a��וBˊ6��8�ш!{�h��[���	laX5����M@3%��6�z������~�L�=o�4�4��dI�6��[���"϶H(�,��2��������#�kM˝kt64�:��A@Gh��?C��A��9/��t���9s���7�C�ɼ�g�<b�j
�D���ck�T�j��}��/f�9|2�K=K�L�x65n�-1  �
��eV���
��U�$A��F�t�	�W{1�I@2�|��%$��s�n4���!�t[~�����18kɈш�rd�v����
� 7Bk�)m��(/F�<!Ŕt�@@.1G��6-XY�;8�2H���H��q�hG���2���p>�?O�q0�G�:[
�m�l�zb�R�me�ш�M�ipţ]P"ʑ��i�zF��¶F�O�KW�"%���>|&=T�(䝲����a��+a����O=���d�ws�quC�2�V\�%��/����8��fi��U�#\Z�\���3��/g�aW�4�嶿�&���~dt��II��`��ܿ�g�E�ϏV:+'c1�������4�7�
��F��5B �i��8�H��GW��D�b��0�,'�44��f� ��6h���h۞�[y�t{2z�{����3��^袬�2Yb���4u:�Xxt�ԛ)� v�/i/�d�V�8��C�T7spE
/i]����/@�`'��; �r�S1%7�@W�	T����iU�ӻs��������*a���H���Ia~��$�<-g��D���SF�ܽ���P��'ۧڐ��(�������ߧ��9�Q�b}����%&�F�� bVl򦅃�����l�)7Mlc4��y�{2c�zJNp!�jR�Dj�ؐFe���w�&�P�FW�5W��	
�"#C�����5��iS�{�w���j�'�#�8:@��n�$���䩼���2p�o�0�����Le��I�'�?���z��./�]2������ӓ�FT�p2}N� �l��H��49�)
�@�烖ͶԀ�U��u�C}|!'��X,�����a�#��Ԑe�Ё�`0��PzC��bq��r�k��xz⺭
f�}#��h�f��׈��>�u��R9k�Ð���|�����9:��i��{��w� 8�ܡ�m��?�|�cB�@�uIΞX�o�o���6;�'�e��[s�:�,Q��ڡKS�ٺ����o�����n�aO��aQ�������C?un�u��'ݑL��)y��7k�o�S-�Q:��С�5G�d�$M��2��#�yԿ�?H0
d���8��`��������Z�t����H�y`�
�k�h]��4/��݅�p v�R��S7������}�N�6+��%��l4��
��-t�z4�F<���%�{o;dl(g9d�?��$F�Ⱥ���bǃkI�3��B~��N:{��U�z��l5T�t@�4��a���{:�O���`*{{�������<��[yvs��n�Fl_��4�|��'
�b ���]��_���=�fs�[ I*��w�4A�+�U���:����+���CɅ6���ml�������4�Hgۇ�e)�|v	F��}�6���O`��1 }|���0Zz�5k$�G���+���x�9���|�>���q%B��'�*;H�N��r��m�zO�#6��˷-��\S�;��S��@}���C~u�quN�;q`80�ƜQ��BfJ�ˢN�� r�&�xg����V!LS�;�\�(nȱh5'vFo�$%��\'kD�tS%��'�i��u��-�u�Pt�xT�vI\&���@mS4��#Ӛؑ
 \-��)VWL%��$H�6Ө���+�|�`��z��监�BԨ>�&�����F��6��,��jF�����m&��3e�2�����P���2�`b���+X܉�Z5댄�i.tdk36B�I��
S��0
�+�\G��h ^��6%�&���U6 �u[�mKӀ��e����ܞ4G�M�NG��'`Z��}k����P�ajˁ��ɠ�>[#��j/����)!�F�o��>�'���ͻ��O~:{���)��89B|�ﱤ����T�J�kDe�Y�T�؛�gD�*��xd������7��Wm�yGp���Y�]��y�x�x���۩���Q"r�2ED�nj#`7�}����p�0
J���?m�EC�s�V�x�� ���`N��tZl��^�Ҡ�P�|�t�*aW�ˋ/Gʹ�2�u�mЖX��gfAg��Ā5J��t��ij�1�W��:0���F�&$Q��,�A��	�aj���*�g�.�o'�ϥ�Ps�+���dZ�os��MjɄ�<�{ɾ��������	�z@_gLs�D��4K�3�6�ɂ���~�е1����2,n
f�����c�Da�̨B��f�e'aT�Ma6b��y������10}�'E�@?<G�Ū��53�_)9����lSU�q�ҥ{�YW\~�I���e^�,H,u�om��k�YP�l��M"S+ͮ��ڼ6(�b�Y��n�v�$E7P�w"���y{yL��u�AjM�Y���8C��1��vq��J޶1�5������?�9��-;�Ř{R��W���aW��]/"�Cu��H�,��vP�\�;1���HN�xc����������C+��z��W���&)��	2V'3�g���fIj�vz�7��T��i
M�� ���aL����!)��O��)8���oAI�����K��`�%�X
}�5`�Ű趔�$$3��X���U��x['[�H����k�YZi�VVAԺm^�;�k�"�u8�s/�.<-9���x�5�Gx�2���O�_��D�M�]a*_��˝�O3��>�0P����N<?l����ۡ�w�B�w�J�H���C�~t��(4�q9���69��-x�@�_j�[��Z4m#�QSf�0�Rn����>���[`4�Jo4_5L%#~��ͨ����*���Fl=p��e3�@�o%K�%����L����%���no�C����)c9���;@�+<�z�]D�"z���J�
���F��$�X��͈��OL���4�+RC$8쫿�Gζ4�:B���sΡJ���	����vTbY�|���,4�]�7��)Q<Td� b�O��_C�]��P�=��b�$�ɀ�Ч6��z�sե��!�ƸT����a��M��%1{`�����Js�����g	��2A���ҌJ�n^��2��0��aƳY�
5��b�޼���D�j���w�K��C��m����heb��g�Ҫ���T��9�!�ɋ�G��2�3C��}k�}�����t����>K�^{�z��˝�G�[ ��Š�4�Pg���������c$�@˜N˵ ��a�cwGj�mU���yp̗.��/Ժr��C*��Z3�F�;�;
���S�]����봴/_3�tp�7}�v��=9E[ؓ
��.9�Y��'s���)�-]�P;�3�U�7�m�Tt7s��Wi~��F�&�.�@���e;��@Ԫ�c<A��y��_IÙ�����9��[Q��i^T����$YM7�8�K�I4�1�`6n\�A���n/�� �Ż^Y����Km9�-?g>H}~���W����ş3��O�<�Ҳ�s��jXB��H�I�-H�wޚ�Xر"��Wn{�T@���?�Q��A{�Kd���#"�(����rm��.���I��G�m�����^�\�St�@�d���پc�#~<3���bW��4
 a[l�%�嚟 <�o]���񽵖�$���u�u!�����܃*��r����b:ݳoY��]޺1&��(�i"᱖H|�EV־Y��WL����8Z8f����R-��o
��{���
l��n�ۨ�Bnhy�������Ǎ���Q�#p��F�
/��ʎ� �"��R2l���
�9�`�k�Cyp�B��Gtn��_��L(B9��$XD��Q3<�I������O��B�v&{}�/�.�b���:���+_�1h2�;Gb�t��ߙcg67?ǟ{�<�lʠdQ
v���[p`tL	�	�UH �-���
bsƨ5���O�@;���
��}C��)���<��R,ˀ�Q�M1�Q�t]or���b��;�VǸ��-p�ӫ���(��"wŃJ��<��x�b��5����|���h��Î�Ov�`�>�������uC��6���eRD�Ny`�O^++�����!]�E4�R�n2[ۆb�s��?_~��t9���
5���2����l�!O��K���2�71?��5	Yu
�����)�ZI5�[��~�G��>�$�cu��@X�Úlɶ�����w��J��09���ǧ8�:�p����g;���/�=I�?�3��n��g���6�+8x��9j=��B�k���᷂��9/0�>h�o̓J�Q-�Ɓ%�29U��]kl
��e)�H�VT!L�7d�?|'�`'�������5F�BX0��}�}��c͘��]G��D�'l���¢��႞rsD�ĺC����O�,����3��v�hu�v8����.�Ӏ�o_~�Zj�`�W�R����b�y�x��l�r�XlWdY���g^
=s�<@�v�r��L<�̌�v��f�n�w�m��>���'�L�A�~��b�IX<�N��J�"E�F��{V����x�dӥ��l:�`	��`�Hq���#d�@�)K�kQQ�Y�����3���vXoLfwls��٬���ߡa�g���Y�zeBԂq4�lm//U4��Dh���=\r:����2�@X\6��
(��� �pɹ�ʢ�)�&sm�/��k&��{g�Iw�N��MC��1�"tǘ��	M����j�V|������i�mg50sѪ�(6���e2ۂDZ%�)@8k����'��	���(f²�;��7�D��kx�i�K�i�	aڊ���94�Jr��m����":1*
)�A����A"�(A�/g;���-������E=Lc��Lk;+�SS�|�h�<%y�ƿn9������8�# #$����(��X��ck
a/���@&hP�//�H�}�^f��W�kr�w��+A{N��[KK�T����f*fps�5(,z�s��l]a
�>r�c���oI&�f���dm�Z��.%%^T�"	I!�����eԳ*-�������ӵ��!?Ms<PmQ#���
��@"�}{�t��8���6��N͕��] �C�Feus2om�hz+���Fi�dk��RnA;��T*�,ʦT�N�z���n�a+��KlW�"N��/<��Bs��<�j0\��Æ1|��T�N�1P�/��LqW���z�� t<�bqN���jTi�"���,���`���5��)~�%(����n�cۅ�&��	4�'wd�XV����9��E��{�BB��J�y*�c�C����!\Y۲M	���d�^rǪ|��=��򹰲���]@�]*7�v��Ak���(V�(h�Va��]�����_;�]�Jˆ��
�eS�t��G�68y�!%JJl�,�k��N5���ZWK=�/g�J~�97H��4rD.ɖ�x�.5^��zUr���qIfj�P�nt-�*�KfB�����l��;�t��ٰ�	�04k���a�/?���)a(4��(�-LE��n�r��
���D���*����
'��\�۔E��;5��>㶠���+;��4�-AU�+�5mYX)*>�it.RxrB,�{���"�� ��^F�cP��a�Lݛ�A�\�gB�F�Ƈ�����7�~9���x
D r��j����KwA�0$׾8�	�d��/�q�V��*��}I�����3�i'ZɕX-�KTBh�gtTb��b�teP@�ي��l���X!��s��829n1.q�Y���W*{��
��	ˡvb���N�hv��Ki��%x�,DgC�.u¶��<����"5J��e�6�e�Ժm���׌a�bQ�R�僓R�zL�|�H��G�K�An�X{ғze�;W)��#ƪ2�8��5��.|c�~�J����HF�:E���?4O(>[��d /Ћ�vTK���^�~�h�p{�e5,�z��)�#{�%�\h=�r�? ��$�$OEp�"�W<ta�nvt5�k3�� ��\�0;m"��>I��8p��z�L��
��Ns
�L�B&��M	ħ\�ܥq�1�q(�V�dbs�Ӄ�W�Y��IiS9��hƭ)���o^|�$o]d�P�⋤n$�@q!�eh���L�0������Sm�J@@x�H�(C���#�
=��!�
��8 �a�^���칹u"�a�o"�{02����U�A�#���I�w}�]�h$y0V���m&�	z��/�������wς����nmu�N*���W*��>f�wcǔ�
�7�o���x�{ �C݃�B���+
�byA��=�d���C�>�>섥��'���5iI�������TF|"ۄ���<�����2_����=q%ټ�PKE��T"GM-+$pip/_internal/cli/command_context.py�R�N�0��+�=A�|�&kL�z�x�l�
�nci�0��A�Ρ�3oエD[������પ-����?�qXI#�������G�x	(ɺϬ��]"c"��mD���g�J�e�B�˵lGW��#��͖qW�\e	5�˘���Wk`��j�0�Ӏ����H][T�?���G�X����� ����~�MC {/6��y��;���4�֕��F|�D�Oܾ��V��A�z��R����(C�8�#<'Q�=�p�x>{�.���O6WrA�͊�t.d)!f�PKE��TjYd|��	pip/_internal/cli/main.py}Vmo�6��_�)f��~5�E�a���OA ��IbC�I�ц��=GJvҦ3`�/w��=�B�y�ũ^�I�aЪ�AY#�7
V�Pdy�g��B�Jj���V�v�Z������^�i����o��y`RgIdPCQ�9��V���l?h����/N�g��T������+��KS������P9��5蹢�Y�>9g�[�cP�,X��(Q�eL�^x,Z
��lU�F�T��,ˮ�G+�
g"L-FO��]�E�����G��H(/dԑ��Z�ʎN�T���n��#J���/�׎��DG��ځ:yT�	�&t�mFS��x���7���������Rj��?�<h�{�z��!��c���0��Z���p�1�R�lg+�:pG�ǁa\d�x����@��:�� �Z��t!~��q�i���;2;]܁kW���iw52�[�m9��	t���}���D��{EjЀ�#T�%d֧�	,�;;�Z��{
�5$]����YN:���.�īT	���"q��ɍ8�x2���*r���I����I��Be����a`\8.�M#/����$�e��lbǖ��Q*�k�_%	�e�;�<�?�ʪ�l�.q�{�x#�V�\�4���ǚ��T+����K��+&����ĺP�9�8y�15�ٻ���3q���}v�0�
��#��!�`�az�Ft(��Y4��-{[��V�<�p�]�eGW��#��
����Y�g�h^�^6�0KGl��VpY�E���a�B��܊��_ՠ�Ld���:7/@Xy�ܘ����Tޏ�
��LE�:��I��<�����������YCk���a�1G��ı�|��O��t?��?f��J|��Q��/g+��1+����v��cۉ4v}�x�S(��ֺ�u�$�Z'k/���5v���2�N^�^�z}"#먐���!��G��'�`��?���ߋ �o�����RG���B\?�w녻;�]ȃ'=���a�SYn��b�h�95�r�|�E)>�eM�я<��<��Z�������(�o/4]���kx�H~C��TN��kj��:"�xF�VS���rQ�alW�Mkl����Ȱ�8p:���sb���V�bP�j~s�W�v�lr�p)���Gatf���eVg��?PKE��T�o6
 pip/_internal/cli/main_parser.py�Vmk�6��_1���R�i��tJڣ��z�O��h��lI�d��w$K~��5$�</z��3�0�~#�F"���P��X=����
�W��#B�E=�u�K�J[P&���Ij�Z���E��<��d�����Y��y)Et-�J�V�/8�#����Z4��ޒ�_}��	~ÚҚ?P�o�n��47Ӫ��Ӛ	DX�(	x��0���"�n���G�3:����ƃ��0e�p{�O�	��L��VM���(�GVj�W�b$�e��[��NI�TX�}�-��ܠn�=T�;b�4�Aӑ��BH7���{9��`<�Ȟz��7x`wߺ��/�8�ڟX69�*���h;����l�ca_-{��C:���Tg.9,�Hw��.N�W��ı~���
��n���C񈅫rF�oܩ<�
v���(zg�o��v�[�E��ЧcH3��c��Ѹ���L����3��SOf��k�z@E��{M�4�L��b���w�)�BSj�qx������;8��e/�Z�~�����UnZ��+[*��6��#�U?��b�*�bN�򮰐<Y��]���{"�±�V͗:U��;�D=����-��pگ��V�FZ�+KTג����(2��h�@մ&���APW+0��{�NXAbt	ha�-���it�(��K�������#�j���:�-q��`d���hQ
���&���[����n�Ӻ����JI�9��(�l��2����s�?ɯ2gs*QP�Xoϵ�5Ui���ע�N��~.ݚ���Ο4�3]����ɥ��`�v�gag���ϟ���$�^Sy�X
�@8;e�j���	�.��"K�f����'�]�r��BC�����[��IOv����g0̀ƄY|}��1G��4n՛�s�o��%z�� �Xb�żcȒ�G����3�E
�"�,e��f���x_�ː2�AB�o;�Լ�5ߨO�>�$�h��>#��i�9�تOxMB�n�k6�'�PKE��T�����A*pip/_internal/cli/parser.py�Z�oܸ��QX��J�C�,.AӼ4H��Ң�[����Y+�D�����>$R�'�
��9��7�M��oT2":�EK:�K����%Irr���i�n�۝{��z�{��A�f|:Jw��Wu���dۋ�D�/~A�С�z&����,⾽h�9y�+����e=U���{.�ůCװ3��]Qr�ܷ�)��RQ5Ȳ5��ڗ����_�ן?��(�-�
�
��z�����}/�%��,\V�L�jZ��j_�r蛜H�+q!Dsr���?s�.vL���Ҳl違evrrR5TJ�gJ�Κ��T����H�0R���	�4��t8���qr'W����='[7�F%�p~Ͷ��}rU��d�6'�h��+��G�.��nj�?'D���x��U:!���a��\0B�kYM��ڏ��6� �b�sm�#-��:9Я%R-�dR���b �r�U�p��=]����oƦQ%H�A���ai�~�!����\0b�@V���B��M�3.���`�kiEi^�&��/� a�$GP�зge��y��cܴ��X���ۃZ!# ���rs�<�$���9I4�%�hC��B<8�9��Q`
�6[�,���590E�Y��dV8�0�L���ʽ
R9���rŠ݊�g�۳������esz�V�Vg����Z��"Bl�8��L�s�Ϣ��j�$07��]��:]�3�b�p�$6��jX��dF���:��4�ҧ��ؾ�d����N�0ƌ�p 8�"\�V(2��N
��h�„(7�h�5z�{�z-�:SK�M˼X�J��w��.�g�{��k��#,�Db�g�%Ʃd�d\u·��IV��ɂ�A��|�;����u+���g�$/��i�u����k
A�0�ly����	��xẈ.~�;��_�7��-��l�FNd�0�ߦ�%���f�\Z@|!!�#+'���:�W��i4p�EC�K.Q$��'�m�JȮ�٢AZ���m2s�z���K��m-�`k$�gҫ��p�)��H-�1��q���8m�@����3�,Pv���dZs�Iu\Q[��h�C��f���fr4�L��=$�m~�xg����&7Z'��7�'4���ǰ�R�S���:�8@Hk���
�L[ڶ%��|�>�)�Q֚��~��w03s�	�Q.D�����\!��+c��E�����Hq��_�p~�{Ŷth�w�O(�% [("�z��3SH�D�IGl~�C�.�è[[ (	F��\S|=䀟!�����Pu���
h��Y� ��@��#��2�,�����(k���Q�"s��t��4h)-�c�4P�A�{�⤏�H�K�$����RС�z�����G��
�2�����n�:��GmZM9h�8�3����p�*���BD���d��<��Tt��X���7��딼�E��&��k��;45���߱N�;Z0�b�1��k\�Al�E����@��%-_K�}ѳ����¬<��/:Rc�	,�9�3?�F���,��+�v��y���+��)秲n��[$��wzA��F�:��+HîT/|P�s^A�:d8^Q��XYt����z�m�fݥ�k�]/���q����TB��qB��S뙀6�p�2g�X��d]1�U�`ú0i�–�$�
��q�^M)��#���YB$QX#q��R(0r��E`M�ƹȈa��zϫ���0L��H�=�.m��d�ݖ76������Ůx)�4N/�[�m������2��R�+.E�����h�
���}&��&�[Z#H���M�tS����}Fr?ґ�R~X
��%;Zxkj���T�B?�v�z�)�4��Y�׊uj��?q�n�–qL�@%�J����z���POM����p��
�3�.����f�}
�m]DJ��a�>��=��׺Q��")mrm	����u��(m��th-JA�]������Td#z�y�Ϙɒ]#.h�䓑@Ͳ�Y%^�;%�М1��p��Jy��ª��M��[MbX�.�٤���Mo��z�۸�z�����v��� �������0����S�w��·N���1�f�,�u#��ŰK_�J�!�����ٟ��-WgҬ�Q3R$y����ŀl��7�,D-��vZ�*F��$����l.;p���`+Xۧ�k�M���o��1
���|S��~\������-�phh1�9j��L/�*�|�R�ᣡk�_��W�(4�;}�a�9�16��n����f����0�R
��U����-eRA��(g(�$�)bXoO1��l:�1�z��0`�^=8�W�1�36V���u䶅Բ�B�%C]�}*��B!�P*JZJ�|x�y<�V�^�����3(�+�uz��xT	���s\aAI/oڎ�yB~B�EdB��#�!<Ũ�]�����bW���܄u�0�y�k��|� ��}�hp��i���(�o���4͈U��X̃��'����񊇤oT��E
:�~���Y����Y�y�"�uPH�]����k@wY(2a�8-�h
;�����m��⼶���	��y+��wS��z���#��
0@�`�/92���,.J%�X�Q�>~�e�b�.�F�.V���(�oY�P�*1�*Y�M��;�O'	Gt�׃�C47F�-�	Z0>#��y�dV�e0�g2@�E�v�t�_1���=�� �n���k�y�&tS�!�c�@��������12�a�k��r
3bm�cP��ށ���F ��y��CX���e��0��w�
��$6F��Aw�����a6��;����v�L}f��j4w��7��KV��/�
��G��ԯA�nL}�c?h����<���@N�_���p��ة�C(߰R��+מ�6�(����u�z^��0�*��]s3��65�3��EC	ۛS_k��P���qݨP�B���IxzA�xb��TyPt�y�=�	)9��|��3Rw:�{(�E4�l7M�^T������cS爼α�pI�$��W\}����}(����=D?��To;�{��)�+~��_�6@=]�P��U�͓��ҝ��r�ǟ�h�xUi�!~`2�eT�;�Y��X�H���Z��@��΢���u�b
eyfp���׻b@�6F+;g�ۆ���lM�i�a"�Azg�����e!U�
�Lc���[}�_PKE��T
6O��"pip/_internal/cli/progress_bars.py�UM��0��W��%]��R)X`���ު*r�Ikֵ#ۡ�g�{��R{<�:�<�"��6�FNki���#�s-�D8��R��nQ��N�>9Z��v�ھ�Nh�eM-1
`���;�R�Ԉ��F�
Z�����-��J��{}RR�rj�($ދ�8�}�滩�=�BiOM����$�-�K��P���pe+4�5��i�B+DE�8!m*�~?at��<JT�{Ƣ������B����ͦ�|�;;���H}o����
rOs�Ӝ�	�`
�P�U�!�����3�d��5PMT%\�� �'�Y+����"�cA�ӊ%�‚=�F���<��!�	��
�tp�%�,
�W��i��8�$�*"��L����â����Y��i���x�wE�6={i��0����/����򛭒Ƭ�b&�B*�>�^�o�����˲q��
��i��%Y���a�����_j�d��/������i��e�v�W	��B��&�XhUf�_Z}�()n ��e��1W/�<^�sx�J�d�;`��;0�]U�@qhԣ�avgE���N3��SS��a�e�/�sU`&Q�m�jՉ�϶��d��	Q�)�B:e�C���AP��	[(�1v������#�
���4��6thc}���5��Sl��j�D��{�< ;^��ϠW��V�L�~�H�57Np?ڑ��_�2��4��O��ܵ�8PA�U��'���PKE��TdM7���F pip/_internal/cli/req_command.py�\mo�8��޿��|p;ז33�]�q���;1։}�w�� ��͵ZҊ������*�")Q�����D-��b�^�*R��贮�LT�u[�N��.�
��$gy�I��Eֱ�7^���.���x����v���B�]]�%gY��Q�$o�6�y!k+WcIV�ݢ��+�Ǫ�����,���DU��Y��E)�=��:�Wρ��垉]S��]��vY�o�畕%�d0��兞�r���.�Q-�^Y��[�g-͝��Ŧ�wl�WyWץ4,�\;���m�t�d�_�5+{�{v�g����<=}{~��?���~�.��V��@�Y�b�}S��݈&NE��^�9�r��������4�wEM��L�� �ezi��[C/x���:UO߉�U���s�Ҩ�y���]��AԽ��eq&Zz"����)K��j���?5�5J�ҍR"��ӬPgPp^�Xr��H��o��|0�aނ���5�.k�x�6�nVgԄ^ӳPߊw�u{,���6�T7���Q��i��|��I���3T`�
���y�ы��x�]�7A-�,X%�����\0��Eu`�)�J�s
���%_�_�`�3��$�mؚi�7���jq8�2�%w�C<�Ȧ��t�P?��;˺�Q�d��
��
�z�r��}W�3��~`Z4)����&�m����wMZ��_�[x
FIƵ_M��`�ܚy�t�Lz6%g��F|m�g%�̘-�X��GsL�{��ߟ��XDZ�A�>\jw�X��UO�Ǐ��.��2M�l���p�X|�Ҽ� @0�^v��S j�������� �'�0�#6�զf�ɖ߭�7oU��LH�y�e����6�G�f&!.C�2Q�I�
x<�$�w�7o�=�I��ގ`B�,�r�삞Ҁ��O���(�et&$����aG
�h$`�7D���S���80]��u�癲d��- ��^�m�zh���b���-[s�
!��,�)�~H��-8�ʉ���Xc�PK\�֎[�X���뛫۫ӫ���Czzyq��5�@�N[O�����H
jC�!t��W��HL7X��T�z.���@�nH�AEE��K��ݸtV���`%����.5��
�k6}����Gbo�Aq;>FA
�iߖr����4n9ш�7:�M?�����r	S�QK��޳zÈ(C��7���GM[?�^��a���d�o�2�4�v���XTՊ�h����;�PB�n�8��s���O��.�ĵK��]5���@����dP5��GtFz4i;�b7��J��Z�%`*n�<.��/8"��������f}�
*�:��e���;�M�� ]�49�7��?�u�� _��1x
1A5�MMs|�/�+tS�0+�Ҩ
4�p&_+8x�X�l�ٔ��J�w�z����
�k�$�(�Y_s��0��2U�m�5��Nt�~�@�X���ݾ���֎��=��=&��<o�"Eˡui����G�=gc�)��%�B��x#���
�f��q�J�5ۀ|��ӮNs��؈��|Z������H��dp8ó���
�v�j�]���1�W:�h�l�0!7��(S^!f(|���� b�s��瀐�]G�s�����!�N��Bb��EO� ���NƠ���䝘5�{
�yX�h.�!Nˮ�0� ����D��}�[k��Y>�`5Z5X
���V$1M��~�men�`k��jNn�so9���W�4& ���Ѻ�:�",���`	��cg��4�g�ٻFM���#�ie�Ae�cQ�t~H|�h����C�F��Ѐ��	h�%�n��B7-@]m�]�e/9�AyB��}�!��ybwJ�O|2�p3�t�_\��8�����#L���0h\x�0�P�RYq<l��~��a��Z�nD:iT~���c[������B�}��++�Sdu!�d�_ir��p��IE��^j�I�lj�؍
�T�mP|JX��0�v2��hK��b=�+<��|H���:<��������if5�n�����j�O�ك���{ה���d�,�b�{�J1O��)U��"&p㘻����ìY =��)`��4|;S��j���G�s++�G~Т�ɗ�� �1ᠼ�Z@<6Q�p^f��(�fs��I�H��[����J��`8(,����R:2X�\j, J����I���ʆ���)WG�pd�"���gL�q[TM1�˞�1�ЀI�����~�f��r:G�,��.�C���0	�GtsSSP�	 �H�uY�*�W	%�m��0k��g�1��+\�[J�?��������py�ޞ��>��I���3�i�.��/�g��
y���w�Ƿ����o�C�n�'%*��'][�S*6i�Wi&Ӷ�uA�07
���Q�>e_P���b�K%>k�r�)��������";Q������Em-Q��U�>ˠ+=�.�c�Q��Lh?�53�k��P13��zlï��5M)�x�-�ɚ	r���<f�6��3�ϥ[ET.E�@K�2@{�(�p�W޼)/%W	�i$��(wLgϑ)6�}�B6�6���/������Q��*1�h���"��GrNK��]C,Ųj��aG1���1D���Nj�gW?0������䕙n�&�D9��b��;+�Ӣ�e,�c^Kڀ8ƀ��\���nW�{%	�E�ݷ��ɫ|o��RZ�h�������	7UjmL�Q�b4E~�*w�0�*�g�;���.a����
���R�D:0���.zմ>h=ic�����;܃-pM�P�V�����$���~A�o2\=sy��U[S�G�Ҽ�Y�7Kt�'X� ����XR*j`h6�U�-F[┦D1�cU:k�
C�a�CWO�+l�v��ܜ�o��rH+��c|��Ē�h%@�eg
�������_Y9qw��;�����_T��*�-~xe˖[�$Xr��(ZL�O�88���&5��QU|��&jï��i��@��3"���m���mU�ǒ�g��C
Bq���	f�gZ�U|,���;r�< �*�1�cV2��bP�)��w�P���_)lO�T�Y8�֪7dZS�[N�/�&[+�Zi#��x���њ�3;�Q�9\xf�"%�qV�
Bg{�b����G���|��Q��6m�~m���$�eX :/��b�[�o���8�uX����b�I�vP�����ƆE%���!��
��Ӷ��eC���X4I��o�|�Ǝ�Ķ��6w=Շ
��;A�xqGZ�4�q'��h�f��ޙ����Q��ek�N-�΅���D�kX�M:�3U�ؾ4��M�I�����
p��Sd����T�O衶?q7��ˠ:x�k��'�ɶ�)�E�z�=�j���:���Q#�\�<hA��=y�YS*�X3}�.���G<WF�LvG`��z�_g�84���9��^��*�jx���
9�6����^�v�:mV$3;I���5��� �V�K���ѡ@Q��bGq�=������n;G���IؓA��6�P�D�']�!Ӵu�S�O[8az��-,��p��rM�!/�̊o6�!@n!�r���':v��l.	�������H@���~,q��
�	��@s���DI�aD6����{�MP9�D�;^�aw z��3+���\łd3�jihMRX�-����]�Бx�V3��[��=��n�o�T@V�7�M�>	iދ#�l��餴��I{�u+A�ߙ�K�U�y9����6�L/��'3爂�ʱ��:׬o�Zp�)UE��t�� ��G�@n�GX.��95���7p��ԧ�o��{��iOg�1[�8�?�]	I��	��~~%n �rN_3��ﭞ<��5$‹��̃�N�K�3��#�CiN
i3�S2���0'hB����`�m{|�(R�,z��H!��Zo�	u�KU.��<�琣�t�e8�x��<+��;�)��Z�Q-ۥ��J��IÃ��fϰJ_���y��yXݭks�.<:2~	��f��e^�L����x9>-q�
�F��L��8n�d�{s����3}7K`p���l��KM��}l2����&��.#��~��,�=Uh.������n>��O����u��z��t���W�����܋���?�~p0w(Ω�be����6[!AM�h�F��>�p��o �=MHŦa���;��b'�n��Y��Ӽ^�
�NΧ>N��׍��b�Q	v�~2�f��ϱ�6|�e��)�ac:�O�:��\qVW�YQ��^�=M8۵��%��\ʑ�Z$#p=�(4!�8������H���5%��rO�Ux*���G�F�5=��TtaE�
��t�F�fB櫯/Z	�酫����ͿV������M��5�<Ꮞ��#��
�ٳ��sͿ�?�lj;������K�JwyV���|�.6����T�D�ۧ��=�L718@-H�RsX��	.S�e��\U����a}y���=�7x����ѱ��/:Q[�x��9��5�&F�{зg�h3W�W_�a��e+y��6U�?@������,z��8f�נ��L\����A�6���u!r*X�S�$b�:?���T��>}J0��k�&9W����H+�Bz����8�����]c�Z�t�I�S.���g���&gD���aٺ�1�����y>�_�3!�B�#�2��KV��9�g�9C���T�u�bT��}:4-u�J҉U��A��q�C����7<m��]���I��6����#�'����ݒ��m���;W}~���:ru�:�9����|[7����~�y-k":WsNo�P�w�׏[���u�@u8O����)��<R����>9����sᴃI�?���:�"�D�>b���5�����I�:�N�B����>k���3m]!��
PD\�}�S#�g�m+�,]�*k�n3��7��L���wFʾ)z��?�[s����сt׾���PKE��T;r�ʒ�pip/_internal/cli/spinners.py�X�n7}߯ d�i��Mu�"q��
�	��KI�)rKr�����e/ZYr�E���r�3�᜹��
�-ɔ��|���-�V)a��.ի���W,�k�"vS����Ő��$��*����C��T���¤�Z�V��&�.�.��GC*���ș��r%��љ&���)8���t*�M��$I2A�!�0N��9��IB��ٜP������^�s%#�}4�a�NV�`+�f���J�!�0璛�1t/TL
l,�	1V��h�7�f�߲hz�{�As�)<��tگuxk�3�.�7�Y�s����G�~���
�e�-���7���c�kX��٪�gT�͐<'e�S���0Z��Q7�H���
\�o��<7�̅B|��G��'O����֑�i<
�⯚��D������b�956W�툍t��P��U�
8��mx�8�`G��C�k*K:���M歨1���~s��>gp����������<�x�!��4%���k�ۥs�� :��F��j"���.�"��K��O�,#36W�
����4s���إ#�C�,qy���x�q��io�ߤDN\�� Ċ�M��Z��������_��]79Ov�`--C��ڝwIo�d&��!FPg�"4ω*u��~������{8���(����vh��f�y�Pbֶ/ym��R�6w�4��wǃz'H\k����?I�_v��-m�w:=��Z� ���{]"O$G�;PB�r5Ch�Sm���R.a���%�c7�!a6K!��\Rhl�5QYF
҄Kयd��6��#3�C&<KKa�WȂ2��|�X1��iv�!�Z�2D���-7��p�k����(�'L��%�e��K�mnC���d�"n�+�b���2��JѳG�;��Z�'����W������5�^��I�rF�Z��˹�@��n;����h:��җ����e�!�^Fk�\����z�<�#�tIQ+��^h����'��9��F�Vc�\A��:jfh�S$
WR�ՊМ	KAs�]UM��o$��8��pm�(���Ǝ�I�c3����J G'N�*��ϥ�vB���1�c7+C{�?{��S�2�B�.�\�̢&�AizfL.覴��h��k�4�c�8�:^K߄U�[(
C2+ݬ�jG,xq^��29}1�Rx�RP�Q�$,ȹ)� ��5;F��Xh�T���Q�y�*n�쐍F9�0?P��S�#� ���jnf���e+(v�]�rCQ��~S?����l>gު�� �̯�4�H	V�쌮��;�`���fGR����j���鏼�9ƉiVj��9b'�n8C�u+>g�����)�s�Y��ݱ,����Qt ���nXn�;�x}���e��z_l�4����:������❟>?�}���S�K.�\\�AY��G����v�v�A{�vI�M��܅�/{e�����Y"�}���	�6g��P�[N�*��+��Ki��B���oM�;�Q�˰mM�["ed�t��Xh�|(9�h%��e�L��QT��`���7���-��g,�A�h�kə���pxks2/@/�]��Ŧ��cnL����?��ߓר���}���S��5�B�	�-�m
�}����F��
�A�PKE��T�zKXt!pip/_internal/cli/status_codes.py=��
�0��\���2@D$(iʘ���6˖�RB�0�P���v�3Z�j�Ԝ���F�
\����/V����@��\ӆ�q�PKE��T��1�*"pip/_internal/commands/__init__.py�Wݏ�4�_1
��6�\i���C��J�Zu��i�:v����g�NZ���f>����4MY~`{�V�	%���ЈIu�Ta��Q7�8)vIit�2R��	�l��j^���<���!�=���V�N�n�c2	r�2�
�AZ�K����Š^����J
w��Eq���.Zɷ
s�
rɬݒ�
l�r�K�I�|���B�� 
�-0ص*�@�Pqv�@���aJm�"ЭkZ�Akx��N��Q���(D8",rm��1���n��_�k���yK+���fcb/>a�:E�G��U��W��NtZ�����p�g�ؐ^ŹOr��O)>��l�R����P�[�3+���mx.J�c�tp�ze�2h�e0�����P�X�9�o�B��2KF�_O֙Di|����R��TR�����<ϟ>]6��.��ԛ����}oجg.�#%�R�b.��^��]O��1�^�Ѫ/��E1r��@��r潊�4�����"O?x���Ӡ�/Q��2��V^c7�F�����X��
ǫ�˃HӅC�@M�]����0Z�kDR��p�N��'|�B�P]#��>�E�u"W��"#�����vz2}ט�燹��R��~ǙZvSUT�#}k�y�8���*�*�~6H���ؘ1�g��-5N[�o�^����-�ؼ��ݠ'�S�2���=>���k	e��ٱ�Jq��𙖣��!Nh�kK�$�!"��QP�O�)�<#�3�F�dB�va��.o�6b�\|A)��&�}�
Y����ӭ��k@��+��Dn�	4H±΁ıq��C�%�S�W��{hv�5����~�…gXC[�C��} \�ެ	|��A)���,"å�c�F����$3;��'�_���(:q�I���%�3w����o�o|o�N���n	KX7��x
��7�Ƹ�9�
}sЖ�{���dr��������v�D��H��,���"�����m�v{�p�7�`�$�4}��F0��%�x�!�m��>��wkE���9��$��3�ßϱ�K��Z�׹6']6������F�r��"�e���h�H��eR��Y��,�il`?�Lv�],{��2�9�����ېT��F��x�/PKE��T�a@0��pip/_internal/commands/cache.py�ko�6���"Rk+�������]�Elr�%(�D�jeQGR�A�{g��D=�d���X9�g�b_��P����>ȴ�m��3Q�:��3��ߴl�2{�X���|W��c���Q��:N�JsY�e��T�(�:*�,U�{3�YY��T�$�}Z�Ӆy=��t�H9W�çO?|���\\|�����3^�BTj�惔B��UQӯ)\�Z)�[�[�?�
��YIO����$��=O�h6�ee��H��<C���3� �}�j�i����t�Q�3�;�K�!�xF����ZM-�ʂ�\��80��׀�����FX(�)�)��k���A���%y�|�:)&6�N��@<����j�+�^<�%�DO&*��l���0"֍�vxiY�"H��	���ou��Q���a�bk�a�R��\K���Ӗ-����Ŷ��߀Œ^=�?od�i�Q��j=����[4�`�:XB3��V�;v�Xۯnw
xqP�����+�w�M�꫒�
K�<&�C��M���%��~p=���#l!���4����aW�`S�T:��	Ӧ�}���D�q�
�.�m����e�
�y�9�q!\C�,݋j�dD���gD�`�u䢁Y�&ʸ��[[�$[)�:|7�[.�.���=g�K[O��r�L"�*-��P_�-��rɥ� {�;",X�P_
���0��p�:D�8@�����s���p
FM/�{��\lX%��Tܪ���4�5�X�����k��Q�#�MSQD2UT��~���T��yD=’�FV���z��!�+�CyёC�}wGkP�������C���P:A~É�oUĴ`5��� 1�!�Qgp�<t|�An�FY�v�t��@g��
ϼ]Z����|�tƔ34N��%��orkP�B�y���,�:��aݞ��J�g,�c��k����Uh���[�Hc��	�%Ih���#n��C���͞WZ^��a������&�?Z��';��:?-�H�V���sZEQ�m,F���.j�����L��%J��6�
~��ὒ`�	���$P���-t�olΤ�m�$���H��8��g&��l+ӯGn*�s��S'�����+�S���g谶��:�K�8��ӗC��pe��e�_C7]�on�����ӨA��<�uS��:�WdҺ_@ʪ1��K��Ā�M��J�i]֯�6�ƞ���jbm|8
�����.Y�_���_M���{�Z���F��h��&TY�a�x���\��M��'F�=������$^�v�X�,;'�)�3�eqG�7c��6#C�3���	���8zF�!�b�e�3[v���GԹ�TwCQ\��7��D_�;
�4�m���籓��\9��P1�M5:�>ۓ����i��S�����-l�|b�#��S�g�;
T�u��� ��f�4����\�;x�r��L�-���q�OUnܰ�2���Cp�Z��"�t�C�'��:��]C*�lP�W[�]�(�Yj/�_l7�����~� �7�ii�"m��"kK�x�U������DK�LU{þ�s��85�k[���6�g�?x|
�\31��E��
��F��^N�RM��O'����Z(�n1goU0gc�^.���n�%_vsx	��x�ი�rO��tAAz������5]4C)$���u�����h�l��<ɜ��uػ;C< �%���?�P��4S�PL[8N���Eg�	��‹��w/s�j��6#L���Ės!���ۿ�Y�E��~��Q�
�/�G��%
��b�O����Q�h7]�]��FVO�aWv�<�PY
$��
^U���w)��\BY{ ��#_a�ѩP�N��S��T��#��I4�*�Vt'u�wx'E7��'�,k�Gh�7�߆�N��xR�a��R�Sķڂ}���?�T��I%�B�p�"x�@�B��o*T���en���1���8i�c���g�_���{Ĵ=���H�X��炫�L;�*�Yu��s����?U:ٝ�#3��#��l�Y_y���,�R �P�*G�gڴm�/����p�M�Bn�s�p^�Z���@����t�~}�€D�$��m��f��Uw���I�4�PKE��T6l�1�pip/_internal/commands/check.py�TMk�0��W��
^��@�z+�����`{�h#KZ}�����_Q�n{iE �f���{#�N+�@���M�:P�if,�OLx�C�]4�M�Gn]24�EɥC#�(*��#�XV�똬����V�u�yKE5ک�a����a�{�y��*�F�W��	��T�&@��*5�ά�Ңˇm��a�_hB%B`�'�R3︰E�m5�y1���wړAI4p?IZ�����,%�,�$I*���M�6j���ٺ�Z�����3#�Z8�g�Vӱ��F��FYq�U&=���LL���N�žj��0^�E��^���LKo��u���ʭ� �����Kjv��C��l"aCmN�����v���4zή<e����b�	r='����QI����q�sn�B�Y�K[{�,�xJ�W���;�3��s��9���N�-H它P��E���r�x���\���)���R��&�A��Z~��'6[Сt�G��p�/r��i�;��6��ƛiZ���oX�3���t���K<PX�M��x�S�Ѩ3�XNK�zI�-5���PKE��T0�1��!$pip/_internal/commands/completion.py�WYo�6~��h�.�Zں�.�@�:@�tc����Pe�v�յ$���{��d�Φ�^$�3���!��KϢDzOI��#w�ޚ�!ĉL\.(��AJE�'�m��k&d/�HXb;,��Gn`{�W�������E�{�EHW��|*
��狋�|�ŒJ;d�+�7T:	�7���|�\�1��,�n>���S�4���%�,�%s�g���������bv5]�Q���h��1�� �sJbvv�çz�l2��2&�'�׹���6�ݮ���q��p_�n<��Bя��w��WS������d<��~�����Q`B��~���`��ӵ��˦�S�ɸ�E����uy���_�X{n�1�x�U����:��ֆup$�s��5���ë�&$��`�G9:��	.��>�mO`��6��+.v�nA^MiA1��S�)@��X�nB�Œ���E��I�E,���&�K�&���cvJn9�u:�U'I�$"�L��Ni�]U�Y��]0H�Ms�;I�H��.���5��BZS��<@������<%n$��K�T+�%�U���������	&f���h�Ժ�4<&:��R�WUf�W�@?p���<oi�wα��b/��tC����\ŧ`~�ϯ��5\��¹�ڤ����$��bd��m��?���Jݗ ���5_���5�km0V#����"$?�c�-�
�m���o#����l��z��@P�7�bW0����o���'�4T�Jw�?yN��:�A�N�v�4�W�t��<dj^ɻj>���m�
�3�BN(�bԑ1�(�������A�z�P�lŜ:�~K��4�b�/xJ�}<F��}'2�D�`��>�tW˶j:a��f�aYz44VW�W�jl�t��,d�B���4��p#km�失1	��V�*5�i/5��n�K�i/���;ٲ��k�>����O���d�X'�V9	�&�Zx�d;;�^�\}e�6N1���^g��4!?�1���i��zy�����\��?uź�Ye���>e�c��#��R<^��
î��IC/l6훌��>��Q�I���f��?e��?�C1x�>��eu���V�jq��_(����>�i$�y�����GjR�!�Fq�$��Cb�O�_��J�'Sq�����6�2���[,�S�a�3H�rn?r&i�hc2���F�%N!L��D�Q��}d���0�c�Z�^����PKE��Toj�Z�
%'pip/_internal/commands/configuration.py�Z_o�8���(*��ޣ�^�����m�4{F �m�*�:RJb��73$%Q������֖���g��ZȆ�b�+�ݬЏB�_�]�Rl�R��&�Τ�̌���-7cͱv�Mu��e���}��BTY9���NҢj��wɦ,�u�x��CV�L?�"QMִ
�r�,���?�������K)�m�ke�Y�p��s6��տ�*׿v�I�t[�\�0
~F�����������\J!}�ۦ(Ub�a	�;��ޞ&9jc磬�]��d��T�M�6���-���xI��4��O�h6�m�L)������v�GVe;\7Y�Ё�R��c�dFs�ڵq�Z�7sVB�,(RX��,�4�-w�Y($�13��L�|Sl�G�
�`s��$��H�
ģy`}M&X��\��b,3�^l���9�+�=3�&��h��]q��pƒؘymE3���k�|����j����R��mQ��E"�a6�k��S{і9[s�HqM���Z�q���E9����ZŠ�,��X��r�nV;��;p��ui�F��	��~�ʒ훦V��/
U"��e��Hfkm`���ma��,��*f붙,����Y�4ŁCn�ׯt�`��ș�+��H�W�*�4a~�e��8[6�����MZ�q�s��2X��X�y���i$���ITH|o$+\*���G�5�ܦ�ft���ʻB�Lt9$�&�ȴ��W�D���e�G����e�tYO?�]%$O%�o[��-���E��o�²C	�<GXb�ߐ�\��7���LY��:m�o�{^g��i�1�/�N�	�s�4��V�w�
�fY��z�
/����>��?|�l4O%=A�� ��nA켇=�Y�!$�@���Q ,Qwd��z�M�k�AdAT�����Hص�����%�y�o/�|�̂)�aB�f����YH$n���K�2F��[���rz�j��̗6�
'l�.+�ψ�5
a��~�߁b>@$
�����^�p��*G�k�Bd�j��V�M+%�#��T_K���h��h��U��!�1C�aElvn�0�9��)]G�T#oM�~�d�Ur�����DlzQ���b�5��%`'��4��2�Pl�a�����Pf�^s4���Τ7�WG~펉�{<co9��(�LhtCnО�V��zuC�V\82�;�X�{��Xo��X�\E�5�Pe�Q$Î�?�wC���ЮE���y��ie�[�^Y�����7�ݾ���$T_c�����C0�`�
Xp�@��2�-T���(y[0�h��k���V2J�UMĬ�j_/C�*8jEq�`�m,�&�o�Vԭ\׿A��扱���-����k�:>X�Žk�B�����Fb_�`t(;�.�_H:�j���h(���!�������KX�d�m�D5����픕&�	;��Q_/n�?~1o�B���<��}�-�Z���מ���xᦗٲ\�ră��y��Ŧ�O� �����s'[����Z��ˏ�xsٓ���DW_�{�n�}�O��z�?k�FY��q��ь��\u��hK7�)�gmp�0J%�ƨA�"�!�%���tT�MI�;��,`v2Ą]8���<q�F���7�UO��S��P���GM�b�uɫp莈-��—E�iή"3hA�T�n�Bӿi뱯%������
��zn��}����mwW[�ă��)���K��Iqv��ŦrX�@�4k��YP�N�vx����9����l����nϝj�}�
�!=_���[�6dC�!0Xf�W0�ǭ��V�+�G9�)�V4W+��wF5T�U���r7�Á�})��ܦ�)������Gԙ��?�Vtj��@���b�O���zr�e�y�Bux
u�0�Y��n�$�K)�u�����f{�.�P��k'�D�l/G}$ۣ���F��
��ӡc�P�8��z��@E���fA�H+�[.��(���tG�3�"�lT�
��oB�6RZc�{�d��q�*e<��gv��8
��	m8tF��T��`A�L�xǛ�qT�� b�'ǚ�0��;Z�~�y���z�S��@��xܥ�b��q&F�։CϱE�(Q��
��,���O����F,\d�r�1@�o�O��o�=i���a�}z�/����C���`s?��
c[*B���eE#�~���Z�H�����.n������b+�U|0j�n����f�7_�MV��ʜaiY��;�A4�D[�ZOӥ��@6�wc`����x��g +�?�Sr<Tx�Ǟ�_u|K�J���}�$XRg
tҺ���C��Sl�:�Fa���G��NR𽩎N�5�ۄC���
$w�vB�-�b��ΰ=�a6"�ܵ������ߖ����A�C��Eڊ��|�����o��mƋ�S9����`��kFk�*�n�è3X�A���O�k�𯋱I{8�8p���;���ؿ�_�m[B'�г?��#�Q�4��;0MgOi��I�ۿ���QO\W��tr���O%���d4{���C(0�wT"ۅ�+}��a���!T'_@^-��`Oi��t�Q��^w������p����s~6���R݌���23T��l|xW���PKE��T?��C��pip/_internal/commands/debug.py�Y�o�8�_�ӡX	p���X�&)�^��I�%�DټJ����A����D�v\���qf8�����O+JŵU�ʭ�VV����n'�]x��>�U�dG�`�4���߬��3����/Y�-���i�����&��2k�Yh���`��Y�
'b(�#�k�@�PV\ш����S
���P��+
��i��{�~w!��p�U;�Ru��R�3���Jv��u�^ϱ̠��c�85L���A�3��03j8���~}{qqu}}�E��؍�����)��V3���G�d��ޜb�hu�})�r
��Y:�����/�"��%P|�k9�=�8��j��yC�^>�G��76D�&va��W�����͊��C.E��<{�7���9=S��@AƖ���l���L�7Ya��U�hwL_��xf2/�y���!=(p?(R)��qB�wC;6850(﬽��&:�8��r�=5��ɳ(���̇ @gFZ3��w�u�&=xaL=�J4�V�Ql�\�;�A���U��7�;��豁'��\�U;ֈ�Q��bF��`�i%�B$)��zh�B@���ݻ{�<R��I��ڢ��DC��6�
\�0�W+'��b��H�$Ygb�6Z�`k'��fTn!w9I�%��Jn��!S��G�6��yy�u+��I�z��8\UL��櫴bh	t`	
�Y:飃���$�'��Ÿ����?@Pv0R���4a�Y������mGg�rqҤlI6#d�_�Rd	R�n�R�Ŕ�M��s�&ߵ�p�kW!���]�؟��lKߓ7��}���P��Htt��+����m;��H N�$�1��`�^��G�:p�фnR󇱯[^!1���Ǵ�X��^Ii#@D����)��aTh�;����}Y�9A�ńPCO��U���M�G���"�&I
�ـ=��Hxy�J�\$�S/n\�Q�
k�E�]Ԓ,ˠ���>P&�����W1kn��`3v��`�o�L�nw	Tɱ��-<����e8�Ÿ�춆#!a��r�0��q���Ҏk�v6L��C��"g}e�$���X�.Eȓ]�6�o{�>~��o&�y��k2j�6�	�(k��&�.E�P$oGfX�z�e�&-l�2�o����?ls�O��yq�I����F�%}�~u�4�f�/EVbqd�X�3�Y�i��m��1S�S��p�?j�-\ �?�A���7�����Y�j�^�B���܏?�-TڊN`�|�n�ע����@���
&6����]
hd��GK¸c�&7�U������䣨C�q���y�:�`oV�ΙBd	:7��~�</�W�>��!0�tP����-p�<�L�܂(�
��/��	p�*�큥�AB�+yos��C>�76��[n
�rEy�ɞ��N�m&��K��E��_��=�#�|��OGzb���+���Ly�}O�h4���>	e�yR��)�nߗ�+t���`F�ܸA��,��6\Մ�����ʸKs���סv�
֛t��1��[G��\�����ÚP4��8����du�q����Ss�3�oN�/2�@ޑ-��0U)1G]ϋR&zm�p8�=�9�5X���Μ9�
E�Z�d�r+vv�O8�8C�̋���X��X�3�����Daa>���n��e���H��]�j��.����<��[L͛�� ��;ۨ���h?�هqj��þ���#���!l�]�ƛ��B��r��G'���/׼mE�O�`i�Ox�3.�9<��-0>���t��8�������ѯB�@����s�dQɠ�+̸���nj��	�.���S=�G�L��=�:�fΎ��Ͷ����%����RZ�1� �M�l4�]��F���b�!
>C��X
S�hA ��-�r4�h,k(��qGq;�P�g=x
(��x9EF����u�myq�	�K�L��yr��W��>�s��@�6��������?�q,�G���H�{g�R{����_� �z�^T���y������0�	/sx]0���:��~3����Y���84Ϙ�ϫ?n��o���G�����W��Q�Dg�.n���C����"(��0���Y/��1��tr����Qb���ў/-��PKE��T-�R~��"pip/_internal/commands/download.py�Xm��6��_!d(���}�À�(�b���*6�'[�$��Q�lK�sm�y��"�!)R�U#�!B��/x�(�b�dEdc�4����<�t
J��\�EOhx�R^P5i.���W*��gӉc���P��m:S�����4�U��b�>�\A���)k��MIs�n�s��a�ը��ѐ������
(�N�-E�I�b��A�� "̩j
:���1�u��\�I-U��
�a�D_7@ek�֜�f�j����=>�AXr#U�X�У�ِ)�֭%�֬JW��"Lk�F>�B��Ù�"��Y|-�K�=�}f{���y�p�
y׽��$6dҔ���/�W��6�Ԥ��r��t�?�ݓF�O�	i���ʜ��RxW91H��+i�h٪Sy����!��	-�n�&�wƚ��^�g\�^bXJ��v�/��b5�;��:b�w�#Y���+Y;7���q'(�N���"k���W�ў<��y$�gA�%>��f�O�􌦍���^��!�a�n_�Q�l����f�42�p�#�(��O4�݊ln�߲����l˧�I ��4��\,.��V�� ^*[KZ@s��^�-�ߗo��5Sݥ��ݕ����+��ʯ���8Ғ�.�f��閩k�z�R�^s��Vc׀��_~�b����'o�5y���z䵟��o�9�k�)�룕
�w3��Yhul�{|���Gl�'[�8=�S�a��焄�k��$��*�#r	�ɖ���&I^#�m(�
p�0EcUtD�p��w��~MnB��^ɶ�qc�48��!��4լ��৉7�yX��Dl��ߣ�ǃ��vЬ�w��O�k���d'�����`,n&���1L(�����7l+����������Z��pp�h��!�>�ɶ�ɡ��� t�O��z0��N�8��ҙ���Xӥ'6ٰ?<�&S_������՟'�Nq���sm2�5Eu��0��鸁��u_YԓfL��EO/ �� ��٧�}�i�˒�ĸ(���W��-��11�$��b��3{�\����6�{�~}1���&:��#Ҧ{x�H�N=�Z�1O���:�]{BD�������B�2���-�Y��w�F4�ٚK}�#�bh�1��	�/�*:0�κK�o�\e#D��ϓ�,z� �z�2�`�����Z��퐀oE5�J�?��1��V"��R����s8��_��Ά�����
 ��QlZ�Y���c6>�vr����ηGy��R��)Hz�|�Rc�F�S�#�%�&�q�o�P�����B
�z�����#������ѕ(=�F��nb�wV*�8gi��t���nnËi�ߝ����2ڃ�2��i��@��Py`��au"\�Y�@]$�f/�����I��m�c5�Z��'���$���u2VQM�����PKE��T����� pip/_internal/commands/freeze.py�VM��6��W
Ȩ��l@�l6EѢ)�M.��@K#�]�dIj�m���!)ʒl�I�>�&烜7o��{��#��f�Q=Q�if,�`��g�e�$�r�(�\��d��O:uߠC����X���V}�d��n��u�
�����������%���p��5O���%��qa��f.i[�~��cg����_~�#%�Lіn	���֯D����>��eY-���M8z�37���R~�Nx��x���hV?���,���n��,i��+�`6i1D�-�
��zi��O@,��Be0�tt�3Xt�����6�#�c6�@���@���s
���+df	����&�@KX�T��܂h7d�#�MI؏��$�׳�� �4��wx�jg7Ci%D긒�Q\)�ڟQR�5��̺e�p��r�Ǟ�)i��l� t��s��;�5w���)��0?�$�K��܏����\��X���
�Ǒ[�C.Hr�Kn���18��<�{��Rms�k��I�I�f�혞K��딁ʙa�s��&,|]
~nc�<q�&@>a��̒N�xl
�nI��Tn��~Q_<����q�yZ>�vA�b��[)�Sг6�"D�;l,P�o���B�YU�q���?�7��G��չ�_Q�F�ב��k_�X���j9 ��@�-b��}o,�T\��9���{C�S-�v�p�g�(�3*UW��#z���%B�H��x1^�Sci�S��͸Ѻ�t��v���A��f;vD�'�-����ts�/�Cx�p2�=H>�%�v�l(8����#�|���/��n�A7����K�0�n�ۯ5g~f@�G����ԣxf���A��s���]���L��Ւ#��W
[Ȥ��Z��,���R���Nr�ZʹU�h&��Q�8,n��+��r{]�
�I0c�*/q�A�
6�< �=�$=���h�4��PKE��T�����pip/_internal/commands/hash.py}UQk�0~����
��s��d렴�t}�P쳭U�<InW��N��i�����}�����h;mi�m��Gb8J]�B��Ѿڨ2�%�s7�h�粇��^;�,�ºh0t��L(FqI)�[`�n[��)�r8~bw�Š���no��}����v�E�NHK}qsԗ����
���]a����k8l���
[LxɊ�WO6#/F8`�w]�{�|b����]˜�-0�FQTHn-�¼Ʋ��#��8��o]��������b�F<����	����J�"\CV�.���-(gI%$�I���^B@
�X�!���[�ќ�g��5y��Z�G��C�J鐹��6�Ư�gP�vgz�J�Zʒ��Y�duNn�����״h���s@r��x��ܬ��5jӴ'&l ��Y�F�l�h��/|ylV���t���.
�.�Q�A�C"^�lM���1��i�[��HLj��E���1���.	
3l(jƍ����K>eK��Y.ӫ SFF���g؅5���?Xg��8@���"J��o��q>��Z,���3_�1ˢ�ިa�e&1��������s�Ax��� ���]�P� �~fQ����f�+�!91��s8�%Mk,�<�o���=��4>kc;����JQc���C�i��Š;Pc����)�v�(39'��"���䝚<�a'zv�6d2�K�=�;H��4r�
��O��PKE��T�Ô<�lpip/_internal/commands/help.pyuS���0��#�* eQ�Qw/�J��[�^�9a�`�c�YT��;�B���Xo���$݂6���5��M�6*=�z#U�oҺh�4Y.�CR��.����b~�m+T���:�:ˤm�~�χ�=
�^�8����&�Eѥ��l�$Ӟ�"����W��JM0ٵDCEgE���+�3�GC���S�Sd�4aN������za�w�p*��Tb�)�>bo{7e�A�|�G����p���R�{�MfC��\�W@�B^�v

7�����V��
�[E͟��݊�6�o�rW�jPz����u,�܏Mp��y6���k�m�+�������C[pEPȂ��f�8�U�:��%��H�S5c�|�Ti��\�T�h���K+	:���jmŌc���o���>��_�9�8�j�j}���	c�g�ܴ�?#��r�8�X��	���/Ibx�8���JX3]��Ǜ�Y4xS:>'e�xHs�4�B�&��PKE��T-g���pip/_internal/commands/index.py�Xmk�8���B�R����_�s���(iH�±,F����ؒ+�I����ѫ�����]I3��g^�\(���j'x�x�z,$A����@�=S���v�ѹ"ߴ$G_�T9��+�ns��e�i_Tw�5\=�o����#B�����q}�a7s�~L%P���n�窻��;��� ?��wf�g:g
����Cf��
�A{C�g�tu��*G����>]_/rZ������{U8)Hn[��Ŏ/�!�jbM������"GA��7�&���3X��Kڛ�%�T�
�-�y�n���|�s���e`������s�-_���&]��K�%���,z�IQX쉪��:����l^��%^F�=���� umw��V������*R�A��Z�t�
�O�T�b�Ҫb�#U��V���Rڀs�Kgї�W>I���s&{������0mu�!���Y~�c�����u/�����'�}�ِ�MS��J�i��y�.8#� lL�BSGN�x��2[�h�oK'R�qA*H݁
"��4�^$�,�W7�aq|)#g�q�x��#8dB��[��T{i`9A�J04yDc�2�Z��@�sU|��|�]��%���3nϑS~�G� D`��������SH��`z��L|�&k{������J�j��q��&kq��T��N �-�JT��j�3D~�D�ָE��(������$H��H�w
��	t�[�� �YK0���{
�=�����W$K�|�>�MeaS2� �!ƕ����y�5{��Gv]� !�WĀ�.؛P�ZfHqx�T$��%GI�?�P-I��{�,&΢� ��]u4�][z[�0��f�����=��v��{����ƫQJc,<�ƲlS�6l7���QgەC�EX"���p���n׏!�����M7�4����ԛ��f��4��0���0�m��u�Ѝ`�Z����ۘ�d~44��M֙ X�C�scx[pH}�m����4���j|�x�)jsY�
�t�Q^������ݒ���[i��p ��m1uT4���O����s��e�*�-0&_�X����V\�F.��ya^��Y+�S��c�(T�h5SXg����t�STݖ�Tf���ˀ��b:���|@LWV=���

T�7\�u�t�I&x�#�|��������@�q����c�+/.��]�|͈,s�XF�O'�9I�y�pW��4���9�q���yڧ���ux�n�w��p��7���`�
�Jx�B?wu����u8��qf���n��z��+te&4�3��TX�bB`�Oy6�9Mܺ�rR�f�E�M���/�M
~�	���L^�(��0ʩ��NJf�6����1)�l�֔8Y1�C��*=k�2��F΍Ma��J���H��k�����$��Y�����YlA�M<1ׇ�S`�8��u�&B���lj&��PKE��T(Q%{�.
!pip/_internal/commands/inspect.py�VMo�8��WT,V�g�b7i�.�f�d{	���2�TI*Y���!E�ÖE}�E�r޼��hZmH]�Bի��
�ֵ�X�o~�C��cK���:n�F�n��u�ӊ�`/�*m����ܻ.n���dZ�w�1T/�hՠr��F��d���j��I{��Z16qBx4�ˢ�"!˦��i/��X����*]���,�㮳dT��ݿ�����Lt��'�_��
�g�S�o��/�28!��ݳ�.9���≵�bp�Ig�pI�=0���V^h`��P�->���1�dl�Z�Jɭ��ʶX�HL���
�eYxF�B��ʁ����LB�vktՕH��~B��w��a�M�]18D��AF��=I1/t�{�a��,���e~#�5<��?�H����ōܢܯ����n�1�_.H>g�� �zWWR�\f��2/=t�Y����'�X�\Z�oP���)ᤏ{O"�u\��݁�p�j����cK�v����Ie��{���x%iYJ�\��E[����j�g��h��n�-l�2c٭�GНk;7�c�ĝ?��
�E�Sq�M��2_G���0�PSЁh\�d��]����}�G!�Nn ����w�����5�� Q*�Q�}��(���C��),��1Tw��B��E#|�fb�+N���SG6�z���<pEu���\g��W"�4xT�]h��@��DO1j��Z�|f���=r\�R}���,���6�U�6k���e�4�r���򊙃��c�E����I?^�����ϙ��,�B��D�>�lܟ̽�3���B��W4�s����D��BO�L�%G3;_�-����-8^�w`)�
�?��0�(�T��$)�a��1�/��=���<���/���Ry�N�S%�7�Ӑ��s;��Y�2��''	����f��7�3T�~4r�]��k��};�_�Լb���7�0Wc�����~���
EU����NҦ���
��Iu�;/!�qe��O��H�C6���r�9%sL>RCߞ��}�Q�8=ЋWb��#`%�����mF__�yJH
�"`����b��(�~�
J����Y~�̓�\�AA'�g���Jn	�?��}�8_�J7IȌ�H+���dgA.�^��܇W�7����~+�'P�1<�N�(��o�Ed��PKE��T� $ɝkv!pip/_internal/commands/install.py�=���6v��_�cƳԜ�M�i��F�:��έk{��e:���V�)R&�]��o�@�v���Z�=@�v״]$ڶn�J��w��{�m�5��[�or�wee�*;q�n�-��vy+E�ޜ�{��ͳ���/�^��Gͫ^Hn��we}�>�`��J̣���ѫ]W6u^q�]�K�kQ��6����
����#y��e�W���ηbܳ-��n�k˺�h�VCx&Z�6-�bcV��F��	>	6�J�v��r�a:��}��{�uy{%�l��6�D�V|Ȋf����E�y#>�e+����9=���:+�Y��Y.��i:���6YQ���w��Ԅ�˻^œ+a�}��ͫ7s��'O`_C=��B�KT@=kۦ�G�k��rlB�B�TM�;c z$�6�[�嫼��֢�.ۦF����*���v�w�ƺk�J��=}��.��d������Wo�Mhf1\hzٗՊ��u-�h��8/n
�T��_������_����rz$Y 9=�nU7�Z?Lu :U�=dX��L����r��_��|��� �q����r!)����X���{ى���	�e7m١P�q���UsueI2ث�$�G�c[���`Q˾�y�AI�;\��击��D�/p���\��(�wS������x�5}��	gh`�;�YC��~
�T���Ow��.s�¦td}�m6�b�����ɮ��2�&��A��d?p��KY��qU57b��+D�������a�F�h^I���QE�-��K2�Yo�VbM��LsIg9Ϝ�����h�����4�24�eQw��G�"FZK�e�Fq<3]�d�AB_w5)��k���
�����:�y!1��#�]hՀ�ʥ�WJ#+��?�c�W���.M��t��-���ϣUf�m���,?
9�z�L��Gr'
�'`�Tu��3�߁�������*�f���^�8
Lɦo�m��	͘���I6��wH�RY��8"��������
���\	)�#��=h�}�5j%�(��M%"K��K�'����P���E�`���\Y-�OA���+�/��>MӉ��3��!�/�u]H{�~��C��"�͡>?��ñOLc�8d�|��T�D�jM�������@l'ӡC2����d6�W_`^	6B��� �Wbw�n�V`�{�1H��Ns�D��Ū�/@��s�E^`�e,���n{�5�[��9w����[�	�Q��6��-]��M}�ᬠͪ��'`D0�}���T^0!�37�����(�����b���
G\���bQ^հ�����(��ǭ�Mu-�#�v�t���a6,�{�y��]a&�s�܀��^��~���+�WzG�{�!#5�o��`蟃(�e�'T����������#Ib�'��64������E��j�@Q;����F{^��H�w�<��p���Kf��µ�>���
w^d�2�h�}��ML"=��� ����ݣ��Aц0
�С%�Fo�;4`�g�����d�����ׯ�>~���o��i��N��Fv%gB�P���GNc�E`黳go�_�=
���=����t��tQ7_c��(C��w�P�L��*ۯ&9I	�-����_&3�yE>n�@bi�E�U�.?ʯ��R���I���$ZU��<�D�ݘ�]�[T��*L�,s�K"nu�r�eȶ��A��X))Af��K�wJ�#ii�x5H{%�@���lhY�¬�� �����܁f
p���u���C���.���՞��C��������FL�qSW�E�^�B����VŦ)!��fQ,�m|qG�Mko�P�in�zN�5�
� #􇍭s�i�H}���
<p
��C�Q�Y���[��_���A�̒��E߶�f�P4I�l���'���`.lf�PԚ�Yx%�aI�2�=�"I0����a0�#�D_�pA�b�
�� �R�l���E�F��MA��Q�f<!��
�p�5�0��k���ci��Us�l���-9�vw [�0���1b��m�A��-��]%@�{��tؖ	�7�C��Df9h��Z '�c�&��A�Ls���i�����ZjPm�b��8��,�-$���P܉�?�/���U��`�a��FB��U&E�qﰆk���9�m�����D��t�;ke������]�$���N`6��D�%wY[��8�8^�S�:��k%�d]Ȣ-w�Bg-�,���P��P�m�Z=�Ě؊(�� ��N�`��~��/_�����,<������p	�D�`[]�[�'F)[q_9�&���{���:+��mr���6W�sdv����]v�,��;��B��sUC'*��?����w.�9rG�6.l��m�y�ߣpm�N��܂nv�n_S� g`��*,��c�g��w���Y�XB�h��g�^��D8@n\��86&�V�
��6mC�h0�T�j冡�VA�N|�`x0���r�}H�䜐�(yZv�P'�!��[=���l�Ԗ`~����H��*��GX�pJP��,_P����!{V�m���mԛ!܎KA�覠���N]NB��4'`_D��=���u��8�(|d�i���66��d�)?"��F�z�W�@���ܥ�ڛW�J�3hY��R�u�/���#�#њ����Б�Rp<.)��%�ar�+���ox�@V�?R�����+��5�z�6Hl9�:����.1��ªa;O�r]M��XNM��S�rxB>��GY���.)�=
b�w�a(��`[�a���I�_J�77��h[GcI�M��v���G���)�����n(t�RB�[��]Iy:j�G�6����l��gg_F�`�)A���������E:��1�OZ�
���e��f�TjՆ1bSZ�t����`j��h<;ԕ��{�i'����)�����c-�uO-���Ė���g�}g+#S�a�3�/���u�!�h��z�NT�%�A	��olK�oP�1$K�/O@2K���!��۸�xi��W$J;��Yv�z�e�Fգ�I>P�O��5Y�N,IN7.����AS�.�8X��9�hڽg��Ҧ;�H
'���������2qj�;F��(��@UF����~�����y��dE��F�0��i�l(77u��Yt#@��y�
Պ����()S����#]3�L]3�`4�t!YS����C�*>���L��@Z%yh�b(}�(5
����d�)k�C8��@
�I�ڿL7�|]*�� ��z����K�q���N$�T�6z�Z�;�_�ak��KB���m9�<��p�O��r�݊gK�-��_	G�]�_�b��C���ZZ�~X��,�aq��?��bl
 y��2�e�Y7	o��g��%�3KCT��2�#fv�T�*	�+����C�Z���K4�;a�����*(և�)��~iXR�N�&
hL�s����e���+A%�Ѻ�C�e(�D���][R����eD�*���$��qN�h�5��f�tGK�����L%����/��V�5۞��9v?dD7;a��(s@�â.��/�[/~�g�	�&]��]����n��\���eQ�\�9M��lt<+Uu�"kKV
�C�4�֜V:�1�_�#��r��1:�C_�l��'��:&��:V^ ~�_��B��|�m��7e����~F-)�[����G�N�9�'�\��73�����#{�gCS�}��o��=�������OȠ������!�L6'l�8q3T���צz�ʬ��1~���0��@*����d�]�Q�:����(%�K�/�
C�E���ġRr�~P!������&��og��b�I��n;�����j�.ܥdseڮ�������Y�Xn �`��8�00�L<��pc�&#w��=�_�#C�]�"���W
��J\��,��ߥ;��`��~���]�g�*s�I'��|�\����oK`�[�tC@��N�*���_�/�y��@��턕�4b�A9���O��9#`sE��O�8Z���@
��m���?�����c�����zq�tDH�u��
Qϰ��f�hB�3����>�-�LX����7m�_mI����X`Jp���3�g �Q��u��:��M!)��?��
��`;(h�s�M��7O
�#�tdR��0J��)�6���8���Պ�{�GQz�(I�+��c�]��՚V~-4�}�����M����J���ۼ��'�,��C�����U'�0��գ
P���P���
�X���)+�J��,T����F�;����e����7�u�����m	1�l��X�2㦌��swSX[�~���n�ʱL��A�_���@�l��ϲ+�����rW�����}�B'8o�x2~���ҿ�"q��;���/:��{�_�+^Ҽ� i�J=o^���y��g����z� ��Г[��d,�9.�9pS�F�s�Ą�eO{��������'��y��$U���E���g�&��pJ.eO2�w�|Ԓ|qi��C�`�R:a�˼;��Ȯ��뎃ԃn�ߛ��x�)�̰��A"+ G��m�	��(⳾(@v��;�k��S�S�V����uFv7Z�b���L!��M�?�y}���^u2��u�Ȍ�ԛ�B�u ���=�?$6�Q�X�.Q��s^����̨���S��.��kn��x]�+�]d�I�lg��@)�?�ܯ-����_IV�J/���Ɋ"��XXMvh]\efa.i9Zҩ����<�)]5B��1.�I��^��G]6�&�AkPMdH�Y\�nݛ��>�d�(��Km�k�B����j�5�]�����Rʚ�Hb�tC�v��`TE$�7U�F�׈�F\v[����� kn�d�F��Uv�C���l�hX��Ü�`��K��*L�1H@�q�^�xv� ��a*HͶ-�����[F�Q��Gm���'/sk;�i�dEȧ��O�]@�]K56ޘ��,�-S����r*		ֆڟ��
�G��
�1��	�3tit�.�	��P�u�$֗B���H����t����gr��ca��UY��#���1J�,�[�GfJ�5��/�f>_�/ݸe$G�AQ�oj�����A���Wi��;�#_晶ۮb�/�m:���ϟ 6ǃ�Q��Z;CI%%.�>g�

��V���H��z���֙�5k�YW��.WLB���n������
�1n6��/�m�\��5�7%�spѥ����&�R�R�P�Q�Ѧ�v����
4G�����~��@�j*Ojq㝅a���ævLy��L]�r:���w;�ȝ�Zu��<J�>]դ��?f�ay�ږ�N��+U_���H�Ț��L҅=���8~�y4�6Z�vReĬ;L�تR��[�U�4���M��¹���(1P�ɯK<�]N�A��b������8��@�S�5�@���o��v�����a���./�ީ�(�&,�SE�r#�XU�ڗ�i95/_�}v�W� 2��D�~W��=%K�\�����DN�=*��R�u����+}�~i�����q��Z�0��-PpaB'��O��s�I��t�OF��$��dy�N�"1{��:��D(��Z�6��r�\
�,���οd��
���=��7yR>|��M/UW:[���6��|�7���r����@�<��˚/8./�����p#���ّ�fzR{ǂ���$��Ǔ:ϕ�$�#�q\Uq0��?����mU�#�3$�o�.;��3����F�8L�S��u�G�=���)��؜L��M6��/�B�'���r[(k�;�)B��Ql�Jކw���T*���ǼY�(<wCZs/zu��c���4�r'D�=�y�&�i������⊤
�[�$9H#C%�4IM�t�֪�{�U�fv�0�:�������m�kE�ƪ����;�*H]]V�X`���̣��.:Pp�d�ݒf��o�Z��do*V�>X����X�&^�*��PS��h�.�f�nh����Z��9�K����\R��K���#��
@���熯��)�P|�km�.�$m'�����\],�e������8��\��5&�ņ��c���:7Ɂބ�tv+&��J\�WI�.�`��Ѳ#���#V�G��s�~���.�Po=&ϣc�n�*��*�R
WH��UCyΔ�+ݢ��B��C%�Y�N�h{�5)��b[��taܖ�k����K��
�{!�N�s.����G�T�(��ZlR�l�Q�#5�)lHc��I~� C�pʭ���СU���W0Q��*M�%b�S(�yc�z�+�b-*�r�%�o�T�У�PԨWX��4�D���zؚ��}���//�et���s�'��ޢ��e?��U)	�ۗq#xk�#�SF?�{�	���L��e���t;`�,�R���'�yA�0�"�*p��XPC�I���{ʊ�.�k�����3��vT�<+y>�26��ʹ�9R�}(���Z�{Ř�G^���sJ}����[����9F����k���>[���uo�l�BWa�EU*���
��@7���>�e�����
�V!Um�k�Ƴ�-��NjŧϦ�GHU#�3��^�3�iݞLe��F5]�;d���b�s���xu|���?l�>b��~�'/6ӮGcx�q�EM�>����֓�à��m�?s�^�񦭹��[\ՙ1WF��9��H�?8�Tn�sGLL����5>9��9`��/F�q�n���5��Oaw-�#�+^�T��d(`^Q�z���t�?z�Z��#��|�n�R��*5X��U׵��{���.�#ӕes���T��tF�#���$#����@,�t��4f�'Q��{m��o�.J�
��V0�DA%�:
����ׁ��%c������^ASI�Q�K�W��a<M�։s �Xl*
�S�T[0.:��3�id�`�`7!�՞�	
w�T_��Mt�+�(������t[�v(኎ٰ���w���̰=����u_���5��R-��;�cH� J���_z�Kj�)��$��K��1V�
H �T�!�R�':�� ��c^��6`$��阉U�5�A��_%Kf&��s�#�x���.(/��B�
GCc�a��;�)l�@�
�J�9��O0A�q�[m���-MIHU�-D/<��0y#��|�a�C���5�����y���qw���ճ�o�0��ԗ��u⾞E?f�� .���oOYq(�Y^m:v:H8�	9 �Q�ILN���ڤ
���5�q~W���;�F����c��(���ϕ�(.���_��S������ab?-�e�����bǙ�n�@O�0�GK�PKE��T�at,t/pip/_internal/commands/list.py�]o�8�=��Т�tp��W��溽�mq���*m�6YҒR>v�~3�)QNڴ�r~�rf8����V��l�3���~ϛ��N�G�v}G�d�l�N�I���wgw>������//����W+�5Lо+��~E�v=oZ��{���-[�CW�ז�L��x��7��Z�wt{M��|�y-�A[ڴ
�Қ��ʆ��ʛ�	8%���!�V.s��(���H��"�n*v�J�Cw�7�peO�Az�����x��}��m�f��/�hE�#'���k�yZ�7������xZ������^�E-Ɛ����E��J�wУ��_�=�K��p�6G��Q" �Z�!��Tv��F!��w��ZDTA
�o[q
d�hw޽�+1$e1 �cG{�!��曲��G��(G.������=X��=+ۡ��T��}}F�sB����.��w&�
�mM�$%���7p��_7�6�J?�'�'I�W�����H偐v�	�K(ٶ�e��v�Jv�Օ������&F��S��H5��Q�p�
W����P8�Q‰��'p�#v���ȍ��T���A���d"C�_`d�Vw��IJ��j��5�H�֠_�)��D�$Y���.�\F�{uvv�1����/�+�Qki�bLYf�5���8m:F5x+�FX��1�(W����
��*�V3�㛒P�H
���T$X�9�b��=�\�9�f+*+P'L�oZ�Jl�o��7p�b`j{�p,X6	y։vO.M��r�*�#��J���3�2r����6l4C\�!�"��G��A(���d5Y9��5١*6���"=p>��P��/��,�:��+%{K݉ޣ�}1�Ü���[<�o���<�����:��p$�'�_��[��5����;턐���O�rˁJ���
��X:+R��i{�$�S����<,�!x�Y���ٽe_$�����mS�� �u����c�!r�/���|�Q�%d�C�}�@���_�
�h��\@����ʊݰ��V"&�ɜ�|o�X�l�	Ңd�|���39�����ٵ�H�S�Z��I�
/��u86r��=��H�}��c2��-I��LM���0��'��6�51�Hj�VD�]A�T�N�4I�w���Y��
^�t~�"
�W*�A���v�.�'�z4����F��a�}ї�,/S�K�rZ�iI����T���X��m4y�&X�=)0���Q��
�=�tC��c���Hjy�OW#15%��cE*��ڏ+���KЂ�fc
Zn^We�Φ�17X�1R����E%]�`�&8��������uM;(h:�q�o�?�R��L�(�Z�rl䋰�Ϸ����nS�oO�?�Ј�׷��=m�Y�S2�K���\�*hNjh'z��Ud�"M���9�E�`� �PV
�PpE�o���v��h[bh��b�a4����J�
�����E�]����.�~p)(e���4yk�BcG��N�0l��>nxê<����ץ+�lĘ[���
����7�b�3�E�7ApI�/�M��&��L���t<.l�Z�dһ'��eX6P٧I������P<Z���YU�d��P���e�ҟ��y����2g�ji5�Ă7ĕ9���vy�0ME��Mw渨���[��0���kr�6@]q츐=���^�B`�������d��#EX�l[!�C����Nܢg����z�����G�İ���
�R�1��S��5k[>�v�+����ʀ�`/,���/��]�V��5X:N|���Sw��egQ�G:�b�-�I���d\6�@Û�)�L���q{�+M���0�cZ����L��}6��N�V�Li�B�<uc�a���sM�B��L&�W�X�:�_�R��K�_�[6��kv�~��$M���#����f����Su}%W?F�6�~]��ҮH�,��a{�H5t5���W���J����h�H��5^�^Y��!b6'�Oo!�^;����N-OK��
C]�=��U�R����Z^��z���m'𛘅{�y�Po�\��-F	H9��YLA�/�Z�1	-A7E�=�x��x�ي�ļ|AC)��V(��6.����<�������i4�9~��6�P�ٌ Z��J�Ն�/m�^�qxÏ[�@3vPj@P_�3�r�6��\zT��l��n�p�n)��U��ȗbn�1�y��"��y9W�mn�E1r��s�2�OCAE�>�-v�����s�`@�٘f&�g�f��;O��큱:�	�K|�� �]��I<���E���b'��cR�������T�_L_Gڥ^p�j6��I�5��e����h�`�`��7	�!'~�����2g�
y���qSQNO�L�����X������bah�=]��:Ghd�Q䇪���#���OLY7#����į3����EA~���F<��'y&��$�3��D5#��IP^���y�c��nŒ�6Ns�H�'�Y�% h���\���bhf��f`W�>��ؒ{�@�W��t��`Mn��cP=b�ٴ�
BB-��447%&}�Y�,4��ǹw��2�����~�/q���v�s���>�h���QFU�ں���ɐw���IH�jy��X�b����β��=	2�r���	s`|W��g���EM�R��������+/mscUn��U�t������'T
es��]�	.^&fv��A�)���4H��)�l�rf�8��O���>Uz���O��4�2z:P9�� �ܧwn��Txghb2� ͎��i�r����N~���oF��Am�ž�T��1@�u���m
v���#�:Z�0h$ϭܟ�qe}M=�E�ƤB�Īfl4!�3Ȃt�JS�d�U0�[ֿ!io��ld��l+�p�`1:���5�$I|���WglN�=����!X�h�f�V�^�1�^A^{L�R�Ե^����+�ٰ'A;J֓d�cHԋ�i��G��_&Vd�2q.E��hѺ��8��8n)�B����+��GXƶ���!�k�E37�����b7\V�>|�o�H1�-m7��c'M��_PKE��TW��/bA pip/_internal/commands/search.py�X[o�6~�� T�V[��śti��
u�up
��i��L�$����w/�()�����s�w.ߗ��$/�[.�#n�]�y^�:(��ك������,W�*�L��F{�*�4/�"��J��d�7|�h�R�T*�	��yŔ�Ӈ,�;7_�f'����qv�ۘ��19�
>�JTB��+y�fwL���t���C��
��8��*���ݶ.4� }J?Q Z�=k/��|�E�/]�9S��1^�.��V��J��5��wy�]���̳�W��o�d~{rr:�	a+V�wjO�,�Ǟi���z�-�ٚmh�댉;.����
f�*�b�<���l�V0}_�ϩELM��f�FR�pi���R�QϊZ��`�i�=W��{�5ˊJ����&��tD��t�5��*E���B��w��&�b�tϦDiY��
B�E�@55�^��r4��L�����ܬ�Y���,2k̜Q�ڹc��xuμ(�,́�0���]	�*�9�!���0�˗��ëD�xT
�P\�=/e�%�¢p�Y<ߊB�Ҥ�3P������#t���X�I���,k‹��jo�T�0�5��t£qgeb��Y�tӳhh���Yt���d�d�LK@MV�<$ٱ��E�B!�O�
�[�]ۀ�3�;�E�����*�^��%!��S;���,�2~9�41��0�٩��cB嶍?mH�&ؐ,�Ж.pOR��+L]p��;�5�UXA�7�3�H�(�e��j�MDw\+�0^Y���n4B���ix�ZJ+�P#��Dv��z<��������X�\Q�q:ޓ`;&�iV�)�/����e���X��3V1�5�Ț�?��Y�/�S`����
��n�h ��iQa��BA'f+Ҍ��-�-� �1	  ��6�6�MU�G�n6n+��9/����1�Z�؋OW0��s&��^����f��$-͇0�d(���1�rM�f䪦_9�R![h�=�c�[��0��`L;5H�2�����I.(Y@�sH�S�_���9x�RL�ê�RΌ��|���q�ʊi���JH�|�&8�:h[[8
�xĊ�T�^I�����m�
��l���:Z�=�|���j[�AW���P�U۷���=�bV�1M��P����
��\�\��諰�#�k����D�YQݖ���^�4�y�iM�
0�~�� aE1����ew���
������
 �T��T{���젺E�o.��x�ԧ~����D�6@���}��������F�2�e	��ح��>�01���C��;�hG>�9]�:�x�P+�P �o��ϼ������!W���bm߭./�����4�8I\��N���$y�S3�p�)�z8���,6?:c�����8�| �
�J8V�O��Q��� B5�.�$M�6��.oڊ�3���
#��.�7���O�L�sEb�s] .,�}x}C�W�9냛�7#-倦��A
|���7��)��w n"Y�`�����A�W6OL&��1���k��~���X�<�<C�y͈k5�^��ƙڪȫ��Cܴ�_��-�i��q�)�Nj��<,�6-����}�	�|O�XF5g"n����pKaE�Ը)Ec��&�����N���,��P��c���=�!G
�-rH�
��v_��)�>nIP�u�&�:!?ukZ ���e?W��O��;�<ց��d�u��?6Z�'s%s�5L�#��8���M��胈�0#����}�^��$���"T�z�a�Oh=�‘ďv혴�X�4}�=!��N��������Cg��)���Y�
�Vp��O���Q�;�(?9w19�'Sc�e�n�X<��6�I2�PKE��T��U���pip/_internal/commands/show.py�Xmo�6��_A"����\`˒�X�I�}0��h��,i����w�wʲ[#�����x/��}'$i������Nt���b`���?h3�A��c|v�k���9y/��a�I�� srO��4������ki���z��k�N=��P4�%o�EEۮ�m�?�lAU(�[��UË':�����V�Z��$��B5s�<<|x��������9�����Z��a�_ਂ?�x���,k��c#K־pѵ��9e�Ł�U�*�de7�~��F�	��!*@������GYf�Ţj�0�����95��jA�$��F��]'m%�	v"]�H'ȡ���4�&:$l(J��30)�w���z	�N[I�7������zP'���C/�=�t*+�-���Ea���J��9|C����ObdZ-8�к.��t`�.#˷�N�2;��:(�����P�.wI>�,w�aÄ#���
�P�:$�-��Q��[�,^zfM�NT�$x{76
i �H��vEF�g�"�&[��V�,
P��4/����M�&�^c����ە���P��7,�
$�V�rڻ��H�I�Q't�JE�&��V�cà�$����Tss��"�"e��Q��f���#GH��A��>}`TTϥ���!UB��^��J#�N�V�\ŧT!Y7�-'/L<usd���a�‘���=���hD_�F�����	MW��S\aHCz]>�K6��b��<�Q�w�S=�8%����;���)��J��hN��(����^2D��ļb���h,�e�AxOT��\�ڸ�-���|MK�5�M�\A�������P}�bT
�~t�� 1;#��|F=wц����HA�O`Ŧ����v�N,WN\�b!��+l�V�u�`��]s��V�cX�����0�F�ɿ�M�ƂR�:"�0��GE	redY���p0��6'�F��2�Ta(U":I�c8	�@�f����b9��Q����Ý3D�@�.wR��$`1�y��¨I�4��]7����͉�_��zj�dƗ�zsXq9�V���Ɉ���z*�WSĊ�R���&A�J������?�y�D�a$�K��|Ҹ�sB['������0ׅ4և�U�N�zNY[q��F�ea��t	�#�H�:q$�;�Ƌm#�Z�^����F@�HCյ��v�^7e�2R�r^.�-��v\C$��{e"�*��u��T��'B.%��nQ&
�#!MBě�.���b��T6��0u�A�^��׷i����ڙq�d���L�a�~�0>�Ƈ�CQ�.�m �t<�:��}6Avo?�fF���oD��c�qyz�#gM��.�]k/�Z��c?�a.��(!��l�Ҫ�B���l�|mf�1W�s>A3����k�5�e֑�,u��`�Y[~��a'J�k�
���N<a��H.M5q<��ai"�+��H��	ǩ?���燻9��5��'E��,��f��jiN�m�;M�t�䧵��3z�j������a�~�F�mn�L{X���k�(�s�%�扏�觧9����	Pw�x�2���j`RX�σi<��.��fa+�*S�n���[�&���n��$��x�^�njHQ���?�³[49#�ho^���9	W6��-�sB?����9�in(S)])�d��=Ƌ�*9+��z�����yp���hZ�^;!^/��5 4gAn@:�J��P�4X�$���z���W�%���2;F��<���+��F��ʉ��K\��1nin�3�(tVDw��3C�}�]�$h��=��]�Ϟ@$�ܽ`�bHN��=1�b���i��,UH�<�\x�g����t\=լ�pDu��9�EǠp's
�@��PKE��T+0W�`#pip/_internal/commands/uninstall.py�WK��6��Wk6���e�Cд(�M�b�����&"�*I����RK��4l�$�řo�U���R�R�;�+е����=�S�
�̝k��O>I��A-kƏ�
mX-�/��c����s����(�?ȕ�p�*�C�D��RUA�H��
B�",�\W�PE��.o������%-��U���Q\�i���-��	�X�Z�p����X�5�Z=�GE"�R���h3�F���!<�6i�B�fD�,'-�4��fж\=���p��K�p5�c��E:�2ěU�惩F;�'�VV��#��r��$a�d�A4��`d{t��ޒ�p�.����g��mٽWs�L7�ZI����-PѲE8 AZ/%���t����
6�E铂Q@��M+l
�7��i���	:Iw��>��V`�55��=�vK(<���(�/x ���P��p��Z E���p��%):!0hc�Y������u�fl��yƘ�X�z�e�Ï��e(Z�W�P���ԥ�3��n|��4k��8��AQ�;E�;���r��~�
7�\�ͨbx:�.ˁ"��6��jg=2���e��+�{Y�}���{'��eO��}��0Y�/{�s��Φ6+/��_w��J�EO����T�a��$�53�?���O�<�(�$�"�e��@V���bq���?��?�W[����-�3�T�f�����΁�_`�
P	�IS��z7J�K�b�O]�җ�o�\fxk�2����0R��u���^�]MU��S�	8_u��������i�;�U��	Tlj
 �f�NU�w@��Ѳ�)���r���9|�6{?��A�x�w�l���H�bVѮ���Y��~��+�t��;��y��Hlt��hY���3]�!X��m�b~D�F��?�Gu$-�87�ƀ�+Bo�8-_��K�Y_k�6����:N{��n��|�I�}y��=@}${��q<O<��N�u�c��!�u�i�g�<��xj��ԅn�~�k��]8v�H�t�],�*���=*gB���*�4��49АA+�c,�	�k�&ުo@�	g���.�#�/�c�$����a�_�é��L��2�3񠋼����ځ4�g�Pc�W�	Q�@�Q6�ǎ
���%�gq�Ѽh�YpW�����E/�*�[D�|1�n��u��AFÝ/q�T����@Cs�Q�ߟPKE��T��}��pip/_internal/commands/wheel.py�X_o�6���\�[��AUM[�@�K�=��H'�-�$���#)Y��t�iD����H�k��L��Fԛ���t�mk��UZ�jlõ�����A|��Y;��h�\�t�eZ�b����kZ�$��#,v%��6gS
_�B�v�.;���vP�k��d��n�B���+c�m
r+�t�n����ps3�ox�:� ��JO!T�;Dz�
Y�߹ռx�qـͣ�)Vh�3]Ԩ�����x`
L�5�N���AmZ
y)��J��@�p�=���k����Qja�>L�)�޴���s�٦Z���])�{��ٌ�AY��)z�[K��;���l6+$7&���&�lX\����s��;��1��b+�~T�T��>�
�$+�����`ҙ����9v�`��ˎۥé�m��*��זT�	:N�!���d�*��5��մ{������N�6X��@{�͹���0Wlkmc��k��Y�K���T�5�k�-����˜y�+��
��0s0s��Y��0(�Z�Cɶ��;��G�o
bP�{	k
�t�ו��SL��!�d}�{�h�a��ܱ7��0�@!*�-K��b�#YHx
p���/�1�Y��R\�*��0oB��uO�;��
��}b@V�z�~U5�;0e��Sl�Dh�#"�)�W������E{��|�������xw�i��:�O+�J�)����moA6Y������g(�{�طKZ�.�;�Tk�93A��2�Q�����HiL�8����PZ��^�\��e@U��3��+�g�Ia�V�Q�?�r�>�7����ϐ�|0��C��������L�
�p��Rܰ�\�5��"6xXC���9����� =ǽ��P���&�ŭhU��i�:L6Tkr��,�K�[�™��K�g�^կ,�̙����L�,{�~�t>l��]%6�k�]�W��]������!��`���]>��?ՅlK�sVp2�녟�� U�u�qf�w�N�r����B���4̏G���9�o��B�]����d� p�7Z�M�a1;�&����ݿ�y�>2��6�z9�nq	,�I��Kt�
�g���h�d���pI��Wo�.��؎���=��Wd��ÌZ�O�$�Dv
/���I���#yؚQ�����a^�f�Zv�>�w���ؤ7���=�[����V+9P�#�',d_���Q��m��'����l��i�l2�pF��P��x�I�`!��Lo6p�&q6�TV���@㐄�4�F�}�F3��X�f��إ|뽿IJ炝��W�VyG[��a*:��g��f��,�:-}�t��7�eY00��z���^�QzĴ4��?������F�n2��Lhp�܏��cGv�ͺ?��yO:wP����hzr�]5�=��l{�q�|��8�LF��*�x���S��d�4��P,�m�%J�fb\ٜKn�% 4��;����;�I�>�Q��͸��5�dq{�"T*�W)��>5|���?`L."Hd��+��eE�����Ͽ'}^8�Oz�i�ˏ�� ����:�[��:����ci��tR����#'��y{7�hG�x���ʍ��熆
�	a7�u}n�E�#JN/4�rH����Y���Yl���X�v�l}'��N�W2!r9>�OR�=��n܃/���X��L���20���ǿ|�k�����_FyX�/��A����9�;����UGG�u'�Nb��!c�cs�3��<�t6P||��X�p�m�*��t�PKE��T�u
.;Z'pip/_internal/distributions/__init__.py�R�j�0��)DwX]���`;�4�;'QZQ�neg�o?%i6�J
9��O��5p�S��
�V��"��6��>+�G���8�K!]��腪o1���(>\�%�G��D��������n�r���A)Ua
�>b���	����9Qc� ]�<='����b��в��!n��B8 ��m�Z���Uta"w:�i����C�����y���VQ��������2�!��:�xl\%������j��dcu�H�Wg��a���n��^�B�h�ů�j���8�|@��g��L�y\�`�_�c�PKE��T��p�#pip/_internal/distributions/base.py�T�n�0}�Wy�4�����a�0�ݠ-:�*K�D/�ߏ�j'��@KԹ�:��شE�7�׾��e
M�����c��G����3�G�6m^Ĩ��j0Ҍ���/:r�����k�@O��{��IO�4��(Z�1¡l���L�S�VZ�w����v_�<�����Lй=Ze�=��B��;a�U1��� #Ѿp�/R~�n�;�}��N�)�s�@�t;h+�5=X(JQp��C�B���K�������U:i[-�����E8i�!�~����
Mt��Y��OփH�n�yi��NW�f&Y,��P��C!��lW펵l)�$i����}ox��Y�py���2�g�b�"R�l���9�!k(ꠖ�i��2��nR��+����#<8K����)��j!؞KB5��6�e�O)��]��;�x8׳�Z]�:1M�o�>g�$�����d����x����%�+��J�j�fY��~�!8��QU��NN�qΜ�mO�c�ɽ���1���_PKE��T��wK�(pip/_internal/distributions/installed.pymR�j�0��+�H�9ZJ��RJ�fm�㥲�je����U?B����͌�׃g�*���E�4K\��U�p�]��T'���c�[M��c������|�:_��)�ƈ�s2p�`Q4E��JDcH���=��si�e�I>���h�������ձ�v$`]K��v�4�1�(;�@?���m]�3�%M ��,WYh\�HZ-V�S�Z�P���վ���i���xSB4����&�Jn�$�2��s�wg��M�)�e/W�@q����6�@WFW��UlR9��������]�837x��9��MG�w�I����)�V�O�PKE��TA���^$pip/_internal/distributions/sdist.py�XQo�6~�_!��\o}h7Ȁm�b]Z��P���]�,O�������eK�ﺶ�[E~$?R�V*�j�ۉf��*�g���L����Ԑ��`2��kkX9�V�y!hx�o:QW4�~���Is-�l�И�M��F�Mg�lt����6��K�8�X��Kh��F^ל^>QJ��m���}�����ң�
^��?ۗK��`x�
<E�?d'.�:�ݦU�=X���U�sYh�����V���(߁yfߥE��=�z�Z�5G�/e��Ȏt	�ي�O�$�C�@cd4�L��,H����.��`˕��i-�J��%�f
@��I��zh53�m�*�:�
Tt�4eڋ'/���2�_�v�<��L���n�hn�����̫`��M�-(BR
�v��?��C�~���-���E[�z<������tPE:���e�Y�O�+��K�3�����K(�
'TA��u�хl`��{&y����;(Mn���
0��vs	v�裃�C9a��Qa1(,H��ĝ����ֆ���g2&��@E�P@���P
t��v�G0�+ж�����M5EmP���:Fhc�V�g3�ɪ�869�|oD9Qx�ՌzMIX
�9��^a�Rc=�����z&T�82�א�Z"m����7XF����/$,3�Tnw9�7j.y�HC��0�pUT���c؍��bL�g1\�%��t0���
ڂ'OԊ�
��B3n8B���CȈ4�aP&jɁ��>�챴-�0D��d7R]!NJvpr�`�i�Z�c}\�z�ϋ��>�Wc��t����I�O���!�r�Z�e%�a��Z���0Bi��<ǨJ|R��7�
K#�4Ӟ�^���r��|���Ai=Kf��}��R��a�!�\�
��@�j1i�)�)%8$<�
S�\��QO�#��p���W���w����)*("�hG)�m-Jʧ�텶
/8p�rgp�4Ҵl|$��N?�)sV\ �^P��-�@%Y�nvT���cz!�G��zމ<�7h�Gֶ����=���GPiNG��p߈=*�K������q?�9�.�;f����9�����X"��k~���B��d^�ɠl���+�aK(�c�+���Ođb�G��>�η5�I�XY+	7��7\Qߘ�x�[�ɜ�)Y�ώ�_�<ɖ�wg'⃶���=4�<�-���y<d�j����ycKE��,ᚮ�ˮ$Ns��x��m��I�m0Y�����A�y�`�G��<����5�oƈ�a�����0�O\���0�!qDi� Zs�8<��C��=г�Ro�5$�Q/�Og{��4�_���S�N�����?ϩ���&&'����0B#�GwӾW�/��������:l����d���N`;�$Y��"��3�}r��0���u�^�G{�@V�_��{�B?�p<�q��=bH���q:�u���+Sp�b5�_�1`>OVۨM�OQ���^>�Y�c��Ϛ�zq��Kڞ���dA0���6u ���l��!%Ư	�3����~�}m�8��X�%cMA߲l�b璗rKK��m�ݤ�'�*�Z�S����-^�J%�ۻ|i�d�ym�l��Slo`��35�|�"l<Lj��ƌb���@"wD�)��F`u���
\�OA��;cN����b��[M0ڌ6�柿��y�Ew0�t~P�IE��%s�nぷ�_47�qApOL�����PKE��T�����$pip/_internal/distributions/wheel.pyuS���0��֜@����Z�U��UU����1C�!�I�-��:��@w���^�����&5�慌�NL�=�E������8Y�Cc��P����(�
�L gP�|p�e�5^��i�n9�]����Š��?oMP�ǣ[9���C
��Pb�P��ncm��J�_|��i �9x�м�c#��(�N�����l�-e�9ѝN�49�d��D
{jQ��_�� -y06�!��f�N�0��q��8�^`6�.�b�3sJꓞՔ��ғ�+���;��7�G��C6k��1���l#�,W��-ܷGav�o\��f�jU��bGzᕃ�<P[�q8�=����&���ԣ4��B[��&�4����O
�H65�������}5�U�g���TOy���K:�������oZy��j�4�wg��߿���bU]� �Ͷ�vm���)�����]��l��:�w��Z}Mwu�M.�4�}>��7k�k�\�PKE��TC?K� pip/_internal/index/__init__.pySRR��KI�P��+I-JL.���SH�OI�RRR�PKE��T�),YMO pip/_internal/index/collector.py�<ks�Hr�+����B���]]1Y�,?*^[���VJQ�0�.��9�=��'�����Efzzz�==����r)�*-*��u����]J��+��om-�=�XTw�uYʬ��$�osUwM&�d�D�X���qQW�4I��LVR��V��EW�����V6A�/������-�[󳶝�kʲ�I�i��m�����5��2�m#erVʕ��K�~�h�X��@4B�~���sj�.����_���v�,͓Ɂ������Oߟ���O�bj:M�2�)%�zSd-�$p����Zl�!]#xn���d~٭M��k�yZ�\q��g^��*�L�u�N��k�^M,5�`ȨL��Z�6��=��IB��6۳���X\\|�o>2ED�u��$�M�+Vs\,K����f02�#]�L�l9WY��;{Am�46�bt`�R��u^�/��A][�vaMZ(9_��\�i۩��4 Y�&�vh��dq���Bef�:-�
L�f�)�rڵ�9��Č�����U�W�U�yr�Vy���To��9{Ld��n���2�z��"���1:o��r�$��i3Q��pp��vfTEr+ۏ�6��+����Y=tU�a�2�e��(�W���r��U�����d�<�Sq��VBq�5��Ǻ���⯧��A+��R�����:��t
HBKzf��7 0�S]���|�DUs�����<'T='#��x'e��M`ɦU��]N��T�>c��RV���EߝD~�[�x� �@��L��Ou���v���ɟ20�-�b���%�EV���Q�±�[�\���q(�nMk��|8!��3&~G��g�ч���Md��F��u1_oM�j'V���7�w���q�&��%"�`�dl�a��`�H��T���l��P)�%܏/��̢Ѡ@k�}Z�yv��B��Q�`�0�
�t���b�T�U�����Gé�y��>�ڝ�L��=F�����R���*O֠�E4L�_~�A���HO��x��,�ϱ�����j�u>
D���@���t�!
@��@ñ5;�,������ȓZ�Ť7�0�z2��,kxˑ��m��&]b����C7Z�{Yg1ж]�fl�1X��V��EM�Vi�Җw�j�iA�~��m�Fy��*����
�]-'HQ�G���ʗ $��yр�T�˦�S�d��A�H�ۡ���o@t�a��o̞Z�y���_i�D;o�%W�;�d����g�����]T�g���^��p�����˫�$�u�u�ʭ(�;�xh�
��8zQ4��f�q]X���&�-'F9H�k`��ZY�9z8��U��-0,xp	3�����2ɍ�>ڪ�dn�{��ai�`��,�*���~�
���+Ml�/;DLx:��ڳ?`��9�o�V)P���F�[��F�J����_d��z��|��C?y�~)I���zJx�B�<=������򦻝D�d����T4�e���b������fξ�6h�F'UE�K]T����ՠ���6s�[��q���u�"y�������X��ev8?����VlҊ��
}90/+
p����e�KR���nj�1D'2K;`*ܥ�[YA4�r �o–�˴�h7 zli�?`��tiY��(сA7�? ������>��U��p�o��|!@�;�z@�7H�4`�������r�o��Q��C1Z|��	�%�V�(���
Pd��5t
�[�G����TT�U}D�bJ)�"=�E�?�I$�$9Z��>�
���)V���h�Ţ�Py��Rt6�:H0����@d˴��������Na�&�bl�uL����
l :Zc�e�bl|��U��
��L��n��^��|U7��vN����a��d�]��G��ӿ�GG��G�/��D�a7��o�u�p(0��v��-ְ`�oj`i\�@���	e`�Ȩk�F��H���=C����Sk�R
9�r���0�W�SU�[�A��:�wL�d!ĭ��m�]��C�K�Qm�bo���ig@Š1����4��EKM ���
��6������
��JNh$RE�ȋ2v$��Z?1F3���8�we�����t�D�ua�ε<�/yc�܇
��=�-3�/(�5H�Y���&�&¥� ��%�
�s��N~��(X]E~]�
�*��5�8`p�B*�]MW�H7G8��8�ai��~>ɳ�>d�#*��9(8U;�\����
8$'�~I��@L�$���B�:@������1��]�kW�����&���A#dy�aHG���_aT��Ig�T���4��~� O��1��{�"����a���� �Y��
�S[0+��=��g=�KU�8������%`J����ek�uXXހn%��ǖEfu����\�E�!>W���)�G#>�59��>�
-
��3�$`_��� `�9�š��q�	op���
�?_�玛�\g(٤�d~"����#ds/�9I)��\X�ի5�#��?{�vJ�B��ݧ�?����8�����q6�6�asn���r󖂧�:Ұ�X��v*�E�ZX˜ QO���5&PDơ�@��M�>���}���T��/Ggྠ�X><�\:f�a�����v�[>�	���$�p��� �&�sC3���&�ۚ�;��U��L�)g�!N#������G/3A�xMGĉ�e��!�z0{%z���TY�E��&�٫����X��+�Y�ЬG:���x�ԡ�#����@;�!��8	c-_��+R�b����_��������~��.�HNI���+�֢�ǶB0�|GFAR�㰾re��I�
X��=�@��Z��s1�r��e��/��;9>��1rҟ�ң3���2��&Q��((ՕcYC�Ⲇ�&����r�n��>-������1�Y���Q�3&	�ײB�JIw��gi���h`����j`s��$~3��i+��د�|t7��~��4�
8�x�·v�ky�5ݒ
c�JM7RyM�W��랂�+p�[
\�l���8<n!,0�d;9�[����-;�?:d�%lz���/�g�� �aK�HA{�؀�ά/�������Ok��VG[�������[��Jc�M�;��i
��c㹧9�!
1#��ȋ���X`f�яd�9#3�Kp]�f�����',R�yxk/�%bQ��*��o4rN	p%��C�A��q���1���fF}�i�vR�p'���fCa� `61�T��ш�2�c�g�v��XhƐm�?�2UK��XT�`B�3	`�s+���Ws���*)�S��Š�$I�A�0�����n�����s?C��,ʴI�q@�D�!\���1��P]�+�A��І`r'�`�n��7�!�|*|2���$���#\���6��S=��{[���M�Ě�����vj�eӤ�5d�9o�(�HQ�q�o�2��ЃE�b�3�YA�.s��N&��2�F�f��uN4�;��'�f0N�~'���j�2�d�001vp�|G ��OT�B���R=�F&����������?���s�)�?�j�skL"3��t��%B�c���A��4�y�h:�����K��؞�j�|���6ή�/ZN>� �B��u��rJ*�{���[`����=���t6�LEh,��.�?�f�'��k���HO d�}��~L�Wd{��Ά���!��O��3��������W�j8x�C��K�M�
��_��`kE�+dgt����ى��'&#���I��vq�-YH����3*3ΨI�:�u`��U�������3
V\�SGn�R����]��d|��`c
V3�\��A���C}au��j��%���U�?JJx��Fi�G�!��aw(vFa���/8���3��aΠ�+ֳ��֞�!��dmh�I��aU��ׇ>u�)�
����i�쉩C�<��ɹ3,�A���;ʃRUYlR��Ə�f���� ��l���X<����l�z��eN�}H���� 'a(��)�謅p�# ���J'j�Qz�%��zo��
KO���a�>}x��w��>��A��c��t��4\<�S��R�4���"�\+���x���[��)��d��R�"?���{y��O6�I������$i#��l�pl;\r%}c���FG���+�s͙X��%��0��mz�	�t�Ic`��Q�#����W���Z�Qݭ�8����]�U�s�;��|3��j����}���o4ըL-�L��@���[�����k*;�h�؉����p�Z��x��S���JE�O�ؼ�	yz���g�;2�4[5�M�{k.�\%IӼ׆�u���,
G9�Zg�Q��O��I����<�Mx�đPw]EW
�%L݅�;�Kk����}v��3�,<m��A��;��@'�f�!�x�d��н��/�c1���d��a�M��:{��a-���X��B�	��k�G��Q���,�@W�ze�%��Q&e2�B�|i����vS7`Y��nE��s=�sg�?׈ԧd�!0���Ջks�wj�+.d��ז}a�O��\�Fސ�����R�l6v��&\��ѳhm�{T9��뾞)-b� �@<�ڋi�x�!��V�0)W����@8b��
�v�0L;9>�MN4B�I�Ww�M��M]�ܔ�����J�u0N�F�Vt��
��s@�'5nE��X�W�th^�ҜW�Oru MDzNp^V�E��tJ�A�o�2!V�q��8�%"�]���G���o>��b��S;>Q4^sUdTj���z�AL���ş���?�ݖ&�r���-J*�E�0@�ĐR�����!<��|�՟c��y�¢U��\5[��R�$����vP�#rꥏ’h����a�t��A��T&�3�n���hSu��#E�8����
�'*�mPm圧F+9/��ìVt�k#9k�rѼ_��Wc��[��tG�~7�)[����%E'#�/
3uT���5O�Ѹ�	��L�]��B�i���O��T��u<؁]�&�e�5�nA�N@�
��˵^R��!R,~wu��5ē+���B�Rd��<?��ʼn%�v�����0ꖙ�O,�з�yXx���N�W�-��Xɺk�
>�`0~�)������QQ���3��c�����߫ ����m�6�|tb�_�
<�Q���np^��T�ą$
s�μ8�?҇�`��o;t:�2��� +��a�B�}���/̢Q?*>G����,��#�L_^T��?�ّ����?t�8�_�3Ix�ƁY�ߑ�}{AH~��yIv!��v��J��U�|��D���z�Xͫ��ۆ���s����M�Z\p52蘐Y�%�V\��(��s�0���j}��訪�8����fɉ]��2���@ʹ�9M'?�v��Kl���4�դs7�w\M�{�6\dh�F+�-��|(C%%FnWE�.��y#���2Z�����+�̵�	z�N[�
Nd��n�M։x��S�������s����ݤ/,!��X��}��H�gFt���pޞ��5��đ��Zep�k���­�e�)����%������)婜�ΩC��9�9�,��֠-�vә
���������qi56z��1��q�Ӻ^2�oOv�
�1*
z����ʼ �e��^��tj��5���M�]�)q�5Q]ɼcO$M���[���Y��7%ԐM�W��^~4�-z6�8J�t�>�%)�\�oF���-F����f�C�9�,U��/�*7T�Tf;&��P'̭_3���&��V�"'P�O�Ɲ��ٙa��7�SM#�M�	N�Y���-(g��7g��]/�@i[�W��?���ީo��)� $;ڻ0��x(��<L�gD|������~�J���}���U�5E��L/F��"�e�����g�o'�t�h�ݮM�ߕvQo�NDF�:��
h=�i�i�p#|���PKE��T�^�^#ܒ%pip/_internal/index/package_finder.py�=k��Ƒ�W����\D�/u�tN�W��[e���� ,9܅E4j�V�_?�=�+�RW�RiI`�����ӯiL&��}_ղ�ܔ�\���o�?���^ɷ��L&''����f�in��J,��Vֽ讛�f%.%t�6o�{	������U-z����vw;]�V���US��œr�ɓ�j�k�^�z����z�7ͦ��^�ޅMsu(韭<Y��V�;DT]}�6����g�)(/7r&�U��^!1t�|��{?�p�A�]^����i�]�|]^9���\V�J��H�/�:�㼼k
ӱ1m�e��ղ�T�ʢ.�r��@��}�o�N���ݡۮl;)ʎ��K
�X��r�v)�z��D����6�,W�O�/7��Q�o+��=����4�Z�yZ����~��r��H3���;|�仳�i
'��|	�*�qZ�س�~�X_���m�b��mVr��@�U��U���a���c}s��i�e_,��o��aF���/��F�\�G�v�l��E�lv�t�^�4���V�;�Y]~We+��T_�W�/v����s��������}hjS�[�K0?�_���C����ă��<a!���k`9���᧿��=+���O��n��u�]�n�_í���͑i�q��n��6�����Y��d��Z._-ӭS�5�_#����?����o-A^��LFQ����x�=��	��R~��~���焚|�o'/ONN643��RV��+����78`�p�$���l�RI��}���˗'�y/i@�?�-�s��\i�l��C��\����2$"�=�3���"K�N�뺙�x���ies..a��iwq'N��Ks�2��A��ZXE�Ӷ��^U �/<a�{���dl~��EI���ZO�)w���{ش��$f�
F�H|y��D���R�^F�AT���-n��mU�˶1��A����
�'=�F5�gE#0����j=F��~�(�hܷ�s��
�����Ls�y�b�p	�p�fS��{��v�j�|��XLyM�+y����<E�����"���>m��𵊩?�&�;icց�=p�Cɵ���'�<E��$��?�N�m�]�|�l:��i�i��:t��M'��>Q��Р`鬪5m��0���@�͂Q�o&l��>��O�B)ى�'��l�d]¾�q~8�1��q�=�1�Q��{��rSv��s��34)�3�oʳo5��y�Ig&4��gЂmn�5$��4��UV��7؁���
����:�&��PS�g(KP��'���@�'y��'��<��t�D�����M�
E+%����Xt��|���y�vr���.~�����xp�Ǘ��n�&��A\���~�G-J�5Eh�~KP� ��-_KсQ)d	ci�u`!� ��jљ}Q+W–��#�*�vGX��{��@��`ͮ@��
��m	�ɷ�M���}��g�x���u(]��N��wI��h���3
I������+��evEtҊȆ���������ͭ|���m�i�sOo���`���ڧ�B��_C|��ʜ#mZq��?J�>��V���T0���J���sH�s�)um��!�=�fZ
=r����
Rœ��x"M�eU���}]�w;]J�~�M`���P'�Kz�!mԭ�! 1���`%��T���{�}W3^�o�-9@��Ģ�M5�]7r������t@�Ï��̯r�����R�V@h ��b�\��ݩ-��
���X��@D���=S*�о&��Ã/}u���T���N)�e�^��?�Š�QIJ	Ѣ�r(��))zq��fB�_LI �d��z养�v�b\��as����hZ&�*C� ����v����r�A�����'�5hfil�
}q@��m�2��2/�-c�MR��
��{�փX�o���XhA�}'�Ct�!4u��}D-z�oe��8�)	^�E�zĆsZ��6ivR�$q�t�(�?�=�[�笚����b֒#`��YNq��K|��?#�5��]n�K���b�F_���L4�6�.E7׷x��,���ӵ7���3���t�w�du�RRw���z:�?!燏���GU�G�c|	u��%:�ay���q}�^`�b���;ү��R�e%b/�y
�������|U�Ȩ�z�$�<�l�:�F3Q8 �0��x�_�k����|�����AP�����M����o��gn�ԍ~gI;n�Fe4��4��	v/i�D��lX%=oÏLZ�cx$;�'���d�c%�`���	�.ńU���/��΋�՚����;�l���4���Er�����g[.����
ql���H&���n�,�᣸H3�1��\V�u�{�3�_kW��@y�RQ�4�Q�O8ve�Y?m&3���J<�YE�VNc�,�J��޴
lC�G@;r�<��î.�M"׃���a������6��W��%��2%��;MS�p�;��8�Y;���Bc‚�*�6`/vm���v�Mӫ��1`��@���b
B�C�%�a���p@�e6���M�0��'��5�x��;��;n�40Ĭ��������{=�ƅC��64���"���Ye��i����=6!m�~'.o���ؼ.X��U8`M��3*���쬢pe��f����o��ĝ��Х�5��.`m	���2���%�>���R !�B��1�9$��M�H6��o���1ŴӒG�yUX;SW��P�!��osn��Y҂��kn=��H�]�0�t�����m�jY�.��'qX����	I�cրd�u�׃M����^�j� 	�M�͋1k;�$��!�� c�S���R��C�=�O�g�P��t�v&���&�02�x���)N
��� ���R�R�S�E2�E9���\�3��\
#����BO4��o�\㎧�(`��h��F�_���9a��z܈-�s@������䶦<�7���i3ܬ蒇M�_,Y���o��W�]і�XbLA|�=o�N�czv��uQؓfe">N���ϵ'�	�d�	a��nʶf5�hbƕ���^��Q�O7�c	P�ɹ�=@��L\�#]�f��P��	�9*<���l�d]����
)�&��L�E/����	���PVۼ& �0`�P���6�����A��ձ4�|;R(y��%��U�>����Q�$��}7�_h�%eg�`�;�6��~���q���e�wԍC�08/��ޜ�7�������Lp�Fއ�q������ܬ�D9���E��e��i��)VՕ���r��=�2�:h4��a(��R�v�v�BY5
^�����,B@����sW�3u(�����
�0�$V��fWvֻ+7��
�J�d<���X.�/��O�3����d���U�1V�^ZW0	 ���,�ϐ�=�$�����4{!���u�):J��`qQK��ʮ�8�bdu%�2��{��\�(e8�֪3��b�`We��^���9��:
J(-�&�Q]��	��}%��X�`��z�LP*��3`�RZ �r�Ŭ7��7��H1"�'������N�y��Q��I�
�)��e���	)^�k;ۅH�i���lE�$�(�\"�� ���|�����B݈c��	�u�D��q��pNP�Z��-Nu�t\�l�$H���]=
P��mf7��j��GBe�����3�á�㕗ܚ��OqI<�;�R��N���A5��~�2`Rn@v���mp3�<*{�������M_�-лY}���T ¬�%�(�����I�x#��<�1���%�S��W�)�
��G�1qtz|��aoy�H $��6 Y�����"y�!M$�L�W[���M��g��L�W�m��� �q{��n�2�ը��S�@�*/��PB�ba�h���#��vy�I%�I�'N�G�F�d5_Ԗ,���_]V�Ψڪ�yY8�i�����A��qӬ�Ǧ,&�ҁ�N��=��B̞;���h���2��N��,5$]�������t� ���:7��O�c�s'�69�'�G����2]�M�����9���1R���WZ��O��L�Z��tMc�(�i:�CM.$FӤ�`j��o����d�p�h{p��Qm3�d���!�b���W�h�3�f_������R>�xӳ�b�+F��lH�C�f,����Q.�3�lF�do/�Q��Unc��Q�Pā��;W
,ҖN�ą�s���|<��Xx���IY�H^�;z������ؕ��ǰ�rkH\�O����A�4,J1���/�����QqUfEo:��eq����cj�,�0�U6�U�3K��1	�[aa��\G�eru�m�t	��zQ!Ր�t�X��J��C`�Pi� 6�U�R�4�Ui�ߩm�$�<=�1[(��O�0<��8���UD$�L��F�:�] c��Z�e
i�v�G�闤�9!��{��Q$&u��b\`
�Y��TQy�d )���T������ـEY:�/)�-������gx�Fo������
Ɖ~C�Lκ@��'~��T�1g�����'
$]J:=Dj|p�b�/z!�n8)��侮�Ŝi�F
U'S���:ʋF@��뫢�*d������`	ptP\��)oqX�*R��B�+e(L�g�ty]�W�Ѱs�T�৾�,��PGY��B/Q�B����@_���3��.V-<AE�z�5V��IV�w��Q.g?�8��k��D$P�G�u��"
�&��9+��?+	�'��7�4���0L�L
��H��ɳ�^ZԴOx��0���c���Ը�=v8���7�HIÏ�Y;��L���
0v(৫��k꼁��J�l�艃�iI������.-��W�W`�_�
�#<�G£���X��+�M:�&�"����B�_^s\�~w��8]�۪���-�)F�5ۊ2�w�����VAx�s/x@�NU��"jv�%*3�3Hg��qƑ@s�$]8[��QX!,���P�����9~]��4U'���m]h�W�aQ��S�sI*�npS�d#\�	��x��OU���9J��y�!P&��J��Nn)�?�T�N�I��BY�$���}�!gT�ԙ��(e�����@������l0T��������J�����"W���*9�\'��[�b&�qW?�2W���A��7 n`tX����(Dڔ���:	���NUO@4Wp� ��MsU-Y�A�=s�ԴƋ��<WBʖ	�V�gr�!�I6���1�y/Đ�8��R�!���$祟>`��=_p���3µf�Jp��8����09�9�R�3$h�|��=�S�T�������'#�򂾧��Q�k8W�Rs6f�%����u0��!qֶM�H;%��e��[�{�O����A�0�U�*�@F�f�d�Z~�Iz�D:j%�&<� S�0�ď6��G�	��[��׬��W�����,�l���,����*(���ӋSg1,j�g�,q���t�x��¢H��@9���΂��0���S�X+`�L\r�O�n^�f��<�yxk�"jp�Imv��f�����G��#~�o[1�,C�
�i�'��������8?��@�%k���rF�O�Z�D�a�Xn
��K9�)�>[�ǥ��I�<Q,u[�������@B�G���T��.����Mb~���L�@�~��$
;�q���$��C��`��w� D
�1&�����WT��rLZ,���z�����R��5Ȳ�-��g���~�K���P8�
r�
�.���+�Ns$Dۀ�����*t����e/M��\��/l�DB��q���W�t:�������`�`mC�L�Tz0R��_J��� �
�O9{������1<�ő�z����ʿ:�'b��*�r�:bg���h�'~��B{����Pam�DC�;Ju6%��L^�י2����S�R�ç��a�E2?Ӎ�%Y�@̛�S��3ʈ�N�t��T	0
��[�_�*�B�.H��?*���.#�����Rrq`���c)�/{�܄�,��{�X��–0��Ct������-�T�{�ґ�HP;x���[��8y�/���sn#�az�3��Ա˩��/�R������3���Hs�[����Iw	H9"�'�"�WI�Km�
u�J
����B�:~|Iu�o{��q�h/,T�e��i�
�f��l5�%��
�w˧[�N��lyU�գ�Kp��U�6�ԙwi�"��b�@�`�Q4x�k��j�N&�_ll���C��o7�?�#��?�"�C�u:w"��\�����C��(!`W�

T�+��|yw[I��e�>3��:)j,��wD�@�����B��R�u�SP���A�����-8��i�1c	3��xx��{]�v���!�6Q&�%�(��[��FG���Z������#�s�\a�x6Q�� ���$T�����U֏Y�Y4��\xSwy���	��}]�5�Zf���]���Rt�',�����[��c�xb�����ְ~&��M��R��l�)��]�s�'�	�Q웵�u���b)Wu��f�\p�2��
�Gn�-,_�6���/t��8��R�:(>Ӈ���٪�q�љOU�V��#�5E�d�
^��Պ�"�r\J�c�G�Ӱ�CU��(��V�����$�'@A�,-�%��1�Y�YI��f$I�l�t7uA]��[ze�<��7�{�9��y^J�.�d�[����s��D�R	+<KU4�l�=,DJ����M<Ï_���M�@�`�*��#e"�������T�=��$���НAkuP����j�>������ٲ�j�ܳ9���)�����j��.R�~�\�.�����̶�t�Kd���UGq�p)&��o^���ð�b���BqcjG�fu�`��ay�Ιݏ�8E���dX5ǜ��Y�vp��dR��������O��p��yN��@���ӭ��7K�wL�([�4;�����;N�H�'R��C�z� �n5���[G��U�ȴl�@�����EL�́�	�X�9����I)��0;��&��2����1���,`C�1�idC+�̂ϔ���b�|�3N	e&��:�vby-�m���`����	o�t,��d	z���i���Bq��C����G��C�
�G�0sLC�)w�	�M�FY��m��B�1N�gi��f�	�RPN�(�s�柔m�[qV����P�\X]�n����b.�����Fo�)�o��e(�Ҝo�[(q�	��
�S�7���벪sB�R[��.�'�d��Mn<��@c��-*Zv���
��r,��ł��L>��?�8;gL掱�=�a��$��@�U��К�ʹ��j���	,SUC-����2U�ʯf��u�
iry�9F��G��sXdt&L�Zr���ŏ?<�@4'$#�'7�6,m~��a{w�#�U_��n|�>u�Ek�g����1h�W�cݍ���F*9rX�����(yRܴ[�����Õx���T���q�/U�H
�P��+�B�y�0Qɤ9�t��<���T����&���c��G���X�`�j�]u���:�	X�P�(i�n�K[Q;t��֍��)�X,�>$�5�MS6A:��f�;*�B�+���������d��q��p�ن<ܚ'^�=��U[�$'z~��e��0�}b��s-C��ݡ/����8^��i-��t���Pf�^�gm_*O=�4L�|�<���>q��eOS�F���Q�X�N[�*����Б<���d3�/��e����y*�?����o��}Ӷ���Jh�,vXZ���vvEOQ�w{�o����#jEK���"h��u�8ie���6���D��[����+��׏�.�����!8'�@.m��w�l��A샪ؚ�� 0����&oe�$����XU����?x�ě�t�C���@�W���|S,�X�T�����MC�	j>�â��0FS,��zmt*�e�]�$�$#F��͓i��(����"K�Sq�^CçSb;A���㬜.��Fo0�e���У	i[Z^�prtRq2}��SK/~��h6�қ\+��1pE�¢PDnP�(!���!���5}���4g��q<���Kq��C$O������Z&vx�=`�P�f���d�#�1������D����O��&�<�T6�}9�-`�/��=�r�a�O��Qٮ���eG��N���Y��G^�o#��[d< .L�)2=���Vc#?�%>°�<a�u_�mͫ�:��L6��W��rVնT7��|B
-d*���7Q�W�ޫ�BSp�@U�'H���A�Ju����_�W��n9��Ir;�Q�Mչ>�a�̢.�cU�Δ�s�V�r�U#Y��Ct���q�	]~�r��Xxy"��&�p�]����eP/
��b%_��lE��MS�e{�0pߴ����)4�M0A8��Y��'����ݗ2���+cv'`��}�%�A�L�\�ؠ��,��V�XS�I��	A5*�5���7�o.<�޸�Bթ�8%��G�#啖O�43Vwm�>��+����29
�Fj^ⶌr35ċy��^��jj��N�T��)��䝆��r"�}烥7�@Mޑ��:�L�.p�sT���vj"UQ����0�=X�i!rn���Y�8C.�/򇇄Cbm�L0��[�*��i�㿾����F�w^��sUvc�0IX����<4�uzmaN�ֺ�PKE��T�+����pip/_internal/index/sources.py�Xmo�6��_Ax*����\��̀�Y�/�!�m�E������7�J�8I�
G"��I�/��L��V�@�Ͻ�s{,��T�V�v'�:�h�g@\����J��%���r��~/�PE*#vu(%_)�8P�T�W9�&��"yjy-o^�"Q‡z�R75�އHV�AK�:%V%01��w��6a�#�s\�Y��x����$)�=O�q\�C�76 �]t=h��q�1,�V��)�r���툢/����T��C�J�e�L�!���:�Ӏ��S�Uɵ=�W�7.7c6yׄ�Is<��F�Kn�0��83��G�#䏘���oS���aթ0�}Tv��d�s�K���J���Z��J�d2�B� xub�A2�>� mP��`��v▃���ЯW�-�F�3�C�-�kF���r�o�1%�Ć<U�cX.4Ϭ<>^��H }wv/�&$� ���XM
a�*�B�"B�=pc|o�"���]����K6����w�;\e��Pri�3���eS�&�حY��
VvNNX�&��(�	�p�#��Ī	8��j;?_턁�T7.�2(�(�*����6�,��[X��A�Ք�P`�A
U0�f�6�(|�q#�|��z_o�#�dK�#l��Mp1i�櫕� ^%����Dˁ�@�!
�G(���B�I��q�
@Yu������;�<���ϸ*�s���M�9��#�!����Є��ʸ�k���ڜ.!�X�l�Ԁ�'��	*��&��˜Q�?"T<$��y=ßitcT����=�ؠ�$60�)��t:Y!�ù>a"�
Kٟ�h���RAw���X��0��{
��.vΡ-���a�+Jd�[�z"���ml���,\�^���@�
�)T1�Q�2�``�ү�>���J/�.���`� ����q�7C�C�V�ppR�Oׯ묺r/�^Y���b�z������ޣO��e��e�kB��;�o*�!����O��4����>�6�ND�����
kC��p��{�PC�B�b'OE�[��Hn-,��-{Z���زZ�21B�A�îH��y��
I[�ۜ0�!�ĝ�\%���������H>�]	�	������2��ْTG�z�����&��2���l��Z�;Iyz:��4��,��D�ڑ	k����}����$�7�>݆7�����܄�%���T[�Y�IlD{ؑ[�=|J��ޒ���*�;��*���(�Xw���-8�����l���|F�����ּA�-���|B���������Id��L��yuې1ٲ�q+�����?��!(��(�%��Ddϸ1�>%���]�u����
�g�P�̆#�ͯ����b���#Y4PF�ӡq4��!��ȵ��_
��ٓ��^��Դ��i�4t�tz�<�]�ev7����K��Sn�u��vό�#"�L�BEDŽ^�Z��g�����MFZ�/���q�R4Cw�0���ި��$Uې�DPKE��TSm�/35D#pip/_internal/locations/__init__.py�<ks۶��+�t;�r%*Nr��Se�I��:�'v�t��!�5Ej	Ҏn��}���d;���%888��x���B��tVdY�z1$��e�^���}�
�EO�W�V��Y�����<ϖ�X�����P��g�P�$S��E��Q�`���4L��\%���W��ⴐ9<�Y$��B.�z���ۃ����	=�Z[1,�eK��,�t��O'��Gr��Y���5fHF��]�yQ��L�ͪ�LS DP��̃�>�o�
���Pٓ�{~>�|^�é�ׇ�4v)�`���2N���\=T�,����U��/�<��&˯xTŅV��*����J��7� L� qFO�:2��p�i������@�}�J�d�6Dpe���=(s٘��R��0��s�A{r8�z�2��k������ :P���r�	U��E������@�!�HX dp��ɫ��~<�)x}��ǣSXk|M��y&^LD��P�>��"9�Yde!Y+���腘�2��i<�t+Vq��H��ͥ�B��0)��Z
�G�_�a�<,�S�w
Ui�p��b�����0�(xOK�v%fa*28QG��"9��|b�JЖ�&�4�����q; �ih�ŏa�$����IŢ(Vjo<���E9E��֫pg�J�R�w>}�=������Y.
��p'q�!��b*`�R0
e�f.L�@F4�7��Y�yJ<�;��Ih��[.$hMZl�^oG��"�b��4��)���3�9���T���s�
���p�EB�|�e�ij�H��+�@�a�b=�D�S2��^�2+�,͊�c��������Wo�����5�����ởz��ms_����ћ$ˮ��+LWY��ɳ�;�F�T��$E&`��f��8I�l��Z���9��Bh5�t"����㴼T��t���KE��.2�,	Q~�@#I	vظ��w'��GG;�ް�ו�i��̮1�@�ƪ3�N��ό���	��2��B�S��<�+�Z�+��N��
��E�`A�|�	�ؑYhLz���g`O�h\�쪎�ӛ����Tx졙�߫cU`s	�f��X=so��c��5�;���O`�}Z�+S}�έ5�!C6;Y���BZ�
 +,u��D��_6��f!��/�/*�����6��3�O[q>�1ބ,(e�k�`���/��dÂ�Ҩ�uی�*K��܄kqH�D�j�R4"zӑ�#��?M�4�aZ�r�
OԜm���#�M��:XX�h���yk�eb�u���4S2up�5=a'n2������?��`�~��K���DY>x��¤k���dh
��Fi̍�B���iB͋-�z�w����G����qi���HHY���<�@O"p����AmwT�p������2�E�� aE�Br���s " ���6((8~��!���r	�A�txh�!h��Wt�7|qP�=�yh\)��0}���K��
�d��6(��\�-�=LG��j}wR00�yGi	2�PU�fv+3�s����{�e
Y��!���k�o���w͋��@X���𕚯�c\݄��,�'f���*@�=1���c'����7���cd��)F-��a�W�W�| ���
`�<5Ђ}F�$tQF3T��3��2��D֥��M�н q���QiA��p�pjVw��Z��h)��t�B�)��@f�2e�!��@�	�t�\_����6�0�p|?[�f�b��u���?¤��f�H�� �����X��b���?��-Po�		�P08�C�Жԋ��9���e�"pXv�a>�YRF`��& KqNI.6�OC_�fJ6m,��6�'R��B��id�;��>�3�����2���B��:��T7+U	η�N�t��a^B^A�3��0�Q�:��>l�[/-:�+$�[����������~�z̳����J��9�k�l}HX�TQ�%p8�~���
����*��!l=�sj�}�ҚD�
Ӣ�ü��������w�f�V�<�x�KŽ�*{�.iD� ���(��i�#��<�ɦF�1o���F�à���	C̔Ae�ֱL"v�DÆ�1G8/��!�k��F��D�0�!�i��?�;�Yn�Qv8�T(Z�Y�a�����C1�L�
�G™��r��`�ԒC�~�@,�+�19�T�4�Qd�$HG�F�b!��<��;��v���
������L�<�䷪#���d��eQ���ߪU�wjm��=��_=aY������I$V
�Q˪*7�[�~%u+7b 0��e�=e[i+�<��k����h(
��`N=���{�-��q��lO��L ��XdY��9���f4�����Uf����uqzLQ�D|����skm
�ж>��*C {��+xf��!o(�l�����0U��9
5U�IN���U�`�����},f� Uwk^�=W�l��h���SM�`�"�A&D���j�'�C��Q���$[��*�:��U�Z�񲦆���:���NKt�gt����z0*�8}Ɋp��Se�l7�,�ՠ
~�d�g�ih�44�	/��E�5N�l���Z}�	��ws��3d���X�pô1װ/.�%c1����
�9Q#�����<�#��ƨ�������k��\nJ�׫u���+��Bl�L�K�p&�D֙>H�S�N�Ǐ~O��T���y���gU����U�8
p��$���4
�����\ʡS`W{�ٸ-�Ϙ��;�Er'\m�w[sI|0����}�dD�W�V���X�|8V5{��e7�n�O�4pqQkYS��`#���� �_HNp,�z"<����M�� Z\j�$�K#�+�ބ��7	�s�22�`�	�rE��D���]�pF�1ͮ~�ͻ+�@}���rs?��kn���\�r�ۥ�}jʪ�-���G0�K�}���еx:ن�E�@�b��8��6'����֞s���͍e���@����oÚTu#S'S���+�e�H�uȯ�Vmi�ͺ����B�eL=��k��GT�f��Y,Ў����Tj�3�6�N�ӘB"{CYl��njQ�Mۜe�M��M�/��5�����0��I�M�-�ag�.5Ue���ȍ�����"C�i�Y6�:��`M��Λ��̊�"zG>��mc��Zw�~;�_����_�E��8�eY}���ui
�h�R�\�wY����$Q����
m�Z<fA�b76����wve����Hu�&hTu_n��B�I�:Pt���S?���J\�%�)�����sT�>d�|����EX�F�B�n�e4d�K`[�-h?��T?s<:g�߀Pk�`m��nۍ,�����W�yc^]��[V���
�<~y\�ӵj�Wc}0EW
b�5%�㨮��f� ���~�B[U���k�zY���39����u��V�T�ҽ�&È-����$�v�3�T��xJ
� 
�}�.�iN�f�[v������
4n'�恘��O?��0�Xy�BB^gW�D��_ǡ��\��D\�앮�����*mI���g��B�lr���)%�j��XN�vc�,�!<�M��[�Xɥ��]���8�:��n�;�&�t�l�h����(
��x:�*P������FG��
�S!����*��>�*L���G�X��h�u���0�M`����V��Y��v�n4�v��gJ5�+��*�(�SyE��^��Ή��1�K�L׎e�R1��_O��s��+s��$�x�S/�� �7 ���a���7>Uƻ�a�l�#�+����K�9}7$hU�짻�꥽zU�]�k��ԭ5�;�I]���뾃����F�����x�uU�tHe�>�?�+}I�^�`���ձ45�-�68�amp��x���4��ż�z��\���&����
�b��`(�/lN��R�	/�ʳRQ�d�e���B�C����ӧ�v���)L�"ܤ*Λ�K���d�E�3e5W�*"i�UG����h�l�O��V=κ�н����9U__5�j���*�TÝ*x��=�]��c�FJ�>_�PE��=��6��o�tn�j%���g0�Wֱ���W]��v��VH�����N��qC�ݟ�q��(]]�$"�V�T��j�z��8�-��4����\y�$`$jɤ��b�^\T�o�aJ5.������ʆI�ʠ����H�7���8��ە�1�ldxս�*�U�2N��\È��<+S
�..6�l	pۅ�wz�1�2�~�⢺��7+?&E�����K�x�h>+�s{@q�I���#�|���g΋A�{ላh�������r��*6g�[�Ⱈ�Sc�@(Ȭ~<�I��C]��JQ̭纞�[{���	��d���d��i���j�u�EC���v�&T�7b:-�o�kC#��� ��.Z{���G��`���ŕ׻|�A\?��?�UK��v
�����T�;��z��5�}v�{ޫ�]�;�$D�D_����H��5��Ď��`���M�V��=���"�1ۂ.⦅��x����qQ���i�8�nɒ��֍=ƿmxO�?�}�(�8
侥�7�>6���+W��}���(2:�;���*[]�ڻ
z}�H64s#���ޏ�7S�(�aۛ�$VX�a��W�Rt}���,�$y�W�bf.R��E���p����B�)%��_���D0�Ұ(U�t(�3p�\%ᄕހ-!� ?�Z��TA������SI@rPBg
H�
�)i"�����&3^��_�W��"��5^�G��c��D�3��e|*\a.F�c����)^�b�����P��|�X�Zڜ���:R�N��&I��8-�����-J�d<�Vx�޻�ެ�G�T�bGnov.d�j^��”�e�L;�1?c��<<��2A�|�%� �#��8�Kr�J:��W�du_��k{52ٌ�M�5�]��U��?6� ��1B�uF�9
�j�T���}�KZL�M���Ë�PKE��Tg?X<	n%pip/_internal/locations/_distutils.py�Xmoۺ��_A("w��b����6w+ֵ�ҡ�@�%�f#��$�+�߾��E/�s[lF��y�9�9T�$oUɭT�a��Ђ���g�Y���ܚ���X^���n�ɘ�e�$������ku���h,3;��[��^=��q,��`��ؗ
����N�b����t-K{�Z��׫�ymiy�a�l/
�*Rc�`��9V�d_��Q��v�BI��#�a��*U�(�;�v�A��Ϣ�0�)�#��UC��pQ��J5���ޥ(=�B���=,�X7��n�`;k[�\,���u�X-�c��l!��Y��?�t�'�J˭D�ϲ31a�!M��	G{ؑ#P�Cn>����1|�B�[�mQ�I�G����>��
r!���c)Z��8�k���2Zn�l�� I�0o*����6Z����=��w_!E�ㆽ��a�	�_�c�	7��v��������A��:��bQ�W/|�G![a��hw�)j����R"��Hތ�����9��][������ؙg��Vh��{U	R[��$��~�#�m�؁��w���y�Im;�M�Yt�4��J�b�&�kn�8{�Y�b/��rr6�L��bJ�|��Ңh�^�|6�Ub3
�w4uyE���A@��P�z�֨Vv@��w*�a��ݯj���UiT�Q���Zl��S��uE�S���Z�S)sv�'w�d4	��eB�H��h�����`��'�GOCb2�;���G��-�,p)�)	����I(��r�W��f�[���ML�e�$$�6��j��U��&w�l�ML{�P�\H{�=N�f�-�fJ��{�Qp�D���T�ul���+%���)�vʦ:���)-�QM>�R��Z��X�p���~N8}������ɞˁ7�g�(��R��
P���D7	pyj�${*)cI�]2U&'�]	ӑ��w�%�Ε���W�?/{�=��P+��E��!�h��4	Y[J�ъ��	/DP����ы�F�>���y9���K��"B9����]ݸjd%��f�F����#����D8��0�a4�:M����?��#JL�E >f��.+�-��C�����~!�5����PDRg	5IR�mZ[}��_�����<�;@k�/�2wzW},�B,�q��"����$��Wƒ���o����S�#(Ǟ�r{������8�<��ދ#e�hZ��� ��F�rku*Q;1��[��_�t���L+J��n`�Ce4�h��
�H��E/�ϗ��T�"����{��S�
��x<P*�c-�c�GӉ�"�2���b����0T�^�Ѽ ��X�i�H��j�#;p��0�Tkd&s&�̩P��p�+�Z���4����
�Hlg����*Y�=��$JF�&>��&����c~z^y�V@�ԑ��&�b����p�0แ'i�4���'u���	�2�!� "��yNŤZF����پG|w`F�ܓ�NZFb�=]�$~����ο�p�cŰ"�N�<���FѨ���A�<3�4��f�׆��'��o_�M�~7fdT6U~�ry,�~x���^) ����7V���L����,{��ͩ�&1�O�
��M�O	jUkaZ�T��o�mg&
?'&ww��G�@���˲�0��J�X�V<�V����wW�5̀�rI8#���������]��|g���ݵƊ�q���t������������
T8d-��~Z�M�ft�Ր��mEH�HG�3��V�����������x|R�硽�z�(�(��AB�ceç�|v�2t��;YfԳK��f�+_��З���eL.ԏ��*�
'Oc�����Ɏ.��i��j��O6�\8v��~����|<���	�W"���9��i8tI��cΘǛ�,�fc����+���"��������$���$$��	"f���Mo 	��$h��ߧqs>Bǵl
�W�`@��çO���M�f�ы��TLF���X��G�]�%�X,!�L�E�K#0}�K��У�u��]�j���@����L��@dH��5�L:�s�x�DB�e�M��pE�`�N֕z"
���K\�#T(;՟�]��&
�H"�z��i���%�Y2����t9z���^�
1\��߁-���y���m�J����I�q�ݒ�o��r��>.ު�Y89$�^G�z�cV��y�:�)��l���O�_�R����en�/�����s�kM��N'Sϒq��Z�|�t��A��`J��nP�w�Q�v�Q��<����t�"ˉv�O_I5�|�P�x��1^2�<�|�_PKE��T���
�%pip/_internal/locations/_sysconfig.py�Y]s۸}ׯ�0��4�lg��wƛ:]w��'M;����5EpҲ&���s%����n"�������M����N�wi�*�}һ�c�ʕ�]E2�U�6��U�ʲuɋD<f�j�*5s�/�^�6[��x�6KYrZ�OZԗ�nxQ�'n��F�Љ6 ��۟/�q��r��ۘY�1ٶ�}�u��B��xݖ%�H�2uڿwz%K��Vٚ�w"��jbv'�t�Uu��%�~�6
I�*���j�[U�O&d^Q����	d�̳i��X����d�W��L��^�8?�U[fƐ	^*W8Fˉb�:B.V�-��e:[,X.��a�Q�-d�S��1ӊ5kQ��J�-߱F1���Ӭ���E�5o�-f'iU��|<a��8kV�_��D	��Zϟ�5�E.��7����'�Z�5�&3ͶkYƳL�e�0 2���U�n:.̯`c��厽��5kUB�OOrV�s���S�.W��,��{�+a�Wm���=b̶�(�
eK��Xd<�n�o/��̒L&�?�/����H-)o�r-��G"�;O����Oo>\������N.=���(󦩧�A" ��pPQ│(k�T�U[�i�Ő�Α�;�[*U�'�(z�ЊL^A}�u��rY�zvyuIֺ��M-�mc�Ӂ �7��ٕ,��
5[sm٣+�I^88F,�Ν����=~� ��8�b�Vy�|�@ri��qo�N^l��Qݝ��y�;��d����Z1h=��g#@hb6��6�r�30�x���]���i�C�!3F!�Z,\*�|�������	%�'��e���:=���˂/zV�!CsJlЬ"./�&dž���F��:8pL����9nX4�%�%�GG��6�s�C�t�͖��
Q>�G��5�]-����ѠY�KXy)�AB3�
iP�tA)��ƥ�E��ŠAZ����@�\��&%�!3�t�=H�D3����_�
��/�ŨN!f'/EG"V����`�~�s�}���
���5meXI q$]i!�%��
F���H4B��p�-w�!��d�r������6dIΜil#kU���Tt9�.`�hKLJ�~7�����P^m5����j���b1;�@Aď���P��[lY�F����C�A�x�������J5
��40�(�%�S��"�Q���k�a��-A���8�dt�]5�ԟy�g���p��7��]&:c���i�ׇ���ߔ�����pFC��G�;�#�x!�i[Y�vZ9Sz�~�6��w�G�{Ů=M�Y=R����KeGe%��8�0�F!�a*c���y6��^Ԧ�zb��d�~���{|7ۘu�ĨD�~���y�i49N�O��1u�M�t.QT�̙�x
Y`5p`��?�Z�w>���f��ሡU,,ͩ��3(�	�ދ���Hi��^=Cb�&�d��|�t���5��1�А�3
?�+Ȋᛃ���o�Qd��ub3a��ڏ��m0�Y��4e
�;�U%�<\�4jF�z3�͉*�D$473��YB��d���II�͕	/�@�+��1�2�qx�2��"򱝬5�1��w(���߿	�
Dn�D'v�J�y0��s	�8%�F��s�$�-6�ݵ~g&P
ރ�}>���'�,�5:b�ӭ�x�w�VGlb����w��M����d�G�eL��X����$Z7()3 �Y��k5Cj-N�>y�;Nޕ
���Y���t�v�@K���lvl��Q�[�L�vSӨ�M(]\�j���v,�VwDyts��,<QG�qC����Nզ�Ճ̅�
����Yg��O����AJ4����������itzj\����h�j|=��
�����Ԡr�2�4}F�6c�wlu׾��b��,9g�i�ٿ���ʚ�ba���Iq:�
'�V�t�.W�_�/
'vvu�``Y㻁�=Jד��~_��Q$�����}Q�7���G~έ}P��nOOY��+�y:���&�	C�y ϒ���	�O^/eC֌�W�cl��������I؍�re;{�FP+���6_
H��1Zwh?v���NӰ���Ks��'G��ɧ�������$a���U�8����=[���Ǫdu�Ez�+��P6�fF7�f+������� c��z�Ӄ(�&����R�8�����ǝ�8�oG~	��ܐ�I�
]V�����@�JO�_a�)�3��Z�_�c�A�)}7��(�\ĻBu暛�Œ�H��3w>�5��+�Z�+��p��B�
�+�Ǜ�A��e���}
��h��5}��gڎ��cr����Ɇ@l�.�O[S������X,&��l �W�p0S�~�o�Qf�o_�w��\CI�u��ׅB����Qu��y��
Ϯo�\�����
__��j�D���la��2�޿�5����lYy�	
5��Kɳ�����,�4��^�c��p:��8����BO����M
۪42�����zdj�7�Q��觷��c����s6�PKE��Tcc�~
pip/_internal/locations/base.py�V�n�F}�W�Q�L%�C.j8
b��FZ��"W�F�.��ԥ���g�Q��5{o3s�̍bS(miQ��*��@T�]ay�>��2Ur!�́=B.�`�Ն
Qĉ��k���S^X�����4��9s���~M��"o%XQdB�7��[�m�r.���.�������>ztQ�H�}�(4��Zp��Lf�����I��jF�ݸ4Б�t�������	e���4U��J��aɅ\󌬢e��,�|�,]�%�]���5��Գ��{c�#@�d�Kn�ܮ��<s"���͆}W:���[�
�D:���g~�0�gܖZ�]q�Bg^�j!R��Zsx�`W8e��S�C��2�T~�		�X��'vte'|z�����l��~�Cqmq\�Ɖt��'Z)I��39$�d�/����7���vE�FI�
��L��]-���T��[>����U��K��L���ߕ�-�#�A���0P#��N��$��Z�bc���ْ�b����Ԑv+��О���uz3�&d�v�_���7�[�5��BY�y�`��
8���r��>�(�V��QY�����s�A��s
e�>�h����-7°��ZJ��:��o<�2<7��h�?~Tl�BN�K�e���	Pf�^��`�]���w�^��Cx��]B� ���br�e��Nl.�;��j'��Wdcz��~~�����I�����P�Db�R��A]|T��7F�I%�C�Iouߨ�G���� ��!�x^�n�cZs^8e$$���w_�%�Zp�2�܍�<�s`:����i�ƅ
��hp̃�c��#t���R��n_�)��BVO���c���^�j�snyv���Qx}�CtP%1����h(Ɣ�@�cN�B�5,@���:�z�Ä6�No�g��c$*�
��0�okd=��6j��@a<kN#��ȪQ�[�h.�(�������O�#�.������|7���l��K��cC΀ءU�å)]��+f۶�#����V���^U��wVޞɸ�_�
�:.,z�������F��ู������ϰ8�e��m�ވ���%х\�	�(�O	�2���9��]^�At��P-�-���?o?O�|�]\O�Mg���A�PKE��T~�N���
"pip/_internal/metadata/__init__.py�W]o�6}ׯ����L��X�%��mc�6A@�mq�D���z����%�N�
ˋ�+�~�s�!��Z*���l_G�[6M�)�n
�{�;m�,��j^m!��-��ͯ�7�o�'�k��]m���H`��Y�&�k^��c\����p�Ӓ���2r�)���j�~���A�uc#$�2����U�*����V�Y0�ܰR�]xq?Q�7üg�ߑ�J�a2Lh�W�&x
r�7˰0B�����-���${{/��<ʹ5�2oM��-3$g�CءW����ٺ!��5XY��U9Z�(� @t!��F3��!%34���S8�,m��Ħj
��H�=�ϰZu;�v�jR�qKӲQ�h���w��Pib;�z�'�U�ؙ^�?&@��9�Q�M�k�²���5�Ĕ�y��m���7�Lwz�s:��
��'�8]['Y\/����fq������//�^./1*�+��9�yf����h'JÍXy��b[�r�m���_��FBӐ����֑/�/��&+N��J���V�5V?��X���X��8>��98+�#�<�qS��l��
e!s/t#��c�,ގ�-U�Φiە���'~�n�C��͕�*�?�h�{��B@�M�*��q�S��i�~?y���t�<��ధ�'��� ~����a0���%�ߎ��pƩ1*>\���9�`#^�he�"�W~�V�B�}q�9��kރ[�S�޺����/ݱ�
Ր�f�K�Y���[dy�$h�M^rB~�ٯ��_���	�gW�$�u���ɠ����M���P��h�Ⱦ36b8�ȸ�Z
'�}���d�au���(�}�����X8��Bj��A�qwz�~�g���ᘣ�Z�@�)p�Q�QvN,�xGAotA�2	4�P��l	l��h�ǭ��2KC�q�>�6+=�.1��Ns�����U.�Tg\_�t�2��,�gꞍ���{U��ߜ�-��mw�@��vC�h�X������}��������r˄�p�[�;�lx,�ʹ��{�X��L�B��ۓ2��p#^����3��U�#l X���V���G�c��t���D~;uҞ:Y�cr��&�M��80���i?�i�`�W��a�L3�h�0Ȋ#���%�����T�}����6�i�݆YM-ʿ���O�j%�?`?��B�[��fO��i�PKE��TAm��#
pip/_internal/metadata/_json.py�V[��:~�WX�CAV}[E�#EͮzٴU7{^�(r`n�vm�-::���
l$G��3��3�f�!�������JT�0F���힙��%��ne^	��V��
ͨ��笡��L
�(�*)�!�SD2HEۢ{���@k��~�}l-L#��9o"�`�����™�|X���|����i�L���#�n�WZAD�ui�,!~����좈��ď�#-5�Qg`wN�׌
�KQ�R�I���&�˟ki�,�nQUT5Ӄ@��Isщ�.� �n�U#�Q|��U�LOE���O��+/��O�6�PWı��rI7��龓���'��S'?�Tk�3�y���f
t������ޠ�Ӽ��'�8-'׬�OHM����Ȳv��W����Ӣ3�n<�� '?��[,;0�2�mTH����a(0��ĩ�R��
�D�,i
�#�������[��Y�Ci9�F��RpӢ���Uv�%퍉��L�@����߾��?$5lW��;�ݞ��gkʙa�oA1k���	�9��.��׆r�����,�J����	�39Ҏ��oD�c�r}������uǾm��'>�s�G|�cƟ��eTsYa�
y��/��� 5����8i�����^�5듟���h
�S�����.��RB��ӟr��`�`��'Ԑ�6�?gH��#���S��kK���� �TxsW�X�`�-�v`W�^G��=��_�l��1��&F����̈́5��9/>�Ì��&<@�g��ݩ�(GZ��s��Ў?�o�yv�5&�1tq;�=�--���v�H�/����;��#r1�U��3-�2O]
�)0k8�b
�*j_K(ψ�صN�v�b�8^��VM���Jf��3D�eٹ�\���6Cm�/Vo���1��3�t��xX�H�f�0��w�1,[[�k�ߦ�i�W��Ne���I��S'����l�*aa;Þ�(���PK�mW�ζapip/_internal/metadata/base.py�<ks�8��+P�ME�I�dwo�NS�;o��z7_���m�GA$$sL�\�����~�u7���83W뚉$h4�F�,���� U_Ŗ�Y�R�0�M�E�I��gY��{Vl6i�1?K^_f���,����:���*��ޕЇ�W��of�y��g'��?�<����ԣ�|��</�L�uZ��w^�4��y�Ƶ�vZ���2���e*u��|+��4�ޔ�g������(�˴�k�'E�<��H��m�JlE^K3���}]e)�t���v<ͯy�&�̋�_߉���:�,��E�8	�u_�k&i:��~TgLq��@U V(>Ƃ猚�W��	��IU�P�����k#�HƗ@��i-"���3�HQE�lжHD&���QSe>_��=y~��2zur~t|t~�>zubX{��������M�~`h�u[`{3������H���7�o�Uq-X"�i�"Lv)*�C�M�����i~G(^v��Nүq �T�@*#�w6c��[z[ΰ��k��u��;��r��.�(�G��0�r��I��k_����*�".�Xr�Z�G���a��Aīt� �5��[��Ü}qpp���3�ֶ3��³����4Ӻ/�}I�&Q���Eh��8�R�?p)N�ڝ@��Av�p�ϲ*JQ�;�°�D�l=e�f�TC��x*W}�̈́:E$ĝn(��+��TES~	���Ej���5M�Dh+aH��R���a^(�La}^��A�\��8�h��nNÅ�Ge��E]0TU�@I�y{L�C5��Ka �QhP��JHj#��e�@�F
M=��PQ�f���7L�r@Z�(��&�PP΍Zl�/J^�!�2<cT�5�}:P������
:h������ZëD�T�\%�ڋ�Im^[		>��t�fi�c7)�.w[�y����f[���Fc��K���6�咁�A`�%b
vXٵ�73:��*����MQ])إ��B!�,d?т-��@b��r�L9jr��_�1�-�\��q յ\"�����7�t1�Ye
,B#0^�`�QǩQh�O�?��!�C�L��;}*f#��5�?|{�Y�A+��	�V������c�|�&�j6��Z��<T��mJ8j��-��(��`q5� �{B����~�$M:i�6�F�k�@�.A[����JT귫�][�S��l+��"�J�̯�I��ڟ�TR�����e�Z��i�؆��v�z"�ȩ3$	+�PG�A��p������a�7�Bd��u����3��A�:Tـ���>9�G�hb`/��8NW��0{���_���
@t��%�I
��N'�u{��7؅{2�(wp�K���_�X2�E�B�P�Tō����}.�]!a09u��������IGb��fTɽ��LzT����1�@��:���Êߐ��:��&�		>Ow���1��ق7A �s��^{�;���`ِO�9BT�5��v�yscx]��jF�x�~K6	#�<��6�*G�pFc�S1Y4U���:�V)�>P���+����00[.-���~
M$���N�L���� S�iL����j�d/��qu�k�C`Z��߂�_Y3���I�k�.�����nY�o��[W�$�2m8��}��뱎H�s���#�/�K��YD��B�Y�!��&���q�n�7˝���6C�.A>ʰ�).�qQ[ ;�C0��I�#��"���0M�K+j�̊�Dž��]���`9�V�?,,'�?d$��יi�v�Uh����b2��;��	\'���(j�� ���)�GNd+X"�]�6q��s�s��)�uY	�Dqi"�A�{�u��j�g&���v)��Ȭ/Ļ̋�H
0�	�/�S�Ǡ�_���\�u)O�n@u4+̧<N�O˴|�J���ٷ���o�cK�Y��m@.��6�����X��B
,I�B+/�&K�z����.�%������3�n�4����%�o����r ��tԚ���c�Q����3
F�D�i�H��M]��,� ��W`B/
`dهT�IV�	(��Ҹ�8��^@���d��T9z�‗m�`�G"^t�dXr�Z�K�)�Ji���]D~��`�t\�־�]�X��DE-���敎�5G��Q0,��.K��>Y���'��?�̏J��|�|��F��V�G�lk˧��Ⱥ�*��'h���(V�<?��`U�;�-��`��Q�G�z��_wځT�u�$r��
��l\�� X�.��E����$�!�&wYwx5����=ʜؗ�����k��4�c��	��.��
�l���z����F�X�4ORt��
w!�O���2�.t8
.w&�;�]���4��X�Df�h��;�[G-�"�#\��$t���Y���}�j(Cٗ9z++�;7f��:��ƹ~1Mz`��98
���A��4r'r���ئ����u<�VQ�r��`���!���Ȳ�+f���'Y`n���	�E�n̥��'� �3�\�rd�����a`"K0�j�y�C2����+	��;�]��4
<�D�=���w��l���@{n6/�Lo��%���0�/6���˪h6�(W�5M�~:c��3a�]�`�<�UB>�IїV[����������g�qw��9���bI�F�n�_��S�[�[���-��l�z[�&즄5rj-Ps����*l5�:�Е;�]�}��D�5S1�����J��܈O����_�̀'�<�� ��m�e �~�f��?0�^WtU�3��j?r<�u��}eK'��	K�Qڸ���-I]Q�}�R�5��H\�@�\�$���N��V�$���q�X�E������ �X�F��!e�pJ�`o؉�=�#h�c����=�
�������7��]�N�M�b�7�g��D�'�K �
�7��Y���b!��V�WD�F�G�х��V#������P������Ώ^�<y���;Ep�#�{��kX���^�4���xS��@Eʨ�њ�0�掔P�
�iޙF(�0�NvӶq&x��;�xH�C�r��m�MGs�n��vF7�p�YH�c>��M��=���'��O��5��UfwtObtJ����N�{<8�􈛪Bv�V5E��9�A7����d�UC�F<��@9�g��B�7gm<�n�QB.���av&#����"b�v�d�㉶�4���*W!�̯����&�\>lv�_c�ހSg��T�|f�������0�M�H��Esz'����4���9`\��f$cPZ5����p���~A�K?V��cB��1kD�m�ɲ�"c���N!��-`�iQ%�v(��T�"��45�f�4��6'�/�j��ְ�.pו~]"��ګ�p���*�4�i�#P�M[xp=��#(r7J��pĚ~?�G%V�v��������r��RhՂ������}b+{>!̪&����d�?JP�Ϧ�S���<�b�*H@o��y�w�
�t)Ό�T�"N����(�0he��=W*��6q�*1B�Sj�����]������$���HW�ɉ�3�j_�b�T��w&��aw���M�_nJY(�c�n4#g�a~��ś�}T�/�h,�d�vZ*�H��EN����A@��K��{2I;W�d�.�j��|:f�Ǥ�&�6LҸv�q�ʣ��o3(���w�g)�za@6� E[J�X�%$���|�� f����OP~b+1��H/y4��L������d�0��K�MC Q[���F@�ׅ?u��x>�Śm㘆�� o@1��Oޢۦ�$H�dւ]	e�p�iM{̗ō�z���P��(߫����,!Si��I�����~�VZ�F�*�$s�k���5�Ϩ�>2zNMQ캎���iE��Ԏ��
��"�l�ʌa�P��C�����/�붜a4p�qLX/��d(mW��J�w�F~WB@�N���W&Y�Mr�G���ԫSB~
nü<,�:���r%��y�)c�Yp��F|SQ��Y�.`Vj_~K�����������xD�Q�ǩ�Bf��^.�����`Z���:g}w�@U3�9Z,B闠x��3[�A���nG��ż=H�	��%l����9�b�N������?����č�_�2gj<9��Y�D���WH5�*IT�倍�ދ=�Α�:���o~A���rohM��5N�A���4�Y�I�xKU�|���C`��4��5a/�I/�9�#-U
�/@ˁ#c_����萒HQR�ۙ�� �!)I4E3R:J�(��ui�V(Ap�V��m��"��I��+�W�mnNCSP>�G�Q�M�/��6h��sv��ع{��=Tg�,�'�|rWP������rz�/�j�Y�dY6��e�:���d6�v�~mN͡�3�U��+*bU ����)sl�T�j�����ѵyN���0�u0�=yؓ\���I=c�����6�-��GW�LU����, ����e�;��L�e�Gc��~z�8��H)!�������gdu�n�|n���t�Jy:�˪�
�>C[>�?vBz̟P���@{*���ݡj����>���Ҭ�*
w��ˮ�#'Ѥ��J�"���n�*YgOHŔ�4�)�ت/B�=Ȥ��'������(J�V�6i�mx�e�jǜS�@���/Q7�k��ж�k�%W��n3�
ĎU|�|�耵rTmfR���G_����vU<dEC��F�dr	nꣲJ�Ak=�� pY����	��P��@��!�Ae�X��q
�0M��]_�����;l�R�h�,�ngw��G�t�B�-r��,݀q�]��iވ.����R��-���#Yٸ$�?QrƢYKKg~��D��ΰN�E�?3��.Y�98�H�!�ûC��B�P}��!�=�A�:�4�9C�xI"���!�����,v;�ѿ�z��:x��.P�ܑ��4u��<I&����ף����w��������o�eS������V�Z��1s�$���e�j֐�T�?��:$�Q�X�8�c���x��)�_��>r,���n�׍::�V1C�l7�&ج��HKD�N�kÚ�&�֊R�$I�6d����C�Z���R�x@a�5+AM���V[��hѳƔ��dR��:sL�� 3]aj�O�2�$�[��(����P���M�'׏'�ܦ��*ֶ	lҧ��"OT?�=�"��;��:'�YH�ȩ�/�DJ��u�I���g�=��I�apW�9`U7���2�F�����7�w���Um�CC�%
��B��*
;�D��n�:���)�n)328h�{+��f��Q0�
}oG���
ag��~�d�Ŭ3��X���!|�G��kj�wU�kK�ԅneu���KG�1Uһu3xa��hF*IP;���ݺ���/�W��Ğ$���]v����h[ȳ�<V{E�����f�${��Q�O:$6d��un��
�����j�.m��y��xcK{-�3�s+�n��T����.�$
^¨4�.&z���*ƿ{�޿���b_���g��ݦ��}�̖�iS.!�Oͤ���6�?��j}��(����)y偔�m�&��Bm�x�y���i�+mV�Nڛ�vTx����,�^�De�����u�F�t5�v�Z�����M�T�n�(����jO������"��o��m-�K�%��Y
��x�.�a�z����]��&�<;V�{5J*n�:��$'�Ejϳ��w�K����|,�Q�3����b[�2�L�kN�P��i�c���2+��w�����)a�US�Z>;���PlxP�r�@}���h��d��
�!h���Z��B�����/����������l�O'�B���'�3�������߼=y~��d߉����w+n;���)f_(^����|#��9�۝�gڻ+zM�MAX	n�_H��(X"�K�BS��nA~pzCmy����bc����*۶M�8ka/��#0�{`�Wk[Q��X���$��q�����⸽P�F���#*tu����V�Yx���8t�)k�c�e�~�6
7�X�������G���K��	�k�n�J�-i	��,tߏr�wܹ�s�Vn�D�Ƴ���qpO���g��Ω
�1��l�4�FB1����A��\_A*��Ҭ�{�񖊘��7�N���{��r%�MɦEFW4-�n��H�`O�Ȱ���N�d�q���p/8�y�1�rCE�|=�P&���t��J�R��Bmw�{h�i��<�R�
�AH-���9����ĜFBo�2�f�{3�=>���͸��厭#gn{�W=��d5�{ɏB���8���vK}=��Gk ��K�
ֺ.�g�(�y?�F�\bV���~w�r�N�]At���͹��[�7V�Zȋ���k� ���/�!�2�PKE��T����
I$'pip/_internal/metadata/pkg_resources.py�Zmoܸ��_AlPT:�u���hr9F/���6@C�J�5k������A�{g��HJZ;�v?�z!���"��=.�� ��{q!��Fh��Q��l��V�$��l��N��O,b�Տ�iD�Kծ�M/4�6�]�J�����k��w�i���?.���m�������Q����{ؗZ5�J��*�z��q����A����=�u�e3�y��7�I���U�U���Q�£��6p��y�-��^��m|Xق�@���$������֟�h@j��D�k��F���5C�K�]�KG+�~_6�}����x_ⶲQG��A�T���k����Y�EF����e"��hO���uyp�,��,X�� G�1�`�{Oނai���Ƨ?��>}P@;~�(�j���x�?�Z싛v�>���
�"��@��]y)�����e%�EYª���ư�B�=�$��0�Nw��!��k5t��c^�b�Z�'�z�5p����h�!CF"�3�Q�O��|�����(v�]����ѿ#��d^���Qx�,p-v��˾,3#��z�8�θf�S/��YՏ�������y�0�h�9Y�`M�	��s3�8�R�[��@W�~�--��O��`
ϣ��
�n"*)�gD�-H"��
V��_���0҈�{=���>rʇ��VeO���`�L����H���on�d
�v+��h@��闩��n�����n��*A͗%��K�E9���u;Sc�M��Ma�7��KSK��s
.&`A�0e.���m��C[�Jˮw �&���5���U1f�5qȚ�ů�l�o&�Mv�sg�n��B|���U=R����C�SV5I��p�)���#�r�
�+�L�ˆΩ�z̛A65LL>�2��7l\�`�iC��e�6GH��"�+��i���pw�S���;�p�@cn�9~r����vM])��N���Eo��݈W@ic0Bd+,.%��U�Z��S��X���-��t"xPJ�D�:d�->s�~;����O\;ծ.Wt��
��#�;�P�p5I��_��h�8�!�}(�Zסˍ+m&q��Re�* ��� �1=�6�܀
��-Q��˞\��g{�P���]_f+����՚�����vs��$��iN��ȿ!/=�
�#u��<�����V_�a�~��o�:M�Nv�^�Kv�p���m�{��
��N�6@�y��&�fY�c�3N�CkcY`�r�������W�#%�FoH*�,1g�#B�B$�F>6�~ѵ`o!�4���AI���w�˙;����sв{���.�����]=���2G�c�z��ߵY�LEe�F�~�ٽɪgº�
�
<i2�Q��e>�?���/�h{���Bi-u8]�{�٘���l;WCg�0�+��"��}�l�BY1�[4�|Kޞ�-� � ]�"�����N+��I����m豕'*[!ZV+,�{l1RrX������I���(�p�b�k�*��z��qrC�4�Nxf60��,���9O��0m��&�(&�E��46���e���2�{���c
P?�.��"�p?ᛸuU6
E$gm�ʂ�UD�R6UUg���Ѯ&O�3t�sG&�-e?t9p�k5�5Y]���J�=z�U=�c>�p��
Tg���'��%�7ѕ��S���i�!l�ӹX�,�a:�BHa”c<�?�.��v0�Dx�bKֈr�˻��$\�A��e��|���WWՔ��h�6��6x�þ��C:��Y`(�k�$�z��
�ї�ސR�\�4��A_���K,4�KN�Q�p0�%Ɩ�9��ԊE~$�8mDz�7�i���q��z����o_|��s�lӇ�����/a�,aD]��X����R��S����;؆Ge����Qw��N�q~�e<з~���#�-��V�U<F�s�_����S�#[�	�W���@�5��@�Q��/�:;ۉ�+�FXN҉�Km%��(Ts��� Q.ֲ<
`ї�(za�� �$�͙9/T�c�K��(v�����d�i����DkD��G�p�m,�q~v�I��Ӕ�P���������*m�>?�_;��׏�C�����>)������(��yf��F�8z'?��j蔍�e�]�8�@?0v�A��P�#����G&��ʱ`�s�N�NW&y���1��>˴�.顣���0���>acq�<��� �\˶��FQ�:𾺷�`ww�{w�L��,�܋>3Y�Ǩ��.���Z�ښ�*LH�Z���Q���xI��y2D~w���6�y���f�+R>ib�,���N�]M8�'g�4&�<�Ny��١��_�_Ia�r��F�kP<��� �>H�M��=/�X�/	K�^�D`ٻ٥lUj�+l��/�Mâ���plL���A>�C��i��.�1�a&	��-"$2����.w���RD�/p*ղ������ |���
���+���;�rE�:b��N8\l�D-��C����C�9pt�X�0ț��k��1A$�;�A�#�O��(f֩nh�x���6���<>�
�
�*�weo�4�f<	���;X�`�*�f74�)�&,
$p����g���'�x����dxdޞ|w�pT"w�֖} 
��ZЕ� �>/�Pn�jw�����9��l�X����o���PKE��T�2sDNk,pip/_internal/metadata/importlib/__init__.pyK+��UЋO�,.)V��-�/*Qpr�2�JK2��� 
R����ye�E�y��y%\\��99��
�
�J��t��*�rPKE��TLk�|��+pip/_internal/metadata/importlib/_compat.py��Oo1���\��e����_zq@���N��^۲��˧�7I#5H�%�k��̛����L��Y��{��r��*������-Ӆ*���mE��g�x<5��d2i,�D���s7ۯ��'��t:����F��L�Ưl'��#MN�x��'���$�{������INdK��u��B�tQ�X,�][���&����B�+�r"-1�w�D���v��8��p��Z� ��"������d\#��	yg-r~�BM"%��0?.p�L���1���;T��F*Z�3yg5'�q�Ff�i�1DI�ƴ�m(��賲cW�z߉1��#H�CykeE�{�%��9=M)DZw��l��W�?��J��Ҿ����j�#�=�M�lL�(;Q�[�7L�X߰�7k�O0P�$�*l)��ڇ�} �A�s'#z0\��#��D�ZA��îeWo?����b
\��D�f�Y�	;�Bj���1:��]E��O!otT�f��ﱔ��᧖sE�L�Kk��.AR0�L�2�%o�2� v7VE�AO���7޴��Fo�G�F� 
{�nءY�hX�-��@�n�Ϛ�8���%�C��0���Zì�hZ��V0��1j�M�V����k�(�T�Fe��}��m,��d����!wh߫����[�k��ND)b�#�W垛l�2����p#�9�-^��Ho�Y����y��M�PKE��T�&P�� *pip/_internal/metadata/importlib/_dists.py�Y[o�6~�� ��Hر������&�"���n�52-Q6���T����)i&	P�~�(��;��ȺU�a��Jk�5�g�.ڏJ^��n�{����r����^����Y٩��C+�������KU�ȍT͆�_���o?���JxOFu��-o��}x��q^٧��O�h��X�5�K�,�V�i�Y4��Җ��
I;8!;Q��h���ک����x��j^�{Q���ݍjdNKYK�(}�.�(�NƵ��
o}6d�Sq������3\Z���ڰ_ݷ�.��
���õ��~��WR�N^���p�uc�Å"NuӮ�Z���R]�]�'t�����R�Dㄚ�e?3J�Լ��3?~��"�n��:��=s��Ȑ-�4�U
��Yq�n��
�U��Y^q�-Ͼ|�/���dK����eî�����3���Nψ����U�_'��g�x��a�໴���*OZ��3�!���(Ţ��"V�E�T�F�B��V�#<5�-3{��'�7(J���MQ	�Z��Q|���X%Kad
/KZ.<�L]�Q#����XWWH0ڧ���P݁�Y(�B�jQ�5m��B��Gh+a��&u��
Q��K�,�~�ZT�f|Baꭋ]�C�L/�N\(-�]��tJ��d�ʉ�-[?E�v��Fl)�f/,��]@�ϖ�ɄAj{U�����@&~�JO��˭����%zǖ�B����q�8��mC�"7,���nIƽ(:Ä�ↂ��\�]��J�8zm����.I
h����)~�m�%���@����gѴ=	M ?�:Q!���(E̗}Eۖ`ݛ����I:���u�#�	�m،�����#&~6!�d� 	����7���ق�֝g7������U�n�,\���;
��q ��.��	F�P���^ۙ��e�8�6y2�-��;eި�)^w�hO!�b�H���:$W�\‚�?d�q��G�.��]�����`���\e���ۑ��rN!rU�8�My�O��[~��	޿�]t�A"�g����@�E��[���G�F@�x ��[� Q�N�$�(��7/�b�ia��X
U�����dL�ە�<]kd�a��U.AƁUy��������ٛ�)g�w�����F�1CM?��\�/�?t��R�A�VL�M<��3��p��f�r�8�{�%	؜H����P��0��¥1�
�&�c)���B��zbY��4�$\�P�K�Q�?�b�-V��uR��C�C�`�:��D�w�a ����#���LtB�?�)}=Vτ䬠�^5����"���5'��:�qw��5̒+tfƺ�l����9�>߂tξn��>�9��+$��/���?t9�#�	�P�D����vTTꞍl��Y��{Vr謰����ĩ��j���0ݗ��� �p\`���w���V����2X�Q��<�C�D�����7���]wqn���v��n�&�'��S��nR�+�Ni?aP��)�/��|�[AA=�&�+C��`��qC2�cж�9�1\+U-.�Hz�W�kR3�,hN�͎2�w����{c�z����G]��W���YT�R
��0�ޤ�
��:�U9�38�E�j��,�j�n"��G=p�4�g�8�Uc8���������k��ŚWm(��2��`��^V��i����
�h%�� g�R�������Z1!��D
�9l�F��ZX'[���YJ3�8��Z��m���60�e�
V4�E�nLs-M)���~�����r�8���݄7��!}k?}�o0�\��m�����e����
��.h$,޺\�3>Kϵg�V�6EA�2*Wj��L�p#p���oW�ni(XK��y��cp4	%7���9!�4	ź=�zJvl�Pv[~�/�$e����Z��v6�$¸nǠC@KS� 9Ĺ��
8.�[P��598���gA��)�[��~>�����+�@�xUe��ZfS�/�T+4�_��0�����i����}��XY��ABqta���q#��˝?{�|ъ�M.�0����銰�d1	Y�~E��Bȝ
K���l��vH��!�{�m�e�hY�A8vA��ħ3�rT,}����?�ğ��>��.����uZ��薝����#��T�Q�y�D%�0��y�$�(zL��:$�x�� k,�J����-�PKE��T�>n�)pip/_internal/metadata/importlib/_envs.py�Y�n�6���?" �,�E3���3�,-Q6ײ��d�ž�~�P�4�`2�����o1���^�M�zk�2�E��0{y�^eʫ�۟��?�D��]�o~3Un
}O���g�/�)��׵�ފ���XycKUl�'��F���'|� *S�ݓ.3[�J�'u�l�)\�{o�*�o:�Wg`����I�ծīʔ����ʽr����?����bn�o��'S��K��d3]8�|Ժ耾Ї��̹�tU�T�E�Jg/����S݋��wwvw��|w���VP�K�6���&܊����Z�GS�vW�LGOg�Kb��V�L���v�9�˝t7�7�ob/�Y	��\�֋5ݳ��d�&��Z��.�;U8cX'��q����7P�E��vD���<+�����2��۾h��ǁ�J���*|g�L�y�^���۠-�謓+>����Y�RTM]Y��ͅ?'>@�g��m�ls%H0��2�-�~�/#� ��R�ңA�@���=]�)<��D��S��7T�  +N9WN�Q=[o�B�I2Lf)GxH�(V	,*�oF�4��	�%Xy��(ntF����>�6h�h��A���|+E�/�)q��Z�M����7��3�k�W{zV�g��K	�8�/4�sZ�
~X:$v
��($�"��p�ȵ���*G�����~ޑiѮ)��
y�a���8�uy������#	���.q��9n���ܱKq�p7���9����&����;�V0�V�DW"�����;2Y]
��ӝ�N|:�')3q�);���!��ޟ�߷�T�.N<A�L$Y�ƕ�^p˂q��>�pf�t)��kʧ^S_"0w�M�}��|w�0Se�z,���k�6�PCR�.�lũ��BU�'�Eh�e2�$����ɒ�Aو����q��9l�{�2�Ys��P.�K0���Q���隅s#�'t��C'��D�wGvR��	HF�/���f…b���0"�te���F����I�e��	q)�����\�.��l��C(��?���7F�?M���0eqx�F��dև�e+,}����B���<i�5s��d�U��B<��R7�o���(�
:�'N��G��ބ�/h:j�(�֌͐,(`������<�?l�_(�c���ᚠu:�kx�͜������M�{��_�%�g�B�]D��|����E�Q��:qDn�]B��`�7����F�Aj����)2��AF�
@�V�����O����0"������{�kM
���ȑ�]۴)į`�����E[�f��$ymԐFqA��m����J��<��kB �-���I��*�r+ֲS�������V�L6d�|NLVs�6�I�p�x��ofD^ՔXa	P���O�|D�!=������GPo�%�R���&��6��tR��!N����{k�!�fm��P��o�H��O��ÎB���a��+G�e��0�;�1&���^�6��$�F������;�Z�B���g$M��ˁ�^0Ƌ����y��$\�fZ�B˙�_�-���m�+�\�B3��Ą�Fn�U��t��*��TW�fK�j���tW׶�ݬ92]����A���p=����+��"F�0clu\-�~d����,/�Nz��{�~�j��4�Pۨ����gK#	n����"�
;���G
�k.��>���g��JD��!��7Y�YLO�v\�1=��rr0HR
dze0(�쑦*!&ж0�?��hѴ�W�Ix���UIe�|�rԒ�p�D%!N׋��kK�o���:�~��o�eQ7�T�G���W���

�_���r��W-+�ʑ,F7�"�%�:P'��a��D=�ly��?X��EM��:���J��F�U�RM��5�\�N�>����uOL{W���{�hќLϛ�!O�+�P�y+v�K��O0W�Cؖ��n�֣�;�O5�O��1ք��^�w	.�y�<'0A�=���/,�����i�(��"S_2D\�����~/������K�d3��-��pВ��yw�q�iO���J+���EXrh�h���7�RŻN�T9���\9�
�;XϠMX��R��
�ܸ�{�������e�t#��Dܭ~�"����F�����0#Lj�|�&�֚�͞��0�٘1�	�K�v˵����fn�O+ƖCg��PKE��T{�(�;? pip/_internal/models/__init__.pySRRrT(HL�NLOU(�H,QH��+I��+V��OI�)�����(qfIfj����PKE��T0�Oy�!pip/_internal/models/candidate.py�R�n�0��&p�A����>��E!1�%AR�A����G���T
2m��;�o[p�qq@S[ϝ���V�-?��P��>��> �p	D�Ͳf�LDo�歭Q���
�W��J�QQ�0Ծ��Q��lK��M}+��m��M�Rki��4��e�|	R�2���@�1��$8)RR�x����Zs�e^��mB@���Y	����$�}]�kl���B�uSBB� D_B��n�-���5�[���$,OP����`M57#�ż����eSf���َ�tvx��C9�ZN]�r�"���lEgU�hՄ(�W�ɢ~e�6hC�2<ƽ7���?�s	�]�'?[�&=��m�����D�OΉ�?��2�]�'�PKE��TVGL��"pip/_internal/models/direct_url.py��n�6��_�	}�:�h_̀�K6X�"p�0�S����⑴[/ȿ�R�H�N� �CB������|<�H~z��DQ4�զ��#�ڞ���(K~=�P!�h%������7�}?��)9�J�;��.YJ��(�ԴL�|�a��%)��>e-�,#S��E�\�\]�2J{�KZ�"�3!�W��8�����e���� �U"��Q2��;?�u�]����?��Ng�Y�a���B��1:%�}��.g��9�l�7Ն�,�ߟ^|�[�N��'��:��$[���>��&��@����R�c�g_r�ݗL�!����Hv�T���D�|!8B�L	����� >l��]�~���ݖj���M�F	9y�ÍlȎߙ";Zn�/@*�=�uAvL������`c�)��+N�F^���?��V�V
6"��X�ҒkR�k�h��X#�,M<��KvܱO[v���'k*ɶ�'�F��{;��}�ZQ�pzk'��
0�Qxj����f�������$p�Ω�ǹ5���p.5�G�}��{Rm�����St���U��@N֬b�,'��,�m�8z!Z.�u��)���A�V ����N64,�>-�i)Vq)�SOҬ5=*C��[.��.����4(YmlO��j4����S��D�ū��+?����ኗ��������T�@!�u���v��=�e��@B��@�� ���V����tXoA��3�U2Nt�
߻��#��CԹ�T �����d�*uO@bJ�A`:T@����I�1�v�֚ګR��uj(���BC�c�x�7��Q��DNS�ugc�[��uSt���ax⼔)v(g@�e8P�4^v�@h�a3��̃��0��ӰwB3�j`0�$
����hB�r�ʩm��r��H��R�q!��h-x6�40�&�W�=�&�&H`I[A��V��`���`��RH���䮿\>G�����AP�<[�h	�7��9���)Vp��xB���&��R~%J����D���#RV�a�@�!n!r��T��B�T����ڍ��W/_S��λ��2yt��Fԛi�8���*tp��6��F�R� 	��oֻ�TK
_����"!X�@_�[�6	V3U6��LJ̃6P�����F�2Ӣ�%�s�N��,k怠�����*)y��RÎ�݆�C\l��gǬ
P�7\E4O�>J�#A��<��R���Gq����&���н&"�H��������y�6q��>7��K��ȁ���%�9�5q���4]��w\4u�j��(a-&�L|�r����bm^WW�ʫ+�X`g$����^���?ƾ��q5�>�`Y�D�Eܸ҅s_Mu�:6�īփ�����p���U��t��B�n��e�}{^	z���߂���]���}�ua=�!��m�����T���+d�1jКݫ�'����^�WI�9���U��xڿ>H,�y#a�V+����½-鉷�v�<��-�X����v��2��rp����M�����m7��<�4Jf�\t���-\
q+àP��k���,M~�n�=�Ԁ�U��ˆ2�I�Q�p�mYi�b[md�*A�F����t.��c�e-���]n:�e
d�mZ&���V�PKE��Tb�ch�	&pip/_internal/models/format_control.py�UKo�6�ﯘ�-�U����9�Ѓa�4�eM�
Iy���R/R�8@���7�<y����K}��pm�WԟЗ��h�J��nwʽ�+���5��E� �ɶ�TnFh�6Z6Bɯȵ�05�ڣ%�
�4����n�����n�(�\�	��ho��w@c�/T=Z8d9�i:���'ٜ@�H'�C��y����"�N�8�+�a��;��}b%0���|��[<����s^DI��c���z��
%��y{{K^�1W���w��p�=��\W ��6�CP}�OmS��>��J�J��Ҥ�gJi�$B[�����3s���=���
Ѣ�q[��}�E?XM1���^a�Ԋ�.����jd��.^�př��f�=zὝ�z���̲�1	C?Pkn����X�픞��z�=��/%<��Y5NC��ͳC��pr^n�X�*ڂ2q����eӡ?�vay��UȻ�Bq�o5��G�����
s{/���;<BT��zw��T��WH��
�c;�9L}�!�l��Q.?Ң��@\��$ː��x�v��J���l���XM�P�P_��W�F���X�oL�[W�m�	;�oQO7u���n�ˢ��m��+�K	5��e�â�3�Yh�@+]#l���ɟ–"4����}G�bu����^�:�+��"#��~��pG�3c�|#a�k��z�|3F���U~�*5���}R��r�
sJ�9c˧'j����4NHl�������'��l}��l��%�x�,�K��cx�n�\#D�m��{sb��L��gP��(�i�c!›7Z$U%�X�_�[Ws��"�olƌ�Ľ̄���.I�z��PKE��Tߗ���pip/_internal/models/index.py�SMo�0��+F�H)�G��{��Uo����P�:�����w!	[�"��7ol�1$�!9g��haQ�3Dp0ͫy�{��Ǯy�R0&$�L`�C��b
o�E4d1�i*����
NH��Mkr�Ik��_%%�
(��B�-���P����lwV��!In݆��^��8[��z�Z������v@�6��O*��
���e~h��ʪ�pU�#a��T����=U?�\��):˥�9f���*�ѓm݅���<C�W�<�o@�X �/x�-��RC�DBƼ&��1a l�ZOR�+XOl��z8�o��$=�{o�^�E`�1y����	<�%�9�֍T�C7�A�.���Q�zCZv�"�`�{���L{�ͫ�򿪟��俈�"�[��O2�blg��.��#�۬A��V���~\f%�����p���ר��8�D�?&�Qw�d*��PKE��T0q��9
+pip/_internal/models/installation_report.py�Vmo�6��_qP�؀$;(���tk����@���Ņ&Y��+��;R�,1n& �E��{��j��:���A+��W٥�.���K���Ţ�v��8����5+�؞��f����x�5k�+P�Q��]�F�˕,�	4��d"7��тuL�����=E�
�ȋR0k�-����v�P4�K�biQ�)�As���1Շ�NW=�<D^\���"/��_B�t��.qM����8_��R������
��Bi�3����%4r�D�?�W�$�b��U
u����7o���}��w����>�����J�c��>��ϡsfʆ�i�m�t��v�R�S�2@NX���XAP�7![P�����*X�= ��tK� �]GF�D�&(�,@:�H���\j�T�e8	=���3�d�w���}>�u�F���y��Yp�E�U��jڬ�x�����Ae)ڊʈwl'fhv��j&�ExC.CXP����T�W����ߙ���F�)5;��2����Dᏼ��ǃ��h�K^�ޠ%�Ò=��)
�$�	DL�5�����݁�!����8��v�֨m�;��2��l�懻�ٜ͘�qyЏϣ��ւ���	�����S���VRsasq�C\��iV��j!�o<dV���&J�ɮ&���ْ��a+�����"�P���_�av%��8�JH}җ]�s_��pz�Իc��k�Z�Å�7M��y������r�j5i��5�C,�>\o?^�����暜���l�y�jR�e21#��f��a���j�3>�U��E�e��`cI�����w�ɧ@v�Z�0�������Pos�K�7�*AY��m���[��*xd��&�N��nS����]N���	_
5֜�n�T�T.$
�3�6�$Z��5I��T-�Q��Psj�Ʒ�,�	Ɇi�L�G4���4��i��C*�A��i6�"8�+��(���S�=wM���J�u�ٚ��֒�׷�����e4�')]�������PKE��T�q�ל
�(pip/_internal/models/link.py�]s۸�]�e�9���عt�����k2�s<�3m�u��$�(�!@˪���H���^�����b�߻�\�4l^�Q*�#i'2�X�|Q?��E���+�Y���GU�e�&*x��h^�53��0�>1�����I|����w����21v�^j7����>��H/�"��Ca��yf��s����#�!�(��%G�����2@��5Y{r�>>�����Ż��+�\/�eo�iz-u�=y)R���Wf�f��E&��0�J�w��੆7S���~ۿr-�c�a���̇��JllQ���1	{$�]�M��=He���(QY&@���;�>V����K�lV�Y��=ͅq����d8z�>�)����z�/3	NK~+gE)��<L��ی�f4l����`�e@p�bF�J�h_|<;�p~y�}����ۓ�*�:<
&G/��ڍ�^���s��w��
��$�Z��p�ƖmA��Z34M&e,�,��'+��o_i����`����a�c�)��(���[l(�`�M��-��D��&
�gK�@k\l�R�-�W�S)��Hx�1���	��ז�T́|����a�L�l�"z�L���i�6.�L�
�X�+Yp}
|9U�h��a�����}	x��Sv./���|��9Wgπ������;z�����S؍�-��Ssf���UU�E
M3E}�%�� ��>��2׆�M�;��$J��`�FV�i{D�����m�7ّ�����0D����}�_�Sn8�K����B$�)���N��˯_E�r)5x�-��Ͷ��3DtP�u`�b�sJyS�����?��G6|1a\w��B'����˝��4�

�4�Є�Ԋ�N�$yu��G5q��+��EL� ��nyV�Z=�]�� r��q�c��R��4���eZ���O�wU�jƠz���)�� �z��,E�">�.̶�5v!��"I|{Da`�J&!�Hq�
�	��m�e�a󌣞r���}C�6�Ġ�̻���* �l�V��#n�M���H�S���!�ӈ�m��1
̌���x
���Eɳlkc�e�0x�8�w��}
"q�Q5v�[{�7`��Qq�a���r!��!P�6�mm�0��i�J��
v�6y��gM0şg�@�#�8�xz�B��c�@����?�Fo�Y����'O;T!���S�����.��5�94ef���e-�F9��8e�����sZ�-��[t�<I�z���=4�ܒ�U$Q�r��> �Q֛ؐw֬N��i�`c������4��}��"@�g`��;wqu\/`�<{�U$���NVb;�tr
N1�x��?{���x��I?���j���8��l�JV��<`a/~M�}��2j./��	�҂.�0U����$���CY��
(ltl<��6�:HƏo�ٿ�)�}ƾ V
K��Fq3b��w�e����b�
��8���0`pD�7�}	����8*1�a�e
�G�SW��
�!��ƾt�H�M��Ϡ�^AT���@͔*L!2�W�ډ�.װk�̓���\�ǒ�ˆ[��lT��D\�K�1��9���V�v<ާ��>C��5�\)#B|�"�mA�"[Ֆ�9��7�f"i�&&(�����q�1SI���x��=n9vqjp0�*�Ѽ6�Dv�J�ӻ(��H�.{�Q�h�!�|��R�$���xgk-�\��EM-�� ��f�b���5���:�J��p|ux����1Q�{�5��V�����	�\�r���֞�c��.�*�K��AP�#�EC+�b
�
�����=��Yx���׿�l��g����A3�Ə�I���e���E�c���v�9������>��nR��!�~�>���/��u�
k0���D�2�P$=���`�����ߏ��ý��
����Ý�ؒ=�B��Â)����٥����~��[���W_�����������Kl}�=¯������V/��t���U�&�b�8Ql�&�<&�p|�⺞�K=1��2j4�fo�M�r�l�.	F>q'��*�S��})�S��E���Q�=F�f)D��� @"��a̷�»�j������gh+�DPq�vF?B�-E�r�n�Uُ�f�ug��3�E�%�8r'��l{/v�g/?�;��bg��!����n�Pc$u�܎�3�NӁ�c���LD�^[���y��"��z[l�*�P�GH^3�8,��DWI<��!�]�{$ۣF�d�nRw�m�͚W�T|�\~.t����[m/��U~�4�)�'6n9�;ɖ�:'��RV������������(۴7�F��Aۉw�	L/l7=�+�m�"��,r.��v�꾭k�A١e*J��D�'�>�ZȄ�[%S�='�Z�E$as��F�ȕ/~���۟E��X�g��ofG��,��s�ƶ��"6�`0'wpb�mX�jǿ�,�^81uVS��e)�Ӛ/ ��aľ�&n@T�C`��R_$�\&Ԭݔ
6��o8�V����D3��\�T��_9�m7��<�X���cӟl;�56�Z˛������ЉZޚ���R��Ҋjb��QQSS[bA�
X�R��}�ʑ���`��B�7%EɁ����ꍴMd����F<v88쓘Z�P,�	=��8�JB�zDS
/��C�,"�\���@���ۣ��z%���X�ț��,A韘��S7��
OVߘג���e�14\�Gx��;��ʖ�2��6�mOS�JM�&MDaاO����'ܿޑ\����!j��{�˂\�fp�Һ��9m��j%ύ����HX�D�7@��o�7t˒[^r%��D��_����i��\�k�]��8�[��`9�j���y޴���r�\}Uu��r�6Β��q ж��Y�*m�")a����3pK����0#����/[o`��i����Dкt"}�ҧ5�����P6~M�}��5��*F�v���A�R�J�d��kJ�9P��#��#��~�v�r�]�'*]:�ڦ���V��I������|;ut�K�e�%��S�Z��+�|aه��v�~~KVE�P��M*���;�IG�;��C�S
7�)@��P����~��Z��;�>�-��V�Vs��{��R{�ZZ-]�4$��/��f+���DG�{�>��s�u�5�6-!��b�����#�W��"���ņi�qB���,�ޏbK#�V��ե�C�\T뀭����k��Sˍ'�2.�ʬ���h���SR��[�b�|�x d.��$k
#��͜��%F�Z���M7r� h[z�0n�Ӱ�Ua�t"����ef�L�V��u�a��UL�b��i�1�dwL^U��&A Wsh}�U�#��Fͮ��:���g�ƣ�PKE��T��l�pip/_internal/models/scheme.pyePM��0��W,~���[���Hy�x��S)�l�u$�HF��x��kG)I���3���4Mc���>2gP�)���X0F�����'n�Ž���T��N��#���H�׀Ɂx
lNBgY/2��\�܎��sjs�u���SoG���>>a*Im-o
��Q��l�_�o�u�s��W3�öY@3
U�	� �F��C���Q��f6�2�G���È�N>XX�=!O�`�L�B!+��=�2��"a@+����cέs��Q{]kf��p�k����ѠB
�ff:LqX���=���ܰ�J���[�z`��n�����s��]}�u����A�������!�+���3�+��'��M��PKE��T W7L�$pip/_internal/models/search_scope.py�Wm��6���Bu(�K7J�
W��G8r)����֮��%G��n[���g��-�&/ky43zf晑*+�SA�`��+�,h{8(sh_m���^=T"�B�V;^	��j�l�±�Vv�~�|X5*U��N��:�g��L�:(�[�LkT&��]�F�r�U�i��ͥ�\�\>�;��W��d�z��N����i�a/��Zac]�C��2's��TԡHIA
V+L:v�"�2\Ƶu����j�i�=���e�uf+y�Z1<I��2��|�E���BB]&����p8˔g�5{u��
����w��4������}�V�V��'[�D��o��4�?D�J
�Dž\�Y�$�X�wz2��K��<���ܛ�}ް�߳d�Ar�mkq��U4��.fwe��#^]h(���S���'��Z�|�=g��L&ܡ.�	��g�*����Jqd;9�!bX4�h�|@�ԝ�HV�R�\98iݑ�k˂;=�nar���K>&�e���0]���N:���
����N:���^��Ɲ��uu(��K���n��A�{��9���8Џ��`�9��Ő.���M�&�1�@BS��seEx�<�['���X�#��~�W�V73y(���o�]����*?I�d�G梪�e'�L�O��kΈi�w��L��2�Rh
����7�����$6�9*v{;�$�XCJz���؎�֓�1g�Pf���vv�P"��dH�/���7���
�z��`IB�G`�D��38�zQ��dN19'$��Ȓ��g�ח[��DyŊ�^3��E
�P����%��]�,4����O'C�Q�}t.��ڎ���� Ɲ�)C��St;Ҵ7��o��y>R�{�Ȥ�e,��P�������C����|M��e8����\�tn�� q��?O׾�&7�Lj�%-��+��F���Y6�݂WKS�7�O�U[L�_�^�k��8�`_i�s���*� 
z�F�P��{ש�	)#�B������zUp�)�"�<u�S���E^b��y�Oju��‚2|l�F��:�h�R�]e�>���w�l��߾��o
�Vz�*����7����8��8u쩾�5F'��z�C&���(
Х(ie�k�+�^(F|d�� ��h��]!���I�|���,}{�-C�r�N�4s5���Z癳,��O��v���X׭�Lsrٴ��H�K��g��X���?Z4�6c�n��	��;u�ՁK��M�\ ���L��d}$b�I~3's�$�1�MXwK	C�x��G"���h�mM�5{[#�2e���Bf��>|��h"��3
[��`��%
�S���:-�\
��t``��y����4�9t/�FyK�+\p�0�u��`‹����;��͘�?����Mx=�z��÷'��H<��K�\}�N��
٢֏�*�m
��x�R�x��BFO�OǛ�g��և��U��A��&���k�6钏��ItJ�:4�H��O�F��q�)v]���R�tɡ��*����S�{�'�v�����O��r:~s#y�t#ibL�~� 1�~�-|��y��4��nVPKE��T�����s'pip/_internal/models/selection_prefs.pyuUKo�0��W�a-�z����>�[�v(
C��F�,i��4�~�d'�����}dZg:�{+�3�����h���
�Vڲ�ڣ㳲3
**[�:��h�=��m:,��V�~��:�\9lѡ����g�X��{]K�	����
���`���1;��hy�. 5y�T(��
�<��UE�x�*���x���쪽�[lW�s��8�c ���y�7	l��Z���B>k�r�����{�1z�xJ0����=WS��A����V��ËP=�7Љ-w�w(�
wO�!I�!�#٠#�m���`4��]c
lJ���|��p��o�P~#<��%68�91��W�d-ށ��@�R�┒!mP�1�Ec,�D��'¸@�Jj����;�B{��#KX��w3�3�����8'qy��c��'v�f��/��\��tO��<�%\��ˣj�[�S)NN��_>,����
'�Y�����`�\Ѐ�Q
���)|L��|���2JŢ��dp�4���s4�N��Pp�P~	�)e2H	� ���M�[��@>@b�xf�gg\�pR7���wKo�����M�S��+X�q6ex��Y�F��A�n�ߤ<'�I�dv���r�r�?��UZ5imP��T'ܥ}B!\�o9U�Q��<��"�y�#Rdc]f��&��)��h<f���?�f���8#�m����l��/��PKE��TQGe�%pip/_internal/models/target_python.py�WKo�6��WL�Cm@K��b�r��n��fZZ�l6)�Tu���3�"���ͩ:�65Ϗ�<"��X�uIiM���>���Χ��h�Rxhj%�N��5˞�.�e5ϟ���g�����SY���h�5^*�rS��˓Tҷ�T�,|暚��"�ga�G��d�d�ƿn��.��������lj$I�\q�0@���[1z�$��f�	��t�k�(�P[S�%�4%p� 8����`���*��Ƣt���s�H檕ᘞ�9\�/Y��.���p^gg�pgu%�IG	~�n�QP��s����ȪH|��~��=#�E�����ˠ%f!��Y��P�=��v$����������D<c�HyċH�1��J���I�D��#�|�5�܏p�ԡg_s˫i�w��/qm!9�F6`�{�F���/�0�L��;��n��6�3o������|�C{��^�R��R�bf3�NN�T��(�=�:���f����ꪖ,�ը
Ii��W��.��Ə1(�c��l�wLM�
�1���X�A���.#g}����la� ;�
4N�V�3�/(�z<�?>~ٱ���� ��gJ賿�O)ܦt��z�:ȳD<)u�|� �������������mt����yȏ��Es��q�_aL����YN,]o~�S�+R�2wâ���{'V��$[A���ؿ0�F�AE(�]�Sk;�%+��7l�1Ro+^o�
ӹ��q7�Q�>�1-P$>��ǎq��Ld��5�����@˦#%�{h����b�sՄ�@!b.�1����%f�p�EǪ-���^���)ޱ�@&���/v]��$׮�E�r`�jBٷȎQ�]Rxiv�P$��v����B��
[�[n#�=�6�-���t=�k��D��d��B�[�F�/�;�ZL����ɶ�5���WL���kH��m�ó��'�8���?/m0�y80z��@�u&��EILW��O����/�p���ȟ��
ES��EX������K|�B#%ZI:š�3���{����$�yZ�o݁��@Z�w�L�<�z���{���v�PS��͢�^q�t��I�gf&���ā�E.q�@�yV������Y
�/�R��,�I����������a6Q_�q�?Ӆ�P������T���$��+u�Κ��ׂ>��W2�׹\�PKE��T�f�D��
pip/_internal/models/wheel.py�WkkG��_1l
Y��:)
Qۤ�Ch�����v��iV;��H�����K^��j0��}̹�VQ]Se�R鬐�~ET��*H�2��[�$YF�
��[��J��ƊJX��J�&<H'VrKbM�T�2EQ4R�J'�F���W���/*sq���yA�VY7
����tKe�MR��\�K'��6~/�]]U�M)��vUN�Ѽ,��P����xG�QVH�Og#�?�}���s��QjH�"�$��
ﱗ����'v�%sV?�%ߝ���Ƨɷ��qc�^0ߨ"?��o>N�X~�O��7���\�/U!�k\�&�����$�SU.� ���(�pq��o�.��8���B��N�4�-����τuf,�g�W]Ҭ�Ĵ��3#�E�1<c�J_5�K����*��U7�:�Α�qF��Ґ���Vq�%B-D�]ǼE�y`��x�E�v����)ڶ*X�D�}Z�i��W8[T���MG,�Ɖ!�4�8J�������==/
�Z�|�Y����3:��޲ي:�?�ʹ��NN�ʭ6s�ݓj_��͉�[�'/_�zq�Ϣ�QC�$h�u��t��&����!/�Ŷ*���i@�B�w�#B�7��Y�����\�2��0�V����RR?�Nŗ^eb�Ż��O���z�-,�70}nu9���׶͗�R��o�i��w�os��7�^�_�ۘ�ƞ��Vx�����x�\��ecT�M�}l�}Ќ��<��հ<��d7�od$�]��>L(V�� �΃�v��	�����0���������ơ�V
S����Z*��6�D0����7�vr]�rS�B,��������{��\c������~*k�_tn�aA��)V���?|�*\���!�}jr)U��^��L�6�19�Z�v|1,���h�Wv�Yl��mf⒇�0����{7��1���6���| �����/3�8,*1@�t�:�	���S���'
���2i�;Ż@��LY�P���8xP� uFJ�3���2N���o*�6�y?���S}В{<�I���uԨu�v#D
T�Q8a&���CP�j8C�&�Nս�1��2\T~#u���çZc�f҆|�s3ȭVy��(�]E�j�V�4X�8�W)
i�Ԅ|����*�5M���)�G�FF��y�j�41�b���{�ʣ�o���w����Apd�8}�Uxu:���n����P����$�W�=���0+;����e�F�`�3�(�h̊0�FPKE��T�J22!pip/_internal/network/__init__.pySRRr��+I��+V((-JͩT�K-)�/��rKRSJK2s2K2S�������PKE��T�=.RJ
�/pip/_internal/network/auth.py�Zm��6��_�Sp��S��O����i���^����"K��[YTEj����)yw���ll��!�,�������Iy�ںR���׼�(W�W�WU�K������l��S���UɶƹV�
��u[)ްC7qV����W�(�ۦ��y�U�d�*��{�[vF��ĥ��*˲ժ=
bTl���C5J�ڏ���e@������/�Z���V����M����4t|e&
�P���o�X��*؄��ag<g_�}�����O�Qܐ���y��9��1�8sRm�x��u��Pv��a'f|щÁl�}O�x}Ʃ���^1�T�.w_`�0��sM�"�d�'q�5O%.P�"�9t�2/��N��f���Z�`Y�T�(:*�7�^�V��
�	�Z�e_�xYn�"�����j̙�s�Z���Y�w�2��V�C����_���0��}'z��34,�e�#€o'X�֑�R���RI��yq���1�'��.�J&��ai�?��a��ڲ��,��`/kx�1O6��ժ�{mRv���t��������$Q;'��ذ�O��n�^�1�j�+��N��*vh���c���B���U�W�����N΀~�o�^"�Y�����g?�"��o@f�����cu�R���M�qt�0��<~m
���ξ�J�1�JC�
U���D�p���(�.(+���s��Pt(��5"?X82���<~�0>�ۮ���	�w���s?>V�{��ܰ�{�;^�/�5��̷��q��������|}��U�{����.�m��0J��!��a[�w{��l@5n�Nt����k���0/I����ƭe��-"�9"�“���{<$�c��U#p�����`�o��	��/�rt�B;@u��A_�+�Y*�V5w^��Nu_�]��@g��mAk���@FV��8��>,V�h2'T�8��*��p��5$"<��a
ܔ��#��`B�_��
���`�<��k�/2�{d���=݀�E,k:�T�ā�Hj�&L��+qm�K'#�X�iІ��ĉF�- �����o٩R�5��,@��Q�UU�!����ߢ(._{>j�J%~�.L����W���P8j����wE�8��o���f9��#J�XA�V҇'my��l���n�Us��đ`bE=����,���	y�p��m��}�ib���A�f�3�̽��&G1Ð��{�\��Tp�x��[Xqw��QP}�\�`�$0�q~1_a��psNF�o?��.���)F��vXg�e�7����RU�����!�������.=?S�K�����_:w
������qOF8��Ƽ��� �.�Fn��Ś�\�q��Q�(����	��Y�C��yd���50#t)�~J��W%qڦr�	���
e������
� X��`k����.
ב]��^��e���r�l�<g�"��Qw���e6���9oC��g�����x��Le�>��-X����!�@a��~V�J�f�h�H,)-T��F�!�LH>$�B����L"�E)k�����MnѾ���ɏ��k�K�=6̫6�k��X'r�zF�c�N�T��?�0�6��D�l��
�Fህ���^x���if�a�GI�p�T�ЖTd��w��*h0��-�|�F��tfžYQS�'�:A��Jm0W�[9�º۷#�D����ԣ�w��z&�Y����/B!�<>�'���u��h��ݲ�Q:��ޏhݮT�H�Q���e�X� ��K��Z D�Wh{sXģ�4xcM�7�uj�X�4F�5��a?<*�j1��Vt�܌��D !&�ӑ��@7?V+W�cC�M?f���#�����Zw5p7V�kZ,Ya�rٱ�#�U>�]�Fb�[pQ恫y>�{{PD����Gb���
��/`�bL�Ao\M�}!��omȃ8���vj�Ħ�R��Q9�j2�1`o�c[C/�H˨��@���GϜ�&�S��{�Qd^�\��4�F7��6��2+teb�Ѓ�Nu~�;3�6	�o��������k��h�m<ύ:O�zq֕䁠�DZ$���H��8��@��<2/�Z�=�%�^FE��+���Q��!���O@LH��I�gB�X���L�l���g�خiMDf�j�"!�z�#�S4@\"f0�����SuDZ֣^DB�(	W63m��A�ޏpQ:f#�'��,.߉j�W3*�C0:�8QտNm)⥗ma�B���鈎����6w�[Ѡ���)�-�cR4/��t���&g��v.�ى�7��F���{6�w-�{ei��P�n�q�F����̯�$t����x�����)�<�W�p�soҹt-`|cႶ��Z�R6��ǣ�ӊ,d";tZs�g[ b����/9�"�K���!j��Ý�o ����@�������
j4���� ��Z	f~	�73������6i���4����y%/��oq0����yA	CÑTn��/�ڇm�{oג�����g��of�߷,��(�c�xBG:����}!��J���o8I_��/I� <���v�C�f~�&��������ԏJ�j����7��!��OE��tҺG�nS
-ֻ��x�N:�',���U*�.�}w"�ٻ��>�� ,�_!B�1R[U%g�~zw�ƃ��}4�;5�4�w�yA��EN�c�RZrxL�Oɪ^K�H%�W�-���J&@�>�6��d����^#�]�<W6�UP
{��5�ٞ��WI&2��g��q��%�
�7�0��/k��4S�g�9&�<1�y�xb���k֎�2i\ݐ#�����&>W�6�C"fՁ�G��I�M�I�3�<X>�_�Kֈf)�E�C 4�+�Ӷ�~3�=9�^:N�G�v�"�'4���H4�]8�vJ����Xd���X�pN���b-�P�Ҡ>����4�=�긫�|���tJ|*ӈ��"�j#�,�k���Aک��ñ:��]ǰ�iܲ�M�`F����0S��I��1Q����Q��WaJ�'`���gr��N��9�`=�4q�ڰ
6B�u$��a��#*?���z�����	�@FB�z^���B�&w��5E�j�_xH��crJ/Y$�@t��#6R���Ɣ�yP$7�C��̦ 
W��3\sX�F�@�d��ݒ5����]Ukx��-Zh���ir�?�7���Y�&�._�h��_h����MZ���d
����Hh�{@_\f@h;\=���}�ՙv���X5��9���8��U�[��‹���Pbx�tz%3$�l~ₐ�w?�\Ń��W�������̱B�^��PKE��TLI!]Napip/_internal/network/cache.py�U���6��%rd�rii�d��M.�(��Q(�۱M��ߧlܘ�ّrI844�z�^��)��/_����������^hŊ�,��^j�A�b�z�^+�_����f�?�]����p���
-��6��h.�5����A[90�%�������ſIr׬;!�ʲ����;6���:���=9A�,f�ұ�@��y��I|x�=����i�r��wo����|Tn���E1�µ!��j*�86v5����P]�b< ����@�Q�T*���BI�C��5�Ek�uU,��w��V���+��G8#M����~�4V��2<.΃{&���jcu�IzVo��/�v�.���ā]ǻ���I�.������O�?59�p*U��;|�#n�Rm�V�U������T�'�Od8B�aqx
R�� �sK�Y�=��3�D8�=t�:%Hhg+|���OK$|�V��d�8o�I�������&���j]�iS���
�&mU��A���� �pG��2�O���3f�t�̿��xʼ��q�Xl3���j��zy�<�.Ӡ�C[M�������3����_�Q?i1��q$���,��kF?�4zᚸ�hn�I�P�t�TA`��7K�|R8_�I���5�����q�M�Y;���P��F7�C�s��ɩ�O����Y{�]<��~���DܗBf~����XmPU���ve6�<n�r����N�{�����K�Ц6�	w���#�	�����h�gvuu����Q|�=�~��XC�����q�U�.}^����M���!}ѐ2�1�Cg�g}J�PKE��T�+��!pip/_internal/network/download.py�Xmo�6��_��( o���d��4]�viи� h���H�F�I���}w�HQ��4�>M@����sG�q�V�5��%Y�)r���R�$S����B�,��8�u+�&����jXAW̽��jś�{�y��eʽ*ZJQx	�H��L3IK��Vs��*%�M[�Ȯny�巬)��$�kÔVY-JV)����|��~>�_��q��OL��Q-���`���x�\�TzM+��G�WH؝I&�T������s�9M�
�r"���^dcv�/�g�V��qK?�������X3�������!)����^�7��6���8=���ɧ˔H�˗B�JS�Q��J^�7͍SiTe5W��
j�s�f������F��C	�Qm�5��Q� d��3H��.���,�'Q�lIr�Z�6�f�	>M=�&���+0�z�����$�	1k���֌b�U\�ѯ*֬�:����F�
3�H�{����P4�v����h�������y�&�]��w����}�?%J�42^�R�Zl5S�O�i�[�!����E	�4;"8*Q��̀:Cz 	�F�4��E�����ì�HU������Jl4�j���� ����1�$�כ���4P�J�/_'qf���_��I�k�o1�=���$��R$�g��h֕䥊���H@Ž�QŞ�ό��,�,��O���eU2!o|͜����ob�;Œ��`Cg�c�="��@v�r�
@��$?���룣�[��[h>[�2(Жq2i;}�ѱ��R��+Z�``��(��ͱ������苂������
� �w$�c�"E&�Ɛ���o=�!�_v�DC���@Ln�҈�uJ�;�{�!~�#�K��@Yg�PYK�:[P5��Y|�zs�^k2��29��z��t���PJhS�Π�no�����8|�R���Q
�U����ؤ�}WA$�װ~�}��o<#5�|�uһ7q����8}A~g�a@DZx��V�]�3MJ.�M��Bc���hh�w�v��hh��Y�<&�;/��0X!�=P���B����+�i�A݃�/LC�	/��m�.��er:�_x*��A�
�zA���m��،x!b�K��oA{9�J��3�գ��f�����!T��365X�`&���[YB܇Yǎn�A�%���ic�:��'{Jz�0������*qSb����!c��7�l�)&3a��-kpNv۔e
Y����0�>p��~ܱ	��:�.�p�k��M�[��{�;�����H؜��0
�{5⊧%�D
�)Κ��/ b�'WG�~�ŌY�&��t�T�Q2�h=��Q��٣P]Q��]QQ�nvb]M��P�u�'����e<�����
N�Ӂ�,w�.���PG�P�`�14�����ﺢ����L���
���aw��Zz����*3GG&��(��(�ǭ����4~�&:�pH"�&2G��]��̑)\�M���p%���C��l�R�������.�E�T�u����0��h��kC����a����M�Rҡ���ѱ�#�[���qH��I�@sw�x�	;��@$��f0fL���gw�f��~w��u�︎6��;u�f��<
�Lu���q��b�d5��H�;�Л�Y��\��׏p���:���`:C0�#��g^O%���h�z�lL�#�Q�Hhtm��	��~,��׿`)'�d���?`+���X��oa-c���z{��*;��q�D�PKE��T����	�#pip/_internal/network/lazy_wheel.py�Y�o�8�_AhVޓ�d}�����\�)��Z�l6��#�&�b���R"%�i��D���7C&������\d�7�ػ���A�fI‹"I؊���[q+��
�|.u[וjDD,Ȥn�\U��q'D����g3��m�i����yu���C�Ve#��Bn:�͞�|+��jľ�e!:�|/�;��:��7��P�r�Q]�����)(��(��M�"�L��M�Ȫ�E��ںc�-����M����Z�q�M�Y�⚧|j㶑����eUʔ�Y$%�{̩Lhu��2�8/o>�]}�K.�}���������
]W��'.�{��7�٭��R�M�^F�����OLUĶ��Y�<�)��h+�k�5�t�?����%�A4�]]����1š��R�nx�j�ƺ����|г�,-���
��RA	�/g~j`�L�l�2C��������:��ܙ���G�3�AnEӪ�q懍U��X�v�m%d��n���}<#���Ԭ��D�b]�YS��,,M�#)ue��􉤑l.K,�.���ꆉ�j�;�%kH����B����T�p%XY5�q�R�I8Dɴ"A��lv:��ń�>�s�5{�MX��'��V�g�6���D�"����Hy2�����e�Q�Zt����oX���J�"�M�V~���y�e��s��5$�e����"���0�Y�b�IƐX��1@�8tR�
�!#?��{JL�3J�r��������P���}�2�3�uQȇ�R���E������2.��2��Y���I��N�[�D��V(��<٤ǧ˔��Ո�CUZ(0�B�w�7k��R6��]�i
�I� I��}b�(��	$�,ѐ�%&���I"a·��!vP�`���t>	�WM�VF�"�{
� ����$)��Z�_���ʼn�\0m����YG���I+D�@XaȪ�:�.MM,�Ip?�R�&f}8�h+Sވ�W9��Ȓ��L��%�~DBk�I��`sh�Rd�|wb��0�Hq.-��4�IН"����zq����N`s0�-݉�!��"C��WC�}�A�z��u6A�������\��j7q��0j��FHtR�G��Mۖ���1�S�\5,�t`�4m����3��)��4�46vd�]�j'����r��ܗ�����<�!#�d��u��Z�:=h�a�N$
�s�ih���Źыu?
,`T[c	��mAv�����۽�"�sՅS�%)����$�)u-R�KwX
�n��	��ja^���-M��f�x����Eܙ���5=�E�6
h�,��쟳�,*�u��O!>c�ל
W��h�
��p
���j �]D~cg���e�P���A���nk�Yd/�Lc�^��n�s>��Lِ�A)�X[���q�pC"�
��\��j��0������ x6��Jp8�TZ�=,_X@��h�y5�	,�]��gK�7G
j3���VkW�;[�O�6X��)!��x[4s�m��j���w�矞��%�l����t.��V})�d����]��N��hu�v�Y���"(
&]�ڠ���b��[�t��w��t���_	:H���pG�>a�-�&&vZ�Ý�������iSVZ5�X�~�W����
lYX����vX��D���rq����z�-d����h�7�H�"���$X��Lt��@4��D���/�)]���|�7\H�
��T������/��(=b�T���1�A��2'�#<�0Wa�7E��S.��Ԡ
���z����`OFP��Q��z���or^�HH�:���[E_X�����9v��s�3sB��蠺0���f���3��A������i���=1����C`���Þ��.FR&C��Н�		���S��$��ast�v�9ݶyס�>�%�/��4��~������tׁ��6e��tH�}�p8��#ؒ�z��L�(Dx{Pv��u�?͕�%0!�sm����-1(Lkh���Ӫ>x�֟~�����9V��"�/��;�?���77K@�f�…n�`f�
TKJ챮K�~��mU���>1��<�z�����9��M�G��P�WfМ��ў���%�a,�ӯ��+�v��"|�4@��/���;�U[=�u�so5Þă�8�@t��v�z�}�ȯ� ���TPkx�V��C�D /|��	��NW����]H<�)���lެ)Q��>�/L��y�#�Z����-F�zy��Lǣ����^�/=2��{@h�	3�v�px��`�;oLF�ޟ����}b$�mE{<$Q
���jzU���&b��Bn��l�����ޑ�-�L�V�&[��yFź�znY�Ź��/t1��������� (�
����U��p���>s|t�zL��	�;�h�0��]a�yb'����+��c>�?PKE��T��dH pip/_internal/network/session.py�<ks�8��+�t]E��i;3��q����8Y�8�+vf���b �0�H.AZ֤�߯��I�qu���[�Hx4�~�1A\��F(%��,a�.���d�bq��)|f�6�4e�,U!b���(�6/X)�YU�إ\�%�,��X�G���(��Hn8.Ӱ�d�l�̛oO�P�
�<���|�T�ύ܈jW�fl�|+R^-�rc�5���E���*j�|��4�����m�K��-�|�`M$������Et������o_O��,��//e\�o�E&�>y�^Je:��a�WR����
�7���u[���>�Q��d����	�G�%yiQ3'��fS?�F�1��O��S;���u�Y‹J��+�ʕ����\�P�ˋWg�/o�뫫�_/���2��~{{�E�i��
�u��.�H���){'T�gp�!����&m	��&eJV�Q�y��#�ؙ��ܡy�z
��g��X{4���1`c��fՖ)�@�(�Q䀗�x-Q"W�_�*JĒ�i��Q�y�Y58�H�2{��/��P�3B^Wk;�
,!_�28F�A������7|)^�T��ht��F�U�F�o
�sV�N�7T�c�P2cy���C��E8�>i��3�\EU��_���v4~�S�?|#U3zQ�4���#���<�2RL��~@0��Q���%��u�)���4�d��D!Oը��G��
�J4Z��n�F���of�w�uIm�(�FDh�b�R�KZ�m���j�;�yw�W긿�љ���VK��K%�]���
[AfU%��u��pd�y��)��� `�x%Vy��
��<��8��"�z7={sJ����=���w���Ty��S���$�Z���?�D��5|�g
��j�dz}�L��7B��uU�GGY���������	Aة`�w�c25������P����c����Cݧ�'G'ϻ]@Ea�{Bd:��@��[�Sf#��}>��,o�B	:�9Z�=�R�E
*���-t�e�щ�Y<���Z��9Z�JlT��+0��Cx(��"]ú�#�0��h�,��
	��@�����p��@I���Y����8�����yQ���kN�N�3�p��=	�$$�H���U92ףL�ޖ��C�
K�-Pg��?M���K��p���zN��+I���cR�dW��i)�h���ݠ�-x��*q
 ��P,��պ^��<*v?-r$�a:z��/����������޾�x{�~�n~����
�ذ��_(�
�1��ak���ˈ>�/�q��H�;��=+����/v.������RkYL�kY�|���
�+�%��
Z5��y��He:5���:��D4��T8��AE�|Q,�v��p8y�51z��;.F�lgP��4�ӴYW�?�����`I�=kY��:O�/��{��Ȱ�UՎ�E�
�”�C�x21�"��+8���rMK�\0f�$
Ѳ|D!��܋n�f_0B��Yj��;,5mx��&%��Bs
�#ۼ���Q���,UV�s�2x{ȶ����!0��S}�Sr���h�G꤁��U�N��1�/-jD�A��}������m��;z<q�eN�'�k���,��Os!L>i�n���������\�(�&��#��n���B���A�휅A��"�B��a��C�S�=�,�!*t�x)-l�Sg�}k���N��&2a���l쭅�7~��H<�<�jW�6���{�`Tr�P	������s������|O\cG�<��ڂ�`��`�"�/HO�����G#j�����
q� ��g+��6zP�O��V
	���g��m��,ΞN�������,��<_e�O�5�aLF�o=��#	`]	;���2Vp�8ޗk�δBL,�_܉�q��!up���e�Kx��Y0!����f[w�]��,���pu�[�A`��o�!�`<��	��L"�~�?~�����nt�7@73�0�`wkp/�+�qQ�@��
�p�ڴF�'�?�ܼ?Z���q�wxu}���w7�z�.*p�ݓ�OB�q
(��&
'u �.���`]:P�Nr4$�^��Z�������A$��i�O�+�}hD����2�@EAЙU��Xf�8U��E�`Dy]5R�������6�3��84��P�se9s��ܾ�z;e���6;_�Q#:���I�u��(�*�w=ݽ�
`�qe��i	�������U��Y��ȓ����Y�?�?>_,����'��/���w���d�>���q� :�I�
6��&�̪zS5��}����b�
6
�E&M�����d.Vr�  ��+�R�����
��J�Ks�,h=d�V��g-u��]'�26|��?M�����<���f`l"s�R�O���#Ok�,7`t`����DD⨜���q5*%@V�I�QK�X9oK&��(r�NӒB$�Ϝ(u̘��7�^�חg�g��igF�4�����
���4�	����z�:�����>��ѧ Ԍ?�V��Gk�q�?¤�jL��"�A�F���`��Ge=���!
�À!e����KL���1wc�È&F�C&-F4,[d�U�i�z�_�zܜR�HF��%t�͛.ӜWS�]5?�{$<M�(��S}�t�霫�v`,�R�b�iܡE@}>I����&̙�M�(�^�8��37�=6��l�d�W0�Bq|e�A�Z�*B}����uQ�ܳ;Ji���c�f�\�\�eNwY��9�����l�,7Gm#���]%���?E\M;@Cؤ	��
��-���W+3@���1&zF!�P��6�?0�oad��x|t�|:eH��H�u��9�8��Y�M�ȥ"��Ke#� �bL[�6(S�-�M����W��ND��\-�+��==pA���G��+���ߵ�	�XΆ�����^����[@\q�~p�͸٪ZÜ�J��o�%W��CN�c)������;htn���,��?6Ns%H��D��*1-v��Icƨ2I��(�����h�7�IfM��~�p�$!���XO��魯{Q6�UM)^�w��^J�5t��Ԋ��8r��8Ug2�k��$���Pg�����Qk?�%;�������-=l}_��YhS�9��m����th��vnt.욮�lS�`��|fC�(�<m�3\�9����݃�@��5�� �
�AS;1p¸d9�u�d���cհAڂ����s���K{@���
B��.�<~h�s���2�
�;p�R���n]�W$-|?Xn'�>�IW-9{$��H�����!���kCə���$�������v�ޘS2ޣ���y�d���f�W�.�}\H�i��s�z�)'i{�]9�+�/�y�+�n���q7��7Py��?5�̴?K+��cң��a�'���i����b&�t�f�9�Z����@G�����\}��"�9K�(÷
��#��b���`�rJBX���3n\A��x�p���*{��Jn���uOM:Bld[mH�0�s�^���Tꈛpp���#��:&��[��T�c�����!�5]HF���s%tɁx����R�I�TPh
>���g�DŽ�R���BG><^��w�?�*���KL���le�4\�p������H��ԃ�޳V��)�X�,Iu
WSZ��ը�m6X�6nyu�~��>��׶EW�@�v�R ����4վ#�K���@�|����ޭ0X[��2���v)?Z9��h�W�=�"L+�锇�ܓ1�45�<�Z�Gzmuf`u�3���ҍ�PE���7�g�M����ZA0uIVZ닰U��
&���p$�딎��]�
+*�M;��k��#t���_Ȕ�����q� �@^�;��R�q�|�]S���m�_������c��O��`�ӼN^�
�I
�z�V���)�h������%H
��:r��!NA��X�]bVb��J��Ѭ�b�3��D˛QA�A��(m=H�;,���"ђc$7;��p\��%�#0W v����tqiaL�ʄTB��U���v ��z�v�l��I]9��1�}�KG2�j�NN3�'�?6��r�+��J�p�ҏο|�9$ڹk`����m��n	����IC���à=�<Zp�##�V�==�ʚ��V�F�/���t�Ck� _KQAg�TEK�Cf@T�Z�͂ު�G�ˣ`�T��əde���'+�5���Һf����Yõ�9�4�S���ښ,�,����M/��D�Υ�{ahઇ�
Y��e5�_�N*L?Nh&��|�T�\g����
9׽D�y��cj�\����9n����:^c�Q��R
0�7��Y������7P�+����4RƦj�e�ᓽ��.xO�/2�j,F��� 83�u�O&8�CZ���#�'O�c���Ƌ��ԣ�\p��
{�:c�h��Ll#7�h≯s���ߊ��S�"��+-�=�ۚ�7ѵ��[�3l��h��#���u�ʪ��'P�ֿ���I�8o됝
g���L^o��5�`��#�L$a���Y��?u�)���M�Q)EcK:^91^;��>P����㧾�
�0}�~��$�񟿕��;Lj��f�,��4�y��'}����+�K��0�9R%�̼�'$N^IT;2#_z��ցQ!/
�#m�NՖ��
=����|#f���	��GM�sHo:�āe����']�h�xwr?@���~�nO�����Y����wp;���	=d�N"y�(��͞�|�x�_ ^��$����1\�^5o-�79S����!�N�4�����gz�go
Y?����+՝��T���arڝ�f>ߡ�!zd�y=����ld&��*S}��s"���3Z�U�j�@ 9O�,�~�W��e�e_�~Vc�/�L�޵�՚�gf�^�yv:��<��D�^濥��Y��-�����[��
G���^���k�ȕ��Q����8����
Z(e!H�qB������9D��-T���P�Sv��:��
��nI/r�Ր�V���x뷄�.�
���O&w�'^��L7�麞�{��;��1w��+ʍ�!'���O��b�")�"��H��s.Ns��ǐ�<+�`/��|
�<_��N�W6z��N#�Cc2蠷ll�^5���=H]��=��ͺ����N
ѷ��ˬ��{����	=���-}J�|;BI5�[y���;L�ء�?�Բ��UjT�2TRؼI��h�
�B��̬��E�n2k��9K�Ot�1�9m#5�SK�&��
*�9���#sƄ�n<qN�m��kN�7t���>p�q���BӹKbD������l�{���s�a����?h�}a[W�\�����lu��Y����q�0(=u�:��0�����cJ���*�*�1�;����cm�k���ҽ�р|MmRNj��ib��1�f��8U&[V��� 'ZC�rm���	5LR"�xLjBV�vM3��'�I�2^S~�&�A��k^ \�����Ih�׺&�饽Ltc����AG�b����&$k,�Dq�>{�M$(���HF"��
��G.Sʍ<Jn�Ȱ��R�fq��59z$�7�p"�Nx+�`B�
��$B����wEx�n���Th�,��[��I��K�7�d��w�_���Cs��^(�W�{�A��N��^jrf�^�
7��w]7P&c�ې��|�J����W2��J��ξ��@�u\a��{��)ױ�Մ%�r����PKE��T����pip/_internal/network/utils.py�Wmo�6��_qp?$l�M�&1�]�-ŀlhRXQ�t�9K�FRq�"�}w���4k��B��{k����2[�Ls�-\�Ў�W�P��`�;�̧��"���)�X3MU���/�����_\�|��mq���1�G���`[��,�L$S�bn%�W*n�n�^_�,Ðo��f/�~��$Q��4��Y7���
E��5��r)�B�EA�%W��"��E[�,�u����Qx���ѹx�2NO_�͎�������8��ϣ�,�O/Hӟ�Ax2��u��P�AFJ�-�!��_��ƢH�*R"�t�M����x�)y,
��0XBK$�*���RaNa*��ڀ�(����C��rYh�6L�N��5J&	d��ILX'�I2;�d��%��ߐpw�	�l�D�2,o�Ӝ�R.-E���!!��hێ�pH�D1�sTĎ�9,�ȼ��=P�^b�֮����=�bM�MH�A5@�zx��jM,����ؠ-5�P���`,��UUeQ���YG]�X*�~8�R\�܇��0�)5��Q#U��	�S��c\$^�E

G�4\>N�g��ኾ����B�N.��'�bFz��`|lC�5��n����ZǞMF؊'i	��8���Ɠq���}�w����&�R��.�2We�S�RN�4O�������������c��Op_��A0�ð���q0P���p.��0����z@�`��R��T��6_ �Ej�dd8t��42#Y�NMca�S��hF^�?nL	k�
�!ZD��Ɠ3
���V�2�hɇ+��F�B��/�d�o��'oiT����q���I�,��!�6
D�f�Ҩ������9]).��|U�fZZ�m\�O��Z��z_���pT��2�W�-�b�Cg��TL+�}��*w�f3xS^�2X�����٬ѱ����x����.I���
?��:q'$B���Z�hP:@�N�����B���G����V����`�]�q�W/�aT�dy�WE�6ޓ�i�1�����OA���u��k��ѵ�ص������_ˉY��R����N��›6�a���w9�R$~���Ldp��:�!*ߦZl(E�������q缦<�	(�nW]�"���lg�~��7��V�s㕇�c
�*���ŗ�vܱ�6n�l��2�aSqO���kc�K �]CJd�Wf��pm��'X��~�o����zI����j8�,7�[�*��K�F���!/%����\��a�Ѧ����ž8���oS���@�ld�=�
�e6EO��ْ�}ۏg���>}���
�/�h��g(j��l��r6�DV��w?�6}��^��\iLR���	bHSVَ�����Q������~3z����	
��
4���EB{�:I$%C�&j@P�Rn�u���Y[�z(s��)<�H��ู�.��I�7�PKE��T-�{_��pip/_internal/network/xmlrpc.py}��o�0���WX�&�Rf�+��ic�*�B��\[�c��Z!�w���Ї-9�}}�|�.��T)[J�Xn�v���ȪVP���K�Ji�`,,)s8H}�_�Bi-��>�*2�D�doME���"�%�_��������w��-ikY3.���bp*�-���	���?��P��{k��V��L�9������F�W�x��=����X�H��~~�uB��f����q>?א�	Q�Rbp�%��+;��c)�ZT��*I�B	�B�_���T:�ntp�v��m�y�%A��8�|a5y�"�������@ܬM�C	{‘��1>�>#R�p�8k��H��z�?#
b-�/+X��1
A<���V�-y2֣xS#���J���vwJ�Pq:�_�C:t���θ+��&*�
^fv���7r���/�oG��5��\�ɒХ�r��ߙ��ܸ�vg��ld�`��l�hFc�G�8`��Njs]@��B#�i:E��6��<��M������!�n-��c��籽�D	6��
�qjo#=D������?�8��A�h���ԝI�"��%6S�)]g��2)��6�m`����{qդ}��x��u<Y�tqp�X�fF���4���n{����	s;���8�%g����
+�,�ZҦ�y�%7�q�(�}���qt�q�k�”��\8yt�PKE��T$pip/_internal/operations/__init__.pyPKE��T�ͯ�"�!pip/_internal/operations/check.py�Wmo�6��_A8(*�~��K��24E���@K�MX5�J�
�ﻣH���4k�$6ɻ{x��W��7��j.:"jR��u�J�~�iy�G���j�$��Ԥ�#�I-EK���n��MC
��=/uF>p?іU_��?�h�6y`�eV�QU��x�B�aМK��%kY��3�eZ{Ntм�2��l��
�d����xi���B��Lʼ�H~�W��3+�d����*8��e��éSvd��XM�F�{�Rt?�T1'�Ƥ��d�:�N���5th��e�l]�s�������TQ��$)��cd�=@g�S�כ����is')�1��h�`�<��v�J�= D��恍퓏\)��v$��|d����>'p�&3-�&���Ԟ�G�(�E�+�_�yȁ���TO������[��b�����jVؚP( .�Q�U隼������~�����d���ۘ�gY�lNr�>(���;.J��k���bf2	��ȭtm�@��`��Re�L��*m��Bt�ek�dD�y�Mז��VQ0��e�-����r �M��"�;���Y6E�����I��d�&��ߤ2#�f>�	U��x�Ƚ�^k U']c�}�<Hqf�*�K�De\LW��C���
=��ԃWj��f�ͮ?���FK�م��9Gb�u��tά
	��Nbh��;!�Ʒ���t��do9�!�$:��DRh"?�^��I�d抔�2���x�}��3=T\Ve�k�G4�������^kd&�O�!�=�h�;d���K�]eTaѧ�s���2�Ô
\�dn�����Ԑ�1�[SG�9��b�'��8N�0�ê�E������!�u�`��*z:btM5�H����$��m�&�\�t�r.���Q�	=Jl۹�UaB�4!���3L�FT�l_*��MB9{��=$]_�>J���™ӪJӑv�|�T���]��${�i���%�/��+�'�3�g%�9\APh'�/����t��-�x��뜺�]����!u�䈔ڝ]H^C���c��9����:T�H�9���-s���h[$Y�2��n�v�*��-�q9���J<���$5����b*Fr��?�'Wh�
Mh
ݙ|7z,Tq������#4��{|8��r�Ձ��}(#�]V����f�e�8��<�,o���U�+Dx4��Hݑ�0��߮r�=K�\�8�io�r�����zp�v��W���_K���!��I='C�M��zϿ&��mC�CEM�Du���֣����m�c/�nvk*��i�� ���~��M�e���yK��|���0��P$lƌ'�3�N�	�cA{�#E���-T�F�L13��j)L9C��� gD5
�(]��8ч��f|/~��N�T���H%>�7�F���������ޟ��E��`l��2��2u�{7*���~���L�k(!�3K���#��i�׷�M�~bz�@E�A���!���z��3B2�9��BK�PKE��To&�/
8&"pip/_internal/operations/freeze.py�]o�8�ݿ����������xq�lz(��i���Z�mdQGRI� ��fHJ"eIv�w�	EjS��|�Ů�B���%�T�+�(�R������b+���}
�Į^�JѢb"&����?|����;�6%��B«+�c���ƕ�j<��1����`��:IY�s��4{�x|Ҩ���q�xUd�,���|s;��pH�����VT@"P���i����N����*F*�hYR���1;�hN�H��-�M�cr�Tʪ�B�j�*5�D�%P�D��;j���0t������]�b�E4u��+J���_����^_���zH�B����(�{V֬'�yCeZ�����O�`[&X�����	�n�+���ka�5���b��J*%I/-��-{��V�a`��P�+2Ӌh
�J[�
,���m�V0����[[c��v��W���-9X\ʫr�"�Kx���Ҿm$�/k����
��X>�l�lr�){F>��wF}@���,����`��v嚎�p ]�@����{i!ڗׅޕ3�;�LGI��Z�,Os��т/�u�1�^#gk�]�Ľ�>������B�,�V�N�9Jm�Q�}aC�u��@���I:et��*UT
�Q�r����F0m�(MX5��\�쐜u���I�Sp6^�+�;Q��X)ĵ��a�A#�yS�EF6��]����{� ~"	x���`�(�]S�<���*	���#�@�c5Q2�[��S	G�I�p�:nx�=!�ށQ#i�:�D�n���R+���$Sa�2����
�Y��@q������,k��y���yq;@D�Q���*vL&�U�(칝&�ܜ@��(Ȱ�
�ŕ�"�����S�fU���]�w�g`R��'��-��/��h����c�k��*�D���,8e_?	��[|�������Oڰ=
��%�� O�/N�
H��R�i�`�B�"�!��\�&@�3&�2g`�9�
���vɞ����H�-�@�q5mh�o�q��G{��X�8f��D�����,���y�ȦO�g_0H7	��)�z^�dA4撨8�F��M�����͏�ۣ��A-u:��G>�HJ�!X�D(Ē��d����J����h��u�a|��y�̱����D6�0b�0j��_dm�P�4�d'X���;���6d���#ԫ�Av�dW�n�捼�(��H0�MW<HgVBaJ(���tg��"o��I/�σ���k�E�?YR�v!(�3vw����v��X��~�?�G^�G��P��
,��+O��˲�,"��hX�j#�ߎ�2FDD�;S�:��naKY�vtg}�ns2����y�4Օ�7�4n��Z�U����zԻ2�K�X�4o@63;b�@�y�<����+<�}�-��'��[�ˀ���)U'��T������k�G��^t/���YINCxRp=QN��:��(���-�������{$ B��<^��:� d�pj�i��V�;m>�#v�<�Ӝ�U�2(�"�3��P������o�$����8m��OA�'/�Pr�B�#Cq4�\����A�yF>AF�BΟ0�{RԊ�L�n�84���U�O�\33sM�g}�#-"��ۯK���<�ȳ���f"�
�H���'=���'�k̼4�wT�8Wf�<]O�V�m=g���v�UH��ʘ�ю��v��9c�m�!}�'���/���`1}n�J[U��4��:���|�wu��)���(������9�J��N�憎��3::!����s��j�Y�f2	��SH�BMc��%�	ƥ�]g ��]������"�)#w�Yw-p�v\�+�����I�/~��]�M!|H7��!x��
��4J�V;2�᩻�7��{��%��9���
[9�4��u~��狏�b`H+����~U9��sq�GK��زӯFC��oC����CL������g����3�8i�̰��$ዥ�5
n]�:M�jX�k:���:ǀ*�N�h�a)��a��pL<?7r17vc��(�VT�"��iI�q�
l��χ�#Bp�6�������a�
�EQ+8�^Q �3�[��H�{NQ���d�_��Aa��	 �b�́j���%��#����\��� ����s�	0���X���u)�":��Q%;���dsp!n�0��T`���H�5�x�G#��K(6�X�ڣ�6�(^>��/��Г_o��\��}�(A���A֙��y�����ȉ��ѡ�&?�.��t�I�Pi�%Y���c/,�b���|�����{�iĂ�O�x~b������)�?\ѻL>��To��u���4ˀ�d3�^���c��,��-+�IJ%dp��`u �a=���˞Mc��k{����������֯{���a�w�.?����=�#I-���cS���F�'��$�F��i�
��^��Y�\��Dͧ�aP�=�b����:��w
���X0&pX4P����i��5���6m�%�`��)�Y��C�7"��n��5��o��7PKE��T΋�U��Y#pip/_internal/operations/prepare.py�<ێ�8��AɀK�3��C
���Ng ���,nڦ˚�%�(����=�")�v:h,�FwŖ�C��o�d2yݪF�J)օ��b���E�;Y�/\M&���G��V����Eu'V�n��N�m�/�b�D�v��Z	�M]���N�w�V�fwl���[u7u�+�r�T�Z]]��n;Q�ww����+v�;6J��������j��;Cpg���?�;��e�f��q&^��xJS4��AU������l� ����U]+Y�բ�;�O����>�ԝ�W��p�0�]����X<17���s{�7.G}Z�&�Vv%���^uu{|ߖϤ޾��j=�x��B�d��W�W��ʎy���/m[�|���u{�s
#W�=`�����E	�o�[�X�N��3�Z}2S�
�l��^�էt15xI�e'턟�V琸�ת�@��bߖv���նxPϫM}b^YT�v��~b�a����O��\1��u}��Z������������)0��|\+3�<{��Yݩ7��JwA&] `���!�]J+�Q�Xj�[���T7 �,Kd���Z�qOq�w|-
���IЛ�bH��#�b�J�U$L�}q�.:�:���*�,�j[�VxF�fdQ�v�㓍Q�nWǧ�
��ϣ�R����@�왶�Z1��W�-r�Ԡ�ړ��Ԯ�Av�w�۩��i�
%�;_�]�f=����b�fn�K~��t-[�f_,�WWWk���h�@��v�M0c#`�ۀ=y+��PU�s]�N�˺6H^m��U��������)g����<N�K�;��Ѐ��mXߧ�Pt�	9�K#xc��r��p)��37�G�,��l�!7kj�>H����˄���`�X�$7�?���g�I+C'�8�]ֺ�.$¼�+�gFKDG���/Z�\!�j8�N�9�K�3�PhQ�A��9���f�tn��×��ݹ���^���x
R�'���b�iUnf��9�y
�ڭ�>�����s�
(�܍b@��3��`ؼw�;0Q�.gz��?>��`Z/��4�Gm��!����cbo=c�A]���Uio�~!�'�ӟ�Puf���	�2we�)=.v�=���k������	� m��nԪ�`��9�e��膃
�Z�#�'�]�w�Ž=��2z%0:w���O#ޝ�fy��f����d��"#��؈?�yBvz$J�]��]
��v
�u��,k��Y�L}	1��1_�[�N�j�e2��A���G��f��#�\	_��阥�������~��ayd�.�NLg�~��
ѭ�_3pȤ�,�D_�����X��jQo@�ƿ��@,
���8C����@�j�*��8��7 %B1����i��Cv��4�5�4�#��h��X�7��@X���7Kp�ָ!Y�Kf>�o`U;�����]���W��R��d�\^$�'D�.r?F�O肜�H���GX)w���	�{:��@���{'v}r�7�/rf�[�
��-�w�z�/�	X8T��V!��^w�K`���g6][Y+���x���90M��Y�8��)�}�+c$�'��y>�����oq���Ū77ʥ�-�B��>ڔ��"S��8D���a�
�چ����-���C��{fM��3�>I/�?>10�I�WE�Ԯ�>�[
�%
8�چ�rjsgHm�yh�Ƶ�<P���s��b9t��t2f?v��U�{�;���[n{�z�7ɉ$t�'1d�,!r�T�<�rc����Vgx�ܼ)[p�[�)���V��$��$�#�OC�3�
�-����Ꙇ.F���/��P;a&�xw���H
�sZ�gr%|`7&%Y.�Ų��E���'z�*�=������]!c�<׻VN��A�5a0�W]TY���Vc����8v	���^�=�Qv�>=�U��X�h��I�����)!F�TX�XOf��cF�k��z�	�$�̵�:!�md[����M�x�(S�1aA,%[�\�Q7����\���4�Uc2�����b�y��.Z��P&���) ,�xè�C��� P�`r*V���C?H�����.��e���'�l|J-�zi�f��w-f�2�ۉS����*(��^��#�K��}�=��r�R	�}����bF%X��۠T̷�$p�SCl�}�:����ut߅gs����Y@�i4u�����A1���!i��GX\�X����XGk@���-:0b`8�5��̫�>"}���G=��*UG�xd�S`_�b�2�y��2���w�\��I��LQ�5��·������?<'!�'f����8J�
�Co����>G�C	��dWܩP[��wc*���	��lv�p���I=�+��=y��>�Fޕe�=�gyD�t�=t�"0l��pU������xx`�v��9�$��ޒ��ȫ��Xu��2���b�v��V�<N@1t^�O%�q1!w��.k=0���`��n6�b2�z�
,���``A��3�#���&%�X?k�)�Om�oo@ę���~8Z����uި��"�����"����$A��@���qq[+E)�Q聵;+�@��/�en;.�3�ܥA�[��,�Vњ����4U}|�d�̟7��'u"A�3���|@r]ӣcz~�(@苬�4��`��J�����s������h'X�66=��F��a�H�j�*c��/������zcd9)ǁ<��,�U0�w`��b�r�	?+��ITu��D5\]w�RК(��4(�s5t�o'���E�<��N��d����P�+O�:�w��gˊ�r�6Q`�U�t�R�n�u�b(ߩ�N&��7�g4;�qH����(�+����w�
���a�#�]ͫR�)�1�<�=H��q8�F���w��^�f,���ʀ�j�]���Ձ[�
�^�L�k�U#E��qa�#5��E�R�v�W6��?}�?��r��=Ġ��E�9�<�>e%,�x���ғ��!��{��YʔG�|@Ox	�!9hH0k�I�mY�DĬ�}L6l%bi䡕�s7h��������b�'2�IF�n,v��Ⱦ|�����D*4��wy��d�5�t���-�
?�
��ҳ��;JWS{�-$G���TR�x'!�NDI�|��1Bb�"�m�o0o�j�;�8AϢ4�#���DW�����bo�Zs
_[w�����>'~D�Rc���O	2X�� %��D�=0�f=�#�խ�
��
k{X�A�B��%1{����5�iv��-��H`J����VR���1)&��yP���o��&�2Q֐�k��[�B��ˇj{�Ec����Vw�/譂�N�̵�jD1"�u���}?�]��	pD����[q�e���f�/��iԄ���L�ɋ�e��9�6�V���<c�^�z�
���Zf�1�l2C;�����Vg���BZ� �z��ԾO䐲B`����J�����ڷ��Jg4�����x�[�i[[يZ��9Ta����i����P�)
������˚9ee<LpD��/��H@��"��m��^�=X��殮]���c5q\_d�{���;D)(	�`�f�K�̣TDƬ�U���و�}g�.՚%��,}M!\�u�4��#e(Qq0"��s�'�;�=�w~:(�g���(L��F�����%'��q�9���M��P�).)\�5-I���g�&M�ɴ�a�S�aB%�VcW��:6��Z-�w��ۑm��c�B�"�KVy-�Ӊz�� -�9QN�j�C�o�q�u�F�\h�~�y�N�D�bX�?��a�ZԘ�EQ���0?8���<����W��X
��<�j�}�)���
�^�ha?��߰�����\7e�e�G��9�#�lUf���6�,L�X�m��8���	o&�0Ĩ���y��\�EU�)ĔmWȠ�W�i3�ڏ`��u��|z���Ё4�h	t��`�O�MRC�3`
(�@��;��*�rw�)���|�I+�)���=���@�|�A�q(!��܉k��뙸&����	K��a*������m]��_e#�Đ)6=~����̢������ת�QdJ)��KD�&j�7dv<���%L�A���=��"lښƧ�j�!Q�PT���Cc]���c?��极�q��p���qN3}:w�fzK����2�o��^Î����:��U�堔�Ós
uop��b���?�~���pf���)��d�v���mTm
]��A,�5��1l�ˉmu�(����Q�aS��"V�=�N�+?��^����@��]b��,���4D�YҺ��wb�w匭V�r�����Z���j2�(р�(���c�F|6^g�%�B�����?�Tl�z,Ճ����"dQ!/�6�ߑli��L�����kP��� �;�D���L)�<Q����RmY��&�6f�<=P��]���PMQ�N���>�^�s).d:
���G�:���aul�-J��[�*Ybkr3��n�{��*�幰�=�S��a�D+~����Ҍ��r�#��O�����i�E��n�]����'&Y��)��S~|��
<�^�
�e>�)�N*��_�Շ{�ȵ����&��&�ǔ�px��ow���ip���ZE�4=)1h�˿]a�)���Xi�@/�[��~���(>.���=�,_E�2�#D#��lz���ۊQ�Qݍ�^��a��H�R�W0=���R�}!��d�!!F7�C@����{��{t#��sa����	L��ϓ��tEB���H�.1��F���?E�υ�I<}_}����y��y��an��"Me;�ru���*F�N��҂�dj����� [5X!~�h0x�%���N������vb�c�?ga?��s�-���-a�k����$���ϔ�gq_�}�
���{M�f�Uc��7����5��^9�ڰS�_��X/g�bu�J��xO>����ƙ��}�$�<��<	g'R��1&��O�Q����B�hkR��k5(N
��#��VҦ v������mY�o���ȴ��A�mǓ�
���=3Em7f� �y�|��y8�T���A�cB�==,B=�=f�5d��'��{θ��N@�D���%O���s_��╭���"�T@Ө�u�K� ��Je$R�a��g(G~�r89�����ɃۉAB���J�O���.���Ol
�ω�ʿ��?�_��׉/N�)�zO�O6��/�3�>���jR&��qv g�1�I*��ߥ��Ͻ�Ń���C
�����hb���ሸ�=�q��D��������F����䘱4[�)5��O��>���6RAR䟋�&�N�CĬ�.;�yX#;U�~��r���#��K~w5��q��w�%��4u��c�z;�dZb�/��-�����trk�F�d�l/���Y���D>RG>�] "�0G�d	D̆;�?��ן�tz�ŧ��D�U)a��:9]#���*ً=��wo40��j�2��#�Σm~{�&@N_ܷ=�w&OI�a�\vL��0�޷92����������ێ,|�����ҹ�li�)��X����?�������7kP��#7#�	�M��^<L����`TC�F�o�2ԣ��7&�
DF�7j�%�Ot@DO(6��ϩy��΄�%�C�[���Yp��{F��Ԍ1�7��\�o�+^����9���{
vHb�����әEq�d]��LFsLv��7f�x_��N8EQ��`R/U��@y4E����)hL�`�>g���q��Ņ�K�i���wu�G���Ї�+2ًO��#�y̤��y��P�]_��b3��rՀkI�^UE[W���%Ŏ�Q%O�0��Kp]��d�U�ͽ��O���PKE��T*pip/_internal/operations/build/__init__.pyPKE��T����%/pip/_internal/operations/build/build_tracker.py�W[o9~ϯ��B;Aa�>�"u�@��XԖ��93Nb:���& ��~Ǟk2���d�s��5r[j�X��;W��D��
���k��k��ͫ����[���>�3<K�=�ᴽWCp!37c��;mf���I�x1c�7�7c��&���e�J�f@�lu.
�R=4"��}�Ԉ/��xQ4�W�F|��[��s�$�8�-�\��=�_�+��Ʉ��7�$k�Y���oE�N'��?�I�u��$+V�9w"�1�o�:~�<�p�vά3S������U��~>ax70Fi�@�4�$]��[�(�#/*,�f#z�r���6�,J�T�u@	F��^~�ԓX��� t�û��u�tF��߃��wϴ҆>3��S`fR�m"�������w/�Z$��O�kK-v�({/���h�bF��� ����̽E��Ȩ�wu�n�E�F�鶉
@�b��^
CZ߇c�葫#6;�吋��8��Šcn�@�H��Ne"ꞅL��v_�D�<�y=�7]V��S�n��‰^��]��FJ�h=, *�8�x�1}���"��y���MJ�I�M�}&�;�n�C1�,s�&��KGH��Z/�������R��w�E�b4�&%w���c9?h5GΝ�5��@bhxI.��:���t��ș��yk��sǞY@�eLZ�>��' �jG���j���@z
z
{��-]��V����C��"Ik�����I�#iq</()�h�1.o��L`h�S]�La
�{��9:?���~AS�`�UF�����n�¬�AS��vV/hJ/^s+.}w����ڣ��^������T�BpU�qH��>�J�Ӏ��_��C'���w�,:���/���'�L�R��ʥ+��xTS��#F�m�.��U�,��E� ��Z���¬��3��y����|d3q=��Wy�q=BΜ>(��]�ս�#�7��a����� )O��=z�)6�/�hиL��Q�:�2��Ѩ�3,�{��95�v!v�b�1?�lXM��RxrO;c<�ړ�xA{����k#�E%h_k�P�~ Båyg�ц�[�.��;7|�Z��C�7SS�q��	���7��p�vou��U�Dp:��Ѻ�'��P}��t)>����(	!k���
[���J\��qx`Q٠�4e%��v�4X#�Ň�7�`V2�s�V�a��+��e;CN��Xlf,zB��
��r�E�!C�|��hTo�
�K�@龳r�Q�h ��A�aK~F�XOt|x������<Q���~�\�B8�����_�P�CmPM�V>�
@�4�J��t�B��G@�=ԇ>��fP��u*��>5]<��`��w���ùl�6����^�/d�O�N��ݜv?WF�PKE��T���1_|*pip/_internal/operations/build/metadata.py�TMo�0��W�a6��a ;l�>��wC��X�-	��4�~����v�蓏�{�����A*$l� ɠ���nuK��D��>�^O��7�(
!��,�^�
��vM�C�,5�w�=I�<߮��wk>�a@:��& 94�I�E���>Ń[��d͈&<g����lU
�����RZ��#ۡ��D���`N��)��R�jQ=�|�OH�7�۷{��;�6#��-�pt��4���&삥�B�fV-��:��������X���5(Fa�`=E7�b� Y�#	�3��6[�v�4ڏ�|Ǖ�
����
��"��0z<����ԜY3�K�|߆�E.��4�ڨe1Z���̏���]sR�v��YV�;����������^g\��8�/�4�^^mTk�ȴ	>�|�n93w�Nғj-_��ѾGj�,�scY�6@/w�̞�w\ɚSNd:�^�A�C)��C��=����ܡ�	 �#��J]��*�>�T�W�=s�;UQ�03W���:��.�<UO��pyG�L��أ:3�(+�U�.Ps���� =`\\�CR{|�(��l���Y�
R['�\K�ʟ��T_ͽ��"�"�J�PKE��TF,�t�3pip/_internal/operations/build/metadata_editable.py}TMo�0��W�a6�z�a ;l�>��wC��X�-	��4�~�����ے����,�~��{;Th��ZA�w������h[!���î�X�e��h�A;ƶV`���=*�me�|��:XnZ�����S뇯��ўGJ��*�W�({Q�ڧ�/a�F��j@���Md��r�R�S�X����[t��Zm�x ��c��;�=����!zW�)e����� }W;#��@�|�/�xL-�M w�MZl��GƘ�mrk��G��O�j�.t*������A(�ad,+��s�XEHr��BJ��jG�mǕt�#�RK��`s�����я������H%V)]|���&��^�?H%�٠Ix�g%�z�PQ�z���;;b����)*�}7Ɲi����h��w��{�m=�p��Z�;��Y��h�}r���zJt��w�גf
4jZ����=e�g@-���ڣ�F;'�K���N:�ţ�H3[�S���tj>���l"�`{��an�4�dM���Z�_��S��L=1ȧW�Z$���\O�}��꓋	�i���tc�vAw��㒑���wGn�!�Y��l}z���9����Bwhl��^K��\.j/�?PKE��T2�.2�1pip/_internal/operations/build/metadata_legacy.py�UM��0��WXF+%R7�k�p@�	ny�x�5�ؑ��3vl'���\�L��͛1��8.���;�t/[�iC�y{$VϦ"�uFf�d�RZr��q>���O��Eg�H&9�L*F�>�r�O�^y��S�FP�RP;��NR!<����E����`��� ��S��a�|c�6�3�0݂�����L�
��]Q]*�
�����i=X������O�{�4㦷���R�1��p��qbB���_K���X�y`H��X���[ɘ�#0VE!�#��JdĥHI��Q�����<nЙpEj����"��_��ד�Y_�"�o]�a�}��T F�u+"ѣ%�/��J�K��{ҡ��nͺ����¹&ʎ~��+�N�x ��'��*��e.S����ӵ�C��6@�R�<�/�����
9[ePe&07qwW��R�޻��oϿ��=l��_ ��ݟ
�2"A�l:2_)�!��������H�=9�,6��P���LKq�$\d��եn=�܂�,�ӡW�4J;�
)>*,���bM�Y�S��^F�p���W��Զ8)é���i6�n'���ȕ��}��j��_�y5��mN綼��j(�u���>�Žl�
+�櫙�
�_R�%��]B�SX������4�-�j�ɾI?9�ٍ�rl�ow|I?���疕���V�[}�'#�p7�����,�Q�����D��=b`[l����Ś�(����I��>w�N,�m��-���㜋e1=t��Q�,����&�\z�,NX����.��������PKE��T�<F�''pip/_internal/operations/build/wheel.py}RM��0��W�@!�YC�0�=lwK�;��(�:�k+������d3�-YOzz�����2=SŴ�u�@g�p�>:R�H�ʧS��_hZ�C���{~��9�aB���/���He}��GR:�03؏Ơ'EG"�d�_��X"�n'�G��}�F(D�k����t+NGD-
ϚA<)j��&�{yx��lW���$[IR��ぬ?/���k/v7f��G׏m����.1k��@1��c�
���tD�=� 2(��
g9���M'�d!���0RX7j}�H�����
��}���'�2�j���Xʐ�e�9?�)�-�Ǿ��1�225
�ބjS�i،,s���π�9:��(��)�v�ß4��P�sT�9V�d�T3��_��4�Ţ�B�.W���Y�%ՈL'�b���K�Y���ޮ]װ��<�+
������>I��-�r-Q�?��*Eكי^lx�(�l��K#�PKE��T����A}0pip/_internal/operations/build/wheel_editable.py}SMo�0��W�"UJ�łEZ�(E �zE(r�I�ֱ��tY!�;�H��&�gf<of޼�A+�@���#<�ʒ֨�Q{/L�[�L��\��	e�ը߾yG�i�����z�ƭ� ;��o��	���K��C��qa�+mT�vA2��h�w}i}S�|�uHH�
\�c������R�˲ �4�B5rє�Q��p�*�9»=XgvѬX��gۯ�N�k�ce�
�N��I��A7�]���s?���>�ɲ�C��D�"���k�pJc 
\�pws���S�0�BID�G7iA3׃Sނ���8�LG�֣���3�}����O����^�܂T.��)���#���`5vy��㒅�ᄠ��9Y2�f���|yN����+�V�V�r}�$=��ԩAْ\,_�ȼ�����<]���ټPTR(�'������Dv��5�Wk�:�8������W��`���v��5�a�I��*��h1�4E�m��h&��)�y���mS�ݎl���'�Y�)7���\�7��}b\`�FZ�,�84�\�e��V���>(.����PKE��TGL� �.pip/_internal/operations/build/wheel_legacy.py�VM��6��W�*
H�Vh��C��^
Т��B���̆"�Z�X��w�!���nP�>Xg8�y��t��Ԅ�a�|H�{��}Hz)F�O��7=R��i�T�%�e�SYS�A�Z�2Z*��A�e����~�֞YS�Jz��L���n�=6_��fQ�n�%⼟�hA���
c��\�^ȱ�u+Ʊᝋ�@@�jA�@?ڵ��y3B]�I�t�_f����'����=)-���(f=�zG�R$9�{o~�K��6��L(w�!���5=�v�Z�FmY���M�j��OA�<ט�k���B{…����ֈ�*�F\��]pp��f�}�C��<��,'���>����4+ ww/ �iA�A���l1n�_�ԑ�C�b���}�-{��2��2��5�z�J���v�'�P3�����	n���dxw�#
�TwTz-�����"r�������l~�\���Ť$d#O�����
yZy�#�ӈ�P�T�H9Uc���|T�]f_�u��Q
蝥�;��}J��䙴��HO��4�t
���Q�wW����,.��Bxfɑ�F�l��F��p_)2����".~o���؋C�	�d�.C��P���ڃ�\�=�J�s�aU��-�#d�T�T*��g�}"O??/�q�'��(�8����W�.f�…�&�
��Uĵ�ܑ߲�T�����u;5�i�`ͣp���(+u���~��''M���k�'jn�[?3�X�K�	��#U�J�B�K:���X$�[Sx#i�m�.�(V����YEo��#M���W�ٙ=k̿�����f� �R�If.�S���!�e��`9i��%{;��C�~���n��I���O��-�(���.��ķ@ܟ���*�N���,���y鍽Ǯڄpm��W�;l���-L���B��7����q肔B�y��Q��,}h��A�FZ`�K�|�nZ�Y��'A�3ߒV+���ŭ�w�rW�$
7�=�rxcV��r|�V\
�-��PKE��T��{53,pip/_internal/operations/install/__init__.pySRRr�/R��O)�I-V(J�I,IMQ(�W��+.I����KW(HL�NLO-��RRR�PKE��T+Ӷ
J3pip/_internal/operations/install/editable_legacy.py}Tю�0|�WXH�����C�>TʵR�XU>/`x]�����68@�;�<;��̘,�N��z� ����T���N���`
��TP�nԅ����_
�e��F�h�m+UK�u���t)��u9���P����A�@f���`R90�Z�G�꒺�ૺH�j�5�N��X!5J%<�y�N��,�8��ئ��2㦵LϋfiN��d+LHxF0�Jz-�S��)>cGB��&y��9B��P�r�2���:�'����3ߔ���6���ՑM��F���y�٫2�3���eԌ�i�
.-�T�ض^�.�L^n�4�_A0����	i�vh�e�>}��QA�>��fu(����!�k�>��h�F��F�_�'[��:�c��Q��~�����`!U����T���ޠ
��fy��;:Cx��ek��N�
��˕v���f�ζ֨�Vɦ�0���O+�R���E�ڭf�"Ût�fs��uD,������J�]1ɛߡ5W«l�*ӓ��֮�Aߛ���ߞ~$�PKE��T��A�d	*pip/_internal/operations/install/legacy.py�W{��6�ߟB8��ħ��BJ/P
$���Gk���ْ#ɷ��|��$?�G��p�+�C3��<��hXy#\h�ږ.�,A�p
�|�`���3�g�qE��2��M�E3-��j%;bn=�q�
�&#o{���y_%D���=-�0��J�o���$��ݸ�\Iс0GB�T�S�'�?�*#�ۑ��vPp�������4L
�
J�C:YA��./��2���}0�;�ˉ�F{����`)[]�k�d;�E@cU0��g�
�1ؓ5��rs)4F�.:���'t�5{R��p���E!�H>A�6`޸��(�(�(�*��Uq��P5oA���9�,U�D?�w�r��p�Q�)�D�i�]H��E�T��NIY�����_R��1Y�z=��=陹8VLjߞ�~x�#\;D*"��j�(�쬝|��xC̠0�2�#��+`b�eN����x��L��̚�)$��0ܳH,kz33St_[<$1���㢖���/�A���YQ�9+`���l�%Y��߾�M��U.*�	
�\��C� �Zn6:p���̅
s�R�V��?�c{-4a
�zz��"�R�F�0Jk�-W��²+Q��SWD����~2�6glLm�!�"Ny������I&�MPg=/�h�g��8�z�dbR���d���l��4];J5��h�R���#ڐ��@���b%��xȝ����^�E6�hg�шR�8%L�:�[�*T�#b�lyJ^�=����d�֖c�[ԮP5�<��<�ǟ�e�!��O��AC����͉����2�Rv=^B��[�ilf�M���sQ�\K�3T�����m��]w-=+�h9�ҡ�'o��*n?�$���S_��+���h���g%Xb������,�eS�]:���䤁��1q��HΉ�pT�\�_��]|�y
�|�ܳo�o�{��]���;wMmG�8�מ��7_~�a��ߞ�ʆ|��3驥5o�	�fO��Ͽ�Lc��o��^�gf�}�������]��6��xsv�r���>8΢��SvUBq��Z�?L���j�e��<a���S��n?y�
�C�����k��4�rU�m��4� �y�5��S��v��+��D�:�!�����yw�~�{�p�Y<�Or?�dl�����~9z%#;�V�;:� ��,~A^<��+ΣhÅ=ڡ����zh�[0�Y�Pۀ��������#��]׫P��.D�l8��p(eeq����蕹X��d��Z��Q�y�VG��o�Y؟��;d��녗�<`t%�ovΜ�3�2Kl�#<��
���֩$��o�q�ɘ��Q�͈%N�#?��PKE��T=�zM� �j)pip/_internal/operations/install/wheel.py�=ks�F��+&��L(�v��7ʞc+Y�Ə��Mv�C (�q9���5/���ګcU,��������L�(:��u�tjU5*/�.+���TY�T�m^,�G��*�Yk]Dj��Y�Su���.5v�d]rE�A�!P��(�˫�u�6u^h�~���>i��W��+��K���ڤκ���h�]o�܎��,7YS��`�T5�Z��Fm���V:�?�B��j����dy�lt��D��S��-�N7]U�y�Xgy9U���7��h�TI�D5��v5T��
>�ϧ��/N��9y���g��G县|CT7-�y��ד|���t�����y
H�f�˾�>o��3}s�����ٖ��L���h�Kz�ok�U	��"C���oy
D�T�G^?���\Uܪ��$���j�% O�E�ם���|�]�f��p��T����.�f7�Ţl�~�wYY��"+��tZf�#���6@�D�Yh���wʋ&Ç'MS5c݊j���M�Kդ����u�����eˬ�B��D�	̿����2�R����\�!�E�7]&����-���%���0�>9}y�<}������'����==��b�WMq�v��+g �OOҿ���l
,�Wc}�?����tϖ�d�n�m�tE��躀g��l�v�X]w�F/Ӷ[V�n�t��o O3U�]�:k�����-Q�kz�mDp���+�Bަ7y��˔i[5��[�خ���#�]�.�*� $@��.�-�ыm�4��4�&��w�lelI
�0�V�`��^��gFC��M�U��x�Eֶ$u�y1�4�f��T�f������%�z?"�j��Nރt�ǠK�K���yeF��+�f�:nu���ïճ��nL�Ԁ��n�Q�f�H`!|O��Vx�NJ�R�a�#�*���:���g{Y�@c҃�%5��N����ׯD��(Y���T�A+\��nf��v��+��͊�S;���]���-U�;����7U�./����qCm[��Iju�=���x��4BZ�0��xB��kBMyh1��H}6�3�u�
��$Yjz�V,�G��A�S��q�0���^�2���́4��+ع/������[�v�m���X���v��U]�ꦪuS��)U����Ok^�%�8�9l
�JH۷��f�b��R߀��"���4���nu�e�N���ߤ��9��<P�=�I��;�Իn]�
��:�>G]uď����قN]�D��i͢	ѿ�~��G���'�l��P��K��\�m
[�^R{X=�YI�Z٘�:$Đ�"0Q3�&�M�$�b\�
�Х��wI��%>�'�L��:�8A��kq�xrD�p�S�E+˾=��۵�ӊ�)>-��4��Q�q|�w�3$�kum�FY����hx�x3��w��p��[|&��q�`Y�X����TU��D
�h�ؘ3c��Q�fH2P���=|�@P�ae�
�Ӊ:����Lv`uʭ���
�Oչ5��n��߲�kh+� ��x�޾cg��.$RB�9���ݞz/�ؓ-�F�Ur�Tۚf�;
ű��‡�����]g�֓�b���zCzo>b8�mߩMX(�O��H2�RX�iU�/��%�g3�) �^S�'q�^O4�~�K曕;ex�5���=�L�'�����yK<�׺�ʺh+�0}S�=��x�@�77y��|���#39oY�Á(��Mf�����~��N���ƫU���&���=ߡ)8�$\,�r��1���Y�(�h;��U�mP�m�P>bӳ�SRџ�=��{:��pýN��2��M�~�jY�w���[�g"Fq�S�F��e�<l�#�"���\��ڀ���Z�
4���1́Ԃ��Λ�d��Jk�"�bj{��)���*���6�Z���3����,�.0�9_�eW�� �Z)�B��k�4"tX�
\��m*��`��$Y
[�2��/!��	 �O0ߎ��H_@h�~j��>��ƛ64�;HZ�%�2u~�^;�ۖ�FÈ
�Ǜ�2�e��d�ԛ��L���eB?��I�!�<�w�+���q؝6��@�R��42Щ!l�mF	����{��0���k ��Bz�N�l4��f��a;�LE��ѐ�5������,�<
�sX8QO���o���'_����O���f<�x�C��x�ᖮ6H(5z�5_��	*�)�j���
$������qNp��m
�[����nSp�:<,�C|rȄ;4��AL���X�f@�`�B
o����PV>ʾnGh��-�EC&Yc���L��{���./��AAG�Ě��ߣN�#
yH�pD7u��
{R D ��g��Of
%TA,��@`�B��=4M���Ͽ�<�D� �0o�I38j�M
K	��
�{�/r�'��Խ��o9bL+�[���T�,���!_K�6�~*e�;��1E�M��e
�WSݴL&�1��^l��lHҖa $��`{f��x��hf|^4[�ߐ���Z����M�#%��k���K\��¥�ɮ���Y��&,]���$@�^je�3X�v���I��9L�-�%�L[W���̈�sV
�A�^��P���!���_<��X� nE;I�t�0҆�`��'D�}�-�֜R+D�(p�/F1��*�B�+PO�Q�7u���3���h��AS���b�����5�������U�PԀy�\s��.4Gy��ZTgF6�,��=����Y��4BoM����26�7����AbUXѪ��MV�o�M��U�� )Ѹ�)��#�T�/P
�0�M@-�=��
2�,�� 3
9��P@�J7���"Y���Qc���L�H�$�T(7���3����
ͷr	���4[w]�Ύ�.A�m�	�����Q��Gy�nu{�/~�k1����H�D�9.H+���MPVQ۳V.*H:tU�j�[ģ��m��Œ���
�!�(%m'��>JvTF��Q�8��P�y�~��%�L͊4���{�1�z�>f����s]T��e��B[�*�K�ia��5;��	���qt6Q?�3�L��[��&��M7����N[�i*�(�i�؎a<
#Ř]�E�}�c�	�(�g[�P��biߋnM�ג�1=���e�}��69�����%�a����7��8����l�c�����3Y�X�DȮ����4f
��F�B�O�>R�?D�YR���Z}���I��2�db����
�?
loF�����w�\�[h7J
�ܞR��:�'uU�=��(a����`�a�Ɣ�Ј��t��6�ͦip��_�Xp�z�(4/.��A�σA�PL�A9ķ��r���vy�ULj�\y��}�\Mއ�{��z�u�A_0j֔SEƧ�B�UZ�M�Z/�X�zr�L��+����b4$@mP6�+\l|^Q���”���h�xm�^:�p�{O��l;�2����V�ʱ�6C��e{0�f�#,�|��îF�!�d
��p��80�OF[��A�H�莀B'�,��)�آY7�/�``�X+�D�x6Aݚ]K��ۤ�E�hD���8�����p�;
��x�'��w
~M����fK�&P ��.�|�e�����$0S*�v�IUbQHۼ��+�
�L}j�O
�����q�l#X�7�_&HsK�]~̐�ӄ�gN�%hQ1-Ҝ�$���2����]�n����`�7$�ƢGĞ��{0���5�N�;4�_YAV������G����� ���}��T�$U�޿��ɡpѶ�PVD�<��<��ԇ���Lx����K�$��F/2=y�
e���
R�r�Y�y�m3Юמ�d���"+�&꬚�{	���/��ٖX���so0d��K-Q�Q���f�XY��
į��	�/IP�t���Q9D�Y����0���Q3�Q��R�V��)�t����*/@۪�@�D���Y���EU]�2���O���zy���E�����gg?��$�q�u��$U�l�S5U!��6�`ؘ��0��`��褭4Q��������8d���}a-jf�;�p(���ӏ(Q�*���C��^Q~�t�^�K�P}�R�ݎ!�0\��<9��ѫ�Ͻ)�%	@@TH��J��8;3E3a�ޘc�fBG�3�M��ހтyu��?L>2���%�[�1�p`�B�ϼ�{�A�w8>Y[��H}0
�L`���ˮMd�YW��c���-�h�=E��p#��jO@��Z�4�)��)H$��$��
�4���%c��X���L�A�⟖�O�O�ɟ'�����%qlo��Qta�^\q_�ȟߤ/�#���'�9����8���/a1�+�1|z8�v��s��`H�`�ʔ >�i��Ţe!��Xo�[�M��w�`�	1�9�hM�}~I��t�M)��V�%9l`&:	 ��#��A/���'G�E�rޥ�����m�VXe;��a� �Lq>N��;���u�$ln���{�$5@�5l!Qx�5~n� ��g]	�+�Ñ�_J����;^��<;1��m��
LE���1<��z�cCF�MإE��f�����wq����_����'�F���~�Ł7��?\�lWC���m�3ĸ�͔��~.	E�	̓f[.lM)��U�S�̧�ES�R�>kPlq�KQ�嶝��6��a2�=��%�Il�P4���%�=�f�cS��}S1F��z��l�#��r����ύ�mS��s_o�
�7@�
���hP*̣CM|Ee�v�����1���Q�7�g��We��W�Z�r���`LWzV���h�S����j
*���!/��i��S���I��A ��}�
�p��$���f�Bqa�Z�k�ׄ��L��җ�hW�Ȯ�6�+��ga'��12
I�@�S�C.���'��RϮ��sC�������
��n��M�O��;Խ#��v�ܯ��>{v��:�6죂�&�`zu��(�4o1xcNԝmW�)��쥳Wd�Rz=|�5&ʒᾍ�贼Ί|i��-2��C��Fe��!-��ʦѿnac����fc�I7.�O���„7���F?dK���C�؇�_����v4v� ��e�*��fy�%UG����1�2����ž�K��R�P�Ƨ��a�5Bp�|`Z�zO�$��k�b�}���GDp�s�JP�����$tzF"���Z�g�B�d���2ch�=�B�ƅ$3�'�6�g�J���>Ř�s39���Ꝝ�c_xȪ� X�%�S�6�̝\��"t{D��r*6��[�	攙QC��u�E��?����2�a�Z������{t"�J�E��sMg�t6t�s|�UWR�����Y��P`�)��k&�W�l[v|�,��F��
����"s.��lG�%1j����
���8�Fy�/�$_�����_R݋�ڥ"�G��ӂm%V��s�nm}�DHb
6�B��O�������
�z>�6U���߼X<�f>$3m�e�Y]����C]�~Uq�͐��:c+hS�����;�Y.�|��L(e��e5d��MaŦ�z�;j�Ҍl�aW��q]/�*�	�k��@�
�S��&�,/IH,�
 �Ma�s�E��K�+Es'�px�o�=_n����6�(�ч���CL�JMȾ���8�2�|��,�^a)�f��b?^�Oi�b"���3�|��c�)��~�D^��xY�Ao�:���B&��`��n��2�%�`�N^h�
��{5]�f�3t��M�]�r�G���B�ÖiY��Ό��`�p���	�����#��C����bT�뚉��v����yG.v�N?��C
M�vc�I�1�vE0a�0�Ά�D�*�0��3B��Kh��e4ZO�u%+6v�6d�>lPc��P;1��A՘�i�Mg�Ŵ?�F��`Bfb��n���_N�w���%��x`�~�
���1�WJ�+B=�ݐ�s�͉�1�9���<�ԏg��ƺ������m�:,me�O�s�+|A�˻��P&��?�	X��`Ij���§v;��P���|�׫��a����p�)'�D�J�5Y�9��݌�JVI^WBdC-E�L��\������
���Wbr�>�
���dc2�{�R?����ړ����$Κb,�O���W��Ct�*]w���j2��0nJ�hk�b�;S
��k&��}�r�c'Vim�Sb�>Xd�g�Dj,���w�仿H�6 �*{U�ǡp�~�
���j�
1��?c��6kl��SA���X��Z���uh|�bѹ�"�P�#�0��w'X�Y�\�.�7.z<U�I����D��ް2��M��~G-�glkr|f���oŴƬ����BSڔ�~k:x<`�Ap���6<9���T��?G���g	ͭ�3��{�N 䏳��&;�]�/<��W&TǍ�m�r2D�}W�e}Xӑiz��U�W���k:|�����[���$�;���Q�w���Y'S�hp�[LQ�����p6��0��5%�r�@X]�T<�x�c	��:y1���=I����cip�]Q��~p�O4�G>]5��H��I���ax���3=���W�PHJ㟋��Π��L�@s����}P��},�����N/K�N�R�б��ݼ4��s'�s@��=XF{��Cwt��#O�G�nLC1u�"b�2��t�)����1�r��M
�����X�r�[7�[�@��w�����B�.7�Uo���
���׾.��O��r�ǵu3���&h��[,u.���<p����)�֢l��9eĥGlp?��P�`�2$b-%��9��躩��k���o��>��G�Ի�ìmKW�TeX"�:4“7�ȍq*t����7��r_m�"�8�sb3l�=�]}6}2�L�����믽w�f^(�\��;|kŏ�4Ͽ�!ȝr�.��E,j򮣓�A�֜c2�&\>��N1d/+ǿC�z,� ��������a?U�rD��K2Y�C�����j�}�4�\
��^6W"��l{Ӕեm�;DC��^Ĉɴq�1?�vA�9�ޭɉ|��i������m�;�>DDH&`���")gL���w_��p��a����{��wX�x���7�}�����#��c�7�6$uO<��c�J�/$efo�Er�łX���9qW��h�'�i�!���y��&Y�|NX���D���J?:1RJ5���LN�\Ya+��o[�-H�ͫ�n=h�p���|���U��r�3O���?y����Q����������M����N��>�[�yI�S?�1�:0����|�0���^��+����v�T�ͻ����+��c��ٚȽ��>D2�	Kw��X�6���4��{!�G6Ɔ�3�)���fęw/_>V���q��%ނ���I���*�zx�]��`sP�%�^���C�_��FjSX����D�n���Xc���m=����S��w�5J=C��W?n
s4����k�XE�X?�����(�6����.a�]pL9�-�#7�nL��:��S�ڛIK]
Gt����ߟ����b{!�ܣU`����9����K�����޿'�u���.3��?�j�o�d��C���I(O=B���j_�,$U)�^�i���؋��g/�1�g���<��W'g�'O���W^i�'��胄ɂ�zt����D�ܢ�wb!{�������X݂L/�}�~�Bwv�F�h��9�F@��
c�!��_zMKdyl�y�D�����{)���(
?�;V���<a�Zh���BнZ#0_?�4�[=���!�¥���Y�wd�S��?���\iD5 7Us���P�{���_x�Ëhe5Վ��rV��lџ���F����2�F�ą�|��`M�	y��K��n�:���{o�#���הf���xPYi<o�=�M1��t.mu�K�����ݿ���W�o鮬_1g���{�M�NP��qޗj��C�(�Ck��� v�w�n����i�I�H�饃6����#�~�Y?�6���?H�c2k���:�m�K�؛ 3���,����FXu<�p�ձ��}6��;���F���PKE��T���ڕ�
pip/_internal/req/__init__.py�VѪ�8}�W�.|�/v)em�.A(�8Q�H�$�6����dɖ�}K֐�֜9s4���_�-i��Z����$���9뵺{��;���U�"ﹱ�08W&*�	�� [���q�M�jʥ��z�\�:�GN.;���j�5|�=�(��\��&ri,"b��^?.�k�F\�6�(E/JIC3�W��մ������h	
��@:�����4F	��`���Rɮ@i�eY+�1q_̥�#�Q؃g�'��-���WĹ���$���	�.��ú[��ht �Ȱ8j����ϷB
G���_�e��=�	�1��L�M������6��*�b��{��⪝�>V~��q��+�ba��C�{����
wɥN�z8�C8A�R���o?���At	>�,l+�e�a#��ᘆ`?ub�9�c�J��ز��\��
=��kzbZR�j>��m}=�I)1�G��hj���0�[u���?�t�Im�#��)�@��n/~�Hb/@|j�@�z���*r�N��zA��nΥSOR(ֹuّQ���/��=�3�rתy�4�Ȭ?�4t��/�z�R��8�'�K!N��Wż���>�G�Q끼��fv�H^Q\K��+�MQ�2�����qZ{���\T�~�s���X��_M�v�x��F�a�6���I��"'�"�a����~VTn~���	����cѬ�Έ����Vɞ�k�Y�Ϣ�0�
��
�l����uNuD��x6'�]�zX�cܴh�׾�͌�}훧��L�}��i���W�Y�� )�f~���K��77�6�׮��l��C*K�ض%��	�ԥ���h�"�0!�^��	�8w
��8�vE�QQ��͸�ߨ�_��D��\�-�u_̸�
Ȯ�+2O����̮ٿPKE��T/�����@!pip/_internal/req/constructors.py�k����mk��SH�Ӥw9�49$��î��m�VQڍ��ޙ!)���u���Hn-q8�{�t��m^�X~�
qeÛ\�l+k��T
/���m^��\�;^�U,�0Z�i#k5����g�����b͞7�PQD�8;�w�5ݷ�-��i�*���)�`y�d��e�T[U�n`�L�Ldy���H
"�F���N��l/�
H��*��F4��Y[f���ˌo�"o�4�X-T��Z+��68l� x���ZˋB�{��}���Uy��zI���֖��x��,��X�;+�n[��R�o��mky`ͱ2�·���{��͂}U��x�`�x|ۂ(��^��T +N�D��:�@�W���6X���s�n���y�lk���s�T%�|�;$|c߸t�%���RA[u'���~^ײ��v1*�A�?؉o�o^�@��̬"m5����g@ADaa��S��C�?����5h�4�Fs�����69P�k����Jx���;A�y�U�L24�M!�,�亞�	�Nމ&�/�����̊7���	���p����W�Y��I�V�z����?�I��4��`q��
V(%w�z6C�������wa��� �$��J�%�u'��VU�f�LlY~5��CSs�֗^E�'ڴ��7z|Z��D���u���:�[?�›��ݬ��n��/��2"h�L�R����[vИ�C\/e��]-�*� �`Fc���`�3�E���ba��@��ucY��,}{������A�cVT�	#���f�AU�T�e�"`����� �(�=}��D8��G���0-�r��>fq1�8�,�����;�����ۯ�p^ҝv
��+
}����(�~QuW>�7M�|�M����������ꕔ^_o��׿V�\��L�9*X �/;\�`+D�ڲ@+�3(��P�����¶ɍ��`�aJF�Ye"�������E>�:XηA��fV�$:�f�
6z��9W�-��ƕ�[(5��/`4;B!JȈDz4C����1p�fG��ڪi��n�#�W� r��� G�`|`�A��	������
��1��{9\g1��0������8,�19T{4C;�����bpLM-!�p�.�����`�'�^�' �=��c�o@�n5e���R�5� ��&��3$e�`����� b��
�� TϺ���R._�@�k��h��>g�&Nz������-�&0od�]s��)/XU�w�WH�������U��K�Dr
vӏQ��f
��6��Qv�����!�L4����&5�?<�!`�J�ێb�`���Q�u��X~�ƋH���s�齎�� M��ɵGH�(w��E�0������Ӊ���I���Ћ1k���(���./�cr���B���v�(�2TX���.��[���
�[@�޵P��~("О��-ٶ�ݮ�$���2g���t���:7�:�s��w��0!5,;�B\*!|�U�6��[�Tj�R�"���
?/t�A����y��M�d�D!�2�����c�%�5�����_|�h+�<aHܣF��6�&�.����E	/^]��`+��B�����^*$�xh�CR�w�W�e-+fQ��;AH��!#�����
G�i�U`�װ,�D\/�ֶP��8+ZHҊ�;'ܨ�#�ː�*k��@;2R����	����4+on�QfD��םԞf�$D� �����ڛ����ME�����v�����C|M��	�0�7E�7r,�B��>W���^��5cx��h�GȨ1d�>�&{��BңQ!�
�+�1�x7fb��,�F�1��Ɲc�xD�D���S�3�F�Ƅ�ĩM}��z�Ow@�S�<[o�T�ƙش�0x�y��J���H��/�e[ȄgC_�
�'�޵� �a\��AsƱ�X��LJ`l�&�ݛ��d��Y͟�s�-�W0=�є�DI!sXy��捗]8�\����o��i^Q�7I�3K�b�p��	D]I��[����8@� :����F�b+n[����6�;H}���す4�����$��]-4Qx�:'*�i~;	�ƝHH�k�'��U�N��)��t��?�i��,�zV��6Z�4V�~"���Z��g���<΃)sH�:S_�r�̂�,ň��V^A��L mZH��c��Pc�}����d$t���"x����wO�]�^��k��JT���w�����+Y�Ē���P�tcř��{���<�l�9�h�ȩ<)���*Q�yt�δ������.�<{�� ;�mi(�}g5���W�1��V׿���{�ZyO�{3D��֭ӟ���j���mW�bR�T+�U��#�(٪��[�Z�/ΐ�
�c+�{�a0��|����e�R���]�nW�
?�����ӨpD ���1��G�o�����0exﶁ��z!�J���YX�׫h~��H��1;.w, ,��+�.��Pr���u>碄j�a���:�\>xx�f;�Ig{]p����6i�)���<��K�>�b�h�>8Ӡz����+��18]��r��t^l
 �_�G^4�&��Ó�ƙ|���=�v:eat���5&];8�K_����A5�hO�V:���!������B�`��w�3yT�dذ�!y>R��g�|����3^a���?�5�����{C!�����77]+�0�*��_�ЖBB_pX���b)T-Ȗ�6�0B� �m˔�����\ܬ��͉,�)�>/
PV�Y{��{���G�S��M7Q�F���5i���&��O'd^3w|�9rt�m��m��
𧻓_-�Uc�����8�}�L[�T(�룃GJH�tQC��I��<K���)`��}���F�K�F���_�]3ס<f_G1��Vqu���%�2;�b$h�ŨF2u��\z�m�i�ܲ�	Ӣ�'LTl���>���AGY!����'+�a׿)�{���;z�h>�z Pl�霰�ſ��j���8xp5��XlЍ�s6C�<�Or����Ɔf�����_լ�Ʋu�i�.�!A����Az(��2�N}�:C$�<u.<]�i�ƕ�8}
*?�+|l�y���a:/�E�S�&P���ӹA�z�z���;ۿs}2�;����t`�aP���ɶ��9_1����@v��<ʁL�����-W;���?�n��W��
�)��{�\��T��3O�<�[���W`�s���).0-X`
��hj�9��O�8�l�ǡ\z�TL��(?5�L��
wX7�M�^�[x�':M�k�OJ��7��
����b�
��Q�=a�oji�։ѱ��HI�|e@�=O�����]Y�̓9�uNp�&v�gn�&��z#��G�1Q^j�N���~�4�(����1���%ғ�'{sS����t����H#O7s�^M^�q]
�c��ܸ����s#w{�d��T���A$��YHe׃��1
zJ�> i*Co����MA`�𦃇�G��ՔO���e�9�x�ѝ�'g<[�8�"_����U]2u��o����>�7o�����jx?�"��Kx��<�E?��`����P����'Z�� �F��f���F������ȩ �ݔ�b/��Ǜ��z��S�y��탅�� ~�Zì�ꉘ^@qd��E�OS�jK�zS�G1~�t8tr��0����Q�q���Ks�[�;���r�h�$�ՐԻ4��_]��r7��c4)Z8�v=uHk�r���	'l�`Q=�'��b��ݰ}S�LBΞg<�&/9u��|�$�6�NP��埗Py1�M�w�.��T�?G�OvU�o1�T�_�:���tQ�B���AM��4*i߆X8E)�/�� $�2�ϥ�J#H���gB�u���cԖA����(�3Х}�Um]I�2d�.�-]�E��R'K��֫k�Ӓ�+�Y�1kd}
��x^�ā��㌑�Nl��3�jn'k=�'�����B��vI^&~:�����>��נ�x]f�6��;yI��%~�KT��LY��M=�����Pk�C�	����!u�p�u����K��ҧ�}i�u����f�"0V���qC��L�U8H��>��@��PO
�K��7��`4E"䝽P֯�Q0��K�
L�'
%�����Jb�)S
^�0��]�uا#���������~�_t�~�/<��>�m�4������|�l�V����C=q�~d�ɀ�+|JQ.���<���]�b��Q5�3Ur�)��}�G6Wq3�~�`���w^��%�E�פ'���"N�>����Z��������YS�̳�r�	�ב�Sr��}$�ө8�8����t\;��rr
�<�r���DFM��ӡ���z�
g�=N��PKE��T�p�^Dpip/_internal/req/req_file.py�<is�ȕ�+���2�� ۓ�̉&��vmKk)�I$ɦ� h@2��wt7���,O��fG�|G��=�G���۬�Y4J��\�*�UV\���:�6UY7���,�2�j�M�s����u�g���rc��Ǐi�J�mͶ�MK4���(y�ǣ�{���)}z^l�Nj4��y.��e�h����uڔ5�7�f��Δ�vR5YY�9���v��x/UV�IV�P�/��lk�Y�4P�:�ɭ��q��'~<�kؔp��
p}���Д�r)s+�֋u�ee�wF���Shd!������J��f�iV���M�[ �4S2Y�u�4mt�bQ.*�mS&K	�[�A�&v�k�$���C�z+�fD�=�|'�����.��B.�&�m��[=|*�|+`��\R����]S�M
#�|�/�(7j��Y�wY�e��5�f���VD�r%N�ͺ��h|��G]��X�p67�5 _kK#���>�FI,�$�P\��$��C�`d��Y!t3<Al}kN�j�+�]��j�g����N���>�8�p��(ywj#�`���-Z7M�3�G��Rc2O���d���͛���Q��~�T_O��_}5��'� va۲���@��mZg��}�lA��f�������/ɏ��?���Q���#&T��0�&�t�b�qG�Ɉڪ��"�����b�]g ��G�R<J�<Q����V�I,��H�2��;E�NOΎ�M�eZ/�R��������Y�O?�&~2���>~�8Zf(����q�!�����.�������.��������	���O��'�Ώ^&'���'o�f$�.,)�8�Z9����B�!N�s ��i�E~h�4��^��8h@��P`85hsyv�" ���N�$ϊ����<+�z;hAZ�j�j����V��d�*�����nȚd]��4�pXy��$N|�,�[Q�Q�*�/.�������ڤ��>��u^���͈�{:'K��G(T�x��8yytv���QMb9!�\�	�uF��"HV-��ΜH�	�&I�T�G�|5�o6g�Ӯ%S�a����e�5���*Ay�ӱv�F�̚h��k���,d7�Y&�l�tF���N�w�:� tOI��ws��nΛ߭�zu/~'ñ��94�y�;9PC/�GlTQ�2*��=r��E9C�����ת���O��>G�]�0[���!�E��.�j5^�Ԏ�W����g��n��Js��O��>2�-�ƭ���mf�gO��˲xN�q4�6m�d`��}	��'	�������+%cj4B�d̩�Ԗ�̱���/��({��Cyc��ڼ�}^6�o�ٺKQ;�Y�W����H=e�N#�Cb��|9�ڂ�O��*f����Ӎ�%xNS4�k��b,�#-2i�E�](��a�s�{�h��%�a�l�M�_��D���eq�`�
�r3�
P��hs�EHa���IbV�vGO�1��i;}�:Ҹ��SN��R�<��.���ٍ���D����	��-sI�Dީr�l�C�L
��_;�ĕ�κ`�eӓ�0kv=��eU���*�c-��p�*{�*pq�y��C���<!8��kvNS�8l���z�k�9�_�#�u�>YY�`��?��kIJ�p�4"������Io�$ܯ��]�%`'������P6��61��p��U�Y�Es������̱�X2yƥ��x�Vr�H�ÀF20��N�g?�?~�?~L�1L�I�����1r,�pU<�h�Ǿ
c���g�$�]»F7�"5�*��͢��k'��R��=gM�5/x�!�Ӻ6�j��	#C^�!=w�ؑ}�m@_p8C	�����y؇�����G�~?C���=��l"_����"d߭���E7�[BUr��2�ؼ�@r�-oڔ�{ct+1n
Iة�,Qh�h�LF�@����-]��H�*��R�I�|�ԙ�E���t���1��!v�q�,��J����8�ʟ��1���w�:�d5����O(�?z����y�1��A���ԡ��=���I�=t���{��Z�֔��;{��1ت0�tp��P2.�4�=Mmu��˞8�G�f!*���:�X��P�"�,�S�{a�O�hp�Vt�Wx8���+���Gpvo։Q�J6���l�	�܎�o���c���}�P`"�N���S��'��Y.��W�IL,�NtZ�k8�iU�F�M�<`q��9�����V#����L���)+�[�\;T�g�t���5R��τ��E�w�R7A-1vKk����N�E�ݚ�׎ʫe�.O�b\3�7*�yO�
�Zf2�M��J�-'���!�p��#�ʔw�O���}�L�i�r2TY�`�w��Ao�e#͆ѓBr����(���i.7'�
�����b�0]���r�n�2��a?�oA��v?����zoi�u48 `���IL��w�r�^@�*�t����y���
�-&��u3���>A��.��O�t�L܅"�g�i�OO��ݱg��_���}��j��@y��<�(��[N.��T�#�8�V�΃�f����Ca\�埵��@�`4��󘈠:Yġ
P�;CT/^CT^��nA�k��`��p=;v�w�pS`�yh"Ό+@�0NX����B>Q������0�v�)�MpEd�ˠCK˲C�0x{d!�SÞ�No1�)�j�aﺖ��z5��ɶԑ��ZLL�p��'�3+�g�t���b���D�(�2�$s����+�|��>P�v�����l��{��[Gp͖m`�5�4o�e{� ��� $3��D�r�)N�A�OLL��=�ZB%n��0� P�7;u��E'IX�b��'�X�v�F��
�G�YCN��Q�| �ٳ��p��y�����[cFܔ�ܟ�K��:X:��؝���5��-��A¥�T?�B�r�d��I�\�MX�"Sa���Tl"�p��N&C�	*���r���w0F�^i!Ɔh�q\�sY|2vBǖ�б�B��������wa�����C�� ~o��Mg���/���;����7�x��a��a����|�ڔ�
 ���k��sΐ�4/o1�4Uu�.M[��g�`cJ�EJר��D2%���s��5�X�H~aǞ����!SjN�Zo#@����j�B�O@�y����]nK���!f�p�ɐ; ��C����r^�
���d�@&S�	�/.��O�y�l⇱m�m��tzi�@�9f1��u��������$�.b�Q2�zا"imC�r��ʟE�D�.{\S�bW� �7(�g���=.n�<��]�O��GC��L�fG0�Ǔn���}F(�a�L�q:h�{���_=\'p��ML��T���g���]�|X6�FĿ��U!�LY�Lk�9 �S�"],Z0���T��[^�ڞ���cM5Nvi;n�M��I c�D���p�b�{��a7bӏL{9�K��B���w���
_�Z�7	��}��H��t�iqC"�����ș<"�Qg"S�����i�Ȯ9j���5�6��=m�ƀyy҈�+���X`ؒ����"t�&8a�=��ֿN�,�T&�8a�Mq�e����Y�ޭ3`H�����JG1��7ĿMy#)�Ifcy,Ɠ�!h���<�b�ߩ�����&/]L�b��PX����a�
��3#Q�~�:†��|�t���e=�
4H�p`&�n=\�
E{tdn�L +T���7��_Æޡ�A�:hW~�3�9�,2EZ�p�7�
��*�O�2��8$�Z�3�Ư�X%�ឯÁ�0�$�.��M;�D�źf�#��]sME���~k�EwiKm1�D�%
�5���՜ѻ:��4]½��]!�
��W+u�'�芗�cs�f��J;�k���oOΏfb���L�|�x4�.�E�Tld�.�z?t�evpp
���c��AEW~p��L)PO��won�D&��
d#Ǽ���������vW��V��L�IxY治���mV������P~�����ҮI��]ܙ�A�7���3r�Ӧk��o�����m��<�VŻ�<�^�.����䃍T�h�xyɒ���o���A�!�cgxeIa�ۢ�H�ߥ[�g�&�4u��r1����-�b3jZ�Z��b����NP`�{-���5M�����s�G�{��&�n���y�F�P��Q1�X1j�Y�J\�vR�q�E8�:?yy2�ab��L�t��g>�"ew��C�
�=C|�<^,u���ٺ)"3�N�f��v��<j����+|2�.�b�|�8��8z'��П�+�&����T��oA.�f�x_*tI`�{��97�RU"ׁ}������@�Ɇ��/N�G��L4w���tmӓ����l���(��l	k�V�"m�d�s�1kR�Ocq�����X|��Sp� �� �o\uXU_����\$M�W�?)�E�}��޳�U��)Xd���o��Z�>���ʪs�ݾ{���HQ��:�������657Dyq��(�@+‚U;Wq	��.�*.�� 8����ٳgO���ٳX�SX5:K���eTT��_c��X�K$�'�K���tj��3�u/uB7��sw���r��!mi�w�Gf�A�
F�>��Yя���c9[�+c��`V�qd/�����A6�_ԟ;�a��M�����?�{�U4
�
~��ly�U
]�0�<h}��#�������a�ɞ�վ�k�3���)����t2�=s:�Ox0�+��!�-�_p!�� _��a���?��*9��+�Ns[fF�������5֚�:{�L�s�5�c}
��z1F��N��
�c'T��r�Ȯ���g"0H��GLL�W#?4���6l$��T�07Aްc��DD���9X����:�x��o-Dx�-]F���D\Ϻ0�Eߑ�K�j��J�\�F����3}{qڮ���PK�mW�s/b"� pip/_internal/req/req_install.py�=i��F��Wpi,!jN��d��0�����kǓ��K����m��}�Qw��`����bի�ջ_�A��N$�v�o��f����A4c2��i_%�"�š�URBa{I���n�N�ԋ��Ar8vNjd�z=���X�M�ϟ��A��Շ��G�ݬǶ��`�n�Ы����n�u�����_�nS��٦o�x�p���w�q�<�Y�5�d�<�a�����˽X%/�~�(ǹJ^�N�YÓ7
�1Ю��J4U�g]��P�h�C������<ՠ�5�#,�n�ʔ�j:tb]oj��ת�8�P7Z�M���r_�"��<�S-��7X���Zte?���Kq5@t_>�Svݗ]g��%��m?<.a{{3�D;�]N��*Ds�Z}�O���o\�U�C�c��@��kA��G�F��§}��0b[�����ǀ��u�ڊ��;q�V?���ʱT�g	|�/���t9�R)B�Ħ��#N\O�<����[��N���lyjT�%D
��58��8��p���J쇌�QL�^�}B%o�S��u�A��cU[�^^F�`�����P>	J!�zD�S~%�=a���P������FY=֌��i�OY�����>�G�#YjC�
��FH�c̍�]�p+�,��
]Z������ �®w1`@��_15j�U�Z�tW7&z�U�L�)�ƪHT'��S���&��o��M��Z�����qo�r�	��_��|�C=���<n�M�X���Th��h����-�i�����#U�]]	���%̪�M�����fGj�C����q죇�
�%`�Zz9���#X\���2�8��r%��"MM�	~?Q�x��cxZ|����JI�ro15�0��a��1Wk=�zv�•�\IY��T�(H(�����z_��%c���څ4M��+D�������PQL�E`��-
]�hW^�C���
F��v8ԽH�6وq�#y�{qU�|i�LIـ�ZN����pF����&j<"�^Wv�LO��Nl�V����?��oV������[kQޙ: )��0ӪJ��[௫$
�4}g�Wg�"����de�O�9�;��C�X��(j�ci4�9� ��U{��C�{X͍Le��g�È������� ���@Y��ش
��H�G��x�x����s+@D@
�FKg�b��n_�/&���f���X�er�-��B7��+z:,�i�,i�
�C��,���V5�+��`=r<�((6�
O���Z*��~�����k�w+������Y�(R�����m���3��P��_���
�����y�'p��CS���d~Q�p����2 ��v���%ė���šk'�%7R�vӞ��po/�4k?_�t,�g0���kG��[��{n�OQFJK8	84S�Ut��9~��^"M�⫺Գ/�蹫��4���)y�h�4�ٸ8dp����ZaYV��~�� ���q�5����B���&��$������MA�Wx���w��O_&_~�u�����Z3'Uh!�,=����k`�@ae��&a���n�F�.A?U��>$�
ߖ<[*j7���z���u��zݠ X�%?�H	��zD�J�S���3�bH�xhZQ��_�_@�<�Q��+�.��؁G�{)��=>��r��:����G�%I�J��pOĥ�@Lп�X�B�z�IN��Hr�a]{h��͉&7Fr^�K��o�?e�[����	;�X�#�V4�Ը0T%�O���!��{�����}��6��b�qCT�#�
'�X�08��zqy�0�7�h� �y�3�6���L��C��u��jtѲI�Z�lk� �'�
���iP_�4U'�Xk(P�(a4d�Ч�T��F9��;�Pd=@��y��O�T�i������*~O���Έ�vORK�H(Bs�P�/B�O޾s!��.�
�WcK��	 ������I�,��%�݅����8�	s,�TTz3\���X+>B��AJ�Gb@Y�N	(i�l�=�xp����>q��H>�Z�ڮk�8+�ȶ�jh�ͺƺ�v$#��ȑ�a���3ä^��%���M�"�f6�����&w�`�$Y<��**�]���X�δMӀ�
��)J�?�[y�K:� æ��TK0��#�v���&�K| Y���%��K�8��3�
��a��6�����f�3��1J�%Ys�e��G.�d/cM�-O�v�߇����R	�%Y�Q^�tCu�nZ�mA
.�2}-�&+�B��&
���L-|
m�ln��7Ʀ���4 KR#��퓒�؍�y�	P=�r�IX|c4o�W微�@oZ=�e8�/� e��&h���A,�D�[����1b�Kj!QL��i�Ž+.,��3�~�>�=j�69�)�jH��ٗ[�;�ވ�X\�����$IZz���\d�_<�Cr�a��^��@��I<Ġ�6-즎6�67�͢X`#2e�O#�)q9�LQv��z�t��RvD�K>˓4��|s�f��,b���Q�2���<�˥w;%#���R�m��-q*�޵YS!ݚ�mj_���r�:�����[V&�*�Ֆ�vD-��`y ��Ჹ����M7���)��ۤ��ߘ��K�!���I���q[6H����Z�쎶��7���~�7+ԡ��l�E�)��J��ʵ���K3<\T�r��1M���5�G��	E$z+�rK��"�D.��O9�""���~��s:�f"}Sݒa�4��7��.zY�����-~}NJ)~E����#���knn���۹��������t���?ںY�o�,�H�eq�ȥ���,����el��3S�We8���0�霨(aU����ru]I��l�Q��B��d�~b��b�CfI?�˜x@�=�;`Ⱦ�L\�r�*�5�A%Ι<��Eg�j�D�att����\�H��}������Q.#��FJWJ�R %h5�ԁ�R.3Hw����-�O����JG'��rJ���A�!2�@%��v�R@
5n�s�k�\�j7��b��Ҷ� zG���@DC��D��yFv���aPz6ϥ�/�e_�a0v~+�Jf�03a[�9�iz�@-t�e���#V�?��+j/e����M����ϭ!��W�F����Bk�VQq��2H�m�o��J��v
� ��ˑ�je�s[#�������2�7��*�`,3c\b��݄G؆���/nR�=��Q�z�Qh3�:�j�HHo�9�����G��C�^7�۶��HaW����1'�G�[�����dM�Fo�Y�s`�.0"/3;��c=7r	p2��f�4ܝD��Q�A��u��������<�1WFc�/���(��$���̎�Y��¬�5���P�[��~C"��B烌�
U+�U��Y.N�t�� >��@����`�?�ØtGO��s$jT(�ʈc�j�1�ԅB��:�A��,��e�S�Q-I��M6XS�Yr��dGȮ��?�Aè1�ׄ��ԭ�;��6S��T�@�a��˾J����FeA�.�C��+��miF@	�Dcօ��ڰ�`Ni�}ˏ2$�0�<˲���9���ٟ��9�9�䙳Mz���r2yh!�;Zڎ�d��ƛ�CנMB����Y��%Y֠�A��P�еIV^%o�-3��m*�(���,,�����^X�g$���n�5�vU��c"#ڵ�ڳ<!%����r�*�y�X�+��4���4�,4��l��#e���˯Dq;�4b̰e��
y
Z�H���Pٕ*�j���y��y9�V4�FHC��+߉��ט������~<tHZJ(>�fR��P��d
t�C��@��	�B�f:t�%r�	�����(�I05
;��^S�����n�d(��N�;�٫��^|��'+�I�A�m@2�r��Kp�iK��Iex��I�5��}�ƭ�O8�Q`�R�2��:��[P<(�TM�L���
G	�X)������գ��e4��Я�ܒٓ��s�v�o
vP�����&o�<B|n'�ڪiACŽ>��y�(9?1�
-�!��j�����D(t��9��0�o����n%��x7��mq��C����2ۉ����9{�{z�<��DA
����Ͱ�%̢ ��%Y�(�+���Sig�3n�dPF/4$��s�n���3��
�E]

}`�;����b��Q��J?X��\Zs{�$�b���z��?Su(��:R<!z�zp�Z�z5"9C�Q�Q��h�kD]$����ZhD|�(���\q�
�`)ǵ	)Ek���r�J�?�����'��+C�(�e9���a�
Kc0��@�A���e'��L1A��y>��bdۉ>7�7jWt�uU��}Z��fyBT���U�L��]!�I>[8�}�ʤ���r�ܼ3�v��s�0�������Zk.z��J�A�i����*Z����s�k�sJ�ѷ�qP���m�C=(3M��]T�zI�g(�?C�zδQ�i��9��b�S��#�-�[8�+�0Qp�a��!pd	+�Q�R�Β-�Z2UQ�dm�%!�<$��� ˗FF �kN�������\_�q��t�g����o�@l���P�)�dl�Rϋ��[��-�w��V�P��6$�;h�稚Z��qj���<���Dqb�O)�������hv�U�����T��ö^4bOZo�v}
�v�
MӲ�p %rbtY<-��	5k��аk�A�I�Z��l�9�?4�g*c��|�#�<��U��*A[�?�p,�8Tg׼�@	�E��.R��=��ڦ�0�2�PhM(.w&�k�$�ǾI.�� ���'HhY��lҟ1
��x�T(���x]����X9=
������
�3��;���fq�$@�{����6���i���T���Z5�xp:y�ހ���Vt�V�`L�
��K۩���N�����7)Ś:k����J퉺�}��a�N�/l�TT>gύp��ύp6��tL��yE�����&�K���8;�7���{m1ѧ莞i5f.�Ihe�j��F7X�:�
��d�n�VI�2�R�z���a���z��m'��YA��i���y�I����h"�wL��"9�'��P��en�$:�,������A�_��G%#�($ HOF#cN501��ba�lF�8S�J�Cgf���eO���dE[�U���a�MP��t��W��g��W+,�qX��Z�Y1.LzHB:Bݐ�ژ���g�q�C7�h4���PWY"�A�K�
�z
����*<{��oV�h��*�*2�@�	�Q�ſn�0:�S��W�	��j�+�{Q���SW-F��V$��l̕9����eS�G^�'��d\��7kcq^5I5�'�_>�ډP��m�פ�`�`G��ˆ����B�_}���Ay�EQ�X�h">��E�V���ǭ m��kN��-��kBYLֹ�S�)�j�rOк���I_J���=�yHc�U�\D)ؤ��j&�HB�!n��,y]��Qc|�`+d&���P�7�Wц'�`�1j1Z&�6~,�Nd�D������̏4�ga�k�N�Ƨ�[���TH��b�7��jF��$G�"mg��S����<����,��(��s��s����!e� {��&�po-S۾!�����ǗFm��L�Y�LP/�T�q#BP��d#_�Xe
#!��ܽXqÂ���8۸�Z.`Y�x����V�M�������L2��&'��
�x��9l&�H�a}Z�O�b��n�~��N���G����P5�z���PzD�^UCR��NG��Y���-�Q�G�΍�u�,=����ZD�o�}b�f��k|�s0mTy��>��.c��,ER_e�^,5^Ftb���n����x&@D�DcV��{3`��b�E�++�l����A�nb\ĺ\��P�ȯB�w�5q�m��ʖ���̰p�F�O�٤0Ї#���q�d�	w�4R�:w�����^)Oi�P���>��v���:����C�umۯ�CA��,,�zZN'%�k6%�8�|3&��n�vs$KQ��򞓉�]'_a��e��4�fpm`���kl��yo�3wq
��h"
�y����b�w����wmZ�<E�s�9���"�t�_�"y����n{�<����~d�����
֝�D�ęq�nyv�c$�ЯuG�W:����
����g?�u�q�P�\ ���h�MB�5����a5]r�`u��SWق�==�r��p<f-����ڡf>����v��l
�aj�f�mꞡp���6_ԯ;��������"N�0]�m�]����kP���z�̃�d'e��`��?;n�i��6�Tn���\}�"��~pn>heD�[��R;6��4;i-a�����T�WD���'�ך�(�4:�P5�ts̨�����DCWM�ٹ�{�������*���B6s��x�?79�mw�Wb���{x�mM~;傢!��G�ec0߾\Թ��Mz�,)�o�sY\��z$<{���"J�zٷ��o|�
��ڪ�t���7�����������W����AB�����N#�Đ	�O!���ڹ�2�,;�
�ט�%#(+,�|3d�!�.�FȄ!��+z�l��0�(	�,:��yq��J���F�x�g��C���@��d�Q����g�*�Qby0�4�-�g�dŮ8\��q���wS��C���n�P!-�۟h��K,6N�s$"EX᷸�e:���T����S���l��m���YK@�{Q6�/u� uX�*a��ik�6�`�8 �Gd�|�
���\6�ė�>�'�_�[2�#�"�삑`n�/�������-f6s�%t�(�x7W�����VI��4�j�6�{�G����
��7{1�>�`�ş��3�G$"��誊h�vyEi����=m	���}�Y!CIt�J.DN�v���enU���2��+�%b�-�*�:*�W�>AC}s{~s����8Ld�J��Ő�Jh�{u=�^b�
�wr��������r�et�UʒE�܂��Z\/�N�|I��rI��C�ry�w��o�qђi�\���_�.OI�t9�� �K����`gC��e�t��'2�Cs��y�`���+�1��Ș*1�dE�y�W��H�?���C>G=j�1����"�Ñ󋖲`�Vf!�Z�2��(�����G�9C��ş�TI4��݄"�|�S��u�&Pw���;O��
�����g/��驗�C����W��>&nh���ywJ�U��wDT�+O7/սܝ��k�VD^�j���	���E�RfA ���x�0�-��J͖�@������d��Yt��4[U��<j.�O�����m��/�^�3�,�2�x�1�_��[���󏏞>I��&y�ꂟ���˹�7��Ƌ���2�wGm&݂�66�?d����o�DZ5��
��,�B��Y�9z	�^�ݬF�yq��7���>�{�C�~n�E���;M��e��3�����ӵȻ8����
ӹU�}�����l15��^ub�D�beH�ޜ��
qǑ;r���[�k��n�}�ʼ�9�	B��
��U�V�Hp-��O�F��]�3o�
	����9v�H�W��Ǐ�i��?�N�8���؃��?�a��Rp�2����X��/C)��#���y>d_�Q/����<H~��ɏlK��π�n�&�ݜ:s���+!�G�t�����W�׽s�'�޼g�!�y�s��y`��<���7�̈́���S"��p�'|���
����ܹ5'B[���R�o�˜�Ymdn�FG��\��������
�:J�ѵ�;6�n�7o���)�M%_b4�1HZ�)�V�	�{�eLSk!��
��pL�'+�k�����^�e'�8~���"E����?�Z�������W˫��FD��4�'J�%[��'�(�n#5����q���	�7.��-E�&�39�sR��k(^����W��g�^SqOƞ"����3~N�;��O	�E� H��؀��.��Z�P�'	�b��]�ѷ!��G�$b�/��C�g���z?�=A�D!�/�4�gʕ��93I���͡!��?|��g�o~
O%��gl�7�|��!�tj��h�Wz8�4���:�j���K���5߫��
t�?�me��akO^���P]��t��Aҟ�����j�F��a��(/�;Dl�[��!��ƪ�qw���3�ډ�
�b<v�ŋ��Q�/�`>H8������\Gf]��ƛ���EC���`�U�M���0f�.הf�X�a��-_�?r���,�M#�C�5�D�X`r 7�=��c3{d��p�t��?�^����\�t%��d%�{�ܥh47Z$?R�m,�bؙġ�0Nؐ��Ũ\�A�iFY�7��³dJQ�6kj�vM�7·�����'_�״1P���کo#��K��<s�}l���L��@I@,m���P!�r5
T�{3z ZtA���p`�{y�x�y`��>]�tg�PKE��T���E*pip/_internal/req/req_set.py�Vێ�0}�WyJD����b%�ZYn2mͺv��]��;3I�:i�r���&��9g.�����v�Qf����Ai��2(k<����U�z���ڄCM��1?��'�C�ת.�=�ʺ������>(݇,��F�R��(��a�L@g�.��?z�Ժs���~�{�p��3t�����g�h�'IRj�=D�_1����5ʤ��G��A���N�}�Y�[D�簲VS�on�9�x
���6_i��u(�%*�(��8��(0+���&(�RƨY>4��|�F0��%���t9�dy�D��h�t{�#I��A���|edk���9W���z�>�A����Eiw�wM>����B�ݪ�l7?�5�W���i���wRH��V��8e�v�c�1�<��a�O�\�?����\H����Qa�'���^�ci�&<��3�������X�AԢ���,�B4�(���m�/4�l��Ј�,��U�L.��*11��p\J�Q�|J&61CZ_��sS���XȺ���E�#����ޠv�;�I�;��Ʈ�嵷���n�|O��OPc�9�VC���1���=;��A���4���j�{�#�.��$��ڎ�\W������N�Js>��F�+4#i�����9�u��v)�A�-�-6�?sO��2���No;��yڰ�^W�q�/�<MA�˻�"��Z�}��	:�:��d9�a`:��?+V؍
V�I�o7�n�kg�앇+�Pkm�+��\�F���V�#}wxeJlˁ���F`�>��
/"9.�r�'���9o����q?��϶�i��q���ʯ5��Ї�M~PKE��Th�|v�]"pip/_internal/req/req_uninstall.py�<ks�6��+��JY�HtU�;_�.��dw��I�s)���DHfL�AY��_?�&�q��["�F��o4P�ڦ��f_�����I��M���ޔۓM��?��U���J��|}#3l��f߭%7�mYoM����B|�WU���B�(�B�]ֲ��[�W=|�Wߖ
^��eS��B�$�����'�-�4+k��S�n-��2C�R���q(|���n�cլ��V�٪���������+9
`'������\��|W��x��M��f�����/~x��ts��fUYߚ�w@n��f2�@�f���&�-<�@��.d���t�]�֦k�n���1a}���U���Y�N�N*���;)�a�r�fE�Y)~�׀���E�I���&�yrR����`�e8b��ONN
��Zwe��S5;�u���,�Bx���v_�����\,����%5���%��:'�I�|�ɼ���� NUu���RA�f���J*��ƅX��=ȕj��a������.��N��v��N��k��;�V|_�s��i,ep������Ⲥ�5e=�T0��RV��G��
,��N�4~:���I�M�G�<�.��u���O�����ߒ�M��AO�R�i����}/�6���D�i�zz�Ԕ��W�On�h}i�kz��V�65�qѨ<ϻ�:g����큾F��w�VR�,@5b�+Xg%��ܾF>*A�@�a�<3w0�`;\ihK`�f�4/�6�^�໓� z��_j���{ʙT��!����SŐ��JH\��pA�Qp$���
�_�����/����i���r�\�x�g�X�,̥雊o�(�7ˣ}�@4�=�Z�u�_l�Jia�[�C[�#�kL���>�E=�wV�d�$�	���j�q����4�����
�����CR��Q�\�L6�܉�l�a�W���W�~��5�V�w��:?;k�m�v���i�m�T+נ��=��6]m�	Y,��Tg�����gM6����޵�eI��5����ҕ0{

8��
����E�_j!�0�.�tb�S[�|��8�e5q�P��
��$eZ�_�'I�΢f�&�O�(��&6	e��-"z�pqq���v��t�ǻ��B���<?����'��f/v�dI
T�("���p
����E2�
���r	��岓�I�,y%�N=��6D�
-��|"�^ǹ�W�8�ʱ�c�
biꀓ̌���3k�nA�9�`k�q��m����s�����:ʺP(��m[�����aT[����dC��6���������|,p�uBA����iHl��M^��T�-����yd�C�<>EdLp��\+�]Y�ஊz�[�1e�}��Z*��"z��!�
�
��Y~���P�Sw�o�����z�2��BT2�-^��Ϩ��0"r��$�vEe��f�,����H$@�����B���E%k�yھ*2u[�Xy}�
V2��z�=�vh��Y�<��+�V[\�@���w��|~�����|p�+M�M�6��ћK(^o2�N,���w��Cd�J�Q�`E��ą��0�I�[qA`-A	��"�1
mRF
�}w9j�u�/�����p#���'�\`j%�ͪ�2dk��{���G{	��6
��d3������0���v~.Z�+\
��	��Sc4`���	��-a8�>�P��O�d�=�˫=�Ǵ�G�
�1޷^6❑�y�S�G���@Ff���S�]�~��Թπ(:h�e���aN��N%���x��c(n�f����8�d�B^�!��5:�V�*#�uBO�6j���k��s�N�n�p�0��W�<�p2�t����`��\0q
x�3�A�jà6a���У?H��H_�|����(�:��h�m��Y �Z���;�/�ÀzA�^�:�,���^4)����X:�"j��iQn6�C}�iZ�!M-�f$��s�!G�dZ	O�l+{���l�a4�r@Ǵ)D[��0��*��.
O.,w�����*}�x*�v�)!0�1h���ɺSNO�Yd0G��V��>�IA�\�J������ȍS�I�?P�.6�gߴ�
To剳�ߌGJ�-N��rW�Sp�`�cUn�rsd��w�T��?*����t6�A�L3���
�"�T�l��0�J�pZ�U��\E\e��Y]���)<�L�v�I�(EX�c���<��xx�x�3�c��j��nYL�g��v%)�LK�c
C��\(N� h�Ď��VI�9�D���‘�(?m����+L!�q�}�;�dzR)0�g���'!3���|ڡ��J+qZ�?��\�5�<��ø�ŕL*�Mb��զ6
Ⱦ(;@R�w}��1#Ǔ[��'���mI�s/Glm�8��X$�4�W�R���m�a���Z����4x��A<d0߸Dl4�0�Ə�R*�;#���A��$���bV����3�F��!���m��%_�ą7!�(�$H�<Ft/꿜[J��](�9�!0_̅�Ӻʁ3�su#�8�fM�W���uѴ���m$T��x7����
���K�P`�b=JTke�Q�!枞��r&6��ߦB�
8\�}��p�ā R���Ȏ�o��@�L�y��9�];����Y���5:�_@xs�os�Ϝ��|�v�rp0� p@��c��# ����� �����GN�ó3�hy�������Z�89��^F����)����\h�Ҕ��y�ZLaM��uӖd���������1�\�1�t�z�����`�D��*~��2\�Tⶬ��IJ��׉X�rV��m�6nf���/R�KK�Ϭ�����+t�Y��#gL�]	�hA������x�^2wl�4�P��?L��$��n ��"�o^����=Gv�R�ܾ �D0��.,�p�A��!\
:��P��S�Z�#�#��Q��y���1��=���,8_bV!�,{�[�Ɯ��_��6F�	��"�Of�Zi��j:��7��z����(Zr dV�[H�'����@���Mzܕ�!1J�Y�PD��"@�m|ӈ���e�5M�M7}ށ�P��O �Y���:g~3r�O�B��D�RHw�M��b�PE�y�ף@<��E���z��D�K;�Y#�EqI�|�G2!l�X�@��iG�����Yt�3��R'�E�л������Qo���� s��9r~�م1φ{������n�	^��XTcF�:�t��Z$t�v�<�ᚔ��h�N� �ڕ��W�;;�`�7�I�ai'�#N��іA�dZ
�Jwj6��u%�z��b�O��.Y��f��N�k�j��o��/�ʑy��R ��T[7Av%�Iq}Q��,���c}���=�T��[O��Y���v�aԾ�a��og�k�V���Hy�����QhhYe(�Vl>�z_�
�d��^0.
{�D��
�TT���$I%m�&��e�:��Ҁ~
H:D$\������w�f�"�	�#���щp^gC�Ƃ���>�y�3�1��S��\٬��K��Lb���=(�����\/0Q��*��&�k��
���m֢;�PG���%�G�(w����QP�
&��R�b��]�1'\M_�p�Z���%��+�cu�9�'T����e<cwf!��� 6�;�ʏe�Q5?�bM�#��`�el�B�ރ�Lxq;�wSJ�$w����
u ;ϸn��N���t"����m̓�3?�c;ࠠ[Ʊ����-�u��UOB2Db�MToȘv�j�����bI�Os�e��N��D{����ũd&�_(��Qs��>�}+�
nP��j,v�w�)r�v��bO?\�����!�i������lew�yPEn2�>��0��π�.�"�)6ma��7o�.�i4����m��QS�ڼ�4�PW����&�ݢꡧp���.R.����o2*��v\
���Y�;٭���qG�5{�\K�f�����K
�0l�f�oH/p}�]�Q����)���ͤG7X,�;���N?R�)���wfg�W8i��X᰼.h4S
�v�Bv]��y��~����[?8�����	��y����
Zw" v���[�*�9�-�w�!ƛi^q�!�ᑍ[{�w��o����:(��e`�'|U�M��������2�Th�y��<�H9�����%0��"�p�O�5ֶ�1�Ű��C��3���']0��;��%*�N�j1�mOD�UB 焍����K��'�B���)Ft~b���H՞��Ȋ]�q�c��XZ܈a�$�#��v�bɉ�/	2�Ʋ��j3*fոv��7,��
P��Fσ|����B^����٦���XI��麀d�ßO6G�jf��y��%�v��b�4P@rJLaa/# �i<����cx��2�{�v���e�ru;K~d��_��	4K�	���d>�2��CY�׺	��&�����]���1Lv
�W��	�gR?����Oy�J)!�z�Ae�A�,>�Q��b�4A� ��,AJxd��|���]��D�&�L����<���p[��TSy��
<���
̾ƣz @f�3X�
S(�����),�  �f�J=��H�8ދ<��=z����m�*x�lspj$f�!�~�3��q�[��t�c�J聈4u	��YUg|ž�1R�ń�§��R���d����Ѣ��+���\��'�c�QG�j�T�"h���)�}(��/����g�S��!�'�/�r��b�-�޴x�b�j<|��c5Ĩ�C�]�@U13}��z�b��Aoֺ��E�5�6�'�/;t=����(���8��<�#�`�E��K����B?�b����n'�Zyz!'�&�j���թ=p0�Tr���B��W��N�f�T��3a���"Ùe�\0����W�ޠe�h:��N����xf^��ւk��.������^D�tJK��`�f�ntf!`�
�CՕB`OT��γ>'���*�����U��X�U4�UQ�ynE�sI��t�����J�ԧZ�W	ؾ��-xo8�k�t�&Ϧ9gx�x�ƊC�����|���Կ���g�W�Q�6�QL��@LD�#��JD}}�Ǭ�ͫ����9��ࣩ^�)�,�V�
@�F��5,�b}�\b�n%�za��_�P��g�%�5�8�A
��L~f�Y҃r��x�2��ӎn��v�]��3�fm�tLF9�d؈�@�;�X�����M'cG��n�q�6�s;J��yf��k3��VG�͒/ko��m���5�Ժ1բE�O}����w�t���aat���l�1���Xk������L��`������.VR�����Н)������8:����!��N�Ž�y(m�j~�7��=�Z3��H�Km�����[I�Ǡ�\cCm9;X�]C���C6]_敟~7�GI�H��������Ɂ�Sa��Np�\��h�]��� 
�l��oD��\�{.q���
sO0���+-eXe*S��.?I�X��=~�~�ŝ�^w��0��Ή��(�M�2��^~z5ݽ
�`��2��pi��+���cA���i�1Fs!��,���!O�PFOex�d�'/E1�Ӛ.B%
ab����/>1q�ueA賥Ɖ�����SF������J��t�2�?3��c�
��Ҁ�Ÿϩ�sdS���.�+��ܐ}C6�C�x�|>T�^�A�����\*�Fb���<������rC�]�	�$/!b�8�އ� �T�i����
��P#���n8���Z��I�pU?�j��/F��Q�~��.v����d��Cx��~��Efb)��C���)���8[����DE!��0�e�^��y�é�p�l��T��
}�م�b[���Yϕc9+��퉊���F��mpڟ7�i��t����:"�
B<��e�г8��(bj���s�m�e���DR���c����c�;�.�������f�{/F�Z_ߤ��ۮٷT�#_G}��݆le�χ��
LDkd��q���A2am2��&��ԈY�;
�Y
w�f#������T��\SŤ��˴
_�K��WC��Udz���e����Tt���
�$�2�F���D��o@4�������K�&_X��m6U��T���zM���Ni6��OWu��{�gy��h
�}l\�i2�Tn���_a���Aѕw�^����� ����=�/V�U����K3�;��������mYo���@��MӼ]�
/\�P("�8�	�\�Y��kS�F�Sq��ԯT�;vXU�E���vު���I*�	�ޯ��Z���t���D4>z�k>Μ7�hK48�䈭��H�F��� �Y9�1q�,>��9�/6����
��de�w�A��[�U&2-^�[Timp'��8ޥ�wtI�;1�)<�E>�g�[��f&g�����
	܁$����t3B��9�=н[%�a�3hO��F�ӷ��T��x���T�r/>K߅SC}��. ��z���OM��h� t�E��xt�E?�/3�5��WR�G�H����I�	�)��vky�>����
�u������A�b�Y��7�K�J,�ѐ��,&z��X��c������<	�I��)dAu���
��>�?�T�)gs�9�0���s��
3s�c�Da���9��
}�����1UHt�kA�սX��>�e�.�l�Vc�¹橱�N�	�O@�+T�dp�����PKE��T$pip/_internal/resolution/__init__.pyPKE��T�˩�G pip/_internal/resolution/base.py�PAj�0��{L��顥�@iKr4�(�:����&���lc��i�ifg�fj@?�k�@��h��{�	<;�^�:j�7��>V�k9b+�Sw" y��f�n�tv�
��YPG��՘����UȰ��f�d���6�3�<�e,7Ɣފ��ܢ�� ��f�5�,z�A_'�DZD���=�ڗ@y��s��aU|}d�|�������鴈���M|���3�bi&{Ա}�E/�c;3�C��u����2���PKE��T+pip/_internal/resolution/legacy/__init__.pyPK�mW�Nջ;�^+pip/_internal/resolution/legacy/resolver.py�<k��F��+:�F4n���
N{p�g\��s��0�1�H�M�X��zt���'�	؍�쮮�wUWs�\��'�V�-��T]3u�.�RT�U?�u+N�I�J�d���D�ľk��Q�.�L�馑�����u/��ी_���m��R��,E�3
����M����}�H�D�e��^�ݐ$�u�A�����˪w�t�\
���'F\������e����
Pw7ގ-���PKe6��׽�c[m�cݪ�X=ZW�+�,��eQ
A�׋�r�X\	$4Ӯn�a�G\Q�C76���f��"�vG)N]
�	{?c/3s<�ηB
=馣
�e�(�X��S�����a�:�žh��a��]%���@�1� ���iDy(��
��_��/j��+�VO6�Z��?j�6�'	�O
�GP@�����٩(?�P��z_�^]��<33��g�B@D�"YY�@H=����ͷ�$5t�	��d���������|~ժ�ZV�F��H^w�K�z�_�:|�]���o
���ΰנ:?ȡ���p�ܪ�x���y8t�Fj�X��S� �ԓ�������ӗ�05���7�)�t����U�QYS�̴����>"?<�w`8�D*;��T�2��7�&���< r���<p@1�AH�0�h�*��rP9Cr���CEP��$c{�P٥8Yl0`��o��@s4�;��|����s>�jvJ�5P��O�7���!�&?�gM�}���fF4��ef2�)���O9֪4�[�[����`DHG`𾛟$�68*?��-�h������==[�y[e��P����^8�f9��=�[�1o����h�3�a��7��v��[�e[�����x\}�!�[�H���7'��^���[DP�"��&�u_��l���l���O��A����RSA�0������[P��l��̀��@�F�� ����21�8�u�ͱn�˾��:�|�.7G�_̦;=�֊v0-K;�����!��6�5j�*��Nh��]Nb�l���S�D�[�X�18H@W\�'���΁��h+��ACI�΅����
��S���<���f����U�
�&JT R����Q���q���,q�=+��G
%HC�����M�P��՚�p\ ^֍4ޝ�2����L�}7��r����U�h�6M��4<�����U�����mˆ^�+vvGh�K�+����[ ���R��Y/0�@�<hĭx���/�nnp�A�*D�-�h�G���(#�[�̖�o �cqZ��uɡy�@��1��+����/@:��23f��:�}�ZЀg���O�c7O�4	YF������O_���E�d��� E1����l�.3L�auaW�NB��.ʦ���A+7(ZO�H?Q���`H
D���
`sL���N��w:��`�<pz	?��OrX�&��>��#�{��lֶ�����8�r��
|ZJ
 ��0���XV�d�n����|��̐((���<�4V��[�� -�a����}M�yN���׽�ԝz,>H\��^W�Q����
�O�6�K��n>>3d���dX�P��K������}_T�0�sp����F&B9�V�eww�ot
<5����#�j�M̵
�7BU�%�ka���D�ꯝ�	:ų��G�o�z7M����A�*�^xb��1��I0��;4I�7@��[-�KG�a��W�JD�mĐ`U_�py��?<!�0%�49͚�m��	q�~�UY���w���(���Q�jʛşM��:֪���6YI,FR�]G�@�K�6:��dNb�
�U`?���`=�S1X7�y�
T��9:W�F��-�'�#�]�!�39�F���K(�d�c�t �0{lq.�a�֒���)Ae�~�0�UDX����_1���2�����ؖ�v�yE� ,Ʉ[p��K�DN\B���Q�E-�RѰP�tp#b�X9�
�l�w�=�'@�bw��,���T���^��c�~l���FE�m�г�5���-6���w�,���ko�vU���:��*�(�c�9���a���ݨ(
��ڐ$��2E>�z��:H̀��S]-�CFP�
��A�|�"p�����O�i)�T7Z�I��V��M�N�1	�-�zY��P(,��Z��B%�͊�c�.�����VsI�]xa���$�?�6q�(7!2k_�$r�L~@�W,�"��i�����i7Q6����M�:�Ɋ*�
&�����|�y�p�ӚPY�(yF�g���m��NXy9�ub��$Gi���� SY�S��7�,41Ir�9��,�D���[ϫ�� ��pIC�.~�{]'�6�g_�/vf�����[�1?`��2;�ϨH��.`�
��Ʋ�����ǂ$��1 �h(ə(�
r9��";.QZ��Cáx|\�!�n����
Q���j�w�Jh��_w�d��e�G7���j�	F]���=*@���0���d�[������������2fA8J�^�uߵ��c����]��V���,�~���D0��t�(�Q�T�{�7|�$�\M)p�%G`��;b|����ʉa��gè�ʋ;	�ƬIW���2�I�α�����tڮ��֏�'�M�5�Uȟ�
��eV���g������5Fs�Kq���e_P�"4���T8B��Z�'���k/����ST��>��<B�L��Oչ�F$/� ����T�1�?!� �<ʫu���m��c;v�}��Ox�"
�MP5�Xʓ����0��Zqp�l���h����@g|��!a���Y�z�K:�%����gf���8�`�F��h�o���VB4�)��`�—�K�':%����^�L'(-����dV��c��-P�=]Ÿ.�(���3lcߩ��9ZSб�ӍX���܂�:A�?�01�����Δ�I��-��tt�Pϊ>�Iٹa;N�"�ll��ѺI`�s�%,"�s֛�g�t�}����&BS���#�X�,SX�DgyC�8T�6��6�x�k���[�I5�1ԁ��8��tZ�1�~I��B�.�D>���"�L�ۭ'����.��@6������l���[���9��<��-_D}o|�K�/+B�	��
�[<�Y_6xζ66��%l�����t�vDkz���*�h$8�� �y����������_4�l��5���s!�,���w+��M�z%�+5)���5:��p��m���8�Q^�!g	p�--�5�⢳+*?$M��k���
sNyC�N��g
lU��*p�>�r�Vb�yp�լe�As@�
�7i���ߟU�o)�ȕa
��q���X�S݊��%�L�Ʃ�%�Nk���u��^�'
� \�[��4T���Ȇ�f�}5��;}u��=���x������'aE:q1�*F� ���<�j�~�{� Lۊw�(��4�MPے/=��c�T%��?������S����й�NM�?tܘ1��7�T���x��#�k+Q@
]0%�>P��J�/���_��%m�!w2w��t�O��=���ϭ+ 3g���>i+}ٖ�E��%����Xt&�Ӌy�A�Aj�d�r����X,�N�O����W��,*A�
se���L�$V&.c��3H�5;�$���h�Vd��Nk��E��9�[�����J�0f�:�s2��3hO`B�^�ട��ɞ'G'��b&�!>{%p���G�u�sS�8!��i�mSXX��:�DnMs�dZT���5bGl�z��
��Cm�EI�0���F>`H���/�@���R�( �;#��e�#5WN��<�΅R�C0����i��r(3񼵡!�Gr'�	���]_��r�{��3	��);�h�U�;���l4���0FM���`��2XJ1�y]�p��F0�R��6y���a�x��O����í��~T
ӱR���Sq�.���to��c�)���G�>���LUo1`Q� �A��p���PF��l��+ѻ͸���)e����]���9�c��by�1��+�OXߠ�Z���Q&���z��-8���F��Ov��&�4Y�D���j
9�n�^y�۩���$ꎠ�-7 Й/a�=7T�v@x��G���S�^JW	H��;�p�鷽�`[v=@�z�y�H�ř�D�y N����f.����� 7�[tx�s�����ǰ;��^kH"s,O7V M�F�kd)T^w��	s3��F�P���|D�W\;I@��teR[B:W}DK~���G�Q�c!�r8�#%�Ng��^��?��'�����i~����B��"_�>����9a��!셼`I,V(98��F�i$v����`c�����7�.۾��ۿ��`�T��ϦK��x� *�l��I9]��Թh?�އ�ۖ�\?s����]��W����Jм�8o��<:�n���C��|�z�V�y��g�]K�O�rq]����>*u�!i6��8�>.�\a(�����z�!�
��!���oa�X]���`���C4�kO��<>�O�{���݊O��h����c'�z�����?gm�Fح/��-��7��]`�:j�!ٲ��x����V���6ATi���$�I�:k�ѣ(�Wɘu*6���AG���8��ITcm�l
���ŋ��dM �;���Ak�W��	�\fʱ}JR�:Í���Gc�٩�9n���D�
�t%vc��us�������|��KSߠӕʵM�+��j���.NF�w�b�����X+�[�*/�3�#����-ި��C`�}<�-օ�e#T^����� �S;�P]��(�lT>�H��~zk�H�I�^�	A��t
���9�*|v�h6�8K��3ķƈ����/�;�t���}x�
zR�C����.���j�˟}f�B\_9s�6RM
/��]_���Ӂ��7�,E'{���l�ܺ��^9&޵�0�y���*sc"���Q�B�=KƎ�NVHR$����:���v�+E_��ӛ��M6��9�S�y�hs�R�&�6��V�iN�ʑ��P��68�'���������]<WWQ����=�a�ZP_hcĝ�Ѕm�(�+X�;�"/9Y�C�ݻd��|�����)a��{�/u���6�
��2Z���PJ]����$j��*�a{-1��l�����p����&�q�������������I��P�A.Jd +�&�%ߤ^u@�k�}N_��B0/��"�vu����w�9��AO�j����� r%p
���5��-C��ߔ�:w=Ml���Ykh-���ªW�!H���v �g���(Y���x��>�u��y�nV7�L�L�\t�_ơ}���{g���=}�@�S����2n ���Wbu����O*�����Ӆ\�;PuN�u��W����I��8;n�:�3p�P@���J��A>�	�}�ԫf�AQ*�/6��o��r(V��Y!���Q��E'��޵Ck�=�n�gR��
�/(9w�n=x�T_~��ҫ�rn�h�W
��j���H7!K��"�NB�H�E�������tZ�bv���vd�Vơ�m9y�V
�;gEY����/�-c�_/��$�w	�n��.�
^��b�/h�$b
Et$��>b����$?�^9�������R�f�-|s'���	�
a���qw{�c�����%�텛�njf3p=��,�$iNZ�qG!��Љk(ޭ�D�����Y���'k,�����Wk���5"��t��������7��['����x�:a��6TШ�/ѕE�)����v�Зnޙ_�b��8l`�O�l>�tg��P��#�\0s��}��ܑ�hL�g�wzLqԔ,��t�j*�/t�,l)�'5��T�I��p��
b���5p}�&�; ����0���=hv�O��m1U�����	'Zz�.��O�����n�S��+�\�h�	P'��	%�q~a~6u7�5Z�H�S����m"�z��爔÷��Vļ��	ֺx$������%h�n�/+y�7��PI���q[ֵL�?1hk�7��Ċ�^�w���en�(��u�z��H�f�z���G�g
�E�Z�FQ7v"�b��_��U4,��+��77ǪX��w&��.1D���>�[쥑Yv%W�V	�Ə6�EWq@�M��N�&�bs;���휾x��Ldu0Q�2X]����iI��/5���NH4���T�1��Fe���A��׃��#}�K���
,!�]
���|�ۊ �ى�Ӎv�c�� 玏�fz��p�=m���%��C�B�V��6he�Ԁf<��]��7��7��R��lL�	�k��"*����E�����PKj���<2`x�3�h��H�L�j��s,�TcC�x�y0��*a?��ᓈN��3ܥ�$f���}����%ϓ���\�h��a��LX�뛸ү�:_�5Q�"{���Z��d򺔶(���PKE��T/pip/_internal/resolution/resolvelib/__init__.pyPKE��T�"�Hd+pip/_internal/resolution/resolvelib/base.py�X�n�6��� T`�M` C���鐦�Ð�*f#�
I%s���.?DQ��%��aA�ؔ��9��Rj�����#l�	�ɹ߀��
�޶��O�f��6'7}g�p��$���XW���k!��V������5�<V�1�^�6]	��-���`�r�Ye�J�K�<=bt�s�u	w���s�?�U0�%c��F�Ъ�e�>X�眘U�C�i\2��`�pAiڶ�����K�<cl�/�T�!��$(�YM5\
q�w��ѱ�Y��t9��؏�\��<�Ͳ�8�2I��B��>�
���eN�O-���
Z��rF~��\�'XC��ív�Hн���ˁ��݌�)��lO�LZ��,�ܦ�,��X���}H;'i�_��n����Z�� <I�����D��.�,��mr4?��='�ι'ҫ(Fʈki�Y����������-^4g>��
����^{o+܀^�:��No��U6�t,?ݣk����f��j>5�Fe�gGš�P�8L蜘O�;�HRC�c���bG���W�{�̎Tf��.3�t�e��ߺ���)��yv}�N.�B�(C���|߃�,fS�ge=���;���pc�`9zm�*$�&e�60^Af�䇼�VQ%WB_l�1�;�uKx��\�ž���c���aO#Zq�ΑY��2�/Eo:c�o^�L$�u��#��*�L�]uy��lUCO������;r
���
LN@���[�a
{\���|��$U�J��z�q���G`\�?2���Wi.d��!E�s݄�aIXN���(�@��POt�LD�S�i�*$ږ�:����>g�����$�zkf�S�2�D^H+�X�ۺ�D��H�#n֢^&���]dJUf�+�j-p�M��P�6Ů��.��$�,�'y\�ٍ�a�=�Fs����Ձ�۠#?���ezj	I���H�1V)
��w�U$����k�4�%׶Q���X�V�Y��V?��Qf�<�Y�F`���q�,̫բ(�%^���V-�@̍9Zja
�'S�#��V�E�f�a�i�(��Y���u���MH A�ո��g��b�8�6/�5k�搽��X�-|	�1�CAp�@$͆���(0�~���z�68i.���2�([{Vy�9D�OU�?���ae��(��ۍ��Ex�N��D/+(�cϣ�����c��9��0�CRoۺ�R��^ߺ��q}�2�c�K��Mk��t-k���a�H?�4���=����.�K|~�i��fڼz�XQKc����_G�5ᑯ��<D�᳃�8OL�K?A��TiS^���X&/QN��W��2�p8��$���PKE��T�K`�`J1pip/_internal/resolution/resolvelib/candidates.py�ko�F�~ŖF`	PyM���S�4u.��_�\QC�+�1�e�������7I)N�E{��X��������o*Q7�yy1��G���U-6��V0����O'Gɣ'G��u��S���N��Z��˗�������S��jrQ�Ŕ���*��-Sٌ�*��䊗���*]^�x~�6y!�q�D�I���=K7w��̗4��0���%�i`�W}��K�����%'������'�\յ����MZ)�|�.�Z,��ނ�&��&=.�+�
/��h2t�F/5~�J���E�����2.���l{
�O�Ȅ���Wig��|��0��C�k�s�$4u�lD�aK�����7'<����i@��`���s���$��$����X6I[ɚw�z3���p6�\����DK,^	-;��ʬ|��Y	�iբ6e�S�B���Q�
uiF�S�W)�|kNx�>�F���fs���o���8!�I2�P�,&���G����Vs�gv]�n.:�ٛ@9��G���J�9Y��A3q�7k֬9;ٞ3���E'�f-�(�8�ϫ�G/���N�<��p�������mø���?�f��P���6�G_�T&x+���8�����Lؗ�Z�tp�\�@E��~ݖM�����b������dY�Rr	�(M���L��%=�����jx��l�rIjS.=j�;P��,Ț7m]2�d�
>%�,ݤ�<��KE�6��ᛪ ^h.q�?�B�H�$��Efhef82��
��#�
\خ��@q
L �-EJb�
.���A#6v�Kj��D�UU�<��S�a�z)6\P�ԍP��W��kR��u�8�lF�3ј�`�3͘['��g�ЎZߪ��pb�(�"���{��u��?�WN�V�E"y�FH�����u�� �:wL��z��J�s{��H�gP��J�Zj��x?�KT�?��C���KtBA�'7��2-Q�Kt�������O�쏵�>ұ��Ut���6�������Q��E���8��A�����sͱ��P��r����a�OPDƒ����]�j�Ӈ.l�@�38*-���}x�_�#�x����D�0,YjCs���q�{�֐V��Xp�S��̎���*�E��@���g�5��o�k@�s���jDkj_Fx�
�g0��3��� Ǔ9��/��rI�7��J`�V��WuN!c�R.�7��E���2��:�h�����еff���C�u�-h!����(:"�g�#&E[/y���81�t��pQ������,_�x
Ȩ,�k������QUR���U�`��u��f�h��U�ݰ��0�y�)�ER����Y�$�hƠDZB��V9Da��H�h��Q�)+o�|�S0�z�1���8#$y����en��p
Uyȳ�:���H'�Cw1s�h��򘆹�ڡx;���pyW�8���n��f<R�úO�u�617�u捷CK� �0C�p�$�sCh8�W�8�Z0a�|<�o.����&��ߝ��`��|�膌���d���I+{�9�t�HPy�Ħhz+�6��]���ɑy��&��p�5�qx���I�o��j=�/�^Q8�a������ӭTzT�#5Z]:<u�M<�>[��'��VYPs�{���.�0�ˈxYz���. �"�|�4,��Y𚯰j�SU�,��h��=Ų��	K��VU�a�CB��`�|�J����5\�>��n��dg1�]��k&-b��%��Sx��ؘ\��.M�f��̐��+p�I�Bf�@���p��o|� h��#��4=*ST`vsq.�1�QWc=��<�`��vA��g��_^&���ؾ�r��Ȱ�pQ ��}��7$�Yz�Y������,�E;��/T��Q���"�5v��w���oڛ�t�w����M�j��f�P~���;%YC��7�f2��Grҥ�'����B��Pxj����� K!����Z\�ƸUh�!��u��^*�H�:m���!�F��@�$Q��!��YL[P��l�T_b2�\�� �V��`xa�0t����8XI�ˍ ����.7�tE�?o�]��mS�
�'�4B�sSLU�	�`�(��U�)]���26ܙ��%a_�+�8�#�h��N�Lj�$�J��
���W�aؒs�-��XՌ"(U��]�3�x	�y������6A�S��\dG�6ܢ0e��˜��T��b�j%+��f֓�'%���IE�;��Q�Y�)�o�2d�7���Yٮ�/(�����3:�m��w�u�+��n�� }�F*$���5b�ZU�o~��D?�l>ϯ�2���q���8z%����L�%���h���l�\
���EA��{��E��q�u���%u��y����OaN%6фS�P���U��-ƕ!O�j�<�֌i:�o3�Z�7��L1��_ ���M�Z �:�@��s����О����W�o9ثOC7��$c�h8r]⠏�t���M�k��C@SH
���%'	���R6�3}�:�밣�c8���݁@�;�}6�ۦ	��|e��-߇������L\��H3z�QJ$��v��9`O�E
��BOq��Lp��:��A��HS�
�����nr�I��r�_q���[��C$j�Ұ�xvV���s>|�dJ��n<���
� &�T�>Z���~v���\�NR����h
��2�Ȁ��چ��O��n�`����g��F�F�Ew�h�"�sT��
=z�>6� ���E�*�;�=�9:^�w.�A��o+��ð ;����׵��e�kcF��춒���I�.ض��0m�}�%🡘pW_�.80�<�����6�"0��KJ����n
2R�a�.�q�k)�� ZT".�N-���$�ؤG�S��Iް��
�|�"�x>c/�!�0J��ҫŌ�;O�RQs�"Õ���ӌc�xw�Q%/�*� �,ҵ�XԽ��[��i��C>��d]���m��F���w�p��-�����"�+��,ʫ~��)�h��}����k��
5pv�۴iz���>h/>q����4>�]������eM�_�����Eg@2����%�;��}�:�~O��ܷ`���7Q���CN�����.))!D�����C�����$,H�V�x�wNɥ6kU%�T�n%��~3r�
]�NW+���`�b�z<e}�b/�y�v��Z4����N�؏���+<����υ��xQB��|�þ�5�:�T������1�۩�
I�$��O���A+Q⚾��nA�	�T�.-em���r�l�n��"L=U��Z|���2���
p�
�4U��V��3��eՖA�P�U�� �ZX	�=�9
6	N�{?���c�	2�%_m�
]���m�>؉�]󢰡ɂ �u��GO����8]�Ƃgu1i��Pa�����$�����h�}Ms�9�i=T�m'`�z�t+iW��)"�
dZ3���������_=.<l�AZ"*�@�)`-�
�a%���ݏ�"��܃s�e��_��R�f-|Č0�8T�=Ps�6R�
��ɯ8�����B/�\rC����~W����)�p~�M*�4s��<�?��;���&���k���x���\�SM܋�'�)i����~��ݼ;�yw�L�h�oD����D�4b5��!��jB�7���ˆpN��v7!7��_�oa+�2!4}��/3����3�׈ʭB�=��=�2�b�x��>�8�������QtL���5uóq(���0l�u���7�Q�b���>V�z?k���R�d�B�pG�Cu����1�8%��~�0�J2��ZDy�}O�?�q_�u.���N��P��ZC*�A׵��Q��ql&��E����LS��_��@3��MO8p`�(�
�J�X?�)DL_Z��hMW���D���cO��r`��%�P�y���V���QO�[��i]�]�;]�=��Iל3������]����u��b��|df�tyy�;����]�1ĞT�O���+}TEJ��
�'P�~�T雷��+�
*���
tB�ݨS����sKo���i�IW!���0���L*\��kS�:=T�0u@�с[w:TC�v�V�2��6��^[����~���q|~>���v��n���;��Ÿ�{
��wʭ�������a�1�#�M(b������tZ+=A��	$^�y�l"�	�D�>@D�$;RS���T�~��nD#Ui���k��p�_QS�c
����E�%l��';�Q˄��\{����^�M�c�%�;��w����V8̏x?��|��3�%Ɵ�^�?PK�mW����|�n.pip/_internal/resolution/resolvelib/factory.py�=k��Ƒ��Wt��
ek�v��t��n���^ؓ��񀦤ֈ�T���*s�߯�������)�������zwo��u���];�CS/.j�f�o�C�5B�h������?�A8B�u}w��-;h�����s���嫯_����?M��W�r��黿��~�x_-��^����՟�#���|u���N�톺k�F����m��%׿���a�Z�1��1����ջ�|���]����E �oy;=ӷ�C�ԫ��cĎ/�u�{��0<�s?ԍ���0��
i0�ۮ���l�U��k8���=��#���!j��;���r�j���+���Ô��ἡ�n�Òӊ�+���������t�v�V�C�4~y�z��̇jU
��N@o ���V�w����M�(����).oϺ]��Ҽ\��^c�^�}C/S��
7�Ꮥ����劯�}3��}���
���V�ES��޷��8/ݖ&�j��p7�J��爵[0l�^~I��@��ăe�Z.X	�K�V"�eծJ��1H�Z��9C����ڛ���.��J�H K:|dU{�����n�p��}�P��.m:��v�[�M=ʡ�3�ǵ5<6`S�
7���_�͞wG��%�	�5��Lw�m��=�oi��}���[
�����{e�>e��	��[�˦��ꠈ�Wv���%x�zU���`p�Ľ�R�	)
���(q��ҾV�S�Q��4H80b
��¼xۮ;!�r���������l��h��6�G���R�W�_��׻3����C���ǚJ\�5 ;������D�Ǚ�l|�9Jli(vqq�&Hع�-
��o�]^��*K��+h�t���&�g�%Z7��N#���]�}׹����4ܕ��mq�t���0�MhD��������䠔VnKj��{S��<��A�vn=�en%x���_R	�|�c?+!��R��6�V��tD���H����gƤ�����6��DQ�x��3��_rV!~��ڮ7�!���b�rG<����!�֝�0��
ɫ�(no�s�u��v���s�-@���\���U�>�?����+h''c�
4�\y0�I)\c������Ǡ��|���_M���&h�^>�pt_��fU����C���:o"�W��9�K6�!��d	�S��\)�1��JB1l��2bT;�#8ϴ��a}�dሷ��P��~jH��֬�x�z��13p��6��
�A�V���x4�f�2j	,H@�".�m��p�7B���0S5���Yj�Y�g确�_�-��`�{�7r�@2���L�}ߦw؅U�
�z-�`��SJ�?e�}FVQB���6��~�4%6��Y��ϩߺ��c�B�v��(wi1T=������|�'��Co�
�����Ղ�P13��$˰��;�
@�m�YW5���+����$)�hg���,0Z��4v��2�����[��L5�W9B�hx�ƒ�l?�4�I�3���mr��7�@�sp�5!�f7�I�2:���`A,8�j���,&�6��og�e���E��)ɱ�-�T�S��&!��\(5������Li�����:*��A�FBɢ(���~sO���mǙE�SX��[2>R)cӏ�9Д��4
]�[���F���/�w_}fCX%�����h��/4�X=��`�RH	^;��Mu������a�6m�y����
F���V�,8�e�`�����}յ���{�^�Vw�u)�B5��W��3��3#�=e�E6G��]�t�c�։��<	
��c���G[��~����o����]
�I�V	�T��U�%����쌓&)�����͢�sF.���Dܼ����o�����6��qJ�I��S�����.���~ϟ�%>��e��'�$���b����y�M���{%�L����G��{�c����3��0r����^�@�i���bt��&6V+�dg^��6�	��JMx��5��(]��# Y�a4`�5ktj7i��@�'E�|bl 0f�bH���(6�C�� 6t�~ c�reZ6d����=r��^l��:����u/�x1����~�0"֑��-��_w;��7́���_�r`��Cۈ-���7d,mkAF
Y|����chH��ϭԮ��`-�>e��[0b+t�)�ɶ8���=����z�(㤫��st!c'Lj����'�1���Xt5�Z�	�o��x���܀��w������g>�_���
ɉ��qgJ�͍mp$\����O�e��������f�c��9\Y�@i�:��5���xӕ���S��U+R T����4����;g�=@}�2쀙f��7�xҸ��<��d,�}cR=ih���GNq����z�>��v]�J~صpC�8�z���Z�C�YZ`�P�����n�A��t�.����>A���2s�ȓ����N�k�o�>N�) ��\�'����<m�M*^{[��b�m��:ڋR���|�ѷ^�ʄ�W���&`:�E���Ɔ��m=�[}
V�M���
U��7��UP�S.8�D�S?;���#��a���+n$��|X�:��i1�� �H�e@��a�
�|2�֖d���~�~��{�h���P�bvoÅ�ݔV/��d�t��XDo�����|~�@����T
���]�����؋�:x����9�}�?r$D����iM�	��F��z�!�����@���w�oҮFY�SE�g>g�$K7�G�:J�s����r�n�ӊĥx��M��f	�v�c��od��!M�xQbv��
(�~�j�[�FHkTkٞ��\.Q
V�d��z�#w��sۉ��Ŝ���(��
A]VZ�~��&��q���
��6'�	>'T�~Nt����N��"���H3�)��z$���z��a���Eޟ�9T�k��j��8�r]�sq�V�/�1�d��=�5g��;\��~ɍ6�ZX�B�R��I�W�yT�C��W��<�%e��g��U�n_���r�j��=������M���M4�����\Rpr��f��h�i���u1P)�.������xb�J�:!oZ�M�R�Hڮh�Q�E�;
��9�6K�)L^\��@�퀘�:���{��
IE��[��:�`�ޏ��4ul��_�}���Q�����*E�¢�ܙ�O�;��*_NuO,k;=5�	�:�RK5�
��SC7�2��!���w斞F����x�;sp6�5%�zN�5�+K��n.!�Eܱ@C��}�l`M,�tXF�2�[F5��l
\G����]�V
�D��q��ݍ:�g'C�2؍�E8Yk�_&i�p����I+m�����'�x:�k��	@��㈗��D��mI�~"Qe��Nr�%��C;#<�}|m��Ȣ��
�MEt�'�y����n�߷Gʧ��/t���JJ
0�q������%"c�^��T�v�N�١�ͭ��s1��k��R�RH�c4`(�c�JL��V2���!�c�
��U����o�^��Ζ�@��ԠCW���u�����rXZY�A-h��$�i6�FKJ�����$�HQ��W�˜�]:����a
���̀^�MQ�)�'	q�����J�'|�P�9��ez!c͉�!Xx�V��uȪЈ��**��6�X/76��ۿT�
N��L�3@c�_�o��H(WI�w����)�tQ��X��J��4ψN��j��7�����a��l��q�c��H�����*O5��=��8|X���O���+�ɍJ��>���&�Z�P�*p�r�\b&n�|�p�c
p1Ȃ�I���H�0$(�(�	 z^RGL��Y�%�8��A�m���vy��y��{do�vҋ�'���cF5��XЌ!�	����V���i�����J��{��J�1��c*�����w�:�!QJ��q�\�8�NZ�D��&��r"�}$��J���9^	�gTk&�(0H+� Td	�j���Ù#x
&�].!j��m4o���L^T�t���q��z�Ԕ�S\���K�/�6�Z�L�3��/���9G��ѐ#5=�[Le�0S��'�t*�d���9��(�u䓂}̩Ie��iS�m�G�D�2%�e:�5ٮ*`�1���O7r?ݤ����u��1��TPh[�~Q,��d���N`xQ�  u��M������rbf�/����zaY)���<���	@��^�e�p&+��3�@��^���G	���G,�'�0�A�w�ΡW�C:��S��	��
�۴wS�k�0^T�{X��=��
i	m[R�J�(�+	�T����M0O(O�T�ԍhB�x*��b����<�.h�dq�a���>;?��V�r�2MK`6�Φ��K龗}�y.V�`���me���_縍n"b�����==����)Z��~�!�[Q���
Iؘ�A�ɺ32Ҫ%Y�dI��S�n�`ٶX�u�^�@�:�)�T�d��e�:%�(����h�Э���lfcHF��DȢΣ�k����c7��*�(ܣ�#�'��2"]B�rQY�9��N���
�4�¦�ː��ϳ�<
EZ��Y3�T�6IriJG�$IFD�+yHY�2.�Uv��jpD����o4X\�:a��n^xF�ȼE�?�����h m4ٹS�H-FWMD�Mm���S���3�v�N�d�V�!�sPG�O�xbr�:75b�G!y`�VhL��j�D['����9x/�x��q5��.ʱC�I��3��#Z�	�X�[��j���n8��
�����Ȝ�@��`�HܵL_��,�{��J�<�%O������,?�m�ݳ�Ξ�S�2BE(8�F0��E_7�M)c
����K���
ԕ�,���/�Z�Z��x<%�ɀ��(A9���z��ЗP`�*���l��Za��W*���F=l��w�`�7Ι	�m�߹(؛}����#����#�h���[���`�i��� �Xzo�hl��c5f��z(���wH�(g3o4��$X*t�}U}o�He�����ܻ����v���r��v�0H����#؉�_�\E�q���=.d^��|%�!Su�sd�ұ�n�Q<������A툍š�lf�*Y�q�{ߓcga��T��R$/�–�F�ba��{S���>��NFb�]5l��8M��A�Lr��%������SO�3@w����#���8@��j�3k��B}4�5���*�Q*�,s�Q(���$���?RN�Y@*��k�E�0�%����:��r�+(��>{���R��XR�Z�~jd���xa�C�B�䨁AP��Pc���\t��I�|
P�[W��X�&'$~+d�����8��~D1`@��G��]:�"=��*��.0��G���,�\&6(���?z�7"�H������`�.�sùBW�rdw����c��岚W��WjI��@z��e�����JI]�h�Ysk=��X�Q��W_g��Ql��
ОǾz,Յ/�z�E߳,�K��.Ԭ"KފlJ&�:�Y�D��
�i��/3��̱��(��Wq	sʲ�XV�-�CKӖ��đ����#�.-�/y�m.�`1�AM�9D7']�����x���|fRE���”�������;4�L���pOj��:
�d0xG9��E�Ke9��3Sca��D��=�oZ�Y)��[�UJ=�9Ť�Ӌ�1�N��֣"˵�y�'���$7י�tw���^�R�(<�i</�o�L���{1u���K(��@�9��N�sZ��'��#���as��
��"yVC
N��Ri�V�S	s�8$n���RN�W^�mi�P� f���2_�@����,�IQ�i��<O����%s�˾0�;��{f�,^b����J%������\��H�M��`Y�kW���(�a�C6�>=:1�!hVȣ��17"�����",���	e��49pN�'͟��l����&'�9Rz3�a0/:|��Ž$��~��z�~�T����vG�%��GK��8��:^�K����a������# &���Tvc���򪿔�%9�����E27S!0I(BS�*_g�:��G��s��x<�@�7Y�ӻ6iҪ��l�FH����$����=uq�[��j3Ke�˜En�sm"�Hr
�(�+T�n����9E����Oά^��L��p��Y2_�J�Qfz�L��7��׳
���C3����(h\��<�aI�X�TC�u�z�:�J��$Ӫ������䙞��D%��)���٥��A��kx[������g�ۅC��߳�a?�P�X5�w{������EE�;��2
�]�Qk��AcphGsu#ox��nI�+N��wajWi�Oa�|�t�A�o���/���?��R$�t�D��.4O��J�(�kn�߽��2Y��;��M-�1���_�oh)��Q/�w\���!�\�����%���E�Ҙ'm������vr����P�b���(3$I��.��(�Љ� �S{������3��8��/�^����+g�K�Ot�{t��2Y��dGoy���.A@kŔ#8�DZɃm����ݵ�,�&
�#�h6e
�VU$��UXi���b"v9���B{��3���U�eJ �-�5�n�"P
_u����m� F��)D`ԏ���]�P�1��S�n=9��Ι6�)llE�J���΀�P�����Ƃ��9���$���#[Q�f��;Sd�K��=�0�G8���j]����O@C��5g�PI����?ĪF������ 9-���prD��6��r�B��2E-�`�'�fv�kq�,�����B��
�Tx�*b�)S›�G�Ԣ�e	&��-�	{P�iz>�1�����6_^c�����\�s=�p�f��_x�Pp�����r��W�^%@���iR$�
�c��
��{���/�#ABT��
���11�z��s|�y���H�}3b4K���0
�m�a'f/_�I�;쪢�^�%�E������xi�qe�m���+^aJ�
�+����p'��PKE��T)�Z��I7pip/_internal/resolution/resolvelib/found_candidates.py�XMo�F��W,�C�@!��
���MZ�h�n��h�Z[����R�R��.?%�ѩH]$������͌&��oN*�$Y�P�G�v"3�:i����҉e�3+
]�yEg,#˛^��E����lKf�Ld�:(�<��X�;!˭V[�QA.[��{g��ϕvT:�*<�������k�f�V�&�y0��,v�ri�����r)�IÅprM�
mN���!#`�6i��ᖨ��-wl��g86;cX��Kw"�w�6�;���N��z+�N~�ҕժv��(�ډ	�P:̓RmT>wk*;�,�O�YvH���
���dErSi�DQ���Z!��L+E���*�ԯ�WM�3�]�6�]���mr��۳���0���\���t��s���f..*V��9�����+EQPX�*N�T���U�ݦ7lgk|sO�&��{8k��W8j?kCE�eN�����$\x5���yu��
��\.�T1vq	�ڈt���=(�HY
O<��Lo*�y��[�\\t���@�N��+�Wm9�WK$���j��J���i����8*��xg:�`ٜ_��h�t���(e(-@pƥn�%�;�HL^Y�r;�̅�ߋ9�U�
�w�*�U��m���7g?�Ҟ
��fr��W63�r���c��_,�/��[���+�a_Ze"7��l��2��
b�ٜEQ�S!	M	��J��.:_�j9�O{�>�!2���7O���;1{}
Nd�K�E���\[T��i��P�(U��|��Z�dP��^�Ͼd{pLC �I%�-%�������);�x�^p���f��Yr�Y�	�n�rb2�[B��Bu�\����ipwYSw�
R�ڛ[������m;I*����&�i�O���!.�;��Ie�aQ>�Z�T,�T����#��6ѵ���?l��>ǜ;��K�nuucҜb�C���tmҫI��
1�d!�u��
�G��쁕�}Fh�VV���c��
A<�`�1����׈��U�A��k��5pـv�"Z�R���a��6%���ġ�X�n㙟smЂ�0��F�뛵/-�\+4���8
�*�tY��D�=�h�y�h�����us�(hǼ*�O�MU����ЕyZ�7�a�����tG�nCO�y�ɠ�B��[bq������!NOZ#Ʒ?�N���ٗD�D/�	{O� ZB!OC��r?�Q�e��Ӄ�p�1����v�eTFo%(c������t~L5da�	�s�u6I6)6Z�3��q����m�w5�B�m�Z9	�Nn��͆}0�2��IX˫���A��L�2s�_�y��	3p놝���N�������Ȅ
�#5^e�p��?���"]�L�$ZRż�vC.iZ�hy{��,��=�u��k:D2�_aK*j79E��m (d�Q2[����p�b�yO����d,��فޱ�^��h���m����o��Q�}1dƶ-�`�B�-vlX��ݶ�	�K��X�}6hj��D�ֵ
�x�(t��D[�F��T1-�^����,�a�S�I�%Н����$��S���d6%O>!�+!�{����t�Y�o7ǜn��&R�	d�o��3��߆�Y:^o7 ~NmÈ��w�н�9̟O�Y�cz�.�#�l�,�"�~��+S'Y
�����ʏt�b6S�0N�}4/}�r���������YZ�ѿPKE��Tg>!
�&/pip/_internal/resolution/resolvelib/provider.py�Z[s�~ׯ�p"����M���uO�:�f<
"!	5E�e���$J�nꗥ��s�s宩U��,E�ʺ�#i�v�ݎ֪ޱ���j��x�����u����?��~?5G�d�ڧ�V(�*E𫭕��o���^�w/��>�;�_*03MF��F6i�"��V��._D)Wi��Y�;�V�U<o��w=]q-:���*d�[1eo!0�e�N�=��J�DպKyأ����/7��ﳻ_~��6�yw}�p�������Z;�����H�c�͍��K�;%�B��>y�=���l7պV0.�;2�<��[\��O�*�,������ʼn9.ܞ2�=�D����Fo�mM���V0%JÞ�ʆ�D{¾��85��y���hz#�3�cyɵ:��C��I�8+�����[��k�Og�&Eh��H�z[�oa#~uw�y��w����W�P�gv��aK�[QwbI BbdJz����0�uH�����?�-^��N^J�`Vi5�R��?0�!�[�ի��D�+�ײ��L�Ĝ%7e�}�A��o�O*<Z��:��DD�30�D���{��Z��K���"�/�bi\J�iXO��(��qIE��u��F�Y!��F�ޕ,���>-h�2�P8$t���G/q5�������%Jhc
lDg��:����(�.'}4B���+;�8�FF� j$�5C�[�d�OZѪ�a$TZ��m�Rko�1�q���d�l��#�$�F��
��w�d�!<������22E@�pNٺ���e�ՙGDŔ}x�E�C�)��C ���w(7l��-=����FI�|/��V�lڅfy��7�U|'XY����mC�{�x��͒[XP|D���F�d�J��<l]�j���=N@<��5��mP�)n�|K�W�-������e�
�ac{mǏb�E%4n/49�aQORvU��ܳg��/L�K]BD�3����V��pf�o��U�	�@9N��T�U��Yּ�?䧽��=�y�~�z��¯��M9�����ϟI�.�B�������!Kn�~�~��������z�b�+rvd,�xe�rk,�@�*]�(b7��(��Q4���o�BK�g&��X׍D,Y2J����)�=�z�*b����Bw�w�/_���
ޘ֔{�pY�X�\�����\MIsp0R�g+�"�(�n�dSe+T�g�d���&	���G��qx��5�s�5�{���v'��[G�Ĥ�;�e_��JN�0�l��!ߙ�Gh��S�!x�������^S�Qu/C(���C�]��Mk�4"+7���jϜ���aK  �\�fU=�^.cT�f�x!2b����s��; �
P8���AÊ��X� Wj��t��Z��)�"i��$	E"h���K�,�d%�,{<�\O�_��λ>ܿ��G��-~x�g����҃�*�//�@Q���dJ�m]�y$L�u�âg�>t�E(������{C�pix4��K�����1�n#[�˚�OF�~8M]���|�*��L�����.����N.�U�isW�/�4�$��$	]—��{.�Ki��jL)�4�Z�_pڳM�%�d�7z�7����u���V��~�;w}�crvbLB,+�<�#��
��Q��� 
������=�#G
E�EGd��sTd3N4z��N����R����[P���}�eEm�U�é�A����п��NE�%2
H;Ǜ�\LG�YQ�|�/~�fq*���v �xD�%��K�L���5�IԏU=BF�E)s��_��n�47�r��H�J$"0?�4��H�Qh� oB�Y,�%s�]��CQ�Ǐ���rG?�7������˚ʜ��%+��Z*݆��L*�����6�t4�~M����l��,����P�k��J�����9����^���R�*/�-_������q���Ƙ
����o6|%K�'i\��g�8�UJ9�O%�}5���z<�q�2�.|r�����0�&�񗎐�@��bX��v0�kb�ɨ_c"�����φ2�0���`#�=蓏[�	Z��0�݆��0ڸn�_��-X�X�yқ���s��ȥp���q�C�hr"!�b��$�
�Yt���\�>���O|�����J��UR�������uu�|+zkl|�<�K��>����P������t��l�_�����p���I&���Q��*�i����ᷙх�g���N-��m��sv�@{��a�Do�S����4oJ)I��@��y'�E>�LV����?"���omR6�꥖��|�v��5)$[Z��:�D$��Ʋ�B�����>�=�}�"�4�{�^6mJP�I.T0E
́�¬X�26a�Lw�r(�N�4=#�S��n�#�h���jG�*�@D^J;{�=�00�Fv#`�&�k�f�;�A
�D��7l�S�[O�&�#!2���;^ȍi#d�,J��J���-�Mđ��r����A�Ξu#�t�n��C���
Q�#�=��ME�GSK��ȴ��י���Y(�٠��Qh��l}��0�Z~��^kH�J��ނc݊�
���枒X�R�����9M[P��l�Z�o+I����2�!�2ѽ�I艮�3!d�c2u�3�E��r�k�:������]�Ϊ�m�Y?��T6��_G��~�%��fq�A����{f.u�]��:���p���˴�q) ?�4�
��\���������s�W�u�n�uO1ۢ=@��ҟSk�i��J�����&�`΍g�0���11�q���yk��Rn�C���	�$58q�Dcz���]B���D&�\���(�f�I6�Y6e��Y�u;��'"l��*X���W�ގЕ�����ƗC�WG�o�;ޤ������H�iW�B�t��b��#��
�����5���/.��r6sD��A)��G�P�j������~;Ψ�$l'x�G�9��ۂ��*�5�Y��X_�6!�
�A2����jK{�1���r�靺v��צ�߹�kz�\&�ܞkA-�)��&��M �w�w&�6�,�O6���s�T~͚�n���$̇N�-hjr��m�/�]\b!L��hF���h����?�b1&�*�M&�"3H������b��t�9g�Z3Xz�y�L�=�p�CJ=�I��wȎ��D�u`X�<��&iRɥ-���G;��ݯf%�T�bDdB)(�7�>���~��?�y.��g�kll؆A�
�����4�6�ڟ�i����Tx�j0��(u�PKE��T�~p_�	/pip/_internal/resolution/resolvelib/reporter.py�V�k�0�_q
1��^�!��eP��2J1�}NDmɓ��B���Mܲ��͔�H���������瘐�ʂ,JmR�D�S*Zd�\o�Rm��-�^A��ҡm��C�
¥Ch^*e�{T�6�A��=�r�_]�����x�.���׺��R�
�n�W%
��$��z��c%
�c�X$���ɲ�^���h��o�c�$���b����#\k�;{�2J���7���/b����%�TtǒF�\�뙠�Z�6���ؿ瞳���x�W��OH߻CS�2G�sZ�c�<�"�<i�R�\R!<�d��~��R��0샤h�q�g0�p(6��:��S q� r��4�&??�/F���:�������\+Wٴ
*[�<����Bnw
1u&K��2�9�l�+���C��m>���2��_	����:<�i��™J�,0�#*m�Z��.��^=�X�]���\dz6�ۊ�Y%w���m=EN�ظn'�
f� 7	\���.���Ӣo�1��$��A�&��BW`wp������X��}���h���K�!��7H�Q��6�S1q[s
�����һ���5��X��WZ��k=u�O��%n���xi�z�w�
�
����Н'���r=�OΎ$��6���-	C�)Ϝ��]'"�|�?Ɗ
g(m�Fr��<5z�sb|���qS>O8-�T�J�k�	�i1��nY���5ְ�"mdC�%�D��;\�z�ƜW2C�7��1��3b^����h�&�F���PKE��T��ֳ�O3pip/_internal/resolution/resolvelib/requirements.py�Wmo�6��_qվX�,�<�+���Pk�}��N1�rH*�k���H�%�yYT`��I�s�{y��5_��ʬT�7���X�1�9G���R��_��f�����ЇRL�}`F�2YJ���D��ă�Ҡ�L�
o��aB�����ۊ+,P�F:^2��So��x�ik�,˛j�'Anm3��T0��ݗ��)7����'@�sH�:n�d�Q��b��y�5��/�������q{���C�F5���v
M��]���BA�Q�`�����n[�Wjq�i+d?��ӝ$�JBOv5I���=�ojw�1�׵*ר̦�-|ƴ�Nw�~:u7��v@"f`�^���
;C�~h����}��L�����tvX�M��O�J��T�C{�s�&iO&�UM>(�GE.�;l���D!Y��<V7˲��YԵ%��Գk��Ώ�̑:&E�N"\���܉�OM���݈@���[>
�\�X��3�/F1M{�q_Qj4S��^�-a8��^_J���x��.��<:s4�쫡(�Y4[Rg�Bvq�a�l�����t�sp$C�
npW�'m�R|�i��u�^�O&��ޖ��:$-���4������$�Z�&��"��8�s�"���A�nP;�k����@Q*�`UL��XƖ��Y���p�74T�X�b򚚼����L� ���W_�20���I�ݡ�D���F3l��~��إ��|=
���޲-���!��4����9�SZ>:�2�.��-(d^�q��gW��
�̌?������^_��#.=��<�׬�%�H���]�õ�^'s�I��}3�f]���.-����f��m_��4l[���c�.y�q=4�Ql�@�V�ߠB�u��#h.S�7�9�*�	��;�
g`]!
�򚧑��}Y��%2�\����ɵ��67-hE>����;����؍"��l��bԽF�#ڈ�RFC��	��楌|�.>��rf��ά/6���.��^6�>���,��f51�!.2,&1�9����J��+QDtg����p�ځ�+��}f�σ�J۾�]�¦�"���[Ȯ�K�7|VMF�O��hl�w�39�A߫]�

>]~G�@����2��ýc�~�2;4����r��t$��bݿe0;�=�t͊�pYC���}��Y����OQjRg���L�� v0�$�c\�[�/%K�3O�'�w"�"�}�q2�oP����	��oPKE��T�ٱf
-/pip/_internal/resolution/resolvelib/resolver.py�Zm��6��_�:8�]x�i���T�ݤ��Al������h�XYTEj7� ��f�/"ey�{3�fM����3��P��Vu�m��4J�z&�@�v;��W�g�N�9�0��軿�yY\����O�~�q�^�Ҭ�k���F���+�V��w}[�+�63+��mV<��R]����vYod����7��%��?E��8]�	��Qˍ_�=��Z�[�k|ޣ*���rS��k;�1��k���6]_���ى҈�ǎ���̲�2Y�˽���Q_���T�T�3�(����+���hpj�jE��:k;��N���5�1o�I����mx]�կ��H�S��0�8�y�e�g�[���o:� �X!9�u+�1e���ܼ�Ō�D����(�?��A�xSɊ�b'�ͶB�;��?د��ܦ��͞����������3���0|���Յ(���fH`���H��5�-

墀��ʚk�m�wi�/���QT�
vRh��a.��|�檩�r{�Q�
G��Ѐw�=^��G{�JlY���(���E�]�o.>��Th�l���?b,��@�7C��S�^��* L�O�zX�kQ�]���-6@��C�kT'�J��oє`�3Sܾ�:�:�=��jƳ��+q�3~ܷ��W�;�FlD�>�<�
�U��(W�HV�e����U#�Rr]ĶXf����P%�c�l����f	$B��>��ȷ#�����Ly<��#,����y�-�8rY>��N�$LN�&��,�B>�>L^�N��:8lb4]v��)��I/¨eÁ`����uJ4D"�G7�A~��^����RCU��]�Z쳋oG�s��R�K���bg�A�u�"h�����<N�#�[�y�K��j
0$��΃^Y4:���a�9���?r[>�ߓ`��B�V�~�)�A���y���~���׿��.^�����H+Jg�y��d���
�Iaj�{RD�Ӓ�ډ%>������<��M�#�X��6�O�S�a�0��JV�P9�������9}F��Z#=�ꏗ�Ę���a��}��J��)�N�/Ek&�	��F�]��qB䩓��fM�z��|j�3μ��G,WO��l�-S�s	%�U��F1��eK�|D@�i�ʧ��� �`gO�d��x�f��k���25,���F��m��VJMt��0Ucd�G���3v����f/�mҌם�Ց���d=�d0�i�n����0P��	9��|G�Ű
�� sRB��}mU���� �L���A�"X��0���&z��y4
�&�M@l��xf�8&;����^�u5TTk�T����e紦�M�ē�A}�h|�z�~B�Ԃ��\�1N��9e+����n�؍�����:�I]�J�L��?:�x��o���M�O��Ph|�	A~.�p��`��ñ��F�l�)0'��q��?8�eZzyy��Ep;�����?�Q���}ڦR>�N��ۉgXG�����I��@�����������zf�W=��jB6}BXEd���O�^02㔆�g99:��_U�[����s\�W�P�O�h���aG��C��
VѴ7���⻷W�^A��;`a@�����RUb�P.W���P�Ǿ>��A��Ӱ��6C�)�v7(�R�M�x�u�4����k�q�E�1�����xN7�����͵��Hθ샵��SKL`n�O���_���i������p���~l��	�=B�'�� �N>��ۉ�;
%�9���`�7/S�j2�UE��UR�a�,��SS��֤�ި��U��|�Pl������"m�;a���
��I����1v}�]�_q���{?��8��H.�A���O��A�U6�͆3G`�c���H��ta$a�e.�+@�ܚ�!aK��L����[���a�FFv�/I�I��/a��������<���}���;[8ښ��v(�F�A�j�
_Y�a�$��#�����!أ����d�^�h��j�F�p���M� H�l�ܣ0�Yy,a�MB�1n�{�n#�뎬U؍e�wA7�(|��6F�6�7���Š�1���`ku/(��ߠ�0�Kz��0!��5�#M�l*ne�C��Ar�-�j�N���#�Q`���i�yRmk��bk�BoŴ7�Z��,	ȝو8(<on
���낌����D0�#�������:Jv/�Ќ.#VҶ��FP����d�D-X��u��W�𕑼^NmRh�Jө����+�"�b�
���a��b�z�&9���7e�Y0��͓w�7���r":��\�;az:#R���*�)�"`�;��	n�^�+@�k��W�l�w8s"�5�%DZ#9�#�3�x�P�RD����
y#���H�S�^0/��(]n��v�6l�;�-GԂ?`�CM�hVH .��!ȴ�]�9Z
ڠ����֗�QI)�H�JL�|�5nn�r����5"���"V?E��X==��t��ȺV�e࢑��r�cb��q\�x��q���{��ހ5X^7�)�2b^
���P)-˰��n�T��k��`&ƀ��<��T��Y��2�
��򕽬��ĉڦ@_-sC�slM��# �-d&2��#��}��d
<��_8P	ޕ{�0���&�{�;��{�y��U�����Dnr�o3�O��,�h�P$�H�܎�֊�����BHBAN�f������+�7�6���D��h-v����@���Вd-k�gND��ZP��'�m��f�y�#����hg(�J�j]�$� f�z�.��q<ӀA:����&f�l�g,��\�R"%+G�Z�eA|���&o,�A��(�MT���Qr�Hc�e��G�1��.	��=�4XJ`2���4]����b�Z�TP�}f4��'�G��85�A
H�
/�NOն��T>�AA�b�8�t�<�EO��"*�@w�M�)����չ
�[i�{>�����߁�_��B�.P_\<co�l���'ǧF��QU�9�_���l����4[hH�
9����ȗ�%�����w�'b�v�}@k�J���.�X�Yy�=�A���fL�ח�; �~���p�[~��Rj�}���o���,��Q)���d�4;ײ���(5.�؝,Ga�38֙,:>@@���M��>���x��'
2��W/��A���D"$'���q����qz��7'*7.���	�@&���k���T�g��e�o<"���׫1
!�X�,	�ƾJ�k�}RG���ǟ���t�du�>:�5qNt[*D�{�� ]�74�:���5����"��������
Izcu�R�%�#�~F�-��x#��B�J��
�Ԡq]9XqW�V��V��J'���kŲa�b�]�b��"��������9��j�lσk�{VL�S?Ct��df_�'��>]�O�?�t{m���;��*h|W�
��}D7�V�9s�Y���1I�uww�kyw��j{�YnhL�
�^���&��@��
x�?���Hq1�YC
7I�
�P�U`7�	h*a|��Ŷ�	0P���-R#?���}v�v9�������PKE��Tpip/_internal/utils/__init__.pyPKE��TJx9?��pip/_internal/utils/_log.pym��N�0��~�Q��T�%\*�J���Z�i�LSk;�Py��qh�����?�e��`���'��m+T���B��+ܣ������6��x����Ŝs^l�Cw�
gL(�Q0/�#%�!�k)��� ����t�$et�څG	���b&�e	w�6nb=t���0���N%iX�؏�@�;��].G�-����;t�
��7����3{[��<���'\]3Ƣ	o1:��	5�ZYr�u	�w�s�0f�Xˀ�BL�%�D�L��I:�'�$�[��:ۮ�:ʶ�MkWь����t,`�6Za��ˠ�/�	)9�ܨ�%R�>�Ԙ\���Az����E;K�
P�P�`�㴑_��op>)/g&����L�l �l�u���7 5g%��zԃl�?���Z��U�!Jp���y%�U��U������I��[3��������n���ff�.+�?PKE��TrB—�pip/_internal/utils/appdirs.py�TMo�0��W��R[���.;���TcӶV�D�I.������b��#��E�z�5Cn
��C��k�g�
���Ў�5E�xl�G�w<c�:R�i-z���Ҹ!(΃�v��A�DII�y9Ҧ)/ym��/����̕âǦ�/���2{b�`�y��+��c?�AጕɊ�'�qN&mB^cWQ��H�+�Z�<��xϪt���M��5{5�$�Om�^8��TȐM�)�
*�:�,Ǽ�L�^�a�--�����.<�
�7�:Óׁ�0�}m��6L�T'k17��(ӕ����g�bK��
\O�]\�&��~���93���4���0�M�7n�y8��ZҞr(��}��g<$�J���2���5�<,|UG��̫�w7�~
D�Q����8�J�?�ۄ�,DfS��"���5<T��͍�4��>;^�	bu<�B;+&J����L��8;��
+�Y���.�P�m��R9��+��O\����(4�=s�
].#˂8�
���d"�R{oy����u��)���[�O5�������ۻAӳl|y1í�?��� �P��K�0��0��(�`d�_���ߟ����W(��ׇ�����>�=�	��$[R�yXz[j���#<a�"�z�:���<F��oPKE��T�c�k�\pip/_internal/utils/compat.py]Uێ�6}�W��G�f�u�R�pa؋u7--�$b)R%)�B�|�_L���9sf���ve	�f
^��
p9,QZx�m�$�+i��Z�l�t�X��uGi�QěViBU�ոUf\��DQ�1!���K\��Zf��E<���B�}־V�mw��f���FQ䜢&��{J�+�-�2�̲)]+�����
�L���WJ,"���}X�ߐQf����a����On�+�4B';�Et��h;-����sl-,��G��>�o�1��Ԫ���iv@Y(�vZȻ��c�m��y���nW�lv}��]�����,�6�����wkb���A�!�J%�:Re��9��m�b>����}��f�-��y�	1����
i �G���ݾ�����˱ iqe's'�-r�:�uV���S2t�a����w��,��Ԫ h;RO�vd��f�7�c�
U�]�4P|6��!grba��/#2.��^9�Z�(C��d����j����3/eAT&U-J���6���f�����h9=�q��b��4�٤,��������BtgAd��‰r`g`�dp�����X� ���W8tB�f{.��g@�J���#:�Pp�+=7F�uAy8p)7�9�X��:�4(rȍ|;�kv@x��\_����!~�ã�!�/�Xk��Jk�G��5����W�W�Isq�_��7�q!<
C�L]��M��e��`�?o(���U�'���H:nXX� ���-��`��
Zw��H�r����M���I
��(M*�s��7%qhQ7\�ў���"Wnb�B�!l�o�/^h&S������

�/�������a������فi�LV�?��&�i�P"ӧ������5�C�� 
��Qč.��p���S@"��^Z�U8��k,ݒ�jo0��?r�G��3#J�>!澁�V2l�ၡ�.3vz��89%1���nr$�W��\��{$͹�����?PKE��T����s)pip/_internal/utils/compatibility_tags.py�Xmo�6��_qS>LB%N۴5��0��؊}���h��$
"e���wGꅴ��u�G�ȇw�=w<:�_y�k�9�2����a+�>��	^]���eQ1-�D.�>���GA�F��d���e-лJ�+hGJ��c��,Y>��M��Y�*N6��dW,�f+\kD�V�#��O;���_�V26C��}H[�r���v�2+���&RgD���U��3)Y�G7�K�*gz)���(��&au�N����1#r�A�����l�āW�2��9�R&Z&�̤�ѩ%j���!��E��A�zj�9��e��Fqh*���R�J��J(��
�b3�i�� �*E�
g�1�^,�κ��5$���1��9�/�iK�N��GFlF��Ȳ����3���W����,�
�
"��M�¨_H�����	
J4�LP�0���™�~��(S[k�A��[�S �T\�^�)Ű�����29�Y�@0�W��-�3u�z9���]�����c���R��?�Zq�36`�ktR�!ǁ]?cFɂ�5%`.�ygX�(-�$��F
wp�a%eFҩy!7�� �����L��cZd��e
L�HM��5(0{��]r{��ӡ
7c��2l�J����[H� ��C'�V����s���X4��t	����u+���)��n��W]v�\���ln��*�6�cBn�I���fIJ��oXk-�����e��f3�vk���U�����a����M��B*

��ҼP��<E�ߤ�Tv������e�Ԋ��"�߽��\=�.��M��^SY*|�H�d�T��u{�u��gg��6��B,��Y�7g�}���ag'�$�)9{�vj��w����{�˷�X
�������n��J!fQzQ;�E���� GO˜<��G�s~�p��y'�^ �3��f�T���%�f�TIL���#s�ܬ��J�3
ͷ�؞u�iW��hzX,��
���b�W���[��z)�O���f7ay.�<s���i߻�{�m3vd|�QXJ
DoWk�������(��N�ɩ��/�:+"�nd^�_`04r5$ �2hCJjPSZz\^UDةq��_�P�-n��3�a#�G� �F���Lp�`'�o;����z�A���癚�vj�ar@5�����m��I�|��i���k�#)���]/.9�~�ic��O��{��G~��n�����s�࿟\n�>���ch��܁B�@-�[ǻ�v�]�rD���K�,3�l/Yg�7�x�]�GP�҉��6u�>�G['���
��
07SJΰ{�SO�R�{Q�/��%���b�e�@��ұ׷������|P����}xp�̎�3��ފ<�ӏ)�=���[kA65��Ӈ�5��w�ڼs�쩇�l`�J
������|X�rn�r���v=�g�
[���!�>���o��Ѱ�����8��ۭ1�e~'�� =��U�ѯW��Bq��T����!�@��ܶE�`vo�#Z�J֮T4{�����s�G\"���E�UM������ߞ���F�!��!W3��`:�eF��zgΏF��<v=�c֡o3�5�~��~���}�Or�A���~#��=�PKE��Tl=���pip/_internal/utils/datetime.py]���0D��� �~��
Ra��В�J�{�J<����ۙ5�\S��9b3Ve�$�'�3'��H�ؒ1�(Lsʢ��%����jp[�n,~�ĻXm�r��)E�.�����ƆPFp��]Xu�Z�Gx�O�m9
4�&�3�+�#����PKE��T ��'M6"pip/_internal/utils/deprecation.py�W�n7}߯l*��P0b�5��A�"-�`A�$6�%�rC��r/�,-P�H"�zf���yv[S�
�o��mnQ{�%��>�X�
��'a5;K�z���X	/�vE����l�A������^��f~߰���F�g�а�f���}���o�����Ȧ(w�kc�FT_{(vh���a�
�qYvre	�A�ZKy��������<:ʾ��&ҁ[,����77����_?�\ү��������R�9x/���O1��ˣ�<�kH�tKc%e%T�6�Cm���wFSf�+��W�ǫ��6"
�����Y�+H-L��-:'�8��~��y�e$(2\���{��r%2sV�G�"������|(��X�/]�N"�·�)PB�5�"W� p�O.�˳h��濳��ِ�l�t�%O�i0���K��e��d�=[��U�u\��J�C�Ձ3h�i#����R����I̊�3	���:Xh2�u6=!�5���l�>Q��&E��|zb�8A�G�%�O�f�{�v��.;3ecr� ��.'�ZH`���S�0�ș��ɍh��/�l�ih�,m�a���2K��g��-{�+�;��"�6��+��$��8�}9���>���7:���F�*L�V�5MMr�n�·˕�K��QR�S�]�<-�_P5Գ�z�$�I�9�U��hF�}��I
(��i�N���@L=�m���>�#�D:7XZ"��>nL�j:'�V�ۉ�s�
���ɵ��.���hh��n�q���'RiV-�J5:%������64%�$�b^4(����8�z#�t�H��Z�12X�nX��2�&�=׏��,�ʼn{3c����ߘ����n��t���%|�i.�S�0�x���i*ԙ�;s�矠���lة��Ԉ�PmJT��3B0��VA�8{��?�h��0U�?PKW�. EBc�N֤�X/�M�S ���-���2O�h,��-�Sg̅"��}h*\�pW�>�2\.�6I�d�_N����^/��N���\/�L�<d>�����?�6���|:U��t�hvt��
�q/�&�+�i.q#v�7@E��"?R�V�4����xA�Qu!��E�Z}�w�k~B��1���'�?I�C��u����ÿ2�����?L�ς�̚�¬!rāӳb��?�6��:0�$�ۑ��R�6�7n~}��~�.���7��sL����K��5%?�!/�4R�������Tį��P-NSG�D��t���3;!S0���i��0O�I&�I7ӏd���̲��7����;���|�-.<��!V}U�C��a��
PKE��T&��]��)pip/_internal/utils/direct_url_helpers.py�VM��6����)
A9�%Vm��HQrH���
����ئ;�V��T0��U��vQ��U��Zu�~�|f�땶��
%y����}ViA�,�T��*���Š���]6�O�V)��}�]�n9�>���8m�|����[����qͬ�s�VQ.������n���fK�7E��7��PC
d	�+���=3V'컷���>Q�W��/��*�bJLßJ;����M��(;�VT�B�0��D̈́t���F`%f�v��i�5w��G�wl�\k�L�~��ىȧ�X��1�1%cQ��9�Η����e�������B	�4�V�T]'l!*�*q+h��m�u�3^G�Z��ʣ�ٯ��f��AV��ɜ��ŘC��Z��h$� �u�f8�;��,��R�B�<���#�cx���D�D�J��$SW�A���z�y
���b�]��2Y~���O/]���Βt9mD:���oz�I)��"�IA�4Ƣ��1S�„g����A�YIH�v!2Qqjڢ�e��qP�E��ew�Pğl3���YN7Ł�/x�h����,qp�A��u���I�_��
��
	�]�dʊ1�l��.�Qp��۬�߅&����l17�f��y`�f�꬐%N�$@E�Y,��a���g�,��;�Rz`O5�',���Uk0������W{�:e²�4g3\�đ���Vt��Zm��_�L�}��I
mŤ��G�88�)��=I�-��᪔�v��ܗ���gᒦ��Q���f+��;��`�����5��A鐢r�TY�-u�����sgjPx�G}2پ
E#ʆK.1��q�V�FIN'�Z���!6ۙ�
�) �{�Fq��J�l�����`�<̀~
�+-�o�W�Jׇ���Y�ޮ�������t���Y��������!w��n�9�
�U���O�JV��|��B���@M���.�ٻ�D�H��VL�r����PKE��TW��[%pip/_internal/utils/distutils_args.py�S���0��+F��V��RWBq�CE�3I����Ŀ3N�t�.���f޳�<i��"����'�/S��S~J�&��q��=�}��s�j+UI��.�
22<�Y���=l�|�:?�XX��j��=Xk�w`��F
wxoww��k~������}sr� $Y�J�5�j�!��C��
i�L���|���dX�rH�f˲o�#����a��9�K�k~�
w���A�fӽ�դ��!���?�KNV�u��^�7���!�,o���7�
���I�`:^�4����s�D`���B�R��I����,�޻v
�����x�}�{����woL�������xAp�ṳ���AG�ፌ�*�Zl��o��%A�� �x��^�l�F�����W�f�"��M��0j��i��J�\�NX�����R83����)ׄ���؝U�����?��K�7Ϙ"fK���펥��ԩ�RÞ��/PKE��T[w]�>�pip/_internal/utils/egg_link.py�UM��0��W��m{b%�		-VK�&��[ǎl���zf�8mP���I��7o��e����^�5T�mQ{pӫV[��-��3���ώ��-����p
�[Y���4Z���r�$��`\|���%�5-�C���G�d��dW�t.ZZ+��o�h�Dz�V��-�whK^;��{�\���B��E�,��^k
��uMG�E�=~�ڔkeVB-�<I�R(U��n�a��u���RT~Sr%e��Ń&112�K�����L�3+��%P���?��4
�7F�pC�Т��vB���FA�K�Z����ԁ2\Z�ή_9/}�A�p�mץEgz[�{�Ȩ�)AWlU��)�=B%�6�+¯F�J(�s�Ya%xGz���Z6
Z֟2kY��,��4=
�*Ko��^~˟O�/���t�"?9\B:���d��*g������9���R����T;k��Gr�BmY�tX����U�$�@��`�9z�w�m1�O�ʌ��S�f��b~d>y�f��ɢa~�?�E�=�ύ�0�Q�G���e�P����{
���?��4YؽtT��H�;���+pja�q�Y�r`����c���u��@:�X|���S�����FϧPp|�x�,�a�o�s����q('�c��Ym��749��2�i��g ��*�Y��xC����v|�>�c2����ixO�����԰�J�}�|S�c��� ����w8)�c�.���N$�
y��l�լX�F~�*�kf�3��fF��O�x��x�La��7�%�F	[����9;C~PKE��T���pip/_internal/utils/encoding.py���k�0��Wꋵ%�I C��.��
]�� �r"�HF�	��w�7a1LO���~}u�8�J[�U�s���R9���M�O�d�R��S-�:�J;���Ƙ����؛oI���f��4�$�	ۂ��?��# �-���n�'�����㲇��V\5�ͦ4��g��ȭ.��b˗���?_~lߖ(��Q���x�3�P�$^��%Lƛc�~��AP�Xc�k`��`���E�0��t�}���=�?��^�q�V*�&l��{ך�:A�->��sಭ�<Ϭ�2�yo#�q[k^r�-�p���*�A�\�����a3>�+��è�B�_�vG��f��eښ���#�'���҃I��qu���St+n
�^
7`)��Q�8���3���r=��6�˙�f�J�0#IhOӫv���\�d��\�od8�>t�?�����C�͌��A€T^��WT��#��VMmB��fr!����7�>�,ʊ���3��o�PK�mW0Q���"pip/_internal/utils/entrypoints.py�V]o�6|ׯX����Sr@
8��H��v����$�b*�I�`��w����wm��P��ٝ�թ�3֓��zc��x`6O��j6�[����%���r~F�:��M�t��r����hT�
��~>v����0m'�x����O�n��$��z����ۏ��W�nŸ(�,<V����RZF��7��%w�#/���w��F>����1+Y��K�!��tFi&d���-�@?;�'���M7Ǖ���7��u֔}�'��cl"�]�$��(_Y�u�N��w�f�,����.����f%���Yq��h����`�c�i����[�Ѐ8���$~��P�wY�#�����5+O�p�[��h8`vB|��eFoe!z'�T���X�*�&.�|~�~��`�zFm�x�5�>�}�.���RY
FW�3�Kj���ӂΒaE৴� +���u�B�LwM^� ;��^�H�5Kp�e_�\*�%�(Y�����R���V��ʵ���{���f@*��`���N��[�ـ�5����M7��$�8�2*S�r{�\$���.@ ���C�D6���$h�76ٸ�Ep���f+�N6oB��o�.��:ZȰI��)KZ�� ��
�:?���۶R( ���jx@U�ﭤatYP^.�g�)�&'%��wn~vv�|�/x�u�N�!�,Z��իׯ��˥Bk���z�^��f*����l��Q�`k
t\��
�0���NNÎ<	V����:X�;
Ҭ�2�`%ڣ��
�?v,�/��9g/�F��sf�s��a3���}C���~�އ��
��B��HꥲF�x�F+-�v�G��o(�
�����$6����Y��1&Nܥa�7��i�h(����~��~�Ԣ�����+��J�c�v�*� WZ)�x^�R�"��3��#�,�ٷ��is��<�4��a�s�N����'C��]Tsp��y�yt�WSeKb�g0���
8���3�3de0��k�Gd�Z�d���E��A /ȱ��J5�ɱ|��{��k�lS�t?l:?@hM��ɠ���mgh0����aSR��>ҝ��TV��?�aX	���}��hx���=�����ff��S�m�ƌ�([.�@>b��^�>�	mS=���6C��3؋�u�#N��ѿ��q���Y?^�!.Lߔ�ģ*�w��P	{��n�o\��$�PKE��T����!pip/_internal/utils/filesystem.py�Xm��6��_�s?Dn��f۴�|�6Mz��b�A�@I��]�TIj�.���3���[�lK���y����X�j��\�d�4n��5�,ו��Wn�f�5V�ŃW�`ݣ�Άk�6Jy�ij�D/�oDu#���<��v�ԫ^�'�K��RC��U�~ZX�M�o��}��蔕�Y�od������K�w�5+��=�M����WBq��r��Z>�jjEbVs��^*��f�h�V�������:��^�6qΝ�S�f�JԬ\��.Z1[�,�����.�ٿXa���1|�bok��2��gk~/��;�M4�Z0Qע��35nJ�kJ�\J"���ϔb���;�nbkX~[���e�.*��|g�➶��K6�J��Ŝ˴!���&+���>}��jvc[�n`a1�X&/\�">o����ul��-½�*���?��ĸ���)�
�,�q��B� L!H[+=/`�ر��Vh�Z���)F���E�|�t4����
1ѕ�jF̘5&�dR#h� {ADP�a��1Զ��kaEPw��\[��~mZ���j�Wّ6�ؿܮr�i!w�?��h<�z��ZcO[��+'����ܞ��ֱ�N
1�%�pp/���G?����Hc��l�Ł����v��SԻ�z���ٿ ���W��D��~��uc;����ܮ�%AZ���>��F���������gd�L�;4iq��d��Py��8êA�i�E��Nc/�����Vp/*�
]�C�}��+�,Dh�']U��Ŏ%�Q�v��q��cғ~խw���2tz��s@v��`�l�*���{����.:F�*��q�Z��8�h�e�s:ޕvy�6FTb�*Е��\[��<C:���>������)6�VyT)�X2�C=��Q'�PU�9<���ԁd��jպu����M�v�Lz�J�d�}�nz��\]} �D�s�@�FIȩN0��X�"g:�K�r+���
c��K�%1C���!A'/���#Q'���Kr��
{�����F܎��=��Hs����vbc�R�7����>��P`�A�{�3��
�! 6T���І��p�$��X��(�����#/OY����,�h�������V���!ώ���n��´�7�#��R�U����"(3L$�M蚦���N8�S^>��	t%#��y����'�5��G�n��3e�Rjx.�`ʘƅ$��8�q�2�xEބ��1N>̏��Gj�-�+�yBU<!rz,2�5�n��K����|��hW��E�3cW�%N\�����D��+9�	�뿰p��`�GDp}
�����Z�F�./1yr[�޸jּ>h%�Z��;�Ѧ��:��ov����������?��T9�R8��D��|RQ��Kߠ��[�e�0Y�6�Ƥ_yqh��b�JL�3��i&�O@t]E5"����¸ʯ�x����~��M�ӫ�&SM����^�Y���E�z��8v8@�	�:
��" �B����m�٤��sC�lv`�g�)��\������D�N�+AM4#�;�x$�Ʈ`s�Z���eľG��݊8+<m�Q��C��6�%����{$b�
�>Vxv@�'F��������S�](��)���۩��6'�i����=��`��	�~��*I�x�?���!g����L�C-��iw�&:�����J����8��8J;�٨�4G�[��t�p�U�t���|�:��,�,��I����3�w�ޭ)�+e���g�8�\�~�A?�h)���#�}���!c�uM�w'49a��87f1�0_afƘ��AI\��TӢ����I7��9�{�foC>�P{�p�e� ��)~C��vχ�Hѡv܋O}�5���3C�ė�y��˩�ɻ�d_g�[��o�$����0ǰ�:�!%]͑X�?y�N�������7�I"3{Y��+�"�d���	E���PKE��T��O-X� pip/_internal/utils/filetypes.py�RQk�0~ϯ8�d��Ga7*
�
-�P�FM5�&%I����Zl��Kr����(�C����H��r/�f�RJHbM
�'�d��!�3%�?��X,�Vs�r/�c�t��2%�8zB>Ga��_Q8���&������y�+�����%;�ynٺ��.V�uA�5�UEOUz,h��o�x#�*L9&2�ߖX���h0���]Q��on��`�2�
,hˁ;h��hM��	Hs���o'��S�T����Q�j�N�ϭ���#	�J�
	���h'�Š-p�5�9��d���(�ކS�`�d���'�0���u��<�"�4�!WN�_PKE��TR�=U/&pip/_internal/utils/glibc.py�V�o�6~�_qPXd�GV�͐k��dhھ�AI�M�5�J����Hю�8,�D�}w<~�O�ӎS��T��R��7��Nu����浺�%1,��S�����s�l�y69��o�s2V���Tk�j����I�'Q�J[Rf�dz3������o�_J��V�qR�R���k�����	�~=�����_�#��^�h�JIi�V
'QQ�,u�E��Y�w?sS���#b���M�� ��;�C����Erw�ِ:���L��FNFK$��	ˉQ.,U�X�q���!���z�ѕ�‘)�����>�Y�ؐku���Z8��� ��m�"ut	1�5%�%�r�M�V2[)]S��N�󰼳�5��V�]�#�z�v��y��R�󪨖�bq�W?W��bQ�)oV˪:-�|�\�l��-�k�����?Y/�^���ק>8f�\..(B���!�g�����q����v���f}��r���۫��(	�j��/*E;W��ll��z��Йi���s��
�Z����w���Z�nn��&�a1ya��G"�Fa�LH�KN1��"Vҽ�L�,{�Z�=l�M神��Ȝw��)�����3X�Kx�?�J�A�j��D��n=��T�[�T��P)U˛���z���F f|WP͚�m�*�7)EWUB�Ak�L�9uNC?
���к���t@C�Zm5��М�����8R4wP�R����\�Wb9'�ـ��Ŏ<WU�n�����ߪ��@��y�r7-+8h��LϏb�t�-���9��Zv�p|tO�?��m_�Jb��4S{a��6�9
�SW ��;���(�a�?"�%�qt/i(�R��^
�}�7�ܸ
>V��;�7�w���>@r���{�f|����#C�g����9u��T�i��[V�B�<��)����pv����ᶓL�S�J�L�X!�������d�>� k���� 쮳�''� ��'F�*;�YA� {�_�;4r�,�8I�!���Ӕ���&OaO�W�����ЮVwv���B�%�f�.p�n%~�s�>���e��-���^܌n����s�`ڄ�A�Y�4�d��X��a��W������
wW�{jEK��e���q���p5�7,�;�0����"n�윢��� V��*��Y�ܽ9�
��24'b&�#汸��]����E�pǂ� ���Q��'�Ɓ�}k�Klh`C1�C;	}�P2�y��~o=tn\���Rw]�ۘ�&�g5H�wZx�
�oݧ�nh@��
�8�0^�p_�����G���d�PKE��T1�_��pip/_internal/utils/hashes.py�Xmo�6��_A�*���k1xȰ,��kR�Y��lZ�m6���T\��߽P�d9{��-$�|���sǣu^��F�M���5��Rk������.f��o&W�G�']H��\��+����xe�"S#�v~��.��.�S!�D}NU�)\�y	۽�.�>݌�7�^��2��/�5�b�u�\��F�J.g�*��`�W]�぀?�	���f���>?W�F����fY�j	��y�2y�}XC��vbe,�I�t��{t�7"���<�,R��`�Bg���V��0�RYQ���AYG�1+�n�7����톢&8��ۍ�?W�h�eBfk�X>���D�od�V0���nT�`S���
f�J�!����bk����
�2��J�욓~>�p}3���]����"r���ˈ^�\�a�ϑ��3�ҋm}rB�
�D�b)�s����u^Y�d��7�*Zi
�Cz�)鼐f�F��X�@���a&����\_�&���<"�Ͽ�6<���Ytv��t�$��(��3���,ɏ�����҉�ʼ.3E���)RE��LR΅\�F W�0��dm�R<ȬRnP�K�3���Y�T��1���y˙�Oww`��d(N~�f\#���RZ�7@gb	P�&B����
^��'Q�4�ۨ�����u�Oŗ�͠^՞e�0�$�4R#q�v��$ګ����dκ���]�>ء$�m%8����(�>U���3��S��1���Ũ$����Z�4�3�;K*�P�/�o�#�d�����֍�,�\����� @��;e�J#@]F��G��6�h�������:Q	P ���\�R��`(�,��:�\�0-y/F��S�C�njAo�Ʊ��	�m�5l�S\�?��
X�jZ�����Y�mW��"��tؼQ�qmjJ.�iѕL_ĩ���T�0�e8} U�X�k���5(�W���Kk���]�XN�Yj�“lI�PƇ`���LqH�!/=>	����}rh7���SZ5n�5h,��A}�1*
��1Y�����8R�p�TѪN��L�>k����Z#1�kA�c�zhC�%�2n���b畻;^��G�iP�!����3��L8�g��j)�L��p#1�M'TM������6Þ��]�u�P���G�i��=B��{�[������#q-=9
,Y��'�U�kA�.�L��/ͦ_��c0��
��P�ѪF�}>8-�J���	�`����\&�r�+�5����#��>�~��7mI;����[���X�Qݞ��1�S^�!ɐ�f�Jg��8nn�4}$�?�4�\�uv����h���$1�>|�Lh�7�L|ܗ���|{(���,�]@��-��349�R��nP����o��	5�����lhΎx	��l�>�G�#\���蘗�
���&J95��#���(J>B+��04��qZ5�b�78ч����$��ج��s(%�"쏾Lovw��m�ܖ�e>4������{I����V�r�|����z
�X� ��T_�Bp�
�T�#�e��NZy�K=��$���5t������a5�S�m�l����� ��&u7;^�^�=ڬV�'��9O�s���u'_��w�ASY��xS�T�p}�xk�"����-J�oX��ĝ<�pD�y
�:��/΀C��S���kyh��
��x�4�2��/��Z������si���}�
PKE��T���-pip/_internal/utils/inject_securetransport.py��Qk�0��)n�K�p��A�Ƞ�٣N�j�<k�u�IN�o���dmia†;���$�gh���Q=8�ؚ��*(��l|��
ȃ��P+�mqN �4�v5y
�����9\A$@D�s��g� ��*�"`A!�=����%��4Q ����Mx2�3�T�k�O��]��Ty��S�Y/�y��(n��$Eҍ�'3������U�$J�z>�T�ͬ_��(��Kx���Y��L����3�T�ͨ�{gbC��KHj�����񁽚����Qp�>T�G��v7�įk\����by�Z�z}f
N�?6�ʟ���:�����-\]B��N�T�o���0u��^�{�5��9���+������)>mh���,_�~!��7�>R9;/��~o���PKE��T�s�w
p-pip/_internal/utils/logging.py�ko�F�~ł�Q2��&=zBU��8�q�ؾ�
�A�ĕ���qI+B�~3�.)�vz���"wggg�=���MQVlQ�\er>�zD�e^ؗ�����]�5^�<�D��x���=V�R�W/�b�R^�Eƕ�7�!da'�������o6�ԓfk�Nf���vo�$ߍ��3/���Eɫ?HU��Ŧ�Eγ���w1Ҩ6r'�"O�2.�bT�	�<1��уc�E�U��K@��-h�[�c�B�YeF`�7HED���*���K�y�e?6�;Lĝ~ԢX���Z�]p�_���]é+|�*A�J�{\W2Sq�X؟O/__\��ٝ�>�-r:��z�A7g�o/n���S�)ł�l욷�/Oߜ\�]�'?]�O����?�Q��Zص"Wu)�T��� Q��6�<^�,�F��o�b!�B@8@���Ԁe�F#2��,>���J����iYex�y!H͢	iJZc�T"eri�~�A+X�XԥbKx�V�)�	_@�mW�em�a�R�d�Tɜ�%@�HQ >/"rBV3{͕pTݎ�OXk0bG?�yQd�d���`Ru	�@�)EU�9�.k�"8`9���n[5f�i�Pb�-x�Ԫزzøb�g�?�|``�+���ӏgO'Ѫ�6jr|<��T��U�"����X*U�����W����?���*/�2��ϔ9��J�9�B G�']��#ƈ���	3����b}�13oxԗ�6�;6�k�s4 �!0��/���+P�W$�g�E.Ƭ�{�V�#�A�z�X���2`|���3��ԫ*�\��A-Q�x�#d�}<����x!SXPŭ��;R[4�#ŗ��8���ںɺol��xBU�kd��"K�m)�d���#�I��
�k��?�*��ު`̾i�M��;ְ���Y7bP�!�$�\�dI�������az}������U0��,re�$�;��r��^������iJ[��̈́��!5�����%f��5<��֚�w.4^H/�b�H�<���z��Ɇ���:t�hJ�Ĉ�;��d���RT]K�Y�~��Z!
�1.�2�
H����!'����{ZC�F��}�5C36��SV!I�-
��	:�1�Ľ��̞8�����j�#�|nI/�o�,D_�(j�I�sx4���%88
�n�� p��J��������I���r�k}1��PDax����J��c�͎� �ps�����"��b[�yz���(>�!?	X�c�b�O�f������|p;���9��yF�e�Dk���)�%
=�$o�*�#y�����mfDA[(p3�Z��C�-n�,�(%%��S%f�+M��Sg6�h�m�	��A�ۏ�h�YD����~�̍��0�x�!���-�_	V��h{�tw�P���K~�*d��r��iz���3�M&+�V��Xtu��;��ME��.�6��
��S鄊����#V���"3W��B�d�N���"���x��Q�+�3���
�n����S[)i�%��oK,���V�E,�P˘H��z�u��C��ܫ6�����jS
�^eh<��N���|{5q���V�3,�g�8noo��۞�B�HW��t	�C^�`3((F�$
{�u@#��t���f�wkpO�R,�d[�͔�z�B��Y贓ҸIr��P���&��}ک�C����;�U-�!��$\#�r]T�1̮�'L��+�-�OXm��;x�5��N$�u?+t����'9��Q��8�v�Ľy)؝���Y*�]^�J.U�H2��8�Y)��W�k��+����IRUo2���L����Ǜ�]�ЃܲCP����G!��N�E��X<��[0���Ofk�ߘ������Ӷ�h�����+i��p����Q3��Dà���{�gBm:�^�'��f�M�L��m�-��!�,[��Սj�l�p�����?L���Gw¦�	j��"
�=p�=�Io2��6;�e�6����[Z�l��mSB�
[A
��pL	v[
(Ge�1.M�:���H���\ۧgC�4֝,+Y��/wN�bz
�n�i�ks*V�*�q0
U�Z��/�V�G��IQ5k�b�������m�ŵ�O�f+i{l�-��[�J@�
.o��j��y�b:��#<�	�1yl0�
�Vb���f��3��܇��ƶ�f,�W���[螠�ݲ�M�6��]b�-��5������d�3���XK1h�̐��-{�Ot%Iz�Rv�>ͺ��j�WIٜ�Wsm�V`tYT�QxG�9T��$�j�6,)6��!��+��M:,T��F�9��x9�J ~��ru�D�^�!~�?��ѷ*���ik�q䧚�B'Q@2̈��:T���7-c�������̝\PV�B�ٻ�t6���y�lz�2�)�Rs�o��ABm�KO�kF^�>&�%�В���ѥ+p��q�<L=.b�s��&��j�_�&1�
慒Վ$�M�Ǭ���:�h�^��A���n�ȗ�TX�VbӾ�.�+GZ�;S��P��P4�n��?�l%��6Ȋ{�բ#��V�9�Xk�&���Qm�q��掌��U#Z��zN�9V�oO_��=Q4oV����js�5��hxa'7B�4ݔ��-�����7�g�goN>~N7���݅�sfo�p�=���UChAYU`u�4l!S\Pg�&���:� |AI1+"��dث$
�7�`�9y��*7���s?o�Z�]Ӱ����V� � l���X��ZA��Qǩ�?Ρ��zlB*ʎx�sV0x��Q.�Y�\�{���^k���LK_��[a�T9/y)��\��D�;��*pMPLUf*������C̦W����T�q�����]5%:��~̯M��S�`�����&��-(H.��pLC=�_��ˆ�N�=��W���׀�)A�>�c0�#��9[;��ٔ�G�j��^�7���D��ki�t�ll���yˢ��A�0��I�}؄�l�R�T�n">K�G6w�
@{:/�s8�ށ&M�O��̱��E�a� ڙT0��CZL��|�a�H�+�]R�|� �]�=J����ۅ'�G����I{��=��C�CWc��ƀ��>�Gۿ��]��8m�B�����N�gͽ��0n�l��~1㭓�g��Z��s�E�a?9k��8�uطCf2_X�Z����{Qhf#���I��h��QY��䌪>O�:��I>���k�տ�׿;_��4,�BFm��S/��=���X��C�;�\�g���~Bf�xX��q���&Y=_|�����b\"���KyJ	�#�,L��)	�|Q����Z}7DS*2��䚀}�uc��*�z��eeS��H�!�������Y+���k�̓��>�_Ǝ�PKE��T���qTpip/_internal/utils/misc.py�<ks�6��+��D:���lf3^�!�*�]��\N��r��F�&H�&.�������&u�����$�F��/4�H\��X�y^n�b)��z-�F�U�橘IQ�uy+S���r-EUfО���m��2:x$��j;���ysTVMVI>}��Jd몬@^4�ɳ��"�(��R6U��y]%j�f./�K�ռ��GU��J����Vm��I�����:�a�*���E]�a(���|���k���uS��2͋,�O�d(	~Ϊ8/��T
�i����u2��d~s	_m;�]����؆��eV$���5�}��y2˥~cf~��R��k`>?�U�N�R7\�]Wz�m�dJwz����.����Lg$�{�>�X�	b	xVUVE�,Ҳ�*Y=;����
���,op:�ޅod�̳fkzԲ��!�^Y��H�S�'�e�dM���dڍj:ŀ�V0�8vFɕ5L0�wsI��K�~R��u]�c=�r��:����䧲��Y�xc}QU[d�t����ׯx��6��6�eqk��J�)0�k?8�c�e�������uSK���xi�*�X�[�|C)l�8�j�%Q7��3.�(�u��*����;�E��S p���jXյT��W��Ҽϓ
5I�&-[;�,|u��:���Y�Ȼ��i�-�Ȗ�f(eq}pp��C�&�B" ����1�� ���e�.���n~Q,J����
��L�<7bt��{����߳t������>x%2j� �OC�h6'~��z��8�T.H(A��0��8z�JyB–�f��J�E?�B��4!��ې����X���_�iV"<�߶.����ý ��_��6�����X�X���
�Gu�q�6�	4c:�4�3X
���>qW&��k���j1C=�3��4"
-_�@ S�j�����O���Q4�(�]�����l܈97���v����XU���Jγ��b�"r�<)���J�[M����G0�"[���T���5��&C˩%d�c[�W	�T�Y$#"?�z�ψ��B�s�d�IN�U|<�q4�3�����|����\M�\�v�K�s�l��Zt;��#'���a����ur#T�MR�6�.�]F�_`K;����'�zҤ���wdE���<?d`�7���N`A��:+[%�_��<�����ؕ���;��G�<=��[x਌��M���H��t�� � F�Ю�k2�w��b���f��IӁ'%����:pi$xps}/��&��-*£�H�5]x����A�x/�ȶ{Z��8�Gs��р�9kI��Aҏ`���١�<g�G��g��'!A�����P���Z�j�'���K�}�fA�m0;isЁ�\��5 Ee��UMraݫ���$��e�Jv�C��K7�:�$z���� ��@/A�˘m"f���R�1�D�A�i�-D��OS�A
��G�=9��/@[M��~�#DOl�ݶȷ�V�ک��ɯ��B���+��H�"�1$Kң���+.�f%Þd>�Բ��bY����uA�
�܀�?��o��?�L*��Ԉ�j�i���J.�0�ˊVZ�"
|X�q��]��bDM��`$@�a�b���u�J���E���^\��)*WGe�!h��mv�rC�Vo|y񎲰�]�-�!��:�f�a��/�U��K��c�2�v�[Pp��)���^a�����E@GO;���W=�����X]	����E��p���(���B��hPЊ�Y4ޒS1ߤ����V߮=�s�/�c`���>������u�P�T=����E�d�S�4�y�/Wh�����\���̨.(r
�A�DHgɍ�ø�tz��t��c-�ho�=��.�03у�;�O�Y���Fn�a`ßj����)>ӷ�*Cg�'�8`�wxT�t�Y�>F������fČ$U�"<�,����@9��+}��p�����@@����r�ޛ�71���/���x�

�jTߙ��E�;fhʝ��mI6z>���&.JP�U��淫�ߒ%D=K�2ðCPGԷ	��d9���t_��/^����u2������Ml�2�l�W�߾A���\t`����}+���z.��wt��O�$��uC�;Ji �o%+�Î�%�*�.�a
��iǀ=���AF���1�te�.L��?�Fi�LU5̰�ĉ˶�0�>��ZD�c>�]+ˁ��v�}����m�19��Zf�^��m��i�9�y��w�lw��l?�^z�A��P�ڔu���H���hѩ�H���q�=L,bG�g��R�r�]PN6�V�nQ�K|�8
0"��1�����Cf����;���G*�i�@�oY�vxz�g��;"� �E�����baz���������^��P��*��
'��ԏ�v�-eI���(���i��?�5�&��e�O{ʎ���-.0V���Ch�~2��d�s�L�_xY�d�^$v|>�l]ψ���g�w�"/��/�@05������D<������tq/���nn�vL�щ~p�H��M����4E�q7��Ƹ��@��d����8JBת����R��'=b�K½Ֆ\�І[�&͊�
��q^����Jﺗ ��.Y�P�	z��yG����,gI
��d\�ܥ̤\\�́o���[�ɧO�}v��g�>;�n�'�x�;�
DDN���uR�du�3x����	w±�J�c�urG��
qf�<a�8�\SH	�dN�=G��Q��yƤh���V5DH�CATk�9N�B���5�=1�"�`�^(��Q�8~4F�I�� ��B��|��r��.���j�^�����T�-a~s�F���Ғb#E^�ddX��\.�����s@���mE�b�u�E���E6�lq̄�4_,�L�
[��*A<H*߷IF�#L�v���~��Nʣ�Or�R�g`�`+��txB���T�Q��D��Z�jW>�՝����{8z���`#�߀���AT=buX�A[�(v�p�Iw�J�;A�.e}}��ᄍ��������=? ��'�W��B
	�o��~�d��*�sص��ҤI�$$�������rF� H�8�2��8�n�D;І�#����|X\D�{3���_�D�휕��Re~+c�]�pΦݐ��~;���3x?YC����Ib&\�!SpJf0H�H{2q�C8�$�
��O�dF��:L���K=���|/S�J�Nn�!��OT*�9�C�fY�
���o辡�a�!���BDM���03ڔ���S	���AX�A�rz�C���������������Ӟ�����Fǿ~��Z�
��F�ɛ>O��Q�I׼�R��6�me7�#q�v|m]�Y	>D޼�\Ĭ�V�y�&�ju��3@����'A���*I�A ���5�iL�"G���br��n�^�U�x:��O���+�nc�C����߷��5�;�\(Z�"��DD��.�֍<�L6�4�����!���t�O�18N�@�
F;����H�JZNx�ѷ�V�_���Nbf�)^A�N]ѩA�jR�G��*
����0�9P��M�|
l�rB�C�qR/=v@Dt�
���s��;�d�C�T�S��)DŽu�b���@F9s��XKp^�e3a�w��9���b!"��؞c�r9�p[toC���w���XG�H?���v��\j�o^R�l%t耜�4�U�Tjr|��Eig�똋����8Q�����3��80�fk�`����qb]�D�C
'�P�-��N/�"�H?������h�`T��m��e��|�u���M����|�A��1�d��5;�t��H,bJ�Oe�'s��@��^����y�%���G@��ɿ�fǪ��6�8��"k���&~�� `���S5k�Z���l���W(
㦏�����r���wO/���<rO���Ꭶ��`I�X�_0�_�n���|E2��U��ѱQ��#%fc�
gJW2��Ck�H�Ag�f9j��[xC!*�~���0���a�7�������[�H�X��à_M	�H�<�5�!�-�Zׅ�k����[�<1/ɺ�1�E�i�V�|
��0s�f���8�Xm���k�qx�5G��-�D��-�����YƤ�,���}7���1�k`�n��E�}��x�@a��fyfm��qAes��T��,Q&]����c�/�Fa�1�t��IVM<�"+Ǧ:�bW�M<��e����o@\��7�ه-7������N�3����'�7���ϻ�����=Zx�u�i��z\j��%5��G3L�WR�<�$s�{��c�����~c��v"�</!���#�x>g�z/<��i��׫�W�w`|Z`�Lˆ3d�G$i
ў�b�N�X�v�Gz$�!��r��q߀^R����\O��G�d�;{��+a�0�z`)um&��[��=���Y<B:ؖ�H��:�{&�����1��8.oWV"�@G3����0\Y= h�
�|�����V��:����p�LR
�u��,z3�
�n��d}*���$�P*$g]�E퍇/pc��!�s���@�)H�@��rv�˖ߠU�<Tf^�|5C��a'�5���T��f�/(6~}_�!>w?����of�/�j2ªd�dŀa.΢�g���+�%�j�Ǚ��n��O
�C'¦�]X�o�F�w.��m���v�6�����@rl��L�y�o��h��씳O�ET�C�J
���b���� ��9I��9R7�y�[1���$�nG��vC2��A5%�{p�w�4F��~P�ٵ�E�g��.�=��k�`:9F
-�Q
�P��x&��d��?����T�#�ϩ�y0:e�L�V�4�C*Ć��7�K{]��G[/�O�؊�'���C��X�β^��ʰ(k�%���i���kۨ���K���ud$8>��/�|�G�0X]I��҈6F�b�	7Y-;8�o���B{��1�I����.��	'��Đq�!�$h���oL+v=�u��'G���+C�>b�����$ f"���d*�{ba��R+��#�*xG��u�ĥ��8�mag��9F�+�E���y}R��c���u�����anw�u�?�+�]�NO�ܣ��F9��g�c~�3<4+����FZ��6�at:�-����Uч�����q�����R��~��h��5�I�~R�͚��Ki}f���ɨU[��1?��&fr/�\�|�@#��KB��w�Q�vf���]��"O�Jc���X��\��6�ҕ~�_�%�>ǯfD�r8E\����-Y4H��Փ|Mg�����,0�<�iY�3��l�� �=�DL2;�"���+�=�
Jm��34և��q
�����[C���7p���_�٣�D<�� $"{�S�B�b9��{˫�$�Sw���D���)�Q��3�`�|}DvU���$��d3��(�i)�V@ߒ���ܯ�"C�`����M�DF�2Ǭ�g�ߵ���TƜ�Թ/#C	�(��ܡ�);���yg��bH��f�O[�n��U
�䜯��u�f��o=��/����\�+v�p�06]������P��A������^~�ۇ�����5o��'h�0Ͻ�GI_�y�>dߝ���᯽+M�xY�����].�>^D�L�-\4Ҁ7T
�k�m�r���J��9^:=��3�!����J�RvfG?��J�L��
��uN}o���k����8�˖y��כ}��Ε���|�Y߿(���0�K�ev�S}W�$��6݋���k��3DJ�A�%V(��4;�������0�Xt��!}_�uН��At���)F�G��(L��n��_�N��d��)��-Q����V�$jE��������T|��8;q�=
�zכ���#�P_���?:,�d���:"�JΞ}�ӝB�u3�Fj�w���:��<lu[�U�<:IZt�c���Щ�Zp����o`c�XO�"/A��q�U�U�N�I�9w�YI��JF������h�!$���6���x�O#���a����/h��|�L�˧'�2�p\Ԡ�c׸�u&��Q�����[�όhv���r��
tG��(�>����B�:�<
�QWg�􄞞�ӳ �Q�N�ʃGKwo�ܲW��f󛬻OS���u��K�3q]�����MO��]����8	GC#H^���t��B(��7�(���������s��Z��9�;=	�P��D�����'F����g�S�Y_OCќa$/�8����ǹ<.!6_κʒ��6�?��x�=׺��s���<��hצʶ�S�+@��(xO鰍�Ƭ7�r�,V������(v{i�����qT�j+���eI�a~aoJ�&:�%ñe.������{{𠤦�-kN[�=�ƫd�a�r������w���Z6	�]��t'0�+��s���
zAFg>2�p8����]⧻�\?��p�`3`���CF�f���b�t�1hg 5I\�#�lw���a��ƫ�T18a�/�����q�A��==G�ڿ����f�{�ڿä-����dlw���2���LL��cp�r4ܽ�n��\���"	{]F�Q�}0���=SK�K&�?f������PKE��T;��w�pip/_internal/utils/models.py��MN�0��>�ȫV
=@%��BT,`E��L�l����$i�����ޓƜ�O���
�d��Ze�B��1�d=P�Vz���ԁ��w�=�!�g���k��c�1Vj����$V����Sf� �@��^��rd����]�VzP��*���+"�p���!�b���-pq�#�^�C�5��b�P�Ydn��mʒ�k!x���ؑ�1O<����½��EB�aj���=�Lr���E�c
ĞՅ�z����[�)m��q[����7��m���7���,�7���,��M�7�;�
t�[���ߙ��9\E���+.T
��S�yiʓ�k�>�M�ȿt���NJ-��.��`~��PKE��T�L���< pip/_internal/utils/packaging.py}UM��6��W��ʈM�
z��-�Z @�	�=u��hi$sW"U����H}Xq� �x3��͓j;c=U�.�1�K԰И�V���ZN*kZ��4����ݩ�
��2Z6���t>�t�ّui��d�$���P�b�6t�(?�%,��+�-k�&���$�5������/�J��rLW[�
9o�I*e��cɢf�w\K�L˖����+*\<ec.�N�`t�>����{Dy��˔��n`�^i�!!�C�������Z����TE��T+�A"�G��Hʑ��ȃ�GVgnE�v�������l}ȆLE*�j�
�m�c�>�|4v�*��5s*��Pʢ����X��7�z�Ų�-h��l�kt�+�:\<�����z����7S��l�s8�MG��(?M���]E�E�r:H0�AG<MUP�mj
��F�ѭѼ��zEwHxP/��9�IhC����̎�>���ln'�z1��}zqg=T?L|^O�b���d��x4J���R��k����d�����'���WDc���P¼8��?���c���m
Ud����
ñ��yF������#'�����(��W���/B�օ^�K��A�h�+P��˅�2� ;��b	y�RE~�)U���m����J%���@G���}�o^1U��Z@IH�e0\�,�0�͐�����rT�G8��jA{�o졀n����`uc�q�gr:!���-�N,5�񻽜L�Ɋ3������3��a$��+l��"S��萴%]E�+
�=h�F��څ*��[�t	�٪~G�t��L#03�2�c�ʮ6+�`� �7~Pij<��s�x�q9�M�VԾ���Ū"�_oy�=��3�-��@�>����
F10>wŲ
V���D9�|��T��	�u�(�4�~�[c��9��;x�p�>]���#�_~�&���\exDr�"V���PKE��TH6��'pip/_internal/utils/setuptools_build.py�Wm��D��_1�B��؂�����*W���C�|{�,���ur�ߙ����-B���ɼ���̛��Ɓ=ڙ����jV�w���@��(�[�e�V�\��^��p6{W[I��,��J�#H�י`}8H���ui��g��V8H�B��� -l��K�a/���??3�s��9|n�|*[�`Y	�����E�\,�e��\y���%���u��!z���׷��@i�|�_�,���~�����ǫ��W?�y�J�c���g@Q5�x��<ӻ�b����5?>��-EC�^T��O�Ǚ(K4�@��%�"+�-Z��ԪC�^cx��'Uh
��e�Z〘X��ѿ*��KQp-�
�79q];Yڄ�ě�Zmn=�
t�Jd�b��ear��oI��eN�P�%
h�6�Ck��EՏ��b*�"oJ>�Ezn(Oa6�w_�on���єG��M���{��8I��.���F��(��R�6~mfd�V7qv�x:�^��6�B��>��0�>W�_��P�@�ҝ�E���s8���&�B��A�Th�kP�\S'"�`��'~�bkEi�R�}&�]ris
ܢ�P��ԙ��kO�W�>�3��_5‹�6a='��ȶڿ��͛�7+x)T �FMU��_Rǘ�]�,�4�
��W�{]K�]T{i��Q&�r��Оs�XGaN�E��R��n���C�5�sj.�V%���ʽ�,҄[{���[��
����֭�)���DW�N�b5��)��i�s�W$E>��`iq��腨���D�X��s�w|D�T��^~|�?�hv��
<-�-!b�h�oM�>�97��dh��Ȍ[�"1�QMR��Y�pm�'۔�%%����BL�`H�M�עLu3�쪛b�H�9�Y+�J�ԏ
E�
�Y���!��A�5j���
橮]U����o���x_
���������צ�adr��S�T�&r��gcU	#v㰯�t���e7�陆`p����|��ҏ� � X��zU����{�"\�*�����W�p���	@;g"����0ʶa��n�`O�sr7�|��ķ{���û:i,� �(�����O��xkH�]�Xtg���w�P�Z����^�t�:1͆pSCW0�Q�@�yܧ43���
�*M�~P�'U�)�"��T�Цxy}���=�ZS��Yx���/�L�S�i��ڍ�(��%�@��+iuI��M/kZ�cw�����Zx}t[͛-��O��Ct�� TI1�1XJ�͓��PT��Tm����o��/��sJ,KKQ���z�$�$}����g9��|�uy?�Ϲ�g�QB�ҁ;q��#��50���9�;���l�ʘ��Mt
x1e�1�=���w�0���L�8/��nս��z��r��qQ��&����o>0��谣},����ک
�8~]�G,�<��xs�,q=��Э����e��?tS��of�S��É1�)�`��ݩC�&�Y�#򧟷=���٤R�	�۩6�"��3��}T�2}���	��'1$�x-,�}�'�&���{~��k{����$�A�)�臨�g��6uo ��n�d,�m�Anr4�mk��!|�{��y���ܘ��7%�{Z��1�94�ױ��[��^�0P�7*���kq���m?�E�V������q�4�&0|{��'�.�S==����:����~C�PKE��T�\�p��#!pip/_internal/utils/subprocess.py�Z�o�����!v�h�0t�׻�
�6A.�b���蘍L��d_P��{��DJJr�f gKz|߿|H����Y��梁�Hw�m�ew���^4��х�v�5z���,b��t��s����ۯ/��껯�t�zt?���J���Z���ik��[~@���PK�x�>(��Of'� ��(T�Mnd���<4����?��V*�	�򢒹)J�߻�+���B̙>��dc\��B�~-�+ek4o�o�ui�e�Բ��w~������/瑻�H2��c���뿖e)ԝ�XO&r���
��ί؉��6�l
Q�Ov�X�b��;Z�����{}��>��i'+��؁��e�M��s�q$u�:��[��sU�1��-('���<�l��L&�ز=�­�~�a�]1g�Ռ��#��e��S#x-�)��$�:O�൓�*�\9k��]�[AΥow�x �

[^2�M8Y�
�ܑ6b�U���>���>׊�y�UޒBȤE�MA�9��u�-������v��ʊt�+v]�9I%C��ҵa`W�i)P��2�n�J�|��W{^��'�8�0 {5m��F�KbĠ��^��RDJiL�
�DFuk�aW�%/j�'ԗmY=�ʢ6ә�+���z�N��Z���"I�֑:���$�D�l�Ϫށ��Xm$6
H]pH�K�N�Ԁ��3fj�x>;h�>�q�:�TM),0UZ�s[HɊ7h����'\�P����6F8yJ隻�	&�󍁪��*0�
���,�X������	D#)��ѵ���0qfc��9kFi��L��W�t�sΈ���o˹�Y�y�δ8؆�4����$Q���5KX�[Q��'���,
mt����b_�`���v�Ok[���/�F�
�ߗ$���	؄9NL�wZ��Z��=�p��ςef8t�lβ7
���Fd�3X�0��~��HdK�t�T�[)�Q��%��!����QV�#�ZIhe�����7Rz���-��(��v:I�LX���8	F�H|6O�x�����j�C��Vd�(�5�VW�}y�4�����A)��>��/1Ai��-�h| �w�_|�
n�[�T��3"̐�pC���8B a'l�	v��J[]x��P(�DYJt��c�h@��0�����\�z������*gGn$�W|/�/�m�9	
�ۉ�:3�A8��0A &[
5swC�]���K _�s�~�,I�6��wD�(殓�]�r�"���F�!Z�iB�q����E��&Ԙ&
���q/���Kn9��0��� �b`<�M�&6�;����Q���$����v�+���8����S�Gŵp�^�T���M������p~B)jra��Uy�za
��H%ʨ} ��|"�{HIP���Ƙ�y,�շl���vE�*��ER`�y��m�{��(J6�}��=??
��Q�a����F�����l��+�� �wZf5��kY�)U�
B"��]�H��
�[�t/E�G	]�$!���@tEH.����Zi�����[�)��5&<�
]��6wRN�OjgD���EW�Π��a�N�N[�	�-�T�H�O��>�g+M!�3���]R��c����1�ʠDx�$��h�s�"�#&(��9D~��F����b���G�`��K��]5C�\��-��s�� D�!zQ��-��Ch�䵇���N����{w���B�gS��)�Qq(�p.�O�`�\�A�{]'>p��q^�����sp6dR�E��%m�E}��B[���
*;��/"��*�8���.��'q�G��8��"�ŎE�=��;�������A�%*L��d�iv�(�
�]�k�6dnS�j؂����8��S,�nl�c�J�ӄb֞D �Ф�%apЇ)���pKk���-I�<2�
��
�*ٲ�#��Q��G�1NO�v]sf�
ڄT�X����	���h�I�4���]�CWS�;t�7��q����қ����n�ఋlË[q��M1��|:�A#��8b�^P��S5V�2Ө�'s���a�E���,u�7��N�v{o�t�{P�%c�Ջ@g�-��S��J���ʋ
z޴�����|�"����b%!d���'b�}�Y`V�l���E*D&Ӫ�G7��a��|���C�_��p�FK~ϲ���u.x� �f�^�J���g��!���u��7�};��:4��0�����Y��*���O\���U�#}����C�O�6m3Z�9}6�>1�J	����S��@���4�����;��Cxi����
��y1���-�~��(�g�.����0}�@a�TD ��+���V��(��!j���N�{�vz�Y/i`K+
~����9i@3x�>��&�/��݃K��$E�u�w�[αZy�F|*wj�Ɓ/(iwӌH����+�g-yJ<JN�آ=�K�W=�l8���]�,�8$�mkTd���ŕr�.����0����g�۟����&�L�%�����U��!Gz4�����l��U����ն��x���Vl���zm�bd�g�U�t�����0��d�mvA���!��@@gd�(���:|��-����W�lH
r�\���:	�!d��g�Оe`2�tJ_q�5{��g�
~�ϋE4@�����G��	]���=�u�b�]�#�dɎx�"���%����5K^8�����`�[��Eh��=xi�	ٹ���Å�<���,i�م�qw���Qltz��.c�%�UzD��S�� ���g��Џ��~@=���ݮ�s�B�	
'�\�77WN.�k��y}������N0��wǫ��X��t6ݽ>��?�V�B��^�P,��X�V��9B�ft�<�@G߈%��Yx�u1�!,^$WCb����+-�i��PKE��T�:T�	pip/_internal/utils/temp_dir.py�Y�۸���p2*�M�]ԇ���I6M�.���(�������A�wfH�a��pm�!���p�yq�Q�2�u�f��Vh�Te‡Jm6�ބ�ʤ
���ӊ]S�J�J�v,W���k��WҾ�<�M���|#��`
���!a�2�	{&j��U:aW����U®���ç�j�2s,٤��hҽ��Iw�䁩������B�f���l�J7¾�oq��|'�l>�e�@�O���:J�Z��b]���R�D;D@:{�*��0U�1��
O"�I�U]X-D!
V*�T-�[n��o*��UuX8����8/I�x���w/^^f���/��^V�B�wQBK�7�W����W�������2�V��[!�E���oWˈ�2���K�N�~:k�������o��Z���s�(���ם_o�Aº?��hn3;�Mk��n;DCn��W�U�[�3LD�Z>V:������K)k�ؐd�	q�hyōa(!�ފ�4�Q���p�B��b���@1#R4z1 m��FT%���	����l�D*D%�8�X��#ުB�~�Ա4�zJb�0��#�;^�n�8${Q2�V0@�݂1�Pa���`y'j�̜p�^ˇ�Z8 *z�S���.$c���:��2����J��k�ܞ,����B�{���AVI�
��ʲk��Jha�����S�r&�}�:���Г��7{��8VO�`P�Vw��rfrՀ�|T�sX8�e����t�7@h=��<�|��
�z�@�Y����
�<A<Ey��|6��3N0e��Ӧ�m�Gv��X4�	�жl��t�i�\T
�ؑ�G�}
΃��+��u߀+��퐺��J�}�m,�D�ͮ��F��n�/f�x�sk�\�0�����*wL�br-O��^�"�l�{�!�.��Ї�����]R�AL+#SxK̝F��U��!�����\�a����c�%�8��%N����d�=�.	t&��+�癜8���p\��:�����!Q%G�9s=�
f�t�qO�}������Q�:._�WȀ�[^��W;�
�/i���>`SoO�D�b�	*���G�2<O؋��C�:E��j*�K�ZYaTu׺Q��&���>}�����e���(��`���4���TJF`��vb�(�~0�H��T�������r��a��,�QeM�X��uAqF���D�С� ���ѹ�_�wh`<��,}�vy��sn�r�[	i�����(�"5IK�#4D��ݸ9���.68[e>����M���k{h���Ppv'���!aeYδ���<�M*>E|��D�D��e,.�vx ��YF��3*_Y��)�?�~�?}=�j�$��ˮ��z����=�������iz�kz�h�e9���l�b�G��
،[�i#��N�;���e��e"i��eW�:�H�j�n��sA����T���0������	{/���"*J(k�s���(�C�`��`�M��
��%��8�î����7x���R�@Y��>P�Ё��X�g�k�X���4���aƪ�?I������
�(�j%���R��{>c���4���tw[�{=[)�e��f���i�;�+�z���?&��3���:x~9�h�81ۂ�ފ�r��t|h�rZ��O�]v&����ql����3�)��D�O}�#?/~�9�hЙǃ_�Gu��9wϜ`G`ƻ�GZi�68�����z���X�-A5�j�T�T,D��9�V᣻+�vE��WC��������o�`׾�[�y�y��?�b�i�9N(��z&��@��C?�-J�"޵�o��
R5h~?�s�/r�@�)�*3����&Îr���2͡�C�
Y��j��`������K?��_�=q�r����W$����ɂ���n�{�:�|�Yv��;����嗿z����w����t�>+i诟�PЎ�
éۯ�˖]���l��?�uIh�����P�h~��޸KAm���
�5�v��V!UF(?��ݢ��\1�����3^m@3���h]����7=B��d�r ?.���!�W�z,�O�2c��mhx~��dd1�g
U��9��j�4�<���2�O_�!3��k^oD�4��O�ea��"Y�v��Hs�[�����μ�v�x��b:�.��l����������IT��[���)n�ه�v�:��K�>�)��'7T�-�<�W�
Nr��|����]�l0�ő���#{�oM���5�O�U�R֥�^�e`�w3V���G�����C�09��C��� �
���-���a�F�Xv�nE��x��J��Z)k���Mi�)�]`��0����(�#�V��z�3T����S
�X=|ְ�yh��	��jK	}�S��lsCA��M��g~z�_�PKE��T;��6�	u" pip/_internal/utils/unpacking.py�Zmsܶ�~���	Y�i����r�m䌦����
�#qw�x$��Ni�ۻ��~���;S��:��b_��{#si��L���1�ҵ�:�A0��MU*��r���ʿ����X4o���p���𯷲�ץ*7�l+���ԉ�/r1g�Km��MedY��Һ�����N�e9�����D��cq�
Z������`�X�RM-��7�D�6�1x���Yr����ɛקs;{�n4���h�����X�{�ԩ�W�V"ɤ��P�B�#o�x%�4&I�7"I��lv����7�Ύ��������೙Q�C�m��}��+���O2�?hef�N��ٲ��ǙXԫ0@�2�ј61�_q��部#�{S�[�,{�5�`_�_�w��o7�a����@9����2�di��(LRo��#���Zv9�	����d���Z�k��*s1��W�d�%�(W2��~ȌA��v��
7�R�Ԫ�NH]At'���Vܬ!NI��v/Vn����O�ð���I5��1�;�%�	8�]‹�E>Dכ#�KYdĎ��;�<#��U�k���E�
[w:ZJ�Bfsv`%9���΅@�Y�ň���`���5�#=��&u�I����/xG�43��4HE���/�UC 3��j
C���2�+� (ij<bY��z��Ԕj�c���;�Γ��MY$�Ky�}
�h��vr�ҭ
,�T�
,����!�c��쪖KG��8��� K��#�`��C��>7���>�=R��30����ɵD�&�B�����$�6vz����ڍ�Ѳ|�˼6��\:.xb�!Q5[���V�ȇa��F
��>���͕�J=�U��{��;|/zi�s9��3�0��1��*���)��unH�"��Z�Hk�!4HM�Cx}��/#([kL��X�R YN�<��B=Y����\�*�l(�kؗ��D6�?.+#�C��ךUPg+[n�2ս�AQ�8�i!|Z>��}��=��bO˃���W	/������Q% �Ceބ�� 	�n�b/^���]��"BL�J��+��ŶQ��&P�qˇ
��kY�%l�#��O���w���hD�4��;�;m]�yQ���$�'/S�`�u	��x�;��yR���Bk�O~�O�P
$HY����'�秘��yn�,ѐ%�VE`����j0s.�鐶jS�);��@�W"� M[|a��=�l�f!�
��yl<v8�h�9#�̱,�y"����
�2�%x[���+Ma��pN>�F���
�Qk�+��;���qA5����g���^�6Q r�0�T�h��Z8� >G
����Џ��gy
c_��|�Y��ѨB��7�ㄑuZ�w�jT
VA��ߖ�_B���I������(���ϮY1���#:?�s���R��!���GL:���!�+�Su��z,�Fh�W��p4�Op������/�1�w0���Ҷg,�fU�FKH3����ٌ�D�ť�&0t����n:��,�\�T�,bQdUf�,�Oo��Xe{���w�N��ԇ���طe�I�g!�G~Uʌ�O�'���ƶ,GO�J�uq��R�C�g�/5�.hd3vo�1?y����݇���`����쾬���c�"�T[��\�b����C���!²�Ӽ�"��G�Y�'|�����"�#y)76b��r	�Yla��,������ZlL>�Z�9[LO�D1�J�¨���խKWw�$j���@�x�d��п�䴸}� V�k�IN7�	N����n�u�@�\`�~����L�!迡mB�Dg�M�z�>��_�}�iF��3��ʄ1x��O�zBjp�"-3�Y>���ڍ��m�:"��;� ��]��E+�݄��G�����EE�����U==�н�oD<�g��5�c;�ݘ�YQj�Äv:	�/D�y���n�8��c�X&�Kh�8[���5��@�c���i��(V��LcA
5jتReV��إ�!ԕH�R�X���A���䲸�Ӹ��}�{3Ը�#M�.፮�x.��q��>��3|:����8=9}Pą������N��D'p>@��
����?Ė<~�^��j/�G������O�;�
+����z��0�\hw��p�� ~m���A�c頻{�o$�^�7��e�S!M-�C{e��&:$p�9ܓ���3t��o��_�i3v��o��~�-�~O;�f*�^�v���k{�_-ҐkJe���d�F㾁�g��3�@
�s�<�s
�nc��^��+X��@֖�;�w�Cm�]�/����y:u�-�ͭ��M#K)_�� �|N{�1o��'��Uҧ�	���H�K5�|q��~�0VŨ	��^�|��B��r��xb�W2eZ��煴�[��S�1�O�
֗�B�X�%�0��x
���c븏t�PҶ	I����,�����K�k�e�\����Lxs����S�PKE��T~��9�pip/_internal/utils/urls.py}U�o�6~�_��/6r��:)0\7 @�]�`肃�km:ѕ�����|?�`~�I���#�Q1ہ|
��V!z�̻�[k��A����<~1Ģ󴅸��!r��a��v�q>}��}��kQ���5#�C��K^6¡��w��lxl
��t���	��,��8z��8��:�Ē�����C_V���ב�G)�#��(����3r:9A$^u�b�?��z�Nv�ZxB��
�~
d����^?O��q3]�
�P��J�knM-�ڑ�*��l`д�?U�\8�8mZ͛?ɸR%�\��%(��x5'�����E�&q�Rȳ.�O���
�h�]�!�$�:D)��0����t�W���4B���{H�XE��O�RD�7�|�T�@�p-��Df!��%�Ë��e'h�/��W�נ�W۞BTG-���ږ�F��I}�eo_��q��qր�!�A��'o�>x��+��c�9ſ�`�IK\��U�g�8 �L,�����1z)��)�Ȗ/��Li~�vğ�'l�|�r�.S�����9(�q�yg���؛�ձc7s[�.�9k���j�i��_�����9x0nC�������c���"s�X��Z���=k0,;"Ug�O¶��#���0�r��଺ѵR�0A��K_�NIo��g8V�#�1Ϳ��C"eQ'��Cn����K9��D��|�;nu}v�`�dxw
ߟ��߿�ۥ���i�W���ͣ��ӿ�Z�֘���t�ޛgIH/8_5?$��
V�RU�"�ڸQ,u|!�����y|;��<�\&~�cq�r���PKE��TZ��'"�
!pip/_internal/utils/virtualenv.py�Wmo�F��_��"��
s� s�bY4)��+ԳDٷ�w��ɮ����^�(i�d����!#7�6*�ZI��dxԶ�d��d��?�mT����^_I��vR+QE{E��}�Bw��%Y���le�^_^��e��ys��-�yu�Ȯ/.�x����.^.� �\ojYa��X��j
�Q,73oV���X���~;����럶�j�3
�[���$�&QXBf�(��Q�l�j�L`��ZW�5q_�1�dA��u���`)?�P�wx����ȟ�]Kk2����~x�#p��V׈
�Fi�ڠr6m/��k���fT>�I���A(�t`yOzWM%(�p��$kPTm���E7��X2��Y��[C���YgHvǹ>����!�ԆeX;H|V�&{�C9�
>o������A*+1v
/�8���NZLO@�6_�@�A��{>���*��Bbo��=w�{�̇�TDa���')9�!���V΃#,T�t	���ۃ�k�pʕ���4UJ����s��PR+�8������p��o-U�I�Q�|ؙ}�*�rkݬ�]����q�sY�>�e#+7�
�lt�н��	ҧ��ΐ6�@�w�/f�)$�q���?���3�6�F��d3%z� 0�q���y<�2�}�B��9E2I-��k��H�VK�!+f��]���kon�h�;>8eXZ�(��*��6��t��{��J�h�O8�O��j�v�-����n�j�����`5u�-ɀӰ��V.	%?>ĘxL��0�Mc��� �=�tU�O+��{u�zh*#��E!CgU�&�P�N��%��C�v:,���z�|���ގ��2�ؐ�{�Q�b+ƞդ욘f�
r$d%�u�8A tjB���:�}"��"�h��$�܄����;�������\ښB��cWK�ʊ��-�p���@�S2���;'�</�jp_ڛLN��?P��ϐp�;xzX�@g`�����6a�}zpqȀA��6���M��~A!5��!��G5�G=x~�<�_?�9�X�Y8~�/���b�%���F6H�`
�H�+�ԑ9W�t�s�thb�d��<d�]�he���#�:nD����
i���x�L�g���7�id^�i
��E���pF�Y����i��������w�u�P$����G��e�j�_�PӮ���Ƨ�}��c�����6K�y���Cά"�/���O? ��O`�Brp7��gʒ֬�V�e�y��� �tGc��P�\��̎.cw��=4���X?}��w���PKE��T�(�K�pip/_internal/utils/wheel.py�Wmo�6��_��*���h�t+ִE۵����%�f+�I�u
����Ee�M�-��x�=��$��m�2dՉ�p)4YIE�R}�bM��l�v�XMV�f��%I2�����r��]���
a
�u�0�����}�h��L�
o�7�nv-��+�����x����sZ����$'���mly[,n����8���+:�k�K*��%��7���L�0L	Z�k�Z���Gh��>!����w�_�y������g^>uI���<'���l��@�OHŚ�W�Y��q�V���,,ʩ������wω6*#g�k��to�3?P�˯F��.��
���v�H��-�X��)�!
cF�%ռ���������������~�8D����ڜa8Rq�J#Վ���yU��_��� ��5�g���ڹ���Y�������C$����.<�7��-S
V�{��NDŽ���	��(��hS��d;��������!)\�RL&��,�2�w�a�E)����57�ԟ/do�)[�>����S��Zv�dw���|����r�=E���D�g�x�(�a�WDH� ى*'��T��L���Sj�M�f<WL����+� �f�D
'Ӥ�!KF9�wK8���B��r�<Jrr�]?��:���V`��M��K0 ���nj�߻��tb�QE�d�*�n��x��DŽ:�p=xI���H{�� �?tޯ[0��6��T�9�.�|Ld@.)>K><�[�����x�
$�8�4n�~�n�A*&`���NW��Y��p�,�u�ܵ�m,w��B�[�hC>I0�x��D�(F�E,�l�c�^d`�3��1i�zO�p8̓�l{b�S��P���jN�f;'���Z�=�D�G��"y�	�6�n��0�Tg�p	���X���b呯�~
�JJ�Օ�&J�bY1(Пa%�Hn����H���=>�]+s��w	s�p��[	 .k/�o�Vm!����bŴ2����}t��#�'UՁ�W��t��$���l��_�mQ�RV,�\��a�c�Ydf7[���P�Q}/���J����Ώ����.
;2����t��*�-�
��p�R�V@i
�l���s�����-�dg�X@��{+;��zG�ZHŐ?M1�w�4s38N�1��,����<�t4�¸���(��O���y?�	���G�Q֟0f��N"��M�Ȃk�Z�{Lp.�T*��1̒�(p�(ަ�� Aӆ�����Y�H�,"�GZw���t�8��}��n}gܜOk=�Q���g�I��v�;�F���ώ�!�Ʉ
N�@l��j�b+�5b$X�Z�����yc6t�g��N(�
ݠhK�5���Q`{��k�x�3Rq��f�<7�J������Ӿ�R@�5Z��Y���ﰈ(2O�l�!�V1
=��9�W���a�|��k���M������K��\m�L��4�_�[;j���p\� �/��'Ǩ�*4b��(��ڙ
,��@$��fAO�{ξD{�,Um��C�'�Rs/��J9I��@�.N�`[�@&Y���$�-�>k>:�PKE��T/���/Tpip/_internal/vcs/__init__.pyuQ�NA��S4� $��ēW�b�.e����t�t�����B��$�o�L>:��G��B&^��3e��ª$��S���0�\4���[
@7{��C��5A��F!��)���BKԑ,:�ՍOJ�0Ԧ]��3|3#�ld/���Շp��V�;7���)����aU{8r[�
cZ��ϖ
�n���ן�<+]/��e��)�j��OD����^#�+�1\��8{۱�`�w�Ӈ�����";N*~�3<��W����:�ډ�?0��>7E��qK�6B�b���5`\��/PKE��T&xs�)�pip/_internal/vcs/bazaar.py�V]o�6}�� 4�[]^�yhW�؀��l/F@�e�H�������%�i�K1�/2//����!E�h�ԇ�P�UitMܩ��D��{aݚ��8��k��6���g#��
币��uBڴ6��*����
a�N�a���ڶ���[�Ǩ�Ns]�L�׵F+0u��mi�1����Z9�e�0^��o]��*�ڏ>�Z;�I���U�/�h�O(6��!?����֫d�Bx�!���ݽ�Ŕ*VsJ�k�K}�̾2f�y�$���D��&�B�ޖF�MW�T^�	�W��̡U�a��ʹ&Z_������T^�]0�K'!yg�����:�D^sW�"��K`�=��~��l2b�I��'O��!��5�좍��0:>��h%wyE!�\�@Pn���&��lF^̬�ngӝ'@���2�`Q����z���?`?	�M��8�]R$��}�x��nyc�X�4|'��ʟ&���C#�8?�#ʱO���͂���i��S+���I.g+�[r��r���E�2�us��~���(��p��E�s탬ρ�TJ�n��Of�HM��P}�d$�}���?�g�'i�턌�Ou���6�=��6s���*�M+%�m��+�~�]��"���B+A��\ڮ�^	�մ�
����������Tڕⅸ��?>�w�HX	��S�#4*�o�N���oa�n�)�AA�8N�m
�����NO�S�?�p�+�l�*J����mDnqx.z�����WV0�:g��,|�i����vtV�.B�y[�gj]�����t�ɏ�V�}0-�.�O�
�Bq�X�=�-@�9>�m�?���DV�P/'�r�R�Q]� A>7�p�F�Y�n���~�,��]i�P�
����E_��Ra)���iP�9��J���O�>aŕ��3:��a���Ϋ�9
|�|uz����
�33_ri>}Ϋ��cK��J(qƱ����_p���6������e�A�0�Ʋ�*yx�Z��(���gv��� F�M�[ՒB�|�0�2��= ����x����d��PKE��TS�?w��Fpip/_internal/vcs/git.py�\{s�8��_��L�T"Qqfo��N2��MR�w�l��HH„"5)G55��	�l'��:U�D"���ǯ���.��d�L�#�f*��bc�D.��\�oe��sh����\�V
U�Vy�e�aԙi�Tń��2Ky2a�.#�r'wA(�B��*�#A͔�#�O�햧�IU���c��<��>e!l��,��2�Ez!>�$b�v	?���	��X�0�a:�\��,��Жa����o�`/rs���ȳ��G>��b�&]e�u&�Y!�f�ˬLcZT���<��{�I����:�c�g+�ƴİ�B���"*�<ˊ'�b��O�f<�G#`0Gl���>�e:�ļ�F(["�&FȂ�(~�g~�|+�F�zs�|zv���������B�\�ڝL�fV�}X�h���c�{�������U�xL���r��*�_�����L�s�`�5���bl��6�m��;jr^�`�	�i��1J7Ol��)|��.S�4��J0%�[�����,�`|��E��~���uߢ��|�z>}�d�������<h
���g���J�e;7+�(K�Lm@�60���`�#`�3�oAǐ�|�e�%�x~4B�0��>�7�!��ġ|D
������?���"�7Zm�%�>�<�/?��׏�s�b��.S
H��N�����_�*(>h�
�n:<��˭�eĢ
�y:�TƸbiV�"cK�W�*_&��g��zd7�V�X"?	vt2�v�,��W�
v��׏���;��!�%����OI�F�X��g�T���
W_m�����l�e��t-�<�~-�����^�p0A�d�7��0�
v��y� ��}TI���(�R���h#�B�S-�AR�7E�3l<S�Jmڏp�֣��y66leރ��d��H1��e���@l�s�;�YZ2�+�o�>�K0�V�h^�٬����3h2�J�o���Z��Eh�e{h�^�9�&���������驧'
��ˤy��G��>}����g ������d�m��K��;*���N�~\�+&I��vף��T��n��@�`��O`I|%��
1Q���O��N�͌w]0쌖�_��S���" W�SN��S�w�'Zi<X�NY�20���IO�d�M�H>���(���|Ҁ�H<����f#�
�
kƍ�Ӡ2�)�!�dh<�(���w��A�1�%M0G#���`~ˌ�M��58+�-
g˜���k�q�S2a�
�C��;D�"�^DaH̐d��	:%�i��l�*a
�F���YjB $d�*I�UI�=!X��}�|r=n�3�~����&�����4�/��KX��AਉEF��2�x�o�ܥgZz�M�0�CXB����5ہk�	U��-h�[��M���aq���ۚd�a��c���f�V7<Oa#}��b���!�g�!�l��٢y���h�V ��M"X�Y�S>�!��\Q��3�i6؏5�9G��k�d�E��#����99*�iNPSނ�B.���B��[�����'bQ����z���7U��2Kdn��g��
=���jV�}Tn^QwHѬr�D�a���׫�A�xK�„�8���+��2R�����AOS*x���H��,[���j
3k�CD�;@�����_z^�"�kޠ����\��c������_W��-����aUD�M�h,�a�)��R�x2�F*���&^X	�SN��YA�(w�r��f��T�|߃�j����7�u}��2i�)�_��*�r|�F5�-�S�����Z�meC�&d�oW1��h�S��m�V���&�U����ɀO��d	�bۜ"X�����@�Q5n$�,d@P��9���R�TM�+Yd�a-�-pZ':SR����?��c��� e�"�B�55*���+��)��T�<�:���[�
�7j��8����t�~A�A���La��C�k �
��ci�j�S����8l�����l��ȬT�$s$u2�����
�7}�m]Sq���]�mդ��'�uk�*����]l��M���LK�xQ�nK`9j넾�P�6�c %[��~-�6���_�g���>]��}`�A��f���R�D���~�:���M���[��"g!p$QXβ��
��⨯����W���T��ʿ����S���R�ui�rM�bU�J[�P[啶�ڈ�Y�˵Lg��D�Qk3B�Fsx�l����S�b�z���VR�
�2�Zw��Ur<H��i�1��3��mP
x�:�DaQԐ�oFx}
f���^�od�k˵�۠c��P[��#��:b	`2�Py��I���� '4l^�Ʒ��m��
?�=�	%i����&��
&lj<��"��#b_Jf|�H��O�}l:��~�8�4k�.�mA��z����l��}b��dYZ٠�(�U5qmwW���Z.�rT8�q�C�0��h��:l���@�@$H�kQ����;��u��Y�Щ]k[�)��&�s���ur	��~6�"46)��
 � j���˲%�"�& +�_??F��bu�h����W�ҿ�4�����ˬN?�q�IJ9~3�6U�˳�ȋ�U0�y5B��KQ�D�ʜ�^�b$`�r�柴Q��©�p�9쯠j��5�
C�L���
M(~�yv3[.o�Z[J�ԡ>�q	�_�V�L)g�\�#���ú_�w��5Q;��jl%�@��m�C�R5`�!�s`x��v��H�{������=TGm�q���h�Z	����q�4�4�ސ�����v�H���`,�]�2������*���w�N��wa��3ɓ
Oע���1�Ř2!`�iN�Ac�����Zx/O/N^�������m�;|��=Iݶ�F͚7s?�C0��\J'����h8��X˽���7�*��9�%}8�4BL�[.�p
�&}�@�LS��dC:ue�_�R{7��A�W%ѡ�����_�U)��Dv�X���l�cwSao��y�$�!��*��p���B��,f�s�s�����@��<�,ؓ�~���s�+��c^��?��o��7����A�{�C{�}�hChb��v��8���T�����v��^��a�bJ��)�0��2�b��O�㿶z:�����T0��H�L�)unu:�	+V�4n��Ve�.۪fJ)�>�^���k&;n���a�;o�c��]�C/�&dzX&�r��|D��%��E7���&ָMB:�o� �2;7�F�[q�p]�Z"� f�+�E׃��[��P�^����]cs�Mt�͋"���NX,Z�&
c*b�,׾��ٙ=���d7ĝ������eZj��K! �1<��W��l%ch&�*AՓެK>�f]�A��~�m����ʄ�.s@S�
�����@�����iG/�"&�j��׀��Q�I�i�nx�F��Ġ߆�Lt�����1��AZb`���O�e���S�<��r��$�������x�z��g�A{J��ﮨ������|"��||1n��.��F'Fݛ �UD'.����;P"��?����2u�GK(w1/DX�6�Pf��X��"��v�ny�,]�5"����?͈/����#�&�����'A_�g���{)se3l���\�s��$�	
�'��Lh�`��.6Sz�s ���V���d�w}Oż�^/ce:��G`����2�[&9
u��J&ML�b��
hŃ���3��Q��`�����X��g?��Ċ$��Ee%��n���F��s]1�#p�L�0)���J�f��R���_K��+��{L�P�A���)�)��s�Æ��M��R�C<[}s���ȝ��ژN��C�\�������WA��l���T�C%#:A]Ev"�N����F�
��'500e�7i,>��Au1�G�j�[Q6�F���I�"&�`��O˩�v%hp	�V�\�O
	^4z�������*�C�ި-��;{,�ּ���?�~�?��=&�c��U7�{�¦�,e�Pg<S�
����{��5O(��أG@��#�DX�y3�~��lUbC��z�j�S�	��s½A�)ҡ�s����X�s6�Ҭ��bV[���:�_��'�����rܾ^�Kj�Q�9U��T�@?ʶx�]UG�k��7���a��^�����sa��Aj��c��ϕ
<�����I�Qn�U�#P'����E�[���xc�]�<�3ఛ��PI	�%>`�IƁ>�C��\o��2�xu���b
���B�}#Zy�-���Wd6�n%ڒq���^��vX��.��&e.O�W��,%�#�
-˨�]hO�V�2۰Gڶ��ĔY�ja&EBҜp���G�����w��������4����ή��\����e�l[湾��5�Q�u����	��#�1�30���<8��K���n��o����\B�����C���c�{��^�k?��x8@�!`�>��@s�O[���qt����W�oD⃻�(�P֯����W1*Ι̏~ys����a�=}=���A��*V��5�,t#�!8�0�8KFWa�(4{a����WA��=�M$�y��D�s�S͹Ѳz�>�e���ZS����ͭv�>1I\뙤�K囅��S�<��L�~5�m�J������Tk�0=�A�;"x���\�gw	��]��-xY�m
��Z'��]�	�7A1�+�%���\�Ûd�6�*(�Kw
q�t�P��#��ox�Hgy%�f���xb`�c�'��:�!�3��H�d�'�q�k�W�̭�W�x].�����w�r� XE	�oв���Y@���L"_A�}��X�O;�����`���s|� ��;
KXS\�k���Nڂ!�#�kP=���3�
~����\}F�ώ����z��E>��	,���붛	 }�&cp�;�o����@ ���mt���N2�X���T�rΦx>�t#1��g���t*n�&.:d��c��ۢ��q`�W�ɚ�+4I�fB�N��67�%%��zը�����T��u���]���z��vwV��R��_׻cX�٠qo�;�!����7���m���z��Ѯ�']"E�+�8ȸ݇���.���Z`i\�8�G
�׌#{��<�v�=�s���0A?�<���\]"6�AY�0a���.a���s�n5M���Q����£�k_�e�	���MϒjX*x؋��phq'�ьl�:�_d�J���0f��܁��ɭ�?��)��	�"z��H�YF}.�ko�5X��X�q�J
PR����)�e�PG���Y��7��TB�.�����0ߺ�k�(Hk�4Ϭ��Iy��s���ܚ+4�/y��H������^�u��7)�N�D���`0)'5�xJ�9��Ҵ�HBk4�8;A���J.��<>`���PKE��TQ��m�vpip/_internal/vcs/mercurial.py�Xݯ�4�_aM$�
�SE��
l�6�rwe��i�ؙ��;�v>�6���I����9���w>޴RRH�廖)
j��^-w;.v�R��VɆ�c�����k�$/Zå`��������mN�0��U
pdz����i�(���
�kf	~TJ�9�����A�ϼ,A���D�u[�#m��.s�n�*Y��h�@��e�N�#�=�Iqo�a_�|J�)�W�d=0���+�{��[��io=���rQ��T��*)
�R�tKO�'.�baC�����;0����R���E���@��Nc���i�QRR��.���aϩ1���uQAw��AA_ny
�2ڪ�ig��ɞ���A�7?�f��7
�J�^u���0
�=ej�S��"ڨ��|�p|����x��)A��~1�ق)**�0Y���"�@'oI���L�C�
�O&��9���[a�y��5�����@X���_��H�Q�s�����m�"��Վ<�O41����7���a¥�lz?i÷����5y���lk�C���q缗�ENrs��`��$�H�zM��g����� >S�#.J�t�$����N�%
kM�g���kKf��'ޡȣ*{@`�W,�L�	p\dY��P��a$G��G���Yhc��*un����\8D-��}�Y��WE��3l`�+v�u�n`��cJϗ+`e��i0ib��6f��ՈNk>�+�^�l譊�D(9IF��R[c��#�H�������k�/������1�f��C����N��E!MneW�DH�z�.L�=R}�X���!�rJ��)�0H�ܼO.�3u��A�r�m�V/����L����꺷�>T���xӟ��>�4ҀZҢF�Znܚ� �N�"��+}.֛�DW��qg
q���qWKJ�)eg�?1���k��JQ�oT�ei�7(M9j��4j6Vc�5��5����AYMob0�9����w�5����$I���I�� �n������2�'�k6�HƤf�`�xV2�1�v=�X@�A��d��o`�'
��?	i�SC��gD|��o�2E�c�0|˽R1]�H�o�� �b�F|`%��PZ��Bu%NԊ��8	Y�%PΒ�Yj���b�X_��bm�j�_�	��l#e����;��ؐ�W0MJ)>��<li��{}�?��	/�8�`C�u��"����J_�0A�qW:��^��`	���^姢l{�Eωd�k�.\bu��]5c�x:s���R�x�sxE�z���id�
�f��:��Pׁ���$�+G,O,��{���v�6
%ދ�g�BB�Pw�l�9y��ȑ�y�/g(�_��յ�G�?bg+��\)J���d)�7����N��s2u��\R��;���S�S���;#)�!��
�	��mL�N����{�.���@�:
�
9� �G�٦�7lν�\�m�85���,F"�~oH)!U�rL���o�V�If?4�/a
v\�'��6�-�PKE��T�T��`�-pip/_internal/vcs/subversion.py�Z{o���_�bK#0y���%�����]��-�^�+�g���%%E�{g�A.v�;E� ��}�����7�J󒋊d|�N��$�_������I�/a�������DzJyA�)��ˌM��2-�(-*&`*��4�a����'�}�&	+��}5UߓT��G%�6z$�Q��3��ѸJ���KY�,��0��B����h]m"�%*X��x:	fMַ��1��2���9-�7b-�$�w�P#cD���LHPp[	�u�|�\+����r^�x���E�N.��VkS��?k�o5I=G�$�+&ȹ��pͪj̏���,�`U$�Et�gQ-�H0X.X��i�C<���{˧�w�Ղm+�!
�VKf0�>%ΖDS���$���Eyp��{ï����3��D�8�pK���Q���R�PjB
5�i	;6���<����w���9�0�#��Rn����tSU��Y�/H�|\��.���b9gՆ'��"r��,�h�Dp�J�R�Uz��X�P6��"+��kr�y��ӼW�(ȕ��9\�J��9`�-�L�
k��CK}��,�������1���\�9�Enπ�-u����IՆ��ݧy�K��� ��)	�	;%kp��9b���bR��tV	�hO�ƉC�^+�s�6����E.P{S�."iq1���ηl�t*,�("�W�
7��:c��z��C���I%iQ3��� E!��1�6�d,!��ҤO:D3�2��'�,b@"e2Z�� ��������mV{A_^���f�`R�o)C����~�na���P.Q|�
&}�1��epq�;2�1bT�d�d&}fq�����:8̜A���@�Q�6X�iٕO���C�$�2eւ�N��*=3*3���o!x���.�6���e4))f��F�=��H%ܧ�KK�V��K��k��'���e�<���#p@������zVō����Z�"�B�j^��C�������xԹ���W�&c�I�d�`P�2Rqr�@�`	~A�mS��j�Y-��t���	�:��(�&x	f3���p�70-8��9�{��=��3cZV�|���D=*&�!#�x��c��bȲ{�u	�#Ǯ�/#��v�(P3�>gK���Ӕ
u�c.=C���1����_+��������.j�d��ųg0y�u%���)^���~��\]
؇����^,��Q^/`��0���
5F�#�<��m�B+�1�E_����/[�u�t+,T��pt#�žލ��n���J�޴�ҡ�0�:v��ʷXo���b�/BH��{v&t"��1�\�HM�gq��~��s�2�������p����R��li�&��_��JX��s���f�x�6�4�c�#�R�(Q�������l?��{λ�����CԘ�XF@������m2�B�{��9A/��`�*C%�Ú�*3��E[�X6��y��U�u�n�KS!����I|�Y����8A��ƚ]��o:��s��%�`D��HA;����6�O���tuo�Nl�#�9`���P�;�c�!��cfӿn\��*���axs��⠴ 8��|��+�������V!�9�=�e‰�'���Q��$�iؼ�P�Мt��j2Bp�k50��  .�$�S/@�<?{`�h�O��+�C�4?��w*h����Tp��>�������7$,����K��z#�2m49<=I�ή�]<f�r!���\�-�,������&g

��%@��\Ԙ�^}s�g}}��
{��P2*⍏DF�?�oh:�]�Y͔�+�[�d{�f�I.�?���?{ťV�"��K�(h4�J.S�=���٨�����VW��78�n�;�A�؏e���������Pb�p��WY���y
�-I
"�w�b
H��`i�����2�-j@
k�YR�����1�M��m�n(��w������Bk$N'��<c��6�䯼���B*p-�34B
���L	j�z�+uecZe��V�_k�o( �IA������{y��H���Sn�.�U�:O�bX�VD(�96�$�v��/�^	#Í����?���#�G�:��k!���S�0/]�V0�d�)VnZ��E���qf�r>�ԡ�@�6�m�(M"0;j�}�g�#%�H+��7َ�%�Y��|ib�4>���m>��MZXWE�d�JUA��BlԨ�,]j�;�AX��4V@~���H{
�O����>�@S��58g��Q�dٸ�wJ7on��S���˒�P��*��Zw�1�5���0\I1m�Y�!� ��I�x�Y�}��6î>T��L9f�1'�eJ�0\.-j7�FBs�Ak*�8t�%8P�!۱�?�B�cw=mB�5���>�4*mh-�].��
Ր�$���a?RZ▊�o�nn��.�nЇ`@���o�tնú.tC("��5,�Ū�l"d#�x���9�e��k)@k�py����G�'�gǧAg)�f�z�J�{vK��&��)9:Y��� ��ы�-��YB�.-�^��p�ة/ã<�����O��
r|���N�tqr�8z�Z�3����l]ԏJy�g�Yzw	(�7����Nߛ�Q�狓���/���4\�U5���/�㆘9ܼ��X˓�_��7�87�c��L{P�
s� _w�-�����r�
ھ�m4�������T ��M�*,]Z!��
c�7�p��^B]P�v���G����T�ps���[��Y��P��6�!&����;��j��`���3���nXAwb'��tT��d�]�e�%��0�E���\4��	��U�^=EtKS�Y{�/V�q�-{Š�S���%ܾ��L{T�‚��WT�N+]B�?}��r���D�A^�a����%�;wpb���V����6�[ϱ��~�R`mH�1�U���4�toZU^�I_m��R�
�W��A�7�/oxo֠��6�Y��ֆ�P�������m�1Ǜ�`]B��F�O�Pp3����<^TR��T
��;Z���lV�b��a�3�Gc�L;�ğ9d���΂W��O��W��b����`h�U�V�Y�Ǘ�[X�,��ݔ�ms��eQ5HZ�zP|�+�dⴉ�\]�-$�J3�a�76a�ܖ�1I.�a�}Q~����jC^�J��l��+p߬���C�ߗ�UEN��0��43��6��N�s�&���{��\�=�\�2�:dX�����}x�L��K�r�2ڀ�D��3�l����	b������AꀗZ�����[���B�o�%\0���a,U%]1��$��YIL""Nж�����";�ñ6��hJN�!��@����ζ0f�2*����N����)bO�ׅ��=��������8Rb�v�3G�k��XXq;�x�y1�|�mUyo1�a�����D��'����m�~��ӝp{��$������9�w/c��5�����UmX6^��vM�'����˞����rݑ&6���`����w�M���T4�3�\N������mİ�L{�`�GS:c�4���j�(f�?6l
p�	�ͩ��_PKE��TF�ز�Y#pip/_internal/vcs/versioncontrol.py�<ko�8��+�2r�}i˛��`L�&�$;��f��,^CVKl7�j�#Jvz����*�")Q�x�k �d�X/V�J�䛼.+�X^U��6���f���FVs���N6m�$GGb����77����R�+��ZQ�w��E�T�X���Q�h��-k�;����߻���Uv�ͫ�y�oz��닗�h�՛�7����]+}��P�����o�۵0���wﺝ�n�3W?��bq4?����.�D
��[ZT"U��X�/�l����?���{�5/��vT_�7�j��96x�4���@��t+T��Q��~�?����6���&��J?\��m��Ja�S
���=5�O6��pǻ�˫�E(@D#	wp�m�p�Ԛ�Xu�]#�T��������X�̵�ײ��mV��Y޷���>>8>̩���8�L�� ��P���1H
S��s��_v/�}�o7�J�;�mM�w߽������!�kv��5+I�hU	g� �YC�(�A���(ːH[���P�<C%�
<2ژ�,��g�,��-�2�]�yS�%�#����p���j��[[�5��5C g^����l%e�	�����ۮ�Y�t����
g����U△���÷i�K3�	�B�͵ԭm#��[Ys=,	��u^���5hӶ�d��‹��8���W�)
�$t�I�I�d�����;����qv���3W ���E���Z�W�)g!ma�8�#�%<��H#��{ȤG�"�.X�8��'4�-�n���^���{Vs^��]������&eɍh�&��@��g]�U��x9�o��!G��M����)`Y���%'ȅ,������䣝ħ�py���-?a~Jz���D�={���C����/?�;���	46�^�+d0[ُ�H�f��!�����,�L��7o�^�4�v���0���7C~��a�=S<o�
����(����|Kց@][L�S_hp"��=�f�qm�/�{��S_�P&���A��>Y�u��f���P����@6�&�X��җ��~sd5�7\jf���1��U;	�g��*E��
%ȁ�ü]�e܍�g��R���AeBI�vH.���Ov�	Y�� 
�i۞��M
�g�;"��쪒�FTB#��{�جm`�n^2~����j�,F�N���]�d�Ȫ��V �f�p-X��#���{�z:	��Q�T�.���l_����5{e]23��;��Wb��dU�Y6S�Z/�]<�a���x��-��#vC������V|�\�j0ªuFW
����B�E�K� ���h��,A�:h>�L�Q̊B~h
Η�b�|��ڐ��P�9
⣐�b��Z�RgƔ	������ޗ�O:�8��Fr��$�.���&�699�^K�{���	K_���j�)<�� z�+-�ۻ@�Dx����aRdG�cQW������6z�WG��o�M���������˰��i�7"�y�j�E
]#MTR�u�S
�1�"%���\~�h������`A�}?&LF�sCFVnC�Q[�3@FȻ���(GùX��� �>��E�[�S`�"�a���h��F��I2< <�$<�j��3�	���$��r���*\̏��<YR�=4T3�������w�u�r�k�t���ԧ�g�(X���Yl8@X$NV�8���ShT���Z��kh	�/تk����H�Ccu��7@/�\�WT�i��9c��y�f,|s��O����F�܀�k�g�͹$Wz���}��E�$��R `����_�����񞺫���JԋG(�ǠF���[��~4�9�ʔ�"��卐�b�ԘI�|��鮴S\���� �x]J���
�>�<�
`���&�V��aO��>����*�<3����=	���`8J!��|r4�G�N�Ҡfy�y��^s�W�V��5m�ܻ�:<�1�幝ň�A
óp�Occ�j�i�H��~�\�m�̠3hR/��XB��\yvpJ<�4
�H]b��'��m�U�
�q@��ݥ�d���<�m�W�j��6���:��S��4
3\c
�:�t��W�)�nT��jH��z� ��"�.�	�<Tm�q9FJP HC�b���kǻ���U�F�a��F��eV�Ŷ
�ӯ��%�7�c,���=�)��8��d���ZnQw��L�� [QsM)��~�|�r����^�(t��t��h��~����g��󍔊[_����5q�����.x�p�@!i�L�
h����5l�K>a:3G P�U�Ic�X`�⪉&7��Ɩ��7��Xmw-4$��ZA�H�+��N��lj+���u���6�0�`�|��x=��c�(�Ijk=�7���/P*�K��K�����X��T���H5�N*��5��+y�n�`o�,��`��ٹ�3�pш����֫��x����Am3[H��YU;����{�i������4E+dfx��R��1x$�����F�e��l���BW+`�q`�A�|(G𜨸��F���hK��eI�5����5����A�͚��Մ��o8�8�+���>�����@��k�0���b0�G[����y��CȈ�^��L�P�6��e�N>Z��Y2?@0�4sD�������0H=딮���cѝ�6<P�v �j���R����g�c+4;L(4�A2a�}�
�������<���P��A�� {�Ÿ]dR���G̳��OU���JJy_W2/�H��5�}�]z>��hN�7�3�w{G��5	�8��XZ��؊*o�t�e
�:;�Fe��x�;���MlQN0V�n�p�0ת����3�Ӵ��c��ȷO�j��2��c�
�����/0,�z�wrs�"��Q
���/���(_G;��`[QDtc�{t�IL�qd�3�f���}}L�.��0v��N�,M.�o�la�Ed�ޱr�ڽ"xŭ����Z����_���iO�̓!P�*�����"v�#�nɪ�|��:��	�Rr�|��4�
"=$D�������Á!���@�B�bΌ���V��1��"=�|�K�n���γyhqjm(��dq�8���is?J�:c���Ծ�g�@�G�<�^�>�k���7�IvvaS�A�z���	���p������U�jJ1r�tڹ�$�;
ú�/1���
zW3��*��OX�J��]Xj!y.*�.B�*��+�£�������)��?���wF�|@
V���S.TvR�E�Q�6a˿�|�u'����߂��1��,Co�q�D�2ގ˔y��0!Y]�X�{;Q���P c��o)�܄��d�m��\�`���E��75*�Ix҈W^�Z��g���bA�Q�^�	���DN`ON�X:�E���`�x/��*�M�GJL6����8X_c���2���MY��D;��Q]��f�ň1l�)�^�
+�4q`��̬8��,�N`>?�ٞ����:v�X� ��WO��o�;)�F�G�<?�I;n)[j��Q�Y?�Q��"��iG���}Ǜ�����F�x�iME�+,��%<y��ZiB���0Е=�Vr!���O�-9�K�d6�U��O���{}��ӯ@+ZY����ӯ��׋XW�/���)V�B��Yu
ON����Q�AWI����?wwlK��� $6n�Ӆ^f@�{6�|涹,7���NW{X�h�m[
�_G�|��r�y�'�5�u']�e�{N�
��:Ar�C�G�cv��C� �S�X3�ݵ{�̴��|a ����="pLy�EՕ�o�)H`���"�ةi���=��}�jM��AeK���	p*�K¡p��M)�rXkp64`�8x/��+�<�$�sE�"��Zb� �r�P=;l�/)~k�����Qo�h{�4<��6Q"�����<C�&�Ł�-��NY_^4z^C6���"��Pw�����@�U�	�m}���1:Y��
�γ���A)�8��J�[8K�Q�r�Q�ቛ=�3sl�\<�{5�J��!�d���Oj�c��qy#X�����-7𹴿��J�k�ySq7gsP�B�D�9Y5��m#v���`2[�G�T���̄p���b�k��.��u.8P��s(n��4񺠧ୗb����p�I�!?�ͱ�<��K�Ja�[���Z��Y�@F�<������~�3<��,�t!�k�_�h!��փ����(0<��pTO�-f�N�d��g��];>
j�϶rP���MK��i�KV�;^��F��f����k.���__�0�״?'��t����p�3��H
t�2o��F�	<:iy�@�?�󎨦D��׻��� �~rD͗P�N,f���.���H���)�ai�I�Ҙʣ�`�dZ�6���;�;D��/#��<,F�}{@z�����S4d�:���%7;��m~�]�	�����AE�<2����o�����tȥC`�I� ��$��3R��πx����1��z:��.�g6k��%ϐ��+��=l���1z�_E��̔��cV�Վ	�D(���mmE0���l����6���0t����C��[�z��j�(�	���,8�m�����̞Dy���PRp�*����?R�goן1��H֯ڏ�J->/�(��H�0i�ъ� ��~�m?w��I8���x�1�z�f��+̸��R�ŭЧ�W��1�4-��V��aJ�Ї��>�H4dU�0��(+h�q�>D���^��96��ݵXє�Ԝ����9F(���b�Ws�K�:�������~�e̛i��?�iy�+�	�s-�i��$9��C
3:~vzz�Vh�NwT)t���B����g��_��}��!-qL�k>Ӂ�W${������)xq�0��O��Ў�q�N��������S��AIVʿ0��S��Ӵ����|a�r��*\b�%K�d�����hg'��OJ^�W�XH��X��0}$��^�p:��tp�L���ϡD�N�����B�11�E?�`��-���f��~'���
}Q@�a�P �>�$U\&�ki���~�Ě�߿�HG=��u4Bl�O��.��1����q�y��t}���]�H�����,��Ɣ�k��ȿ1s�S��9m0�G:�W&t�.`*K�YT!���_>Q�9Ő��������6����.�eHt*"7�~�GV��kx��� �
�_A�Af���4���#�v�h��~	*�(q7��L��/�[�{I���F�g�-e�:fZ�IM�٨�|��δ.d	���N�	͏�X^�$%�����[�
������[�`���j���ht*>�
}�~��|=M����a�мN�/����2��s�2#�D鬙�ɺ�-t! 5y@:��|9	kF4%���
F	��=��o`��ayC���L�KY*[~8�1�CxEU��&��a,Ё;�.2+�-��ZI������6HO���� h��}Em�f������Dw�B㗠=�/����b��X+�����=�,���Q�F,���+�xY"�'iY�����,��<�+K�z���#d�`�4
?vě��髷߽z��EI]]�f��_t{S�z-�%5gQ�^�"]��/ڈV�O/��c�[�����#��}�;�p������K��«��*��j��A׆}���7I�{<&��-/� ���W@B�֮Z�rМL'7A���h7��#���&�����/�5?p;er,���Ab
����ȗ.\�����2�@�‡���8�1FR-.;���
��+V�`�����/�Quw��X��:��s�@���\Jt��AmZ�9����T�S^�ҧ��S�0������Oc`��dž����D�E:�ih*SM�W=��[�mN�/*�;���S�#��:ƅ(��-�'j��ibˏ����l�����_&����������ɉ�A�cv'�=j���Tv/�
�<ױa׸�_�0��$R��1��]�7Tn��P��G+nkwK��/���<Tv�L�}/o��p�P[͝�SB���A�0V��m�����SO�ߜ�y�����m��~����@�+ڎ�_(&�Ld�"S��p��ہ�9�PKE��T�,��^fpip/_vendor/__init__.py�WM��6��WΡv�h�i�94�
 ��!��4���D������}CJ�6��hQ��8�y3C-��Um��RS+�[|�'Ք�����9a����Z��
Q�jq9���4™�|�"��d��$y�4��Ʃ�zg��]e:]�
��K�Pu�y��$$�*��{�%][H%�sK�)���5��Z�-�:M8^Xʲm�;KY���^ȍ3����$��Km6�o��V�jxt{�$�ĥ�5q�~�M�ubW����%��B#<��(�ǐ�x��TN�J� x�Q*����Ϫ,�BX��8���(��r�9v'��!�p�nѻ��R���'�W������եx%� ���#ܭ�_m�
��+�����H�"r�1�UZlCn#;
A�B��9�
��i�0�Z��"��ֳ�C��}8K��8��\��b��'������M���$Bd�w�U2�zƌ��%�WD:V�I�/U�������]]��.�{Ƥ`/�g`�Ț��!pʲ�*	T���y�p�D�+�-r���߰�V�G���M��
�h���a��ˀH4ƣNO)���4���7Ԅꁗ�ֽ��(���M�����lI�/,�ӑ�����//RT����2F�^�L>�$�5�����K��ٗE
�k�K�l-F�I��v��'��5�F��Cт��S6~�E�WOW���rj�x���5���x���|��	j<Z2bv���z+�C�,
��d9*t�pm�B�T^�$њ|%����Z�D��y�
���j�8��S�jrT��"��PC\/G_]��r,\C����:҄�a|�X�GG >�xI(QЯ촴N�R����X����#O(���j��$t�ù�)t��XOc��-4;�
�p2ۇP�s��ʎ��B�
��`��U�<5�a�s���x�
��>��H����x0�H�V$(߳N�k���E�X�g��v�-�{f/����-cw	�dbt���&���5�1�M�E	f�0�}���	ó��7�{]I���!�`Ԏ����󃕷��X�uE�;&�x��9�q�Q�)��(A�'׍}��@t,�t+Ύf.o`��O�B�����(���M��m��ܚ\����d$�#�k��a@��(@�h��x62�aVT�ͻw��G�H2��>�d�q�K��a�|B�Y�]��c�q�Z����QDz����K���"�yE�[�
�:�V����[�g��\��d��1k ?��$���k�d���2������%i����k)6�;U������7e�a����ȉKńК���aj��qF�=��N<�DP'=�?�f��-����`N6��AF����7
��̷Hq���Y��������I�4��<M�q~��|�
o�Y��l�N���1s:��]+�pV�����tq�����CI�$43��
���^2�µ��:����V�r��z��vxC�k�L�k�UM��}.<L�8��v4��pϞ\�jV��4���XA�rr�a-�M�N��4�:*�X���\����y+s��1��2W�4�����s��PKE��T���!��pip/_vendor/six.py�=�s�6�����)�1�O�%vڻ�ԝ:���>�Nv���yh��,���a[���@�O�rnΓ�H`w��],/�Q�\%��<�7{�߼~��z�x/�?�E���$���;/�%YiđR1�����m�F��Gb�H)���nr+G"���Ē�E<�� 
�[�
Jr�́Pϲ7��7Mc/p���c/_�(s3,q�2V6�bp�0C*Ɨn�]�ՙ�!��q��D�YxHe@^��ȇ��E��@tG
�p�B=�ۑX�~0�_I�[��0H�#�H|�g��b�'#Ă��k��T����{�q�!Aa9Kl�D�b��<^Tk O�<��XIX~��R��^�)�0��0~�
zq�X����
r�i|/�J��(΀c�u�,U��ҹ�b*��h��[�U�<��A�b'Th��63��X\���r89�Kq19�u��^�`$���>��19<��]��g�����>���o���Kq>b�Ӌ��1��ώN>��"����8������9����/�����������~���3���|"����j|��p".>O.�/���@�l|�q���]�P.���_�E\~:<9�€��g���G��Oƿ|���O>C�c����1U;:9��ć���_�	��`
�y_>c"�y�����gX���	���������x$'�K���)V8�D0ώ�
����ϗ�I����]"2WT��;;���s�`q`30����}	��BK��,�����Eb��nwvf	����,O��`�v���!4.��wvT�,��,��T'�*	1���ʼn~OWEV�Z�tg�q��H��1h�<��T%��$~�8��ih���xo�7?د� �ϩ��!U`VPs7I�P��+f3p��L���;��	���$�h}}-�d�wg�c���w{��a���!�l&�ݎ�?tVѭC@�,Qz>�V&E�s��G.���3��Q2S��i��J�NWJ3N����bv�>��_rG��l�jꦒ�ڙ��;���G��d%�G�u���y�e�p���g��2t3����d)v������{!����
�U�}G*���t��T)	��e�?�(���+�9,��D��.x�\�4����.8p�_<�H�_���I��Ɇe�$�S79���4�P�5[�Y͌�DB�����ΒU�X�Y�a�(=���9X����$��*���+�P%q���rbZ?�݈��5Z��o���e���_�����i��.��`�Ʈ/ӐkYP�YIp$g��j,�^#�o�������'�s�+�I_�`;H���j�̝�JJ+r��>f�9o�4��;hN��%��d@9+
u4q���fA-�(�_1��a�sNܿVd�%5�c��h0SF7�$GH�1
��?&ޭ,р.��	�^f؈���qx/��A�K����BR����;h���bYv��cPQ�s����6��A菄{~���5��B��F%�����Qf�:/��VC�:�{=ǨD��f*6mizK�6�F�d
<�X�?e{*��F���F�|8@�7��C�lD���]P�V�췌4��G�M_���d�dX)�ɇ'bB5��jC��H%�Z��T�5�E��������{7�1_�ݜ�R��RF�:�sM��檴͝'�P�y�%%��(�+[�3��l[g���A�쪰��(G�#��5�� >���h
�p\��/�DW7��.8"�LA�O�]p)(C_z����$���jC+����7~�,�Z��퍱(x�%��IG���v�Pm�Y;]�H׹H�AP-��_��`ꢚ�Ф��N����+T@tI���ZWV��Ng�!U+�~ha�s�}Q�S.��S�p�9� ���P,��l�-�F�"�
mlD)�!��9w�L��b.�B��v������,�0"Ct�`���&;�I��a6Q�(������TB��4�Uc.��`���B]�j����D<5�*�]?D*��?��(
LCm4m5/aP"��(ݞNG�W���j�̯%�{�k\�b�C�UҠ�>�i%�e�^���5�=4/���b�0��s̡}��ra*N�f߈��8�*�V�ϩ��Z�n��J�hX��]�ZB��
R)�P�5����L~�ř�B�[2�o�U����\��4_�BŐLk]���+Y���٫��~Y#��4�p6Փ5_#b��Ι,��.6�TSD[�wi��j�5�T�x�:K׻so{4��<�M�F��`��#��UM�)E�.g+���j���yL�� Mp�I�S��,w/)9�Y9�}��.%�	o�7�LU%�nZ��Z� [7��Q"(N-��cRo�,�?� �Ք�,���Ҥo2��ڹ�������lv�^ߑZ牧�T$���r�"����H7�զ�����v`v�]�Gpp�������8E�p�m�Q��P�gr��# �Dr-�σ���]V9)š�P��p�;�R���r-�x�4�9>ǁK�%��"e8jş!T��D8�LsHoB%�z�5s�4V_j��k� Z��o<V3M����NjP^�B|Y��]��I�O	�~�G�8-��Լ|�G���O��8ϔ| j]@hJ "^&�'���'nt+׈���.R�h�-$��Ӂ8���2�8�wS�s��l��Ӆ��C����/��d�`:>pV���j���s*��G�0��8%��v���'0�Ш�yCT�O#�o�?~CC�+XӠ�t�pp-Cr�{<N
�|5i�i�
fM�`�8��K\�#'yD��ގP��q�^]��W!􂒹\�W��}t��,v�J���r��s�?]8��#x�_��1�<*�48%��;~�X��l?y��{���?R�C�\ö7ϲ%��] �p�<����̶��5R�/>֐�E>���붙��z_A�R��H'�Ҽ>]��\o���5f>��q��ӆ)n:�b \WEJ�Oǧ��+)d�B�G��(��ID����Z��&��Y��i3�h��k�Fq�A��.��5�Zr��U%�P!������K�ܳ	4SH�)���8�e\Eh$��pI��*N[�::�E��q`<.��
��\��_����e�l[a�ػ�YZ�N�݌���T=~'�� ���c��n�o�P<�<[��&���Gxk�1`�H�^�����R�k#��*p��.J��N��U�f�cW���1�+�#p����:wڠ��"+��F�ث��g��n�k@�A'�<�����0�H�4f�
��"��Wj�R����00{�W5���YF:�#e��'E ���4��9нLce=���>�X��_��ugwU���Z{ϓ�w�@ZOHМ6-i�5���@I��8�$5�&���$����p���8+�ګb�Lm�����g�@��:~��~Z��~;=�\��"Tvu׸���C��CJsZ�,�D��T�$�{���7๪�$���,P�K�S���U]�wv�u�M��H�(g�x���Rn�N3�&��y�b��6W�c�&�s�E)��N�K��Uu��������Au��au��N;_���vZN�5�r�&��, -��5�j���J��҈`B�pT�X���dۣ3���
�AH%����A�%�	�T�Ž%n=��<ں�bj��ꛣ9�0O���G[��W���mF��u�nE��A���FA�jKܬh,O��+=�Pi���H��b�^����"����5:@���\���z:v�[7�������v"�>���k��^������k��o^��	���\��1����6��lW�J�<�<99�F�{�����8����Z�U_�bqk�/���m{m7�[���n	��n�z��*c�۪���m1Pk#��n	�);��*zU�U��[/��K��.�si�&a� �a�kH�r��������V�_�P{��6��2[&�c�������mj~NB�ச.����r��P���'7��-��&�'v�K��}.x�|˺���9��\�3+r�!N���oB�K�͕�&�
[�<��Y�z�/��l��J~B��oBI��C�K�ߢ�߆���1�\����	�g�?��#כ�g���犑���<@%��V=@y�t�|�
6D���	jt#o�,
�w�`��§�
�����)Ӹ��oF�=�6���V���퍦��{j<]��uM��bj
^��2���2����&X��9u��ĩws���*��&��T�!ږn�ynwD]�w��Ym�}���k�C�Oo�zDU��[��o6	Mh}�(W�]�0V��-��ؼqL	Èr�F����†6WR���J�~������gj�����kM���nr���#e��#�A�
K�/Mҥ��id*S��?C�_��Po�G ��%m|��6O���8oC<=#�x�������ȅ �RQ�����|ϭ>��K�#�K��U
~d�蹤�{�Dc�6�
�����e��:t�p7�3���Ri�ڼZ�Dy
"�ʠ�"�w���1�.��/iT�N�'Q)��m�!���Бqi�U/s��O�(�Z�5�@Z�7'�#�]2�	��h��0?Iw�0��c�zr����F�y��y�I���|�R�3~���T��y�$�|�V��
�*���z�*zl�d�cW��/]U�$t�|�.��׿�]%������lG���g蟛M�
��32�X���u,��
CwJ���Ǟ�5~��,؍V*����w�/VN�R��w��;Et ���i���<��y�;��K%4P�l���� �iW��}a��<]c���0m��Y�>.��a�[��Vf�అ�VuԫZ����!�g��>S1�2H�ZN-Gla�d�-gkEY��
����N�%I�i���"3>R�
<�zV����b
�B����P�FCP���AB�Xnkhb)gՍ��D]���Z�L�V�d�փ5��u�i�n�	�QL�@�u'W���3��{h�w@Ƿ	� {�<ڋ�_��Qhw�:Ն�3Z���Ŀ�V˔�Z8 
0w`@s%��9�� ��(�m�RHI������M�<I!�n��I�`lC�*CC<I!��R� N��a�8��(b���:�96��u����DM:��J�n�h����i{�.'�z�����ʬ_���DS���Km��f
p�R��9h�[1(՜c��S�>�'Kr��f�lw��A��j_ҏ5��`h�Z��h������
��}��5G�|�={&� (C��g�� �7��/BĶ~�����s�K��Bw�0�$;�N5;�3wC���iT�|��͵��@�1v`3��o��[�X4��F
��N�̛˴|��uJ�z�Ȇ�m��X�w�
S��%N�܄C<�:s#�
!�S��B���VG�Z���e�z�Jv��ݑ�xҞQ�qd�K=OR4~��?&�uPnM[8�ҿ��6}~a��4��DЁ�Ͼ�Æ�_���8<��*>��/7�#��ͣ��FR6
�Xm4=
�&��4[��Ο`���0~ƺ��nH�q��S>~NW�WA��CL^��m�4>)���ScІІV�R�!��3h�+�y�lP���օh�嘝 �5c���sX���2��_"i��ʖ�K�lZ?ث1=E�	��g��>��q���
D�~"�o��|LV6m9��f�	B*�lZ%n�� �3��t5{�1AEU��9�U�L��x��á�QS:a쩗�Hǀ�g���ǻ��x�<�(�i���%�4=�`q^�ޭ7��k
n��.f�[w*���u2#Pv9#�!]�U�s�ҳ@�+X´h�`Z��4��p�x�@*�;�FRځ�m�
N��>ߵ0�E�v�*��㸹�56L��.��Y��0qY��
���\B_��z���ŢP*:��9��*
���ë4[��1���p�S+�ҩ�{����3[�L�^�K:�	W�QUi��yV9��[M�}ou��|���f���U�"��8���y�Q���c>;����p`D��7�����4� ��LYG3�p$6D�5�!�:��|7�lik����y<�G\�aD�΀S�i04�x�'��|ΠK��G~�#E���.��'%5!��+2SY7>HiT��\�kX��
-5�@���$��^�k�I$�����>�	�%*�t���!���}8���b`����K:@�Qsܰ���kN$7�9r�A͡�vۂ�A.���>���d(9��W$����U�ȻY�Z��$�C4Jo
`����@��4���h7���� 2�#���Ն�1�;�$��Z)����47n���b�Mx6r�@��"��օ�@������f?�2�`�*N*��$`c�|����RK��������f7
>����y:������ KPf�9f1$�԰k��8Ip�h���*��vn��o�Ҩ�gd���.��V�A]A��G���u�tL���w���Y��ߕs������].er��a�,o�*���KJ��=>�[f�q���Q�|ǹ�Ԋ�OH��F�u�V3�I�TV���R�d����3E
�1�]�g��>��s��ԑ��
W��)�R5�
)j��`�.Lϩ
�R�#�P�����8(�erxqq<q//ǿ��e��������/k��r�ܪ6���W��Bשv��mp�	�y1h"j�mm����B���1̚)�TIݶ�*��Zk6������6�d���x
��U�6��3��V�
�H
��2�������:�X�Ma�k-��+����5��R�J����cNaPFTMSѴ
�Y@�,|M�rKV���v���@-gʝ&|��S(�y�e�Ft-�;�CS��I�t�Cx�p�:rQ�*�=cx�{��j����Q�}I�!iz;�p��8C[�?ϒ68�<�VJ"3�bj�Ý
�cya��.�s��HBH�a@�����o-���k��$�3d}<�[|��k]CS�-TH�Y�
�����{¦�:;\8X	>N�/6��
Z�Hv�+Yl�Qɜj�����5t���K{t��u�8	n�qv�vz�56�m"���A�Vqi���z,�3I�Wxk��;sq{]�=��bm��jlmp�Y��n&q/���ݑ����ݛ�MOFk&K����+6,�Z���o��b�^�tDJ�wi�9��2x5�.cެ��)��S(�:�&�M��5���~���J>-�Q�m�Ǘ&��g�~�aS��e�["7�`���Y(TQ��O����›}wk-�~��]J)�=[i5�P#����,�b��{g#��<�)�tT�i����տ��ɘ�]���5�3�xf�˗�˗z��q���L�1E�E�Jܨ��x���=��n���
������5!MZ��hP�w�gd�S�БyMg�ro���g�C�<Wc��t�x83^Շ���~���d��7V��3��i0}Y��Gk5���5
)#�sF.��T��o���_�[U��I�~��*S�Cg4�U��Ҩ���f���&�~[�Y}d�S����V�7�hsIU0���ϰ@� כ[b��bXE��>�ql���
N�!�3	�<����C���̺�'�{���2F��H�h��8d��(x�(-9]�V���fھ�0A����5�NcI�D��{�pg?B�����H�YU&k&��
�{m��٥�R9����&΢��廒v�iַ��N��Ji?���YDѹ$>0��K�o�����4���\����觥�/����:?(҈x�q Bw1�]��睾b��,)���I�)�
�(�V3�.�s=�K���j��K�0&�	C�E�g�'�
]�oʗ:I}`JD(�7�a���H5>�S�@��D�!���~��0�����$�>J��y"�X��&�f8w����hbءk��ډf4����:C'�n��i�Q0�x?c�D#�u���x!��_�*����n�N� �O�J��-����4�F@k�iDc DS�
/UV^F"j��CM���.��4_B6��UC�x!�MA��=2J�a��Ղ�^�ʒA�r��'��ݴ(!�Q%��(��8�X,��l_��6�n�A����c;�>�2�R�Ap_�衽R�-��!ڪ7���ĠW�Ћ�C�"x�0�k�
b�)�?+Ԓ"W��0e�WT��f,
?,\�Y�v{֠ua�����,�GmDE;xM�}
�c�r���ϖJ���[7F8*'ɘ���G��Q�y�N�@�ٷ��A�;�PKE��Taf��?F�& pip/_vendor/typing_extensions.py�}�w����+��ǥC3����Z��q��/M�+����%���&w�ݥeE���o�`������/��]`���`�Xo��M�����j���mQ�M��D�\n�y[U+[���u�V���\�W�&o��I��M=.ʋ�����U�5y�:�7�t��V�i��6��,o�_�ErU��E���2�gm~Q�דS�89=H�� y��n<j6���V�B���u�o�fBņ�VY���ñ��JZ���WE��̏�-n����y�2���+h���i}�t~}��ǯ���|?���б��fe��Pn��k�%c|�ų&I�u�'g$�{z�m6s �6��E�3�}�J>��j��_�/y�hk��7Y�]���YQ~�m\��u�檻L���j���/󟷹��̶���bޚG�f�|���z��BB��b�z;o�0��2��n�I6y=�&@6U[A�M7���n��"�|W揪�2A�0e��e�9-L�@py�N���<k��a!��

��la�e����v��Y�,�zm^]�m��RS/�дG5��(������r/�V����"��B��;���e�+���w
��V��k��b����h*=r�s�tUd�~�mVۆO�����g}�����uV�ķ�9ЀE�@lE�f�۪U�ΐe�$3X���@��M��bU��/�������-����O1�&o3x���'�93Q\��,_UWIV�ɺZ�"G���f�4l����\�+�r@j嚪�y��J��dj�L
f�(
5�)y�0S����>����`����y
��f�%���//�e¸�^��
��y���竼<�ڣ#��`0x��`u
��/�#5�j⸲D�&6I��	3;�,���7�/�y��u
��y�����{��v�E�����t���V$u�{��:+�&��s��.7Г�Z�º��#	�`!�(�\fMֶ5ck0��aO��Q��R�v�s�~u��C�;N�ߴ��\�Ҏ���8���=0��j�a���tu�d�6&���.݌�<h�v=m�L[d��ٮӢ)ʦ��y�nƉ�:G��pxj4�����KJ�ǟ<��FIE�cU�TUr3\g�Т�3�����p�_
o5ư�4�t�3�� �`�s�oa1�A6��a�pC{ �M��5�i�E��ph�G����zsYmW����S�/�$��88Q��:َ��y�d*̏�X�I��%����it��v���{�x��j��v�i&E\�d*������o2l{I�r�͝>��*sœ�P	�y�T�o�-�l@7�f��B�	�*�_uU7O��I������6�����h�|t���ְR���#=NO��ߊ�=}K�l4J�aR�٫Qȷ�A!��q9����
2�P�[D.�<Wk��18��;�����&�Rk�뀿���}�B�'��r���#4
d%uڪ�G��3nXȕX_J/��q�a�<A��U���l@�i��ʣ�f��z|�m�b)�ks<x$aKb��D_(�LF'��N�'����k�19�:V�k)�un��+���1[ms)x؏���c��l�Q���޹q6�<���W�t`Y�m�a�oH���;X�+\��R��	��.�z��I�ER�*йx�3����L� ����+dݧGO����P+�w}������r'����ڲ�W��p뺪=��Ϝ���N�N�2"2�)���d�|�`���B�c��T��AX�
�� ��J����g9�q=�	`�oZ��r���JHu8��2��H�S���7oZ�=�H䳨����&��Y��֢�#$���2�b	�=����t�P\ 7�g˺X,P/q��QȤ�ޘv�����s���~~d���Ǐ���|p��$�z�lJ������:����,YO�6��ɋo��É��t�pg��������@HuMF�x�ɻ
���J��u�b�%�c+�[8	O��F���C���(�S���\D��%a��8�m��*�c=���pPb2�R�rx�C��C�iR\�5�f�)���L��'F���e�n��?�m/��溽��IU_|X4�6��}��
�'�lpA�E�lT��R�uB۩��*o:ZvNx�~
���Z�U�٘ع+J4d��f!�Ɏ5��E��]b��<F<,@�c�<�,�g2�D�{����d��{��A�4��oy��v&��poN������ڇ�^z����f�4y�	��[b??w��w~��1<E��Gm�ir�X�B��l�����$ȕ&��]�����vՉ�ͼ���N��OM��cwP�V��bC}vj
8X���� ��������HJ(�7$lT?�O�*�Uբ ��&�R�����2#ת�ܑ!*�f�bՒ~��n�bA`)�IV�
|I���T��5�,����Q ��8�<`��+��;�n�J���x�t�=+hњ'Aj_��,�X]�ͦ �����4��+�$�$j�ߠ���	�"���^8l��$"8�̝~����;� �ң�c)�|�H��0�!�coH(�V�1�*>=MR!�懓��2��|ֳsF�N���nخ��5��d*-��XG�B:)PGwE�pV�Ӂ��kn�.��:�/�w���+!C^1�W��P���:e�8��	��*�2�ca,�A�
^x��ͺZl��$��T`+8���Ynnoo��v�_�@Y#J�ev��J��9��5�O`�Z`piO�q���YNxr'�h��|��K+.娄a�Y{Ӈ,�5�P_�1���@�\�V��U�[��]z	Me�F+#�6�g��sY]]��j�}��'��nM��f�{n��m���D�G$�)aM�MwW�]��Ń����a���>*˪|d�	G�I>A|��UV' �Ӌ�ne���Ȋ�!�2a��A���f$1{�&�!LSyhA���Njv��_U�$�m=�8q����e��
�.�7�N`�F`�6�C��<~��,��4��� 9���{9��0��`��,q�e:��	����]fu�233���~���;[�Wx9�WS����7cWB�������%B�d�)).�Q~�Hl@�Y���嘢�ƃ>18<�x��<LHj����~���;�4���|w��詳��)�!(k�1�a�L��]�ʓ4��:!qMh���P�Z�/��D=÷4On~
>X�y��/o�)�dH�b��p�Z�Fu�_V�E�:��m����>}��#_u�p�TTۆ]��ź`�H�a��o��O�e� 
��k�x��7nT�Tȹ������:y����ƥl�с�j����X�*�)˽���;��~~q!�	*(�/ݤ}�G�?N����L�J=r�C���U"b��4��[Un��_���O��ŷM��9�F���x���q�R�9~p�>S�R�ׁ�����(����?�����x�����3X���7?C�e(�ɕ��wT�@�k�\�
��=�<365�a�}���vG�Bĸ�㙱��vb��He
z�Q�o�P�ы��>����'�u]M��G���؃"��P#T�ՠ��`��*7�d(��a �A�(��N�,�!p2����)���u��?P'f.]B~"���w��ԼQ^�0t�An '�E�m��O�S�S�R{�ߤ��N�м<o�(C��]���:_��`Ec瓪�o�{�=�Q��!?KӬ���@[Ӣdj�:�(�O�Ss,1�Y�un��m��S��`,����!.��y�G>�̯vA2��fKl�)��_�^]T��0����d�E��<7ze!��\x�t��g�3Ԓ��X[�.5ESC��†��|�y�޷ĭ[�:����l�m�j�8�!%GFwx �@7Kx"�5(GS��Ժ)��DP.��[�Q��-������be�_�dU]�L��]�8� �����`X�z��lS��k2C��2��c|�~���5[h�O��ip�7=H�DJ'C9=9�ip���g��0��^L�KF�X���	�ٔ��#��6���(���^����b����I߿Y!"��cUE�Y�HS��g�E�B(�>tm^*��=��o=�]֬<�xw�uM����"�����v?��٭�s��*��(i0֠=�Sv��.�D���C��^���n���2�|�{n�S�f����3�2n�[h���;L����W�%����1��d\t�O���cS���f*�a�(�E���X�!)75��ERC�p�C��u�5������{�%�
��v����g9�.�|���P���
w��,�l�/�4E���C��NYVj�Ug~;�k�x�W�X>-+�$Ĝ�{
��kMj)��&��&Z����n{�(�3����4�$S������]uE��/�<C�dku[)�[��ElWA��:��ٖ/����
킆G����[�91eI�<��#������)ڭH�Wd
�F��.�b}�Pvqm���$y{P(�~����
�.U�����ga�"5H@
"�*���|��^��B(�E`�ey����!�!+�$S)lU�<]�#��DО}�a���h�%OK�zy�Օ��s쭸`�����m�
�M�H�Ƣ�c6=����[��aA��x�
]C�T�,��K����ʪxC�
ک�r	Q��	�F�pK2�/LwV+V�+T��:s�96Ώق�}֚H�$d�]S�m�����	��F��5GQ�(��Z)\�y*edGŏg�z�ś��'x)�4@4�JhjXe�ͫ�����V��M�G�T ,��׏��h,N۝Kn���i�B�}��7Ǣ��c��x;�G>��U@N/<)<�9]����Ӹ�X�U�|���}u�T�})��
��G�D��yi	��A�*�J{`�����<�R]���1�YĆU�~��J�ɵ��31�]!�5��"x`>͟���E�'w��y��au�����}�8��9�yPRϢ��Mr����R(�HS��{���-b
v��4�f�M
���n_��T�s벾���,���ŝ���A������r~��%%��)�B�����ޒM��i��w9xi=gPt�m�pg��
�x�0�n.`\�����o-�����"�G.�����c3�8������C�u��N۲�y���2S(��76}�n��+�T���Y0��iq�i��ǽ 7�wT
�s����7�n�]OG�7���.��!�F��y��tA����[�}(~�eR	���:��x��V�|fM��转{nC�GF�p�ԧ��"8#���&�#��q CǕ{{��.p1Hx���A�w�����~�S���/��-܅(��to7srۙ��#q�Τq�.�ix*Vi�'<�&��:�i���J;�y��I�.6�\f���*D�Tp�/S�C��K3���۪}a����QZ��"&5�7�0z����I!}2�,��j�N�F�;<C���~֯rx�������l."r����p��[v�� �<��CyMav�׿2�Ώ
��k_�-�K��R*�Q?��@k�ox��V(:h2��̯�9D
_D�PwIɡ�:��a�>��x׵
�jvAKۖg��}5�+p�S�q�CD�7!�Ϭγ׽%��!24-���V�#�N���`Wwq�z]���r{"Pl��;��h���߄�P�v���g���o�����p��	/��� Nj=�A�]T�~�3�T7�S+-ab��M���A�P9�F�I	~3]KnԈ�z���)��9o�[�u>=>N����p'�u<�:^d;Z�T.
�MĻ
M�c{"*-��^�r��qrH��[h���m��y��6��(��v�n4���pr|�U'�ʌ�R�2����Z�fq��J��2N��U��ӿ�;i���y�I�[�$�ޟ*���fU�2>�V���h�͏n�����,m�`����RSJS
��DvAҘ_""�+b\��4H�Y���\�y��
��+4M�w�6�42��w��a�P�/�
?��D��ٶ���5~��Ɂ���.U�^~LF�^�[��Β��S�ü�1�L�^v
T�L�����4�V�&
���Cg���kV��7��lU�������sJas�Y_ڴ�ݹ��`������=���Oq5�ף�;I�_m�h��$w6��O>���}�t��C�_xXm��٠j5�Ч��nS����z�;��e�������?ݯ������M�V�j�'�_<��[�G�"3��,T0JO�hnl�xb2tB�h�
y?�JN�c�,���#�����q��������ء��~FTcE�Mg�3C�F��K�{�w�	R�{��uD~gP���Q�O��5�L��D�3�v��]�Ͳ#[s��St�-�/�̊U���"��4"��̯ҝNFdR��wl�v���5:�H��A..��%zT�q"d�����>=<:#fH�2��i,ϙ�4<u‘���p0<`;X�^5�Zs+m%���Ā	�.�|���~��Cq�ph�F$qJ
���T�~:]t�ٳ��]MQ�ɡ-J
zF[�uh�_O6�&U�%�?��%���ޙ�����y�������	���9y�vq�/�l:?q[c�!�׫�M�:~��Ȇg���: ��K]>t�l@��r�z3�#=������2)���ow�=a�ٛ�fw=bk#i��\�p�%򏒻��ˡš]P��mY�x��'�{^��9|h���͸P�M����� ��	�] �j7}��Ѻ!��k�7Q�f��1�ѿ��j��d�����߱��f�?���:��Z�	=�
��2����jղwG�fuya�s��Y�}
#!&����8��I%	l�&�%��Ĉe�;R��]����J����m�6�t4NJ��ҿf��v�.�޵�琉�ϐD���>p��F!A�Ş�#���cҝ�ΦT?�ڱ�+��[y�<�s���꒻�aD��e]4��KՐzA���:�6**�8K�M���}�&܁��:역!�w�q�/k8�6�e��%�A􋘱�weռ��$�8_�n337�<�sm��qEǀ�M]�n�@-G�*_
�J���u�
{n!��{�sn��(��'V�M�;"�{��}~�=#חx�g܈�%D���4�Wg~�����U)��Dw��HL�m��̉�>�vc�5D���
I)6�(XN�a�L�T��U.����nD�.]q�dW�.�Hz�9f�k�Xws뽬�ʩ_��|�.3���9������GI�x�,�/_������$�=��?7��G����v�+aR��-�7Aw�&���c���S���涏�X�K�ڔh~#�qU���kp�"��t�w��J�t�q'@���G�V01���K�<ֿɹ�rw�Zn4��Z~��_Cl76Q�@�����d���n�]�����TU�̾O��7��:���IS-]L�&�����-)�m�1���n�����>��ݽ�md��=x����8����_�٘�n� X��]ԯܚZGR@$�b�>)�P͍����\X��/e�e��L��:Z�@���Μ�`vG��pF�Ļ@��P�(�l�9�;�WE�&A��d�|�<ua�"��6\v%�)ۭF��{I,�V�N9�
�tAߑ��u���Ȓ9H�؜���Y���6{�m�«y�"噐�ӺipRC�3�^F�`e:ߢ���i����9����������sY�i�ɗ��Z�0����y|��f����;�i�4o�G	�K�k���R5�>������}���~��銳���σ�+$��+�%<�=��\C_����
IsEʌ�~�?ٱ��1�cv<���xi��јGh�t���P�ކ��2*E�"^zl��j����s��M����!�����
�DM�	��'&
@���,���L�|���B(�R�i�����+��kA	vrU�tC�>����F35�M�~���>'Չͦ��/_<;�o��qȯ4�1���Yc�(*0�6�¶��#o�:���.񊩮<����IO�d�(V�̥-���2�C5#��wW=�O���?�x�钔��a��>3��t���|�����]�4�h��^�t"P��%[=<,��U:����_��=ev���@o#ʙ7��1�	�'mD�?�*͜#�!A�I�Ty}�@9n�k�.-�&Ƽ�~��IK���)_%�	Y�ެs��8��	���a%�G�N��[���?pR���J,�;#L&��@r�3ö�_f�E��<��\�ڌ��2�������gb�[���:��C�И4�uN��d�Í޿Dq����%��0��F'��-Q��6l��4�~q~j�������E����?�}��b��"�7Ե�5��x���o��
��������d����3�o�R^s��'3�۸���%u���{oc�m'�js=��|�8��)��@r`<<�zA6�\t:�Q�8�A6���D����qQ�a�l�V����Tu1!gl�͎���8a_i|]V�\�*�j��e���E2ԙ�f�����!%��j���I��3�"��>��*PEP.V�T�)t�S䵸�.�*>�iL�	�'�X4�w"���g$��݅��ʞkRR��If)8Ȳ��|[7�e)`�px��-����4�g������%:�5=������m	cm�a�w�ۆ#?���C��5��Y�0f�r,�16mC�s͈^�ݘ`LP��!Ʊ�3"HG�	R)��?�����i�D�0���=�'r�HNG�k}E����@+4��M��!H�y��h�x����'�Qg�e����K�n؏�W
Y;Y����3㛼3��Ֆ��������಺Jr�Cq����s����� p�0�痒9s�`�
V�L��ލ�Tdۭst�5lx�CM�"�(*O���9�K��'�\��n�rlp�#�&J6��#��6%J�tI>J��&����^xٜ�%��U�6J��6�W��,h��5�t@$���o�H��;��ʅ��p�
ͫ���r�0�82�>����2��m�����9y��
�٥={��^g�r���ɳ��GY�f����%b%ci��;Η���DQ�>�(I-�G�+���{�*�y$�
��`�כ<�Y���V�<y��o��N�V�q��X�H`�A��t������y<�h�I7٘_�/��N8�(�{9E�u/�̬p��F���9^P;3�����٥%/Ŕ��vh��n[f6R�g�佔��Ɛc~�׹˭���"��9W|Y4�(��7�Lku-w
�k���a^kҏqt�U�r����uġ&�*Hf��zά!u)V
�>P�ǀ��Jh�gp6���2c{���I��C'(�7���䜃Nw��u�Î:���r�E=����W=JD�%Adӫ9����w;���3%_���xgna�xt�R�G��q�O�rp��RU}8�b�v�����#���5�D�W�����@�:�GA������
op�����6�`D!V�<��+lՋ�p`bTp\�Ӄ��#��FF<&PK�Xp���{�!�f�v�<%��w�����fml»���DFoW~m�s+Z�Blf�{lKV�B>�[���-� ��6�<kO1�%]�qiy�$�i�s�h�h��`�T�a9�yX����2I�	�S��8��%:r��E�G_��<	�5��ҁ�T%]h�'�����A�<A����x[��܎�b:G�\pHR۟���mN���ȵ�LU�Bw�����!���|t�����������k��l�X ����,�=mG���C��7N�������5�I,�b����,^Qr���U@��0L���NO���	���}��5j��J򮨖�8e��\E�VN��(��P�Bϟ�'{�)sx��u�B���7�Q�E��L��U@{@s��(�@W��Ŵ��S6x�>C���&�f��(|���
{#
@��ř�y�b�cL<o�sb���]�|h[�8��N�/�WW�� �‡Gg~��s�x���4��l�7	5j\�n�P�j��?�����4�%
���v�r�)�lK�2LN�=�H&�DxT�
�3R�-�E�¾!�1��Ss��>��������ݢ�!�0��&r�[^L�Q����Y�,�����ceD
��=�E���+[Fc��xW��ũ�Q�(�i1�N18��#Pa�����	;5�wݳ7XL6/'��u0R����QG1tX�KފA����U9�#��}�����n�P��qBF��ɵ-l�	�Tjz%�M�����鬈�3�Hl�32}GQ��ʟ�Q�����89.�u¾2��$P��P���G���(��ޣ4;㜐�W�'��@!g뜜��@�A���j/'|�ci����|UeP�.0��ݥ�3���!/�;X�ᘒ	mS��O_�>N�W$�&�+�f��n]�$�X�%��h@~��^��k$<C�W���6��Y�[�e"qkv��D'S
j�*�G8��Z�!��m����R�s�Bk�؋�g⧃���/͑vJE:��18vm`�S�o� ��D����g��T?�7���R� I�EO"
�wZ\��&�#B�u�H��8��h��X���2�6��){
���Ҩ�?_��MSD�hn7�T�X3���nv��b���N����z:|����&!Иl�?��3���s�x��ȳ�����vN_���ɞ��aW-<��R�c������S�%�뇁K�7�ĔF����%�eV"�mu�#iQDO��Q�����<������|�=ٓ)�e��n�țM��)�ᬪVJ;A:��d�D�"��5���/�9��mM���B�͑v�(�5�o�9�_w�5HHc3�ZHwwZT��w$��ϻ�Y�'B~=�T��5���4|\&q���o�j��8|O���8�Q�;躴z��_�e�HQ~=���y�^sj]?^g��PY;����^K�u�jS���?GN��C���o�J�<ߨ��VYWwU��Mq�����L|�\����_8�Q�H��p:l���>�S��	�ɛlԘ�f��^�)��]%���e�+<���h��yƗ{T�ƶ���#
�(��[VIc�T!��|�bY��i�=S��1���,�I,��-!j����Po�%�7\��w��Q��5���%�;R�@�A�ܕu�z'��Q�Q��Ψz�4�uL)���|ב���]F����G50�
y'e�"q�²���#�أ�$�p��L�d�Lb�Ne�"t)������L�&�db�t_����K}��.�
�Ui���˂|���-L����I�Hbj+�N�el�?�"/Sw818D��R|��$P4Wc��j��X��[������������I}X��$0���ϟU%J3���I��4vs�u�����-�1�^:X6a!9�y7P��#��P�����8�i
I=��F�t�_��S_O�Hn��3��.By�,�2;�۸?f~Џ������XLW���ty�d�H��z���Oi ��l��n�,������u��Z! ��Zb8`�Gάvd��) ��	b<]o���&W���ɰ�8&ݍ�/H��0��Bg��U�I��*����Cߢ�$�Q��ҕ@�EN�7�C�����6��I�;��E�'o��ݟ��{��50aF+��\�^5,\'�m߉oH˒��X̗(lHв&_��ܿ.r��5���̬p��2��K2V'� �|r1	�K|Aqφ��2K~}���8�q�R]��]���n����\�H8��k�Gm\���� 9�9}m9��o�U�)�}�$�l��Y�Ѻ���Pn�s#��"/�}`~�JF���W����ZuES5�SL���">E�gQ�aCr�x��GW�I�(���J�q�ׄF�e�Ғ~̱�^���	��H���>'�V��y��F����=B	��#ƻG!�n�7�߃��n��8����H����f����nK8*��c��0�<
�#�]P�Pb$��al1��eso�b9��%�ytS�+�JAM:�p�z�@$��E�F�%��b��$$��ݞM��ĝ���Y�Dxs�ǜ禪%�ʶ�z7*�,�����:�a;־�c�x�pc_�2�NZ
�Qbt6�a"���%�Bk�#R�m�:}��ni������]w;⁏��ӛ�8��U�+W<�u�C.�ߞ
;������\����3��O�;�����V=l:�a�QN頂�#�kt=�9�[��=�Ϟ]q�؁�
�/31FXv�8�A���a�1�cj���^�"�%��>c;���:+5N�
�y1g;��N
g�Z2l��U0Oaڍ/���eu�pϼ�<��0{Yz���lBe�i��T�����x�sv_�>����
?�����E��g��s;���
Ӻ2�"{�U���J=�Ñ�`�}X��3EVQgeî�*�¨��}��'M�������9~�'\X��hM{1�]����[���.V� ��c �|:��ཥ紮�4���I���������������������>���K<��V�in���BD��ҵ5�B���h�h�v���r���ωI���kU�n�]������Sт�%Wٵ��MR��Y����BV�֋�	�!�^f S\Awb0���eY��ͭC�.;�|�k�E�A_����m%����ژ��W���TW0OC�\�]��j�&�-�%	�k;I��=������ib�ZX|�j��;��%f�
$�jIU��6��ᅄ
���a�x-$�3<pT1PS��ր�2B4�&/1_�-����Zjp����"��P�M�i�2A���E�O��#Ya ��A=1'd�i�mbU���	�C3���6_�$�D$+��݁"Zpf(��r��
M��)�dbb������.���+��`��i��kk?'N���ӆN�99w���,��{��ia�f�S�?�Q�Qt@�Z�$������ܠ'����s�|~���y�5�A�|%	Hv7H8@\���Q[S��k�,�U�O���1�o�iXY�q�Α�
҂#{��]C��
�(��D���������ے�1��V�[	��Q�pt^ZaȢغ���(R���w~N7iX�x�ҏ<�+�:�^R
F
QE6z���� 47!\�VP ��<�<;�vIZY�<�w�蜶�[�Wuњ�lvtJ�G�|ي��=
����%�ڨ&��B�:*d�H����I�2�/���S+ͨ'8�;.�ʁ9�g���Ʈ7tm��/�L#�ה†��t�����s�����	�#��횀a�*�>s��Ի��;�ߤ�ߤ�ߤ�ߤ�ߤ�ߤK��&]��J�l��1/�
�?߰�:���݁|J����0�׼{;C����6�W׆*�H`]�j=��%�9�~�K�sy9�H�R6�+GOtw�j��Q��?�����c�����65�
��@G뺚�Ɯ��ca����N4����v�K��5"�k�w�C������y���T����Uu��/��>�J�yc�'��@nr>�{)����w�V�z.�I��;�n8�Gdn���݈�ٔ��j��Gպ���#�v�h�	i�ڛ���Cw���������{����Rx��p��zV�5�Ж��I�l�<�IMď7�f2}C,z�Yu&��?
;
�:m~��+G�� [���'n$R}��ߞ?;I&_}��7�ܠ����ˠ�MQn�m:���^%M���?����].y�i�T1���E�;	��@�lrʔ�D�V�A���E�4�w���a8<P�/��C7c��8Gp�ls���c(��4z���~?S�-Hu��#��&�~�9KTj�4�d7�ږ1Lw���1����pY4ݛKVأ'�0ך��3�S�9&�*\Vr?����9#�s#輻�s�I;�;2_�~\}q��A���Z��Rb�ה�ۉ���&���-�����DJ���-����+�4l>q�T���$���=�l���f���͖e��y��Q��r��=��������ބ�e,f�wX�ڋ��m�(����y�_KL9���-\^D��2�:'���_���o�7E��#�5�\�6���;�z�&�鋛��="��&��-��d�{��O�$�uц�|M�LJ�~�����3v֒��ϦV\|�@����G5�`�ڥK�~Xa�������Ts���Wl��c�b�+)[%�ӯn*Җ��pj�!ܗ�M�O�?�q��?�~��	�c�3X�w������+a�]�j{�o��=�c�m��xF���dT�w���x�����U���C�����A�9j2?v���[��j�
��ס{綺�^��ݑZQ�߼�������(��.�~u�Q#�%�KM��4���#�1��p:�C���9~c����fo�H¹�G�ӺήOyا���[�Υ��q�>�5����G"����h�<)i�+�dX��whL�����7���Ow���n������[qѽOc��ꗝ�EO;�X��սڠ�W���4�i<i�U�*'3:����R��f��QQ���G�bB'����@����]D�m��y�;���n
x%�\��HZG�YENB�xX��.�� �i��hC�?<i�F���o���MvJ��I�����p��<9ӱ�88+@;��N���:�8]��\�M�R���G�F��w��Uԇ�t:�P0�m�]��Y��y���C�{�a���]�5ǹ������#�ق��_��
&??�͂ �'B�&�(%6L#�̂8���
U�c��!�rt�p]�6|�\�W0��28��>bD}(���rܡ�>�l������8�С�s�F�)�9n#�r1�1[r��������+4�av��i�N���]T)R�_#� �=� ޏ$X���Q�hk���2�,����,�P�3[5ގgۏ�nd�L���m��'�G��b�^���qpY�ny\Z
b�aͯr��#fM�vā>���5������1F����	�٧�ۉ��Ȁp��o�=1�x���r�j\Ҽ�D��e�Y��Ʀ�D��G+��Ay%~��tw$U�MQN9������=�P<G�n3��!Ά�L�P$bmO(�j�2��W)T�����e� �#���C%�h՛t:����$w%,F�n�qCR�E"�tIA�c��y9��%	A�!%A�d��1�
�I��u��{�^�{"���=�Ѻ����ߖ��5��%�Ȳ�ހ 5J�'��a��Û�BBL�m�ٶ(S 
�h��O��f�b���h��C?뺽�B�q!v�7Ze�'י���ꅼF��2+/�,GZ��.K�+�������.!t�'�b�#�mZ���+��2'���ڥG?sĬ�Ԭ_����^�o�6�3���7�rL[�ӎ�~��o�������n0�]�Y��AguJ69����h�46�A��F��dZ�>�0I�{W�^��7�po����k��!�����-GVe��0��hz�k��7��x�D^��y,�H	�z�,�P<ۮ�#�(�z�z��հ�;e8�-�j�ں��Q���r����J�$�"�v�V©����>��G^�U���Aj��3J�޻�ͮ>��E�DI�uhi��/]i�`4�5ʓo�[;��a�1��4��>}Ʒ���tl/<z~U1��	#!�T�LO�P'wV�p�hw���<F��לc��%�|�9ji&�ө��6?��&�*���n%r�~�m�j����nSłm��s��ً$�����9�
=�̍G�/v��-a��0K��0�or�<��EF���m�j�<��q"r��{M�R��u�Z���-�Օ�J8#�^�sk(�@�Qp��y㸿��hW�g�wE�Ms]��Lޜ�@��e�T�.�����V~�<',aT�p07x��>x�N2@5�
S�{�3�tAQ��4Ѝo�j%�;o;|�JY�)�jq�'^G�]nG_�\���c�Н`?��!)���R�wC��G�N�|�lB��Gj�Qo��+�,g�k�S��&}*�'�]���ILBG�-�
f�u��G�p/\
If�=|賩"��9��}�O���BB��(�vx`X�I|��IOa��鰰�[W�#%�u
���;R>�L�<��	I*���-Qf�#	u��w,��#��3]l�)�Px?��xɺ*ыg�G0	��@Շ�L�`�*�5j�F��R~B������.K^�ƅ!0�<,��	��ݴq�����EiwҜ�y�:�>,��!�ne����ɼ��֛��\9��08B��B;f4/G:]�����c����*o�a�*X��d�*��F�`�3����/�vh��)5��ؖ��d���ЯB�ͨ��~@t��Dc��- f�f
	��t,o�GO�V@_y���2���cZ=w�J�b�$B9�(&(8lVżhA2X
��X��h��#�8&��G\f��#��%�|L��#~`����\�r�;�98NNyK�����hY=e���*�Q�Spr4����`"�U�6q
G=E�����|Z�9�/��@ꁥ�J�q"L�9Nubgަm�l^�����3�(���Ҟ,��L;N��!�ĭ��)�Ѿ$I��9��i����N�]�1ˮ۫�	?)��1��c�m�
6�e~E���귅���S�<h�z��"�d��j˟TUx���
�M"ˢ��c=52�~tG5��ӑ�g��2ā�u��H���tSW�Ŭ1u�6�h��jbR��Y��/y�ZĠƜ��Q/M�ۑ��8�:�&�[mxY1�Q$�qR��V�i�8eT��p��X�o#'����n$�M�N�'[n�a:���!��+�%��1�f�t�^H����F��3�p�P�A�J|���Jˀ��'7�e�k�bsg�)`j�H��D'�/WF
u�d �E�vY�:{�������GR1q�#�ڼ���C�@��O����Ͱ"�Vy�z�%�%�<���]��̹&|p��6b7/�4��/M��+�=5�7���iyƛN�׏�nE�A��fJ��b��N��9�S�]�`���|�r�c���-a}d�	dU�Nׂ��V���[p��f��J��`� �����J;���5)��
Y��ݴ���,ė���P��{v-� @��wcoѷ,��m߃�l�g�c��ʾcsCƪJz[oO��r�1V����)��CJ�B���X�w|�i�N�n�Me ��-�`�X�B�]t
�S'H�cY�N�&l�%��k��� =�Q�`�.L����V�14�����F>��dU{9蚔=fC��H�E�׀���9��XO����5
� `���``�����w�J�8��ZQ�9_Ms�.Z��M�[����=���3<��e�����[�DZ����UN��>�����p/v1?Q�����b0p	���M�G�*ׁ�ԢW���0������I��IM�8F%^<-�*�]8��PKE��T�|��'�pip/_vendor/vendor.txt-PAr� ��
fzg�'�S�}C�`Ŧ�@@n��W"��ݕ.�-pIK
�tJ�Jk)?䗽��[�Iny�H�2x���Q�=���5�[*��U	�B*v�,xP��|���7,��N�k��uw��\���٘^�Adȣ>��u"�d�N�Tb�Q��r�R��@���c���П���������tTz|�[&@cF��Z�OѲ���V�8`OS�(�-��%��y���k)��{�H��D��O�~�>�CM���xp˘R`ΡŨ�Ɇ�H5	X�q7�LZ�y���
ѥ��*�q�PKE��Ts���$pip/_vendor/cachecontrol/__init__.pym�Ak1���+����+�"*�R��B{�-�����2k���vw���L�of�������*����.�>���7�r�	Lzx�-Ŗ滊b�O��uc��K�(�b�6�p@_7,	w1��%�fN�>!����G� \��v�^|:�9a��0���\D��J@ksζh��X���YTz����9
ۓbq��C�f��\��,�7P1MC2�u{�@��4�>��	��,z`�|t0��Q��d�uw�ֳ\[��X��t���!��lPKE��T�=��Dc pip/_vendor/cachecontrol/_cmd.py�S�n�0��+X�"���ŀ��>�jȍ ��LT"U�J�~}�/Yn�F�����3Ԍ��6�O����oN��̒�\��@n�Ȗ)-E2Kf��
��5ÏԒ�zV�`qS\'	�z�ie�p�$�QɎ�/�#�Z*
~��~�(*�VIa�lV��X����ϭ|�
w��^G�V����v!���jz�e�]�f�P�;DPRÑh0CO�Y�L>������B���~���;ȉ��6.����(`���)��uyh߀���R��Q��53��(R�ω���a�.j�9�8k�oP�N
�`P\^����3��,Z]��8c��� L����WW�<�:D��9����ʈ�x��
mQ�UM�BGu��Yk.m
c����|��M�m_��n�߷�Hb�3AW��i>�h�+t�t���F���:<�D�Q�_X�E��o�ŷ� �t/���	���vm\fd9�Y��g��bG�]S�Ġn�;q��~a�9�'�4����������5
|�AQ���=w��w� h5�����d���*lM�`PJʒ��Z�(M}�s1O�PKE��T��L���#pip/_vendor/cachecontrol/adapter.py�X�o�6�_A�&���K?d���Aи��Z:�DdQ#�8�}w�D}�I�0A$�x����G�����ߋ�dyR�~o6�d.�����Z��}�J�b2�̜�g�B��
#v��,y���o��d"�T��S	���UEj����\l'���V�2N�Ȥ��U�6:�/
(�j�������ũ,��y��"#���ݮ�~��Y�l����O_�W��ns��v��k�Вf��H��QO�0,G�˲�E�oy�@��&�I�s�{�׶F����(y.2nDq���e�ي�=����.��rs��^�ןכ��]���%�(�I�ȎУ!�-��ufu#�%`��^mT՝�J�����@C�L�RB��v���󯸺ם�WG�Q���Ya<�@��y�#�Y%�^4jDW-�ќ���֌�b�kpC���7T����n��xL*M?��$��|P'Z;����<0��*��%G��E�
��E�ի��Ԙ����3uqvM�t:��w���FE̾!ѩ0EvR0Cd���]��+�'kCa�9h9�toN�.%V)ZxVd��	q�,��9D����U㒛"��E�N�o@�x�WC�c/a����&xJ�t6�������X�2��X�S����D��F}z�F�5q���Q'=�1�H�YvZ�x�a:��;�eW��j�67ѯE��2�(������I-�#�1�L&^�I6)���"M!"]m
bկ�mfc����eݰ�v�mj��}{b���P��D�JӐϫ��e���yy�(�򜄵�g�s�:��4��ȩ�a�7���B�N�j�~21g������n؁Z$��pr�`�(�m$e�Az��Pv�ˀ����)j�Gd����T
��h��ЎFO�
7g+�n��؞��P!K��t�����߷��r$�R��(�Q<¯�bP8�<W�!\�0�MW�=�k�M"f��E a�rW9��G�������H�}���2z^��No2�F�ƒLI
��Z�&��jz:	�bTyǪ-���Q�tĘ�P`O�m��x`y)���m��i�JR&N�+#�
[2m��,�Ȧ�-�7��/X���� ^�K��?��8\�Ed�O�.� �ˆ�"�]՝?���J�E�C�x��%�#?�N3�n��k�/��&$�*�3��1E��F�<o�Nߎ���"��1�S9jq�ܭ\���}��D��i�h�hWL�] {�dG�z�w.G�u�pb5w۸������8����c;����t_����o��l�d�Cq��:���,���SҶ��Mx֌h�[�G�Z|g��Z���nD+��[��Vz�uCcވ��vb���A)x	�ޅ��]�/`��H��Y���n�׉��q���-]����{��s7�kL��}���[���w�c�>�{ݠ1�NT�J�%����P�y�;.ۏ:{G��;v7��S/��,�PKE��TH�]�!pip/_vendor/cachecontrol/cache.py�TMo�0��W�%�+�K��5 @PK�%�M�Zdɐ�,^�>Ҋ���:ؐI>>>������Txg���M��������La&�3:D��<�)j��i���\���M%��W�e]\\D�!�O`ֿ1�p�4��X�e���@�	.��0�� �E�EN�R�K,�m ���F�$m�ܚ���hm���I�Q�J8���g�$��e�
��C��`�
�p����i��k�Ƨ`��N�G��JZt׏F�g3T���Re\�EV$�Q�{�/�q����r)����B{a�_W��D��p݊M$�L��L�x��?�|@w��'��[u[_���ʼn��ݤ���g������=x��3	qJt�pΡ2��5�JX�uk��4��1o���v��g'�ڏ膰�P^)m<8o,fP�==�TK��J��`]�F�����\7�X�m��1��$i��o`���,9�0^�����HQ�(��hE�Ԕ��E���0�|�?D�ApH�)��eG:~��)�0��Tª���+L�2X#(#2��ա�IAUlΪ�+}��`�
"�?���78=�.!��a;�PSr�k�;��7�=�PKE��T�5��O
"pip/_vendor/cachecontrol/compat.py��MO�@���p�A�F1�C���f�v��]g����T#F�aӝ�g�y�<N�T�[��B渑�{W0d�01�K:I�P<!�.bw��Z�n��v�i/I����Y���沤E�@U�,�؋'���b�Cfϟ�mj
h2vJvU"�a�v�44U��ȸ\;�@�Fg�ȇ+�k�Q"T>���P��A0��� ���QA�5/aQ�^��Q~	���k��~�&PH�5��sz��NٕyƘ6H����Ɉ�|>�5��-l�E���Z�<�(fː��G���,I
�a(�A��҃6�9�|RgO�E��L��jG��=�
["ڕQ8yPKE��T_H1� @&pip/_vendor/cachecontrol/controller.py�[ms�8���_��+ejF�'���g.q�*�efR�gw�|EB��%@�ڭ����H�oV��U�L$h��t7|Į?���C��ؗ�f+o��<c���b�e��a)�lr49R�?&��_�<��:��{[�і�O��d�y��f��V�"MV�,L7y���N�"/%��:/Y%8{�������"���ǰ4�l�lc~��|�”gqX��2��ɺ�w���$
*����l�ǡ�K���U$E�|y�+YV��J^ϼ��Sf"���DR"<��/.�]sX�z��w0��9��I�&���]��d2��򒝛S.?�3���_.���o��`HɃ(� 0��~�����N~:��~z6��?9���)��������_��#?�=������o���f�����ˋ���ۛ߮/�a���匽Z�#'1_+^.�2���ل��	2�^%`�L{J��Ol��X��~��䉽c��}�p�^��o�	Q�0j+�EM��`5��1O	?�e�ف�Ma_�6�.��M�W��1��`�hKc��W�KrΘ�޾���y�������o��?�!/�4��p/�L�y�����<�
[��%/�aę̙� ���u&�y�ƌT)f`
Y.<�Gv/�I���ҧ'�<]�Ԕ�_���K.Í8�)+xR�Y���J,�<�9�OCU��y��w�5]0��x
K�z&�]	�;����~��c�Bri���/� �'��O�8�W���_��H�Ij;�7,��4�˝�b���"�^)�E����G�cTr0qPw�9��{�e8��jT�C��B�`��֓�^�]��0]>E��I��ޯY�g�J�i%�W`�%�=M�GxbX����:���Z�\	p�-�z0��^�j��n��T��k����e�����,�b�P�=�4�؊�5�"���d��rq�/��o���i\˘��S�N��R�����,f�O^�G�d��%��)J��A�@�z����;;9��߆]��+M���)5TF�V�n��jB�&���m���H�/_y0���¢v���2NJd���?9Q�pL��f��:����V�ғr�����#��?�Sp��v��<�p��,g}�t�ƞ6�>��:Òl����%��se�0H��^b0LHЭ��2���9��<Y���g�*!�%�G����Z�I�ܠ2y8�T�?�_Y�A8#�W��Q���:��!��=��\k�7s_R,�_�/=o:u�v�Ji���V���G�z ��7u=�vU�LD�I��i`CIV�I˩��"�CC�w�9u�7;<WSowfI��,��=�}1#gdb Ѷ���3�S|`���e��]�
�1_U߻ڀA�Ze�s����Ȭ�==�i��p�̙�;S�Ǯ!�E��𫏉CT���d�I�D��WY̟��w4|&�q�>8
?�ω �
����wG&�Zb�W�6x��F�~ة���<��S��������8�90V��i'H+}i�r�K�u,տ\@Y��(��C�*rH6QU	�M )E�U����{���r�A�:5T �]Cu�z�|o���c�ߓ��t����!�̏"�P�0K�aC�w�����d��>�<)��y؍�;����	��ѻz��&�6�������վ���cW�mf;�1j}B�Qt[?wr�_�-��$��c�U[;b�.�}�)���
�b�\��>��%p�#����K�~G�(N������B�p�-}JH�|?�F`��(�|"��,�~����L+����r���s�%��;���D((ى͖G��q�ц�£0C����|cˬEa6Ҥɐ\��064��;k���H���a��t5��<o��r�5���3�6A$�0�"]چ�qs�L.j0K9癙<Iv;x
�J������yv,YƁd�u:���kb� �h�#[�DDRXT���N"��=����
f��wzdQ�L���H~^��ϛൕ��d/�y�:�|�#�\9;�RW{xX�P6�5R��R����
;��*�	g��M�|2�#CUX��7)�J��v��neP1z�~b�gLU�LXY��a�EZ:u�M�]�Wwq��6iJO	X��`����TPG��'z
��/:����d�W�-FG���y�Ɖ[�(�`�_*a����Q �	A�q���OU��i<��;��`��j�>��]�N=��<�A҂�>���g�h��uC�^ov��3�Ln�<�$ ����4�x�C����DxTyj�i���'RO�4d�t��_��
89*Ȃ�
T;��"�R{Q�\A��hC�[�X�&�W����u���.ܓ2��U����;d"R���W�A1X��U���rR�aj�h��!Si)�1�_r���t�X���>\����$�
>f\4!�~�L�5G��E7n#c5��#��]�@af��� 6�'pͻwz��!G�䃡�j
���\�V�u��h-�ja�
�l�GbFXP9�T$�#k������KoЕ�������i�O������](ِ_j��Z��j������j�r׹&
��a�x_+�B�X�\J�ޛv�ԚhM6YpIr����A�`��=�cX'���A�=HcT�n������V�wOQ����o�
e��ף�@����4�lァG0O�˙eG��ϛ�F�--n�^D����31B�4\_kP�ɳ��lm���G��X�zc���)�8����"����p�6�^�@���Qt.����d�T��2W��<̺�s�/�s��9���
�Z,EI��ө�z!��[�t�呻P�*Uy'�����U_Z::,k�4�2�h�
��>�Q����=����zW�9����x�;�~uy��+����]�5��˖�YϚ_#
s���d�{]-x��u�@�"�o]%@��
0��WU�%�(ң���56�T�>J�/P~[��"@dxC��[S3�1r�E���HÈo�Klp�E
����Pځj��!E.vD�0�?�#�n��vϛv�k	�ےpG
:�)c)َ��-�=|�I�F�04]g6�˝1���\Z����]�z eN���5(3���b��r�>`�7W���{�R*�8]��ʬN��MN�T�ɦꏊP �-�lSW�����{5#�pڎ�p�`"g�đ@�E�׊ Nd/j��ll-:Xn�L���ݧ��|>����ЂN_�~t�g�s~H��M��ѵ^Mxѩ�?`b�3}//$����Tl?�[�y��{/Xa�c�5"�י��bJe��շ�A�>,b֎��(�f�J��Q�Ja�8甥�4%o�I�eTe#��t�W�hOVf鼤;@�>mJ��lgRWp-*wA"b�oҟv&�b�8�)��s?|כ��d[ţ[�_ԧk��Os7lŷ�!+bURR��w�M��'�'ݎ��M#�F�q;_:�ކx5u�RFWbU�ʈKz'P��ҧ�P_�i��1#ID1Z
JE�x:�&
�����-[���˔L��܍TUҊR�3�������j��FǍ��^����/!�Ys
�x�U�&�|�0}���h�F��j-^F�*�t��4�a�'�wv��j���*�Q.M�Dj�-��`�l�������Tյ�:V��S�����x��Gˑ�g컶����cY���=�S۲�߹�L����
I)��/-�rŔ5{�
TD���4��=�<�s��j�c��Ҩ�����;�Û׋E+�vk=ԿS��TL`�s�/V(���C:V?���<��}O��n%�ϧ�n��D���jDב$�=�M�ml��L5Xu[�Եߺy�a�Q��n������oc�����xNnGKu'�"Cj�@�v�<F<���*,\a��$��r����^��6���B�����c׳<����a���:��g�Ĭ�{�m�1X��ә^O4R@��Q���Z�zߒ�>�#ZN����NDT��f#w<���<�E�.'act��rR�o6����	3Vxu��f����6ÿ�%�X�NnGp�]ٟ����[�Π9|��鶷:8���O23�<cj�575`���3lv�7=�XE�� 
��Վ���ݯX�x�x��I� ����?b�jb�]�iW���ۧ���v�T�U�\n�k��G�?��!7^:R�*p!~���v��46���#mگ���NhX�M}7�m��=6Ⓒ�ĵ�f=�yg��"�%+#V� �̃:�G���8L��r���8j��y�znu��o�䰡j��� %\��\!��ȅ��@	�F����{Y�T�JݗػJA��TnE��b��U���O�5譨/���;��o���zR�\i@m��x�Һ|dCէ(� c���ݪՠ�zS���:�ˮ�����C�=b>�o�ZSO$�	�7��7�h���
T��n�Y����.I��М`I�Ht���~�dl�m�T�:���qCk��PKE��T��]Ij'pip/_vendor/cachecontrol/filewrapper.py�WMo�6��W�!6�(���!�&��v�	���BK#�k�H*��}ߐ�-�@Q�>l�����̛]��/�zT��m�qjY�z����Ͽ��
�$��ft1�H�O� ���SI&�J��w�,j���݌F���ԴP�jZ�,*_��H��F�����h4*��^�K��X��7'ۖ��.~P��#��x<��X�u2��ΔB���\�kU�b�`���ۄZ��p$K�L�BF�EWU�fBa]���A$�^�z�}HX�NEW=U�j��VX/l�pz6�O� Cpj�$Zg�.`�ANo�gd��鏿ԑ��8�P� �)J�-t��I�O�����:�Ի���G8c_+�Bq*��F�Z�v�X�y�.'Q� 9(>���[�6��pMh�8E�M*-�+��^hk�N����i/J���w�_��j!9�o
���
��O�+N�W������L�>�%�1u&��,S�\��Ljp�����y�Q
��h��Qk�s�';�ŀ����i"�u���O7+�F������
g�Y�s\�k�钏�H���k�)b1IVö�J�D�+�B�O<�j�2�����a�琤������-~#d�)��u4=>�����]1�w��-)��v����z��N:E�v��-�POZC
mH��jOF�
Z��@���_7HkG!*:�c�sBZ��d�!��q�''ήY�v�]�w��;�8N�x�4����s�Pl,��Ғg�л�`+���j	��yP��8���.:��{�p��V\*�/rCw����OR��h`Ξ�!��������ZtMk2����A�%^�{,��guh���R���OKTL��0	�q~��3��^w�B����	+;��@�g�ԩ���
n��2��%�*����ΐ�j�QqZ��ѿ�&�W\�o$~t�Eĉ���5�ܛlXL�}�
#�,7M(x�dٰ0�,;��Ԟь<���>yT�L���\2�UO�b>7�f��Cӆ��O�BT�P̢�p��9��ɋ��N<m�>P�Ԡ��<�x觾;;�(
^�/Q��3i|��/�b��2�f�ߔ��z#N�7E�~��H��p\��1���m��Ã�/�V��k������$��&73q3���'(�=91���E��쎱�Z�c�@[�Gû����������;9�$1���&ɭ2�?.٨��Z!ay���Ao�����.Pv�j���Ƨ��s����ȡ��_��Fm��p�loMͷ���;X%'Ůa2߸��4.� �f�9&/f[�2�[���U�C�M�����O-~|4B1�x�iJ</�^8��1^�{���x{�"�/�,I&T9���	�兆��S|�&���5����_B��Ӡ��>���	s�;�\�)�}8��p:lnlu�]����M��1m�g/./q��(C
eZ�-�2�ab���c=�l�	Y���t�Ek��پe�<W���a�0���|0	��g@�ǟ~0�`
xYQ~�
�8��Γ�CTC:����n�DZ��j�}��I��}�[��I�_�E<��Ly�_����3��(�x���/PKE��TJtn��:&pip/_vendor/cachecontrol/heuristics.py�W[o�6~��8S`�l��Ō�!k��@�v��n(
����%j$�-��wH����?Ⱥ�\�}<�#���ӻ�'�ӷ�XKv��sz�g0��X�ΈT"o���g,�����	�5K�38*H���I8j�XV�!&��	��Y���Z�Ќ0��q�k*dFtB4�C���m��;c�d|yK�ܷ�5i���Ϗ���9B�&}h'�^@�h�����y>Z�VBS���4"���c���"��Y�g�љ�����s��t� Iu)�jЯ�R�!��H�hIIbi��Ym�x�Bcr��P{�˂�N��E�1'J�D�SZJ�4�;b�/���*c�"2g�UGQ��1�*2��_���*7��Ʒ����͇��cK�0�"��|�$��Jg�2Tت��q��LA!�
KhZ ������k
��~m�Ժ�
�8���Q��B^
�:�C��o&��=��f"��VK*)�(�&�-ќ�L�5(�nd$np~�),E)�'�9�^��#@�y�ÅFւW���.�
;�$�v���N����%�|��Y��[�~�8?�!�&�ӏ�g��Yca�1/
J`�|i�Em_���Y���n��"��8�ź"�3����;^p���q5�u�O ��n)
�~�
���Ui��;p׆�X�k;kL���>�jtgǨ�0r��}��q)����m�҇��I�L���x�?Gq0{���r��&s�����;������U��Wt�EFr�R���q)���6-16
k/��
�~�8,3��TM0]C���;�k`^ߚ���6U����W��NA|��������oݦ�:���S��p�1�:�E����EP��u��̙ԜW~��,�'���n�롷�J��2�����ܴs���L$PE,g:����j�X[1CL����e�O� �{��`�}�A{Vc}���Y�
M���Z��3~�&�n
�mB-2�ٝ�[����	X��-k�ψ��"1{��I����-]�ë�o�}H1MX��Dn��w�T~o��q�l�����4��k�ڍ��%7EKp�w�d�i�%qrx�ɦ��T����K���Uh���<�Df����
3�qNlB4\^�����矆�L_=9�k{*��i���r̓n)b:̩^Qy=�>�E,�Иsu���S�7��bo��76�enw.͞����j&��d:Xʰ��]=�h��p-���W�.�������F}����\^�a߼���05念��G悏�������|�g�a݃��F�fu��U��F��5�q�e(y�C��i�?��]�����ٓ`�T�Vd�O�:V~�M]e��vG<�����Ib�<���MK4�#����M3�-�d�iǴ��1si�s�������;�q)%nA#re昑�Ψo�l��@/'6��=4ym�Rd{�S�"���YG�X^a�,��Ѓ�ףQ���.~?����o�'�|J�,lJ��B���9���[/i�'�k��]�^�PKE��T�g�	�%pip/_vendor/cachecontrol/serialize.py�Xk�۸��_�j>��j�$3�(�4�6�6����AK��REʎw���sIJ�${fS�5��#����q�����?/��R���}#���F|5����?�����O�ѕ������d.����\I�\�W5����e�|6���j[r-~��U����߿�r9���j�jYg��PE�0�v���0y�5�_��Fg�4mn�F�n�k���)-�܊727��,�657�¿��|�E����C�o��/̾�٬+�X�x�(D^b����er=c�4�*��ܪx�	eD\�RFIr
r�z4=I'�njZ��KD@X��mi˪�/�6g���ML��k�~��M4�{�"1�vS[���y=ҏN�;�P)�8	����F��#j��e�_y:���LjF�h����k�s�j\CL����yY2{U��0�,F0��k�1X�vҬ��Ď���l�UQ����-� �Ĥa<7�q
���_ӓ�Rb�}$L6�gE�����f^)�H���|"l��/V5��*�+����1
<c~�y{�n�P!�q�
#��l
ح�g�sM����{9W��#�P��q��)�2�Jʂ���
h�$��Te6e��b;�j��=�{r�pηΟA^��Z�b�ւ4��@]l��ZE��mmX��
�T.`*�� ��F����5�ZSja����� ٤l]�e;�L��JX�|P�n$X��UM.ս�#��D�I�i9�L(�TXie��8
��[s���j�΅���+�����+���nj�wj3
���6U��Ӣ�
TT���dA1?YA��g�!	85�&	[��R�El�1cd҈���	j�^bZ���qO���m��T��?:�1����ad��	��.�P zrl��=�7ý�f�_�S��F�	Y�6l˛=�x�-�w��ѷ�����&��ˤ(�D0^ޟ�麔&��hhN��[K�
�'��+�%ܣ��>�+�b��VXm��]�^��\4�>���i�:q�XT�bz�$�n-�&�u�rWo@�ٗJ��v�*J;��\j'ؔ�0�R*+����w>�PPV��n�-,(K��Tk*�r��-XjBj���F�%%���C�[�,d�g�Gz6ԣ�Z��o��F*0(%��H��Ƒ%#%�y@Q��4�~����Y��{-i9e/6_sQ��l�i�fk��Qx���J
����E���\m��)�����T]�Z��j�3�JXW- &�d��}{}y��勆�����<4ף���T��	���k��tF–�!��;����xq���^���(�s�)	ԩ̺/�����	�r��9mpF`n��!-l@,���2n����$�����
pU�1�8;�m��v0YE��w!�V��
��)C9k��ؗVC�����*�n�ve�����#���b��r��G� ��O���~�s�ƚ�����ma�ڦD�w٣�]�/@��}j�#�!�v��s$�u�=@��&��\�tA=�H���v�J!0G���K�>�@֨V[���7E��Û��VÕ����d8nĝ(᯾�׬+�fb	���>�X����� ֣g6����L�K�t�<ŹoՁ�H�O�I�(�ʙyM�O?��:)cWe�͞���o|���Wu�3߁����"�.��:vUs�7��
�)�m_,�%���;D����ֿ�S�E	��Y��[� �cwۭ���ԏ��zv�-}s`	�x��)tڽ���E�@B;��?gL�7�`Ns*�QW�,ko�.((}l_0��,vÞd�jʦ}W�^��)���21�3%]_�>�a`��0��~I�Xܵ�"H��E�y�9�/�-u�#����dF:-��A]�g�����mm'_tβ��*\�|�+N۳�m��T2)OC>����D��7����ٳ��ej���w�Js����RQ� �y��k�<�;]O�
.\W�H�\�2\��hV�� �(A��K�>3ۤxř���He�۾���N�֓��O53W��.hǜ��K�e���t�pĖ/��v4�i���i��/O�f[hn ����W'ʉ�I�:��L�ٹ��9�l����ҫ��蘹�:�,�X��#������Q�0LG9�xZM���m2m��ΣGN�<����1��-���ӏ��¶�
'6���ӊ�S���1v�D�
��MkG�}��*	�Rcw���4O�ZRI��vPI���1�_Qo��]��r}��ֵ��̺�#���顅�U�֕�{j�p�]#
���2�e{�?ͩW�5N�-R*ߍ���/~�7PKE��T�Fb2#pip/_vendor/cachecontrol/wrapper.pym�Ak�@��+sQ�h�^9��P�R���d�����n��@�__M��Ds�}��H~~��h`�_�S���D�WO��P˽"﬈D��{�`=,�2��9%rS)]�b���ɕ2V��HbY9b���[g��ٴV�s�v��A�䃶���σ��j�wg!8��ɧ�;��2��Ԅ�Q���t�FyX�.wz3Q}8���ˮ�,�/�~��Lb���兖`<���s����a�A㸥M������=$ח��gx����a���;!�)-<����t���`���r2����#���&۰�PKE��T������+pip/_vendor/cachecontrol/caches/__init__.pym�M�@E��+�VÄ6B�>!p�"�}�u��,���dA�s�7����D{jpc�t��.�$�/`�T@��7�D0�3*��1:��9�9���E�Q2���ش0�^�������O<!G�Y;\�r��Gd,��5O�!��M�,�*'W� ����˛xPKE��T8@8�m�-pip/_vendor/cachecontrol/caches/file_cache.py�X_o���`���[����+` @w�	 I�v��@K#�k�H*����!)�����_,��~3�=����ע�K��XW��킝���v�E�n�6JNN&'��V� 
��)@ZQ
����y��ӳ�Dl�-���j��^���Zm�E�;�� 1���9��>r��0g�p�-|Tž_�Z�5��m_�˓��ń�\�S�Z����Z�	<��XvǷ�<�	k���חy�Kn��qΖ�a6�L
(Yf o5d������/Q���[U����������*��V�0�3�Ib�2!�c"INNY�A��I�ٗ����IP�.�><������[�u�J.j&J�N�^�<c�Ӽ�4��y'a�α�tp�4��r��_A�[$��a���mn�Zr��nC\�܎�K#O�xů��O�IeY��W;f��Zȍ!
O�6tmJ�h�ϖo�\3�Q:��(4.����b�]8�p,�x":Q��2�[^/oo�_�!��~t��KɾY��A�ƈo���`c+$�W4~���p��u}~��J�]�K��xQ�
�a�e�˙�2)L���>�}���jت��fn/��q!
�'�C�5֥�YЁ�Ci�%�Nf#�+�#��%4��G@��<v��FpEнU51�1�<�<G#�,�JbF�N5`w�jHx%�ND�ӌ������k(W(R�R_L���7Ja��7!
(�T����^�df�w$C���q)���7�x(���[ܵ?]�:N��jI|e�9�n5�M�D�Y� ��*�z�P0:2�2r��z��W���My����
P����5u��gT��ų�^�t:}�8��#��-��r��g+e+�s�'�Bߤ��]p�=R�,Kz��r޿B��J�%*�'�׼6-�&��ř:���l$�[�G����p/��_�a&�-Zʜ���PO���	TFD�8���l��e?�Gd2��H	�#��Z��
G�q�.܃9��Ny�2�nP�!�gZ<b����D�|�C_p�A�q$m���Wv����XJ
��F{��U����X�
��7��6���5�YX�K=U'iDrh��dF�H��Q��:�z��C�bb�I�B��Ƙ;�ۑ�cYT{i_r���yLJ	��v(E��G*�~xo��^���4�c�-��*�>2G1��쨃��95??�{���,��k06�E����A̝�q���|�������ڼ�r�	:p�أ8l�tz ��H��=,Xemc��ka�v�C����F�O���SaL��ǿ�b�/��Ņ,85���޺��x�_?�:ca���__8on��>���
�P���Q�Ȍ�2�'�ުv軛*2N5�rȲ:Fp���R�U���|;:�Wt]�O�1�ab?�xTaO���}�G�uί����	���7�:�����[�-�HO�pxIr��`$��8;Q��'�3��E��X0u����D�&鐁/�XB/����g��xk��0:�88h^
��C����p��my͎�����푤�>����*�p��"����1|L[��w�5��♂�H�`�f�'�(\Ƶe�w*bHD���69���ǃY?��G���9�y�
��4F#�hH��7����4��|U�k��>{xO���E��G�a��8���)�H���k�.��Q���΋�����}��/�Af��z�wW��&����|�>���?�l]Ӕ8��w�����;wq��>�N��7v���S��̪�R�Q�Hpa�2��!q�C����/���@n�͟�oSo�!
�j�_���!
�h|���2��l�u�cg�pD�PKE��T^���	.pip/_vendor/cachecontrol/caches/redis_cache.py}SM��0��WL��
��.��C�mia)��7���d�"i����l�v �N��{Oo>����?>o>��G߾���x�wo��@�t�ީ�Z�'2�"n���°���6{�ܗwJ5�������Uth}`��H�DhԚ��Sz�ٖڲ:��}(M�6�q�v��9t��PJ�c�XS�C̷ٔJ���E������)@T��a<)X�<�C)�u�(E��X&`��Ը�pԶ���R����;\�Q��9;�/ܕqxd�'Z�K�]d�f�L157�T�R�k3Aˎ��/Y~���Tɞ��b�W�<��1��:kN�G������cA��0u��j������������h��>Щ/���T	�#��~�0�cY�7�5Œ��w��Բ�V�7L��WL��]��%2��Z��/d��!�~P苙���j+?��PKE��TN��*Q^pip/_vendor/certifi/__init__.py5�
� л_1v1�n}I�Y$��)��E��]���������ε7����m9����c\_�X[��>�'7�hPKE��T/ ���pip/_vendor/certifi/__main__.pyM��
�0E���)�P��n�
"�!)Rc[@�Kܤ*����Bb#-5�13��V�a|A�
�$8�ů3�,��{�~i���^�p�e[�soJ�K��4�C�ܐ\o�0�@�b,��X
�(���F����Na����N��X�J��]罁'ÿ�^߅PK�mW|����pip/_vendor/certifi/core.pyuV�n�6��+�`+�ZH� 
�۬��h�b��ű�5M�$��{�w��dYu�ŮV$gޛy��dR��Z��9����x�*{+[��0��x[e|Z���m��`�PF*܃u���ښ�&����=j�X���)����=?*����!Ȣ(j-��j�����C
�����{�
�}}[��Kg�;��;�<�SD|t�B�+X[W#�)���wq����@@}�����)1�����2�m��� 4���M�5&�n2�0��%�PªUZ��r��Z�%,)\>�X��=]���"iу�ެ���Y�Z��1���m�g���\*���9��i��Ӳ�������O����ǗW�#I�b��0�\�6��j}$Q�?��.��˨Gb���~_������/�KJJ�U��ۖD�]�4"lAx�L*~���BV�C�����/���{����{_�2���$�;%v�M��j�
Dy@��J��'��D�]�G�0��Kςs�
Д!A=fA���ŎS��]�ӫЦ�kMP��c�K.Ěvp��H��f��.rh��[�.Aq$=��%���z�6Rq�!�,�8'1��h��)A4��R^���KԯqE�#-X��⻠�7av�y���t�|��x8ږ����)��if%�%L]�r��e�{)r�\*T:�9�H��M������:`��n�#�7����o���,I��$�0�>�~'���b��dFh1E���T��&{�A�\Ă
��T)s���0���w����i�p��XU��BUQ�)��؅m�s��B�[N��yk�x��䫉�1��
X��V���g3[��N�B#܊���ZcM~ϲ����K=���rek���Zo��y��vչ�lB���h�ue\�9LNS8;�'���l]�\-�y6Z�u�=l������8o�ഺ��˼ݥI�w�(����<��ĭ/�!���BY�Ģ����'_�b���lO�lj��{y[*0R����)zK��C�cD�!�$�]�5��P+zcS1S��h�_�/~�5
b���&�VHIplD�e�W4�_4eD�~~WR}�>9�ǐ᪊������/�Q�O�Y�b���툟�M��D�֐�%��oY
�چ���`+�e�G�a��?)c��A3�GGw�]�p� E�x���/�+xZ�Yl����8�]�kl�m7��p<aI�=+�F�=�U�*��}k��Ǐ
�u�>�4��s!g2��P�4;u���~���b�I�vDbQ0N�=��0'�'�
`@�D�Z)���PKE��T�i�ypip/_vendor/chardet/__init__.py�V[o�8~�W�/ ��vV#Ͷ�J�m�*.[U�*�w����2h4�}������q����\�c�����}؇^x��:p��'l�g0^2
��Q�����L̚(z
���P4f�(6�f���'���1K6v)1U`�U+
2�'��	�ָwOU��S6�l���S�)
�]�K�l��֑�s��aR\e�o�~�J�
�.���RA���Z`��'�]��RPE9�R��	1�5�f2M���Ȁ����1��/�����5ښ��]�F&�J9Cb�Ja6�8<v�w�h߆�p�b���~g4��`mxj��ݤ���d�4u��e�m2�%y��)W3SC�E�/X^����b�甽�{�2��r)y��z
,!�k�P;F֫�,U}}�<��%�c	F���\J�í�ƚ>�{�������K��WN
��?�`g�5��+��P�X5�z�ffdPBn7�J�p�*�̱���݆��uf�w��p�!��N5QD8�"��O^���+N��Y{;�a�S��6��&P7gC#�x�8<�����P1Ƕ�r��/���Łm
�9�*%���$��k�Nԙ�/2�5�_Ɋ	0�I�
�S���S+�bb[d3��yY�	۔	m�o��a�q����ޱ�C�b����j�mڑx��)&
�D���I*���>,���ov�J�wo�����X�-E�Ͷ:��K��o$��pEM�De2�RS���Êi'Il!�ڈ�RQ�)x|�%\���Ad��Tj�f���GJ�7r�M�C#D��x�_��%�Q.�5U��V��1쇏��h�0���ΉӃ�gWg���8�xkC����)���V���K�v���������<����˸Se�U�����T����h_�b�*�rcI��&r��Z�[K��1�Y��������Я����g�㊝������4IӜ+��NDs�CQ�,0�	�m�7[�k��ZO��+�&�
�T���Y�Wb�S�w�An�lՐg0��xf"�k]��9��-Jb�	�hp���_l�k����~�a�*)R�kl)��]�D5s$�{�H����1-�s=�AW�DEk&�����#��B1��9�G��'[��Up:���Q`=���4w��^Y�j�p�4� bN�/�EF;�r�8�{m�ʁ-0M���r��k���K���nn8Y�b��w�şO�ὺ�α|�ָ�}m�	PKE��TsW�9*zpip/_vendor/chardet/big5freq.py��]�%E����W��Z-H	�Gto�4���zoPQ�4�)*�����מǢ�WF��"�:y��������~~���o��??�|���ǟ|��'�G�}��l��{w����/�v������w���/�����g������go��/��^�ٞ�{޿y��'�����'�t����?�=n�oo~��x��wo^?�����ë���ǟ�G4�}��?�{����ݯ����쑶~�5�Û흏���y��o����×/������������^�H>~x���c��~���ʶ����m_޿����{[����a���7?<���S���g��2k�?��m���Kt�ۯ?oϟ���^ܿ��c"�l�^����1>��Ë��奟_�����7w�?�~;����������w��c4_���������߽z}�={���k���L}JG��:�}��;������<��w��㕭�_�>�j�v��~�����|7:��2V���'��)��H_l��l�����%���f�}w�����_�F���_�|��_|�����çO?���!�3��˖��)L���z|��ͯ��h�/�<����~��'_�������?����/�nn_~���'�هO�/�y��_}�}uw�v���ߚ����b&_ܽyv��u�������/_l?<��],����Yl��~��Z×���x�#���?l��o���n�<އ���ՍV����a��߿�F�7={�o/c	���z�}4��ˇ�����ox�_>������m�|��W�m�|���G��h����
6Ŀ�|��yX��^��0Я�����'��ct��LJ��ß_=�o�?�y���?��_~y������G�������zl�{�Ӷ��k�%^�c�}i�c��(��K��Ke��z�8���ޏ�s����'/�po-��=e��?�m�w�{ׯ�n���{�F~��Ͻ�Fw>xg���������H����7��;vA�
��N=��m��
��ǟ����NM��韞��|����ۯ��哏?���?=���O>���'_|����9��B}�óG,+��߿x�
�V�‡}�ɷ_=�_���f|��>z�}�#���o����O�~�?����>y�|�&�g�-�?�>o����Vn�C���3~�����x�����m�G|,���O��v�#�yӎ��C�ݶ��X���'l�߆1���<{�(Ǻ-���q޶s��:o[��Ѳ�Vo
݊7����o;��z<��2n��?��h�rN����q-�䌿���#�a�xٿ�xz+ѣi/W�[k��D���v���=1im?��L����71GN^c�;=o���y[�o#>4g�GϏx�;����(�ѝʳ�y8��F��>��z�ϊwE�K��3R*��;Ӌ��7�6g�	��F�缉�Gg�p�:�V�8���׹c�5�G�F���?��#�!�p�����c;1���b)����я}+=�!^�4o�+�1_g�W�o�vk�[Y��~��8����1���og�w>�@b�ѫx��m+�ovL���~���`���G㱧�
�9����D�[�f[t�07#f����N���	��ݹ���ba�u��3�ͩyD�O�����`�pal�qaF#��x��O;��sSb�c�=���b��vt�F���H��Z<ak62X�����x_g��z���7a�N-^!�'̙m�GC,1�~���]����tK;[���W{7l��n��u{Dft+f�1�2��+��o�n0f�6�X�ش8�X����~����j���6�N�im��b�_ۋ_��,Tc�Gqӧ�վ��X�t٩�Ƽ�B�X�蠦�Xq^��������d����1l/�U<+�y΢�ntk�����b��Z��p��􆧈��Z�:��vޱ=�]��:r�NִL�2�'����/�1ɱ��x-ޡ�,^dD���W��qo J���@���'GC��J�8	vcc[�ɂ�Q&ﮩ5��n3:#`a_/�4'�����n����1F��v����]b�*�Z1�薎�&����c��]�#vY,K��:Xn�{��ڼ�ni���S���� ��<Z#���f�������I�����om��o�ep��p�i��;�F��w�\�%~�}a�	�ٯ}�e~]�X�cŔ�xB�Bt����;�9�b���:bF�!�b㟍>�j7 ���[G���xp?���L_��u�,�J�23r�uWѱud�}�ï��Q�Y�oL�o%�,C
��3g/1<PLi���_��݊	p�X�Z���ngt��`ui��,ŋ
X�u��K�I�H���y,�l�d+dA�.�8##������h�G�]pI�YmĜؕ��`t������d<�M�#чP��V��`���$l��Ś�/�O��V��.º���c�?�r*3ā��k����7Lg�Zt+���c�{�B��C�`�+�{�j��!�q\��!���
��nN7K6����8f�=���׍N�C2ا�
pI�
|Wa�״�ڌ8�O���c���qƺ�(:�������%�.t<FD��F*G�;;:C�?WLU����+�0��	w��ߎ�t7t{	Rpv&�h`1Y�O-v���t��c�`w��v�gla04�_ޱĸ��p>�:D	b�a�Nǒ�����7�谝�
"X<h� tq0�@>/g�a�U6l�b����
#b@M�裫�r��IbY��pS�{�}�]s��	.�a���pu��_���TL<�����3�{[�q@Zu��~�tv{,����� Gh���6[Qt`�kl�8�`*�0#93pI�
�tXC�:������(��Y�~'���mv�|!��?2r��F�ͷj]�_pI��d<���4Sr���@Ԁ����q�v�C�;}���f�3Q'���d��
J�x�n��1g��|�������_�Y�~zB m�	�l�� я矸M���Z�z�k'��,�k�4�ubl��NՋ�JIObpfŸ��<��̏gO���l��Jī�=���t�?�� 7 PNSn��}q,��#�M�r�W���@�_��dc���`��!�3ǂ�c�M����n�O����d�2�W�ob��6����@T1�,���q�D>����-|m�[,b7|��6���]䅕Ŧ�ċJ�5��2<keɈ�o�!pIɍ]�y�;�!�6�	fʓ�:5�&e:�
�x&>|
����a�	#��t0��+�љ~�<��Yd$,H��:��>���qXAm���ҜX(�'h�]��a�4�CH��!EO��ƺ0��Q-R^���6Ir�,3#�WR��Ѭ!��������%�!�C8�J
�G��1�M�Kr������N��kX�Xz%V0�Q��� ���W�x9so9����1-'��:F��n��Ǩg��#pI��{�Z���>��z=h�x_��.4���Y�?F?�5�Kz5�c����i��Ĥ{VK�Ø�x��Þ>�2K���	C��.M��#�tb�DfX�v�m�J�"�(��ƀ�k���/�5��
��tW	 `���6�%��h�1-%�L����|w�8�Kf��>���(x�`����t�t��ؤop�)��	.�`a�2y�q A�I���V&����i���M��a9��ig�²n�C��j*	@��fR"�N���_�|����qaK��[N��>yk#F5v���Z�$6u�:3"; ��FIK�f�0�g����v+�u�o���̚�,�0���c�D����|%3r��n��{��1�l!SX>�k#[,;A�
5i�o���?u�MmF��$>D$m�*)�E��c�G�]�0�
�@�����n���
0W����e$��n��K��x�pX�?�2\|8�Is��iH�$L��_(�ӧ��@_OB_���&�|�ȁu~'&'��l7pI],,�x��	H@���j͙&`�����B|���U�d�/��o�����wdd�d'��G����41
���u%����n�Pn
��
�^$��k��v������HK
���Sے�8o�������)9G2�[�]��'07@ғz'}���#�E$��+8�н@�+
��ч�� �ĩ��Kp�$��L�L`Xig%pI�Cq�vKojV��(dAa���o#%��s�DFw�=�j���!pI|�Wb�
�wxov%�}���D���	c
*��f���.�Czq3i�1r��s�	r��RK�%#H��;�c'����v�%E��x�-'y�f]b�Q�͗)�t{3�6�`�A3�6�d�sJ�HJ
�#R�	 d��!v/�|�5Jf5a&D>�ڃ�<N�ĺuV�Vq���'���ε溬3�S^��
\m��}-c!�j��/�%� 	3:��%�J�,>��v�o��}ٔ�/hy#�����׆E���*�†;(�j7pIe�:�(���a	H}H�%`��@̝ܽ��٫U��r�Z�b`�jv�T��wI��qCR��Ne��RQ�P��h�ٝ�15����;�P�5됅l	���+���Z���!k�Ԓu�h�u��j�r.;y`���VRJ+V�{:�|7�I�b	��N�[g��qK����jt��.���#�P�T~H�^|*%��UWa�V��,��n��D��κ�Mtt�̏��
\�*3Aޔ��,�[����Ý�k2y���,��߁�
?	no��$����ZS&���-;���L&:�P�/�#����|yF?w�XN��	�x1�x;KC�*��B��n�
N��`�dMM<g�,9+�uH�I��d~	8.���K
�kSL��V$-1T-�U5�-g�FXL�	�O������Mq���!�L���f2I�]�)N��›g9��k�K�[�:��
�M��`��RX��Ba#�k﬚��4�lA2��0z�I�v�:�
��Lc��́`�&{S��=�����A�����T(
DX���k08	��d���C��h7�^85R�;��x��;�ė)r'Z�t����+�l�k
~օg�.��$p�(��
������Nc:~��@�4�ƾln����kP&��n�f��`_��T]�圓T�y.��dM��5=�Za_J��v�� Z������7����#�etU����fO��$���Y��Ƀ�֟��NXW7�|x1�8ShJ�́,̨�<ܜg�癩ӵ���
��۰�x��Y��Y�<x��P9,�7b���j7pIG�wK���ž�Z(ޙzl-�D$���OJ�@�Ր0��j�Df��֐#�e���,c��v��*x}K9�)���Dd���$�+�?	CjX@kp#VK9�f�l��xBӽ��ծ����=Ee�2޿I�BdW<�����%�F����a.)�6#_#de� r9�E��I�dF��Al�O2�,
_�bY���ҎN�:�nx���2x-f��1��j�vg������\�&q�%ƒOvp������$��rI����:ӟ-�82d<�AV<f�����1��G�%M�Wܡ��/��ͬ;���$�������5˝]R�	�S,��Hl�rT���.��]��7�7@�0�Ռ}g���Z���i�]��bEئ18"�y��d0�n�4����h@#����7TF�뤉M�	�51&\R��bcGИ��ϗ1e@V=z4T�L��SA�(�Y8�hv�ԁĻ:�[��9RȣS�Eڅ�;�vN�#XlZt��b;�p���	�E'3U��*�A�����hr:9Y�:86����p	�����[d�G�!�BQ�tpsV�����<V�Q����}	�|5���A��A���򎔁�P?�I�/�̆��W�"V�ɺ|��
#�NV��c����)ء���B��d)Ǐ��I����)\���]۠]�4h���̔���(��o����_bs�N�x���2�` &�(|6���6��y�9���yŷ��<��"����{��i]š>5�]
Хf;X��_��/!�7=���V�d��lv�Xvš��Uzue�K����%�N����PXR��5�Z���Ɲ�]���ƴ�}ɂ�VTD�tf�ղ�[D&x���Y�n����U)�mӆ�8pI�]�Wh��)Oz�-֞t R��uub��B�"T�Dt�`�
\�q�tTQ�a��j�FQ�(T�����e�X��6�0S�p����IL�4������
C���/:����2��z�h�#��n��W�+�	�kh�6I�M�r �ڝ��o��y�/����I��$���N�������B*J]��(Z��HK�]�&����-�*yp��ʝ�GY��Y�n?�2|I��<�K\�>�4�*!>�S0�l��]-x1]�7�ä���B�xP��E�ZK�e�����v��{�?�YѰ/����ƕ�5�Ե�UD�y�- �p�!��+8ˮr��6	j،��I$PfgO�#yڊ�2rkV2�ψ��y�,I�JѺ0b��=�h��ע��E�
��CS�N�qz���
*D�L-i����q�C��3�
\Җ�fw�8>�В	&��B ����ufSSc��vї�<���d�*��㔏��c7�	�a>���s�95�~���^��*dD��U:]ܩ�%� ��k-[Hqd8�F�eg�^;����H�0DX+�!K�,��Zpj
"cX`![�GUOj�a�]t��8��m�:N�6�KރI!�;�ɨf�J!;�]���?Tt�T��,l&ЬL���ZR�l+��Xc@%��J�Ƅ�3t����-̪�bZH��if���B�����o}�mO��b�Z7��.�~��"s̐��BUP��k:Av���O"L�y>�u�.�Y�J4��.�uHyz��	-tq'�Wu }\�V�[�c1\��_/?ps[�N`]�c�;/���g1��iQ��~#�X0F#]H@:�ˎ�rI
^;����j�`�"��E�x��5���l����j�F�24b�u���0���f��
\2tƍj��Sv�pQ�Pq�u�ܬyl��)fԈ�_��jև��W���hA^��ϪD��e��C
�j���4(�F�?j�Q���/�+�-C��q'��"[�3H*Z��I�����ց+�
\R(��Z��AH�����5��	�7v�����v��0�_Tt��V��miꧬ���5:=��f"u��:�Zd �m��5�K��/�g�JU�	����
b�0_���A|�n	իv��!m7pIG��u�|�̃�Щ��O�U�.�l�P�f�C�h�z�/{@��5k��Q�<���i�.
�.�B��"'\��W@��K�u�$K�%O��VLL,���|(C�a���"%s~ѽ���ŎE��5���FK١'M,,���D��ROp���ճ𓣥�4+f�f��.8�t�Kd��-���lW��)P%��-N���?r�\��^B�7;�Ɍf�l�L��	;C���Kҽ�醕�]j�TE򒍓c[ݨ@CjV4��Vѽ֩OmH͹D���쪔-<���;���(�&U��~���BB\��Rh�D�v)
�H��j*?m��t�-{���"&�H5ڲ�^
��ڵ�����5��-zS����/нV�7��=�4,;�
�5�!wO�!'�z�
А�^�/r����_pIsM�#5oh��s�Gh�*ѯ%�C@H�f�)�z����?ɲ�R��������R#h��s�z��l��/T�h�׺�{����#��tܚd��g�Z��yN^�� 4:&zK���
s��
W�d
�[C$ӷ�<'!����(v"�F��?�{�l�*�
�.l�F��:�O���C=�qE)��p�(A���5�3�p��E��t�{>\M^�$+�P�Ԣƒ��B;4s$�J�{Vu�����m)��8%i�By)�~Z��=Ȇ��Ǚ��#u�_t��Y�;=�	���o��Z)O�<f����Y�'���O�'qH�3�R�?UH�q;�k�^���Ԯ�*�Y9����{�X�hU�~է'Rv�!`��f���M��-ͳ�
��{����W�����B�k��4[�@�>D�=(��t�
���0@�[rJC�?��2	�U�*�G�0Naqu�X-E���R�}8���	|�����-N�tA�j���Od��5'�k�=�{�f:W����ம�=R�����D�l:&tȵ,����*���Ҭ�i��$w�����.�A�n�j%�l�WO��ru�ɃC�D���h�l�F]8�ƪ7�|Q~ѕ*8C�:��%�=�nL<��k�z(�x��n�� �#j��'�Z�h�?B�V��nݩ��C��Bt���L=z���m��5u�����ͦ�^�`�C!zh����^Qٗ�����'tO����{���ɯcF�WZƚ���^Gsk��`N
$�
V��%��9���]�R��ͬ�C��.�Ϣ�$'���"��s�A�pE��p��ze)�!�T}\�[*��"/Ge��n,Uw���u5
B�d��&h:�r��=t�ܯ���HP��ԫ����Rv��D���@��V���� �,�>1��b#@�Z�R���=�ɖ��p��������!�|3F��¦�U	�4\Y!�T��r���g���T�m� �$�<cU<��g��0ˀ��iJ���[�$�c�sSs2OW�=��T�v�M���@�4ѥ�-w��H�:�
E�B���,�A��ŧ���{�dA��IbI)�����7�*�2�sC+Y𿛹�a5�0@�.��}1@l#Oi�dx-����ef,%?oY���	*i%yDX�3rV������PCaz�IU��˗�{@��9������{��b�l�M�x��L�@W�O�u��=�0�/�&�j�����%$�*�s�z�6LJ��"h�� ��),��	µn�^kVĚ֏Q�1ɣ��2�k��8�_ 5�]A��|庩{e@���`�[�|�K�i�L젦�K"C�Yw���A~�y�C�lf&�.u�� (*�Ʃ:4�}�8�q�y_EC�ژ�
�L-�臄�'	$UV��}�.yȐ�`$:f���)�нV�����	���LYvY}9*��c�e9���J��9a��L��Ee�aߜd���ȑ<���g���'�f�
���6t��m�	S�'g]s[3��0�UbtM@V<k
�9z�c�׊s+JoMM��
����r��]
1�]G�RSu��牕ث�5��ǁ�h��F���G����
��+�A�f!	��ޫ�l��8֠����y贛킭@Jdܤ�f
K��U�����[2n�oj��ź�˺�x��!(3�ؽy����@��({���m7pI���Ei	;�:J�E�I��Gn��'!�Z���z,nO���{�����k�dM$��
�����s_h=�(�v��[���<Ι�f�"@�#)O�6�H	Aź��Z�[H�<�
��5�<O
Ex*.�BH2�I�u�{|�%�bldaT&�r��p��:'�Dž0�Eܰ[ܳ�5zg0L�ܧ�p���}F�2�=�
C$Jy^��{m&1���J�\b��I4����"��0̣���=�w7u���2�ߵmXu�TR���F�ۼA	�p�ʛCV�P��u`�kԽ*�<,�b&�����!p���<RbXd	�2�y��	ܴ*��"������^�D0PH!��>Vs�yR�o�
�ޮ���C���M������"�l2�i�<�Y�iN�
��5��͋�̶�-sv�7������28�;����*�nbd��鞊j��A�;=%�M��4�@����4Q�ۛb8}R���~���x��C�M�u+ĤG�	s��+ГT�������U�m������mȜ
4@t�|7�e>r�!/W��X@�GGϼ��{���������ğI� ��C���bh���&���օ�ѽ�n��c�b�G2���O�S����&,�GuyC�0���a�-d�@P��NUj�P(�E�Nd��î�
>�jwz	�v�� ��
’����Nbq�`�~-�#Mm��ݓ�#�3b�MQ�>�c@z�̺�n�;��EO�\�yR UҎ���ћ�W�~@F�QU�`�,P�J��YCB��!#�$T�,�m�P�:���M
���]$A&�s}��7fڋcȖ���kK��8��սV-{N��hUi*KFhS���*e�铕�#'c���{���(�6JQ�JYR�+0ʲ
Az�0�V<Q� �W���u��9o	:%�bR	+t�M#�t�����ZZ�?W��^6S�CQ $IF��0�u�Ė���c���<V��?�$�ס,�Y<�DJ�TB�Bi����n��k�<���	�+���{�]�����I®ʂ��QQ��	Z�+g:}��qo�\<A�^=���LƟ��<�.1& t��1��f_-�cXnHG�꾧.��{���]cd��x�V�:�+������妻T���-\�D�@��}�!�˲:m�1�g�=�?�ob0u�H���M�aCd��dV
|�I��&�,��8�X�e{�M��ި�{��<���'��С�E�EPȒ����CS�g�L2�ٮ�.鰒��L��K�X��v�HW�gu&;�Jx��E`b���K��*e���DW=����D)��"^au�E,�w�Y��p���YB�xote`U��ڔ���V���>��q(�W���u;�V'J��Dw�ꀀ2��4�zӥ�V�P���a�ȄZ�jt���p;��?���L�b9� u��j�1*��Yn/Wѽnd�|��C��j���a�x�PoJƇ��&��շ��}��.Ϸx��↞O��$ڀE�Cm'��3z�a��1�#_8�k�d6%d��[�'r�����U �n��XƢ�_
�F�]t�`�Z=޵A\zu�u49uL� ���bWcO&?��kݨ�4=g"rR!����/Y>o%-��o4�4f�FX&��:7���/���T�E�Rh9�~�γΫ�r���Q�
�H��v�CΪća��&;o���ޞ��O���[�X[�.��8�\�y+�yKG�->y�ϡ�'�����&�R���uu��ul�]ܐZ@��ly�
G�ȑ*��6i:��1�V)�k~��O|Ý"��Wuy�>�kv����Yc��0��3Gޒ���{��zk�GV�L���>�3�x�T�'��5bX_�8j���ҁ.��Z���)0�ȐA\f鍌�Q<E��7����b�f��z���-�yP��أQ�t�e��`37-S�kN�ױ�K.�U�JFכg�����i����^��D����M0g5���%/,b����:�׊�{tצ؟N�7��k�,K��f-S�êzm�u�����r��=Tӆ*Ѡ�.3�XA�B _�3�']Y7��:<��@����1���y��fAj�ox�"�j
h<�Ƹ�W}�Ga��=�;���K�/8
aM��R{^����ÚP����s#f�Y^P�7�Rq=�>�8>>l+���
�u�9eZ)W��{z��C�a�uK+��q�[6�@����=1�Rֲ�H}*w�p	�"�JI���7�Ӑ�Q߅�ɻ1��K������̻9?~=�ִr��jӦ�42�-Rn�4�9:l� �J�(
�.��[ʛԴ(�XG��t�]Z��\Bu͙�ȊV�v��|٠;D�_�pf�y��X�1�K�H"Y��i�AԾ.���ϲ��<�l
�m'�,�S��QQ
OB��Jco` ��y�ڝ<K�B��k��� �V�U��i��*���/�o��z�
�
�u	��q��/�o$v�/��{x�Wr���Sz#� _�y���o/�R=�� £e��YZ�����+��.}r�t���uW��r�I:OŎV^\2 5I����2Ʀӣ	K��q��B.TI0k5�cy��%�.���1�tw��`M�J]fW�
�ї�KSM+�˛��ҿ��-x��r��q(���ʐ�?�{L{V�2*&xy�WJ������S�^갼}�-9�ޯ��&+��v��U@��[�\����ʏ.D����������"C�f����C�/�ҫ��w#�T�%���m��EΙ�͎�P�
kx�@�^QZ���{�9���n�Y^�4�0UW�֍s�E('{���#�m�u^*fg <��İ�
�j��|���<�ѽ6�u�8��f�Y���[R���k�7���pݲ�#�:�e�^��?Y�!�X=(;��UtX׮�vmY( %�G/���3�����~�U��Z��TV��h�S	�⑸6M�N*!)7���.����Cߨ�/��YL���J���	��<kJ pʴ����ig��8���)S/��j<ʡ(�1��4����lī��Ԫ�~;�%X�]�����(^6�R�����R�UnC�wƀq�ܽ9���s��f�S
)D����-
`�Ca������z>�/sYؠ;%녜ۻ�~�� ��E��B  D�SY�[Gg����\����#�ݜu����=jD�K5�7���A�麻M��R%��!�Ao��—X�vH�JѰQ�^Y�r��*��{#���#��·<��ӯ�{�$#���
%��鞩W�6��^C AB�LѸ��y�Щ 6ϓQm���趸�x�Zn2*�U�G����Px�Z ���
�Ʌ'ս�nt���H��f������N/̓��g�d��}�gP�7͋=�DzҗwɁK�5~����<Hƛ��qxR�O�E�%.��$���x?X�c�ӯf��@�o�0ge_��˨8s�3t���J�3�,�+;L���_�nj)��t�>���O^��W�~.�o*��N9K�&���#�DwE
0�������~�t�&�55N�2�:7G>�?ٮ�7Y=r� 5��y+
�܇�;")�+�!�(�nn��d��Q����C��[�W6��[�Dh�k�(�7������wÍ��P�8
���k������o.�Kg�ѽ�v�y5,^��x����Z
s�M��^����
��\��tt�%�,p��+���yCuH�NC�ҋ7
*�����4\���xƋC�py�wt�j�H�����勠	(+��_^3�_Ǒ�M���ѳ,9[K%�WBy0�%cΗe_�
M	r2,�շ�ƽj(�etU��gx��@3�׃��ߞ3uHbW8��5|?�1���P\uՕ����T0Eύ�}˃��/9����^k
&Śdr��i<��,
xˡW�4��8m!��	^�:�>���I�yX�˧��g���h#��^�W��6���{�v�Kvы��z��� ckE���\�"��ɀ����.���1o�!�{��Ҧ����� �y ����~�	e��c^��k�8P���A�#u�&�%�U)�
�T�YKgIE��&�k��˽j"}���t�V�;sp��}�V�\�V%.qM#/�:��?�C��J�>y�B���ry�7̉F^
sx�!����,oۅ/A@[��!�FOJٛ����k<.�Do�!7,Xǯ��~�o���Z��@v�-E~U��<r��$W�rْ��S��p��dy���خXw{�k�#����.c�dv=t�d���W����
�X�̉��)�@�X���U-`u[#PKB����%C�q�A�z@y:�X�����+��Nj�Ћ[�����-�W�Kpo
q`�z:�y���2�~;�W�[8�!�=�_�t^�r��GMf)����`��v�2r *��
<�P�
H
�����m�K�UsV�5�����.$�V~��n���=�����{�G��&5)ЀR���8��I�7�1����<h�8�+뢿'*��=�x��b{��b��������yj��ĖN�O�&��}X��]V�?�]+�GTf&k�M5Ώs��,��T"'��5M���o�t��x����L���]F�Gݧ�	�g�3�ĉ|s�t����k,1��r��ۜ�.����8TM�^�Z����E(�S��,-zۗ'eU�a�>�|�hme��A�䉬�Mo&Y�<p�=� yt����o����<��j,]�:bBƆ][y�"7D�d�}�	�Бjm[�6��ak<u��=��uϥ�M?|4�ۑwu�$�#�h�z�i�r8^�~(1,�+��i94��i�L
F���K��/LaU��$C���PQr�SW�0b��N��0�
��s�RhO:p�!���ZN�Xs2���'d�焩 r~�{��xz"O�v��h��
~8�=�\\߲'~�T�7^\�HWBb�5�!�U�e�S���%%I�&�hnj�
L�k��ʰT����[4d;��׮2$}��н��_���PKE��T��+z8�!pip/_vendor/chardet/big5prober.py�T]��8|�W���Xn��H�7Z�Bf��%Z�2I�uld;3��+C��Y���tw���;n6�?�<��4Ńi2��x�M7j��&-wL3+�RE�ɘ����)��.�R�Txc)U���5��	:��K ����ٳ%���‰�){��=���F;|ڽ�����c<�,<g����%l��W8j��������ZޥH)Z�ZGvl_9;v�ܔh���"B4�ͥ�ZY�'�BO�м�;��a��+l\�-39��7{�ʔ�
M�3��0“��o�_�L�U�:C;A�g[�������A)=�f�n��F��LY;&�hbnwqj�$���}$�ȇ�_�:D�s�w:�f�f�>��4�؆��aO��U.�f$��v��B4����
S�8/U�����jI��G�E4]�<�N#���d��
f���о�pL��Q4-_���h9$	
g�h-��x5�4_-�d�%J�O3��|�8ea�d�^H厭�`�UF;��s�E�Ⱦ�_3TFo�r1�dN��Y����2]�\��ҧ�=�P$��$�e�2�v�o����Ͻ����=�U�ȭ�ӧ�x�4�ܚ���N��B�e��_ԗۇ�w��D�pE�0�z�<���Nj>�C&	��1SC�M8˱�[���u��T^�+�1�	��!{�8W�5����d=�=
ƍF#U¹��#�u�w�
,FN�č�^�����Ǖ�{Z��9߾�PY�����Wl�K��{s�"����i�ǣ-.A��!���R_�;�=]kQ�Ǯ,��j�G��"PBoK��	�C����PKE��TH
�[	�%'pip/_vendor/chardet/chardistribution.py�Y�o�����b^��WB M�~9	��&��Uy��2����ץ�_�>�6`cCB{�夋�&�����|�3��A�5�W�6ݶΛ�^�����E��p@����/��5:�lA2�;��8&>O��+-Sy>Y��"2��ri˕Jb�*o&|�F�rtB�-T`�3�P+=7�G�ӽ�G�/L%l.�Ƭ)�g]�LM�KT;;{
���;uY6����U��I�=W�r�Š�#Dw����3��	;T�<�_����燫9�M�^�BP��{K/$�t��"�p�"ӵ�<맞-G
]��]+�O�����vJW�>Nsia񭴄2��X0Y{�7ҋ7B��k�%!1϶�
?�WjKk��2!�ES��/,a�r
����Im��V;����s�����@�B�
�����ugЧz��>ֻ�z�����4f�H���A�p*�t����f��+��m�����l���^�.;]��}��o�n�]�t�;�f��'�����<'�\<�ʩO�B��	��? �6��41�
���")2[�C�s��X�v�[�#r=U��/��/]hYǷ�[�2�� d�_����r՗��ejx�bѻ:�V�k��a�U�F4�ad�5�O$��Ba�{S��9�;���X@ZQ�uuj b]��1.����E�[^O"��M��_39�p�:���^��j��N����\(�Eh}����ݭ&��M���ӌ�y���]F1�c�G�`t<<~U;�Z�j�V�������A��M���$�m��cO1�M�a��M��`+Qx��H{�P�3@1���Œ��uԠE �7��۝�յqQ�׍�u�ٻ��^�{�U�O�@o�m�ƪ����X����5=t�j��wYE�
z�#2�d�@8�Rd�@Y�l&���::��Bq��=���hX8M��	yӄ�+�:<Y,�V�l�b�BCyk5"�I�3G7E�.�@�! �\��{�f=p�I�մ�Lun�@���tBA�&�ۗ"�N��84��˿�	U��TX�c��0�(I�S'�'J������4jR*�?>���ga��H��9�����0�.��$���:	m�����{%����Mq;�(C�*��6|i��rg�������Hm��Ѱ(�n�h`[/^����{��q�F���D��QTqF�9��R�����te瓡u��XN����$t
��Դ����t��N�jh�ƽi��0@�ß�N!P�N�QÙ�O<.���EE����x��k�������D��7�r�\X�"*�_\o�¬;V����h��޿�㵪�hs$��,�h9�h�����Z[@�p{��es��-s_�A�5��@ 4or�֒��F�����h��n�k	P��S�+��2��6#���V��M��)�27�z�������^*��E��d
���7D��ݘ��3�a���G-;E����2�Bqt"tqi��ͻb�#���O�&�w�Z`����Űȯfi�ņ�|\���}��J�J�Q�S$�Y凙�%��1�N).m"p��e�P������S�2��"G��`Ϲ8�Rq�U��� ���tƫ0����z�xb0���DKq>�@X�7����
`�l�B�}s���JB�%_�J��|p��QA+S�_�Y�K2%�r�
R���MW:�"R���H�#;R�m�]Jp�*�Z�-�`؜�~w���l�hTT�6d�Qf\Wʄ�@p_��`�i�œ7h:J��Z��7x3��s.��ڔЦ����Q�ﲭ�W������፽��
��������m7�]m��}g�.�K�v q�4�1�'n�pe;�\E����ё��T�� I?P��E����߬:<��H���7d�Z���E�0"z-`Ɛ��ΎF
��5�������G���) �hy�ߪ�������$���N@�ń�-�˵��'=Z�����h�������ׂ����atX��a�Q}:Fս1�_���b�)��~{��[̄�;^l��@)�����t`� ��1��9E�[F�3�V
�����֧�]x�<���G_����"�Oe�=H�/�rl4��\l��,���I1�K��k�}�.��Q�k����@���]��`T?�e�w`����:l��+���EP�YB|�
>�o�o�K�N�{�$���U^��椺#mz7���H��oUveM���=�f�2ߑ3����r�u�����G+�N�2�4y�(��6:#N���G��,�_ג�Zm������Z�xI�j���Y��2��3�6���e�����g�Λ���ϸj��`�������"�J��z�(4O�X�PKE��TAt��u�)pip/_vendor/chardet/charsetgroupprober.py�Uێ�F}�+J;Z�Qv)�ّ�00��M\�E���eh��F����O�/|��S�\]�ԩK�on�x�'0���E�F��P�{Ӹ��a���BO�\�X��Ð�n	�1#x!Ga�#��A��N�g|�P�Q��Tp�����Oh��^�^����a&Ub�2�>�1c9S�k�P[��-t��%�Jw�as�a���I&=)����l����0f�;�x�Q|w@

	���J��O�
�Z1u�U"h�w���(�N������;���`M��)�ڠ�鬆/��P�RxA����E�{q�F`�֦�y�V�"I�qu9���o�4Y��ɢ��-�^7�����{�%��*C:�%�3����vK��?DH���X�!�Da���
�_��%t'��;�w'���J�)�/a�=����b�H8����WBt�����ժ���b���0�Η��jԝ�l5�M}`��������D��TI
�NR��j��eoHm���D�+�?\��P�M�/A�>@Hӂw�ivh�J�%���-z�i�/rb�{H-X|���R�<Im��K��N�}����d�{�?y�p��4��;p�-S�^�5eOݳW�G��YlLQD4�=�b�04m�F����E�h�@�gDtg��R�p]N7�u�àEC+6n�C�lj�z�GG����q�{�6G��2�P�]
��>?L��t��_��q7͂������Q���db�*���ؑ��.Δ���K��f�$�R��q�b/U�%��Ɵ�sUY~'�o�"�S�
��b���RG|�c�!"O���(<,�y
�}�H�D|�V��&S���Ĉm���f�� ��=]���8I�!���Rʆ��t�a�)���f�!M�qG��5���u���g��LW�gw�,��_��O
 K�2J]�ch��L�d�t���r������8
^t�B˰��'b+Q��O��]�oŽ�J��rR	m��U9�����d���S���/����q�Pn6���:�4?|�10A|hA�.�*%��I	�u��u�BXa��)����x4f۴��8K[(o�ػ\��v���i\�e����W�OG=�PKE��T!l7y��$pip/_vendor/chardet/charsetprober.py�Wms�H�ί��_@�ں;'��!�c���>y����э$��_O��1������~y��������фƣ��d6�������I��kI�V��]�P�J����HЭV��&�	��&2�P�2H���^c�a�U� v)edbi�,)=���&��%�6�L�@���?ml���tclqX)R�"w_��u�9L�Sj]���n��=�GMY6��L�}�aɅѩU���3�]	�@7*ZY���ÔRC7y�6�I��9�������*��ZXasFwi���,�'x��r�Q 4Y����R:���x�1�Z�|���rX���d��-�e�P����M��T��cH�H	�|��+(��Ȭt�����H*ܳmN?N���Z+5�+�D�#�1?<��9EH�ݾ�BPE��N��(D�O�-$e�\fQ K_F��׷s�O�җ�tڟ̿��,R�[$�Ф6q��QY���C��`z�/�G��+{?�'�ٌ��S��M:]܎�S����\��+�b��;��P�1@E"T��Ez8���i$�*$��O�02z��œ
�w���Mڦ'����Uv���oUxm��!�"�`��C���ad�m�G��,z�����^�������pr�C���6��F��z��
E������E9yRg`yy|c�R��j4F��`:��Gד��r=���7�9�9Tx���*��J��o��g�󟻿|��������ݛ��ŷ����i��"��5���d�H{�p*g����۹?�<��v��?~+�C�$�W�>��Jd�l�.��_��q>1Z��P�a�O84h�˗W��������D�����؝�|_�����=��:ߎzR�ܻ����S��_��~��;��p���Z�fV��,�Kpy*a�֟�OL:BAˍ��k���w^1\���x���
����z�� �V�F�߄U.��wA�EVׄ_)�l�Z4[�`�y�����&�o��7��q�����ն��'c�dσf�����;�Ri�l�#�<�n���I�FD�Z,dzFR�xr�N�V�N��g/:b�'xX����3u��b��p$#��uU��ҡt���8��<O�Gd2���X�a�>����4�>RtʰJP^:�xŬZf:`��C����L�7�vFҝ�H�$%���/�*3Y���1���U,ό8A1���A�8�\���!�a�N�<]�X#�Ok�)4<<x�Ҡ�s�/� �
����q��l�*;ʁo�J>�|��i�Q�C��u$�pig_M�Q ���a��A�a�d�+�z���P�
��㜾3U<TL�\aU���w(]h�꧎�'�SXl�ȷ�Nﮦ��iT�G_�].G���/ko)Q,K��bOݖ[>�;���%
&�X���(n�J����P-��ȗ��<d���
�¢��O��Kc�`O
�^�s0��{q�A�4R�����^HN%��5�֩3_)x�f���2�V��~7Q;�Z�ʞ��^c�rc�����T��׍�NiR[��!}_���]׮\�
/�EY��Z��G���z�uJ9�'$�$���|������$��N�m�B�V�+`����b4�ݶݪ�Af-f>�v�3/�N����^����T���Jszp98�c4�G���I����O.�^���As���n�d ��b��r�����k<0ß�/HW���G.��^|,!��<ޯ���s����/Cb��
�^�A�?�����!��Ca���+�/b�]ʸ>�Œ�暠6��eIDZ�}D	Kn����v\:(�_��;|��ߝ1q���l��������%
�?Iz�q�c6�}^[ڥ`n3Y��-5
<��<�b|�A����0�G!��N�?PKE��T�Ct��
)pip/_vendor/chardet/codingstatemachine.py�W�O9���b�a��:�
B�@C�U�B��;�X��s�����ٻ��/���d<�<�f����e�s@7���`ԣ˛�������!��LwF�d.]�IZ��?R)i3���U��s�$<?�3+�`C:%��v6�)ˊ\��I�[|5m�ӽ6�=6,'4]�ݫ��X�%��;:�:��Ǐb�{D]�h�}-
ٲy椬�J���i�9��g��
���	!CGN���u^�j��a����0�թ{Ab���"'É�%<�p$��7m��D�Ko*�����~<�
[dJ�9g�j�1�od̹e��f�
S�>�Q�]k�vω%���l,,�>�ԷU�m҆���x�����
SGF{)h*MH�v���(�cDS��rZ�6�K_��/wc��kw8�Ə���8E�J$�-�0�2"wK$�����"�������g�z�]�
�K����p����nԋ�F�5Ş�}$�(N�i0��Rٲ�G��"A��\<3���D���,����J�P/BB�I��kצ#1;������oCGm��'�Wh���2��ڴ�R[�]o��=}�霞t>�v�F���C������V����0k�R�3�8/0��٭��2��P�Z�X	� ��U�g-�"���d�e�g��H`�q`���왠���ą�`
��2�RFyV�[���um{5�)��a�Ko�G�.bǀ���xƘ��򻄯!
т��8
���E>cp���TX\�%�����.lu	il$Zg�1�~�?4X�o��fϗ�1�2�n�
��“���V��H%�Y����V� �sDD���}�3j��HF EгP2	����&���>sHݔ�2���Tz�p��:�*�<�۲D��w��=8����# ��Чe9h��=�r�-�]^N�.�o�sM�A��J��j8�e.1��Ո�$� ���)n��Ge�aR��b�TM�Y���׍���UX�.N���n�������5b��w����-�X�@q��M5�J���q�Vm%i
�z�,��U�ppڅ[�"h�`QX��Ii
]����>$��d"�;�drdY�m����
ߛ�	^|Vt�����0f⹚�Up8�w�gn��������Dg��1���9���	���$O&Ǜ�vG�Mq����T�q���GA2���ұ�(^�:�kD��i���a��b�w�4�T�������Wa���XoǷ�`�8/�O��U�٭p_�gs�_-}���iU�UfMO���G�TD
ɖ��u*}���F�v�uW���t�D��h}k*60�r�|����\�w�Y9v��wnjF
�;4)��w�f|&�Ay��R�7��2�^<�X.���-W�
/~!f?�T��_PKE��T�3d."pip/_vendor/chardet/cp949prober.py�T�n�8}�W�p�qwlXّS#�A�Q�ɠ%�&J�I%P�~%_��v�$���̙�ۗ
���&�a4K"L��g��n�i��47b+�4�'a��?��,�fK)lA�:V�	D>�W.���9���qgS��0E�Dʜ����쵩Lm{j8s<�MU#�~3k_᪝�ΰK����q1<�PJ�}���[n^y�T2���)�6�є��rkDA�����E�vZ�4Rl3�W)7��չ{��tI)Sdx&l!1���
�����Re(dzv�����lEn������,ʍ)�'"��rb���fwg�F�Hr B#
�Z��~�+7��{�
u���ͽO�tE�0����J3���A{|��a�hé�</e�����jI�셾�qΖ/����
�(�RU�\��F��2�x2^�x���r%	��1����x���1-V�b�DQ�Qb/�%�O�,4�̸cBڦ��ׂ��h�^9ڜr��"�'���W�Vۺ^��} ��ҮGoF`v0}�u(�0�iУ�}1�C�	�G"�Hjmz4���i�ܻO���m�ϻ>�*��ڡh���H��ʍ.(Hw̜��_Q�>Ǐ�!�De�#yxjkƭ`�N(~�֞�{���Rl�e����H}���҉A�ބ�E�=�X[���ݯ��z:�&�V+����ܤu.�a]`[`6rZ���zݱ\��?���t���{v!�P�d�^(���9u���4��c�M��Od�}�{�H��|��ap7�Xs0o�sn�r�G��!��7�'��z���j�u����
l]u���õb�UC�]i����\C�LmK�����g��M�_PKE��TmùSpip/_vendor/chardet/enums.py�TMo�0��+F��Zh+��Vj���%a����$����i�?~B�Zi����g��g���8��X�*<^o�>Q�B�%�V�zS�Z�'YA��h�D7��t��V���0�F�r�.r�{����fKK������N;��Q)��]�bE;��F������T��P"W���+}�hI�P��+Ihb�)QA��<"���Z5��2�R'v	�_��@^�H� wdz��O#���O���OJ���2[vP��ї�%����j,�V�c4�C0��Y�	��Kc2_�dB�q���w�$r�$!a�V<0�{g�4r�]lF�X�A�0H����6O�o��'o�h�:���j��Q��D�����%�|�7v�
~�c/�܄Ӷ&�2�$i�!�t���4+J�ߤf���>e'N���5�¨�F���Z�j�����"�O��Uh�5sN3ݩ���]
�N+=��� 8�Q
�����^�v�d�-�j{q��peMܚ(��Jn�װA�j�i��U��"c��v`0�P��C!�~�T]�&���β���C�F�M�{̂k��_.���
؊�ԉ�3��2�6%��i��
�v<��!�DϦ��{U4Ua(����A�>hR���5�\ג���g��m�M�6�cpss�O�#=�3��?�G�o�+;4dj�cpc�xt� ��?PKE��TI�$" pip/_vendor/chardet/escprober.py�Vmo�F�ί%Rq!U��i�b.��&��V���cX�٥�KR��w�/��K��`v�ٙg�|~^�����������'|��0["L_p�R���kX�/<M�#�"�9����p��gL��L
���舭�L��F�.���j-U���a*Un�2�1̷��ULY����Zh�[н��� j��)��W���3�y%})��󍑪�[��`��g��t��
.�24`$L�f)EQ?Q��bjkYJ"h��J��r�0�:�'"0�(ůd̓�5mDL�ج
��.9�0~�!j�>�@E�L7�G<�
��4��M/+�6��H��3v�9�ۻ�Qi����-o+� 4���S7�6�EIo!�n�2ҩ���4.2�%qO_�
}!�a�1٤mB _����'�3荟�S�{���5��tJ�ˑ�j�r��fK�����ѻ�����f?�fc7`0�Ӟ?�Þ�G:	\ @,)�d֑��8!ȕ$&c4��:/��ګ)�4�%{Fjs���Fd�}WS)Y�Rz
<!M^'���K(U�$��i��]rb�sJ-(|���R�6�Jm��G���n�s���x�r�w|��%r�h$J����Li4k%�T=uώP���if,i�B�׊EK.p睝�d��!(64'�א�ņ-p�SR(���fam�W� e���n6h��0��ɝ;lg/�\v./��z��i���߳��F�2����A�̓_�r,���Y��MՁ�M�:��t���[�Tk�P'F�
�yb/4�H������T.���)����D��P��KYIg�Fk����(��Y�C���"g�~�%��æ�4i���0�s3����7���-g���UEd!���x��;��Ɏ��W
q��-7��t�
<��J��xF7����SM��}�:�CzS5{Ӟ-�;k8�{x��no�߮ߛ�֫N3��3JѪ3�o��C�0�?�a�u��Իe���H��M�U�<7سI�ޥ��i�[�·,2�/8qj��^[��`�и�<�ʘ��>�3<Ax��y�k��?��g�;v�P��&Y��(q�S��o+��v/(�=��0:��q��v�s���;;N�S�&�q�)�[C�����ʥ<;�»TU�,����#O�n_U��Th�1����9��9�w\ߟ��R9����εҾ��n�wپ���@�>��;��<��d�ܓ����<��Ly������+�
&��Л}%�f�+���
����q�k�6A���QU;�ѿPKE��T�w�yS�.pip/_vendor/chardet/escsm.py�]o�H��G�M"�#�h/%	
_����
f��M*������h�V ����3g��cq~����]��f���p��� F{�:���CW�Ϧ�,�;#��iY,�gб,�ZI��陨��_��L��/���:�r,�Lf��3�tl���#�/h=G,�u���G0���۷b���s��؃��%��
ZDʳP�,PI��].^�hѓ�c{��<G\�������w�ֳ0'�l����7v�e�14�9L�)J��\��~`îa��@g6>2݅=�f��r^?qF�1���=��P�=.&�*�w�Ghq[
w��{ӛ
-SNj[��m�saJe�x�[j��l�:h�G����t�.\,%�_�m�p\0�:��9�+/��s�p8���ld�]�i��c>�����8�`�a�rcf����ٿ�>���y��5U�u�Oר�Pc-��ɜL-��[���[��Z��+j7�V��D��m�;
M�ۮ
5���~��ت��{T{]���8_Ř���h9q0�#�1�r]��u������8���)��t�� Z���/Y�Ll��!�!L�=8���m�#�ʦ�g�G��[8
9ܚ��Z�#�ۍ�z��]C�����2�B.�aI���;�%穔!�	d�=�)�cG+���is�é��;�F�H��[�
)\|�OC.�
��.�ܕ/��,e�2Y���!������R7��i�rS�nr+H�
�V��ɭ(u+�[Q�V"��ԭDn%�[���R�2���nW�vr+�KiP^e�ve��[�er�\Ie�V��Uɭ*u��[U��ȍI��1�ې܆R�!�
�n:��R7��t�ۈ�FR����n�ܸԍ����fH�rí�2E���7���xT�76�lCU�j�W!T�ߵl�UF{lw�]��T��k�v�ͅ��gp��E�][�U�U��$����A{O�Ȗ�J��{U2�#*N��&i���2�snK�L�=��|�(��V|a�+)Q���b�A�/|z,Wf{��~n�P���3�b�;����g�`�*�`��t����,v�A�+���1��v-[
m6��o����R�+g����3���֩�.Ǫ7x��u����;X��XU�8�*��J*`���~��*I��Y��d�J��*I��Y��d�J��*I��Y��d�J��*I��Y��dk�ZozK��Kc��0M�y��ZV\�J^{��k��G&�}�pM]��g�v���"��̀�@4Z�3)���į��"��1�s�^��B%S�s�&���,��
^�f�j$[��8Ďk~��Q�!]����{�~=؎��W��ٹ�v9�ٕDԮ���N�}B�W�	�ò�6nzj0~�����0�}8N�q��o�2�~�}�L�s������߃�s�?f���e��r���s�����҃cG��\R~�T��`�q���^T~�MYR������г�b�M��,��%;=��N	�)A��7��C��ï~�I>�AvdG�����=|�_3��AsQ��Z܍����O��]�Y[��ì5
����C�PKE��T���\"pip/_vendor/chardet/eucjpprober.py�V���F���bt�H�r�hT��S�r|ܑ�%c���Z��1�hw}	��֘c%m�H9f罙y3;��u�C����vw4���`�~O|�+��8��X
�bj���0�V�D���K
akT��})��g���Xm�&� [���&d�z�H2+�4��7J�?@L�w�PsfyD�m�XŴ��lje�ڮQ�͛?@Q�ޠV��|
y�p�£]%m%���*]5�;X��L����Z�醐�%�h��+%��!M,��Si�9'�����J(d�4����CKLF�*
�ZEb�u�DF(�em�^�����
�A���%רf��c<!��3�q6�:*�s�L�D��@��{O\���~��B�5��hc���*�.ts�5$����{d�T�c�	�Ү�=�!
��1�9���E�_����3�Z�g�������/��)��c�M,@��4�v��A0�z�' Z�A�v����;�Ro�Q�&-��g��G��7O�
�)�{���e"$^�r��d�-�ٕ���$G�b/m��D��l����˴^@��ޓX�T�N_���`�
�˱�u}ب��M81�9F����ԽX)]�e�s�����ټ�i��mͦ�\z�;����TZ����>�64�ݢ�n�99haOl
vD�ý�Kc1nk���{d;=�����$�p���d^�Q�V��V�=(�{J�5�����=�d=w5n7 A��؊���m�N����G�1�y0�q�;�T*ǎٙw�j9��FnAA �˂�jx����1	�Z��8�׎G��t�����ΰ�}�S��{�w�੠���0��la<�3\�|���yο�J��!kq ٚ���&Z�R�y7��D3�L��"��0�,��u-8�R�:���=��#v'n����갼Z���5�_��;P�]�vp�,�u��26�&J����)ǵ7+�Z~��I�����rP�<�m�26��7�����͊�<YV.�ze������k
��jIK{e��]	'm��۾��.�h���s��t�4Fc?v�9�t>���}
�R���g�N����S��bp'q�m]��%�����S�(�
�H}�
�s��	�
��.�õ;!�/�t`*]�?M�cÿS\y��K�Q�;�Iw�j~��i�m~��H��>%�i~:�����arrC��ݶ�=ޝ\�Ke.U�\��aU�%Qq?��tʔ\��ː�ϝ}�4�����'���N_�w��|��>n����^�j���Μ+pV���6�.o�E�,�5�Z=ͥ��U�PKE��Th˺�m�4 pip/_vendor/chardet/euckrfreq.py��k�G�����H�/Fj�ʨ�K��+���``��5p0G��aO7���~�y
��H�H.��ʌ�����[��������'��ك�O�?,�?}��/��:�U^�ߕ���������vW������///����o.n���r���)or�ݓ�SϮ�7����������X���7h�'���7w���pu�?�G$���p�޿9�.nvo���R��RGh}��K��)�=�]j�k�������e9g�u9�]��n;yp��9�_�m~w}����/��(��?�ʝ�ޔ�Cy������ST���Nj�g���ە�û�_�����ç���wo����M��z���1�8�ݿ�̫OWos;p}�;~��*ÿ<yYﮓ����y���MN~����ޕ���w����#y�������e�����x�oJܭ_W�B񴤮�������G&�N�?������̻���;}[�W�}���?�`n��4��zW>]��}�<M
9�����_��|Q�=�������'/~�>Ǧ��k�o����1M�m�]/�n>'�I�LJ���3��?{|��'�t������ˣ���^yv��ك��g/ϟ=}��n)�w��"F���o"~�$?R�ow7���m�?�z���˷��/�T��>-�\��|��������g��S~�e��\nN˯�}�NZ���T~��i����e�9�������9��]�~ty8O��
C��s��u�Sǡ���y��W���'?�A��I~~��rW��5���Ǵ�ޔR��u�ț�O����D�O)�t���0��ݛ�W���ϟ!Zc-�Ν/�ݥ��毿{���o�י	C��/zo�9C[ջ�<{��(?|�]�����(Mc�S�����v�_ƻ��d77�ǹW9~rb��p'��-�X���1!��sON�|��W/~zv����W?�=q~v�勳�O^���%����۸{�?|���?�\-փ�GL&�忞ŗ�ח��ӽ�p��4�w_�$����?��WO�xx�t�;)����ߐ�N������zZ������i��~Z���iY�%�
�5��ⴔu9=I
��:���q>���F>��k���:�W�������V�Y%�<��|���c���)Ô�2c2"��&��YI���K�{��rL��}���w�0�e�MD���nS#�ZV��qԓ`�����˚��4̭9�,�1T�\��m�1��+,�J%y��e��x8����lT�.ϼTMR5����1dR��Kha��U3���E&�����s&(�p=��s�wRF��=�బQ�r����և�=Bp���J}�&f�3�e�B��y�ȞED��Ң�|�'5�@_Y �8����U���4�K��{Ŕ՟dPn,�Z;3��v��t��e��rq�,��|��&2�P��c@�(o��/LF:&�V�a^�@�9��,=��Odљ�a�C�C��a�1��w�/���5��!4�[s'uHI�_��:�H;��ȟ�ln_f�mu��v{)���C��!t<e��ךd@��*9o���u!���kuH�P%
8�.���~���]jk� .�&����"��1/�-Z���R�9|m|֑EF����g�>R�;̎��f����t�M@,
�4-HhD��(+�]�C���D�=R����TF�sh`Ө4y7�B�=�"�M���J����'�F���[A�1�R�L�	Vb{8܀4����:�-�n+��p�i!�H ��lz̅�\�\#��06�ĺA�e��
(�̓'��Z`�N�	�(�>��I�@��ʖW|h�|`�l��Xr���Y��q,�t�5�;�G|�-k������\gx���	�{W����[��I"��5N��ip��ꇆyAf�,����?4�e��_��ş�,Z��+6�H��@U�.}7���5T&[Y��>�����#�����Cr�;b��f~J6ZF8x������H>�B#� b��u@0��J�+�c�������p�:��d|$����\YD-�3Tu莱�S�qYt�Z[@�#H�䚛�c�۾S�Օ;j�x�@\6!dV�RU�l��\�ee��2�[�-w���i@oꌐ��wP�����,Pō�i}
�l��u5]��̛:��Ъ�0��uL@\��n�*�o+�f��&ܥ���&؝��2>|1�5I
R�x1��[L�[�8|��.�^&FD%�M6�~WT���U�#6��[�ą�~[֍�D����-C��fG~E*�|'��J���S���\8D����C�&�?��RYu�U_ƭ	HA�k(�����ߚZ����WAƩ:1���懝���(�I�Eժ����)����豢N�@�aF�~F]�l,��(��5��.v�	ۄj#;�s.�HA����>��hF����Y����E�YE�!�tRh@)ƴ�Z�O���KKk�:V��ֱ�|P�Υ�FP�`�,7�Z�2|�Q�DS)䟦�f��j��9��
JU����r�i5Xn�,�a�C������pXI"�
o4Kg�`��*����ӏ@�Y{�)]�cw2�X������2W��{5�ƃ���2���[ny�݀ء�!v�n��L�w��)4��J���z�JA�h_�&T��΁���M�+m���ā� c�)�W���2�O>!��nG�!���B���PV������L��P]
}*Jn4<RzU�dB�¿�3p�|d��g�O�&ɒ��iy����_8/2\���!�iX�g�!�=�l�3f�
U��b(��Ƹ�3����pT�dr�Jd�B�u�u<z��U��~�*'��z���] �2C���d��h�4�'c�����:���FC��R���bFa�z1�Z�4J��UYs�A�T�K�xG��;�G��g��N�4�+b6�g*+HYTV���حP����V{&��	0�yaO��pX���,��*Fk���E�!k������_|�S�8'���v����
G�QyԭP ε(�lY1��aM#�|��͈o{X0a�";�L_Օf�ph
��}����d=�	s����a��r���]~�-o�d��ϛ#�yQ��kA��`a˓]�M���I[u��"�U��g�� �(7Or��**��	J��nJY!�2Y�;6��}�Yd���H��[l�e� k�4�D��[�	�k�گ�̊n;,tX�ʌ$�SZ��z$�H(�D���H'7�Z����
VT{-N3+��v��ZiH������� P�����A���Q�e\#Ъ�N�j�(}�ʮH���ztOr�!��epɨS���t]�I�)ƺ&ZH�6G�Ϩ�F1���~(�C�HgV�Өg
�B��u��b��K)�2��A�p��q==�<����jڴm<�>&i�A�����#�HЭ�'`��ж�ib<M%��0��qF"6E�i3�f�b
6kO����f�QF�MY��s�1W'���HκO��Q�*�-V�\c��i���(A2;��q��ê����������39��$H��8U�!���w�Q�(,PX��!${d�[��|IH��E[2y�QE�¨f�?!���-�l�6W9ܲUh�v�14�LF@Nn�\�J\�e�l�[�v���h���'16���T�)(�2ii�A���h�C�O7P)h�|qe�#^C׈Q��7�\�.����N򉧠��58��220ƨM��᠇���E�\�,�}S�7ę�EAS,�x-��QT��m_!
*QP&A���,(���8�Ј�a��s2�џL�$����.	�L6;RN!����	�6b�.X�x�C�к���p�$ =�����<�@(�@)��F���B,�QTr�gRF�E�Ԧ�B5� �V|
SuM�(����QY�S�#��Ҷ�ykS=d9n��Jj�A6!�x,������PH��e�	JB�h���u�
B��O�<+�Fuu����K#r�|`PQ±:�i B�(�t�LiV)�M�
\7����-�`�E�Z�	Ts��lT�@��V�c��&��e�b/�))��Y��=[+��AK�&�$I<)dA���9��E�4Um�Z��Ȱ&��!8LM_&���!7��Q��g;Y#��xʃPe%,00_�&��`ur[4�Pkϣ<XNQ2��#�0ෆ}~R���yӰ9�++H4
|���&��	@��;[�.��i_���n1<,DF���9g�����^��`�Z2`6�:V���c�|��d�$Y��d�s��"-�/O`g6
(��Q���BL�hnB���dh-���Rka�$8���퍫��&&^h%��0��t�{4��s`�E1n�(!WOX�$p�|0�%2�ʎ)r�2y����k
ڀNpYF	:�����

֞f0`܎����H�G,��N�1r���H�tr:�����O[�v�<<�IB�]�陨�/�a�����r(Ap�#����V��a��+w(�x�ГH�q���̉ĺ,F*��q;��hM�)��5�/`��5N�zf/�٘�4qyT6�a����ҙN���l)*�a�(��B�3��Y7�l��䌑����H!��x��O�)���탶-ϗj'џ>�3����E'��h�iK�-4;�8��8�$8�bp#ќ�m�d��R�I�����<%6OQ����u�U
����:2��ۙD�U_��1�����nÈ@XB��b���3;��'nq�
�*Z@8�N�����/Q�~��O�R4j��G���L\K��c��\����٨ʇ�g؉�iU�6f<���ViUo�*`T�U�� Rp\'w"K(�W�=����h��U��e�&�]T��F��7Z����i�՜��ǃ��:=��G��j��!���P��)8
ʮ���-�E��d�0,�p��+�yвp�X<xg7Y\�hOқ�d��z�0'I��drA7+��]a;�N��P�Y�"41�"�������%�
l����ǔ�xG�֛&F*@�6�g�I�R�';S ʚ�h�n�2�r-j�0��8
j�b3��	�ee�)����N��?�Y5V��G��6uRγ?I���6\��5Z� 8�juQ��Ck�����-O�	�u�6F�Lj��m�ϳH�A�6��6
��Kצ�WR5Cr3�.U��`�,qI&d��d��E4�M��I��	��H=��E��B�˺�Y�Ik����1�^^��ʚB�a��@���$�6��!'�K����d
��*��ҷf��p�J�4�e:Y&�ݶ0�����g&�z��e��[=��F���x8,]�=�^�)�<~� =������Z�#��<_��!؉R�W� 8NN�t�#��M��zi�*[�bZ�M�L%����'A�U��ŴU�lg���Yר2%���ZH��d�{�rs�1�3��U�hR�6���x/r�����#���PL��7�T"�$-�R{���H8��dJ9Y
����]'6�lX8���JO�n��B���zن�<�r�3�'ha;~��RfOn��y4�cU{�x?@�h����L7��aw�C;I���Qf�L�c+�g�T�E�Q>cR]�#���V]L[��wă�r���`U�3��}�q#���x��PK*2�51�s���v�8�^�����􏂈�̈́L
=�0?$Џ������Ӽw"��������1��1K!FҮ.4��j��k"a2��:Ub�q*�jΔ̮��-�,�����-���ы��Q'uK�ǫ592��0)�Wx�y�u�l���5�w���]<o;
���2�~v����lȪ��!�J�8-<��n^P���̘<��2��V�3�!EBp�f�O%U0�0���sp&ݖ}�(���h.	Z4$�k4�B�r?�;K�}l�w	��N�5���L�ø���iA�
�DT]Cs�?����r�59ă9��YF�r��j��aX�y* bS�ޙ���0s8�	ef_^���3�f:����������'I�'@q��o}9E��ۿ]\�:�PKE��T�(�4�"pip/_vendor/chardet/euckrprober.py�T]o�J}�W��H�zu��U�Ɓ�/٠*Oh�ǰ�z����g�m
R�'��sf���4��?�GS��4P<���Jl�ѤŖif�Fj�(69�tT�oR)�5vCl��)t����|�VfǖLA���]&vSYVZf�K��ڝ��? ���{fYx�i]�M%l���H��Ԋ����_P\�R�%!�QŽ��Nb������r�`!����Rm�,�P�'oh^����!��k+lT*,39S�WvO��(�,���!�'���4�,�`�t�vB՞m�N>N�4f�J�5[t3��Jf�e��1	G�`s۳R�PHz,���{u�%�!�[}�Nَ�2�Z‡�1�]�QtM
Ӱ'd���Ns�zO����B4��5�5S帨T��/����rA��DIM�����b~&Y�1��B���`2H��@D��x�x�G�� Mi8K(�y�,F�r%4_&�Y:���'����D~��ei�d�^H��?c�����1�%6��Ȯ��*�7�~9zO� m|�^���`�~�.X���`�n���!H�
#H��Ce��P�8B'�wz�����w=�e
˵�Ӈ�<"�F����n��m!²a��
��S��#�n��w�7�c�J�m��2�{��<GH����5kH}��T��~�9�7e?�{��ʟ�Z���d�07�L	���u�
���Q�j%qtV��cU��s�O��}��.D^��OZl�\�;��D���t]��-.��qo���V_��t�u�E���+���n���kJ�M%6W�Ox[B�4�PKE��T��a�91� pip/_vendor/chardet/euctwfreq.py���%ŕ��s[B��%�3>2#ž	c�F��)@-�T��uQE�*������Y���Ҍ%�O�;##b�Z�z�G���?���O��G��>��>���۟>��q�O�}���o_|�p����o�/������ۇ����_^���/�����O/�y������/�ܾ�׼���G/�<�o����/^���t{����?����7��y���u��W/_�>�����>{����<=<�����_���Ӻ׏�̡�s�����1���?����{/^ܞ�k_ߞ=�~x��÷��W/�<=~�Ӝ�o^�����/ϟ���㋿==�p��m>�ۛW��~y�1��T/�~z���Z��n�_}���`�����7�_ޞ�}|���B��=���_=�������~Y����9���o�~x���?������~x��4g��O_�x�f~���o^�~�=}�q}���_W�� �ǃ�>|5o����8��������-���hq�wns���z���?�/�v>�/�s7��7��K��L��=���ϵ���Ή�<��������y�y��_?��_>���{������={��'_����ڹ��s����?N��6g���_����g���{��㏾��z�?��>�����n��>{�������=�}���>���wo�����G�|_���-x5W�ۇ7�_�v���z>�oo�?�����o�Dݞ�#��/�_{���˿1��_���n/_�y���㔝)}�aw�]~��w����;�3͋����s>�_���y�_�z����O�^�Y����#�t�.�#�n_~>?��w��?�?*��ߚ7������u"������L�|���O��%�=�������ϯ��mI�/�/�?�����
h��O��?�W�Zs����7�/��7o~���?�����������x��_c��o���ߎwk�W��������3�Q�~��\�>J��G���hg/l�G�><��y��z�gk�o���ߤ�ů���S~��l>������4���Y���o��x7�'���|�{��:��/K��3���z9���7���7�߾���2�г??{�-��/���G��W���/�}�/����O�z��?�p�e|���OK榼���O((61n�ޟ>���?�_��/�Z_��7��]\3�峯����}�?���ٟ?x6���[S���;�ԏc�<��9�s�Z�x�wn�[����_ZI���E��\i]:7t~ЏymZ��V���wie^R�/�y�)�>�Z�?R�H��c
�S�����9�-���;�z�/\������uuY���5����s���z�s<��5�Z�]w<�/5'�_׃0B������\�Hm=s�_n�#����Pץ���/̫ʹֶL%W�j��p���k-֕��U�m�m^��d��Z����C�Mi��`iק)�x>����aΑ];�M�c��ntu/��x�x=p�!�em��H�}q�_k� �эu�u������Z)�i���~�U�W���Hȼ�eV���	�,��c'֞��sT�u-�� $###l
s�W�A��uKV斏%��t�S[;�|"�?�u��Z�)�k��Z��}6i���'$�V��k��}͝��s���޹杧�[�����5�������5�smN.k�y(�k-������{k�sc����Z˴$|��X�=+�[�V��:)k�SKlCN�t�q�թp��k]詩>5b��N�y!��O�ӌ��-@`��#Q���g�Y��fO�^����j��6Q_�����#t���ï�M�E�שH�'�1��ݐ	�rm���Y���(~w�Z�y��p�����/4��N�{.�r^;��^�t,�R�'�8���]q��F.'һV��'�9dv\�'�>�q2ǍC�N�!O�ȯى�]��ZC
t�z���������1�ӱĬ�X�g�pcU�#8��voNv��a,��\�8�K@C���L��@����IW��Lh}:��9V��C}u"3�Q�7���̜ۄ�E�k��o�Σ.=U0�	37�R_h��v�����ľ_���$�M��n1�x=�:7s��r�4(/n�΢r�l��1ʕٶc�+4nVa� ���bҨ�	���[�N�Z3_C�%tS���Rs u1�[q<0j�ʭ����I�c���b�T�:ج1qY�9��o=�Q�+jb鏄��;G����y��K-VNa�f.I<B�����n :<�:��d`̀)��Ɍ0b,�ߖ��(7>P��kc������l%� �S�GYa;ۺ�u�f.,�(M��h=k*0���1>j�`��.K~ei'.c�s{<o(tLө�Xڤ��1��mWv�:�	�\f�!�ō^���9 �GA��g�Z���p5��6��Iؠ���Lk�)�*�8bt��s���]hK�r��ߏ8$)��tNF���y ��&��4�>�qQc��F������
K����|�0��~^K�$���3.�j�v�`9rRsR�Z��{�n�߲ѝ���S���v�������Ł������C��
�͞��_�^�O�S^��*)��N|[���@��֭Ur`��A@l@V�x����B'w߉�>D�d+JPDr�TFc����W��ລ��)\�n�84
�P*�E��5�]9�����ϧ����m�|�B�U�S1���$�6���c�ca:����Xh��\!n9^�O%���*l�	�ku�������%4��ؤ��s�避��Lp���1��M��Z�1����mo��__W�MH/�|OW8�`цwa��`�>�t)Rѻq�>�-��`/_�fp��N�<6Vs�tT��8�K�n���K	
rV<�(��*}n�Z��i�P�
�C�~�0��=x��C���^�@}�-��aɫҳ$|��^�՚9����O��7��=Pߎ��$ж�u�e@&38Y2NQ.�1�MH�˂�2!, k[¸��%ap�)���1d�r'i��zi��'so̚��IÓ��lZT�(p�
�N���[T`]^795c,j�Vv��'d�|���?��iH����?g5/�+�%��u�;aqRF�`X��&�Op\��QM�R�Ò������F�N�BX�p�my�l��Cl�>?.va��,�`���>��ؗ�C�LU�!G���$�Q�V0�zPH�����5ٮ?�U�eL�����`��4�"�J�T����\Bx$���;b����v��^�R��h�����mr	��%��9K4�z^�΋�@�5UPM��C9&� �W�}p��Y��S�a�O���8^�^M���X--
�8������n��}��Z'��V�����sK�:�����kԺ-��s�@/ہ��N�7V	C��-��M@��ӊ�ѽ����s
�-Ů�/2TC�X���C{���geח�K��
���:��7B��c��'8��ss.,aYT#�*��z��9T������X� {��d�@�s� .��L�YqU�G�Ý���2��%+e�,��qX���w䶇L_�6�UA��)Q�(Hd�)�0�I�CuE��&�"]]|���
l���V�Ǩ��ud8'�$�:�1�
���;WZ�#��Q^jĂ����~ƒ�o�����_%�`ϯ!���n�~mL�����UP��;2����!��P����x.��㽗�wA�bJ�
��{pp��@�1�'�"���‰�}Q:�]�A�c����|b
�6�-��
.!>�w ��V��l�P�`���$��+L>�equ:EE���"�X���C-�a���Z�3��9B�-!�O��E8%SY6� a@����-pa3PR��X��8�p�����C��Vx,3å�2y��խo����d�:�u�)x�HB�D(�@(�;c5~��	r�\��~�Jw	�!���w�s��֌�[R�c3$�
�q-`V��I�
��c��M�m�"��S��,:]�b]Գ��w�<�HE�0�`��D�p'�������g$p�S�c��I�iD�rb�<*j��ur‡�i`�dT�*��Ѐ@��	��AU���O�����
���@��W#��&��O}���ܾAt8O�^�G�����q�ئ9ka����^X�s�v��fZ�zF
�X囆'T�BԦaX��G�q�ۯ�!�2�F��ܤ�������z9C��̹iX�MWe�"�piuUQx'��Z���G����cEXB<'��	�\��֡�2m�t�=�D0���`���(�b�Jq �b�����bZK&� �g5Y���>�=��3D���[Hm"��:!���)�O�����JK�a�	s�N5��0l�&9�^�	Z
�
ג	R���B�T�6��
�3%�-��3�y4����\X�
zzn��k�ԅ�2�j���ڪ���S��P�Gv_њ�|��g�@�%���x�k�Bj5��ӐE� Ůz����E�h@]��jRvףǙ����d�]��L��"��g��o��5�p)�%�
�E�ٵ�7�
KYZ�#�f�
t9s��ʄ���M%��c���$�&�!6��}�ږ�uꫲ��ȆMc���e��h2��TH���;l�)Dv����է��Bw?a�\�S�3�;=�R�(��R�*n�"�C�^H/6ϼ�%�8~�I��#d���@4�,���g �%³�ԬKH�h��jIx��)NZ|�އ{;b�R٦��s��ئ�|~���%PMó�)y�ÒɹZ{�7�ׁ�5Z@�(ܻ*FG��Fd�.6%s��bP}c�w��E�ש�ľ�O���C(<ªh������
٘?�ȦC�gClX<"���Q�����
���^TH�r�����?Q�n���Dx��N�
�]K�.�ۥf�!"�v�n�[o�!��{�3�:T\�uU7��$����B3��Fi!9�b��r@���T5���Y���i	˰FGD[�qv$�M��+����Ÿ�L!{�]��+ ��R�8�P2N���`WtN�����5�$k�����)N�sC�j��i��è0. Y)/�T�,�+�R"5.v�ҽQ�Ko�ʁ9y	X�˶jsd�����e%3d�䑒��z`ܺS�V�J�C�E1��I�� �B��&-z���^�A`�3��˛V���1V�Nk�l���;#~��\ƚgY4��89���ȒX�6v	���.�t�M,��sS�1��v�h.�	7���3�9v��0��)b�~���a�*%q$��8d�����+D��Z�l�n��/�\�h�&9���-�q�gn)8���1�PS�2Ԏ8�8J�!d�WX��n-vE���ng3Ԑ�K�44q��9�,�CI�]gW�my�,����eCӗq)���,osl�S��4����j#m��a��\���	�U5ėdYa� 2�Aj�[ݸ�]n/n��~�-�w:$]�<j��<W��HiP�Ō�3�)mܘ%����̃�D�NR꨸�l�yB� X���0X�k���1{ `�ӑ�/���b
?�l�լl�~@
���H��^�M2��u#D�� ���j�r/��sj�sol�y,5wm�xn�h��n����T\{0�y��hn�n�֎���oxɌ�����8#��.IIA�!�,�_��M3�n�y?و+�)��	p��u’e��ܜ��,H��F����X���	�dCU1�A�:�����֞��2vK3 26����[@S"M�'`�{Z$3��3tLYY�@8��"Ĉ7�1��8X���r;m�V'�@i4�a+��)�dJ98�o~G����=R�ǞuP9��!<�L3��[w�W"�4-0Xְ8tk��g�rM�΄�ؠ�Hn0����p��E&������r�O|�X�8M�Ƒ��d�:���R�W��;(p���

�~3�82g�h�%����'�&5SD��qT
�p�bD
k3���
�?ȏ����B��4r>0�و!ʂ�ʊ��dj�W���M9�]ω���|����� B�X�i^׶��,t(�4�|�s��WdԠ���D���{�
/���e�H3���c>-d����g��pBr��}�h੒[V�4~��>@�B\q����3V e]����t���u�
�c��9�xSI������^W2L7�p�������ɣj�+!�%x�gG����!���dMV�c��O>8�K��#�Cyb���ܑ%zpx6���y;u3t��d�@/[�G��Jf8<�ISxNM�!��i�	ߥ&�<�y6�TYhV���%��=J�4�eu$�a�Å$슓f�b�8��$���W�6�N����E�s�ē��u����|3�B��K+j+	!��|d�A����/�͔��L�s!��z���X�|�$�0ԣ�:i��GEf`�н�|��^��Y�%�'�+2����U��^�Ȧ~'�$��Q�?�=�ڵm��Ò����d��I�@24{�ZQi$75BD�Z�2ЮH�2�r�-��'v�4˦�;����!5�4����L�+S
�v�g#ig�Gz3���NJ��d"�!.�0���n0��S2j%��X�v������Bg��]8	�!5�_�L��:�j��)���Ey���~v�5�6���_��~���.Y��]�R	
'r�P���i5��
`FHLK��p³�`n�$c��.[��i�׃�	A=&Ph�%#�Mia��2D�/R(+*o��~9�է����`�HW�ײ���uLB+$����;me(7�	ߊ-��v���΂ �̡"dw�U���j<w��DQ�^%!�fE"L����f��lI�aՋiXM��ڠ�қ�%��
P�Tj���	�m���r��,(�\#���e,eD",S'L[�m΄��jX҂���$��Fy��n�^\ߙ�P�]=���b3K�e���� ��X�@�B�7�^אܧd.#j��]ՒȦ-C�G�|豨�@�(�\�2;83�JDu�T�#�;����-�4��铺EZUكh�k��3r��FI�p�o0N�nI��4�®�qJ��^"ߌK�%Q����J�D!vV`E�^�8�=K�e㩇�i�c=�sb䦑q=҅�9����[9�)���B,�li�6wT`q���a7��l�c�;��v�0paS��P�M��`n�N&z7���7Vu�A�.r�b�,�pH�I��N	B.�5<E���o��l\�ʖ�]�LjE���s=�Q�A".��$bM�8$�eA�~�[f���ܕ.�tv�+պo4�-&i���&�r�N3d4$�����B��{���s��ӕû� ��j����.���vuݷp��{���GK�04L@�2��Hiu:#�!F2 ͜��l�$$�^�"Ɓ!kF)MС����c����'���f��Ze�c䝷(	=�w����-1�o�b�{Q�ӈb��8�yMU�9��{�?V�Z�H'M#u��ifX?�XЄJ,�[T�Ч&A��`�~�$�]�/s]�8+̂Hsm��:���dȺCB�#����~�@i���l�#�g-u��D&��01�2����j�&T�Q�NvF=�T�*�s5N�9'�q��K�U!�
�e�RU�rؕ/���@:$���Л$}�k@��	~]�g_Yj��J�<����ื�Z }+-�d�:�c����3RZt�Y>�LDC˹��~I0�s�D#�8
n-yҧU����Z4�``�,�ّ�sW���cuj�7&�h圲[H��
5�d��#�{������Kڂ��_R7Z�B$I%댳 \�ÞA��`�ufY݁C���E05E�	e����γj�Zׇ}2�
*³fq�.���dW��z��殠���6���#�¬B�,��bm8�9
;�]K�f7}Hs:H
kfG �m����`��D
KT�ᗓ��Ѯ�I�"S���3BT������ʌ�Lj�h��03�猬��^��X�f!~���Q$a�Vu�(�H������N*9���A
���51��Q3i�qL�<
5e����@v�x �i��@G���]��:Ajf#������@D	���pjfQPRP,@�Io9+Y˖��"�{�%�1�`/Sjկ�1xDI˰�r؈��s��T
j�%��[iW��Q6]QG�p�U�KL�43Ua9ْ�+c.-��=
�|���~8�x����b�� �A�
&�8kh�]�]��� ��h�C�8K�Y���D3��Z���&x�sW�d��J�!�*`�ĒjoI�(v��rGEŠm�?waL�>8��fO�Ч�N�4t�3)s�ٌ��7�W��w��,��2�F:<"�1+�&��"������p�9��^��q�O����fY��6�qH�����(J��I4��ݼ��U1�2�ޚ>	�����ز��O�3D�)48=�-`�Q箌i�SQ�|5�x�pR`�<[կo�%����C��7���.�I8Y*�Ȯ���T�j���k��R�ͿB��~�#�9"n}�ZM���?�xa-��,jN����V�6�ל�u�{i�W�	K3k~��|�oL0pK�r")A��@.)�	k����y/��ʐ`i�o%Q�d�=˵� +��O�&VANG-B �.�)t�i���a��[��b!tcM�͢�Z��)Y'��
�2�=s�J�i�l�F:Q�}�Ll�q�D�Xm�Rm����V�l��i+G�*$�(�=ֺ[��0S�(EU.�-Ӏ��n\��[=�+d�79c��2
��qE�*+zl�$ mS���BA�J�*/�L��P�U�&�t��
W�<b��L�]+uw���^���e
b�(��I�/�l&��jՄ���
��6��z��:&�
��	H"�Ԕ����s{zď���������FA�>��m���X��	��C�_�+p�d�Z�!]��6+zq����Ӯ/��.|D�U�)e��+���e.g�/�� ���m5v�L�^�rT�i�w��)�<�CQs�-�
5:�[�f�a��8w�L!'ԒM��ZK��[�A!U%�[�d�:�]!o|l�nW�d�u>b�\�9���mfJ�Z���Y4H˝pBM��ĭs�[� `����4��ʔ@z��k)�f_Z��O����53	?m>�?q1��n�J�V�}��IQ�����	�6�h&ã�C�OZ_�	�P�ǒ}�HSoM�a��1R�C�|D��ڵ3��,�І��Ha����m&#��K#tQ:��JBw�I�b���ڥ3�Z�`|����m�2�����V��?l���le݃B��:�Al�&D��́D�.�aG��2���[��@k��c�Z^���߀/FHL	��`��Q��a�G�[wB>q�<�0L׽vF��|p(��.�-�(H,dߢ�3��Óx��[Sd�]�=�1�`��8
���E���V;�?n�M�DY4_�:(���]9�I˗��p���w�j�6xҬ�o�C3�<�p�vQ�kgdS�������ZfM)6%�%�I��l,ێ�X�]>S(���ǩ̑F�#6��=���C)5i�0E��,�5��iDZe��(@rh��"-�R��u����	v�Cc�'2�c�k���8P���c��C�)c�ة����3b
+����rڢ9ʵ�g
i��d�L3ѩ
I�\���W������f�j����C��s/�t;U��kҟ���Q�C�h�BQ���`bH���/]��&�c����+���JxXo�=+Вb��:�Pyb)ts��|���n��tg���i�$��+��⻓wC�F�|%���Uf�\��&��� �U)y	�۪�F�#D���\��L>{���D�˵�i�
�YH�xpGb��0h�wx_�Hs�w���+��{���Z��Of:Z\����
�
�k��%u�|&"�ņ��A���4����"��bK2��8�`϶6�E������B7=�hW���XY�A�j�0ř�����m)��=,/[*G�/�k�јZw���!�;��5��ٚI*�!J3��'u��3�(7�v)M��4)ߪp��h{_m��2}y�J�
K�=w$�(��k�v1M�l�د�I�ح����b���H��m����lT
�*e@%��K"�ƀH8iMtg�|����3sy�`�"�=z�+�{��Ճv����aEhg �2%�U��]�Q�m�hD(��u�]N���Cn�w�H\"�'$v�,�jvl�9����`h<�_l��Kj��i�۰L�����L�o���W�
��5���}����q횚Fȥ�2�~\nʲt3MA^0B��5�z!:�=���u�ꯘ���І���Ĉ������FO���IYi-��p*G��]S�<Ж�J��s]
te�S	��N��w��(!�&E����7���Q����Y>H�?�K`��Q�@���0�L[+��	�]SS��e1��?f��E�m����"i���aݛ��j�H�;�[�q����)e�q�(n�pF�`�\a�0@�G�{�]Us���k	c��/�"��٪I�e2�}F!����}2Ľ�ր�,���_�8��G���5�d��e"���V��M�vޜ&�7X�f1��5`��Ͽ�ȵ���fkz�Q���@E��&�ә��Ě�dP��9�Dm!'��`b����a���v]��Î�"����IQ��Ç�ha>
R�>A؍vIM��֫��+<ˮ-��*�� �Ð%�F��b��x�Bw����&�1g��Xr	ZZ!Vp��x�݆�"���5�S|�pK�uϐ\���6�|@k��	+7�t-�p~�h{s
5��G[��7�8_f�[��������~��
�ȓ&���}vl|p�y����<���2��4�r5Sq��#�am�dmG�%�7uK�X�lZl5�3�����!v�~�vg[�=e�
pcm5v��
�vyMU�s����Qh<�=b��3L�2=Ѐ<��RI.@�A�^��&�I'Rg�om� �f�
�p�'����ɲ�S	g}#ᬲ�Y^��&-وjrfj�eF�d�K
m�t��
lVE��S�y��MԮ��TN�.ܣg��Q4+14|��Jcd�c);��F���أ�tI3eȌJ`�d�þ�&���5g�9"+���;<�v��uf���n4�����$�Guvh_3�#R�H6-پ�G��k�۠X��Lj�5"O@�,�cն^�����H�
�X.�D����p74�F�OMM�0�<�ٹ�GR��l-Ʊ[h��fqv�Ma��:��D:,L�]C�(�2:LBU"C
���@x�BI�Kn��قZՉ%y�V���1���gA�����ATͳ��jw��U��Dl'��[^���k�&X����X� ਛ�ە7�G�'����԰���&�~�5�|�	��&#���xFC��V� _�no���^;���A��v����8�dt��X�qO��|�4@�v���K�:l�Q��sj2���AT�����ļ��d%�t�5&Η���넧U�8}�]��6;������~�!�qY"r�Y��8�_����˅e�Ԧ8�d��6��l<�=ή�6W���E��������|��x��K������Q�q튛�v8m
d?Vö�Q��_�A�v�^�)�L���|���5K[M!h_8�_Y�B���uQ�2�.�m�W�$h��&۝�۔���y���5�LJ���������ݫo��S�`oşk�捞b
V�ԕJ1d��1v$�t�K��X�b���� Y+d�S=LQ1Ҁ��u) ��b��@It��/8�`�
�(�b�h���`� 5m��vz�J��lm�d�������8�8�
�مݪE�r��¶p��]���6j$�İCUD�>yg۳!V���|���Z�8̈́[uM,חhO�a��|D�k�r���DBC�Hd�W�tQ��.X����7��U��f3x
��F��i����p�M�̊��@B��a��q0����EZ��M��yN�8�@X��Jܧ��A5�2E�Cq��!��ȠJ�n����V�Q0${��(�Iץy�Z�wC<.lʚ��E�fe	�C����/l�']�Ѳ>q
\��D��J:��
1�f��$�EGDo�x&�G�c�9�7Y��m����2M'��to�E}���=	F�+i����DE3�v��o��1r�o�����Ն"��}E:�q��9�}����U֧�]�����ݢX�ú�*�����#��E�h_���m�T�(�>�>���k@����ܜ�̓P�I���<*0����59���F�:�,�5a��^{����¡l�%Y��W�ֈ��|�鎆�K�6���@��h��f�3�?�]c��aZH�����59��n2�
������p"�)�Y�+:���)�C��_�C�v@#n�\
����h|�����{��-
�����+[%�ʜ*UL1}�Ç9��2�ˤ�ȗzıþ[��;#;��6���`��5%ƙi�Q�O&�@��5!��WU�}��.��x:+B���^�e6j�:_�r�_�H�R�~!��³i��B���cI��:x�jKK.�w=CUz��b`E�=&4D�g����5'�
�M������۶� �;���|!t�-�k�v�]�S�c�
�4@+}�NAf7��lT'�B��aLc��"��,�.��vW�u�IM��yc],Xr�AtE�n�W7
���0�vu�T�e�ƨ�JV#~�NV{�?�I��r� j�C��p�z�6tq4������ ;��0�^0�����3;�f{��`��6����*�!42~��Xs�|����iF�
�G��+u��3��hH��~�Y��
�9��Wqg����f��v�N��4ֺ��hY���	^�5�+c1��dW���m�T�H��Lc�}�d	6��6u�
O�y;,b�h��H�i;���w�i[@�U�0�8P:�4��G�VZF	Yd�-�`��Ķ+u��e�H�"��/%�K���L�$=)x~�z����Q��v�N��b����Q%_)�;kI(2�Z�~��iI�]ޗ� ^b:dڋ�Ku�Gj��t�ݫ*�ΧgF�a]!�q�	^��7t��b`�K�r���uR@���b�A�#�����v�
�0ұ�`+A��L0!m��t%�I'�Q�p2z�h��kn�EV�aqI��ɾ�Ԫ�V��v�e3W(^
W�jaT�����Hݗ������]V�H�q�fv��b�(�t����J���[H�8��!
J��z=���ĝ��v�N�u����g��t���/Y f��D����}a���G���+�]����	��F�8i������c�eA0}�\N4ǥF�(���w�!��4�Ym�i����1_��;3B�9�z��g}�.���L�����_6�9`I���q%>�HO�\���p���{Ne˄1�JJ�z��T^Uj�!|�B��ŧ
_�f�#^a�G�����ˁߧ�s�<a�glk��ɠ�
[�O�m`,[���o�~�G+Bl��q��O�bp��ܧ�Q�]9�	G��M���je��2M����vI���%r��X����)�S���TͶ+ٖc����2<�a5���u��
�l�b�OiBq��k��j�t_�e���0H2�؂���	��1'�B>c���塹���@Z�ɭ�C!�՜bv�^?���|��g?�ՙS=m��n�qꖈ�1�� ��"z���4��L&B�Kd+�f�a�X�����t�*��y"m�©~���o���d�jvv7�5��"[�jY��G���4v_`gԃ�����#|�[�$���{Os(ֆ�x��m��nH�+�6
��y#C�) �R�Ѹ�����V�K���=$իK�&����'�ڋ�w�6}�滈'�cw�>�bJ�9�DO7��UL�c��C�^�Ѱ��2���Y ��>>7=O��
�}=�'Q�.�¢7����kL}�+��I���D��)�V��3Zo8����L��ն+y�<�T��-7��PHO0/88���\U_������*��t��)��
wX�X�A��(R��s���i=d4�<�A��:Q4.v��<��C'�9[j}�by���׫�]i�thٽ�xd�%�#��w�Iā@'���/V�s��j\#��C��e@�ƍ� ��9�ׅ�]�QU��g󸋋��}59K�=���;�H-5�.'GӸrOi��B��n��-\��}a��C��?P��{�FO&A��]��MH�a�S� G�^���d��Z1B}OΙm��Ө{�6��
�Fԙ�n�.�c�5�7�	H�a���Xti���ڃ�~��۷�~x�۫�o�PKE��Tm��4�"pip/_vendor/chardet/euctwprober.py�T]o�J}�W��H��VWjoT�Rt�6��{��w��:���{��Ц ��'{fΙ�3�i6/?�<��4Ńi2��x�KWb��&�[��������L�Qi~H�D��
e�u�Б�^"�_X�[2����w��1LeYi�	/�v��;c� ���{fYx�i]��L%l���H��Ԋ����3(.�w)R�!�т����F{+ו7����B4�;ͥ�XY�-�BO�м�[���C%�V�:�TXfr��(�jSQ&4YΥ;�COB���4�,�`�t�vB՞m�N>N�4f�J�5[t3��Jf�e��1	G�`s۳R�PHr,���{u�%�!�[}�Nَ�2�Z‡�1�]�QtM
Ӱ'd���Ns�zO���x!}�њ�r\T����(�6[�M��)Z,�i�|�X(
/�w`��NI�++��Q8&�E�
��?���P�p�NIB�ق"�G�t/�т���|��D	�I� �%��$.@Y(��R�C���C�*��xa�9c��"�_dW��*�7�~9zO� m|�^���`���.X���`�n���!H��
#H��Ce��P�8B'�w{���ާ��2���C���<"�F����n��m!²a��/,����G�;Q;܈#���8�u+E���O�x�I�gr�!�:$s�w֬!�1~R)/���ބ�|�=c�++j�LV���`�h42%�;���e6�\�FA����Y�Z�Uq���U8?�v���>�ylx�b�^h��{iﰿ
�A���u��'���ƽ��Z}���Qו%��˲����M�n�Q(�7��\��B�
}�	PKE��T0��$q'�P!pip/_vendor/chardet/gb2312freq.py���n^G���	���yا.��K��e{$
ύAKT�hIt�t�O?�Rj7Pn��2���bŊ��O~�����??��|����>{\��滯�w�/�����u����7�ޔ�n_^������y��*��}�뻛W�w�ś��w�E�����O��<���?]����/�w�Uy��g�o��_\�r��{s��>��r{�/yp���n���������{�������Y��ϫ^?�O�����<�߽����͛�k����뻿]��3������Ͽf����O�K)�����͛��ݼ-����<ܖ��?��}�a�Y�77?�]ݽg�^�]_���W��X��Z^\�+w�/o�������?����/o^��O��{��0�뻷�����P����H˟��]�e6������������}���ݿ�m��f �>�|}�ǻ�,�7��w���>)��m�xY�ן^=0���/�Y����n�}���]��f��ܼ󱯳��!�D��*?_�_�_���2Oȵ�_�<���~x^}�c��GO�>����̵Y�|���O�y�KL�eɬ��=���<~��?�G_>������O���ٳ�wOˣ�ϟ|��7����x��w�Qʳ��K�b��"����#��f%_^?\ݼ��S�1�{��yY^_��:��&U��"������7���|s�o��r󪼻}�,������aw���2F��˲�\t��_�d��o^��_�����,_��?p�_�ޥպ|^�RK��Y��_�W���&�|r�����k˲�?���k���{��ey������p��������?+����my��۾u�����WY��O~�|P�6>|p�Ԟ�2��>X�|�G������p���:>Z3��%.���վ�����?�_���8w���7��5��Ӿ�k%�}���O_z�K �w�z�3����Uͱݾ���?�Oo}���!q��zzq1w��?~��G��'Ϟ?}��ϟ|��OO������G_~�gO��c��o�����?坯>^O{����~������wO��i.��n{�,�8/����m\���c��k_��^�}��ƖK�3���֘��.{��Z[�ˋ<!lyB[�㲌=��su9ss�[���r9�m��gni�埱_��X�|~:�~���
.˱���eH�ܹf?.׭y_�t�[Ɵ7�X^���'�;�˚a_��e&c9//J\�'{>�ǞI-yi��-��Q�e�p.k��Y뒧�5��l#��2��a�2���Gfێ-�\�5�j�e>ζ�1�������fH{^ܷL�X�)ü�zeYF;X��',�޳�Knn�8WV��L�gN�gN}9s����3sȦ���˺y��s��3�u�Oee�yt;[ޙ��},
����1[�5{�d�+��w^d�k.�SGÀ������.o�c�^�w��1�R�^=?f:���:��k6vo�3rs�}M���,6XLF�y�X�{6/;�Sc!+��B�ˋ�d�1���c?�	L��3�[c�q�<���V:7��y5k��1���A�ܗ[��
,�@�;�k�o^u9��l0��e�	4��,R�*k��<F�ͣ뒝)۳axy3��>8f.�^ðY��R�͛b�ٔ�����zm'���x�e�g~�[�5�|��$�����6��p��6�'���Lesp��8�#��
�)��u+�ɳV�a���b����ag���_�o�vcS�XG,S��;��g
d���l�U\6�0o9��x@ƿ�R|�p>�RՕ�[x�~��y�ȢeS�|#T܅,P�ـ��^�&��u�!��qmC���uh�Q,;�'�[�Q�rޔ��F.,���K�3��Of4��
�-X��,���2�
��wF�^�bZ0��;�e�BfŊ|>@v�6�p[��QY]v���c���~����}��#��+H�	���X�F}9᮳L�ciy`<�`�{2�c*9x���wa_}4Ì[��������Ӫgv!�V	R�ۨ��x�2g��Hyje�7�4fa�q�pbi�y7�`��]7�ı��f�U7+�;�q��6�̏�'~�T�k�y�X�kל�T�g`x�D`���L��C�����>�`�kaSF����و^��9؏=;8�l;���lKV�g3�R���M`���&Dž:�޵���(��zlgp��+SquA��u�y}!��m;gn)�9V��e`:	m
l�7��V�!��-@�K�,攵ހ�Λ�G�d#�s�BE��n+��]���}��_1e6���$���9!/�UP_�v����C��7�p����K�Ɯ�+�D�j؜r3~�$�q�pb��z�Bg�@l�`��
�pD�3�]%=�p�}UBm�Me��<�!���(�c,e���,��
��bD�TL�"�h4$	xp=7��<dm����y��7��� \#_$�		�`��$�mz5&~�숅�!�r�3�g`@�O/��D
��8=�M�i��I�!�4�h��jY�1�J�FlL��ͨG�
�
��I@���a�}��%�x�mݼ��XV#��e���5�V�2���T0,N'�żD��A�br11�-�(̶�a���� c4�t
�qM<\�o�1o��F`�cF��.��:��y7vYJ�'�ͪl:�q�
:zh�vX!|�xB�X�ʼn�T˳� ��ō'tB+n[Y���Oc���K�v�$L����N��.:c��?�sn�߲���9e1���T���aֱKY�	�ޘ|�-�2�M�V>tQX�E���¼k����P�ʂd�@�,
�=h�A
T��kb��)+����
�ۃ;.x�`�.،�lJ1\�l�h҅,�E���}�0��^̚�}�f� $��ΰx*�܀�FBP�0\��]uO��I�Z�F�7��D;���f����Aa�H;��
>:�L(�O��n��X	R�ʼa����dhm�N;+ۮl��J�#P. D�"d��Q��x]�H\�Q�B�-\n��xY���l���朝!�cc�r����F����|��n�w���k$0q�*��Ҍ;�w��*���7���-e��.�3tt��t1Gg�ȟ0	�Y6�dF8`rA��!?�p��+?�Y�[��N8�4ȋ7�q��N�V��x��LU����l�ss�FB�ģ0Vv��Y�x0&T��+7����D"km�����&XB��Z�dܝ��'�$&��iI6p�_��7s��U�v�}6���[�pز���"�+ԁLK�w"4t��>��PW^��L��)Y�.�vSYZ�y�^�h�Q�|y�\�w��;�x ���ӣǬ������
k��v����td"0��"e�䒃\�M��>�r�
�re��V^L�WNC�cq�,��A��9h�k�(	�\�$����0w��'ƈ'6\Au�||#�!�8� �}�P�aYV����a�/J/G7�E�RρŐx�����6�Nx!>U(>��/��� ��|H���F>�;����J4&$�++�gH��q������G�n�V�Eֹ�a;���H�
IA�	7�"�L�?dU����@H�X��D������rҚkH4��f�V��.F$@t��2���JLD�*��&�0R!d��¼�P�=�����Zb
]�	��ċ�4s&+&���(l��"yX^v�˕#׃��(?;n�,Ţ%^>z��@#�qo2�E�G���I�XUp����M�J�04iF<e�
gZ�p0ۍX$�?�lz���th�h��ljL0 m����Ꞓ <@a�if53G�W�����E�9��\� �)֮պhs��CDQS^ܥ)�N�a�wֵM�"��]��T:b
Q�:q6��W�mxӱ�N��'�.%��
�G�4����oS�C�[�(W`�x���-&�1V�7�����rH�*(X��{@�8,H70��y�n3SC���Ȏ�#<t��G�~J�H���9tNl0ѩ���u{�=�4H�XA��P�F��fb���ߞ�<�M�����M
_��T�_���ͭĢa� 5Ь+�9�~�;*WFh������]�ou�g�a$St���T~��>�A����U������I��5�Vҩd�����I.$^�o$ҙ���6*e�F�P�Fo���P�h<�J�BA�"��Bʢ6͆����)�.ϯMvє�x*˦t�Z�K�žOW	gC�/@I��6��)�@(O$P�-Rp8};V�)��!y��^�qY�%gX*2SF(~�ZU���Q�����/F�}��ަlcY����r%��~#�k���}jA��ut�
�)�������{X�,M,��ODvh~������:Cf`c�����4tk�f�(tK��ա�e��%U$p'�7L����1Ն�f�
�3B*��p����c:z����aG���8Z
��w#����ď1�{��e0Nu.���1�A
����0߮j�HY�"�p�'U�YS�Si"��p=4w�ĂٔM�&=X	6�i�t80��{�6
lHU�0q��IV���AKU�����q��!��l��ߒނ��,�0J�&`gR���IeԀ�=�	����_�6JBc4;���j��!V(�/Nns�e)ڄ6Ah�Vm�b��0�2��>��#Pv8݀0wt�.ymvϨ�*8��6"DS��Mp�+�NH�O�@	s�j(��
��hO��T���5�%�"5�ŔV�s��%y�\5ئH��h��DB���o�(B��]��Ij�L�mS����#,$_V�q8�)�]���f>�;�^�+AڲjJ}&��f?TEV�FM��Jp#8���<�u��i�J!�b ����n�)c�IE׌C��
�ʈ��?�V���[�b�V+�l�`Y
y�j�W����V�gum?,���X��N�Sv�J��3�/�lS�8��6G�%,&d�c��P��]~8STnQ�C`
Ρ��_H�GyZ��eE��h�G_F!��&�T�h���i�G~���Bq�D��"g!��V|NI��e��4gb��S��kM���V%&�?�����Oc�fj*n��HH��Z1d�(�"v3�P8X-0u�V.�1��b��MԲ�UP����&��F���HOE���ϋ&X�O��R��(�&�*�y^�1ڊkTR���\裈c��P�f�c�Q�����4����9а,��
B�Il`DNy %L03�j�����v��U�wC�-x�~���R��S�r�@;�:`�Lkq�&ۘ���ɯ9��/���)
�3B�?���a�OtDvS�E����B$2~Zf��wɟ�xݡƈ���ջ�l{d�� ���G�뚑��(�`g!}3%���G���Z�n�84g�<˧�B�d(dI�~�ք`?��e�I�j���C�]s�^��Y��Vul���NI�C^�R
�@EH�\U�M��gx���X6�2�Y��]&���h�[8����fR-D���aE�B�^�2��+gwZ�j���3����Ւ���M��A�2�Zm>B9�쬧X�ǡ��զp�f��٘%cw����lK ���gg3;�*rWr<�*X��%�1�����K�$�D�a;��/�\�d`�!�L���6��w*&���Ǒ�Z�;�����iˡ���)�f
T=8)�ɦ�*80J�I�4O�[�-�s!�ZmA�d�}�j���$�dW�2��Dq��!D�wS�g㈖�xv<��`�/�ߦ�!�u�m2t��M~�ګ�C�/�3�O9��GV���h�y)Y���P^��>��h7�,��10��B�����̍��	1�.7���AJ$�i�eU�q�>�<$qQ5��ѝh�t߭4T5�q[�g�N�V��n)|;�t��J��P���R)�m51A(�CO�]�y���5�i�l�A��n�J)�Z�+P)�5�ĕ~�a��
F��)��[>��~,j����E`��ެȘ�	��4?Tb�C�;ȟV�I4�m��;��n�g��R?�����1��̈ͤ��W�V{��M�C�go���V$a�4o7�1�P�ʪ���tmSϵ26�>6`��æ��]���Eq���M�#Y����6U��H6��
��.H5+���b��E��Q�E<!��c6!J\�&�0�z֌��1hC�R�qM��b"�8�G����;,�B@��dA�[ǔ��5�3/�iqL:����es�ai�4��,!����z�5�]�C��C%cp�>4#�i����ַ�I/�]�Z�=�
H&5��ͨe��Ȧ,AAO������Z�����t�u�z��?+��}2��m��%``x�m(�Oe�(j���U�h����-�**������a��~M�Br�.i���D�CuU�!��^l�3�b���4F"Pn��qA7�Q�Y�a��?u�g�5���M͝z6e�D�y��]jQ��)������z�P��f��ŀ��Bh�=pvH��HeUn�8�{2L+D�Y�j���H:��;����C�D¢͊�Lm�N�+����p�R�A>�U�a�;����|�+BA�н(oȶ����'qح}�pp?2�qZ���7;h���EY���l���X��z
[mmI��fX��$4ij�M�7��fQM
�"5'�H�a�e�cS�C9���Ť�8LN�N=�*�qph��M�F�e�De�;Tz�s<-K�rö[C�E{�YîE�wB�h�mQ�&����/}��ɪ�� ��[�9'�Rj�è_���}F��~�n�5�;ػͼ�
:�E����Z8m�bL[�5�hUCf2�H�b
Biї��b4�}�V�T�VmC�A����X(�,��������g��h�!3�=�!陇�Hd}E5�zoi����UQ	�G~XUT��@���
a�큸#ձ[�Z�A�2�4Ԕ%�Ͱ���u�P�yY����q{�\M��YtDL�P�'6
4�y�L�lXXf �b���.[-ͩY�,��ឿ�U�Ϯ��s.�.��/XR�����Q��� ##����Y�b��j0�vz��6lc;
���6�)��v�RC��.��\B�HhM�2t؂I�>mU�T�b�fA�Q��4��v2Q�rM�[��X��~ըvԧf��,V����s��̜��bbm�\�gBA	j�6{�
!mWk��jR.4��Ox?�J�5_47�j�i��mL��u�E9g���ΓaR]�'���_���p�6c��y5́���DB��A'{�Y�t��
�a�D���ʫ�,�VP��E���6v(�P�U�S2۾�|)B�	ɩt���,*l�&��@~(�3[#VK���hh��ƒ�������"�i3q���~1��A��C�����
��lSh�z���bl{��Ɉw�ݒq}�z�P��9�2�E!����ө��u+���
��j�qhl���[�n	ݺ��)�c���;��>�� ���넩�]�M� �5KT�c�p���B��-����E��;���2O$:�S��&�boʘ�5�H���c̰9���f9ɷ�-�
���=u
�Z1��

;xO�3[���p,��{��~�k\(���4�|��%�`�Da*�ap��Fp�I�N`�
J��d���.�?�:��^�Ep���a7�%I��V�xU��1�FTtx�<!"Q�S·��(P���4��#8�+?��$(q�F�S��{8N�ǦSO��]!�ӣ�_��#m��Wf�X�,3$��8e
�u�࠽���e= �61�C�Ey̴Ҥ^�{�ʶXs%�;D�nK�����?H�u����x�Awl�]AK#p!P�.�!�b�Z�㔬�i��:HI�hv�x����-�L�4eu���JW
,
��>Xʆ��B��n�CL+l�6ӑ������Ǵʋ�2b6�H�LP�����īC���Fmf�ŏЄ�VM`�mT5.j�~��#�fU�\�Ѩ�l���K����	�i!�2�"��g�O����)�pMҐ�}�l����f����E�
*d�L�&"[	
;,�s�47[ܱ"e!l���.��3��m	X_C"*�ž�\[l��vN'�	0�+�vwAc�+�V<�e�Un�T����t%��c
�j���[<��fi7�]zT|*%���l2��:-8L�6��H�q#��FO�D#H��c�����Qj�ͬdz�"�S��wZ�IyQ^��I��ڊb�X<�ȉBfaG����i�1�]�z����
8���gW�M��z'��b[�W
֪��(��SH�oG��F.^���ǩ.�]=	��4ѱ�|�:;�=VHܷ�����8eg{��f�KPi����܄f�g�Q�K�}YR���n)���r5Ek��?K��1�i]dž�FOms�G!<�aw�F���Ru�����$��Khͪ����<&�ۖBHΤ�)�<��G�Y�w�Gq�C �𼰯I"lZ�n�&��H�y�˲�8J�F=Q�"����i$������!�Ԩ��zL�6e2��n�CI�~a����]U�yf^�ؖ/�k��=8e�KY�=��X�� wLfeϒ� ������i?Z5C����4�n<;�<}e��k����fEv��=�nC<G�Y�;]�!��y�ž��yT�YN�R5F ����Y74) `��Y�$a��᡽I�=!@��TZ���ҵj�)��4���1��ϣ�6���?;�F��n8^c�J~�v)�*����:\UQ�1�z�2W@O�+OXϯ9 Y9�j����D��J#*᧧�<bB�z��6NT�L4�
4y�kCȪ���rx�^�
2V6O��"`�v�ӴR9�^lm���%=���Oe����"�,��6��}Az�b�f�fߟ�K	�N�����G�Q�n�Z�u�l,�TDE����7L��H��[�{>�*X�]��tJ��:�/�]��
C�&��]ezՃd@�!���̓���#�h>�/ѧ��,�+#��G���p�p�����6�����ʕ�U8Os�&_d۞>�l����m�p�h��jk ��Ѧ�`�Hj2;
��~����E4+�c6�?�冩RI��M)�,�*�����x�.�5`۹�a����Z����>sc���K�y=�"�̯�P��Ey0�$s1�ّ@��R��Ѱ�3�$_u%�Ҵ�c�UX���_O~�j=�i˶=���1�s�j��_(LVK�V_�g=�TJB#=!>{Yp�r[6�CR���6}���V�&�%��N�z�xP�s�	�Oƌa��z��b	l��Q�RZ���گ����q�\ħݎR�Y�\��ЃjX$�c'p�/��X��O�ϱ�"&�����8x�6��̓	���sXx�Uq�R�VRj�O̤)������6-V��
O-w�PrF�5/y�<8���ZBC���N
8T@�b��ZK���}DcO4�$�_���/<���Ӽ�t�z
~�z�xU��)5��Dc��.=�q��\�M3��D�R����xZ�<9�q�<v��xD�l�r�����*'uA
;塙��\��@9��A�C� ��Eτ5)�F�� ����0�I����K��݌
��K��1e�j���Ck#�N}�gUI����6.:[:O+�O� �"v0Z���k���~���8.�,�6���ݜ�����:�>��̖Ɯ�-Oe~��!���&��/ˁV+�!��v��G(v���S��ߕ�IJ0~��C�vv�y4hDU+�y�R��j�inNX�)�����M~��췴�?P5;줵�J��h?u{�0�ٳ��6��6b�Ff�7��7W�T�/>��/�zw�PKE��T�`�3�#pip/_vendor/chardet/gb2312prober.py�TMo�H��+J�Æ�V��h�5d��%���iw[��D�_?����Y�dW�{U��\�����ɜ��x4OF4�.���v�M���ʽ�BQl2&�0ߥR�o�R��s�DK/��ϬLɖLN�
���]*J��(*-S����4��bZ{�����v����T���F���Nܥ��O��jx�"�hb�ر}���Il��rWyc;��',D3a��R���} T��Z�`t�?�Qrg���J�e&gr����6�B��L�=��$t����&�yL���N�ڳ-�Y�����P)=�f�n��N��LY;&�6w�(5�$M!46�?�{O,����:X�?8gk{d,u��c�evQtM
Ӱgd���N3��H{��x!}�ю�r�W������b��h�D_��*�������NL�(�1��B���`6Z�_�����d��O��Q��x�����j=�7�hE��j�HF}���,q�ȯ�,����ܩ�'�ס@��A<3Ɯ��F��/R�k���_@.�ޓ�Iߣ+�;ؾ_���|{X��ߣ������2�Xc{44·�Y���`p�a��v@�I`y���?�v��[SP?=��a�0��=�>�~�D8�Ñh��1��y�[!҃�|��GO<������ͱ/��A�&~V)/���ބ���`�+�Y�6�mg��Ѵ�j�J8��O��u>\�GNۭ���n;�U����*\�N����^\�lZޢ��W��)�
�g��"h�|��ߦ�8�ƣ�/h�j}��U��V���vf�WV��)��{J�}%����Ч��PKE��T���_6#pip/_vendor/chardet/hebrewprober.py�[mo����_��?XB%��5�5��*;r"�-�� �"Wk��qI���33��R��ܡ���lrwv��Y��G��ޏ'�r|>�܍���/j�ڣ�#u���:��q$�<������'I�>���
ބ� 7�P�.tXd�
�tp�(�Ӹ���~�I�ҹ�f�h!�����b��I��ӛ,/�,5*�uP�HM7L`�r�kP[m@yQ��yW�:9y
��j�$��u��Οt$��gi����tL�
�v��&N�y�T}�W���ͦXd�
J�i���,�Z�lV���Oj��*R��(6Br*H�?e9�/�(�m�Q�F��.t�4Ne�'ե6�T�ש�!�M9M��/�P�F���=3�ZS�ȝeD]d �JR:�{:���'���ԝf)�l�	
��[��.�ި����A�
jI#�Lv����k8��jU=+�(`��4��p��^
'�է���pr��'�����J�r�� �� -6`�F���cx6��&�/���ݝ���UCu3����ު���7�w�<Nk�bRf��+�@r�A�p� N����5`0��"x�0s�#�
��o�a��s�[j����J����y߁��XTj����ᠧ^�bQ�>&0��_�3��H�,侀���j��'�NOO��?��*��O������w�����Y�-�f�U�M!=�G!t��w���v�NK8�]@o�t~W����YQ�Mz�
�2H�
)=����C�g:/��&\���Ը ��B'�5,-�*���l�AOs���ԉ]fH'���Hfk�K��2��*�����]e�~F�Pp�vJ6���?��[��C������z�Q�6��W�_ӂ�l��5���}�s���M+~�yk�0�g|��<��ȭ���;���$�>� G�ia��1��.�H}ۜP�*�2�l�]iA�'3��ϧs�C�`�;f�|ڈ�Y�j�9���R�S@��"ŜB��Ǔ����.(}�l��26!iJ��\"�z��HYn���oV:�g�Q���84,�w�����1�y%��v�3!1��|�WN%���q�
�jEp
���Z���V$�VC�'�@\*������ϖ@��� h�,
u�ꨇ$� fJ*�_��jW`�&�p�l�J)��J`c���"'��T�Y$k�P�S���(�Wu��VA��aRFtΌ��}խ�I�-�n�Tj�b��Ȑ�9� ?��H;1b[2ӡ����+���Fd�j�̹'�Qߩ4J�lzM%��"�$�.��@��ߍ�
%H�L�XX�j��������`m��rfM�-�IvK��Ɍ�4�xK�E9��a�/Q��#؊`�!܌F6��Kn�F�G�^��8�}I$�5Π}�8�_�Jx�BXbq'|U_֋,���1U�1
��mB����/������� �㭼J�:��#v���S(]T&��Q:' &:�ڟDO��Ε���d���zmn1;�M�{}m���s@:�#/�Ș���XCl��4+`�x�ٖ�� �*	6�ͬ��������]:e$�؏��~B�E�6u��6��g�F�X
�eF���@���l�����n/rn=����Z�D�
|�������
q�4�'ǖy@
[�YN3��*W���j�i���ቕ ��(��R=�(s�����d�h�o���E}�)�?8���IDN�ҏի׋��$��+��ܳ*s([�掄j(SAy��;�5)D��r3L�\Y8K�_HI����Ծ�d���)��e��t�R{��b�hʩE8
�A�s`4���S�B$�ru���inc:��@���wős{��/\)��"��B� &˷��
aj���k�7ؚ�Ծy�	mΚ�Q��פ5:�����V�) @�4�U�����`���:�O�F���P �%-]�ރb�U�K�i!�g3j9Ț�3���E,Aȟj�4+�ȡzzV��6)SD5���;k�9Z��g��<�P,�0C����(���y�_˘Q9�&$�:~�‰w��\	u[��X�޶م)1)]��1�R)\��(��$��!��"xO$M�H���<F�b���W=Cs��W!�� 7e�E�Nlw���>[%��gQR�"�T����|[�RhK_"-?M2Aۢi�W�,���%�`�r�JT4U	���û����R�BAt'%HK���2^r�N7��?rP�*e�ǨXQ�%Z�
����$I�ۜ�J$U�9��s��+6���-28����4Z�.�w�W:/��)N)�]�ߎ� �-ڄ����	H�j2;���FI�Lj������j[Hr	�k�^�e�X�l��6yBMYš]�"�*��~6�2��\��|�͹�Vd�f��2��+i���PecX!��7�TҬ�K�f��FRuG�R�f�O�"�I�����0���l�L9�S��|�#�m�n"�}p� 6���Q[l\�W�!�2)��2v�tģ5-�U�D��!z���
�?������
��,���<�M�I�b�z�DYL+nj
 k�[`ϒ���
�E�;2����ᄢH�R�|Z���{?|�$�6��&>��P�+����jM�
Ђ���t�U���C3j,��HL9��4��
Qz;��Q��T�U�GW�ڐ�w�޳4���J����n*c+�$Q�JK�0�{V�����H!�G�(�
=u��Sh�E�t�5|@?888Ѵ��ĝFV�9 �s��R5��L�"Xy��x2�|�ex�ު��ѐN�o���g�ҫѕ<|�/�������yx�/uO/N��7#y����=����n�F����z�r`5r��Df{���Ck̋ļބh`�[��FG��T��s��!;RG�ӈ�d	�Ƕ���-I�1	�#�Ɠ�������~89'�_[q��MS/f_f������Y�TX���#�0:�}z����Ӽ��|wY#�^�g��Z(:�n��sCC�NwP��֯(1?�(�l	z��UT����<��x��7S�L�_X�X�y�u�e�%�`]@�JK�`[E����w+�^YcB���#�D6��4�����R���kK�������q�dlKe@O,:�2/���˘"�6:S
�M����Y���P�hE�=Kot]�i��N�Y]j��:\֪�m�SMw詆�wL��<��p���5k��[�B�T�r*$#|��V'T壷�*��w({�݌���\_���$�ҽˆ�J7��M�	j�e�Y��Oޑ�'�<E�Y�G�8��"+tq�:t���4��UHV�ي�ìp��t�4��K�*�Nf��sqp�E������F��u�P���2��J&`�N�m��&D��m�d5%��h�Vy��j�n4G�/���7(:v*�s�|���9�AS
a�j��q�E��M�:�ct��ru̇_�S$��c��^�[4��9���{�V�q���]D��n@�fMj�S=��cL-3��6��_e��h��MHK�\1i<���e�_K� �7h�K��������񀢮��f��L�Ȇ�tS�8e#���������o[�
�{�/mY7��X���Ž0�u����t]�Ͳ$�Y&9��2\��QG�D�]5�/38H�V�9F����u�~��'���kg�qD�и��,�$�@���!��qe�
�O}|����7ɸc�ɗ͡nX(��A��ԕ^�ԤL{6�8���W5�U6�V�X�}�eh�j�ZiK���QwV&n��2�����%6 δ�	a�&��2�7б&�������G?|���y�����US[+�N�;XHr��Or��"Ԇ�@LJ�
�{�0,�.r�G|3ֈw'�;X[��*�� ��4T.��ua�h���<r�L6��5>/p�oGQ�]�x?]��#�QC�ކ+�����P���}��zT?A3e�-���=��i���k7�y'�r���rTS��t�nWx�H�9�/���x��Gc?�I6��jxcK��Lʊ����۷���Pl�Q���+'�H[㖀Fk��X� �9d�+NKϭ��Ė#k]AfFEg4�~�wY�l:U٫7��’�ƽm
��[n��*{Qͷ���wi8��hg��i�!�Þc�N�/�~՜рۢ\9f���{ȹ�Ĭ��q<6�!�mgR(sPtP~��_�!���_��o�����}#�R�F��Ƿ�u/�ƚ�f����j�`��~���{$l��;���6G���\*gls�N+/�����ۺ�|���=^�C��=����1�K�T���oTv�̠��e�]N�4|��t�`3n:G�A�P[�G��D�K��w���?�XK&T�(qX��k[�|7��ߏ'��J�/6U�`��4�ޞ;�+7�w}�{5�S�~�vٹe�|V��Rg�g}:%<Г9&��j�4L9�L�79�_6�_�*���T��p��i��ZF������vG����]e�Qb�Z�w�� ���k�Z�V4�i���dj0��Էl�n���PjgYE�뫩:���S��m����=|/�u�ќf<��1��_�y'��=�6S��<�C�蠉y�`3h��^;�������.�;�4����9�@0�R2ʄ�l���c��5��,�n��3�%w(-���Ew�ӭ�o����Y
���y���j�{Z��z���_B�])o-���h�A�j�v���PKE��T�$�!0�dpip/_vendor/chardet/jisfreq.py��_�Ǒ��S$ ,`�-MED�c�d�C�,iI
��"�Vc�ݜf�^���,����C���ͬ�̓'ND�g���嫧x�]����O�{�|��_��������_��7����-_߿�.7�˟����U~~����ͫ��������|y�볻�Ǜ��^�޿�~(�o�㯌�����w�װ7�w���û�}ȁ����W�W�ׯ��5�?^�ꁱ�}�K��X~���֚9į�����<�������~����LJ��?�c���ߔ򧫇+?�����m���>������_����ϩ�������#��������ߕ��ʫ���p���>'�\ݽ�������͛�|���u>w�x��9��w?�o��睖?\�]?�����ۛW�ۛW�w��������yq�H��>���\��s�^?��o�i��v�xYr�s���j����y��m��ç�_����I_��;
�K�}���-aU~�.�_��p{�#�o˿>{�/���<����_�<�仗�]�6g:�5�o�t�]B�uɧz��{��7�����%{<��ٷ�^�������xQ���yyR~x�峯�����Ï�����/Kyq}�i���_���79�����׏W7���9��}�������_�s�_]�$��Un�w�����/z���	�]�yS��/��n;��X����{����ei�?�����\����79�7���������OO���f������?��<���F峋����O���m������O��X��ܛ�#�n?�}���K�!'9�GN��w��_��o��Qs�ǫwWw�,�����{�x���61{�nc#���|�_������ǯ����\}��x�[y��!�ݗܯ�,�/�[9��X5���?}5۰#�j柾Zޣ���髑Iǣ�O_��[��c�i����h�~��S��}q~�<�7��a͞�c�$�c߻���}�����ٿ�/?����_~|��׮��_��?���I���x���o���/�?��ǗϾ���O�9d|y0]_�r��\'���/֡\��|��ӟ^<��O�G�>�����?�u���c����y������?}����E)��L�k4����l����.�|�_�]��v|W㨗q�yY��/�z��f�Cn�"?�e�>�g�j\���t�~َq������y���e�n񓼧��z�=n��yw�-o��ʟ�E�8W���8�k]�8���߹�|U�ɃT�������y��Ҏ�R6�)��Y4�&��F��@GN��;w^�<C>�7�M��z�vh��z^�z���4���hFͼ���_+�儶#�!���A4�<.�k-E��y�u���L[eBMc�Zz��>=�!�|f��G���|$�+G�q����o<�%���#��&(�`�s�q�,~�sM�k�\��]�9��;үX�ţ嵲aA===3�����:h���>/�C�M�i4�f�Lz2�f�L�T�kF7�����fc�[k�kt7�;ݝ�	�l���tzgP�
=�A��G��0n�u��g�3��z=+=+=+=+ת����F<w��ѳ�3*���������v�u����ӣ�=��ucggC�N�N�N�A�A�AO0m`چP�k��o�=ss7��9E`0��fތ��Vq-v�
��-�eõ{��x̵�=�5�׋~cgꘁVNov�
��K�`w���pNA.[8���w����!�팋y�	����=�W�B��|����4<C">ݚ�v2�̇���cw�H[ha����}Ǹ��+�-�3Z`���&
0�kװ@�>��H�6�cF�V~�]��Lӽ4P��̖�s0i���m�}΋�>�9L���,�ј,w�3�C`;�4r��r)��*aO��b��%X�Z����'~K,�mn����{+N��?�!��6��C�u�_�Qa4y��V�\��̿��A��0o����F�ɦ[�e/���{�e�����xfu�*ͥ&�k�f��m�F���?5�ܪ3�i��톥q
�n`V�V��6�v�l܉�@~Ȟ�
ul��
�&h*M�a�5�r��qs��.aF�K�T�
w�9nZ��������+�s�UC2Ӭeg��_r�k�ȝkF��Y=X7�Z�Ę޴n��s���B���1�.G͌�L���`�:����1�;�=K���to@��������D��̀m<2�%n����t�9�KX�0=�@���;n�h��5����b_��v�سz�C�w�p���O6�*X�¦��i��n��6?��hZ�A��P�����3:����S䶲&s���Gt<����xD���*���g�s<#,z�P�3BͲ�xD�2���G��y��K��q��l�{�t�aI4�k��
yOxT2�bp����gL�_���Q�[H�Z�ee+S
�&��]�ՇvTV+�����6���?�;b�E6<ص28`־��:��;=p���~�/��
=q��G�;�q�ةl�uܨc8�h6��{��Z� ������5�n�^fCO�*NJ�4���5�k�/	LN`r�Ƀ�6��Knp̆�o"�����5f�1���P����%cp�2�e�K\@6�x��1�c�������2�e���S 0��(P�0���L-N���%�����`%`jF�	0`$�H��#�l�F��u��K&2z����	0`$�H��#F�
6�p���c�u�u+�{E��U�\?Ϳ�$b���,F�����=�9�DĶg^��j+�573EV��Dc�ZA�@1�b��1j��Hk�͌B�~�d����l�	$�MZ�b�(V�̦�t�A���H^��	$+���fCO Y���l�	+OSy�
+P�@���;#yI~�'��@��
$+�$�mvMD�Y͆@��
+P����K�=�d�H�eCO��
+P�@�E�t6��(ֶ��H^��	$+��@��
$+f��
+P�@��
+P$8m���^R�d�P�l�	$+����
+f�b�*\���
F*�`��s�&�V*X��gCO0R�H#�T0R���50�H#
������%���M�4���`գ�D4�|�/�_i`���Fi'���K�=�J+
��t4z��Fi`���K6�#-����%���`�����j`���Fi`��V6�#
�40��^���$?��4��0[
�40�H#D+�p-0��)z����MxI+
�4��0[
�40�H#
�40�2G6�#
��3���VX!�ʆ�`���|6�#
�40�H#�r��8�
^�J+�t�I#�b
:�йP�������5�cbYP�]�%��h��2��t0�H#D~�p-0�H#�t0�c�ۂ�t��J+{�H#�t0�V?z��F:�`-K��K:X�`����=�`��hn6�#�t0�_6�#������V:X�ؓF:�`���F:�`���F:�`���ł�t��
AIC�ˆ�`D�V#4oDύȷ�Tv0�H#�������V:XA���h�&h*M��4�f���02v\�C�z[6�+{2��#�02��#�02��#���#���`e��V�d��F`d��FPs3��02�Ȩu�/`e��V��$w0=��#�02��#�02����^2��+��	�fC�Ȇ�`d��F`d��F��q���z��V�d��F`5�!�4�P�5�PZ!z����u�� @eCO�2�'�02��#�L02�Q6�����n/�`e��	V&�d��	F&�`d��	F&A�ˆ`d���yI��nH����L�	jFZTz��	F&�`d��	F&�`d���y��d��	V&X�ؓ	F����'�`d��	F&�`d��	F��%f�	V���'�d��	F&�`�.�F&�`d��	F��%f�	VP)�b6�#��l�	F&�`d��	F&�`d��9�u��L�2��+{2��#�L02��#�3�I4F�4A����%�,����ž,0���#�,0���#�,0���g���n/Y`e��V�5z��
��������#(�mm^b/Y`e��V�d�B�l�	FY`d��FY`d���y�9�d��VXYؓFY`�7z��FY`d��F��%��VXY`eaO����'Y`d��FY`d��FY�\7x�+�,���'�,0���#�,0��y�Fʩ��6��%�%/��7N4���t�A3i��Dm����a�0zl^b��FO�������tz:=��NO�ZN���#��ؼ�2�q��AϠg�3��zVzVzV�U�Q�Q�Q�Q�y�e8��Vz6z6z6z6z6z6z6z6z6�����������yI��#���������������\k�c�c�c�c�c��p<ǝ���������\\k�c�c�c�c�c��X�E�EO���ѹ:�VG���Y�,ZG��d�:Y��&�);Y�n'/�8���H�$Ҝ�p��S�·"��)����y	�Nꭓz+Hf��8��"�8d�� ��dO�W���zX�
��,��-O�Um�,�䋂q���d'np�B�D�{���K'n��(o���m��h��%����1�2#��JRjF�P�t&ʼn�̘�B[�$�gpT����09��Zp<��Z،}T�J��0*����7P�\�Bj���&7y�����7
�P� R-�p�Lp��\��<����fg��y����,�/#��$�
1�5�	B���;V���P�4n�8{�P�
�(���W��*��#Z�aOC)=��BZ��L��
�)��
-'�S���p�C3,�a=�f�
�6���I*�:x^�sp�M9?�EQtdbF�Ո�#�B��A�c�W�ʥn�7�6/�3���{ܠ�.�x����cBG}/PY'x1�K!�u�,9y==7]���}��V�I�������pυ-Ki�qd�N��ە]E�3���(�д�Qwt#;�=����JD�J…������$�.��cM
���8	cC�2�ѦYu%��`�{��c���:��<Y�yr��ɬ���P�)�ÛrF�2��&�@0[`��I�t���}ȧB��~I}!��R���5�MkJ��x9Fg�]ɟ�G�s_d���3�M�L�JF�1/�e��6��B�6WX~�^�57yI�����BKD�����Cu"�����sL��,[�֩/Aa-�Ub�5s�gV�R$N3�(�(�e\���7y�q@���u��t
�׍|��]�`-dK;0�M搂mf�n�p�u�Mr���*�O%B����$���_��B�!�g�c�I3f�3D ��'_8z&L��M�mER���$�M�;f싄T�-��?� PHvh��%
6k����8E��s��	��a
s��ڷ����v�z�C�G���G&_BR�XlC�pD��q�8$d�X7��U����>i��%�e�0[H��\�G
���4ҾN�PP ���3�*�a
�_�䩓�H��"-��\V>}��8�S��025�<oT���w0`��F:δ���*o��fT�} v�@T���9�_��q��rU��,�^�I}IS����~s$h�l�.$n�Ԫ��tt�Jҥ�1<G��c�)�wgݘU\K!�XT���̈́C�(HI�L$2?�N���+�R^B(mKF]�u��]�1�_l}�ƅ�U�s\��%ϐ��(�_d��v��F��!{��=��g��e�p�J�!��	��v��\�J� ��M���R�o�rh㲠T �=B�b9e�'G�.(i7y�`:ٿ�kjV�A["�nc}35����kMmNI���9.�%�a@�2�T��cY�)��5���D�V�1DX���@�X�n'~�Q\v=4�k�t4�BV�H���� �.'SE�-�v���5n��:�QVI�:�Ђ-d��TT�=$�*��ՍRD
Z�:����>&��>&+؂B��Sdg(��Q�lʀ� i;T����C��\��ȏ�4QG���軪u����TK%��Ļ%d�Y�����P�x�*��m�C�I�Ḱe�q�*>; ��
���X���W�:�E�"4H�=�$qG8E�U�L�Éo
�Q��yWط��M_���|���T4',։�l���i���F
4|sn�ʨ���Wb�h;€qM#g�D���cU���AA�z'��UQ�-Hr����%~�C#��̄�F�\�
�)��C�-���RN�H�~��$�"J�pS��p�5LtT1R��018��C��;�#�9�c\�^	��M��
5��(}p��j�
Xº-
�uF�7Y�:-aD�pF�$΍-�2�/
���p*לrC)�X�0���2��p�^��[��GrM���B��ڽ`��|WL�G��,5���y�۱�C����)Os0�lM��� �����P��B�)F_��/��ׂ�k
��Kl��B�0/4��0E�ͩ�(H�$���xU�1n��W�/��pWģi$8��,P��Nxw���I��ueW�+)'�9U;�$���B�C̮c	O�©]ׇP�`*V�f��%�'&T�'rM99������%Z´����zd�7~�{��?GbE�B��ȿ�mu�!2>�xP�mД"_J��M^R�OjTJ9H.�	��w���-�`c�O�7�#��30|Ҹ�sѸ�K\�ԁQ���[�T0̬̖�307Ғ��J?3L��^s�|����dU��;��2pm� #�!8�Ͳ&�h��@	Ű��;Խ:N�Tn� H�{�Ŗ %mDW��l������2�)�
�@6Q��KD�mA�ǘF�
�U��0�L�)�}ҩ�Mr�!�*�qF�kN�$I��f:٠�
�e� "�T,d���/
F�v��]��ӓ��Ap�,ۡ(�M��^�BH��`Ȼԧ���"�
�t�DDWph'�T�*JA�EB�T>��ތ	u�N����}Lݫ�/\�4v%.��jC����
6�S�	߉��]ɇgƥ����lS�3���Bꂌ��Q�R�Ċ%�r#�Q0d��y�N����T�m+̫�j��֎�����dIDW�T����M^
�����ٟ���
1O#�G?�,�i⼥�}yp�W�&/1j�
�,=���4
�GE?�:Y@�/�jb\�}h�b�*yl�7�^�2��O
���}h�+��}DY<��с��w�Z#�[t��+�DQŒ3�˂J�)�2SRa0�vQЋ�i���	��1R�w�ߠ��bA2$�KwŶ4!�Fr��� �~��ϭ��m[/�"�r�1��5��m��R=��[�t]�Lᙏ8u��_gB��qK�	%0tZW)8Ƈ��-�J/Y��ˈm�CݫS�^��5�������cʦT3�0Ē�� C�u��4v�:����r���:f����qP>��L��u�;Ӹ"�p0y�O����`��T�M
��H��)�� �I���[7bK�
���Rw�ԩ{�)�&ӧ:o8s�����.�Y��a��$�L�X��ҳ�N�k	��>*H��<�)n��Ǧ�A���q(2�@L�rY�ԽՂ��lU��2����c��%1���:K��y뜚��q�Š��ȹ-ɫUGav�Mu���X%g�YhӋ��+{~�{5&������%Q"�%�����t�v(��6��Ba5�&/)���I��q!Z���>p�-X���!q�/Ysm	�x㌺W_�XH�Ё>8�T�z�mQQ�46�G��^Z��YJH�ɫ�{-.9v�*�"�db���a�h�u�N���
!N9{!�6?�$u����A*�(*֩���54�DM�(��N����-�*����Խ�N��*4�a\r�NFjA�q��ס$9����!�K,��3*B4n�o
�b��bl���z&���1ySpVPtH�-\��|����H���$H.T�\�a���׽��Ulw��;�	�sݒ�t��g�'�BP��"��K焼O�i,%��U#���NݫIa�"�PS����!�D�	T)�*���7�_6e�"ϩkP��;���
0	Me��au+��b�v�d^Il��[D�8�0uNX��)Uǣ��6�O#��!�Bw�Qž����>��Խ�����Lh�rJO)�)�k��dX��)2r�^z�`�6�K��9��cQx	�_�ᡅR��e"%�b���疐��b ���ߨ{��g�/B����ت��|aJ��P�2ŵ�U���͎S7��5T��!5W��$��awt��9'EV�P@M�a��!}k>gK�+�H�V��nى�Z N�O9s���PJQ�:+�ϣ;u��,�r���1��+d�*�Y�x�cR�lt�
�┽�d�m�Kݫ�e@+̕�:t0	�V�^�8.�D<&R�E�¥]��g��S�jC��)L�CTN� R�MJ�
Yĩۮ*�uݎ�MQ���^7�^��22QZ{|�)߽���'G)oQ�	�3�OF�D�*m燜��B]���Sa�%&�|��<��
&�]��_c�H:YwԽz�qvS($����!���;�l��c#(�$�!�"�g�c�������r�,*��:̉V��q!����m�5��l(e@��e����Ѵ�(�桩S�l���l�@��fSr�f�)�:�<�z�����Uˡ�����OWB~*��T���Y����KH��
�-���Qz��=]�5�ncU�(�	�%�C6tt��s\�,,s��8C��/ڃ�b�v���%䱬K�/�hL�b����ߔ��)�.}R�jq�SQ�B�Z��ݠ:�0;O�z
D4.�]��
�e��)�!�(�v��F�Z��[E/):F���,t�q��`��rXá#���\EIl�.�F�C�KeJ�*�S��P�%�d�7R�⛲��-Z�l�L��Ψ��A�.v������\T	�r�ʿ)�*GU�5Ft)2!�JFGbۡJ�a(CM���E/!a[H:�/�j���!�F1�aOB����\�4xHS�<U��痺W������ܤ���3+D��Xii\�~���pe^�9��8]Z ڄȐҭ�t�)����Ȗ�r6җ�D�=��rJ.� ;�8}�p\1a�%�(����8>�ƣk���S�ޞ_�^�k[!=H�W��������@�+�\r����q�/��3�E\��>'�k<�q�L\AG���>{�ZA(jW��V:���K��x�����2.8�h��g�7���p1sI0Us��e�}�jކB�-mB�Ң�V\�VL#��M�QP�kd伙���ώ�3���Tj�u�;��'��M�G�����a
�Tqøԗpr�C�Ft�L.<�wt8Ŀ�R�QC"0��ߗ�z'�]OԽ�J��(�HH��θ!$51bK�/�M!?Ɇ�T_�	�u�����t]�h�(����j2	��J�9 RH�����R�WJ�|�415L5��_m�C��]�^���U=Y�58����xQ���Tu2�_D�Փ�������>�µsVz���%Խ��Q/l�U��[�WF���AF(�U.J���Ԧ�W�oԽ=
�xTŪ���y�g>)ۊ��H�\G�Ƈ��$�6��Խ*M<D�� ��>(�kJp�k�t{,��qz���HY�D�q��^cnF�y.	Ԑֈ�ɚ�)�p�|�=���`(�q�c�^��o���%ң�����+�(e(T�YՑ|�e�W�N%�)�p�u�^]�C
\Ų��q���JX�ƻL����E�X	
���g��^��:0���ڤz���>=)��i�g�*��B��|����@�k
)�Ce��bu�{�?F�wg'�Q�+W���ձ�!�8����Ʌ��F5����"I���/�Ĥ�Z���/�-��	���~�7�^m;�Al��������&�7]�/T����UD���4	JS��qaP�j�
�J���.*)�"�@��*�!/��e|s��䩮�J�r�T�^
���u�Jؤ1���U�?S & ��^5iRq]%��݉սJ���)݆j��+;��r�ɛ^��5_<�.R�/e���ߨ{5���T��썲�][��Uy	�Wy�ޓӔ�S���?�%���ч��H
%�Y7��xX�Pp��K27�1�"7NZ;�1u��T�'�"«�F������i�,h���Rd�U�}��$榾Z-��\�����D.�K8TQ��؇�8Ue��J*i�g�{uIx�x�Q��ʇ)����P��T�� ��!�M[]:�
OL�ki��'t���h9v	2M��h�}.	ӯܨ��/T��$�`�P]A�Dd�����)���0M��sSٮ�k��Bu�U�l� C��TT�n����v
_���V��.������WC���z�H�]@^H��[-C�/�|b�.� H�aȶ덂��2U\FI���E��h���0e)2R��`��$m)S���]Խ��؆I<r�
U �Uu U�T3(�g�
��m9O�;�Խ��5��I��XF.5�b
���h��8:��i�1��
����Bu��FTA"�32z	%�E�;R�)�8T���ڻG�4��W�~��K^R
%=�������m�YB7�
'�.�a�����sj1uGV?0�{�t��U�tK��漟��"-�1�W�h9�u�Ee�gI����ڸ�:��1�V%�$m��Mc�(9���s��'���)��ۇ:h�y�MS���q�J4)�Qق�a��)�d��VD�[]Jkl�^��K�#��];�d�%	���w]EP�ꇪh�7�v*T9ݩ�X�OӢ�G댁�0P�e)n� �>^�%���aS
��B�C0�֭�m*��z	q�} n�*p�����N�@�!W�O⯪dP�4�\Q�A(�zU��$�1�"�EM*̐�Ƹ�%�=!��+�͎-���G�k� �)=�džԆӞQ�J4ˣ�~G$Xe*�U��#�=U��A�2(A2U�l��J��~�%�}�2�C���)d�QD���2�w�h%C��KP���C�QaUo�̮�^)*TI��,(�R91�uY^Jĸr�R*c�/aW�S���**s�U%���G�X� B�]s� �,m��&/q"YsUzȧ��^>O(�G9ဓ��e�Ny��ଳ��{��wn����a�d�cm���+!�mR�F�q-գ��w*u�����4���:����#mʠ��֕�ո���d/�1�H['�Խ%9FL�U��5�q����%-��a-S�W2�j�1���]��R\Yէ��VGţ��KUgz� �*`+nR�8��̓Qڗ�W�	��t@D"�j�=*�'�#}]iT|���Z�*r�u��%�[tR
�,���E5s�ݪM^�����U�™��l"�CD�8ϓUSg'�.Ǯ�W
���U�-��5�J�'y�T�q
.����^Ygm���,��+=�����#_�
����/��<�^<��VM�%*���'�m�t:[��)ե��ՒQ�+�U)7fR*�y��%z��.8r��Ha��
颍�fU=�:
��B�����J�k(m�zL^XiI��C�
EС]�*<�F[�+���D����&/q���%��ҫ!�d��ɔ
�.)��B�*9���AT�q�5��Jݫ+X'ZU�'�C�a(��U:[�չ:��Z�Gk�|�e�s\x	�|�P�������FC��o�Np�$#�t�H�H���u�U�{�����~��R�d��q����*�C�'�����N�-�m����R2:%Ez*����t�J��vuU4�jp)X
��9�����WS�r���t���R�����T����!�%5����}6�9ɸ�t��I�P�`v*�t-#	ey\�F���%�k�7��Wj���UK�b��J�r~�`��$v]��s�
����@}	>5�rx�#nA�F�
�G�:�ͥ) 3q+����~��礦�9n��|v{��Q����?^w�PKE��TJT�1� pip/_vendor/chardet/johabfreq.py��Q��ƕ��+�
h��d�!cx�L[3�$�$�d��KV�[��ꖽ����8�������\ѕ�Iƍ�����7���K���矵㋯�K|�e�����7�o~x�|���Ƿ/�\ڻ����?����o޼�?����o_������������W�w>��ח~����c��7�~zx���������޿z��������O��C?��wO��������w���T/�Ʊ~�����߶�]R�k?�?��O.ۛ7��w�_^<�x���k����퇧��~�o���i�\����o�������˿\����._���wo���To�{z��˸j�?=<\޿���?���_~y����˷���׏�}�~!>\^�}�_�=��������߾�og������_���������򇇷O��|��wo_�������������+uB�~r���������8�����K�$�z��#~|�s�ۗ��>�?���������ӯ���^�󝾾<��a�׾��~��F�������������~������?~��7��?_�}{�b��?���n��_���H�?��K����o?�҅���x��_��g��͟���g�|q|�����v�j{��g��Ϸ���}�՗_�\._?<�z���g��^��!|ׯ��/߼�[�s��]�ח^���O��^Q��}������y���z��%�������w>�����N���0��(�~܋��'_����ۿ��S�u���~�w�>�Ļ�Ư�i믽攮��n�t�|�u���_���o>z��z��??�}�˥�{٧��Û�G��w��*އ�_��ߞ>���������"�����e���7z��G������7_���ۋ�|�b?^������^��G}�^��c]K��r���1zI�q������맗	?n�^f��^���O���ۧ�?N�^*~��M����3t-K�–.,A�ҕ%H[��mK�?S������M����}�.з��e���j���x=���2���2�m�xзu=��q<�ۺ��E���E?�
�Z?�
��}�k�x�w�߇���A�1^}�(�;F�@���g��{?�}�~�&��O�w��o��{���'軏�A߽��}�^�N]Ϝ�s?���s?���'���3~�/�����ϧ�:V�\�s���J?~���n�[�o��}cq���@�X���z,�7�c������i���~��g���^��e�����a������_�o�����w����
}q�?C_���c7����V��m���zV��o����O���+�X��u���~�
}{�W�oǃ����7�w����+��8h�B�X��
�cI��qk*]'�M�:c@(�iO�۬c�����q�dK+�%�X[	0ي^�c�$�d�#�'�x�l��� @ʶ�%P��*�X	T��m@�:��l�:�t�(�,�XY	h���J`�V�V(��c�%�e�/�/�X	��ƂK ��>��m,��lMg��]��C���t@���l*\�f�I@ͦJk���q*
.h�S�&T��M�����,'Tt@N�-;�9�*tb|�J�N�]<;�:wBu
�>H�<��zB�
��&�	M6�c�M�Oh����m�bl�	���& (Bg�R ��Bi�Oy�P�4�CM���5�P�4
`Q�s`�4
�Q�4GM�5}����Dj�$5D�R�0�R�*5m(�R��.5�S��2��I5MM���T0�SS��NM�<5-d�i!P��@���
D5�l0������6Vv��]��t@+�Qm@+�Q�������}�AO������oT���Q���F�;�ڋ��8��~JGIe0j���}�Y�Te�Q����v��F�ېF�cn3����ұ�3��
���B�X���Cg�Ҧ�@����}|d�`Ծ�F��CP��Q���JU`ԡ���uL�q*=T`�1>�d0�P}�Q���:4�`�16�F���:�'+u���:�G,u�X0�П�`ԡ�[��c|v�`ԡ�u���R�uh���C�
F��r��>u�O��:�G�F�0�P9�Qǡ�@顳@�� 0��F�U0`�]sF��2u�fF�˸@`�]�u��`�}�
F��v�P
FݵÀQ���FݵÀQwM6u��P�
�������0���k���*��Q��kz2�'���8�ɨ>�oT&�J>��ғQ}`�8U���'���m|O��"߮P:���J�U�]�t|�u�B�/�t���
����J�q�B��?nW(]�
���㖠tl��c��%(�:����c��%(�tP(tKP��P��2��
�e(��_P���2����4�T�pe(=tZ(�i�2�m@�]ߺA��n7(�Pn7(�Pn7(�ݠt|uu;UӤ��7w2��,+�{9U�`��dTJOF�}c�10����C�ɨ��
�cU�&(-:(��5w��t�1�T+j�R-�J��f(]�1�Z
3���g(UY�P����Te9C��r���7Э@��@���nJ�5n�RUr���'ϭ@i�r(P��z�������@� ��dT�*��Q}`�dT�8U�*�dTo�dT�1N�Y�q2��[�zI�8�
�*�J���P�rX�T��B���JU+���nn+�js\�T��
���������������t���������m��ڶ���M	������ٟ����P&0�6��S�m�K&�3�7�`ԭ�%t��	F�ԏ�n��u+�3@��?&0�6
f�n�`&0�6
f�n�uݥ	���:��
����(�	��m�@��a&0��P��P:v�	���
�c����[�P:v�	���f�&M5i�����{3a`���Ƈ�	��4�`Ԥ��&M%5�!���g�	��4�`Ԥ��&M65
zL`Ԥ��&�>5��_5�O[5���i�05�>��I�FMUǀұ�L`�Tu(�j�A��a&0jRсQ��?&0j�&0j_�L`�4v�	��F�o�&5���I�?0j��&0jR?���)�Q�:�`Ԥ 5��i��IM?0j��F����y�Y
t�S鬝���ӁQ���F���F����YK������Y���U�`Ԭ��fU!5��Y�F�ڃ��Y{5��~'0j֦F�ڔ��y��&0j�.F�ڥ��Y�5�]j����F�cJ+g0j��f0jn:�z	��O�3U�'���`TQ��*j�QE�b0��YFu����j`�@:����Uǀұ��`T�jzC��?f0������2>��`T�U�ʮc@�.2U�J�1�Qel3U�f0�Qel3�h���EF-n�JM��IF-�0j$���e���Z�f0jy�����Zy�tPl��Eg�ұ�g0jQ��Q�f�Z�R���e,��Z�R���e,��Z�B���%d����A�TF-Z�`�:�T����i��b��(�f0J���=i��H��(Y�f0J�����h��*��(يf0J�����h��,��(Y�f0Jޢ���h��.��(�yf0J~����g���(Yxf0j��(�zf0J�����g���({f0�N0�V0���`��;`��;`��;`��;`�
<`�<`�-<`�<<��������Q��0J��F��R�(9M
%kI��)`����3��Q2b0J��F��P�(�
%7C��U(`��
����Q�0J�F��_�(5������/`�6j��Q��0J�F��V+��
�R���Qj�0J�F�Y_�(����`T�"�Q�k
FE�Y�TEF��_�(u��f}�Ԭ/`����R���Qj�0J��F��^��f�ک�ٵv��F��^�(5��F{��{��Qm�5_��6��F�_�(���V|�Ԋ/`�Z��R+��Qj�0J��F�_�(���V|��&�j�90�i�(5��f}�ԛ/`�z��Ro��Q��0J��F�7_�(���

�f}�Ԭ/`�����

��}����F��_�(���v~�v�:��~���/`ԮZ�v�:%@��(`�n�&��p��]�L0j������dX�(�0J����G`��X�(y0J���G`��X��}�=��Q��/`�>Jj�Խ_�(u�0J��R�~�Խ_��c������R;�����00NFc�0�X�(]t(���G`��X��ö\(��F���Q�,`�,%�F�῀Q��/`�:�u�-g�Ԋ_�(��0J���:�z	��
e�ԛ_�����.�1V货һ����>�������>�(Y0J����%`��X�(��0J���R���_���@�F�῀Q�����ۨ
���(90J���`��X�(90J��d�&�r2j�`9��῜��:F��x�'�69��Q��ɨM��d�&�r2j�`Y�TӰB��a�RM�
���J�'�e�R��J��W(�گP��_�Tk�B��~�R��
���R�T�A��*c>��`*��`*�ڻ�2�_�tl�J�v�^�tl�JJǟ��J�:(���,�J�:(��
eMP:nCY���,�ɨM��dԦf�z2jS�~=��Y����Ԭ_OFmj֯'�65�דQ����ɨM��dԦf���t,�5C�X@k�ұ<���~J�J�JJG%�7(�4��`��n��ұ�7(UIݠT��ܠT7|ܠTw|ܠT�|ܠTe9A�n�t|BY'(��u��]�8��󾞌��y_OFm꼯'�65�דQ���ɨ>0�r2jS�}=��Ѿ����h_OFmj��3�j�g(���P:��u��Uǀ�Uǀ��h_��]j-P:�X��{$��c[��}l-P:���@�ض��U��:r�R���*�JUt`TVI�QY%F����Q��`���+���
F�{��Q7U��
F�{��Q7U�f�
F�7��Q�ͯ`�:�+�F�
F���Qj��`�Z�+u�I�`�z�+���
F�'��Qꉯ`�z�+uXW0JM�����S�n��T�(u�+��y��5�`�T�=�`����R��Qj�W0Jm�
F��^�(��+��y��5�`����R���QӢ�@骃B��*�x���`�Z��R��Qj�W0J-�
F�^��i��
F�'^��iTa��Mg��QA�R��Qj�W0J]�
F�k^�(u�+��y��$�`����R���Qj�W0j�P*��x���`�z���'c��F�I^�(5�+�&y��$�`����R���Q�V��y��5�`Ԭ��f�6��z��W�`ԬZ��h�`���R���Qj�W0jކ00J��
F��^�(��+�6z��F�`����R���Qj�W0jY*�&y��$�`����**)0J]�
F�k^�(u�+��y��$�`T��Q�W0J]�
F�k^��2>T0Jm�
F��Qe|��`���R���Qj�W0J��
F�R`T�c��Ԋ�`TQ}�Q�ͧ+ ��|���#�;����}r���^�T-���Z|�/`��v_�j�բ�{����}�Ԭ�|�aD��Rg�����-u�4/����\n�����z�}�u��R3��@�^�h�]�W�K�>ͺo�
����G�9tv l�5�r�V_CPl�5Ɣ
�GNͫ�*@����d�y @�A�`�3A���S=���s=����=��z�}�u��DS��@��i��hֽ�WPM��t�VW���Z�����^�@��u
��^���R9�4{�oj�h��Wn��� ���U�w0�z�r�5�U�0W]-�\u�t���UWPW]-`]��쪯<hW�N���u
�U��W�*A��5�=�!�y�%�z�5�z��{���{�|��|�	�}���}��~��
������W��w�_@��~}'���W0�7�_Aߙ~}k���Wpз�#�b��H��|�9�,6�}�<��7�#�b���H��#�F
F|�#�FV�(l�����BG�����l��>t$[l����DG���[�n��^t�[l����FG�����p��~t$\l�!��HG���[�r���t�\l�)1��JG�����t����t��NuD]l��6W8�\-�`s�����8��*hn>;4�~4�>24���|7=R/6�N�؋>��}�=�/��*�M����#�
p�
XB�Ŧ�B�Ŧ�B�Ŧ�B��&@B�&@BFѹ�Ay206�B06�R06�b06�r06�0��Y3��>K38�;~ܽo����
pp�.������ܽ����ܽ����ܟ�l��kܽ����kܽ���k�7iw�Jpp��w}6F<ƶ{�����)8�{�����)8����^�࠲R2��kܽ����+ܽr���kܽ�ݫ	ܽv���k<�.�Ay36�36�"36�236�B36�R3�H�H��_�`�g���ǁfU8�36� �3��Y�ࠜ	���	���	�}D1H����͎[�-������ÉK��Qudp�z��'B��&gEB��&kEB��&oEB�Ʀ�0�M�		i���46�'$�i��pP���D�M���H�Mƍ�L�M΍�P�M֍�T�M1
	���	���	���	��	���5�]����ʲ����]����5�]����5�I�ݫ�{��w�p��U�]-࠼	I��	Q}D��_#!lc��R�AY8�66y8�66�876�87��j��`\}�O����`�4R1�s��������:������P:CB�F\}�O��	�q���@������,���f�f�6+4{�Y�Y������|7h�u^��+w�f����rWh��]�Y��W��
�^��E+�q��k��`$�哃�̯�����OF�U=9ɫ��`$�ٝ��4���}Dy�'#9���`�C��2$$s�\	���w�f��]��Y!4k�F<G�J����iy	��S��	!ABFG�`����?!�#�9H��Y
r:B~�����! !�#dH��5��:B�����PC?!�#�O�����N$���+������Z���ɞ�7�����{�b;B
�܎P�<!�#t�zBrG��-�	���zBvG����O���<A���;�4�N��3A����^)4{]L��u1C����=F��'_瓃1�:�����`Ѽ��#>�i>9j�'�y���99�g��`L��͞��b7B=B7�'�z��	��{B�Gi�f�;88yŁ��+�\	���J'�8pP���|�P�=!�#&�JpprE���+
�\Q����M��\c���'�88���I"룏��f������y1��N�m���9������ӡ��K���2$�~��38(AB�GL�J'�����}�4;?����|	�!#BB�G�4��	 1;��]!!$f������Z�Ab@B����E!!$dIHH�ٹ�����WppV�(�@B>��4��Q!!��hv����j���v$���
	� }D���
�<$���L	� !�CB.H�pp�'a$���	� !oDB6H�{��WAsuh/4W���  $d�HH	�."BB>������"!$���2�A�$Ą�RrBb�_I
	96�BB������g#!+$d�H	�$���|	q!}D���#!0$������@�n�Ь�f���<"	�!}D��A�FrC�����Ӝ���;88{�g�-�`�.��`�.��P�Ss�.��`�.��`�.��`��	�`�z��;8X������JpPΘ�8�(^��`�:�IH	�a"E�x-���k,^��1	�"Q������ep�x-���k,Z�	;g�.�G�@�V�E�H�4k�!a��T�@���@�n=м��ЬՄ���o9#a��F¾$�D��8�,�#k$��6v� m$�A�H������#a�"G���v!t$�B�H�O�!w$�B�H�#�䑰G�#}�hv*;8h��G®!ď��`vpp�3n@�G|vh^	�~�
8���!�#�F��)�����>����K�����U��8yp�n(����PH#	��G�G�N�A��H��D��c
�$a�2IŽ)�����C�X���
�$}D���
�$a�I�*d���\�hp�>+ē�}V�'	��P�Y!�$�BDI�g���X�ͮLp�>+Ĕ�}V�)	��T�Y!�$�BTI�g�����
a%a��J�>+ĕ�}V�+	��X��\7�]���Y-�����8����j��vy!�$��BtI��쒰��%�������%�z��B�I����s�"L¾/d���XBLB�,	)&�D���P$KB�I(�%!�$ʒ�d��!�$�1C�I�YI	a&��#%���]g�3	�ΐg��!�$�1C�I�9H	�&a�2M®3���]gH5	��k�O��CC�I؇�d��~�8hg�M����`
����MB�3	�&�g%���hNB�)J�8	=�(!�$���P�MB�I��C�9	?~9'a��N��B�I��C�:	?qY'�G!�$��!���:�����y'}D�􃈐xv"�$�D�I��Г��'a bO��B�I��B>	��|~��O¾Ad��}�?	??�'�!�$��䟄������~��~�"P��AJ��?A	?�)(�g� %�uDJ��?B	?�I(�p�~Hd���0��Ci(a�$�P�I䡄�D	?��(�� %�D&J<?�|~�8���p�?���3~������O���>?���A?Ьoe�~��Q�L����HH	�1��G|����N��G���S��#����g����DRJ�{�����Y)a�%�R�NK������K	;-��vZ"0%�DbJ�i�Ȕ���)a�%BS¾J������M	���v-"8%�HDrJ��蔰��)ao!�S��B������O	{��v"@%��C�J�ˇ���*aBT�.8���=o�Q	{ސ�v�!H%�pC�J��(���
Y*�g�$���nHS	;����!O%�<��@���
�*a"U�>4d��}hU	�А���!V%�CC�J��`����*a��U¾/d��]^W	����vy!^%��B�J؝����;	+qxv�A{���v1!d%�5B�J�#����#9+aG�V��bD��#Y+a��V�n����>�[	{{���GV�@�>U"q���ȕf�2W��=]iJrIH]iv� v���ܕv}~jۄyƈf��`���+Mq-	�+���4����A�J��,�$�4��Ү��+4{���Z���J���y�Ь���Ҕ̒����蕄(�f��X��Fci�!���k�8�f��X��Ediv!��)�%!���k�L�f�BY��FHeiJeI�eiv!���}�`��`��d��d��h��h��l��(��p��,��t��아x���D��~``�f? 0Cs���y�Y{BZ��QHiivC!������f��Z�"T�Z��P�jivC!��������$��4�$ĵ4;�����tB`K��	�-�N'D�4;���Ҳg��`˞����n(Ķ��x��l�[Z~~�#4??������������������]	34�fh�����B�K���@�Ww�f���^����4{uh�Z>9�n������y?9�n������y?9���B�K���.�./$�4������B�K���.�.��4e�$ĺ��
ڝ�`�fw�]��Y�viJPI�vi�k!ܥ�l�f�np�.�4;�����B�K��/�.d�4;�����B�K��
1/�>+�4�����B�K�c
Q/͎)d�4;����B�K�c
q/͎)�4;��Ҧ�g�B��
�1�̗f�B_�]LH}iv!���Y�ܗfg�_�}DH~i�!���#��f��_�AHiv!������fo`��=H�i�� ��ۃ�foB`��=H�i�� ��ۃ�fo�`�};H�i�� 
�ٓ�,�fO�`�8H�iv� �ف�<�f/
a��-H�i��x�y���ЬՍT�f_
ba�})ȅi�� �م�d�f
�a�](Ȇiv� �م�t�f?	�a��HahvE���� !��え�fo2b���ivG %�����fwrb���iv> )�����f��b���i�9 -��瀸�f��b��i� 1��W�Șf_2c�}�i� 5��W�ؘf_rc�}�i� 9��W��f�c�]�iv =��������?�c����i�#A��׏��^?2d�;��i�#E��'���8rd�{��i�n#I����(���6�d�{��i�S#M��O�8��>5�d�z�y2}d�ȩY=�<��tF�LS:#O����'�ԃ�ȓi�8g��4u�3�d�:�y2M�<���sF�LS�9#O��㜑'��q�ȓi�8g��4u�3�d���y2Mތ<��oF�LS�7#O��Û�'����ȓi����~:8�>?��@tpp����G�����D���Û�'Ӫ���Û�'Ӫ��Û�'����ȓi��f�ɴ�����p�z�A�j3�d�z�y2M�ڌ<���lF�LSg6#O��3��'Ӫ���Ǒ�'��u�ȓ�#:8X]c��P�F��S��+n�����+n�����U	n�����U	n^����U	n^����5n�ApP�nj<�������8�yU���W%8�yU���� 8�y
����8�p0<;�`x5�������8�^dF�L�pP�6�ȓi�=�y2-�����`�~��p����j����W8^��`x-�����28��fF�LSO3#O�����'�ԝ�ȓi�Nf���yƈ�\0R5�`$4rjVw2#O��;��'�ԝ�ȓi�Nf��4u'3�d��a2�d���y2M�ʌ<��~eF�LS�2#O��_��'�ԯ�ȓi�Wf��4�+3�d���y2M�ʌ<��d��<���dF�LSw2#O��;��'�ԝ�ȓi�Nf��4u'3�d���y2M�Ɍ<���dF�LSw2#O�)�$#O�)�$#O�)�$#O�)�$#O�)�$#O�)�$#O����'�v�38��V��ݵ
�Lppwe�����]����wW8��~����
ppwm����f��4�j3�d�z�y2m�.��%��ݻ8��lF�LS�HF�L;\	���y�8xxv��ó�p��.�����^�࠲52�d���U{8xxO�)8xxN���;8xx����W<�����;8xx�����;8xxu��w�8x�|��w�Sp��u
޽*���W%8x����w�;8x����w�Jp��J�pP��<��nrF�LS79#O�����'��M�ȓi�&g��4eGd��4��3�dv��3�dv��3�dv��3�dvu�3�d�ȡ�|�� OfW�8#OfW�8#OfW�8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#Of�zN34�:gh>�;�,V"OfW?7#OfW?7#OfWvDF�̮oF�̮oF�̮oF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̞\�'��ʜ�ٕ9A�+s�f��ͮ��]�34��ȓٓ+s�fW�ͮ��]�34��fhv����=a�f�	��'h޴4{�(��]�@�w�ͮ�͡�+��|dhn�\�Ye#OfW:#OfO���n����kg�f����vhv�/��?9�g��>�#�ܳk���]�'��
?9�gW��=��O��~rpϮ瓃{v=����]���[�ٕY��{f�f�j�f�j��UU�ٻh�f���CVhv�WhV=#Ofד?2�d���E�LY4�ͿͪC����g�����w��Uuȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�#ֳb�ǩ�pP]��<�].�ȓ����ȓ����ȓ����ȓ����ȓ�#>4�{����g����
9�dvu�3�dvu�3�dvu�3�dvu�3�d�Hh�W�W��.�'�+�%#O��H8x�*@��.�AF��.�AF��~�o^������ #Of�� #Of�y���PKE��T���4�"pip/_vendor/chardet/johabprober.py�T]�9|�W����ܒ�Iɭ"��.	_b@�>��LX����j���ǒl@J�	�����m7��?�
FS���i2��x�BWj��&-�L3+7RE}�3IG��.������ґ�^��Y�[2����w��1BeYi�	/�v�kw������e�9�u�g��(a׮�Q[O�~��?~���b�hj-ر}��I�ho��ƶ\�_D�&�~��T+KzGP����~k�X���
[�
�L����6eB��\�=��$t�����&�EB���NP�ٖ����tEcvPJ�٢�y�V2x,3֎I8څ�۞�!�Q

���K����l"�>�N;2v�Xj	�c��lCtM
Ӱ'dtтs�9I����{�!}�њ�r\T������q�ZR<}���bO�Ow����b~&Y�1��B��A0,��@Ľ�x�|
ꇣ�t�$4�-(�y�X���q���j1�%��(a>Y̼d��(K's�B*wh�	�u�rڊgƘ3��(�"���f�����l�ɂ��z����e�`9Ϸ��Ϣ��E���F�>����ۡ�q>�Nb`o�w����v�V	"�>L��i6�5%E�V�ׅˆ�[�y���H�x'j�7�ý��n�ȶR�	��g���2GH��9�;kְ�X?�����sل�|�=c�+�&�t2���F��s��ֺ̆��v��4�xtҴ�X�x�\��Վ^��s
�džS��t������`48�����u��n�z�����������%��˲�����f+�7��ЛJl����j	}�PKE��Tޟ���hpip/_vendor/chardet/jpcntx.py�]ms�Fr��_1�>�L(fH�r�
M�}�"�rT*���%qZ<+�����3݃G�\%*x������O7@z�,�G�t���L�>=:>�<V?�>?�����l発���y���E�RG�"Sy�ޔ���V��~w�.�yڔ����h���9���y���/��٪��*U.U���eM=O�3��E�V�e�}q��۲���U�6�B]?v�Vi�ʺt[�6j�hO��։N?P����h���"���s��-9*��ʯ����z�{7�ԛ����櫛*�SϕӰQM��>6�e��߹j�_Wi��zmYe���e���A=�k5OUe����;G4*-(+���\���vh],�9��MV�Ճ_��S���i�^fEV9kޮ�W��-~�ϳ��TZ��v��=u�*r�QD��N|��T����ޟ��v#��a���}�b��6��.����=��Z�hT�ʃ�FK*/:�����	t�>8X��L��l�^�;	n�������+ux�^�rxqqxv��7�y�]u��%�w��嬪Ңyt�;o�/�^��?��>�z�jrzuv|y�N�/ԡz{xquz���z������R�Y6��uf����yW:O.�&�Wuo�{��)�Z���s��<�r�(����M1\��Mg�[2:��/UQ6���v�Dt��1����}�h7)->�\.��|�D��ʲ�W?�u�N}s��FF�蹶�V�ݥ�����^<�T����p�m^�7i�*�|~�V���Ί��&�^9���k��m��o�<s �����h�r5o����=��j���zt{,��;�7�V�l�9��Q?����j7�W�a����Ce�_����{��q7�Z�<�~�m7B_��35�w���?�a;;L0�W=�X�D�bq)� �� Il<������{��I�ܕѧ`%C41�S.�M���`�z��/`�'��������I���s���G���2�p$!	%X�6��10�c�R*%B	�h�}��}�o�H�>�{�G�Igj�j
AA�''JR=�0��9��Ou�i!c����"�j��k8����f�J=l	(�1|�r�}_!�̰K�oa�C�z�S�k9%i
�˨g����1~=b��5�@�����!�>"��Q���ˊ?ş�j�,�1�OBh��gZ�h��L%�<��}�~F �uľQV��3���/+f"�k�`@�'�����`���m0߀�>q_���0�
�Fk��Z?|`�-Ȑ�v,M(Y�Vt��͗�A�3߲�3�203�[�GYIH��?�?�P�-����<FN>'�b,�d�
��a��q&i�H>��h��dr�#�,���UD8Z��t.�mI`-�0�I	���S��?�Yֿ̫J�O|�6WE�Y�(�P>:��dAU,�1 �?`e��ڷT���<�`��:F���H4?�O�t"�7�Te��Vkq���XۣA���o!�opB;��ܷ��Si�#$v��54Q*��J!��%ڡ�Y$X�=����-,�	l���H�5ε�"Z�}/M1?>�"���`�g��O���(�jF,��
���(��A�C*���M�Pϯ�!�ȇ])F���6c~��%�#��R�Y�@ %���/��3֍|Ӱ'}0�0��t��&h0�$!���B��R�8!�m|(�g�A����Y�� 3d�D��h!9����Y%�Y�����##̷�|�m}$���LC���ڏ�&h�-��*1ֲ/Z�Y>Q����Q�@�!6�r�ie��\D~�@D}V���&P�v�N�H������e,�0��^do�E�[<��A��!�#��#�{	̤C����$�����]e1�I�s�ۉ@��cĺ>�3?) �� ��g���K�F�ւ�|�+qΰA#(DjN:�p)����� �?��f���'+R�ͧ��0B'�1V�h�	�	�DZӢ�K�)PD�j��"Z�E�#�g���
!�D�#�o}ͱ�o�R�t�#c`�0��X])�D�F���C1B������Ȓ�S��x`�
&���X.��F0�'�S�-4~���)������N�cl����*����$a�ҏ'z�#���R���1��a�$@2֊C♑�h�^��D�D�/I}������]s�>{t ���6�̲֗���2|,�h	���nz�_2`�����Ol�x0�UH|�q�%�kz�oA�l��T��@Ѵ?��������oc2?����kf>E�a���
�O~��s��ɿۓ��+�`׺���>���Ԣ`�Y�Ѯ��nB
 E�6&m���nD���9�'fsF�$#�2�0�섊2{��ދ�3#��>�$Ue��>����$!ƿ8O�E�R�]����Gܢ�NJ&r1`�����l4���.�W�>!��8�>�#8-x9	A>+|�uv˳����Č�jv�������f7�Vl1uLJ�;��"��n��Fxi
�F̓�#��zj0J�ا�>ʏ��	�'>&��� c3B&�K��3�k�R?��[�~"�D��$d~�|Ȭ�cq�>S7w&3�JG�	�F�>kYМB#�}X"�p�+�R���\r��O�
�Ջ��e=���I]؄��O�)���xX��-�����P�l|�c��UYT�xQ����V����P����N�`�c�q���ĉ,v���OX	 �,G�p�dx�I��&S�-�{a}�/�ZՖ9S�L7f�L��	�H�"<3T���3���O�/�>�Ɋ�=ȥ�P#�$Y�
��](�E�����&��aR�G
m�	�`ֿ�T�|%͗E2��/�u
��p�0±���������'������_n��H},/���Y�c�� ��Ѝ���<���=��˨��c_8�3r���OI��id
l0��E�1p�RO2pө��)�
�׀}�pZ���c�ks?�얐!V��K��N$&�߂�$��B)ɫt����>���؟��Ά��4��I�bVo�
��T�`�`����Ad��SI!=)���b'�ܑ{f�Y�w���n]����my���%GY�4�c����>Q1�����_o@��C�
�?>ac���!�F���9*�>㋕^���g}�,�T�l��/o��Y�ˢ��@� ��|,�APy
��_j
jE&`���uK��vh!P�ƭ��V�������F�/���?����G�7
���1s�d"i�AO�Ш_"�-hn|X��X�%iS��ڋ6lX��氼@.�0Y��,�(
�"[��f���G^�N,߃H@��]\�
K"쨑�#��’��V��L5�h>^����� X����#@&?�@h�2
��Gƶ��=�ΈXG �5�6$'DY�3?��dZ+��-�g43��S2�Z��Ê�)���%�iv}�AX���*tB@���F"�f`_���Bn���t5�?^���F���R!w�P���X#���C�q��o5,Gzg|ˬ�aI&Ҝ�_o��'+�X��뾁�ƾ�4���@�5�F�$�y��֑�g�}R�TE�#�Q�[_%=$Q"&HO���'N���Z�9����X4��a	����g�w�w�{�`#�c�L���c�4n`��FD���a���y㜉�?��~6���Q���0s5@H���)�HgdH�:��x��_[���Z�hM��'�#�f�q%r��x�2�ɡ�J���KH�A%��H�'�V
{��Šd��n[ǧw>�ur*�:p͟`�[�05ӆ�3��0�HtO����H$6��|c����QP�,T1$C�!P8d��b��{	jp>�}�y��{eݷ�OY��(�9���`ۓ��V_��b�{E���ƞ9PV��ߣ�Y;;;�UZ����>-�:;�_jyX���:���|u����dvtxu���Q�K7���j���_��s�
���{�jvq�zv����������]�\<=;}�zqxu�͈w��l�f��ț�l��V˽^��O��`֔M��U��-:+��]vfuzw���׋,[8��S~߿�X߅�:�5���jߧ��pC�+��F�ݽѬ~�6EJ=S��n��]�����T�˵gU�/;�ݗ�l7\�"�{�)��t��>D�?�*`�|�Z���Ǧ>_WU�:��rپ{�n�4۽�u�V.ۗ�:��s��>H{�T�������Aݺ���w���v��W�OѾ���䉑����ա}�t?���y��;uA��e�J��*�i�t!m�����~�>�l޾8�{uq��X�H�պ{;�mZ���,+���	H���:�t�u���2��j�}��s@�Ef�3���YW����	�����S�Vվ�;[�wF@ܜʏ�vT҆�{�qs�`<�Ȭԩ�FZg#Z��J5%a�G�^��l�{�Dp!���!���0�?4i�Z[:(9}�V=�n�*;Pꗬ{����,���țݚے�z|h_,�y������Oe�w�GG#�S�y{%E#iQ�F�6u��O��[��^�g�,nC�V;Y���yqR:d2Q���W�M>��ucU�9S�Y�,+��yv0��aoKFѼ����E��8��G[�L��B����F�M��;�C��w��Y��{�7�#���,��?M�<��)��xbm�(���KP��Sm�_�튽��a��)cTb,
�:8�~���~D���N�n�i�lr�u����h<֒�2��?���C�WP�ǰC�B�=��c�YV����"mR^�{��rk���άe�hS�K�d����
��䕮���j\�Qe���ɦ{u<��t胍V��E<���>�?��H��}��IO?oS����u����F�־q�xnw�$����Y�޵����������Moÿ9�t"�G�
Wl�N�v�@�~o��p%��i#���c���8��v���sǠ7�-�^��&E��D��GT`7��[���#Nvߢ_�;��U����(t��q��y|UiW�����'I�������&K��4�E�-s� m�i� @G9T�\j���B8[��+Ld6գuyk<J�}���q��.jc1�	%�xq����~~�����x����?9~
����-D�L����tn�	���$>���y����PKE��TsJi�_r�)pip/_vendor/chardet/langbulgarianmodel.py�]�Ev���({�ʬ��d˶$[�X�Ev��.D
��vw	$� �a0;�:��`�}���'ȚGГ8#*Nƭ�;ogDevu��(**nd��S�ވ�ccx��>X�a����p��w�6V��6O�����7�������ƨvb�vf��¨(���ё�JuϞ�j�}��7����o���]����j����o�}���3=�n���|�-�.>p���#�n��pm��Z��wy�V��vu�j	�3�fk_�>AO���h�?DO8��S��DO��~��^��uS��i�E��iM:y��u
�@:�j�E22��H'm
�LZw4�
�I�_�N��JZ����d��i8$_�:iM��
%��7�HH'o�|�ۤ2'�&0�oLF�[���Y�d����>�L�&}|H�N����4����dZ����h�S2����A��I-
AZ�AIжn��#���&����M
K&U�ߑ����I$��kx)AǗ4�'z|�X��t�����,��&�<H`=y����a�Q?B`��gd�z��%ѐ�|���'��?A:�ݘ�\[wr�b�{���t|1�����I޸�y�F�h탼�w6�F�l�����
�l�7`��� o��
x����
� o���
� o�y�Dހ
�l�7`��O�7�i�j�7�i��L�7�i�����
8y6��Aހ}�7�\�-X���ک;�Q7��l��S7Zԍ�u6��ԍ�٨p6�F�٨��Q7Z�
ؠn�u6�_iP7Zg�n�u6��A��\ԍ����A��i�jP7`������#u��A݀
�n�S7ZOS7g�nt1M�a*u��n�uC�ԍ��t7�\��'u;�݂^/ΰ�6T7.�A݀��nu����n���p.�]z궨n�6�#1��3Q78Ƀ�N�L�yT7ϥ��IՍX2��t�N�L,�]dS�<�ĉ�n�S7FbP7`��e>�N,J��ۧabQ�<��̑��2Lx���n��m�n'�	��F�w&�Nw�=R7Ku��l�mq�-ԝ�v��4u��v�S�N�_����I.�v�v'yJʗީKp�ԍN樺�I.�F'>�nu�c�Ң�-���L�$*=R��킺����n���S�>�nK��<�-���1z�n�^7�l�]�m1L,^7�0�nu;1L��n����f�)-�
8S�	Ou[t�Cu;0Lv(u;Q�h�Eu7�&�
����n���Sݖ4%��#M��˓�D�\iJ��v��D�L��B�h�)M�/�_y�%MiQ��i�t궤)�&`�l�	���gKS�T�-�u�sGݸ�>�nu�n'�	Z��0����B�h�����_�_Xx�p�4%��#�P�<���m�n�a���nm�N+*M�Du����n^���u�u[TwiJ��f�)]�nԍ/�Qa��f2Lv1u�T��'�M��{]��.���g��A�N܁ټnu`��W���L�
��Vם���f�n|����e6L,&`�\�	���tB݂�.ΰ��ݔ�p�	��ӔN��P���I�ң���0����U����b���nP�"��n����Ł�����w�a����u�Ҕ�0)�a8��ͪ0A�y��b�XҔ�nuݬ
lW�Y[r,��B�N*L�&턺	�l�*'ԍN�X�]u[T7��ĉ��u;Q�<�NWݬ4��.�n���K_�KS�,sq�`���i�@�<���Fx'��b���4�?��u;��fm�w���)KO���nh�M�dg�a�KS򨛗�,=u��HSzT�.�=�,�v��Y��Q�`��+Lx�	�l^����3L�Ɂ�2J�%�B��ͣn��W��gK��q_a�N�@=����>���%'��:���ؒ8�&h]ޓuq �*MY�Ē��Q��0A�9n�����)y�Iz]���n�G�C_�Uw:u{KSZT��0�Q�Eu��Ӕ��P�.$$Pu[Ҕ<ä�F���0q���i��?M9w�{g�t@��I:u[�n�i�nK�Ң�}Rw�Ӕ�n�F�	�q6�ۉa���Pw^���@'��Eu[�iJԍ�yvS�&�-�	�U,����,��Eu��%�G�N��v����S�.*M��Y��˓�tb�8�n��I�,��E�@��0qb��W�2�0�&<��$M��iJr�.�Fx^���_����o��P7/M��u[Ҕ�T7oKNz��Bݼ4����Ӕ�Ł��nt��80=Mi���U<��g�XҔ��U�hÄܨ%{K`�˳%p�)1��
��ڒ�P^7��;]u���p���Qwy�n�a↺u��ܑE��S�N������3uc���'��MY�f��rP�N5L
��>Ä�z%;��<�ۉ׍��&�s�nuW���[rx��2Lx�
8����C_k�1L|�)[����c%{7��.��vb�X�p���Iy��������&���g��/�[W���ɻ�^0�F늺�c�{���u�*L�
�ž%�'ucx�B�-9�Y@�&N�nu.��W�-��(M��P&;Cu��7·uq �=��j�I��%M�ֹ��I.�m9��gq����Rh�0�Q���@���ܨh�Z`&�m�E݀KK݀�/lk���ޏ���n^�	��-��	u;�-�mQݖ4���w��P7f*S�	�)u��LiJ��g�X��c��T�ͣnt�+���}%�(�턺y��O�v��y����y[r*�ε%���Y�
8u�o�Oߒc���w&u���8P�%deۏ0	��W��V7������07�JtO��7S�$�[��
8S�	�Lo�a�`n�َ0<��@3e)ӏ0I�4�&�ӧ�
�`n�s6���܀}07����z3%Y��8}�"�}Rw����Gݬ�-�mݬ3_-��颛w��Et�N�J�n�&�~	��AS�D9���[��w�胺�^J�X�!�yvI��efn\��f�t�]ds�Y����,�man��v���v���+
�07�l��
����C��$�ҝ�]��HݻBt�S7��)/Z���NORz��O�&���>^���;���@[�d�U~IE݋Nݠ�L~�Eu���bu����n���:����-IJu�T7��@'�ۧխ0!m'�V�]1w9�۲�_�Ҳ����l��{��s��$)y�q|2w���,��/��{a��"�ө�痰�n�_��+rXEݬ�oE�Nv��<�����^��VB�d�T~IEݻ��=�z�/Y�]�_��R:9���+r„��"qW_�cn�v��0�e;�O�l���ܻ���*�.#s��/q�r37~��II�C�T�{a�۲'=I颾�w�Tz���	�Bݖ7�pJY~I�kX�
��Ja�IJ����/Ѫ�\w�~�e|ԍ�TԭF�p��*
�՗�o��Y�.�Kv�~'~���-���{)�Tu��n]�M.pQ�I���R�����&%/
d�_¢��
9T���-����B��Ġn���^�f�^I��.����+�='�f=5�,���Ģ�l�I��ө��6xu;1Lv�^Jmu�KV՗���q�Ṷ:q��bu��RZ�{�(�-V�����D�%Kiݼ,�O�퓹��&�ڏSz�4wV�~�E�/������/)�~�@��!���u/u�����IJ�]����$)�~Iy6�[D����䥔t�+殘{љ�,�{G_�yǂ�%Ot[��"�Kot'uә���b�Eg�<�Bs���9vI���W��FKkt'[��V�]1��37Ks�`��l�/�A�<��<G��A�:[�Fʊ�+�ƴ���@����m�t��]�N|�(���	5u�i�TwE݋N��9J��r��’��*�Iuc�/��(yg:y�o#����J��0!�W�����I�Ս�3���/qa�X��;8��AyI���+/�I�h��W�ԝ_B�TwEݻ��K^�Sݬ���UwIN��U�N��yݼ�^A�^�{
�&U�]Q��n��va�XҔ.���Ous��
8����0�n��Gݺ�������8��f&�y���oQݜ��t�v��y���0��n�ԝ삧c������Iݖ4���Y��#u[�n�6�p���骛C�>U��0��nu;9�ۉah�MS�)+�^����@���@;r\:��Zv�X0�f�nK]����iJ�uWԽ0�
4���Gu�v�n��S��A=94.���Q�Oä���t_QwE�C�՝��b��vSZ��u�Eu�Ξb�)�
|a�_Yu�<��;{ʢ�y&N'ŁArV7�:�n��v��e�X*LX�=w��B��^�ãn��S��ZvS�T�O�n�ӧ�*�]Q��S�?���y���
Թaԇa�x��B݀� '1L��p��wWܭ���',
w߻g�U��Sp��J���Z�v���F��Y���V+����??��k��Fo�6X;S�Ϗ���0�66�3���m�I8���Ξ�֮Y?�vzt�7׮U�����S�ա�lX�g��"?([��֕�g��pm�w��&�}�魯���;�ڿf��}{n9ql��iu�[�o;|��8�|���/�zl���o:^�_�(�A�n��<��'�L��
��p�6���mN��	ښF[�=��'��4�4A;�hg�v):R1�К
\S��)��Vp�v��@#4�l���P�tp&x:�@�p0^��8�N�j����I�c�,��1j�����y���D��Q]Q�lD�f;4�T�Q*m�0�T��0�T�ݐQ*'�����HaM��UX�`W)�M�?V���Da��@a]��z�侨�vר{% ص
�q���h�0�u
�q\�0�
�q�Pa2喨���L��V�`j����5*8hL��V�`ji�ZS��&�Z��%��٢�c����������
��c�Չ�O��T��0z=�ZaqKK耂�0��tPAq��:� �u���ݨ�8�%�M�)Ŧ����&���қ&�Ⱥr�~��8�%��[$�Ž���Faq�ɿU�p��j$�ǰԞ@G��UzTAq��c��E���'
!tTo�0Bg�WXBW�턂��ԗު ��T��),�������UP�y���U���„��Q���!$cP�O
�K�F��ɓ
�k�_F�ҿ*����
����),���Ƣظ��V���+��u<��qm5+��0����a�Օ�î.��@]�3�z��O�	0��������S��ӭ+�.�bQ��V��U��}O�8\�Dı,��9&�U�>�P�o�w�q0�7 ģ����&np��$2W����Յw7@����{�Q��?P�$���
o�@��.�K�?�5v/@�� }��<��uvȕ<y��#�n���@�4�db�G����
�!��oo�و��&��o�֓,hg	����"�zo�\<m�:�p�ĩ�x!7�
��xq�I%P���j����=(A]Nj��� H��b��2�x����$�.�_*� �����*!H��b��R�x����$�.�_*� ������!H��b��r�x���B/�_*�PNj��*"��b���u���&Bo��E���7�u��<y����"T��T�I��*B
�D���	�.a6`'<T>��ࢇ��H>T�@��"�R��7| �F�P�=
T�����������Lf
&h �G�D<T��x��q"�'�2o�@��ĸ�G�D`�(
�I��Y�q\M��8,���E��ǟ��4��@h�.�ED�K㈚�����0!��n�T�h $I��*@��6�@����@��E�9gL�ED��7�5�����Eo�#�ch �I�0@C�N��g(�I3�@�O0�w���84��ϿP�����8��ᜆB��0�$�^|L�F*�4"#��|(��R�(�S����BiQ;:Byt��I—�C ���h���P��
�L����
�X�}L<����)��
�FQ	O4EG4�%jvᇆҀx��u�@š�4��PZF�A(����b��၆B��4Jd	�s�" �x�Pj�����46t�B~��4ڣ�Z&nh(�G�S@EP����@eT��qX-\�gʛq=T�c4MF ��h�*.Xu�Pq�@-cŠ�T��K@�O0��/�?�0��%?%�@9S��U�T$�c�wO��z�؍7����Y��0��Dtd��_�F�&���hy�w��o�����[{'	���ڙs�3�?<�z��1譩\
��+��峽�����;���Y1�����Go�z�pta}p����>��w��7����~C��m�?�d���������`y�?���V7�����;���======�"z>z!z1z)z9z%�e�j������������o��F�D�F�E�GDFEG�D�F�E�G_D_F_E_G�D�F�E�G�_�7������C�Ǐ�6~t�����t]�g������'��_8A�+�r�+g\b�3^9����	V9��r��ج�qV�U9���M�>��'%f�|�㖾r	��|�����KZ��{�����-z�����r�r	��|��:\��G<��W��t��h�!`i�i�k(�XHW.}�(�aD3Q>����|��Q>����|�'?�a���R2���h'a����Ll���A����&�@7��XK��`\�V@��+��4JA�̆�õ�Bex��k~�c��;�k����Ok���ٍ��pbu�5,ljэ5�P�܉K?ms'#|\�`��g���5�����ނu(�B7�0}�`訑ma}�%7���K^����]��jҶ�}�\nܨp�'.����������������@��F��BI,ap	)�Q-�>(Ÿc`�=�'Fu�8H�Oޡ��g@���9P�m}�I͞��V��$�n�-�nwbm}4��~wb%9����;e������Bjc&� -o3� ��L
A�����������Pf
AZ�f
aby)iy�)iy�)�x�)�x�)ix�)ix�)ix�)�x�)�x�)iy�)iy�)iy�)�y�)�yϤ��I!2�B
d&�0��"� $�L
!�?���� 3)�AfRd�q�B�{���� f
A*3� �f
!���0S2o�d�9RRu�)�{�)�8fRRo�)�6��t���4����f
A�3� $��Bh6RRR_�)����@���`�&�u"� 3�0����f
AȊ��3)��I
AH���P4�p��E���V��l^/:چӝ��ݵ^��PKE��TIC[���%pip/_vendor/chardet/langgreekmodel.py�k���y���`���[K!@���֖ŵ�d�=�e)-,�^-�\ʖ�u/ő�u���؎����!vb��\�~跂�����}��S�;���h�w�x�`0�oпX��m�<�o���]��ၭ�꿶����Tz7��a�to�Ǖ�(����x�__Y�[��|������?�+�z���W�vV��Xǟ�+'��ݨ���SG���9v�����'9VY�l�T�5�fە���>_$@toK��w���>S[���X�5&mw~�:w�:���\o���z,?��f�<�Z3�)�w-��f2k��m�Yֺ�?c�tc�9ֺ��3�������ٞ�b�E�I;�_b�0�e�	�_a�˯���&_c�Y9�3�����l�!~����y��d��wc�a�{Lf��~,���|�Z���ɱ��
��Lf��/��:��X���l�>e��Z�+�e{��X������&�c�%�Y1_�k5V�f{�Îz��&V�]��h�~��"�b�p,�G|�C6�z�u��GXc�A7�яX%��"���cl��D�(7�я�̪�1��-�?���4Z�X�0�Z[�\�![G�a�q�\ ;��0� �놝LW-�-�';X�]�a3�0�m��Ê��7�R���LW-�-�щ�û��f����M\������9���0�����͊È	�v-���O�0����p�G;FW�Ð
��ؽi8\��0���aw
�I��|F��k�pX�n�&�Y[[G},[.!pr��P�����rq]$9�N���9\�s	����0N��!�8�_�Sq}�89�a�)CNqr�ÐSF9�8�NR���0��!�89�a����a�i�0,n.��$���8,��0x��0z���I�&��Ì]�s�B~�{�Ð�a���Ѻ?��Z?,̗���0�\F��0�.���y���9�s:����ڄ�R�s���a�F�8,�at2C��|���?,pXx�����2p���KX��p���簐K�C��Â�l�0�EqX�����%�8X��0v�C^V?����0�Nq����S�p���a�|����\�s:���0Z��0�3�F'�p}䚷�cSB>,��=#�a-g���|	��sȇ��|~x������8�˘/!<�C�|���?<c��|��HŪ��%����֬�K��s�%I�o��.�9]!���a�s	\zS�s��N�ð���q��\���K�qXk��B�M�XX����K���2s�B8\�F�S�[+�9]6�yN��Kㇵ8��u�a-g���3|N�M��.·��z~X�?l�����͗�N�F�e�����I�����4��x�c�.�p����|	��!�����D!���a���4o
��y������p��M�����r�qX��B.Q���t�?,pX�%�8���8f��];o-{��n�^.ўp�]��ÆsxQ���as���a�|�?�֋�����a�frx�~���"8��f���~���5C�?��ާ3��a�ːK��a���a�C�j�����:]X�%������aa����8y��q�%��8�8y��g>_B�%�F��V�s:��8`eg8X/�|��_��sx�Z��9ݢΗ���z�K�0:Iqr�\��%��%Η��0J�㇅��
��z�0ZO�^�^.��S�p���]y��aa�p����̇�0X��z�q�⇳9\���p�~ؔ\Œ��	�^�K.���q�Kl�8,��9pX�%�9_B�0dcח��p�% ����4~X�%��p�s��\���q�?����õx�0��dg�yA9��ḰÂ6>�(����6�=�s	�����ur	�|�lޚ�a!���avј�!����0_B��}O����	�K�alr�\��9�ṄV>��a��?y��Kx�wB��a>��ց��Ð�X^�9~X�%?y��֊��b�[+���Kd��8�7_bֽ���p��%�v7��N��G!~XxN'����z~�0_B�p�~X/����s:v���a��_X�0�2�OWH.���2s	c�0�e�%��0�)�a�S��z6f�a'�0;���k����8��!��aȻ1�8�P���9�|	�8��%|�r��q@.�{͐���k���a�Nqr�Ðg燝x�0;���[[��0_B����]$��h<
�?<sgϗ���a7�;U��c9l9<���!O���T�D�Khq},�B�q�g�K����9i����.�p!~��\Bx����h�rXX_B��h]�'f'���-��z�qh}���xX�.!`OmsaXX�g�Ξ.1k����zvX�5!���[c���ÖærX�,��a�.�u:�1M<,�Z���-/p�g�:]y�vr���8��Z�Of����qr>g�a=~�g���)~���!�a��B,y�ך�8�`'��尩^�=�!�a�C^V?,���a=C���x�v��x�b�Tv�������J�����f�^�xX��KV[�g��s��a�aS9���Z�^n�MY]B�C-�cZ��at���N�9.��6�ÐM�=���}�}�p~Xg�p���v�p:�g��k��尩.$������Ø���&��f���E���[��BfKd�a�E����xX��)vXg�Ĭ��2��;��a'�-���Ö�K��gKhqX���3{LW�֊%t��c:��zE*�;�"���X[[G}�՛�Ł���0��p�G�
�p����acb	'~���]�a�KXO��s	�C64�<M.a���{�C��&p��\B�m������%,�-��>ʍ%���yJ��3zJ���"f�gS�p-��lTw��6��v���=�[8\���ő�m���l���6Ð�Z�'���2]!ֲ�%ΖȞ<��/�	k��ӼL7Yj��u�æb��Tb�nX/�0<�TB�p���ܰ^*Q�d	�%~&D�Cb1l1l1�Q��f^��r�:sք�f��-�
�a���T�oS	�aS9,��퇚+s
���wi	�e�ÐKx��9�0���a�aS1����짬n���K���Ҧ��>.��O0��1�Z[��[R�"�p!Sֲݰ�a�
�Yc8�
�py6�
���lϭ�6�Å�a�)kE��z�Cʶ�”��J@�m+K�}IH%;?�c�h9l9l*������a�7��u>?��I㑞���a�3�e�a���M�b9l9�`.1�
�^YB���a�a�
?�8�`��6��z���G�����pds�Bg�!!�@���g���-�-�M�0Țo֚�A$��5k��|]��!=k=����P)��ÐK��LǺ��6�Ðg7{X��&pr�ø{L��.;���s:c�;�z�{NW"���Rk�����.䰐K~�ĕ���K��y�-���%?�7_�ǯqܰ������<Z���z��8�.1���ٹ�!�K@�k.�������5��ކ�V9w�;������BwXY�U6�Ê��5��6*�A����8_���ѿw�Pw0�u��9�/
6"9�r��ų���-��6�
/u���ƭ�m�ߊ�=�Ug�ʃ��Z��8T�W����Pc8��wM�!��r����v����u���[��{��'�=�q½�=u��]�C߻�T���9UY�lG����7�3�����8I��nRu�j-���j=��Ǫ�T���H����L�ͱ�J�����*��g�^��
S��%9U�9�k������6�j���dq8Y�C#�$�sh��vR�1v�ϡAv�5:4�n�F���M?���MV��@��*�6ɩ*��&��4�n�Jm7U��_�*i�k�*i����#BUH�1�wH�3mi���`���d���b��֎�=�����*kw]+�n%�����:��4^�m��:����8@��;�EuЭ�N�z�it�zU��i�9L�s�s�
ԘFg�Wg���[s���L���k2��H������=�x�1i�x��Əǟ�Əǟ�Əǟ��Ѣݻ�$5%�J7�;HS�~�D�C��e�I:LRXE�5��*�3�������Nc�%M=ŭҞ|�4u/v���I��H�9��4�QV���H�hSw�H
�h��'I����ia-�xO��"���}����� -����)��Z���$�%4ho�&)�����qph�IZXB�6p/I�0P��"I��*iM�!uP�ߐ�O��%��Lgΐ�Ϧ�#��MO��;��H�h�!��2�t����@���^5,�Eg����F�ix&��Bgnwհ�6��yha-���*4R=h�`���������:H[��
�����}XH�6<1a!�m�4ig6�E�5�'��"
v@���-ha%u;�n�Mjw	��4�$>1:�h�AQDŽJ�M]U�@TׇC��!�sk"?��"?���O����g.7q$���>�dvw?����`�W_���7��~
��h�2�ZB~r=!�
�KȯAnd�^3�h��l�N4�v��ո�d�n�Z�T�j������<�d}/BN«/AN�0��c�4d'!?9�D/q�M�ά�K�gB���fA/�MX�3����M��#P���~"��v^��/��7��+p�M���9������P���y*w?;�8MV\\r�ߴv�m�mk�2�dtp�h&��*/�۫�BNT�ˬ���#���>�����!Gy
�N��AMT�	�Du�BUI>q���E�D����M�� ��5q�<1QחPú�[���J�Ea���*�_�P����~5� !�w��,��ò<����ut�k[��:Z��V���pd��h��O!�U�S���\L<"]Wَ��{bXRzbX
a���G
��"DU����ė!�� �Q�hD��rul��)�8��&�-7zR��^GS�a�߀�Tǖބ�ν� �%y�0�U&��azbX�����ŌW�P�qq��2"��$؍�����R���(�CMBT�7\��/�zq�4
��!��)�	��
I=�s�����u���W�dA���AT�i�CS�`�_@T��}	1�H�W�z��kh�C�o ���4�~]e7h�����l��A��*��CH}]�4��"�u��1�5h��ԧ5��c`3�!�c����*QO=qs#w�"~��[4 >1,�Ic>�7���Duߥ�Dŵ.���K�Z�
Q��<|�Xe�r��q~ݿ���W)�ix������R�-���^�W�<��X�?��_u�g��o��q�R�|��G�?��u��N��:����W���sQ���ݱ�O�����f�\w�����
{���ʢW��-�2?jt��ov�[�z�κ?T1��w��[��o���g����z�h�X�x�Dp#�I�d�T�t�L�l���g�s���σ�����W�W�ׂ׃7�7�����w�w�����������_�
>	>
~|||||||�ftu��ã���]�h������n��u��ʝ�OvZ-��i�x���o�x���L��6i6޶�X��^oo��܂�I��[�<��{�'u�oՠ'}L�=idZ�i5�'�L�	=�eZ-�I3�jCO�ۅ��V���W]=U/��z�^\}�T��z��6ƿ�����'�mc���z��z��6ƿ������1�^��6��K���{�z�/U/��KՋ�R�b��T�/U�����<ix��A�v*�;����'G�@�ۇ?�<�D|���B��8�ڍI�'�%e��e�@��c��j�h��o
]������M�0����8
�_PKE��T\8R���&pip/_vendor/chardet/langhebrewmodel.py�ٗ��y����PI(%�B�L&��Xt��!�0�N��
��=M��D9���gk����%+9�$�-�3>'/~'����.�R��4�S�"�X��
���E����zcg�sd�t0ޚL�\�6�n�#��������r0m���L��ƅ��vp�,8���`vf�lol<�hm|c�;����?�G�GO۷��GO���'�h�lpu��8u����=���̹'O76{����k4h���êډT1W�0U$�V���D
X��D1�s����m��u��'G6amE�v�ڦ���Դ��"m{#U����.�z���_���K�_�n҃�뤛ʟ�������N;��)�H�ʟ�N�����~��3���?a2���#�k���ݟ���S���t���J��_Y�i�ᳩ�H��Te]<�>0��Ti���8��!|�����.Sӳ$���/�֬��Y�T}�5fu��3�56J��:k̺~��KZ����&�>��[Lf�6�Y'ﰾ�P��Z��z��NO��}&�j>`�t�r>Le��G�q
���
K�΄��{w��N	w���V��g���l�=֞�m�c��g���I��8�N�/�loif�\f{�������ٸ���f6ZW�ِb6䥘��%3[�ٌ�zf{��|f�\f�K3�s�^f;���
uM|vq�N�Y
�-�w[
}��4�M��|�����K�l�}0�
�1�xf�X3f��a����}�2�_�g{>;��&>{yfk}�p�v̎U��5��	S��ى� �]av��4���s����l$�g{����F�
f;��=W��b�-����0��<{yf�g������l�l�1g���	���Xf/�g;��M�|�c65���N֍0ڵ���z6R�u#�َ����M?����3H�5;볋b�[��=�q�v̦Nj��/�줽��$�f+��� ��Sc��Z?���l�l�^���$>���*yv������/�ٞ�َ�8�l���k����V�de+�g�m��E-��Ƕ�]el���ƲېlC^d�TېlCV�
9�m����G�P�6>p���lC.b[
Z/����rjA��-a[�g�>����m�ڞ�=�mm�y�u�6.���i�m�k�A;�kA�hC^
ڕ��F�6��+�����}�Yh{�����m��9m
�5N�H�W�f�H;��9hW�P\�m�P�m�xd
�-��w7�i���+
m��Qd�Ɂr��k�3�pОO����mt���PhCV�
9m�YhCU�
Y�6dڐʴ!+І��6T�0��<�DkڐhC^�h���Z�6�,��*І��6�jC���#��4a��6��6Ui��V�Xpښ�#FN},�h��ﴭ����^���&v~�;hӄ ��V��8m
��v�K�4І�jhk����#fK�4N;?�6r�X��Lv��]�%5����N��G�z)h���Gl�#F���#F�nA�(���!/������#���#Yh'"�E�Mv���ڐ���
�m�i9�L��ik2m#hk2m#��m͒?3hk��&�F�Ŝ��F�G�����A�&�A�A�4h�=���8m3h�o�,��L�]��4a��G�@[�������#f��ꑵ�G4N��G�~̡�G��Mv��6�Ŝ�h�ȴ��6Z��?N�*ж�8h9���#�BsЦ	s��8m�Z�]z<R�ꑪ@��i;h[������i��͠]~<�Vo��A��N;sM�/�ro�+0I^�/m��UA�im�[��D�6�
ڐh�ڐh��8�Š
�(��U��·�&���G�vDj��V�T���qЦ	[����6:Y
ڐ˴5��-8m���=��6��#rE�=b�!�w�,�V�i�A�&l�
�.m���g��k4�6��n�5�.01��Q<���&�m�x�ښx$��G��#��w̦�����̆\D�
R*̆�z�m%1bv~:��
�!+̆����
�!+̆�0�B+� +̆�e6T�ِ�̆�0��l�
�!/�����lȋ�#h�0r��PfC�2jA���N�g���#�6e�p̞�]�]f#_�ٸ�֗ٚDۈ�kG�d6��m
�5[kJgv��j0�O^���dg�i¾�~ա
T.�h��XI�5�:)�hkVi����)�hk�i�mek��c�"�vՂ��	GD������4a�hW�iۀvE���&v#h��m�*�"��qښD[�J���#�+�������/2�f[I�5{�!��hk�YY:�F�.0��'�fk�BV<�֥#Em?����~���6�]�S������#.�^��|
�a��SH�Uev�>[��Vmv��;���#�y��X�I���F�8���X�I��7�A]�ZVF��1���"7�����M8"Rh��A�&�bkGV����z�uzY�D[�5k��CVe�ȪC�֎��;��i¾D�]�ǐV��^�iC^u<��wښx�th�;m���<��D��
y!h�oa/�1�-��0�}�c6��:F��m%�>�KG\��"m��"�t;;)�i�j��r/��@�W���h��kG�w��m;ء.����kG�v�C���C����v
m6��4a���
"m�t���#�G�6ґz:�"���HG�D�EC;ѕwE%�f�;f�|��1$hV7f�td!fW;���J�]�ǐ��.�H�w�=��U=��+��@^���#P��jE��@����~6��k��@��nHM���`g3�M�U�E��h�����`�x8�1�fW�hW,��-�l��i�V����2�v�z?#���+��!+n�5;k4F���ȥ튭�"m��i��c�zn�tN��N������v�+�N������6MXŶCZ��fg���v֠�U���8hk"�@��v
��v֘��8��m[�!�x�
��6Mؗp�V����a�*�m����#6�]�=�f/���A�OD�qtЦ	[U<�2��2m�����V2m�^fk�Q��>
�Z�ɴѺ^�6z�H<�s��7��sЦ	[��#f�Z�+�ּ�O㴋{�_��͋GV�i;��mM�-�fムqЦ	[��Ӯ�ӆ��ӆ\�M�PKtڐ��Įq�h\�a��#��6�4a�贋|]TU��&�.n�كH��ˏG���v��Gl<�̇vMV��N���M���G�;���v��Hš]�%�y$q��>�L�͊r̦��"f��̶�xČ�@�A\<��˴!�eڐj���[�%���=��U�yD����h����A��l����ƕ�@�{%�]��.�E.�6����#6ґZ@[c��ײ��ț����reÑ���#F�v�Cf�6���#����h7�M��#��E��}Y������r�^=�֥�z}��L[��t��2m�^f�ѫGl9mSj'����/�������K{m�Km?��~.���v��
���k �����ޚ�G��5��H�V7���%���R;�kj�\jG�u�v�>�ҽ�f͟�kC���F��zm["kB�NJ��-��v	I
�m#!1��P���vu����$�kC�6�۽������6T�)�<!�Z7jC�������S����R[�YnB�Om����'$��5�v�׶Am	�:ymMBb��f	�����XX������i�����8�j\�6��̂�ncvm8kl���ɬ����qc6�ƣ���,�5��}t�N�����+�ٍ�8���۽}��d���΍�ٍ�l4?D�N�ݸ���Dv6iܜL��(��H��!����lu��<��S��pgG�������ݸ���'�]�0Qq�S'��?yqp�ԣ����;���fc/90�6���EVs�Ϫ�\mf��\me��\mg�\�d��\�f��\�e��\�s��D".�E"��R�e�����e3��B)�n�B��I���	p�:A#,��	b���4�~v�
���Q�(��
���?A��g�4�~�J�'Y�����TI��+U�h�J�䀚J�4�M�J�f\%-_k��d���b�!��L{���~��.������~�:|(1�I��ZL{�4^����c�x���x�4^��x_!-��XI'k��4:S���4m��9��
4�Fgg��4:5�]|��lw�F'e��4:#�|>������{�|�)i|>6I���g��s�|�iQ��\z����>���UѥV�I�����IQ
}*�$�2*�G��$E�s�1�����)��������H��GЁ�%i�^.�3�NZt�=�N�$��
?CRt�}�Dϒ��s���t� I:8��H�
�u��y�����IQ��q���{t�O�&
�G������"I�N	��4i�=*�o�#M�����4~�=i�,�t�D~�i�4�&i����/�$-����	�Q]*� ܏��dsC�Eet��
/*�E��[��ѥ��}ΓsA�]�&'�>���
�Z<4|�1*�O
���Ѧކ&�{w��ܷ�;�,�.�	�����M��"��oA�*ig+�ߢ܅UҢ������M^����ТB�tJބ/�
�ӵqZTH�
�
M�N�Q�oC�'�D~f�3D~j=��[���3.��b��==�{��{�� K�ҵwv2�VI���w�U�-y�x��=U^389��yrT\KMb����{P߂*��:�߆,~�Pe�^��'��
�뫕�Dr?�E�F���}^����ESU��y�*'�8�Ԩ�^2�/�����/=�@��ku��5*����P�	���|��4��/@�wL���ƵQǿŧ�ɕ��{�q\\W).~�
�{���;�S˹�$�^��TUN��Α�M8�$�q0�B�qŦ�NjPG�@���P��Ù��ǐ���X�UV��i'�t���P�{
�GP�z�_̅�
��>W�Ty^B�O�qq(���n2>�KH���1�7ĸ6�@�a�~qyI� ���jL��gP����Ti#�rDыKÁ��,����'P�y؟�S��lB�TY��}\������o��I�D��*/9��K�r#���M!�E��9DYN�_C�ۓ��SHѦN�v
i0Z؎����G�t�*-���IDŽ�SH�Ѥ�E�)���!���� ���h�"��x���lt����Y����A�
j<QP?�O��5TI�&�ށ*˂H�/mG�*@��Ǒ&5�7��.ܿ�O�J�cZ�O�����Ϡ���?�B�+��A�������
-ul㰁n�g
�����Z=U�k�j�F<U�ࠣ��ٗnC���^M��%4h8�~�-�>۩��ُM]@���xw>ė �$$�e�,�~Z�H|���A|
�􉤽-�;�o@��A�oB��(��xk3�-�����WT�%����Q޳0�A��N��!Ʒc?�(B�!�_EH�Z|�"��U�����ſS)�l�gL�\�1'@/�밿x�lp��3�Q�s'N�nl6.��W��c�g�c/�3��`���3����xx=�<ts4ޚ��}D�rh��p{8�zcx5��S��ip�d����`2�
���Ý�7��7�.b��~��c�㝷���]nv&�����`0���w��ky�_�=;����h��d���n0���ε��`�y(�N�\�|�B�b���{�K���+��k�����÷·�w�w����Ï��������E�>��;PKE��TCcU��)pip/_vendor/chardet/langhungarianmodel.py�o��Y���S2`l��z�
Ȓ#)�VF�b�e�K�f�ݑ,E�#�'�q���'$����bg畿�>	]�TW�q?�鞞��7��J��Tw��έꚗ�Ƿ{ýg��F;�g�����&�\�w0��폯
���{�I��ptcw����t��W����c�5�������� ��:Ѹ0�5ؽ��<Ѹ:ڥ?�����~��ع�[gO]>jk�©���/�y�B�d�F���'����z<HOͫͰW��&j�i��N�։���3�(�9����O;=�lg����9GMڞw�
l��8m۶�g��&�z�i��v�Q�ڶ�:��%GM~��X���o�^qԎU_pjK~�U��dt>�mY�wU�~?�y{�(�n�9M�V��Mw�QmӁ�AR��N����M����ڳ��i�t�DM�V"&'g�9��4�v�֊�DLn������*���{������5�;N���u�JF�Ӷm��������E縒�6}����b�e�9���t���MG�%�םND"���A"���s$�8r+��uF��Θ:��wd���Nd"�v����N�������{���S�4]��U�Xy�XB+bA, ��d�XBKbA,!��� ���Xz�X@bA, ��@  ��� �*?��� ��XA� ��8� ��XB�I�b��@L��I�1�s V�$ρ�:�1�s &y�$ρ��9Kb�� �}0�Q���A�1���b��K��#�X0�,��s@�p�b� ��8�b�A,�q���~��I��q�@��눅�#�ф,Ă�Us��qA����Ēb_G�V�E:�"A\�#� �l|0����F̉&8�� �d��W!#� ���XB{gā�#�фD .&#fD
�X2@\rF�b2�^ �p� .2#�q���e3b�� G,�Ả&8 ��&�#� �8b��9�D��b�x�3�b�4�A���x	 �9b�)h./#ּ{0���'���;�r�	���
�G�bU�+Md��:ф]��m1 �8�VMb�1^5���+7#�v�J��G,s�8`�Xz������L��I^>�3VMd��Z/���;+�s�	�#��:b�#�_5��� .s�� �ф� ���bߌX"�+bA�3bN4!�M�@\dF\��	M���1Έ��	�#^�h;bQ�#� ���RWM��;�g�E:�S'^q�y�D�@�`�*1��#� ^��k�5Yq�	bF4��3b�#�DEf�Ĺʾ�1���&ЃyU�EEĜh�\��|m���Ҫ��;�d��1�qF4�������Y�f1/t�ɺuv�q����3Y�3�2A��q4��o�d]�A\�W�3@LFy��:*�qĪTG\݌�����|��U�:�B2b�h���h��MX�V$�y�u�h�C v�Q�7�q�f�b�U�XBKb	A,�%1�&1^5��Kb	A3b�@�WMp@,!���j�Z׻�% ��u(��G,
r��EEU]5�A̘��uIJDG��E9�G �p��g�x!�8#��9b�|�A�fN�Gx��MT�Wv�Z! fDK��[AS'�͈3��e���"&�,�����i�� |A�����X�w�0�`�G�A, �� ƛ���d�^�d]�#&y�6#vn�Ħm� �D�#^G,��DQ�&$ī��3ļuċq˂ع��ش-}��g�1##.u����WMbY�#�Ă��;b�
b�d�W%�N
�����8�.�gQ�#Ģ G,*b�1���@ ^�M
��[������y�uɈ3@�M�]G�ܤ�M��#.
��+b�
boG�1v��E��}A��,�Ģ�f���[�:��q#�*�܌�?�((#�1t��X�bM`32b�b��: &����31/#f��rع�Tr�-�:䰀�$rX@�a�L�a9, �䰀��rGĂa�a2�9@���0N&�0���q�� ���p�8 �d"���w���K��a	9�_�Ë&x1�k�ݡ�sXڈؽ�j�m7�8"� f���7�%�� ��A��}_�S�x�	�L@CC���0�9Ʉ� ^�\�@��>�����M��o�5�A,�!�/�9w�8"�1N&j
b�z
/�Pe����	b�E��#�o8��k� V�	b�\]�����5義�i�� ƎX1�*�*?�a4��B �ф�#.(�� ��Ċ���I��I.��݈�;��p�v9�
qAq9\G�C�9�^ш8��++k�����i�� Ɔ'�1��+&"��
�o2!�X"㈸�dB��31��8����o>ClM��}
�m
b���qD�H&�\4�	��5� �7"���\� ;x
bӶ���:b�Ă�1��[�#ο���E8��G�g��qF4�r�=�{)�����?��1��#b�~3L&J����
1^E������y�7g⌈��a�2�6�p��Ħm
b��]3����	�Z]5W��k�s@�1��x#�	�3"b����T�s}�6mk�nB\�"bF0�k�!�+�+�q0�os�	�T���}�ùם�қ�r�8����e�]��D��9�:+����ai��ù��ĵ!�DCg� fxq�`�U�L��[uY2���:^0A+)�"&;�W�aӶ�)p����k��	�.]+��`��aC�^3u�0�g��kv��R�9�erX��K}�Λ��^1!~�7 �T�+&2�]㭘��Ku6�p��Ħmm��OE���
&�r���`��;������_0Q�Ku�]�Al�� �?I&|��Y�T]1K&8�x���x!K�x�N��W$9WB�aӶ�)��f��a�N#!^%����B�L,����`�=�5��5��O�+&8����tm�6�؈%�K��KװVv�K�� 6m7���!� fL�ᄘLTs��C, �LխhBLh-b�K���bj�!��e�9�5�M�M1vĜ����c����~�#ο����k&���Mvĕ��k�]&�sV�ش�DcG��d�X@b�˄(
��3@,��k���XMg,^+��\�#��7;g��i�� .�4W���*��Ɉ1�W4�����x�Nڌ�95�M����}�V~�cߵzф�dM�Z]˂��lKHb	I,$���
�XBKHb	I�w�Q���X1H,!�$��$�K�%"��$�d�HbI��E~�l�a�"�`��7�����"Bb��_"�I�#1�s$&y��$/=�hڝ&ܡ-�Ē�k�$V5��%q�7�8$��9$��$f�Ą��{�"q;���V�KHbN:�I��	� ��&��$�U���X@_�tB�'�@$��"?��X��b=<qMbO��?�`�䎮 ���7�ĥzbIsb�+'"1\9QL:!J��,מ� ۵��q:�!1�cמ��K%��'f�zb��'��wN\2�kO\��v���uO'�%�X_W5����鄯'f���5�+@b��['�Ģ���Nb�N`4c��!��I'�$q�ׂ�2Y;�T�'6m7q=��$��SB{o����(o3L	I\̞���1�%$�'���k{�S�|$��^$��a�G^�ش�I��۰1H,$�۰Us���cO��z���=�"H$9�{�5�㶛HbN:���3�	�Hg�|_v��^;I��)��+���z�*����$��n"�9_^�퉽��(��'q�鄄$���x!��E|y]�;��&�i��$ƞ��b�_��Ę����N`O\��t"E���A��{M��&������$��$�3v0��$�뉽�v�Ob�91��k'V4��NN��t"y���&�i[�X�p߱������ľ���;'�ov0��Ǟ�?�XQgx�%q�nﶯIl��$�?�]1�I��3<1$1ܞ��㜸מ؃ļ��G�E��-�O<�E�{M�mMb���7;�Ob�N0��`����ov��I^!O��c��G�������h�Ӹ~��߿>�4&7����p�1O�{ÃIc8jL����pt�1ܛD�><����a���S��;��HG���k���{wF�'w���x��v<8���6���ƍW�;�?�%4�n�?�՟�&�a7ɡ��>Mj\����z�mw���'��x~�̥�lK���n�=u�������N]�~����g���8�x
��*�V<8/�"�Ve����b5H�A�6�j3V[i���ڎ�NZ��j7�vc����lX�iD9W�A��+Ͱ5ZG`�0�s��ʹ�]e�8I��N����b�K�f�U��I3�*]�4���5J3�*}��g��R��V�*e��sU�瘚�Ҍ���Ҍ����<ʂ�*�xsU���*��o-p�_0Z�ю��h���h�h�����Ѻ���F�%��Ǐ��p�=a��hOͭ�W����Fs�x�hnOͭ���u|�hQ��d.�h�^�̕��f.Ӗt4s����G3Wg��h��l��\�ї~�f.�V����r��	�9���_3�q�ǯ�='�枏�0�{>~�h�-��:�)k��h�}};��XcL};,��J9����V);�	Kh��|'���K���=�)�ѓ㽔�OGo�{G��S潣�>�NvG�͔m����g�G��{7<�f;�ֻ��wL��m���渌{��7���]���o�G�2�1�]}�f$�c�G�6G���£o�V�c���8���؛C5���^=�g4��y�%#����ͽ|��h��m4�v�C�%���oO�05���=`���rB�d3F;���OR�"L3z�	��+L��5���&ia
�J��KH��",���[$��K�$i�^U"��ޜ@��K0ŏI�%��v��!�6��H��p�z���9�$��W���Nod�Q�T�������2!a
m3"�H����4�a+�f�T���D�j�c���U���OHt�/���I�v�l�x�#Y�s�[��X(}q�M'��E�*��9�XWF����?Pc}���$��,ѩ{��I����}�����vo�7�ϨA�L�u�S���+$2=z�_d��ǔ8�
�}+:暜}�T]a�T8�����)pf��u:sG��ѱ�}���:=��I���k�{�䰾��o����҉}�]#�g}��&���������sm��5���u۳��K�AgJ?�eמ�I�v��}�Ԩ@S��I��g�y�?��z�Q���@�$]�}���N�L������9���k+ {t�_#U��3��%����^'UW�3��%�M]��'1�)��_I��3%��R�%�d���?P”|�R5�)��nk������aޔ|�#R5]��&5,���C�ǴeP��{�Tm܄���,k���/�G%��T]��?H��5? UG�ß��K�'����K���?#U�SR��!5zPm4�S(z��ͯm�����t/jg��qDWpd.��:��T]=uft'jѢ��.Im0���N4��àg�U�I���.��d�#�H���R44N�.L����Hi��Ȃ�5�ڱ�(�R�� �q�
R�9#?=�+R�9S4^o�VFO*��T�<��oHՕ��Uued���J������O�%d�gT��!-:�7I��
��H�V���i��(�SQ�@�|���F�!i�"KB��#R�����v%�0���TE��.��I�"}x�~�T]}��}�T}�����;��+���H�l���ò�9��ꪚtb�hkB���H��Ց���b�HqD'K�z�O�ObT]�tE����]uQF<�&�aQ�d���D}w�]�-�����Ti/b\��S:}ڊг��o�����
R����X��I���k�/I�l��]�EFf�âh�g�W��Z~@bt���)��ƢϨ3�8j��ߍ�
ݙG�h��z�D]
�G$FEѿ��n�0�'R]w�qxX��
T/^:�܅��ƕ��������Ne�&�;��'��tj{0�l���'��2�_9xZwt<���n�����ܝэ���?2���d�=���o�����{ݾ��d�©����
'������{��dxw���s��^��:jtk0���\�wA�|a�� ����������SϞ>�ܧϞ;���^��u��W^�����]��|����vo��{��;w�8}m���W�oN�>}k�����Nߟ~0�p��쫳7f?���Óǎ��ri��m��U�e�β�,;��,�β�Vg��βM�u�]g�u�k�ʲ��K���i�0[X�LMg۰�K�&γ��ҕ�z�� ɿ��"��$��&��D��!��d��%����#����Z��sr�P'3g�I�t���vR/�kq���K7\�p'������G��ܶ��s�z{4�Q�ݱ��h��}�;���u�z{4��wtm�=�T��4�nܭu�T��4���;�i�S�w���B�P��O�ޡN�
�C�:z7�uk���IH���"�T�mgP��:`��v�&G�m'fRᷝ��~�i���@~�0y�᷍�Sᷝ:I��v�#G�mgjr��vJ&~�ɗ�l��7��~N��;R7!��'c)�7���os��TU*�&��ig�7��NS�7�ש���Nu*������.�
�a�ʏ��n���<�~��3�u���PKE��T�Hs�x'#�'pip/_vendor/chardet/langrussianmodel.py�k�Wu��ϯ��Il'�tUOwO+QY6���p���Hj�	�eflKQ�5�H��،b�Ws1Ws5k��򹚟0�$uv�w�K�uܧ����K��v]���}v}d{�b����V�n���~��k�燻��kg�{i{��p��~���n��慍��Wv�G��p������ҽ�Ρ��v�wן�j_��p�J���C��67�O�C���k�����Μ9v����#'߻z��#�on]]j������Z����>})P��*��ˇZ��_ֶ�(�m랒?�ɉ��5yEɷ���vr[���|V�I���)��V������������m��59?�T���کzM��J���'5����Z8_Ѷ���vN��������&k���E�MM��4���ok�[�����T�U�kr���iQj��?�]�h[k��T�JM�k�#%'m%�X�J��&w��Sm�������sM�N�Z0j��6ւ��vZ0�Rr~;R���q�6��vR��[mcuoi���N�hO�}�>�]q�>��xY��i�P��u�lh;��&��A�>����}B�U,��<P;���%u]F�kǭ��4Yݿ��p�%}R���֟�v�S�K�|�]�_‹���X{ -�ƥ˸��zƍ�-�\ϸ��eܐ�2n����qck˸!�3nlm7d˸![�
�2nȖqC��8�qC�e�0˸�˸![�
�2n�EӸa��qc�qC6�Gm76���i�؇e���4n��q#˸�q���
��qck˸!�3nȖqC˸qܖqá-��֖qck˸!��-L�j�s;�M9�qc�2�&�;H��g�Sȸ�4nG��gܐ'g���2nȖqC��q�7�1�q��j�O��0n��� �v7,�2nȖqcߖqc�zƍ�-�F�c�#�6n�WK�G2n*�5o�=���ϸ,��J�
y���a܎��ڸ��hƍM�3�a�T�ȸ�$a��\4*q���N�Ǹ��qc'D%���I�c�API�7���q;�ø!�2nH-���/�w�=�ƑL���Z�K��;'�͸�˸!�C%x����'���e�^�I�q�(Nb��QI�q�0,��Ʀq�a��qC��{n¸���Dq�8wW���3�)�?�C%�'�qC��DF�,*q0n��.N�ws�j���ƍè�qW�݌J����3n�J4l���f�~�d���ITRm�T�0n?T2ی!�2���䤍��7�v�?�\��lܚ�M	��1��A%M'��l�*qw�����>n?��*�QO��;��J�q;�ہJ����P	�YE%�Ӯ�-ͽ�IT���ʸ!O�8���B%������?��@%���i�8�d�P@%���8�7�y˸��#�6�bܚw5��
yfw����>��2n����@W��Q�����d���+'��8�$*�<VWI�q��Z6)o�vd�T�g�T�ȸ��;*���B%A2�&�*qw��J���t'��{��I�1�Ig�w�q;��Ռ���u7
Ÿ�̸gǸ�d�A�ۏq;�;H��0nGƍ�'��ݠq{e�8�)'�2���$ԅ�*	�rґq;�[u���p��`�AP	�{,���3��I�R��qόq{���JBw����2n�d�p�VN:�[
�����0י]������ɸ�
yV�@��U�`�s9�k�$,z��aRcu�`�z�J����-Nvٸ5#iz���\�>�¸�D%~��˸���*���$��:�j=T�0� ���~��0n��*N*��ÍJ�d�TdVIT�q;�J��J��82�&Q	�P�#�a܎��9�CT2���1�Ցq���j��8�5�֬�X�,7�h�r�@c]p��8c]�P��q{��8��TR�q#;+�v0n*�<�qc'�2��h0��f�3�q���qO�8"�3�'����� �1�ϸ���J�*����ʸ�P	�Y��g�~��{拓���
,y�ʸ��e��x�)`ד��ȸ�q��$|����Q�t0n?�+N�X��U_�ў�?�0;w��$�8dJ��YZ9���Z�^m�Ռ&5���v�_��(N:�['��wJ���w���aܐ�2n��;�$?�0+ƍ�r���@%p��6nGq�ϸ��I�9�{��[O0�b�3�q;w���@%��֋`�P�ȸ�Nj����8������*Njd4n/�vd��z�Y%�Bq�Ɍ�Q��|�
y�;@q����U2���q;��/��qkO�]o�~�{vPɼw���q�Jƍ�h`w5*�*NV����Lt'��#��Jz�8�=bw�qCn�82�&��w��*	�q;�J4���2n8�]�J��;D��S�ڳ�!�v�&�����=�퀐���pf2n��3n��!��C
�Y3n5P{h�
�rd�~}�Mf�~�{
]%�˸��&2�)���r4�V4�E7�eŸ��#X��g��:f�r�3� �
yV3n*���qc�7�ख�;��g�G����-��3�)0���U_�����L��7�	v�82n�8S0n���,�˸�ø�ø!O̸w��d�.NVw��;�q�kƭ����>nj{�����&��wT�0nGWI�v��c�y����h��m�#�<�ƭ|[����Ȼ÷�$�Sh*iҷ	7�HJ�־݀��d�6d˷![�
�֌)ȖoC��ȖoC6}��ې�|G��
����Z��8>�c�6��|��ې-߆l�6�	�*���|��۩�Mj��<�)	�pC��-�,�c8`�3���1U�p�}��q;��qW�c8`u��c܎6n�/��}r��8�[��l]˸�pR�W���qG�^t�v|��+�v n���a�^w�t��M:�r�ဎ�[�eܐ���øUmR�)�qG�^p��T�e�8�ȸqu��k���q;�#��$�Q%��2n�I˸���h�Ѹܸ��q;2���z�lg��+�g%�v0n�q;P��6�d��JԺI�6��}{Q|{>k��S��MN��8&�,Xm2�o/�qk7T4�h܋b�~	��0�xmҫ�۫��g�M5)�w��p��"%����� %�-�V�I�Ή��{��{�����7cR�vلq�!�&�J�j�*��n�)��Wߎ]�ѷy���I��vq�Ҥv3Ą;&܋b�~�JB��a��	7��R�S�@J���1��a܎�G3�ø�J�A��/��Z=%j��vգqG�^�ktd�^��'OJ��}wR23]�~�o��a�M6V#n��I��Fߎ�����AJ�z�dqz��T���v$�~�&�L���z��D5j2w4�hܐݤ�+�v,����7���CJ�4n�e�AL��&�۫4�e�֮X����ѷ!�kKI�^@�o7F����_iґp;���[��p�ok�&�v��E��\|[J�z���U&紥$Q	�v�qG�^�Lb�|��a�ظ�'f�2�ڽ�1%��y%!z�y��~��oG�^p��R�`�=qP �p%~	w���~��%���k�;kR?�s����o�s}�1�np��<��l�4��A:J�L�
Jz���)�ߎ�v��)��W'`�
%��	��۳�P�W�lҷ����'+w4�1�L:�B^�O�����;*��k&;�pkg%w4�E1� �IǚIl=��d���C
�
�U��k)�/�F�c�d�(�뭙�k�v�T�D?w4�7nl�bw�)%!P��q@%>ߚa�A�|d����ۑq7�囔W��qF�ƽ���e^�&4��^@�9|ƍè���3� n�c�y�غ����ƍ��eܼ�](w4�Ӹs��qP��8�x5��B�qW��Q��*	2^ʑq;���\ϸy��~�Ѹ�qߝ��q{�#�nθ'�U�c�A�J��� ��qA%�8�b4�h�n��xrw��
�4n��2nx�i��v���c7�z�[�U����7���X6"��v@�X�qG�^�Zϸ!�c�~��j�ڀqC6��i�Pk7fㆼ �
y,���*Nj4w4�7n�>�p�N:����I�q;2�I�q;���>n��A�ۑq;�[�x��;�bw�Q�!VNz-�qd����ȸ,��f����ȸ��&��w���b?WK���]m�x���L0vb7䱌;��M���*q'�����@%�����^}�ՌہJ|���}�AVN�u�8PI��I?�[��2nm�h�1�^�[��3��B%��C��q;PIc�w��M��*irɻø�J��;Q+'_��]�$�"�*ip8�<�*	�q�`��cܳcܐ�w�q_[Z�7?����<?����|��k�k�v��;��'�v[��Ϸ6�v[���;�������������.��y8G׶���.�}z���&�m�s��٭�����<�������r�[�����Ɩ��V�����/�ǻ�`k@���<G�6w��ݨC�}��:�v�8����޿�c�X�VO?v�̱#'W�������Z=u��GO����	�N�[���/���iIL5)��T�B�j�P�Mu�P���-Ԟ��
�o��B]1ՕB�ꮌ�B[�����J�
휔;�.��h�6���G��@��`3�D���/��8��<ǩy�y�S3�D��Ԍ1��95�_"�sjF����Q&)[Q�IيR��ԊR��Ԋ򼼿�(��XQ��ݡ(�ߴ��Ѵ?�ڲ��#����+��������gR[Ѵ?��@i��wO�\�����J�iHM��/����R��x���8���CR��x��(��f]h��S�mM��i7�4y�vSM�t4Mޝ4s��5�]M��e��i��5Mޑ]�z��v=�+�=���k��������7Rӯ��JM�'5���������,�{Xj-K�9*5����m����K|�Wh�J�?a��������+��^����˃B{��ďخ|�����2U�{��8p��/�<��<��Ra���ZF_FqRJ"
��)��"
<�����+����(�2��R�(d�g�FQ�h?(5EOF�������h�Qj"����CRW�'C�'��8z2�����'�g��wտHM��\��m��R�o������JM�]jy }�4恈�/c��<����ӌ�_[�ї�;1�����^}�<����h��Nxb	��:4qI�o�DqM�������-�]ī���7�"y�lA˃��^�&��?!�`��D�3�MIJ"o9�'��|E^�'!�X�_y
���Vd0O#a��ȿs�xTV䉼Q\�y��~�]���d�
Q�ˮA�o�����N���m@�Д�$/{X�G"^��vzb��#��e��}�yP�;`�D�����x��܀<�Kx$�]߳pG"^���U�""y�:���Q�ȴ
��x�wpB^�(~�Kđ�W>��x�wp�_�("��F"�0q��D��q�6�އk$����Hě�k!�D�����x��@�3����_�.Da
8��!����7�ǫt#	�l#^� IO�o@fm��$8�Cƀ�����,����?�&$\��C�Λ�x��/������K(��?%"�E�54�����ƾ߂F��Q��@nzp�5%�2l�$�d<ڔd���i$���q�Rv0���-�� ��q�S�0X�;�4a0���B�nCƳ"����(o!��j��\E�iQ���.����(o�D␶�-��mD���(�ე@��>�?�!ڈrO�����HD����� �(q���	E�p��/�S�	G),iE�p��B�����>de���;�E�	_�oBQ&|-�YD��4de���{�E�)_�oAQ��!�(S�Rޚ)����de�Q~��2�(?YD�r��@Q��g �(;��E���E����'E�x
���Qޖ�/%�w���E�xG��NB 8���@�ޓ�� �Q�G���Jj�@o�=�~LI�9��ō=��K��u���s��gZ)�r��	Q�"8��!
#�z"%�RĹ�HǢ�)ql�)��D��t�D|�S'r����EH�8�<~@�5��I��&�Bxӎ>��vx��h	C ��U����Pŵ»���H��	U\.�d7`3��Cr�6dJ�exw�\��6�kr���}�#[�ĩG=�:�:��yac��ݡ��g��'��7�=	��3�]�\�8<|O��{�j����'�.���'wv��6�.���ݭխ����Ջk��1�k�k���Ӈ���#'�[f���K���6V/m��?5\���p��A���_y��G��K�k;���W7���D~���ΰ��6.=�vv�{��������+�g���Vv;�l����٫��/f����})�r����ײ�g�Ⱦ�}+�v��������g?�~����(�q����ϲ�gof��~��*�u����[��F{�gFώ�]}l���'F7F7GϏ^�8���S��F/�쁥�;�ȩ�Y��$���yx��Ey��"�<<�p�Eyx!6�Ù�e�[�
M@��9$\m���1kN4F6ҡ�Bd{�0�����l;�:"�H�ߣ����)#�g���ψl���@d�M�ļ�[j��R��y����[�E�D��_�J�@�%�Ļ��ԑ��c{�0�駔���|�]*{��	wq����0�������e����J�h.�u�5�.Ĉ��D��� 0�
@c#�K�-���!�c#pH���� A9C�7�rz�R��>Qt�b��O��Xv*a.~� p�����\��.'�jr��!.ܟ�@%�%����D��	n��P�o���<�'�%c����Ot���/�S0��E�`�'��Ctx��N�}B'���P	���1�&r"���l"'�Ŋ�B�Պ�B5(W�L��JPgzs����6�s@<��-�#7��%��=��
���l�o�@S��KEJ�y���"�()E�Q*R��T��G�H)�R�R$ v��й]�$pn)	��EJ��v����]�$`n)	��EJ��v��P�]�$Pn)	��EJ��v���]�$@n)	��EJ��v��и]�$0n)	��EJ��v����]�$ n)	��EJ��v�2�{�C)������"eí"%�p�H�j�Q�,X�U�,X�U�$n)n)	��EJB�V�� �V��H�U�L�5�oA�����H6좂H5좂H4JE�g��
�f�EJ2��vQ��RDQ����@�x���M*�
ݴ�� �RQ��
����E�k��O��^�<���΃b7����n$�Ee�ۍ��Ⱦ#�&-��Ⱦ��wdߑ}-��Ⱦq웙�ɾA�
�� ���'O+pS������!ý�]��3�+�7��-�}��3m*�7~Jq�91o���?���
䍟� ��/<�Մ�xi��ClBވ
4� ވ
4��pp�w#6nn'܍��ڍؘ'�Fl���Fl`��Fl���Fl`��Fl@��X?`	t�;�W�?�	s���]m�%jH�A�w�
%R�`��ۥ{JJ
�
��ӆ�p����9�,����K�(O�[�E�P"�D��kd�\"�ܑk4���\�Y\u���#�hW�F��
e�j�V9���	Di}!m��k�&_�G\5�=������E:QZ�B������l��s;���ځ��p�l�s;����FxiQ��2ʄ��-|��pn6{ùq��
��m��/s{�����
��zÑ�s��H<lvٮXD��4i�M�	wK
���d�T^���蓆'ۤ�r��~X�it�/�4����[]�\�1��K�JB��dJB�Qfx��w+��{����z�W*j"�Yo��.Aه
�E�Q*Vh(A��hE�M�E�aW��{���W*�
�vp�3�8ġ���H��%^Lܮmy���E�Q�T�A�vU�e���]��z�����5ݪV}Z�fW�̾oV}��5������w���z/-��Ա��ӑz��w�ޤE����"���;Ro�E��w!N�z+Vb`o�̞o��6��b<f�73��{�ǙM�șo�ef�~u�7�#��[�����ͮo&f�7�����߼���Vh�l�f�h�~3Z4[�_�A+F�m����܉m�~��k���&��[�s���ɓX��o����~�F�7w��w0����^����<�D�fzf6+jt�<��M��(�h��Q��f�M
�jR�2E8�@�آ�Q ���Q �n�Ρ��]�:�%E8��g���(�6p������D�����+�Np��B�
n����$�L�^p�	75��C/d78�<��+�����9fC8��0;���-�<���	�YfS8S]�+�{�);��H�N�Dى]���.��*95���6��Y��K�����^S��ح�-�"ZqE�Rj�IJ	gw+ȵHRlH�V�`-R�znWͩH*�s���ܤ�?7���%\a�ؤ
�&Uc7�,E�`��)lZ@
��N�Kp���1	O��R�)��^����ƻ�Zd�ŭ�#a�Rw��Q�b"qq�pH`�Ԇ_5���vo>Mi�W0�����Ad%��Mi��*4Ů�Д6�V"��R]����e
���J")�hJ�]R�)mv�@d �J1q�(@L���U��j	u��D�����]�%�^5���x��w�R��u���b������F��t��ѣ>}��cG#'1"��I�H<"q�E$�xD�B�H<"�B�C��P��]9\�lx:N/�J6�i08*6j IG+��I���ר�$]�\Óc(!@��'nPJ�j
�)����&B@�s�	�jx��l�jx�lTjx��l.��d�L��X�A0��%p�6^x�+#n*/���j�U����*
�F�e�j�a'Tv��3ƚɪ(Tt���

ql映���d�*���r����p�X�A�G�p�7\p�c�B�|��\ȗ�P2�H�ǥP�w���E�`QN4�<��-�\ע��\���(��-�7���pԞ>S��G+qG7m~��&�!�-��:G<��*-pn`_��j�SQ��b-*�s�����\}���b.8���q�7�Y8Bn�:�/{ܞMu�Sĉu��`��,�.z;8W_xs��y[�$�eVO?�p�r�7�|bw�L�_�<�:�X�EԻ�"G��(S��x���]�ƪ���ڹ�W��76��y����~/-;sjue�;X�SP
1���I��;�o�E��w��B��;��B�@?��W�
Ṏ���u$AFKx�w��=Ṿ]o
�.t�+<�{���\�C��s}�����zgx��A�[�s�����x����\��gt��:�A�=<�q�����/p���\�7:�s��h�u��G<�q��&�\�7��s��h�u��O<�q��F�\��:�8�F�x���⹎�o4��:ο�.��@o�u�Pk`8���[ƙJ�������g����;���
��Ùښ�y<�>0���90|���r���<��p�c����
l")�D&R*��\�T`�H��&��R�����6���
lΩ*��HIJ6���
l"))�DVR*����T`TL� �^*�
*:?���
l���O���HNJ6n�h@�ݐ)�R�'%(v?��PJ�E�R�&)J��T�(��Qj�;�E�R�9�Ms	��4���R�vRAsE�R��D,����/�t��4��l�As��7��m��V�i�Ms)K�h.qq��Ưd��j�+�����>�9�&m�̠�Z��L��L*̠<�r��̑��>��SV��d��g~&�C�+�(�_�䢘�L.՘��#���еJ����9���Ƀ�``��@�ʗ�PKE��Tcp�Mv�$pip/_vendor/chardet/langthaimodel.py�]k��U��_1Ȁl��鞻`Yvl�.A��
��v,
^�.�#GB����c;�����F�BB.���J~
U5u�9S�٧�v�L�l����5�u���~�֩�/���m��n�2����?{��pk49{p��h���{s�����ݟ4��wno��~0]0���hriwk�}��c�ֹ�'vƓ�+#�\������ٹƋ;�������kw���_ؼx��s���<����F�ᩆ��s���x�q�����x4�Q��d��fx�f�gfx���cͻ�<����I��eM�ᯱ�ÿ8��=����O��7�c��g��y��o1���0�m�O���6|:ߙ�ـ�󫬟6�]֞O�{�}����'k�������0�j��u3`�6û9�����ٴ�Ά�a�1�l8�d����b�g��m6ʌu�/��k���~���2g��;û��wY?���&��~X7�g�o�h����!�l����g�ؽ�1���n8�S6�&��������u��?b8_��l�����f��1X���C�`l-~�]�=+���:M���}o6����t2��9��ѿήڝ��!'FT��x�l�=�������r"~6|���m���p@��?�$~��_0�}@�h_��1�i�x@��> ~��/H���p@�k��1����M@���G��}@����x�^���}@���?�	�x@������@��6 ~������?�ď�����?���4�o)����Ŧ� �+?�9��/)��ď�1 ~4�6�K�_ ~I�KįU�����Q$~��G�_"~I񣟀��ď��E$~Pm@�h�����x���x�
����Nڗsz�H���%��e�>𒼏x�������x�-��/��B�4/�h_P�KN��>f?�}��x_�N9�������~,��,��}A��
xL[H�u���	��9�?nK@��-ň��~-�c���◈_rz�MI������n�Y�Z�ݗ���/8=Z�G�i,~-�k��X�xI�xA��#~��%~˵D����pz�|��%�xA�x1�?�Dď�J�襤�E���9=�?�YL�.��Ѿ��^�?��#?�J(���9��v�vS?�{B�?��/Y=��x�_ �X{�K"�XV�)��mE,~)��j���O����3���g��_����ۭ��x9ŏ�	���+bůMꑲ9%�/�vowI���Փ8��r$?�HY�+=�X�/��Kď�vB�_���f6�d��8�i�h^��Q*~-�Dzz��zR{��Ki�h_������T(o�֊��įT��׊�(�'�/����%?�y��H�&~P[E�@���A�L�3ʫ��OM�n�5�7C��+M��ǿ,�_�q�����9�E�ܭ����7w�D�xV����Q����k�@��=~�aD���Z�7N$�׊�V��^�WM�1�?�����~Q��g}�_[�!�G:�U=���W��a��QRm��~� ~0�j��(~Ls)�Z��F����������Y��ܭ���YqNF=�2cU%�ʼ�q��գ,� ��k�9�'R��Z=Xm��գ%~eU�X��F�U�1��y�ڒ
��2kk��x�<�%����.��c��^L�k�2�4�j��T�*sj��8Z�'u��H�`�,����%�/��j�H�K��_�r�mV��QI�r����jVO,◬��%�GI���O�ճ�_k�H�R[=��R��p�*Ҧ��YM�GY�?�ǟ1�g�q���BYf�VOM��cU��?nK���Zů-�,����GR�� �KV�/X�9qɆ��_�zо�����I}rW"�8�zR+~vr�QC���ei[�?�VOyů���������///���Dd�$��eI=��}�E�X{���>�O����_ܕ,~�;,��,�X�a�
~Ls��]�[�K�_����oi�o)�vW������[��H���>�{�+!�3V��=�� ~!�G�������z$����H�c�d�+�_Y�-��n�/*�_rz$���]���fs�zR����wXrv~�=�ǨѶ��]-�}@�XmV�ڤ��#%�HN�6��b?����/�j�v%�?���M1�G�{�����d�D�Z�_K���U���bٜ��]�ﰬ��_�ů%��Y��Vz)I��,~�ޮ�◈x5*6H{�h_0�gE,~���/V�ۇ���=�u��������fs_���H��`6���#)~��%ſ"�/X=K"���ٜ��SgsN��z$�4_^L}~+�◬4_�]I�+����D���oI�������Ѧ�?�#��5�X?{檧����U!~��O|~pE?�J(~��c)�j���*~�d9~���z����b�/��6w�ls�=[� ~��nm�ĵz�Y=�"��8���VO$�/?�'��&)��z����]��˞�x%��hj�G:��D[$�'ֹ]\7M�64/��������R�bi��+�zb9=ڤm������^2��\*�II=�i!�g�i���/�ڜh_P�}E�_�#~)�_��K�+�_��s����oE��t~K"~m6�d�Ǫ�#����J�s~K"��E�g���xǷR�~j����}�S���OA�G�}�]t_����.�SnkW��K����_�]������K�K�v���}�֮�ů<�����,�����m�4�_"~���~�=�x��D�Kr���I�L��??�DN��e�����b[����&s�kNOj�G ~)�?�ů%~e��4�vkWrz��v#9=��G7i�T�!�⯚ӣU��ҕz���V�1�%��{�G�
ڽ���d��_�z�_V�-�++�,���f�k�D���זh��_[�A��������U��_aA�!~�Փ8��6^lMfmR�d�$.� Y=B��]��jsj�m2粎oűzR?K�a�s}=~�����,ď��6w�D��+N�J�G�܍E��K&�OC���D��K������s�����S[=�+,l�6�@�R�I+� )~m5~)��/��IM�O1�GH��Z=���`�D�ʬ��VO�j���z$�_"~�ꑈ?��W�hKL�9��a���_I�x���W%��S��%���%���#��M��)y���_P�;��`�����
�+��'�31�B=lU�?�U'�-�O��Hi���vc�ەx?Rb�/%�h�oI�����#��>��<��n*Q�Ǯ���.�����F��[�p�-~A�N��/?گf��uJ�/8=�+�Ɵ���L�)~���fsb8kF�Z�_R���J�?V�tpW"�8w�{�Zů%~e�)�S:�+9=kJ���9����߮���.�cX��4~��_���I=�n��-�K�_y~+�գU�Z���ꉥ����_+�5V�J�?5��x��c�B�4�/	~�Vնvc�V�c�|h]�R��_i�_����>�/V�K�vה��%��Ƿ�%�[,����#�9%�G �UO��8��C��j��TV����:�+���k�_%�_i�'g{��>�Oꉥ�%⯚�_��<��jsJįU��,��������ͩ$~I�������nZ�GJ�I}|�?�_�2�n�ٜ�����z"Y��*���G7Ŭ-�k�o���J�i+��0◎oŪ�#�J[�'��o��]v_�ߒ?�W��IM��Ճ�u6�/ ~���dvqM��V��'~{>:��K�_Wſ$��fsV��%ſ�į=�UM�ӫ�����<���I�������գ<�+����z��6w��zRo�ƪ�)X=��n�mժ�#y��ks��gX�|Ƴz���S��]�[�3,��O\��a%?&�"���pM���n�(ş��A��˥sJY=�f����[=�/��6�G"~I����G�J�hK}~K�ꩭ�u�zW#�sV���O���X����D�h_���+��Kf�/��#�sJĿ��
��S���z��g�p�\��9��ه%����T�A:���T�S��IL�h�(�S�z�tΚ��W���3�g��3,B���S�Zu����O�tS
�p��]4�HV�R񣛚�k�D�������3T��mYl:�*~-�+��V��+���G�4�ߒ<~-�KY=B9���k�^5�wf������|�?�W�/�?�:��&�%)��.>�x�6�'�c�'~�W�tN��nň_��Ml���ܕ�@����R?�)��Z�?+�������[��zR;=�*�)�~��[ڽ]�-)�S{~K�}eU��5ڴ��,գ��T~����b�x���|�gz�]��}�O�����zY�v��%�G���:��rz�?q���~�m'�(s�e��+�_��S��<:�?q5~�6�����D����/H����+ks�E��Z�s���Ü���zk7%���v���ڭ��v"�v�:�������ϲ��/j�w����Y�&~�}M���?�� �c$��eɜ�bj�w����Y�&~�}M���Q��gF���:��y�͔���5zi�3�jܺ3�ޚ���;�Ick���ٝ4F����x�1��w�;������Y��������Ǯ�&��wlf��ݛ�ۍ���ܚ�Nƻ;O�nwG�ߛ��]��n㓻�[��7�j��}���3�7�̆f�}��Ը4�۳�>��=z��s���pm��77�?���ϟ��y��敫�<{���x�·�z�3������d�h6E�y4���y�5E��h{�v����Σ�)ڛG{S�?���耣������p�-�x�By8��%����G������g�y��q>�2?�|����|>��Os>�2?�|����|>�l�� ʡ��(�l�A�~�� �-���(�|��(�|�\�^�5<�b�/y�Ͱ��0�1�u���1�W<�gدzl0�N�9=}.����Y����x��1ǯ{����xOy��q�c<��y���I�/��a~�v����U�$̯�N�0b���tG	�K��a�_���	��c�_�~?�y�ݏ3�q��oz�ߏ
���[��=����x�����{���ٝbO{��-6{S���NXӿ���}���5��liͬ����{����#���]ӿ����c�����vc��w=����=��0�S��\�)v�c6�̇q�c6��劧w���sa��~�c6�����L�욇L?�=d���x�c6��O�x�F1�C��(���1�������FA3�'��O=�Ս���<�W՟{�?��O�_x��c�<0q�|��&���!���6��t�@G�c��kڻ��y�_��
f~	�&Ю����M$}?�c�l$�N��@{O2�_&�C+a�0{S�>����7��҂0�Г�K��f�ǽG��)4�"Ю.?DV�"< ��B�&��G���=�����M,�'I��P>����Phm> �.0���&�/����7�%�*�|��-��Ur�~��{�ܸ�'����'��^��	'�����E�
0�u�m�-�w�QҊ6x�ph1��nc�5l�>�6\Z�n��f��M�N���4Г�v�Y?��9U�Ϧ�@������;u�cz4�N!䘇M�U	s@�o�B�3�ɷZ�?���Ʌ|֜&�I��9��w�!�dh�t�1	�|'��(i�ha24�NF�0i�|'%Z��M���Y\4�NR�f��o�m�����^��y�D���K̬�h���"����i�m�mB?C���O�?l���z�%��P?G���K��	5�u�\�R�Y���^#��fgNr��G�l�k#�75�u0�7	5�u�K�����-BMl�D�#3+@:���	5����eV���j�I\���ژ�w	��>��jbk#��	�<�b�9E��? Ա,�jS�1��jB��y�1�ʤ�eV�t0ܯjC�վA��~�@�Z���<C���ȺaNYfEJ�k}�P���j�J�}���	s�V�a���ʕ6F�]B�ĝ���y��r+Yz��?	5�aƾO��
M��P+�p�@��
�!�N��}�<�)�?"Ц#�b?&Ԓ&.�B�z�SB�z���Xz?#Ԟ�p?"�{�m;$Ծ0��%�Ҥ��0wF;Q�J�7��66��2�޵�#��r.�6<ޘ;EC7����J�v��;MC��L��*z9�͝���r��7�r����+�O3L�hn�My���1h�Mh]��j�'�/j�~�P�A�A�]�xX�$�ņ�=��V�t��[�Z*A_&���T�M�	��9�
�6:�}�P]7�ns�Wz@�%Ծ݀�G��Kn����o�
����ݲ��>$�5.\�S�#\���`(�}�Լy{��3�^ll4��wno��~0Y��hriwk������������h��S�秧���Ý���-~g8�����dwswk��yw��!���l޵��p�.����t|�6�{�[��ͽ݃�d��hs��ͳ���2���<�mn�Ǜۣ���7>>�>M��p{����h�q�H$����1BLj�`�^1��(#;��0zˆ��,0�����ݼ��{ۼ��ټ~ͻּY�kԼ3�Ҽ
ͫϼ��Kͼ��ʼ�̫ȼw�;ƼP��ü*�{���~7dn��д�d��n
�"5�i(��!?�t�}�^1$b�Ѓ��ܛ��<��6O�y4�sh:󀙇�<9�11τy�j7K۬c�h�
5��,=����z��PKE��TT�-��t'pip/_vendor/chardet/langturkishmodel.py���uſ�_�PI$%]U��	S�,��pqb���@$��`�%��$�����,֑bٱ�*�ɱ�����Q���}��TW���X��4�U7~}q�U���nk�r�����dz����tg4;ypC��h�?��M[���uu�wkw����l����f';�ݭ�GZɩ���l��(�7u�ua|g�{?�gy�u}o��M�j]�f�ۺv��s篞۾p�ҳ�/?�̅����V+��Jx�j=�z�̣�@�xbYMzV}*W۹z�y�O;���gr����)�]�>�[Ǫ�#��{>W�ª��U��9��]p�7?�E�.9j^�eG�[�yGm[��Sq^�UG�V��T��ם���g�3�M��1��sܼ��9cv��,ġ38�)�p�n:HOA-���#�^p^��er��rԎUo;�`ű��|�_t�L����=�����w�Q����BN�3ȇv?W󺦹ط�A.�8s�*?�{��W�%���������s���wJȏ�E��藍���#>��#矩�W9��k��.�o:�c��s&�-9�y�s&�95��1��yu~��p�t~��8o���:/Ώ����;��|d���i�.���a�a�(�e��KoK�eu+�İ�Ű�Â�a�0,İ@�bX°��5`��a��a�޲9K�a��n[;m�
�ܰd`XzcXrÁ0�qñbXAK�a1��İ��a��Q�X0�sõ`XB'u��a���c8^7m(�
�H�0%�a�a_7*���
��-� �Vr���jncXY;`�a	1,�p���ư�G�
C�lXV�pR�	İ�İw6,�1� �E
n����l�7�x���rK�a	1,�d�
bX20�C	�q(!!��0%p6,!�%�0'�P�1, �%���bX��a�a1��0�DSt��
�B	�tl/7�C	�°�ִ;\���o�Jnc�?�P�ܰb`���aN6̙��V�w��0�h4���0�0t���
�n�?��8�`e�%�1����,a��`(��0��]�0�`��9��0v����
c�O�q0�C	�	^�v���p�N0�0�0lX�"�����般�0LQ��;�o�ئO��a1,�1,�"��):F��0v�0��n���f��0���<7yÚf��2���o��=��[��+e�b��
{cO�10�ݰ@�7C	�a�(��D����+���&��ai�aJ!1���UV��0v�	�	°�N ���a8��}É'�9�0�H��ᄁ��øS��)�x0L�z�}�m۰��' ��bg�1�a�fn��|�a�a�Z 7(��tJTφSt��p�
k!;%JB	�}��y��ʆh���Fݰ���
��q�Z�nO�)_7hO	�a��8����°�5Ey�pR��#���
�P�AJ�x�.����Ý�а�p�tJ0�o����1�
C�@�
k�o8�N�Z�0ì�5�]�.�p�w�D(s�8n��Ü��n�ñvJ0V�	�°��pĝ3��p�N��P��볘��}°��XvX[77��7�0%axswX�7��	�*�kY�Q��������6a�áV�a7,�1�Ɇ��p�}�ޡnXc����
C{�
o��!� �E�|#��
'v��яá�0�0%���Ca�?�X�l�I�lb8L�0�0x��P�7̛��|�d�����p�C�9�7p�'��a�F}��p�ư�V�1��oH��&;%�p���q�ư���x�.�N	^(Ar57\��0�K��-���s,St�
����aJp:%�u���n�Jp�0Á�p�[�DJ`7���%.qìl��7\����-��
k��g�Ks����
c�N����z���^�%B�
�ҰF�^}��p�D�6�9��	%0���n6��n4��PbXD�a1,�c�aOc7,uÂ�a�\��D	��0��)Ѷ;�9���8nO�I�C�7�1�l��zmt�h�Ά}C��0����7L���y�K0���Ү�s>v�n؜�C��0��
k7�x13�0�
K�a�N	�0,�c��lx��pSt%�7Xn����_��l��_�Ca
7;C�0(�
3(��p�
�Ha�k0ƍ�m8A��`
�a���bP8aPX6Oᒶa���ajzk�Q�ae1�~�"1����j����w�p�;�`��f�s�A!��V��j�L����a��3��$0�k�`�6J8�������RA+�aN4�q���
K�a�h�
+�aN4�Tǰ�ƙ���>�bXB�~5U�8��q4ۆ}ݰ�ƙn�n���p-n�$�e%n�d-3�>���sÔ/e�Q�|l�>�
b��~5���q(��q�0�
c3B	
�P���v�8���a�ơD(7�k
�↉��'A�7r���h/��06Ü���aN�p�h�;�8���h8
�2�h��	:�I�7}$�p(�[4�RfN����bF�b�Ѯ(�fF�ޙ�b�a�a�xc���X�$�}���{�1��j�f�v
s0,�cX@�hb��L�{)3�Qf7��$�1����+�$�j΍���_�Ѭ��a��0����
8C�p�F	J@W%8�0v���p4�#��K��[�
�Kaܮj��I��aN&��5̠p�v5�I�U��ʣa�#���I�6�(�0/�}��a��swn���k��F�}�:�q&��'�
s���r&�d�q&���G
�2C'��}�9ƙ�
�0C��:�9n��I��n8L��0t�գa���7V
��
�(�Z�Q�:�;w\H
�v�f),֌�4
Ha�v5�v�Ӯ�Ma�IHHa�K� k7�:�>��a	]�ڍ�Ͱ����+�ڍu�p�k7��0Ì���
%��^9�9t�c����pf�&��m�
:ɠ𺭠���i��t8����p�tՓa�	:l�q29��1�u4
K�I�wL$[
K�9�I`+�a1� ������bX@�$Du�a1,���
�aߵx��'!���
�0,�Ê�aB�h�~$����OB٭��{�x�Μo$�-�]���'�3�0�0��nX"�@�t��I�0\�c铰+蜻 ����&��$d 
{w�a
32	L��$n�i�Ca����
�$V�4�)\GӰ�N¹�$�8�h�?|ɰw��w2̡p��0�W�tß�x��
�p-n�M��
��εݜD�]�^8
{wIpVnxS����	��8�x�uM$�iV�m�e���j�6	�a�m��ư��f���p��j�ǔf5�ņ�a1, �9m뺩OI$p��pbwv.��a�L�x~��&��q&! �°�����3�1�1�6��Vq��Z2	�WݭֱtΥ�tsܰ�á&� ��7�Eu7�0l���1�ݰ@��a�0�$�0�iXx�a���
��&A����sBbX6�a�P��
��2s�$�vx!���dþ�t�AWwø[M00�qÑg��`��>	=އ�H%Bax�B�P�I�l8P���N��St���M�U�\
��xw�Y�7j�N�l����0^B� ���V�
b�����9St
b���NB�):1�V�1�C	N��0g?�@��1���0^B�S��P��%t����%�c�r�t��~���*-���m}�!<��FG�J��ÁR	9, ��'���TB �a9����O%D�v��T�䕇öc��z������D(�-%�[�0��$g�a��^�,�k�!�����} �a,9�I���p�.�õp����üt�d�a��;(!9��9�s�P~��r�?�X3{���x�5�=%0�a<��p�\�c��Y�f]�\��:\��kn���x��P���q.��\��aF.��p�\����i�ᇽs		9,��4�1�p��D&s� �y~���8��%���2cɇC�+�,�E���0�%�9,�0�Ì|��KT���������y:���R:;O��s�3H�|#i[��,��aΒfF.��4c?�XҌ9�����mk0�`������q�psmk]�=�x,~8?|~��m����?��\�a�b���D֕�a���_�9�rK�a<O��0·9��e��a<O��%����2�y:�9�8p>�%-㐐Ì�t
r8�Op@�a��/���ø����?���[�d���ì��S�p�|Xڽ%�Si���B�a����ǐK�ZN��a�fp�K`C?�9콜�{��/�� �9��p��������/��cUsb���,�0g=](?�9���_��YO��%8}k�����/�K0~���0c�N"3r�P~s��	s!�0��<?\�/Aĭ�a�n�|�=x�a��Üu͜\B08� ��s	쇛�%����Ü�tx�a�8�`��|�a����t?,����鈬!�5���ӕ����;��Aݣ�o/�1,��0ưۚ��x{	��P��]�K0��h����v�����q`K���w����%�D��X��v���%���b�9��8�DvXy�a�a;9,��0�m
s����X��3�骷�a;��%8?��.�0���u��X��}o�#�2��*��7sb	����0'������f�Üv	��KH�a<M' �a,�c?\=�،x8d�DI<\ҶVK<�j�(���c�W��Io�t���^�vZ7o�Û���5�=��v�;��ɬ5ze|0k��Z��p�7޻՚�^�e�yv8����F��2�ݛ�er:R��ޘ�ۿ�wsvo8O�7�������N�&��'ӝ��=�z�5�%-��do6M���>��o���}}B׆7vG�<~j����~g�=ؾv��s篞�>{�̕�k��/_y��+�ӭ�l�-��,���YT�BUEU-Ԥ�&�]T��ST;�[T��WT{�_T�u��3*�Fȥ�>�Ri���P���\*�T.�f*��I�buҌ�,�'��AQ6c��O�AV��eU�Q�aV��'�8�b���*V)F^��<��R�f��R�f��R��q�,Ui�;Y�Ҍw�V�2�[��ͭ����1�[���-�����Fs
:��-“}�c�����:~�hn�l4��'������:Nͭ�Fs�07k۽0�N�u�۴��a�ю[Q���ܝ�skv�:�}�q�07eǭ�ܑ��SFs����_5�[�i��u����:~�hn�4����3�]m�{G�M�h�
v���
^��k�|/-�St�=m��Khw
����')��^z�ݢs�i��-�^z��A����5(�^z��n���ҳo;9��ٷ���OϾk�F�g�^HƷ��+4��ז����ӳ��z_��yG����w�y��OϾk�[F�go����{S�q���m��y#����ͽ}�`4�c�m4�c�F˿��Ea��S<=儶LŬF�<
���_�̟��M��M{�����v���rB#�.�\�I�%���ii�h�$i3W�F ����>�o4:!M_	s��IK�蚿�=��"L]���OxS�Ii
�F%בE�`�Hӟ��B����/��w�y�WH�Eۧe�(/~���!����$��ӫ$�7��X|~��g3/}Az�LM��V'W���^��dk���׳zB���z]��I��=z�|����^��]�5�z��{��=e�>������z{y�C�u�ݼ^r��w�n^/}в/2ݼ^��eF7��>qYP�����B���w@㟭h��z4�Ylҵ�h���k��g�I��;���V�tl��l����?�J:v4��.�;�,���q�g�g�p@�%��|h��H����6-��ǁ�?�����o-��W��c=���c�gH�}	����I���#��MRu��?���Rzh}�T]'=����T]%=��Ej�P
�"UWHϮ�o������w���Dz����f��q�G���,��Iյ%��i����d{��&UWGn��?I�h���!1-��s�.�im*�$f����ݨ���T]ZB�R����$�ObV��OI��q�/R�UK���������H�W���G��K����u�=�i��T]=����T]={�H��j��?"U?i��K$��
����Ĵ2���OH�W̼��OI�ꢃ����Hoob+��&!�9�iY3.� 1�j@��KuQ��E��`dW�M���^�7$��%�\�B��^���[R�g4���u��"�4�;�f�P�\�ߓ��"�H�W���IՅ�����ia&��6.��D]������E�+��z�C���Ya4^_3j�a�^#1����)�b(�)mc�T�$�U�i���Ĵ*z&ϿNbZ=�(�T�Ɛ���Ĵ&z�ϿIbZR��4�Uڽ��ϿE������?J��3�o���A}�D]
�wI����=��Du~�T]��HԷ�R��G���*mP�A��*�NȜ��%Q�|�F􇤦5�ߚ��D]���I�4�?!U���Ĵ���>�iM}��$f�e�$��J�2�󟑘ENo����4�$��d���ό�)�b�,.N���?O����[/^~���ӭ��[�����F:��:�]��vˎ�݃�l{oxwt�Dz�'�A��XL��n��J�ӵ{�;��F��=�lO�;�����/�-o��>����g.=�8���f���7������l��h{������'�gT��;������x��;��H�����?w�oo�f�O�y����|��s�?�܅��.?�����7n�^�u{��ݻ{�����K��8����̿:�������o�ߛ0����x�΃w?z��7�!x|�PKE��T�M�K��#pip/_vendor/chardet/latin1prober.py�Xmo�H��_1*_HK)����tā]�s@ZEQ���U��[/I�_���$ ��3��3/�f'������w{t�uڽA��.\�o�c[�J4|�j9����ƂdD��?]��I���ӑ04F�Fi�aZ�2�P	�s�$5�Ԅ�װ�	��\@4�-B�{F�0£�+?�1])��}-<#�t��=nSy�}͗�z0Tv��^��p�ӼJ� �>�F���Ob�d��hy�@~���+$D��~�+L���GB������yPal1xX����*�7�PZ �4����K��DA���gD���jA��c%���!/R���ɒE�p�|9-#�,ʊ��wM"B*�]�B��jqH��0�E4gY�P��Á�@���>.�7z��CB�����+ȕʞ���9���Kg�����I���47p�D����^�"�EP��ү��{=�V�~���Vox�
�h�hp�I�恄cd���,8\��� Zg݋���t���`@�O-�j��]�է��;hW�\!�s1w9/�.g
��&�d%�ߠ����=	���Uc�B�˃z�p�HQ�o$'*S�g-�v�<��/E+�~�B'6���1@�w��;�R�Bg*2lz��V���G�Q�����P�w�ƗOɲ&����[�Z�#{t����@��X��p�E��F�Ӂ�j��N����i
G��K���-���Q)�6���@h�P�+�5p ����|)��Ҡ��0&��o�h����d��G�LR�"�ޅ�d�>cg��}�>E���&X���鞲�Q��<,��B�&3��kb]��=�����-�������^p���S�u���g�g3�}8_����ՙ�~8_����5���‡E�څq��w��R��s0�Nv��	��7x�¸��9�{R��s�`\���;�^̯�|͕��d���q��w��^�Y��}w1��N���u����l��!�w	�Ť1����Z��:|?���u8���w�|g�zq~V^����a>��&\v�q��d|n�v$���_�s7�<g��l?����^�f�v�M��㘯���=�<��u^�s7��0_�c�d���b�x���G�@>�`	Y�P�Yl��Ru����^��?�%�'�����rHGr���7��[6^���덖�h���~W-{-�+K��[�w���`�W��h���Vfǝв��DIk�dy�8�ю]�PH��Ā8�#LR9�F��Q5�*XVG�0#>����@�S��0¤���ǹ��]��<�D��Ƭ�{	okw�V��[	�E����eOz6��Ll���Y��u���ӓ/�w��^8]xӽ.��1��*S�aP\d"$�p����,o�sH����!3S��V����f��
�m[�ݣ��ӏ��
ٺW�o�c,����x����S���e{q���hm�X]��pG0��^lŃ�پ%�X��)��‰����;.@������Rժ5��OF,�Ŭ��a��@�'���f+�$\�:`�At۸�/���ۯ?G�)q�����].���,Q��0��
J��H�J��O��"09.4w�pR���x���Z*-Ͳ�+��X��fc�酅�?PKE��T�����'
&pip/_vendor/chardet/mbcharsetprober.py�Vmo�H�ί%�:�AO��QOG$�A�QE�e�1�jv�z�����Y���z:�U���3�<������Mƃ��
�v2�El��䯘�Z,�S��Id�~�4
i.�+�7�*���pd�����a,�0��WNՆ5��L
4�6YnG�u.E�d�W�Q�|0͔ޞG�C�1-��*�kS ��PsТO�n���)��6#�3֯o��4Z,r�kf��8!z�7��t�Ś>24d�
�R���V������T�4�i���Ҵ�N�W
:�b�C]X��L�J�wй�B���4�"�&��2�Ui��U,���2���a����;s�p~tϒ5r��TDp���e�f��g����&����|Y�b�{�N�S����ClCj����X��.(E
�޳^�#Ә�,aW�>D��'i��g��i���c�a:���<�׾�����nQ�-�XoR`�ҡ4���<��;���'��h�;Cϣ�ԥ>��?�'}�fsw6��T�y/��N��	 �
JbrB�f[�O(o�ӘV�+��c�b
�6��j�*�,���(�
���B�}�����T(�n{�M��`�o)J�}$@�R�t�nUf��c��O�^�c�n�h����CC��_n��F#ј��n�l�Z�=�go�C�ͬ<�����;��0Z	ɞA����-�\�o�F#J��-O��-��5��0��[���*�ֻL�1'�&��I-/�A"R4�GIޡ�'˱�������s����aBP� Ě)~@�/d��-�|�<�ֵ��0�����6u_�,4v�))�$��<��&;�wt��rѻ�W
R�]�}�����»Vd�淼u(0c�2c�^��rj�|�/�?d]�x�:4[�'v���ݎ��7kl�W�6?$xS	���]��:sEYν��
Vg�S�<�A�T-��I̋|٬����CF����;[K�$�!�j�:n)���}�MD��UO���.�8S?xV<������.HY{4�;w���{>�ݪ���A���J�,!|�k��-GFͪp+l�n���0�Ͻ���l]?��y9Ak����i���N���=����g�z/��.m���^	�Ҩ��Cu�
}7���~[�w�]*�T�r�k=l�_1U��(˩d"b����0u����w���ݙ��q�ɵ<�~\�o2z�CO/�è�PKE��T����|&pip/_vendor/chardet/mbcsgroupprober.py�U]��8|�W��H,쭴{�}Y`�e J@���L�gL�Ό����|X�.tWW��ڦ^��P0Oi2��h@���I���ku�o8ʹX��I�U�IzT�����x�� o�6�R�-���ڮƙ����K�sM*%{��)�&f9Gh�-23+Tf�S�J�~�����XsfyB�r�x�*�W^�UK
�I�N����6yRR谆Bn�~��~_eV�U����"D�L�R �Z�-}"th�*
J�Q�mJ|�T.�>��)�Z�4W"�-�U��R�4ӥ�<՜�Q�}�8wT��b���0�� �%�%(���JDZ�P�%��j�ޚ���&�`>�k�+)bOD�3É�]�lN�]#ѡ*��<�#.�w�v;�������-@
f]�؁�6�tI�c�m	N�&$����1�;v�V�
��B��,=��Ŝ��3=ya�M��w��d�Ils)@��4�l��A�8�{Tx��d<v���� �h8ɣ��c1�B
a0�m8�Qb'�-�?$NA�UP'�	i��?�^�eB��as�q�bX���_J��w��$���2��{�����r,'��٢/]�X�*aA��HA=�J�����衶��v;���;]�E���L���^��'���/�V+��ܩ�#�"��NZkU�U��L���e�%��?�]`�* ^�/����\�^��gx	��W��S�^�>w{UԨ�b؋ڰU�0����y����QR��k��� �Z,��@ߏ��k\��W�:��R�].�˴�������8�ߧ*��{L���lT�cϾ7O�l��5�H���x�٪dNS_fΜ�L��~����e�l�.S����w\��ԙ����h�s�F��/PKE��T��XE5tupip/_vendor/chardet/mbcssm.py�]s�8���+T��*���x��"�8=�v>�v���R�	�����n��#�B�v���$�M"�::��d5�r:�rqEFgëɐ���Ͼ�
m�A��\ν�Y.9��8!y�㸮u��Ć��Tz�9����3u�'A"�
�_�(��'
I��Kϱ������ ��?��v@����l[,��
�����!"�>��``�	�����.3mH�4��3��+9�(pf��>��~�B.��_��q��hj��'7���뇦q�Y`+�J��R���*����%�-�t��<4DD,o�?���Y�X�қ��ZG4x�6�ruKF4���/ԣ\��r�:696�BJ��<���a�R�"��"���q�~&ԁ|v�g��B�ǭ�l��&��ъX��n>�����+���Ғ��&X_�8^l��~�p�/��%ː.�n,��|���~};%'W?����j��3h��!���<>���
,/ZA���p|�;�89�]L�ڟ_L���	9��rs2�^�ݎN���v|s=2�4mb֘�FΚx&}h�9�,�
�����B�9y��)�f�:�D^���F�����z�ȺA?gA<?j����g����+�ۄ��>n�nD��/n���;0}�~�$�~1��	��ۭ����E��R�~��귚�H��h���zKx�᮱W�Ҳ�N"x���̧_��x�~��Z����ф�J>��GZM�N��:��z����/D���]p�=���.i�=ޙ�Y���b�j��2�,c�ZJkmf��Wʘ��Қ��Jk�fpk�xY�Y��2f����eֺJk]f����c�zJk=f����g�k���Z�[�4�;�Lf��+e̚��6`�Jkfm�Y3D;�,f��ք�DƬY�lƬ͔�f��Li�f�l�5�Y������\imά͕�(�F��(�F����BbM�U�􄟎xg8�f}!�=����K�L�ɉ�?���&I
]��~�j	�.�����~��z�Zҽo�|�Mj0�ۇ���A/��4�����f4dOA�p�sҳ����������ZaxY3�~���.��3�
���$9dʗ�L�"Vp�R�`2W�D�Y�L��Թ�~h��9���Ag��|�{y���yn]�e�ZW�j�ߺ8��Y�.����N{�n�^>;����%e�{�yq��|v�wyq�/�M�������!Ϛ����t�\)/^�,�3�YU|���Q�,�Y��FB<�;n]���-���Ş���kk�n�k�0�~�����?t���=~���v���>;�2$q�F~ݠ��%�^��]��<s
R.��'=���uũ��z߿�����mo]=F��lB%�#�2�$�y�CF����}����C��cm~\�F������[(87�J1�t!馞�
uEU.�n,Iawx{�}���)_or1-	�%1�
YF`8j%���V�HQ��Vk8j%����D��V2�Z)�Xi
G�$2���P�J"�Q+�E�$2���P�J��8j%dw���X�Q+�E��ո��V*�Q+�G�d2���p�J&3ռ^�Z�d(j�7�{!j%����D��VBM���
[��1BL�PLj(�
�bRۡq�vڵ5y\j�������-SK��V�9�6ں�.���_��6xpj��('c	1�􄈓��U�#�eq8�`�6.0ηq��^rd���МD�!G&C�#�aȑ��Hdrd29��A�ąaȑ��Hdrd29�V�S54�� �2(�7ȑ�0��dr$29B
M)z���^�am<8��!�m�*I8��2�'��֍�v��)��e��Y�U�,K�8�o��Y~������8��o�@�zӛe�(*����K��s��������O�Fn+z>C��\��l嶲���\9?���9�V��3A~Α���o���5�f&[�g��VtVf��ۊ^�/�G�I����09$Q>�D�|�D����Iӻ�V�6��mݒ�4�[ѿ�c�c��Ϛn%W�;�t0��n�%ca��� �-H3iAZW����i� mP�����4�9�4AK����:�t8NU{<k����~Hi�k����I�[��~�4"�۲�?Y{�<&�T='
Gn_w�
T̘l�����bEQ�����f8�2�^��L��XQ�!#���(�"��)�GJ�a���UJd.e���y�r�s�M����$�bTa|�Ck�(Vg�0+�!��F�����ϥ�
tx�UT����I���'S�8zsd�d�
����F��H�	{{����d�N��iM��6�v9j�8EgY���%W��8����_���I��T����ѥ�E/)�}9m�6�2�����*�]��>�K�_��;�m�e�)=��$�X-CX��.����L"�X&�!,��0��d�$2�e2�2�c�L��L"�X&�!,��0�	5%,Kz��.��I	½��~���JZ~{�C�V���R���v8s�� S�-�`�2i3^TH�>z`�İEz�� �+F�6[W�Ö�8]�+98![��xԦa�V�|���8��f�l�B������g��
x�eH���
���{I={E,�rW!��j�e2���x�\��p��Cy
�/BB˻�Wq�e0^������!��	!������m���ɩ���`Q7� �5n��Y[Ů���kRt�<8������������D���žصUb��.3J�*����U"��*�!vm��B��|�#�?�o�9�=�x�����ɺ�!��4�Emߋ,�_B�4[A�K�S������|
����L�cU��O�/�vd�8����\�51ǽ�_r톟1M~�Ի=\	Vo�V�z��ƟN�{�9���W��@"C��%n�&m�t�I�%�s,!��,����Z!KH�a��ҍ����f	�<J��KH�a���KHd�%d2�f	���D�YB&C,!�a���<���dث�dȫKdث�dȫKdث�dȫKdث�d��նN�ն�WOz<��o�u����D����=���U�ձ�'>ԍ	�CUU�DF��(}�Lf��-G���cb�/Wx�$����+bi�f'u��_l�/�Q@Κ%6���}�aM�s;=�Z��a�tF%���N��;�e邏���NQ��!�Ѱ�5�����z��<Wt�F���Sô"�z�7��j��
zj7�jH/9�`h�6�
�FRj�`hT�F[��HC��
ah��!��̡����x�����
ݪ�%��}��a~㊣F�$+'�o�nɒH��b�$�c�LV¤Ü��`5�˱bL*��aR�u
��\j�1L�������穉u�����?$�s|���� �o�z��w1��,�������T�ӗ�K�U3���nC��C��	�5�Ԍ��]Z��k�o���u6~n��C�Svu�{��5����[�VO�z�Z=S�m�
ć����Z��[�oj�7���Z��5�[�45s�牃^�P�]x�Lm�f�S���t�:�L��y��3]�x�Lm����&k�7l]��I�65���#���Gڥi�<8����iU�4	HV,�Q+��+#���I�8H�PKE��T3ľ�7&pip/_vendor/chardet/sbcharsetprober.py�Xmo"9�ί(M���$�9if.�#���%�r;�h��4��6�v'��{��~����f��U���T����]�w�!
�=w8q�z0�FGd�g4]3)��/�'�xD�.�O���2a'X�*b�L�@KEDۍ�r�!v�^��[�H.I�@C~�t�[���&y�k.���T�ӣT�z���ق�;�X=�Wk��QkM�^�.:�s@Ԋ��+��lDc1���Mz2Ԋ�cܯ�>b��W/���J�
�'X�IKz����d��?_H�/���J�
>W���.cɥ~��h'c
��[�(9��䇋����F.�rg��p���ki�6Q���,�U莅L��x.x�X1�#ښ�h}p�1d�B�����q웳M��B����]��kc?½5�-�#�p�L�]��M�C�Fp�q�7���[��d��~4�Rw�D�w���p��	�v��o���R~�w0�w��uП>�o�ӡ;���hL]z쎧��l���l�8��m����ƙuN޻x	ȍ�'Q$>Qr�'�7��bAk��!�CU-�G�lw)�B�+{_�����B�zS���D(��:������9���E ���%�o��ʡki#�Ѕn�����9�l��cr�7�I>g��R�h)8��:Bg
,�7l��`�L;埭�sx(�aq��]LYo��� {HɕT;��0W���0`��_K�h4&��z�Y���Bt����@�ӻz�w��}��[��x���v]��*�W�5#�i�I�R�6��N����;z��
o+#��+�,��%^�z~p�	��(���ڟ3��}q�F�?��r�����_�K�8�><\o������d��s���ݽ7v��~�N�G��w.~!B~�/.�oy�\XU�a���G�io6-�w�.��н��\6�܂-��8z��5#&�YW: %O1�Ylqu��o&\^�qWC�����$�V{��:l��G۟�=�x�r}c2�j5=���q�s�Qb�r|��%��V��<w��2Xď�q�
��ch�\
����t��iҧ��:IS����#���9&��%��HYȝ�7Q��~-OI��~=���5B�O�d����:�>��'��%�8��uqyy�Wϝ/�*��^�7^��gQ%�
N��hy���N�ZQҢ�>�3�Դ��7��	�du*���D6��z�w{���G�T��k>��X�U�v�Q+m�(w�Čy���e��L���
Y�5R暃�=�Q9s@0���GL�/�G�@�P�?�:�ސ��f`f�p�0�#������=�&R�lf�mՎ���[�``��p�m$z۷�𴿪�Hm�6��"2�~��u�s)R��k[rI����1lk���4c�ʹ��fթ7���ƽ�ݛV�>��1�����<=\�^�;�F�w�A����ҧW_��0��e�1�w	�~��'�f��z���g/��0�So4��G�:8��Y���f
N�����P���)C��Q�d�d��뚙W���MN�K�P\q��𾢔��W���s�1�yA�^��8'�z1��S��1õ¹!�܁u+h)b�+}x�^�djOHO9�G6�ԃ���]
9_,�粥_���@U
��#R��I'�o��	+jz���(O�{j8�Ҿ��Y�����{�}�N�޴?��XΠJ�~M�]?�W}�JY򅩶�L3�V���4�i���O$���Z���U�h|��!rL��w�z�~����4j���:D6�B1�#�ןV�0�<��܉���#s&��+߼͗J��b�]K��T�mX��w\j�q�?�~��_�p4��C�Uǀ�tU��Ұ����y����)MЪF�>f5�R�
�j���~�^��6����PU7�T��Q���꿔((�'��}�*Vי�f*O��@��&���Q����4��[��U��P	v��@�sӧv+��I'M�v%�
�mVZ����T��6�VW�����S�+N�Se�$Q?|(��j�PKE��T��͉!&pip/_vendor/chardet/sbcsgroupprober.py�W�n�H}�W�����!��f&� N�B٠(Z���n��F�m��{���h��Zi�:u�������붝��P��o����k�8������Ԗ'��M�+��(K�4(�)�
E���HE!X�W[7F��/y,\���)�����|�&"dF�D�ZH��`H����3�#�7�����X�5T�U�U���m���N�8&��j��jɣ̓�L���Ut�'^�ޘ�����J��`�!#i�63�l8���X,-]��D(B��bjm�;Q�����叴�)�,!�#�3���!�DJ����dm��$���-��\o���Q�k�B/<�
��8!��"���4-웞�C�l
�sC�Y~�G�t�ۦ/tWol��5�Jf��H��
Va�b�Km%�!�{�H6�3$� ]��h�)�|��5 ����a�?R��A�M�k����E*@E�3$1_���J�Ĭa8��݁D��v�ᇵ���ߧ�GM4���u�
Fޠ�;u$��m�m0˂���s�H�I��u�ҫa`ь-9�rtUD�X)��L�!��#�	%��h�j�y�]���[CW���7�Ē�)�!�,&�~��T5jIm,�[��w���M��m�h����GN����s}u5Qh�z>[�J����c�)�������RJ.2�c�WE����d:N�)S�%h#o�]�<<��֨����f/x�?9�ʬ������}�z<E|?�A�
^<�y-�vH9�*�H���9�r �&%�Uv���Q���fj��;P~{P=�[�Z�農n���{#�?P��|�^J�g����w����l�?<���+#zD?t�G<�~��6v��I�L�>1N�+�G0y���)��q^���E2�ykmx^�y_]�1Ӛ�V�?��i[`YYG#>� XyAP�<����)�_�Z�ѫ;RV|AnԯB'��r�e��g̯��rP���A��]<���b�Z6繂_u;̽Y�.����ͨ� L5̱�����yȽ�,O+�>56��+
+������M,4)��l[.���ɞ9{�_2T��Q��Ql���AWJ�X+��4�}����oá��q<,I�^��+͆I*{�,5��._��v�3m��'i�)�j��A6���A6�]k�6+�c���2�)N��|��fX�I�7� �����,�5t�>A>�˼����V�<d�I�;E�#g
�4�
��86���wM���Ga�]��ser~\Uk�
�E�M����K՗��/�:]��
�[�_�ѩ�u�'��Ķ��W��wjg{:O��
h�-��y���H"��7���e��X���(f�ݎ���o�?�SN�� ���eA<]�_M���?/���|X�F���Q���`k�PKE��Trz���!pip/_vendor/chardet/sjisprober.py�V���F���bt�H�r�HT��)U9>�H��m���e���w��������95UkE�1;��̛ٱ�����?'4v��O��i���{]�&o�h���� ���qM����8hI���V�p
n8<{��r��%�
�O��a�a0%I*x.��O��*�b�I�����E��f��e�6[�Z�w�~��WPT�����X_M�L��hWIW
��"5R�u�,D�@}��W�'tC�А�4ۚ�y��&���Ui�#-��+���L))q�����,�rkM��P���0��BÇɜFL#Sz`�)T3K1�	�(д�6�>(5���y"4���Խ#�qnc�0�a���v-gl�TT����X`Io)F7T�lUJp�4".2�5�� D�_1F�`�j�L�&�K����t�Qg�D�;�әxOw��8E�vL<��ĨJ�l�8�}��D�~8zO6��Л�]�S�:4�8ް;u�͝���\�
���U"�%^�2�P2b&�ޕ���j$G�^�2���Wd����R��z9zG|IB�&}U���;�.X�mb��V�~i�)_b��|����R�&�Km�����v�����M4wa��P��K�V[*�P+\j?v��@{��OC�W�w�&�+"��Z��6��$�\���N\{2ޝ�&Rܚ�+?�ܚ4SrQ�r�6�0����Ͼ��D���@3��W��[ú8u��e���I��w�x��j�ZZg��^ͅ
��q[��s�1߯k/s�}t��Vo����<s}��B��Qb'�r��J���ض�Й����OQ
���|g�Pv�j�c���E��v!�/���R̤J\�-/�ǁX����է`�wu�x�X��7��
�!u	h�ߝ��jG�İz��}�	�mG���%lA�Y�oA�v���.U��8S�8ھ	�\� Q��~�b��7��/�Tk��R(o���7��Y	ܕP��B�j~nnT��ׯ�GZ���g�>X����C��)�c��I�z�At�ë�<��؏��=���S�����S�\8��6��9��6l�ǟ�g����70�*��U��m_ԇ��G%�yA{�������R�C�s:k��4?Xlq������*%kzW2�?��2�A����Nj�Ԛۢ��M���1ʼ��{t
z}������#_-�J�	���>>�������\��͹K12������S���=�{t��1����"W�t2���p���K���zn�'E��yk����H�g����\�G܍��PKE��T}�"�3(pip/_vendor/chardet/universaldetector.py�Zms���_�ʓF�J�$�9_/S[�l5���^�n$�%���}J����|IP�ri'���"w��<���H����hBƣ�`2���M�GRA{T;"�5%7[1�tI߷)a�\�?1�5ɽ�i�ድ6NCbӐZ�H�Z"a䱐�}�����jD����2�^m6��,3d���g����[?�נּ�!��r'$��2���P�4�M��t� BKn�3�%wH���4x��\I�€-#X_�7O�
!�f�@n��
؆�	�0$�Onw���t���L���~�^��XA�R�-3ءv��R�}'|���%;?"�鑀ڌ��AS!1=��~��f�_E�
��e�4��Dɗ�{2��B.�G�6Z���1���)19��;��T9ĉL㉐�����;���7�gt��b�-X+i�!�̽E�&LzG\0W�pZd+�	��5����'p?��$�ԉ�HZ�~4�����������l2��h��,%���e V�^������]�
8��G����~8�M�)�ܑ3r{v7���gw��f:0���&*Feꔜ���4	Ab2�˥�r��k���H������	��dC�Vb���)�-a�E���Y�.H��ۂ���y�"�{p�S`2D]�Z���!�^�o���v���N���)��z�`r�B�9���ڵoG.Ux�3���p�)�\$x��krK]3k����[NPDM|�F\"�b����Eb�d�j�fN��û�b��Gy3#Wb�Qu�����5=18il�¼꘸\"zʱ�QXF�h���^j5pc�ʶx��W0�*�	��9�ƈz��v�KP@LӇ/S^�[�%f�^S��mNC���*2Wt�\��A.T|Mx��e��x������I��]�l���f���iy�\O<�G��=9��I�gC|�b�)9�i
�5�����d��#]2u=Cz.�9�ga�	i��`Z�8�P<&^��
��YW�EN�'+xi�6���?������|v�
���I�ሒ;!/��S)�0����?�'"���i4�4�C���Η;XQ����j�A@y䆵T����dt}=�]�
�W7� ����x5�����
��٠?!aX�f�\�X�?~����e8�\�C��J�Ƨ����s3�}?��L������f�l�g�@�s��:�~�͛�߷��SR�<���n�u���P�
T-��UWKuR�:�R}W�:�R�)P��R}_�z���Ⱦ��~����C�s����봠��VsG�һ<Jg�q�4ɍ9��<��y����h�.��4y9�>~ΓH�r��F/v�s�ʦ�+CT�s^= O(������+�
d�T$��.��X�k��	=o�]�|��<�ڱA4�xo�
Z��;ܥ�UV&l��.�axe
T���e��e�����
,�f~+W_`M2	>�y���v���[��C\ܱ̂I�"T�
"km�g�Y�/I--�<D�=wG<�l�
CY[�
�H�6\��BqmB���T�Y��}+���t͇��$;A�ӴH=KO�ct��vL�6�������s�mu4����"����l����RY:��U8�9E&�L�QIb�t��%IX�&EQ�7�䤞.Ӿ@g�*(.�p�����X�=�����GI��p
e�j��Du�#4s��jK#|��;�d���~�T>֚b��GӍh2S�V�E*��fb�C/�Gq̈��y ���Y_(���S4��ыlL�;Xł.)�i���b!C���j*���
:@���)���>�;�	X�b-���հ�oqZT�R�x��RS1'���j�4� ��z$H�y�%1��R��ğ^D�8� hE	��H��5�2
؄$ekf��kfc���y�'��n���-�=��9� 7b�XbW ������̎�(��`Ad��Ø�R1t�=�19f��,��ِ-���9�`H�������t�i�K߅���y���R)s�9����ɔ�P׈�%����((r<h����AS�����BS�=�JY��M=���ViG1��㒭�q�I�u)�^L��b���_��eڤ�J��t:�_]���D�i�UZ߈GP���̅m�K	"��W�^��]��m����ɫ�������j�꒪�j��/��Y������'jC����aX���'b�{��tJ�!��>��­{�p�cJY������a?'�uRJ���.	ŧ�(Ej�A�<P@�Zx ������ʶ�Q�b��HET$a*\3��d%��T��p�����Ek���(�O��)�����nhjμ�+�Tf�c/��\o�<���n=%�/6ʊ蜠×���	��V�>����UO���
q��R����na	<�t�԰2P�a2W����r�Ў�$�m�F�V��B�ZN��6�MF�K�����'�RI���~r1�*v~kGOz4ܖy	�k��@@F�h�P���`H���q���!-<��p�|!>R$E\t�bc����7k�<�K��P��(®�!��g���|W�������	�Li�1f~f�G�:�8�H.�g=��0������(n6���ٲ�?��f�.D4��JQ	�WEQ1Z��`5Z�W��Mlnp��'��T=��w�"���ۗ�x���x-B�����$܌����6���C*�ėd�R��c���	
y���+�
�δp�P��&�. .��l)^����i�!&PX�*�+SN&����f��ox�w�q#O�_�n6Y$���XN��=��w.u݁DἴşK��Bӣ���P#���Q=a%Õ�%P�X8O6&7�9�/��rm��(�6�MR�z�\d>xC4^���^:�g��^v�1x��`W �Y@çj�2���,!��٦t�����/Ow����i�o���O�+
r��y���h+��$�I�d��ʶ�,��ir�����R��?�<�שo�xȢE�q�Np�X�b���\�޷!Y�����I�%(�����s[�������'U.
�.�U��r�4�a��zn'��:&���f��6%�ʞ�0\�j`��)��b�-���U21[k1p+�5�ǒ�Pf�

˷(~��%�@���90>��\G�1:t:)��ы��a|�3��Gݔ+`�:)��?�5��V��J��NY�x�� .4�� 5]�
ΪiF���T���p�1�X��g
uD�/�dצ�4�0	p�Bl�Š�@��'�檑F�����k�-���,Y�뼤�zu�4�(��P�%hқ�Vc#���WB}�7��[�E��7y�~/�ОN��lӦ�̾6M��/��8����Hi�a7��e��Bu�H�xQ��$ɮ�\��+6���{6�K)3i֐��b�h��}׮�-�P,n_��x�ʪ�=[ϱ$��W���y���dE�ZTA�ޥT�u/9>�o8����^q2�>U���%����
>eW����"��s��~��r}��rl/S]������)��PKE��TaB�ja $pip/_vendor/chardet/utf1632prober.py�Ymo�H��_Q�贰C&�hn�2���,�r{ss#�1mh�q��vw��Umc0��eW��yF
vW=��T����\�?v{p�m�{�6\\]�~�ك=�-�P#�Š���'?0��'{`c)�L�)�!�?��s��7s�Px,������8,���j$�=���L8N5(��|����>�L�M4��C�+��@s`f�LO����!G��#�QόP�{���5>�f�YZKk�B�0C���f�XE� z�Ԭ�`�D`a'j�aM�)a�!�܏d
P~�����y�3�t~{{�|~��f�p�?�ILgR 0F��,�q�Ծm}��ݫ��3y��z�~:׷p7緃n���n�no���:@��e�)�EINS�#�Ta&G�0!u�g�W��r���f��t���f�gq(U0���*��A�(S�y(�v�ʳ�(+~k�
�z
�sP��)�zG�ݑJ�5�Pڐ�s�m4�q�7��>>)��ݻ�q
��Bݛ�Ps3��G�Th�����؇� "��D�FD0�,���=O2��n�qN���V%���g'���ۿ� c%M��U�Խ�*ϋ�3��<T8c�5��X�>��E�O8��n_HN�m}����M�H5?�H�LJC1N����D�
Ck5���'�{ϡ�j$��* g�B��U���`��(}l(��z���c�_PwJ`s�S� �qD�8Z�8��e�4�9�2�֌���X(��j�����5��𰴉s�a��dDS�r��Ϲ$/=�b�C̨7zT��S���\��8s����t�{p�Fb�a.1�����	�?θG}�"��	f�0��y��6��p��0�}^�7h�}�ޞ�!�Ө��$n�}p]�L��]:�aV��xu5����̎Xw\f\tG�4�·p��I��&�j�"8�>c�I�z��?G,�A�kV�gR�����`;Lj����.t���Y��Pw¤�j��j��3&B���-�u'�2�!�ƅ���?()�����O�a%��y5����E�l�7k��q�ڥ�+ˤTք�
����q����A�-r%�)�
�4��8�l�H��ߡ��m����\�`�q.�K����d3�~t1�؋-W%JS�Xq�Huv��I�Q��az^�����Kc.1hMaIZ������3zŲw(��+"s͈Z��j,�}OfP7��R�A�h�_�_����Η
��-�Pto&���ߐn��n�rw�{�ż6ݕB���7eS�����n����7�$���"���xzִ��yj���*�+��)��Uʢ���dh!g眻�PZ�k@�5֖�~�����Z�v�v��;C�ǧ-�Ŧ}/.��{�^�`%�\����xl$���+U揞�F�Ή%/ߦ�xC���Ę�~wtă�\܋�}Y]��#�;��(��
EF5��]��c���ɍV��g�j�Yʧ��o�g�6c���:���X�l	aķDp�Dͧ#8ތ�Y��dAaa:��¤�ǎ�I���\�L�t�2��'+��Ud��*�Ԫ=adIr{�k{ҽ��K�`>���6tL�n3E�-���+)�<>�G�x䙵�~�>v�-f�E�e=�(�~\Y��vߓfJ�..ck���N����<��q�Z�3,�t�]l~��/'Nn!�y���9�".�����^z���
��(�iԠ\m�u���r,k�'��S�#��ڹU�m�$����L�8gp\���^ݮ���[�w��z�z��Ɇ:F��SI8�5W��7g��J��"�!�Jf8Y�Z	{���;Xv
��Gbu�'s"ٻ��ڵ�1e�w�v�d�:��@E�d

zb���]y�;��y3�hO>7x�R�E�m���_|��tpmN/��$~���F�d3
�s@�4��~�YI>��נ��
x,����zy��o짦���40�ٮ�i/��]#�h��U�Wv	���n��+%-'����H��n��鮲9�jn�a����+PKE��TQhX7�
!pip/_vendor/chardet/utf8prober.py�V]o�F}�W���%.��Ur�T%�$�`#��*O�b�a{��_��\���~�g�̜93ryy���i�l:�߆��;�>���\B�Ap_s�R��k���<M�%�"�Y�&t*����o��-*�	�39(�A�#�E2eY.x��Bӫ�JU�PbXHU�#��`�]��SE��Jmt�=���P������"V����U'c)���H�սod�3�
����
��#a�3)�I���S�B�D!���y'bw��9DL�˜�*=	a���g��ɘ'�”���)XT�n4|r�0CML�	*�f��Rx�#�i�6�9(5)��5�HJ_�{��_�~C���ְ�Vg�T�e��O�����AJ�P
�:+����(�nH{��R��F�B�5&yڧߧ���`���獜��bIi���L<ۦ�SW�	�#�`n{�gB���i�R��L�}���`1��x9y�Xz׷-�����{�J�IR2F�x���_h���1l�Ҙ#�Q����>5�T�u�/A��O@HӇw�iwh�N�KY����GV�)��הF�|�J=I�T}x����a����j��`�������/��e��(��m��h�J��{�^�	���Y��&�>�ֆ�+cц�G����+O
A��wRGծ2�E�TGg�H�	_��П�s�ўu:�(eZ�֊U�ő�]p;�=�…�>�=����ca��ڄaWc�Ԁ��9ݝn��{E֍�D�L���#hH��*,E&�#I�V��g��ee��b}��y�1�AU��8%5�}�zB�2<&���J�En�����2�L�s��}qh3A�˰>�C�!]������\��t\��::RA�_��u�^G_jz��J�<�k�:��T�qs-�
¹}�Xя��JO�}���]:��4�������;�vM��J�0�B�(�=���O���
�����q�=�V��v`������T��"�1�"��v�`���ٳ�e��߄=^���"q8�\���Kt{{�t[����6������q���4C\SZ����t�Nm�PKE��T[��t��pip/_vendor/chardet/version.pyM�=k�@D���Uvs�Ic��i�MZq�V��!n����GR��+�Xk�9� ��E�����B��yZQI+ӕ�
�+Uᒑ[ꩢL��#��jI�f
�!�mq�
�G܆;i�⇋�I�1G�4�zċ�x�>�0�F�]����9�������麻E�������������۝l/tg�ݛ_PKE��T#pip/_vendor/chardet/cli/__init__.pyPKE��T�t��f	%pip/_vendor/chardet/cli/chardetect.py�V�o�6~�_q`Q�l�)�z��(�uE�=i��i�H���A��ݑ�,�P>�"y�x����0Ʋ�j������Ľ�`�렳N�ҭ�^��ap��.�	���dd�IS�F��ϲ_�]�ʢ�2���p���dĤ��f�n�*�Mc~s��;��=��(����P����W�m�}T`���;����tC��6�@9ہ
�2�e��(h<���r��#��9�q����ښ����iM��$v��{�0n�U�TH��9!�V�6ү��N�,:��"2@���Wg@��30l���p�b��O)��8f/%�V�@�	���D
�F��	��N������L8�r:�1HoF��1H����
��i{�s׶H�N�g��Π�g�P^����BLB��^��4.��1�8F��y{�J����+�{�]��b�H��Z�+^<HlQ���
V��Z��#^����l1?�������7؃'Oil�>����z9�ڀq<}f#H�ݰ)E��RŨ7���S���O�4����M�Dd"v\2gcYwB���C��{V¿���XZ��:ҙ�4:iB�,9,�=�'VR*��:%�>��<^�4���VZ6�xMwm�.~�u������9��\�ww�=e����X:Ͳ��v:����}�r�� ��dNZ���ĝ���B$Jv���}����2j��'��k\4M5�|�E�d�ya/۾d���=�I(��vh)�{IMC޸�r���c�u$���$��Bb��Y���qe�ܖ�'+��d?,���
%9�vPJ��wG�ٌ�ϰ�ꔓ��U*�z�Z��=<.މ�%����.�Ѕ>6N�͒�H�h�G拥z(������Gm_x={����c(C����cD�=r���]B�|������F��i�=���m+�}�wRI�3��6/@I,W<t��K/2�N�)�	�������`6��f���F9f[:wnp��D׳�X��^R�<�>�4�*(K`UE"WU,/�PKE��T(pip/_vendor/chardet/metadata/__init__.pyPKE��T}0���3)pip/_vendor/chardet/metadata/languages.py�[�S��篨o|8G]W%�TvEQW��ٞ��i���8�a��/�(r���
�G�}���y���:����K�L3���awWVV毲2����Wքe&��b�"#��;�KH�pz���("�0�d�ay��@AxE�H��Z���ȸ.̈-Xn��j�����ew��XDr�H���	)�"�겲�0+9��C�IF*�H�.
�I	¨!,��(\�A���Z���,Rq�HTe�HA��sX�A���]��d��T
�3��j�ʿ?�x��LEYYY�c$	O]S��x��-���3���F;װ]��x&�kP+�V"0"}w�����4���v:�=Q��z���২ՠ=U�v���$�v�݈mGQA��<���m���f%\i3,��@)��μAmN�$m�%�Xh��ɗ����Ag��f܁1�m�klD�yAR8c4,���'y
���-�k�� p.1��HX��ȼ�n��^F��$%�BA32F��	�{�#�#	��2\4����	�
��&�7)KZ���OY�,=��UT�O��GP`�p=�ǀ�΀)�af��ȁDuK��._�n���K2#�(���g�k�X�m�(��
��DPRd�90z�YJ��x�
�[�bA
a��9}�v���/ώ-a�=g�t�:!�.;�j��,��(ʹ�. �Y�P|WsEMNF%�����y�Wۮ�-|~CFvh�<�d���s>I�eu�a�^��&oN�9k@E��iA�{��庩`��}7�9����`M`�m��Q�r_�VC�4,�,w�b������竾(�|9�u8TP�gZ+**�p�z!:��
��~r���"���2�(��t�H�(-T�;/�����>{�uV�.�	l)��;�fe��m�)��նR7+��}~�'C���iVvx^~?�O��r��Y/W��,;^{��ڣ
- ��Κ����d�jy��x,S#����=y��]�,v�bƑc��	�fd;�S{����H�w����3��"�i�
��G������.�%%���
�GxQ3�	\쾅�U#;�`��cPT!Z�,���5n:��7��n��xՁ�V}K��l��g[�v��g��5���w��~�pY��R�A�a�Q�q�I�i�Yr9�<�"�2�*�:�&��\M�M�%�%�'?$?&�d,�)���������%u%՛�K��R����pj$5�K]M��&R��k��)_	�x��|�H�O��x�~�e5�$5�\������ØcDE�$������L(��cB^�+�x7}�'�F��	��,ǁ�zBm]���ִuӺe�Z3�mkȚ���u׺gݷ�%�К�Y��'�S��zi��^[o�k�zk�Y��)�1>cŬOֺ��b}�~�_�����{�`|(>�_���'��k����T�d+��k�p[�_�Sf�pX�aV��C�:q����xNF�>��m}���&��_����S�-u�s����w@}����6�8�/j|��K8.����t�'қ$8.���wox�%}B��-��+cD[3�%��x�}1�j���>����ڄ1�M�Ƣ�H�7^kw�/�!:�1]�����g
�gx���$M�I��!&��e�
mq�&=�T�6��j��U>"�…��b��bKx�����6�{�}�>k��mF�SZ�l�_s�Q���!)�Uĸ���v����۩O�_��^oU�U�f�3ߛ̏�j��O��b~5ٸ�ѻѿѷ1�1�1�1�1�1j�4_���7���yÜ6o����9kΙ��yǼk�3��=2�O̧�3s�2G�Qs�7'�-<���1�|�1�a�^n���B	t3����%yh��B3��/��	��B)
�4�:�?�B�*��J�C���?g��qC7�Όi�aA}2��nX�^��wr^���qWV�W]�j��#�
G��w�����}������-Ɲ�3�˶�
�-���}�G��P`Kt+����O�k�檶�-k��5�x�)�W�&�im~�~�6L�(x4H����_�$�H�;u5��C����n(v��Jt���9K=W��ç/��{�M��p�wbH�@��p}��c��e�L�v�q�L �;��ŌQ�J�����n�X��B��������·��k-m����Ӡ3d0_�ka
2l9��"�aOX2cKxj����7��E�T{��F�i��s�vE�ӆ�Xu��5mN[�ƶ���La�
�r�(l��l��,��i�����0\E!d�p@��% KxA����@H��"�S�����ĭ�L�vb61��O,$�$�&�%�'K����G�lj'���g�����Jb5�4h���C���i�(�F.�$�؈�1�\΅d�h��<�=H����Ɓ�	}8�OAPtyc	|�%�+
��P�~B��i���o�y8J7��w`�E��o����x������Ǔ��
��)L�U@�>W�j6���i�5VJ��=�2�8&Z�o��p���Pxa�z��?�_��ܸv4�gH�K�-�+�?$�,XY��e��Y9�0[�."/4�'��o�
DŽi&�æ��+����o�g�jH��syk�xk<����Ja}N�M-Sӓ�؍5�]�[B
(�X��QE�c�"��k���8w��8�
�%Jfn��4�7`��~�����z�	c0y��4�Ӱ�x���ة����ʢ�
�[��N%P��&&�C[��."/�#�;����}��#����5k��ǂ�����hp�u8x�z�;�O;ǂ�[�����9z4�w�qޏ�ly���n�P�^�K��N��Q���?&��%�o�8�Hx���o�k��F^�!Q����F/,���4]��gΞ;oČu�!S���F��A[�ksAV�{.��-6^�-H�,
�:�>m��hQV:,�`g�<��#r/l=�!.C\�3���S��<�"�S�����lS?m{[Ҭ-�G�B�N���u��(Q�!P۴2�x���oz`4���o�/G��tV�-��2�+�ύg?�c�}z~K��o��N~͋äo늿�s�-��߶y
������%T�
p��qd\�E��^����	]L�s�4�׌Kށ��R�9�J�+����^+i�[�Œs��
8KڄӿЫ%�qӹ\�����jK|g�ˤ�c����Px�S��{��4+�|�]��n�`܅Z����A�
`�-���yZ��0�+�#�ݙu[��]S!��8^H��H��ez=���;e������.K���aQP:�i>vM\sc%�}^覥3�B�d$#Ju�J�B����g/�	h_�Vz������̭���¦���W��4��
����v��rx�{�ݶR��-U�fkd�oR#C�^�����D$�Q��:B�Q���*Qlj:A�I�^#�u�N�Q��z����:C��D�%�Q牺@�;D�K�{D�O�E�.�Q�Q�	Q��Q�����/���������o��B�U��%�Q��=Q?�#Q?U%j������%�>�'�$�!&�%�1�Jb�$6Ab�$v�Į���� �i�Ib�Hl��n��,�͑�<�-�^���s�9셭�[4ъ�Y:��PxN��f.�ϞVzP��Όco^�z�`9lb%�W������������]�ˊ�����ٴup�ڰ}�w6�+���f����zF��v�<M�- �w���E�6�˒�����.�B;�	���-���Վl�\N�с�+��s�fk�2י��9,�ծ.G�<y��\�Si����`gցS�~�g�>n�C�%�K��ؖ�-�]N�0'W��a9&�����ˡ#�������i���Kyk]�	�o��=5��[Q�ښ[cucV}a�n8i�K�k�"��Š8�J	�i�}w�+A�.81b,��=4�F9��~��WE@�J�9�T��	I;����UE2� $%t�������=2熫�����
Z��fk��c��
B}�j:��TQy���0�����_Q��`���.z�ܫ�ِv�K�0�`LB8�ѿ@!��@.d8�(��nw)�����k8a��yd��� rtzBne��g��!��!�MZ Ho6��m9�ݯK���_W���SK�o����6Y��n���|�����s��@]�_�o����O�|�����PKE��T��Բ� pip/_vendor/colorama/__init__.pyM�M��@D�
{�ԸGkTT�K�84���ɴ���FT�Tԣ���Z�`%����aP8�TS(�ˀ�D���(�D�e9�T3�q ��Tp�w[nN��Ö����%�b���f/c�5�^&Xs��
])ϚD?�&W���v�O�(˼��&��=���w#����PKE��TR٭���	pip/_vendor/colorama/ansi.py�V���8��+T5C-���$�Iq�̐0��&��Kc7X#{%���ߖ��T���{�n���"~��$�|�8U	��
����%����S��@R��!�L'~0[d�R�Z�m[��I���]
dU �p���(��F
���*#�`\1��H�	B|�8Me�ZܐD���xwϾ�bF���\�յ�
AF4�P��,�
���������^�m[�`jV�Y1�M-��B]�l�U��"x	P;����H%
�[��JP�bب����tZ��{g����YS�"���-lzMi��i?اܔq�U�G}�QJ%�����oeO�@�J��
Cƙ
Ö�t]�uETD\�K)�R�=��1�%DC|�}�gX�<�'�KE�ȩb�ڃN�7R�#8Q�ș�N�4ы����)d�Tbv�>�S�w�ꨵ��(�E������[�)����
%�t������;@�m@麌^�p�{�ŞΙ#�Z�]?�����<��O�B���cp㊡}$�珳�PG��|�8\�_�+�h�|	u\Q?͗%�����C7è����>�3�〔j�)�xrb�w�Ƶ�D�5��"fu�g�/�t:��2�Cp&��~x�V�S��/����&���)�]�:��2�Y%�Ov=hk�Dz��LS��<τ��c�J@��'ٺ�Gؘ������nez���[��WE�n�^�
(ze��9�R��^i�W�{U1^W���1���F4��^��5y�k�����^��&/xM^�~�\������i���4��u��:M�p�&K�N�KuH�Xhb�e"�����=��ᴌ�3�S�wı,��1��AԶ��1cȶejx����}P˗C�PKE��T1�}�N*#pip/_vendor/colorama/ansitowin32.py�Zms۸��_��?�J%�v:��WM*˺ĉ���N��v90I<SK�Q���.@|���3��`w����!��d��˕f�d����-Ou$����Ո�]��W�i�3%X"Vb����b:�x=c�0��p��T�T�Wj��K��\��U���	\� S@ë3<��k���9�]Z�Mk��s��0���^Le$S�"�R��I>n�Q4�_���J�c�QƠ�Žc�b�����_9�N�A>��R�j*��6�I"RO>�$�7b�^�~�b�)�<�+���e����K|ęN�O	OE�Y��o[��)�QDP\�4|̴�@���jF6��^�9�m�P��{W!���E$�\�9Ӓ�,%�����ca�4�XIW�X0��P���D�@2s>`A.kMſC�<Fb��s����	��+�fNR���s+���z�b��K�pp
+�y��J��.4n"����Q�||}�U:.M8p�]
���r����Y3;ʫNkG�p�{�ӥ��O���N%"y�/b$�S���m1np4{Y\��|�2ҁZi��ӗ/aM�'	6."�r��_D~(c��䏯N���?�ܬ�ù*�C�:���i�K3�B��U�h����2����ޘ7�!��א�zםXuިtV�M�~s�q�?wNaĻfPB��Яv�s�-�<
���b�Eة�A(%MޚI���9����4�xz[�Ԧ̸��=�^��/ӷ����O�7���H�_�T�%�n�d<��ρ�a&�o�$ȷ�w"���W�/ݤY�:�V<ߘL���#s_���@�ɓe��2���~�*�p�:�2�g}�W�x ;/�DI%�v%FV&P'�f�!U�5sMwvNJ��,���(����QfѰ��[a���r�(��@6+H��
� �!�X��^U�3e��x
���b�p#o����ڋu�50	�Ң�J�p�5 �r��%��V�	�|��`���P��)�JeBaT�¢0��	�I��-oP���B�TE��X˼���d���0�6�T����]� PR���@���_��zu�y�O����������'�<�a���^�V��NeĮ����Y`-�y>]O;�y��y�`�{��>'\o�[�r�︄��B��?f	�5π�񘲲R'o�̀�t
����!�1w@3�*�6���dA�F*���^*\^0�gF��&jm�e���0Gq����ZP@�&�4A7Bwf���WE.8��w^%�)g���1�"@�ء��b�sԹŸVCU��x���ym�w��,�e9@�n͑X���e�8C���P9���rĦ�%��n�|!㡂%����H�0&-�0�]��iLz˹Pe�hbPA.�v(���5Ltg���c�a�g���-�F�)w�:ӫq�r�V]'la U��B�oDMA�;,2W9��LCF�lF$V�-�i�.�þ6#��l��Vǯ��\��`��X`�9+�5�m�
D��q���漐C��;��!���ezBz]E��2g(�.��%�������c�u��t��Ƥ�
P�2b�X�9t��b�ȳL�C���7.T�pq ��b՗6=���	*�#����� �R��0E�nPeB]�*�},�3��@�����Xq
]�(+�#���'_[��-F�S	UR565�̠���Cbf������	8��no�� �2��ZA���PmQ�/\\KJ�y�=�ύ��8[]ͮg7����ycD��H��ٳ��7ooAe�i�;���C��OW&��f�o�C����d��AX�IT~�d^w�_��wK��.�7W������K�������n��ϳ.�?Ϻ�?L��>�Lv�]�/���.�۷7��t/$@C�K����Ÿ�����>�A҉�D���Ģ{����3C���hz�i�g{b�ꄳc�D�H��{bQT>�_:����M�t6�7�|��jһ��d��T���&�opS
�����nj���H��M5�nn"�7�:��������.n��W�&#�%�������k�f���Mm!�'Z7�؞xMnj	�=�Z��=��DlrSK(���M-��
�K���-�����:o[��mbk{^��(����p烚���f�r&�s�"���i�s���e��=��~�����n��|��{�uo���A�5�=08o���Y���~ׄ��[����ܢ��!��P�Q�v.g��h���-� 8�ގ��|�{>���'�f�Y�ᔇ�ue�,U��<cG}Ǖ�
ja���k�����9粣l8��W��y
f�ϑb�{�!�އ]k�����E,��0�f�e*�D��<�A��	h�ԑ��m�`qd�X8f�����2��Na��I\*Wq�Q�Np0�%6ө�Yjd�8��o�z�2C�:�I^�p�a�[g��nG`x��.z;��Y	r�K�(��
W��� 2e��	�8SA�F��z�j�Y��0(�Xٓ���⨼����^��yǃ.�o7��k�V���Y�0���P��^sPEw$���yhr6=	�U��歛e�FT{0�w��)�h�)���bL����<���Tmܐ�#���r R�����������lol��� v\=�m.^�L��o���ڼ)W�WA*����3�s�4�x�9E��������%�*���C���2-ZU�fɈ�����7)bre�"�������H\�N=h���d���w.7�M�
b���n�a�H}0��?�&�$8���;���
��
��
��;k�C�������Li'��Q�
bC�����k�w�C_c�+��$�O��<�0{�@�yGSgn���f���Ȗ�@fP0���;��gȵYLP�U�J���@���5ԑ�?0!,l���v!cla�1���K�a.�JC�K���I��1��AG';j
��YK�9o;}��>���PKE��ToEr�{"pip/_vendor/colorama/initialise.py�TM��0��W��æ��	�R$���eWpT�ͤ58v5v(���Η��ҍT՞�ߛy��Ա&�?��$3&�##�����)����+�*� ���4"|�]����Pp�i�ˣ"��_n��NI�7�o;��u�JH��ܨ��h���A}s�(����&W����ބD�):;1�D�0�������>2��1ʱB�fÄ����Njp
R�f��3�պB��y����;�����N��CmA�W�/H�ip��KnbV�]�����A2��na�۵��=P��@�Avv`2��:��'�S�Y~���G��ve��5����'�ܱ�*��=qspYA�0�����{��L��A	�[FI �u�n����ٌ�M�[g�Vb�w��m�鞗��%<�9�LJ~�q]N�#de<�5�zACܙ��#�?������<:t��{అ������h���� ��'!ݼ:q�Ñ��aVCu��z�yA�4A[�'4��3z;�ti�,�d{$v��"V��s��vNt�׿On�Qpt�.�1T j�"���K[��Օ��&��r��Τy^�&�ޠ��]ڈ�t�M���&I�{;�e��~5�'N�>�J����7���m�7�BS�lC�PKE��TPpip/_vendor/colorama/win32.py�W[o�F~��%����5��t]y��x����p���f�8�_�3��\�I[iQd�3��m�Ɉnv,~��������|�H`G�O�.lr�ܒ��Q�eH��r� ��h<s�$���c2�&�8]y�h�,o�_�䊜��ɗ�b�����.�x��L_�6�sJ�D��O��yl7�^,gB#A���ڑ���8��N�.u(���A�k!X�����"��/1/�f4���є���"J
Ȓx�U��eō��&vp��	��.oW;�E�2_dc�~䡛���l9^r��|��E�{p��Sԡ�x�#�̙OǮ3Z��3�����x�Nfws��^������$N�Z��vd#��p����h�ϒ(�(�:�w8��_��8e�SvOy,b�v2n��r�)�=��r�>�[��|=����h���g�%^gk%����B��58$�*�0���dh|��?sH>�&+��Va��Z���sy^�&xpЩBp�>���nIS�!�
Aׇԅl2�@�B��<��1U����pD���ZU
X���RH.�m��)`{�I���e"�ʔSi�E�ae#�^���g��q�Z�.��7Y��!mw���5e��P.U�]t��3������f>���!��^5oD]�"5|]�\��z��Y��_��:p(�v'I!7��&#�;�/�]�`��~U���J"��{����}N�1Z}i������w��^7�·�n�������Y.:
]i�4���
gDy����b��ٰ̒�g�\���O��g�]А��J_�x�(M�B�Y����9\y�Ψ#3IH�p�k�j|���3ԆoZ�A�]�457z��F�ڍ��B]�e��u����3}I�w���w�xH��B[X�W��]e�ͩ�н�4��ʸ�Z�LO�M5��fa|�S*���$$"��9�f�А0/}B�JR*�8}�K�8,��+rJ0K�cNjۺ5�׹�y�}�;a_jr���d�9=�7X��6«-��9	�L��ԹM�e���Ƌ�3krxk���Y/f%��ۈ����Y:v|7�H)%�h��?ǰ�7�!'�g��}�(�����:(��\�k�
$�W�S�^�|,8�B�x�L���eFe�bl��29H��N��j�{!ЫF��H�D���1�>�z�O-8���o�Z�Qf�Y��eC�+�4[�[i��T/��-ED���t�C��4�ɔ���QK&�A�v[G�ٟ�[jK�}V��n�C��K2�d���
��>=$*�����h�m[<��T<����,�/���Ob��w��W_+��ΐ'?q��˱'��R��4i��r�3��m�@�]�`�PKE��T�(���&pip/_vendor/colorama/winterm.py��nG�8R	ނ��Q%"٘8N��Q�'���l�̠��`*���3�]f�CW}(/�3s�qzl����L�{F}1�)��H�
NڝS��pz�K�,%��!�)iAJ\_���q�qB�ڔ�9x��X���V��A�#2��ja�)|�i�%�7X��{
�w~}��v�m�}PpG���~���n���T���h���?�]�7g������������Pt,V	qGή�����6�!�� Ƚh�����q��H�4��|wSA�)�G�'���������v�6�ژ��k[׈La2�i,&�FJ��1R�$�M����TT�K"z��,!�Bϳ��+:e
�0��~�iz�3!xd��.˔���wiÑЬ<�2NP�>��<ir�'�-x�i����W���̳�2ե�!��	[�-X�l	bF��*n��n���k��|941�L@�� @��g��3oY�P���L�����~�
+3�V4���%�� ��E�rn{�n+�I�2ՍH�<����Z�НS+�8�V��"x�WxҰ����Z��7-��'��W�.��aq��&K���x٬��s$���[�g����0-�9QJ'�Q�Qd��ŻF7t߯0$V�+����;˨"X�EF!��ti�B���׊�K�X�ˌ�t��sj�.�� 97u��m�Y��c�PQ��+޶��[Q�JТ�Ϻ�6ʍ��T|Y��f-?v�J�JG;������������q�[ܾ�UL��*h
�mb���T��"�h��J*�P���F�����Xm��2F�;����>)���n3/$��7�Q�a�=��bWhhZc`ӝ0��"f�@�Z��,+�؋������ih�29'��{?陏�W��d�X�8�S�Z�Բ}. �\�R�hjoC{�3�ȷ^��=7�5�.e�Z�X�8�3+s7���^Y2�	�J�&1�SQN��&w �Ge`��+��bW�c�}�Aֆ��Y�F�H�\E+S���K�
��v��il��SS�֗D��a瞴��Q�o�
��q�ډ�cqLRU�Ƈs�E��]^�C�˒i�s���٨c"�z	�R6U�Z���w�b���R��[����`������n�w���<u� >�EZ&a);h6��4=��$�$IR�D2ΒM�m-Y��s����`�̩�|[��]j@�F�K5�\�[���M�ܮ��ª�o>��I
]\�K�1f�D͏��-sg��`U����*[�
�Ҥ�C���pt��j7��b�'?[fa��-��ɇ�8Rj�u�_�d�"�$>���Z�[$0u2��"�<��vG���-�t��([�)�;�*��Tm<��%�Z5��czlnN�un?��Ggs&��TӜ���s
`��Ns��'1%O��%�����l��y��˟�U9��Ѧ���jK�~����m쇴Ѿ�������<�D,�dz����ƋT�j��?PKE��Tu*�x]Epip/_vendor/distlib/__init__.py�Q�N�0��+,�@�X5����.�!&UZ�*k�.�&����]�v#��~y~~N<]� s��e{.F�<��5G2��0�NF�=‡����4M(��dh[́����;g!q�hBxq{�k6�I�Z�Y&�ݳ��$�-wZ	"ċ�|��C>0h��l�ܬO��:�@�)S7�*W�b\�4�Fj�E�����]x�TV鶅g�re��C�Mg���H��FXJ1OiA�>K��i���WqS!)��a��̉E�AC��u��x⦗:�(��p��ʱ�]��-V�
f�� :���am�_RF�c�}�T�tGX	 o�t���ȏL��%r�c~�Z]c�)�y~�r� P�PKE��T�&�8F++�pip/_vendor/distlib/compat.py�}�z7��=�/�ն�\���8�<юcy-9ɮ�aZ��Q���d�7߷���w���@h4I;���o��&�@�PU�
�}q��@̊8�o�DS�>�_�����q�Z��͢��H<y|����L|���Z�G?����LgI^%��Q/�z]/�\��>*�h�8�S�
>$��`��.��.��M�$�$��y�����'��O�]-�<�g�.ޜ~�����9���e��鼩�2�NE�\%4������)�ۓ���T&�S�����r}�'�O�Xe{ɻY���)�rR�Ey$ľX���2:y��%%u��b"^yc�f�*��4�����+�G�?��h�ߜ�)$�w��L�*�`��J��1=��w5=�gM�#�0w�P_�Yr�
�J��3�2�>�^7iV�9���/�������먬������{;lSf�꥾��S���*Ҝ>T�,��c�l��k*��e�O���MQ�|��	��C�=YE�"��	��Z<��c�\
bxQ��� t�T�=�'s7�FG2�>��Xu����X��hB�.Ua��`H�m8�-`bM����=��L�'.a�hʼI~n@4h��*¾}�RN�닋����櫨JgϚz�5,�,�=_GUu_��77�[��$qZ&�Z���E-�"�I��Te-�|3�1�%p�R���]�?�[f�j��MҐ�Z�~}��K)�z$��=�2yI�5�/�2��u�jj��BN뤬�"�k2��X�R�O��Σ�J��4q݁f-�V"*Q�9�ؼ��4�e-�$�+��)�A��V�2��Z�60�UY�(�?��Ӛ����jC��`0h���ˣ�O|�'l�`2WÑ88�R�
�c14ۄ�}��Q��e<qiх�#������7�Y&�X�@;ÿ��џ��
�R�˨�-����/L)zp�6}o�/��p,���eD|,��^��b9�b�_��~�&�gߕ�j��k*|��c�I]4u��z+�,D��D�V�W �g*��A���Kɪ�Ć5�emL��qQ�����ja�G*c��A:٥`G5�m4DfKi�Zs�Į�A�CQ��wЂF������k&�Z��w��}Ha���6[a�{jŦc�,���tMeWR<S�*$��@�9�Eu´���=zg��v �FY�
s�z}�u��q^!S֗qΚ�qZF� r����ɡ��7��T4�� W�7/�ŧ�O�k�����������#"c�&�<,ʛGȇG�|�]�e��iiL�F%zye:{yQ�8�M�T�/Z���K��!i�`._���e�J�L�QJ�ф�@�0����Z��H�Pu������l�~i�׵��U���g_|��HDwE���"
X�IyA��^��B�/��%�Q.���qڐ9J�wB<�q�%k�	�2���j���U������s~��8����
,Jq�&82 ��9�$���'b�(���S����HpG#@n�l�ڠ#:QmG�չ@�=�	��*A�G��P����
��f�>�����U��x�e0�2��D���9r���5h��8���KMx���ۗ�ū���pE�f�'��T�
�:���	sq�Hg �� �Q�P_�U@%�,�N2Q@˒���L�P���$��w�:�+��-�G0҂�b��U���(34>�u��[������pZr��Q���q0��kx�����2��{�֋`�.?8�,��Y��;��,|:=~X������@�dy��1@�)��H���ުsl��eN�9�ҿ��@�G�����'�,Z%�"��$}���P��S�%Q,4�s�r�+�Eބ��ᇌ�*� �/�?<�������8&"��Gݩ����A�
K˴V�����G; ��L$����φ���?����!����=
O��������N�Qrmdz��Pc��޶��&e:_���Cl�P0�8�	E��'~�^�`΋�mR�7I
z�D�h��d�~ԓ�?�ĢZ]����1/2Ԩ��`�^#a�T�1�ipE�gb�AZ��&�����Gi�����
�@�y��Zwh^���&�\�p����?��(/`Z���7�&���������a~IR"II�o�r|��bz�����ճ��~xs�oOߜ<�"(�H�)�@�Lh:(�4�O�3�e�+h�Yv�����Bɏ��怞Ђ
Xy����CK���n��y�f�3��U�\E�j_���ȳ5��x�'�
r�����9�D�*� $�E9�9�
+7Ȣ4��;g��k?i�����q��� ��E�D�:X��
���5z�lf��ŏ�l�Q\W=�WۥB�@��_�[��v���J�ER�C����A�m�@m؆F���2Z���$F�Q�32����?(��0�k��Ї
,!`OY��A@+7��<��
�$�z���i�x0�����9@طZ����3$�$��}K��ed����������@k��ɲ����E]���ј2�^����TO�����G�M�n���p:��4
�U�d�n��r��^�|a���c2T���T&w̖�,�A�U�bz��>}�Ɣ�`צ��;�[D�������.�֞�t�P�!,'��4+8E��m�!��
�`cEDU�����haan��W~D(?�<#`/�Й_(~D��V��V�U��Q�N�]Z9ى�5f30� *H�2�"gO�
��D��'�h�io��c2��y�1"�d�B��u�L(�̌���q��2��G�#���DjQ�I��Ԋ�//�+�j��?L�Ѹ@F������GSz�s���7$"I�.��
Z�H��m����8&�_�b�-� �ɰTIad>iP�j,�����Y�G@�2B��2�1sd:[w�{�X!82)fYfY'�PضL2X�w��6��� �5�B�\����骕�t�'m90Yƣ��gsB/u�]��&>.qQ����ݜ�'���� !ئ��^�vx�:� %!�d5�P�hk�0h��i����mv�.����&��g��4B��R��G��;�y���u��mk�Iu�-��!B�\�}� xS��x@��`�!�=:V���5��m(�i�|W��%0t�c�H���D��,ơ��d���Ik��<�`E�
�A2pA�2���!1Bcj�!�F;��J����H.�Nt@ͺ܄�BQIH e�i-���qD�R[r>���4���]YO����^|B�㴀�I�\� ��Wb]4@2t)�vW"Ko-iH�M;i��f	���<}'s��Y�9o wU��04!�P�
[r�:���ц�I��n�j���k)�Y�ÉV����ZM?qu�.��x]��aǁlٵ5��H�����-rOȱ��ce-w���Z�I
��Q�����ſ���u%��P��m�n8�$��3CH)���פ�-]�|�U��Q�
�-�R��"���.�w���SLʖ��p��*���]�N����=#bh
�F�=�=֪���c;��������C����b@,@�x>lfY�U�V=,W�r�c
����HSc@�|ʙd����t�
,Ph`t��!�m�
7���C�-7Ԯ��o6�S{��C6�q~^ �ܽa�"é-�5c�XF�o��ׯ�CR�m�W���ٲ���O�]4����i�emH��/�h��R
���U��c�`Ϯjko�\���\ڳ�菊U��P�F�6+��7� ���UO3U��)cz}����u;�Pq'�-�M>������<���9ٞ��m�/�8B'���ruJ@A�����h,�!K��%{K�	5��`��x�c$xω~�2�2N�hH����a�b0\p}x(^P�
�Z��!�K�J�iܽ��w8�v��d��/�ĕ�Xc���(����
	�J�t��l�E�
*�������͈H(���5��!�Ωd-�4�H[@�����e������U����(��
Qu�j�j��v3��ja���2�D0@�T�]����^C �_ߪ����B�u��!��g�*�vr�3�X����(�b��X�H�؃j �~��x�$��r�ӑIH^�B�I�1w`I(�JH'�]�&y�7�u�I
CN�b�������Wg�L�^���sP͊����e�O�dZ&�&��1�<�\�P=.~��>
Y��b�b�e4��(���vN�)u �����Μ��3ڦ��0�.��w���'m��¸hS$
�G�O�tЭJS�Z�du����2~1�=?�^^���\�0�`@
��M������E�M=$�	�_�9�8����]{�ֲՑ�L_��n�^Ƅ��e�7��X5���d���f�E���B�)�]�W���XM9K89/�)���MZ���q�.$�0�m-o�Uą���w%��2m�DuQ��S�ߣO��:��]�l����Og�]0v'�q&\U���,�j.�Y�����1#Rwd,��#�a6vL��s�|.d�t#��'خ�-�u{
�u�,���*�du�ɧO��s�OYn�P�J5^�R�qZ�96��8_�S��+>���)Feܚ������#8A)W[U	��Զ`���O$\�=u�F�-��T�
ǩ=:�Θ�i�J
�P�Y.w}����i��a�V�6	�OR�,s`B0�NC�Tz��>`V��1%J���r���.��CMpb�r�	a:-�iU���C��\-j�N.gv�Nk\���πq=ځ�<��)�O��^|��s�m*V���T�_&�4Y[��v�"F�{h`_~�E��P V
��g�ǧ��{c�,Ǡ�=��\X1@!�-�@,�2О�7�uN�D~��x�¿e�j��˴�jg9�;�鼕D�]���������er�[��R7������Q���	Q`@���_ٷW�C$nS�_����b�x�k�L%W.Pp�}Imz8)�P��Et��=F.�Ye%c0�ʼv�^%!LFnc��o��]5\ޱ=zޭ�
�������a���'"��"G�U��8b'��A+;�_�9�n�i�9�D\��u�,�1���_?k6@4�à]��/z��AI��	M&��ja�9��8F��ᩅ酫`���f�l��@9����޵s��T8��ځ�����g�MHPܨ���&�l�im��
�l?�mn�ov���Kl����
����)�;,q��Q���K��r�O"�g���)Zs�����M�4�]�p��H�����597�G� �U�﵋���n��nd�uVx��7��#X���.@[�5hY8���ee2k�wh�Wt�vj�Ĺ����A��Qu2��M����@�B>r�P��m�{b���yƐ��\�@oIy�&�D���-�Y�Ӳ�s�����N+����˾�4�G%�"��͘�6�g��4c:�Ѣ�u�Y�̯�
P��C����J-���EA����,q��@"[<�ҏ�q����GXHرL�aL�Q�U&^'��k5x��
�{�$U�d.���"n2��e�죭t����
�����b����s��p��P��
�r��j9�[���3��m:+�ܾV*2�����`}�g����
��<��+����%�F�n`rf} Vk���]�\X��+x�&�F�3rt�PF��
.eh�Z�����S�ͣ��P�5���,�Qfgfd]t�(`�ǂϺ�1"�z�'�8A@ۺZ�^�I`K�Q*Y�Jp|H��?�L�54�R��L�A�iΗ'Eh��˴N*E��tq�%l��ЫXabA���I��n����F2tm�)�I�(`���z�z�\I>�hY���9e1��;P��X����6SY,��9�p�c~��T��P株�r��/Wm�}e����I����)�82A��jҷ��d�.>�Q�<͹�\I�Ȓ��*�^[�/!!(�0ƕ�|�T�Ci�d�!��JO��
R�KQ��@�xp�UA--�6nU��ʁ�T�07<Ǥ���&.Vsj����|&Nk��7�U���m,�ɨ̥&��C��HN�L���]��Z��X:\��tC;n��r��B���&a��.�:P"²iIe2��l#���O�w;r ���	��c-���T�_�����t�ޑV���p�A?O`	��-��JU�,�Ӿ��
Ї��ᱲZ��r{��p�I#� 
h�����5&.�f�j���Ur�"��K�H��;�����x�h^qt���,�hJ ���		#��[�E0�(��5yL����5�-�L:�G.���>�>�)�o�!���US-���&�1}b�:;��/����]��$g��1'k���A���f�����2�
3���	��)��4�^N񢭺�N��/J1`�<�v.Dpz�XP�]�n�1|��~��!|���R��R���N�#���!8�*|�,���܊�H�/A���,��B}$�0�p�vn�IJ֤Bћ�ߝZ�
dU��Z�KSl��T�!�xh�Ĥ[
�		S�Ns�U�w�I<����5�֛�5�1��w2R�����lI�SMʚ`w��8�wr�'5g�l�L��TV=�Y�
�r"�����c�\��ċ-�]77Sy�0q@�(K>O՞^���}��
Ŀᴙ�vŸ����G�F0e>k	�ݘh��\:_�l�C.�4���k�c:t_��^ݱ��@!�8jϊ�#���UR=��g�~���G"(��틯��-_�;7F2�@�}�P+t�������O�Tp�Ky�^�����pcx֍N8UMZ��L�YQ�0ف�q�,ӆwD�d���m���0�t������\-����r=�
`6���z�>��M��1_�!?�b�0~܊�qGS���3f��yo3��%^T�M\@tp���/���"�\E���-�(ǽ���!3�,�U�5�b΂@+d{���[ t"�����Uzsp&T��N�J|����*��er�dQ�f&�T�^grt�Q��he�2,�di~[q.+.��
��Z�l9��l 
�i*x����N�xR!?(���+y����\X�HߊSM?�g+<ހC��e7pp�� O@=ZTa�.��1��
�.<�t���ɷc������ɿ]���S�)�xK�JJ��0&}(�yz�Gx�8"�p��|���Ca�:��S��w�B,��S�\z�2�0���U��i]"���[�
�3����N�P�I�j�_�E|,n�8�-��8�\�Eag�v(�r��&,�wy�6���VBsu�š/�<��?���v��o`\���3��3k����I^T�	E�F{Wd��|�c��?N&_�"�L�&k��x���R\�	�J�Dk�K�n�Pp��UcuH����'kֺ����L��pD��#�9��sx�V:�2��X��L�_UJR��>�<�j[���*���(����	M�u���Q�y�Dq^7�r��؎+�~}�2�9����x��E�b�?�[������RR��C*�,)��\1Wm�h�$Kpc:uO5���Ϡ�����T0�u�
B�b�d�����b�
�z�2�u�n#���A��=����%s(�Z�#'E�Y~񘥒�C[�1ߴ��	�Uw���F!jw��+�rz|x�ΰDs^%�Ym�L�/�j����>��5�i�U|I�/��t������t�<�\
�΋�Ģ�����x�!�<��mM���N�����ugW�T�A��֘T�kʺ�Zg��+�-h�ѸM{�R;�e]�13�����5�����/Δ�5g�> ����S�w{���ea^+��ql�I�8�4`�%�ݑH�o0�J�I���Mk5���hO󹿒�D�g��d!�<md�^�n�a;`SB#<q3�7���'3a!�r��#�\�A���h���HクyLV����R�"��b��{Q��N�b�g��T�E�%,�"�&�icܳr���F�5s ���;�e��*�T
�Qݤ��������n�qmG��Dq��P�<�a�x��r߶��~l[��o�~�д�=q��L&I���e���~,�h*$�����Ȇ'���������x��T�	����8���K��Y��e27���N��˿E�u���@[P�D�mV.��l��Y�y�Gϧ�+�M@�M���?���x,h�/$�b&�5zԢ(��P�؄�!َ';d;$[G�2��x�%�?�?`!Ҧv�1�3�0Ih|�N��|�����:�6;#��jd{(*W��@�q��`�/����g�	����U�\��GPU�}Ή�&"�jY1��x�z^�]��SK���/&�
�~tkX&�̳���0�1��r��}��%��{�3�\����e�]P����={�*�E�3B�U��7�dL�]� ]��L�	v��$|m�y�Wo�~}!Cp{9��HgߍU�О�E.:'��J�jU�t2�7�]�+�1��+�c�E��h^�g��#�[5��v���e���V��r`�O�jmghuX'5�EH��L���-���Z��ce����r~���qa!h�f�1!�ܪ̢�El��]�ѯj���:y�bm,�f�}��u�|Yy�LҼX��ݤ6�ט��!�}�!�y�H7�|B��)���RADjnO�l��a��#�l�&��qo�<v}Pn��D*SR�
\�=s�
I�̒����m���E�s��Z
�f��n3�ٵ9G��D\^����K;l1��G֠�n�,��;�����X
�5g�:R�[�J���O���^���o�"HL
(�Ղ/hUu�=ᜧ������.��Ϟ����ЖU%�u�;y��+��M�44�2VL~n�1��z�v�y�7a�Ų�qJ�E�k5=Ϻ�wr���܎��V�d����l��M&�|\,WQ�V�})�췞=�kP�@�����7���{�mb]����.���)�:��B뿚:��+�&�Ȥ�-C}���>���Kbޯ�֥|�l���}U�p=�N�1��C-tuNj}�Ɉ�y����U�Z�I}@��ʊ�JŶ����ͅߜT%�7u���m>f

��`�ͽ���@}��&k2FR��C��(�$��]��77X��B�۽�*ᗎ7�-"ݗƲB��>?yuq���������o�+���ӫ���/�2_hej��{	�Z��X�U2Hj�Nod���#�&�V�#�D_Ā+IJg��˟�X�X�������<�_��$�7����M����Q���t�<)N�8aa����D�$��_ݱ��ķQ�e�t:pL9[.L���xͧ��Rb�n��k�`8.L���E�m���Vo�3�T�+5�h��%[s��/Q��$��ӆ��䋎Y��bQd���f5��v�m{�D��3�-��u�R��W�7��G�M[.���K�R�~�����wp����C����""���J3���3N�t�'^P�t�
T���;��^\T��lNhx�]	�n1��#��Φ����K��ٚĿ��Jt�pԐ�oHRnj�q��S���;�f������w�
�3������8�wa�o����߉��t���Uވh��m���JSm�����������?{����&�[m�;x�+����`�J���]��e���n���8��΋��놋��px�:�u�)(�g�U��n�����o�7�N|���/�g���׾~vqq��s���?��#�e���cΫOFG��|V�����w�����<���V�p���7������C��s�����.�^?\9Ý��tÀ�'�|HH�ʔН�������8��U��-��������&��ɤ��Lo`g��V�W�.~��MA�Ql���v(1۞�8L�����8
K���,�昸����Rj�X��(��D"�ֶ��o����񕏴d*y���Ȅ]��b^K��0�8�����oT�N��&�x4m�w8k�.&䌦dޘw7x��� ~%EX�e�!�"�{�m��Ka�np�[��bvo��m��.��(\��e��z���n3���d�W#<9�i��f
�n�R�+`ګ�-8X��.�w�����p��e4K�M%t�ҝ�ޜ2C��e㻋d�����K��A�Ǵh]̊,t��R+�wr�Ph�
�؂JU{�R�j�&G�4�S��X�_��}�ۜ҅F�A9�z\i����\�!�`�����%_IR����|z���v�>�DM2��R̤\���	���ƿ-7�*�,þ��Q���[8nn��ه�� ��e�ǔ����L��Qy���E�E��Z���c��ޅ�Jq{$�#�?�|�Dh2�tu]�n8o��f�������rtU��JK�7|��v�ȳ�$�N���oo���>]�;�;h]�����[/��8+����A���BG�x��C����
�8���i�/�E"�Ϩ^t�6�-�=t��}�%.6;rrE�Ғ#�;�{��V=��*Tv|b��Э���J��n���>\�^?����q������z���$G�8)��'�Ł#zE���WN�,-DF��,n
TL�H�V�����_յn�D�
ciӄA�j��u�
ν�����=h��)_G����()	�M�[�yK	����b�)��r3�Q� �+n��kt��S���W��1>n�\@���3����'>�a����¡����^0��7�޷���H~���i	.��Mz�������.9�]��g����xg$΢�`*�hNׅS��p���`�c�WT|y��"�lb��i���q�zU8�v+Ȍv$ī|���O�Y��PKE��T�7xڲ0��pip/_vendor/distlib/database.py�}kw�ȱ�w�
�>> ��wr���Ul�\���ڞ�ܣ�Pٔ0Jb���o=��)�d6�]�d,������������Q6oe}u�m�������ٳf�m˫�>=g_|��G�?d�E�v�_7u��Y�wE+�o�M�(����P�����^�?���}Vԋ�ٛ�޽��޼{�/���G�ޞ�;��7Y�ZWb%ꞁ����e۬��l��7��ͰL�٦.��bV��h��;8�.�N|�e�U�⾯�K��训�UsuHP?]s�t��Ջn����\�_��S���e�m����4�Z�5�v.:Yrެ�*��o��o��[�vPK}����_~&�u�Y�[���:kۦ�W�/`
Us�J��d��>�>?�p:���˳ק��&��~v�r~8���˳�N��gXa,[��e�[^m'f��yS�4��l^� �u۬E�o'�������䰣�X��=��&�]�o~>{��w�]������fEU�d�9NI[^np:�I����E�PB,܏v�y�L��]]����@U��[���#�		M��%IqS�ݗ�n4cT̠�g?�}���{�b(���x$G=�����y����hI���U=x��*�
����8}���]����ٳ7���������?7����=;{�NC��~�������}3;���qJ],�г�yUt]6{�2j.�~|Lm!+�O���SQ�*�k�^����.�.�la�@�[�%�.��lԉj)�����J�EUv�J$�z.����]V7�
�c�5�ȖM�	�_�O�4
۝�!�/�5�!�J��`�÷o���=�y%�vh,ϰ@�_KNb�#��U�]V�p3f/vtz�
��~ǿt�X,����D�O��p�{��cz{|�XQ�cW~h.>�rIe�u��6�:vh_�>�5>��GX��؆���Q�,��x
�,����SP|U�k�,�]a
�tf��%z&Y�_@�P�F6��rNTҌ�>�/�	�<y
T>��j"X\]��L��v�,��$wc�5$���W�|�:P�tO-2�7�i���Ȁ��Ȁ�ӿ�`bֵDY�m�Rt��Œ��[�y�,�"!�	�Eа��c���@��u�tܕU���!ցl��1���BJ���3��N0�t3`W�ѤK+I�j8�.�K�FePᇙ8vJ�%5P��u�df�$�8�YB.R�q�HoX��oF��r���"d��<���ɋ�lA�P&�mQm��?�bh�'�X�ŽN"͎=�_w
��Xn	�tK�罁�`�q�`�O��-E��9T>Թ�����),�)�ћ$���<�~Y-��)�w�\#w"��i���hu>+*TM��_�y|V��
�,��=��^��l$�WS��\\�E���M�o`f[��wcD0(`Xِ����o`�_��`�J+���ٲ���QߖmS��=��
?A�iMr^�I!�,�)�z�S~5��3,?"��Tt�zQ�B�� E8��H���<��|�͠��Ǵ�f�(A�ط��	��F�T�m���oQ0Q���]*>�ٽn�ߢA&{�@�׀"|e	ui
�EwW�T�*�8�x���k0��7�C��ē2B?&��\*�X�	'!h)�h J�)���&aS!M��j-9-
�GN ����%p��d)z�0M��RHf���:���q�E7�+��h<FE��t��rf����p}�cHf��4�i���=]����('�U��ӕWf�"��)Z)�
���qG�pF���dH�D��@��~B0ZMT'@�(�F9
E6�����@��~�[!��ڂ��8���2�CrL���C�2���&�
P�6e�È�D�u��ņ�]B15��8�(x�����q�@k
3�,�;��MV�e�G�P�'�����?��ĭ�N�p�\6�w��������z&	L�Yo*4��NLB�`[���#y��W̠_ʢ ��R.�g�)�fA|AxH
��zҭ��$POE���ZTTo�,^v�$kw�E����e#	��Ri����.��Nt|#˂`/֑�7Zհ����&V�r1�^��v4�`�_`N�79A��8Ă�D���aF���#�a��3`񐷩l�-%������1�8*�b
P���E~�_\�@�f+�U1���&�aa��aE��B�"�|5S(����--;O=�Dj�[��S�7�K`7f������1j�f��-CVQ/��cz�r+���'12���n�%4�
�G`��a���h˹��4ЪP֏D��r�k!���fJl|�CTxb(���]�dW����E�{81���4�`c9��	a�uEw-p���й�T}�B<\Ǽu��LX��>&5�|d���;�.�-a�*��U={�I?7�B�
�,N2 {÷�>�R}�,���m���.��}o��\��AFۈ0B���L�݌�X��E�k�Bn���=����.z�[ ���R%nu��Ȏ>@��د3)oa 9ٙ�+	E��'z(����xb+�K)2�ȇ��}_~�DX;�(I�
������]�헚�*�q�ƨli}@��rS�e�j���J/�FՊ�
�h�@��lմ���-�h��e���X(��5m7u
����@��+n����d��LbT�Q��Q���*ʽ��Nؾ���P�R7b��p'���lC��|����J������]�g�x���0b#m��ڿ]]<l[��e��Z
��Ԓ�v�R{�į��7P��W��0F�����d��j�4,���ZK]VU��ҥ��)�_���~y��/[��:̅��54�]��H�u8@O��Jq��s
R5�g\EՊIa45�Q'%8`���-�wP;�A*�P�P�'
����'�~�={{��W_��K�T�l�����fwX,Ę
��Q���g�oM��Q���FO�q��Vr�G���'���"����?�i��5�@)�lcMۓv����t;4Ɨ�MC
�c���s
�����y���C[ܖ���{.��/���
{��Ϣ]�����V04�N�rS:�N��l(��Hs?W��w�f���*��g����g�ra��~\�"׸�3���C�h8�5Z'�WKM��
"�,76,��QcO�>�zC�!��kD8�>���*��w�eP+*0�o�KB�c�[q���#OF��&]n�6r�7���U���n��LFy݄�p�Ȟ\�RF
cWT�!.\�q̜X��^�Nb��U��6�А��#ÞŘ�I��j0�����*Z
<�c�G��_8#�(���}�p�2���&>�E��yH2���I�ֱ�=������XD���!��i����P�q��˔�
Q�W�\m��=�A�x�%�;�6��m4|+Ј:H�B��Zv��F�"���J�[R�V��g�Dz�	~Q�����{�ta3�@n�Y��rS��җ����D=��@>{\�E��|���M��Q�ݥ`b-��,�#��y�^V,{�
{�C
Ntvh��Hn�J�/��
vq)_\�W0E��#�D�A%������5�š%���Jx�������'�$*鮖�i�]$Ou�aQ�>/1�S(�G�Yn%��z���@��\.͒��v ���U����>N�"� �׊��f8~����F!�DI�Q�}[v�崣�J����
*W5sr�y�9}[�W���I�m��O��1���-E�g:C�n}��nxl�����ѡ=ْ&�[��٦�� ���|�����T�&9)\Ȑ+)G*(���w/ib(�q7���sz^L/�b�G�<�3!�ϰ�Ѝ��+�^���a����4�`T��쌽���mg�\P)Ԗ[�:��50�Dș�y�v�&�C���P�N?<�H��A/�0��]s'7�
�G4����#i�&ƽ�,�RO��N4���^�Q5Ѕ�·�/���`�����>{Q��9�<«�r�W4�i�02W�.��|O���
cǬ�I=F%�
,h�If�D�MDvPO�A#�X-��X��$c�vbq���FTЊ�j�$
��Z5бY�2����g�ڂS7��I�؆[9�(0�����M7���ڂ]��f;��K���
1)���ݠy	(-7(iU7&SVC
���*�U�Qd�3r�Qi`\!�3:��Ä��9S���FW0�*�Tv���Oű0Mg��j�c}}
J;t�k��O㊱Q��5�4���[zijF˻�1�V7kH/b�������>Z5��dM�u�r�zAT���T�CՔ4�yڸ:8F��p��=|��
� �KЬ�-�$�؛q�AR�#To�{`�;��aL|�ӎ�����D�'y쌿�w)�[4\9�ֽ��˂ҡ��!tDC���,{g+e��T������V��*x��cO�(��e�Uo�m�\����d�O����x�͂
7�t��q��mOD&ը'ݟ�4���h��@�P�'Y�)�-��؎�Y��ܑ��
'A	x5���cs����&ǁ)����>�%og�xJt���K�j�b$�.����Ė���[\ �#F�r��+�Fy��!�]�L9��1�hI�ٵ�U%C�,�LW5�54\�xNx�>��-,�^ػBgJU �-�
p�
Zb� 
c��el8/�)`�(ܩ:A[��`<����t<R.(�KA�q0��)�>���]<��:���C�M��o�4�����Ҏu�(��o}4�V�%��*uOST�<��9k�+D�8���1S�C��"w
����N�?��a��5.�S�N��ù0I�MEXW!�?X<�sL�6GC��́�m�Ԡ�$��͟j��^M�Y�<iJ��+����ѫs�1)3���w躾���Y��+���l�P���jZ�G��4�S{3���m�O����0��嶷�!
���&�� ��T*(ʥ�����$��Z�Q���@Xf��V\��E�]��I`\�/��B�ח�_����7��j�k���_`�/Ǔ)vtim���O�e���:�J�C
�:��\L���*k��.�F�${����@7�#T(��"�^�ؔc�dwpŊ{0\�e����s�o2XV
0���Vn6
H6�l*t��'�ow�6��d���Z�O�߷�\S C�p����u�^i0ʽ�֙�2N�|ҝhM���^�#��ooy�u1�~4E����o�5�@q��Eb^�.�Gз���e	�~�=��B�Nd;F��k6IV�9��"�C��	�i�vL��`�M�T�l���\^p�<��Yq.P�@��W;}��AI���	2DX�q~����8�2�MEr� j�G��؏�����k:���'&3�!��hg��i��O�~t��s�>��p7Gy���Q.Ko��(+:B�Xb�
`�P��[?��&�ǧ��ȡuk��+wNYZB�<���Yсy't#I��⏳�@�G4�����Ϧ_|�$��j��[O�����Z嗷������<"�I�dɁ~�q���}L�Xn�>��I�=�a�e�Y�W��mkY��K� �I��)�v�Ek���b�>5�>��p��Y���)&����{@F7Z{>��f-�i/s��e$̈'�Y,FF�Q�C�/����
�F7�vj[t.��s�-����~8e�8=��<�f�t�v�![{�s�er�(�H�K2��=�OC�ة��o�]����ʿ�)�P/���ǒي�SZ5���6?g�q:�R�A�
��nZ����j�n���+�:��8�<��zW�j�T��qU%mG*ɞ��_Ɛ��N�8�"�
Q%��YK��5��VŽH�-�/���e��Y�����Й�n־:�k��u�ˎ4�{X��m�(�px���ʎLz���*u_Iu��J�*�/l<ɾ�S�0�R��n�<	�z�{=Z�W�+;���u'%ӹ���>>�4� �N$B��vP9����:-"�%F�Q�n�N��v�~j�#�G��|�S|iC����()�u�F�<�i$�	�-�Z��eyF��0��}�Ӊ�w�˦�B`�]ɯ�����(�m�۸"w0??�#u�Ć��&��h���)=8��BMKk�yU�)(>��s*��j�����)�媭�;�,MvQ���W���W�(q�\t����E)C��s�O���ua�E>�L����G-�(i F��h�-�?��j��Ti4-�S�y������7ΎyS������F)��-J�m-q��ll*��&N��t��2&�{�Y�Y�6�À�)��L�kJ���%����h6��q�
����x`�e�v��3��
�t$%�/��$�'�X��R۬���2;5O''�d&�F�2-D�3�?�ָ""T�ۤ9�.��	���B���K�NB�2�%i5�L�,�:��6?�����V6vz��������&�&J=�o(l;7�D"�Y�i�!�/�����������V̻����v�n��$d:sTm�m�3��k�����6&$y)�����0?n��d�8zQ[���j�󕫝"�JÛ;��6�HES�]��"Qc'Ӥ���L326�����&D%��I���p� -4�a8.�B�X�a�Q>�]D=g�3�#�L�zK���U)���lx�]�^��O��&���z�j6�2Y��ɷ��1��$�=�
Y��M�&'.v^��Iq����֦`N�q��<dbI�d�'���`��C$��[vڱ�O���i~�V���/�ҫM�J��HɏP>
	z`�9���%�'��3�A�M�	-�pLhS���Y̖���n�*�0"�ūFr��$�i;�S��ת?�klD�h��yNl!bL�BV�j�:<DX>#7{��|���R�te���ٗ9�LzTqL�mߢ���#�Tv��պߎ��``��J�fg(pu�aڲ�_���n�2��:Y�hpr��2G��r$��g�*[`49�F�:���܈ ���OB89y[LWУLB��O�<���Д�C�e���s����q�e��O��U�(Q��Y�:��N��K9�b~8����\=�=㰽N�
�x�,�t�}���֮����#\'�aZ�II��(*F��]<��X�%ݼ�Q�
�Hz��EZ���H�$�I�D��$>N�	��	�$�<8U`�2��"��?iQ�+�C�1�(��8��a��0�Oz���k�j#,��tw
`�}�;V��&��wQ�9��[����M�>X�P�Dky�\|
F��]Jk���dӟ�5�iE�t��UZ�U�_�i��Z75q��-�(),_���`x��Q�7$9�/fS���ta�
RnjXx>���DF��n��Cv��#4GgW:\6�f/j��QB�BAF��P���(IQ�s�)G��izNU�੣��`�A8�ˢ�PQ}^��s�f�D�z*q[Խ��QڧV�����wi9���nI��k�$GZ��wxY��c���n=��7%�cEޓc_@x�v�̈���
}g��.I�.%'Υ�!0�e[����1�#��YT6��Ͼ�ɿ�ozy��� ��G}��6�~�r1�7��_�s4�`�iD�<
iFC�}�|���f~��7:���Fǘ���]�����%RG��6��;�1]7�o�$' ����ٮ];����\0����ą8�
�W�'yC�j�tq\V�`zFZne�P�T�d	(�'X[�Ѵ���.˒��T�
�ie�-9?�@W�I?�0#k9O��oƻ�uQ�J�Y6�Nw�'�[��<�Z��ԇP�����b�}���)�B�I0�C�":��g�5���8����I�aQn\�+����T��{����3w=Biۑ`��ը�I�bG�y����NL�Щ�����"�`���0l��q�����!�l��9V�ы���ő�0/��{e�'���t靫���4`�2P��zv�ƌ�Zi@z�0i���P8ǩl��\ƅsŒ��02����˜#
�,O��c�7a7 f��:���t�}柾�d]~#��)�_�0q"�X��M�}q�v�>��j5��?��w���\�.K�-;��y��jL�W�όs��V�}6�����ci@�t�R��"��gt)5%���p�_w�MMg��>���]�!=�T��(��Ow�فq��*7?ޖ�m.�Cw횺֦=���]�E�����d�M+���Y)Bg�~K尿a���
bW�LL Iud]�CER7�Dw��3���E�|�u߯��>����zڴWOAG-zӟ����ǜr�N����}V�"��9n����9���eZ��S�-?�6�x/j���K+l��{M���{)L&.x�-�r�8j����|w����p��D�J/�挤l
4�t�.�	�0}%�
�a�'d�F�⛠VF����y-�8��
3�M�z��z��S�k�5�H��܈H�� Ln�[�6^Kл�s���~�.}Y���t��.�a�N�)�\�V��3c�ǰ]��V���8{-�`�^�%��ǁ��⿤�>�L
�Ŭ9�;F��"��g������2�{����r�����쫾U�UT$d���g�d*l�!�><Vܯ�D|t���H~�r���E��)���g�G�_“Hv�=��Y�8�pԹ)�k1���r�@/����% ������4�ϺyQs��}tQ�G��n�g>�CQ��7�הBl�\�e���Zm���&���(�Jq��PY7$�KZĆ{K��t_�J�0U!i��dy��&��r�q*��8��,2)�4E}�|�r��h�"uL�g�hr���Q"ogW;�����r�9���q_r��|Iۧq�=XL4K[��T��5��2�%��1�Dܖ����>�ܒs�WJ	���p�oT�@t'/�
B9"{�N%���}�hdYQј��GY�暨�1��'�� ����mST���lP3u��jU��u��C�a<ξ}��3���E�n��Tv���k���K��`A�
���N�_�M�0���P�=�P_����4G�iJxj��>���<k2t�\���\'/���S�AZ���$^�'M&Z���$/uN��!�7P�O�;��"�KN2�al��g��&�Z���}|��ig��)L89�c�A�tf��Ag���`Jm�rzf�2���ZDAzl*o���X�f}D(�Tf��x��H���j�E7���rj��d�y�~�X�0M�,�;̬����(k��K		��ō /o�,��_�������q�Is8��������A��&�#����V�#/�.�l�{Pd�lJ9��������f���a͉X�_�^dZ�ч��u���c�V��cF�ُ �mZJϙ%@\�e�1W��tDU��ֻ��o$O�ŽN���ėG#�p�/z.R��_w��HLk=?d)F,t�@�C"*m�aB���>��6�1�,i�)��,������#�ϖ��"�����R�w����?��TP1+������`27���Hʋ^�SD^"E�lt���I�K�ڳ�C�z�w�����e�`$�i�tEF�jF;��D�\u���pȘ�&��D���cp�eZ�]�
CxX���擻�{E�.�
�=T�(~���&���D���4׷E�a�/��3��@*7lh���t7FߝԌ�[�B�sG�+�V�a��""p�H��\��nʵ܁�`�r����O�ְ�{	�g�uI����ZbG6��7ū��o�B���>��B�1��`����O
S�;b�3�9�G�4��-���U߸�][���w��S!����V�Z�s/��ǔ��T��?�|]��,�I;X��],~*�Xt�b
���b��ʽ�A'�B����Ϊ��2�"�ǡ}���N
j��2K���\�B�..�'�+Z���T��\Z�$
�W�C�ivZǘx�
��rY�K���-RQM��b����e�/�0G�uMK�ܠ���\\�s�A��1��桑��`��&@1|��+a�Z:L�(�h���c��:y��}@�jJ�C���7��"�$���чd4-с�CL5�p���8�nG�1�f둮�}��XqL~�i�f�3f�>�LF�I�h�N��չl\�����ޞ���v�C�FK�V����豎�Ʒx�g���e<��
0ȥ�ԇ F�҅=�!$�������@���
:��G��$�JV�R�H���{����K��R+����ʌeM�n�O�&����#��c`'PD]5Éq�&����"S�;�w7V`{��vŹe�V�t�%�ɶ��ֆ�Up{H�[/�?VB�Ⱦ��Q�m�3Ll6�:��4��Z�Q`Nu9ʿ9V�Y�p%IQ����j�P�S�Qnn�u�Za(F���V�f6�IC�$�C�9�.	���w�H o܈;��%��mI�}|O=X�$:lD5��/��O�_�{b�V���pso,Js7��+�NI����
�	��.I$�w*�u@�ʳCFW�{J�A#���o.5f�2VHWH�>*�=媾:���:��K�tu3T;���cx}�>;�,:�٢Qt�C�1�hM{5'h��!S���7��kA��1�nEΝå�*�4F��C�H�s�2
�t��U:�d�i�1}�uMhz��GE�ay�.tl_�B?��GUy#���n�\1��$��]��,�QG^-JF��9����#���-,�.���mKуY��������Q>w,�壿�uAK��È�wl/�#�-�_�6v�G�%|�=g����W<�6(Dli�|Żz��ho�Z�\�42�l�<���/�ٟ��mœ]��{�.tF�I��U�Q���ռ�>m��b�4?-�l�lt!�4�"Af���D���佶x�zU�1�,�ɷ�EO.�4�Z�R���pR����^����y"��9�i�X0�8F!�!m��Y��M�S���E��=���65���=���ņ}�|Sdn^�|�k����D�|;�v�j���Uq�1�5��ټYo�57s3���L)&��!�9��T"��	]�(�-�B��A��ݱ+#Z5�B'�i7�9�sP� ���0vcT�Cw���6��Sl�&��]P#��E+)8������J,i��L�Jr��x~g̴�Q�z�Sx-<aH��q'I��h�D_��a|�Y>�q֎�oM�A��Pv��w
ű^�v��WLѼ��<�N$�B)��
]��|t�P�{�TbKpbS&�����V�ȍޒ���~W�D}�U�=��S�ӊ��m�dF�������&Xnگ(eWč�)��ޘ7��Y�v�PY5�1�s�?�QM�P�������V"w#���S��5��g�c��d1*O�m���|E&N�t�RZ\V�#
���A���W�,2��rSV�����@�H�a9�w=��>��B>p�����Z՞J؞rˋ�"����4�
�2��6���g&��mAb����.�d�<�-�d1.'�����*0�C���/F�0/�
Ҭ��v�s~���s`^m,�c���"ܩ|�ޘ豜�k}T�/��D|=����_{�T
�w�"$��h攷OWU��͎d�v������C�G���o��M��Dk��CAY�Nc#V���n%G�-/9	!��R�!4�45�b�]�aD+|�'Et׬ѿ��x��<�f���bxI'�J1l�v*X0+�L�T�t@gHU9�?�a�L������{#�;���N�(���NIv�J��|�`Z]��B�RB�%<9��C�F�
��F�����Kܛ����2T_]
��Q��]�h��	��/L��JI\�3Hi�>�M	u��l����#��q��]I{_��j'Ƨ�w�R�k,���E�jK�{G��QA�4�5�H�,g�m��Ь�x4�L׍��Ѯ,W�t�9�����c�U��jzD$Z��Vz.6�}6��I��暷�zBA=_��
�ӥ�v4��520B��V����`��p[��c�8Oɉ�T�7ۏ1��e��&��Hғ��k-���jC@��p�=��+��cr���w+���a߅jk#��`>k��)����Cq�Ե6��
'T�ᓯ�nD1��3����;��{��`s���EK;^��xx*�U�Eh�b0!aI�t0=l��`�↮zc�fB�	�Y�p$pw%t��
�nN2n��$�o1:�-�y�T*3���#Z-�Ӑ�������WV�KE��'�/<��j�Ƨm�V��
PKE��T*���bQpip/_vendor/distlib/index.py�\{�۸��>o�@�Gyl��u;H�����`2io��,ѶvdI��q܋��;��D=�q6���
AF�����y��Cq�Ź��8��3QW���ӓ��gŋ�ثd����b"�=y���K��{�&�1)�x�D2+e,�\T)^�M��7��څJ�o�:��*�3�H%B�U*Y�U�_k%�Vf�z#�xy���՛ˠ�P�0�ŋ^�\_�����o�!ڝ%�"W�؄�&M��g��� ���K{Wn�*I�_��Py$��}%��*I�Y���3�k��-�Q2$������,*q�/���L���P�z�D���;�Z@q�����q��>�&)+uɃ�k�u�o������nn^�),��y]m��R���Z���e5�uX��\�߯Քq\�J�P�r*�u����)!�l=���,'f|���I1�4|#}����3b?�{a��e�����yn�|>9;�����o_�̯^}s��h�m��(g��"	r���iw}����N?>�R�%^��m��WP�~��QF�DK���f��B7V�P����нB�	u���2�b�T(�뫩���&x���o���j��ys�l��9�U�Ip�:����*��6���!�r%�x�T�_�t5%�\��3iHrɢ�
m�0MJ�	B�*�"�5
f�j�%03�A���/E�b��@\����
���U"cM3�[aNDR�*M����E�����#�n;�9�*Y׊��?i[D����d���2�6�?�*�*��S̬p��b���-�de�.܋n���A�
I&|�Coj��sXO�
����{IvAĤby����g�Q�Gb�?)̤�o�$�n��L�W$���b}�|����K�m��~^����4�;o"�R�Iv�%��xri��4��
<��((
���M�/ݐ
�3`sփ;��`�H�,�]Ţ7���f_t5ֹ��f=�d��y���
�y	n�����[���}�,��W*�}'�}�r�̅x2�)i%8>��Zb�������uF{��#<'ө"L��Z�3�i������"�_
ӉŔd�Ta�m̥��ⲵ
3%�Ze3h��[���A��-��M'
��r4�ؕ#�^���� $�H{���B
!�˙@��"/�4�d+��6R��[,��e�^���v���-UJ���di�v�v�9�}i6h���V�r�+͚�7��):��=��;`�ܶ�Y�-��6�4�ٱ��`7ⴵ�Z��H����R��ǥ�����%Řh\bZ�b%�9�n%�r)1g��0C4a*Җ�DTq�ӥd�xN�t�∜K�D��yjdܰj8�N���d��w�f.-�̈US~�]fغi�&YI��q.�]W�5�e�;Jg^��p�Z�%�d�:X���"hG�60�7��G"�6c�:�ogD�C��K�A�X>�ێe\�+x�cLhb��,��]���6E�d='q⟎��R+�$��İ�v�atj���s1�@}���<[4Q-���`���!�P��n���"��K L�˺�m��#`,��p�qiU�Ѫ,�$n"�܁b��lYj���d�����#*���D��0�Q8"���}��>�ܷ�9s
�(��s�9��0���Y��rn��q� m&S����d�az!튛>��a�Y�'��������…fJ��W�!�%��e}�0��]�:ˌz�����f=���§Ou%�pB��Z��@'p��&n-�S���,�/�O�>0�\�3]18#M���e���@�O��{ʎ����̐g��p��+x��0�4bf��@N�#0FM3�����n� O�Qu�旤������Iw��0�fhH�H��7��ME����$�
����Z�k�{T���7j6q��F>J�R��,�e��:�;2_���K.�P#���V�90E��0�<sH�IRQč�i6Č�P-ZZĔ���e����j���21�w–��_������h�`�(�b�B$�4 �pꥯB%w���K��9Â�Ȗ�-���7p���F.|�pm�u:����X�"���m�^�+����ReF���:+z'�$n4�7%h�a}�c"^SIb1>ّ�a"���2g� ����ULi�3��e�yU�ni�1"6o/�E�1ݞ�)�*���04u���v½��:�H����.�*�h�Z�54?�*b�-]�ۘ��*�
��2 u~̯̓�/��Pi~�v�Nė��2r"�j1b�hsNtiC�͕�E���z�ek��V;J�k�P�5�Iv����(�K��M^	���}��M��)0:Vi��3^��Z��8�XX�>e�>�V�5\Ap�I:4�@AO,�|s�
�J�匦~g�S6i���J���52�2&s1����Z3�!o�<U]�c� �@7��C�v��Z;����ho��$(����Qᄭ�'��J-X��]������x37�y}��r:h�ǚ��kZ��
�w:��q�=�d,߻πP�Yу��`�_|�Gkg�C�WdK�+r��uF^�� )��D!��I�
��b��;��(��_�V8(:e�֦=�:��+�$���&P�����/з���X��)ޅ�My�g'�'y����
��(Z�d�N!����V��P�؅I���� vp�=1�􍞛�@�SN#�Ev��:�|0�Ɠ����`1�I�d�,�7uD�ȶX�"�� n�
s�@U�ɚ5�	��}:}�8����3����!	!��Cu�45�&Q�#��,E���6���X�iIkM�;K�p1y���%#��� ������z���q�I?E��������)�Q^+(��r�*�[F�OI�@���]P�YT7���:bUw���جZ�Ѓ�]��$I4��YRM����2#ʊ�b"Z<!�S!����`�����bI?�0�2ucVCH�ɚ� ���H躚�Y��R�*ķ��pc�6��=vy��G�A�@O3��s�;�#˃̀�R��}<!��K�*j+H�ʪl���
���MP����K���g1���a˼��3�����?!ߔ�0aפu�\W��50.�nl.�R��c�6�����0�h7���xj�����hR��\�	�]J�7���^p1{+<�^�`#?�&��6��}=쪟��;ꂕ��zۅ�����˽��Uy��~��4�od�>^��>�}ۿ��iكF�~)�eU��N=�Y�JTzx�{d�0O�ce�i+��ތ`m�J�����v�0�ꐂ4��%޲5oB�1��#Jnǜt���v��������솙'.2?i���qմi��k�F�xK�c?"6!f��0��wl�`i�3��0/��et�R@vP'�X,4�7Ֆvi�2���'�0��(����	���9y�5bY��4��i���|d?!�`���C�G��N�_�]u���y�v�lo8I��T�� �Lccխ'+��qd���>;����_jpv�����tXt��ǭ�F�SL#�X��ނK��m�B��?��?�d���5Rǖ��):��+�_۫?4�.>ט:dz�Uo�_�Ju+�_תO^��5�N���mͶ�"Ƃ4Cr��K��;���`��
��%͠�z�Ü���oW����p(zq)u���*9�����n�pW>�n���s}ªG�ž�z2OO�5U?}���
s��5Mq����J�;B:��i�Y��S����1�c��|,�Nf���M`d�m��4�{�V��Ֆ�q�-����!m�&��6y�ƴ��Bܘ��9�g�-�7���2��"��
r&�i��ٞ��&��$b��i�J���l���hF�a�}��;����y��ch�ǡ��K�Y@s.�k�'M�]i����z4e��\A\�K���m;Cs ���fJ�j�n-s}\~(�XNN;�鬸8C��>�c�GR��f�%!������q�pO�UӞ�h�\]a^��q<ǧ�7#	>3��-K>�	���?N���M
���Y���׹�l�j;�[_Y,�~�-sx�G��0����Q�Ne�!����<7�T���c��)�A�b�x4<�D��d�r����.��l��RZ���)��j�LFNhZ�6�`}sB��H��ˬ�!"��ȿ���<5�&�e��oztۅ

���D�]�d<t��tJ�f��#��Wi�@a�
�68܋2�Vd�m��F��-�\��B����-��ۙRn�*�gx�>c��Y:�Iz�>�V�i}��g��^G����LQ�[���U��{�hW��I�!�NAue3z�w�ۯx�ih�iݖ�?)���|6R��w�OG�h!�CO�af�v�%�SW9�����Ml���[�C�U�i��㥆�~H�@��ܾ�-�Ӗ%Sx�Б����\�o <�Lzĭ�p?���� ��`�j|(��w�Qc�ˀH��]d:���7T!3�}b�D~����Y�#�͚�u�c��&O��kT��q]	+�A�M����I�9���%#���
��C��ģ�NȐQ{��r�?>�a��cM�PX���]�K۸*�QU�i㈠cK��eJw��P&�	6�Iɸqd@�~���t����2�y�ƩZ�*��e������3ml�8�c6Q����������4�6�3�s��lVR�Œ��'�e�a���uxfK݀D(��HӮ�#HR�k�t2��øew׵=��?��U.۷9K6�e2�~(��n����}������0ȋu���v��%�y�]XW�K�hM8��
�jH��P��d9%vhl�0���5��8U`�#��aV���>�g;;N*O��
�鳍��A�u�x�Ee��nj�����Q�A2�V�t�mf��Z���T����
!r!��O��WO�v��������#�-��i@��5�����.~�TC��?�0p���{�i��>\d��L��z}�蝟{�ˆ�q������3�/lϩT�^��x�|s>.��I�XK�᪻�>�IWr�n�e�h��}��Ø����C��a���''pj�Kz�Oz:���'�n�є��ݖy�?��w��̬j0(��Zq�m�V	�z�n�_���.�Ƀz��,G�.�����E'M�mGȒ9���.�ǐ�1�vlu��L�1��t|}���1ꈤ�S\�*�ruʹ�nE��|i���܂8���g��C@����8ߡs(����O=}<q����O[��Ch�Dږ�39U�Ѩ���{�{T��PKE��T��M-3�pip/_vendor/distlib/locators.py�}kw�F��w�
D/���-�1��(��t<'�xl�'{7 �	0(�i��}U��P);��=gq��n�n�w�:	N?<
�e��I�m��7G'G'��r����uDOF�����S����oy�삗�?�Mž��YQgiДAs��w�uY/�Es�TY�u�-Ҥ��|Ȫ �����gۦ�o�*��Y� ��Y|�����^>��7M�i���^�x��^}��%��rGG�zSVM��%�-�r�e �k�����?�P�W�r	U_�Z}ڔu�f�4��E�5�nr�#���*Kp���7�l���Ӫ*�I��*Y��IP�0�۬2+��z7� ��6�I�_V��G�z_�u��R�0���\CoU�h[��Q��8����3��-���8�"Y�7��^������m���?o��Y=O6�i��W��dEV�T��ի�/�4��y�
,�
���ԙ�z4ٛf���֋:R7cJ�<~x�-}�Lf%3nN�L����=��M6M��_gM�0T������MVyJ�J%��ғ?O��Y:�T0/U���U6�WI

֛U�L�*��_f
��LĔ�nZ��a�ps��˜�M�j�ˬ��ϫ����(�5����M��A`�jv���f�߸�9��,�c�o�2�z���V���2X���b��-���<������/�y�b��h�N�,EU��觻�F�er�xt������ѓo�x��[�O?�ίqn�t�G�#��o�K>}���N��<�����~�Ԇ">�n֫��kN����}�^A�_=���߾�>�?B��i6�����n��e����Q�-h*�ՊpL����mz�]Yd#�+���G��Ͷ*������]�v@��盘*M�5n�I�
�.신\6KU{<VK`3��Xl�+_ xX�;=�ȅ//kR�*L����1�F��Y�m.>�������p�z���n��M��)���8��Q��F�|U�Y8�bGs�nu�И�Cw��pM�^weu$�+`R���2�˵�i�����*��l��2TYX�Uq1�6�ݶ~G��T��xӛ��0��6����*�����Y�m�h\��r"3W�a2��^l��|U�l�l�.6A��j�o� �>,�\n�q�0p�lq���u�]�B���Ⱆ��n8�jL�[&*��m��}��?�i­��f�!1�~��<�������`���g]/�2�z�.8�8o5aVDy1/+\��n�h�]5�f���UP��>]Β���%l2�/��l?��y��kǺv��1��v�o��M���•��'�Vyh�@v���M:[7"%.���N��7�-��jj���#��3�4Г��v�1ȑي*"]-�1�L��"�.�@�e4.h��I�T���6�d�M��;��H��.�����Vu��&��]�%�(�p�	�������c�ſ�/����QVQ9C�C�^qI�����S��ˑ�$
��,�ú�V��ZAŸ�CQ7I/��Ag������y����~	y�f��]^�\R��MF�WR���6�̭�I�Xf��`�M��I��w��: y�v�6�K���X'�:&�T-�#�@N��pr1�-�2ɋ�!RIm��Rp�7�L_�E��b*J���pPB��ۂ-r�qJ���%j���Ɠb�!���(%���E�d��?�z$����M	d��ĪqeOx>�E�uR���a:�������\�2���W��3���p(K����"$1�I�ga��WeyCh�.k��(�������m�"c�E)ZA��4�O�b	��z���E��}��|
���)t�\�����/��
W�2��«�>`9c��H�!`���]��|��Y�`\�xJ��?�P\@�h�Y5Ӏh �Z�	���'5n��r���.��(���T	m�FE�-�޶Ʊ����Q�sa)��++�FF��������A8�9%E�) 23�8�J����(UR��(u���b8Q�X�R��9ͩ��!ƞ�J@�lU��3h�'G^�߈+�$M?�/�72�#��І��~Jq)v�d�q���z�	�S?bUY
�:p�
7PHbQ6f�l�iv�h�Hc��!�4������F��ܥt@�w�S@L>&��رn�h�ʋmf�`�k��f�’D#c:h&��2�AѨX�'X���d�k1�@�'��g9N���=�C8*P��\WL��Ar��l42�d����i���T̬7m�n=��.Ԧ�W���;�jrE?s}�N�o��i1@�U��[$ۊq�F#g��oa
�Y��%�H�A����l�0x��Q͇p{�v�V b��~��u��VDj�� 
��H����3	[�i�R��6=��W+��T
E

HPz�I���S/@,'�.g�TAC�C*,�]�<kC�(|N�x;J�t�q�I��d o�A�k�!�w^+��_>��1�!"��@i�'M,c",Ĵ���j�d;�Jv�E%N��?� ᘒ�=�^�:\ۜL6����
uj4���d���Z�
@��Ie-�>z�>j`f�dڬ�J�𼬥��UF�8�*�~,���ר�'\O�K+��3�.K��M�-2�h$j%�E�%Ϳȍi���x�Qiq.Z�M�^FM���҆�u��Μ�S6g_h�1�����%����x��r��B�!E�l���S˨��=R-��$��XG��i0�4d�FYY�C"2q�5@���	g�c���ɱ��@��ۈu�.�>��UfT�J��4�f�,�"��y
|����,��
�U��ID�����&����$H��9Ep[�/�fdѸVMӤ�M���4�:P�R zoƺ�@���������|eNd- ���|�7� Lj�/��Ж1�����q�[ߙC��Uj��rHҹ��y��ྀ�]	��ҙ[K~��;ܭ�Χ8�@�B�[��<�����M^` ���8d�����UZ'�r0��M��IV�[�ǽ�H,�S{�CL��+X޶{��?C�/��O�R��i^,ʖ4<R�qǢ�!g�@(��]�"=�a���v��v }sro�:Tϫd���"@/!(��ld��0�9�?Kd���A}Z��lW�8��qp,S{�Ҕc5uǴ�0�j�1[
��e!�A�)��x>r�ZB��F�<?����t�6�^$|�b	�5��k��*�� ���nXS�=^�whr�A����ry��ۛ�A=�
�#�����	m�>CY`!"w����`8�Y���20��=��jY�W��8�u������Ʃ�3>�罬�%�5J<�b�O�������kb���h��@EjG�{�(y��[3����pD�pŚn��@m�,<�;��I���]�w�BA^W�<�5���i
b����oHo��oxBl���py�z��
L��衮�y�p=�%P�
n�"�$��ro��C��p4�ә
q��v�E^Ͻ�_��E�Lt{y>y=�E
ƳBޙ����E��:Z#�P��-u�T臊œ���H`�X_�m+V���!���}�<
r&����<ZKQӭ������d�|���h�@��۰CS�pu��2��v��цGT�|�kC����$N�4�P6� �k�ې%��0⦟�
&�D�nL�j3}G�=�N|��OʨtK:"�T� ��M��/$��ܛx�sJ�ƀ"��Q=����n3D���zx�/]ŽV5��Љ�tA�%;�����)|a�a#�f��8eS6�
��>띘{I�����v�'�/<��QȐBY�o-zj����bhN/$4-	�O)� �L1wD�Fڍ���?x�ƕU�&��Ġ�!yy����O?���_}�Ǩa	��b(�#�Κ�8�+Z��K]ڦ��k�X8䫾N�G��駾%�b����S�ik��KB?�솁���Lާ��JDG}c����d�����S��n����)�Z_a�=�UԔ���,n�~�=c��G��7�:�!$�c�2.�����r���EP�-�r�%E���	(����v=e�4͚�-!B6o�MČ�]�A�E���]9^x1
{���R��?�H]����X���	$RȈG���Z���]��&�Z�����k��T�~��u4��F!�,x��fI�ad�~g7���У������)̚h4��4�M54?�Ԕ�ݱ���9n7���u<�q���T�Gb�8/s6d[�Y��^9p�%��Gݬ��$&���M_���eDg�Q�[p�U�ɦ7�����E���9���~<
�n�1Ak�������1-��S)�ݲ��7%��x��8��51��]���6I�X��\ԓ+�O|��(U˜�
_]1�
��ۮ��s���q._�������5���<&�{ �U�$`m�ª�Mo�:��	y�0'���$A��"�bo;��&�Q'��(+�c�MY$�Fq{NGA�1m�R���V0a^QkUUF��9�/L0R!���E�$"`'(ݶbwB��xx����b��J�+f�6�����v�yjJhۑ�n�������
�PDNǭ<٣Az����O�	�s��lt�PP1���5���-(vP�վye����\��F�8��8����4��
���
>'{:�e��79����.�Sb�`d���s�m)���p��5�QP�F��p0�[?…�����IEpc�u�Wm���r�1��!:����R����b��0��Tk�Q*piz'ԣɿگ]iS+�c8U��i�ij�%�FIV>z�*m��]k{Ba��F���}w�-[ʵ��i�@Elf�v����5/%��uz8��J����wN�ݒ�xdGÓS*��uXE�:�U^Qw�T?���S��FT;GT�g�
�sYq�I�TL�1�^�)�#X�ё2A�+�ʈ�#��Ͻx3�`��7��-��!'\y�:��gh�e���$x�#�9�Y�hL�v��He#{=�O�b�T��^r4�O�q0��O��I����T�ls���U�$ܚ��TL`["~mI�+I���TqeQ�Q�h�B;����/��#�4n�b�y%2�x+���t}�W����X0��%[/^��̃�j3�����WHq���.��
0���Jk��z	��uO�z�^��Ȭ'��a�U��a�=4�X�����G]��vʴ/�f��C�$V�+�z�5A����4���,>�G������(���}�!����?_~��}�!���¬4Y�H�����)v ��s9��l���B�G1%�4�H�n`�t��y^�M��;1sl�nE�?Y
t���k�:�aɶ&s�v���%�������(��Fm >LG��/��ǘ�&�*����ȜR!�:�0v&Fᵎ���s�@z��vY@��������>�$�?Iߗy��2CtY��T=���Ύ�r�T[���C����S[�I�Z]9��S�v���}/�?�'@8���+��3��7��	V���@�� �z?��zۯ�o�
��.HM�M=�6�TQP>y��P>uK��t1^�<TiQ��+��:��XR�ɍ
���(��3�s(���� �u'.|�f�c��A�����Bt�:9<�C�f�}�?XжAǖ7�&�	ۢ�1`��/k�"$u.2��'K��gЁ���$|Đ
U�8j:�ơ�:�ߓ�	�jhR�W����I^�NU�K�-�7|,��N�s]=h
x�/�ט%/n��{M�4L�����A�-���,͓&��7��L�T���Uf�
����P9�H�'��xd�UR)sVZnQ�$�3��`�W��/�2`#)��p8	��X,�fop���#Si`�U�ُ��?QZ6����8������˿��pt�6�7��&�7�[y�1����T��|�h���ҁ��nlxxǂ/lxGB���'��}��3�F��悷��%���q}JIu��uP�s|
ݠQq���4v���F.�|)�����߼ئ����Q*����%c[��e�L����!J�6#.\-��w�kM��,Gw�4ԡ�nr�":������bZ��^�=9������}4~8��ŗ��<�������:� A�'ߣ^$���2��J�G��r�Z���͇�a�|qBɬܒ-;�\
1��(��hS��FG���@m�J%t�ۅ)A\l+�Q[mp�@�2h/�����qf >�����#<e(Еu\
I���i~�;%E��2���U�M/0�,���N���T3�bdY���#�����H�˹��c�����Y�S��g��{�Vb
�m����cG��9t�MJK���C�aЈg�*Y���@>x��
Z1@����4��E�d�N����3�J")�.ɳ�!6}p��:Q5'����h<X�V]�2�f4��^c�jva[��K�[���9l-|�M���Y��[�6�h�@���N�!�fն��,��߸�8�~�'�"j���u6(m�H��eY�D�7�&DY���noI�VV7�����Yn�gI}����le?�zU�� ͒�ۤʱ��x�O΄-��V�+�7R����&[�܄��Lf�5	E-M	1=5�5�M(_u���k�:�FA�B2VG3���Jf�(�[0f�㯽€�D�Ä�v=�i�Q\�=zgo���uFVeٸ�.��Z�3�)_�L(A�H1�ŰQ2^^1IDSǽ��OT(B9t�x+��<l��+c��g�b�iH��lf����"���=���v�5����I�*���Bͦ��iFo��i�G�]6�?5��D7�]l����#<`0�`U@�Ŗ�e�5��7�)�z78N��=~�z����ɧ�Q���͈_��ݾS��T@2d@B:&M�9�/�&�
�i"^l��1B�j^��k�j�I��i�K�y��,1}��0�]��)��D�9
�n�0�4���ma�w�8^Y�M;�<-�3�gg�IsZ��_�h(M��5h��\D:�� b�kP3
�9��ʤm�4ō�枯�ktXkܼ�%Ё �c�JV���͘���%5R;���N֓K�5�=�m-�K������N�E��lM������;)����8���N� :�,]
�R��A�L�v�^��&�'�f�9�����m*��Z�s]��t�e��ʼC��ܰ����7\��X�0E;�.'0C�}��%��=.��ģ�j:H�6J��Ȇ�wh��c�r���F��2�g����J�Np^�^�f�7��
dJ:
a�疣
r蔳�|a�vL$q;��=���v&~R�|:���ֶu܅�錕��D�i�����,c�O�����4�J����7�l��'o�j�?�=,\�
�`|���&��OFo�ɼ��L��)�h��̶��c�r�o{�}�	��bйN�� ���^JK���La��2r١�)�R�L:{;���mޜz�7p��X�r��n�l	*^V��'���sh��Rk��f�Ρ8h*$9��@K��!�1Ϊ��H��
�˕m
�](K�hpTs8��#��T�[��+]��YY!�ݨu)��rCI��|u`߁=�d�����)Hs��s��&b��N�#�B9�D�2��{����͌������fNW�a:%�@��}-�]�b�Mϖ�'&*d;jB��%��d8tR-�d���u�U�|�J:V#�*u0��x-!�kޜ��I;j-�'��/�:�N�����)���y�;���W�*����^8�/�1�;YL�m�4^��^%ق� �u���0�l#�4���I�^��:����wB{�aƁ�\
��3�Q�}�-$
'����7q���]�O
���
��CO���*X��sT�����]��)��w��I,�ͽy�XtRY8���Ŀ�r��Bry�ʥ�
�cJ5�D)oZ�{~�a�س��������1a ���1��#|�K6�m���P�פ�M�Z�\f�V�u98�/��R�g'���q&D�f�_: ��d��
H��K�z����|$�@�huO�[���j�g�z���������
�t���H@,������g�u��>�
���z'����o�J��$��w��D#�J|u�i|6�A���ux�M�&�azwx�W���dNOnKP�eLN�j��+
�f���'�*�T��`��
�!��8g��$X��}��_L
+�1�.�1�W�cԺ����l]����|K2�����_}O��D]�!I��:�P=�êo�h5uE���q|�+Q]APU���h�t��,�"2p�jhE��W����H��ބ�T�1+�����߸�Vt�̶ț����n�`xz��iR�aV�9QtJ������u~����[+k���u�W�!X]Lʮ���	){O�W�_{��8����8��us��ź�\�(H��J�+{��t��z C%8z��e���R��c�[���2�v���\�U�3tO.oe�V�2��g�x�T�4O+f��Q���҆^Vi��L��3���y�-Ѕm�cjz��`<m!nZf@� e�_R¯���@�W��W�0�Ҭ��J�KO%��	}�}{� ux�h���2>ݣ�E��N��{F'#TP�eqޫUW��KU�u��#Tw��d�0%��ayΨ�6�������&��*{��\C����FH\_��ܧ�f��"�5�so�=ZW��<=�a�66K���hJ��;����Π�x��p�o��DY�q:�0�.�O}ҿ�h믝@k���P�i�CB�M���5;�v��H�"cT�"x�&����a8r�ƛ���%��##l��A�t�T=nDk�y`����߿x�����?�����ӍH��I�U�6����^��\O��
�@�P4��=�=1��d���d'�r�FD'P��� ���NB�U8��58H�v�u$sO��a�o���yB�X��m���&'������+sEo�PX�^��!FonA׿�;6���y E���v�3��<�H�~&���TuS��dsL
:���l�U;���H��,{�C\+j2s��Q�ݤ<�b�qc��Z�oɬƿN�lٙ��GE�7њ�2�`�n���P0��4��1K��w�]I0�ϵ�>#'��JԠ��Y��{I�=E_���"`8}a�{��m[ 
�M�An���э{=H�R�]^�����C潲��E�YNTG�٪%'�m$	�!L����c���^�%���Zm������T�k�f����bL��hG��@~��z�(�r�6\��lA���T��2r�*����rm�r����/���Q��F������^b��ۚ�u�8(���S�������),��ސ�t0g���1���w�C!:Ɋo������Jm��3�/����{3�sm��G(��|�=,W[K�2����R�#%3�y��(�����>� gݕ[���Ӿ���e^kMU�^�[��T6�Ӥ�@F�.�6͗%���.Y�Y@t�"Q���K�x�l�f��h��!���4��3���O���K'�R���
b�ʲbܡ����c.�[�u��r4$Hz��"[@�tK�F�~�hwH��N"t3g�d�os�@e��d2�rH�|��3�k/#יi���B��E�ev�n?�O��¥���}a�<�v_F|�T]�0vj�F[�M�����}9@u�ٛMY5v]y�SMRHP�>FYO�
�����X��Ə�y<��
15[!�s���L��^X�خ�
]�c���g�x���%���N\�Mz�M��ŵ�(�}��q��d�>cJ���3�(�h��0�S5�u{�(⪠ ����gQB�,P�˞=<�y����z7.�2�BߺtO�iƝ�{��^�G�z����B=�گ}�M6\���f>I�~'t7}�Ӭ�XZ��r��n�U��l�(�l�t;�0<�l�ё�9VG�	U��z;�P�Z�̔��b^v��Gl�.�VI4��6�_�P���@u?�N�V��g����\��Kz,��	���\ؚ B�E�Z��|�C�J����Um��
�;o��
l8펩�"�rnbO�T�-A?�G?@TF�S�O���������;�$��C����)�f*d��»cd������#���f��\��3o(�>�Q�R~W�M�ac��a�=�1�"Ov<���7�^�O]�'��5Ɯ��j�'(t��}C��~_޼����D�V��,f�,)�y�`^Y���8�{`���yd(*0Ŧ�>ꒁ:����FZ�:��LX},�.cg�:ӆ��P�U�M�Ȱ�K��q�5ݤ���c�7����Pr2�3���$z�W����h:��8��� g��
`܁�_�<,~Sw�c`dR���Cފ�咢o`�ܺ�	Z�uG;�Ʀ�1�)�	��1O�-}��:���i٣Vg�ʮ���/�2��/2���rE#,r�Qnx�W��˟�CSa�/b�܌��|���=�b��ہv���\�s�0�Ƕ; H�,сyA�0���\(���(7��֖$<�t"aY�Xm�MX\��쑸+A�1s�S"]J�ӛ��N�
$�b���\��k#�v��h9]n�����O�GNH9L�G5��Ҧ��ʉ4C������p�+9��;?m��tž��qY-�,�e�4���d�S��tI~u��3:eZ��J[t9O�?y鷒J˴�ѱ/�]�OQ�>P^�{i�c��o��ƫ�V�wqN���"��D���k�^~g+�␤�m�i�m=s�8M������(f�%�`��͎ӟn��T�����c<H�j�W.qC�������iզ��Ժ(K�G+Ѝ��S����lG����Xs�r�rU�iPu�����k�9�i�u3k�na��99��?�x3��q�=�t9��ñ{�=%zX��i�暆M:���VekP��o/���r�`�^�k͗F…�G:�!xG%��t�����u�����zg�Sfj�8��y9��g�R!]�AO�ӆ%��Ac���>��s�j攰�Qk�͹�!H	�lK����
�<j߷7ƺMFfF�ң@*χ
�_�U�Y�#����l��A�J��g��fCY:�ƭxl�Nb0vҜ�1��U�QH|�����9��	��q��./��U� M��z?��ۘm��D&&x�j�t�A�������:#��s�ُ��	sT�L���FuK�(ux�=��<��d���M~k^j�m������/�)>`Jd��u��Z?�8ӄ.��=��v���YE����1�k�>�+��W6��x�f��tV��
�+��w�;fS�����z�4�z�0�%@�C�]�#S�Xge���:y�FI
)���
!�Y�N���Z�D�;�[]2�s�׎+k�]F�v626����\Kj0|O�Օ����0dݽUc�mxuE#�j��.P���3Ǚza��#����Ê�����{:A�x��M٘�$�I�5�^����V�[���l�@��W�I�lq�����Z����k�
l���X��_�w!;�,� ����Ȟ���$��;�[�ײ�m�����-3����c&����<s[0mK��"������+��T�I˵]�Eĭ�B�ov��G��N{I�j�*���Uu:do�����Ǭ�t�F��zp&���@����Q���4�q,���6��v���h�;��c���p,��Z�Lm�1%N�jjI�m\���!Y��T�( iw��T�.Z�œ�OG��N���t�t�C����E�G͌�@	Q{��@.�6w���I����l��@�ۗ�.��z���\]�R"�����ym���Ѓ�)���@W�X���F˃���
�:]ۂ��vB�KT����0���/ج
4c?�*lJ�LľT�Ơ�ئУ�QY�V�[J���9�ݛ\	r�Wf���d�<�H9	z�Z*��0WW�B鍎𹺢m6�d���œ)Z��m0�P���h
��K���S�\d��%�	�wz�̮�;�T��M�9�7�bB׿�
�E
-�h��J607�:}&�LUѐ�*�4��j�r2�'ǶFʑ�>�=��;Qr~��|-�y�|DǼy�'N(��$2����,<T�&�'��i���2�y�ב�y��8:�(�/d"��Z����4��`���{#h����v�ayJݩ����d"���"�U�c�m-�
N��+��V�ɞ�1٢��5����7�C�F��L�\Gr�8EVO��"�8���weڦLKyIA�&63����DeJ�k�ŻJ�E���r���n�>"SN���yֆ��:BV��w���^�+}6��O��xS�Xs7�>,�^x����p��<
Y #wL��$W���b���f��=1��M�.s/o�L�;��E�(�)�\SVuGM�َ��"�BZE����٭�U�3�L��O����W6H�=�{K�Gd�2��ZO�4f����FV⭚ַ��g�YN��(��2�&�1s�|��!���+��8�{d

�%MSz��0�������:L"��R	K�;�_�hg���e�:��0�UJ����2|/��o*�{:�7��,���е\8鱩���W��*0r�B	|k=�}^g�Bu)��4��j��}eЌ���,�D�x߃�YP̢��O��-����y����ӓ�H�U����x��ޗ�����bYXzfqW�ͷ��h��^w��%k+H���sʻ��)x��͐`
l�b��7�M��6G}�@-���>A�e_�����*�RT�A��yj���(���2���bU�q�S�PKE��Tx�5gl�9pip/_vendor/distlib/manifest.py�is�6��~o��+1�3�����dg�i|��;��P$$��� -k�?~�{H��m��LL�û/@;l�;b���l6fe1��v;�@,�y2��=��޷/�F��Kv�.�"cbZ�œ�����HD�ê�ه��Ó�C��/X��������??^��_�K�7x���� 
�d9_�\�X1�,Md�ĔM��K�d,d1�ʓI�v�^&wa
kX!hFR��
\=d0���z)�-s1I�B��o�X�ƳEXDs�5��`�
i�rn��Z�\,���w�]�L�#�D��p$˰0��2�d�Y3���E�� �4
�Ϯ��0K�\��`���^k,�/>�;7�p����Cvͦ"MŊ�l�V��e'�a�����o�.�������'4�0p�u��ڽΜ!�>�p�����������ak�����}��y\g��O/d��
�zWr�7N�S���@�eZ�e�)��P�"3���g�1@Aa&S��tmA��5h*r��{��H�^�{�}�=���p6�E�:jf�|���;�����.�?=	~:<�8:E��&� 7	�l*��{ �������xTx��(�ۖjO�$-�hؑ�/S���,�����"X�r��q�]�'���&d�Z�A�VV0��A`@1���N� p%O�`.��'"�Y3�<��$�9���E�E��0^�y� 8cv	�(�|�x)
9o�s�wDƧ��`>ڄN$�u�L�zA�@d0��b��&(p,�P\�op����D0:%�}�\h���S$��Y9I���=;ү+#�*���(�J@� �~(n؈}�hp���X�B�eQ��|@㗵NM��s��H�rK���������\=|8�a��;���M5+���\//����z�R,q:��\�/�%�Y\�����j�槵;r�ƀb
�h��s�Ac�=�D@+��iJ��4�V��D��!-j�T��N$1�=�&��'�h�~+�d��ЄXA�av�֢|ҁDKik|r
6^g�b��_S�ڙ�L��]������YK�5�޼�;�ީQ%��9�ѫ�vD�[�U�ƱvR	��
��m&E`le��p�G!壌���Ƈ� "�pr�'���^��P�4"\P^�U���@-�qf[�*��t�� Y�q�4�ɯ�_[L�r���b�l�OZ�L��9�&HLT��RN�W��H��ĸюU�����a*7űs�4��:����7�V_sэ�FC��o	ϸi*y�c>)g��a ,��tPS?�,fO,ڵ��=CXz$�iR���$%�b�5JW3�:������ R������t<���ñP�[T��.�Ol1��r����j��T�u�DҰ��B�Ӗ{�8��O;Z��:\5,q��\����; �u�J	�B��zqM�wSko��0���=%$�FS�N���LC�@]m��@i<�����9S��31 Gs��1Q���y&�$����~9�.�q�V�Y]'T!�Q��M���r.�4FwD�$����T͖@��Ё�u%`r�����ť�d@
�5�|�̋b9~�<����g�+hϥ(��w^,���m,{9f��OU�q����d�r��M������\L@"��W�Τ
�A����~Z�S~�V��9a�լ�K�t�m0�H�I<$��\�Ÿ���L:��	�܂S�s����/f"Jx	��p0��R6�)|��%�
d�W)��o�:�(�Ck9���d��Ih�4XS�������
+�[�[`V����
*&a�<�#�Y z�gx�%�B�5P�$%T|6�d�NR�Tz�0e<�E>��<����5��}�$Y��1w�wl�vd��u�:R�Ӱ=��Q����/�rS6�C&T� �:���F=,���N%EK��ZTA��ԦF4�����5�����!���?]�4;M����h}�/c�,�0}Mmh�m�g{u�aKW A^�'T�_�\��|U�R��h��qE���-�|6��uSo�*4|-�T���"�
ք��X�uԳɣ��~��u+X��~��Ӣ��5
{��D�˨R����)e���L�2/��5(j�ţ(�z��O���v6�5�ا�2g�p$A�g喌��"�0yv�/K���"
�9B�N�X�qF�y\�6
���>Gr;TBj�H% �=�_�m�<�����ҝlv���'�AZ`�BnQ��i�"U��[��k1}8/7J�_(�dy�BO���AqS��4�C�~�rq�~��M�1�eX'��4�Χ�B}9�G��
���n�o��r;hZ�g��@ʱ�,u��b��Mc��Z��\��z��ڌW��]�T�g�Z۔u3gB=��jKG':2nw�*���u����h��`����x]=��cҎW��ӕ}lM�nu�+��/�77���ף�}�	���YR��������8&�=�ć�ɬ'�����o����F&5-j��z�0	�2�[��"�V����,�	�
�}��P��?&2���S\pl�2,���d.ދ)�$]S�KG-��:u�ס�P��P�#hF�~̒��,���L�(�r��x���zf�r/�B9a�ge��@*�<+ԕ
r��//D\��	8��Y�c��D6��DI��h�C;�,T��TYl�aۑ���c&�Pα=��}��r-�U
�IݚI�w��N�X��w4��!��0b�+���(@S�13׊F��j��V����sp)a�t�_���s_5��Tz������$��hTplt��@C6�i�Jn�mѡ���r	��5�"����	&&��<4�*XnR��V����2��T�G��l]P:��`�⼖`��X7iLf��{/I�.�Dt�� �T%�a
���P����z�L5�R�[����v�9��D�U�	,��sh�zE�~�9Y��Ȥ{�1H��s����j�w�~ ݗ�DZD+/�O�Yu��[G�2}�
Â���'��a���ÓE��tN(���mK&�o����@���o�ت�Bu�kS�˸�a�@�����OEHz���9��m;wk���c�8�<�F�U��Nԭi�%�h�ҵ�n�m���0|D�C�Y!�]���!���YV�R�޵@K_O���HW�(��p�o�~��饹Rڈ���d�(��%�F#ij��%��̦�.��]��ɸ?���	�N^����3k���Y�݆x���#�Fg���k-��E��#�3�-�~��ҫ�_��(��R�x�X�/͎�<MGirk�W&@m��;��2
�&��9�[Y�S�����ߎx��X�5��ꅀ-Vpy\��V��MA���K1��*8J�̎v�ƻQݎ�$�\$�u0��-u��q��G��
��Fr�1h��}�ܗC��iN�	�i��l�J\��'
Y0�I�0�
�p���%�X�~	�&EmAMz��ˌ���OuC��^�">z��:N�sz��Vcu3�SӪ�"(�K�n��8^���o��]nH����� *����^�o�_,��U�v��s�J�Iv���x��z�w��vo|����MҮ��݇C�|��(`cjBT#���$Q��j]��RRo�T���)�6�G����:����|��5!��ŏ��"�z'o/�@����r
v#�;�r�T��]�[(��d�k��_Bx�!���Y���iC�a�L:p�i��bUC����!�3R�G���WNy���^)�t�Vݸ�����y�V).n�+:Ky0;�+����w��u����;�]�P`�(\�u�鶉���U�.��C4�Dґ�d��tDw�oE}�]�i�c�E���z��P]�����k��(�
��:5h�Tٚ��b%��5��Q�k
�*xFU�֧�J//7�R��7ୱ�؅�yٌ�MT�ة(��
YSX�K-@�&�e�U�0`nT�x�8]���"��[��
�;l�����[5�j�,Km�v�nЩ��5a��h}}�t�U5�A|��c8F#/�~}&o��t4]�r���y���s���]�P�jh���ڞ�rW�PKE��T�"@D�pip/_vendor/distlib/markers.py�X{o�6�_��qHJd��]qŢ�M7��`cĎq@lli���D"U���w�~���C��[�gW"3�7g򜜾<%�,��-Hk����J�<zN���noH�6%ߜ�����E���rI��&�{^0�YI�$f���� �rk�b�lEI
�5x`�P8O��Z#�m���0��1��j}��ͣ!T������?]}�x����NNN��4p�<��{��@N���+S�ԼP�b��#%�r�rA.V�۳�r�	^K���m���f����]!�t��XF�ӛj�jY����*�#��L��nr�|`�LeA�(�*(�(XE�{`'���fX.��aϋ=���X-�0�`Zs�ط��-Sh	�4J�b�G���:<)��[l*j��um��I�%n��94L{@kx���܃2��ƹ��@e�1�k8�V�?�����:�6ZU�
Y��1X��F1��������⇫���5 ���%*N���Ur��w����e��M<^���9�,��qEd���p(��."�%B�n�m�(X"��!R!���2�J�w��,�-��g��&>���;f6�::�T�t[�­}�0��rl�b�D�;�#y�g�L��I��l�� A��e��$V(*�5Y�Ӫ�@L��V����\�����1�~�=6��U�Q������9^.��h}WR�Â<BؓCև�5�' �G�f�}6�}6d�= Ɛ��x��f;��͟���4L5�z�I5��>��)���Y0s��?�c���f�6�x�����=�^�����*��E�ra�����`+�bۊb�+6���reo�_;v�7ȇ�a�r`���g���糧�{��G�=1����%���^���`T�)�gl쥞��	��sy�>����[�U�A��.�y�c���L���aG)�B`�LmUr(�l��l�۱�`�k���Č��p_��Me��J�m�r���&{�;��y$S�m5��Ë��%��7ݴ<ҧ���H^�Cq-*�P�e�@�̊	�|��)f�إ���7��9�z�'�3ޒčm?��cIq���Y�L����(�������V���z�����7��tƌNi���a&�î�
��)uЕAB�{YW��Ë~"L�}��,���zp@�/oG��O�?�_]��"hrl��G���M�*��]5�m헗2�b+{چ��B�φ$��~����34�G��rlfݖb��.��U��Z\�1�6�� ī��a�}���I��jb&O��nO55@�/�����}�w6G�Y��C���O1�f��)%�D.H�e�I��/�c�~���[h��a�'N��Յ8���ܖ���dr:I��nnF�fV�'iB*N�F������נ*$�&@u��$��{ӌ�c1��0���z��/��!$��p�2�>Z��w��I
�.s�[��N�~�#��~��m�wA�M8O� ��W�h�d?������տ� �&EJY5^�"� 90��u�d�JlGY��h��k)�h�9ddž�/2
�_2��p��\�OD�2n79�=��O݌cS'��E�avP�N��Df�̿�I'E��_ۦ�u����(m��Xp\Gzbz��zoHW�c�CV��O�5��|ؐ��-۞п��GW(�V$�m���y��������
�z����%L>s*���^�&7k'��ҝXa�h��v[c�`6�b�מ
ƨ�PKE��T@�]"u%y�pip/_vendor/distlib/metadata.py�=kw�Ʊ�+P�>��'�U��*6��Ė}$�UE�!b%�%������}c ���\�6�������y��b;?�2͊��`�\������ry_eW�M�ӝ�ipz͂w��uY'�es�T,xU��4i���@�Ƃׇ/fG'�I�	�"
^�=:=>��ӷ�'��
���˜-X�P砼��5	�K�˲�c-��Mr�����]=NV�eY5u��y�0:,x�NvF��d�3�|�l:�%T���p��.�r���YU,��l� �U�5X�g
����|:�y7�H�\�X���b|_f9�=�Q���=/�����ϊ
�D�y��M�]�>���1�nYUïq,����2id�����oGAM����գ�a�]�Z$�
�ݲf��X#^�=�Y%�&���o�(�bML���'#����kX�����;��÷G��l0�Y�*ؗӟ@���,��"Y݇@�y�ԵZ�7Y]C�YU�UԦ�po�,��UV�Ts@V�W�
�EY\�ټY�i�b�M	C$i|xW;���<��]a1p��U�O|#STl^^�?Y�-��:$�)n���cJ�������I���)��&��!�2ޕ�n��L'8xw�w%ҵLW��q[v�~p�a�Q��������xv����ã/���g�f�dz��;�sfVp��jXE��(��{����IP��j�.Y�\ 4	�*��r��]����:)�X
�aMA&e1gȰ���?���\�`����n��/�@���hF
��w�)���S@>
,��㏿�C�5���#��������'�,R&B"�6��G��Aa����� ��KVϫ�x���kvWVi�-�*l���@$W��1	C��ٜ5�i�Ow����6֍�%���/pf ��Kصy���o�_��o/�2g
�=@�U�m�2B�K�Z�����nD0HG��Zx��?�[�7	�6�?_���`���w�E�X���?ؼ�����z������ⱺ�>��.�\����F�vy�==��#��.�M� �ϧ��?���9��&
Ӌ�@����/��'�Y-�'"Т��~��b��[x8�FmT\.]��p �0$�6���|�0�2��
�K���A9���R,�+0=���km4N��b��R�O��29���J^ޡ�F�
J���C�^f
��'�?�qP�>ߙ��>76���>B{bF1̼���ࡗ�c�ZH�'\7�\�����?�[߃c�͍�3~�Q(��Ys�$0�@˃ׯu˚5��|6Y-aIXd�W���n�x�t���&��������0L�����U��X�aH.ڏ��}�O���}���/!��o������@z�S�br��x"\��R9�d��{�1�o\UE`P�^��������k�륨�}A�O�_�����v�ܖY$)94����������&[�{H�-ڤ�%�K�d=u	����&?x'8���d5�E'�;mJ#�����N�A�68�rU¡1S��f���}�l6�h�u^%�H��`u#�+�.�v:_�x�7$�B*eKV��\"
�]Brr�?��Nꘇ2�v_��0V�?���,���-Ξ#�UN������fz�}�
>ȑ)b"<�B�c�}QG�� �Mtvl����Go�;>*6�����
w�,�jH�!�fY�%q�3IB������\��,#���A�p[���'8S]f�����)�<b7�"O.���H�/�x�8.�>����vI�"��™�M"��#"C�-�HMRv���@��|h��$0�'�Ј�H��@r��"��!���#�ŗ@r�k��n��tc$
!*����"��H~�h$��-���}���muX�f��TS/���%�`	נ��#���>u��{��0�aq��JF�n�H�>F�n�i�͍$�v/�mٱ݉�Gz��I���X?��}?����"r����uT���l���S��w�
膺���|��R�X݌U;(
�����-��z��6�	͸��Uʪ�~�J�]��qr��n�+��%'�p�3�6԰��~��섥�2
֔��)0�`��PP����=���p�
̦�~�^�e�XCɬY�D|�`)����_S������}��C���Y�O�Sԅ�`��X�J
�}���Xp�ܒ�̯K�#�pg�g9t&�2~���G�f������aE �H�ع��pWV7�*��Ǧ,�ڂ����<�����(����o`JI��ч-�_*0�Y�G���`J�,s��F�
�E�5�� ��sj���1}�;<�Z�i6�84K���^�9��؋���9-Y/��4놡؍&�A~c����L�6S�����ZYT����9���kP���T�V=�(a��M/j�R��C0�.���u�,�g����&K��M���Y�n�-ٲ��w@H<����?����))?��?N��NР��!(�e��Y�5�[��p�ޓUN��ձ����m��$q�^�4ME��t��B@z;\—�/Ngf�׉���g;�9H8�‘�K��l�"�t�vrj�2��v��fm�'V�i�^�^�E|;�߾�x��uBoD��o޽��$4����������D2cd���7G�/޾4A�0�G��#�7�''�����#|������U+4���`��d�ϝ�'���-P��?��#i����)��߯��|���N3L�YNg�H9��h.#/-p$���&�G�Wc�m������@z�	0�sii���V��K��8ɗ�I�Z�
�7�
'�g~�`��`F��Pu�T��
��$�4�&x��`�%�et[���S�+ì�	�@-�^]D0ʈ�hsRŰ|M%���d�I8Z�I=S5x�K�3P^��d~/
���^uL~ʩ�6\K��T,gI��b��$eN���_���yIQ�j�qJ2�'�<�[�*4I�d�޹5C�Ҫ�h�OIu��\�:��@��S������;�J扙̒3��i?
�2����q��0����+(�9�K�d���~�,����`t��xʐh���ҺK�M|���� -�4A~�‡�$��a�0Y�
�ց��Y�5q�,�	�1�6
�t�_(��=	��b�Ў�!XQ;a�×"{���i��!�C��kA��ɩ�d���1<S��$QS���7"I�&�a,uW�e�<�����B,̾��9kb'Ď��Ia;�2��r��{�h߂"��E���C�����j�����ﱧ��B��G��(����+�d3�\���*!�0~l����	u�@ΡO�ca�:�a�:�5�-H�:1�M#.��������	�`d+Z��>l��P�n x��\�G��h�{�	��<��
�2�0Yh/�6�|�RC�u֐3���k�ʑ6]sl�5��Z{�@�е�����#On�R��y�8JG�=W�/�RKߦ���1��z�
+�t_,��;C�I{@�����_��cfa�A�����/C[(��Hu�2�b�K�̏h~���8��`� �
��[�Z��V�;,�?�7�
����K��*�2K��6���A˪\'�Gd��/G
�1Il���� ��\�&<�<Œǟ�K�f��r^��3��G��ʇ=�s1f�Ֆ�h�)lf�%&��}�)��榢֐�8����xև�c���@�G�^}�=Z랤Vn�-u@9�|ɴ�V�r	�*�	�gI���ie"�y_d'�裶i��m/3r����</kf�$��i#<b��4�����`�Na�����g����B9��V��j;��4 ��Ъ��P�p������Oz�LL��gD��{�[=ms{o�x��x�gs�=��'��>�Dz�%��9����9�N�����ߓz	�V��A&b�|����7�J(����UR�D"r�D��D0	�v���z��t�*���^܇&�a�g�.��LvP�J��c�U�`�ێ?Rr�dyr������S<#{�mA�-�5�
�N�"e}팁�s;Q��~�l4V�?�#���l�q���&[��hЧf���K��R��X��=B�J��d���#$��r�@�>��΅��"�f����5"�-���q�•�-CUI�zdZ��|-фv��l�D�3�w{0�Y/�{�|E�y6�E�~z��Y	���~<d�A�ZP����^�XW»Z��/`�����C��5�T.����t.B���j���n�G�P۵�%.J�'ŧOo�ꪶ%��)�M{��]a�1Ϲ�����8,����ݑ��AA�o���{���T��{<r|���.S�F�`����+�{�����P��U��
��&
�8i$ߊ>ƄJ��}�3%��D�4�5���NK<�9�����5����`0��{�̉�֛�C	���_�{����7��v�����#�qh0=�5Cġ=����D��d����4Ẻ�ѣ%,�#��G�?"0�_�	�„R4q��h�M"���d\~vs�� �0Q�ܭM�����NpRk���no�k��<����6�M�!��"�JŰPS�3�!r�5)������Š���N]�u{�u��Is��v�-����Jb��m�����wn3d���/�5��y��,��(��We�������l
��'�f`[�l奎`t�}d��8V�"����]�^��^w�i���l~��%��P�Pt��ܡ2B�SӘ<��[�c
�g;>CQ�r�,(��Qg;��
����#�PΛǿ�UK/�[��O�b��h�Ps��:��͌W�W���lr�3��Tt��_Z|f.Z;�e�5�,�&��^�b��렩�l2p(���OG�G]ZzI��PDzM�Ɣ��I+�|J��Rxq��9�h[&V�������v�:�2[�V�_�Z�ڞ���LL���X=��K�H�m�N�L*�Ѣ�C�^
�¾A8��C{{t���`�;�=E�O[�#���Z��~�K�=X���va1'3��r�QH'���D;�l�|�]zL��X��x����`s���^��{FV��Ժ��8ڼ�E�^���.��^�)A6)�	��>�3(2��i�:-�������k`E,y�b�� �v���5&0++�錬H�M��;L�.GSI\#4
��|>�L>��5�{�{<_X�Qtq/�i�0�0$���ɗ���Ɣ.��b`����OuB�¹>�*9�'<y��+�i��t}�&a�E�
���k�!lR��bIL���
�xЙs���۱�IWx�N��d"�M��s��n�!�����*�,���ζ�^=/�F�Zp.QF�g:煶Q�x"#�\�YNQ�Fި�:��c���e�gUU@�g��=���%�����e굆%[�]��^s!�"��<~RoaΙ'5�� �7%�0��Ѹ'}C�%%2�Ԉ"�2J��]`ܜ��`U�U����bc�f�'x���'y���6���~	Zl��>je6	�A��(���J�
u�jD(�,���A� �fgC2K�!�B��BiJ)����a~�,24p:v[��WJ���)�>c@Y~+��U�w��(�-C0}���L�>�X��J��~�l
��wC����Ҕ�-����MI��a87r��_E�ה�|
"�i@�$T�&����U�2o��G��g@~��	�����Z�4�'��d]��7.�Pn9�!��,�)H�
�WC0Q@���+֌v�C6��������E�ā��/O4�2�y��3u����xh�?'QІ���K�4e&柟���)g�K��J�x"�
�cN(°N�RK���������U���J�py�i��5|��l�:��SW8�g_����T>��9�r����b�$�;rA_�XJ}U?��R�X��E�r�#X��J��!��#L��ͯAi�x�"��+��-�5�E�B�FoN_|5;n_U��O�'������r]���C������;��/�d|�T>��!��ɡ�Dڡ�	��;�����7o��p���h���\ۄ�5�헳����[��� zRq[��sXG/���׳NT�'���I� ��6��w�ǵ����!/o
G�P�G/g��A"����9/�R��гYC�.�7)߈2�`)�Sj��3k?�TܛG^������>z�F��c�%qR��c=���b���7����f"HQ�яKy]�7(q�S��6��ԕ���G�����>��n-r���%�ډ#Xts�%���edr@�`�]�jm��.���
�8��Ipg�y	�i�c�*cy91��B[�Ǘ��RE_EW,,��k��Ņ����O�r5�pYᓵ�XN��F��a�"�F��ә�hm55=�2��H��U*٢��~/�rzQ_҄oai�\Dy%(�H�T�L ��.3� ��<Gn��<g#��(6���S��"��GY�!jYZ\�X���ˀ;~��`��=8��g��|Ґ��%��v�X���)+�O)c����|.���C��9�v��P��$ٛ)�$���r�?������	jȚP�gvlA
�{�M��1�:�9*��v3i�Hzt@�
0w����9=hexƓ�R�í]qF�C�^�F�����1>ֶ�|���tڐtM�^���F�9U@b)Ўb��
��(�v*��5�Y�.�&��������q��B�����W\��I[��D5.�5�����o�+���!]l,���.�\�S�W�Ā�~�����v�F�i?��ܾɣIm����/!nw4�L�&c4��׎6�Y�ц�Ƅ�s1H-�%�.Hl�K :�"{W�E�oq�at���!k���F�.W՜�^,l߯M�W�Lmc�wA���4(sc�oO�%G*�3A��䬯�5�tt
�-b��{|Z�����o�x��/���i�~S�x�a~�m��'O��#
�&o��W���G�C��T?:6�o6)a��-�@ʾ�0��=�`�w���>kŮ�:�ɓUqe�:?��ۼF*���C$T���?�c���Z
��e=k�����;
\�Ң���m��B�@ג���
Ք# �k����!#[
jʳ�qSg��w�w�{��w̪�;�<�JF�(K�_�2�
�q�C���]��e!��ݣ(�/Czp���>]���uw*����ҲŽ��S�8�G�����a^�����ZmѠN���m
�aU1�1~K���W�E":R���+��z�V�V>��R0�̿��V���-����6�HMU��[k�����>���1��>_�G8�2F�F�
o9N�O��ۑ���T��mJ��í>��8��F���sG�O[����:CFKy��ð��|c���L�EXײ2F��;
�
���1��Ⱦ�����x�T�#���l7u{��L�17Q|jW�Ȍ]ePU����ٷ�#���+��,���,J�{t	����V�X�ၛ�k�RÿJ����67Y����`��(Cq�5�<�k�p�u��y��,%k�eό
K4V@!���9��r�A}�Ȝ���L���
QmDͩC���쥠G0�)ip����<�#���G����8�c�m��4��l?^>��V���S�n���9��sew��#i��򞂽`��K�AA�R��<�-�*Yp���
u!�Z~�l��a0X,d:��kL�m��8G�Lx35Lz���L&���1ˮ%��@tL���u�����f�����~l	GA�}�+ȑx(���&��-�q)�v�b>��c��ܟ)�p�A��+�*�Q�U�~#>9�oͨ�=v+:���k�[������~�����*B�����[�=�O���x�q���j��D]�1�NX��5�ƺw�,�ǫ�c��[��G��k���^(
2��LXu�p���|"~�@�n�<��h����C�����^??����zKGdf;����W&L�K��#�C��s@ �"+�e���L �oո`ty��:���4���ՓZ�p:��{=d���l�&8�ю;�Ed��6�m`�1J��&�Y�����V�%����(�aH�u�;��$jϛ��#�!:��JO����j��r��@S�1�1XT�qӾ�Ɵ0�R�T΀��x���9vb־7q�7��)tJ�l=���g�e8�ί�_7b��bf^}/�7_+4��>�g�������<�$����,���X�zz	���	V�H_��UJ�2��Rӊ]�jV���ĨE����h��΄��*i��{X���u_�b�����UN�(�+((��$챣׉?�O�URm���5���A��i-�K�Z78(�9d���(gL�勴͛&e��6Ii�4oUw4�K����SҾϟV��S�K��^�vӊJv%����|�B�o�W|�
�V~g7Z����g\�x7�)�d
�?�V�4��n��t�Ǽ�����(RFq��O�X�B�4�(�1(v:�R����-A|7�����J�j��:�͹K^��g?�F�����%�d!N�O��I�֗(��>�sφ��5���E
��^?כV�I�mE�ݐ��9�=��#��dן%�oS����+kq���DW)R�%���������}�G1M~o��`À5��ҮZYWX�L�H��hh����"B9g5VX4Z��_�f~闵#���;z<XTx�����۬�5�z���Zd���B̨���wFrP��R1~}		@�I��Q����;�^ȣ�G†$�l=��Ќ����5A��b)6{'2�I�(�;�&�e�����I��Q��躥�Ƹ�²����,���%�jj�롊�}z�^l��Ч�Z��|�z��j��#~3�?!��>�F�ULZ�r��W1�=�?���T�\q�G�3�_iY=�<?�_��E�>�d�n�]����b�k���t�t��m�L�o��}��GV�8дH��O�1����_&���}Z��d��#�1��֮LW��]��/1��25�l��=��� V~-�N��l��U��o\�7ZW����S�fW���v5�E�]>��`f��v�i1K��KYڮt�Va��ǹ]{�͟ǎ���p�j��	<�k��%/�����7�ʺ_V$nڛ<�ODM��%"F�L�R�t�XF�Qn	��bqRϳ��u����}��j�ϵ�XS����K�t��"���x�pW��Q7��?��8p-�}�"S�wfBX�{��wɽ��B�!���D�P:�b=���;?��B�)B����՟x��יѧ��~�I�VMb��0�����6a�
��G�;Y�/�ƿ�6�f?C�Aw+�I�yh!.	���7�jC"�̆���X��zQ�=B�5���5��GY+f@Q];.st�PKE��T��Հ�D* pip/_vendor/distlib/resources.py�Z{�۸�ߟ��q�|�����0�m/iRH�C6)��B[�ͬ,	�����{g��zx�w5��-�g��Ԙ]|{��E*����ş��h<��Ey��vW���}wy����������/����\�\����w��t�wE�n�M}�+�^�<嵄g�ET��|y]�ա.�׶b/�e��޾y���ͫ�~��S��޼���|t�MU�Y�l��I��,��K0E$��E�35���Tb]�_��߲b����B�o��P��TG7RK�~|���6�*�V�HUgr��a-J4��LK���H��*JQ��ۊ:��Ɋ+1c/�h�:�׮��1н�gQ��|�OG�qջ">c���a]�w"g��H�.�J�B�j-h�����Gȗ�
xV�N�H�l3c��5�5$��z̤��=�'�a��S�����2u�A8|?̙.d�^�_Ɓ(��V&.y���2�BGE��M*c��M�S'H��Q`3�m�ؙ�����R%��0.��g�����3�����+A�l�϶��I�����K^����@=�E��f+�>�!��Q%͈�X��)�H&�F-���<9�U��٨kJ�ǽV�u`��;�I���َW)�x^eb�����T4S�aXŖs�O��7�Rvv•?�8R�`Z��u�q �ԙN��,+��:@ b-g��X��&he�)"g��QZDN�!�A0�w#"SCtAʠ�c]V諞)��$�U�MMp�`����3O"=QH
6�E�H�B�a����[�Q��'��*;sW�ιkh�@�M>9y�%|+��QW֘�W�u(HV�\+����Z����ȹ����ȍ�36�_M��+��Ί�ML3;�c���|Z\���
Z��@{n:�g����7=^�_�A:��3s�`��|��i�J@h*X�8������[�^EV����#z@�d�,���a�E��Yv4���WGvP�=��s��U���8�+�k��34U	��y��`��+D;\��׀JD3/�I�
�nr%��"�1*���i%N� ���/n�q	��3�;0.1	��<[�������Aa��7����j�(�&���[�U�{9�q!���۬X�Lg�_>]��VO��B��I]�mgzLAJ��rv{��HU�8ShC�v6�Ҭ����A�m��}Gy�daY��eiL�!�����M�WM�L|E\f��}U����h���_�neY��⡆�
�i^�&qy\O� �߂���Ea�9G��6[�v_���Si�S�����Y�u���&���D�%	�L(>�l!l��{�PB��	��Fy�~9��I�H6a`��
��n�� �C���I��j�&���x9��
1�l8p���W����.`��	�$�<�PB�$J��He�b�1�i?�k9jW���ֲ��9kͥ]��W�?LN 7M�Ӕ��$bUBJ���iH����YX����o��S�?XW�����;k�
jk-v��0�f�7�<U�BƠrmXg!����%55Io�xu;��XyH�]�.(iEu���>�@����,��Y��h�I5��~j%-�m
J���b�i����������>iԚ�5ғ��x�&n	;\�T�wYV܋4�tB�f�6�w�Xy�mP�$:���
�<�=�"�ۅ�=�^G��n���+3�Wܸ�b7�.ó��@�`�0�P`�B7�뽀R�F���W����Z�p�u�LNT��@c�.����aK�Fa��	��MN�
�eQF���Q
h2��3�)��ѿa�z�B۳�x�� bٜ]�.���}�Q4�0~`_����!���6 	Z��n�Jwl�����a�� ��a�n ���Z`�iD���7WG�q�l!���H�-..y�U���U��=�ґkG�α�at|���\jj���!p5gX@�kv�~��[d(�c�?YZ�Oj�h �3²����x͝㣆Xa��6������~�AcOC��$r2m�:
!p��&��$�Y��q_�ڨA��ؽ]�>�y�4
���_��C�uz�a�Z���$��7ucGz��d��ѴWK��)(wS��GS��ӭQ��D�C�N��xz5���]A����$~UUEOQqb�4�
Z�hȥ��T��hB+�6ܝ��7��h�fA��c�n�{_T�O�{S��C0��+F�T���
���6�3�'�S���(O��31�,�����:,�ϓn�w�37�r���X.�/���8�S]g�u;�K�1h���ҵ���R
4֓�/$���vʕ�_��n� 8n��..�2�WcW�S(���@�dƮ����a��#�ߋ��5��DxC!ѝW�%n���7,�S�SßZ���u�}A�h<ɳ���~~&b<؊�=|�tF�
D��̼G��F��1�k�Ȟ�?̠�W�W�'Z@&W��݇��x��:�3�7�����.#��φ��mg-�A|c���[��K���usM�ˋ\�f�K��"���?<�TG��*���$���nj�X�e�6YT�`���8)̮��,$5:�i����I1��Kw��y�X��'?�b�4S�۸�΂"ڻ����&��p�0�3}������{�o/�쩭{�"��6�9����@�k0�0��L�������Q����ML<��:э��~�;��U���9�w�������R4���	�9[z#XJ7��ͪ�L��10i��U7~�zeÛ���0?�)�r��3}��7�^�
묩&���?�4>��%��Ez�zC-�������Q�!K������N��'f2b{}nnBܕ�yϏF�-t�J�%�-�U�{$?���2���G����U�b�G�w���d��jK�z�t���f����!woH��.2�݂�uk8�7t�Ks0>i��I,z����o��5��0�PKE��T��tԎ�Fpip/_vendor/distlib/scripts.py�<�r�F���cjUb��$�U���6U�,�,9�=���!9`��(���Q���ޓܛ\w��@J�N� 0�������~7da2��r1�	��z�u�n3�\I���g�/����7[v|���E��ϙL�\qv���$f��Bn��������nx�X/���2�_ˌ�5�%º朝O^�/�Ǿ��,�����ͻɫ�7���!��-�d�D��:M2�^m%�'�=�3J�K�O�3�˻��w�̊PV���)�\��*҅�x�ƿ�t/��z��:
$���b9`s.y(�<VD��3���e<O�,�y9u!�(�m!ET�pq�eʳ�4`K@��
���v�T����X
z�}�)<,d0���F�\$�z�D<�����!��/��p><�g�tk>�¨�������Ӌ���&8�����u��X<���������l�S�
��$���_^�~�gі��8��,>��_�p-�,�A��@� _�w�}�b���\�e�U�&s���[���4K��y��f�J �����ӏ�w9��p+�)�nD��y��e�?���ؒ�i�P�t��pɌ���r���)�%��#���vS��{�
;��L܁@,yn=�s~�#�ߣ~�O��g}V���=�/�(�%����G��G������/��>��H]��	o�X�z/rQ�~ �"�A'E��F�<�! ɠ	Ȣ������|r1���Le���rgο<�K	�族φ�?�~d��g�;�?9^������f�����;�Z������d^Dܫ4��U7�X�+Ձ�@���uJ4uNH��d˻��>�]����w��@,��O�����B"�Н�9ǫ��{!�CwQġ����C-��|z��"���j�����D��W'�y8%��,�g�p*R�]��a��;\�Θ���yv4�a������4��7_�y}��A�9B�[9?L���6�k�6^�"d2Gh�c��x'���gfP�g�M�.t��=k^Mgs2z�8��3�~syB�\�9�Z"�2��\�e>i"�+����U�4!�`)MiB��W�S�$���dA����(q��,�q(<�ʈ`��)���9�'�Ioږl�C�a�F`��5��[��MfL��W�r��@JB�c f<aW�3�z匫g8
�W��<�XhS���
j�T�5�TD�a�z��/p�Z����2W�P��S9��9����b�����>�ϧQ�h��n��wx�y��fE<:C�?`�$��7����e���=�^�?�Ab0�m�HB�~F�lF��M��Th�rQ'�7璁��l&��1����|���iЈ�I�ĢO�\�;r�z�%���j�`�M�62wA&��\�.��w�k�*��8}h�a�����D>�%L3�K���k �޳����_EW �ٌ�i���F9	"ɳ8�ݖq3:MRR2C<�����β@(�
��4�z��f�r��������cP�X�Cfmڻl+^4tC��r�QQrJ�#�=�R�r�/��]�r=�à��"%�ݲ��o�&��@0,Q�"p��V���@ڒ�1H4Юk�q��!׆Ϛ�bF��>xB���w9H`�ވ\���d
z�E�lr������#y=x�4����q�a*5����2!��<��"R�-��s�"ik�FH.�1q?U��>5�Z.��q�֝C�:`K�[������12�9����\��=Jx��o��0
]��rA/���M P=�2 Q&���M���AK9{�׈7*�EvD%���y��=�����c��5�!+7I��
2�d��b���[;������
ͧ��w�=p�&h_j�ԗW�N� ���DeW��@�Bu���-�=���Y�pUʄL�z��O��*�� >�D-�6��T��8�B���26�d"P�ґ��oR��t�k?[�Єh��!����q�K钒�=)�����We�0����Y�-���Y��H��2�/�驈�B���c]
t:9a+)ӓ���f�xXDkΏ��yʃ�г'E~�7qt�x)Wҏ�r��Z��䫀��O�呾�X�	�#�GR�G� \u�zI�ğT��
����{ qO&q�N�s��ȁ�|�����\>/�ȶz���4���)=1E�h�<��
� Sq�Y��֢??oؑ�vN=~�/�	�3L�Ps��{D��6��yԁ�g�rH
���%ʋ����騟�v~͜O����,���c�S�wWsX��uY�O���_�{�a)��imdՈF8�0�U��Xx4ÈZǎͤG'�M-(]mWф���]cd��P§0�����P*~m@��~@�U��,st"_�}�*�T��mV0L�좯��pu��} �lA���1�(�u�x����ұ��6u;�:�c3"y�'n��{�W��7�wۨ0W���A�6~w=��x�{�Ph�P,ʝ�}�C!�p�Iv캇0M��dNn�lPVص`(Ī�2���1H�m�i�|=�;���=���s·�wnە��V��I�v`ӝ_�ɊQI��gDXB���D��חoߎ/n�o��cR'�b��0:�hX���g�^~	U/Px�l�� <�q4���O0G) ����,�����>;�`��r��*�Q�<��hK�BD��\H�2<�8<v$�v�x����d��Q1"�����bn@��ӛ�{}z5�9=g�㛛�;v���+v
D}��x�籧�nE2�+����»~{zބ��g�ޜy��r�о�:�����϶��>9�s���
�ah�=�)!U��\̑H�"4��@^Hc���b�MA����BP�LT�g����1ʀ��Y������Db�P���'l���^-r
(`[ �!�D��l�ν�*�f�\�s�@ب�6�>Ձ�����p���8��dI��4<�=�Ё�r�!+�*��›�s[au	U�s�N�hb�єE�jxE��<„Yq"Ɲ�F���F�N�w���GK�Y�Z� ��,ei>�Q5H��I|�!��q�=�'�\�_�$�1����4\�(p0�R�
#9g&�M&��8�:X�:�D�^��<t��Z-���[����%�����oh���s���-�
5��9&���+k�v�Qܨ�zms���̤Mdb�e��\*l�ی��Jcc�j!�$�m�����~lFt�E�)�4�Ͽ�E�c�#Y�tO$v���M��S:�U1�C�	ayw/���h���t:j��{�>��L_�;2��h�@t�D ������o�
,•]0`[=95i�2�Ⱥ�H�5af�V�`���I�j�C�op
��kRd1`s5�gر��%��(hutXZ�x�q�S�D;��T�J���[�L[+XUY��N+��Jh2�n�5��*AY/�1��Tnjێ�X���-�Cב���:�@��`��
�Eٓ�گ)��q�;`ӯ�ۧ�)�J�p���;��:��|��x���f<_]���i��`���}(A�
O����\.��x���N8_��ntKYU�C>pmP�7������O
ds	��M�I�m�j���W�����R�=F��
Y�$�!�%�j"��`"I2	6���F��nNP��U6���Q��ks-2��_4��e�� 5;*2�^����s����Y��5�3Z ���ә�!3�g�.�R��H׻�:`��ס,��!W��ڈg�\`F���݇��(l]X;���`�T��s\J�V���`@9c�R�0$+�^�2w������Z��"���K�~t`�G�-L��v��
��vO�c�/ͺ9���Sd%Y�:a2NeZ�`��8f�Ԁ�4&�;G>N��J���!Ys�%|%�(�K�3��G�T�T?�Uˠ��q��S��t�ڳe?t���$��B�!����P3����T��[���k�7�LO;�(^Xnqі�?FZKڗ�`����u�B�܏z�ύ��2���� ����龯)D��o!����k�+PF m�4��Ȭ�֡�T�Ϭ��i�fN��
���0DS���m�
�߿u�Z��U��|lfՅc�ǟ��g�8�tG�a�5;N!��V��L�'�`4eu�)�nM�=(��ϭ�ߴ�\�st�&�B*|��_�3�j��C[=ت��4�K*P�X`A2�}���F��J�
�r�.hlTC�>�f%��ll�ﰽe:iv�\c�ʟ[��!���lek��u0�RP)�щ[�m�m��'HaCm���-He�^�[����1��r���o�*��$�X�0gn�e2�D̫r!�a���G%�tx�:�/Xߝ��0�+2N�T�l;�%�E��a @�
w �� ��T��@}h��*�*aەf��:��+9٬]����*@T<Н�m;C��h���̧T3��w��e�p�z���f����7H[֩ܪ@��u�K�d�u �Ha}���S�F�j+�9��O�UL:���a�K��zX��6��_fI�����[
b����$C�`�J�ME$DaYS����@�і9-�]�4
hgi���TA���ΰ�a�:���N�[���m|c��
ҖQ�.�u�����ӝmU���j�G�H��p�ջ�%�'Z^f��Sv&��c��p�����v�
R��z��TwIW�Zs������hH�*�Ԅm�0��5?�i�bѰ�#��oF���~��q]	������7���U�L���3!gEx�%u����~����V��Q���*[+�܊x��pO���a���
a��d��p��!��b4}{T�����\�~��]�OuW��A�v/��mW��oD��aMZ�96��@Y�.&����0h.h�t�#�j�X�cmt��,O�Bb+Gx,9S��=
 ����[��x���&�N
Ě:���lZ.0������X
�˄��B�������m��||�vz$4�%����ڀ�����s�^�0WM5
c3q��)��u�ͳY@�+(����iRO���E"d�W�H����0�-��[ǝy��y��_VMF��	��k�j��ר�t3��H�GV�J�EY�
�������2���o>=��Di�;�=U;@�A�[�YF�B��D*S}vJ��p��SI�}��6��P�m���D�D?�]`	�TR�R�p�M"������9�X�"�����p-4��p
�e�qJ��JUmѨs�=��bVav�_Z����r���uI�F�ڱ��c�FIN��O�)��=2��z�W�r��]�'�^i|�4�̖�aQ��sG@�井�O��i��jN�?PKE��T޻���~pip/_vendor/distlib/t32.exe�}xTյ8|�#�!LrH |G	bd@I�� L�����h�8NQ1�X	$���0�Zi뽥WK���{K[�R���$(*��XhM-�=���d !��:g&	ڏ�<������k��k���^k��z��pg�?M�������=�l��!o_s����k�<�6M�#��P�}�>��#b�7�ϯ�����{�zd�3��2�Ͽ����]��+��|��g�ct/��B�!�
�&V4�m����ݔ�e��yt�����:{��Ĕƭw��Lk�̦��L�k����iǜp��Dj೙��8}O޹&"���@GW"lꞺѿ�9&n.>�c�:�_A�F���;�q�	�$��Q����f��o�)�B�V�`�|@1�vս��q���wf0�뚡�q�nƌ&g��j���kk�gj+V�N����kF��)�N���n��-�����[��k8g�9�Ф���
��+��䎸�M�E½ݚ�@F�_<�m�����'07s>�&��F��=��mA���u�8����6�&�ST/��J�\���%�`I����%��}EI�mFIj9�wh��^�p8�q�|γ��8�r�ű1I��%�����T7_�YX�Wm��D��>�GPf�����N@��*ul<4�q��"<�x ������~M�e~�������fi�}�&-P��S�	gK�E�Kd���+pz��e�Gq�W�`���w���Ԏ¨ŝ�=[�����R�{|�a"V��8Qܝ*�㵧��E�\KE��RR'�0
�:��SP-�����v4^�f(�9[���s���`[�����e!���g-��A�r�I�W�#�*��^���5�Itj�x��w��<��M�Q���J
�A�R��S5H�����<Xu���p���T�el#!��"kd�D-�]��"��01��]���Eqw �0�������ޯ6_p�&�.EJ�g�r\E��x_ Q2_g=|�i�<�|K��P�Np��m�V�"x1�U��OZq'<��9!�?�g J)�>vQgbg��A���*Et�`���f��0D����젦�f�P��4�F1* �r=zU��	�����-�4a�÷�V%p�_Vج�������y�:G}�[���&��Z����3��m`���Ñ*�p>�xm��SاZ �H9����D�hS[�f�����V����k?��(���je5�F"g"q!�&�m�N�
C=썱�v�-�;��yFt0����g��P.�d}Y�1��v�{���,C:<E��, k�hw�	!���	!d��܇��B�"�@g��+ܱ9vԡvLlB8E�����.�T���N �v
��J���@��2�Z̳�TT8{Ĵ��N)�q���^g�ܝRf�^�N��o&�vbj9��̎�Nw�dE8�;���n���b�ܣ�C�ڇ�
�;NW��v��W3��ڇ^,��2��	JL`"��

�Ve�� �>��~�f���.d5�u;�y�ٻNx3.kZEE$|�<�5��@�/8D�����"���C�FJ���L�qI����+����yK��#���}�McB�w��; �í�¥s��:lP�۱%��J�,<��^Mk���j�u/�د�C`;%���^S�Pj1��
*�I�<){��>�S��~?�/�_ۋ��k�v���E*�r����òȎ�z�2��Zn|��;���3Іb�-I`�vm�;�.'��_�V��
9��T�fBsGY���g_��HS`'C-�N$�t��2�j�'��6���9�G���O&M�~#dv��s�B8?G����xλ�W���ӇjG�K�)���\
p�D91I�=��a�t�l^bh�އYj%/7�jO�m��J>hlD��^�p#����lȫO��y<O؟!��F ����Mo�U��M�Cn1C�F��dU>��o��nq��??\��B��t�3����;k�t��g�y��9Y�Z�[��N0{��.���9I�Y�y���3���,��!��な5��*Oea�����m&�ȏO�$�%�ܾ�l$�6��i
������85tr2q(�CK��n�R�Q�JCleбZ���F�3I���i�Ir��b���lM�aK����xAd�9>��'|Eq�^�����$Z���S%�>I䕽g&���'�(3��_�";��^��nm��?v4_ms4�O#I�lL{س""c1��
�-g���m��/g���˙b�|gk�q�z�ua�<�6�U�#�NR��\��7�bWp��Bm�*�0�B��שw_H�L 9�⽦x'�R��bv�e��&H�Q7^XH��\��;h��;kC2C���s�,��Kf�)�_��p���Sv�y{qv�kX���.�}18�`�i�Vz�Ą�3+�`��:ҖA<�B������i ��<�}�y�$�0h_Y���a60��tDl���G/ ���F��E$|��.�S���-��F��FsM��t���{	�C�ZG�����/M�%����3_�UmU�[	c}9�c��Z"�3h��7�>�+�b��ɿ8}`~��Tۋu��W��ˮ��(�� �x�@rg�&�|!sNc��؁��}¡)ug� �C0y�� ���c�A�:��d#m̆?�����'��k�J�!gF9A������)vJ��wR]�/����2l�d��ڡڻ'�]q�mq����!(}�g�7i�9�3�"�j���z�/@Y����&���@=�
��>6�P�ҁ+�Ў����}�T�u�-��8��CO�y�ގ�b�b�2
�Z�������R�A)�MJ���G%�U���\g�i�z9��2
��c��ZhC�Tx��͛��;��`��]�r�$�嫬����~=$�Ԛ]0'�5���c߻�\��=l�5Xrz���P���#݈֟�(ڻ��bw�8�y �`�1��*<Ib���ͥ6,�>��j_ʫe��l�,�,���ά@�|N�f�_7����2�*'����Vg�ԩ�q�
�R�yu +�v�֘��l�
1�3U0���4�#VN'�9;̧�b�]�'h>c؎�Tg|f� ���KPgk��`x�D�;Xj�o�����N91�6KNܵ�w����r��<��)�&E��..�%�g���A��[<,xh��;����g}.�l�_�Ĝi��U������z�*1C-O���R�Ҡ�\r't-�~–6`C��G��&�Z�%[�O-�������e_բТ�~ӗZ�D-�z��z��T�#�M�Ac!�ȴ�`Or�5�������r	� '�c`$N`#n帀�u���N�V5
(�N�,+�D�kҔ���8�9�Y^�6��E�o�@�a}�n��s���~1	`�pH������s�����\�S�3�zj<��\��6��/A���b�v-\4YxB��Sf�7�1�CZp̊����A�O{��Ynʗ�X.Ճ��y��
 ��W�4%�Tk8�t>�^�?���Y�j�@��w6�V@iVn��6\Z6�S�h���]eW_R����#Pm6��F���/�}Ύ�I
}�@��Ǩ��6]�ھ��i1�5,�q �*�rs�O��� ��DN�H���a//F�bk(���mC�R�ҟ�Z�l��XB�5�c�6kZa4�=]F���-�奜�F��}_?~������is�zg�8���[��0Gn˔��f�%���$��S��ef��W{���[>ƛ��q|l5(�bv2�rH_Eؿ����^��6Y.��5ǻ��L��]�F/@_;3.�n������xku�Vme4rk_5^�е�I�@}�ˌo��?@�`�נ����ꭠ۝�;/��zilr��t��t-Q����@�s���]K�PO�TW(Oש͠��caN�/ḽ��)�F!-�8O���1�	P��
j���\C�#��V�F���-��h��C�ѱ8������èP�k7)V	r�֦�v����儹����!|	Z��G�? �Ψ8��;�7>��
�R$
i�r#�Lm��Ŭc��4���������ًQ8�-�y����6�v�m��δ
�z�{Y$O������B����b�H(;J��PG+�Q���0dC�ZQ���Fk$�^�u��"�<ORN����rd^e�(����f���T�¼2F����PF��cR���4NdӨR�}h������u�����1p�n\u�M��
����.��p��C�X���<���hqw�t�P�$.�	�Y"l�;�=ζZ��p�
�y��Mh�J	�n�]��j�g�K~B���^��#�����ڻ�NN�x'�I�G놨M�R���P��-<Js��m�Y�:ݽ�W�>�� t+<l�'i0>�2p�ɝ(l���/𱩋qR{�I�9�;��ͻM}��	�nx
��9��pީ�i"�	v�n^F����֠ q��"�R[��RR�[��Bz�=~�Pk�C;L��Kv�b)G�V,�I�v�1D�{��lq^�#b��do�*��wi�7�[>�%��k����)�O/�Dz*[PÌw搪����U=�T�Z^�;{P����G�*5�B�f�
��+Iጊg�:�ώ^�V�v-���G�l��cq=u�z��r�?Ml�S�Ŷg�x�
��u�/�,]���4G�Y�}bS{������^�a��k��^.?�W������A�U]�6?���ܱ_���?�Pu��"Բ�k\S��%Pޏ�<o�_ׂ6�%��`-�Ώ�G�6h��yn���
��\���r۵M��p��kF����	�e�w���xm87�2hM ?�/۶�B;��\p	����ɥ������h���n���Pb;�*�3x�цם�u�	�:�&��	�E��mg+��G�B#��5���������r�Aÿ��3͔0�o�{��Y|(�)��Zn��˹^\Lێ�w��i�[i	�
vH'��5���w�rzyo���l�@�i��lZ�3��'�h�<�DLZoW5_�tx��k���'�X���1�,Z�Pu1��T K,�Z�Ճ�WP��F�c-�@2xGu�q3�m�I���4��Ne�u�r�x�'ὼ�{�C�~����y��$�p���yd�RG�<���&H�f��j�bN)����'�6&���߈�������_�$̌��ⴤg�whL���¦�׺{��R���(M���1"U�/�� ��������W��jk�E��M^�V��NvF��=8��{�I�Yc��I�Po�ն��ή#h�)�9$1�O'6}�޵p��D�{�k�jG��3%ӂ[��j/B��X5ý���
_��O�3����2	���t+P��fyg�2���(l�i�I��"�vb�
�y�Z�>4㌐`[V�]�^)_]
oi����)Y47�5�B�"�@��0M��Vs�cih��!�D�z�z������&�{D��(�
�R�"��pngtZܽUh���>��{�p�n�1	S���w�:&>��\6Cs_�����w7DbMgJ$�
�7n�p�q@���HD�D�KZ�B��lM�-���bB�E� 3N���|�4�����Ÿ��rqCI�Pƥ�1�ʇa��l9je�(���|����|k�Jg���Y���:�FP��K&�&yn�&U���%����Pٖ#/��Z�Z����yT����>��ک��G)p�@!^�P��]F�Gy�Vе�v6"�>�u-��o�V�����-v\B�q2M���2����>��H���xiv0��9W\*{�}t�9f�RH��		&u��Ovt��g��;i7���96�*CVXu�:NC5�����b�fr�z�Ј�B�-ef��a������}g�C��ni�(,��C���J�R�&k.!�D!0��
w	��P]EjW�����)�Gr��$��7�4jX���%(m�I��T��[�8
�T츺3�4*Re���F��X�����պ6Uj�9X�(e����l�P�gS_:�=����\wV�[��(\�|��[����{#6���%_�p��td�f���y�ٕ�)���/d����4���	��
��_��8~��3RՊ��z<?�
�d��/�����`�UD��*��^*���n�JI�q�t���e�q�r����c��]L�`�K��ܭ�[:�*�ݲnp+��G����Ѥq�1�z��<-��8/�>gt�Z��
���}k�-�/�@�&Ur~Ϡ�ɏ�;��@u��Q/=[�,��'�l����q,&�gm���u������~� ��.�^,٤�0��
sv-�Iv�ߩ�11�І&�8�9Ξu��9���ʭ.�}���<����(ϙ$U�U�̉ߩ�
�@���F��dS��@������f`����9�;��(�fg�lIs�����K+��U��E�F��k<j�m�x��lN��_@
LJ�M�1�dr���\���~�C��"�/��L|�n�8|7/f��s���R���^����D�a˗�6&�%4aGSd�VE�n
��j+IՈ=ݥ�a���9b��g��>��{lԒ����h���A�/Mm�S�����&��/�%Ou����9���3�g A|�M���v���߃�ԏ
a/V�t��	�4��ǝ���u�D|��=��Ζuc��y�i� <lGU�R�f���N��bt�9�	dY�d����֢A;�W7���j5sTfr��!ܩ���E�fP�@�3+E@P�N���{�j�����;/{*Yc
�}�N�S,á9[�횆$�Pؾ!�t�����<�����"]���`) ���a:���?ڪ�������T��!�F�`��Azt.N}��*<�;$�J�`��v�o��'}�I�1�$Z����_������.�)N*�C[��Jm�8�Dzgb�'�3�Q����6�D+褢��Ň���p+��:?*Ռ������0q�즏xc�k���$?�_�;t΂�]b�B� �>���$���`���*�V���A�`��tc>�}��I��3IC��C���=��q]��&q$�<N
���31p�8�Ǧ�G?	5�Էp�y��Ǟ����Ef]	�h
�����h�B��:��!=�e����'�e[2tE7�S�R+>
��xC_�6���س�!�j��T�.�P3��P
��$6{Yk�A>5CW�l^�;C����驂̏6�W�	�E��^��=@*t��7�i�BZ4e��.��pd
�8�؜�l�t\�)��9"
���	v�n���p� 
���i88oz~.<7�<�-}~p(-.l̓�|@�{���NJ�0x9���eޑ$o��8�˥,q��`gK(�o��˦���c�k��Th�?C;x.��CA��{(���XU��0��1!hbwc3ArdxX-&=��p�j�x���v���ʆ}b��b鬔�a��D���g��s*�Q��x��=w#ݢ�Lu�pГ8�oGxn*��30����hQv*ہ�7�WCvqE�=e����^�w�uv^K��f{n^޲lt�(1�,�&���3p��w�����]V�[w�Ex(�ߕ�ﴎҒ�P\�x?��[KZ�8��5���ΘO'�i�F_ty~+=�I-o�*�L@�p~�JG��xb	�9�+`� LqZ��_{~>�9�s��J���w*��r<e���|Bȉ{�JԊ�ʉ��(vΒF󿠅�{a�~���,�i������~�f}��ql���yD����c�_���cBh�	�(�W��q�d���P�16T��L\ �<�z�e����*��7�����IQL ���(܇~LZfW�%����]�����@�س��,���1�+��4�-��h���'�)���ev�x�̲Ew�*�+�t!<��\#�=��E��,9���^��vwb����:y���d�D#ϰ��p+.���6��87mK���3�z�	����A~��/���D���Ng�04!�+ܜ�=X"I�,i����V��F�P�9��V|~����?�񳙋O
f�����c��l�l��C�†�S��:R|\��6��7�W�#`5t`�8ِ:��֎�l�J�
�6X�9�^�0N)��VLm()���N����\�[��״;iGT���	w##�=�y�JܕB��E$�4?RzEN�����=�?��5)��I��f����3���=].��m;Iɥ��	�@���6��E;��_;��R2�Y��C�t�4i��D���=�)@4��s�@	J5L#�]O�ڪT��D�z�|�=5
E�na�p"��o�@;�q�i}�)�&���k�G�*_�>;���$���L��ⴅhlfW��k��F�2ʆ��9"�@��\ҢLk$��I6C�`�h���L���$v������3�ŭ�fsXՅveu�=��^���ލ�^��~�I	�F�w"��X�����w�R����R��b�!��h�K]�;f#N�����8c�E���@���jy�a�Þ;
^jSKy��)|w�].k�>��r{d9S���J�L)?ڈXY��R]�%'�pX���&@��Q?dXj
7npm^��j�Y���i�X����x�
>���YU�So]7��@�������K��%s���xg�*J�&��A�ߡ�b�|��a)������:Q�W[��d�<�#�Z}�k���t�D-㡁� �+�7�^���o���)6��H�v��uIA��;<˖N,H�qTYX��R&\Q���z�c���&���N�1K��'Z�_7#2k]����աPc�q+'��xv�w�_V�K|Ϫ�֋��@�(��vϷ���@8���� G+{�#
�'����ik��;��_%h�b>����倆W���=��=:���G��r�߫~��']M{o%� ����&��Z��)|=�5�S<����;���e��r�������4� ���3��\Je��/��6F�*���F��֘�� �S`?�w���ht���m��z����K��{' )��6^�r4��HiNЬ��J�
�4O)�Ƴ�[�M�2O��S��
Km�a�C�Z�:{ry��ׯ�>E!^q���/ฆ��74{�8y
'��\EUjsj��K����_��E�Hdw���v��|��	���k']��z������mY1�1\�w"i�7c�z�9;_�1S
|Ϛ+h[t��� ��g;N*;�=Gףx���k��-!�k���+-�C�){�&l�#��k�Ċ����I8\?���Z�&)��`FS�z�~��|ȥ�3��+���A�D������ajm�����>��T�P�7dfo�/N.���b­x�2��|�Գ5�'�l����ա�xB��m����4i��b�;B�ܫº�5A	�c�N��@����La���B��^�X	��-�b7&O���@<�bi���*������X,��D@,���<PZ��|�Q�Dk�y��Q�F2.�S��v��f�c?L=��TBR�&ib���<Kʓ��F��T�U�%��af�0/ �&2`\�J�L
����Lh��A���B(^@
 /��Efk��G�Ʋo��)à�*�7�j.�qwU�x�b���v`�
���B�c�rS~�"�9[o�K���";�א6����s8��Ӑ�B]��5v^��)��b�V�������2�t�F�ܣIix�e3�AA��,Ru[��4���2�D��sD���>-<i��lK�>�O���5.�yi*-ը��4�7����#��|�D!]�L�.��H�W�H�����4Y������P�ܺ5�ڃ��X�G�[swl8m�/Q���u��{or�HP���g�(�M��ۨ��j�n��fj�@C���YA�p�TE�^���<��g��3G�<��x�r��y�~z��`�W�N Hb��]4�P;q����)���n&��S�c�?�o:9�[��6<έ��1.WoNU��MK�B辴d�|�V����q�����uT�Nk��\z�8�SBw�=!�����*��q�Y#B��J�;�ZVLϛ�u��@���妛ս��\�{���q8���d���-���ČP�l�㇂��S�yQ�~����8���Ts�
�i_���z��yx`�vB=�M���k���8��R��ҫ�.0`+*R��k!�S�����;�@��XzJ�N�ϔ8��d�V=�K\ڎ��xʤ%�_��p�GB�2X���8�@��e�NOrj�-�.��`(G�0қ��<� ]M.1]x}Qo�*�_�l|�-��ty�hl���QA�];��M>�u���u�H_���If�fP��6���$�����A<�F��H�����ۃG(]�)(ܸ9!��Uj��wx�^�_��Hٹ��C�,_*ޔn� �f/���Qas�Q=��$�[b50Y��\?�H�S����R��+����;������ϼ�F�Ér�9|Z�{!}Gg� ��Tߍ���%������ٻMp/���6�9���%r���U����+��w�mRA|�>#�)�v�!]H��am����G=�j�JjX�8$!���9I��+*��G�4E�R�c�E:n5z;�r5�O�C$ؤo�$�ç7ݫҔ1H'%0Jj��6vv���N=��@�3"-U��c���q�CP>�yO|����᫷H�nL��2vu�p��h�8�hЗH���I&B�&���(U���(�B�5������ܠ�x�*Dsfk�[�YґRt�>
C���4��z����OFU�Ѩ'��Ѩ����ŅK]�~��Y�����e�{�]�k&�G�!�X�;�v�Yy�)u������\�۶V`?�������
�*��|�K2����׾~�/�<q��L��s��P���8I{<bz�*�v(,�ń	`g\�3���I2���d�%��D��1zC.D�+z��Ϫ�k�(a���!fa�ڤl��%����'�Ц�&�K/�t�+�O>\��
�y3n�1m��n��#[���a��xH[*uWW%M�qi���u.�İΪ�M�S�8]�RӶ�(���R۹-��˨Z`B~�Q,���2*:��>��u���&�'�L~�����m��5��S�]�0�d��<P6�z�� �.U�
��!�
��g?d�_ލ���e�@�!���v7��d�뗤��o۞�h�ú��b.&�c ں=	��cz����C'#�7���|۱��Y݁�H(?[ND�ʗ{F�Ϭ_�=�Y�ϒ/�^o��Ȳ��������;߭mN���1��-���E�_ѯ������h
L��Ws�(u}���_�c����h0����W�o�>�Hg���S�p�8Ƨ徦���Ї\"f����ą?RT��lz@m�=�Jg��OF
8sa�B����o�?��>iBK>���r��9����8=�+�]��i��i��W��:.k��Q̛��$�S'��:Dj��C���8�0
B���F�+��1�k��0Gc�"h����>+7�`���4v� �=hO�ţ�儐w
�x�&�I4B#�<�}Oފ�G�[�����L؂c���o��}���۲CDŽP3�+�Ja����
B�,�((?h�u�H��#�v�}/�Vj�Av��o�q Y�����_��L���u��u�Z?��N@�i�v����ڭ��6��@�Z�d�=��?]Y`�,�G�Y�����Hn���oH���CT�^F_�%��V��i]�߄�8��EL8؇��y�b钺�ʆἼ��x��EY�2KU�����w�l�g!|�~�2%�w4�@�	�
����s�Zޮ���8��3w����9{��y���cW�àg_GGpt�B��x�$`H�=^��%�v�2���&!��Jg�u��(��J�q�ao���kU������>�*]cŸ�����$�q�Fȳ��!���kN<�]s�n�傻�Q�K���k�%�5��=�]qF_J�	겶-��uk���?����f�֩_�o�j4jS�A�9U�aT����>L�h3�"�������rB��z�\^v�w`������s���A#�L�U_ix�
��tK&��Fóͧ�FJ��Z�vJ���"-|90���/��/�jO��GK���D�XB!M�x/j���]+�%@���!JH�?9��@O>`ՐX��U�j%�/J�I��-��>NQ�9`-�uV
����-�Q�6�þ�t�>��x��B��� �����1Sz�Q�F=�B��R����q({��@݂�����W��aG(���QD��ًGɱQ݂
-��d[�#��F�݇�X=�ٔ"�f������P�p�J*��������1Yn!����l|�����}�f��"g�8կ�aA:M�%�����<�'�����Zr�j��3�.�;��#%���	�t
hn�`�L��f�1�,���6��a��f��ܼ��*4]ܜ44��!E��G���p#?]�6{M!��
��.��<ίv�>�����Ȅ&�;ޓ��N�Y�E{~��=�6\.�"�=�K��
l���jZ`�E��?�x%����=�|Z0wh��M9ʦ5�[pImA��Жo)
����{��(O��PFژd��bĊ��x��y$<k�V�W��I��E�y
��b���
���rAWF0�E�A��	v�� r-
�1l[={����>R��d}0�F��D�E�=��YjՔ�km�TG����f�)�񁝍K'>��둌�3|��S��0�h\{��L-���=����ߪ�����2�ͥ�-���o���2��k���%�M�0�\����6���?@�t��g��4���.ơ�4��7������������s4C6�N$�v����xىO4
ٙ�￲����ƾ�?k��̆��Cج+��UGAZ3<Z��"��F��Z�w*��^���P���K�Sg�؅�@)����p�\��С��t����В�;V�8��c�>�p@�2F�jB푆!�sTI��`"�c��g�8�N�0Feun3*�M��T�t(�1��%ȏ�_W�lڇډ]�Q�0��?�S�\4��?$^��<��j^�8:��9��u�I�a�t	Bߡ9����c���|N]��8�|K��){�F�4z��F�}��F�dAy�M@�j�1:���e�t����ZM����;���r��2�>��^E@ъ.fs*�hډ�BUR�L�J24,7��Eg�����!�N���E-EU��FA���Hb��ڡ��`�E���Ǟ�Pr�scK���翮��'x}��{��(�&�p��`؛���f�S�՞Km<�ю���٣nZ��^PL�`7.5��<�qO�<O3����vB
ڴ�o�W��BM8��
j�1�o�:�j��%����*ql�X�Q�-ȑCO.�R��nF���ϳK��8N(Nۊ
8Q���mn�Oя^���^���T<�Aˠ	�)�'§ŀ6���B}����:|a�ggO�ml�%M+��
/�1�IJ������(�+�Hi��61�T�P�m�U�<��}64h�;���S�gU� ���5�i���h�����N�<��ݟ:;']�B�F��-=dv5�.���ѣ,�0��κ��:;C*��c�&Sq�"�1E�W\���JyXLwZg3��~���諣Q-睶7�\�I����ڿa'��7�����(Q(r��ӳu��t�r�
e:{��j�6��|WMB(COȪ�׬��"!�7��zi	�&��z5`��O�İf���WB�Q
t�|�ykv�9k����3�ə8�>�v��'ڒ.����x}#ǹ�Vs�M�1�D�n�`jk�;A�{�GA�G^{z�qFK:x
c�|~���8u&����&C���i���M\`
d�uW�x�����E�Z�BҢ��R�78�ѸͶh�4�?�[$�<DS˼�0��gke��d�O�=��8Ս��Ɉ��]+uҋ���:�'&�F��lr�Uŧ��~�{�����f�KʑS ������#S.�K|��F�=�ة���S^�8�l�}�x�<��t��}g6�ZvY{�ܘ&��h5-.��T�,�0��lv]/��e7����t�+��ih&O�S�o{�5��
�l:�ÜMB��aX&+p�%z!1��7��?�!�o�^7�):n2vD�~D���#�ٴ�F�N�=������=N�\�3�r7p�U���r�W{��^�Ɵ��Uzr�Z|-�����n<e���6W˻�xi�'���\��E��O�2+骻w���%o,!��:c��E���ٳ�I�i�� ���&M�e��/���m.�6�OKi�����
]T�Ƌ�5�Vн�SusLFNQ�Q Q����
����$N���3��ٴr�E�@g&�s-��"�V��:ţ�]�d�wt���D�R:�׊����MVO�_��Щ'Zp����=	RHR�"�b¡�o�^�����T���^춉�&��/aK��	�^5�h�w12�&�V�bw}jF��{�0h�R�Ե;K�4hݝj7��,�Gt'�r
~�p{�ࢤ��q����Ƀ�xZ�d�Ӛ���_����5��̩�Z�������8]�,�^�?�X-��BP�7M�{|lb#�6-�N���/�� �_Aר�!��UCF��
áJ�����Kx��"~��m�H�=x"��rA�9>��u��߃E�mc��[��CZ�Oi�dy�,M�V�n2:[��9���s�*�#���eP�:Nު,�M�R-�u5��
��yi��}C3�>�]\�K9��q��I�q�n��p[�4r�2��.wMv�pR1xt�hQ�gX����
|@O.�but��
�$Ͻ�Z!9�F��
<�F�V$�䥆�
&���������K�Uͫ�G���4�H�#�MV������a���w
�?�|C_�t��g�}��!)Y<���?��ѣ�z�-.>���}t�k`�,€w���㶘�džc�	����D��BCDfQ��'�V�%�P0��'���H��A��[��d+8�w�TH��]G���7hP�?�	[|�2/����0?��a����:m��wDo�<�֧��yL�ȁ�7�M��?�c���O�j�vXw�3�)����R.s�����ߢ�/���3�ޢ���N����H��>Щt�3��+�F��9�
�4���y�?��s2U����g��`�ѵ��~���_�3���9��3��}5�9��
VOʜ��|F	��y�<��1�n��z߃<y�q����6�s���g�a]�_t��/zi��(P*ܸi(Ndc8Z%�VxR����\��i[7t0!q�Mf��V{�2y���,���/l��$X���T�`�`#5#�����]���c?{�2l苺�	h�Pj�y��ֺ�y�K�b'�͎���8��$�T�����.��>%�5 C��V3<�����t��㜮hc��$��faԧ��ѵ��<��Ԇ��_��2�΋���lui^ab������4�O�l���r�5JE^L-�ɗ0r�%���$�OT�k��Fqv
�c�s�f�wy�=�����'C����||$�?F���v�HW\��L�SCK��DJ��)��}7���jZ�25ɶ[B_pH^!��͠�Q(�܊��:�`z{����T<�������>��4s>��W	�H	!t��5�'p�������^=`�<E>�+��O,����pdO�;Ъ�QQmi��Z���'��Wvm�&�N�r����1�B���*�3�W��9�]���F�����Z�Bn���$@�o��>�,?1��{�sl�;)vV�K�8/����;I����zG(��L\��AE�i���[l[Rd�[�aEz摩��@�ؼ~�R��|_?D	��bŀ6q���E�����>�pcY�Z!�.���#�'pHȟ�)��j�
���z�4�5�M%���#�����#�1���l��(n����m0u�L����vr�aO�#o�a+.�%	���
���(��̞�
�w��[�Ԩ��m���/e���ְZ+���q[��Bd���
i^���)zTaے���&�[����s �Y��)M&�):�@s��f��d�H9[��ڬt-�;�-,����DŽ���[n��
�2L坑���.�^a�(�,�p2|L̬wfJi��5n���Q+;0�KT������&��q䴲�4w�����m[-��cߣ����ٺ6/2߄Qf0t|j�d�%��!�m�v;F���:��O@�AW�tk��S_�e��-Yjƶrm��dge�J��9�'M��_��N�V�_� �O�⩪\5Co�i��m3A��h��;)�Op����m��б
�b[H�q	���9a�<
�;M�7�U�}:��m#�}o
�|
���ķ��0�`��󝭒��w�B���I�l���40�6�6B�ޙ=yZ|ɷ)
��û۞
���`o�gyA*��x����jRG��C�5J��An��Q������;�F5�}��Vɰ��]�8�
;�,��HY2�(�<1�F��LAN2@c��l��KY�e(�xm4C���t�M}`�O���rq��EK	�`&�B&B�k�m7\b�_�G\���dy�K���u�L�7��5�9%�����a��Ѽ0}Jf|rN�&��@����!:���� ��1-f[�ґ����!5*��A��H�=��*�/�V�l����z�ł��$�w�����}�1�؝E��l�;׿Q\��:P\���No2�~�c=��w����n��F̦�6�T���2��U���eO_JƲ��b�˞��*��[q��=�ȁ�]�(�δ�BQf����e$G�[;�G�}��ؒ
��?��1<�U�]�͞FLF���G����w�Ї+|R|�Ѹmaj�F6\F�6[.I�q��ź����������?��dm��m͐[Lr�$u��M�	ov��)bi����/�L�s����p�!ٺ�\>�C��G̒�փ5`3����_���ME�m�r�����:��<Mʖo��[{nav������w`5�*I]��\���0}6}�#�	��!�0�~��tm�+��q��FW�Ǻ���x�^,d�ͩ�X�5�s�8J?!d�A�<�t(�T�c����c[�Ɉ�Վ��4
ɸ�K��&�c�ρ��XO�1��#�Q?Jg��	��i�#�`�"F�u�/�:)�����.e'F,ދ���������gu�ȗ���R~VJx;�p6���������
h��(Lt�K��K��Kދ������𑫼���/�7�]	���Գ5��Գ)�s��g���S��1��/'��(�!��`]�}Bdu?�n
���\��]����Dѧ[��_�,6�@;e0Zf��%�D��BȮBHX��#�����qa���b^��B��l9X� �s�4r����U�]�_���cϥ��c��6�ܛ�	���з*j6�֧������C��zV�Kb�*��Bh�B7�]���nBS�BM�����P�F�8�<¾#�=�̱ma�
q��q!~ce�X�z��j��
��1l����X�ȧfE���xq	�b��ap�2!�h�G�[�[����u���ȭ
���U��D��r?K���T�U0����s�hǶ�s��B}I�*�Ѡ���)�Q�B��IW�I��B�76	!l�?�.J��+
�ЯC?"l�FH$�C�����'��آ��#�-���ぶ�zF�n���QXdw�Q��SQ-�<�?S1�)�,z�Ǧ[S.Q�T���@˵.Q%�J7�l�DY��K�~257�K�r���\�ht��+O�Q���AǨ{�0~��tS��_M�5�o�ii {G!G�Q$�i����8�v��>R���j�#E?(20W�~o������H�"������X<(
����t��D��/�gt��{�r�*Q	Aҭj�g ݉�A��t���by�sU2� �+�sU��j$�a�iT�����`���U��A�U���� Ǫ�CXϔ_U�K~Uԟ�_��k�.gF�+����ȯ�a0LB+�U%��t�*��u滋���˚�i�hk�w��'4Jc���r9W!��\�>�y$9Wٻ�F�Bߪd�15��j0{$]���ת�|a�Vє�.蓌Fj�_6[��j����Y#�W�����ȩ*9�ʬ��Mr�z���H�k$T�6��\�[�@:yK�.���O�]�/�����r���ٕJ��8�cH}�!
gC?�>��������N�0n�
�a�[�ރt܋f�BB\hhp�F�4YM���`���Ύ����i�1�F�U����$`*�,MJ��L:w�����
�a9��:j�T�ng�_����!���?�n��W'ŏ��/��O0�~2����f&��.�TL��m�SWה�P5�N�,��**��ǯ�I��c�0�۩m]I[zU��3�F����ն����|%�Y���Y�
�f�m�����jd;��˶�ڋ_�8�:u.a�ɓ�ou.���]����'�/��6���܋VL�ک�����)fg��2�����!��y=Z����k���hۢދ{Xv�+�2��r��"ο��O��]�}e�]kE�4/h�>s�];����c׾��E]���d�v�
�Z�~��C�����/���.�
d�����1�P�kp�� �gw6Iir�V��+���� i��KO؏��G��`7oc�B�ڳo��M����މ�2��s/�0��j�-y�D��|'z�)�_��|��?�?������c��d��x e�mم\ۘ�{����k&ơs���
�G)䜨�=+䅨�p;�ɰ�yJ��b_TX.)����r�7�Y2��a_��!)�L%\�j"���� �ĬU��5��(���w�t#��_c�:�@
1�N�0�L+C3mVa�XP�$�м�)�����xi@(��
�)�A��0E�k�P��Qk�s�ȋTPjF� ��;ɤj�1�V&}*	�$�Ƀ�vx��0���@��z���e����@�(�-��a�K��0b?�?��x��C $n�F�țͳ��c�=d���3�����ۓa/J�a/J�a/f%�^&�^LJ��Ma/��U%g�;�a/N��l���ud�[�FR�_O�ZfC�a܋&�.��f	�	�^���Z%"���^�{>&(O|�ǫ_�)w���䙎R;�u�͢�����^�W_]B���?	|�	OK�Ƞ�(>���_
|q�|q&i�}��/��ہ�fB�#_4%#_ C�|qb�T��e��o�,��D����/#_�+�E�?��'z�2����"_������+z䋇��+�:�(�X�7D��*��N��
�
d�]�’
{ai!�F����g��H7�E��?���7�;�#���? �m��M�ؠ���"�k�S>BZD
��u���bXc�d���P���PG�0�Aa.�����0NZc�0��U��(�c�B0�n�b�>^���}؜N�8f ]�0����~�4��!/c��K�
��W��@�a."8
�h����T�{����.�>h�- �lXe��o@ڤeFPF�;�/���,�D7�&����H�+�EU��W���K��ˡ/�<>�v
}�ni���Ց/p@��D�8ӓ�|�u2�E�d�����8l���*��IF������߹��ޫ#_`)�#_L��'2�����Ց/>��/�zz�F�����z�(�>� �r�jЗH�:d�!�Fd���8�QZ�Jj�J��G��u�f`��G/�����@#C�.~��{U���+h�EsO�.�i������\ܷ�o=�����[�_��of8c�&:��Ic؛�L�����O9�����!��0	�l��8?^��B�0���:]�c1�Т����/<%�μ�W3[�f��"�]�������73��of��o�O��
��o���G;`���R�MH�/�G�ק?2@K�.7������G@�0�:0h�/�ZeI�<D���Ƅbɾ.���m?���j������� �~W�����{���O$�#3���ǽj:z{�����1�x�ڇx�>*��=l�I���4)�	j�MBoZ�>��R]7ېKA��Qi���{t,���W�Ҥ^��V@��TF��@�n�l;9��%�i���0���ɟw���.�OޣC5�x����
�_���c&ȇ1�+"L⤠��~�U���~.�w1�f�Y��74B��A������r-i�)���UQ�~�u}��1�&}Sv=C�8>-׆K�c���\�)����y)a�;��͑f�~�O$�gA^�T���z}~��]�O�N�8a7/�����A�LC�����+�tyYj�*�0�b�N�7�-R���)�O��h1���e�L�[F	�z�$��6��e��ˈϝ������ߪ����һa�M�b;��F[� �au��~��DOMk��9����'I�\��t9M�ᏻ8]���`�=�` yժ{�����,_�ԅ�`A���nyU1������W�S7�*y�����޻DUm�{�FEgLL4�QQQ|`�r�E@�(��4�A�`�8bz��޷L�Y�{�=��R�_��af��uh��I���Z��3Ⱥ����=�fﳟk�ڏ���]���pc�kM�F�}-��o�ޱ���?.�㥋���e�;n�s����[r\c�(�����wz��e��#�-|��w�`BҲ���\ǚ4�78_.�'^�$iA��/���c��,�NaBC�/�8'�}�Z�٣�]�:±
�PB�+8���E��`P$�8����MuF��4��*�����%�(A���o��1C��Ce��[7Ig�f:Mڄ��$���Gg�O5n����.�&gT��@��;؆w����y�<w~�Qo�s�u^�S�>��ּ]i��{�G{Qo\�����΋}JѐdW�w��앢:γ�F����j*%�0dj�kN.�t�*���+�um���q\�Q@PK�_D�B�舢{�s��a��p �6ӧ,ZQ2ئrֺ��B\ �N�@'pG,��c�T ��*�5�%2Հ�}a]�i%_pᚽ�f<�%�}��'G�[(uu�� J��D��$e�伫<�F���`w��ðv�
ٵuxyX�dA��(��M��x���q߾��f�*�1a%�4�~\I�)�&gbn�JH([]�w�K	�x&r���������Ɗ�<�T}�u���p�݃��ƍ�+���0��7�b��5
v�Bp�K)�ɖ�.�����s�5��h
Ek��6�ޓ�+�N4�	IIc�ЭUq!f~�av'F��LJ�^��� �jء6�ڇ�kFD���E�K��Ҥw����=l��d%���b:%^h�k�vK#cڄ�}ӿ5��"�꫹�%�\���[�F�%	ː��G�lM��F�[���
������ٍ���
u����Z}��{�H٥-�f�qVu�9�����n��q��S��E����x`�z��(�Y�Xp�tA�cAc��p��8�ű��*#��d�1�迀�Ϛ�/��5%�yg�%F�����	�=˩�L��i���++�r�ZP�E�p1�����������Z��ဪ���W�p��H���t��R:�F�,��
n�H�Z;o�mM�c����j#�A\���tl����͔�Гj߅�ɐ��q�t2Sk��(��q�C��	�y!7;�@2���FAS�l���2XXSÉ'N�D �~n��Y�p�f��m�+�� *S��
6�3j�����PR����>ZLÉ!&��+�Ż"`�x�Z*�R�5��-v�e�+L�������:���vuۮ弅-��~�:p7�?�"�Rḛ�"�f�p4�*X��f� g��W
lsm����Ɨ�@���
����Cjy �p����@�27t��G�,:Ă��F���ї�fij؋x�G�0�v^��BD�K�mQ�����8/�To�;��H7j�w�(��4Q��IUc�9�G/�q� 澤���]�}PQş]��_�+*5�,�܌)5Q[a}E��x;p�����vQ<��a�ˇNkCp�Ù��G�]�P���4�Mϧ�5�4��n_}�������Y��I�pH�����O�MYXp�Qo�����nv��j�M�4�Rm��bҺ�]�Z`�!�
.*��#H0��}��CxS6�T��U�f����w��]��å�_"6^M�kLo!�ap���)y^�9�Ð�plׂ�p&%�WhJV�LJ�5�䰕O��b�
퍞��y�$���Lc4�w�>M�4\'3^����<�EQ1�-,t��If;Ƌ�I��
�z�,3^�r�yT,5Mq�o�e_hJp�b��W��#�9H5;""��o�y$�}!RiM�C�B�R�b<g(`0Fp�r*�1f�7�v/�����c��ۀ��q�kR��p$�vWr��Y�����^�K���z�1�R�sVV�ˢ���C�
�x*�Q��l�U�%�
��[n�,�R��S�cj.�P��(n��V�h�/x}]�P�ꛤTmĤ�]���5UEj]+I��I���f+ɒ,%�`��(ap3;퍢
$�{���s�ݶ�H��|�:�6��Y&:�ʨ`ġ����ğ)e
���qp�oF~�>�x�C��7�tն^|泒��[��ë�,w.tu���B\�=}W��;�X�$?��<���7������>r�ܬ���(�g�$�?t�E. t�y�d�W���P<�����T�o}�Q�Q8�C�4�@\���5��͵{��æFu��=\߂�fW�
ٖhI��x=���SV�
a��]	>)��yb�s�
��9nL��fW�oB�f�^�'�ˢ�~��˹��㣿n�✣V~��a�:�^���ʳQ\��ٌ�挍Pu�]/��(��~Y�r�Kc�f�m.����Ɍ�
ո��F���3�Q��>�
~`t
�/ٝ0¥)쾰�k�δrF9^&Gem# ��m�(�3�����{	Y %���{��&1M���6v��i��4���}QJ}����%�_�h���no{
�P6*�B�[P(7���(�y�9�Q���8}�t���5(�	�C���7�|,-)���B�EjŋP��Ӝ�}�*�`�:g�8g���T�<i�	3�Ԏ��r7��ļ�S;"U�e>�3�s�.�;o����n4��G��vi 3�.2����ū픺��*64{����һ����6�dM�D���U
m��}L�H<�78�?Z�L��"��>���r��߿0�CS���,�|�x:�$K��MB�Rh�_`	͖%#K(�MB�nI�ޠ*�0�T�����nj���z3�Q��4tu� :]���׺��R���x԰ax]���![�4Lӯ�}�x:ԑKg�V5����K�������@A�発j�Z��V\gg�)�E�U��^��(�a�e��oa�%L�(��z���W�D��k/���:����NlW��<e[�e�S�.mn^�<n�����0�V(�r�3�	b�S|�����Z[)��,�b.��e�n�M��I���녋e`�;t��ӆ܍�o�0n���p��8_W٫��*{�_��B /��= �\9.*�:��y��̣G��}5.ϗ�8�~]�fh�I��.�d��ς
���Յ橄#a%��I�gQ����
��E��i�ә�c��5�c'��	�ܚ\��3	�r*ǽN�t��un����]Q�R�2�'�2xK�c��j�����z
S�Ӂ��4�TCq6�j�`�;E5S���[��I(.����R�V(��
W��QB�Y�lH��*4�'\�>\���9Qs�ߟ8���ᚳB�B�
�*OX{�!�
�U���]���]��}���l>
gN���!�)����Zr��q&�	WğZ3��C�!~�ڠ?l�����1�����&��m��B�Ӡr��Ƴ��		��C- ;�>D�
��/(徭y.���5��V��Z'�EMQ��$yE/~dT��x��ɑ#�{����	���RM��ث\�0��$�.tA�Z2���������غ&4�OBV㟲��^=6//����Q�����Ƕ���GdG���7�L�!?��W����+̛�7��jo��^�v�3�m��S�������hpBB��M����6SИ�����E*� ���ج���cc�as�,��65��[.�1����Ю\T��S�m���Kl��{�=s��OBFa\�_��[�@�\�˸@�����p�pM�ZZ�����~̾[��n)��%_p���H���`� %��Y1�D�
	l_�Π6&���K�u�]X�n����`a���jSL.&0��WLI��%J\�W���Qͼ��g��3�������1ӏ�͉�1��㫙�Ϫ��9��'3����9�����'��?��0��刡����S�13��ff<��L3?�����̜��3s>��E|3�����G13��gfߟ���̕�3�U"
o�_EL��/)��YQI6�Yף�f��3�!fŽ��>f}
�o1�sh}�Y_D�_�u+Zg��h-eV�xx5����ʬ�Y�K�e:?�YQi$?3[D��H�F>�Yq6Ώfֳh̬(e�>̊�xf��`�ˌ�eheJ�]�Z��g�:F?�62���ij�Ǭ�>ƿŬ��ο¬�$���2e��odZ��0�/ZdV?��2+��ӘU�ֹ�������Hf��f
B�hf��̊~�}�5�>�j@��Y��Z������D����K�aF�If���jf����u>Z_g�Eh�+K�oa+UP�\��ޓ���6�,��V��]\`ln]R� �g��bb.�������:#M1*cwF��=��x����z��E)���=�E�����O�i]�\��=g�.	.:���e����/��"���=�D�'�0�''��.��J�%_p��{>$��
.1z�"�es)��O(���w�g���w��,������+4S���B���a�΋yU)4[T��?8+�褭��DuR2~�t���]'�p|ic+��E��R���kשK}���
�k�g�4�u-�����[��V��
��<��1YaH
����
�z�P�k'Gx��c�ɩJ�F���m'�0���xW���rEe�~6�[��B2���l�~\�綦;q�<��k��!������U*+�d�ø׹Z�p�PV��F��/B�k������Nv�JN�����7/L�y�d�"�����[Q�a�Zi����������;��]�ר�>��J��_rq���΃�F0�Ь7X���X�U�.ZQ:M�.��-��a�RګY�G܉C��òP
{����C��j�*�V�o�<�j0�x
`+�sO�(F�6\tD=vLL��`^��Z0���F0��l*S�u��U6J�A�h�@�?h���܈�����D�8��eܸ���B��:�o���7�mk�|���|>���.�W���B�b���fu��7�}+��u��!'J�)�?�һ�J�
Y҈����~���Je!7��A��:�Ai��(k�O���ց`�0,y��M(�`����/��`j��)�0a�A
�L���u#��C�[���weu��eu��[׃ܭUݵV�u���I����ղh*H�,u�\��L@^�dX	c�;���.��d�l�G#�w2A�����z�%HAZ�����-!��?�[�*���w� I�f�q^]V�iZ�^^v�GiR/�W�{���5�	azIM+j_>�������fG����vVfy���A�H~�f�F�'N��ދ(n�W"]1�y�_��W婝^���J;����^ܠ��x�{���<�b�ދ8m�ם{�����I݌?�Ƌ¤�!�0�.��>���&`�m�YJ��eJC��cڱ5��^	�
5�(�<�7T���39L;�-w۽�i���ii8�D�Q��(N�鬳{X��5�tvu_��,�3y�#���Ϻ��;d,[�4�i	4�\W_(L����Qs3�#P-D%�k�VO�Q���i<\�O*�<#Ĵ��-�-�l����Q����a7��VM�0nRr6�(���7�������r���O�Ǽ�t��pV*+��V�7(�&����,R��2׮�+7��z��ƿ#r-��F8S0����^�J��ma���
qSC�*K��ʔ0�&��%�6�,�9+���m��ɨE>=�0��d[>����[!)Vl�������İ�������ڍ�����F��B]�t����P�s�mu�[]�&i�A/�3������W��6�f�L?�x
=�`"�3|/f����}��e��A�YH��cC���*[_�M�a�)f�r�:Qyy	�F��7�m��[f:;3�ff)���WolTغ�5i	�W�f�Eo�fa9�w/c��sD��Ư��I'0z�M˦���z�ck��h��LYP��V�؛?T$
�t��&����|����O��	�c��:����ǡ�
C$��ú��!���_Y�2�{U1���ȓ6mh"�ɾ��G��nd_�F�_
����2�<\;���~0��* �CDf8 ����f��W�C��y���\���-��PM�*���	i�&�,s�#*�yN
���(tSR�����W�m����~]i��\;�3݅>��-\d��3ݷ�ۺ�׵���,��Ywg�",`��eJv����5�H�
]��X�7r�$�k��;w���|��$�~~�[Ӣ1k��f
nʒ��>����k�p+�?��j�!�V�D�?\�r�6_�Y��+B�O�6)�y5t���T�9�ݬ���j*la��՟��^K�"ʯ�/�f�?x�W����~P\�[_�.���b�Kx�!���o�j-[���nD�
�{�A��|�jw��g
��^�nAgsBY�|�������{<~��?�YZ6~��{p�E���t
'p3����©�Z��W�5 �����
x�F�/��į�$�rQ�4j�P�Gy��4���O�$;�`h�oY�j��0;�t���*��;����EZ��	a�i��L=���HXd�eKFa���G�x��%TÀ���5%KAF������]�J�_�o��j���^g_�XWj�ɾ(����:��>��
3��l���<�4ia�?�yd�OQVu	�W�	<�X�u�*B")C�uW�"Ad��� ^D�ey���@8��a��f��c��n�pT�H���$��Y�D9	��aK�+�c��e�-�
G	�N�N��Y_����G������jZ�2�uo���,"�Th���L���kp�N��S�y�iv�7CIW��:���c'��(Üŀ�(s�>N����$�a�z�xr#���1;�?_�*p�G���x(�O���u5�X�KS:[3����	���|Y3Ys3���<CeBҸ6'pZ�	x�&r���@�e%1�7i���x+��� �U��!�Tk�^�L{��g�%��;@�C��~5Fbv,�����Ҭף[e zԥ�+v5Cݨ{hJ>j�t�݆���#�b��Hͮ^�sʣ�v���b'��}^���ɜ�U�������*�־��f��_KY��V�Rm(�����B
m}�D����W�0Y�E���?1f�u��q��(��C �Cr��@���'%e$vǣ��.h�ee�l`�JdvV��DE��e�֟�?)�"F;�Qe.+����+�G���v�=����2��
����~��`L�SJwb:>ĝlo�L�ۢ���ӷ�>�ز��0��,υ��	�|��+�_�+V�~E��y~�ϴ��hAan��ñ(��@�ϯb�c��+�'C$�5�y�u��c	�m���+d�,�B\~�NUY�-S�`=g��x4�#U9�2U��S~��CU=WH�,�a�L�$��V���^��9-�[�r?�%�'R��3���h8��WZd4x
��ht�)j��޳�X�@��n�H�4�/	�*Mj��͍U;��H��c���L=�*5�i�je7g�R�	�.w�h���u�Vq3�M�ū�zݶ���n�՗��fg��~EA_b50O9�@㦨@��s�S���D�;�ڗ�n�(�H��K���?�/�%��/�i�q��	�Q�M���7�2
Ur����:[+�(�Dj��tFWp+��\���	*:M�LˢT�de\�.��Z4)��舉Utd*:0��G�)�_�GѾ��
�	�X�"��+S���X��:P��IkE�U+R��L��2E��߆"��_T�h)EE��"�	�"�Ѣ"š�"�LKӅe���D�1UH�*�׾dC�U)޼���d���V��x�~�L��.��!�T)n�T)"'�T)&�ϨR�q�J�7��T)�)�R��*���d��޼]U��nQ�&�ؘp[�ǫ�T�5mu)�~���{J�'2�,�%]�TR��&t)�D%#���o��Rd�/�Q\�9ӘS��z��}=�_�ڍf�FgrSM��zE���SD}f��"ţ�)R|�fkE����+Rd�2-��*R|��U�Ȓ�L���)~��a��a�-*Q�D%��$�{eJ1\J'0%��c%�=eJ��v%����X��Xz�R�b�m�Q\{Ac�ut`Q���%-j�ܢF��To�z��z���(>u�=�2���Qđ_{z��ґȨ��m�L�"�Ddz��DI�"�8ez��2=��zK�bڢG1rf�iݪG�m�(��ґEF�-�Uצ��L�"�ځ�kN�ۭz5B�
�_w�&�'�&MTځoMIY]�C�6��E�!�d�G��@s�@�Hx��& U���9�`(����kWg��'�ġ��;��jč~�J����4j��`����$�ѹ�j[O�B�4�qV;?sű��M3فX��7XV�zI�!p]�����X#d���+��8� C8Q�״�7��Wf��-8T:O	3��]��x�n�;�f6��KY�W8kř ��ǩ�`6k�w'���ou��g�na��#�/j�;�/�
�ʭ�g����L%��S����<�AVu�1�x䣻=�G]���q��UY�/x��lg�ڞ�"ł�t͕�	x��\��o������&�[��5�
�-���'�cƟE��W�N-�v��$7ɹ�=�ƥ�e��[��k
�߹?����=8��oY�*��h?��J�F��~�7��y��{�6�Tp�,�)��览���\��8���>[�5�P:Y]iop���")�hٱZ������FAwa/���/���EiWӵ�����ҥ/>�g�/>I��9��6�kJpa����kJ�WL�_�4�|��$~�_�jOҥm�O\�v��4�@�a�+t�'����B��Dܕ�.}-���g\ٮ�0*�]�0A؁�|f&$'e)�L�3|؞u_v��
]�)a��Lj�a�}�µ[hX��5%xBHMS�O�
���;$��yFJ�<�cS���g\�۲�ͷ�~Mw���_����i�/^X��g2��z�n}@�$ٵeQ���N��6�,�9�n��%5O��EE��9����T��xG:f�uziv�V����[_�<>uVzb��F��ӘN˻�V�U��F��+�\|�7��^�2�C��!ɐ�2��:��<�_RoSgu�{[����l���j;U������>�"�8���k ��UP�.q���g���$8�����8KVx�!|��7s��������+<ؙ���H�ޓ�{���z�0�*��ͨ#���뫸���0���T̐�8�Y�������n<P���jk�Ə�˫lwe��mxqKK�;�
e�o�^똗�+���d�q�7�`�	�X]�G73"�͚�7qOF��5����C'��#���)ώ�B��聒K\���򘗀[�삼��f��u�2�<��Q�/�2�J�=_b�6�`�jZ�C
�NY��]N903���fk�:�'/�j2��R�R�z`ڏ�)�@�����2]5�����]cRc��>e�*YT�c^'�Q<A���@�A�6�|�G�We�<�՚�%�b��^�m�R�i�i�RQ*��T�󎣧��8!����h|�-���	���f�Ѷ�F2��(>NSݺD��ي���%2w�:�2Ĩ5 +��
�SQ��*Y���>�◐��N*p��.
�o�Kyv�ّx���}y؄�6�n�!��μ딋�=�����w��)�|
� ��M�{�K�I�ƶP���2j^��?��}�Y�"�L�f�s��E�pJ�C]U�kV�����23.R�ݾ��r���Wz���~̉�*��!�u�MxS��B�T��]���|�!��n��"�ؾ�(�F�z_�� �e	-��T=��e���(d&p�3CX.΀���)1O;��C�;�pw�r��<�ϔ���/�u���������̀�D3Ze�9����pծ����Ue��vWaT�<�.�ߣ<Y�*�fo�0e=Ѹ���&8pS�ē���� ��h��-�(VU��Z?�]Ϣ��R��t
o�p�!_��*tuo�)TT�JXl�LuǂJ,����O̺e��o��n���b>tO��J�d\���v���ʾ|�B����`M�B��r�B����+�>x!�Y����Y�W��,��+�U�/_�'N��+c��}q���\���qx�k�ŕv⾸�C��2�c:���+g}+~irM/~g������w����ka�C���?���ބ�9o0�M��KR�x�e7w�����L/�p՗�~!Q��UlP�)��R����{s�Wٳ��2�`:�,s�`d��G��3p�����p�M��fn6s`���&<��4�+pZ�W�Ί����8ۖ��\,��=^}�G�_�wY���Pg�b���x�Uw睎>e��BU��~mPr]po�X[Ü�)*����ぇf:�K�,��T𭒈�]�[�	�g>e��:�N�9�έ�|:e��g)2zb�R�eFV�`��FRhŶ���ߚ�f�.���;���,j��u�=|$�l���R����C8�Bp��E�L�31��5q�{B����aDR2ʏ�;`�����H�_uk��_R2��Li��%��4���7�;ۯ��4i��L(jV��x�u��vX׋뼹�]˹!�*��Z1�;���oVxx|;�l�`��|��
� ;|p�y��!S�G��Ίy8�b[6��42Fu�RA�[��J�8�:�m�5���Q�xm�xZ���.k��_K.��,�}�����<�C_�4������T�;&�<�`;��\�� w��H�x`�3��N,� ������q�X��
���?�� ���X��x
`����j���S?�����<�`+�k�8P��.�`2�l�4��x	�
�r��_��te�)+x��u@��~�[�:g��l������������[8�pK|V����&��9�v#4�����=��&�d4	��Ǒ�$�Y:�d:�%�d�b.1�7�,���?��I�F�%���.��?���2���!f�!�E,���_�V�6�䒂6n3 �K�y�"�� ��{��/�s ��w��?�1�KP���ҲBHt��B�_	G	/		)o)_!�U|�<�|0�TH�~ib�ض��l1D��-�Ic��ΆP�w�#���p���2Z���|����t����n����s��3Jg�G��U��ilZ��U,3T{@�e�e�b���n��%\.Z,y��a[j��p��҈�尊�ȳf�:L�.a�gYl��Z�0�9�
�`��.��ia:��[�i`|��qHB*g����4����6;�f�ݒ-i9�e�M��rs�C�M4S9���0<��0�O�V5��-.��C�G���/;?�j���`�R�m�>Mf����]"�y��R����ҵ�O�m�;z�����_�~w�p�@ݠ�C��0bd��c���'x����BB'����b��e��w_�i���Y	����̽�S�.^�fI_����,{yNn��|�V�b�����5�$2�j\�ə��K,X�ˁזoX�K,@Y��+�xj9��Xk��p:FGw�U��xhO	�'#�&�T�N���mr�dў�,�oAP��e4��lف2D�$��I�i�[<ؐ�4���\��f%�`KeQ�@(gP�X�����TFuK�%-��d>�/�<(��VՕ�:!�L�:3!f*�V�S��X���6��~y��!�8|b�B��5��c�e���;҅�YYN(�0L.P�c�e��e�,g��F3ڰ,Q���Б��K��JF��CX��I^���T�9G��V���U�(�J�LFg���]�9�c���Jk)Ъ�� ��~�Գ���jJ�Y.+Ѷ�������-��tf��bu�%��J
���/���C�I*��(Hk�SH�m�F���Y)` ~RZ��&��[�(켝����ߐri�o�o�;�<VS�n�����^ˑ�bK�Rz��),UY�0+r��5'���#���w.�f1�s��R��qc���#�&���8Q�H<Ӟ���3��Y.J�L��,�4�X���~i�S+�T1u)ݖv�e��!������؈�Ҋnm�A���}�0���Xg��;�
� Y��~�8�ű��b�-�$�����#�8y��b�X��\��]�B��֪,�9Ѣfn�"j0qup�M�&.i���Mr����D]�/�0��`����
�.0���:0�F��0G�L��h4�A`���� 0q�X惘���c������
+맱�Eڒ�엤B$	�?�\�U<�p�2�*���GH��B�b��b�+�ƴ���\���u�:��Ebi�[�6���fLȕ#X9��l�z�ʔ(����Ve4=��`@]�y���L

J6{C��ʈzQ�"xY��5� �D�C
�j���-�[�n�����쯸���!����'������6�������?๵N3��9@��w�O+P��y��_���D?��Ÿ�M�w�$�t�~�]z[�n�®� Ek��<�h�c�s}ن�6n���O���O>��3�>��_^xq�K[�n����_y�o������o����]��~w�{���W^�����<t��GG�?q��ǟ|�����|q��s_���7/}�_���~�R{��ku?�74^��F��f�o/Lt��p[���o�_�����G]��D�8�*�g����
d��d��2�&���2��2;^�#�w��觋���0�"��%g��H�R���tO̷Xg,β,�bs�s�˙G�'>5��X�eX̹y�<�&������25we2I$	l���#>^EE��-����G.��XII	\PP���FU�C��E0΂��ٌ��tE�E��p,##C��^���"/��8�L�o��0Z��d���~�E6�����ǡ0�Ƭѩ\j��b��Zu�9��T[Β�u�nh>`e+�.3ے��ru�y��e�e��K]���ĉ9hA�t($]j�.5�Ax\5��#c����ҭ��!4�N��o@M��0	ы���X��`���-���t�,�U�9K;�Ϸp�̛,O]���\P���f2R�-��6��D��]a�Ilg־D��r�M�+,akL�DX!�fdá���}�Xk���В�Κ���H�I˶Xo�����Z8��LN�$7͢�M��I��c�\]�V3��is1�y�8C�Ǹ2���P����吳js�2>�a8��3,�S�1;3�<���n+229K~^��.5�
����[�.��k�).El�W-<�9A�Lkn�rK�ΨU^��̜TV0P�k��\�8�uR�!vK�IakPV����ٲ�tWdr�/�\�U�|{����*�i��$���*O�U�4�r��Ζ�h%Ύrk�Çץ��#��J�<��eg�D1v[tn��q9��g֥6��|]��$Nf�β<�[5��|K�L���qR�
$�e��ܲ<׺�[�`w�ҵ��f��g����o���P�8���o
S�����I͋k�j����?ʟ���j>�Y�1����\��mI����|n>|Ϙ�4&�wDr<����獛��X4����
��G��_=�s�q#;��۹��q����
6�i4�c�0��;�珓:��8����6��'��?"�w�
�}��w:Ͽdv�飙<��_�k����ׂ���-��
w`���e��6�2��ByeuN��e�?>�u\��;�G��s�w��n���l G_��?h�����ڿm9
x��z{fo�������[�l�U���>`�%��w��0?1_%�>�ݧ�ݧ�W!�����B��W2�J��ڜ�e$��M>����0�!�I$��-�$��<Æ���\W%�frѹ��ȳ-b���s5�$w����̥9b��s[�$�,Yq�y~��#A�0q�a�WSn�-�
����1�6�LǷK�R�ɖ�eN]�Yf�&g�Y"3R�d	���[FK&%�2�	B�?���N	z�4!V�P�xx��>#N�y�I�
i@<g�ʳ��������m���B(+11w��
C��L+d��d\ۏ��ͷ���g�5��xZv6!N�h΂I+��$�"���,Ğ�B,f�Ob�#̱,�1�Kj��B3��q�b́Ab$�G2��f'*��C����-�ByX���B��*1G�[�W.��a8��ÍBېΎ����Q�Ŷ�K-V�Ւ�A�|p,j��D��!�/${/WIc�)g|/���Gl�����`[""r��2s"sm��#m�L9�J�uK!�O5��Ń�k���x�,3�&W W�
v�%-6��8(%�%w�$��i&d���	�]�\��4��m�U��;����ށt��{���U�_K��	j*kCƻ��mvδca>h�WC"�Ҭ�|�z&C	2�#�-rA(@rj(����*o��-�<2Zi�e<X�+gAN,1����U�^��@�-�5!��3L:��Az�*!����\�< /r�l����Y"�Y?ΤA�e"]�r�*���9��ٙ�O>k�`#�����e|n*p�bk*k�'�̲����u�\�M��@�$+��m���T[z:��a�|!b�k���8��n�0q^���.�d,[Yy%�Z3q��L���B-�y��!�0���B����Kn�����?�,�{�ES��yho
����:��q����	o�~��(���H��M\�ǽx���C�2��k���.��U��&�S���FLW+��;D@�A���=B|���b�Y�{�h&�����ݗ¾b�>r�Sbq���8�͇E��_,��	w^�E|�,�U��e�}���Q�3���[(������G��u���Q�y:��)�w���������vV��J��W=<Ht��W��y�`�}�<��ְ����!|Ŗ3[t$��Y0
���6�G�����K_�G.�Ŀ4����lf��Ё�<����:sϭ�O�>w�:!��1q�
e~�O`��� �ur��p�,�i���8�@9�{olx�)1�F�R�" `�l3@<�`����e���Z5h�f �<�i��l�P�
�0`6@<@@�x�Q��||�~�4��Q���lx� `>�l�x�-@�U÷�����]��V\�*2�ٮ� A^d�w	��GF*>�){QW�o=�6�u��׆���Ͽ���>3�6�R|��� ?�
|��|��<}�E�m��!x=@��P(>�!�(}ǀmG!�-磶�I�{������w)������ӑ`�i�Ĺ�va�"���ܱ�N���k�D���|M&VR�8'3+ڦ�`;B2�qO�ߢv�1ߧ�q�g��������|��˙U��]ׁ{P;�ا�ݼXAx0/���B,
��wJ��d���]�� �-�y�my�{޵-��BxU�{�?����N�7�~Y�D���Ҏ���1cƐiӦ���d���Il6�P�EE�_D�z�)���/�ݻw���r��g����f"��"^�rU��>v�ȇh�W�8�^��+ME>M+V<��B�4�G�����r�����;r�{Ǯ��3WhS:�_�P��2D�U�c�F����$�b�#��ӏU��M�?�0ф�~��a
����ȑcU�CK�+�_x��)uÏ��5���գ?��uG���c��<k~,hʆ���󽃾#�;rHH��Q����^W��^C��YrO�#� �z,.u�+ό��Ə�m���/G��F�����[fil:VT����f��&��|k�k�̛�?&����8-x��n>"����M���WM(%�����P����t���(�����\+�/����d"			�l��7n$���*y뭷����ҥKn>��e��nw��ƚ�C����H�+�җ�B���}��s�',+�᧔��R��K�(��������}���fʲ�fP�3��q�7/1��-�v&bz�7`������aa\�B�H��)Q�@:)��������:_q:t(	$AAA$<<�DDD���XVv3g�$IIId�ܹd��dMZ4Y�t)���"˗/'V��ɏիW�Ͷ)�o��7��}���_I�ȍ �Z
d�����E�䙵�ɮ��H�c���[�������Oɸ*J�|@ɄC���d�G�D~L�}g(��%��_S2�;J���d�eJ֮]Kٴiy��'��O?M�{�9��/�m۶��ݱcٹs'�e�9U��<|�����|����䣏>"'N� �19s����/ɕK�ɩ)�p�㋚�Rw�{��uJjkkICC�|<�Ba&��F
�vW�n��{@��;H8G�љd}�<E7���u�1=!�S��C� ���!�\��⯤=�:����/��'!�EY�a������_���!�	�⟃��@�������L��`���~|��_����ɞ��G�3	����o"��uB�e�}!�`����B|ć�j3!�*���?�	�+ �I�I�534�<�l��a~v�O-���B��!���I��6�X�� f��� 3B��H��גXB{�O�<Bg>B����
B_?@良d�u"ď���!�J���o��oB����C���B�K���p��	)<
)l�>�.@
�=)�q%u3)����M�\��'�;�]4ğ�gA�%��B��!�_!�[?�?��B|�,�Z,���.�?���� ���⯇���� �Y��O��ȝ"#�FL�`�	H�Ȁ������9eJDT���Ç�O�6DJ!*��?,QQ)�#0��i:�?�i���##�L�H��<H�5"�""�"!>�5fT`�)-Hƙ�'�.�>)c�)��2
�C�qq�S�R���� @0,�O��ȑq)w���W�g8������Sz���u_8��a��(�@�^�Q��9@��)��qqƸ�~�@_�>}������9���=�~�VR��?�h���3M[��#Y�SMQqFS�)��~���?"`t<ҏdYH�����c�ӛ��M�8#�� �?�5΀(�A���{���)�Rc���t�;:�������Ԅ�2�E����2"D��1erD�=J�gДS�)�(bi��+6r��ȱ*E���Ul�{�'6%t����B�30DMqS��Z�#&M
�T���S��Ǐ��l�OI�1C���s"X#S0�ب��S"1�}wo�GNv�#-�X>�`�n={�H�4M��"O_xb�=CMP��2oL?�y����H}lko� �(`�X��m�e�C��FLn�M�Z?�6ޔ�6j�����D��3�+l���)m�s��S��ܬY��xd�e�{����{Ii��<e�$o=l$;�YC&�1ȹ��(I�Z3����3y��g���?O6o�L�n���
o��&���l��I���Yo쀱�|@�=�����|�����ŋ��r�˗/��^ac��~��ܼy�lj��ux?qC&g��I��A�ܸ:�U��=�_IO�G����y��"��Y�:��w�,>t�f?����Q"�7@�8�?�?����C�7 �A����w���q���~��ׯ�֗����:v�X�L�Oׯ�_�A#j{�����C��S���
2|8��86pl �?xd��]��=�w�����c�u
�[t��F�U�} Έ;zt���g��nju�.��>#4�~*�~#tSwE��ځ��ރ��3��'���G/x�6�k�.�о
�K�|!�x����8vl ^(������~�4H��W�!$�"t�诐����b��>lO� �N��m<��/x���O<���[1z8�S�ҥH��J�� I��sH%�{=J1]�����#���^H�~gϕ+W����������_�������
�K/�={����j�B�+��'��[[�~M�a]c�|ǰaÆ��e��6�͛7o�Dx�~�g�}�̣�}��w�}G�?��~�).Pѯ������?�@��������ɓ'�RQQQ8u��`"�n��C��6��kW�.m-�-<0���˃�Q���P�Ǡ
��4&M�4������w呂}�wޗ.]��~�-=~�8=q��q`���!������]�v��!��n����ˋڰa��Ոn3
�ӧO����{�󋊊
�t-�׮]�0��4dȐ	P����{Z^^�.�cǎ��?���	��pG�����_|�ޑ&	`��L๺�W�6�݀4��������>����|��W��ut>�m��Z�a<�y��i��D�_�C�KЖ	g7@��A��[𯬬\�8x�iؿ?���̙3�.\���GlІ�y��)�6�>��zö�q>���:��O���������ބ�І�5����S�����C>F@�?��#�g�
uNa���0�?��� �`m����̎4�@~�v�u������3�N9J�����/�tL9��Q��%J��?m�����޽����'�~�K�F�e���`] �hǺ?w��c�cy#��H��u��eJ�>��p�R�1J'�4����#��a�S:�]J7������_�?�z7 �Hu!�oi'��_��Q:�4���@�#
PSzА���M����4h����m���Ѐ��>88x0�B1��p-����X�X�XG�7�(wa������@�ԏ)�p�4L��;-�y�R���6q��C�A%����Eh['�c�b] _!oHt`G>C��v!��.�I�@�t�!�?�3���㔆~$�ma�~J��z�Ao:t���
��P��G�zG����/`<�3�'�"�Q��KJc�#а�_�v���t�����)�3�i�@���:i��7n��������<0��9����[J��t�yJMH��b{�	���A�=�L�Whϣ��4H�#���~���A�#��'m�@�G�nK�D�:��WGޢ/��[l��/��2�YPC�\��W��N1���3� ��1(�@��4h�� [�Y���v�?�����R�~�?����K4 � �h��i�o���_W�ӗ���|RA~����h��3� �g�I㪡�+)�4@��vC�?��9�� ��C[ۀ�!ls-H���rr����?��@�6�a3'���E.���4��ОQ&�}�Ҟ��=#
R{F���%��lgؿ�8�
H�m�h��H�೫0����d����@CA8���{���
)@ü�Y{��s�)A&�|$�ϒL4�Ӯ\b��~��	���G��&�Ҁc�tþV����8f��ݢP���P�:��w�a;���ӹ��J�m	��s9�I�Ԟ�1�����B�ɓ'ú��+⍸!�-(�Q���&�Uط���hعf2�񐞾4�m���iy]�l*-͌�����0-�:m��s�g4��c�1FG���g��l@�/4'���-�	�x���_�����^�>�����j���g��%���E6"
YS�@Cz]�fd4�2i�l�1���e�a8�@ؾ};���Fq\$��N:k'7oޤ��J+��{k�ho
��3ʤͶ{���{�SyS�9�Xvu
�

��|ڎ1�j_� ���������Gy����k��ۡC���'ޤ��'�r�a��3Ѐ2Ij�/�Lz�:�>�g��
��u@C	��Z�G�ɤ��MW���_��C���R7
m�茖�7�腊g��#�>{�#��7d�y�Hó"
>ڰ,�:2�ac��������ɭO_�s�7͜93.''�����5k
r���:A�T�9V{�g��=��\&��6O����>&&끾��+l�c��A

�4tFGgu�ʤ���F{ڑ3=}��6n�X��>�����m۶Q����)�qt����]��L��X�=Zo�PV�Xǣ8����h��0��R�n���i�=o���K����{�̖�=z�����4�QV/���1cMHH�eee���3}�'>8�G|������9Ҁ���B��g=�2�_Om-hccl�(��YiB�q��0�Lk���7���Ν;_�6L���\��B���~�}��1‡~�qG\��$����C��y��.�=`�f��Aޞ_iӞ��zǁ��󄆆>���O�u�[l˴���u�C��#F��0�f� �6�4HЖ�))m��=���Wb��Yc`���Ցt��K��ߦ�?�t
���z�)Z\\|mӦM�������٬�a^�x	i�v�t"nHG[Zp
�a�{죱��z�#�
�HXwHK;���ѯ]����v_�����C3♜��۴D�ȑ#�+X=`�!��Ht �����s4�=`��ж�c�-�{���7l[��K�׮]�1�Ӹ�8��C�z@��S��9s�0w��A�A���\����'��CH���pL��A������[o���!~�ț�K�ތn��9�l6�~###��`�cƌa����-���6$����c�;i}p��m�����t��8q�`(�bl��>���
�}0RSSi||<㭭[�2�����юxc;@���86E���6�l�&0]���{3�S���g�z�>����v��|���\p���@�R[�b���)��죰��8�z"�Q,S��o����?������,�5��m���Q"|����7l������7�;�74�ol���l,�|�r&[����
e
�ć��]b� �`�L���Ў�ba}`��IE������9��yX�ۈ҅<�m��G� �X?-7	0��E� ��qG�^x�\c|��������_�Cy#
�\l�,o�A�w�y�����3��n�1~�A�G^�2�6�n���
9���h�Ƕ�M\c�?>}��'��]������� ���>�o������ـ|�}�!����@Y����,۷�~�>��3���6��tKk�8n�w���̗�J心�y�(���6��	‹/���#]iC|��Pv"-�0>��o�[�G\�}1����X�uF���)}�úA7����"���ߠ���-r�S���?�\��:��=����! o�YUU��.��W�w������w��|��{�i���/(���?¾��X�X�.����GY�r���{���G���;�w�,Bi��iD^>j�1u��j��w|P�ɝ�a�<p����A�oŊ&�M���Xq��)��	���T��B4��d*ڤ/˷H4��E�
�B4���-��(�SD�P4�`*�l}nGG~Ã�{�E�$��q�� @}��"�����=���}��Ϗ�X,3a�2�a�3s�&2>Ŵ�l���kJc>���Z0~S����G)��G�Kg8 ��==='���hӍ(�`����K�A.���K0�͂10�a0�W�^���Z(~�Ӌk�_���UJ�|�����y6ʿ�K{M��sq��p
d�)���b���7�w.���k��I��_{W_E���쎨��̐E轻���d�2��!d�l$!Ee�dD�T�)��c���"#pDv4�"������M�k�ͽ�uN�:u��n׶o��m;=q�Ĕ�{.< vB���_[�Xq
��{�A���x�w��
|5y`l����砹<_��sAq4d�<����_��>`eo��X��v��>��kj�y�L࿎}�'�dR��cN�����㦽��q�`�@�>�H��'�d+�����879z�10x��y��QC=5��>���qO�mBw��6`<�G`T�:��@\�%�?�����Ǐ�ƻ�x���_+�O�Q�E1�>�W��j�c|���	��ݰ}�#���Jk����2�O,��V�8z�ԅ<@�k�#�`�ZDk�t�>ϓR^|���h>@z�W4�m��_@Mx����
�
8/�0ֆ9�3�>⊒���	&���^��&���VD�>�L��B�1ۘ��JS��_&f	�>n;�}צ_��c�7T0�w+BM��@Q�lB`\��Gt��F飷���GL6u�Ԕٳg'c."�G|��/�^?^�%pC�U����mύ���G���u��Z��v���[�ƍ��d� /@n���@Շ>
��l��	P�����E�	�L�"8لhB9���{���g�����q�h�r�f�c�
�X�d�CYk�j?��?mڴ��^z)��q����A�Y��;4෯�;?'.��Q�vQ�����4���"rx�駅݃݅��.@�EЎƜ���:����1;�+�%��)�s��#��s���^�c�g�B'��8��>���Ye@�����M@?99�Ƙ������
=��"�O�-l%����О�G�G��oR�X�を.�U3�CG�
�.������Ǘ�>�����Y��ШQ�Dx���v�>�9^!�`m#�Q�'��O~��\�~1�k׮]_>�E_\���B�
�}�Zs�	�x���w�uϿ�.����a`��'&&��+x=z��;�A��:Ԑ}�~�\vvv��B#���/�S�����gdff�?0����X_�~�/��=ֈ��W���|��5���Ǥ�O6.�Z5~���F-:�Z:p
̏hc���d�
�	>׭[��te���O>�d��󓃜�222Bm۶
���C��|�Ao{�u��V�£5o�ڂ>h�L�4i$�CM>6�!Cƌy�s� ��Ƌx�
�v~����kX�5	����a�V5�+b� k�7l�;^���}��F����+W�͙3GԊaQs
0��H[����B�p�A����:���5k��+���(�lƹ���w��b����ֆߚ4�������%۹V嬪����q���F�v��:)|�~�ʯ��n�%��ե��x�ܹs�X�`�w�F_�x�_~�������O�>�-[&>���,\�0q޼y�X�B�g��0�|Nxچ
Pg���Q����1�5���,���z�~�՚�z��F�3���-�u8gB|�1k����|0ha�9Qt,�r,����gn�4?V�6a�����.
=��
S#��G�����<Wz���99x����+e�"���`���} G��y�N�睈aS�o�-4�0�_�9Z�ݎ��頎��
��8�kP�y�����!�C��X����SE�9�q>0~87l�P�i~hu�'�I��ۑ7 w��U��/Z��2k�,b�p5�%�v,�mC���ǧ��ܸ�7!?���&���/E[Y�W��D�X��_�?t�z���ի��)�4���B�&v�?�?z��%�����{O�j�z�m�\��h^��<Z�q~0���$�?	��G��7�2���������V�{��F=	�"φ�޴i�ע��_�ДR��!���S?r\���H���ئ�iOx[<�X���]#�y�xr��VW�Ӎ���#�r�:��k�FΌ�]�93V<u��Ԡ.½d��4���]>{K�b�͡���ԅ�G{7��O����<xe����j\�׽�"� ��c��"�_�R?��8G�l~~��pQ8����:�}��)_J��pn»ˣ����G���^k�X��T(ޡ=$��
hw;P�
���n�y��+鳳�I2�ZT��%�*5��?Y�]կ"��,^u��Ǫ��C�8?W�kz��"���W�����w��3ę�L>�	�"�sX$I����'��_��l�ۃ�~�"���{I�k��$����O�g\��!�i���kK�b��$�1��Wp
C�F�-�P�x=�
c*chJaaZ�������B/��\�053-'��]NVjA^a^zQ�Լ'�0��%.6'%7+=��(9��0+/׋S��q�u�bciQ�Åb�+�M_ǯ,LK}� ��$�7�� m�ÜJڈ���1Y�ii�5_F�Yl:��6&-;6�{q)���c�F���>�����R����´8�v����w�4u��^i������<�����N�{t�ߟ�A�t�˼�� ���W�M�A���J�[IP��j����Dk�ݭ�ֆjyZ��Z۬К�8#�xӨg����T�nfO���o��O�Ϛ/��;̳�
�]V?��*�^��Y{�S��OV]������ݶj�vg�;�a�c������X2�,$�A�98�Bg���9�qڻ����w�K5څ���t6�H��\o�7�k�o���L6�U�saa9��䖲��[�Y�]�G�R�ԩ��bu��Aݢ�S=��T�iwj����D[���m�i��
[%/��dIqJ�u�vg������=�֧Mh;��ڕ��G���h6�-a��i�B�ur;�\^*o��%7R,�����)�f�SΓ�v��W_Q�R'��JC6m3��k昛�\�;[#�K�H%�M�8��b�1�g�̛λ\2׻��?���!�w����=�rϸ�qchcz#���һh{jR�ˬD��t�OK�d:�Τ��2ZIWӭt�O��������dk�F�=�����Ir?9C.������
Jk����lTf��Ե\��Z����W�F?3�|�|�|ᴥ�%�����Y,wR���)7*͕۔?(qʝ��5�ByJy^���R�zR���z7��>L���%�*}����O�Fon�ɘh�4�5��Q��3�g=e͵޶6Z�[_Xg��v+��v{[�;�Y����.�E�J����>��;ڝ�����USڜ���rh<�F{Ё\R9t,O+�+�=z�����x�a�o��������g��þĮeױ��m,����1�Q��Y/�K�z�˥Z�ƳIl
{��`��w�z��}�>a{��$ך��.Fn-�#w��(����-
Q^SV+Wvr�9��V�*��X�T�Aj������ՙ�G�n�'�Z���ڷZ=��>T�?���������f6�����̦�c�#5���k�2m���c=f-�6[g���e���O���s�]�>��ݚ�#��!�4����|DN�k�����I�&��	������!��{��j7� ͤ�t"��`#��K�2\�W��^���J�J>�4Q�;����V�3��9��-��ji���ؕ�ع�%�Pw�������_�>��}LQ>P�(-�sZ��9���3���j���|�kK�y���ʰ{��d:y�~�5g�c|ފ��>f(?j!��^_o�_�ߤߢw4n��n���y�lk�V���l[oX�[����|M�q�9I� �vz/�e�3]I��#���{��)�uo�w�;��B^c_���5�a^x�,y'�D=���V����@N�P�֛0c�1޸���g=�G�Q��:g��9��v�n@I6y�s�wr#礉{���m�jn��g��y�U)��,�&{�.y��C�R?�74:	Fo#�kL5f+�u�v�qڨo>a��vZ�Y�C�Q�u���!�zg��v�]dۥv������i��ɟH&�#E����9d3��HN��i�4u�9-��N����;Eܪ����&�}�T7��q��\��#\�[���~ړ&�!t8�\��ZE3��^�����f�~�?������~�����0�٬#��g� ��F�"VƦ�M�sط����T��LU�)_*��6j��n˶k��/�FF���|�z�^no�6$��#�ȭγ����{w��͢O�oicO�xg��ϺI���ܻ�s��ɨ�����zk�����5���fO���_٣�hg�S�.v5nw��92�K�
�G�~�}�򪽹�w~c氡L�
���#d̙�J���Wm�v�1��7ʌi�2��|ܜf>c.0�m���_:���"�X)U�(O*k���&�����m�Q.�s\nMX3֒�f�2�۰N�;���,[$u��l7��֑�����ȇ�JEW�8�J��U٦�T�����櫥��.R׫U��5��hݴLm��H[���q�m���čq!����m�6�^"�؄�x҉t#�I�C���d�u,��G���L&Sȓdy��@f�y�>-%˹�|��E֒�d�B��m�����Qr�T��ɹ�if���i���Ȏ��u�NN7�;��}���`g�3�ɬ��R�ܙ�Lq9�;
�|��}�`w�ʙn�[��cxԓ�����o�5���ҏ�[�6���~'��ߝ�o��?���|��/�K�r�?ů��^mW��v�]mWۯm�PKE��Tj$qC>�pip/_vendor/distlib/t64-arm.exe�|�ՙ?~�wf�wf�er�:�:�
$!�j��	X]�h�v[�uX
��hm&P��]��҆�
hm3�ڢ&�Ӫh���"`�m�%�M*�-���}�s�ɼ�L��v�����0��s���v��\?~�6f`���{��?�]�/Ebl��'�X��W9/H��*��]�����[W{�cU��?�����:�m�����[�r�����.9�2[��¿z���޼�o�[/:/��O���O�p���'Σ��S��������3��׆k����~U�F�{g�x~����[�r&��?|��{	�W���;�r�U�4���
;%Q�|�O����{����E��a�ş��4E2E.��ܲ��ٍt�Gf�ո��5Y��%���ʬ�2�چ�E��ū�'N݆�nڀ��ǒ@��n��X�u���P�؋���[��(�I���u"+���D�I�Vʱ麯{P$�uD]�$\?3.�zݺ��V���aw�6^�Ϯ}	�FD+��\���)���%�j��|)�����Rƪ�
+^y�e����"�� W�[�ߩ�$��Z��5�����9�j��70�U�㝏`�/Rޙ����}J�_X%�Ck���#��#K$�P�?Y�bM������k�jHe%��cH{�,A�2�(�������������F&�����a��
;�:r�r+YJ��N�q�M^ɔB�=�{V���b\���b��<�Ī��Ȫs�P�N0��$�=�Bu#�5�v8��>��ʩ�j�ߋ_�O���+����6�Q}&7��ٶ�g����&�F��3+��g���|n��U�F�W^B~v}!�ApW2g�c�wѽ��� ���l�O�}��Zw�n�9�ڇ���oM�ܜvh~G
�;�����s0�cQ��E+/ڋ&*��z\�/�9���a���8��ݠo�P�z;]g�Ԏ�S-ë�\�`��^\�^O�^�Ak��hL�-݉���Dc�5ќh���5��J+��?��xPG���n�s�x���A�{��e�8��߁,鯥Y��th�a	r/C�
�#��H��05�o`�3���)p� ��c���}��@����qCf�
�vt��}
��i����K��<�Uȸ������̏��[���R�-�7ߕ�G6��V&���_5�Ż5]yb��}Ew��_B�vmPo�:�?�ˮ��+���T�{�䗶�����pt���p��'�a߮��MϹ�u<�y��V���^��i&��'��M�O�V7�g,?��N?
<gѻct�<�bi�I�W`B#
9g�Bΐ��%��Y��'59��u�#�7z�u�?��-�O1C3�]�:κ��E_���p>���Z�h�
y�7H�O�^}ڕ��|4��݌u�e�y}:�W�?�%q�snH�a�p5��i���3�U�3�h�U�x����G�K��� �k����7�<:�>—Z��Ɨ�_�X�S��'���Q�|�G��6��,�� �<)9�j1+�	&�~%�8>p<���w3��ni��N��C��hx=��E��������X>��x����g8ʃ?�� ���m7��ӫ�Nd!=�۩D�M_u}�]N��Z�|\�HG�)xL6JO�b��	� �����Y���S����%�?���
�$��JPN��2�����#I�C���?~+`��N`��ܿyᵙ�V)fs3�쯻2ӦO�HM��3sZ�-%)���ַ'�9{���L�>K�1ϥ�h�ij��.�.O4=K�k9��H�fV�nǻ���-��S��)C' ?֒gb�����(KQ�ow]�ޕ'��A��Rvh���1�W���^q���U쏗���aS��}�$��=����]�wV�"^y+ �k�Y���,��^Y�JQzk�=�9�u8g��K�!i:�^���<�T�<ԗ�>���C�
_Q���Q�>�*��
�Հc�ݢ���o4��t�8� �N�ƽ��ˁ�s��H�)��L���3�K˝�<
΄������>W��_
��'������;\�2��6M��� �׊<�W���Gzu�[�G��ǽ��-w���}�䱺7��MTg�>{���Ko���a�?-������mc�l��֙����YY��d�f���_v�����,l����+2@�i���{�u��}�j�L��;�p_�p#��q��x�Q
��	���㍞ò�s�0g9X��<iv+��gj���1xS,��B�x���3�cϡ�ɷ��,^�q�}�ß�z$�)�B����;�Rz}oz}毠W�����y�E���p�����qm{��8�'��7�8|ǁ{�P��<��&.��4�w�7�}c���jȁ�L*y�}��G�Y��O_��y9)Z9)����I-'����~�+�L�K�}z���"���J(>��Oc���)��g���c�ħV���{[��;}*b����C���f�en*;�"�����E�����c�H'޽����}a�3�9My\&��Oe���/��u�O��e�O}��,+��*%����y3k��l���B�[ӌ�K$V�hw��~C���;�����9��y~dk��p�#�1��V�C��ϒ��s��e���]�ʂ�$�<���ͻ��7��*��Q9DS*7��gs.7ie�H/��Ԍ�����u���(l��i�S
x�F�:M
RZ���q��pIo���Z�K�Ee;%ź���K�����(;��3|����S?��lx״.�W���䧆������ց��ꙃ�Qy	q��>����Ju�3��M�P"`QT��3(�[��v�Q��>�/������y����L,O�L���d"^؀�oL��u��r=IUCd~&/�<�J�	�@>�N����#��fS���<N�߀��"�~��*+��t��ݟ�;~%�.��:�����4�/S_���Cy���Sͥp� _���(�]f�=��R����B�-��v��G;�N����A�ᜯ��+iT&�	��Q{:�>��i􏼎J�A�I�x�P��������PC���C8�W��p��>�X:���{G��W���߀U�����Æ�ga���`�&m��3�a[�T��c�@���q�G�@x��gjO�,��?���7�=KeyPǽ�m�iU�{�Xu;�ӻv9c�+x�g%�w�xwoZ���U���_I�7�<L�ļ�@��;�s�緁G�F8>�����+g��O���4��;)#�{�,��ĸ4�2�x�L��{\���oDY}�o�5�YÎ6�C���1|�̞͞uFx^��F����Ki�ui�g��#���O�>�g���t�L��w2��"��%�!ˍ�jE*���T��_s.S�Q[��l��T�����tv�m6C��t��t��lX)��v�a%�K7x{��+�_�T����������\�t�-�������y��з�!�e�t�=�X��E��Jm��w����P�R?�8���/�=�o�0>.d�h�)�����D��������q�[|?�.����j���[Bo���<���H_���� ɥ�T�W
�y*����{��h�(���5�l9l��KcA^wʳ/�wy���z����U����3�g���/`!�_�6p�����5'ֵsqt�N��h���/i�mi�o����ݑw��|;GD��O#�j�}�"��ù#��3���"e/����b~^�]j(�O����O%���}�������:]*�m���E��������+G�'M�Ƿc^�������ߩ
7�A��?���I
�h����T߽#�\模}��(п�N7�id�cE�i���Q�S}���}�N�1�}�ti�|�,���<���G��[��ISvQ��e��?*A�,���^v|�4D�jr��mfc�����"����M�m��7���#��t�}�)�!r&p:�KV�!�Tֻ�%���~>M�kg�(_*�<o�|���G��gP\�ȧ��n�:y�}���Y�F7�� 
}{M+�R�z�$9=8�ә��/���;�E^�VV��PY􍞅�ع�<�t���uY��-�8|�4����
��{�������Q��^��Fߋ�����o�H}��,Du/Ʊsh�Æ�s,*3S�l*L�Ic�,��K��9��J[��������C>x��Fn_�p��p#�iC�˚�}�J�hzK�6I=B�!_�|3��;��)���mr!�*Ou�=���E��R��~3ޯN3�e�P��ޔ���V�V��z�3�eh��g��!9r��y�EM���'��e�^�(p>%�c����șE���K=�_���/7��s�ӛSY� ����6��u`�X��b�I�6S��?�g��A��	�F�̘(���>��"��1yRb������P�.7����|���,t��� �_��i2O��{3Y+3�����mQ|���Z��[�g�Wtby���R�خ���ۑ=�g��x�g�t�,{ޫ�]��'����w���õC�n���t���4�z*����N���r���.e������\)�3Ǥ/G�j)mq���K!_�L_o�`�F���#	�׎��?}��ǐ��7�Q��[���a6#_S.������OЭV��4>�"�U�τȷ�a7�/��%jE�g�۪A}z}<B��n�?�X��f�~����9�5�1�lU���˟B��v0��i��s!~�F��������<����7����߲����>�x��x�����7}x�#	:Dp�Ɵ�1V�+x߀�5s�4۟��h���䴲|؈ʽKX�x��w���-�>l���5+p"��lRm��9�Id�^e���E��.��=�e�1z/5Y�Gx�Qj�M�r-/ٳ�w�,��ʫ�@oC���5���ǻw!\�?[1��p)���%�V��:�Y�O�$dO_��g6�T
=4��E�cz6`��/
�|x�p����O�
a����ީ��K�b��ϳD�������#�H�[x*o�D������E���5�x<L�jc�J����+���r�}V�_�#+z��Z6b��~�FI��xJÿ��5�V	�����iM�"塍�V��PL>L��Iީ���ǀߏ�Q�rY�2g^#�y�w/#M0���s.c�C�DK�� ~Uo$�!�K��L��ž�����w�<sD*+��{��p��w�yK��YLq��o(�?��]x~�E�K�G���vn��S�? Y�H&V=�&5��7���V�K�$�R���f�R�X���̽yH��S��l�E���{���<egz�BJ"��"Y
6��
=�v�ܬ͒�J�[�t7�L�u9�<����Q>G
��p!='h�!F����$�v��z&hK���-Ȉ}����Bos�x:����l��Ivs��ɢo!�_F�x�̻�����<K�=�C	w�A��=G�������q�����{���K:�RC��'�R�P���t�*��G�v摣=}�=�MV���ռ~������A�.�by��
ϻ�������-T/-��i����ji2�2�<�E��b~I�^ܼ��"mm��o48Dk����Q����O�����-Ү���
x�U��
�:s�>��]�o��ۏW
��j�����L�e�s<�C����`�Bz:sY� �~��=ڂ�8n�>S�K��c��[���񾞒�w!>#��K�592�VnT��s�ngs�zW+E����^Ŭ�O�"[�����k�J�t��'j/Z Gy���%H��Xh*�SY}��r�`�̲����nf���h�K$e�.�/Cok���OjAܥ�AV����aj����H��5�.�7)�7�OAӍ�����.e�_�J����p'ڿ�ϕ���b��ԏ8�=�����~Al9��r�}x�<(S>&�&1*7��7���M��g|��_ڞ"uߔT�|�$��;��VsG��掹7g����ݬܡ$ͨ���撔+U�v��|7�fIJ��
���ݘ���߰��
�x�����{�f����<�-7�Ϩ��9�攬'�K�j�,��5yi3�X'ʦ�yx�|D=�5���Q�UP���;|+�O��HB��f�O�P����D�T����Q�G�Y��^V��S��:Y�:�h����wZ=W@&�^Wϧ��G�O���9�:-E�ʥɏUH��L����O�X4��x��f(�
���A�f)�7m�w,��rЎ�/�=��iGv�<�.u��\�e5��R���M���t�\�Y��C`�s���jg�>�!�Q�4��Cm��A�^ Mi\XZ\���]J6���#y۔D5x0�C�b�>�U7K~��.+k�R���d���G���=	jp��Ж|���\�OS�&��T�: ��]j(w����`
P���5����Fݏv_A\�7�e�m�G��'�!����ɾV�M$?�"��Z������J��8��^Vz�1�C�!��@cs遷r�Л�j(i�a�N}
�^C�KunM`�T�͠��Ŝ4��������Ik6'���$�@�A���ct�Et0���h7��	Ҵu5ܯ�T�y���3�s�;����D�;��>���j�#U��ݐ��$<'�g�sXcb��𩎏���G����2L�衼��X?Sԇ�[Q/�F�Xʂ�xB�=wI^�A��"�vټ��:>��Ɂ�f�����Ř?�_}��6�ǥ1ŧt�p�~�vԎj�~�tbQ�(�������:�,���H"����n�^q�7��3�����4��oNWCҾ�ffSC�(��IO�}�j�+9
�x�/яu��n���Db+�#���?"�C���g��拍W���{���h[N)�G}v�Q?�?Oe�X���R,��W9K���T&`�L�z��V����D�G�'�">�7R[��F��{ޯ���%�Ⱥx:�䋤A̷��Q_*��M����'�� �~��|�H��AW���/��0O��!<�w4�A��7���d���ҩ���'?\�ѧ9����ܧ��
�f�s�q�Dw6��F���*|l棾.�.��.�>��l&�k��^
��ĸ�%�-��M�b���q�I7	ܛD^>.p���!ư�-HS^w'�9��nr0�x�Yz�9�����d*φ�׌�&_b3������Tf�䲃�(g��Փ��;G�߯L������h�!.߆x�G�1rq"�F�YD���wĘ3�u�a�9ҏ_��M��6�#?������\ok�t�ċ��������O��Zi\��}mLc�
���\ǐ���K��3� Ňv��u4G��u;{��&YmYM>2�yR��:rkKr���۰fx��s؟3i��n�[��wJJo�����ϯ^a~4����sjq�)���D>V�)��~��.~��ʪ�]n�&7�:�&2���+f�
>K��:t�V���{�1䉔C���?L�P���#�G�������1Q��<��A� ��^m@��GA�����q?�а��Xqn�e'��p~�@#{"�/�OC4v�� ���]DC��
:�%��;���k�+����ns_4>f���σ�I�1�l��2h�~+�"����4�0U��(aC�y���]�SN�&oۻLi����4nA�?I�"�'�����rz-�B^LI��>�������U�d�r=�(M K���_-�H)��")͑z&���z�Y2�:$[3��D���?Ͽ��9�l�&;<���5��#�g��k7f=�>*Ώ������S�|�8W���hV���෍�����O���l͝�3g���f�.�2û
�+1��J4��o�*�G0��'�͕��D��2T�ď5���O�gJ��0���J��'p�R�%��w�7L��?�A&�%�\��3�u��.���>(󑟯�-����(e
ѷ}��PF9���k���p��ř�К[@�%������,�<bHu�I�a��dI�
p�����4�Ζ��ā�߁_�nz�	�5�m{�IC�ƣ&�x>���n�?@�f��'��h����<m|^���K�~nӮ�N��"�|	�f���2��o^��v�A�Q7� +͍�m�C}������2���~��Dڳ�\����a���8�Q�OE{��~�;����+�^���H먜^Գ��\����X{��d��U��0�m(�V:��b����t�	�� d0mb�%�?2x�ҕ+�h�R-���(tj�f�'��rd�k�E�_ؿ�?甄=~��%�W�3ͫ��r��x/le�j1~��?��~.�e}=�.�������-����*	�9E[�_�������h�}�NSj�������.�m�ViX=l�9֝��I]��'��q�R?6��l^�a�X���J�[k
5���=��d�r�w���Ёg%���p�Z/A�C�S�8�%5ZX=�y�|�I������*|.Y��lܗ#�����f���+f�5(|��rsUt���.��ă�kY+|�4(L0��>�����\��i����Å֕z�Ÿ����*���?7�
2�jE���Bm*��NԿ��g�Tމk���x�E2�;�Y�d�d�81khx�=��p
'q�&�ҨK�A���o��o]鈽�#��+g��A%�`[Ɣt+�<-��
�%�[y��ẜdj�+��9�L�]���3�y��Ǹ��ϒ�U����~���g6���2;�0��r_���Y��u���C���K�e.�P9��Erwe�4��unT�������.�y��Z�up�	9Z��k��9��ٹ��:Կ|�A�)&�W
�S:�w���푘�LՋc�>}��>v'��U��ؓY}�Y�TI�v�d��^���fS�s!1D6�-3�p�yv��m�����s�I�G-�[�Ѻ>�(��Q?��dS���Yn�K�y� ڛ�E����ҭ-�Lu����၇�+r��:�͠�����W7 V�m|=��֯�|���:G£��c�*1���Q�/�G,V�
���nc۝yh����1�6���5����s��P�j�����:��9�1�
٢yW��k����8�r�|b(^;D�#�˺�o�G�׎;>>�v� �������8�7"�<;�{�R���t\
��\��D�.���%̗��=�|[h�+O�0��-:�E�8٘Es���<ޓ��yR�����ց���x\�C���<|7'���ݸ�1l9�SI�pjd��Lo�1q�x�h�'����c�&i�ZF�*�����������c�<~}:O�+�f��f��R��j2���3Ŝ��y�
�ŏ���ᶊ���Gc�IU�Ɗ�(�<�Y�������]���\�(�|#��WҘ�"܃��%������^|�4dn����-4�p20x-k�x;<�5�/�1��ļ��YjCZ�Xn�|��Hb(���:���/�a�1P6O�H����}\t��o���C�H����,!���=r[6>��@���j$�њ)���s�Ě��|bj��0�q��Հ�0��DZ������+�������huBL
��}�1�ǃ��	޺�p%8okp~*G�s)>Zo��/	�#�SH;t^��Y�K�6��%�d���̓V�ñ�,�;��?g^��'7�n�^��E}?|D�4��>5�ȊV��A�+L�v�C�}��C4�m0l�װ`�@�pxI�p� 5�[�\%��D�*9t~�9n�7R?��������k��И7�4O�yixq��E|�t�	�_[=����Ǒ�*�����E}Ue!'b߁�j1�I}�'�����
3�*��p�V�"�ll�(ڙ
"�J#�=�b�Ex�!ۚ��E����ô+��)G�wk|P��!�C��xy^��y�0�97/~>��x��w�
^$���M�5�?9v=��Nm�#V'[Ev�V�ޫ�^d���Т��#�4�)��"�W.���;>�3Y���J���(p��b<�u���9�"ˡEڜ��͎�ъ��5��1xN�ϳ_�*<o�ϕq��e�\��z��_���oɾ�!��W�1K�tVe������sfYM��Fm�P�M��Qe��_ϖ��g�A[fe_~��i�$8�;M�?&�k��,:t�k$����O��+)#�GhNT��rOg�I���ACR@)�Jo�Q߰bb˕",�E�|.e�ԊG�i��˹��Zg��ƷX�7�O:#�j��R��2��M�f\�P�y6�^8k�d^f���}�	��ݓc�=�eG�&�9�|y|��ߛX��������pu�qK�o6����I������7�Y�JtN�蜌�8�Ɂ;��p�[���Z��\�7mu�N�Ic�N�e���ڮ�ۛ1��?O�wR����o�7�l��of�ޠ+��v�����kt�ơ;٭���=���uTkto�!H�?<�y���t������w&>�s�Lk��\��]܎�4��Uf|��۸��?0�4�N}�r暹#b���к�uZԮM��5_���U}�:�Z2˱�74M
�ƒ�ߡ�v�����"8�V��x��<3P��Zi.�}L��5C�4]n]�_R�N��5���k�+Yqhꜭ���c�iZ��4�{�o��e�O���T]���)�@L_����7��#��̷��:��E��Pm��ƌ�h�;��X��]�?�6~�J>;0~\V[�H���|��=��̳�Ib�e'xO�RӉ�'�A�N��W�'_��Γ'5�L�9�4���h|b0,����2�2
����XCx=����%�ȡ��������<ń?Է�,�8�K_�e���/b�*�u�:ю���9Z_��1���&��8����R�-��/._�^)Z�O^e�����g���I�;����b��v��2�?hP\��DJ��t���E���X��k˻��oO�464CZ^"%��9k��E����V�c�4f�9ZD���p�S�?����msgt��� �5x%�l�v���AwQ��_���3i:O_U�{�&8k�h�~���&)�Ma>z��x�:P�M�OF|�.^�v�#���z��I�m�V��q�h?PxIc�-hc�e��i��m��7¾���NRC�5D�;���A����&�y������Q�A�߁��{o��Bz_�-�1�獀��&����_�y�������~��²�#�u�Y�5	�/��5�N��[x[R��,1��]����6�d�5V�`�u,x/�����]j���H^�6a_��I7����]zDm17�Cs�<r�4滿n��w2�}ڬ�d�ߖ�mxa
�6�zZC�8��wP����8+���iV�~hd3?Y���������Q�WEs`����rb^�,7VJ�ZL��z��>���bԧaW\x�:M

,�hw��$K��[��Bk�V�����8ϽP
�0$-[�g�4sa�B��jGo`��|���c�c�7�u.��n�#_�}��{�;��C��+_A�
�4���a8�yg���%H�t�w&\@�!���t��|�`>���~���wb��
����|�zqz��kt~��c`���Jƨ������Uʊ[���%+V��<I'/��\^ܸ��ȋ��aa�d�'ίE�+�@��D�O��� �''��?9�H99r)�#�o�����L�+�D���������ȷ4�7^F��2r���Sn{h��pu,_wk2��-�����@<�+?�t�����#?���ۚ"�1�l�ux񚯪
��J7�|���j!?��V���uu\~�FmM���!;k���Bf�!;^\+,$;O��5��ui��$'o3!'�1r��C���IN����Ϛ����ȉ�P�U�m�Yȉy[��x�x��/u����ɫ���M���'4�x(�\x�ؕ1r�4鯓�����]�ˆC�
�+�����dCV���y]dK2,W�%�N #'G��)#E:Yd��]�7^F��ɈΖH���)��<��Ÿ����Ȭ�֝3�>#|{�X?o�'�˕�i�ތ�4�D��\h�gF�-4�����sb�����<}�Im��Gc��Г�S����СZ�+s�}n���s�>>���olL�S�qCVy�{P+�!Ķ4�f��W[vl�TG����I�r�c�e����R�">@�A��
49�2M��"m!
��[�FmQ>7>��ЯV�GI�zԎ��[��
��8���pI�.�Л�)�OHk�Iً�o�ǂ�.�A�`l%��WBi����fI��EW޹aQ^5�{�t"N+�K�'X���9�i�u���K�K���d�TO��I�W]w�ϴ�I}�I,D�o�
\!��Ͽ�i>3�QH�$/�����9��eK%�d����e��H�ߜ�?���h-Vy������o�Ȫ���9=mV�'	{�\h,��Y��$ޗ_�'���A���� �oy������ښ�Ѻ>;��[5~�|�Q=���R6;$�|���o�|e��6%ʿG����C;��_��_�W�?��������)��z���?�?�k�����Y�ߍ:�ݠ�o�(�Ԇ(�gB�ᛞ�Q��!�ϵW�G�0����2��8��*y������x\�[����/�߹�����(������_�1c�-����+���Y��t��x�,��/Љ�g���~�Zs"��	�u�v��?��n�4��ۥ�K�aXM|=��ߝ����rIS����=��M|���,�)�aƳ��r�5{j��%ï�K�{�X�Z�XBk�Y�ɷ�Y�7�X�A{{MI��u�o�2V�6���^��#��c	+�����6'�y*;������-�w��9��u�'1-
�H�3X�_�X� pQ�{]^��Z��e����쩤�`�����o��PLP��!FrW��v��u����K�H�V=A{Y�\p�1�ub}<���x]ܧ�2���Q��-c>'�E}�g�*Ώd��4�U4�3Z^�(�$lmD~�l�4���y�����xy��o0v>"x~�dS��s�G�W�{?N����e`��gq�gq�d3qT�-N�ݻ4-���Λ
;�6�޽n���rTF�޽$_^��?<��Q�m{�B�ʭ��һ͐�xzt>���h�N�n�J=��U�Q�&�
1rL�W�{?N����e`�ˏգMb��(�|��]D�b�?��~X7b�.�����LV�ӥ�����1�K뮠K'�.�i}��ֆyц�!]2p]
Z�.5�5]r����.���d`
�q-h3�A{�zD{O���z��5y��%��rJg�̖�Cf��C�C�צvM��cu��|�}�Y�5^A��\��.�й_\���w!�s�MW�s�\�s/�5~���{�&�[b䞞���~����җ�w[4��ͣ׻��
�w��N�_z�[��}�6�SrT�XT�uz�*]^�>D�k6h{%jm���ޝ�ѻ)S�w�2���
��<��>er}�d��.ep]�ϟ����$ʥ<�Ώե�7���M2�I��M1�L�W�{?N����e`�ˏեM�.����Rl��;ҥ�y��C�c
�c
�V��Xgg���u��j��MkdĬ��kX�/�
\�%�F%�G�="UQ�`����9>7�U���]�D�=���׺�h�8f��ߊ'd��L���]A{�r���"V��!K��BwB)�)�W$� ���	�T���7��3~V@~��_����g���l@�*�hJ�Q[jVJ�
g�;�ޤ�o!���ou_'淚7���Q�;Me!ؖ�N�;����6��Xx�����2�`��KƻZ�\���3i�
J`���9i��U�\��V�,���m�΂������Ҽ	خ�Z��5tz:J��V��1�g�.�v�54�������G��:�ը�Y���O��s������^K���7K�y�L�T�I���
��"y
�����l8%K�[�	�+W����72:;v�z�+�d���+��]�|�<��|X���
�QJ����#��%_e
�|ČK�m�3�7��v��iKg<��ê���M:zG� ���$���Z�f�d���n�=����t��+�ba3�2B���ɸ�8�
���F��Q��)Ko�7�^O��T��i�[�{�9ź�P��m��ppL
�fO𝙴w�p�FԑdN/�6�5���X��m��?�:���V��I�b>�wNf�)4� 0:�`�~�yޅ������i|<6ߌ�֡�y�m�k�
�V-�3�%:Q�����f�?�G�2g�W�6n��˔t�ⴥ�1�#ii����_�q���W��-����"��l�Gy�7��~ΐ�K���(�����N��0HC����;�ls<��Q^j�����ٮc|.{z����ʯBfH�q��;��f�g$V
��\)��s_#�U����ْ���:T9��-��|Z�a��Ӣc�>-��%xv��٧�w��g��h]�D2T��2��P1�����	d�82�p������w9R�ɐyT�����:J��P��{���.��}w�wc�eM�.�n?�[O�Er:T����j�'������
�ND+��]�݀�ކ<�]���H���]^?�C�};�޻'�7<xr0֏�y׏���{-��ٞ���C�@���XP y������	_�����=�9>�5��~;��e��%~���A�M[��ŕ�QWx|��*㐫��X,���w\%����I�9Ah>�^����^���m��!w�,k65J���	-m��{ڥ�5͗��_��΢�E[�i����0��2�����
K���o#v�~��AdիGnm�}��H]��=��9</'i'��OKf����bj�#y'�3W�����>�0V�M��\���k"x[�T�V�v�<D{P�תŤ��L�b��+*�=�3�I���4��Lk�����B����6X�8��-��uRt��@�
c�7�-?������hqGei��$l����Uo�ݢ=���Fݴ�6l`A�i5Z��t��:�E
�����_*��])�����|�����ՙ,:ϋ�
��ij�Q��,��,*'[{ɒ�@_�>�:}&�Nt~I�N�.�Jt�:��V��zocc�M��Yt���<�3�zG걙E�qS�z��G*R�	1�V���h�P�p����д��=�z�rv��=�G݉�}�Ԇ+��u�V����IO�Hs���w�/l&H�}������{���j4.ѭ�� �'��kӢ4�u���Od� �[׫�w����x�.�yѲ��fh5����/�m�e��%�]��Yh��Y�Yi��?��؁v�.e
e,��Fk4�Sx�+��1f)��6�?��g���ޑp�wI��>�x4��ˊ���i����V=�x��ȋ�z�������U�`,2к2F�w�Q/Z3Lk�~7Y�1[d`��E͑ufa9{���
zh�pfwQ���h�����<osfw÷s�Z�����k��~�ታ6�G�6�`�%z*��㯥&�m�p�@�}F��װ���*�>��V��N�A��.�h�u�V��
��V���C�P�F�`�h���Zu�Dk�+b
v�=:���4�գ,C��Z�
����8k�#t"\�8t���m�=XE{��ձt����%_��[&��-�a�Qw�B��h��e��-�Ggc>i���'��$߱%�'���ly��R�b����݇P��[�Dz5��3F{�������xߐX��:���ȯ%��h���Y��]��0���e����o�О���R��M��Go��Itv�Xӹ~��m�?4ྥ�Ɍ�9#���tƶ�c��}�=�i��:��x>�g�?AZ��!�Ŕ��5��[�Q�-�3)J�����&���ߛ�O]��C::����[::�\���':�8�E{���:z�ӱ!B�����WE��w��/��Jb]�:�i�0�%�[X}�%�'쬓�4�/��J,c��rO���NM�_9�J{�8��F��-����=����9�4�^���<=�~��D�>v����!6.�eV��uU
�?&�_��x����m�ͽy#�Gڵ3+��d�X���͒��D�
��}�s(��#�֌v7T�&�6vJ�e�46vo�1����:G��K�ƌ?H��xB���D<5�›�0=�bD�vhg���dX��n���	��q��{�;�'�`��p�����u�hOc�䳎��q昲ho���mf�ݤ�/��M{e�sY0»��N��k{o������w�}��}B;=;[}���>��Ͻ�;���F~)��h�� 軔���M�9l��1�CM�pt��۝,��T�j�p�R��,�6�z�'�3:Sł�!\
VW#�dh�|uӐ�쪣=h^�<u���ۧ6�N�E�4�C`$��p8�����2��q�g��6ٙ���������5:�L?��0Ŵ�h��o@���<�;��2����v��΅����E�t���0:H��?�X�
�>�ܖ�w���868�z�����ް���:8ԯ�Ë9�ް�e�7�D6"��R�TQ�kȣ�|>�q�����g���9ض�Z�Y�r{�"v�D�l��hG ���oҞ23h���"��w�9K�e1��RnO�hύB�%�'�!��'�Y�C}#d�m��x��s��ѽ����S�sQ�~"Ht�3��8��z8�SUEN�Β~V�<�w�~�$����@��t���ӵ�5��gRY+��JRT͎��ν�7U�CQ��Y� �o��H �� ��Rw�k���hl+ߧ���|��܃�7�;vF7�aRt϶q���83p
1m��
�L��!��yO�n�5]�o�ʊ7��8��>�Y��Hg��y��1���7O��Y'��s֮�wo����Oc�ʦ������h�.~k�7��w�Yĉ3���u8��y��,\}:{����x���5�,[�����oq��;�c�#=Kg���^<!��Z1.��
�#��1���f�ߡ�f۱UCݰ͏�j�R��h]�U��,�w��4�T���:u�+,�,��/�z�wi�{�ᩬ�!���y
p*7	�f%�}poC>���ʐ,	\�'Eۄ_�m�ESB�J���Fq4����v�r�Kktn��ކn~G����[���q�	�z:��;ߩ$[��%d���;+)v__&xH{%�>�X��<l%���ۅ/
�e�r��6<RO����\�|:�;B����T�Y�������W��t٤�2v�(E��k�w�1���$B?�M�UdOeڗ��j	|�c��oM�<�:��W>a����<*�O}��p�w |�K}���
o�\�T��s�Msg���M�r;d�����M[���޹qehW ��e��.����&o3�J�n�
�
گ&"��N�n�I���G�b�
<8ld��0�^���_��d��`�k�I���,��
&:��6|h�r�+?��K����\���F�=Yҵ�]ר�
��t�c�t�Ȁ���
k7m�9�[Ր�nm����'�\�?��V�o��Uu_!�Y�o��^�O�${d3����ס��]��yl���ivft��9�pr�G����A��AW���<(��˝	�<�Y�<��m�eh����쮘�9%���;��Ǥ��>��BI��ls��q���?�΂'~(��L�+�-�������ę_L��u��B{�.*���K�Edյ�Ǿ�����%��|���D��M�x{��EĖ;��ֲŽt��=K����e奋��v��-�^�7�$���ϵ˖!d�M�Si�B�r�rp��O�i�k�k�Q�C��"S|��2�G��ʀ��0�|�Y�~G����t5xi��9̇���<�u�o���{�!:CI�X1ї�i�,�'&Ç8��3L|��W�û�A��[�6�!ڣ"�H�F�}�%�X��{�|_�8��j�훐���c�G:KN������������[��w���K�Y��g=w�=x7X�v�5*���_W�څ�;h��e�=�y|X<�c��q�=#�Q�����I���f�d𭐬C4g����,}�.��xh
&�#�����I�3ä��pݛ�NS_��$�����Rv���i�\��O�x
d�	,d3!��e�M���}�7�T�s�J#���֡�T�
�B�8S�rK�4��:=��j���m�vO{������LW�	uI�T��G�Hzp}-E��n\7�G�F9����xqmM�LЕ��+/AW^B�<�ӹ#�Sٙ*����T1G�0;SD�O9�U�G�
���E�y=ோ�G�%����4�E\�Ħ����|t��v^h��c����3~��ێ_~�2������#�xf��m4~?��n�@d�x�W�VО���<�����ŃA2ك>�F���Ɯ����^�OL�i�x*+�N2/S�lS$�+��Ⱦ���=
�FC~�3؉�Y]����#�{t�F�M��.�}�����/d�O����&�b��f�h���;Z�YL�=��V�b�W}�8_v\z��8���W�4;.�Vm{�콆��%�m|�^D���hᅼN���h(�}��ћ@z���8D�}+,__''p�a�s�|y�����명�zg�3�R�R�.�&՝���_�[�ބ�bzG�N8E,Xt�sg�>"U��`,;���O_w�=(�a��T���a���
���2��S}k���P���̉h�/����yD�:�|�ߎ�.N�=�c��Pc�X��~\)�q��eڞƊy[	���6y_�wLvhF�ɬ9�vM����ܙ,����}�s<"����he�	b��A��mWZ�[��U4OЎ8�Єxd�C�Q��
/�i����gQP��J:i�N9�Ђ�ona/%?��Dbg‘ڟ�_+��jq��Z{d���O���)���W��I���8�l�����h3����}��,�g��>�'�\��R��DE��${�)�G���s�
'�'@�/&�~}��f:{���7/���p��wQYu�My�vY�rO"���$~�Y��W83>�߄`��}5h�v�X���&�y�	���7�5�8��Z��V�>��;����D�Fv&�=��L��<f�D̘�c�H��?�/�����Y�̛�/��b��pK�Yƨ��I����/�~Q�M2|���>S��jqD�գ�`�4��#�L��0�m�y��\*o{���mI�;'FW��h��ߗ'(��xe?���G�^��]��	��ٗ�	�)�S���<��6��Y��+�aJ�B�?��O����(o+`l5���@�>|�,�/9'���g�fh|'�R�e�`D��ෲ�W��%HwV�5h�HgQ�3�J�H�?|�.�s���B�y�G�tg����R��Dt��p[�ֽwhtZcjn�����%�>@�u���+�s�8�j���V�/�$hGp@;�&�n��U��#x��w�F�R�����t�s(�#��o#]kBV�[q�H�-z:�
:�Y�t���/��G�Cr;�SC鴟.��N"����fl�.f�fl������U���\�mF�+�M�@o;������u��uV`;�;���L��}{��.L�gk��xU������C�f�胙�p��_nC܍�����Q8*��F�p��-?��g�\����t��M�4~�4�p��j k���3z���}i�♧<~��c��S�X{�iC|�:^��_��|��Ξ6m����F�=�.��f�g�9�K�앥��[k#���@��ί��0��#���}�~����!)o�x�RlN磒\|�76|�Ξ�E�(���_�����_G���=���eY�ߑ���bN��s�Ə3�C�ґ���V@{3Q,CgޛGڽ�?A>⥠_f=���8gb�jۜ����[��z�(V�N n��i6��u;|V��׾ѹ̴���۝�{L��h�=�$%����hJ�}=�ǧ�H�ڻ�d���]B4���5{-*�k�,��X�0�@6�1�ʦ�=:��ޯZ_T_='���伕��Rk�igVR_=���+�y_7�E�eY�JK���x�H�5��V���>_�s�?����\��������9����,��U�Y�����rԇ��|Ґw|=�{�+�ؾۘ��t8��	̧�� �2��YW�C���G>�!-�,_R���
���oNB�S~�i�vNl��c�tt��k�}�7��R,-�;��L�s6	8�t�#��㍈�x��<������#����1]l�"��<�"�k��� �-�?@�8J���)�W�����_}H럋�I����k��>P�k����B���VN�,�>'�n
�~��qS4n��M1�� |�m�y�������R��)�(v�_��i:��8}L�c��SyXW�<��<�;-IQ)��6_J�ѹ���׆�Éf��9�|�{�[��wJS��o�ށ�S
�ש�_�J���S����~�xeN���Xq2��*��LS�@��F�	�o�<+�����6>����{��W#l�V��҉�C�N�Ӆ���p����}l�D�~����5��<7E���Æ@W���ϛY�^�a���Z�-�L��<No.�#�W8������������ˑKv����R~�'l���d��k8���w����
!����"�K7�}9�7|��q�	d��Z��%��H��׶��UH[�6&���8뗟u`a\�u�q1���x7�{�J��J���)��ů�&��>���pz?Z��G��c}
=����Mg,�	��^u��=����7q��/�[��5v�J�Y�����9��sd���σ���4���1!���l/��
�t֥BL��dPC~��)��I
5��=����j������v�Xu��ٛ>��rxڬz;�Z��R��[���wI[���C��W1�����#�xj�~��V:�vc�� ��D�@�.͋HcKd�ߜ�ޜ���ߘ��L�ػ�I�iҨFx
��m�\����l�QRx_<�@�����.��e�mG��Ҷu�X���wJW�4'�㺃mV|��a>���\--�#Xf���s��\Kc5�4^�)��?��-��jf!��b���/7ϛ�mh̝�-]���L�v�����i��?�	�k��v�$�=[���VB,{�mw®��C4'��ټܮL��\mF����+
-B�H�Im&�-�2�J�,ZCeAz��8���y�k�O��w1\}��8�߰����icd>/0#pxO0{�?�Ys@��|=�d�1o���|���k~#��D�-ٵ>�[�i�m��X�o"?�\�qӹ���F�7߷S����v����;�+��M?Oe��D���r�ٝ�F�4*{��-�k9�&���Χ�����'���ǸO�۰؟g�|����c���7��.�qS��8���a{�C��($޿8�3�/�h�}�Ϊ��G�����/�"�K��尻~���>5��p�����3��S|�K�Ѷw�x��ל�%�}�i<a��wn	=I��h�ϩ�vz~�������h��~�o��<�Č�#�On<z�sh����m�rتD�X����E�G_�-ɬ5=I%<;cc&�I��������ҹđ��'������:X��`E���T�/������TG�_���T�Gs�9짔��`9S
k�ͯ� Od���,vH������1�9yǻ���‹��{Ik;%~~���E��u��o��l�~���8�C���4��֑� �,�ۀ��(��h/�/��]|?��Iخ��֙���M���§��tJ��oæ�E�a��X��l_x!�;���ƶ� b�yȓ�<�~����go���}>iP�2팠9b��w?[N>��˲x��?�~FZ��/E�{�̖WD�bQ?�$�e��lFٴ���ߓ��9�R�v�����۴�'�N�fhIt���kA'�(`n���b-5�����hX̿��lwƴ�^�����Kkd\�ʖ5��Z�e���gI����1���&�X,e�Ж�l��I�2ә�4���G���直�����;){1�j �ř;T_���~-�.�,�s�2]t�f�6~������[YK#���Rxu��L�F��|�uސ�l��O����q�����]�A�}n��oHb�����K�_@�$f���8�w7|�� ?�Y/2�
N+�s-f�u��^��(`�h/:�k��/@��?`��6M2�nk�x>�s�i��&b�����$\O����^r� ����+e�cI��yJ��ɸ��4��,�������Ӵ�Ӗ�<�ƶ9���9�}ۜ��ﯭ_e���j�]~�W�����i�����ϭ?n��s��sI��~~�,�~��~��a��㣪��gr�K�=u$�TH �=f�bk	�j{�%ȱN=�DP��	�KB�e��N.�$��Z�2ZKжD[A��No�@�{����L&�s���G>ٳ����]�z�w���s����*�U�Y��Y���g�g.�-��O�"�}�B�j㜒�)|_[���)Y8]��|��x�����i�Ҹ�����/��B��VK�~���g[�j�[��Xl�9���l��?�ʰ
���v�?YV�ڒVЮղ���<�5��^�g�ڲx��e�w��<CH;j�!�g�%�Y
�7��{��Ǥ�G�C��X��vA=c�c����$�|�] ~���>�k�:ʷ���G�*[8��.�w�cyƲ<��"��M�t��d�����O?Y/%����i��Q�\(�9wfr�<爻�Z�ۤ{w򌳨\�-��ʼZ�<����E��׍s�1ι�hu�1�O����9w��s+p�eG�s?����\�����k���\t=��c�s䱝�.�Ү����+�k�v����<m���Sh�w=�j��_�h*ǃ��B�����]����-hǓ*��j<�b��>t��X��{�?Q��Ƿ��9����9$}r܁�rO嚄�eb�K�kDya���ͷ�,g�+����s������o�`��o�v��_z�6↝�ehwG��l)���>�L���
�C�m؇��Z�wB��~"���w�`�D�SY�������G|���O��w��I�2}������U٣R�e��MDw�]��S�vΥc�E��\��(���W�E�ӟG��6/Q��:[��=�f�;��;u��.ҧj�8��o��=��ܔ>"�Oj�����)�lO/�F�׮5��8�7K��vs+oԇ׈��u�:�?λ`�s��3��1���U�d�|���]2�{�ϵ.�o:?�XZ��o�d
��ܩ�gP'�ֈ�n�#	�[Z$d���(9y�ya\Z���l�3_�:���_�Ifj���C�.�S0��0�m�4�ˡ��	g�?��F�
cn����TI\[��jy��?��dq��mwHyC�(�tnv���f	�Uc��T��~w(�$�vyϳ�ǚ��J]ʱ��m3���f��W�
�=�rrϛ�H���.�\�>��-���T[2*$���7��w��z'E�7ΘOZ����Zs�W;��z׻����n�����~����z��׻���='j����z3Ɠ97�+r�S_�'���u'�
L
�u��~nԙߧp����]�I����'DI�2N�8A}$�L�‰�0N4,s(��r:'�.���Ǣl�&5�]7>I?M߶A���Z�|'���[*�op�"�Np'����-$]q������.)p�/LjMgI�18�$֍뷟v�Z���b��2��h����S��7��N>��b�m���=[᝴�E�N�s��)�c3�Ϩ�e^7텵$�{�l�e���;���:	�Y�}�n�r
�
������*�ԨoX�ee��w�֤
��,m���?�x�Yr*��z��8Ǭ9�Fj�s�9Yҟ���W�!��W@�ٗK�׉�E���|�)��
:Oݲ-�=w�fsלR�
c�O>�O�y��
����P�Lc����\e�\�q��2�n���F��:`���S9Q�J����<�Ӣ�?E���s��&�"�}Ɗp/����s�)��o#����cQ�}����1�mܽ��Q����C����4��4Mdܓ��Q��$Q���7W^�]`6����d��1-ys�k$̾e���30�7^"
�_b��
u�g���`h�����w����ѩ�351k���F�_,���K�Zɷ>�8��Am�+���M��W5璏��-l#�,�2[_�3�JoC����͔�l�,�ݠ��x_n��>%y�	"ȹs�ܗ�R�g��>�S��-���>u�~+W�oqΈ�@Y�U�~_��ls:��9�+����w�9.�SFD�Z�����ͺ����=��)�ODԧ�7F}Y4��Laܻ8cr�v�sw�#np����z�wҎf
��}��y�%\7�[�\�A~^��<�
�j��^���6���|y"[2�x�9��6g*�iS$�ę9��e*���f��3B�#���B�����ٝ�k����j>s���q짟�/;t�j�)��,�톟p����8�l���g�
�/dIX���9�j���H�.`=��cb$o� �7�k��ZƗE��1���<��'!�a��W�87�qnz�lyN��U2���(�E�ԕ������=���������KŞ�0�W�X�6��}�i�l��=�~��熈����I�~�	�x��VũR���\���k����<ѕzgdW�n�oUfB~mw�~ݒK:���A'��|a+i~֞
�G��&�g��{,^Ҟ	����胔]hⲉ')S��+��i9�����f<��`��3X���w�M�ܲz��L�@y���N��޺i(T�xX�h�'�1�C�1�	��K�/Ƙ�6W�s`ܟ�T�C�ZS�>��>�if�c3�t�Nj��x���0�sL��iK���g`�
�	UkMi��tMŹ����!5gڝR�q����޼k�B}�E"��,t����rg���"�M���3�/���<�pL���S_�����{s'[3{��Tv�c�z���q6�
;�	�ڨ�����I^�"�"�'�&�3�Hu��A���ZhScm��2i5���P�*�o��*�V�Iw��4m`
h��ms�>�~��̓q�g�����D���i���,b'�e�[ഌ�A�K��	8���6X���:\���.��;>�b�Ĉ��1��d��:��yA9�%j<�a�8)��9���?dL�H���/��-�&l+9���������Y����G�*�Ԕ�Z��܏=��x5�9�Ɲ��y�8���Ѷǒ�ƿq��I�����xo>ma5טq,��C�&���x9�̭��l��1-���+�7s�{Q�[��
�x+���Z=����%}(���ŘϮ�x'��c��%��}h��*�U�E�*��']�b�\u2�|��yԒ3  �R��͔�s�ټ}ӵ�:<߿$���u�����ٞ�LOv'�*��E
�-bUe��
�3![�V�S��ې���$@}����=f�yr�a?���5���YʧB�6َe�/�e�	O�3���j}���q��ʇ�]4d�k��5�1$m~e;31޾�e����v�]���[o��<�ծ���>���Mhuh���8�af���M�]��X
X#��|q�Q��5D۳���d�_[�,m���&��w(}�o�f�'��:�-�6�'hVN$]c�����s$�����U��˾�}ɘ*Q}�}D۶\�<d��{Rwb)s�>
n�֖8 �X�s'�W@���8h�w3�9k��
��q2J�:���X�׃o['�޲�޴�@��?��5F�!�o���m�<e�-��M�Ⱥf=��sḠQ�β�!�k{j�0/ڨ||^�4]���Hoyw�o[#l����iN�_�S��쯉�<?��_��_���%	f�m�
�X~3j�������U���'���<L��zp[���v�ߟ�_�9E#��) eu��$�}�&���'��=��w�H��K�c�!߮1�rc���;��#Ƴjx<n�.����kk��$
�&��u�����n�%��+>h�r���� Y�c�xX�G��#.Z��W���Ģ����=�yV���lyY�������5�}`�Y�P}�+�-)�m5�ɱ�-�45���D:��1qF/�_
ĹK���2K�jנ�e�۱�T��(c�N���W�+�)>m
�ۑ-�{�� ui"���b�Ʋ��8{)�v��|#�2cw�ϗe�T�&�V�R;ЇY��e��tˬG��]o��J�%?Ȝ���CJoc��ك;��6��Oϰ�-�]f�h��9��Ee�ĥ�w1W��r�,�C�)�.��鴈����[1�9cC2����C]9�+׌���<E�ا��	u~pD�5��'�<c�ksq)�놤̻.2�>��~�O��udj��m�]&���h[��G̵\=W����gG��r�|�'��7��R�}t�c�vNG�W�y��/����k�w�U�n����g1c���!�����Y�x��?m��*2��B!K�b��uɻ+�O������'�6���qx�c�0ȋS0�a��+���YA[�v��g,'�Q89�ļt�?�劍�VG]R�8J'��c��-�&7�vd\YK���/������3h�2��p?�;e�%i?�1{��-������/&�h�}kT�mr_3��{B�����w~�}�99�����y5>(:	�|��'��q0��ס-��
�CeL.ҸT�we
���ɣ��E�:?V��r�K��D�-G�m_^�x���]��wCN]g3�T�T��{��,<���{.Ʈ�ڻ�g_|�1_�c��Ц:��Xص�5C�f����w�U�f�M(G�@sB��	��-���s0��Ջ1�.s��m����M�xƿ���>V��
�|��9b�	#���i�Ց:?�[K���d��2}E�*Qߍ3�yK�����}Z=}�J����U3���9���,%
���N��L�	o��Mo�'�H�q]K?}�͓q8��u�O
]_���чCT1�O7�Z��J'�zR��O��yG�*��ݥk�V��!��dE�,���2˄�.̒{�����Θ���x����LE��.4�6��&fr���L��_���3�4����ծ�Z=㷹Z�����פ��&�Ю^���6d��xF.�d�`;}��<[��Ҥ�Z��J
2>��|�2g\��9�F�oԑw��T�Vv{.��e�z��С,�d�o�q)�u�ooK֒[�>
u�
Qߥ5��.���|���e��/�o���6Q�v&|G�p�t�v!���J��*��cib�󡢖\�M����<��_�
��
�2ި1��R�ی��2�t~Kʌ�Z�4îE[��U�^�/�7�ni:h7��I1��kP�:B��3��^0j������f���Z1N�`���RQ�݊��±@{�{K��_
Z�;E�k����5��o��=!`������0C�%�Hl��/b��'n������8x�;�Qq�����Y�@{=�¯����@%K���5쇙����M����X�ƀS�7�f4����9�{O�Z�yzP��c�k5������KL<��p�g�z�����t�qd\�u����xs����c�����D�<ɄO�?z^o���R��1���� �3�w�lN��&����M�}�M�܊�|ʔ_���<���3pvd�C�?��8}��g��w?��������G?�@�m�4��#�1�����ҙ/���3v���+�US��;u�8��
ʧ�l�q*��UtZ�}��?O�����Ak`=����?h`�?��o�Z��Pmm�>p����ӕ��Ϊ��#��>m�l�tv�����g2�w�y5K�7k�]���Se\c�h��F�=��b=XxV�,���U��Uz�
�HN7��b��s��j>���l>�a��soY�"<K��?=��I>������ա��^�^���	{������I�'�����D"�o��X&c���~�+��H��#��G�[�����s���xƭ<�dk�)a|O���y�v.,G��u�d��B�A�B�U~</���=�b�7�;�F�>G.Qd�s�sʖ��Ғ��T�ߡ��ָ:�W�\
�(�6�ۇ�7��MƼ�/����#�q�sNMƜ�N~2�9�{��<�2�Ti��?�-M���d��h��s��UsJ�ٍ9}uvk�N�����i�)�S�ӥQ�4'�:]l��uʉZ���uz����1�)���w��f�������k��2���φ�ӈ/��,���W��7���|�O~u����<�-�y7G�wE���$�����?ӵ�69��D/�*����#��}�;��~��O���{���gOO��Y���$Dp�a��/��VPp�p��|8�|4�c��z��:lWv�්v�eLɆ
��}�#��s�ɔ�2
�U��5��.��)��cғM�����<�s���dLˆI���%�	�m�/�>E9��{sU�]�?��)N�O�%Z�*d�I���ě��[�����Ib#���Qo���5깺K�m�0��8��
�'�4�a�-gCE���
<�|���7��;Ϳ1��V�j�7�pǧ��|'�?u�g�&�
0�N�,��\ ��y���_3cVL�(�ۿtP��N�k��y�rX�_X3·�	[�\��w�����"��9��N�Xqq��~�ذv�8��v��!k�>��Ap⧹���q�3|��t�dN:�����q�7^�1��e,IQB�]�E~�Q�6]o�6c�q�hϾ��G������=�g}u��=gCc��k����᧲���g~ِ#h��b�i?��|�Μ�Y����~��%�{}����'�lo���c��.po�yY5_o���x���w�C�λk�]<r�Xt֚���Ҟ�᫠gW���T����U��'�n�m��r
�N,�
ln�u��"H]›�i�zܚ��W1��e΀_�����O���$uqr:d�tѵ�����]3qQE����ĕ$Jֳ_1�TG��o�h��"*s/��]ͺX�66l����81���C݇o����S��(��'���Ey�F/g�#�_�����T�A��]�oUm�_���O]������N3������Ϸ�Wl��Z����T>_�Z��� �Nj�����H���?��m�
�f�j�}�$��C��]�XX� �;���������˝,��S�b���Z�ġv�_�RVifNk��FS��G�!�zN��9����pk	j�χ6-�S����x<m�E}y��Eui��ٱl����.������f��/��	���6���^Ǔ͹�xQ�x��Qg���s2�ʦ�������o�alv��e���g�W;��-I�ld9�Ok��־�SƖ�\y��F���c,ڥ�ƶ�_�#k���!R���ZӇkq�����ܲ��^��6��M	"����[�D��ͯ3��p����)���۸6����uX��s��le����n����bBx�N����{h��l����gK*�ߧ��j�7گ�<ߞk������^( ��x��S�xIC��������^H_�y{���9|(�i�E�	�s�}��[�hm4r����C?F#m���o����ç�R7�O���8�Sݯ�6�2&��O�m\<�b.�B����h��bQ�ע����JO���Z��V�M���լ�m��T�EQ5�Ž�+aS4�C�&�KJ��?�}]��O����޵&Wܗ������Ò r:V�o�U�8�K���O�ce��^iӒ���i��q�|���;�"ʧ��E�gYO�(i�'9��UxҺKlZ�ӓ&JJ�B�Ƴ���e/H=�'�ݻ�΅���$V؟�m�}���o��7�92�T�푾l���1�6?��u�&9�3��O+l\ZVc�X�=��r�⚙�9�Q�7�ߤ����/i�eVɯ��'�5Е�m�&����rԑ�B�Sz>���w�T��G�^�hi4�,>��~���,�gD��0�1Ç=����
���gk���-��V[c�;���{u[s�ry�{l������}���
&�����k)��DŞml�?�~���/m8H�x'x�B�Jѩ|�2ݯ���><��cK�t��\3�m\ә��GA����{-��{,j/ݓ�hh]�E�̕�}����z�}/Jh{�Zںf)x4s�9[��f���<2|�YS�B|�t�N-�qG���y%G�e/l�h�c~��c^��6��lR�,i��2l��K �<�H��Ɖ�h����
�E_����J�����o�߈7����������<e�C�͂:q�}����W�ݫ��k#tU�2^����ge�u�_���Z�2�%kcv2x���_��b���*�hC�AY�>n��e��OCy�~��'F�ۖ�Z��[s�]^�����޴����T�aȃ5�O���;�w-.a�:���E�~b��i�,�$
X&��CO�w��ǸW��� /�nD����5�1�w� ,o�ǟ����Q
uM�_�vǩ���m!�yΖ�7q�ُ֜a7����ļ���]�K�[��C���yh١~k��nZ���<�xH\����R���̏�$�	�_��?�Jm��-���qWC�]���5�s�z�X��Jr�Ny�8c�4��A=�d�{�6]���7j��g�#�����Zc�MTu��^�|�t�1�H'\��PV�OQ�%�sș~�4�%}����^�@�-Z���a�ÿg���Ҿ���qϯ1���K,F��O9�uC�M��i�2"� �!p��e�Ҏ-K�gB.�w�W%-갋"ґ���6	?���)�k�(�?W���c���W6�|ލg��1v�%��i�cБ��O�91�7��g�{���Y>d�O����֯�+���G���ED_?��}��/��,ށ�n�w
�Mx��Q��̝*e��a����Os
�"�nXNڐ[luN�{�zB�2W^sh�],lI�}��e�π��2>sUj��Ţ�*�ʻ�L7׬�qf"y���ǫs�`���G۫/��7��DI��3v?h����!�(�`'֮��k�M�u��0�<G���U.T޷s_�m�9�X�(e���h}�H{��̜�	��e�3ڔ���A�楞���ߴx�ےi^�N���4�"~��j�ڭVe'S��Xw���R7����gC���'���dc�����$���*���LV~�|�|s,���4�=
�K:<®e�]ڵH=�iî�+cص�_ޯƊw��X�{�<���i{�e���̣H��b���CUk��s*Z#r*ƺW>e�\2�@�d���#������a}1�/�2u��^Q<�xD�2wF��&���&�?�*�H�%�܊�B�gjD�K�����;��c���=To���ʫ{���9��_��������Ƙ+�R��`�X;���9C6�)�G�H��HZ��I^2��K�r��ɘ{�/�D��{��NJ���fV)��3��L[�w1�%��﷟�O^z]z�HM߲!�9+��m����N'��y��	k�m��}���)��̏J:�8G��
���<�j�s
zf��u^��7ԭ]�%���j�I�I%?@���MtM���Bx�u��(S�}τ�>מizC���F�{c�T�;o�X���M�0}���
����Ca��xm�m�b��3�|/F��Γ�Ġ�'/Vy�L��Fohӭ�u?m
�OhÚV��1oU�&y�z��M����ܱ�@h�_�M���]w��S}v�v���7�������]����;{���X��ȟ����ȟ]>5i3iV'c�kv��W/�?��;\v����c�8&�);��y�i[H��γ-�H}��Jh.sx�ʼ�b!�?�w���;��C��������P�L�w�&u�����r�I#~P!ϛm:�
�zp�8��A�zP�=c�˒O �"�h�뱌,?�(�3��࠺��}`�����\G��y�Aٚ�N����qp.gG�t����W�k�4�雷��ЦG�Uw,ܫ5�n�}��9��'���m<�1��i=F�b��`~�;z\��󣏝�
�?3�]��c(��:f�Ȝ'U��Qk�ʉ�kQ�x�����wFy�Y��3�Ŗ�Z�p-b��0�u��v�5�����X�iX�G���F�~�5�#��g��6��X�3��#�E/g�G}� �Ly7Lcw�W2l=��U�?��6�h������*��7U�JTw�'�r�6ߩ/��P�(I����AyF��̩gc.��2�����������2���8Q��a}�3�y�s:;-���n��ȿ�~��>���C�Z�kZ�&��$�=������X�^�6��!�1�O>�9�z�|��Ex<e�R�D��S2Z�{�1��Xs}=X��`\�MW.؟%�?�~��w�5{��8昇���k��2?^y�{�
7N�x�n��ݺj(T�e
�m�?�1��:,Y��({j�ڶl���}�Κ3	�;�9l�������~��t>�δ���GTŔ眳|ACB����ϒ���B_|�g��능/X2Zs��4��|^�?P~U��cx�y�w-��'�"͚��8�y�؂���$��٦w��2N�E���d��&���hs��_�w�v�'�ޚm��qb �������۱�m̩K��Q�K?W�/��ƙ>��y��G�]���ܛI�ՓE�=)���j@ֱ_��3A��<� ���kM�x���g�������cx�Y�/8���Ի� n�񜀛���B)��Tqk.���z��{�*��%2�~��|i��A�|��3��:ι���=ƻψ�;�_E��cV�!��e܉�����N�*�m��	�>�Vh��$���vx�@��G�%�\�2G�R�_���'����,�$1��C�����M����>(�x���7נ'��M�����״��x�û�h�\e�Z���{��Y���N�97�u�<���)���Z�ԗ�#�?��9;�<b���"�c�V���;�~��ig(�{��&�{���Oca�B�^"c�v3�L!�e���uu���^V�>,��Ð/%�z�z?�q���L����z��y:`�8%�٤ݐë'g�.Ѳ�sϕMT1"�zD�ϙ�o5�YUہ�sT�i�j?b�x�?��B�3�3�R�P�IgQx>l~�9��!IY��~9u��L���X^FY�h |��{MY7�6�"��U�D^%�=�*62AA^�lh��ūd>k��{υ��a���r_n�c���1NG٧�.Fu�oh���S�aV��~h�$�	�׌'=��\WY��J�\d����"kg�.4E+��K�=:Q����NH^�{H��A��[��F�?�qö�q.>e؊S��aS_�D�^��:ͻ�z2�/[q�M�jv���������~֯�3f�M�F�w�mq�Gq����w��Z-��<uO�gꪎv����x߸rU���u�*Ȝ}a�x�L+džYf�&m��Eڴ���g3��x�яR[�\,�]c��Dȓ��;�;�H�µ.E�mI�~J�WS�=���Z��u��RO:mW��O��do���%�X��yO�7���gv�(;����K9�Ts����x�я��J~�]�Q�_�"΍��ga�+˥���F�A~/8;�n�̹K�Kڳ�V��G� >��K{�uN��\j�#�Ӵ`��?/Z���,��5ˊ녞,Q�ul�f��\qj������0�B�[��U�o��5����/:@�Lu����bn�nc��[�����Qh�~
��ѾM�K����s�����l%}_^�n�A9w�^B:�r�'m��o�s�ՠ^��zq�|��6��;�lO�Z1���|3�����x�$�,��8o�*�q�M��$���(��md9]�;����7Ɛ|�9�.e�F�o�ξ���>�=5s.k����8	�']4#�(!^�	���Ʒ��ъ6+j���'��DZ�bL�A��pb_�o���G=+���9����k���hF����o���#ʩ2g�h�T����w���'���G;�ԇ���8T�u��@�N:���L:��r��s�Eb����-2�5M�oo:�
�m�>�<u�i�M�)1��`�G��?�3���X��Q�ҧC����m�/T�{�!'�'��Va��}a��r����e�HZ˜�_���c^l��'�v��Gз�hW��m��7�9O��
Zxb�ߍ=�{�=8o#�5u>;���/R�馳!ڨJ��C[�5K�����G��[|s�f����m��3|�uz�bާ�?��ߴ-�N}h��J8���9�{@�)I�.szΥhc�o�Nk���|�v���ޕq�}"u��xV���x�9�C��{"g�	kd$>�]�c�&x=��·N�6S�hiK稽�{m�GsZ~Itl/��9'%�|B��}<���ƺ���.u_K��#�`F�(�8�V�ɘ�΄��7��u<��l��gW��Q�;���F\w��v��N�tQSt����t��Y�(#��	���ݘ��W��?�F���,�׎�0��k�vF��bK�(�[������0ޥ.7ڦ́^i�^�7���8zItw�����+�������j���˦]2�c���Dj�{��|�`�y�\Mq鐵�1�:/x>�b�,S��My2������m��3��z�s��C�iu�%��yIƻ?���36$�Zk1�Z�b.��^u�_¸v����!��N9��f��,����皡�>Ⱦ��S?�.i�1�<��o�3㊒�s.w����bm:�r��N�L8�~w6xV�L+'���|d*yg�{:��h?�m渡�GV�{�>E�j/�l{ܭ����_-q�0m���-ި]��2�9q�6�>���oan��k�N�򈡟�Ώ��O���o���V�*�߷
<�Խ��E�]�As���g�P����<����{�z�Z����&��xy��4�Vi�~�,+����]�Y.G���*Ǹ�-j\�"��1���)�0��s��8�9�ΐs�~#��]�.׿���������!�/��|j��qNJc'�l
�2�P���n��&��gu�l�,ҥ����J��qFi�P�h�hz�^�{i���vᝍoǭ��h���k n��1��ix���c�wἠݍY�>l/��O�}_a�/5C�B�}�B5S_)��n�뙾H��v�#Ͽhq��!���)��M���	�"|��}*��eF��I�I=��;
��������!�98��EX�ľG���#鍊�|�sH�r:�$�W>Il�:(�8�~���tQ�,h�������hӃ8c���2M�X�}�'v�D�7�g���

m��*�؆Y�̪�kD]��'
�W�̕�ҫތg֯�]/e��f����e�*�e<�-E��j�ʯ�m����6��ɼ�o�Q~��c�5g�KO������}��>��K�̡�(��Ը�w[�f��V��t�݃�C����h�3x�����V��AƁen��rk(�3��6�wE\8�md�=�"7~x_� �"�&��S��[�@dLI�>����OPyn��Ĉ����G�;�e[Y+E'a����=R�^�e�orH���~�7߭�,�`��*��Z�c]����v-��8��*��p�Z׶����X��[a�,�Gg��D��_�|�_��:�5o���o��c���۞���
���{⌱'n{k��;̗��2*�d�oLv�+
�"CT=�j�ܕ�7��gn�/�6r�TmP���9�փO�\����i��m�u�}�zD]�]�D�pizX��l7�j�0��7�Mߠ�}���ƫ)��Y�'�.5�<��ޘ0�7���

+>����7ʍ�Q�/��?�޸���9v��c�օ���y=j����cQD{ע����`{�#��W��i�#�4>k��}R�:�Q�$+j�d��a��'�K����7�{A[�K{]+z�-m��c�>���/��#�LN���sf����}����&�?-��K�=s�s��x��ϪCʖ�`���"��W9`�ʿ�2��^��������*Nt�^lp쇼{�����7j��[
z��kg��Go��e��P�V��ej��Y<�
��O����b��c&]�ߝ緌y.7���g��<
<*�<3�$(<�;b�?�1�o��k�1׍�\�1�c�	m*�\�)����C؟"��K���;UV�u���M���~)H
�a/���.�ܾ�o͒O��m���,{�
6�5i7:�[�� Eş`�K0��4�K����»���].���U��%xwI�ݗ�n2�M�+�K����|7�f��]�wW����w%|w
�]~W�ws�nN�ݕ|w�]~��x� �nj��d�x�^�xHO��l3�������wN����K�x7#�N�9�����5�}=�%�O�in#���B��I6e+p���r~�Mz��������*���5o��<����O�����Ц�m���_���A���WF;���6oM�q��D��mܻ��9���feYp7ۺ�,���,�,��,���+s�a_JYo~�8ٮ�!��(�?���z�?Ћv��P�I��B鋞y�^�yn��=��zqq�,����n�>��s�8}<OZܾ߃?�(OĹ���0�Ƙ�ڜk�f�߈�"2�S?��)�{P�g	s~P��y�^&d�I��۶�����m_`N1p=mh�>��qC�j�8�]��$u��C�#��s��}%�P���f�[�l�𚱺O�]�>f��GЎ��H���̓�2�gϩ��5�S���u��=�m�mnC.��q�-�wu�o�V�z�80�Yn��-�Fߗd�Ӗ`��ވ�N���Αw��'ݰc��c�=�"���m��-�������V$�:z��\[<�Ғ����^B��^KD��Uߐ<���Uf�*ʴba�P�H�Ӄ7J;��zG�A=Xc�.[���D�&�]��.�������Oږwل�o�=/��jԽ������
����v��g��e�v���;zP�^ⷵ������Xu~��g���X��{��y�����B�)��&����|�vlzp�7����^�Ջ��2�Ѣ����d�ݸZ�Y��!��o+Z��آI��=3���8�#�k�%�F�%�Xmn�󉴱�.�h�:w�@x�Q�7p��?ϫB��I�>a?i=����=��{b����쉅���{b��/�'~
>,��)yW�Si6bg�N����� ����o+}�Ƹ\s,^�P���ힷc�tz���xT�_`���Ay2}��)O�4WH��CX�塐�s�g��x��l��J)�'�T�&�/_=�N�ȳ*㖫\'�ۘ�y��c#�e~��e�������6+_�L_m���7���n<˻�m�yf4Y�[�~���h�=B��Φ9��z��H��M҉��\�ކ�]xO>wt<��s�]%c{Q��U��V�_�M�ϒ1»-�G�O�vy�/���?m�����e��h��n�sx��<㼣���<{3V��h?�hz2�;q���7a�w�_��w��8���1�#�+�+��x�)z�.V��u'���#��"��Q���X�ط�3E�Z�_�:/��l/.�|�<���7گ͌��x_��.V�U�=��Mo����貉�nڍ�z�+�*Ϫ�JH?\���7q�~RrOm��<�uD�^"�=��co��'���K���
��2�[�q߻/��5ܮ&:��uƌ�1�Gq�w�M��h�9�v�%�E�e��f�%�Ę-iBƨm�U��϶�
!��_��6�$��w(���)���?e��3�[a��ya����<�6��J>2?�6Yu�o��KKB�+m:�|�ݽa�ǥݡM�ɞ
xӶo7攃r�ͮ����Ky
k?A�1�
�:�/Zl/ބ�?� NTc���y�N^Ui��j.x�Y� w�]؝ ����;�4q��6[���ss*�3^��wM��>aϜ'�����
���0/X�g�8d>�-����9́�
Xd�E9��;�f�9�e�>��~2�xm�s�q�-mgL�n#WD�w��q�����<mC�����֏CUߑ��c��ϟ���LS��!q�l�>i|o8ut�28��ȭ�{.��ٕM`��y*����q�|�n�����sD���r�+N�oX�]6[����ۥ;�+˝�*�Ь�Z��{l�?pH��w��áM�;U-g�
ލ���Ψ����B�J��|49�Ƴ˦
�vy��<��+ذ��DK�y�#���xcǵ��k+�"�LxV��e��a�>xN�����<�L��-���M;��=�Vo{�Q>���Sv���kM�|7�|CD}ډkԚ[>ݚ/��q���Ҽ���DŽLֻ{��8qoD��M�=�_ql���_Ѷ�r��/s��`<fN�l���}y�効�[�����̓�2�E0p�z�qq�K��0������9�y�G�����m��ǐY�ѭ9�ӄ��R�U9���0��/:�?�^y�����c�5g���]���STMo�&S��qz�\��7y�fw���X!�vg��
��h�nM�'i�_NP�AYv��u�����+P���\Ѿg�@k�^-^�f��r�x�&�/
osM���(�ŏ��
c�\��L��wX/��x���v+ZV]��:��.�v`v����8�6xEɗ��m�v2���TQO�����\K�~�qƗѤ��	ҧ���L�g�M�M�X��'k__�^�ܓ?P7���E}�Oq�n�E��S[T{S4/m��ޥF{=i�Ş��J�i��p�Ա��SzI�vI�ZC���Ś̡�����{\�)���]K��(�[c)!{U_h˖3&�����,�bݓ �G�c[�E�lG�/��;�|0�R�[f1.V���-�w�뙢��{�I{E�W�LT|B��tF�w����|p�w���ܩY���a���(�/�N�J[�Vi�Ώ�a�c=���N��,*�|`�h0ێlW�_*�۝��v�V3��m�vd����S����m��/��쟦�u�5�%l��	��t8���Us�������u�T<zq��a��40ݬe8h��G��Ɲ�CGS���5G+�b}�Q��!(��R�d�%|_��-w�p;7{N�\�\�����)��c`�eS�kJԃ�%Z�}��5Ų+��\��tp�/�����>�&}
��hK���|��V�[�AӶŋ��KU|�G��'V�>ؿ�V~gn{�@'N�9l��(ɋ��G�����1'c��Uы~G�i���"|��/�]��0�ivg Q@>ά��)�h��PU,��:��6lz����[k���	7��ffw�`6��	��`��|��jȳVv�j�Xaª�	+�qf��s-R0ˊ	���:�̈́������0�>�ܴ��
�;%vc����рW�*u�2s��~�i�.>�|�b~�j�)��XʘV�k����D����D�3�/�'Ӝ����0M�ǔ�^Ɲ5s׷��r�{�E�<>LX��VV�ʜ��,&�{��e���!���_�}�X�+�s�����W��cm��p������?Y��i��z�����/�{��8�#N�_�q�-�{>�<_�3���O��'��y�̘�#��?�L8��0��"�����_/��!�&���Fn��Y��1��7��;ˈ?6��%������\�����``r�^���Uov�4��;�ު�q(q6s�w��YsD8O|��9�,�o���&
�V�`�q�mpVa ��94碓�^�w��NT���w��ޚ���l� 
��e\�����x��9E��_P6�3'7'0=s���T_�XE�Ƌ��'O����=���p����-��{��r"�0Ƈ�H��e�oȳ�/���$��߁�
f���5C�C��̥~�Phm78?�t>��28�#M堖�aG���<\o�ye���5���zW,��"�9��Wϔ~o��u�4G�R����8]F�V�뎞�L�g�ڥ��
캟�F���t Q�{�������ǘ!��Y��0^����_�����7�qB���Y���Q��9(�lUu�ܽQ��*L9���c�%�)g�Q2n�/S/�����+���D��ׯjɭ�3�y�ܤ�*��;��̉��ԧJz�(+b_�׳c�1�k���1:eĉ�,|
�k��_�3cUT�"3�O�ǐ��*���Evd�����f���$c���_s =����̏u���1NH����1�~V�<��90�n��o9꺍~�˳�*�<�sq7��[�x#���}ܪ�����̅�3e3��B���̑li�:�W�un���o�\i�QO����MU�n��5��^���{Pn�z
�����i�vn%�w��
κ;C�4Z2kIc�.��?8���&}b�v-����iUc�t���WS^�:~�	e�BWC�]ԫ�R��a�ke�:mF��Z��}ҧj� ���$Ƀ�Ȉ���6:��5	2� ɟ�}8A�;DG�]�:6UN'r:,i�
㽙C<Q��n)���yI����vQ�x�����;2:u�������O��ޤ�����;iݐK���3��˼/u%���'wi�h��Q6
�5�n�_�}Y�%�]�_���$�|�_��.c�w>�Z�7���H�j�����\�����;��q��n���O�v��B��1#������P�"+�`v��9ި&	�^i7�^�<Z���=�3�n�_v
p�|a�����C��Ue�'�pI!u�Y��~��������e���|�W��؜ �b^X�Y�>R���)΃�����6en-Ϩ< vy��3��U-}�w�ـ[����GN�rJ��R�\ڐ)�T��0*�l�ąR-������.�����Ơ�Z��͗j9r,��E�1�+��^�
]e�q�R`��잃�Ww�V��v?�������-�����sL��6OHa���U9�ʍ��7����}<��ϵ�m��#c%wi+f�'��v���xA��8��+O�w�Β	�N��ϒ4h��5��ֲ��x��ݐ&�U��,�_˹k	3j�oM
���3w7����z�Fٵ���Qxd=��(�l_�~���6�I��8�=V��X8'v���Ļ�=Y���������:]�T�P���rz��]��"���7�������G�_�F�[�E��Q�?K�*CSD��A��{pn��C����l沾!E��8��{<�㿨=���^�>8���.�ލqZ�Ĺ�#��Ń��s�W��A?��*�:M�;).��_��3Ut��E��;�g��䉚qf�������I|Zƈ��yH�ފ*�|Շ�m���A�؋�ֻẂ@�-s�5������N�2�M��4�[�K�_��C���W����
1W֪o��O
ȏ�Y�TǼ�'51ˬ?�A���y։n�q�%�R7)��v�x��|7q�xB|1q%�|���k����R9��b�]��i��x�=c�JSm�?@�X��g>�G���Y��9�a��!�C}��K�)�H`iwI��;�g	ϻ�g�~��3� z��)5����i�c�E��X����=��CW���E�
	�����{���7E�L�6�m_2t���e{�};��_�\�:s/�H�\�I�T��tw/~����!��϶�qDl�wyޮ�7�c�q�0�|#N^���
���j�=�����Z�h��:d�'�ң94�%.�����2-ga�v��b:�Qӫ��=��^�5v����!^�#�v$>�w��O��M<%���Iz@ܔ�#p�7�z]pL���0N��ř�=V��L3V��1}A2���
�9�1�e,0ƓL2�����gyV�{�����VL�R�L��B�Xy���ɠ���	���\�3��N�/X՜��A5���86=5yq��2V�����/g�Mt}d�� ^t5`��_����@��=�<��o�;Ȝ+Ȟ���lmkcN)Oc�W'�"8G@��y�M��$o� N�ǚ;�����ʝ��l���6�*7f�\{�X!��]�Cx7:x'����7����l�������6�
���
���1"�z�#c��x7����)�����y�8I�[��<�X7��nLPc�>#G�iS.��s��m�+h�������d�]
���+�w�ֹ�!G���~a�]<��|�����,s���R�+rR`h7�����j�����w�_~��I-5���HX�P�8p�Z��Q�V�|$#y5��6
�c����ԭm�9s����nϽ�1%�F�4�?&�EU
�u#m��n)�ߌ9?���E���N�4l�x��8���lk�a��xn|���]�����Y�|�YF7�#b�I����,�x��_����ۯ�Zj��\P�ݞ˘֥���Y��^�o:�ƚ���L|�žhJЃ����d~BG�~!"N�D�P�#Kω�e�ݔ[-��W�F�t4�#6w9�ډ�D�R�2K��}��M���0�|��0���Wܜ����&/_��\(�͒�k?�\���	x2���}�DNcN^�O�0g�(r����JGf�cn8�l>��G���&��}�]�k^��_����Ƚj�o�I�~����̽@���־�95��ٙ�iEͮ�UNߗm.�y�c�c��B��)�qFJ^���z���Urnҧs��l:��M�o#x��,Q�=�YѮ%�[��2N���}������6���6��,Fyީ�$�M�^T�n29C;�m�bE�M=�cb��S��f�\P!��kUjk�
ﳴ�
�:/=��7���+���jn|��}��ښ��<S��fj�n�ݟaS�g�x�\$:������x@�0c����y�m~���^���*�l3m�#Q�_�~�z�7�H���Q�w�y��ݠ�|V�q4��4Ɛ�%K[�Qg��F��_h�o���9�棚c��qQ�XS�뽚��>պ�=|42F�m��}P?�+��]���]~[e�Ѷ����R-y��4�����星f�
|qc^嗣
�qN�C@�w&I<�c�Ҷ!��\K�����f[qٮ��X7���e�4���w�oh�`��.�36�mL_��%�4P/�lz�C��@;7�/�1q����E��U�?�����N�fq���n��馟���eƸ]+
v�#�\i{!���ijc/0v�3��w4N�,��v?c��h����e�O�:-�b��ӯY;�x���bc`"uR8wRE�k����Q9�X�ʜ�z���_D�xmȢ�̝��dsn�v�cϿ
�k�.?ĸu��?��%0]�w��Y�iOXN�Q�;�K�|��*��K��ʃ�l�Vz·�x4׌��>�:�d�d�4U�ZT1��q���+}�s�(�>�^�
��i�A#O�%O�2��p��POo���+?���Y}=���Dh���1��Px.�t��YEI��� ao{Y_�g}�
rN+�x=}���"�J�9�f���x"��Շ�8��;�_����k�A\w���䶃��JT�P�3�@Nn?8�~i&`=�����Y�T�&���9E!m���wgj��[jw5㏼o��0,#/��-�K^�h�띠%V�σ�yh��
c����E��w ���:�m,Ϝ_Ѣ�+���3���N��,}Y�OZ%Rm	�1�3��[4ߎ�Q��~���|)A,l]n�Ҍ}m�9��u���~�e�G{�R�}�m�(�H]�M�s������������(S{�e�xְ}��@�j���z�born����R1ɒ�W��O�<�����g&Z��.��
����p���Pք����xX6u$�~��,��_�+|}��C�������F�k`�}e��h��R��֞{���c��JɫP~fn��-0����$L<<9���t��`�Sؖ	�w8{�~<����~�A�o�c����A�Mi2�R���fЖ~�?�3o�-���g��
X��EW�2�w��O@V��E���C�f�NsnN}$��D�*�L����O���Y�^]��`�X?ڔ�3�]�%��=6�_~��A���;6��l��Ѻ�?A2��^����KW=��\��*Ю�δ�ZM/w�%w��%�O?x�ْ�$,�LƈnP~V���6|��Vݞ����
�V͌����*ʖw���)��[S���|�]�a��6߻X��[�v�V&mv���n���1���q7
|����}~?����l��?�>8�O����%������f��F��d��	�A�\D���v�`E�	�<�{��p���G�yf0T؈�{�E�k��9��>�|^�L�ߡg����?��m�7�	�[��tզ\�o���oH�~�(
�y��J�r���y��,�^�{�\�+����|�+�kMaܢ���E�n�Qޥ���n�|W@�8)k���7߾���|箷�DjH��5���f{ٕ���0�
Ў=�?Qn�|��u?�����P��J��'I��5��Y.�ߏ��ܹ�m��+ɷ�>۹�|�H�����Q-�n�`��{�����u��5|⧡M"����5$�}�Sg��J����[��S���o�w_�ȝ�5�	���V��r�m��']��v$�Bʈ��Y"����@�6�H���<�L�ht�KZ�f�n�lw�p�Y�v��.��/.E�d�x'�=�ڇ�}֚YQ�ر9��1�{#�E���b�g��~zaz�l[lza�՟�1kn���Kl���_�11r�Y(Kz��{�xפ���2�w�1��`���8����LzQ�k������q�J�����,��G"i��\�iEx./KZ�A+��@]E+��aZ�Z�CI+~Z�eЊߍ�Yu�	j?!Zq�ψ��A+�>���c��[�^�Zq%hŸQ��A+n0h�G��X�b�k@+(�V��F��A/��b�-L/V�^p
�0�V��l�~?�O�X�ݿ�g�'�Cӊ3[E�ۡ"�0���Y��h=E'�Z�����aoh$���<_��d-6>�>��X?����v)��x��w�0O��{�ڼ=S4�΅6}z���[��	�O
d3ڼ/Kޗ�F�o_
RcN�sR�Y�>�M�6>z�x'Lj��a��m��ϝ>(�6�[�z06�+�҃��u��.18��!u�ַ�:,g`�̱t���=@}C�U�m��Di�\��[�+�f��s�lIg_v��c�ٔ�-c���^h�"���gC�8�d��r�*�߷�W�~;�=�m�׳��!�I�{�J�r�=�zg]���v�Hen�V�'�I��ۢ=�<�g����a�
��{�����X�=�m�Z��I��N�PoL�q2�=7�FW9�
oc��gZs���m��e[��m/�}�z��_z��q[�=�̥b��ɼ���9�PXW������H�9�5�-:�2�ὶ�5c�?�������⥝U��j�'�ҏ���O*}���&�ؘh�e��a���(ݷ��W�s���5	4�s���A���2�W怜�xТލu�M�/a�3ws�w��	@TU�?~�2�*�¸%�k�:����Ke����
��������Y&��"mVZ�b�-�Z�-���V�TZVX)��9�9wf�`���������8>�s��<�9�=���#���ƳR�х���W
�9����wC���6qEc��~I��_RV�4
+��_��rH�I�����3�3�d3ÿ��g+�\�q��9�Z[���
A/�X	�e�_�%@���k����K7S	��ߩ��A/�I/#.�s�֋�z�>�·k����o˹�an��:���i3���9�…ߦ���0�x�T�g�П��(�<�������>b��,�F�L�9�nq�� ����^�i�m�g�߳,#�m���MqSzC{��{�3
q}�_����X܋�BF��򹆆5xV ��g��s��:��D�x���9�Q���!�s�g��}*��sgqO�[�Ӂ�vf���
?�祱��T�Yt��7�r�������u�g`6��������Io��H�Yډ��������Mq?j�~g��zs�>���~d\��7mS9�\죎�\��8��m�rqf�V�=ړz�{}œ���>���.�>oX����м�E�����0��zeYDSg���z���1;�{<����o��\���G��\��������#u����fl��vh���b��<L�Jx�Z��A[���,}>�[�w�´#
��G��!w����p�����X:�;��>��}��&l����a�l󹓠L��9�s<�kL�M�&�b6x��iX�=:Ӱ���Ew��  �5���qo��P��ɫ��7�ܼͭ�/_����
a[:c�]�Ou
k�A3Z�����Z����K��=���⛶KPV.ܣT'�ijyL�X~J{��-�j���M�pk<O7�R��	���L&�en���J�߯���w��;�e�+yG��?�{������N�-�X#yHލ O9����tٻ�x�Ɇ��t�n��/ _gR��Z�H{���T�Ӎa�ܽ2�~l������GL̽�,�����yÿ�ݜ����V=���p=��/��.A����Q�~��t�g:C-����8���A���Wc߬i��Cg���E)���}<��Gw}�{:�}z��m�/�_������ϾE;���]:�/~>.��}��⽏��6`��
��:]��
�@�������í\��4�j�֛�7J�.�w�/�/Ա?@��ֶ���M���f\���&������Kwa�}:�'�ܙ�,��.ޱ��]�=��ŞI�M����g��h��zw��C�P�8m�Ox��h�]�^����уK�gcˬѱ�m�[�-ܧ�^L��O�g���ܯ�
]�q��dq����߬���p�Y>a<�9J�^�GB�0�ς�o��bdl~䕇�kxI�g���|���Z^a��;:���
=��B�a�����}?�m���Fxx�]���m��{�=����;[���y�f
����<���=�0O6]�&�{x�Y���G0F�#�Kkwn�
�n��zFZ����W]m�g#q�y�~&����	�	�{n�is�.b/���8�|��o+�C{�}1�����zl�!�ʪ�|�:2��)���G�g]�C�}pO$����֕<7�m����w��_7�����~wk���>���;Ͷ8�wS*��"w�/���m5�*�>�w�����������g��g�޻�]m-��bs�\*p�e��ʒ�L�[!�	h�� ��Ѱ
�l���(�#�-����Shg��{���1��1����'��8_��y,2���]
}
�9��:�X�ҋ��Y�<1�� ���
`!V�-��KuD�ݫ�)6��'����7��d+1l/�3�FA<�	�@ ��67w��7>�>O��i�ϟ���}7�Eݿ���v�[?v���8C�3�Okh���b@����<#�4�9j�\`ځ�|x��r���c�.��}�*��Es~L"T�\]�����]�^���=�z^R�ϗ_֋s��x���+��h|��:>����ˆ��֡�"<ǽ	Nӎh�|Ĺ(1�����K#�
�k�E�8f,�sl�ƹ�������ǎw}y���Aڱcu,f٪��_����qX�h�Z���M
`���R����m�>=K��XN��_�φ�yI��Xt��Ǣ����X���-[�8Sȗ���ʽĸ5T=���C�nB���9��F��WӰ�zcQc���'�'}���4�_�)����`z���w��S�����Ǩ_���ݦ�qj���5V}���� ��h�|^�.��xU����Ż>�1���s�j?��/��_�]��Y�i�2��)�0<��z�]�|d�pv��2�����k�\m�O�g�~]#��ꙫ�p���ՠ��&����
<��m�w�#(Od#�t��th\��(�Q�ц�C#��}��Vf��[��s�V�d�\;ѽ��/��]7���$��6P|oV��A�
�Qq��{��֎S�3~Ï�D�g����g��n�ߜ������M��G·򳪯�^���FW���
kp��U�Uf��@�ݵ������g����Y9ҫj9����J���]ul�kᢪ��<,�>yV�ׇ�0N�U�\��1~c��ѹ}�{�jmم^�\2έCG�g��:M��uz��~z��L%؏἟�9���k]��`]��i�~�7&�3rn|��w~�tloU�����ұ����e�泤���LA��N����V�"?�
k�jf��8��u�3G��}G
�:�����;���{�B<�{jU���]���+m#��{l������>�;�
��d���Ŏ��SQ^��h�u���5��<��{R�=��޵��_�w�Q�#3\m��#�:?��ż}b�B'�"�h�Ӹ�O�����D�<.�"X�q�V����9�e�<�}W��0�((��t�*xú�Ph3��aS	��C����c?�w:����9��wa_�a��'���p�g����nn��!����M�����g�IxG�:&�50.��H���~��<혓Z������&�~�iϚ6��������y�N�ϝ1<��CEًk��;�w�le�oȥ���W�����A�
,���v�7*�^'B~�X	�Ol�J��[G�xE|�d�7fnW��`���nqj+�s{{���gpL\��ψ<|=�4K���XǿU��?�z��ϱ����d��>Jt\q�x'<�c�8Ǎ��Җg�
öc�o����G+�;��諶�Pl�}�?`�O1͡�y���_�1���m�e����N��h�Úv�{�j���w���,7�s���Չ�ڍ�i'�g�o��
�y�g�x�3i�A������g$b��]�j�������g�g�^��[��'��XS�+�a|��o�O�6��>-+W�X�-�_��HA�u4]CCM>WN�^��f�o7�Oi�p{��'��X��c��
5�7�W^�b3�ۏ=@1�jxv�;����
b3;�v.�~;�p﹝�|@�E����<\�����wt.�vv^���@636��s���[���m1zFd�٢�����s���"o�}{d���������~D���&8���*[���KS�Tع�.�I�U��g3������m����ZԌʹ)��;��R2;﹫��t�7��`���Po��D�VS�;�X�BQ&�Y�E���!%�&�9�a7uN�^ӦDN:~�E8;��v��y#����S#�@�C�G���f��w^�ss�o�E�#fM���yͺ-2�:�H��5�_״���.�ױ
�U.1���pm5䑹Q7n�0��ޣ�6L���-1sԧ���c�-�7?`|-u����{�/���pӧ
>�Y;�߷�F��q��v#�
�g���,�vUj+%pBݢ�i�Jې:�@~���/"���R87 �4��Х|� ��ki���pG��J��3>K#�FY��"�ק,��� \���>�����w�-X"�}������[ÜAێE���D(B����Gg(-�Q�(��}�	%��|�tV��oM�*��t'S�����Oc�Q�H��>���Z7����׷m��7���Kzѓ^��
/��&t)�W���[X��r~�&�Cմ`�!-Y�V�S�?�ҌuA��WQ�lFoE�L����@]�@g�r��e�@'�(g[x�:��	*-��|T"n@l*�I���AlE�	�6���Uծ�IP�>ҏ���!c�o�A�V gK����:8P�A>l�^	Z�:���L��C�Pf�!�-��r�A��(�2�Vv��Mqˆ2���30}xvU�w�8����`$SΡm~˩�=[��0D�\r2�"��ˑz����)!+aLs �������C;�L>>���ߌ����7�tn�g?�6r�
�n�^��sa�o��\�kƧ���>|�>�Ԃ�����sm+Şi�Rw����+^���p��M�2��5�R>��t �
��G�5rޫ~�oZ ����H��1Q)��U:�}[�<�L���6���>��[�}k�
�N5���3+�/������+�vW�1��Ͽo9�Bq?Z�|��c˔�i(���\�Ϊ\�N�\����b�2�b���}mx?�g�eQP_������>L�D�ٗ�����3>}��X�4LV��by'V���Q�vO�r��{)_��'T���{k�o�ݫ��Io�GBo���@�[�@��	?���
��)�&�K���=�]���4f���[���|�����LC���a\�\�1�7���{�P�?�ݱOAw�)CK�}-w����zp�1���2�'Vr��!��BLWZ���!�3���ҕ;����.�dWP�֊��K�lFm�e��\O���^��b��Yt&�W���$�(�	k}��]ytT�w�5�!��#���lP��0���V��1�8{��D[ee/æ�#���0�]�m�G.<���M/u`;�/�ɮ��5��L{���<����"MWPo��"�}Q����7]���@��z��\��R��lbo������Mz�}����'<Σ������ "�q�=�����o%Ϋ�2�y�/uf�Z��B���j�	~�����z�~��t�$w���U����ݷv���=������;��/��BWU�9�����Y4�,��@�+�vZ ���%��p�<�u��<�M��<�un��D���3\d#��?�^��
BxNm9��}E�@��3�։܂=�:�[��[$�<�wCa���̂�����/�6�_�Ӕ�Q��q�1��[&�w)�~	~lP�c⻵��s�s�8��Un�uлo����]H�.tj��x~���!��E���3��Қ���"��L�C�D�/C�)S����;}T��A�]D�>Wb�5�k�bX��ÛEx�ue@/v�a�
�d?��i�؋]̕�q��3��6E�\��0���[8���p&�"7=��T�2���)�DY8p�<�6��W���r���(<�ߜW�jG��y�Eq������u�K.�(��R���ޢco��Ӕ^�+/���=�4s<ЏW=?x��Z	��~�y%�boB�^�_S��2|(���q����C�N����il�'z���zsƧKt_��^M��S�=c�迭J�Gߑ�A�"Ӫ�
���O���aځ6��UQ�{�J�Z��n�r<O���D�[F�z�C�m^�O8�S�Y+�+`�l儍l�S�,����!�а�T�V�~��N���2p3��{��h��0����iǙ�r�����������J6'.k/|]	�UY&�2�w����0�T���}�s�.����v�z�{C��Ϋ�:���hEYn���^ݰF�_���ݯ��?�[����}5g!A�><G~c�R5R߼SZsV�pY��u������dx8�s�����X%�����u�.��((��	�a��¢�W(�+	��Z�
���@C�^��?	߫J[$.�B<[[��o�L7�-v=�����/9
��|A���'���D2��[Y\�r�N��͕d��V52���a���`;�s��ğ�<��1�(��5h_%pY�pn0��0�Sڄ{�MVZ-KR�/�5����ao˃_�>ѱ�e(#Ȅe_	�y��PlOu�g���K��2L���WF�Y���',��|��=�0dO�_o���N��8r)lkT����*� �D�Կ4��4�HeJT�j�R��3�=�.�i-����b�Q�������Xw���ug�����p@y�s�'��AP�d^��`y`Y�~p��
��r��-���}�a�+5y���چg+�ޫ=�E�?��}*��e�q/����A/Q��DH7t:�|�4WZ6��u��1�PO��@�x����
�I_ؿ��X��!�|��
Ig� H痓���0~��y}l
h��ܬPn�Aos��a�w��P6��z2�.�}Ի��0Sl�҅�a�{j/ihئ:���.!K�`f�:T��4F)
6���-`���|�!l�xı�A��g���Y�r�tW8��u[��y�'�2�j_�V�yp�=�d^y#�OP���@�ᷣ���+:oO�%y ���ö!O����yB�M�<�F^���A8���Ằ���A8��<����v��{.��v+�+#�o��8�O��p�k�+dz���
p��a*���zMy��kU)���/ۅg�(MX+�5@>Q�	�,���V�Y��m��H�p�5��v�֧l���$���8�+�M��|��T���!���Q��ǚ;��6[�KR*�۱�/��V�n���7
��c�G]=Q�g��a��i4���wE�������Y�Z��H�;,\�E��1����t�����{���H?}�����3]~�a��]������QW7�!5\=Q�9����0Y�Z�ߪ�]��~�`;ᩦuZ�>jڿ�?p�)�/�����ey��_����Ʀ�d(��
{��ǯ�	��zue�u���0��ç<Դ��Ȋ�~z=Y#E{�������Y�o^��}�^Ohet.��녃�&�;[E;ӎ�q�|E웟Kߵ�7m��}�{��,���d;��k����e��2K�i&�DW�Bt'�ω��'�!h4ћ���!ZL��h9���$�9ѳD��
'��E�'�>Ht	Q�~5�J�UD��@�e��]��5M"z�\��ˈn"ZE�0ѳD%���-�h��D��fu���Z�D��"ZG�Q]���D#��!j$�L4���h)�D7}��v��=B�іT.QDo"�L4���FP�$�4{���`&����* �c��dA˟R8��4/�n��¿.�q��+x�N�C������W�'�V�_A8��v��5�0���4�/n&:��������E�N/�p�M�ԣ�M'�K8C�?���c#,K�P�]�����\��eG���Z�V�	��?�	_���k�´0϶j��k�[\�I�=�������S��a
>������5�N��k�
������F_�7�=�^���58����kp�1�{̻�$#���/$B��pG��;���i��_y�G�F8�p�L����Z‘����p�&>;.p+����#�'��	s�[����O�qo}nI��<�ǽ�_E�����R����{�=�Ϳ섷���J�0�(�Z��%�Ϩ��s	������?���
M�

��Z�U[�vR�M��o�I۾�������߆�Y�f�%[�pV�%�����2���NW6`��]�V��a֬����Y�\�|m̚e1gZU��9�Y�7��B�c�`����f��{��l�ζ[�9�����2_�mȶ�,.	�F#�cF0��G�C��z�WPhq�A^��k��7Tʾ}��D����E��L���h�e�hT/��z;�b��n���7��¯?�z`<�4���w;�2��̙6KOY~�25�ؓe�J
-9ҙe�
���t�]�,��"�#��e�Z����ay�V����t��%��!2�-9�"�ːU`��,[���e��`�N|����:��~�ު��).��p�&���B�9˒o����B�OK��/DцkT$�는�UPXҔ�0��l��aq9켘2�&�����D�rUk�7n�1�Y���K�2
��V�!�kE�[I"�V>����y���7�ͳ-��Tm�&�ٳ|4���w����o�ݜM�j����s,�89L�S��]�b��S>�P�����]S_��1=�����uX���^��]��pV�,�|���Q�}�H��/�Я�X�Yk����ј�x�����m���s8�%�����#+�D��_�_�����9�uC��#����^�_P�4@�X��PU��Ռ5~iݕF�4�&�R��4�|���e��xP�ˏ��e�3�����gr ��z�|����x�9�ٵ�NC=�7���pR����Q��O������kJ^-��׳Ư����.Yg��j�=��˳=˶��/����s�ij�5�蛠��=/m{�k�zʧ͛'��d;צ��׏g}�^?���z�߳���o_�^��o��F�?���5��&�������쬈�ௗ��"����׉�<�w����{�ǃ����������:o�M��<�lgr^&�9Y+`f��~,�뀱��X��8
�,N'c�z�w����.	�	�޴���k���"�֦x�[�ߌf�}�gi~���}o�)C�����]�ϛ#|`��;��2���H�H��Ù�Z0�?�n�I�z�D�/�ï-�Eڊ�����ݻ���q��	�P�TrO#:���Li��=��9�B&�$k)ɺ��r����C���$�$�Ӕ�?�u��c�o�s$��:�W�T�D/��A�R��Dc~������\ �UD
ɝh��D/e?	�@�������e���T���Ў��w.���.66�����.�p���q�ߌo�Hw �����o��,e�</Vp�{��o�W�t�6�-o�c�6�B������'������7�o�C�:�+~�ߎ_.Y �-?��]s��Z��U|��\4&�_�/�0�%2�o��s�*��2L6��oD��a�,�%��H��T���"�cY��M�/��u
o	����k�l�����3�R�ޭ�3��lia�GK������S�������Va��P�{m�$xK�eZ�|���)���qV�%���KNK��A��i�Ò�g����(���9�l��,��q�������mEm�4OwrOT���p�e��Y�\�;����K��d.T��p��0K�9ߒ^��8��7��0��f�*ihP�nq�[�fd>���-�Y��%6���q��Xʟ��P���Nf��Ԟ�����p�_��w�ߵ	Pz����?��=������ǟ�o�ɸ������W��%w�s�}��-]��<�Њ��Z�ȣk�>���'�?��|㦧�~��Vl�|�^|i�˯��u�k�o��ƛo���]��~�>�����}�?���C�~����<r��W�OԞ����o������s������/��V��?��r��):_�f������-Z�
n֦m��:v�i�ҵ[�7��ݻO�~�c4x��c��4|�H�(�93+ے3;�:'ϖo/(��p����/.Yp���n��Ѵ��y�:������?f��	�&&MJ��2%5-}��3n�E�i��#�D�������*�?��s�����;����s���0����B<��Y�|{㿛_w��.���Eʟ�=S�t
���354C�_��/���'&�cV{K�Kfv�iT�'��-�	�I����c�3�ڳ9���=�<
"�b�����h�]M��h��D�#z��1��DO�#z��������A�/	�O_�z��DÉv'ڇ��?���c��� �K���=Dˈ� ZNt;QY��	 z�h-�:����~X䇨�h��D��]At-�r�D��N��h5�D�%ZG�^ʧ#�t�c���� ZL��h9ѭD�"ZM���އ�#�Vdg�
�,�?�[�Yzn簲4����%�9��9@X��#��"��_�>EB����d�If��8���	���"�+���,�lr��%�cc,�
��%�o�+��eV|o��	�p�U�}���gZ$'�/@ix:cz*����$�'M꟝ݿDf�e���0	.ޔ��WB�M��7�3���O!>O���
9���8\@W|N��[����n����Ƃ�Su��^nL��и���n"]�n ;oa�\3�S��3T��p"�����ٜ����N��ЯB>桞�L��_Ĺ���8<\H���D�Vu�@�o��p���y��%�]ļ$�.g��&�Ն��{��1QYR�
�'����l���C�l��O�I�gP]J�������N�V+H�C��p��~�B�S/�3u� ����D>��O���E૽d�[�Z�r]���\w9�Z>?�u��\�#,�/�ky���s����z�����&,׮�	˹v���K;����76D>��e",�XK��¡�gV�	K;�\�m	��窸�	K��Rª�/aiG�����]KX�]��L������B�@x;�.��K;b=�]tu���ai�|��j�MX�&�����]r=ai��B�C\z�}	�O8��P��7�",�b#K�H�D�6&d	�M�S��A8�pF��+��8…��.&,�K	O \Fx"��e;_Kx2��P9W�i���Nx;�[W�=k5����8�:��#\K؇�¾�3�~��$�����	�	����/�����N!�B�O�%�B­�&��pk�>�"�%\N��o!܆p�R�å����#!�Ն��/��>w���,�C8R�O� �C����R?��I��.�O���?�d�	���'�K�p��?��2�m���'ܗp�c	$�@x0����%<�p1�	��%���0��o"���p�Մ��E����p=�8�v��'<F�7ᱲ�	���Mx�,o‰��	O��Mx�,o�I��	'��&<Y�7�YބSey�&˛�tY���?��&l���p��?a��?��2���d�%l���O����$��ps�儃	o!J��p����%A��N���'<�pa���x�)���Vh@ULؗpa�k	� Hx;�愫	G>,�%|A�#t$
Ђ	�6�'C8���p ���	g� \Hx8�R�>
�V��	���	o�����> �'\+�'|A�OX߁ҧc8��Q�	�nN8�p���.��i@Y*�^!�.��o��WK~�K~��$?�2>a}G�O�p����%<�p��O_n͐�	����ex`������+dx��.����	��S�ex�2<a}'
O�p����ʿ�'� �M��O8Wb�K�@��8��/1
 +�.��� \M�L�ę|�q[��{i��f�;m6�g�H�Bo�>����^9�JT�ϥ�b�����xϟC|�/;�.$\H��� ~����ޑ�l.�y��hF�EኈZY6��B�e~D:6�o#�CrΣ���\�4&�	y�I3��2S��g�pN��#ZBr�'9��.ʿ�3��qv��yT��>̄��F�
x�hׂ!�e��/�yc��C���d��|F�LjW�C�����'�[{�m
�5�xu~#�[y�Sߣrx��T�\?�%��p�J���OT�r+�D�X�_v�^��9B,߻
���_��V�w�T5���������MP�c�C�MT�\�q*���/���;8���8NQ�a}��Q����,\����l<=�_��X5}�'I}ϴq�$U9�<Uy��򚦾��r�8u&
��[8����B�W���rOR����d���(�zq�<�c���y\��j����8��r�܉��<���|:���B�MR���坨��<��j�pr벉j�E\S�у���?�<�n�
I���vc���E��=h��Ӧ�/������'�8��s<�()�ͫE?�� ��qBs�_A����%͌&M�9w9��rJV�l&y��I��^��[>��¢?������E��s~�����?w=�Kє�h��~̳�s��(�ū��z6Zշg��'�6�f��^ƪ�O<�4�n�*��S�Z��(����g>��ߝO)W
�Hȕ��!W�*��+�C�W�B����ë�r�<�r���]b"�1j��OR�S����^��B�3����%o&�W�5�/�H���$�|�v9�+��?���H���k�1_��t��X4��Hg��O���*�z�?Y���	�ɟcU��&˚!���_Q���4�C.��x�OS둈?ZSN)*~��O�O���N^�S��'y�#�6�+�X�<D���v�~�W�x�9/��i�{��3��w���M9��ȟ��g�N�N^K5��ו�]����xQ�K��yy9��Gไ库���p�#�M�_&�B��p���p)��� \C���f�[��~�������~��>����#�A���\���&��p,a��W�Y�I!i�,��3�_��
	/��!��̟f]p-��zY�Y� �_o'|�ԇfݰ��e=�׬#&�M2=�+ex²��	�*�p����4�8Q俜�\�T�W"�.#�)���)�3�'�K�y�ń�.#�0ᵄߐ�$���'�2?�?��"|@ꋰ|������/�!�r�U�ˆ��A�/�_I��B��GR��I}�%�AXn�YF�i��/H}>!�Ax���Z��oJ}�X��I�����>.�O�K����Hr5��庚\ǔ�3�_�7\Ь�撿�����r�����sC�s���$iQ ���Z�_M���3��~�p5a�?L�5�u��",��:k=��I�5��uG��/����_>��:�\�"���\W������r\ ��]���M�N-7��%�9�庺\�/ ��(}��B��u[i� �֒�#�+�i� ����|N�up��^M���E�s�o��1a��|�:�_BX�IH;
��,���)�R�����.�
'iA#���A��&,���B,���~P�����'�K�n�r}$�b򿏰\�N����!,�
��Z�_/��vm'\D���|�v(�N�0�?*�EX�[�	�!,�V�]�~���v
Ү"�����D��GJ�iK�rܛ@x���H��7.&\!��Φ�����iGx-��q����itVA���N����	�#|��������#�[	K�igSO�ل���I8��n�Q��H}�.�Ix��'�e�5vF��?S���O.&�we��-�E�Y�U�#,풤�a�_'�CX��%�hI����_c��"�2��nF���)aiG#�~���̏��*��o'�@�NX�UI;��?����"1�Ӳ�jge \L��������*#���Έ���Z�R�G����J�eU�?m?�. \GX�����~��+��H8��+R��+�>	K���	�y���R�ǚ���x�L_�.���� �U}�x��_���W`�Z�x�|�|��C��5؛�K�_�x�w�?���1���n���*�����C�[���|T&����#�i,�Q��d�z�U=�u�l��T̓��q��n��l�m��mj���H�b8�zb�4[�X��"/���k������gk�U�O�9j9[�io��j�v���Hէ�4�,P롘o1{�O�S��R�$�{���[�y��^x����s�z#p�:Nخ�����آ�
.��N��+p���?�ߍ���#֡�jzb�0G�W���ɡ~���G�\/����Us�ߐ�� n��:��]�uK�ݻX��wP��Ĺj�b�3WM_����+���8D��ZUy�:�;[� ����X?���K�w��#O���u�"���T��X��o�hG���q,�X�q�G�>���Gb˝��-����ho�8_������G���#օ�G`�Z�v�?��^�A!�W��m�}�T��^�P�G���Cb��%�-R�S;Ty�:�C�?N�<b��~v�G`�����T�C�+;=��Ab�A��x����=$��	n<�����l?��UOw�硓�ۅ������i�3O����~�q����ѷ��7��ϗ\{?O\4�p���U�bݿH
/�
�����q���g~ź�<U>���G�`��`��{��U�8_�_;�a�c�����W��A�t�HV��?̣yh���]�<�g�g2���w����b�,1���ve��{5��<|��p͝�²����/��]׵���d|g5��ߵtZ���������c�/�s���8�禬�Ÿ�����x"/�xv�,1�>m��{���o����G7���5s�Mxw�H�~��W*Fty��񲟃>~A��^��D�0E|u$}þw�7{6���oL}�?z=�P�j1�إ��7�=��K�6o�l�+o��u�4���ӗV(���]Cvl�G?�~�g�'�6w����o;~�f����U-��t�et�o1��v��<�n��#���)�����)Y����l�3��oW`O���Gm��`z�7���gW�zs��9������-ϧ���&Ö���|�\��'��e����ҁ��)Q�^�����a��-�m�珵���c����W��1��櫯��1��Zwz`��i���7-��Z��N�<ù�nx|}��6��6�{�4pn蔄�o�fl�]�6�f���tU��`�]�R���a;������%ib����濻2~�'{�9���?�m�Ͼ�g�L��t���]���(�}'~�m}���xs��Q.��L���s?�1�E��r�i%EO?���Wv�(*[���y7m]z��'���N�m���++Wu?z>7�瘭�������f\�����=07jP���}�O�^�����R����ᓚ��X�?Ꙏ�^��p���qm_O��ܵ���Xq�i�ף��\0�
߾ȷ�0����͟�{�y�ww����E����d|yܓ~�=�fo��U��Ԫ�O�2F�q˝������/o?��_S���o{��Aq_O��o��AӾ���ǚ/�E�s��C�'v~�o�xC�����eG�O��*w��۬�,�}��E���u�9��}����+�v��?6�v�Ǔ�~z;gPi���}������ٗ>M��0��i��v5}4<�8��y_���/oY�qz��Y��tp��	��O_�\���;��3���;�{u|��ʚ��p��S��Z���u{'��w�E@Y�o��ț�l���f����5u�/n0:No��rŭ]�
z���ĕg��پ�;SP��n|a�O�m�{�^~y��AΗ6���7~���w�>�L6���̴��o2���);�����O]<���|���l�i?6�g؞I�g�G~]�T��t��}_>S�5��uKc�8ܾ�cǼ�7�$�g�iE�5�|:�V�����}9��Ƃ�S/������g�Ɍ�q]�,�^qs�w7�͞�.�o��
�r�:�nАr���w�5�Ud���~��mj?*�벯.���w��-�r�H�Ƈ�GN?����-6����m��|4ֹ���s���Ȩ�V����vc���:���f�������?��[S������h�.�եԀ������~�_}�������6���5�k�+^�=|��N���_�ەp��e;'\�eꤺ�s����r�����ba�I��<^��F�sz��?
��ӑ�|���x�8��KS���\�61���Z�l>�j��͟��O�t��Ӹ�k3]���苯=����vv��G�l>qB�z��R]I9�A(�?�r�c�yad썓>p���Y��S��yo������y�7���'����o:�Z���7����줝'�x.p������r>ew��mѩ}?���s:�n~���;r^���a�r�.
�wq���hj]��huC�)TX6w_�����#˶xst\���m~˫�+~_/�~M�{�ݙ�����������^�/t�g���+Lph��<٫�Q�?��3����%�n���<�1�wn}�"y`Ҟ=��W��7�KR���C�[W^-���7�]6�Jľq�_�~[s����A]�Ջی/>�cw���;�C�T��i������ܵ���, k��/��%��颯~5�����|�������}���f�t����&��Hw��|;�t��+f�<����o޹�g�_����W�~�3/��L\6o���T��;0�rtT�
O}����Dz���a����q��EAa]�t�̘�}���E3N|���OX��x����7[�sΞؾ������n�����W}tT��%/v?�f��v�+��>�_F|W����_�F�$.��]Ʉo�t]W�y폟|����mc٧^=���]_��ɱ����s��}���>ڞ���}�nr�j��<彈�o<�m}�ō)�]>6��,���_/&����}��i7�?��ޑ���Y���ߞv}xy���:Ή==�'�����Ϟ�u���}/�[8*r����u���+Xm��d���m|�um��3F�ۺ�ׄ�oO�aa�#ˋ�W�}�h�	����{��cr�I\:(J�0ŷS�B��,��uf:�L���|�C�O���&0�T�t�mne~͋�_�%̯�
��jk��E�,x'k��ߺ�����C�}h��o�Wѷ�W�ެ�+T�˔��r%��%0���%�C�.�c]P'�G�ݴ�\�=+�Oa�ѭX�k�9���h�p\S�
w�@:���F41y�*���Rk�l�t�럜����q�rZs�5N�~�S��;9��*������q�I�
�s����-�{8���G���>��1��;>AZ���������:NMI����͟r�">��태��>�_�����Zw������~��G8����x�9N�~{�w�:�+oΧ��F��s�P�	~�K�������F�������p��۝�i��Orj�U'�c|��^�i�*N
_����9��]�i��KNk�t���iN���85��_���dz��r��֎�\�T��?�,,�j���[�˙k|�
�~p����fc�BnZ�;Ӹj���L��̽��<��$�v���V�gn~����|�P����K��?10�X��K�{ٌ7w8�P}_�1&n��i���k��g��,㼀��g�5�<c�ԧ�=4=�玗�V3�?V�}f1��r𕷾�7f�M^�`a�qh�ό�N5��.�ׯ
�_���Z���㢾�}���s�{/�=~���>u�������O|>'�o��7~o�e�q���{웕cLIx Q���Y�^�m���}���៷3�l�/w�ј�㖳E�����?���2�켸;�\�񞙯�o��,c�WG~{1��܈?�׌3>:=�t���x{���&�SWM�k7~h��.ew��g�3;�x��L�v���KF��s�qT񹈗�fcq�����m�;�'gW�k{������mn=-˘�O�兯Ӎ�T��)���;=uo���nyb˭���]O�x�mA�1�c�c?�j1NM��fc�c��'�IH5�(����F[����!�B�>���<����<���~�+���y�o폊�7�[x
T��8��l3X<��n����Y��M�N�A3���V�%��*0Z�K�%��iC|���6�c�g�v��fC�
�:��O�����(ȇ�M�.�[���c��&,ש'd� 
�i��¨�V{N�#_x�-�8J�<#
��wZ\.o�o�C�teC�vȺU��C�E������N��Pf�)��k�;z�����=`
�v
|^�k`=��l�{RI���v���f�5۳m�5�t��l�����*ȶ
r�r�q��1�yԽ_I��h&��?������-.�d�gQ�7?�0@��מ�����;g�%��6��u��l��\�Kc0� G=�9�3������2��޹�%���;��$ûӑ����WE��ܢ���ͦ1�G\Ӷf�53�k�x�{$#�Ϸ�r�.9]f����K֣y~)L#����ړ�5�ζ���P�DѦ����x����O�Z�I���]zBm����c7&ֵ��I��1��i��̃�ʚc���Jz�uz�Pը2�q�\3��E��+%ߒ_ �xb]��uUۡ�7q�5�w��
���.V���xh�2�fj�ж�ip*��X�s|c�?s�un�U]����?%Ͽ骸��|��+5mL�ïo�ܥ�qO�}�Kwޱ	���4s���pΜ��df��O�r�tZ�Y�:3.u��3S-6��i��:��ّ߯0[��bn�V������rzx����쳾3�V�ϧ���U��­7xc�PU�Y��	ߝ�w@�q;�~11Y9�g�8>5����8sXㆎ��n�
�y�%�4n�X�q�v�n�Hn�)��W8����-��uHᶃ��ͨb����&o7�/��-��K����e�[9���u�x{
������3q?|�N�s�����2���-�_��[�3Y'��n"�	�Ac�W,�M���v�T������n���<ʚ���9��f��0�+�4aT׏���w�IO�r��R�-:��|NGV�nr��
�5Eu�f��j�2��\|�ԩK�O/�N���ʣ��o5:
A"ؖ�'����T������������>������Zw�p�����֍�Z�\o8}�{�'MU�=�j�Lz?fb�Osc�ɻO���n'���,%x&�,�F��|-�j�h{H��}�o��_q�B���bQ-r&�J�n�� ���O��pߕ�w=����}?���2����nb,~#�'����0�<��LwZ�s��Ӽ,L1-����	�܇*�s�����/�B<�
%�@�3ł�>5߳l����j�����Ą��S����RQ�P���� �w^��@>�7�=ћ�y����Ayu��E)��3	t>��l���c��tܢ�x}&�^'���
�_����
��w��0�@��S#y*Oc�4w�zC=��A��T������q�
d+^Z����d)(2;)J�~���me�_Z~�y�v�c�T�ނ�v�G�݌�
��\a6"W
��ɵm�Ep�F�~2|�ܭ�.�4<�X�g;F�F�3��ګ}��,cO�a�"�v�?���Z}�1�;�h�����j}˜�-P�����L�a�-�Pۊ��5��2�����{��d�4�b��~��!]#�[�~c@~�.���K8����V{�x��K�˥0��,��nZ�*����߂��P�g?��=���/C��
�O�]���(J�y��;��?�gr�}
y<���Ӥ]x��g�m{���[�����V��MW���7w��<�{�	���A�#���-���a,�;��PΫ=�;��C=ʹ��h��hd�
�#^�������(Eaي�?R�?�/������:)d�Oρ�FBt �ų�Ah��w�*�S�F�(��w�W���׶��T]O���}0��_)��ݾ��M<K�i�>�;y��g�h>���-�;nx�LO7!�@h�}i���(��P�9����������A��5R�+�0ƭ��!_�yz���*�\S�:����n�`б�dM�|/�r�9:����Y�;&C~��A�mkD��f�/�¬}���W[ž��t�
���
����a����[���C_��t�=?��7՗l5C��O������J�~�Mԇ�Fƨ����P�?�y�E�]������P<c�CY��x������8��'�w{��پ)��)�`��L|;��&?��7�iD:u�:��SR�MOS����P�zC}�����]�b�r������q}����}Jm��x��-o*�� (����f4�V�܃��r_!�Kë���G��.t�"z�(��ɫ�Y���cf����VQ��LE
��$���j�[��$�9�:��D�2�&z��9D���-'�"ѝD?'z�h=�@���D�����.!� ��¯&ZI��������+��&�IDo!�K�At�MD��&z��DuY��%M4�h2����]K���V�UD�^"��4�h�>D�D��f�-%���&���N�=�G�^"ڒ�%��MD��f[�u�T.ID3��t�-�4�D.*L��Lgg|�,�����f�w9l	bE����D�R΄�Lq=�󝂫>��n��bv�Ng}��`���/��&��M��-�Y��+[��5�N�l�<����sa�I�E6~6j6j��[�E����f�k\�#�j�m�P�:�IE6�ut�˒^0ݚm��5;�fen$e�����-��t�ť:���q[̖�x[��BbO�z�"q|��a���X��Q2�f�ǵ5���8<y��`�:
A�LF�0��%�6F�/ȶ���N��<6i�~�6>#P��L�b�ǩ���y\qi����l���r��D���4=.%�G#J9���gϲ��]P3"0m�%���:{����j#8�3�\K�.K~�5���9�;���>�.-��t%@fG�M��e���Y�B�2S.v��P1�\��M�Ϸ�!8��=��	�}"ߓ��{ϳ��+�A�X̥�=�^�I���i��cl����Q�Xl�5�n�M5[�5����M��k�!ͦCx^H����f���\�AA񓬙<c�VSc�AW/�蘿��l�uX��X7� ��R`EE�1�WE(�GS�p6�����(�B��~ϕ�noZ;q��B���*��_�ZN�x���FDj9m@�Y��T`Φ���=�}*#�<��q"�	��A��\�+���6��qV����|��%[���tv�O�$�f�v}ۊ���Oal
r�<v���K�^�]��Mz���Xނ�+�B,l���l�+���c��a�%��l��}�#j���P����(�袜�É�\�r�\�*,r��S_#r8I�3iPdP��xi"���ߧZDAi�'�Z�Z�Zw��7\7��Xo��f����_8JC�T��oI��Kg��YnC����<��\�?]u^�Ns�����@�ĥ,00����bV[�.	wY/<�ǿRW�믓����WJI��M��y�t^���~��U���I�����߾��������\��W����M4��������^h���WE��|�KJ�t!�,m��6�Z���O��;K9���:�	���
j"��o��#���d��M�Mu�nm2��΍�n����~�f�s�Z�Ň���؀;E�:귛/��л�:O|����h?�]���Uz�F@������@�=0Y��t{��e}h!�}@�z��5c�St��icQ@k��E��X�UH����6Ж�f�e,���m����9�phP��1@K��5D@|��,�
;��E��@�Q�H�^)ܙ�1�\��=`���rt3�����Ttc��b�����jم�Ϭ�聶̙����]EOƞ��+�`����ƭC-��0�;��*e)�ֲ\¥@O����ޗ�UU���}��&��FV�㌒r,5rH5
�.�������-,�����<̇���
����Dˤr�2��[�l<Nݾ�|�sW-_���]�}�;�w��������YE��
x��H���{�G��`�բ����0��=���x�g�VӋglFk�����cM6_���20p�ԛgp֒���i��&�~\����J����e�:]UN�9Zo�k�x&\�V6@��=��U-�yC��p:ʇ�=m�V:~Y;�4X��q��39cM�P��*�}ԓ��8��UC0V����8���Cy�h5�^�6Z��&��}?����
G;�yO�V2�g�ՂG@�p�l�<�?=�u�H�8r�
�
p�Ga�\X��i��uX��_�5��gf5�#u�R��A��\W?%Z�r��q<#s�)x�������4V����Z'
��6�g����j�ʽ�h-�J}��*�k�"%A��Ӆ��1S�����i�)�i�'`�<�)�s_9��𿓏CZ�ڟ�'�je�:�~�g�Fk�ϳ�q&�R�k*[�05�/'c���<+�f������~��Co�^�K�ў�e؇��)<�g��7��`��'L}|C�e+Q����f��&INX8�}���fb)��V7A�<�Y�!-8�g���2y�,�p�f�L�j�&��sH���c��-�)_�n'��7>b5y��M��B�ǵ#�gj��|�_p��X�{��D����W���'�
<�#ZK\�6y��,S�[)���D���j�P�ǛB$Fl�=Ҽ����	��R�`�,[���-z{^[��q+�ku��Ƿv�M�y�r!��y&�A��m���w���ja~��[-��C9�w��G��.� �����!�=�呰[@`
�[�;�(��ђ>`�Q���G]�Z�������Ur��GM��o�w�ǺK��0���r�C�G�.p;���Ǯ;�f�\�{Hݙ~�	��|ܗ��q&�}B���5�7si@��A��E�~79�ģF��Ą�<��|E�8��ǩWПo�v뾥<k���r|��F��_����Y�њ�����ˍՒ���juN�#�V�#���f�I/�t��pH��f}h��X���|�
���D����c5��Y��g��y�"D����;~E��<��DR^QZ5���
M�c\.,ǵ����$�����o�x~�f<�v��4�W%�R�+k��U,�T�??�E]�)=*�8V�����4�n������k��ߠ)�Iu��in������C�Q.�
~0��|�&��&��߮���D��C�M�M�;5��wiJ.���Aw�ݚ�g�ݼ_-���0�2��U�o�j���bM��o��$3�C=���X���j�	��;hb��B��t��>^w�č�S7M���⣉9���h���&[w
���ߧ�8����{j��KSzR��Uz�A
��!STMt�bL�}5�G"�i�����A��D�m�}Fv�?��A��j�a'��h�#rG��p�G�i*�~XMF�����g�C)��Z\8��9��↱_1�c��[�!W�Y��Fh��X��6�w`�D��<����_q��Q�_��E��~>�z�ӄ?�=R���
�Q�w�&jKctyz�j�r@+�O@�&?��L@1Y��?V.ir�:[��Su�=�y%�^���N�31�d��*g��1��5��E�rt_�)�g�]�zA��)���������C�5����J�{Q_D*�{ԭ�qF�
M�c5�0�UML�_��/�5�&�.]C�����K�;��뒳t;��b;�5{��
�,�?Oq���n��␪<�qI�r@�>X[�)�b[K��1Y_��1��4_���D)����|cJ~CSq����>�Ky�|��^ě|O<��v���T�㝐��E|�w{`��|W��^���0�	�:�8a��~���sZ���_��w�
��1��n����D�;j��c���"�t�g�..�L��cU����g�&�v�N|�����h��q���9ҶF���F�3��nA\�Qv�����_}�������M&���%�/q���}~w�ߤ�^����z������e�}+l��k�<�p���8�=.\����M.\{IS�gL)�vw�I5�����'_B?/X.5��u�&,}�Q/f̘�Ԇy4rjj�����6meee��>�ϟ�%,�*��Z^�(^���(Z�7k�nu�[�<g��ܬYs�IYqn��8�����'���Y�x]����B]�-(w�sR��U�gͩu���]���uď�=�_�g��ݱ���s^�ӟO�s�F���	e���דΪ����o�U��g��5ڗ��$
�H߹�?���>W�/<�\Ź�3����?��&�~\7ݼ�Ϋ*v��X��{U�[O�k�u����R�%��������W/���v��l[P��2�w}e�վ(�0㑊�s�me��n)���z����c��z���U��Y���J��W�9?<��L�cq�u�j7�T��KvC�lBwT�Ț��+��%�|di�r3�ȭ%��é�W��=z���01b���SO]��)))"//O�[�N��~*�9R��V��
sOk��f���֧�حb�֓[c'N�!�حR��m$4a��OGn��_=2F�_c��<2r�ȭ�Cz�FN�6T��rޒN[nj��e��#Yߦe���'Ξ-J��b^��ңYk)ܜY\&e�9s���G���.�{ޡC���-,��ׯ�!!!��
&F�%F�-�x�	1o� 1a���O�ɓ'����?�Ν+�f���������&K'����	����E�-D��`�ؘj��̘(��Hq�v)��+��)z�/E��x|��K��R�/E"�ȃR�9*�8L��~'łĒ%K������/�,V�X!V�Z%�v����R�-))�ׯW�l���b��%b�R����w�;w��v�{������/�W_}%N�{��J/�;&N�<.�,Emm�8{���&�F�p!��Ҹcоzs��f�Y�"���b�&f�i"U.��Z��c�Sq����~�����$�R<�U�/~�?�a�����c���e���v��~��!��I�q����-�>��t��˄؝��m�G-���.�WÄ<<M��˅�]+��ۀ��`R�?���6�����W��ۀ�����K�"XIi���S�`H�o�?��S�������Y��;`�m3y�l{���Z�(d�DŽ�nr�3BN[%��ׄ\[.�.�f���~�?����>�\��G�_[�/jx5ģ�gQCj؁��ږR��]�Sä83M��˥�y����w����p��L�'𳁿�ہ���������n�]�o��������i�_
�l�o�.��H=��
0 @?VjH��۶�8��i��А����@?���Ȯ^�:uh?xp;���<�!�#((һ3lv>
���
���:th��<$�? 4 0(���۽��#/j�Awy�٭�^C��m��������F�s띞x�^�#��@��Ȼn��N����}[3���?��n���~���*��L�� >
���n��!'iC���G��=:04�+���;�r�7�=�-�y�J���E"�
|80,$44l`X�
�y�.��aA�Â������|�٫�����0z-�/8�O�߽O�8l`h�bB�`�?���OBQG�A�n��V���H��h�a<��A�����h��f�Р0��֊�{�!���ϭES�_dXdX�@'��w�DH`��>M��v>`_��?�|�ǣ�u��2�İP?(҅�������<]��#0�����C��ܬi/���C�.��"C��dj���~PW�hF�@��ohy���0�>�5!\��S�G��Џ!.�Y�z����'��Ǻ��� (b���<v�]л�czq
k�Xʲ�u-l~�$��xn~#��X�&��s��S�xn���*�3�>��I�/���Ԅ@�n�@Q��<�@9b
���ϤuP��_z�%�r�J�z�j���&233U��믫x�7�P��'e9b%��
;v�~���
�/<(>,���[��w߉8�b�ӧO��~�M,?+�Z\�����j�
�L��n6�0�e��r��.��a�\L�{�r�O��G0~׺�c@�F��-?��^��~(����j�����0�7N�o��5N1��ԪU+�Jӝ��S�<;�����V�V�<[������
=���W��:���h�&\�jӮS'�m������[�ݶ���=��D��o��w����s�^u�0���������η�|S+�;�����~}�Mo�ܢE�&׵�r�
���G�ۛi��0�Ӽ)���V\����ͽa_m:��v7��\�}�o�����Ǜ�ID�]���{{��V�ݍ�w�ڴ����B��\�ss�K�|���ay~P���>�s�����0q%����\rSq��I��鏼zKz����[�n�Ne�ч�7o�s���OP�	/��㲌�������TЙد���5k�<�q�͓'O~����s�ĉG��:u�$楇��۷����{^�4�}��8y�t��ϛ����(k̷t�ؑ��d_�|y���9f��^H����>��̣�֭[�ѣG%�S�駟r�J�߿_b�-�<H��_����>��W�m�6��<��r�g�x,vK'-���̿or>���)�;&O�|]]�/B�$���'�{7l�g!��t$}�K�����M�6I�'KKK�G���|󍬬��{��Q刃��g�ڵk�nܸq.B���-j�Z��-[�������w�q�K�,y��c�yy��k����~��e��k׮'�p����eYYY}?�޽[~���N�G�ο����_~��ɓ��(�;��?�A�~E�5�������O6:th?����`o=A�2�^+����V}&�F&F�L�L�
>���ܐ#����g������~{)��:��<l߾]�O���/�8��I#m6��޽{U�mP��m�8|�2��K��y�-S=�W�?�����3g�HCJ�}}};R��I��]��o�)!s��Y�0���عs�ʤ���\�JUU���<�P�h'�i��1_H��=vJ���ۤ�V&���;"��3g��V�"�.�oٲey���{"�_Iy(H/���J~(�ο)����Ze��>g�^�y!���8�;)�>��#)���
)�/;��:�%e�7�\�O�s�έ�2�臯�Ϥ�Ȇ,��G�v@}y�k)WI�	��<@�>��>�0�3)Ϝ�2v���-�[WE�ٳg��K���Ѕ��r�/��zD��>���7��]��ACA�C_�<�X���7x�	��V�����u%�1fH�S�1I�21�JYP���q���va@�ӈR>B���>�y�W)僻t,��{�K���/^ޡC����2�}Kc|P�/�_�>�@<��4�0l�<|%exJNȫI? �r)���g�q�L�l�јL���_�{6��YsB�+��KS��}#��CR��2�<|�g�L_Þw�L��q�n�]7�6
�[q)�!�=z�h���SO�A��^7���N=�_�N���+3f�&�W<0=qL��N�K94�b��i����S;�'��Kuߊ��1�۶m[���9�N�_��,h�6x ��{����2v_�=��L��S4����!t<rP�g�`�3}R����oKٙ<��͛`�媚��^�?lm�!ڜ���y�xp)�"���Ȣ���<�Ҧ��'��2�[�P#�Gt{�O
��=�ÞɃa��I^o�j�6��v��qV}&Fn�Gc6b�´q���9�e�S}dnx��O��=.?�E�!<�9
\�9�i�{u��K�
��	<�{�Q���G|��gϞm�,&������8�q�q�e���A�aރr-x(�y�Ty�䱫r6��d��װgg��iK���_�߻w��i�����v��~�{�k�79Vqlcڲ�Wn��%s����О�
��|r�\:q�L���&����3�_V�xp�1�9c�K����,#ݤ��4�n��6dB�s�%�����˷�C)xX7<�h��!���
')�����8�$��x`�O��c�|�q�����8���p��|ɸ�Ȯ2������o���h�m�r��[x<;�>)mF�:��L������&���3�a!x����۸�!���������g��������5{^��? �Û�A�3x�O2����*�O�l�����s���У1A�P����o�����>}�t$
�/99����|\���~;'l{E��4Pn]�+�t��k.����a���B��M�K�u�T���y��j��@�>�I�c�]>lذ�)S��OZi���y��)\��J2!�M5�c5�>�QTcО������샃�)����b/�2K�,�3gά��r|\N&L�I��]�=��F�̥ҝ짔��m�S�N222RfeeI�ˉ��r���r�ҥʮ���+�w5����@_�X��(�L����3�_0�ȘYo�F���i�)��+ѿy���u1��ڵk����)�Ǐ�~T�!==]:T�1B����/��|��=�ߓ^���0��zȱ�m�x>H~�C���3g^�1f�1�>镤0��W߾}����-��@חc��s����a�g2))I�&$�z�!#���;JH;i���2�A��{��0��,h�ieϐ��=�6�犍k���y�_\�b�Za�N[�6�M�5J�k�Nv��Y"�V��چk&Fn�3uʨ��u��r��1>�1���r�&�/?� Ϝ>�����T�x�⟖/_..\x�����&MR��y��%�@� ���|4�k����i+\��<��#Qv䥑���}t��?D��ڭV��~�<�|��GU�M<t��EΚ5KɁc���c�AzI���˹!�6B{hh��]��?�k\�mQ��Ki,��v*�̙��@H��dDD��O�#�c�˹�k�=�$��7W�bL���%�l߾}�u�ֽ�9�����L]�z3�.�9Ϙ1C�o``��ݺuSr�s�4�1�2lÀ�#���1eg�ou��U�_(����^�z�E.�=���[���
a����h9d��[����~�5���n���36��0֦�h��>��G=�===�!��;v�}ϧ����v]��_�9_$=��Dl����=@���t�c��1��G٧���,**Rc`qq��c_��j�۞�9�oǽg���q��7*~c�C�{\�k�!i��i��SKL�<Y�Vغ��k�߆�h��	��2�Ov���7륌(���'O�o6��
�w�UWv�m�F��C��g�}V�g�q�5�6#�~������93i'_k֬���d2]+���?�{1y0�bc|���0v�yu�cm#k��~�ƈ!��C��.��iC�|����"�]��>��ېB��?�����_V����Ff9�u��H��?��v�@���u���g��c�0��?��8��ݰa�|�W�>6�L���y�M�����9nnn�	���1�kls9�0��v�O�X���^�}'y1hG|����w�ؗ��ߋ����x1�<��;ʆ�(cO�2�/�^���iG��\�~�c.u9�0�g��k��1S��}�]�w��W�;�@3�D�������?�c'��?��#���c�9�����K9�>���~s
����l����������n�~&��u��y�5���V2�L������6��ß��Ii��u֬s��<�7kV�~�:�_2tsB�	ş����ks²?���N(u�9��6s�N��	��p�Jj��n�,�@�=͜���L��>��g�y���끗Jl���c~hLL�0�A�|
���1��g�uU'�̃R��q-�{
��-��J�鏊���@^�nڴ���M�M�џ!�<
{~�;��/��#�}10�E�qr�a}��k�����\��')w� �����i����Y纟n�kb��;c���?����|�sϔ�����
���))+�������.�~��G��N�?p|�_�XD_�X�q
��o�15����N�is�k��c�R��`:�'��=�l�q4�Ę�0nrM�/{쨾�ǽ�u��-]\�N6�վ�
�y`�p�:q���h�Z�\�\{B���鈃����>r���}?�X'[sL��5q�(�0(����ϛ+&�50�sM�h��o�}O�)}��ڸ�C}��:�O8��Zn��q�)s��}�u�ۈg	[�Tk�\��:�k��{��
��߹Gý>�1Q�����>�׽҆�串�Ĺ?�1S_�=u�\���4PG5�G?��N}l�O���<)zŊ�\�`��sB&�qM��\��{���2��ۣ��&����>�ٳgO�?���{����&�&��s��й��}&��R��Ľ�E��9����xE����{�
�o��p��������^�4�6n�#�Ź�½	���l�A���.�د�b�3&[�dI�U�F�9�g|N�I���x�o�*���;׶�8�h��^�-&���\}4�n]�����SOM����ༀs;�	}��T�����}�O�8��3]l��L�;���;i`R��vG�w�b�7�g�C���,�{w�+���^��X�W�4�s�5���?�����G��ꫣ�7�x�t�j�A���?�3&��=u�&�G]k�3ƞ3gΔg�}v2��^P~�~�c�?u��A]dۮ{N��X�8�)l��>N
��+�\�S��5]�1�W����{a�l(�w�����˓�>����/���y��|��?�7�5ꀟ��Zw��t||�|����4����槚/�i�E�]C�g����*�=�O�K�?�������6��7o�ԱcǾg�X�ĉ�:�e��څ1�a����w�
�d&։rA�.�u��u$�^�9�s_�{K���1cߗZkn(c7ޭD�|��?�G��m�ǹ��u㐐��J�M�������#1t�XC6��ĹI�&M�.'"F��9�Ҝ�5�
}��.�x�F?r�HIYp
�r�~���C�b����4�Z���	��d�J�����:۱���K�Z:�5h�����H��~�>�tnݺ�qu{��.]���6ʘsSΤa„	���[>��Ê6c���b9��/�^�k���&���$��-Z�$��<�|��-<��j��v��L�c���2�T���U��v}�
װ\�$8%$$(�wU�uEʋ}M���ݛ}�m���|���a�k׮��W�Vk��\s2��`۪}�c���%�k��=c_�4PǸ����7�	�Ѷ��5P��>ʹ����w}�D��'4�&0Ӿ���.�ε��Uk����J��u��n=��s��W��w��K҉��A׬Y�.==�|�YYY���ξ���DS����}�i���b�۷*yc������i۶m�:믨��w�vȹ1��s�_��A�!�^yPU��gY�4c8#�1l��,�>gb|�š�]��l��f̉\c���x㏿�O#o�o��V���3��zl8�9w��W�8W�`��tq��sr�N�g���BT���`+O�up.ι�~��q��y'c�T��~��sƋ��{���5}�����u����� ��7���-�{��k2��|�`�U�����=z���c?T�H�l��|��;�v�8w�3X�1b����ʕ+U<�wD��FYR_���JT�?w\}�Mf׳�0.(��=9�?`��Lk�ǫ�������S���{��S�r���O�)˯����V��NzH��F���[�lQ���>�6c.ʃ�ԕ�ͱ�U�Yސ��N��8�9q����1��wŧ�&ݬ�}��"��1��I��<�c��;.�e�׬ �Y�9��L6�4s����f�l�P�=�6�_�PW<�$�=
������^�+���DX,�w��kM�%��ܵ�%��Եf�ݍ��(1BD�߁b8�
C�ø����7�[MN���Ӕ7����&���k��z��.D��"&��x1IĠ�)"VLE���E�"?�܃_��P��D���*�Q~6��������OX�Y��(3N��:wF�D����]��h;9%���ߩ���:�$�5w���XU��>�ܥ�Q�t�K��E7�-
�P�,����a�*?5Nr�p���v��I�I����	�${Ɗ>!@�t!�gF0(:^K�*چ:�w�f�7�4��g8��(�z�q��w�
{���R�8
�%4�a\�g���R��<�"�7oRҤ�_��I�1	��S���Խ���9fʸ���L��i�#���v2'N��2>z��)1�:͎I�����F'&�L;i�LI��iF”މ��b&G'v�?.aj����]�M��;:qr���;�'GO���I�>ʵ5Te6���0#Q}��Y[�+�v[��Ęq3��v^�NB̴h%f|xB��I1b��>�T~�oH�̘I�I��_��Đ)3�N�I�d�0�ߡ��)6zRbL'�υF|.�J_��h��S�����7\4t��M�wS%F0��U��u�"�=�#�+Ò���aͰe�d�3J2�2*3�3j3D�G�9Ӓ���iʹe�d�3K2�2+3�3k3E�G�9˒���eͲe�dٳJ�ʲ*���j�D�G�9ے���mͶe�d۳K�˲+���k�E�G�9ǒ���cͱ���sJr�r*s�sjs0l:�����rX6G���(q�9*ՎZ���5�Zr�s�s�r���ܔ\{nInYnenunm����3�Y�����yB�:�W��伔��<{�#�$�4�<�2�*�:�&�6�.O�{�{�����G�WTT����B�B�B�Bs�W��зп0�0�0�0�0�P�Cc���U��5���u���������\�U`)�-�/.()(-(+(/�ښ��I����”��B{����������������������Pyy����,E�E�E�E�EEQEqE֢�"[QrQJQj���QTRTZTVT^TYTUT]TST[TW$�݋=�=���^Ŗb�b��������b*������GFiFyFUFMF]�{�g�W�ofpfDf\fRfrfj�#�4�<�*�&�.�=�3�+�7+8+"+.+)+9+5ˑU�U�U�U�U����������������.�.Ϯʮɮ�v�������	Ήȉ�I�I�I�q���T�����;<^_G�#��Hr$;R:�:�U�G��=�3�+�7787"7.7)7975ב[�[�[�[�[����������H�FP��uy�NM���'�'��;�K��!���r��L�"
�
�
�R�m9�Z��C�^�e0�&C~Ȯr����!1/H+�����!!�S��@*�I�''�;�K�ˋ��k��y�p2��n��{�}�{�=ɞlO�;�r{���^gwO�L�J�MN�H�KKJKNKMs���UB{j�昡5�И(h�
�b���AC���a�V�C#���Ŷ�b{qIqYqequq-��lK��=�f���o�G٭v�=S�{���^m���4�4s�%�?-<-*͚fKKI������U�U�զ�t�ts�%�?=<=*ݚnKOI������W�W�s	x-3��F8��}�e����C��?U�7�|�|s��)<?*ߚo�Oɷ���W�����u�4�JjP�,XM" =Y������^+E�ա��aQ�+,�IQVR;)��T�V�s���Z�MR�PKE��Tv~����pip/_vendor/distlib/t64.exe�y|T��|'3�Y��2�����F%q���#A�
�V��TĤ7���Z�mmk���n�.@!d!"Q��x����~���$,�}��Ǐ����y��s&�ލ�U�� T
�_��������sM�%��y�^�.*~|Y񃏺|���������?�Ξ�~��]����n���\��q\�O�����}������㞣���}�_�<�3*��O(�f����],��c�������pI4�]#$�%
�W��O��N��|�;~�߂3��X���h��ו�<
g������pv.|o��I}W7NXȵZ������g�;�z�5
|�>e�n���[__��A�AA(��m
��יK����y1�+	|��u���U]_��a�B�]�K�+^Y\ϴ&�6�<�\��C+���x�T��r3�{%�����1�h�}��u��R�C��r�I�!2��)�"�Y;�PYz&���p^�7<ÐÁ�L9�MwkoNt��2a/����r�՞l�Oȶ���_Bsms�w�i�>���i��}�!���K�|�;2��H�O9�0�!��t�=�z�����s2;�u$����-~֨=4�m�˫�4fgTn��E�a�Q�π�ޜz�̔�l���l!��t?P��O�Z��/͓�KwK���$�`�@�>	c͜�_�پ������\Q$�\^y#����j���0de`�qY���p�򳵦k�C��]
o���
I�/����ک�8��.ݲ�f��?�=^V�}1���Y�v�Zoũ����a/�1���ßqQ�����r�kҞ��N��/����~����>�u�V��{��5��fw���Z����aл�ޓ*h�y�X/�F�M���i0_;-GV��wR��>-f�V�Ij�ᴐ�Q�{yz���>��c�A{>�B/���/��y����&\���â-6%��h���#��q�pq���������	$�<�[��1ڲu��s�l��ݗ�g+��I�ώIH�K����T9Ϳ53�t����k�)�.��	si�di�
��e5b�	rhE��p�x�v�XV˹����8����x�h��|e��Z��p�ˏ�w=�7`W6�����g�YHǃw���p�``�:�N�R;Z��Ȝ�O�U��]pV2���U=9��Qq���)�e�EPw��y衒�PwN�mΝ��Vf�
W��Vƪ]qA{G�58��cM^V�Z� �'�n�Ӏ�>�P��=f[r8E3CKA�e֥����$�-͍���MV�`�imʗ�f��Z'~�S��_��G���X�A{�s֥u��r���V���X[J	���2P���f��eO�X�}|P�S�'b�
��*����.J�ˆRz�X��t@{��N���`��z	���[���p�֮-��0h�l��p��\T�~��Ag���%P/�}�\���(�[ʑ)���Q��(圥��O ʁ�N�^�z���W�R;��O)#��EC'�p����ξ�@��c�T��pYx��B\�2RV{�`�����E8���lE��({��֥/�
�g���al�g��7���K�D�~s�I����4�@V�ᚆ}5���/��o����Ս[��kx�S?g�F<�P^�A��5��p�j�I9P0h����ٿB�ZS�4ꔦ�Bn(�y ڈ�
h�q��Bq��_C��x��\��b.��'�`��e!^�O����f�	���zB3� �ph&�n��\@<���f�>m	O-�nJm�<5�S!U���pN���COUʡE@���̲�5"�.ˈK�� ������l?3���\d�����$�3�p5})���p�
	!-@Y��b�@�{���/qݨN��峝Y�Z�C���mŊ��!�P�nj�GX6�&{���l��<�Jj��&�O
��{�p�AX9Ef�\�AI�O<�*��dX%��۪�2�Z��zT(~)���M��-v����0Xau"P��e�i�S��3��|	N�I<o�~���u��ȭ���/õK������_ߎ+^E(6�'Yn�Da��>o���<h8��Pg��Y��$�8'wsLz*�eǮ�
ם��ϥ����]x�ͳ���3
��1�8��6��p��uó�k��l�ˏ(I~�Q�uF�	4���H����>�~Q�l�ʫ�y����W����c����A&K
[y�aPjh�bq�.�,����i2;Z���7'az�@JO�m�����/͌6�P���X�D��Ʈ(�s�F�z�����,ܭc�U�^贍X>҇�mI����A��v��h���]�>=j�2���T;! l�9hF��5������"����t��������0�/�^�6�8��Hs��1�W��&���
���Mx�›�F���x��S(��V��	��}�Ze7�G:�S8�Y�p���_ <�Y�E������A;�C~b
��_�Ǚ:({��L\"�;�:��L��D֢@[7��z<�d�,k�d�B)t��u��o�s���j��®Q��̞��+�Y2�֕CKrR�$'QI��j��P��n�s��~c�� *�VLE7'�|���L�D."��xm��r��j��ܽ$|��.l���DHY7G�~Nal� �xP[��臰R�35�l���r9�j���e9�^�@5���w��a�J
�����j��7�l�Մ�6�����s��|Z�#�zt�6�m��[㐎��pP+��[�m�m�‹aa���h�F��
lmx� �祏
N�us��J�����B�t{,?�8U.���/,&.`�ۼ��/ǐ4��	YU~��� 
����y���s ,Aj#�_�w�hX��)=����?�Б����q��F[Mp��_�q�Vjv�03N�Ɋ8	N�{��d��� �NN�g��N� �Y{ls�_a�8���yٓrz,7��jgag�a㾩����'Ƙ�o/���"��=�X��}Y�$�K.o_����Ń�Y/A�l�'R* څ2����2����M�8�y���f"���b�(y}p����h��0ɦ��֦Ao7fU�A��ޑi��p-���zDN)-Fi�8d�M9���v#�_�tiy��6�*����c� �T�P�$��"��A�	������ޯ�S���j�}�א�ɬ�6����s`UeG ����w�2F7�6ѵti['��r%�Cm0�YX�\�O��H���n��~G�`{I›�xx�v?H���`-n�d���B�$�@��TZ��"_6�<��:y���P��I @
������d%���W�z%W˺9F�G�@���N^KҞ��}O�}�!�G���P'�B����w��偤��
�?4Hf��4�!{\i�e+CXIRj�'@;��	�����#��9�2�s�
*�R��iofS���₃U*W��jB�F|��w�W��PS��1:ۙ���n(@�p���F���J�����(�"�
0�_;׃�|_N���rF��y���Rq"|޻�V�ֺ��]��EIUn"��%�x O��U��oq�[�����"nn���X��Ek%b-;�j�-n�ͨ�f7��h =S���Eɑ�����rX�\���\���@�α?v��jX�G���?ٜ?	�4�@Ƈy���A��Ѭ�iV�n���s�v��j�~�&�o4�q̻����qscF.6	�6(�����ݶzW7�7ʢ����-�Snm���~:�|��K�oэ���	����؇z
�#����D�R�h=�8e�T�7�G`��Z�Ҏ�񰢊�ԃQ=A��p�P�����"l�фJT`�v��rA�Vd�C�?@mq>�=8�(G0=<�)�V��y<s���P91�*�Borh�EVk2s9d�	�fπ�qD(a�(��V?k�]�e�Uru�]�t���j�G�`�_=g'���>�q|}��7��u��|ڣ#E��s�dzE�bצ�A��O3`#�Ћ���9���߇E�0�[WI`�_�L�&����r�9@���ȭ��6�.8[Iͮó2��ׇ@�}|�v~j�Z��F]^�X�c�Q�A�9��C�]|�QN����'�V��>c�\6�Ȏ9x�3����9�6E�Z�*Bߑ?b&vh�{����)9{�{S
G x���J
������)W�@��"�f��=����C��%�|���G\uƤxC�;��R�~ %EG��y� ������g>�Ƀ��͓���c+��x�tM@�ĭ�C�@A�֭Z�5��$��k�<F`
��Ry% �*D:B�QV�
��o�4�=gWž�aS(D�W�_�ʊmr�iY�+^0�S.�FI~�9,� ��(\�n�?ؿ�v
��6�3��V&�'47��:O�$Nb���Ǹ-�N݊\Z�tjS����
ɰ������u�`�����v���H��d-�-���^��}��S �!�[�G[F�9� �d��v0���O�j{u��M��$-�6h����ڗ
�d]z�p5D�
��_I�ݫ�'���	�P^�_-��-�4��杈{���d7�"vu&���Yw>2�g�м�"�����/�^��#��G���Mu6*ye�N:�Z�C�a����w�
xVM$��3���*�=�����}
v�~��>�o}�935��/]�����z�D���,�ˏ�e �,%mE���(X��w(s�
T�=_y���ހ�Q��	T�1`��.�F��M\�X]�r9C�-	�W䅏�k����U�|��{���>X7L�sbU��j|��yZ���˾�w�{3���9�g�����]M��gv�g��{ra����V��"��q�|.O^@�BN�Z����ߨ)�V��r�J(s*�	�PX�؂�u޵��]��xQg��匏a�A �<��Ӝ�	?���A��R�?Z�撄��&<t.�>E`Y��rB�Np��t$1�j�hY���bTG]�ק݆��`8�|�3�
�Y��"?�P�s�X��q��EJ+#�2'���j�Z�a@��������nC�5��Ȏ�~W���M@ν�����u��x��'����@xi�b����\��SU3��wl��գ��Z�jt�AʽO��g��G,�[79̹(�xȼ5j v�o�B3����V�c+.`@1�5Rj�5��C�.Qiw��5	Ǻ׀;	G����+�5�"�L���^��4S�8�(E�	x��Y.��tM�DSq󇅞� 
L�JD��8{{f:�����6YOJ�`�\dW3���p���g`���f�7W����VG�rZ�6���#/��KV&��WB��R�〧�i�����<�U�vRA�
���m(�v�3��mo"
�\."�u@��v�����H��r8߉Zz�Z�ս��� ���<\LmS�����k��Թ�	̤7�U&�4��z	�M`nWAM}���8�P9o9�������")@�K���*��~�~�ޗ
׍���t�K�;��҅aa���լ�����:~v�?[��W��K��D�R^���!�	�I^��OL'k��2�M�+��CmB��-�bd]�[�4V6x���o]�S&��@ϓ����?c��oAUYS���&�h� ���K�c����$��o��qn�ۼw�[mu/R�9���䳖�?����b@�
�}��>G(����=YD�B_�0%Շz��
�o���B�uX��D�)���3.�g�Z� Ճ�a�}:ꙇ�;P(�/zk������&{��}/56%�;�{�A��xyҁ<�S6��!��`������qDy՚lnjg
�h01c���EF㽼��ϦY�u�#Ύ�2
Y>ML��B$��u8Jy���'�d'�]2�k�i�Q#خl�Pv`�i�١�QF僧�eo!I��NE�/O�Q:���Z�t��{���Y�֞�ȩR������"N;�D<u���>�'[����AT���KE(=
A=��%D�+�J��ɀ��T�����T�.�ʞLy!����;�lS�݌ΰ�����9���^N_�8*۰[.҆�õ�3H(�'��8e��
<�n̔<�r�P"*o\�̓R{�EX��\�-�'�w��N���2�������-�����G��s�"X�〠1�$����%��L7��ݼK�kFT�5C#�4�v�p�x�}���)!�@/�����Pa�OxRF�8�@X��A�<��q0�#8΋B�7�aQ|0�TC��:�X�}�;�*�E��M4�0�d�A#�;�	WqT�\�v�����Rڇ��u`}�L�,΁�O��=/��� ��C�_f���F�N}���/���XK����W��.8`�����)z��ՙ�n<N�u]V��1<��64h<t#˹�u�3a):[G{��f%oI$� ��8�%��Ü��r7�|}��9H�>Ҍ�g_m�Ќ�	$`�n�$Q}�Z�1\���㾬S���H��7��4iw΀Ydp�B7P;]5r�0����y;�N"�i�����R�I�|Bm��<�E,��X�i|�].&\#�gEg�n@�7�����[�<s��r��/?\��
׋��i@��3x�e�����P ��Z�Y0��W�[�?���N=�>�m���n
X�X}u��kmC�ԭ�z��#�����b9�%�>�}�x�ޠ�=�Z)��J���U��"�C��^
O i&�ȥ�|a�W��u@�̺�~���d8U��P��v��}�q�����[�m��"J��˾��[�H>���\ �
`�����
ƥp�m0�fnR��g�qj��8��K�ZԢ��d	4�19��Ӵ?	�zĎ"G�}���`���K�����W�kEIQO���C��˗̗��K��I�P����k���R���H5B�ؔ��$P��,�5��em����|�̴��"�,j-�ZX�#��6��C"���n���I��L���ܻ��g��"~��?n
0�vd[\H臡hR~����	� �r�E,ۅzO˪9�'�Y��Z��JE�iM�,�	�R�1�G݅CWO�H;�W�c��gqя������ 3����S��en��ګ���D�fV<Ѓ�Gvs#o;x�����[�T^�v"���i��Q�UO"&s�Gt��_���{GD<`�1���A�Ş^�*4�I�$8a~C
:������Pm�:�Tʨ]�`?mZN\��#I>����}���#k%��o�T}��QkQçC�/�[�%'��#{�����{Y=i��K`�+��+�.��+�2k�_z556p��,�$&�Q��Ů��~�->|���"��O�
��V�;��Z��w��:��IK��,
�i�L%�;̒s�f@��=Lbļ�Ac����m]F8����ua`���݆w����;�$TydiO໧~�0H)T����t����.�mt�UV9�]U\���N]F~�BtK���$6G`��|)i'�{���㥯�C�P{e�C�Y-`�8���*HC4<��U�Gn�ek׎j>�;�xT�֞K�]6<��R��v�iT
�k�!�U t-�[�b�E��>�M!��[Mb��}Y���?�6����y����3$��3$q�h�f�Uq�(����`/���>�ېd�z�`��ȗ�>ÔGkL��}�AR�~[���*�h�еc���/�G�(���s-3vhF�<5J�f;�Ǹ`���Ƙ�K�H*�9����x�4r�xG��>�*���m_��MF��n�$�P����]�
�� ����`��`�ܲJ��&z��i��-�P�u(��[��j/a]O�2
�y�Y��2�����SE��8��}Z�Y�O��B��]��3��;x�u�a2T�%r�;1y!��T�!_����<*�s����)���'m-�r��oP~���P�I����@�C�ԢL��o��l��o6�II�TO2��_�e�}��練#����
h׷�A��{.|�~�� T�Y�/ه�0��fѳ��o���ᗵ�4]��Ƕ$�aQ95ؚuD�D�k�U�r^��Zh2W�`��u�k-B�b�NM�-蟣�����k���Ѣk͢5X=n����â�]�E{=�s�tW9	Y�;G�h�#�<ZӞ��Y/
����Ŋef��'��n�{��81�IH��5�q!{�P��k��R~�X���q�&��
���T�Ї�.x|!��a�Ҭ݀����\���Rn]�M�#�zH߂�$��� C�����Nڼ��r�A�M�m�<��\��JβŽ�I����Oɜ�E�N����w�@���m1 �Ж>Ffe�4���Ѩ�|U��ۯ�$f�~�����7��'��z{
$��	U��w�M{H��/k/7��Wͻxy{��;p�Nn���wi���axQ�� -
/��N�x2���2�?X�t'�
�����I��V�����Mn>[��gS������|�i���Y�B���O���P��u���Z���
뿰>��u<��Q���.�2	G6A,�9>y,�0���t�P�[�ԍ� o�R��P��Ѷ �T��N`�(���-}��m勷�nHf�l\aHm����G�Z6�(ȧ%��	��H��6r}��q�(�*�ęlF���5t�@6�I�S�$�gԿ�V<Yr���I�v0	�VU��,�*٨��j�g��T�V���N�K�lE}�n��
�&����+��F�\}�&[?ayga��s������b�z2�)��y�2A���,��m��F�^X�|k�d�D�^��J�$'��y�W���T7��̖���g����f!�}��s{�Aj�>v�Gv���W=J�����^�zP�T��ѣb5��-F����D���R��z��vݱ�^i��$���FŲZ�� Z�E���A��Z�R�>�l?vIRf���H�r�IT��ݶ�>�SPZ�u�3�:V�uB�/��>W,Aȍl�R��:H��R��Q�_P�ʼn[�JЋ���hDJ2�52O��F�+Ӡ�I�P�;^,0�Y/�����s|��>� n��g�[�}�_O3K&CIQŭ_&��K�n��>&�b�
����a;�;�ޕ�3`p�*���i�� �b�s$s��-\�z���yN�W�6l�.p�PȦ�L�a��"[���,��-�"�(�w*�`I�"by"�?s^2oN�Xν�x��"	�T4�/Au��">��Pİ?��a(��􆂎@(�/'�M0��(�)tQ�y5�6�̬#�Y�L��*�3���A���tڽڔLk�B���;rS����T��` <���\��vj�n�W������aE6�pM�>F�)m��~�}�m�zdy���}�����0�-�W�fM$��P��Ρ�.�?���/:��8�Q2K�|-�`�Za+��'x����=���º���H��ʰy�X��JhV����	c�����E-�z!z%c�.�)�v�Y+��
�:<�J�Q巶�]��τ�Sj׀��)HeJ��0�Jl�A0���V~Ib�j�I�W��k�`? �	�9�W9�n��铯�3�S�i�tX��S�>V���#
��:ǯ�l��'�2I
�Ō�������d+��fU�����!ڨ%�<���f`ğ�楧z���__�??Lw�e6����u�N�E�)��H*���^�p|��*S���-� ��0�,ƔՄ|
�-�ЙG&��w��ɷ_�vAf�}��!p����.Z��s�
e�Z��D(/=��Ї�Y�T!@��<~ɡYP*�tVj������K,t����=ڞ��T�}����nm4�:���p��Q�sFmc��v�H�ՊW[?r
A�d��}�^W�*��8#ja�:-��/���u{�X?�� cJ�_]CM[�y0���s@��H��ث=��<�8�V#�R=����܊d��hi��t3�d+�V\q]�""����ń���@7�m�I���y��b�/���ȡ�%r8D��|vm�T)^�_��F0#N_��A��^��A��C�JT�\�=	&ü#��Eo(I2󽢾B6?��D�,�|%hj��7O��/�r����؁@h�?
�)�>뇣^TI�KڂJ&o�
(�B������`9wJ��]�]@��w�4�mꧢn��n��F.h��h�`�%����٠�l7�@��F�ll?���|�.4����]��]>�–�0JO��3�S,KG�.I,�##�<�L��X�oz�)����e��,�Cs��{��w=(����IJa�@�~�W�h"�6�Gf�h��c2.���󤕩��	�ʨ���e]<�^qG6��H��I�8��L��c�t ��R�N�Z}I�@��~6�eEoW�o_�1��x��#�m��M;�m}Sn����\#n�/��oԞx�چ�Ze�N�+�:��X�!��h�ޜy�Eb�*`����b��Ƨ��dx,D'b��9���}	�O��2
��t)�R�ZA��o��b^�Á��Xvӡ8�E���9µ���"�7��E/j�����z_>����e��js.a��
1t이#'��F^��|H|v(R�e뛶<���J���XV
	[7SG�P�ܯv�����%hf�rk�Ky-䄥�tl@t��YȾAO6��T���ʍ`��Q+sH�����K|R$�
O�DR��.3_��kWIa��P��3|�4�Y�K�D/�H|�w�����~��ph�6T,��< ��n�
{ah��]��+_D���xk�/P�,���M���]�ApH.n�lju�Т$�;n��G&�/�������n��-�g���ي�v@�Dު�Ǫʍ�	��<IR?�<%q�EQm�ÿ݇���:�q�nX��3��7>mG6�u���]:OXUxH%9��u�M�A�9�˱�����W��Xv��,
�#�*�鈰�&8&��Qx	(�z"AɄ�?`8O���U���ؤ�1�_[Z��X�O+@����A�����ZY�(��B8��ݭ
�2I�~Q.�ZU�듿��'-�X~���3���Q�·���P�e	}�@l4:�@�w�|T9-�4��f!�
��[��@n�'��Ai��!�#\=�%܃K��E��6G>�qʠJw41��S�z?��L�^hfa��_F�7�j$�}k�g���p�ĉ�J�� 2�M��]ԍC����
m�$y�j_?)j� P/c��2;/�N�<�җ��Gf�?\�qn�V^�~I�hV������	\��"����������5�sMMC��?@�>��N�ɸh�k��X��|��ޱ�X��+�oΑ���� �ۜ��f`h�e^*�����W�]˕�-+))�D�Aˇ�q�Q?)�8(/��7f$G:,t���S�!�"��(�PR�o��5q7R�G���df��ߋe�#��J����}��ث����^|E����e����^�X6�l��I�
����\�_���K9�W��zqRp���!M�S$��S�D P�Nށ�^'�P�<��v���b��I�i83ج�[��:[1%�
��!�\B�z�]LW�k��V���5V�ޖ�kc�L��	�=�|��F�<lZ�çE��MHЧ�K�~3L��_�-��!��g8
b2�<�l+�����<qx�S:Û=�x�WL�pD1adP���X=����3�$�%d_+m�{�ڊ�?9�g�ha��IjPw�T&��2-~�p�?7X,<����/�5��7/	���.ď���PJN��ԯ��N#��=g�E��V7o��B܅�%F��T�olzx�8zÕ��!'�ӗ%��q^Q��5�M���ފm�Ɨx�r�}��Q�����K�M����CsD?�³�a�k��EɁ�"[�7����O�'��
��H��.�
~#��i躊����SaA�`c7d\���r��5܈����89�H9�6�k��O���%�iHSUX�*��S[��o��u�-��Y�n}����W�T�Ԭ"e��=����?��/��c"nCBYU�=v[2���V�ؒ�n�yY׾���V�m��9���
P�ݝi�r�W�&8��E,Z�e�Y�xS����*�ˑ����D�wf���b~Q���3¿-"/�;�uR�բ�+����M<����8�Y��-m�:�U��b�	u�\�oT����h
6�"lޑ��{)��V���v@3�n=Y·��
�em5�����.2�l����lK��m����C��?;��6vG���$�ޮ�7㉯��je��g�%�"�WlA�v��=w���m>g ��h7��5�
{��Ǟ��څ���SX�'T��KN��A�?���������8c:��&��躅����u����xi���z��_׍�wY���eE���/���/DK�AI��z�Bp0g����<�kӷ�^`��L�й���׹���q� 4�3����.�F&b`#C�P��:��d2�@��s�yt��췞D��m/���E�HQ�(5"��)��{��?�n���5�L�E�w�Ds�,�M�x����O��,Mw��<+������+��X�	�lq�l�t�ve�6����Jm~�AFs�[�H�S�����Fm�J�u'�;l������ݦ�P#)�h4*6i�W���bP�@�J��9��r��nK��
�5t�C�w�ۂ��9�v�I�;.�4��߿|bݸ�����	:~�g�w�8�{'9��A�NU�d���\'n n�,�����/M�`��%�S�͞�U'��9{Xpp'�|�G����m�n�_��p��X�kH�_�(Iƾ��m|j�Զ�mé2�r�`����&��O;gC�şqd;��sx�����/U�n�p��%�}}�/�aݒ���Z�S�]s�(�~��H�h���ɳ�eAX�-�8�9��j�Y1�K����������,� i�Ys\�V4R�S�b�@xܓ_B��/8�L�{��W�q	
�ݰv<CN�b�9�갯�b����"|����y��}Y7�:B�%��/��#���a��z��K.�-n��rJ�2��@��g��/=���� (��;l䌊2K�L*�҅��S����6�
C��%Jd(Q���ܪ�8��f-:��4��m�i�1KCa�3�.#8�a��X�#�e��`�鑨VM�g��}�1��]�N�/�fv������۷����^'Զ��:-\im%lZ��5���̾�ai�TO'�Վ�or�##�D;('�k���q�&U��g���v�CZԒ�ߋ��6�^K�>#�����Т練�g^��wtwEG�l��$��D�g���펎�k�����J��	�s;]+�S�i'ST�Q���?�f��2c|��5G��c؂�4���KK���[�4ِ1lT;�'}=�љ���f@f6&�F�jo��}�A� c��O�c���WlF���=N�M@���[pp\���p���B�#H�rf�+e&�e�Ů��r��]�!�َ>9I�S�F�s;����-��K�Bb>ѸS֟`��
rh*��@χ��~x�jI�[0�H���"�i��wō��˄���Ǵ��Q^fLca��L�]�	_��-d߶a024aVE�΅|�v7��<<�?Ґ����U0�Ƹ�_�Dp^Y�g��2����)-�@������w�\��M�
��Ч>��%tm�Kq�TW��n^]i'~A��mT*�j_�rk&�:�x��C۪�`�~rȣ�T>q���6�y�⁗�+}�m���pJ���'���oh�Q�òe+F�ƥD�,��D��Z�V*��C�wk'��혦�r!���Um#f	���&���0��	#8�EvjS�l᠉Ο��i`�l�7��xV�%�����o������M�ok��pzct)�Ox���W���];��0v�p�6�v�q��c�:��P�s��>Ls�V	7B%��ţ�zt��9C�꙾N�2Z�{�R���
�~X"�wW_v�[
�/Sm�+�m�H�2��M�s�Ѥ�ߗ�|\���W�RRl����/��{|�W��(��mҒ�t�>�Ul��M`��t�X�X,�.r��W�ۻ��ϴ��mڵ4�Em꓃���� �(DɈ�y�<�	��&�/n�ы��έ�Et��q$-j�E
��f�S��%�� r7��ul�`��͓���$��):VTl�ye����d΢�84j���P��%��1�ܑ��e�v��6T�^Æ�6��g��j�%���G���Ÿk�㳹�Q�����w��]<2�ӎ�.�8yg6Q��-a�&X��W )F��pl���I�+�Sq�]��2�M��8c�f��N?���|��'����p�{1a؝���z�S��/m=�qb��/�¹�ӖQ����K��	��U����۞�;�x�Q
ω3\K ��>v"x��z�
��������F^�=y���nr���3_q����W�V,?H8�͎Ɖ�~I\{�iF,{��n��d��2�
;d���4.h�_�Y�[��ib���`��!Q�Jn��_��y13�`�-/����s0�'����������`��'�;3֧9�װ%�_�-�|}��l��I�1�5H��+�\��8��k���z�������$ԝ��j/`C���G�d{-wr�Xy���=���YЃ�uY��P�̢�fSK�e5���X8[�#��\�b�i,6�
�@���_i�$*�)�S�R|:�Sd+�x�1v���\zri��	����g��
*:8
˾B�V�#��p
�z��)��
����ʐe���M~�$���V
ͺ�u�p�mtш��`�1��R����M������g�.�K�g�p�5�0L��<]��ר��Q<[˃���<�J״U31��iz
����,���?c���K���Z+�_���.T_�� LC�3�E�ÔA<�K{��t�����d�wy����|ybC�D��L2��~�?n0�dB?����
IR��0'K`�P�ڸ�sgaI��@�Tnnſӳ�:r?�
W�ᬱå��@E��p�w�ctg��XQߡ	�����(C��}|=�����X@`D��V����K.�!�0n��@©퍁�R^nG���8
r�]�m��\i7��/Yzr#�d�֯�����c��"9_@�jm�#�~�5�!��	�l�7O�J�~�z{�QX?���b+<� $�͘�o3��yp���Ԛr��Ψ_eC�.����)s��%b�B�<_�T��	�k��|�9�b ��$�B3�>��=�Ғ8�˙k(���nB	�C.;
�z�$����,���Ag&�p•�md�I��𼷮B�gio]D��S~d�:�:-�P��W����,ʽ������t�u����䂯�n��d�'�]�������j?��c�&i��(g��a�ZƵ�#��K6��.����9���ǎ��Q�M���y@8�ӣ$�<��H9!Io:ڀ8J;[+џyD�Z�-�t�͛?őhtl�qe�s��S�G���:FQO�&s�D����3H�O��u�9̚��h���Pq����	�$c�\zc����(�,��U�3D�x�>�{�#1�Ƙ�w��s���]�:�!��f�9���1�c0��hI�
��酧Ъ�*=�HL�ę'%��`C�����+���1���E�sd�r��!Lʱ
�|�$�o��{>��ɳ�0���B���w���ع_�p�1i��B`�Q�5\4�ߙ���F�
���9������i����@4N�b3�nhT�nk���Gzt0���N=:�o%Ϸ�m}�!�V�1+��m���l���?`�+ OZi�Ex�!���E�/�!0���N�cN-i7��J�QO������'`a(�
n�<K�� �xZ��+��Z/�UG�7�Q���[mqQ��K�k��m)7�p�uZ\��N)υr3��X�,7�O�FnA��D�m��SY^jY�ZQm��K��Y�nt�f��h��0gˡ�Ky�^Rވ��(D܈�]F,�bG/7Ʃ�
�n4i��$S�g~H�U���j����^��-�â}G~�^��.�OD�l���`q��	���6AY~;��1v�~����/�ϒ�h��$��%8P�
|=��X��O�G���(�8�gJ�נ_�`�e���Ϡٗ�Y�6Rd�>s���!.ZDo߫9�p���u�p$�DŽ�|�-<�ي�������i�%8^.��8�N'����CQ������6bo�b�9�|��F�).	�`�5C|���o��\�.zG:�Ĵ��:e�!��RF�O:,�����n�dR�3�a4̭u��� T��̛Ef�I���7\	X�����#1�vڇ`ek#����R!\�a�����O�)*5�j
ߑ�)g�|��v���x����S�h��u��-���F�_��c
���W(H��ī'����
��:�M����ۡ��C/
z���^J�!�g�J�z�MYt���a`G�Qb���	�l��!A��P�X�Oz$�}��k��e�s� 0�-1�Y�����X �O�
��1i��)V�@�Y�F��E9�Zc�ʫ�\�A	<�A,0A��70A��E�3*�7�q	��fe^�=6.�Jp�68�W߉e��p@,�xT�|��}ȏST��hT��}�,�E�0����Z�JM��P��^�uy}�S�7$��!	zC���;��F$��K�����	&�W��P� �G�➙	��m��|Ts������j�~������`��z�K�l�_$�\G~�[gk��_.h���/���G�C��rtHVQI7IV��]~)`md�FN._5c��3	Ʊ��	����9�`i[�9v�W޸>	�8�SQ��(t$��b��p�m�^ր,���#^JBIo�0��2D���BƷ�)��˝>��{�'����t����:)/5�ђ/�x�9mq�=�R(�~&��#B�꬘l0��pn�Ng���<�CrT�_[�'��*�wT��݉f�f�UFr
��;չJ���9�e�eX�IGG�S,�F�yN��9d
�J�yj��jCP�7����O1����O��#I�
O����)E:�^F]wr���a�NX^���s��Z?��vA��y��{�F7� r+�8F����(��_���@.�(/$�4�,�\�'�9�E�Sr���Y�^����@�G$�}M�C����}ȻI���]Zu�(��&Դ�+z��7W�7���]����-�_|k?$���;��&(�j9䔭
������ꯎ�s�K�X����7⥗Z��g�9�b����V�+`!��/�Ɵa\���Cw�I��	�r��ڠ>|i��]�V���X;��|�*�ЊT	�5�hǏ�`K{Ir��w_�GQ��1�2225�R��X��F�����q@��!)5�Qa�<r�JЄ��@f���(~�w4(��.�{��v%Bh�#���m�5<t�L�q��p��9s=
_��ң܀/�NqJ��M뿂(h���۵��A+�%�X�ȣzB �v�^`�6�9�<��A����Ԕҧ)Jp��P\0�Ιh���Dou�)��&2���`�e�6�Z��73U]����on@FN���������Zb���6kC�>G�>L�hYF([��=�]���U�<y�?�ST_������0�Ն]=>z{���1� ?ұ`�w��
�X�ʖ�G�j�V-C/7D�5�@<b�/ћ��b���D ���
+�dK�hT�;%�\���{��.6���I����
��z�'������뒧Ug�¨�_���Ghc�l��M�t�ц�)�/g��s�*��槰^�,VFS���}�CR%�k�L�����@f?������0$�T�?ZGRw��C�n�/���[����+;�,��r����#J~Eb���C٨�*]X%G*9�>un�:iPgXo^��b�[����E4y
i�
W�z��@K���[R���ʞ�'O�H�Z���ޅ��KIJ�а��b�X�l�B+)R�QŒ������~vD�Z'�|9ڏ@����D%Ѵ�bFl�n٩��Q���i&��d�!��V��}�_�~o���"xZaf]љ���f����9Z�!ZGO�9O}�<�<i}'%+�K�Z����V��������;����{��0;h��&�0��8�6�Q�3���UE�o��Gh��<��?Nƀ|��v���+N�kA��c���%O-������B,ËP�h갖��!�`ڢ�z��P]�@(`Ԉ��3������⦤�2�Q$�1��1���dD�ЪQ婁6jdk������@W�깸u6X�k���)9�9k��[���V}�O��
�.�OZ~`�Α2��׼�)��!�u�~(�o��!>�@�.��#�Ŏ�����
�yj٢6�&��0n7�+�P�~Z�)G���l�é�J9C�+@.&�|� ���.���ɠ߳Sq�Q��"��vU�p̸�g�d�"C����W�f+�M
�-����I����Z�b�K(ʙ�!��ˁ�C�+̙ߪ���[m�F�BP��;��5'Z�b^�-z������Sa������]l%�����4DO���sM�ov\/�̍>�p�̗�/!m�@�|Ϸ����-���=�#�ޏX������v��+k��H��G��00hףA�D��{���u�_�=PC4&����7�`��\��	p���!(VR�����rA�j mL�AK�P��iu�6b�#HO��G�������@�����s�>_0��:�@� �aV+�v���/yX�W�Q���U���6��_A���^�â��ϵ�9����.�ذ��
8/����0�,��ᱽ�>�SLZ�E�s��뼌'�c�b�tρ�K>�wsm�aDCf��D�MC�r��y�8�~�鐖{̤��CO��N ��=�W&k�a}���/���w�]�3nw�I�Y\��8qS���7jc�!v-h�g��������FiC7�%�� ��{ za�9oߪ��{�����>ؙ=����r��w��
�>>�E��;j	w�F�U/���:��!��<�/���#��
��F�B��n~=���_o���5Ax�ё�����
�2�ܬc�t����x�	��
TA�
q�AR�Fc���G��[�I��<���\n���X{�Fq�S�[QM�eFv�r��p{lخ����#��Gٛ�a�޷��'�#�w�W��x�E��6��F��r�3�_@�M[�z�_ܾN���JWq�E���(��;�ߙ��d:��1�?5ӛ��
�b:��Ş�C�k����$�rwoI,C�Mr_0���[L'�4z��(� ~���A<�b:��Q:F��xovC�7|���HZ9�W�>H��-<�a��m�"'�݊��vq(X�	ͽ�޹������O%��(�c��-��{�NΥ��v����g�E>�h���r�O�|GUr���Y�6eI�g|����F҆ۺ�
m��
^TɆ1B�L�J� �{�%�JBGt14*���h�Y�Ƕ��p�j�Ü]%?�����}��;5]A�
�v��k���kqLs��Bo��Z8�]�h��w�nX\�]��z�����$����d4�q�I�Od:b��9b/�� M�]h��Λ>'S
�y�›~�>;�|}jm�/I>��j�u1�뿢�K�.w_wkZ�H�[�1ݭټ��h�>�W����
�V�g��z(w�vRZ'kz��_}ʁ�&R�W�W�)y�K���?�r�j������b����W��Ɵ�,�d�e�rl5d�Y3#�Q��J.,�!���r̡aS��%���V;>C�'��D�j�x_�{bt�S�ݪ�_�Օ�+\Df�%^��It�`X�:T3£Wf��o*@�J�hzU�"b/�L��K�3���,h�Q��m�?�o~�g2�S���S�亘�/E�ʙ��P,G_Wڿ)�[��	r�a�:vY'�dDc/���P��1H��4[��X
�f|	E���0G�|ۭ�1�8�Wb��s +����|�w9�T��]Z5S{��/-�<eY���@f�x�g�^�"#��7����ON;��<
��7@��@}c�^sa�G���]�a��O�X':��b�=s�|��`���K���+#z[��zGl�M�jED��Q?��H��5�H��9��9�Q(���$�|f7��!����74������y��D��o,��_Ɇ���D�\�"�����_�J�W�4�{�^����>�2J��Ҵ��.�d��Ƙ�)1�
L��ߋe|+�:v�R�l*~r�_��(�Z��A����c��@�DS��"�J�f"G��x˖�*�"�v��Y{�B����0F6j�g"zO�"Iџ�q�~80������ˎzco�f�x*��@w��;c�؏S�{I���76rg���u���U1�#9_C+�zAd"��V$���B�2>'+��3S,O�-8"=yS�o��%���p�"��.�!��9^/������Ά��@A�¿c��~c���"��p��x�u�_K�a�[3Mځ���A���߱+�����7��Z���#�
�[��iႢ�"5#���C�BRY�0�0wx'�\@��RVֵ��-����o��m�����eY�{���ɢn!������y������9������Q��!�MУ9�-�uq��S�~\�~a�"��s7Ћ�a\!����\��R\~_�[�U}frf�3>�����=��F{��|/��%�I��"�d� ��J�[j/�O����w0y�����^e��M̾c�2��3��P��~�+�z&\u�Ҁ������Ti��_LW��Z�������t�����9�\`r&}���̀����S��ܐ�Q����}�w(.���E�w`@���|R����F���t€����	����+ԉ�B�tG�3�a����J�M��k��A:��j��i_G����V�	�1D��P�U ҮP���Y��}����:}��e�C)��;��S9TW���͜�p:�
�+�:�A��xP�U<�u�?WÇ�{ա�i8T-�xPwq<�9t��M���Za�ك�T���=P�O�Oj�I=}xsT@W�)�\!�G���5�<��F�9���>D������x"aș=l�0*FE�j^�=�F�1F�Gj>�9p���o8|��И��+���D�'5lD�xR6��1P�D7�(2M��8	չ*6��6T.ņ��bC���B/0T�t�ym{WT(z�_���Z��Y�Jh~L��$�{���<�P�>#���I>+ɦ��?�"C���g?2y�-@���c�&��q�yYp�?^���#��M�j
p��j
bC�1q~��{�{�j.�m��m�uh�g�RH�J�>QA0c	�u!��l�E=4��q��?��Q��s�Z��HT�I���I��I�żO�x�0Q�
e��
��D���	��
D��*���_<Q7r���A&�1�(��6�B��g���E�|���B�[9�E��NT�PzD�:�--��=B�N&L�.��[��o.tA�Z�|�B���)�J����(:��)�NJ>���a��x����f>~�'�(�Zۦ�uz�������na��LԤ�|a�h��c))?��܍�����3�	/��X�<�r�����#��n�b{�@�U���*ʼ�BE	|v�5Z�Q��ث�g�]���Q����ࣾ�p��/5>����vi.���|�FM���4ࣰu��H�5O��G�b����v����
��GZ�G=�Q�������R;��`DG�(��� G	�G�e����=�Q�͸�ᙼx��2��8r��5�"G͠�QF�5�"Gū�Q����X�ؠ"E�>�eųn)��`��~�tH�Q[�3�+��>�'�^AJ�˳��C�t?b����-�R>e�91�rŻ�eB�:��^����t�����Z�fъS���\���M�lr�)��߭J��Uk�j���O�	�(>G����kŃ�)SWl�{�Y:
���p��h�Ҋ����U����KcBa���H���ARyꛓq��N���F��Y8
ɧ+@xuu��:d��������w�d�Q�	IS��!0w�k�	�7m�����}~��'������F7�鱮Z��p���r���������;��'Eu�am�kض�۟���M�)G����xL���6�R��JA:F�ő���z@�]�{h��g<u]��Jo}ş����W�K�4P�=����y;��P�^>��w�6\�\+���?a/���8MB����(oK���+���fa2�w~^3S��²��˛�c�W����6�	���'zcj�$��bV��Tc׈ㄜ�h^�9���K��>�%��.#i+=�<o1	9�����s'x��KlFq�.��#�z	��Qu�&*�I��R�w���-�H�*ͣ��
�[�=����JԾ�p?�_��M*���3%�yNe���Nȑ1�g�`��$1�J��T��)�+�F-AQQ��t���QS4̩>��C,kK���jE)ˉ>���^�0���:�n}�YS�@��-_�u����$����!�4IP1>�qʟ�"����xo��^|�FL��p�(���~��C��Mt��y;-��S���B���k���ڷ�:��D��j�,��I�J�'58�lp�Y�-:S��"=�j������i8��W���|�V��lno
��F�|_�����&�]�`�|]6�B\�����ו���/}�M���vj�C��C�P��G9ݫ˦<ࣇ���yeSj|�6�޼�)����1�
eS���7!�זMy�ϫ��D�ʦ�=h�1z�jj&=���	�Ii��)qcFI-��4_�?hgPP��u�nqy��0O�}�Q��������Y�L�4�#qP��_�ѿ��ڷ�XvHm$�v�F"1d�V�Ho8�����6�D��4%�&�1��Q��&�x��
�6<����B9���i��"uo쩉`-h�G��+Y�eh�2�2T���~�2�#kV��Ej3��P�?��k��hxd��Û��gK�;#�]�g���뷸`�"�0RR(G�F�� A���G����Y�w����+Z�A0{x�X�n�^�'�N��3���d|+d���s�ymJ{9�����cC����TO��虔@~�ݍ֔��ąb+F�����!��bo�&YS�0�I_����l�tH-Ǜ��!?�`�B�"Fz{7��8��թ�fgN�%&C�\��^,���%�ވ��h��!O�;�n�)�Q�恲��,�֛#��B���Ā�_{�����+�L�_8�D�n'�~I���;�ش}t0 ��Q��̠���vu��/�+�Y���3�':wb��9�[8��ڇ[�*$�P�Pȱ�a��J�\�&�!�C@���e5��`�Ѷx�|fnK(�&�:���18�2W��w�{_�Y���2w^�J���th���WК$���� F�GUF8[=ܷة&����	��#!s�lM�!|�u4�t���ӱQ�I�8+�����D}���M�ب�36Z�Ξ�ŋ��<t��?G��0���j%�}0
<��<�Y9:ꐾNzM;���GǷ�<��"u��xe��2`�b@[G�w&>yf�ñ������`쾓�������'��(q>�@��ğV���y�t��T����,�|�A�&[�3┰'�gM<c՛���<���s��e�z���M���Ӊ��N�#L���]eS�;s�{�;ss���m�5�4���OX�q:o���Yf�+�N��q�47Ԛx���>kb�CoR`L^;:%��3A������Tk�	��~H^�.�O���H��SE����1���s��M~�s�'�'�[�ʗ}��x��Z�I��lu)r4���,�T�=e�Z�)T�mI�xO�U�m3�w��mm�
^y�{�d':�	�%^��~� 1A�1%��|I:�p+��eqȄL�x�rH4�� o~�3��(r��ޣvW��J���
&�t��3I5K-��փ:QA�	,�)R���e�v�Lo���ű���o��/?otV�$�H��sG����P�t�d�>p�II_'xq"�Z�2��aJt�S�p�U�6� "�UIx�A���6��I$��`�5�9��/�}Mo�Nw��M<珱��uLLuj���E�1�g	im���\i��Lo�#H�Q���<Ф�]x�a-D�1U��_���B�=��� w0��b�@.��|��-�a�j�m�	'��|�w�Ťy+���R�AJM�cH�)
x�7�����&�C3k�~�s�)M�P���/Z������dz"�X�"N?TO!�C���D���S�T!'�Z39�MzI��ΒE�Ľ�v%��Tzr�O��Ä$4?Jw�ꡝM�c$�́7.���tJ��w��MJT!�>�|^��!�*<5��fJ|�h*=ft�Bh-�0'�h�B��R��0�[=!�c�^Jp������`��mdJM�b���F}%�S*}�pͯ�g�)��H��1��O� S�1��7C�ж�
�#)J3^ؒB���X��~ o���y�k?�r2��FvW���]��)��*sJ�01��F����+t�I)�F�sjC~p���@��qON��x
L����F �@�%t��%�!檔Lw���
:.1���n-67�&�+^�p�@&׺����+�R���I(a�_mM�˃��.���/�7�_��9��W�:����L��5nMFi����u)�J;�n{��+�iȋq׳�z��9C�W��ݧfq={Nv�������@R�A(#�ek���3��1�wW�;�>�:&�@(�G�A~��x�=��0U�P6�Jr�BT;^�X�I�bj�nb��$D�Z	)���7!��߶�زD�rM���oL��6_�漡�� 30֦��i���V�I�O�= '^�o�m��SJ��?qk��ԫ!捶L^
J�X�E��:�_�����zP	�k�pWS���`LX��4�F~`�Ǫ�x�S�¤�|����!�a�~�B�3�-�4C�(��m>��O׊?R�"g�D%Xh+���XsY���)^��{�L/ֵ͍CA�^�ρXq���4e�Ք���R]���t����F����ɖ:�2�������q��>g-Ͼ��5��®��(��z,~\�&f%�)ҹ�P������;�.�6���0���3���O��A0���+�Ä=�5�蚨�]��(����h�)��/!�x́+�z�y��x^�5.b��	&���R�F+/ ϩ���>�ev�V�{?��a$�߭���>y�~�0zy��j:�����Z��S~��&��O=Z�^yh�İ��Rr5=�u���?&C��Y�+o2����o��Lyn�Q����0�X���h�qxd_�.�w�����k0��'Ι��Ζ�X;�R���b�hT|.����F�b�������J1mLN�Y?͏�u��������|����˲�{��W�%����	��Ž�|䤎^��$#Ҳ���1nM�{r�tMzLE�2�we�[��&�#.1��O���,�1��A�)��Q��V�$=��R�~���W�{CC�{}�T��o�[�&��5u���F!g1n����2��ɫ��rf�~;���8(�&#A~�(�v�+��� o�e�k�)��=��!��Q������r����6����S¾x����`��X0�dwO(��	�/n��6'w�ĕmm��z��e�.���p��!c"�'�d��n��M)Sr"�#�c�]���[ݾi���%�.=�cMr�>v�m�Y�����5��L�?����4H�]�s�Յb�Ή�u2s����SF�j[W��hD�D50���h;�l���k�[{]b��m~؛I�(���f.��`܈ѐ�u{2���«��P<�Cͥ��tx�@���vt@^w��*�����[F�D��D����@AC�7�r�Q��܇�},<��KD}���P*N���r�ͲGi��u�7�)_&H�R=>}m�?,�;a�?n�(RZ��[�*�j�	~
��9?���
�hu�.Ԙ5P��v��%��E��/������kdiX��B���9�-�A#9�!�߅�N�=+^I�~H�ڪ3`X��Z��E�5)��		�m���л��S���dj�I�̒m�ta-�Ic����É�Y9�Ij�ݣ��T��O��2!x�̷�9%˞���t���=Wc9�3t�~�9�k�cÅ��8�[q�Pc���+���JyS���-(��&|hň�l/�54����Y�
�#�����N�]<����
���*���Ts�a���L���{ �t�1
���iA�x�
&�Z׶��K�v�������^-����]��=�ŗ�~2��oZ��-Q��i�	�ٽ.ܒX�b���`��Q4�Eo�����xm��_M�
�#�Vӿ?���"��x�W���&\C7Ӥ;����7G)rT\�b(#P��a�j���@V*Q�=4�5�[ʦ`���L��s�GA�ۤ���=wP�c�A8%�[���p��θv��;N��[$<�+k�����=T�Ÿ[rJ3�;#�������S��`ek��A�����>�k���
�A>o�xs��<v�t[�E*��H��wY|��X\�:�a�ZLj�̏WR��T<|����E�k��n��2��@�(XG�݀u��ב��uK<��ޚش"�E��^L�IDf�H�y�c�b�x�}ă.�ŪT�]N�w�?���$�uF:JWL��lNb��V\ρZ�/fS�"n����C(i<�(w�¿�ܳ<�n4�-�69t����r���݈����!Bm�b�U�vZ™���|�x�v�u���V�Rb��7<�6�t���� �:��	٨
��/}x���z	4�e?��Ik�VcZZ��Ex����\���0�
�!�HiA�n�`VC�Q ����y���?�����UJ�Q�A�65Y6E2��n�Q1�XC�lh3"���Y(��( ���)3}�6Xm6
e���C4�ʚ��#͟P�U����X��58��Ai	G�h�3��hDhA�&ԗQ�EL�G�+Eiy�R&c��6
HR��d�-����vJ?|�-���HP�eDH(o��)$Z@����Z@i�*o�a�Ҍ�x(��	�
��܆)n���`�97u!�"Y0&��:�y�O��)��|�Ư`�eQ�[L�|j}�����m�mA=��,2�5��)�k�x�����4f����#.W>{qڈ��0u���Zt��[h�\˘hyc�ˌ-?Ø8�1ʄ�2
���1�\Θ4y5c2��0&K�gL���1	�͌�˩�Y)�o��j '0�4��0[�xl_��[=��:�c�#_������-��H����'ɧ����x|Yv1��;�D繌�sY�6Ʒ ���m�W0W�啌GL"�����,��3-r:��QY`<}�e��K*q�ǫ�r�q�,G3�ʡ�LJXd�x|N�)��x�U�_����'��F�oF��"���ȿ�����oa<Ό�*��8y
��lg|#�ߎ|&��le<>�)/#?��-ȏf|���
r8��lY�p�������x��T�G#���G���	ȿ�x�Ɩw0^@�i�#D�����ob|��G^d<>�'�3~%�_�|㫐73~3�	�ߊ��oG��琏d��u�G0���ty�a�l8�[�{	�a?��K��L��t�L��	�O��+L't�WQ��L't˜�=��hۂ��ӶD��m�3sj����|�3t�����ā�:�3��$���t�0#�,e:!LG�,�s>�57�S�t�f:v��e:'��Jй�����4@���4���i�@��4��4I��4+2��αi!��p}&9��4�k���r�ub���֛6��*���X��Of����U��*,ƻ�.�����b�[����ڨ��1���}Λa|^-���4��f�txVMd����}^م6��#0�%E���s�c٫N���'�����Y*��un�0&|����.�T7��xL�G�	� �0s^|c�0y�pז;�&�t�0�	�y�Tm�sa���;�;��r������x=ȅoK~�!l�&H&s�ƝV��l�3	�hd���p@�c���_W�����C��p��.G��B#}��?~z�x�i'+$o!`Z��₄@�-���7A��R���Nuܧ�ޥq+�u��3���W�;T��+/�*t��e�!���F��tH�*��D��p�L~��8=�wz���٢��!l$*�îfd#����âPG��|KƋ��'}�@�Y����o�8��7~�b�/��,��_�_��VW�M��O9,N��V{N
��|�m�֌|�\
{H3n}��#L� �5���w��P^����c����9�f2�-�`Z�k"�MZ��\�;(KК_�!kM�.U�F�e-��������(��Ѣq�y�J�Yg��&�_�zTQ*QH��X���Ĉ�_B���_�b�U��{�Uz�δ����g�'`���,��qR��?�;/�d��)l�H:��R@���^+���wӤ���눲�"��ɳ������R���cg�'�Q�w�_�g��=�x̤�tHG�$�{c�{A����
����M<Ö%��4�͗��ʳ�x�<�X�}�.2��
�'kfE�O�c|�H��2�J�7�SB�A�<��I�v"�t�7'ĎoN�s{?�{��+?E_V:;�	�U�e=eI<���(��6K�EkM1��K:���E��Qh�bI|�$��A
�Z�Oo���FG�x;�M��
�kF57C7��ÂfomW葖iB��/�n�[��Ѥ��@�*Q3DZ���:%j*3��14�+�(����ӣ����X;��"@��s��zV���3|nW�Z�R�g�G0I0�A�$�zMĔ!�7���W�'T��-�_'i~����("CT��P�f߇]��:+�R�T�Ĵߋ��q�|3��1���7����3�,��Qj�R����<���6����̺�U�����[������y�}/z0��3[�� �S'��z��^�^%j�&8��P��ʇH����&�v^�I��|���?㻨�x���c�8�{�F����44�c�$%�1�?[��W����f����-���8����`&��&�f��d���`������a|�|�,:�I�/���7zyOe��q��G>C�����;����P�^t�<?�'0/�:��FD��$oz5���>*jFK�hI^,���`\��<7"4Yo��w�i�1f�)�2�Up�tt���n��}l��Y��+����@��򒫵}-�h�����=�{<Y�[;0�T�k��@�8~��"��� <�^Y�ha�eH^�¹�c�{3�����f���+�4���[V~���O
0�����V��YKW�xz��[U���]�������3��.��	��A��
��V$�4�ޠ>hO��N�S�V|mB�ZW��S>Ǚ=�=���c��_��|u�����Ëk��A~�A�>��������a�O�U���� ����7:c��k%�*�q.��l�͒�*��&���I�˧Ptr�0�
	�xF�v�s�!]�{F�	
��˞AӃ��K:a%4~�({�A)�4[�2����0O�P0�akb�B��)|i�Ks�*��E� �O�ޘ�^��
�����P0�!|e�b�������MK]�d�6����~���vci�=�q�2I)&�#�V�^g��OHG(�����-��`!�+�7�^{_��6�� ܽ~�-�h[^��F�l�?@z�?����o���5lg-"ž{+Z�8%V�~�b�ȴH�k�)�`��G�Z�� wC�]��[\\K��d*_�?����}k�5&��hV�c�L�`��r[�o��T$'Y��b�[�a�ܦ��󒆯P3� ��s~f�4S���: !hS��3n�>
;�����B���Y��l�5���m}�f�v����P����4lG=�]&�ĥ�c���xT;�&31E:��(����%�b����,Src2���+���4�޺��yR�x�Q���1K��׫��	�'S���
�c�J�{5��?�U��)�_䕷�g�I�����������x��(/�
����%�u~x�jGV��ЩQ��c�ĀiRpw�]S������(a�u
�G���|f�2� �����Ait#da���<��Wb@y��[?��f�쾟��B$���[�J_R��+
T��Àq~�d75���2m��X�ӂ�!U�vq+�U�Ȗ�W�9�
�"W���Y4Ǻp�;
�;9���Z
��#tZ X<�P� ڇ��HV,~��1���!FUB�A��P<�(�Ks�FN�a�o������(\��{J�D�/�W9�������~&(0��b�j�����|;�p�),���Sh�a)Lm�9��j��0S�����0��d�?�M��)
iӨG���{ABم� \�A����[��َ�8B�j),�ñ��O �E�cV����ІI��>��d�TB͖0��"�AemfD߾`�"��̱���t/��2'����{�0�hTF���,�����q„y\��+1hhg���-�,�Ժu�6�9�3�w�CX*���:�S��g%��Ev!?���i�������
,�G�V[K{�b*]K�+&���Ry0�ܴ�5'�~,��:�`7��șF�o[L� �09�ݦ���>�M��9si7�M������==�7m���d��M}�8~ӏ�,
Z��x3�o���E��↴���95}9��*\��qNo�#�0�LL�)Z�;��9�
���M�E��IBL��.KQ,hݘNg�JԆa*z�P*0ቒ�Pp�@OX�g�4����{��O��t�p��9.�q#�R]��?�K���lr���/��k��C�;���3�ySϸ��).�Q��!���C�x�"*�qqv�ŵ�U\��!>������Ԟpq6�0\\
��c�:���pqS 
*.�pqU=��}�+.�M:�`_\\����g�wU�jSS���B��[�N_1��^�O�6(��n�Y�8��+��8��@�1�=@�A�V���~���Ť��]�(w(4�@�u���[�ܺ@�s:��B�ʝ�
(w[!�w�ވY)�>��>����r�� Pn]g�ܙ(w�P�L�35���3���N��x�#Pn��O��]��ԟ�r���}̻��q҃��
���AKu����r�m|�w�@����ܪ��r[�02�(���W�{�9OFw���@������_�::��;o��jtAA��p�=���r��I8w�p�f�[]:��]'��m^A/��\�C�
��~*xnd�j���I�Ν��sQ�G�g}�8�{5�ν�C��й�9tn ��ŻN�@����B�nx�|Eй�B�@��T��]O�q�Q�͎n�s��Ν��KN�*�W�s�:����=�B�~�B�@�W�s�/��R�:��#tn��!�j3�ν������L��c��0����vu�- d�����iض�>-�vc	h���z_���o��C����k7��8�K��̹Bog��/zf)��9ם�IK ���s.{Y�s.�4#t�s��̹N�5�S��ZO0�i���l趕{������VC�1#��w�=%`�
�c���\\��Mr86!a峣uu�1h��
�P�l
�Z��������+�Ëc�"�n�dѧ�d�T��
.?�
��w5o���]ug���6�&�0�θr)È�V��ٍS�]�D_�Ku��)	�ټ��;g�6R<XF��qm{�� �SoSo���-]�F$B��ϩ�m1�T�dѹ7����^#_������&�m�
[�{)07T���:��0}E�湝��#<�hb�fC��P����b�IIPO̕�+��0 ��!����i�j�cJT]8�W�+Q�.i���~í|C�jd��W<��1f[赺o�+�c�[v=����/�Hߘ�O�)���Ԩ��PH�S��E/eU��3����Mx	P4@z�hz��t�$5�K� p�cOћ�5B�^�}ݏ.��2�U|~�o��Α�������>τ[<��77����/J�R�"0½�M��$EM���x�ݚ��P���	��|\�d�o�'���O��j�lq�
�����v���<?Ue�?m�Q���|v5-
��8H����JV� ��#iǣ]9��P=�R������U�^|�2I-�Y^�X,�-ِ�Q����U�ͯн�<6S��<x�>ηO��]�3�A'�TJ=�k	��/T�Xg��lu�tA��Y��g��R�%t� ��~+H���3{j�Y���6f}*�~5b����!|�ʛ>eR���	��SB���;�y䬃P~���v<	p�LJ�Y�d��ٖ)�A�7�8'H֟���8�(b�uJ��D�ğ�+�RG�5U���Aj蔅��T�D�iԗ�O3=�4�_i��*e��r; &K�1���չ?���q�)�L������;S3�/�N�Il��.o(�D���&7P����̜c��zȾzx��
Q�cV�N̼� �ަ�uMh���g=�:�a���T|=��P(��‘�pt�4gB[~��!DآO9�D=ʞf��Gvg��)V��,3C��5��(I�����{}��g'�H���e0k͏\R���L#nf���W~q,[v�w�Lk��8��(E�{t�w�F�t���t��>x�X:nz���	�<Ԍד{���&�� � ^�L��<�k&�Fl�᫸��sl#&	��Ğ�+Q���'k"Yc�Z�$�>E�S��`Nbc� ߓ�y��<17z�db/��ř5�W���d��[���}jh/`�v�
[YL�
r��-�u�3D���V����?*?@������XB��#���nO��œ�N]+K$û�/o�+�v�z�0HΝp��(Α�j@�|s;l�BQ��<�P���9��֌�ʉцY�m]2��%�YR��͚��]5:?���sl���M�/�]@H
1(�x[A(F#�#���8��V��t��=2�4�$���$h�q��7P}?w4�4���p�<�5	�)���At�í7��d�k$q�����3E�-������OQ��;X
���G�{ǜ�)G�����]�A̧/T��� �|_�f7�q�u�Q}�<��M�J�>�F��p}����3�F���ި����FuSyި�q���Q]e�y�d�7�����_�G�5_Cr����B�4��G����#��gty�:�'U���#���<|�}�[��L���tSV�7|���C�o��I�������ӡI��f��Y/�:-�I�l
�p+�ɶ��”�h���a
M���Z?炲0@�'�#3��cx,~���sQCPF���
y8_a�ɇ5܂�|�3T~��R{��҈R�Ɇx|?A��fx��5?��6Ӎ��n��c�C�U��y�X�	��Gy��qB��
BX/oM�� Hu��.؁� <@����C`S�X��E[1��C�F`4�����)��t#�x�a��,�J�v1P�z'��C����T>�*�&�o��;b~�����F(��a��cb�?�l�L���$��
]�����Q���y�C�<��S�u\��-k�	�'��>�PN�%�\���b�2 ��՝m�OwkD�)WϮ�pW�ɣN+�sZ���0?cc����9��/E�C�9)�\ym��:G�ׯ[������� c�e[�����~K��K�|m�a�j/_;� J0�C������X$����'�)��Y�f.^�M4�e��LV%tk�&�����	J'2��՜9���RNK9���NNr�gN�w<�1�^��No�t)��9���VNwpZ���	��9���@N�Obt�S9���RN�p���]���q:�������i:�k8���m��©�ӣ�~����p�w��^��hN8���[9-䴔�M�>��.N���(��p�-���3j��:N���qz'��8}�ӝ�����q��:^n�9Uxy�iऎ�=��#\�)�Ѧ㌦=�h�ߟ/p�7��W`\�)v���א�H^~�5ԟ���_	��Nf��$����'�눕�x�� 7I&s���
�7�,����O��^.�C�g����ꏧ������#���LlS���wx�o"���n��m�T�@��٦�8��J���/��P�E`�x��m)��T�
����3��b�qR}_���.K�5�j<�x��Q��[則����
�9�,��Pㇱ��C��VI'{��\��&�`�W/�_�cc>���:����������������._>��#P��cH���U�c��:>7w<S�����Șm9��m������99b1*���j`r.q�@dg9���E��MvG�Aj�#�Sζ�g�Óa�����Ű���D��/p�
�B�=�!�E�#7��3�Q�9ȗ|��ģ�����|4ҝL�Z\D5�;9��t�n��As�N��
�
	
����72�_��
r�Pð�#bF^=j�5�Ǝ;n|܄��&_w}”��Ӓn��h��lN�1S�̚mM�iN��y��3n^�y˭�-���EYًsrmyK��.+\^Tl���Dt޹b��w�Y�n=I.v��,��96,�� K9P��2QH��A�@�Y�ZcԞ��#�sy�Bݙ�vTS�'Ա�=�b=��g����3ڿ8�3� V����@[mAl�����a�r�^�s9��)*.����5��F'�#EP�
�6M����_h^@M��]Y��a�	����_@ka�̦�ea 4'�ͱ.�����
=.����BS�|]�%T�6���,�.�����-�)�����>KY6
Yͧ�4m��ئb�` ��/���\Cs%!�'���6��hQ�X�qqtpi�q�ֳ���syO�w��l��Zi5@vp��˗�^��V-)f��'G}e�7�	�"_]������O:/�DŽ�t1�=�[���oq�t�qR��a���%�����r�������`y��)�|��.���Pjs���&{³�C��:
@?��Ij��7���"꫍��1�%�����R��	d�e˻B����]�ͱU��J���,���Q�0Vv:y���NO�Dg������V���D�=��F,�1�D~:��K�?�S*T������h���Ӿ�@GɶR�s}��)�+�/�`2�e����n��S~W�?��ql��\�M���{�<ZF�����ꃁ�nv��j56�Mn�<�����[:���^\�C�Ԫ�,�W=����ޛ��puW���0����R���q\=��]�L=H�����s�U\�'�����3�A
���q�fS�T���lW�V����z4W+\���TZ�t\��
,��i��z�$�P�G�V�p�杧���8�G�4:�*9@��x����-�������J������u�m�'�F��!ֲk���YXl �Ӡ��@�pmJJJ�&ǁ_hѐ���#���-H�0P�e�g�2ܾ~:�A� �t(�:�#������o�篫Y�?J�r�u�Q���?_�|����Ouk������e���-�ߕ�:H���w�^	�g�~-��	�*_�+N2OwG���כ��:�Q/ϯ�lCyE�ݿ���(m����������ևyt�c��~�O>���y���_��/�����ʫ;_۵{��{�x��q����݃u��ix����'����������_�4}���_|���r�7�o�~�}�?��[ϵ�����K��?�@���-�O��:��Y��+��C|��Pk}�uR��c�{:�����I}_'����tR����:�q;��.�p'w�M]k\PP�[�b��-�~F��1g�R[�h)�+v,��?`n�.M9b����b����gz�;�
>g/�M/^�\f��0�GW��3�2��XZzwiY)��.�{Cid@��*++!���J�J�`t6zTBڂR���.-
Q��K�J��a]~~�N��n_a�w����M��M�uw6đ��*[�)�&�OMq<:���q�l1��`s8���"Ca��('��jYB-9��+(���bC��Vd����8��Ņ��IF*�<2ΐ]dȶ��\p��ꐡ�:�sزs
y����y3b�
� e�q&PB����r�	��!�Fƣ_�-^�o�6Ǫ��%����%6Q�1&˳���D̅�A�h�T^�b�؝��ڃ�����nV?r��^�zl>�C��J[yVg����
A=��d�gG.��Ht�rm�.�����W r�sm��<�]]���8����O�w]Lc1����_�J;T0�3+y�w�r��Jc�:j��(�J�m��A����2VXң?+�D[�=;�f��!E��;K����9Ju�I�r����Gq�r[����cs,/(ʦ�e.��Y,ByAM��Mw��֥n-�k{�'.�i�}�a��(�Q�J�l�����S�4��N7�����k_���w����������>clB��3j�(C6OJQ���6
�XXX�=F��E������s,qb��F�� �`[nW]���-Q�”
�ɆbQ��f�r��b�%8�׾�zh�F��y���/e�V�쑳߼��Ls����U�ԅ�?�,�
i�B�ð�*YXR��^h[���sJą�u���s�+��`7�����
%}'�����a����l��a �A��a��O>ꈁZ2pb?{TVd�A��vy?|�r;��d�F@�CȀI�vD��
�<�{���a~(��;���~iБ��>�kI0��&DCB e��`9IO"'���n
mv��AY�i�C���ґ�ոmC��gV��-�18���b)!D��9��~������q�"Cr�!���!��IoW�=�ǹ)@�s ڵG�D?)��'�|Ek�	9�1�_} ѧ�p��X: �"�?7�HL�jR�_�LȠ��C-�ǽ�.�3�#�oS���Z��'��*n�n���>��L��|��|�!���E6�q��#"Id��:����=�'��~$p��e��16������N������������aED��c�D���,��]FB~�;���^�z��y���L���N^uF�	�#���1�Cn1��xRobpn����i�%�s�dpzo2�v��~M<�� �zH�~�7�����,5A~$H�(5�|�$\"�P��C]�^~��Ā8M���9�C$�a�ߋ\%�F���I���*�J���sy���EдQyS��6B s�����7`�„���[oПU�.SgR��3��������c�%��>�@����-�ď�Y��V��s"�R_-�	A��D���Oy�[�u��%>n�hI�Ia��!i*K�>
fee;��-?5ޟ/%�e0����cCȠܹdPz4i��E�K��@�B�� ���~d��a�Om� �<�{걫'�yE$�j�WnX�������yQ-����V����۟���V��#QІDAaGM�pEt���WB݀Ϗ�!͠`h��!����t?M}K�)h�GN\�N��k��^�:P(�����{��OB��"��0{hVH\0�v�
m� �M����T��+̄~��Wچ���'�:��? �M�w���Vz��pe
e
y~�ą����!C5�H�ކ�@��#����ΆA�
%����Y�yы����/�9�ہ��C�R;���h}�y7��}�2!�;`�w�QML0��4��8�%��_c���="+<-§�T���
�t���t�O��Jo��A{�,O����AП��@�����v�P��E@Y���ɽ�n�56j]j�-ާ�=�џ����R�o|oGgwqwzpכ�_	��Io?�{bp���L;�W�1BL��4�0� �5�}�?�o�*
����0/:�pɷ���}*ڟq���	y^�ӫ@��i���
�k����:慷p]9�7�#5y��ɔa���D��&���'���O�}"��\��[���z�ˇ[s�.g}�K�P�Q��e���:j?��i
od���A� �CB�h?�@}�a�Z�7B�G&i�-G
:����!��q�H�?2PS�dG��{i�Z��{ 	�0C�Tj����b��Л��iݴM�~��&��2\�i���j�O���ܡa��`0������Eru�/��I�՚��7TfosO�o�x���l�pj�W���s~��=����g�?��y<������=Z��i����
3�$V;߆�i�b��T�������\�I�U@���K�Z�+�e/Ӏ��b���%�6�Ww�)+I?b*))XR�M/�Ir53��|-�
�	J.εyκ����\g�mFA����h�Y���&�mj
�S��b��U�-�xAA�-9?�A��?�qa�iGg�&�I�-���!�\���e�U.�
H�_�N��]�c>��_�4`<�W�m$M���J�mɢ���r�ۨ�����U�X��A$�ظg�S�ݔb��8.���[�ќg[^|'͈�v[����/:�\O�6@��'��S��:��O�e�g8l�)o���#I)m�dG�X��]8�B�9��j˾��E�����)�P>�f���ܔ�96;ڃ��x8�ULg��~���m�s��#�a+�� Wk牅7@!ef�((�Y�PԳ/s�g8�hD Ҹd�&��v��A6���"�R�+oi��2rO����j��C���5�����A�Vw�SQ�|{AQr�b��S�3��+y��inw�y����x��QBU'�&}0K�>��}R��)���Ŝ�T�C!�n���Қ��ܪ�QX�^f:m�6T�WU���})�����Iwz>�X �3�>b��{A��\ͫ�����)����CT,�o�2���(��]�ɥ�_h���xkr*d�*�m��<�	�����j�%LJ�w���F�S�~tc@tmC�n��!���b��Y˒fs��*�aɀ���EA�2����R�WJkȪѶ<��)��p�^޾��b�g��,vdӺ�	��y6��ۙT��J�5$r�v(%gI>z6ݙ�����@���'/m�>yrs���c�lf�;'���\?��F3LrA�	�g%�c�����g�
;��Y��F8����t?b�پ߯���?���.�S���'ό}8���n7��@Q|�CB�o���<��o3�
}IJ�s���8t���4�������n�깿�\�M���������\������9]�����]��<IH��M<3��q
�Ky��8��˹y��>����\����<�g��n���#n��Bͳ�/��37�G����a:f��a���x�+���@��q�HK��-?-m>��:k�*|����9��`��Mt�ɸ����~�S�<e��vF���v��M���Ǟ��Ɂ��'�'o��uOPn.t(s?��Y���O&v�����6�'d�:�]Q�d�� �霦qj�T��̩��N�8�i4�:N/2��鷜ʜ~�i����p��i�������N��t�[:����
N�pj�4��LNN��N�4��hNu���v�s����ʜ6qz��FN]���t;�U��9��T���i�q����i4���8%��iy|9�9=ũ���n�v�3W�rj�4�S��8N�9
�T����˝���=s��W1�������E˼���#��^Ny����R��4��q�~��șJi׫���_�Z�������������B~�~�������x�����|��K�8���M�U9������n�Ǩ��F]#k����/)H��|q�4D�|�e�s`�[?FCҀ���^��tm$��}�o�h3|+G#�!7D��'FC�@����;HcB���	0q/�Ρ0v��C���@��/k�	�=!��7����$|�A�Ш��W@��@o��,z��d�c ,�
tGi�H�^�H��E�#]q5���i��g�a��h�50�?+��Oq8�|�_?��Oz�8��<|Yh� ���z�8��-@��cq8TG�V�:;����8f���5\����8�cx��;��K�&���5���j
�t�dc��4�;&��q�a�/Z�㸑J��}�5�4��BZ@�'�}Y"�Ld���>
�3Pe��r��Z��7�|�����o�λ�5�Ind�H߇/�����06�
��,�Y@_�IG�㹛�S ��� O���s��cf��cs����H_�����'�����P��5o:���:�S�O`�^�F���t����h�TB�@9F�eB܀GzG&O��,��V����J���Fi(����I@�g�E0�~Ё��?�9��/.&�l+��3sY��o���7�!��	��6����@��Xܐ��1�H��b`�
h�|�
�S����oz�Ӏ>��-@��|=P�R�諜�	4��;k�>Y����b�=�〖����r1����Ɂ��W�^�&2>�V����N(kl����dy�z'O/�6���E��>#�H�+Y9��{��#]�҅t�jVצ����w���4Р5,,<5r
K�h�����.���B������x��#�]~��J��[�dЏ:���8�����=@۫y{���7�<j~�ֱP��~� �����94�w ��Gu<�d^��)�G�4�i^�F���7���<��
�3,?�,�s���2�i@�9�4�yfi���Dz����L:�%�Џ�'֏ ]�'V.H�p�̗����@#v@^a<�������J��C�$�7ݷ��]�9��x���Q�Nл�`�o�́@����@_�h��Џ��k!~�Oz�7�oz�~H/�c���O����6��g�Av����a}�[��B�o5���=hA3�Ga\�}+БǠ-~4����
��K�6�G�C�A�	������'d
����>�/M;Iȋ8Vz�$�
�2�9���>�7>b��&��o�����#-o����m�B�An}�S&�;�����s)��\���������]@#[��}��[XY#=������M��	h��7���
q�sP6�W}�K�N���!Π�t�y��������%�@��ځ�@O�
��~���{9x��'�%�f�#Ż1�A��t�G���x�e'��6s}�xy��9�4��H39����x'��#��y�g8����=�H
�G:��H�L2�
��\�;�Gz��H�_~Z�?N�`�XڛP�R�T��
�c�j>���|��8O��S��[py
���/��%(�!�i:���7\�ч�)�F��ڍ>�v��������z�o�A�@��~x������[���$�_@��	�z�񪳞��N�U�^�v?�����^u�'���]߀}�W=�{
��U՛A����!���?��������oܸqd�̙d������8�NV����lݺ�<����_'.��|��G�����Rj-�
%�6��}݊Ǩ����Ћ+V�Y��W.S΁q�u��܂z�
T����N�u����<j�bM��[p����tm�>/�"S�G�
����q�Ef^�Q
�_s������.<G�74;�4�Q��`�L
�+�t��z���ΟU+��o����bC+���y-`�b!��7E^���$!�Gwꥲ�߳5�6T_��am866av�.>�Ȅf����;����]�@�[�4�
�ӽo��ѧ��.+uQ���R�;m�1ڇ�m�֦Pc���̌�>�?Ō��4n�\������C]�Ko��ç)%�����p{��n��[�RJ4�����
�y8��_��I�&���T2�|�z��2�y�f��/��;wR���ɗ_~�s;3��}�� ,���w)���!�����e�d=Q�;����"��e�y�.`�?��m��K��C_fdd��g��G�����Eym���z�;�e,"땧�y-�{�����=wn�R�uC�*�AC��?r�O��?=�'�##ͧ˟�9r$���%qqq$))��L&b�Xh�͝;��|���[n!��~;Y�;�,Y��,]��,_��8�~�]��<ἑ�quyu]")_�B6-K&[�M�Q���Q6��Tj!��-&����{g�Ƨ���o+d�>�L8��(d�a�L;����)$���D!s�(����r��
�iR��oRVVF����}��G~��ߑ�~�l۶�k�J�k��������j�Hi"������t���Ti_�$"1DK��ҐWO��ܠ�ޤ1SJ(-��%Usi������߳���$����u�۹瞳�^�Z{�snDZZ�X�|��oNN�X�~��e[�ny_���H�/$�{�n�w�^��~q��!q��q��qq��Iq�B�ȻN��ٳR/.^�(n^�$~��Daa��s���r/B�x�Nα��,{56`zAt��b��h��O�b=�G���E�wexO����=�
���TS|��>��s�0�7fx?����>��W1�N�?����d����o��=s|�g]�q���9)�3�Z���!t������N�t~��K��
W�����]��9�?
ax�0���1����?c���/��9��V@͕�0|U�g�S���� ȇ��d�w�c���Gt���f�s���f�N`�/��j��2NP��\,(u���{:��wa�v߃�2|"ç0�2�_����k��9SO0��/����#t��x�i<�ra�p�G(�I�zK7{��=�ĝT��&q���_f�����}~Ïa�����W0�:������_�W�8�ÿ���1ÿ��>ߏ�G2�,�_������h�6�WC����ܣ�[������ڮ����__����nM�4jصk5B`0_��C``�{S�е��v�b2���A���WqC�F����!~�FC���W�W��}�"i1���e���-ZXGh�ZߥAW��Fc��1�^�:�|�op�nh��6�_�U����ı��#l?��k���Y��.o��xC �����u�P��30|��HO�1���8֮���{�ǹ�!��NEnp�l4��8���7i&�	4��ty��%�\o�ּ���o�S(��{��r���B��!A�I��A��l��<�S�.�j��l���=������t�"Q�k�n�^��W5� c`s���$�^M=|;���*_���oxHxHp����/b�<*8T�]���m��;xԨ�C�n�!P1��"=��߾�g�*�+��
��m�������T�R�v���у�n�-�:=_���|Y]���u���ٚ�z�B|;��	��ںը�!ğ������e��}kC�ࢗ�����"��hwY7>�&ؿ��ea,�B�.�N�[=�'�O'��XL/6�K�v�\�y�����#�Ȯ����D1=*H̏7�u��D��$�~���#vΚ3$�q޼ybѢEbɒ%"==],[�L�
k׮����.s��r?�8���\a׮]��o�����s�Źs������˗�/��"�_�*s�[�n���;$V�{:?�Q�]{tl�sq�ǁn6��&�-i��M{�H��tB���u�CŶW��1���0�H����K~
��e��q�<�<�k��~���ɩ>�u�|;96����urqrrt��̹F�j����qukԨI#��5�7}�ϝ�7h҄�Y�����]�um��Q��GM����ϿR�~#7�g����}����̣r�����՞wr�����ʕ�V�X�ի;UxƩY�g+W�5�_��P���^���o��j�ٳ
�V���U������U���<�{��4p��po��������w����g��ח�bbu!���W^�%m�:��xA�ٺ?��x[��R��-CS�2<���Y�7ړl_�:𒳳3�����l\�J�,�ϱ�g�����)����O����}������P��K���qg�իW���_��s�ʕ+�x��͛Wy]z�ĉ���������M��8x|x�A��/4nܸ��je�u0`�o;n���cǎ��u4m߾�~��g�xJG���>}�x�M��4�ٓ�ֳ��dǎZ����Ima}5�@�U����U�rR���Ĵ�{�.��������6�}�����%�߷om޼�?ڴi��…��O?���СC�>�p����3��իWOظq�Nق�L��+...0%%%��j��b�k׮�zƌ�[�j�9�a���ƍĹLj�
�2S.]�D���6>8p����{�'�G��gΜ�~�A��&�9�Gֹ�׮]��zw��,������7����?���i��7��t~�֖qH�����u�:hP2Q�+:�g��iQ�q�u����G�����Y,GW։��a�Ν����ǥΞ=+ρ#l�mX���d�m@8Bn��|��7Ȑ� �?�PO�Y������:�p�������aH꿗�Wc�1:�߿?mٲ�X��9��a��ػw��}Ϟ=�V����g�}��@F�mïD�lj|�%j���c7����D}�e^ �u�v�J�Gb��۶m�
6l�9|
�K�C�|�s��@��!�S�NɎ��9�
|��x��������D~��: j���{��]D͘��_�~N�r��������UW�P�I�v}y�Q�|"�w��2h�
Q+�!���DCyn��&ʄ��;w�˳Z�n�ʺ04��Dp�����s�z����5�D���+
G�|׎LC[֛�|+�QyD
�j�s����?�����D�9�
Y@����8�z�PG�Z߳D=�#��cV:$��J�'�«;�ܶ?>��S5jԖ�;�o)��zI���:���g�-�<�(h8I�41
9W�,���%��o�Ǚ"4���(N&��q��=:�y	-o��#}i�?�D���^�������fϬ3�ʞ�Z�>��6�=7�j�i����ن?�yV�6m\ٟO��{:���k{:-�u����O�zS����I����Doh4��&�8u�^gϠA���I�S�O��48o��Vn������զ���$�/⁒����~�r?L�q޴blg21
K����o2
�����Ҡ�4({�Oj�5�K�����ﲙ������g/��m-�lNѡh
�%��\?ɟ���D�L�r�!}����Do_f
�^�`�g�$��4({
ʞ�ܶ�a���;C|�<��A��tg#���;К�)��N�*�iәn^�c�[ig��4��٨ٳ��'y��g哚0

��$����j۶�+�(S�?�"��Ѐ�Gт�kU^�k����>O�@�:�j�!�iX�4l]0�n^�X&gs��a�x){�r�&ۊ��B�ǎC��^�7p��~�{�k�7��жM���L����3�Y�{{�7�����NM�2Д��88�f��O���4�s�Z�Q���3>)�x���7�x+�����c�_���r�}�4lb�M`�`Ϡ��Ѱ@�ah@ӆ1
C)ip��
>��.�h��x���@C��r�J2�̈́�Hu�LJ���O"hǔ��u����i�L�g����>�$އ����X?��O3������L���>�G^���.H�g��
Z��}�X,���Сhl����sj{�e�0
Ҟ��$e�i����q~�Ӑ�4|�4���hRd�D>�_�c��\���J�;u��8��ӧ�h���4Z<�Ogw,�ݳ�}�m��y�Ξ�i4,�h��Q�;�4#�J��18>���g�nu s����{�6������G�@RR��A�_��	��)�5Vq�خl[�{�P�g�Vj��!�nݺA�j�*�{!��1c�3�FCit�&4��uIe�g��?SR�>͙3g�NjҤ	�������	q9!!�F�E�f͒v}��I�w�G�Fl��B.�|�4�������c�g�c,��y�£�ߺuku�u���o޼y�!C��<�2�Q)��D�z���}�҇~H��ͣ�s�J|�����qBс5h�?�"b�]3��6�[6�a�1ƚc���&��G�����g���L��������-l���(11��&�ݻw�9��ݻ�>w�
)�R�}�=�s��A�ش�g��ޞW���6.E��,�ӡC��,�� �[�eJNN���0jР5mڔ8���؆����iA�N���[�/H[����ٚc >�'h�GC�o6��[��X�e��?>M�:�Fjj*M�<�V���)::Z�וR�@�t7�aO� ����Ѱ�G`��#Av�����v
<z�����ŝ~��������iEC�f�h�رR�joG�|������G�l�`o������1��`[�֥�I�&���F?~��h�ԯ_?�=dT
j݋��k�=��:��
��/�WÆ
ۭ[�n6�O�?t���f|���<z�hi�������E�R�{:��-e�=�?�^�Cvj�qB�����?�=�]�v��é��/��B��`ߐ�C�A=z�l�2�?x
��3����{���ڰ�l��3��8S�X�]�vkͧRY�Ǽ��G��E�ò%�-�T���7��I@����O�O�׬YC���2~��g�f>�o{�c�x�}'7MX�e���
��?�c
�ao8�6�z*s����[��e|���~+=��.!�	d��χ��BF��9Ӌ_ҁ߬XF�m��uU��z�n�:[�6m�ϒqZ߀�ꀁ��/B��`M��A�ҥK�ǘV�\���݆����SA����~�q���bm1{��F���@�K�9lh>�|��_����1֞���o��,�[�w�qt	��s���#��.�o�.�ׯ9��@/�@�����C<���nذ�.\(�Y�0:�V{�țp�Q�����/_����
}\��0�ܦ4�����IxЅ�A�n�w��;�+�P��?pa�����{�Z�F���T�;��A�&�����h�<Ǔ��R����Ti2A~���ˡC�p�ꫯ��`��w�;`}\�q���?�O�@b'��?��b'x�5'x9��]�����c���u
��i�.��%���ڷ�A#t����
XV��NOw4����;�sO�g})����c�J��رg��-���S>�׎�Q<�����y��c���v$��A;�׎��cu��}��D�H֣�E��qO��|O%�W����㾗�m��"�QQ��,�a.G�}=9�###{s��>�a�3��/	��b�w�Ɯ#�v�Zc�^0j
��$z�[���%.��Z�V�X�=��F�M߅?���ۋ�~a�t��s��9�;-��r�qu�yk�{���u�r�� :p��w����R��><�缫���gM������<���c`�LQoD���c/���D�����?=y�䈹s��NX? >¯#�W#�E��k��6��a�5�;������Qc{�X�4�����\̋<<Qk�M��zY����>����uQ�]��9����g�į+�ӧS��>f��8�
Q�%kݴ�9k�W=?��GԇPg���wEu�1�ׯ���À��ğ-b����'��G��%k��6����Zj<�GԨP�D��o$�5?�8��c'L�0\_�V�,�ȭ��r/���G�Ϗ�+�ǯ�食V�A�5&�V���G������߁Z�V��cݏ�y�M�V�c��>�j5�֚>����N�X�`A��
=�
�6쩢��=�
�=�fx�w�xƥ�!k�
6�z�~~��ƍ��8q�p}�8`��@�:jMYZ�u&�BQcBmc�V_?���M��8H}<���m?�}-ؾ���+�]�aO{�J�/��
j�ƥ�?ap9WW�>v�OQ�#'�1cF��ŋ�`�X�#?�<��pF���^�}U����T�/�&PA�092��4��F�V����w�}7���pU��k;����Y�=�(T�	�?���/���L3�:�D
4��<��O�)j�j};Dί���kw�ӣjFy;?�5��2IZ�Q��0�̙3#>��0Ԇ����V�
����P��~��M��:]+�#�?~|�i�b��ٳgK�����]?���[_s����r�(ۄ�>F��je�͏��}���X_�-���kaJ6����P*<���x�>�z�����������?,,쬯���wEm:**�>����N�(_	��77
�ӷ����)��Y���q]hͿ���D%�?>>>����Ɓ�������ӓ�y�����"�.��<��W�6��1
c�}�Y�J��7o�۽\"֣.���Y4`�IwI{��Qq\=[�����_�g�cn�?.���}���`��
F�)��j$J����������.'p�����Ԛ��b��6l�W��`����^#��5�˶z���P=#���~g~��c-�a}e�Q�Y��c�v�7�r���KG]���#@��.��6|&�ܾ}�lQ����Y�fE�����57��J���ԳgO���S�!��Q��%�Y�&]X�
ei���L�2e8�Þ<b>|jo����1�.p/x��x�/�����iX�s������I ���K߀gUվ"�^�n�似��9��󰯑��8<T�z�jZ�d��+�oĞ��)>��r~̣�/t	����:���6nܨ�|ҹm�e~�r��Ɂ�]a^���'mxפ�v�ף�[��s���"�ޢ?�]���68a������'�C璮�>�.]��d2�f������bŊ"~�b�\�1Fdff��
�iii۲���<U��٦���QO۱c�Y��gX�n��6��f�����|9�^tN�Q��^�4r8��(��/�h]3!?=�iM�����1s��ԚH�F\���7^�S��}|����;n]F�#��� m�#֯X+`���k��j�X�w�?�]�,s��[t�:��X{a�u֝^��D��
x�o�a
�|q�G�1���=���f� '� ���d��|�rM�XoXϐc`�э��x�
Y���J�
ɝ�z�;�v��v��U��4�J�ˢE�d>�gDPW�,�/����92�0Ȗs�����P���*���N�Kg�$?���g�����?t�z
Y���G�~�<��Dk&w��.I�N�>�����m�d���ǁ�F�y���q�g�r���~%�L�B���GX'`l�e���������&�l�'�l��]�v�EK�d�]�׺(��{*i�:�w���K
�kO�6�%y��_+�׬��__+/��xp��^� <=��	��VQ��E���3ڝ.�W�*����"��
}�S��%z�y0�ۅ?�}Q����s�\}5z+���C$�}�(/�D�ʣE�h�#NJ!b� ��^�;po#ʍS#�Fa�{bD����16|)���#�
Fs=��h�g�����k"A~B��x��RsrO�;����Y�1�D"�ߎ�k�}h�D�a��ݸ-E�=屍�Γe� �0J��#F�(�ˀ6|��S���߃?�w�3q�P1�1%D1߹p2mM��8���Ɖ�pS�Ŗ����~�2�1���w�]fX�T��=7��e���0/�
�&<ҍ��U�Q_�("�*r*xG$$D������ut|lDŽA�"c"��D
��0bȨ�F�t�H�i1���KLDlԐ���q;��l����|U�Q��_�-�h��p�9ht|Ԩq�99r4�984>jLTt����E��D�_��9&2�%�vv�H�3��xW��Q���'S;���N�t��(���%���QWo�|�����ܳk�~��-%�R�S���t�T#�1��a����f~ZA�ݴ���n�^����KOL��>?}e���=���w�+�Mn&�Ņ#`Z���Us2�g�e����ܔ���'�`f~�̂��̻��\�\��hv1��=�^f?s7s����m�0s�9ќl�n�c�oN3�4�7�s�{���3�fa�l�aq��X�,�/����%����e�%ΒhI�L�̷̱�YVZr,�,��=���|�K���r�"�*g��r�r�r�������ꖵ)+?�n�c�Wvb����i�+�s�s�����|�3%��M�MsL�Mi����&S�i��)_�Ȩ��d�exfxet���'y�����a��j����_PKE��T
�]�G�pip/_vendor/distlib/util.py�}�_�6���.\{��i{�m{�
O����=�mͮ^{c{!����|�,���s�g?mص��h4͌F����`���U��UD;������/6_<����ஹ*�਼hn�*
�)�4i�����Q�o�vv�����&H�i����p�����!�[�f�j�I9M'��EU��{��T�z�~X�m٢I?6yv���7\�2/�U��~$uP7�1�PųR}�W]�{^^^fť�Y���n<)g�,�T�[]N��f���V���u��~���&أ'�UUV[A�̫�r�lE	�I+��Q�,Z���yUN�Z�Q��MR]�4�ln����V�|��WsU��{��� ,f�����m��Y��c�z_g5�.��*���I�
EuS�qs7O�!u����j�d�0���qV��08��{�CB��$��t����rQMȢ��yZЗ�|�j�9`5>��j>��~h5k��������O�t�,.��E�4%<�I�Xm�M,(�$Y��'Tu�T5�z��a�O6��r\�0%`Z�Ze�]#(��d�N^�/��
=���"���1�Z��y*���`mOlu v�W�_@ٕ��w��}��{��4��U�?�����x����~V��=<��7����gm����ۇ��n῎���K��ˋ���~=��'g#��v���Co-�6�5��5k���esZ?�
���Ű�N���;oa���w�ӣ��]�Ptz�:w�ݷ����}�)vrZ#1~�-<}������W��������?�k��_�<=9=C2���izA��gIu
��<m<�WWW�����\�Dp�6���Wӌ$lRݑ<��"�J�q^��!aN Q�un�<W���V��0Xͯ�Uji��oe��Xo�j�I� x
�k	.�dM�R�[���\J�P; �8 }��<e	+B�(�0e�*���0J8�>�	��I�,9�S�J��B,k�?�آ3��T�`>1e8���
H,dYʝ���g�$��gI3�2��r4�e	��"o��,���ż�'�gN�C�(�OfqZL��V[6�<Ir�J2`��;��G�ZQ�(`0a�z���HT�h��`>Xh8���4\
�:bЃFV�68k+xR����CC������t�'�4�0�p��=߲Q����P����
�{-�yDs��jQ\����dv�DMځ�2)�F��n;�9����F܅P���~��|�|S~x=�dܶ�ꃓ���������p�2N���ddz��=^�X��1��N�~� ��a��LD�w��R�BS�����w6��Y�@���9�;����u6��j��yI*	�-V�ް���
_��^�kr��6��Q��C���1pŖ��'���a�� ),Wi����^"�a��u�Y�'�p�j��)�|���U9_����?Ũ��)!�����<��`�'�V����?��������}c�L]~�@� ���|����;l������Ig B�Qx�X�m¹�~��y8����z����G��e���,��6�e�T��
�}�1x*ˬ�kV��"`�1X�bi[|���D
�:_�1��4T�(�hx���C�-�*��Cl�aW�F�N����-(�Q��&d"��̄.�x4j����4Ӭn��O�>��ҏM���]4��MZ����*S�/A��E��XQ3��"�v�3`�疱�
6`�K0a�d�7;3��G�,x��eE��3Gd�]Q��������Y���>s{�d���b�Q#x�aP�V���a�Ӥ����8��.1���D���}��W;����Z�5!
���{�W���D��Ud�)
�ݣ����W���줌���� z�� zQ������('�0���B�OZ7.A�����b�ƴq>/q����C�����X��i]�.�$�M�j^w��opM�*�.X���r�O�x�T9�kr����%j�zr�	���������AC��⨆�C�{�t��`���2m�JtG�e�S��G���G��9,+����T��n�,�9��.�w�]��9�ҦC“�c���q��g�/v?:u��JO|��u�yj�tm���?�=>�<��1�Cm�^b�������r����#TS���foC$��Eh������T��`@,�p�,x��o?��U��G%ȡy2�N.a^%7�[�җ��ǥwrܒ$�P,��2����`�_<�Z�$�g�;��~^3�F��#ع��i�I&�T��ݸ-�}�+�;f�i�ֺ��=�+ӧ�l�@ѣ�������D�o��(5_}ւm2Hq
Kr0�ԺG���:5$/o��z[,f�b��В�<��ƫ;��m޻�,�f���{$��t�,�R�Fy���M��Ty��3Hgf�E?-ߌ]~�@^�+лDy 	�����=�<lr����-��0҆�������<ºAA�׍ޏ��7Y2
`�ڭ`�$k��h�N��Z��sb�x�q�4>������
I�|,�/�x�އOj����]o�sҾ�� ����V�z#+�v~Ej��dw���#=���Ȅ�F���9䣪V�=U�:�x
���wU��_�%�:����!��(ҵu�+U�گ���H>�'
���Z;��f��?���1E@�6O���u
�$�HsՎ�D�?z��c,C�
c3g��K����m�Ķ̉B��N���4!�B
�l����"�Γ���!�C�!ҷd�W)���
_b<w�T�O��1>E��1$g��b��4��+�l!� ��,��,���Sdj��錂�]��L5�]:�]ޤ�R4�i+Mp+1:8����x^�#�!�ڨ���b�T}�؈P��Ѹ2�뾞�X�:#�.�<Ch��ԔQ&YJCq�������Q}G�ip��Bk��dU�H`~���v��84�=�w��O7_�Ճ�c���
t��
��Q��ɐ���t�h0���F�W��?��}�����w;�w�cXm�IJ�ڜ5���6� �"M��Ij1�J
4�0�����<ȓE1���Y��6GB!�qۺv��(��YV����Gx��@�˓�\��&�mV�$Q�Ѓ�u����gUYA�!0ޟx[:�J<��v���=8�	�7%�/�ZL��b'jӢ})�4\5k�F�
).�c!t�(h�?�v���u|��I$�T䨔��6�0N� ��ټ*��R�RP̘_�P��p�@}�%M�s���O�C�l)�͍�Юk�bi�v�/����'OH�ބ��T9�5'����w&L�t��IY��xZ��6�I9�.[�2�!!�kҌ�����]�+[yg��fܴ��9�?1E0G��?
$������!s/Q�O鋏ð7��`	�Fx�ɬ�
2��%*�_����j�)������-�	��y�VSTћ��/jX��1,�
�ɄbE��h��0�N@
�<�\�l���dr�����'�푥V�ME5**=¢�N����_�ؼ��58T�$������I8�M�XȉO�WK�"tHJH�nt5$q֤�:r�"b�����*���W1EF�����f����sQrEe�i�{}Y���5�wu`CX��}�`���d��hslZ[����G��0�V�V��>�
�ӄ�&�X��rW}��s]v�[��b>o@�J�Y,���$���x��q��4o�0�K/��K
)*����Ġk`hF�m]��X��}�
�U�	���*ɤ�_P@�нI�E*��ߡޠ��X�nTu\��q����(G�����p" 2�\���N�`���RS�=�An	(F�+�@���zn
�Jc5�N��j5w�d
l�]�檌L��\�����=�M@��䒬��c����n3k�V;���ȓK����I}F�k�wdTu��h�5(�s��.��mE���ړy�|�%E�q"S�f�"h3%��G�������]��S(�܀�Hr�-����F�tp/�+�b*hLn�����w�Rձ��c���������\	�1�eYL���W
A�p#)�H���{�u���~P/z�>ثI����MQ���\������̱wc�&Y3G(�@��ӘP�0�gh���v>�gZ��h>��5���xVN��5-'�ՒYqj��q�-�gd�:�x�"\����6��q��?�E[b��Q�_$T;L�x<��}jY�:����x4k<>�V����&!��5�ւ�}G��}�^X	�՛�w�(F��t:춬H�F�zqnRv���0эSe컫��%V@�`+�>ޔ0&t>�#2tT�N�=x�2�)Ax����� xG^�@my!�&i��ˀ�̃zRe��H�{ԋ9���`��us�N9č��y%b�>�G�r��<u�U���N�[(���9AoT~�>\:S�
�C�u��{�̐Bx�1Z�ꫀ�S��1"r����A��)L~��J�����\]���8�G�dֻb��g�V�U@�Fg��d�J\�B��vP�8��|Ѥ���i��_����5"
T�`/���u��Ũ�Ov{��_T���U:���K���u�����u�?���T��Vu�H�Vw�jQ��I@'qe��DC��ٯ�:]T�dKcX�YYV����s,�6ʯ(��,8Aƨy�i�o(U�'��4f����lj"dpv�P%nqq̂"�QF�V�
)���:��D��L���e�1����T���=�C٤j*�b`�s	���l`����Ё>�wN��#�Tȭ�tа�*�B&=�\�`a��fյ�b�&v�	�~���r��j
���ڏY�2ٚe��%b$�Ф�ػ���H�*���	��O�X��e�Ҡd9jN����W=Y����怚<������oǪ`�fJ�Vi�*|R��	�Q�=�4HNZ˥�N���b�M	E<�O�Q��4
>��P_�ԯ�~�N�I9�O	M0?i��M�BV��gf'����`<MC����:�,d>Xt'���q�#C��QgW���(�#A� 'Y��H�BD�|Bv1,'�;�6��__���Y��N]���<+�5�=�3����Ͱ��R�S�;ܡ� �ܓ�4���U�*�\�IEه��֞0��ʎ������kg�RH�BB�w����\>t9��ŭ�X�L��3����x�l�gz��+>��l�����F��aZ�HS%�=w���)1!���4V_lЖ����=E=\o.~:�s͎�������n�R�zHnXW}Z���<n4���I��Z���VM��8���xхs!N%Ǐ�'��p1�hg�K��\�ui�֊�R�F��Z�3B5u��gu���CV)�A�1:��>��E��%7	��t�vȎ�ԍ�Q�[�����C���ϧ���������R�/c/��w�g!�1e�*�#��@��!�'�*��Qa�XsD�#��U|�+�a����†da�8
�?ȅ<}�:ҥ�Xmq��<��Oa��[���;��W���f�9|������5R$�����)(��J�b�m�
�?��j��c��6l w��2jj���(T�Y�
�&�i[�~�������5�4��A����@z��N��)A��e?�l[YU?د/qWI�~T������A>���7iE)-���L�SGk��a�{�ְ1m�b������'�4K.�����^��3i�]-iLGQ�E;�[�x|}ƌ��(=��8y߸M&��d�(�ā+�͞�&p�!!zy[ȱn��zw�ݯǯ��^[-��7����7�>���5��)�待�a3�G���c�b�륹_tYV��,���i4M��Qx�H����θ�$M;�zS�ܿV�{Z���J.)�"c;���TAW�v='z:fiQ�5��}�,�Jd.>t�8>~����e��z�X��{F�v<Z�蹓q�!�N\a�Xً�*�N�݃�32�`S)��w]�u#�8���',��K�f��H>-�cnEP(z�Ǭq�զi�J�w4+����P�g:�έ�R��`�� v�b؝ŶPv���*���\
�;i�逧��.�~��᲋���D�rXC�\��h���4�7 };T�P�J�t�ĩ>��X�c&^�攨R��I9AҨR��&����*���lT��q�0��P5�n�M�K�<&t�qC@��Q���Tp�%�F�Uk��=�ڦ��
4Bo<�Y7�˩�0d</�,g�+�iP�r�ġ�e|"��2-��cC����-A�lzdPH���:1jI�k��
�1�:�M<���N�s�f�,��T�I�ڠ��A���hC���O6
�r�\N�6�uਰ�?֜w%w)xk����۔�R�O�h)9�IMT��5�B�Xr��Do��������R�oN��F��&\�����@gh6oŝT鼒��sq�ÿ
$Lq��/9�K�gh��ޒ���� ��}��
��ȃ�"aD�S�����&�z�Uu������@����$�������UK~�SK�JU"�]�,��1��c</�C��	L��wLJ�v�O�a��_��_F���������R��OG�?V��B�#V{6�N�N�3��tI���DjSo�<9�]?{���W��7�	����x�:�{��?��G�̐Z�RNȶ�}E���ς[唘us�)����|�`A7Gx�}���\����MQ�b�
F�x�dO�i{c��N��􄒾��h��Bq��rR�|^�֔I�(`M�
-�*3r33��[�mRw�t�Q�o������xi��JkRE� @T�jP�4/|���C��L�i#�Qwtu����_�}z!�0�u���D,S�z�'�Ȟӑ<�en�*�K�qwD"`�t3���Hg:�O���=��i�B�A�t��Og:�$��N�L�M�&$���Ԫ��˷q8]�a,��r�8� 
J�b������`�B�7�;�o���>�F��J�χ��D%�⃂�r�u��q�#�h��ݦ�M���;�2o)��gҙ$����ޏ\��h��D:
���PVa\����-�K�(�8�X4
���=8(Ozp� *�Zԍ3��@~�I-j���]�sP�(���J9`��ގ��?����O��;�ZN�x�*�c��ch;�O�z���LG��$U���W��q�4�P���'�]MNrV��}��!\aX��AH�ݐB҄. �{*������I�F*+K�2R2F�%�Q�ތ_�}�r���֢�
X�祬���K��b�Gq_�&��¯5�H4�BG�)��6�Ӿ6�;��#�\��@�	w:�O�Pv��jf��   XΙ(��Ny���V��!�搞C$^r���B|Q0ءȊ%}�ڊ�D��ո)eu�
�������K83+`@)C���`��3^b9��%0���`��dk\�-A�)�	���~R"iZa0>0��w��%\__�x8�P��p���v���#����YĄu��9ݞ�.З��д�mLF�}��_b+�S���:�+\����,8��~����gP�Y�pV�y���#� 6�=1���k���k�9���Jme���A���GV�Os��c�[��6�Ά#͵O�hC��"�%�D��['52�K���dMLl?JW�Se�&�\�U�u�ж�`�Qݜ�p�GF�?7�_�9UK=�Ƹ�����ʽk�F���j�r�/6�/�~�$߂���i��COH�S�w�XI�Qd q��6,��lT7��p�������,�i�K��uN�:<8��ݝ�����w_�%G����d���?�ϞE'����OO��M=���}b�=�����;?U�>��N���W�ӯ�˵�?��P��P�t����g'�r�u����B5N1l�K�� *�@�O�X@��$M�6Ѽ��&ۨ�ډ�
Z�I�A�8DW�M@�P�5�D4�(�e�=D��1pP_O�f����]Xt&m�0t����e���hQ73�qV�㴞$�S�
O��a`��������7mw���I� e�T�Z���щ�=�Gz�d��`���ˁ��3sA!�T���N�d
�Қa՗lSR@��:
V�o���;e����*)c�%��'����/p�,�q�ĵxy���z�
�J��]T6�h�����)��.��0%��.���'m4�9�Tn��y�
>K��^�I]������RjO΂����$�B$/�2��Ǜ��)r�4%%��5%J�nSZd����{�½<_�����jZ]
u>�OC��c�~��R��OQ�tTҝ!������Ԃx��"�i�3�;�2"9Ka{�K����o�'����H���Q5��!gE��&���r���}��mI��UD��dc�{/��p���
���@�ݐ�E�V,���ܨ�J�z/Z�F�7�I�GP�'yR�B(���ݖ�2�
�(��W���W>�mR��x?�..����P�<7M�_�(�{Qi�K��|��E��l,Q������
ft��rE`�/>.@BU)�v��5S4�M*	����Y|�}�!!3�4����srQ7 �T��k�܎���I���(S�H��\ھ�`��f,��&0�E�~Z��w@wq6�'x���
̕����Ê���nƼNjB��d�,c:�,K$�
8�&��KJZ�Xү�zv�6ɓ�U;�,�i�EqV2-�q�0�#$J[��
�W��)��4>H�'�	�y�^��t򟏡8��6�zkc��0]��TG`c~7�6D��6�,��h���z��B1��J��I��9�/�Z��~�W����=��ϊ#�97~���׽����O�{:�B��="d����0vнaG`���f�|��_d�pR�4e��ɡԦ0��̪�8�W$�A	�J1��Pk�"��|Y�2�()u��w�Mԡ>����x?]Bw0o!����^�i.�[U���n�	�G��A�$?^Vʼ6��� X��7mZJ(ӹl'�'n�v���<�Ǎ�<0���0KCR�c:��<�U�ӡ7���ѹ���nz���κ��G̫����)�F�{@�L�I����>+t�goܴ�v�'�uk����WeL�9ve��K��H���$��u��u�44���R���;��9[�^�
(��u�	n�.	���]�=~ٍ�j�Gd2����
u�Ïu�������B��0�!��i�"#l�j#�0k���#ЯGLS���t0_�ø\mԋsLds��o��rK�qtc]���-���<	��n�ū�9���oO��u]��v�+D�a�Fa�l�+�������k�n��
�ʆٰ�@���ڂ��i����p�ɉp��#�V�����}
�<��m
�U�	�4PE��i�`�:e�~���P^WԜ����2ݹ�@���k�	�:=�?���6�&�^�^4V]ͳ"zض�S9����*i��N���]i`�&@��)�X-�*��%9�4�������0���if7��=�#��'Ù7�lKWZ�R�!.���=�RX2����99��W6c��K'�k�8��<g573��8.cJM��+�O.����T�Iǭ2�ی��=�|Y89�0A����6�~_+=��C*����N��ry��V�x�TOW�z��jC�vo���ݳ2�4��'�\ �뜟U�/��N:A۷"<C�9�z���>��-��{�1���+�1���)���~#��xaٚ(HG�z_v������9���d�}Q��R+_4=�c��R����T&���3`vC~ȢMЮ]n}�2�˴�'�m�j�f��m4("�����лǷ�XNo1I,2N(=4W㳉��چL|d.�̰5���٠,�;ͪd��4�d�?�~�7�in����C����6	��Q�T{&f�UuD2���o��_#,3�)0���7;dԒ��Z�H���hT;RY�ms(��=j���òF�2����;�s����U���EB��u��+�fKwd�mlD��}��rw^��Z3A�ǰg�PX�P���9W��k7*�ǭ���B1`=��)���H���'�PZ'�d�9���u���.��B��\i��є��~R��d�XL;l�|8bi0�|`ϵ�Z*����1ƅ��丩pG����yeqKJ�ex�O]ҵV>-�]�HO}���$+v3+�8�)��D4~Ou�
a��Ina�8ż�������U!�>1t�t��,����S6l�\���J�P?���#�h�dZE����g(∥�����c��x���,.�@�B]���Zk����ݼͮ�y:͒��.7���qR�+)������T~���U<�l*+Xc����b�~�)$ڪ3�ج�mM���E�����9����*�_�+E��%��9*�g�� �S�l������T_�5C��~�L��PԞ���Ƣ�{ը��J�/�g��#v���!
]���pA�ۧzɰ��?՞.�G��ڌ�#
&�IW�jW1r���^��-+NEJ��EW�JxC�.�d� �n2��S��P�ut�~)��YVD�á��ay�ܓ��&�l_��
�K�I�i�QV#�W�F6�.05�=�=Ճ�hg��g��q�;�.���(G��l;�"�t�2-(�N��������y�%�G�9RF}|����v F2Q���j�g]�j@�[[=���=�h���n�d��R)��;�̏��,�2{IvtB�����#�;��3��pZv2ô�I8�x�6�%t�Q�����悷����R30Y�����_H�7L�����n`i�N��Ž���y�f����g��Ɋ�"�~��Q����9�n�r���>�y����x����w*y�)�JǗ?��7�����;��}>,,�j��_hK��.�4���6~�1ŝۡ�&'���֚��i{����~>L�	����h��d��q��9���ݟ9vnn�´];?�P�M�|��>3���|��F�W�*�kn\c��xP�PAl
aԸ�B��9OÃ�
�F����O$<���{��!�jM�>�&���~���z%�F�j�|��t8_��yo��m��o^�[1[������^�F�o�c.��/���r�H���A�\������D�>t��|Y�H��#��C쮫�j;�ߣ��>RеU۾�h�K��v��!��=���zԎ�'2V�����y�~0�rjG�>������4�Hh�^	He�$���$�SW��)�$�k�H/�왙�3ܝℽf`��Ma���=L�Pq�s3y��%}��:�Hڬq�`�ZR��\aDأ ��t��'$h���{o�._B�-c�c�f��?{�7��lc%�R�����N�Ɲ�}`)Na����8xe�}QzP
�N��[��KN��i�����̉�����
mA)A�N%�ޮRz������I��cx��'����$��t����`O��E��a_ܖ=էJ�8�8��mu����Ι���*k<b�
�7z��S%��yR�����1눸~�����
��1���R��{\Ȣ������.�4�Q��&&���ߞonvw=���HP��'_�B�B�)cL�P��/d�!M.���wi��kz�i��"f�����?�����r��-翎���D��$��:ꭍ�܁�2#Y��D�auޛ��!@[�h:�¦�-ƦI1�(�Z�2��t§8��
S��qu�r:_��7��t�1|a�)瞼���s�JXm%Fn�}�;���5T�f�YO�=nC����P�*=m�/�!+��$��Wx�yq��
�8z��G_�૯�.;�@)h ���`���36M]�yO�O^N�'OPٽY��@���4��%Y��L�~�D��c����\�7}�9:Ҩ��櫯�迖<kD۶)��]y}}��[F�6�J���.H:�O^o=y���zsIV�.<;'�C���g+��2���&�N�+��V�8�h0�����&P�1�]�m{�f`�w/+����vh9LA����ߣ�5�J����6�^�e��?_������%�p�J<�$��rs�)+q��4����w��iڹ6�G�^Q�)�'k�ݣ<5EF�VҤ��9�_Q�mvDZ�`�
$�L�5)A���`b*����yy�=�y���z����G�O�N�����)�'�t[�pw��:}UN��qz:�������_�~��Y������ch�h�ح�ϓ�r���_O����SQd��;����5*�T||nzEU�9ݏ<}J��r�<�?/🗿�F�0oU��m���mA�� $�'�t��FO=Z}�t5�an4uD+�AtX��[�~n�Ҥ���q��tT���ST��k0��_�������v�p�(v�˩�lr5�[͒ƍ9��L����]3b<�(��r ^�vu�V5FZ˞”���ۊk�\gj�
�B�P��Z�!�A���׾ӝ �ӖUt��i��H���C��L{F��h��.v6iV%�l���e'��$���gIpn�
�a��v-�;�n�_�E%tk�,�xXP�]غ�|�sN<~X��S��brEx<�sv�<�uە>�翆�=�&�ny���}�af�(VVp}�%V�Ψ����?����G��=�^��ԩ�-}�>㫲&w�$�;0�9�*�'���t#\ޤ����I[�ޠ��ᴜ��W>�P��:yv;�
�L��$��ȫ��LG�v@E����Ը+�=����}�,�"�)y�USf�)C�/`�W��z�M{ֺ�\b�������H!�R��L+?8V*s:�@��-P.���V���L
����4� ܠm�
yZ|�X�D6�;8�HfA��GGov�A�?���w�ߌ�͋�|ՍTP��?���+�p\RN�9P�
���r���}�~��ڀ�|<�JԁQ]Oh~��v'�\��P�����s�n�����R����~�i��RI��$AGV�]�d�
��������&i;{�2
kABWiv����-��m������;��Ұ���I��|�^���_�q�}0i*l%Rs����T^�u�D�TX, �d����C�O��"!r�=���?��n+����;;�Z���]S̫�>f5pCK��t���#4]�2���SȖ��O;���3(���?���J$��$�xo�q6	Z���l���X�;�|>�}(tͪ�Àa�7?�����ޘb;�4�F�"'�[S�h�VC�H��8خ��1�F�j�yJ7�Si��vE>(Vܪ�Ph,<$uN����)M�U�K���,xP�)�jOu���4�sMI0�:�H]�
��H+!�AG��%�H"NGu)�7�<vnИ\�%f� ��z'eH�ܡ�ֳ��+��4S���[ޞ������.�'
�ۡ�˜��L���Jb�m.��H�,d`������N�!�j����`����t�w���b����˺���+�̈́��BS�
�8�>!�=�a釾��
BCV��1��#���w7��8\�$`�NxӖ�1�ҏ	�G֘4�mR����W�|�M��Y��Nv�	F������/)�:����DŚ�T���oߨ N�#���~0@�Ol��h��J�EC������?%f�D��FL���(,�H%�4�[����uM���+hJ�@&�R�:ʲ�E�O��S��$�1ӄ�R��0S�YC�n4h,��@+��چ�Ѯ��"e��Aff5m�de���'ȜKL�'0p�EuO��R���x@|�f��`GR���R�#��U�pO�q�W�	Z��Y��\ӥS���6�-F)&{+�M���;m���
MN��ƅi޶��U��_m�Y�W<��(�'��y,̀��	ҡC��ɦ��(�d�&�K�<��Fۗ��m��]Y��g�cB�F�2�[�r��1~�8�cm����~Ԙ�M�{G�}�MЙh}��2Ť˭	���=���i���odz��p��_�Zƿ�<?���Ι,�>�H�*�
~��o\�NO�d
�h��
x/O��f7դ�I�<O�8f��5�F��-��QH�L�5h��F�d������4킒š���|aOLbQ�#� ����I�R��u���4�C�҂J��qH7��Ӛ��KK5=��[�y4�P-�-[�Xt"Q��g�2x�#�,��5w��{{�1����Igo��O��hR�H�Bԫ�fE�/*�4^��h͑���.N�$�]�����pwg��k���:]-4�
�E�Q�����{_|,�˞���mB�P�Q*R<r��Ј��l�^��D�kU���.Sb=��4 p8��t 璤���JӀ*�B��F�hA��C�6����8�$ ���f�&�i�g3�/n��fC�J����Jh٦s�q�s7m@^Hi�1�W�[5��m]Om�F�~�FA��G3/)h�E8�C��eL�h7��7xJ4��Su�+�k̵;3�k5�9����,h�2`2>}�<����D��d0�M�/Gn�8��Z��F#=��ժ����\�#�t]vOH�.�
�gܼ	Ϝs	T�͉\�ȏȀ�TgW��u%l�p6)h��-(��263 /�N0�\�����S:�x��puޯ�/L��dt�s0�Ŧ{o{Ş�m��Ř?T����9��O�?o�1�Pj5��cΥ�[e��N��C���V�@���"�2J��$�&���E,�h�[\�hkz %XA�T���B�ݹJ2�F��yAJ�5�
�t5�[>v��O¬��r_ԋ� �	5�iw�{q��jm"��2�V���|��s��D��N#��&p��:�a+��J�l~)�A��͜t��І��F^�:�K3
ap��S ����_ބр�\\&Y���%B�(ߥs3����UKpia�\���"�~>$J�/2H�~O�=�=�p�s���D��զ���H�����<�X�;j�'���npS�Hy!~��Yh'f��F�>"�8�IKjO�[]��)J��z�ǁ���c��Y�{LxG��%���Ab� {M��N���'�\!���Jz�sr�Ƹ��,�>�,�f�aku��4
c
�@�nfc�*,h���2G}W��@)�s霽'��!��[���m~uuU]l��N�
շ66��M9)���!�{O��ȅ��M�/���F�LR�iIՠ��a�M6R�-�3.%�{��E/��iq.W�-I�M��8ܢ($۲TK9�a�̛�JP�Ux(}.��d�ts�9/��q��uVF������7��>�6�`̤yZJ%���,�	^��v���J�9��)S	�fdH�}֤�BAT6�����E�I�i�ס�����\�X7Ё�d�F�-R�-�LJ��דE��vH���������,礃}�<�;x����*�#wο��Ï�X=F�ԯ][�ͨs�/�+����ψ]&��%��I9�M�V
&�h�2> �A��I`ґ�r�`�5�٩�Y����^!_�o��
�'�j22�N�`;�0�Ŕ�!1I�<W��^���;Ç/���6ɬ��|�j9OT��|l�B<��jQ��
ǵ�~�l�eWtZtm������w��w��x�^�xb��\�#��y��6_*���q-JK7Mo6����7��ƚn|�N�V�4��n}�=�3�l���oU���H�DO��Z��JV^:QR�mt�a�X�he=�;��vʶv{� yH�i���h&U�B��*;_ ԾҬHry��pg�[�
x�Մ#|��hՉ�}����av�xSͯw��~�3�������N��
B�d����*�����X��[����YT��vc>���{�Iϵ��_������פ�+}���z����t�
^Y�u��,�`Զ�nv�������|����=��Yw�F�����28�dkU�'�u<Լ�AGR����&��J4�/*�>�y��R�Dy�bB�fm�Ct�@�u)�Y�
'�Uݜə�8��sְu��ԗޡ��"&G	�I��F]r~=C�u�j(m0�E��*����y�|�|��z]�5���}��V|�;%���=i뜄�����f���8���g-�$�2�ދ��O��(
�Y�⣻3y�����.@�����cW�����d�
_%)�!LS���(�[ꞡA0K��sX;2.���@,������\%�o��Umޯ"��.�W����gEJ�>�C�hht��U�E�C`L[o!� l��Ndo�Nz�A���ҡ���A�38_G�xV�>0��F
��~Jjg�{_�z���<�;]�-�'x���%h�xe>�����ѷ2��>����d����&�G����nI��
�{�_浒�__��o�b��aOig�ꅉ�{�#�;���^洛�GQc�~�Y���dkx�y�����b�ҼyO��<,&��lp9���)綄�����-Y�W0�@M=ۣj��z��U�aIn�1Vc�#"��q��{�2+:Ii[�ؔ曨ZcЂd�wdơEm�1���/L��3�T!����t��U2��A�
6t�g��5��E�:~�f�l|m�I]c��,+�
�6�ir]�(*XMPu���؃����Qm��T��=�D�?�X���-�S�p��0���r�p�N3���_���]^c�@�	�`ʊI��
��G�Gp*7`�J��@��	��G炜6�x�輸��;$>&��t8i{�A��"4(A�/Az��7Y��h�k�4�xex����h��"O*�I�D�ڷ+g-P�ת�5kz���z����'I>�J��+=!����g��t�m�|Y��|=�
%��G�L�͊�d6��� �����u�'�o����u|���g����Is�����O��Aڴ{���(mQ���TC�C:$���d0�o�6��]E�0�$��?j橇�S��t��+װ�PC���ZF��IMh9PB�:k)m4�r���N��)Z����
~�j��E�g��>X&V*�� ��
�RN4;�J�:�ӶƳ���3�S�[����������o�߮J~����*�
�a��II8oZ��L|�(���e��+5���?�)����q"�R���1�1,���934�M&(W���Ͼ��";���CHx�NS �,���
Ho���L�AOx��*�Sެ��Ŝ�&��N$�jN�t��!^u�<1!8|=Ln�FV>�Iaŀ*��y��G�������*�gF�P����|�f!@E�f`\D�̃�����8t+�+�]?���.0Ią�PoSY>�Drw�F����]�M�xs���njz/����1Gۇ�_�\�>�ןԫ��I��3���lu�qY�RG�^�6�W����ģ�~���X�v>=6���	�?�ƒ�7j��h~�y��Ŗ(�� ��|߻V�)a���yY6��'s��<���>>��ëT�<�S=���ԋT�WW�V�Gla�*x����?���/^~���[���8��/^�|���͗�}����?��&���.��W��I.D�'8�g��:�ٸ
ﲇ����X�(1�e1M���ϺPw]A���D����a1�Kf�$3��T�1<��8b��#-�N5߉qb���4���e�h�e,ye��Uj%
0�����1ein�hF��VL��,�g�.f�sg�%�u�y�����e\֚VC�4�Ad+��!�[1f�M=_Dv'zZ'h�u�E=�;ه�H�6��:����Sge|�}����x��f�uA��-R*@9�CT��L�G^��Ѿ uf���Jk������[:��c�P�W�̀4�Ƽq�K�h����ۯ�����c��#��z�H/�0FO�`����5w��PKE��T��2�~�[pip/_vendor/distlib/version.py�<kw۶��+�9$c��d�i�q�4�fO��n��ʪ.EB2�TIJ�Z7�}g	��l�q۳nj�x���0�>�>� 
�d>d�b�K:��}�6]n�h~U0����������+��6�U���tV\�g_��$�(M<�y�9���ۓ����)�������}��ŷ�ϱ�u���:�˘/xRPo�Θ�f1���1gk��P
ȱ<��fl���(���r�f��;;9���N΋ղH�8��b	0���Q����N� 8q:�C�z�x�3��� &��"�V�b��l�*�XU/�,瓌���2�V�3��q<��c6�N�l����<�^�a�L+��/`���vX�c}��~��:�����r�ZsU���DR���$��;�y1t�Ɲ�g0
I)���2{2I��L�N��~��-P��x����WQ���U�M-����-���/����GV�gl2����L��3��
�ě��i���K۩5�e,�^��RZ[;��"�<ʣ$/�$�6�w0a��b��{�z�e	��o�G9g�iQ�
*Z��C]�*X����WS���T�'�~��I��@i��
��4�:�ѱx���к�j�L�'IZ0d��6���b��1��ք�T.R}�
�E��<�׳�\�cK���%|�p�A���4q�ǣ�r+���i�e�M�c �1gr'5����P�*4�UQ,�O��i�{K�;^�͟f|�3��)(��<��@]���d��&
w7��J[[cR_f[{�=�m�1l�=��08���SR�5$�����;�>���[�$ٔ�|�̀$p�ˏ�����=��Ri��V�f1S��i�Ւ�Q£8�.%���z��RE(�����g�i��~)�`���,���gk�.[�vMPi1�Uk�WF��ǭ�@b�W�]�M��ۛ���l�M7���*.\��1ǯثc���a8>jo���W���R�r�X��V������@k��p���g)�IFƚ��t�M�	�oijl��j4m�Ia:ȥm���Iʍ�/y�6@	�)Ū��˘�ӡ>
a���]��N���C�\�:���YFf��Q�`��װ��XhB0�.�1<�#ZW�Σ\�)�q�hȎu�30����"7'�_����?������-�t	+��hD��O�D�myO,��H6L�D\j�.uili�N�K��"( Ȁn!!km���$�&�K�.���v��M�k!�3��m��=1�'ͮ���j�k0��?h��@�}�|ɢBTH�f
�A�̢�Ѱ;��"[�-���
�B G�oZ'B��*$Z�7w��N�d�q����+�ޖY_W��d�/�+�DY�DiTX�V������}�֍޴�<�f�md�
���'!�¦��@\����P�q����-�
�Wʟ��-��r�%�z�����Ð��7,=`��G2JU"	Z�!z�s!F��C"��_ҿ�WK_}.�L����֜��^W����"\�CH%a��=��k�j��l�m�f��9���I(��/�L.��e֬�u��ʲQ,�l����R�BR<&�eW�b�:�]��l��ֳI��H���i��D���A1�c5m��0e�j�3��hv�e��,���OW>h�i5D�c\��h�����E��#�@���\������'�F��/5��y��k
�s���Ug���9;9;:�M�?y������I9�Q#X��a�ھ9�Ǿ���ım�vz�f����N+����LA�.�� �#����^�cDG{s^�O�&:,�r���հ�Tn�(iP��*Z4�BnQw׷N��YQC��$�y��������d�������!ŶF�$Z����e`M[Rz�q	N'�9�1K!��m��qs�*��(T;��>M9Jo\����A%�Q��ٲ+A��@�'j���
I�lP?�K�]W��ް?�q�m]���$�|�$���blIZmQ�[���g�4&�B���u���/t��6�
��E�.!�XP��A+�#,�U�UD��bd;꫱\�mC<����*�E�R69���<����_�QX�#Mw0.Ax/X�wP��MW��l�]E[CxSrؼ'Þ�E�KVs�"�k^�����b�д�R}�r�Z��ڽկ�ңمH���Z-���RQH\q?_V��Pݔ��O��2��y0�&KH���g���(��ԗ�	ٜ��S�&R��T<��V��^%�R~�\�VA |�{�1P��$�z��_��xA�I}B�A=�hn[k"��7��9�]
��=i���4-��U�UiO��T��#�/	K�/Y�.a�"tW0(�IR2ND,HWee��q>io���{�E���*.!}ï�4����c�TF�aM������m�����C`�Ok�A��;*�/���o��°�䋦+i@���j���Q-VV\�H�)L��j�6E��<f�~\�k)�&�+`��hY�W[��oP[?=|�_��E�у�"F�3�RNq5d�����
�:x����V��1,P���U��z僶v���5�\C���r��Al0 SI����?�'�yϼ�S�#�hF6u!�ZhU�v^��:� Tʮ۬'����D��7XTbE�����'_O.�|uN^`a�HZS�ௌ~Î���o;���.�KJ��ǦpW-�A�ci�!'bE��m��*2�F�s#_7�ιAf�4�)#�R:ހ��R\w�D���1������7���R y�HSGY��ֳ�������ƒ$��]K?��ZąU;�R5s����J��U�z��jZ�:?�F X��U?YR-�W�}��a�MH�A�;�;��2Sݓ�5QV�u`� �4��P2���b*M�p�``v�Z78�V�^�黙6Dq�K]!�<�5��ֹ�U�!$L𢷃8"F���(q�𔥂T�?.�
�_I��T}d��ag�5o���иI�qRK�2�f��.p:qԔ^k-롽֐dM��cVV6�E,�5��4J�J�H蜈̌n�=�	L�]�@;
��&�}����e�������L�6��o�髝��Z~�>uCO���]
@}��6�L�v�j��휠��D+�]���p���P,�+y�A+��+�c�?|U�7��=�S�������߲J�w
�[��<�3k)�]ǰ�,m��j���ֳ�߼=�����A�z���5���O,\B�����E
�eX�����2뇑7�/CAeVϻ�ׁ�3�cQ=��c
<؊M�Nw��
+�O��K��8��'�6�$,'`��^
�ږR�e��N�$ā��@���.��z+�����2p%�y�T�hE\D��VI��%z�M�.���[y�;�S����R��V�/y��LP�#�T}O� �u�YP�#�`�Q�ga$7em<{�_����Zf�&��}���c��0~�&�cv0�}9��O�{ty9��%�Ur�S^Ep�gm�>&Ln�-@Ж�p�1������N�nC�u%[���wߜ��vr��֦~�k�VG��j>砮�
�*�
:�ߋL&�R{L\Swz@�.H�V���V�Ǖ�h��2�S�0W0�[2�>a����KB:
U��:�U��T-N�@�₡&0س%���|5���+���Q��5�g��ԩ:�@�i�P0�̊����c�_�*^]�}ET8/�T�����km�e���|�L�S���|5�B²��hQ�fG==��l9°���EM�ī�mi��r�8T�
u��3�%�#�L���)���j;�]᧲�v�B8:�ǘ��A	�ix8nY�;��l�=�`�;`��J�C�$��4��ܟ��\�6wS���BCsc�b�HI�#\�I�y�B�u-A�xqm��Ħ�����:&Q��đ�@���j΄)B��M����i��)L�+��<Z����=A�w3�IW*ri6gDF&�CB;��UG`2����
&O��.�b4���9�p�~�hc�:b-�j��$�ę�uyuPI�
)���=T�9�A���L��Y�l
ƽ���iγuy{U���`���*`�)��ls��c_0�������
�_�wWDγ�[x�z/\v4��9��4��]68�����{q�X���Q����!�+ψt��_)�m!�H�M�=?b�g}�wT���Z�b���U'u�A�?9�9�h�+{��(k,��+� �:g�����"�%�UJ;��Q��妲.2��i���p�@�c�z�M���7_�r��\�f")LR�R:-"���@���?p���gѼ�{�m	��B�2�鐐ލ���.l��K�+��C �o;�.4�kG+�KpP�5J��Б�#⑂0h)ɢ|f�᮵ҥ,.V�{�̶+�+�.EG�ǫ'baj)̺������{��KZhZ|�0����VN��ժB �[!Brso��!{�2�p��B(�RHc�ȿa��p	]Ƌ@v�9��0���
�	Ӣw{�O�1&o�.��R8p�l.��s6 S�0�nv����x���d���
����>�?�2��>����6���-�a2d�]z��]��(�Ij�xǯ��KﵜV+�ua��2-/H������7�����z�
 e"�4�EZ�*+V�x���g3LR�UƫB.��q�y�{:� �qʇ�sf�pP]�/��"����e�l�7�N�bW$iy8�N�����Å��ޞ���/5�����}JV�ZP=c�s�٧��EL�Iƛ�쿪m$�d�X����b�?��p+�K
��6u��ߗ^��3��8, ��P]�2a��Bf��<�Q��"�ٹ|&�hI�b�����GW��p�>�|Ô�2㪾{��.�[�M�wǘH��R�AHX��	EQ)�R�6
u��i.{�x[��,���9��T>������p��ߓ�XY�a�~Ok��;<���!���X^o���[72���v���Z���@�PЇܗ�^�:m�@su��X68�"�8�ͼyT��v4�����Ԁ��z��@�̆��`��z �vJ9��o�[@�\�C[�ٚ?E^����w.u�-D �2Q�i�ݠ�Pl6J�uį]$��v�|���>�-���V½�)�:xU�XA���
���-o����(3����>(q_���l(��漲��k�gy�S
�>�C�/��J���������'���)S�޼�h?�R���xrĠ�&����h���(��0Ž�U�̨��je]|#��UE`��-p����^ȏo^���
'�4{����(M�nMQ�g�S�F'��ו^Q-O�+uR�}ɥ�j��1+��Z8K�Ӱ
�c|�^X�W�q���3�۟=�1���X�-��eF��i���7d�	q��%I�W)b��;�؂�dj���D@T���Q��Uٱ���r��tY��؞�i��
��Ȓ�"!W��U��ZB���kqZkl�ߘ}+��V�5�}���n��n=o�뎥
Z�hk�zyVb�z��q��6n5�|�[cEE�4�0

B�=��Z�0�v���F+�ʓ�I�w�Qj%_^���!T�@G���\7smy.��P�w�g��;�z[]���QF��(s]�8�aa8k9'�s��4Nۄ
�2s�ш%ic4�Ns/+�}Ꙧ��+p�
�~� )��o@��X%����l�h�.��^�Ey���cd�WR�.������չ��Zj��<�;��@�֕;� 'B~�.X�9O
���}C�L���])T��0��v~�?���CVu�?A!�1I��"�Nߠ<�O{�V��j��
(tQ���y2J��9ṿ�*�ρ�.6>�QNTPiT�B����YвR�4�f���q���BG�#|�=�#~��k�����rP*��c͸J�p��[!��S��u�A���M�X�F��NWQ">��A�.�tܖ�gX��2��2��F)�Q�;��A�׶��v�١O��xt��n`{?�Y�[�������;?�	�r�*���8���q���(�)h�޴��dV�0��X>wt��uv���Z>_}����j(������O���9��H�:��
����7�Z���\~K���}���E<����+Q��8���<���`�%��I�c-���¯rj�s붭P6F���'�f���bC��`��ܑ�W(�$�x�g�*�߭.���H66���[��������7'�U������o
�Z��m^��z�V��H;�gp�p���W.�k:��B�$�h,a)y܄�Kj�.K���3�""��#K~����T��XY�g�m�#�#�̑��E5���/ϭ�Iz��o_�7y��i�I��f�?PKE��T����fpip/_vendor/distlib/w32.exe�|E�8��+�$��	1(��%;'�	A	�1�B�,�W���4��{�}zwYt��u��wW~�
�0�I5 b\X�kVk�Ab2��~�T�L�w��}>��y|HwWթSU�N�:��TM��3&�a��s��9����rf�%�y!�K��q�J�6nl��]�w�[��;��|�m(l�+��}���z
��
Wggg�8����'~p�}ɿ��߷ޏ�{�������z�G�~j¡�~Ja���K߬ÿ���L߷��~�wq��.�Yf�0���K�0FC�!�a���w�"x��K�~��hz��<o���|���
���w�E�=5u�(
̀�;��k�>�r�a
����P�V�?��߰��w�a�B�V�0�����w�w2L�Uzۯ��W.��r�Wk`�7`�A����W7nj�>|ӶB����6���q�=?�|N����M�������'�V�}^��:5ou����w'�T0��058�_�C�W�sC�-���?��0�o�n��1���K�H@��u�o#�x�8�#߅��qK��e�ݭ�
����XF�r�ܪ`
G�Tկ�T�#���/c-�M6��*��0�yV�f�ٞ
XGl��_��Z/E<���<���$�5�Ϯ��F��aK8��q� ��#�b��O��+�D�� ���H��dDyK���m��y}�n�J�5bW�=���4"5���w:bܮ�� V�hf��S�2Z��[g1̓��XFhM��U}�+�5���@&��9�o��0xȭ��#��2J�BG��"�GM�D��dm���g�������%��0�k@�r@F
�~�Y+����S14E��j���c�{"��fHB��4`����5�@����X�$�!��5����sE
Q�?"�ϐK���`c|ؚ���N�Ç'3��u�4�� g\@���Tׯ��uR�o�����UDR\��KN@uc��ѡo(YC��T%�A�����jGt��Ir�#���CFW��N�_����AIH�t+���O��3*4N�B2�
R�*�G>�SANp7���9)��R��u�
KC���� ���q(��Q
����Q�t�'�}�
�=�5Z+��Յ�����T��B5��N�Ψ^�}���<�q�^o���V�B`,�=ZR���WC-�*x�$'�>-���؂�m�ҩ�W����1ML��Ak���
��!�.J��+������܁U�O^ �uw�E���}���\�'�n&�cC���0�X������Q��'�	�� &Fy��$�n"����f1fvԱ��!�H>�կYK�
�����X9Au��,7)��r�b�T}�:�uRڼ>2ӆ���0!���B7ك�~	��(���M���
|&�*os�r�����׊3�8��C\�W ��\�g����@r��`d;��
o����	��_���R��`0��9�M+���l.�<+!Om�c����
����q$ �5 d��W�)q�����M�pD����5"���J�$����O�9��gx�w!���.��mbӈ�g��w=XFY]#42��P��yZ��g��� m=����'�W@ļJ�g�OD���{� mW���W���P��܁��7B�7���b��7_���l,�~
H�.@�&OA��feJ����B^���@e(� �ɕ��ᬅa0,ȡ`�4��T�]�_�l�)���1��1s�IZ�D(Aއ^�GH������G����>����	L-!Z0p���I���u�3x��q\{�z�| %}>u�n.���ռe��{eЊ���z�
�Ϗ���7�B�~�P���:����m�7���ta/�*֒S� {�~�q8Gu�	��d�)j�z$��U.�#�ֻh���T
Ӂ�K&�G�J-�
y�7&�
i5)$����8_B.Q��QVBe�J `1��a/u��Իr?(C�BU,p!w�i�%&f�����OԤ�`�P�F`�mȐ-ױb;+����cV/�$�L��aP<~�3�.�ڄ����v�LBܻt�|�G=��ϰ�C��b�9<�7$��I�x##�S�i��,�26��	��	�d�=� �A����y���۠��j�Y��	�G0ݻ�Z��At�.�,��nW�<�՝��ၪ�Ũ*�ϰկg$�Y
�3g�I�H��
�fA�M�a
2A�a>ŬІnKFfA1���J%��կ��GI�x��晡���ys�P�f�as�
7Y`N�a,xxm%4�(�ѨL�ⲿ�8iBjZ��*b��Jh��ͳҾ3�dǂ��;D��(?�{g��x7H֛�5]���æ��F��)I�!�6$b1��Z�uG���������_g�����/�|�
b�f���r�/��՞���z�?�
�Tշ�A���<��y~3�u_���@���wC��J���e(/�>��x���/����q��Yoqz�L��B�\�g�г\N�h��P�h�JO�xFp���X��_`�{�a��(�ߏ��a߄����LH��#A�m��9�4��n�PeP-�Ѻ�ؗ;f���5�%����F���ۧ3���m.�Аy�[G
����V��!ȱ��� �b����*>z<!�˴֡jH�є�9���]T����T�C��J1�Ӕ�FS�)�9�-�%��1�3�^/|���I:���O��._�V�!�g!5J<�G}��'���#��`<�?
v
�p?P5�Z�*5��� �@!0��?��c@�e� t�=�<���`��+[�}� ���M�B�l���-�Q:�zj(s��>�.0r���X�r�5e7��6�wf!�m��7�B�@%(~]��?
�.���*j}�����D��\/��[��r�R�ofP��MI&�:[��ڑN�Cme@�t�y�Ua���+�,�oC���������������@Э��(�q���A��Pj-Փ��`ɺ�Xs��~��/)*F��\	������}�s�H����VC+869'����b��!X��M�W�:?Տo�
�AI�Q�d(H�g�
�G�AvcuQ��]z�
��[!�p<j儣}'��څ��h�Y�|5�������/��%YAu4�L�X$a��߃���U,Y�$@���2���)���{���e�
o��
�ׯ�'K��t*��n���T�ZZ
����NJug��n�3|;�o!�+�,����0y��t�m
F%Q�՝@W��sO]���X�.幘�w/Р���xm�)3:!\�f�㘫� �yY��;�=�dc�+b�ո��a-�n�p!�g!֋�Q�ߗ��n��yC�H��u�X4�ȓ�X���HZ�A~�iB�����d����P�c��z��4T�LC�����%�
�g5%�M*!T+�%o��
fy���kU�A!��5�O"Ȃ�HnFL5#K-��X��g۫�X����b��{���/-7�9���
��(go̬`���t���K�����H�,C�T:K����΍F!W��h�BJ��f��"<jf4��@_�l\�1M�<��bVJ(~z�A�؎�s�d
��^�~�6���5�*�?��b��1[Lܾ��B�@?L���1BtF���0(]j���l%��G?U������
h&d���n2�Ať��A6��gbN�������Hs�Sϧ�5	�΍߬]ә�е�W��^li6���)�f�Z:���T��\c���Т��Z�-���բm��֫���z-�(���FN)ڒ��A
|�g��>�y���u�p�I�]���l�k*�N�f9��@���X�)T�AU�,`�/�A$��!ms��~A���/T?�\��f @"��ZS=�0Lt���s�!�AܬP��M�r�L	���Q�3�r�;3`�J��F~~A�%0mu}�~�EīXvc�d5��B��|3̎�>
���
 |��H�"������Z�dV�4ٜ�k���7J�t-d���FȰ�͵�p}�\w#�4��4ex]���"�ж�Qh����[F�A�[��owD�[Ĉm�-H���V&�Z%Sl/�y�ꎛA�Dn�d1ls��/���R���ˊKZ����H�rZ`~�:��CU�#�P��WH�ky����E��s�&�yh%�~��'WY= pn�W���;�(��
9~��L���F���X�S��'����G��|�L(�ׂ���$s8!���(�Cδ�~D�n:/�U�oa~�-|�|�@_z��O��m�i�O�ұ6t��&�it->���x&���(�e��U���}��]1�4���qt��Ӓz��4���3P�%���.�1]3��ʌ����
�,~:h=�y��q�F
$��������x<�{�,��\��j�T�p�c�40W��4ԯ��e5�	�P�k7;^���Ł���Cgń��Pe[��[&�C��G�/�1�@�*��S��k!*#� =�0�L���M�ӒUy�6kVӧn�%������ࡄXg���ܯXɱ�P�+ka�9�!A>�r{hC�����10k�����
�̀%0���A6����)�ڙ��u���:~���QB	�cr��J+Y�*
��z}r�
�+Ս��2Ml�e�\PK���SS�y��5�e!$�U�P�'���\��/�u<�'�� �K4�}���l���)w��j�Ŧ�~�����%׀�s
��FZ�_� ���9�Yε�F�<��n4�f�4�=�D���qEHo�\��lXdhJr�����?�Ki����;Ħ���"�+���6gȑ!a@�(�r?��G�,:�8����5�e
=�%�AMj�����(�\���+\#J����P����D�~6t��J��y���r���
^F����8�4YU�DS��TQ��S�֠�2��j��P���l�V-Ʀ�5Ŝ�6<M}I�-l�5eB.e��/\E�s���_\�SR�S#v$yu
5s��.!-�/�w�H�8ɢYH
���SR=�-�b��)�&%�A�Dh(s��D�0���&P"\�;�s@%?`�Pf�20�\�7�jz��\Mÿ륑�qbK�#��S�z	�;T(�i�{�a>҃-}sM,����C�M��{������2���#J�+qS��`7]�,�F��ghd��|>эϧO�s_>Õ�G�H�W�����+�l����2��z��p�.s��,�p=%F�3ͤ ���#R�?j�R�%�� �֥o�(_��QPGԼ���&V��k䴁�b�=�w+jF���XC��W-E��y�X���.����(��S�L�0����}���]�R}gl�7ơ��c�S{.f4j
��n�Gb��#�l��Ev��mp:��JX��i
�j��R�u��R���j�|�^�X�@�M�c
�����EDD b���� �1R���=w`X�3�;p-fnأk�3�03fN*t��ah~�Hqd�{z�R������z@�����I����P����>����c4Q���d�֚���s�Ɏ(��0N�,d��%�����[Y���=�n`�	�r*�E�}�;��Y���+�37�!s�ѵ�&�7/S0,��q��+ȃBM�.G�h3������g�ax.���h�f�{ɪ���ԒI�B�8b:�@I����L	Ƽ��Z��Omw����+*����˚:�����Iu�N���
-��W���T�]���-@.eՓA�l�ɷZ#,�Ep��M�|Z0�j�%�+p�h���GKk!
ֻ&�|,�a*d�S
&�oh�(s�o��5W�Bi���XM����&�𫔼D��o�uXX�Ȧ2�`�������ą9�P*���n�yZ�)��U�l�0�PXO�+ń;sy�_'�Ki`C(�I��3V��	�b!�Ƶ�cz��~��s��m�#��#�6,��u�t�t�������/ѫ"�(~��-�٥���5
F��G޶�jq>�|Z�5�u�Q�#6ZC�L
�
r��Q�q��t��1�����~Iig�d{fEz��,�
���a�:�SjC˙�]^�<��i>mg�Ջk#��e��P�$��p��n�S���`���T{E����^��Mvt	��u���;i.Q̡�V�AV�@���P
(�wRjq��-T=�hD��`MY�|�:l�1ܣ��Uq�L �쟤�,
�;��#����ڣ+I��:�����C�68ȵ�-�HB�l�1������q$W�
�q;�������b����mRX��3�	����̥+NgaJ����ڍ8���!b�S�nY���M�(��q;��9j�V��h��b��Fl�U������3PH^�&�����ΐ��IK�P��r����)�N3#�j�Ӓ)�cqW2)�|b��z5NxK�pV��d�#���HU3����ht"��hb��ľB��~:Om��W��9�\Y].0���)�Qp^�/�%�^�a���|�1���.�\}7��"�a-P	�����t�$-d�č*�\���VW�tI;�q��:��nRkz�fʮ��|Z> �rN��:��iz2�T*��bAX�� Un���X?��V�~k��eZ�� �����&[pP��	Va"��h����Nװ�s*s\F{�hFh�qo�R^���_��Ds�B����-���:����J9ߧ�Gq��G�e�G~������\���a�|e&�3�
R��ȥ֤
N����VP��̩��Ս-m�Uֽ"�9��lNw�=_@
R�U���dpY�
6��K�?TYk[��b��(����{Y>�w8w	鱪|�״��d7�������0n�&T�H�B���
Ş��氥Yc���6��(c��⨁���F�بU�듚Wo嬤ʷ�61K��v}�����J\��ʥ	P�Q�W����.+��.��f��S:!yi)��ޟA��p��	�TA���{�uԄ2�M��m�&�5���|�&S���'���4@u-U��[���e/��L����v��A;Fqo���K3����#�Ы��
����g�J������� �f�F���x��C�A%B
����5���UG��9���@Ke���&FSzb�%XJKٔ$�$��ӠZQ�#"t>���lM��U��H6b/��T������.�w�5@��țn>�]R�$.�����j���X�[*�c.Q�'U���R9Xe�^��+��d�R�K�|���tᘪho��D��w�����PVW���Qʽ�M�`�i.L׈�<+�k����h'�MQ��D�K~�$y�,T/T�ЄUNʸB�r����K��e�{7�&F
B�`s+d1�j#�`�Yi�'���Ѐ�z���+�R�Z��`5��v.�y�v�K��[[Ք��vа0+�>�n8b���l~��x'���ã�t��tMڒ>NY�c%��A_���Kw�`�y:D9!G�
I�V	9�;�{|��t���5���!���‘ѴT���G�Ϋ���R�!�C�B�@	rz��T49��^����~	�%�>��e,+�{9H�,/X�`a�ȃ5�����y��w/����O_̢�m�#���������y��D��%�)T��AN!�6=�Fn����3�98�
+60����u�E\��-��H+@����:K�^�^Z�Gd��1"` ��W�t79Ma��t/�+>�;Pӡ���+�^?��<�r��S&�
inr'��6x(Wˮ>��3��3��*����"��8�L�/A���L��
 [�l�*�q�n��ȞhR���7�3��YZ���x6<�WM_��kF>}Yr�k��������,Nx�.f�|�6�Y�S�a���4ӝI��̇P�2�f&���-隍����~�I-u��
@@֛�@��U���㚇X�`�e�G�,U����^0�����z�����U	i:t��e���G_1q'C�F�R1���B�L)�T�]t����d�O�5#%���5#Fm��Y�kp�ZOAt���N�����a1���n�I!�:��d�U�E��_%�L�����n�	.x�*�	����-�w�T��:��h���"�\��&���t�����"�n̊A���T�O0��[��'����"��]�@�T�HҸ�T��Y���We	��
��
#��̯\Kc�d�I����Lhy�q� ]���NŘ՝Z��g��i?õ�V}�p��/e��D��[��ɍ+tm��a���ƀ��!���υ^��#:aø��3��w)�_H���'�0��(��4yZ*y�؞��f��U,l"�RLb�Fp���n��B.t	D�<7�
�}G
A�V-���V3"U[q�o�YZ me��R��.��1�����4��>_��Y����8� z
nȅ�ϗ��kpW����!م�P�7b¶eb���&wX�eɵ�J�R�?�%[Q`�Ұl~~�	���%o��*�'��Ы|?���1��l��h�oG�_N��dVm�L3#i�0	
 �@��P<�LO�)�e]�<� �E�ir�]t�OZk�ֲ�,im�x�-5#e!G�����(Y6����N����A��*��W5�
U&���%'��4&����tl�D�3�\�l]��d�Y"�`�T�D!.J�Y=jD�ҽ���*��Y!��A�0����-���U:��j)�U�,�I��B�W���л�5b�-m ���᩷Mr%B���{ڶ���R6~֮�-�ԭз#u��|��#ob��'���TF�l��-/7�޲[�E�
/��U���.v�in�Ƹ\c�"�gD^B�H5}���kCK������
U>Vh?*�	P/s�w	����KdWB�F����&������{Z��
�#�a�5��.�F(8:��-e��to�p�X^x9n<��M>�;]��ɫ@�ߦ�a��
�b�.�:.[m�'�5��-w��k�rMG�E��sQ��h���jx%��M��ʵ�
:��I$ŧ�"7z
�,�AW��ˊ�W��^��_R��mo����]/�ѹ�D^��<�Ty�U��c���(ov|����͡;�l�����fF8�7`+��0̋���������@�(�5U�AZ0��Cy,4��An�V�{���F��ц{���E
͐�q;�
�
��?�K�t��ff���?ER�	��]U����ȧ�Y9C�eh�Bj'���������������k
�����m���}���Q��U<�r�=:w�Wf3]���b�KZ@E�Z"�򓲆�V��E�޶��k�bD�ó��g� �a��ɋ@)�$n�7ۧ��#�NC�����ζ�Z*�mg(�Z�8��Ln�����v���"pjE��F���0��t�<]6�I�|��J}O����<��+)����e3y�S�
�
Ө}�8��%Iw ��f�̙B1��/�t7�G�+j�פ2Iu�J��HI��u�t���3���+�V�CZ��E ���RU[<c��{�(_���Տ��"��M�[�)\C�RҡSP�M��P��L,��jT��ԯ'U0c�{�@h�^|��O��!g��2��ٻ�&���ho컻�j�a��ML���j)�ж�Ћ�
�Z��J�[{��nj�e�ϓ�cmq��
,�������/̀�`J�U��a��n|(��-w�otK�
md�4e�	�_�I5h	��coP-�S��_<�uڍe�al�n|(������_�����o�M=�,qe��#�L�8��ՋF�b4��a<9���"�"����뤚�Ғu/,�o]/�tŖ���̓�	�,9�>L4XVs�i�\s*��*'����7�BRZ�+�t��-�=ꪞZe*Sn�FK�g9I��hڅ՚ ��uJ�]]Ғ��0a�LcLp�^����XP-
O��QO��	<`<��YT�;/��UK�,���:���jiG
�ܟ��`{}t7�\I��VK�R�j���)��"==�����M�7��0ً��>�|�<�t����c5�\l`�s�����.n��ű*���#�ݩ�~5�$;��āR������ntw�ou�=�\#�}dT'
�B=}�ɀ#Ӈ5i��&��S6�B9A^��]�\��F<�JF��G��68�ϫA�����Op@�N��c7yH��fUJS2���d�A(���d�m�AO�A9h�?����GiӅd�w\w��H�	�dUEP��m�j��O��B��B-t�rj�J-T����B�Zh����	#�`��ͯ�k*��cMHh��kQ��x����'u}Z/=�G���@�K}�C<��(�ީ�-jO��⍌H��w�LW�~�x	��Bv�ݷ�<�5���Z�[��g6�f� �Asvm�+��������<�����S~?
th�u4@��X��\��b������b�1����E�qdQ�q4�,�q�- m(w�ц��⢍�5 �!�q���Ty��Vǡݥ�].=H}�5����Ն�^YZ�=09t��r�Gv
24��ڵ'9�+��<oR��K.��w)/OG^�7r1/�1�t�.�����ǫy���.��8������~�9�A�7;Z<Zb�F�Cn_�g6 \���T}��}uo2�QS�m��I��s]�C�m��ƾ�<�uMD5�C��,-\`�rJ�w�٫���V��j��t�0
�\���X~
��_
j�ex�u�ȴs��޷@���G���l��ҷ��a:Ru�VS?���;���}��TF<�P��T�s�$ǦH�7@���Ə�֧6�H�P����H�������X���:*M����c��T/4up*r=^���'|�J}��MV���8ߘZ��=�pc�Mbx��T#�d���/0��?�Jm�ݨݻ�>v̀L���%�^ᗶ�x%U��PZ	�����j)n��ޡߓ�E2k�K�1$�ٜ�QF�#�'ZpU6L[>N����#�X��U�i��N11��sJR󫹧�c�[(�.pD��/�S�ӵ�!3��Z�Mpyy	u�%(]�xn��S���0p��C]ZF�\��_v��͑n�>���:\�ѡ��g�V0^OÞ��+�c|/
��?�_<^Ґ��[�NMo��^q5j�p�^R��ٵUG����\@P���MJ�� ��
���Z^���׶�g�}�d�{,���/�8��l��ˢR��qc@ͫ����_��+���%m�XX�7��`	�:��To$�Pp����n�&W/FgH=F�H�cm=������P��J#=���U�g%]G&���d�(޽�_��Dj=4��sܩ{}"�
"9�w�N���3��e�đ���,��(���W>r�PJ�hϖI�;�I�r�X���n�|�f����c|Z�xʖklPXZ̀`�\��?[$f~�H�yk5o������טDN0�34`�SC/
)�A� f�@��������Ж	m�=��s/���
�
��<�w��l�[���C3���B�ra()�Z�
,
_(H�F���f5���^�8=�Ц���{0��X�����Ĉ��0_z���wp�M��-��#NwhW6�
o#�N�<�s�A�[��)��x�
d���P6���!�G���!�<��L�A&���x�02�O��h*B�=��b#>�yY���G,�V�01�yU�Q���4$������Qn����_�P꼂~�O�3Ԛ�ɦ������-���rf�B+
�l��[�,��i�)�v��p��؞t���(�[�@��`
ۀgt�鹠%��{~���O��B��kTK%7��M�M��?�n�KB���.���i�q�⨦*z�̿��%~�BC6>��|Tz����ݸ>�z�̿4��4��f�,�����g�YP7»tose�8��0q< �iqtD���`N�X��
�M�]	q��o��H_��V*��zM���B�%�)��
���6g�ѽ�`ɮ^1\R�7�5~Ң�oP��٢�鷟����wR��˧B.�i��n@��-����&�����	7�0K��e�������۸T*|�3���km�Yc�����,���^@swg�$�q�o��UdWp�q��
��gg�6Hd+3�a�#��S�	L7/b�.�8��#��`ΛCc\�A�b��Ó!?@S1MZl�.$����k�1��7g�sTnj��g��f�����AD�]e� -���(6�e�K���b3�Y��a����e�&�@Q����R�g.�R�SMM�W�@��Ɓ0� jzT��K�]���<y�����]�c��k�aW '?�-p<n��VA䋸�CB>��x)�g��@O�S�/.�$g�����	r��\'n��1T-�������U�\�S����4pA�!�R�Yr.6��ʼng1�'���{
���R�Q� /[lk��.��
�)��M�;����mLDŽ���#�	V>J����,�}��Q���$:�S�+>�<��mġU�}�:/(s�
[��\�s�;>I.")fqC�۾� .*���;G���xq�Y0��?���p`� ��1,=�a���qۍ���/������E�<ИϠ��`���(z@�d8jSkX�x�t!�Ԙ�VO����UKP�j��w%�6�C���g�������_~��e����C��Mr��W��c."WR��.��������]��X|���PX�X	��Cx��U8���7 ?���Gp�8�&�Ѩ.=�B�a~��zR~Z��2��X'Z]'H��Djh���)"�Ј8AN�JdA%p���֎��%��	-�(Mc^b��}�GZ�Y��^��1��IH�zb�Y�%���"�'A����&z�*VOMR�����o��3\�&ઍ��m�	�������g�5Qm~�ga+�O����ڊ�~��Ԫ���`�K�z�V�c.b_.m�Z�������G���'/ϵ�v�.�ACC�G��S������-�\L�@O��D9w�UN�L-?O~��t��0�j䶀!���ͽ��2]?y�����,�K�!�����f�eސ�ݯ=i��#�����|�9��E�=ԭ���G7]/�-b���s�L�Tm��YLf���۪��K�KS�r���U�S�ox|
e5s�9t[�8"\+^僷P�a�7E#$�*��6��~u^j��H����1��F�B��
���Ȧk�:��LL�Y��:;�����P�k��*�ބJ9�7�K^+b�o�4�~����퍸Iv�?�g;3PӬ��B�;u9Y9u���c��4��&�Fv2mU�oyIs�8j�Iڕ0/Q]#��m��O��%n4�|��ּ�ܬ�����<-X�����b��!��r�\��	��"_�n�9hOI��i�ũd�	�`�O�[u��A}�L��y�bq��=�G'c��j^.�a�k�;��6�mg��ț���6�
��Y��$�y�x�C,%�iB���4��ԡ�K�n��W�"\:�#�Ԙ��J�+sY��%�ȷ�%�{�߄��F��!ݛ����)=�ɞ���!��R�H��Vj�q��gF�Jy��6�<ڶ�V���g�twD*�jzO�L:E����9�D�}�ZکP��=����,w4h��n>o��Cݒ/��X���8T������s�W'�U9����{�A��t<�(�����b��C�]3�3n���&w�r��l�v	yzlg�P����\/�فN�=��;�];=��i��?��|���n�h�֏�-��\PUH��,��e���x1���|i�H��r�u0"�ה�b�	nr��}&]�Z��
�haB\�'	��(��$b��V;��1����h�&��Wk�N�M��Y����������<J�������u�J%��8'�;��SS�G[as$�����#��Uȕ�
�??P�n����
����;���x��3��L�W�����x��TfzҌ�B�;�L�#pơ��K�DG�Z��������4���E*3�p��z�9d��W
����1���օ
X��G�_p4(o�›��4�*u��T5��xj����'�5,�%�3�`�9\�Ƴ.�¿�eElq��!g�L�̊��o��M|zlz2v>�j��,^r����x�`�����8�ҋ�x���N>��N'ۭ|䱟�k�'K��6Mő��bϨ�2��9�#|���9na)>�:�y+�E���~!O�o_���2w%~�$@��Z��V+/
U�yy~qb�����>�Gē��ӏJ��Q�"��/�X��*?]<?�O�#b�,�x�kK�'�d�g�0�v�Ns!�0z<+ȫ�1̥G�z��9P����U&��%><���ݟ*��i�����1B:�҉r���#7���ǿ�M����/$/��F��i�K��h��9Ƀ"�������f�K����4�JxN�k�4t_�A�m��
+�䭣�4+�=���d?@�����Z�"��k��D��4=��A!��(�;=�,4��*x�.G]n�*�%�j,=61lˀ��)���3��@^EE@`t���V�CL'���y�;Ŏ��MP��
�m���&��H��(ٔ$/G5��܂�rA�|�dܹ��:��K�Z��S��`�ز\�p�͵��\�3��;+K���D�k�;��k���B�|t�����Qi�M���e�?�b����wiI��M1BTS�^>z�H56G��$�����I�
�A?ř��&׵�o�'��>3	�ۙ��I�9sQn�̙'s�7+��r���Υ���|#�������4ʴe�\h�A��k�̱d�n�۹,g�(�m��9�j�@�d
s(�e:���&A̤�]�`B5d4�-����ԼB}�m�	�H��k�5���z�K7��*�̃L3׊�,P��k�]�`'����,ͬY15�u�xj7*�T5�����uJ�iX8�k�#f��6��
�q�'T�vtl�U�D1ӆ�vS�"��{U�-@����Z'�q�P�u�XD����mnR3��M�r���mY�E����~
��j7"|PC��h3�/�
�=HV�)yr��v'6ҨXv��r��Տ��]��������j�ܚ�8�]�qr�;NL�wL��sn�g9�_d�q������;,a0�)d��A~��S�W8:��[q��`�Ф9��V^kb[��I2׶2g�b�"���w+���n�K��Ek(7�u��	�J�*��qWH�aa~��^�Fk��w�5\�:�g��]} ���L�Ł����)`�F�'"�0 ��M.Qځ'���)�$���x�l~B����X�����}�s��(�3��D�,SȦ�-�I/@&��5��fԹĈ7l�3.YC�dU�K�6�M�L�O���
�	9%�����c���^�vY�r%rN���3�~�J`->CC�O2�4d��0���`2P�Q�h�
:DZ�����,��v����NIΊ��9@�%q/�?6�1�;F��Nl`��}��N"�ok���~梓H���S`�;��9��]��M;a6���flj���)8z�Y%]	󐟞O�[T����ʾM��]g��t=
�����φ��t�.�w�_�DF���v®���R��,�zl�/�K���6`c��^��7�&¾��rȟ�~��O�ɫ�/��_YdE��	�����"�5,Ln��������^�_
�O>/~mn�v�=�Co->ޖ.�b� �����
^��7E�F>��s�8S��᠀�Qx���3��h��:��?62�5�Ǖ�Q��Ң�*��qh��^��(]�2L��1��Q�M�rf���5��~٥�����9��m��:Fv��;��u�����8^}+�9���RCW����)^C�ɧ�[Y��F��ɥh
�Ho�qD�������:gp����tP;�l��>0Ǭ�4e�x9��r{)(��F����(�9:m�X��H�8��+�cn����t�]�&�ۈ��TX[���/�'W��;��P���w�O��3�{�L�g7}���|�>�������kob�)�P*&/��R��Q��CaH����xy����`�~��_:F���S�}�֡�>_�Ͻ�|��
�S\�3xz�Xk:/�5ĕ��#[!:tSO��X����7wŝ���!k����nkI?��1�KA��+�ѕ_L�sg�(x|���!l.�����=���=�yT$�|�HL���v��8��B��Ԍ}?�W_���.�m��
�[�7��㘃�A�l��R(�Aܛ���mAjC8�4F�W�d�~w8�;�Z������e�,6��_��;��:���R n�.ˆ�'����R~����N1q&�.x�M6	U�!˻�a��
E��l����/S߅�G)�t1q�0�A�a�/Lcf=#�(~/'�Z�uZ곘�w��o����*�����~��k�O?���~l�Zgӏ�\�T�x�ڋC���e�%;=���z��s�]k��#F�����}x����ܮy�s�����(7!&��eJb����!�izÍt��v�Х�G��׀��1�C�K�N�Nf�r���iB�/�%�ԶA"A�R�B���5#��X(�zތW���<����}�*�0T�G'@{v�����_���W���K�}CU�JPv�ۺ�g�x�����֛�s��xY#��	�i�J�o_�8���0.��;��.,�-���XE���3x�W�v�c?}��uNڇ#YIo�h��5R=�����ؘ��q�fPH�Y���#��<��'����G��	Y���O�.�1��[��!�.Il���0����F�G���G?��������}|2m�7����Yڇ���>��Po��Ћ$^�[љF#!om���ɠ3*��)�bT��j���f��p�q�O���������+Az�%�4��!�8:���`�;ZΣ7�B�]�W\�_}�~8��V
���jOw9�dj�0�l�\e�(`|��H�]c���Ñ�>��H��Q��s��Nu�풟Ʀ���|���!���::t��akk�CXѻ�|� �S�7^%L�{��D����Ql��8�#]�D��k}`��x�S�i��&�UB�˙T�j��S�Z��SV	��cH
*�W@��az%r��􎲡(�������F>�;�xD1s�<�L�Ӏ���I�*OhPz4?=xbǔm�`xӄ�n�3�ױ�E>=���-�N�&�8��&R�<���E㷧�͊	i�й4�o�?��jH��v�!�L	��mn���W�"%�ӏ �n�k�|�4S	Ӗ�\9
"��*�z(I��>Ak=�����Jx�JǯL9P�S�L���
�gR�VK�Jƭ
��O3E��p��&��@<�
:a/Z��
{�|��`�9p�����b%m���
�6H�c��|'�b*0�Q=���^�P���&�@�6+�Jv⏼�o��7��0�|�0��t,�$!����Jv/[[�_�}���dZ�2-P�ᖣ��yc��x�
6�n�i:1��~�L�A�����1x��S��?����E�g(ei�hq$<���CP<��y�j1DV�h#Zk�J{1�.�q?�����6�� �J�A�"�o�b���P1�$�j�d���h\�L�L��
�F�RP�Eہ���?�
uP�@u?��t.h��;�]M��^��
-e�[��_p2�����b��������NHK���u6��t{8�f��M�0������A�����KZ��D��n���j���y$g�0�Ǵ=#t��o��N�]�fy[|�;`���;��A�M���v�-xYw'^������D��*7x����7��ʺ�Bwp
ȃG�[p������Ŕ����/�}���I�f��T�Z��ly+]‹�?8�e�ms.�����k�:��f�y�LN/b�G@\��Du�bft��;�poyDNC$�\�nx{���Q�Eϊ(_0�Ƀ=��D��B�P���ޕ!0���N�����5J���_?�A�����_*E�U�^�䳣U7
M�����a����`m��J^���'`^�#��Rw�4��tZ���4\J�� ��P�j�g�>�����U���@�ʅ�0���oǫ;�WU�����OF���Y*S.n�k��GUz�i�P�I1z����<G�����;N���qW�
e9<�e�2VH��~Oq{h���3�']"�!�\�[��>���J�2h��o
�g�e�i�f��Àoi�
�[��&U�R�y�L�z�Jq��$����B�Ϧ�y��+�|6����x��O^ALx�Bt귢$}����C;1ǵ^����;`��_�
DU�z����/Z"�+�ɬ�@	�!�l�5��s���������x/�0�;Wc�����@Aϳ`�Bl��V�~��������r�o�Lf����e����Z�[���Ǔa<���W��dǩR_��d�zV����a�S�?��B�ru�O���Y�Ϩ�C�)���e_u�������Wұ�+0P�nM�"M<.TF=*��OEK�: <�t���i���a���-�-d�;�:��σ1�&�N�L�R���*�����Ƥ���,�0�
R#
oѤ��q�s�ݩ�f��?���gg(7�J�("���5��% C3���8���_x$�F/H���H�)Y����#w�q=�㦀��˿kta�d������/��kl{�+��_ʫ�1\�ǻ[�\�s�fiH��E����5���ܮpn�.T�A��;�ڌ7I��;gr���*r~�F�Ij:�t��Zcݙ���m�*(�k=�_G�]�p!oi�~���7���A3��8�О��3��*��r�#�ХOPA�VA�j��^���TU4/��?���7gѻ���*C�قY�W��h4�p<s�ĥ�p�7A�:����A~�#U�ea�$x�/���|)�g��3
��5NMk��MΖk &H��U֪���|z��A�a[<�^�֯AX��Q
��%��a�f����_.��ǟ�f̧?�WBn7��T�?�̂���$�ȫFp���	5
�L����KU��Xn�7]Ϋ�n��O�!3�4^�&�x�^t�8�_�g7������$��=�����ŠI��W����:��n l(�뒻D��%B�O.���jiq�{<�t{�^�5�͚�7�x��K�Е^/N��0P8i�|=B<�ݝ��%>pg���:%��,�˫�ۗ�hߑ�;_z	��㳃Q>c�k^m�l�b�ռJ�'�؅���D|��	R|/�a��yh�vW���1$��0+��9�*�gOX�0�[V�D�~:%�b)�t��Cg�l�^�_�;�V7*�%b�cڍ]|�Tw�ݥ��v��1�V��\g�d�Ɗ\�4��y���.�0q�ec�������\�6�.��c*��ճ���_\�ϭ�ɫq�\�Q�ރ�=�/����n�
(ӡn -h���_��IZ5 �r6������f��M$N�ٲUt��)3c.���Q��:�Zლk&�&W�_1s�Q�3�>z^��a��C�$���ȯ,g�pU̥���3]ـZ�M���oyB֣����H�жG��� ��N��5�\���W!�1~���\>t�Қ��έ�]`5Nl���/斚�nJ��3�-|ޔ�Կ�����Y%k��O�6�����*�jw	Yz�n^H3ɼ���Ϩ�K�Sf��4� �W������$�:àF�0Xz�F�������!C��9-P���!�v����f�hr���P���f06�
f�HO��U���8���E,4��qP���ۍ�R�_kn�5j�m�Fe�z��(8M���S7���L�N`�NC�2��[��gcQsas[�7���n�Q���f�u��������?٫{�:�����@\�
��:08�*ݑ�f�;�c��I��Ħ�i�$9��m�b]�yhF���I�z�^
1��T(.����ʹ&��ɮ3��KF�M1e�l����������Jx�.Nj�hȨ��U8͌0��5jP�aZ9���Q.Ȅ8�b�'�^����@$��)5�r���-~*�o����j�ߗYE/��SyU
5͋�
��hj�" ��P*(`���hiei��g�ڤ��s��`68�u�JJS,t��g�s.�������w`�}��Z{�מ;�
F�V���ZbFP��h��v|�yQ&��̤^��L��*ws���n� G�o����:;-�`:��,�w��'V��c
Mv�ij���¯����ePs�;��+c�иf.���.�t�sF/�;}����>T�-
A��J^͋�x���@��ۑ�1?-us!����Zv�A)A�,���t�	�B?���/����׵*��^U�@�
��v��.�'����\2���T��.O[�y���N���%����Uꕖ�|�
�Zt<�+�*H��:^�$����+�'��8>e�>�'=�O�5ޗ?�X�e�ȵy;����s�|/K��d>�$���V�K�]Q���tA
�7��BUE5�s��܍\n�O�j��J%:��k0����
�A�ݚ��Q�����Z�\M�kz�T榃7j+�qHmk�J{��kz-�j+Ou?)���,絷Q�k�%�z��ն�x^�q�(dбK�X�]�r�x����ݤ�Q�ⲑOd��睶u�wB�,.���詡x��\�z���*��4.Z���
�<{a���y�	W�6M	r�{a����o�Ҽ��_�rN��X�<�����Q2�����{���|ڈ�=�n�7���>��;Fi��%��:n������F�_I}�u�N#��uS�: _�qvNM���s}{H�G�ͷ�̞%}g:�_/��Ʊis_�:�&�ܴ�׽�p��$�2���^��P����s܀���1��1�;p��ݝI�3�j�+�h/�u�Wq�[�4������O?�����Ne�&���J�Q)����-���<ݔJynMwU��"Lo9�H���0�G�
��9��
�2�+�ʼ�쇽�+E��+EZ��|g.��t��{�ܾB\��W��,+w)8�J��[ϭ����F0ކcA�[�7�p�{�o��a�Wߒlr^N�y�\^H?>&�|�:f�K��7-�B�.�R�˵`7G~�yIx�_�e�eл]��y��媟�]�*��G<���� �%hO�4�.;]��i222 �2+ɬ$�<��ɬ"���j2�K�0* \+]�tnH=����q�P�)a�����R����8B����T��
���&�^>���ҭ~�^��8��Q�WϓKj��!Oģ�'�܇~�L$X2̵����]~b�e�m4D
�4?5y���\Xl���<���O�g��y!z����@ƛ�{%8Ap�QΛ���d�&�5�-�lI��>dz��M��^d���V;oTy?F�M�K0�1C�s%�
y�ߵ�hW+�w��[)���Ӷ2Ժ�4���(nԲX�����/�]b*(���,�X���`8Lo��~�
*e���2R�q�����������D�/d�:�6��J�%R�+�Y|�v�V��i�=ߚe>Db�-�0��ӊ��꺿����wO��b��:���G�C�lT���,��r\|�&�ye;�-?M���9D"?�w��:�}�;T�~.���V)#�F���8�u�����M��6$�#��Q��u���G���<�ݦ$�����%Q���M����Ve�S���P��X\��ۭ|r���<DE�]���U/tX�(�1=�����4t8�""}�ƥ�������z��{�y.?��kW%~��H�<�Ue?OT}�w-n�[c\,�q���8��R��Ց�X/^��n�����[kx�
F�TdZ(�Nd
f5�+u�(�إ�+���;
~'=��f<�L3
�n�LE'��~���x{h�8�ԔQ6׻����ؿ]4�OBD>�(����Ј+��q�%�������t��J��̾���|�K���k|�276���J֋�b��CZ��5�
{lk�ƣ#�;����>������~�`�t��+�c��ZֺxRU�$_{uDž�a��~x�<pR����r�s{_=x��^]I=8���!k��ɋڭ�C��N?@�չu�V,��:��]�'��t޶>�;�Pՠ���ǝ��B�}C11�V?�I�x4�("��VG���zT��ϩ��7��ΎyUA��j@�?�*�u�R��0��ݖ����h�lY\y���8Dګ(�JC*(o11��,v���
i��f���P�
CrDA�2�����X��/I>�1��o���ld�E�ֽ$�1i�������Ϸ�4��z�9����7JA�)�@
Z���HA{H����Z +����1���wu��~�*�QUk{��mHt��Q.a��%�������B�}�y�}U��m�ά��E���ì�B0˗�U�M<	پ>6�i)Nq���2���R���V���X�l��f�����҈?-��M_�R����l�P���WN��W����a6({���C��iU6�U��*�#��ٌT�b3Zy�ͱ�26�)�؜��g�^e&�IJ&��J
��=lf+qlڔ�l�V��9W�SCa34l���1-�t�W�[���W������]��b�r	'�o~�?��*�~ï��(������"^w,t��e��$����c �5���"ʣ����B
e�d(��]m%�_1��L��/�:�_Q�(���{�0~U�į?0����Dt��J��_�3��Z���+v	�Zm�Ȣ��b�A��_�P9�@C��}�D�ί-�����K��E��S�j��C�������+9��ש������(��u^���A��W~��.:ʑ������ͯ8X1��8�^���D�V��x=��]�{j��wx��)#����|>j�-�}�f�j��n�lV�6�A�l3�oP��f�!v��N�\��qü��C�p�Ԙ|��Gh6�U��A��j�:�=Z�i�ڴr��x�6� �q�ͯyl��>Q��F�䞭�Vm��4��5�}�f�O�&4�}�f�j3"�=_�)f���A�
5�g��;��q�L%=�Xo�\�t�&�+n�?�Ha {��x��.��97�ܟe�Y�E����fиv?�k\��q��2�-v�8E�U�����B���i��E(+��Q�v������׵��9\����M�.�O�n.S|��ېe󁉮v�U�pk|���4���ە>QPj�yq�ȴ^�B�R4���ˋ;0�a[��h9|H�����V�+8�g���8o�q?���qw�	�L�nzņa/e�<>��"*�Ÿ����[�]{O�;N��Y���ճn.�rb�8�uJ�T�Ɂ���)�=ꃇ���ĞG�)�\�~�j��]�O�Q1W�f͹�>�f��j�I��E���;~��ek*�9<�74{Iu����A_���K��c���}l��7��y�-U)���5�CW#@�=�%��ן~�B���s�;(���^	Z�ԙ��fھYǕ����.W�6�%�|]��T�ڗ�\\2�~�/����/��ݨ�p�0�oV.�R��|��}���f��B�7�͌�^q&�-y�;N�{�v��J��z!��-�\�g�u��sX3��hYRd�T��E;\e_O�ϲU!���8S�^���{�f.���CV3K8p@iqQ0%�Ǽ��;Z�sI����RX�ıɗ=�_j�	Ģ�g0�캻`�ak�$�����~-�w��>���w���E+�ڨ��%H�o�k�O@�5h�y�:��()
%��h��kF�Aza�dD*ڥ�bTO�J��O&߼��^u�:�%%�3:ZnYZhUsV���&aQ��F�GG�rb�zn'8�K�9����ZV\�	܄����|+��Bta�Q5��
;ߴVįq@�4��n��X��%�^���A&�� {G󖀀�W��eؔ�ȸo}�%HY�8F��򡅘��L2�#��E��vkz�q��쮬��=�1��6T�rz慗�_P�}�͖�P�,k��hVjP~���h�h�����Q\�F
�L���(��ː��XJ�F�oP�On�%-B��W#��kLU�K4�[�c��l!D�'�J5�_%��]�C��?C��31�A��K�`�ӏ+� �� �˻8Qw1}P�آ�� �U�!�H� b���k�U����M�?�鄔���v�eڄ(�ߔb�]��
({��R�f��2�r[����.����:IvX��S#�@�%�� �#,�[n0�Ի~Қ�D5H΋T��\��K�m�
.�T KJ�_�J����e�q�&h.�G��6>��"����]R���c���u<}����[m�T�&��&�O#z��\JY1�pAH���C����ӂu�,��v�܆{F�V�c��~O A{K���
��a�p��x6z+C�贠2���j��h�=c_e+�o���?�n��C8?.ԣU�Q^��'J��Z1�v�QÆ�b5����57�Nּ
��z��������
��U�
�?>��G����!�s��z/h�z�IS��G����M�
JAMJH7�8� 
LÇ1��<��>1�|�E�V��&Z�1nɧ���F��E�.�R�k��������v^�M�s���W���n�h�؅Z�ͥ��m�6�-^��')y���N}���#�k	6�:�+2̫�Nio���f�
Cx�+ot������.u6�zk]�%%�q*�C��z�E/�o%���_���Z�}�~��s���C���������P�<�������]��-V�=q��Pp���+8���k�ѱ��dGe�����ޛ�Ǿ��y�'�
�������׎V�|s��^@4�ޖ�(��%�z����g�w�#g��#s��Ƥ��.����K�խ����v[ݍ�%�D�H�e�Hkl�=����Ia{��n����%�-5pt��ǕN������l�1B�J�����{�6ޡ�W���wS����)���R���n��(��f�#��x+0)��⌚/��e�ݼ�u�eu��6m�+;
ὴ�K�h�v����ے�e�{q�J��]��b	���j�-��:��Y�O�t�x#�.xʰ��Y����yX���N�O���wK�C��uP�-�����[�"���w��"?����u�!󰷎}D�G��0���vP���L���'����.0Ǚo�ݴ�
l��QR��m޼�:�MY�^Rao��(A�,a1T����UMl2}�
}�޷w<UY�6�-��2V߆�E��HކK��1��8��c.$��:ra(��
� X�P����sl��q�7�qrp�\�vw�U�G�z�!�5�p���w�K����
��Y�y+�^}�,�Y�;�_Ǻ'��k=	��[�W�g�����۾P���M�X[��\�xqd�%ë�����j@��9H��)�|������s+,|�Z�Zd ���г����s3�	Fi.�-�Y���?o���m���f��y�U�m66��ƛa��Ͱ\�U^�u�-C�l����.n6���G��m��-�o��8an�K}-��aP���Nvs�V�O��`��e�د�=��cx�#����K�P\���`���{�	�����pǚ��t{�ߦڧ�V�K���0pd��v�c��R��ZO���y|q�3��-���&��8�-�zp����v�WqQ>��W����TnB)�-������[��1�-�[A+��~��[l�jl���b�[l�O찕F��A�Ö3����)��a|J�pW�ƻkmTAP)����f�3a77��[5�=���`|�F�*�%|q�'
M�ʛ_���7]�w��bk�2�B��j�����++Za�m�uz�o;�N�V�jm�e��¡o�e�Ӷ��B�N�K���&Fr�d�K�ս�S�����`8�҂�^ڰs��V/R�E�"�E}
o�0?��6Nr�w��.�����[d=J]����c	<\Uѝ��g�T}�������Ti�
����4��
l�GY�������Y��j_~�8ʳ��eQ3�W]s����iZ���������fc�2Jiͻ_�%y��q�	�[��9V�gN��Xn����+�Z�K}u�ȷ"��6jԤ���R�9_;�o
�r-�f��^T:�c�ʊ�(�[<d	^��=0.SR��\�~͵���?�mm���u1�0�f.'�����+:�0m�T�O0m�;L�^�1�v�(ۭQWq�Թ:\+؊��w��E)��n)ۍwp��u1���ɕK��%�ʓ���=`s-^<�E%��U�ժ۹F�)������
Vq� �5�(!XIp����V����淧]��C��8��"*I�ݓ��Q6�a�(v��ٓ���,�6[V�󉏣N��3��8(��7W�лR�ݎ�*"x#m�h�[�g'a�~���~���Q��:&�+6|h%K�����S�}@]�?���I'�[�ꊽ�2��'<����#j/��z��Z��_����O�'���0�,-�=G��ۤ�@d����c�VJf��1��u,�g���/�cOT�Q^_�L�E�nF�v�KG�	�FB˭��3�KX��� eF�Q^�8D�iA����`>���9}���$'�B���*HtŦ�
�`�Y��D_
\��{���ԙ�������6Q��Z��R��xsQn���w�^�8�S�v@g�8�Ƭ��szd��n��%V_߼A.�B���)g2��>)��3k"� �vD[3��d.|�#Ze�h�!��:ٮ���-�6��/�Owǝc��޺j���WL
���*�ˑn�opx,�|~����vlh3b���q��ȗ�!۞�A�*�J��s��anWf7u4���bS��KES{OR��6���I@!W7]�1�
t�.X`�s)�g	��
��c�p��
�iS�-�b����}���8���Փ�ys3�e���������
���y�#�x=��4���3��Q�$/�#;��Fǥ7��n�i�E����|�8H�e�=&[;G>>(1sa
f��e�w��d�G:���B/��Jq�E�n����h *���Eᆽ蟨�u�a�V�)�&�0�0/GT��k�[܂�@ӭoňz�z?��_u~q�7)�wwD���]��ԍP_/2+;/&���.���+��D���x��p��/�h�����9*�WK���s�[��9͂��,�s���h�9���2�z�7��H�:&�G�#�{v������18:�L�f�cG���2��v��H3Ŝg"���?����'?��'��������lw8v�)n6s�+5;_�3�~����ޱ#��]l^�mJ��"�U'\m�����6a�N�ы_���;P:�q���L����*�br��^uwy,q8��l5W0b��s�7�_8�)�%TV��C*a��[+��7M�.fX�Υ��#�nt|����2��I@i�^��ҒPa�Y5�[�+|�P��黓|$�q �-X1؆ �O��������Q�S�]Q���񎪀R�"i��5*(s�
��8k�[���i�*�͗|�G#eYZ�an�w%Z��#A�;p��]�?�fU�>��Gǟ�E|���˚�N�"c��'U}mKN��N�]����(M	���[
�ր� �j��7V�S�<�6���`+t������[Y������۠�ωW��m��T�������@{�"�%KwSf<E�>W�Qێ�2��-�)���Tmۋ�|�!����T���*�aW���+楗�"0�\���%}ߑ���{�,��NT�7C�j
�
f��L�����[)-ם�Jק�<���6Xs�W���k�ps^���m8՜TQ��y��w�3:^��iלD���c�J-^9<	��ثl���I�9q<Qv��h�6����a?��5r��`$J�[�v�C��t4
��S�Go��0��r�x�p����E�`5���:;7-����
V�̅�H5�������3��>j���ZF<�g�N��m��7�����f)��I\�z;��/�mY8�t��>$�ZUl�0�,MWjg�kݸ�M��v��:&�
��nѫ��U"~�!�
�+��m�x���G��=���L�K��=&�|�*�f^����Ι��w�bŤSM��˿��E�wpżrd���=s1#�{^S�V �V&4�Tp����ynA�r�;I���R�xg���+��l��#T�:���
^�<�j\���8V|��#+S��Xw{e�\}�g���
}�֠��f̥ds���4{ԉ��7�B���i�I6E�^?;beqXe�ű�1�q���z���k��{�����Pl8G4���*�t�9cR��q�,?����%-�9�ƪ���`_��x��9n�m������=�d��m(��������M�燻�;�D��]�<�Ԃ�}���+�ն]��ϥB�Ot˫hZ��1���ힼ�{�N0��(�I��Ӕ���#�9��)X�4�<4M"M�դ��]�ʚ��Z�q��d^����
��'զ6˃`$5�Yq��f݃�֓`Z�x��	d��B�oV&��Y3��͚�MS�"g�E��9/���j��X�����˾��7���,��S��a?[p�l�u��ܦ��o*��V��n?�)W[#l�6<�~q�=	�v��Q#�C~�F;v�n\|{(SjE1�~n|9�jն�`��;��ݕ}8�*Ug�~�@'1�T�5��0������N���:O5蜽y��3����Kq�Ҋ���/�5d��J�}Mڼ$^�F-kTI���ڮ��V)��oᚃ�����Ic6S�M�c��/pU��zu�|5E]UE
g1Q��A�ϲ([gcMR��T�HSY�����~�n9g�w�T����0�{tL|8�rtL�$oVh��P[�I��"�F��߶��T�Z��3�fc��
s%�����)˞gR�'��R�R��X!n���^�1=�x�F��,�U��M�e;g9/�8���v�E�U��T�*
ܘ��"�]
N���d��N���k��88��}�~�n�O�n��O�@8��p�����_<ҭH�j<vB�Ӯ���G1�y�'.�h��]��ܳ55��'ҝD��7c�T5�s��V����tq�F'�*<;yt��1_P_����s'�
�lS�K��m�s�����+_d蚨�cw����ך�ǚcQ��V���(T���~�f�-vm|z���[�R[�]��ݦ���x�f��˷w��Nz�5�	��>�w�	[#�sd����e�i�-W�O%�[S#��n*lT~E|�^�m��d{F���kzI����FM�`�����x��(1Oj�$��o']�L '�������}A���	�"x�`�Q�J��B�B0� �`2�l��	^&x���	�JQ%�
�n'��#�&������+AK��j!N|D���
����IpA:�L�e��I�1�/�	q#�mw��&XF��F�|I�=�yo�g��NAG�D�Mp�"��	^&�H���C���$o#��M�N�O����/�|��p����J��A�O,%���D�����UL��
�D*�eVѲ��t��U��j�*�Vk�d���"QIpZ������i�蜬)ɹ�BL�b��9"��z�$�ABt�^e>��#o"V��DO1���G��"�Ӌ#E��D(��E�c�.�|��)�Pz�d��2r��$'ÌI��%f�}��=8##k
����6�F�&A�_��T4fs,�=J�Пя�C����q��(�O0�����ӟ�`۞�/�0����"�LA�ډS�1�S��7p6��R8���7��ɥ�D���X&��MőC��b*}e�P>�c���i�H���}��,�oL��ㇿ$�����Z�J�����B�fq�p˦�g5�^��T��N'�\���i��;�v9���l�'�(�p|�_�,�S�ԓi/��O2�l�Eo�͠�ne�A
�8q2�3�^Ne2���)�;9�KN����S�Mc:�<��vg~gR�G&sk*�j��)�-��3�T��sJu�n�h�t���\]���~�P<c�|�q���b��\�;�.�N:t�t��GAR��Sݢ��s�Nָx-.�����z���/��,���嬾�� �I1�~��9��L�C��G}%G/�51���'p��b6c�[�(�9���������,J-Y�X-�Y�;j��,���[[��
b�˜%d��}����t��K��ñ&9�i�_���)%1���xk�!x���Н��TnsPғ��U�����oȟ��>TD�M�o[-��
�s��&��T�ǘ{��������-N6}�qH�N�l���:j��Z��u�
Ǭ|{�82�-d�Ǜ�[1t)�%�9���]�o���'G�U~fm�|�L\��Of;2K?���l2o�=��L�Īj8dv$�爕�O�>�R�,�!2�#�
2�	v=�YYJf��n����8���Z!D�џ�8W[�����ܞô7�Ћ��D|C�S��t��UC#�i��Y�{��7�Ss���wt��2�#�o }�;��O�ǵ��7����O�}o���P�5`A��j�r)V�.�P<#	��u�Fi��nCf��>�v�,�v���Dp�0��zCM;�5����"ЛF�YO��y��56*�:�:^:>:z�z�j:s�i���i�� �Dn1r�>Qq���|C{��\�]<��L� t۱���@M����ȴ�����q������Pu���sY8���a��ǂ�9􈨨�II��p"є���S��ON���5�>j�-�1��6�2�>՞k�o�a����I�<L̙��<9Ǟ���I��WJ�#^ĉ��ps�#,ˆ�D�=')�����ocS�9��]|rRf��1֮�Eee�E�]3m�p��warqus���jԸ�w�ff��7�h��ƛZ�iۮ�ͷt�t��ٷK�n�o�ͯG�^����з_�;4��!��!�aÆ���+2j���cb���ŏ�����I�7q�䔩�i��2�gfe��ɵ�gΚ=��Λ�'��?����;��v��o�0�+�篶��?�u��/4��\���f����y��ZL5�ԒS͟�u��H������_K�3~ݮ�d�����Ko
�um�Tz��`aAaѢ/q,-Y����x��G}��O<�j�SO?����֮{��_z����|�_^���6oy��yw��e;v�����{����:�ё�?����˯�>~��oN���;����~��l�Ͽ�;�녋U�~�����?n�诫!�O��N���7��ݩ��D�o�w7�Q�;.���ޗ�4�/7��0�����r���8��.����ǧe&e͊�%��H�"����Q�ӓ���3S�r��C�&21�<Ŗ639:+۞�v�����&͚/bI���x�1���'~���i��P_q�&�}����p�qs��ϟ�6�l=��K����I͍�I�7�^z���=�/�!<��^���#?Q��|J�uQ����-��)���"�0�����{�������T���)��dRSS��<ggg��ή?fF`����Ȁ�{%e�]×�iӓ���z���7PG92j��q�HrQǸR�>ٰD[b�%,''+ǒ�i�L�gNIMF8�!����$�-˒���iI��<�nK��?6/pK�̳$fZ��S���O����''91ɒ��5�|spѹ#���D��u�Bi|��>��آO3�C`�OD�d��2fIad�.�F�,3��9s�2�6䞛l�����i�̵%G�2�iL��Ɲx^�a�#9'�?xb�͛��Z��NC��=�\�Μ�#5�D
�K&F�w!�de�r�2,���I�9W�W��S�m��i6˔��dKV�%[����cxj�7��C�dN��6r�'lv6t56U
(���)eIR%v�Er�
o��ɓ�2#-3y��KFn�q�JM�%�f'NI�$�؈�n��9�'�e�NΜ�MXG�jd)�Ǵ����ə6gB��JΙ���Ȍ�|�P=gسl�?TjGU҃�׵�3�Ǧsĝb"��5D��;+͖
yɵ%���/9C�1���zx�ӥ�gc\��&%s��-�\�;vX�W�ۭs7K��=$�V��ѭc7�-##k"E��\�a>�#g9S���\K��T3��X��g���z�t&�HiB��y�D�]`�	ӓ�g�������Y�,��a��?�*�L����11�1�3'+Һ�ҢY�Z��e�!'�=͝G�:g"��hXs'�M��HN����Ii�������N�lL�'�ڥaB<�q���k���Z˽���'�5ç�����}��\@m�=u��guҰ����xr\;�o���=����:��v_lp�lr�÷	�v�SF�v?jp�Nn;��ͧ�
��99��w3�u����q��0�?�n8���XŲ1צ�ո���7���%\�ߖ�k�r��gf���xBg\;���N�k�_��k����?�U�p�I����2��]�PcWIv����]�KB�;,�}����?�֩�ɸ$���B��+�Z�xq�[L2���D[j��A_�^i�j�LL6aYQd���¿(B�C'�]:�!G�i/�%���4۰��j�3���~��6l��Q��M����U����4���z1��qP�BH5q��j�B�QYI���a��L���\GC������Q�[��9��Y�iI�!��9b
≁�b�F�xQ���5���h\p�D}�$5T��
!\\�^,w�H�p�z�II9���!� �Ȭ�$���9P	J���N=�;$+37+#9Ė����Qlo��!'4-��!�$s�!Y��Z�w����35�ծt��\�����p����O��v[8���%:+א�����y��K��9Z�<6&l���C�qcHa��YCjV�3��r�?���>H@'�p�������uM��Ԑ�>�!��2I�]F$'f�8�����n?�0��P�*mJbF���3�529qf�U�ij.�t�����L��6{Jr6�
HT��vv
�
M�l�:59'���2H|O��.u��9.岪�n��Kx&����v_]��3�b��2C����:�<Xan�.�B�vcˈ�$�;I&^f$ۮb��<'�w�\C��ε�{��\u�_�g	k��BLKN
Ϥ�7qҵ�7C�x�@��T�é�YaM٭���O�� ��:U����x�A�H�{pH�w OG�E�1�	a���5	�Ȫ��T��n1��٢�kdH�����/uC�q�"��g�H�z2��3���*��V�8�W�XT�U��,g�$^P������)*���C\;�M���_v��;�d�ɵ%O� Pp.�,�&�jXċ�Uy!9�����$����*[j
D�\o�&"��iX�=7
���PoD7⸆EVΰd��&�!I��f'�$;y�x����nX��Q]�F��9�R3�,I�T�B�(�~��?�X�;Mu�B{|����1���k����������y�Ŷ����o�׍�F�\5sX[�+��c�[a<c���F��Xskbp�QӬ���a=�
���f�O�־C��h-��>F3��kigh�Ӆ��q���
W�����\��h�Z<��SOi�k4|�j齠�o��Ps�Lso��B��s�)��}C��C��GjO�cVq=��}||TwK�Ͽ��COÓΪ{Ó��Y�����h���N�����Zj��]8gaG��㪹f�j.x���
�|6_$�e�{��@����U37]��`��L�>{�ٶ�̳ʳ��~M
��c����c��n����_��$D��jH��
=p�*��GPJ�.��o�'XK��`9A!�\�l��T�$�{	&�#KMI0� ��J0���/A{�Ko7�������4�Q��	�G��`-A#��6i}?L����`.�� �`"A$� ��-	��WV�� 8Jp�`A)��^$x��q������� DЃ�5���/)^����%x� �Ͽ�-�5�[�M�j\qo��D�$�P^g�)�&�b�7Vn�������os��j�|C|���Cm��������&��C���%�c�5�k��Q
˩|����8���=�G��Ï�����H32g�	�b9��{��vS�=9�J�rr�L��$�^&�����Ld�2�'�6Ս��+5R�O��z������` �}i���?р}e���b��i��Ҁ�=�h��d=�$2Ok����.�ӿ�f/z�|{�2�T�����ޥ�}��S�]�����|w��{W����{o���aw��.�~����W�����K>\��Nj��4a����ϧ�|�㏋^xA���[���T|��g�ʕ+B���3}��@��>x �[�wϚu�?ʳ��ճf͝g���Er�M�^�q����Y�V8p��ѤܱuVV������^?P`�K��uЫ
�SR���<�?p0%��n�Zu�-:�������S�W�3.���R-.r�Ǒ��M�K�8�IR��ꃗ����3����>pq�ʘ���:��o�w���uՁ�DB
��u�Z�U�����\t{����R�˫��'�P=�w��vZ�����A����X��scTU�/e���������[��J�3�Q(�3��%GUg��q���x���΢�Ci�	�!$�J`�jE��4�pC�<�/L��f�r���y߾}ETT������w_-_�|�x���o��2�駟�3g�8�<�6��n�≜�?�~�9e���~v{ʴ,�GY��]ʼ�	$	��~�5a3��=uf������{&66v{Jd�W�L�1c�����n�'�&�<��M���e�?O�/^� X��b~��dz���k���S��'���|�j�I�t��E���	1x�`,��Ùw�G�qqqb���bҤIb~�01u�T���.�O�.rrr���7o�Xc"^�o�x}~�(�&�Ng�'s���?���&�-�g�]�%=7Mt�&E�R��%Ő���O�AJ1�)B>��cR�>.E.A�))&|'ŔRL�A����b�b�
��c���+W�U�V�g�yF�[���wÆ
bӦM\�������
b��Rl����{��|�8|�����űc��W_}%Ξ9*��"�ɓ'Y.�����ߋo.IQYY).^�Ȳ�ǥ7��Bx��xQ�ݘ�	�fT�-�1X��h1G���b�|M|,�hI�;Qx
?��GR��~*��-��%~��—R��(�iC���J���6
��¿D�wP���(����C��)�Y
��wWj�H�Ϧn�r��˨/���;�~�\ȣ}��j���g��
!+_�!|K
߉“��N
E�)��4
?��/��)��(|���Ÿ1��v-��r6)+�Qx�W�����!i�A�;)�D
���o��‹f"Z�De�#�L~Tl���$��"\��w�'[�ы���J��|m�����[(|
I�'S��~�_K�_���(�n
Oi���Ÿ����=(��(�4���a���p�b�l.�/}�8?Z�3���B�K�I�a�ߎ���C(�
?��Ϥ�)�J
�<�����)�����K�@+
ߎ�w��])|
'�G�gP���y
���3���$���*$dh��`�'��u��۩S��N���ᡡ!C��&��ޭ[���;�1���3���Khh�߭�0|�Es��
	�Bч����t��Qs��G���Px�ի��ߝ	5HFDE�ϰv�oJ��K���SGK��O�GD��H��E���N�k�&P�!��ЮE�6�;����BH�;�OhղE���?��т�!�p
�{�7ߥ�yR��	C��FFD�E$�EmZ�tӍ����#�ܣ������6�=$,*<""*,�C-���6�hThDXTh԰[ڶ�<����=#�'�s-a<h��E���"��NA�?���
"(��Æ�hт<8��{$X{�Q#��a���N���y@3����(��L���4�208�vW���������0
�(]��C�
��fj<Rs��C�#�	��}y�L�G�@1*b	R�{����z�N�!CI���
	�qOH<*���{z
I@��5�'��˨��.�V��!q�5��	��I�f�B����	a�_}F�4�
&>��(;��!AᵝU���CI��
��l��X<������D�q��4�ʜ?�)��>�Wԫ��!u�k�)�>7f��G�'w�/̾S,N�焈7��
O�w�!����IwJ�f��裏�'�|R�^�Z�Y�F�]��u��_�����~�u�OJ_O����t���{O|�ᇬ�>u\�:uJ�>}ZTTT�~�A���Y�
~��Wq��e������
�lol\��:*�˧PC7����{^4�o�>r�-���X!���3�~W�S�ݚ�Sc����O�>��O��3(�~5��H�R��v�z����W���Zжm[��iã�m[w�ݻ7��mki۶uێ�u�i����6��w�ҭK��>�[��wێ��u#��}:���'�w��{��nN�5mzK��]��nҸ�-������^^��)̭74kڶ�M��n��ո�����fs[7�����ī1,z�th�i����͍����]Z�W�΍5��ձK;��JAn�oJ߯}�n��z��ÕV��m~~�~~�����`�cGu�*�,� �j�������ࢃ:>Db/�e/�kֳ���KC<஥��+�+�K1Zu��L`�d�F�Q�‡���� �)x9����q��N��+�G���駟��v睳g�~��O?}Gmϩ����ϟ?���������v���0�L~�
���Z�K[��?�?�5��v�ڙL��u�m=a„!��v�}�كԏ�۷o��}����T~����Ǐ���p'$��_)�RN���裏�*++�:th�P�	Kyn�R�|m���EX�s3�N�>=����7�j��oC�>He�/��;�?‹�߷o�|뭷$�'�|�M�̙3��o�����fC:�OS��_{�y[�l�G*[XAA������e˖E�^
ܰ��鍊n
(..����o�Z���vG��s��I�eVt�ܹ�p��/KKK�|>x���O���'N��_|��&H�a�d��?�\Er�;ũ���o�_~9��'����7���.����~��2�����>����u
: Ot�:��uiсpv�������Ν;�R>v"�(
;v�`�!ǎ�<8y�$G�	*�l9r�e�����0���g���T�%��ʕ+���d_
w*÷��/\� �b�0`@W�1���wޑ��tf.��?�c�޽�}Ϟ=\V�=��u�
�y�6�$e�1)�|(e߽R�~w�K٫T�1��|����^�p��J�?���m�V����#~՗������+�A^w�#��k����7���
�#���A��O��~$e�A)�8 e���=)o#�n����R.�R����U���u��B��RNP /�_K9���!��A�A��R�N4d~&�j)SK��95q]�_�x��4  ��B!h�|���9�������#�
��.���Q��]_�4�X�;	ׁDC?���*�iG��}W-׋?�R��!��I@�<��|E^@� :(�3�=ʅn�\�9)�H�!���g*
�I��J�?��;����Ou�.]��|X�r���>: �
��w��z�ĝ�2
��2�h#6�(����t钤v��t:�˓������V�us#�3��G������J����OH>��3�� �<�U�3�$�����]�LS�{�!�)����۷��rR��=�.:-�u���o�f
���˧r�d�L*�r�FC�q)#	���3h��s/�IT�v�:�#���M�n�gA}�w���)��ƣ��*?P~��y��o��O��,},I�2g�|~�`�,Ѱ�h��H��D�a�1��J�^�A�^�Q'��M|�)孠��oy���������2�C(s::-��AC��QOnZ,_�?H�L4�#��T�q�ƽD�"e��<�N����<��<��<�N�Gs�.�(gh_H�rhС.���<[��ƹ�ɗf
3�_+�����Ґ@4L��h0���<Q���^'u#:�So���~��_�~�HG)��aBf@t�ء��2����΀��@�y~�|�h�'��"����,y�l�uU6�D�tʓzy�t�n�����.�슼��x7�ӂ��=�5�7�V�móm��Ѱi�@�an�\O4�-ϏP��bz�\:m�\�"��ȼ�P��-����`�1zi:FC�S}��O�,�&p�(�[���F��/h���\|��J4�I4�1�h������hX�Ѱ4���
)�r~RӀu�@�����u�0��_|Q���+z��<�V9�|��<�T�,+�C���h���:��/�<�NZc�S�ιS>�=D>�i�fKѰ�hXH4�#���1�9R��IX�I�AˢE��뙞�C�a�ï��w�R�����3р:I/��P��*g�|,�*"�
K��"���|O�I������PPPW��/^줡.ע���jy��	�����`�|G+�
�y�FÓ
� 9Z6-X��4�a���H���q��_\��A�S��b��������+�#�����|�Q��D���Ǫ��W�:�s�V��<���?�~Ĉ���K/��]���XΜ9�Iõ�V��A����(�DC=�LCO�i���eTw�nݺɄ��n�:�v977W�l6�t�R.�_}��;Ѕ�x�m@]]�(�xP�>o�տQ㹙���+�������I���߳g�)))�IIIT�r><��rԨQ2&&F����G}T>��Ì���4�-@;�Ӂ>h@}
9D[�4�s�ʏ^�侵3kt������:��Q@��_�
*���Z�!Y_A��~�6mZOeX���={��2!�}�]w����<w�<��J���C?z��e��3僱<�T�<��4�'�Gx^�r%�� m�,��|��);w�,o��VI�5�<P6�t�K2�Ǎ���Փ�EVj�U��+�B䖇��/�o�~���u�?<��㲰��܊+�…���eFF�,K��t7�Q��A��ܣ�FY�x�������-�<D�����?;���Tv����>~���_����(�:
��v��5k��}lG��}�}�((#(u�;�lc��g�'��P� �$Kk,X�1�iDD��;w.�h�C���ƍc{�h�4�^�Š_C�'L�h3�t*���������x�ч�+�C6�%�7�xa��n�s�
		�V�U��Ջ��S���dK/�	9B}�B}����7'L�]��Ot/�߿'�a!��֭[���T>����Dɲ�v�Z�����QP���)��6����EL�_�x
[�nm�|����S�:��y��#]������"𡼕�[`U1��oI��2�6
<���㉨G�S�7n����*����׿8xM|R�n�Dm�\�}�= �y�띿a�
��*����� �QfINY��>}:׭Tֹ}C]�����y9A�N6�CxG��#��s�;�Po�_'�N���j�a�l7�BYx�$�Y�N� �A]��>�����~c�ϸ���Yܝ��?�4�b}t�ߨ����~d
mm=c��?�F�!0���,��(C�c1���{-���:�n[��c�8q�|��X��|�� K�u|�
�鵫��3��/�=� �h�@�>ޏ�u�##���͛�O<��a����7�2��P������w'��vѨ�u�k�	�g����A�l��-:>��*���/�j���׵h��<��;�
����u�0Z�;��W�k�o��R�����y9d�]���P^!���q�߈;�o��z�9��vBA�9@{��<F��G>���|��G]�z��<�A4�ݸ3���k�yC�n��ஏ[�Ϡ�Nrt�t��
�jۿw<8���3 
�{�[���Ըl�5�Zx�+Cf�:!ĐJդ���t�L�f���4Չߐn�f����i�TM�f�j��f�5��f��<͔�i�Y{ߎE���{<5p��1�G���B��"�1�Rw<��i�&�ן�����Ѥ�R��e�Xv���0�)�Jʙ���:dž�`�)ܾSʉJ��/�˵p������*�U��H���r��~�z���ϒn�N:0�0�!�D��٩��y2��b�/H�����r�{��O�H�f�ß�4����Z}�\����:�՛o#b̙b��\�_��8�b?9/�_�k����&>���q���hQ��-B]
]z
��g�R3_�9�wbL�;�����>�A3��������E�У�����`�����>̕�QY��E��ly��k�yO�~�x�|� ��1�ic���2�{u�4�:﫯0�#�0�8��Oj�d�)�M$=7θ����yg�t�x0����|��{b����:׆9�#�0׉y��9�=}����Ϝ7o^�q�[�gaB�~u~�%b<���1����:�h��h0ׇ9&ȣ�V�~�Ӈ�c�+�;�\�l��'����Ǟ?��\�sm �qu�q�6g��c�y:N��I�+W��3⁴!�0�`�
c��_����Dz�p��ߤ�!\V��P&0�iLzŜ9s2���ҍs���&���c���|�0
y��6
����STxta��x�f�n�u���#����]�+˜&��uyĸ8�W07�s\Z��qZ�
�8�@�NV\\��jժ8�E��n����4�7�|�U_�ƶ���P&0?����P'��h���e��ˤ�?]�@�};�uxq^�\�{(��	0>�A__k(�grh�dyxX)݉_^�]����!t~�<�q�|��9�#;��s,��+$�ks����;�ħ�z*sC�ǁ�ޯ��
����`���j�D}�h��z���s���|���>� �{�w����,��E�m�s������S�R��#��ι�k��6���ѿ���K�;��
��Ѳ�����7��ȣ�F��?���S�.z�qqq'��㮘�NKK�K�,�p����D��7�c��5��[��@��g��ɖ�������;��Z�s@���&O�����_N�6�ǁ�-[�cz�<�	��k���m2�I�>"ٺ��׳g�X*��D[�y�-��%'L��t74�\7o�v\_[I�c��7���6��c.�����<�
f̘�|G}�ϑ�2��!��@�DuFF�T��\ґ��}�?�Su����SSSwa�c�y��5j����.��ݤ��7�����?�Q�[6��頏�#�v�7�r!�KǼʇqy�z�x�zu&�ܾ}����(��/]�4q͚5qz���N�*����ȑ#7}�O��?ȍ^_`]�ƍq�f��H��G��


�������¤I�x��~��/�e̩@o'V�������2�I�=����kU�qE�x
�Q'9r�?�6��t���><t���^��W��bԍs���bڜ>���_���up�=}^8@�0ǁ�-[����j�N��g��>��
 ?/��:~�W�5��G�[�Ou��!'L����hϮq�3�P��+b߮�A<�=�А�c��O?�Ƴ�>{�ꨟ֭[����V��~���G��/�������g������0�3��O��1�VVV�q��)�$�Q�7���J}��/�uPCH�~�G�E��i�p�>��)�e	�j�	��G����]K?h��ʚ�'2ꂉ?�}�-�\��J�u�p�wzw�\���S����迢����?��V^�kE��C���K��Y�9G}�'ϫq�/���~��9����a�So�[xЇ����#38�S�:��q��?�� }
�;��X߂�]�&t]�7֯*�8��Ax �Ə��ܨ��ﭑ��s�;�v��w��<�ӈ9.�ė'�|��A�����RW?T����yS�:7���Q�����~@oK�6�N���#�O��8}�
:�=��S��1c������_�xVn\8����}����I�m�6���8���s!?P�q�;�r��ÿ����$ąv�=B?q�^��?��4�F<��@�l�'!,��h��{�Za��\�C \5�ݏ�f؛���X|��'��f�I�����\����8}�U�4^|��57���N8y�]�i�s�<4�>u�Sx�B݋1"�~q{h���ڻ��*�+�)��,M��T ��ٝ���
�+b@�((	�
� ��`��F^Rh��i�|`�DT|!E�)
|�"�ؖTP(Pz��R�>�W�a�mf�g��9gv7_�78ʫ9�aF
���#�:�^L4�_�����ϕ\s�Z�iD����}��p�cB�~�6��9������!05���M�1�Ȅ�S@�L8:ϱx'H�灼��2���_�|���.��e�̊�4	t˅>
~��Q��,8��A�b4�L�������b�OtC�ڌ�C0V1Q"�Q�,|���EV�	���>��E[��LL|+Ɓ���s>|����xT�;.�ɽ��E�
~R�$�
�H��of��,��珙�������29�w��Џx����	W}?
G�(/�汵�*3�͛�P��Wvš�������
�s"��
�Ef8��dH��,��	�#wC���7����n�"!AEB��(��ϔF��w��Yš�Ȕ�p&,*�^��i��ɹy�q�𥋗_%�ER���y	y�o7�\0�pb0H(���ӄ���̼p0�U�O�C�?ݻJ�]U�%��X%^�S��M뛜<x��t����!Q4E�D7��PwtJBi���&�4
��'�J��Fm�H�3�*�:�W���9E�h
}��G�9�d��c�<3b>d�6癋�g�s���l�rX{k���u�jg��k�ةv�.��gٿ�W�[�#v3ޙ���<���j��������i�tt��N�Ü~� �v'�)t"��S����i�Z�_!�BY-W�Z�Y���m�5F-S;U��ݑn���[�ޮ'��I����m�vz���3�<�����è-E�h5X��E��Y��7fx�G�E����p#�@��f�����:�.1��+a3�;��}�N�_X�Z7Z�,�J�n���G���r���jnw�m�#�]��|E}�Z��ܦ�:�Y�iz����,�H/��del��薄W�����"�I&�Nv�3�-���8]L7���S���m��x,5�6O�gM�vZ���\�_�7�N�F1DΔ���2V�RKT�ڦ>Q�uZŸ��Nnw7�
������z��G߯�ǐ����L=O/�O��z�~S�����[�G�	��k��{�^��y�����!��p!ގO�$@��x����ԒWɻd7��:��r�"�F�3�uf6��^aX�u
�haw����hOo�c?m/�������W�?��s~�������z'�Iq�9��%�g����9�s�9"W��E3�VdO9P����'C�7r��#�*�L>'�ȵ�=��[�MUG����U�֨�j����w�ϻ��G���$��G�L���d]����+�S�Y��~C��Mz�ަwV�Z����u^{���ջ�Þ�^�7ܻ���ʼ������'!��/	
@���=��?�蟨N���p|��בޤ/H^'��h7�ҁt,�@'ѩt5��;hS3`�U�f�#�=��z���������.{�}�>e7�6�������78����ig��-�%Z�.2Q�#�"�k�\%_�����U�d@Q5P�N�W��Sݾ��!���
��A���(�@�o[ ��>�^\���/��!7��J&�i�q����OE��-郴|�
���~Kc�=�9���J�w�M��v���a"U��e�榻-u'�@?�#�T)�(�h4��֠�8�<J*��B<u��ٓ%�l��_t�D9J>,s܏�����^��K�^��?��R�:�c�		�Ud��-i;ڃ��<��5;�6��a�=�
d�1�+b=fUXi<�������qrJ�YN�S��;��S�v�;]D7�]�Po����
�e�;�jn��GA�Z�E��q��[���9K����n��T3ۜh����,3W����q�$ė�bYk���},,���v���d�X�g��z[�X�AۅV�UeU[ˬV���u��)v�]bO���G�t��|*�yf1����kx��?�~��{B.���D��|�[��r����T�����8ґ�"#H6��,����
d?9N���Vzڌa�X2�ΆX�V+��ݝO�λ�r��Lޤ��T�r����
����{�y�<}U%�*B��*�.]g�a-��Y�[yI�%�Բ�LϮ���K�Dyj�:��rK��K���z��bv��/��sh�AMH��<D^m����.�/�Fz�ƙm�:��
P�����k��^{9f�C�9�E�U�.w���nt�i�}?��q%��ո��X觍�,��^ҔJ&�T9R��ِ�"�T�˹ra4s�ȗ!s�E�ӡR0��B'Q�q:.�� q=އ
ҙ$�$�AJI�&�!s|
h��^�4���6�=�$�`r3<�2��c��_<P��z1�Lƙ��If�X*+qJD�(�b��+*�BQ)�`�^&V�Q+^���b��$��z� v�]b��'���aqT'�a�X'[�x�Fv�$�9X�����t@ 0(LJ�2�b�QxT"Հ�
@�py
�Y/7�����C�\
R�j<�A�Z�j ���^�o�X͵�I:Yҩ0C������<=IGt	d�2]3v�^��|�Z����j�Z���w�7PKE��TǦ���-�pip/_vendor/distlib/w64-arm.exe�|�W�?~�w2��$r�>I(:J�@D[�&��K��u	Ю��pQ�Z����2E��/�Z7[�ڠW%�����z��&�jBjJ�6��=睙7�I�u����?�͇Ὕ��<�s�˹~�Ν�&�H�/�����4!&�0I�8V��gE���ͅ�n�̧6���pݚO�3[
��]�i�?]x��u��|殻���t]c�8���V��.=�{��o���'m��	��^�ؓ����'lߓ�o۾#�w�ɼ���fl��[�Q�[�}�����}m�:ˉV�/o�`���ׯ��;'�E�>i��*X��w����E�����*��U��1�熶h��e��[�~]�%oZu1��{u1�nIЯ#U�����L)��R��bl��n��۶�z�5��26M�
�m�k͖5B\�0w�6&��שd�z._�&����^w�J(�x���3.�qݦ͛��^��w�Z�,��?���i%�o\���)�)�87E�)�v�)ÕB��V�8z���Gmxo~��uA�J��s�jݏ9D�z�p"��o��\��7��D�@�֍w��/Zޅ�t_���}y���`�~ksJ����eZ`�_�[?V�����f߲�ゥ{����܌�7!�2����u��E��Q|mB;�"��.QT=E�5��P�G��h�kŔŅ��̆�C�k�cq����X\,�r\˭���Z�y�]��.E�����v��M�Wdo�iԷ�ڠ���—V^�_��.jh
7v���*��/�D����/F��-L1�,Ψ|�ܪ'�7sٓEB��'�fhOޕ�?�73mO��7�_{���Y��Ņ�p������������g�O��?��^t�s�4��~;h�(�M'��WX�����~���+x'
U9o�^��m�҉�!]Ϙ�%���=2B��R�ҷ�-�3V�z
����=��
�b%�w�Jz=
zM���	Ҙ�-O��4/iLZ��}�֏��,g�Y&�?
������û}|W���;�
�Ż{�n��B�+������,rT;1z���!�6���;�Ejw�0�6�Y�hӂ�lz�M�-x��HdO�-'8`��s^�-?X��������}m�hk�D[hk�q���g�o=y�|~k�-(�f�}pX\��~+��[���GO1�������"��7�ʣ��V�V��)�i�c�����b��0祏"���.���o�K�o�F"e�v�.�A|��61��6�u�u|�r��}B7RZۉy2��v��k�mG`��R�'�_�D
��4a���#ޮ��<i��0��s�N�8C&�T@��@3�0����|?c���A+��<����3�2�q���v[�r$)�>9�89L���ش㏧hǭi׎DJa.s��Cܫ�Dd}��׊��%�AY��J#‘z��i���8����Y�=]�1T��`�2����z-P���f߽/��G��F�����/��q�
��rOQ4���}4�XZ��x4<'O��Hw9i��
&~�8>H<7Z�`�w;� l�F�7��NZ��3&^�öXӞ��8?ˇ���>�����y��D���v�f�_��4���Υ�6}���z�0��z�m�m��6%*��+F���������8��b�ܢ�{	k��OL���]R�(�B�2���Yн0C�M���6?~����H�����㇋�l\���t���7?{洼��k�fϘ�;%��}		��h��0�eE"��Ş��1ϕ��U��͒ϒ'�^d�Z
�84W�h+�ne2���m�]-�g!5o߼��.��;W����b��>9�n��:�x�P�'m��U�q�h�y����U�O�Qd��k�z+�C�λ�gٴ��/*^$+o5�z�TQ�l����]���8� �q��s��s��.�f�f��噽�.��М�i���5�w��o�~L���e�ځt
�ǘt7�x�s �3I:ȿ�q���@�y�k�{�KA:����L�G��w˝�<΄��k9�S��K���p�X~ʶ�K�U����WC�`Ӭ����5*���p
�]��
�a���@7����:}lۛ��MTgk{��|g�����[6���/��f߫�{�&-/�o]��q��t����/I��`K	^����|7;��e��gZZO꭭'���њ�ІO�N��pץt#|��HW����-G�_.�u��͘M����o^��y	e^�i�_��,�e�A٧Q��ΗQ����e^�1�*��I�{�סw���I�_�����)4[�<7a�Kh/���]_����C�FlɴZ��v�f������A!�k�0}f~C[�u�.;���pJ�����������˩�.Oڅ)B��$�;��/���|wv��/�j�ʹV|w��ݙ�!�+�8|G�a���Z��:d�&q�w�"[�	��e/?X8���v�s��q�.���B��2�>pX�0�ڥ�;��}Jb�������&�2�&`M��s9��g![G�ʼnA9+��\��>!:."]�]�}r<����J�.�uܩ�S��ĉ�����R�c�G��C^�(�k�������sEm%��ÿ+@��!:_���/�=�}�2~���{5St�y�Kt�x�����;�SVUh�i�����i�;���[Ov?��Y�c���p
��k���u"�b�|sE���n��,Z���k�n�w�.�un�W�Cw�`9�)�-���z��O�2u�We��+3/�
�)�v��\���<��x�{��c}�bZ�◸䙸�C�
��M%,�e{4G��*�q�[Iꛆ�/���kS��=��ע��x�v25Pe�{�� D�e��F}AK�g=�P?���$�_�):;V�_κ��9vq"
�Xˢ��@9�%K7��-z�0����_�7�w3��};z�Q�.�X��[k#�E����sSEG>�j�*�I��^�W}a���Z��W��7E��"y,es 50�POC���Kܶ��u6Q�H��8-p��]]��
f���Z��<�2�a^��"�6\�$
JM�nB9��h�C~�չ7-�^Rm��Mg蟣ޢ얰ԁ�0�J6ˤ�`��ً����e����ʰ
��>lcQ|�f���c�;�T�mLy�T�ʫ��"-Z�`��4�LH8��a��i�4�J�t��ئʬ���T)�~�����eS�d��+�
`�/�߅�ʑ��T4Ri%/�]hE�O�ɾ�T�

>�L�g��QVya��&JC+���=ӳ�V�(�H�P��p� K�bdɃ�YLC�н���c��S��Pg�S=N�0Π�Q�ׯ��4���"��χR�S,�u<��3��Jk����{������I����ʮ�b���;�)�F�GXN»��W2�Q���
u#�O�6�ҧ�̏]&�)�'�eL�!�i>:.M���&i��&�C>�[PV���{[�m�^�G�8q�����L�'���?��V[Ғg�飸�����>�g2�I�v�N�;]��,s�p� �Vg��k<ƕ}���	#��c�Rn�3�=|�3�=������,���Z��H�e��:A���/��z�%c�=��O�@ˆ��vo���\,Lg�~�-"�*�{��>��B�^A�U�̔��(/>�:�v
��/}�
u��.'���e�'��<�G�L�VQ]D}����!���@�)ai�`?��]?w�h�*������������A����c�(��J���l�U>�#��|���GѼN{�B	�i��EH��Җ;#��c����~yպ����K����^ �2�f���2Bn{������ڥ$m��]0���\5��Jg`�(��s���w����GU���D߭q�3p�t*��­"�Ц.�����ݲ�Oa����'��NJ}|R�т�]k�E�L_niKe�ze^�����*�n���OK����
^�5�k��_�7B�>�S>���vB�##p��[~p�US>���a]�?��ao��J<#�i���mT��������~Ȏ���bg>Y��}y�g.�6���?��i�6����E��5��5Б����2�|
�
��
a�=l���ۥ����l����0
����I�����ۑ=_E�ߧͽ�}��DY�J�me?�)�k&��W��>�uƶ>3O���}�	_')���ݠ��E��Y�C�4 
���ޗ�?l���W�^$�S�N:�Q⋶���G^���ڰ,~㳒�,@�(���T|�eN�4)MK��?��d�gX�?^��F�	x3���Ϙߣ�=��0�6� ���=��fA߉��LS��
O���)�#�_�~�W��~��~�8H���\�]�0p�����Qw�"֒e͕>|�5�%���7N�<䫿�o6�ރz�8�	�~�}%�\���<�M	��6y�厉e���@����A�*�ݙ׻��L4���%����[s
/3c�<�!�`>��ɕ<YX�+���cz�
|/�"p>4�2�[��Ψ>xN����\������B�nw��,Q?�|�ƒmp\4�f7%���\�@^��0�A�r�\�y�L�g~��E�'5!�7!�l�a��a�����
b��:��@~��p����R�)�5>�-Rg��m��t���%?^�3�Յ61�<�~�2�o�<�K=��Y��oey��RmΩ����>R~4��>��Gs%�K�v��C�aQO��m��A[o�|IJgmS�j� ҮԦ������yZ��I_���9Z��koo��|���}���V�ƚT��icd�q�N������^��ێ|m�BƧ��(;�+�I�sM�q�k��c�I��N�s��	��nz>:~��5�J�����퍐5�5N!����gMt��{�&��7f��!�����)�l��/t��>^�i;�;�X�������2M���I��	�v�ۭ��+�U#���_���?�L$�=�x>����N��1����;f�i0��O�a��h�ɓ.J�Z&��»��c�e�m𕠛\�ߢ̃4]U�B݌'+3�Eіx`�j[����*��.�G`�¢������k3c���{����h��.M�t�x��/݌w�C6�ܷ���~P�/7�/�m�]��f~�/lK�v��wG|�l�r��T���>���E��k��>�A-[����I�2f�o�i�6�ϮeF9xY晥Ҍ�dL�&yX���h��QSi��i��"��~�2�a��X���4��m��桢�@:�����}>M\1���f{n-�c�s#�F~��>h{���ʎ���xr\�`sTg5�ӧ)���?�&���4����U�y�[����€9�����~_9i鳉2��Mh_��l?�&hC���@�l�6����*
��D�|�@:'�%��B��*�^�\N�”_����X������/czG��`M{-e�
���ڠ�E��7!��k�Ӄ��j
������D����hB�V�.��K��Sb4;4g�k
�y&��'�-q<D;\�e���4B-�%Ï�.W;��Ss��A</��4D]N�YW��s��O�,�?G�����dԯ��%�9��RЖ���&-��hg�ªs��d:��:m������J�?��>��+��Sr���^y��@^�'��g*��g����}pqXQ��m�3����r�#�\�ͩ�cn-g�|���}�E�9�R_?|�B�/��0�T�f�/|�~
�.}����;�JWy-�����f1�0�� �RW���!�֜�:��g�?2vU7�&>��v�Ï�y����N=}4&�Y��K�1O�E�<��]E������{=����ŭ޷} �؏��Hdώ�֓��:ُ�$�?�Ok�.t]�Jg)y�{�gYޟ��1χ�ϴ���Ϩ1�efܾl�]��/F�ۍ��cl�bS5}�,����$n?L�_�^��ٷT��>ā�ѶݚsC�.�7!�eW�����y�o�죬�"�[.���F�l{cc�1��׮S�_��U�16�
�,����Y!�"c���ME�o,6Bպ���+�Nф�S;3�Bsl�g��Xu�w5髄w#�>h��і�m���о{�0����C�q��k��.k�.�S����[�f��=�c˗���վ핰Ū�v���sG�q<w%��&���,��ʙ��f%�iy�����.�&�{��h�7fT¶e��L؇){n�r5�6�CSo�S��|�q�#cV]�ܾ�^�q�1YMV��pu�9җ.�i?|C�^���v �?�Y8��q"-mRu�X�l�U�=��^��~ָ�w�pvd.o��l�/�;�Ʃ��텕�D
�T���-�:S�-u؉:8�?�[6���Oעl�`�~C��Q|��.�+]s=��\�N.�N}&.@�F�ݠY�Ր�yoG��o�cwk�_��y�:-G�����h��L�]���x�	s���ގF���!p�I�)�7{�S���W5hG��q��J��T'Хt����-^�enh�:���;'|N|�����{�sZg�>�a�g�6�x��l����U�MkZXY^�%N\\N ���{iF�XF+u��Q?Үu3_���P5Eٔ����s߫-m�K5B��y�L�}.u_�l#4h�}��OB��x�p�2O��-=H[Tz1���>������+%��T���
'+Ô�����`k��]�/~���Vc(S��Y.�U.��ʲr�SPߟF��c�9�W����F�i|e�2��znyY�T��zo~��J_�coO�{hکgl؞&���2��=�l.o�]�a��T�G`�I�TmƦ�/����3�~O��k�B��*�u�r��b�e��,�3�Cކ2𜩞ٷ��.�Z૝���-c�d���c^�-ֿ:�����Q?�F~.�c�E�P�/+i?s!���#,Ҁp:u熳6���H�^�<G�ޚc�Ǯ/PsQ��v��b��̱��-�';�$�c������7"�s%�#�jM=C)b*�Fٚ���~��Q���5��3��t�C�cga�pI��5�(���'I������N�/�=�r����h��~A�d�_�O��\�h=�鏷r|ql���������4��ps\!�#r�]��'�o�L��'ک|��.��5�Ξ\�b�����/"��T�ro/�G���T��WS�A��(5M�Xrӱϖ�t3�G5�	�/k��H�����98�?��9�jDk��>��w�K��7�����99�䘰+���J����q���ӧY�N��9π=F9�i��S��wvȱ���0]�}��x�ȵ�xF��#���G#��p+S���t/1�;/�F��~�W�?\l�-TsJ��n�]�U�89��_��3�̜Z{�t2��Ey�5�pj�1�U�W_�k�-x�e�!-�Yul���"��Q���_�=�86�4��"�A�v}���C�?�g6c�h�"�?bSc�h����e���%o.�я�3�m2O���?�8�~qh�%�*{�J�`��f���^5�kK��6H�aܷ����󩫑���N�}�&�Eg��^��r��/���Aāk��@��-�3�]��
#���'��&=⃯[�Jo���x�	��.6�ϯ_���h�gZ�%�<(�lirn�f���>�[��]�ݯK7��S�s�mr0���	����೔-�Р��~G���4�D�A��~h����G+O�ki���$�c�|��M�}/���r��8�A�f:h�m|��7�m��+r=��v��m��;M4-�OC�d�$Ϝ��HG/iz�@��h�.1���q[���~H�)2�X�}H��r�kC*��z5���E�'�'i�g��qDlY�Y�<j�N5m���G��W�Mr�����ST�����Ey1-��c	��"����
��������4A��x�r�6e�h��h��2_���^��<^�嶳}Md�G�����l�a���^��[O����/�s��R�d�}_��A������;�X/�8o	���iw�(~/���\�#�ܽ�x�#Eӌ�\Ќ��(�!����
�s�2�ԝ�k��"Eέ]l����B��+mɃ� ��������O��gʀ�0���Vz���N��+�;I����ת�LTk��2!�g���w���]�h:̾-���w�ǎ
.]��[�E+����QF5�/����H��0h�p輬;>�A�z��q�ڲ���*���������uj��k>���#<���\cۓ�N�6��=�M�Z��p�)���3�/���
1O^���f�ۺW�6׻|��ҟ;�맋Ժ�d�4�[8ZO�]���7C�h�Ic��-���E�n�o���|Tk��
Z|��6�Q{��9������2�U�WK�3�}�x���/įj�RG֬�ڙK��x�k`��Ǻâ�"O4��]���r��@�ucQ|�T✙d��ϡLX�$}%����}W���x�`��<�5r�KN�/�Ը��+�~�_�=�2������y4��`_���@q�8��Y/�t�T������:�~����}�m���]�Ȟ����:ء)mE�V��ye��{�>@;M��[����y�nK�n��G��¢�G�
�4�I
�~Gw�y�����SF�HX�o� [���3�bS/~t�T�⩏x����� ;��S�4����og_R�K4�ϋ�[�&9�Eο�U�\����J_���~i�3������3�m
)�$�ܼ'��MD���J�耏��ʡ���٢�M������~�yd�M,[
Ÿ����j�C[�fzd�ہ4]���6y�'��D9�K�<��&�-�/ ��&{&ĉ��#�i96�x��rU\�&���G�c����� �F�zS���	�82��͛��N<3��x��~��Vݼq��(���������^��@>������d�,��.emgT֎�emgx��r�Qf�}[F
P������Ր9��B�g�Q2w *s�8��ϋrweyM������� w�<w�1�����T����yã�K�dvg2���mD���ԟ1�M؇,��P㶻�1Ņ���b<�����Wsj|ǝ)��ק��5�����䐀�����X��0uv�cq�o�X�Am����~�o�t��t>5��.r~SN��ٹ�:�8�s��/)��7
�E?(R0��޲;�o�:��32x_�HM��G�>'h��!��͈�B7�X,��j��E=���x�X�J����[����)W:u��E��v�ؾ�b�`ܕc�&�yk�a�o�ix߈� lP�a0 [��E\��)��]^z3-��I�4ۮ��䎿o�>qܝ}��{o=��tF<��o�L;�p5��9.]W#��3��ʼ�|Ў�-�"��1�{�,��,[k���.:
�%�rC�|��g<���5�!�yy�����h�g��ռG
��.�@�����Z��Oi�=�.漩�t��Y�Kb�~�����8܇M���1�U��e��+%�-�rη�_��X�+�O�珘�y�5�a�-[��ܟW��
�%��j�m�w�b�u�ϱ�S(�Mгɤ�Q5o\�I���>�ު\�
�n0�Y�1�E�=�+��&���vqse��ܸ�P�qq��d`���vd�hX��y��Q�Q��i�c�Q>�M'����V���7���6�wĖ���jF�U��v�~�65x��i�DΓ������S3���}�����9��h��{�F#��:;��1�1�,���_��#�t���]��07��j��k�86�l�ފr&�/��"�nd��"�r~��k�턝뻪|��W#{N��
���
��sW����߅��j�h*L�ǿί�����;�ݽIKU})CLS�>4��]�Woy	|L�+��6Q��,�w�u5l#�'�/_m9��oם�KF[O��w��wl���hK�G,��\�+Oȸy;� �d,�x��И��{���l1VG�%���	��GT'�A7���y���"P3��_�<3�f���2��X��ǽٿne��S8�����ø!O��yl�Lط%�`�����@��XY[g�)+�ҏT"���r۵&�!�}���b��.��u�U��eXƁק�׷C�b��篙j\d���>��D�]݋tʹC��r!�W76n���|j�m��A��2���NQp
��/e��8p<hpn�0�9Oʋ��dž��:dK��@n(C;�ۆ�6�f�{�����yMF3�����/1a"]	`d�y%�L	�/�8����9I����Fls�
�F�G���4����UٮOr��2�8X���&3O�c�k��=���'�4��E�M�-8b�K;Wn)�9UNv�S{�P��+��@<����n�o��+�Sڶ����Q>�N�q���:�
�����֡HJwd�E���D���DlZsd7������HS��ߜ#��ػ#O���]W��
=?u1�8�9E�q��8_�imdI�Er-�L�Q���E<�v��ig��
����{���U��%:��,�cpg�Ww/9��F�m��V�_��ۯ���-�O$�1u>�(�]����>�^�;)��z��q>|�䃑�!�O��?�yq�΋�q��ϳ���<��b�ËT�b���w1;��N^���ִa��c���~-��k���ت𢑖S�KZ�)�w�=�Uaġ�x'�\'��
_�o�1��
'9���:~5U���"s�hhftn�{X�/F��y�Dx^��{����ّϿ<�p�mu�h�i��د��T�)�v9�V��Ź�����b���e+CWp��z��s	�f����hg-�Hx��5q��&�뼾*���A��
;�q4ǵUa�h�)΅̰���"'���D�-#�X�|��_�q��a�KE�
z���^Ǒ�5_�g�Vx���Y"����0�f^f�s�Ț�w�k�p�&ʝ����5l{���s��/Eȅ��v��Hc�-��[u�cw�g8������v[��xO\}��h���;�
�߳�Gs�9���p����3M:g"�$�wf�v��ܯ�Zp������_���@x����ĵӤ�?o��Z��	���z�L�xܭxۻ�
�J�q�4�śt_i�ݟ���[]�@�d�e�?�v��e	��^&l�-q
���!?��!:8��s裰�E��0|U�m{�K���>$�X�������
v�s����a�9����*�9&�%FwcPt��=����G5�;U��7�F��9��n��T��*�s����%K�{���l��r}@0q\��y�П�-�"�[�������G�Bː��cf��!�KO�]���3�a�,�@���B�\�9q�Y�K��r�E�ՇEǤ��/-�}o$R�Q�[�����.��,�C�6xe���rUw�oi�W5����3c�L_�+߶�H��X�M�g8��C��>ſ�u���~8����G;��c�2�O��yu�a�=v&�ϴ�e�5���F�O����
l�L���W�g�IF8�J�~��u,�V��+9��Z�G�2��1ϐܧ�!��$�V[����G�[l,O8?49����h�?M���?�c�q��*����&�aoɏ���yK��0��t�zd5nJ	U8ES�$9v ��=�R+B-׉�Z�Ã��F��3F�lL=\�o3Ǩ5����?`�v���=p�l�5��upp�J�#�w�*��^|_Ѹ�
��R��V��e�h��ژ.�xj����t�}�4��\�i�e�GJנ쵏��>��%Mt|@�������JZt���V+/5}�����v���5'պ�O >*a�
�\ǝvc�Ws��(�
�"��m�3��O���������f/l\(BØ�,�i&|��5�ў��'��\'��a/|�[�z#������PW��{�Yo��R�҉�֘����B��|!OH[�K�v�}��E����|�����[t?����_|/�󽼸�|ؔ����Ok�YM�q��g9�g×�f�۝�>ȃ�F%C}�s��c�gec�����oGfFzT~VB~6v�)?���8��<��k��z�l��2��w���L�iI��+W��2��'��߉���5�?
�d�hn��h�1ʌs��h��ˌ��x�y”G��rwh��`�O�.�g�j=���Ws\�uC�r�Z��^�݋����m�{�B�j���[���fy�~u�"E,���J��i�W�j�6����u�G��ِ5��F�n��);�oO�Wd{�M��Llm�]1M��U��ş1u���"���ߐ�܊rM�[2�/}�������O������v��[kz5UԳ��b.���/�dV�Jk����&�3wfp���r7����!�\�w#`��A�d<z�q��X�k��V�Lͳ�p��1���rM�7^�+57N~;�ҭ�7��x,�s���h����\8RD}c���gn��.�X\��v�\8VT�Y���E+~��v]1�5q�uҽ c���S�_4ײ���غ�0���N�
�9��y�ڔ텚e<�	����¿rM�oM����a��ŠI�#M��{�
����3ο����¿��[����L�?|��/+ο��RgmuT��<�s����o�#�7yxr��Sc�N<��/�8���e�V���h�g��ٰ9>��qM�[F���1�r|.2�)�c�y��3n��pj3�����V�~�M���m�w�*r��6m�����8��"�us���>|o,N+1��_��~T:�
���:]�m\��
�&眹��ܟ�R��=2����슷�X쳫�~�]�z�RG
t�2Q>y�m�"~�b����k�~�*��3i>I�i@G���s���D�pq��ƒ���hrO�Cv���Z�"���ڡ[�_�,�@[���,�^_����aE����r��Q�	��Հ#��ҷ#{�Bl���y��}���i�c$+a�˟��{�?��߃�>�G�6�D�y����e�@����Ǝ��W�fʚy�s�����$�d�z�`Y�I�I�L�H��$��,����W�=(׳}��m�.m����u(Ѷ�fiK�Җ2��m��f�`�%���%�lK!�jK�>�-���K[�YےM4s��F�f��Z?��Q��9��|S�2qE;\�tN��0d��mȦڐ�ٻ��lC��m(]�}�ن޴�dj1�P��oiCy1y~��\9�oK�^�Փ�N�(O�#���V����H��<w�5�m��ev�)��d���w%I����;����ؖ��m!1��-%�o����Ǚc1�sl̰�m��%M��W�u퇌�X�o����>���Q�5��������v3(��j-?�C�\=�z��{�pM�q�Í�q�9fN�O�>��s��GýX�N�r�������Ji�h�h׎цA'x������]@�2��Tm�s�ݳ4�mAƣ�[�Y��Z�!���=̷P������T�s�}c�F��ث��-�=\+��ND�{�V�����Q�}0�30�K�x�0׭u��!�#8'���i>Ults\�b�ݍ:���n�R���v
]�v��{�a���g�_�l�h5K�J�!0�찤�A�����݂8.����׿��O���w�\��*�.��ԕ��-i)�by7Lj�݀X��<3;�w��
n��7eã���L��;�9R�<h�<�w���Y��w��{���ˑ��ȇ+.�|�`��ջ�ǵ.���h���GB?�U�h�{�a����8�+{,ֵ��F>�Y���E:Ti�o�����t��s�����N���R�&ʕΌ��e��q��$�{ʐg+tiL�ʲ��-��ߣ�,O��_�{q}�u�W�VQN
��]����زY�u��Y�9������:I2n�t�Bp=p�lӼn��&�dQ_3�}��X��#"�׍�b�bN�p>ԛ��D}Q�ж�T��滲��K�yI'��̯h���y�-p��8{�m��N���Y�%��9	�i�V:�_qk[�3���g��w ���+�~U�|��m�ε�yǩ��&Q���/m����"
�W��Ȟ�B�%�ӳ�����b�]7�{Z�=�9��c� 3��{�F䞏!笴�!�ϵj}��}��ⰚW�gW�\{�r[δ�/�l���>%އ��TJ�y�Om<�8��|���������$��������ӖB��'���$2�24�"C.����d����d2�er\��-2�a��h�y�����L_��.Co�LsCB�S�(W�C}�m�\�����a�h+;�V��W�ی�fiC�-�}y�fD��R�__��!j�^}�W��72��P��qЇ�����[K��@�fԡ
6�U��l�i��A��ʗ�=�^wp��y?�-•x��ޒ�w�����Ÿ�iqe:��A�^�{�C�3��c������{���^n�ԁ�Z�t��3��,x���_���_����6lkѲ6�Rw�́�ө�mh����u��s����7�ݚs�{7U�1�)��B�t
xo3��q�f�4<�Ӛ�p��h+(��)��8iб�B�7���F->��B��c�w�-?���y)�{���/���k+˹O&�7ǿ>�u�h��C��x�b�ɈM��{q�1�-�e��اq�T#�|��{�;�Dn���>4\�2����{��;�AY�����)�1+��%�-a��H��`��,�ү��
�̨_��i��M��K�7���c4GǨ��c��G��w�_��e위d��yJ��s[;RD�1�/��װK���%�;8��t��s}u!���ʭ�-س�s�n8��d���׀���i>;�g��F�x~�-Y�J��r�uGz��S���7����蕖S.k=��z$_�7b���;�*%�كWl��%i�� �u��jG��mN=����Y�ϙ����`.��˶i\��u0�GS�>���p=�a��73�7����?E���s.���4��'�Q�k�o��3d�\j«�s/�5}��g�=�g��ǀ[���2���T��Z3㶰�Bt�L�~n:~�]��d�cmo��qŻ�q5��yЀŹ�V:ސ@ǥ���������'o�:Zׯ��쳞t�{2B�8G>s�s�����hP���\�@\TR�.��xH��j>:c���zV��}��\����Q;!�j �4�ܞW�M��q8�md���\s�3��_��5KQ��kb�`툭�_�)�g։�����"�#u�A�)�����)Fˣ�3����\�G�\�Y�=m��N�懲��.�z�J����s
Sw�9��b�ǟ�{y��rMX�����%�5�bT�Y�ߔ<	�;�:�[W{�@O�У�(㑊Q����"�-j}�uMN����!-��&�*��I<��yj��u_$��H�<W���Z��^����"K��upK��oN�m~\�N��.|�j���%j�\��&z����z�9v'3�1%��+��.�oSi��5��Ȟ}�ы�>��ӿ[]s�g
~e�<8��Y�'ωgJ�en��'[x�,���?������RDOn
�L��c�a'����t�ú��9�dw?��{��Oȱm�6�%�nM�;�
�n�ڛ��+��kܧHWv��ɽ_�\�L&�Q'����#���-<z�j?�Qb�Z�6vߺ��q^��IXOzpA��/�W��6�8S���n�{��
���(�f��Q�������t�y9ה]漇t5��n�ĵ�m"�q�C�ۼ���;����{�����3�K��({8U�N?KW�oE>�tHw������k�>y^���\G���sO�:�rZ��r��9(7�q��\���;y�S���>A���O�ߨ���9���_��o��J�kݹ����<?�N{��"�4z1�˜�h֓4c]��!�?)=-�xWt�p^�Of�;-����,꫟��O����J�8=Y��v����<��!r��F��s]9�7�'�k��W�9������l�صJ�	�1H$��������jߝ?����C�1Pp��m�5ƶj���
��|�p��m��F�����c��2�aiU�8QuU��l��v'���+�6n����c�8�];����Nx�O�Hܟ�9{��#��=��_Mؔ�;{���=���#���l�}�(��?�x�/�.�!p�p�	b���}���"��{�f�4N
���7n�1��}7.e�����r1�TBv?�Q�.��f~�%�3?׹��NI�-�9��ߊ|'��?�p�}`æ��2π��'~!�_�DNj�+��O�S�=�iOϧ��h��p�ro��1����zW��O��Y4����ȸ����r�g�e��^��2㑳�?�#Bg�Y��\O��=�3�?]�O__��s��+��]\�d�J�'�]�lɰ�)��@���qj����g����mdO��{�%�_λ]�'�wN���Q��8��sْ�N�`Eu�Fs�3��)�=�*~~����v�ad�m��[c��t��s�e�x-KQ�<�&����30���x���E��2���H�q|�;��1Bg�&Ӝ�r��&zA+�u�7��'�L'<�8QN���.��~v2|�K�����/q�$��V��:�>�����f.���fێ���кޛ��;`�x��\�2����4�{�*��<�|��f�C��{Pǭ����`�\Ai������W\O��<�fH����C�pu�Y`j�����نLs�5u����!/�q_�����>f�D�f�f��҇9�+�4V>��r7�r�!޷E"��Of��<�>��|q���ۮ|M���T���Λ�f�?�l��ڍPg�hj���g�W�˱�
�(�68}x?�B�S�S?������r}�1��o�q��k#k�{�%q��m��";�2���?����p݂�j\��c;���1E�=�j)/�R^����xy\�ە�Zۓ��Y���,����=ST�X�w��q?l?�����9��?��~A�K'��-g�ρ��2�{N���a�������]��ƯG��3そb���x���;}�������]����=Bv�Y"<6΍�7e8��H�F�)�7f��$V�0]���h���F͹�q���*'�.0�8ֈ짰��\/Z�g��y��D*�\��ޥ�ρ���rA��H۔방~Z'`�\:�/-��,�~s_�}�.�y��V���K���G�C?ʐf���U���C�M�Ӷ��^J�D=�G���ó��TZ�\��?���th��<�e�!J�u��=�r�0P<g��7�d�?[�nҚ��mFϟ����jo9߱��6]]�o���:/��U�o���Y�N���8>&�ܭ�)ej�\k�B��o�1
�vZ��2'����;ƽ�T�:�|��^]<�{�c�����/���{���e��*sͫ�ydo�so����N.r<�υ����E?��t1m@8C�d���0E����ݚ.J�Rպ�!�aGܮ\����=q8�B��x�a�1���x~�&�d�\�ep����T���g�F"Z7�k��3q��y��*��͸���=ʅ���1f-�ɣ����I��yF���~MS���9�<��v�S�=и��,�9E�s\����5C�y]`
|�nI�� �+C���7ur�X��7?�1R��E"YV#`3u��,�k�-gw�܋�V�+M��w��Μ"{�{������6�F�(݂��S�>�k=c�[G�<g��U�,��g�&�7�s�spω�2f��6��-�*U~R^�;�jϲ��K��1�;r���J�,/&kwfD�6;�P���~��-C��cY�w��DG�;�/*���0���P{����E]-���o	9V��n0e��ϗ��`�|�	ʾ3Y�O��`��Yf�3��=���~9��Lq~/�sJ�;��~��K\�5����E��7�����cd�p��� }�%��:O� ������)U�WA�oSP?�({AW�J]>�t��A������#x:]���A�������Y�,gn'���.������=�r�\O�e�i��}/�gۏ�a�[(_�����GOҮ�&���w�s�(r\7��d�r��yW�t�4�5	��!�'��{��#����$tܙ@�/�t|�Bǿ�o�q���X?����ܫ�k��4�屸ܓ�Kc�곘��H�O�;܏&��K����>u��[�� ϏT�c��A}��uCBYKه��O&O}B�kp{>	^��T0��o��Z�ߎXC����v�mԍr��b?d	��-��
ӧ�>���ۜ�6�:C��{�k���\K�lC�g����vBY���Y�z٩C�6���}uG`���<si0��%�ϳ۵H�"���X��=��_쭀�B�<'W0�`?�vl\"�z���j�����Q���iB�%rKy��3^���o.Le\���ϳ��3^���8�+��~�~�
���8�$�}�\�n52�8�������s)M;)ϥ�6�(U���>�m�s�-5p�N�H���٩
dv��5��/G��N�h�z�M
�ߥ����8O��.C�-tj�<�/?Ŧ�9��S���=�F��?��{���6�ϟ�4�:�x.�:9�|�>b�:nh����r���c��3�E��c�����*��.�s�Kٷ;'0u�DŽy��/�����ڲ�<��##�-r�!�P�]�R�O��ab�����92��a�<GE}��+cKm�4�G�w��
�GN�~�y9�] �j��/U��ȕ���De��z)_̳/�]���Yۂ��P<^��+���ڶ�Z,�s=��g�WE�O���q������y��^����|JWg9�/�\>���o����j�'����jDs����S�U�S6їw_o4��m�Q�	�s�K9#gU9Qx�K��b4�m����G{��n�8��l=y�(M�-ϓ�L˖�}��B��f��ɛx~g��lj��L[���&��ٹi�T�"��9p�7�4c��i"�ϩ�o�<���3�l��r<r����1��b_��B�?=y�f�Qz�i��8��E�䶽� 7!x������ߕ�>���s�Ì�zϴ1�噳a�,����W'u��q�Z��= ����7�&ΠmS���ϱ	?�q}��?�%�!�Q^)�흓E��kYh9Җ�9��M5ڎ�-�by�YW{���S��p&%��Ϊ�I9תy��C@s/tt������~���3D�8O_���P�>�~�)*&��,�aʲKK�~c��?f�	�,r븏���Hf��mT8�xœ��y
�y��_<�|N��m�?��2�� �%za~��%�aC|,�Sf<�m7���w̧^����f�ח���<�U�?�3�l7���h=�i۽ש�|ە�z�#��9�s�W�<c�1��j̟6�'�=��f3�G���8�-i~�4�i��+�rډ�hO�kg��mR�K��� �#�g���E1³��g̼���;P/t�r�?!m.�<�ٽ+P��3�3]
Ҝe~ݱ���W$���<3-��0�v�U�i��*�i�5���=�oo4M�S��z�s������ql��#o0�����MZ�rM~6��_��s��Tq�"S<U���TQF�u�m�<w��s�� ��+ӆ@C'�~��`ex�F�m��y�*�sN]H�C�F�CZ�0�W�A�ؕ��#��m��K������is,�U�ۛ��'�>�g�����~\���W�=�T���
��
�V�s�s�ӏ�[�~�[韘�m~
��/զ��)u\�/
&��	�?�Կ��=;�^�B��p(ܬ�)b��ݧ��-W�A����IJ������m��1��v>%ݏ�c�:�R�U��W}!��';���o��f��,+GS�{��j���n�{�n^3���/���$;Ǎ48t�u����<�S�w�՛x&���z�л�3Ϲ��ߞN��)�@�IO�9<�����4����~�ٛ��<-gS���5��x'�]B=O2�yR|�T��ч���H	<>[�W2����{%/����JKWs�SոF��$p���<͜�
��ګ�\4�a��<��ع��v�,����G�|�>�CK=yb�o�>���8�W��#-��lu�#��t˸����2T-�y�t��Y�S�jbq/�;ā�
�>�枬���2ǵޖ�$��ȴ�Z���k��١nǁ�/u��$Bk�ڙܯr��Xű
t����o���6�2MJm��@�
�Շ��c��s��q۳b��'`wz���?@�nDҰ�{�iPw/����{�qq��;*��yJ����m>��D���Wm�����Kn����������<)�_k����{�oŪ��h�'j����a�َ��yʶ�I�8��4��h'w��y�~�O7�l-I�)��F�I��[�8t����Y�G̹.��W�ϛ�סp/���A�%ݵ�PW���F���1���fp�����[�5�/�ýW9O��MȺ��=)o4���#{~�M]�-ͺ'���_�Q��)��PNȹ=�^��Wm�U?h�ﷴ��	���-���=�c�{�@�I�Ǵ�\�Q��7m�+&�������H:�5A�c�}�7����oX/�r| ����&r�F�����>�7��c��lF�']�9��3��F��po�"�2`/���Z�Ξ���#VuG:�<�6���c���x��"�8"��N��hZ�:�ὴ�;k[t����}Z�c����4ۧ���#3����f��8ߡe�ܦ9|d�z�w�O��oZ���7߿�G���\|_b�/Yu�|?�錓����Q��~~��~��~��e�u�_`�_��F�~Ql�/2�/Z�D�/k:��e�U�Ֆ��&��ܲ�\��*_5O��`�:;��|��U�?Ѳ����RH�L�ܰ�-��풆G�OV;y�ذ���}�c�Ɲo�4�1UiÁ��3�L��RWp���`-�ۨ9�x$Ӄ_�Lo�ι�9��_�VцPw4�zC���.VI=�:�7b��QO��i�������r����}g�ٹ������Nq��u\�'k4���
�o�k<�L�~�;5g�u��|L�=t^��!��1=�"�d������Ϩ|2ߤ�;�;�q���s�$v�rq��s�ݥ�ToT��#ϢS{f�����4Gڹ�����_�v�ع���s\s<��Ѹ��G���6ع����vn<���\����}v`B;����y";G�<�rv��_V>`���q�3n��@��saVMs8Om%xu��_�ij�=�9}��]x>��nvȽ�w�/K
}�$�G{�%π:�'��S�q�N��7G�_G��5�Sf�Vyw(پ��eI/L��wn�Ik:��|�D���{��ާsD�\+�El%�q>5��s�� ���)#K�D���b��‚�[v#�=�TKL�3v��:��?7R2g���=��F��<�gטo���Y��5�N�sg�gys�5)�����7��3�-0�^������n#��/�O�<����ΨuI�'�-\��\�\��������C��~�_��̀q�{��L����7�n}���Q]����O��p���=B2��;d�s�����#�#�|"X�]2'������\,��K����l�_��{������_���/qm~ka�����Q4�Žt��@E���5�Ǎ9/R˗g�H�,�F�}:�|i�����ڙ�s���g��;c�N8��yE�oL:s�ǯ�g`֍�r8[k)k�5�z�-�]�[��D�mw�xC�+�L�;$ʹ���2�[�^E�CC����]����/C:�ô��K������C�Ѳˑ�t��h9r��K�5�� }�m�<
z�w:���wF��~�Ƽ�S���&߷���F3��q�������c�/���������]�����Ǯ��!��1��<���\��F����,�y��?/��)���|�����G�{�yQ�ͺL E�L�?�ef$�DF\&�7��L�y�*�$2�OWsd
��u�$��?�5X#��{[�-E��� ��Zk�	����x�y�Gj^�-/I͏��p���F1���F��]�(�%�e_����%�(kĻ�,�o�Ǯ<F?����/�sl��J��P��F�t���[�[t��u�?���Z��Fjsյ��A;��\�>��9�N��HG��o8� ��vf�=~�}�7W^{�6hЖ��{��yy�o���g`�^��N���a���⪮��}��2H�L4I�01�$@�Z9$^ ��j���:��-&jP#��v�͘�T������J4SmZ-�4jo�D��sc������0�h������c>3sξ����k��wep���?���q��	{�g$o��(T���Բ5��^�|���Z�$>��eSR��T29�O
����������ׇ��^yl,��7��؈}=���
�`�^�C�*���O�8��!l����|�O���Ҏ��B�}�TM����,���?���cH7Ɗ�|ߏ�.^4�m��DǃD��R�A�����z�%f�/+H���C���G_7W�^D��Y���m�4qk��IG8;����N3�m7�d�sg�eiZ'b>îH�)w�F�!^��5X��m���W�e<����H�觲N-q�
������*I��n,ϝ�C���)h�����w<�^������5�o��@�_t�����}5�Nܚ9��w�뒤�i%ŋu�5���Xɐ�c�gW�Ĝ�1��e�Q=�M�2�9���Y�W���G�>��CG��m^x~#/h��Ӛ6�x�c!���M���=��9i΁�l˶�
��f��]����|���=4�}�z�+.:�xޯ%���
\$�I��|�[�<�h|���X��|d���j�[D����srcM�$�
[Qf|x����Q�ߡ�Βt�=���i���бC6�G�7�|F{A�ô�~q����b�
��4��?k1���B`+�m���0��{G��	#�hl8�z�؃��	_~�9��e����Y27�׊ҏ�SDy֓��<0Ǩ͈��M�f	�.)��Oڅ���,�Q�G��a�y�\p��\�30��ߦ�8:�M��xH�0MFZܷ�b�&٢߳ O�9�>7���<d�?}�>y~���*!	����Z���
5@{d�
8�{婤��YԺͿ�`]��Ar��Rn3x~Z�f����G��Y
��=��E��Q�.�
q��3ЩI�+� ���e,�?؃�-�w��_���k�:M}ܙ5}�u�GKSY���c|��x�rZ[7�iyc�D��?O�A��Nd�j3��J��,��Lk,�	t-j����>j��,�Vj[�I�iy,;�����;}��+tҘ=H߸g��d�c�$p2�;[}�=(t��X�&��q׶
���{�X�as\�g_��Gğ��M�������H�6����<$���Q�t&0���Z�~�
{�I児s�j�:&|#�>�ZlG� ��A�D�icAL�hq�q�`#�c�Tլ�a��P�;���AM;�D�*��Fؑ��ί�����!�#�C��*��g۔k9��B��Is7���>|�q�����;���8<���t���7�@z7�U�u��:q�����
�!�~�h�gɬ���$^��)�t�L��w��o�gA�&�N�p�_N��tж�O�m�#���-K��mO4�?#	�v���c�]I����ɷ�{�>����l��y�<ՑIk���]�"Γ
U�1�4���Ou�K�ޜ�}N��SYԦeD�������-�G�[�iyƼ���4i��"�5�:�H/��R�Ϭ�=�I�&�Q�}`��I�YVy��j�Z��Z��i�'���f�l��2K_�Hf��\���~?()���S�'��q�8�LW��l�W�zTfM�%bn�
��<��v�zޕMs�4&x��[�P��u�琞�a�+`�ʟ�>_c~C�jʑ��`]�Ʉ��Sl�f�汶��N��Y���1s�aS����mqy9��Cs�;@��o��ri=��$���1��$�vn�'�z�N��l�,�9�v ��Q&�C�:�.��?��U��6W�y���,��<�j�-_�mؗLc�Fҵ��ޅ�џ�}0��Q���=�ge��5�+��rC��o�����+=�kq�^���˨#Ҷ�B�!0:H��g'���w�)��WH�Q�K2IV�2��5��:��uV��^Nm�C�ږ�-�������)v�J����$O3[���8��J���F�-�y���мF>��S=��u�V|Eг�+b��_�Q9w^�4%��ȱ��ޙBl�'���u�
r�r:6����'C��8��g�7h
�m�[��O�Jԗu�x}4����Է�B��ᅡ�W����^�A�]Tﯨ^�9ya����s]>(�F��&��_�3�:d��=���U��wP�E%�v�ޖ���E���֞��q|)��\_+�޾�����Fy�������b����+�|�}<9>_��a�<̍2�_��a.���	���'}c��{��-�eK�c<7�4�-�L#��<���V���=�F��m�������4%�g�)���j~��xV�_E:1�N����O�Y�9F
���pi#�L�c�M!Y�d�ߒ^����><G�gә��Ѝ�,��P=����_5ZJ{/�ю�,��*�fLy�<��0JS�O~�4�J`$�SF��n�TB��|8��o�G;ST."���87�<�jT{���h-5q�K�v�91�3Gow6�X�ٱ,:
t�X�=��c�o�wYx�B�D~�ݚ���p��3
�D��s�����I�ѕt��)�<�L�)σ�~
�	>>��5�8�m�u��I�����|�M15?K:5���.��n���¶��9��%�ľ�|p�eQh{�����K���xr%�<I|��R�K�_A���;�K��Y`�z�١H��;���Z�J{10��?p����q3�,9>���[���gt�&�� ��W'����IX���/3�m7�#q��ӌ�4Ȋ4 =�u��a��e�U��%0�����#Z�a����]-Β���r�7p�Lf��䎧�]@x���8�:6	�;U�E�4�A8^�<+�x��z��+S�-,�	��/�h�}kD}�eb]C^7�O������+�5�1Y�j	�W�ì4��x=A,e�5bmo��0g��l�3e����Hb>G*��,p�~�~�qN؆�5����^b��3��8�Q�.i�a��!~G��u;ΡĚz+��T�
����?G��\]���Y��B蓭��6�]k�%z��f)eA�����i1���ܠ�EH���A/����τ��mĻ!�gP���-��w}�CWf�;?���,=ο�����R�e�A��HD����_if���g<����H�g��2u
|���H����s�>=�?�����ra��7�ޯ���R�Y�ѳ�xFe&��g
�Mo,�ʀ�#�����z�\���e��2�'���Iu=1��`����2�X�8�u<�ǦM��pG�(1��R�
�����V�-��*y�n&���_1���R�)���X�%��3-�1��h���w�?b(gƂ+��Al<�2�8c�
�=&�v�$�[��cg:��Aؐ��`�\%�-@9C�mv�8.����%/���1շ���q4��R��rD���X=�K��DY�mvȍ�XU�Y?CY%�;и��OkkM���Nhy�f�
��ܭ�K�x�/W�8��5�`�y���&���t�\$���H��T��՞۹o�><�m�<��m�3l¸�ļ`�i��*s�<nDŽ6��"���_��3?�<eA��ؗ���Rq�G�{ټ?O3u�Yn�3i�����w��
h�fڂ}��O4r�T�z�s�Q67����4��\�
_�[1�Q�r@���o�%īg3��Z8@{3՟����b��X~��ڸ]�b;��h={��፾��7���{�3O�~ېF��^���|y����f]�r��a�IllL%j�O���̶��B�1|0#�H�����">�j��mik��g��?��%Ɵ����Z�1];��D{�R�o����v���y�e܏�4M���N�a)@&��9�G��3��eѷJ���8��fy�g�t�$:5RL�o��\�7�t�<ޟbᗤR~HyQ��Lx�c� �8|�h�����1��}�[�}�cr8ݚ.��L�H���Х"6�5���g�
��]��4�&�k��)#Y6<E�}e�o��g_+�W㬬^�G>�#
�&�.���;q-y�em�>p�u��3^��{o�}����H*s`��Ѯ߿��x64����rs�7%��T��;���
�@�w|��i����3K �橁���j�r�w��k��C�6~稁9�ﯪ�Y��b��{�8p���!~z���r�a]ΥgWjA��s�FZ�ǚ��9n�<��5�T�e3��U�$�Kf�	z��H�qP���bt �qk�
��!��n>�}�sA:؟m�4U��+�Y詀ȃ�o�̋�������#ם�����{����<�c�ڼWk"ϟ(�hkl��ۼ��L�������K��Q��x����g�*��S�ާ� ϑNi��H���z��>�oz���vS�_����WzVȷ��x�f�O?�<��c:NE�M��"���针qZe�.�tg�8eD��-b��>/�|s�q�6Fa��ܟq��{���o1����r,�4����q����#�UC�ͳ����u��3�И�z\��v�BoG#{����c��L�[y��L����n�����m�}ߑO��}�O�r����v���}����K�4���f�H�ڱ ���������r�����-̬����u�x�̱��X���h-�/�h+�N�o�0�_�t���=.�`[���#�F.�f�L
�>�{����b}&�jaI�D[�yX����X���g�Iv�au�q�D���c$�3���dr`��+�h=�ʶ �u6��R��a	�\]��ˤg���
��`~БQ�F9)Tζ3Z^щp������;ct���0·s�T��/������I�;�1��E=�1�m���,�zǩ�ql���^=0+f���{_����c�E�Q��b�ʡ1C�]�i\vm��7��xU�L��uw���㝩>��h�L1l7�LcJ�>��]��]=�B�m��}Z���A:���?��[�D��)�^��
�r�CV�]�cc>��|H27l�>�=�tо�.�l�Q������iyF@C�q	��P�T�}F���R?^F?t?�o�/���0�0�G��=��q�z�����L�J}�%>zV^��)�eB�h�}~y�Т�w�{j�����e��g;�{i�b��w��C.bg�xg�6�]4�ܗ�$�֐��}(�6):m��q�YfI`u�c�ql�W�V���SSXg�lN��=�dxIo�	���e�[�Ř�����ڞ ��^B�h
���RH�-wVϨ(+����:X�㨗�>�x��C`��#�r��,��1�"�b�4���WOϗ���ٌ8�ԏ)=�L��;��gIm��ݳ�DY����<47�h
r��)�Z�dK]�ي(���xi�Q�4Ї�ɻi��w��q.�w�y��as�YR
}/�P�x�HiV��Lc�`(���Y��M�1-�vet�a�'h5��=/��bm�tFc�]�7|���w;�ϏO:
��6H�|�Q}=�,	����>Ւ��v;X@:M�똣m��	����AZ��6�i�x:��ŭ+��QQ��D����w��s�,e�S/0��ݭ�vQ��g�vW,+\�}걭�gDI�Z������$q_+|�-�&j��贁�4H	#��r�ti7$����P?l�����3V��6y����
���x��Ӛ��?�	%�鶰�Zc��JRǖK1#'�~)�>�x��^+���8���v���#ďqF��m�KŜ��:z����F��Z16�ﶵ�ˈqj�-���KaRJ�vyC���:�]�GsU�����t�����N/��{@�ːd'�_�z��n�Ck���x9g�&��8O*��� F�w?���uQ�^
*�\��oZK�{#ڻ��C�w�dkn�c���]��X�GY�*}?�*ɛ��x��1gw���V�M3�Fdu������c1�����k.f=��g�^��g�,$Zo�S��͸�5�GRܭ�cɄ��,������0	���sq�/1�-����U��#���j��2��fo5�U��,]�s�Ʀܵ��J��$%X�m��P��ӷDŽ����2O���)��mN�>k*s%w��D�+�YE|p�*tt�@��I1���W'�т���xI4l���Z`��xddٝ�����2��]���8k����_�/�$���$��mRZ-0�ƾ��\Bs|y�‚�Q�;����/x�e
���3�yc�
�����rWS~$c>�Ḑ�^�ǜ���}�ֲ<�!�ov3��߈���"���h����Gy!on�x�<�(��-��S0�-�����m_��.�����fQ~����^������?��ǒ�_����h���7�^���)�"��l���0�
EkY��Ju�����"]�c+�|�3�iӅ���J�1�ͽݲXK'ĝX.�‹Ğ�m����/m��׸ϳ�v#l[�=9
>\��D}3�~6�H�伐�_2��;E\�`�?�z�d�����C}�Nb�a�W3�]v0�O6JA�q�ۅ,\Hz�3��X�����Me@��W�:��?�2=O��4_V_;
|�a9���Ћ��? �K�y.��S�i2�1}�:8�Z��_�é�R�ٔ��sH�o\9+m��䕲9ﶮ"�d=�^g�����{���`[��9���㤴7Pڶ,!�@��_=�àc���mE�q�dݸ�d-�?h/	���䲍�?�2�H���@r��d�g'�n�L��!�g�^?}�#�3��V1���qW{jy�{��
��GCb؍O*q����A���~E|�V�i�s�C��1�>��&-�=5�Y�5*1ǮW2=E�ۭ�ð�tS�W贁��$��IVf�7�2�{lU����$�6�Jr,p�5�KD��m�i���?iN��?�J�'yAc~���f�=��.Ȟ1Ԯz�=h�^�5��3�:�T���Jp�"9��a`��<�@J���sZ˕�v����{*��g<�%o��{����m�7�i>� >q����Rʷ4�x�l���x=��R�pΕI<_�R�n�M��ڂ�
|g?���`ͯ7ּ8�XN�[�`?7��ǞH��vÍ�7xM�"��+�,#�nؽ��b_�?,7d��#b|�>�à�/�>�U��A0��K,�=�I=ֈ���ԵK�k6���������{bbO�ݡ1�ک=�J��
���Aغ��l�R�>	և��͂�-�P����M�(�^�p�R���Ě4lێ�^��ۼ���ڔ���m�=��XԐs��vi)N=�:ӜS�O�X4�eLW��!�
�0�F\��ܐ����%�
��x�:���6���{�����54O�y��
D��������7�)�L
�>�9���2�?��Ğm��^�u�������u�N�x~�A�'޽9d���c����Aۑ�	���+U�.�1��h��mŸ�����8-i���<2�~��Z��Tlw�}Lk1јV%3╴K|O�&l��&��ݫ�N���e��u�:�i�u.>�۹��ՇE�`����o~/:��f�ɝ#��Ym��9z|֒9	[�f;xL��4��NC���Y�u��3�i2���g���:��,S���7�+w�b>�n���>�2�k#�أJ�5�~ը;�4r�8S�6�?�"xU4�W#f#��\�3�*΀s�����Ұ�䖇%���}��Pb�O�?a�+��*��/���8_'}(��6;�<�~�.J[
<Eҙ`�G2{�����<q�gbٖԇ��y�Β���H�y�cqf��ZM��+�y���6:�6n;��6����62���T���v5S��CMu�.�O$���~\r�tB<�裏�c�q�&�Ź��Ǣ���Z?�X|���P�$��6ۂcQ��_O�_U�O���d��=��\z�1yEo+x�O��1QC��hgd���26�E���[��.���y�(�y��A��_ȈuXw
�5��C�Vk�;R�?�>U���
�NƋ���K�o���P+c��v`qo��!�c)�f���mVL^�����Wǰ�����1m��o,��Sz�ǖl��Ⱦ~�)^�ؒ�)u��
�ө��<M{Q�#��dg)&iz�T�t�����r���mޒ���9=�N&���Sl͈��ӊ�;@�7jb�0�'G�'�ҸxJ��^?�����,�1Y�L�q�� ��_�;�e���M�қ�ƴ�4%�g�ghS��]NbBSړ�7����ή﫣�R�Ӥ�k����g}f�.O�'M���u�>:z�8�ь>�y�����>~%׫��F�a��KF�G���9��Kdx��DŽ�Ʉ�BG�N�O?[w��X���zE��4�6�;=Ϥ��;��3H�"5��[��g���EĽ�+�Ɲ��3M�S��uw�$�^�73���6Z�&�!��]^���ڷ�h��E{��q�_��L�5W�b愴f��&>�"�%���L��9���?�D�}���aq�X�4��L�������5���n�(47M`�8��n��U}IO�>���g󮙎�6�̔�hH�t#��6h�VF��ׯ͋xO�n!��v�_P�TG~�n�k�~ܶ^�!��Z��c�q�,m�\�w�ƓN��{�D��F[�ˋJ��8��A���8��?j:�>>�;ط�,񳰣cܦ;+�:cRܭ|/�.����=��(��8ۋ��|�쿨�KԎ�Ի���sCL��l������S*��;��Ͱ�Or�o�?�?��t��O�����P�L�_�\�������T�~�l���+8�`W!d<�Y�K����s.�=ܿ����m�S��u��
�
���y��Z�k��3��DM���
�i�GMLo^!��b�ݑ.|���UH�C���7�uQ��b���t�S�i�xV���f�����P2q�t�{>h_y�:Q��|	]�~	t�Y���ed]���ӭ8�;���;6p�f�*����\��-��͉"�\Bu\D�*���a�Y�R��Id�4�<e��1E�8a��)D_m�y?oS�hhV��ڿ#r��1�9J"|�GG�^W�#����WȜW�P:4�u�l�p����=��'�M��yP�:s���y�g��?�q����h_|N��\�i��j�
~ֲ)u���m�<�����":I]"�%���1�ަ������w�/�;b<O�~�L��r6J1���vל��6���1�i>��M�#�M�^>�������A0f��&S��>
���4`P�׵�Kb�
zl�2�_���V��]��[��8��/����mS�ݿ��)����A_�q�7�|gRxƤ�=q���rle��髞���=�s@�]�}����"����p�B���>�Y����sa�$K��O���o)�^
���Ζ�X���"�{6�α1�|~P�����q}j%��h.�-f�m�R �޷��F-RJo[��ի
���\i����1��d�PZWu5��.>|G"�0���
Y�ڍ�}�~��Tũ�lZ_���e���T,�}��s�5q�_�ݩ|����I��J���Z8����<��9B霱j!�<����4[�g���|����y-��g��L�(��he�r����N���+����h
����˙"]NFd:Sx:U�sP��Et&��T���%R����Q�}s�5C$�T/�����΂��#�hA�
V�y9�L��o��f�w��,�����8x���xl��tB]�G�.�Q�Z��fqv�wH�*]�������\�2O��N����ZR���rʇ��p����)w�� �Q����iy4Ξ�Cǭ�v����6U�ȿ�U�sY�{:���ʥ �!s��Ź��#��ְ��/���������Ӟ~������<�<��ւ3ݽ2|l��u=�-��G\�G��z+�6���u�P^�>m�\��}���
�w�ooP�<���R~C�,0����c�>'�i�'v�~��]��G��H��:��n>���K�SY��x#��no����Q'l�p/�^*b�n�N
\�q�P���;8?G��g�{|^��u>�w����y:�ť�s���x��o�����|�w��Csܴq��3�����}v�u'�p�xS
��]��Ӝ�=�-�t��ֱ�����x�b��qo��p'gFb�u}����$
^�yZv��9��>5C��\�۔ݧctْyL�OӚ�8F�5��例j��֭��I�Zբ�$��8���dS�j�⠐O�f�&ҕ�4��4���w7��JVO����xxC��i��|W�cA��{|n��-���������WH���Ɲ�C���ph�c~�j����\I-$y���c�Z�j�/V��/�)��o�4sA�R'��^��xp6�`�y9<]uAјR���9+�����HSE�� �}��t�IZ�3��;�d�_���>އ��b��/������J���o_�u$��\Cm���(�}��W����Q�����-�|��n�
�͒��_:��ƘQ�}���P�����I}�B�1�V�`9�3p���ї�0O/���4���LmqN�
:�wԻ�l��րNݎ>Q؜���f1����'�G$��x��3>]'��>��jf�
S���|�ZH�s��!cp�k�8�Th�9[�k�*�-j�{�zq&Q~@?�o��O���(�#?%�k*s��a�*I��c'^���Nz#��'���o�A�zg+�]�5p@��X�t���~2�����|
4I�~dH����i�8gs9�]�Ԯj�[�Ҟ��������@�4�ޘ�&���o8����u�J�~+�\_O�P�b��v����;.O�=f\��Xq��xw��m�HC�ՋXЮ����ҵ��f�����KJ�5��g�;��;#�J�Ns�7������q�o��N�/p�m��2��sqߗ����YH���Z��8������P���v{�_$���դ���ٺ�
��V6N�<z�;�_>4��!�����N��/
?��#�"�O:�y�}0����UOӚ�D�����nL~g�4&���!�c|������;��3U6V�{⩕O��=qj�wz�U���nh��:|�,�%������<�~Pk�Lf�(��[���?ɋs�=ӈ��g����&�q�9���(7{�(+7$��;�I���~�)���)��i�Ӊ�n���5Ɉ[�3&����i��Y�\_�q�4]}k�����	�+��7ul�f�}�}r�������ܞFa���;z�n����$�un���L{a؊����Cwմ�X�6�\%�q)�N�e��>���y���{�,���ڻ��,u�p<ε�=^Dr�x?奇��O�u�ZwS�FyikY�
��{�z�����^ѫ��A������;�r���x�E�Yo�bX^v<�Sq����q(��hбfP���.�������S��#�
��=�������2��� �J4[�h����eq����H_�]�K�x'}�"vg�c�(0pzxl7��{׈�k�cX'��h��wLRW��b6j:}KHGN?��ݎ�59n�k����L�;�����{��H���1���K���$g��|Ek�����y#.�a�����y�p&��2��a�� l=��n��}O��B�4�%�>3ss�;�l	�|,�h8%�M<n�[��9�tO~�(�G�UO�g�g�,����=�gvzf>kij��lf�كx6���
>��.�g����Y>=�>�Ϯ�gW�݉gWӳ���ndz��lq����B���n�3қ�K��*Ft�Ip�8��z�������8z|v5�Y�%���.�g�����z� �슨홨n�"5g�>������ݭ�s�A;��X�����p:y�bY� ��/�@�=�<��w����$π�{�����z)�-U;HG?h`������z9�b=��2o��9^N��w�|֬(s���
�,/�2�n.��Ł!|�Wq��ٷ�e��Jc�~��:-L�����!�c_d&�%�C|b����H�>S2�	=��n�1g�
}�q����C^W�^��yV���w��_��ޔ��~~u9��@m�Jr�
�L��w��t��I;�|���aus;�!�b�}�3��ZI��t�i� ���64����?��年]�_�v�����ճ���~�	Χ�>&d���/l�>j�3��yy�ʅ�c�-�r�}c��hg��3s�;'�HKBp�R���EMw��S��9~��|O�mبU-f�W�x��g�K��sR�s9��3�'/h-g��n����;�W�׉E��"� ,�U�Q�Q߭����x�8�;�Ĭiˀ�K��)��2� ��wn��m�W��_\F��i��di�6A�e�jIge��b�E�/8��j�Z�]&�]�C�gp݃3"�I���2Up��NSqΔ7k��ރ�������=�wT�����۵N`��\7���O<!��?3D�6�C��(~���U��3|?�������<���&>��|d�O��5���9<�50H��u�5��n�h����h�_�݁Y̳e��^��1����%��髝�q6?��廱�1)�1��ծ���V����6�}��K�uG��yዿk(��}N;�}^;��IJ��eX�.�&�]`M,���e_`M,�К��_�rϝ�YP?K}�8K�>���
�[`�Ȑ8���o�X�XE�z/�b(:6���D\�+���Ơ_����I��2nK�Oc�Z�8^��H����í�i@/����i�����pJ#�#�xe�S`��ӊC/Q~�A�_?�&w�Iɢ�ƾ��ᴭ‡(�;3Y�0�?�N�Mgpg���i��rJ�~/��HY=D��d*��3K��-±��6�q^��zn`XF�oFaO��]|�ʿ� �I_��4���%��)l���A.�&������ęЪYl��x�۽T�;���T��K�2��fa﵍4Q9��m��d����K���}/Ջ�z&�m<��B_NǤ�d�-��9\!�ɦhx�8��dᱯ��W?û�|�������,��I���鵊y��H��ϋ��7�XE�]!�Ur�(���#���ߘ[A<"���u�8���W�xe�J�[�������kj{��e1�%�
��㗿��E�^��w�8�.gI�.�P��{�}Z�b�\�u0I�,N��G4�+ᄽ�*��]�
�f���$ض��6�	��Ɍc���E��µ]�8]��"���fg��]��8������Ϣ����1�w��'��mi��,!���92;��Z�7�˥���������p�<��}Z|��aӳ���A���j'��)�ߧ�.ql��l��4^�M��Lc0����}�tV���wVS�i��v�1�޵����8��t��2c��{!����;��3���{���l2�[���,I��2�_=I��~{��puq��<��R����Lj�=�ڎ����A�t*���6�OvH\��ہ-٥c.G��X�����i��~��m?�Uv�1�!��h��G8�m,�-�}��bL�.~FL�Y1yt����p�
���z+Z�Ŝ,�O���X'ΐ�{�}G�M?~��ϧ�R6��/�l�b5�-��,���R�{���>y�_���w��o�b��o���ԏ8��v���9b��~���ծ=&it�ã�a�3�}h�R�|5�O��&��N�7�U�ǀcK��z�V��e��"���?�Β�7+�����<&^v���6:�iL�I��*��"q�2@�����fJĘ�_l̗�����秵�L��\Ek�x��/C껪���1��&׫��U����6P{��`��#��Y�/�,��|v!�2oM���,������5�ќ�|�%Ou������5��R����j���d�_�|�C�(C;�Gc�v��1�m��]��Y.Yk�@�_��ʹ���D�?P;]��fM��t�>��{ǽ����x��x�^��%H)�oĉ[H�#�z��мo��rJ@J,k��i���M��$S/�
��%�yY�y�����$�<Ir0���=��2�� _jWA��h��RZ�{_NA-�q�.��f��<|�T�iz�X�ר,ԩ�T:+�`�ýnA��.7����o��4b9&�3U�ğim¯�ZVџ�}C=��ӝ=R;
���N�KL���*��-IDy�%lQޛzy�$����_A��:r�e�]'�B�43e��]/=��1Y����L4w9��H&���B�IV8�^.�|�|DkA�`���_�!����8�9H2���*y9���y��W�S [�o�6+���{�70[��e��vJ�G�������;i	8���E�g��di��A��3�/$Y2�T�2�%��R�'��:��܉��sY]�,b���z���ryؕl���x*��r��F�$��J��$��z����__�1|��Si��
Q�Ď�ʢϡ}�_���.KwN�ͥ�G��U7/�FF�G�%��O�C�H�˸��%8�0��J�f���^=���A�A:�Yė�R����=D�8�[]'ELV�y|�:`e>�ѿd��/�8k�W��'^�|��gM��I�(�ٍ}�>/��[��i�W����0?V/��~�����J���$��u�W�o�{ĈE,Q̩"=�Ub�Y1,	~(f����(UJ+�z'�	g`����q�i���@�"�$���H?N�]"	�h�Y�2]�����@����1�G�{�>e�
4��9A�������;g�j�Z�<.l��LD+3�j[c�j��V&�(�v<�4K�J����Z�͠���f�-��}s'����� �&�˹��N/��ό9�?0��~��a��>͠����� !6G�sd%�"fx��݋�#�	�w�3��/C&���
�p�'z��?�=��6#�c����-�\���F*�mFl���̠����;�mV�k�S]�rz���C��~��k_�5�~�N�۞����I\�[D����Wd\x������LJ�>��+.�LJ�~9�r=}~Ho���a/4/�v�|T$.��1��Ic���N��u�g�~�!w�
�®��� ��&yoxV����
��$�D:.��7��/B��v�����F��u�k��E�X.��2��iͿ}Xk5��;��a��:��"=��,[�[��*�ln��r+c9�K]�k�x�d���y͸�w�$g�ܜ>�����y�u
0$�&�-{ge�f��=J�a��L�^��Y���c5��o�#O��ئ�l���or�Feb��=<�)�KA3�ǻX��x�"&�EcZl�?д��O�?!�X�s�B���6�v��ޥg��
�y6k�2���x}�9��:o=�o�_�qЀ{ٟ��ǿ�1���1�>��RYX�x��RX�q_#��l��Z���z�A؆��M4���~��s���f��Z��|�Ҹ�g�A1wo��b�2C����)�}a^��}v*�g�h��>���ōĹ'=%�^�����:����{���!��^�3�Rbu��yX� w�{8ļ��$�~'�k��C�قXxr�O�awE�N�'x���d�"�۳/i-�T���m���^9�}b�=���
=u)t_:%�A�B��*NͿ��2������6�O�)��j��RjM���ZN�%�uWB��gд����I���/�I��k�T�Î�Uǘ[(�8?����m���M�2�Ou�,���2�L���O��w�T����þz��,�=NN���u,lW9~wqy���@�-D{+�M3�n't3�|I7�"g~�sn�uS�K��x�ϻ��׊8�l�C�]7h��O��9h���萦�������΢���Syv�A��<�>��#vk�Î���,y����kq���?�s�WC�;��-���^n՘�i	(�ދ����
�G]�F,�[���� ��n+G��
&bL�7�Hm���p������I^@�)�u�,�Uژ͊s�M��;�H�a�ƳO^�ˢ�$WL^�+���=��9�]�?��|�/�O�]:��������\2��h~Uq_�=�&�[2��U����{�"i?�,�O��H��4*�Lu�ER����.p����i�]$��q����R$]Ŀ�6�Emr�!�8K���rt�/4W��qP��$����^Y�~Z_��{Q�c����0 s��\�l������y��_I9����
8/�o
0�:�5�J�YF�l���o���X�Y*?��yVL�yl���yP�Rߐ��tJi�V��c�&3ҥ�ߧ�n��Kq����)�[�-ݝ�O�LA[��gb�2�ds�|f)���Br���}��2��1�}4��hs��!�]�'(oV��T���3G��&sc��An�_���˲�Cz����T�qN��qG���v�?�O���lV/xP���W��L|�����匘��YE\2F�Qp��8g�mϨc������S�Ǹ>�(2���o�J���Ś�2L�'�h���Q��U���w�a5f@����سݴg��w�V�ZK#p�c��]i�}���W���׫>�d�z�w�����!��*�Yb�%�o�6�ޤ�̖�Ls�dr
�Q�텧s�l�9X����L|��E�/�x@v,���Z��9.�|#~=KF�*3��㔃���lj��a�@��1W0O0_����ϥ�I��>���םF��~�r�BV�2�/�
���2�L���k��)[�8K/��3-/��y�6�䙄��_�U�*�`/�~|v���g�c��.юG�n�{d�m]�
C����ڲ��q:Վ��	[�>d�%S>ʾH�uV����DŽp�I��DLK���|^����g-)�A�o��ߍq�Yʺ�����G�߮U7����!�MԆl�ihIWa����U8���ѻ
'���K�8�$^`�y�,K�'Y�C1�@�Y%e�6('r^�%zT
�Aѣ��3�ah�'�bs�>��2�C��~�%cn�sԘ�����sg���x]�M4_�&�_���'˃q�L5|�{&�D�O���C�s�@Ǩ�Yʘ�.���`���=���~8��dJIɆ^p!������,���1�~b_����irہ_-��иt��!����12����|�<��y�:�i�Z�s�����"���|���q.α�-�I�n���
,t��Q������o��4���A;VJcn!��Ķ��c�M9K��)�����-7�-�x9[��q�3��y�Xpg�Ҍ�7��v��qq�i�ǁ�2V�٬ۧ��^�p<��{X����$c�{���|�~�2�o��&��*ɱ�'H�ߥ-q���c�@�6�BINٽ��^���r*�V�3UM�q�$�?����zx���¯��i�`�=���4�"/E���@Q���I�����H��!Q��3ˏ(o�����6Tgd=W�h,����vIΆ
�C�6BV�������F�_����ш~�\�|���qlp���O�;+VYM�	6�R׿�1�g�D�����$S'��6�o�*h����m$�#����.����p]�H9�H��_$�藂X仫��g`�Bo�c)�N�W􂒮6;�u�P�+�Ey*b��\�[B��K��.�wi�&��}Tƽq<
����6�&JӞ�
ǰe�:�^���&⑇If:D<�	ڳ`��ج��@[ط�K|�/p|H4�+�3��q�"�ҹ�D\�
$C����\�|E��-��A��	�qDO��r�̙,�R�^��X�l��b�gy�շ<V��bg&/|*C�;"�<�_��F��������-3�VM1$��p����ȼ�X��O�c�{��o����=eMV��l�~�e~����2��S��ݟؔ،|��r�U�[���sA}.�nA|Zԛ8�����i��1�Z�&%�+	�nF�%�}9Տ�S�4��6p�Sz�z��
��U��,��r�D;�_��f��$~��o�	��%u}Ӕ�����R[+���&z�&��p�q�{O���If�=�m�Fr�>�o	���T�k�{����%�cN�袗��b�փ,����	�P��F`ܾDm+�t�
+,�2����m�s�>Mm8H�]v�ۭ7J&�B����`�ې(%r[�O(�}�>6��:ܠ����փ�e�L��9�}��z$S�y���cz�o�i~�O>�����լ���(�5����A�����HJy���R�ڛCkd
험3�%z�L4�狓�U2�� 9�J�/�Z�<�k�'��=��DJ,����jZs�M���
���/�`oĝ�GD*����z�\�f��ʘ�Ƶ��P����ij��ʹ����x�xm�KiJi�%�U��q\��:k��Ê�	?�Oz�kr��R�7z	�
`�Zۘg�Z�O1���h#�4�‰�`�2�=���Ÿ��^"����w��ԻJ0kϒ��mA��E8�MbɎ���I[/b �AJs���W�?�-�0�u]�1���q�v��*��(}����SjxS�g/�����u��6I~f�� �;����^כ���%�E�_�u_8� ��Kr,x7N�g��@�&Q�QLbu������x�]��+�w�cy8$^��ldi�gT�$��4~w��<�Sy����j��q܏ךIw��2��H�ͺ<G�lHa�	�@hozC}|Hy���f����Kn���\)��?'�M��&�+���U�ڧϚs�It6�kffK$��;�9�l�#V��xQ�x�R9#�'��M�[�J�^8��>�ך�m���>��x�eV��#��B��qk�7} ��D�b��M[��>�kc+.�y���˨ξ�W[ci�Q.`������#����q������m��e���˭l�f�d��!�%4�$S�1�g�?�W�O��)��z��-��z[�F|1xݴ��<���v�Ωޯ�*��`/Q�?��sӭ�'��$�X�I�˜W��Y�/%�;Bijn�l����9R��`C�Q�!�QZ��[ѭ�{VNb-���{;�w��?���3dߨC���M�ۛ�?ݢ��9Jk��Y�r���-�;��9��6�Ͽ��{�,��Qz�1����j�>_M��u���D�=#ih&�Q��K��7�4�@}0���}D�"�*ПS"�nKu��==A�NO�ޝ"����2�tD����}�GI&X�plź��`�N���7��&�d���cwo��i�+�5w晼��~�����:V�<˿�t��AJ�秴�|ܩP��IO�1�0�J.D���i���Ѥ�h��_W(���"ZT����iO��[�Ŵ��Jnb?�]�p�V;�ͷ6(��,��xu����$�6=aG1���t_�Yh654^mQ�;�p�[N����~ñK�K��������ܬ�m�uDס�%>��
̗O�K^:�{�}���C�m��~��|ú6y����Z�Ǵ6a��8��{��=��j��kK��Y���$�P���q�<LyJi
�Y:�Ÿ?Ju��F����ʦű�vj�i��D����Y&����"̏��p�l�S����b(��A:/h�
T�@"�|71ا`R&���Щ�B��Os�G�~�k���?��o�i~����7�O��g�߾�;{�H9H�S7���i��{�^��O�ϧ�@V<�L�F��,w/ёߥ ��q�:o��M�B��|7�r�Az>����|Ò4[�^�����+��_���$�Lkb6������"���µ>iL��B�$�z���������ɭw�A���
ȭ��\q^������S�}T��Z7��1���|2|w<������1���U��[���,�/-�d<酴n�άp&~�d���Wᾦo���{H&]f��m�c����ߕC����)8�w(������y`VH��'�&5��y���܍���͢r������K�x��O�Dk��'�9���ZV�о5��S����-��������>=�/ފ�/�x2:�0��/u~���#��%:]���N�?��?m�=kubMQl$w�6�"~�tu~qH���e�s-��2׶������4�"�W��}������yEZ�H���
^A��w�W���	���H�yş�xEZ�`�X� ��8E�/������W�<���=�%���x��	���+n�yp�PO4^1B���W@��j�t�S:����LS�_4����p�0Ə�{�>~-����\����N$C��Ӳ�,�#-�4�'n���[ʚi��FE�m�Z�O�p>��s��ϳ����y-m=A�b>��8��C47����dl��J�g`��
����9�Y�v��9q�.�?դ��&{U<���}�x�h�6'y�2��m�i�m�g����j#��H|q<�#�m�X��چv�j`������FA7�¦����b���?�;Gpސ3�ݚ+��v�y����D��,��p>������N	�Q���|�B�P2=���-�Rc��œ?�S���(���׵����	T�ƵJE	�9s�
��XsYM7KBL�fz���6;dL��y��Kr� ��v9��9�c94�����)��d�V�W�B���o��׫�z%�4��Mm�e������Y4ۂ�N�����˼��G����i�k�}+0�~'xV}���Z��9��+���4�3�� �5��Fm�1���^^,��JYG���8Gs_���ܛ�zےo*z<&��&�y�{�)%���|�����1�z}^��|<q�Ҽ�z�y'�}���iJq~@i+6�����=��j-�U��R�Z�H1�;���47p�#m�O�)/����n���}���+=6����xZ�|������"n�=,nb��C�K��s�n@�x�*��\Q�2_�Oz�[S����4w��|�6e��{��<�g�{�{�y��V���1�mfǰ���YZ�i[O�6yN~�:p������l>�
���Y�X	�Q�b��*�e;�����q�—[ؒ�n�J�ص�~iKk�����p��xX����q=*g����
���jgAi*�?��%�u��!�������i[�:WS[�����/��8v���FJ��[]���+�Xa�1G�
TWx2&�e�{�"�}�2y�'�e�Z���qj�I�6e����6�3p!��A��ݒA��/���ئӴ�v�i�{��6��G�I��le�]�l�)����.9u�>[`K��V̳׈���!}d�;MukTw)�7|�C�O�w��r�������y�����(=�1+)�#�P;����̽�g���m���g3���F�h�
�~h+�[�g�f���MϐgMH�gC�L����/��6�-v�b�G��:(����G�=�=�{Y
���=[3���"~�{}��Oy9���p�Y;W�s�m㎞�'��v���/��`�#���C��Gn`��Gqw�)pѸ�?~���o<g�y5չw6�~)�݀�sVۍr�s;K��Ak�Y��8���TP�|�'�<�=d����O�S`n^�n.jb����QDs��$|<s�ZX
|sJ7��cK���,����oV��D2;s.R\՗�/6���r��y�6���P�l�|i��)����dG߸j���=�v��`�qB�/��^���3)}��u�=XC�E��t����#��6�>�Bо�㊸�m�u�}.	~w	�����K���%���ܫR����7O��Tw��3K�ݼ�Z>�Y�uV��̧�8'��-�z� �M0����9����JV�>���A��
v��*���a�e�d�5:��z�

�C1�6<�D���rUt?�ԏ������t�̷u\.�n�q�`��x��
i��8\�N;���.��c��e��C���k7�Yn�����WN�}���khM��8i����Ƴ<�7�?N������K�qɮ��q��޶�L�`�n��m�e5nwF� �1�N),Ϡ��C���E�$���Z|�����_����[N�r]O��e�4^Ch}пQ�*��H�Al��Uc^��9��y��b����E23���h����S���dU�_a>?+��c��d�ٚ�'�%^��U_��x����Ė
⭋���n��=��<n�B6$o��kf��w�A#����(�9[�|��Ck�f�����3akXǞ)Qx��OM��}T_הk���%���p�v��F�TJ��
�~D({������<��D>����<��/S)�%�s`6��	����C�<w�,b��Q�����1L�wN�>�lcN��'�^0?
��.z���2��2�|L{a#|�I_�Z���#�������`�ئr������3�^��Y�7�uY�y���wA�?�ޯz)��Q��X�|H+��l�TO<��>�=U���	�_�qZ�0�+k�VS��?{�]�, ��ݸ�״�D�+ў�}��9�����z��7}jjR��N3�ky����0ܦ�����~�QG:����㈮�c���bsq��Oc�j��[y{̗{����߈9~��{괶�;i,2i���"Q�����K{�Q+Xt#������Z���<#�!)�Vw���\�%;�ij�{�����J�`<��Yeb?���,����Ε���J�v7$�����2�tL3��D�/#ζ�P��Ǐe>�gI��̫��|C|2�N����cc���V���#
������.唕Qn0�z�_���`�ho���#bq6_S7��MӨ�
Ʈ�<�mC������,U�ڃX���P:-����X+�m����m���uP����P$g�d�%-C2�@�`�{`��X˴�-�����n��U�_��`��?�m��{�ܧ��	�� �I����/Ү�{I<��#}e��#�~��Uby�_w�"�Ι���0|��,s8�\ ������8���̇��|�Nb��ޓ<5,�>���˟¾�s�O�zrnx:|"�!lv�)�-2�}�8���T�F\jY�J8v��>`W ��
���+��`@�������/A��Z|�>Ӟﱲ[`+���Q_�Ӧ}gfҴ�����[|w�w�g�#}�[7ӭP�V=�y�=3�"�s�W�Y�\5��C3�-�[���7V::�s�8R��oq���S�r�ڙ�e�����.Qo���dAL�yc5/��x���xED�i�����E����PK���Lɬ�+�v�
���D3E�IJ²�R�=3����#X��}�����ރ�g?��<��3s�33;'�рD��}_ժ���ᾊ�7��W��"���ͭ@�J����]��R׫pΠ�KӉ�j2���a`+��.��N,lFfeJ��� %u9�D��Z�Y`p���Mۉ>R�	��-'�u����$�������{[���e�b|ѰUm�ٻ�z��i��΅���]l�'L	x�{�Ԁ���������Y6�./���#�ޥ��i	��ɏ�ѲNx4���F�Ǵ�V�׫H]�#��G��n�T8v�����.�Ry�a�u���F�����_~y�(�c)R��1ԹG���q���C��S��%fx��F����C���ݟ합=�+���ZJ��k��)���е�R,��\������s���~j���?����x;��=
������{���U������^���Z�$u�5�-�-a����(�Qja�;н�h��t,x�7�^A^RG�9�$ϠD� j ���:�`�|I]�|�ڴI��|'a�_J� l%�c<�Q�P��a���Z����ݽ������~Q�_|�z���z)�W=��l�o1{G�{oA��#]�Z��~���_3�я����t'	}$�25<�΁�����4��fւO6S;��E����c����C96S�@�.�x����!oN
���0!�
$yln^���H��!��_�26$�b��'����lv�����n$A-5_�M:�{�����-]Km�6��m�$��
��Lm[���.�IۨM�1�Ć��?\�6�u��p?H߇N׬ӵ���

C��%+!��wF�P�wp��R�O�ʋ��
�#�S�C�E��a	��M��~�����t�ᾥ���>�6��
}��]��N�t��z7v��߅�`#M����̟U�E��}��w�.y��	�}��=
�4e˨�����Q;�����n{�F�[�^��
�S��y`io� tH����v�9t~)���p��`x�ފ��ݽ����o�5+�ß��4C�g�wː�CZ��&Bz��mM�WRϡ�U��t��)�ڵ�a���l���l�����&�C	i1P���}�(�~^M����^vS{��D
��$ȹ/�vk���W�IĻD��h?E24p�X>�΢��x^��|��x^��
|'�
��`��跻�#�7o�7��k ��y��*��꫕��u`��(��;�?,�M���|}�z׏��g�����]D7���g��X�w�O���Bx�P��g�O���c��wU��?O���v�J��X�d]�v��C&���ϲ��~tL<w���ֻ�]ۋܦ6���﷗�&	����@]b�z|
 ��0��/4J��̪��tO��}��:Or�#��T����M�����u8�mE�>I�\~����{@�!�'
�����7��v����wy�����,jC��,�_ύ�dO=�%���0zߚLV=�{���EO��M�Fy7��>?�c�M��J�2���n�}�dC9�_5�������'��Wg��퀎A�ߙ���;�ps�L�c�X$���*���B�G� {>���c���Gz�߆��Q4\��ot�NX�9�����]�Dxg�g�m��N,��o�H�nG�(��i�;�E㿇���p��yZ�����E����Z:����Ux9��5w�ץ}�>O�x����zA_4�ꨂ6R�~�g_^&�e1���u�0_��.���a�0�¨
�p�G�ٝ
�/]�?�_���l��=,��~5��W�s�x��
d� �� ���>[���]��k�5����g>�ܑ�6d,nW��+��n��F׵eu�3v�q�T��c[���\�����r����;y2���A�>�E���M���!^䶜���ҸT7����A�������J��f|��� c��'d:���)4C�_�n�<���a��|1����0�V퀇Yy��k��ec�[x��ol�_�c�No��z�y�>��{�(��W:&�~Kgz��V�d�ǥ*�1]K?���;*�;��1���W����W�g|
�#���2Q��~̵�}�|���N��8��<�)��t� �7d�^[�vsխkP�t߲�t'��#y-���^�%�C^��>#��&Hds'}"Y���ǻ<pyTo]^t]^�作�
���5dU�-�t��k<X�}�_b�Z���U�_#�^�{�o�:S
�Udݟ,�WZ���ҫ���o���ؼ"�3uwݞ�O�C[#�o����Q]��Q��=���rm.����:q:9@�G���s��@�ǯ�;�w����p`EF��!ܯ�+H��뺒c��^���t��w��'�o-���ˇ�5���9*��R�H�O�x��|A�����jbzkb���x���iD�*?C�U"��1^�$��R�>u��"ry��l���%��H���-@W	�u�o�}�Q������*�E�r#��#�
=�����+5�!.<G�t1��;}_��^���F��
s � ,h9	#Ǧ�l���	�#�#����N��z[�l��,���'Q�����Զ�`k$`�佬9|��``W2�kn��=��$�\-�,kΞ�/i�~��;>��9�"�
��`����=����O��� �
������W�0^:�9^ƫ ^~�\^�o���0l��OH��N�<��CZHdW`�Ck�ڶ �u�Z��[j>���FJ��(o.׫s�!_Z�Ր7���t��\��%>�u�F ue�e	w'�74�V�&�
����%�ۭV�G��!��Q�����O�r/�Z��A7��%��a�zs8���ɔ�P��%�<W�����U���ܚo΂6cZDV�]1����xI:6�>{��Sإ,f@@i�@hW�~��n����y=@�R��7�O+�K�?��n
�+���ē/S�/Sb���Ch�����i^P�@_|���]�Pw�|ͭ��:�N�
E~ ��.�p7�k�osM��z�v:�h���'�/O�+�qq�W�6��>"�+YE߉���Q�t}�2�[{���^�V�����y�@��l�H�1zBN�x�ϱ�	���9��xp�;�������w�$�4w6T�D��� �)�s���{����
2�Av��%%>L��i8�{?���{۝�����Z,�u
��R���t_�![^2�/��7|䡻�d�ې��
�w�ɪQw6P��9_�<^A�M�$[��5/��>��#��O�6��j:>Vٴ��%{_�n�g�	�~��Β�./no:N���s�|Q��=⨱�t��zZ�8׏6���n��������=ң�7��G�n��{�u��=��<{�!����e'����m�����{�=[h��%�b:{�5�?�G�?��u�D(g�=�)���l����عL�/>���!�#�B�E\�����,�/�����!�cs� �A܎X�x�"�
DU0G_Ě�s��"�A\�hF��8��E�ѯ�@�p��y���Kw!~�X�x�D��1�QD3��B�M� A�F�C�����8q<bb�
q	���]��U��#�@$�gDqlB�B<�*��<q4�`����*z��ī�rq�bxb�d��v�a�R��r��x勸�2�q�r>�UL^�X��t3ףF^��S�G!�B�7�zWo������ݑ7C���<v��}	[\�KG�\�K�~�W�>��y�Br�frQ��
�I�D!ߪ�
^�����
���
y���TįR�
^�'XI�B^����N��
��^!������r���r���(��"}�W�N
�Q��
��}���+D�+�*��mU�wO���>ӷ���\�m�*�����!
yg�
��6Wy�6Wy���#� �G�A^�<y-��}���A�R�k���G#��S�O��j�S�]����.F~�R�=��]�_�����λ{w��ӑ�A^��U�WU#�\]�y �P�AB?��J]��"�D�J]�OeY��_��__�ھ|�q�O�Я�ߔ���V��I�c1���g�N�[
)�}��Sə�f�5Y����R�g�ܖn�:f�N�[m�|�!ٖm!�7S�ٳ
�$��7ǘj�=���27�,CZV�Řl�v�>Әf2�0.�� �!GحI1dl2�k��ߌ �+|	]�3�/�l��^�=X��Oh����!�}�d� ҟ�;�~@]���؛�����-�/A ��`��O��=��<
��y�6}R��ڟ8/I��{�D[�ِ�*�Ibf64V��fL֤��&K�n1�9�ͣ�
^�p;��^"�Uw$P�HL1���6Mr�I4ə�V��ٖHۂ��Q�sr�����K���e97�)-4��b��'R�Vs�>ِe0�4Yz�(�!]�7�(�5j����&%&g��r�Ǟb�X6��Ī)qL$I��2%ʵ^�V��WLۿh��%��Y&���!����D��xL�}J��G\b$f�M�4C��9U��zv���\���{Ħ�7ϤςS�h2ڌ�s�7X4�M�S�6C���l�S,�v|���j���ݘ�F��nK��)N��ܟi�uӸ������Q9|�H-o/S�_ь6X�-F����pZ��L���$oiY,�<L�A�F�ƒ���T����2�v7)i]
�r�7Qo�6�eeۭ����Qv��E\ߜQ�|T��`�&��r
w~v�pB�&P�:�w>��V�u�OY6g.l���TF�=�A��^[�!�;ۥ,��=���q�KYe}6u4sBu���tFO�(��Ӈ4��"}S6*˯��w�s��HL�N2�7�&{ffo���5w��m��N|��?ܹ>V(�J/T�U
������T�|����q���,b%�$�X�����B"�-c�k�N6X�жv��w�+�����r���kI?��������^�x?r,��X���U]����\��򪝮zb�k��ӎ�~F�~�H�ܟ����'�\��荲�N�v��bK��a��?4�+�A�<y,����x��杉�Y�?�	�����h�"���$�y
�C;eg�z䯡�0��0�}���O�|�;F�t�Qz��Y����sK}?�p�b�jD�G(G,F�C����՟`z��\D=x�Ot�	&9��(Τ`8����l �b!�d��?�>B���]Ӓ�>�)߁��8�.}&|K�X� ���b�����%����V�?�y�����Hs0��
z�Y�����>���B�\҇���y�v�����T������X��Y���s��r��G�9t���AN[���ҜFlj\M�:hM�#�/Ԫ,�X�%ke��Jd�K���)�g-5
�d6����s.���Y�\�2�0��L�`�L��K8�I\���
5CX6ĥh
�Yڻ{%�[X/�rի,7�N�#�bk�4���ְ��(v�2�X�����ј\v��c3�a���)��>�b08�q�4}�ݠ����Q�cy����m<<
�M�7=�0^t�D�Y��)�>b�qJvtD�h��^{�����LcrX�7ES�,�IO�O4�ҳ�b2����J����P,���PM��!Qp՞DF��Cs�_��w���H��{�=�ȟk�EN�?�sN���O��DZͿ���#��'�zz�3K�-��+W=���׼T���Wֽ�~C�k_��ƛo���y��m�w�����]��{�l�~��'{�}���g�Qq�пy�h��'N~�����g�9����.^���ݕګ�p�ǟ~���˯7~������u�"���=�y���������o+��mڶk����:w	�t�@�={���7�_��
2�Ї�
1R;J�OJN1����ddf���s-V�}^Nn���ytvb���,|��w������1z��q�Q�'DO��;9.~��i�f<�ߴ�����J��z���O��=�s��Iy��F����ȼ
��P����E�r��Z^G��!���E~������b��T!/Wȣb��)�Ą���D10�Cbh�������M)������=�=��lB,A܊X����#����U���7�a��G�El���	Q��1�/b�`�PDb$��Y
�)���6�|�B�"��]�e�刕���]��둓/q<��Q����C�ELD�E,D,F,C,G�@�D�B�F�E�C�G$G�^D_D�@Db�W���͈����%�e���5���E�G��c��&21�D����tC
��n'c-F��QY�>�P9Cz@<+%�Ŀax��"(����nA6ο��$2Qo��`���g�0{�7�ɤd�ɞGF�#���-y4��}�c"�9#�Y�b�ύ��=<�&]v+N�N�!+�`A;A6e��s0�O�a�?y�ĉ�SR��b�8�j&¡�_��P9,+ka�|��)�g���fvB����0�!�+6&@�ӧj����q�<��s=V9��3��Y�E*�s��|iL�xすX|Ibv�٘j��<�����f��NҘ^����5�_�ṛ~f#!B��i͓�8�����O��������nj�#=����-�lw���.���r�WK��Fxc�E�vO$���)���=)�����O#����'��d��V"7+ȓ��Le����	�R�"��F�"�~~d�Q�	l�!����� U�߭���b^���w!�8sEj�b����� sy����Nr1��\���!sW���X{,����uz��ź�t�b�nj\�c�E.֭�#o������XGV���b��K��uo���u~��:�r�b�\r��y�U��:�j��Ȼ"�C.����XY�r�n���\�[T#��i"k���+
r�.1�X���/�P��u�#�D>y,��' �X��B��\�܌7�"��u��!/@���h�E��"/F>y	r�Ω�x�e�' /G.��
䓐W"�B�iȫ�OG^��a�u�E�Z��	�[��H����/r7�����}y Ay3�:��c���'"�r����>���#�y1��K��"/G�J��	��[#��m�W#o��y;��?�!�_�y�/����w�@�Y؋����a?r����?Ȼ	� @�ywQ~�=D����G�K��"���ȃD����G�W�y0���#�<�`�ȇ /B>y	���!E^��!�Uȇ!�E>y=r-r�%�o��#�!D�<y�H�E}##��XQ��lj�F%��xQ��'��F-�y��o�D}#��]�y��o��D}#�.��â��D{G�!ʏ<S��"Q~�ހ"wGn���y1ʽ��"�F^��y%r_���[#�C�F�]��/��5�;#E�y$����kEy�G �G�����7T%�ݑ�!�D^��yro��}�׋� W��"� �@�\�4rw��=�'"�BnF�<��B��{������\䏼R䏼Z䏼N�/n�`��}�w@�A>y(r	o#�{!O@�<]�G�+�#/���xCY*�#/��W
}ȫ�>�B��su-�C��y ���C�Kx�)�#O鑧���sEz��F�H��H�G^"��
f����B�G^%��`����^�G����c��{!D�<T���H!G� �#��B�<W�uX~!G^$8ސ���<�/8�@V!w_��G�y=r=>'�Q����C<�F�k2>Ӧ�<�4
�do`�
��k�#���t��GQH���9�Ͽ�0�^r3r3Ʒ`���c>V|F������pD†��F���7`|Q�O&��D��v����X�<��q{��=����c�lLg�xV�g �9h�|�ۆ��z�0rڟ���%�C�܄�21^6ˑ�k�1��y���`��0B�/tR��ܓ��/����l=F���������ñր�'�o��Uc��T��XY���G�h�ہG��ȍ,�(�#[%E7�b���#�7A�(�]f&���f�>\����c�����:�7R�O�����&��ʅ?l8�)s�B���XYm��|�ey_rԗ��?C�/��'�k`�#��쉖�33�<Z�_*��(ٞy����ϱ�luT�<�F��fZ�X���.�&��=Q.����=,�#�����N�+g���'���^+�[:�;J�;��s�\N+�]�uFe?f0{'��<��{�|^X��	r�v懩w����u��$Vn�]f��i��nS�mx~8�M�rf*�Ņ[��X��2Of�-Jؓ�R��qh�	mq�s�_�y���	GO��s�z�b�#�Y��NF���|���Xo	�y.���y���>���?G;᥋U�+?����y�|���.�?ogᲿ�ۍs:�18b�2Fn�z��w�d�����v��G����y���r
�b�Dܮh���v��vr����0������X\�+��ag�;8j��?Zn?<��r}����ɥ��z�>Y\�M�
�����.~��T.~^�q�'V��b|1i��yw>���;En?E?��-��Y�k�r���O��u�w����Y/oɢe��3�����<�p���<����v�Ӈ+�)V��㏗��S�ڿ���8���N�p�Mw�?F������t�!_�y�0E}O�ˣ�zpM��OV�c�S���?�\x�S;��V���:�Dϫ)�~�(Ɖ�_b�z��"�N�Ey�D�g�����<y1�B�+�#?���W�ˑG^��m���{���,R_��5�#A�W�y�PżI,�_A��\���+�u�Q.(�y<��B����b����/ʇ��gP.ڥ���|U(�u-�g�?�(�X��yD���o�!_%�#�4���#�o�)�qP������WA�����~+(y�/�!ߊ��A�eȟG^���O�	"�%ʃ�k᯿8��B.����Ey��@.�]żl$ʏ	!�V��)�䇄?���@�O�����&��ۄ?���@����j�[�(�������ȿ�G~N��iQ~䟋��}�y�\��y5�b��b}��'�E(�!�<��'/A��n�y�~Ÿ(+
ļ��W�@�j�U��@^�|;�z��:���{����Z1���a�b�6�b�Q��y�H��Ϗ�y�����)���Q�y.rq_ �
�u(�M1O-6�)B��u�y���b��W�S(C����ĺ�
����
�x��ĺ�Z��봘��(+\�<��M����ż�0�(_�\���(j��)�P��A̫�_E�\���ĺ���!��:�t����!_!�+��<y�'��y��KP�������O!�
�:�
��*�#��"�#�G.��:�NE���/��5�K�ź��%��!�ĺ�H�?.��X��rq)ֽ�u1�(���ȋDy�?+�#߀�y��u6e(��b]M{�(��b���*�?���[���C�&��vr�NG���G�L�b݌Xg����?A�|?���ӑ�!�E�/�ȿ�W�3*B�,Q>ǿ��埊�!�X����됿�\�K�����A.���h	��|�ЯX���e�ź��'���:��'�Dy��Q�(�\�&�b]�X�U����ź�!���M�uV�%(OB.�i�u]e(OD.��4�@�za�ǐ�uVb]V=�q�1�Vq����X���"�P��#���<�N�O䛅?��uQ�����|�zɟc���I�;߅���F�y��9ry9ϐ�_�3�<υg)�˖���UȭwqW}6�}q��T����d����L��>~�$���/I�?�x�QΏ�G%��g=|�� �7�y�d��|\7M���I��K�8�^��ܱ�7w0��L�]
n�9�ž����1�ݰ݅'��w�zOr�i
n���|�\��ݴ�~�\>�mr�9���|�ž�r;��-z���z�v���s��J�k��� �nu�iN�S�.�γ�D�Mr�qnv*��(x����]��
�<'}6f���]��硌r~|�0U�����I�~����G�t�����~S����� ��<����u�|��Yn��֙���y�t9>Ϧ��/�4�!|�(���9���(��}��o�4�_|�+C>?2����!|�z�l?�ː��L��&�y�����}�#�̒�#>��ȟ�g9q�B��7W�%��,�M@���Mr���B��ùI�O���V������$�Lv~d����[\�Y�G̫�Cpq�.�H>Om�������X��y�ù�<�[���ym�\|^�ꔞ�
�
b~�Y>G!79Y$�|.k��r~�q��:�;_�x�67���Ɵ���<�?rX�v�<�;���6�<�]_�e�z=��}�E�6����v9>_'`�뇷�]��������d�����>_@����\��%~�l�Yr���*���92���/5ͧ�l���G��qh�?��V�뻁�3�۳e�Y���N�)�o�8p����o���c羧
���'���t[۾g�I�U�z�s��i�;���giYֳY�~��\��HJ��ɇ�7���c_�>������F��tg��s|>J�P?7՘�{��;m����xBF+���#vn^С�
ݑe�6?r�^�X�u�mQt @���3S6ޫ�qv˖Y_����-��G��v��W��V&�惍]}�}�~ӊ���0��Н��}6�{�:��%��2��!%4z�/�?�U��}��O�����˫lmg��x����A�'�����L�$�1�1�Nc����O�b�_�{��vWǯ�n�m��`��z[7��n�{���ͯ����3S�����Ɵ�ye��4���Ϸ�X=a�%w�(x�_7*����|��_ZOo�&���G���g�w
}�|���%{rޘ����}s�^��ϥퟦ	X=l�P�W�F�ǟ�i~8��Wk�ښ�ھ�痁s[O������c➠Oþ�CUn�,y����7o��s��yKKC�vտg}�*b�у/�����׽�+Y��;lH7��ڍ����,�;!�}o�G��#խ~�4����_�z���s����ƅ����:��7�$���=#��_h7�ˌa���{f�z옉�>o~s{��Ϸ���k�
[��C����Oo�1o�ssc����ݓ��r��խv��ݽ5G�vja֨7:M|��s�Wόk�~̡ʹE�kN�M�8j��윉=���Ͷ�0u����7��S?�';��w�����}��+[�>�m�Aqm��+S���s��s�����c�n��l�h�K>�#��
�8)+�e�_M�<���/��!�֜��e{p�8M�5ǎ���/��,)O���#ƝKG�u�;f�/!a�z�oo��=����~������|��/��/���o��U�ޯN�q2fNÐ��LKk��ݡ�A���8�َ�>2�������ql�%���Oi�����co�o|qo�ޝ|���WU�z�g�
_�bmɿ&��W�«���o��[�"/o[�<�ʿ^�5�ꩵ��Z��pf����{Ο������Wt����Ƿn�/�2��_~�૫�[w,h�x:8��h����o��PIt󿸜TV;���rї�M]�;���'?�+a��2���D�=tp�[�gˣ�^�?8�X�;W�e=�vi�cU����<wÞ�y1n�k$�׼v����5�\9=��k�I9�/��vF�s	�FMhۭ��%3�WzƧ�O~��f{߾d|�vАb��g��=�e@�o"�Z�[�-��N��R�,�����	�?�v�L�k+��xլ�iRZ�
m�z����[j]�i��_�3��Q�-w��̓��·�w������;�;�[��CW^���m�+�l^��q^c��k{��゙����L�w���oBe����i�n{wZEf�W_}�시9r�'�o=7�����u�t�kј�s�6�Z}A��W�`D
��=���'��}C��kKn��;&�z�z�
��>�׆����������e�jFZ?�e삢$�ʖ]�f�{����&v�s[�>|��>^�s����b:!��.����_��62�[+Ӳ�oV���_�l�W<��So[���i��n�Ϙ_v6�6n�嘿�{�s�'Nm��cҳ�]�s��.�$y��k��/��w��ؘSM����~;1w���,L��1���_W�h�ڸ:�ZҲg���4»`��o<��3�v
�0<,��י�+�$��~|)�~��3Ϝ�~P�>�n��k���վ�Y��m];t���{���=*�ףo����lZ<s���!O�~���֟���>�m��>��u���~�Z�k���ӳ>|��6�;[�m�wǟ�4�?��p�n�-{�g����	�6h�E�s�<uanQ�+_y%O�|{Ɏ�}}�*�ηc�<׽u�m�x����9��C?�3���W��~�b�w��_Q��px��m.��V�G˼��C�J�{aO�֗�u𖎗_�n��fT�
�_|u����䠏�{�~�+�~M�K��7oӵo��9��6?�Ժ�z�S�>�s���gʺ����LQ�g���ŶG��5}6�¡��V������I	۷�૗�F��p%c���g�̋Z������u��Gy����Ǚ$�һgc�0�K^[?f��bʊ[�?�>��,ܔ|z�ᙻ�\��:S?�@�o>xq��1�_��r���'�=�l��U>0���GGL{0�R��9i��E}�����/]�4'�f��u����Z�W[�=�=rx���Q���
���_�>{���}W�D>�ڋ��[N�~���#{}<��~g�ۋ�~���ȣY���tYL6�CU��A�^DroA$?"5�'�f]�ʳQ����zq��7�H��Gܛ?B�}����N<Z,&���H���I3�OH�VG�g�j���l�!�[�K���]���n����,y�H�Œ��{$�'$�?I�;z��w�jޙ�#�ٴ�\��)^"]xK������y�Ck��9��?(N�[~�#FŌ&�GI�J6-U�x��[C�w0<�.��u�1�z����>a���r��q/~�x��x���.���?w��b����Q���{�R,�z%��J;�xX��_�e��~�_�?�·u�������%_3���N1^�=�Ak�_=�4�?�+�k��0�����?0,�c�Y~g�,ݜ�u�sW��g�v0,��Q�µ�ՖO��u���?�a�w��f�����G�V_-g�9�y���aX^��D�i��+;נ��71$UWj��.3���:�6�Ū�V���NLG��7��-���HS�k�^�a��j_�xJ_U�6$�o��I�X��f�W��Μ�����Ѳ�ڳo�X��lm�t"�I����ǝ�����ˍ�ޙ��GV,�Ն���5�F��h�{��'k�ye����dh㦾�l���=;�V<�צ�<O|eІw=��+Yڔv1E+�Yڡ���:�8U{ffm��/j��wﵫ���/�^vߚ��$���6�<��97ƭ���;/Lߗ�MZ��/���o�?��]�Y�q3o�8<;U�\�z��ڜ�c��]���?��#�ėJ����jS~.��N�������s���'�G���}jֻך혭M������hߘ�ᯈ��j�L�ѝ}4���:�K��D���W�}��I�Of6LK�>|md��l�=�8|�'i�Q�?txgi�6�7K��K֮���d�?�;qa]�6���MK�F�#�vq�v���Y���E?�h��R}�-����+���^��-��I��^��]�vj��3�	Z������7��4i3����� �k!�>�t�n5X
�"��2�`����ٹS�Y�l�-��p��˞��8�����f�UTÞ�5l%��W�I����1}ŁI�����
4��7fR4�lM��`�r
�v��l�SM�= O5�R4z�Fo��)���b�g览�ޔ�j�΂\�]	[IJE0�$��c1��w[M�藺Q��m|v�&T�]%5��h9�hJͶdq�\���Gߏ�q�r��fs�,}�V[
x�h���?0�Cu�X<��=�M�r�tW_
�!D�F�
��)�Q�ثac�|�]
�Ez@J+�0`�;?��M6Kv�&]oJ�4X�*����6
{Grv�A���1����яНL���g�[����L�<Y>&�lH�qͼ��ެ,�B��Z~���U/�͚nH�C`��d��imRON���_G�ѧڠD��ۭ��IFS�i^/�X�>����l}�����G�RJߥ�m��s��6{���ƌ�F��[�l6�d!Zy�S���s��tږ�6��)��e�T����������Y�]�N1���Gc�RӦN�x��z�};	+mE��ߵ�133;�*��3��tM����gI��
�j
�G3�jYf[^��/	�6&=݃WO�փ��9%ː�ͷ�"����&���F�q�9����4tX����T.2:.H׼��Y����Au �S��4T"�=��ϛ�u�.5.��.{�����&�������X��'(5��5�g{�q�O�/bج�pi�Κ']ެXK6}ێu��H_�3;�����&<+ΐi�[
�r��[���Sļ�I�X�J�̎��Mߩṱ�͐KG��]��*q�=�
i���^<,�N%�Ȣ�1����"�Kl]q����T�3ԂG�M���<|a4��5�-eԸ�E����0��W�P�w��|�k<�G�KX,�#�u��E�0�,��/�F�u
c��]¦0}�a,^!�Ձ��Y����&x����$�y���*��bK�΋K�]�f�J�æ�x�U�,��+��#����b�Ȱ�F�@�'0�-k�T9�5[�Cߓ}��Ɨ�� Ox�����w��Ў����oV����!_EbU�F�%�{[��XE*&�aίN�GGgRtaѥK��+�,�p�ҥv����Ԕ�K��\*}V"e


N�:��H��*TO�
+�b_T��/�Z{�\��]�� ��<��_XTs�ѩ=���԰u��O֐`��
���NJԞt�;��'+w��*-����C��F�>EN�tӵ��ͥ��Lu����y��k��;���۳�k.�����n5]�{[�ޏĪ��Ow�:G��>�,��������t--�'+g>Qը�8��K@W�}D�v�{�!��%�5}k������tG;�P�C��#{](��v��ಃ�%��5.��
�p��`3Z�Ky]�@]@Y�3�;�Z?���c	y�yރ�Y����A}ug�ym����!d�$�~b������S���k�{6�x��=׉���9���Í?|`<���F;7R�������(Sh��̿���}��Sσ�;�%�X�&���3�
�s%d�M����<:y����+k��}�%d|��/(k3,�tf�p96���XIH�Я�=׉?����vz����A�����cr}���Ep])r��m��o�Ε��v�jƃoG1�x�8��x'�M��C@Be�p�jY\�z��|�����zWU�IH|F`������p�Q�|�l�8�:*��=�6���w;��Cނ���q4��?��w�>��%f�O�<�|(��.�)A�1M��{���x~�|���+���sg���g��	�
�3@Q�j���%��é��:��|�9(�jǟ��j�S�t/6G>Ǡ�W;�_Áu��~Ц���m��)�;�/����+pɽ�wR�sA��I���|G��qȭ`��&�m���}1q�@��z����A��K�F�D���O��'��j�Y�17��s�.���8�R �_��ɺ�@C�u���}y8�V���s��gyT��7�s�Xc}S�op#�\f{��O�3\�}�0y{x��i��Mk����{I?I��a(W9����=���l��p�[\���<� ��п�G�<J�J�|bW7}~�����1c������r9�h��i �>��� � o�hC�C$��;���[Kd�I�Û��GI�>%�����`�iYLu����{�1چO#����>er@�5�U��B�k�P�[�=�Ʋ0G{����ש���j�rM�ѵ�%�7ZtE�/�>oB�<�X
�}LS�C���x��6E����T^�OI����-$D�?�ӹ�g����K�y?mNm��g��E��>U�>l����<C�o3z-]����}�1D�{��~���Ɉ7Y�:�1z���ju�#��*6J��)�k+���;}ޡGb8�,�\�%��K��"��������111q	����'/"�@T��1Ě�s��"�A\�hF��8��E�ѯ�@�p��y���Kw!~�X�x�D��1�QD3��B�M� A�F�C�����8q<bb�
q	���]��U��#�@$�g�����G�B<�*��<q4�`����*U��x:k7G�R������[D�ɚ�i��Y2#�����Q�)���I���$�}2�=iTV��O�ޖ>�S\�SlBNK�h�l�4�h2L'ǹ])<2�e��jL3�w�e;� 6wbv�=��3��l�p~��SYf�59�1]o��Ͷ�Mi�L\�6ўi3���S��S�zy[ˌ��4H��ڢ�V�#�C��l=ؚd�[� >�>&�,%��Vc-�S��(��[,�m���^1��mW�k��RR,l��$���X�ؐg��J�Z���l����F2���o'#)��#�S�[i'���-���b
��κa�Lf�-��`�:�hJ���;��&��;ڳ�x١�Ͷ:yr)�k�N�'�IhUA3HbM��d<ΐ�=�Ul�ِ<�L��m�1�#����F��y+�5XX�2%"��&�����e,jT
��:����U���6C�@
�2��7���x^|��j��$�Dkp��O����M6�i��T4�\G��U6w��eN5�w�}����:��&�����6H���{Uo�$���T�����ݢ
�y��2��^���F�kߕ�f���V�\@�q��c�\m��
#~ͦ�Vm��O��3\�֗��mN��!�'6�HJ_/x���(H�1k0R�v��1sGF���Y�ѦKfJ�7M�Ր�S�z(���zx�2�6P�T��#0�׻��B��9�'��I�������#�������}k�XY���,,Ɛ˂���ݢ�`�1���pJ�]�7a���D�O3�~��<K{]r�CttS��ޏ���1��͢��V֏4&jC��I0Mo1ҩ��d���bG�}B^�k��S�����.�r��$�
zj��Sx	'�ڋ�����}�3��幧LJ孰os�F�t�x>��>�|���x��v�;B���C�4%��*��tի��X��8޳������?�Rnx�G�i�C�|����$��3>�lwu�<\���i+�����w˕GlT����?��93��Q���]��?}�6yp����ݴ�O��_���M�8��k���z�P��7I��r��W���y��"7{
7�Z���E��K ���ϼ�iB��;u���a�0� �э5;��k7�l2����ط��9��
�}f�����:W}�����o�<�_�O�q
��>�����s��w�zl��L�hF���^vt'�����YERC̀:�����V�<����<�Vn��i���<�"�B`b;B:����0���m�,`�:�X������5�п݃蒔ۅ��C@���$
�R�*��:�:�Įt/�TU-�d��-�;!-$�[d:�WM�/���T�^��I�'I���V��*Mo�w����~������z8��/�.a
H���'��I=r�A�$P� ^=��٩f�Cx�^X<p(����P� ���A�.D/��ҽ<�Rn(�CS/��r}աt��$��0^��at�D��at�P(�p�-���F�dF�s����at�����ѽ۪I-�-�_��+G�̇���ƶR�2���JFs��FS�U��1t����⇎���$�x���U��(B*!�`�{3U���)���N����*��&��1��'ӽD�I`W�VUG�^#��R�B�нv�R��_�2��7��yA
���C�1��t:mIRyԫtI��A���&��t��j���"����s��L3�cd2�10�����
t�Ua*G]ԋ*I�7��0��K���0��T��Xd?��U�VBR �����T���~W]���s,[@���K�鞣ɪ��i>���|�O�U�b��T�$����!���f	��?C��MQU>C�TE�B}�K�q�[N�Z�g�^��R�s�>.I�+h�C�,��t��K�����\�j/|��W�Z�z�/�=)�I1`��ի		��@7�����gUk�$%�B��+��W�^zI�����U��h�TTL�y���g�/��S���h@�A)=��6�v�$žA��K��ߠz
��7i~5R)`1����/��r�Y��o�=�.J��y;)�L�x�z���s��5�R�V�_/En��-��zݻB{�N�������Y2�ž��C���7Q��I瘫I�N~���d�\��v��j'�O軼�*z������zQ������0�f7p�+n�e�\mvŭn/?ob��:3�7�b�X�_����dU���\��7�䯺�V�9}5��-���JB{s��x���$�Y�Q^��J�'��*�]`�1ڎ.I��x���i��H��y���R�W�_�z���gz�5m�F��S4^�Tu��[�Yű���
��4�{�Ty�ǯ8C��KR�7T�x�)?�`����w�z;G�ITU�����y_/�.�����z@�W�\w��g�T�;Z_�R�/<���7���+��=��U��4>���|JT�^���|�[��<��?��o�x;���z�#���T�#�W��P@�tIU�3��Ԏ��T!��r3��F���*��p���rI=�R���������Bx$ܝG�nө8��h}�u��^w.�*����D>�r��$�@�Kd)���C")��=%b,���S�!�%RD�}��h)�]���	���'A��WiZKP�IR	`w/k+�6���%r
���O�HW���pߎ\�^:K���s	�7��΢黁=��H�.�|�`��v�X���!�y}I*�A�u��D�!~bo}uA���:���Ob��R#�~��D��5�/A���o��;��N�0=�=�H��P�H
�ӵ(�]��[2X":��8�ꯖ�P�l^9���w�T����i%�H�t�	 ������TF������(�����w<ԗ��fe1�N��-�)0�'K�^�~��%�,���FRO;@^?���(�n�����~M�Į����PN�2�D��s%��T�D��/�.�u��[���k m��yT�#A�(En��h.�HW>_b�%�Ǩ?��4@9�LX$���7���'%r�V<%��i��z����ߩ�I�H��D�@8]��p�N����Àtݰ�k�I��؄Hׯ��uA��G�g�p����DħKP^�X��t-E�V���"��%j]���kNl����;�G2n�����V#��v;N�t�w����#�����4} ݯB
�
]O�����t}v���#�_ȥ7N��o$��[�H8=J���M�W6^�Dx]�wO2�p�&�5M��4Nߣ�S���:�C��s�ɞ�%�v�F`�+��pp�j��pp���:x�!����GU�U�(�v�/:�"��lk�U"N�9���GƍG�O�N�F#���B���_>)**"o��ٳg)//'�N�"w��!8���"��̇�<��CZ~��s�ѣ
?������`��s��[G��/��>� ���sr(�=z��a�������V*��,�S_��
�#�9����SSoq���hj��/����L�E9�rz@�'�~�3�`�>�9���?O���ohX~�05
¨}���<�w*g�/����ÿS�߉�ne�~�l�{��P�T�uնE��c@���~z`���G!Ƴ�]�[o��#0^���Mݶfq�¯��h���l^�?����旳�GnO�[��i|���u�
L�OU�r1��U\��3��H��br+���j��Q��>n��	祥�H�9ݨ&>O��!�H�q��'|Z�'���s_l���L&N�H������]�xaa!ټy3ٵkk�_�5�|������g-�pޖ��Ik�1�c
��%O�yojF6y�(uoC�{�
-!㉟~��|yb��

�.<xy�ԩ{S�o��1~�ݳ_�k�̩��
���=��۳������?�(%�?F��
��
�
?��?-����t�O��=�ѣ�ӧ			!#G�$aaa$**��n���dڴidƌ�G!���%iiidΜ9$++�X,�,\���fE��I�}|8y2my6#���#�Xt��E�ȶ�(�vQy�?_9�T��A?i }?m >o �4�!�Ȉ#
d֗
$�d�p��L>�@��z��̼�@��Hҵ�h�"�t�R�j�*��K/��_~��[���7�x��oii)ٽ{7��>��#rb)Y|���k �}�9x� ���/ɱc��ɓ'ə3gȷ�~K~�\EN��@.\����իWɍ��'�n6���:����BU�����.���n���~���?2�a��0��5�%E
���w�Ɇc�?%m }7H�GB�hH?ҧ��}�[�e�~����!�qH_㔾'��A��!�
ү��oC�O!�1H_��A�K��*���O���A[�	�\�Wr����Ix�i�@��Lj�����j�2���'��PR0'�L
$I�"�z@�B	"8`9���G�^�03�̅{4SJS4{�(j)�%�i&������l<�����۵=��s��k^k�u8G�k�ߨ�y
��cxN`��2|��X�����b��_��~?���q��:�����߁���s2D�?(4��b���y����j�J�ҕm�'�L�l�Ô�����AS���нO*4�E��lRhc�B��h�u?��'0�#���yoa��~ÿ��<����������Ry��<��G��#|�#�w&�A������I�q
)?m$�}���Q�?��2�<��e��oc�����2�a�?���T9p����=�/����c>��g3�j��1�N��Dߴ%������А��c�&����ǧ�Ƴ!��QQ���a��!�	�|}��?��!<�O�Q�!<<��.?^����	����#�B�CC��}���T�G��C�C���x
���l�E$�c�ew�wׄ�]#���5�<~ttTpt��]n���|��zA��pXt�m]���:/p��c$��O��]��=F\�/.�|X8Ά���~��ڄ�����Cb��N�n���O7�tS�	��cD��5� l�������蘈�M.����1��1�1���v�z��0Aq�&��\K�T�����a�DD�"����B� =P��1��ץK���|°�<�=|��q�
�χuj�)�c`Dtxsy\A���#CB�jөm`pBLBLT���|o�6$4,�z���'������	#������9�1�1��Hχ8�}�?D�ɰP��!C��.�OH
�8�c���cXF�
�8B.�8�����q>,��U��J�Lc��b�G��)�v|W���<"&���9����i�}��QQMO���gE��:��f|fMT�H��Jt��v��rIC���ZN$*�M>����l.����s-�)2��4i��G'�o�=
��*��JAf��yY�R��bex���"�wԕ3d���S֭[��_�^1���b���/�,��^{M�
U*�8�(�\aϞ=�| r�cG�(G�U�;��<yR���o��?-r�s��)������GR6�}�h�l@Ot�9б]�O�@���3
6�;�fe�P�*e6P��ae#�]��瀈B]�;~��>��0�l�_���~ÿ������)�W��^�nݺ�[Zn/���'  �m���ͻ[�=�:v����V�>}|�t����f�ޭg/__���W����O���;t�:�|��{�������:�_�Oϛ���:��ͻk��==;�o��~�:u���n�o�ѳ~��qK;�v>h��o���}]�vc����}��s[��|�An��<��?���������{�����u�{�z�t�������&^�_��C�5�/H����s��%��l+v°��A��*_���ݮ��K���ңG0���۾}{<'�=��SG��	�&��$ǯUk��{��.T�����mذ�~�;�N�>��w�}�5Ǟ��N�:��#gϞ=���c���[o=����?z���&ou��|��A���۷/^�^ul��yO�2%x7�|ۡC���u4�ܹ����k�xJ�9r�x�M8�4������aZ�ؿ�K�v�Z���@Nx
s�Y�r�v|�Y=�ן���]���744���^��Z�oe~�eijh�>�/�c��������QEE��������W_Quu5�۷O\��1�ٰq��E[�n]�)[����'fdd�����r^
��J[��]�^�jՃw�ux��q��3g��2kz��5�y�w��	���l��޽{��?x�|�\[[K�~����d�GY��~���
�w��u?��3���g>��W����#<�O�����P�!�W�?�S����A�쐉�_�!?��N��scg�7v���W��o������:�4�޽[����O�����8�&؆����6 !7�`�}�]�?d�O��o�ɻ]���¿_�y�Ữ�����!��AAA}�����ߧm۶˜8g6�Co������J�JMM����o���m��(������M�&��.���D��!*>Nt�l+�/���;v��ݻ�P����_B�������������3x~_�h��?dl��(� �~?Ѩ�D��#\�4�!��4�}���5���D.\x��_ğ}}c��KY�~5v;���9��������e0�]�����CD�/M�G���4�*���G�����.�
,���\�G��9:�w�2��@��wy�&���������2�#����75.�S�����a.�?��������e"�|�,�W�
Ilz��]�#�m�D�0
Ѭ���hSM4�}
�lw�&��y�/^ӧO��,�<�|Kst@�/�_�?�#.~F�⎱���ψ��������}��K��O?Ǚ&4�.�hN&����/�оWדua4�0;����H<��}_�[K>V�uf���]���w�˞lw�4{�.�?�y��!C|؟���w:���kw:$-�u�ё�6S��d�;�^�+h@{��Tb�M`�"?��3hP�y |��>�z2
=*\��������i������@������~�*��F���6����LZ�χ��x���G]4H{
Ҟ���|��h`��^e���|�������!��I:$-���R���'_YB�O��b���4���:M�x�i�#���˞ᓢ?�hϠA�3h����M�;��3�γ;h�ݝ��lD҂�u�ڴp$�>>�����yc�\�	:��a��L�ƞ�U{9��IA���I�LC�m�%�?����9�
���#t4 瑴�7�Z����-r��rFЖ�#h#�P�4ؙ��kg���ߴ��|�t��L��=�9���񇿐�?r�Ⱦ���W�
܀������M�*�6�˂�U���#�|�(r2
�O�Ik�Bh�c���F�g�ђi������CՂm�1P�1.�?�{���O�^8'�
{�R&����4B���K�3
L��EL��4�T֪4䃆GCie
�0=�O�4��'���C�l^��3ÐG���vr8��Hv�LZ��_���_J�]ˇ��L���LC�j��Iƹci}�X*��g����z�ix�iX�4,b��s��h������+@˓O>IN�S��:$-���2�^1�*��mL��g�>Iڳ�}ҋ���|����4�1
O1
e=Z�.�O
��/�l����F���_nnn#
�t�D˯�^�/v�@o���˃h�jϛ4�lQiX���w֣��BhU��4�cp|��}��"������
�s�]s�F����\a���ŋ��u9���r_c5��)m�1`�S�٭����>22r���"�{!�Y�j͛7�����hI&h�I��ž��f�̥ڭ�S~~�.�����K			d�Z	q9++��̙C�W�v��g�	��\�9Z�7b|r!�X������҅�y�a��h�2�X��s>����߾}{'�u�,�0`���ӧ�O�6�$�Q!��D'N�ɓ'���7z����g��`}|Abℤk�
=D,�{������<�c�w1ǘ��1`��I/d��ˮ�F��*&&f)�u}
������+N�a�s���Ml��w�}���|�M���BFR��<@t��u��6-�堵�"7{~o���Z�<#F�xv�ڵbs��L999G�z��~�������v� �;-��)96|�����s|v��ώEa��3��w��s���[��PPP@+V�8�f�Z�lٹ|�fΜ)���J�K�v:��p�{���{�h�
�#���oȑ ;��Lc��<����222�<�����_tش����4�|!���#���_�bm�#�6{p�w�l���g�
��`[��%�ҥK?��FGG�…�@�

���x�;dd
r݋��k�=��:ڴ���
׳/�{�޽�m޼��!��&:t	��
xa�y�ܹ�~���H�����p0�t4�[�6�z��?���"������^=l�0��
��믿.h�o�!hHJJ�	&ݲX,�<�g�
;�����M�?ȵa��ƅf��qVx{{�Y�={��)��O���y����+:֋��eK�[�ba,ob}:�K��?
��oڴ�JKKE,++p�5�}��#2����������ߐ����=��;�
G�y�fYOE.���&|+ۺ�o�5�o����%d=���>c\��@<gz���Ͷ�C���juX��
tA�`+W�$�Y"Nkp�0�3�Eh���Ё;�ڰa�
�]wݕ�ވ����+@����~�q���bm3{��F���@�K�9l�7�_9ߛ�����N��c衇�������]�w��.�#�׮�7p�k׿{򠗈A�C����!i�o�l�B/���gi��[��#o�w茬��,lӦͿ�{#�ڸ��a��MK2A7t�z�|�[�E����*��w��/���W�WK��=OY��l�� kr�|j	�A���s\��i�\K�$���u9t����׿��`��w�;`}�\C���O���?�������<ƚ���.�����c��u
��Z�.���w�/�y�o>�F�:��o�#Ա�W�]c����?�7ẃ���G�F9\vΟAiG�ϟ_�(���#���6��C=*����6�f��Xy-�_��u�P�m�c;��I=�P���q�z$��Ǧ��S���vjo���+b�����ϻ�����K5��͹o �����{9�g��۰q�rn<��QO1�g
D�Et�ذ���]o=��.-�Z��m�v8��f�M7��q�y���7엾e��	��&�m�À�?�p�qz�1W�{���R�r?<C��{��=b��Z��v��f��A[O����s5�����o���Q3E�u.�W�'��؏�U�ЪZo��e˖%=��q�������E���e���>�M��X/D��N�i���=y��.7?��M�£r}�u.�E
��5�&mC��]�>��6�7�uѤ�v�1����{�įS�?���qb3O�|�Q�	W�t�QW�W�?��GԇPg�Ǐ��d�^�&q����G\��M{`�ƞ���/'\uO�ۄ>ָjm��@Q�B�u���Ur~�q^�/Z��Qm�[�8"�.]&����}D���~|��>��
j}�1A�_w�9?�m�Խ�\����y�k?�����8@���1X��V�ѭN'��uR�ڵk�x`n�9�h��aO��	oy>�5�?e2.c��jm�	�;��#�X�`A��%K��^��M�4쯣�T��Pg�~(�5&�6�����S]��e����k���ׂ�k�������ޅZ�4�7.��⨯�6!j\���s������9٪U��^|��8�"���A7pp�oNuCԫ���P��7����#��$�7�M�Q���?l���Og����`]��x�^�����G��`�\�_�hlu���:�4��<�C�����v��_[g����Ռ�.5��V0��Z����a���~:饗^�Cm�8��jy� �/�p
����/�Ds��ѵf�?r���\�2
|x�g�߃�E��.��Ḙ�9}w�C:u� ۄ�>�i���4?b
�9��c}Ŷظ��^���,�\K��>��_���s.���`�f�?���?..���`���tjj*=��Sb}��/���o��}B�W���{�>���M�̠��]"�;v�`�^�t,^�x�#�<�V`` =��cb8//O�]ȵx�#�/�m?�c2���n���
0�>�{�D�G]�%γhʔ)��K�5��F�qyo%���[��?���j��7������a��ق���F"u@�!K}�8qa�̙3X��8G�vc��5U�y�����/�x�G�}�d�����z�.�P�#"��~f~>�cm�)�'�k=�?�@n~c/:��t�5`�:d�8�^�o�gϝ;w>���F!����IF�1N��!g�0c��{�G�&��d}�Ao���}��6m2*��Bk���?˗/�aO1>���~XԘa�
<�{�ȗQSA��4�xs7�ヌ�ݓ@<�������}E������]��b~�þF����9�ƍi���b��{N��x�s��1����%�+sp؞�K�j�ںu��O�j�n��5{��3�}�syy9���b���?�چ�5������d��#'�֣��ޢ_�ov��������W���vu�ē�a�K�c}۰a�f��t�}�wV���6����q:��y�Y����w��z��e0v���y�9�M�£��k�.��cԲ���bm}-�5��O]�As~��j��ǵ�i�p2��6_��k̈́�t?�5C�j�+����&�D�\0�k
���߅�sܷ�7���������Z3˕NU�NX?b����*��VZ�x�֊59p��cޢ�Q"�9�k�ug]c`-���~X�a���N�0ȩ�7��0�_��l1����ŵ��}��?�	1Hރ����o!�C��\�.��W�1��d< �x@Թ����=Fڒ3F�'��#oǺk�E�����ٙ/�֭� �A]
������ջ�E޿hjc�
b_�8.������m��t����'�PM����CO!�I�&	��OC���6Ѧe�����w^+�+~ǎ"W���o#�<�O���3b�V�q����'	c!Nb~�#�06�2�%Zx�i�q�Ԋ@b6���u6b��={���-n��⮴Q��B�״S{'�St:/�'<��o.�����O����(x{���k�+��.�'��U�ԉ�ݠ^�O]k�x�A��LV��e�R&*��(�wF{��ӿ����!�<��^��o�NXOV�(�J������R��J2���LWf�5��@%���C�Fq�=�C���פ)J_���I³Z�ؓy$��h:e����LUR�{&�r��%>��E��ǒs�s��+3�߃��g1dkƌP���T�u�{D\�v��^3~��:K3� e���8D�Ȳ�|�#�O�gj(���q��l�Q�_?�?�W�3�P1�1��(���d:L���+�W��m�:N����/��8��g,��R��S�������w�fs����e6�a؄G��g>=���IM�����Gg����K��J��>�w�@_]r��Y�R�g��������$�OK�9+=y���,��7w��������: =k�����YSS�Ӓ���N͜�5k��Sg��L�J8o��.-)=uzr֜8�l<�N7zN��,�rGu4�ˌ6�G�1dV�Թ��s������sy��i����Rg&�H�j<�=�͠x�ڄ�y�3u3��ߤ���y�K����M
������43+�Wpq��K�2:�	N���$����O����(�^f?s�9Ȭ7G��)�s���l0��+���Zs�Y�xYt�@��kI�dXr,����Ri���Z�-��˪�Z��Xk�5Úcͷ���Jk���ZoUl^6�-Ц���m�[��`+�Uڪm��z�R�U�+,��&f��
�+�k�9`�u�@��kO�g�s�v���^i������J�W��(�H_[�X�Q�S�_d(*/�,�.�-�/R���uŁ��������bC�";�.l*�*ƨ�q��50V���7c�ǸE��0nٌ]n�R��sz�~<o��s���)<6c��8)�ᳵ�ݓ��f:��� �%���gzR��l���)i��vdC��)�`������)m`Z=�Zo��OP�4�3�)Lw6S�˴0����������������b����rx;t?G�#ȡwD:b�DG�#Ñ��q�:�����������2<D������m�3"
�C�!�P`�*U�C����i�6�����xc�1ۘk,0ڍ�*c����`�4y��LA�HS�)Ŕm�5��
S���Tgj0y��YO�XG�YG�͹��vs���\c�37�=-�?K�%�oI�d[r-���Re���Y,�Vo��5�i���X������Za���X�
VO����d����Rlٶ\[���:Q�m�dM�+R� �u���^XQXUXSXW�P�ɲ�c�F�LSX���N�+�U��l�ݓe���dY��sY�v�_ˮ����2�+byų��YN,�
�O
˦�ؓ����di��$rY
vG���Q�s48<��N?g�3��Lqf;s�N���Y�q�9��%�%~%A%�%�%)%�%�%%���������E<�X5���r֔j֒z�/֎@֌X֊ֈ|��Q�tT;j�����9�zg�3љ��q�;
�rg���Y�w*%^%���}IlIbIFINI~������������D)�*Օ��KcKK3JsJ�K
�奕�ե����J�W��,�L_[�X�Q�S�_f(+/�,�.�-�/�C����^�!Р7�
�C>/��
��jC��ޠ��:c�Qo�5&3�9�|��Xn�4Vk��F��eҙMzS�)єa�1��rS���Tk�7�o��o�ͱ�53�9�5�7�L<��$)|�ޮ��IG�!���c��c�Ja[*g[�d;R,�yw_�?��Ӯe�/PKE��Tƺ�1��pip/_vendor/distlib/w64.exe�y|U�ܝ�N:�,
a�Di�h��&6h�tK�t$
(� h4��Ȅj�0�Ms�g��qgs�y>u��9dA1!���P	�PM��-	[�;���NX�����骻o��s+�ǫM��d�?]7�*M�_�����_���L��o�����r����,J[X���E�?�V�O~��SiE���=�4ϴ�iϿ��S�$''��:>z��9w�'�tų=g�y��Gzv�sVϫ�\�s	��J�9MyO����g�����3�H_�&ӓ�Ě�������
���
��c����S`6�1&�
L�O��I�|L��D
EW�/{5e�4���e��tf:<��&kb�fӓЁ��&ӈ��Z�v,?�|���R���ct�n�<O��4'�7�����4�_^�/��³�2D����`�jnY�3�a��$x��*_�-E��
����4�w\+�S^����Xa�h���7��g���ʚ�����/}�鎼`nJ^pj�􇥒c��d����&)s�,ue�1�j�m_(7E
�]��d=S��W��z	%�q	��3�˷A��U��n���I!�K��Yw��<A�x#C"E�z�d�F�C�[0[h�+C�r�̦̦�kl%�Pap�+Mo��םwB���8+�e�
�c��/c�/��<{�(=����#�����<��w,k�6�����<�5�E
�v٥��r<,)�Ҙ-�GP+;/��������|QX��cM���p �Ф��l�n�|[E��'x���Z_:d�d_�Z$&��$V'�ٮIِ6�O;)vc�8C�)>$>,�c�n�����'.`ם'Cա�,o��SY��Ț�j m'd^�U���� O���lU�o����R��/��1��"d+�EA��ͬa{Ԫ�qXl�˼�jƊ����W^ĶH�E=L���PGBOڱ�A���@��/��d�~fr-�7+۬.�ۅFQ\(����F�V�c{`��E�a��X)�����dm���k��к�v�����1�y,��=Poh2�0����#���=&�wC�[�y�~V�A�z*M$4��<5�����B��T���-�}�bm�����8vB��W��h���]�{Q���N���_
*lŐ\(f[䄼���f�c�h�$���lW��m�G3|l��(��!q���8G�=������̇P3`󰓡�oAh��N3~�d��x�
wtYb�3�0�X)���Y�pQ�PZ
��m��s|����9Kݜ�k�AA֦V�R�RXs�����GS��a��\�`^�U��F���55J�����lW~�ix�4j#알���*�Ɩ5�N�YvH,�ӻ�&e��;�}�<Qʆ�u�9��6�`�`����M���p8~׼H��1�%?�Əa�I�,�ͧ_�$��x�!�e����?i�D��ݴA�tS{�� ��R�=�f�$�����@X:��l�n>
��>���^��}8_�(�;&`묳���V�Zy<*飿��;�4���/��������qud*�X���p�|ikT'�@hU�J�f��mj���E5K�,�R�Rp! ��iMa��D������[��!)C
PD�:�G�S��URt] �/�S�[(�_�@(���ۄ�1�M�
B���J��KU'ԧ;�9�:o~��Ή:C�v�y�^�[������qt`tP����s_�m>�WGf�Qg?(�Ǿ��/bʗ�r�Rδa�a��#�$�הr�R��!��ڎ�	(z��{ �ye��>�.�;wC�hc�*˾�)C��7��,n�]�)����XNw��3���
�#�.	�L�Ė�f�r<Q��0�~Dg�л��l����w7�sY{<��|۴�
�9���qY�6�m6!>���%MA�T�k���G& dˀX��� 	,�C@��
�дn-��m;��E���]fSIr�4eP%�]F%�S�M��	��Z�
d���a�󘱹u�Hh���)��
c�G�1��Aw:�`�;�4�M]zi����1�:�M}������ͪ����@;B��o�>	|$WTJ�9@�	ۥ&�(��g�w�#&�zQ	 �I\I�D�wΜ�;_�m2�J�P;gB��
2[=A?bY�+�
�	�y~�e���|�uCf��k|���mkы���T�*Iw�{�M�J�ڢ�[T_�Q�C�������6¢�$vI��6�)�S����$՞���c��uvIi�C��]H
�F�ڳ�&�C�~fK�͌�]��'Y �$�z��x�}��z5���Q���M��g��=�O�'Y�p%�
���NB���]�U�}
��-<}%����;w줺�󺳡n�A_�ڊD�AL�ðo�(�������Qɷ�:�����b���Uz�r�y��v��vҚ��?²��v�Y�;R&ЌLm���ĺ��LԵ��Q�L�����L�pן�������38�KR��~�dlL�ƈ���-�̄3���0�RcdO��Cy�T�}]��#*1���`Yc aT����l/�Ga"�o�"<[�B��8�_�F��M����)���إu��Ii���A�L�`��W��dZ���u7�C{+�+z�*
@E�C͹Ȼ9+��*՛yd�&TX
a������sLʑ��uQ:��aiJ/�z7��ѿ�=���ձ�#[)�5fgɀ�z�8�b���X���H�ބݜ��	����\l��
�N����~>ecgL!�!�,���J�v['�b;�r!���Pׄ,x���6x���0����;��?To�m6嫋`���w��˰�=�p�`��A�ݶhHqv�,g'�	�^+����,��|bD�4-������;	�_�:IU�b�m(}Q�(���'���J��;PЍ����%��ٰ2�8,�N��4�+��wT��Q4��S\Z�q�i��"�G%���%��["�%i� �d���`���S��c��t ��ܕö��|t����(��=��R�N�3;m��@�B�#b
̓����Qg_o�D��
M���u�q>�vi��>��
��~���->Ӂx�TP'�^�G$!T���z@noER�w��4�>v	$�P~L�}L����C"�6Q�"�%��o����\A_h�=��aa/�)��s���C�>�5�s��%?p
q�0�~�A�է����߯���Z�
����O���?`6�K���®Z]Ĝ��j��_�޸��D�I�ּ��K����"�(�5	���Qǀ��`�b��8Q��`��Jy�/!�qmUg�� ;�s��M:֑�b���
��H�0II�쓦Ά�V�ά�F�Y�ב���o��8����k"�Y���t�<���c����/k
8�hk-6LQ�@�bu �US��� �>hA�e����۠�HZ|�{��_Rja�q����Ub�u�5uF�$j|Ղpz�VZs���b�u�'[x�$����)�V3�2��Lt�
	ix�x�On�w�_�*�jE���Y=ڏ?W�Ϙ[��-�wa��{Ӣ�}���8S���}��}��UzʎB�Z��\�X"L3��)�L|�+�)���Vb/pO��𮞟��(�F��@01n�0��J�h���v;�v;1T�p�C�Z����Iu~h�5���xcJ�M"lt�6�㘮��rx��F!:�ˁ}�y�9Z�:�Veҽ#�&�Pj��l?�$z�G��e����i�i~���5�L��#U-���bjR3t�
~։��'��$儝�d }-T���f�b4NJ�JLН͛i著ab0N���.��fC�����oC��>��ݪ�����a���3#ڦ��MX��-�$o�C� %��S�w�z�V{A���P�,�60��v�u|Rx‘��lS�."��Mwv6!X�,���!'�� UE����ò�ózP��l���JI��-C[�Ƙ��z��ͪ�v�T鈿�u /��{'�Z���t��V�Y����ua�6�y�����c�X��� ��P�����(C;<"d��>��Du7���	�Q�py������xI}��0�!��5"A�i��6�����$fō���v���x‘���R��k��K,��)[��-^�Ϧ���I5�)�'�>7��#��o���M������6�!ToŽ��~7:J@~����K�)�U>�"+�����@P�f
�#�w	#�.T.�E	��%�B�.
����)�&��e}��S�����&�k�c��J����G�@��M}XD�>&R*KٰT30=BE]z�'dS��8'�H�l�Ar���OP:����2����l�{7�/�9�f���;�Dc�������
IAF�Q��Qզ�;�P9Oq�)n}�OY����M��M��b�Pє���U����DbF�_��G���k_���˚$�{�}�X3�T�zO&��밣��x�>Q=Gz� �-�5p�gٶ/ A�9�pk���zj9��z�
m�z�����`^:���B��@:�3����^�i� .��U�fs�	�:���J�oȢ��K������B�ߛ��o`"�ˍĸ�aȍ,&�hM
2K�z��vI�|5�MC��0�-C� �7$Y|��r�>���ۦ�c��sM��l�٧��A�U�ȶ<�DZ
1��O���}zS�s����tG�5��']LA2eS�y��`&=n��Q<�u��K�Ew�$���mɏ�u�|�=�7NJ�.u�j��$Ն�	��;T6�P�\�`4��Q�~��o��}ʹA+*�u�%xi#�
����;��&@wj��q�MB�O�T��>}�
_ѡ�Q�k3��,��M��Rh;\��ؠ>z8o�SRV֦�@������4��9Rh�Rp�����)dm�a�27JA/*<�W�2�����^�p/��P��t}Q,�͙�>�4���׫��y�>�O��3�iA;��=�4�r��p���f�CB^Ʉ��y"!�Bf�x�&Ԣ6��g
Ė�ªPv�!&h�Ө��.u���YS�:��s�[r��]�$A�����_{�zz'���	\�.�����6P�}���H���W��oph�n��C�٬�[�a&�)�	1f�I�g�v�KH`�=v#Zx�v֦%�_��N���Q��ml�n�|A�Ƀ%ڢ�Ocw`� �d�����
���
�k�A>ZԵPR�4.G�G�)^��2]���|E�R���Pi�/�;����)�I}��,d�q6m�C}y�4<�d'Q�8 ;���C!���Z��:,Oj��:7���E�@�A{KI�at����X�~��J���:�w7.��t�?��lE�� ��l!��d�^�}�><�5%%����a�\Z�H
RԗΓ�+-��F.������`��[�)�娄������z�V��Ix�(�m�p�gt��x��i�]d�~���tU2�a�B���[:����_��{Y�ϭ�´��0�G'�l����Nj�p7z�Y_W�'������^a�)�!�\կ�W^�9�
����wxP�`�t5�X��)<zu9��r� �>��w����q)!���"�0���	��:,W�v�ȢLKI�ҿ��gu0��<Ρ����0�.�Й���Ҹ��c'	����,�XE���	� !I�����FD!(�;�V�\�:�&��y ���k�z�%��!�ä%n�b8�� �����'���:�a���E����K�&]�щ�@�o.�4;шJ4�*��(,{+@hp��33$6	VIC�W?��2<�Z�9���a�6���Z�b����4��o.�|�p����x�c���#��3f�ޔB�����T�O��G:V:��)�W9���;��(ҩ���*V���U{���B)�uH�<�?rh��;7�CX����υs`����ǜ���8�`�%��O��:<F	:��Q?�s
�Z5��FH�̎�
��#�w�m�q!`XhX���g�n���>��4�#�X;	��`��܏5�p�Rf���qĒo�pv|�ѱ>�(��g��[��&/u�����I
E���ω���0_yH��&�Ql��	d4ɬ�C����F�+`���k�-�2�����k�ׇ |Jwv}��������z?L2l�h�r����C���Li�Q�C��P��P\]��8o�<��tN��MC�@�2���!�|�P:������Л=TN�����u�PS腺����Ԩi��j��+˙�U.@��mh`���
C1X�L�	�:�)��9���D��!�j��?F��eƕ��ì�*v�E֌�:-HxGY��V6=�k=�h !}��ՇG�6������N�?��\o�'"����5�wz�bى2��P����7J��-E'�Hg�-Э�֥'Տ�Dz�1L|�z�P�!�x�a .�x�m��[�X;cy����w#�2kG�s�g����<2�5�7���Q$o�,��N4P'j�Nv妠񡖋�9���:�Oԥ|7�I@a�w���D���u����� 	��S�V�M�
y&�o'������hpuD�T�>8�`w]�ӆ��iD����g�?�H/jHR��_��5-}ڝ<�F�i�\������##%�E�9���,�>��[�4���d�5Xo�A�J��Z�(k6�yO%�
,�a�vb��<\�W%
�!�-@풌G�}���_�*����?��~>#��3��1���!��܏��d���Ͳ����w+����ݽ�Ow�_��(ʎ��CM����;{{�V�#2*�
�\,��K�)�)_z�;�������� ���]_�|37��\+t�Z��q@�c�ա�P��k�4Z��Cb� y����{�쐯�����
Z��ٙ�n?L¾�<3��=4-^}n�,)<�F���/�a*�چ��:�{2����{����Ðw�Cw�V�7���9	��4�#�8�#�j �
�$��)Q\�U�0���K���O`�߬1�*���Lv�\f�v)z�bf����c#:��=i�dྔl�DnV�4A|g��,��O8&c"�+���AF�L�k����|�t�f�s�I�D-��_w��U����$f����`& �oF�MSӡ��c�T�o�[�.�Ͼ�e��T��[�YCm��ciG+M��,��6��@��eH��0b��Y���Q}�G�x���"�`��J�����7���Z��Z>1�����ءHF}N|�2/	�E�,�A�]{�F���j
ĎH�{= v30ۏ^B	U��x��\���깁�xm�-�	3I{f��\�6��?����'8�S��3d�ρ�ߢ:�$)M{�E��4�LܪȆ�C_7x���v�k����Y��mC�G��
Y]Ao���I~��AK�E}JƝ�l ~>=�m�@�y[�S��F�������,.j\����Z��9��
F�Xq!{N[������u���nVcpd/Gf7^����>����A�rAЎl�	�P<�+��Tl�\�'�n�܋P������w�5Ö}�%��|�R?pY��c1�ሏz��B��U�n�~���@�>����)Љ�(T��m�Q_�5�C�p3�`��P��T�����	(��i��j��o�l��o���%��ѵ�Ik���� ��p,�����נ�LL!��J�������Y��D�� �Q�́xu1t�]���C�!�h��t��Q9t�|4E&v֙�A�k���B������\�X��)�Ӭ���]�69��C�"��2P/!�6���8�G�E����$Ɨ��f٦\�	|��ր��:䳷��#sцo�c\I3�m��1+�n������d'�R�@n S�N=l1���Ab�?�]"j]������Pv����婸�������tԘ�~�aw��S�L\6) p�@��R@��!��
C��1�2E���y���8��,��0��N>�UGr����Ŵ�R�:��X��HV�����Fq|m��������p��3W�pm�Z��?Ǣbz��廊�$ܐ�0��}l'�s5�`j������P�I��>�M�)�X�7���V?k©퇲M<b�T�o�ձI����I��FQ�0��}JML!J�)��+G��K4T��z`��ȗ�6ݐG���Q�|Hl���S�.5��\�n����	�A�:�L0c�j4@�SQc '���۸`�I)H�2)��><6�9�w��c�I䤵1Џ9Vy<Ťu��U�㞠G8�����q_v�]p��N4�C��E
7��p�0ENi%������9�����[:��o`Yw�|��s2�kԝ�'�Fӝ����1��Ԛ3b�"B���/�=+Kڔ���z�P�	62T�N�+沃o�{
N�9
�R��yr�L�%D8S26�)w�a���A�Hv�ht,4��H������A�|'�}�d5�vz��MJ���a�~ju|�~XH��,-�p�6�w���-}�=��>�ut�����E2t��`@����Z$9٩
<ek�~�6���	$KCI���V%Ơ
��8��_�D�b����ot�Ў�.���#�Z��IO�(q��`���]N}�9@����g�G��ed݁Y�N}&���W�u
�K�����	U�1�GQ�Z��͏ar�Y�W=؏�F^:\������ESu�݀*��_#�&�&�"�?&�������"q���ɏ����K��� ���^�b/Ï6�u+��L�vHy"��%�7�[.:�.ـ+��c��<d�G[��;mIX�rZ��-=�n�}�tw�:�_g�	���="�'
���$�蝐e�
<\S��o9�ćlK{3;?������B
�<@�n�K�Ab�.�@��6CFP��`��C�G����<�J]�y��z��"㭦��x��>ƛ~���Pw>�X~yɰMUts��ޣ��p&@@�����o�fCBu<צ��{ߣ�����٣v_�_pQ��]f��ǖ���mL�bYV^zW;�gG%~�P(;���৒/8�1/��o��NA)Arn���ݐ�r����eTK�܋���E��$����fy(�\�x>��gi�[P���r�
S�����wM��N<���7�Ln�Y�'o��\�l��+��m�Ob���M���hJ�b�X�e���Þ��0e/��i=pI��l��C��cbZ�q`����M�ݙ��CO�B��L����13<'��%����(E�����`�ЮX��!I�x��y����;͔�:���U�`�g`�����-�
�?��q�˷����X�mF`q)0��E�䁙ͳ4�zK��E���tr�B?��๨���d���}�0.�L�,�
��~�@��^��K6�wE���r�Pa�s�t?.g(�E荳h��%����D��f<�HY��ءٿ������Od-��X(�C�
��Ĥ�ʹ�/-��ӷ	�۱�p�<Eo��V�)�J8A���~�EY%:/kQ�9����'��}9�
9BY��FNx�jӖCtL`�r�G9|Q�#T�-��O@%b��(��4%�O�M�ö�(�b��a#]
��{w@+��l/�v��5
՝��t�R�~Z��3	r
� TIZd�n�
}̫�2+T�E��:d���3�x�]����Pw����e�"��.�o�B�=I([�S�8_�
l&�'=����j&@7h�C��b7�L���,��tȲ���Y\�E(K��l�˺���ʎ�!����Al���.�b��y��c/���F���:?H	zGx��?��6��c

��^+��k��!kdd�M5���&�
�I�r�MB������/�J��a�%f���IQ3�rRL ���)��n�Gh�C]`�Lj�؝3� t
(�7_#g��;->���<Rn��)P���c���2d�^�?�q�L�ȴ%`U��n�Qg�Ń�Sz�b	��X�ħ�S��R[{ �S\L�*h��XVwZ�A�:�S��F\@VE�Ԓ*�v��(g���0��B0��tN��%�<L&�l�'�cw'��z��Ңt�/:�+���V&#�)���0+I�=��5u�"��Z��zk���>}�z���/1]�>5�>�ң�zZlo��y@i�E4�����P��
]�1QC��d]r�
�3k��	�?����%�4�(��8ğg�R���k�M��f�f7�����N
�&�F��I����c�������C�J*���	�eCI�RP��&�8���P.��7N��)_9�[�&���
���k�1�p���lD����ʋ��;��|�h����
��S��P��0m*�q"��@��<�W��g[�е�RA��[��%}��׫u�3
yc���C�!� ��OU=	&yS+JB$���O��}�r�d+�זU��,�ד�/��O��L��u���/olɸ�r�OD~Gv�;��l���ξd�b��]$	&g|��~���\kQ�\!��c��8�)0��g{�CR5o,�@�Ds5�/8�o��[�&O���5��{���s�P�v:���/ě�o�q\����0L�����0˒��}�?���~Q6b/��y��l�r4���E~��g�r�"OW�Z�[����`}�<A=x'�x����́�p�ٺ�G���ߌ��G���»yx��;c���vT���i5Izl������d�~�*D~���ځ[�:�e�E6���؏K|�K�9����9�
�'D��O�d��s����	b(Ϣ.�RL�.�A�p�b�V.��ʅD9I�`���f�v���C���;$��n�����IN�+�����<����l�|d(�m@��wK�{��qR�&�M��Е'�&}=����� ��C�y��=���-���_ �w$��b[l����ll3<��~��x�P��&QA��P�GA�e��0E�T��h�I@��|��/�䛻qό�#G�toA��0�#8䬏��Gn'�͒�8�$G��u�� ^I·:���.
!��5�%8O��S��fx���÷���%]���Q]������Ѝ�1�`i�FPrpm���E�����=��Ç��7�y���u���#tg�`i��˺�OoE���Ս��ڔH��ɒ�~���Sʻbg��d{�㔩v=h���A�PY�;{+�	�0�J~�G.�@��P�Z0l���&3G޽6�̗�ɦ~J��J<���Co��|Z�Cyh9-塟P��Φ��\�c�o�6B��H&PV_?O�ĸy<��@�z< ��Ճ&r/���jR�(����EV�!^<��r:�>&9��I��2j�r�	X��#����q�܏��Ս(�y�65����/�OL�s�MT�ѐD��Y��G�6��t��ƿ}�X��P7�YMB����5�(N�|Ų+|�R:t_�Z2�d���K�'J��P�QmK���=`�h��Dk����4?;�N��	�=C�`�{D� ^&�H����X|�
���=��K���`�j^~�ĕ௓����޸hf��&�$Ln�,-����?��A�3�#xCŧz(Mr�.�a���L�ju��M*��|�� ��Uw&R��=�{ޠė(�k�Q��&�+�/��@z�'�RW��6�Ѡ���'�z��ԍg��7�r�k��^���m��_�J��Mԝ����R��i�#�>�$V[����l�l�f�@�(Y3kJ�I�T�u���՜Y�@����Z��ZQ���*f���R@���c$�ݭE	L�[�a�Q�z<���\�
��j�����jA9�w�-nR�%3g����Z��+G����,�U���jQ��� �����6�_Z@v�G���{p�Il�
䋙�����+t$ �ka�����3�O�9�/�/��[Q(�ތܨE�:nY�P0"&M'�1Y�t�̈́�`�!�DG^A(�$����I�?d�kv��Xmt�]v�hB9y�/��߇ɟ�08�{��_��G����r�hg���/��:L3��=�����ۀ,b��	g�{��)�;�C��W)��!�~+�K�(m��a��Q��GiW��z�x��ص�(1|GV��O����C��q<�43	���*p���jT{e�;}#yԯ0ʸ�#�5~.ݜI�,��n�Z�(���3�z򽨋)9���;TV����Dj�b7Q͈�6�=؎��+�9�O�e7�D`�Ɠ��DY�q}T�M3��{�`Dƒ�i2�ʤ��x0�
�C]8��5O\2�v;�t!F��ζ�[]�㹛t�:���h��ij&�>���*:�nz�ˮꃟ|x�{idj�7��a��fu��H‡�x
e�$x�q���KR��?��Ϸ�Y��|�7\^�L�5{�P���N�m6�z�֩���X��|�*[��##$^g&>�M���Cr�p�������<�9I��k��s��{8��*��r*cA~=-�B��R�<�*kv���M�p-��ʻb�лK�Qq17*vh�l!Ie'��j\�1�7x���+�&����ka��P�u��]�q=T�q-LCg�����5�=š�{���bz��j�Z���'i�8d����Uq�5���$21ƥ^�'�^��m�'e��1� ���O'�dc%�GgȻM�Hw������2���X}��kd/[5^^B$[H�P���̅~�SJ��G�5���O�;-f9�8ޱʓpH���Q�&������diq�%��D�����@�v��0C9iJ��%v�&49MK1�jར}=N���v����[��S`��&x��9u��z��G�%W~	��d%2�&�	{9LmFv��g�u��S��̇w艁��8��a?mjh#�a�a?z��2۠���(dJ����#����4��Q�$z�L�]�:hOު~
y�Ѷ�$_�F7�:;���;?Zm2q���}]b4�r�R`@��9�s%��v*.��LZ��##��X��Q�����d��G���'ýtl���܉O�>�Đn��h�an5<8�H_�>4�c�ϰ��,~�hi�Y�IJM�r�V.��KH[-Dg��ޅԶěm���0Q6��!�m#r#E�?
���M��WZ��%y��t�	���rx\c�f����f��š,a�dv�[�L�uޙ
*N��,;}�́�б����)t�uUx�k���l�4v��$�P<Ұ�Õp�,�M���i�*�Vtê���J�U��!�7�,�k��cv)����*j4>�3�:���Ұ��u�:��x~R?�۹j��~��aZ�3��c�bV�|[�#f�faMa�hv�,
�G��*�h�)���giv�,>�&�YC�|J�=��/�X`-�[�	�T����C��r"0�����C[ˇ���O�
�
�uL
-w�:�V�*�؊/}g�A��<	2�Y��G~�v1�i9�����W��s��EWG����T�Y�T���u�Ԫݝk�\U��t�h[�N<�D}~�i�XIY�-���F<연��J(�/*�:K؁:��@#��n�_��>�
K�+�t-���G�-��G:�]G��V�
M�X�5h�=����nzI
ڲ��:?}S�Q����pJ��
�TG�,��?B�z���K�#h�YVy���\^jv�E�J���|�`�`۪ҡH31G�r4h_�f^�{m�!%��Ru
)u%Z�϶����C�׊���W��U���5[&L�	�O�?�)�����p~�uB�W��o�mK�7�@�n�X���Y$aӒ�˃)�3�C�,�2�v������%�@�(�#)K�	���{�j��'����:�b�j��K~u��d��ߧgV�t-N�"�qY�o��2z�d��$��%G�g��m���c.��p@��G�d,���F�I�d�g��V~^bJ��+Y��l�1�&y�����YG��AM�'�W��9~�'NJi�+U����ޕ�ȧ`c�!1#Jˆ\U�/A��
ҷ�x\���� V���H�U��*�aJN��<�����eB/�Z�'ڶ�gO�HL K3�M݈�����C`��}Rާ��4�=�ѥ��Y��礯��\�J�X~����Y�U
��Dw��A�H���*w��>��w��-���"�l]ݩ�s����"��'����:����S��ҹ�#�ЄW]:?܃�1����Ï��Y�`D�&G���6�
���h.��Ձ���+/2n*f?�E!rst�A�
�O�oyw"T��
y�j�f�i�h�p�gH��*�m��A��X���l� �t�Dҧ�%�~��#�xz�PP���Սr��!�ev�����w����Mv��6��{��n֔XK��ގ��^����c�ݲ�+)��%�.��a�nJ��,�v�)�~�m��)/��O,���%���34md�K!�Г-��Jo���GH�ƐOD�Zޝ�oͳ|��"�Sܛ�Ы4�IsO�G������3�(l-TN��,������E���.~����:��Ч�qWw��97�"���ޱ�\�e�kO��@O���}�D�.��G�����5������cI.�r)i%�R�	@OoAQ:���F�;���,�rs��Y]��/��"�9ʽv��*�\�3���&�
>}�O�`w_X^�e�}�ܤ)Կ�n/}�����n{q�q90�z��m/�j�D?��MJ�Yoٷ��Qw~�`OTRE��,J��ܪP�� �I���x�mV��%(ݖ�
����������/��G��L٥����f������	?��$5Y>�E��"1Dag5)Vѭ๨[AT��w���I'��
��U.J3^)�~�6z(0�L�]xT�Za��!�'�G@��i�0��>h�#S1��6����S �c�fJ�D��mӠ��7 SV���w ��o�.@'.����?܇N:@
�	؃�=��O�M��[u�ԋ?�����4���>��?O��x���V�Ď"�GS=�hw������L�v曗�v���Y�}6�����䦣j���
�=4ͬ�I͵���N��q�SR�i�E��4�5PWRm;�ߴ���.��
�ua��� �3C.nIJ�C�':(�5d�r�O�]�Mz��K~�ف�S�e&+W�O/���uY&���Sp_�w���e�2}�x�d��t:V4�	3L&wC@`�)�5���R07E�S����s��@;~f�L�\}�{�YքTx����٧��چ��i���p"�;��׋f��]M/��ֹ
;��3;a	�7��0�3���6��Bz�����/��S&����A흓a%�Vo�&���ULgI�D�"�dP�@�w�<J���]�p�OYb`��DQ��td͜�TǠo��|�-�.�P�X�9�Kf����*'n��<��e'p_�>_#l��8�_쏚�ZϝYG�F��н��>Hh{�)���u�7X��u��,�Yz=:oٹ�Wԁ�b�u��=�mr��1����pL�U�[h�v���^�k���P���^Z�����S��b������ޚ��{k^�۪���Z�>��{��`��Ru�C�7�mz_׭�}]�z+C:T����zn��K�2Վ�h5���TV�ll}��;n�ۋkf8nm�]�'j������@�k�m���o��c����&Q9�-v��~�](�{^A����o�.4�Gm��0;�\�K���N�"�I�Ѣ�wHo�-���M>�ķ��?0���c"�c^XDC�>�+�}�����줷�ie"2��y�Dv�ѕ1x�3.�F-�kD~�
��j�Gw߱���x����/��t߃�>�n�1�?8ȅ�X��2��C3\)��<a�l�htA�s�X4�P,��ԑ�ȯ�Xo��@��AY��R68���<`yaZP�\�p�O�$65E*��}90D=����9���igm���n���o2��Z�<4�����!���u({��%85�4�)�'�����w�nUw��M��nyf#̓P ؖ��Љ)�w@��-��P���� �9�ޓ���u�\{��C=l#?��tk+MiЃ�=���]������m� ��Pal
��	�Τ�Z�!���S���C2[�V� �����JO��6ձ���(7k�?7����6��Q��KB�F�)�A��y��&��YoV�S��EӅ5��*���'|��s�����*��Xz�tH��<��S���Նc�<�ܿ��p�jD�Z;�[v��I(�o��Y'��1a&��+9���Z�����.x��r���P*�u�_w�M{Ͱ�����^^��
�Sş���t'�L�WА�%ts��+�X� ��g\LyWJ���P�|7FNTӂbJ���fx���=�'
��x�UP�J�).�=�J�g2��#�wҲ���))/�b�UqFh"FS�{�T��DRh��hY�&�^��1�@�n����2�k-�J�$RqU���ė6����䒗�Y40Z��N�U����nx<�A짠O�k�+(h���P�J�#~J��Ͻ}��D� ~z�ˮ�0ϒ
jE���mG$8�[��C�1;u=Sf��vD6{xc,.HV�;����\Pވ%?��-�躯V�)�GNe??���$=�9k��6��f�t�-���{��j���Y���XĢGК��X\J��2n��{V-�-K�DE�7��rI�m�??Oo�'����w��ʡ?;��3�ol�Dw�(Ln���)�H��p�:jG�PT͢W���X�22[鎔E�x�|s�k��JiH�v3r"�-V��F�'�M�L����]�B�/PI�ye��~�2��I-�|����м.O�'#�[z\~"�*Ȇ
���y�	�r�}���tc�l�x�[���ˤB���ex�sP��Y(�K
I��o�󗋹tZ��k3���|9ޅR'�[�Wj%��K�-�@��X
�X(���0_�J�� r�X|w��v�f+~2�~�W�q���$x����!�g�G�~�0���Ż6��t��|��0�W��F�[]4���X�3^[�gjw+��;22`�f��?#}�1�?˓��0{ŗ��0.���}%�ÊW�J�Gz�GEj^�U�-^s��_19`��$h�0��4l�ջg�L���~Y�ew�M�W���w?�
/'�%#�6���+F�ǹ��{�!o�����B��xW(E�2I��i)2,��&�|X��֗�@�@}���29�3S�h6��
k'�J�"o�Z���>e�@�z�{=�Y�^��is.�74Up���Y��%2'�-[9o	\{֔ަ
����g�PA���<��[?{>_L�z��a��X=����t����R��|ѩ;s���n������؜v)d��}Fgs����o��3��?�/�7��\(f��9��^���(�����Rto��͎ya~�����a�1�َ@<$[�4��q���a���&9�CMp�� �Ow�)w��-���37C�_	�n]a��69?���iAu�wo�`v�l����4?B�#Z>`+���#-hQ��J୏�֩��ZR$n@q�-��	/#s��pM�N�Sʧ��6, �A���l�v�?`y/�%��ѝ��H�m��m�P"��^�/*,��I����o��$�o��'��0u��1Y�E��J�
�z�h|Ը'��jȟ�"���R�9EGژ����)��(mD��H�o�I�B�+�#~��#�Iu_�ѷ�|;k*�v����3�N,�F�(������8uys�P�a`3�T��OE;=iv��߃�g�)xG
kӜ�}�n�s��/��DG���xţz�U~�Ԣ�k��1��'��%n ��n|��h�7�z�Z��>��&"{9@r�(J��!�V�]0��
D���|�Qr_X���
˓찎|��bd�я��B�:�*���ܬ޵�{�j�樘Ҩkz�6��T�￀�8�����s#u��@�T(�5�O����q3�q#p�v����K�{A��>bK��a�Г�6o��1��MQ�����'�����$v��N�j/��O�!*z�{�/��o��˲D����`��h+�t�0�[���W'�q�f|�>�5�E?|.�wNN���������	ZZ���<t2T�)���GnS/k]鿖-���@b���0��C�آoV_G��]�����~���U�3'%���v�c*;�ga9ɧ,��k��(�+�!噸
Vߪ��E�����Sq����v0��:z�t�Ԍ�DyW]O���3�k/ÿ��+�"���O������Y��_�-ܗJ���R(o���䱓xwg>:�D�y��G]	��-�?�����:�Q׽hI��s���)�Qa��a�~O֜w�4�ö��	8:o1n��^�b��Z�켗m�g~BCN���Pz=}ImN��U��'��x;�?�-F&�;����B1��$�a��8a��ޮ4��6��!��j|�4�>�
�K�&�,ֆ��1�/*�� Ic��ɋڱ��+��ϟ�F���s������Y�ot��I�ǵ�/Ġ�`)�D��=��s����+�V����cz�.�֒8K(}�*�<M�~\(}�����ȟ,py������B��X��
9B�6�B��vA��/�Ύ� ��N2Z�ގ���7U�l�Ͳ��YՈ�
�0yB/�=�Q�I_���ú�_y�/���VɃ�j�7~F��K7�1e+dṨ��ڀ�
X����e��c��e���;ڶ��P:����K�'u�Z��t�.��ƞ��B�/�^�����
ZXHz���-�{����=�7
�@�I!RP;�FiY����z s��|��)AqYL�F�ɓ��U3�7Z[��eh� �E
�i�K�h3�-����i~r<Imsfb0��l��"�N�����iU�~�婐�veC�3`Jh�"�n����ط	&ʏ+݋���d�HBF�j)����C⇚S�G��ʪ�q<��'��
=�َffez�CJ��hu���~(����^D�ph��3i��o�-/Tj�۶\����pzӞ��L�r{�����7fT(-�%�o��i���i1���B��j�J~�U(~����.%:({���<�Z6�mRQ����"�	9.O���nm�x8).6�ޭ^vowo�d@I�쾮6�;TH�Z���L_�?��T��G�փ�u�0��m�]mÛFm��g��meM/����P��u��jB�3����R���fm��Py��@ �A)��Sv�"��{�҅R�s}3@��<=|����z��="�-�;XCw��ʦ´n�Mt�+o,i��,ئ�}�Vޏ�D�%n����D��B� ��>@)�X7QXwI*�R5���O���j�by�����k��ZdK��<�p6*�L��T����G;�F0���L�f"�����ia�}��#`B�d��b��`5ͲP�nl����<2FX��-E;5�C�S��5ɮ���.Oz�H
�[��*�z��?苕�J�.j�k6$DN2��f��p�����*��9��ߥ��@��K삈��������Il���8R-P�jV���=��y��0�v�`�����j�6��&4���FE;J��A���9��H7�-]ֺt.vV~�w6���k;Q��2�U\�Ʒ0�L'G�F�{��z��@��\c6^ <!��؞��:�lT�}r��=_έZ@�KN����%BY����q1�Ag;��!�DŽ�0��jp���@��6���
E%�`x,����X)�.���L#�G��3B���X�$Zr�
��D�/b�h�S%bߐt���E�1�4�N�h@����g�Қ�����Q'�!0g�xs��\N��%
�v�_�"��z F"s(����r���J�jv[�›��X��"G�}�~�.���f��Ն1a�.�PR1��z1��k$6��:�n�{����t�`����A��Z�HC�v��Z�~�Z��g�9F��g�c/��,��{�7|d��p (ѥ�~</�S��&WX����[�c�k�L�d�$3�/��[/���h�+n囁G�%��>�HP_�<ʱ�{��+��uM��|�63z�ZCݪ�d|���[s��t���8t���н�͸�h�:��E"��M��/֑W~���y��}�+��V��O
~ʧV��k�k�k�)�$�j���}K����N!�ύ��Ez��"�P:�,�R�чsQ*��d����>�mt�Jԃ;n�7j���d� b)���hKj���|�~�(:��V�7뀫��p���_02��12l㊐
c�:�*�,�8#A��nIo�܇�_O+�֖�-��c2�l�����öЍfx��9HR�!�R�m�+՟�G�W��u��I݂����B�::M��"��VU��,��\,��/�mz�o�z$8��Y�'��_��Fm���Ȱ�I�겋(���V�(B鞄7�#)݋����~��39�J��[�� ���?�|�A��ŏ��E��������B�|�T�=�;���8,E��]H2���.@�=��^
�ȥ��~
��K��}�G��nl��~e�Xg���~�����G�g$7~�z)^�g�����B?�;<F����_�=?��芼|��oR���<�F.����>�����G��e*s���
��CL�j�|����9���.�j{��sx9�� >FE�HE�Dќ����D����<�aF�|������v���fee�v{��-�h�hV��Ե:4z�b��������~���8��~����k?��k��BV�y�=�P�׸�mk�,5���ITZ\Uy��c��QOG�2���#�>
��t�yP��/�yw�y�>^�� U����}�|�N�(�6��壬�EV�1e�=�а�MUM��O�lNn-�wo#��:K��U�k��
rv�:BLuF��As�~�7�.\���`/���dQ�2��U>JUM`���ثh"�����L^݆ʟ0��_UN���F�
�<�P�T!De���h唍�([W��=�zZ3k�$rʟ<�p�3�rJ���z��W9�v��ys�{=�P����)�z��p��yM�W��lL�J����	�_:��Jmu4'�@d�`�C�Klj+�K_g�nJS���1�#(��v��ӻ���8LOV$�WT${^�T�<��s ��F�[�Z���ngb�"�9ۦ�w@꽫�,侞�����jz�J�D,c���9�ԋ�T4�+�8��D
�)��V���l�.�/7P��(`�����O���ahp7O
�<5��j�����Sjv]��<y7�c��8�߃+�cvл��%-�kO��<�ֻ�e!�<�Z��@B<�@Ʌ!�B��_�����·F�[[e��9�����/�Mu^�9�<�[��y�k��蠀�b�����7H-����8QGuPo઩�G���yM���~������q�D6�ؤ��;A^���_�o�=�KqW��X7-�����	S'z��*�3�]�䛪9��t�RI�T3Z���E��X�3L:��5�gB1�0�p�x���t9������)��ɪ�Z����r�hP��K�y6�A�?Ў�@��qU@�!�{G���)��}�U11����.�k�LM���藾�=��]�u�8�;{�L��q!�۰�fl�|�VO�,qx�3TK)���C���o8��Ś����&�0$[�i�5ᆟ�R�\CC����c6�r�uq[�����M��1k\J�aF�/D�~P䍺�a�wz����Yw��{5R��谄E��~��ȓ0P�ùb�ю.v;�$C�I��c��(L�p�"� �4�v�RD>*��	�}.s��ZJ��`�
J���eq���Q=�UH�@��K��fg5�ϐ+y?�xҲ潥�8��ۓ?3�8�[`(}�l����H�\����I�؝��'�	��|K;'�$[����	���nV�`3��aw�Δ|�
��n��Cwz�=���/ot�S��L�{F�
;��p"� i_��
�”�E/�
ܺ����5'5�k��t�ߵ+��tkw�:�uu�n]���n�3ٗ��q�h�t:B/4�?T�)��vo}����?�Q;���
��A��$Q�?�VI�/�?���g����&yt��1��	��(MW�Ү�(	Dy^�N5No��)��uu�F�ߨ.�P�8��?Q�����qT�;�U��:ô�1g�Vx��N8����=7pe�ݤ����gi��S�㊥���O���{��7L�������M��eXG��pҾ�ߖ�A�7q���=��:�amM���z�S�	�j�/�QѠ�T�Z�	r��_�z�cL��Zu����+��_��i��?h��_�3�P�?�C�Al���Yr�����w��6,e�P�tl�s)�F'�Ä;�����Ɲ��@�Y�
�XM����nT�p�B�Vhݔ��H�;34՝�)@C&
���'A̐��<7Q�TCn���ƿ�E7+z�4
>����6���pŒC|
~�����װV)b}��)���Df2%#��`n�"21�i�3��U�{ùU�|�᧭8�q�q@aN��.����Fc�䊉oO����F��]��qGP��I��ַ�j�m���%Uݓ�fV���!��h�gP��V�R�x�9�C$�o���c�ԁG� CC�	����5'D�I:/�_���G�!7��O������͈ߵ���/��4	�P_��=xT��;G��?9z��'�[�WP'�^���8J�_S���E���H0�:M�!�a�Z�"��=��KL���x���V�U����_W��ƺ5���G�Bh��6�i:J��:,���Ċ_IpA��iB���/V�j�.�����\'W�e^���O{
�io�}�tFhp(rx�<�
9��yu��7w���V��W���7U5��I�G���T�i�捷�#Dנ��٦g�U��ӯ@c�e�
Ld�/�u�{¥��+L�c�Z%q�C��U��Ne�Me���x�z9�\�����r����Z��o��L���g�4���Y�7w��L��o�4c�~khH�m����W�p��ݮO>����Iޒ���,�ՠ�캫�\��_C7?��f<�%�kC����$MҚ6��6�C��8&�R͛�&U�}�OTwB
��kt���gr[�j��Q�0�"TG�M�Z?�"bn�Q��4�V��I2�F�}��H��̬ȋT^��\�'�|6��9;DsvQ��C�O���1�"�`���u�_܃ם�tL���	�e��Hq�w׸��5ҍU*�*�U��)'0̿д��F��]ަGP?�Z'�w�HG'���!p<texq�!Wůp24Dd�a��q�೗6��J��ڔ�P�p%Q%u,�$�M~�Y�Vh�������S��X*#��R'@�7¤Kr���Ȅ�}�C���d/G=��V_��jW`\�%��/L�W��Y�.��B�c�MF@[�m0x����4-}�������$|d�;�Z�g�H���t5��o��A�>��
����ˮ���J��Z)��|�!�ʇ��v��_�\�x��
ԑn�����m%H�/q�0�ߣe>{��y짇�X6	���@�WO��&�F/�;Ѷ���v�pO�	�lDjp��P��
��J���"}U��@���	�)�*v���ʟ`�I�/���M�)0�"�hE�H�S�],��G�v�ў%LjE�Nݵ���R����t�z&����s�&�W���h�n�]@�\F��U^�D�|\�$P����:��S�8����Y�(~c���1ǝ@(҄G�΢�*Mua��i�I��K˧S�V�򁲨�,&V>M�c��!����h'��QD�v�;�vm�.ZBX|sCў��s�/����;y��!�]^������9!�;P���u���n���t�V���=Ϋ.|dx�-@��Xj���۳v��wKW��a'Y*
B�/�mT��.7&3�~�u"��ͭ��64}
��'p|$�X����e����ߟ��e�{���D/���}��;��P�{��������gpǧaʰ};0sݪ��'�\80�����6���r��v����w)�M�,��@}@7�[�����r_@�
���ޖ-��L�cewI�un�D��{�.E�߇��*q�/y��f�)}�����/<���K`�j_L��hؐO����"�L)hM�}�)Y������R���5��چ�?���.�t�b4
̂�G85@�N�Q{��pUxm\[��{$E��{P�-	�G��id��%T'�k�c�v%.�$_�Ӿ+�5/�c߯ݗս�ݕo�����|ݔ0{��C�o�,?�$��o�I��m�v�	���]��eŸ�v���w���L�`zP}�뢜"�q(`b�G;~�N"t�&a����j�;���S�|�w�DM�>��k�;����3$_[����
[L�/vyg�N_p���5%t�$�ʯ˜{E۠Isn�T}�g��!�5��U�ֆT]�v\#���)�*օx�i�����&����c�i2<�a��\�bxC�����`}=�P��8;A2������^'�g���!MR=W��t����Z��5,R��N�K�p�����	�>���L��ۆ�a��J�W�Q�Ń�"��܅#�ݝl�GUӸ�wL��00��͹��4.��xWBѪ�M+�q�RU{�x}3e\;*���s-��S���Zl!�|�#ݖP�S�RGn�:d�~F�85�,���Pt����~�Z��]��B�͛g��}�^F�nL����>Y0[�n�I�V�Gvԡ����Zl}ؽ<3���8�.�uOvь/���Pcr���L\��y���p|��Z����D���J�ל��x��Y]�x]�/��&譸3�.�����mµEvB&g;�/��VJ�j�rlC�-��S0N���9n����Y����w�EV��2N���*/~-�J���a�v2�(��u�
�U��t�֘F–�tN�Z��?5ы�����zp,��p-�t}x�eI�XS@�F�l�Qϴ[���F�,�(����c�c��XW�\Lj�(H��B����T����"X}.,����D��H��XG�y9IX��U��L��+A��qՋ���H�>���c�����+\���$k��~�o�n_ݏ�{��uF8BW�������pj%j�;*E��O
���˘�
3�r�.���{���5Z<E�-�,��<���r�`��3�d��Am7a�/�+���N��
�h'�����9�[_�Q)~jc���)f�Cb��/�D� �f��1� >��4��,k�-�fH�XƐ$qC�bC��E6�Vx��p��L�0s-&2�"��\J�šG�������0��}'ű.���\���n�'����V�cK&��p�G$�dx'�����[������Yd���T	���2M,`8*X3�t+GK�ӭ�L�pԋ&&1\��
w�����;]J��p���VQ��r�/[o�d8��2|#�'���/@���;��;�p���[ވ�F��"^��6���
�"��@1��툧3\D��Nħ1��x��2��p%�E<�ᑈ�S��?�2>#.25/�3<	�6��Jhq?�
��f8���c�"ķ1<��/@���&W\��rĭ�@<�ᵈ/b�F�M߂����Od��c���C�bh)�R�m8J�w�Cr�b�a��״��E	6��If
6Ff��l��:f�
���y�D���-(�mK$x�aW��j�����,e6�`��l2�M<�|�lR�M�|�l&2
�g6#��lZ�M�)��ͥb�܀�af�l�f/��������ro��%���bW��3�-�n�s�A���+��\W�����Ϲ�sd~���z�Rs���y��
�o��`��;f�Jt�bf}x�Խ��	H.4\h�i��ˍ��vjCx@~��*��n��w�O�AT�:�6�.O�M�0���W�^c�>{�Se���Ii_B#.�l����0	�'��8!�
� ����\@��<p駫B�0��S}7�5�s��/�8F�.~s�+n��tt#����!?�d�q�AЂ����h�c:���F:��Np��uy=�a9|���\QrV��
�aU�Au,,�~��`��.��V\�(��8ݺ�,U.��z�1��:@�V%*��"���W�3���^V��*�7j�Ö���6�~�2�V�e�g�~j_����J��&��F�Rķ��Z��t��B�Ƕ=�=[g��Ծ�oh�0؈k7�5�>o)��=�'���D���	?�:�
�Cs�܈�q��yB�t�+��3���a��1��L%*<"wN7�^<��[)6�cS2�=ܟ��׾�k�k�!!�3�OԾ���}�U�:#��$펏Fݦ�ـW�-_!�T�/�zzy���!�#=Z��d8F�ŐՑI⬍�	��L�t^�'\2	74�N}5G_��V}5���^�4�ri��ޮJ���5^]��+��+^t������N���]:�RmI8.�C�������kش���6�.���QK���W<@���c2
B-��e���)1
�*��}RĮI���(q����RUc�*El'�"��	�׀��?aw�j�A��+.�67�aI� �&%�][�zp������ZSL;�_����V����iT�uP�}�$������u+T�<��#t������n�>�P�e
$}��H�a��mBI�[Q`螉[|�A��4�8~u��~J��{HW�������M��7�A�E��V�&��f���KK8qz/\���
����6����1&�J�Ӹu�f�l�t�P��A��M��㴛	��H���Wt����](3Tr��U���	g��F�ڼ���3��h<�Oţ5��<L�K�Z��C�H��A8��A5�.��#�Y�՝��沱_�,I�ކ��!e-��ϵ�:�	��sm��?�N3cL�d���ׯw���N&�Af����$_��N��/���v:*��`��0?Op�
��Qa�A���'�Zm�O�Q�?-�T{
;3I�h��C��4���Hh
5j��Y׈`fR�-�&<إ�[�h�`�
��)�4���={�jJF��i�ś���U�q����u�M�8�Y��{����検)	S��ek��m�^X�U~�5Z(0CU����_�G���`����Ƕ�z&������W�o�S�|Y�W�o[��s4�g��A��'M|��CC�O; ^[�g���l�k�Wy`=΀�&����	��g��bV��O@.tc�P{�Թ�w�C���Z�A3Q�y�/B�R�,E8��+���$_Y�۩�"��P���.�C;�M��Z"�k$U
F
�lf�%_�-�o�K��z�ѱ�"�J�s�s�R1@��I�ӵv)�q�d^���%�vn�~��_N/Sc��^o&�4ўAc�V�!CTՓ��(�a�C1�muT9A�t��y�U��q��L��5�6�n6�n�s�Y�L�4��Yׇ.�K^����u1$گ��`��us]�u����C��v���%f+ֹ=/�O��(�i���
S]��i2TJ��㓧_�9Z�+c�UH2f҃��\9BU#K� Gh�r�z%��J�10NV���z*^	�Ax"����E���R�A�V�� �y��8�ĕ7�=�WtL��R��!��Vi��T�59��M�x�n�q�x{���U��z�sBS�:'j��:'nf:'��*'��j��'˜�K3����c�A�D��&�qXZy��݁6�HE�"�K߄�@OE6�+�‰����ѥkB�uMd›.�˂�y�F�5���8]�jZ��{[�ɽ��&N��9�#RWJ�����d�N�$a��O��zD�*��l�E�z�M���q�d�۪��n�1/o\d��>�ʅ��&a/xi��g}5I��a��:ʐ��k����&��hfR��1Ɲ�=�N6�w;b��_<8Z�s�]�(������C�zHB]�N}�YU�Y�o�n�����K��M�~L�x��E+��r�L�k�$DA�R��h�n��z�:@
��&�F��JU5��Z�U�ml.�tQ��k�H��{n�)�[9��c��b0)����<��p�]u�׊���Z1�6Պ1V��b��|��j�@�4b�1B\#f��A��F<��_e�cUo���/��>=c:�P�EG�7;���qΛn��\���3�o���.��$|!�� �0�/�e�cф1��P%�%@Ag�r�u!���\E��~�^�kN��!���e0��|���"
�eR�*m��n0�B,�Ճ�ōI�F�+���*�fV���'�T�F�p/�C����	�|x���U݅L�U7AODu��KFP�D.U5�
T��_��]����v_�iJ�Z�h\��f������E��M���S8�V]R��h_�ŽM������&�3e�0����2}��T -L�Li�s��_�*�>��L6
3��bY�K��×�RP�:��N���2;�T�Ļ\���	���\`f��O���/�1��9�
@(��3�Φ�#fwS����J�H��R����6��V5�4�yLw���;bD��#�d�'hO�P�p�J5G�6}�SU=XA�f��L����f�K������ԑ"IwN�ICR��X;֭9b�6I���Z#�J������2�
�S�u�)��-ET����B'e:#L1�&������*~�Qi��\i���)@���\��i�NF�\A.����݇z�W$���"���">=
c;�9��A�9�����a(��XZ�2�qPL]�P4Ĺ��8���N���"j��ы��..��}^d�T�‰���WLe�6�ʈ4�û��*����3h���>�Ef�ۗ�Hks
�:ծ01i����"�(�v�)�xmpL2v@�K�1��'�����oc� ���9c�B�F�(WjYB�@6�6��t���ۣݔYn/v��UE�Ux��40v[tJ�}���߂59^����N��F�����V��eОҼQ>��sY�ֹl`��sa`�#ρ9ȋ�>~���u�^^��Hdg]��"Gt�h�XI7E��Q�u��z/�TM��^q�"�1'eԪ{�i	�~��GU�x�σ�!4��B#{
BhUq 6�\U�:8܃�}R6ʱV��a�A���.T׬lզ��85�Q>֏��}:$LWk<�F��*��J�}^q�z�Lh��{�����:l`�z&���L�:~G=P=���2�h-k8e�����s�S��*Td��,�ڮ���P�*.��G��8� ��W�t���Uv�g�O�Y�(:N#L��8Ƭ�:Zf\+ǟLO�_˹a���Q|�n��%��Irl鸻�so5W��L��#3_b��D���<�+:����Ӱm�J�ڍ%��AR�b8k�A��AP�A���	H�
�p��t���_�S���M��嚅���+��?-���ǜr���uJ�[z�)�攧��I�`q�+��b6��	yS����<E��^[�%�ϳ?��Ɋ��U>->� �7)�؄�T��lI�A� 0�R�`AWC�*y�U���]g�.^q��/����	,���X2��jC����~�DTo�ʪv�s�X�
.�d���c]g:�b�|2%�Y����8�4?�v}����5�t1�9��,���]W�N�܈|7-f��c�0��Pq���{h�6{���m>�֧$Ŭ���F��o1;�CI^�� y.��O2��BU�:a$_�d$'��)N2
�$YFA������
w�qݒ��oH���7\A�uD���{���Rh���^�qJf�z�͸#(F��,��]�z��_���)��wP�eFI��G�2�����ox�@2�^ݢ����r����J�%��X��_7�aȝ��ϮP����3���A]��@Ax�Ǯ#b@0[�Ǟ�TI�;\��
_B�.��
Ô�z�b_�G����2��Ɨ�A8��K��y|�uu#�'�lU����\�n�k�P[LT.�-n�O�
w��!�^��x�,�t6��g�t����5t)�"n2�q���y�	u��N[uQ�6^����8T'�9���5�����a�?����@Cn%�U��i�KZ���j��PU�D�y��A�>P�Y!k�*�8]��3��K��fh�Y��&C0�Hk"١�Ti����`G4Q=��q+[�{�A��m-3U�|n�����;l�峇��w�?I��{[rQ���N���`����b�V���2��F~��QQ���� 6C�%t{V��V8�7a~	�G�ณ��Y����D7�3uM��9����~�5����I�V����ͱ��Ϯ�a�������f<P�G�_�N���P#
�H���.<Sr;�n�?��� ܘ��֪6��o&G)�~���d����a<��
?e��G�ѥ�!x3�J��*�ba�]�ц�op��~v�T���3��	�
u �冺_-D뒗�|�s�d7"
��w�X�η
,�Gw�W�U��#���b���L���\���{9�@
����G7���{)ѸB�_|��d��XBj:��g����<��Q�nz�`��q��㱟Qi�՜{���B֛Q�L@�k�Y�ȣ���9%�@U������q�_8Z ��
��C��}�>�<
k�x�iJ1QU��pD�G"��=�4��Gb��G ��Z�>�:ݏ0�l��ѐ��|85����L�/��!4��?I���N�d�;%�.�Gb�����g��¬��™��^�-�
�+x���)�QU��U&7���^�]�k�qL�QS]L+��U	d��O.Em����ȼ�W%�-:�h�>��ĤR���O��o�:jh��<��gC�r6����?�U�����p�j�Jb�rC����13)�$I���Ϟ��~z�S�FFo�����~�Ǯ���\@�{�8�"E�)��m��z��0��ڞy�e���Rj_�s�ժy*y�|�1�zC$�`��ݧҏ�����	u7�Vߊ5?�fGi`煷܈�?�A�}�������D���Uq ذ$�U/�H!'��qL�*u]��r)�]�W=�M�ul�!�O�F�������*sX�|��?��-,%k����U��$��$�)����J����'�T�@l�>�&�"����X���E�>x���e��]�oo�_:B��n�h�p�'���#~Y"G$^*�M���7z`�I n��ǹ�_�:�:P91����a[A���|�;U~gf�N�4K�Z�B�ը��;�l:�[m�c?U�Do�[l�x�s�"�"v5B�0̬0)����;3+�HR%�I����~=��rF�I�\��݃�]�T��9��tN��©��1��_L������`�P��[�nRU��@��H�G!��镲���չX`0AGR�!˘���x�9�}
�߁Q�%߄0e ��}�ڥ�j�\�i��-�a#�lz��wl��`�=�y�������v����[!�b�ֽ����<����wގ��F~Z��VU�[T��I{$Bu��H�b ��۟�.��a�l������
�o�u�c��[&P����!DC�(H��|�2����.̵~t,��M��BUA��Fy���l�%Z�����$��ԠO�7�0uyv�leJ����B��:���꼝�H���]��hjU�'�ya9���9�e^U��Jϔmf����p���Ʈ�o��GO��[ʶ́�Oo)ۻ�%�{�R�f5�y�k/�S6v�랲��k/��lo����Na?������ْ�=eØ�uOY������=�)I�{ʰ���̋�SV%z���l�g������1�������Ӌ���L�����N	�ǫ���͋�	
�2��� �Վ��eeo��j�~W�����x��L�I:{F���N�ř�.{��a��*�j�S&��g�Uz���a��3"30A�� �Nȶ�u��ٲF�V���d��d���d��0_�b��"v�4f;�Ҙ���I��d��u��f������\����1:�Z��O<�-n��=C�/!⓽���=���vB�e}ŷ?�s��!$%^�+#��U8&(�?�اk�*
��� ګ��&�ؕPt�=����ߜ�a¶���G�y��Ll��$_BU����;�[�L�/�O'l�Ĉ���f5�o"��†"�������A
���y}\՚xbO���Z�&��r�@����n�K��Q�id���y}�`ֈ)1���gn7��)ws��a;���f0�����p	�v�9�����,�?p����9��p*����a�n�p�u�p���L�s8��`���|�ap����^���kᰝ�����p&��Z9��p3�;8l��s;9T^���X9���[9�����j��p�/p�:��9l��s��2���o�^ϡ���qh簞�����!�r��y���,�ߩƌ��5��8l���P�+\���Q��q!���&��`�g�Yf����=�4˖ �n�o� ���[J�M_^hO���Z�`T^L�H.)%6b���$�T��)h<���x'$��"�H�K6O$7*p��J�$��!:jk#RB�b�5�6��x��	�0��!���ӏ�J���g��
���DK}��g�3�$�ڌ?ZH�|+@5�����b:�4F`ȥ<j�OiS���2�r෌RY�[6y@��%d)�J��~�অ��%�����R�n���_��Rw�S
�9(}tWC��4Vt��_�+�8\�4��j1ؖQ3�\tY�1_�:����r������̧q4o��B�c�4�I,��E@�:�=��\W�<���'�JhQ�ri��hZl=B�h�����wyOr�w	��S�(��Z
yUCV��˗Q/�r+�s)�ਧ�y�7�W���r�x�=���\�K)����;�7��]���$��ÏI�^�t���p��7��NO�2��dy��9��z�W|7��������JK��6�4��Ir�tS��%��ϢT-���|�,f’�K���O$S~��K!6O1�ߥ�[�T*-Wɒ'���B��4�y��_?ћ��_�W�[�BZm�z���X�o<2�F~zƔG���+2}w=E^�R9���m훰%��xΤ����Q~�=���(�i15�Lo�G��v�9�|Ȕ�(Q����ϧe�j뱬`.�Դw�R5˩aa�����8L��jn���K�,��rs(7�rs7��rs67�#��Hn�x����Y��C������ez�<T����ss�f!���j9�.f���~`�r�ܼJ������͗�9�����Dr���}��x�b���V/���J�����R�R�Qn��!Ӡ���R곘�7���J�J�������U�GR�i=�Mu��S����ș=y��:fbj��*�G��j?����L��C|t��b�Nl���VHՊ>���1�l;���O<}jiMt�>�T��r�I��$q����n7�i9�B]f�,𻄎�������m��#�_N��N9]rz�t��V��!�/�+ǃtrhj��;�h��v8�B_e��-�-B	ay���oO;3m�>��tz�sh�X�r|2}��LGre�Z\<��%Py�ܠ6ãFd<���	yy�!
�E�EFgɵ/�����=�sr�h�o��e�c����(��R%��V[!��9ǖ�*g��#��bXjN	5B��G�H�!-�
i!�a��Ö�C�̲r�Rక�L�/K^���"�L��j9�a��`x�����G������
�

8(<��QC��>B=r��1c����ƍ�?qRB�7MN�25y��gh�3St�Y�
��[L�[�͝7?=c��E��~G���ee�,�ͳ�/-(\������z����X��|�]w�^�v�������u�]�v��z�_���㯧�J�?�o�������7��a���_�\]����p��֧�(�^���-������?O���o�2�wO�oͯ;߽m�:���r}Uu��P[W/lh��7������zx�#~t�c�?��ɧ���̳y�^��__~���v���o�����������w�{�h۱��x��O~t��ǟ|z����~��/�;�v�;��o:���~��}�K��"�?w�7���C����t���������A�a�}<��2�5hJ�=���e��˼����^�?�2�5i��W{���<Ή�ŏ��-򷇅�%y�+��s�0��2�mΒe�\��$��VLr:�n�)�ks�+,i�V��e��9b�9K-3K�Y�9�a�+��ava�?|b�WA�c�GQ�~���y����
������/�NJ[�$�����Cw���Ufd�bk9<J�A��R��%%�y�WQ��
�����__��1���@A��W�UԂ��k��V@x�$-
���c+j+ �h


�J�r�u��z}��r+��]&�`j¤�yE|b��Oza���a�c�?��:������&pak�|�8+ǞS���l�6ua�ڔ�(�-�`�%�^Na�%Om/U�Z-%jK�%�a�YR$�$3JЀ�P��u�<�A�e@A����f��S��J�!#3z$Ε���y@B�9�4�]�j�_����
���%�\ �2�Χ�v���S}��b[UX�T��۽�b�{8���h,��w
K�5�4���;�A_��g��~�_F���|U�N��zH.�����K^)�����eqe����--��J��9%yE�U�t��R���Ю�-ͳ�K��V��#>��Z�{a��p	M���(?�r+4�2��[\�P��`
��׎����˒�,*,�LU�)*��ʂB��̚�kQ���!G�Np��&,),�`)Yq���|��c���ҒbK�]���b+.,ɡL�����t�ڡ����$�W���{Jm��`#7�L�~�=�a�W�P���96���G9�r?}�O�������w����������>k\R��s��k�9<(E�b���k!�EE�+�0��+YW��'�ȟm��LkY-Za��Rl������[�ƅ)���"3eJ����/���o�����#d�|��kk��/~(e���w>U��/�K����kY�(�U��cG[�YVXl-�d�v:3��̞����ּ%�7<8X�$��ɠ� 2h��-�1�j���ʿ��8b!mg��!���0+T>D��GT���aC��<�8��Ev^��6�1���x�A�vl!_�a�I�=�DA�Q�A$*̶�ƨq!7�د"�dp^�+��m~�>m^Љ?g�����@.VE��A��$<QE�'�vhnlTZ�����0���`^ĥ$Q�"���&��_��E� ��a���0�[d@c�5�����(Ixĕ�>/�Fy�Oy!ӝ>�8�>���/�U���g4]�;�'���G�&E���WL!�xcyx��|������5��u�TBބ7����'�y���G_CI4�S4�S����$�!�!x9��]X�������u�B��p����zF������\s_�{q&!{fz��G� ma�PB�e�ˏ�\�+�/ ė�$&!�p��L��`=�ޗ�`P�E�aD�&�0�N��;�Dm�9�=���p�bh0��t�i��yn�ò��� ��y�tς!j����_z�3/�x����%��r��r��r�����
^��p�C��]��%�w�L��Q�����t�y�\���\�
�:�*1��7�3��]��ϱy�d�'��紎���I~�6�)��7��������a�|���A�T�0���Z�#�w�;��ϋ�M�b��S�&���wƵb��y��w�o'd*��_25.�~.�NOٟC����$�רD:jBn��{�O|�W�$���[}e~������͆p9���̋�+>j���&��P��B:I�R_�f,�7',n�a�?�
�N����@2�t�Ai��Ad�=dv0��5d�b a\��\�d,*���4�'�O�B�ou�2+hw�x{=/�ӳ�Yr'���=�:�߆כ�M���y ��_ODg��~
 C��am��kpvP| �E�a�VEC=ip'˛ʕ��J���;\���ͣ��a�q�w�%�U�<Z�DF$>EF(���=
��6�/u6�l0	�7���@�3��S1,��A�H�A�1�<lRT�ඈF�� ��RSRS����(�ݐ��k��Zò��Fy��ţ����x'��x���P����7�Z}��Ӽ�1/w=��>X?�>��J��7�S�����(��o� �Du<�J�n޿��tP�[�p�p*7���
y�EL
�Wza��}��� 2&�N�1�|��B
��e{q?!q�e�_��Q5��E��Fx��D�EN�~����BYFBY�mI��䁼�ާ��z�r��R�����T���*���@�d�x������a<
��y��P?!}Q鮶����	��΁�m�Z`Z���+��TV}��o��($�q�G@3��!�i����@H/�I,E�����6��@���}�	����1nEM�!jE��FRٌ�z��.;%��U�Ў�LF��Ȉ�P(�d�{<��DF�-�Qyy�Q���Q��)��B\�C�X�e26�������)0�y;}N����S���ڡQn��1
r�;�c<�����H����3��}��_߇?B��A1�bOaSm̴�8��\`L˱,$k��
�Z���L��,��b*\b�]
;H
�Z�%mB�`H]���]�Sh�Uj�_X���©�e�/'�mYY��N7�ԝ���E��[��K�
f/�4����?�lͥy�"ˬ�"˭9��iﹸb�g�
�͎"{��UvKz���<KJA��,C:�q��a�`��I�[��}�.JZB��Py��/��O��a��ſh��l4���s!n�6���qNş0����UVIF�)�%e�E�������;���f���u�6HL�m�B�ǕRTZf��o�ϻUo���Kx��'}�B2�+�bY���xo^N���n���VZ�Q
Y�>��)����m���w����yr|A�ͳ���E3�j�]H�v���T�t	N2�`Z�M3������r���,���;p�C/�%NJ�
#i�kq��|G��b+�����P�L�6YrVX����R��t"�!��}2Jؚo��<�bE�����������X��,q,]j��A�C��>��E
A�r�2JV�������t��:�QB��e�HtIɱ�6��Rn'��y����	ʹ�3��-�^��lNQ�]���-ɛo-,I)u@
7�j)�d��%j�q�|��~봞�|�]1��H-�)rX�h�/�nC-�
�G-y�#�����Z��Y��D߅3#r��tϖ��g�Xle��>��䝐rJ?
��ĵ)06�C�ћ�R�T�ѶD��v�p�E��g~��b%�M)fH���>�y�b�4b�P��E�ҖT�^2g����g}8����4hԾrc�^�j��3��K��(3JrYr!�h�U������j�6WP�_Uf��'1mm{#��Z,$3��r���,�p�1�am��f��_%�(+@B3��PH�C�͚c���hA�y�cA�����7'�qy����*���&<օ����b��=vu��_}p-@�z���U_�y���G�C�?3�8B�]�>�B����:y
q�7oq
�M@��x�u������>�p�݂<ܮ�a�8�Pn��$��Gr��Y��)ܜ�����9\�����.��w���H�xZ���
��J�s�*�^��l�w���������{�����;��?���2�<�N~���W�����w�������6Os�3�Ϳ
�{��~���'���s(s���l����u��\$:'��޶�"{���#��Sg|�I+m�G5k+(����8�����W�p��o���5���!_<.>~G���>F��0�{�w��$�ԲS������O�/2q-y����^��q����n�p+�[8��a-�Z9��0�C�:5N�0��D�9���Xc8Ts8��HC9$��`�'���1�'8l少Ýn�p��9����a6�>=���}�5&q�a,��*9�&\/
����p�[8��a-��sh尀�lq�ơ�C
��Fr��["=��|��Vwr���Z��q�ɡ�C5�J���]1�{�+�/s�5^t��;�Ƈٷ)yy����u��֏A�YW��Z��B~��W�Ǜ?rx�<fr~�^S�_�<�9l�����s��=<���
���2�;��3^��Dn���ށw�p9�������!
:�׆C��^p\�W��\o�Y0&�E`Ќ��
��qxwF*�v���VF+(�s4�+��熁�Ǝ��
h"�4��OX
o� �4���
�4�O�bq��3��h��fx<�2��>
o|�����h�������G����d\?����o��Zf��ǟ�7�a�̼����?�^O��Q�G�1?1���k���B&�pT�x�w�����w7��x�o���Ї^�Ix�!���uK(��&�x5��y��lؒ���
�b�s��D(�S�>�����@�ɬ|}f�;
�#H�x�l|
�l��
�),,�c�Z��2@�i���p�t�����}&�V����Ұ�����[�^� ���0���V�����2ޞӢjw���G�-?m7�0{�stPG�>
`������xE��Of�:�M`�{{�F�O�^g��@�nXe�<~�93�0�V�#�w+K��fx��mwÛ
x#�&x�ox��O��9 {�#<3���i@�v�1sY�Ά��
-sY�<4x�gNg�hL�e
P��:>k3M��e������`�Bf��ߵ9��_A:��+�Y���s��p��8N`����M���̈́�)�m-ft�.�x@�߱�J�����:�����7���p��<BL����0-�ѯX
�����e��y� �[��a��-��|;�� K��삷�n�w�0|5@E)�}n�7v��›�P�>	�KV�+� z'o��W
��?��z�0����������A;/��9`n�s6��-�;N_	u�4�S�A��U,=�\�ƴ<Z	s%��.\�d��x7���_�djaf�	�o8�9�j�Rb��ڜL�՛`�8��{Y�^����N���p�f&o�~3���7���&L�8B��?�`����-�mD��C�
�
�އ	��`�V�/ L~�
��������蝀�����\"�zO�4Xn�v��gx��,��m{�;���#��y��$��/�>������p����20�ec���7�k����(�b}
��v3�f���@���^�w#����w�~��V����������`�h��
���
�4��y
�f&''�09��q����Yٝ��{Ж���U'��,=�y���f�S��q�<<	㐓�}H�Ƿ��#&c��>�v	��W~��_�1g���:��;xՀ�pt;\o,�W�}�8��s&��;��E����z
�ax��
𭳌&���8�w�x�q�x�d��n��w�3%k9��A�����1�#����,�c9��G�;����G����8�8���q�9�E�d�#�=��f�r��<�{ ���
���V����{��}V���O�+���ľ�wDw%��/��d%	 ~CLS�'J�����T�a�֖���g�G�z�7�c�֏}{?����{N>=�C��W�c߇=���y��{��<˕$��U�6g���mV>
�Z_�ٺ�Ǹ͑���67��>ns��	&�7�Y��6o�\An��?�Ep�S����g���d���d�…����8V��_A�l�B�~�i�g����H>��Cr���?�UP�`�DS0���`�jY��(5���\|y��ի��7���G�����J0|a��r%�ţ��f:�V��7��|�ru�����y�Qe7��Ͽ������G[��2s/��h�����g����G���J�����$	Gc��w���3`�Bw�����_>܅4�|e^�<\.�`�}�`�u[�,�#�'���
[K�F��5��L����
�.��g���<Ps��G��z�0��/؟�N��!8��
�?�D����G+�����s��ݗ�3��vl햨3�?��3���O2gJ��-��q-�3�<�q]�w���7��
��~^��nF?�:x�
���^xU�P�C�����'&&��L�ϟO��2�q�F��ϒW^y��|@�����[q��N��;w�cI�m�[z-�m���o��_^J�A�-I��vf�$,_���^dݟ��C�.�9�EFF���Ŀ�Z�z�Iz5KZ[w��wdd�u�o����܃��I�v*�wC?b��?B"�%���~���b|Bi(���3	�1cƐ��8O�O�N�Z-̣��ws��%, ��vY�x1Y�7�,]��,[����Fۏ5k֐�3�_�N^^�L���Ɇ�)ds��<lӐ7*���+���%d�+i��-���$�-�ܰW"�%2c�Dn<$�iG$���DRNH�S�{F"e�f|.�;��Hn�D���Hee%���#�6m"<�y��֭[ɶm�ȓO>I�w�Ν��W_�mٛo�I�۷���V"�vJ�����w�%ǎ#'N� �N�"�|�	��N�����g�}F墣��������%���I.\�@e�	�_���*���	��>��$ӥ��i.Y%�I�H�ȫ�K�tLnOI8���!�to��A���\
#�~+��7B����G��^�o��v����� �I�)��;����@�.���B��Y���s��0�����x�NN$�'s�t�N"}��H�/��#|8��V���N3�Z�x�*_���/B�&����4��V�l��ڟNI�D��gB�� ��5�#<@��`��#a��&r$���v;�&Z�4��D�s+�6��H/�����j�7A�%����C��!�[��C��>��_@�NW���-@�(�(<	��πBg�D��(��J��N�\�$��/I��1�>��3 �<��W@�Z� �
¿�B���c��������~$��o��7C�E�N��?�߆�<�|���i��2S;S�����11�F���r��L5u�Ԕ3���q��^;&f���2�����N�wz�=[��S�)��@^���1S�uz3f�H�n4k���]
��t��!.��,w"Sͩ�3+:rp��B̨��Ѹ ��SS�3R��
��w��=�͂�3�8%5+zР(�N�3J
�4��gE�t�t�!�z���):tբ{��a�𤙮� |�����T}j�$9x�5���CM������l@��٘�j֛G����^O��4�R�f�y��!��_;�D��̵�i��ҟ�l���f�	��H�n���
4�̚5h� ��rϺ�/K3A�
��g͢I�rOQ�����Suf��4�fq�1U���򍟑e�2�<�.ͽƔę)|��r�Q�u�gM��P� ��Ds�$��v��	�ʁFpL�	������v�ʚ���<��&@S���Q�?+��I��נ{��T�vG���i����J1�HY#ē>{�aS�Z�����3�ONHI6�tf��u �F��S{9{���S{9�Ԟ����$5��VU�h��D�f<����ϱ\��k<���y<7o�<:Yk��{<]~3�-ԓ-���z=��Z2����>�Ȃ�٘���O~�a��#���{�l߾��^~�e:|����X�Ƨ��0��	c�����#G�б���ϐ�?���={�8�Nr��9�ݷ�б��?�H~��g��D^��ޙ@GU�	�E�m{��Hk'��4$� �����(mD���I	�BX[D0@K+�H6�T"� ���[ 
��qD���nxI43g�/���U�w￯�*ێ{�lTMut-�ѩ^N뭎n�:����8W�r�:Y��.[�AR�L�O���W��A������l��U�o����]�z� ���?G�_�������s��)��)�_��{�5jԨ��j�5B�DEE�ҭ^�Fh��
ê_~�_Tή��_�N�:QWV���ez^�f�z���+��EEFE:�D4�u�%QW��_v�_��Y�~ԥ����Fxx��QU��������_V#�Q�V�zI�ʕ��+j\��
����%�U=�UB�DD1��V���z��٥�.�V-R��f�?W�F?�[��s�?�W+2**Ҵ�k�iY;2�f���<�Y��9uF_�8��*����i����a���e�$�\;[�a���;Ϭ��1Χx�|u�aaa��O?֭V�O�ց?���|��R�B�J�������ϝ;�.�;k8������/��߿W��>|@�ү>�䓥o���䐐�����(�Pw��΅~����u��4���������3��}��;wN�<Z֯_/�|�?�;vP��ݻw����犃�������[���۷?�q����۷o���WO�r_
�z�;ym�
��0�rmjjj��G�s0���j��{��MY�E�u�O�2�oݺUV�^-
��Z���w�^��믥��P�m�f���x�+�g�ҥKG�\�r��l7�?���������4�6�y�UW5�4i�=�_=��رc}�=W�:$�L�U�V3�a��}�dÆ
%t~���?4p*�޳g�|������Ԙ�U����GU���ǎ����|���/�ܭ{��u���o��l�=W�5�b��	�v�����N�x��v�b��\2��%�>�|���W�(#T&&�æM����G}dx�矛s`D'T�ͱ���Lt~p�o�����[~x��/���I��Z`�q}���_.�9rD�
������3���wޑ5kֈ�\4f6:��Ǜo�i&�oٲ��ʮ]��kp� o�	<�ߋ$}$��H�7E�^��(�x��[E��+�ӑ#E�+לr��֭�^�v�f�g������|������gf��Co�E���?<�/��;Dⷋ�~O���"M�(�E*u_�xY$��'N<s.�/��o�兝�'��r�g"7��������^qH�)r�H�m"��JZ���F��4i�$Bea8(�X�#`,
���r��cw5g3ݦ��q��UX[)�Tn�w�O.���}�����k���G�払s�
/�+d�⁎#g�=za�����"�*]T�o���M�H�w8D�.�u�H�������u��i�|�Fϰ-�ၬ�%_П��܇�񎄯TG��S�Ί�
�Ò�R��Χ˂��_~�3�Mp���QOJ����m��?��<=(N�o���k�;��}��-���*3�V���36�>7Z�i�����h��yJӦM#ԞO~�$����€#G��^.��J��6�lf[��oE�vq�[�����C�>���ύ�IjS�M��8��
�VcK�?""�D���������?��@8�8��=��TyaD�,�F��9�#Q�罊C��o_p��V��I׽�tU�8(��W��o1˼[�j���e�s�8�ʒ-��N�4���n-�+����3�<��P,r�ހ>c��||J����38X}�&�_c��9~���qV�;��(MG,.���[ʲ���Pkyn��0���tp��<��~š�7��G����ܮ(`�b�	�gk��)�֔j���Oi֬Y��(����b���km\�g�[b��cZʊ���Tq(P)kg
�������V�LU��X}vc�z�J�{a�U�Vuᅝ�+p�[\���{��&�
��X7.FV+/e��%#[�b�!X���6izj;��`{y4�����AF��(���#��,48xc��n�Q�j�+<�
\�	���<��{�c�/8"��>�V^QV)�G)��38�8�rq�����Cߎ�������c4{�t��f�È#��-�^xA�����<=���_���D�8����8�.��8�]}�&�i+s2����8��/SS��d���a��0Jq`�/*��ʂ���	���#���ŋ
>���½��^�MZ��a��`�Yq�&Y}�Q��LF�<�/O(ي�c��?T��&u4�b��yb��+����֭[��{��GKpƣ<\~���|��iymJY?>Fָ��̣��\f�8�S�(��v2)9���ꟻ���o9g������~{�������>�YYY�|��'ѩ����s��$�@�w�9h��?��ԩ|��{��^�2�&M��C���P��MZ�U}VJ�3e���Ӵi�6��z�����/����rff�<X�L�b��O?5v�X�4\�߀�""%`���-"'�i��?�D�m�1���i�g��ڵWh��7�F�����7�O�>ߩ5|��˓�n�M�w�.�?��<��2c��=��?a� ��)r�/d�͓;���D��z*��1�gl���o���_����n�喱ȏ�t�����K�U�E?��Ç��p~��7���^3��
��\Y~��G�C\/�t��������+�ή��l�rƬY�L��]]�1c�HBB�ԪUK4h [X���Np�3&2e�ƶ�3����G���@��~aTY�D?���r䧟����?̜9S&L�ph���2nܸ���III1t׼��8��	l��5�0r��FW�G�G�1��R����g��\�?ܬ��������>	�w�u���šaÆ2l�0�|���X<��m͗܀#������������9���-�_e)w�ر]�t��#G>��o�^z��aއ�`'8ؼ�\���N���ye����Ֆ��v��͗/_>��|�G6���f�.j�C�1�ۡC����ƍ>�9��Q�lYݰG�{�\a�᝭o(L��*ڿ0�+�S�7o�4��>���+�C�P����(]�v5�5o�<?���n���Ħ��6z����
V�O�:BCC��y�7o.v=�*��}��+�|x����O}P~�ʛ�|4���z"v�b��-[&>��@��o��J�b�m�����o�&:��GE�7&~#����>fs��q��Ϊ��X"55��V�u�߰5ȷ�C���'�	<�&{�!^�.<��sŗ_*�nV� �%�{e�+�^�6�B�Ѕ�'��,㧽���������1���ΝK�1碋.:W�K���{8X�X�����	�����������r�,Asth&�;�O��+�؈`�Gj��{�<��SF��t���%d�s|���Ƶs�
�
��W}O6r�[��~`��G^<��+�駟6�lu�	޶6O��92c�j3V�T�߁�~�_��0�ئ<�0srr�������\,��.8Oy?~`Q�2�{�Ϳ����<m���|�=9x�-��@
\�]�8;S.���ͥ��	�=�������_��]h��"��<λ�����O�%�p�w�`�����sB{�`��sl>�;�9��k(�v?�[���%�^[��n��YW9:�1B��
�Z����g8��?<ك�.���u.�
;�T��qÆ�q���������J�1�=:���g�1�qÅ��{��1�=Vr�U���1�=ƹ���Q���o'�9���=U�Y�)'V�ާ�M�G��E�������o���.III�k��Qm>�a��1������GE�~!�iG��F-�������Ȏ
,���T�\���v�T��b�4�I��j��K��G��il;@c`��p���7�*�'�J���[�}���{?��m6�_�ת
��=�z��Y[?wc��:��-R��2�3��H���
5qj�)��B��0��q�g̘��N��G�:�[M,K��g�f�,>�/��C���6�j���ζ?9��i�/��=y.�GC��7y��{�	��-?XZ��q H��g��y�&���{?���L3ۭ��/r��@ߴ����}~�+���3����e2���k�ƹ	��0�?10����J550����̿��=�y����A�Q��Ox�[��-v���i�F���w�x�#��/���%Rϥ��ݟ�+�㻂�1�����DŽ<F��v�o�4��,�%n"h�{��>���0 �	A��L���ԧ3�k��8k֬/썜sd�o��J������3�wL$Cai�-�kC'�wz�'�1bD��ѣx{��@�Z0���k*p�}�"���m�w�K#{��
FO��������Ɖq��E���&�q+����Л0=.w�Q}n4{���6o��b�I�&%>��3	�"�>�9x4�=?��
�WQW}��m�u���z�c�:�Ѐ���n��n=��Cij��y�4��@�����'��>��%n}}�G'�3Mv�d�]Fu�{u~���o�3���g����zFE����B�n��=����'ON|��g�
��ͫ�s��-�G|Ơ�{�N�&�Y+�c�92m�ĉ��a�ԩ��aw�}�dz ����9}������A�Ү�WV����t�1���bI-=�fy/^��M~���r�)y|Jgg����]�"�BB��qqq��Jo:99Y{�1�����V�hs��#y7�AY=��y��cވeٿ�廯>)#�i۶m������5�W�^oDGG˃>h���٦vash���g�G�Of��^�]e���Q�Fw�ޛ<_O_�ޒ�YҳgO�wY��`�X?n����y�/�+��[�}��w����_�aРA����#�2`k�V�O�HII駲��1_�&�?[N������:=j�w�y���k�K���ʡ}F��WSz>�k��|�����F�����RK���~x����}�-���L�\�~�T�b=
��S�LI���M�97|�~��Idd��z�6[���!�Cn����e˖�:�\�"��?�����5y|>6���}��gz���2����/�S!nW�9��K��ayk����cxV����olrQQтs����>jk��/
/]�T�̙cj��FjN��x�{����_d	|m��پ$0 c�8�?�\��>'x�{��_�(v���,Y���WZLr���|פ�yN��l���q"lLܞ�Ӿ{�<�wv���-��	���_9��톗	��ð�>Sy�0w���yyyG�F}?��.X��4��x�����޼��\����9''g]AA��a�Yuz��~�i7n��z\�أ�w=$7F^}��t�8�T��׳�0K���s-2Mg��Sز��
�Lħ�5�i��i�f/t��D�X0q ^��n�'�+�M����w��'�b��n�D�H�J�@����,��^+99�#��\Vg��l�����^�~�}�1�w�S7v�AC����5��ずur6���A��5��`�-�=b=bMb]���L2k�stR8���w�m���0�gs����������
�N��n2{t�-�H�2{�l�}5x�������Td_�~��ݢ'��֗2�f��}{�=ɡ��l�?l���a�Sxy�w�b���g��dٸ���s��,[_^�/�׭[gb5�<v��~`O���_������$�~���G�	��]V�?�{?v�YZ�+'|6�$�%��wo޼��{YU���ө�N��i����+x?ĩℇW7���/���N���v�~��~}���_;��^�؉�X'~y��{e��ݵ߹W��_]��T�D���tw��op��W��ۜ[������f�r񁓁�1��\|/��׾���`'�IvҜ~�Z���$��iN_g�^��\���l�����N��kq:�5�N���׏Ph�,ɬ�]W�Vw��'C��N=��w�t2�+�ߝ?�Zv�:3���}�@��"k���W����Y/s�z��g�su�g���fF�cS�^4���a��>MWL�`8LӀ�z}���q8�����ʤ+M���B���^���z<z��ns�Iva����	c��|v�:}t��
A�yF�S���Y-;yL�2J�0���O��L�<�4�W�x�ű���I��RF�OMI�l1$#�Uf�I����R�{g��wp��S[%f�6z]DxjbZrߤL��S�D\�8:��e������i��jWk�O��L�=$#y��\��H4DwI��-#yhrJR��̒��0\o�O�vM����m"3;�
�`RFD���v��ßm"�&�d&E���*��S�G��{l�i��F� ��Q��m���֮c�η�ԣ����:�W��������o�/�/^|tqՂЂ�1�
z�/^�h�̂E�
��*(.8ZP����9�!N!�˩���p��%W-ܰp��…��YX�0|q����tӕе�u�1��4]1G�\��n�uu�=��A]��U�U��u�h�%����������/�7�7�7ӗ�[�[�[�����+���������Uu�?�_����;���{�������O�������W�7������{��~'�=�9�sf��ٕ�����)�[n��
y[����s��W���ЯS~7C����������/��D�������PKE��T�g�8*z�pip/_vendor/distlib/wheel.py�}kw�8��w�
v{rI%c;���{�I�n����I��8�� ��D�ew���$H�N�ܹ��L�"�B��®7�?�&�4I/�e5��ovvwv��Y�.�˫������G����=��$���Y�)�C(�"���S�ʼ�Jxo��U�zg٬ZŅ�g�tW	��?D���^Z�xYe��b!�
a�	�8}z���$�>W^�N���_�{{���o��%�ۙ�‹�ٲZ"��d�gE�芈�I%�x^�����?V��̤T�7Q%�@�"N�
�B�e|)"�͒�Pu���j����Oe������%S��t;yV&��R/

��ZV�\�Z�:�X�f�_�ɸ�
�(�E	����,)+����D�HuYv�-�q�na�\��%�s�9�f%�H3�f?WQ���e2ZJ@�I����e��b�mҀ��-DcyU6x)_��'�;����8yu��d���ɋ��a�s?/N~>~��v��l�[���aF�|��jU��{z��[ô�?+p���J8��i���C�RT���2C�x���r9��&����q5ˊ��[��B�|���1��?��i���~wRY���Vב��!�A�(J������
�^e�@$v�	`��ՕH�T���º�����`�=?_�k=˒t���C����">��ߩ��/�Doޞ<?���繿#� ���!���*���S|o����;�/�y�o%!�Jq�6�o;������?�Wz��4��gt�o�%ͦY��xiVy5�C�)��^y��{�3���;o�
���k�{`����
����ۧ��ws����c"��G��&�o���^����k,�,���w�Ӟ0�1�N3H,���E�D�AX�����ޅ1RS1�"X�ɍ��qH����">GC���Ϛ���YG�N����7`j�a��"���j�3gO��M��k��Y
A�?{����c�y|V��w~;}�K��/�_�x��@Ѐ� ��~~�ƻb):�����Y�ם{��>˲�04�_�>}��$:;�ۉ���9�{ Y��0�J�E�Y
	Xl���sx:pj�ni4\>R��OY�Tp`Lok�ʩ;7���]+z{
A�4lVA�N��o��.~:����`g�?oҟ>L����^��W��b�����:�����8�O�G\�.�%>�����v�q���ӟ_�~{����o�
���3�cwi�yv����6-��r���ϭFDž�������?ҋ�0P��3N_�j�=�:����������`�|��2 ���_^���c�fT~��o�וO[hV��ȉ/<�l��"q���i�e�^f�7w�(���kٻ�����I1�1Z�_Rh��@p�52�JRQ�ݟIT�!6���\�f�gQ*F(A���29/1�w<X�$߄vm�5�F]j��_ށ��ӏY�ə�i���5]���L{�Jz�]着�����i6�F+̊ˇ�BE\���]U��.��j��lYL�e��ubR��}��nv!��o��	�M���*tpB�T>�l���6~�P^����k�"�9�����"�P|��{���آ��3��e�� �
���lREQP���`�3�>�z�)�	0�����C��k
/�N	Ӆ)�(�@����sU;_�i7.s�n�@! �5p0ڭ+�~�B"̳<��t-\7�C��N
�޵`
^�w�g{S�
H>���ў%�T�(�>[��;BvatSz�,D��W��5	�9o��LɘI��F�֓���݅��T͋��P��'|'�5�Қ$u
D�4�J�2�}=�4֬�~�Q�Y]=^�뎸 �Q��9��#������9j��&1�B�@�O޾���<�\�M�
(�wyt�e�PN�Xg������f'�~�-���
]��d>%�/a;�G:6UE��(�������P��?h1*��u���]��^^��}�ד��gd=H<Z>02�ez�<����'�5�2&��>�*��D��;�N���y����@7:��l��q��Ƈ�l9�F���?�2D�2-�`g}����t��#������w����\��8]7���J���'&�i`�\��nu�`H�t�X����zh��p�Q ҍH6�~��T��1H,��*P�[�ơS���oxYd��$Xs}��&�}~��/Z�v���fN%�:����S�Q2&��|M%n�&�/j�=B]}ԅ�1k��8u��%����GN�z��=K�ܴ���P�zNJF��:z0�5�OSZ�!��w��x|�͡w��=�;I7~�ED��%��/�i�st��u�v���o�kq�P���t��I��6��q���kP��P6dCc�6�a��?ћ��+�z�����&.�lYz��L�ҽ7��h�Ξ8&����*�����:P�-&�X�4d:�E�Q���(/�"��dQ��C��yq	t���fN����e�W��p;R�C+
��@��>���tm���i3�H|�S6�.oc��dӼ�b�����I�EV8;0���V�(���+!�~�s��"�w��Q!���ps�u"`�4)'�n8q4��g�`�mnOEr�ȩOӣ95��f�9�9"��ՠ����j+���@%�e�&�M��@�@��1kiIH�_Pk�~�p�|��eQX{���@ۍ�%�2�Y��
�e�}�G�qe2ŖNA��zIV��=O�*H4h��n�ͮu�?K�=Ov����]�G���k��v�$/���;�b�T};�ܚ8���P���W�ڽ�؛�v��2RS������Cs��,���-�4o�3w�T}�S��H0��۰����$
��y�꩕�d�n�Ê�n�$)z�)�d�򱔥�A��]Ͳ,�k<_
inPR(-H؅�$^B��K_n#����,)Td��@�Z�*po�ф�1h�!M#�������y�����j2��ML���l�5=e
���h������$u˒�
���w��n��X�M[J�D�NM��Qy%�qz)g�6:��^�8�z�1E�^'�ij��g�l����Y%
�>Ԡ��j]p�s��	��~��
;k�L.�B*�">A�W�Es�}�d"9���
-dm^ D\ɠ�t\m�do�2��<o���6V�II.55�R���|��ƺ��9�rv�P
��wd����с&��
!�w����h���Y�D�(`������	�8v^��/�߂2h&�Y9)�������w�>uE���v}m��\�)�bl���?�k��am�ux+j���hhZu���XK�"�72)%�
D���q�qr±�w���/����ˬV�PF!G{��2��퀁_��
�8B2\�2��h��c��&p�AX`�_���8(�q9I��F�����
#���S�?J���Cu
%��ƈ�:�$z��8�"�b�����,�h��6k������X(���Φ)l�z��h�l�<Z���z!������M�R��!tzL�B)��9��%�A\���O]�{F�k�vL��˱�6
��GB�.c�Lr�Y�rQc����Rݑ�S�1{KǧL�����7A�t�5� ɍ
	�@
>yS2���=y���3c=�XZEtV5C�T�<v�Z*z�j���Es����Jdu���nzǻ�P�,���!Ðÿ���=����w'Ϝ޶��_�2^^�oEV	�-Бw�BFH6�[P�I�@~��nt�r��R��,O_s�p^��Zه�2X.&�,�,@��d������p�)�w�$E�J}�#����P��a��2�RGEi��X+f�!݁]�}��>F#@�*��K��^	�.����:Cgc����H�9���YH����v|��D�q�u��(U�rF
����cӅ��o�[��#�,	���
P�¢��պ�6jXFr�aT�f�ڒ,��4�y�
�廓��l���ө�o�����r�ۮ�<)�sW�l�W	�K�<b$���H60��@��0��H5/��r�OU6#�1�jI��
O�$i#�V��D����T	⏉v�enWE9�9�^���z��4�%��U܏��{�g�Ǣf�X�ט7�֚OϾ�&�)2c��x���UK*�65���q�s4Ȩv�kN�泵��|�䠎��[���Hԏ�j{Ն�M��U�j����zYuE��8��Ψ�*Q�r�0�jI�M��]�r�
=~uY�+ڜ�,���$�,��4,�Q��mî(�a��~��DTQ�4[9�u����r�g���ˎ�6M�E:�0��3�f�=�ؠ�c�w�E5�>��y�ī�m��R�ټZ��q�8�6+֠U�p�ݐ�O�;��\n��h}�e��s�ˤ�ȼ��a��z���˞�����.�*�]<_�;(���i)�۶�Nv���zn�X���V���;.K��t�s,��tP)C"�(a�6K^����^�L�#��֝l��s��֩�m�7�O_��;~���-�8���	���6ỷ�z�9���:w�͊>-w��v�z���)Ibv�"�ٓi���K�g���C\`�ҙc�'����98:-GoXI8��h]�����{N����ͻ��Ւg+(�&y���t�Ի�s�SZX����
�D�VZ<>�^I��ax���x�*�"a�V�'}�
(Ɲ���P�B�%�R�D�KڢxmyU2M�]z�0^���UR������a�C5�di�.�%�7�c`�&���2�Q�̰�*�8���?K��ô�0��#�@������b�]3��	�t��
���"Ɇ���I�=8��i���=��ȰX�I�=➴%+�<F��(4��!��'P�UX���F�<�p�Q=&[i	���F�p�TA�t8�2B6�E�u]�c�}野���_�t���Ⱦ�e�jڨU��P�RY��q-�E�q��4�<���Ԑ,kMkXy]��$���!k�N��{������z�t�c�" ��ԯ>9φ�Y	���,�К���i�܁gqA�;�Sg^f,��嚠���4�6��)bB��z�Fu�
.�x(�a����Y& a���=�u�غJ��ϡ¿9T��<L��!
���*}��*Ѷ6�*�er���
�����|FAYe6��i1�NA;E8�Ǐ�l�?�[�U~�
F=co����P*e�Z�/��S�Z����Bf2M�P2rZ�@S%�z�J��SNӠtV�Dh�ɈIl*��L�0�B�q:Y�b����ۚ�2�)�@i�i�Cr��˰/
�
�H3�4&�
GT���CR�i
}(M�R��~f+�c��.�F���x��I�\�aZ�3��`����5��uE�*99�4J8��N�x˺���C�	(�fi:�H�Dt�aO
��Č���`t����@�	z����r��`�#&�Z��h$�C:�s�љ?�q�%z�s���L��k��E�{K)���Ǐh!���f���P��b�"��P��EEZn��1U��!8(���k�|���k\��@
��P��,�:�jShVwF=~�о`KU�Nߍ���ny��\[#�E|����"Ǡ��<;*��m�A�����|a�����4^��h�:@�v����`�ٲ�fC�)���K��aю�m�Zu����ƭ��g����,1&rg�
x��HA��uq4�Q���n��]TɠhS)st�<��vwi�����X{	�'�h�:�K�Q�w�-)o� 踔T���k8���DE��_0�D�pSV'�c�2��Lu�
�H��^wY2�=��
�Կ$f�|>�'�n,3C�0Ƙ��<=
ZE�ި��,[�I�T\�vu#@�}�݈��X�PZ�/�"N%i�@��05hB�$��D=(�P��IG��e�ʊk^I*�Z�����
'�AT^[�@;�ˠ��t��T�<��e:�%T��eu�QOJK/dyCN_�<VV�v�J,�p
�}ʾ8�1ڲX+������B�)�\��'�tح�j�̦z0=F��} �y�z�˨nI��,���E�5�4�sҵm@��A�Ө�r�#��487$����GU��(6	w>.ҍOWh!�G-���si
��t*>>ˇ5U���߃#���~$K+��-7����)<6
�G���ݬѰ�>kǜ
=;*��{YƊz؏V�pI _7`��A�C�5fZ���&5�fn�@�C�wy�𱃼�C�����n�&>�+,)#�+y��zG�w�ӣ��5�f@7��kJu*�дJ�n���f��n��f��Xz$�v&̠3�����`#�]ٖ�?�[
5;FG�Ck��ֆ�ީ�Ce���PO�NFF�G5�z�ݕ)I�����`<�^t���wJ����?z9�KR��IEV+�������5M�Ȇ��\ē��e�(q�
��(����K�d
mt�lF�Jh��j�
A4��'N��zK$���������ッ��\=�2/C{�e<F�����]��IF�/V�s���+0���5����IbD��mm��Z�\-�i �y�ɍi<�0 ��'o�����0u���׿�%n1y���(��q��F���q�v�8H��CY�(M��m��	�{�c�6�|����������k@���_�1�g�]�N;�z|�|���]XРXh�8��ڄ�^5��|�)d��$��`HΑ┨nF*���A_�S����m��<A��$
���t��#{�9�(2b��5y'�r3Mv������#A`aWq^�������#�<�	�'.t�Կ� q(��Z+�"��RC
@��[�$�����\�u��wc�ʿ�X���A�A��8ː�Ö0m���!"�v���>Z�.��aJ�e��I��'t�r�=�r�M�*�:�.�r�b�>$�LЌ�a%@��ЂO�|�d�P�B��z��u���|���x�a�C�J�SM��
���+�d��>yɑK|�Dx��@,�����'k��`DH�y��g���Ln�@#�A@|NΛI����.��R�~��#��R$��]����}{�d2�rx[�xyE��g�gq�w;v�8Jɼ����1c`ބ�c��fZfs�V��e�i���]������ж��(�)wo;�K���G�WtO5���掚���>��ɬSvYK]O��>�֛t�Y�y�݄�yӄ|0�z8���)7��p�����C�7J`�#0=�	U��nE�v�MS�x�3��<V�Szn�Uo��"
��o	J���4r�%��[�c��������^E���03�`
	�v�|�:"G���˞��Y���^���r��ќ\��e+rI��e�R��j.�_��M*`�`���� �m��9���/
��s�[�}�}��>/W�݂!��%�J��$k�fl�ڳ���6��!k�}ؼ����A�_l�'is9lH�_�%!��k�C�g��U߬l�[O8|d�$���{��o��hq{:��5�&$��=T�����:e���:D�OWr��yG[�%��h�OO	�8�[V���Wqz)(��-Ânż?D�UP��t�v����	F�$�<�(�@���+�@�;#:���qJA=-���7B���׈�8X
+�m�j�l�_�����U�𬴇���w޽e>R�Vv�4X����8*�0>��c�I�Y�J�E�u��Bٓ��r�qe�F�%ukfo��g�xΗ�闸Cӭo�t������y�M�L9�6t�|Hf��{���x����j�S���C�a�#��6�	��&�����������M�Z��.�k��m��圙��n�6Vg�22
�2Tթ����U2O�K�q۠��\��E��
i����UDp�.��"�raX|�$C�uC�Bo
�G�J�X�Y�mv����Og��g6�=S����(/˴#����f�e�kld��%��^�v�X��NA;"�˽�{�}�3Z�5��VW�Ά���?�"t�
���BL����oY���.T���{Ɵ[�PS׀�S�پ�u��nD"��
�Msy�:O�S��ˮ�1���#iRF|�n2����&3}�+�l�\[��#,˔l��Zs�Tw��۷�[�!���q>�1����1�B���C�4�]����G���z�=yV#L��s�4~��r����b�}�JK���Z�H��-���S�a����XR
q�ևM����N��1܀4��10�.-Q5�Mvy�V;S��Kl�9��9�|�f4]�y���CN^��J�s��Hf�ꂀs:�saC�[W�5�֑�����g��J%���:S�(Tu�W��y�:��jA�yC�2�����4@��[�#�֖�D��{�=�������k��1�
��w}��}=�|���Ae������ǝ��޽~�Z�,�e�����#q�9Ƴ��;����N��u�#;��pB������+���FPr�r���d�
^v�2�hL�1Q���4��0_{�`2���٤����X�W�g�(iD�l8tӰy�z:��)@9kB�U�a�
;�q�2u	Կ���h��8\�HUg���G����t�j��
G��xl�Na�[�Y���m�I��G��ǣHv曟Y-]dS��lR��_�ސ��=a��ce���g�)^ �x�xR
՘<{��Y�]dΊ�YU&H���/9$��Z��D&2qшW�t3�ݹP�c�8�Ը��ˊ�"[%��)f���e��SJ1f�I��_2�ep����8F'�"3�/�IAŬK����`n-ڊ�n��PD����Q}��r��lJiTj=D�d26`�-\t"��gx���|yC5
�2�X�I)[e�a�e@1�YY&�Z�*�^7��a�|䜓�c��Ǐj�r�#a]+s$���~p|�hT��JY�\�K���>6����ӘȖy匪�,	�����?�d@rdO��j�&QU���/�R)P��
�|n��mfT��2/m+x�S�/y(U��(+���K#Fm�X7��?��z��r2��\ {������v��UiX�,�J9l✍G���6�y�X%�Wsd���7TOe�v=��n���zG
Q���y�1NW���C~�(��<��!q��n!X��N
Q�
%����h�.���W���/(Y���T��ar�}}=+HZ��W�;���57r|:����)�1�VR:h2O�P*��z�xo�I��t��Y���"Q��a�\L��Qи�X�k��[y�g����y��d(��?�*6M%�����.�t�A�
BoO�W�R����ģ*��6y���@��0�lo�Q4C6�N�W֎č�G��1g��VkȷWN�N�ƧS�vn��E��r�wi��!y-:��dg�>o�BP�`#�T�d�:7W�m��<'�@���?�L��th�)�����ъV����J2�����+/S��+duy�P-���䭑%ݒ�(�5��KX4M�w��]�x:Őo�۷�C�0em2[�~w�h�~���}�@y�
C��4�.3Wchc���;N=�)��t6�E��,�O��t��sx���`t7Phz�]ژ]`��"�9L/�<�e�������&�ks�bc�`=vNwY�S^PO3�6m�j���v��[/4G�Yd\��4�Uґk�bԝI�-u�kI��ն^2 ��G7��J�N1��Zy	�`�׶�7	D*�A�Y�;��ԫPU���fbB���=N�H�G:MM�0����v��T��FM����爅do��"sǠ�
B�!�w��L�oe��օ*s_p�I���z�6:{����_�X��S�ĭ�+j����V.��dj�����$�I��M
R�;�9ڗ�.T�$�q3%�1Sr��|�aJzm�Q��R��"x���R{Й��#�$�r~A�ON��7��`�d.���i}>ܜ�\Ɠ3֗�a�0rA�v��ӸX%�5�ro��?��z0��S���O�1l�_4.Uf�]�
�����ȸ]ٖ�hR���B�3�ĝB8���E �>��{�N0���K@����yL������o	�Q`�nnFv{�h���$��Uj�pG�hk�&�~�f{�+L���ӑ�EL�,��۱��������&#A���J\�8�=�d #��"�)����a)�.��"F�v���qb���]�,ԑ-�"�@��k��3��X��	��cd�6�<�ӗo�7oO�KkcK	�z0p_xè/�t=
�sk�j����`<C����#Y��N�,u��T�K��H�x��tJ��ep0��B�F�mp_�{?�®�&���������Ip��?�����}�b(m�?�f>ܹ��O��1���,�{'�ɚ��՝3>iF��8���kķ�R�������	��;3?94�$M�f���L��|�=��Yj�������7��N��8���|��m��y��)vлt�꛲�֦�_j��,H��d�9�\h����^R��`���L�^ՠ��ky�u��z����wͱ���w2Ӯ�9��j�7��/׈���[ڪ�PKE��T�`p�#�pip/_vendor/distro/__init__.pyu��N� ��}
�'M����T�l=ī
��6@��o�,0���2�Og�_�d�D�h"��6��Td����燮}{j�i��cmS�I7<�p?D�	5�6k1�Nh�1�7v)<g!�y���S3���}��KN-�)B���>#�⛇�r*`�cI;F`��M�K�p�+*G��Z#�:��Kh��S���g�궪��䞼_vJ*�.�2�Eg�;�!�C]��O��6D����ʹ�}�$3Z���j��k��^���3��-�{�a��X5ǿТU�PKE��TT�i<@pip/_vendor/distro/__main__.pyK+��U�K�,.)�W��-�/*Q�M�����LS���K�M��W��UP�����+Yq)����PKE��T���=,ɾpip/_vendor/distro/distro.py�}mw�6��w�
���ɕ�&�m{�uw��mu��9��vo��)	�S�.I�V{�ߟy@%9/m�=W�45I`0�����_���8���X���<ۻ'��u�̯*��Ӈ��?��?_�����W
A���Df���U6�����8Z�����?ʢL�L<�>],�Q�:���u��x-���R���$�B�N�I&&�b�&q6��&���$�R �qC��/�if�qE_U�r����M�Q^��\�|�t�������/�T��(����9^�x	�L�1`��7"/D</$|�r��H�$��E�Ϫ���e��U��W�C(���.��3�9:����|x�?
/�?}q!~::;;:����3�����bxzOߊ����'O�B��y�,@2A�)��\J�Y��K9If����W�\�y�VtG,e�HJdd	�MJ�,�*��M�S��^��ٻ�7��Ի��R��l�zWV�$�&��V<Ѵ�=�,��T�{IEԞ���R�a��UE$�(V�S�V�+�A �����d��Ș�!P
px���j�2��K�`!A�;���i<��T��i��Gr'�$�ӽ�r=�����JV1J㑍�"�W_���X`9H�.�I���P!��9��[I�%D�@c9�Rdr܏�5����(�}�ML%��$F��1g������K���`�xA��\�hEbX�{aJm@�u}�4v�R� 'R$��n�L``�E�S����B%�U��}�DC�[��ZLb�4�����^<A�p<��{�a	t9�aC�ĥj�|%���=�
�E	�b����FRT�|}9"�#�\�A����P��/㢔��M	,P��De��R�U���U*o��j�3o��OP78X˽Y�/D�^��Uߺ{~GٺO<��ş��$����L��O�,r�tZP���B�V�S��j��\���Woo�*�z@M��=���(�+ݫ���KU�!�j�Fj��F��0�"���7Ic�2;X�k��"~��)�1����*I��l�K�V����i]]!�x1�ʁ�}N�kY��S����
�^�-����2/#0�I"�۱�v���@V�N�+�8?{:�����N�	H�1V>=�?=>:?��9>9zv���KЙ���D�7E��)���4)���@����&c?|�۫��(_�5<�����S`g���#���dz)�}r�b��/~�k i�˜�b���u�™�u�߀�B��G`���1X���+J���0/붩ف8Q]��o�M�wrz�����?�� 1�O�|�w;y���E<I%����fC��,���%W/�‰D��P������1$�7�ֆ���]f�/|t�W�jUd�!<,���&1FP���D���6�d;?'�����,�ER���la�)�\���)e��$'�o\����Լɋ�]�^\ɔ+�}�T|�_���"au����5\�t�4X�:��	|��D
�w��S��G�@u��`$�����J��Ul25��I����dx~qv�(s(����s��I�&y�,m!��5����P
j[f����<>;��]\��:��P8{!E������^��u��ޫn�bޝ_<�t_��F��:�~��}�e�b�G��:�b���
��7�4��&.�.`����˃����J���_�P��i���18�sc��
̔(�gs�s���gk��+&]g*�0֮O����Hc�ի\.�W!ˮ
�Y5�w��+���8^�Ij�:��͹Mw�JS�͈��q��Щ�b%{��k� _B����f�
=i�Y���@<�>�I:}Ÿ;���.i�m@�|�|��;�9���Q@A��vA�d�cW��w���x�|G��PE���(v_�����e��t8#*�s�ɪ(p���#�o�| ���dJ��ko�o���܉	�M�Ugy

�0�P]վ�U8����(�#Wfq�Z�'��*E����(�8��I5B��j|4
��
�t9��s�"�΋�\�dj�N'��@�+0�eOij��"�'�7��<ɠ�æ���J�A�vwO$��	<T�mjE�LTbgq�#�j��%*�g��4LJ�{J���4�b�ǐ8�&�'o�IE#��N$c:D�P��95B pe�*&�]���������&{:Mf3I���0��(	9��%����K¤U�LU4&	O�L��[%�����D	J,�)Ac�+@"�LYƕ�s�	8\q����_�}1~�,=�	@_*��`�#��'��T��ҵ̗�4.|��m�����5z��A#oUȖ"����d�Q;
��3�v{}��e��+��Ҹ�Zg?Q}�*?15�o�tO�S���G��Ǿ��Q;��zS�\�
(|v��(���66�>�Y�G<�`	R���'�Xh��fqu�$a�sV�Z��z�^R4��=���4��0��2��6|��R
UPs�Y5T��-uGmČbJJ�G&�E5�Ȇ�X1���^۷C��?o��p��������ƫ�Zu�轠G�}4��У�-�A�ߙ�~�g�\v\�KS�1<��󧙜¼�|����	������c5��Z���&��+��x�KfA;ZĿ���D��.�N�|5��F��#c��"oAA�s
�ms��) ���E�HƋ�'~�oPl��3�����P�@�����/���R��u�ʅ�g�̟ �IM�g�?eS����ԣ�'��4����s���&O�'5O��\Z"u��8���91�.��HO��$���87�6�0u�\�B7s���-��h�ןA�<��S� Ҿ9��2YY�ĉ�̧Y!���[x4��4�uS���z4ߋ|r�����Mn-�Gß�S#pXF�W�[��[-WΥ29/��7|�`:�H*�#�>�[����f���Ḋ�H������+6�gR��=0m;��,U�,R%q}��i�p�tE���O�eq9�N���<�^-�U"�k�(z1s�r���L\R��1�
:�K�N��
��f��Q�TQk��e7�"~�g�2b��ف\,���֑|3�B��EQ����~����N�]?}��s�pmC7�`,�#� R�'��q*�,㲔�m���B9�3Z�#���	�`��K�/�b*>ץUE홢��t���M�����3�b��\��%l	�9�*�}
dM�j���m��JK�m��rU,��e
H�-4̀�)��=�
�J�7�������̚Q�ۥCJ��qD�B���pp�6Ai���e�xM�8k.�ɲ]l����pLVD<�o��N���6�We��dRA3#?Eqw�C�_�n���i�-U������V?�T-Q����
zn�w�A�><�c?�Bm�c���#�� 1�#��]�#�a�MFF�T�J����
��h��%m�h-��F���g��FWO7���F�_X�z'E����.�<D�_5Fgw��a��}mn�+���@E⬽U�G-d@��H��g��}b�rR$��ᏤD߈�o"tD��)��Wz#A2�vP�:_��u� ��F�3һQmY�J�/	i0�����Q,W���]�fT)Fw���Pk=f*�߄�w��Dm���KKc(5��|'˼gZ>�ҋ!���D.Y��p'���#�d&�Y�qL�N�#��7X���λ	���Yr�)\^`P�f��Sp�J�����y�1d�1'R����	�e�L�����p�%�3kB�[t�s�ӽ!I�B�v�aY0WT��ܾq�)"!�%̦��1n��BM�ċ,�
&qP�E��ZG%zV�|��~U׍P<:\���-��1@��eF�&�d��h�
sd���em^��%�ƻ�@�#,
4[�[
�&qX����W��l��R�����N�A����(S`�i-���a^����ӓ�n�6(gjQ���uT�>��"�g��Dz�o�6Lwoq�'�[��
�z�J�M*���߀���nHmw*��Mp#��0�s����Zi�˞�
����}A��&<��L;1������e��jo]ϥR���.���:�
U���
�)�,�Lk���?P_m��T4��i�PX��"�ШM$69q�n��WV0
��V=���l�~"�۸^9E5D����4�J���@��X���$�a�-{����i\��	f�|iP_������o-���\q�VL���?�l��'�I��޳k�y%���'���2X�q�Û
�`�^N��y)�5Zc��d��}��bJAX^s��
���9�gA|�yԆUtz��?��Z�P�
,1�V�CA�l��i2���]M���-h�y�<��H�T����5�B�>=��o���# �Z��:��ko��ʗtG�{�[���PtU-үqh�P��(A�S���*�d��x1�[F4��$�8|��f�V�t��ijs>t�W����
A��y!i[�D�l%@J�f�ݬ�un��|�_;jJl�,��)�YM��96E�5�W�T@�4ެ�z��
յ�VK�[e��2����H��Ӭ�Xz����5ݰ��X���j^X����d� �X�C0����ǟ�b":}��;䫖2�5��2Z.�C�Ś�`y��d:<_Oϕ���A��:vy0�g�M��W���'�q7���_�m��_D��|egʸ`�9vTݫ�_ѽ��>h�j:,t�)�j0,śo|T5��k`�Y�5
�q�&�V^ڸ��hq�U
MRBl��4�%��Dp�cu�`�8H���Yho�d?���֯o�W�,������p��������6���o�U���+�F�ۊڴ�z�=�힦̣��ng��5;f6���wZ��
����#*C�������&�n�pn�qv��6�f�F�C�G��Dy��O[�M�3�u�Y�v��.�l�^�H�i�-�J�@d�)�T[��݈��s+A��S��
���I�Q�>�h	���B�?��:nw���Ћ�W�N�o�\C7�N�is>����c������7�^^�.Oz<˩a�H9��jHu�mWܯ��u���T���Y�3���Q��Y���
)��v���]u�V)�lHX*<��#t"��$�1�aI`c��P��&
[�x�mn�
��9H�J�3��g�Ѳȗ�����|��T��xX�Z/A,���1�}d/A�SW�*��W$�)n<�$G}�M�4-�U~aL��d)+�.G#t�F�K�h>[qP�`��M��D�B`kj���=��H8,F�?%�[�t���ɫ���Q�~�DŽK�i���8R�u�ь"����s}�Q��˺�|�f@ɝD~�a�"�P��4�m�z\|��a`�zС�j��H��1_�ˆ���o"M�V���M=v�Lϯ�r�3	�h�}�U+�Y���E!8����ޗ�H�;���T��|���f/=c���=E�����cs:�H[��Jo�Ua_�y����4�Ҳ˟�3�m��{��Ry�r,�߬�	���R���:)Y�n��M"���FB Me�}�g�!�<B��c(lub:�˦����~����
� �]�eR�T
�:���ř�n3�(:w�N���mM�w�+o�EΘXG�����2�Cg��${�_���/�ֆ@�c����"�`��l���r�&��K����Qo�Z�D�<����8{�B[1�ꊳ}li���
�Ga�	v�����t�z#܀��j����nj:F��}�ں�q��b�Ձm[�8!AY� �2�x��16���1��ګD��0-�T	��k�L���^t���5^�͡~T��[�?���҅��ܣ�<
iP"�b�-Z�&��俅���Y/
�K����Zp] '�ik�-��}�.&Nj����r�"�0�Pr<O�=l�>�c���f�s�I�Hs�-wyA�LE���d�{�*�`����E/���n�8���=��X�C�Ď�ںK���Ɩ�0�SG�8��.⫅�j�y�u���?�`��>���A�G���l��%�k\\��3_;�IQO����׮t4�\c3'�mX�ڨ��^��0�m9�����M�$�,
�.$L�Z�ҕ(:��8л��G;���%5�//u�M�X��l����j��z�����?ew�����o�t�h�sO����b��;p܃�xn�na�<W2mA�|5N�c�	���Ҁ��Y��Z
!�ț�:��@O�6(ɏ���Ȟ��%wE�/i�G���$�j���Z�A�<���a>N�
݄�*���Vꨜ����6�����4��>T��qmU�>�V���E��(o��j�F�,�ԯ�f�q�v2��`'E/b�Ι,-o�����<j�6N�ut�o��T%��v#�0y4[��p3/���趎�|�E��!�z�+�ۄ���A�f\��UTf�6r�B�T�`�٘^T����D}����ɓ���E�r{�2�d
��3�� We1J��۵��ڈ��Ґ�n��jJ'�F���JP��7���#�6E�Q�����`�S7�	�l#��S9ܖS���<�'�Ǭ����lT��:Q����>�NpNPy@���,�]'���ʣ�C1�tH�:'$��s$�q�ӤĮw[(�����7H�BR��0E�lh�ƕ���l؆�;���>�|T�t��%�xQ��Ȁv�`�$��&�c�`
�B7�ky4#�Ͳ�B�1��*{Q��&�:C@G_ͅn���`&�i���L9�4�AL"�w���b�,u���0���oH7��&-�1|
voK�+�NnXy63��j\�#m�we�|uw��2fV�L�J/1��9�k8�B��F~��O-�w+=]��od��)~��b`x�ʁ/!��֛M��^z����WM�
UԌS5�c����w�����U�����>X9��N�|
��������ɼ���R���!�>$��} 	���"vHk^�B��&̭��1o���'�u:-�M��C��`~�z]h���ٯm��/�^rPMu��Y�Y����M&�o�?���F�B��C�4���
۴��xZ���t�swr����2���]5
սE}N)7�6�6�@�t��J����"u'Z�#�Z�Q'��O��
�~
�r��|�O;^:��j"��5������M�7��u��b�a��g6aں��)bnل���wh^U��i<�fޞXO
�wK��3 ��P�A�2,嬂�	|qg���EgC36��b�����q���d�j�$��@m���8A��bc��"�PA��F�C��p7龓F�dV�i�Yh�:��_U���SO�Qh�Ӷ��c�K.�a�M}�-Ժ���P��a�ԩ�:!�9��S�tPL��0��A�뫮Z��0.zd,�c�j�/:�0�3"��I@�X#�f��G+��=��~m딠���
�4��ۥ��^��n"=�l.�(I�1竿��+�nDL���p�d�Ӿ�zF��|��mP6�4�<�h��-<"��:�j3���Wq�AÚ�J���,_�q��{hޏ���,��>	�ˬ�/�^��sz=�,�

�OPW`4����b�Gz,�j�
��`���]�c��-�qojDԖ�@b;(�uY���x�yV�5�ޚ��8�8��ܭ!�7.d|ݴ��s�z3�AHf�Rh!��z�`�
U�a3T�(�wN���1�)�h�4 ����愻�٨�x3�c���|��fx]!�КsyۼOn�I�U���?��"��G��]`��Z-7�U�)��֠U+��jYv�.��(�=�Z2}�+q�^m��]�7X8�R`{����!��i��d�姯��;Y�޿�N���q/���t���q'u�{�{S
�w믗��]���D���P�6�"x!ey�X�u�\��X �2ªlU�1llʝ�i���RD��4������=�9��5_C�oQ>��[��+����MB�L�Ynz�|��/;&�X{��d�rm������F��������E?�f�n�!��w�9d��֝�n@x�[������9�	T��`yV8�͖�GƊ!�J6���W����m�՚	��Z�#*��I�ܯZ�w���IE�
�i��jW�b�%�;k<��;(s_�X��O!�'�ߎ�X�{0��߅�~����4"��C�	 �.4
T��j%)��P�ݥ�!w��]�V��5����';�|kLl�~���f��ؔ:����W�������⣆
k�߉jek`��R�����H��ؖ��������5�F"Z���O;G�~L٫{u7��J��)44��A7���Z��YG*�t��8�Q�=��Yc|�[�C��4�G���}������f_vz�V–}�
n�V/i98���U%?�gYA�'|���b+P�ڤ�y[
Ow��s�J�o7�~�Z5>�4խ��|5����h�L���/
�:|Bo��NW|BB3(}���o�dQV�J6a5x?���hø80O�J�-��+�+��G}��2��Vݩxts�PB�Q�L�J�ګ�G���%f�ߥJ5r�Q�J������C�<ɪ>u���iz@�<.�9:K�)���\Ã���nR۰1K��r�c���/Ӹ����K���&�_'��/Vi��Օ��f�3�x�iB�Ve��AN/�XRV���R
HM/^j�2��C�(���W�5Z&�6����J������3)��&���i�92���gH)�(����UF)7�3�ÎavS]��[���@u�B_<l��H�_^�-s�iQ�֯z��Ë�P�'#h<�$j�M�_��{l+�ʡ�^Z���)>e�-:���WO>��w�U�Ow�
c����SHG��(�B/3uR@�~�ZV\��w�M���7�� e�*�$��'߄�2'd��xQJ��1�$ݘ7��y�LD?�����\�N�ك6��HK#eDG���1����LԵ}����J7�fE�S��j�ʪ�d=G�Ŕ��-.�Tt+rv����q1UIt��S��(wE���uc!��ʽ_�l_�=���̡@���K��m��L��۱:�˽��\PVS�Z��" ��z�]� �'�8��<9����ӧ5�{Ɫ�O�%P���4�/H\5��WS���i�F����s~��ɩ)�Oh�U9��w��=�dE�
��v]m1�n��o'5T�s_��wsV�L�y�v���]��Ц,��o�Zх�n��d
9�^�%�3�W��*��g1hz0�S�_]���>�GMcl� &y}�m�E�?�f�y��rr��=LԷ�>v�nО�y�3���a'm|�ppH���ۀ�ݨ6鵢�X�M�'��~'��dm�;�[��!��m��mZ��J⎂ܹ�����|6����]F(�y�&t�5�"w@�4E'��B�w_��U���'ݗ�����4%�6^~�Zw����U�E��/��C�|'YiF�@�Fŵ��X�Iy����,A�;k����z�aVol��&�.VɌg��N�Ɖy��������M�¿�=���M[J?������ĝQ�d@���O	,I6�2�esD�H��u��QJ%Bw��oMeS��t-SW�ݪe�{a�N��@$��q��(��!]|�wai����J��n$��'�7���/p�יiXx�����mN�m�+�=U�:Y��p�cЇ�������w��
耳~�#�{�V��B�</�Wq���~����o8�n��Z W�N�|�͕�T�>JO���/yo<�|8����L>�:�ł����6v�/�ģ�.?�&���$��G�g'j?��kã�ɼ�a��$�WS:���J˸}
��V���T�CK�)ȍ0���U�
c����4�J�J
O��I8�a�?aJ�"i�X�U�iX�DF�@8qE�bX�b�˴9i����$� i����<�a�����iOpe���s���,�u	"���^�h'�|�fgI��ś3C���Y�M�,�O�~�E>��
>��:q��Ӈ�"�g�+7
�URnw��o�Y�(�6�-Ҵ:t*�z 3J�b�>U�$D�J��V�{`���e�SNK߮{���8�����	��ˠV�V��Vfԫ�m��2�m��+�Vj�e��#��z+�T.y�<(Gji��o�bkOr��J�C��T>�^o+T��Kp�(y�C�͂��786��y6�<e��M��ӳ�2���O��� �N��bd��00)��Lc���w7'I���f���㏝!��H��	��>u��v��i�VX�ci�[���d��~�c�.����CX���kn��	�
���5��h�-S���l��s/��4jx[���k�6��2�V����&�͇Q)�J��tZ�>�8�O��قپG="t�9�!�_�E5mv ��r�z����A�v$e��d����)��s���	��W�A�C*T���6�{�������s`�j�g��ܟ����|���G����X��2�6:(�N������.x���E�Y�bDC,Z'~����l�o4��\�\�3ޒ~��3��jD��`p����7+��v$�n.o�@��KZv z`�X�sZ���BƟ���m��ZI�m<ک����p���^4�%�ہ"6k��m�����:�|���U׻@%��s�e����e���u��U=�`T�g��wu�'�߼��)O�| �0��+�^�#�*��ℤ%�����ё�
D��Z�);z�hNCC�gj݆� #���>L�98xS����d�`*o�9nVOMy�A�x�
ӥ/��X�۲��[�\~�S���Ox��!j�z���t��*�H?��F��Z+�tW]�@�=E!
���P����w:j�;���$"8:!(g�(��-��gN����N�(bR&:�ڇ�x��! ��.nWQ:�J�)2�_��j�,)����R��p��>ŁFx�=�J5m�P^��(;�!����ل<�3��K-Tmc"��U&��MfK��./j�>�n�jI�E��`"R�0��2�~�Ԋ+���PKE��T�x��Qpip/_vendor/idna/__init__.pyu��N�0��<E�'M6��7�z؋/`̤�Fʔ��ѷ���]�4�e��W[Ӌ�A�N6�tRP?���H��z>��Ř��総�W���Zc�+J[�HM��T8b�OO��,�ԲDjբ��W�}�;��`��#�A��$F�f7�V��P�G�y���ɍ�O`��C��E�w�I�<	4r�ڔ��7kp�lٯ�Jnp��^�<]��@<��y�!q8n0Wk��/:b��nS��UJ������d�&� 'vAO�n��)����(��KMNS�y�9��W�PKE��Te0�3!.
pip/_vendor/idna/codec.py�W�o�0��0�!��EH*	�	$`��N����F�َ� �w�?ڤi���&r��}��{?���J�f��ʺ���Ȫ��[)�+�	i�z}���������KBP�z[3�����m}�5��A�l3�˼�j��g��q�5���E3�<�E��ES0��a�J���o伧�#��'�§)��B5��eB�����qa�cr��9_m5��0�o�֚yX�ɳV�=6��LA�N���&{ȝ2�P�s��b��b�E%K�#g:���?Qi��Ѝd5%d��m��Q��A��-*����|��Ţ��Q	�!P|�Ǡ�6��������'w=�;$���t��re���o	)6?B^U|YB�fp`J�Z�L>Z�{�g�Aa���:U5g�����	��^�n��C�>w4?��=<���G"9�c�ޅ+Б꘼�I]i�F9ߒF�,S��
�8� ~ +��CB�#�;r��j�ٝ�f�ixu��r�`��䬤��A�c�Ⱦ�_c�8N��lF.��]3|�\����0��Lo���U/����4L��d�vcrvȩ���*�}�h�%Vi� .�>��1@�O� "����x���x<|��g?���Z~�L���+f⯻i��O{�*=�O@����P����x�M$����
�Z�����f+�Lo	U�Tf�eш�\�m5�:�dʤ��mG{p-a�\�0�o�K��ݼ�t�W�)9�ۋ�Q�䰖F�e9;�z%C���'�V\YԿۂͺ��H[�Y�JN$�PKE��TE��Apip/_vendor/idna/compat.py]α
�@�O��**�$��]\�I�6�����šo�ZDo�O���
{X�,��Y�~��P�`�1�%us��eʲ[8sy�UU��]Qe
�-�;�Xd���>����{ӱ��oZ���Н�1�m���C�=2�`�c��9ԎL��1�Z���#)6�|R�%�W�
4���j]�?���kv���PKE��T�����1pip/_vendor/idna/core.py��n�8��_��<�BcÉ��hh�t��i:h�b��a�2�p"KZQ�e���=��$��|�N]�#�<��L�5��N�4#|��hG?Ϲ`AV<��3'���D�S£U�c��萼K2������Q��h�D���q�Qu:�{��5����Gr�TrF�wf4�sΒ�-�#ͽǨ��:3M�lgb�2x��>�HxȺ��s>��~>�����h�������e��i���%�q��������0�Y�)�a(�X+����4c���<dk�+%�ptL\���+|%f�e���E��OAR���_9<�Y�	B��(Έ�K��QF�4�s`,�A�`�d��?T`7��!� ��Ůh�A��q'��-�� ���~+��JĂ-�kI� ���3�*�d���m
K|_N�K�yFj�B���]�r]5?)�"�h�+�z��(~�HpKSd,E�h�œ�,O#r���b&��'�dGd�!Q��A�6��pl��y[7NH�a�}DL�����<zB��€��1a!}��q�|����pq!xb-�>>�2������ZS��kJ�ϔ�,Ze�]�0VQf"�8D�S�oP
,P�}�3
+eh��i(�I�M�31�E�ق���ly�3!�%[����࠹�0 ����(
nYp7�(Q(-B
� jI����#�XD�<��,n�<o��'2g�&I�1�Tr �tysU٬�������P��G (�ѺY��Y
qDQ{H�v�H�x��jM4�ϳ}�G�A��;|�o�2%Q�p�{`W�K�����a�t\�,�=!J_�$4#I,�$�Ke�)KRm�z�~/j����J~_{S�5K�� ��d���BUᚗ�&��Qgw�HL�����-�,��E7k����ٕ]��o�t�"3ӈ��u����]�����}��T����E2�D�i�Y:�r���8b(Q|���#�7u
Ӟ@l�?T
>��h��h��}��?������wr�������5�V-�*���r��f�EI�W�Y/�{![fJ���l�rY�,�����]��F\|c��L�d+�ʔ��?�B|����v
���m�%��\�\L�(���h�4�D���W�Jg�VPi�N�)��L��{1w����e�-s�n0����TeN�үd����<���0d+��J~v@�t4l�����8
�6��FU/�-D�U�>U��d�2EP�`�?g+,�$`�z�Q�Vv�_#��)���,��H�"�x|��=�V
o�0�
�t�a���	�^��ۨ�$z�R5�;*ƶ▩Y�j3�f�)�"�h��\ܨ��(�}��sp]��=+;����Zâ�#^�9�음޶�a�� �jsT�.Hf��W����$̝���TS`[�x<c+��l�l�n��-�G����@[:2
�έ$���rF;�’��.`���l���F���m�9.�+���
�Y��w�u&P;<r��q�A/���*���M��SF�,E���wN����'�g �j��&���\��w��ܥ]ߪ�i�P�*qcT9��[{���`���
�R�/��դ� ��(��Ş�̞�¬s0��t��M���j�5z�є�)���)cwFi�m��!&���I���n���h����<�K�p�����$徺�hx�9[��yCe��'�
N���|�����Z�B������G#��J/�����%ӗ�n�*���y+iv���ׂ�ei�H5�6�j�”n=!vUF*�J����iZ/ٸ��9�QP�F��*3�]1��_0՘γe�oF�Zy��կUz���Cz����]i�ƠS��������������X�4D�b���/�L*E11�~����ͅ7u����������o~���ҧֶES�,3\�kl9��~�Q���F��.���6ڶ��u�Q��K�������
���s�M����j,����X�Q���y؏��B��j�o�r�Y�[4\���}e�v���r�q(���{RcD����tR+�6�YN�����2v�zT��Bn@VK�T��~v��7���]gqL�8Z�T���?*��+<�`ؠp��:e&yV�"�� ���_�.�Y��O��8<�x�w�v��v���B'�'��gk�.v5�{f�Z�� w�]5���@P�A��S}:��2�J6�v�����J�	��w��Ac�{KC�;"_�����������C}�"�2Σ�g9��[Qsi556��ث6`[���LM�nP�۸Kc�%":
-V��϶���1����H,�Ԏ����,ek�t�rpq$[g�8���ce.�(D*�а�P���{���My�_\��Wh@�A�������=L�˯��Uu�K�EAq�����<�K��*�U��BX�jV�x�K�V]��=�H�i����n[���t$-��k����g�G4� Ĺ
lB���x[P���\�Mg$�j<���q��
�rs3l(�,�%	��
_EqZ۝w�Aa����XV��.���i��.k���ʴ��R<n�?ں��Ik�q,f0�HJQ���݉�FrwbT��Fv��\i�x*����R���R-�V�v*qk�����Ep�M��Κ.�uD��Rf���aQ#�Bl�o�M/dv�<T��6a�fK6���[J'#����(��f�&�6��N��%�3�2��C�L\ZJvUԉ$��7��r�{�W/%7eY#��E�AϺ]���Q��X��:1\e��zk$KeqY�Rvڄ-qZK����-ʴO�
���a���hV�C�旉f��B^��{�0��&Y�o�)����R��B�=R���#��Ǫ�s��Nh�l����7hUv���_+~�vh��Z�z���xx-��N]C�v.��.�پU��PKE��T�Ă�$��pip/_vendor/idna/idnadata.py�}[�%���{���xhF�!}�G��*���Ѽ�—<�tu70G�w��kUku�%�,����"�pF8�ɧ?���?�?�>���/?������?��O�˚���?�����/>��O�ž�������?���w���o]��믯o��y��O���I��O�߷���ۿ��O_�����\���F�re����|r��\#ȉ����
rg�y2y�y"[8�����x�&��_Pvۙ��g���g�}�}�q[w��tWA_L��}��G�>��~����&���]�����+�����=�>@����M<xn���n�7�s�_ӽ;�[R5�%�ݲ�/�����[�D�.h�{��4�{�A�5���j4-���&�x���b"m����*���O���{cz��H�!�iu�瑻Q|M�ۡߖIMn+�OV�|�GlOe���n�;Bޒ�w�[{��
��@�gl^W�c����B_���v_*Up!v���Z�[�?��4\i��go�����'������
��d�v
}�~3���n���rߘ=]�������rEh]c;�y��w����;/��O~�\��1�����-LL7/2�}09�����
N�J��yۧ#���sw�
��A�mԁ������Hﺜ��C�>�@�g �������>����~���������|z/�O�q�s7p7r7q�r�S��>]����tw#ww3_��h��ƣƣ��������7]9\�u�e~C�K����]�7�2��q��
�o`~���pS7>�[�t�z�2�����od~#�+I22�����Bf
�Q�9*������:Y2wY'�Qa̅1���sTx�
3X����`�9�<G���U���sTy�*�Q�g�w;ww'ww�l�6�����x~ۜ���x~�oc~��x~�o�m<����ϯ�ϯ�ϯ�ϯ�볱>�k̯1���k�og~;�ۙ��v�3�����og~;�ۙ��v�3������`}��`~��`}�σ�y�>��<�����w��;���������w2�����b����7���3x3G7�Q��Kŏ��)+�樸�������[�[�۸k|������ŗb~ٯ+�q���̯g~}�n�n�.����2�~�(��~]a����]�qd�$Nb�$Nb�$Nb�$Nb��]V���I���������f�73�����of~3���f�7�2dV��fV����X�c,��e���R"w���淰��_v ;����da��Y_y��ԗ�WfS__�M}aS_&Kr��L֜ɒ�,�ɒ��9�5g2������d~'�;���.�w1���]��b~���.�w1��u�#���ֲ�!^��r�W9ī�՘�ʅ���x�x�swpwrwq�樲��l�+[��ֻ&z�+[��&z�+՚i礲Q�lT+��F�>F��K16�5��3-"��n�%�JW���-a�P�r(]9��l	+[�Zd�������.��2������+����B鯺����'��j�j�n��P�Y��,T~8����	kc��H�r�Y9ҬiV�4+G��#�ʑf�H�r�Y���x����&s��s�Y9Ҭ����ts�Y9ҬiV�4+G��#��Y�9ҬiV�4+G��#�ʑf�/G��#�:����w0������hW�,}��ݧk������w��ҏ�O���|���M�&�.�!�)�%���A������� ��?�A������� ��?�Q��������(�G�?
�Q��������(�G�?
�I�O����$�'�?	�I�O����$�'�?	�Y������,�g�?�Y������,�g�?�E�/����_��"���E�����/���G駯7��˗��੊G��|T��*�Qe>��G��h2M��|4��&��d>��G���߄�&�7�	�M�o��M�7�߄�M�7�߄�M��W�������k��_�����9��"�*��u�d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y��>��U�׃�8nyN	^	A	Q	�!��޶�/����/L	]�d(a~�CXz�[�R�S�W��c�<x��!d%A�۬�)��Е0�0��_�BX�K�!!�&�����H�"]S	�t��*H{u�����������(J�Jhz
�_t%����X��GSy4��)03%t%(0S`��p�:�'��k]����yy%%D%$%d%%T%4%��������R��é<��é<��é<��é<��é<��é<��é<��ë<��Ë	���tݲo�	N	^	bnٻل���������SBW�P�T�R���*���*��2�*���ɾ�^4�E�^4�Ž�"-zѢ-z��&%�����3Wt��\љ+:sEg����9]�����d^�J��ĺJ���zVBѻ��z�?1%�ĺJ�O��XW��K��K{���g_]�{���K{��������P
z\گ�ƽz�;�MLX��������������������SBW�P�T�R�-��p*��p*��p*��p*��p*��p*��p*��p*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*���*�gW��5��7�ǹ����~�n|o?��U%ͷ������F�Q���
��/�
7M��\/�N���Ȟ�d�F�PzIe�2���ՀW���	2WF]��m���1n܎q;�\܎q;�v��U�1n�RڋJ2�m���nϸ=p{���3n�\��<p{�
Es�hE�[�D�w��Qe�F�����y2y��mE����b�+�O�&&�i�0BT�E!*�ƎUbQ%�*���8�'H0�$(��	S,u�	�����N��pg�
k�>w��]��ܙqg��Rܙqg���b���k*]�¸p�A�¸p��8���@ckl���أk��\�Y�2�
���WYcqZ��,�����C�p���n�����Ncv��rj���I+ni|K;���mR�
�0���U
]a
䰂S��t0����΀L�����sZO���'N8!�ɢ�Ք�)��E��q9�[�K>>�-̥��/���\xv?;�]��/<�� �ŸQ�n��Arnny�1�孧N�,�]�[J	�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%�ӳ���x9���gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)y�ك��}<�>��'S����.#s�e�[�����x89��'g��Ȱ�~0��ܗ�O&/p��˵@�C��/D>��f>���/�pv����B���S�
ȕ�d��p,Jh4i�p�/a�ړ�=�|t��-��0q.[�k��X{=,i��Pb�a�[�k��X���>�����>������
7��!m��q˛�-B�"{�^od�7���Fx�����7���F�z#���^o�����z#+r�"GV�E���^od�7B�#�w,�]7�>�]�����3�"�+pW�
g8VFRq�ʷ��%{��▍o�cxb�[6ܲ���#G��c�������؀�=�؀�O�
����G;���hGv�#�ȎvāI���1nn��#���w4��!v�wg��;���7֝�wnv�#���wn9�jx��#ȉ����
rc��ܙ<@f[�(c/�D�,��qB�|�Z�,&��D^w"֝��Nĺy݉Xw"�;�N�u'b݉��D�;�ם�u'���D^w"֝��Nĺy݉Xw"�;�N�u'�͇�E,G�����$rLo�7B�ȡJ��9T�U"�*�J�P%!TI�$�*�C��P%q���$UB�ġJB��8TIU�*	�J�P%!TI�$�*�C��P%q���$UB�ġJB��8TIU�*	�J�P%!TI�$�*�C��P%q���$UB�ġJB��8TIU�*	�J�P%a71�nb:��J|^g�T���C���&���66���x��d�ɀL�?Уk�_�dG��8c0s���!vWf71�c�s�E �S�lz3Lo���`^$���ڐ��?���';�[�E�Wa�T`O
�lT^��Ǻ^���q��U�pԊf+�r�6�)��ܴ��P�64�n�ec������>r���6�6>a��{l�5���w*v*�=��AL@v[Z?��صhP��>Dd�`Â�xA����xumHxMk7�p���2�Ұ��$��Į��#Xs$*�Y7O\�?�����dܒ_@�9s������å�΂a[�%�a��x�������%�2�-����!:2�X���;�5lk���5�X������Xc
kl�
k�
����a��w��}�,k�Ac�ͣ���l;T��jv�f�&��;�f�jvV��쬚�����Y;tP�[�P���֡l����ag���f��y�P����<v�B�y�O�7�qK>���\��V��T�(�#\�/� �Ƴ�9.�����J�_j�Y�{���������:+2�˫�"wX���C�;+2V�k�j������z
V���l�6X��L+ۈ�+ۀ��T�\A�L� �E�rV�������:8���W���:8���o��
֓�7x��g����`=�����Ǥ���5����A�:��f>�L>��UZ5YO&�d��L���-����8�(M��3�����3?��}����8Y!&b�ӳ�"�O�@M�%�x�'G0x�zM����;9s�K~�;�Nw��O�ӝ�Q21œ�x����K�b�h�8��Y6N��I�f˵8\���|m����
,^��T.�T.ީ\ة\�:/��_<;x�t-~.��œ�`P?��
�oz�y�ų����28&w�I��ɇ��
L�us<�Y�ُ��Hu����\��ُ��u�������������K7/7���/qݙǝ
d�%��0��s߰7���p[nV��ys&��pm�ο����pDnމ����2�#r�&�
���,�v:��|�"#�3%��)�dU���;��z:/�q��|'���d(�^�~]��p�I��}���+~/	N�����O8�[I���9q�#]���u�\g�:���Ew����K�$���B��,A��кЄ�N��L�x��Q�}|q�������3wxb]^B��{~�����ᷜ�SW�<�wE�"��r6�\),�R<�rȭt���5E�PS��[I<�nY?R�$�	��n����Z$����ы�PWe~�k�c}�H��l_�	�V���sMr-�s�<_خsM2����5�px�[��dS�[��C�Iʥ|8��a�	�x��ŋ��ʇ9�'��
^=����}�y���g�<�|����;l��ք~�Ɛ/7�w�� ���膬���?��W�>C]~�'1��%�C�D�yv��l��θd���[�\</�v+��g�ܭ�.��\�����k���x���J��Yhw+��g��I�d�~)`X���a�8K��r�/5��؟�_���_��:��_
�~�dX���ay�Z��_��~���_��v�ޮ�Rа���_*V~yNW� ��,y^V� ��G��?
��Q�G�/ͭ�Q�G�;�"�K�Ă�Y���R$��K��J�/��J�/u+�J,|O���~)�X��_�[⏭�R-�2�K���/�+�L��R1�`?��L����/�{K�&V~��X�e�Z��nb�{�`�W����/�/�����_��n~��X���bUூ������%NY��o_
���o��~�g��:ܷ߭��ѵe��To,�}�|�5N6kvkv+r3���An�7.�ܤ�c�w�߁��������]�w�������7.��K����?�_�M�~�C��!�����?���S�O���Sk������Yk��k�|9t�ˡK�5�_^�k��~-yY��5/���e�V�,�ײ��Z���_���w�[��/qĺ�_��u�-�o��u���,�#-)�Y���-~5�V����v��#n�Pw#�՗s���oYg���[)0�~��I:lJ:ٔ�}|����K��cs�]�t�+?J���}|�W��>��+��5O~�2������/�A�˗y�ޝxp�����Fa�$O?P.3���}��$Ћ�+�M�z��KUF�}���K��Gv�U6��:U�Sq�[<^y�6��^��@7�w��}	�>�&�o���&��7�߀�	�����O&�&��7�߀���~؀���	~~��&�
�M���7��с���]�w��������.�;��?�_���?���C���������?�~�p���?��)�'�O�?�
�	�S�O��g��K�/�_b�졔�S��|�{ܸ�|�}�ɔ�y�v[�>Ag�P��g�ߟ8�K&�G��n�^A�����w����Q�(Y����=�,%!�##`��w��T#c_�˾�W�����$�_�+s2�v;����n�����nR����}��x����
�����_����BdH�6��@��e���M$jfއ4���=���@�B/�W�7�M�t�3A_B����v�%�5'�O�?�	���O���$��'���?��Y�g�ς?�������,�3��y��
_|U�}_U���K2�s_U���
_|U᫂�*|U�%)ɹ�
�%W97�o���
���o���&�OJ��%�GJu�u��y�b�߃�~=
=�����Nz݄�AB��/��� �p��S�K� 8pJf}	�g� 8pF�'�g�Y`?����Y�~��"���~������D]�n?�g�Y`?����)y��b?�g�Y`?����Y�~��"���~������,��E�g��,b?�g�Y`?����Y�~�ϒ~���?�쾁ޅ>@�B����"v����v��.�å
�
<⟔��lE�j�]-bW�j�Y`?����Y�~��"��4�K�yi��	NN��&r3����	~~�<]�t\��;���חz��!�.��O�t��g@>C�3 �!�9��nE�|��O\�'�?��"�	�L�τ|���l��6	=�.�9U�Ve}�'Qo��\ !�*��4�SY�B%��[Ɖ����������m���k���y�MY�<��?� �Q��S��;�M���t�A���얯�|*�"ׁ�4��1;��n���Y�y7�6�g�V�
t�;�����Uk^�t��s���0s��]�֗�����r��Jܙ�)�mk�Kp�q^��;�%���6	�>t/�񸎗�x\��u�_�[N)����gx/d[�Í��[��^�?t`���ί�ܭz�=��]:p���	7O:P1����E����p�s^.��;l��V�|�ݼ����
�[�	��!�_��zZ�Fv��u�7h^x� /�7�=ț�+b>�^
��z��{�9���#Y];p��$�3Wz�-����Mg��@h��k�~Z�A�"�JM�;�K��M�����]�=��G����p2��s���\����v��E(п�U��M8OTU�+8����ʩ�W�cP�P�!D�=��G7��\w5ܼIV�&�3 ��۵��!$8�2������	��|�2���:p�nQ�B�}875Kgz}OL�j	��㹻��x�*�A_]^�_(���d9]���
�MܡZ�c�j2�x�[Q���k*�ur��Vd��K���g�_�����y�4m�B:��(Pˀ���2�G^�㰜��'���=vI^Q���.�r��
2�.�3Kd�rJ��`v'��iy
�R�sv���9��yvz��;�!O+���ƹ�7?ھ۩��9�?��2U�׳�ϙ���\�MX�ep}-:P1�t�0�t�L�o:�0`z���Ki��Z���A��&$L87ײ( ��U��/�ǀ�<��A�$w+g�oB���<��B��j��*�R�o�B�G�.ΐUV���"�T����D!�{��G��TK�s�w+鄛P0 | ���p��ĥ�dVn���$%u.MH�������1 "A6���y��ejO^���_��Q�H��3����p����"� Ç{�F/@U%]��<8M܏Mh08���/��Kv��rg>�,�P0�t�<-�=0M��T�?�~c��s.�=H��&�2��s����.,Hj�Uu�&L��"}ٙ�;�P�i5p�M<%]g@����T��'�X*ݓ��[I��X�T��'�ح��|�`�:00�t�(��@��n��R6�	M���2 �x�^�R��)�;�/�I���p��j���Q8�e��Dy��[N��1�{���/@�b}2�O6y���4ܭ[f����u �?[׿����[~�?�	�E�2��ʧH�㟵�2��[��Ju�&�3 OT^�\�M���w�B�כ��J�&`��R���c�v+"A2�n�'P�*��_ʉ%��a��i����n�$����ح�<�~�:�����������؟�-'�n�bH��Q���&
�p��\��� �z٭T"�m��~|�C��B?�N{U\=m���;���χXåD�6��)�yd�RE�,��-:Pπk2�Wr_;�O�t c�g��$��|U�E��E~Z�v}%|=�0���TPO���:��O[t�b@K�^�O+�x״yp��U%|�R]&�N<�*|
4����x�0�7X�.oYRFq.��׏M8����=p��K���ˎ8y/��Ov��4��/�������ɻ��n�o�����<�w���%��$^�pd�%�_X��
��yr? ��PKE��T�S!Ypip/_vendor/idna/intranges.py}T�n�0��+�l�1��4�e�.����L"@�<I^[`?RR;��Cb����#��l�}�P�%�s�=Ѻ:�"=_�'��aP� W�	�@�-[��G��v�F;��`GX{��G
��[t����h�'���]�����P�uQB<?��CUU<���v/��C���E8x��I��ʣ�B��̀�e��3W���EQe3�"�]o����|v����K*/Y~H	�C�0�ZrY����n8I�?�2��ɾ)`�c�Xr�e�P�_g=��PA$7R�z�l��bp��Y}��E�&*ذ��Y	n؟H
�'��k.���b��y���5.Kx\�c���5p�ĔU�~zJ�M�-��H@u������e,���g_�2��N�u$=�A\X�ST���
�֛pV�L/V��`^�;�*���9W��lQDM�"Ԁ�������$��q-7�ZMo��ͼ��C��b���4�LA����KF�DŢ+�$`�D�#F>A\/6�4�z^o�ꢸ�M$�Qv�~�:�$��8��l��K�M\�[�y�_��ƍ/b�^�#<{Em
o����#������>C�Cm����s�iݴO��r�Q�5��m'5r߷���}�0ϟ�4�4i���x�'(ِ�S���ElFox�����ƒO
(Ht���yT;b�u�J�6X�P�LI�}h�%V���p
o7�$�7Sy��u��i&�'�Û�zk���*���Q�3���V��>۴w�oe;<I�^��]�J���������;�W��ǜ��P�PKE��T��^ pip/_vendor/idna/package_data.py��/K-*��ϋ�W�UP7�3V��PKE��Tt�x���ppip/_vendor/idna/uts46data.py���sב'���{f,O�n�ro��wOխ���x�L�G��<�VZ$%K��̛$v�ྃ�N�$nXam���E�/!��;�����/��Сp�wu*3O�<�y�ݲ}m���^Y���e�/g����Y���+��՗W����5/����]��7V��+^Z��/-_��;����~����,<����xi��W�ΚW~P[���|畷�X�l�o�t�e+V���[k��_+�^�e��Λ+_�����z���������w��-s���n0O����q����g?���/���{��?_��e�
������y��W����_�y��[��Zx�O��O�����+�^����bOxJ���~�e��zy�;o�^�Ӆ�����/�n���}�ٿ��P�;R��տ+��U��D����]W�Nտ3��w��]���{
4͂@� �L4͆@�!Ќ4'͊@�"��47͎@�#��Fh~����G��j~����G��j~����G����$�����_D�&��iB�	M�jB�	5M�k��G��i~DZ?"���G��#~��]�?�%5|F���FϨ/Jj�����V�Q_���3�+��<��*��g��$����BR�g�_Jj�����6�QWJj���JR�g�ՒZ>��!Mg�3ꛒ�+I��}KR=ߖT��5����z��+�����T���H���o%��w��5��5��5��5��5��5��glU��*�؟}�m���mU[���Um	��T�%�jKPM5!ӄ�&h�XՖ�Z*B�-c���h>'�2&���G���h~$���G���h�K��%Z��w�ֻ�~�DM5!҄X*�PՄDj�PׄT2MhhB�	�&��P��k~�5?�u͏��G]�Q��k~�5?�u͏��G]��>�K��I��4��4��4��4��4��4��4i������N�
�\�SmPRmP�'�I�%-1�NAϴ]�4�2�����?�/�x�:I���'㒬9�i�e�s�%ݯ{��z�ɕ>��˼K<^�K$�}�w-"��6�
�Y�wD��k��QI��}�${��w\��w��	I��}�${��S����<O�2.�2���{g�(��;+�^�d��w^��(߻ �^��
H��{%�;��]�r�,ɐ�$C�C�9K2�xE�!ǫ�9^�d=[rp��$��#�N�J28=&�ജ�98=!���$?�t��2K���F��F��v��v��v��v��֦�+�sSh]h��ƥж���^�ms�-H��Qj~����G��Qj~����G��Qj~����G��Qj~����G���눮���i�~�5�6?��"��S���=D�
�|=�5߂6?���HtͿ��O��7]�1h��>�~��6�~���~��.�~���~��>�~���~�g?�
?��0�
?C��(�
?C��8�
?C��$�
?C��4�
?C��,�
?C��<щ��k���kB�i�F`�BN��n�y9��Meg"/��$:�r��F,�r��F,�_��%���A��lj��l����I�kkD�Y�{(���]/>B�t]/B�t]/FŒ�]/J����&�+�ddcce���ll�
1����F�a���l����������dd+F�[���l�h"��������dd+���l��~���~V�O2�&�T�O2�U��*�IF�D
�*�IF�D�*�IF�D�*�IF�D�*�I��D�*�I��D��$��g~��3?�:�Hc���dtL�1H���It?�? �i�A��d5c5o5? ����x�)w2AM��A�[��4�k����Z3L�y�~H�j�0��z{'ѽ-��li��Қg���D��z��Iͳ��MD7��y��LB�3�6���W��dlꞟn'�Y��~U��1�c���c�{9�&�S7r�CNd"�^N���O��GƤԽ��Mӿ���эb�!�©�LJd~ML5H���[
Rh6�_c
Rϱ���MK�f��h���\�����M��M�NL�*�<�P��m
2��o ����� ���O1���xZ����4�2h�э�!����
��|�-,��+��F<p5ӽB���F��h���F�}D�ȍiAX�#2��Bz�A͍rρ��ݨ2z�'�Qe�>:Htc�������
�7�!0A���J��
��!0A����#��L0/(��~DF������G䇙�^PxE��L�	��I�����k�K�#:xB������C��0��9��Ml�Jpf��3%8C&������Qi΄��ZGt�i!�~�:��5-D��V�5WC��n�]kZ��߭�D�����蚟!�~���T:/��u^BNN��Gt#'�om#��‰�v��	��[��n�p�=D7rB8��>�9!�x�э�N��Ot�O�o&��'‰"��'‰������['�n��p��D7�D8��Y�~"�x�<�
?��5@t�O��n]"��'�~��n���߭a�~F��C��5Nt���}�����)̗!Dw����c	��p-ѽ^|L����7[����T��l�q��dM�.D��f��@��6Y/�3���%!�3�%�=�"2��#D��=Ft�sh��-
��ȆŹ(��&����6�8C@��y����`8���/��D��x��^�!2t���eF������["3�"̷?� ��z��@���M���r��b
��� �ME5�{&���Ft�c���E���:��JH����L��B�(�B3�mf������G"����)F�j-
��Z��?�w�\ ������j~�2@t�;��"ѽ����u�]T�V��&��:�A�;��N��yT7z�p�'��u����ϫOH�}r��UW�n_#��'�m��>�Atp���n�ݻ����J�"�>� ��'�D���D�"���EK=��6��\4J=��t�s�N'�=��t�s�N7�=����s�N/�=��'��
D�������1�j�r��
c[�#�j�X{ab-B��
q&�_��oA��y�
2��)!�PCvg��	ԏ�9@tcNQ;v����k���s���k��(�9Jt���G�s��F���$�Y���s�膟�B�9Kt�OD��'��'�Pw��(T�(���&
��X�We�P��4GL!Z�8�|��2���q�;��1���bT�-Y]NJJoo�ȿ�#���[�?J�#vuw+�=?�n#���]{��Q���Q��-��4/��;��uw�L����^fw��χ�{��%wwѽ���'���w�ύ����z���^�w����D1b]�^&��맃D�r�t������+D����*�=�?�Ft�O����D���t�������1�{�:Nt�Oi� *��$�=�?�~L���ݵDǼZGt̫v�C�;���$:���n�C�{���%:�=ѡ����Ht�&�C�7�����?���u9w�]��1�r�'�^3b���=It�Ǩ˹{��z%�Q�s�,�J�.��y���"F]����8F]��KD�+q���]�$f�c�~�l�ٹ�ع�%�av�1v�w�n���u9w�b��q~��0�8?�J$��	�I�!1��y~�#�P3���ͩ�'v�h6��8�C�G�fƉ��{���8�7�Gkw����{�j�����{�^׍ܱ�G+�)F���Gkt����{�:׉���-�?���=Z��FN�I�#{g
ab��#{g
ab�3�01v��ޙC�1���ޙS�1v��ޙ��1Jc3�11JcK
?�G�ΜD�z�G�.3�D�ٻ���{d��Q���{d�L�=�9�{d��I��3��ޙ™3�ㆎF�8zx�|���Z�8vx�����k�q��>�=
�{�Q�s�<��޽�8x�|���k�q�>y9
ˉQ't��S'#fs��on�њ�ds�����'��=D��>�_����O��DhbDh�5���dM�&F��>�I����Ov�DhbDh4���d'M�&F��>�I����Ov�DhbDh4���d'M�&F��>�I����Ov����Ov��fb�f45F1j�4�cT�';i��bDe4Q��E��N��q��d'MuQ�눮�YAl��+J_����H�T-U�y�Et-�
�1z���TA$�z�k9U�y���ZND_l&��Sq�}D7rB��6�9!��`�
?ey��膟��<�Ct�ODV�#��'b*��є�D7�D�a�~"���(�
?;yp�膟��<8It�O�K�&��'"%���1��n���ȃ�~".���
?#�oU"�o}FFu�gLjψ�8k��	�{��3�6N~v�����xyv�����8������{c��#���.�d��P���E��X�g$Ti|v��� ��!����D����Jt����D�o�!:�?Jt����8��	����D��Z�	�����sZYq���v�{��At��;��9��8�y7�u���9�XA��g'yt�T�TLTLܧb2UL���5*s&�R�wϰR�>M�6��,�M��A��J��mO��ؗ�ʩTE��a�B�@��Q��67(�4g�u�J�Ԝ%m��T�nk�CbJ�L�L$
�wJ�w�[M�/t�E��U-6����b���;U�w��a��FW3
�ju=mj���f6xuF~tbף�Ձ��X
l��2`5�vTc9�c+���X	��w�]ݜ묛«�	�m�7������3�w2&�g�u�9UV�l�7��7L���v�
3�v��
�τM��L��ǣSG�"9��ѣS�4f����K�צ�Q�07���mhgz׵鿓��`ڦ�nj6Xi�%��
Sj)��֜42�t�M��>:3���8a�{LS�.�37��z�OM�4�Z����4ҳ-5M3�Xπ�����)hOc�K�i�V��L�%<�[qAX�3{4Kx��*�r��Sk*���z`f*���ibDo�{�1��1��i��C��F��1��1��1��1��1�if�l2�1��1�iC7�L��M��C�6�ǚ�滌	L�	L�	LK�gA�ڴ��3�3�3���)�3�3�3�3�3�3�3�S�S�S�S��z�͌�ʌ�ʌ�ʌ��LǙ���L8W�>�@�?�su���ی4��C�*d�@V3�6V!3V!3�����̸_�iH�����əg�nV7R5�p3��!K��0Y�,5�a�&d���-��e�7
�`f&S�W/3���X��X��X�̸��q3c�2�Yk��w5��h��oo���n4��h���w�;�S�0��aLI�LjS҈�Ɣ4�)i��M���Q1�1ͥƐ4��aI��F�'SÔC5��a�D���1
�:4���0nAø
3)�-h��W�Lʆ��
3)fR6L������r#׮^ø
�:4��m�F^&I�(�A����������������������������+���.�ȍ>�F�ss`-7�rn��,��i���͘MT,7�:y�#U�)��3�c����
3��yCۍ����<7�2�Zr�ϹiԒ��FWs���ioa��B�G6?�1D�i�i.�pya⇅ђ�\�P�̵̻
Eʹb6.Va:����”��v�
SW���͏F�S�G��%npZ�.�B�@�@F�SYU]����Q���G���	;J��pm&Bi�m�ځG�	0���{4�h�:a��u�]�Ҵ (�{4�I�EӠ��G�ԯM���<�حmZl�M���kÉ*"AkM^%�4��4E�e"x;�hb�0�[dv~}�0��&�M�%,��{T�HLk�.1���jt`��6��MnW����7���fKW��Ƀ�/�B��ɣ��fW�����n�|���y�k�[�`�V�[�m�nt�lˆ��)�,s�m�Vmf{�����ӌh!9R�0�Me�f;ŵ� m�� #����`�4�
���B�}
B�����H��\X�o��7�MT�]T�{��-_
B� Md4Mh4x�*E��~cfx�e֑�Mq�#�7��6�c���_d�
�Do$�c�[�F���(��4{lG2�%zV�m��{���=	�W��I��.3R2�H
d���0#��}WɁp���sl�U�l��6�6Q��jT-�<K�+���Z���Y��*� �h�;H�O�k�H�irb�>1��9�}�U��A�4�LL�6HLL���r&�G2��Y����k����Bb�_�d�Zkӝ~���Mq$;��*1�S[�[���5۵�f�i�r��[�㪇z��M��#�_Y]��F���z�0�n*ZIb��W=�����ZP�NEݺ>u��
RS��H�W��H�M��N�� 5W�]�Sk�Sk����>��JMAG�Y��b3��BYb���cVk�����Fd<�FdZ�>
z��E
�KEgZ�ŧ{#z\ᡠI7e��:p������g������Ȉ�X
�����Hd#!��D@v0��H�.F�@v3���������������������8�H��J�ө�~F
 �)�P��F*�s�!����cDȇ�&�9����IF�|N1"�s�!�3���eD��#B>����#B>��ӍL��2#B>���1"�3̈�ۚL��*#B>��Έ��
F�|F�e�,��L���~���`?��nحg�'�5h�Tt`�UA��-˙�[O1��L7N@�&�/1����LG�~�Ҽ�t�2�1�+�
�{u�%ӽ���t�*+��e�q��͂���L�|����|��^s�":N��a�g�;L��5�=�YAp��6ߑ��.��1��z����)�va�iV �xފ��0��̷ ��*g"���%�ڃ�.�%8��w����N���!�o�;�9��L]��c�-���/^VP�2XQ�ϊ�Jթ+lP��7��(R}��X"��d=2�@��a�%�V�͌������\��EB9Z1����?
���U��FGԲ��V���8k됚�F^0�G��Go�*pG_d:�)��.���+�9O����7_t7�Q0cY���uM9|P��)�z��p��1�1O 8���s��/��շ�r2�0��|�R9|�۬�p=o��֯2��`�K�c^{�v�%O��
�<h���܊����WX��r�M9<Nj��/��1���c^��~��1�Q��)�3�	3��Z"L�XLj��]�nt0b�A��]��+~��`�F#���1����{�:L��Ȉ��	S763b��A?��}�����m�X>��;�|�w1b�>�a��9|�Lj�s �|���@���@�0#�ϡ�3�Ueof.B�g��������mYݻ��*,{�s
�mX���"����E(�wb��
�$��b�˚�P�oƲ��"d�
0f�N�H�*#�ϑ��uF,�#��F,�#��1F,�#��	F,�#�盌X>c95†?�|��rj�
���n�����Yl*G��c+�>���7�]�>��ᷗA�GN���a�M�F���+����3~{+tQ|f�o/�.�&o�
����>���C�g6����"�̆�^]��~[ePT���۫����3~[xST��������3�g{gtQ|f�l��.���l����EU��ݲU�g����*���^!]$��l��-�E"���^$]$��l��]�E"���^']$��l���H��>�济$����u$�g��6[ W85�����M��}�wKH�M��}��KH�M��}����'X�N��]�(�� z�N���7]}�m}�F��/����7g��B�-G��0�$Ȇߜ4v$!@6�������O2�Ԕ���#�O�m엋��(�a{st!R��l���х���)��G"�7ʦ�p$�al�M�\GƦ���u$�al���҅H�)6]t�Bd�F��F��$�̦��	
��eSlN�9��3�b�Qב���;���eSl��:��3�b{'u!2y�l�Mw���!��?cSܰ|n��cl��]B�>��)nX>7��16��d��@�_��a������b�~�>���lX>7��1���VP��l1MC^G|f�iz�:��3[Lsjё��U6g�I�]eӜ7(r�gv�M�@řcWٜ��\�]�En�.��>/r�w!��y�;��g�ϋ\�]>�}^�f�B���"�{��l��߻|f���߂�l��-�E)���39JK�Fֽ�
�d�o�;� ~{yQ
��7-�I�
������cl��5䅨�c�of� ~�.8(E�y|-#Hr��cCog��x#���NFP�2��>d��Ԣ��:Q�B�Җ��"�;�����_����;_����|�}`jIK[_\���F�eD|�1F�gD|�	F��dD��#BndK[]���eF�'2">q��Ì�O�ˆ�ī��O�ƈ�D����.c��"8�%%S<!Ep�'$�J�&xB�p�OHԕLM�ǴJ[�\��9�$�γ�b��ˊ3O'sv;(+b�<��	�S������	�aU�5<�Dk�gXU|�0ǚ�V��3L��&x�U�'������]�1]��s|E����y{|6�g�����Y�[|\b����d�
��u$\�����/�h���V�D�j|-ݎ�3�n��|��v���t�CcpW�;5�J��.��s���2�{�I�-\�n��0��ƥ�a\��5�ø�9�+�ørQ�-`"6~DcB1�jL(�1�	�8�1�'4&�Ƅb�ҘP���=�����9ߗ=����9�W<����'Bz��D����>ݛ��'J�'�@߄�>Q�?��O�&��	�}��|_�9ߗ>��|_�9ߗ?��|_��쁫R'.�c=���!s|���3KQ�?yM��a��ZQ�?�^�N�gp�:����{��	���_!d�)[=�8|���]υ��_��՘��.���u
A05dc��8sS�vN��n�R��*N��Wy)�E�uR.`�!��1��R8���E���?�on��A�#�M7���ߛ�䋠��r�ܺ����Nş���'�٩�cOM���s�������=B!��{��e���*�w7y#P��*��Ę'���$����Hb��+�-=�����ߢ!;W�ztrD��+�{�0�:���
FZ�=D ob�ȓ��Y�	���J������2O�t}@ߑ�&�S&�O�fbk����k�2��������{��-��ȑt�Ցt�����?�D�)����\G���G���L4��Bdj�S��o�Q_G��ň���m���?�35��OO����[ﰭ��i晾=��Bn�V٪n��H���63a*{ژ��x�u�GG�j3ݻ��{��2�3)a��@5�{�Sgz��m�to|�ng�kՏ��M�L���=�{g|5�k-���H�t���L��3bz	�ZH��B����@��j-$Pk)�Z	�ZH��B�~��
Q��L_�@��/z���=��t��ǀ�kL����+����m/��t������5L�m7�6��Ñ����?kJh�6�~+�=�¶�*��^d$�6#^��	/��_VH˦��w�v�<������
�F��ЁX��#@��_aīǫL���ӽQ{�48ݲ���+��w���j��)���c�8���7���WL���!�0����W1�mǚ��#q�d�zD���[��1�QN��Yπe��Ϛ	 ��:�=��;ɀ��`�_�
a��'����F���2�ᠲ֠��[�l�b~�}����/v0�ՐgCd����W���l��2�����-��Q�ǽ�m樇#y��t��R���H���	8"<^י0H��X(����H�c^9B�U�sƪ�9�y�D�<�-V��2��d�b�|��XC�Ea���
�!��b�|A���W(�5⥶�]��g��_�PH"A�y6"���^B�Q)�/^.�-�&��<!��f˗��F�JIKi$�����F�JIKi$�����F�BI+i$-��Xi����-��[�9i!椅�MC;Gҝ��:Zة��g��:��5����p��w�1�3hp����^t��1hp��=m_1i�_�W�0$�PC6�����zFt�b��k�"(G�]���6`���!�����gw�t?�+L����t?����]c���u�c%lc��5P_�5P}�W�@}�W�@}��~��j�{�ٰ�7m�C��Ά��v�i�#�#~�B��i|!R�l�+�G6_�(ć6_�*�Gv^H�y���y��Dw�6�4J@�
�6@���b�B���Ău�+�XQbR��AN�bF
�
7j�T��Q3A���.���_(L}Q!��K��`��
G_Q��B���v�P��K����+�\�h�*�@�W+Z��B��o*�B ������g
#��B �w��Z!��o��V!������L_�u���E�E��E�%��5�e�c��t�B���}K�~߽Я<��@�³��~ݡ�s��h�3ݯ:+���UL�k�j�/8�~���^��b��[L��}��^�k�������^��f��o��[�{�S�,��!Ĺ�?+r�x�9F�	+2���"���8��*�=�Y����5q�x�&���(Na}ñ5�7����k�o�`��
��X�
��7�_c}C%������6�st�ַ��
U1�o��a}CE���$[���M��j���U���я~̈��?V@�BL:�B<>�����d�&G҅V��Wב̫hn���eFP�qy���#(��<��!._a��*#(��|�T\��H
�
F�@FI��2���1F ���`+y���$#��_�I�F��2��c�lg��`��d��b��f��a��e�\��3���gp##���&F ��͌@>�[�|�	�|�2"䳍!����`D�g'#B>���͈��F�||�}r�����
�����gD�#B���gD�#B�	��`��Ѕ���@Z!���@�U��:�V�I�6�B�g1��FUH�#&�٨
�_`D��r$tJ�9�`�m^\L���	���<iLS%G3��!�Tɑ��eƮ�
��t���2��-6�Z�f����Cl�MW�P�Q�x�
��j��I�%7]�Bqe��!6�5�E�����n�|ȑ0���h��C���<���4
8z�x�ʹi>�KS�n��C��-��f�|(פ<b�l���~��Cl�����l*�������Ⱥ�s]�c��.��VѴ:
��'���*�VG������qF,�S�瓌X>��ϧ�|N��2b��
>�)7��Bq���F,�S��K�X>g��lRM��P�^�x�
�iu�kK��nZ�⾒�C욛VG�������Ց#	>�3nZ9��3/���Q(.-y<�Vڴ:
�.=f�lZ9�<��3�SK|��{� V����J���7=��BU����J���7=�	f�oz(98̆��P
� ~�Cɑ���J�$�̆��Pr$�g6����#	>��7=�I�
���H��l�m䡑>��7=��F!�̆��Pr$�g6����#�f��.h��"#&��(�0�.�N@�d�0
Ө'�C��mbn��Mt��f"��݇<�����U�En�����ԑ�x�I�����Wf��z��9�>�|@��-s�qh��;��[��bG�˖`��ncG�+�˜�u$,lKan���8�>{�LhaU�(��aF����~sc-#�3��@�1�Ɉ7��P�e��M�7ԡ�!U �I�a�d��5��Tc�Vv��$#��xc;���Hd7#�׼|gz�{5��ʈ��L/KQÙ
���8ˆ��̦]�T���
9>K|I@X"9���~f�:Fj@2�o>�����p��Vq�#g�z��3�����j�p��qV�#gN���9�����ș���O3�le��J�p��%�)��3���|.c��3x��gp���:OD
g��i@]��u�k(蟹>��32��3�f��3#l�P�?3v��gL�����C��B�cmf���k3�*=�f&XwP�?s��/��^�Y�6�˳�f������K�@�o��avw#���bv�	F*@�����=l�q�`v����̈���A�����%��f/�x���C7���=��E�v,��A�^���s�g#�@�*K����_�|8]Y��Cs[X}h��c$š�c��1F�@x��Cs=�<4׳�����;^>�
��in�d�B��)��^OQz��q�/��ν�D@x�C*���u%�͝��(�m�f�B���{;#��>�r&�}�@>�y-Aꤹ�e�j����s�%�J�0�9��yf!��<�+Jr��xmD2�y���6��,���y�5�-��lp�9�F
���A>�,�h�e$9�K|CX�lEs�)�hN�� �4��]Sd����>9�����H*ͭe"�4��U����y2#�4�î)�����C�i�G��d�/��^�R���e�G�i��Mo̭穄���zv�p�~n=+�Os�63���i����΢���Q�Rd��2�q�~�$O?$��N�$��Ӭ!�M͝����Ԉ�s\�!���q��77��A�9�4�NsW�)�a���lԑ�����s�,����x�"b27��,��$����&y��d�|�6Fl��9���|�=��{Xw�ښ�Q�����2E�k~7�z����%����ll��o~?u���B�~�j��C��@x�C�k����Hu�0�$��0�����#l�q��1�R��揳V��{�8[1d��Oq<�����C�l��r(�?����g������� ���@E���>!k6�m/���/����~F �aR]�#<Q�=����x͏�����{���oHQ�=?�+�_�c��Ԟ�4�{�֞���6�؞�
�b���ڞ�`k����2�&3�"��d���I56�A�Z�'st�Yr$?�2]'t"�k�����h������`.���"&�ɃALes#:/�źI�#Y���N�f�L��mr�
b�}C
�gH��ɫ�t{�t�M�"j+�;d#z��'L��(�����\��v�c{��A���vFР��#h��=��vv0��������dg#h;�}�4��d}$��AC��aFЎ��
#h��}�q�j�~F�|���a��d5װve��\��ӹ�!����lbD�g3#�O�F ��>F �έ�@>���|:�3�t1wą�]��|��3�t�`�DZ$��Lu�b��:���u�ȧ�,#�O�`q���"�xd��g����g��ڵ�"#�O�%F �.���6�.����.��U!����.��� ���iUg�#�ld�s'#b��b���+����+����)%����#����ӳ��g#b�d���'D��s�a��3°bD�#���4��	*����)���G����#�����<���G"Oq�l'O�D6Vuq�l�5F���E^\��Ś(���b}s��4�r���ĥ]^ߤ�-���b����*.��f�B\���~������������ q
G7�A��n6'�
�n���n^�L���6jq$Q��ꁰ��8�*7�_@Xm�FP�r�=	�վ��Sa�on����Zs'+�j\D�M!
 ��"�6s���j3y��o��5Q`����Ji~b���Կ�X �v���PX$�.���VXE`=
�
l���mTXM`�V����SX&��
kl��r�mW�0|{Y�m�Ծ�����
����?�0��O�{����N�A~n��0��ϻ:�����������g��y�� ��P< �ߤ�@~��K���q�3���{O�����B�~@��h�!��L$�<��TX(�S�!��TX,��l��t
(�*ާ&{����+�f�_a���u
��f*�!��:�>o��R�0S)Y���I�6�/�<�X���9�0�o��9��b,J~��<1�0�of�f�A~�#
��憎*�k�T2� ��
�����q�A~3��$� ���S
����߄��W����/�
��#�۬t>n߮t>�o\�D��(�Ƒ���j�]}���g�J��"w�/�p�D��E5L]���a���eF�$.`��CМ,b]Tc<��
�Ze�\�0�]°ƀ��:�!���`���R՗{o0R_�H}��#�r���k(�F
EЂC��Zp�3���q7#bo�È��g�U�/��
��"v���P�.8�����B���^(b��pN#^<�e#��1����5F�|��ƈ�ϟ���!^>�Qc��ǹi�x�8'�/�1���4F�|�{ƈ��s���q�#
��Ʒ�G�"r^۟�Փ^J��}'
�P����k
kb��j�Ѕڵ�]8W���kb���>*��tG�Y�u���UV7D�j�!�\��j��:	��r���Q���u*W��c��Y>�D8g���[73�ʻ�#�����h;K�I�"��b��ӬЈD4w^g��tj�!H��;�"��o�Dl�#�D
�LQ�3��|3��F��L�>FPY<p�)��4q�'L��E>3�O1��1GQ�3�i�d�/�a�P����Ks��)
|�y�E��sz	A��̉��x�D�e"Gs��#qoD�`��P7�/����}1T
�싡h(f_5C1�b(��C�P̾
�b��P/��r�X}�v����:V_�E]�/G�P��8j�BA&Bg�������@h�l tt6�:H�u6�h�l0���`^T��ʀ��o)����w�Z��%BP74�~������ngc����v6Ϩ�ngc����v^�q�~��
*:?N�_b�d��4og�����Wɀ�c�����t;�g���n�`D��$��;���t{�8�?�;$t�T7!zBNw𲆮���x�/�t;��9�NzCNw��	�!�;x����B#��]�@>�Ġ��t����q�ȧ���Rȇ���;e��ϹRȇ�\)��s���9W
���U
��l,�|x6�B>��+�|x��B><OK!v�J!�����#HP����N��I7ݱm�c\i��O�;m�n?�?	�'����Ō�"�ɸ�`�&l�	7�������
�dXM��M��S��g�O��L�<.d=��&��v���a-�-t���q��Q�������
�w��0B��'�O�Q
�za�'�%��j^G�P������@�O��/�F�7�\d|AD�}�Z�����,����%��Ž��^�q���њ$���h �N}�S�n�w�L�y���}|A��2��¸7�O�
.�V�@����60^�~?�B��>��p�'a����t_d.�B�/h����űE�Fi�E��e�"��"ӣ|�(��z�b�1��j�A9���-�������oA:�ς�_���W����h�~�|�X�v>1����9��+�Q�̨H8;̓Ÿx�n=3�l�~u|�e0Z��ɟp��~ڼ�"�P�Y�D~��'�~s��0z�_��QT��ӻ��|œ��B�Rzެ^QF�S���ط��d\(E���Z�R(��!*\���¸M��'�e�anj\�}����&6�q�~�_Q��u�c�J�y�Q�����v�T(��g�\��.�܌8e��V�"��v�����8�?Yt���:�X�%�K������z���8��X�?�O�2(4��ܔJL����P_h���U�>�.��C�+�R,�A W��TSZ\2i ����15Be���r�ȋ8�r�5y��
�˶;�?
?�A
C�C
G�E
K�G
O�I
Sčh�+��Y� rf��%Z�xх�/^v��^h���jh����ko.g�K�%x�-�/�_,�/�7�e������zi5!#��h�P�d�or���B������ޭ"%�w@GQ�zZ%w"dlg�n��.�D��ȹ��o���]�$�6r����q���gx5x]^^�^V)�k��
��T�W2��uyi��
^Z���+W@��ʈ��*x���R����/��5�+�4���F�\�h���a�!s�J��
�y]^0��F�v�2K!��H��U^*�+��*{����r�@��(�eU�H��(ċEU�F!^,���z��aj|^:�2 g��F�xVi7�i����/1RĎ�T(���7�9�nW+@�5�@R
�z�1�XW+���(rR��ꭞ�U�5�j
VM!^<��飀��Ⓖ;��@�u�F��'L��ů��a�y�YÐU}�i����_�#������Wˀ�k��ȣ��&^+V3�%���2dȡ����PW�Ƞ��#���
f�+À�Z‘>]���OW��?;�|��yڑ`��T�����(��o+�K�m�cș��y�K|i�{��NYՇyI/7X!��,*Dq��Dq��Dq��Dq��Dq��Dq��Dq��Dq��dq��dq��dq�����XL�am0q��Ɛ�
W��
[��
_��

_��

_��

_��

_��

_��

_��
-_�|��-_�Ŷ|AM����-_��^�Eܦ�����'D2GA�ج:il���Յ�����1�;�8R�w0�{�8R�w1�;�8R?�aD7�q�~���őR�x##��#5��͌�F0����}}���Z|�ƈ�sE�y#����]�X>W��0b�\|�Lj�sE�#����~F,�+�χ�|�
>e��*�|�����IF,���ϧ�|�
>�e��*�|�����#�ψ�|��M���͑���l
�}n���gS`�ss$�n?�s��#�u�����	��Ϧ����H`�~6|�yoK|G�{t?�sQ\Z���1�9� �sQ�#	��1�9� �sQ�#	��1=�I�m��Tđ��n`�/�w71���I���'��]�%|{�8#��	*�=x����<͈�e�"�o�e��2AQ���3bx��v�ۃ�;��J�ۃ�1:�D�uÌX�E�uW����3bY	֍0bY	֍1bY	�M0bY	��dIJN�n��1�=�[#���u��b��Y�n�=�X>׭=#���u��Ȉ�p�73b�,\��>F,���F�_b�,\���X>׭#���u��È�p��1b�,\���X>׭���g�f��Y�n�G�|�[?�\�%�u�g�k]�D�n�lr��׭�M�u���ɵ�["\�~6��uK�1�~6�U�礭Տ�ŎTǏG�7.;R���
r���.%�J}��#�4�U��`�WsN5M�;|�ͫu��b�j��D�ÇؼZw8��!6��N����&F,��y�͓�f��D����Z�2��!��ֵL��x�͚��-b�f��Dx��جYo1����!6k��#A��Y3�
�I*X�f�\+�H�ul�̵Ž$�%h�v$�g6k�ZaG|f�f�v$��ۧ��x� �ٷG���-���G��C����<����e�޷�ə�=���aG�gW�\5�H��l��UÎ$t�]Qsհ#	gW�\5�HB��V����9�o��4W
;t�0�Js#�#	>�d�G�?ng=0�ma$��{�}W	+��
�ؕo!/��\�M���בt�ґ,3r�qΑ��!��a���^G��f�j��u$}�g� o�"��y��^��bz��HՌI��ٔ!�O�҈���z�\Q�H�k��Ub�5sjZkP{x���.��׬�j�^״^1:V��z=1̫��7���d��W=7�����[��HL�<Hjŕ�f\i��bƕV��.�,����:MK3����H����¬�p"��
��
�7f�"�2�0��T��ΐcUʈ��p�����9�o�R�oFm�Ǜ0�>��X&�o9�:m9�:m9�:m9�:m9�:m9��-�AC�-�n��x�F��i�YF��i�9F��i�H4;�r�l��0���[.2�f�[h[��f�[.3"�3Ȉ��#B>Ì�\aD��*#B>��a�=���`D�g�!�QF�|��gD�g�!�IF�|�!̰9��[��ӷ�ȧ��ȧ��ȧ��ȧ��ȧ��ȧ��ȇ�@v�ӷ�ȧo#�O�FF ��M�@>}lѰ�������G1�,��ʈ��6F�|��B>;��Ɉ��.F�|v3"䳇!�����cD�g�k��%�ǽR�F� #B��bD��Y&�[&�[&�[&�[&�[&�[&�[&�[&�[&�[&�[&��[&��[&��[&��[&��[ú2�qM3�Tܑ�k�0�p�4>�"e�W�t(���_��m*�h717�����n��
�� ��_��t�CD#�!FpE8�CpS����;�ރ��z��9t��Cp�I�=h��s�\�K� �E��]�����ޛ���C��@
�o0�����δ3����`�v�c�Ț9�qn�`����7�|N2��Fը!��W�|.t2��/�}�{A����v0su+#h�x�<#�%{63��RO�`�ٸ��S����K=r���S3mf�a�.���к��q��S�v	A���nF�N��:#h׷���n�;X�hE0{~#�h��%�����|�d��>۽�=(a��Ƕ
M�_b�=d��^��̟�l)�?�yl#h�x��z4�a��X�$`~KU|�C`���f�.�����̸z.�Q���:�%��c��w�W�p�?ƃ��<���s�l��8`�OTX�g�N3�j8tz����^������v�+��(�h��Q��<��:�߸��v����$�9��V~�b4Ϩg �k��@>}�H�D��>^�P�1wq-#^>���!����Ϋ�y�|sc��Kl�P�1��y����-��j���2#���x�@�F�#p�&�4��cf�)��/�(�fi#�8���%Tt4��,����b8��Q^�pd�y���w�mcÉ�s�xiETs�"uD5��p���b�Q�ٍ�;�j�mdWQ��-lR�l�R�@>�����2ETs�������1�(���a�kD5�ֳEJ�a�GTs��gc"�ۈj�l�y��&��v���F �=�A@Ts�&KQ��	�D5�w�;���Y��Q���jΏ�+����v�՜=�N��>����s<՜�
)�����ʉ>�l{E��Ή>����c��:��fs�B �Ӽ�#�ټ�߃���:�^D5��O1��3������k��"��jl�o������ ���CT��	Q͹�<��6Q�Ac^#�9s��)����y�ATs�"�
Q��e�s�j6նQ�o�x'���39�K|C�{%&�Z�E��k�� �9���"D5�[xO��fs�TD<x�!�9��M���<-՜?�1D5�Y�՜?��q&v&�l�b�@Ts�[�
�s?��j�Rg]���Q�ȧC�
�&�ev�՜��D5���b�f�{�o�S� "���8�?�N!��$�r(
���2Em�^�j�f6�i���~6(�=�uCD<��	��Q�%8��ܪF������C�ͣ)j��/l(L�W(����(����|�A��}��8�?��dž��3W�{P�4{�M7��ύ+����8�?�Ż}�=‹��������9�S�3�l�p�~f+;�8{?3�.0N����
6����¹��cg�c8���c+�7��#�3��	�(���q�R���;�V���������mb[������2���~F0zx��}s;[����������Ln~��
�r��B���!���u�RDtYp��y^=��Ӽ��4��5�xÃ��͍��0}���6���
(�"�;��6��x��!��^�B���Lo#�o����ٸ�8�û�}��ňȈb�m�F�}c���&FD�h3#����Ϙ�R�t۸C0�x��%��ƽRW�)2]3G�3���	�njt]�#�@�Kd�6�c��F0�N�3��tR����IF0�N�1����5���$#�w�����2
Ejq;#���Y͝���e8RR�kՏ�u�́WG�*q�#؞g��҉3�x��_c�A^i��冼�~
F��+}3y�X��ӌ`{���y����+��m��Vo��£���̹�y��}�7�f���@^i�zF�Ԩa�ߐ^h��v)]�="�CS���l�#�v�C^i���y���k�f��*����U�q%�
�tH�̎���t1ߐ�i��gVg��k"茶��l[��i�dE��ɵ�H��$�+韓lݐ�����)�?H�4O� ��<�ڋ�O��:F�*\R�`U�\��O�s��z�3�:����Z�*��zAx��Ut����L��;��A�g��I���=H��]� �37�^	�<sWXw�䙛��b-jyA�g�.t|��7�*s�=3$yf�]e�K�/'6�tD�g�w/#���L���{�H��t����5D�I�[$qf�X��ę�V�`��~6�83�7I�<�I.��.�X�v��`y��V*�.+C����f�o��0#��d��������Y��]`����k��1�Rd�f&�2�O�!Avh��5١�.6���v�4FvH/��ܮ#�`��[d�8��[r�X
��n=�܇m�Q����Od���Cޒ�f١ك����|d�fؘ";�2�)�C*,�";4;�F���V�!� ;�\�3�C�MAv�y���(�cS'�Cx��޸!;��6�܇��";���K�Cͽ� ;��{��j�(�CX
�5��6Ev�ٯ�܇~6�H�4�sHAܒ{Nq�QN�H�*�@>W�{��ю�8�qv0���N�8s�y�"�3���$�\?�$q�N�,Ag�k�8�Bg�;H��-3�8s�K����U֪�'Eg�<[r$q�C�$��E�*$q�C&�8�=2��Z$q�yeBg~=�w"���7�H�h�I,iǏuI�"�3��$�v�ę��:�$�*IO��˱�,dq���89��.���"�+�q�Yˋ:�8߬e%A�/'�������299�B�H��Ot0)M��`��"���€��++�>��b�F��WV�Pp@cy��@�3��o�a@��(3T�v�k�:�PE@���lR��D<5��>�H~"|���+��o��/�>�0I�����b�b+^_�`�s닝x^}q�ϩ/2��E?�K_�a�k��x������
�g�X�P&�v��>����'�Sˠ�P�3m�D�]C�
AL;5A��D�[CvF!��^�ko��J+�گ!�ꀆ ��ҭ	�9����"�_Q�F���J	�8�
y��P�!��5&�i
Ag4y���qNC�Ǯ�G�<�}~��\HQA��ļQ�χ����p�Ͽ�����j-~di��!x���h�Cf
�c_�`���+
]��	_u2���UxG7x�����63�5�M��[�z�U/�^��|����-�8�W������YK�[��E�-�W�>��~�Z���׼Z`g�+��_��+�"�+�¦��|�R���~��ɯY�0~�*���Y����!�%(�ڻ��7.�e�"��i������@����z�K��S_�f���]�2Q�bq��A,Թ8H������P��߅B��i�7�����P ����v1�D�M|��
y���3zU�a$��P
�a]@j�������aC@j�����4��K�Q�� !7y^��_�W�¦�A�]��Ի �ꓱ)��~�5�Gy
� ����T@j��E�!�a�s�?X�E�
ٗ��]ؐ}yU�Alɾ�������b[� �c��5��~�u]�A��~
�!�kD��OA^��)�kT?��p�~����R@�(���S���A<S�Cs�����a`���]��" ����Ի��v���N�A�(���F�
H1*����w�R�UH}�թ����x�ع9������j��9�G���x�(\yإGX�a" 5BȫK��. 5�T@j��W�aC@j����!�n=�R@<B���V#D��5B���Q�B��Իb�wA^��� �v��4q�L�;��(�y�Az]@��S�O�����2C0���"���EX�-{���6�J`��PH�Wl��`}�m�Xl�gU��_2T�C��V�GM����	�ES�^:��*�O=�L@j���vuQX� 5�B@j���x��p?�Q}� !���E���x�(�1^0*p�������B^�AF����S�fR#���~D"��̭�P2c<���E3fG��,�(�18�HfG�Yoc2�-Jg�z[ˣ�.�<�w�*v+ݨ��u�&�G���t�&�G�]ry��B
�1�(�qk�2��QFc���8�_ˣ|],�z���E�.�r1�����.�1z�z�PC�C=a�0�=�a �� F*�!#�P
#�P
#��P
C�C5a�S���ģ��l�Q\c6񈁚M|*��)�K��S�WO���؎+"�jv�؎�?�*�?y�M|&��<�Ll���R�&�6f�b�S��v#$Ww�o�q�"�@&���aP��>_=%��̕���+67�>�߅r��o�}�~J,�j���1{o��wC������|=,�z����F]��E��Ǭ��q$����2j{�V�=f����ࣶ�lz�>1�^T��M/�{�/���'##cv�(�1;[�kľ@.�w�fR����.�K�	H�8H}�^��WPO�ȶYN��1�i!7
�)�0��`h��WȅQ=C�W	d��������J��jG+Z��
9��:.SHǓ��<�Q�R8��)̯�f�c�ԛxd��w�8��u�~���u�~�8�[Y�S5�� �Q�T* �V�a���.觰�]�OROa�
�S���
�S���]�O�ROa�]�O�ROA^W�SU���;���	H=%f��\dﮰ��E��
��\d�Դ�E��
o��6�~*� ����!�K�|.�wJ�s���O��o���ލꧪ�o��y ��zJZE�����)i�S���y���:/�wZ�E�N�<��K|�{'AO&�ԓ�҂�)��O���~J�C�SP=�DZPO&�ԓI��d
��e�iA=�DZPO&�ԓ)�[W��ʖ߅���.��G�#-���iA�Z͑ԛ�iA��͑ԛ�<JZr#���FTo͍���!���N?�Ȑ)r�+2ҬbyE�VT"��ʀ~R��:ܐWd�K��*��,$p@fW��)�I����Y��y]�e�	9����*fPOV��(�|*ފ��U7Z�g��`����Y%w@��*-�*���ςC��
$�#׌%r��Kh��'c�SD�c�L����F J"�_�dJ�PF���"�a9$3�C2��T�d�y�"��i�)r�n��R�ԅ��P�O��3?E*��~JF������	�.�&5y��$c/�;�?aRH��U�Iym&�2-�E,2݆/"��m���ÓX�~�N�zR�����3Փ"�b?�2
�ϊ?c�R^����W��2��L)�����~R���'E���
9�K|��{kBCR���ؼ�fv���� l�5�h��(�k4("l�ϖ�6���).�Aɶ �F5HUk�d�Z���2����i�&�m^&�YJRQ��
l<��y{M�>�1�l�(�)/�A95�lD�Ά���l�Ȏy����l�h�@���2��#��>���T�[:���J�V:�C���"\��\y�aɦN���E�rйƽ��)p٩��9��{�ӝ���廕�[aF�=��e�^�l�?���.<�\���T#�b_oz����e���"��L�Ҝ�ہ����+_��#�������3��0�����LO0�݌Ԁ�a�n�i�.��(y����;	��`�3��L����~���3��bz��3���WcM��b$����m��@60R��H	����^���u�A������la$�Lj��ޑ<��t��1��^��.F�ŕ��b�UZN���j�S��5��`�Ŕ����)�h����`��7r��o�X�'��rE���b+K}�UQ�˓��GtT�'�����t_-��L�J��{��{�ӽx�tsZ��zE��c��?0��?2���2���Y$�Ș�5�jHT�HL��"��c��9�]$U��M�S��R��!�"�<I�2��!6���<I�2�ClEe�Z
���팔�!���(��c�q�|�`~�ID�!���f@��HǗg�dD=1"{E���0�w\d�Ā(�g/d_N�����f@$��*x9uQ)"���q�q��QAF�(�O��3 L1 v�b+΀w1 ��;ا����
�f�'[)�j������U)k�x��EG�P�@{���8�e�_����F�-ӽ#�wL�f�?0ݯk����R�'�{��߾ˀ��/0�/n�c�7���~q�{�{�}�{��ӽk�C�{����ڄ6�{�	�����"FL��p�t����Ms��^5�{���t��u�{�{�|���@��`����_��3ݯ���t/Xr��л@���^�˙���{���t/ؗ���2ӽ`_a��L��}��^�+��7��d��N�3�o:W2�O�UL�k5ӽ~��x���b��[L����k���=��e�����{�����c���2��?o��O��1�O����~ж�����Lo1� n1� n1� n1� n1� n1� n1� n1*-&@��������bTZL�J�	Pi1*-&@�����-�%��ӽ��o�{��������%z�?�&�%
:�K��h�&FD�k3#"ڵ�/��1F�@�Aȵ�(#��g���� �~�D#��2�hd�z"E�=�t�� �Aۆ�j�;�A`��#�O�	F ��S�@>�g�|��1���gD�g�!�K��2"�3̈��UF ���@>�#�@>�^��[�{�JDA���A���@�<�P�2�����'s���ز&&�F�������r�;�4 �2ݱ�����c;#bb�bDL̽���y�11�3{Y�0#B>G�a�U���\���\���\���\�a�V��i^��i^��������O󺘘���(S.@�l�s-#!�R����f��(f����
�a��f��ق���N^P�2�ɓ���N^�Q�2�}��[YԨLu�j���T7�)S|Ko���߷R�.e��E�	���ʄ|z�|���2��Ɇ �T�zF �N6y����LȇM^&��&�'S�l�Pv2��&5'S�[�|:�1�t���L��e"S]�0ԈLu�uB��T�A��Nu��Bi�T;H���b�f�BJ�K��bo
�R��F��R���!<���gR����H�T�s[�R悻<�s�݋��wy�炻<�s�]���n.��s>��9����M���!�߳J!�{�(�=s�@c�?������ڗ�֑d��+
x�h�"2�o�y3�?��[���n垪��^i��Y%jVQ"E��%j�
�
���*/E�˫^�'8)V���8x����ތ���y��|���o}
��Ϗ��oDв��O��H�������;���~���x���T�[��f���s�M�!�x�?6<�D���o�l�q(v���ue1��VY.�}���g���ö�jYW��@?L�^���E�q���w��?�ٕ}��^��K{DE�{gWV�}�?Q�:P����%<7<7��s�&P���J��r��X�/I�ݒ�,P/�ߤ����0о��}�y���K����ɓ7�<l����n�x�-�R�M��;�Y�KX�a��=�>a��= ��U�J���V{�c�{BX�aO�X���a������a��^���a��^���
a���!̳��n�<���!̳��^�<���#̳��~�<�� ̳��a��f��س��4a��f��o�0a��f���o�(a��f���o�8a��fN&�40���y<-��C]Y���9¼�=O�7^���k�"a�x�^"�����6��h롞!f�P�<C�~M��H��y�4{�0ϑf��9��a�#�.�9��u�<G�]"�s���>6�A��'-dC���
}b�B6�A��'-dC�~��
}��B6��G�з-dC�~��
}��B6��G�з-dC�~��
}��BV�������GY�ۏ�ڷ-d��4�u`�
lM`�hb>weI����5Vn�L���Y¼�;G�7s�	��c�a��.��y�a�{_���<>�]!����ׄy|��'����U����d���x<�H����y<���Q&��L�o���v[!̷�M�|��"̷�m�|��!̷�]�|��#̷�}�|�= ,`�ܷ�*a�����1a��s�)|�=%̷�3�|�='L�M���%a��^&o���xS�[[e|Ӽ+���P=�	3��}�'�60Of��o]Y�gd3�g弛�|�?O�,��3�8���%B�ߝ'����,!����-���w��{{��(��3����N�q�n���x;G���g	�x���ܹ��s�8�}�_J2��B���R��o��v��"!��L��f�]"ę�-��3�����@7	��n�&S��W�$g�?_9NLt�����9C�w�{�v5E�3ӿ?#fzB�3�ۧ�83��g��/ɼ�M���5!�No�;�&����
B����4�H���j}Lj��;��< Hj����N���*!�!�;��ߑ���'3x���g�?�%��˯Vz�2�ܤ�.�i>ȃE>�Wz��JY/	�^@�ϓ�������V�<��87��2j���z�8���*��rӔ~e����ʍI�\�����q)Rُ"��(*�1)*i�B�~����Ѡȃc9�7������Q���OLo��^��e"y_�oe`��T�DSJ��(��OW6����v��<��D@x�L�le�*0�T��R2�8re�a�L:^����P���uU����������݄y���=�y��ս�y���}�y����y����y���)¼��A¼��4a�i{�a�i{�0a��z�0�Խz�0�Խz�0�Խz�0�Խ��(�S��I�|�����a��f	��w�0�~g��7G�o�����;G�o���@�o������D�o�˄���B�o��R7,}�����*a�����o�0�~�����N�o�%�|�-���a��V��w�0�~���w�0�~w��w�0�~}�n��V����a��&ב�00�6z�i��ꀲ^��:��k��LT/��k���w޹�g6U��[X��@�@�_
�zY�^�h�eG�ؠ�r�mE�kQ[aY/���Ll����Ote�d��
�m�{��pzW&�3u��-K�z�0L��E	��*��^*�Er�E�4`$ ��1��"Y�����E���2!9Gq"4
���d?�\lX�2i�8MW&	璈���Е��	$���Eq#NDQ�K�K�ZW&Nv]�8�ueҡ���G	�+�vKb9�I,�9I��ȉ!����@?��ߕ��:JR��$JEW�G�=Ƀ�}��,�_��te�#�v�+���+��L�K�Uj�ѕ��V�y��T\����iZK����J.$��󁩥�����b��r!���xte�6�+Cn����L����"9�d��[K�fr�e��wJh��>R=�0������{�^��GX�a�	3v�0�a���`��7>��y=H
�=l����Vz�a�*;B��ÎV{�1�;NX�a'�X��$a>1f�q�0�����8M�O�3��Ę#̷�Y�|��#̷�y�|�] ̷�E�|�]"̷�e�|�]!̷��},0A���Ln0
)YweB)���WHi;*��ݕɍC����JkW&�B�`�2�q(hXX���Rȋ�]�\H�Rn�
���VY�^#�20���G@���R�l��V�_@	��B�d?��IW&�;L�}��~�0���Ol��
�0`��Tȣ폵��Ձq�~T��cT�h��fT/0~�*ד�Z��Z�PՕ���أ�G�xm��I����W�(��E�����h�s\/�܀�ׁe#��	�Q@�Zԏ�GHl����=����"N
��8pB�S+��A�21�ŁJlR��ĭ4t�ʅ.	HbI����~�V.6�ö�\pl)/��҈��@��+�ܕ�2�6xW&7]Y��	ϖ��l)��L8�
�Fm%'t[�	�+���m%O�]�pd�.�z�8i�J.��#�9�|���î{�5�[ ,��EŒ�]'�z�a��-�{�
�
[!��Uv�����&���;�5v�����1���>a�����!a��V	��0�~�	��0�~O	��0�~�	��0�~/	��0�~�	��0�~��|�bcc!��7�v;�����
���h�2���Vn�m�7�lX�����N>�o�
i^ˍzh_W&�ٮLغ2�(ueb~-���zU��U�u�
DL��@=ۻ��o�����z�0LɍMx��
������'��L�x���(UCb��r�T
�F�ھ�@�>;�_S� �0��휪TOʘ�Vn���4������2��9��:�i*�2q�#o"�|�l��u½���I�����R�(P�Չu�S�$P��IuR��u$�ueb�VG�vy�O�<�"���r�<u���i�Cc꽭���:"�ZG2TXB�u,7�u Fˉ����pՓf�db��?!���op��)�f?#�q�������AG������{���p[�$�Q��p��G�&�1�8�� eį	p��
��%���+�=~G��ǿ���{�=��g�?���G�=���ALD:b"rA����,�D�� &"�1����@LD�b"r>��l�D�V'&"�:1�Չ�H�NLD~ub"��a�����D�XwL���v8�������H�NG�v�8�ő��(��Dq�p'�#�;QY܉�H�N��ۈ�zQo#���mDq|��(Ņ(��(��(��(��(��(}�(q�(e�(Y�(M�&[*�D�)�DH)�D�(�D�(�D((�D�'�Dh'�D'�D�&�D#��]�3�:	�"	�
	���������'	"!�DB���80	qJ �h@$�y�H��DB$x'"�;��݉���N$Drw"!r�	�ڝH���DB$v'"�;M��BLD*b"����� �D�� &"�1�?���ALD�b"�}�˝����D�� &"�1�>��x�����x㈘�׍��x׈�����xˈ��W���x��������x����׊��x�������x����W���x��������x����ׇ��xw�1��/��d�[Ot�&��u$�8�E"��E$�8�B"��$�8�?"���#��|�N������(ޕ9+啓��
'1������=R\�#�q�숃�cG,��u4�V�W�%�OG,�e:b	n�Kp��X�;t�\�#��M��:GT��9���A[{��h��f^{�h��H�T?"�>"����t4�!Q/ Q{I�u�@G�C�9���{����sD=d�#�!�Q��zH6G�C�9����jM��5%�֔�ZS"kM��5%�֔�ZS"kM��5%�֔�ZS"kM��5%�֔�ZS"M�l4%�є�FS"M�l4%�є�FS"M�l4%�є�FS"M�l4%�є�FS"[M�l5%�Ք�VS"[M�l5%�Ք�VS"[M�l5%�Ք�V*��M����z�&q����jg�H�f %��E�4E�4E�4E�4E�42sNW���f���f���f���f �jf�Ȍf�Ȍf�Ȍ&RdF)2����D��h"Ef4���L�(�&RF)
����D��h"Ea4��0�Hn�M���&R�E+⢉q�Ċ�hbE\4�".DY~A��0�XQM�(�&VF+
����Ċ�hbEa4��0�XQM�(�&QF�(
�I��$��hEa4��0�DQM�(�&QF#_W��q�$��hE\4�".�ZumREW4��+�T�M��&UtE#߯��I���:]��
�T�M�h�&U�A�*ڠIm�E4�=�L��QdAcY�E4F��QdAcY�E4F��QdAcY�E4F��QdAcY�XE4Vʂ���N'���J��{@��UdAcY�XE4V��UdAcY�XE4��ŭ�
�h�^�t�8�#D�LQ�$�Dq�G�♢+z�щ∏�!�g����C'�g���eD���bb�H�^"tbb�H�^
tbb�H�^�sbb�H�^�sbb�H�^�sbb�H�^�sb"�#��\��L���\!����\!�����B!�����B!�����BQ"M�(��P�HS(J�)%��i
E�4��D�BQ"M�(��P�HS*J�)%Ҕ�iJE�4��D�RQ"M�(��T�HS*J�)%Ҕ�iJE�4��D�RQ"M�(��T�HS)J��%�T�i*E�4��D�JQ"M�(��R�HS)J��%�T�i*E�4��D�JQ"M�(��R�H3T�H3T�H3T�H3T�H3T�H3T�H3�Jdos����'*�*�*�*�*�-�PQ"�PQ"�PQ"�PS"kM��5%�֔�ZS"kM��5%�V�D�Z�#kM��59����Z�ij�N��5�����Z+M�l4�����F+M�l�;����FS,M�l4Ų��FS,M�l�;���d�F�-[M�l5ٲ�d�V�-[M�l5ٲ�d�V�-[M�l5ٲ�d�V�-[M�l5ٲ�d�V�-�@�-�@�-�@�-�@�-�@�-�@�-�@�-�@�-�@�-�@�-�@�i�vi�vi�vi�vi��H)���F��i#E���"`�H�i#EŴ�r1�F��H)#m���6R�O)⧍��F��i#E���"~�X�icE�����XQ@m�(�6VP+
���Ɗjc���6�;�A��jcEZ��"��X�Vm�H�6Q�U�(ҪM��6QP�(
�M�&�jE�����DQ@m�(�6QP�(
�M�&�jE�����TQ@m�(�6UP�*
�MԦ�jSE�����TQ@m�(�6UP�*
�MԦ�jSE�FQ@�QPk�E�FQ@�QPk�E�FQ@�QPk�E�FQ@�QPk�E�VQ@�UPk�ZE�VQ@�UPk�ZE�VQ@�UPk�ZE�VQ@�UPk�ZE�����LQ@m�(�6SP�)
���f�j3E�����LQ@m�(�6SP�)
���f�j3E�����\Q@m�(�6WP�+
����jsE�����\Q@m�(�6WP�+
����R�mw�c�i���jEZ��"��B�Vm�H��P�U[(�<m�(��PP[(
�-��jE�����BQ@m�(��TP[*
�-Ԗ�j
���8��ߧ��ۘ��;n��?$č��UBܰ�D����	q��	!n��sO�п�G�y��7��_�F��KB��E����	q�
!�#�C�s�ow����B
u�}��G��Ϸ�	q���!�>�N����AB�}���#}{�g����s�1I
b�"�$E0�I�h�Q&)�6Lҡj n����0I�a�"v�$E�I��
��&)�7LRp����0�a*"T�TD����`
S��"�5LE�k>N�%H���as#f�FEІ;��
i���QݤQݤQݤQݤQݤQݤQݤQݤQݤQݤQݤQݤQݤQݤUݤU�Ӫn�@�"9p��>s��Y�=R��V��V��V��V��V����L�9X�؏`��"f?�E��"b���?CĈ؟
4�g��3����F�a#b���?C�؟!rD��:"�g��3�h��$"*f�3�����DD��"�b�HQ1C���,�&��"67�ElTċD�JmH#���&Y��Iin�E��Ī�Ī�Ī�Ī�Ī�Ī�Ī�Ī�Ī�Ī�Ī�Ī}b�Mbm��!��������������x�?I�a�"��$E܇I����&)B?L�D5�?LRD���0I�a�"�$E�I��1 &)�@LRD�����0�a*"��TD�����S!�"b>b.7�<���q6*?�!D~xH�j���Q�ĨnbT717�mBw�;"�#U�3�����F�?���U�Ϫ�gU����Y��V�?�n0fbϴ�gZ�3��V�L�z�U=�z�I?�x�'f?"N�~�����9����Q'&i�q'&)OLRD���=1I{b�"��$E�I���4�$�(�"MLED���51kb*"��TD����p�X$ru���!'6j�)��NbHU3�������������������������������}J�MJu��x;P�:P�:P�:P�:P�:P�:P�9�D$�BJDR/�D$�BJDR/�D$�BJDR/�D$�Ty!%"�R"�z!%"�R"�z!%")BJLR����)1I+Ui�BJDE/pDT�GD�J�3/p���A���DK�H,S�q���H�Eb�N�^D�x�E��-CMq͆Z�0��ED��˄�\z�J���>��RL��7�)n�
n|-nx3�����-ȕ�#��=/��WZχZ�k����V�9�K�sD���.Q�[��#�D=Gd�z���q%�9�J�sD�����J�P�y����z�*=G8�z�h��$�9bI�s�����P�#�C=G��z�`���z^i=j=���7Z��p��H��\΄e!�ZT�ږ��������_���Hd�i_���D>��L|+�D�>]��G3��'�2�̮L$���l��H�����D���D�k_]��*X�O�ve";SW&>��l&�_/�_<k�R�#��Jm�V>7���m���ԯ��/;5ۓ ד�ݞ�����^�=Q����z����HJ��o�5�k�$X>{n�ZP�h���k�E�@X�a��%v���Ö3�L����e�BX�a7	+<�a���&��;�
=�.a���#������E����o�0�~���0�~O��0�~���0�~/��0�~���0�~o��
a����&̳�=},��w}/a����#,�]�rb+���29�FN����0u3��Sd�:� 5�>,�z��!��n��!"_xW��4!����!����x��aBK��G���w�	q��!���M��a���}�k0�|��X�1!�2��%�y@��Q><"����MB`�[��>w	�}�����	!�>�����!�����o�}��*!�>��c�M��L����"pW�l��AB��7�����oW�zC�zC�zC�zC�zC�zC�zC�zC�zC�zC���6r����=Lu�Du�Du�Du�$`�Du-��+S�*�K[���N�NU���v�*I��&U�X��T%f�3U�8�5F��Q))?�ݕ�̑ߎ��Tf�����IcTf��u�5�-�Q�����kU>��Zu�����*{���*��:�ʯ�we�kU&[��Ver�N����L��vW��9Sg�L�	3��Y���L�dd*�3u�!�_ߕ�ۋLJM�n�s����\ݒ����<W7��!��!��!y`��Y>W=$W=$W=$W=�P=�P=�P=�P���'��'��'��'��%/To)To)To)kD�r�T�\�\.��2���Vo����=Ru�Ru�Ru�Ru�2������������������������������������spM�JݨiE��
Z�A,~��E;(�Ӵ�2PO�A%�v0۵�,P�ԫ�Z�>x}V���Q�!�H�H�3���$�����b�~@,#�H�H��3R����`X}V�>����$�
ٮ�aȍٮ�2�m��r�����a���q�w�������{��������G�*�CC}�P�f�q�/j�+�b����^�a��-C��W�^�c���`��3{�+C�����Ȑ�5�v�����3������7���?#	�H��}�d�����A���A���A���A���A���A��Fx���s�^:�5�A��2gPow���]�NF��dDNF��dDNF��dDm���~�Ow���d�!2C\�-��3��~�?��{r>k#�'_Rm���%5ʗ�+n��y?#�(�6%*���F��_�����y������k{W����>&H-m���=��ѝ����N%�9�ھ�9V���r�-^ �1{��@P��Z!(dz	r���'�fc�U�c�s�	r�:F�#��
wٱ|4���Y���У��9{m<�K�����	r��<�1Dli��̀�N>'��k��4A�^��gr�c��k��n�J@�r����0A���%�j���`��sF���-�<�1��`|h� �kiA�^+/��NN��5~Ac�-��!6	�K���^�i4�QzH���h�	A��rRjc,��>p|�6�c,�]���B�WxqTVH�
���_H�
{��
�o�YY���p񬬐�m8rYV�G�	���#��xx�fv�F'�$E���U7��0�ć�LG?�2��n���zR�h�����e��n�I��@�Z�\�6c���f��m_��ףK��]�N��{�lhɆ�2����U.�m D�~O^Gm�(��*I�"`��HC����V>���2���ĵծL����-϶�KY~/0.e%B�m)��ve�A�:P���-P6Ҿe��V��
ح*�>���@R���o����-"��1n�Op�~J���
n����=#���9nu-`ku�1�q����W���d\m��q�L\J��<b���bQo���q�L�8n�����i�m�k�"@�r�]�� \����0S^�����.A�K�pLٽ� g�ўa��<A�F�[&�t� ��];u� ܗ�?����1ۂZ@��Ε��a�q�)A��<�a؎�zN6�h<����޻�<�a0��Y�`�)�N*/��M�&&�zL�8���0-�d�r&[����`-G������oA	 24��k���9H�t� �YG���6����.��ۅ��Q��	&���3�1�:�pl� �����V�ά�c4���::�
Ax�`�Q�ύ=�	�MO&6=A\��ss��a0�[a�O< c���z�'��IZ} Y�f�	�����C8׎NѺ��h�	Ap��'	���%��C�\Gs�	�U�h]�at4G#Qy4Gt��<:K�#t�ѥ9�`�sd/(ˣK�F��G��W -��?�C�yy��$\@;��}}� �k~�2O�g���z��Y�y��q�s4O�G��5�X\�ܼ:K*�h��a0�M��v5Z$��h_�݂`�E��]'�6�^ õ�ͫo�-Ӏ ����E�`���@���9�`��%���\$RY>km���n�L����������ܣ
�q�`�{4�1:�G�y��M��K��{�� ���>�I<[e0�}"]�c.���Q9�F�F�@:Z�M��WH7�>%��%��c�2]uF<�m��cn#l���j�*=~Ef��W	�����b��=��:Oi�����g�¸[:�� .������*��ݵ)`d�Z��Á��mkp�t����������%m�p�t���S}Q��K�r\7ݼv�M��-��e롈)M�G�����R�h����ͅô����ͥ��z�r��5?
����S�h_�TZ�7�,��rm$�}Cd�}C�Z���QĕصE:��N��"��q)v����H��y�"c��#���-!��:>@ga�c��.�ʿ*q������
���� �;��)��p�u|���:>H�µ��A�y�kO��[�Ӵ������^�iÇ���#de\n�f�î�&��~�(MŸ�:>B'n����܎Ϸ���L�4\�d0��ڼv�;
���I���'���9��nв��Y��+Xl�&id��"c"m�x�6�ț��B�U$��!���g���&��nZ~�9��Y��=��E���A��yR-�yk�6#�{k|�iȾ��[]��Z�E�@��-��5�"!
Y�Ɨh�<\�4�"�d�����OP���k�GV��_�I�Ɨh;��\��4M!+�2)�˵�p������-��k�5M�H�5�B�]�d��_㿂r�0C�<]�k� S�x��$��/Ҥ�l]kw�1��k|�Td�/�� g�x�Ξ��5�Is"�vm.\�_���"z y��}:X!}�61�ͅkt�Cm|��
a��4����к�P�.����]"�i㻤T��N�ۆ���;�����b�������6nq?�1f8
.<��i���T��a�Uڄ"u��lxԗټ�C�Go?%��xA ���@���� a��GWæ��#�����}~� ��}y� ��A����a�����b���^����4^���7�	�;�"w�vSCz�����"A8�=!�!��0A�s��5A �w��d?����9�m �yم-�l�1u� ~9�+C�mc�A��9�� \<t� ,���	���&�:|� ���%nf��ӄ�Z�^k'W���xq��
E�Btl���m̐�!�1C�Blc�A��)"�wms���k�k��8�8�H�t-�B�ş�̜xfyx�0���}�|�k��E�r��m.��J����2��m^߳�0l]�yE���n"8�gi�G�l�>��=밇�����?OX�a��p�K4/����%e�6.�@[�9�
����I���4��eN^&�t�VD�6��e����p�gM��3̹%°&]���..��~��A���aUZ�E�4�O	�6Vh�Emc�,���
7�t�:���v�m�z;�����Ck�o��{	��.�#bo�����m�;D.kM/�!
?�o�4A"��~x� ��*�ֈ�m����x���y�
w���xK�(m���xJ��s��.�m<'�@xn�(ͩ��m.���ͥC�$wY?FS*�t�KG��^ӆq�ͥ��"P��6�m|ÿ�6��#�-���@���i�"u�=D,�6��x$[�-ع��?FK	Bu�'���M��r�P�d�>�`���� T7�O���n��1��v�|7��:W����Y�<	�8����T�h�d�v"��M��B�h�Mf��Mө���aG�&�i�Er��a�jx�6�D�&�`��t�B nr�V]/�t� �&Gh�8��(w�v�q��q:�!79���9�MN������q��1��p��V 79A;��&'��^n�7��77R̾@ nsi������g0�,Q���,Q���i�z!��,F6;C���6�^ѱ���3��������ͥ7�5�6����h�,D�&���h��<YѸ�y��q��$�!7��lv��?�M.������k��.�����%Z���\恂�]�MM�/"7���� �d��l��ϺV���|�?���L0�*���M�҄����2S��M;�Mh�Axo�-��MhK���ک�yn{��D��6���r���Z��[�H�?�&7iߛܢ)��]�Yߛ<�����Da�&���MV�x^��)9�MXG�os��ۜ���B|���[@�o�b��&Oi���W�M^������8�m�8K�)b|FE��]G)��&o�>�b|�7.����� ߧiڧ#��}:r� g�O��0�}:As-�|�N��ۼq��A�OsD�֗��4GLm=�1��[_��A�O�� ��	�7�t��M�6WX���|+�tC0n}�H�X�
m����5�I^(n�$�<ŭ��h+�h��Xܧ���J�>ͯˬ�=!δp� g��۫���a���2A��������;N&���	�an�"��`7Ap���a�Z�v`�Z�C��O�i8����}����>#���êus�G��t�,r���%Ax?��A0���a���%Bn�^q�a�W'��^q3`�W�x���sdj�ix�5����n�m��~Y�{?��Q��ߦ�g?��'_��/���0�|�dv{�����������L��L��4��?��?�?j7��Q�"jYDM��m5.��EԼ��S�b7j_L틩}1�/���Ծ��S�j_B�KذԾ�ڗP�j_B�K�}	�/���Ծ�ڗ2�})�/���Ծ�ڗR���P���P����P���P���R�,��R�,��R�,�.��R�,��R�2j_F�˨}�/��eԾ�'j_F�˨}[G��/��_|��_��}���9c��?�я��_�7PKE��Tû
�lpip/_vendor/msgpack/__init__.py�SQo�0~��8e/I��U��
��{@%Nr�&v�s���s��R��>�w����ww>��V�l����W�v���%v^[C���:�c�OG�G�9t��F�H^��c��d��`	�E
�.�e�i��yt!��2�\]s�Ds��5r�>�>]�[�~�1[�\��_7�|�����6��6��%�\�_ \��)T��X��F���tl)�:�
a�����0Y�Ҷ{N_�ܕs�=|>/!*��wb�y��Ma6�=(��$GQ4��0`�;,=�6e*xp�#h�B�s1d_#¢l�"r���6_���Bf|d0D��C����DB�k���ޙpw�#���)���/�>�K��\��Du���W�])MH��q��*��[4�4~u�+���� L�&lځ?H��g2��?U��j�)��N4��3P�V4@���ׅn�?�{B��
ޑ5�rt���N���h����<xtt������M�S�PKE��T;;�ӭ9!pip/_vendor/msgpack/exceptions.py�S�N�0��+V�J����^(�ke�5�p�ʏ��=k;S@"���Ύw7�b��>����l����[�T@�b��c�Mla,8�#�Hs`�t���I������*�?nw��p
=;g��wh�wL�o9�)���`#�l����
�̷0��5v�R�R;�����TU���!�>��L��Ě����y��=�M4U�2��~%S}dJr��{��H��g#���34��yV��{<X�
!�J�Pf��HU�+�ۂ5yi>�eE-fʜ�,F5�~c<$\*����e�0���.�ՙ�v��PkZ���z�Y&�<iE�ㆣ��^j�ڡ���|E����;>_�0��~'�(Bӻ�B~�$��E��E֪ߖtҢ<R�,�J�G�~����O06�s���� ��>!59b�#Z��i��}W_PKE��T'�89��pip/_vendor/msgpack/ext.py�X{o�6�ߟ��b��:��im�ņ>�[�b�֡(ڦmm��T��>��HJ"-�q;!������#�f�8]����㧝y��p)I�T�Y* ^��\B�V|&�u�;fe�$��.6��(�b*;���ӛ���Eq:�ޅ�a<�A��IF�'Ne$7k.���/=H�t�wQ!��|�������Y��|�_Zl����G�+"~7�k	?J�ǓB�y���{�ʌ'�y���ӄ	/�����A�f�ۃ.F��P�}���-�C��9<���@��s��5�� eG���(��ț&�Gy�=%֯=����Xĩ�,�rO�a�,*zrd�
���\B„,�]�TRۃ�Fr�\"��*������!��<i�;K�V[��Ò�sY�)�b�sτÕ?��*�W�_tq����_Xu��7v���,�?��Y�)�c�S�q"�c,��|#�Y�+�����<C��e�ΠH�ǛJ�M�������_*qJ��؃ѼH���E*�7J�Y�ү�sN�g)Վ\-c:`1u�U!�$�#x��tfX�y�)|���
IKY���AT-.�D�IEX{ﺆ�
�b龷� Nc�i<��J%=[�8�`��^#C̒���2��l��g�f9[�K�./�Մ��+�0�S��p}�-�u6]��#��W��g�B��'!�:N	g�R�8~eu�LƷ��6��]�Y$�T6S��1K7�e�%�s�?K@5�-[��U��$���/��	u-/2� �0�+��	�g�v�|���yLTNW�}�L�j)���=���C5/jQ����`�������V��@���-��
=�m�s�GG�VEV�tު���F%�qzcBTPCÆ�t���T�A)w\f�}m�v����`�ڭ��p`c������f�M��S��m����n�]1�F���p�"�m���-e���c?E]�?؍�F�Jčƴ�sB���R�)��H��(�‚@n�������l�Tm޻@0j_1ܳ�ۖ}aA�U@��}���S&���ߒa�E��۪�L,��2����'�7�~�����RPQo�zu���zGU�=����sM�aM�zo��a
4�d�l�dl���Xh;��[p
3�k:��j����FK���5i��-���KI�D���	O1t����V�U
E�/���~�n&>+z�Ä�;�8Z��Zh�wvڢ�M��Z�a�»P?'�̳�,����?������Ŗ���T>L�:�
S�Y��-�4�L��?����9����$�
D&bנ0e�h�NK�ʷܷ�L�K���h���ߡ��R[�T¬C/�^��x�	�ߨ]g�v8mHD�!<�Ҏ�:�:�<��a�0b����91��L�m�0^b�`=Ԧ5��;Z{���̕r�28:"��ꀝ�����U��*�ah�][Sk8;=LÛ
M���Y#�
��8�s�s��(���)�Σ?���n��u<�viO}gُЩf��EI�#�%���M�
���+X5�[��niH[���:&n%š�[$�#�)�?�F��k~ƒ_j��´K�6��9yK}�������JPkhʻ�5<n�2F��JDl:r��j�8g���QЊ��E���ۅFJ�f��*����Y�~�Zb��=����K�����TL���q���<�?���.5k��X�1#��.x��q\�Q���"�>�*c���.]}�厵m�5V�(k����w�U�f�0�z��{���`}�����dPGq�PKE��T�H~E���pip/_vendor/msgpack/fallback.py�=ksɍ�+z����Mq)�k˪��$Q�UE�=n����P���af���T���c���d+	�lq��h�F��f��8�'�A<�c�y�����6�X:�M�i�Uq��c>f��fP�Fcc\�S6���J�	��E���E}x���
QX>��kU̇�����o۬�%�OIQB+Q���ݏ��c�����O�UQ�8KJ�Є�6���Mk�
Gɘ��a�UR��i��x=�I5/26��b��L���
���<K��(A��<qv�/���
�F�'�_�k�ُ����f��nAҝN�^�'�9�E^	��M���(-�B�&X�L|j��~&I�L:qqS�P�[Va��XZ�YY��0p�=mJ�U��PT�}Z�6�!�ΧLQ�Ϊ[�<�d����5Y�,�	��m\�UU4A�m֘=�#S�
%㋪H�����+'�=����V�8.�c;����'�h�`�/Y~�Y���d��NY�qEDH$�I��OҲ�nQ��*5SV�΀c.e�G�.���f�O8P����<�Ȫ�}\W'�~�..�����i��ԏ�ˇ��,�Ț���ɰ2:��D�VQ�,��T�7h4�0*�7�AxI#�jQ�D�-[���:�l�d#�����_�5ah$K�8�%?>/Ƙ5�&Ӽx��&��@�ha:U>�nm�tz�,.���G��[#�����O�)�e�k�Ѱ���R&z,����0�b�?�$sx�I<�bV�M�؇�0�	Q��9�l=4��qR�'�6{?�ޏa����*b��8/�18��
*QVT��)��p�Og��џ��?��Q]�~��p{ux��p‹�~�~��[�|%��U��3�zgc�򷳣���ۣ���!�W��P�#T#4�p��+U����w��?�	�qc�t�uz	m^�_E�'oO�hkX�9�M�w4�E`�a��f0��^E�Ws��{���F,jV-�sT�bl�p���$�0/"��?��'A�8��=��L҆/�L�¾��i���A
�o6�q������pݜ�'U��C�qC&�&A2���Z�&�����ٳ�{�Cy��!ш���L���\�Z����HZɮ���^_���$c�8�36�3�@� �ؕ5k^mp�
st�ĩf�P=���t$}?��B�4WyC������k�^�	6Hx��h��@H�	)]$	ۣ�f5)�������X���	�|X�A(V�z��y���2��B���"�����Q��&l����9Z��B]�q:IF{F����\j���`E�A�.��4��
�Ҍ��UD�C��rYQ�����z�U�T��+�n�Wm��e:�-�&̾�6�{]�Ѐ���$�P��"E�$7��QD�Ts��1�]�(�5�D����{�?�]]�
��^�|��1-\�ۿ����=��j3��G�����=�T��/�P�K(~��'��W���@�L��w�(8����P�#a�����
��^��ˑ��0Ȱ.�k6��#͜~y,�Q��w9��x�%Q�/�%��x�#Q��x�B��*C��e����g/��D���p9���K"�e�"%_BC�{JdxJdz�ɉ�}��p�a�G{�y��x�D�y+��
�eO�������f���0/{����l�7��w�9=�W��J���'Dx�ԣfֺ��������h�d��S��t��p&E
��_q��(<㊂�=ĴwMS�����c��1�yL{��(L׊N�m]wXli���р=��n��f��u�jr���і՞�,��D�)�F�
8rI	ki�#p3���!ɹ4�Đ3@K�/'�Ԇ���
0���0a���<��eI&�I[~�T2t�$�WTݷ��.���P�ў��H�٦��%[P2��q�X���@�H��)vt���;�x��5��Y^�Pcj�u��Z�cͫ��V�IAmK=-�3�����4�Ewɣ�mZ�0�f��Y^�UJX<D��gs@5a���noO&8`�x�n�N7�+:��脑W�����PYUk��,TT"4�AL+@�",W��V�}@���D?"��Y��\�Yk!�8-ʯ��G\�nR�Ϩ�/�
v�XG��5�x.A����l4��S�H�L�=ן�[�:�����Q@���\'�	������V!R�J��h���%�q�I��i:M���*P���8���g��<Mbhm�ٳ��ͭ�%�/�nu�d��?�λݷ�AKW���^������8�%��cڪ����+!��P��j�:@յ"��jvl�A+�y1LM(%�`��P?�APf'E��9�|�TV0Su\� .V߀�h����4�:�ⵉ���&'���A�^+hk��a�~�a;��v_R�r��bN���\=�h��boo�(7������i6�^��'mqh�W�$�Pϊ|��e3_��2LK��D����٭�\0�l��
?5�h<۶�s��q�Xy$�Yo��d#["��H��j�ZN��[��J��<��-m;h��Zڣ�-c!C����~)]�j��h�^�RΩY��$����y2N9_��۾�S��Ȟ1�#�
����E}���z�[r>]x��J�����޷��:�KTDdt��L�5xW46LLJ�Hh�&‘�:'v񔌼=1a)�;ٴ���_D��L'� <�Em��4=��B>���vOĝ83S�0N�����#6��0���W��,/S�E���	�J������p4�+�<���%ʠ
����{�����jȰX�-�U�N	�Ǩ��ś<��*'����Έ�e'|�m�pz�;�Y:y���2�闘
r/,������!j��d �洚��Z�qwI�m�~7tF���#��'�E��@k9�
�W�ec=�Y��H��2����@��A�����3P$�p��b��
~t`+�	�����r�Fe@�L(K3�Ъ�#��� ��o�x���[>U��t��W�G/ã,d&`.aS�0�bO^?���]d��!S�QN�}��5�7��Ms[H#������@����mڰ��5]�gЂ+(i��f[/�$�!�q�s���-��	h�u�xS��…‰��jv�O=cq
v�_��5��q����d�����`���@Oa8�9ih�Ω#��_�k�Rs{���;��s���)g�G���UQ>��oeu_�)�"Zf�\�ӣQ�je>��@�f/l�\ڸ�Z�ެB�_�]�	�XH�bB<��#3����jt>�k@p6��駤aak�vEIK���B��!٨��"k�I�>_D.��:.�sfM�W���pތ���4��.���>'�W[g��.��cj�L:X�|Sp��[$�༄�<:��ؠ/��umF����?�+~����^�F�B�_�-n���M@�M��ɻ��ãh��g�{�m'e�=:��4�V�(CA'5�O�g�W	-��w��N �7���h��T%+�����R2�]�F`6!B�yϑ�b���Da�og�8\�)����|U6�%���p�}Ԩ�i��|�ژK|3���C�ϫ|���ו���r�������iWt��?L���Fǵ�7��S"�y6���i!�AtMH�1��!K����i]��"���𠿷��m����8gqu�'��-��܀�`W<���j�MϵJ��
ߜ	+Z�QRZj���U���=F�
�6l�ϵ��<�5�7��Zo��+�*�����n�	�����hD[s=g
�g~X��
�*��#1�Uu�"X֓+n�{�1�	CB�=a"d��.�	��s[���s����EU��B�G�2��-�ޖ3���K�V��*�H��8���n�����������>��KF�_�;���.�8��	�wtA���ҵ�S��&.U5�X����n��CC�~쑣�|�������6��6��+�����ߕ������u��p!�~A��Lp,Aw�(�n��εb� ���F!KG�'uV�2�X(���g���m��
��[�s-
[����ap�X����s5�N���pL2�ձ�G�¶}�Yg<�B0�t��?B��r�h{�>
0��)?دv~76n���e�Z�6�]�j6S����+x��K*���
$j�H�kT0�����_�KO��w��?��e��,pQS	���]&�S_���;5�GN�W@��6�������>QIU�b���|?�7ɹ��i�g��ecv1x�[6����ȥ]�
y���솃���z���)�$�٥��ܥO����_��)��=��ew$��><.y������D>�A�maX���bu1yH��*�Ǻ�p��M��6#�{�B Cw<t*�˳B��ƌ�V����,b6���J%ϖP���/�	�֢:t=߲���2�>�14M���
	ur��Mh������c~T��,�F�f�e3H��G�G�TN#�w�#D"�H�I�)K��+�4�.��c�V���J��{��P��	u�ث��4�-h��!%��7ssW�e��5��;�Nش"W������l*��>�m��Y2�bJtk�T�ǽ��Yw���=�4����%~w�1�l����V�a��TO}����,�O�b`�	h�d(�����Y����E��ƙ:h'Q����	s��Z5^�e���-U�S�D���i%�Y�&�(��^��\�E[���m���i��̨8#�1S��w%q��<�*?b�v���(�(���;t�.i6��8�m�i&�9FǪ����w�ۄ$:5��t�g���M�=��O��h��l�'��T�����.�	pQ��M(�����‚��QFY��k��Y�<�D��jVU�V�(�C�[�f���e��i�n�w��;L`J��[\D���I]�A�i�/�Y�L\Ӓ�N�iB���j_��*E�`�(D��Uޥ3WP�=�v������?��e%�P`����n�b/���j��������\%���L)+Lݼq�w���M�2�ID����y�Qx<s�;Ƽ��sO�G$���*P��PI���O��+zr��S��]�����έ �X�<��Z>̳Oh� �(�M���xU��g<��[�$�E���c9C"#p�:e��L���~���`���	ܔn��C!��ѣy\Yd�y��s�O���L,�$1��ⷜ����Q^<I�"��L��w��}[�<|��YD:;|-.F��7��b��!E�p�ąLe�
��P����R��c4�;��x���tI|��!'�$C� �vW�:p�A�=&"�[h�<���^~I�}
��@�t�Xr�Y�NwX?)�O𒆦���O��Ǥ�2:�0�Z��h�0�I\��k�L]�Ex�>.F�"����hDg�(횢��KJ�7�L7=��s�D+1}��M�xCȼ�5$ũ5[b���3�}@K�T�	��D��+]VF�&Po����'��wy%�.����W;*Q�����4��aW�����ε�C$������k[�[lֿ�C݋��
����Kvuq�.9����R�v�3>"�(�<�}H7�Ή�����N��;��c�=8�x��~5�;G��)�)2'(�4E���^hab�(�G7)O��ɦ��P�=�Nr,0�GR�W�][r�˟?������J�g��%�V��5U��Ou�����{�vE�=
%o�Z�2�{��Gؓ�������W���(U��}�����NfvJ�[�{��ɞ>�#:c�f�k������^K���b��e,X:�(�v^>�`w+A��BI����^-pϿ�����*�DGw��>�>:��G@)y�׸���i�fK�l/$Q��D�N:Č�?���q-���A�6��K��݇m��'�4X���QZ���B�������~1����x��B.���%��'�����g�]���'k͛�[���n}~��'���<w}�݄�[O9��K9��I�\
ǫI�['
?�~mJ��%�������!{N_��f�׈J�6��8s���n~�?O�@�8��%���b�:ɪ�<=~c>�2i#x�=�[K�/t{&�%Y��V����-�P�U��I\��;��
�(��iE~[\”8���Xjl��+�ǃ-�q���i���7n���u��]z[�eV�_Cf)�d�=#����2Rxk�@_Y_I{(�{FN�D�6�v�ή��h��9��m����+i�0����6�–�E���(�[C���ر>~]ֆw�?��Q�ق'�W�=^��S16�s��CgH��k��ы�����M�:d?.D�b=d/"�]٫�ȶ^��m��B����6;
�S���oE�ڻu�ԍ��=��a̫DV4��T5<�)����K�.ƌ`m��U�'5Jl�C��m.Fl��fVb��_��@L�;�4�����?�6�#Y\����lP�~K�%/3�譣zZ���ӠT�O���']�ҡe��8�+;��O�B^e��z�����J/�-v�ID�rz�[
��*��q`A�*~��{�94!�7f�pb>��v�x�W6Y���Q�8Xw*�n�]���W����D߽����
�?Ƽ|$�����!Y���
�NB�e��{d�(��Ӎa�9�,oK!�|f
�NvH0�
��|��.����2?l�_�)�����W�������&����K8�DSϯ��F�‘�8e^�z�r)�cꄆ�ɏ5V�1jc�Ub��Xb��6vX%f��V��u+�xُ��qڪú*�]/���ƒ�u�^��Nd����1���qG��']i� 	u]u_}[��𺋷��Z����ޖG������X�߷��|�.�wV�1/���.�ݯ)䣯+��eB���h-����e�Ok/��w��#��]�}�/�j���Ѩ�ɇt�3V�i��r3P�}Wu��#V��
��!.��_���j�te�_��s0�<p1�����z{��NwK���̫���[�,>s�����t޺��?�ۇ���\�+Ҭ�+�}��]��"Ý�'��/��K�]�~���O�D�i��jsٜ�;ze�2g������t�e%uL�A�ŽU}@3/�m"�c�X�%P����w?G�������t��ig��A�j��;�)�1vzX���PKE��TF�cf�"pip/_vendor/packaging/__about__.pyM��j�0��y
��[���.��=�t�2Fp�s�`˃��l�ݜC���~I��{GZ��l�� �Fe��4���-�6^�Q��0�-��%��l���jb��qw�)���e�=�/UdFk�r{m��}�V�u?Hd�Y��E�U�����>3�O^UL,����X�Œ)r����d;E�q�MJ��5SpN�j=���G��]�x��ַ8�:�Y�*|�j��$1��;�ހ�I�6H���1��,�ĝ;~.�0�L
dIWA�Y7�^p���
ٵ-�m�j���k����������Gu�o!�o|�Yn�p�w3�(K�W�Tɘ���v�_w0�9���d�PKE��T�����!pip/_vendor/packaging/__init__.pyM��j�0E��
1�i!�2�.��Ea�&C7�7Q�Y.���:�7��W�G�6@oB�]4�mq�A;d�A�}�x�L��e��9X�N�Cf���s���� fxy{9�7�u���.`�(X!��_O-�ɡ t(ƺP+�3y��6�Ek�~"�S�^�Qb��U�4�l)}�*rM\@���+�����J��.Y�#|�a�|�6�����=�b��(`�Q�M���PKE��T*:c��,#pip/_vendor/packaging/_manylinux.py�Z�s�������`
A�^�5qRY�lMeɵ�U�9G�*���%&���Ҳ���r�������2ɳ�ba�"�d��#�o��4��,nod�B4�ʪ�ê�Z�$w�He�(G�"KX��q�̳�K��$��cg�(x�����y,<v�� <���1�����j��,�D�Ҭby�}��`y̫yV$L�����C�z>��i�O��Z�*/�K+9��R0^�KY��u!X6W��:%ᙸa]�Y,���Y"X�KQz���XE'Hd
��E��'2�q�b���#�B��i�tۀ
N�����,Y����X
�`�2��=v�����_�>9?e��?
c^�,��S���X�#������<���'oe."��Xl��I{Ā�Q��n�ũ��K�O�3��y,#k?�g��(�b�����8�zP��X�4o�K���i�[+�h�7G�Ύ��o^��c/��������ACq|~tu���gS��n�4�~:z�s~��O��Q�ݛ`��.w�˫��z�>?z��{����Ӂ!9%����ٛ���)�OO'�3x�|�n_L�7��_�^��I��gd�.s2�U����R�!b�z��Dy3f[?��,�MhQ��<�u�IuHA��dZuD�}C���$��O.������R�&��x���ec3����c��߀�Y�I�=l�>y�o|A^�.Z�e)a�ovV�{!����zr3j��N}��$|!CHlDu~8s:>r���O/�ݡ��W�[���D{��d���(���x&�<f�8��G�j�1�*ҡ�Mw�6!����Q%����Z�Y�g�1� �
�9��`{����,�����Yy/^��ޘ����ΐ�T�ξ����_��=�����I���}�ǯ)�]#�P��#��~��5$� }�E��(!t�Z�����e6�?��|$�<��1�-)�?��Gy4mZ'��+��g�h�(it��t4Rt!��踪6 ���7:�X��NVK��"u��4z�)fΘ��3S���7p��๗W
R�g��Ǥ�3Ս@��w�	��A�ALX3�E��k=���P���<΀��L��S6
���:`K���FԆ����ZV�ǡea�C?̒m��@;{ۋm�!�G�Ѻ
�T$�=*k5�rd
�*�`׭Z�3�g]��/�v�&��˛��6	ً�s۳Yt�k-��Z6�`c�?`���ҎJ��y�<xv0t��z���n�?��#�T�7�.u�]3Щz�G������4vִ��:�V��Z��ؗX-%��ܫ��A>�tS��%�D�v�|R��9[�r2����%O�eU���;+�)��K�W���4�C���FI6���}GN��i�u��e)j�f�T�bYV��x7�J|�R��ylQ#�u�,�b)���'��
��C�(�D
�d�r��
C�W!���2
���yX�j��9J��sx�P[ER�xx�U��D-a��G|�}����q�����ݡ��
�e덋|��gk7��,��j��:�����n�c
�2�!1֗�}�g2b��'�M�:(ոc�s3vx[����S,D��d�7lY]�߬�
�b�����ů��^9��4s�
ܬ�����e�t~�ϰI���豼��p����"�����RYSM��	̶X�Nu	�D(��P&���fY���f�dQ�naP\0v=S55W����;���<�O��dw6ߛO��I�
�m7<�|��|�t�|�lw���:�W���������` �P3�&M0GG�?}�t���Q^|�}�'�j�A�n�@�	<ցv��/�XV��ÎgvT�vVW
&kq��1���1{�9���#��9���s�T�9�}�>��Μ���Q���A݋g@�_:�-N������+�L=8�;�c�6;#�\�?�\!�T�<���,���p~>F�L#B�*���Q��
,O|�$�\P��rJ��X��"tZ!�;��ʿK�rCx�.
�8&��)(����i"���]V�R�˅�>ו�G�*6��h�2�w�o�f�?Kj�n��*c�"�H�4�kQ���n��J�GlG����ݑ����}��'R����Bȅ�.Q��*U{��ƪ�1�#(n��g��"&��.{�ʣQ?�˪Ɏ��Q�Dٯ0�3|�E��5�h�NZ��IS�U4)���_�_H�6/<,���Z��G� XLy�,�P��/.��J�U#uU`�0��j��J��C]�1��N��UX"8��]�d�&"j��K��A��D�W�z@�
��K���z��X?P͡R��"����l���������p���j�̲X�J�\���[�x��1�qh�~�Ae�������I���g
܎���঵>9�E���j�AT�d���B��a���d/Q�V-�W�T�8!�P�=�����N{����G��:��D��P}��
�P�yg��qA�.z�Ge�lҜE�m���4}�P#8=\��(�M����{�A �=�[b`���ZC�Fb��b!�sF�A��E�V 1�D��HE��,CJH���3�<���[Ÿ�i()1>רT���-��5�n�� ��*\�h�C�Ҵ0m�g.�է���Ȁn��s�G����W�!�3�ڙL������J@?˭�g�l�@�=$Ą�q���[��z����/������x}/�=?�
���i��t����}��Y��fiG<0m�H_��96�ȪC�M�o��xջ:�d"��e鞍�ihk��w���_Y��������m���m_�qQ!�y�������{��>ۍ�ğ����hV�����j�ۓ�l��/�I;�.��k������`�Q�J-F3AZlȺ�>����e��)J�RV2ʑ�u��xt�F!V�	<�H�.�~���Z4b/y	TP�7��{O��5J63�n��iMc���M����6����p�h��xZr2��i���a�v<��;�0���2mRD�0 6J6�ѐ;'��t����W
���	��&`�֣Qp~�������/�g��ooᖿ71�}yŞ��m����R���es���g39���&O�=&;C&�!��>�}�c���طXL���� �&���t��aFS���1UQ���q��K����#�Hjy����s�+(��+�j�����O!��RM�ʲ �#���9�u`���^55����)��mz���!Y�@���Y�=-zۂf�m
���T�B}3��`����]��͌w-Ȏ6���[��r8�+�߅HF�_u���o�v���\��B�(�;{�ּग़]�v`
�eR'6�)��T�R�2�Ih]�ueZ�4KiZ`M�5�[�oF�]Jֲ�Ah#�k�5�I�k�j�����I=p��F�����n1
�5z��^�p1�;{_����
8G����^�}��In���g�G� �Ͷ��};�b��XCj���o$�-EF��F�k�͎0$�I/†2�:8�z�Z�wP��;�uF�	��otf��⃄J?S��������Y��K��3��=[����YI���^!��э;�9|����fy1�o�b]��Uw��=�V�C�m�����z�@�m�k����u�u<��/j�c9�PKE��T�t10#pip/_vendor/packaging/_musllinux.py�W[s�6~ׯ8�<,��p��N�Y��v�5�&�Ƴ/���HPšYL�f��{��/mg9��p�߹ ����k�8��6M�-�Ln��@U�m)@VM)*������l
��"� �[Y�5�{ЭRRm�zo��i&�T�"��RUk�)p�×-���Yh#�ih���$���Ţ.��ʊ�-�[)Z�ٺ.M�P7Bs[��aG���X�f��ծ]g�N�������2 ,/>Laa=�)���oZt�>4u�h�[�L&�( Ղ�i����q1C��
��BQ�)����=�R*;��j6|���VAY���H���8�a'�ef䯂��$�7\��yJnMɜT��H'��}��dt��>�.$����q:�=k��;W�D�Z�.�x��1zP�l�m��x#�ei��euu\���8?9�=o��_go/�����3.��(�w�.z[4Z螡�iDfª�u�r�"���m=��<{y�mϘ��lk�����q�Jܗ�{�zd�8���8N!:��!�b����Z׺�B��V­a�8����
�2Kq�����M�F��,�g^�*�	6U[2�=�5�����"J�p��O���Bb
#��϶R	�~!�B�FNx"uX}W�
���5`�l4�B@��l��Al�:+��Q�C����K�z��.
#�����מ�Sk�%N=3����>='3��>WWW�m|�_�g�p���P�קGkiو���?~��StO�>��y��8S[�0��VC��[�/ �4��mҍ v5�I+*\��,N|�^�;r�#��+zߓ�$���UQ�;��[�-:~J�V��#���j�'��E��
��D�As�q'�%"�'
 ���@-�dr89�Ȼ�!�:4����cc�����Z�U�`�{��]r��l��I�o.�s=��+�xhs�w��0��
���α����$5�Mݾ���^�����[�A���<<:�d%7ҟQ�}u����Z��������0�B����6�u��PT�c����a��He�U�Hүy��4���&N�ZuU�*v;	�
N	���ժ+�ޟσ�RF�e1��:
�B|��Ln����⹞��N0ŧz�k���yu�^�+��u��'T��wG˧~Z��a�b�n���̍���>��BЏ����p�VV�Ar#'��h(M�Rvߍ��e!q��+��+^�DJC&�T�kE���>�FeM=�:��+��Sʱ"Ԩ
�E1����M��h��m���+a�$���b6����U���Ezq��f��v�N�?�C�ɉM2_p�L��r'�'KCcܠ��:{�JPw�	J�4p���Î}P��Dž�ç�?W�5�����y���N�w�H��e�����=�]/�/��*I�e���j�݊d�JO���<�n�nJn	Z��s�m�|���_BѲp�w+-F�j�k����
� #��5��{Y��Ȉw��kE���h����K����g�Þ��ww�ww3ox>�#�c9o+���됍����d�r�)�ɮ������4�|3�҈��G
�3vA/l.b��G%7Y���4h��u�p�!�r�K��>qo}8�&Wg�i����N�0��@���kOC��[����/�^�'���~"Ma��'M+T-M#gE����34�9���n��]ȍ�<ňҨ[e�.p�wF^hN����RG>�tň\��g�jj4�̰��o2� �h��5����P�<�0�8ԑ��)���;��hzO�����QDW��6�A4�$d�*���~PKE��T0��`�$pip/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PKE��Tm��?{
'! pip/_vendor/packaging/markers.py�Ymo�8��_��"!����b#.�v��`�I�0V�cmeQKQIsi��_$R��^q�K��pf8>3zI��yM6y���Z�"�XY�5i�5Dn�L�j�7�e^�~N4YLn��s^N^����1��Z������$�15xr�aqv�0�jLp.�l�@��׹���m� �U�����yQ'�I�����	
��{m���J������l��P��-1���!&hQ�O��k��T��y%�$Z�亩p�c�&j)U^%�+�\$�CE��NhH�KR�蔜�}�˄��o\�S����?o*�x��c��&'z���ŗ�����KV7����
�l}%��G��?�\0�^��E�v_�$2�Dƌ��X�or�>��qyG�|}e'b�>N&i
�JS2#K%40ԧT|f"�+!h6y��`��k^��].x�c�<�;f�}A@K��u�0��L�;�"v�K�0F3W1��yd���uM<%�Z4l!�T/�w^B8*J�S��ve��Ĥ��G��7�"t���������ۤ�c�q�w-��]�M�d�
���%w(��d�Y]@X7�ڵ\>�C���(BJ��-
f~bh��[�[��	h^�kf�����P�3�fzQP��i^�2MÚ�X8�C�W4�*��$�.�iʉ#�݈Q���q
&Q�X�	�\nH9�d�G��=M�)i
O�4}
���A�.��B�䰫�f�Ӽf`�<������mi�u����ۢ�K�-��`�J���ࠕw^�T��_�ߟ,`_C�� �.Q�R��`�H�E
����An���p){�p�<A��@j{n�
Fk6:���J8��sp-�9�fD Ц���$^'zo"HR�����=AI'h��N'�ϓ�6>O�g�ƙ��BF�Y��l*		�&���C'�}��v�!S��7?9�_-� �uv�Κ�֕��5%�����d}Z�.�֎�i��r�SX9?���|� �<ù���OkJ�:��.M�&�L�r�nb�Ep�o�W��g�����f3ؠ���>�k��ڧ��:����8�_���L�qw=E�WV^Z|��e �9mH����#&,��������mgb��˽???Q������\�.�h�͢_��\Ku|�82�=C��tn;�X/#��[JK�ȭ�'��řV:�Q�`uF�Kg*��z�^�=1����s4�5�1�,ت�D�X�	>:"��C7��ٞ�V/X�Ѓ�Z�
�g"c)��������Xz�^�K�>���5�W}w���lIZf�
��� ܲ�Q-�H�U9V_F�J#��f�š�)��T#d}���5J�a�*��b�$����M.ju�t��Tp�{-�u�A	���v���b�N��:��`�����wT���;��,bP�~fd�D�V�~�g[,|�6kR��	�6��L���%�\"���(��Kœ@��qrX���%���yeĩz��]��iJu�H�5'0�9�{H�D�a%�MM���_�H�މ���ݺo�rQK�z�J3�ٌ��&T6w]iià�H�nv�dO�NT^����/���7
���x�ql�lL��#��	�?y^�j��ɏ�!��p$
��J;j�V�r�txy`�*�*5��@ �`�B���@^u0'�[���b�Cl��Tؚ���&���Y��(�I!���6	��a��~�
����7|�{�q�IM
;pGX���
��,c��������N}Y���v;�n��]R�V&�����&��
��]�5����A��A�����f��
e��E��!�(����Xob�uf�#�^�'L5��>bBx�9	���\(�1
{zq��զ]d֑�կ7�^O�tܠ֗�n3���������mnS��Rb�)4���LGP�ו���D6�#.��4Om�[>��A+���i|t��d�����<��g���-b)ˬ���ݷ\�VZ��t{�MTu����~�s)t:._�Y%��X��y��<r����j�S��u/ؤ���-�zŒ�����=F
۠�3�YX2�jx��-F����U�j߳'&��7���K��PeKU��˞U��N���Y͖+�<��!�E"�3�X������d`��$��+�رǂ^f�S����5��rH�����S&�S��E�\��y���~*�+l�R�/@0$!Z8��5g�З.Q�lscD^^1_p��#��P��S��)�6�!t��W�msS
;sXf
�p�U���t��7����Z7h�Cg�A�8t�ș4n�����0Bo����7=B�\��Sw��;S>�H��a��+��,=߹��i�%t��$Ս�h9�i�
�:sS�6�4�SM�g��� l1k���<Ĉ����y0s�ܺS��1�2���5���g�~E����Ik��6��\kΣ~�a���@����%K
��)ѿ���
$����W�y���2��_`,40{�A�]�9
��y�(��H��l�]��Z%�QP?�Z�Wު�[�18z��_�E���/�I��[�M��U=p�B��|�w��)?������+��}�k������ã��I����d�J��u⺩}6��E��^\,�����N�j���"�� �ы�xLp4�/PKE��Tn�AZ�D%pip/_vendor/packaging/requirements.py�W�r�6}�W �ɱ�I:�LF��02�j��+ɹT�p`��R�@�]����@J��z,��,vdv�
�L3F�lhF�t�r���Ɖ�fD2��X�A���
�X�|d\�E��_�gB�D����V2�2�'�^4�F��\��p�.D*~�e�ɢX�3&I��i&�IW�K�V_B�4��F�e�e��\0gɋ�wk��r}�
�!㵄�p�
2�*�i����˓��;�fax����N�_�X]�9�� [w`fjt=:SvE��g�܄]�[�����ḃ/��^����[���fҸ�=�J�e��KO���*���C4���g��RP��"]���]��ݴ�A{>5i�"�B�~��fi2a�7)g+�K�#�6,��~W[麮�sĀ�a����-D_�l��E\�L�,U<�,:#�>{�`��~G�Cr���4�?R���	����N�އh�mϝ�~ 6�5gBx�3i,^4g�$�%���Z�K��p��Nse
���`\�{�\
K#�4����Qov�z���}���O�Ѭ���zt�Ś���ۆ�g!� ������p�9���k��a�(Fض]�ܜ��>�&ac�q�'}��K�qw��\����"c�d���A%�0�����5�1��R��^}�G���,4�~u�Ў[Ʃ���h2=1��ŋg��u�1W1��� 
 �v�$�S
��G�I���_
��a�K
Ժc�����-3����Zz��XG�/����LK��oE�O�U:F#�'�(2�<~G3$]�sz�t�j��,�AsM�W^�-��
Ǡ�}�l/����N��B�y]]&��A�]"���N�	��ҒVJ���·��/����f%�=ʬUχ2����Zh+҇��fR�'��R��A
 ��z�f�
�hgce\�~�EL�Hٕc�e8:��M
��{f�mnnP�{��� ��$��?�����Ye��{�p����h�*���Ux���hF�@��
g4!�.ћl�^�S����Mui'� 7X,H*	�W�gw�dh�F�?{ae�s�<�v~�b�,�VE���
B����2�r���iTW�l��.A�R"��fq�z��1���F���3I1 �
��ؓ"��K�dwOѾ�X��[=�U������q��h�8�L��f�9h\��0�~0G��&U�M�OJ0��/�\7��I�k*Oȩ�(`A+�W@Rw��"!FO�@Ӎ�64ݰL�xj�i�O�'�zYlL�v��s07*RL[��m����K–$�U`ű'X����Ɔˮ��'O_�Q�3�b~������H����n��V�`-
*0�5�
)�[�e�1$ ν��ڜY�@3�G�����v�=V��ᰁ�;�Pq("59��z\K�K=�.�邦$�1�]�cB�����7�o�5x#�P����;nw�ȷ�7�������~3��q���)V��i0�`B�Ǘ�k�
Fk6g��؏�Z1(��u�Q���G������[��]�w�!pAj"�Q�n��w��6�K�p2ٯ��"곎�21R�^��_���z��o��I��xJ�jl
5|-ڂ0)��4��f���ik�wV��?e�щ�-1�Dt�ù�{^߯ǾQ6O
bU1�x�%q�	.F�
T'�	�4Y�Y{}�}%%�]�� �m�])�vl	~
�xMaҾ$a[��Wr�p� ʣ�	��K���okˀW�F�F�Lnx�Rk��}��9[?~����}���C���PKE��T5����u#pip/_vendor/packaging/specifiers.py�=�s�Ʊ��@�Θ�i<ۯ�<=S��͸v&v�y#�,�(D��h�r���w��Á"�I�h&������v�V�ћˬ�.�\E�*ɣ<KUQ�y�*檊�K5�����><]&)��Gߩ�����0z?GI1�a_��ڌ���J���Ϟ�|�\OXг�,�
TjY�YSV�wQVQZ^/sըh��$��� �^�U%��z�*Ҧ,��<�c�A��o�*�bQ\T�u�l��!��
"�y��y2�՘>}��
�v
@���	�O/�Z�z�l�I�IW��J�y�Z0o6K�]�����W��F.^5�b�\�e��I����7��<N2#_�E�n��
Gˤ���7���~Mx�3;�y���o�r���n���I/�ѿ
�7�q4+��&�,��	��Lf�a��9+�)P���yR��iq���^�4��T5�.�W�yU��蘈=�O�n<8��h��
�l�j�'�/�U>>�@�(�o���c�L�UR�v�k�Zz>v��~���@#�'|���$m`�e9��suM��x:�*�ENp���D�Uͪ*j%�T�ZM�|hˢ�}��r��J���߂�k�)ȍ2����D,v�aM�I})��E%���ޑ:ز�}�Q�Ԩ��VWk@�2�]���-�P��/���i�u�l���R��'h߻V��J�fc�SW
ШU����3�����x�(�e�/a��!�_��0��>�|c�^ �
�a/�c��c�,-�eY�0��K~ܷ�OZ�pd�A�1��X����	Pb��;8�k��6+`����9�J�a1��R�P|�B��tÖ f=d뎭�;s5��.%���>(a
�I�p�j \~M��L*�:�K�D�o�e�^Z`��w�������u��g7�I��w>�vzsZj��A�X
���GS��zl|�3��BAeE�X��������\�
�uҤ��5)o�d2���!�ف�w(P4�}�$�U׺^N}z��>������r����h�xQ���p`:�08[G��!
��F����l��h����Z6��ޚ�7�9N�)ڊ^��thp���M&�|Q}8o��u��ҬP���n
�ԩ�@Ox�锄`:�ߊ�ZM��^��&�8:�n�b��?|�`�a�G-����l�Ժ�4��1Tg���CP`!�z(�<:ɵl�^�8F�p�t ��z�nf5ؙ&)R5�Ѵ��+�M�q����n�o�{F_�F./�'�e�W��eٜ���\5��T��Goo	a��-tiM&�V�A�j�N6�_�B%��Ǎ5���!ǝ�@bZ�re���L�&f��چ�ry�Q
�����bAi���e[��q䟧p�Ω��0o�n�j>I�����GC�Լ�Y�9�����=��‘�>P�*�@z�i/��ܱ���zC��Zec�Ԁ���[�_��>�z�����Add�i�^02�\(�jp����Xr�g�\��K:ߨJD^�aB�8L�A��=!���U��/�%�%�PTM�j�@����u����d�xЊOa0�O	��= 6+@µ�z��HXJ����DkP󒔆��o��!��y�Q�U�*k��\d)�n`:��#�WG9D��Z�?�в\Ⱥ�9�k%i�4m����ü����t`�撂�k�&`ɳE�?�ܹ�A��X��|��V=�i�k���h'�d*��<O�6������y���U1`p��uG!g��7�J}t���5�B�D�N�7xN�s�R���`�S*r!̕8�
ptP�ʘIOb�������i,R��������B~\��GGGW�Q��;�N�.��>�p?���FPD5ҀpbPW*����5�2։9лBB�(��jF{Gd%������ �ΛD|�>�a�^����89N�KU̻.S�����}�s�-|Z��4�*���+}΃\�[����H�xH��Z�E!��:���rͱ�e$m΢��
��U�<X�+
+H���"���A4cF��8T���o���̒[g����K��	���-���������.-=�ct��:<ŮH�F��U6@Eџ)�*|~��cLN������'�����D��G�;�ٳ����]=:?�`K���I4�	�A+�m��,-�O�;�>Fܙ�W5��n�a���
��z��/n���^&)*7���AZ�eA_^'�������K�4/k�4pW����E�mU�(
9�BBC�dI�7�N4����44lS+�w���v�l�77\���d�%T���N���%�K��?�8���~����?����o�?{����u�n'�L�
(�1h)5����L;_=��rU�St"�Nh��Rh z�<q`8o�/�/?��AW`��Q���,a�Mv:�_\S4x��#O%��N��a	5%J�U�T�4��x/�z����K�B����Pa���^'���	g;E$�7z��(�w��=&�����,��eU�a2��6L���c�*�AB����Ϗ�{��I��G�ɞu5���	9?
�ÓO%��@�O���G�d+2�I;�U�K�o�Eq,
<�_����É��.��UC�J���B�߈,>Y�9
����P͟dպZM@jc�[��Ë�>2
z��8��&~^��ɭ�#��P������Ё�
��XM�l�ֵ�%�`�;�:M��ˣ{�'0u`󒆿O�Ƹ���c26�
@ԗt������!萋�Ȫ�N�ee��E��3���!��:��!��V�F�*A�ʇ�L���Sm^V�pO������~a��#L��j \juW5���7���:��m[� ���|J�	���?���q������k.頌?�E>���6(�ku�ַ;r��$��ǎ�s��]��L�#Zן#���3��s*�x��r��5�
 �8h�7^U��P�6�t��6�Z�P<�i�o�Lz|���b�T-KQ�a~x(��.�_GG4Z��!�HG�zߡyL���]l	fr;�Mo��6ɗ��A5�-�n2��g�HK�Rk�Vx=e�l]��@S�I���[@���G�Kw
�L��T��b+�y����`�8����r����T���P���[v�\)~\�CU����vɀ��Җ�	�;���Y��Æ�>!���Ɵ���w�#R��x��h��h��;���t�UMFeSƀh�d���
U%γE֘0v����j��^��U*Q�!	`��i�����[���HlP�巡w���
��[��H����;��i
-9l�^�(���F�3,9}~ü����R�^ߘlj_��Q�]�	��RǦ/��h$�T�ltR�/ح��M�I
�H��B`�a���Ő�7F��^Ud6;����=�a�ީ�w��w���/J���ޭ�Q��0�Ɩ`'�,k��ڸ!�?�ň�ᬖ�`�a��a�uMlJP�	���$9x?�̲�^�9���:��a=��-Y�A�'���Iw�����H��e���c� uҬp/ⱙ�ɳZ�.! tϭ�l>�F�19�|�f{���'x-u��l�ʵ�&�%1�je��)8����wrM!�/c�Z����€zu����^����L<��/3/g�gu3�����Eu��Yg���2\���q�����s�bO�saf�|3c4\F�
� �t��N>��AO}�S���8v�|�~����y��F{�^o�?�{���\Fs�<��5����+1и�c�	��M�Sf1*!)/|`���<�^V���oL�V�H�\��,y8�Ff�yX����z{�.Q�Eov$+����EN'J���ǘ:n֘�K��>��{P�������?>��ු+�klU��H:8���SR�WwX��%�',ۃ�����h*�ˣQg�Xߨ�ޥ��N�\��b�a���hi
b�F�+?T�ƒ)�B�f{�
�W�Hd�%��G�yΎ�a�;�s�ߠ�Y����B��U͡�@�룳���-�<xL/O����It��m"<���W��?�����&��v"1�/u���(;�ɠ�Ld��-�xU����n���ʼT\6�c���Ux���0s�؋�!�J�ϱ�꬘\`L/w�k��y9x1��pkN~���F��&9}*-l_^oLwH��g�_~u����na�2/_�������-2��Ç����	q��8�1eR�"�/(\bjW0O�y�ތ}Joa,>���޳�����o��'?��[-�Ƴ��#����k&�?�	I�a6�京����sL��;��N�\<��5�]��
!�Jm��� �F�ðI�M���	�� ����������@��D��ރ��N=޴2t�b����\�xc��u�K�v)�0�^��&Q�
kJ��ց���=��De��ߎw)�&�a��N�e�
a��Pŋ8z���#]�-��[�|���C>��n��C�j�!/���u�R�o]�����`���NɬwE;zj
�eCtIۉ�N�B�Pz�]G��v�����vw�u ��<�yZp]F��?�@��Ք�Ŀ��:�h��nvTUF�}t��Z��Z��z�Tae���ۢ���m����W���r	������Y�:��z�MK(t���Bg���9?�q�Ŷv匆���߃�b/]_���%nS!
�ϩ�.�x���P[
��ý��w��ltQ�ׁ5��jl�-�jjW��b��EAn��]�G����<��,��b�]�hz��@U�G�6t
"�Ygνk�Z�����s�e�JjT�i�F���`/g:f-��Et�q�1e�Ɣ�S�o�I�s?j���`���P��y��;�6��S3�spĻ��7�vn�I�ajėhg��<���пQ\�4�j妃�eM�K�* �=(-]t2M6�,��S��'��*�P(�Q��)�}{2�C�F�<6�#��[����-�����Y�C�R�*o���|�B�arz�1� �LazO9؛�Sܺ@lP�����fE��z(�ͻW���h�Τ7��6dq҂C�)r�K���p�<�a����R:b���Ҟ�?3��J�_twt��[2��������h�$F�_��"�}
�?�Ǝ���/�3;~Υt.��LC��l�\��I�8z�G���ј ��v
�>����\L��
��&>گ����{��G�Ҿ�Q9-jsr�āIp
21|�1x88��@*����Q����V� 4�Ƚ[��Hz�d��4�M
��	�;�j:���:�w)�k��wm�����s�`����'z�]u{wF��
j�h�掍dͤ��
�4�OF�b��࿬)o/Eȃ�I_i/�6]�jQ����x0"͌=����C��`���ZdU����!���x��1U�$H�;ꢒ�P8�ƞg�{I��T�T�7h������"�g�A��(�S�	���|	[F
����	���wQ�?�Mr�1�:��%�cF�;���&Ҏ�: �����\��~&:���ܘ��#��ŜN��N�?�]���>K�ı�m�1]=���Z
{��#y�sߎ�AN�;r��\�oW��{�14-r�B��6����^�U$��hI��5�%A��u"B����t�踲��n+�oAc���;0����uԾ��߭<�KO\�fе,x$:q�Y$[]p�̦�:����:ڨ�����*tH�P�}w�P�ПE�:=%O�gIpL��kT�ԣ����v<:���Ol�M�N��w8b]�s훵�:�J��[�)ya.Fn��ѺS��b�6K�#c{��h�R�w��`^�eI{�!]���m�ܨ݃^�d#�
���‰p�B�\�:�-�8����D�v���gd;4��kL10`~�J�f%�ӉZc0��O�M�uu$
���uw'�� t�M[�֠6�a<�F���c�]��c�w5��W��H��P#N_�{���)��0e���<�t���UN�Ox?�xi$��U�{8m�۞v�.�?W�׷��[&˂2Ǧ���Qf�(/�+ ��@S)��]�[zm��(�] �[% �qs4ф��s!����l�;X�D�ɢ����5 ���G\|�(Z�$�L��T4%��	����^��D�HfitY��E���N ̘��<�/��8m�1g�i�[�-��J6�ec�]EJ��)�4�wQѻz���gv����h�m@��8y	�#�Ul���fcn��6�CrjW���dS���6������?͂%|�M�*`��-��m�<�����+K)$�+K���WTN=����^�^ӁCC��4܎Ñ���U��T�(�m�$����:J��b�d�����z~��'z�
��5p:6֌l��\9�b1
�$�n��e�=D6���K��>#%�sT`BDԤ�2[&��*�S��B���E;��K��DU�"Ek���_�00��<�m����R���q�:N�+N���;�L^��LN4�̙���݌���J5C8ΊXmB&�ˑ?͓/��-���=�;`@��̟]>$��:(	'aw�Z��浶��2��E�
��o��y?�j�Vk����$�T2�0��EK���ݭ�͚CKߩ���n��2#��A����z_.1S��;CE��(��,Z���KX�E�.�m��'�]?+ ���l.3n���c�>��M%3�PKE��T�	ms�S=pip/_vendor/packaging/tags.py�;�oܸѿ�_A�(�
vۛ�R#N�$N�@.6�N��C�%�͜V҉��=�{g��D��G{�����1�=C�;��-E�|'u��T�<�<au��U��U�\I�/�f��b����f�o��"�&l;؜�(K����c��ᧃ�������=+�R�����U^��2/Y����W�%��D*��D����X�_\����iT�����ki]�y��e���z���`+/���	�wp�9<������Րj]�Tʟ0�� �jFW�W�s}{��Sn����'!5�aQעT��_j��z�I]��_2�R�q�c�ER`�	WQ�NEV��ຖ)]O&��߮aTp��O���,Z�0\G��2ϴ�r*��l�C���*|>c�rr�d�ǣ��3<���Ǔ�����;ĚSY�3g0��4���Wތ�
�W�q���-@\x33�qH�D�y�B����7@?��L&�b;|wpZ�9� �)~���.�fϟ��6��i$%;�.vFϣ�=�˒K�UJ͘B]����Ո]_r�����3YE�Iɢ��gR�=�]�ժ�PA���
�2���4`����j���Q�XG�ʜɺ@��$hh��0�i^�0��z!���@4|��0:�m�npN�L�O�p�LTa�K�.I��#y}e����߲�y���16@�u��5h��>GޛY�\� 7��qX
.���Wh�8	L�)_� �D���)���]�4e��*J���88V��W�Q�$���T2QI�5H������W�⠄�TA��U�F�(/����+���U'c2��=MĊ�#�`�?KR/�?�C�%��z�"�Bi�����ч֕���Ȋ2Oj�P).2�0;x˂�.hNe�_�B�<Z�.�+�AG:�q�~�~Of��gqN�J���֍FZ�	#i��*��ˬ�oca��`�1��Ǡi’ec����r��V~����:���%�,��(@w�7�i�}Դ����W2Q�y2�R�;c|[n��u;%5�G3�Eעb{�{GJy�|�=|����6xi��!�o��n��+��i;rj�^��Vp0bDpi���$��n{���o��5׆w�=Ƙ��xC8��_حH��[�3!͌J�Cp
>�o=s���Spc���@ѯ F%�|\�k�^�3p�sH2�N�_98�%!D7
p2��R��\���R�_j��/�Xh�\Jq.(ؑo5Q��Jz�wA䕚*�8����:X���d���}o�!�ӶBAd���,��=�+F�c���C�nhb�DI�s}LJ��l0N�
�v����T+E�_���**}�t���l�\p�#���N��Fv�6*z�9u0�]Kb��A����fl��r� ��뙼��0��r�g��S��1����w�:Ί,��\)d7H��,6U�9���_9Z8(���Z�i�иz����c�fR޴}2�O� �E n.}���W*��aNމF�?��WP� O�D��5�JT������#�x���])+�LX@E�8��kQz�)�:�N�[��rV��ow�����f�:���G�<��X+a�5�E�V�)hgǴ\S
� ��E:�J-���L�s��`�H��B}��}6�n�3�
�᲎�K�Ҭ��,4P]����w_��+�f��/㼆ԋR��� �Y���C�WQj���`?��1(�s.�g�X�l6o*b�V��D%�P�'���k V��
�
��&�B5а�UUȝ/.`��y�^@��(D�BHYs�b�x�ؠkx��6�n���W�n�S"��$(։��8Pzk'bq�[��c�N��fjyW#/�rK�ސ����i*K�=��tp�}x��>}:|��զ��T��\�oM�<[��E'tԙ��\V��*��������(��hv�Kb|/H9`�,t}��#�͛�͏����{ƞj�n�
��-��C�y-R(��fQuq�G	�;��:X~��0(����,�}y<��6�)�p;��=xs�%�ҋ�[-�;m���!(Z�mΚK{�-�����xw����Q�\ڽ2~����!z�\̈���цAE�
�^�����N׍V�ku�pl��g
,H�#W�B6�����~��M(`�V�@���QYtz)u�潎�v_BE�H}�K�pLz�r��
,>�rގCb�~ ��C��ʸP�p�����u�I�<f��U�j���,]c+ K�-,Ȱ�YQ��nE
:>o�H�$Z�Jˁ�p
��9fh����v�gH�34:
��03-�)�M��E
0���Dɔ�3j"#�荰�֥�9��`qS]ew����kT�Ф"[�"L����{�%62J.L(�*;�Ex1���T�6������g�N��]
6���@����
$���@w@C�y�:�U�(4:���&̈�.��r�'��U~�}�������e����
�~�:����]����E�U��p���N����"�W4XLRHiC�_*ֶ��!V�|?>ѣ�=q)�
j��l
ЕQvѭ4N��n���|��v?�p��	���@ܱ�.��g3wA�i]�Ɉ��e�V����\��0��N��>Z�{LJॽ�兺*֯���
��6opv�خw��S�ħ�
o,�,����&�E	�6������dyWu��6��C�swb葵}��hg��>2v�S����%�Z��:��l�{&�9�����@sk�+�u|��������C�g�8��HN���ݬ�M��a��7�ˤ��e�`0
or	|F���E�3��9�)I�KXɕ�k�NO[���9yfO�U4�����~��M�:������k��zAj>��)�Jt�R��J4lgU�޿Y�=�C?��>��J}ʀ���Sm��>�Y���L57�cԺv���H%�f�Á�m(���W�M�˵pø߾���������`O�^�'�熆��h,��X<�[��J��Ů"�/e|���2\l���� N��[�v���az-�����&�UTVU��"� =�O쎍'�_y6��"��u��V�7��=�3cqQ����z4�~���j`/ϻy�*|��s�S�/��9c/�7�uQi�P�.�O=�j�rYF`W�m�LW�t� 6��T����@8+6�������e�btj�y^Wl�=�`GG�Hp|e^_\���`��CKy����)����39���}�f�����:�G{^0�[/*WJ�Z��vF�Pg���mo�F2�*23bR���Y�$f�U�i�C�k|��� �a+�2ġ�;yd�F��挅U�I��S*���WM�W<#�8�sc_����`Ֆ���ksXHak�~9�|2�����Wי��?�B��b`&�w9$
&�G%�:��W����j[W���uY�Q/�
��&⒧g��'�P�W��2�z�J���2mS�����iKݚ�:@����nS�ŭ��2P5�E�ͬl�v�Y��OF��1�}��N���#�A:@��Q	�A�SI�4�y�*8U��]��+�W�P�(v;�XG�u���;�Ej3�\�Vf��p�9�n�5,�b�2|��;��bK�u��&��MxK���o$���t�h�n��]g�3��]�n���5<�זcLz��P���ʠ�ȶ�d]Ql�Z�ԄJ�������
�H9��َ� �q��b���8�`�J�Y�ҟ��Gg-a�<��n�H�����6�V&gxs��p�p��D,�<mm��d�{�;��Bh&a�2kk*�O#�։��h�����/�+�����n4F3Ԙ���1"���Y����9*da���*�i��zh3��#.w�Ռ-l���m��72C�
�~C#�?eH.��k���ul�3�ct���H�t$����߳=R OƓ�4&��<V����@	A�pH�У�5�p��]�^KC,
>��r�=�I5�x���J�.�M�!<P1^}�*L��$���d�!��[�}��R��Bӿ�j��3���3��|�n͵����&۸\�o�	�@�x�Z�c�#��Nr�i�����Me�**���!*�Ef�K��nulʏQ4��u},=�c��5��;^N��,R\W��2>�Z�0����5l�6m��Țȑ�͡���i��Р>�f����{WdE�G-�:��2n�)�΅>Khm
�)�P-t������A2�-wOw뀢m�}ώY����ĺ���.�B
�(��=�!�X:�!�7���cʩi��V�i����"ϰW�C�
:��BAk�JNv���*��a�t�ҿ3�����G�(7��YXFn�X��aG�\�9G�Z�;g16gg;�Z�.ZxL�?��PKE��TA��3�hpip/_vendor/packaging/utils.py�W�n�F}�WL�"c�p\�@.`�p��IU�ɑ�	�ew��/�wf��)��KZ����\������=��r�b�1���P�Y!Tk
ra��)����j�>��B��$Ef��^�odb�@��g��N�/N��ž))Mm�"PXJ-�T�do!�r]�h24��u�yb]JeH�[(�s[�b	��wX\���7��%ExY��>fi��W��&Y�F�2YFP&J㜎��u�\#sZ\'��\�]���J�Y�������̹���B�F�f޹Tk2s��y�FRq���oB���<Ѻ�e�� �	>'y�'JIN<����
E]+��5,���J.��T�2��U��.���'��𷸵��E&���4k�D��gߓ%זe`Y��!�Ӥ��H-`s�K�!,��3�)P�t<�g�~H��r�P�#\q����Wdx]Qh�$Tߍ0+H KabonŸv[�f�a�}�Q�Dd��?[F���h��w����;`��}}�k��5L�w$��*���)�(�s�A�VM��Ta�=:�j�;�v�����幅m.�aX�&
Ҽ-�"Ol-�j<���|�V��@��
qA&Ty,R��l�6�-�.�u��c�I�k,L<�A,(QP5�T�C}��`�e�m��_��g���a�a+�7)��hd�p����5�Z�]!-�W!�`a����ֈx��h:��<�A'�LW
�R�|�����qR�Xd�¿�>��m\�s��;=;��Lp�������~�⃑�R�yz?x��ýʷ&>�_P��?��oR�nB�7<\h��a��Q�؝ne\*;��s�G��vHFz��6�9�G����}O��=^c.K�v���y^H���8�t��T��[��ٿ﫴n\'7�Z��^�jgм���j�Y��<K+���櫖~�Au�~J_g�I����)h�d��f��=�ޥ�9Rwt���nT;A蚏��(��}#���R��q�q:���,�+ԽG4m��0ÇM~N�Ӥ�
�"x����Q�����rQ7��95��F��\�z.�p�pXg���@�Voz0s��[��ZZ����	c�ib=�(�
Sc�5���ψt���:1�x�����,��^�p��JE,�����OB����~8���)��ˁ
��k�h7�j�^Ͷ�|���5e���l�E�w����ә�f����ϴ۰����9��:G��J8L�bJ�M�	m�A/�x�dU��0��y�����ml�5�F8�~�����8�Ō�]9���j�Ю�8����]GKl����K�ޅ���>��g�G�މ�6��l��^��x���~5�d�:�_��&����=E]{�!Q�V�]	���$tt�s�t�>�ʂ~��.FΌ��������Y�~2+���Q,�Vi.n�j��D&�>�oR|��a��N����<qB�PK�mWd�Y���8 pip/_vendor/packaging/version.py�[ms�6��_��7��yvڻk5��4�u<�s<q.���T��d�ɒ�m%��gE��lO2��i2�H�.�}�#�]D��E���.e,�(TI��b�LU.�%J�/
���E&C|��`�^�E�&��4��L짳W&gJ����/�NΎ̄	��ӴԴ�A�����4_��,�E�.�X�JLU)��z�h��y��8Va���*�e��Ջ\�_�2O�d^�fy��*Ã0c/e�I�������^��&#�2��eF��q���A�'�uk���(�eX.sUX���,J�r5�~�[e�;QsYFWj=�|Cp��x��cq νL���3⦟���j/��+G�ڛ�Goώߜ�O_�{w���zfEs�ͫ8��!��Nsu��+uE�MTM���`��Ѩw���NCoC�H���ڠ=�OG���O��p���Ѹ�8s��ɁC��V��~��Q��"��Zam5��J��'0F�J���
̢5�1Wm��f�3��v&�H���"�˚�f�\V��l�F��1:�M����L�5�
�PӒ��T�x���<BxA���XImSuE_Y�Op%}�$����j&�f�W�֐6����׶�؟���������c�a�9�!��r�O���)�a,�b�����H'�a�L.�8<X0��L%S"�i�Y��Q���`{�G���a�#f�]଩�W�JA
��+/���M�2�du��Bu��&���2��2^��<Osߕ�,L�V+���N)"�@,��E��I�3�M�]�zyv��O����Z
�ij��Hs��Y\��B�3VOk����5��8e5�Je�uShv�!�ר����I�~���1���n8�iK,�Iq6`�$VX�*]"�B�$�"1ȫR�S�5�ޅ�S1[&lbvA�s���4����v��	��5�ٮ
EL��+�3��?t<��IZS_�R�5�X�P<���C}7b��d�`��&�ڴ� >6�9�s�p#�N�=�n����\�G�:���Z(�Vӊ�'i����)�? (7���X=�X�q�����SY�Ru��ǖ[v��(.�D�y�\�<�D������c���UE9[N���T����0_�gN�C��&d�m���-�t/QŒ6��/@G��؜I~~T����]�7t�)�b+!��P�LD�g���٘R�:)aJ��\��|?���Oĭ8��G��Cp+v}�ՀB�ӛ�#�M&ː]�x!3��39J���CoP=_E��y�KOȃd�k_�Au���gS��*��SY�'�-��L%@}��,m�H�������Xv0We�@��}�	L�r�h��
�4)�d�L�>ooo��������়�d�Py�2Pp)d�D4�8���ڙ+(̰��O�f�*)�9�S�2�.�_'��
QGES$�Bbt������:5~�٭t�F+(Փ������=���S%�GR�iw���@�h�S�
�X���4�!7���6��K�N=4d�{��]CRB�fT�^)ɖ����������J�B�j&C��`
�1C4'�N���b�BD@��/K���#�2Հ^�Av4�j��Ky���[\���[��<TE�Qmv��(���V6���Iʝ4�C�dx)�T���$��Js��8���u�Fm�`[�����?lB�5zZ�7� W�M�T*����������*�K�>��X�Eq����� Ʉ�1���W�"�Ҭ_��e.��D�Q�i��HI�&��Hq��4s�lgm�|:x��K���-�5f�"�d�;<K9ݎx����m�,��!`�d?\Ӗ1 luG�]��rB�@
{�
IM��rV�m`����P�_��p�����������g�����'�#�y�VU�����3�=�h~�o�.
V�
5'�vhA�Lߢ�]C������`��yg��þ��܆�yx�����-�nM��{K���õ����k��Pt�	�ݵ�ɾ�����R���y�|�������'O�"���I@�_���Ϧm<ք�﷫�yW}kD�0�Ї�Z��d�7��ʠvt�m�S����P��lHsu��E���༣i�O`�����"W����'o��|�Y*Q��[�aG���%%1�ll4�� WEEX*�H!�VxYr�E�((��Q���f�2J� #L����К�ǟ��Ϗ=��Y��ʄ�Sd*�U�{�X�f�o�}�3��Xy���y�������N*Ş{c��@���#J
2���7y9�f�w��M�t"V%�v(�k�h�M�$a�h��K�L{�� ,�c���n���}VȎ�57�{k�l�Qz覩�c�؎�����ȳ�	�3_Ζ'�2`]�i��f��8�52��Ý���N=�%��}�:�m�6!nf)�D���V��-3�r�]ۚ#'��y2˺Vxt �\��d3����#�üݐ�8`��oi��kx��������������Gu9M��Ӟxۼ Ә۾yRJT�7��c�O�gWf���4#y�B�����g�'�՘�u=�v�Φ#�}�{�i��Lg��J��4�V���
���7���n|6N�k�a��Fs�,#��V����r޼`Qc�̀-��b��mb�i�V���
j��sjD�:t��w3�!��sZ2�;gm4��y׍��U���f�gs	lk�ݧ{~�#	p�6?z��x�?�}���C@y�gzH���YSZ���ʉ@g0�']+�Dw!K���P�������J�X�At*�oj��SEɃ���<��;�
��S=�<շ�T����A��t@ݽ	=�-�j�*�6]��wW���4�k���s�"2�@sn�M�mN��(D=�G�$��&sc���F��{�#��u}F|'�:�����契r��3v`���[�@���\�����;�"$��=��v�{Q�%��|ZXi�J��)2SG��e>i7�2�֨�]�l/��9����+�FgEC�2'!�T��:1��.�@x��k�q�{ҫ���&�xX�9��o�S��&By��R�o����_�q�qV���*9i�A���1!w������>��w更��-K;D�찦[��ML�f�[ԫ�}�l����*)��`��`ow�o��ܫ�k��s��q��h訳h���?�ݑ�7�S��4�j�Uf}ֽ�N^B٥�6G���$���Z�t�F�mQ��('�h �w�1F&K�F��k7K������X���Fs�B��D��ul�<x�LMR�H�ma�[�zf`���=�=�70P�;���1�ހr.A�5�y�J�p���2u}���
��BA8>�	��Ar��/}&6
�Y
2��,�D]�Ә��Oș�J�kC�L��Iņ[�z�a�HP��7A�1��4�8�y��D��Z�	,L�C:̟d��,+*�[�:霜��i�Q�Lہ- a�
-7L���~��-����\L�R�����
�8UNlNP���e�>��`�ᥧ#��K��4�v-�ι��(KܳG�x��.�}���ENVpk'Iٰ��+�;�C�q�#�P�e&� |���!�c��|����Dc��J�6����/ce�/�C��\s:a�46�q�n��7)x�bc�F�𭿴h��a�t�
6j׻�X�\ߖ<�MN`%��DMkrVV׋� ���!��qYkKn�j ��B7õ�q83:��T4sDZ��=�����H0�-�Nk
�.�Y���6��`�=o�筼�"���m t�w�A�>P�<�	�����M��-�S!Wgߘ#(�yu��ͬ��P|ztZ�%��/(���Aⅳ����cu��<��ED�W�I'��Ԃ>��(����q8��d^��y%;�Yt��,��Du#�#56�'�ӏ�`y���G�M"�o��Z�܍�ג�z�cn�P5`�0��6`E�z�PKE��T��B�w�pip/_vendor/pep517/__init__.py5̽
�0��\��q(����Q�l�!jmCmNLRŻW�w{^f>e�R���<���]{�H�2��-�J��bc��E�B�L����D�G��Y*�ݲ�P��8�Ir��!���p\k��uEPKE��T�>R(�
pip/_vendor/pep517/build.py�WMo�6��W.����F}�n�m��"��� hils#�Z��k��;��p6���%q����#�X,~�ES3�:�>CeYo�ܳ��[�ӏ?��R�H�E"�Ni˸�w\��BŧF��_��O��[�$�N�� �[�V��kyZ��
f'ͻ��f��aA�c=�yӀf��V�f0��v�m���)�`V���6݈>){�zY_k��ܪ�)��$�}�M�M��Age)ye�'IRÎy#jn�4g�i3����1�{-M���{v��0
_za���Ԉ�ԓV5�X�c^L�d)�Zmy��N��X�T�e��/f�ƚBQ�c�0��/a�ك�/c�[��(vJ��f�;��跚dZ���0���M�vj�@:�U�+(�w@~D#Bm%u�3��Ћe�9P�p=����e
�ġ�����E��!R����d{�:�c���4g����\"A8�����]�kyaxz�7��|<y���q9cɸu�c�g��7�u$��B㡝#Q��=��;�w~�=μlΎ��O;2vB\1wnԘұ�쫈6B֢�y��-��<\6/q���
p��7�O8�S����O��
�b�fB������8dS�`��,���\��6!�t��&�ܸ�Mz?����Q֪�������.���Y��a��2�!%�-���8�>P�輟�8�o�6����Y(����3�?KK������ɯ��B�T�~@"x�F�5{�pp�(�_y,:ѕB�|��<�~
E�>c
�
Qk��AV��h����(�z���o}vr���c��SG��<ڶE�q�O�n�1���n�B|�~[/YD�x��B�Ut���]��a��s7Ǥ�Ӗ
�
��澖���T�|R{��K �0����	w�^SpZ��K�;\h#��/��F�c��{Gv�O�=�.�>.�[D���+Ws(j�ˋ��"�}��%�c�A>�ǎ~W�_t�Ӹ�x�+��}���J����u�Ú� ���M�Y�s'�J��䒖�f~�,��k�W���\�����!<��Pr�
��=����<�|/�����5��튰�5C�7D��8�8Dup*b��+�A�k��}S�C����"�&6aj�4��v�fiGD-���8��6�y����
~��56� ��C����Y_]a�D��*4��^E��[���xei���'<����:d~�''��	uw��"lG���gl#�����s��:�x�$V$�h�
pm�r�s!�&A�ZF���^��+���
�}Y�V���Q�w�DZ�d�+PKE��Ts����pip/_vendor/pep517/check.py�X�o�6�_�y((c��ld�C��[�v
�{�
�i��Lj$��-���"�aK^ڵ�ê�����w_���F�ׄ����"w�)N�,����ؖN�5q�,+YpRY^^\��N�'��m:�N��-�f]2cEK�
�^oj;Y��wZ2�!�ޮd!�䵖�0KJ��<vS9Y�|�Z�ڹ�6��������0F��og�c7�e�y8����"��W'5q��B�"RŖ��p�2���t���5�[�+Ҿ|��O"�\x����
�x �80���u#�V[���[��R���KQ�~7x��d�
."��Z�g�)L�e�mE��&�	+���3�gf��.�Μ�0���V�;;�xn%�i_�d�^�k|�ٵ|`5-e�Ieh��У�S�V:�Oj�	���CrQB�
�Kai�+�rQ�فx��	}�$
����k|�p�Q�1+ ��M-���pFcq�Ҧ���wc ��]�'2���ν��/�Kju���@�+rL#�Df��⥩�ٿ��c��;�����船|�F�2�&�4�^��"����Ƒ;����qR�r|N����N�:Xp<0�J��>R}ٝ��w�#��\�U��-֠��P��:V�v��>����p-���l؍ A&�넲`�t��Z�f����wɰ0�nu	2�⑝��m��A���jA;��hs�}Q������.

5�6��g��pN?��{dmʨ�qKVRA1�K������3B$���=)���v#D�GʹF�s3�4S���L��o3������o���8�I�4M��1���;f����	��c���#u��Ÿs.2.M���Ż�-ɜ�f9��PV:��;Xv�JW��A}�:U��c�k�^��m^�TC1l�K̒�f��cؐd�9 4�ɪ��Kr�,��d��j�#�%gP3A�_E��������CX��K_u�;pD�+';t�KV�+��Y�Ȁ��i���P��Mq`]\��{��b�fC�>Q7���2��u��۾s�-�1��
��{���ǃL_���+�����C�޹��)����cqˌ�O�o���˄��bs���W%6^+D�t(1�2"�w�{iP)@U
ea� �Y�,~�J��D�����
�#r�O	=(_�\Ck���v�& 6Ε����.Sm�'��'ʓ�#+�x��>2�
O�82��ʔq����u�6輙݈�\L���0is�}XdB1�_���w�����-d��0A&�v*n]��F�@K�y�Y~����®�l�f�c�C��Y�)��%�x�<f,�������������m@�.u����f���o��Z�f�\x�k
�œ�����?�|� T9�/�Q[�8�
�wI���(nm�B���W��5`��`׫�b:x.���7�d�d�F�њ���l�PKE��T
�VЊpip/_vendor/pep517/colorlog.py}Wao�6��_qp0D^\%M?l�^��<��EQ،D��$R#�:F���;��d;��y|�{|wGw�ݩH��\� S�`�
����kHT�*m�N�Z�_K�Sȴ*�^i�RՇaɒ5�A��i��v���V�V������K�e	T���	�M�-T2ŝ-.(a��pm��p_@D�0��[UA���$���p�2�s�O	/-��e.�L��6�1|��-�E��Y��u��-���&f��X��yٜO�ף�|��u�2�ƀ�UBc��[`%���G�0gP�Js���|�hA�����n�戒
c�x��Q�go��b��9��]�s8��y|�����>g���~<�����7����na8���7}�HnßJM����(�C�9'�ysx��)y"2�`\rU����ε$�\��At/E��2K�t�7TڒWP����t��:�OLP��t���Hk�����+�*�;�N�3X�[ꅩJ�6��za��[��w�j�~�&��Л���T����,��؏����n��"SQooz�ylŊ[YQ׹h�=�.������&?#����/+�1n@�Zzd+�q&ju�K�Q8�x7b�|�4�O�U: 0]�ϛ���ar����������Υz���n�}���y"�,P�����>8�/<����j4�������xzdp=�D�N��M�t܇S�BHa���<�{j���>���W����:DzL�k^�W`$)�M8��L�oO����b
LD�)�nc<�Hs��#���W�%��+
T K�J��ҩ��~�h��'�v��r�S�\���əF�L�h��iљ�
�s,D�Eο��I�,U-%Bv^za�y�1!��&�U��0��H�ݡ%أ^e3��n��1�ԍ���:�r1��y#/s�`k�S�D��L<-w�l����֕���t�
�/w��4�D�[H�ѻ^U��4�mEe`| �Z�ᳩ'4�s���������v}���P]�V�԰6b�Bf���ǭu2�Y嚸��˭]+�!�NiE^3FDŘ΅2��&�	u�`�۠�r�S��5q5�7j|��0M��>l��3iQ8(��%"�\
��6W�Zu>@�Y�d}��Q�߰�����@a'Ů/P�,�ͱaQ�Ü���OL��]Pe��K�K�����f!�5�����m�Z�="j�t:�bb��VF>���KP�G�+³���-�P���!���w��ZN��k���B�>�1���R�]	����L,,/̡��i'���-�*5
%U�?ڼ�r�xI���c2W���Q�&!F�"�z�^ل��F�(�+Z#z���OQ��o��?�po�lAq������@�7<cUN�}��W�B�o����V)��k�q
��;�^�H2��mގꗋ�G�z��
�V�:h�'�������V��]-\?���_��wϒ��4��Da�*�x���׋o�f�ZW�^�&;�ϼ�;�\.�qpL�ۄ����3DĽ��u�ޛG�Ä�N��=
�.�B�X�m���|ۇ����[�%���{;�N[�������Y[g
d�I�ݥn᯻Y�/|W�\@W�l$*=�9yTOέ���C+�q�������j������0�#���s��^�PKE��T��5��pip/_vendor/pep517/compat.py�S_O�0��8���(d���
Q��jL[�D�=LS�6j�2�%��c'!�BaH���������nH���֔��ʕT��8�Lf9��ۂ�c]�
��|:QE"�
��FZ_�^�Aj����LBp4
۸jE���Ewh
I:�:��?�b
�3n�3�6�����k	hu��	�W)�M1��*��娃�ePB@�&�t:���d2�( ���Q��� �Cg��V��_�5��5h�F��D��U��(F�#��+����k�yZw�k&���h���Ɛa̚]=��L��ss�au���a8�*��q�o��,e
�����bW;wa�~�3��;}�e�68�{A9��%����w#�M�?w�OxK%5N9��m$�8;1A�u�R�ze���M����KW@'���{].�~�?��p�p+�\�Q|�:!y\�O���PKE��T;ϸF�ipip/_vendor/pep517/dirtools.py�R�n�0��+�\�d�v`X����]R%�6�dP���GJv����S���{����	��a�]����v�a�[�qdl��K��Ȣ�:��!�w�@E
M⬑�ŗ��7����q)���v$B/���<V�R1�fui�C�q��9:����Z��A��*�mY�J��B�
!Ҧ/���ce���I�I�<�yJ���l�l����F��
��gޠ��C����V��g�a�hG��H^gS�w�073�k�@�E��8D��mZ�������ǟ*uS��t6ÆK
���|d:�X����A��lm�1���n{l Y������I�&���Gec�][���O�Uv�Si������ɵ�k�#�w�W�Vܚn�&%WZ��}	���@ϋ�A�/W�/�*�������f*/<��\�����w�Wȁ-���9���PKE��T�"��pip/_vendor/pep517/envbuild.py�X[o�~�� �(dc���-�q�caː�M��@�%��FU�Jb,��w��n��sZ�@�Dr>~3�E���dYB^��f��0�$�	˥����;��+ZH�8������H	͟���j2���)E�����2��\�*��b� �@d�-������{?�10h��Y|�1�S����
�H��<�KYF���S�C�jv�,�'?daƣ�̾��(�hx�i��^p�4.T�d	jPq_�@+rY�6*�(��@�p<��IXA��h�F��"�a��x: ����6��Gz���r��M~�,����j�&��5�{r��Z��1�$I��X#&��@���t�W���\񣥧.`�k}ѫU��IK���G�����l����'�'疠eG�Yp�樵E�Y��=�i]rķH���s�sE_�#�<�3Bo6n�q���K8p���>�xW��	�9�yB�K^W��\��6\(�yJr�$c1�a��f��#s^���c�ӧO���ӏ!��"
�y��8����]���D����}g��T��8��{*(�㝈@��&���͊Ď�*�G�� ��*b9^�
+��#�W{�<U/�� ��I�PI��M)�)S��e�1rñ�0�Q�����Ҏ�K�#�`1"ٰ(�ʤ�S/�؁��DO��R�N��&���V�(��{� a�l[*��8���F�~�Ó�ph��o��5��*���Psx�c����K�F��4��`J�/zf��B)�2���[�PG9�0�E���T+Z9N�hP1Ó*Z'0Sr��>�ʲ@����@Vpr��0�!�SL���x7���w��!k�սv��p����M�]�ػ��
�
�wCf�򋻺�O���w6�Ľ]/]��&�j���vW��H���,]�Ixz[�: wc�n���ٕ�t��ܸ�
�ozF�3?p�w˙O�w���8@��Ȯ�����aG��Y`c�^�f1[.���"׹�~��ϋ�,���W�[����Sm�Η3��&׳��gG�z���e����C�����Xl�m���{w��d�4ԍ�&hl��4ȭ�.G��`!��m��׵3[�!��'U����`�sZ
�B�Paq*K�&f4���2%�	''���ԅ�hB��9�4;��>*M��U�$}Q%�ָ���<ay�GV���*�w"���IZv��x��WF�44�C66�UNZςȢ5�礎��d��V=��d�PB)t� l��",%#@�ڂ\Vcc��b�K�V6��@��I���F}|�<GB^��/ ���ik�����"���?�V�+��y�̸)4�����ޞ�+�����T����>N���A��Tv9��*JA3�E�S��fz�O��#z��_>���=�S?�|�\�����o�9�_ern�o=��{�'e
Tܢ�9Pi�F}��X����k�D���y�9���u��4Ŧc�ڭ*#�Ʀ.��-!7�]��T��Įy�S�ꨥ�62�!�{�X?�W�*�fpխ����+�ǀ�����\�3F��V�Ӊ��]Pa��	����3��*U��e����v�VAf��o��	9���q/˼v�}�Cu,h��efh���Dv2W_�~^�b��N�*x��߬��<M�urQ�@�������������t.��	�HI�w�&/�Iu�N���kq�	�͟�H�(Ά��o׵B�?��zo=R=V_#BI�����H�tV�W�J��4�"�%I)�z��5�J��9��ښ����O� ?A��#���(
�)	�T�-�����,�J'�j;%^Qu
 [`�U�e��J��$�Gd��	i�e��=�+�0�h���E�N�k?K�M+8�o���Nx�u����?�W��S�]k�<�5�s4�>?Xw����Ag��%���|�Пo��[�e�M_5��`L&�Ga�W/	S.®w��c��&�
tJ�6��Cƽ���9�,�G����W�
���~�rA]��f�����p�*���-s[޽!�?PKE��T������	pip/_vendor/pep517/meta.py}VM��8�W��`CC��E;}��ax�ٕ"�&Q�-���״��{���yi��%ݏ�sϕ��l�M���^v�Kv0�I6Z�Z�&��=><�?_�f'c�\Sl6�B
���I{�u��9�#O��_�4y���aҭ7�wE���M���Ы}3C��V�����٧`�`�����]�k��5��ƃ�!;?J�e��0����܀>��i/p����=������q��0"��տd߃�ٷI�n�cZpN�Ik�ɿS6���=#��lx�A�5�����V�βW�wq�_c�d7OZ3�ҧiQ`9�.�9��?�r!�@��(�L�"�<h�f���H��oCEa ����
N����U��6J/?������+�!�5�kF5
��G.y�Z���c��6E�`݁n�2�{V������w�$��u�7)�,;�#F�U�Մ��� ڤ�Y�/��]�2!�sf�-�tF6_��*�^؆�ks���纴�.�s�*�7 J1�+�2Vw���6�%LR��
Mx�,����R��S]mb.�Qv�2�$чcĕm�8Ľ@8���9~�m�=?���۽l�P!嗼A
�eZ��i��X������U^����*D�_��	?#ϭR~�V��k�e��tt��0�c��9�䉸+����K�W �d��m�g���­1�
�g���ߨ��/����9����G��E:��.�{T�U{����ӳw=��α��}�O���
�_���Rw�C�uc��څAb-�W�Y�d�Q/��#����z'$w���VՒ��B6d�d�S�Hx�	U~�8�0���I#;̕�bw�W�e��	�q�y�(^k��J�e:^�ߏƛ�����Bo�(�m�����ŧ�������]�N���k�$�hDkf���8Jq@d<���=���09�(��fy�����>��e�+��B�1ILX�PKE��TUx��u4pip/_vendor/pep517/wrappers.py�k��6�o��A�m>\^E��"�\>,
W�mveR�u����f�)Jv�i�^�j`c��=Cq�w�lZ�nFK.6�u#w���e�ڊ�n�Ȏ
�a�̎Je��j�n0�Q�3%?I.U���Hm��Wf��n�FL�~�-+n�VUj�e��]��W��|}�c9ؽ[��׼b��ġ���<;��r�G��v(WE��6G�g�<:��Ռ�g���L������7����sqG+^��o����+�uC���jܓ�?֬�-��͕lM��ͽX��5�玳�����Ǹ�3 \�_�f�Fڃm��J�$��^ږ��]�0C����YU�Xs�Y�Ҭٵ
cI[.`Ӣ� ޱ���
V#�v볳�7���
#
劕�y[Fn�ZRP!d��FY!4�8%V�������<O��)�B���0���}�ouz�9��Y{�8��c��q�0*������i@흫�!����<�BL�$ �`���ZAMs�^>�{���E֯�����C��s1�uS�|O77��U����v�^Q�L�(��-u�~RCDG�BR�J���r��`;��
͙��z�3v	�[D��v+AWk�qu�l�Z�h���s(�.��wV�`�e��g��.AB��N�H��׭�oa�?����f�췘K�Xf���?Bf�ii��%k��I�N8B6���Kk��]S��pJ�s�X���H1B1��B{�ư��^��4�6J��5��jV�5�H�+p�;��MZ­@���CW�T�B{ ��7�A�鷄�dm�@!���U�2r����:"��oYu
��I� Hb��G;;�7�:��id���Ev��YDZtf�xrK�Gok�P�ړ����
7�5R�q��3��7��(����P��C]�wd-rq+�Q���;��W�=d�${f���
�42z'y����N����bK!8�PCT7äޫ�
�^>L�ˑ�p��\x�cR�Wx���
)M��������mR��f���%M�Dcm4$��<qM�ț�Xц�Ʌ!�Hp���3���u`.jɞ��Qr��b��]����r@�$����y��{
y
�'��րtf��UY��dD��A���Ȁ!�e?�d�L	V��>�Q,� �L�=��d�%y�#?V�6]�;y�s�d�Q�ڭr��]�]��0:e�b6��b�hW�]Ɏ��݁QA��V�ށ�L�]˪�{P��,}H -,1vb%�O�
�*0>�TL�.��/`��ͦ��]+|C.ӂ������,�,�dd§�y�(�kJc�����|Q�֏,ZT��I���3��Z�R9�uR
�ڑ2L�@�d��)��(rJ+	�B��]]Yz ����k'�����3�2�B��qWۥÑ�������#L�3�6�4112�&H`��x�XN���|��
KY�!,��"Fe��o<���Cq�|��z����!�)�Z�5+'�H���ȓ�X^n��'�q�9�O@�P��Ý��GcFy�C�W��c~F��EB,�A���{ՁH��^�8�#~��5�,D�sGð?"��?�]G?2z�q9R7�Q�?u�kF�J`JKp(9[�L\t��\J+░�J�̒�����!cv�G�d>A$�_~]xR7p������As������j���#�z�,'�%�Jq6��Eib�F��D�È@��d5p�DqpGsfP��Q��l���3���cE��}u��3���[)+uv�/��J	���qQT]��&W�#
���?筕�����0+��
揉�4��h��cXu�L��4���g)o���ك�V�5��L��JG�1Nw����#�f+|�*���вW�Mׅ�l��ۿg�F�!k��-Kx�ԕ����oP�����PE���=J
�=
���X�,;���.H����5�i�ۚ�yv�Uǂ�&��
*�s��;&���[S��ͭ�x	b��c�����
͇~M�%X҉
�H֐�{D��J���}F26Ʊ��=�Za<�H�i�|�/�G#������|��D}��i��1�Xh�b=$+Z���1T�^;�G�0��{)=5/F���x8��e��m�b*Δ24Xh�x�H���՞���zד57�)m�Ё�ɍu�����S�^�:�;��D3��k&�t"�O�Α��J���O_Q�A�����j'�?���-�
�O�0�?��L��_[k7�ϩ�8e��s���?����G�������+���Y!�6��x���,>}�Ulh5}�Jc�y���`z$N�~�O�JQ0*�F}�����>)�H,�gG3���C��EmA)���f�< ?���;ŷ�`ʽ������b�$�NE�wJE�+зk���߂�K/P37Q���]{�M2�&�0��Z�ePE�;�Нn%y���9I��6"��A �@n���P�
oƴ��$�K�L�r�F߬a/F�ʊ��P�1i*	qC<4$�7� �� �
�q91�QTt�@P�= �`4��5�z��[KF ~5d:��M9֓W_\����'�)_e;K暩��r��"��+F�e~���/�O_��<��ٿ^���}���ـ����
��jP�6M!�Ջ�����V�O'��JKÍ����b�_<��v~ߍ�Ä>Ƹ.T4ض��5�,J���y�uk�]�}�[����H����'-Tjs=�!�<
`��\ݮ-�i�y���Q(�j&�z�
�f`�$sK��r|g���J&��2�R��&1�,��ۖ��"��upؔ7�5����O�+�XlO7z
ti;�2G>�Ў�y�?狱�M��d����7eBƜ��MH�o6��1[9ϲ]����u2O�*�"^��ᴂ�	�85��v��|0�2\O��Q1h��m��e62��vYޛ�|A �MtkL����Ws�#�ί�v���fÚ7��(�_Ev��|ח�~	CNʔ��Լf�g��ZjL�m��df�\�A�0v��*��q_g
;�
��#t�,�8���7J�v:N᫴�
��;E��+��_����@��@����q8���os',L"J
3�.%Ò�""^��i��J�d(d|w؎�PZ^���������Kvj3F�Wˇ_^�WjI�T�F�OWAU��
�z!�����W`�
�0�ɠ)O,ЀF�g����O0ǯ�k�C�PKE��T��$3)pip/_vendor/pep517/in_process/__init__.py��Mn�0��9��f@q�����G!�!-đm��M�N�E#$���QU�e�q K��uW��[AG�>0z%^KE�U��t��l�61y�\\��d�7i�zu+8��n�D"����F!������0S�L(y�SS�l���9\G�0'bmMUUf`������F7�\'�~�
qZ6��ST���O�Q�]��l��` ��~eA�(�p���y?�������!�-u���Ũ�/�F_[{df�N?c=5o���F��L�>��/�0��-��H�>�(C�2G�E�PKE��T�"�H�+,pip/_vendor/pep517/in_process/_in_process.py�Z{o�F�_�b�� ���&š��T�I�/���;��R��ژ��e5�w�̾��(Y���p�a����<~��]���%��k~E�&1��(��
A*N�q��jIɬfiBf��	Yr~%��"��J��e1<MYNI\^�CI�qFGd���i��h'�5+y�Ѽ"�q��YJ�	�����}�c��ɛ����'�/�@Y�Â��:0g�VQE��_���Z
�Z�e\�f+V-	�|@�p�y���O��(��<�Z���C�9�/_�3*�T���ue��%��2���F��p8,J��˔��
^V򷺫n��>R_QƓ:�}SΠs��*)F�°��џ���(-C��+�ګ��Y�񜢣�GDBd�R�8)k�02/YQ�:�7=l�3��7��yE~gŁ��w�Ɋ+���:�dU��F��H%�s-Q��b��W@ �/�䁿��˻S���ミF���Z����@�-P�𚖂�<b��O�� ?��
n��y�Ѕ+"�}4�<~�P�����"�Vވ�|�QұWW������h�y�I�j���}`�h��wM[�9���=�q�/`:�
�1ų�0�lOͻ�����>��1$��*�}��똥����͜ FOA|3�Y�B!1�s3�!�v#tpcUA&JAQY���$���
��t'9����Dgv�C�}|I��� ��e�y�-�[�X&�"S�*r�2P�"�
��2�Q�T�|�����Oy��.h�;���AhءA[O{4��AW��|�,&>�@U� �C���Q���J�lRe���@~B/�5͛ѡQ�p	ts^f�XP�܈g���R�2�gl#��A��x^�t�n�i����Km�H6�Ɯ��䘁�e7���B���;����
t�,��.D��(x*�K��x="��OZ���"����t�R��m�Do �=�|��.](��U��KX@i���P_�]>*�Ѣ%���ku�I
@�rZ�m���H�����j}�9jtj l5�a�ȩ]r"I&e��ft�1ܗmn
�������,�ՠ��=��~+#��$�hE�E��2A�&$���7,kh�N�w�0�s���*V�
�U6Z�d=l�2�o�i"t�dH4<����<����lJ�dЎ��'Z���;`���!N|�)r��	\�b�|��Xd�vKC�TS,��3DUB�*��a��5)8$U�?4�i-ӛ���&�B`x��ʍIз�T�3�����xiM:"�CǞ�A�� u�i��Q�QI�[C��QK�ZR��������,���'r�$M���;9�Z�6����gS} F���׊t�̦�p�Pn���٬�h7�Ѵ_���y�3nXj�u�g������\��P�!o�(�t��U�d��Rغ-�.S(/�z�Ud:�
�X��6��Ԕ���3�a�HR�F��(i;+���F�Q���
��z��0ﮖl�$�︍�\��F�~��{x]Ž>}E�m��:�Z� �0ݢ�u���H��r���C�ҝu�����z��{itkX���#��}��ⶄ�Y �P�W�,�I��%G�7ZZ"J��a{��C�����i�?j�j?ݨ�R�-����K@�1x�s���?'
��j2y#WS��ۣ�ד30�Yd�9����~,I=�k'���A��H��‰���-T"���R Mh	A&XBme�7+���]��]w-��	�؅�N�������К/�қ���Ǐ9��!�x�%O����rC�pcMlX�ey)!nwy��)�Q}��<Q���C��oAaoU�/~�>��Bp����@���~��c���� �9�H8��[%����'!�ΗrVp��R���y�Mi6\p[�֛�vj����#r�kH�Y\^�#��2hS)I�/�u:�A#��7��**�ac�D7����#^�T��!!8�&�ٌ�blٵs�����~�pe@~K�d�v�Z�jkg���Œjp���$F�+�K�M���0�ҵ9�F��F���1�X:��qF��)�Nfș@��E�ߊk/��~�Z8��'V[�k�{�C�-�,�`N�ܱL����
�#��`,An����Z��`���N����-seuZ1h����	�ق�>	]�׌�eH�NQ�~ei�D��;�"��ܜ���5�[͜.���
��~^AmW��	ww������X�w�*t�<Y����v�}�2��Ր�lG0Dw�+i>^�	�����Xml�B����S�H0�R�5w	r���sr OAC�H��n6�`rgk��<4
Y����⽛�>�]H�E�â�.�z�gW���B�뜯�ٲ\i���F�N�-��|�\��_�[vv��{�R�?y3Q�F/�,[7m~ϱ�)�s�K@��i��a
��ZB��0l����=�xWP��-�9��*Z��jAU�nl*'���C��7�R!K��k���J&*~
T���)gO�\옃'{��Y��,��ͩ[��޽{������]q詂���c��[����1C�����m�l��9؃G_4�Zkmw����r\^^���%�f�Mo`
4<�4;_�Ӈb��������YsFg�W_rҸ�O��U�W*���Đ|װh��K�8~0��/���<�b���G`t��g���"�r�g�n`���Q|[Ⱦ�7������ԥ��o���7BN=��wъ�ͣt\LӾrnҁ�Ἤi��6ID���3�>��:�9���
�֐R,@zj�~�3��U�3�U����6��~)iׄ�$���7qe�ykG;��F#�W��Q/A4��fL��YF�r�E�(�2*A�PKE��T��)��s��%pip/_vendor/pkg_resources/__init__.pyԽ�zG� ��OQM�,Iv{�W^�G-���cK\I����E�@V��Q�(��G;�y��
'���YY e��7�_�EVeE�"#�G٬�W��l�Y������ഘ]�e�.�f�����ӗlj�����Q�fE�l.�Y��ղ����r��V�����+=Κ�o}�n/�պ�m��.�\��Y�Y�����d�4n�ú�)ۃM�]�K�P�����g
���-62�l:}8���u�y��^�������p�K��Y�0��Mͳm[fM�S�fUB����z�)�j�]07�VvQ��H�P����y��S�՜�mu��_�6�k|ݬod��]�)o�v|�����f��<�� �0���lV�f,[�K;��n*Z�bG�?U+��`Q�m�in�����>��*���k���ժYohr��e��̋M1M�7�檙�\�5@�L��v]N&YuC�m��n�	�}p �a��k�~��mSݔ����٭J���0J��XװC�}�)ܻŶ�l����r���nH��ڽX��߳f�TE$�M�v��.��򦨖�Q�t`���S,o�	l���u�r��)������DW�}�V�m��Gw����lֻ'��[|uP~���M���X��5�9�Nw��u�y����.�e��Y�OV���3L��X��j���V�I��-���T�|��xhe/��w9<�o�����j�^†���ƈ�4�#8%+�Q�h8�p
/vx����E�p�a7���V�������N粪���o^�{1y�����7�`^���r�B�ppװ�z���j�\������$�?á/�Q׸)M;�_�5S9ݷ����n������7�(}	t�h��{,3(f�V��l���z\]87x��J�<���!Ք,gW@fۛ67����Ww2�]��G�2��Z&��V��3"�◞wX���hD����d8��Z�p�@-�{��S^-*��^���[�eo�zs�n��5?��@ċ��h�	QXx\-������(�H�u���^4��}1�u_��7������Q�/�!����LF:?Qx^O���b���]l�����L�pg�������Z{�oO�M����ж�W���s�A��@�%L���M�].�-�һ��K��]�<�M�@��Ŏ�
��ae������VzҖ}T��n���ZL�(G��2	�ݬ��F�ϖeQoW�>�`(�y€QL�nYtaM��_H�AG�4,[�&�f��*�9<��%�}}si�p�8a�ї�u� �e��2Mn�������}�,�P�U�DF.�����+��IJ\��m��R��q@�v���H$+���Z���TA׹����*#�`"���e���*ᚪ�ɿs_Q[���v/�Ų�K�{���,f;�M0Ђ���_d�9;�z��r��V�"j8ʷ�96�7�€�W�j�ɑ�^���3�8i��a���Pz�?yT�!��:�6�`!Ű�&ߴ
�A:�>Gg�I��� �4{>���M��ںQ�~T�N~�X�ew�u+]���·�- �ƍk	�T����A>kV��[P�â�����As�#�Y���O�+nt�\����4ܸ�s������Bb�5nXb�#,���y�=(֗�=��~ ,U9���>��
���]�������q� ��I9�O�^!�
x�ͱ]D:���%v�ҕqS�S�\�7������i��9�?zc"���p���h�^�p���ˋ]4�,��vC"pvD��7L�fW�/���G
����H��������z[#�|��|B�>޶(�6'��'B��ÜUZ
�+��.o�n&�c77 ��4�l�]����Ế~+{�r��8k�y��3���XԻ�A��9&�p:�MK�\�A�&�$;b�J��6e;�o�F��r�	��B����Bz��5�M+�-u	��fv5Ķ����.�k�I�G͍��$;��۪>�%�V�p���OZ�� �$�A�w�܇~E7�pt���R��ٮ���F��>�˭���ƪ.fK-pPĒ63z&�៊��y=�
0u�0<$�$#�_�@�d 87ï�z����j�ё]7�+`5�ot0f������G `��O�O;l����,\�����|.\WИ���x�,�}�nj�%���͒!����*�cxZ�����!�,$�%������Ph7�E�]n&3��J?��ur�e�%�>4������j`���|�3x�x#�}S�@�����͜t���}<ep+�D�����~&��YS/�$�H)n@4�A|[#ɫ_�RQ�n��v���賀�5K,}%\|t���Ȥ.���H9֧*��FF��{�w�ݤ���
u�	�*��U2��Pl&(���RcӘ�Nj��	K����[��.�Q�Fӆ+��N[�`���~*O�ݸ�p_�󲞕�x��M�7�~���˷�؟^�z��o�Ϸ��}����__<���߾s�����ׯO�o��T(�aF���&�J���qң�˦�ޮP-C{�
H���=5��	��s�X����?��^^ެ6;����2�W��Ҷ(���|���V��&X���ɣ���e%��O�>�
�J�U��{��/u	��%b-�@�r����-��#Cu�L�����S��}Q-8C�C�zp��܈�m���Ӌ��IvQ�%qE�r��K=��%�ߣ��Y�$��,�+�Fn�\.F���.�$��a?��rd�Gn�]FÏ$�h݀{q�;��-��r)�6-st�"+ۍo$,�[Ǹ3����gvp��TP	������LP��d	��g�<^�� ������Z2�/pnV�Z��e���=:��������~��Ls���f��Y܀qy8���3�������bg@�v��˅mĬo}Le�c(�,��YRA��������d��g#�j��Z3{���-"��������AxJ�F��%>_�0�?�6h�yHDoJ�kc�oTZ�P%̹��{/���=G!^���l��?
�r����6��?�D2�z������X��j��}r��C4��쁐(�8�D�Є��Ia���跜����{�7��GÑ�N)y��m�
�t���
ɲkm�'e��kP�������8�l��
`6��e���CU}\V�˚|%X��8�	0���V��nO�6���|�E����e�[yFʾB���
v`X���A��“G���ǏE�b���w2z��ﬞ��ͦq�)�j\��kV�L
�)o`�t_�����y�`a�
1��4��~F��L��1��L�\f��i�X�D��C{���sl4 dh�N;|�tJs!�+c	�|b���$Q��hF�ՐA�^K�Q��:ÒA���\F��h�"�󪥻$%���rPݳd�9��� M_C�-���
t_2�ҙ���\�����r)��m����ykX��r���c3���~�q& f���>�#���V�NJ���sYl����OUY��E1tK�? U��b��7��uݖ�;P@u��3R��oI.�uu�.ֻ�Ϛu��\��@��w�8��� ��_CΊ�!5��I˫��UW�
��)�M|����k��5�os���:���~#���9��7�	�YR.`�S��nK��*��r5����11����P|)B��σ��\�><���o^z2��GO��J��F���8ΐ�X~�QF�V�l��X�����jy=���-{�6�厡	�o�"
�t�׎�>�(�Ulɨ�r޲�`=_3_W��]��)4��Q@!���^Yγ��̙	"�K��_<�2������-VwL�B��H�
�9�"�*�s�r����p�Nï]��0�?�����{2�b*��h<x:_$5l�f
\`�T4� ���-4R����ʋ���PLA�&��/���Z7�˫L|BE�)�BB���tMB��2GmQ�,�k]���OG?����00�����_G@��Ej���I����w(�����?+P�3/o���|��q�91V�ZA��<��T�����-���W��;Ϸt��H6N�\,sOE^��udQ�i[�u�a��lCZc�9� Ȍ���kwr��{�=�ʢ�!m�M�h(�Fg�%*���B-$��1=�ҡ�'~8�;`�,Ff�D��QƯE��X.��YU*�h�
]j�&��좄�e���|l�G�˳�p���y~�%D�E<��'>���U� Nޅׅ�zΤ�$K��Κُu��.�0����o*f�ǣ.B��~��B�y�ݧ�,x�Yon����t���Q��!b��,���^(�?L3M������ԲM�H>O���K�k=��}�w���)��xG/]�(X-�5��I�tzm�?�~��(�7�_�Go�6�ٿW�h���E��\Ⱦ��1��gD	���6&��l2uøl2t�;�v�jg�"�7A㌟����A_7h�	5uS�є�k[�ɦ�T�)��[��j�:V��|1�0n�^�u{6Ps��\�����	�j�~Z(��f�f�c���Q|��K����Qp�n�z�j
��N����`'+�%Q������U�[�F�5�5g	��a�\ͣ녘�:�@-��K��*�
�<��x�-��7�j{A<���Y�f�)2:y�,Dhٙ)#�u�iٔ>a
a����q��ݑ��q!�ʎǠ�s���>!�GW�+�!�G<V���[���!4��pá��(Qz���1x���2�Oy�i��y~�0i,њ�ʲc���WEK^��e�.�ޔ|#�2vpr%��j���0�rO7�:��.�=H�d'�࿡�>Фcj$�],���~�G���벘�܇�^8K�循6���'�s���H�/�'�v���D%M�8B�j
c��]h��덂n�
��<X7��J�e��XO����,.�k�S-�M��t_�R���kYL�C
~�pOӣ�t�{G�F���b��l�+�]|�U9��g��8\�wl��k����c���"��\�z!��z���
o��l�>�t��]�$����WDY������
�){�^��eA�ޘ����7PԆ�

��0�����b`�G�V4�B��W�"Q���<b$�
q�g�1EN�`�:$����.���!��n�z��G=�{oNc��q�d�C�Ԑ�oQqD�T<CC�F��Zk�'©M&� $��1qU�Z>Ez~��I�U�BA��^=ԛ|�
Ex��Y��kӓ��f7�0��^^Лċ��h��+Q;������G��-�����0�pH�UG�D ���:ěm��ٲ
�~�� ~���]��G�-Nb����*\B�Q�����m'�X��	B՟#Jr@�\� ��1���	D��5)9���b;��Zѝ]rp!`�gu۪/��Υ�s��;,`.���8
G�c�^g�o�0�CR<�`�F�?�p�;���+EZ�D.
�nB���(#���l7��o������.#���@�jY��a�ٹu�w]��nA����=^(?�Z���Qё�'"^�Rd�8�"�ZU�|N�J�0%�j�
�P}v$gǂ4bE�$~P	�!DM�jG�d�:�gO�y���>�DT�]z�y'>�Ua��1|�t��ќ��z�"v����t�
�੎I!��m�!`�8�q*�Y�DX5ܱ�ܵ����L��^bP��-�ra�1wN�Do#T�������|`�g�N���@
�t�����`IjT��b��+�2��g��@0u�
`{�@u�<'O�а|���T �qs�,Bt��7���m�	�cx�Χ�RQDHCRp~i����Y��Nf�Nb��up�W�Ѣ��0d���XW7�:�Џ����5���ұ���s�
��g��"�� �˖���ϰ���c������l؄M�E�F�A�����)K	�T�~|�`��¤S��� �1��}�(##L���N�g5�8��Ԏd���L;H�7ϓkV7�f���d+Kg���"*�S6!�eE�dDэ�Pn�(��T��Q
T��l�1c�i>Ck�(Xe;�{��F��XhYI�[S�����l	$�Za��EI!�]Z�$79�-1<�4�;Bf
�4f��-.e׀�Z7*�A�tB��<6�EhX�Ca*���*�4>�J� 4��7�2p�ח�� �����t�Į,����Ƙ��s� sgX��QZ[e�ڔIf�2%�*���֤}�$���5��Z�J`U�G}�%�����
��ma�E	Q�Uڝ�MqmP;:߲����)�G�-BF�<����3���P�-�cqF�?�)U�eY��6ߙ�
ަ�[b���е����G4�bMqEF{����9����U���p �IOI����L8��A�s�O��158nìss”X�r�9A�y��0��aɅ���z�́���*�&�yސ�:>8���N��?�	`1"�O����kL^T�J�#�m��n<+�ʽ�(g0l3hC�w��mA�>ʍt�8<"�}���8�	�q�h�$A{㐄��)+���������N&�z�!�IN�**��1y��o/��\��	̌�4_ӌB�zc��B<��_L���v|��B�uh�~�����B�x'd`���~���h���-i�3�q����ú�`��oRZ�����k'�1חRӥ�4A���q�Ϻ0>��?��������q��%��I7�8��+��[��b(�>�PU8L��E��4ˤ1G�/�(��3\ʘ���%�]$ L���"x�M0{`�A�&r65^	H�yee���خ�Z��&
B�
�q��$�����/ ������֞c�&,cL��-�p�4s���~�\+";����8+j���`Q�g��Pe;�/qƲj.�u:� ��k�*b���oC"��1@h]�#A]~=��~�v��}R�[b�h	45/k�21�0���=X�D��pI��A{�8㷅��j˭\2>?P�@���i���(/��2$w���@���ϡ�p����hzA�BK����Ԇ
y���
	��IUa���M��0MCƖ��j��4:z��$;��!l.���,�s��p}C�<�V���r�KC;_,��p�ʎ]�(�-:<�-^���4o��qe��LO�}lT��|lW�5l��O<���g��'O��G�r�D�<5��:`ڏ��=�*��.J�\�v�Fsޔ�!
5�"'�((�y��i:��$D�"�$��>�xa�u��Ҁ,Zl�ıq�)¥���+\6�<^S��?��s!��Fb���;�dE}	��.��m����%b~�N��jV�G���7,%�d�d���Tه~4
1��"������D��@��k:$�)�/D���K�U�W��䉒~O	�dp�M����Xu@�W	�3&\�a���,3���'��VY��[b��/���� ē� f��t�}�~�G�$ԛ�J��Tg�5��M5�^�����L������G.��R?��޶��� �� ���a��&�������p�]Fڷ�2>�g��{C5�`.��'gHY�X����礘N&���M���Ss	Yy&MT��s��nV-'�8ĭ9��&[,L��.i�W�c��������A���($�p�l�+z0
�d������ �P��D��G|��y��8��0���\��Hs�2u�vp�ϸ����m�Z��!')�V\�@�M؁��,����ش���ް."�(s-���1o.M
Ƈ���j��:R���Θ|�'�r��`?���2	��x�ie�;3�|rZ�'O����1�d[�%<HO���-�ϫu7
}�"r��eu�&='�-)v8��8w^���l"��p��3V�
�)���(�����jA�q�~{A���w�ꂌ���:h�C�ջ!Z�[��q��X��؁ӡr�4>��k9�Q笥v=��ԫ�\��<#�D@����J�Jթ�"�U,�Z% ��@%���(�ov+wS��}B�;�i���5CU+-*NЅ>RٴV5���,�Ni�R.	�;���;W͝W��ɧ�l�,Pv�����L�ć��;��"�DL��͚�ܧ0��1�Fl��$��&�L��4Gj��3�}p�a�ώ7[�'O��4X�)�Qx�t��eMZQ�n#����'�j
L�@�K:���c@�ƻ�i��S�W����Rry'+����O��]��@�,{��uL�;� ��U��Ǽ$ӂ��{�Ջ��SiTe�%�	H���Ux	
Ս�u$��
*��3�ѩr��Y],WW�E�!��v�Jª`�\�#Ђ��ʙ�� ��>���2l�鉹��:"�u}j��d�7�R�#�V�3�X�ֽٮ��tm���xU�w|S���,����)`�-x�5ڪ��Ιr}�?̇�ͅ"�6�w�w�=:���'g�M�a��Q�8G	ϐ^�O��V����8�8�7i��g�O6D�J�/̱�/S�����VW��{��Iu�:�ҷ���\7�ku]����'��:��]�b���D\?���t�l�ѷ�[�������¢R�c��<{���H‹f�%�k�N'�|�,��	�aPҏ��� ���5u�/6�@�#Xh�#?]{�1�q8��m�`(kr�9��ȩ�X\w�Y�����'.=^-��eN���0i
��Xv�t��y�\�E<|I�y].�E/f��v��rK��L��ļ��ﱒ�w�Ϗ��D]�����=2D��u��׷���A9�������10��"Z6�y.'��FN2���1��K3�3k�T���X�n8���e�o�c���9��"Q��4U��>�x>�Œ}��
;�0�I�k�z�I��a�餳�vu!�\�=9w�F�&�80
ȳ. 7Z�ކyQ��N�'��k��q�}�3�&�f��d~>�.6��.l��� Z��5�И���������@��"(o

������m�O��d����<I!v���u۔C7/; ��I��b-B�"�2�A7Ţ��'��a �����|/ib@��׸���(f�\�<pm�'��/!C��4S=sNE?�0I��ڸHh8����Xe����F�q���du$��u�j���ݷ��djI~�Ԅʓ��r��Ԥ9'}%��C����'�&8Į�:�>��x���v⠜3��z�c��g�[D�,�7F�92����-�7[�6�*�tɦ��\(�트(�q9�'؟��1v��jXB���U5���3�M�yxMi4���˖<�@$�7�e~���
>��`:y�=c	k1��ߚ-���"a(��5uy�~�2����G��]�u��\q:�U�������C�w\�
��V8PiH�6!�w�0g$�E(�G�
�6�;�
��9��KT��!0W0���՝���@|��&�nh$ߝ9{��a��$	1�Ӆ�
��Sc��!TRt3욒�:�r�pV/�hw��v���]b�YtU�{���V7�o����6�c��J&�d���8D��A+_��z����f�{�����Iē
2�.��A�dH�;�4�!V]D��:�/v{`(@���u�:ҵ¸;8�C�jcI-W���|$o�Pe��V��}I|8�k�M�Պ�'��Rb��q�'Cf�t.��o�cT޵�м�M-8c��e1� z�b�M
�[�]W-�Ā���F���$Ǚc�V+�oA� ��=l��j�$�TEQ<��#-]�dq��s6��഻(^�c��^L��-Z�F�Xv
n%��aU�\`$!s?.�`��g���u��r�j�ޅY�i��n���ȉ� %����~O߄����	H)6�:�<���dS��ݬ�h��A3f����hh�]7����CpÓ�a���E���E����W+r+Vg
GGg�u���Yj[u�/l
e�5�r��k�)�F��G+��\�i��P[�<L%ѵQ��o���"��\<��[r"�hW<��C\�zف&^�T���
1IQp��L=��cN����7^ZALP�Œ���ؓ��roO�h�g�:6-qJ�	���'���g)�`�F�C&ߓ�w��XE�<-;��VI�h1�5ټ�%��Cُ�ő�7O��}'p*&O!
z�q})!�
d*R�p#6J�R#g�m��K@����tQ�����=� ԓ�K9����9[�U�Ѐ��X�������_i�9	��@����2WY�>X���-��?�z��{pP�F���!D��T'�*�����-k�S�/�Ċw�2ŝ�#�^���6�!m�
��OB�}���pI�X
���:�Ng�d�Fû`��H9_ڈ�rs,��s�o��7��#$E�02���_�?�I�xR�LB2cԕ�]Z�ĺ+b�5Qg������������YA.����Y�za�{��(�-��c�(UT��q��x%��]��*F�+�^�܆N�&㽢�8������Qu���)<Q�C���҆�=^���֛ꦌ�-J�Y�q�i�p�?�8��uQ�)���J�A�g����޵�9�����4].Q����,ʩAa ��a��"�8�$�c���� �uuY��rB�I��I*y?zHd@����M�R��wjP�ȓ���Qw�i,�3͑!�hN�p��X�LT�x��{�4�I�B�'�j���1��&���p����ڛ��WO�'Gk�-�>[믝P4���5C3J��D]Z�_=׻s{�J���9�32'E�.�$K���ߟA�?i
d�u0�o]�������H�l5)�.�u��M'N��E��\��qG��y����_*�N��60����Mk�p��a��,�O�����~�:�3y��U��$���C���j=�jh��67�%|�Qe�k���%��
���3�\�K��%�"tny��w�i��%)g6$�X]oߟe�~�#��p��sU92��/r��\_�ͬk�6[�ӌƔ��ꚬ���*�_�zUԗ�="��r��ӿ����W�I��鳿��Y�}��4ag�c��V�h'����F���;%9l(���|�+��=��,#�	�@,�����4�6̉�	yB�
�Q[\�d8J_@䦍��>e�2�XP&`�|1;�r�@�${:N�em�`%�k�h��c" �=�Qx�Fm��m{F�ٲ�D�pD��TA=���Ğ��O�
���8̰{)�]�}��Ì�A%lj,��V���W�
��24����5�C��堵��nSO��EQp.;����e;�\k���*�sv:eE0_HŖ]l1�H��ǒT��f������e;��h�b��z�ʰ"�z���l�k��)�t�2-w@��-��$e�f�c��q��F�'���b�N|��>q�bhz_x��Š'�ײ��XY�z=��m�('�r��?��ٙ^��Os�{I�Ο�,��o04���K���ՠݼ��sJ2�E͸@�1���G�#m��Ch�6����U����u��ܶ�*�xsl0�E���_��0��R"�([X�u���-v�Pγ��⺗���]�ͭ�!�_����PfG���4V
���t����t��z3��M����ӵz6�����<R�a����]��V嚲ċ���%�±��h�lg��{�7+h��0:d.�V���B\@̼��p��q�)Xm,��P%�G7Xl�=�.cc�vVxn׍�_����N^~���_3Z���_ޜ��t�^v�h[>��Pvb���!MO/�K\CM�Dx�vA��T�OS�y��lR��E��K�r�	�&���Ӭ��b.ɵ�rT�v"�CFY����!,�}7���c#��5��t�
!�1����s�wm�p�4�$��T�F�� \�n{�K�
?-=�X�yS�_�.��N�Y�6W�ϴX�=+��M�ݹڥٌ�T<{��������&��ռ��w�����ڱ������kc�K���ν��ۺ��d��>:�7ͺX�F��`�4�{d)w���(�dq��v"��!�T��^t��=����>b��Mq��\�VK��w��4*y�Uq$j��G����/F@�5�?�pv
���3��=�N���o%�<1������v+�o�MC0G-�~IN���D�=n�U��x��`q����>W8���8�L#��8E��(X|�9�t��iL���$3m�?���;ס%��n�x��]�玎c�l�*Ż���[~�=�R�ܬ?{��B+q�x�ە�E�Y�Ş18���a
�i�<Z<��&�!�m�Ͻ�W/�1?${� � �N��w�UK~c�����R���W��HR�0���b]�HR��.}���~�x��Ubڂ
:_5��	OGJ�݈YWδ̋�LZ�ԋ�˞��E��ɹQ8��kKά�F�{��x;/�����qb=H��g��L=��X���2��]�E������ޙ#�/X�t�p��sƥpgQ���7�;=�ė��:Θ�(�j�DcJQ�	p0
��u��Q��Ŷ��m�1�.�f���ܲ�g�#m���k%ī�^�ܬ@N]n1�0��y�e����^(�s:LK�#�2������Trhq����)6�s�[/
q� R>M
�3�or�;��1I��D"�����F�b���S�CNͮ׈�~F1��N�Ⱥ�����Z����e{���Čz��<���t4�e����"�G�3��@��._k�e���-����ݡi&�jC���%1�i&����l�[�"��$(J
*��s_u��J���Nyp<H.ֺ��B����/�zt����Oc� �tM�S�d�7‡�OU�R�e$�7���^V?��Ӎ�aC�FmF(!k,�w�`y�D!�m��֪��W~.�I�.T>���_U�]X:���5�#A��Ě���d�
b-V&N��=L�tΣ~o�:�u�$�w�<�y56��b�$�z��&$�l�^��e;+VL�n�����I�R�0�#��Âc��Πb<�pT�Mt�9��cD3�c�����GH&�R;�ٞL�r�d>sv��4�8�=ow��p�m��Y�;kD�[�X-�n��2��.��j�#�a]iu".|ߒ�v*�����R���N����1Z��D�$�F�S>tށ\}�8E����ζ�j��5��ʭ��M�N������x������=4OA	�F�ރ�^��>�py*6�zǮ�n���G⪬������>�l0&��(//'1��3����w���Ʋ����r3<�~7AJz"җ�06��@�+F�����ztg� �i!�^���/{�
~��i���m���&"�o�=��n77y������.�8��|���ÁN� X��}vV��1fv
4
O"=0I��I�g��9�9w;+�u���pml����h��04[��������d��W
�&R�*���fl�v�8�àc����sj����X��3@q ɴ"��J�!C\-v��u�D��@V/kEh�q�p&瘻٭�����)Zx��I6�A����	��ԟ������
Q4Q#&�H�{���vy�Q�K����>�����>�t�.6���uQ�����5M�ɯ�h�o�<ߓ���3���3S��S�2���>3�5r0��ڇ��S�Y�0�T�GFef��t�	=�[�g�/ԉ�]����倦]�d—+̌3�&>!9�$�%���u~X�P#����}e��-�Q�/��y�����)����a�8N�U�'�L�i��o�a��m͊�I���(����(���l�nZ4�F'�bA�J
M��$~�����Y4��)�gL�8{4����e3���L���n���j`}��9.e�:6@>����KX�yℊ`%�t�9�]�Y��Ty�oN4�x�@��
#���+�i�a�h��ǘd���%�勄��Z��Q�8�cx|���{a��>d=��>�uF�Ԏ��ü��V��̚���_m6���Ç-n�i�e�sI���U�ò~�N�����қ�����&S͎��1�{�૯�"'�"�՜��@������M�߅��;%�`�b���MYUC�Vǟ
��yxQ��͇M�AC��arP��G�!ݵ��v]���ta��̱b/���Ct}��xرӖ��r�������o�o���nkB�a�?��^�wk����tx�P��Pd�[Az�<�������,�5�ԃ\�"<z��f~��&F�����eQ_��*!�ܤ;����WM},���$�b���W��S���u��?ѠǼ���P�EV�8��'O(��\�lU��o�/D�7�7qs
��-$]�1���=c��ÏÇ�z�O//�E�j���p�
Fܙ���M��^0���$e���c"[_R���ƺI�@���e0hw�Ų@<E	��� U�pE
�5C36��a(l=/W����Sg��a�%�����<����kV���F�
|3Y�A~ċkmn�k��a\�h���ɍm8�߁r��xG�p���	0Yi//��0h�L��{��j��K㫙NJ�c8��d�=%�kh����l�"
F<„c������K�l�^��Y�H�����;��^�����������m�^f�C���Y��d_!J"q"�ճ�o�f9���9H��B�:�E@*����b���4V!%Ѹ�d5����pp������_�_������M�Qw��o�Ox:��?r9�#�K�������ơ�A�v�&RQBg���b{�x
B�9�T�{������/{:�,aI�mf,V��W�	���܋8�A�Q���Lfz�
& 	b�Qi�p���9�r���I6xKC�3���up�-�sB��m,�p��fFI�����eu1�)0�U�����!ZN|]dH�||��8	ytr��2���5g�ք��jƜM�������̌�X$��je/���y�y|xb��"(0|�ᰚ�D%D�D~]�=FK��߫�7E]-pR%~�Vx��Av���Z�˭Xm��u���O�*���V7ղX�z�U�sqt_���۰u�\dTo��6�S|��3���!�f�5�0�&D�1oVp�V���j�B�Ue��r	��@���U��6�	G�(��M�t��C��@dB�
��#r��̀�a�a����A�_T�h_aO��o����ZSI�@q�My�`db����������u�܆�8�cS�"��J5�fH`����P�������ߑ$S%
#fUv�&�ӷ7t"�}��Cgt��$q��(B|Dqxw�7�)E��	8>�%
%ԁk!w�
]΃s<�Y�1�>���p��%s��+~&�&�k؟	iפּ�Fk�	4�8Ԃ7I<�_�0C��܁��l��&��� ��y7�#]��=1.H�6��#��Rtȇ��X�)������UU�Z����#M����'���ڀGjg�`�c�‰�K���B�,�j���$93��;��c��i���9[*����0,t?m[X޴�XmIg�K�w�'-��>��[���jJ� {L
�w9�9�PĴ���B�JQ$��j��9^��0�6+@�O�`��N(ST����gX.��s��b,����3ތnl]����!�)�ŒJ@Yrw�D����2���6��i�hպ�q���C�{��&�qL�G/S{q�̮�(�1�����8� (�9�7�M���gDt����#�fW8,�8p{>��!���L��?���C�<Λ����ɤ�N4wr��k�_9�;r�…G�Ķ�n�'��!�rjl�vw3��i?�� G��s�F}����f�G�p������GpJީ<����cu��G�=����rg��c�������N���WN��� )��|�7�fg
 �hM&k;�K��n���L�Pg���ɑ[� �5�*LQ�س�L>��+J��"��3Tf�-�� &s߿y�������߼K������
4���D�o�eU_�\��
�k�?W.W�N��$��he���,ٛ<ʕ��J��$DD(���t�p^����q$Y�h]�n��`&
�G=��5j(W�{#�'A�î�	�q#�����os�c1�$-#�JǟbB-�4|�%���gC�����������k��u�y緢�I��v�����T:}��G�9�!��)����[���YW��k]4�˴���a�0-����g�K
4/���w��`�K~EyţE��g�a�yϐ���WO�c����r��
��=^�����x�E�})��B��D��b>�OV�����*��c�?���A	��|�($�e��冖aB�$dt�~�k;!n��РPC��zF�;݌��=z>���� �+��j���������l.�&��E�+�r~���|$�9'vf��%ȜXpv��j�AMB�dY]�����a��(�$�]��s8��29λ�C��df�'&)/�+sh�	�֮/D�����UL"'��#��a)J]�s���]�Gyb�zb����z�*�%�����B-�О|H�d�ԧ�]E����<��Z�����Ɵ�IZ�~�=�!SO������.������oj��Gom�h;�x��������i1��|�Q�s�f��v��,!�܇2���B϶�@�������7��@mվ8�XM��y�Q�E��s�
�F��
�hE�F�f`��J}�]�����|m��b�U�N��}Eأ���[��{b�4�s�y��p�<T0�#:�l��̒d���@�j��8B��1g��U���b
����;�I��8o���$�G	M�^Y�^�E�r�#&�WDĆ�~5i�׵⌡/�z��Ղ9*>�>��r'U{^5~Ge#nU���a��G��ܻ��Y)�Y�'f:ff�=9�a��2X��`R�[��
�v��U7���0���^�`
�Z$�g�?��Q�If��`��m����{`�ip1��C�����>�
åh��ks.���?��-�/a,V��,uG�{߾���B
6;�$^Zv�`�?,jV(�)��Q��&A+�"����2�C"����ڬ(US�K�gH&���B��>a���T7aw�X��F)��T����7��)�=$���a��}?:{t���m�)ꓺ�nO\o�����gV��}��y���j
�M���{�W;�o��Q�;WJaFja��T��M?� Fo�`���{阝���Ћ+��cQ��{��[�⎓�0�O�7leZBU�3�����>���;A����m�����E�[�`��r/�]�'��cp�b\�cxѝ�[L�/A�!\�V7dP�{�TA�=��M��M~�Al�8K|m=G$��4�l��Qeb��բ����[:
:v9��sA)���9|�h�
�O�ڑ$N��%b�
�
�*6c�"DN�*���t���ۘo,�k<���u�.	�H���*�d��0&�j�K�LL��I���]5��ޞ��m��l~��;��59o�d��q���᎚B-X�u�@Lu�n�ȏv���l���BBz��V�i�BߪD��L-�|Fv�x�"Ѯ��x�_������_�b���@�[���㝥7r�󲞳�� ��Z�������Of��P�q�M�9H��V�$j�%�IH�!8ވ��?�Eio�p/*�1#��y��L�k��-͆�\�h�����ųfز\O89-�~�t�
_ܭ�5��P�!�D�5�ʐY�w�gT�e�S�����2k!4[�� wuc;w��E��X��0�H���A����r���>B��NB�lN쌷�T�O�t���Л�L�w���{R���]��,X�jr�ӄ��!�3�=��"��Jn�)����2(#=����ݬ$�b�Uno.0C!=LjW�qQP|Ƣi�I4�p���Y��3z���:�'H?�yw�o]������������1	!Y��m�C[���=��F��a_l�����b�!�Lo�8�Tu٫�����2�����#��.;j�z�bv�u�m��cL�rߞw�>g�\���$+�Hl2�
�PCO��
=���r���݉Y<^�ky��܀Fhy�{s'w�g��N�Jy0���}n�[�[�����H�L����Ҝ����sq�%�m�bS��6��
0�pc�gW��%@��)���d�DZ|���T@z �o�J�J,i�i��`_�e^r��0���߬�|�tgY�,
.of֌�Q����
������T1a�ĉ_�
��t�݁�����`6���Γ��^s�)��h��cx)>��(��]f_������B4�v�Ī��߸�Ӵ�̍û��
o�Ր�:�n�[��I��
�7
D-�oZN�l;-�A4��]�~B^$x*p���[�Bn}���F�f�)����D_5�+`�����y�c.M���?3ё؄����p���T�x��F'����_Ie�%�*��d�GO@Y=�@��.��j�F�{8
R�!��r<ݠ�#��#����X��%eP��@)ol։=Y���񝘘����١0����s%L�,5��~��~�����5[M�ޅ��A�DZ�K�b�V(�e�`����']T�X��ZM�uH��/^�~���2��O�={����W�b�d�;��L
+����RTfs�%���I�-f��;���gX�CI�F���/f����KX;2���bNr����g���gb��=��)���A���Y{]��9E%{��`�7P���M{��&��S�NJ#�Wab��=+O�����ׯO'�_�}7vw�F�G
�f�[�0g�Ux�!+�mb��0�@lܥ�+Xx��(t��?y\Zw����r�;����Tp&.���܍2V	�
	��Fq»E�����(�fЇI�rQ�E��ԥo���,R���!׳���1
��I�r�-9쯆݋}�+�&j��rJ�:Vחm���Y��,"+�G&eP2]��ӟ	��WRf�������ruN������K�����46�t�L6�Fd���y�k��&1��H���c�Z#;Q��E�Y	�^RW1>��S��pi0���\a�pY^���}&E=1�R�K���)��v���E���5E���Wa�Z@
��*Rn�j�����d��MO�>���s/*�F��U����K
Q`H90��I��,���޵m-�	���Ӑ�%�Lפ�i��N�sB�,g�7Z^py1.���\V!.�	�lī����8��Y��i�2F��k��ϼrۿ��k� �ͷ����1��+����C}��X�tJ�C����ݜ���m��3vQ�H>�;�[��P�G�sUU�J���3���Ϳ����{�Ӂ���c���}}��2)�&L�^4�
ó&v�á8�8*��P���N��1�v�Gl
�ƗR�t#8 6��|�b0a�@�G��V�-J$�$N��_��,�|i{��V1�9�@i֕��(u?�w����T�҄\H��p1J�m�G���u�f
�o��&sq��*Xo>�>ᕺ��%t��j�n&7��
A��YS�V�߬��5�' أ/>{D����?O�W�q�Ns۩k(r��隂���U��	e0�&Y���Mm_iS��FK5%в��XEMa��L���G8���і���3L/PR�C�h@��crg�Z'v��*�8
�R_��.�
�X�q"���;�S[��{�j�%f�1i�F1�w�ϞХ/S�r���ƢJ��Qπ�S�\�_q�a~``���ǎ��?/f�2Ao��A$���PX�����`�SG�[�(FZ��@���y$o�5b�+!a��?�L�����#9��
-��H�Ih2��L�_�1Թ�E������#4J<L�|��4��{KU}�T/����%���DZ�G<2�e�]a��W&N�F������������J]�w�37���qgu��?b�I�j._��
�x����8Eg�T5��������0��nF�ǽ@�o=��|Jc=�jp��]%ǚkx:Q�F+I���{�#����'di1�p��s���JrC��fR0�z�t�1XB���
�G�w���l�>~Sa�۝g��
Sx�٪�c]6]�����RGɎ���^M�܊OPZ��n�y����84��o�Zm*�}w����=�^�T�qP�7��[�`�@��eU�/���>��V�ߤ��'�S	��j|�\���VE������^����(��+W����C�2�@��s]aE��v
�!;��ڄ�X-�)�1��^qJ��lwy[�uf�4r&ƞOȌ�..o�'0�Y�>���55�]���ۗ��}����̞=#�c���n���󑪻Z�nPm��<����:��U���$(��H�"�ٲ���*n�=E҈�!�=
=�%U�j�\�.|Qn%* z��'M��7�%���oS��]`0V[]�Z�gwt�n-��#)Iy(t��}@�;`ɞtȍ�e�OPg��{k�H�͙+��d�Y5
47C�Ȧ�2>�E�G�@�ߓ�]��y�A�lM	5.ɰC49�b��͙�+M˜�E��D�m��dkB��#�Ɵ��Q�w��ѽ9��&t��#4��I��m�%G���|�"�.-|je]נ�uBl���}�D�PS�Y��Ȩ��A�~l�$[���ı?nтf��X����_����>'?uRV@K^3V�ᡜ��|��:��B8��Cp�C��J��6-��(���
�m���1�AG	Nt>��{�|�_� B�k�������ΰ�t8�9U`����o��|6t�<��_�����OG��+�Z�o��j��)�0��@�U�i�z�ǃ�W�6����͟^�}�����/�^�y��������C}�)�����k60�K13#�(��B%�"dWc�a_��U����U{2I){�m�V@dB4�w��9����o�QD��B7�a\'��_a3��(�5���SuM�Ϩ�D����_O�����,�'�S��c�y��ȍ7>�X��	wu4ѷ���`dg����`l��SV��N���_��c�8Q���[)�N'�	!@,&/�q��X_�|���U�7^�v����(���O����b$�QP�)����+���>-ְ���orJ��z��R*�9���E�u\�}�(�I�r���3���&�n��D�+6}֗[��
P�hVy3����6ܘ�hs�����啡t�d�_�~�S���j���7֙�R2>yc�Z��Nj���8�%z�����ƍm=Ӻ��-\��K76���<��L�N���4&�x��YX@�7�TY�?a�!q K��R=�(�K����nn���P�gi�#W#��y�_ʍ8=зģ��k7���xX*J�C
����cS�}_rP$��+t�N3̀sɪ[�oζ	�Ij8���-'ݲJX�p��{�q�kԖ�VX_u��:��,򔊁S(����
���0���̎��-�\��@�y=̹����Q�In��_Kr�h��w�A�s�B9G���W��c�Gq� �u���~h��)���q�;I��S����9�uq�'�[��6�?&����,��9����JJ�O�~_�T?�]��������^.�OD�)���C��4kw���؂%ٍO�D��1�{��'�;Ξb���c������M&����pb ���#8�?�>!:8��w:�~�sx��#����D��,I�ELavy��qK��TI�I�d7ۖ�ހ�2��%��+��'�9LPİ6#m���e2'�G*cɿ0�8�	��n1e�ـ�p5e`�5�187�����7���擄�>No9�����eŽ3����P��`ݡ��`^&��`�?�d�x�'��򿶗�k��alc�7+�J�QH�]'��Xy��똥�te�2���$E��-CQk��Sϵ�d����V:��F}�+w�p�b�m�/W,�U���k���
Yb�2�nUbd?�g�u�&
�3nTw�!^D���
)�֨���_m�Q�(��&ZQ�$t�Y��I#��Í���a�2]b�-jR�^'j	q��`��$���԰W����n��u��6˂����;����e5-���ݾ��K{F���9�=�ݜr����S6��1Y����i�� �.�<���RLJ����z��.xP9�!�T�*Ln���@�#9t��(��%�H]��`0��[��Ɓ����D!����
!)2��
ah��9�ǭ~`�I����1M�Udc�����C�:��jݘq4�T�Ӻtf����Qt[P��s�N}�	n��	��``�N�=!7 ��� �u*�X}�FO�HW��m5Šۧ��@�P�8�zY��`�_8G&��5�H��_�2��46�dB��3�B�(��� �=
@Ȅ��K>9��䛧��+W����F���:�@M�Fα6�,�@��0k�f�H:�Nt�ځ�F�7�N�Y���5r�@�a]v�,=���uq��#ldu�x7��x�`6���/.Ae�Fm���4{1v��fm<��#�8�d�w|G=�(�A���BI��X�
w���v�(��F2&�3Hb2j��u! ,Ƥk�8��=W�%�	�@��c�bI��ﴍW4>9�� ���?�����/�<���"wv=ta��U���BiWE{5�Y�|�%�|�lj�$&^^���i�	�(Շ�0H��&�7Q��T$ξ׊�/�Z')�t�-Wt��$Y�O������R�q�N�A]~ܠ�����՞A�?���m/�P-�4!�<�t"�^:o��U �Xv�,v ���}X�#5��=S��\Ub;0q��
8A�p�����R���)`r��f�s6�z'��m�h�p[c5r��ci��(�<ˆU^�c΁Ѝ`Ŏ�����(ߠM��8�)�[������b�N�j�\
��C�&����zFҸD��hp8	?:�&�V�i�'mt�;�*���8I���,f�����s��y�������4�����(����A��gp�}�E�$��H7�쪮f��E&������eU����<K��b	�+D]��bc-.����~CQ
U�Z��y�ۜB�*6v� Rc��J�'QZ+Q鸢��l�}�V.z�J�foo~�-�ev�I�A�V��ER���&��2,�����T����-�|�ȇނ������V
?ۣ�K6�Y��2����%J4�Ɏ��{
���MJZy��fK�r7�9ZQ<��8*.�f���U��s�o\i�`������G��.���maa��iΥTo��5mN��Q�/����pH��#��}��j�h3_��	���z2����|/����w,�݃����:`��
�6T�ZB��q��rXm`�V�U#�-�����q�
��<|�z�쪤�d����d?��y�^#ݠ`(6UK��i#Oh�6;\��������><u�f��
��[3w9��(��o�	}�f��!AB7r��q���>�_�/��BL�G���zu��j��A�:�����7=�)^܊\9j���m"UEa_H����|��Z75y���kJQ�Eח�7D���o�B���n�H�+����E��j�^�`�$p�F{J��r������i�)���э����ĵ�_pM�Ǻb��?�C��dV����i�!^v8	��BT�ή)�菡{l���3XKlg����v��a&�щ�M�ΣF��:shI>F:���+c�@��ԥ�R`���ᴻSfFے+^���8�'��-D�a�+"�
�wZS=��=_��<�������C�Gf^�̔�3቙��
!���zy��ne�^[������M�ngWBheA)J>Y;�Uڊ�	��e���S�g
:Ez�5�Ρ7�u��U���v�cuɬ#��M��eMmˉi��_�kW������պ�^J2ҭ�P��r�L���T189
���a�Q�bȻܘ5��Ie#�����L�Y�_戾�%�=_3��=򋃹�P�"��s�#T~�}'9���/V5/AFݜ:�:�)&Q�����$�n��S�i_��F����0A�{8h���];+��d`�cD(S�H�*"9����H[�@�5W����ĉZ
G�����
}Yh=��>{�h0�W���PH�&��;��b��/}5�`����
��-��.�mm5�#cdW�jz�
�C͵"�s_��X�AvQ\���H�c��j'��]���]!�ǝ�������\�.�~X$⭖�c@�1:�����%u��b!�ۮ��W��vd���:�,ԍ��D�\y�\h�W��0$�kL���xx.'X�����ٖ}x~�5.���I�F��DoR������ZN`��QctYS��j{��f�	I�$�坲e����$>��}��1u�%�	�ҖY�is�k5#�0:.�!\� +E��>WhQ�����:D���)���H�g0Z����8�^=��O@g�?���"J+_z3(�dx��.�]N��Ӂ���j�M�}yx�?�z4�f�5�<Z��U�Z���(��ԈO�)+�I/�!�0-$r����)[u��!J��X�*g|�����D�ȥ��P���#��[x�
 _�	�:
=W���cdʑ:
�LA��ҧS���@ ��S�!��#�������Y���
7��� 
���w��A�\_�()����#T%��P��,�]T$"9��!�>
t�Jξ6�+�E�ȏ�k&�WNI�����hG�D��Bi=x�Ndnp��������F�]"<�?"�Ʌkv�SFsڰ�G<��m���O�?�&adWr�t���\�[���K���XI^.B0N��H�1���4�N�i��-�����IM�<�C�0[S)G�G1�!'J0u��џ�T����@��O��P�N�4Lk�j���k��<�:�{�%i�%Ɇ�轴����rU]�>e���u�ٱb������w? O,��q�c7KI?�o_��n
�|i��Tׅ}`�NNZa�ޒ�B�o~�V����~#.�E��Q��'�+���@�r��CirP�=��Ze��)�
<����2E��uB�H���i�'ڲ?]�C�n%H��b�h?�T@n����b4W�8�Ѻ2�dۨR�̛���O/����sw.G.g��B��Ѐ��S<8aŨз��~�:�0E���Y�Cq�9��0�گ�Y�/"(f,E g�'��I���ܯ,�Z@@�ٵS�͚z�#��Gr�"���궩�Fu�U��]ܻ��?�}GŽ�QbR郱2	�;�t��VZ��]�N�q[j���@;�С�}\��r�n��{W%�25ru�'������4���I�K9ҋ�+#n�:g�K���wݥ���g�zv�G�E^~'��UE&�#��V��.�W��5~X�X;j��Q�riW�he�!qF�4K��Wmf�Y7�X��
/ �jTMu�iV�
�R�"��%k���f!t�b�������8����p�k@��O����^:	{hM�-��45�:q�Q'��5{��� �
)�-��,j�8��{/T�nK�������O���p�7R��\?i9�9�:���]��FB�,�f+��-����cV���}�*\��ok�M ����!P?T���[J�L�z#�5th	�!b[�P���]ʣ��^��j�%�N�g��Vԗ�@)n���r��e��n���icUpNd�� ��%�����u��0�Ν���~6P�3Gz�>)��Ғ���ϫ��l^���u�P}��4^	���Rvy��^4V�(��=Bg��.�2��S:L��yf[`��@
��jG�̬Z��y�;~v��Ĭ6�e��Ѝ�+��+]���6,�)0ǜ�ǸO���g������g��Ǐ�G��|����>�쿗Ei}��뉼���%�X�N.�iw]�T�C{���b�����{��
V�ξ�f_p�h7%bR"�R2���C�Ϯ_荁Fb�wT��'g����瞊��k�?tҷK� ��>X�ý\,5�����_���-�`d3�͋wO�?}��)ϋ����	�g?���f��<@yp�g�F��޳���8�^:o�<#<�#{i�:�*��٧T5�;^�����U񦨖��]�4ئ��r�0�W4��5�q�?�A;���_���I��r����H&]��y�W��Ϥ������I�y��t~�t�c��AQa�ʖ�b�?�d�߄Gp�b�i��dH�tv�׏�~�ő1
��bKNm�Yo]$��d��:�r�4������W��ß9;��	�_\.����C�(	��@�*k��F#����
�D�j0��t��K�c�O�ii��1��m����5iA��$��9eB@�边񮌲�3
�z�	�F�����I���p1�')fH[���O����I�r�&ע�6��02.7�q����T]�#����w�n8	$`A�Y��P?�{K3Gi�|J�k+9fZ��N��vQ�X�&�+�:ҰG�b"�Ŏ/C�}�S�#����a��p)���AZQ_���s�`�����i��M̂����72A@R��c;<[�8�_	�/���E�V�:�"Iǿ��:����lE6\5@./����|;#�l��=4���8�f�@nN�ZQK�d����MiX�p,Ru�C[Շ��t�lk�Se:ʞ�}�i
��F��&�$�^��3N�Vd߾�:��dGa�/$|��2�����Z�qy(��Nv��q�Ն�	Vfr�
�~`; z���C�p	�u��y2�QRKI_~*�cLV����vӬ^�^v�f���1_"59+N�
�����4	�S���|1a܍ܷ^g�^�˞=�����__�;}����o�y��݋�0�}��K�F]�����"e>�R2���b�g��J�Ӓ��E�Q�Ws�y��.ی�WA����4�i�8��	Á�ዽ����C>.� 9���=�?�džSţ��rB��y<J�M��cƶM�`H7�aj�Tb�Nj^�2��
-|�Y;��{u�%�\f�26����Ypڌ�$J��,J��'�C2�H7	�=�A�twAm�x`�nF�6��Z��1�~i���I��9�!�݉Á>R(Z��PL�F�?G�SL��ZC�|�*��bG�VMAʔÇJ�����nI\짘c�4�9m�2��3;k�6n��_5�ـ��b6�JJ���y��/�j&E����bP�����<�P>*z��.�Cȓ�R�j*;޾	�dC��:��ēH<������Y7T��q=�r~L��L���+��J���sL�'�A�7y��
s�),��\�:���fxj�-
�y!'��b�掩~��	�����ȴA1VA���h�@$��>��#
�#�����}�B4��T��˳͹̝*���U汥�����AWL�b)?hgZ����)_�>�	��_�РJ�1��4�z�x�.v(�L��[8�͇cn���h����`��o^�{1y�����7��C@_328�y�\��г�����D+��������A��,��K�l��^���ۻ.ڴ�ͣ9�e��_t�8,����7��#q��'��5[�o��@����(�I���vUb0={��t*m@$�D�,��e��f�axx&O�%�*.k� �7��h��`9D�f�	9V@���k
ҫ<��A�wJ�^�u�����)3�n@���sV�B�ۥ��(��!��e0Q(2[�Y�K~܆��iƬ|x���r��qi�âb{4�}��-:M�,IF|��Ӻv����'}N�SL[�8伥���k���b#�9�0[M�]e@�(���5�xs��<W	m\��/j&�[J	�7�b]aa>"$ �j+@�&-��8�Xyj<�eq�#6�a��v��r 0���������Hg|n�2\���c�� ���h��žv�@[�����YK4+�ֻ#�9P�Q
,qA1�^���.K�K�-�%0�lkm��B�r䞊���C�Ruc��2?p*����!;¡�%��`)�2<w}1�b]̚�g��K�IؚI�V�r��6�HW��X@��_)�WWh��~*��'N�7�[�
�x~��B�Y��D�=/��E�<9_��'��m񾜏��iۓL�|�O��_�
&�fpN�7�w~�s�i/�
�T~L�k��Dx�J�N�1�	��Fw,�
��� È�>]c�R��`렄
��@��J�"�tJ_?=}isгwȸnQ��;�#ǥ\,H�*��a�Lj�QyI��
I�8��:�}sM\�S19"�8�8�q��T�.������݄a�*H=�I<��%v$t�����x{lv�荶$q�l��g�5�ڼrv���u�Zw�7q�5��b!8ο��tCL��O�0-��VW��0��vu�uW˧���ݒV�yc�-t?	��.����k=�\P��H�d3����C�~������w��IT 17^�lq�"iq�T�H'`�v��})b^@��φ�8$_�fT�HL�jT]+Q��D���7hU��8�0H��)>�O���em9j�j@i��h=�C�7�����JqJ�M�R$���fE���d�v���H4�Ө�mir̢�@��5���-��Ԩ�F�6��]"#,�]�m�If�2fB_O��Zи�%8$��p��ܜ:��s-b���X!8&�:@F}�7shᙚ�c�z�9o����N-Ɍ�PKE��Ta$�K2'pip/_vendor/pkg_resources/py31compat.pyUQMo�0��Wx�B%֮��#�v�$v�NU ,�$�SD���V|�d�9~T{"8V4d�u��[Vj\
�|Z����Y)epe��h(pY�c��ax&��;.?tŘ�H��I����$=��-�_�U"��{��h���t���~ixZۧ�������"hb�}G�j�YغZtiC�6x�'�y��TA�J�e2�K2���f�N���ب�B�
c��=ϳlO��lR��|�u���8�MUe�ˬs��R˘�"ϧ��P��ΰ�q�;� ��{�;�帘�[�e�\z��XIv�`1�����A��}TB���+�PKE��TM]�V�2$pip/_vendor/platformdirs/__init__.py�ZQo�6~ׯ ܗp`{3�n��Ų�HRC��D��$Q ����w�H��d'i�Z�������|�h4
>+�0ŨDs.PL)�X�@$��x�V�4bs��	�kJѻ�R��-�Z�a�ӣ<!
̤Z�k[�%�,
I4F��\�a</T!(ƈ�9
�2���e��N�d50'j��{;�4���uF~��3|���䯏���/�~�A����f1aeӯ�fR{b͝3HIz�rA)�����?PTӇ$g�S&������ڦU��0;
��9�A�t���
��b�,�"�!z{������ \HXhG���Y��o���3xwCЎ�c�?�I$���HTi�&]�D��gϔ����M����,�>�X�����g}�6e�e��g�������S|:���K�b��HC�K�����*B܊�f�o����9(3	PQ�gN�'(l��s���1�Y\�ȴ�'�Ƣ�K��`�+/�sV5��`L��'F�8"Z$( �F�p���^��HE�M�l�f�N
!h��"�bY�`��ƂgPzO����%l�8��k^\�G`7M�:p�	Iְ�3���BFR:AR	�L(L�/c�O
����fi�����Ѥ��z1A��'�S�%��j=5���$'��k75�1-��_ܜ�
	���a�e�U��Y�t6�K��!��g4����L�;�Up��W]��4R\�����Z�^�
�]�&�Ss�s8���6	Ss�8��zz4������2�
��<s0�,����'�)�(ݯJh�]a�vhZ��]ڌx6g��8{��W'�j�{C�k���p�7�lAtM��{ �R+��hI�
T��~�Q(���)z!F͸��U�����j9�b��TD�����\�ޜ�5]d&|�'�@�?�0a�{C�^
�GEJ3%K`n������l��uI�b��h�K����bֽ7��a�ꪟ�{�x��=
��Y�U�{J�ڏV�u���^5`��lP�_��Z��G���[�h���Uյ��`���:�g���˚k�<�_nmQhY��+L��+0�ۊ�O��m��&,�B�p���;����\_#�YkȲ��I��Ti��]i-a�	����Ufm:d�[�.��v�+VZ{�S\81&I�1���"}4n���ҭ�u��f�׶]*�!+�>e��O|�}��I�w~�Լt��r�}x=N��ʽ�<���
LW(my�X�LKl�mC8�.w}�����w��PKE��T��kUo�$pip/_vendor/platformdirs/__main__.pyŔ_K�0���).yY���AQ|S��
!��h����1�ݽI;i���>�sϹ�%�i�ƚ.tN0RY�p�M�A�	i��J�d{�k㖶�1N��sb=h���q/��8c��_�ׯPAF�y�X�g���H����\曝����jk��l:%t��t�j����]'t9!�
(.u�CyOF�U�sk��J�����Z�%�.��wFY����uR���e	��=���eI�?ڱ/$k�!���c�-,��"�L�$S5�Tvf-FxɊ^/��0&pMcAjH�:F?�iǭ�����[�j~���g���Z���������VԿL������!.��
/c�1F�f��"�PKE��TR"�si�#pip/_vendor/platformdirs/android.py�W[o�6~ׯ8P^$̓�(#1��2�I�vCWH�D�l$R#�4.��wHI�ǎ����E��}��Q!EIR4��4I�U���B�W���	Տ$�Gj��˜(�i!J�[(e�d$[�v]�j��bF��څ�Ԭ��)�.��ΙT���y���D)8�,��S��}^��_�%�E�r�3
�u�����R�ZM㘴�"�IvK�%�e��I����/�fi�[rK4��(�Q�$%u�I���.��1ID��:�Y�h���
1�C���������R�T�}�ia�IN4I�X�hY�����-<��TR��O���R�K�@3��5cj4ZD�����T|l�Y>��kD�,��+.XIU||Z�W6ϴg�Zw`�����<��  I�a`j!�h'�t�$�(s*�0��o������d��Db���]M@n��t���FR;�/�bw�n��m�^��6פ����h/E���,��v`�L��l��v��ϵ�nF��o�F�i�����[�:�N��P�/Vv'�m����[U��+�Xxy��AƔs�%�"i�&S\���9���zl�=�EM�N�5���D0L���9���(�,���bM<�ì�D�T�k�\��2�
���VMi����^�A�6�:�~+��K6\����U������E����N���Ƶ�AE��JO�Bϰ�q�uD�7���V�Q0'Y+�i��M�~8c�L��an���0h�Z�t�عi3iX\Pݦ��.0�#��z���F9Uۡ�)�}7Z���sBg�kz�2��}#��E��N�M<\�C�p������)�t��"���Z؁�y���۹��t�D�hz�y-A�<�ZÅ}�8>0���A�8&����„=��?'l=�LS��c7zm��~[Ɂ��f��0"��E�.i]��͏K��D����a8�Y���؊Uu�t�>~�P�KJnݬ٢c�Πa�{��_�o�W�h���tk��}�c����/1��\
_�;&7y<n����V;�����pqo*��nO�F���8�p����ϷW�?��"@�����*d����$�,��>��w���/PKE��T	Vp�.pip/_vendor/platformdirs/api.py�W�o�6����~�Wn���4X�b��b��P2-Q;�H�����HI�Lqb�0i=�=>�=*�V%�qV�Z�8QVJ[`R*ˬP�L&�7e��4f��B�NŠ��87V�Ė��*m1�y!�w�S�Q��;�s�Bf
.����9��-^B�٦dK�
֚�$�~\D�TBnB���r͊k��'�IR0c�`6S��$�A�S�?[��/^�p�W�9���Ю�P���
����&�V�A�3TPHa�x�~���E6�f��$+�0�������}�`X���ԏ������e^Ó��b%J���R>u���e]XA�t�Pp��?�ѵ�eJI���3ˁ���}
�h�!�Ӭ���9��l�����C;]��a�4�g���D����X�g�P'����u
#x��������~/D�1�[�
Юn�S
�Y#�R��
,��-u�Z���~���n��V��|J��VҲD�������3�b!R
�Q5��A{�N[�\��VB*l]p�B3��k?:��xD�!��C^�KK��)�h+�ԓ��–��]������S�{[H��6}�8�v"��5�M[¡�%�rJ��&�?3
���[U��8�3�]�.J�M�����W����0J�G��9z4��x��Yַ+�l�HZm
V@�p�I:{R�`m��n��)ٺ�8����D���7��w+���m���j#$L
�]���p�[[-˓3F�H�2*���W�Y�壙nI��۷���mz�%z�z1S�_���	)�.G1��V�������}���[���g!�{��"ɩ��������{�*)����X�2h�WK�F𡡛�Zm�d�;��җ�#��vK��ۛ�:�ȑ� +؆6�9�)���8�G
�YQ�-�ߎm��WL�3������~�{��a3xuI����4H�����ݬ{N/������t����B�pm�<<�cgNߔ"�#ߔ�-��w��6¬��w,��k۴�oNA9j���?��wI���[����o��Q��e\v����&g����m=Q2���[�3o�iz	��d`I��r �����[`l~�}��#�#�s�*��]��m��f��`E9�<��v]�l��F���|wQJ��C�h���
=��:�f���X>������=���:-�^�M�׹R�<ͨ����ZG;�Qg���Í�Cw&o����7��:�;��&{�]�܂��l`���PKE��TK� |_
!pip/_vendor/platformdirs/macos.py�V[k�0~��8�>$����Z:-+d�1d�>��d�Hr����H��&��Y!~�#}�.����8/:��d�j�@4�v�I��(��4}�D+��Ц���^���(S�Zxٗ�d�w:���8��{�\̜6-P�
���n�����kwZ)��L��\4B��^��B�u��ج؇:W�s��%I�Ϩ�����,�u��f��U����ɝT� Q�oKn4Uk]'T�YN�F�F�5��D�0	ڿݾ����U�V�@�A�$�E�E��F�Wm�Yd��l�R�#�)e����g4�ȏ�#�)[>>�����W��'gx.��4�Ģ*��n֙U���AZH�<t������T���d����>��̂��Z����^]r�3M�a�gU<�	�M�_��d�GM�e�p��-5{��p�x:�g���`���!3����v�,Fć��{%��3��)z>m<,� m1{��_W<���俤>�#�]�9�W�Xd�豧�{㇜+�U��Ŗ������b�Ola!�8,���@����uG��B���"�2��ڱg���v�����z̑�c���z�j�������{Q�g�}�wCm�qF��������_F?��PKE��T��� pip/_vendor/platformdirs/unix.py�YmO�H��_�2Hu�`���Zth�t@ER�$�K�N�pv��
/���~3���u�Tj$��gf���;K��DQ�0Ţ��y.�!Ti��R�^��'uu��t/Eʼn)��Ti�*�c{WH���2~[	|����I@s^�ΨI���p��>ò).��@��~�f�{�G�?$d��N�tH�$�������d�&w"E�D�$yƨf����)g�cp��Ǻ#u�̔�Oz,�lس	K˻~�.��>���_-��sv��T��gr�%�ⷌ,4�/����^�7ɨ���R�²�y�殺R�U�FR�e�#��_'���-ኌr6!�f��z���O�Z�b,a���<�j�J(�|9��6��̳�8
���ť�]W�3�x�Ŕ���8�KD���J�9��S��m�ta�=�9�BH���(	$�.2�L`)��'�SA���.��י��TN�y����5�ԛ��<�&�U�4�1X�EPJƃB�k�e�R�֜Cx���n-[k˜�n떒�qP��^��+�3e�j@CVT�PC#0�k���ڨ�
�3T�J	��5���n�0��L��� ���zu��d��en�HU��}�rtr4>�>_���SX���{h�F��{�1o*�Z�8�j�(���&hצ�a�9	F�{nX-�E~f2��w&�a�Ge>��o*����p�a�_Bn�lY4�!���p��	�^	T�����U���c�Qb-�Dx(�s`"�B4�ҕ�^&�<�e�5k�%��� Z�?�Y%�Qfmn��kEN��ߎv�{��)��TMv!"�R��J���r�K�B¾5q{롊�Y�#�i����v�!�r��(ʸ6�[�|�q�7>��h���dۚ��~;��f��?�5]�����9��s7�	kB����d+���-�[�m���ȴ�pW�=���x�ig4�2�[�-��9����g����R<��$|L�"l�,��l��l|%��*��qS�S/�F*u�v������"�GǟOw��7;��^����l]���F5�r�h|4�]Qk?e������drk�ˢq����ΈW�(G$ˀ8�CA�"R� ܼ�x����<�ǥ�s\��T��jbs{L�B�9Y���*�n�>��7 ��"��Q�!�z��,A �w�����Ӌ����k�B
�fpy���hg��[%��jV\� u���*:^,�*N��-f�֥�!Ȇx'�yB��<u��b|v~�9�Q�̽~ܩ�y���mxy�`��[�/΀A�x�rw��ĝN���Ѱ9�	�;n������c�`q�έ�5���j�i�Ө6f��#�N��!��ᥠ+��7���P�E�4V3�ɨX��GΖ���f�HGu��%��zuc�o�W���+�*���*x�l�^K�w�ə�ɿ-�
\�tV;c��́�i�W��g, #�Hu
�|��x8��y���vԖª܍�-@.�@��y?X���S\�J��J5���.�oc�m�w���hޞuC�
�p�dt����$!)�c�	Γ��ݺHg5x�0-����H.��eX ��0��O�k�����X�>Dvl�
���[���h��5����b��L��5ػ)9������=�7Éf^~��𾲸]��Qœ0��/��kߺ^����u/�h�EpF�x��M�?PKE��T��<N#pip/_vendor/platformdirs/version.pySRR
K-*���S��K�/�M,��������� 2��
�
JFz�zFJH� �`)
#S#M.PKE��Tjo��Z'#pip/_vendor/platformdirs/windows.py�Y�s�4�=�.���צ�-��c��_h:��ՑQ�2��6�wޓd����^o����}�ӳI1!Ae:�,��BjB�Dh��HT���B=M��߄�E�eI���U��,i8fv�x2�7;4��]�jvӧ)Ϸ.c�#!''\��;�Z-��R�O��Qys��v��O�^��NΉH��IF� Jx�iJ�TS��F���Z����U��N�C)������!�hk����{���ݷ,�*S���^�x�k�{��`�Ջ��~�`��g�߽�A�g�)�)FDD4�`LB'�|�:7������;ʣA�ङ���-��T��-xe�)�`�6s:ʂS@Ʒ��(�>�f�H�H��S�)�P��O�8j��� ��B���xnK`N�6����rJ4gCD���l������^]^]�~�=���?N���wEH�~��"���4J��4���H���e��zBYjrH��ۓnp|yyr|}\'<"�<!�ŀBGԽ��HQ)�c�$��O~�o�t�ȓ �I�hl̬�!��0�%� �R+��"y�M�o�m�_�|�$��3f��_�\$��?��Yt�`��X�]w!��m�R�`�^S�P���<���,�Y�|�g���ea�y�+q�
6q�����H���HZ�c$���$�L��C��@z-{cUi+������՘J�黩�ge����/��n[n˫�\R[ց+������yQM�ƊE�і���kۛ��*2�tЊ�es+Tk3���e-7U�l�@b����A�Qdד�0��-�fJ5�=r���}[��U���s�Oq��F,�Z�����'�֘���uc[}=���R$���@7D�؀�E�˿�;16�2���=t�H�H\�K��r���/=0�PRj�uT]_n��D�MX���[θ��\������uE-�Rj���wq~��2X���';��)��k6IWt;5�
��Ծ�1X�V��I���T^��0�0��F���ϚoI`�R$�8~f*?�*`&��s��6!���Yc��sVEhe�[6�,�pS/e�~�!+��J繳�|�e�:�I=l���
&H���^�{���L�0U
���RFyL+6Ì�����r�`��p*��^T��'�1!F7��8���6�)���t!4&��F8���+��2��e�3CL���5��l��ӝa��3��cp~)�h���h��|PM��>y���@Ue�a2��|��C.tIXi�f�D3s9aԆBb���G4(A�MM��~(?��Ucǹ��`�6�m����H�J�E�b�[M_*�%LJp�ƛ���'��U`�=� �tϦA��_@�|Ǧ�{}�������:�2nY�H?��?�o���� ����N��ӧ4��~�"��S��^�=M��9crj]{��b@*��
I+�����<ܥ:�Hmي.n���5�k}�n/7���:L������DwY޻Є��(�%<C�^��^녵�0��bR��lY>8��N��_"��m����+x�����PBb3�S�^NG���4��/4�1�,��
rZ~�
�Ղ���F�YO�إ�&:��|FN �?���c�3�ز�`��Z�1���9�K׬`�&SOȡ6�i�|i�[�c4��%�Zۇ�	w��	C��ڇ���u<����q��$FFu���Z��
VWNA��`n3��_���@�6��n�y 4�^�U��^
!�"3�J�!��};�<�,��!3�ޤ�2�Y�K�5\�!q�nCT����&�I�?١�L� �[��F��q[�PKE��T���T�� pip/_vendor/pygments/__init__.py�UMo�F��WL����z�C�:��b�(ҊI[�Kz?,������%)Ku(Z����7_o����v]��&|��=�=IC�L��x��\oJ��TkjD� �L[-�eER��nj�E����kV�e�'ִ�u4���a!ʒ�*�+2��n��g\�!a����f,W&��|@�vH�4�̅��2d7’b.���h�V��V;�3�u�]�)!]�Ә��H}+&-�D6y]U�����*���5>�J�n�4��\t0��\�@����!CR[!K�!U�Y��G'Ji[Z�Ha%$��j�l��C�o��A!$��{ԲjR�Z�O��v�q��H}�2,[����:�kqϿ���CJw?�����
�
�B�?ή�Ԁ�Syws7#Ï�UΦK@V8#�%�i��V?.�b��.�s0�r���sϲ,���M����-�Z���8��
�b�p%�g�T�Y�}R�rB[i7�X�O����y�O�EGi$0uڵ�6�6fzr��[f(��<v/B���'"�M6ox�>3��u�j_���tvz�����ٙ�X�[VˢJ�s�w?�_�~��"V���)]�}�׳��7w��E	��ta��d�A��Y
N�nS�h-���h4�?�6 �|N甜eoϲ�u)
���.�Nsa��&��
��I��IJI��o�P�/�Ѩ���دh��XOb��:���g����~��>=O��NCQ�p�r5Xo��"�C��ػ�l�v=B"�p��sn,ݷ
_j�����B�h,M��?�-zm>�~A���'N-��������xU|���s���&��[���$�MMm��/;z�<9q&��6
<�4��Ow����d���3�W����s�$��~�KaL2���)0����'F�z�Zɒ�ojœ)�jZ����AB�Q-��������`?(�إD	�E��s�����}��
w��걖^t�L���+=���rni�����@����O�K�J�C���2�� mﴭ�T�U���O�$҄��
��E?�.����(;V�C�z���	��.�f����{�O����`�/bN�	{����u��KsP�_Fڋ�/�l�d�վvտ��;���k;�K����-�(���-�ލ��{�����PKE��T�6�_�a pip/_vendor/pygments/__main__.py]O�n�0���h�Com�A���YVl�`= �A���+�i�p"�wG^�eR��k4�Z*#Č�^���Ā��U��`=4��4Xk}qk�(�ֺ�U?P��ʢ�[�EY�>
gJ}��?k�،�E����qٿ�6۷z;��!I5β��)�'1����)�8��痸��Fe��);c)X5�KZ�'E�	_M��1��Zt��V�ng��qt%���PKE��TjN$;cp[pip/_vendor/pygments/cmdline.py�<�r�Ɩ�])�
��J%�0)Ǒc�Ȓƒ��RT4ID ��I��|��؜szAc#)[�s���ξt��`08`�Yo+��WQ���W�s@O_e�U�F��8-x>B���q��7y�Xc訾���Ͽ=?:b�
+�����X��������7g�/|9M�<|�~��Q���}u|zq��Y�"^q"�����Y^�L�obS}]�E��_A�X���<[���}��j�x0��u���w<�������А�8K�S�-����#z�$�4+^gey�l]�D�y����Py�.�K<�dQr!���ٿ������� �6�)4�\z�i�d\�o�~��<�u�M
��� I��G��t����ʀE��ID��9�n�n�39�<Nu��Tk�	�/�<�Ci��[���VAQ��$��cO���j�#���={��5i�xU�$��]Ѣ[�ڠ��Ц_�H4�y-5���ǡk�9����L�h��⤓p�F�~��O�����O%!黦���A��lJ&b��b
7�N���-�P�	��?�W<gi��z���yQ�)��gh��X�Vg{���V��YZ�i���l
v�P��I\���M�"�+b����q"��ek=�|S"�����@R�h����؋a���;W������`?I��Zv@�"��a���"͐�?��]���Ě\(It�\h����k[4�ݢ���k�h��i��cZ��ϕ�+����0nsC-��O#�U��~E�]���6�ZS�����@S�<[�-Y��ˠ��X7�;�Ʉ9dڝ�F$�o��4_�'-���,K)�\05��q&�o�\�2��g�Nk4��4��.��7�fܓ�K���e_��������@����[0+�"�J�-+��H�0����R��q!!����yk�u�LbQ�|��	�\x���1�T

����2�!�P&�TO��
B�;EKPĚޢ(�0��gqJ��/�"�i[f�Hf{���`��Usa�!>:�t�:�m�a
I_�v�>*F|�q�!,�sb�[�O���g<��v+`sL��A�1	��G5y���=*�p;�PU�$��G.�DY��M��.��s�6�_��M��O�d�0��$��8��<z3�z�=<d $�N���$QG��#�Ġ8u7-.(����tQB��݄h��B4��4��E��9�r͂GӸ�+��@{�0D�IQ�ו	G�s��ڮiZ�L�Q���/6k.v�g��Jυ!��Z��(�w�j�v�6��h�3�A?�֭BRR�JRH8{`HWُ ߟ`,��:"�IJ˒� h�6v�ؠ��A�
�.bJ��|r�Et�BC��N�t�@�AiҞ�O5Z&���h���\�]��c*:��b(m�*��i��<w)=����TT1)��1���u��<�#��O�sӧ8fkV�q����뛸?�,_�r<��1_���e4��Z�G�,q'���rG,����)R#�,M6*Gu��l�#� ݸw$#���(%w@W��'�r���-�l�ɽr���1���F���ltrsS'�	�BK�f��C�Tp�4�!$=�4<Üݵ�'��~E���(a�G�sb��V#��c�sݧ��$�+q��~T�LJ��{-b�/���^9��~v�-$�$�� +���ݞ�<cI=mR*-L�>�nS�rW����v�_�k�9�f������O���&���v�F�ɾnܖ1;��v~��1I���Ѭ7M�z��mh���TR���RU`�O��b��]�(��g�L��`�3�v�̪�T�6��$~g��]]7�9�̓��Ɓ�j��q���a���,N�{6�wl�ZX\�4�}ܶ@�c�'P4��L"~[�FP��>D
�S�ܭVӦ6��]o��j�5�6M9mj�iEL��)��m�#����=iu|�������_?R�_5zeG|���4&N�Y9��Z9�\�[mI��:�ta*�b���ڒ�ڑ�?���t�]г��,�D�];�ymļiQ���̕�_¤���oO�?\�~{r�taE�ٶ�+��JOd�;�U!����%bx��Кo�d0c஍-x�e��B�ES~H��S ��M|��q�E\BYX�w<��(Ђ�B����b�{�1�ú�n� ���_7|��a,ea)�l�\�+tO�d�T��
U"-�GL刪�@���gY����J�'<,��H+6RBw""bv��}խ'$����"�3����H�0��H�LΊ��@jG��>�i�6�hS�_o([�X�SMH��x6۷�UG�=+61��1w�4�s8��q�_DR�r	�)�Rܒ�ç_��e�b���� �bX,���j�����
��l{R�zB� ���*0���Nh������~,�PvU͸u:w�l��:��>�	�!x�-�����Q;2B��m]�c,l?B�Jb���y�Psk�\5D���nax��S	R�ERJ�KM"���ѦMt97	e�Ʌ�"�A8s��Z�fT�5�y�tI�>.��q:O��5p���1(l��ő���3��?�m�+ac3�TL=��r������tQ�@L��hKnu�k�f=�����?C{[&��=�)���L��*����%�֧�FL�v���V���m`�^�$
�G�ޏ3�i����e��T�D����xi�4�`����x&M�F�k:�?����
�̑Ϊ�]]�$�����f� ߰vqr��� -@�m� M�x����s6C�Hx��ɐ�U:�,EOb�SBX��S�2Hkp��z"���*6��9�$�Rv��
���t0�'��(�~��S��ta�8��c�<nl���d떜|Z���8��m	�
�1���j�Ouu�s��h�[��v�ȷL���ũ�H��*���'%�����D�^&���YYX�]*�N�����qG�e&�s�Ʋ��֌��$�c�
��"�q�,
f`H��V��_n&��6/{��Gs���� �|�'�
ފD�g�c�l_�ϒ 3�(�S���������W�B/r5FW�)$�����NF�0r��Hw����24FG_C�(>O��<K�A���wx�<����u	e[P�m��휪�}UᡂD�#.C9�F̢Mا���V�q�lLܡ%�P�2�����Za��"V٘%��&�g.�Ewа7����*Z�bxT4���F�a�ӷ��99�Pw1��a�dX��@�9�A�!Q֙�,�
B ��	�\C���/~���#��p��︗�~;����@�8’8L	_�Xcܳ��W���,�b`3!�ԹH��$E�tB����a����!��Nh�n�ɀZ��21��Ҿ��q��4.� ���`T��i��i���d���Bl��
��E|��9��s[zmf)0�� ����=��%.x1y���	'x6m��*k���$�俲zl��U�r�E�y�
���Y���?�0u�|}�Q�5�8\"�h
�P�D]gU��8��Y^��'\f�cH�(���|y�ֆ�� �n��V�8F�nb���!D@
�����I�X'|����DWϫ�y�����.���Mg����g��>�	�p\|f��Nh���/����N�fP*u^�����!��cu8�Ȣ��R>4IS�:-�%�>�<�*�k��3yw{���v()�\m̸|1&w��Mk6�;í8�Le^t��B��	UQ�c���������۾a}�*
��l��{�Ֆ�-��S�T��S�e @,k�̓R,���h�R'�3��*Ȕ	���eA���y�.���Ω>Q
����*L���c�9��͞N]u�J�������9�‰ɑ�V��TO���hP'/��GŒ,�����j��d@������	AD�W@\�JYL(���~��"�^t�?nQK�J_��L�⣨��)�
��!�A����>�"�r��5;
���f�> ���ے�F�a/+<��k)�2An	I:��%"N-.�^�$����"�U9�hԸ�9�˧���������t�g��u�T��򕲘�'2�M4zU%���4<��j����JU���#[�"��sr���{k3���\PD��v���Ϙ��%�e��P��'���Y:�Ҫ�ۑ�Ȼ�B��1 1�f�J4���=zh������!��vM��Zx�T?Ȫ/H��X��a�	�4aK+��	�c'�@��1���G�!�����6;^�=���j��c�-�䍺J/#����-r	�)�[�����eR�B����᪰%�SJ�qJ�r�R�༆��w///w�\�;	%����>M��Y�Cn�\�0��04�PU'�ִs{��t�f2��������T
HO��}b���<;�|{v:���+��A䵇�ޚ�
v��*�A��|$82�8����no�f$�z�A���s���	����-&d��X�a�%7�SἏ
{��I�"1���GR�
,#���d%i<�	M�{L�TU30B�M�?�p�Ҙ,��
�f�V��^����H�A��F���,�EHHs:	�ܭn�-}�4-�pQ�:M�����ppK��~(���`�٨A�']|��oό[�Ί��w�y�s����Ma��!��-���ṪR��ܒ50z�2Qo�����:r.@���^��}��*Fj�OJ�x��2��א����Rv@`�{�
�N|�mX��K�
̣R<����V^��tɓO�*��#���u �'@����!���;���A��y�aO��R��
�*�g��nT�zӥ�X��@�T���#�l�����l��l�ُ1�1�]��Y᪎��I���a�"9���6x�<�X��@RE�� �"Y�Q¾�oE�K	MU
�d�a�=�'�����aM{NA�,���G�ML;1�0�OU��f���	<@;�ZM��2¸
��݆���A Y�2+*���#��u����e@S�R4�#�
b:�a���B�T��/�^���"8�hD7�<%g2�9����S��s��I�J�{(K/ӰB(K���YP��*S���X;#�q�jx+�.��$�eD�s�M���K{)L��K�Ն�j��-/.�rr�Jo���4�T��D�=d����t�Ί*Zi�d��ș���.�E���#�q�HՋ�I�mty���	�w�-~����Ұ�D��j4j"��5��!����zIg3CRmUv�(���q����@�6R���@�Pi��jJ�=������vh$sG�Vyg5C�S!#ٙY�j&�d�;�$��2[�c�eN\�z��ZZ{ 
�[�m��x��*�4炑���Ph�*!ݏ$���M'�-^7�V���β}T�-]W;���7M���U,v�_�\���vk�	���l�;�%}��}�^�e����j~�BX�bPA�f�1Z4@�����Ϗ�I�5ġx���[?n�%ݷᜏ[����Y��k�V͗�j�ab��Q�sc�7�`��S;x �-��C�H&��s�ʥ�I(O��y�b��%ն���x��c���)Y��*��Z(��-vȾ�zGU��3-aYH�a��il��?�xQ�("�`
T�B��cU��"�X�R>�Ō����]�Z���r������_�Y}���w��c(���%�ϷU�h�S5�ל��Bթ�{�+��)vu�+�+�P����n�8S�b��}7a_�
2pU����;��f�^���أp�/&̡�x����_�!a8��7�K<8� �z�Yv�N���������춏0w��5������`Fn/R�=��Žѽ������U��PKE��Ty�.��pip/_vendor/pygments/console.py�Tmo�0��_q�4%]��vc�2��!� �Jպɵ5u�*qh3��$i2�����^���|w!�}��*E��a,E.9Z�Gdz��2K��Xr�ad���:L�m���ZEp[�0�˳q8â�F�Xe�4@�/�|~���Ѕ�,F�c/�_9����w���`)3HPQ��G�-<�c��u?ZL��sm��ӉB��Oj5���f����u�5{B�'mH8J��2���3WT$�%���_�3�v�B;7��S~?B�4u'4���h��Mo��m�Ye��%r.wFZ����uHJWz4� �
G�%�z���Ď�I��*�S��Nm%���J���J���g�fJ����г;1L���fhk��^ds�n&�&����	�[n��;����Y��70ҝGn�4��SU���'Ϡ�`�UTe��L@wC+���0�`9��f��Q�Tj@�s4(9[�P��NDR��?��|;��@]=:@�Lr�"�lQ(̣�k��p��;S8�꩕M��]�fVn��cPߪ}�<&V-H}}��+��S���-z��n�|6������C�ݢH�J�&�e�P�Eg�Hr�dݑ��1{*G�֧�HE��2����U���_�~�L���~PKE��T���n�pip/_vendor/pygments/filter.py�UKo�0��W�8�k=�` ��>�[7,�YQl: [�$7��zر�P]"S|~��L��	��656�d�������~Se+�[�N�7�o�+�J�E��B�Zl�6���
W��/�.��`}�?b|���"\??}��s�7R�����6�}��{\�A�4��\H�M�T�dB���䁅\Lb����w
�^<�繏0�H<W�0P�ݪ�
��7 Ȗ��|Uu��ݛq!2x��s ��lf\�{�K��do���H��‡�(�����Ks���t%2�X�Y3���s(K����O���{����@4]}GgAo���m��(��0�'1pu�-JsK�=�
ռ�&p�ڦ�B|��AL(�'}F���{�)�u�
&e��eJp�c3@����Sx�E�B���jg>f2U�pjI�1��A������)��c����16�aCԶ��KG�t�_��+��>x�pt�A�gN�)$7B�Ӗ����:(��W���l]
����웪� -�̾�ԑ�G*3��X������,����vt	����h��Qهnway��r��1�&	?'��^�k^�aQ�U6�bP}��9�x�m������^z3�֪�[QpI;)x7`b��J�iЧ*�uA
윚_BŽWJ����yWsD����Ɠ5(�w2i�O4�ٙ�����Z�M�'4��W8<������l��fo��N}��KI[)�R����/\G����ϰ+'9�FCb�'�PKE��T
�4��e!pip/_vendor/pygments/formatter.py�VKo�6��Wރ�#)P|覻�ERl��aȴDYl(R�#�{�o�̐z9٢:9�of��j��<���	�]��q�^=��N�Q�U�;Wī���'+���f7�_vuy������;��o�=9d^�n˜����}�/�%+���f����}��x{���Zx.�\A��zc=�L-*�e�5�e_��B��cv�KŒ�Q��`�*M�C��n�D'��Tjމ,+K�TY��� ��,�E�Je�S�Қ~7ה�l�tR;�u�n Oo�5>V�`�k��N6���I�`c��*U���gatμy�e~x�2��S�z/�����u<����~?��u�34�_q�̃a��*��=��p��F�5�Ã�6Y��M�n�GS5��(�6��P�Nj���Y��&�r�fS�B�&�>x�h��+V�*`��L��94R�+�!h����hh6
1
�.�
�s�Z�<��5�4��Ԩ�t�(�,�+'6C^����1-h�mx1#��3ך�j��fԮ8Ր��g��|�+4L
�j�(a���S=5��_�E*����f��8�S��
��8���.��αPF"=��Za+�
 �!�+b=���R����ʪe�q��B�'�8�	��r2m���BO#?���G����A�V�@shq�	�bG��l��4�f�KH���-DT{�W��!=�J�f y�LF��<�?��R�I7����{
}5�fl�����6fY����#O�3�d)��e�Ƒ۲��
7cC��t�K^M�0�:��|��T�|�Y���0X-��O4�K�8{;�pG��.?�G�La8ꨡ�Gm薥�u~�9�S����g��ľ-�{(
��g�c�o�.��B���B�<�<�����4���YH/m$����Ӣ�7�Z���.�';l3|�����M��H�a��*X�%��SZxq��O�Z@��5��
�G�|i
|�t�k�s�Y2�43H���Y�H�Z&�I%��0�gn��� ��lZߩ�x��Q���Q#aJl�L�;��;�]�j��﷈��������5	�S/���fƎ�%\[bw
DMt�A�o't>�by?�=���/���]م� �KߌEd���������sh#�6eФ"��f�PKE��T��\!}pip/_vendor/pygments/lexer.py�=ko�v�+�J�t���<p�V)l��5�G�mY Wܡ��r��]Z⽸��=�y탤��-�.��Μ9s��y����葂g��Y颩�\��~���yD�=Kj���Z�I]�:��E��V��m3U��G�����'gO���jn��Y�Q�NVUk��~x������L�-tQ�z��G~����o޽P˲R�n�,�1��G�j]V����Tok��V�ѣeU��:[dzϺH�*��\fy����z�og�[=Q?ч��k�F7�yv��	=ܷ)?���|QUe5Q�}3Qo�B�e�[�߮wA�4Y�]���\�����g�|�H4^%��,)�|['
��Ӧ�Tot]�R�(�]CW�F�<e��q�G�f�$�g3u�.G��KF5���o/������u�o�&+n�'�T��, �ΊE�I5�e���*7�?oj��۬nAK�2���宬�zt�0�L:�V��G���5��$����ϣq�j���K����i�͓��ЊZC/�Z�nڞ��e��{�
S�ɼe�5L�n�䋕nn�4ʓ�u����:���@��h��]�G��4�H��@]�n�l�r��d�Z��g]�^��e�.�|�xD�>ESF�~w�-nU��%����P˼L�9�7(s�&�f�B��f�j�w�D]���/��O�T#����i@��2lr�jm���flA�H�xR!�#K�K���w�����z�-�byR�l�[�?�V��)�(o��Zf8��M���|>���_@�'�*)R�T b���׵"Q��;+֛FE�HS����q�Æ�����ent�N�5��)�k7��X�D^�)���8tA�Ge
0��Rg
�ɎM�v���*���r%Z�f��feF@�wYm�8V��5,C����N�y��#��I�kX��Ku���%��T:A�#�l�����]��̣�����ԍ��0�2�-c������mj �lQ|dG{(�C��T����X� 	�k�I�@zyoaIO7��|D
h4�OD��5r;(�\��:���Z�*A�h���
�9z����S�,��6��5�FT,MA~�p��J��7��ɔ�:5䅕��-��R]T
Ѿ%����
�]�K��l.\
�7o�Bۖ~ye�v� ��~
4̊?R�M��a��M�؀0F~�L��*�+�L �����5o
0q4��j��L��A�A�
t}����vF}[�\e%�xX�����)�q�d��'WI��6IQ"���A˷��ϰ.)[�`��z)2��r�?��)
|�za�k�Z+����Hڂ*���I���F1��;���,	CF0-��$��z�z�{�|�Yd�%L ������vt;l4V({��!c���7��b����
`oB�����P�h��b�Gl��L�ו�Lh]����`􏡧U�'��N�F�DP����І�}3��X{�<>Bn4���ZX9�x�$t��Sƨ��i��jF�n��DI��;o�+P�LV��.:����Z[�=.[ԃp/���-�Q���M�?3�KR���ض׺��`��g�9P���稱��Ȋ�����'��%�R����<o����������>���%7g�[ЪP�we1j<ب�T�K�T�uG�m/�+��ݚ��uV�U���ը�����J�5\n
�`�Y0L8Ŀ�Cf` &���"P`���� 9��E^{�}
�AS`$6]1Y5�Dp!Jb"�vӜx3�{@���w0^�Z����ܣ��,�Qօ�$�Ջ�U�%d
DԲ[�@l
fj�^�����_�q�GW�uN�LDQO�1�/�|�h�4A3�Q��A"��
<��׺Av���kg�V�"�$$�v��Ti4��*F9$��}p�S�
�(���	�I��`�&7~ �K|�X7���1|�itn@�hrDV(�xl�%��Jq�����iG!0�n^$�Q�X�p�����vħ%21��imG�_�u�^R+
~!�~��'��F�K�R��d�М�h�U�LH�g����8Q�i�ӯ� ��H��WY�|

����0�^|"�����=U�%�gjl��k�|]�&�$ ���V?�Q���"TM�2:0��!��,{�pǙ1a)`����ƃЮA��Hf"E�)R��
��`��ӏ>`h��a��6����ɷWc�����y%��<�R›~�&KV�1�v��q��n[w^�@t��a����R/����� �p͝����a���6>�fEy�g�c��?H��Q�X�
��:.��x_�N;#Z����B-"�*�{��l����0�p�4�;u�Yג��F��Y���H4�WD�"hu�}B�,��v7(��(�h\g��6��i���j�l3���0�3q��V���h���k����I��N�����[�l��0K�}��[��:�V��!�#�2m벦��	.qb
W5�2�z�u|	��\K�o�(4�c�B$���M�^%��
��,F�lR�I��ߔ�K3�N����V�(��r�o4�'�ݕ�Ѭn6�盛�*�)�U�25q17�C��D�ff�EJݐ��H
00Eg��:B='*Y�ށ�)&>�Sb��d�bS��`�:����/8��9
d3����"��N4�m��7�D�f8�L0����
0mr}!)�����
���@�)�e�##���}K<��l�^o�}+�#g"�!	���	��T���ƪ�����1�Z�}'K����F�s�N�:"��d��a�o�
ͷC=��������gQ���>4�/����9���ǐk��JZ$0#x�N��<;i�n��ѱ��W��E#j�ͳ���4�Q�\d�,=����/Mx�#f�&^/pU��M:1�����,t�-J3I�O���Ѩ��5�#6k]�p�]�\5����h��Ff�ru�!��ـ*�b⚙p<G������T�c�yuw��Y���ù��c�����5F����,�����?�z���1�.�S��W��(�_�j�0!%�����Y?q��m�>n��^\0Q56}�@��;���@��(��Q}�Pb9<}��U/�0N\ݴ��YA�P+oJ�&@a6�ڳv�ָ����P��qnn�������D>��x��57,l���.H��Q����ɤΉ��r`! #1p��D-��6=Ei�(U`Ab|3jmC}i9���eVl€��h�G�}��]eXJ�4	U���%2��^��kv�
�7C1�P�t���1%�h�1���185vT��N��`6S:��'�h��\Q�pbcb��4*7Ы����`;gw�Ѧ����0��N����wX]��
��\7��T	B�b]d��fjAyS�l91&A2���1�N�fѬ4�ħ��;�XO��Ѧ�'�Ȝ*����Io���y|�o���#�|�����@��T��Q���z��C�η2�i-��:܍W���NI�a�
��6�g�G$S�C��~��F#4)���FR`���Z��H�
�`��ƪ%�*�ڔk��+�u�[O�OT.�P:�h5祚s5�XFv�5-硜�if��� 腅G4(U��[O-CC�
xzI��r(`�D�꟰�����/����tjW��v��7���J�0���1��gT�3{�vp��f@o9���22ɬK�UH��Pm�;�����\�
c%�my�i)��� o���n����[.�����@�kI�T����<2_e�Q"YF<���'a�Qh۫���t8�/�C����"J3{+���C��'�q�J�c���&V� �Ƹ)�̢ũ�O��Q�G#l8"�N�	�pj	����T 乑�̲��ZP�a��m���y.��[��$>�q�۞R��>ȕ�λ�2���������MN�윻ْ��J���SU�$F�SY%P,ܞ�[���o�0�`U�2��@�כ%l��1��.�+��C�|�G���GdOWDnd��7�����;�L��C5�m�
�[�i"�Dv�$h݀�q�i�+���.���9�&���>_]��&�1��[��M��J�sX�6y��S#`�d
�� �K$��f�Vm�gS��k�Bv��S·�6W:Ʊ��B�y�cb�n<s��s�<����6X���%��Je(���ؐyF<���R�ݴ L�<<�����M�%��B`���a�b����
�;	%r%��DP?�<,��:�d�߃�C��%�����?�ېH�)!��y7 �.��0�ø���Φ���6��r�ݕ��t��@�;�.��^b�	�Re�n*>�]!��8�.��d�2�Hjg-六LMD¹�=W���ڐS�f��$E���c�j���_`.$\�LDh'�B6�e;�A�I�?]��h�Ȫ	J~JD�uW�C'���E��٬�Q��yh�{�]�(��K���%4zd�WK43�ۆ��!� ��'�P��O��=���ke}���p��v�qb��#��ӳGF`4����&�nŽ�0���u�'�%�>e�H|ʍ�O�1<J�6`��U���|l�:�Z���%��n��1�H�5��gKeWn@`��3s�6V�[���m�o��I��+:����M�tB�~e*�^�+v�5ɉ#~[t�Y��O�A�b����2$ȁ�H���B$���{�}�3	�^�I��('���D�aM~���O�E@}��c��0���n�9�H|k�����,y�}.#���Ƿ��A��Uu� ��w[�C�br��U�],�xv���lR#��3���J�{�TD��V!��ꊼ���a�Dm�(��8~���Go�t�S���1Nm
�ŝ��9��>E�,4�O��:�a6������\(�������9�"o͝=#�u~ՊAa퇼���d7kuʧ�����������.)|�5e���;U�S�
���D���n���ӶQ�8����@�:Q&��{!�K�ʥ�,L����I�ra�t�U�X�l��\���i���&�m�S(� ��ś�uu���&Nw�(��r���-�2�Gg�]c�p�`��Q��^�I��r�3q�-ش�E�{u�)���j�Ǡ/�](A5��C�(�'��S�~�RT�W�C��k��y����c5[�a�L�p�")���ZR�T�VG���D�Eb{Y���U�Y3-R�����ֺ�
�����6WXc��A�$n��|�@��g���ͦmA&�E�����f��ޒ(v�L(��w
����K�im*nya��+�J���t�w�8Vo��HjȟՒ��n�Ϭ1(��EvK��j�V����jq��WL�9AVQ1����r��:VO�g�U=��ÿ�#	��6Z�2�Lo�T~�>��K��m0Yq���q��M���Q�[���G���Sixd��ޮbA8�`G�E���yۛ�é�S���3�R��ؤ�X�s;���J:�A�J9�)G\��b��q�!2�>u>�Ѓ�,;�� .݇�E���j����8��kLg����b��P�n5ځ%�\뼼�g]�M`Z��m݇v����>�S_����0�f��p�URr�J�2^�T�F�͵�މS:8@��w�QX!f����	X�X:��
5�m`�x
F@�%�����ɱ
�}N������5��>G4���t���,c�2�f:��c�b�_�V�x�]K��ix{�e����La&��?���H�rB�8n��{�R�x#�c���a'W7�蘎P�.�ܱ�(,�o\T�\s�eX���;r�@o{�����'C��Ϗl�Q����޿|���~k�P�h�7v��
�~��p��O�+*�q���%n��cQ�{�I&�^֊rqNL�^^m��a�\-UGG�TT'F=�̴��`a���oRv4U�&�睻rN�D�q|E��]np��s�p>'C�VY�7(�y�%�y:�*Kp<'��UtҖ/,�x0������	��X�- F�349x�,��%���9i)f�e����{BT���g��337!����uw?��{^�s.��OOF�Vc�V�:P�K��b�*7uo�=�:ҀHݕvz�̂L�E��M�l�-���rL���$%Kۂr���d���:a�BI�.Y}��=t;*��J@��!�&��%n�&[r�b`	5X�qb���
b��R��nm{iC��hk��,rS���.>�bJ�N13��D�T��vI]<?5זJ!%r����ӳ��̰R��������#f^�Sf8-�E�Й?�P��e��7���BxI@��f"�Xى�]l����|>�E�먜�Gp��ۀ�:�s��2X�Yx������1g�wOW�^B��d=H�{�t�i-�/�r�L{]��z��w=�4H���p��&�2t��-�,GX�&��s�T
�b��)zpQ�;Jp��嶟 ��#g�3h���c���=V?�9x��:��;�����Vx�K���F<d�}��g�]\<�� 
���1��Sk�0d��Y41lf��&�aE��)��\�\s��L`4k:��Ւ������Z��i�Aqs];G]��l�"�:���|�=��?��l��_�P��?_Ϋ�gV;%������/�����?�+r��>V���H!��l-�<7򔇿M>k0��t�k�Ǐ{`�a������,���U74���^.Aip���b����|�&G0
e&���69�MjcjC�����~��v��d�5��N���쌡zcɍ񖌃J�w4s��=��O}f��j�~�}<�V�k]��ݖxS��0w��A���s��e�`N�Ê���\c<t`���7���/(~J����#�q�~���@l��i�Vf)	UT�����>N�2:�u��T!,����Ni��U�cW~���^�u�Xr��Q��XR�W��y���Cp�����=��/sgL'
Jpvi�k�N�?T!sCk���.�E�Z��<�����ʝ���PQӕ�<�~L<�2�Vd�`���G%�p����ٽ���b��5����2>W��<D"=����Wb�#L����������_�}3����p�}!�߻��u����K��-�Pb��{z����X�����E��ݲ2�>�$v������}9��~���:t_� ������Pon�e��F�O���UD~�@�]2K�?�#���̐�zfvL�;3T��s�zih�^R&N���mK��"A�Ð�5G�8\S��|x�a�S�zsm2��3.fH�4����W)Gu��³�_�=�_ҕ���[�й���v`�m�w*R���k$���A}��%!<]���|����߂�Bw�o֒
K9�^z�	�3��Y��CJ)<��D��0Ȼ�\�Db�+��Nv]��!�rn�=�,s6]m�4��}��]2��L,���.��;M����`���m�u)��Kh;��`�!B,~+���7�͂�s�T{+�2�{��Y��2�Q�F�2���3imZ�V��j�9�����M�T�Te��@�L-�n?��8ܲ��L�+6�U��'_��fR\�����"��#�.�I�l	��O+�k̳{�8����X�'�k��� ^4��0HRm}>�	���E8Rw-�-�z�Q��uJP�^DLy���fK:e�&���5~<lտ�|���~�q;h�vh/��Lr��\X��ڇ��U޵�V�D�~��%�K�nX*oX���<׋�6�]d+��Yƿ�����
�J����f�{��8/�����F��L���v�z���.�R�*s�*�+«�)�4�;�"/��$������*����,�,��>�ƭє�a��[L�1�>��˳	��̖WҜ�隭t�����™�Rܪ60h����h����r|qN/�)��BD��h��v�z�󭫑�n�X��Ӭ0e;T��8��i�A�*���]���������o��S�l�j�Ƙ��T�s��>Vh�r�ZbJ�`�-�\x���\�C����h�"2�ą����T�k�<Lc��s��q�3��Sr'�>���:���dѺ����[��x���x�o'|�/�����ggg�1j�I}���@��4���x��I�e���	]z>��{���L�G
b\��T���۬`2��st��!Ju�tQ�a�
o������2�
�?�M��IJڄ���߀�G���`�e�&�q������������Y�NN��؟��*
m2�e�幤(��:0�;�ig��߆P��n���]�N���q�t�D�PKE��T������ pip/_vendor/pygments/modeline.py}RQk�0~ׯ8��ML�L��v�
F;�u/�g���$�H�h`��,�^ҮX�u�}�w'EQĀFs�*�Φ�.Q
������5X��Ё��Ƣ�x�-�Pk��bI��M����\������t<��n��hr5�׏�>�?,�@#���n�C������rUm�DDž�)��0F.k� cE��,
��j�EWTB�;4XT�V�z_Uh9c��]$��tS�����B<�ী_4)�����}���T^@2��c��;I�ڃ��m�bX�Ȟl~		#�a+�}�ps�\$d��
^�nm�2	J�XN�����(죢p�0�F�J���7��m�И��!(��%���Q3:���k{�o��b��S�[@~jz7�v���.��Z��6R8�JZn	B�j4�F���g���I4o6�Ǒ���;�-��he
�[�{�!�&�d�l�@��=$yE�S�(�'g)���#;���ֲ?PKE��T��.7S�pip/_vendor/pygments/plugin.py�T�n�0��+��\��9���p�R�A 0�ZbC�I5֥�^�T�W��EyZ������z��f�uV ��/Y�Qn�~.�޵@P��R���\�ܐ5���\�
R�P����Q"�<�t�OC�kâ4aSx�4�k�Y)mӥK\���w1ܢl{PA��u�
e!꡻�E%]ڵ��V��	gͱ��Y��#�`Gv�ׇ{[�e��|�q��Z�D5Xn��a�qB�aA��ઙ�Qp7���:bt#�Q#*o�T5�d{~^�k�G�ڳ�w۾�&j��l'�:Zȑ�.�zo����h��(kI�\p��x4��a<�ᱶ"t��H�a#L��_��w4���p��苻�Mo�yZSԄ2�{=�df�p���x�J��ylZ�٭��.��&q|��Nߋ��,|�T7���YB+��y��P�I̅��R����U�pR�U`�6wA��F�JZ��/䩙���ʧ,����kT��5�S�r��W;���?x����?�d;�qv�8�$N�A[��66��B�:�;�\{�Y���3A�kuw�گ��\�f��_5�<qI3'�?����H��K+PKE��Te)�mL pip/_vendor/pygments/regexopt.py�VM��6��W�Jk[��Ѓg�ݺh�4	�ۓ��M�l%Q�M\��!)Y+���h�x��q�`����>�Va���,�Y��yf���$��J�C��h��W��
�U��?�	WRYA���A{�$�#�F��˄F����@�6E���������������6'L�᳃
�'���������
��-/����ov�������q��s�O䥬4��J�?���I�V�
�D꭭�sY�O�Wk@�h)3U��+y,7'�^O��m�u��}<�q��/>�a��C]���������r9^�V,�~��x^�?��|F�sx���)�/_oI���3����pRq}�
`1�!49Cu�Y�ov	��咶�Р��0�#E�p����g����E�R�]7GTp�.��.=R�d$��*�(Ւ''��B�PN$�L���S�6�����9F� ٌ�(�WC��e�+�B!#������ʙ��55�v%"�Ձ�ɪ��&(����Id��`�/��*:��&%5�EJ�&�ߟ̢u��ԧg���x�P+�}�X6�r�g�؈��KG~̴(3�l�1	����hE�T����(r�ZE�n�Vh(R�E��}�B�H&%�C�W6<ñs�E(z\�&f�0'տ���!y�KIxX
��*�¿T��=�B�-{���'Of$|c��׿��Ԫ�R}h�q8C~��������h����2��gNQ�4s�sv+h	��ZR'�%Ys��B�����[�K}qں]�UL��Յ��.O7 
��R�[ݹH늿�!Sq��=���q��6�h��g�ՙq����ܐF�e��̟qg� ���‚��.���)�sn��TԹ����e�+�[h�(z�<�6l!��i/�n}t��檏�9˗g�j66T�{՜/z�vP�UGC�Lt�ڤ����x8G��X�B��y@�7��m/��xAB�V��|��M	ZZO�q��
�>LG�u�������z��v�\�[[ǭy���J�<>�16��2��LE�IM����}��E���O��n�\��I�fN[,�PKE��TB��
�pip/_vendor/pygments/scanner.py�VKo�6�ﯘ0v�*�=,�N�"�$�:����ҬĘ"������R�}$h��I����A]\\̀�f_֨�K\.�F�=� }��%�V�=ȺQ<A��_`+��I`cj%tي]����'A&
�E@��
4�:�m�_{>������6�0�D��_|o0-���	��s��sr���+|	8|i���Z'u��JX���"�P|�G��Q�5{�߳"K"��e�P\�ݡj*��=
�@�+��R���!�=a1�:7��ʲ�kxۿ���/?__]_3p>�SW6�(�8D�������&�a��Q;\Û�]Կ����=�%*���%�j��z�a6��J8����{$v����{k�]�C苮s�$��BQ�|��Ǣ�+jAb�J�Ʈ�V��ҧ�S��>�`������G�����	�ד9��p5���Iޣ�.�י�:�KmbS�n�"\���i9b����4�Z�4]8T�UHv;%Jws�3�j@m-�`��󃑤�JR�2�*`�'S;���x�h�?�O�9{:�L
�܄SO�B]����`�塑����L�Ug��Aԓ��x��MpN�ZLsn%�~�k��p�z�h[̸��z�e�6M�DY��cZ�oN(
�Rn�i���>W,KҴ0y�.G�td��5Jא�i�ۦQ{�:�l�m��4�@p$�F���spe�H��~����Π�s�D�%19/��0����W��P�YTDb`��a��ȏ�a9u��,�����qut���n"�t5��٢��]�ʸ�;��G�T�X1�ڄ�Oɐ��H�8)�y֧)��a�VeVÌ���U��
��������zH��h�
�� v�"e;����x�u��
�"c�5Fa8M�G�B�����
�`�uC�qxcq������s�xdYpʲUP��=�`�Y��۰ڲ��T}AÏĸ�#�O�Ң&�� �g���^Q�i����N�;n�>��A]��6��lj�������a�	�n���Tǯ��^I8V��N��ִ��d��m2��ťy%�{'���Ӳ ��v��E�u�̗�?
���(&A;�_/\�.��s��ř���?)M�M��tujD$���m�,g�PKE��T"\�^!pip/_vendor/pygments/sphinxext.py�Wmo�6��_!(l9_�
���6�hڡ�m���L�M�=Kn�o%��K�6žf���������G�ɷ�5%#����F��vόO�A5�e���,A@AZ�lMKH�%�������
94��@-�߄��,��50J�|[��J��U�J��ξ�p~v~N�l�Z��r�(��!�����O����p���0"?N������n:��I
�2�6���PDn��-�lm�W('�Dd)Ȯ(��8X����/^n�T=՜R����ּf$�=�U����zd�9� ��A�_�ZŊ)��x������\��("�,-9�F���Ļ�6~�h&�JY)�xMW�]�4�f�q����|�����f����S7��jj��훠w8w�T�(:�\gI�B���K����$���b�dž�+��7(��M�&
吵�cpEe�d+I��n(���?K��ƴX����#�r]P�wDg��X{<~Y12�	t�-@,sHp���m�RX��������-�Ġ��N�V�2;��L�
��˥28���UlA?���F�Hp��c��f�Lg^A�2�$`��L<S�RR�5�ԭ�
[�Ywt�4�(ɰ#�"mY~�(�{N��b�L���ClzYY$p���y�҆;46�i�݅ L�(�]v���!cK�}�dE���HA$�D�4X��L�,��a_�i�!h�5=��>��<���BVDng��Q��y��ԭ�4ũ�o�=���L�-�� �"U��Օ�8������*j��� 
���r���?`{��KJ�fD6�ŰPkMh ��(�c��8����e��9o��n�\M&p~k~Cw��׹�=S�B�
�Uv5��D����(�qwE��1p*�J��=S�q�W�/%.�р���з���?L2��	n����]�ڠ�)�7��/��?ܓ#���$�%W.�y!名A�c��Ɏ�?�=c"0y?��y��oj�F�96��?�§�S�5�1�=�߽�T�Æ��:�X��ٍ?j��oٸ��
��U;�pJ����ZB+���3;0w^����FӪ��Ǘ���L���]a�L����
���'RWSM�^�V@SK�C�����KAJDZ��>��?�ERoH���j�@m���?�NTa�5s`�Z�
�nZ��a���
�\U��_Q�{������-�u��v��������ao1��
�z�:�x����D�ctnh�����9���t_s>�����UP]��0׶��o���̯��|�s�����Q�dg6o�+��x�u��M%w�E.��7�Bst=�=<��y�ؕ���#��E��H���8�PKE��TvG�qpip/_vendor/pygments/style.py�Xmo�6��_A�(do��8mR致�[W4ه�Y�d.��Qt��~��HJ�^�5�M�s��N����z��.[�\�B�8�?�W�z��Q�b�1D,����,�d�R����+�N&�����,vD-)�j�E�Ո����~������pӼ�3�������ӗ�O$�$TE���L��J�"k��O4O�WI(�Hs�Vk!�����]���v����m��'74�6\�U�^�<#"%Q^���g����.$��w���仞g�$�|�_�-x?3L���I�
WiӐIJs�Fߴ����q�JiͶ�ZF�J}�*� ���V7ƻ�
V�d2ڡ�����'����{q��V���Wmb`�M[���t�v\�iڍ���m�W$肸b`߾]2E������)$�kI�Hф�K���hr�5#�G+Z�B���.�k:r��gF�-p)���*���YH��̶�M�����|�z#׼2���pk�Ү���Q\��.�y9�/B��+�����ŗ�r�k�VC�>N�>$��˂EuTg�6�ߍ`E��U�J�n�Ҭi��jPv�a�׋yT����8j��Ù��	MI�\�p������,��� �����;z��Tثm������R�˅B,�2O����Ӱ�����IA��aJ�)�H
}��(���U�IRX�\C����9����X-ĝ��[f��4j��mo�j�)oP\��O��OdJ~փs0Ճ^�_W	3�H�C�;�`�"��-S�A��`HP
MK�8�^{�2���//@tg[)��Vk֛��g�q�<C#XT�}�ѫ��}H�5Ek�Xs�)T�h�O�x�"W,�Ж1G-�/���ؚq��$���"r:l�i8���6�G�h�r�]�ƻP�v�:V���4�A0"����;@+%�˗T2`��̣<q�q>z�v0�-�\#��7����.ǰ�p�B�8��"�S��@Y*��\���x���4�*���'�t	����	sq2��DJ�"8���l�/ =u�p������˦�2�f;�]�G�"��|����"��ݷ�EG�+KHH�h��{�]�Oǂ3 ��G�|�*�58Fx�•��1�w��5��{���C���V�Mn�a!���G
b;9��kQ
���]��Hl��#|pT��G�=9_fwl�I�yT�'^�tc��}�?_����K�M-pi911G�'5�c?o}y�)z��$�XM�|�yg�Z���}T���*���~�������p^��p-�M�$,��7Il[Up�
�i�N#����i)���M�h����W�l��a�5�7t��;pV({�cg�Z�����Q�Z;��Άo��Z�4����f=nm�9�E�c��M�H��m�t8?��Z��$M"e��z���������?#�ʈs8$Ǐ��ǻ�M��dEa����ݛ'���4�ۗR��eK�F�@#*s�"��D$߬R�����#(������i���Rw�Ś�,�N�½<�؃�G�[��]�؋����r���EMusN�K6�(u_��ݭ�h�\+%�b��v����p҄���_�D��)��J�;���1�h7����X��9�V�TI�κ
c������%x�_�(t��L&ʳM��׺*)���=��0��$�B��MB!I}t�PKE��Ti[�n�pip/_vendor/pygments/token.py�XKo�8��W��Y�Г�ty����$��;X4-�2�)�Tc1�ۧ��lQ�2��!6���z|�P����z_T\����n�|�wɴȈ����&L��l9�~�&wu���L�F[3'W�Or���?>�x~N�{{���NgՌh��ſ��O�ԉ)EB��\.���W7���Q
ɹa��;��$�J�5Y-Q�%(91m]������|"�Jr�d�7Dץ0�ˍ��g�n���aC����{�[Qr�Dh�6V�Q�����2� p<�B�+u�H���'�C
7m#��Q��JHaV+kŒ�ĚB�,����C2V�D�5o�����Sݮ]p�T7��ɔgK}�ꅕ���n��	h��'x�B�1[��N`��%�.4?ȧ���
�1͈jbc��U�?���
�8c2
��M��I�ź5<����
���z�m�M�=[IG3<:�� e9����Ł3���{��u��@Q�-E-����4��!J��
��J��L���r?��k��!�
�pd[�����B%7J�q���׽�f����K��؁�Ȣ���
^��o�x�Lq�����e�Ƹ�w�����er�4���&��:+�l�!��ZRʗJh��B����C6�H�����Mo��Tѣ<�B��TU)�k��Z�
(�A�I���
�vw֯�{V��Er65�nӯ�$����m$�m��Ju�n#ylefZf��Y���r���{���q�w�-��K�`k:)���oh����
��������IX&r��̐
}iG�Ƌ���Lc�执���{y�x�v�I��+����gN)�3ߵ���M˱�=?[��3VF����~�}��	m���,۽B��প����}JZH+/y��G^�@��N@o����A�&k�q�$t8�
;7		|g=����!q?�<�:��j�%��R5
P������{W��3��.�m�l8�~��[λP� C�L<�g8+�A������D�zU0�ػ#�����0=��渁\%*��Nݼͥw�?����f�ȴ�3�N0k��z0u����FI([`O��n�Z,��
�2�|ݐ�j	4Y`6p�oF��3�?����V���q6�(�I���!���P&x�sc)L"c�c�o��'������j��Ǜ��#
�d�C�����8����}�`��q��
�\g�;
��H�z�A�u��>3�;/���[��l���ƶ�y�@lj/ѝ5osu�)���L"�Ew������L�T�Pw:".����S%�/[Q���0b:]�}��S�f2��Y��!~ʶ��1yx#
���T����z��}��Bb8nb��+D�gS�����:Ӓ�>�7�Dza���D*��%+F�F������u�������dQ௥Z������>5?Ex���K.�GkO��i^�Hj!.�$��:^J���G���F��$j/a83"�
�T�C�ՖE�M5��~x)*�kX��rTY�=:�8)�y�7T�x��G��z�J0�V'��Z���d��->��#ӄ��}������֧"P�� ��s()�^F+8��!�K�Xl`��&�FmF�6�Ë���Q`z�´���Y|�����ӽ��U��}t���`A�k'���M���7��J�%�ǥ�Lo���l;~k���B�����7��@�:�"BVp3@�P�f�����w��_�G��q�����ɀ�|���m���)-��ެ"5��Z���)��Ck��P LU� �i#��C`��F�E;.���;��ɟPKE��Tz(|@�L�!pip/_vendor/pygments/unistring.py�k�Ǒ���X���@WUW�d�X;���1E8D�p]I�G�׻��U���zy(�E��
��]���?u�g�~��ڿ���g���7���ś��_�������!,o�^ջ��w�~�"���.}^����T^�
/^ޥ�|������_�)���z}�Yx�>i��5�+���w�u��4�����qy��?|��������n	�/Y���o>��w�����yz]:�翿��_}v���r���^��w��~��Kz{������߿~��'ov���s�lO�q�'��ઘ��%|�ӻ7��ͯ��?���P
�O_���M�������_��/��W�-E̥U��o��G���E���ݣg�y�읭���9��EU�
��f���vjS��G�6z��{��싖��G��<�����<tOc��vZ�G|�kc��&��J�+���E\���Su\����]�4�N�^R�/̲Oy��r9h��B.�Ϭ��tݟ�8:="��W�z�HqM�^�"�tZW<�����z����}Oe�O�\{���cW����Z3���W�O\��b�8�Oy��szU��B"H�A<�^�DYδAO�hœ�ɇxx'��	*�Ya�@=4JPg���s\�YX,�e����Dh����x��O�Ra勫���Ur��셝��T\��U��@U�H��Q�������􊐥T��G�>B�՞�H�Dj%�+R+Qj%R+�Z��J�V��G�>���"5�&"5�&�B����W62��(�$|����##$�D�A'�?I�$:0�"�(�Rء�
�L��O�
c�RJ-Fj1J-F:Z����(�&2В�%�󗨫$���>��_�DH���Cwh� ��I�H�)R�a��������@���(I�$IJ�2\y��+��DyR5P�#Q�L�Ȕ-S�LA2�+y�k�Ȳ�:��,S\�3�O��Oތ���13�$\�>�(��Or&���!I�l�*�ʷd�+���~Y��E�� +̽��c��Py���䬜0��J�ࡼ���(��b��۔��(%�P��{�L���"��g�T�?X7Fd�w+y��ۚ����F��ڠ=C푠E<=�Vk� �	�ݯQ"V�X�8:$� ��@�nE^�D$"�D$"z;٥w�F�X,A���[��g�,g�s��N�Z��c��w6�6~�ۣ{��M�n{��Aˎg��z<�o�`�-T"�ƞ�؞��<U<|�0PK�ǎ��$s0�)��'̧�ݱ=�,�!���x���Fn΍����|��h��xh�>�����,����^:=x3��A� P�!��B�x(A��AQR�d*Vj�͌������N=I����頦m��H�t�DA�T8S�͵'S�/U�R�E<=�z���H����Fy�~W�/���0����&h�5��7�d��B���<�|���P�c�� �~�x�,I�j��=z]�G�x׻���k�6k��g�=���=�N�T�r�Ay#���
�۠�r�#A�x:s�$f��缓���a�n�oi��#�;�t�Ѝvw�׸��9C��-�8W3�O�&���x�)o�V�Ų7h�i_$/��b�@큇_���g�=E���<>�9O�<����P{t�� 
ۂ�xxg�7��k8��s8��,��z&0%��	�=r�Y�z=����=J���(g"H��mp�����x���g�9�5V�nBȡ��;,��<���X���ۡ��K���7c��H
�¼�^���C}�G�&�̠50��JX�_�d���l�O괯��Px=L}URcr��
Hý�ۣs�S<}��4)�B�-���=��eM-�MD�.���g3A��d�Ҷ������9;�|�fb��d���agZv�$�Gn�E<U6��/
Wk�˵Du���}b8��u��ױ�9�[���kࢁ��s&�>50X
LX5N��9���u�5�ꇜ�xq��ō:Z��m�ZX��__�QsK�	�Q�K��.�~ҟZ�9�!h`��i�<��^�\�$=�����6��F�uV<é��f��~.צ���(�avu�å�~,�2j�;�<G6�U�9�F
�Z�C����f�j�\�Պ;�ιh�����k�6����r�ə���gå��x'X���p-��~n0\q��q`0�#oa���TA�ڞ_��Q5�?��3�,�e�3�>בϨ\ͩ���S_��5
�m��i3i��JZ"���9�\��!�xȳ���Rٵ{�z��W}����N�vN�m<���1֜e�����5_O�f95�h`
�_o;���	�S���k�N��3\}/<�#ڵ�˵��:��ޮ�S]���T�Nrͩ/���ZZ7K�su[�yu�~Ԝ#��Z
�.ndhY��4�%��b/~S�9'g����u~{���c�_tRn�U]�<����,i�5�+�K��k������>k��ʹ�M�h�5k)�g�n��6-��â95ph�m:�6����~h��'v;�����N9u���{d�E9�Su�h��gN����z[�?U��n���V��%
U{��g6�_ö�u��V|��YsI�B:5���r���u�'�b���5�L���<��5�%�*Ț�<[:kK�mS��xh��ԥ���M��o�0��y�q�s95�o�ұ�t�Տ&s����,^�Ξ���-�be���ڂFoy�t��BR�R4�h�.Q6��ݢ��-z
C~����P�=
����h��5P�Su oU�S���mZ�p�"b�Y9���fۭ��C��:�r�֮O�s�`���&�md>�`�i��k�qjࡁ�i�3W�"i�����뚭��9���笿��i�e�o�u��@�\VMsY5p�4�Of���u����hN��ezu�3�P�&���p���:�n�5�9�jWu���K�\��W>_�y�X/�6������t���	��s|�-t�K��Y۶_���ܜa��Sת�Q�}�i��܆+������Su�l�<\��pI���ʚf��R�Qע.}��M]�p-ʸ̰���/{��ej�^���Oõj�V��:3�j2�&�j2�L�צ	n��6�4�-׮��~d����<���,}����q2MGg��=�]�4��^O
U�����.���NP��2�95pӏ��Zm�������iMsN���95P��y
\���i>uҫ[m֜X4K[�@]�W]
VnZ�S�fI�h=�f����iN
��X�qL�CC�@��9?t�N��s��;u�3�TW.���4���<���9�wz�$U�(rZ*��;][�\�paԱk[����s�<U��J���;���U`��Ѷp�w1�rx��\���h���W9�NٍK N 4�B�?�BG�UcF5u�,/i ��y?�����Y{�~b�h����_~�Y���ٻ�>{�;D�n���~%k��.��COh�f(�\��M~����B�Z��~��@�u�;�A�X�m���k��8�����k�F�C7(�ؖk}��;��|�{~��[�+��9,���n�o�������;�;�;��:ȪS
�m][�R����AY�GkR7cO�O�(��=����i�i���JJ�����w�6f�P
�8�M��B[�B�H��m��$�%�`3,�[�e!� l�R
(d��υAeP^��Pa��VX�ǎ~��ǎ~��ǎ~��ǎ~��ǎ~��ǎ~��ǎ~��ǎ~̍[[��O?v�cG?v�cG?v�cG?v�c��<iDh�R2G�ut[�I���詎�꼰�p'Ȏ~4�Qw
܎~�@��O�p�nZlɂ�˼�W��f�Zc��k��k��k��k��i��fZh��"p��_����3�<��3�<��3�<��3�<��S`O�=��Sl����S���n����@܅��S����O���Q��W�q�W��V�a�i��G����4���`>9��n��T��k��5���򴢧=��iEO+zZ�ӊ�V�=��iE_�s�iJOS�
?��3�<��3�V��ʸ[w+�neܭ���q�2�V��ʸ[w+�neܭ���q�2�V��ʸ[w+�neܭ���q�2�V��f�3h���`�Yn79��@K/�M@�ڣ���QmS[�{d �m��C�x�~��h��Bw�	���,�����X�-� Z������w�;���8��۔������~ 9}/�)�~`&@U��{�A����~pV�UY�_��S6�7�7�7�7�7�,q�~���������?�r����ȫ���)'�'�L��A4Ƞ�D�$H.�\��P8V"��l
���G����d%�"�\��'���J�?�h�?+�?h���������_��U@��
?؟.�T�;Gh�~��$�!:pu�_�E<�`��C���x�.u}���Y��J+�S<'� �F���K���
�D{/��JU`�=��P��H5V�$PI@Pn�׍�&@�v��+׶���*�>���X�6Z�Fu�D���12.���JжAh�v�S�a�W��A"�&���A|���zB�'CAT����J'�'�'���R�?��?r�Q�� �R�?��c�"��?����O�'��a�m�?Ȭ����g��j��?�z+���_��
[h�>����g�F�~��6l}�lt���zB#T8�W������f�V�W�7�7�7�7�7�7�7�888888�$��������a�5���zB%6CU�ǦQ^Xxaᅅ^Xx0�N��T�N��T�N��T�N��T�N��T�N��T�N��T�NŁ|
;�Sq;�Sq;�Sq�c�8`{�MP��ݝ�ݩݝ��x�Cة���S�;U�S��T��7O
�H4�����	����K�L�ߵt��x(g��d�yB4�E@f���:4���@
�g�$2))"�q_vh�U��V�xӣ���8#�~��f���ٯz)�����p8.I���3���Y��~R�dz�8g_4s}{��fn��y��ļ��ܼ��u��5�4����ly�ys��6n9�6ka�y;4�-�k�-��sP�^AlEo0꼬���f���@_�k�{�]�}�}������LN]~���VM9���>�����|�|~�u*���ꍲ�Fzl鿓��������{+�[�}�Ő����0��a��C���dZ8_*"�з�vgq��,S�.�o�6Y�������z�_u��Z`է��'�m� ��;��}DZ����OW�	�B���}�2}�� ~����l��Bp�2c	\��6'f=�Jy}��4?���Z�;S�˵jx�$S`�L�)��1d��0�漆�V�q��MNVj�i{�xu�Z�g��+N�������\�d-t9�Xk�}oN$4�ܘ)ۣ�m�y��ĶK[�V$��3����'�㽃��D���gg	;�;�f'gr���^<H���=6�D,���`�}|����D��Dd�A����t�99z<Eh�DB�<D
�#��1F��p�1���)_>�H>�1��N9��ݨ$�Q�)�MgO�d0|?��Ru��4"�/�KZ��E�8(�$� 6��F{ b����w��R�P���Q��Έ�=P�.�D>-r��C�%�(�$��h��(P��I�r�>���
�t#?�&R��.)Db���rF)g\DpY?���x$M�8�"qȋR�x �(2`�	����r<a;��y1���dY�(Rb1���j�T@��&J��H�Q�$"Q��.�B0D�Ozj����۳=2����4����4��$)M��R�D��E�P�{wH�N��
�1��� S�,� K2��<g�D�*���529o?�x8��R�|�vJsA���,��f��,s:X��1ea@'��d��,ǔC�E���%�?:�#���pZ�p(bJ�T8��T�p*ҨH�q�Y3Zal�@��d�3�"��#�)�F�~�]S�A=��s9�8����ɂ�8� #���p�d�L���"vf�OPnj�����Y뺈b�A<=1'�q�Q%^>��3
���3�ѓ�c׫�Q'�z���%����q:�Dh�e��尲����
��D�=z�x:��zE6���v;$�c�M�V���JL?�����nX�� �s�s6�q��x�&v>�K��|���m�lG��d��|�����F�w<1}�����[����oT���`�㥳O�4ON�NI���-H���������ז�׊8x{�ڬ����Z��ڣ׮b[ĩ�*D�9�M���lT:2�6�,��������o{l�&q6�E��rv�7�'����\@�-JL$&JL$F���c�9d�]�����Y]�mf[v&d�d%zt�D
ԗ����,�-V������K������l�*�_�ȸ!�%B[�z(r\��'ρ���
�f8��"
�����\�/�e8��Ȧ��/��:�p�S�F��]<z�͹N��g�����x�xH�臭�f	B8Έpg1�l�Ͼ��l�ON+�Cd�R���%�o���
]$�N���XQ� 9}6�Ń��|I����$��G�n�<�-��d%�pq�X���$��$o{��)tY��_��y+p���)��s����89�p�9�[���W%�̜��=��w����+��R;R��]<ȲE�\�E|��Y��Y��,���-"�WܓS�~�ը��t`B@���L��*jj�&w�>d��@��
�="bzxJ��%�җе"���͒Ӟ���rz^9�r:^9o4��w��dbDt��	�ɏS�S��è�5��!���k�4��T��x
\�V
<f�
L��ΑO7���@��ef~��kq��6Ǩ��!���,-�:\�������q��\�ԓ����g�:���3�B��U|m
=�1�6�)���}�C]*Jt,=���:���)�?�Ǐ]��f�*�x�8����攉0��@7��9��!9�\e��ft�`����T�:U��N�6��0���@�a���i�Y�^����yb���5���m�f��0i��h���t�/�G`�.�jדּwց��#{'1�T�*���mF.�ӵvL+�#�.��.i�.e�߱Q��
@٤	�C��R<nJ�t��pi��s���yl�:�5EĎ��)�vj�9Uf�řzV23E��Jl}���Ks��usi��E97u�-SBm�xY��F2lT��u�U��O	@��j~֡�[�'�͹�KE��;k5���Es�����T"k�~�̈́����M��|;�˶g�+����a��#ذ8u�t��[XU,���8j=h?�3��J��5rs�@m��F��#���i�B̈́�Q�)3�TB,�Bf�F�O9���J�]�<�5���yH�ڢ?	����6<G�[��7��[���29ۏ�U	~vM��o�y�0~ٶ0���@�o!�2���E�'ڛ^���U4h���h����[=e��8�z��c��j��l�2\zK��2F��c.��L�+�c��-Nq��F���r$�N��Ũ��b���X)�j�J�7�Jvu��LY�Qu8��(瘹JYT���+^���ɗ5A�)���鬚�US\5�UST��.e�	n��	�iN�ئ�Ǯ����b�5���ʮ�+�l�C�{�hP95�af3h+�يA_��6����Cۿ].�g;������j����~;\��c�e���]�c�;N��o�;C��2��&A�C'9_����V�x8ҩ�q�I�&���=�y��g�����]�	zlj��X��@���
�hC��*[�ZΔ-:	����o��Ң8�������d_'u
�����簸��C���R�T�ؖ+0�Ai{@�'[�f-wb]�����bɮ���?�ɷ���r~o�z�\���d(�����lY�~�?*�2�S�w�E���k�Z��Vν-�ހ��$�"�tl��r�c��rWhE�E7*`�C`��KGg�E)��6�y��q:آ9��͈�fd<�[�6�xC�[Q0���f=آς��v[�!-א�lA[鈅\rɵ�宻��PR��rQn����*��m��\��~���5�:}���}���}���}���}���}���}���}���}���}���}���}��ǝh�ttl�d�E�v���q��y�$H�v^@@��z��~m�[n&�Q��M���E��.���5[�-YhÅӖ����Ă�ĒI��[h���[h���[h���[h�Ep4���/4��٢�N��
�1���1���1�����T�gz�����~��<5�ql��sA�c�2��g�y�=W����1��(����yn=#����\K{��=�-���x����˵�H�
x~'<��#���I��|�O�yd^<��i>O�y���|���4���<��i>O�y��#��z�4���3=-�E��!�2W���\�+Cpe���!�2W���\�+Cpe���!�2W���\�+Cpe���!�r�oV�Ɍ�+.��[�y��DDsDד�:�(�#�����PݠT �	�/~
wc��o��>�X�-�~.���r��;��~.��������������>Ȳ������n�x�=�\/v��N����s�T���uc�~��豠�w
�?��e��Q��l�sח��¿�υ[����G�&:e-�ǖ�c�JY���آQ�Q�O�O�O�O¹!+��@x ��
�yh�m~�JK��w��G��(��X��puZ�`��U�	~Vn%�����g��b-�?ד%�_�GI{)���\���J�����!/~�T�(��[���jd���H��܊Z����;Z���^<\NW�/*�u��6a�d+�D�_{��@A-�)��O�xp,f������Pg�Ps,^򠍞D���N֧����Og�q�FY��P��
�]��	N�@�N�P���M��
�7*�]�ZЩ���ʁ#i��� �����GO�O�O��kM'��M�;����\�Li�?7�)���sI�"��?��)���O�su��	�?��)ß���s��2�����_�/�hE���F���(�Bϭ�
�
�
�
�
?��m�u������������'h���NR>�?�?�?�?�?A�sy�������$8W��������'5�Sc;5�Sc;5�Sc1;5�Sc;5�Sc;5�Sc;5�Sc;5�Sc;5�Sc;5�Sc;5*�Q�w��; uQκ�D�$!*t�BwD
�C���P�;շS}�T��gNRp8���A�X��m��C�#�B�\f�e�<�k+Z�;9��6��$�8���>���|&�eof�gM�{UX�z's<�\��9'�]q�}e;\�>tH6�95�0���'�lU_c4��QE7f*�1�Goq���u��W��u-�臖��g(�ʫVgsj�^���	�'�yՓ����RhU���g��1l��:oN���D�+r}��m�|�-�ׇ��������y�L�(�~���Mq�zP�w�rԵ�ټ�l˦�e��t�W�HӞ�_O~��O��a�z�+���������?���ӯS����#Z����^� [/��
�zH`�d*�/x=z��YG���rD�B�VHi[�AG��G��c�Ut[��NAj't>$)?�o��H\���}lT��l����{h��)�,u�)T��T �*S�,�d �%��I�����M3%��*`UgDg;����#;��,�ì�%D*
K!�m�Fw���a�nGgLɑ���X��F�ǾM]�G��H�d�t�S<��D��$��"ld�K����L3��>3l�r�K�_:c��F䘱�Ҩ��GlYP5T��lR"��S8��2�F�:c�`y	ڗ�Q=#2�Ɂ?LN������I��0�#�Šm~1�"�	$�UÁ���X\u�s�pb<�=� fv���K4�c/�Qѝ.*��ߨ�Y����~�Î����$X�Ȍ!���gQ�^Љ^o�ו�N��4f���C]�����@��:��VP�����^����%�*��z�m�m�T�����Km���N�Ѻy�芪b5�"�̋�Mu�O����T�6y��ۋ�wմ֜�|\e/��X?�޽�'��#�޳+�b.~��Pɸ�3z�Q?�תZ��5pjC]�`]s��7�}4�SW��I]�N�0]�t���G?��ӜV]#��M~h�+&�E,�fhêѧ*8UP@�<���P�*�~L\����Ve�*�Ԝ�y�ܖ�����ڪ^%nu��e�����KWg�
�"�\�/G�}�]��b��͛)b��Q����&I�	7�5ZD�
?�v
9�^�P��C��C�&/rp`*��@pJ~�kn?IH�!q�b�ȍc�
�j{P��B%	xs���vIf�{���޽\F�h�"�:�ÊE7��n�=��;"$t����i�A�"�O���{��,���ˁӋ���87Y����<�$/J5��JN��"��h��eb����`u�j|>He�`z����@�\���y	��@+Y!VH���X cA��0gѦ|1��Ҍ�K���ܨH#a_Lj"n"�$�<��|�e��H��Pb��d��(���i���AP{��9(A{_��,�x]J�(���+51��)V�e
��p�o�M�x��EN�>��A����Hsq�kPҨ�#�T���"�E� 1�eE��\ч���F	���͋h�h����,D�F�"b�ǪH�:Q��!�Yd=�&����������\�?��e6�A����t�Kކ�!cо��?�zT%���.��t��xP?���AW���R5{�+�W�y7J�,�'=�0b�
�<��� g�^N�9�8�_���9�?�N؟���.K\Y���}��A�-n
�AWY�&�����S��<�y+"��M��H���A��e?��EYQ�^�Ȼ`v���e��b��k�*��&r��8�9&���Tf),��	��$�It�$V8flT��˘k���%NǓ�2'�Έ���"!-&�D
�pDiP�a��v��I%V��q��91���^�й=2�)'�S��U{ ��c�[ت�rV�@�ل��Qi�ҵ�G.DdyGm��RU�
T]�tR{ �eG ̨��#`���D��#Ȱ�h'�"�m����"H��^
X�lTL.E�A�l"[��LGA�����a�"{l,���"�S�vU�����u��]Q��>���j�èq�`�m&[-��r�e��KϨ�/�*H�B5���򴲓'�Y�fE�����X��:ʑ,۟	|�%��ӈFT��`Z�gM5��.��Z��ڡ\�#V5Z�a�!��x��sk��s��f)�~ǩ���T���V�ms5q�E
T�B.fڼ�%�9�XF���M�����al��]	ݰy��h�	Hm�W�ͦ�iUe��5-Y��O�)�l�m�4p����֙י�i�yr�-��M!��2�5�M+n
��87���mS��ծ�xf�yhy����������w�ӰRs*Z�
j"�B���
�z�U�;R�&��
�)�!/�n��9�i����U1�8�Y]���U�dN)*{v�.�>\�T4��e���3Ҍ���&�zD����֑�ZG>�Q��e�$�7ٸ�v}B�50jmmq�=�
;lu�وIM,�t΍�d0�t�ݮ�+�Ps�-�1t�ة_ƪ	�c�9�)��B���g��+�1��0�r�]}��ɨ�8A��9����<���
���K�fu4�2���8���i��S
�4�访-���}��{���<E��X@͘�O{t�.g�;���&�>8.8�xP}$i��*�F���}E#g���m�&�;b��$b�Ġ��d���a[�tN�"
]ЈhDa{��t�*KQ��ݳ������!�9*���Z�6Ş��=Q�d%�ER�E�<���lGF��`YK��%�&����T>2k<��=
�9%F֠'Zw��G�D�������qWi�A�Պ+O��ie��_X�v}�����v��[�����(Tq����ק�csj�|�����ܔs�B0�Pe�9Y�Z�)Q؜:��4���g`���8��ۦx_s����oq��w5c����S9���c�S9���G��t��&��)�x�q q/�"X�{��:�?���Y�,��G[۱F2�8A6j6���֥x��>7￝�J��l��|�k?\�Z_�W5�p;E��)�nD�NDK�t��?��=Da�\��rj���6�9�l3��-��6y��(�jc�cW���(�xM78#:�/��Ey�fT>;����]4j���*.����c/h�^`����p����`�%���!�S��NK�v\Xt��񆐦�%��_����EUo�2eb�<��Q��PIs�5�#Ly_5�yL��*�fN�
4�����.j�.�zU���*s�F�����r���	��܄i�Q��oϴM��!βG-�4Ue��=*��D-{R�F͘���Шh����n�xl2�s�M�Q��]W͘A�5�K�6��:rW�h��/�*5-�E.�ƷV�����6E��2��y^�e7,����.j��HӸ�h͒ԶHIc��\y*g��ㆥ�-psvI��D<���+�άh@���ǭ�l������5γg}Y���F=�b�q�#��*�h�yeJ@s�+b�ۢ�;ݦC�ڧ��a]�����.���5O�=��e*��~���G}��������]:�̡�ԡ�ԡ�ԡô�R�@{�9�t{��u�p�-�{;�O��'`���	��o��<���Q���	ؑ%I�=�O�%�%�%��o��^B�ɛ�0���,�x���Y8-�V��1X�Ѩ�����+���u-��iLg��@�+��
t��nM�b	� fk�PK�uE���7.�+�%��O�C�C���P��P����q<��tJ4J/��-G�(���@�;T�;P��zK�������?���G���?��~���ߞ����w�����w�?�݁|	?����j�=��;P��̊���
Ɋ���B�+�U*mڣ_Gl��߬�=DA��Ʌ�6�ADuT{p���vï��_>,)��6V
��0qrUH�2��1���7�W�#��DwvUtVd����Jd�P�V�r��ۈ�/�zߠ�|�U�M�(�j�#g�\JZ���rʽg��AI��ܣ$Ȋ� �� {�����!���E8"�rN�h^�EE�"z=��ُ��[.�f��H�E��٢&�1�q2�1d� �99.z��vj���uk��A�h1G�=�W[���,���a=��M<��V��#���!ƅ%�^�U�hp�E
PdX��uL8L8L��讒5t�KWI�UT��|O����z��"@y6(�M�7m��I���:j�C���p>*G���ڃ��Wˍp�.��f$>s/�SlAb��Ⱦ/p���d�G�U��"���U~�AX=����H�4�ųCQx���LI�A�"s��r��֭�AuP�⍢�Ȉ�W���B��E�RuL��h0�PrQ��4�[�q(ަNU�Z~�MW�j��Tu?���wb�����	��n�P��T�.U-
���I3�A��[��H+UOӖ?zr?�?����|[���1MXUR�հOi��ưy^ ��y���4�)"�O4��o������'�:���y�+n?�iq��6b�#�}o��D��q�<�~�ޜ�&ui���噏��S
���U�=r<��WN�w=U�v[�qCy�U��G1��jʩ��T����s�p���u|�9��j�p��=�述�P�@�� a�lej_Y���,��\������j��Z4AkNuP��Uh�U(o���Ž�Ў����z�'y81Mqb��d~b���4řeʪ��*�5�FH�9����6���	j
x�O��%������i�D�[^��D�>Fu*Fu*?2��AŨN-‰�7��T��T�*+��Zd�i�j�]Ķj��[�f}�~�lk�~Ƃ���b��UT��G��%>��"�%p9������B]�1���4�������*fPڃ��Ȥ>nI�&��E?�'�R��O���j[q���5��L�d���Dպ�ܔ��D���^�h���1�j�3�ϩ)���,���"l�T1�T+͌��ňT���V�z������;C�f�\�ט�6�MFk�k���yHs�燨���������o�rR���>oS߻K*{�)	�P3}��O���]�!6f��p��2u�<Q�ڂFE��q���E�F��C��&���~
������ n����+�q��j�-sY����Vl���nYY�GOe���(ݓL, ��\Q%f9�v` �Xg���e�.�(����0�u�D�!jP�c�m,mdQ��l��I��Y�V�v��FO��BhK*S��TCU�	jsz_�5~#�vv�7��<*V�*��hξ��p(�����J�O"]SP]+��f�ڶa�ρkW��Od�#{�(���y$"��j�Y��3,��J�*[. eV�j�VT�TT�T�vV���Up��Si��E�Ĩ��Se�cY��e9��p�K��(nVvG@�X��H���+��r��h@��a�ԡv�Q1�����N˥˥˥˥�*��!:T�Q�O^L?Ɂ�p2b�DK�[�=`Cc�C�H�^<|8��!�Pe�`:A:A�`�H ��Ce�Z�NF8?�N�6F��xg��a�
w���z��<��R�
�U>�"º��a�u2;��l���	B�a���$w;�1d#���X����A�5�FiI��7J�*r"U�b1W���2�ȅA�a�LvHsU>Z10Ue�B.�ծ,�0�ݤc].nD٨i-�=�//h�YD��B�/b�b�<�&��Tk*�k�	]\�
]D��v�j��H�$���_�^y^�uH\��#`t2�A�@�A�ÁI��Na�X�
�/.�"kV3���3h��U_v���Ы�y�`Ǭ(o�s�[,`�r
c�f�=������B�N�n���OsE>푬��?fb�X��9ͪ���Tr�e^�5A
�2��*�U����l�G�N�O;e橬2�q��\#si�����SO[�ۖ���ؒ��A������s���p�rqH{�Ys��P5�<�rʄ8t;��k�Vn�ȸI3P���<GU�]����T�W��Ӗi~�4T7_wc�V����v��u�v��8�4�l����:/[k?D�\e��H����u*�������y�s��zU���<R��D�8˨S�o=�<g���)�ڜjG~~�[�z����5�����5m�5bgBC���[��T�<�8��~��o��\�?��z���o�iߵuY_���@T��l~���-����E~�^�|���������<�@;&���?|Y�ܰ�-M_]>��M<lE�ً��d��U�V��X]�Y�
;�7�C���1�{��2�uk����CN�D�.�Nj�9
�M�'�t+|t߄S���.�M��&���v� ]&�D�h�pB�蛙pzPI$��A�D����l8�ݦK<�!�q.m�~�����a7F��$؄Hџ���L
��o$3�����v_��/�v���/	bݓ����܂�(}S���T<�{�<%6�.Y����/�/<"�*����Vɧ���.�@%�)D+�}X��ok�
�h2��ro��B��Rd�.��ݬK�NT*�w�T�Z7*�de�4oў_2�%0ѿ�G�o]�yifp�e�
�I߃��7�u���;�麤��)x_�-���j��%⃤|����%�|ݓX���/�Sv+�x����{B�7Hއ$/�X�d!�?~���eML —1$�Vs�ȠYY1����Zح��+�1�=;b��5."��`�;Y@�^��-�!�9,��Ɛ�zc��B/sc���M����<�-(|�(�g�쏙 ң�T�� ���8�"�Ѡ2,�!e:,�]�x�)����6��b����!qR�r�5��{P���fo�ǢS���|PjTD@�;��A+=�K�a��i��Qb�9�D�ɭHOۊ��ʚxh�f؉� >I���T:[�s)T��K��$��k����W��_o��I����(�Ζc�K9��z�匀h��hT#O���{��!xOG�\ˤ�R؈��v$�C����u����zF-�}�v�������ݗd��zݗ@���v�/D~��]�)w<
5ׯ�ʻ�6�?�ɼ/Y�븣uX�CW�e%O㉍���i�K4���h�����oÞ�X�
I�
�G��ocT��+��.I��@��S�o O<�N:Y�
���Z�=�x�ܴxD�ҭ�Ͱ�7���o�N�.	ۥqI��Et�O�m'%���R�e�
ylQ𢚛ē�����IE��wl�����F^8�����k��v��8v@; �=�.&��{삏�{S�ꞺJ`�$$�0�o�߃�F7R���Zߍ~�?j�OŗnM�i�f��!��{�G5���TH��N��*�����K��S��7W5�]���ߣ�@E��PVұ+�7/���=��#�I�~��7�9F�B��Zo�t�n�->,{��c��xP*�O��Trxk�p�y��=->�����w�d���̦��yPH������~x���(}�&U���D��7WurcfqZT|P�z*8�1���m��o
.��2��!oԖ�XaTu#7V�^�i��A)�ӌ���a���5ު0Q�$��XvT��
�Ur������6���iG�1�v|P/ɴ�����Fo�N97�H����D��<(���lLN���
(7j<����7Ly��kS����Z�C�
4a��R�����e� �s�4 |������ך��!m}_ό�^&g���_�-ͯS�s�Vaa��ê�לsk
a����m�@�/]�ͥEW�[ͥ�V����a�@5��J-<h� Mα�k�i�@-luZ(в�l7f���l���[[�h�>zosi�n�N��Us����������e܇7��+�/)��\5��WúF{�kX�
�:������e�K����(*��1�����Ga��������p A�lYPXb�")�a*R���>d���Gv�9 ��8P��4�(i�E-�b� l� �=@����!OQ�p�8Q��P`K�0p����|�B)>�OH"9��'�9�� E=V��`���$&���g(������| _��E��p�g_�C��!*I�d0�`���H�>"�q+�e�x�{�v�]�m
N3P�g�F�_�F^�����L��L~6��K��bN��3��a����+172���`��R	5u����Q�����/
-��2<Z���e�,�C�=�:|�?���VX0��h����%���*,���ȁ�C`A�%m�l�Օ^v�0uu� �ʅ��$���Ẑ�n��DbA���� �a��{�M������UD������-��A�[_��:�
b�_>H��F/�2b�܀�N[Ab�ηDl1�!f� -sŠ�
��p`<�K�.�>�jq�,��4b�έ7�.L�~	�u��s�Ata�J�ک�Y%�{X/L�*�j��#>������+b#��
�Ն(v9" 01��a�� t���c������!��5����!׉<C�<�7Gq}G����pح�´����K�ǿ�{�Y��/g5j�[@�T�1�r����1�v��);_W��2\�@(�vt��1��S��
:껠���a�����L��n�Hj_�`�@7?!O7��X��	�W~b�naEC��}��.�A����
X((�!\�-�g,�A��&�{hu�X!r�R�EZ�hm��"�����oo`?!|�#ng�����7��k�ah����y.s��qSg��Ș?f���o��W��8�
3�a&0�a-&�B�
��+���U<z��v�R=�Ez�ӻG��З�W�7���S�gP���E�ϻ_�����_��<���^@��o}���R����7�~��{?��?���:�-���~���/_��6�Y��y߼�^.�.��,�xY����7O~��]������˻G��ϯ^�|��b����'���]}���9�^���$����]*��������㣟��ОDcI�
����g���<n�O�]��F��^�O���_�|�8}^?��ś�O~vw���_��??�{��U�?��|(~э�|4��z�����z�iy�8=��������z:����S�ۏ�o;_���W�s{�}r���㝹e��x���w��=�������?//��ǩ�3_��_�L���.�"7�{�
=��~2�Q>�w�|H8���ӟ�yt����=��8-���_�����=�Gϟ^�|����7͋�>��m���U.�#�Gxk����/J�e�呂�ZR��{t���*����O�^�Jx��y}�:��'w��]�|��V^v�T���ɐ?�w?i��j��g���Uj�.�~����E�������A��'m�̮׊ٛ�ux�qyl�!Qen�MWL޻Tg���G��o���~���'���ث߼�m�x��~|�C�������?�z��<�x����O^���R�o?)��J*�}���O��؛/^�~�q��O��b�?���'��]~�_m����{�$Qk����ߥ�.63ު�Պ�=�5BTBʓ/�oߤ�yi��������
}\��_�]�7�mk��ŧo�П���d������w����7��L������_��o۔W��|^ҋ��m��M��[�ަOZ�ܤ�"��(���b��zy��ۜ�o&��/�~~裛!���ޒz�(PO�U�:�nS�������}e��Q���/ޖ�2�����S��6��x~�K�瀊���/��q��xrbկ�������峗�Z�tK��M��������%���?��5��U���O^�l]?t_������"��W��6Ӿy���O�<��LcO��PKE��T
��s��#pip/_vendor/pygments/util.py�is��;�F�@&AJIӔ��qt$�*�ǖ��"M/���"��l������H�Q�fJψ��齽��O���,S�/T��4?�t{�Z����L�f}�|%��\
�i�H�/z���C2]5g��A�i�H�ȫۛo�߾�
�$X&ِ|����_]���~wN".H����4w�4�B�:��)�9�+7l�.��4ϙ�t:2�'9U�`�n�O�8a�p�;^'�Z�l�p~_�[N:����'gק7s>�/\�B�hz����à����rO��g���Fg䛛o���\3�{w��{މy�������E:Ϯo^]]������������s��ۯ�ߝ{Eg[�z�/N<w$��������ʱ�5��>p�����o�O_����:�4��,H�����8��!2
�u	������\]�"��hR�s!��*���4�,$qDx������I�8�E�8	%)U�<�fD#�Y��Z5�{��~��r8C�S�`�N'�L�(TvQ�MY��$�v�Z#Z$��5��%i@%;���d�T�9�v!}��V�,�o`�1��R�7>bnu�ng\��Y�������r־f("�%I�Ȕ�R~.�|�e�OM?����q�4w��J8|:ƘT!2KhC�SΓG���/c,�L*��5��y
�����l�gj�B�'�����&��v��2{�IN�h+�/����u8�A����g�K�(X?B�f}E�L��_˷ҁ��mxhf�s������gΦ�n`s7���8��TkP@�&,�VX�EvH�A���Hk����ؾ�
������Gn�ش�~�i�x�[�:���F���͘0Z�Vi�Ư2�ߝ��
�X�3�� ����d�v|]7����o�H#x@�'@��Ń��s���4ꧫA3����z&sF�$Θ˧?X.m<�2������\L�b��YBH�w}D����8�nC����S�7��B��=�G^��z�Ѷ��3��7��c�5@��B��H�=�P(\W�*PV�(��m
vDU@i�T�W(1(��$�N�~L��^�x��/
n[�K���̱�Q�U�.-M�4���?yr�s&���R�t���sŃ�m�(e�u��PjyS*�� ��s��B-�L�y�6/���s6�`պC�3X|���R!@#�sܣl��F���H�P��`"�ja�ʛ����/S���d��E:[�_�=#~������Z�g�ȭ�ں�Ά��~!Eg}�=@�@�m�c�Ñ?
��VIU<��r�����b��
��n���[��Jr�-��X�+)W0|�'럟��~����HN4<�#%��)�Z7��`<,(�&Р@	�eh�r8�����M�����OЦ~{Cdń$�N/r>| @$>�"��B�ϠM��X����wBn�=E Be�Oz�x
t���J2�^ڏ	-Oѯ�Zɨ��n1� [�l6��l�W���c�3���F�W�0�fK�.|l�]g�9u�����ȠYQ,$,���ظՐ�S�Ɲ��>��C�CU:�rB��L�KmBK�5��UM
��p8�̗�P����D�l��s��]�`��/����S��z�bgZ�����.��� 
?N��N�y'�bI��t�Ø�z X�Z*�9��q+UU�jQY�Cz<�x�X��F�$�6�t�0�@�].�3�|�V`�o(�C93G7 �\�	ys����)���v��ݜ����@�&�@���_�9-'HA�R�u�ħ(նD7t\J∤�L�"wZ㏦�k�z���koW6�T�U�:٦�GT��'�%�\����Ȝ����J��0,��X����Յ��� �	�
���ے���@Z�˔eay��F(�1Egu��Y���֊�u�g+��n�s[����;�>n��e�5g�5��i��װ�5��&Ȼ�`0�-���8#y��[/�،*��X�A���uUHI��8'��2$ѯ�>HX6����^���/�4V�۴-4J��v��I��r�g�F��)�����KC�5W*����·d�\�S`����y5�e��`m�@�@^W/��2X~E^�BZ��.큊��%���.�|���d��K���.�u�5�Q0�1~��m�^��P�ukDu9��MpXt��~�~n�x��I�u�9��O�J6�� %���(�����Z����s^$!��!�q)�8ˡx�Ȋ���@�uA�n��5���-�Zl��@S��Za<
L�<�P� z��H<��{:)���h���t��a�p��:h�CΎ��^�'ח��HJA �?��+�������d,;r����[�z�و����L3�����Z�C�>��|-Bpb.:c8�v�D��P��e��#�J�j�6���ty��I[s�T�5"!��4Pk/�4��ʁ�T��=,�:�1P_�߅��8�^u�Ypqo%�
T�	V�9b]��o1g_A�&�e�v�,r��$Vv�:��0���Pt�ؖ���%���P ]b�Æ��:�s��*L�����^$���oԯO3�x��w��&	r!����}�S�Y��(����V�_]��1 ӷъ00��P¡ya
\�"�}�Y
N�;�BKs0�]I-|�N+M�q�� ,�N��ޗ
g-��.X�n3{ߚTaD���7:;�0��v4��? ɜ�Yl%�r�m�-<��h�٘.m��%W���6g�&<��g�-F7��1�Б�Ml����"Խ(-v�5��9�"�<SJ��!D���O��{�c�}��p�<P	��ƌ~�9mQ�K�]ƪ����l�}[�lajF��@b�]�R�r[�v�����l�<ꡢU�/e��:�Z��Yf��,H8���G�޼��<�����E�B&�E���|Ȫ��W�]�_��GI-��/PKE��TS�hޅd�(pip/_vendor/pygments/filters/__init__.py�][wܸ�~���:'�[�W�/c�P9���(#[�$g�؎�Fws�&ۼX�wgV�e[�f�
�왬�3�H|��
�n߾}+����r-�,Ҭ�e�������(�M&���k��i��&ʊ�C��M��i�W����\.D����=1�&��L���0z�������A4��ꕌ^��E��ݨ�2z��ӳ�&K�W�0��yr�����Ѣ(�>p��� �t�)�:*�[��XG�t3��$�yQN�*��2�ڢ�u	"��k�v7�A�\�|7z)�r7zZ�E���JkYmD��i�*
���K]_}����
[���_��M�f]ᥬ/���/�
���Js�Ǭ(2��K=KV(�<}���zY�ϊ&�N7��T���Y�[-�|~i]v�s���yc]&������v5?�.'�pDgH��$:�uS���"�Q���h)6'�[�MQ_a=;>�xzvn�V?���}��/�ޘ$�H�2�*U�C��N_��B�::B��׈"�w��dh��Z�����RU���}�M�۠���A���y��Z�[Zw2
NW�h���u�=���<\�~V�/�+�F΍������l�w��������5e��ƽ����*��R�cq3�b���E��0�^�"�h�!=B�\����/��t�����u�������b3�_`1�U�eﲔ��e��	4ȸV�a7�$��)�R^C3/�;˾���zT�=��z6�at�����H{[�עNV�aMa�؆�U�5]�0X	q<�4я�;���j��]B����H�����E|�i�{�%Kh,�a���=�VNxؙ�~���9n����8چ!���X�<6���=tR��Z^��˨K=�K�]_��N��.�$r�whOU��it�H���Ev�?�/��E��}����]T=/�(��o;�(��EW�j+�t��͛�t~�8}rj~����T�?��<�x:�����6|����帒ق�,�c47,�-�uwduc��n4�t3p����DAy%���P�(	F�Z��h�r-�I39.G�f��V;�f*���{4��H��[�'�J�F����U�jxc���~g�ט��2y-!i����f�G�L�q�}��!�UTM��)&T1��$/�'E���\���V(�bn_r�
��,�C�((f~Y��j<7�v��n���k�z��zVd���?IT�V��&࿕FTQ�@tz�.Ί|��Qi����Ǖ��,3͡t��.�ʜ��~�n�u�j_LV�	Jz/V��uQ��M�T�2ݶ�_�8Q5C^]�_M�i��j��M���b��_� ��=|U4e"A��\�W��\�©N��<
ĠL�KLx�T���QP�
4b	Yً"�8���t:J[� r@�؂�E^�S�l	1vٵ�Q�_[�{'��J��M«�{���l� ����,�z�p��e� �wm�'ܛ*
�ـ�A��gy�-c	L��0�
H�Km�0[���
0I
E`����� �y0��i m�&H�X;���#tB̻J�~kM����%5km���=&�f��b�	/M�Z���Xk��K����>��D�OBA�!Q�w7 2����!�7!�{H��U �����O-�ْ ��*d��ҫ�i��Ӑib�\�^��?$ZR���oD�>�p�@�S� L�h�$$Ü�p����,$��S���h`�z\�6S��k�Ka~׭�a
��[�MU���}j�J�HW�l&�a
��HK���`U|��OH�j4��!��E>/�����ֵ3�^Qh6.h�)�La�@d�$�%1綁͛�m+Wt��h&��;�%�͆�oki1@��I�U�@��h6<��Z"-�:��s-��=�B��*���p���	@��`�eˌ��$ѻh0Nd�
��w�(� �RXdE�Kw�H�(��/-��}C�=Ae@G(����K4���M@z�+9_�vÀ���ҥ�l�"y�6����)�[�Șm ��uZՕ@<.w"0�.,�Y� ���ګ�{��$�B�i���\T+_K���\f>-��X��@�Z5%�쳎�;�88�O�a�@#�1@XZ��̨UU��a[���/�%/o�p
f�ϝ��^���2�#2���yQ;0�Ƭ�,�!��
���q0�Q�
�x\��%,8�K�t��Q���:���%�&"С<d�ہ�ћRhB��1�m�.X軌���a���G��0��w��`
�E���i�T���OXw�F���Ѭ2��ۀ�i��2�:��M���s7@��@��K���2Qݬ�-}��5�����KZZ~lRo/z���W8�@��N=	����)e�𭠡2	f�o9H8?�� T�(�A: �N����Q�sY��ݓ�s���>�����ޜ�@s�%Y:���]#lK4.�|��й����>�*�K�������:����]�+�:b�]40����.@~e����L�5�������q`ȁ�Q�;��8z�.B=�׀ȁ�=i���A��:0�1�"�@y��`
ļG`S WT�c���
>8�����(H��6�L`�����G($��)������ɰ/) 07s@��‰�B!� �o���t���	k]IQ֌���F̥@�*2���:�ߡ��zS��@43��,���.�̩��| ZZd��p���)KuSz(ܿOZ�R����'��n�li��Í�-d34��뺔˴�e)������WPo���'qV"[��s�W��h�%�X*��V;:}a��U�d[�@�)��
�t�o�>D�����k��	������,e���w9`.��=I��������ӭ�o��ϲ,�0������1�q ,1���r� �B��q�όES�eY�QH��%��8W�u@����O2�ʲ �K1�b�r��,�`�G.I0��C��!ЯP��0�O��O��ݡ��,���<�u� ��!4���f���aI7�0cT�a%S�f���iB:��UB��Oa5����(��0�/a���AȌ�؟��/?�!�`ބ!�`���h��0���A��$%��!���0���<�=���!��a��eB׬�UBm,
C����P��P��jc�0��dGfA!d;�1Bf&�MBc��0���+#�/UB�őXQ��&���)��r�Я=cg2jC��܄!�_>�!�_��K��T�w��C��<v'�8�M�ĝ\b*�_���K���̝\b�����C��|�N.qnI��؝\℄���%f�*�wr�!�_N��%�Py�N.���/��%�P�O��%�Py�N.1��˟��%�P9s'��)i럻�KL��/��C���v'�B�����C����N.1���wr�!���;���俺�K���\b*�_f��C��$��A��e<w'�B��5oC �_��C��,��%�PY��K��K�N.1���O��C��|p'�B
&s'�B�e�N.1��K�N.1��K�N.1���Ɲ\b�_>��K��R��K��R��KasJ�;���/�;���/���%�P�r'�B��ڝ\b��wr�!�_>��K����ώ:��js�gvԱ�8�ۋ�T���c?�*��_LAB��9,U�aA���.c�,4(����hPқ��ThP2ۍChPZ�]̱�8�������c�q�	B�I��.�8v�z�W�l��N�1�Zr�d6ݱY9��j�IB-�
A�%�m�~���[0\�oQ�'�pA?��/�^I?*�O��B�#�o�fɖl^!tOr|4K�&��[�x4���*h0tF|4�f�N|�DK��Q�:'��[��}ڋ�™��A"�X���;)|�(��i�����U� �;������z_EGʌ�P%��hF*l)-(��;	�B��,(��;	�B���I퀰�1��a�

�'A*t�w̷y3*Ԓ͞��h�wz�V�%����:�;A�ѯ�A�(?�6|����-�.%��T��� ˔��� ,��6~;ea)����%O���o��J����t�wL6�;4��1�ܡ1���&p��������`�Fp��q���1䀍���c�8�
![��;@��pA[1��}�~n�B�F���$�@�V�CX�W��}Mɶ��e¨�
��ؖ�Chқ�|�=���2aw�R8��i�R�!�1E%�5�C�+SS	@h��l�,���0|#~�0|+>��u]�K.X�_N��*�ȝ3�¦m!�q�$��FA�+;|��Xva��{!�`r7C�7��?�����[:6����Ì�/"�y�U���
�v�am��MCh�p���E�*�(
3F�R����؁��� z$@�CX/���{Sz,@�\�`���k0�E~s2�ǒ��qK��0�*�?`Ž�P���"�/�8���^%���~��zL@l��{!�,���d�w��=��^~�-}tJ� l"�?1`�`X۟0�JNsn�6�-!|d�����$�Bؐ��褃ŧ�<a��0��y���S�
�}wa���R�'	x�L���E�P��M��E���@�	�<H�Mw�C�z
A���>�P���vQG��WzA\�YfaC�/"��va�b��b*�ա~Y�b�9���dv�A��%�S�'��`������_���bs���di@�}���L8�~�'�p~�1x`E[_�#[T[�}��$�Ɲ+ ��Uۚ6��v�C��f
��7!a���3y25~s&��
;F!��1�fGW��(���C��U!lQ8w�6xG'* $�1��g*��dv��2<���ߞ�0�/�`����l��4�#��/�n��P;
A�q�Jz�B|��C�•'�T�#�s�故c��v1�������M(�a�*��H�}�X���cT�i�P׽Џ�0�&�*�]�l��b�S@7C(���A*�����^�`�/����c�/����!T����#���a%���>��?xg�Øs|w���M��=�Y�T�a�>��';�!v/YX6F�e{"�`��f���#q~(C��٬��1��I��C����C��U���\k����gk|���W�# b|�����@���-<R*���gb*����$k����p񱑕⌀0ڔ�D����͙^����u�
�F�i�c�lw�Z�1~�Elε���#����j�]ܡJ^>�<�g�<Y�Y�|����,��K�l�pU:�����&�_�'�"ij_�%SH��g�I��)�tp�Z����y��~3F!�&_��Yg�q��4�U��wD����1X.�2�h��m�,6NC�̿��
�m����K���V5�=C�,�>@\��!�_�6+2���{�����2���7���x��}6w�� ]g�sw%Z��\��:i��9
�(�ݨ�u
�Y�����\ߨk�o�F8��Hz���^�-����Sr�c��S�[����t�+.V��#&��ou�-�W_q�^@�XT2p��SR]�eŕ,��;�ͦ�#�����׻��*MV���yZ,��W�r�Pu��z�Ջ/8LD�.lo7���DiO�b�_>�
R��Tu�d{�a$�bS+Ntu�F�BaKh��L.�t.C�?��u�!�Q�#B�	W��jC-�h:�Z0<�:0w�?{�t�U�+ߤ�[�������95p+��JS��d�OM_�5�]
�h~�5���U��W|�3���w�ߜQ]��8xg����Râ�2{��䛝�\:��+(5O膵C�NJrk�O���T��5u�.sw���K}����Ѣ(T��[��?��Y���+�4Ϛ\���B;�ۯ���{���TS�n�ۻ�m t[;9���ܭ- ���V�hj�����1-9�&�<�}�r���Oߡ\�4����"�;�Tr�2$�a^t�Wӭ��e�Ei�G�R�R��UH���.�*�o�׼��$���]��V�:���Z���'Zu����A��+'�zF�׮�>�"`�o�����~<ھY�o��l�UFue]����x�[_#�&K���x�#�r);'���`6�](��:�=-ˢԦ>~z�|�o%��m�3�V�4��J]N�X,���
�ʲ���w�e		b�K��Lk"ԧ9Q���4ҏz�FT
ې'��#�V׾�Y��'���I/�eh2����)�s��0ڛ<�7�Z/
q�N�c=�����~�˜Hc�;�Ee�QJ����BY��E�l�U�:>��xk�6�V��݈��!�{՘���4(c�u��V;[�sj�_?iiHZ[?����N�t��W)8�F$�QC-f��	�e�T=�Bj��d��w�����������V�c�B{+�P�����w;���f�s}�|�nԔ�����'t�`�����檪��@R?n���mm/��<9y=9�ؙຣ��`�VY��t�mmָ��L����/b�!����)u7�5��+�d�����~��t���	�?���N�_^�|b���}��9��O�O/]���^<:�a�����ĉ��E-M�l5�m�P��F����l�d���\$���VS����7�J|��h�vf
�u�H���!�_�lM�#J=�$�n�ipq���1����R�uc�(o�3�An�;�Iڄ���̞�b�_�>ؚE爿�i���ƫ��g�?F���_:�e�W��?/���4[M2���d�����i��8�n�"��g�~5�e�]PB�ns��&�9�e)o@�ES��+'"�\3��z��H>,K�	yV@xs��H2���UC�\o�g+�ގG��k���/��F��A�y��
��/At�Ǝ��}���W�rF��ؽ�h���E�H5Н��k3H)��Ntt���&��U��YT��d;u�~G#<1ᤝ^��B�-�{��k$brnx�?�P�h��&w$~��*:�;��vժ�w����!�I�K匄m����Mv:œ��9�/��hd��j8B*Qe��v���GDh]8��r)��d)'�d�4��r�n��u?J�6&����U���#��;e��>/a���1�ج���Z@@o5J�Jr%��x^iޛ�l�|i��~Lڹ(�ut�j�
�c\Ǯi�ݨ�8C��6�wX�u�KsX�w{K۵m�{�Tʹ�Ѧ,V���֓rM��Zd������к�r�U#�*����j�չ#L��|��W��</f�a�E�KH싦��\�#�)�R�jr+U_�Tk�?�9ܼ,6&E3���4���g�bI�ot�:wJm���[�������|-t&�f(�X�6Y%��k97��k�+��d���I�|TC0����Iʦ�Cӝvv��wZDK���er��XԿ����`���hu=�۶�6���v�G=�b�*�11� �_�Ue�O�h��!=q_�Wv�����>�U��-�W`[�
n$��T���@��L�ȭ�SUմM�+��U<�����cȨ#=J�&Ve�[�j���&Kk���u��{����n���e�3U����xW�Z#v]p[Wꥤ��6�.n)�'?iG���k��%]�'����\�2��R���L�Z
~�vѫ=u7|C�V���V^-�������|�U_v��E.ٻ�i�����&���&���/�����b��G+��]�� o���D(�_�e��[���\<=;�^�4R=\-���ft�ky.�Ҙ���F��^^֥�'
m��bU[�kŲ-�'>A5-�K� ��q[���g[�D�����H[F��Z9o[�zz[������\?��|�PKE��T���0��+pip/_vendor/pygments/formatters/__init__.py�X_o�6�� \�;O��yH�ХC�>�JK�MT&5�J*�g�I���i1md��x��|>�x�vd�贔�H�aJ�O����3�����u.�V��u�J.�������Zb,0�WD3F�>=����>ub*�3�ٚ���������U���+�9f�XKe�bݛnu�jښ�?J��Y��H������Q�=��ۭy�f�LR��ّ�5����ǻ?�n��_௫f�E�RrQdn)����1�꘯+���4�e#��,�hUe�$�Ş� /۵��X���e%��۵�����`�W�1?�i,��Rqm��L
�9�!���yCr4�iLxV[*��f���$+Ef#�tR��Wr�\[S!�w�4J����R6�tS�gA��t�9�"��C:�ӹ�^Z�DHC >C��=4��b��[XV,���O��(*tE
K���^�r�{A��.G�7��D��a\tr�ES1�� "4�W�PUE$���oD�1#岇���̥^��V�V�����'�b�����	�y�A��*T�q�Ʃ��I0��9M��${(P	��q�ZDH>U{$ސ�wk��k"}J��iTJ8_XoEžZ�Kp�c�>Ҫa��>7�n�ӶOϑ��잦��>��ZΪ�C�eۛ�E@��*��I�|,_�
aJhũ��S~i�A�By�D�b��xc�!(F��/�d���o%al���5�[$�C�Q?��"2������?�M�86x^^��<(�y���sr�$�e^��oem�!��…6Te�ŐR����*{!��@Lf�3k�s�K��BmCe�\��<���k�{���ĢHI����t�Mt�����F�w���I��I�GE��^p��UG�!����5ˡ�r`q*�+���#}{�R�o�'��@�c�\�T�
�[�H.�`��X�
2�)%�Zh�J�Tƹ�Mo��)Q��MK����!9D'/[+	��O"�O����Ȩ}���sp(�#��O/>}�
T-P��Tj+��<q�
QucV����@�C���E�kR��2X"RqX�K}���
�'ZR+���Q���@���M��-
V���"���p޸�`��@px��p�Z
��i��i�����mÔbۺu�@Y3����-��rX}PzR���"Y�N/#��P�a�b�������5�����>V9���c�B�r��!����3� g/gx��%��/���Q��fd�f d!u�Ō�=�AE�&$�/)�t\_�j�•�ڐ��7Ja�ɤ�˕v���<k�rD,�F�c���{�!��S��5��4x�Y�&M^���d'��;)� �]Wc�CI7��S���>(Y�_�	��3�����j}2�6C��=�3�A�vOQOwP�TF_�I��n�Ad��x.���Z���Z7#�‘�R�6���&��a<�{��+$�f wE��_=�����g�5�5�J�cq���e�`����Ǜo�a�q���sL�h?V;m=�zc�/Y������l���f�*�h�[�:l�&��9˶3����a�m/�6�xgY��~&pB���lR8Hu�P�*���?��9���*�PKE��TL��ߏu+pip/_vendor/pygments/formatters/_mapping.py�YQo�8~ϯ�d\�ۻ냱Y�ͦmI$���B�%��F"u$�8��J��M�g��D���8������W����Ź���^Z'��*�,�߯�X�]�	�d2WZye��a�TrUH��Bji���נ��E�ɝ�k�lomjH�B/$8SJ�$�F��y�
�4l��V��5xZ̥VUrkJ6藲SA,��P���� �8x�m<��L�ֻ�W�o�ӓ�k�TJ�D��^�(MRS��Z,���[x�����^�zE�d�!����������`�P��NN���a��������^���ܸ��#��Go��Ln6#��0ڷ��y�rѸ��a�
���G�_l!Q�V�/��[��]�n�*m���j�����BҞ͍��C�L�`�a�L��X��m*�NX�s��H��㕔'B��h�zY��b��U� '���*���h�<�/��%�A���J
�=�E�ph5x��&��s�l�_b�(B|��C�=h�R�d�m�R��Ƶ�*�v�*g��x��w�?}��ݱ&��eAb�M{3��E����Wb�5@�TT�i�
�Sqx��ck���,��D)B�az~� �@�x;�wt�
R8 E��f?�J�f3�b�+Jx8QYٌ�ae1���j�2u����"��א�9>js���\4K�����Z<h?�:~B�ٔCY�������t'�]K�J����C<�O��ӥҋ����v�_^���K�����[|W�ȍW<���/�'�߭3��ܧ��ȅ31��b�6Cti��݈���z}_��Ypf�����|�x�a5�3�OXe��-��:�X��l�������rkƍ=�j4��MC��c�+��:���������Pv�.Q̜{[W�C�H�da�ºp�>�
�1�	�?��m_����s�@?8[X��IB/0Bp����;�Wb5%S�@(�4�3Z+Va������s	s��%�,7�™E�	F��+��Zc=W����w5���E��Hn�MK*j��{���X���y���LZ����bȈJ}�"�y�Ëj�V�c�|)m.S�~S�ɂ��Q�q��Uj�3�^��Wc3�nV�H��[<N�����Τ�cCJ{�g�8N��j������jнB6�}%���E�/"]B���sH� W9:VT�d!I8���0c+8��Ϛ40[�]j�u�1�`���.�#��5�1���\��n���&���6��D�ū��~�<�	�d��t�5� �)d�D���7ק��C"Zh
��� Ԯ�:^w�Lݒ�0k�m|�=4�}c�^���+ڧ��%�T���
����Ŀ���z�ȧ�اp��y�2�����	S[K^�����3?�.{�4Ot��4�z����|*���^�*
{���&���TVQ�D�B�"B9���@�$Z�2I���$)1	%	gPY�(�4���;i�*+c�%d�ƅ/Ϡ0�*u����Y��q�>���2�~+�×c�F~3JۇLYB>LJ�IB,�q��FaYj+U��6	���k��-x�<X�q��Aڂ5Əע�uEBX��v�Bm�I�P��w��l�����pF+�:q]�O:��� ��j��j�����>�.>t�pG�~�ܧ&�c�W
��a����4y��ϣu�,�=�"a�%I :I�
c�0z�S�Y�)m�IZb��8I�mI�]^ͦ��k�a�6��X�]5�olL��:��#��C;�C�do/0��N��E͓4:?�oP�uU�a,
������z&O6�{�:k�Qsn�aR���RRW_�[���0��0�H{�JLz�Q���RZ��h۞v����{/�sm1��]J�D�W]�Q�F}���ٰ��gМ"H����/�ز���;ɞ΅��f9�T�����j��9�J��fE�RVd�Βzi���q
�ס�{Q�F�W��QU���p��aϻ��g��C�k=�x6�9�����]v���ǥ����x�Z��Rڴ�JS<wi�x�R��E_��Y����n�~7�F�0���X�>Í�I���/�h��r4��D��[Z[J�/W��h򹍝�U�5T4�!�-W�N�`p��0��N<~�i�����o�$��`���@�1�n��4�
G��a�O���q2�i<����PKE��T��{�)pip/_vendor/pygments/formatters/bbcode.py�UKo�F��W��6|�A�������ݓ*�Kr%mM�ܥ]!h{g�˗�pS]D��|��7�������î���pk�B8'+&Ij2����M�~�"S���x���P���-��ۛ�>����Br���''E1+%|���_~��\�R[������_�>}��D��I'Tn��&3�l+S@��0z�:3Ux���4�����ک���I%��)�dE"ϣ��V�;��6H�k��ʹ��-8�+_���y�T�Y��WՆ𰗶SW��9�JBmeF:B'��\�$FT�E�L
�аG�s��TxSW���1_�3$��ʗ�2�rT�J��>���
{aA�u�:QU�>�*S���M���gb�{k�x�F��{j��趙��1�	�i�M!�������w!��r��Aft�0</j�T��5�nx�h�2�Br3vQ��`�1�F
����|�9�\D��)��ؽy֍����R�TE�`��W)*�X��T�̴|�\�)��N=c%In�-��XZbG�nJgXM�]P�J�If^ˏY��N�+���t2[4�u�\��]�.�ל�M$�g]Ez!��{6�u��4�[Q�n���q�ς8��pb%��lq�i"�U5��5� ��ѧ�xǍ�(��)��ȭD"���y�Hd�A��#*#�s�P�>`
GS�6�����ϕ�XG�#��
�_�D�7T.ɍ
6M�Q��rQ4�2����;_�Y�{�k³Ɲ-]�'�-��7Ř|�0�ϔ�KgR�s�{�=v�΢$���W<ʨ�����r�9�
w(���lqN{�ތ9��]��T�`t���x���k�=�l�|��nx;�;r�l�k6@��tt�;1y�
u�	�S$���L_!P��e|d�+-_�/q�'9�4���ľx�>�ԃgh2	��:$���L�]���ZKM4������'uN;��vБj;���8|���Ӡ�h��ؕF�+
ز�Nҙ�2vO��G=N��+�~5ZNN
:Ւ_�>�q�ѣ�@ڸ��㚷���X���{�e�1L�6�82��b�]�{�ѯ�7�mǓ|�A��Qz:�h��ag���<N����;�d:ߙ������dO�>�g�_+l��A�PKE��T�$���(pip/_vendor/pygments/formatters/groff.py�X]o�6}��`=�Ws���@�v[���{�
��(��L	���߾{IJ"-�	����=���d���Sw&d�yy�R��
we��j���3Q�?72��#y-�Z�����X��^.�m3$��g���k�=�g�c��f�b������5M�c&*� o�����߾�x�N)N��<������C����a�IZ�R�"��2��e�w�|���Z��y�Ey!g��/�I�,�"rC��/���[O&�8�UE�	�����G'2� �\�M�YӂA�r��1�$/I�g*����nj�l�!�
�幠I’ł\�WWz�u�p�3`PǬ��ӈ��ڨ1>�!q��PWlFb*Ȗ
�K.v� w
R�[���֙\�<��g�y�M`L�r�W�Y�i|�B�1D�5�k1��{�e�lI:=��h�:め�8o�KU�%�>l!leJ���/i��oJV�����<�`�f#y�i+i�Vy�+��`����[:[�\)m*D
=0�5OՅ�>ь�
�c��3O�_��V��g�p��@�����"�bY:#O���������'-g�.���^=����x3���&u��?c�N�#=
�sw�gH�*�8q�Cd?��N�e�V���́~a���!@]��	�Z�.ٮ�h�)^�������
*5��6ϒV��C�o,I.���V��C��€mY�c�I�\X��\S����
�^��<g4���Sm�[�����2󰼨��W�'b4!З�>��wV'F蛬���>�@C�����Q�����݇.tn6��_�X^��ipW��VP�TU�{����U�zI��������~���%��������;R�[�z������p�|/��p��%��ݖ��|Z	����t���8m
ry5�czQ]��	�B�}G�	���[������*Z�	c-{���r�����ܳ:�ڶ���[�Y���J��W{�j]�J���>���1W%����L�4���7�?v�A0P�Z|A���%�)�Ɨ�f�!=���ن���(فr��R���;-�����[����Z���E���}�E�H�5�ja��K�����?,4���bc�p]�d��*�R4v���u�G��5I�MZՁ��’8ޭ`��e=��t�����zQ֚�DhP����Xy��뗏��t/���	�|V3.��铖��X{{l6�K�D�'�Zq���Fy�	&1^0��[ͺ��ô~~C?��q��(�r�&������a����X��Ӣ�1l+N�G�Zh����Խ/�˘��w#mP���-I�+aN�zӱrew��jrv��*���f5Ú�|p�o�W����W�������Ky�(93���I�=����s�ZekX���櫻G߂&@�0�q�1��	X�a��r2ȩ�b�	��Ü��4�ӝ��'j��B�u�sR+^�w΅��"��o0��ߛ�I��p��W����x����\U����C��p�C���7��W"L90�PKE��TME��&q�'pip/_vendor/pygments/formatters/html.py�=ks�ȑ�+&T)e�z$�\��.�-��e��Z+�KiUE� ��i���׏y�AQ����1�����t��kz���p ��>.e^W�yQ.���e5Y�ˌ^�o�g@o�����n��(�j]O��E\��e���/�+��8?=���\̶�^H��@�2Z�E%�x��ۯ���݄�di,�J^�߽{������w74n"�(ͪ�`3��UQ�b���(�J?(�_��y8YE�b0/��H����4����X����̓�����;b��T�e�;�◱���xw����߿�����w;@��4�e=��$��
@�4��,���`P��"����c5�c������,���[q%����(˦S�~|ra��୬�h%�(1�:�e~"0E���σх~-W_c���g���>�O�����{>�����ǟ�D΅�OXi	��6�#�-H�
�?�˱�Q%62���
���H�5�ѐ���P-�R��28�.��ʢZ�<�Bm#g�|�EV�j�t.�뤪���6i��8��`��x�!*�����C��:i��B5bT�(u���YTU!����h�l�er]T3�:5l�FO�a�}�,R  CO+/�ٴ=F\i���{�;2��Co�����Ua^���?�z������Loo���7/oo�����Q�~&�����\���891��(O������Vl�X�	hl*N(}�C��ê�f�Y��`:������o�׸_��!ʽ�pbx|r�_�:9y}���/'�g''7oI��8/��f��l~A�������ד�N�����ߏ6�ǀb���(��9]�i���Ð�U�'�_-��@t��_�釫a\�5 r�3����6Q�K/�����a(�H@I��!#��:��f���$�r	��P?@��1����?wq�o�&��7�s{�ۗ���u���=���jH�R�C�(�jx��)�?l�9t}���
:Q]Nx��l@JSx�04)5Zj�/�
�
_<<\V�(�~xdqQç���Ū��Xl�h��	k]�>I?��qK�<
*3��Q.f�J��Ѓ�=�!]�i�+w��972˼��[���.`�!Y���Ø�LӊU~���	|��F���D2��;�5�b�; �bCV��샀�.��H�� 4$b'�r�*u�hb#�w���Gv��M&�*�e,���-���HA&��p:*C=5׶#Y��>Mt/E9@-v�V�pu�~��������.B�=x�iYկ�N&���|>�$�VY�)
͟(�#�"ȁ$��(���bי����3:���"�@�$�F��&�e�ZC��޽�ެ���P/�YT:�ل���T�ݨ÷���l;���A���[E�D���/��-�z;R��O(�(Yj5��J��C^��?���@\s�Y�W2N�`�M��Yt��2z/�m��1�	�C\<sk8O'ggk*=_g�;�E�"j��PR�k��÷1��8[��%X�
pVB��U��K+,�Ƥ�*	���28�؃�ծ�yL!���/ Lz@�ȭ�����#��� |�1q�ƺ"�,퟈�Mx�^��W)�i�Lm"ğ��X��y2G^ ҋQ/�؄��\�
����qn&�^	�jcS��.�j���֋"?��bY$kt����}�c���kP�,�0+�7�x��KV�0l�I+���N���9P�)D1���u�hK������0*�@w"�J���y{Pns�|�����U�hvJ�F�&.�!��%���yb�>�_z�(>�%�u���d&!�;P/�Z��(�
�f�J�q�����*�%��D@�MP�!8^)�0YV�F�fԳ����*�=���
\L�o@ρn�ɹ�Y�%_r|v!NO߼9=�;��K���>N����-�"� ]��.L��S�r�U�@�
|eu�[�Љ%ⱸ6He%���I�2���?O?:r��O�x%XBY�hz���T[��8F0����#+߬�kT&YQ���������mc���#��/����vM��NƘؑ����N�/ȇq�n˵Do.)�&��a���X�����r�>{~VL���,dz

��-^F )�
�M[*�]@__ ʊ��b�1_��'r��7��X)*�X{�r�<�);��H��/�"�#�	����HY�E�s� p&�w�`L/��V�Z�z��;jR�g������`�'e���!�sЦ���L���IP�⬘��=m�pԼd�ُ_(�o��4�ؘ��#�jbUi�.YUd�j3t
��� 0���M6������b�F-O�9�TTJ+j_��X.ɮ��J���#�RKr�HU�g�%z#y\�-��*��DC�p�l��6�K"	OV��:�h�`)�%[�arT; �Ĝ/I9=$�[�/��t�ܘ�XJ�XX����9_���0'cD�3�d���J.<P��Dì�ձI*�6�e��l����4|[�jI֎����H�Y�(n�<��͐܋�},�m�����m|v^�h#I�-��YTw���xmL}��)��0�[!>@��Fc�t��߸q��S�}@Q`�E�cҜ��]p�xD��9#���֕;�?e�I�Z'��#d�����+^�����L�"�z�\�b�?p/{���/ggvB����7���H�\+�:���HG���7��9�`0��?�x=~�FI!YrP�c�hV�ڱ���M��� MK%��=Z�3���{���֣լ�X���}e��:O&�@R6���"�ZZ�CCa�D�(DU2JX,ULs�͚/+��@�O0�M�Dk	
�}L��R�yk	�S-5!e�"�BX���-:E��,�,�#zL:>�n���"^�eh��NœM����a���v�{�L Z�`0�)8	h��'��LH�6i�/�L����EV�c��1�>�<��)��l�^�	����a[�ඬ��4�f%��@j�:3g��(:o�j�`i^�G�OQ!��OȲ)*T&ى�CtBe]�Ȝ�U�(���ā�q�*�7�ϸ�����,��<C���I�eTf)F��[�:�lmQW���!L�����"�VQY��ܨ�
���]�p�0���1��'�c�_f ���Fa���݆��#��ѰC��y��RƋ(O��e�]�Nr����lb���;�kA#&����������O��:�V�}&�	�����J0+k�U��)�9�A|�y%K�uHpe�M�}�U�D��*��u�I�Ĵ��N�4R�l�\&+r�I%��M����i9��HH�۞�R�*8���N��)����5�c��>�H�B�=-�8sH����0=�sq-�@���
�:́;�0�U�J$i�FNDٓ�O��ٚ�̞U���=<�C\��4O�i��,��?�h�w�#��C�	e7��?����7XD����ƴA���xh�:�O��ٖ�c�6�;�x�/L�R�n!��)�C.�ɛ)�G�"�>���ʰ�+���6}Xm�Fb����R�׫4����CԢDh������{Zѹ� _
�U��5��	�9�{�����#CxN~A�!��`~��A�廥��
�Se̘<<̋�C��SLF���]��6�8$�dv�0+�&(��){�0"�#�2������-��ɨ���Up��Fטx�d8��
l�?��6�:��ܩcڲ"9d)��F�/ч���tU?��U�l�剒�;����2�&1��?V~ު�G۽r�+�&��w��RZ�Y��E�q�#ue��}$�������*?=9�!���U�j��\<�Xt���BI�����]���%�K����Q���07U��ǻxz`o��(�(���)�ѥx8��
d��*��f |�hxT9b��я�^yˇ7�H���/f?p��X	<�'it��A�
"���*ѣ)}�p��{'�B�$�"�jU9�}xD[��#�f���%�V6�AFo:>�D���=��d��H�Z>\֋k]B�L� �C+�^�	yn"Q\>8K�?�
��[f�)�v��1��F�KW�W�d����������
�D�֏S�`N)���<IT; �5�S��1Kڝ׻��4�I?E��78:z�vt��im���Z�e�mub?j�A�[����Qw-Ae�F��� ��U,ӿi��!�!Xpio�Gs�(�׫����)��X۱��m��ȗ̶�̒�wE+�j�/*1�h�D�ϰ*OPd�S�R�PT*��'f�@-M�Q�-E�0˯2Q+���E�3`�d��LLy���,����`��z��KJ���"�t��_�h	�c��S��R, 0��`8�m"fzܺRf^�oཤ㲀�z릅*��@dΑ�"ΪNK=����]��.�鸞qL�bβ���$`(iGn^�,�26P!�¢3���
*X?��N��D�ʍƣa�.�B/zU���ޠٹ�L��<�ti�H7u򠸉�Oհ{̩�RC��}G��9��lU���Ș\��������-�o��?Tm��By���H6�)L�Uuf*�YK �)br�Q{��3Rd��6-A���3�Eӆ���)��u���G�*�\p��~�xqBT�F�N��5�5A%ji�4y�v��	5%�*5mͯ�պ�ce�,�=4��W6Q�眷
��Z�UwZ�)D��C��M����l�U�+F��a��P���e�T�K+K�T���Ъ*]:��u���v�?�	��l���6���*��-��������`#��):kө��#��#�f�Mz�����R�J-��V{:ϥ�9��E�<��t
�c,t�0	J��:�ڳ�U��66Q��8I�B"͞j�o�>,�ٽ�Q��i�&�f��̆�^�L�NXj�k_�hg�Nk[m7߼�=�ӱ�^��ƝȹA��L�N�&`��n�	I;���-zȄq�T�4�'��O��f����VS;�M��}&�����'��+Z�[�����P���}�(y�7l)m�qk|��L����PW�N�H����Pҿ�W���Л�Cj75�z��Y:�]@�Ͷ�6���f����k�����Е܉�����hV��VG��v@����ۭ����� ���n	�N�z�ٜء�l��e�%���üD��C޴AN���z�e�L�sT|���K����k�3u��H��3/��]ћtO9;#����ጛ��-9ս&�������[mr�7�8;g��VS��L���S[�����L��eO�=��p��Wg�U��_[e��tvb�p����W�:��O�Q���3®��}*�q�;��Ǡ�8�"�#�{��)��C�8�ޑϠ!�\3L�:����:���xlTЉ�EE�K���l(��EҴ��ͣ�O4��%��\��8�m	���N��G�猧i�N�L�%�0���q�@�(�Ux��zL���s��U1�X�B��5�	�y�;�?z��wuЧ�q��2�;!u�,�:xpX}	�v��.𺏺���ݰ;NK� ��˖�{@c�	n�������">Fw��\؅0�z!������ǻ�k`��L�SCQ�q��(�"K�����H"�Xw$o� ]޽�s *�t�pEk+����t�G)��A,RYFe�؊0Dz�**��ZH�GUQ�N���}F��"�H�-	w��c��,r�n�V�zăq��|
i�V���G�|��D�6iU�:�)�x]z��D����pg��=t��U�!8�E��,k������p�Sbh���~�f�%ùJܰFޜW�>ګ�]��{���յ�]�{<�K������^0)!��c~J4�F���4�����='�Q����H0���X�IZ�e�4:�§F��}�IU��5ŏ^pX�O�Q�gqr����j	`���n��J���oϯ�4?��A��Y��gd�L���-g�SRͺ-S�ίE�����Y�u��^�0 Ρk�0�AKU��`�L��������ty�M	�kB�C�w��8^Ϭ���@��pX}r
��Z�̑�u�p� 2���[�|i�bü^��3��Z}5	��"�e=d�=D�C7�מ��GP?�ؿ�gh췭��!,�Q�����莉�9�qu���?��h/���uV�E����Z잀Y�f	V|0	^���x�V���c�Juj�
xL�ڥ���f�p4�����.<l�oa�?�r�
�}�F��*Ji���v��֖�/��L�_Y�7��ʾj�6� ?��.��a�Y,������T1�e��[}�ء;�X�=	��q&�0�V�#u#>k�Q�HQ���=�ݧe�%==cw����\#�?t��(As���Y_Y8+�ނq�ֲc�R�֬���1�C�K��𚷒)|�Ή*"pk\M'�s<4T�k����n�����]j�D��՞��x�'�vw[�07��yM�z?��c�8 �\'���١Ga��1�78I��stÓ]Ur�ԩR5�<6��'���S�<{��
)���ا�fiJ�%IK|�v�q�=����*��#�M:�t�K��r$q"kY.�
��i7����D��fI1��Agx�ݽ��vM[]U[p<�D�e{���S6�|�3:"�j��Q�Pi��;�\��b��T������tG��4��f��QB]Hc1�G�`<����a�a�"�ç��S`��.l��^�7��ϝ>߾#�C�{m�!p����!�Ft�eAD��ܶm%���/53�UaϽ�}�OҸ�k�l����xr����t\���Ұ�G���N���j�ܜL'�_����fo�lG��Wn�k$����˭2#x����ڱ� ��koS�t���!�-�Z�EW�z�n�7�P+�Jb�˚2���Mz�v���Abέ�(���߁_5���䦚�ȕy���SWe��@K�v�r�ے6
P��MS*�;_CU�H�2��,fc��5���B�`�bZ�?�i�R5RatC�Wܺ�a���%8<J�	^n@�ڦ�,�V��e�n^=8����auy]X�'c�e�q�t{W6����55�H��r�ԍ�MZ�_W��j�D��V�X?zj7�gNH]���߶�}�V@8�3Z���2​�")�s)$*���_����{N��������p�?�E�&���Ё{pz�ߣ��5�t€v�"��w�MqK�5�‡�-
�ċ��\��{�%^\K�����lZ�+�l��G7���wkg�x���B!����C�6�w���u�NK��5�|���̽('��nT
<f��3�Am
��;��v%�`tyO)��#�t�@`Q���'�=�t�/��_��t��f��s�0��������9�y���<}\�nEh��x�t�r��[�[O����<�5!?y	��|K�e�?�,l]|��=��<��A,bݻK��ҭ��[z�t�S����փ�Dq}�	�D�h�w��VM/�KKv�A3#��#Xf`-�[��O}�V#T�\�UD���&%3y���
��w��_�Mbw�)��5�Φc�`ƛd|wx18��1��O�����2��^�މ�I�
����npu�>��XYx�W�N/������`ͱl����.�}�7�艼px�q�Q��PĎR�Q�U��q��zV�Q\�3���#�Ro�����W��3�V5whNԆwd��cZ� ��13�����)�Ug�d����&��%��P#EC�_5�Q�}:v���!�}8�[�6���Wj��\�ϊw���>�(���8�lB�2h���2ĭ%h$��������v<�6~�_ʥ3;���ZT	�n�T+�uJ*��No�üK�ռk�t�n-�#Q�e�	*n���rq�e���)�B?K2h�8�S�5
��1�����4M.�r5��Z'�]����ы	�:�)!�;��"��r�0pr�ɉ�3���-��I:%�Ÿr���3^	Orh$�[�H~����������(9������{����Կ5?l8��4����G�U����td�2�B7�+�����p��=�ǃ��R$yYe)eP����p�ƭ�6���u��ބ`�|Hɢ�]�$����c���g��IL{U=_��i�(ߺ?:����9h�4YG��Z�k��(I�+䅋�,�i�<|���y.\^A��M��P�\�.��8��a؂t��T%ݾ��m���mϖ�>��;R�,��b.�֪�}z���v����l*S����Ϸt�p0Pv�66rk��VYc�B���B2��X4ο{��
��A����#݇J��_O�h��+�N���c&�����\|�}�+
Q�:��g+L4K��١"{X�t*h��ŏ�&���*=*^��^�b=bl�n�`��ثKQ����&~��?�
O��t�Q�	R�>^�D^<��i��O�	.�,��
��awD؝�/~�ϝH�HGu�H4NJ?`3�~�>�Y�[�+c3H7Q�-�6����̡/�\<�7���<���sb+�%ԅ����L����%-ǟ���/=D�C�E�������'7ø����d�;�"uV��+�j�Nȉ�	��F��WwӶG`��)`�M���K�g�_�T���s`����N	�`�[��g�
��헱y؟��
�����Y�d5�����ߏ�{V�A���t@�Vn8.�i�fX^��^�зCxz$����sB��]n�]���
>�A5ߺ�)�H�,.��ok�<�N��蚕�~��"�oI'���L�Տ�����>�r�r~���h�__��H�<媨��UY�J}꒏b�Y��>��U?���c�������+�2I�it	_�=gž�#a�GCl�J���(��XLЃ��o����㟇D�Qj���.�++�?=��P:�y�#��澺��1�z�"��Ȍ�4K;7Wz|�=l�,����m���m�F�y�ҿ��en�}x�v�#R��fE#{0��ѽ��ğΉ���������x�U��]�4Id�/;�E/_�I�����'��E��f���e`�8��H������F�9+ݤ��N�̹��1��`xn���@�ڽ��R����]�Y�_���%����6�
NP�;n,�o"�e�@]�]�/��$:4xK������cϽ<ͣ���@>��ISw��J�Ϗ����؀�|�qD�4s���L�!���Q�K�n�-��1�_yr8��V�w8�ǖ�,�sjAӍ�XMCsA�:Ϧ~���fRU�f��!sm"ݓ�y�!�z\u|?-|p���)Yj�Z���k��T�K��[uX0�hs#;.�Wg��{��U���>pʙ�w]��wg�ph%����ycS��uW�Ms�Z�h+�`����@���w�m�1o�Z����=���S;��=��<1��K���5�_ �$��4�H�~��ᭆ���<Pw�z�kƩ�h�PKE��T�%W;U&pip/_vendor/pygments/formatters/img.py�<ks�F��+��r�thD��R{��Uɶ�hג|��lJVQCbH",��[����{�$�8W��t�E=�==���|��b%Ҫ�Y��U%�2�Wz�/�����F�����,����B	q2��M/��	{���GG�?q���nX���U��F����x��Շ�P�I�HKq�^^���ߝ�:��>#ʑ�x���!�� ^�YQ�����Myp0/���<�|i�aw�L��imTWq����L�,�dy5��8���$.��G�ޛ-3��5���4/��(��'�\ެ�q�f��:I6U�9!���w���_�����k��M�Vr��d�?���4l�n�Z�Ǚ�+E�(�����'�8h�+��u�bы�[c��K3�a���6.���Lx�L&p}�9��
F,xϻ7��/�7
z�/Wy���\�2[	V�i�NY!x��L|�/�`i��dqEp�X�E�|.
P���_ޝ]�� r��Շ��w�	Q�
��ي���e�=��K�!�GbQ'�&p!��^w������๚&��j���K1�/�޽V`�2K"�A$�1]7��8e%OXۜ�IE���"Q�ha�X���ޜ���f����fryzq6�<�+ x-~�?�욧%���,�|~�������/��uq�
�.D����Y��|Or�U�Zi�*
�.�k�y)Rp5��0���J�i�a5��ҬbF�ɓ(�hE��MV���t5��^pc�``����%��H��\��y,�6������7K�ˁ�K$'�c��k2bSX��,C������	����L�H�#�1I�J��e�w1>�nؘ…$l�{@p���]�����}�βe�Lٸ�9�O�'�BW�/�rW�A�X\*p\)ß��;��t�Lf`�@�3��"��`ċߋG��~W|��X�߁0�~�8h4�ܛʜ�p��I�+�M",)a��M��g�H��|�#&8�ç�	�?-�S6�Q���lj�lۧ�"HJ�6��g��W1FelD)�G#���l���xs�$򥧅��$8fG���8h	gX�I\�=~Г�}�rLw��>�uo��e�<^�5/R����&��UqZ��C\)`��G'2�"�����¡~jR*p�/#9� ͱ
Uƚ
��#�魎�w.e5
��~U-/���C8T @��L��TM�V�WU�\ר�2�B����Xq��R��27��T�4�À=�e� ���ɰP��b�T1r򅖊�����{w]!~�RԽ:�}�Z�&��-��]8�tOq(�
�I��f�V9Z���P?�}jn�q.7Nװ��s�ʴ5Xx��7,�ߨƷ$�Z���0�u�D��y�$����4���A�`B���?\]�b�x'ӽoq��o���|����^S��~�1%�:�0jth>)"��j0��i���3=CX�aWI8y�q����5H�"IAU�q~U5�zI4�/t��5��oWܞ���h�v��N9ɲ�:�����b[@^
k9Jp�{�qM+�*�<~�
�*�xt���BK��y8g;��O�v"xZ������o�j���/�'��b2����E���'�8{�M�x���D����u�d:y�w��r���bOK6xZ�
anྋ��?m��@Z�ak��u�Z}�e��ޣ���nfn�@/�9�e����`��ه+��l^�nD|��gEV��ǟ�4��%�����.�l�'Q�q�~������o������;�{�p~y����3(��aw���EBe���*��jԲ�+؄�El���Q���L,�E6� �dbDG�~�ڡ^����o��t�~��ug���	���Yo�:w1�G�<��!d«o�t�}��v�X�W����𷛶�)O�K��*�J����ڮЕ������9[,E1<���l)f&�$&�w()\/y�'�I={h����Mɔ h�u��XW5ǓrL�m��S���G
�� *�������Ӗ$�àD�Ec����af�(���]�K/+bW�P�n�`��Ԅ�0�!���-�%�PE8[e��5?x��L�/��@vnK^��csW�t��j������I^�{hg�0�����z-��LqD�Uه��p_N���6�n�1����u��[
�2��-"�򅠊%Yy�d�lo$v��"P5I�+�8l��E�g��@+R��hw�?���_��kx{ྤ=d;�~����[��oM�����l��[��	Y/����vf��
�����UvP��\����2BH�B��e�Á6N�a�>�<�G�O�Qx|$��FQ�.�'`~���j�����D6�	��z"�S����	̦�l�ƨM�
��G�b��w�ԑ8in��C�!�j��~��go�//�;�o�ߨb�=&9�Vo@*` ��g(�8~����@��x�-eQ���
s�%O'�"b�$�
Y�� �/5Μ�E���T�e�2�–����x���q
��0��Gj
��fV.��7�VY��m�=3�}<��ه��?�C�`ӽ>�H>B��a�tNC>~|�Ə���qy�G�Z\�,��#G���9:�Yu���3��,L%]D��0�%`F!�^�G����j
K��y)pQ�*�����uzB��oU�J�5�thL���N�"�g0���<�cދW�.Z�#e��V����J64s��t����â�4e�%�md��O�_��w�����'C={�S^@k�	J�*<��Q��"Px��ѡ��y�[�Մ��P�<��?����O��bzR���E�
l)�����5��i���y�c�+s�
��M�>�"�v5��;T�Oۓ����J�C�WeE� �$5�����ă��qp���d[�2��eV�oQY�0o�j�(�˭�������e2��~��5m6$���j�=�R��W�CwS���X�Ն�6��ں�)�'CģCV����$��C�'`�Ib9��}��Bf4�;,A�y�,O�(ǫE@7@�y)O#�&��]��?y�PY(v��3��Y(��#l��S	���u�.M�,
I����g�T�׳�ҡ�$7�fXA���c���(0��wS�G�N��J���dAO:L��Zd���?��1�y�+�ƨ[�_A�M�\��I�F�$$��%�4�PaxԄ'��<	Q<��5y���in�Ml�f��\�Ҁ(L��|>�ly�n�(m��B��li��Q�.�?B�i��ܒN�_sA1Հ����TE4}�1��D<��Ƿ��q��+z�f	 ���Qk��y��0����N~�ѕlZ�2)42�]���h�l������/�=��u�t�&C�ƞ�;;/�)��sZ�?�)2��S��2��J��m�AYX�Ļ��m����]�.���;��_�4�ʲ��O]m2�
��<촛�}ߏ�웇�������L[6����l�  ����`�'2�t��pd��Cl,t�	�F�5{�g}��)T��<�m�'��8;r��S`�ÚB}��5B�(c�OCa��Jfvì�h�r��R�9f�f����"�
�(�h�:�;T��St+G0y�D{�s��:
\ʸ��|OI�d�([�4��R%j��viS���7���D`F&"�� ����ZMs����m�J�'
u|�1��d�!�h>�����M[��ʂ��(�=�q��R���Ԛ�St�pz���v�cb�D�i���_`S���1��F��LI���;2jVM2��R
��}�%��4U��d���}�dK���;�#��ؔg%�����������jqNE( ��}ϵnk<kP쒉��cZ��&�,���%�Q[)6šGa�kw&�E���/�{���w9��osOB�Oq��>�)����:�ja� R��C�o�MOo��[�x�B��lm	�f�ё��u#5<�Ia��bA�Or�L���RѬ�%c�n��5�iDS�я[�QΪ�~�xd1�hw�:�̰)�	�-�|U�~��jiV�{�m_�.wZ�9��!xgI~��(�n@�f,�5���.{꘦X�H��K��pI -����9��{�5�˱��F-�9�@��ݔ��/��V[��_�ůu��:Ixk*�ث<�]잻��=h�49��b�92�N�j\󤳈$@�|�YC~�4��Ƶ{IK�(�լ��YS���~��'��'�n@A�(O�{������u��Aɴ�se3cJ����l�U�뙋�(c�5Eײ��L�u��e��Epr�qj�zz�	r,�������2��@�-��vO������8����y�5���+��E��sU���i��y�¦��YM��TE��
M������Ta�2|Y_,�۝v.p���=��C)ұ���^�s��z�+ᬷ>�-�Od1Xi�	����r�Q����ӒZ�U�_�,ԋ�S������>��t�eO��ミ�����S��.�݂���n'���z�7����Z��Du��%i`���~C(?.{3�0{��~��,�
�^�-��—�y=R(��H�j^D#��+�ƣH~*�Q�	�!i#As'��%8�gz��Xg8cv������h��{����˞�q�M}ohr;O|CU�q��d�_���2O2�
}Y,~R|�޷#���
�R���;�xoD�I6�U;�Sna��\E�x�#���t�i��JG���դ�9,F?�Y������@!�7�Z{��n�
��>?�s�����}�ž{ϓfB��1���F�g��IV��?�[�n��VI��+(b�E��KѹE4	ak�K�;��{;�?�G�du���[c����0;���|@2ᓰ�X0�o�=(��-��S�3=H�����V��?�X�%�x2�1�.�� ���<�Lv��l����T4ήUu�R}�D�$�ڶ����v����9��җ�6�0k7�	>�}x��-|؊�-��[�o��uT��6�'�]I�X�������[�i�z��9��-�ttT;ir����?�l��ձ����.�ٲu<��m�K<���ب��<���8]rk[�s�L�o�jfjt��R�����o8���y�al��������!��k�MC�z��>�ӮUoɻΙ�!m���X���'F}��@9�Q�i&����~}�,��M��s�����R�|�H���l�u-lR�L�"ʎg@J���􋭆�ljN�Ի�����}�<�=�Gx��8<2���Io��Dt�n�Û�ּ�I_�!Ԓ�ߞ�����5��8�Mݩ�!Bl!
62���2����.Elb�Hob�M�G���U����PKE��T䜳�)�&pip/_vendor/pygments/formatters/irc.py�Xmo�F��_1`P��Vr�7".�8�5�6	j���Ԋ\ID�%owGw���7������8���g��:�#�O�Y���*]4rʹ�R��,�ٿ���E���׿�C���4+�v#��Jgp������ǧ��S�o@�8�s�As�N@q������SW�g���=�����7���֒kV�*=
Л��l��Vm��ld��T붑zk�= �|���onY&�y�.��)�K-+�L��Lཱ�M��s|z�r�4���U��	M�U��jY��1��U��_r����7-�(�Y]�9��u��
o��Q���z�rpt���M�����(���%�L~ sV|Xʦ%�5��oƼ��'�'�>Q&�sƉ���Ùǽ�lc��ȼF���c�l��!���l��B�
[���%wG��ca�*$�!�7 ���WD��V_���f=���.}�U����3��N�jĠn)9~-���/[Q���|�0���G��)�87�	ك�G��T�vk�C={ɋƄ���%a3g����d��5�!y�498F.5Bi6��5N�y����sŖ~	F~��Z�3h܊Q��u�����WhF�.�Β77�0�5׼�|#�19��g�tX��a����w/
���	CO;ܗ�|���u���V�@��>d��~����1�Z���O��T�y�n��-��0��5/����tx���b����L�੣���G�O�:
��X������]��f�2
�_�E�*_� �{�}�~�dꞈ�It�Ӊ/�<�c`��;�x�l�Pm����5���<N|�������.��B\\>�83��j.�A�`j��\wRfCce��V���a��*a/��4�gB���i�2�N�!�	=G��?�ߩ�1�bm���x�o���m��ڐ�m�N�#�E�˺"��"�hķ����1yK�M�\\$/^��G������%�a�6�b9TJѢs[镗��(H �����$�N�,���bq(O��ZF�ν6�n�����@����r�`���?��'x~���I����������{��/~�r��[���]h]�QR�oWv�]�R>�eS�M�s,y�3Xs�jp7l���ol��^��� �
��R/)�F�h����t�0�q�t]�
3G^�<�/gC/9�Y`FA0�J�GZU��-��d���
º��WQ���b]��'2v�LXT��k�5�9��Y���`Y�-)�Y�#;��e��/caA�Z<���4��ݾ!�t��0��x��Q�Fϕ�H�6EozM�{^Q�S`�+0,��#r�je-��2b�J�W�Eō�d��*��Sz#�&����n�!v�����
��<�D��<R�^$p|�؂���s���N�m��AjÏ��/M��F���00�~��Cΐ��&qR�ٙ#��{IC��m�=p{�)�1ؗg�v5��R�+őQ��Վ��=F���ĝ���a-PV�H��8�É�M��(x/��<�%.��F���h�l�!�hJ�zh�-���d��6gdy�t40�`�ԃ�}�5�����Ҍ��aJq\(��\	�l��S��k՞������f��_���ari,�����-�R�H��38j�ӖI\h���Ts�/��nt�_{Mv����c���
���f�� L����m_����pn�aa���FG`cN�/e��w���#�c��2��~�!��v[�a�F�ySgl�M½=}P�H��m�d��h�w����.�OtŁ��G6��8�PKE��TT�CH�K(pip/_vendor/pygments/formatters/latex.py�<ks�F��+�$kIZ0N�mv}��e��TR�]���V �`=�����y`Z�.S�I���gࣣ��O�����:+�AY�B�IP����3���4h�)����A>�+�Ue^���9����77匽�_����O��g�)[=��/�V�`�1�9{�?����—h�8��3���r���?�x�8�xĉ�G �`]d[g,��YQ��������@�⎧QV�m%h #���?���Ǣl�Eg�8[f�<հ���c��~����˟�|�8\�q�a7�\��,Ydy�ѯ8-��`0X,�$Y,�9�~B����0�5�"r�����l�
�(/�:~�H�/�"e8�/x�!
��dž󇳳��gs�h�ĝ�7�ʼ��7��<"�b8?_��~�Nl
~b����������z��0������|6��y>�7�>1�y�l�8J�
���<>�hxdd��ٔ�j����.�.`>�_\~�ۗO�.?Bp)���`ea��)L!v'#�M_�b?�W��Axl�N���0K��ytu2�i�E���z�������d��U��b�D��p�e�W|�;���b4~	<�q�P{Ԉ`�՚������B'���4@p��i��r!؊'�=��ǃcv	O���8���}Ԛ��F����%�ě�G,Ъee�x�0�1��9�]m�8%\aU�##y}t��e+��<�X���@/@,Y,Y��7�]0��0�EUp�X�׼�
xʛ@��M����'w�Z){\�|���m+�"�o9���O���71�J�Ԥ�s"��ₑ�p �IU|+� }��`�1�I�hP�<�� #LŇ	D	X��Z�L�����IlΥ��d�4*�Rd�J�R[��=�ǓfP\0��?����w�΂-�q�3`B���w�ݧ�����R��7픂�e)X�Br�x�(A
���&�P�g��>0��3�v��t��,d9Zm�s�� �bz3�)1�����w�"��<I�&Ɇ%,	�	��[
�}P���|r'q����3�i,G~o0�=����B3[ט�T
�r�8S�x�t���؋ĵX�E�+/�'9F�;����@ll�P��;�����[0S�I�& ����(��X*��j�1^�>�UA�K���Q�}�9F�"�,Q	C군�)ʤ�q!V�rb^l�}E��}�H�KF
Ŗ��G:�
,�z>���#�$�eA�X����ؐ�q!�%���[�x$Lw6ZU%�e�<1��G�'O*2�C~4� +8���S�Yc��xzYJ�4v��ra�
i��(�����С�C#PW�� ��V5*K���pMJ߾�5����(#��`�626�l3�B/��D�1�C�L�pN,(�"(�J�J6t&Q�l�U)��V���o޼Q�?�Xg'l7��
��<���1��mp��������	�c!}q7��$.��O�f?]��ӓJ_�*�(�~�U���4��`���nJ���O0���[ �xr������n��q��5G����d?���AG6��:v�G�cD���j��D�Y�j�����4�'�ӝc��hR�Ӛ���t�7)���j|X��Û�X��!,e����L
�܁�������G
���jF
|�l�w�5p�@��NN�(��wJ5�A�W=0l�2G���j�7H�O(���}\�@jU$1l*k����ۆzV�+�I��]�r�0�Y3�؁(1�Z��W�FX��9o�9|�P�h�W�8ԥ	��)="��?ao�M[b��#��X�%
W�&��T>33hD��eRh�Ƴ͡�?Ptfn�ed���ʑ����!B8�x�P��D;�\��l�7�%�%�OKB#J E��Z�:q���8/��$Y��3e���#����r���X�m����z:ɏ�LR�}&��9�͘l'U��Lc�_�]}V�����|]����v�C����4]�w�,ۏ��~�
��x��
(��kLX��J�_��B���R+�(Gj�#Ab����1��*r]�AR1�F�%��\��*XA"&Z#:�ݖ�(`d�T��K\?>X�.���E�
�H�$R��8uA�V�<��ä�r�PY���5
]l�����h���<-`K�ϗjQ�'�K�,��e�@ɠ+��\���C�_��E�:�v�M"�1�\O�.�ɴ���<�VΪ�k��5�m�&-��EŗK��bi��d
��f����B䲮#��Dk8�˦Z���,j��(v
����f���.%䒌QKpi�u�O{ڻ�U�4r=����z6����մ8&������ʙv�ӏ�����j?5��J]�R^v6�{Hnj�8�S�tZ��d�N�T5�/�P�V�Q(nM���t��:�=-�vk="Pc<�d�KUR��J��E�	���%�\��	�UA�јe�|����M8p�^e@���L^A�!p.K��
����UHK��ule6�zq!n��\�Ƙ�7l��v,�⑥�C��fP�p��0m�Vk��#��ޏ�6�`G6��,}�����S����L��et�u�a�6��E�R���W��2J#�^�>�b��B�`қ$�zI�oʶ؉��D�9(k����J?��;�
g��;F!5H7j|rfo�(L��^�&d���{xd@�q�8�r	K_h'��;���h�v���
>�A5��0T7Q��PQ2*)�Aj�9eg4n��nN����$�
2\�i�!|��$ž�}���7mF�3�"�l(�ш�
�I�$���w�5�b���ZR�&�ͤ� v��Z�I��KӸ�M��AHN
v������׵��
$Y��V��J�o���5���"ل���=� r&k;`m�0n趽��1~o�����?�zNﰆ��Z�d��=fŋ8��!
��|�;�� y��R��;�H���D�~pIJN���P�]N<B��P#t5ӟ"0��Lוd]Y\I`�
���Sj�K�*k(=e�
'����@z��L���9{�Rm
V�b2f�w��,�2qz��H���8�Ik��3WT��s�N�
P�84@�sm¨�Y5��[+�J��m,80M�=hx�$,<�Bbm�M
XC]JH3<	��V��ճz���4�p�
��V���Ú��Fp���sz�ؑ�)�=�PhLq}�B1f��l�v��}�puvݞ,o'u͞Գ�{�A�!��M��2��D��QJ��t�
+����
��bڣeE�r�j��g5U�����X��%�4�s�m4E0��Ͱ�o5�QlV�I���F�&�#��}��AzC�Y����'�t��F�P�U��;�O�a��i��M���?��>t������ä��k�mW����
k9���)ʌ{:����Q��n�:3�m*5ny��\
WY
��\*�S<k��/�
W�dq	�[�Ttx&���]�9,�Чb�3��i���=�ZI\l{��"�3��>�m�4��!��r��aЕ�1� F��w�;��1�9���tH��}.WD�鬭����O�����U� x���2�}E��*��AF��5q�k��*I�5qG
y�@c�`�hBm���a�V��yf<������rںy�^�lEl�0.u���e�V�;��/���x�.�]�C]Q8��p�pM�+|xm�ջ_�'-3�؜C�P���{���.�Z�o��xr�m�Kt���V�V�m�V'6x	E���:�;�S��ԟ�G"�����U��=K�:����ٗ?�n��p�̭5�b��Ǜ&i�n��n��5�n��F�p�{-2���m��f@[�Ë�>C� ^,��*/P'���UJ�y�|@�^�8���X�Y����>��֓�2Q�V�Nˡ6zg��(^�a�պf��-Qbv(�93�Q}�}4v0cwɪ
g]�}^�������('3=e�����VL��vL�R�c��j�r^�,k�7x�T��y`�+�3�#.�GMb	~�/�Q06Ĉ��$*��cQ���R	���0�̮��l*�\��Y ������?9��>C{��\]{鱴U�~�A�Z��O^�w����6'�znU�&QA㿗�m󩅱LО���#F�M��}u_���v��o��g��%�}��n_�(Wg��u�4S���M<*t	h<�fS˄��e������YA̹�!>��
:�J��YT�#�x�-�V��Ɖ
�
�t�𦠼�X����Vf�ֺ�N	#�fR��X�}.��$9 �M}��>���w���Ji�ȓ������8]�s�A�w�H9�����(v�?�8�/�p�|��^/
#�E꠹@r���0�ᘉ���{,����^b��N@w�a�*b��N	�ȴ��hM��`��� j^n�HZ�ô�#5s�; [�RZ�n�<�m�I������å��i��pУ6rK�
IOW[�Ǟ��t�])?~�sʝO�"��k�*��n�����:T�wg�_��ǢȊ��Dw^Ty���X����Z�eK�Tő����rh�7
�#�͓f��<�9C0]��+O�f�&=�/v����y��|~"t��HWa�a�pu詍��o���y�(T��H��r1��_(h�_g9㦕�%�~�̴��o���kw�8��>g��z�
�Dȗ��E�{^��@��#�k�i.^c�K�۵2E�v:�)�u�5)���o����=Chf|����b8���]��U�y)��x��4�2�h���`��|��g���]�マ�������C��y���(~���~��D��G�,�`�^%џ*�="�5(_;/�[�����މ{��J%PTT�F��G��m�u*:,�� L߇(�
$}����
,�1E/�V��ԹJ��k�3����@궠EP�E_8y�$�B$^@�aEw����,6xQY]�Por��H�:r5+6��˷�;]���h<��M7:|�S��%�7���;=51Bl@<y߾�߱i�54�'m�l���|�r�Y&�݀	(��_f�����*�R�.�麁~�.�:N#�Q|��qs'Z�Qʠ#w�������r���Nߦ�+z�3	ȟ>�o0�m��L�%٪�7^#7����7�2���B�v�3M�
���/t~G���!Ԑ6�_Z�F�=Y�a[gT#�Ƶ�c�Eғ1��5�
<a�wPޔ��Ρ�1�x�)����WZ�f��xŚ}�g��1@�w9P����j"�=�uh�8!ޯ��"]�$��F+g�luِ)��E}�?��vk\��n�XN�6�z�1O C�W#z��*0�ǞZ�҂��n�Fw��W��`�Y/
�a��]ooGKOn[�[!x�
��mP����}��>��eK�HoԌ6j�7�(=DZ0�sb���&�������6<�
En��S��R}�*���Jq��忊�Q!Α���},�cW@�]C���~__	��z7�֊چ �Nϩ�tt������V��1,ey�+�@��S3���HBp
�j\#�>��(P��}i�'2q�E��PKE��T�ȣ�k�(pip/_vendor/pygments/formatters/other.py�Wmo�6��_�y$����ð̀4s�`E2$��	lZ�ln2)�t]��~��H�͒ݥ��Ɩɻ��~��p8 ���	��L�55�)K�b��s���;$$5��n�="�t;�3Q-Ŏq��b��re��|%�gg߽>?;?'�h��F�#�#��M���L�&4��?��7W�ۇ	
ERf(�u<���L�5)x�>1�JwU'|]HeH%����yI�df��$3��9�d�%����D
-sV�'2��?��`6�y>���1h<��cr\�2m�Y��4��j�vYX�Eck⡏���)6�zŰφlD��b�R��f%a��]
\,���k��*E��2�9��"���
����9�il���P�2X�Y��������q�׫�	� i�2	�=cv0~��.�p5><C��>��x��a��q'�����r�DTy��֎�Til��U �E�D�B1
�E
��j�
D�X:R�� ʹO�)x�Y�pM�sK�Vz7�|�����ѣ��c�$]�$T��_H�W|b�@�	"5ϴ1dck^�}fj>G�D�p�WV��}*��<G�sm�;���{�� Ĉ�J�ʂ	#4IX��<�k���W��� D�r�o�|�sV����9�������d_r��
�$E[�|	�6�5���2IqL79TA8N�\�̙RR�l�IG]1�i5"+(��-���t�F[׮�/1"T`��(��E>��ʣ�
KA*oT|☀Q)��`�19�߼�&;�����vHLv�ݟ�H��}#8�������Au%�͸�f6���Ի�Q�t������E`)$M�d`�s�`>�7\$���%�T6XT���a2'���*hi��f�9,n�`fuj�AmK*�|�����8H���
��"�����A�fF$�V ךͪY1-V�{�/���4��S�<��`�
9��}O�D{��YB�Sc&[�pp5/Ϻ��ҩ���ClF|	IHc�l��������8mu�a��|�_�n�d],E�f�wLdKo�5O}�8��_��g��Cr�e���}]��(�nt���^�)�-���f`V���4�L0�b�[pAՎG�
|]A��n�ԁ~a#ro �#�3/���쀭�'���ߡ���>����X�]0��vjQd�F�I.uM��^�1�ze���r�e#6��_Uk��=q1�+q���4���x������sD9<A�X�����o����	/�8�n����G�M��� �%��
��u��9<R�P���O�5�e;b�[�׌#���+]=L'ӫˇ����~��<�jf�zt��Ə�6�F�e���\'uc�%F�`�'\^O'���y��`��!�N�� �W3�'E&�[���-�s�;x_�^�B�Bqɭ�)�ȭ�������79��w��;O�ۀV%X5��M��[��o@^����}��0�B�<���rw�R�ïl�\��Ă��M]~��-6ڱ鬽(oh�D��wBI������E�	֐zD���BZ�'���m�_��Љ���Ӎ��'q�����@�v4������$}U��r�P��|\QǨ
w�K8�H���ٿPKE��Tϣ�;��.pip/_vendor/pygments/formatters/pangomarkup.py�UQO�0~ϯ8u��ԇI�Z���
ich��P�&n�p�(v`b�}g'm��m}!:�}�}w�M���r�re
��<e���Ќ��NY~[d>��'}X�"����ta���2o�l��ō�����ǯ^��C�-��p����Y�������)-a���2|������g�3ϟp˄44��`��2��莫D紫D����2� �"&e������Y��k��M�2Y6�S|{:O�d�F@�Y��!a�ai]�!>�
�d<LF�
�M��_6�<i�Fŝ�(�S	��/{��j�9�E��!R�3e$��_�a�d�&���WM�X8X}�{fZ��S8�3��`Ʊ	��'X���������:OhŒ�'���5��P,u�%M�O��p���KB 
�\�\H�@|�u	�&EB	E}��<���Yl�Tr[ަ[��u�;��.�gzx�O�r��Я��jd�t�2t#�%�0����Zj�e��;�ұ��|�S'�{�wB`�	B�"�r,8t�-]̴Lv41;!�)f;�ŕ�;�sbC�|*��;H��H��$
{\y3\cv�c�.yP;�|��Bq�SR���q��c����aV���ɶM\�.3w�.��'�zz�|���2xbYWb޲
��p�o�L�m�ަ;�UG�/���>]H�3Y+�¬�F6����A�I��*��_��1����媛]uٽ@�a�ph���5�`�п׹�j�^�6�����m5�Q��?PKE��T���g��&pip/_vendor/pygments/formatters/rtf.py�W]o�F}���p`PrB�B�ҴAt�A�m"C�Ci�dg�v���{�I����ʀE�ܹ��;:===!|��z+sk´�[a��&�6u{�����Ԟ ���2�ZXi�㧷��L�Ћ���i���9�ii6�^��Mg3Z�A҇��Rl'd������?^�^M�b�9���{����J�*��S�v��bK�*��̓B��@Im�B[z�,<r��*k���.Un�Ei�E�u�FإP���d�Y�\�}>ڴ��`3΄Az:ˣ�i<wA��u��d�/��O�V�/Uҧ�2���xT1L﨨lY!�i�e|ʩK���ɽSvCq�!c*�:T���*PM��8J�Vi��S[�a�:���*lA�Q�.L����1�^脿[�5>dRIy�S/Q$�HT��"g>��zg
��g^��:/�L<>,c>G����7��Q�Pne�����N`��\A��x#���_k��:x��
�&�����G��0�[�3"Id2��4��� I{)���q,K1/��d���D�'��V��5"'dZе1��cf��TT���z�(�ׂ(מFi��T��`&!ޢTl'��)��m	#Q�������t-rE!��sjZu��J��*�*�6*�pLU�[B`q+�_�v���g�_���FE���cgC��JK�TA�ʡ5K�,��k�ԙ��WN���Z�rR�]�x1sFjw�wN{���|E ��)@ٸW��y��E��y�wNj�h	�Pv���:?��2ޗT7��,������=;=L뛢ʒ^�W��Z���˻�@��V�Q�/�g�&�m��e�n�i:=u��t�Ռ=��jk6h3��O�2z^��B��Ҟ&&��-�9
��+QНc�!2y�v����9Wb�!�Bv�-J�����w
6¦:�D-b|��f=s����Uw،j

�`B�qc��j���j�蒶ҹ[
�,3X�T�?�Ǵ�e��V�����佗���-�q_�ܖvW� �4�Vt�c�-���G\�3WW����`#Ʃ�����G��=�t��/H�+D�P���J��o�n��jh7ι����G���f���	}Q�vl
$�E(�7�R�}2�	��~����<j� 砃fZ��nj���,��VpV��ls�fj�)���\\�J�ax}�݋��e��c����m�;n���12��q�gr�Rh<v ��#�*w��40ww8l�a��Aу=&]����I�εhx���.^,`=�0��b��48֌��	&
��	�5���BS��2�N������qF(��37�S[s#|�'��w���)c:|���[����`~�o���|ݔ[nN�tY�m��aj���Sz�ɝ_6�W��~_�4E��v��夾���ǽ���8��w{�ρ{n&�j=Xu�a�0�8u�b��Ã�?���)��her�,k-e����g�ȃ%�(9k����-L�!<��z��>*;>�\��neB��&�`��~�	K�Y∧{��
~g�DZ���0f���
�ٍ�=��
�F��Z(��f������{Ae�C��]�+տ�9�_
,-�q�X��`~6�<股C]J+�|F�h>�r3���{�J����l��,y��*x輲��?�A=���A ����J��A-��A�6+�h���RX����x�jcY5Vh���X�������̐kE�?Ҷ�I寮����n{#~`�PKE��T/�	��	�&pip/_vendor/pygments/formatters/svg.py�Y{o�F�ߟb�ABɖ)�N
D�\4��H� v���D�K�0��r��x���~3�|S�}9!H$��oޏe,�:`����@&kWk�(G=,��?�?t�KAπ�]��W&S��1�O�Y.Wz�.���d4��dtr��+ξ����z�����o��z��(�P|��]_��.�~��"�>�n)�s�D�Y���_&N�8�c��J�G����`��k|�y�è�^r=[H�d��+�fn�fl�n��e��}wpp��q�1���:�i��	y,���j��윹�mx�*ˈ3W�̗����J�9�ͧ����;�:MC`'�q�z�g���~����؟DY���gDiC��9Q.�Ai%*L��)-�B��o���E�R'Jg`���Vwk��V�������Ї��,^&n�
=p]q�f���gC�#Ʒ1OB��\�r��B���'}��.�������9�G�	�
 �C
[8�����|NX���
c�I�
1a��50eа�B�����1��kT^��2(��M#�H�4�T.*�`���^J��‹R��#�Ŝ�|�N\JA��xP:��H��r������ܟL��yk�~���@m���x�5����˼̌K)lp#<#ɨp��
t/�:[6@��',�
���ǎina8$Ç��$�co�	�ue�fF<P�?��2(��,�L�0�&�$(��)>��ډz��(�ȱ8)���yZ��<A������I�H5��7���RHH-�[MUȎ�[By������UqB����|>��Q��t���b�mR��߂�n�����_�EA�(mN��x<nh�86ȚQ@��Q�8�@Ƅ^5dB)�	�H��.b�zU��n�u�f����G�{=qz����1�4�d�������n9���*�D�H�%(N=nI�^a�o)��AΨ�F�c����?�&��ig¨J��H�!Q4!� ��1wE	q�呂@% �dDI���{4��Wʅ¸�8��z�.��wr�D���WL@g��2f�_r�_�̤��2�$�/����Q 8��.�+�f�2���V2��6��t��\�J-rI�����[���hj�V�xƝ�#�|S807�Z���+/��z-�5
Q2M<nr�Ջ��1o70�W�E��H�{��A�
8	�D�D3���hB�8d����8W��ܔ@ "�Ԡ���%E�=� �S&Y>�q�O��U�ytx�L��s3X��b\u�����À�]�1/M(�S�=�|��m�\���(I#H,%�T7�4�O�
���ޅ$�M>ZEg��X�����Ulz�F!���
f+,��F`]BR��1'���l����zP���1���Snj�^�*�p�����^N��9��FA�����8Գ�\L˹h��"��ϑ�Y�/����u~죊3@�6�:
R9�U$P��r�R�p!��(ybu;9>���$��O�
q��^P�7��B���dԴ0{�¬��@�D�p?3���숽i���fb�$��)�B�'�>~;?���f���؃���.�+�}�fR?�N$`��a��֌����zU��9�R�����ܥ��N�-�V�EC�O~���k<��A���V��#\�|�a��זI��pˡn�I��&��~�+Q��hP���-լ������*�Q���kp7�il;;-���oy�Y�
��Z+k�W`���`s�?�y�
��`�׬�5vF+���Ke�t�����N���o�D�5Hp�����7߾\1����>~�`��p��Ӌ����F;`
�W�Y�~��ZiO���f�lN�,�7_�'��x�����������5"u�#�׾��
�:�.�t�
 r4�g�,Y�F�c�-�~>�^k�
�ã_ɯo+_L�}�M3��S�a� 3�fL;�nDOz�˴J	Ęam�ze����H��˖vS6z:Ui
��~�h�=v����Ԃ�j��TgCz�����Q��A�ů~3���G�n?�
�Oa30�����exjk��6��Qc���zt6�7��z�o�w_�	�i2��BRb��m��Z6�L��
z�|��BH�۠�y-���h>m�W�g��ݶ�
��S ѿ߂D_���W�R�̤{K��c�$Ur�8
aY�t9Rҍ
9`s�=���G��tR�Ö�y�M�.��'}G˺Êm	�?��.y;R�S�P�O�#~��&��y�(��0r�����M�z��-���X�?���G7���G�I��NWym�r��e��1�۫eSr��m���2���V"�7��Wf��[͈��K[���u��fE/h�Ϡ�;��7C
.�x���"�[ۓ�L컶G
�bGS�6�&vKk�BF��#Bĭb����D	5\��'q��e�k@�`V���N�E���PKE��T��f�KB+pip/_vendor/pygments/formatters/terminal.py�W[o�6~���\�3MH�a���M��[�@����Lj$W�߾Ëd�v�T�E���o��#�O�.��J�\S�A�����%���3�o;$A����d��\�̮������ᦅ�[ɖ+=%��Orvz��/g�gg$o�^��5D�t�  ���~���M�
�
��������fve�)ASV��1Z<��bMjV��#�R�t�~�ֵ�zk���;��n�,rCא�IkC�����/r%��	�j��i�9��m
�js�;p��H��0M��ӠjZ�
����S�rŜ!G0�fUX�Ί�@f�֣�(�hUe9'_��e��)^L�Zg�nk��B�njTDܓBT�GZ5�Ʉ�����$%��AN���
/10�O�o.�g���1�(��"�)<q%�{M�M[wMꥤ�ED�M��B�c>�M��I?J��(�R��o��8{�a>5v$��!�E�������.���[yq��KԚvH��N=Ԥm��a�f�$Z�ۆ�	�K\J����'Xe�m�+�mee�eE�
��Y�ف�A���V@��񹖽�BX�v�0+\�lƄ���d4������K�ps00	�X�>�����V�FÏ�3��0�0�v�a:�&6��8j��Ħv�@��v1��z��]�^��r*���A�t�k�c�D<���в3/�NN�&c�v�gM��H��ȁ��Am�a?b[�u��$ّ��ē^����z���=C���SZd������
�c�?�n�`ػ!Џ���0n�|�ď����P	�6��$(�æb�pSw<���`���r������P����f�)�V��p��ɂ�A��&�G��j�ʰU5W�P!#5b�2エ��3�XV�\�X��~sk�
�Q�ƃ���r1�3�;�X��/�᫙�歄ǷQ�3��*R���hm*L����+��AQ�
ְU႔�n*[��um:��e��c�ʗ_nZ8j�3[,n�;T���F�݀!�.�~&�\���ư��+��nۋ�uL�e���A׼��r*aCf��]v���߄"{J+F�mv�>8{|6�d��Y�?Hw�,DH�1�t��
������'���E�������Cꢂ���\�Q�|%=���%��6���p'r~���X�^h���T�~B�&&&�wv�!;����1����qA�>#�t�k�{�%Y�v�Ib8]�n$|�48�F��u�}E>'��/�6�l��K���W`c���O���t�GƓf!)&�V6L:+LE
�؏Æe;�i�xu�4��kA��e�k�o `fkktC�W�8l͕�x�p8��q���B֍�$�m0�Gs��'Lc��-�Ww���f��}M��G?F���\�5�f��BO�Y��;�o�t:�@n�Z�`�z@�C�|�9�/A���&n�`DQB��Fo�44�%� O�yl{�7�&�g��:ݷ�3:�5o����eh9������<6�}2�kO��%���gX2ۛol1���J�2ul�e2����#���됲�
��2k��;�h���X��ߞ}��~����N{��Ǔ�PKE��T$/7���-.pip/_vendor/pygments/formatters/terminal256.py�Z{s۸�_��'%eK�ïDw�L�K�L�I'v3�G��x�H	9v;�g����d�י�.��`�
��0x6�5�Dj/�d���Ԇ�u9��h�����;��@־�𦅱x+6[��b�^}�z�R��GOm)���_�E����Ob�ً�;�(�#��9���g�$^�{/�Ew$E�qȬ���`�H�������0�O�#�A�yl'����$�}`���҉��]��ʮ�S[6R=/�<$�r%&�~e���?��(R�8���8x�Y������>~����0�x��	{}�������ޒg}.� ��������	|�>��`���ٰT<��L���`�<	���@8�a��	�0J�[�	�@��4^s!�>fa�X�0��̔R.2�fW��*b1���T�
�㋍�u�1���(Y8n�e�9��H!Μ��dEhP1#�(�3��n��*�o��6�]�������A>_8�P�4KIܗU x?��nBzE����!��Ě�\acQ3�8�'��r58��̽5��Ԁ��JB�q��6$e�&�س;�qb�',֛8yf�`s�b�X�؇����)bp^ ��tf3'g3v���u�^d6�=��_'[����N�����l��Z&4 :l6�@�fV��E�-����f/���0��,
u�JO�ՕB�AY�b	V/��F�j#��f�*wd��7{/�H�_�t��q�ΰ�``�`!��j3>	�R��ȝ�?�/q���emt��F���7Ka�GK�_�@20�7E[��`�t`�QE���!e*|`� �n�X�o �e"��3��M�4�?Gk����j�0�jD�ߋ��D>�\|n�����T�@�t<9���8$U��Z��2�_�,6N��y`���O�n��v��`w?�xr��hH����(H*+�DѰ�^;i���5�vY^�"c82�L�d��y�)��N����~Īf����t������M�T�o�1�t�
�j��ۘ�;��ԕ�UenU�۪�=�	O����l٠�
�ص���O�q鄉^��t�^��%��7�V��<f(�"ۡv���� �b���-U����2G!dH���A6c?c
�smRfż���`��$!
�"���ReH���Yba�վF=qr���$�b�����-OuiI5�#kxL+P�k1�ֹ���U��KM�p�+͈��������H~��}A�����@����A�
&zrfY��R�k��U��m��`#�d†��j���E�c{���TmS�]t@Z(��� rBy�������=l���yS��!���t@�ڐ��ˊ�l�D6I�b2ڴ�+L�5p�a2�0ȚC��>�b1
i9k�ʹ��yĶ���_vR�a(���@��E1Lƅ���2��$\�����d��eJ�z��
�����!��m�T}y�:~����y!�D6�t�V��,� $[��='B,��WU��#��t���R�._��sS�����9fv���+�KPc�8��;y��@�]��I�4�f8��0�deF�8� �Ҫ$�k�V7�Q�)�t8)���,� �R˗��_rCY@���=�
Lʥ�1��a�w����L��Ҟ&�Xzf �[A�?�U��MRvWV�U5oF1�����P ��!���1f@
��{���3s�A�ʍf���2��a�,K�K�p��A�����%���r쇉��A3� G幆��%�*�aHj���T͐1W���4,�M}����@�4���鄍Θ���lY1et�`
���?���^��_�=A�旜�'�,s?y��KΓ'���%��ǩ9���d�����{q�/�GJ�{q.�x�|�85�ʄ��H2UX�ˢS���B�t�_���>%��يu�D*�5c=�����̶���	�{g��^̶.���p�,g`��L;%�/��ӡw�\i�Y�Tp�%vk<:��x��\��
�`��Ϻ�9;+�c,�(��2aP�hw^�c�s��o����]���L�(�C�:�Q��Ǖ�ށ]/���v�Aw=��w�s�q�/��\���b�Cc6>=?��8�6�f]fDT���`AO���]~�:fȊ��Iu�ܦjC�7�r*`)����+���e�=�D�Nq��q��d����$.��]�l`e�����~����z
��O�J&�bi���?j)c�v[^f�.O�=:(�|9ww!Pq�����f���ga����c�=9��O��)Qܠ���h���~|!������Kb=J�`Ѫ�9�#�`Ű�M�8i4��V{./Q&��]�%G��h�@�H��U�`e���5�T)%�*��'��YQ�B/�K\T�l�n%� ��Ye贓GN�:�P��̨̛�n�*�o��
S�&�z��)�&��3��r����D���]~���q���zŀl�������±R&5i��n�|�r�
˵K΀_Ml
�Nq��Y��Ig)	��n��h�d���K[��$\�2��[��z�����E�(Z��X����ğ0�T�J\π��f~�L<[1�^In�*y��̑'��6�x�mj5�Og�*�m��p��T�PXwRk٭e���C��1WZ��b��E�!����,�������[>�02�G����o}/
�m�#��b�������ڱ��4(oU�kTϔ�����u">�&��
0%�džq�e7�M8��G
S]?x�^�����j0�Hj8B'6[�d��\m�;r������r�F����W
nP<���Ź@L�%�y`V���b����S�医�3���DaC��#���ϴ�qnn��>�g�!��ݾ���(��L��B�92�r�V���VD-��7_���o��~=5�G��{
lk����~E0:[��/�z��ѣ�
�_é,BނSk������*
Ĉy�����i-M�ɱ�	K}=f�q��<J��J|(Q�c��'�PKE��T����,'pip/_vendor/pygments/lexers/__init__.py�Z{��6�ߟ��^`9u��-zW���i��&HR�!�e�+�:�ڍ��}���C"e{w��p=�d� �Ù�<�����_�[o)�*��[*�y���72_���L��Y!��d덞�����������9Y���~���vJ��ɯo~|��uj�Ԭ�\����w���>��3R	IJ�sVÚ'���m!5��_���z�����\�Q%Ŗ�6���n�+��-ٷ
k���R�t �4��M��O}����^��e�V��f��	k������pZ�j���[H4u�f��/3�(sz:>�լ��ֹR���hy9%�*���G��/~~��
��wF�;����x����4�F�]���`��t�~4ʲ������ ��j����S<U9�7f�U�q\���K�q-r?��)��sR3������{�{�~^LA�G�DS��g�QI+�U<3��*�8�������|Eu+9��P@�4�Wm�Ԍ�y!�-�$q$�[��-�'�&YeH.4��:���K���ǒ���6@>q��j�sU�&��IGLZ��Ԍ�Yv�{yh�`�R���%�55�������n�������D���tb�g���b;�B�S����c����n��U�Q,sS7��hQ+X	��H~��eb���N
j$��`mW��Ȗ�!&�ќ�\��"�mj�	8ߒ�2���k~KY;�QS�e[�]�d�D(�+.nbg�SE:N��!	�,�m�'S�����88�kc���:J8t�2%�*�)`U�zGV-�5��(3�\��J��)�i��m[SM��<����1Z�f���l�M���)��ΐbOռK�����
�mt2w*z�d�zq�6����|���0nͿB��
�8�@�
M9B�A���-'^7A�G�EFUǰ#��UE����΍E}�7D���0|to�s�T�l�g�ъ[C��oҸ��M8�z[*��$3r�f��svE�r/P.��/MJvdÂ�9�<�q��#���6��˒��9O� D,pr��8gH�\8vQ�fy -.�䁣1�ph�dٵ�Z�P�Lp��+�cЇσF�?��#Hn?���*��e����C�h�Y��������_!3*��W��q��
Ԥ���C>?����Gs��r~�UZlM�rr�Q�jD��,̡���*H
6��ҷ
-����\u	��]cfk�v+%Ș�y%�!S2	S��M��`��h*�Ğ��#%��|�6���[��Pb��B+W{��+ى�`�
&�j���~�p�Lm�TreK(1S���L�?l�jy�Rr"�U��q#Zȩ`]D;XFҪ�-А�M<�h���ZBVn��w�h��[I��cN��=�P��|���f�|G)V5�*W!#U�f�r�	6��3�w�m4��L�S��n��jcX|�c[�ՇQO�6��k�'���j<A
U�9!��J%��r�!�I�;䜒�� � ��$��z��~��w#�.50�#�je%y��U�'`�{�p�K:.�]MT�Af�%ڀ��n�"�����PF�T����;���2����&/^?��F�;��(�U	�Y��@b����㞙?�����
�ƣ��XY�{ΐ�cyq��I2�`#j����¸��?�U�[py�A�j���A�rٍ���)A�\�˝���ou�E���^����kM����E#Q�Q���*�|�gN.-�*���#n�oK@(�l��g8��0�I�iưsՙ�~��AI	����~R�$�R�S�����s��0�$�2
�#.}�ʔuM��v��I#l�Ȕ��M��.�*�I˙i�z"��<j��>U�9F���JD�|�K֬���F!)����m���L?{|t$��w�~E@�Ql�a���|�2d��~P�{�0=F�u�.R]����!�2 ���!aȍO����(�� �1M+X���Ƚj!*$k����t�m�u���״م\	�N�)k" ����F
�ڱ8�\��/��J~j�g&xe�0��;pVB2�C��xu��Y�@W�%Wt7�&@�������/G`���$Ύؐ?�������t�W[��,4�xq���\ib�=��$,�%�����vT.
�@3�\)�>suO��I�OF�ce���q������R��jj���#���bړ��O���b�3(�w�np�ػ�
p�&�
P�:�����З�ҟ��jؙ���.a��rv��u?}��Z�gG��� �S=ҩ7���'tжly��^���i�xr��ws
]�6�Z<Y.��˥�!�ݖ�n�i�d�C-�:���k�(�`*Z�j�	&�Fe��U�U�;v�ߪ|Mg�Q'���+���{w�~DT���oh]�t��5?~0'�� .ƽ��5��xV��W8��b�&g �ӷ����՗�����bsv���L����xr?�~���8��y~o����4-�|��s��L-��{�͜��f��|sA�ߏ��J��4�xZ�_�}�x��pY��?L��4�ab�-�dp�kl|�9�R'�>�R�9L�m��J���6����<,���y�������NE<Lk�'�<�;�;��M2�}�y��۸�Nafh����H`.==�
�!K=[]�)�]Czu�!��먤T�;����UP�@f�a}f��D}=M�9��El4ѐ�O;��˳�⟮6q��(	���ݞ������lq I�}\r<z����C*���kR2���]��ĺ���j���[�9JhA���za��)��fs�4L!�N��ћ�$Y?a��6�o�Z����q���N����Ӡ��>�H�(ymw�mI��[Ť�ֶ�����Go=�S�4��R�g)��?��"5�;�����X>0A�T�C����K�����v�E�0�[L"x5C�8��DH��l�:��q�G��7�ӣ�2Z!�^�"j��	xb
��gs��{�}��r�
۞����q�R%s�reY�h]ي!2�Jt���8�7&W�[�|
�c���,��8��8�>4�y3���e�?�t�����@[�LJ}�ت�ԜK8�F�.�'wjg�iE�K�#No�y��z�n_���#�,Kۦ��-���dt�8P����2����R�n�Nwm?�7PKE��T�B��J<�'pip/_vendor/pygments/lexers/_mapping.py�}{s�6��)XI��/)��ɞMݽU�ö�V4�7{�)���ė	R��s?���@���ʚF�_A<�/���/���nW��{yX�����u��mQ�L�{��_L칖H0}��eQ}���0�Z2Y�H��JԢK{�'�mR�R�����Ntۤ/*a��6C���z%�T�_�,�:I��P�}Q'F?��,�:�5�̺��e�T&�~- �ҡ)s%�7���J�ڟ4I��IZ�:^I���zz9O�"�٧J;��R)G����v�j���<������_�)��﵌���5�EZ=K���_�޼��Bfe��Z����	ğ�����*�u1��(��_�P��/��?��6���G//L��~H�ڢ=��u�t���\�����g �~��E�Ξ=��C$�2�ۋM����=~��oO^_���V����\d"r!S���yd�mi�8��u��Q�XZ��Tm��RP�6-���WiQ/�tZuiU�ݵjT�n@P��^a��KV�6`k�p,�i�sӪ_Dֈ�� �,��K�9�T���JR/�j��Z�P������|~aFE���P��1YV�<�T>O���G�A���P]�wV�|��0�D��[�3`j��jt�Z��VeN�E�ً�Ӌ��ھ2y�	^�Ul�Sy+JxAWT� d�2��B��Pā	٨��0�8�υDY6�8�\B��(ʾ�Ai0�bU�Bex������0�N�P�!̃_?7�޶�>ЊK2���Ua��Z��oqX�j(����D��Q}�Mm��z{�<M(��VY=�W�-��G�{ zP.g?���v��ڴ��׀��:�L�Y���뢯�n%�s� ��	���{
/j��ҩ���k?G��/�
eR��Tɾ�Q��<=..&i����L�";�il-?�Q���C���F��q'�?�l.�q	��MS��E���:h�1z��Q��~�ԟ�or���ct����i
���S\��u�?y��T}珛�Qj�R+�Ċ� Z3��
J��4�p:�~����;,_�v[�]�P�դ4��3�	�*�< �9�.�����벸�1� �4��4�&p�]s;tSI
h(*[w�If�yK*͏�Β���N����PgH���"��e����Z�R0��w����N����U{p+�ذ|���n�F�Q�,Vu��`#u٪��Ǹ���3eC�	M߸ھ	���w�۪��@4z�خ�^BEh��(��6��bX�T��
1�G�P�U�̆�9��ĩ���	ID雂��Ë�l�Q�M���>ȩ���6�&
���׷8�Yߖ�P!qJ�G�u&"/`4��x�;[�o����%u4kj&{χ�GG�G�,"_��N���Xr��G��"��V��+�&�l�U��-�()�0$�j�n-�"El�r%�邎��`���*�������:��l�yt�G

L$����r�v�u�P)
���S@1��X�R�Mo�^S�}��Ғ	�"�;c������Z��������'���X<`=9�%�$�
�ڛ#���ĕ	�Y�Nȃo(X�n�&��4nG�b���:�(K\��藳��js�!Op��Ĺ^�� ���zU����rՍ��<U������-�T�D��bp�0�	�����mFɰ��B�L�却���ھ=%��(�v�y�[���w�Ð�w)`��}� ��ˡ^E��|�
�h*�����
]��\褀��F�B��KLIBM4۩Q,�į;w�F
4�LEY]�+�)��nY�ZA��A�xaZŢ-�����'W�����P���fu��S�J�6�/�Pm�꨼���}ڶ��M�⨉\mY4��n`e�	�	w����yZ��Fk̸a�3`0�U��ީ�v�-�,!�@iy��tiQ/�,r��$
H,4[,m����T��d�B�*r�P�QZ���_^�A����F�i�hq���=��^ �����5�"/�JP��&��w���}�����}�8^S���h�� [�dFE���
oE_���e��F���z���0ψ��nlg��<�y!�h��}�Q�¿_��C�t�J3���ʡ�%\�	8����b�2�,$<-%��t������_������3#�T�@�R>5lB���^))��~�]��9�$-Cm��
NPej��RkKUDm�لb�*u�%���/�_��g���t����֖�@���Z���w���l]Ȱ�ӽ�E3��ƨ��ۓH����b�r�)���k��UI����U�_(�Y��/�f��9�Ee;"�����mr�r~v�|�m�lQ-؊��T�d�6��O��r��l�Zp,�ؖ�*\��B��x��g��^����`KnǯNA�)�$��&#[�u�N�fK��ˠ���մ_r/�?�`q\�V�>u��(��lݖN�рJ�tUi*��Q���&��R�x-D��?c�)fa��vf�m�/X���W�BQǴ��zs�&�鮅��x%��yren�rix�T"�*��oPӹcK������Z�3�NŅu�G
�jeZ{u��d_�Q�l�����%~P�_�jͿ�y�7ȍ�'��/FM�[t���XT�Y)�U����BԹ!��i�

�O����\����D���tR�Bc�v 3l!yV����bץ��2�C�"olg�HX�+o22���#B�v�����3�OZy#���5L>�����,��U'IJ�4Ren�{����t��-M�]�S<>:��N�'�s@
.`���-r.��?Ot�,�b��f;O��G�4�=9>�aB�=N?�h�/�X}�*r��w�V>Q�P�-,�M&'��`�!�qBV�‡������`��P)[�^��#juh��T�j2����%��MA�(�4�o2T���V�$�^mS+����G�,Dk{V<y��-�f�ӯ��I���I1?F>��h:0�P2��G�8��DY�J���53i�\H=�$�	zj�m�F#/�a�iN����\���-ȭ�=}�
B�QA�,�a���LZ�!"�e=\��6�v�&�~�P��IJ�m��>
���>����{�������u�1h�uU�j�����}H��]W�n��푚�Ye-,S5 b3�&rS'�&C��u�.@eS�>ˀ�m��e��(��Dkҕ/R2���ة3$Fp$58���A�����P�'M6h�H
��Q�P	��"�w�;�2����<���4�:���M��&V���4h��4h:����Mh2Ϛ���H#�+C"���^}֌jB�ܤ�*rQ�J��OA������A>�
T�OoL�[�>�y����u�s��򖅙0�O�Ş:_��+�J���h	�k)8�kQ�u����+��Ubex=�gB���m9���-o�k��b�%���ͅ-e�nݸΕ�m^�]9A��Ŕ���<Ğ>b��_NpOh�3X�`[���|X����;�t�m�"Ҕ�uX#�Hꖾ���_�]��D�����v?�3VC�"69�_v+�)�o=��3|b4sV4��ȹ�>�g|�{��|��rzbds�v����jʋ��w7r�Z.)%Z�CB
Z�iR�N�Z�&�לZ��!����qp����������#��fhL��1���bQ��qS�]�`������s�A�9$֘,�x�t�c�-!߯sQ��7�)DDr�;�K՘s6�71E���:�O�]����Ïܦ
YHk�#��.�i��e�#p]V�vM�
pW����ָ��-��}�_����L]��~��1�V�I`5�w�5o���gM��@���낝���ٷ�&��b��H����v���, �W6��Οcil�7��RW����w����X�!v��mh!@bv�&�7����������R`m�x�׶4��6΍l�Z�h��D2#_u�L}��	�5$���<�����%0$��kg#EF
������UMY�q��A����p��c%@�*rzk��^*�7A�6�j�!�8���d���D`u&2o��4���]�p�e-���
B&`�վ�y&��۾+�]���28aT�I�Oh&^���*���<%#Y��d��LV�v�����i	�ր��$��b-^Yl�n��Ht�%��6�I!6^�T�M8kS�&-y�ā��C����a����������4������W�TY�F��emQ*��uf�RH[ J[0��qZ��p���}Ɗ��a	Ͷ^�z`���]�^��uR��RF1��~�4	�T��ic�n�����R�Z�:�<�n�Z�_<���
��n�;7v�4,�T�?�k"���nQ�A¾:s�b�S������W�9��`Gp�|��XSAFc�$0�����i���اe8��o�4��F8L�͸
6��hd�6j�RԱ_a:�%P�l�,½��O��_'5U��B
�3)��^�e�
�����yi��,�e[��eh�jާ��8���5�E�	�1!��L����\���(�$!� aρ�Y�P���5[ڝ�%����6�n�"k��D�r���ҤE�2J�"ד/-	:T=z��I
&
�X�Ү�jJ^n��<�f�u;l��1� 8��em������W�\��݁� ̯w�"Ԙ�I'OnB
�����;&�b&)P�±*�qx�.6M˲q3$+��,J��7�^5]�ȼ�I

(ʽ�]�d�bbݥ��b#"g�K� Hت�K`�F�ϫ٨�]����Ù���7�~�y�5�w<&��8�(=ʀ����"���M]@
u"�������%��>qOj^\�'��|�h�W"�[�f�`
�ʒJ
��S�;.��z��<����֒
�hzC�����X����k�`�bL�h�+>+t橓x���d��{��w�$�E���*���S�/��q���K��>#:�Q���*��	�t)Վh�@�����#��V����Մ
��c�����s|��HZ�D8��eI����,�Q�J'5�y�9+Y9_%�D�s�E����5�h"g��\�莩C�nIӤ��؝��7���ڬao��Q7�x`jI�h��M8��~�6���Q##��}
ևJ�1P���"CS����s(��]�����\�rPy��eC6T�Zy�ńMﴨ��lb�1�[� �A4UVik��W\J�@�gv�^����,,Ћ�_5A�Ԕ�Px,@ Z���˹�OT�]��&�${��+�u�m��,,O�Ԑ�g[l倠r`].v�rC���OnP�C����;+��$~z�P?z�-��A�k�<�O;4f��(�h��"Ԍ޶�;��"mXrú�s�9S��ݒv.��*Ԭ&�J�c�߾=���3ܡ���o�h����l���6w��;���jH�7�1t��ΰ�>LM�o�0d�!�¬�	R�
&��Wo�w=�o��H�Y�g�5c|��M�XG�ZҊ-��'U���jU㋴���H�rq�\3�Ն%��?�0�J���t��D	��>P<�9x&�:�8[�7�����k>"LĠ7�=�Z��
.Z#c��F���Ak{�@�s$`��V�bo9���F7K*��W���������3|�%�ެe�j9-�wY��v���j)�m�R�Wղ���1/���Ǽ,���o0ք0��2��Z,�	cJ2�vIYx�S�n`��T�*b�Ɍ�6�1nBb�4�	T�J�wv��#rl�牍5�"$�7���Kk��[(�n��Y�";k��5��cm����7��)ݺ��O�^�A�_� �;��{�y�3;opO0i��G9�>��݌����q?�um�[u���ވ
;j��{l#��hy�
�����]�������ޛ�+"?��
�
H��vOf�@��l�P'÷z��:�)���z})��������Yk.?�E6�gY�d���>9<;~��_5<ˣk�}��kKT���1&r���-�bzg+��#����G��g�AW���v�E�_/�,ld�/ #�����C?6�����ܤ���{7	�t�����+��L9�F�q�[ps�Y��Yꞽ;C$�k�\��Vj��XD�X��dv��M7���!�����滸�f�8m��ƅ��{�$���
fư���5n&-Nִ��U�6X���Y�8�h�2�Vz
�?XN*�夳&֧ΐ���5faϪ�!֭к켉���?eg��I٬������:�͂���e���2]��(ֺ�+'A�����OKAб^�5x�w~���Iw���<҃���=	@0aB�J�q���Kt�y�����_�L�O�QM�bW��5�� ���.y�]^�%8�.Ev�
0gI^����޳*�mj4�b�ؙ
~�������|�;�z�n}�M�x0����
�_ ���Hd���qdnO�24�ܹq�pY�1�4���k��W��'
��l��7�Һ	���H6�eJ�ˆ��pَ�"���~\�o�g��j"x�Pt���˂�8�̈́����C0Y�"O�u�98{�4g5���8���ӏ��E�{��Jæ��?q��=�y��ԸdA�8f�|�.�;I�0�ڽ��ck��g�?���
۱s4��۩�Q�>Ý���ׯ�H�%+�
x��a�^ ����[S�G�R�8-�^$h�����Ѳ�W�*���SZ,ۃ�,sSÕ�:(s׽@Ĩ����?v��5����rtԅ��8,�<���T���Sr��)���蒋o���-k&�D��M��"��ύ�0h"q�|�+"&�;i��@��.�݄o %	�m�L���.��4��
��	zϝDF:���10h��)N_��k���Й��}�O�������nS�	:�h}���5�!�
�΋?ٕ	�V)T���j����jQ�(���[}����MP��ҧ%�e��y��j�6�B/�x��s�?<5��}�	Y&�VVo*!��1�:��nnw�kY�!/5���w�1�C��;�A�$L\��e���,��y;�|��� �=|>�\|��d��-����S)�h/?#�8F�`j�7%��]�~�u��5�0��<fz���#����>����H�ƣV���?�Z��׏E�ۧv��P��T�8$�Vy��j�.sZm&Gx�l�Ԙ�<��Wcϩ1PI�g�.����� s��M����y�2�{�wI8�ЙZt�kJ��q7��xٮ�"F���#��J�6ຎ$Q#��Jچ]mQ-b��26���P��w�E9��C���Q�Fဤ� �Q�%�r�t�}�I8��	��8�ׄ}�
����H�}]TZո�JƜV�mu��K����H�j˭�,KXz�]�*C#���H�v{��n��b��ң����-�M����3�n;i��y�֡��#�7�n�_����<���`���zy�N(��"9�ۢ;j����۳�DKZԃ���3��"�^(�-��F�j",/��	�P����	ސ�S�I��ѧe�/���H��1�p�O>&��]�?B�K����^S�0�|`�o�_
�����˖�^g줍R~�
ѻ�#�~�*t��4R��2-CK�a�aZ5�}Ѧ��c���	�m�ii�̦�9�޿����{V(	�5
�Ҥ���VF���O���,׈z���j\M�{+ߦY:��6�:���Pu!*����g�gbV�9����B�&��S��W�A&�,��Z��w��H��X	^�Ϙ�ji;��L`<�E>G�����4��)P�Q��&�V6�83m5��ZIb<i�bB�W�=�a�w5g�Ѿ������Bo�.����?�qw�ۗx��J�V�vA���t�n��>��c�jf��n�Tx��o1�0Ud�P�Sj9TC޲
��qr�^W�9�c更9�+�W��ءo�	��$z����No�~-*�E�V�Yu&�J���Om����F�,G�	����8�5ȍG��l��b��:�=١���P&�*�:*�H��ʤ���T�!��d�$���v���'+�tn��C�MQE>�ʤ �41��m��o3��40}+�_�J���[a_bB�hm�r�_7�~��;�1�TQ���6�q`Z�%�پͤ��e��7��Eu]Ue��`U@�{�h�e�T4F��7$IS���á�M����2v�
�X��	���s�>V`��bg���)Q�,n#��gK��__ui������^1a���s\���R�ƺ4�W؂�������1�X��J'EȞ�A�"��@�m���+LS������ٴ�K��/��cz�X_T�N
�I�E�,�Mxe����E'ڮɢ����yE�|j!7�`,�7��ơ�~��^o��Z�q�5��X�]'�Oe���!;�?���e"�* �Z��!�AU�:�6/��/�a�7C9UjŞ(v���f~K��W�
?�O���;��A
M|G���d�t��J��=�4���Ԕ�����/#?�|t��f0׻Q�C�}�ɻ�,���ůx��ڰ������<���"%Ao���l�w�>c��Ȼ����#֒�Æ��Ip?�G�_[�p��f�ck�=�d�JM,��q~L�OO�F�LF]Qx}���i֩�K��k����tU���h3��Gk$��b��������̌���hkψ��l�S̯z�r�$aM����N�%�X�
q*�r�=�w/�gU¥d�c=8H���/%�씌�@-�Y�Ae�&��M\m�NT������E1����`�0����J�d�W�%��V/�h�b�6É�
�A����������:
!�=�Z%9o�q5�X�m�¡:Ep�d+���=Y�W���(����=�Ma�WE���L�H>d#S�H7�Q��1k"�Gj���B�B�LE�S��`��F�Ed��x�
l��;�hi�k�G���Co�*�@_Zl\Y6A=z.�ߩ��n��j�W3����✬ͽ��Z%����|4��B}5����
tQQ�MG�
�b_�j�H@��aa�Z��]]D;܍ZF���)�����L���[���L";zϴ�
��P=RȲݜ�@���e3�i�E���N3�S��k�,�]O]��ꭥƚ���^>�����7�����d�XM~J�}�%
�j����&�^��NNYa9[��2�}��Oc/r; ��9�a�,Zk�����m���N'593cg@�=k����,�y����ə v�4ɉX�#����i��QS���t���Ք���^�ݘe� �L��
�Ʈ�C#jaQ�i�z��	�M=Q���v�w�I2yyt���9n�-�Bm׬:���k_K�<�'��l�Sx��!vY�Ygw�x6i�,(����q�f���n��5�	�A0�0��u�V�-3�4˶K�Ѯ�Z���ӑ$�P!�$�����$mJ�C��~���EzO��g�C�{�PT�Y�m�_���JS�T/N_�¹�j��܀��2�qP���j��O����[�hx��j���ަ����FUED�Qh�h�,U5�h��.�7Au�ʁ�6�je�J�uU�PM���0TmZ3�X�z<�N��1H��ȗ��C5����o/�����W�B��Ӄx��O
�k�E�B�s|E���ͼ(��Okt+�Q3=Lg1oW�������Q�p������wZ��8��]�x[���%pa������6D�
&(1���e�x�ԱS$�@�-�_�Y`Y�~�� ��b'�P�w�lٗ��ik'�epIO3=v�i�M�dՓ���G��{�b�>��NY�Zި98�6l������+耀)���<]�4��x���˔��k:wtc���>W'9ADWA��íI���+����[�ľ�A	1��.�	=���v�i�V�-�hE��Yq8�.M#߹V'5�H��@Q�)�q�Q-d����ͭ[L
����0�^����'�ݱ�����n~��WL�ϛd�6U�.J��A�����+r5�����(�����M���:�H�\�
���,CKeM�(ɥ�H��YK��
S�����[�ީ����߄��ɲ�;�YO�߆�fGV�J24���4����ݾ��������ж"�մ�A=�$ڰN��ho�æ�sz����#M�{b���9M�l��[����U1��*��_7��:ڮN,�,�Pׄ^��5|�;�\�u4�y(h��;�4�I�n�#<�*j��@��`�	��+�6�0ھp-	���=�B� 1�U��u���`�<���'��O�=��'�=3Δ�8\������/�_�<>řap׹S}�	���e*勰�}n[�Y��j��"�U�e��5��$,.P}W�d e}��[�'Y��$��H��F.,�U*���	B�K�t�H�*"&v�q�Ƴ�πgK�1,ɇ��3B�L�U�!ϻތQ4�2�}&V�����<��W C���h)j)l�;��'c��!�ϱ{�bQ��i�k�qaG)i���w��ĕ{���G~��N��9�B"F��}�f�q��.����j�X�q]m*�R���������7�Qx�ն	wu�zqy�v}��o���]�W�N�k��Z�T����%c��29�nm�v�H���1��>�o%����6�$U�K�:9N�4�t]i�Y�~�pX����h#����H��)��-���j!�<��[I��Ɇ!�+V�!�=/O��x
�yd���aLL,L�]7���d�7N����%������!(�ƐyL��_5����l�M	&��L�+�u�9fA&5��^F6Y�N�so�ep-m�G�<{>[ ��� h[�8����I0��l:��hqz�T0,�E�����[�/��y���ZM�{Q��S�/r��l��B$�ԉ��VȦ]�����]��
e�as+}?�Ϋ5�X!��P3��ޅ[�����^��\6C�Ŏi05��A��EM�� ��/�&�P�;T�������
=m"𗥳O|í�.���_�k�:Z�1������:udwL9C�2El��
p�qYP{+Xcc*u��,�ȯbW�#�K��@=����°�i�n���H<1�H'FБ��Z=Xh~�ǫu�0:����W�plT$�x���M���_���r���D�`4��	�2��YEw�ļ�5�-Pw�k�������<y�A;����v�G��\'�fh���:�$��t�}���j��6ƘP��z⤚�(j#�4�c�4u�rYdn��
l+t����X�A�T]�n3\���\����.�uTJ�la���\����F����y��kW����׎�+Aj%*��Ҥ�OG�پ	}HUGS�#�<�A0��nθbe7@��h����=F\C�ʔ�����e�����/ḏ	"𜖿d��PƄ��k�XUvN�m9�\aD��h�o��˵�4�m��s;��]�5����#y����}�%e��GЮ�o#��`$1G7�	1$3ɕ��%�R��໖!'�S\,�)��(�N'ߵ�����1bh�`i�M��_^b%���
�+=���jj���h��p�"�0H���
҄���:K��n�2�7P�9Q1��v��u��Ѹ��yȡy��y�ǚ/�,�"�8kfAq��AE�E�u�UF�A8$U9<��A?h/�N��z@
�*�����W���"6�S`��x�]q�_�l��籓{-�g��&�+�����i���J�n����t*�O7�+fx}2��Zl��)�bk��qvx��T����Y�4��	�ugԶ4ס"���I
>J�H��>6��UEy'"ݴ���<-��@ZD��ݵ]�W��2US�ȁ"[4a��ˆ��wxR��vE"uR�
(*%u�,�"�D4��B�{Q�̋*h6�wr^]u_2:3r��L.�>�ǿiN搪���<�iy��F�=��#����w������(�q��37��L������U�U��vx�T J�K�,���B�]_�/�_:�7�e���ב�Ҥ`�4p�5}rȃ�n�W��Ik@���Ԇ/R{Az��c���4֚�,H�`1@���kҔEݯILm���l���1R���.J��������J��L�v?w��p��v���dR'n@\���l�D,��N �U�7.��'�K�C~u�8A��i��Fc�����&�4[_Ï2�Go(�T��-���"v�_�x{�	��a�����x�Yz�UE:!Y�e��蛜+����`<�I#���� ��ag��D:}�b��I�$��B� m�^����N�.�7�G�$6zYR�m���g�^��^7�Il/F��I�%<p��.���(�3,� RK`ώ7��>vE�x�	�;�rkÜ�AyJ,��ӻ;�mh���3����qS�/B� ]j�E��<P:L�<���ο'z�PJ�q���2���9P(Ҍ��F�� cM���?�^ڊ���p��l8Ps��S
k8[�w 	�g&����۝�� �j]���}]%m�*�F�����.�w��}
{۶�cAɻ�Z�n�J_RÜ�v϶9�z��ʺ\-y7l!�bRM��軭�����|;���d���W/O���E���K{�d����jI�ZS�!_S�f�aW]W䣫�G,Li��}o]W��	�p,�*�r2h=����9��kUz��R��f2�v�-k�2�'�X��z�:��{�Ӓ�	1�<}�ƕH��;��W[IC��MM�/������H�Q��T`Yw�0]d����`ACK&Z4�Ҭk
�3�}�ީ���	r��,��n
�H)�{��H=r���R��X;��m�L,=	ݥ�&���� I�64���>��ު�'.�v90�"M�������1��-���=� �}�S`��6����-iž�o��Xϛ��Z}���Q�bR�f/�$��>�h�����]�؎S@P���y0x�e��</���w�>�^���g�:�Ԭ���$��ѯ���c*����80A�1���B��8��5���ti-Ӭ�u"Nr4#�1�7��?7����-�Q���ڷq��
�������[@�����)vԳ�����/���OK��O2X����$�*zJ��	�aL�^ֶ��;�4���t�Kd���'��\�`��<�����OW?R�dR���xxe%u��||�%P@7�?���D�*C�{��Ʈ��?�7>�K��Ph�6X��3�F�D:v��}�/&�]�~!J�!�pE�m��X���ӝ�����r�j��J�bC�m��*G
�nQ��|P�
��eMg���x���V	iO0Hc ����cP�ث�e����vyS�QQ3�w����x*Y��.��������e��X1|��Jj^�.|@�,]�G��,�k�?�zAt��YA)�0*�����udӨS	@�+��҆���-�ܺ��ѺB��5I�i�����[�D�R��s�E<U2w`Ddi�X���E���,��TE�&���kW�>ւ�$U��~�������/�݂-�e��wm��bw���02�b
<pW�	��-�E��0�xЛ�b�wL~�Un���V���]�ǍV�?�c�"�>B�p��~UQ~��d/�v�۸i!�d�;w��\�v�r(6H�,��Q{�b-�,Oo��'�2�'�J��4"F�{`��,䲏�y�ꭖ�Z����?��*�6��S�ܓ�)磊��Idg���î�J��!��XС��*�7i
Q
I�A:�G<���o�7�~c^c��^��g��Ez{��]�4H�}���x�����>!�A���Z8��}��[5��hM����$�ۖ�I�^��jv�֫�E�Q/�_�X�7����0MT��Ĺ�<�y��jZG>��A�	c0KV��.�yT{gc�3�ނ�
5>F�����WRm�d�F�揔���c�{I����.��86��JW�ky�z:�FAM�Ӿ��5�먲���Bp�P�^������̹��$��B�צ�lTJ�
Pܲ%;��wlD�s8�̓��,G�����R�SO\KO\���sV<�a$@3�H5�~YL�fš�����<=>�ڦ�
*�_iU�k���5��n�����.K�至�'�:���N]7�"Y���CY�hv(�_�'`Џ�)�-��1�*#س�W����Q��^#`�b�6�["�	�?��4��9��0h���-:k�D,5#C&j�E��:\����$���	����?��O���'o5;m�2
�&T(/��5O��J�]�%��ŪNJ~�CZ�-����IZ3���_�er}]�l����C
������:ɗIۥ�*�!��$k��Ǩ\�W�OT�<�ȿ��I�4�C��چ�l�:�F���
Wepئ�ZNJ���3�	pn��~D��贂����:�c=?9���Ǐ�K���%*�|+��	���>-o�T�LRJ���|u*��E�b-m�C�@�}ѯU.�d�ֹ���%���a�kD�̝��T���Y�l���_�Y�U�h$������꫐�L<�}mJ��)���/~<o���1�q�TZ]_ã���ϒwMm��6�M���4%��
���Ӳ��ׇ�g$�J�i�w���4F4ך�[Ѫ�3]o������T��ك�?��$@����-hv��E*�|��(5�����2���Ǐ�u�2����עJ�&��[���w'���*-Go���y���ui�'�ˡL�\]oy$ˮQٮiZ�I�_�D_����$U�k:��F��U�Y��MH�G�y|�૑d]]j��_�*�	^i]J&��u�R�k4]�*j�X��PW,��Q��\7C�'�B�:�F?�=�����>���`�M�� "Yl}��J]��J-����'3c9Ti�:m�#$����P����Ӧ<�.mM�'�g��������+�eCW��̪C5X�Z�|�e��NT"R�O���ݿ�/�%_��P�kU��Ť��@2KU�G���_O/�*��g��֠�1	O��5_<��wj7�]�K-�u��٨���a����L��:�+�������w����3����[��ܠ���MW����PE�*��_�]�}��P�^�0�PKE��T!2��*8�%pip/_vendor/pygments/lexers/python.py�}k{�6��
�ޮ([Vlg/g�I��8gs6m�4�v�c)2EBk�dy��D�og�$HI��v�TOb$0��`0���ܳ�_�,��~��X����l���g��}{E��i�Xo(�儞���ɘgN8˝K�<���׉?�g'�3���tp|x|lM��l����1gѳRƬ'߿�����9��wY���������N�}{J�X���m��/�(ɠJ2t���Q�ݻ7M���q|�B/J�eX"=5�g}�f�J���
r���³$��g��z֐*豩�Y�‚�-&~ȼ��Ecj�d~‡l�-��3?�՘�l<��`�8��	 w�p2w��`d�%�w�
2?���g��Y�d��)=�[g�z�%Zs��l��<t������f!K|�@����$���z�䡟p�I1r��x��xl=��:|�;=KD����U޾Kp�^��TS�I�+Y�[�<+��|���7�<6�w/��'꛰>�l����ðӽw�8iji-����=�"wѽ(�&���e0R<fٗ@S�d�A��+H�߷�[��wrb�����9
�z��l�;d��%�����V���e��0]
�.��K "g0�(�&�9�/d�2�jBE� ���˓_ͳ,>��\
ӏ�OA�YJ#�C���76�cT,>����S�,���N��1o9��^�Z�Sp9����R��P���WCO�����Ջ��Y��Y��qV�uq8�����`����(pŧ��{�#������N>zO���r����	�_���}���i�f�@�P�'q��80�i���I	I�#q��g�/Xv��̀ݿ:(:�)�j�u��K94e�A�\��@�9�:��k@k�|o���
ʨ���{Orqh$p9ΰ�I��ΰ%���0h~�
;�1$�(���:_�,���w-��`��a��$w	�A��tK���=���a�;8;�=��G{���_F����Qw`�z�;�1�9��F��Ӄ���{0�$u�G��/Ì%qt{���l)���S��+�ОjՇ+uI:6����\�ó����h5߃�c�S��k��_���3����.p�P0�z��?8{������o���C@�����"\Mfa��5�B�>�W��8)�
0Q����(J@"�F@����Z�ifM�;	~��,��
���ᰳ��a8ڇZ�q٫%�4��!�.�}�2��y�a���
C諏�zǟ�
f$�#��0K:��P2 ^f��a�iTP��&��$M�V7��:�:8��u��2k���L��D��4f�#,�W��u��Kfւ9a��.sa'C钹��:̜+޶>0f�9�NZ���\�~me�Y�I�Q^, ,�*p� '$+�!g<g�Fi��XM���
�)����N}�������]�叟>o,�l��S��bK�(�T�b',��{oӽ�}�|�?y:��b�@dN��a��@�[����撹�'ө�b�#�[+o�X^��)ʃHw�����~��]G-��Q���z�����-@
�	�ތO�Ob�ew�:.��Q� ���AS*(��S��d���*iwY�Z�JX�),p62�"�`��	�����Z-���0���
�_n�s����G��Iߪt�k%�ҚpT�6�o�k'��4!�j�����OjCQ���N"K]'�G�4���aG�F+��a���j��j��q��w���G�A�9����x�x��2��L<l<D;퍼�&�{{��3LV�d�Y��:�>a��ߜ����q�7����n�yA}M�G����@}�q`�Ro�
�g(Uo��tmCo���V���V��m"ZH�c��գգG��W��N��~޿�������~�G	_��
e�>~:�����a:M'm�q•��`}���Ue��D��ě6��QzT�&����9�™�.J�k�\:u<x�ȉU��j3�\�>�U|��|������,s�����DS��’y��,5����I5��}������eMB��*MO�^Ǵ��6��QlnN{[ 
������p����c��/G�B�FqmY�ˡ�dcL�J+-��:A-I�G��I��Qu��B�S�m�����S��?,��^�����MY�B��G`,�M��l�kOE�v���Nz�8�I'�t�,H�������b�9�z�խ��.��V���07��S�V�,��y��T���ɷQ��0%�>�8aր�F$�!�Z	+��z&	s.0 �4��n��U�'Qʮ\������<��l����)��`A�
"�g��N5���S��؃��Ŕ�ܯ��j�:��Ӟ�y�:w�t�I�x>>�0�ܼOk����5�F{�ʆ�.*'l��v4%2���82��M?�X�ר�\��
������/�	�y_�ك�N(,�$�l�����~5��I﯏�~�����ѧъ@�ǟ;��fhr�h���*j�Vs������
u����-2�/���f]�m8颼Z��Z��Aq�E����TՉj Uz�κD�D�kE1v��X0!Gp��
�i8��`��U��+I�6��UWl��b1V[�~�������c"�	Q(�z�D� ��#����:cN�8�&z'C�f2)t�ćHø`0�x�ˑ�����C˝��{���^.8$b=
М^rv5dTM*8�i9��J�h�C��d��uR#�N���§9%�&��J�a�g<���ȅ\�ci>!������ɂ�Ȋ�2'�*p�Qr}鳥	؂w`c
���G���G�K�1BFђ	��0G$�!ɮ�<r#���	������Dkf��S��"ύ[#�[���wH�/�#���8`&���	h�>
_H3|������&"�4��r�2��8;e�tu~�����({��w��r��/�tX�7)˽�a����I�& �wɪ	�$V[���?�_���A��$�[:<���DAx�����Ԅ��Э�[3��u���_(�ᥟD!��x�����A.�X�9�ph5!�.\"�^qa��k�%��FX���e1�0�ݕ�n�&��x��Ir.t����<V��!�TQ�Fx���~[���g-A�a�m3���N��
�w��v�t�wy�ۢE��͢�e�}��c:oiCXA�Q�u������Իu`J�([E�'�f^!g�^�h�����F��T����x[��V��
�:pZ�բ�t�����o�6��2��`�LU��eI�ܿ��b���Ӿ�%��I�KI�ޜ�����`~��r5�z"��&�\X/#��ܬ���	�a��*r=��7|���f�`��0�(/@����fi���ͬAҰV����>Z?�(8�joMt�,�4���]�?�Z��F��%���ԏd}E�DT��)�����z�{7O�N�hF����~7�@�� ok*�mDWW��
A�SA�I��"��b� PVR\���;�0N�M�\2!�	�t[D��,(� �jA����g�1-1�g��~RQ2�1�H��J�!�$d-}�_�8I�Mg�~h^e��(�*�p2�u3�m��~�E9�6�A:��
�
Z�A��A��Ph("����Ι{�)���_�"�)�qNT���`A��j�gI��_�F��ʣHβ�x�շ��@�
4�`og*q1D5���͚ _,R�Z4,��"�l�,vU`���DcI��p��Q�T��KʨK�1���jHJ���*KEZ�$�+�b�$ڀ1�PZ�xZ��L�i3Wӊ�kbE7�rMuxm�(iz��x�����|�6Ѣq��(#��P�n�'��V�(͓F�C)���)�
�U�"W�d���q^U\��3d�bY�� ɡ���H� T����R�~ʝ@~7v8,�U�QQ��9 ^l؝�t���v���5���C���C��7��Y�V�h�]D��g�tt�0�rA�a�>-|
�?Ej��C8<�^�(���G�"�kט~�T�?*%jRr�]�K$w�O^�I����쪵YEJ�g,i�*�S6���P�,�N5
.�v�����j�l�_Y�C3�81�te�j�l/�5�`��R�bL=�&aE�k�Oa�YCa��g��P�MXP�5�Nڥ@���.ەF�#ꡬ8�`�1Uf�k���ץ8Mh�L�b����k�a���+�F	[VR��1���ysx-�v-j�����`��C�k���+���D;�Wa�2��u�
��4�w,>�O�@�0s�J��-v�Fc�b�i2���)8�t�~�-4j�J}�Z���J�
��6��5qh�
��d&��ΰ3Z
�շÏx���*ט��?|Z�����iu�Ǐ?�h.�x�{@�j�(j�Pz��ET�|x��ޫ��YSƚmZ�V`�l\c��2���E�SC��t*vt-d
��p��*#������N�7�3�QUE���Rc�w:;������w��;�^{ѝ�ڣ�����T�_�a>k�;�"�y��;)��l�T�h�l�����Z)�Q�0e��c�6e{�#�6��8b�Np��1����O��eŷ���m֖����خ#~X���f-n!	y�N�G����}X�t	�	Ǜ;N8�_��j��]"��N
��(0q�)�o���pO�m��Y$�����W�ayqw��D�4��`�K6w.��G�YD�P���A5�,Z- 2n�l���ɩˆ[.-��Aw"ɭ�zZ6z���-�ө������������|�������!�v8�綟Ǹ�ӻ[�ø�Aߛ�ߨ�-�`��cſ�R��̙d���^��َV�T���c�m��)������֦����N���2l<�V�X?axkGF����٘Νl~PD��V�ډ�_���[��J����Z�n�	#�:@e4Of�*��uy(�2)l0��Cv1,q�	}՚~�y�0Y�㠙
�L��ʸ��W��u������� k�������li_����[���Ž٦�p���ɔ�Y�U���Ѿ=a�kng�����C�����C�C_���bP�_�s�Z��3���F{}:T��#fh�_�7����Ϳۍ��`��7ίm2���8���X�:�;5�/^�X�oe�_Ͼ��>�X-���o�Fp�[�k�u��ox$��ZT�%��E\�4��l�v�粽�	l�$_��4#�/c]�x6�]cm�xfY�=�FغE�\3H6GSX7�c�����ZB�U-��XB�E�����75�6��IW����d
mz3�g���4����ˌ
��w��E7Bk$_2j�K��n�Z�8Z�?AW跶6M+ԝj9?�Z��2���<z#[�6�g#�o��n�}6't_�f�)t��4e6vq�is-�0u����群{e���l`j+�6�OFS�R�f�d4I��"Y3W[o����S5BL[M�V���X6k��¾���yop�Q�ǧ"嶖�g�e�7o��3`�Ó����˽���-�k�es�e+f#��	�B!3�n�&���j�`�[M��z��
�Um����,�7l5�`nyC��X!�Z)w�j]�X���<�b�ws桕K(oeQ�Ե�
��2���q
�'�҃y)��k�B��=�(aU\E�2^؞�݌�9����N1��ߌ)��1屰��]��ze���tyZ�E��d����4Kq!�΁��(�Hn,���ɉ_C�⾒Ǐ�,��(�N�-m=Z�z7�x3~?��[�ꍺh˲Q������>˂6�x֑;�����У��f��|Bz�R�Tz�WHh�<��O�"�P��:o���1�KL��\�t�J�>��8�epHbd_jY��Y>^��;x���[���h�j�K�߷�R�&dSZ���~��S���{�4�xB�����ѭ1���vsz�ޞ@�։�EX�>��]u�H������E���XLQ��-a�s_�*��^�����A���ۣ�\=G6)�(_%ט���֢��/�xM�*3Ȇt�������ɰWO�M�I�	i���E� ކ�*���O!�<Dݏx�>�����Gc�.�J�2�� ���O} �N�C=��;q�B϶�Sm��wf���o@p��bg'uG�n
��G<�NF�4hN›F��z=m�D�bg6�7r׊��X6��lk�B�m#QU�]Xt8d����`L.�i�;���hJfՙb���m )�/�TX
9��6���$J�ʌ�o�+�h�wz�r���$�704��zc��H�\R�µ��5:Z?e66Ȟh������h_��Cԉ
C4,�x�@��#��;�ͦ���!��V��P��:����Al���v�X3*�D�E��[����U�e�р\�$#[�?d�>̥=뒎�L֍�l�RX�5�7�vc�$$f:-��t�d�I&�tNu7R�F���(k{
�U����s���b��W�WŴ�|�yLǿH`�;h�9�k����ʧ]f[nF��ܶz�m
�B�I�V��'�Pg�w�B�p��.��i0T�j��1[�VT��-�)&��y�vO(��<��G悵��<�SE$.��A7u�$�dŰ�;oIJ�j:�B�!Uh�e��ajS�,k)��G�yxDIԫV<w�M�E	`���#�l��Ɋm0�ߣR�6�&7#�����mQ��-�ѵEE�t'�M��݇�0\wNJW�ĕ��
�"E�˒����*4km�F�D\[<v��:'�0�z��^�Q��G�%���E��f\M�S�ϋy2�v�l�9�H�b�f+S�h�[�m�S�����?�����?����Cy�F���}�]ޏY�⟃CHy��y?��6�\f�\�����{(fq���$,�D�*`�S�[a�X1� �s~CY��Ե�~~?�h�i'��P
�W�dW�Sq:�<�5(<��o =�C�������yݲ����|w�l���[����xi�3��]`/���kӺ�6��PzY��󨺠�3~�N
\��/P��,���B�;Aj���g݁��s�:�0L���r�Ҭm-���+�	a��os�}l���/����M���:�0 '��{�/��d���Mf6>5<�T�k&��]��YZ���#�D�a��r�-.9�7�t���T�Lq%�W��m3G��C���w
Z}*�(lf������#��î��Ã���]7{�<iy��Eʍ�ƿ ��Nᦀ懇��KK�4�8i���P6�=Nrf��
::���u�z�Xɳ�u���y���Sb-��;�Gy�Y�'��4c9|��5�A��+��T<~b.�}p�4Kr7ۤ��W��d�{
w T��(Z|GN�σ�ǃQW���5_1ݔ]7v�5� �X�^��E���d�r���@0ʭ��/��F�h��FU�u�,h��rB�u_.��Xz7����<������L`�.�0XxC#�]ܗ�xY��nn�zL`9�O_�^�X���?oO�4-'���9Q��/�0�F���qBT��-'�nw
a�qBb�#�
'ԡ�;R��qBn�#�M'ԁ��r��q›�q��ظ���*��Q0@[�V�ٍB�fn�(�!*���lr��+p���^��S�O�����F�_��BիB�^*^� ��{U�C����ҙ_̓��S��5�*;k�GB�κ��wzⱖ�:�8\~�Î��d4B%Շi<����o<Tr�@��j����Ȱt��L.�I��Z�J�+��p��s�
�ʪu�N��'��F��5��*m_��7���
�:U�U�6ץ|@����S*��Q�'<߆<�W�)ee��z�z�~��Q�O�~��=[�b�U�ϣts-7����>�ϑm�)%n�3.����s2�8?��9���zh����
)�a�oz��TU�^l!���3��r����M:!�X3�0]s����t������A�*��u����A��[����pi���O�:3��:�z�C������Uz�ó
���Ф<�
���]^�?���[�NRz3�ٱ�BTq�`��:���x�i�8�Z�ܙq�M�0$�ᐌ��)��~ӲE��R}��g��w�v����N_��V��i�v�莿.S����&](e�ĬY
Q�+��0�]ajm56��Ͷ�|S��=�����d5����n3ٓd�&��V�P=9��w�x]ح���Vj��n�Uݨ��zV+z�+̽�6����F;n�%�%���ξ��׿����<<��p�~��_{4H��6Ti�-��GeWC۹P�n6����b7@)��٭΂ty�>#�{��c�7�BQ΁jr���:P�V)��G4�TA��+���KX�m��]�b��w���-���Tt�+��Γ��O���mG��Ss'O�;o����ix�рQ��Pj�-�z�ʞ�Y�]�Um�������ӳ�ͷڥjw�ݼe����j��uB��44o[I|�(s��3�y%����O�;m�N�y��
ԴD�C�D{A],�
�޸a�j(�V���I�R�ܕPw;{�����f@K;2�ڮȪ��_�TV�;��^o}������ks���jXM���34�[���+2<�WB�͊F�
�
Vd�P��AAY��)��K�jb��#�wMe�f;���X�h��ZSGT�Ѹ��R�4�H~�{��T#uY�t��U�����/қWڰ�ys����j��<�ĝ�$̍f����[U|��ei��r��PA/-��.5�v<�Q|M����k�&�ʻt�d�{�����:�����3���
[~�7�\��8�׻�q��~x����e��!'i�\�q\7_䁐o\�䒉6�����C���3��q�<!�8B�q�XO7�b%��r�r|�\��H�W�/L%�;��Fi���%n*J��\A�+B�EP|��jC�t��AqI|�5K�K��(p\��Q|�~ʝ�P��/�TR��4�L�f�7�
\
�-�V�cw~1E1�W;%��Y�2�j���Ai�`v��є„8�Zi嚖��ގ�8~D�{�c���Չ���L��ɴO�f�X�8I�1����G����
�$<F��=v%�L%�4&b�2I"�s�jW�c��He�,�J�ս9w@D��.�·;�"n��u�T����X�-�p\�7.朄AO�`w�r���T�C(<T��3��Wr��2
.E�X��&�q�Y�@A�̍.K��H�L0�bb	��d�!nHS���;DT��N&èO��)��g~����^�K�+C��)B��=i��|�Oj�2��f�8+���U���<��c�@o���HEtq�x��_�*8�z
c�t“�#+�X���4�i�~A�<Oa?(��4��|%�)���h�?���f�K�<��OK�B\h
�J��8�c��V�o��*���\��"��5~�1�iX3~�����	'@|�Y]c�f�F��a���������xWX�HJ�f}�B��Wy,��("Si�=K�x�9Yg��X���})4�[<J󧹟f���CQ/9gVQ.�m�m̯cN8���G+@�+�|12��W~���,��F�xD%Px�����x���(&��X�R�fG^�z
=�^����j
0����ż���Gd��P�	�L�"��
z�[�SHt��M����PC��P�WJ����B>���ˆݿ*���e<�{�pZ<�I�fc�J1��o�,.�14P������dW{&G�2��q	`4C�]N�2*&n�HƮTT�E�’?�	�f������Dp,�[@Y�86�ɖk�)5�`���Y�5�(˕U���r������'H�/=�e���,B~%>�����w4kм҉ څx"1S����s!dK)�C����%�AQ���M8ЗŘ�8.�s$�kv�4��D�bv�Y��3e��eKqD&�_��,���G�9��G1>�<#�vP�/�;�jʙ&����w2T+�BWGK2���+�8#"Zkx,��xrB�x���15��X8.�N|J����S��@ �*Iv�ϱ?ז(�ɕ�}<�#�g ����#�ذ�I*Ѐ�b�)����q�O�o~���R<*�:��7�E ��!�E8�e!`��m���"���(kS��:r�)ԙ|��,�ЏC��G\�L
����Q�E	+��TIiI�H)�GI��,8ۄ%
&�T�]����`�0�g�;�?�s�	B���~�,��U���.b
�F&5
��s�M��mA	��^ҟD�3��!�� 7ɲf�d��o��H�U���@�%G,�r��7	Ń�C LCMik�1Ɨ}�z�h�Br�4�
5���Р�t����#���l*b9�L�q$?���ߑ�h����S������"$���9���R�t$3���s)h�H%J��—�Pi��_�n�T4�d�$�#]ig�s�_T�)�g
�`�Ƕ���G%��Ǎ^z�%�+@w4�ھ���l�bi,�H��;Gܪ Ŷ*�|`��|M�0Em妈�Ą@���}����M��f���#j������a�W�`��6�~ �
��Lny�a��!��T�Jo�['���cUZ����$�`	��ֽ�PKE��T���Ǧ�'pip/_vendor/pygments/styles/__init__.py�VKo�8��W*
;hb9�a��$�H� �>�B�$Z&B�I�Q��}�/ٴ���� ~$����E1!�uC�fҚ���`Ə��?x���\R�\�3.I���i�U7hޮ, 5Brq~������bW�<��et}Jc���??-�A��5��y��	�w׷�[�T�4m�f��O�Z�Iǻy�a�Qz>:Ӊ�E��Sڒ%�M����?����$x-�1�~P�l&�� �hg��D�5CG���Z���v"nf:�,���-?]=�K�woڰ%텝���pZ����ִ6��0��k2�Rs�^�1����R�V��g���V�c���J(�셓N�:��J{ۯ��!b�+�f�u���h|�mN�R����=�e�So]ŽPNUR�P�1ad�;�E�jO��1��H��,80�|��*����1��2�մ�"�囸d��������6�6��[\�c4J�����
_'��?�uN0[=��M��7\�R٪������HZ�q9�O:?*��jX��1����H�U:�a�;��ퟦܨ3�.�Aq��n/}���
6T��ʹ�(v��LJ�
��s�0�}D�I��C�� ��T���K8�ʇ>����G>ad��o�J}CO������F��
vr��R�F��(F	��w֌AG	�l+6n�1��-2t����t�ߦ�RK���i��sD�ޱ�?�D��H�/q�3�/������/�*W��ɪ���M�2^��M�^���>��LH����n6xU�…3A|��xJ���!�%;<.\��{�����ѣ�ޜ�3�+i�
o}Y
�{�g�w^_�Ǜ`�0��a�}����Z|���/��un:��l
0=�BM���	UXŒW�,]	�
9���&���خ���;r��4���A�8���s�r�
��U�4Zukpe,ZT�cG:��iˎyT�F���P���[n���w��;Q�����4�e(��r6�+>�S����TH�/���n�Z�Β;��Vk��G��ey�6+�U/"U�c�C�F�ꂼ�F�;���R,�q&�)ְ�oW.�f�uW,����ϋ�C��`NRk�,%X�������KOt���<z:w~��G�
��qXQ?3)2$�����)S���)�%*eWd7>!��E̚�34�W��9���NB�� h�y�7PKE��T���jh
�#!pip/_vendor/pyparsing/__init__.py�Yms�6��_�(3g��UO:7��ęSl��T�\I����h��$&$���m]�����.��f����]�˳�5�����%���4���do��^���U��e������ߜ�=}���;��l5b��u(��	iȘ)�	%�{�U<΄o����
�v\m��2�x�g�P)6�uƃ���3bim��Tn�g��������̗^�8�I��H�q��.l�,��Z�/xȂ�+��s��d�1%�Lq���s��Q.�((�m����)�A��d�`C��pI��tg���u����1��i����"�G�k
����L��Ҳ�w2j����*�X��CK�N�,���
��G����\�v�
�|-��>��{,3hl4!o$����t�q�5��X�ak�8�"-����TZh��#�čÖ���x�ɒ�-�?L.�K6/1��a���߯V,Ƴ�G6�b��G��dvIw~�[8�%�/��n:q.m6�]L�/'�k�;g��Nn'+�]͵Ȃ���+0�u7 �?L���G�]MV3�z�cv7^�&�����/��K*\��l2�Z@�s��V8$�ʜ0d˛�t�ō�q����b~�q1��Y����������6�H�8Onmv9�_;z�|za��Í�I�8���j2��m.��C��j�XU�&K�f��dI��Z�!��=s�;g��CF'����Y�N�ϥ3��ے�7]Iε\I��
�B�~N�E�G�P�E��&7Al�P���ʭ��(·u����,ʅ���	�(<I��ގ�����e�QD	�����)��7釜���{�yC���� C���6�����@T���2G��G�[aP \����{��@�6�G�"�y;"6��)�k!�*��O�O�:�W���{َgZҝ>��	�p�B"�Q��=�����G�u#�qA+i?	lp��=H���S٢�hCp��E����]����{���Og���#��:Œ�	���gZ��G��m�N8����K�8��՟Ԣ���(^�����#}�c�G�Ѯ���I�'�$��CEt��F�-��WԎx{P��3y[>	��v�l���Y��F�R$A2r�D�K5���	,&��@�0����y]�\�,ؖW��K��L����!{���v����\H����Kp��xg&'��Z�H��5�0��a��E��J'9��fy+���N޳OG�td�#���3����'�ׄ#r��Y�E|�&A�����X�}�Q�MY�c(�Q�7'pH�cr�ޤ�y$Ң��[�ޥ')|
�x�w���W�J3�ԋ�u�n�X��<���;Ҍ��9V�D��B�y��Xe�%2t�+����
e퉥v�#����-J+j��LJ���'��㺯>h<�q)�z+m
��Y��j����.��(����Q6��>	<t{�I���睈ٳ
48d�%3@�R'H ��=jh��3M8��Ҧ*��9@G��T���*��c�3f3p�Ud�h�e��K�O��F�h-|j�<<��k�i��׹~b�t��4ЈZ�n�����v=zB���hx$ӌI̩�#V�"�A�x
��O
T���ȈN�O7z;�qd��F=
p���*;��*+�^�/�4���|�^[�8����t�U�ߔe
@��]H�;��9C	�@�������)���[��f�t�<�LSmƒC0`쮜>@0U9Z��I�bIl"hG�0��dl4��`�L*��+�^>]�(��%��j�I*�"g��Yk,����۔�nRlz���!�(b��
�d�Kk}N�\P�N<�a𥶻/�O�S�؁�`���b�m�o�`�m��XU&�f���aDŽ5�:�	��2Mf�W9��0���q�x#������ꌼi�A�zJ�C�L���$�3(M��pe3�4��CDQ��#t	�uK-�c�y�pÓ�Ŏ+���_~���Z5��]#����7iZ}C�a�Ûǂ+�W�<X��6�o�Nb��J��:j5v������p��ԕ8�t Kk�����j��j�N�M�>�_���\�"�uK7i7����%��ߓ��������.�Q�*���2��!�W�>�W��P������AbB��"�Ss�a��8�U��G_J[���Nm�w��9�C�kjeO��n���w�ӿ���e���Ac)��Jk�^�*�v�`	����_ߊ�7�.�"o;�Fo*p��6�A8ļG㭡d��hX"�WM�x"1o1��=����|��&V�F�z�ee��ݽ��,�]Д0�f��b�9,���!24:,KŁ'�J�b�N���<ފ�nnk$/��}�Y0D3�5��A��XP�BW�b�I�n�0F�/�}&��6ݶ�՝nͽ/�\�^�g��4�5�w>J�m(�h���?<�yu�6#���)Nx^�Ål��<�e�+�Z��ޜ��U�?8(��P'�'��7r���A7akz��5�L��b���>�)<�o5�\�ZIJ�N��풋��"�!Ng2������׶�Z��;J�}9��m�hP�U9��+y!�<��\S�]&�/�OB�})���靸5l��s����O��N	O�M
�ֹ�̤���lW˫�&��y���dL�p=���e��J+�V?�3N�����=vb�2kAf�C�m��W��E�ܢ-��`���e��2��+�ET+��7[�%m!�Y�$�͛���؊�r��$+Y�4���{�~�'��帥�\�e���_
�F�
i4lɪor�4*��[W�Gi��}�*v<޻^(S�f|�$����4m�>n�:P�eXj4�eQ�bEP��'s�0�+�kb���סk�'�Ƕ�D����`GyQr��=\�)��	;�Ҵ�ֹ�4 X�;{ڢ���oQ?�'���e�
���q�t,Q�*�"�ES�i��r@���$���C�"�)�y���oL�m�2�g�
q���u�uMOVO�fĕ�ap��J��|��^3����o��P"�O�DGZ��V����`���BK��t�!�*괪��k�����)�l^�۶�Z���ۭ^�`�+KR[�����Qs�6k����E�›�CS���[�l}��Є��U�207�I�NKu@/{��E7����<�U��2��!{r��}[4��:@����E�Z�: `�>ڪss�\��-)/�G��Y�N�>Tw@�����.��$<�n��4�l^��ug�P��ݻ��ޅ0����̏]B���qvс��F�.���>xq:�rI�2nŀ~���`G߁��p�б��CORXچ�>���v!=l4@�f��t�O�6\�Р�`��ࢉ:�o봯Rv��(O��%�#1�_PKE��T/H��F pip/_vendor/pyparsing/actions.py�X[o�8~���(�T�:j�a�m3�"�E;-A �2es�[I*�����J��8m�ЇV@b�<<<��\�!���F�f4JM��H�&��A��4N��ƪ�v�!���Z���F�Q�Ik�E���H�t$�A�����*eDZQ�v�p�P���n�6B���,SK�'*�x��R�"�u�]�Ve�D�ʭ�eLk�~gz��I	����3:���n3�ȈEDK�"Sb�'
��.�|3�̬�KF3�d�0��=�t*���l��1�֙��<,l9
���|4����jS�,�)#5\0�k�?h(��_�r����t���y^֎�*������ӶE=�YVސ��R&Z:��Á��P}׋ދܾ�I�K��c�Q,]x��x��TFx��eXb U������T�Rk����t�E
[�D�:���B��E9u�`�Z�nX,��
f/����aB~���⧙(v��ב=����*xҵ���T	��8�A�V�ƤFU�LT|��:���|ӨI��p��ZD$��o�3�N��k��*⌭oDmUZg�f
%�$/�rޙΝ��%mH0��
[Ŝe*W��v�O�"G^�[	a�t��VQ����,C��qhǬF��3�/���6��]Ho/.��-$x����4Ο����`��i�uTȢ�F!a��o�k4��8��(�.#��+�^�/_��+~��8G'����]�o�6�o�kR�T\�����*�R�N�p��v�0p��(�Ւ�si����L�d�})�N�qg�ņ"K"MMp����$���0.�D�Yc�k>;G�ҖC�3|
��T���MJ�Yg�'�_���6�TH�W_��7�؃���������s�����q�0�do����
�Yf��4/u��`��(T�����v�zSe�4;K���+۬o����+��YL$sQ�A��ٵk�#�'v�χ:���R���~��$ �
e[m��[�3"�J��ȭ\숅��i�M����������w's����	M$�Ef�'d#��&�iO�BR����O��F��
{=��њTg�n�ݮm�A�&��ĕ�� �"VW5�kx�#X���Z������|>i�D4���t�� Tx����CR���4_8@��3jSt���'l+�oP��_R� ������`���+se�X�c^�����ms�jW#{����{ ���x"h��Գ�Tc�����<�M�<��PUDe���NĦ���AJ5�)��ޑTQoOw�ܶ<�8-�t��"���?G;'ҪR���/��fT�;�
�Y8�/��=9�m�@�
*�_۰�X6���!���dV�06��nߞm�ek��UtTم~tz�����<���'1ߊ<Zy(�Q��={6h��,���`�\��:�6��+���ɱx-^�c����,IJZ�z�J���������P�(y�>:?ԍ�����*��f�0�L��s�n���"��嵷>���C�G�׽�gL#��ឆi�4����;Fj0��g���JWː�[4���`Q.7�v1���\�Ԏ�Nj�B�=�î�2���G�~`)���	ŀ7��b�-�M��V�,�D89w(�b^�]F|,zfe�m����=��ɭa[�O��vu߬<g����Ҿ�ndB�n�/j8���U�LN�S��(�=m��8������^�Wq=f;�Y��.��J�5��´��H�~��!�2�K�1���p��d�|�F��w�m8��[��}�z�pf}U�x�.ZN���[�D9P�c'{����V����=�L���s�+��u�潜�ٺhW����?ox0�$��G-:�[�8���Es

��RuUw;m�:��T���Zj��d%y�+r[�mC	 ����u�f�
i�U`�D���]��M/<�����՗�xr�������_������bf��q��)E�#������;ʛW�^O�_ԄE/���3Gwص�|E� �ʉ����D��û��Tt��2��B�ޟ��'R+�:�n#�&_��5W`���
�G����Rd6�$
\+vK
O��<4�e�'+��>uoˌci�x�_PKE��T��e~��2pip/_vendor/pyparsing/common.py�iw�6����d,R�|$�:v�&y�{�Ưq�o+)2DB7�JB����;^I�v�=�X�\���K�(�ЊW;�$
��D	#^G	'Os؜�1K��2�<�܉良Ch��D1'�^gw��o3.�{A�������%i���,R6[����	KS/
Sb���ݰ�thʈ��4%!�e0�0r��F}���s/%���iL��-�W1Mp�$}�C��4�-K2D��l�>[2�+>��tE��`��-��L9M8r��@.Dq�B>��L.�x�EI�} �\y!gנ����U�c(`z��hH9�:`�f�1�8��)�&�l#'�U,���:�A��zn�^�.�]�2~%�	u]��X~��Ӏ:�|��ۻ���/�)��1W���>~x~ܳ˩h6�\!t�wgW`nn�\a]�L��3��ݫ���s#�(j�6�
�T'%PXc�"�=���'��H�}�(�K����]��M��7~D���W���A�>!���|��%�N��e��g6���&�G���[�>�"�U�1�}�+Y��,婾��WN�k��'Q"�d+:p�I[@��@�1Xm�x ᫘)h�^O�7�:��vl����bf��W  ��E�ٟ#�w��U�9���qj��0-�-�*ɛ7�Rp���6�Ŝݮ*�y�=|����b�&&ǒ}��Ɋ�l3�8j�����R0�st�4�� FDø���������&�0�_�����C��a�O���
�f\aWih���[�k��)uw
�~�@����P܎+�/�L[�嵶Jl�/dn�
c��ci�B`�HA��C��=K������Y�Td�\ۖ���ZJ���:��=�ن���C���"I�h�ƄGE$/��$�B	��r~˩f��2GvI��r��s���d��+D��dsے�VTҭd�9J\֤��	���kL �dD���J�z"+'�:(XB�S�:�tRx�Xɗt�oz���K�3�δ�Ye;�>�O�{YFF��/���Lg���#@n�D��󑻯U'�$��������P�w��9�bD���h=��F	���Ȧ��o�ɖ��'ZW���l�Z��B�Z�D3Y�����%ӕ��yO�e���ʟO��K	���Ƥ�ߦ=��~%�R�X*w]��}�!�:�i&��"B���6�O�,��̦��q��X���h���:l��5Egjr�P\�r�`����p��5r���s�hw&)�x�'�uod�E��0u�(a��f3Y|Ȼ���C�z\�
c��>�~%d{��M�/jG1�B'u~��p�@��h�{a����g���n�$�0w?�>�d�>gv�܍5ɿT���w��Š��6�K`�Z��*N*@f�(x��M����*�V�m<4F|>�Սo��7���U2Q6׊|B@�9P�d���]�{%�(�U	��9@Չ\&#֋XC�xN���	ģY�cU��x��s�4f�|�Q�+���Lۥ�M�
{��x݇��1|������bw�w�>��d|9���;�E˱�Z���
���~K���2r&����K	�^�85g/�7���V˔&j�1�-|"7*�
%�D�|U0�<%�$���4DF��YJ'��$�C-ߠU��#�~�z�C�
%��,��hd
	U6r/�1�Z�T�C�k�-Rt��|݇̚�3+��1,�97rJ���ˏК�@�\BD٨e���E���`�᭔Do1�u+'�6��Ha�5��9J�e!
�;D��T�&/��H=�6G�����96j@8�md|9l��/��s+����@�Ot|�B�4"s�dd��Q��+�DA�̅�6���	Ya척\8��}��q��ړ�O���?�J�o��/,���ev~o�+�R�oY[O",�Q��P�� %f� �!~�@��0��nJ4@ �t��.|��\]UA�����z�Od�E���'(��+�h_\�*60)�$tCE#:}z�L��P���'''��7l͐���� ^CE�:��B��!v��(������$�p��~b�dx�d��K�#����h:��FƆ*-�uX��?��`���r�%k!@=03���b�(r���d�Fr~2Y�
��6��|�v����G�ɬ�_��ʋ��${D\,�9�"��?�]�6��_�0b�ڝ�ou������[z����uH��C�N�?�z�+0Y�?�T�O���${�+�{ۚ�_��M�F.yXz����s�����U�z�%�͟z#��(�`���2��t�*ɭ���s��7�$c̣E�Ab�.8�E��an' �(�Q0���og������Xt���{�ܙ˲_�� @~�꿬��^o����a�}ѩ�F��{�Vψ�(de��7_h)��#����˽�+L9�'���±����x~���=��d�Պ���E��/�壸�*g�"��Ǣ���ˑ�ak�ih۩!g4`Q����.�c
���hS��P���D���Q��
�B���)���
ʻ{���9���pv�>DGhhg��O�,"x��9�d���m�y���k��S�A���үﳧ����]zF&�8�	�1)wA[h>؋)^�е�W��8���K�܅���g/����q�9���a��4l�fZ����r� ��p�(/ZO��FK�*����y�m~�i[��a��$�y�'DΚXG���6�ڹQ��!ddZo�����u�S���q<d�CWo��TT)D8����&���bJ���Y]##.��7y�滕^?F*��Nnj�r��=B[�@U���j{�	t����v%~]D8��J��`�+oG�i��5Y1��/^U�����b�j�#
��f��&7���Wy�	�Pa��2)S�L]�ן&�E��r,���U�n-�(!=�ج�<��C$B���*���U��-ދ|m��F{�� ��2%$~3}�%E<�t{��t�
�5e]"y�	.iYq
�hIa����>��O��ۉ�I#��8�x�D���,�kC������-�vAup�C<�u�%R�)�@���ř���	��3�|�u
��Eʒ��;�z����񐣾8�̧>����#&C�B�#���y��3�һ��""Z��o�	�7������L��vom��a‰���s ��΄�{|2��G�k��?����e��e�3��k�������6�x�ZE@7����ȁ/���2a�xJ���;�yǷm.�f���%g/H��yz��2M"�O��
Wi�>���I
=�:���-mP��=_ۘ�b���7���
�2�����V9.�z��}Q����V���ꦠ!�hnP/�^��1AϢ`���
��NX샎�g���1T��e{�d��24'�>���f��m�ؑ�u�`��2j6$VCj�Y���)SP�+��GVmѾ���^��
�E�����N����u^۹�;�W��Gb�I$��_�stg�"�Lj���q
pPj���]2~ZG��%���ӎc$�A1�l�ipԑ�z���o@���9gX��fa	gR�='\Xx�>��/�c�yS��*��<�Q�І��>�:�M�VR���:�U�B���s�*��]'�*����M�f.��BIn����R�Bvvv&Ӆ�C),M8e(V.E�o�Ok��s4*�ZbSNoF<�t&t���d5b��g����x��PKE��T�{�P�`Apip/_vendor/pyparsing/core.py�kCG�(��_ё�9�l!��db<C0N��7�IfcF4R:����1���^��jI`;w�}����jUժ�U����ڽh�Iv�vo-����R}�nfiv�6.�|��Mg-�ϋx��N�Iң�?ei����x2�/ԋ�솿��dIWy�?��iY���]����'����<ɆP���/��3;���wY�&�U>�2I6��B{�]�J���0�������@��:7%�I2�`�e���~�k�Ag��x��Bf" �#A�M�dz�T�ߏ�ٰ��I�
\�L�VWE���8:ȡz7���Iz�޼��k��?�҉;y���8ߍ�W2����|�����p0̳qz9O��R�!�?ɀ�8��Ag��z���x���2y�oë�P�/�I\^���Esp��a2ͣ���]-,�~�<ы���&3�5��&I9�T�AYQ&G��
�?�����L*��,�DU��̠4�C^��
w~�8��q���2�w�h�j����{Q��?��xۋ.n�������,��+��a7z���x��ƣGtv>�N����y
+�J�iZ�0�(-���H.n�K��*��q�$Q>�p:.��
���D�K��_Tq���Ĵ-�lu��|\��H���_��4��(ΧIVň�h�N�2�TWЗ�u,uZ]jh�İ3��D�Ut
H���p-����p2q?T�I:M�@�(켄q`_{�4�c����f�I��^4J�ż��%>&փ�<�mX&�	�H��4b�C*����dQ��W�!����s !�U2�A�:j�W�+�a�׸�a�RZ�[4�'�6���&4(��,��������dyU^��.�=hp[�*�e+!���%K��o�;��^t����;G{�q����?���=�Z;��Ջ~�?���O'�8�yq�����h��?���x�������q��(�?|u������=������拗'���	�=yIM
��=�����v��?�?�g/z���>�;ѫ����ݟv��W?�zy�]x�_�x~���8�A��4�����98��v~�1Qw_����?�D?�<x��߃��|�Ǎ��'�ă���^�l�p�=���QA���?��#hq��=��q������Dܜ�<:ѕ�?��E;G�Lj��G/�D,�yI`��=��HǞ=;P�����ϳ���v�����][K�D���:�0H�q=��}��"z>��x.��ϯ�f-����UI/�?�dG	Жj0�n�zה�����A����3R�O3\�D�5��/�,��I�T��`0
3��v�Y<�`���<�:]�m�X��8�c���ҕV��P4,�\�G\+�H'iuq�y!T��>L�qC��������9wg�ĥlt����~�
����x2D{�z���:)�r��-��0Π1`����vfE
��FJ�;�Q�6��3<"�, �Џ>O�zt~.<���`'��9�D�a��Q8R�Q+�e9O�{_?f<�c�_R0��.���3DM�8�%P���E[4m[���y���A)uVf�K$8�S�eq��S�<�����(��魯)�xtB�F�,��KM�y���$�/G�C����7�Er�����\r��Y�l[NsR"�`(�s-@�cg;:���?ɇ��N7R<��~(���i
Z�3��`F�Z��Я�h��A�;]k/���i'�cƒY�j(F�}0�O���ր�P�F��3^����Ԛg�zd #��a�뵈n����&�Yu3x��fT/
%p7'�9���K6����֋J�+l]�up[��5p�����t&�U:�a�;�]�7!`�b~��Afߔ��'[Rr3`��/�j���и�w�e�aп�r�{�:��$�Sw��pRv���M�d���}w��	��rߚ��L����7[�1�=j�A��7���Ӵ$��դy���j�Bo�1�Kl�he�Edզ�H|-:���,2��t`p���i�]���(��T��^_�T��` ��{���i$?��A!MU�F �Sgc�|�]���-"�'����"�w�I����k�t�_�{�m��������1�Ӫ�� ��4hĞ�C���E����G� .�t��݆��L��@��ѓ'�:��ﵞ/���G���P�`��yQ���o
CآH������Y�KO�K��ץ_T�6�'�������`辭:Lb�bo�`�}����G����½>T�g!"�@�s�zN,�z!��M�Yy�ƣ�!7���ٹ��.��[6W�Y�̯<^�W��V|�W��Q�^�?���	�3�!F��[�r�ku���z3�/Pt��f��U
WSs"Y�ϻ}��t�ٮ��W�<v�^{���3��Y�,�j�s�
Z�V�N�z������y/�JG�V��z?��2�Ay��'������h۝�dA�(K�J'p
-��xy'��۸�e^R�xBe�Wy>ٲ�7,b|Ա�3Æ��j���`w4Ky=�E�z=���QLz=�Ur�7�8�'��<Z����������T[[���=��L��_�ݟ��I��:|v���uab���)������{۵D�p=�+���Yk�҅X?�@oW�n�ޱ��:lj�ܫD��oX$�p����Ȍ���o�zy�T�֫��9B	���Y���s�e���Z�^L��p1O'�h���8ܘ�%��Rl��S9��(t~��H+k���}�����S�0M����TI:P��~M�&�2�R)c�J�q�i* ���ڇ�����2����z�`?]#bG���<u4����ew������V
5I���P�t=ͅϸ��JE���H ��4X&�z�`c_��t�y�N4ZC�[�fO��gk��<?�]w;H��|8�QC��`���@����}�㐽>��œ^e�EGݏ�a��3�|�1��"Q�b
���"5+T��"��@f�}S�+\䣛�*�kp擴oc���/���/�|�Z�J��c�G������C8C[<,)!C|@E�f�N/&"A��Y�tȂT��2^]�!�
��UZ%�,&g@��p
t(��q:ʶ�F�Kk��x���h�&T{S�����)�!�(�q�p+�*�,!ɾ��K�5�mj^+Ŭ��1_`��AaU�š�FΔI<��,�	P�-�ܩ�kBZQ��ncԠs���8�w�
��Nu�����6.D�f��C�v�j�R#����o��#9u��n=:�=83�%*��&�j<:�h�|����y��<N��δ��iQq��Q%����Y�p^0������U:MT7�S��|<���/���?�;	�g����g{j:�;2�~:>�燨�$M�;/�N@��{'?��r���/'�����e�����}h�磝W���zVg���×�s����{`M"C~�{!����G]�d^����d6>��~�yDD��k�.������k��d�<#9���e��*��pUq�>�e*zJn�m�uk%ݍ�p�ޚGݢ���Y"�X��p��J�}�5׋8��˒HV�
\�FD0�9���i^Y�\
"���z��il����¡������2�K��&�OB��..�������W]Z}����b-���pR�i�s�4����9M̦���3a�8e�V���4$�F��Et�IV���n^������5��d�Ok=�K��x�CM,
�i��#R6�}���Nɸ�
9�[JS�S�
���UW����@?��J���|�߫�k�]M�
���vq)�2>4x�����e�{�\c�Hx�LG/�U<�"&P�$��'���B]ERx�8U��岳"�xE6&�������*��ٌE���^��P�?�M����Q����oh�6�[ڨAZ�F��s�R"eR�t�90M�jdD���A7_�j�QN����L�q�n`YO��%i��$7�y12�-c� �D�j��c����о�2G�}5����G�K�`Ǔ��p0�v0���9���"%K�S�\��ɍ�;ȡ��!55�֜U4-/a��A��גN
\�Dȣ�.t06d�֕�E�C�q�����Q�O��/�.P�a�39�Ft�~�O�z��#̭u�����d�L�
�A��R
P�uv�,V�Q�H$Rf{������{����J����>���]����M�z�$�u�E��X&�qN�!szҸ�H�����)t�u���}�E�W��n*�s��L�~���O���CX2Y�wc�z�!Lݲ2ji���>�J5x�7����o��Գa�䳐
׉^"ty�KC�ڛr˕9���]6��X7j��^�%��z)�3�3M}��Y�¹N�[Ó&}�aje��-K\�𡗁�s���+�-M�:
����%�fذ�9������|��`�-|���Y1��֋�\�\Z4�#��9�'����8��|�kZ�Q�;�KG~��8�k5泽�;?�~�q�do�٣c�촢����u�(��"'���M���XVjO&Ǵtv�L��L�gZ���V�?�sP�V���WB�����u
ۨ�%�HGd��h30b�.��.F�lk����5V%�5��EONv�J�T�\�<Ȇ�300��uO7�{�ό(o�N�S�����U��f��b�0��6�j��6��?��@����S�V�,ϯ��5'��D:�|Y2����܋k]E߈XU��yFg�J�<���[XR�Tދ�2�֔����`[�l����-뉌�8V,N=����3�J�T����g�����]Z���Š�"�����.�iF�a�l%���r�6[�6"��6O�#$'2�A�MY��p�E��E H�̀��?u��U	�n�RBI���p.�x����M��D�m�W?��*�bߴ�kA��j���on>z�x�Z���C�g�x�a�F<J�`��gUU���	F�?���ANܷ��vI -
ߣˎ�W�.|䢄�v��z�3�����ٚ'�"r
�<�ҙ�jzeG2pc��i
��f��|,O-���й��Z�W蠟�ӧ��/�/X�S�΂�bw�ǾS�p��	"�"o��φV{bW*R#�K�OA��7u�		4�I�!��[���"�ə…<�o��6���Wc�˼I��I|Q��¹�p�ƃ�'�㯛&�9� ���鄎7��������w�h�h��[�/hO*_֥ģ��i#i���w5T���=���2�gX��^4��7�HL�1 �"aW�lrA�*2!Χ�	��o��C�p�{ȡ�r9�O�ȉl޼ Wȑr9rI�Ϳ]|�6OG0��<��+U#Pu�[ou��W0PBloX�]N��5�n�bd ��2�…tj�)���+e�Ξ����8�
u��Fa��j�� ���Y.��aҖ�t�َf��X4v���5�t�A��ZRv��3�X�:3�{�(��b5�2+��k�lmr���R/��r��ku�vm�6Lw��٨cϞA�H̰����4�O�a�&�]�����~�T&���xm[{5J��@:�IT�l%�(J�:C����l���54��)\�c����t�8P�9��ֳ����n�u�!`7<�=�.�ӛ!
��~����K�����
�q�qm�:�yC^�=��M�k��﫿C��_n�=z��ׇΊ&��?�_m>��a�^�W_=��>���/��W_[W޽����x���<l��oa��9���E��㣆���P�9�Rn�^��;�����zt�u收�U�zd�F7�F&�sc��l	�0�)[INw�uJ֣_���"�G�ד�F����dr*�R��i�3�iW�"!�4DC`?P���$V���Ҥ�Xi��@2h������;�����^�&����OQV�+
zF��`L��]Z��pJ@�ط�폣���=h�S� ��$.W�a<C�o��v=����ܟk�Y������Ne��F�˓�� 4�������+�k�>����:|g�
��,.�MR�ƙQ(����%��������j	%����(�,"�}4���	�ͣ{�o���G�jE�#{�}��* B�ZX�E�P����I]Z�Y�l3�d�i���,�A�;t�X~&[�u��l?jr6�Ѳ�GJr'$N�1��{<m5��c�8
�M�\)WG��g��q�}t?:2���s�e��7�ݯ��?ğ�+��g�5�V��>�>0��
p�7���s�e4��ǤmO��T�"���.l�R�=:a��o��|^���N2er�����F���
<1���$�˘�R���� ���Q���禃��BA�X�gc�
�`�;���f��3Y̫ɰTdz��D`��QZN��E�\���l�!�qB'=�օ�*��(`gvO�w��*�!�A�3t�'�:`��t=Z��7Q���҃Q{/��FF�(�z�KP����^����w�b(�D��f�*.�6̪�&b����[o���kp�Ǜ�8SJ���޿��T���1mGxu�ŵ�t}��&pc���ӹ��5�r%#������7���;����F9c"���b��ǏhѠ:�N�:,���B��p<IvE"Ab���@��4AXg���b`�c���qƜCL&��{1������ԠbC�����2<=~zf~B��~���5Fa�8`���m���E�gg����x<ɯ���ah�\��
�)�h_�-Y�n�����54b{��M|�W���|��Q��Ӊ??t�����V��?5Gq����2
����������A/5O�hA�_d�g�L�Վ�U��u�����w����4��1��h$���1�i����d�'�xO1�ި�9Y_ߐ�%���pͶ��U^9�+Ex�Ԅl`Z���w4�0~�$A�Bg�]�o�E��3�8�����󲠁S�
��P*���p9�њNU�+�st{�I�RR��c\-����:&��7#ޫ��+3b����!�m�Ц��Mq�%�)m��!���r%���G{�6f_J`�ɬ��ƈِD蕍��m,���;XWZ�
5-ʎyQ����L���2��K�
�b�K���6|V�5ll����ͮ��3���:k'y�&�J�Q��$%�A��E������輝�J"�NR�P���&�sL>���m
6*���Bj��%��C��H;c�le�W+
�y,��1)�C�A�Y7�T�r��5(-����ؐ)��H�hq�]�R�Ns�������d��`��^AU��O34<󎟋d��
I*���9b��&%F<`~�i�#�c�H���S�������`����K����͜5����sc��N�.oS�'rd��Xa��\��T���X*C���|
=�K�����`�b��O�wZd�����ÇϞ�5�E������B��U�W�
L� �*��P��O-4�Vn���z���Y��8SGK=r�tէ�����o+
=�Qcy���ՠ�*g6���ύ�2Ҙ����
�ƨ��5T��%�_���f�ٝ����U�?���5�d�U2w����G�o���y1����e�T���j+��j���w`�&#��P����.!'�f�|�Uv���^턀õ����l��ʪ��P��h���&Y�1#��",�#������t����ꪛNͶ^�IL1�t�5
==�Џ�bD�Z���~���{�N�%wU���9C��|O��ի��|�P�޶��ճ��P�Ř�%���n�
vF#G���6��r�K}�tJ��#�ߧ6���>�J۟%��a^m2�>���<��M�qs�¼jG���Z��+�+NgL2�$΂ނ+Ϩ�8��w;.�q�?e��M"�8�⹹���%K8?w}���o�j|B|M�MW���H��m�c �c���c`ȋn�?`��Z��;�D����GǏ�߱);���}D.E�a��	���B��R�H+�~�d����ٷK�~�as��ۘ�aC��n�^�����DP%��K��[�<��ޭ�*�ll���Z/��hiw�F}���h#�hw�O��lbކ��f��p��b>C٨�:��K������M��池M뼤'�s?�I����m���e*�c��������XD�Gd(pK��l*(�2�@�a�	�]��*~#�Zn�R�8~v�K��!q�vH>_�kQ<���q��U�V�(āM�� �ڶ�U|_�Q�
�캺*��̕�k�([�,g9f?��+��
W[�n_��DӌE�S�ư��a�l�B�%�>ڠQ�(+����Zw�z��K|;v1� }v=�?�E�|�կ���2��5���IA"�G�*�M�x��\^ �d��Y��ͤ(��%��l�G,C�y��]��:xx7K�;Ipy����=�H�I��◜��-zb@�U�O��.f���,F-�uءn}��V�1ǟ�e�8W=V� �_�_�1�9�x2{�:��ӈ���5���t�pZ�z�A�Ó���Ý���\��?��f�8�G���޶[P�<��&`R�ϵ�c/?�ú�9L�BZv�Gc�?]�O�H#T�#&"$x,n���A5��}��2P$k��M��$5�2q�o%�5)���T��/�`�*X��;ГU�שN��I���!>�vTC@�����lOM�m0��{�%m����6��L�l��g�`��,�O4F��,ǔ('M6�)*�Z��f��策�ha�x!B�z�D}�{�D��ΚBK�CI��!(�
��	/�f�����޸�?�_q{ʭ�G�I��k&Ļ�
�fTum֡��^�׸t��='���n��o�i�Zl�4�6���\�sA��v�f3n���Ԥ��HvB�l�������+��Duq2`��]�jf��m%1'*Kb�j�~tX�H��=
�R��E7v�4Nj?6�Y<��o�#Kzi�ڒ_Z#�%�W��Q�)vԖ���b��
��b#�\�'�Gx���+���px�"�N<~��GP��K����z���!p[:��}
���ӝ;ќOIo�HkV�3��1w�/���ܚ�8}�	���QKm��Ӗ�T��zA�3��9�L�{��g�i'g�5=m�ݐ,ˮh�P��E�銇j�3ik�qI6E��kd�q5�Om1�<ݰLT,	�+��1gv'�\��%FZn[#o�HY�Z�A/�POԖ������gQ�z�eD��V�'�3�h�q�@X$�*��v�e�[��{�X$G�W���4��&t�tX�1�4���F�z�YW\�bҖ��0(�?��(��50���rC��&�e�!\�Q�B�!�a��"�_^�a�uB�Q�Q�Հ�ۑѡ���}��!9�D�{q���
D���.G�+eU�%�@�')1`����-�	��u�m�L�]�eR�5&��X8�!��C���u{��#SE؅H����9�6��%a(G%"%�^W�,1���f<�.�q�����6�q4���p��i�+(s �;�~}1x! d�.��g�m�G�l�t���	�$�?��	�>�<E�����7򨪯֩�T"��K� ���"�Ķ6S��Xjav�![Z풁!��Yj���Ѿ�߹���l�[��Q
\o�C8���m�L�u��jh�r�Yᒲ|5�&kX�f䙷�I,�󬦰�x5�����.A�r��yGl���	��10Խ�_��J��~W�n�p*CtQ{K�����{��f$y��D��'�ǁ.-�K� ༰��5�H�s���ʢ;gO�@���Zx�+N�'�*�+��
��Bڻ�9(��uٰZ<�T�O����r��E�(*��q-���u<�\�Oa� �I2e78�
�z�Y�>�F[L�MZ!4:�j\�$1�[��Q�Pp�����Dq��,��Ռm�e�\�΋7��)KRr�UMd�6�$�}"��p�c�>&#k񳣾��i���sv%Oe�w��P�����iC�e��Pk����
z��v�4�nO�F��;��M�������[fc�l{�Ě���Zh�E�҉�ZnS ŐQ�I~�~�99�c�v�L���w��虓����s�+y\���G_�TqC���fgtc��j�Gs�m�f�^m[Sγ*�@�l��_�<CgMnb�g$T�Y�tS��*:�4��3��l�w�Kxx~d{n��֞'���S.A����UwOlC���99�㷨���Xo���כ'O���Tf�J����b/��=x�Ĝ2��]$�
�4�qI)�^r0�T�+q�*s�D�M:��� �CW��E�+_���fƓ�r�J4o
>�s��!R�QB�)��(Ygr7RB<E�p�/���H;Ɵ��F��u�4��SNl��@Y���Kƭbx|�'�u,_lG����`yu����R?��D*aX�#�R�UL��b�D8 �1�h�;�t����^U�w8��ͮ���M#���Ž:��-O0�u/<�(_a����:�
XrJ����	e�:Bz5U��
E���f�R��8��]�D���Z_��eY*d,���8�'�km<�6n	���'�<�=iu���~	k/�
�A��d$�C�%u�����V�k��=ca���{%���2���s��+���D��J��ԉ�0�/�aߢ�"9B���JjK�P�oC�#t��+r�1Lz>�H�Ny>���f̷[vI�j��+M̓2�۱Y�p)K⑈O�w0��a<T�)(�����ё��LM4>bh؉Y����>�-�H�
	���6�8�~WZ��[��vh2r�cX�uY�<oL�Q"�n���a��\�C�@#�T��`lx��@]��(��Q��Rn
�%�h>3g�	��S��x�X��X�	Q:C���=4h��_����0:�8-��5{���L�`y��;ik�A�`Op����-,���%��1�y�B�$4�G>(0��gb�c�_<0³�dz�.w�/���z��*�@#�� |�|n��݂7Yv��I�V�>��}M��?v=a��x��<�B��!�Y`��׍�
i�A=���L&�8�l��2�~[�f�@Z�t��3Ë�H���62]�.~*����[��=����b�0#א0�x4�5�#����ɍ��׳P�O.�|xqD8�j�S�9fC�	����Nv̦��^}��O:����4�0|#v>�㙁�B�<XMж-}��H���.�G�&U@@?�i�iӚ!]_���!sˎEa1��_T$�xH,�(��y�Q$:%X�3(s>�ب��*k����&��J7t�ܮ�+t7��R���T�<�b8^�lE��nc��T+26�֢#i�ǨP��P���y�k�F@����;�h]�|z,��$;��(��<���v&6c��4'�92�Q��
;Uz��-�`l)�9�`a�
�#�ͅ� n�R�"KW�i�˿��#ȑ
�R��-%�
�ӏxa?�q��Q(�V�5w`c|5}���$��4�=�Q�I�w�?�lSj�p���"��PEJ�W�s�)k��8K��ӄtwV`}��Mt��T�X
ŏ�_C��dm`��6�v/��q6;��˔V��Y3��G=wQ�9u�վp}�i�3;Ө����U��ӧHST��v��v�����
k��H,��)���������m\`����4�ϔ/�tEP�b���F���yRg��*��
��b�	E"�%Da�TT#�`V�7��\�2%�N흺�t��-�Ƴ"8Q�"Q�$�0�D2�q�4���bi�6b��{A���DU�B�
���/ڑ�<�U���:0Dq(q�T�8�w��JXn�J6i�V��U}�xI��ݸ��ppg?e��:,P5|�=�f�Q���lW�s��0��ذCI��qA_.���P�f�_��RQ�����_�ndZ��-��?t�GN�ǚ֔3t[j)?�z�Z�� �>Gjcv�l��F��Yv���{�#�3��x�3�XJ:8�e����¤A�x�gjW�d��T�:\�]�~H2�����']{]2�Dݬ�^�,|	;F&�v
���vP�d�!�%����a��8��z׋��P=A�(��bK,l.Jf
��ܚ� �~:�	� �$���Y�9���b��SfM�8@�).��'��3���Dꞅ�#r|��]2{���]Q��f�i8��+En�l��D&'��S�m����s%0O�_�UNF��7=���_}3~��W��ͯ�o����ͯ�x��7i9u��a.���J!#'<P���}{�
���3�Ҏ������;o��)�U�3n��p��U��T�~� j��e���#
���/)t;���H�C�`=MӬc�lr��1�r7>��x*afei�f66l�0��σ�l�y/Y|��+�-�zFL�5�ʊ��R՟�gXm�4ZJb�v��*��K�����������tw)�Q�t�������Srgj�S
�A�l3�&Ӻ����J���nmE����V���"r�enV����)_Z�����7��d���#�.��.l��e�[�(K֎�pk������[���Yޥ�0���kR�.I��/�YC�D�>�{��	]9�}���#*%Υ�lصsb�)㏕�� ̅�\@B����M�.�İ�37����_�Gy~�3!��<�CÎ�
o4��d�@VmԻ��OK]%�k#�DŽ�,C�!��b�8��21���]]��&���IV�sX!%�7�o�[��jȘ&�n�
m
Ua3y�x�$���-2w\��0N�x���}�_��$�YB�4 �A�(��v��P�;JKT�@o���r�l�=�N�e���L5o��M���/����$�?s{/��Kh�i��A�w��}��ch���n2�[���0�37�J%���[ y�V��Rj���c���.Z�\��euqu"q�:%96�W%~���+�cU�	&���jQp�/����5^�.�=Lmcxy�fhNQ"c��o��T��M`KD�Vy/V5�qvtׅ��ML���2a��Z���д�K%{�=fP��B�c{�D�S5���赐��V�{T5#��7bVw�~�8�Y+�sKO�V�����-:%'@ M�:����=�� E����F��'.�-ّ�}�r�L���Di0ٶ@��”����%[�oY�Q�?�P�ff�Ts�$Zh�:K�xTQ����*�a4�
ZQ�7I���������uv|ju]8��5�}�����4��
D�]��Cl8�,�/P�<տ�xd��!�;�>g̀�;D���
e'��|��RBE�vTX��ਾL�A�n�I�E�,�>�9���E9=mc;�^t��v�������?V�3��
�^Đ�/�����?�O$l��cOC]�qZ݂u��`�.�<R�)@U��%T���A��Ԁ�+(ܤұ��m��jt^�6�啕55Aύ=�����NY�Vkz��_pb�IAM�DŽ��g�-bݱ`��s��,�\���S(
jO�I��w/�&o������R/=�f��<0�|�!V���}��p����<uSZ*���[x��ѵ�=�ݡ+��=�~�O'V���n��JԴ�P��D��h��$�����B%��Y^��stn���|��n���]$X4���[^�8���}��*���Aɬ��jЊ�?`�������[=M�v��W�����ж��!�w��F�}L�Z�W��Y�<"b�HR��͍�x���������H�ʓ�D�V����p��W	pu����d�EHa{�8�5�ZT����ig�M�p'��z�_��-����>L��ε���lA�B�VJ�3�M`ߤ���6�Ï ��&��X���_���m[X���[K�q��Ӣ��dt��]ЌgB�U�������hh+�m�m����p��WhH6��²�&tR]�c;�ʴ<�Ğ�=r��Q�;���*|#�a�M�bS�e���b�fD_NJ
(@,i�k�xpkJ:a|��.��^�/��;�ُ���Q��.;
��J��Q����ɨ�Ӊ2�"�'��8كA���@�:��<�����$�"�g?����u��r�]H�߄�ξ$ �\\�bq1rl��*��rU�[��<��ʉb cʮ�����iG�����1���^	�C`>�R�t��e��z��)��}�H� T
�[J6x?z�f�Y����6�"�z`��
EK\(�`+*�Sʒ�8z��r�jԡ]nO;�c�i��%�2�
DA�W�\��/Q{
ӥ� �+1%F [�2�������.�]6y5L�;��a*�B�3)�
�:�꺥;�C�N�0�W�w�,R��4sp~n���N��%�u��Eg�4���eoߦ�M��c6P6�x�%��@�vz�M�͘��,]*9����EwO�S�zޢ��d�@�q����-a-
$�G��k$J<���I�)��P��.�J��<ewd�%���{	):mS֥ғӭͳh(��Z߁&��v��u�y���֣�%|eZ��@��=ө(��:�
&�_z��	��@Tc$a2�0ZW��r��<{���j�0�b��=a�JO!)����f�64b��v�^?r^Y۾�x�5d9h���5k�m��i��W�����ͳ�z�ϲ5Y�N���]��eh�K9��$†�7.;����&�\�������ijx���aG�Ϣd�Mq�qr����J#�g�.k
�'����D�cqρWʒKvx!ђ��^=�۪��L0
:�:])��"����ۜc�p�t��C`�;{�FQl!˙�N��'AD�����dL
5�����2�3��@/�@����,�E
��@w�찇���-*�mu��;�/�k��{������`����1�Y�?�#�/h�ǹ���b�䡑[��Jj^|����u4�����#��5Yt�
I�m�O����3{�DԟqA�)@�/�9��H�>���b��s�?�4�,m��9��R����~����K�,����ω���(^������/�9����S���U�q��y��݄�Y:�E��=��
:�\���t�����Fi���9��'���`p�T(a����F� 2Ŋb���6�4$�3o;պ= v�<=#u�(y�A�*�*dK�ł�DU�N��R��fgt8Y@�r:�E+u���ǴE�!�l�<��r����:��-ܧ�j�
>��ɓ
�$J�s{�馆p;
��M��{��U����0h
IV�(oP�9r;�";?�姑�@U�ci�}��[��rM��{�T����%�Vv:rU�5�́Z}��=jW���V*��kn
y�,@DX��0������m�<��D���I�M��T����]|AN��:�E-4�<}��L�W�z���U_�V
`�L��e�L=�iG�BI0�ʍz��l��
m�5��C�<#�ʯ~�#����E��%ƛ�C�|>���F�V�b�������/��>B�_	�پ߆�0Vb>�Z8?W�t�靎}j[ϧiU���d���۩���iA;��p�d�M�N
 W�&�Qy���_�'�r��m��[��e>,�a�{�[;��M���k�QGp==2i�;Xs�{T�,Z~?�i�Y�%�v,�$�B>��$��a��;D�xN��IWN��ICN��H~93c�̭�-���33L!5��JJA�e���b�/��+�A%Q��)�o2
����冢���S��`u�Rc�T�z,tk(�
%o���I�RS��N꾣;%��5��:�~�&�n�=*�l`ya��g�����a:t��?~>$�	m`8�&��kr�)vՃ�vֱ�r��9�afa��u�ٰ2���^��4ifU^�e�D��}���&E.$���NG�9#��[��8���N��(�@V6%9Xi	���`�D5��C���f�"l��Qud�-�#zƭ�l�wF��^t�[�x���`c,{�}~NQJ0h�)^��Z��N�hT���J�W�yN�E��1��t�IC�C���G���&A�b��|�ނvq�#���),�`���eW�Tt�ۏC�rǞb����jc�3�D[�E�{�d�:AdB1Z�Jz,�������/&����C�F��ͯ��ˉ�c�4*n��i�2CC�|3��ຟ��^��2
ޢ����~�&Zs9���*ݭ]M	.���ď_Bň�d�u���;�M���W���ܒ
��k�����l/�r��8��UnN>�$?��j��[Z�˯��w���	��$�t4�K��#�eR�v���|�<оu����Y��`�6͡�g�Ο�5��,N9ֈ�R�"0aFF
=p�ԩ`�[��4��
����|�;*�3S�5Ϙ����q�/��G| #�n8n͖c9:�Ÿ!6�q:���f7��,��� C[�Hm�I#ʙg�3W�do<��4�6
q����̭*��+���T7/����ĉh�(�f�+�GP"�]�����	��RwО	XaeػC�B�ްԆ�`�Ol�hn�]
~*��0W6���PN�N,�Є���ᾙ#�$�P����:�F��G�n�}��Fk��!G�Q(���su������K�$O�^f�>[�c�����!I�hKgS1�u��/��)_�Wo�/��7+�p��H67;�>b,P����F��6���4]�C��4�#��~�q�͘r���Cv��o�LsT���hH����#nb�21H[��j��U!7HIl��q"���_S�p}��1��-��,����B��i�	��i�	��i�e/�Q��ےLE��hD�QIi�~2j�~LZU�1�UD��?ovc~�~��—,�ı�v�1�rt�T��0��j>��u�7�&��D��Ф�TI���^��r\�j���e��0Ef�W�G�S!���Pt+ԋa�ٟ)z͕�{��֞C�E {iRx顒���Vgg�?��l5gP��~�Xp;P�����ғ�)�����+�:��H��y���^�ɦ�>NP�t,�)�B�u�C������Z�3���9ե�*����<���pw"�$-7X��A"R
RE0t���ߔ�@�16�t�̀&X1Y�����2�2c��ڦp+nV��X���dϜ��l������/B��`n��5��F��6�d8*�Z�m]1j+�^�$�%�;�N�bZ�j�Z���NQ�;J��@e��{����"J�M[w����*���)/j"ו&���(~�;f�Q�@��kT�+�qD	����U�����E��84hU��~d��e6�[�*l+1g�v�~�"�-����]埕$f���R�%�5$ۮ�9�.�.�j�X��N����tj�O.d�Fg�BD�K�3�E)����Z�F�[�
��34��jn��yO���k�q[���m<IG�����'�o��F���Ry��un�ƣ�8��ӖR��w�dԉцY��)�����L��pn>�;�¿|P��d&����$��g�p1�#%YA
5���ߴL	�_�����2~�*,��;�� nyfE��Q"�Fk�Ycbky�dm�(�!��媌x�ZIi*���
�U���u�n��$/��H�N�UXQa��ʼn�5
ׂ٧�?��(|�'������vT�ꀕ��M�����VO/�m���V4�d��9�7M�xi�;���$��3����A�g_c�i���04�1�4�A1dϦ�n�zi{�sXh�έ�E�<d����IA��X���+u~�ιt��j$.�����d�u��c�952��LD���!����m���fŚ$V���K�?��U���\jR�z���&�nM�E��BM�@c�*�6������S(�B3��n,!A�@N��z��:��1cہ��JP��,��|SA�&�M��	/IQ�9�'�|����;٢Z�-���
�����h0��}$+�:�D�Bq��curi�pw�7�����r@hlb?��s�t4g��	�7��h��Di�W��c]��ݴ�YL����t��ɱ��eCTXc7�a���Y^J~��h�W�S�p^Gl��mw9��H�I����w�c-��<H�\D=[���U�t�K��$"���A˒��W�����>wc3ѧ�Hٝ�"����*�F�����"=l�#�#Ya7��\��A��-qy]�7v
%�m�0ƚ���%Q2տ)uI���a�o�L��P��	[��#�vCB&jʹﵹ�I�Q:���&��2kR>؊E�'�q?I�`���Hv0[
;���g�^'���\��T�h�����&�8�
�*�rl�I��4�u�Ȧ}��cMO��r�֮�w�6���S��q c1�gn��Tc��ZRj�&��V؍�kr���N�i�O2�BlǞB��U����Ͼ�:��>Ĝ+;׫IP�"���`��I�F�O*˓�)Q����.Oޒ��kTFi�H!^ޔ}�Iϛ�v�P?C�Y�4ۢ|�$2A��|2�f�b��q[����KO�GW��d�)���C:D&�+G�e�QzwP@��__���҅���]�=&f�I�������]�i]�O���V�K ��Y�_;���Ba��7X��\L���0�V��@5p���z��x�ǒ���(1�C�%Z��u�Q��q����j3Y�|T{
H	��h�Y]����[�sZ-_�>�Q�tc,~C��@�iZ�d`��t���i�K�~���~x>�U��M����ͯ�
a���ޥ��[�,Y���N�aᒭ-���[,���=��=���r�/�Sz�A�M-Zr��/��K�d#���UF
��W�}YK�v�\_���H�0�вM�~��b�G��X�獦q5��#5d��x�1�}�갅|Wa'a��G�M>�0g���h>��rc�j1��mЉ��
%^"�7!Y�E�V%�H\�k+Ali��osc6��؉M�"��Yd9F�G�W!��Wk.\�a�	g�J�&���X&���u�F!���%�- x�����O�m��+6�a��G����Q�h[Tl�E8�b_bqNp�ك�w���)ZI�OMf��7gb�?����rv.Z'+���W��5�V]Ӷu>��;����n�Bo�#�1{"$Q��9j�%^��Z"���a1�Ea�m�T�b�=%�k�E�u��1M��WΞ-y��A�Ce��_�9l��0j�߿<D���8������'��Qx�u�|/��Z~
3'	���W%.�TVe�;G�͍����kM�"7��sfe��z4Q�/��<�����@qId\+�ӂ>����+��R�%�ۃ}��]�g���-H��d�1a,���q񆳡��D=/�F�dE�r\y�OJQ�i�QPxP��^�'LA�~ ��f��B�j�T}�"rP��*�#��y�s�s�myl���9�ຍa'�<ٳ����@��-fJ��*�^�������,\)*%�Ơ��N�s04m��F��u�5��,	��b�p;�{���:��b+z���C��!@L�*�+�q���ωD��b1����oa+��5��kB}�tD}f��Xܵ<�p�u�Uui�J�>����"O��U`�'mY����:�lia��p-��؅�
���#��������/C��ֶ�R��e�w�X�y��L~d�t͗j�aj)����y4?��UU;���,0��(!��gT�|�$��"�6�Y�:����Q��T�Q8]��tOT��ǖ��U~��i�XR��"�Ϛ����\��ei)*��K5�C*�xɠ��Š�2"�����tu��B3����m��T�����jD���ZuX�����7R�d	�'dׄB�Rן�XmY�wWy��%���� ���z`��!M����#WRRKP�ʸR���pŖ�Ѭ���[�W&w�Uzy5��W*�j�E�l_$��(�T����ns��G��n��Mr��Z:�z>��b*[�w�fI��?|�J�!�\�̐�"
�*f@>PP{�����Յ��S27�Dc�|&���x#����:r's�9���g착�2��T�e����ܳ���/ض����!O�Q~[}�{k�y��(P��۶��-$0!ڶ���Ahbѐ&�]��1��N�ֵm%*��d$J�d�R�`��%%A�]�Z�?�E�	�G��F�zѯ��8�",�Խ8Z#Y�'k<ە���X�t���K�*���HeʟHN�-OU��r0��n7ʚ�`/U�{X�o�~W/�sa�tym��T<��|1�*��gL���P�V����iy.�%�����h�x���m�)=����k�����~�o�^�s�A2���<�c�e�6
��*�
.O@9L�?�"�<�[V"_�h���-�p^&q1�2��]@K)t_n�P^d��E}�v��b/���E0��rvŧY^'�w�ԳV�~L]y��S��:ϔ$[�x��҉cU�G)��S���F'���%dg|�Xd�d�8S�6�bzb	IK����ۤ�P��4WbB�r�a�Č#�8���=Vv�M+��*�B�Tk�C_����FuL-��NE�򰎯�,):x�h^48/�Y#��ӑm�pLm��[��+�Tz�S����tVaX�� �Ӣ'-���rL�o����{SD#N�-�ɍ!��d��Qw�]�]'�0OɈ�
<2��W?.h��!;�Ӗ��64�P����g����2]ֺJ�Ţ��:v���,���@�6\��d���OPP�~w������-�N�P��t���y'�ѳU����i�ya��d�V�=
����.�5�f��a�e+�G^���o�<�o;�:�v�89�k���5LwWS�1$�p!�_�p��@/zt�d:�NƨU,���4M|8��&��_	'.ppܽ!#)�2y.��F��NaP
4���b�O�㛒��1���4�a<�N����c�m�ͩ@j/r�K����4�,��e�1N�?e�C�����^��.t�{�(Ɗ����FK��9���
�av����|�H�x��}&7�$��U�K*0NT��������Ci�~�ݢ�8�?D{��~k�=G�q\&�Z�Vхy�+��&@��q!(��&(NnM�v�̙P��1O(��H9�@�Ϳ3`�?�C�[�1z܌�}���E�f���{��V��"g ao���ն���A�cG�Up�w(U���Da��b�;J�7yH�d��擉�%�l!Y&\q�JR��6�%Q�D*@�H�*s/z�$ċD5�h���(�`B\O�PW԰�*Ɔp�M9zT�h+��m�o����9܎6�\Znx{ą���mG�cj
�R*��\5� u�w��yF��=���φ �}��}��S��L}��3j�0BA�:���Er���N�:�;�W���o��7?�]�{ y�����qg,'C��ǬO*2ش�f��t��RX����6����Go�~��S�&$P�:��8G�
5��t��&��e��۔�I0NOv���lr�����Ž�������Z�!s[�=z��	�{��	tn��u�*���绌������3���z�A?
Q���
APX��Ҡ'A5���Hly�YQ��mU���!�!8�U���a��>��3�f�)Ǡ�$D���WK�i(\&.��P.bc���*s��;=sD�j������Ŝ�R�գ)ݙ#k��=���d������`�ǝ�c�D���+�79ǬQ�40R���<$��t�UӸ�'n�U���]���8<E���C��:D�
��:e��y��ʹ�LA�]��j�h���g��ew��P��Z礪���۠�j�*4��9�ךט�Q+K͘��<���ӳ�z>�ٵ_"?���:�Y��m�8�3�.͙9��RG���H�o�֣Mω�ohV
�m6�B�Oy�����Fce����w7w�1�-Yw������
�|`cYO�@�k��h�-k\eݘ؂���?�Z���Cc�!�Ze4�HTiDM��
,^��=���T�_2`:N��V�H�Kk#��U�D�Jd�^�q׊Y޾�zWOOq�m��d{����K,[���7�[�?��"��DZ��"OV�5�V����Cl[ɘ$-'�ZlbN"f�o)+��&��"��#.��%��Gō��T
�J9���O@j��&�L��F�G��b9$�I��~�[��^��ڊ��DE�Q@t�I�­�_�<���a��|U����=|��6�eNG��v��M;���������yg7Ϫ3S�)�n8�_k7�{��J��\	�[n�a��Z��QF+�E.hVyɱf�8v��q.�|j���}��_z�٣�TBgou䯷�U)4��[�QZ�g������o�H\�Y�0I��4�R��wy�j��%�D/@��P���)Nj��|i�N\A~�Q���oƅ�1���4�����
C�ԏz��.�G�ޟY�T��)�iJ�.]�'c\7F&qfG=S>hMV��By��c/���Օw5�Db|�,ۛ
���T����2����Y6��Y�d��1��~\�EG�
�d��2��~�O���1Q8}՞�ww�& 9��%�w�:˝#XY�'��1:�膀E�La�q�TL�#\P�R���"+��;P�bv�Zef������_S��X��b��D�%Ѧ��Z;'���;;'?��c��z�KS�*��s�v���z��F{+:=������Q�i�}�ai˿�-��L<�Q�6�|�s�iM풄։C��B�.��InN�p�
j���Sl��<�G�W�r�lJ���S!�e�"����>�X�_�CS΅��w��қu�Ѷ"+\�NO�ud�'~2B�	[S���K����_`T&kG��`o���n���@Wt
?��ƪJ�]�Y]��Z�?l!VP�z���a���W8`֤݉iy��YtµP���ı��d[�w/(�R�Ak,�=q��M��&�j`�8��{ʗ��	)�1�HM���tֱ�n[��3���TB[C��LC����b�G�v==R?ւ��a�m�0\�f��!*,KD�3jh�C�G!e�ƹM}‚Fw}���A@�^�KvH�Ω�D��sx�G�<m�3�|�S� �+թ���n�:L����e����O,]�;�xY(V�IO0�p�Ɔ�L*��^�d�G�P�o�-�4��
p�s�p�6�wV�SJ/�ԩ���<<���~�����հ���)*�E>���A�]��Qs����+(��'���J�f;#��9-y����8�כZ�&h1g�!3+��Q��)��1���r_v?2��:�u+�L�Pٹ�9SBY
hӂ�c�Mq1�
��g�����!ĥ=KW�R**ֱ�>��[���)�0IJ龧��|K�V��L���Y���i01Y�+�;X4x/Ƙ��7��+�K=б�T�,�Dt;��{6;�f�p�eg�	m#��#�\B�čwJ7%�,{��3a?��T�r>�����&*�q�e��(z�
�;6i�v]�0T�c�Hl\��#R����y4��GG�4��I+�O �e�Pe�hM�}�}�P�ǝ��J'^^�_Tq4"��tq�S�3 厽a�3Z2r�%Ȍ���Z�������I���]��щƔ8Z��\i<��7K��I}�tI����*���������j�F��`r��s�)�
�ϴA���*y�X���"��#�~�T�B,����9��ߗ%���G_}%�j��tF���1��t��	�W]���<J{h/�J�Җ�LI��"Ɇ7p�L/�	�1�6X�t��)Gi_)|E��
MMpఆ�3���tF�Ĺ��s̹N�<�sn�:�$t�-�����OY:�G	�e2"0��D;�s�E�������Wl��R����y�6���
�����_}��o�mQKz�$^���n�m��VV��x�V�����I<�Z�ԑѷ�Tv@p�d�J%ԋ䷰�N���X:�pc�ܓ���'z%�|݄AV�ݦ{�E.�w�S""<��������Y��;�X��|8i����_v��\4��4�W�-{����Q˷:�5c�*�1L�v�׺��ɰi!��aV�O0���nX��<�Ψɒ���uR8�UuN
�)+}��E梁N�[RK���m(k��a�g��e�i��)����`�)���ړ���O��Yqn�5��ڽ����=)C���WV5�6\z/�4��&k��!�_�۷͡�
gy���؊��3^����[�6X{
ak�7�5
�t���HI�*1�ʼ��Œ+�k����� MǺ��Fau8��V�,m�Z5���6"�u�4�p���<�6o�5d��]�ԥ��K8d&;���ӥ��x��K"&)�
�j�<�4cG��aq\,���[6#���p����5w� ˿��Xw�߻�����2~��ڬ2�;!����1�.�w�1e��=���1G�$�wM"?�e��jwh�뉂���Z����u/N8�T�d��T���n#I�Y�����M�����p^���a�h���k�rL~'F�j1Z��ef b2[Ai����g����dϴs@Q����fv���u\��ya�'"2�`6L�-�]'nÝ7lo=�\��?���"�'%\o�N�0k@岩0'��ME;�qS����iw�0��?b+�1�膹 ,�@�z}���?w�f�p�R!%}�4�Y�
X0�n����/(+,O�0PNw����m�3����)�)�3��Ny�1ݼ3
M(���7�v�lx��@؀i���dWWST���:rT(��-�G���3t)�o+�X�qx!��b�;�]01E�l���{�
������ڻ���E���Ӎ�V]��h��[%/wS��ӛ�����`,�@���aNH���v� e��7�248��G[�Hz���������Z���qyٍ�`e��Ђ��l�x��%|3 >C� �}�^�ꇌ_�<�v�[j
��k�/��~�Ej3!�T�w�GO�n����8�dK���aiy�8�-gz|�iuU��&a�U�u�{?��k��l�z7�m�;F#�6�Y�͆�>��}ճj:=�b�&i��V	(�;��`kv�v}'�Q`ϟ[���!�$%`*ci&��� ꐛ�I�7n�k"NI�IQ��VRr�T�DZ;}��ޱ|`�;;��By��p^I�����ˀoۛ��sf�ɪ��%-��v$�|�FGN��]3_�|+
-��Lh?���3*�xa��b�z�{��[�ij;(*���O3�_��@uC7���6�����mnR��<j�1A��ފ�ٛ�4`�1a[+17Y�V���(�9O-�U���C�-5K	�SZ(0�/3��wq#�!�Iz�����tt��%�h���UU�ʭ�G���Ϩ@?/.>~5���y�ǤO����-?Vl�7M)1�㤣4�ly�毯�`������*��Dy�\$���x�����K����Ia�_2H�9���\���ڦ啲؉�Q:'j������W��
��05�.g�E��(�0�ʍ�$�7��HjpJ	�O�#Y�#l��ťy�p%-6�!`��l>�U��h�>X?���у��N��{Pv����Dr�ۤO�k��c:[8->��/�����U~�>��a(�l�1N�:i��I{�.�r��ˢ\7��tT����7z_~������g�_�?t;�����E~��?~��_������u��dġ�d���x��k�χ;��/�Om\�7I\<}=z���:��¢���G���F~��	�D�x}`�dڵɕM�Gď���;�P�lG�Y_���jRV�O7ֿ=kw�`E A������<�|E�J���Z}�ͪ�jZ��ٽ�̄B�^�<�Y\���B;lf��H�9'������Ȁ�F*�Ci�\pr��5�1��x�
%G�zZ���$�Ȏ�~W�*����bf�8�S�s��ȠO�.�t�8�p��|�ĝ�_̟�9�����7.j�cҢvs rW�-ǭf]�b�4Z�M���|� ,�y�-}����Uh���c����-��	�`���	��n��n7v�������~�X�'�f�I�ͤq�p�O �:$��L�.�w@��Xs�t�
��/�m����&f��Qᕷ�;�&
��z����ͦ��@
fE䠺ѧEQƫ6a�#C���GP����!z	�R˱ܴ?��Hm���u}���,�l]��]�V2���;�BP���b��h�յ;��ix��"}�Pa�d�y
4�������s�6����w�tX�6u޵�7��-���~Z%Ӳ��AN� k��A�T��"3�cg�Fv�(dc�Po���Y��r~!8�=N�8
#��K�`s�L��
�/�:�)�"t���"�ۙ��#�q�Qc'֭�(�/��[g�{.�C!y�n4p��wq"]s��~��������R��֓כO_?z��x���2�����~����֔b�����,�ce�zr���|�~���ge){�3u��iO���GlA���r�C^	9\�3���12�ީ�Xq{B�,�E ��,�PڞP:v���ޟn��a}ŔO����w��XZ*�ju[�l�4?��,6ʁ���3�_Sҗe�J���2M+"� ��DɑW��q�!���=�V�'$��!I�L���g���Hʡi��'��h��QRNvN2]��7%�O1��k1�{�b�ǀ��x"�*���	�Z�ۣ�9	e{�rҊ�_K��㠍��V���!�{՝����M�:� ��$��L�tfnQ:-�<[�O�ږ5��ٞ�o䴊ۙ�l4�+
�(����L��:��h��r��&��������N��*޿�:�g���Ra������o��}#�:�1����8�W�c�7��;$��j[Aw�x���;	i;�I��h�N,w+*'�_�m��;�$y7��}A۳���־���vGZܓ�})�����n�]��n�1�W���VKm�VK����5
�����]�>;kz/c]P���tGUS�5��0kx����Ƥ������1����,�K�2������"�+*q�����c���#i��(�Yg����,4�r�C�n3�vo�����!G��������IǼ׈�ղ�Pq.�Pg.˩6z.�_��}F����dj��D6d��Ɯճ#�ڻ� 1ڍ�L���"4��G��4���ۄϞ�c)n"��m[���"o�h�:�Y���#e�ս��/��q%D:���gV�Yk�iLY]�`�kô��l��Ζ��jC�;�o���19r|.G��$a$��pXfь�悦�S?����k��=�X�����i�+{f�oF�eI10J�V�]��X��Ʃ��b��u��BK=�;F�9?R~��Z_�͍��J��Ԩ�����_i�xn>
.$w�y����Y1h;�d@=��]]�Gž��w�p��0;�����5�ӭ�eY�t��f8���A�3�h@�:�c��E��� ���R�^��c�������tp���b/�>{y�sp��=���?�-�\Ե�r��0�M�$�B�!�w�!��m�b=Pg��]� �е�2^^g���!�q��Mp{�4 �s6�>#��
ߪ?v��ս��`O{-���k8�]�0r�v�]D��'��j�[�P3I�ao���v��涼�FVI�-�m;�R�s���q�4�(u�����;S$%'Ь��k"ꖈ�t�]��B���߳~.�k�����?����Âl\�n�Gg�Z���,��迒Z�x�+��
�{4�n,&�Q�i�v���8�3�ך�@s�������f���Ӂ~�l�N4rK��$��]�tU�h,[[�I���m)8�h���9whx6�����R����Z�_>�|�"]�J],�[��M3n�J���mD�mˉ�|���m[I���իI��$۹���Ȏ���myd{�Ӳ��HPBDl�����u���y�S�}�@�r:=�e���R��v�W����F�֝�]حw�لwB������0����ʑ}�f�Dv��ϳw)^��C�c�c'f�A�*B���m�Ң��[0T[<3��s�y�\�T��<P��v�xC�c�1�f�ה�};�$N�
�Fgx�ON�1JD>LT���e�]抷� yL��zH�� V��2�s1�7B�Cw��?
��p�1�&�΄Y��vS����_$QL��q�`��I��}�D6����=���I1��q�+�w��z���Fog�~��J���w�s�7Ό� ?��"��2�0%
*|�t5�m���u�z�j5�0���2�Jf�T5�V���zN�*a�a��c�S�A��>Ze-�2P�Rt��.����N�p]#!���8���bgV�5z��q
"���aY�3Bs@�-��W%�BV½��9��Uu|<�x�[����ߴ�O�
@w|��:W��� P��t�@�p��n����Z.�D�}�았�h�̸:�MS�>��6�\+�fÇʌ̜h�yñ�}���
05�r#)�ȦkǮ
�\ r(��Lf������EضX4d��p�n�?).�
J�l(z�v�m�����>"s�8��	Sֳ9�^��b$��ɕ'��1t=����M]x������V�ڍZ�^����������>���gߺOsz���}:���zi�[[�[���c����_����>x�r��8G��}�u@���������<���������ׇ^S�;[[\�����z�_?�x��rS�������x~tp����h�:�C��7G
	?�{���t_p�O�{stP��KJ��͋'���~zX�ϯ�O+S�S��U�xL)�zpt8���7���H��-/��:��z�/�?/������7�������_*�^V6�������4�̲�$���� Z
�<�*[6�\w��Ҍ��NC�q��v�wL��vz�ͯUg>��{�i�J�$��j\�_!���d�����N��>2�4mfr���p�ݚ�O��dj��C�ت����Vd٪`�j{������ �ķ9�[�
�E�7{��%�.{�=�&������i��],f�V�!eF�	�'+l
����#Oȝ��1��(Wx�@鳌���2$9�jm�<�I�Dw�AƎ3�]�8��G��ӈj&eRnf���P�e[a��d�bb
�Pwa�ۧ�Y)���ab��W+�CE̞�xR���z½Fڳ��}]1��Ё�kX܊'�������,��9���c6US�������'���cWg��WHo�\�����f�C.S�6x|�����x
��� �y+�3'&r@Ql	v��n������Ku�ri�
��^8��޾|�����"�\�SB+L�HXé�1C#�6��F$Zh���u=�v쓷�YI���0c���m��>	�u�-w{�$q
2��(b�E~�D+�p@>X�l@�k��G��c��&�
$lN -6f��}��2���9�P��M�;m�´E�ԣ��N�h�__�[C��u��l�7�e��T]�v�*��(��xR����D)�����l��(���ܓ`�#cp�>���8��衸@9�P�zJ(�~��]qk���z�L�A;W�.鳿�n��qX��Mɤ$���R���~7N�
�ޏ��8f���n����r@̍W7ۘU�7;�Ne�ʮ��(1��j��D�u�4ס!9D�E����e��U��!�N<��f�&�[���qGna!z��]5Ď��E�J�ާ\��[]��7@���W+��R��X��P�U%��܉������d����	�s�[z�h(��ho�c���v��.OM��	������d:K.�wiFэ˘�W�7â�0RZ����⍒`�.��T"�Bv�A(0,)�{��
aƣYEb�Ei��Ȋw9���{k��T�
�ER�&�f�	}�����L�U
�w%�x�VDD948��<6���6��1��n��H��27��W;>p1��)7�}�-�;�W����Q���;�JZy�v<�C*v��k��~��҂�Ά})� -Z����X���^l�E���JJ�P���@��5i�
�������F�8�W��ԃwx��3��9i{|��M�� W�����<φX��L�ԼmR�+��V��S�	�5~���z�Z��?��>D}�*q֑�է=}���6���%���|�\\��i"���	(�2����cV˕��:\}i,O��
���o�݊���R�M�:hc�����ߨpu�Y�HK���?�V�f��V�Ǻ�Ϡ]1߲O~�M�A�$ϴ��\���	�[�he
���/I���e��Z�	�a����J���saP��x�Ĕ�����$#C$�:(?SH_2r7�һ���K��ӈ�����}�ȁ��k��iw�~
D#8�x`��[*���2��r7��]�6r�̙s���b�G������.�Y�֥pf�L�������,� ��k[W;��4�tsY*�71��^��6�+��f6W�.5����rN�XV|S7@[���;�>�YkH�a�5on�Z�7�c�ii�?8-�p��K��^��oh�6���1
�A��MOQX3�N�`�Fg�ЋK���Ԫ���[�gR�q#R��,!:%��@�.��J�������Ž�c`¿Q��9���ت	/�	͞uyB�޳�A�%�!���9��zj�4*hV��Iz�\��c��cۑ��'������MɳÚ�@l`ޅ{6�u�oՀ4W����
��f������h0%���J�05�;JΖ�M�Co9�⌢{"��r�F�I虨}P��+�Z�kvV�N�l9��4�6�]��t'�_f:����TYhu�Pn�sBNp��uL�v�h�n��ܣ����GU9>�Z��d�[	U����"^1���:�'ֹDlRӉ$!r�0ge�\��
���dqdֶ�6�=�'Q%�ڕ�nFi|'�U����a&#:�GV����%�
���(`��tXܰ�)+��`Q�]��^\��	�z�(\
K0v5�iJe��o`��Q��Q�%�P_ȸ���`R������M1��~��$�S:J
�W��!1���
\y�E�h��M�� ��S���,��5Hi
o��K&{��P�JTW�H=B"��9~G�_��(!ɬN:_��*idP=��g	q��}��#"�|��S4O#�]8Ζd/my��\T��QPH�3D<h�沼.)�����;=m�k�P>g���B�|]�M;_�^�u��+���>����%#�t�HΉ���]�间I'*��ʬ�o��~�o��H"��c)��JG����+>�)�s�mɀY��E
�U��nnׯȩ��R%�̭E/�"1��y���bf,:�f���x
w��
���p��O^փ�v�W~����lƮ`E�t���r�u�#|�(��FG\c^�� ��܋��I�L�qY�����Cr.�!pI��̩��gjvĬH�Mߔՙ��t��x<��#c�����~�d�ۭ�V�N+��+��u�1u;�[�b��0���T�%4��G��ohr��\Pv�}�`��LU�>��m�n�58\�僈�{���\�k_]����4�Ry��d�=<D:��8�Q�}4:�{豇�����$W����Ԯ����	������L��������*������r��H��&�R�����%oܸ���f���d��B�	��'$��M����s�����
M�
E�]��R!8 �c��d���2,U
_�r��U�����l��S1��JB?g��={j���>����* �0-=MJ=r���{�?B}�i�ǓlxY����<�l�-G���D
��S:�U�����60�ڻ�;f�8�@�Q�l"����t4�2d�%$��X���ů8�rA9�ݓ�T�y�d�|���y�|L:�.υo��>g0엁IMf?�#e��{�izn�+(NI90W�*��ӳQ�ta�/����"ײ$��b���Zz�a�C�P��+6�:#�<#��%�x�>��W�^4K�/:h�L ���G\�xF#�����a���7rF�䫝�7(O25J���'����荮�b�dS�u�I�a.v�r�*��G���¢�a�]Ƃ[Ư�{�s���2�m��KG�@R�S���t�o��%1)��X�&
ܨZ�s��CG#���2��@z𱛬���G�j��>�ј���-�Z��poD���DZe�H+��W�C{�	IP%2Ty��`3��2H��4O*�i.9j:���g1cm[��9W rav��gZ�l�.'�Xq^��er]�W��{{V��yd�Qv��3p�7�5*�'�kŐ-�g�D��
Ő�:�j�}���p2m�0P��X��A�'�K����oz+Uj�[S8R�wF�g�P��U�16!B	�%�k*-I�n��h9ų���/�&4�{f	#?
@�<ފvw����_<'U�Lη�HC��EHLx/j��Қ�üZq�u��1��bA�+u�i�j�~�w��*�͹�}������j�����d��nMr:�ƣ�S�ߨ�[[�D�J�~!��6�0�b���$���SOG���	yұދ�}�v0�|�a.�|hm�܏�l}��WuH��mH�9���;�C	�D�W1R�E%��J�����X�qmYk)rn��	ʤ������/��s9֣��2?�S6'.k�j�Pͮ��i����\�J)S☞���XB��S�ιJ�h���q�v�`hR��`���B�� /E�Ko�\�����{�[���e�����:c¹w�QN�í�$�Sf���MS�}��N��?*S�U��Ua;��,`���[��Z��u�6$�>K���	b#i@Z���s+[_RI�SB��F_5t2*'�i&q ��8�8l)���"��rB��F؛�W�C��T�F O6l���V���b(�hdp@�,�P���h�/1E�S[��iz~�@[莎9�"���k\�x�Y0���rTO�n{pBL�����FzT�3!	AS�М̲h�̩i�
�Rm3��\HGHi����r�uˌ'�%^��н�ɬ���*v��������у�����q@�.g���,,{'/8�b�2U�S�o3�m¦�M�0i�hO�
Mo�
���.p_ĜA��Q,�ip51��%�+��U�N��΂�Z�܈��r��~�����S��Nm��'�߉�&��K�C���X�t4k�-�G$��%� Ã�pNv�a���,|�5>	Q�>ۋ:juG�E%��u9�U *~�MєOn+��h3�0ߜ�P-�1�`��Ǣ���ԋ6ɭ� .��z�7����L[��t��||g�\��]��ecmK��Lg���^��A� :�Q�p�3�o+�ft�}���t��y��pg(�?�����IS
*]�'�� ��IbYвE���Ul��.�f6ޫYe��FaK��o����2Z�B�v��[�J��i�<t�fF�;WQ*�fSdF��D�4�Q���B���!۳�Lc-�"�`��C�f����S]c0^o,���x��w��G[|���8�}bu7�J:f!	O�L����P��~��5k�?��۔�A�m�Di�?�4�bEB�S ��W��ґ��:rhd�m�N>Cu���?%��;Ď�Iq�3k4Q垭��u��}�=&1�Ե�u�nY�
:�[��^u�oC��ɧ�,a�fn
VA��J
��ʹ���$h��>��U��c�8��_�����y�ڪ���1+�b~W��U��	~�j���Eu�����������r�����Qꂃxx���`]_��I`#�`w�\�)o�:���لB���9�Ɲ��7�������:x���軣����go��o�^>;��O��������v���x��Yc��?��DO�=�쯏�B��������w�":|��ZE�:�s=虁֙�k��Yt�~j8ϊ�΂?(m��v�~O���^�׾9�CY��h�ty�
�o~`�L���`��۲��'-�#	��qF�X5��m�B�
���2SXU�YSVI	����4�y�z��%��^���xc�=�����?F��KW��۾&��~��
ж��`�,g�ӴF�|x�e���E�[[�h{g+�KV�t�p�d��̹n��t�r^�qgK�Ӌ���l��9��Wm�ߧ�6�]�
�qN�F���o��kk��?(�m!im:uZ���@^�_��{j���z�i���;���;1v�9/~����?o��xh:�e�X�9������q�20�d��t��G�w#k�Ez�E�ҋܵwl���;c�C0ç�r�g�t�Ax|��y9��)
Ѓ��F��H�
}��m�M������X+'��!�A�^.�ք�Vl��Q�U����y�Mp�nOct���o�α�^����\vו��_X'��a��E�����q��S��NF�4�a�o�ҋ��uzߋ����a�<���$8����$��=�D`��d�t��A�"W�8�qq�H��i2����%����Hj$�4��:�8��j�g��fSw�{R���V�YFvVoĽ�� �ӗ(��2���t�L���9R�:U���	I�*�^�vj��tW��'��nz�A��L�9�4�G<�9��	OE�;;��%���A�����=邓�+�'I�{��b�|���o
d=Ea�~���\{�g�������:oNF㭰�V�|�28l*����,ҾHA���dA�f���C%0Z�L-�j�PI�n��KB��Z�j�-�W�
Bqd�*֟Z���)=r�A�!�rZj"��&�N�:�ಙ�0h/j���űw!9O���V�L*�	�¶�K�Ю�';}d	NF90��O����ш��r�����x��G���B/�B]|���{u�>eN�?2{�:�L�bb�M��	�X�(U�iKɑ���ք p����%=5����?�qs���5q0���^'���WyN?a�����Fܕ���k�#FU^�RR5��+�^d�9�?��Sy��u���^e1�K��`=�3���Ny�xe�Yc��_�+���q�"<�PW�W��P�Y
��!U��^!kd�.��j�²�s�'��� 7�z^L��ąô�[��7�e�@�8����)jꗟ˫��:թ�V���za#i�ô�+�����^�1����>N���xY+Ţ�g���PT��Oh�>A\��O�M�T}
=}�̇M��p�u���)�H�T!:z���wtiH��[TY<�̀���F�+=Z7�%
Sn���Q�1ι��V�}Ӑ3�>�Z�Ƈp@K;Iˋa��]�#��7�$VH)UCZ�H� ��H��	��2�e��
�r¾\a�h���@�ltdF�Т�׋�Qd�|��G���Ijǀ��J�<cԒ]4�i�`�M��DEi�f�@��)�� �
B�>���qaw
�+��t!�)~?�ְ7ڭ���� 4Ex�P�2�ELr/��6�a�W�F��L�S
:2^d�}Ɉd�N�ٶd��(�KM��O�L�=��K#݅��}�
C���ՍG����<+h‘�̲٦�_H�V�����!`��"[NF
�D��<"P�'�*&p!+�!�`da�】���J�*�E��ǐB���@mZ�8����٦�dGKY�,JJf�r��a�����>A�U�_��E�\�^��.�ƒ��
z�[��PF�'I>%�[fP����g�Jn�ʲ �K��JzY�
��MQD�n���Cp�h��yGe5�lQ�=�a���9[�F�b��t?��y�Z��ߡ���`��[F����1j�Ə[�&z���[.���=�|�{�q��/���i�/uRc�/��2,%:�آ�eh^;e����<��:���L��t�r��ñ�k�QˤT7?t�8U��������mw��W��7�ԛ��ݫ������"����s��5��+�u�����cc�7Ͷ.u+�����q˦�l�Ӌ���ô~�DRO��2���8�4����G*�l/ں���(�̰�8����,]4
�A������M�/w�_<[u�td'$^zMJg*}
��n�ߚ���L��<�C���ߡ��ӯ묤.frN��r(��أ׆��H6`\�c|���K����J�c*��M�,�Y���[����C2����F�؍D���ѷ�d�]r]Oße�e|��#�5�f���l.�OOM���P?춻П��1W��nF{��:BI�TOR���.��q�@L��C|4�Ύ��eUk�o.�'W��J���l	l4����p(d"`����g�HhˉE�.�IA7��Ƞ�EiB���D1RPI澱�:�t�1}0* g�Y2�����pJ�~⨽k|;F�"�0���:�g%�g�%(ˤE�ŋ�羧��ͦ�rqWg�A6ۣL]��h7�M6��RE���F�b,�I2�}֟3��C(�-�B+�r��
=���`U@��#z
07���<0q�,Jg�$Y(�=t�$�!#z��,�Ŭ�آ�6yj�m�XB��vj�Y���9]䠧�w�z߹���a1h[��d1�Y�ޒ�j�,2�.�5(���
��	�����W�[���cA��4�)�3��+�Ȧ9�Ω���2�/��2�SKN*L�|![{�-56����6�9˪@�b�D�<N��ͨ#�{0x�pz��/�C���x�t9U0L�"F;�D[T@��D��a@���A$Y�Υ8�jޕ�������z�����i�����xV��#���@P�8��T���t��h^��~�3�/z�LQ2��j��RR���CTZ]��XU�L�tf/�E�W��n��S8�Ci~�_��贶G��jN�|�Y,�'I�.�S������aj��{Ku�c������y�ίeg��t
{+E�;nth�U���5'TP
^c�&���ٔ��W;a�<�|���=�J��ı�r1��2\��5l��z���C!R��D���QFi�H�i��B����,�}\�?�f6|WlW���P>J@��<}�A�?�9/e[��Mm[+�!�(*�M�LF}S��i.�y"��G���m��4�E�L���o��3/|�L�g��0�����]����ZɀF�l;�
�G�@@�V�w���vJ��0���VEN�UX:*���eC�sv��¢�W�_v���;�,,@{C��9�cg�}�?R��c�������SךN^]�
�ϲl<Y��#t@�����ɨ��^�ݥ���-]l�
)�= qu=op2�y�}x��9vO*�^�BX�q���3�|񳮮7XH��P9r�Y���=���\j��P9|j8-oE]O�����d��I�7�0ýPw.R�� c��NP��%�=�U�j��7[V�5j/�	���h�x����'z
E�T/�掔mC���
�>�p�CSW�
)M^�
���V���X*9N����s2bI�!l�"�G��㯡@ï���l)r�ut���0�^H�D!�32X�g�i%�zU�g*|̖Z W#_{ܚ�X���;�'�������?n��촂j�)��V�[�P�B��N塥V���p5�n�~�-o�j|�s?�m����:����]]$�g�y��Q5l��.�����-5�$��evCyn�LHK�Ҕc������t�(���Z��X!�cGF
$۫(2:
��v3\�����}>OӲc�^�$��.���
c�?k���_�/�f��"F�d49,�5�r���5緭ɱjur�
}Rd=��T�G~7�ޑ�3��K䗝�U��.��|o���j�`�/��E�G�.��0�м��	��P��� 
&i��90۝�c���/�|�U\�^��쒋(�`�ڒ����������*�m���X#�T>���B�SQv�`���a�%*�}LmRح�|��Ѐ�I�9��+/6.��]@���_���!�������)����{QG�n�������)�<q./Z�=���x��GkR�X�*���j2w=��Ze8lD�J
<	0�:��y6��1|قc
���2V3�ֆ�[��\ΰ����iI��߮�R+�9��D�����V��w��n���:����< �3�mRs�����y0A�8�G+��*W��ƙ2��޼�5�{T1)�h�t�[�%@'=,3���4t��RE��H��V1���>�JϢ<�B/W�3���=P��_�R������ƭ�Haj:(��g�ݤH�䯀�s�`���C.g�Lǭn��n�)!��as�C�X�L�SwN��^c1��J�?b�x��.̒ɟ���Y��]��U�q��5+���=��<5]P&2��}��\��ߨ��Z�
t�X�C�'&Ȱ������bC�y.�n�.�6H#�xHYxQ�~��������3Y�Æ4[���Y@��l�
��,|�i�͗31��g��<~���:ك�k�r3hs�ea;�[&�}�y���8�Ĉ�{�$�_���������+��
���t*	���ߪ��ܔ�PN�<�5 �4��@�Y�\}\��ʤ���7�̷�qn��<AWes�̓E*a�'D�����P>�n�b6b��H��Rc[ib��(-��TOFW�)��쐾G� �JY���ȡ	$b(!O'*85]��0��ʻ���ߎ����Y����"�7tL[����lc=���n�0Ђ��F�'���d|�
E[(���Yrk��n�O�壱�i��!4�wY:���J�:/�P�-�[u;S��
��є�����?.h���Yj:#;�m|��]�)Ԃ�j�Ĵ0�u�{�߈�Ѐ�i]ث�FV�Q*��z���vk����oL�NO1]v�@�
����Z�Kh�w�H�,J&�.���t�Nb2�S�mz�������qzR�^Iy���$�d��J�iYS�E����=�r�8�a�p�����dB�P�B���.����U&n���>���LS����AkdgC	^Х��vk!(*�g8��t�>߼"8@Ȍ��0��J(z�9J��E�S:y~�,L-��ߗ��5��Q @k�Mj��'h���DkU��0�PVM��
t�e�h�_����;I�w�?xx��)�=@�=��nomonmmm����`F��W_~��M����@����V��"�>x�v��@˭V�Y�öw]U�H�����o��>�E8ƸHf�	w�A��8^v{P2Kv�)����31�u�"[<��=k�wVƱ�1�M��ϐP�*]�lP0��CY�ot�?�^�V�'m�=��_�Ѻ9���GP���#���=�d��d�J����f��:��
j�L_+
B�
\�F��Vb����,
.c
��n�׊;��MV��V�����{�}�z�Ab�����L1!���/m#����Mgx�u�M�<�y����o7��Dj��K�3�q�����Rg�S�Ƞ ˠ��c�<ī�t�:[�� �F�����G��	��!��%]�,0�S|j�)� ��Z�c����0�/��"�"H3A-�j��t6�,Gl���)��)y�*@C�tP�=$�p��M�.e�ph�̐��Φ cKI
�;Dd@���m	58��Z2���aE�KWD�ڛ�6���O8&r��	z��K`W8��B=Fcl��)ۯR'u3�jL	��vJ�lx1mYB�rb\B�vG�o�,�ZhƼX�����&�,gr��A�(eb*%2�?U�5��V�� �f� 
8��p�@?)x��qZػ��s8�;>��@L����h�}�C����|��o�V�p�ll��ަ�X_?vZ���qA�O�������iP+�u�H��0���PK��s��_=�B��{:đ�'�N���h����Оd�f�n���^�_|o���c8�+n\���W��<7!N,2��&7r���*�>�k�5�#_��F;��m�
�-�F`��4"��$�-��$�$�j��)��ޞ6֛q�+e��J<N��+ޮ@܇�b�4�l����	��w�!���)�'}��#k5�e#ˊ���F�Czٓ��qK>,����Τ�hEɸ����2��&&'b�'�E�ƳG�ܳ+ﴊ��zp,s�V�`k��Z�ڜ�D.���g�͋9d�y���t^�T߆�N�e��ʭ�/?o�1�t�w���[W��VO	d��X�`�w��Y��5[h	|o5�F�|P�~xU�
�Vt��~��Z���+��/ң�J�(N����W��X��NAcK�⦻"�*�W6��-
L,���h^	�o]%��(�����P�[�{e�����G{��5i�+\{
$����'i�!'1��
�Y�:�s��.U��Qa���Vu��1(�7�n��e����$R�OaVK.e$��8#��׵��������o�T
O�I�le����6��8Py�MBm�g�Z�E�T�9�a2J��R��z��ǹ�G[9h�p����h���G��@mn���q����a���o胁k��+��%��rT�
�4T���K5GUM-@��J���Clj��7��ۂ(\� �Z���?
KK��'���	�bp�!��S}P7���v��Á\ ��9o삎��t^��v�"�l�0ON͸�Bo�I`�1g�t2BqJ�`&L'���f�����vWD{�q�Ɣ����B�}����X��W1n^zV��VdE�IfA��Wq��籤�cr��R�>�"N�'���lЬ��
�D�7Կ�'g� ���)�'֐��@k\���,�ҰC�'�7ƁQ��9��`G�G��l/@4ݵ�Έs��w�W^i�E����4�I���Io�^} �C9즙]��Y�	}]�T�l�n|5b���#(�Ct����${���A�b�]F�)�떂�krvM�	p�H:�p��u�8����H�%E?��
k Q�G��Q
�M�a����-&͉D����J_�Ϫ�wt�ec>�f0+��%��ܳ�][��x�-�g���5U�$�׷��A:�8�x�ZE<uq�i�r����8UZ]k�\'R��ҍw�F�I>�*������P�4 K��$a~o�kǶ�6
����"/��)hDV��I��ڃI���|����J}�UT�Ò
���Q<����q�z9̰�� ta����B��Zc:SNu:�E�6]�c�u�Bw���@<9��	*W���N��u͂mа|�lH�xeX���2�,�4��g#�q��yJ1d��C�E'7�|�5{��,�/�.�[��<<�ZLv�H5Gy�Z]�>h�D�qG�;6���~�{k-\ӚrҔ{�C�	�Ø�Ԭl��V�g۹�Z��.�Βa�M�#���F�db_(�w���r�2�:�(��c��D�*�wi��j�l ��J�$��6��@���aX]�c	���;_��|�^Nf��
��?pC�/� q�E���W�����Y��/��?�e��_�Ј
<��Z���"ـe2���,�s��9��%��W2�	�xV�m�<ԗ�N-\䘭V�Ю1��ZV���V����ҸF7���#gk�q����O��l����M'�O�;��� �셠�PӖO��;;3�V�ʋ�<��ը��'a��S��ZG�����1���(�4f��ǂ
��5�R�O�ꘑ�D.&�=2Tx�!�PZ�l�>‚{#�؈�R�.�{(�g9��Sxm�5	ȳ`�$�B��;!L~[�V��a夂�s��U,c�@���
���'�Da�N�4���͢�&l�/1�Y�����h�Dz�`6�9���F?H�l+:�`�)4gh��
�|qEXx�~�'Ԇ�MM�x��,3��G���=p�V�[��`�
���tx��,���|{\�m(,�^;_e"�~a��%��Z��e�!�p6�JwM�	���h���	�$_��� "M�y�t�d��ZE��.2N��3�%2�`W�ւ�1�h���La��v�Zܱ����S	3
\�-��&(
�i��Vx�P�@�h�g�g6
��K��:0�E���^�<%i��\��U��3�W*X{����@�v�]�w��������]ۓŴ�v�(�"�Ν��!X���F/�_J��T8����#W�R�x*�SZ$����˩�)��/�<�6h(��w��5cF��K@
��XP.ݤ�W�_�7,�[�
��+�1��	l3��"�(T�m��K\�o��iE66�X��-z~R*�ՔX��"�����bݾ���JΛ`3CA�����5�H��"kr����cuύ�'I.�
vgr�����$�١�
�y�D(:@
a���{
GF�R�&�o]�
F҉)n�Ϛ&���Zu��tK�>�����g�i���Q��u;t]�~J�`�� ����2���qR�R&L�dnp�9K�x
��@#7U���c߁�p�I���m+���]����Ud�-�N�Q9��
��5S�!J�֠s0��19�F)��.����wզ
�xJפz�P�V��y�����|��2;��e�<�J&���3����:M��(����^{���+�E�~���[#������ʤ�j0_]%���דѸ�`�d=Qq]�[���?���Z��>>�k�=��i�᪭�Ӝ�����
��O=Y�+�+!=2CP2M�V�+��p�傷����*0؂q秨;dms=z�vS3�<����o��(�͘�� ��r�>�G�-��'J��5����R��֗��tJ���M���,�>)5���Ï������x������GJ�*�c��1;�'k:�oD�tO��*���@rV�O-1�gy�_G�V����Xo�Vs7b{SכB���(�R0,Im�2Eo&�Y_�b�T�}���>�v��������*΋Nð�2Q�Y�t�Jf��ƕB��]�h���o�=�B�=5�w�������Q���ѣ���k���
�7���!�sT��w)�Z֛�H�3^�+ ��[�t�h�4�n��֪����pڪb"~�A�n�f�.���sƖ�pJH�����6�Q9݊����6o���K���бQ2
��	!Cc���h�=j�0�,�������Lu@�"ä�9��2C�Q��l�!4f�>n�:U������u��@<�V.�=#�<05���
��/Q\*�OlS&�$��L�̬�V:���v<���Lm��;VC����4�Q��}��6�ga^�}���`��v1���}]��mr�ڶ��6�p��	�����ҁdV�6j���h	�%����_ꩲ�f�P2�$5z���oO;�X��F�c�J~��lm����K��7+�]!,�4e�'2!��Z��t�‚^I9�Q�Z�Q.΂)
�~��h��G�nYs��\+*�&���Aj����:
��'�|k��>hM˪��K6��S��塦�*+�Z}]G��$c�&�B���-|�9&i+p��n�7#��k�G�H$W�^ʕ�	�]M��-D��q���$A���gl%1&�x�~�{���Ӊ�V���cJ��	ooҺ]ԧe�x¦=�UJ6�b���c!^UWF-�w,�V�#)�1̈�+�R����_��/�0F�X�ќ�:�-��`1�e` ���:ƙ4vzX/F��ϗdG4��A�qG�fO��d����"��9�]]l��:��V!k� �p��A	$^
g���(��
�+F.È���ﱽ������>�E1�^n�k[�Q9&��;��zk�>��v�ҩl�-5��oϪ!�=��뎼f��0,���!I�5~USd�):����I�$3�S'�s��Hgp1�H�O��A�@4Lg=���t�X�6����hdEOST=������~t�(b�ĶG"��:��Q����[�߻cPG��}�	eDk�%����>�P�XœJ�a6YNgJ� G,j5��r+�"���"�qd�V�-r�8�����2.	y`�O�y��
>��E��C�Q�p�'��c�\	P�qC�j�93�'��F��3�5&��j�߉x�\d�l
�aD-6J.%��<�.-�꒘E������O�J��d2�A��	K<O���x��b�nm�*X��>��=.�W7 ���h÷�v/2�f�/Y�t��Z�d��t[UЋ@%6���;�����]��Rv�j��Fo1U�~�i�ϟ�ݻ��P7w�qT}1�C&ӎ_��ߔ��h�r�;%jF+���xY�];:�U�j%�ѯ�s�ݓ?���ox�Z����'$uџh���&��li}�|l����J�d���~�Vx}�_�
���`�0���v��=�^#?���C
m�i��-^����5�8C7u�}�R�U`�9A��*�\0
����#���� .��yBF5M�M����;�8Ϧ���&�:�l��ea@���1��.-l����5j�q�uFX=���C�6���}�ϰ�E:���h��FqP*�.��J��jAhqԃŮW���K�Nv�\a�������@�d�J68���lq�(�M��tbV�wE	>���2'�c�%�aod�}u<�+����v5�W#�G��1�R��W�tdL��٬@��؊"i���5#����¾�᢮��(���f�-����C���8B��}"#�����[#�H��Ns�_٠�q>��t���=41�!F�Ƒx�z��5��I�,��ԃߠ�qJ@x���3����<�%�s�EŴ�?RA�Vt� n�
����e�s���+�TI����I?��J"�6��F6Wm钆��}|�$>�>+MXG�x(v�U����y	[�;bR1)�au�����	�f�Z��8���e�`?�6ǣ��Ԏ������&��f=�%a
�^93ʵ�r!*I��7Z���˳rg6��7�����G褲�5+
�hU������P�*9�"��1�)��#�d���>S'g��smƠ���ҐA�-]�O&ɨ�w�#]"i(�BP�����_�b �d��0�Dq�#E<��SB?��=�n�H�a>��	0�u��@^�-$׬d��حn�GP���w�"�� i����q\J�SZe�|��W�^�Q��K&��K�%��),��.h���7�u��S�$[�>�F�Z�UR����+p��\�~,�d���&c���q�Z���z�T��PԮ.΍�^�9�$�������������>?z����-�`D�h��?^N
�X=2W%�w�g��t#�yglQ��:w��~~n�%�o��g\6��=������x�[����}��fMْ}��"���*����a��y��%��Բ���_d��N��Gߺo���*�Gp�W���A�	���c=���{2�ݿ��SJ=i����������+Z
I�����7UA�zP�U�o�����B��?����Fk����
8���8�TH"�2�$BF�b��w����5`���x�ߝ�&�J�Ї��`6*��אR`�U�|�_.�Nfrq
�ǯ�$��wI1�Ax�{���଀mp��z{|�y���{��N�QK��	\2�xO���(V{s7Z��:�>���}��G�'��(9O�w���[�v��/'�[�_ś��oO�V�`x���a����
��z߂
��9,S��pQ�j��o����`�?)��:c�!�G�<Q
� ֋l�t��;��Mu �=�g�(z��]�uY��$y�-�Γ��
�hn�3�#봎E����dHDΗ�3K΁��ro���~pj����.	��t��+r,�S�M1r�iVg��dΗ�I\`�H	��13ok�m�i1	7�8jHTUD��<Ϯ���-�P�q��ъ�-'��ա�R�]��
n{�I#Q ��Eq�>��˯Z���O&e|6���/R8?��l���X,�]���)���[������u�V��0��IV0x��i�	Z�pi�n�c�a01$�z,�����b�Q��b�Xw4�eR�tӔ��Q/f����x�q4�XA�F"fQG������8�[�}�aCK�^$����}[�ӁR��l#�&!<0D$��.�K	��ol�*n
CĨ���v�� ^䀳t,S��ِbֵs�m�փ�v걧��H��Jg�3���r1�QF��͟eTjLþi�5�猢IJˍ.��&i���rsq����4����_9�+�N�=ߍ�6W�]�̫LKHe����9�	�+�ijr�@$��}�Tw[x��a�t8N.V7��|���7��%מF��G��T_��?Ih֡O��Vݍ�7��
������f��kL�Y��ES��vXE��$Ew�W<ҁ!�ee�H^
��	7���娤�h7�E(l*@ZƆ�@4h!3q�������N�.�L�z3d6����!qX�n+{U�1t��XK�۟�t�! a�&�Np��:�\Y����~~'�e�@gK�Մ)�ڊ�����(��o����hkm�N6?t���i��C����rtߪ[9��0H��i}��ǰ�ȒB��u�t1I���F��k���ϲ+u_��AE/s�!�"��`�L������t
�Hѓ�O"��Y~Y�ϲj�i2��`�|ы�?���c��C4�������=dÈ����'����w�>ǯ��}��ãW���'��(�iA��\��8:�b�1�>�b�Sž�b_3"�+(��������)R5\E3M�ɀ�$��T�WÂ<O�r�T��b&JoD��2.r�6�#T����B�<�sm�(����%Z�o���f�ϐ�@�h�1���`�);n�&f&<��Y���1��3��VY��L�Z�h4@0h�Ǹ������%H���I�:)�h��ػ�
y(��꫻�����Zg�rU|�����3:��`f�?���������Zogo�oO>��V��޾�7�O>����n�{�.ۭ����a�G�}S�����Z�jS�m�U@=ZEj��jj�0��U�~�����9n����/�#To�#c���Z�>�1��+��J��q,�U_��&̬l�:�d��	��>��įc�:�c4�́�r�ۘ�l�9���_`�;*��4���_�M�ɞ�8���3V���d�88q�d�
%��Q	FwThJ��y����{�y�aR�Q]�Q!���gA�����}�z#b�+��!*����r�C�̈��
I�A\����d�
�K�d@WU*
l���L��Y��xiJd�����KYC���$I��JԓF�I�H������Tim�����F3y�n��\�PKE��T�6 t�
?##pip/_vendor/pyparsing/exceptions.py�Ym�����_��iK�i�X��
7H�:F� �jE�$��%�����wf�\.%�|N�zt�����33�L|HEm�J��O&yYW�0%�'��ݣ�׹�N&U�,nL^�v&��)+r)쯬�,����Z$�(ؖ�*Q\n���<�2ё��5Wv\��n&�IZp�٫NП+��dׄ� ���\Χ�=?��_��o����^�E���b���#��IxQ�lJ͖w�!�&v{#��.HnaEG�R@V�8��:/D��{�F�?b���t��S�8��ހ��������=RkXЛ�٭�΋���f��&/�uvN���F(X_r�
f�$r�`�,-AMjg��<dՆ���`z]�k!jx�uK�-G֚��s��
׆,\i��A�3�aI���$IH#��E�����-��CE�.X.
���-5Hl]6���NjK�w�^W�n�(D��Z-v�c [��
���rM���n�.I��9�I�t�_�&�'i�	���)�}�qz���-:|��x�)2��3�E��fWe�P�C]�\�����j�[�{Z�����0S1ï!ƥ��R�t*�f�%�V(0Φb��k���\G�zb�$(��_�0��x�EF�z�@h-��9L�G
�Ñ�ҋ~p���o���cY��B+�ee�4�A��t
�3�Ԉ{�mA���}@Z��|�3����+��R�{�X&�Ma�0��
Y����J$U�y�t��@�z��$��m$�d���b,P��M�퓣E��G�"�=�SV�b���</P}���&���kN��{�[@v�������~�Q�=�J�A>CJ�����������Gl��Gk'Ù����{��r�k��ƶ0��KI&>�X{�b��Zb����(�6
MV�en��)��������� >�����
���׵�n�Q�ѩ�CF� �6��G��~	b�
?-��OAL9DŽ��$W'	Z!I���(Q�;J�B����#�zG��RBFÐ�$W�80A␨$�%��WHBR_�dE�|�6t!&Wز����Ձ��K���\�_M�'�d�We�I�yA�
���	�Ѿ�Q-��бFDiwZ^TŤ����4ߕu����^W/y��	�d�h.q�c��2F����H��<�žbt�U���$�Z�\�v��b�;O�n������	���*k
�l��v+�Ib�2��[h]�R"h�c 9�d��Tp�S����)Xz�zʳ^L|�PP����
tq/׽ǹݡ}�c�`5[��X�],^��\+��'>rB~c�{ĿV�a�+֨�?��L8^���!q�Fs�ֆ:�=+]Ѧ!]�C�Y
Q_"W��eP�����1~S�f;~���zHo%�cQ���
rY�ݬ�PB���*��o�
����P��A�)�V���;MaZ-*�.�dW�-0����KOH��(��*������Cz����;�U/*��g�fV�$��%o���P�6��b��wj����W�-5�CG=��>n�|�l�/��Ԗ�HQS52k�۩}��(�N6��VcQA�/I)��4@B)���2Î���X
��z�iE��;�h1�S�l��]��⭪�:<?&~:�ud���������.��N�_��}e��X	�ء4T����
ᷗ�X&ߞG^�
bS��

�h�B����OXN�?/��ۍ�c�[�{jo��F�#1�l8�s�š�@���;��L��L�v=f{�G�K�%{�;��ep�g����u8}��qܶ���mn�M�� Z��n6zZ�9��aw�C��r]�0�K��I�Q�&k8�;:��`{�GI������-�-}b8�C�H]ϣ�Α��ݢ˅��jh��#u�-��l@.:t�nS�Z�C��[��o�eם���y���n����?ty��[,�U�7�u�B�O��C��`�Q��̂�m�ۆy��5������I�B�հ����UE��w6*�&����C�B���_�Cq�*����y�ϞD]�;{~�e�o\b�ۼ�ē�ueĂ���|++�n��z�G.Ӣɜ�1�
��z��E�A�IA�O��;�TrD���ow��!��U� ��JC��
H9��Hd�M��E1�
6*_������-�
�����po�m���O���P�|��j_���t�>�XU:x��1��M�i��]uk� jl�����
-���^��Z���Z���Wl+L�3m ��jD�ǔ��A�J�v�ȏo�ZWZ �E�%{��Z�U�Sb<���%��OþCL# Z�0�/��W����,}`������Ы�e����0[
/���lA!�V�s`��
D���K�:���y@�(
�����բ-N:�:B*�2��=��"˼�ڱ�O��v�+7��c�7#;Q��Q�X��b���5#�kK[E���S�\U��,@�mZ=����Á��S���Fc�lAt��=�)[7�;EW
�BX��n�+l߂�Ϟ�,N��Ŋ�g�3��:�Fo��a��1A�;)$j�?4`�OȮ��6��y�iZ���Ft��Ư��Ha?�17�[(� \�T?��Pk=��"�@��$��X�)2*����T'������$h@Hw8\���#H��q�vW�;���=�\�z5���[�=�%�=x��x�]���{�{�ѵ�'M5@�q���PKE��T�*,٘ pip/_vendor/pyparsing/helpers.py�}�w�8���+0��i�r����U,ϳww�e�\��ٷ���$�fL����N���>IJ��zv�ޝ~�%(
��B�
|"nd��e5\�{�bY�����P�uZ��҅����2ͯ{�yY,�P��8���u��iQJ�hG���43�'U�T7ϳ��e�d5M�2.��I~-��MRV�^�IΊI�i|�h&�b&�t��rgiU�=�eY��/yZ�U]�;"˳L.`T��D
��c�;-�4�#1)���d��G�4)��.k�d)�S�V���v�_�e�]\�I�A�X!�w��c��
��g������%�@"�bN$�U�TbO�7��)u��*�+���t��T�I�I>�*1Mr�r�|&ȡ��a,��*T�d*�Kb�ƺI���Hj^|�e��fJ�b����JM��\ɫ+�0��X�r5��r(^�	����*Q�tu�-y$���� ຸ�@����KY��h�@���3�u�?�.�o|�U��4[���9��w)L٦���	�
�]�T�%͠�
{T�����:��q�Jngq�����n�mG
�ٗd���h�?���E9�ly�TQ4\"g�L�0H��d2�N�H<A���'I ��	��N��[���/�jQE~:���NNF���/F/_���l�~��V�O�@�X(ɧ2�1�y�a��hd����7d�VI��x��"�k��I�W,�..��H��}9��|��	��ƀ���\��~�d3,�(������y�����`�E8�.Ɓ�]I��Qc��yQ��wC���R7�@N"b[x��zv$l-�V���$[ɳ�,�0�j�0�D�k�@�R���� 2M���X�~�/[�u��D�Gc�5�����o+PU�����1��+΢���_��.�[_�vj�
�a���Ĵf��x��a$�@Y�9�tȬ�Dvi��h�n�#U>-V9VL�2Y���[l̍�Tb~�Ԫ--�ү��1M�k�(�4����؊Q�P�/�
���Ɍ����E��ͤ����܁��,�e2C
��2ˠ���'_ۦZ��d���L�(�_i(�Ɗ@���1f��G�@�P:3ݤ��T*=���t���@���n�U6�Z��G�}���˲���H���3�����-
�(���΄��#atk�Y�҂|�������)!�p���g��7i�����Of�4��`�ArS���C؛�(&[(ڏ����ϫ��L���,YLf��G�ZX_<���(z�f�]6iw��ě��$��Ye�+Ai�2V*�B�q"�s�����K�1�(�	�C�-
 6\����,s `�P
י��1�H�g8#�X1Q�B��,� ���]�/Ьp�Tt�F��� C��.4
܁�#�N'
��o/И�?��p`,K��4��K�<ܙ��Sp�G88�?�tL=����+#�#�Ӿo��@gj�7��Hl�☵���(� ��δꉉC���"v��ȳb
��´ϐȰ�L���Xdʼn��͕��u�X�`�9C���(��aU�v�t+�R�G�iVv�>t?�6�&����c(F�E|��ui�����΍����f������4'`����VȺ`�y���D�Q�uf��Z�0�0<׶u�P���FH� >�Ū�~�a�<�>���B=�HΗrZgkUo&�c���ԪV�f�G�И9� �ά(nQ�� ��\���G��|(pi@AKS�Ӳ�=f1�*	,:�g�EM]k���`��#�	�����\��`t�n��TtE��&�J���آ�CT�,H�B�v��r�����)u�j�Z]�f���z���)�FW
"�Y3/��v�:o���D��-^Ty2��4rE��&��\���7橕e��1P�[(��o���K�yt������J9��V�k�0��/��I�|��ht���׊�j�Y�5�bc۵�R�`5;�.�EE�0/I��7��ҕ"8�
1��!��-M��%%D��692Y��%%Cx9����D�6G�<�����x�}��E�@���;����
�&I��0�,�\Ac=�
a�0ACk�P�#\�΋��0"��3n��93�@̓
T����Z1x%���O�^�?�];#��hy�}�Jr��Z�ʄ^6,E�����|V���9]
\4�ѡ�@��@�n1�� 
���9��V�F9d^���c�K�ª3�iR��O�A�<�����f�Uŷr}"����~c����A�o�tzk�1�%H�%:|`{Tm@(�w%��]���'���_�8ίeU�ܫ�+���S�$�:��y�N��H��=Li�9��)F��\=J�k���|�#�tE:x�	qq>� pM(a�r	�$���v��7��GR4���v�I�G���^5�5
|��:�kt��z��U�B������*2��0��G*`�/�_�u8�k�C�t�D�s%��'@��{�C
C�P��ˍa�2wƦO��8WW��w��LS���I��M%��E�%�]3D�ÄO-�*<���z�9[d���f��ƭ3a��"��ܼWS��6l`�v��ٻf�X��f�xҐ���l�(>k�g��W
47���.��2.p���
��1��Ac8>�ω�P+7�u�Yv�=��xp�����^�I�VE�m��� �KE
GM�H���=���P�����3qz4>9�����ֿ��qIqq�?E����A0㉚):|�ET鈊�S�X7����tN�;�À�x�j�+��Y���aU�s����s�g�4F�/���c���3vPD���B�l��c|`#�TQk�$��I�' ��(h+Tt�M�v�_*	|bzS��ܶG�eK�2�`൅��e6>�O���R����X(�O�a$��j	�Үq�8�]u[5ۘjC@��+4GC��.�I�
�NO����<�2?�q�k(����0�}��(oGu3�5�t֋I����&�lh{qi�u�YQov�>+���%;m�g]0�)�	�Lb��y~G��9��;_�WIg�u�����j���Y����X�1h�6|S�"Ի�'PN��:"�8C�5XC��l%��tFH��E�Y,���n�O
�J�Q+9Xdl�7�@Ј�'<|Pa�F�Ԥ™���E�Y���@��@�^ �S+.nR��#� Pm�~
o�t�"_=�H}w��i�L�S	���mh�r8�˨��!^�����Q?�VvA~B���U'`�ܶ�k�*���yg��X^�u�j�Ĭ۝��1���fS�0,�+�+r���r��7oߟ�8�p�JT�O���u���"t�mg#�y�qk7��##��H}������ňt2���47F��X:�ѱ��>4b�T�@n�xs7�'�L�,>N�f�`����3#�\	esT��2{�M8���I������lj�!>k�"j[�� �k�r*�$T��k�T�v��g�%x��BS�\�Aޡ;J> &��Xt���ȟ�uy#ɒ�Ղ{�	���¯aVܡ�Ѽ���{�C�n�*��V~����:�u/�mڳ+���%…,Q�d�b��'0� ��b�G���d�f����`�f`���@�*Pa^�袴@\�-
[6�Ƶb9� �r=�ܦ��A�N��9��[\ڰ	KASH(~����s�5�b�Uך�\ɍ��[ŧ��$�
"�9�R�|PV�Y�X]�n_B����?�]���
�+��RC��X-��c]�
,Kڜ�
3�D��S�T�`Q%�hh��{�U>�W�+��O:L���D~�C�����A�Z~�FD���#'<�t$�"�w���?|�9�B1_�$x���r�L,�*	�.���x������������}Uf��n�`D��4����]�k���>����%�k��1�w\���15�8�>�wC�n���@��K?�Q��Ԋ�=��q��w��
ި����"�({��$�`e��@*�D;���t�1��%]/����
m�)E)�"��P�M����ޡ��T1�#��`�ϬɎ
�O,���Ħ��2*?P�J��į���=��n3�)��3�Z8=�Y!�K��n��U
��0gRؾ�����z�����Gi.��r3�ST/���F��=E�^�y��9��%��#�;ߟ/v�ч������(52��Iȥ���CA6'O6m+
��`�J�W���6U��
R�Ӂ\�|��ׂ���
!,X�%wT@��5X�sr�ϰ��h�+�d��2�����Y�.y�<N�Zsr>��M�����T
05Fb@����e�3C!g��4P<%��V3�m��2�����\4�ʍٻr1�p*?&���ó�=�$�Мi)!�LpLH-��B��,�ŇB�#�S}��,��20�<G;mzT@��m5΁X+��)��%�h�xAU&IŽ	���U�,	�
�8���\�����7�U9E�B��8���f�(=FJ���hJsTwϗ�(Ȧ�5(�`|���9}99S2�JI��2�|�ZV!��7�j��l	M��ty^�����!}���~w�q{5[#��K�e���{�Zr߫��>47qgY1�Y�PO�l8�M]1�m�W��|�0������w��ͯ:���Q,��a�9 �D*��9p݊Pn��F�8��]1�lڶ6���ѧ	��_:�Y5�{S,�ň���ϲXv
�k<�!]�RC��L9�G������_+>�5+�6V���e�@�N���W�5rF�ԙ�m��<�'�^�����7�[��Ya����{���C��;�d�%)���|�}�Ry��=�k��C�Sȋ"G%.U�F�0R��Ɗ�ɵ��=>����/�ޡ#��%�J�N�˩D����5�#H!1���i�N�M�<+IRH`��Q�%�������>�S��� K��e0�!z:ΉE�9s>�g�T�Vю�HX��P}`k�iےF� ��ĭ�5�w�T���6�>L�(
�DF�_]���@�۫U4�sj5M�7�29��_aBΓIu�Qq��6�i�:�8�+���f��B�ys�����e����'�v�����aS��&#�[�cOqo�@a��'guq�����g��~
]ó�g��hC� �"e.j�̓>�{1}*�@�~N�k�0 ���U;���Wc���h5��9X6 %	.=`C�D�P'��mqO��d�Sn£R�X��	��mU ��t���=�B��~���`���i�L::;:'Z���$T��P	;�����D��T�
�m�ˆ:B����Y"�{3k[m'���a4�{�p�=g���h��O=�G�=�O�)��r��޳(���GG��Tnܐ�Z���1ik;�3��HKO��Zݞ�^9��q{�磂�^��*5aY�ә�E]��7�L|����z�&K�U�u8q&
"o�d}'e�.���6��(3�9inh��Y�?/T��҆f:��M.VM����R��u%lo�T�9�r �(;��
�Dū�,|o�>�:��Њ��row���`���!���\��>\
�hŜ״P��|h��C��2�J�F��I�r��1Rʼn���<!�>�@��yV��̊��
!r��. �n�v)}��Yw���.����l��c��&kv��Y��5��`�P�uz�]��}���@�����_��a?���-�xR�0������5��e1}v�&�1�\Ɗ�ܳ�i<�3#\�c���s��x�
�-�p�j*�u������0�ﺢ4�c#(C�0����yl�6�asԎo�X�S|0C��^�)I߸��0+P|���B:m����s��^P�o䗐��vA�PDz�����}��?re�K����
�}B��8�x�y��w�3����n�I7�^�/��(pvP99��p<�I��Bd�L�B�r�"\n�H���TEU ~�~д5
���+�{��}����{�b'�YI�Չ6��T�2��C\�բa�x5��-K���V�}*�4P��}
I�9���.%���$�.l����vn�F�=�&�:rk	��hE
��
qBX�}��i�>�:�pq?z<Vsl�;�99�X?�٘�M�]�����
�@��8v��x�q��˳O~y}���W�g�O��T~{e|���&����֌p
�A>[v�pv�r��N{�x��@���#�1����N�U��ջ��՝���5��1��6'�OR�#���Z]u*0��W�h��[=a�����	�k%�>`�b3Lum���c�q�b�6H,t#(�4Ƒ�Ԝ�
�h98l�ޞ5�S�����=<F�+�O3�ɜ��8�x�y�N7?����"�����������'��1��M�*��H}�'������<���9�?�����O��a������J���y�I�CV"tϧu��آ����.�]��^���b�{�7�ft3r1C��"�f�,�,Ns�`sa���+;.~$4�,�%=�w��+�U���fr��C�r��î����
ƴtGEM��	
������/�w�d]Cm	��,�64Ip�(��;\�u7&�L�jb��>
3l*�r��cXJ
��N�٢�3��:�C����U>*�{�Vc���P�z�Um�P&$���mdG��(�@����S2�1&�E1��/�~��Q;(AƝq�oT|p������w�5�F6�~UJ�'�����
A��T�Pܐ��a�x�Ǎ�L>��������-a����ą�w��j7�Ē�E|�Չ��S���+��N�~�lh�Ԅ�z�����i�}�n����T��j���B��jC���`����W�L��͊���}����Yn�	CN��0���dJv�
mI�WW4�pcpGl�G&|� ����֫\}�D6G����1����*�(7������^V���k�e5�\�����.�M�c�h?9Xk�Z�Cֽ��1�&���`�fZ4I�3	�d�p��I6u�<x���N������OlX5��p|�$#�F�ΝC8kP�4��������wjՙ���1�J���R8	q��#A"�����Q�DOA[#����;Gɡ�@�0y�J�Ǎ�v�`-=�5<��ZޞYӊՊ�.�/�Ы����98wr�i��ە�X�nƄ���eޫ�T���K�5^�c�F�=#��n���N��"d�l,F��\02�M?�����;!��\��a���y��g"���)�WH�ן�t�F�{|��xQ��ɇ������ԉ�>t]c�<hf��C�L��,���qXGMV�{�|Ij&Z�S-�qҒS�`�j�����
ax-�f"�Eb$0'O����g0+
��g?�}k��W?����ū|�~yS���v���EyR^��*/Cj�Xl�{��R���@l|tٻ��O����#��al�ש��?� ��3�脦K�����}�K�I)��s�Yor�+�i��+:$U�?l$��<&��e�5a�"��G4��džI���L�����Y$3	�S�Vjd���i$|a�T�dk�&����C$���!��I���WdSr�������t��P��Z����-�D�mnP��g��
{i����P����5����X��Ɨ��ktG�zq����!��+)����h\
�S.�7�ȥ�����7�Rʹ��=CU���ӝ`e��P|��ե�#����ՁW*l!A��i���݌)f�p��=������	��BeVN3n$/��N�Y�
N�t���Mn� ���m��gj
r�~�
��{,�;���6����h&���P�);��C�! �m�|	�a��1�wLL=@,�����F��Dq���S����SFY���Z�4���A���um�O
��QiS�N+(ѷ�<ta�;u&s�x6h�(!}�
�q�Q���J�P���~U9t����P?�ַ�Mf�C}��RJݳ�ߜ%ۅ����Ж�%4Eb[;&���H��Z�����{\�
�v�pu�Ԑ�~�K�p��:軌�J�d��t��_��y�t�-lB�J��!iZ��/i
F�u𻇗I�[G�E�Y�:����\/��U
�mi#��{*��Zι�9�1S#얐�fNH(j�TC/�a�Π�G���I�S~�^��E�U��YD7T�v��hĉ�:��J_6��>8R}�6
���H��9i��V�7�Ӧ�b���ڼu�Ɛ���L��':��N�o�S�_C'�f�g���7��=(�=����hYP��r����uPų�ʵ~�u��x���Ū�i�ԁV��2�s���9
3Zw�M��Y.�_a<����$T��߇�;��Q6n��+���^-cG5,W��U
�؈D���;���Q�w��wp� P�+z�b���> ����?
D�_�����t^��D�¶xvi[�
��>M�!V�/����J����0!*��U�Hi[rv��ÀY!�
��'��:��ex)�6��OC�q�ᎍ����r�<���C����7�|�j��-�4�u�f�z�S��'��r��0&?Ec���8�iAg��=�F�N�o=���6�h[v�-mIB꫇R�OPpQE}.��7CWk�9K6�+V
[]�^Z���ؒJ�X��@6�"!�KT����BWcjCy"�d^�.߹TOm��%���_+��5hvv��Q���+Bʂ�����q��`K��!�����}��Fn?�&�)>kEhҥ_m4B2�d\E���Ѱ���H��;]-�?�i�ðkl�ب�T2^d�߼Z���w3~���J��mM ����9�B�#�y^�Z������9HDx���#"<������ϼ���gS}�[�*��N}^j$���m�d��N�>%�\1hݻ��іѤ�����-�5�o������]�Y~W��#}�S3^��c�P����F���FU�E�~��a��Ng��Vn����.�8����N�Zd;pP1��Na[�t��
} X/jr+#�|'?��F����-�������7(����٨���Q0M��if��Pݮ�׿��aH��uY�|ܲ2�+��oCV�z������.|�z| 0O�,��*s��2iD[�܎��Y&M�u��.3(z����7+_��
�ӱ�=��`cO��~A�K|=�)�pn�	��;x2FY^p�x���1�����2��O��ť=}���$x����Lm�pNd2���J�o&.3&|q���iў��j���Wg/TC�j��{��ޭ�j�)�q�[P�jz�,�k��%N�:2�Y�Ki�����j�uf�yLU��dM�P�X$yr-=���nC����tQx��!��@�sX᧯IS��9�Nɮnp[���Qc(4
��O�-��ݸ���S��cK�.��R�W%��H�9�~��wF��!XŜ}�t�dy@ӥ�)��D�U�B:]=�n�Z_<pj���y�)�z��V�"��x�E�g5�!R�4�d�/n�2��׺N,\�'ᯞ�;q]U�^��O�����Ľ����8�z9=
��d0��:=u��j'aCO&�A��Y`�}a���ѱ��M!Owo]_W
*�z�M)R�}�al��˹Ҿ���Ƕ1�Ӎ��u<�|�RN�:�0�aXڮ@�� ����ڪ��P ]0
�th��p��o�57Y��]�}�����w�iH/�R

�ݦq��
Q5�fGGG"4����漫�yUL�npu�LcDCu�O��
����v�bQ�V��'A���!p^J��S�/wR�/�[��-�K�5�v�-�Q�uz�O���3��?Q�ҫ9�k^�O�
\�-BO��/��'Sxr�e�?�8B�9H��<=�B3�[w��Bč˜:@�'��usj�P�0�(m�7B�������{F�b�k,_��!�0أԲ���.���L�a�\��R0k�b�OB8�
W��f�>�c�{���$o��%�����RzsF�=E�)]���Y�ii�ɯ��a�!شv���@�["�!S���Aq�+eY5�Z�66K�
��ƃf�a5�H�ឡ95p��?���ZM���K��ݧ��*�L�܄^la�#Ǖ���?���i�t*ڼy���iz
ۓ�\;I�UM�5,��sH�y���x���� 
�-w��6�w�sV�F35�wgg�ݛ�X�.���v�+\���pI��y��B�v;<"h2�y�̫b��BKz�6���H�"�	�pש��=�bF�Mi���ݕt�H�=Q��[�C~�&1��ޜ�QC� ���!��pz�|�
>�Y��ΐG�I�5R�
o���#__q�6��D�ʒ�oA�k�K�r�e��w�(�zO`s֯�'䢽�5���\�Q���7K�6�n
]�K:9_��2���b�����\�RH�B$�a���kܙ�r�}��	�<�����o���Q�Ö��~;����}*xY�P��P��T���U��Q��EBw~􇽽�����;��;��(�^����@As�	�ԏ�y����4�A�%���tO�lH�}h�a�4�u��@��?��.��c~�s��ߏ6�A�C|�
��6�L�ˍ�F�𠩃MEk=������UYo���k��wM]�7�'`��`Z����tԬ����tk���x2��A�趌љ�'�'V,���J5�U�y;l�\�8�%
��\\g�l>}o�u�	��J��3t�b���Z�+"[�ř6�f�}4�\BP��s# ���'�w�00o�7x7����
��IY&k���g���y�ߕ�sZ��;9�z�z�T�:V����]�*��r����+����o�晞��o"��.�mݥ��+.T'΅{=��(h0'��-EO�����0�����/l�,���=�鴧v.TO�y�:R�z��}�nZI+��7����]��u���SWh�\};�R��()?ື
ۂ�s��@YѨ�J4�uI��PKE��T^���b pip/_vendor/pyparsing/results.py�=ђ�6���X�R"m�<�%�L���]n�N*��>hU%B3Q�� 5�M�߯��j�8Wu{�TF4��F���`M^��x���[�y��uVb���,��˪fm�d��&�}V�F��">�6�X�P�*���B��﫬�%��l+��@�k"����#B��4� �+���b(�3�v��#6�L�P�ձ�"��oy!Q�P�A�MY��e�0���X�,�)��Y���Y}��f#x=�`�ı��Z�1����f?Z\PA
��qVdu�盈��u(⃯'�1T�f�[^g5ߵ�3�i��*Z�l�uRs�t���H؍"�2�n�],�_-Z�$�
F��Ǻj��O��5/E�.پ*Y���d0alǓB�f|���.	N}�e딥I��$Ɨ�	�3Q�`��y(��r�*����)���T@<Ҹ̧��2b�^O�fI]W٪���j�Ɏ�\BU�9�fK"A�}�w��'@�ج�T3���d���q���oyT�{Y�A��D��8!���"�bv0:�����M��n�+���7�N��(��}�@гC3R�<�fF�g0���?��`u��Q�x	�@="�9�d`V��A�2��i�����_�����7ӑ�
�:~�7�W�,�C�/=>��o���h��JT���q	�yZq{8r�{��1Qp<T>!�9E�
jFY�S#+@\ĩ:��f��QĀ|�\Daʄ9F��|�DG8��gz�~}3/����c��-��5��r?ܶ�7~��K�p�Fo�X��I.x�"�g���8�Q�d����%Ci��C=,�M��T
z����[#?���sЍ#��@���µ=�H�G�����z�@�XOXowe��֛��⌻��lm������Z��"���r����?f�z�C�	�[����� 7���K
�J���LܕM���F�W���q-��.��O��,�9HqV��').j+��f]^��tk-J�,
��w?���_"�3}��}��O>6{D��MQƇ�%*C�?��C��]�
*_O���A��
7
	P�/�y���)�&�c������z�O�ш#Wd`d�Y�
mJv�&Yi���}頻D�vt,>���;&�.�P��KE*��(b���(����;�|s#)���[yR5E�zR�q�^]��ͯ�7��E�=��b�0���_İ�0��$�M��Vi€�@��SdC���\o�f���&��F����u(�j��|����-���x��.yL�7T
(*U:�6����f�dw�`�D`�\����B�a�C{�A�$+xz�*�a�lӕ�L0��g�
(��(�
��؃m�9�R?U���s�}U�U�5�r�rYH�H2���')=�[V����Ĵ\ı�Ѱ-�s�3�J�In
2[;+��j鹑�����|�}p6@@I���edi0��
U��I�LI;��Ҭ2�1CE��)�����]v�,���A!�g&	@W!f�E����䇳��Ӑ�<5W��٢��Π=i�>p���A�Z�U���3�P_�h��>����n�9x�~�1<��Mf��=�R���h5��W+��m9���L((m��B�C�`�YR�l���Ե�V9�;#,�O@"�k]1���nn���uHS��4��8uvG���?܀���@c��V>���HC�BvG��E��<yB��n�WH���ay��؁vhIU�J�~N�у�K?���j.E�H	�C��ˇ~�6��V�ˆ�-��e�����v��c��2�S�GTW�3��!�'ڧ5��,�?Ҋu��~@}?��ʂ�����p���y��lJ��7��,"���<[�$��j.E��0��V��ܬX�
��_N��	�X\:?�O�ۇ��"t����;(�AB���
��,���-�J;�h�Ϝl*�f�&q\Ke{rB�$�α�Eoކt���V��L��T�Pnؒi�!�#p�{����&醡�ޢ�=>�/^�_A��3tPw'l�l�` ��]
,��Սĺ��{%�0���A��qWh�l�x/tٍ�v&�-^fU7�~C�-�M*�<p;�d����eH4G&��"��V}�Ҝ*�릪0B'zb��/����tyZ~*b-A��ȑ�!2!6�E��MN�2F-)g�i	w0a�,h���5>�6�*�jJ��̊N��xU��5����7	&$��C��=3`�&/�b�6�i!fN�L�:���O ��;�������-?��P����4�Z�k�Bb�vƨ��"�g.
N���Dt�ϛ����r)a,�]�K�	ц��x}W�o��M�#��>�
dq�B\�)���,��p��,�G���mqDL����d�LL����A��˽���cL�?����c%�+��|�m2��1$��
(���rN:�5{L.�^}�2�@p�KD~��:[K*,��,y�~شp�~�cQb��!�0�Ջ6ޫ_��Q�����m��FZ��(@OR��=��b�ѱY��(ZP	`S\���`W�<��udX3tђC?��z1@9�}	�Oq+�G��a��d�`��L���&J�-�S���F�;�n���N�t��'�N�7;�����s�Y�d�V�u�Wlz��������{!#{W2����y��s��Z4�MVI�̚g�SӉ�q�@�L/:a�h�ȓ�5͒|���*���T/����)noy*�����޻w�u� j蚅V��G�X�'4%a��4��8��|�+��N7�t#�&�A�ʠ�B�l��Y��I6���U{$���ϧu?^��|�z\oָd�ČQ��imjz��õ�& �AG,��{e{ҶW�~k�n��
)�3�ύ��'�F���")�goqXk
�	V,�����i��?T]�d��#26@-Ҹ
…
DZNq�SZ�dm~8�K����k��S����`�be�8iWӌHqTL�p̚�%�{oep�c�+I�q�-
iEX�Ⱦ�C퀫�mv��A�e䯯����f}�6Y5��q����	�2*5�N�n.nN]\�}c,v�]�'j=� "�ZO&�U�<.o�`�V/5�
�}F���P*2�_��T�u���+�j�y.5A;��`�V��Qd�;~y3܀s�tʽh3�p?h^i ��E����6���uBK���]4?8����^��ټ}�A"�多��`���i���=31�(����E���-�4�n���^=d�q���H�Y���9^�/�X�~�/�?�~�W�߉H4��@�N�=/R-�0��}��7�9o���"k.팳e+�����u��7d�sXlw��FD�O�t���A��"�I�$q����l@UL�#��j�)�]o_�OsI��oߞ#�j�K��O��g������&���6��f��=��$r�4�ʷ���,:`I^y8a�l%�d�x��&X#�ʟ�EQ����G)�h���pp�7O�ˬ�]���s�<s�mz�D�o�7,�
��"Y����m���t+�A�@�d��1)��8��ĺ��i:��m����9���D��X�a&M��ҝh:2�-�!��@��Db��'m`�RW:{A~�8��yG��Q��kO`*����`ǣ��w��ܹ�j:�QFΚH�"�T��Ynp,]����:��7q��F����:P�vNl���?��N��2#6��֘s�qE�}��J/��Sv㠤-�~}2�T�~�	��dr�h����]���>ux�@�[�|+�^�m�~{�L,_'̀FtF�V<���va�W��7�D�_ۚ�;�_��?�l�5M��#��F/�Ħ��9H{0no�m�CG��rߠ���S�U��uV)WD����
)%G�C�����J��j_r����{+��T/�6z|
�3�ǧ�u�Q
1�3�YV?˼M;�~�_����L�W�	r��qe_t���*��~���R� ]���xf튼�U���.�n8&a�,:?!YX���\H��I&�0�"�[��)�5��l���d��^z�ch<���W����9�]�7��{��P�ؿ��&-S��y;_�6C��k�E��)��-I�aDF�u�H��_fj��Zg�DŽy��g������׽`��]���)�����1	��Ĩ$W(��V���W�9�#W�M��	��_e��#-,���V4�X�x�|��y`�=MD;ӊ'5�6�CM=)���Vʅ��8=�X�ǚ��A�s,'��c=Źs�1G֠l@Eٳ�J�r�5I���NnE�6ԆDE:��s)����MN�gx���	��\���a��*�	&�����<�GX߆�z��W������g�-��O���E'�q
�P�5P��-���i�۳�
g5b�,���J����3�B��`7Rmɋ�Ǝ�َ�c�Ȅ��K�|��D��.�����,<c���μ~O�?`�Ygu�Ps�����*K��}:��y��yT�<c�7S�q���R����ѓ%��~��1]l���~0ִwW��.�z�]�wؒ1/t֔RJs��!�/P�3r�����-�O�}u�Ck�CO��L��ԭ����]B�lO�W����ِ�i�2���P�<��x4zwc�e�V��X;(gSe�ԧz���[^˻)܌��5��勤�L��D�A�&���v�Nz
t�G��l��4�샲�;3��%�l�`8L��~�uH�"�n���P�SP��������1�@����V�����`�bl%�E	�`�o�Q�x3�F�Yؠ8��h�ΓӢ�_��G-��
��~r�G�Ǭؔ�c����.�mǴ��f�����
<����;?s�#�5�Ե��h�ְ�l,�x�蹄)���k�ु��S��w^������_,a�c��;ם$���
@��dE
t�5D�V��4hN����n/��;�m|����f>H�f�kr߿�Oy_ө�^���KEZ_2���U�JJ���I�}�2=�f;؜[�Q2���h����W
0�|JIG׾4NQ��]
AT�ҧ�S

�]-(��ˎ(����|{ڵX�M��`��̬����_Ȕ�?e�mQ
�:��$�����Af̂��=o٥���n�%q�d�r��xc���]�%6҂��<ZC�gT@�R����}��=!�q�(��7Jmw�d]�sF~�Y���㻱G����#Kz7�����}x�G�(�*mD�������2�
��*a4��	@������=�TdBP~v@��m���'�a�Ys F�Ё�8+�Q��{��6����.��l\�Y1b��x�?ģ;~x�S�g���v��g[
LO��� Y��zԳTzj�g5!�Ϋn)P��y͕��x��f������O;.���d!��%�s4��H.'I{�%g����,R�����w:}>K�˰��P��O���j�	��T�˷Z�%�6���*��w:-z����|��9�4��l�|�a�_��W)2,~�J��8��W'�#��?�Ȥ+_0���g�ª0g�Ai�}α��`}���`��r��v��f#*øm��]�o��z/f�_���Jƫ�&eu����<[UIu|-kN��]��2�[h��w~�ִO�LY�:5��A�!��i:@�Eg�za5Fϰ�S��3����"x3�C�4�J����`S�ٯH�}���5l±*]ç�a��G�w
������{��@X�/hS$,�VQ�)Vl���UM��F>���C��|{uƆ:;B3�^��j���	 ����P��j�3�2L��
g?ї5}��۪���l���Ͳ.�e�
�7V���Ⰺ�����"�1ջ��Z�8��1�{�e�[eB�e,����wϖqm�9���0@�4����BHWe<�{���:`��$�T��L'�
~>��i�mgsI���N�l����]@iV
�2#s�mʆ}"���G#];-l<*�Ot����joU;;��<o�U�#yqj{I\/�Z��nOjG��Zw�Bd.�i��牼�;����n&��|i�nA�9���#�p�s�+�h���A�?�X��[$0:�	
z/�"w ֵJT.l�S3n���gL��s�&�'�em��\�b�<�㨶A�{
~_8�0����9'Dǥ ��B�l/4'�ܪzn��[5�l��<�'󔫋z�'wT�]z	�����Ņ��PL*~��ST��g�p�M��j�
PKE��T��5�[
Z4 pip/_vendor/pyparsing/testing.py�Z}oܶ�ߟ��`�Ԝ�vҭ�
�5Hݵh�i�b��'��X�m����ϸO��!)�)ݹ�?��$����'�f��vQ�ON6U����kvW�|MxVU�>�hN��:�O�}	��E\T�����F+��˔e,��˻��5/r��[��-�D�DQ��6�ڻ��JZ�}xrr�TR�K �#})g�f3�7�%�Qs7E�~1A�6MJxNn+�*�&��_tD���b��Q�M[A14��J
m#Rd͐eBnw�ǒ�;
�o��Nh�
ߒ4m��y��ꦂz�1�.�<F�+rϜ�mh�� �[�hE�Ub�x��ŘeLJ�HES"�
e�M]����b/�gLow��A�
����Y�����-�wc�Kk.^O�M�I�pBY6ց�M\J��2Z
hE�3Z�鞈�,�#�q�[H^�<�9{���Cт����Y�2�"?�1��;*B�͛Vl��)a�_�op������b�x�O�S�'Q^i�;FN����>�r^��q� ^�p�W��¡+X�Y(��/��Վ�7���)�����ų爞p6'W���tNN���ǧ�B�����;���A�~Qp��Zm��=,�F��-���
pr�(
P������X1����M��[|5�>��6{$m}y���w��F?|�������/�|4a��u�~{���{�{����3m�Hyx$=zfMs5����W2T	vu]� �Օ�V�Äu��XN�)K<T#=�RͰ(���d7cVi�V���;P���f�DWXk�WY�X*�Q2��#��9;ڦ2d�-
��G[����:5��#g�aT��H
�H��ÒlYM�
�jD>e5��0r�c��G$����1���͈4��HSג�H���Ҩ��9S�T�n�\�d�8�5�q�0�Dec�P٦�Z��fC�	��C���VG�Vk��:��cQ�RQ���_$���6���F�*�B�Mx2��P�%�
��B�7�v�V����*��ᦽy,2�+
;/^� ��TD1f�~�p��a }}j�����q����!���-��؀�|�{+��?e`��}|"���`Q��G�Ƹ(����	��:j�p�f�h��g#��(�ֱ`eV�YC���WCg�]W��Ǵ�
_9���l���C��o���!^ʞ@���$�w\w�X��$Q��\��l3V�DNˋ*���]26td��
�6�����ѣh	/�ـ_�~s-�
K�r�
K �Y��Y&�+�@X�T�wm�oh)Q@6�d)�Y^��^�b�#�V�/�I!OI��ז���s�͓�t�Gk@�N:K��d�*�z}���	"�%�B��h���S)/�!�ֶ;3�}*ÿp�)
�K��Z�)�[LǠd��$a:�[���T=v ��<�z[5G#���9g9T�-K��F��S�����</���"��x��G�0X�][�SI���k�<C�J����4|��h���X[,���F �K39h�6t����u�w8i�2�I�ֲ��GË?�x@pξD`>g
ܿq�I���0�(���
�L�'�`���1�j�ެ���H]@���3eG�P~ݤȰ���M�X*6-8���R��ǂ|��������,Q7e
)���k`8����J�F�����\�L�?q��lHfRg�"DqS���8�2#m�V˄4B�l�����x>=�V�o����`&H4q̠�ҝ��q�8ҵ/�4sv}��	�E��ɕ���SV
Z�"'|����A�@>��= A[��K��
�
��� �u��-zlw�V��'� 0"�d	��j+���_�qU~���ͯ5
�_�a0Tb�A]���2��0� S���%^O��bW4i�/���<̧<�/����|,��ID���~�r@����
�i	Ŭ�[����J²��kyn9����,�u��Ќu�6��lf�������2S���ܰ���sQSH�8k�B�Pw:����GD�͝�5:�	N�{�����{�P�B4k��ދGi�~D�%��#lg:ro�I'n/荴��r�AZv�k�>Rɳ��c\B��a�֍{#O�ƫB��W���-j���&^��$:�2x�#�nm��!�:K�O�Un��r��<���:��{�׃�=^3�h����	���La;�i����ϓ+T�?�#�H$�T=�<ܪ�6$tމ'��@p�h	`�4<�E�����Ǫ�n��2ݺ-Ee�5�v�6p�����^ҝ"T��å:6��6��.���P��C�s�1�Q�4(h��8�<�|8��	�-��Arw~�Y��~��x��%OZa�v�/@�����|W$���{$���s��+��w������[�,O5���x�M��t��k�(�Ghu#���ϳ~"��J�a��P������%!9��φ�fi�b)�J�Hغ�nU��Δ7	x��2���V��i��D�E�2��3d3wq�wJ>uS"��v�2V�rIq�s�	1�`5��5��%1EA��B��	�K��E8$�C�!CG�MxZ��v�eӗ����B�Bx�Ukܿ'ּB�i͎$9���F��v� �o����b��&�%J�^?�����~�7Yh6��P���2�{�"����(x�w��P�_1A,���V�>�t�S-|a�X�4�r��[�'�|�/G�32kr	��oH$�4�)�~{�NM#b���6��Wf��Ͽg��׿��Y<<�C|�Ƈ���wR�l#%Q�:�L\-,�޵!���exryƍ/���H��F�SȳGnP��Č
f,T�I�lv�Ʒ�5��ƫE���ƻ���ժ�l�3	����
��G��xI�q�~��4߲�|N�?��X��=���_x>x�L�/�}����]�s�2�
��l���G�f�Lj�*�3�^�gaH��+���!��NJ�)��aܽԱˬ�K�432�ﰞ�
���~���{�5���W˴C ��زC�.�.������HgC��ntET�s
/�x��s2̌k��ѻ�bn<ȷˍ�b��K�� "�Z����\�eǦ?�s-�S��+���,Ѭ��|92�罩�SS�~}`���Yy��¥6~]uf6��T�5�A�uq��e�X�+1
��cX�����L>_�/l
T�>jnlH�M^`������%������S�7����\����s�W��%�'���9Pq׻O@�����傧��[���8z���k�	Sͺ_��L�

�s���X&�cZ$��L���.�=����/�%�Fx
)jo���b �f�o�`����ai���-wSw�.Q��p�9�r�U�ۤH��2"�����PKE��Tz��x#* pip/_vendor/pyparsing/unicode.py�Z�����j�[x-������#��Z��x<��ݙY�MU	

Mi4-M[�$�@KRh�C�~_�/�|[�UU�?���5ǻ6^ig�{�=��9�ܱw�%ϱ�-;�[I$�N��$X	m��!Nh�a��DRڎCm�
l1#\�9�BD��a�^�v�񜮗H$,��p�WW�m��@�ʮ�O�n�F���H��N���4�aC��Gv���`���Z��D�3<�c����к�`�n�X�Xn0���f�	�+]���#�f��I�L
�xݐ,���~���~�fR���[I����l-P��K�'�!	i27��n��T�xB^��w�9e�|v*fA���?����W0*�?pސ��i��hY!o�Bs�@8��$��|�4p=dz6��a�9��9�9`K�B��"����cQB�ءPtff�_5P)$�6��k��M��0?��쒹`�=�rڎE�Ї��8z�t{��G�p�-u��M�C=�ͦk�XF�?������i����\P�g��@��v\Մ�?wp	����Rhú
!%��(��H�&�(Xo)�� u6d.8p�"��8k����]�~�X��H���lVͦ	���T:N5%��F�J6���J�M�&��g�_}ga1�u<�#N�p�Ԛ�.��N1dž�m�`��!���$F#������˜����t���a2o����,.�!�e��HĢ�w_���p�^�g��}]����0�!�r�.�dœt�W��vP�P��UJJ��<�?!)`�����2�%��sk,��?M��x�t�>�<�b�N(�.�J�倆{9��V�OL��\r.��<�I�T���Y� <%�a�_�-(�a��RSxn��c.�1]��7{rv̠gZÕC$*8�+;3���L�X��C[k�J�	����x��-��ӕS�v��9��*rA/�"+��3�:�Ui9N��:r/��I�FD���z2]Dt�쁉�Z�e{!7Se��pk��H�0]�%��2�lo=����-x����/M��HJ�L��)K�� ���@�ɡ„�$3�^�Ս��|u�^������#�ַ��]�i���c�ݎ��}�¥'�W^}p����f&����iz��F�����9�#�=OLߤ?�?�?�?�o�_�_�_��"�5}�����^�������?�?�+�Ot�^����5�>�N?�7�M�g�z�~H?�����7�F��{�>��~B?��MT����d�4��Û��

���Zω-&z`}yh�s���l]w[1� 5H�I�*j._(�ʕ�A����Y�=�1�,�K����'S��8�7	�lq{+=X:��ܒ�C[sj��e͵ܶ87���;�ձ��N�뷾�{|��Mv�v'�}P;z]�P��Ӈnm�F��I8�f:��G��rv�f�XX��:lY� ,���[qd��c`�Ȱ�e�1��#�g�
���#J�7C�S�U�ϞU�ǀj߭�F�����:ְk���ڳY�m����TJ��?�����Yz���z����i��')<����ʵ��`"W6�J%��I��Q�yA-k(�:~�u��)U�	j�RYQG��EF�+��R+�u�Z1vL�RV�e�*���F˒Zè������7��$o	�V0S�����aC,QB(K�<FՅӌ*J�Jj-�QkUG�5A�c�7UP
t]CJ6���**�4��T\��kz���.��{�2`��*6U⩦�(i��6��JS]��u�i�M4��b^��*T-�QG�P���X�ju.K�a�@+�XhŒ�QKyA� �F]�5
��|4����mv�Z�T�
�zETɸ�R�9��Qe�5Ad�.�4����)SFEP
��䈡�$��X�!$?p�VU�
��%=��5���B�
�UP���#�U��Cj�%��m0,v�ZǶG�e��z�C}tC�?����؍�Oo��5��Ա��9i�����3�;�}fh�'y�����/`��	J��s��SnKMb����S@��I��]�_�L���,�E<_���l^�WƑޟQ���8�3�X(I�Q�텒��٬2���n�3<�c��{`�M��(	�/��G+�I�$�b�^4C1d]�8C��j�#�3�e*��nl{�|�g�>�Ӕb^ƨ8�Ds F��Q����&�Q�
{+�N[��l����l�^��S��;��h)�Q���5���9��Te�Z�����(v��*�I���ZU,X+i�&[+�ZE�@��@�1M�H�C
��
jk��&�X�f�$o
�I�ڰ�LT���6��OL�lbK�[��{�X3	l��!M/��6���l�v��u���z;��s���Ը{���o6�?����mCQ�M�
�Mo&�Xgeg�-M~)��n��ɩ����&*"L,����<�ձ �"��m�
?�zI{-K*RP`�B�.�a�"�.��$U'_�ԉ��'`�^0��g���q���l{����QV+��m��γež�DU%3����c���/��䝛M���9�>�ϑ�T�m�q�"�������70��uG�$#�����/�>�����׾8��}tyQz���|z��#�<����õ�O=\{x��>��-\�|�HX��~������{�7P~��a~t��������u�U�!��饫O/���wP�(؛a���W�u�Ҧ���	yr�'g>c�_;��(�M����ə7��~��i�1�#�w������ۨ��#lw�n�]�X����McZ}w�깍�;��6V?�X���zk��)TƠ~%�PKE��T-G�l��pip/_vendor/pyparsing/util.py�Xmo�6��_�s�H�#lz_z�&�˵@qm���ޗl����f+�*I%����]r��.�:�e�3��g�C~$j��:���q�N�R�{۾�c�K��R�t�5)�i��`gt!vu��h�sS'�L�����uk�D�����6� H�6�� .Dz0�>�� H�Ŋ$Iu�S�d�˽�?����uK�/��Fd�S4����S[�+w�̰k[���(�0P"�<)evÖ]Yg�ш�k߽S��=%@�J2�)�������f��پ�Ag܀V�Ă�ܮEF�kq+�"?9������	�xdH'E�v�b����S��ã�e雜�ʲ�NlA�[0Fe��=XH7G����'�zQ���r�e�j�'>{�DQ\W�0�kE��7�6�ig��>R�3څ�� �0V2RY�'����&\�Z�:=���a;�N��N��J��O�0��6���!�7���{ejB�P�� |#qFdD�y�a!�z�|�WLa��
z�k���H�]RS��|�޷"����3H]��N�.�$E$����QH�p����V�\�JbiccF|u�S�vX��.�`�y��v89��h��s'���Vaz@%��WNn-�4TYծ1����K�f8i�@j�*�S�6�'�ް�77?���s(p�1��O�y�٩@H�W�'���-�ݦK'}�����_^��\>��b�g��<�5H݋�y�V��л�~�:�wM��k��Qx
8QxoW�*��5���#X$!q$�cQ�S���P�
eh#?�+j:�V1��)We·��`R�Bj_�kj�#����~a�\�7� ���e���j�>����=����}��h����Г�&>��`�I��s99�Yl;M��Е�� _;��KR��b�X���R��IW-*:FlZ�k�����Cx�pݗu��-N)��+�릯��K��B��D�~���qܔ`�@����w�K�1:���ʓW��k۰ك[$L��W8F����6D��s���l�@�k�nW�M5%���	�%��
F�	9�]¸û�k��{��W����5D�eq�Ѣ<[����J��ߨ�~j�Q'2�����2�3L�?����?j.9c�߈��B��P�..�Yc��'����V����@$��ߘd߽|�=z��������-��BV��/��e�k�M*+�����m^�>t;;gd��m�Z�=RfWFȔv]��m�ƭ3�!�$<��l��2��%kR��mN���DȬ��§lBI�L�?'C�v�j}������=��dxg�8t�9.�������u�B����'���70.�`�8��e4��q��g`���>�ѐe>�)�F�]��~4�ٻ8��)�����Ua|<q��3�p�m�c�s��)��sJ��w|�����)jт.59��:(3�r6z� �|�Z�g�({?��1��
{�O�,����WC�PE~$�8%
��Xp#~>kn��lO�`Vo�q5��%6P�2�t���Ǣ)���4�X�v�ۭ�%"��ڹQ�������<C�o��t��;��.�oخ�l�V���ێ`�FY�!���D�0֌�i��4�=C�qe�v-�2[�e����>��y�Kq>���r�T ��>.��5�\��[��_,�5���]�6��hI���켧rG�7G.n�]�y�".�s:
^_5���G,u�\�F���
�g� ��Z�������*�E+Lu�`LS�nn�p���R���
+�?�l�޽�u�=��c�b��I��o.���҃!�I��n��V��v���U!��|��k�'X���H=�
d<0N�1��8O���s$m��k���u���B@�KA�R��x
L/�O�̦���)Sf}�Y=<����l��P�Y��%��E�y�o;�����S���h�qא_���˥s��<߈\��0eҏ�<W.
����9�uk��eV��HX�w7����)�WH�6
|�PKE��T��SL�\)pip/_vendor/pyparsing/diagram/__init__.py�<ks�Hr�+&T]ܣ�v��E1]�۵�N��k�$�(*�"V ��E����c��P���
�n-3==�=�V��j;��Uݪ�<Y�j%��z:��M�ZQ�n���jnÕn��o4���C��w��&��|%��ͺ���g�ȶ*���n-�=o��OUa��u~cg|����N��x�+�V5��hW���u�w��U�>�ص����{��,����?��ĹV���b&F�������.~����IJ[�/O^�d^�$���ITѨN�3��?/t��%�F�F���}_h=z���gj�g#	�D��PM�t���zw&V�Qz��q���Ӳ9Ykb��#�?B�)�~u�6#_|ϻ{q������`�䢬��6*7�OmzQV���s�g#���Vm��_,��*�^ª贫�����SK�Rm��*�� ��&��o{<
�KK1���g�d:"u��LA@��$���
H��,-�㓓S�^u�LT���ݲ�b�6u)n��E�w9m`"n6���'�z�FGa��떪?L���B+x/��y҉R1���N�p�dx9�*��Q�~ć�*5�t4�k���J��h��1!��,a���5ͩ�R~�UӍ��<#}΅�#
�ț��~���EUT9m*���V����-��ʗH^V,��r�<!:�Wy�D2���(��3�,�%������S�P�>�<�<�������!�p<��hQ���k��RU�i�x!�ʕl:��	�#�4���O�P���AeU09�e�	���Q,VyW,e�6D��9O�vu��ݵyQʅ���n>ϴ��nW�� L�D���ʔ7�ղ�xl깛�f�F�U;_) ��,X��y�m6�:,�'L�b?u�<?o@=ù*3����
O�0���E+�y�#� �xL�Qi�����) �`�D�pg��/_�GS8	�܌��f�9J*���Weա����&��̘ܫ��ގ�����Cu��4E�T��k��jtʕ������P �-(��Ը��u+5�oN���5j�20_6�>�*&ک�))K�M���iE�ђ�ߝFB��(	֍m�h�
F�8A��
�5_]�M�U51k�,ԵR
Xh'W@�r/#�Hg�=��N�qy=y{�π���-�Cڅ�F�p�N��O����+��1��y%A��U�z�Ѭ��~T�C0��w��K1�IH��cn�?ob�6DO��
���4��|�B�c�d�2d �϶��q[f4�!]��5����i���`�眎j�'��6'�&��~gc1�	�0�g���N38A����Y=CNgD>��!�aкUp�����-�@$�b��ض^���1H̺Ls��}^oз@*�#�����)�zSw��Fʜ0N��e�HNl�7�T\�L�Q�#\���@q��v���I��x�؉��%��/��{-29�������wr������rD��'Ȏ'�D-� �ͭ~r=77�%}�Ooe���g�t�I�b�ų����(�g{P�k���R���u���m����oީ9z��u��(ƺ
=��ޱ�s�+�7H/4o���-7����x����q��}�A�V� �P��~F\�N�vߠD�r-IK(�E��F��&]]ӷ=��Y�"띻q��FƬA'�j6�OT���)�A�n[0{�o�J��~(G&37n
1�tQ�<�q� /#��Juc�
�|��h"�2���3�0M��x�#X BP(�x�e6�j��{C�i�ӰD�����Ԫ��s�@2��Y�D���r�WYlZ
rV�CmP(0�l(@�<O 
[-y>�q��R,@�
�RwyN�sPz8���vu϶����$��M�4�f;�_�z�x��Vિ��1��(���À{��4��`+:��DKLɁ12Ki9hF��duTf�P0s�FS��+~�a��ùU���r�!)f��A��Ro~��z��s6lz���݀#^���`Q��$�C]�
U��$�]ٍ�%�kV{̦�"��� r��D߳ݭ�f���F�R����yL^R3�_�;Lk���O�L�:c���"
�fϛ�\���F�k�@���V&�4�\�*��U톄�t�^Ƴ2S��?"-�	W��6�eU,E�Y�V�c^���iP�C9b�9�8Ƞ}�|`�f.U[�qx�1�X��vb�l�f��B3�3>L�R5E�)��[ʈ���,��iF�IJ�]��d0gAk(4�BZlZ��PN�F}�$���2b�]��@�
�g�&фZ�;�gv�l?b@�Ų0��
�-_��"D�ž5"�9�"C���?�P7ð�W�J��?��!kg�G��L�Y�7�(2�Jt"���=N�Ǒ�rA0� �p�˝�g��5rk0�l����B�{<���&�r�'�F��n�b.����ˉ<A�P��e��c��ϝ@N2. &�K	s8�hu���{"z�B9v�<c��)/g��RX�xL�%�,��RsN4c,^��&��e�k�ljӉr���01x�K�5r�4�C�.�%@���"g�R��cj]�^p*J�<7$��r��8\�pV4�:zs9ԁ<����^��G����D0(Rx|((4���4��ħӼ,3<�(d�2t���3�n̿��p)´�N脜r���aOq��a��V�X&���N�w
�/؂n"$�>�"��K�7��ѵ��B#�Y`t�fu��)s}F���z�s��s��XMr�L)_Ր�3�lH��VĮ��Z��ݠy��$Xl8�HA8����s�\�O�3��` y[��J<�s�/+�͜v���p�g�>���9�r��[-�a�"4d]�B��3@��H��P���D�$/�4���]�I�(���q�9��ܝ�c���|`{T,H�!�Tב����IP�~:��� 9=�W�<f�%D[�<�Ӟ�HKʀq�j���J�w����)��x�7]x�����lBí��c��{9 �|����xZ)c����d���!Ғ�D{;XƘ�@���G��M;�c�b��6�M�2�+W���x��LaS� {Fy9E�з>R�]Qt��!��C���
W{� e9	TeDnt9�n��	5�����,��2�N˪.;�9�T.**l��}��9��h-��R�`��`]p��!�>�8M�j�������\��x�q<���f�#ygݶ*�0$p��Ѩ�V��r�x�g��y{�>ea5޺y���3�c�;w�T�9L�D�ְ�D�y��DC<'�]x�����Ҽ�۲�\�$���13
������%�򸁣�|��پ�%z~~�q�Dc��
%C��(z�^
����C�vN��7pH�3��`��B�7���3�]�b�ֿp�ޖ9Y9��4:4`|�$��+�7Vݗ
]؝�X=]��k��m/�U�����>4;@a�&��&�:��BO��+&&���Bp [Ur�ep�"�DGx�발��YH��8&"I���9m�O����w���>��0T��=/d:��ݡ�鶨iZ�`cb��H�(Q{��"�cR���tN)\�k꫋�ʱi��֦	�p���iq���`��)��}F|�|}.��O��[�-������!^�| �+-Dy�!f=��}�;���i�ϼ���=�燁��}�&^&�,�q	nE��Զ�)�yZ�'��e\"7�AR ��<�7�(�T�&�Ʊ&m:���
	$`e�	9�{��9�����G�.F��n�,F��0��OXO}h�p�R��e<X�8���K?��
o\Ayx���e��Ӯ��f
6�q}�}N��I����VZ�C���?:PX�|��D4,�z��[�9 0� ���a����=.�i�Ђ��n0#�S����m�5��,����%e�4E/�9����y��Đ� ��H��V
�����!�6���A5�%��V�"�ľ���:tg~5�u-V��:R��Qe��8���[qS��.� �6T��``��ȵ����t�@�{��Ӛ��uˆJ��ɮ��2�+tMu�.�D^(���Bzt}�{���"0�m�o?t�dO��5��j�N��ם�k��KH�ͥ7L�[�I���&
��$�$
2g}��!('�F�f�H�����DoP�b�ߛ%gG.��~��n�7�@`/O��G��	ړ��s������P����s����h��
�p�&�ܬ���%ov�ZH@�p�O�V�).�/���Ơ�3hi��]����Eغ��K:N9H��\ds��.������[@.����9�OΈl������M�c�Ĕvޡ�\�=���Ӹu=ӛb��}�k��\ѩ0���-��(����Ilg��J�j5v��u@�K�'���[?(��	�~��;l�Z�Y/ld���'����3��%�4ɴ�q}+nd�w�N-�C{>�:���U͠�)?��C%��P?M��U�{Hj�S��]ؘ��.x����D�i�
k�g)ZE�"�@�١j����w�e)Fߍ��� 7����4�F�dXUl:�LW���_
��F,>�D<���Y|��0H�vC
��a߬sh�w�V�&�G�J��mTc�8��6��`�b5<I
3���Ԁ��_��
�ֶ�$�ߕׇ�/��b%�I�LYJL�P0�A�B�#�m�t���/���~_��qj�q*���_u��*��i3<��J���8�x�?�>ĵk6��LX�6uK)�riNEY��
����k�j�KeJ�P�3�V����ĶA%�̶\*���f�)����Xߵ���/��\��b:��5����)GAF�6Զt�ȨaO.r�q�+,Yt�y�-A��ve#ߟHQ�m�nU�إ)�QgJ�LK	D��ΕV��|��L�W%���P�E�`n�P�1�2�N���z4������v�mBD���<�ͫ���1k}]�^RBݒ�j���d��dN�m*Щ�c�ݱ�f���.p�m��h���&i�~���K�ү��P�t>�
�|Ѵ��4ᆑ'�
�.nj-��b ̦����R��lf�Ak�_�����=�Y1��,�7�6��7;j����Ucs�h19�qa/E����
XKMfK_��2uGt:ƽ�}֡r����^L�Z�Q��A~�;E�� �����j�'|2z�t��
ʛ\�v�-��f���8Sa��%0
x��
�b�o��]?X
���j����H���Bh�ؓ�X��=�;��"�;r�V��TLc?{z���-��3-��~��(���v��}���ǵ��҃)bN��	�1f&�Qs6�����U+�#�0�yߛCGg��Y�9ڡ��O�i	O��pAi)LJ�5f\A�)l���6v9,*�غC6���r�15��?�`���r�?�S��A���6zӔmk�Q�Fm��۴)��(�b��ܸ�a���^��Tv�Y�ț�����K���9�
F,�P���>��$��ӽE���
��qw��W�V.��Q����c��?s��r@'#�K�!��9q���ň�o�Q�i�+�����-��iЯJ�II����}la��|����O|�hJ�2TBx[~gm��ȍט�.��J�8�pպ�Q�R��I8����>}B��{@�e������/x�*��+d�}!�Y!�7&&��|��Z�����2��a0;��=���q/
0����W+�/��&s��N�3����?�D�PZI?��}�ó����~qǘ�Ѕ�����aJp�1��ۿu�d0�Bxц"����h
DZm{����ǿ�2�`�q���
G�S��IvQ�+@߀�{՝7�����_�q?���r���ы�V�)˿�~�]\��W�?} ����__�y��[���I�x����#�;υI��~Ď��ԏ�M�o�;?�e(�(om6v����X�/��#�f�$HO$g��iف�;z���������%
��7�Q�9^����nLNѡ|�)ݘt�h#�:��X�M��		��7C��A��̞��cՃ�>�5�m�:��>,�M�;vMW��:ަ����2�Hٻ��z�L>�.��#�"h����y�W��0��}���&n�Q��=ޓ
���YN�ې�׺8kuAE5%�ю�	�L��r��|K`�:�?<H瘴��0�����D����\���|�.�b��l�ܻ]w���l���X���.eՄ��}^��X��0�gX�ݓ?��;��3bq�g�`F�`&.ji��\d�w.�����E�&C��{[�>�}K1����q"�;sɻaN�ɟ�e�)�^27��\�n#Jթ�ج�a�f��7�8�uh�-Y%�Bԉ���ݝݙ�VS����d+W�~��^��)�`^� S�~��ˏ�W
ӝ
r��۬��h�qʒ[�Ah��P��Y�k������$cU���Mް5^;��_@��I�\�����������M�A��C)�X���M�%��t�c4�*��w}��惗���:��>��߉����`�/PKE��T*��"x: pip/_vendor/requests/__init__.py�Xmo�8��_�U?XT:v�����wݴH|[�BKK�ͭ,jI*Y���!EQ�#�� ����p����e�BfY6ų�%�d3���I�<%��>%����
w?�(��8��4\MެV�;�VL���D=�ЄU�Hي��A	cxEDE>��VV)���l�X�\TM��0-r�׫i4��e����K"v�T�(�CGV�"�膛d�5��������n*�f2
Tf���8;��֓�2g?���(��2R�j���5_�\Vp�X��jxQJ	���v��\�})Y�����/&��l�|��.��b`�СZ�G�s-�;3�3��oT�JT&Q��_�#�����!�x��A�������paqK��(�E�-'�l�jc��@�����6r� O���c�����MY�B���2#dY�
y�g6��B^�(Z��+�ٚ%I�)b9�Y���yU�rÅ��F�R��|I^�,��z�:k޽}yu}{�2q'an�
%2�&���g�)�#��ivϫB��Q%��3P�k�k����x�k�*�l�FQ�eJs�U�
+�o\A�ҐF.\�
�e�~�0?ޟZa��m�u�YF�&~�#F�]�c�RJ�V�_�7*�y�岫��(��'��N =��ƽ��{���G�k��4vY4�r�]�Oq���τ<!?r%�
���
5_��A��F����*v\�AFV�5h!B����@��輭"qGJ^1%d����K���O�3��-xi�
��D<���m�~�*%�E����1`V[%aK������V�i�l����z�:�./Ȝ.�t������0"N�u|~@�J��b�-�q���9��;N��q�����iy��?#Z�/Ǖ���]8�g��㑜��h1��$#`�$��Y�/=�-`�K��q9��M
��;Ef�Cd��A�z����'�?eC*�6�c�V#FIEBK��U�	3�
վ6v6���d�r���`���9��-����
�[
m���2
�5��
�G{\��C��FUQ���M��O(q@���^П~�(~_��C$�����'9k�.�C!*S;n0���|��5��KO��6R]Ci�DD���c=%c�;n�tp�W�^�z�#��pI�S:�ϞC׃qדރt�ﳑ�v|���$ܹ�e��,�5{C�����A/O�1�h!�/pk�1#	�غ�%��f�������/�!�Q�%\����$<���0x!4Ѻ��vx`��Dy���`�\m1��r�;K�8F2LM��.l��*���I�u���u��
6���w4�
pU��6�N�m�v��Ƿׯ�����t��_C1���%�q�R��~;�`^�
�У1��'��cqwcƨ�)�߼���8%�a����.-�L�ugJ��H)kP
$*��yn,�2��ɴg���,v�p���]���'��ѽ�iiˤ/�GŤ����{�z�Zs^�GW������ȥ%t'
��߉I��b����Xgƴ�>���5��e��U�E���S�ov/:ҵ�;�TE���F�[':M~�7�7�|wY�^�[��m
��a�<c���5��*t��w�CO��F�E���/|��]Q{R�u��ø'�;jO0”�W���[p4�^�:�Y_��ڢJ����6�~r‡�X����W���W�?���.P��52�Y�Nn����+n��o`�&:��������U�^CtK���;+R���nep�.x�~�0R�]�{��4�z��m�n�>p[��R`u/Q���~=��(�,����RV>U�A�&SW-GHj��8p6pw^u�DO�_�]�(&���^�/��ѿPKE��T9
�G�#pip/_vendor/requests/__version__.pye�Mk�0��"=l���wh6v)�RFw+$Y�֦I��c�#?~v���!���}��`���;g�,`��2�8�9|_y׷�z��G���0֘^5I��J�QY���>kR/�d-G+����
5�z��^iX����.2����/��E��n��V5�
�'i�#/0�]{��`�k�Oꈾ�0��J�~�W��Z��{z<FJ�>��

f���X7��#V�Ɠ�a��|��7���M}���_�vo��|�b�4�PKE��TW@�yu'pip/_vendor/requests/_internal_utils.py�T�n�0��+Bra�У��Zm
4m`;�$Vhi��H���B��%%9��Ay�Drgv8�TEL�w�ƚ$Ң��Ν�a�δ�%���v�s��BI���F(h�,a�;�v�r�}%�
JlQ��$���A�����*�[�b�(��mZn',"��i������V
$�&�['j+dn�f,�<������<[�g�Y����_��C��c��6���\����W/_D�#��z��`��?��ru���6Ϡ���ݡ���rE��hl;�&���1SxF�dX�ۣ��(��o�X�;�*�܊[��&�_S@Y���N"n
!�I�R��Q�}$��W,��Ậ�P�۵�׬�ԛ��Z���[)"���x��)B�f\�iF-��cK&�
��<�Ă�r�%���3����,�deUM�N)�^L�ӄ�؁0B�e��u�pz?��T�>&,bm���$h�x�O]�CzW|�P'��˅Ƀٱ�qg��Z6B��:�* ��ҭ���0����aL�'M[Zh<F��1�U���[���-�1�p:_�,�u��2��k�^�f��W+��R�w�H?�{�
�>�o�ݙ8�'�9��<����[��,�2��NC�r*�PKE��T��r�S pip/_vendor/requests/adapters.py�<ksۺ��+p���Ȭ���Qf���S�Nm��i�a �PS�ʇ�L�ۻ�x AENrz��V3�%r�X,��%�����EY�O��E9�g�3ܬd��yR��-��2+Y��*xVn�bf8\���XY]
���D,e&<K�F#Ĕ�E%�C�e ׄ+/�
�V�g�/�D�����)���GO�e���Fn��^dI^Du��r�c$>.Ć�2��$�K�����(�b�N��7r-򺢋������

b�d���g�=Oe�J�D(4ޕǠ
|�����i-�2�k��JTŃs�BlO,��o����I��c����4?��
������te�x4������dc�3~�aV�^�K����8<�!�x
M�+)f
���J�f�^?ҭ�^�z���
/J��B2A"���O�����y)1^��Js/Z�kPN ���n'� ,`~'����Ţ�����s��O��r�k���i�w�D��չw�z�k�]� ��ߎT��>�*���#֮D��zQ�EÚ`�d���x)����j������o�o���ۋ����W���_�f#��h��܊Jm�����y�n���zԦ��Dv�X.�L�D$�n)R؆�tC]�`�~�S!;��)��H�'��Gh���<��5m�V���vF����!�	��xq[N�?�m��X���K�OOF�ײ,���A�]�� ̬�78m4�
����<q�ٌ��S�_���_O���#{�������.y������˷7p�"9,R^��Hű�zp�7�s�:���W���4��c��*�G�EKg���8�����d�@�	�����
���2'�R�0Cr'�^r�0�)j�����rl�_��!����JP66C$:``��� S�X]�50�cn,�)��kC�!k�Ĺ�6֟Z�`s��
��-�j�S6��$�t���ɨ���)$
!�|�0�ʷ,�aj@��")Cd�(������WH�n�=^o&�"8[�9�
BOǦ�XN?�t\e��x��������8R՛T8k�6�Y̓�X{�J���J��T�l� �ۮ�b�(�R���m5{�Bc�Hn����5	�\Jx�^�qA�)�5��\E�����y�%��OV�é�egW�x�K��h�]��#c�Y$��Z��D���Y"��q��H�f��G�"W�Zf�"��B�`�A"�X
_`�6	���B��	�Y�\pP��h�y��˜G��c�ƞ��2�a���0���#�Q�oE&
����y�%_c�
FJ�"�e��,TƸV)�q�s�lN�Z���cV��"FY�Z�V���xe�S�"���0�V�-�V$����4��N���E�]�UY͉�,I��^�a`�4�r)�V��Elk�����	~�u�v0:��%��jZ���I��0:}�	�*iq7^f��i�xb��b������C�L)��������g~Wo�����bs��D�a�1s�	meM���*��/-�5�AhA��)��K�N�I#vI�fy�T`�h
���%{�k�q�i�S^C��{%x!�j%$&��n[�g⍋֑��	��>P�����d_,.��!���%t%e�w���ST�rf�� I���0�-!�N��~���!��߹SBd�Z] Di�`*�kp����-!(��j�dUU���~����X$E^� e�,��6�tk]�[�J����M�~��C}�} ��3��=���@��;�\�"�."y։�'�XO.]�l6c-�
�Y`�
P	��hB��
B�v$Zb?%8`�]){��ԮˆO���`jt��a�ܑ@о���@�!H��3ggZ$eN�cԞ��1QZ=k�]�������uS��w�	Ui��%~�t�N(������^�:��}v'*��0�_�|�=gO*0�Ł��	f�쉷cOT`��>{�ݐ�@�S��%g)_����x5�fX�8�F.� ����s���ʚ�c�yV�=��B�Ѹ-�]�Ҹ�v���1!�D��E[�,:GL��T�zS��w�
��4�J�	�L'!������FN�IUA<[�/���8�5S��|�2��yJ�4�����*j��	جzN�VG�M���A�Y��v���������:�t��,�"����� �� �
�Fj����Y�N<l�����P���H�
'�p���jG0\�E0���*�Æ}�h�m��0�!+�ڞ�+����&�r��b<��+��1�߿�y�R�|���{�.�j��ʃ��:�8� U�iT�)���ȭ��"�=�uLm����C��𰷺(wSZ[hڎ�L�Ϋ�6��*4�Iz�U9�úyOL�-�5�߅|G��;Q������/p�EUne�
��<l9K����4	[H\�u�#�:~,ep�[����ǩ��(�Y�#5�3��X��a�D��w`�~��+�WԮF�������|���x�ϼ_���oG�QN�PU�J��&H��=S�W5~߀����j�B�Gh�\�2�W���ρ�J�E0�&_H����Q%X|�N
�K��^�w�L��T9�U
��p�&)�
�u�݀Y'���x����fس4��;N+Y�C]↭�1,���7HQӠ(��b`4�(�3�ބ6k�v����G�㝳���o�K���dn��T���5U�6?��U᥄M��e��<�Ȅ��J>&l؃L�CX�)�dh�܅o�u1"p�(tÓ�+�'�������a�3��Ld��
;���~
�vX{hӄFwG�,����tl(�G�;�@*?
1H�X��Bw&NsG/�p��L�^軣�a@K=����fk�/��0E.ۘ�~��Ã�N*B�J��e�~��
*Gh��#�k���Z�^ch-f�~=�PO��4T�lC�Wn����b��8�6�x~s��)��)@�<6�4ъW�U��P/ģ� Lv�NW+�O�5�3�?,*�
v�N;t��̶|�U��I�|q������c�#��g�i]�j7���,��
�Kׯ۵9CTH�T�
��nu��%�5�̤),ʦu+0M��ڼF�i50���؛�ZT�tjf1�tF���iw�|Kgl�&p�8�oh}��0�#�ݏ(y�?T�l�� ��~��{2�����]9c�˶�TWl�iF$�u�s�"P�=�a��� w������4,��Z5K���!��{��6Tj���hc1q�q�b��V�P��-�;3��7LY&���6���D��^@�����|�֜c{�XV�M���|i�vȊb���ӧӮ�5]�X�
�CU4�y=�#w/ǞƩzb��B��p�Hf)���cc�T��8T~ё���VyY�����pL1|)/�`��"H��0@ek������i�?�-A���bŐ��K�S�Ȯ[T��v�(W�Ҥa-n�O�o�I;`��)j�l��`����	��:�i�������$�E}OGA��'��m~���,Q�KT�=��*�2}��`=��BdU��{�aiyLI���F��V^�—.j(�nsP.Ct��Y8������v���'��fmpY�i�A,n����xy9�Gh*�����k~gd�r`��G��Nl-Jl�A�j�a�N�׷+p	�9����Ӕ��㑠E�0b��m%�o���G������?TGSdP-�"����xg�u�+t [Ot��7�,�X�1_�h����˲�}����]����X�P�ɱ:�8R�U�
E�����G͍K�(�g�t�ώ�q�b:щ
������w�q�Te�5����[��.��QS�Z�CP����>~�L�3�4`нg-<�w̳�����$�	A����A�
�IdT�`�\;�c2�Ϣ#e��-�b���P��N�&�������B&U]?Oh4�bs;l�R}��,����D��w�m΄�1(��a�I�V��;�!�/���m�lZ�a4*���
㹔�U[��+�	��q�V.���@���؞�$49�!�
�1�X�Â�X���笪AH|mr�D4��'7��%�,�N�#�W�X6+�䮜7<(HM���{��ks�Hߔ�I�
)x<<,y!���!����u	�[��V��Ѫ�x��5�؇���y�}��`��������#��گ����{�g��V�nwЭ���>���.����kqf�o�C�m�PM9^�G+֥�n��]�����Aj�wQH�ǿe�eP��Ԅ�{����8;�U����HCWuvG��v��yBMt4[2<Q���\d��j�Jb`m���fnV��A�~Б'"Jɐz@H�:p�:@��0Vm桙�~^�%����J_�wp�E�R�I��7�yԌ-$1���TY&�K`]�a%�6(G�m�}�\���Y�n���llz�t�[��V�h+�S�aVL���ƀ��
̨�Fd�Q�Z�JD�g��?�gf_%��F�\���r��!̐��h)lGK�;c]d� "I���]��PjH��T�1�0�N��V����k�O���c�K:iT�}�23�o��d�G;*��zЁM�m���ƫ5���v0�"
�6��wrC{��1��oȜGڢM]i����g��O��[Z�
�=�
���7������\�硡w��Uj��C�3�Ri|�:�KZ�=��i%>�R�Yr<~�l�^x7���=�̇+��
���o�a5|p�$ga��moD��:l}@G�|��E��ƒW~�}Q�zN+����P�~�FCA�D?H���;��o�񳿭�qN����y�G(�,�d���|���1�H� s/|�B�BڃR�)t*sU��b(3�5"��j�2���06���.,�4U#z�#�`��kL�EQ�2���F�+��y�$d/~�eO��m4�����)��:'
���Ώ�Qt4�����>
��Vd3s��i=��c�&tw�k����z{�^~�L��z�i@�a����^��׺�a�O�gϨ��B�_t�_�h����C|[��M�����x�}�bYO�w���f߲9��	I��T��8m����N�Ĥ��a�f�����xP{���[Y�)�h���ҊjA�PKE��T'���[�pip/_vendor/requests/api.py�X�S�F~�_��>��8vJ��	�p-Ll�M':Kk���S�N�N��ۻ{w� m�&������w�}�Ct�ݎ�_+4֌D);^�t:��4����d^f�ca
��˰�ϏG�N��r��re#�'�y���7�#�-���e2��`��HV�3�'����J�;���23�N�vZ�0bJ[�`�T��t:). ����F�C�t6�'O.�B/� �}���J�(R2R�tQ�	c�8������[�Rh����_��P���
&�8�~2��!]��ώ�N�������:?�������/�CNN&�IL`�a�Fp���1(Zݷ!�Ti)�"��Lܥ�!��[ӆ�7�.�r�r��#��
PPe�l�܄��
+�}�}�0,d�O3y�
�X
h�ҍ���7F-����씌i)2�V�I��b����V(R��9�8�����/kܬ%�̃��.%�6�A;p�~��	g�c~�8�"�^�e�wd☶�xo-q�����Uf%���E�R�=W"5$��v�LDs�����y��+���sB�;�ܻd�D�J�k�)�G[�������>��2V���z��
�K���t�U�'M�ʘ,8LK�����R^a���m�dV@J�8j�ِ�vE�J�c-��7ɂ�6��>ZB�]�s�b����^�
'�ad2>�K�������-{V�*�2y�֐���	�ԥ�ZH۠�ļB�H��Hs�9.�cP���� 8��z>#��(���e��0��!�U-���pe�b΀��w�ټ[ҊX���k��Ԝ���P*CQ�`��6N�q�F1=b�MaL�`�Z�ط�17
�����BP�h��LW��	��99o��~��|�,�EYrHi�U������'�-lZ�Mr�i��P�A�a�?�"�^�dE9mh��R�*3�6n����GQ#������V.d",�}f��"'Q��Q
�j����}�WE�U]�7����E�:�����r`�MI��6��2���s���gHպ��i����n����)\B��L�e^�DTb>��f,�!�{��jU�7�m�:��h+M�p����^=M�
,����^��#�E�⽽�zp�7\{B�`wk���z��uemi���)�/�m�/�����/{���|/6Dl]f{�{�!1�;^HTGLE_^hn�䂝d�`�|V$Q�ĕ�)��]�1*�D�*q+=h&^:�8U���dR�Qym�eJ�W��:7�B.hܤqx�N.y���0�7���Yx4��W�p7jT�)���#���y�==��B�w��{�
�5ck��4L�D_Mj{��dG�WO^��Fp �^�U�FD� �Ù�[q��'XKЁԚ�.��
�?�'�s�OCӿ�U�����b"Խ�:�C�Cуб���Q��7�7��r+��)W9��Q�{C�h�۹Q�%�z(H}����I�@ #+��J�]�|PF�7�wo��t���7�.�霡�����B>\y����hߡ��C��M~u��P�ĩ������T��s�b.��Lu�^n�D�d�^2�W�/B����x�TR���Ç���G1~��a����PKE��T8wf�|�'pip/_vendor/requests/auth.py�ko�8�O�{k+��ia�Xd��6h�I�CQ�E�ldQ%�8� ��o����8��a�s�D��ys�(�:�}/��*���w�~:��9Wd!�2cd"rMy���3��,�|B59��<͘Td*$9�;���E!�5���?I��\2��|V��jqIeK�3�bA�T��gĭ����|"Rֱ�q�s�dN���<SN�$��Y��D>z"�1 m����I)��J�*hq�YE��hI':q���J��n�$)�9��N�dz˓�����N�_?�H~?r��㛓7dD"Z�����`�\@��Hd��FM~y�|:>�D�E�i\���J��`�Nʦ$�]�I�fD]tK��Z�>H��Rȴ7���	ϙ.%؝�_�����n�D�`�\�<D��Ԁ0況�v�wp��EAĔp47�W�[e��/�1��k.JI�KZ.�d䖌䌥��d �5s�@l�&6A
&
pV*8Vv2"S����g@ޗWTQ�ƽ��I�7g�K�Б��cr^�*b��y���G��CIƯ$@K�e  �װ��4އ�ʧ$�}
bK�|�cԾ�́	1>t���Zg"X�8�� ��gL�$�,�%�,>^IԤee$�2R`�_3����76��V����x��Խ�����Z���J�j�ɑ$$�3*ɴ?c�M�O�4
)�[�8�ѝ�����7 !^�L���~b���Vg5`�z�T b�H�u6X�ȟ����k}[���9y2�FU{�9�SP���ke��Q$�����ͮ�(�򃨷�^�Mz���q=̾����fֈ<Y�Q�UU�;��Q�M�.q�z1�]��L�,�yB�d�`�90gU��Ÿ�Y3	��w"V100dqc,��L��]ULiI&��$]Ųi������3�O=-��H)d72Ee5��Ra>'H��SŨ/'����OFW��׵�Xk:�Ln�z�*���3��.��qk#<�������xR`�k������s�˲fJ���F��1��!�'�_��`���<�ȺJ¯�'�5�`w9۶;L��,
��*�ݔ�b�HH��1t����s��7w�k�#n�I��[�v
'��{|���Gy�cvk8��{~�g �b͂����!�+ qC�*W09��(à{X��Z�X�Q}^�͛n��f3@գNfo�>v�j),�Ne�8�P��aPi�*Tז����x�H,
ح�G�`��KY�m��:ɍLP��m�Fe����O�F�w���3�V	�E�l���S�Si\�,�:�;�9�[0���F�����!��zO4[`��~�_"����u#���Ij#x9�HT�8͠��z��X��EA!z�aZ�
��p��lh߹p-�>�6�5	�>�y^��e�!��9�V��b.��qJ�8�T	�Ú�
9�9��:� �
5Y3vͲP�������׃����h�iH��H��toZA�8��M��?7�ᛪ��������w7���9�brc��:�yA�*����M�9��6	��K/�]�m�)�����?�]/��??8ܰcX�Kw�d�^����lJ �O�a�ҝFw�~x��G=L��N�'/�4rX�ams"7S������+�!r�tm�\Æ�U�H�[?��b��	����"n�;(%Gc�܍~}M���r�'sЉ(�Ԉ'.�(�<�pCJ��il�C����P�:����'#2�~�k���� �]��ś
	��}�����j
��.$��P�
z|���k���]]9^[��>hkw�@���*���F�'�43�ثm#�p��M�3�F(#�6���]ȇAptO�ww1��R�<����5��j������h��o��[����a	-��{�v|��F�7]��G�x:�c��vMz5]���d:��	K�*2}T�ݸ�cө��"��c�ENO���K�Deow�h�soOp���o;�\�^Z�9�5g��&{�͘����jD�3���!�vN���/��\"����)��mS��mn�E�\1C���>�1z���f��Q#1f�ݾ[B�!�6Ǜ	T @�zn���d3
�b `[�+�����z/hq2������H�
F�a����!�``�-�,�M����O?��L5�d�L1M�'=�ĘīOF���
�&c�*&�3q�$y�"/�n�z��WL��TH-�z��e������\�џ@��sGd�yt��Nk>� `:{v]Y*̳����/#s�5�ۛ�_�c�'�+�t�s��p�bj����D�l����q�Q����"���
U���*�aH�v�ڕ�s��M6S�
���X�[^AbS�<��\�`�
�{is߉���SO+M�5ҋcW�j0��G3�#�z�g�x\��$7jժȺ�)+�L��%����m�+r�j���<i[
��Avf��A�]�" �4�35�����>���>�8�m��D+��]��r܍���mߦ��A�u �!�!��πwҨ��5��>�|�s�9�p���f�N�7�9[z�[?(��I�8���f���B��X߻�D�-���~�E�ؿ��$�#]������4)��h���ۭ�����%?m3_�<Ӏj��H���41��6H�-�x�q�{Ӣ@h��
822t�%�D>��lNZ̈́�e�Y��Si3!�@S����p��	��^C���B0����_A�-)uӱ���� +�˸q���S�����T�,v�n&���XC!����v�?�W��zH����7�:��rjk�/b�NخJ���R�MQ����?���>V<w R�L���S�5��\�*�=�-"g+��q�s��x^�v#�'Dnqz?��[�ޏ�σ���M�PKE��T���pip/_vendor/requests/certs.pyU�1N�0E�9��EZe{�-�����dD26c{!
�����dC�T�H��?��J��@r�8�!@�4��V(��v�9��8
�p
���J��$�aT�Jy[ƌ�� �sg3Ṉ���@J�	��3!���^��k����h�W�S��qmM_�,=�lm�Hm���E��,���|.��ຟ�T����d"��Y�n���xU`�k���xw�9lƕ�(Z�Z�[C�o��G�*�ck.$.h���S��X�h�؉���c&�bLsX'*K�m��PKE��TɊ[pip/_vendor/requests/compat.pyeTMo�0��W�a
�Cs+���mmt��`�6�(�%U����>�3�*���%��BE|IHLY��Y���~�
A�dBģ�l{�*��:���g��X�
"U�+��
ck���3�c�Xk��>B���W+Rs���X�=��C�B>b$�]�҃�F_C0!ˏ�*	�U�EY�SCJ����/�.|b>5��	(�t̔HFش��pin���fj,;}R���\�M���l6p}�ZO����n/}�7��e̚˽��')YJ�x ��.�k{�K��p�t�џvQW��.�����x^)���u�������K_�}l���Q���5%�76_�+��Z,YF��N��r�}�����
�u҆�[π��=s8?@�l�#h�5ř�����{	m7~�>q��NjWr~,�q���:*�etZ)Z�7:���U�T���$+^��<�D=N�"8��p�n��M]��	�q讞YɄ���Y�ß���r��$3[��stG�����N5o�[C�S�M^4A���E�J�X6.'�~o��*��m��V�&��ݔ���Z���r��hʜ��񯌈��z�K%6�0΃K�PKE��T/P����Hpip/_vendor/requests/cookies.py�<m��ƙ�WLi+�2��\�zI��ō��B�#-��ΐ+����6��Ү�8T@�g��m�I����tڶ6͛������o��>k�۲*ۣʛB��Q�Ze�}�Vk^_���7��3�V���S~��~��-+��ݾ1�U��ԝ6z�,A�3�7]��eVz���fT�.2�7���ޖ;}qA@�UY���Y�
��W5��W�5e���9��&�j���B��Z$�U���ԅ�.Tg�}��[W�����.|�nwFgn�?�zߪ���4&�Xt��q姫�k/.�*�����0#y1�������sXf�Q@�rW�8
Hڿ� p}�Y�e}B���^�-bS���,���)��M���S	�.���V�}S�9h�B��N��aW�Z�t��dj�ըV��հ�&�E���ڪf���Z��.�7�(jL�-A�~fs�T@��ESWǔi�J]ˀ�7�-Q�7��Uk�����t5��z(��[ݮ��J��k‰��7��1�ޔY�q������[Я�:d��cZ���f���9�N�L*���yٮV3����<g��>OWF-��`$��|��ǽ��N�g-����@��qA�q�
PNt���+�۞X1�m�۪�c ,��x��{�c�u�U�j�����Ł`�#UїV�}�*Y+�u��e�:LϾm~?��`aݴNB�H�%�2	�R��`�$,��(ھlQ����V6�R��5]��m�v��yh����U���c,oJ��D`�2��͋�L�ɯ8�B�o�!g�	�@Äz��E|z���]�����SYa��̠�v��0�9�ݘl��O��-��)7%��}m����2+�-Ρ�vz���;��`(�nBn+�v�����rJ�y�h�`L`��dE�~����U���.}`C��ͩJoK��S
�����BRS����f�=Z����B5)�_OOV��4-��J�,uA�=VȄ���骂���di�j��ҐQ:��ɔB��
���Q(���݀q��X�a\;�M�Z�_�i��4�`
�|~
�gz���p?'tD)ǃqNv׶{̧���~�J[��TZ��4�z�/���iz���߫�3[B�[�^�#l@��;�[E�^�(��AD�E�|�rȎA��v
,!���3�-6�W�=�r�2�p7��/�?W�=�+0�/�C�QVͶ�,��(i�["2�>�9.�YŞru�A��i�,
f�<��?�&�]�gWc�gf���m�%7��G^�����tL<��ޅ��g��JM�j�YH�sd�)!�ɔ�	�O����+��C����$��1�:�$d�-�'FI�fೳ�53a�����W�a2����#9��g��l�\ti�r���`o�~P� �e괙��e�=d��6I5�h5���0��#;{%�X�
c1;Cy��[�T h .$�s:�B"��U���6M�A9�[P�(�)��u`��"b]�
U�8f
N_
V	W�.�̜c-��A1F]�Vۤ����m�7q,0z�@�+�n�+���$fHBBY3�8�ib���o�����ۣ,�/�̨=5�w_���fp,�M:�4���U�Y=O#�(Oԏw�Jr5K�"y*zsC���_,	͸�����N��eD�i'��1����qxH�=�a��G �<H�j�b6�Y��!�.�D���<�e�=�	�Q��xe�.��i�MU�����j�[я^y��+�2��=4�緐@�*�en�ҥLY�5�¹
�7"E߂�BU'��V��u^u�v�����F�[t>���i�6
��H3l���:��w�
�T����N)J��=�{Aسbއ�2N��
�E�1@��'�\�PT������+��u����$K*V���.A�9&`ݞ��@�´�k��]�A�}t���-�=���k/�z�Y"��C�er�
h��a30U_UU�
�J�rh�=��&���C2eA�h��Dͻ��o,����i����	`��SY����m]��m��*�g�TıB—}�߃E����r`S��]]�ř9�fC���#R���zNR#�n���~	����a���z���	�ꔵzp�jA���A#R��Y�NS��Y|�~���<�QBa�S��G��sAiA:��K'�s�&w�(��R{U7���d+C��0�2�ޑt�G����H����*����t�k�L���w-��3�'��7�)�5�1�\3��Ě([�'(k�{*uu�"ka�`�s>Ə���K8���"~����������g�_�!g���eL/�����Vq<qK�5*��ϲgy?$�4�1����i��$��`0��P�Bpy"^�݉��+��f�ظ��lI�%�z�z�I���y'N��#�YA��(ݓ4+0�v�\O�v��!��������1��(0����,y�O�0�_%�AK�	�����sD�g	4&�3��P�=&O��Q�|�n�������0�YMsqB�O��"S�ȟ-��J${�.$`{�EL�f�ƕ��T�xhY]VU����κ��Hp�g��OХ�|�T&�E�K8��(>�Ʒ-'�|:�ߐj*�s �2*�
�~���oHV�Y����`/WwG�GQN&�@���g-;��I�\N�'pc�k�g�B8M��vy�
x#�|r�,́a��Cp���U����a+^Zn�MSMj�ϩE��`�~����1��k(�� �j�(���0�.��>������'G�_G95|?]'P��9�}��7�_Ǟ*��°5��ѕ�)��}e$��N��<Y��^�$r��I|�n�KW�18XN�a1���	��x4<��B�@U�U�yvQ���� �du���<7� p�͔Zv�M8	1>�_�@Q1��B,
���Hs���B�w��W��#���BP�:,^	b���5+h���*��g�j����f��|���ğքxJ�ar�Npw|�>`�_�3������j�K]���k�x~��v��S�slX�F�*t���J�:8���z�'o$�/{�����9v�e>5=�2��
��T�X�O����Ef�.C�P�m3�Z����DC���3g���#�!�ML69��
q'׳˿�=�<�Q�t.,l_�`K��n_�A	)��v4.WL���vyYM�.>�83%�{hUpo�ף[�hF��AdԹi���&����̇�j��]�'��`����ނ}3re�~�<�X/�2�޹�nI��ߖ���]C�/th��Uk5�H�
*��
a�wj-z�8|�j����S�אf	���\�ω���DR�\:6�!��I tye(ؚ��s��/��˩\���\l�Z <!�^����h�nӹ>�l� ˏ��/�'o�/="������dhN�����u��֔(�8���)x�s.?����T��jv�;����!��z�F*�³�)L�����4����R�%�Ӊ�u�6����?5���	l��!V����Z&�ܑ����yI��>���'�Kg�+��-qv~6�ՉB�Y(�W���'G��E�C	l�n;�7��@I���<������I���M{�@P�5��׸U�[�Z��A&����IG�Qe���r�ɨ�Zq��+�Y<�uQ��ԛ�>�J�a��f?K���
�M$�8sP�.x��LrD�K�i�P��]+2Z=�7i(\��t�w�R�U�q�T�
���+�r�ODް���v�[A�$J��%1ޜn���hrPI���S�]x���b�k�鯫P�NOv��\!g\I)�ye7�3��rF�Mt�"]0Lf���3����V��0̯�=� ������ޘ�a�j��yPk�M.�(����˟��[��,����C7��*2�f��O9v�W�䎺`�w,j����Q��'���k?l!�%�֭q+�i�5~{Q^'����KƗ��fE���ۉ�V��E2�
h)��2�P��H'�˞F[���T{��x�$�R��k���q(���'r�<��"�r��ɸ��ùx�}>�:�B�V{0�?�K�zxi��0�-�` ovر��|co<{�ɷm���dʧp�&�ͯ���O,�۬�{;Kꊉ&��>wf+Sۦp{}�뉄e��:;W[��W�7���ИŸX���e�����@����myG]y=O��=�p<��װ�ϭ��^�Y�*��V���$M��R����Ɠ��}�g��NR�,F7{v� ���/������÷*�RmS�/�5��R��yX3��w�.��"����̑A���SH�P�_ғ����oh�Sg�8 �j�R�\�|�\�-_-�j#�N�9�	dWP2�+����B=/^<�}�G��۫篮��U���ur1�ٽ�O4owL?Ԣ{�h�E�]2b��K�?��s47��t1Kҿ��y?Y<�r��$�v+��/�D/�o?@Y:�K�F?@ɹȦ�)/co��p�B�_g����&p�����O�� ~>d��� �Hl�Xu�Ū�+g��R�
#5��J�����������K� �U��g�}>�-e�_r�?�_�
v�R�/�|)w��1@n�N��D�
����WAg�9��7N×��&�ᩋ`��H���ki�z%�̨?�ZXЇ��Qwg��Y=Σ����c+��>�h�{{,v��؞z�%���_��7��x���Q�芪���d�k��N$������|*h�	�N���of�Q(�f�*�@W��`q�@3���z��<f�p7��$$��������p� �#[�fɏMG�_��A�Xj�+�hG� �0����ʆ�)@�wQd�A ��<�����II��ӂ���,o�v*5�8�>oD�q�� \~J�PKE��T�@2J��"pip/_vendor/requests/exceptions.py�WKs�6��W��
/�e��Dq&��I�Vۣ
+1	�hY=�ww��פ�E�����C��t���
C	��XF�l��8�L&��(��r��٨�
3�����+葒ɔT��+�4e�V;�T>����=�`�����o7�;*�{�;��0I�R�V����_>`�4v�"0z1�L�\��Zy�j��~�������#l	IYP��l*W��)��4��G
��P@2eun�v����5ia'�q
��ƚ��8����F�M��7�[~jinݒ�Q��,���<5z��ZͿBI��'p��RZYuؾ�ߠV����M����8�ם<��]j�b���`�uoʺ(b>�@�a������[s�buĚ���yozU��]']6�y�(sk_(�%T��3�s�P��RDRЂ�x9�Ϗ�W�pU��U$*�[����T6:����d���4
��ƨ)��x
��P�yw[8TF*Nr�
rd_:@nj�����{��ԬMZ�W�q�\���}��
��Թ(0�!���8�$���d�ȑ�$�b�}��q��)�u}�۬���e�R�k���˞C������c�,u����%�B�0��@W�3N	�F��5�|RW�B�4�y��j�&�!��r1����>�82'���i���ܣҝ�(
{#b��ֿQ����lFS�;�R��q�1ʅ�E��{����,�*E�"*Bj������qv��Z%hӶ|�Uew�UT�^�:�(.F���UV6�l@�?�?����q��R�,ͥ��@��IS7��r�l�GM�4Hϱ�1��[�ҝ	�2�fX��9���j��9Jlo�K3L6	d1�@)��p;5�@]�w��:���"�:�w�_��W�f'o_�rl�Oj����\��۶
�i�D���^vZI&���6ix�T����uG(n�Ye�Q�X�!��K-y�T���i
�`����]�K���@$!�^'5χwo�GE�D
�Y:�
.�q��=zT�u�S����X�@XѤ�t�d#�	Z�d�`�d�v�]��
�V�\�nC��Z�t�qk�V��;}�뛜jWȹR� ��.����Ί�~����$�UB�b�|�J9[9���7a�H��Q�Z��> m?4�ȡ�h���ػ-S���&��U������.�H�ϕ��� G���(S�
�L��B�;a�`����vx',df˾�J� KQ��e���zl�PKE��T��Z.�'pip/_vendor/requests/help.py�WKo�6��WLكm��� �]����Hv{)m�1�TI*�j���P$%J�]E�ď�<�ypfD�,�`���P.�x�e���Rذ�dj�g)!$I���>k)���f-�6�ֺh��:I�Jn��e��2�K���=�TQ�兗N9C6��YT#ƿ*���$Ym���dт��\��,I��/��1�V6g&a�+V�i��JI��?+L=�ԆT�e0Pֲd��瘉�#��{$=>��V�.�|R��ԁ�
͜��O�ӽ�$Ir����2L��NgNf���J	���7n6`6��H}1�"��4i4,�|�9���nY�gx^���J���RH(jP��ՙ�o�3�N-�P꣗�H�9�n�V���(�M���%L<�d�R��d��p
�J��ޤzѰ�B��YG���.����UUP5��K%�tY���i11����N~�QR8u�T�h*{EC��EUodU�h����4��4�[I��Goh�B8Wom�n��+�Ӑ�Pq
�Z��l@�J�E��G�W@|\�+���pG��'�ߊ���s���>m�Hj�P3me�{�-붓p���>K5?���sWJv������b��^Y?�#k.h�|�m�>K.���ן�E�g���Sv:=��=�?�Gi��O��I�����vz:�_ŋ�o����z��7�r 7�%GGA�޷e���b�)jXC�Em��N�a����N&�
�7�EĻ^R	V�a[���Q��~�_1�'Ŭ{<7����o��Q=���>9�Ղ�q/��~P�p����v
����H�qm8̈́>����<�c�1zo��A�z���8��� �1����N��9nh`̋�`�3��&� f���w���q��xs��}�����}O�%oW'C�İ䌚��"��Y/����2�R�|�k���ߏx9�=T���F�O���&!M����"�}�1v΄^5��dT.�;;�����*�[d֖��߮ݑ#���.���/����2]�2x���CQ��XT�V`X�q��l�CMFG������CZt��*mF��>�����1�O���m�v���o��ک�pN�i�W�RO��Egc��j}�EU��E�%t���8���GJ�Ud�Ł��q���PKE��T��Gg�pip/_vendor/requests/hooks.pym��j�@�����|!�B�B�6�t�c\bv��B��W�I�]����� ��ϖ��Q�����b]IG]�5Ac�Id�U96���t��R/�0�0�g��	�|BY�~#"��F+KY�Zs����tT@i�p$G"`�/I�K�cC�BT_��.�s�Y�6�Z��B'R.����o xܕO�NVI<ِ�Y���|�q��
���C�����%-�������,�����y���A��Z���,�%[�FR�3y����Ot9�l�r��G{r���ߒ�7�)h�9��4ͱ��4�M��s7�a{����9�_��[���LZ��]G���7���<��S�?��PKE��T�m�ۼ&׉pip/_vendor/requests/models.py�=�s�8z���@噆Je&�����ryܺ����No�iF�E��"u$e�ͤ{�@<H���LS�$�@����8�L���n�6�Թ.ۃ��?g�E����jUW]VT��.��6�&knU}�g��,�Զ�эzg�L���b���N�Y��b��	�jU�Eu���f��Ze�u�+hP��SҲ��M�ͼ7EwYT�u����ݪU�k�����v�WMS7��RW��*Ϛ\��y�ÆYA�L����@nw�K�Q٫͹�s�����e]��Tku�u�v����;OW��Ѷ]?2�{T�-|y���<K̈́��ڴȫL�C��_��z���o�M�QEmf�jw[���7[�d]QW\i[l�ŵ��IwM	x��O+��:��(���Х�yϨ��zE��fM떿m�^եS�px�S�:����g�5κ�en�"���)��n�Z��b�+�b�5�b]7��lĮ+J�|�\��Z�(*��*+X���`�Z/ڮ�ř�]UP�E���UQH�l�]�F?����}���P(ρ�Y�EV��y�u�|���hA~ɶ[�~�g��a��]��ph\���՝����v-�A���+$b,-�'�9X��؞���TG�vaѶ��,��z{���ş�f&はl�ȋ��Н�t	��6F�/.wՕ�_�^q0���*�,��/�t�Z��F�ϓ�:+�� .}�����Ȃ�C��<�0���Ro��Zfs�=���Fp�
 ��mqN�K�����u{iA�R�`�k8|[�~���n����Г��U[�y	k,u�]���Օ,��]t��x$�QL*@kRSn�
�l��2$^عk.+`+/Z�����UYTWR���\��9��f��s��Rg�E(��"��-N �R��\���ku��5њbd2�X���U*�m���
0���[l�mj}��F�
�vz���˓w�^�-NϞ���c�I
2�Z�3OAb���zW��'Ny
r���Ny�q�@�-L�R�7N%@�&�`o����_�z����g;ޟO~99��>}|��ͯg�~=[���\����+(��z�=������;��w�<988X�Yk���_�OE5�a�0��n��3,:�N��r=�Z�-�9s�K���
���)� �&4��?|�K���0A���e�<Gp�j��[Z�A�w��S}���4��+��p�:�"��������d:��Z:�4vtHJ�\U�O�wH��j�A��-�"�a�e�6A	죚�
��5�KQ���^i��"�SQ��^!�w�DһHE�9���0S(K�E�;�ZpO���6Uo@26��A+��w�e��mµSYs^t�\T;�����I�N��mZ�G�r�	Q3���V緝n�S�dH�1e ���2k��k�u����bA�r�oA0��c�����5�^���Ӿng�3�EÝaƅ�GGe>�=��=��]�خ��0�k\o��׺�õz�M2Z
?����*e"N& ���M�V���)�#W�;�]��څw��t��t���2�0�f*�[���f����z�$�NPƷ	�?S1S�y��Һg����8��-�}u�5��+9�ߐ��n!�Ј=�=�J�vDs{:SOǟ��L9~�u�����]��(W���~�p����
 �������5-����@�_`_�����"f�𕻺x��C=ਠ�LqK�Ŷ���BlU�ڲ!����e�T���u�\*�������Jdeܙ?�`�g�~���rU�
YjV���iVr�{0�C�����ᾃ�*y4�v���}
Z��:5næ����أ��X����k�v~����K}'����	H��e�{[��)����ێ�;W�[�o%,�G�.���)�m���x����$�9�_|�C���/�*����
�*i]1��c�d�j��;T�����~zO���L���"2n8�	����+����8<T��<�=8��ݔ�dM���sM|��u4N�8���R��Lc80f`5�l�QQ��}���k(t=�	b���5K��c\"x���@QZ����qM&"-(/�ם_=�<���T��XyK`���Ϥ��t1�Ь�	�?�M�Y�/`��@���3��`J|��-��S�V X�VZB��x�Ȏ&��r{��q|�v�WL�&��
dX%5�L?�LL��0�uf�i��@�>���[VpT�� ���@O�Dt��p��e.�6@_�:/��,�F_��upJ�eۼ#�i*�8"T�it�6���Pj�H�{��1���
��P.�ߣ�\�Y4������A0���i�V������p�����ǥ��Ĥx��BW#:���g��[.�-����%P�e��D��"������5�����fҜ]���x��j`�͍7@��CaXs2&���p��6a!4�l�����/��˖H�:�!"�����.$���N�b����́E�\~H@�&��Џ�%b��
3E֠�ހ���&0j�-���F�&�9>����Ѫ%�Q����r���{�x����1��/&�	?W�W�%���p���L�r�^#	�tӨT��Y�#6��dE���.	��Ѣ8�VW��f�LvFv�����aI?���	D�����@��@������L=0�]�{^Ti�\<��݃�"~`U�p���㏆��<$GUt�EofW��x��&�¾J�v��e��EL�A!�BP$�v����^r���^>��ȱ'�7�����$��%��K��eA�l�x>Oc{se��զ�g���l`~{M�0��m#?�&\��p^���?5��8��(��y�J
z�*�!��@�5^�u��TY�αr<v�!J0���"4�=6��=�U�V�S>&z��u�M):L$�?0l��в�aǂ
��D�XO~k��gC_>���f��Fd)~�~���ɪv�1c��hDQ+�����@pHfk��G�`�)�>�5f�'��k��`��/���8�]~�1K�3aW�ωsY:��RC0+bg�&�NC��Z�3�P�r�]�:�.^vOovE���FX%3i ���5
�)�JV=G�Q@�z"F��/t��F��R\?�[Q�!����ޕ�q��q�l�U;}���������%߭��U�n��@��z�Yd�]�D2���!�;�SM�كզ-���N�ԇ'��U~s(���Q���6u}n�9��������\a�jAn4��� K�O.�����Fc����&3�]\�F�X�sa3�ZR1u ���'f�`��;�L�B�}�\mw�
�sjs�5�F�pl�e[c�ȕ�t��Av}TWl	.�la[ʄ"!�\�5O�F3��W`�E�o�Ra�EqM�Fc��N2�fB�����L��`��d��H-�bb�uõ
�������Q MD�HeDvB�W�)3�@-�g1!ةl#� _H2�(�!J9SU��3稏}r�2[��M�\a�)�*���ad-��yz�.�1`�)���`Bʴ,���9�vڂ��kT�H�����p�K�lށ�<f�m8��g�.�Ni_�ط#d��w[���i���rݡ�l�������j��
�u��d����q�[�q�yj�^�� S���[} a�r�<Nwۭn��.L��Dt��ȁ�ɦl;g�a��ѻ��0B�Ab-��"�]��K2C�/5>y���!0�s�&��+��ŋj��EYFz�eEO��� c��h�މ���ZK��½�Q�&F��>�O�A�j/q<`a�eQ��-G�%���V��к���]i��ժ���aw�}�n��<��Ŗ3���'oXw�k�}����g.�:qB�P��:�e�V=
�	s�$�'�(��J`?��,��m�&����KD�6� q�B���eg--?K�5�YTG���bH����dE��˙j��r�t��")k03W99�4�%�fA�&B�a/l�޽~�����a�JGtO�t���5�܂��gm�iJ�^�JH2���P��~�9u�B��-�}E��F�Y�u�� B�L�r���Ψ�s[A�h��
���
^zK#��C,�!�|4b}��P�Ys��Br���Z{Y�qZ�z"�r>�P���2�- m�W�&����2۶�ށLK�vl>���&��wLy|�Ġ��&ޖ8��;�F��L�`� 7�iq���(+�C�=�d�7���''t�%[�B����������\y<*@�Wu�Y�4��[Ի&U��$����Ra�4�J�U��m��s��u �t���+�2�|�gǒ�S`v���9��*��?i�z�)�P��'�H���J��5���
�rD>��KLO���0!�ٹ.�T=��e<���d�&Po0S�}8��d2+�@ƳJȮtG̶�`�(�0Ƨ�tEz�O��ñ��n�R�*��� �'����ĝ�������mH]v�����D�/��C�/���#5�ؖ��V����T��QL��m��Ɓs�1'֓�����|�Y�p⏁�7�y8g���t[�'^:#���E��i`��r4�5�!��1��ks+��v�I��[�
�a�rP�c��(ҏ��b���E�j0�:�m*p(gr��D�i������J.>D�� �1�
���A�^�ȥA~���
��t��[�P8a�D'���k؆�-��m��g��љ�zwq	�&+��4�tE��T�А�1�'��uB�[(����F��C%�ki������.����Ƀ����n�m8�� ��^	�3�SB5� �ʤm{���M2�c��?�ޝu�Ϡ�9gcy�	��X��Uǔh4(N�%�?���'������CL*�;9�q4g���@�Th!�T`g���}D�X��6�!V3���X��s����3%9�r�y@���\>�=t�RW$�	N>�4�x�V�a�P��=t�~�;{9Kҟ�qfJ��u�鲜����϶G��`ɬv�W�\��Em�2����?�o@$Z7j���=���PМg8B��jXapi�3J �E$$�X��zs:��:Sʋ�Z#F0�(�6�p���T�O8�	��=��KВ��CC0/R�-�L��WL�}EI������8?^u�Q�#�Ç&|&b�sꝛ]GAX�k�k�Ӧ�a���<�'�'r��g�=AI��_�0�0�{H��a*��	��Ɋ�	��:T�`��e*]s�b���I�P=
���=f(�M�����6��Z?�8V�~�4��z���x��������,�C�y ���cR��	��P=�s��u���=#;�I��;��2�d���I�Z�<�(t���,}��#�c-6�별�!�U��Ҩ�H9�&d)a�-�
�рF%Ӏ��	�:�EH �v	�U(�T��n���f-q���#F1W�$b�Wq.�x$1�
�<��^���W�_'��^\
T�$�����Q��NM�
"��ǣ���*�82������)�4t��"��q:0� 8�i<�}x�<�s�8R̔k��Ǔ��/r��_dMq&3 n`�Ϡ�C�2�$��v��%01���^�
�KL�#����%¯n�{��L�1�;ʸ#�zJ$�[��z;�l��<Z@.P�z�F�e��eG�C� ⺤Jf���Q��ݭՅ�m#�d��9T�x/kZ�R�����dYI7-�@$�-�:A5z�}?�=�=�OO�84�V0�����h�+�7f�zk€����3Ωzh./%[j�4L�P����P��eG��!���;
D���1'��a��>� $ѯ�}� �۬D����so�sܙJ��*v�,NȂ�+m�f���D��|u�d��W� ��[|P�y��C3_.�%\�4�so����D�(�>^�	#����dž�����0�7z����&Q�Y �
7�[�y��y��
��.�����s��p?��O�)���|��B��h�i�����#�VJĹk�q�՗t}$I����A�-��g��9Z��mq�H*�:��ctf�}����u��톷����@��=D@ި�^��T�ƽ�as�2����ὩsȎ�S��>=XRWm�� ����}����	�p�HS�	+�	YI�X�	�.x�_\Þ'�Ki��m�]�E ���޺E&���CO�S"��5,�-�ߎ&&E�N�5��f�惏�O�/�7R�(rW�Չ$��@�k����%��)�ԧ�"U�>������A����>0^qT���ˁ���S�(m_�mن��˥�
�]f��Gò%ȕ���Z.�o��ؒ"�1��<}��l�iy�@=�����ɯ����;��a/�MvC�G<)��%;H)�
��˽t�w��wf��ʸ�87qc���dH&	��d�W)0���~]`�2j�&0�.�x��M5��
q��q��CyVi���i
p��s���^�Kt��:�\B��V2�k�.�8\u��`v[JSO)ٝ���5O�2��{����?��5��IT���j�k(B��]�|�+�k�^�P��'�3�A�zA_���6G����%�ܯ�x�������'d�
&���-��h��Pn�2_.�L��Y�xE�,f�/�j&���˦�&2w�s����n�3�
O�V�B�"3��<�HX�e7nU�����5�M�v�N���w�р]��ʊ��U,#z��\��a�{�kb}�l��\���Fd���H�e-��Mϩ�d�8^ʯ��)͎_���\�0�1(
�0,�\���R��'+�g�!e�2{U֭N�lpЙQL�<JnpE����{�/~pxg@�e&\E����h�*f֜#əܙ,�rL�U�UQ�D��|��m\K<;f�pT����nS��}q��ؙѕ�nX�2�L���*�	�7���X�-VWdq
��k�[T�m��&�&3�ߑ4X&�ugP͑�ϡ��X,�뺌A��^�1�[:��1gA��;��ev�}Ɵ��6�EkX�����}��Il0���,�r5���^>�T��%�F����T�:�9��΅#�}��V=|K��!��9���2��-��ɛ?.��&��9��]����]7��/���*��(�y����W�8RGIJ�I�늀+I�y�̜و.;���zZ	��_G9��g��#
��]ye���\o�5I#�Q����B�/x*z?�I7�,)
kk�p舎��8��H��5�y��	��st~͗r�T��.��_��D�\Mm,�Ig�#g��*����Q|�����@!}��[:�A���m���+�I���e#W��Z��}C{8L3��yr*������������Y��_���aNưZ7�夞=�0�@�~H9����n���ſ�G�n
y#��C�J)�3�c����O�</1!K/Z���86�$�Л�I'ar{L�BEJ���ic�@|��9��UNI/�iM�X`ap��0��7�QX��R��ӏ�O��h^
�%���v�sM^�����gHY�v����@��%	MQ��I��x����>���#߽������C��M)#l�JQ��K1�R-���g0�\o�� .8��ΎI꬙H.�g���5��>�`ǚ�'8hw]i.���!h�ӭb�Hjf�Rr�d!������N��"�͋�W/p�\"���[�묠�D6ť�[q/�0ch��Sl+
l��R�	��s�q4��F
KC�P����x';����$=]٭-�
�P7Q�70
�g3�zMN2<x{�~����:|M�}�����}�^��rB��9j���䷀�g}�1ts�	����a�wܓ�s��h�r9�6�Dw��'�0R󁼹��P�BJ�#5Q)q��^-L8���]/#J��)�����n��J��;�Y�C�3x<3��<����f�3r~w����L��c�;L�����maâ#o���KlR��}�Q�^�lQѷ�a ��!���e��#�G>��o��J%ƩM���S�.�EH񼩞��BhX��Ҳ� �c�F�U�ՌT~*DekP�{Jם�V�h���H��q�Rz��K0¿A�+
��+[�IU���a�5)��Ҋ!GEL�0�Ϭ����G�>��C�2��g!�5��a�
�@*�X�<��'[�>dS�@
=U�$=���蛏��ӳc��?�U�V��FW�
xl���4��w.	��jc&�kEw%r��� �g�!�_�ϊ0�1�Z�ʉˌ���?�#�ƮB& /9s,&��'���\�gc1eĹ��1�6�>z-~����9_�4;7���y�*�)�%8�����bp��9s��R��.�#*��tz A+���v��=!����^f;���`q�]6׽�ůb��= �hS��o/�k��
Δw53�#�Bc3Y �e�X.�$�z#ϭcT��Yg��ע�����j�R��Zsҕ�g���6g��:�'���D(u�/����ۚٔ��e�}���D媪o`A/�M�Е�G�(;g23�P�.��E/`&��j6x��H�J'x��G$�!��q
1t�}D�:�nN���~�6⸌=���^���^�#�<��&=�[���&i�X�on&�dlB�N��G�r���X�V��W������䢉/�J��7�z�?�<�^�yvn����X��k3mj�Ka�}�«x�8�/t�l
�ʰ��*�Ѱ�MZi?�p��B:����E,涨x��{��H#w�$�E<m�^����$F4c�#s�ɪ睙�9�����{�o�\����Ҧ��l7:�M�`�#��>'��;�[�}�i��9�.�S��~I��0��k�
>/?�H����Z���将�>V?�/�#�=�[J�U�ċ����o����O9
�E�;x��-<��?{}�l����1=}��Gv"�@r��t�� ��
e�54�c�3�(,�6�jIsC��ķ	�+6v��g�8d�0Mǘ��^`����n�q�b��gwFWџש����5u�˘�K.9p�rp��O��4\@��?�j�i�s��/P}�I�j���#_m�)������W?�<0+$��.)t5��C�F'ܼ�Q�;gШ/h�Ӯ%��!0�#��s1�f8L�C�K���3�%:ݴ(����`[�� "�OH�Cdp�1��G�L�y*3��a���\2��o$���}[
f>���I�C�<p_��X��7v�>򋜛V�[g�ŀNΒ����J|���"�"�9�B�^���vn����+��m7^}r��Y�j1�^�[��x������"<����G�y�j/�ą�Uak6m"Ò�Oa�]O��u��HO��r2���=��N9|�y�d�ӭ'&�V�!�9fM�4�˺�c'�/%�V4&IZ.�K�0�ߡ�H'˩g{Jي�����=�����$HxDl1�adt��j�޾S�O�{��_�A�d���}=�W��������s���0U�DZ��Ǐ�keCr��i���������	��B�2z�"�.�������k��|��}(nb7m�םYf��LD�;Jg����iO��Ļ�L�t�t���d'��5���;s|� *m�؋�}{��]�$�����!�9>W��)X�E�x��Ӧ�a��;�A��>���ҿ	�(lW��0�ְ���<���[��OPKE��T<ށk� pip/_vendor/requests/packages.pyeR=o�0�+�� �
�t����-(�bb"��#��G9n�\��x���4$� �T�/��I�K�H��>1�\w�8�%s\��0:IQ����h2:"P��#[xE�)A}H%7YX7UU��v�D���!��լ�����]��1�f]���O����m�i���ׄ}��oʹ>������T@�Ҽs���53h�!�;#����s� b�"�'���u1����k�2�V3.L� ��C�wD��.��.�����ǹQ�9%_�	z�Zd�ʢE1��E�ͣ2W���8�E��je��a+6FyO_Z63�m�X��ܬ?�`7�m�m���F��w)W�%(���P�N?]
+U8��~L�>���PKE��TH��!�u pip/_vendor/requests/sessions.py�=ks�8��+��K)�v��U�R�8Ύ��:�ٻ��K�%��"9|��Ne�� R�3{ϺqMM$h�Bw�;����U]E���$Ϫ���;;��I���I�*�6Y�J�ꌻ���'��U��u��WZ��R����V���$����2�*;�.�&��X�M}=F�_��(����u����+��؏u��;�2_�E��04�[���R�z�:Y��f�{(��R�u���Y�պ��t��Ij�,���VϪ��H�x��6���!?3-`9���2���!i���E\�6���c�I�˱j��<��C���=	g��pG�ߩ��^�s\��1��).g�w�����.�E=`3X�O��Z�Wڼ�d\�e��<��u����q�ȗ�����QX��׺��$���dy������8ۜ�eR=���a&v̥^�MZ���X-�
и���;;��*/a��&�^�k`��*��R�|�V�2^����R1)��$Mꍌ	��[>*�He���D�y~����᧷����'��G糷'�N�y-����	?�Xj��^
��.�ڵVu\7 �R���e����}{W�$�tV%ȩ-�G+߷��N��xB�:��ᕮ�}�����:�M�<���/2]���e>�5�Ñ*OA�����K���2_n�Au�7)<�qU�m�eo�f�4K�!�м�%�Y-�|q32#�AE�]'�k�Z5pA�X4%�|�+�^�:���h'Y�ǨH�YJM�js{�t0��3Ό�QSR*��P�Au���mMZlg�.B'�r(�|+Q��eX�:�n�Á�|�ak�к�(\��'0K��ƪ�o���q��`L_kPE�,��g�5h0�5>�4
�L���#u�R1��4�
���r3��u����Ԍ��7�̪��>�v�s������z3N��@t�M;�?x��0��^�"�,�������"u��d������N`} ��B;Ė�aD8vv��4$���-�m=uXk�X8�ѨB���v��C_�۩^�ZA�Y
�$2	Z��H�n�MVIYѻ�6O�*N��q1Y�A��)���&�g5�ꌀM���!���2m�躮�#$ح������[����
.vvz��=M@��ř�v�v�_|����@V�2��_�KP���F�����E$^�E�T4h�-x��U^�Y�w'���W��/�e�chy���,�m>�DV��M���ދ��p`��p�/��;��yg�����%nG��� ;� �D�/I61�4����q���t�BS�*�ܞ%Aӣ�=��D�	g������0�#B�sC�׍F�C��,����w-C�.���(ϸقϗ�����1�� µJuB��RSM��Α��U6�2D ����d�x�Kǰ�W�e�S��ve��V�(r:�ƤMU�ѴF,#O4m>����֑�W�b���
/o�w'o* t[�L4���6~RA0Q����xO1R6�[P����㲩u;i�⪈��2AKq���M���s�����k�H5`�d5h�Z�-Qs���x~��<D�T	����${�WS+�.�2J+�N#R�j���cH�sc�9쏛X��`j�%��@�������u���a�`fBQ䤶&_�� < ��t��t���̀)���`H1�&�yId%!�h��4:B0]K�-�:�Y��[cu���ǝ���?!���c�݇n?yD/�N����AS�^8�����y�$����wrx��lw���A��q!4B?��(X%�K��0��\]���_�y(�h׀��63st%�.gUg�Z��M����e�J�Y+�_��1+%UI�����m�$���[����[�c�C���֜���W	��r�N��?<}�O,q��<uk"�:�b�8����"���Ao?�[����R�e��6���]!e��z�sp^a0@����x�P�;mɥ��8{�:����.h����������ob��v��{���D< /F�Hi��_�A��Z�R��$�>�Β}v�G��f�=��{�C�^e�_Fz�2�:=!�:DFGǟ�Ch�N�!�m�@���ȉ��y��������u�=B����jK��Ѣ�Ԧ�*�o?�_@��x=�Y�O1x�7���>es�ʨ}��e�NB)��M��F��?���uǕ�a��ּ�zb�0�*�A�4��z�w��c4��J7Z
=��=�U�m��"V�>��bg�`���6[����EgwD�;D��vw��d�;��
	�ԑ�s�ȋ�p��5}�>�l�O����Jh2�)'��7��͚�\�9P��ּ�!�(.
�-�0�9�L���'�u��1`{.8�K&%��S����M��W�ã��1�aoH�?��N�%����̩��"��
י̑�;�h�TgC#�R�ji%�g�8k>�d;��o58��j����0�`l=�)~��p�)#��֚�m���E��Q��4	耔=��bP[��a
�@P�h�<yq��Wn�|����`� ��`�C8���M��g��?n8�"<6~�عD�Ft�r�Y�\�i�7�t����4�CYՁ�<&�PL�'�ѓ�?ˮ�Y@�m��K�����:k�`�U��BM�i�?�v��3L��:y}�6��
w���bo���A;�ԮqNv�5&7Y����xkr���z��q#nʅ�U>X�iw����/�u�dQ�.��G�#0���~6�a�g|�{r�

���!��F{Hp��V�E��z�e��c���'$^���
{��7��;ud�ۓtW�/�,��Ch�
	N�8`�
��\��~Q������T|�r��y�BˆsXF8E���z:=�j��`q��*v��%�pg@�--{TՃW�����PX�M��t{ouvU_���O�7����e�U+]�=r�U���0��]D/��E�C���n�v�3<XL;0�B�
�ל�0��큙D�O��QsJ^�<�Cj�m����n�œ�7#����.��u�j
TH�^�n�1�Dُ�ӡCH�Ag\Ƿ�
x4�/-}��Tߑ�Ȟؓ�`
�T��}0H����~U!�
��N!�A����_�@�\��vhrZ��o��<�Q;&�d�Ƣ��աZ�	�k���gT���i5��x��gsd�9t����l0jI�����F�nQс��O���T��1(9r��a����vf���E�Bx�����I5a��0�@�OD���9h^:AAv�o��P��
գɜ���УF�N�.�4�	=��Z��0�+���ܮ��g�Y��L�x�e��B�܃Ҏ��;����{ֳ���?F^*t�z�np�$��71q�����%���&�����6/$�#9i��0��3ܿQ�[t��,�����v�m8�=>��&Λї�����w�=̟�!�&�P��9�߿�C��Ͽa�R�j1�c�^�A������x�+���d���D/�*!�@Ǝ@RѪr���{i�\�����0o6;F����(�Y����c�c�+'�@|�!#�O���rP|��x��O�Q�;�/��n���n��'P
���!*��>97r:�TD��3�`����"�i���7$Q�Z'W�5I����
EC�h��Y��`t�N�\4�_8�PY�ME)l�<��A�K/P�M��5�h,��1c�l�2c�xB��<��Vh����`�[%W
纠w�"lN�l�����~�	n�U$���7!+|:}�n1��Z8�?�>�~���0�kl�M�>���X.��m
~�I�a|b7��!�Ɓ� 	h�>A���
�6�h��(jy��(4(6���c�K��p�K�bГ��lBy����86Jԧ7F�
��X�8Ȯ�n�Q�
�+�Z�l���w���x�
3���./�"�^���Y�g�E��I��_4����?'C�Җ�i�:�v�wp-�J��JC�+�;3^��|���3���M�E;->�ch��/�C��N���=R�o�
��T�<�?�*�˫��z��U��>z=w	h�A7F4�J���z�S�W&����x|�z���Ny���;��9hp�Q��J-�1�*��=ȯ���7z�	�cEv��<@�:	>ۗ���H��?Ӡ��li����q���i�ߌa�Od�I-�8[wI�Z/��KP���3�C��)���`����J9�Y)�q�\�V�����a_�]�TyhO*mj3���TŰ#`�_0�i�8�{x�Bɺ1;��ɀ^��P�0a`b=��/_�T� �T�T���ۀN�w�LῗIF/l��s$�>?=8�xɣ(95��;�R�S��#f��{�m�����&�U����F���♹�P+��E麏(5�k���{��7�Eo)r��3�>�����;��0�%YR�f����D�����e!nN4Ɓ�Y��6F��.�	��d.��/��E|����d�}�/�̓�њDAщ{2_K͡�\�M�R�n[z&�su��E����p�skN�G۩�y����(�膘�2����]���é_Hv'jw���e\N�=y�bwl��ȫA��m����ݯ�`�@�F�fʂ}�[��޺�o1jg�%E�'!�EY!�<ƃ9�>Kª��#�w0 F<��Pjes��|��� ��k�oB��<)E�U3�*Y�:#9nOL�`#��RP��#t�V�U����VHf���i`R�m'{�e�D�w���L5�[+>R�y�1�78�&�L-Ɯf.��`��dt�K0�PP����x��bCp$�Ŧ^�sH�W���>-��H�ȫ
sh�ċ����6h�P�G{ۤ�ıli�.�`b{�d���wI�n���2>4���F
�=-f�i�`݈O}A攳DC�/�ǥ���gg$/�7�$&U�J����F�^�ț?G-9V�]|�����@J�`�ԽG����$�f��f}�K/=���H��@~�^V��!M�	V�Y�Se��V��5��>c���td��\�m������� @���6��y�9ǽۋ��r�oa$dl��	Bg�l�qH�6h��L���:���I-l~���PP���)�� [��jc�Y�0����m����GF�:m^�)mٗF.���n�|n�#�q>���i��Ǎɫi_%��#ϟ�:S�|MS>uk͇�����r80V�`��G�[�6v?ԣek�0�")]y��X3q��Q�Ӈ��|a'����">����G5ɕ#�A���!x�r���5R,P8��|Ѥ�}~ܹ��++nN��*G���}f�����ռ�b���=ߜ��A?2Z:R�@5%(e7�3&A�mW�r��-ZI
��hi�x��	�$ώQ���A���sʬikN�1W�DG�K_7)�zG��#S�(���Z�~JCp_u4�p�9�;�������Z�u���TL��ТT�C��;P����&E�X��w���4v�"�0`$G�$#�'L�~ %j�U��
�M����h�T�5}��k`����OU����-~�ԯ���_�{n�W]�wǂ)X;;��P�&ƮktG���zK���0���'�M{j�#[�j:z��;.f��#���w�	C~��d(�?5�2S��������0q����/�`���$_��&#XD�&�غ}􀍶��ٓ�=��8[�Vj��r��x�6�[������:1��6?ᮻ�6����	
�����:5��M�ӑb(���3�6�%�|��.�!�,�t�F�2�Bd<���D��l.�7x�B�IR֤D��9�o>����߄n���az�5�?��DV��LD�3�&����HOܳ��|�H��o���s+�	R,	�K�7��i/;cӞ��A�6�����P����_'X<���D��K�7܏��Js.=��AA��h��lg/YZap�*���q�Z�*kbr�I�^M�C�To:�7#��|�@��5���.��a�Y���V|Ʊ+��y�D�x���<O;��w�m���p�K�kK��CM�X��M-5�H�k�{\cm�2�ː����^�@e��%��޾���>=%<�8�$S��P�FB^t]�ie�y��7�������X���:CP�	(2��CʣCu��
9F��Su):#� �Ģ��!O/ιe���4�N�~�AO��f�Ň��&���Ii#G�&5��`�|ѷ:�
���G���x��g7��M硑ώo}ʋ	�a͉�a�/g���V1a���o�K?ɘ��ml���m�im�{\���$�u��#K����S������
U��F��_�Y�gT�SŰ!WS�I~��O*జ!٦Cq��p��m[8 [�ao7H�-%����!��
&�[� ؋�pwj���ܿeV�pA.8.�?vzws��$�!B�����	C�Ȝ��Ai"m	�6�c���9
}�W��D}���k�� w���2��o����zU��"����1�rLVHǥ�r�{�]	q�b��c�������ߨ�]T��C	T��A���-
��^"P6�v
y婢6|�R�E�{�����x·!��r^/Q���"Nv�^�j��ַ���o����h�Gp�~%�Ϗ~�����yٗ:�d*?t}�������Nދ]�=�2y^�@/V����0����N:���!��Ϲ�x�ދ�w�P�K���(N��ME�f0����AN<�q�,�D��R��3�c�`73pt_�h�&��ہ���.�v6��ln���t?�l�^�TY�����T�U���So��i�n������`0nX�&���G�O
^�_Ř����Z�U�#i1V�3t���!����Ϙ#J�D�_�8(������A'c�)�
;sMЊnn�����A�Q��6;("���1����T�D+��LN�w<��O�ʽV^�$���W;���h��X�ˡ(:��4ʗdM��Ѷ�$�N�ˊ�{����kZ==e^��-�y^�m�i\��8MZ�m_ӧg�j��N*j[��+��E;�T�y�Ǹ�8K�&�F��J�����뱒T�r��?�﹄I2X�c�J� xdRCE�r���.�i3x.�uh�~e�z��U������T�}.�w���B1��D	�ٷ�T,��dYm�S�;�+�u��@�x��V���ɲo'�#����τd������)��W�}vݬV|s6��OIk	qC�a��>z�
<�Y�����梍��9��}!r&%dx���2*-�{�
�u���RnCD`�p�k�;��)IE_ҕ?\��ʙ10�l�rlo������V���<�Q��}<�oc4��%�t�D�
!`���P������/���Kw��81?��w�]��E�`9
�!���pvk��sJ�x�����|t�7��)Nb8�0b�c"��U��`J�=��|_���^l�+��$h�X�����Y(k�$GA��p�|Ʃ�L��	�|@x�ƽ&�{��?�u��{~Zh�w�����s��KL�3}Wr�z&�>���E9
vI�%�=��cm�:�~N`�Z���2��yҽ�leI���U$�d����������է�����G�N�#��C����_O�/& ۊEj߷���A�.F�v/k���z[~#����=��"��
5�/֗��J���^��7����9����Ys��-
��)Bý[�`���nw�m��+��o�M�$�����EB�T�b
ޣ��d	;�sy,C4oz�%��.���4Q&�b���R�\?�Wꆫ����6��#�z|\�/0�ߕ_NH�,�r
����TF�B��f+P�k���B\�vq�%�����wp���G�#Ip��V��R�r
%�Z�ڕ�5-yYs�RW�S�53���}��+7��]���������ސ�N?%e�馃%s���H�@�ȱ]��ur��h�煿�d�oK��W�2���n�=�l�j��p��~�K/����]�-��j��_�Ï��3|,w&���z&I�F�[V���^�@������54�g`��`���E���O��D=����~�2�R��頪�q�w-����Gt�W3�¤-������n�0�b��f)������
�M��;W���;�>'R�@���P��~o	�:F`�B����PKE��T�t�.��$pip/_vendor/requests/status_codes.py}W�n7��S�ZG�e�q$�6E�m���KI�w�-ɵ�y�z��I:��.)�D{93��7�-˲x��l��L-�j����<��Fi�`��:��lcM�*ӶF3-Z�m�e?��;s^��IWx�N*�t�J�*�0�{�DUI�Ժ�L*��L�r�Z�t$Ԫ��ha���u��x{+ڮ�E�������XϬ���λ�>fx�g�A��V�z��O�/�4�Rt�#wy|���K�"�Z��E�δ�<e;q-Y�7^��(�^�lm���]'�s\7�>+�$��ց��M���V2��z�~�I
�ѐ���Z��귟�
T�/��RP�Y+]g�`JR�94=x2+BA���|ۆ��b�U�}I*
N�f�1O�O���f����M��h�t/ˣ�Q���Q��Am��o*ӸLdD��u�����du��}�,pOo���Ƅ]�����eA�� ��C�8Q�+Q����������I�TY)��G��G(�^h����X�Pג+cP�0'8�$-<�Xf�X�O�'}b2"��gda�M.II�eIJ�T3Aj(�$\�{*�;Ǡ4�:tg��<8�K�P%���?bCf���a�jg̸儲ҚkYsh�Vh�"1f�y9n�|mL��L&�I�M�.,�b<oM�6J�1�I(��}�8K]p����`��D]Iɢb��r�=Ӕ�P�Pa��F/�3#ez�0���0f-5�@�4;��c�k���Zk,%qII\���^
.�rpfIY�ul����.#P�}K�ك{51Ғ�J�]���:S1f/杕�SI,)����k�"*S���(6���0���^F`��c���0(CI?
��x:�Z�`ΫV��
%~���"oU%�Xc��Fgfc���~�6�#<K�V+�~#T3؞����'���
�'<v����Fо#D=�T��BY���`�'�Q��A��Sa�z+1���6������+{ǃ�
�m�(�7J�G��RB}>|).2ְiAp����:j�!��h
��lP�2zR��kLu�[��L�ݼ����U��V�tL����R�i�4�tn�'y좾�ZQ˃ֈ�$y~�;�j\`+��X�Q�6G��f�����]^���Gv.��Lw/'�d�$^Q�{@s;��>�����AL���q�ѐ�8�-^�pp�!�z���a�	y#� s؁yA�!a�����W�qT��NZ����~J��4i�Z�Jp$�iw�/��%]���>%���x	��U�)�[�y݈}Ɗc�^å�g�Sť���$$�X�;�;������97��Z�V	�3\˭�+��.+�4`�f�*���0�3�;%_��Q5@s�Zpz[IY�#o<��=�*o}��,|��Z�c��6�r���á�(��Az1L£�uI7Ez<�Ӣ(����dz��We`1��&<>4#��	�A���'f��e7<2'��"G�~z �6�C|x���7\�v�II����N5?�}�O��t87'kS�`���y�Y8a�	�2�M�Z}�_V�}�����d5�Do5+�aO��ԕ�)�P�Pm<yۘ5��9��9GR��s��h��mX���4�=f&��'d�4��t)�1��nd���#%�?�PKE��TQL�[`"pip/_vendor/requests/structures.py�VMo�F��W䃨�fѫQ0�
��E��W�H�xɥw�V� �����J�����7o���r6�%�:���֙�t�A�|�K���	�@��A�wh��#�c�6��R+����� �V�

Voe�zP^�%��I��l6|�X)쟓$)��n�����J'����C��*�Q7P�RNp(��,��R�G��B��7�P�
kl���趺��7��y�šӢaa�dH������(r�QV{���gY!�)��R:�-AB7d��{�j𿖢�
��r�ɑ��n�S�P�

w=	'Mq�3P�3�2�QQ�c�Ri�hJ\E����S~�:~0��D2�<�NR
�n��M(�T|����M$���<Wob=�#%�!���WW�R>QY��IE,b���,�u�Bϩ_J����|���B����z
pw���FI�R2\0>r4�<�6�L���BnQ��9�Lz�Ħ��; ���6cG���|K��o{�w�Y�4�$O�@�ы�0�B*J�[��hD��#�j#7�!��IU��s��� 
2�M>��J8d	pVO�P����T��nV��a����oˌ~X@63^!a$y 	tM�k�p`�`��-,���n�L-�u������7�;a6�_�cL��I��U�E�=	�e���{�k���2�$���o$���'�"]�»���~j�"�����꠴~�Z�Ъs�O)h	Q0^(M��֌�x7��"�x�>�F�G�y}v��s���>�\�W���,�A�i��/#I}��
�4�X�Y��%-���6g}�YDv�Z?�%�~�k'ښ��;��v%K�8��c|B�N^�L_�,���d�Oc/4��D��,H;\�?���~���2�#�=�>��ڍw0V��o�r9���0|熖�X��\�a�B��v�#�_B��ι>|�����T�)��y�ҞM�4���G��#�M:����0�~O_6��J���<ސ�f����A���#��g����5�:���>��s�"��`k�s�Fw�-]e�6��agY��r��É%�wԒ��\��3l<_�)~���T�S�F��PKE��T��7)؁pip/_vendor/requests/utils.py�}kw�Ƶ�w��)tZ�=�8��Ա�F�c�z$��}`�J�H�@=���_3�@�m�wݫ��$0�gf�~Ϟ� 6J��RWu-�lVm����8��*5/��L�EY\g��6��;5]�:+�J՗I��R�e�Su�՗Y���}�̪�L�35-J�ok]��LM�r�@`�F���拢��E�'U�-���,;7O��|*l�R�OU1�ҵ�V��I���v��|1�f��MR�Y~a����iY�a���e�7e�K���:7Zd�(��yZ�Ѳ����M�yr��K�@�j�IY��I��4�����b�WV0l��Σ��MUq��ٵ�a�0[��iG.a~Cu����<�M8O&W�ⴂ���v���G1��ǃg/�⟟�:|������;��Ty�k2R/��	8�@	7���,�~H_ΓJs�~W�?^�H�6�~�u~��E>�y��p����6��x���E<�* �J�����8�~��-�J��>�N��eQk�K���y
$@��o�\�7(�`��@��Ǥ��u�"rC};��Jy�/�����i�G:̯�Y��H�����y�o�<M�g��"�;(ˢl�ż�,��=��<�+�W3�냓�����W�j�� �u]N��
b�4��xq���髓�������/^�o���͉�$��i����	B��N#�d���
�<z��32� xE[C�É�Q�k���5J8}��J�z��3 |u�/xVFv�gϟ�=�^?���`d���rFq��j,���]�޺�&���m��r�g?�6���@.�)J�h1Kj`ֹ�p���
�iIJJ<�S"��ط�"�\�x�X̀r��j���z�n�/�ʻ�����B|&3�o���!�$J�{�H%W/A�5�I��X�5�c@5�Y�/�.�㟼��/����>�O�����ep\Lk|��O٤,*��N0��,�mf�;��(3���7�m���˃yXt9K�������+�����/o�^A@�s��H\���d��eq]����d���aG@����l�}���}�H6��l^����$w�M���N����ES1�h2m	��(Q?�P���)�����̘_Bw�ğ��ɥ�\�k��"�@�������*��'���tVL��w[�AP^ԛ�"'qw��)=�@eբ�Sݛj��E�An�W�]��	�
����u�n4,��\�PtM��Ѻ�f0�
@�������R+L��`��6hD��C\t�8;�2�{�C�?� ���2x���J�L�v|@��qr��Z]̊sU�͚O�`��F|.��@�Ɛ�?ć��.�P�%ܶ�Im�.����v����4��a�4j��9M�cZD_$5�ߴa
��A��BO�i��FD"!9���s�ߠ��*S�ш���}}jы�TV���0��X���̕1�-�PGP	0�r�&��ȥ�U^&UR�e��|c^�S��4��h�8�MeV�rv�L�a!����\ԗ�507=����``��ng�^�9��y�`�p�L#�;�\ӵ��㊞�U�E���&�?��ފ
Ɋ�̻{6`�	�w���@x=�je���4!��\�Y��ۚ�C�Z�O�A�yz���X��"Ѫ�`�2?8+��o
>D`Z׀�X0���#���['Y�u�%-xN�!�U_�ɤ����x��]���z���놄��
��TEӪN�g:�>���5�S��a����
�T�a���A1�!��\�����4+猫���p\n��r���<#F����UʹU)E�-����~�ڋ����@�mVi�70~^o
I]�2���$��C"Yb�(dD��L��ң5 	i8�s�s�9��Ii������ηւ�%�"�A�8���&�2��#�eR���#)�҆���5a[��l��������n~�i\v�3��1�Z����{�z%e�g���G���-1|�B�P
��\cÚ1tV�@(���[��Kv<��RN�4�˓����f�TD4��&e�����ߪ3�vɸ
'^�F��V��д�a�5��
���AB�M�H-m	9��B�\.�+l���u�ܓU�$�yTs]v��y�<l�4H�+���To��?�:&���
u��V�2U��(��c����(�j���� *:�m��[��[���-�n\��_e�τ�Wt_$e���(;p��Do��֭���@���E�c��n�����ML�yr�h��lwHИ�`�r�+N��e�,g�$Y�c�Ӯ�d�wML�.+3�����I�Ev
���"�s��#v'/vrs	
Ɖ���tӶ��=zxV���2��W��1
���i�9��OQ�9!A!A��U�X�k��â8���QIc{.-
ښY�2��Ah�(D�`�-��*éO�B��w+�q��i��X��Ǐo~:��=m	ʐ�a�Yf)��"u�����hg�|	F���~������{��?�2�.�NX�c�{gQMw������ޓG�Wx�mqڬ|�*�x��nA�N�sWn���9R�NJ)�͖H���`��aI�������&a��ȡw`��E4�/�纬,u���Hb5�!�FQD�\��JQu*G�n�
���}Э���дc-�ဖ�dD�D����
�>F�/�.�l�4�}����G
���d�G�p���b9�d�Q`o�Q�b�ӿa�+�%�D`�w��p�>N��ڶ@;��;��e�]�A�;��@����R{��0�4����'ڑM��:��!\�w:�"��Q��5��Op��C�i���-��
Mniu��X']��\�`��a��Fc����RA<p�1�\���·����:�/�	�c���A�s��5'�U4&H���K��uC�OJ<��S#�lh)V�lfD&�D
�(9��;��>�$ u�
ђs8	�
�#J��)���04������2�A��� N~�[@J�R��.�m���f�ҕL2l��4�Qx@�k
:�65�(�C	k���\���L��ͭ):z2 �I��3ح��8Db�&0O�'K�6r4��܀9L*��ّ��p�ʴE~5T �'C���PL�D'L��.�tY"��Q�}͂nM�tJ����Ӟ�33�%ߡb$
P���\Kijj@��φJ�~�����CӤ1>X���%h�����W�m��k�v��Gv����*��`��f=C>o ��g������Tq�4�
1r���Pd��hVQ�yl��L��+�TfTL���(H{zYb�g�	H���^r��@�%�)&t`|OUspUD���u�(l��ovs�9>㥚}{�y�JeU,{v�C�����߳�K��D&$Q1�1B��#�p�0�DrX
�9�M�e�7bDr{���:+��4�s�����}��{��`Μg���-�az�6�ϯ�M���b��$��܌;ڪ&�l�)9��"5y��u�p�g��W� �	v���K;*	R0h��$ƈ\{~(9^���t�Ip�D4��n#�$d��+���M�T$�I�\�@D�����F��B�J8NC�Yu%Lŝ��.a�F����MLiH�E�Zj�_U�9���gR�v��H�uJ3nܜ�U|ыԻL�R��}P͙���К�dɀ��Ł9�0hi�7"S,$B9e�\��ȋt��4t
m,�6�@0���5y�&������hΝ"u���@�����PP����
�o4d�05�w�}׳��p�cn
<�8ֱsM�~�[lim5�N��5ţBJ[(�͟	
�Y⥫�f?7�#D	b��3{c���6�Z�{���V3��|��%3FKLNyكB	F�q*B�u�kb��G��*�3ɟS�EN`��W��� &�	���`�k!���?G�N놰9�uM|-Y�g��\�oւYE&�����-N�Ez�[RP��x)c���@ޡ�
�0|���yVW���ع���ozy�B��􃈘��m�f�%�P��#HTz��N�|��w?Qǜ���%}�0�d9KJI/���y�]i�� 1Lʦ�<����
���$A�_�OfK�0媦�L�U��3�g�Q4:�xdj��6�Wn{�9�E%���g)�j�W~�[j��%!	��h����,��Kp/�*v�G��>��������^�vh�y
�x<�KJ5_����u6�ɀ�"����bF|V�dR�KsB~ Q�eL���I����}@Ta��ߥ�����9;�A��48�(I��[�;)��E���5	<�Tr�6$��l� ,]��$�2����R՜��B1����g$2�2��^/^����g,%ѽ�}B��fm{|d�Z����c�}��ї�`�u�p�&7[@�2��{#�4s��6��qί�M!A�H�	Ps�4�Bk�$+�Dp����k]�˃���"��u3��3ۚ�8 �f�e�Ѳr�)5���v�m��CjL��
*��	m6�z�����T���KY
4'(b����	��y��S��ա>�L
&YЧ�7#Rx���q��D����0mۣ�?}�0�t��>�A�g�⽛�f�P�d��ɞ�����D�@v{^܊Z��/+��@��~���g8���d����'R�ΏKص�\T�%96f�
�0��Jf(.���c|D���G͇�B�T���(�yYs2�yY�`Ќ/|I�	��'$��K����L=�@�(�x������i����v7�e\YwU|ej�����
���&~�@�)-�DX�ז|��^f�C��ԥw�K�8Γs0U(ۇ��
.Y�a��ܜK�Y�L��GѸ���;���@jF�m���L�����|�1���c���LI4�����	�J�N_?��=��u�x&S���|j��X&��ܞ�Yq�^3
�őiK^�)��#MIm8DZ,15��xi��m�Ɋs�?��m���j`�o��T�#7�7}��?�F��p1�������w��eecO6��p���}��P3��vu�)�a������DҘ;�IN�3�D=��*�z�qԼ2^>f1q�R�m��oO�q�mI#��z�� �xUN�3�-_
b�>��$Mc�
�"h���V�lAQ��a���.,!QF^�f
#��1y��A��l��j��Ƿ��a�x���8�l��)�
��.�l{F��Jk�cZH�w#����P��?k\�
�g�y��HI�����[��K G?5�h�xO�At��Ml}���u=>�����8R!j�<�s��N*�K-@F���sN��g|�륽JX�7��%*�RӍW<a*���bK��K��Y�n�0��~��=L��t���-��b���`�Z����g=0�����
@��*�s�7͖7��<�K���W�z�5���0,"������d��bh
ے">е�@b����.��{�Ϛ��J(a9��q�������,?�4Z���HE��L5�C�-��<}ÎW9b�SH�s(+�d�Y�V%0�\��	&�b��A]�L/|����qؽ���o�b��S���NI'����=x%^+�:�������zs?k���S�/�l�L+��v����W]��2�ܐ��PU�xr�V��uҀQT#��{�E����T^q.��������&&��=ֈ�Y3d �,�}{䏏�lS���ֻ��}���g����7�O�|��^s�-}4�X��|��|
�M��sfNO^n?��*Tj�V=z���#��zsse��RFk9���=4�J��\���LyYO���J&��aCɏ1_�ł�wR�%�3;����(����wٯ�,�u�E�L�(��m��\��1J�Z�
R,��x}2��a3� ���@�=d)�]�f��v^��C�f2A��'�뾓��zc�� ��<�q���@o�-��|tJ1E_%˾نCZxM׀ �Ub8�oQT��/c���Ơ��=
�)z��F�$�eIIX8�S�]{���ۍ��W���ލ�����d�i6�18�A�,�ﱆ�#C��KL0����6ـa��1�2ө�N�"ˀR1����`?RS<��i��a�y|h���ܱ��7L�^,�d�׸)���g'�f6��]��k�FU��Q�V䙆knɉ��2��v�U��>�\�h�М�4�d�/
�ɍiwB�'3T��T�v�j��}
,���)�27G����Ѝ����~���`������/���=��7�:�):x���/�������o������_��oO�' ..��W�y^,~-�zy}s{�[b&����������(�G�a^n�.ˬ%����&	�w��������6�u5��,@�_�z�p�5�N�Rá���L�X��g���ӗc~s��J ��wE�82��Q�δĜ�poH��:�y�l(��Y��lw��He o�q9�P2����(��Y�����^#�[��k���C��x�{}�����,��>S8
�˪���O�����?X���\w@�
�:z�3�����;w*[����?���������$ᖷO��<s��T|�9��j�����
]�
�[Y,/0lf��M�&�$)2��2��Y*�'�|+NՇ|H%W�Tӡb,�n��6���
��dz��h5�3H�G�B7����}��h��	�>�w]ɖ�q+���f�K����A[�R�p��Һ�\yb��w��Hu&�t��.�L�[��[�������1Y�\P)�������b�w[�{��(X��>t�wJp9I��/��PO�ke�ƐC�&�]�]�,��Mxpf�Y�d�yLRK��K�l*{���48�E�b��#S�_�d�S($����o����O��h�������;��|9c������eHb�DŽ������]�%�&Wa0~��d�����6�U��!vZ�H!�w'��4��E_=-jL�^�D�`�
J�B�2G�`���P`_���8�cs��ϑ^Yz��%k"�s�V���r{{9����7`G �G
-��������^�ʖ�޾�?��*�SO����j[�:��V����u���a��w���`"~Z\?����%�g
>֓�'�;[׀s%]�|�z�[_�N��c<����
n�gM�J�왙^�7aW��x����r�uRfX� ��ͦ���eά���ƝBvh�p���u�k�������{��PQ���\��҆�v�g�݉�V:�l�oW�C�������]]�N��u�$���e�m!�oq�c�8qkoJf�K��ȝ�����U���0��?�!:5�01���X�@h(�Z��ڸ��4%�z
��!�46�V	3�f��g�\�(�pĞ
��fΫ��ʹV�4I��wB_`��X��D^)�a��I�7��n$HK���<|oP�2v\�T�H5��V�̊2���fPNo�Td\.�H�1_i��<gc���Rn.�T1����$u,n˼:�<+ܣe�W�n����`\h�qD�ĤI��,�
�..4a�P`nlҝ��}%�n4ث8U��)�E�\SyY�Q��K2_
׸�h1o�Z�T,(:I��6d�;�FXW��k:�l�*��*P)�t��"\�kgg�:�6K�֒Z��1��M�59Ɉw���w7L S�Q���I�g�z5���}ԇZ��@�����&��*������\�JtdJ��ia� �SZ��l�ە&Y�F1�z
�H���5���J{{�靖a���cvU!�C��tHeʼ��oM�ҋo�KU,�m���n��E"H��}{{�-�+�q��acU�q{�m#��q-`_a�g����9��K�@{	�5+�i�qm%`��[
Vm�	K@΃e��DM.5�̉B�&<^^}��B"-Viq�5)�w��1�k�5r�^�Vt�j����A-ָ���&0���I+�w엥m���)���N/�L�M�����w4e�!�"wR_�FǘJ��Y&���zF�@i����L�q�qV!�/��}S>74.h��*Du���5�gt�R*�N�X/5F9���ǧ��~ħ%����n��m-���3?�HU ��l���T/��Y!�B������5�7l��k���k��D0n*�T�Os�,)���l0:p�0[�D�	<��Lh��S�G��;͋��o��ޮht0݆ɝ�{�D�
�Ǟ��<�=|w�)��b���]k�BJ�C;ˊ���	��$��l��J����!�I�5UX%(?�.�\0�)$_,)%s�"-|;�)U���/5��Ę�L�0��	KP��M�������:.#F��Z��<͑)��$����:=��c1g�<R?�ӤAA�z2K�Z�خX�y���T�#	�,TF皫s5�M���x�a�13T�݅e<��ٶ�K�&��+¢Ga�QX��J;��Do) {̾N-Y0�qd��H4���'�\.���I�
L�,g
d����N�>1�҉�L��J_,�6��*�+9���)�&��H�"������'���O�/(}Z�5)+����������~�g��fM��'��)�m��-�a�U)x�?#s`~Ff�V�nMo?h<�y�y��|U`�c|�k�c5v���_&�e�Uվ�j7�gG��ʖUEu�_���z����NE; �a�?.��w��gcz�-e1��lh���P:Q/�q;�o;]�T<��2'�F�k��UaB%��
p����+pė��	�פ8C#Jf�?�1T�~X�:�:[�&��7�����{��0%h
m%�.����7i�O�#�>��Y[)�N�dVtS���t�E��Y
�<�m����f)�vI	�ߍM�z�	K���[߮�r�����J'``P�S1�l�xYO7��`j���n �HmqO�m�t�L�$)��,d��@��Σ�^�F3v�&u�Br������&�F�	��b}c�դ��������$VF'�Ttrd�N�-s�:+�
�l.�K�l���AO���� �~x�Ӑ�%�#v�+��9V��ѣ��㓫��
%��ǧ'/�ǯ�����G���$�49R���C���|���v�]t�Oǰ	w0���N/t:h���gE{�{VW�h�q��p�h_� �F��@"�FT6ͼd�V�w_�}Ͽ1��e������t��SxX�\S�x��_��z�@�ϩ��z���/�<s o�[�B��R�S�+��mJsk�����>�������kW�8�z�߿*W��u
6A@����R��i�B���Т+��4B�O���P��N=0��Nz�hNR�1}i'c�߰4xa����f#-��b˭��c�&t����~{�~�_m"f�X����;�r�W��!��bΉb���Ek� ˭cՈ�ʞ��ۉ¶�_�xtl����㵏Ԗ?���ԧ	�[�	pu�:3���7�X|Y��
�2��J�.�\�(�<"�E
�}v���F��w����_H��-��
��wז�'ι}�}�~TĖ��~�k��-M��.7?�H:��?��=*�h4օN��@�Wzv�Л]A�GSÔ��_4�7�p;�2�7\e���^����7�wZ���Z���W�qڜ�nX��܈B�'�<���,�1��O.��Ep���\�D��"m��x�O���E��֞�JϤ���ce2M݌:��3���
�5��M���;V�G|ކ)1v��ҩ�����?��M��T��`�T��`����el�H&&%��nJI��Fa�A�{˕�hh��%)tSU���~���x#�c��UrT��L=���!�t����w��:5
~l0�BJ{�]�y���O��#���?Vs�����F�4(x��7�R[���Y�g���orҔ����KS/���3�J4���-�C�,������������t/8��Pv,���t���%�����Ì�N�5����wIz�C�a5p(:h�r�5��>9��w�
4��27:����L�se!�rb�1��)���8�}�b��>��G�)�ѷ†��o�W���,J����g�������`�\G��̎ϋ�.\H�>��a�)?�L�� �	�?��Y���h���Rg�����*�&)WS��fX|Ɨz8��~ԩ����"ld~���M7L���Fշ!2�#
�_j� �ȕ�;e��L���yW>�r�������;s��Ojp&�C��e,M�?�]3���"@�z�H���PKE��T��k��"pip/_vendor/resolvelib/__init__.pym�=�0�����IBtsq�k`3�͘�™4)=���~� `����(��UJ��Y���Z 6�J�N�\ٓ.���5P��h�Q�j�$?j�+ѱa�ﴫL�=|���CP�,��ݬ)=T_�'��~�n��\-�z'�=@����@��V�2B�k�5�\��~��1�T��&���Ȑ�*Cf�>�/�n�*�I,�Db��1��M���'PKE��Te�4�#pip/_vendor/resolvelib/providers.py�Xˎ�6��+���3p�S�M�Y4(��YZ�D٬%Q%�q��=�����"�]Ö����j�1l[�ye���E�B�T����������_D+��
V��V��/eZ�3J-:�[&{+t�+���=�[���7���	�Eð���9��h�u*b���}-k(��O&�*_D�x����Q�i?˔B;��nބ�_�0��F�d��)Ml�v:X�O*}k�4sPc[��������a��{QoR��wͥ쓲���:ɢ����1<{aw��Т��**�h�_��̅{�R�&>�L��A�8��K^��HB5-ϳ�
�G$�3��eGqv�޻䤵Pr
��Y�$ˈH^Pn�챃v����H�&:����/��Hm���In�I���ㅷ#iY���ҳv-� �i�k5L5����m���0��?�mV|�LJaSyfE���(6���,���V�A�xT��S�Ɯ�:D�Ү���|d�'�X5��޶g����Мږ}�PLYFl�.[�g�L���Q�&�E		��ԙU�oZYYv����k��(f�<���љ�GA���5lP�ȲM��6��\�?�(�,f$�e&�`��4ߋW�pC�ÅM��}d��յ�Xfy@f&��I��9�u�넦�2*_T���i���c�����#
#��W�p'�Rh�>�F�E ��N�f�,���%�H<n%\��r҅/�ج�]|��h�j�B��EweI.�O��M�	�*�'������Y9T�*	p9�IK5:�ƌ@rH�ڱ� �z]�6c�����@���h?�j��9܎�|���ڧD�oꄧ-�F�̲ž�g��B��Dp�:D��%UU���G?[�?��3�U��W'SeG޶��B��
���U�vC�>3�IӜ/��B�Lf�f#N�MK�<
g���5{f{�����dY�d4�Z��UL�SB�H)s-
[��q��إ��7i�sBI�A�S���%'ٶ�؁�),
̆��	���-(G��w(�B�׌}E%r�G�鐩iX�)���崾�����q��Z"��#M���ˈ�yk�}�?��@[��4�'B�N�F]�n@��������`���1f.QO��P"���+�#� �����`̒2���t�	��~ƒI[Lݜ��V�-��+�`�ׅc��.V�UfƂ¼�~�y�g.�zk�i�޶ms!(��]��	�nblK��<{MUa����|��/����-��!���_?^�ࣙ}���E��(�wX�N��T�,�빨��1gw�~��#�D�-ŷ���	�z�Ο,	�I�Y�^���H��*q��V"ɍg߸�����2#M��"��O�M����z��MPި+tF
�W�pM�e�<ֽ8K���������.�\愒�|���yD����>%V8~���d}���<IQ��+kv�Z��|݀_�����	�)��I+���h:Ɏ��
_��=�%iݤ'��斕J��\�)i�oN�"ZK�d�H���%�0tk�S�Y|�6I$x�f`#���M�b�[I�M<�������7Uvs���7wTt����(B���rO�S�N2��2��bp/߳���N���vS��3�#>Ș;I�`�f^q��|���Q�4�.���p<q�_p�/�(.2��5#����0=�,K!Y�%��&e���[+֞w���4(���J�zb
t t�n`a��7]�,�q���a<��0���Դs ׁ�@\!�Kbv3d���{�Z�z6������ױt�K�
��WTP�)��!�(\1�%����]伶o�PKE��T�G�%*/#pip/_vendor/resolvelib/reporters.py�Tˎ�0��+���@�ȱ�y,�皖�D�,���4���q�4i�5'��r8���=|DO/4Z�ml��Dxڭ���z��4�1�,���$���K��졷x�[}$�0�*AI�LaO�/��jM:b�BLAY(�����~sv22AoAI���@(�2��5W�Xͩ�\K��፜�б^����Ր�wk�F�@�*�1�q!|?y�T+Y��̑	�������3���'4!7�zeP�7�Xͻ$(���{u�I�U?�̗�F�奟�r4�	��Z�ˆ�ﲞd

 :ՙ�$KP��S|(V���:m�����H�xs�bz~�f�.^���4v�9���ľ�e͝e���<�B�m+��d#,�$�,3q���gk(��6�gwl�a�R{���C��C�\>E��S�>�K��c��Z���PN���9^�~�C�a�/x���d&���'��z�=�-��ʫ��*�h�v:?��W�:d�L�q[��'8;�:d9���`]��ʘ�♏A�l���O��g�"�oPKE��T�qC�D#pip/_vendor/resolvelib/resolvers.py�<ێ�ȕ����!s3�}j@�zǓ����1��4%�Z��H.�lYk���S��ݳ>j��ԩs�TY���ؾ�k�D�șP�ڎ����١oO��IT��L���C_�O\���8x9�;��0��ԗ�q�n�/e׉�a�v�����כ'�ϳ�'�?#�9�f�mm*-��q,��īa�j��1x�Y������=���ϖ��l_�R2����y�����F���?�])9S3`V�5�f�d})$���†����Vc͋M��

�'o��'��XWr�ٱl�ƈ&��>4�w���:�;9� 2���R�f<f#޶-a�ms�2j�PCӠ��وF��B�b���#G�E���ea�8n>�(�{�=��)�XxK�|�& �^��}�6/�h,��	HE�V4��w��_{{$�LAb���b�\YPN�nXT
9�����N���f�5gWI)��Ab�߿%?~R��r����o�j�dM;0	�*�I�h�����LX����q&�,�%�T&�=���R�j��#���c
��K��c�`�g��c[W��=��^�Ɓ�5��
g��L��:ˇ@�y[���D/�����(޶Q#ԪhB�V�!��:�Qрφc90��ٱP���=u��N�b\f7���i�
�о?���[K��;0��XqFޅ$�B�5K�i�Z��t��kZ��9 �Ո�I�I���F#����Jm#ٶa��`�r��B�i�n����`�#oh=�d���	L��nf�7�[��?0��J�>���]jY,
$=�q��#�!0,������	/��O�P��#�{��E0��1|癍�� ��d�������7z���Tb�Rڷ�����A�� ��_�h1��F(g	=�Y{6+4e4�+�$�5�ZZk�WLE.�`
�:��Z�܆��av��k��Ev��ϼ�_��76��ȡCV��7x
�Α-����~��b�t{2FbA��G
���R�Ms��7�2e58xT���X�(+�_k@�=~nۏ�w/�`ߎM��ÿÕ]j����!�����~�!�$Z�{�F��:d��s���vR����
�S���q�4��N�	�a�}_���]�?��1�w���᠇*'�B���}�G�f?4֫����;���`�<���e_����L��1G�}lA7���>��'=/�D<B���W��;�	.+��_n���އz���{;F{�[�O_Hp���#��v����gv6�(����7Y���?�`!���6C{�\��w��B�q�T��5!"���2��{��ߔ����#�^���Fk�A��b�v��2��������X�Ԕ���ͽk��| �X�_>�ʪ���`���w��I��v80�:dm����� xo�����i���<|�n뙔�,��p�����Ƈ��P�g,��'	��"Ւ?Ϩ��a��f�6[����d�~�"Mw��:*��|�\%_L��8���V{T�3��e�L�~u�ݰ;o�pp47��o�?� a��,�Ɍ�-�b}E��(9�+/���e�:�,r�{]:}|�^�a_�\�?�5���BKz"v����<#1ɛ���`���a��{e�L�Lj�������1�\�`���X�؅hʔe@ �M0�R�	y�VS�zV�<X�TD�J��W�����3%��[4���⼐��أm`]��
9!ȗ)��΃c�G��;��Dy�\����%؈X��g�誥�_�j����WrX{�f�mLC���tDu;�^%��Y�#�MV�99ё�,@�˺E��G#jf��2��#Wv]
�<X17�<?�1>u�G������^gh���
7���}@W��7eL��q%��-<y��gLyfAڌ��Xq;��ڌ||y�~8rH,U�q�/��MP�/��H�=���Be3�f��uDj;A~ap�v�f{����,�Ħޠ�W\U!���u(!�x��Y�Mʉ�
��>��𚠉��H9/�T�`�A|aA0��d�_�`���|�&����~�%��Y|����L�Tf�M�|;(��}�r�f��]���	k3��P�2%��佰%.��"JL�I%"p֕a�\��T`�y��?  ���.��e1�
�wm�P���fzׁ�
�h9��gSo�y�`=�ۤ��#"�kd�CZV ׊a�	h�"�S�HL���+2�vt��{�6"�v�߰}qF~v��ފ������+nnBz��R�/�>������0^�5��N�	��5*��C��x�̗D\�<��/@��%�%y,�8��|)�ׂ�
�Di�V�`Q�c�dY��0�)���s=��U��ݨj������f�h	��Q5�'L�8��%H�JDD�)ЋxD�f�t_�ԥ@�:��7��G!�e_�_���?�h�N;�;v�^�Y�R��D;�bۑ�1D=A�-��OG �b8�^<���瀾,)����g�u�� ��֗�&�N��~����`��KU����p
�
5�K�|(A��_�GD/�@���@D�,�
6����wz�xX�Q�׼l��`'&l�_c<E
�UDf*tK��5��Md{?�S�%PQ�J�`�H���S�:-c&��$j�d���P*�lV=��}���TG��#�к��;����i�?"L6(3��e/W�����c����e�/b%#��~����ދ���/ߞ	U�߼�$�_N��|䃍8���M�b۞=I�*��z6�u���7��+�al$`���e�i���)2���3E,PA`23?��>fs;����>;�j��b�^Sn����U�����v�?���y�|����f7�.W�����+�/ @j�	N�Lq�)�Ta��U�V�� MS��=�?y՛.a�i�̪�&M��y��q�R�t�Ÿ�����A�R�q�=s�Qb�c�r;�\�;��|x�r�������Y!��O��F��6Ѡ��}��/
h����pbܘA�K!�9��(�l.'�/��PɲM
��bs�3�+0�_6Ԩ�O� U��*ۡ�6�L_����W�R5��cb:�fl�o�X���þm��O��L��%���w_a\������͘��w���_aŒ�D>�_P���ns���x�V7~M�Ҵ�2�x�7!>7?,�ʁ,��)*�4�/�*=zt���j�{�d��VW~���O�Q:I��xU���L��h�'�c���q�ܜ�5�����_b�B6ө'��Y��e�Y�r�J�Q���@E&nl\�C�T�y�������PM��K:�1%K�|��.�l�R�j<V{�=�S,�(柨�Ҫ
d�8�q�.WTM�4�_}>�z`H��6�ܐ�>߶RY�S��I�bb
J��v�c�)p�$�E���n�z�!��Tqec�'ڎL5j�E3�iB��f��	ՒAI���<���Hs�7�?�R��FC=�vJ�ϱn$1�ʀb	N������x@���ڊ�i�B�\*��I}�s���Sm̢���lf�t/����;��n�#�\�I���3f���x�l��

�
w�b�� ���ćB�'�]��j$c]�>Џ��uפ��3m�}*-�2�+����"r�#��a��fT>8�_
����k%��h?@�A��O��0>���/Ɂ
B���r`�g2�e3���?����y�k��W[[��D��/��'U����)�5��Co�VL

�*��g�+�C��':z�(��e�0òenEI%�ꀩ>I�05�,�`�7�?��x�a�A�є;����B�R�(P���ڈ� 	IE)+2h8�c����:P�I��6"��Yi�*�%�WP!2b��/��Dr=����39ɉ��t�S��'�
<���<[����6No*�X�����P�F�|
Q��R4��a��隈�[�%f��u/m
����w��gwQc�yЍ9�?U��Y�08F�=����U�K.��65_��߅
���k�/��a؏�ٲ�8t!����Jp�V=����e���`R�&ܹ��n];����7�S���.ٍ;���,J�-��m�lo�VA���2%�V�f'y�e�*Łx��M�H�
m������[ɶ����
oT%0]LK&��v�kÖHBiC��nA��YGj��Z�y��Q�
��4��n����;��z�S‘D�z��K��|����f��uٻ<�ڽxe�*s��=��e!�ݢ��[��5�T[]��m>��b�^�]W�)_���
�`n���|d Q�F�w�*L�홈 ��^e���aJ�<��q(��r#U;�ʶgd����^6�C��[�d Yh�w8�A�3�`�h7
��.�kߞv��Ƣ\"�*�߆7[�Uc�8�\�˞�^!Z�-���ڊ͒�<9t�����io����rI5�&<����J�쁦Q�#wD�'�:D��qk� �v��t�/�
����;���=/e�$[�����m��=���+q��#{���C�j^����UM:)?+rX�c�Ŵ��PKE��TT��pS�!pip/_vendor/resolvelib/structs.py�Xmo�F�~�bz�*�j?Zu�6m��jT�Qjɲ8�9`��rgj��wvY^8�Jr:Y�>���YYs��)��Bn6��%�	/��w�&��JF�>�l6IK	�2A�1�]�u��'��_l�>��g���A*�$�'�rH�`z�2$ƍ�H1�(bSQ�I,2�I��0:��,A	��By���qq�E�����Ol_ë�p������������=J��=�^e�蹮�S����D{J4ᕊ����<[*����Y�F5	�۹yJ��N8��E�O�x*g����R/�U���V�w�j̓�qO�w�0G�-8�Q�|!%����8W��)M�R�M��8�/N���k��)�������J�X�^�Q�q f�c\4��\x[��Tr;�~�%�>j�δ�
�nϴϐ�i_`ɏx.�
��`5cdHA@]/	Õ�"�κ�7|�S��r�4��v"��V�Q��s�[�1�=�T�a�)�Cv��t�x&r��C_���l�.���J�>
ֲۅ�u���7ԉw�UһX��5)��+�᪋8�rLS<.�i;FN-M�����eX����,v�d��i�G6I��j��g�@��"X�1��BzA��?-�"5E��ы<5�'��ӵ�j*E��U���'��+.��zSݽ�I�V�������䂞4tRy��W�8�-?��4��j���st�5�}"���i)�>Jo�1?|#��ې2_��[�>�Ґ�5Z��HrN�=�^g��D�M쨵ʢ���(xQvz�z�������[��
~�p��xἷ�L�ߡ�M4*��V�u[�hΜ���ø��}����l�,�n}!
�ZW�]7Lr��s�G�B��R���ϯ�%�	y	ޡ�8�1�;m�/tth8m��#����]�Ԟ�3&������4پ��O���?�бf"ԝY'd���`��.cUJvT���w�ohw��ۙj�; H�E���
�^V����T)���"�9�ǚ���iyَ󯻬pA�Dޒ.�%���"L�"����P6�buAVY�2�}����+鄫Rچ:�A�Ԇ��Z��	��[�h߰B���F��o�UB
�Z�6ygnKA�b�ɽ�9^>*���<Ԏt�!͚��(
��m�s,�;e}�-�������R��8�hu
����H>�?H>y�y<v•���[���p;���A����%��vh�S#5|k����1��$
b�:��.�z$U�@HP��Iح���y��<�x�.
]3�u�΄�:P&����FK��O;�F����_4���7޲������ws��	�F+�ٙ��:�{�^�92$-*�Xzr0�wQx�D��Ě��h�]Xퟁ�PKE��T)pip/_vendor/resolvelib/compat/__init__.pyPKE��T�.gc�0pip/_vendor/resolvelib/compat/collections_abc.py��O�ɉ�W�U�V�M,(��KW�QP
N-,M�KNU���*)���R����\�������b�Ĥd��܂���^�N�Ԋ�ԂO��kQQ~vSp�PKE��T|���8pip/_vendor/rich/__init__.py�X]o�6}�� <���-�d�
d�d&]4	fRE:Pi��8#�*I��}�߾璔,ɲgĒ�ˣ�{�����̊���*c�+�d��;n���LV�Bz'+^���l&w�Җ)3˵�1{�������O���ۛ�?���uu��
/K�)E�k+�"�[���GY%PDT#-T�x��`U�f�V�������?f�$r����̷�&���*�<bs-��m��c�ee�FV����^��ß�( ������
{W�
/Y+��/a��[�*�{٬�f��ep柠�h���7������sr�ϘTfUs[����u�gl0�g��r&�����N��A�;�T٭�J{�7�w�
^��̝�#��X&JaE6�V��,9�s�dob����;��:-�1�����x���/P�X^�bŞiX�T�u�6�~�j9Jj�w#�0��#�Bb)6P}g��׺����ma���� l�+�����ם�:��ݸk�L�s7&�*�vD�̕V�[�s����N����{�]\q�5kFWW_�ݣ��Ql��q�qN��
�jQ�<uk�^�vU�tׄ���.\��kؖ�NT��t��e�J�L�U�����~�R�ǽ/g#��:�\%I&S��C��v��p+���3rC��2�^3c5��1���
��D���$>�qd��k�Q��/
&F��0��ļ2�d���v�ɫ�VF��0�!Wo�alQ�#�2���[�'��Y�idi�"�;x�;��NA�g��Ԍ��-��n�7���N
�d�%b*�	��(j���{7��)��:xs�Ɗ�,rޔ֐��ª�'No
���$���b3։����֍A�	/Aɓl8@��{�
�ڹ��&��1�KK2��-��pU���s��B^��E��)�����w1М��B���@HvL�]4�LL?�~��|@��D��c�G���~�%���|��]/�����[�t0)+�ڷ/nc6b�/V�mQ��vQ���a��:�"f��iA�p�J9�6-D�%I�N���	�)j�T���˼G{{o�����F����ʞօ'x���
����Ê=:2��%Ž��Rf~j*n�3.ΖTCq�
w[.+��[ir[P�Z���/�Dp�%����x���r
�i�û�-�{����6l2ڢT� ����չ|"�n+��Q�6�%����u�2�s��і�ن�R�,&�Ύ$��֤�D% Wo�X�f;szH�	�py��">#�):fO�^�{���GwRIPtk.���@����,
��w�ȫ��a�@oϳ�C������ޭ�<�]t)�wA8�J��hЀ>8B���;Z�� �����hk1�D�Љ�%:
����N�ww�$+�Ct�]��1:�J��Ec����Z9��d[H‘��e�׾����ļ�ʼnB\*B�(�@4R�d��Tj&�>��ʭ�\���S3d���2%��a$~Z����ܡ�
��3�?������OK:�M��q-��fMV�Z���Z�ĤC�:�_E�.�$���~����(.��y�`�!RDk�r�i,��� Б��oRt����GC��Fle劣;f�3���×#Tl��<Y�᯶�^���ѡ3��i�솱 ��Sȧ�j�C�5�8�OԲaj$�Le���9�	�Ph�j�$�ύ�h?5~�T�ռ..ֵ���=l�ND(�mݸ\,)b'��Q0��DB#t���,;c�)���'�E����^�ú��y�%�~�պ�+xY�9:v��o4gU��Z.�M��;_/tN����;�w`��7��I1�P�8��>�A�n���
�p���t0�l4Dzԛ��W���a���7f�{Ԡ�hQ#�0
bd$CCј�q�F#��2,�������c�۶}���g���}�M�g�}��<Iv8�$�|M��bv8M��R�k3@��z����evu5_�PKE��T�e<9�h"pip/_vendor/rich/__main__.py�Ymo���_�9�Q>Eʲl,`lj���]K�?H�ey�$׼���b����A�m^q�/N�NS�)�nL�Ie#����NR��
�y�;37;/��.�Gv���Uc�Q�!N=���0
l˜%�jj9��i��	"3��0%���	L����Y1XH�%9����Sx2Ѕ(�C]V�K6'!I�W	�]��
�FN0��W\JƋ�	fq�)tI
=�/�F��IJE��22�R�
5\D�'�]6�`���x7����\X.���E�d7Ss�k���bƔ/����?��e	+q�e�rE�1�
�,�s�ʩ튓%_��iɫ�L\"
����/h�����9E���]kL>����!�K���P�@�l6�q���X��%�X��PFM
��kK�r�Ѕ�
�h�Ӈr
�4���>��!���th./���(���˒=j�֭�U�a��K�f�,�ʄdO��"!J\'
v]���[��Z��;�#չ�|�˒JRL��D�תA�$�!A�%1�=Fr?��8�kzӘ
Э&��X�0n�8rt)W&���i���)�!>�6�<a�e?�z$BA�	3�U�P9�QR�AD=ĎC�A�G�8�ٌbR�LN�dӮ
@O�D� �ڍ=_מW�`5?���<]���IG��$�u	[���"�h��g�i�+��ҎrOB�����f�n�}��<vYa�
��5$�9wI������0_��$���q��^
Q����-��AD��=y�G�����n��"����ǥ������*C��)���.�~8���n0�B�2�����Y�	��gcx�-;AH�1Ὄ��[4-z=�f%�!5I�4�h湔�\M"��3g]a�Q{��R��e�-�z]���إvW}m5�!,�"�t�'�QJG����:��P�DD��t�o9	�`� bԕ�Ê���%�ȿ��,��#-� �G��-bs9;4�̆�Fĥ�D?�){-&��q���pH��P8)`�hO(��PE�k`BD _1Cnl�!	�1((F� &��:f�}.�ҹn
�f�f G&����E�K�ظ��s����Bo.O�T����.��G��c��Y$eQ`Y���o`��¢���J!�v-�$ �&�D/*�Ж�$a;�	(è)�Cr�0F	�NW�G0 �Vƈ�%*�4��P(�v�8�,��5�3�}�ت.V�hf׬l�V�*��%-$yЖ��֬&xU�N�0���d��}����'}�d;�2��m߅�7�ʰ�8�{"�},�-{��F�?����?���7��u��~��>��{���~���?���s�1�
L���޸3ݿ%����}
b�������{B���O�O�4����W���=�����_���L����Gӽϧ{oM��9�}�,���Ax	�~�
:��>|ܻy��݃����zx�w���Wo}c���܃Gt��ߠG�V��/~��;�޹w��}��o>����>���ݷ޽S�g�`��^(��`�r��Ȗ��[cT2m�n�g��=�B��*�[�^W�W�4L�~�Iɫ�\�O!����6m���mc�SQ�Gp$�� ��(�z`4GL�P��8�]�zA薷��#-��6V�4�-���b�2���|HNPH�ڭus���17�/]��\ZKZ�r2A���OW+G��=R���M�=W��ᜅ���ԕ(p��B����`�b�&b]a�Z���RO�8�(蒆1�j�r�Om2�GB�U�b牍Zp�m-7��k��]���搠��q
�M������>�Z[5���ŧ4����)��<�=�R����R��E�������mte*�SMO�3+Fs�i��\{"����J���fBυ&ze}}]��"f�HZ��Tk�V�m~�Zi�+g�ӧ�N��'6[��3�})�#�l���C������KQ�=�l�7c�Xn��'O����^A7�W�QR>;v:Ӟy�myh��Y.�N���{�\�ͮl=�q�p�k��n7;�KN$nC�$�9S>��(o��W!���T/UPo��(�%��h�7>���� f��}ѕ$�n�I(��Pi�S�אC��G����X]ƤmU��ʗ��A(���Kԭ��`������ � dJ}��<	qP���_�����P�t��^q����%0�}�ϣ��}I3Ƽ�^��J������dj�L8�8��+�t��!��+NX�O�}e%�M}1YP��d�TT�t�PY�	�
��7,u��
}�ϭA,쥊cy��[/����Y ��/tY�۵c�}m#��
��K)��,u�mYO�j'���`�t3j�P�0�i��%eKKZR�~xzU��UA����q��.�N�4��>�Q���B#�R�5t|f�F�U����qr\��T5
:�lC=�Zy6��ϒfŁS�` nn�D�	�m�#�!܆͂�"��"5*�[}��B��Q�[8:����~o�!Q
��w�Nzۚ�O�Ǡ���!��B���lq���f���b�VoZ�{�A�Bn���	���C6��
��$����zQcS斞	���dI)PGF�	pZ�]/B'��OM(^�����,b���/��?)�߫TpOD� *��/;����dFZ�aGk�� ��ۃ b����h�8�j�*��,o�H��b�5�L���Z˭���`6�+�6k�[ A�	�I��7�펺϶���p��+2�zZ_�^��:{CV@�{���7<��O�
��V_̚3�VO���p�}�f����TI�!���x��2�>���W?�V�H��ai!���V���R_�˛oQ{F�!�!k7h��	���W���X�̹x��#N�m;�	i��(8ѧ������:mBO��Ǚ�zpE'_6���كx��ro��0Zx�(��5��AH�$��3Q@D�AՕ	G�BC�r�@F�W����� �M�Vi/����
fҠ�Y�(��`�}AnCӊ�84���9�pa��값匪_+Ȯ�"��Lq�{^n�Ra������_:���b�C��c�Ғ% ��?���
�#&z81�1W~Ӫ/�̬�>Cb�%�5f�7�7s����?PKE��T�À7
p' pip/_vendor/rich/_cell_widths.py]�M˦9���+p��J�+�p!*(�N��H�2�:��-2��:��7'CO��;ߩT�y��?��O�}����O_�����ۏ������滏���o��������?�{���~�Շ?��7��^�|���+��iy�¿���d}����돠�W�~2[��k����9�\]����%%�U@Ӓ�	��Eh
�Pꜳ����pU4��4���|�6cB.�hȖtɖ����1�7�>�<�@ɽ�!��K��`�[�S�C!Z���V��Bt)Y;Z���|k��ִ�Ɔz9G�:"�	�P�:���
��Q��(ҥ�;`W�,�M!�9�y"�2��1�S�R�X���h��j���P���R?�,�e��`�!]Z�a.]����\���%ùHy����i
�-�|MBٟ���]1!�N�F�%�7R��	e�6��޲�66v�7�%��${�t��N�#���<`��< �#�	��Y����
>�c(\�.�R�TaBJ�ƞ�Xǔ'�] �<�"4��Yj.��
0�@썐��%)2J�N�����'dȦ�<�)O�.͡�3O�LJ���u��mؗ�0r�y�+��~�;�6�Y�,��pun��;���*i�2!��s,�̛��v�q5��:'����HF�a������
�5t{n�Qg�~�ԒXܡ{~TL]�)V.�9��`�G�
��R��%e�D�M �I�;��1�ۏ��y��O�5rĤM��90�9K�������!] >ia�S������Ky@�U��-ڄ��⊋�|�W^ȡ

���R���K�Z[J.8E)ߠ�<�Ԇl��Ԓ3K��:�q	c�M�d�i�6'd�]��u�%�M�<!V��P/�G;���l�J���"F�
"d�`���l��Z�"g�xǥ<� �J:����*'�x�CJ������R���.�"���_�x��G6���E(���[��$<;�uH�r�5�����n�!^�v��]��iI�`�I�N�Pg�v�~B��R>���O�Y�F�v@��4BSc���CB
t,D�-�
�&uz'�< B��Oy@cI�
;aW�	�K8A)O�:"g?��|�u����{��]��b�\�AiOj6Y�&+V�Qo�2�Z���ub��Gx�)dzF�o|��Pi�C���B�M'�o4�o86>f��!É(9��9�ֵ���i@ɃB��,Z��F�+s��`�V�Yz���9�U1'6bEY�H�ߦ+����vp��􆕭�b+"
nٹc�N���U腭��ق�
%�X�qAC�wج��3��zA��<�{bW����'Lu�VXw����mh������=,݋��=�C��r�"�Y��(�}%x%�&G�r\������j]�;M�aZO����ubg�k�kp��� }e�u��M2�퉕�X+��>V녳t���J�m+��I\�X�T�w⭘M�:1v՜zY��^o1�	�4��To����J�
#���l��(Ci�2�@�f-KJW�#T�pKܫ�KrMzt����4Jk�\>�
h�u�ш�ąW �����

�]xˆ�4���-ҞX���N��'�=	%!��
�R���5�<x�nDž��t8��P��y�����{��)�Xڻ���A���8��F��u(�L�^���P�Gz&?�<ŽR�_x%^މ% )��t+Z���zԉ�M^�J�k��#�PK�j��x�X[(�{��U;h�M�8ĉ۸�J|U2�o��"r���ěQb*��X����-�Ha��ˬ�oa�9����L<wƫ�k%6C�(+��u�Ψ�I@WBg�޵t,�5��H|�Έ�_��%u��x>���+K���s�k%�d*��u�XJ�<��:ŭbmC�p�%�T����;�nb�"=�i�3j(^Yzi���U��J���oJ7r˵l��lO�Y�Ժ-G�?� m�e�Z���O�w�t�O�[�~�Xֲ8�v9�H���RV�G�{bW�C��<�P�žX+�m���y�jq]"��ç��E�[={ԉ����JBI�>*�Qgi�CP�F0,t���[�^�W��=3�<V�Y�h���8 �n����/|<�^���&N���JSK�'�P�+ڮ��w��K��݁�Z2@�:_3��'���ZV(H���`��пohϟ(<Z2�u�A�|���ۓo%���3m7/:��:�?bR�;�J�#���{G��7�|����"Ld��g�f�N���
/�L}>��iO}ftc�Rk�e�0a�y�~��0Z~���F�u����W�~��WF� ���W�%گ�-w��7��'%���g���1kf���5���d\����0��qgp3l����(O@UG�{����ǝ�U��W���P{��z]�dF��f�}?wmI<U��q��yúڰ�
:��1��k�6��[�3c>mܳ���}*kׅ��۟����WF�E���4���q����T��5����W+��/�_i�O(g#
�*K��v�5�s��4�>�F��u��_���<�^�/a�_�PKE��T.�,q�# pip/_vendor/rich/_emoji_codes.py���r9�(��_1g�llfl�V�=�ݳf���fk��o�,,2�bdDV\H%�Ew�$�I�7]�J$S�F��H�٩?a��',�D𔙪T�K �������������������f�8���������'�����?D=|G���P���x�<����N�=/��ٿ�X��5V6��`��+S�n'��V#�C?
�̗����
;�#�;
X�AG��_5h�!]?�Rc����$��#
�C>"H��5�2?�f���	A�A�{��u����0�K��c�'A�
�κnN��G��3&	�@ۈ�2{�����vY�|��4��A8�4N�f���@�E��Y��������O�x��n�h�C������<�c�A�D�
@� �{,"�@y{1f����B.D��@� !�s
�����C����e�G�3�a�L��;q���#�R�\�,�g�x4J�^���`�,�L�4B��!�|H����^�'f�e��Kxs�L$�k�Òb6H��K%�ox�t�<b��
�Á��<��2�~#��ygHO�n(US��5
��
HO�?��=ݕ�X��`Ŋf�ln�|���H	H2��5���˒�<܃�1�fY�c��7�3N��
~c�#-bW!��)6u]2���ni��~i�6�;a�E�y�\չҎ�����W�����0�O|��$|!����p�sV��&�/���c�dU;*X��t����S4�׊������~�(Nb,aЙ��a�%OL�y�K�e�O�t�+GH�g��8_��ֽgx�w���t�_ X��ᅤ�'�oS?F0m��1��g�N�3>�������>f��_�	f� ����Ǣ��� _B��^���ǭH��5�{�n���
�ţ ��1R����Af�Ë�ts�D%hBh�a��8C�Ur�(�Et'x�3�&*�]����~����ß��������cu�?�5K��p����]��)I����j|.ṭ���|*��Tn��xl��2��$[�G���ϱ����5
���ጐCE�_`��I�=n��r���@{������DXk��:u�B��.��VR"��p�T��I��r�
k��������%��ہ��K��&4�\7�Bc̗o��@	_)&H�44�^)�i!w�PKp�UK�%���`�����%�%�~�g�0�ǘ�1��P�WԞ��b�_ȥ��	��Xe�|0!�:A��9B8��)2m�~���+ܓ!����^�aU�_��Q�f��`oF�+���������z�\�Ԁ.C�&|���$|@�ς�x@�D;ί���Q�'h�v@�(���728�p�A���b�W�e�����
�v���l}7Y�<��e��M�i��9󕆯��C��wNj�|4��'��j
�맙r/V��\/?���)��[5�^�v�<�̾}���a(uqy�-�;���k��ͭa�Z
gG�0�x��޻�5�(�f}�{OL�c3s��S���k�׏��r���&����O9��Ыp�XG���K?Pft�i'��A'Ș9iOa&�_�l��#)�&,3Tc�@Jfy�H1]�cO�n+,��1br��|[�%�J���,k���q��s�
^�g�yf�bZo�C:â	�j�3�c��X��k�L�Ƴ�)>�vu&����5af�&�n��&���^�L��;� ���G�+�)��r�_��4Ά1B�&&:(r���P��%�e�6�������Ei�ܫ׀�
s?|��m�_a\I�d��z���R��=e��z�=}�Ge�=���v����^8s��b�$5x~G�^0����xl8�{��3�����ʪ�{['�.ݏ9C�O͹��lB�3Fҝ�Y��~7�Ů��(��I����+�({�,���"�`�Aqh���u�
L�C�I�K��4���'4/<hS��6���w^7��?�!^�oU����=n��B�ƚ`�`����������4��Z�Htp��r��¿"y�Q�؜�:�א�	x��(��<6��>�g��t����g��^�
3�+�@�g>�1?`u���	|
��Z�
�s`|�%���}�2��~ΘQ+��adC���N��!�ʑ��F>aV0�?A�&5�1m��ck��frF�-��0I--P�UQs� �n!�┦ q�,���f���4�q>}���G<q��0ȻCyڴ�۱1����>�;�k�zSz�3`�XA|*�p�-&���A2�}OLc{|��z\Β	�i	�Y�;�g	���
'���7�[u���Y��jx���M�cl
�|��mH��7�E�XRc��Gb��t1�z�Ɠ)��Ԁ��Χ_��=b�oG8f�,���aM|sr{[C�A�e�Xs p4{�5!�K#)A�`�M�A+^!�o � ,��c�3�@�F�;CA��Ad�ԩ���?����aU;�*·��8���
j�چ{��Gݦ�����{S�/i�>����JCa�٤;da���	^ �@8Y�_�_��<�|ba�K̸.q/�E���8cH�-��c����X&�Z�2�:*?�����/	��1^\N�.C�|+����ї�(�����9�ZO�1��?7I��o��m�)��e�ߎB6Rxj�G�#�",�W:ÍD�j�f|��#�y���=�r����:Z�D�S8�a����q6���$�,��hu�f~���"lSlf3���@�*R>7m��+Ь��Re/Vpb譎��s�V��3�s�g������[��g�@LCa����4��g����8��U�
��U,���+%�P;�Y<6��G�sZH_�2������>o�G����3��˵F�cʆ>�����o�.	?�!�;� F�/�}������y�)�|~�o�nk��q�z��,��7� $!��y�<bF�xd|�N
�|P2�"Y�7p��/T�{S��=��ڴ>_��r��X"z���}���4Y|�+�>������7t���W��|��ψ�@��̸�D4S��|O�'�!�?��Ń^�O~���v�o}�`��0�6�\}�'���|�ÌY�k�l�ӑ�Y?ʹ�B��
��8��ʂp-��yn0}��
X��o�W�!�ǒj����m@[�����P�~ε���ωi��{�C_�{����������<>�+V�`��;s��]��*�t
�{C���L�k�@R�
��(H��w|8fX�\�'���2�4]3IOw��=��t<�o&�û-п��v��>��O�W���@��/$cn
��w��b�	f�����1�]�fM~z]6��w��nq�|n�rצS��8�݂�@��ڙ�(���I �l��C8�߅�T7V�q�u�bˉ�n4�J�W��e���9�w7�q�yR���`����?�!���L��_R�Cn���I%]}��X��E��6Э�+A�79�M��6�{v]q�ȿƉ:B����4%T^�k���j��J,wl���ۼܐϤC_�.{_1pw�3��q����F���|�lj[�[�>�6O����:�w��9���p�)����:ų�Nc��,��Sl
�N���%�Swt奭�}B��SMBt�?�d�ʧ�T��T��E�j��3z����� �+�8�m�׋�qZh�K�l��������,�./�2n�b�L+���d��A�҆��i�K�N���o��F��K�w�s�w�Q�
ɠQ�$��2-��ڈ����Omd_2p	��6�7�ػ�(}̇��(�|,�o7c҂��F����H�S�D~��ȁ��#���LHr,l��;@�CO���ZG��B_Aa�;q�5x��3r�ws�Ky����Z��^*�6K�	�$��{���֞���?�Ыa�Y����;/�jy����;Fs�=�+�{Y���|�au�Ln��'��+�Q�e��=���O��j�{$�O�.�]�p_}+gu>ej'p���2�;D�k�j����U�H�C�d�,��A�����Ez����H���a)�|�A?�Xy�PFB��#?
���M�`m_C�	r�W�a@���c��j0��4��n�$�w����0)\;�M�P�t��:	I�3DR�q{W��:&'��
4q����hS�������z�y����R87�0ny��߁zl�%��h�T���z��;(���H�-<�Xz^ח���W��C�K���O�=��X=Dmٰ��?�����`'��A�Uv�	ꇾ��G���	
���x�Yr}�g"H}IG�:ƒ���851��SFE����+� n�x�qԻ4�a;�����;��dņK/���<mEN����[+z�b/�|�{gN/��dp��[ŵw��]TI��܂�!�fjZ�$�0��^�	��n��
Zhp��:܎O-n�ȭ�i�NL���ά�#�b�����m�<sul��c@�����Y]�Y݂����a!ѿ����g����j����\�@ո�"�U���X�Hx�Xq^�	�?��[_��9�7�	���sjEk��)���u<�J�d@\��$��*f��h	�6'���
��m��M��m��
����C�f@ڀ��ШwBK�qc�]�3�U�q�
���f�$�oԚ٤p]�5�1Ig�੓�$A��Q�)�MГ:?�Tʀ��0�^oMٙ�>�5�g����)=���S7%I��Ƿ���q�N�B`���͢4�@m�ߣV�K�Ӄ�Mqm]�$88D�3,2��&�)�>���"�T?�7a���	2�5�� '�*��y�Js�Y�w3}uqz^�
2�Ի�V\J�"�؈:��]DM^��rﱻ��3�^�Q�Ok�#%Q%Ӈ��;fk_�<D����"��C�Ԃ�q�=C���w(m�v�3�ic��'���M;xvQT���:�HH��TXl�nTǬ���r�ak�q��zX��QOM��op�ԥ��1G�q��m�OQ��Q���c!�Xo�0�E�Qvt��z�,7F�Xv�:B���XY��t�g_FJe�W0Q�$�D2G����;ԄC��r2n9Rq��rE��Иsɤ�D�C_���F��n���jL2�'^(��፟LxU�wl�c�^�:�|��c�9�S�C�W�{~�F�k�����u�}��	���7��d��'�E�Zg`��a���&jV���H���
�R�с�uÒ���ܺaB0���)�Ob��	_�I�€�"��Q�B����|e���a��8N��9��$O��RSu̦���]0"A��+�eȐS,��l6��v��eL]�XF_�&��$�m��H/O��\��&�P����Q���ĆK*��KX�4���

��C�L�)[1�ˤp��+���t��:	I�3D�Ս�q�rz���F������*��1̔�8���c4B�p�+QsAZ�ʊ^�M�a�BL�{oػ߯�F~ꓖPܑ5���s>w�R�E�<�XD?-�ex���&;"�,�B]<r��m�M���!p��\��4R;��g�]_X��H��Ҽ|�}���g]q�%{��/Vwc��N��;�qa��/U�Acm�Q�/�.J��T� R킯#6�2nq�}��uG��ps��^�
B��Y
8J	}^B��Q<8[���q��[`08OM�}��.v�̛��}���6c�
3FPѦ�a�2�A�l4;��ӧ��$�(K�Л�b1[�C@���͙~�v��>n�NY���A�j5�L_��o�x�/����,�s����um��F\�>�f��]#���*Ї��kV��Ԡzr~�h��NV�	��3;��V��/ʀ8���@�m�5j�^=n������F#�e ��*j�(�>X�V�e���+�J�=#�\_&)n[ˏlU���~���H�
eO�(V�"��ͤ<��U�~���?Z����?Z6��"�:�����w�
�R���ԏ
kR!q����&���MIҜ�h�c�,�b�r�T��绛�oI�4L�w*�nt��0��@i&|4�m���]���J�΢��P�t�D]?>�hRܯHA$�(����3 ��\��Cc�7sL\�̕ѱ��o@d��x�
�Gjc��)��n��9���K�qs<�c�~g������0Hn����%�}�j�h��ӫ%Ԙ�O�EX����y_e@ݠ����)t�@��Eh�`O<��J�gw����H3�B"J�J�A7��� ꔩg��jd}Xy��3����=x�b������Q�����@�VGv��仕��S
���O/�G1��C?���y�{=[�0F��p 	��R;-CV� ��Gq���W�lq6�+z�L|��<������F#���7��U|�j�+?j�[�D���>��b�#�x�6P��*o��shˊ�t��KJ"�Δ����"9^�P���f�˦̎�W쫧k0Ի��#h�s�.��E���\��)�� ��1^.`���Z��l`�9n>+�(�l�T��Of+1�V�(�ق�8ͥp��&�IJ��	��({
�*}��^{�ކ��έt�7�B�γK"� [���?P.��-hT[�먉ު]�6L`����z	4�V�:�[����M�a<�jP���Ҏ���"/��Am�ěī:5'�1��ڜ<��DH���������'�����̋ϯ��{�u�]�9��ó�����Cu������!�c�F�|j����:ɚþ���PdhVطD������G�f���i������0.����6�%��lh�)�5W��
��"y/v��Ub���I�h�����D���8�{�:6}���r�P���1Q�j*��nj��]������SpzM�����S�,�fe���
�ԟ���g��Lq*U����k������GA�[^��d��_��\&G�_�\���G���XB�D����V�v�t��P�JE�&z.#�\�����<�4��ܬcq+揼~��(V>��>�X��K�����:&q�y���d$���K�_'��h���m�����>!�ѱ�F5P��]��6l�ذ�x���Ŧ�Dt�]l�t;�S
��<����ۨ9�j�}�\��uyc��Z��*�ހå:��uR
�$��L-�$�i#�G����r�\rh+�T��qʨ���k+�2K���uM�Dۂ��Zt�*ã�2Dl�:a�NU�v�Q2k#����!��F�$�~����J{�8��$����_��)���L�I��ga��59�4��ppSf`<70��z�>)Drj�\m蠒��y��RpiDa
���[)n��ܐ�Un�+$}��J����
�vG%�ZY�����9�����aO�*�H�O�H9Yˏ
�8�ŶN��6`q�u}6p�ǮϵHY��W������#��3�6h��c�8�T=��|�����Z�7m�1�-�GO"���ɚ
�h}]:�8�G�Ǥ�O6�����Tۺ긠8R���dz�����A���P{:���!��xe����/�w��	�C�"��]6�2_NI�s���v��X|�	nhA��If�ܩ�������ߖ@��kD}Oy����U�0�ü��oA'jr��Z��R?�ɳ��{}^|��R�a��÷� ;)���c�2�I9�7�|Ǩ���(*��Nd$�i�
?�1�ͫ�`k0��1*.(�DA_��}��򑑸�(�G�,�D��4qFB\t�W��W�������%��y�AŖI$ۚU�tՀWM��
��Cr/��7�����BY���n�Bxc��$P#K�iO�C����w�;w�tDm.�A�s��l�,A0�9�q^��|.��a��_�U�@#&�0���.���b�^�!P��Ot���^�2lt��M#|0���H���}0�S��EOP�}�͇�Y�iS�F��Dht(}�MC��
�O�I��v�:�����Wi�T��=���w�X^�`�QN=Y�`���R�wq��-��]‰��LT�KQ�U}z���%�}�:W^eP��E=11�P�C�B�*B��N�
נ_yt���o�@=�C�������3����cm<�U��Ea-eSWL�
�eB��Q��0|Al��~���T8O���7l��B�K�"���W+�5��I��Jef���sÁJ|����ު�qy�|<����TM< ��]7iG�a�
<�#�n����x^7�F��?��IL�1�x���_#����Z�"�e���,m"�~8���l-��\D�aυ�s�2.]Ο�8A��4�9��
u�,.�ʔ�`����x<�� �ߚ��^��ޚ���my��g���?���P�o���[lW�פ�ZqP4�O-O �ŗجx=G:�پ˛�=֍�l�?1�p]�TO*׷	�(��9?B��2*>�4��vN��W�`oU0��1
ο��D(;��26���Xe�����}���ūVݍpf���R��
�84X�/�l���g��A��5�$��"L���w����Wh/�@Uᶫx���\���w�71ܛ��L�C�Cv�aP>��{��dA�˽���R��7��q��#��C�
u@�>.�ʸ��G����:�^���<�q�y�E�F�Xv�:y\�h4b�X�$�wP�V(iW��:ioV�l���ҭ�?)*��Nd$س8�J���y*�U����Az�\|���s�c�>f�]����!���d%�g���+����ņ�'��^ݓ+H���Fci�"E�zU����ҹ����ʅ0�my�+����X��š4H���EM^qwAΞg`���1$�����=TGX</�SJRl��#�����_�o?�‰I���j�벤�f��N���{#����M��q�B�8�A���	Z�n~�8�<Q;X��t���>�"��
c�
)3!�l"E�%}��_M���!��6nw�R|I܃c�fݲ��\fz/��W�� U��z�v9և7V�qR�
�K�Ό�w���=hU�c��3Sψ�5Ԥ_{��CD����?�������O+��#A?�$��{��ۓ
���$��$����I����?	ПHП��$�/���P ��u�s���P58W�������]�p[��a��o�$�J/Ua���m��b���1��*��(�L�Z�F!�];2P�l�Ka��o�z�*�����^?�յ���ľ
8�j��~ǃ׺��]��P�/�2I�%h�Mīo�dc�1��'�Pѹ��-2�ɷ
�7~61�N��+8��>�ܲ"��C+�Ɖ7Ts.�w!�r+�E[%��"_���8�~.�h��IB1l�7֡��#��@E���lp��^�k$�=���h\���o���$:3�j�61�k�U�7�F2����
�0/WK�i� ��n�\cj7zM#��K��1����mh�^���������J(sj�*u�/&$�ov�D%	���m�E����� �����IX�	�bR��	"R�EE��=���.�z��aw���!�p+��n��&��U
�O7W8��l�:@B�cU&��W�^�)p���G�p�՟n��\}|�m�
�Yvi�ހ�p�������TI���0U�xb�����
�$�&��V�Ȁ����T��˜�S�=
+#���g#��m�c#�Y�F_6�x���F�2�mg~J���gQ��M��֠?�\�,�I����R.������˱��"��]�	���Ю�Q�T���p���p��jQ���iq1'���|��]'浐ѧ���u$,�������9Ixf!L�$���&�ݫ$Zq�([H�F�Z�
Z���-Z��HO��~}��v)�ݏ��?G��O*(����!Ԃ�Ly^��w�Lv^c@��i���y$o�Ȓ{_��
��}q�� ��]�]��=�Vp�˛�b�]���C�sZ�w�X�e����
]P:�<נ��C�sM
]0p�v��U�]n�����r�
.�<��l��>݉K��˩<q	��b�U���]�a0�h�O���hwq�)pEJ{y[Na+Z�[��t���v!�,Hb���)�.@�H�v.��haӘ"���#e�Ź�)��|ԕ3p��;�h��D-�=����g�m��Y���I��#8
����ym��;L��S�|57����m���oֈ�:�S��g&�MQ�jB ��&GP3�#gP3qc��,9���s٨QB	�#���ʑp�E֘���#!E35���F'"Jc?�{v����]"�Դ?t�-&w�f�.L�]���΅�w�\$0}�>Af�:n���I�b�rҷ^��pi���`�^ѪP���S7���܄��Z�;R=���S?�)�Q]��qZ�-I�B_I��z�n��r�^V������҄���6�J+m�P���}���E�pe����I-��ɰŒU��s42Ҳ�4���,9퀢u�y������	�50Y��V�`�k�#�4�	u�g�V\z4n�F� ��q�5"�kTn�F��b�ud6$��(jS�s�
.-���o�(�-��2\Z�a�\�i!x�6�`�|V�*�E����`��ӯ����*��3�\e�zy�=[ٻ��ɣq(F~��c�u�40��h�	&�w7L��k(���ޥơ09�<�C�}xl�舑HL��ŢS���~�蔺$u=�XtJ�d`�]���.]�*Ӊ�x��s��t6��lE�x�ن����s�PR#v��]ȍ~z}���Ġ��ޒM��ގ��o�sě�,O�q��q�m����viy����vi|��k����~++{��3�Ƌ�b�AqE>��2[*�J)�U)�L<�w�D��"���C%V8:���q�0�-�
��9�F�AÈ|�r
w���5�⩰�� �!�n,�\�c�̄ �O>V��J׉���ɑ��ށ�z�H��t��+�'7��$��"��tL����$pԏ	��d��U�dБ�x.�(��*�Y �Xei��+M�zUu��XM]��U�N9�k8_lS]��z�P�Ii�p^&Ӵ.mt^$�r�w�j)+,Hb���~1�犤��U�=�֦BAoq�$^�@�3�_e����s�����%�0МH�ѰNm�����X5\�w�9��;��۷�v\�oANZ�=b���ʌ����jq~a!lqxa�l}r�oql�d�>���6t�@v�Mw�S�
���V50����{-U�
l��*�]p�#{����D�N1Q�V<�%/��ZQ[L6u��"o=�Z0i1����'�I?¸�x��ʸH�>�������A���>�����)e�2M���o�U|�'��2'5�[��eOj<\>�w�A�q�w�jQ,�H&V�����P}�j/z
zP��
bBK�Ͱ .��9k30u^��5M���.�8ƫ�a��n�M����A1І�s@L.��9${��A1"Y8!�p��r}Z��{nx�y�M���C�ycȫ��p�y�Vъ�SʂI�{mpi!;��9�3��d��%n���b�U���]�僮�N����*��?u�Q�N�S���ˇ�z���+v�׸��v��\>[�рFG�n8E-)�p�
��%�+�s�)b���v�HZ�h�n�"��K�M�B�&�`!m}p3h~prh�?��ä�e(���6�H;��m@K�Z�gl@�r����j,�ݰ�o�Im�� �w��u�6�(�6�(��Z�n��N���
a��XTϜ�A �%I�F�$a{a���H�A� N�2O�%��V�-��E�s�KJzŸ��Եh�tN{����Iop i�S~.�����Mx�p�:��H�v�)]E��]�x+읰��dA[�1�;$�W� ��<�"�ڼ�"	�?�r��yC�w��*ew�a< ���o6�6�g;q�����}ܹ�G��s����I����x��U�.}���H���k.Caл�v^s���3V�A�!X�Ƭ?�"�ӽ4�Lx�%nEI���$�H]'�{.!Wػ`��Ɂ���v���4:���%ZEIo�?�D�H]1�O.�Vػ`�Ɂ�������,O::�܇vش����ɀ6���69�,���I>�٥O1"Y��H��EB��f^���75�nmʠ���{=V�^�	X#�"�9�\�"�������9Ih�O��G���etTy�� <c�8`�����!PW����WwR\y�1�Ƣl�e����8dE���t
 I�o�^���=�Qٶ���ψ��W$}UbZz���I�Vr;�N@!/0(*���}|T�h�)B�M�4��l<�69�<�&��*�rz��]b�'4��ėձ�/��b�����%#?�����z��Z��k�Cl/)*z�}��$E�Z�b�� ������;��EU	^�a� A�B~Uk��i[H�J�^�l̒T�lyX8�V�uH���($+�C66Z$��%�L��dߣ��WU���ь������Kՠ�v�뉲�(��>	����7�m�(���dߝd�ϝ��H
�"�E:U�i���L���*X/ 
:��׮Nm>��@�} 3��>�u�'����W��m����KE�`�/{̀{�F�[P0G}���	����f+.*v�@1Jy�^\VU�^�ـ'�]�����˨�鏹$��h��*x�ڳ8A�{&�,�rl�]�ueɀ��Ы-��e<q��痕^|3 ����j3�V'd����5!g�?Fp]�шGCT��5H��!�=�L�X!���������pq!N��
�b��-S0U��S��M�)�A��fn����f4�*�ä���"@t��{�����V���C���#��:�S��g�?b��WF{�"��Ǿ*���\�̨Ӷ�+@���Gy��Ճ�Xw&S���MhN^�EIj\�a`s���Z���E��(�!�[\�����/e�Q_��e�1�V�^v�b��F- �EY���|o5��< ����2!Yn#�X=�Ǘ��q�����!�Y�o4(߽�A�Q�BY �8�$j_rSU���A�������0&�@���7��&�\���4C�v�:���.T�{��^*��M;˭k<�u:ϊ�	|頻3�
q7����XՅ/b]�qIOHy��E�9�<P�tM��ۑ^�K���a��l=��z���L���Va�c`�yU��16�V�8�)H�3��+����?������qU�>�C�U$�Ϝ�hHl,Q���+M�n z�Q�Ʀ�Waht�>n�"�*��S�v*D"g�}��U%Q?���LK�]C���R
5���@Z��r6�i}�kH� p��]C���s�.:��F!�<wU5���J�_�.���Ke8T���t��;�a,���¯2vh��o�E�R/@_��B�$��DžsV�z��J��
�4=�v��Q��Nc�Щ��D?3�G���{�5���*<�Pmp7^ٱ�Eb�% g�F���������o��r����
���.�
,����Ze �=�s��B}�Ch̳J�c��sr�~&��0@�&���.�7掳~H�q̓b�)�\.�x6n���#O�7n`��'�DY'���"@��U�b��GHEe�,�L߈�oE��p�Lu�Τq�T'r]�4����Ϟ6ђTg@���2�Q{���Y�P�2�D="<|�Z�{�R�~��Gn5�v��L�A����?�b����������Cա=:�SGZȒX���u��	��h�%�Uz�U"&Jɢ����$vi
7���p5s�_��!j�XZ�6i�EM]p��&�:���:Eͩ�|��&�bqJGTj����G�oӵ
��X��U=�x"�
_)Q�X~��)�-����?��Z��:
s���c�b��T����SIqV� jm�P��T�O�e��dV��jZm����	�m�.�E��h|�=�)�vu��d��Յ�X�BA�r�8j^���%���*\� ��*����t�2V��z�����nQbk]����ɚ��T����<��
"G��K�	�]�LG#1IVCՎ��V�����#c��‘(�F�wK�8ۧ�wS�4UAR��(���.*G6w�Kt��]0w{35Ig!djw�8���y�]d.�v��U�fj��.B2�ˑj��Бa���u"J9/ϧފIjj%{�ˑ4��Б+���%TZG/����&T3:
u�>�8R�[(\�)��Np�$$I�B�&/Q�UeTI�Q"��d��(	I���(�d��U�cБ�x��Mx��؍��l؍�.Gz��s_�dA&RP;����t���nB�P�B�Xz�6�$eU��L��#��‘w�F�ڝP��d�uS�4UQ�D8|0]��-)g�X�4�
���
����!��mŀ$��ܒ�ҍ�Ht�@��o�@銭B�x6�VHҪPm���	��(y��H]6�;!���~�8��6��s�5":R�5�:2�5�D|�����ARפg&�����oG�7�k�L��u�7'!IR��́����r$ps��G-BL��LM��DXO�f�p�ds9R�9�\��SJ|J��HL�Մg�Y����jGR5���A	�u
5'!IRR-��
�H�e%q��Ҹ�τ�.�����$�	,�s��j���&��:�#YI�,.��Iɱu
$'!IR�a%���sd�p�7���u�T�dFnJ��*��/�뎯#�]�cЁ����0��J�S�B`W	���W%W'&�j�#r�8P)s\T�L9.2Wd�%����i�&�"��j���-Gb���D��}'!IR�tʼn�ȵ�s�Xq�n+�xф*m�IJ$�,	�5ci�:��8(���@��q������Q��i���U肸n��~G�׏H�*�a�
"����}��M*�����x��F/a������
pN��^�(3l��2��4S797�����%�Нo����*����|��'�s�(\m�_\�D�R�:E�i�FR*��?��+��i�#�������B�X���u�T�NB��8�{J�V�Pk�Ń���;����sH:i&?,U�)��7�To0��.�o����>��{�=�|���=��ˍ�0K&��fi��cA?��W����et�~ݙ�^�#�~�0N�	��l��d��A�G~�����۩��b��歡�&�k+��PL���S'!Ir�H�y&��&u-[������f+-G��r�H��r�钛yO���$ Q�L�T�?��Ӗ��S۳���OOݏ�N�?>mx�tR����A�IU�<��2:A�����'�&����i���?����F�P��ރ�t8V�6�-�s��7��U-�;��n��ي=�v����G���'R2+��*��7�-��#�6`~W��.:��+@�hu�Q	�����QG�aY�SiƎ�]
��(�uD��P �jׁBۀ]<(*z���YA����.� b��O��I��
�z{��.��/<�K�$�Į��������1lIT���%l�^�ң�)�{�0lZSbW��V���*�)��°�F�nCmU䲲�H飘ŪH�>	Y�J\�/�U����;uёH<�6��
4)�}��ci���Ob���o�"����B%�˂�z�5�I��8}E�I������(����q��CX4�B�	m:�0���-j�$��h)L)<���Ą���>n/�Lz�Hũ�+�1��<`H��e ���e�:�S��7'�z���D/�t�w��?P€�y~�a�QP��I�NGo�<Y9�E�Z(�5d&�u�I���\Y$��pT���B�PFK��gYbnҷ�"`�S���u��5Q�w�����?�	V�si�t�נ��%�DĄ�$_GCN���Vz�7r �i�e�ȅX'r��FND+����M�$ՙA����N��y�������?����7��ys��BY�T��G.�rr�Î
�4��XW�i��l��������cy�@�6��`�E�[M�a 7X�ث$��zl�$^��zl�+���'��C��ca��NQ�r<Va3�#��_p[��+0E(��p���Ag"�)̸��Z�"Q��gu�NY�S�~�0y��;�>/�U���+�Y����W�8סM���5;�f�q��E��@= ?x�Lbr�
�2�GJIt���M�u�<��*FuxگYF��}��Q9}
��XEa�~F�Z��c��Z^p��q�J��!���
cB>D�Be�����<�3v)�/�� �p�ʝ;��K�A{�W���f+m��S�H�@��Bb��qNa��?pJ��g��m��.��D�vg�LgYd���Հ��hÕ�|�r�GfD�`��Iz���U��;�QLS�]���}�DA�À��-�/�5�bq;"����#�.�.�T��E�Td���˃ǎ�Ҩ�-Հ]��[G�$�ԨKo
��u�����1h�#���Uh�}�m1��t��"�th���a�b��
 �;��Vz��+�4�R+�D�	d�����?{�DKR��
������0�3�H���Br��r��>�6�&D;��û�Fc�V�H$R�˼A?#�H�6�LC��3jc�ʡ�G�o��U�:��[�ڹV�JE^f	���_N���-��U�V�]�wn��U��#�	�ƣ�|͐�y�!�5�8'�SvX����P���%6Q9u��U��<�J�$_�o�^�c�����u�vkɁ�~��M� �w�9��|=
w�&3��;�4ҩ�WQ�����;"��+F
֊(����c��GY����8�LT�v�:�on]7�¦�P]7�Bw�غn�:��S�v*��C)��G7q���oߨ��s[�i��0V5`�Щ�+�~u~��3�Q������˸�+7�LŻ��j������x�*)!@2�_�PiU[�j��n���:!�4�J"�5��5p�|�|x��8�G*VCn��q��!�@��@�}��n�)��%}t��C{�.�>=��6[�9֑����~Ȣ��6*`q�=�}\�@�c��cu`��7Qc��xO�Pk�yy&����0�a���p
T
��[V��q3��s?���n�2�d�Y9P9�A/3_����Ԝ\J�$W>�I_��]Y8�-����?�Ä_.�삪�'���u�Np�!r�JS�B��c#0�ŀ�K.�k0�g��|6o��-,^�����s�$r>-�
e�87���A�~�/2�$z*B.-�U��u���q^
q��d���'�����	��G�X��P!��1�C�Q,~C��GI��:�*͞Hk��U�4�&�JU$kf>fɐ�B(�'���P/ч�$b�"�)j,r���07�tNM��͉�t/)�th�<��A�g�}�2&ʼn����!��"Qkڻ���}���m���Q_":�@���3e�\����hx�.t�[�0�X���H��#��R��W���m@�&�B�
5�$dz򜃢�v�8�t�1�Z�
f�T�����"����A�Ho���V�C����rU|g�
�H�9�GL�9a���8����sa���~�����V2?6`�_��|�I����2�����06}��x���]�k��z��S�v*����N�֖jZK�8r[m�%B����!�����!��Z:�HW�p���Zu���7F#��� #qf�4�|�=@3����P[��[ht���xg#��ܟ5�
���8�6N��#hN"��,0Lk�-ă���3�݇����ŧ��"�Z�v�FuLy��GW����)@�v�0vrV�(y�F��ɏn��8�@��e��Y��[�d�|��6f�K
��w�W`>k=Ú�<��0V��m���\o0ɴ�r�c�l�6NM`�8�<���̸�m��/0��A�s�"�4is�^b�j��0p.����T·2~��^�6�s�Aq�V.h�j*�yT8:2���<�GyjN�u��4����Q*R��]�||�0�p({�>���U{�`����[D�/oCsʕ��
�����*pmE+�+͎��ULG��*�+s�^�W��)H\ml�OV��FI\~7^"hx6�$2aw�S�*���>[�@�3㮕�M^3nZ�h�=+���S�b����6�����B.˯
HW���B��ed�]_e�\�������r�J��K�0W�x��� �lN&>]����d8�#{If�ܩ����7�39S��8�P\�l��3����<�D=�?�z~s�E�O�k�� �rfe"�N���C��&��2z���݄��j�~׀��?d�|�v��γq�c�~�q���h�n)Ad�ԩ���G2;�?�t{�v�-�_���z����ׄ�ʋ���&��G�k�u�"s,�R1�����Cqb@��ƭLʡ�R�/�w�� v��#��@ྉ���W!�Zm��M��u��Ƥ�pV����K5W��ug�W>�e"�>��y�� ����!��3
��FcȻ	�VM8�fc�Ĩu�
B2�(X�!������a�׼U��/��m��g���D���9H?�x{�H-�FQ��pi�Y~Fa�&���ⷕ�6Y��[��P
�����8mŀ$=���������
�+�-Dk�m!];qk7�h!�&n1W�ͺ(T-{��(��Hꨖ�H��}���QC�%���ALTV�O�	�uV�2��\i���*��\�����Q,��˳4�9*�4�:��4Һ�-4	�e)��,Hb���/��^Z2p�}i�ug��-���#��k*%b�1�bZ;
Ǵ�vź��޾�Lk&$�K�qT\�(���m�\r?_��v\>7���>7�����|n;;{�\cd�Grr�*!��҇:N?�$k�B�t��Gu��A���=�Z�A�TbFZI���ed�4	\�Ì��$��s�.:��JaS�
˘�=�'���n��&��?v[�&xA�@�z��ajL�]q؃*��aX�*=r"���#���=rX�V�Gn�"r��Bz��!N��Z+dG͵v��k��<�C��/V��"|Hn��O���W��W.��\�+^��k_;>-V�V���a�E�.�Nw]c��h��ۤ����ٻM/H]�e�I�{�ZHZ�~'��^/~��Z賅��[([믛���:���F$�/�X����Mx�A�&�� obmf�&��ȥ!�Z���th|s��ĎR�-�]Q��sѾ�fk&$��hX��kO����9�a;
u�d��ْ�k�n��肕</Ĉd��z}�v؎R�-8�~�����m�U-�1"Y8��ښ�Q,�=G��L\A����ū�^�ɥŰTj��&p�m��Qy�=װ4Γ��#�(/��kX�*�ΨMs��fZG��fb�S��ɷ.jږI�t�3�_o@���z��JZ��7� u)���b�.���8����fC2np�{ߍ޸h�иhf�rGКQ㮠-'�΀��*��G�F�(^{.�:�a�
7l�g������Ź�|�%���=�Y�:��i�,N�yq��NvZ##��:�֮�nk����y�4�A�\��Y�Lc9�
X�B>��ZXFe�h#mm	���nn�Gњ��]��X���"rjׁA�E��In̈́$w豥<��}m_,�=G��L\n�=�X\���Ey�\�#c��&�H��;vv#��o����u�WP:�g԰�+�c2j��1�o�
R��G���QЭ.̛S�E�J�"n�mo��"�����7t�Dw�§�T��k�;T�uY�<��
�/.\�¬��rͺ�@�s)�+Y���O�-�����|t3h=)[�i13��qO�*�q��H����(h����ٿ����o�4��
��-E[)d/5��R��w�ɩ1����n�S����������c�caF�q�Ŧ|�:�գ���t�n�Zg��q
�Y�A�s�w��0�ؑ�\B'���w@l��Q�5�{�00-�xAV$�y���r#"}R��4%-}&��$���u>��$t���Nic$�C̸������x�>�`@�܆M���%��:���!��	F$� �O�P�ҧ����ӆ!@�C��a��i���ػ���%��H����hD�#T7�.i�Ѝ�KbWD�F��M�n�Dm� �bN���G�/-�m� V�6a+q�8H�6��
��*�0�x;��iT�lxԴ���$�]�d�C�{Wz]�Bһ4;�����>��&7M�&7M�Z���mr3����F��=� Ր���F��6r�����A�:94��J�'�r�M�b���w��<HZz���`$�k���`L�n�����v���`o�V�6c҂�� hEL�Ļ
�V�.Q�mu���#.Y�LHr��E��!�:����Y����{$i��Hnm^ 99��E��;��0��7;n�ȹ��M��E�>nނK��y3���y�AP���5�@��E�knCb0�/^s�����5�A���;�0*#��ðT�6":2�6�:r�6����o��-��!�9?D祟���'��-h���"v�<>��\aa�C�&��%f��8�<��Ts����C��M�!�� {��˲h���S���X�L\"K��py�.��{-�C���Ԃ�eV��6���� '	��q�v�>��ju=|c�ǣ�~��:BE%�N����C���*U��[G����@QnWnZ����Q�<�&W6��7��
Q�]w��/+��
��$��<N�z� I(���D�[�$I3{��x3����A_e�0�:��FOd��9�D�Ȕ�F��̳m��0ЭZ_}wY?uꠢ�O�D��m�R�:��o!O�ߟ<���e�*0���	�0򸥛5�$�֍I|i"������&�L:���߼a��)|�YG�,?�1�y�ñ��(΍*R�:��9�u��,�v
yi%�-�6�c�(I��c�;���� ���/6��̻�V�8/v��nC�d����!Hu��
^TH�bEi�?��E���G+�\1����ei��Q>��]�*��O�"��*'
�uZ����*p2衧8	�F&a� ����^��Xe��B�I?�|�h�)d)…ik
y�t�Yk
��\8jM!����ҝYxњB.[/[S��c�Uk
Y�l�uk�˒�Mk
��|�mk
�,�kM!��)���5���[SH�`�5ŏ��Sk
�[�ܚB���re\�Қ"�_[S�J�o�)�$�ik
Y�
��F
�eh�{k
��.h���]�r9���F�P�V�"=�f}]�uM�ϝmT=DW���m�WԨ�"AAqQ�*H��,�6_��(˚q�s��wmh�+��p^\9fIQ/iN�ܼi���"!kݝ��e��V������#�e=��l��t�t�=���'Bm�-��G4y�}�V���jDm�@[oDYQղ�cβ��k:̳,d]]TjEϮ^��{�Z*,W%6׵�Ǫfo��y�T�Ѕ�����1��>'Ԉ\��pu9@�����.�i�^GW�ݼ��.��t'Pտw�C[w�
u�|W����R/#�Пo��t���I6�*�˺�V'�$�{�D&��e\�b?_�?�杲�֎�(���CSa{q���B��4(�@�D���ٵ���7�e!aɸ,"����SG�XymvG��|��u����j�+�Q5'��Gz�|�	�i�+G&�ׅ;���<�ƒO�/����_xc~!Q����P#Y����QY?Ch��c\�D�l�hRj�4UU�+�D�^�F��4wp���S�E>t���:S�p�(̢�jD��A�h=�/�E�i,�g��@���+���\Td��4>?��pƻc�I{��?bUr�) ��K�2��0X�@�n��%��t�%Q�k����f�(�o�~һ�n�W>?�â�M!���ն=eݤ���ڎk��6#]QTܨ��k�uC�Q��_�f�b��6T�I��|Y��(��?5�e����k��
@6����6�e������.[7����f�l�6;����u�h����l����?i�_�v�z������;F�5�c�]���L��ѧ�l�3����.[��+���p��	��{����=��u�QLR�+g��k������e�25��W���b��Ti���p�2N,'�v�::Һ#��	K����O��k�����o��O[�y�)˩��nR���J��!O[O�+嚹4���͡����?׽f��/����"���y���J�����*��kWY$j���|� �yØ���A�V�t����r��!�[Q�S~�g�;婿)7�b��&>�f�`PH�'X/���Z�sc��x�FL�l?��j[�r��]�FtT���)0�x�auk��PJ���
}��%0�@}�͚0�^�������_���$��\Yy����<o�'��X���'��*~L�J*X>�#Ɓ�Գ��
4
�꽸R�����ӈ"�)]�n�*��𣉖����C��u$�]f\yQ�;���<��u=��(��z�A?�� �����^6����Aȴ�HZ}�6R����ru��j#�\� ⪝��]`"5�v��v��(y��J�+ok�q�7�c%���|1�\k���̯(�2U$n[�gl������J�=�<��ⰭK\�܁S廷�vq&H��&px����tN���h���щx�'pz��PI:�۩�4������n��9� �X=Ҿ{<�����ƥ\��V[���0�Cn�Q������!w���g��U��W��Ȋ���qd���]���M�ѯŝ�KS*�r�8���W.�^C�|���4_�z����P��>x&Խ��j�5Tlߊ�o�saT�pp�!Wx�X:���17��KP<}�)֕q��d��@6��L�������>a>�Q���>�yG�pB��"�V\��Ř�I5��I�q��Ab��
�(�����L/�'
-��b��=������c�c}&�F̔�{'�`��:�(+l�<"E����y�%~h|�+�e�|��̳���
�z��#�t/L���8��<�yE�o�ǔ�hu���{��i��\��;�3�}/p�S8�<C(�����#�:MI%�s��Sr8���M}>t┫W�!K�� ���ND��s��T׿N��򝉡|S|>��?�\��>%:�7��Ђ���ˊ+�	o���e�5��$�l���r_�9M;I�u�C%~b��'|m�mOc�X���o������W�/�%�CQ'^ׂ^xF�
7��֬g��›�zM����|�݈�p�����tİE,㊆OI��'�f�ه��e�����}ķ7c�I
��Gu�w�=\�.��iy}��_H�!@}-�z]��C��ȸU4'�3|���>2��g����n�zY>��3�����ƣ8��j�����=��r!c	է�&���S�B�Y��%�/��@���n���ٯhXt��+d7O�ߦ~��ꖱ;�2�V�y�Rj\_J��}����N0��r݈�X��vK��.�^���[����ǫw9�|�����Q��HUQH��{Dj��|1OЌ��1LT$���w����g��r1��ܾp�1bꧼ$�wf��akRW#V�c����d�
��ꮷ�y�Îj]3�~8C\�{A�@�ObF`և�\B}��A���R+��'"�����R1�w�$ͺ��[�I�th�؅��=!K���γ0�u�����~I�ї��X�]�SW���Mghʤ�n��L��X�a$��axI�@��\�8�0^��o�z,��1�`}��h#�P�k������'� 磛�s��nj���D�(|I���j���9,u+?�m=_������Q�=qi�:{_�z5��_�0R��p��7��z�U7�<����G �2��I�o�
�a��1b<__�Z$z��TP��#B��g�BVz[�P\�E}d|�.� M|�.P�S!��O�C|��a}|C~�?�]yCΓ�,�~C���q�3�ԭ��?��Q��-�r̰h��!�o����r�%��L�Ƴ�U:#�o&��sq�ϳ�I2��W�\�ܡ���w���6��HO d?�v_�ԃ!K�l#��l�
��#��L0F�z��3�p���l��`�;R�
�[�< ��t�]m�ޓZ�1X98�ɡ�b�*[�V7a���R��2I��եőz��^�ߓ̑���y$VQ�Q�"w���%+��=�.s�;�?��x�V�Y#?�^�oJ��2%Z��oR�7�3uYg�;�#ؕ�#6���(�&l�_��k��x��n�G|i3�V��Gbk����p$>� ���I����SZ}��
n��V�f��y���W��#�	�=�*�G8���E|�s�QW�HT�E���}�@jz�漮�96s��hU�@JAl���k�n��@�.0��W`}�[�(�C�Q���pƌ�Ժ��Qť�vuoi�
<����`��$�SWB����)�-|$Ug����c��r��f��4�Cܱ�������%�}A(u����/����q�2AHuS>f	�%u
���`�n~�A���c<&��P���sf�5 �	xL��q.�v"#��T�ч��'R���=>�ʓ�ij�ԧW���Qꪑ�v�#�I���SR[R���zfp��3�Y��k��R���Z�'�qK�1@t�M�C�Z[NH;�b�����V ��@��\0V]�9Vƥ!΁#�X_iӐ/�3�(��[ �C�Ҷ�"�W�]���4��R����q�f��@�2������sAwX��Kz�
���O�:���	�oG��i�$�h{̈́�߉��l��Q�F�pMi��\�X��Z7Km&Ȳ�K*b��
αük8���r���D�Q}�hc��L�c�x]!&+��
"q�I��2����T�����@�?�S��Yq	��\.L�ĘJ�`d:'N�����J:�z#����|�FI�g�PNc����ţߎ��'�������
������`g��p
�����y��|!ő
},�/���/{b���_�9�Ń!��b�0pU���N��������O��jdq�7�IH4)d�|��GC̺n�2�����2�}K�@�+�@�<*�T�aQ�C<�X~!�W��EX���K'�Q�E�u��W������pO����X�3�C8uqsi�����(��6m\ɹ)	ĭ�^���EN��!�_�ŀo��_����|���+9�fE]�,G���d�~V��G�.��yn�}�U�l��Hҿ�*;�a �s
ǎ\}���<W�������46Ҷ�;ٹy|R�WR��Q���1�T�y�	!DmY�~��~>˹��1n�ʅ�|W_ �θ��:�����)�˕L\t��������Zz�����j��wH{�ʀ��z�� �6�ׂq>*o����z�5C}�r��c}�Z\|�W��`��~N��>G)�U�]�P:H��߅�“�Q2��Q����|M��6�d��6;�C��d]?A*�ܦz߼~$k�+��Q����+q"�>�x�xS�^�Mq�Dy{�ɭ��G�ǁz!�o��d:F�G�/,��ˮtC��ǐ[{v�!���kH��'^��d���G�&i�x���<��޾|C�|p77��U\�(�T���;��` .0���++�2�(x�c�&��@%޽ep��)#}�{S�^�/����ø����z��'/��a�iUi^�-�]��|�
�D)窞[ݸ�g�)&�4�ұH@&�{>@����Ʈt����ϫ|����Cr$�5��W��M�"%R4%Q>�����68�Ë����GHWw�W�$�����9z�뚮�,]����Kh~)Kg���������{�K��p
{�n�:�l�n�Q�s�ʲ�/��{�(g�n\P����b��.6�NM���;QN?�ZQ�#
��#�7I���޻�5�>91I��'�F�QD Y:~O89�!?���,�4��,�M�:%���ƭ��������5��A�}T�4��@��~20z����#�B!��`m0;(��h�,xI!Y�6�@6
�
����;Y����2�Qw#�jr��1��˭[��M�f\� <
�ǨW9��S웍�R���I�_����ht���T'/&�h�+W��[v����+�v�]��$˜!Fw��m�A���X�}��R2��/��Sf\u�^��u�w�!!�лP}�-��/����ёh��dÞ�%��<�F)��]�r�|�NP�{��;呷��lM��%e������Ш7���g�+Huyb,5�ه-�	�.}���.���Y��h���A��ϧ'�VZ3OawR�:�c�%���Y�����:�������m��3�����1�f��d���Q�R�	��&��}+�QĿ�/a�FO�;���$����B�#��2ٕQ���u����C��5_�˚�k� FͣByO���n���j���#��%� SIs���+�4 @�*�BU�͍g�	����}1��5M3B�tP�S��]R����p��g��g�#k����<�6�B#�K]O�yu���m�̯x}���cPt��*����1�'ɒ|�(�!�2d t�Ԋ�řG-�R�PrA6Y$�C������IF`{v_�����r���ǝ�)sS��	Ғ�y�>�5S���_{�v?�!�
ʞ'����4o����.��DieON%)�M����2���B����G��>�[��AH�}��q������>p�����
 �����l֌���T%UI�euW����	]<��XT��
@̘�:Q�n�E�������y��m?���cf�SG�$%�Y��?� �WØ�Z�n��)-4_�/�ԏG>���E9,���	N�~H�������̍[��%�D�թ�42�FAQ�<�
�ki^��*�W̵߫��R�&�
�_�e�����.w ���=��^_�
��N�)1�� �Y�@s�t:�3vK%���s��@x���fE��֪J�8��� �a���L�ЛO�F�t��9��%��/V��FL����ܐ$���ϺH�|z}s���ruХ��)�ӓ�c9d"O5@K�<�΄���Y-���l_�G&����\���0��'�Qe�+QO'�&�/K�z����������K�
1�N��_y��\���3Ϥjs@��[<L�pX�2�0T�z��p'�&?(3��wo�0��v����T�qt�!�O�A$�=����[<�G���E��G�+3�A�e�yi/�c=���?O�x����! ����9�ްn�0��W��t�L<�9��~p�!��G%���Y�o���͘c�~��;�4��b�/>�a��?+1��oc����{15^)�}����Ŀ|-��=d�p����k2���d�鎰x{�d6GXoIRkv� ;`�1Fp$zc�Wod�%����y{��_��l�ꚕ�
�����"`��xpbWx�#��i��DF?�Hi��w�"jP�NU��B~��%�>�*�d��SP��T$k?HJm�A<�|�JξL 6��^@8m��ծ+*
�A-;p����3�蜺�.eɕ�j	+�?mQ�d
F(Bl9�-�Y��\�@�Tt�S<H|�*��ga�֣�����;��h��V#��Q��bf*���zlڧp����!%�(R�^�L�S�MU����
ju�g�I��-��5
�%�`uN�JZ���oN���aI�;
��ǯs��
8��B�`+�yo@܇ѡ��k�Z^�[�A�L�6&��D�$�Z���1�VS��k�<�o��C�&{���z���y�8N;���ᙹD�'�P
�E�v�_j�����_h�@�����%5���$���vs�q8��p7�c��<x�Uu�Ћ3f0�T=����:��9��4є�n�������ӯ@�?l����7���s6�q�AX��p�i��w�8�x�!0�7w@x����s-f��_fgs�/�����f�~r�s��]��ı#˪��6Tx��M4iqФ�A�6M4iUФ9A�vM4i9Ф�@��M	4iФY@���0ϗZ4�o��ؿ	��&p�>@�_��?PKE��T�y��("pip/_vendor/rich/_emoji_replace.pymR�n�0��+�l�g��4� 9ځ@�+G�$
��h��]Rڎ	(rfvv���
�cW�{��N�U]�����/<t�ҭ��0�X�xq��~��Bﰟ���c,{�'kH׫���y�D"{<@��t�����!��c�n6�b��2�j�� ?�t�9�Rg��h_��^(5�Q��f$��骚�]�l�%L��jU�`@��&N#�SCm�we*�����-��-��I�L'��5�3��Dl�>��X%�mo��ܿ����Dr随���o�L�+p�G����2�c���=��
U��g�U�,󈩙�����v�K��<�������ND��1_�O�N\`��P��\��G�c�0���H~֒�1<�ȭ0�ѴoUC��ދ�{���r!Zs*n��iC�"�ŵ��FH	_N�g�����	���<�Y����m��
]�9M�a
EH-�"�PKE��T��w2B"pip/_vendor/rich/_export_format.py�UMo�8��WL��Ā%yӢ[8��ԍ�q��b0����D��"���{I��]'Y�Eu0?f��q�~3���__�/?,f�����l#@}q��'��7�Ȕ�� !8RCJ$�0�"'r��^L�7Hm�r��ة̘'��ڹ�������q1�*悬/��>5�;��l���nK�Ե���$,%
06�!�H35˵ `�F(�tc�R��H�x��=�ǟ
��,��Q?�Y��G^J\��*c��!A�J#ԁ�N��~��

EΰR�s��M���a^��
*!A�ĕD�4��%�;���*i$����U"k��e*(�r=�,�����?�:Yb/\.HF�$���n��܆J��f��(׵�6�f��f.$m���N@S*0LT�i瑋p����6��dU0,P���_!�c�-����/�X�/䩏���g�.�cu�N���;�~���?��6�)�"���O�~��NL���2��l�)�^
�E=��^�w�E���7T����%�S��௽�ѫ��~-ȒF��Nt�l)�J�S�C꟧�N���כ��q˥ҫ���IXP�F�s��\͇��F@���J��95�|����Ikﭙ�mC��d��K�8o��
VBE��'�
;�l>$������˪��u��'�&m��NP�N�-z�6��7$C��kY����w6Bfʔ��p6uv�m�C`n�ƚ�~�<{Ӟ��^/�;\�=?�6�Y�7X�w�@�	ۣls�Z,�g����u�2}b'$����l>?�/onϧ��n�q��|PKE��TIԷۛ	pip/_vendor/rich/_extension.py}NK�@�s�&n`!`a��¤4�T��^@����:�,'�hL�W�EQ���(�:J�a^x"�R��*8_�&�$�~�X�����al�I�3��#�ڭۉR�K+Z+��^f�8C<��o�>��?~"����`k�AYm�.�PKE��T�~t�%pip/_vendor/rich/_inspect.py�]s۸�]��<������ag|w�57M�qܾ�44$�m
d	2����� ��5s�D���~cp�TG�ey�v��2V�iߨ��Z���ŒR�b�.rD3/g[
.w�6f{���(E�
�-�R��X�:R�^r\T�jOu!��ԍ<���,�|Qɘ�oE�7�wW�/c���8�p���_F�V��$�/,�_���cv/�NSA��m�҂
����(|�2��b(�?pb��E�c6�O]}r�~ӯ��B��K�/�	_�D#���Л�j�q;�/vB��&x��1}����N�,ˋF�Y��ox}�6K��&b?�
��O����������̔,�� 1��K�k�����e,�5r@��)�{�F��������X[�N��}:��J����$B�i�J#�Sm�X�-���
Q*I��Ye\�hv��K~b�����+A�U�>VR�N	td��_D�aJ!*N
DY�pSU����C���,5��`�,�%{�"#������Y�(@7;5�ԭԮ���QV�l����E��3oJU3!�^2"��t��)��V�ӄ��-��@"�ež���K�X�˩mՈ�2�xn!gբ�Z�C-
�\\Da��,A�tX����oD[��O���gY����E���ӱ�,�e� ��˜��S�Bm���D��n�-)��#?�~�-�L���j
��%��eɐ}�"�ⱃ��FW��P�x�{g1���f��g�a�̐�g�(��KO��^����0�1ǥ�qXg��d6HQ4����h,��T�����b b�1�ᤥq��+%���˟�����|N���/ӌ�(Y��&)FS2�?� �Vr|�Qyw��d6��A]wI=Z�N��d�a��S4���0	M�D�(�M��-�h���D���|4b���t�|a��`����
M�=@V@:�$*n�c\M�@uZ���S���Q{0�l:8�?��@~O@چ�X�>`�w;H�i�6f�%"G�^��J5 �QP�4r/��=�����.�j�7�� ���a}4�r���‚�/^��nٿяo��j.P�$I�	.��Tc8LU'v�VdX�k��ZVm2?/��M��a,��L|���O�
3 P;J�0�0=�b�2+2ݓ�d�����h�B"�d������<E�Adk��p���744��lei!/ŎU�-�O�^�_�AY�gbzy}�uD�C�7��p< d�O�K#}��Xa�!bd�ɲ@ǀ�����J�sf�;�\;Bż�r�p/��Ì�5r�kWQV�n��R^��'��ɥ�_AZ��N䝤r�"-�Nr���S�8z���#Aُ��=`ׯ��7J�{�1�I#@'[^���]eW��Ob�5�h�v>�������q_'����vۓ�����~zΖ�}
i��f��8�?���_Q��ܺ�;-��"3�o�gq�Y�	�h�@�Hn.����Ac$�`�R�ADIY�о3b��"�a�Y�8<ҹ��hw[�c�a��S����3I��T#�1�s4�t�1H�b��]�F����]d�z��Q�V�ꗶj��Ȱ0
�*DH/ʪu���Qqߴa�7�g6��lв)��v`������+�@���ٶ�$f[W��d6�X�䲞G���#><i�����8�H�xrlG�>@J��Q�o�]8���[j.w)u<�z o�e�'E~J�7gB���t�	�Ck�8�j�����fi��� �BmRXx�"[�M�}N�(w�Q��Ԭ����/<q�k��b�3��?�\d�fO�HF箣R� ����vx�����ߡ�`�k�$���R�U��',�s
��*��]�*����s��wo��>�J��v�a��V�$�|[Ͱ�*�x�gY�]A�S�LR�k�3�>��?�	�^�=&�h�����H%����^�4pJ���&���?�/��s��WQ��)������\e&(L�

b��d��\MQ�Ҡ��� �F�Tw���Z���_�l���C�=��c"`�y���&�m�}Oq��{Fq����L6us~t.����Y�\�8�i)�u
E.�uP�o����a3�6`����L��`�3�b4u*|�f��:M��}[:��b���@�)�ls��h�+;�湫��5V�=q��:��mu�^��U�a��5�3��;�V�����c�&PW��qF��fM��>�WI0J���
�1&�fN����mJn_ۆo��`���^���W[� �Z��uC��É��0�Nj�B�
ㅮ�q���*�ȕ2[9������Ă,�`�+K��c(�h�{t^L�_"`����7���Q��(��,"����^�����л�z�I�& FOb7��ɛ�5^���	wɬ�L����ߋ.����=�ѳW�:_�.z�ˣ����1w=�&��s�R�r����[eǦ
錖�4`e��(�O_�g-�
A�$���X�,���supI�����H �NWWx F�}o4r��;_^����}L~J��I���G�����V����m#�a �v�P�e/U�Lw�UU���K_}.
C��rZX03��zM��&7?������a@��±��PKot�PW�W�f�,4�����>�+�`t���g�PxR��ӱ{�ʏ�,N�>^���w�M�v��WWO���N�&$�m���*O%F���'�!�����V��H��N
�>�o��w��@W^�B����E���ژ�P(�r
��OǤ1���04�"˱��x�7o�GL�h/4�"&�Q���㱉#�"�Ī�V!N�^�{5�ޖx<�:�C�3z9��&�{�Kj�K�u�y�C��PKE��T����pip/_vendor/rich/_log_render.py�V[��:~�_"B+��z^6�PTde��t&�iJ��{�w%m��v��>�&��oe]�J�*�f���F*�Ǜʬ�K��[������%�ou��4�˚�m����ܼs����w	�^�|�n���tl�fڑm�;�����,�����˺��k�醉�����)�-�͜7��z+Չ�-�뤢ܫ.
w�N���ڶ�<tv:�%�!�暐�Θ�e�J��Q�C��[)�٪3��vDŽ����"��+��T֣��@�j����;؋�����	P�a�vi��+��Nr�K#�eA�km�_w�=�}�5�F'�����^�Xc sc�ǐ�D�ư��0;����F ctyT6�`�9�M�C{��z�e�!�'~<����
���
�� ��0�S���^��y6g�3ܕ�I��.�=9�.0�Z��n�E�9�m3�C����)�R�k�!��Ro�Uu���䟝O��QC��j�LЫ8�`S��к��/B�Р8��d/�TG���c���/Su!����q�l���R�9�(
��_%(`��j�2�;�*!�s\IQ���oN��z�p*y��[����)vמ�+!�ܧT�R��ĕT�v�6'�ھF;AҾ��(��ce�:R��26��0��UT��=G
�UY7CI�T��&��Iݵ�<�Li�@#+#��A�����8��рoF0O��3���ЮY�7����EAˏ���b�H������w�p�\a�oQ��vz��o��
��#��?��H��-�4��c�r�T�wo�Op��#�=�/�8'������k�63@F��t/�Ϫ�1��LHM!�)(L�	�.Bp���(z8���4�᧸�MJ�@�T���ʏv�jo����>W�i���p!kt+�l��	!���<��W�+~8j��P���PKE��T��%�pip/_vendor/rich/_loop.py�R]K�0}ϯ����G�g�/�����@���v������Pt:ļ����9i���N���YO�@��F���gt�$�%�C��Y!�h�m��[�{�wR�/��*��n6G��Zx�j) �,�x��i�C3
@q^���ղ��z`-`�ۀe�$\�i2S�5�1i��a���0���#Y�\)kNX�4x��P7P�!d��7L��]�(�^������~��Sv��+�yar��?wu��v�>�?��*�:���Z�؊s��'.����[�/q��7PKE��T�W-��pip/_vendor/rich/_palettes.py��]k#7F�+�I�$����z���J�l�(%��76����J���{K�J��j��Q�ݬ��PW���tڨ�c�;��'��h4�I-W_7[��{;��ǟ��7۫���n�Yw�����~w}��x��9������z�.���z�����zٽ��^���n�|z|�t���ry�~�k]��������EU��k�ㄶڠf��U�
�W���xjG��j���X5f��Zd��f\�?�-�,,2��u�f=�6t�D�}b�'��P�=-���l�V��T=���7���lm���W�&V6[վ����]>m�w�P�{ti�ܜ��FO��zuX�������۾�[w�W�ϡ{};�W�n�=/G�˛�ۛϷ?p��4;�J���8r�ȡn4MZ`?-���]̵�
6�-Jb4p?wq�a��i|Q�s�N�n������o�/��_���|^=#%N�^Ь���>;��%�'�7֎�kz�O~��νe�ZVM	j�uEP,��V-�[(W�X�mh��n��))�T:8,$z,-��44jh�Ь�YC�F]�F�FO���B��R�a�ƴH��5�hXr�Bf���SM�0�T
�xx(  K	�H�RC�$P)B1�\�PP"�@A�9�@\"�220�J�L�R�B9Ȉ�
2��A�y�[���a�C��5��#`�
D D��
�(r��A�t(JI�(LI��D�"&%TR %�TR%��A�b�@���HID+bR�p%R�x%�BIS�4�Ks�<ֈK�AC��S�|*���A�0�`�b�0_�@J2_��+H����
�0_�J��X %���I���D����?K����2kąH��!�(�@�"�W� #�1�P��Q��)�|ELJ���@J���J2_��+)��+)���j�� _I�� _I��.�݇�W��X#.E��d�=y@�<&ʗ��B�j8_��+@��$�0)Q�b��(_�@�X2_��+@	��n��\��+H��u�No1V�O�o����[6�!��tj�k)��ZJ�'��tn�k)Ն���Zվ��~6�Z������e�s������}��&}�ܧ2��
v�����l�����uY��Lf貓���]���eC�����`7�`o�PKE��T���L��pip/_vendor/rich/_pick.pyePAj�0���Oqh��PȥǶ�ZJQ�U"jkݕ\��#��&�!�3;3Z'< ]FN��Ȓ�2&��Ƙ#9����ܯֿ��(v���h�yDyu���y�#Hg���M>�$�@(M���LPݭ���,T�ZbUF��pA��	ة�P$���L�Bojr����?R��.��1��X�ͮ8,�C���䅎3�eT�P7W�,fפAoh��
e����\���PKE��T�d�`pip/_vendor/rich/_ratio.py�X[o�6~��8H&o���/�1+�v(PtCS`A��es�DM�⤿~�BQ;i�0`�X"�;�i��6-�{��ި�5�r`d�!˥j��J�M!o��T��^�6�w����&YU�p���t�����dnu��k��r/6=����z�9���ƶ6��BN�vզ^%���l��Dߵ�r� za�s��+�*�E'�EZ(��u��Q��;rvv�����[�-�{�B�sSi���.݃r�N�ۮ]�Pf���|�됂kS�7����Ҽ�(\X�Ʒ�Ui*Sve"���b�6e{�hg�[��Uo��
���@n�p�vC4�̭�4�8�Z���v�={���&Ř�ʵ�B�n%!~�kht�5�Π@k`srJﰺ�+2PY]MvĬ������]]UhL�i�8VJEs�l��o�(�z���
�s�¸c@d�F���JfX� pUJ��t	ZQ�0�O��'��_����M�;tc+�5Z��!XT�
�V0��ݣ��Դ��<PzP�:�KS�I{p�Y�	�ya���F�k{mv�֗�e�sRb�H�#��r
����-z��{E�ayVA���E���np�6S���-~ଌ�P��'�A���T��UG�{W��P��z�%�uK�jl;T���Y�-��q�>��.��2ң�F�Nz2C��kޅ����%{���]��1٩*Ү�b���e'��2$�~G��B�1�E��T���hJ�ev�*��b�s@����ב�6,�'b����J�]���t.��t 46������'��T�4%�>7�@?���HZ��GJ�҄
��p]��dWŎO��z0�����s�;��,�1�d�4�,y�@�Θ�ȩg�y�@g�Y)���;���V'��t)!c�S����gLk�t4�g.�K��KB$����)������o�Q�x&&o�@䤦�X<Ft]*8�̿D_~y���Ӿ���c�FA!>���>*����Q|$q$� ���򿏣��V&���@������q7�4&��nl�y:ҿ�#���a��BFh̶C[��m�)�-k�u�Jdc�*�v�Mc���+���$Y�&Ś٪��*�3{�?��r�2=WH��x6���T�
Qr����)��O�g涴Yt?;c���Pq��HrR9�4����
��\�d'�C�p�Ÿ��8�u����t��3�H�Tw���K�a�ǯ��}Xq��0�akմO#����'��~�D[�
QCP��|F�z�>ʩ�;/V%�a�p�m%~��
Y��s䪃]�Ԍ�H�a���3>r<��Y	z.��y~�������˛�(�0��F�1��l;�4�Q(_�'��粇��v&
A�T�4���Y��o_�w���z�.W���q�/�~萼AQ&?���?�DZ�٬#�D����t�\��f���Vv��Gx~�r�!��	g&��r���/Ѱ~�>���3�����?�N��&J0qJ4���Su��$�P�馝wUgW��{W��яZ���Q�����c�q�}L �����$,���l�BW����4��=�)��YV�蔘����]�_��f6:f���������I�z���@i���j�ૼ$�T��68Kғ$g�:�_��p^	�~����ƭ�__�H
5�L��BM��4>�&WkϞaw\��H?΋42�����nP���Uca�PKE��T�1�T_�Mpip/_vendor/rich/_spinners.py�msG����)��fI�q$!7��Za�Xu�ŕL��$Ŏ�=���+�a�e�$�6�Ϟ����� ��$�*`����6a�[�3=3����J�9�s�t�t�4
�B{#j:�d���Q���6���7�dJݗ-)>�#�Ǣ�R��T�Y��wh#g2��PNڛ|CJ��~��2C�Y��Y~��g���T{R�io������JfX�fU--�YiH�(}g�����)�m4'E��)9$g�6)�Ir��4BS�Z_NV�jzP��$͉�un����@�4k����lVK�2eJ�ZrtXI���9�����77�H�D�#�ԯ�)NT�ӗ��i57���$ژ\FM2N5J�F�Y.euJVKQ�;/X��9s4K[�rn���~u��UxGF�Rjv�M�W�o4G�Y&����󖖑�J*�*�_���,�k�+p�T2_:=�
׷��k`4��a�ӯ��q&��;%�cR�2��R�i�̤��WY�J���j�>�s�7�8<�Z�f]̄��H��K��L�ѧ���+.״.ò���P�4�ex�bOW[�^L�+"%bG{O��)����cE;#�R(���6�d��+v�W��pO��R��X��hOg�����H"!��R����h��X�hOG���hχ����WD�^��AK�h$���"�.z>�~�&���0�Q
K����hlj�p�x���%"4�N����H�c���v�ʤ�G�DJt���y��	ڊ8ϳ#v��x�î^�+����#�]�Hw��yH���p�X��>�0�=c�禥,OvE����WGo4�Ú�����6��xo�d4)�'�&Xq��c4+/��q��I��=DM��D��Og$�MY�R�����}kO�x�BiKK�f�~-�
}P:���B2��)*}[U>���f�y	�*̧0w`~s�M��`^�9*���������簿��5��@��}�W���j![M�
�k0u�#�t�C���4�i>�y����P��0M���%��v\��]�g�-����9����^����`NzG��U8��孵���{A�ˡ�s��K�y��-v�/������\�o�.�����ĩ�w��c=���7�w`_�b���]>o����5�B_ s f=�m'��+�k2����&ϱF�a4Y�O*2.��|��!%B)��[J�)"��!ᜐ �����KB�P�!�-%B)#L�������ބ��t���5�Ԛب�	cB�+�>&n)��ۢ>��D�%n)�!S�C������Ǧ��Mq煄�A��yQ3���A��yQ3���A�ǔP+�L0Qs�OE����](-K��n�cl�z��a>r�<�N�a0��]���$�`d��:��|y�Z����0���  � K � :�{̕�x��u��N;��b�	 W@������\�Χӂi���FimILb��  7@n��μM��;0�¼�K��a~r��; wA�|	r�+�4{P^�9���0��l�<�y�
��1�����g0��M�-{���&]��<y�5�7 ߂<g�X:O�ٔͩ��z�8������`��}���lަ�<k���iX�a���={��K��a_�={�QX�`-�Z��K�e���={�"�%�˵��:l�^�"�u�UXk��a]�E��+�Wa_�}��u���r�2aX,���nºۄM`[�m��o��	��۰��u�]X�`}	�>,���
��w`߅}���ﳵ��	��-Xam�z�1�'u�o�~{�C�۰�~L��v�럯���s��`k�����m��
�_�]�w��UJM+�U��U�'�}t���S�~������ߵ�q/��!���}�WY��#��Nץ
,�`iKKXZ��4��ai�ɪ�#)�����E���ьvjN%��?��c|�%�-E7�y/:�_�X�S�V
Z�ٜ�q��k������X{�߫D����?�Y�H�#�-;$�˞:uj�o����#�0���F3���	��\y��-�lWR�h�?R295��)�}��ί���~����/�\rΑ$�ԥe�?i�\K�f��@�}�%�S�'��%.��G�>9�Ҵ��(��Ej�b�yS
9���Ձz?�fLk�8�55|I����W�i��������q��Ƽu�
�u��;��*��>G{��˨rz0���װ`�06`ܨ�ʙd`Lc
�	c�5��wR�$�q]m�NS��Q�N�0*g�-�>%w�;w��&��0�`<pD�?�ɉ��a<���#�KN}�����X�1c��jv(�z�w�|��Wڠ��8�M=���S��g�]��H�$�n:��	�&w�C�:|�
���+��{N�����?��CA%��7�s8�<�/Øvx�>}q{M˜qx�?nq��85��T�ǩ���)�s�ܺ�[�N���%V��N7�0q��jnt	���u��c���W0����zJ��po��;�|IAɕ�k�*]�޻X��V��R�:� <5�ϙ=&F������#�;n��ZiET�֊JR��I�Y�ً�ԎP���	{�̹i��XzX,=,�JT,�Jb�$����B�0��^��[��̳sR�+��zg�c����a�TR�4E�P�Ub
S5���37��u�vaXM)g\өs������5�a-�{��A���Dɽz0Y>��)tA�^���WK��僵���i}�xs��WRZ��w%�}X}M�����s"�H� .��K"�H����H�"���W$�Q�:ɽp{��IӗK]2=S>��a�:�~[�C
t	�	�}k��d��Z�y�Z�������#�hV��Y
�g�^+�,��˓�2K����
-�~Q�q^�Vp>��q?'k�E���bYM�^4�Q�K`5�{9�`�Kc�^&ˏ�K�k�%����{Y-�~���d5�f5�\5�{���q
�%�G�;^UV���«�_�P�bC�Ɖ/���	V 񥲂q/��ka�󪲼p�K�{%X�.Y�׃UxuY�׃Ux=X��s~�,��|åg���y=`����}���R�`�|����끒�(�9x��,��%�칚�G4��o���>s�t}�]��,_�Tx�M_���ח^�r>�	_}	�7}��&���G�3��O�� @o��I�?����y���vS����S������������J���!9���ǣi�hg?��T�?qJ��<�ꭼ��<�j���j�|��V~F+_����Q�*��hdĭ��U��[gm�:���0�n�oS4�)��ٔM|l*&�6UO�/�Z�:�S����?��=~�m��97�x?�أcX���ݍ�.�6ܶW/x��p��D��/�W'~v�g;5񬟠֍v�c�%�2j67,���E����6)i�_������ݙt~K ���vː�J�q]�L8���fD�e��O	Q�E�P` rtӈF+�	���
L�_�9Sc�����	?�9����3�]��g
�c�T�����
+�u���Y��n����Z�H[Ջ�e������2�w�J�ެsjr�;�M�/�����2�l�h�A���64����Z���PKE��T�Q��_pip/_vendor/rich/_stack.pyU�MK1��/{J�-�ZP��EDh�Rz���ɬ���$k��6�'�;�1G^�
_�>��x��7�K����x�rЃB\�)G6�o��>��@=�0<�x��d=�e|�ֱ
p�UBt�)�(�ҫ+��d!7*l�W�􅸵G��5�~&�s@{z����_��2u������-���W&t1�$�Dk�I��u��"DO�~A
%u7H�ڭ�l.%~PKE��T`�\��pip/_vendor/rich/_timer.pyeO=k�0��W��g5�t˖)[)E�Ϯ�%��5!�=�"ׅj�{zO���j���Z9�Кq��Q��`G�<T"�g��*=Y�iȏl4�6�I�a���Ko�6j��;t�'W.��~��7�<�E܊�������v4�ᄰ+�}�(�X&�+,��B�2��R�e{L�L�E�إi�Za�?��O��2_�P�u�S���\�K�mҦ:�w�D	PKE��T?XU�$Y"pip/_vendor/rich/_win32_console.py�<s۸���S���'3�/��y���WO;c9�vR
�&!�=�TAʊ���ow�	Ҳ�kn�3�M`��X�.�%���yt���F����:	Y���&J��g�i��1g����G[��Z�E��C�&��r-W��96��0�d��B��~nFz��0
�K��@Y�*;x�Z3w"��y���9O�����<�l����$�#x�����vų�)�f��H�Z��N1��m��h�؄]�	�Es�b?��b�&�ߠH�=?r@K*�yt+|�=O��G5� N��=g\~�qvF�O�H�3����=�?,�.���b:y��r>�V1�i.�A�|�n��χȩ�e�g�Cv���*�!�8.��'�W���9P����E��b�1>L�YΗ-�Y��y�<�z��ˏ� ���wzqxt~�tvu���ܻ>�zv|��<>�N�.��^�����,f�z�����2v��`��$%{�9�+Ԋ���
�Jxy��"�?�S	B
]�Y���#
��g�v�>�,Is�|��%,ר��h�Hr�j���� �\���|��r���A��e�	��?�X�����g�0�p���2�>_ܑ�I�$�i�����d���@O&�K�/ҐB>'���/���ِ���~S���7Rԥ��{.�+�!�z��05��Py�DU	E�XH^$~��� ��ma<�\���Ć\�硸�*f��ǜ&����/JVk\�j@G��5�W�Oj�kk&��<4����˿ᖒv�_�`�4.,𠴈�ˋ�%�������;�����wv���)��2o�8�<��O%)�n��/�?��C��x-�T|H�M�
�9�sݮQA*�����2!E�M���{W���5����r��#,��8�x5�T3W��KڼKnN$���OQ��F�����zoy>��w`��H&jSq=���m��ɖK`��f��gد��w�'���,��;��L�6���"o��+���-e+D ��:|�����39eʰH�95�NS�q��e6�-*���wv~�L�Cʂ�a/�e'|���6!�$���A�gM�(��S�6�?�ژ!�,����}��P`�B�l�p��4c�n���J/4`��WhG�)4Y����Z��W\�Lao�����|��P�V��j�ʲ@p���V��f���9��l�Wg�d���Fw�fP�	�C�I���斱�"��+al�Ad�)'J��D[��Rd��
M!�
�ί��ƾ������OD���;mf�
�[��y+g@0�:x�j|���㵪��@7��!b��K!��#CnK|����r�a,&�Fx���ü5�.m�h�o�8Vc.IO� �$qc���NT~_���l
�F�����˜�툳�%�?\�]@���w:�n���1�#��i�
������c̓�|A��P!�XIsv�^�k݈(�},(���������]Ŝ�g��(I���o�Z�m\VA�[�Pa�1�
J�e��Y�g��Ӂ)J)�q�I���q�Rb�|�\mҰP!u-���Q���G����3����SHEJab�����<	�')�h=
aÿI�T��bp$a�lɱh��XL���L憦��GJ8w��
ߧuw��2����]�v�{ƙ����G��r�n�/�K���"�7�yfڦF��h�����J�vs~���-�p!mµ#Ž=���;�9�lʭ��1[��?$����](�8.e��ߒ9z��T��#.�@��B��MsM@�=P�O%��6�v�)�B(uOK��Fv�MJ%z��$��ؗ�ؚ��\���bz������>�e�{�?w���VO�v|��e����pd7�C�q@wQʊѶ�	�9�Ŧ�9E2�,n	0(S��7G�+I�]�I�����e��i�+����No�8��*u�Ǵ�e�mG3�Z�cJ�9"ќ%�3�Q�B�R���gAEN��ޮy���6{�.oc͒q��f���-l�
�7�:�kl�l�h{�\P�G��FCF�C1�E�`j��l�2�æ���-���r�'��ER�;2�j+�P݊��Nk`�S4��]���wn;&h;�]mo�8|�Ah���ÖD!Sf�;��BiʀO꒺94��۞�iv����=�g��mv��i�m�6fO�\j+hfq6��ExpO��샿l�.���Fb׭���0���rˢ�o�ت�[�ݞ�PVYR�s��ZQ�[�(��V���2��"07��<�Qm56�j7�n.$�6���FaU�FQ�d ��nM-�a����a%�8��Ǵ�8���c�Q��{�P'��oty��,��ꏳ��(�^�� nc���o��W�&�·f�vr���2�(�s��%����i����q�L\�����`0��v]s�,�?�y���Ǘ�l�|Aܵ\��*;�륌E���f���'��HY9�Y`^0�ŀ�⥘�D��h����Jҿ���]�.��LQnQ����I'"�'2�Y!����T�l=���2�9���<SMm�E,Zkؤ�A��:E�B�!�v��X)�%j�bGWgo�]{GgX�J�=cgI*�xx1=c�~P��1�p$q�*g�F��l\����w}�ݜ]�\�L���������gf��6��e���)G�\0�w���󔴬��" ��Gbbo.�N�^]~�8��?���ϣ�h������>�#w�+��xʬ����G%�?�-�i���Ā �/*��Q��<��c�kz�7��?���$�K�����tx����G
������'���o��M��
�xd��a�mj����?���T�-�m�:����Gu��}��A�3�{H���z�Ծ��M�׼��ޥ��뽸dU�K���M}3�p� H�r�s2χ�/X_9QY��u።��Y8�J����^	�Ռ)��X=JXO�R��\��J$k4j���^(��k���h�6�c���#{1�T\�X��9�_�:ô{MhQ�YK {��?��٢�U���|[���Wez�Ӫ73$FŲ���@�%�n}����Z(ʔL�	J{�/�DXQ6ߕ`�Tt��uK�*b��͋t3�L�8K����7m��u0h[���$�I��Y�@4�]]��.
��&赕'��ɂ��Q,(Ҿ���i�x�b1��f��\C��J��\ݠr�d�� �;�?�3��H��+ymB�����nVc0��,�\�a4��02����Y�O���=W�H��ھ(��qp��g�����.u�| ߇针_2�ˣ�ń�ٚ7�~�#9���Iioy���C��	-�
���wf�z.�#�b.��"2n2O�C
��K^Ĉ���Z��jS�t>�~��U%W��<F؆�/  �c.�W��M�"r�+�l~8`7��|˩ަqh2Z��o�J�9ʎ(���x�����%������J��5�Xc37E��9TE��	S �_H�~�fd[��;��׆�*���>ֈ^*1�Y�[C}�YT:k)����w쓲`�R*r���K��:�w��������f\�9H�P�TЕ��E&|SF`��7���|��:���0˫h��̤��o�X��QG�^��brCo���M��nY����4�l�����M�΂U���)Q�
%���'�qFr<+�1����jzՠ%�)�Ik�'�W�4�֚+p����h>�E+ d-���ӯ9'���I�D�D��:*a��l����pbr���&
6-v�K![����8��vk���ߡ�pM�xz��:'_d����
#^i�~N�i�-_�N5=%�ݫ�54��R�6���Q�C-�
��!�d�T�0�tBbi�C��W�Xm|AW��/\O��Ѳ���U�W�V$�^aa7쐱,}�;�.�yX����1X���パ��I���ItV�֥���#��'I�H��"��#E����#��F�vٍ�W��H�L!�m��s	�O��̊_i�HƵH�5a�� �*	�<� �1�	�ޱҸ�e��I 3�d�M���Q�X��֬���1Z	����"����>�AnmK���5���u P�72Z����iS0u�{�]>bQ
�Z�����bH�y�wL�t�}m��z�	�m�͘0��ol"�(,֦cI���$5ߏg�b}���wǍv�� J��G)T�V���Bf�'CV|�B?�krLyU�8�:�\�E�yX.S���r�zR?Y*�2��0�H'�uB�Y��G˦W5B�c�!?�V��T��MU��^���/!�-j:$ƥz�8��!8OJ{E�o�^+���֗�ԟ�5G�dQ��"���jb�ˌ򰀯E�W�Z��,���N��
�V����*�*�v`^z����������e������'��7�J�m_�R���	�(�&Es�
�ZU\NUK4(�J��Q�'�N?��U��#h-�)&�š��O%��`҇]���>��!��P�U$P�B��/8���?�ۗ�<]�F	��>u@���t%p�����3���k’��� �%f�W+�4Ue�L���J#�b���6$����hi�~T�1����I�4���;&fA����I�0���}auE���]ڠ�ўچh3����A�|f>�
z6>:��G�g'���'�f�w
���+�X��iT&��
�wXc�G�kw�
&�辄�����W�d�H�����b�Wθ��z�N�ݥl���Z�!��Tξ����@�]U���i��ɼJ7s��b~���	(@V��#�v%m�r:6)�vK�{��	���ojd3���[��V��OQ_g�)�nh�eGR!��PY���}ݪ���O
^T=D�5��=�����Ό-�ܺ�
1����q��M$�"�q'w�P��y�/�l�����{�3F��;�ʱ`��Kp�J��(C���nfb��;�KMH�8�Ӧ�.gL�?PKE��TCk�ڽ�pip/_vendor/rich/_windows.py�T[o�0~ϯ����D�	&���nT�
��x���d3$qd;�*��ĎӄъI��u���΅�������r)J�1�҂)�p��E����_�W�xP�R��K`����=���NM�NAؖ�m
�P���>'!
�KV(p��{ ��KTS�X�]�,e�[C-HE!�3��>����"�2N��e$���	�H&w�`H��[��`:�$qL�^���m��wV��F���!Q�$4ր����Rɸ�0��R
�K��1���}��n2�<����F-]ZA{��}H��v�Z�%t=_]/�x���|1��Y,�&����X���Fg�bH�c�k
��.<�P#��֒o
V=LqBnY�XExn3|і�ذ�G[�,6�N4)�\�����\c�AN�@ӎ(Gu
����hW^];�L�p_)@Iջ`����
61��j߷�y���`���@x2���fU
D�̢!��~o���`�I?p��Kl"�6��G�ISPm�8ͽ�k���v������=[��v��q�C�������'Oa/�Z����K�E�����j�Ƀ1E���d�Q6%�O	�#�?^�lq��q��P�ix��)�ޞ�;�	�1*[o�d�6�oG��C�(�X	��uKi��G��m�n����˳,y�mTs
��V�t�ˤ��_�I80�P�=��oPKE��T��=��
%pip/_vendor/rich/_windows_renderer.py�V[��0~�W���	K��77qv��#��5
J�f��m��m/��Q�9��0f4��I���	pf�,������*X�jara���In�w�E�ٌ̗6Z���#�ӌ�W`}��1�qk`�ZP��(e�B��	D�)�Dգ�`4��H*)o�M�u�@�0"C�)�E��D�̜�����ݤL�Z W�v]i�|��p�y4���
s�ќ����h��WW)I8�B�#��%��	R�blCwق�(�Y���iW�9
���XVH^�Uv2�-�2	f�dFJ�B�	Z�SvU�S&�>�\l�(���u��2*���z�L�Vj�5##�{|̓p���*S����9�>�}#��۝?��tS�Ta����
�p5u�c9xx���'�i-\��0�������z>z�~;(��l�@|X�Qdr�M=ϓ�!"�Ч�u��yN�7���W�S�5�sm2��l�<(̤�.�uD�\r�}���A����q�����5n�z�^�3�M�,h�d�h��J�Un����ϕq�G���`���t%��uȢ;��w{�>A8�ow2���z^�r��HO�*��O�Ç
p��Pcv��w�Tx:S�%�*�[j6|�ƗI���� q���A����a�
I���vH-RZǹ����c$�� ��d�����
��*P.B&>�x�	��mv4v�5�7�n� "9�.�C��@����PKE��T+,��0pip/_vendor/rich/_wrap.py�U�r�0}�W���L[��3��[��K˵�h�XI�$$�M���$��4)�ckϞ�=ڕY����i4Ѳ�TLL���CKuq�i
G��N��( G�K��{'�0�6�)�1�©Ha<C��E���Z�r>�J1N����'C|ƃ(�J:�2�����z�����|JgL`v�����,\Jf�a�o8"Rv<�A}�����i�1�f�wb��p,
�2���J�����*D2hau�=�T˹Jv:ȒQ^��R�^aؚ=�4��슕�p&h'��β �D�2�K)9ҝ�9���svj��u�>��B�Pt
�
os�ɚ��i�i^�a"uS7i�4{G?�V�@שuJ���Dc�L%�NV6���p�a�V���>�bj��q��kvEKPƕ�6�O5��X�nh�ٻ��{M�_N&7c�/��ӎ]�lpwBu�^�͈�l�Ğ�B�o��݁9�ݕ�E��ۙ}z0�a3�f���X�Jsǰ�C�Z#�ܔ��w��[�p���v�E3�x�`愈���@�CL�b��8xJӪ��n����:�t�
Ha$^���� |��jly���1�w���#���I�ݽ�O�Bq9�m:c�~�JH��}~u�\�<{~����o߾;z����'�_�~���'x�8���(�(˛8�ݝ�X���PKE��TkEQ�zpip/_vendor/rich/abc.py�R�N�0��+V�H%��đ�n9&^��"������Q��ٝ�4����S`���EaF#<Y3<��c�݈�@u[���,"m:fJO!� |�bSd�#1���FpqL��,��8�ڤ2�.K�1f�T��l��Խ���G��L�!| &Cc"��Gl�YXZ��F�"kg��Nj������H#6>�ΕUKJ��m64!��{�A�x�20���(�)e��<�p}ѸΔ�����w�a���NR�&�:j�P�(�JLu��TY�Du�JPy%6�pz�j�n8i�l�d�~�t�.���,�O��[ߨ7�H�I���_�ϱ1l��v��-%��]���0W�	>�){9��^tI@���e�G�PKE��T�&ً��(pip/_vendor/rich/align.py�k��F�{~��pvej���jTt��mUQ�ۋ7ɂ_�7ǥ��ޙ}���j��{gf����m:A�]?[uME�`�h��'\�,7��jM�Z^����?��O��=��LJ�R�# ����V��l�WHx~����^5�vF�R�M���L�ytV��jy;�/X]4�\!��R�I�\B>'mG�]��!�X�)!�KepN�
�b�Y�I=>��b��v�@<P��������hŮ��O���eR[�N=�%Ӎ�:U����Tާ�1�G�i��Ǭߖb6�S�u���MS����YT���R-�G�᷎�7"z>���/i�Q4-BW�(J���!�
g�eI��H��W��{Er�P�Y���Т@_�[�d`��|�i���$�n�+���P�dA��76��T�{�ʯ5#͊�u�tF-���,[��}ܼ�OP4��m��/b����u�l��1u�5Nbs��9#��f�y���t�R4���턲hS��lE�;z��!`8^ZZ���A��#x��Ke�W\l��BRO��G�/.�h�c��/�	���\s8�
C��L�m�H�vP��x�0��h�'L�5Ќr��~+.�amj7��c�{���ܲ�]�t�߳3����=#a��:d�-[
V�����h(� ,�!jr��s:V��	�_�(<Q�����X�x��Λ�Y�~�(��"9��85�$���V�W��W<r`�1���!��ܸ-�e��8�@�7�%IjM�6V�:�5�kS�8�>��ȇ�
������Mr�"�S��I�+��`���ߋxf;_��FKh�	�.>�"{�y�̙)U�K*�fʭ�%���
`���E��*�e�C�%S2��X�F0��%�]MV*Ư���R�ډ�Z���;�a+y��n�a�z˲�H�1���)}���YU8��,�M�υ�6��øj՚����̞�`�����M�d���?n)9�0*}r�k��R�����Ȥ��k��5R��sU;��|F'>���U��5�Mld
�޽Ӎm���oi=U�J���A�M�r��>��yE/y����
��z��Nƅ�hO�NJ\���,�pB* ��!����6����-�`�6RL|K�o%�����o/b=���m	m�\���I�4%��1hk&�~C[K��&�~��^�^I.<T|���@.{P�2ƒ�r���zM�Ƃ�g|��1����ԖV�o3K�}�j��`����W3{���ްM ����y����%�6Z�qi5��T�R�ct��8+5MB�0F����{�L�8�(��������6�D�@)X��?���!��5G��
�Qy:��S�V6t�
��Y�67o�/��4"
O!�>��Ѕ��X�pCO��~c.��(W���u�C(��O>m/s�s����7�l�J��'�zg�:
ݧ���/M�=ψ��^��t:/Qߣx�����&E�r`pN�6�vhI��}�l�5��P	�%�=��9j����)��!#8F����mV�'���²�ۤ��W��?t2�z�r����%S󢱜jbdS�p�d ��$����*�H�i`I�$��1�z�5��l��N���R;�o��IG�5`)*I�R�D������� 7�m=@<��k:�mLI��r�	��qR�𸇻�D=��)�兓�
`Fҋ�ਣ���{���S��ʽi<�E�4������UN,�S{��夙����-�*w*G�A/�����]�x�� ���/k;��8�xY�9�ɪ��Wg����d}O>'�A>RsE/�,�3�Ǜ0t�.7��rs��-��|:r�3q_s�=@8�=���&��I�M6�_�j(�f<�a���=#��ق!�@a��)�����GW���VX��N�fÂ'H�6]����� /O�c�<]ӎ�X��7�N}Oe摅䨈���eN�Q)륐�|j���8��<�C�\P�|����05�@YM�yO�G��_II�o����{]�m�m༔xf�o�CT��^@ni�J����|�ِ�����k+����,+	���sy���G��Np�$JխB�7kShji��[�“+!Z2��Ⱦ�5ȼY�Ԥ�����yYp���gE��֏�ma�)$�K�0%�b$�v�X��nf���d�PKE��T?%���pip/_vendor/rich/ansi.py�Y�n�6��`�?Rk���\�]w�ig�3�$(�:��X�G�,	$�Խ=�>�>Y�9�M��)��X,J�xtx��ɏv��+��ོy�{�[�j�VU������y��k��~��u^n̻׊����&���vW���Z�U��fH���J�!_bG��j_p��;�B0�[x�O�R�l�����4��{���ݏ��2�>y��]�����ww�d���b1�X~�`����ߖa�����{���ۛW�^��VE*%K�a��ꁗ�s4�����]�X�f�Q�b�ϘT�!Bҭ�4/g(G@�2�3��Z�w�\u��2�f���4=�M���6?�Ң��Y�q���
HF)Hˌ]��y
e�q5N\��l�`���g��k�$Y�RK�xd��g����%��)�1�4 @�#tL+�c� 2�g�L,I���ܦj���U��2�!v.���*U*Ԁq�ͼ�:-�QhU`.�k6���2p����>����1B~�Y(;�,,�F����FZ����A�����z�q�x6��^ر�B����z�<=
�J��
�O�	���Ϳ�%7���*��[��g2�X��*2�������A/Wi���`�]�qQ�%ײs��ݿ0��\�@�G.�rX+�Z2	���2�����1�++�#�O��~�B<�h�!��~�c_�B;륖��_iqە�T�[����g��a1Yle����llegVvfe+�Xٹ��[م�]X٥�]Z���3���$!C���ľ���}��>9���d⋭�s_l��\�b����[W&�F��a��F��y��Ū�2B�خoSA4���p�)���S��+n�r>�2��؆y�� O]�c�K{l<uy�mx�.�
n<j���[��:y+�q<j�ڡ�G�l;��o�>�2�<�G��7^�j��_q<M�;��E��;j�iN+#�x���f�$��Ś�›��uk�6o�YT��0k"#d`�Als8Z�� �`����	� 䴄�z��Xj�5`k�l��;��C�С|08Y�S�Ny�I	�[r�T<@wuG�	��D'����vP��®s�"��2A����y��]�	cG`���È��<�::G���{��N�����O�	p8@��H��U%2DU��.\��n���u�澭����l��^��chi]7�r���K�ɜ>"A�
�wHO.�0����+U��DX$�~����c��`
Z�ݢ��qA��a��4��M���yA'"z�Y��?�h#�N�̐8�6����|���x��@CI�`��
�T3�{l�=�u�]��އ+�!���wY�I�?fn3�[(2xDoT0k��כ�8��V�{�Jw��'�KK�V�9�ݜ���J��٢3����� A��GO��٨;�X��9�R��DNH=�e�o@3d����Q��<.%�5�]��s<!�3�ܠ�R`��b������5�ULI��R��1[��S�q�t`�Ԃ��<hM�����8�:���'^F���Ⴗ�7���h���`�D�k�h�۩�d7v��7x����:cG{~Û>h�=F�C��c;����;5�+����ic;t~�?;�Ϧ��J&'W��t��q
����J!�^SV���Ý)�^F@B�[����<����$�os��C�l��&�.�Z��m:*��&�_��߫�߫����O��DwbXV�
�\W���ڂ��^����7Y��,Xg3�Tt��GW�@/S"����WW׍��I@���B�����7�Oe��K��qϖ�1�NJY�_H�l���y77�@p�P�oŎ��ND���܀�p�tǃP�:��N��W���ek�A�]qu�������5F���y!�G��W�"�kx�(�PKE��T���'[�pip/_vendor/rich/bar.py�V_o�6ק88&e��p�����I
4�`�,Q6W�4Hj�W�}������HJ)+]̀A�����URl@ﶔ��n�Bjx��T���GU�f\&dK��l�\	F�+�M��RxAxI��j�����N�=�7n{A�(o(6$W�܃_���B��ٵWn�^�]'ؕ�D��\D���H�OrFW��P�s����
5�|r
Z�����F>�& �j=�B�� 8��s^����8:�}��rqv�����|v1�|yS������Q
˟C�_�r�.������-���7���_��[~B��^��;0İ"DQT�\)8�e�$�"��h4r�T�z���d�x�\�#K�\)Gl~��@ ���u���9�����'���eoy�dEy�tf�[A����[B8<�6�)P^�Z��I�a�=�7�KK��yRMR �k{�	��nn.'77V�M~G7����	�r�ye��Pu/���m��mN����޳羑�Q�6#�v���EL�oVRԼ|/<��y�a�����"�<MX�~�: 
{p��:8;NCOd��4G�\c�c��138P��u�E�7��'Y������^������w
���%P�Wj1z.�N��ö�M])����I��3m��w�$[�n2	�<2ZvI�kɡ�t���]
o;��;�]Ā��z��X��"�ڂ�@����3����Y��Fg��a�h�
v
��6J�0Eڧ�螅%I��\'���׏�{�f؎V��(���N��ser?˘QN���e+IE���-#�,�iN
m��;�)�=�']'} ,Vc��އ=��i��]��'��e�(w*�ɘA�-�/� j ����;�H{���/��q�0=ÈT�����*�(é�'�����Z��Ri#ڃþ��,C�\�`T�ljl犑�8��|L�J��eB/b�*D�u�#xʑ��\+���uS�ù���t,�3�ջq?�L9���?#"!L��)
C���0ZPoT9�9ߗ�ǡ$�8������|c4az�#$�
_╈0�[���sC�NȮ��W���Я�͈���^o�>�a�(��^�
k׽�9��eڇ~����+�PKE��T���i
�&pip/_vendor/rich/box.py��n��]_1�>��j	ě(��vv�x��ڛ�v� hidMB�*9�q�\��MP	)zM��mzK��M�ȿ�KzΙ!9C���5�a��9snsn3��L�D��,m��x���TDGL(�{����W���;�/y���vD*[-1…�1ORG��F1{��ܛ�R��b� �#�L��a�
���z�1��q�>?�<B�ii-c��4	�&A�E1� B��4�0���|��@Kk�S�;��7�q�3*�j�7�(pɔ݊O�q��HD<e�q��2e2f	��	;�Oy�w9��r��r���}@�j�c5�����S��I|Rƞ�
����XVQ@���	��� ���DI���JO��.�Me���B�I�n�l��^��!�{�a��d� ����;br,R�8K�v
۰`�g��P2@}%��2�+�|�|p>!}�My8� �.;왎��e(�)
mv�e�G�Pz>����6\	�S��6��=���z<�ϫ���z���{�4���)^�"g-��Hv�a��ű�2 �8K`�q⒀&�ܷr��W���1@PR�Є��^/��?n�fsűa~'�q$A��A�iI\ �M�o�[��Y�4P�BJfAЊU�3�b����CC��t+�+l�7�X�]c����|��s�:��M��,|k��m}�̯X�
�I[�1������ ֠[h1�t��.�5SS§�NM�x 1y'�r�D́Z�z�׶�`^�0�[źtv�J!g��t�o�e�]�P.�<7bV&F(�S��T���,r�(NX�rr���$��dV��N�@��w:˫ ~캂-(sm9��肜a@�2i^Pz<�A���S���TV�'��(>��͈�㙤y����aՋ#\Vh�f	&�3�` dȏ�H"�C]�Iڶ��0�}�ڒm��`�v4�H���sL8�=sˬ��#G�A�����`p�(��C�sEbg����#�awk�᾿���A��Aow�;�~Jŷ]ň��OA&`v*��<Wp������n9:���"�1��!�A-�N�/7���F�1�&=��!� �T�0�{T�	�f�8q_���
c`j^jg��$N��s2V ���=�U�8i_I���haD�`��HGD$��i�QJG��T+ȇ�~�տ�����lolmoU��JA�+��A��'O�P�!=e��"�OV3��%)kqg��4��lH,�s�ܢ�w!	dq8�D�E���@ƒ�~Tk��5��4H$�F�a����O�y:�0B�԰4�Z�`[�x���t�w\�q�֠D�=�V�-$Y�M��]q��D�J�kE���.���x��"rI�_@�P�Vr�|T�(�4dYv�C�c�j���>�ksp<_͇Gv)TSW�_��J�a=Л�bE��E���-��3\�-���%� �������ؠ��w�^�K�Y�/!������8�v�S/�y:��1?���H1R/�u�����z��cE�����"-u,I �^��3��$q�:J��j�!gk�dk��ְ�ZC�kN�j27��IU���,nX���8Y�})���D��LO]���oZ�7�WU�!��bo����yH��SZ��w�'��_U��m]�q�z뜝���o\?7��!��*�t�詢�֤��h_�����J�F��ރ[;��^Ȧ�4l���`�v5m�
�U\���xRq��RB\�l�@�_-�/X.>���w�w7v��`l������6�&���V��$��2n;��G
��9�k9g9�j���Sr�_hy�3S�6���|��s���N���CD�f͠�u�d��Mt�?��j;.A����(�ٻ������~
a[ȚQ5X3���`��5!�����_�.��!��<���x���B[�����{�^?A����uH�/�?�d�n�&8%�� �*Zez��^���rE���Vg��I�,�]IbS�^�s���.������~Dpp�O�uH?#�g��/m!��EK�i.	hD�~�%��4�됔$�3$��q�խ���
A����s�-f�]Y[����i��]���':�"xA��nl^��E��Q��Mb�����J��ʢa
�Nuj�f2�A͌�U�������Ww��i�zn��Ɛ�ѬP8m�_��zV1#M*��*SX�-.4VEO�Z@R����(�pߧC��O���w��?$@�u��#D�6,�:5�=�lOA��&��` H<G�?��9�Oe>�mF���s>��!ņ>����6����C�4��`}bn�9��{R��7�d�@�l
�UH
�bb���ж0W�汹
-�W�BV�g�QÞX��M��*]�6�y|�Cv�p=�d�/�i��O����Ф���g����3���Ӯ ��x�H�eA��Spv�I8��p|������O�)�%��j��UytO9s�+�q|��
O4-�PL������0<�*�!TN�m��@T_��:w(��g���X�n,X�\����&CĤ��a�/ǎ��L�o�ȲeT)�2'Ŀ;r�����b�'�lw`p�nJH"���!D��'4�v�k�ls,'��߀����r�W��<�PKE��T�C@��pip/_vendor/rich/cells.py�X[oE~�_q��a�q\ǔ�$�7AQE�6R��N�=toݝm�C���Q�TT��C_�U
W�ch��?�sf�2k;�*!@8��̜�w�g#�8J$$�&Q�,��(�S��O2���^��"����-�7�H��I�^����-r\�9}��y��3��^��#p����&�cH����}��C��QD!��,a}�HX8���K��k��ц&����f����j����Đ�Y��C������j�w�9�m*�e�\Z�o�tµ|�����Б|Gv ��� Bٱ_�m�¥�f��Ec�)E`�2��<i�] )MKqn�E
��h��f��֙6`{,�=�g)�,~$Ir��(�m�9	�4��x8�J�XI�R���uD$+M���(��E��!�:�I�+�9�E.�$4X�~xv�s��Oo�%F�m�1��eĵ��F��H2� L��)��Ņa�9#B��Uސ�!W�m�xw�,�v�� �{�`&/��l�/DD�p�k��J��;�^�H�v�C��U
��RwxA(��HV�Z�
s�������н>2�Հ@g�]���,�-ۘIS��"H��h��EvG�p��4�(�<�����t*K�xLOspхmcmEY8�ۖ:���8�����X���y��}�dt��1h+bl��z3�xeY*Y"��
<��t��^����
֮b������
���~M�i�K�;AKX�IHy�#O��������&�5S[]�V��U#�����J>Rnf�1T�����侔'7�{�����{Z����D�p�0�y8ۉ�e����W�Y��
��ss	�n-����j�,��?G�Qttb���ݎ"�5����(�{N�?����AM��Y���y�9�5��s5zUe��H56uxN��%��,��+��a�c������XB9��h��huK��H8��g�G{X1`��f�q��i-�&a�J����u�Wz.Q��EN�A*�ɧ�9D���u���"nDE
��\��m�~C>��࡬�*R!���QrU!���=�#$՛�8�Uɥf��T���A��Q���<R���x�BX6�SԎtNҶ�Z��E��W{�:�-�&.�M8n����'�Uy�"�ː�����
�8P��&,^ɔ��bW�M�MW��N+=G[t��Ӽ��.M"��m�#]�5�
��*O�Ljt̢oiHK�k��o}���\��-���0M���[�aq��g�+�F,s�um���i����7r��
ܢ�,�Gel{^�D�yv�_��Q�:X08�љZ|�Y*��r�󳻿خ[F��i����L�N�L~x�����O��pc��dz�ݽ{�O���?��ۍ�~���L|>�����z�no>�>���Ϸ��>����O��'�7?D.�߀U#���C�+T9B�7pVi
l��1�R��n|Z�f����@�wh����PKE��T.m%Fpip/_vendor/rich/color.py�<ks�F��+f��
��,�E��Td[�.�S��RW��C0h��󿹏����l?f3��9{�aY�,���ӯ���mwiV�]�4۶"~�dk��[�H�4����uP��&�y\&��{�����}�(�463�l,��F.�(Y����<x��{��UG�	�ry��Ų#��(M¸#����`Ʋ(����Տ���ח�/g?�_^�wĻ˳7/�.^��__�y���w�h��A�E@���^ �a
/��L_�|�E�M�
���6v�b#�Rc�<���_~�.�/~~��������[�h�~*�Wb���mx*��Qf-���_*�%컢Ĺ+Z��R���w����m1���(Y�����8�sV�;FQn����M�HW�Cv��D���r)�Bs�waN�&k�#}�d@�ˋ���x����	R2?b*K�i?�\ƫ�x��ȋ�9�O&�}���g	������sE���N��D(
�D,���"hz)��5p��y�
z����
ޜ�|��?���q���NE���  <���:�2��z>�8No0���{	�#��
�2)B��dq��D=�n�'��Y����bꂙ���<�{.����W����.y���s�5�q��C]@~<�����0�1����!j�g���ӌA�0K)wA~ë�pDs�L�k��� �Ķ5Q�<�BuPhK����O����X�%����(�ph/���^Ò4�H�3Ԣ�d�\�F/Ó&fP��i�ؙ5,�SF'�7C��UUCƶ���hҰ
h� F�m`����bI�{	�M�Ι:2C޽�F�l�d9��]
;�X�|�Rȇ�JI�0Y��٨�0<A�������\zbl�I�h����=m��6�bfE&�섓�-��:ъ��!p\wb�QH�=99�A�!��E�%+5ʣqhVc
g�h�p)M:��[�dT[��:��]�7��HJD4���p�1��m���j�h�AuO�U(19�-�'786!�?%'��x�x�q���I�7�bq��=3���4y*f6�y2>ӄ9�Ж�	L���$y�Yz
� �������;��M#��i:��ƶ�8�h;��#�>��S���}�k������*�gr�
9�� K_d�˘aؤ�rs�	\���)�V!B/&�(5�ϩ�7YS�(Oq�
�A��PLGa�����I�O���l�����i�FFMNA�9_��R&Yʳ*	3��)���,�YzK�5�=u�<�!�r�!5���|�JS���Mx�fJ�𷔋,vU;�Lf�<� %����ɑQ�f�}N��y�l2_l�Dv���}z�:V�:v}�ܦ�Ը�
"9�no�9/g��N��j׋���*^I+�TV��I���6���U�a¤�b�j�h{����պ�k�7)W�&�m��8��̓ɣ�bX˓�&��{2ҸyyR��#��>L)_L���V@U�$cN�<D�zG܆]c`L���R�9���2�
�&U��'U0c�\�b��;(������Q�		�p�Dp��)�1�
��,��w�C�HUr��L�4����`�<0̔^a�,C�_	D%�}7iL�+!S�#b�.8ALֳ&���a����l�����\s5�΃�[���RQ� S	C��G1�e��������)l�I�C���B�� C�
������\Xc�	�����~
$f��ª��Y��B
Z`�8�*���Q�ƪ��Xي���aD�ad+��	�l��@P�#[�5`Qs�I�5`M	d��B�Y�u_�j��bVm��@��][�5`�c[�5d
bul�,2���}
Xdڱ��Hf�c[�%��#�%�ry�ei��-$��^�F�>�"��K�����b����%m]��ݙ��"��X�D!��l}���{6���>M>���ZD�O�O���s�³�5B?,?䝫o�
,����oߝwZmX���Yo�㗷
��e�DY�U�D(h��Ů�)v`m��[�<�Ǜ�E�F�n_�"嵻��6E*�4M�֦\���l&%���N�M�()�@�o �׭���D�C�
�%�u�㬒���h��"�E�4~�+G�FR�b".^=�������Ʊz�^Yxe{�_F�.<䤃pQ�}��L�-+���y|�06&��P�,�㪯��.x��^kg5������-G�.u����rP���{��'Rs�C������vM{����*Ux�$�H�c��nW�=v�g*2��0��5�zT����.Kw2+�wu�d��.j��*h�P��M+��eMeg�\��W\�刺�9uT��m����C�Wc�v�Y��>&k��q@E.K���4v�}���d��%  �3چ��p�H�
�0aGv�(1�4��8J�oh.�:���V�>q�B���r�B�l0��Q��ο�������w]�Z��s.K=�:�Br���dyJ2��%%r�_��WsLl�}�N��Ês���,[����QY1�.�0w�<�Dn�,�\j�v�K����v7p���B;k���|h㕙��a�3�u���awA�`�{Av���U�Ut�H�H	�7Y�ġ�I׶@����j<'q��;?vo9�{fK�t1+@ڰc2�{͉�5�V��1_�l��Ksd~h�ڋ��W��EG�/e���
��&OgE]�)'�C��KzC�)	����5Rn���7�D>f��SEj*o��ؤK&��	P�"�jLW�����"9�z�Ez(�ԋ�}�����\L�]G��H����t̕m���Z�R&����"���7���U�E	ֳ�Ɔ��Ax�x�Jh��8{|b�j{��wZF���O�4
��R��*���q�4Źg�P�ak�dY�l��.�!��e~�Rؾ�@��(��eGP��jXÉ�O0:��^�&Ń&'++~�y�a�6�v�X���U���N�*N�B�h�PN����r U;Oa��$�޳�a������3���eIiބn���2_��㦒u��玭k�A��:�vT*�A)�A��Tߑ�v�>��V8jP*+�I�M��
h@�~�^�s�Zǫy�J[Ǥ�����oû<����{�Qۨ�z��^^dG�B�#PKccE�Y���k��f؁�S5�~�)�\��{�%U�ޫ�x���\Tߩ�1>#N��HP/F���ͺ�����,������l.RM'p.]l@%���%�Qe0zc�������6��O�c`�E�2�|��Wcm0R�L���څ��.R��o`u0jN|s�R��M�}�tp�#�c��Q#|t:axE뎢j��������f˵����]��}��F�iM�cf�;�b�ϩC��\p(>i�zG��#vǗ�v�9+�������������WSu,������cU^C��ʓw;ȠP	��..�{ͫ���G�v\�`��c��C	��}���T�v��]*Q��k�/SX�kp��ھ`?���;�N�K���;�좤M7!�!�vD�۽j�b�2_�;��{_6�rCL<�/�{Ù�t�F3�S�k
��&�Y��C���C�0 �{1굝H3ef��#f�F7�A�>Rߚ����"����{6���a�3p���BY���d�H��R��՛��1M�Z$nl8>A����3~���������Lo�u.��F|5qj_>=>��s�B]l)�g�ۨ؈��c��[��$.;x���b���1�d�
�N>�e�n��gws�wO0���*�_�����}sSA��{I7I�-��KgZ��4�����~���ſ�A���a�n��%ا�W�y�-{�_=������ ��z�����o w{��`̹�Չ�r��OjXb4�AC��@f0�7���c'C��녋u�;�NS��4��԰p��*�[1��~Y��N�F��^��]dH�Ű�3�Dή4���%��a�Ҽݚӧ�$Oڢ�y�6�OY0���rt�����ˏS�s���.W���j�z�i���=�)�ؼ�V��5��:67���m�kLcL�'�V��2O�Js�����2�S<�y�ÿ��?�6��q5����#���_�t���>�)Kc��B���@a����O�m���
�js��t������Ga��XI����XJ���O��7�A�4σ��������9.&�=��f��¾���`���ځ�}ݾ�,���f
���?�N�m�>3�~6�`�6d�R�E��\#�~�k¼F��fLG����y� @w��6�� �N��R!����h!�u9|��`�x��\�ӽ~�5g2~�Io�U����(U$�k9�.G9�.��|�M|u���aYl���(��s��8�vy�{�&�����)Z��Z�M�X�o��-���c�?ʻ�~�t����?�l�ʝ�E|N���?v�M�97���v�AF�}Ո[�S���_#���+�#z���Azo���6l_�����U�|Ox�hf�!��a��,�U�(Ko�r��Xy�칟Ao���kO��Հ��zs�ӒM�
7����|%�o���ۭ᳹�㷓rW�/��+DԦ޵�d]z��'6ڭ�PKE��TiD
N�!pip/_vendor/rich/color_triplet.py�S�n�@�#��q"�D
��.���kc��Y�%� �=�g�MA��{��Ό֩�k��U�|]j�x�ה�6eA��y޲��
c]h33���NS�x����P 3D*@�,�
a�-�"�t�؞-Sh��Z���/�)%
�> k�}�Xe�R�ڜ!'r�+��:��΄^@�������)�+�v**�.�P��9g��զ�u~�?~~�Ż�u���B�z�QH�������}��:_��(�d��bg'�V�t2B��:��;M]��A�'4*��(�B�羴����w�,��|��ݷ��CP�����+�P��4��辤��9@{y=�c�՛�jO��]�VX���En�o�雦��U~^Y_-�.ҍi��W��72�at,o�v<y�PKE��T�LR��pip/_vendor/rich/columns.py�Y[o�6~�� <��m^
�@�l��u����X��V��T����9���.N��!1u?��9��]S�CS���DSK"���)����*�A���#�TӔ���DmhM�;��Α��:q;]=��>9�`��W������w!a�g��2%�}[�ٹa�8�n�-.R��W禰\��)��{o���b�eJ>�0��?�ܭ?r	�P��B0��2T�ɾ�`��Bˊ"P�/�Lݗ;��
�q��p�����e��O}�t����x1W�Cɤ�˾�%
��vE�^��lK�D��$�ٚԜ)�ܹYi���$�6����9qv�l�m�D�z!�#�(�x��e���M6�WQ�3�!&w��Rt��,��ࡕ�;�GSs��z�Sp1�!w&�%���E'���v�9���xY���M�M�lp�H��gC����c_�F��V�@f�O�Lo���'�.�M�K�o|8�"��ɏ��j�$!d�$&��Q�`E!���guf5)�Q!���J.��Yr��z��ؿ�\0�s�rF�IQ��rP��]���焮��uJ�x��h}�T��:"�_l=�NJ(�c�2u>�"�wIf�$�C�\�B�9�%/��\
z��R.�I�M�q��V$`5!�_�qj'B�N�M�o	z��)i�K�0
�x��YbҮ
�T`푀�/�L�;��FNل5-#%�2>?�I�Ŕ�̘3&�
�9�d[N2k�Q�|fL����";���22���>ccM�w��ό�}����7ա��vԴg�s[��0;��`;~�n�C��L��O�T£�a��VA<$a�w�s;�Lr�X���2����h���3�~�CԞ�[7��l_��n�B�*Cđ)`:b���T�t�!'�``V�Zc�
���W7**#1U����mS�)�M�J��l[�6}ݲ�gf�OW���Oʊ=R�oQ=#r���O��Y�x�[A�a�k3��
]�:�.��j����O��̥���H7���Ffg�j������%l)9q�B�'�Gro'L=|�	*��с�ɷ� �)t�
mV��7Ep�z��28A-;3�<N+w���s�}����de�:v�q�/f����߼���v�\`��F�Ω4�{�N�jNe��=����T���:�9<�*N�kt��L��S>`w}3�Tk�{��s���L���߷�&��9-�%��́N�/4ߞ\���!�f��p�]-�aXފ�X�갟5�����B.lzRm��a��{��\�,K��q�y��$xYL�o�ac���藚$k��'l^������BKZ��N�W��R�MeE�(W.�삙���>���Rsߑ���ͩ�-6�p���X+���}�C�U΋��ԟĸ~F&��D�T�s��ts!�����5f:4{]PhqO�+/X|ƦFz��
#�ș?̃O���Y�<����}~�C�YG�i94Pʗ�rʩ�p�u_P�,��̽��&��ɩSɵ��aR�}e�6�>@�$�*>]���툁�d�o^�P�w~��X+���s��g��=[�OS��¦��r�\6�Dck0(f��1���/���4�>�k�Tz9&�۠zQF��"8~��Hr�K�I
��ћ֤q���!7��|^Y�1���,�Ƕ����)�%f�7�1���l���J/\Jf3�"��	o.�|�+3�W�R�a�m��6$I/Ϳ?�1��B�3m<z��������[�oc'u�k��k��Vx�Z	�ɨY����u�W�y����v�T�-�P�7�
�'�F���n2w�A��Q�9�����6S_J�/��+�ىS	x������O!�o%vw���k��M�Zf�;퍚)Rs�����~#�X1����{7_�G3[�a8�7�/PKE��T���D�R�vpip/_vendor/rich/console.py��rG�0��Oѧ�d�؞q�>��d[�I�V��gV�h6��#����a�����$[y���K7@��̞0"$�UY���̬����钲j�ż�+�g��խ��^�ݲn��ʼ�Κ"_�թ~�Uy��l��$?�'�������|ޝ�Y��2���竼m�V�5�&ɲ,V�`ѕ�(����rSͻ�^ M�n��iѭ4��һ��|�_�<_3<���l�C��+���]�s�x�wg���(W�Tv���ꮮ�9��Zۡ���őz2I^ԋ͊��Y+N�{�i��9�F{��<;��ߣ��z�=�������蠺�/���*?Y��I9���35(��y�����/U�G��.v��ʺ�W�lqٙ.�B8��S�J��y
����% ��CѴ�eVV�:�v����$_���ld��a
T�ɫF��VߚM���ϊ�{�^�ja]��ه�Z�͔�e��E��D�P�i�<	��W�$�,Y7��y��Tu2���h٦ٚ�n�wg�y��5͊�oe�j��
¸OM�Kx����
�>>|�����ǣϳ�_�88���o��?�0V��[-��  �;R�2��<�O_c!������ll�1�?/ľ����
�����U��D�YszbJV]S�lY��/q��S���)��g��j���cx�Y�~��'��b݈\�<o�oֺOC��^�E�n�"/��yQu����D”��\秶W���$�I��TStݕ)��&���
��QY�$4}.�g�$~��
�����_��z]�c��y�����W�)Լ���ew�2p��	�����,�BI�j����d�
t�'O�?��Qv��g/�gG?>}�TV��^�>�O���T70/Mg�$M���-�9�?oԹ�I�CA
�f�" �^�L?����;�
���*?�j}(ī�S�[;/�ko�O?���x�'����^�|�̒��
�>��)�{�`��g/����q=m�F�d6KR�k��'6̋��w�۷H�ߪ�z��0q�w��ޟ6mW.�h��jL$ߦ�b�oV]����%��+,)��@S�e�v��r���rU_�`��j�u�z
�ժ\�e����BU����8yY?>˫S��x���<T�v��
�.0R�L�\Q���ѓg/��=��P��'��N�0Y6]��8ժBq9/֊��5#��\��?Eכn7�N��.觯_G@�Sd7�N�G{{�L�{��� �������1v�g�૟�4��j�]�ӀӇ������W��"ݗ����~<ʾ{����a�ě���O^?�h�7�uxѡ>��
�i��)�Q$��D���z��.�Ew��ؿN�W����JsjF�I����w�:?+Ӄ��8RUVEK��a{���՚���D��$����Y�gm�Ӫ����0�X���JӺ��Dq����n��O�3�"����,��eU�o��������/c5�˭5�ᩗ��Q�Qϋ�7JPe�� �$�ի�l��\�dQ�k�r�E5����V��~!~4�|O�0�IF�(h��
f����H�a��:D�ҹ���e�!_���ٔ�(2Q5Sb�%�>x�vG�U�� &��jP�]
�I�B5ڐ�pp�۝�O�(�?s�ź�(f#���-�V�/f/��D���
�����@T�nb��T�Z	�W�K��j��e����j���8��-"�2�� _�
3i���j�l�"�����xR(f�Rk��u{�QxJ�vQvg�t�-���b	EOR��N�^��h�VS��)I�Z[>m@����օ���8��XY6r�}@��B���jΨU�{��0�瑫ٹڬAa%Fb�û�+1�J�4g��9[A��T��r�J��P����#��ld�7��ڂJܪ��	�k���D`���"��v���4�E4B{x�Ђ�-+E�y1Bt����T���
�y��M=S�G&��C�87j�|��{���ﭐyl���T�6So��@uA�w�:���V�\N�o0͆�
ՔTp��%����z��;�9��b�����ცp*�E|<��3��.��F�	� ��W��+��xO�X�3�<�#�7�K5�|Мz�3�4���,.�P,�b��L�ja��x˩�����8�i�^�A&���2��e=h�xAc��tF���"�TbI%o1ߏ?�|��l
o��MsS(����X��[=s
r����1l���m��o����V��S��#��ηC����N��/�d��-���r�x����%�^���yۍ�%��w('����,�T����"��w`O�f�<�ݠk�����8F�ƴ�hmu��w%/�ۏލi���th�Aۇ�n֠]o͛�G��(Ӽ���fK�!���f����.ZЏ�2�ϒ�v��X$'Wz�{v&X�O+��� ����;���|��FޫSܓ�PM�c�0p�2��D�T[Y�Y�2yQ7���@C�9_��S�M���xw
�SXT.��4��9�+�\c�*��K����N�J�P��RD���v��FY���	�

C�Ƃ���e'��l����xf�Cϼ��XQ�����袝{���S�L�k�U�"���:Q��'��Bm��R�y793�u�Ѯ�-�g�c�\��ueO��lf��@��.��K��bW�Ҥ�sn�\���K}����]�)<����)?1%@II�Hs�]T�sDˑ��	�oh���r�ƑBx���-gV����`��y�u�X7j��l�����(�} ��
�?�o5�b��8�3%�*(����e14��J=���:�eG�M��tS=����/|/��f�����E���:�_j�E�̣Q�Ӟ�'ũ�:xh�f
;
\�{���<��EtH����0�V�K���I1�ݢ�	X.�,Cl~}���c;t3��BH	j�����Pѓ�8*�r�΂����.���)��EL, P3��o�`jV�1��Z���]`�C�k�d���8�hS����M�oPU�3h�nZp��Ǩ(��veuV4eG�rj��B����od�1��W܊z�߆���I�9Yo�3���m��N4c��<d�"���X��0�j��˪���bj;���g��;�,�ǡ��-��J�AO���oթ�>��gY�ͤU�h4�MǤ�թ�@1�;K��vx�E�=����f�D���Y׽���P��dU�߇Zd�#fw5�l<�o���j��l��3�T�T/��
t�F�0$p@R�:�{�uF�F��8�]�d�un��h��J8�|�Ϩ`�ߴU�爁�{��� �+1�H�����*�Wj����@��܁:R�����|V.�l�iں!z6!�o�7մ�� u�B�Dx)d~yD�LOg<�#���ov�|�ӌ��+�%�_C��5d��1���U���
�F��a���Ƕ'�rB[���k���I�#�L��%��i�3[�]�+OĈ�wE�^S�h���ۛ��1�rI�ȓ)&`����M�Y���♹R��<�6yHG�x���K@�k�f� �]��|�O �D����Y*�mb��CS�����1�;QD%��F�W�B��x�F�j�+ɥF��G���
͆;�ބH`��;8ôv��Ad7'�Q�����֏����"bI�8=&�8B��[$ؑa+\��0�CQ+˰�����Ft��zj.��49t �Hs��j%d�v�ե:0k��=�J��l7�Tz{����)�D)T��.�YEo~��V-�@@���E];��X]��5��`ܽj
�+��W�&�ݫ'�4,�wc#�:#�i�u�ѡZ�2���(���W��O~#WO%�?JEsP���kt'7��t:�~!�z�N0��b^7yW3�˄��b�x�Sk�%K�b�a�.��)�#������5���j��i�64��y����t�7�Z\F�c�rt7��FG�����'v[�B�%$���vJȾ!ݝ�‚���=��,clV���6�+�I4&ԽW�Ҥ���:�MU�{)�:�� X(@�8��Tq�*x�PN5D��(������XYZ{��������L61��H{V�`�r�i�!�e`�Jg5�L�Ӻ>�+�Z!c
�V�(�7�m�P�4��������An}��` �b����"��{'ETX�ڗo{8WІ�b���+���گz~t�>���'){�7GO�%�Pn�y���>"~��z��D��%��t��4�c����M�>��eNO��/��|����&�,�;=�%v�M9oG��GG�����I?��
�y*��S�Q�浡�B,EB�rւ��t��w}�30b/�l�Уn�f���E=��-�K}1����D�TX8:������X�69S�4�{#�|�5/��v�?���rA���q����f��)��(Q��%��<�ݤ9��B5qt��=>V�yeͻ��8tY��y��fa�j�2����C�=c«�js~R4}"��5�ꛫ�@�NP����P[�w�aŖ��+�4��Zf}��'{������:]�'j����Խ�@\��O�A�q��QҪ��e�e��v�����d�o�`��崫�Ϟ�"7����a���9�����'�܇b%����3n蠨~�D{�n؂�=B#��%ؾ��®�Mc]�=R�x���x���:>���~�S�x�</��]o�MWC9`1�W�p!��ͼ0N����c �����3u�b���V��
ޣ���ʑ:��M��y����
.����fn�YM�"���P�zّ��P�o�K��e�'l��OT_j�?��5��E��o���b�*%�>!�#�l�t�d�`ǁ~���'���K%
��5���r��\�t�{ӧT���x�N2zv莅�&�B5V86��yєp/P�
P�lߔ�dm#ߩE�\llE_�ħ�c6f괵���n����f�]�j�a���:��ބ6�+
H2271.�)��
���	�%�����M��SxE�Э�b��d�N�K��>�c����ɡ2ܳ9�)��Sq�+�x�%����z~�z&=�M�jCa}?�� z�:E܇��c�p��p<�������b��Oc�xܧ�����Û^�ѳH�������#h\n���s{R,�a�����3��yޕs[ij��C�'E���§G��b0xA՛c>�mͭ!�.��M���p��]Ƨ�b�D0�iEѭ�k-��ݟ���aЩA�[�5$��2��'F}�3<R�Q�t�%�.�o���z����f�����
b��ۏ5.�k)�9����u�2$;_�I}i�u���<���58A���cBn)V������7�1�Բ���
>v��Ў|u�pr��է<��#����B���%��1p����w�Ϸ�/(����)����%b�&����Ί�C��վ��G��M��v��w���+
�"DcO*�N(9L�&mB���T�M�����CO�z�����/΢���オ��L��^G���!��}@��0��iy��> �%�& �0�$�Lg����[gR�HZ{������J߸t�qW%��z�Os�?e02C6�D�>?^Ù��6�`:���06#n8N�H�|O�s�U^\đ�s~��mۀO��QI:.`�	z]�Ӿ��U�w�z��z1tk	����	@NŖX���榕z�q���/q�ްI�)635�ʓ���qn�T3���1v^ɮy`�`	$4F����`ooέϬ��3R��C���jȇ$�
����<-��8�|�.�^yUc&��e��'�?[nԇ���>l�������M��2M��X�ּ�,(Ѱ�xfh�[�%��{�e�	��%���ػ�S΃1ބ,�#A���Q��Z+��}ؕyl>c��녍�3����&���
].��M���Wo��^lj��6�f�m�R{���ߺ���ě��
���Y��C1=nH"F?/B����7����~���~�m]���3b<�!�bvƬ��w�%ǀ�S����n--���f��FC�^QPε�[��N�-�k�*��s�d䛹���3}�%$h0
L�L����=0�3�q���9�Ή�N��2�!,���w���C+f�{t8���x�wXQT�l�}O{
���ا��z���l 	N!� �H*�7Ê�˛���Ѕ������ļ
�[x%�{~EcG�6���}cv�qz��Ո��蘜�k�Ff�hdD���xpl����=gM�/�Bۓ�>�d�"4����$Zc��R����I�U�h��CW�,����ﰗ�7�f
ϓ�5���k��
���i��1�~�$k �>��LII�FL:��"N�����|lh	��*��z#�����y��?1�,SC�,��G��U趀'���i�&TΠ'`!����w��T2����9Q5ԾY�.lҺ;��ӟ�cc,��	كSv�	YX�(�)zA�p_���%
�5!#��`"���U���!��K��{™"P`�Ym
Jc_L��\��96�q�I��GRpy�F%����Q�F	D�V��`�&�� ���ph%9_R�V�gxܮS�Y;y���oó+����Ԩܣb~܄�):�&��ʍ��!��1�����U}Ḕ� 8�@���G_��]��vBD��s�.b�22��ή�g�������f�7]	;q���NO����i�;��(Ȅ�o�Cpt=�P{�^T\��}>?)����!���p������g�H�}�7)�'l��=���	�n�K��v��΍��#�9��:� &�">��
��b��T�@�M�������3u_C�e��r9��mY?9ëP��|�J���Ha�`�b�?�.���;:J+���Ģl׫�JG�c�%#�y��)��k���"o����1�#�]ҝG�t����!d��Cɪ���D=ޱ�łK�PM��/1AJ�D#�Ez3s�K�h�����~���d�����^�9H�j+�%%�;��N7���h����s�vxQ�",am�fEhҭ"��X�i��b���i/g�xo�>�q.tw�d�k���H[@���MK+2��N�i�
S��A��M�鱌����[���l��
@���"�����pg~�{�I���s��h0����iأK6������Q�`�*XL�����t�Zv��*k�0��|��z��?`�Ε:!�u��G+�z�-p���ְf����rOOؠ�4���:Hj'�h�����r��Ji�%fU@uᣃ��U��Zd�j�)����%eP�Ή�6���H_��D����BҢ�o�ɂ��[�)��U�1҆��?a��E	�ͯh51���	v0f��:����}ͭ�ؠ���0�r&$y�(ڹz0�F#OOQM.���q�e��"�Zt�^v��.��
Mq�P�y���0�A�[�8_�=�"^�oC8v�{E��)��G�,d�2�@�bz:/�M���u�=@>�u��P]/�ڌ����4��V���N��n��y��]�h9i�ZTQs[�
n����L(g��Bѹ9�e�}�c��,b�
E.P^.����t�!h����J:�e"�{Y��ɲsLK�e)�,��S�J�sZN�ŪX�'���3�jv��l3z��q%���9�t��8�����%�%3�66fq����^�Y����;q� 񕪦�_�h9��aR��{;E���3�3�^��%�N�A�\v:�F�����yZ��6Ncq��CL�������&��&���SЪՆc@՜�����^�Q'靎+�[˫�)�,Qt�;�ၽ��m(~�-�nc	'�3�[s@j5�qp�	D�!�<R}�������Ҩ��3Ⱦ�d�|;�n(�����F��6"�BrɀMy1�;��'��l�[�}���g��[ޤ�=�������峉
�_n1�3)�=E�J���e��Z�'z+��C��@�E\�!In�A�\��T�d6��6��X�9�S��Ҷ)��H��Z�M��a�v�O
���$y�7`;o�lO��=��*8MLW&��n��EgRGTr��|���)V�#��D��Ir����W���D��W��н�/�s۴0�K
�TdZ���2yt8��w��\Ę�&s�3���IS����Ю�6�1{JS����3�4��,	�Ñ`P	�����.�DX��fQ��б�q��{A�or�vt�)%v~d
��'B�,C'^Lb�b�ƒ�7�Ɂg�ga�R!'�zN)`�m�V�5К���4tS��oJ�	���M��zڠ�ƆG�M��k����;�Kxڏ@����q,6���5���X��[����ufw����p�%���3�~F���w��t�mx"L��v�q����� �ݶ��H{�?�Qħ���j�z
.S����ɍڣ#�I2����P?�Z �3�&�2����$�D����wcɆF�Zէ$�p��"����.HPd�?%��]�o���Ny�c=�b��
6:��0(�ה�&�
�$���t:ſnD���I
ɞԄ)n�ݏj����Y-�����R-����L�z�����8H��8sύ��k���N���E.&.0+��~�-�<�i<b�;,�g��dI�MB^]ugt����
3�.�S�N����sT��?��zױ�N��X�]��9�w�ӇUw�!���/0$�b|���M}��{.'�
��yt�P��c�+}�F�Dޒ�������_�VMA��n��^��VȲs%Eg��q��%k�e�\8��7��%z��X�Mo��6H�<Feݑا�5��1�vhy;��qpP��b�4��?�y���8����q ��ݢ=���
�z	�3]R�q�O
|蝝�0��rD)��	&H�6�s$�f��C6
��8��N�m�i;���@�;ɺnьq��f�@�λ$ �:�x�����Z=~X=p�)_�w?���o�� 潈wѮ˪��Fq�r���6
^g��)�t��b�����d�����g��a�Q���+�� }�
��IO���#5ua+����d̷|�Jf1�!*�8�`�'/�3��I� ��
�UyηmQ$���R.5����D�v�"f[��z��7�.�z�@�E���@��|r�.{���"H*�W��a
�	�,ۄ�7��[,Q4��A;ѝN
�ç��6����p���Um9W�‡����b�g�7�2��B�_P����#��+4�<'���Z�)����><	�~pDž��N-�j�s�a�����l˓rUvWFvfx��*��v=J������!;ٟ@�
�K��F��j��{�3qi��
P��˺��%���Pe��%ϊ���9j�XHRl}��w�0�B��a�/m�&�~�P@�xK���w����F�h�ۖ�r�3q6{�M����6lr6A��~Ƒ(�t`��:�z@��V`͙���'�x�S'A	d_3p��v.��F���������h��؜8�pw4�H֕�q����T�A�b�|�&��X��缁kNT6��a�V���D�K�/:�s��!PܞBv�}
Tcֈ���/S�T�*�^-oQ�Ȣ�/��c8�D'� �m{v|���m�A�>���@��)M}~�=W�R_D�R��3f�e۪�l����(D=_�r#�3bІ�6^���"*B��OիՂ�s�&E������1��@v���`���6פM�Ꙁ��&���!�H6X�˜ Ʀ�n�h\(�D�����:_m������$́�w���]8�j֫�i	鈊n>����l��b9�����l�9���U�,a(�zh��ψM�O
�T�Br1u�Y����-�ܜ���F��vaS��R:DH�𬧓4��fIu<���Y�]��n�&W'3Wv!zZͻ
��ʇ����i�i�������B�d�5�4�����Y4:�<�m�yTG��IB����@)tϡ����02wB���Et'"�i�
�gƷ)2���&L%P���Z�h�B��5Z}��,<fذ���s�D�\�)̷�N��`�g�;�=i��W���m�	U�ܮwE�4�/m�B�����NJũ�h��U�so�ڱ
�v�dd%�XUxN�F���9-lZ{��� �ݙ�qz�\����ɿ����ѡ|G}3A�V�"\�:	�̯�B.n����Q_.jr�q	��q$'.�β�L�ë4�E=%:��I$h���z�zڎ�7�� K��Ãn��Cb�e�p7��1�=6^,�7s�1����I�I�a�
�d����Z\'�Eq+�Sm�U���$UA;���?�
A��+���PQ���*O����ڲU��Ѭ!����ήԵ�)��'�{�"��n�}WyGo��B������rt4� z�]f~d�ϳ��$Y]���L�I�v�/kʪ`�a�[f�A`Þ�k�)Pb�m8�P5C���G�et�ԃ���p��Pi�P�ϼ�F1� </D�op�p���6fd��	$��0��2�	k�A�Q�9z��ăI|z(��йA��(
�2�ڌ��י�	���#��r3��ф���8�B��s���x��:Eb'.�@	��P��`���ʦ~G���]����'iP)�[�F񎄝�Y��~�5m.-3�zd5��=.̓
O�F��,@3#�,��յע�m�j������Y��!�?��`c+q1o�����s�vG�s��E.�)[�S���F��9~�f
�z��7`FL�]���mkLk��EO�q0"�!�B��0jN,�(�YG�$��h��`�FiV'�r�"�w�iP=D���hz�K��b�*b�QDN�ԫ���r�z�D�E�_�HrR7x�5hܗ{l=��ER�CQ����v�L���ij�t�A����d��-	P#�W9��
Q�i�D&�d\�<��l����n�HҿV��Ş�>��g���t�pҳR�`���Sl%�}0D�&M;���̾�E��
.� �њ��J�<�)"���{�\��R��躝�F�^W�J�q�<��	=����.i�X��`-�U9/�����o׫��r����k���P��"��k�*��̖��o���朩���)^h�G���|�3j�Ŗa�P�E���q��UQi_�jV�6y���"�wB5�I���_g�;�m��_��%���Љ�=�7J��	#3w����=�m��r���"]-�\��c��T��m�v�R:�����@ d��g��S��U�$;[r��<=[���:��t,����^~�<8�����(]��C�6���C)-�¦��K��v��e�UA�rX.T��k3���	�e9fg�uߒ+�h�ˁ�(�1��������G�U�Ŀs�!�o��]�Ȭ�
��礱-�LQ�1�ñ�
ի7T�V�-۝���[�}R� )�ãk�����+�7@%oނH
����4�-)��e
�y�?��0�D�)���d-l����`q��}*�:>{�H@���5�A/�!	p�"(�+�f޹��n�<>�8H*�1O�CN�O����3�=�t����[�̭2�����Lӟ�r�B��R���*N���w�(�,o��Q�y&9U�La��2�g�7,��:�_n���d�
H'���q�g�N,Dj�v��˝Z`�*���Y2���9��k��ZQ%�h���� �ʖwt�\VccDx,�`f���cE�L.gy�7��i"�Ӂm"\�}���rJ`��
P�b�1�
դ��特f�_�{LƑ�<�v�>��"~Q��W}�4���8餠�����C�]-*�F��}�4Pd��/A�A�؅�quA�7
�4�AE��p(hMY��7�Cq '!
k�YY�
�����U�,B���/з��y��\����˕�i����fB�M��k��ƸF(=5=!�9B� Ձ��IM��ڷה��;!7kO�*�ɦO̺���O��J;`��yb�	H��0,S�F�(�5feG��(9�N�b�ś`4���'�kM��!��ǜ�$�T�Ȼ���_&^�jB�*��?��K#�T#eAP��4n����O.��p#$��~�F��>tjkD�6&G�ј�����)�2�o�ܢ����ꁠš%B���{E�a� c"PBY
Jℨ�Ltfi���b�BM�_�E�L�����iG�|L�q��9{
134ٝ8��3ןXN2�7���Qz,��"�~��.f�@ǞI�e'���(z�H*�$��x�ԿP��u�P���ja���+��7/�����G�ǭ�l�������f0�o�jvt"Yc�	�X�Y��'�K/�ڀ������؀<Eڐhه9[�Ί�5D�U�
�vm��0�+g}�0�{3p�s
�����8��$���hξ'O��,�l��L���R�䅷�Rd���B�վ7	�@p��yO*2����ϵ��Ɓ����w��}�$�B�G�6��@�����|k��I�_�[f�3�lEB�A� ����z�8l��XG%��\Op�[\�P�w�vu����L+,LjT��5�� v�]P8�!�����si��dp�6���%�|��o��f%p|3Ç�Y2�~ع�ٯ�O��:?���N�� ��Bj���s_ǘ�c޳
�yTuu�rl}딺%����}�őDz��ީ��Z�za7zyz3������"�t��!�3�k�l6���I�bz�M�Gq��b7�$
�ox��*�7�rM�_$-kH�[~$+s�R}qoU|P��E��=ѯ��l�M�Iێ��Be��$qu�`�pRR�
_�iN���ӥ�}�!}��R��&'y��1R6

`q�#J[s�`$i\R���]�U�*NH�oF"�^:7�p��O$����'oQ-8�l~�֝zO�U$����&q�u������Oß�3������@;T�̄y��0�yS�l��k�	sg���z꾆��@��`�|Ν�R�[�u�DoUR���?brpA��0�ǖ��w�m��a��^��0'���P��\�J�ʒ_)h`x�����w/��";�_����&n7��	G˻{�0{���u�@Nd��SÀ?��{�Y�$����t�;t��8;�����:��v�څ�ݣ�⻴(88��P�6ܵ��mX����5�SE�Q���
a��J䥸%�Kk�4r
�wM�Rj�yqO�w��v�-��x�	G����g�x�B��!�ܸ�^��q�,@F���L�%&0�x���BD��k֒�Q ��\ӣ��u] cIU7���0$�$4�d?��L��ć2g���*M��moQ"�?�:b�UE����IMy��՜��r��R��6��k���1(���z^��3a�{ԣ�z�8.C���7"�
��MeR�m�
�MR!4���m�a��ǃ�?<�L2eJ��%����k�5�����gȽ�)�tZ��j�Ȃ�n<��b{3�I�;3��k���.W�o?�>1ϣ����>�Ip�^^�O�Mp���>A%U$�spIISVQ�p�H�p7��Ts)hL�H���Ϸ���yO�l7K<���JO>��#F�1�G����}D�Er��n�k%{/������l�D8�GG�]�>�QvV�S�dkk?(�Uk�wB��!Oa���/T*���/$+RRԧ2�GQ�C\�\g�71����v^�=0��q^6��*oz
�+u�dU^��
Nm�J�q����ں�zЧ��:�6�ӛ×ӄ5��豈�h�^
)+`E�|��B�N��(Y�7A>{4EP|tBЕU	���UcR>�Zx2hŁ�=�1nr�T����}2���7��6�G�^,d�z��;��F��:���H�u;���s��aT�^�m�"|��Q
��j
̻=�h��h6��_�/Q�{V�e���
X[ˎ���TKs~LWw���}r�0o�9���
'���m$�Su`�[3j���]�s|�\!��Zp��.���"�u3�[+�t��t�C�9C�޸�^p�C���\��!�J�pFn����43�b���3�#,��7x;3��B��� 0��^����'v�G6+�m�O�uY{��-qd����
�B4u6�$���>,����[�q��G�f��Dd7��(�+�����&b�7x�&8;��h�OO�28�,~Z:��k|�ںQ��8��@�P����i	����-~I�2|���n]ԃ��GȏP�@1�]�QQ0�w�A������0Υ�S�KRqֻ�g*��Lħ�UGQB����ךֲ�Y�m�q/:�m�
/>p�4?JD3LǴ�>�q'�
C�`�\��yy�@�@� �`�/��nѓ�4!� �F��0\��	s9I�&AbO�/�T(��t�N+I��/$�vV��p�X͋��J8U$����[=P`��$��ʱKoE�8�P�WcM��h�C��z��S��h�
9��㝉M�y���ߖ��tDH,˿
b$����	c\��!:��I okxJ��qKGCeG�����~��z,<>	�D�������ԹM��l�W�`ҚU�V�W�H�(������8�94?��
/���v�o�\��Shr����f�ɝOI��	8�����e,5憲�� �zI�x;Y�
��b��Y��!�كˁ�������
�d__���P;��� wB4N�kt�{e0Ԯ��H�X�w�Q�
��ZM0A�.��Q8d�������/��9�i��;Æfa�9TĒ-[|�Ɍ_���\���{Ё@6*L�j�A�w`i!�����њ�#���*�23�:��}	G&0x&�OBT��8Z�̷Ib��Itug��o:��`f�J�FNJzfJL��LT��Ȑ�C52���v��<F"&�ޛF����'V]����5��KC˪]�鉬)�!�G,F��w�u�Ad�0a���?l`Ǭ�/��~�	��`�A�yl����P1�V���u8`0	��_�5ea=l�|��䂵�e�b����\ɷ��|LbR�
�Ѡ}a4
�#�`PF�+C��V�y��,�rah������9�f�p����q
�Y��Fht
��K��Y�Z��k��:Ӆ�%֛9�!�ʥF�>W�ϒ�Z�:��ܕ(FA:KHi���}�8+ѩ���d�i��YpV��ޛy��� 7h�ѹM7�|ļ�,��7�CU-~#q�E?��q���ma�U}�:��	*��F�4�w���zS�����3�s�o�+����dj�O�W���I��.�8���b��ק�gc��*���N�_�N�W��ib����f?���o�Cu�nXR���S�֪3y�T�S#�a-:e���b�����2dR�Э��C�B�����(�Y%��D�1�C��_b��!���n	ۣ0���f��W"ˣ��p&��fA�AQw$�,�ȿrS4lF�7�L]�v
�IG���AP�Z��Ct��U����?��f��g�hA~���Bq9h�}
Ӭ�L8)��f�9UG�y	~���V���=A��C(0u�vd�^#;(N�;Kߖ��i����)��(6�)��x,����h�f����d�b�`��$�iT�+D(:3�‚�b����٭�����僩����-
�ojE{{ڛZ�FLdbV�Ba&/CL��@�p2vS� m_�A�;�Cc�bz:�VӿoJRc���P�@M`a�;�J�xr^�	�^�F�O��扮>�M]V%��(ʞnRB3��Nt��/%���H�:'��Jd�@�6z�:u0�+ur�����
@_�}(��^AB���8;�B`,�]қ>^���&��J�(�2�6#��'R�޾9��H��n,�.���:-������ɺ�O��}P��A����t�jZ��aK8������'�v�C��ۖ>q�u���^>9��M�=|����s~�֦?����5�vK�	��޴K�."������V5Ġ�������Ӄo�ß�^�t�Z��|8n���3��u����'��p]P����Y�mG+���a�q����N����9�g�wT4緄,:g�N��#�O��v$��$���������w��Y�Ąh9ڙ��ԖE~��{Р���9���;��+�BZ�������'�S%�\�c�����m7���������2m&�>���`|G��Ɨ�7�N���/����~V�衞���P�^8PT��9�+A/��O>���{�.�6H�����_�~<|�����LJO���a�����W��a["�/�}�&'Zr�
ۺJ֌¸�N��K��G?KD��jӞ�H�1��2��JM����#îhR,?$UN�c)`t�U��WSɇj����)�	�������U����+Υ��<�s} ��SS��;EdIa���tUS�4\��X����Q��u�R�3��'���Duh}�A{��l���[����_ŝ���3^m�ȳ�\#g	iI(^_��	�t���F��9�uI���j�p���u�K�Q}u|���;�����0�	qy}yv�	�T�ԎƁs{�Cb@V9�B��=Y3�D\$[D�$���{�:0	z���-^᫊�X�B>�N���\u���rS�����~+?���N���n��pR,J�O��]�\%�"WkY�\����c5e��f`	gJ/�M��JVu�iCw�<�à�1Xy�T!~C�g �s]��䶔p�A�����[_#��v�-v���D���l[m��G���$\p2�����#�g:���j�$��!�Z>O��V�ޅ	��Z��� B����c cf��մ�9�\#Pb�H
Oڌ�l��	�hu0���1�	r�U4��PF(*���9��Ts��	�.$R�:D��EU E��
�hz�UC+�M���
��t�f�H�x8.�?�_|�*>f
�%jq�Ad�x6dv,���>�-��|�)�v[��������\�z-ik�ci���&�r���ǡ��F�Ρ4�Ǔ$=�yÅ��c��"K7�f�G�������J͉E[, i�"���Y{AjR����i�`��noe�b{w��ˠ%�]�Lv�|�7	�g�n�0 .	����������	�����.�ܞQ��ӥ��c�0a���Y�g�j"��++�f�Pݯ�1}�>�p�/J�t
�OM�$Y�
yR����X\pr,���l�^�m�:P�3KQ_�����%@�O�M�<wt!��y֝�vp/򝃎X�:�� �!��|�����ۼ�ʊ%��d@1{�ǣ�?�!ξ4Όx��6ωs+�s�-��X��r�{zn�<��:M�U��B3xw�Z�)N�zS->�	��;�`Yl�#պs
�ï��j��5-�YQt�����"��&
�~XzU:��Z�	��<�߫�Hႁ�Ҡz�K��-)��|C��Ιe�R����|q~R,Ծ�5���4�E�_��b�K�/�di�K�a�:AS�WR�JU���v�<����G����/��<x�����S��X��M`�'��,y|�����Lb����G�e�B:��j��myI�@�g���Q�s����Q�ʘ���D��W�N�"ڷ�ޜOD�5t��J3����a0��c����*�k���[��;���YS,g鵭�1��
|��~��A�(�����k���EJ�C3�|����/z����i}��9�:4��c",��?��ʎM�1���32#�|�<��1p�RDx�6ײ?�[c�gw{:�!��P��/��f���G*��������Us���겝j�%��?�A7G�t��^r}}ma}��1b��C�B�iJ�GMX��R6b�8u��'��Pf�Eys�F�Nmf�kX̲�3�kS�����g�eXϲ���}�W�ח���!�����DE�l^�bU�b@��kR
�6U쿉��:�]8�]8��gR�Btu�C.)1�� UH}(3�'��0s~�"|
]�5�E��}z�4�����ߚ����Q����wC7�j�k��R
�ے7'�x��*l��IW{��d�j�#�t���9�Fy��7��g��W��鮉۠��p�w���V�95Zy��)/D�QV8�\�r1���2v�� �\� re2�.�h�M���d�0��_]��/�9gtV6	��He�k���C�_��Pq|l21�@��n��	�M̴w^�V�6����l%���`�
	�,(�Ք2���?��h��6ܠ����X-��a�����rVUnf�:�X9}�HQ�-~w%�9�<m���{��01;�>:\楾4$XZ�� z�IR	�B���0̳�B�Ťg�G�t�8|�~`Z0~��Xt��H�M�P'&B#��6�$���E1�0ԾXd���ȅ=IL�DZijdNu�k#0�2���I��8�ӥ:��]:�j����U9�$oY���}@7��Ӳ\�8�[��������h�����3�ȧg�_�X���j��FH, N�p&,s��j��@?��W���X�-x��[/>���MfB�>z��e��
	�`����4܂���^(����sI=�7!xqRw]}{�,'��Ġ���A�B��u��4��v������m-�d&K��s�#�XuKr�;s��0͈y�ܝT�M�vf�r�NB�uo�n�@�V�v�����9���x�	6gB�%�BM�x�y�3U�HS����h�%�S�<��AI�~����
}!4S�{�U�
�<~ύwr�n�)�s�&�xa+��
�j���]Q�n�dx����r�1�k�6AI�n���x��a�F��J�d�\�y7�ѕ��O�j�*�iD�i����y�S
4�I�N=�F�;��+�z�f�X���^:���r3���4TZc�I�%~j5��O��C�t*���cr-����k^���ܧ�߆�x�����L���.E�ە�ݣ����%Ϯ�ؘ�.�.o���"+��^˄�RE�_��X�'�|�*�/�+�S
-�w<��"�.�}L�Ii�'��P�� ���~s�Cϯ&��P�&ʤ�A�~�ȯ8�S���×�Z=��'q��D%��A�ų�g("ƅ����b”�9c���/�b�w�/갉�6'��~�>+�8�_�\��?zd���Eb��Yފ7�����T�g�UKo�UG��-��h��b\>�ɸf�)G|�m*��h�I��ɇ��W���=�I�D�]�}P����1�qD�mgeLύ��;��������'�F��Bd��5����;�M��]*��
8å�fW��s>W��WÕ(H�������iM�Lmi�=����Lf�)���i�L^_���oȌ��ht@~-4�[��zb'�OF&�����][��qKs����<\F��n��*W���5EzZ��f5�L���WǷ���%�9qu+
���*����?��`JyuZ����`�c!�.J�����b��Cf��o��AD&9j�!Ɍ�<��j'�Jdώ]��o��.}�ˢb�vYrxr�$���ԃS2�sРU�?��N��m�1��1�̃�������~t_8��G�-��æ��"�K���VU����|���:�q��CFWh�`����0%n�G����鄧��&,J�����9=�G���j��=�~�'�0
r�>��^΄~�}u5�z /�>�rg�-���M�[���}=�a%�?���v�R�[_�^����p�!���G�
���%��j~V7��\,�p.�yO�ߗ	x�G.�{j�_賈�3���7���jAO3K�+�&��a��ј�)9��:�r�>H���Q�cJ�~�\~��������,N揊��_~�����_>j�?�5�2��l1�3�?3�<�Ctf}'�X�Y�	/��<7�tvD����Ta�qrT�Q�/ޙ(�*��q���!�2U�= ��>�>V��������8����3kF��lg^“��Y��gQ8`�Š�_�.�ߎP�À���F1��x���F1�;?�������1k��M?�ş�b�0�(w��f繢�СȵF�B�6�2t������j���V��Bǘ����w�{Y窸(�4
\�ƴ����~Q}(VjN|�h�Nv9��IuN^���7]�e��M}C0���{��P�e�4ͨ`���Քt�)�HP��5�:�TR������m��o�vo���q"4O�"��{Rx��#�
+�i���\
'}4}�1�)�������o�<}���U%�o]m�
J�h�k�ѓG_|�*��X��G�'��X��(�sݬ�W6�w�;��Ï)i^7#.=�*S���â�.���o��ԫ���<�5wZ�#�W�Zq��ʠJ�K����W�NX�����Cx�#�RV�F,y���R�k
��X�/���/u�>�n�Z
�0���M�� �Km�~�W &�?�MS���J?nڮ����}1��|70�(0��@�>�<J�!�N���R��M0�+Ń�Q�]��I��6��/v���I>�	��=ڽ�)����sE9�/w��]N��#���PKE��T�L�I�pip/_vendor/rich/constrain.py��Mo�0��'���c��V��Q�FI�h/QT!/�# ۴�_�
�����;�<3�i�`/�g`�S���2%)/���<|�9�}}�M�fВ���Xԓ���޳W&�B 5��Iq��M֬]w	���*%��s�o��s�Q֨�����D�s�!�85f��2�ń�ϗ��|�E��jۂj����*�?�_(A���v����V�Аd4��g�m��gk�|��:�`e��2&m*|stx��2ыEQ���%��`�wW�T�����d�ٲ��pv��q�§�����~�����<(�K݃���G�k�/b��c2ͪ�C�WQ���!��d�waF�1v�L��H^7�
3�r�ua��ma���論�L���D����1S&�D.�����^��o@�$t �d�b�?����Z�_g�����Je�h�ڴX,�K>e'g�Y5�.���4(�����?PKE��T�.��ypip/_vendor/rich/containers.py�XM��6��W�
H�V�s4�A�i�Q��a\���P� R����Re�N��PT�)Λ7o��x�F�LZ�X��a��uc�GY�JWa����ա�/</��[ݤ��F	7z)�uooj+uŕ�Z�����Q�����q�u��/��g?>���?��d���xrE�Z�ӕ�J�����}HO'%3��+��W��~�~�oO�ߊj/��´ʞ΢��O�V�َ�5�/��P��8ȕ���Rp�6}h�ܰX_�u�Z]G �b��1�d���)S�f���(wG��Jpn
-�f5�G���/e/
�粒6���PEꁜ�>㛮$6�X�h��u%�H��[�F�Y>BŊ��3���4�Җ�1��`�m���6�P�U�F�?�X�*J�vu5�B��0��v�!`P��x�����l�����*qu���PR:�{)����D�I<����x����K�0��%(0����q�-,�ddY�&����ۭr
��|�V#�Fض�BV�2e�s^��5+�]�cd0'˶$J�,2܄�n���>a�$�J	:(Z^נE|�'W�t�|Ζ�<Z��� ��
e�f�v~��N�@�x�o8�^B������)�u`9M!\� v�HrVo��ހ�4>5D=���fQ���W͟I�I}��(\R5��]w�ذ�`u��"Aǻ��nS���A�e�(���6�y�څ
a����u���J Ȇ@��[sV��}�ŭC�NJ[4[
���h����/1�:���E1�9���H�;�;�p��c����	`q��k]O��}���43YD2
@߹��${�h&���[��GW��������6���
̵�na�ѥŅV{�xF-H��g��P�z\���E���y�N�߮y�}|ɪ�ұ�,�v"$��Z��my���;��,v�5̠�c;���D�vW��(8�z���5^�Ϊ�E;�xE�oE�T�`E����FY�B�3��%:�_x�5�&�
r?dm�9�IK��x�H�]�u��]��ӄ�Pӡ�R�%>$�m�jǭ�)Yiں{IY���
Z<�Nhx��	�Ėu�|!�3v�=G�bgȮ��m�������x��=�A�s�8����|a\�������L�EՖ��Q�3�<��ل&�r95Çn�ɗ[��
������qĢ� �.7�Ŧ-�^�ⵠ�p�!���M�w��z{�{��_�Yt��
�"`��T%�{4������q8��X�|��kj�t໡�8n�#�mك�L�3�\\��_`w��,�9�������OKl�6S�Pb_����U�8��d\�������N��r����)�k����u�H��0����
K��:�&rns]&��~������A��\�{t�X�x�/V��X����;n��,�X?L6�g�MW���O��u@ ���se37X50J�wZV�s�,�PKE��T;!��pip/_vendor/rich/control.py�Y�r�6��S�e/B�\��l'�:NW��XY�Hr�NjB$$���bi2��9z�W�#� )R�$'���$p��$Z�\H��Y+2�2Z��L��u%s��'?\��{�w���]��8�Ә�p҅�dŒ�Q��$�I�������$Jf^���܅��v���U�и��UH�(��{��\x����d��j;��T���!�pd�2:y�/X"�.O��q��(y>��S�
�V��{E$/@�<f45t��a*�p.�Pl&F,[ƈ8��zפ;LF�>�{�۹�gp��_�J�s�z�����,��s��z�{&d�VI�f�����f��f��R!":g �\��u�*�0BMF���ߙ��>h��R%�
�0�qQ��(��Z[�b�w;�;�/�`�{G-��G�|tz����3=���z(pX�ْW��Ug�־y��m����<2)��J*���~b���T�N^�T��h���ȟ܌�
���rx��@O���M�}�3�&|��J�9�ӟ�qw��]ߝ�������c��
[Ǘ÷�{3w����WM�.{��M<1��.�!��.�03�>�����÷�Û�oF�y�]��ݿ���}s�b?���{�L������z|y��u�k�:c�������xsT�r�ʅ�f�y�a�7��؟�����&��2�1+P�N���'>�A�Q�
b�e�ɴ�eu0_���=U�&ü���iA�"��`�Ljפӥ�]�+K�q�x-������S�;�ӆk�E*qc��b�Te9	,��L Ӷ����"
�Ul�#�d�̑�d�~r��\|V��$�?��ds��gð���	�b.3BT��r�֝Y�	�$����gn�S�T��Zm�T�;��Rg�5r��@��ꖲJ?[Q�`��2<I���ɪ���nNJ����C�)��/�D*ɂ�Ȳ)×��?XhdFj��~��d���*�;�ii��)eB�m������N��^�,Ί��]��Vv�`�9�jB��<,�s����L������z�H]��'�"~�)g٘D�x@{���z��׫M8���Dmyi5�B�CB��UB��j��@����?R8�b*#��8%��b��]�\�~+����c��2&���X��\.�GZ�-�_��V���O,��+㼰��I�#�ֶ�`�"�ΥH�gՠ�Q`���{�:�C�w�+�[�Q�K8)"�FTA��N3{��9ے��+I�5@����z���F�3$ZZy���Q9;�oH�8;���"�����<��Jstw�TA��SS��5�0̝U�
�p�g�@{ �dj�;��PpÙ���|�ώ����m��}@���y��5��
��p���禹�b�W�Ot���nX�&�c����v�v,��G6����B�6��qW����ߕ�u����;��Č�#���ht�f�`�Q�S���g�����0g�&�0�<> ��ԍ�>
��� <F�Jg�\T�ۍ�J3xHxKbladg�*{G��5��?�2��@MFE�rȚ���l��vw:���n^����6�,��$c���R}ʁ�T9�o���%!���|(5A�M!a{P>%p���\�"vL�L��Ek��6p���I����#�{���ҭ��b��*�c��˟�BƾՇ�����oS7���T���ձ)E��Z`��j�"M2��b6οy�RM��=ܵ��SM3�o�Q��WWd�����:Zd�30�g��
�n�"�����_%	�
���[r-\蕽n張x�)�m�8�EYД6���U�V�L�X�63�i�mM��\$�2��_��{3�:����+<�ys�wS�����<:�}&j�s,ZͰ�Y���{d����k����:�v<J�ڍ�
|�_?�4?�}���b�v��~#��>�?ͳ�N~/X|)v��,��D��%<��s��q�7��/b��!Rށf�3��ĩ��h>x�!Fb
�����}NC<<�˳�)D�:����b�R���i�PKE��T';��"pip/_vendor/rich/default_styles.py�Y�o�6~�_Ax/6�
Mҥ]?k�
�~��ah���H�JRI�a����D�"%;i���}G��xw���WHk�
D���>�\-{-H�:�����Ň����.���������K*�X��h��] �Y2������)��:�A$Q�he��O�K.6���T��	�ŤhG��'\J2@�r7�
�4�6lGDI	T��}t�r<*�2Аs�\���Q��w>C�G�Qw�!�l+hqP��hpr��I��C6��Y1-���Ӫ3G`��u�A���%�J�@���o�g�vy�r�+���\z�֞�}��8H�G�<8�����'ڍz��6�r$e�ǘv�U� L�1�v{z�lf�<�"c�t{�dMr�b��Ī��!/ݙ�=���q�w�r\�x[�0�q��_Y�AʈE�cڳ�y��4|7/��/f!�x���KI����)�ِpV�|2u�\6$�r�\?�K�@R�nZK*ϴ��GިT��T�D��O�@�Tl�����L^P�{r|�fV9:����R���a]���ȶ)N��#P��a
�Xa�X0ʂ<�y?��H𙹠��!=ANP,��*�&�*h��U��L�)C�+"%��i}5V��]�a�Ʒ�`)$8��;.Ъ��
A�����l����
�Gҧ��yU�Z?��9mF�#^��H���K��/[��E&�74��06[�]M��TM�6Q(���
��tz��.�F6.�a��dSJΛ�T��vdf&�T۰v��z�['���$O�U��wH������2S"�Ƌ�h���Z��{§���ҤV#�}�{�q��Zqf�ht��CTݬM�%/!Ot���%9��9N�߻f̞}�V�I�+�?��S��b^G=�Eqd�z�ϊ�����h|C�2|轢�M$fjg~b��,���$H�3����{�#e��#3l�|d��yQ��R漞j����#����9R��}6v�]߬�ѭ$b��w;���1��-jϹ:��I9�NZ����}�h��ZQ�b��Z�3��s�]l*dzۙ­U�,�e�����v��47�x^��R�?�:�����)�����m�i��t�)2���j9�پ"|#�vu����]rq�f�q��Qy�<�����Յϩ�H����,UJHSn]^xy�"u���W��*�ƒ?A��GVr�='%�e����k"r����(�Ra��z����:��?�9��)c��=���3���"x�1�^�ҿ�{�r�.�Ӑ�A���v.:�7d��ݻ�}*w��s���U>8�]�u�z�O�2Z�/
��8v��2^�$�������[8�a��{�
;ޔ��>L�B�ŸnD g��2%(��ߓ����ď�o�~�>"��
�����A��,JȆ�X'G%w��B窰�ƀ�W�q��_#��>j�[,t�2�eh�A�,�Y6ˀ��rQ�o�pH�03��bQ@��d8F��|4_5ִN��v\���HL������i�:���0����]�Y�@���(�
<�����X�w�����ի��J8�8�Ey��b��	�o���'��~���32+^Z��H�ĭj�G+��Z�
�C�:��#���|�$��F�#ݩ�����ʾ�<�U
�Ͽ��k;�!=�㯭7�C7֗��ڝ���]X[Ԟ$uȘ�H�2�Ol�XscHN�q��+�	�@��^�O�J���i
����e=�Z��c��-�4dE��
��+�Q^/�PKE��T9G����pip/_vendor/rich/diagnose.py}S�j�0|�W,��ʐ�|�KMȑ��i�8����-YM(��~�b]Ӧ9?�f�h,�N�'�Tu���6-!��-t����N����F�T}�[�5)�j��yvj'P��G�xǞ�^����+R�P��bh�
Z���;B�+08`,��? �
�ߠ3�n����>�!�>Jia�� �!����i�
���7�u-U�|�Vj�f�FX>	{���el<?�a{��9�$�:p%Z��<�wyH�{:y�g�2//�����X��l��E����Ϣ����Z.����xr�n8��)�xq[��/w�'��,�K�:-櫔/�|��GFqV��L]�cg����G��ʹ����ӹ,�0������S���G���
&��O��hբ��Z)6
�4��\u�����2�_z�-��荛"��o�9$	P�[!��zfC��_PKE��T�
E��	pip/_vendor/rich/emoji.py�Vmo�6��_q�>L�<!ݾ��H�5}q7+0x�I'��$
$�E��w$��]�D�=w|�΢��2�[�ȕ,���� ���_l�͛�ͻ���K�X!��XŸ},�I�[��7z�ă�:
��+�k|��^h��=t���"x*3Խ|����۹\a]$��a~�X��f�Pi��E�K�^A��~	��߅��J!)Xh�(բ��	�L��p|0XY���;�Ur(�*	�$�gV։�(%/r,ƍ?.�_��!@�C��\nlƟ%�񪏿g�l	�HvO�i�h
[�,��C��eW��V���Z0��@���`0���G�9ׅ4�s��g�Άv�k?xzL��8y��5���ݮ�w�������ݼ�\m��ϡ�z͞�U�9�0���i,��p�b�F�WM�黷O�{
�*Y�A����O�l-�d�C����J�M�����')-ZZkuУM�ư��2���L�7M�,�%�n8"����<!�h0ҡ��%B���&1��ą>�L���7�B�h���"����3x�+j.:
��Q���w�"m7�6������ۍRRͭ�Mw�|�}�f�h}�PO,̨o{xBSC��?��ʟzzG4A�hM���o��J4G�
��fW���%���c�n�y�e��65�+̑�R�kYev�5��st$��&mО�k�pn] 
n(/�C�
��X���6~�&�BӨ�̹��W��^{	�m��g-0e�r1��~`3����f�}���|��W��q�0��M����i0 �#�&�����]7�Y��z�����6"iY�h����ƮC��8���INs��2�4�/m4�㯈˻��Nۭh�qM��7
.�C�����@!Q>[ݩ�^�\��ƢS�Ǯɟb��Or������
��+�:C;h
�tu���@zV?����s��qH��0��D|t�!�V������)�kxO�zC���MY������?PKE��T"H!���pip/_vendor/rich/errors.py��AR�0E�9�&����:LwPf�	�S�J%�4���!PZ��7O�	(���[1/VG�:�o�*H���e��G0c�s�9v�UU�Bjt�'GrR~��!*G�w��Rb�-�0��x����`�^�Ǘ^LZfM �yE�x(��u
�1�F:`�s�5鳋6-����y�S��fL$���'B��%̘����hS��"`j�R)���~��v.��J� %;�㷱��?�NPKE��T7��({Ppip/_vendor/rich/file_proxy.pyuTێ�0}�W��i>��[J����> U�E�L�m�#{"@U����f`�Ϝ9sf��HE�eT)y�4\�W���,��������1�q��;����	�{�����;Y��N	�ԟ��w�*��E`��I�e�}����hW3����E��%�2�l��OLc�)�8��X��Ae��`��A_t���-��D	
K�pGN�j i�Ĺ�Y���"�XWY��A��3�hflzդ6)��OR��c�E_׼'�8�sGw}�m�
��y�����e�P��z�4"I}E%Tt�S|w(̿g��S�
uUt��c��C;�ά�\!�JL˙��GbDj�R����dp��Hͮ���dB��ґ�5�c�s62rA#�8!�j.41��Ă3Q.7�a}ip��TI�frԾ=� 8��`�68s���x���
��_���}�%A;���o6�t�s�j��(�O��r[6w��a�8q)������B�AJΚE��q�[r�x�)�s��MP�uW��l�b��$��>�}έB�g�>oR�7*\�t�t�&�����foo���i�;{����ӗ�TN��@������i��īJ���F�l��n�a\������_:u�CCBSߐf{���PKE��Tv�*�A�	pip/_vendor/rich/filesize.py�Umo�6��_qP?�6T�I�n���4�3�%lZ:ل%Q#)�^���;Ro��0#�-��so�_@�2Y�hl�� �M�Z�*�Ҡ�V�rY����a��V�0�\����&��w��m��r~{z�蓱X��S�?���!�md�B���ReM�`��)2�62�稱�Ac0
T���
vX�A����%�5��*�-v8�`�A"�@
M%-ŷ�U�lU#���:��2�3C�;�&��g�'#:�q��(н8"l+�e]`I���A�"�UaT}f��Ud��	,e%�	(�\~��]���?u�X�ݜ�������:�b�z-�b���)ٲE��r�Ts�!�1\[�ƶ�>Hc#�X�碈�!�� �0��Uk��Ĺˡ'T:��&'�h��랠~sK5ag���M�!;Io�0��YK����*=B0+!B�`
�.��>�2�����
4�FW���d1t��o�o�@?&ѓ;`˜z�v�i��2jcf�bՔN��.�O�P�?��������g3ٿ|b��ˠFq��0~�S��?=��zz|��Y&l�D�L̝�i��z�����5w�.�_~s�
���a���7k�=3��e����ݽGӶ�������}�ޝs�Q��Gj36s|c��ɿ�
��l�Z"Fvv�Ĵ]��������h��v�8x�adNj����<[,����Cɉ���)�2[�v#�lKv�ͦ��1��xʤ4�N�8^�@C�Mn��WҸqK�(-v莧���'����B�=d��k\�@!��wo�f9�E�s�ϋ�6Ϊ�h�Q�J�MQ�;��(fmC�`����f7"��+�mƭ�w��l�a���8\-�
�J���f��I�j8?�'_���-]���
ԅH)d�\)��@�M��=�|TW2�	��k�M�����(�9?��l�K��4�S�(�
qn8����a��BP�Ŗz�(�N6����/[���[q༼��w�*���������NE�iv��W~A�`®kƭ����zw���#o��[��z��wn�í�/���u�����PKE��T?c��Aq%pip/_vendor/rich/highlighter.py�kw�F��ńtk�B?��h�l{�=mғxO�Dh1#�ePd�v��;�c$!�nڕm3���;��y�I��$����I ���{Մg���8��l�&[%A4-�~
X�$���8:�FFo�b�}�EMr
#GGG>�w�GADݔN�z¿(�0҈n�uD�(�+K<-�#��xBrD$�a��0!���|G�E1A?H���KE�A6#^��޾�>P���45
�;崈r��� Rs
��c�u0����T�i��W����c��I��Y��d��m�1H�*��IЎ�0�H	3���R��R�E20T�a�J,�1�-���t*�?�a���w��4�̥��w^����UB�O���DqFP#0.79���Φ�8!����J	A����K�0��!ۢ�&$`��ܛ<��Y��\.�%�͡���u��1�2�q�Rej����h��z�D�s"㯋 �~���i?K��2�Qʠ�KS��A�>-<򏍔/b�"*'��8�ky�Y��
26	=P���pL�.L�cg�BBI�(����7�0��R���S�Âp6�2�ǔE��V��Ȉ�㵂��FPx�T�Q�	W9�Zv?Ղo�l�4�W,�K�ayf�u�D�'!�.B/%�6I)c��RE*�8c���0���4V5�e����
_�lU�,��u��_Jĺ��u?>���V���Nd�f䙼1\�caO�[Nc��'#�U(�B(#c�����$���t*skR $���QC9� Ʃ�
��X�W$Ic1����qs�LI�77DT)**9��g(�1R�E��2�䥙�R+�#oN��,
�~xR��(�4b��Y:�'�r�F�mkJ��}�S^���('�,��]�yj>h���/\P[������
GP�pp��jC��F˲^�9n�|��S����q�^f�F��VW��>�a{�����as��]g=[�[�M` x�A�����}
�����u��v�Ի�!��cE:(D�<J��"��� 7�Ń.?�������	�Qi` ;��3�ǡ����pќѽ4>�]��k5A����P���0HX�l��z�DW�����򙳄|���C�����@o��߀�A |����}��5ev��y����P.ji&^6����/+nc��N�/ � �UŁ��_C�峁�8�!ǁe�������>�������xt����3��w�a�*Jw?˲����/Ӭhµ��J����xv�jM������ߞ��A��ry���o��< RY쟓W^�"���ċ|�s|�X�Y��`&�]{	,'�.b��9%�t�_���a��7mU�}x����z�=`�)Diʼn�5��Ly�[�>�8ڿ8����9G����pۏ�Y�����FC�j�eW?"I�y|�n���zr��	D�&�9�N�xN�|?ȠQ�B���ϼ��H�h�y,}�+V��f������l�0�9�x���d9 ��o\�Vl#��z����gش�ԘHjUXh2!��~��D�a8.�����x��[dY�\H�C>��@�R�p3)��n	J�K�ޚ����a)�*��xj�V�5�\�(����7ǜ4د2{=l�hA�&G)�>����o/���ns\�{����%��O����֚�6��uJ�r�4��Î}�
�t��e+�x���C��gH�ϭ��^�E�s�;��3���sc���m�z}
X�r�/QϥL��W��͙W����ygD��� Ӽ��� �`��*�ш�<E��b�YQ/ͻXh�t���6v���
s�7RM�8sk/[qΈIB�]S���6�]\����v1x?hw�Sې�m�Xp�P�5:��9�DT�G
��KQ�`�lx"�B�J"�Bs)ń��.�$�J?�;gp���FY�BM�ч���k����>��.���
���2U֭�����a�K�_"P�x>�c�k���}C���J�V�L���s=�q�*V���ٝ\^�R��S0��H�4(��Y��R1
��g<������鋭�: J� ����F$���-����e~l��y����e��l8a^������G&���~��qwQ���&�dY�O�&?�ޣ��u���F�e+S�&�"�.�ķ3Z�����hD=ɍkf}�Uw�.Dܦ�$�,�s�=>���v��	V�R���G���u��h�Cx�/D-ܱQ�`�Ιr��8mlx��E�ydcq��,��`�",�W�A���h��x�_2�-x�̏�'q�K�b�OX7S[��WQUi���<*z�ΰ\�8Ti$�����{����4�Πl�P+�(��v��%�jr�����e_�є<F	��L��w�γ��N���K?�G&����i�	��E�X��ٶz�V�-Z��N�Ʀ�z)��(&a��A�i�~��A&ޔ�Ķ�}�����]�V}���$���sZ�O�@YS��pE�ײWj��A��*�#��wZ��������������]�o�]w�t�U,4m�zӹgaԏ�/4�h�%@4�~0��W�Ql���b8?V�Ǎv���Fq�i
K�pFa�s��6hIJ-��p����&q\OgZ{�F^Z?�O��o;��$�>�_�}�N���ߥ@;�u@0�e$�G�q�zh�4p�:�m48Vc?Zq8Bo=|I`��0���|�ֻ	�K������ȶI�t�&t���xY��v��0���& i���x�a�k[�?��.N�.,D�).^�Zf�ܴλ����8y�yW
g�U~�/�	S�ѧ�;2]��F�x$=�Q#��	{�F�%[s�?PKE��T�]ݣ-�pip/_vendor/rich/json.py�W�o�6~�_qӓ��Gfd�=���>�@KT�F&�����wG�e;�lO
�J�Oǻ�;VZ��QĮQ�B�Xi(����*��c#�C'_�c׬�٦�	�o�P��	|��2�[R˟m�����[��库�q�~�nXN`�����l6+jf�S\���(Z��䚜��V[h4���!��NgN}���H�z�tJ�e�J^B�,K{5�֥�؝�~�$�
'�;?%��c���~���
�-Ӭ@�
X�Y�S��Wl_[�|5|������tG�U0��z�S�Q4�#?�3��PN&�%?l�%��Fc�Y���5ϙ)�8�)X�����«
Ax�t���c^]�k���&���^I�c�n^
���d���`��d	��JH��yb��e���@< l�v�Y(�|��x��"zD	��r�u8��Q;n�Tn���4�9B�EP���p��q1CXa�v�ܐ��<����J��ZR]$��Y������"X��B�|r��^�L΂�l�z�\��X��w�a�II���ӹ�&�����E<�J��c��<��ss��6%<Q
2�ERr(�c����?B�0�Y�3T�c��o�Bܬ}N��"��o��I��ٴ��sՈq9�`�j�y�p�IJ��I>z�T���Yӂ挂BB��|<<|u��:U�*�r�N�S>���$Z�6���U�E�h(8$�ǭ;��Z����2Lo��Ę~@跅cE���-j	���|ǎ#�oɞ�u�f�ۡ#���Q�.4�.C����A�܀1�e	uz��_���p-X-�z���}�1h
�7�NK�-ǡ���r$�v��b,�e��(��׌G��?��k9�wI�5?���rxO\Nn4ku��^p�2�aZ�-S!�aH�\�Na��}"��'� 5�
N�/�g4��B�����9]#�"Bh�p��n����~&����]��x�C�A��;&d�cwt��;:�
ӆ����x'��vZ)v�1v�$16�BWjYt;����D󑕔�e�������m4d��=!���Շw��-���)S�V�񑆅�McK![��ͅY�_7缸�]]�܍$�Q21.2��еMÐ��ِ�N,wؿ{�.�r�{��1��dѤ9rL�tJhH�s�Bn�v���,�[�s���O�Ae���V|!�ȟ�şд�Brt�m�7��e$՜��:�2��S
�qo>�H�h�x���p��{��{����@x�=w��V��6���~HB��5��;����|q��F����?/~��o-5Ž�IG�ά���*����PKE��T8�Xȋ�pip/_vendor/rich/jupyter.py�V_O�8ϧ�r�6E!�h%�`�r�'�8d�d�z��9ǡT��~c�I({��=] ����͌3%��%K‹R*M�nf��bv���!9ې��D��R�b�9��Wx���j	xφj�G��%/#�"�*R<YE��̡uw�oQ���yV/j����q�
��
�5G��.XN�
�������Ղ.f����+����g�u�_��|C�b1�����OdB|��;.�Jos����pX�,��G�	T����s�j-�r.�p|�ұ��`�Q&�>�X��m<��pt��5�c�"s)�(ldU8:����5lFa�L�̟�$2�����u�a\��%�P�/u����i�"'�ZqĈ$�a��.rsrDH
�R�#k�(��J��Ҡ�<�R��W!����NɵΕ���:�X�!�h"��q��T��<�"́��p��u
q��{�x�O?8Xo�ZV�A��e5po/`��S��⛰>�9��xC�0�mZ��~� �;ڮ�uL�H&	�!y��eEX��
�Fm���p{�o�k�Po\��U��Cs��E�45ha��b�^0C-��I;�q�1�(�r�+J1�`������Q��O�~tt�P��h	�.���5�N��e
�8c'5r��e�9~�{u�;�������%]3��Z��:ˬ���q��?t;���h�m�{��,��q�Q�VB0}��딙�����QF`��O>��+�#�S�-5�������������Ɣ�?X.+K�*m����G
ϊ5�u��b�~0�
@�޳��J�&�.WQ��4�ٶG\�[b�1,�!rQ�[,�dy�k�z�P��AˉL'��S{���q� ��1V^q�6.UÛ��Gk�
�e�k��'�%�5���JA�^z�W�h6�'>}̙X���t��zSA��I]
�E}�\]e����e�b�Q
���sش��i��W�����7¾���_]S�ܐ��hѝ�3y��	��&�FM�m_�������Y��k��"��ԑ�|CF�>��) (5��Rε��W�L)�3!~!��7�y$a���
Tst��0�T�y�,T
ᎍ�Z�"�r��,�!�:�׹�g�8B��qÕ���7J>om�QY]�~��ڥ��w;��PKE��T?��
�6pip/_vendor/rich/layout.py����񿞂埒	C��T�q�$��g�@!�\I�)R%)�)�{��M�T}�����I�9M�~����ٙ�޽m�����ñ���/��./���m��"L5�nhۺgȪ��B��(�|h;=7��N�D��N�e���U[�Ws�5-�y��7/�߽|����Mh蛪�o�����Uի��A��NG���q��&���[�דh
5g���T����4N��顏�}[P̦y]�-0�PE����3�_$A}\���<�;_��T
վ���x�2��;3��y#jy�<���}��0i�b���aЉk��/5Ջ�A4Ͻ��<9�����XT[�T�$|Zs��i�d�v)����(��Ţ��^��4HqE�c�,��@qSV���AM�AG�)L/N��d���,I����j���%�1X��CIH�(���i�&z����.zyW�
��+&��Q�$j�����"�Ap�����^�e+��i�@����M�b��(G��lH	U68��4�\��Z#d[�W��F�*�6Ȳ���,�zQouf�ȏ4jit	Ѕa|�G�A#$����Su�+�ǝ����m
���%Ϊ$PKcЭ��gٴ�(�-�Px[���W��C~�ј�������H_�"԰^���d�'�j �
[dyὄK���uAtO�<w������ak�3%�^��8b�۹u)ݕK�Ӵ�w�tZ��3N���"�W�*�Z�q�,�s]��vgIr�RΈ�=D7mǗI|�M}� y[��A6(m�P�Q~���$��4׶i�%�N:Rs9���qBl��2�@E�~H��� �V���T�C�sK+�>PD>�9V12�}U���:�j�I��-�Q|M|�Q7��� 0��C��(��D4(^�t��>�v��99�6��Z�?�x<���<V��Q�8�$��u��fw�󎧇V	,�9�r��j%�_����C��Ƅ�ko{WaPW`4\|�j�u��&ז��f����B�_:��$8'�e&�/v�d��t�=N��Z�3����m/�3=�I
(V9[���Hn�G�Ku�w��J'ݝ¢v���!ĩ����$���W6�V�m}:4�R�
Z<�Tr��+�	T��_�%�Ǻ�\�o�\��9�R�<I��IK�l[Ȟ�^*�X,��%����4�N��M�VwcG�ua2�
'U����ȯ�ZU��K���m��!A̘�X�4�FlsH�z�!�K&M�@�\;�I3T�
b"��_‡�YUD�>)ju6u�����M��Q�^�we���v�89�|nk�P��`�P�ݴm� �3�T�r�s���N�Q�v8Bs������d����w���U&��p�v�l��1�E�%��X+As��x|c��-��Jܳ�W_(q�B)�Yil���+�2��V�
�6�ա�^]��"��	G{W�.��<�c�)����&X�V,wZ�u�V�+�Y�D��'��kֵM䱛�%���(�fR��!?�Ò-���n���/�V���Y՗ne)#@�BŠ���I�P(~��ߧ���bh{,	��%tzK$K�c�M��93*f�e��S�CP���E���T��dq�k�]��PE��3���H�_̹��"q-�
�10z�V������V��@�F�_��腱��t�&$h������.Qi_�jf%�.�L�F!%ŶT�{�J]��t�����?+��e�Ĉ�R�luɽ���n+�MS��A��X����-�w�4颤�r�����Q]�����Lw|�����D<G~��l�`�d{��$�.,�c�_��\a�0۹�1�τԎ)��
�q���m��X�ǽjk��O��iƦ�X1Fb�9�PhjQ�yo�oo��T�n����vS��tZ��#Kړ;����Qgx�?yǍ6�{%���9�$q�U���-cw͠R—��y��B��ĉ$���*q7,��0�e��+�Z��&P��5ò:����c�S 7��4B�"ͅʔ ���9K�f1m
z�NlE��2��׸ܝ�`Q}�mh���a�}<�mMܴ2v��ũ�E����FƝ��Lg�����x�I_E���L��Ң
<a=Qp��^������GS�Tm��i�m�d�H�\���Z.���q��b�	�\bJ.U�p6<[E���2TtE�x�T�:�	���/�ңe�n�.�7m_�*5�v'�����@�n0)8��~L����,�b1�J;)hT���2Șb��MY���6�<Hq']��`������JCl,�qv�T4�n�'����^�J7G+L�mj(�ͮ���|	����|*�[W��5CE^c��7ܻ��z�Z��d	}�4&��<�v�M�yYb�+8��M�r[|�@[=Q�%�����?j&;��ۜ�<��ѧ��L!�K�{ސB�or�3~,�e�hz�rޜ��3����E�Q�mdE]����3�KKnb	lȋ�`�t7F�ȋ}����X�*�Y2<5�cL��Z`/���׉-�
H:�&(E=�T�V�V���[���LS�-�{&��<�w�r<����Yô8�3]���4�k4lwbۉ~��d=���F��]�3s+Ή� tx�S�˷��%W�v��S�܂�
�bt���2�p�٥�G�ҩ���X�:(�^5���j��h�,_�
��Y�0��8��X���E*z��hz�.\�Ƴ:e349�XDY<u�L�T;���Х�ݘ=��E&Qf܈S��}����:t����/:�F�eU��l�|��!�\�8�-�<M� /<1Ud�;�gTd����O���G�4?Alf�=�)�ݫ^� �G�1�I���^��O�-�H�Xwp
[tFq<a4|�<�o�ŕk�)��<�6DL�x\��7ˁDs��W��6ܾ�ݙG��V�uJJVM�o��rʘMj�e�=ɶD��J���2O}�+K�T�rl/���G����햣�����D���+WT�L�Y�.푞�a!x��+��`@{�`qm��ɐa?C����yQ0�␝�w��(��/����.�3�cT9G��U��
RT��+:��?����
��y�yC;���*ώ|3QÎ�u�9�Iӌ{Nx2<?%,�&K����c�������u�o�>��)ج�����|�͹bd�S���X|4���>]A���D���[y4��4#�̛?����ɿ��I�ID�)��o&+���'��ؘ�̕SŹ��{�eo�ܔ_aM�_Ed˄6�GW�n��g&����uޅH#ni3�A�=��h�?bW�r��F��|�;2�f����QGF%G��g���TM�����c��d$�<��aŗ�uTWI	�Π����V�H�*܋vB�TV��
��+�����*D>�1��z�P۶�ć����&5�)� ��B�ʛ�<���/c!��"T�������C��Hoh�#Z�|��ah�2��y�6tڄ�����j��F�qt�3�Q�/£�
��c��nH�PKE��T���\7pip/_vendor/rich/live.py�]sܶ�]�e�c^J�r�'M/SGrm%������
M�p:V<�J������� >H�"e����b��^ �v�:A���;�%b��rU�7�V3o�h+2r��U����t��|��ʊ^���|5���y��3rZ6My�Ќ��9P��5k����`H"#U�ő��Dn�(*�r��5r=N�0�qI���r��j5~�ح�%:�8�p�'�uC�]������~���w{A�a�5��~�[
��w����{����ϴuU6�h�n�OTl�>�W��I��s3r�UM�9).麣|����?��#�$I^kißR�y7
'��Hg>u�oJ൅�ܕ
��H���E�֢(RN�uFpw'$�%�@��Ѯ��vuB`S����ߑ����!�<2�T��)%�~�V��I�Mgv��t��W%ݲv~�tfw���]ŘE�9�H� u}ù߀���	���E����mrf�%�Zl�A�E��C�^�V�y!ٜ�z���A9���c�H}�lI���߭J�v/幪��)���`On�[K:c��:���
��i��m�ig1;WD]P��srF�e��3�#�dz���Yn� ���"�s�	�e[QC�4�{i$!Pr���D�.V�vqm��5c���V�l$QA�-[Qo���"
���<@���O'Vٳ^�t��c _��|!�#_��)��b����g-��ĔS�<?��k�3��B�h��-������'"���5���q�6���U���>��)9���5�@�8%�/ʡ����B�<.�>�xF8#_��:Ъ/_�L蚒����t�kҮ{ʚ~��Mӱ���h��ԦlW�w��(�k\���fJ�}n�4���<�<a2�!�X,��`�u�1p��:&out����ϋ
Y���5#� F!u��u6�L�v-S,��'�R��O00(��e�p
����-Ŗ�}t5OQ#P�;��H�i$�(�{�4�?�@,��L�\�w�8#I`b�s����G�
<wƇB��+���\�|d�P���$���\NG��V��,D!{4a�j���G��E?��ԫ�F{���?.��t�hR��h#<L�`J7㳪w��^�i:�	��ݹgqc��t��c#�2	��������G�����J �����>�42̧�;bs��#Kɩ��N�dݮ��餳l��<Μ��UlW썣�$ZI�&�(=� .�n((H�K|1��F�i���:*����†��f�ʾ�
��s8�b|:�XH8�{��"�}�s��=��UG�(*��K�q����p��M������
Z�K�P,7~�p')>�۹2�uY�$3�:��
S�3֐A�&
@�? TMY{���*;�,���l���8�v_T}�Y�*�إ2�q�f���\�o���3p
��Ak&��@�kK��4}��N�7�hG��WX7�§���{�mK�۲�c;]Y����*Ne����`* ��V`w
MQ��f?h:�n%4ԉ��8�MY��a�{Eݦ�e]m�;PE(����֡�]�-�u4p�����m��l��Y��y�‘��d�ו5+���F�����&�rD��̣��ʥ=��$}�Jĕ=�ט���7����6��0&�?��w��dӉ�\'�+��I-�s�7`F:�`J1��t�-*��$=0k�R���5x���j��(O����5�� C���01�{���$�C��M��ۃ7^��<'F9���^�;�0���s΍`�`�0:f�|������'����/7�IN�œ���mY�U�FJ�Cp�/K|� ��]W�l��Uh]n��b�U�6H?��F�y�{���'E���$GE`o��C��^�9U���KNM�\�w�����v	��k�hk�v��+��
B�D�)�w�S��A1扩��ܔ1�qaPzp�����I6I�\�~#�P�נO1�vZ ����L��RwC��3��S�H|K�>mK��b�c[RpO���\5
9���)�?�H�&�Q`CA��CI�D'�T!�6�Bl�5��;l(:�C5mA<���V���2#w�K�s.�Uˣ5șI��[<g�p;"؝�_u��Z�Y(֪΃�s0g�句V�m��o�~R��$���ub�x�E�Gי��rP���ťs'���
��5��w�e��R�Oq7✽s��C��Z�������6�rG�.=͂�����|�q~����>��=��A"��(��c/v����
6"���r_v-�6��l��H��P�4$��$�FO? ��H�Y�����)g�`~c��>�H��?}��5��[�r.���by�K�d�3����68�����6�r�X���
�G���{�q�!�L'D&��a{�"ͤ!=u�%m�7�*|��1'�->�(�#�T��88�϶���^Q���Ge��f��|)7\��ȱ�u@��jQ��zO!���?yʃ6o`�{v��~H�Qr�h��gJ��Fg���t�����O_�Y�1Bv�}�W1�zOܛ"'f�B>>��$�o���搋as��M��H�2�X�ia���u)Mι`q{�x�qߔ���W�s��[�,��MWZ�rtj�O�ΘejiaDW��|������#9�����i�s:�GGG5��m��EA�s�Ŷ�ۢH�^GK��m�/�nr��4�/ m3A��W�3�?�=�+1����wC���{�M}c��Ɓ3~��6������R��ʖ�W�8p&��R��=�|ߊ�<Q�#gZ��~�jSw���ԼZ���\�����3�
c�{��]���'υ���j)ݢ�!.T�|�\�׋@���
m��W���oڤ>��\�8Dk�V>q�yQF�e|���լ�
�[�S����i�	(�(��,)Ru�2b��5mV���h�8WvZ��79#0��V%;��:o��Z����7=Z�BR�d���u٩?�Mf,/W��c�i�g���|�hBCx*FN�r��U|(o�w�D����p��+� ��w���M�r�������>L��E��#��X�9:�s>Ҧ��%�
}Q/!@-^�K�>¼g�m2s�S_m�f�V�K�&_�X湻����]�戽ᙋ���}���k�=M�w	}(�`x�?�4��\��������1��4y+�@+���=�^�(d��l��6e{3����g�O�\��7����O�����_���w��ݏ��kox��[�������/��������[����G����;����YϥO�O��۝�3T**��X'2s���XAd:��I�TP��i���������l�E/U���KuH(}y|<����Q�F���g��65_gK�:�Uv�Z��y��|�t8��˓�=����7�����4�®��r���qF^��_���R�Ίݤ2@&����f�����J��c�"����l������o�տ����1��#!�Ҍ|7�y�/����9�U���?ʈZ��'o�_
�J|u*���6M>���(9�;pA�>�,��AMaF>�x��`�?T�4咧jI.f�l3W��Âa�c�#�l���n����g1v�i��%�z���ֿ%q��'�G�v�\ۖ�hf��*��,����B�n2�=g��畼�L���PKE��T���0Spip/_vendor/rich/live_render.py�WKo�6��W�E
��^

`��"�6)���  ylsA�I{�IQ�Ivs���y�|�ءRuV�V���5;��]��h*���c�!��ְ�'�
	�5[A.K������""�,���4ȊG�L-ksz�f#d�(���1��D���H+�ݡ*H#H-Ѕ(r>��z�Ny�tG�Q����Wn�����AK/�-��ԑ��<Pe�Q������{G�<�so��#jL��=�{�
R���w�o�ދ
)}j��Z�6�H��V1e�OL1�%~�,՘��'pA��q|%�ҠHEd=�J�Cu&/@��6yd%Vr���y�d��� ��2���P뼗u)H��3":�Y�~�1jA���g�h��ﰭ�D���8��9�7�%a�4��`�6[����`�o1���ԕ���Fy�jA��|J>]�[�@1�/�W>��\zJ�ߘ4�	�f{c��U�a�c�dO�ktF��UO��*�t�-��}#��b��A#��5�9ƨ��5?nLSRZ��K{r+3�Q*!m�6��ďB�����Q�
X�0��I���X��Ėp<��� k�G�L���Uo�5JWM=>í�ڙ3��i�C�	S�]��D����� 0)�����h�æN��j��Y}�����m6cNB������/7���%��_��Y5��3W��5}�+#?/(��S�Iw/H���Z���wҠW�R�������qT�*tWR5��n�e�m[	'&��??׫�\/�7��nRD��N�d��v3��#��w��b2�WQ8�Q�C�'�rr���l����%�m5��Y����Bj��A{�s��7#m�)��p�4:T�~�r��^b��C8#�����(��p�ؿ���1�<.[���\V̰��OŒ��л����v�A�w.Y�������3li����y/�K����E��G���<�
��p!���CRl��|2��ϼ3ۼ�8��vL�����(i:��ݕ;�GiO�qɞ�@�Y&�����ʬ��l�O��Ҹ�g|��y�s�h��2N�;�PKE��TH��v
�,pip/_vendor/rich/logging.py�Z{s۸�ߟǛ�Q7�d9�է);�&N�6�3�����#�$$1�CI?�&���]��.�ie[&��b��b�$��bi��$��`-���aū$�,���^�*R�.�㔋1{_l.yT�X���j�&����ʎ�i�K����/���x�Jò�G�̓���]�y���y�Ex��1ñc�K��D��jyY���d¯�c.4��
c��YX-@�Wa�"{5L1iĒ�c}!�[��d�o����i�K�V�U��J�/�Z7�0�at��醃��W�]&�V탯���>��6;��]�چ��P���vu��jK|&l�匶�R~�S���7��N`%B�Y���4|�1Kri���fErhRbO!�;��TЫB��W�#3kO��Ǣ�R����f]�){����қ���ޡ,���m͞�t��H�N6�����A60S���j&��J`,
�W�H'�|�B��]=��T0��	�$G��	8Gw�*�,�@�'����}�i%��Bn�����ؔFw��>��YY��1+�?��hƒl�^�uX�UɪB�9�x��:[L�z�9Y����^5O�a�8Sh�k'yY�9�Qȕ��J3	~�0`_i��,�m�ⶏ���ne��K�-Vd��mQ��XW�\��~VʀݥX���E�T�;�벇�P1��lcŚ��a��3��j�Q�
���:��P?��B$�������>��R|^u74��0�L�Z\"W�_Ĉ}3��;�h�e�K�xJ���@-%r2@���� ��@�Š��Q��&LK�5zҪA�>�Rs !�	��p�A�K�	o�Nnح��P�-������/چ0��x�#_%
?��h����8þU����&B�-t4�0K��8N�H
�	"�Cp�@P���	L�{�d<G&DH���p�_k�{V"�cQH�2P0-����ƚO�K�ǾT��s���~#��w;��+����Ǘ2��������3�)q�(h>��5,�L���+%^e�#�h�AKn[͇�1�j�He?��_��[���V�$D�q
'/��"�
[$��W*�7��R�J�J�yԒf���Ms7�ęzCqj%�@��	����|X'���C�rs�y��`�%��2�.���Ł�5�[L�?�7��ˁ �-�=�g�^3�~ǟ��~0�_vSh�e�D���>�
xc�͍��N�~��^\������<W&N�c��
6�__��-��goln?]\9���N_;��8ݯ�ޟ-�얋O��Wv����C��t��j���w�o߽��������+[��H��1���|�V+�A���7�O�fr�3欕OG7]4T44�T"B6�?��&k�3�( E<3�=9��ɥ� ��S�2+/�t�׽��L~��������59F�Τ�qu��	�}�KH��b��|�q�֪?}��:�̛S�P<6��2�vH�
�{�$�i���R�
$@�
�rh`�\X㚵�a�����[s��E��hҸ*Yw@�#�m��C�$��Vm�o���u���H�A�6�N������p��j�%�z��tȠ�r	�]
Z����I���"����#��s4
:��P�@���>!m�p�;9}���v����`��I��^(h���	j�3�nZtqep�ʐ�.ʸC��'hP�Dgt]ixX��)4�)K�sSE%�2��Hr���T
X�u�@C�d�
H�q�H��$��5�X36���%�j����T�U�.�MM���xR5�Ml���cE�Zhjæ�D�qB3�~��\�纬��ј�=��Ȃ��6U����tA�Z3�=�${w�EwP�<�/���x��dU�"�h 
F"�/y�L�W���#Y���C�;��^u����� �,2�m��V��**���}����Vb�e�E��
K�[t4� �=qS4����E�������=R��Az�n��0�`�ǫA����;���3�Z{DҘ�K�tYh�f�uv 6�G�#%�vF��aU�J�:�!#���2Y@���w)�-ƓCG���y���b�ڤ �6,�O�
јyu�K�c��]A�ӳ��G]Y-y�2�@`
]7ٱ��Չ
�Y���h�����H��R�A��lYe�ȱ`&79lw��E�95���'�6��J<ͻH���t+ߕԌ�(��4X�0���΄(����Z+5���X�h�u�lzNp��Ͷ�'�T��Hmv�/�Џ�.U��6,����kY�Ԭ
��(���\�r�F����5�ʪI�a�˴�x���I��c�vC�G��dс�y8����!0ں���<V��j2�!bX��>��R[t��e	�!�I{!"�	Qc�VfL��^7�lX8�Ŭ�w�j��K5y#�0)׳ٵ�f�zfU����Mݬ�@��\���ܼ��B�7:'Z6�r�����!7u��/�`psc�j�&!��_����#Ǜ}|i��O�4�Ƞf|��Ď~�P|�E����2�tO9�Z��a�*���@7�О'1����Sn��'*�Ta���G�*(����V�l�s:Q1�ͺ��
�F�0�7VF��Z���U�Q�5E���`I�*ɹT��֪0-_�E�ϴp�Y-
Zv�le��D����َ��� �Պ�V[�|���}�v"�d��0*�UB)��k_e�Nn�����,�>kbR)�{�S���糗%{Ξ��~$�[�5B߆e���s|�9O>��
�j�伦Y�w�-�:�z���{R��r@���u���������\��
����4x��+.��	[(��d�Z$X;�ZEζU��O���?M�g6?9<9TCh_�Yg��g6M�'�*K���!��|ҙIf�r��nDQ籼�M>�64��񋓟�GFe9�ZL9��^�P�&j�:�O��'�Ŏ����Ѡ*1��-�vu����+0�/5��o�s����o����9	k�w̓�.!0��{���s���x�-b�w�D�F�I���x�z�0+�z�����1�
�����%^��w=f0�ы(y	M9�������gk���"ٙ��:���|�<�	?�ʺL��ז�v��}�*��7���|�o�aO��}�_��˃���2�����w��򹨦�'�.*�%i�{��:���t�r���s����!>�e��e��]4%����G�a�%�LoƎ��^��.,K��FX��}�<�Uh4+��O<�l'�I'�n�/���lf�	���-+0^zp�]����t�=�p%h.oϡR�9�3���.1-S�NsF�A�*��;܉"�j!x�]��R�u\�/—�+}���
���;���1��W��M��C��-������Ƿ��)5xcY"�$�#��$B��PKE��T�Cb^�	 pip/_vendor/rich/markup.py��r�6�]_�2;2��Mժ��x�L���i��b9�ɬ)�KP�U��}�$ݜ��.l8���/`�����-�j%�nE�KEުF���oV5,�U�Aȶm��0�o�u^.��7�(�P�����ׯ�nC�Q���P|�+�}]׸�n�E(��o%���n��U�g�6�.�\u����:�|�]6�,�n�i�Fwes��/p���v[�'\��h�]���Z��)��F����wWb:��ժ��<��y�?�>����=9{���ɳ�A�f�`*����立p����zq�l�?�x��۟�ѳ�� x�PF�Bj-�ʥ?�4u8�\��R�yU�
�[��l�����m�a|�V���P�2OgU�=%�e{`W=�m��?��
�e9oY�B.�h�"�s���HS����V�"�F�X�T�nJ�� h��D���\�OU��*��~�;�^O6`�^�
z|���c��y�Z�1�3�U�JԂ��	�f{=k�����l��3Rۄ&{b'�ܣ�R]����L+��u��@�W�T�0ֳ.����.�$�:/o����}]�g��B�e�$?����g1��*l�#���0��av�Ѐ�h��٘��)���@�������JQ�����1��
�@B.iŦ*��b�j[������]���7K=xo	�c����b*�H@�ÊC咜�"����'6y{-�ײQb���j��UuBQ�;�5d�k�}��,�
g�Еv��"��&-�j]k?؍ p�y�N�ƃèq��ߗ)4@��:���7�FZ��#��]��)�`��͑�+��$IzG��;�؊��!Hij��ו����	1���3�]z�r�ʼ4?��0�M���c@Y�s�d�튢��"H+�^�%p�)L��y��,Fc���b])K���$Nz�캕
b�Y��2[�(H�܋1vR�6WE�b�����ZNb�;��.%�sL����B���t���|n��t�y�5c6��#�7�z���^��(�9�A�]�H����F�i����б�1��r�X�f��F���g|RY[�q���������̄��>��K���A*�~�'�r�?�=�'v���e���U��1�ϘmB�b`��8�G�YU��ZY��-��V_g��H���U{�>{]_;ɤKc�%���\�W�T�cr��D!�)�7�(�ڲ�̼ʠ�}�r]@��P��H�\��g�c��7Z-)���4N���ꑂK��Z�m=�Y��dw�1��Ş(+��Y��Qn;�2�b1G5t&�8������
��|�kM���`R7�b��k����ƣHլd���ғ�F��hpo� Y�i���,US��S���[�2P'�!�Ӝ��ܤ���qȕ�w��n��[$8(��Y���8j\���0���3�e~�J�b��:�y_��B���_�r��Y�Uu9Ke��(@/7�画y��t:#��r��1��NG[}Ə�Em)d,��D��I|1/ӾwA����bSh����i�e�x/�%0u�j�'6���a�`5�q���X/QFPcc/�xt�9{���܀�X�ΐ�
��qY-�ET�4v�w�A���E��*Ƀa�.���8�0�־1��q�'��.�9L1s8i�r�������f��vM*�hᴥ�;k�	������A�Žl��((>o>h[<�G��?<0���� �Ji���K�喝P��g��vJ�Jd�|��]�����
��i���,9��kI1B��9��m:<�������gcYcGY��$�t��g�i`����cG��m�p�ђ?�:N�s�MJ�$
��SG&����NN;>�x(��������I��c���,|���s�}����LaO
#�/R�C��~�,<�n�&cl�~�<`��?����'�h��ǝ�G%���?9OK��D��K�Xu�ɲ�e��	�G�-��۹�F���^�t��C��`�Y<kT�"�h�
��?�T�O��L쩉37I9�w���f�Ḻ��W�-˰�&�c/v����X#�t�i��d��:���S��L�[��'u��f
P��[N{��Pμ�{q�,�̇��>h���P�Z�Y��Tnq2��?�Y���
/�}z����/�Pܨ�d���{D��;閾C�r�|��NS��*��GV��\�1�Q�+	���痿��g�a��%�UQT�_USd�.x���K��e��Ybg.~2L^ß8o�v�D�
��(�o������yy3�n�Z���6�M�ɋb5_����/3	w��%��B���z+^�Ҧ7�����#&A���1���O�..���Ӡ%fvŬ^�u��8�Aqkr��p�0,j�c�&�l�`��j�Dy��h=�v�2�v��3�5F�kl��fhiSm|�~1���A�oG�g���PKE��T��l�pip/_vendor/rich/measure.py�X[o�6~ׯ��$���zu��˺`h:��!0F�l��x$�4�߾�;)�N֮�)���/TÆ
{°��~`QA�-�������[���/������_h��߷�@׸#��a/���z��=��@��$kaac�fs�1TC�$�%#}
b)dF�]Ya.��6���O�TCχ�X��^�A����A�<�A��j1��
���HGz�y]r�!M�`"‘��ўv��F���h-ve�G�3\��x��O����	��p�+��Po�����{c�����U�m���Q0Z���LE�
8�B<�UM���8i��8���,��k"PM��0�jtO�!�3�2��Ɖ*��둄]س/�RO���:��?��"
<�N��K�������՜��|����N��=��/х��9/B�ܳ�R8�+��=l�S����n�*�1�9"�����<�v~�bW��ԅ�lS�0;��g�B;�
�5&C0,��j��F�`ۑ��	�P"_"�5�*j��O��<�6?�Cs���dJ����7'��4_�����&���֢�lk+>�SO�ͣ����3�}���g�`�
�r=�Da�:��p�Z2G��J�t�F�'m(���~KN�Љ{ҍ�Fw'廻C
,��g�-i�\6yds���L�y���/V��QD��E9�'�,#{FaQ���!��3�'��&1��������P�ІI�v��c�%J�d����p�̴��$o��)}N��Jj+c�'��Nu��r�C�ˆ	A��c_���#�Y��r�e�b�� ^T���;Ι�?�dHTN@����Hǔ���z ^\�s��{Ktըb`����5��)4Mia�!�a�WUF͈v���df��2�g`�`����l	N�B/�#�O
<t��(�(����{,�9G�ld-�f	���pL �=�pد�&rY���Z���p�I�l��]hqG
��P��vi��4��*��v{�8�7E�ɛFv6��*�LZ�J%��e	Ȳ��5m�/��h.���5BVٛ�qU>K��W�#�:\�b�����z3	o��a>:�ӄ@<�Yu�՜~Sz&+��Z5�P��ԫ������C�T6�?} }�����L���RX5_�ҥ��	>%�P���Z�(+�D�F�^���j�x�L�a��}����M�똳�Ru����֨���M���g���l(���6���D:�	��v�Uk���69$1�����w�dž6�R�i3jƁ�'SZV�x�-���8�E}D>)y�ؖ�<lK#��&dW����'ky�
+���_
��<�p��S��T憦��$�b,Z�PKE��T���jpip/_vendor/rich/padding.py�X[o�F~�_qJ	Fi�'ڵ9nӋ�(�V�k���aw�08�,������k�U����|�sJ�� o[������)���ﯭd
'U
���������|�C
9N�V�'��U*�l����)u���t:`dvn��;*Ȧ�n[:G���f4Y���b���y�`7��5%]/F�.�cM��:y�~��	�W��)�Z�ޒ����s�,����%��:P�^y�),
���+�V���Ǿ1�qtE��]K��hz��DŲ�^r~Cj���;==�V��x�^Ӫj��g)<OR�.XG
�M��(I�K����q�$G�	E�F@#�8Z��x�OW�`��1dӦ ���6��M�AK+ZJ�9\u]�[�P�ݲ��|f�ߤ�"�s�b��m��oN��U��"5D�x56/��j�ү��nD��T�+Z�g��C�N#OoZ�~�i�*�<7n-�rMX�����!� z�S$��ӎ�P�3Y.�:Z��B�r���E�"���;B��OS����8
}��̇��#��#��V&ٴ��3�skτp�f�Yn(����M����9&ϧMMBC��1$��\[͍�_�t��<4�1u�T�V]��ϑ�״�189�9`�/�':҃�N���40ؘV��y�~��U��b�oo�z�k�����L�wT��O���rL���̷~��W�����*�9��X�L��ߓ�����@	�m'stXd���Ѣ��F��j�0�L�5l�nʺ�r��FM��Ӧ���'�*�5�a��oB�BU޵�q��j�А�ߣ��B|.t���(M.�Y�P'�M0�ܣ=5Zj �,���
�a�Ղ���o{����Hu�I��	���I�����{سkʣį킶k��E��X^�in�{�I�J�c����}z���`,��]�I����ž�f}��=�EC��ܘ=�0U�?�y�o��6�SY�ؕ�^���[("Ye���z�u#,�{j��`B]�	R�[Gs�i�J�LV����N���f�3k�%'��]�owDR�96�x���8:�T�;�7�`�_j=���~����;ی�������5,>⊊q�y���z8�<	`:Qz80�_Ӏ�f5Yؗ�:�>��z4,�#�ో������W��]�m�
-�a�Gw��Gx:�ϔ�$l�h�+��z\��<����}������R��A*�5���-j��G�Bkn�v�]�Cz<
{K)C�Z�
��5e�Y���l�d��͇Ξ����6�����P�/����c��\��*��zƒ�pӸ����\�>Y�t�C=	�~7=��n���"�`\�
n�f��r�j��V5E��+���Ck=[B��1\�)So����1ޖ��U���
u�
D`�(��k<�
��I��	IrM��Zղ6+�kD��5|��_J��>���{#�݃�N�PKE��T��s<pip/_vendor/rich/pager.py���n�0��y
�]@�x�Nk{�&u;G)�	��U�͞eO�����b��ߤ��u,��c�����[Ur�|2��'�ǡ�͂�QQv�^T�6u�Y!��$Iv�B�6�����Ӎ���:�KJ��Pͨ�f���Fc�E��z���
�Ӊp:�,`?_��ji�ԈU~-��<�������}#$��	�(Ī��}�|��~r*=��W����>��^���>�.�Y�� e�#R��0V�L�<���f��u������<G�:�N䧦�����)�k %l6�H٫VK�xs�Z�o-�`|n�zG�H,Ke�+Љ��0r�p
�cn�i�㗖O19�x�6���ٺ�������i��oPKE��T8>_�D
pip/_vendor/rich/palette.py�V�n�6}�W�*Q����t7ئA�v���"٦,��xI:�[����t8�n���I���;3U�P�&Ynje@Uf���l[-M]��*Ԗ/�e.ܾ�od�n6���[Q-Ew�Ma�~�ȯ�x����7�/�V�(�"�Q���wnm2��Pu>���Fnb�(�U�b%�yl�E!�;�1�L�E�5|J���{ظ�3HSY�.�1
LHr%2�\V�pδ(�ȋ�[��{Y���;��Z̝$^��FQ�'T�r!���pv5pH��٪j��N�g�;������?��rS��{�zEA�}�/��#vm��k�#�n4�^�Y�L���J�h�������x��Q*D�T:�\�#�*ɂ?Q�~ ¿|�Tr���3ɝڊQ8��V��@Y�@�9�Fƚ�s?@`�J�����Պ��i�'��F1�
��=%6��Ȧ
 �����R!�`�5)%��؆�����8��,<Lv����%�"
�.�S�b�T"��R��@Z��b���(lL��}۳X��C$Ӌٛ�-l}˼_�s+o*|��t�>��i�d��W����~�Ne�۩�]�Wk=�f�|�9�X��m��Z��+�]^��?�/��1pk�m"�Ԏ�m�\��^dV��J�
��b+�M�ke��"�JäYĮ���n�4�5Ď�
N��WR�{��ϮSfE���a�g��4Z`�&Nq�o�̛3s�̐_{�/�C^��B9f����9�%Q�d�Hf�K���ȗ(�Xd,!qn>s���B!��4c�r:s�s�5jY�����H�ޠ���#2����;gX�M|�c=�\ʊ�s�<|g��쨕��.��q*��pB�Ϋ��C�@�y��6涑lT�.�9T5&ţpy�G�;v��[��sk��.�t�_��9�J��d�v�Q��M����6��F�/)Oj�v�&�������,�'Qm�'m�;jG~>fe�-�ơ���ð�sa� uˆm���|;��q߶Bvy��9؈�:QO5�)�����#*D�����G��ޣ4�|Oaz\m�¶��v�RL�8/475
�<�"�i|��a��^з5;E6�6��H?��`v�)8N˸y[��q��f-P�������X5)΂��;�\
��IB���{��1�).�&�|oj
2i�����x�p���Lb�PKE��T8s�("pip/_vendor/rich/panel.py�ZK��6��W��R�I��QM�ۦ�$E�EQ����5�$��n���K�PҮ=U�H��f8�v�55�ǖ�+���$�������?|��ۜ�n%o����]Ҋ_	G�T5^2�o�vx�ܸ�7�yuv~��g͍}h��u��{�|�o��5���c��i�LȜر�cb�:��Xog�t�
T��4s�rƁAj8��])���g�t��X
��ǖ�A�n�i��_M��;l�Ղ�c�m`�Ƴ}n��{1V�s�f�M�t�7�?Tr�Xl*���`UZ/3k%I򔸥����SI���	%릃~B�� ���^͐��\h.�7�n+fX��ɓ'����� y����ɯMWm?K����]�~r F���VdR�f��m�r�0��r�X0���D/��8
َ�C���i>�f�߭�i�Yul�zG���7%�~�WR��Q06pi��KcO��+�L릩�Pg����͞vt�p��~y�V�HA���6�]�͑é
��=���z�]�����̋�nZ
~��NSj��_���H/;&7{�h��j�:��o��xw�{��4֌�O�5�c`t��&�RX�y�͐���5u0���OD#X�D�(O]ǐ��R��.	��_"�n�Rk->�
���� �[&���_��IkX�OX�%H��(5^�+9z�$|p�5j�h��d��s��BIVS�7�X���!�K�8H�����Ъ�X�$g��;)K.�,��ÌU�|"��H��O��f��I1�Z��=���Vz�R�%�S�(K�W��]�
@�u��a}:gG|2s����?c�&����A�9�ݕ�
�R:T��軝R�J ��H����,NW�HӇ9y��c�JjT��<x�������Th�Dk
���ЅA��д�!<ǹh��4���Mrs�X1`؍��Ȉf�LZ`���p�p�	M�,��t��tɩp�����.7�k]?զ`U*���Ǧ�O�<���pr��Nt����V�� �}lI�Hv��l:S������l?j��ؐ�N(�x�`����;�#
�;1`<T��y�p/�Ö
nF��Dž{����
�+�Y�
L��Y�b
X�/��G���kZ�ɣ��v�
�n
��몴��j��x�AC�Q���(Wִ�phS�'�2�wG��2ׅ͈����\pVl�)&�fd]2��\F�p��b�T|�k��K~IN��.!�򺣭�	f�+%]��,+�u�(��EǑ'�#L�����Ow��/���#�杄�!T#�	H�i0`���޻ ��܂�H�Y`D2�b����:�ٗ�<;:��.l��%q���˘$�>�k�`)})b���A�t�!
�,�9(&1��4*:�a�LA��c�;<b&
S�������&S�����Q�f�ޟ�R{���*ZC/kzS�O=.@�\�φZݚ�t�(�f�&
[�;u�*x�C�� ˸L�ճ=����ɜ��^x�Y�P��J\Ѓ<
#�O0��d���=���cL���C���3������� �sݡ�RɌ<�~�ꔃy}�'0m��	��7���A`��آ��"0ʉ.��VxYf`�|N����лVUe��bl��(�B��~�:�aoL��@����r�*��k�i�����gR��4D�3k�@Y5
PN;{���8��,�٦���h�J7m���fvJ����ɂ]k���j[�&:��?�*�c�#g�i���l�����lN ��9A�AjC�?�=u�V�U�;�m^@�mΉ��� ��3r�trx�� ���1�l�g;g�;p��.I�S����&�(�F����h�]��,�(g�.�n�-��~�׍�M��H�"`���x6�߅C���|�G��q"�o)���G����}j��
��CnX?��P���iלXe���:�C�Q�Hގn-ƥ�+�.wb�K-��#y��R��W�1�z����I4M��8�ښf2&�d�?���#_Πy��Nޞ�/@Rj�[��/�e)h
�%��K8�sQ�Ɋ��I�ѫ�� =�-�`��|��y��
�c;RA��u8{�˳�swM�k�a�jD�/郒�'��R�HTt.�eft�Z$�{.������ua�c�xd/I����~�ZP�PKE��T�Q� �pip/_vendor/rich/pretty.py�=k��Ƒ�W��m�z&�l��Ȓ�(�%�$�+�aA 9\Bj�����W0�C�u����8�3�������@�Z�U#��,o��>���Y��r�d�K��M:�Ӻ�6	
��,mF��OU�iU�[�S�Jg���'�hd5�Բz����SV��\.�M��)y.������h�9�L�s�7����i�M���y�ES�y�r�l�l�k����z�篪�j�2,$��D��o��%O����_���qHI���zy��y:ͥ��T�����s@�a���	�����N1��z�Y���><�(|��z�|�ż�FU6[�*����!�5�~-k��䤩��T�Ӧ�DZ�_�U9����eZSj-��m#&�fr݈�T�YU�թ�ĺJ�W�(J`���S��Rc;2-��&������(��rm��=�AmL�:�]�L|O�0�:3��sEj�?��c����y��|��08� ؟]�|�Yo�_�ϟ����_��W2�7���~�da���+��o��$[���KwD�gNbB�1l'(ު]:����˦n��g�,˹K~	#����v��b+�
�x�_^����ɓ��y��M�e�����O��N�&�[ y�:/�<���qՀ(ԑX�Ez.E��Y%��BT�	c!RCc`�F��_EZ�ť����sL�ߢ)uI�
�,G�����@^�P6�ř�c">du'dN�S�F�9�_
�כ��U�B(�GU�lE�Te��hxrt�'�LIDRN߃��S�"q��@fVEѓ�D^_@��� ��J���g�R(�R;�2T��ͦ*��!��l� +F%��5F�R*���h��ȫ�1�g�M#�pM,�?�F�n�(+��Eu��,�S7�D*��HP$�l�(j'�՞B\5���0�4)t
�2u����I!y�L[�)���:�O�@K"���X=�~]�5u��$�H�"B��`��Z·Jwj�#0�b�
�@a���9�iv~�� 5�`3��a��֢a���l��(
J��	����=����5��(�}�j�@U�&��T��d�0�F	�Q��ˬ�Kx���q��ӕ�17s��*�S�3�dp���nU�<'�|�Zmlg��L
���0#�G�h,gE�Q���cH�2�!���,��N���i���/�Bv��h�m�Sb�>���7d^NQ�:p5�:[,A�堍�[/I>����@߲�%ps����I"�Y	S����x���O�62���C��)7b�Y�_`/B�P�,���i��Qՠ��M��s�CZ���z�+�n"J�ЪÔ-�9)�5���Z���&�^��6Y�<���i���άզƩ5O�"mSD=�
��©�|c!�(;/�
DH�Y��S�Cc��f�I�7�\�!�Uz�&�y�d��R�1A��A�a��Z�$���-��"�֐��sp�,P��J��
dV�6yjLAn�%�DO�	T�����~�N��ّ�4�L���/��@+�� �0�ie�\[QGԨ��p&�Ӆ�YӨ�����+�L%G�j'�IH��7(�,�x`��	# �ƗK�S0�Ρ3��z?7S��VZ�b�it���5f���'�M��O��^G8��9�1/g�(+���P:z��N��@Nhy�lV�-��m-%�b]��19�7g�T���Z�h�Z���ܞ�uٗ�������yOֺ�˩?�嬲��nP�r��}Cӎ�a�<�^�v�<��a@VbH�6�e��Z��ꟁ_?>��#'��-��������k�˹L�xd-R���KX��7�;]�4"�VT�i��tk41�L)T2�Q����<T�tKH/gԁ��W���d@bM�A�cL+C[$+@N���U����C��8B�����+�(��XZlE��D��P�c���+�{D�}���_��A�Q�A��C�͕-�d'r4|��΄6H��ڴ6c�0�1f�@`J�VXQf�VK����P��R�e��S���_��;�����d�����H��-�qS�7˼
Ӗ֑�u�KJ�
s����f�-1��Jђ�C=/q��5��fg�]����䖘�
m_o�B�Ó�y�K"��3����T���x�l���k\X�j��k�;9�#�����^�U9/�Rc��g{F���:ci�^� �R�WęIc�ڮ�gs|�K�W4���%��%H��Ft�����m�&�q2�[5T��UBf𩊆�!U�T��F���놹�p/�L~�
#<h�c�ى��\���+5��'��2��6ƞ��-��B��y����sE�n�-�m��9Ș �5ЇڂDg/�1fkl����O�����[�Ļw�Ȼw8ဎ�y9Ms�?L���|�t�ӌ�����L��M��u����<ic5#�����n�稼�iZ�k'�3�Ϲ@�Xu�fFQ �`w��XG�0f^�?�W�j�:�\���`>�|��>��;���>���.ȩ����Y�����4�F��6Ŭ�
46�v��>DYʤ��#�^�.�t��`���fs@]�Ca�_/�y�T`O���P�5D\��~{���#@�5��"�1#Z\���Й�'&d"���^���F����)qus�cYq�D�I�({^M5Z���nc�$��
��s0�h;J�D3�S��]��:�5���+��������e�>;�kq��c�X��o�s���A��;����|ݤ��C�����h��[3�w����VNu�}�xЩc�]f"�՞�hp#�~�RT�Z���O&չW��@α��:8� �����kba;��J�@va��vI�W����ÿ]���G��]eOD4��`s"�˱�����αҁ�b��|�|�
e�Ђ
�{�=�J)r����s˰Ja�cӜ]
ɉ�w�D���	�Y��ޡ���+�cݷ瞱7�����JkZ��``��Ǫ��QV(n�n�8h�&&��"��d��*�m�q��&�7p���J�:�+�c�3�Z�-v�K��)hұ�^X�^��J�*�W���^�z����תs�	Or�ˁf���b��t#E�\V�n�2F�eY�B������V�vPAe���q��DZ��4$*Z�쿱���n�l��Q�g�A�θ���!��I>���P2���r�D��H�.<�\(��G�f�i(2��Z3����>��o�$Ɋ�#�is�F�J����'�ٴTh+v��7Ð�;�
�}8l�0^���u�ؐ+�
ui%�ʐ��#B�
�j`WPȗ�C Ih��ǚ|�6Ծ;�_�l��$3�̸c�&~6�^��d۝��Be��8���&�/y �0����Ɔ���9f���&�1c�.�V�c�9] �\ǎg|�(nj]��nkni��)�1g�Q�xԞBG��X�
�eW�4��3r��͙�cDe�!E!���lo����]5 >�H�l���)\�@���w�5���A���؎�a�]�h
=[�h�<�1m���췢%k�e�ېR'�,	yrȋ�=G-jc�Q:�h��$�\Ժق��D�����b�Y�gy��`��K\|�5��|:�������\���Q|u�R��y�G�<��`�~������oc��ֳ,K�"o�%|��_#t\��n�;�cz@��TF�����I�u��.>�[ܐ+X�S%�akk3���i3�i��(��u�b��ʸ-��@l�=�8�r�}\0R��u�5d�j�5#3���@�:b��)v�b�~�):5FN�~Z<[+�����C4�'�j�5�0��s���"�u_��Gfo�"�5e������k����uT-7�h_w� ��hD��.���Pe*�qO5�p�M�n!~��?y���)�ss��p�L�q��%ϊY����t5����#���k�
i#\"�hEx��I54*�A�0#h}-�����$��Q���QX'���^��j�\�XsR�Px�)A��L�/�h̳:X^u	��M8�?߃�닇��х���w��z�r+�FN?]���I��勷���x��
�����at!��O���z��ŏ>l��12�v�s� ���D)p��N���-�T���n�(m�H�S��>ڐ�z�8�1?O���eZӦM�$�ӽ��"4p�i�gtc,�3�*���
��-�B��TK�tX���щ.iS���������n`0	�S��M,Z[e�kY(��ʘ�e-�9dj����!�d��f�P���ȟ-�|^ɂ��(�g�*��0��t-�i�!�`��2�-�0�Έ�ӳIS^�� ��Ӝ\=s3���.t���-���=��es2b�h�L`W��D�z6�}8�MyC��6dw���x�emr�V2L*;�Yh�y
�ǽ�"�B���^������œ+
�Nn���<��R��@,	��4�N��Y/�k�P��M��y�'�9ؤ�(�P�k@/\ӾG���9���>���	���E����J̳Uf������
��Ao0
enq�Z�Ⱥrr�8�,�+�|����Jk)��^�P�Fç{"��<��d��M?�5]�Pm)��!i�Hp�Ӕ�׻�!��3�Qa!�Y��x��׫�۱=Jx'��?�#��"o�g+�m�P^6(a���~�ݣ0�C�ޗ�V^�:��-��Q�o���G6�������1v��{��&-sj[��`Ն;��O��](�w=Mek6�
�u���ܽs��
���Z�{��9t�-�@��v�R<V��~�^�Uv�ACv3#�}W'��,�	��#��j�a��R��L�IQ�ˆM�\�C��0���%C:NYg|ҖL9k�N�,]΃{~�iQT��t�e���!K��8���Vܛh�51�A��T��_<�����'��ݠ��]PP�@�b��c&����B�:��A�ۮ܊�<#R@~�GXa4@��I��a5���kI�5���n�Ú��ZV���0�oYu�3�fl�k�[��ǁ����O�U�㌵�v�QF4Fh�6�y�&1�˗�<�P�l�v��Z�nD��v��<
�wR�iꍰA:�)�I��Ð�tb�Ԣ�5Vk.���]�v��:��Q�Zo�,ؽ$�8e�ocׅ6z��m���P%����Ca����ڕ��4|G��ѵWՍ�i�f��ܚ��ʊ��ؽ�-�t���	�V��p[�v�W������Mp�\��P.��`ϥﯡ�rNN�g^��:���l�*ؚҹ�>�H?qd(O�}M���V�l(�B�����&o`�����"م@R���yGw�V���]Z�ێ}���~���X���Sg(�F���
x躵ZO���8���*g�J�X��o���	���6�9F��xp�^�tw���V��Ak?��Д5�t2��./w(y�_�5]㤬�R̪tѰ*�VYu�i|�m����p^�PL7j]�޾�����-+6�l����"�n�w�8wl
<Y^()�����u7�@���k\u|���\�����N.��ܹ|�U�?�߿����Ab�?�j�.I��K��Q��B�n����h�`G�m8�琥:[���f���KłM�����]{��P��iz��u���a�.��>褖����~iyi*m��/���c�9tw��r�4�vb
R艩�ʐ\������N��V��(;5%�����v\/t�}��9�
:Zo��$��g/�澃qti]p�*�n�0T0tʠ1��I:���׎�)��x�-x;T�X�H0��~��:��W�ͷ׶sn��V�
�wm��7H�wֵ��Ƿ�)�1�@���Qǥ5s�m�З$�קx��Z���"�z�h0<��
��{R `�!*�*?�Uʆ��z
�K��ܖ��x��4����EV�,�aH�;p���8h3��Bb����v��$+�h���ʺ�Y��Z���:��0§`}̓�v�NLA�>�;VmMv厖dS�b���ں���"2�ہ�=&��H�+:N�*��:�
�f�
G�0�rp�3=�_�T�O�&a��-u[��*�{���v���
�I��y��ҩ=}���{�]�xvw��_���u��"����O��Ai���X��\�����e�^6����e���/V��j�=���͍��3��B���]�l��ۓ�'>z����
��K�$�sZ��=��W�*�
�ݓI�b���w��J��✮��\	v��&[S9�
��MRj���nZQ��j2�Z�
���?[��eP�����m璏�rk�F*�$4�-HC�"v;Ƌh4Eǜ�%���ۯxc;���&�_;߈@�?,�2���t����eA�`7�
:��]؆7���# �_|�_�~a��p�6
\0�GG��Q&�y�+�Q1I=@ή��Q�Է�^�&�*�ǡR��,b��P^�)���]8�Q�'v5�wi7K�xx�����)��#a�ʡ�J=�(b�R��[�'uV��&a���>���n��iX��P��N�w�
�,,?h�|�� %�+�Q�S���P�{�kH�c�<�?�}�޶|o��6��?XϤ_m�ml�
N�Y4��|���n �bB퇜L,��y�?�G�E���{gj�QW�����n�����Ѓ��z�Q1�YCw�'�('-�U�Ku���!Z
�����"{��	��n�_����ئ���YS�{z�Й@�"0���4;�m#.��m$��#��2�X�W��Jg�X��G�a�
ih�Cͩ/`��N@xP��n���
�7�9��rϕi�c4�2E:0q�[,t�<���E�`(~�ذ%���x��AD�x�u�F��k9ۨF��*pٶ��ۗ���cݱB��>�k������#������,����&t'�)e2|�V���AY����񠟣�I ���~�L	U+��̰�s��+�O�~��(�nѭ�X�1y��w�(�g�vZ�$�9Xpv��;���Q< r�9ŏ����
���ك�>̒���P|�%b�5���!�U�	�̓�7_\�L����g;�Kyv�Z��o#9���ԕ�^==�W}� ����W#�[m�?�o6�7�s�c�g�B}
�տO����q�zظ�9�+�nSn�m%�m�X
{��d�߫'{����s��r��,6��tۣ�¦	�.��B�������_wtO���ݣCk0����zY�-g{?��m����4�4@�<j<���a��4�H��X�;<�ϴ��^��@�1N��q�>ֽ�gǪ"�I��ؐޡvճ�V�G
��j�eU���p�z���v�v<e�'��5W'��3���c�Oe_�߾�Gk>��Otΐ|�����I܇\x!������:a�:�3WV	w��S�v3w���nh���En�ݥ���E��Vh����;S�(z�>ذ���N��
��ڦt���ųY�>2G$9nG��L�ѵ�W���3<��j�@f8�B>�k(���l��\[��2wHB�6���D�i5����p�Z�ѽ��;{��q}tf�.H�M'ȐOem��.����v�Yi�*b6�}Ǯ�u��j�����=�1`��v�|5�U��6g�I��/Bp��K�;�I8�M��u�Rg�u���	,|���ڿ���>���	z:�OЋH5q"�X�_����g����x�c`��B�_�{����o
�G��|D�S�k��ܬo�J����v�A�=e�yf��m>���?��S����ɀ�
^����6|n�^���v�q].u=��J��t�]��|6>
zI�`�y�
/�y��D�7�
�᳾��w�%*��!�㤗�~�RO�tWV��/��3�@'�6�p��4���R"�/E����ÐH�C��U���e�%@�ԅ���yYm}P�A��g^p[�>�#�W�)���3���hQ�4k�N%����E��֗���Y�y)~-�|�Uk�?[w�?����!����]?��wC�����
��x0������̀�4�]v'�.u��_*��2^�9}L�:�U`���d��{:xrT-7��_��]��9���֦�&7!1�f�����\��7��QfZ�f�UZ�s�1�_lV�ؤ͑Y�M������O�}TWCBc}��D^�b`�Q�N���sٛuZ]����&���͚��_S"��&��jv�;�C�\�,£��*�'���/��
O�M��.R�	:�Ԕ�(ٍ�6-�:cR�r�/��#M=��!���䃵[�_
�Q��N�PKE��Tr#Ho[.b�pip/_vendor/rich/progress.py�}ko�F��w�
N�f���%{�p��iw{��uۆ�g�=A(QU,�VYC�Z]���W��د{��~��#�֣Ϟ
v�dfF�"##"#"��n����J~j7�~�6����o�yS�k{4o�e�_O���g#xo�&�vˢ��g�gZ/Ŵ+��ygş�E�:�^�)T�Y���E޶�-�?��yY,lƢ+��΅ϳb��\�:�������%��
?��WE�cC8�2�nu�iQ.��e��_�֦e?@�o�;��vyǩ�mS�34����EՍ����w��%������+��:�޽��&]�I��=�6#z����fs�=�=���zQ����7݋��o���=�YP���o��h�)��w0$Ʒe�2}��ȾZ�t�w�=��_�_� �~{��TS��
ڠ(����Ϲj�*4:�s����i�Ӥ��u�e��_���6<�̑��/��E[�L�r5����f�&Ь�j%���I�Y�j�e~�T5`+4��b����E�������LH�P�5Vo:�3~%�4�z5J��n�r�yA�0�#n�||[��.�h�����z��ȯ/�7�B��|]�ν��WM}�m;��M�Է�r
��Q�,��������K|��7������Ǐ:���xxѿ��U�ޝ?O2�`逿FIYu��������}��)�W@
������Ȣλˣ���9$1N�
��`�1�,2zD$(��:��U�������Z�IW'@_�zVN��M�^!�J��!���d^v�I����d:KLǠEŤ��G3(t��q�T[��̄CG���A�Ł�'7٩29�n�Y]�P�K�Gn�^��9Nl��ñ���f]р��/����m��I�g�s�A:���n�};l����Z���>/;]�`�l�-��%�K�b��'��c�d���7�-����Q�z�=Hàp�oۦ8���K�Ĉ*3�c��)�P�6{լ��\�DE����@�����6�t�cSt릢4��2��ȼo�ܒ�̦v�T�y���L�xy�x�/D~7��Z�����t�Um!�G���
W�v�;�Y�6�3�R/�|!�$�A�߻�UcfE;mJj�p7
�৺�CZ98SWwN���"�&s�|��5�g�u]/�r7�Q;���6M
�6l�	�9l�0rHH�]��E�'m��r��p�����C���m��Ϙ<�˫3��s�s�m1�ͯ3���5�73�������T�g���Ư���'���N!dK̖G���-�&!V�C�٧$7�8���i%�sb��+�%OE�%�P�b����dS��{5�u���J2') �(����"����BC�Tȫ�Nn:c��zѵ��W�V��DJ���
S�j���Q��ڮX�^R�	t'�]Z�r	%)ΐ�)$��RN5R��dc�u��$�#�X��[=Qu�4�^t�.���g�����26	�!Yw��,L�%��?�0U"�o���`�7�ߡȄ��7��
vB1��\�	��$-�j����r��2H�tG��vzb�d�85���}�� ��#�ɠ�yXe��3Ih�����!�:��V�ҧ���DO�w	���������6�����s����\/iғ��Ԝ����J�Y�
3t�b*h�Zc�x�R �j�o�{dq����H~8�=")�4�G]rW���#q=������iŋ[�����5�,z�H�W�$ҁh�ځ#���7�-�2W(DqJ:�0# h��[$��˻���,	6����%�H�c��g�F��?�gU�[K�ѿ� �]j��fw�L澆��
�ij�q辢��uj�'��~1���e^�
O�Y�bD���+���X��(�#e�e��L��;Jf�l�f�2�0�Bг����7��E�����f\�/�[+l�"T1*Ց�Y�\�^!#^��;����gOX��R��2�B��BwiTB��P.X���Q[;�,y��#�[
$����~�hz��ۼ�!���%�8�
GH?KXY!�bQ�k��8�'q����P
O+!Z�­xu3N(i����*O�/�2ܱ-�T\��Ja��H��ٮ@\���gK-JR9a�T��0�Zd�#�ɐ�Fh�`R�+7�Vl�1
d��|��I#�������6^R���/�HZ�m��\�P�}���ea������:@y��4�}j���@0�����`��L*]�������4�z׋zz�5u�G)}O$�!�g��вZ5�Z�y��y��Q�,�u�y]�#:�B):�,ajQ�TuS\T���/�c�:"��)gť���t�*�����evyx﫠ӕ�a\���&hT�%E0�^1�]�C��Uݸ��v��j�˥K�ڞ6��-����v�L/Rh��k����ĮO%�Gv����e����=��&�1����Q��JN“���j�����cK%6��&w�b�?i���2Ȏ��&&/A*��g�*?�Iu$��G���ˑ>��]��rQv��������{:�C)��6:׬(䀗8�b8g�伏����Y��_�2l���+�Zv�o�u�W�����N�t�F�r}$q��	�-<��J[Zj�q��ÏlUaN~������!���ɵ�8k�=�H�(�DVM�z�ʹ'T e�t����.�`�L�+�٢)P+�cQY���Q����xœ���bڡ��@$�zVx�|�v�=wIA��NNN8�5}�N�v�S�-9�Ո�N�
)^�A��kЩ?��+X��P/���Vչb�->�����R|�`O�)�����2�C�'�X�zUT��\�a@�`����;�έl?/M7v¾4~���A@�n���	 @�3�n�C�������v[���GQ{[��q{h���q��d���T��+�?
�[ܾ<�n�5�B���z_��;$�؏f�h�IО��G=$���JH��WP���;\zG3����:7u����F�p��$\�X'.[�,R��A�|D糮�٨�FxR������쪬�X��v��A�&U����'����"
=u`+ѝ�T;+T�`G-��īq��T�vwg\���VCVW��@�kҒ�.gl¦GR"�:�0j�J�mR���#qb�<�{P�=(�m��m�<�m�Au�<��Tw{����'��K*#N!d�2�4
Vq�D16��o|V&Sň	
bl�w�kŤ�OL���1Y��(	��KcC�_?�ꙵ���xe$�D����LjZ�� �"��.b���r[܏�׀�L�&���h�t龣��,MƱ����?����\(�^��P��O;��o�y��'L��h�5��~�n��~��sWU�_q�.3�[�A�`י��t�fTS9�*"fm��3{@ms��i#
͸_o�I��pn,aDMA�Q1<�M�E)�&��+��A�7����CǍ��d���������;)t��&J�-ۘ�&��0]�gJ��lrا��0�S�cM����.�yet�Fl!�#|��=��]�	������j$��� ��/��#�
��I���|��-��4^N	�B�ʹmN�۰�_:��ǟ���#��~��9���x�=G�F6C�[`'�7�^��Ʀ�Ԑ�����z
�:�b��*n��ui���>:�Vm�U��u	�o6*5����m�+4V��宋���A
��on���μ!CE�`�<�s����.��j2��dU�|�!�k�]#<�aj�U��}�����䑊y�f�T�f�]��M�=U0R���*�+?��$�Z�(k���,{���/)a�nz!��O"�)	J�����i�D�-Ig���E�v'��q;:�FN�9rS �U��5r�K�ǂ�v�fb� ���y�c}��L�L�8��92Z������NT�ɀ��1��&˼�[�R'���D��q3�hG�4w�<��Z�>D�v@
��h&}t���ո!
��YS�ش����d<P�^�
x+�Ҏ�ISNo�p��$�nz�+��3��HF�5 �ꭅ�Z��&\W�:!�H����d��;����Q�zs:��;���a^�Xb�"���"�d�m��9�ٙ�3.�y'22�X�ODBWCs	*����#���@b��l�]T	bӲ�x��$H�7Q��䀼I�lUO�^��.�h��`�
��1�!�\��Jq4�t�Ђ
��7���X��8gr6lU��%*x_���1CJ!R�s��m��}+��V��]��+ƭ��}9�Ca��!�?Q<��D��Q�0_/	w����\~g.�s�����N��v�#����0���n�]��'�v�dv�&��f�8�0�:����,q(���)�o�W���h׵�x� �&�\]�U��Mz��ӗ��t��#���%f�h6�����7#x��[��lM�t�e�ѴdF
I�����c|��q�n�`{��t"�m;����"8��=��N�x�"_����6F:߂����!|k�Z���Suh��e�)z�Ǿ�|�'UN��Bw�WhN,����h6��U
�����CX�*2U4:U�C�l�x����df)�$dE
;E<���1�<�5_4����x,?�;��?�w��s ��u�x�fU���ٗ_�O���g0&W����S��u]EBl
V���n���pXL�����^\h_���iL�H�0�ci"����"�-���ß9Ҩ��	+_�d��?�1WR6I���j�3��_��6��Z->��pꃄg�XC�(,�
�P���.���3F\���Q��(=ϢO&���jr��$�ѭ=�u�����<#�q��|d�����:�9��=��S:�t�hGZ7���7i�9� ���Z@J��i;�'};��_�}�4\�{s��J���;��Ȧo�M�k�Ⱥ���7$���U9��`�$��9�tː/�����������ǿ��?��>��I����߃K����ɉ���p�A�P��|��8��߽�.��	�����A��xK::k�(Q���(r�Q�@��{��*#��~�o��Ǵ��b��{P�ٱ~_�[�hp��R@a�Ѻȕ=b�1�f9��!Q��ŋ��/�ɩ�Cc�[4B���z�l5�Vl��M�\�[���T49�=��qF��c��߾/���Zv���H~.;�–�-���g�ԈƸ��A���zb3� 79>Y�y�R�s�Ԭ\�HZ"�ӎQ�#t���s���mŇ��ӑ�|�#�ݐ��ӿ���.������OS�D�@�D��,A���}�vݪ={���n���I���zQ_?Y�-,;��v���R-�j��uDz�Y�zY��'5����zb	)"(�
�2f�I�P��w�x�G��P��N>��;{��Ho�P��� �m�����O��<�|�`��a�(���/d�,`g3/�HsVLa�Z��*Ҹ��@	�7
T��p8,��~EC�:�J�PϽ�1D1l/�w�T�F�i���'*�F1�'����L�#œ|<�
ڷ��5�͡�ݠ��Ϋ���B������n���;^�ڒ����FK�(��5��)�,��歫M,�v)Y�ؑzN�\֩-V9�����5H��,���Aьqd{Oo�d�)����+6��'�}��}�.Ӈ̂��{3<�'΢��<EȂ�hPE���j�0pA��6���kR�ޢ�ɥ샷����n��3��8�� ��+r�<���
��h׊$�V".��F�4��}�䛯�O��A��m�u����Ħ,��ʯFɋ����t���C���Xe�2��_t=<��Bь%0P���r�Bq�;B��.#T%�]�ϐ�.8pI��Å�3�Ne�|ڧo���ŀ��Q���^�o��+�������w��/��2yz��<O�-�_��w�_�.��;�}�rO{:*snGA���x�)
�8��Y��2����;!���Pz6+o}��r�������6YJ�'��w�0�i.��j����Ra3�1DB���2���O0$����J�{�֔~�h�� � UaؐS4�R�+:�,ߍ���![�=���2�L�~vT��6�T��
���Zy���!m{*�!�l�1�A��;*��7Ν8�wQ�S��T�2GLJ�=��$���˼2�Q�� ��92�c�^]ye���.� �9���[�;��:O�::����[��f�G��ѐ�2|u[�ǖ���.ۊ��q���z��G}g��|v�?�@^��憐�沷��FΟ�`��Ӓ��$u�>d"O��Z-%|��pC3i�xuF�D�V�ي^��ax�{��T�-�I��Û[`b�=y�)kP�re�0���Cv��Q��:��-�y�s��60_9�q������H�+�{����Ŵ�_UV_u��M�ͷ�ۙDϧ��$�3�'��ɠ>u���xz�2Ȱ����u��R�
ؚ�v�w����|
/�.�L1�M�j�y؏M4�fXp�������Í[}���W�|���*�8����ᴇnaՀx��b<�_w�M�
��6����Ѱی�2�|y=���;O����3d��}�Ʋ���9K~��o��l�QP�4��7)'���A�q��U)�v�N���|l�V$���/o�^G����ҟ��Ғ��"so�v�I���)�6��ٮ��0���a�shGuL�͌.!~�E�ev�S<���E�]��Y_��i�{���<\lK��7Jp����WW�<��t�el.�0���Xز����(.����~��a�)�3ؚ�lA��o�-2���u7�[;�=�
B67��1M��C����ɉ7�D�
�F��d|�̤.v��h
��(R��\�UJ�#2���-�#;[�|ᰶ�x�)����X˃a&Ҵ�8D�$�\�#�.�\s[��cZ���ǧ�c��&���~$�,9ٿ
tY��'��B�v�.t�Ǵ���-%��s@ ��Q[��3²���m�~�݃��� �g��j!Fh�|U���ڸMAd��4����D=z����Q[ۘ�(�)A)؀��Ե�"� �$�!�*�KE= B�ݼF��V�_W��,��CF�;�[C�v�sQ����H��^my_�oʘ�bEԎIؑ�lу(�:n7�%X���0�	Yy_.Xso�J
s�"�ݬ^w{G�T6��K[=��®c���܂�� T5*�R�ӡ���27���4b��Q�$�6��V�z���FQu�Y,��vyͺ�55g/�X�tk�B��~�X�M1+�b�Mx�c��,�J��Gx~u�j���-�
�����\,d�E�T)��ڪmR��q����oЗ/�<�Pk�p��0dw�@�N�%�oVx N��(�n����׏C��t"ӻ��ˑO�vY�	K���>�ӷ�H����fk���z�i����\���.1����.:�p1��R�a�29���a�R�������%���*4��4~B�NˀZ����	�v��w��E/�L���VO�����?�#���l$�6�7Z���M�ףE���-�q�Q��8J8@���#�j|�D"�z�0ۂ��� ��3�jȼw73��-���o1G�Ck5�M=
햤�Is�:+}�&���s��-.A1�.Z>���.�%��ؕ$���9���W`�+�S��21̷9��1z��r'�� �(����-��S�v=IM$��:Ч�F+�HO��r��ώq���L��!#��܍j8YJ8B;f��y���q͛���A��諛��ۢ)���|��@�����0A\q�G���L���KS�usd����k��/ԎP����7$$�?�m��nT�ahb����:�<P��g�0-t���敎>�xYb���p$�'�S1K#�fG�Twy�+�(6�#uA3l�ł��]w"*:���m�R�����Ə����G�#X+~-jw5M{U)��Zx���H��$��Q�^,��Ug.ioY5�6�1�����n�V>����ҧ�������m�;D��4K�9��E!Ա��T*�Wԧ,4���wh��3�[Om�ez�A���KL�?��uC�Ѯ�Р1רy+
&�S����^�n��˹J\�R3e;!�L���X��Żhݿ��^&��`�_�s�e����x�x܌<��k�;f=
��"F�T����q���?Q�5&6����짺�s.;ß�!'�S1N�~9،c,��\o�S:�,x�"90�(l�2%i|�H�b2Ae:�¼"/��P��v�i��S_�jޢ�B�Cdq��2��Jy��,�c��q� cΆ\�3����D����b]�Ό��H�r�d��;^�=�
@�I!İRO�	ȳ+�@Fa���ӑ���v��Jw^)��bY��x�.��KKR�-�n_]+���/�lnr�b4'�
SU��x˲�7t�,{l6u��=�ٌ6�T���1�lk�Q������
�Q�9`����`�a
KU88:$�'�<�(w8��$�0���r�
t)g��ˊ���o��t�@��$����ט~��ѫ�e�nl낪����0�c�M�6g�����bQ}�S��\����k���I�jۆD�D��y��.Sܶ'Q�T�B;Pp�#^��ы�P| ��K�*�uE�reı�
#M6G7���'}�}0S
cmL�w^�ia�e[x ���,�����Z:6�
�Dp�Q���V��:�^�"��<����r�.��BE�+W�D��м�Qm�ahf�i���B��
yaB*�P�/�n�ƌ���O�q��,����`]���]l�����֮�)F�{D�
���?�8
���щ��q�?�VlG�}�b	�������@G���Nu[L�QmM�
��t���5��o��>�������{�4
��KS��wL�o�{������&�_|�{Ãk��r�T��ձ����젻�&�o"yX
w�&v����#O�t���n%wY�Ot縃,��q�`���q�����q����!�����Rw&�̅�]�Bq
����yC�d=	��1h�'���D�F��N/�4_��6i�GI#B�M(c؎��*mk�a��hqM��;��ˡ]K׼�;�w0���޼�M�n��&◡�_�Lo�����Q�e�E��麸�_���!���r�Aˮ�
4���	��TӘfx�A3 ]���|��>�1>��ǀ֩ j�
��!L'��0iT�)2��&�* r��BE�Oܴ����#r,�U�8��"��������
 <C���p]qq4QE�t���PjѶy��&.a�R ɭW�>]I4آ�ժV�i��
M�5��":����}5�X D�
�G��;�(vq�<T�bk��Am<�)�Ց�J��KI����	�VE�nz�/0�Hb~�d��@>�"\�[n�6Y�u�_���Һ�}�1��b��rF4g:�)�c�ܿИ>dj/�4]�R��pL�Nh���I�2���""u�Ln�2��y���k��J-�+�okWW;�]���s�����V�8���I)����=�aʌ�����,֫pI�L;м)
�j�IC��mֿ�!�.�����͆�(h��i�r�IS�G���p/��H@ĬؕU���H���qQ�dC��0�o��Y�?~��F<�6�&�N�Y��H��{ٜ�0-��5
��Y�
�ҹq��in��.{ָ���L�GF@=���"�y�$�'ĭ��3OI�Vf셦c�D��N���M?ǡ�o��@����#�Ñ:=7&�yI
���U*�8���R����Qjlun�W���)���r�M�Q@�hw6��o2��=��5B�fQ�����{�d 8'�c�r.V�!�DP6���;A�ܙ,�5qv��93]&�Q�4_�o�8+#	�co�}�qq䀽�^2��r&.C��F‘��A���Up�+��F9��n��\����*b�ys�ړ��;΍�!��`����Ŷ�(GT32N�%�C6
`�ZCAD�#"���
���@�"��c�8?�Gm/���E�4�I�`�H_>�i"��q�;���#��ù���9�VW�W[�d��� ��ly,?o�5�{kj��p�[�m�d���P�B�6Riz=�Z�yK�f�x�:sj��yF�{24�Yw;!�v��\;�r:|��8�=�����s ۥ7�R$<5���d�f��gF>�P�u��>M���qf>O�¨����
��\�'w�D>U|(��o�9��!���!"x�#�qďӿ�*�)V��e�T������:�Z܆.nc��
�cC��p"(�HȮ2��;Hi#x������kfo�#+�����}}Nh��z��V�h���Eę�2��[��D�,���׫�q����lu8�S��-<+���ۃ�?����~��TG���`�9��(�����wn/�%y��twuɧ�ch�b�4��Oߑy��We�fúN�:l&p����-�z��$���#OU�M��&'��@
풙��(�䪞��:3�3��:�ZV4�	�����*Z��j�6iu������;U��(,���i|Ӕ��3#�������p#��A"��c,�V��
�1F.��цi����ן�?5���h�~��m�:�SWxФm��?��+�:����b�$a2i��t��B�_�h����T`
K��"��f��Vv=�"��,�0EK��>�	3�H0S�PaOiɃ�/��OЬ���I�\3<�Zl�ԉ�杨���]g�s�=��W����36|���q؟y����{ɍ׊����j��+U��Ps>X��J�y��z�Ի�ڃ	�q�iu�b�sX�}�+����C'~{Q�B��&N�Dw{�͔�Ij�2�7����0�P�1;�G"����OJ��\*�߭����3ܑ�@��"͑��SO3M~F��ů)���&�T7���h܆HAjY�.�^y^��ke7r
�l�C58O�sQno̟��B��m,'U�,&26�L0��d28#��&�Y�g�rH.����
�%Z�&
�v�R~��#�0�*W�?�Hl��msڏk��vSu�����D�b�9���YT�L���ѣG8���^M�~��]�Xs�Jl�����K�\Ei@q����K�avm�AH��*	�ʰ<�YP����q�k6±�)а�����e
�&������y𤣶c3�`��p��o�M����x�`,��6�m]	�a2d��,��x<GI�FS���?Q���h08����/
��٥�p/l��JQȕ�͐y y�H���Xj���Do��y����䢼̫�œ�Rj�����;k�r=�EC�%�6@�K�U{��ҍ�ҹ�?�<w�fآ�S���u��`�X�M
��Q�c�N6���W�}�5����%���ot�.U@��`a�zO7S��U�(�&~McS6��q�LG�J�u��I�\Z�a\��xp6\4v�͸5Λ�R̚	=�/�������w��
�o��`]�I�&sm:M��8>����;-(H�_���E}�궬�$���׏��'ĻIf���$;��pg��e�/�6^�.�b��:�*c���9	Tg�P$3�7u/ꛔ�F����PKE��T��z�	� pip/_vendor/rich/progress_bar.py�Y�n�H�����tv�q&+�#��8�С���
A��=����c[�f���.���I����=IN"R&������W_=���@�t8�*�I5���u� �Zj�X��<0�>�Gf��]�
][�z�����,~30N�
Kɷ�R�~���6+E��]�qC�>���]��[��x�7l�h�Ի��]�,�|L�?J�H�;`�;&��l��؟@S��w��S�j�#�b����㑵��`{|2���,'��->���ݩg��g���]E���lYՁ�/���B�<g ���b��oo����-���j�**��w{΄�5�{�d�"�E��� �Ľ&NȖ�lG�'��򐙵l%7~�B����hC��(x�ӞM6�a�z�PK�S��*
v��\��j����Z��T��C#��Sg��;��A���}�k���
׭���5�Ѻ�"'>��>��˧�8�=RY	ҁ$�BDy"޶z�U+���V2P�i4U]�m����T�|��)���<��T_�~˿�y7���"t.Fs�?A�u�R�Yw�Tu[�۽T�v����E�C^�� ��֒��{l!�dlR޽��'�N�і�k'y�Bɰ��3ၫ��V983��s�*R`��(b�T��h��q�΃lC$	P8���j���7ak˩ҍ͂@a7W�8G?�'=���=� J���A�8=��%kZK$����\9�_���[��$*Y����J�:�����+�/�,���'�2L���D�<�dA��qW>u����*�c�q���q�P59��I��0���lyK��P4ɏ�;~����G�?x�Fݯ�H���I<��ݳbba�X�*@E�rl��C2�sCu�AS-�i-/�H�a8!��sWDŽ\�����X�1��Xc�v5IB�Z +sM�d�E�7�_�"�nڳ!��L�͑�v	�ș%�M��Aإ�+�JYN�������;ϛ��ֆ��e;��3�r���L��I�	ߥ�,��9(��~2sUs,�1�]F�����*E���?"��&�<
`�I׸`�k[���;�!ݒ���Pl�>2�%J��M���<��HӒcُY$���i������y6��6���%o� ���?���gD'Kai��}��,��2���R44��P�R�a4�7�5���޺��;`ůonR(��ZV�nˊY;�L�����R���Re'0U�L��-�y����B���f�t��J�u�L�+�2���u��}�h��3.�����r�����q�C���
y�g��i��P����NWfQn�����*u<	9�wB('��U
�q���U,��1ԫ$�W?���
�,N�M��X�dB�+!$���#1�,�N�B��|��Ȅ�t�W�˟5��0��g��;��\��JfO�݀��&K7�����P����@�rҐ�f��.JU.U���L���^��1A��U�QsO�\H�mN��+��ԍP�J&�@%�J%�}f���Y�J�K�{۴!�;&J�	�`w��f�.�(M2tܩ����o�]8�/� �-��|�-z��E���㡆y*H��p
yl��{D���U���=�nM�����}k
�F].?j��	ģL��c_����#��R|5�K�8�Z�`��=�[��sV=a�'��B�4Vx��ϑ@Ap:�����Q���;�7	��߾$�{��m�W*dlxB$�긐�a��C��4��XH *m�Mp�k�^mfL�Iř�!�j��|��_Y㩎8�H���	��]�(\~�����du��fW����a�|z�f;g��<cy��2���.��)���`��Tj���4(?I2Q����I/�H��
 D�@��|ÿ����a�Y��D3���#3+��N~���a�X�"g�c�y�;	Zl����B�q�[����Kҽա�>�\��Оo�ƥ;sݷ(?���R`eW�o��l�c<1��D�n) �F5Ѧ�����'�x���Ÿrd/����H�`�Y
s�����e 2Dv�B�{^�]��:8�PE^g��0�S����_��zI+��E:($�'Uš��_���D�����>�S&S�y9�)t<��\�?�Ƃ1V5��G0�!9Z�(�
!���F�G�i`��L]
��>7vЗ	�~�_�Jy��Z���z��������P�D�c9�(�8ʷv����k�p�x��@���{����VȘ/U5|<rh�����i��=�a�ǻV}�������%��PKE��Tp�Y�
',pip/_vendor/rich/prompt.py�ێ�6��_�j_�B�$y1�i��il�	�l��0Z�fԑ%��fb��{o"%�3�d�ek�%���S��@ı��KR���=��G�2^)��DJ���Zڤ�=�(^���c�~�<%�na%%�
�MG�ժB���v�D^t��5L��'��[�ެ�Q�@<l�z��M6�8��F����c��q^�jU4t��y�y�㋏�<&��OE��Ӂ���8��>�YC+	CC;,���
m��z���I!��#u[��#�]��^b��;Z�+qU䶆��(�0�>N|D��LG��o�rZ �M/Y�� /��hÏ^#�T�v\ib��Ʌ�[�����"y^����x`M����dB����ҵl:!3s��lqQ�1^i�r�A6��L���P�T�w�c�-{;��n����d��80.u]��(�؊��H]L
]pV�����ޣj�n�&z^IW�Cp<�j5SV�>�C߰!�mr���M{$�CqB�u2�M}@[���b0^k�0�4^����˥�
�\6ݞ6��M���m�Kﻮ�h�ΰR�>�h38Ȋ��#'1�!��݌�ރh�f4�9��6/�r��_a��e�d [�{>�Z:������8Fh��Z�삗�ғ��s��>@��ۆ�1�V�E��GILuӰK�hL��p�3S�58+��qi��֍T�Ġ�JV�)��XU�G�xM4�ZJk�m�V�;D=��Cҙ�LAO���oӹg8�jg0���^�3,KsM��z��4h�!�B��ȩ@j|}c���I�q������?(��r~��z�c!M���c�x��
���"��1��֑}?�ʄ�����9��@�N��0�BCm��
6�J�2�Q��2������ۊ��d�p=	�h��/c�RP���A 8��Uk��H�WE���8�|2�,��΃��p�O�~�������B�,���D�y9TP^pQ@�
e�G�r1��|l!����t]�ު"�4�@�V~.T�G�/^��nXK����]��,cke�����ǔ��
���X׊�J)��W,g�UJڹE?����\����
H��U���6�8��Pńd��h�;��
D�8`�iȾ6�;
���HC�����6�C� r&��L�άY�
v�X�{����v�-7�6=��m��Ŝ�&�c�75+]�eP��`v.*X�uO�4�F�A�Nr<�!	Tg�����E1����J_�P�0M\E���)�R�K�L��Y�53
�\A����(C�PR������
�:��+@���6B����=����~�D�V�>�N�=��?���]�$�t\E�;���.
�zF{)e�Y��/��j�/�|�A�|#S��d�
��隬�r�&�z�d"?	eٓ������E�}N8���+_8V��|T;�n�N��ج�0�h���y�����j�/)����M2"rx�Có.</^���`���j�Y�t�X	�(��x_�@ɯB�M�)��.M-��e�e�<���+V\k��!T����ܑ!O�p����V�(\<�S�€^�M>�A���q�Ϡ�$i�ҙfrp/��
�8�����$q̅?�p�s��PD�}� ���I�����lC��Vm�f��R�
�)�$/�pAk��MA9�M�l��BeM^W�����ej4y��n�{0E0�gZ�@�d:��RXgj��W�]O�V�s-|�&k�c	6ac�H��|��WC�;'�6<'N��9`v2+�p�T�`*�3�eZp�4�q'�8l,9UZ��(
䔨�+�af��7q�g[�"f��][<'
⳽���*F1k��b�4A!tG��p�V�:qC�W����S�]���С�#_{ݗ�J�x{?����y���~ߦ�%�L�N�IA��-�GÔ��Hq"'u�F�a�S��a>�y7�����a݁������4
n�ԩ��级�+��1���JK�V*X���+���u��t��¢�p�֕����{~5ﳄ�B��"�O��"?Ϣ>~t�HN:�-���S��a2Yl®�nG�
��I�H�]���]��p9��\��B��fU��q1�������91�GsH��\��?�KJ!z�O)Fj�.�Yr�#���{�"���(
7��CN�hleI�ʸi5O2������v<��T+� �~��H��ωH�C�8x��9��nɆ��|�T�ɏ��\РU5?�R����
�'P*�#!��%�L� �h��W��$�xc�����D��=F�ˑ�
�B�a�6:�D��v_m��Nn���^�p�1AZ�6���(��V�'��r�6����
�▝���$B
��4.����y�ܡ����e請'Sqˁ)Be��Y��2��P���L�5���f��)�=d��`Uc%��8�e����<�ք��D/t��XW�MV_�Y~ڇ���埬f��G�0��;���zb�w�5�
Z��A�Ju����ϋ֠�k&p���(��-c@�~�l�d���><�'����E�	y�!���|�<?]�=0׳*
k�h��yW�}׭���Q4�A`�khW'>{��\DWE��͝"�;�<%R�O6�Jts�mq��.6DBVA@A���PN�(] ��&��5(통��OP��?C�s�Z�E���
AZ��̯o�'Ί��8u��k`K�Nh�	���R����ny�ܼ��_Ι~igX������n,�c^�#t�yE��m�PKE��TX���9opip/_vendor/rich/protocol.py�T�j�@��+�"��C�^)$�IL�'�ʲ�F������wV�,�6�VK}�fF�Q;p�r
b��q�$�	dܺ	�#}}�z[���b�c��%(<AH�1sCج���(��Yt5-t�(se#�2ɔ���NcE���Zc�����b�|�GÐ��Fl�_����RO�V��G�t�>��n7yA� r,�4f��QVb�e*�P�3o4�/� U�j+%��C��p	-v�����Vށ?ų���5�%,���'N�:�Q�@�-w�\�B�|B���>�y&ŧڇ�ͨ�avrָ�ɇ}D��p�5|
�*?8]�>6mТtI��<����M�ѩ�h�!H�BZD��j"Hu=�(}c�r��,f{c�������d���sf�J�%��
��4�t#���� 	���L!$��RJ7R�R�Y][{�	�� �y��������]:5���� v�q%? P�(.�H�m?���2�5�x�zH���ۡ+UN������xJD� �GN8�s�Q\���n��Wj�o��.�	���B3���f��S3�aqPKE��T]®�u�pip/_vendor/rich/region.pyE�1� {^�r�4y���)�|�N��Y��l5���d�QY8���i{�5�1�%�;���e.��`dY�;y�h��Jؓm���FBw�Hn�mN�EO<&�y�8k$Q��PKE��T�/apip/_vendor/rich/repr.py�WKo�6��W��!R�R���	4H
��ba#�6�2)�Tv]��3�([�g����p�9.�ܐe%2#e�	ߔRRRe8-�zɅ.Yf�Rou,Q�lK.V^*
���6�״(�S����0uX�sm��ci��p+��T!i�V�	�r�Ӫ��my�;UIA0%cO��i��	�Ua���,�Mt��9��ڨ��u>&<[OX�`����jMp�F)�������#kj�W�0�#2�*�XN>�� ��V�����EN(Q���@��A	r�$�22�
=j"7C�g�<&oޒzᴦi��MB�XUU#�'���B3�n� '��۠YZ�M� KȱƆU{���vTK'/�2o"{m���L*j ��L1jY,0����Vp�5�Ѝ\"��s�mx��n�= ��*�4+�hY�Bؼ��R��}����Y*��L‹�&��-&Z�L�@�ܩ�m��{�b���;m���f]��X؈𕐊�P�
����Y�P�B�.t��
|I���d��C�L�x�a��&�/&�1�����Ȟ��.�q��� �0��gZTx���
 ��� nٻ5}j��2`�yCk�����DN����:^�_&T����e�w���J�îæ�Ӊ���i�L�Y�?��h��b_�n�b�'�r��)��|�����7�ĎvI<�����Wil)q��SM�@RX@�s密�%PCrQ0���m.��V��]��c?�
�W��=GL~�?�тnl�%1h�:��u4�Ö5�ȱ���կ���w�W��LJ�×t����X��һ�L����L��|��q�srF�f�����������L�s���ᄇ�����!��a-Iہv��!�4��ڍP=yG�fG�W�y���/�:�(Ќ~ ;�evPb�Ev^i6��4dM�u��}r��솼�e:&�O~��M۷�6v�qbKi��i�Aۄ�W����ך�J{�i��
f~��cw�`u;\ǵԋ��׍u
@�.h��ms�Wk���f�f��.���nO�=�����)�����/����1��!�w��Oſ�0��k�X!37�Hʑ�v��R�g���j�b���.���Ovtޅz-K|9�#2�j�������`�)X8�bT[�
=IS�/�����9H���bU�2]<ð$U���0�iY0�l�vK��ƞH�������;�*w%*nq��1�r"����f=��r@�3|w٫���G����1U{MU��PKE��T�̀���pip/_vendor/rich/rule.py�XQ��4~�_1��sJ.�J�Њ U�T:@��C�"w��5����ݶB�G��%��8��{=��r�x��73�L|Y+�s���
R�Ip)��]�i�7"�<�7��le7.�X��loڞ�
43���5�Rhٳ`���V���A���gLtL=czߛq�o��`�
[���K~��h�cT��~�owLm���f\0�Ƅ���b�X�Tkx��I]���U�#�(G��ŸFB��5P�J�_Kah
A��\��^���F{ {n��K�mT�8��@�tо\�'�.�l�C��k���'m׋��pW[��
�k 6�{ֈ.a�Y7Q������L�}&�����2l���eo�[�CzA��YLx]��+^����R����kk�Wm�.�h"ϢgkSTP�P+L�/��*�lM1�?Z�A��H	ږnږ�$�~]�U^¼�� L��W�(�󭬡-B�!Ct�w�1�U��		�V�Y[��mMB2�Y	�_�w��([����D�%|	��^�r��g���7JIE�U�ȳpTm��ka����a?YWp�;��CM���.��L�ril���"�.ߕ��+���Z���|U�n�Qt'$5zb	�q��?ʳ[�[��~24^;�R��M"��ȷi㕒/ٖj�$��>g��'�b�Bq[#��Q̛bf��7/�D�aof�m�Y�(�ڶ�4=j�0f��m�;[/g��(��Yz�4a{��7�{��L>���Y�9t�iq��?M��s���� �m\m`�5F�!T��Q�{J;YrE�t�����о'Rud�z�NX++^uQ���4�,��f !jG���?`P�oϑ��T��/f&	����S�
�ĀH[�z�j��Y��֎�֎32�W��9G/�E�k.��b�H�����J��M�*�OL�[v�:��+��V�C׃��vG��,��CO�-�<BX��A��
��8������4I(���+ֵz@�hS�v|���"�ڋ5�
��}C>��3����?|�ݾ����߄��9�m�q�G��犩u/�����u�SԼ��"!OS/�K[�p�~�p{��G(i�{x���+6�'p1kX��H���i�S�j�(G���C�\��1���@b)љa�AM�+�pFXl�*y%ޱ5�u�!�"���\�v�c������
����S�OfA�O�?�y8M>�ػ�x�ܝ���sk��?�d�~4�윬��T���*���fr��a���q:?mb��q떮wOg-F2�s��b<�J�?\��>��2��ptN��Ee��b�-Aw��I�mwC�K{����_��E��O��}$�+����B=IU۠n���wuH>0�G��������K��nVl0�-Wnܿ:G;�'XY�/R��?R�M�G��y=(�q�8�7N����as���(�J7��?PKE��T��`=tpip/_vendor/rich/scope.py�Vmk�6���bP�x�kn79�[p!��^)w
i��e1Z[��U�\IN�����$۲w�!Y3��gf�֪�R	�J˕4ݗ��Vi�i�ryX�NǞ�z=�yW�~�����/?�p#O)��:T��ص�-¹��G�����k����+�T21�ܻ�A����Q��z��{�Ơ�� `/v��u�O-���y���Ε���&o�����bQ���(L�Z���~�҃�5V{\v$��o�?˭@����r��$Z}���^)��G�2���-�X����

})�{�����]8-�C}Kk	���"��=hO��$<Q͝�`�@���d�FL8;�I�r7�_c;JK�t�(Hڠe*+�3�h�#
��[��,cNA��O������E#ؐ80gV��T\8�nYc��\m��Y}�6ԨE��ܦ�g4k
	if�3}�M�@/�{�6�g���~���.<�=�"�j"T2�t�۠��?��}0Vw�<T�8d^+�w��l�夅.Z�5��@�"�eC���S6�ω(Y�	s%.��U���U�Ҫ¨��]
�e
�9��}�.�f�\ �v�L�v����eH��o>*q�����=����I(�E0��O����=a͵���#N!���%�
X��>��t��]�D*�42c����cB��`�nW�g�Y��O
��X�����<�^O�!~0;����G�ъ�n����s��5�5�}2k��� ���&�E\�e�0߹A9-��;��Tg���z��6d0w����{<������RqFM���R9RN�������r�vM�^���jn����<��7n�7�=��/E�#Q�l`!�P�J)��s��7ȗX�
�7�jzh��Qc�����-o��J�L��8|&���
c��d�-36���@-ő�Sݯ�p;��--����{ĸ�8mW)�S�Jí�i��o| ��
�PZTd7کx9��Ϭ$�2�ט0Ye+2/i^��U�L�|����.�԰s�j���n	^��a)M�\(fܲU
���j}�;3Ľ�Շ���&~��%��ξ��B^�,:�l�.�ϑez��+㫲~�]]�ګlu��~9+�PKE��T?5��R7pip/_vendor/rich/screen.pymTێ�0}�+F<������J�۪Ҷ��Kխ��:�e;ݦ_�6��!���9sf�^�3ثbbvVR[��,����?��7����_���b+C�3v�~����^9]\���hp6\J5;���c�,c}Zj�>>���ȈY8�����<}�OTtT?Qs�vk%'�0���(��Cj-R4��jJ�����%�H,�s���I���z`\�A��2@��Ԙ*s(wz0���
�H��p�V!Ւ��.�K�av�6�N��=`WH�%T��@���ؘ�K�!O鄈���4L0�4q"��>
�.˜[�2m"��t�j�.��8k�؜e�Y')9�}"܄����Ң�n�SU�IH]i֎��rsϒ^��XjP��ڥ�~�o(um�c�ִv��~7Cp��a��y�&��)ȣ&���Q�W�ٱ���a�H,@U����M����@m�lEl}x�WJP����f͛PaU�:bi��	��E�9Ԭ�Lg�J�5B�q��
�ҷV���ꣾDʷ�Å�� J0E�)S!�"諣q��E��<�w�+Nǹ�\D���.���&��i�&WF�.qbr'>$ �upiRL��g�PKE��T�^`-/�^pip/_vendor/rich/segment.py�<is�F��+0��h���ˊRQd%Q�,�$y])�ADS��h�;���}�AR�'�dU���ׯ_���y]-"Q�Q�XVu���1�ܛc�|U�ڪ*U[ԫd����筨��y^@�<-	QTwwyy���D{
%���j)괭jU��m
 ��o�K�q��w������G=9�nDEo�Y��@����4od�Y���j�jΗm^�i��.��D9�u��z)�zW�ho�DŽ�g�0�f’�I �	�&y��7ܜx�qy!JY�q'���Ng0�l��7Xi����Z,5�.D�*�QT�+$LӮ��.���^>w�8�N�Ȫ��L�#�9R0��Wf��^��@�сo<@2���Y�6
�n�@��Rņ��`08���:/[]4cP�7M�p�HfiQ���N˦H[�Utxvy�pc@�G��9>=R^ӏ�Ë�����wgP����~���N�/�ןX�?����<Dz?3�ɛcS�*;>;���89<�J.�.�����:�\v����"ɻ��?�7���+����o���]����_U�v���:N�Γ���wo	��X�c=�8�<NNΒӓ3��k���U��hJ�N�N��/ J)�#`8�I\���d<��G��z5m=�$�@L�ﯵ^�C�S��n!�66�mT�0Z�b&�j��S=��}��Y��Edc����ZD˺�V3��5�J㣚4�g�Mˌz�&����b��~o��uFΠ�?oE�P��֨Q��/r�?c����a��#�ch?�D�8���:�+&7���a[��ߌ����C4��%[!�r��(��+�����s�T�P$�1`5B����8����� i�w�`q$�q���X���"�d��!��0E�"��Q�0�lg��
5��a�]ӯL�m��F�a��+�T32�GN��d��8n��m^���Y�:BLc���s!�U]Z,�{�0�	����Q�Q�kFZ0ԙ����U��	��z�1��i$�6�$1,�X`�]��̸t9tC��/�/����᫉ʪ
�y���A�འ^�$��-�9�h�#�{1��t�95����4/�/[4��&�<�����'S�e�_(��&�4��W���`�����AbhZ�s��ijI�$Hk�F��7�>��}�U���N�<�h4�j�D��*��Aa;�rl�ڪ
$F_�m\���#,#�q<�d=0��)���e��)����61C�6Q��[1�jĎ�@1u;g���~�\���BÎ;֨��;<�� R���tK+C&�����/
\J���k�U�����T�x��&��Í||/��O��>�_=���	q�E�z�G��k[�M��#d\�C8;l���뺂)��R@�c?݋Z�8g�0t���W�k𳗈F�c�ۇJ�@Fٲ�^�Y>�!-�U�jQZ��	�t��e�G0��gIŋ<�
J����?��SDک T	�u�����\�)�L�J�Mq�Z�>
B����rB�o�Ǵ-caF]*)��B�gqaS�_l_�|���Eߦ
�1������NͰ�cz\�	�z��hԵ!DŽ'�.�4BU��G�9@T�aO��R�(Ov�������Y��ֺHDQ<��l�&/���a�afHR�&zU�����4m0`�u�dX�@�C��4�b�g8+i1�@��e�e�AB$��~D������on�x_3^�6#����s�6C�X�O�2L��T�M��ns��^�BZ��o�F�	�1OaAX��.
Cjϥ;����.-����}��m�4�E
"*����E�&]
7;��&N�Ơs��vq�|e<�9�$I�,I<��47��ȍ�,�:����?����&�)���l����I	�DV�&��^5}�G� �;�6��(\�_cj�<ů'5��oK�������ϼ�'����⚭��&� �oiK�h��~K��$h����V-H=����X�8a�ݦ�Lx��t�8*�wY��"�C״H[�Is��i=���B'Uf����^oN�X��ٯ�|04�5��]�qц�vl���	��bCX�\�]"�2�����V
N�S�g ��8j>G]V-��ӆ�\��}0ʛ�Bdv'?�U�.��TS�;*"��1t�K��$��f9(�2�͜"��;`���^Ți	��6f~���;�G�Ś�r��L���x倖��SO�a��j���<�����xe�B�n���*l�Xt{�)b�Q�&��9r����蚳5�p'�w���f� �dVWKi����
�.=z
�f:]�+�&/g�*��O�{������! 3�wtW��'�0/H���#L�y��/�)�&��P���N���s
�E���c�:s㠻��F4�BZ�w(ݚ� �B璖k�Q�қ6��\hu\Ҩ$�������
��#v�097;G^��zl䎜ٝ%���f��o��c�Y�Sw+t��*�����Ձ3X�u�6��q�h�K�%�kw��?���G̐2�H��	����DK»o#�(��ƾ��DZ�������|=q��g�Xl��ƅ�
u"��~��F���]�"�).y�E ^+�Ib�ek�pS��=|N��I�&!O�5`/�5��d2�8�݆���J/�A[5<�Gnh9�֠�l�umK)���L�
Z��Ez�Ż�x��W��t�r:C�nbN�a���#�Z��Ĭ-��"֎��|�"
62F�}�K۞o�
ٗQh{6'�tM_a�a4ڏ�)�E��Q,Q��;��|�⡷ݑ(<¿
na�Ru�H(Ew�ʩ��;�v�'�ɾ��K}��ޞ	��v=t�P��.;-����љ�jD �M��T�M�4������ذ²A�⋂���l��hq%�������i�s�n{c �c���7�O�dQ��^B�a,���S,��������7�r��ʡ�l���Z�*|~��p��îp�\��t)�D)ji�U�3�A!�(��Q {֦O�����:���УgEN�`a�l���@��{���
���<��S%�TC/�O��p�w�[I�DI*���_lx����FL^#�V<�����>�0Pԥ�22﬜1�	��1�XvDh!��/7��8��Uİ�~6�t�4�ٺkT��I
�I=�|N5���)��*V�Z��^���Z����D��A8�̄�0!�\����4��#Iv;%��J����8Qɖ�?���mEZ~�lZ	�i�Ơ�6{�--�o�M��[Y!��d�����4�s>7��u�T�3�4*�!:$�AV�C��$a�L�C��T�D0�\Y	�E㰳�hWo��]����qo����>�߅��lt�՛����X����S[���j�j��|����~������ޱ��$:���7J�kp5޸ߣ(��'\b�G���f�
�X��
7�g�����Hd��k��m�Q��������_��1��n�4�V݀���v0�KG��[QT��.�_��Zu �ۣ|�Rޱ��)��^���g?�s�]<��4�bY��ό���zi��y��-�…�nU���&��s����S�F�Ts�H�Ҙ���^�QɎ�C�����o�8j�G[�=G�6�u`��\���O3����%�
�EȺ_�U��R�t��{���'��V
�|4�����ƾs"c�����yo�ȓ\�m��`l��s�Գ�l/Ă�mAg>4|�ɷad�sNw�����9N��:J���E���M�zT�S9{[N�"�|�+𰖸�2����1r��e����#]C}1���mU�?@{qX}v��H�)�q�s�ץ��a��G��-�|X�A=���ȇ���Cd�9D��b1�"�z?�Ǐ���ޅ���ķ���w��KE���r�D�~Y�s��nʸ�z}J��2�Z���H�u�X�!��`<���N�B��=�?�x���ʩ��93	����.!�8��𭧍6��X���-�mZ��h���X��n���������|��p�c�w�6��L�i�9kK�q@�����c�GS�U�iNƊ�Fы��;�x5�����O@��D��M�#���Z8�U�Wfj�ɬ��*@W�uJ��>2�>���D����nn��0�V>�����A҃�h�(��Z)4_��M��Ҳ�g���1�B�DG���"��X�q�՘ w\a���X��`,��
zA7h��9���H��0�~�ß5���uV��,S��P����0O��#��e�]	���|��l]c�UG�P�9
n+�J_�]��h�r���U#�+H�i�u��RP����֍"H�| ���׼䕝$�8G	>M���&�|���a���!M� Di
7�l+�g�ҕ� �D>ZH����}ʢ��3T��X�"03Bs<�鼜�y;�G���$���G�)�OpL�7�㴞�P����Ґ�C%O����N��8�5SK�MUQ�m4Cs:��Ԍ& x)מ<�1��1O�Rnj��ǒw��6M>�Z�f��"Ç(��J�Q��36��Ҍz�8�,ס��P׈��wTNJ|6ɲ�t��
��$:�g������
0"o��gA��-V�d&�����.9q�>����V���e�$)����$Y��'�`�/'-��n�Nh;��(8���|9N>�zLO����РY�I}�ӯ
ഢ-���uI���Ӵ�u�j%��@����a~�7F0���j��l�E׷�k�ށ���.����
�
ۘ-O
�gJ��U��K�]1�WPF.�դv�0Q�&�K
k���V,Ջb���|�N��EGb^ֵbf�
0����j[h^��x',}��mŚ#�(,א��%�d���{j����U4L��ii�T6�~yA�xp�O�
��|JdW�3��۽pǂð80G����f�z��K�n����Y� ��[P���5+_8�����=�7��>6�T���&n�Ue�Ž}(�~��
���P�4b�Pq�
��Ѣ�PKE��T�B�rJpip/_vendor/rich/spinner.py�W�o�6�_q�0L�\�ݣ�`�eA�>�A06e�)�����ݑ�H�N��8?$"�w���+��[�� �m�-���Sx/�ﯭ���~��bo�z���)|P�?�T$^2��Jhӫ����������{��A����_��@~�EO�v����DV�)�	��s�e���_N�P��9Զ_ѡ�VD�=e��p�ɺ���w��0&����n�~F��tX)�s0V�-�oYjBȲ�t>�I�!,�l0+[��M�D��
��CU7�"�M9�^��X�k�e��E��{N����RoM`a�)�pC�M5h�AA{��F��=h�ޕ�(-.�y���?T}	z �m`#M[�#�Kv'P�vg�hZǣU�h�1.�׼��E	?��c�
)ʲ��|���
��<��D+]�H/Er�T�#T|mQ-�~A%�-
��F�B�N��n��+iԷx-JWsh)��L�AHM}��񂋡��t�j`�k��`M"��W�j���3��J��I�]�8�Y�S�b���ɓ�h��2f{�?ڜ���!�T�r�noJY���:ZZFFT�3x�cN�D�մwb�y�lU,�TV*+��{�.ɞ��� ک-�r׼��}�Oi��<"�l[�t<�S
k��cV�RNvh7�
�+#����Y�'0#��q֗�	{Fg�����TG)�7�#D�Pn����(N��Z�f]�˂i��m�Y-�A�X�,�N�:5��&o��	�����@��%����I(��PO�!n=�J*tMޘ��g#�԰��˱k��1��|<JX���z��3Ճ����>�	7r��j,S�ET9�!LZٯ��l�Kߝ���<���f�&K< �5�
�B�� �b_D���������^R�g.nd2��K>e����S���_56j
i��u�L
=�N!���)����8�����S�Ga
 0Z�� 3�A?�.�<[n���-�l0�o�S�iL7���Μ��D6�[{i��?�2Ϸ�/
���'9���>qX�a@���@Z�q�����|��(�l�LU����D��ߍU�A.��Aɹ�^��1XxLqoD�h�d������l�5��o�|�P���I����Ŀ�L-D;I��a�Lx\�e��r%�|K��Xc��i���k�,
o�E�3��2�{p杄��O	�D�hSb�7�l��~�"��(��5`��GB�O��Gq4y$�
��/�UR4@"L�x�h�kB���9�����"h��dt�A�}l4�,�y�"+�qZTZ�k��M%�.�]~H�O;�iF��R�"��J�?PKE��T�(1s�Ipip/_vendor/rich/status.py�Wmo�6��_Ah*������ېà%�-Q6;YD*�����,;�6m,��^H�#�#qGt?�Q���d�����Ek�i����w9RZ��Y�YG�е~�џ�oȈ7�xŷi82Z����W�L{#��G��;�6�98�{�;�j�;p'_��u�9�/XL<
�e�O�$_(:|�#���Zc�F�D���1�� ��=�$J�j�r�$��Ƒg+te�F��R.F6�ɳP<׸�Y��,��c���ڒ�r_$����-�	j�Ƕc�Y�}!-�:����,�ҩ��-��Z'�QB����h���&)�M%
<92V鬥._�a�5�<��|Z�8!
Jێa���2�����b�K�:�v$|W
�m�.������<�h �1��P|*l
�bjH����TTU�"]��Jl5k.��6���ʵ�)�5*U��yFVH�div����
&Eg���D��b	���� �%�UDBaz�4$���*c�碲J�a�T٢(�I͗	h�R�Α�-##�,��WM�R
4�Z���B-���o�xLby�)V#�9%�(��)��t�4�T���w,��f�ݏ��U�M1�}L�)@�GKLQ&�W3qGܘ��֠�A}����7R^�Y�DRn7'�`��`A^j/�2q�w�ۅ&r��M'{�6�v]���Zɉ�V����5��/���lY�-8JO�9򴰡�;O�P�������[3b�ņ�o?iO��K�j#�%�;���7�mݑ�����-�����3�^�y�V�2��������A	ua'�g���܌w.F�ق#j��3�v��q�I���T�g�}��8ܼ�Q�q}4b�亚˦��q*,ŀ��`�Yl��l'-`���U�H<ݖ�2��	6O 1�J�~�VT�����y�+yEf���3���皨��u��@>�AoB��>����4�T�����P	����c�WU�B�4�x��+5�أ=�%ݻ���7J-a�J��p��j���K1M�x	��k�H�\5k7�	y���$C��m�)=J?��Y�m��F�%�q�(/_
��I�Wj_Y���
#n���m��z+��
��P�Mpb��q�K��>����K�(�ݫ��Mp�y�_^� 1P���F��P�g�z��6��4므	��rc���$>���6�e
J��ּ,�']�Hױ�$<��^���*���"5�mGBzW>P��Tׄ�v��:P�PKE��T�(:Z�fpip/_vendor/rich/style.py�=ks�F��+&ܪ���<�~Ėíx��NJ���JQ�9�.��ju���1O`�Pr�֩Reb�����3��$�l��ž8X��F�v�̲�1�$�n��k��(/�Q�{��Ͷ�$��
A�K�G��S���U�qz��^����1^�c�yt�ȱ8�x�i[�Y%cq��B��b���h,2ϳ\��,�$�u�|�??��AU�ž(�f,�h���7
C.���,v	p�Nj�;0����y����<���g�����?�}��l~�/�>�(�K>8���(�	��e�.d!@B����\�i�C��\�lU� ��b��et@�\ČsU�0���ITb���<9�7^�b���Tf�V��\�RD�tT�y|�+����	�p@o��E���|��Ѕ��X�N�v>2Y���y�� �#��]�J��3@t,��^A�Ȁ%�+��ˉ=���҆+=P"�5��t�ڒ�W��dc����[Çſ\��<�W��⛙8:���A�?Xa����°�'<�j�X����0�0-�������n����<ہ��ޛ[�͑Hw��
3��(v�5�
q�%˱��(�B����t��:�$�`*��J����
��\܀^��l���e���z�Z����P
�H3�W@Ǡ%�z�ma��ª�-h�5�P�;:�E��2B+�r"~��i�:�D&���[1��1�!j���4�5ʽ].�M3��B�&����B#�y�����
�}lĴ�~4�M�yZ�5�-��$؀�4D&X�	z�Ș�!+��c�ع�\�6ޮ��c�Ж��&�?d>Wy�ia�����t狤���ƕ}�RW
э���(�g��,��ҕq�
��� �K��Om?
�v�%{ɍ��r:�Q�vA�B���D��y#������%7��c�Eq�Y��f�c��Yk��K-X<!Z¹���N�׀�p��A
�w�n�6���8�:��v|%x�
� �;��<�c�1<O��)<?q����S�)<?s����s�9<�<�/����y~��=���g^��e��|�ټg�\\�������?��<��=�38��.mh尙�u�C�l��G�r���f��n��B4��a >���v�t��(������Ю6|��?�ކv�ܱS�r���v����
a�k�����ӣw_�4��~��b���:�������Ys߮A]q;����>/�~�T�(|'�m'���NHR�~P�N0���pJA;�X)����C��N(����Z	;+RF-��T*f+8�~��+:5�ĺd��+�U���UJ\P��d�=T�_�y
��9�d�JąNF0*�"		���l1��ݣ�
����D|
q�
���CGk�niģ��*�������Dk	�5 ���F��9mO�`*�B>�Cڠ�
���1U�y��$���w����꘧��4���jj�z�׉Y��ώLs4Rc�h`��5N���6aEm��^V8�:W�>O�|E��!��[���y��:���*I�i�Q�H�h��H
�ɚ���6U���u���P+�R�H�}J�z�խ��N�Z�Q:�h-�F㴖5����`��{m�G��V���tF1�At�w*�?<���7� }z�h@d쿏���������`��Օz���@�%;�*��O[��؆�8!���аΖ�wE��ER�9U�gkP���\F%N�x���8�;�S�ȴ�������&˥��|��(儻ƨ����������ZO.)�5/���a	x�;4]����rן�r�4�<#͜�����9�������2:��$9;�9Xҟ����-Ń&$b3����;�$�u�3���� +�m�C��X�m��
`�y���ַR�jD�.�Q���^���HU@��P�r�tu��ć;E�ZDѵ~��!��vw�����ʨk఑.*�ڰ7��a����d��w��.}��fMh��nOU��>:hv���5l�	xO'�ӭ�7IR�jg��	Bb���~�6�D�JZ(�!"b7^|�����9=9���׭�^�uj�H��{��ȭ<��q"�U�?g9���nF���K�b�D�k]k�ua%^4���J,ËP)��}��v����û���r?8�P��,A�X=�H�0�Rn��辦����~�x=m̨^`xįal�Z��EE�qʍ6nP�O��F�@j{�Mu�3n��j}έ��W��q�r�U�
�K�`�]�A
�8�]
�8�}��m���V��2Uy���-o����*8`_�Ů`M��t�-yy}����O����R=��oe*s\��b�r�?�ҵ�CuWW���|
kut�����ne�J�P�6�-�c�Yw�� �V��c���A���!�O�����p�� R������,��&0� ��L
]�a�(�nJO:(�CC̮~Kς��Toq��G�2gO;8�;�N8JSI��xև̴BgZ%4�A�y%}�dH�]��� �ľ� ��1��Zb��؋b�D��R[�%��uG��Q?�y�W���������i'��o�"�*K��{����I�!e,��f�z�ڏ�	�!hL�%h�2Y&ﯳ�u���?IAf
���N��,
£�еQ���F
;�G��Q|�;l�!���_�8Z�9�x�
B{U4����e���Ϟ��}`��
�����?*
U�E���e�:��0Bg=�7��o*Ti(��T�{��6xc�)z���-�_9`��w�1������%�+��+x@�@h9V��vZF v����ï�ct�<Ǡ3V��0�_^ያ����z�l��x��}����Y&�������l��qdO�"��@��/�'=�u�U��������XP>|:n��!"C]���Nx�N�At�� ^��q���?=��X-\��KY�\��sz�GKu�������o�[��C:8d߲��Qx6k?��� `]B�N�!������Sk�!�����2�D_��or��x#ckR��$��98�-�]5hT�ihs}±�E�%*���<Q����|��J.J.�7��gP�\�D%+W7OL�W)G\套U��m0�V���.�}��0�U��r�V~Yȭ��3!�b�B7s��F	m��I�}����n/>�Wq^�<��� +����>�|����πFP��1��W
���"T]���mm���Ղ(��߰����-�\�^&���ȕ��`�:r�^����&��>����Wǀt����VQ�m,���˸R\������H�tu���Su�A+]jU!�
�Q�n��45�^��5��^����n��!�iM

<��P'"
���P?�C��
H�1:��V�B�%�E	rG��_�1��dOB��%^��s��|̋�x�e�[<��i�f���y�0�sഹ���ka�vFU��,�<�O�5nie5���3��]uy��(3s]��n'm��&(�݆>T���X؊�N���LA�b�3Sxs�Z��E�۠�\�{x��
\��p�j�ΐ�Sh`	'#��7t�o�Yw[(R�S9:2����%?�f-�}���CU��W1Zo�{ٰ��j!,&��I\`k���PƲ:1�N8����db��73���C4:�4L���ô�!�o�R�]
�
R]�2�+�e��J�Q�W>zujӼX�_>�QWۇ��Q�P`ٮ�W�KH�|H�ȶT�a���QǛ�\����W�ت1�S)�P�k��hM5ո��z�%���g�:����Z�W��ݥO���)�bE�
qU�	o�:�
�*};!�vG���8Aj5����T06E�⭻��@��p��)�V�+�@�?�텅c�xU�T��컹_yh�b�LզNM��U�
|��3t�^��r���h^��Hw���5v<X��+5��zX��6�K7ӵ"�!���mP9�ڄ× u�|P�.pa�f(K�h\aJ�m�1�z0s���$"�
Z;�x[ؘ��ף,}�U˶�?�nr2���R/���� d=��o�W�o�']�.3�u�2�M~Oߟ�����Q���z%8(kI���]$�L�T�����F�Ֆ#�DY�!
�o�o~����T?��	��hk���A�ͣ.���kc�Zd�o�����ڪB�B�Jym��Mu��VTU�+�B�$~*�J�(D��/�ߺ��u��T>���죎>L:�v�	��C�\�ͥ�:$�ӏu�I� j,�P���>���_K��5�|WI/��f�_�G�S���Ey�(��Q��3h�ؿ!`�X7��$���7�����cF���=6�a��B�t&5��=T��q"!L����+V�6/@*�E7/���n��ĆU���L�`\�M�5�wGζR��G����j���;�d-���1��x	�s
��x߿��g:�Ƹv����rO�!�I�`����2�]�'��P����}��j2k�ga��-�Һ���c���.s���@}��m�t�lCm�x�ls�p�6��@�p�K��>��i�L�}uǭ�Z���\pO�i�z_���:J�9W�R�j�6Cz�^��2j�:��e�C-[%ž%˽͊X���w,ԝ
��!�Od-����L⬽����b���I
��K��x�S�ܿ��5��hTņ�ʋ�c2��+Ty���9��a��wRҦ�[�eTs��47�1�P��@
�e�ZI:�w�q�6�|�͹F�VII�W���K��U�_#[#�zu�X-7�[Vh-xdM�BG�R�t����W���?i���k�����雟�~:w>l$o��~�9N��炿�G��U�B��S.�V,�ǒ���K�$�a�1o�5N��:(���[<��� 2�LPb���B$�/���d�X�'(�Ȃ�@�S����a���`�k��^����(ɋ�/�7Ww��~s�����15ZC���<�U=���P�����W�rv��x��<k��r�qݫ�^q��U�yl�-�:a�)uֆ�b����&��sp�x*�J�æ8��2٣���;Ju�n��tUW������=�I�P�{Uy�z�����>[�-xI�!���ՙQP��$��n_���e�+'�QWߩt�s���TWvf���r�f@YI3���N��yEv�n,@z���[�nDs�Cn�Ç�Nw��j�hV�o�����7�W�&���~U��M�H������o�ށy+(�^�oG� Ԟ��d���w��4xo���ʿp��JI~�����!��g*�Mi$�������F���\睖�²7�[�*�W�K��>�/A�UC��	��#Σz�[�;l�kF��'$e�P���`��gS=_4�����PPu\z�q�2�I��?��)Κ �G�Z
�y�J~���<ҝC����Ƣ�]�!���aS5�CO��ӈ�lk+��Hs�u_=>vF��k_�x[���D�R�qт�s\�M69�j�X�]v��n�]�4#�$�rۡf�6�bL�Js�[�2.Q�Y��[�ǻB����S't�JN
l�98乡��N�PKE��T�
�P��pip/_vendor/rich/styled.py�T�n�0��V�� Qi4����v������	L$H�����o�T��S�g?�1�Q#�Yك�2^ߞ������LJ,�<�9�n�G�_4G.mL��V���vV�7^gͳLt�lu�CN��6��2�i+ܩ�g./�<��6�h���!k6M���	!'���.��Ѭ�*[`'�OH���|����$�?�0|��IN���+�/�Z|����R!��4��Е	���EJL��R��;xT�o��@UR^�݃Py�aSIF�W���X%��F�)��v�I��%���M[����.�D���
�sJ���
X�I+7��j^�)G�|��ތ\�|�]خo�]���QD���۸X*nԡ!E�,*���N"4
JG&$���ڰ~d5H�p�m���.�2��4n�6���U�I>D�7�gx߄}�ON�|)J J�ps��>K�p��?PKE��T�y�y��pip/_vendor/rich/syntax.py�=�r�Fr���#�'��K*a�BK��;IV�t��ǀ��,����|~�<D^)O������,��R�D|��������̖�m�Qӥۢ_�����~մ��
u��;uۋ��m[l�Vm����E$?�~�4��o�E���Y2L�ߖ���Ep���n�����^�-�+�O/�N�]l��|�U_��eS?��?�D��I2��[y�]
����-�i�A�˦M������.��G�*\_��!�NA߈>�7��>��$�ى��/�����~����PU��C�Eo�gzq����QM�����i��oL��m۴|���E[.��b۴�a���ns-Z5b0��*}ַ�rl�Q�}�.{�m������O���^7�Wͮ^F�\���6�%<u#��b�4��
?&��Y	Xt�F�l.ͫ��*p��An�^~]4U���)>$�x��ۛk
Sw�0�O�1Q7��]�n��j���V��ZD�Vt�J���n����?�*?���؈�۵��W����� :k��D�t
��҄��l�0()�9��p#D���i�Di�^�{�ٷ���C)��^lf�(ˢ�]	�t��GϞu����篞x�i��}Q�GG��VMU5�8�r:���˨��u�o��G�n�~���o)�n���Ѧ����%�T��{�lJB����i��ѦY��rQ�pE��Kqtt���E����ߜ�����t�D��^�0L�~;��3C} ���[�K(9YȲ�d��N�_�7�ض�©h�/jU����u�D���H��_ݦ�l
�b#�rWV}YO�H`_��R؁�i���ը�$���@�d��$U��O�z�q!�ļ<��3BM����-Q=:�Z��jG������ ��w���yq�B[ެ�����^�,ԕ�>��*�T�<���ܨ�
���D���A�~#����Kgv��^ې�H}�o�j�t����s��B�����^�G�X���F�w��ل�	T;%$���P��)i$��.���+���>ED�unLR9Ի���|Jn�@�������R̯�3�;}.�vp0���틧��g������C#�C<���$l�$�/ˢ}�>�\���w��|��,����^�Ε���ٳ���:�8::Z���@��`Ln��	���`FF�`T�k��Q��)�:�0�[��ᑡ;H>׬�*��>�I�i�=���Tb$_�[&���)���^"WFبRmQ��+�؀ݍPbI�E�m[�l���n�E�\ރ}�upӢ��ݡNL`䉆2
�O�O�v���2�a;3F	�-z�I%n
Pz@,�p�0bw��>��8!�	��}������K"��6(��S9��b�S��G]�\EeW�p\����з�f��vo��T��j�(����|n�"He؎�On'���C[��]�d���CZ�'���&*I]���x�eJ�ݰ�
�9?�9�:E�f厘���V�y�b��rl0�X>f0���wi1`d�04@�x����fN
3�x�F�"���/:PB~	��Y�����q�P�3�o�(~�8	W��(�
uK���s�F��^�e|.P�EU.�"�z���r�K��< F�����
Z�>��4�eM���Bhb�S5��	�:�)Rv�z�{�)�cjcL�肊@x�H�Mف���'�ִ`C�Y�}f���i�G����eM?@�)���1#S%����]���;�B,�-n����t[��آSN�7i4�WM�s|]���O��Z��ʞU��J~k.Iᓭh��/oG%��,޲�n�e%�N_\k�4z��܃�'��L�ޙ!�Ȩ��{��8��89~r�^��pb���J�uȽ�p>�s��Wΐ߀+E��ۢ��a�mb��u@~Z�"8�
�5E��bѧ|2��"tѕ��W���7�&C��%�0�iJ�'��1ŗ� ���o�wF�b���˓9�@�\,�uʃ��mjx�����f�cA�_B��Ȧ*}�ny�mGrf.�䤠G�[�.퐶-��(�RSZ��X��1=mo��#�v���)ޛC�j0^���f�gv&x�S)&�9�J��[��<Z6���{>�"k��C�\�%�"�>K��0]y"h�Wo=�Y��u\We�7���CQV\:f�y=c���9�"4�y)���5�n����y�� �-�S7�p��-�*��QQ���
0�zo�̛�x<�����ɺ��r���5*>S\�Q(`��'�<�gZ('��$� �/��^�d��[7�j]`[���#V��MD�+��9���i�vTR�k�I��h�g.�	Ӹ��u-��y�՜N䂑8=v�p?�л��8���rٯO�w��-�t��r�z��ՎV��Z�@�6���~]]�UTU��6�ڇ��:��?���"u�kg8=Ǡx�9�̇ � �%=�ٛ�*�‹�P/i�dYpd����&Q�}~�+�"4[��ͭ�hr~�����@u�wXz^�A�P�WI��u?�qUU�J!�՞��?.E�3 �jT0S��E��$V�ɨ�
}�E(^`:*xdY�vX��U|�E]�ԠK��3*GP��~��	+���C��.��˩���+��CY�#�dy\��X��5Eb�R5R�B)8gx��J\��+ ne6$��:�p�̀$�}�`-rB�=��$m0L�V��hY���1i�1	lT�D�_Ɣ�V������N|	8FW�m�pymYRj�R)(N�� �}�pc^9铌z��l�e�Z�7i�d�#쏖�Yl��I����Uofp�
�j����#@�a�a�%	���J1�#oj/�	���㾁�Ƴ��^��"qn�����2�$�Z�l�A�����p%�i�,Nx�Y��K^`uL��z�8K..'�:S9&�$Cmf���5?�!x��\�~u�ϱ'`�l�$m@N����$�^���p��H
�TO�-�gܟ�K'������*�
ރU��(U�U0YX{���l�Lh�{#��9�llX������.��-��@�k�7�K�C�Ē��x?"D1��o��_�.6Ţ�m?�����F'ݞş�Q׈��:˒��=�\�4^��;M��\j���V�~ٵ�\l�>������j�ޒk�����}N��A�b��m1�K�(�ySAڭD>܊z��3�ⶏ-�3u3ǽ�([O<�V�+�V��|�	z���l��@��Qjl��`��c�%V(0�H��_�g,�"7�?ɨ��̇	�l�MFc6�&S�&s��y�
�Ip�g�&	O�L�%�sֳ��YOIhe���q>2��C�-#!���$x��CX͍�*���^�Z�2�􆉂�"�E�e���{!�{	V�DA)���z�^Hv��uY�F	�QK8j���v� �7���-t��+�>�>���S!"WW��Muue��A]��{`�f���7��69��UG1V�pI����x��%m�M'�vl��wǺ�GKj���?SK C�q��I~ZA�jX��:�Y�,>�,��ICYZʧ����^�w���KZ�j������}
Jh�
�"[�Za�iw�u�I"��`􃱀��W1ȵ"��b�X�zuH?�D#׎L+Ď�vS�\ݰ�yd�$Sa�~09
j��P�d���J�35I[X�����h��OI��׻(� ny�L
���i��f�T0?>�4�Cup�V�e��4��Us"ׯϢ���s�k�,t	�D�MI�w^FX���p�\�<E�]kd�3b��Љ��w27�Z����r�n0Ob=�\����9o�����#=ɏ���H�����s-[�O�$�)!;4
��n�`�G�/��Q@I�C��E\x�6G��(S�ue
gs����.��f�ж��zp�����A���B���&�
\����m!E�A�����U)M���˅�%���8omǃ�P.�̙m��q��#@��7n�F��|��Ms�Y�#��ʜ���@��w�h���}k���@�
f,���O��4Gh'�>�u�e��8���)0�:X>ز�uة)��3�q!m-QT�O�:$,��(r�>�����$]�0�jA�G[L�=ov?�w�{�1���UQ�C?�mѢ'f�U8ú+�(2���
�݌�&�]Z̆�G|щ�P7쎢d/m�.����Ψntd��Ce��I��@[�O�Dڤ�v+���6�|#�\�3͓�WM�,�%�,�����>�kR�x6��$j;'�b�a��j�p��Vn�/�؆61��B'��&	�{T�oa(`��=�L��P��)�ND��HR��M����Ox�*l�b�8���;�
8W�cƖ�d^��Z�UZ��]ٲV��E�j�f�a��qt+��#�g��g��m@���ċ�V��D�l6��1�����d�7�D�������0��,�C��vu�KQ-�>-����1�
�s��(��:������p�1��G[�e8>��a����x
�����+>��艞�����0o<��ޗ���),w5��B���1+($c�3��υ�onz�	�f��(b6
[�!OAt9f��BOfѓBўYRd���7����u5�i���d0j�b���SX�~?�^����R�ɛ�s�X�3T���	}O���a����`&wJP/���bп?k�1�W;�%��D �B�ΰYɣ�����^YF������'�$��O��L|�\b<qF 8�l{�xۛ6Jb�"��L�\�ݶ*������N.���`>�4�X�vyrL�D�KsW�<��1CL:ru_J�o��Z�,o{к�A^Rݴ����X�M,�/��l��X+��'�aE.B��l��6�#i�|��̵2+�D�~�D��)P�>N��؍B/���>C�k:�]&��fN�� n�oi��|^W�"�}x�n*�6�߃1���nP��`�9�
U�����펨zU�c��)��w�u�G0�Y�ܯ��z8OB/ڦ��U�?[���P��x*��4�����0�x�u��$
Fve��Ϭ<I��NF�d����Ik�f���􍕗�R�����pki���̊}8d��?`�������3EF"^j5�@Б"�!��� 2��D�a(�g,��?~8z`�D�I���M|�ޭj�'�2*�FC9� �������8�
o>��."G��tG�1�����]�z2�&�I{����}r;����/̽5�Q1�@�J��5�]�Ց@7�Dw����_~2A|�!�7��y7�N�C�wOpx}�pKF�27��Y��<���2H�X��XE���<�4,��8N�H�͓��J�c��E�3`�]����̼��'���~���n)˃
>b��
	�G��n������M7��\�䎕������ꑲj'��Xs[�LW��a��a���2[8���R)�99� G=��
J.;l�b�23��<f\T�����lX#����F:@(�{v2���@/[y����e�za�\գuӖµ�*r�bz\��#�ڠ����^�g�G�S��8zL���?��^k0,q�]�hX����.o꼮�� О_G%�kz9�U;�yI��n5�+K�-[~��C����&���"��t��H	D_��h�Z�Q��Y��z�S@�M��5#�b?f��,�2m����AcD_*:�ލ�G�p�����_j�ݢ,s\�W@���ͭ�f��������>Ձq�U��b�x�����;^,k)�D�<��)��uK����.�^�ܜ�C��p��ްhců'p~9�'�cgm�{y�Z2/C�T�rP���k�P�s1�R�Y��OJ�:��s2)��m�*c����DoKu��b��^�!�f��-)nt`�Vga`�0{���w,u#7��]��5ݔ˄C�R�<�@$��֔�L��g����1�8��^؞(�\�Q�O ��ĩ"��J�/��7��R�ǟ(SG9�ﲡ��fP6a#��19�#{H������y��ʗ��Ó���:X�QY����`�a�6�ԔI�k�9Ӻ����2����"#�h4�����|݈�Z����z�薊��u��(C��5_f��ۑ�ДOs�청5_
�^4������Q��S��>U��]����؈�\ܧJ#�����cǁP���2]+���P�����V��KM��X� p4����?ti�{�{�CM���H��#���2��Qp�/�eR=GN�)Sp���_�E�C��x������XXQ"������&#��6�����]�^���|����-��l�+�b���\9JEW<��f����+$�?kr�L/�2��X�t���	;�Z�߷�Ch�eQ�;���z���Ο;�r���_t5�����m��L��Bh����S(���S���Ԏ8��6�[[ehZe��}ս��1�y�QN���B���*�r��}�eG�#m_M=�^
Lk)�˨١qw�2���E�b��:0�UVje�����闩�Z�%��]��A]+��.̽�%�F���!T�E���Q����n�W����zl�Q���ņLPȺ�Hq��e����UU�t|}����/_�~n�\��k\��@ �8|���K�s�G�C
���$#�<J�!�Mz�[��+<w���O�tL3�2�<m�Y�~���n%;��0���M2��M�M)��=΀)�����:ͮS�du���[���#i�j��:�U���}�5�oQ���b�|
B!7�P`&�gP�
l�h�з~�Χ��u園�,��d{].��ĥ
o�gQ��頷kA�����X�|k�s��?yR���;����:�''VzQ��2k ���?$�6^؞�X�p΢�\��`jƆ<��6�����9����8���9��qtt����"�y��U��R�^N��U��knj(%�Ѱ����i�-�M���.x��g�rb��#�E*Pr��Nt��ȸ�%�8�0�G4�����ϸ�@�����M"��9h�J���y�xW�ds��,�S}wD	y�n�D��8��Ri@��[�
���`�,�b��*:y�p���T�]�F*)�3���G��h�s=s�U�AÛT	���8m̼b��.{�[�	�ڈ~��R`~��%�+�*H-Pؙ�K�ƈ�&
��<`r	�&@.u��+�8z'�so��a72X+Q�	��N����UD��m��s���<߀�����/d��-ڛm�v�|���M���
*��C��
}d�Rt������o�����X��-k�|c4��������7��*�a�D�9=��x��6����w4�����,k	|�6�F���1Աǜsg��YL�r�[�`jt}�
J�
Rn�AK=���{��^�����Ӆ����J��	k���pvZs?�&뤮��_��8��}3:vW�M��k&���[I
0�p'LV�'T1�.�Cܪ��@�lA��$0o�0NT����A�1��:Z�YB�8U�<)�^��l��fջh@����>M�-��Pn8/of�}p�#�gZl��������~H�0�~�����&��an��9�[P'-FA���C���4��bۗ�^���Mk>��t'\�<L2���x<V�7q�2C��t���$���q2ؑj��oШ+�v���u��E)@��s���;ѩc���r��`$/�@�\�T�yiJȌ�#i
�L����T�-��SC���T~o���&���=Z<�F0L���w�`D��껴K2��6^  9���xn��A�4ތ���]��gD�D�?��iT�G�IR;�9��@����
=v,��4p7^z��6.?׸��v:�t���꒛ӏ�PKE��T���:[�pip/_vendor/rich/table.py�=k��Ƒ�+pt�JkW��x/HE��ع�NI:�R{[X,	��	��K%���1��@��N�P������������v��ʡ\6e�W}Rovm7�WY���f�%]�k�e�h�5��]���������ŗ�^��W�!�W/������j*����W�)7���~�K��
u�-����۾�.U���-@e�揘�����%U׵]�J��mw�?���6d�?j�]�|���sqն�.�J N�җb=��Pe�MW���M�������wU7�˲y�/����v������A��C�U���]�!�毛j�)ߕ���?��LxYlL�|�u��.�FW�{�|��QR0}u�4���������d��ۻ�n`�>��o�sF	�Q�v%���-��ֶ���.�,6�}��}?��;�}��[7����:�]��F	,�ܣߚ���~���f��պ��\*�%$��pSo�?�"��#�|�]�g�P��$���yu�%�����M���u2�l.ၫVI9��v�H�����[�M��Ӳ���E�kx��Na��W�M���!h���˛�+� ����%�����%�\�vS��i�@
S�7��Pȵ&9*ž`��o9���˶��S�A�$)�Y�u�@����Pn�:0awwɾ�Bk���%�ju
���U��u������E.�Q�y�2�R�(�|������/�UA.��s���i�N�pR�j���ߺ�5�.iQ·���O��\�%	,+���q����w�ķ�^0Qk�4P[i��z����2�����j����z���ғ,9����6M���`FF8�^my0$�hj�k���b�}��n�
�q�Ih�#m�̪>�J�i�����0q�E���z��`9O@
_^b����@t�u_��<Cn릁yO��)L��)�j5���-n��F��7P
Q�w�Bq�JM��v�jJ�M����8	Ky5�Ȉv?��U����8����ᶪ�I���A��T\B��o���@�USn�y�w8/�]W-��
�_^Z�./��q"zA�\$hy���U�8G84ۂš�ց��*mh��I
u.���W��}���tH��P\�-��J�Q��u����U�Ÿl@L� �S��8�	�JKW�:��"��� �Q$\4�S���p�)&�-򀖩�&��V5S�=[���b��9e:&�Y�CzgK0�>k���p�ڰ�X�\�"��KS��C�F
s(���0T�e�<Kf�<Kr�Ѡnٙ��ͬת�C��J�t���b���Z0�KN�3�8��[6��L�hx{jҚ��{�!%q�U��!��
d����I�bJ>�rPl�I�53#��̫����if���o4D�\�,�(!�*�!��J���x7�j�T
1wu�|:@�w��D
V[�րj.ZV��cr�T ���,��� �y����x�͵7����Y��}�_��L�����%���"����SDP,�^���4Ur��f3M�ꦆg
?(x�M-a۶����Y��("��I�w�t`Ё�"�NY��Y�r������
p��g�.��D�
�Z&xr�(�v��Xd �t��5�tmw��i5��Z�݁�٬����$3�n�l��T�������q"��y����j����/���vj�Β��>��P��j�(��au#7�+4�qL�r�
�!o8��L���P�H}I΋�
���9J��caV�ƞh&���^�ʳS�$��.;vNɧ��3o���,6�p:�v�����@�WKl%>
@<A��{��(
:�yY/�3	��Y���ʶ*Ao�x\���������t�v�
��
<�Ď��0�a#�����@���kW�X�WV֐��ah��7�
S�=�!RK�	"i.Ģ��Y�{mS�P��.0&����_U5F��7�)�3����炱q�Kq-}{�cd�cd�cd�cd�cd�cd�cd�cd�cd�cd3��#��ri�-ԋGj����G]X߷��������gIh@g�@WK�=hO+�y{�DT&
�C��e�!�k[e�m���*hY��ga�	������)�K�f�)Ǖ)�L���b��/���F&H���Xj�3��]��X0�+Yd]`#֙��
��W�gQE~����YT?O����=���N�c*f�#�c
�JF�Ť�FH��#G�,�*�_�p��@�;�s=$���u��b6�s�7n�uCs�i\41I����g�E�G%�zc�߂%�.Us���
^�ʍȕr��6|.DL�߹�0E��a6��Ҧp�uE �S���CJD��-r��5q�e�;]�xp�6�US'�EE�:�c-N�U �f���1��,�U��5z\'���
��T��^��V8jR�xr��
��iG�6q=�����Q��AȞ��p� g
�����^��P>�k��oSI�<���6՘8(Oaȍ���w��+k�-����ۤ�rr���Z������Pxns� ��m˞qf#�0�ʕ��
��W���Eð���Q'n�?]�ˍ��=�R�r=�0��EE�p������I�[�9y��E ��5��f��!w�9!N��?�����K ���)�5Z��+�Ғ�Yd�s����2���jx\���P��w�f�� ����^���`���ro��S��SG�����R�'n΍��d��2<�@���~�_�@lp��v�y��m�"i�)�N
��$O�Ū���c�49���m�n���3L��L��ü��	���C�ā�j(�ݢ]mT�a}�e��j �l��Y&:ꊆ����v�4�<`�0���J����v�/ꝳ��N�U�\�f歶ːC\�b�ڪ�Z@��t4���<���HĴpa.�� �"^kz�N��Y�DB�4��!`�jca�(��1/[��NN�ʊ�J=����%�F �G�O�~�S*UD���PexoI�G��0x�߭��+�驤ε��7����x�m�7�+h֞;�Z�4�3puɥh��}�:Ί���m����/(_�nD!�#�y�$���\��}Ъ\���D7ugJ�A��~E ZJ������X}�E��7��
�jFT[~��eJ�9��	�O��E밪?n�訇¯�=+DR�M8x�כ)z���[-�jW;�o�i�~�� ���]�����[����-�YǶ‘��?Ֆˁ�Z�O�@�T� �,��9��L*X�vC{*F���3�N�f��2���^->ζ��-��è���x�=q�!߫�ک�Z�͇ �B�l:"�i���S��s�i3���c��n�&�2��~���Tˌ�*�Ǚ:d�!�K��'Iꪓyp�4βcL�Y�F�xh�S����S��{7����6�����y��A1���(�\����>�^%m�ror�]��=�&!�Rv����AfRH��채�j�ϣ�J���7�	�n��|1~�����y}�"JS���j˕�U�y��kG�[NY����b��r�U%���E�y�?d����֎ϝ�|��B��OY(�9��b2���e��0$�J����]{;��bWX�w��x��7z���� �PY�7:`��&t����q�l@T($.��{ �>K�{e���x�T9�t� �&F�+��|S����Uo�<a�e�W��;�X]��Lu���l�u����7�`e��;K�Z'w��}��#r�ү�%�__���e\&<�2��������G�J>���8�p&%a����k+�}E�{��2ƅj��:O~��f�z�A�>T(ϑS��$�Ȓ�q��I`�:(���ȱ�iVm��6Tac�&5o������Z��o����&.EI5>���t6��MNi]	� 7�T��g�dc��(�@�G��K�?�A9Aw�C%1��X)>��~�78]�敤tQ�rS�?��lL����Έ��)sm5�z�'m��Q|
ˤ022�Os�y>b�*�����g�f��H"��X��K��O9�����n=��蔈��� 82"��urT�F��'
�8�Ώ����U��
>2.�l
�M$��#L�����&ꬒ
y����.:<�|f�e˂D�l2��-�l��E��qh?�.i��`.�]��;�2DB��4���b�X��f�GZH�蚑��z=�+�o�����#Ә+a|l+�"Ϝ�S��.HL��L��һY��ս
���'�o�Tuٗ�yn��,��"����"6�������A%��2b�}�榊A�p�쥊|%eXGH'�xg�9���$8nY9`pѕ�눍�
�2͖��M9�Ci��sFlv��)ۓ�[���p_q�[ꂒ{/�zB�T�0�@�C��@���7��@�����,�w)����jUXFE
���.��ձ�׸Uh؜�A��z�J��HV�EH4�P�
�1����q\�a�`ňס�0.o�	�tdwji�Hm9H��aFп�6u[WW��]����U�wn�*����-���8��Y�Ç	P�]�b��>I��9�6tu	��+����Y�c�%�>\m�]�U�"�wPM�BFуa�#�Jw��!�>I�
fX���p����*��t�;_�B|�˪�

���$\q��[�S�X���bh��W�@	
��	�~la����p�rt�W���1ez����x2�8��J.�Zh.�c�����dc�+�Re�a/�e��s����K8
�EJ��y��Zl��̢��s��y!���I�^����qU��'7����t�m�d)v�c\���U��گm�q�^��?D��2|_�R�[�N�4C����)e���~P�ٜ�C[�˼�^�U�� ��ܪ+Kju��ez�nʻ������]UL��wP)�F]�Ci��s�sXo�=~���O�\|�-*��2F5Ǽ�z{S7����o��Q�&��/��$7 g�4�-��z���G���~�
�E
�1���\v���I���u�N(�uU��U�'����a/#�c��M�SZ:��8�#l7���f��yh����p�JGB��mӫ�*�ET�T���m4>�l�Y<�η��B�:��~�9�#K���ŁG�D��Q�J�#�%������WR.]�D'�̱/<9��o�e�荞�5ıg���
��A.K��j`�'R����l�Y��v�8\��l|�e������b�9?�����=�2�^��ᆻ�/�r7:L���\��|d&$��D�i����}A�C��Ȯ��.S��<�\���mֳD�ISGr��jGa•�D�}��D��بao\�Ql��=h��΃�`{��l��=W8�S/T��!�hm+XѺس)��Y���u�6�h
���^iv�,�E d]y�\0�sGlEsĽo��s��Z8�Qs��?��9�.N��
�s]aڙ�1Ј��ԛp�T7�T�gn#BAP�CH��DZ��dm�f���bȨ�<�A���8�x�>x�s�㤬w'%|�62wckb}����;���y�S$KR�L$ ���K�$GB����F'<��irE�C�nL��y�/��s���G����Qb~�x�;,anrn�YVc������횗n�_[��%yԁcڗ�'*8b�t���ֲ�Eg6A'
W�Y����*m�<�TG��$�)]�\X�n�F70��8d��ޣ�T�b�烦��O'���>Gg�����=�z�.���$�x^�'��q�C�;�GhS�"2hI�&K�`�T��"�9?��z��J�_7�*Q�o�c��2\�(�8���K�X����r�-j��=Ȃ�h�D�|+��ȿ#	&���k�"�' �C�	�c�~�)���*�?B2�O������bg�+�qN��z+2��������a�;tT�!�����LGP�ϙ�6�^��iJG�<|��t����$�H��j�d1ދ�Rq����MU��1�ғ���:����m8�����L�����˽r"��Ȱʒ�ba�1����p��|���}�����a�g+�c�뗛_�M�k��̘7S�V�f�=ɸ���u����5%�,�V�2%eP�ZL�����O�iv[�E}x�'�.�kz|
�wӠ���7
zN�&�����ݻm���4(/�9�[�oiV��5�P?�ǭ|�&�qC��%�9�xĽ��5���T6n����W��G򡽣��U��{��<tX��}ú�Z��6rw>�_up��ڝM�pЏ4�ʄG��%�m�\��'����P�cW��'u za���Q���|���A��C+���}L�x�����a��4^{��,Z|�ݹWA�^,=#i�A��6����N�\��%Z~�T�)H4�;�C�R>��b�.LW�����^�e��S3���:��E�k$+&����f&�vW�q�B?� v�W?:�[Y���m��s�n�]�3V�����?�v���wĂ^��9~S�8��?��Ehf%	&��cz��*���6�?�cy��Nz�k�e}�q��IչU�4*�,��㢸�t73=��+m�
6�i�Ԃ:��i��'���V��<�m+sGnnΈhL�7�PZ~C�s�1j,���S�X�h��՚u��h0���Ŕ��U�r�\�޸�1�6�9�gQ�ܴ���)w#�qJ�%�� L4���о�X]R�L�1)'�	�r�zK�^��[��r��[��/U3��R꙳���\�#B�=Ög�f��ٳ� &0���^��Y��kv���|~b6���H��p�p~��O�*q��n��1sp����[��K�+���*��r�vڶt�xO
 Z����x�p���4�>�ZJ�`fg��v„��}�2>pH�m�ہ��J���6&1��РlDA5ey��Iz'7����[�8G�Z9W=�
��C6�(��s@*�fL��@X�mq��a��6���l��ݗ����z�я�ݨV����#/p����/�d��␪ |��D�8�p�m�G�2��/�3��������mI�����e4�[�0���
��$��
�ߖ��#�er|)�);_��S�I����;���Br�<>"*�#�X�e"d��w�����ޔgx��}sj�9�ݢxӨ��+����ͮ�Dm�MT0w����^W��K�z�����Fw��tЇG�ڢ�m��p1�4�=��o���ͽ9�:����>{3�]�듯�u�{ު:��^㏀W�ͮQ��!���|F���
���]����us��p::7�ͮ��byWng�z����c6xɞ�9�r���D0�l�k�r6U�w �߮���
]wU��E{���F]}Y-�g'�;��c�����xO�N޼��-�w���Ͼ��Yvzz�����qBf_�wɳ�	���n�7m�� +o���â�}��g����g?�e�C�r��Y�j�H�;==�.�	-�?V�:�`��Y��g_d����(�wX^����Ryߏ�+?���/����z�^�+�I�(ۢ]�y�������x��O�.?�஫A�Σe�&��Q��<�[y�Е\�I�����;	���R:�o�j�c�fN�Kj�Yd~Oę���5,����y>?	����'��=�$^#q6!�~��8^��Y�<9���
�I��ɋ�\��
��fɧ��ſy�nq�]Se��p�c���盧��H�τPm]Vg?*+�PKE��T:#ӿ�*
"pip/_vendor/rich/terminal_theme.py�VQo�6~ׯ �do�!�%h���q\��V�7�a�dH��ݑ�-�r�>Ԉ��x������@�c^<��p,+En�ZM�����'$}9����s�P��*SU6�F�Ccjl��q+�z|4���_�$o�&/�v��<�a��k���C�<șG�suu5':��J^j�H�y���� ��Pu	��[�BM=:��j���ۇ����x$��$�3�v��������)�M��8EY�{2¢o��iN��M��ۀ�չ�n�3��*zV�!NHو��nB
"xU�,�	?�$�<ʭr��k�۾�U�N8m53
<�ɲ��U��N����&��H�U&u��`Қ�.�t<�'�
�N-�q|�7�������י���lfz�5	�_�c;���B�١��Z�����5Z�JF��il�1����i�.>��w��,�Y�8�3��XNH��MF���O�9����&�b����x�f�	�!Ԟ���{'l��l�;ɟ��k����t͆¹�j��;徨P=W����~I���@�ŕ�	�Џu|�d+)2c��m�É!;���T�S�� |R0?����&�D���O  �H\����Q`�D?���z�IW���j���^���f�����!�;8��!l�Y�\�WňYf�X!�	���9�]{�(ţ��9��a�=F��D���U����b�n�ar�%��F������z���kN}�zТ@�3zf�TW޻�4[�u��|�#���R1w��^���E�!=ai`�����X�ZҲFZF-��t���+r�m���������ܢ��׋��؏���rI��ֆ�E��_�K�[���N�QC�yGQW]���ŗ��O�_�`��4�8[�G�I�JA����K��C��	p�z�ZcH[X�(�˦���C{�K��ќ�Ǣ��(�^ᗕFL�ne��xSQ�
g���5fƹm�
����v}�s��f�y����PKE��Tn��%�&z�pip/_vendor/rich/text.py�}ے�F��{��
�ő�4�a*Fǖg5+KV�Ll�yh4Y�
hT�W��������a�%'/uɺd�/s�g�������r�k�>k��e�l��}�겒슶/�j-6��n�-�k��j���N�Eߴ�A٫��{���vW�W�i~������|�ſ<��__��Ìn=�o��/��*.*�W_��z��e��*�js�ߙ'�w}��0t��=�s
�g'��|U5�Ό�^UEכ��r��"�^]z�Û��on�w�F����X�UyU�����k�_7_���bU�z�u�_�UW����n���m��:�m*���r��7�ߍm����i�/�R�eQ��~���vM�?�����-���2-��˭� :u�W���4��ʾ�/f����N����>A�f�o�][\m�Ӭn�u��	��λk�/�rf�`�f0��//o���5@����'_>��ٟ_�����7g/����l�0��d�.�}�Ol��y��W/_�Z��eSm&'''�V�n�a't�b��I�`��]Y���|�=��	��z�#�9��9��,��������'$�
�̟��t9��~n���O�@�]�fWԹ��SB�d2y�}�6�~�YYg]�UY}ϡ�	��z���7�"L�
w7�=��g���
�fЌ(�TN�F������uY�0ěXN�2�d�F뒭˻v��;U]N�GOq�$�ת~�֚��%
,����ig_�`��4�OڏӉ�6j^ve
/�k���zӬ�����V��ԃ��N1���`*�2�8@�$q����i�tP�]U�b�5����h-	��9�w"�o,��+Zt���VHR}�}�{�Ȯ�w����:j����s1�Skb��U�6~�������1u5CB�1mf�5��<���^����sz�;��W��K�ٗœڻn��
a���f�o`]x<�
���D:���
Q����|DiD���i�j���C�����E[�{<�`I����:`��	����O�gY�n�5��b�=p^��+���rZ�/�ƥ[�졞�%��"XD���5�m�;�_@k˚������gٻ�ګ�B�7J�wC�Dl(�ʋ�6�pX�vʜ�~�6�ؾ^�.b�v1C.�wT�#��uS���[~Wc��*�]YN�J��`�K>��}Mon��3���'��@	�!�(�*:�[^ �!~�BE<2-md[�@���e<v��I���循�_"ω�22�K����#��~��	:J+�/��+��ꆥ��eG�	�۠�-Z�@�b�|ܟ�ؿ0��c���C��o�W�����1/#���v���a~����V��ﴄ97`�����ws��wY���9R���9l�
`�;P��%H�M9��F��ZuU�w�l�s��W����� ��&;y�Ј���U�<�K�yoE���s�_�[K)��uك��0��۵�(���, I�A��p��
!���]D�,�5�@��_�(��ۑH�'�9��S@*E���t%Z8�{��	/#�
�8��� O�5�M�5����>��������Ѝ�7�\��ٰ��Y�1�
:��ۖE,���K�0����L�<@��$1@;��}4zR;<�B;����5�;�x3��ށ�M��*��
���s��hR��q
�O=EDJ
�'�Q�)ڃX�"u�"�P���L�r:
e�O����m>M4�é���4-nN�Uӿ؂�����SR?�3j.�W�>�f0���Ӣ	%e������^_Z���=�k9m{��2�x
�0��s�;8J3MT��5�9�4H���o9�+գ��N��ʵ=v`[�;�$-"@�{U�y�4��"��uC�f�${��ftΝ,gq\��yt��?�eO"T�PV���QM#�a�ؼ tq�1�
��H�_r"�NȍViF�OR�\&j;��)����ov��G�4/�
������L�����E��4�.�;Ð�x�������9Л�O���x�Mvv]v�M��6�TfEvQ�zӴoQ�,
����e�.��6�+����̂��\�U?��V�;Ȣ�m��۶i�	a�c�
����IV���t��n�f����Zt$�vo��)	��ܵ3T�i���u���ذ���^OzE�F���n��c2�in�7�!����r[}����u�6[����^\ui�^6��n]����}�E4)��t��b��#��v����	�q�o�9����Ms�E�T�Fڔ(�bXg�^@hC��[ ��/��w����]8�1[��ip���d�[Z-��%lZk�ZW�j˓�NCd���7�Z�a��ɟ������HL�ż5���.'�@M>.'�\O�����i�k���7hN"tEFTn��.ٖ��aw/���u�%�Ѥ�y�RJ��S��DGr�ޱ�M�;�-뒿�n��Y��@�)bh�9�3�(F��?��n*8��9����νwٟ[��U���u]�Ƃ��C�etrI~6#�^Ÿ��6~>��.y,=��z��*���g�q"�4C0V	�&��f�3^���ſtw5MC5��U�og.a��[���?�f�Xp���dP�S��T0���j\�1�y���-��~���7z�X�_��=
��~Bo��ԟ��3Rd6���R!�	^�B�j���	rZ�gI
X�?f��[�g!�(�'�0���`vo8v����ļs���1��#��D,�H�ʜ�e�x$\j�0�f���l[�j��l2R ̾ݯ{�K��@��#؉Ui<[�9qE
��1���mv�ԟ�h��w�$���ؐ:ϻ�Z�ʆFQ=�Rm~6yr�-O��P�L��0C�����D�>E��k��
�Uzi��~��H�{!K���4��w`)�@̍k9����©3��`�lwG��t蔣'���AXc��fb��Q�<�g�mʡy��Dwq�{{���O��Wx�^"6m�4[�/D�3�Ncր�E{�G�h�u�ƀ�J�Whxt��0p�]7�C/:1�������/'�r�r�ʽ��������yG1;)��
�¦�G��#94��y&�{�=,�	���ˉ��[{*���:s6�ĺ�p�9yh�N�Y�sĮ�頝�Ƒ�����_b���3'b����.��d��l��+��R�j�=�%���DŽ��O"w�{z~J�c��-�	��/�Lp��J��̐�WV�N��`p���:�v��@�)9�G0�c�l��8Z��m��S�p?��	�A�v����S?�%"Q=޶ܲ�!��cK`.r&����R�tNk���	�_2Ǿ���Nz�y$�
���,�by��$�֋���r.��*�+
.�ޘ^lTېH�l[SbB��(?� �/�=�O)옅���ސq0+LR��%m�Ґ�2�k��{�\i�/��b�o������:�W�`���]���-�Ik����v\�׊e;�1����D��èg�F;��&A	ݪ��Z�Gc&1-��0��
M_K�h^C�'����GҷV��)��P�0{W�\Z*PV�2��0���*���+J��\��ԗW'�m_��ٍ/�*z1����Mx���
�px�1j>�'0z�0@&b�t�ŧ�! �b�_��*�Qo�Om#���u�T*����(^����Ԅ%�2�C�/!+�)���0]�G�k�R!��[W��l���ypwn���#�gJI#��n!jP�@����J�	����	�&v5��X񰧙���_�PB��5Fn?�.�=xp]ԛJ��p`������Y�vf�a�=�� �R����������S����z�4�X<
�4��kUU
�U��4�t8XW��b�T7�U+���tj���D�_�G�0�J|����>7h��(>o�y����N~?A*1�+����oP>*;ͅ��֡l[ܢ]m}���a4�E��ч
�`!�㵝�w�T��r�o���ɩΫ�7f�X���l�J�q������=��U�����H���ň~�
����$�C����qw�n�}o���`�x�X�;gPӄ/$��bKc�-m�Uѯ�C�k��i6�	��8���c� ��¥�b�%&Z�gi�>���ђ���\�j̈U��ǭ��O�|�W���~��;>|({���g�P�^��dg��|}�ѽ%�h����5�;�~��fh�y� �y�/����l��mg�͆�@j�E��}"��Ì�(�U*
=2�%��S� �z�
�13���$�-r�~
��MѪ+�~H�i�ʶL���NJBX���E��0�g��;L�K�O���3��Y�j_ /�P]�%S�>�j��.����s‚�[X���5PZ8�VF��ĉs���8iǰ4u8u�����\��__k�q�aD�rs
V��j��ҵ~M�S.
�Fg��C~
�F	��n s�qb�����A$�G�%˺ٳtn�j@��W�#�z*�e$r�8
�tg+&U`Ĵ�mC�"ڴ�A�wa�p��c+����7`�טEpp4���Rದ�]f���}bTlɩ$ɘJ
O�8V��J*k�$�8mܲ�{��&����#"��P�ɧs�@ :�'Ƣ�m?Yd������|������$��h�)F�bn7Ĩ�ᩭ2�v�`��x]t ����T"�;��x��씛��ȁ��	�C��z�_�g���{^S�ޚ|ض���S��wbf<_;�!�K0QK8�C�����t|��!���>��•�9���l3�
Y^x.� f�|�]V�U�x��C=1����^�go�[p�/w��c�9'v��.%��%�[�9�{�v�癨�Ez�4YD����n�a�+4qi-̄���`b 궁a���Z%�m��}�됦���`}�'�Q������rG�����)�Է,�_�\�����K|ǟ���iv�����*���.'�X"�ȋ��hm6�0‡m|܄:*1C�3���b�=Ƅp$�L�a/!���R�"�U��0X��h���I�y|=�S8@ŠBD�F���؁��C�k
�o�x���TH����U@��J�Q���U�+��{���ĝ�����g9?cv���U~�����\�~�6zX�VP;PdT�L�E'��{a]A��F^0_�z�k�m�~E�꧋؉�o{iϣ���{>H;<{��>�)�b�)�lR���L]��8�oKUmtn�yk����<�gL����OF��>fP�*���r�*ѣ;B9�%�����s�����^D;���&Q�	)F0rʾ����'<��!1���-���˭�����,�!y^������L4�,9@�k�`(�pܲa����1�����pQϔE�Y��!y9�Ў� �-��0�Ӗ}�j�R3|3)��4L�pu�������xkxAe"�~T|νg���֖�秴W��yd�t6@����ʥZ��+���€�����<�p�_�T��Y�O;��Z�3����1{�x9dh%/e�?>*Q�Fw�@����"�^���d��Y�����ӎiY�	��l�)]�*!��5;ۀ1'�z����Ҿr�x��7�ϗ"�C���"�1�)��$,�R��w�[}��`\6�}�L��?/�^�b�����yJ>a�K�N/wd�E�fIkn/�1:Mr��8͍o�s�`�]�9��F������%�H�$�&;�;�縖��
x�[C�R�;W	��2�{�v�e+�o��wԺ�q�֓��4�C����I9�]�'�M2�"���[��AO1����%A˞2���Ê6Hy�����C!lLXN��0gD����(O�oS�1���G�
��};�@L��{x�{�d[�Y��%	�ܹ�ͤ|��^�xi}��xة�rp��4�0�jD�C��#y���zM�"��̼�T�?�X+&����U��_zC��%d��=Z�5�纔=t��qm�vI
؜�a��u��1=>��D.ehg����t"`��"�-Ұ6=ԇ�8���X�k�I�&&Pt�*�-񐬓&���0},�,��$����>*LCǵ�{�_\�����	x��[pпS-Z�9)Aj<�VfWy�c�`Q�TR�Ҙ|�OL��d�]�y�[^�A%�:E�O�(�[�<(FtK!�Kzlς1¢Wh�M݉3VX����m��Tuʺ�{�j�A�>D({�R�HC��}�~�{�@n�F3>	㈰��K�m�Y���'K�v�l�L�8�We!	�-5�Hg����٣,Ǣ���i���oe�x�c��dt�^����y�*}���9�#D��=Bt�n�0B�&�(�_CK��vP�Q��mh�
�l7d�MzN�+6���ʩ3�E��LRc�:V�j�+c1L���G�����r��ʊ���	�%g|�tZ؝c�3���١�{�$�*t��,%�74� �Џ����iH�ZJ�2?j7`8�'�lR^�M��:�����eK�Ey*h4������mx)�ǝ�Hf����������]��&�D��֕4��>�Yv`�a�����f�Z�1���&�tdZ�Y�u��lЅSԷ��[�UD�I���ӎB#C�J�D\4���P]�����B%j0���ڍ/�w�uo�,��W4sDt(��m���0E�$�����k�	�9�i-��$��ȭ����q
��0O��F|tAk��W����r�LMˊH��)�v��l�]��xM�e=O<�1��8L"�����Gr�{����<��`��mߵ_�1Nx�����~5Dr>=��~4Q�w�S�s���>�#
B�쒎���:�{�M�n��[D��
(�#)~
K����14&YXLo��=N�V�*�,J�֏@�j�*
�u�\�����$qu�ua��v|�C�t�r���(|�\�aV�N�҈���8���k�!���b7��`��&V5�_x�5�c�t
,�y����gÃ��7��1�X=�H���ng��W�u�B�6��84!���E��m8YƩ��D��F&��Ai�#
�q϶��T��
sf�$�.��S�c��[O?"$�B����(I>��G�|�&���kL�^./��9'���^���<V쨷E�tv�/Ly$���F��/NE��$�c5y"�a7�8]>�H�A��4S��ōYS�g��oP���L�����L_��J������L�h'��v�#�4�wh)%�R3s��{-��Y��VTl�t��=@'lS�٣��/{cg�8A�I@w�n��ґz��J&Ok���y���H�?N����R��9]V'��_
�������m@gn9f��ީӔG����3g~���?��w����m� �{Ry��0Fȇ�G�6׽	�y��0�,�"^D�M}�}9.'1U�0<��+n�oʙZ:��H"M+*/4*a튲�NL!�E���N��� �����m$���1�B�v��oJh�<UI�L�*(X�~#Q����vd���!-��1	�h{|:$��'\�b߆y"�`wk�9�?���,)E�(yxt1�F	
�¬X����33�edjy�}� ���=]IY�D#G}��ITPU�͊bݡ/)�M��
��*����)�0�S�;޿��c��
{(��t�do4�����ܼ�Y�:&�%:��Gc8��7.U׆�gup�
,E���G۵�q�$��(���i˫�:j��#=ݡI��j��o�r:��@�:d��&����p`��WEc�>��?Nĝ8+.`RmWZ�rw���{H�
̖0�P�0��KH3���i@���M��:H1�N�܋F�8絋�a��3��ȱH�nK�t�L��f�-]�[*��J��#�D��Lǟ���d��L�m��<�KzS��Bx}�BQm �rN�F�\Ի�4�q���z>�P(n����[���QrtbzN�1��.�2^+��,`���6�2.��ϲ���d\x.Ϊ-�+eg�1�>�Y�������t���C��T\���k�7%��S��w%K�Ƒ�
����SE�T�E�4���"��J!�AD5]��"
�>�`�1/b��"��Őb=<@�����߃~��\�vu=o��V��a��/�a������M	�1e7����u	#�hЄ#a�9��ʍ�1s�u��ؐ��
q�'�?af�M�����q����?L��úhU�6��~�Z��p���LP�s}x}zmӣ���H�� 9F-Ǩ
GP�f:B8��ʊ�/�0�����S��ç�#E_����/Mg�w�4��]�R幷��p�	��U\A�ĦP3�?��}�H���]|W�%�����a��?���A���;m�Դƾ;3�R�K�d���*m�Ѕ��3��>9PE4�L&����a�[���;�x1!��秏�ˁ�G�wK~I߼���`�����66�c>D6����P��C���t�z
^�M2���g��b��e�!Ew��}�JW�\��
X�
��JW�~���d�Wd�a�c
��Ӫ4v���6m�F*y�;�-��a���r<~�.�C��dڃζ��j�d�	�N*cͤ�i1-c�e����
�>��Q�ٽ<&�������-W��ф��~,�Bo��cFD��)kr������D�t����LM��2Kz��z ���vzh���~@�P�>|�����"p �]�&8��G�W����E�(}���q�2^�3�s�g��:���Ԯ�V���n�\D�A�	��\�KЫ2��v`�6�W�~��d�>����ҫ�}�_��t��q|���:G��l�$Q�Dh�'"����R�+�do��wa���4�?���$US
�ċ�/^=w0?
�l{��!'��K�ٯU~�U�\O�T�������H~���gK:o|��,�.rlpO"K<Rt�_�1����F
֍���ӵ��x��i\G��p
l�)��U�T-����h;�;�>��W	FY��M���/0�>&��=}��!A��sLTu�Ÿ,�R��Hc]<)*��1v2��#?_��E!��/E�F����	v4e��k�}�D<H{K�:�d���!�V\Jf�<��2&�~���S�7֒ڕ��_��r�
��ɼ2ZXgX��	�����L���,ᘴc�JS��NeNwr�LH��~M��%�,a��#�*���j�z�Ѻs
��Y<(jz������O6���m��bh�
�P��>4D���A���/CA�A����.$���9��=�f���g�
�dz,x+Z#��1�UKwD��L���K�����C�?Cсh26ā�M&��m4�h#��#�X�H�
Ȝ`n�
sV+�RV+\��jr���ٵ�ն8ŏQ�Q�&@dJܕ��
d�M���+YƠ�?���)<�޹6s�8��_�B���]b즩P����sAO�8d�r�+�5��
6=�4x!S徃
=`�SRn�
z�X���}UϠ1X�.0��}1��1<p���0���β�t�E�6 y�v]j�;�خ���ʮĞd��ƙ�O�naL
O�£A��	�i�0�+�m�V]��$1�]S�w=֩x�3�TGº�*�!����UY���,��
\��y���$�G4���P�e��o�a�O��A+�.سl��W��Jn�.�Q�Z|�m*F�*���~;R�z��.�<�����xg��©�m��-��*�&}�P��V�?��{�71��h�Twe���R�3�lRk��8p��^�rV)6��wI��#z���Jv�����g���B�F�H��t��PKE��T�̮+pip/_vendor/rich/theme.py�W�o�6�_q�^�L�W���P k��}�@e$:�&�I�5��o�I}�r�n�K�xǻ��â픶P)��ӆ��V������ZT6�a�ͻ~c}��]g���Yx���[�oli��f�����ͺ�[�~s}��-��;z�m}�b��f�w����$�Yj��\�Vi:$>��,�aox
X:��ǯZT�Ōjx�,N�~4^9]�蔼���=�9��f��+h���|�ZS�
:
x�0��VI��e`��,��y0@���B��T��&|	��=f�����mK8��EeP�B
[��o�� �xB>�Bq�����/�_��d�S�-#�E�yuB�QwH3��ǧ�m#a?�N���P컚Y�F��:�V�(.{F�
FHc��xj&�̼Q�p	�?gguR�Io>0�����5�\�)Z�|�~�긶�!l>aS�6��P�q���]R[.�HT$`+�E�C�K/�� �xK�	|	ފ?��1���H�=����J�:�9��t��������kL	�ln�ݩz��HI�6U�Ƀ�����(�9l�^W|�hZ����+CI�b��Ѯ���b�U5w8�"CW\hF����#��HL{�J�R�	H]N���v�o���q*f�(V�_��A�{�g}������UL1��pڙ�z�˭{���Sh�jO�	�}�W�6

U���џX��L�����(O���H�1i�o+ﰯf �*�gLwR/�<K�;fwT��y�>K�|NV�"Ei��2ᖞ1�q!!��>`ý=��2
����#��7��cJ��\�!�6ɀ���DG�%�1�X����+� o�,����Z��K� �0�İ��~ݑ��^�F4��j����{jH�+��3&s��*EK3șy�+L���|b,�Q#&�a}�<13n׮�ء��I�����Bz�ThG��#��U�is���G���ٕ�g�̰)6=�EEC)�QW]_p=�/e��3�%
g�l��2�R��k� �&s��ٹ0ހ`��xq1�:���i��f��k���t�Hq��&�u��ٿ	��&1&�T�d
�0�u�G�Uƞ���3�itt��:)L�ߧɝ|��Xb��u�zl��P�m�?q~!(	�g�%���e����2Y|�f�-[�_�J}¿z#'���O봐6�����-�PKE��TQu�PGfpip/_vendor/rich/themes.pyK+��U�KIMK,�)�/.��I-V��-�/*Qpqus�	���q
�J+-�H�M��q����*l!"�:5�PKE��TWBi��epip/_vendor/rich/traceback.py�=ێ�u���z�a��� Դ���H$A2�����3]��ڙ�Q_�;"8q�, H�?��������Ħ���B�9u��쒢d!P��N��ԩ�s�S�e�l�<_�в<��Ͷi���w�z�Y��Dy��_�u�/�v#߻]w�D`e��u�u���T�4ZVl]�}[,ؼX��f��$��v��>h�a�B�4z(��j[�Dz�z7��)��b���7�E?�n�����W���US�i�}<�z��	��Pq�o�m�?fuٴ�vw�auߥkv�Z���.���#_VkV�@ߜ�Z���`�4��;m�r݁��ﰙ��~=�[��E�>dg���}��xN㡯�
y��;M�n3ԥX�TVn[�;Q���f+k�w]{Q�Z�ԝ^zU�5�"ӕ�:�?�Fv�>�+����Ϻa
|�6��
�W�&X*
V��j
���M�cv��.G���(]�E��
��Q�-���GK��T&���|���/�T
������rY�b�!�|x��ͻ>�2Ż���&�DY�V�ѧ]|p��wn�� ����o����ϵ�f�o��y���d˨���K"x.O�غ��C�IG��NS3��*��Ѩ��#�*��i�E��j��`���kh�FO�B4pT~��Y4o�5Խ[�;Q٭�S�����a9����*�n�d�a$�A�.�$;��!���d�;m��|�����4'ѕ�Jfb���/:v�l�hrG��z����G��ьF��6ߗ���j�2��5k�jy$��CB��w�m[ �x�f%���H��b�����U�X#�7�㎣e�F�x�1�Q4�I���&:m��1���4�ɖ0w4���Z�:�|`b��H�I��C��bU��b7���^5h�H��i��"�ނ|+#^	�M�lP�р8�&][��	i,ZBoX����!O<z��psh;���D��O!�@�
�t�
ۈ�Zd襔�%��\k�cjaR�0�ui	l��4h�1ǁ�UH�8Xh=.e�����q�Y$�!9�~us��1P(��%Ҷ-��N��	m�
�Im�~Ec�������g`��{IY2C鏪�q���=��as��:PH��V
� :���#�c3�_	�:��\���IT-_W����B��c�4'�&zX�|�d�j�X0'[j�٘t�mI�"v3���fJ�.�D�Jqr��v+5��WL��jp��VF�����Ɍ߁��3�70�d�L��,����e�[��L��h���v�Ɂ��(���rMe�b�t��$X�5D�%`��xS̢�J}��Z�y������ذCeWn�FżzZ�Yaa�
D��Dn7���.�'�m�����@��r`�I�n���r�j�;A�/������|NB����
ď�:���6R^ȧnj.��Z�z]9�Vep���&�B�`���\��˹���}��i�]����X�h�2ҋF����p�[��H�9nCb,>���h�R�4d4*�4��M�lè�V4Jt�X\�+��}�a�`96 ���ږ-z�U�\v��Z.�Ͷ����S�Z�C]�����n<�3qI�va�
�w�k$1�u��ܲ
�<RH�Z�\����	!K�h&�E}��h2�$ؒs��j|�-+N|!>����FOϥ�P�]�Q�]��~%�kV����-����L�tIZ	�#���fE�"˓�ͩZ�%+0�ԁ�C쎒͇�c4��o�c�~����:�TPLIPe�@�eA���$0����2 �aNA'M|
�|��=X1C<{�I�&VE)�Z4�@e[�������m�9�Xگ�ͼ,"G��.,�I���`�*�ow�U�%$\����
��ӱ@5l�OL�g�
f�RKtI&�� a`�5��C�]R�<2:��oM�-ټxLu����g�,�����y��x $R�i֥��#0>v1���� �/~[�F���]�:_I�����]�P��Zz����
%�1���K=��>�P��M��"9^\�i,�x�c��ye`�=Z�rsN(�@q�Ή_�i�H��Yu������>����`|���{R�:�&�DH��5����'%���p*�ԥhv�:#p���E�6Td�L�8��js=���ρ����Ob
Yiq���!�
�r���w�;����/!Ж�|#zD���f�j�m�+��\k>"�d�?��e�Ή@�ml��#��S}��
��StEop�����eY	_݊� ����s���wA���E[;�C([��o�.�F]x��D�G�<�g���Y�6����9+t2gK�p���%F.��!3�;P��ҤK|l�
b���E�-F=X�v��^�7����PrT��L��Պ;E=z�+4
kSM��r�7�g�aU��~�������FϢGb+�����)bW��X�����j�*�eg�⩎?��U}�k��c��r�/��Bɼ=g#��r�G���wFb���A�#ƚ�w^dR��w���#Ї�GM=����|���2|�J���8i�L��2�L7@X�ҍ7�VK�]�P� ��p�Ƽɶ@K��ؓ�!?R�OL
��^#���B�x�ZTCK
*���*W̰��/'���/i�2��T�>�l:|	�Xr`�kWq3"�eW��?3��NZ:'�vȩ(���qQw���I� �x���nb*�,
M���:5���n����g��.Be>'8�+�SGH�C��!�Ɇ9 \�;$+��e����Gy��u��2e��������Hs��엎�S�E`�h?q�~�}m�Ƴ�B�K'zM}-*zX���3�[P���4]��Ҳjѓr'����Y��H�A����
�HdA1�����cZ��b�.y;�3 C����Ԑ�tRd4�:�G�8E�M�̆��-�F;sY���k�s$<
�+_�	>ߨ每j�}�6*�\6�;-Ó��
��P��Z��ίIT����t��r�>��r͝X��n�M,��
�b�}��|g١�W�0+�x%N��F��qv��;�9��п'�1G��v�i��C}��z�5>_�S���M���,F7�#
3R�u�4���:^-V����_�/��
`${��/AC�J�M�87��B�N��8:�JF;p�ɼ�i�-F�8�I��<��gꍥ�Z����WaH��c6�<v�/�й*�7��ֹ�(CG^@A(�?��5C�(j:u�Csʷ�Vq�������4;� �ԉ�7�(;Yd��?�w����o�D]�d��I�	OgPA��t��_�E���*D�H�`��Y��|��M��w?v'η5��FN��[��Ah�hY`B�uc�a��Y� ����c���2$62�`�$�se�d�E��FE��rs3��M�sCFF��0�3�@��&����0k�9J��&II��?|�q��GQ��q�?F7z�=#a�=]�F�t�Fkx�9K��RF���&Q^�Ѩ�g͢��mP(�:�ͦhwSB?�	�%+n�%Jc6P-bfJ��E�.}7��4�����A@Y��m�aP/�ߊ#�IF�P�v�1��Z�����ĐLS�hDܙ�p�(.��ۼ�T�J�#�����h���7���_���6��ph#ۉ�#����dt�O�n&S``y����|FR����6v��Ōm���A>�M0�i$Ό�1*�z��0��c�>v#���A�q��� ��0}E[�C�%[[��p椱JCF�Ƚ�B�+�<�Ap����2�~����>B���T{r��|\iʶ^˧�Gի"��+Q\�*r�3������0�#l�r6�7��C��P��e#t>��h!�|	(�'iNy���l�b�be4z^U�԰
TL�=��O���IQ�q0��v��R
<�#͟�?^���*7>�l*.�x)������}�n�\�ծ�y��HT��VU�����5ی���[���t5:ЅJ��7�p։�YbC�omF�S̕Q<3GL���U��ۘ��t<�W.N7~�|o�%���NO����+��K�;���lۊ�n���9?�^痥���P��(��'L渙�{��<�#�̤1�bcp
H��z����B�AŽD_��÷�7g���M���
Ϟwg���]~
a��=���>�lQ�I�i�GeO�습U�9�AÁ2�0���0$�r�;�8s�	I��t�K%��B(O�L
��q�s�#<�x�F�*�\~׀��%[�}կY�#*9�1�CX�d�t���\��h1&#>�\���p[N��Ek4݆;��-� �}tn>ۢ,юO�N�k���6����-}�"q+�F��2O�V�SEZ���F���{؄�Ȋ�Y3>�W��^�Q�gY�e���?�4B�
�P�|�S�5����\��y�h>��K���s���>��
F��b��.��	�^�>IK��,��XIY�`h��c��\v�%9@+}�&�/�z����D���(Pf�Br��Z�)@QئhO��8��?��#��A1ǫ�:���9���]N�N~�c�2����~��z�}J/�ˣs���L�HG��Z�F�1�f�ږ������H�� G-(�G�/Z�q�=��EM{�vc���n�Dc�5~+�ⷺD���	�|g�q$y�$������3�%9f�vx�a��c����'�b3�I|8���`?#m�'+fIߴŕ��<��l�����
�8&dQs%�6�s���w8\�����E%�
���ʿ���zv�������r&�jX�����W�o9[s��ī=��'_"7>F�`��}7������7\�At�u���#��+׎LD�
lF�����#������P�����@OW�A�u�yQ{�z��7�눕â��O�,U(��0�.s�c�i<��$<�z�������^^)��3M�h	�e���;]�SJ��1&q�><���	��<�8�-g6�#ZK&�+��sJ��0���Kߊ'�(�~��u[Pn(G�O�E7#��J�$��߸� <�$��}Q�'�Ij���Cl�C��Q�e���:�Ƣ���z��z!ݳ'��s#f�ӷ�EF���vzA�
�m��b�����ml�ME��(eg�W�a�m}�y>�(��L��D�|����9�
�z��o�SnÏP]̭w��X*"���f�TL�DZl�l�+�T�x��j��P<��+ob	��.��'-W����,;.�S�V).`�@M�Pbv$�y��!
�_��l��b�jTF��9��@�Y\�����S�,�eo��71E�<F�^�H��>i
�o�&�Y�w��f<�D]uA�
���>3@3[z7a@�_�����?��5�oD��%{��e\��?��;������"����1Yf�<��@g�(���f�������{��J=t����]���[���i�7Æ;y*��WU	4A���h�j��b{�#�`�X�(஺;�-*�FX:@�v#�t�n�`��<���z�؝MC�.���55�h�9s�s�<ׇ���w�Y��������/����HK(6�P�Ux�¸�W�͂2Ҥ�Ph�����y!91΀�O	��R��t1QM��8��L��a�Y3g�p�Xp�G��K�d.���M�@�%!��x��g���OG*@��E�ܝ������z�k�����ί�@�=�m%?�Տ'� O�����d,�o�7{9�	���=���aO(3�Me7-g�?�s�9>	��'͍:��ٲю� �H��`�����v?��s9$�w;�_-����L6��2������ȎT�����9X�U��q��sg�o�������P��y�&E�#����_?��g�}������=��_}��?�ŏ��ų��g?����ϟ������6����������>������������g����>�h�?������zR蚎=�'���0�]�lE�)���ğ��e���/�v �^1��}�Px����뢬6U�W�'M
r/���jXR���54��&^:���e�j�zG��~Y��,!�	�t��V�����Ui������R�������l���ol��'u��d��?t�d}���y3�f�g"�w�PKE��T>��W
�#pip/_vendor/rich/tree.py�Z�n��}����y ���/k
�[�k��^H���d�P�^�^,
���� ^$@� ��/�'����l�$%�2�쮪���no�,a�>閉$ϊ���xVYᲯEY��m^�,
c�]�y�g�
�xA�e��`#
���8,+E���2��&}.?]�"ŗ.;�i#_�b�s�}��:֢���=�N�z%?_��*���e]4����	O���o�K��O�Y�ۉ��+Ϋp}��qv&}�a�f���/�E��mN�Y�<�e���Q�m����jVVE��`�ތHO�m)���K3�k'g�.vܔ�@������H�zڍ:.˔�A��lܢ$v��������j�mk��"��g�Hy9"��C:��CP-b�e���'q��H�y��z'���yQԼ���]��a_6}�)m�A[:]���q���/��"�aA RQ��ڙ���E?Λ�Oܮm�1_Y������;�₡�@��q��i�IG�+�l��a��7Y��=��Ի�%�ŗ�v��p�M5�d��B�%.��/W]�&|��]�6&��}�<�����a}4�k�]6E�ж�����HC�Ո�-����,���,fMo��|k���`�g�����p�q������r�!�=7b��Yʯ���e�;�ޱ�	y�.�FK�Hl�<3j��4�8�$$�a��C����RR�3��M�c�ʀ�Χ)��pG��w�/~e`0���in%9��y~��v-IA�"��9����&�:�R嘥�l�T�f8`g��A��0Y�K��2�	�W=�Ρ��%��m{]��t8�:������f;�d��j�R�k�ZAu7d��=l��1�Ŕ�%�Hr�丒|�r�Zэ��oN��B����7����oϾr�� ��-�*��?�2��ۗ/Nρ���|d�J�><8��_�o;勳�Ӗmى�Vȇ��m����O}��_�;��������_��4�j���?Ÿ����2x�8	��[����hO�+�Cl�y�`"��Y%Q�*�.�*�~HfzY����7aX�j�xa�"��x���g�4�U`��r|����.3�_B��m�q}�PG��Й��*�CS��o�>���eץ�����*��.�Q�2��d�R�"%00\׮
cm9�*���n������q���2� zy�fΞ^Ǝ�����3{��t���_�,�X�%���W~�m�ט+��%Fh
T*��ή��0q��xR~S٭�.;�Y�\`�Y.!�cDy���D���*�/��`�Ri~I��#��$����]�MQ��� �T"��3����0��1eԡ^�.�;�d����C��uQ �=4�Nԛ4^gw�����q�[�Ww�E�3wآ6����4������F�IV�
�����:�ŠE�s-�j�k�$�	�e����ub��ޚ��b�na�c��9F��(#��g�����D���gd�<�M���Jl�X����^t���V��Š(�9��7ꮏ
1�ڣD���jpi��n|��C��C;������*F'�0$|��Q�����Ƕ�Y�ֈ?�/�y�q�P�u�����I�'��eV�?��[զ
XC�\�m�o%���I��+��m�2���jGǼU��2�f2��]����@������:����#[:���(��F���x��������D����`��>�ظY0��Ʒ����"�R���&"I�P}���ͰM݇��Un��y�g����tw�*SQS}ٰ���%;@���뭉�x: \�Z�ZI��k}K���)y��%C�v�����'�q,��6F�I����7�ƛ�h��`�4�b���?j��v�uG֘�����3�V3��.�4L`"2YA��`��Z0��?�&�P���rS:�E�� �����ܿQ�2n~yW��M�KA�}X�1I�
~�B\��*�in���N_�~H]e�/��"�V�����l$��rR/��`��u������<�T=�[�}�Z����0���ؙ`���L�-�0����ݰ���X#��}��j���8J��|A-�z����Ѕ�cT
���.,Jyp&J:a?��_��/���O����}z|8�I}�������fq��ԍt��bO�?r�O��ǟ��)Υ�O;Sd���~>���\����G�Ă�GG�G��gǷ~J��"�Y��9{��J���3	y�m�,��Y���с���+��]� =5���{#�%WEw/�f��Kż����	�l�}��0��R�fW!� ��K^�*g����u٦h���#�T�h��6O�˾ˊ8���3hќ,�̒wF;�n�f�j4u�G�
ֿ�����%�P]���]o��F����[?s����ѽ���@�6Y��ү�:�,X�28J�j�*pFD-�o�j_�N�,�Ⱥfz��@�H�ϿWÕJ/��ڼ�CXhk����i���@���c�*Z=o�5ɴ�G�4��uD#�ݗ�xQ�֫w<���kպ�/�o(��s%AfpAj�	�q��O���e��vxy!`��{�PKE��T���QG pip/_vendor/tenacity/__init__.py�<�r�Hn���G(����]]�y��g�ws�+ۻS�)�E����H-?,�\~�{��X���!˛K*����h
��=d�z[�ŲboN^�����u*E����K^�0��.RY�-��}�ۣ�c���
&g��E��.��rYs�/�|��
r�[vͷ�<MDqp d,�R$��������y��	�	��<co� �H�ƿۼf+@���K(d��2L<�b]1��8_�SɳX����DF#	��E>�8@s�_��܅c�"��U���z��lBN��y�x�*��Շ�󋫛�c`���RQ���Բ�eζ�����πÔoX^0�(�U9�)d%�ń�����B�D�U!gu�	�p�u@T<c��vy3bo�n.o&������e�ή�Ϯn//n��kv��������+xz�ή~f��z7a�d�ú@��I�"	��F��y�*�"�sú�E��-�{Qd���J���%���T�d�+z�YTxp�b�:��<OK��ڟղ<�\	�{�F¼d�y�Dfʃy����L��=��3���JT�<Q0q��uQ��b�����a���,��k�?Al��`��j��)��2��a�Q[�+���$!
^J�C]��BE!T��=D3Bg����a($�Іo�=���@r)�Cs}t��ǒ`
�����V��^�f�y�����ộ�hR/R{���_f0b��=�%Z�ɪ���*ߋ�3D�w��("^Ub�no�p"R���.h�r� {���Fh���RT�g%���GRg}���x���K(_�s=gB�Ò�����8���Y\�"o�l�?�_������̀�E��N��E,��™�M�l���,��(��2��t�9���>�(@MCYR���4zy��KVngH>;���x-�)�`#�,��Ea��2`�ْ�q�'��W��e���Z�Y�C�pH!��N�Qt�Or�&�䜡���,
12��Dv/�<C��p�rn�,��1��Jd<��8a:�ă�!�V�!���x��@���#+D�^�׹�2a����0�N!b��+�
��ZB�nga��C�O�8@�x�M�\d k�x��_.��.�!�~z�௉�@f�f��0�q�;���>`��}�A@�/��}=��r|Z�砄���kQ���[�y;����4��A"��
�ٔY�cv�m󤖷�e98�(�Ţ�ͳl;aGG�׍~"\
��?[�w����Ԫ�C�%~�`�=h���F$\0	��Ć����+�W_ V�&O׼�+��[祱2xQ�旴����Ul7y���E�lӿ�����+�#`ߩ�
|�������T&�zdPj;g����NO�k�k٩��'wc����BG���� ��bz`aq7 �`��~�?�%r�f��|�
c�L"⏠3LV6�>�����0��DE�+�+EO$'�~�6@O�:��u��`�|*쑄\p.3Y	x$ vJ�ע;�'�a8��q�ڸ+�N��{�TL��-��h����@l^h��v���l�6jƒ�ࢋ@��m$��2nFc��@��p�\��j�~|��!���QYK`蠭�8>����۳�����N�
��T*�쏎Au�%�_�h�\�i�h�W�닛?��V��-�w��:=Wl�n����q����+�F1@)�>����Jz�U`�G���z�9��k)����ˊ����8fQ�FESU�qʿ	����:@?�"MJ=��/��ˋ�n���{^H2HU�!/�zHŢR���:A���H�c�����SZ�Lp�s��V0�򘪙���x���~�~x�U���N>C�w�(��b~\��cP��k�"d5����QcpT�w�1����K:7=���N�"c��%��?O#Z*=�
q4t��u0L�;z�L<�G.��f�q{D�}0�H֨�1hTS+��#JrD��h�H�@��q��K���ƨ�|O��,����U8}��|zB^�:�4ֳE�5�EI)n@��6�Б���0�r�1
�R�x�rB�A�&��L��wQy��t.��V�r2�%�d�&h�G��b�Tk!�ъ�uhu�G����&� yOe�ѐ<]h����kQ��r��
#� ٨ب
��0ٍ� ��p�e*�@ l=��H8Va_��;���c������v��d���V�l�ԥ��R�-li
�7�b4nm���<��a
o���� n<B�$�H%T�oT��g�V���I��,����@��A�(3o� R�Y�>-�,��;OÜ��23a��-��)f�Ą9-�c?��u[Ԕ��l`G�
���FT�8�}��g�\A�v�n<��O��6|�um%�������	:l�u��\��S����Iߌ������ �x��g>�Р�6��h��c6p���M�����ĵ�b;u3�Ӿ�6�;M9Y!mstV��4TR��W�j�Y�:��<Z��!9eh'0���ҵ	<��R�N�ݜ`w&,����:�z	�tĶn�<s�ӿ�!,�(m����ԣ�}��!kv�T�B�_}�"æ�ئ�ΩS��p�� B,��Ő�8�c�v��r�7;������͡����ڻ����{im3�=���x�]��;����k�v
fV�"vMjCw�C6����tm_a���g얚v9��g��;�U۱���./]��2C�T��\�v����sR��j�T
���(Y�5$A�A&D��RT��~��6��IX�9�8A�2f���q�-h4�'��lA���N/&�KiMPZ��Po&��l�!Cp�Ћ��q{�DI��']��Y���:z5�u�H�����:�]�r���}����}�w�Bk������"c�b'�2Qx�O�����v>Zm|j�c��5��P��X@�.�6�����hF�R��F���ߎ�R�n]�
W[+c��eYɸl�\��d\a	�xϣ���q�H��`=-���ΰ��6U��%�[Yx*`��<s�
��(`�Y�i
�ʒ�L�̄Ȝd9�'�Ww�@��r5��Z�^�u�n�\�}�"��n"*�6VCu)�u���WX��@�+��V���*�Q�T�
C��۱6|k�P����D�[���"r���%tt�8?:B9���,y���c�2��Sr�<a�\k�Ea��^X��Q?u�jB}��m*�x)����`ƝH�[p��0�����g��R���R�Ջ��Aw�����&�j-�r KRa�gy'n�/nx!�����H�T��T�Î�ot],�5����TU�V�Y%(/T�[��Q����K:6���,�VIZh��jyd5��K��lj��M��%�T�ڷBA����xG���T�a�m
��{���>�7Ȉ/�X`!�n�y�׃ơO�Ľ�8t��SO�N�gM}�&�
V�h�m�g�HOZO����ǧ��S���Z���=7��>D)�������5� t�ؚ��>|g�?�&3fX�ypԺ�n_t�"r�p���\ryw\�*=�h����b�����9��
��ͮͦ�TZ&mF��Wq4���;T��Q�=cp�E;n�1e�E��9�����V��x�D]���z5M~=-�WF�<w�,FB��W5�m}���s'hc��������0�+8��w5��(��[�^��ήY��
�]A�(��vSl4��5���3��t9��>Ȧ����+��]�`�MX�>uW6�5fs���r�A��l`|k��F �X�@k&��_��;�RÒ�w�À{p���ћkw��&}3v�B?�ڛ����i�p��f��f��E؇Rg(V�
��R7=7���w��
���U�P����yuZ�zW����o��J웁"i�{���A������$\�˰�EuI�^җ���*�^d��U^|�/�TiK�Z��:~|��Ś�M���*�xn��3RG���S�1�%~��>���A�H˖[��-a�5b���=�7[��E�j�P�
���qTE�H�"���@hOk�x��O+�ꤻ��L�
�x�M*�D:��0'̴R��@kge��w��>^�����J߼qr���4��B�ՠJ�N���3��*ZԊ�C���Iq���4���N�ۙ�3�V�_S���N��%.�%,�?�q�^U�é���{՞;ɭ��֓@��ǁ�4Fm`u��4Q��E)3�pg!*���l��ϯ)�YoWQ����-�X�
�{1TT�msL�I_
p�T��Mo�3��d���ԧ�$��['�qOa�mH�{���Z�U@5�qM�m� '��ηd�6Y]��&�ֵ�F�����Um��2Tv�A�σ���-Ds�ۻ13E[Y��|�o���az��T�7gX��H:�_ucd·��Ԯ}	��6��4u���0�{ނ���}�)�e�o!�SźZe�aïU7|�y��,�"\�(�펷��u�����]-꙾�+,�>�yF�����v��O��/E�bD������<��P;$ԏ�
�e�w��͗ÝF��C#;�����"���#��5�1�3�:6�7+�ii�v*?`[k݅�2�H>zGV=��`�6$g�kQ�vP�R�'L�4U���
�]��ۯ����X&�@
W�}�N����{~�qϥS�
�D-It{/;����b�wh�ێ��t��Ǯ*����^P�j��t*|~��{;g�
*�pCp�����1����<���4�]�dX�b��+q�TZ��T��^C����ꛜ�����40�~}�ߗ�M>h-C6�3�}$�U�P����sn"�S�-Q����t5xlZK���᧱�^;.r0+;܏O�(��\��/��qՔ_�W���C'썓A��|��v��b�?<�I��v�4�}և�=���{����'��3E-b�Տ�o���*�k��{�%y��\È��W2����c,�/^������ɉ��T}
��;�Z�m�� o}Cu�_PKE��T�ml�� pip/_vendor/tenacity/_asyncio.py�V�n�6}�W�)P�4-
ԅ�:��z�u��I���G6�2�%�8n��w��:�.�|��ՃMrng��C���W����Ͼ����p��f�w����H���(�=b����Ler�-���~��[���2���H�=OPh�B!h	������*I��K���V�S�:���a%X�S!
�א�_�
p�\�g"AXr3wa*'��P���H��~N�tS�q��������r14�jv��J����z8�>!�N�Nd�5(�TpEiNV�r’�	!���6SH2#-֥↋YZ�f���)�F�IaZ���Q��
T*&���`ԁ��h0
���`���n���p<���-\���͐fo�?���W! ����K�,~�m	qj�5BlHe	H��'���l�0�Ϩ�9��v#5�����/�aƭ�$y��@Z��H��zA���Y���K�\�+�p	�V��{�(�y?��J,�fU��En~e����_0��hԪ	���������A����~ɲlD�C�{P�(��Ы
�W9�3�wY'���*�*
ko)x1��g�x�u-���%#"�m���b]�b
q�7q�k�Ұ܊.lE~|L3��SX�KF| �Aq6!�NG`��Xp���2��tA��	\�k�9��w��m*�	A#c�#��gB*���9Q�N+����ŵ��0a3K�n�Q�X���im}����hO]J��N��N�3.��kV�ݻX[QU���K��|���ʝLE/!��=�B	��]���6�*66ɱC��[,�Ўm��m���
O��qA��T��S��ۏ��.���"3�٢S*�q��.W꯺@,˯ݐzUײA�O�?��դi41��>���fD�T������C��>�t����}%s�eO�6S���Ɖ���_L��:��H�*�OE�F�/�V(A<�6��d�څ�o��f:h�Z�_�rC_�7*�AC�?�
�-��b�C0W�
�������$�8�O�r4v�9 dL��vSlb��葑��ꀼ�[�8s��UUjg�5����;��.�:�
���\���l�+��r};�֩X?�k��m�t��n��D���^rL������|	��E��s�:��}M\7�� S�^9|Ϯ��U�9�K7r����g�������F�
���������Z�ͽ�c�2�PKE��TU<k}�pip/_vendor/tenacity/_utils.py�Uao�6��_qP0��q�}�
Z�-�Z{��eEQ(�t��P$KRqԢ�}GYn����e�޽{<���J���t0_|/j�Q�5��U�;;ZV���0#�������9ܲn������(-fPK
�+"�R�u+C���J�$C��n)�@���"R����[ȹ@���.!U���a�]٦�HB�x�Q��c�f����〹Vp霞�F��&d��P�b$� ;z_����9�mᯥ@k��*s�Ӥ%ekR(��V�5��֍��bV�n�Kƭ3|]��vʨ�}Y�$��e�D�x9$��xu�x����6�����p��_ǫx1��_!������l�4����O"��3���@@����Ɣ�<��dQ��P�h$�Mŭ�HK�2b�⎹6rTT��QBe���FU�G/S4�ؓ�qJ��$�DR�G��s�Wu�LԴ�t7���om��h�))y��%~���E�
.���&�9Ü�Kf�2�L�����?��6b��Z��m�X���?p�gm���L���S�až-��>���o�x]�����_]mh�]�1�Ћc�u���c��NC�C�>�9�x�O'������)��;��p��ߑ�:��O������@��L�5K�*��i�t�-��y��p�d��0i���#�#���9�P3���xb�n�s�Zm�m�5�6*�SB��Ԇ���t�����Ob���[,*��R׾}�F�i�:�[���QfD&��'�`�ہ�n�̌Q�+�ῒ�~��4�_ݏ��Qc�<9�:G�h��2�l��v�X]r��)�����s_*�?�������EPY�)<�4��돇�o�?#�j� |����2
zPKE��T�����pip/_vendor/tenacity/after.py�T�n�@|�W�E��4��@�J��BA�QE�a�͵��{�����{��i y��Ȼ��3s�`����������Vf��K������R�H�LW/�g��fb
#��h��\���J�%�B��4��Dc�Vp�@����?2�Z��3���E���!�C��T�ȤPB%iU�iH��i(���~Jvq ��"*z�nUU���ڤ�l����`8��Yl
�RZ��Ұ��D�Z"�d���@�A�vZ+#I��V'T	��KKF.K�j����8*����a<��K>�w��z�M�pݟ���x8����x1�N�����>��w9&^��q�Y�tb��#�	H�F�-0���ؗJK�"���b;P�ɥuiY^�,��%	�+�L���!�u���C!� �Gk*IZCK��幤�	7?��`4���=��`3��5����<C2�Ȳ9�E��bL@$�&�[�b��q�к~���
ǟa�n4���w�1����ٽ �5ZhH�-cխ���GË�e]�;�n��=f=�O��Y�B>�\P�m�O��g	���Ĝfw3oo_z����޶�뭻�V��(�O6�J�_PA�yA{��9t�%�W��I��٩o2���b��V�2�7'H�BW\��w�D��b�D�����V�<>���;�
�bZ��W3�Բ��+���U	['�UD:�&�Jd{R��BU�K4�' �I;��&9�g��M�<^Մ�PKE��T�}婽`pip/_vendor/tenacity/before.py��Qo�0��W�DI�M{ȤIi�-lU2�tUUUȁ�flf�R4����ִ�P���s��s19���Z͋��ӓWo�S-8J8g򛪽����j��j�/�>��7�f-,��P{$��)J�ԒJ`wӊ��3����J�ixGN�K��9����L��P$n ��S�,p	�*+��Lnw�6�IH׃��ZFjF����:`��Y[M��iBց�Jcы�"�͗�`;��hh�QsM1�-��XR�%B�PX��֬r����"�r�0��qc5��voP�d����F�$���؇�i�y\E���rW�z��D�Vk�����&Z-��L���9Z��4&��+�	��b��#��2�<�)�E�
�Bݡ�*�%7�A���E�[f�ʋP��цJ[�mE���kUBū0�C�)Z�,嶅A�ԖC}��n��̓�b>�L'�5h�*�����F��"&^�</��H�1�c�#�#�4�q�	������RI�!|�?�!%	У#Q�R~f!Sh`p
I���9xԴː"��
~�b%�PL�$�n�a������l�AGv�hdo�)5�D�)�gƬŲ�=�sq�������z���]�}�`���������$����,��HV�S�0�����gv��}\�G#��3.��sb'�.��G`y����p���Q?j��f�PKE��T�kbt$pip/_vendor/tenacity/before_sleep.py�U�n�8��+�%��-zp�\�m���vZE!��Hf�&U��"��R�c�Yl�eq�<�7�O`��ֈr���?^��Z
Tp��w]G'?��]�.���9�yF_�`�[��2G��Jd�,�P+Z�FU<�GI�3+�����z@܇�bhu
"U�Am�(��BH�ϰr dzSI�U�����$�(n{
�r����8�.^;W
�ϛ�a<eڔ����x2[L�Hl��(�ւ��0ds��HK�W�P��^���^kc��L���5� ���:#V�;(ԣ2��Rq�h�E�F��"!�/���������l9�,�z����t9����{�n��tv�R�h����O"�/!�^����
3Q��|���%B���(����� -�ˉE��p܅��L�(�
�q�ڊ�0z��Xz�*׆9T<����NHKyE�Ö�O���dL�>#�O���,�_�_�9:ӎ��ҋQ�X�
�6�V"V)5ߚ�N�G��Æ��8�fZa'%��w�2� �ʖ���-��mJ&N�w��6�m���'��T��!�����j�Bz+�%���\�]��ľz^��ү_��|K��o��6�����`�33w7��y��+δ���kG�Y�i�O��7y}��
���A��*�;.k���pA�*N���i&��iJ��`�n�@�mojO����|�n�c�7�!�/P��;��&�ڨ`�914j鎔<�'������l�Y��Ұ�T��Sخ�ֻ^N���K��y��+ѥ�W<�'��~[�B
�q��}�)�w)ϼ2n�,fZ�4�,�l[z��mY��Zg��ae�@��oW��PKE��T�l���gpip/_vendor/tenacity/nap.pymT�n�0}�+��L4tݴ�N��
�*L����	��&�3vf;M�	���خ��AG�pb�{��M�0QE�y��pq����m9J�p�ڰ��}	�\
�5��<��̶d0cZ����3�{KV�L�u�K���4�B)i
�a\���ve�HW.�s�9@�.���P�vD*��� Qp��`a�KHԮ����v�˴$!Qܷjc��z�q�����
�UU��
�·����|2������[)����lnj`iI؆
V��r��f��Zin��`Tf+��XRn�������(*&!�0����x@w��lq����r9�V�i�%L�|5_D����=|�G�@����S��~�]����b�#�j���|ɼd9B�QK��7� 
�K�E�����L��Tڂ�;���q�R�ކ����d6���O����jd��wR�Ģg0Q25#Ȅb�g R��A�1vP�D�ż&&f!E�jC�`R:��4��?�!�݆�SǴ�$��\/��#
�vO;p1��� �T��]i=o)9@�!<�������_"��^��6��dٽ�S�*ƭi�ţ]���6t�^�z�I�zME6h�#���S7���]nC�p_6�Y&Ğ�"���s].d&��s�q���b5�m���G͛�}E߂W�[R��;mz�)r@�f�y���B!@��?J|���A*X��&CW���l�~�/PKE��T�R-���pip/_vendor/tenacity/retry.py�X�n�6��S8�Gi�a2�u��]�q�"
��(��L�UW���{�J�D�'uҬ[���U���|����"�%�/�>z����u���1��bF9<#���:kR�B����9��X�o?9���K�ù�C*;(���4�����AB�����7*S&8�z���]��u@�\d�DP.d)E�B�b
�c@�C �I�(��Zj���B�Ai��	��r@Ta�B��r�Z�<R�	9?�K����x8�LG�hl!���4MA����,��-���1Y��@���֕d��yR��QB�*�f�j����0T�Cw0��O����W������r0���pq	Ëɳ��b�=���~O���b�P
��Hm?�ti��5��e@$J�҄,b����S��Trt*�,�D�h^�(1[2ET�����B!�YP=b,̓�E��<zW׿���h������")�����?P
�)�I�T�*�IO���t��d�?#)uP�7x:tK�n�;�a�I�@oC)��/΀�St�h�l�8�� �ؒ�����F�j�}'�q�3�SmL�m�.�3!���KP{�ø�XB�(�3%�Y@�n�k��Po���AȽ�|���)0���}N1i�������((��-
�N���,V
ic�s�:O,;�m��7$^�<�۝R��s%����l�pw�^��/+^ܽ��rx+�+֦�<`İ`�,4!�EE�e����Z�_]|�.�77OьQ��W���p~"8m��H^
���_��:�La�^D�/���EE�(g��&�[CP�ȭ�U�����Uz�6��H[�f�I�n��(1��G,������Hlq�k�h��ܾ�v��*�(�N�V�,�Ը�x�g}��P�˻2h�h<��҈g��^��,g!�%�2�,�d�ਲ਼�n�{8�܇C3}��_�QO�w�2+&�p�q��6�8~#�ː؄�:�A��u��˅E�T��=ExǾR��������"TN$;��iz�/%�ϛ���&B��	�gty�%�L���@~�G�OM}Yb3�7�{
d�,��)j?Q�⮅��l^�$��Y^�bM�%�U�!��w��2_Y
R;j��n#)�t����
:���O�,��Ḡ�;=┟,
��a�}�+���f�Tp�;@���s��;-�t͎��C��m�õt��?;�/J
��Vh�
K��n����%R�񈤞��i�B�w�g:�7��+М�G�m>U�o�@wJ��������lI�ښv>lL�����w��jk�1�k��3�{`�<�q�~�|;%�eww�0S����=8:z�*�g�:27�_f2�I��^IU�/W�CV�?| 1o�G�\�B���W*�*e�����[~�՟�m6"ǟ�T��7��-N�߽��PKE��T�V�u��
pip/_vendor/tenacity/stop.py�VMs�6��W���#ӎ��Ag��J�$#wD��8 ���-����_��J��t���Db߾}�u#U�5/��^���Ͽ���_��Fp�p���	ΎP�N�E��i�����/����5�)����g(
��HZ�@�,��M���6\I������M(�Dk�@E�RYh7Pp���k\B��Zp&3�%�_fC�ÆB��������f�����r�\F���./E2�&��4_�X�(�h��6�5���d,%��-Ai`�F�Y�.5�\�}0��K��Xrn��ic��*�~���I�1L���I�'�O����9|�f��|2��~����d>����[N�dz�$���j��H�,��#(T+�Ԙ�gԗ,V"����v�F]q�iH^N,�W�2�W�j*
���X�m/�&� ���2�?�:NFw���e}�؅F�{�[-����u�<�̕�,J�q���gh�zĄ�IA�	F}��$e�IG4|3�U�0�d9�,�0�pg�K�Xr4A[
?;
�ɪ�.T��s, I2��$�Eѧ�Bj� <����5�J�V���T<萑�;.�I,�VZ���H�=
�m��m�K���+���r}�]��ػ���p�x윥�Sx�pz�3%s�{����V0���$��`?[�x�$�:d�qp����Ymlp=��;�=�{V��W?6�
�c�x�z�4�|���/��+�Ι�����Wz�K�}˄q��^��Ut4��eBi���(�����6�<;A$���/���� [�6諒�W����o�¢N��X������jh7��^ګ-���tp�l��Y\�S�|
��'8^ڱNZtT�z=��)Os��	�s��
�7��+�6�k�?�����
�س~z��F�_�gН~��8��sk�X�
�PKE��T�"9�a"pip/_vendor/tenacity/tornadoweb.py�VKo�8��W���J6�E��b�m�-�"rRd�@���̭L�$UG��C=l9q�VK$��c8$}SY֊�W��	��k��?&�H��9��<A�1�J���l&%K�Ս�Js)�*���ݐ�E��`�j�@�� �����`i�H�,8	Ž�MCӁ���Aȵa�(��V6�f�c����n�Y#4�*�(� }�q>�-��ۄߋ��_+���V����Ia�v �\!�i��7\�h��SH()�F�ue��+#��J�N"�G.\O�y�����>O��&��|��Lo7��vA�w0Y<¿��MHi"|.��O"�M!�6_⑀L��t�	�xB�D^�!��P	�%�-�v!5�K	��[n�iz^�
��2�k���$(�ɔ�B��0��"�*4(X�M
]�5�x�F�6���7rbnK�+�Q�X�<�a�����"v��T�����Q�ˬ�.?���ٔV��z���D��R
���U���pbb{`��{����<�r}�q���Z.[�>?�0Y~˛bq�7q�i,2�F�{nG`��^��B2�tbV)���%)d/lfp~��*9ף^�D�>��ltKi]Q�x~����ӢC�v��,["��h��DBB		��r�x.�B۞n�L�j��Y�m�6�3ط2q"a��{A%���Q�b�������
R��<x�_&p0t"��h�d�����㌯1���}��k[ܴ��r�?&fܖO&ƙ��۟Z����أ{��A]4�)�[-�P��ǃo�h�-���:��T����ۇ@^w�^uU��9)Y��[�˳���n�Y�I%1�5'�W6�뷗W?��[	5����!�hgd��O0$���㵯c ,N��9�N$lL�DIwULWA,��Ĭͳ�Zi���F&��*NYQ��:4�
U[�D3�;PKE��TZe�Y�#pip/_vendor/tenacity/wait.py�Y�r���)P�!�L
)y�RJ-W�c9�RJ���\.8I�3�,�1�=�;�
�$����(�b� r�F�~�
=ag�X�X:v<:z��?�s<:>bo�L
�^r�Q��'[T썶˒���dz����~b�|�^�l&L�	H~��PV�X��`ェ��V�_�X�;NF�G�j��+8�u�r0Uڱ�
����e&��OE�T,�y�I�R�V�-�1�,�U,��qPs�x��t�;/�ҹ�d8\�V	��&�,�Y ��_/��/o�!�'�2a-3�R�9]3^@��O!a�WL�F`�i�ue��j1`V�݊.3i����m����0W�;�a7]����fw����޲����]]���˗�W�xz�Ɨ��?.._���p��/�!%�P��^7Bl0�A [�T�e
�Ԣ����0
�B�\Zr��x3p�d.w��J%���1>M�u^?�uƝ����H&��M��tkVNJ'3��jOr��瓳��gP��'�ϣ\��3�3�e7Zt:�4�̊K7�r+z4�r�����x
���1Zf��LE[-9���& �=?^�ʅ[�?s6��8{2�Y��(H3�$�	�n���ÿ�y���Ч�靈��f�|
6�.�CxF�L�ݖ�.�b�j̨c���)oB�桃��C+���'D�c�FPQ.!{(��2s��3�m�OK��C�-s6/UJ���Chx���)��Dڒ��wIm�Z�8.��^�z�mh�E!��|�U�r�0��R9�A2��­�Wq��ۨ	��
�Ԇ&^'!��/��V^�V>v��;�-�b��lZFA�^���23-��K�`��p�$�l<[c�J�Q��4t�-���FDžMy.�j��n��f6H����H��^��V]���;�D��<l��=$��H���H������}v�z;�:�ɡ����v��,,�
j�<=U�]ȼ�Y-�I[��`�œ���o�2���ݧ��/?��el	�m�%���6��V�:��2p�ՂRs���{�^
Œ�m��2,�F�`��B7�� U��b�JSO�ъ���N���^I/�i����������G�,D�Y�{���;>1���c���xX|jY��G�֤	���o�� �{��B7���D^8;`������Z��%ad�n���w����?&ڛ�E!	�&�q�T&��2�
32X&ToK��
Sz��Ɓ�����n�L���*5"���B�>��Bm���T�VY���T,a���3�J�#">܏$�O��s��L0R���,PBCO��Ր�9�+ϫ�쉩�h�O$�#�m�j���Q������'w��F}8�!�s|o.5"b���I�C�E��0���*��D(�gEx�U�S��|��g��.�FX
�ų��T��vbnJ?�.(��ӫ�q�QGt.�@[5��S�"m�Tf4�!6�Х���B�!��Ql�c"��mHWr�"�7��e(j����D$V��'>JX��i��Q��l�	���h�16��`�_0(��6�t�VKA��e4ӥIEͮT�3�Y�v(�'�W��J�G�!8_iw�y:��>�@M�R
mh�z�*�N�����]�X������qk���.�(�K9������wJ�@	�{�G>��
�D�}��E���o�e�u�	����@�ٵ������1<F��$�>r���Bc	�V��h��<��v�@��ڮ��ü/#����-^�aя���"�ʐ�r&���J�nU!�X��U�o&��L�;,��"��̤�to�H^S�_3�5��&��
~p�0\J�%ZJ��"w�6\��Y�,vN��D(��^i��_���@��y�����JLo<�vQ��9ئQP�S�8k��]�jh�[\{2�Mx��*��8$2;�&]J'RăF�V�B�À���a:MKcC�U��f��+/
#�d�y�.'ɞB��E.8�*4h�Mv%N}�
��/�������t�<��F�M����z����/F����ݳ#�
���ꎊ`=u6U�-|M�B��HI�v�WT�TG��2���$
�F��̇A�Olgy����%%U}�W����0�z*�x�����K�Xj6W^���-<��cJ%a��`�8�;�PKE��T��%��pip/_vendor/tomli/__init__.py]Pˊ�@��+�x�
����`"�a=
c��`2:�]��w���ttUuW��ߥߓB�d:���Ϛx�u.��s��5-l��ru��n�x� ��Zc��nڐ��Qg��/ћ�
k�S�,#�0Q�EA ��k)񅏰����1`�b�.R*mE������;m�C��4������@��b��Q��dsH����N}��/="/rq�>gpf� ����߫�ֲ��1�Þ�|��#�^u��Ժ��Wu(���o�S�ER6��kz��Ҩ���PKE��T��i�iXpip/_vendor/tomli/_parser.py�<�r�H��j��d�bK��3�XM[��#����]��`QD�8,�5����:P�����e�-�ʫ���������Q��se�"�ɀ��'�W� ��1	n�ل?dv|x|�&^�À�������4gY�>]}`y4�	��ieI0˳8a�ۄ� �Z�$^1�]�Y�p�e�j'�(μ,��T���0�>=�{3_5g<�f!o��)`�nE��q�S���[��ͧ$~x����6���~	"/y�o��|
�E뾛pն�b���d|>�gO�g֓��翌.�ϕ��K7�ݹ��,X���0����y��f<鵺���p������C{|�Apë���=�\���ġ�:�2�]���X�ċny��q��Ujvt��n��z��l	#/�M9��=��|���-�7�cx�wi��>�,�#�P�<I`��G��yj�i�% �{)r!�Ff��#9�������3����Խ�\���/��5����&s���g����h/7��0�Ɠ�%�5�6�U�wS�F�
���G���[���g�?��1w	C�r��݋�?!4S�e�2����5Ң��i}/���
y1e���σ� ��΁p�b<#T	���iC�_G���}<iƾ�R!������Ƚ}:��Phعl�~������̜�����{%�x��l��V?�V�73�G��P��8.8����ѩh�q�ʭ��h�{Ix��%,f�۶o@d���h���"��&�N
�p�R�g�.���S҉�܏�|�$q�//����;�3��'`A���,�<�s4�,Hq���9��C�?�Fj�����Ǟ���m��g8����恟]���^O51Ԛ�0���d�������=�l?����p �Kϲ�q���B�YN�����$2�Ȅ0�$��%�_}�A�*O36b�<BqE��`�1޿��|���"��Y�
�=�Nf��G��
/�H��k�I-9�߻��S�:`$�o�<*P��
��χG�� �*�>6z�.��k�3/��{�'�b�&�	��Z �W���c���~�����)�Kc쓂?��#��H�C��4�)�:���XzLX9l��q��{�#��l�g��f|�X�t{�C�ݦ����H	�/��jb��;�ނ���=$�'!7P`�!M!�1d��+�]q/J�9Z��<���炒�%*�$�y����Q�]�k�-P��4㶡I���/��H��O{�_H���� �C3z��͈@3���l&5�9`<�c#��
����+?^��ʏ��O_�X�HI�-�����0#;�����	z�?F���D*�}�n$��Ch���b9!(�}�DzC�A��P$�5���I�4���d��3Z�����	)����	;��B�D9��]���*�	�F�E�0��WON��tk�lV@-�����^E��I��GsMV4���!x9�Zݶ� i��>�y�&����]}����;�����$��N��F�6�|Gx��[�}�h�|�*�%i�/���a��q$
m$���֭lL��+
��V[.��`BSg���L��n�������/kD��ĉ�ӼEF)z!Qbג!Y	3�@��T�룖��ܤ���pg+o��&�-D��6��"�C"�2|�j�gh!��:AD�@0�="O�7��
S����.�O�A`�%d�3f�?�01:�)H��8���DB)·�l�5!�:,}�2�A0��������Մi�a��Ad��Iy���
-�}��K�b`D]�m
���K-�
Q= A�ΰnqMu� ʦ�
�nA�7�k�`z8QJ@@��H����:�;ճk`�ع���P�WÙ���y��z��~��W~��C���C��1�t!�*ɣ�\t�$R=P6'�t�Mm�az�Qb-J��R;����^;��Ԣ����(�k��#z
�(ine���l�a�t���"�0�9B��@�J$z�T��L��WjR68=���3�Ys�o� 0����8R�Xk$Lt��Oh�!^W�#]�yy&QNi��,�"H�-�ua`r��bc�/	o@��E{�$���Cj+��B��k�ĵ�[Y��mU��F��o�i�	��L�IbN
S�uL3��np_��zO�E��V	���r�E~<�ٿ�
�+j�L)�U�c�o��RB�C��xb�+ʹc��"����X|�|GR��Sa�L
#+��j��H�Ri���[S�_`�6��2T��f�W Ƌ|�.=J~���؃�
\��
��%�U�(�90긂Bƀ°_@Z��g �[�5o�,��Ӱ�Z	0����Qeb
Ԡ֙{G5��ɨ���^Jz��6R���(q�j&�iIB�H2q�l��&�/�yz6��rBh�L]?=O��W�1�H&I�d``Xz(SJd
�Ne!R��]�(��j}'���
DV�%j]*�!�e�
9��3s�ul�GY
��)oI��z�s/㵴/T2w�hP,gw�[��ayz�
|C^���6�2��enk�Z���<蚺n�S�.�AQ�O���gǬ[��ɠ��t��ǁ��q0��8��|j�6�&�%�h�̀Z� ?)tć��@K��CI�7�es)j�Mc�&�f�W$�e5V%,}�T^J��v�g�ȉpu7L")����R���Y[^u%mh��8xX�"d�2�s]�\�����)B�N�D�Dž�
k�`<��%!���^�3���n]jv���n|�u�(6���ri�,
��1P�MƼoU9�M66co����?8��3����W`�e������U���2���ȇb#�ʓ�$�8�U��!Zr��,��eǙ:b0vE�
o{��%$��e��%2)Sڲ�g�������VU�E�zl(�Y[�Q����R$i���+�!��]4��{Qm2�
�-�����٣��@5V�~���EMJ��+�fy�C<�
>�G��S0�!<���,@5;���fP]���?�^0���(���-��؜E��0;z��H=s��q����2'�ďˢ������w�,u��L.�6����$��gK��`G���� �����9���H��c���7+�K�߉�8��L�>Ȃ=<�b�J�a�hiW@w��O;
�o����%�퍦°3
˳c./�JZ&z�CQ�F��s�Ӂ�	{ ُ�u�B:r]6�z	_uW;2-3��t���̶�Z�X�ژvGsnc}6�ܴ겯u~S�`��VP��,"/�!]��Y�mT[��X�+�$%gE�Q� �=�PXV@��mB�d�	[L�Ɂ ���>'�5��Fz�)�Cs�ږ襢^�!!�E�g/x������z��6�>*�n����~mrS����<�MeS|�S~+�<'>(���8�SMzݽخ�fk�lR�-�P�e��7آ�rb���Ϧ���+�����oy^+,[�+q����!{��Ď�����X̰AU���)֠�v�XԮ���K��Ii���m����w�g�3/
�(��e����F��&�;���c�Y,}�ةrу�"�p��ΑLJ�A�f�
��L��:��@d�'�zڪX��B�=�;J���*G&yw���Q��cS=���b����pk1�'��6ڿ2�����^�>G~�z'AslΊmU�0z;�`3o����Υ��%K��j4V,~S�͢��Z�v�Y�D���&GS#�筊lT��6��rk��9FnI�^�ڪ����S	Hd�cJ��j��4����s��3j�|H
�9'�Ap�sک�B3�t<O
p�2��Ԑ~���Ր=o1d���!����2q,��s����R�O	r��4xڙ�<�����܏����BĚWs!���T�xj��ce�4J���O��
��+xM���g��E�u�-��?d,���MF�}�,�c��hf�Ҫ�=H��\�R������~�ڳ����n�o�xM�߾k��{������w���	��ț�Q�Ҿ�o���^�a� 7yS�����@�����P�ZS�0i�x|�Zc�ҭ}+h�F�\I�`\=7�J%�ep�a�LRL�VL�yT�۬%[a[�D�����.[wQ��{4�t�����'�J':�:&*��~V�QN�WS�͔Q���VP���ͣn� ��Kd�!{�$U�0��D��>�L���6UO�+��H���Rm�)��z���$^/E�QW@0Ji�t�n�G��ziׇ��Z��\-;h���I�)&=EY��ش�Ito����b�	vb�sB��-�<0v�-$j͢V�.�~���n�@�^�<(��漢�xmz��]؅�dcjI�Ds�ZJ��5���v�vҤ��R>��;�b��ѹ��`��Xv����Й�':���eڔ����Wga�E�Nl�#=S�ђ��x2�M�4#%!֚3I�b5�}8�3�l.GYmX�#;n�p�&Q)�m�FfpZ�Tl�-�bi��Uը��}���2l-k.��Θ�\���r����*��ZM�4�e
��ɪ*
�U���l@.iz�q�v]%�����h*�2���V+��@u�.YəK-��#թ�gc�z۾��ҿ��ƽ�[j�0�V��	��e���DDP5>�du�X�K-���?}��/&���|���ڵ�`���9'?��&�H������e��_�\�I�*{X;��VjP	y���У\=�}�Erp&�4�`���DI����|��*��>x&���Bt����m����G�L��8 ۡ��cS��!�ݫ�\7%�z�����T�(�UA?5�.�7`x�a��s/%8�=f.]U�ϸ�OϪ�Mv�
T7�g��m*���:6�JY�8�7��}���K��
�r��,M��>�`u{�C_�f
L��$�R��P��+��k�:����d�����:Q�������]��^��=�1�{��^FC�x�#ݹWd�����}�@�@P#{x_O�i3��t�6���p �b� E܆gJPܱ�$>�}Ev�ˊ��ˎ٦~n\��K��Bb�p$�	v�����7��b��o-��yVe�,�7
 ��E��{ޖPS3�| Q��������u� L)��&����C"�֕(c���3�*J��	:��^
2=����޿�py�U�����i��t���1o�Kq�RqUm��&n�׍�xb��ߊCW���)��Q��΋#_~�G�,_
�Lj��%ZCHW>��HĝV����F�›��f�v,B���?��'�ٱ�)�7�p�`��Y��'[��sW�JS��Ж����o�'ה-�ǻw�?���,�wy�m�����[���o�㫲J^�Ԛ:D+'^�
&a�/�/1���t���6,Q�g)�O�=0����ʉ�;��P���y�k7l�^�ɦC�"�(�w�l��mm��D��ξ�H���`�CZ-%C��/�[�"QQ���RV���}%'���=L��H9h4�
ND@JKp��5���O�왮��w�ᢖ4\�>�<������a����9�޺r4�z�n������0]��M��w�z6��]7��
c\�@�1�߬K���Vk:�9o�/PKE��Tu�1~pip/_vendor/tomli/_re.py�Vmo�6��_A(_�T$gka��� i��-�y��H��U
�*b��;���نa���ǻ����u��o?~s���v�R\�<�1
����8�Ǘy�/�fK������h����o���y�KPW�R����Du�b�btAJF�ǚ�Η�5\�FF�EQV���(B�zC(CqY�����Ic�Y��Z��F�o��厔\��ˌH7Y]&����~
ZGI����KM����R���[��	n�ocZ�˂�̀��҃.��d��w&~=�ͮn���4��ݡ1��5����w���;Y�!�ܟ����&��%�ρ���c{b������Tx�^B�`�2��i��o���>q�s�2v�ȢIgo��Z�'��y�J3�*��z�ˎ�����C�#Df��ޘ�q����i������Ay��jjS���q�V�#�{n&�k7���e4N�R�S�s<]��^uӱ�O���Ik���$+�e5
�N�>|��:p�\�8����փ�x>��I3Σ���۵|��>�h���HՉ�L@(�C�����;7�Ӧ(�3�b�܍�Ec��-�����hP��%YVaj��HF�3��Y���t�[BrHn��F�v.��R��a�|�����+�N��Ӌé/~����y=�5.j<����V�R�0�PB(���1�y*�-A�x=����չ�1�*F�F��ѹ��x��H=��˚ᾬ��P)����vuQGb�6"I[T�˲��oW� l(h������T�m��'�[Ђ.�4�hz��A��С�@y�>A[�M4��R
��]Ҝ�:
3��B�>uM>J��N$�ʲ��+��+f�u�零�Cm.*�|���6��;�γ�kij�Fl�V�k��B���^&oz��A7�U��^��]�zAht��˕�f<fc@�h�!!�!�L?�c��C������T�;<��bz��h B$RoaP�l�3E�(3��@��Ѻh<F�S���ĴqKJ�Q���U����A���d�=�n�;������-�m�tE��nɾ����;�Y���tdy����a��+�����&Ѐ��P�b'G�l�1L�`�tZ]#��&&��:ȷ��PKE��T��g��pip/_vendor/tomli/_types.py=��j�@D��\���!���6`���æV\���he�}7m�u�̛��׏�;}"'\Fd�+�n�x���������/��n[�<m�����`��n�ȥ�'��S���6��b���q.G�sW�,G�	h��;�4>	XA�Ā���<��7N��
�
^��s2��epo��1<�
�\'����PKE��T!ImQ�
pip/_vendor/urllib3/__init__.py�VKo�6��W�b/\]z�����x�#AK#�
Ej��W����%�I�!μ�yr�eY����f
Rl
7�ۃ���O���V
k'H��Z
�[A+$eX�ڸx�Z#P5rXW
t�`Q����k����[��w�]�4�r/H�ۑ7��$p���j�@����V{Քp�F����{4�d��P2�(|�R�'�")TY��k�C�e�^��P�Q�ec��T�P��j��(Y�dy���ɜ<��C�c�sl��
��j%znk����w\��i4	.kk��G�ԹK����q�ŗ�7�x'$�}�8E��d{� *ͩ��	��b.u�C� �D�5(�,ݡc{*FQ0�=�������N5X�~��d�G����C��-K���FJ$>>l��M��{�Hً�S^v�\M��E�Y�6�r�3/�+cq2ɛ�YG�6,���4eQ#,�Jd�id��c�r�3=�v�Nq�E1����?� �)�Q��%0����5.�dV�>��_Q�f��~���˛�6N��G��
a���Lx��-��~�,n���+�j��2F��>y)"M��F�h��o]���N�����!�i
���喞�"1&�p�U�$T����CK�j�F��i�*K[�g �4�m���	�+Mz^��`�xR~4��щ����4O�8Ѫ,�?hD�s�-���)����q/-\��g���Z�oi��r�|F7'br�9�$�Q�֢�k��44oݒ�W4�p�����E8LUU�'�\��+Iyz5H�N�|f�}��-|�uC�y�S�($�$�����m�j4��a���ٽ��Q׎�o �� ,�h��C�i��i�|��g����K�8�v�鰦<����
Q5]�m�p�_)p��;
�ma;�s\�kiKL9.�d@5�neu�ӿ�����o��y����>9O9g�:D�p\���;��E�])N\K�’��ht��k�=�Ew@zo㉳+�/�=���y3�w<_����QXK�Q�D4=�N����t�/Ģ�w��3�p�F��߄W0�����os�w�;E����,�PKE��T?r
;*#pip/_vendor/urllib3/_collections.py�Zmo�8��_A8(,wm���@��no���m�C.ph�N��%U������II��8��Cb[���3�7U�e�զ�u%V+&�eQi�ת�j-V��ٙ��g�
-H�,��E�b�N�U?��\k�΄�|&�(5{g�~�����P}W	��f�ǟ��~l3��ه��MQm�����R8���muf�'W���+XJ�ZT�U�D��u�Ub�Y�� ���3����R�w;��x�+��5O�G��=d��U**�~/�b��O�.�&2�:��Q�؊ߊ�F�C�I�����ދ���wFdH�Z�,C�,���H`���e�k.sQM�l������$��ʬ~������P'��+g�1&Q�~g��db����L�w^\(�,�^�L���a�;�ܱ->���%Ӆars��%�77��$�L�bO����O�e�+�����r�kq,��,�qpQ�o������ ����v
��
��������W$m�)��,�@��I�� ��
�srԖI�����.Y<��ە77>��w[`y�4f�o(>��.���>1oZ�]f
~��K
�{Iጳ|�b����ȅ�D�5x�w�s�h��g=N]x,�7��̀:C%����.��UA�	}��^ �R�\@�P�KeK���k���-y
9�2����R�u����8|�W+.�2"i�����Xt�����k���Ι��N&x�����'i�2](%���2�9H��^��4Ŷ�`a˾-���jdy�I���x�6lO5&ͧډ��%��V��iv�w�|�*�cg�
k�
3U�x��ٵ��yN�]|t:�1��<��2c�ü	�M��1�c�C,�\��^����4�{�|!rEM�m=p1�@P���A��";�o���n6ON*��CI�!N8%�˹1?�s�T\*H�|l�A?Q���VsS`
t
��zӃ�Ωs"�kѠ#��x�r�dI���hx�QYYHBQ�ˡ�X�b �s�/���C}RgɐqQI;����<��"H�N�a2=��LL4��Ceb���A�;C�)�Ɣ��R��H���z�e�b�rT-�e'�֙�;K�r�Jl�#�&�ۡ�%\َ�+���"��=�n}i�TR��l(	�OiB7��f�e�u��޸�jz��\�tQQu%�1k9���taݐB*l'�!Y�q&y��[����K�ݫo_Ĭ�����(�-Ö�"�#YO,����N�_�ss�jh��P�`R~_�[e�I;sݨ�ė�g�;X�
�sd�J����D���[��q��|�#r�ag���hV��=������h�x�4��1��%gYQ�N[��0��F�~c��C
���/'&��^���mHs׉��%��:�\F�hP�VXX����Bi'��ׯ�C���OB�F�OB/.��^��M7E�\�j�1��HZ�5�c��>��WS
|���˭��ƙ~7�}��s���<mD����pե��nW:��|0�����s[|�_��C��M���-�^н7�xt(��c2!	z�z�g��ˑ#���8{�@��"$׬���z`�8���p����g�����p``4�=�>�8�j�\wx�6�S�>&�����z��C�;puث��_���r;
�+'���JT���O|i9�*��Υ(��P̛㰙)6Dr�׺j�OLf���`�Ƿ�S)Kzl�s��#�Kf}P�������iZ�x�ڄp�VT�"�f3�\�U��'X��c�t��Ń6v’���C�Jg�FJ��|e�
����UgC��`�^�͓��E�#��qѮ0�au��u:���p���h���(�i��h�f�9�FB<v0�=G�h��/�h��J��h���4���v5O�gl����{$��I�=�3��b���y�������o
�s�A�-�7�p!w1�����hF*CH�V��z��(����h(0�/��i��p	���h��J�Yc��@apRu4�C�a����Ł�{�D�Af�hjX���@��)i+��;�"�t�ud�a{���gsH���#��<��LfsYguv?cձ:�Xt[�gS�C�<ށ!ƴ�W�hY�>����m�FX����C'�e\s�f`=����Z�n��f�
�"���'��f���IJ�n�!��E�o���q�+ˆ��2�.NG6X�*i���>�H�2�fz���tY��"��Z1~�Y���g%"��cС#6�/��b]n�~%Zr��b�[�,֊�
	��,X�����]@8�fc�9a�Q���]@,�^����1Ϗ�5Ӡn]a�>l�M�K�@)s���#;�S�;�&�z�|{X��h��b�dv6G�)���5{��,��3�9�2���fL�{�5�b�b/ɻ�1�d���^%������>��t�u�J���S�������S9b��!�:97��b=D;���J��
Q[S��8*Ax�ۺ����)��
�L����H�Q���7߈���I
��t�llbƣ�x�%:&sz�d��Ѵ+���R��Hۚ��t�zEj�=b֮�;�lK}�L��< �7��4��Oα�?R!��#��j��?��n�h.��8g�	�]֜Gi����ƘwZ��\J����w���"�C��H��z�ֱ=m��W�Ft���c�|%ʱ�7?S�35��g,�6��"e���qk8���Bwh1>A��v��y���2�L;:$‘pξ/(Vsa���;s�Z��7����M�bH�'�p\�o��w�[�M�dE.x>�{6�ʆ�ۥ+񽭐���Xػ

w�r�~��'Ym���!œ �=��>�f�A56t[0��C�z��du�)-ꉘ0�Z}��_�o����ԩӨ��6�\qk�jnn�P�H[f<+W��$3P�ߊ���i�aMY2�Ǽ�k*\å����Z�W�w�GD�fJN�%|���;{q ,J1��n[���ld"͵v�>�%c�[+��?����rw����YI�u�~+��u����������Z�6E�˼�*kKv41����t������KN�xpaF/���
�J+���"�T:w27ʻ3�o�X�5�O�Z`o=������M=�PI%��w:C�������L�O�Ư�8w�<5yF8���lc��dW�R6��lP�$��E�iQ���0��^s|�:ehG��wlñ�yM,s��l�CA.�3E���e8|;~`O/+.ۑx��z��{N���!0��ER%�h6�^MH��O	İL��:�\ �_��������� n;��.%�PKE��T6��@@pip/_vendor/urllib3/_version.pySV��,VH��IU�E�%��%�)
e��
�.���~�A�\��e�Eř�y��
�
J�zFfz�J\PKE��T�U�'fN!pip/_vendor/urllib3/connection.py�<�w�6���@�˙je�s�R���յ��Ҽ�l��HHbM�,AZ����)'��{w?T�)󍁖e�aA�����A��M��"O��`����U��{��VI��_s��ʦ�ȣ;^�o۰�`�,qb�NO��2/Y(�
5��k_?D ����\6dg���pŅ�/����M~O�*�(Mx�=�_��Yƣ*�3�&��>��C��X��NثO�*8u��~Q�vzLTr t@m�i�Y�?�
�r7A '��HR�mR�����>z�"�oB��%��c���8!ż3Cmc6��2Y����u���2/7G��Q�L�	��qN����"ϸ�3JC!��=���`4�n�)��@.��`�]�2=��`��ߣ��-?,9�x�U�D�*���e��<��\��Wt�İ�9M�E���Q���3ca�P�#���^�vK����xv�\/�i�.�\���2{�C+��l����d��<�yy�D��w�ª�L�0�r@i�Y���g#
잗ED
tC�\��L�۫��ddzq���n��z�#4N�
��V�$�j'*�APM��S=��wgW����tv=�/W�o�g��f�"WW���$ۨ5yYK���E�d�DC)��L�d�\��|�� )�_J.�l��<��A��J��ӌ�*Z����2,�W�%�����:r����J=���o0{,������9<��|��!Pkњ�c����p�^>3z��ŋ���g�9H�~���@K$��>Lk�Z:�D#�����4,=�(��,��K`H�t@ �2LR@w���l0ſ��6@�����I&��,Q�c?p=;�]̃��|�ж���ٓg���)�kN./�ӳ�z��<N^O��kVr?���+��q��<���/���￞}�sz�?�g նF�c��,'�VR;S3��	��"�}i�|�-����'1�0_"W���#d�=G���J@�j��p�K [��yy
���,�[x��G�R�LA��a��n��1�"0K�B�{�xÆ���dU���FJ�fӾ4�K�8�PUpV�Eis����-,t����p��q� HH�� ��D�����ԡ�4ݶ��x�$U�R�,�
Sop��\�b$0�� ��O���v�!��<ݡE�}v�$��F�x�3��c�봒�Ns��1#�p{k��W=�]'�Z�X�8��J�p�R~�+��z�<�a��Upqy:;��
��)a�"Q�]E1]�uL2r��0�
��?��"�c�,�.��)k��H9N¾�`�4��hvB�u��j�P�IV��D��S̏),2a�򠱎쓨žb��!���.݀f��<�n6��)�n6�����0Ce2nG��_��p�uF�Kҟ[�c�-�ezS���]f�W�v���ۑ�荁���cf��wRy+T&�TM��p�]��ug�P/L��2��j�n0.p�r�z�>X�1X�R)���r`2QR$+����D��1V�b@�U�
�X��xxU�ȞH���i@�Ye``��:�@�,���,]�ٗa���˻���%J'@�r��g�'�~��P����ZV��G�������/M�n��^M�6'%I1��]e�bd#Rq�8)����eB�C����0�1t�j�`�rP�~Nt�����*l$�3���ݮ�������8�[��9�/��5̅�I�
^�n~��X\vw���?(Xu)�-0�r|�ro7�&}Nr<^����o�?�؊g��(�KS2����a�M3'�Ӑ�k.�4��T����8G��b�1�,պd+w
>��	���,)��֐���`�VG`�g���UFRzh�[���jÍ}.�u'ݎ��?��$M#�֬�ND�a4�v��-Xc�̔?��j46�j8��ō�$jD�O�Ŧ`��wu��tpIҴ%T��?**��a���ɉ;�7X�@���)��3��a���o��U�$~�,X;��i�
]F6�hޡ��P�bA�G2�Z��"7
��€	xAkhK��ڼ��`_ig$���je览
�%Akh�Q|Iދa7¨̅P��L�$��D�*�TT1�{%��U]fR�q&(��KT��@|���B͂Ĺ+�cz�Q7R	h���2�K�|�����ty����b� �:�b�z@7�7���p��T
2Du��`�Wy��#���4�)���2O�|�D�T�ij����`�^�sP�f=:r��t�-����'���L������Mi"7p�)�.�~�)��r�b�=����w��~�9���At�@�nY���Bo�$�A%T"�m�lϛ��m�2�F�Y%��*jd-(�uU�6+/m���EOΪ�	Y�uh�A�ɬ��5�6O�T'ɏ�Ѱ�Z��^�4����t���-��w۳66|R�ҁ!&
�M����3߇��f8Bp�k�u��H�+���<��M���2��h��	��(x��w^�gQ))�84����U��G�U2[h`��b�4u�6�w��/O/'�U��*���B&�Z�<3�����B��Ù����L�$Z�k���º�A�9�铖*
��GJ�%�Vu�`��D�pQW�*ZK�t��rv��VՖ�<`3
��<B#	�v��P�Z�I�%;�).�^��I(�0�A�vJ�m�r.e��DU�38��Z�T�I�~��/��
�$���I4�Oz@k�Gj��K��0�}Ƽ4��yvT�j�uX�߂.룒yK�Ȧ`t+h�WFzS'�V�Fw7�����XdMj��]ɬ?�*~���Kz��h��A�V刌�=;>6����8~z�� j�rNQ7@�3����';����шP��;���:J�����u��S��G�w���cv8���ۄ�Ȃ��0'�h���8�ƽ�����/�xw�X�N�7;�ޠL�K����4�TpW�N��$f�<N�;y�Ǜ��u��.�s�Fw�g��Gy��,�b��(�����]�k7y��(��ޕ��A�S��.W�,Й
�1�M�[�﹧����u��i�A���� Z�Dпn;M񜦠�2P��\�y�|���j��`
�'aE`8��lR�gQ�j,��s�(#܋Egc!�4yI�w|'��U޻O��Ʀ�%EҹG�`y̆��H7
��4�=^4C�]��$��նWY�Շ�q_㸝��yj�~T,mר*-j��x?���!��ҕ�-��p������: ����i��s�3� f���U���̭�FV�FL�Hǭ����nyP�
N,
�)[U�W�[�*.

�
�(�߁��?��1��m���8���V�zu��]�$��������S�F�˿>m$��u�|9u�<Cy&M�or���ݳ�No�)�sL�e�<AO4�ΡG}Æ/��u-�х�50d��<���yO��Y j���<F
����:�\0���(�F�p�'85Mo�|�G߶
rN���|�: 6΁�ȰE�fӹ�2��RG�77�O�Y;PraFgϓb7Y�Y�7%F���矨	}���t�#j�֣�-����9�B��(
1��)��*A���R��^�ѓ��m^���7\�4�M�=@ �Ns$�cw�;�p^��+�QgFԹ`���7���t�j��|�Ͼ�]��@�;<%���-��e41����|�d�q��
�F.�9�i$GS�ԣݡ�!�,�܅�ɩ�诎��t���M����&�8V��9�5W�<1)�6Q#�4���Dym���&��Ǥ���E�
G�^�LU��;�yX�q&����c7��Wy����T�l�I�>6�L.n�ӹ[k�Y����
x?T�#�ހ*1^���FC��:�e|���JS�E��.��UV���g��ܷU��wi�V��0M�����z\����zv��K�`R��M�Pן(��UT�kHF��>	p�����Y�������!A{0�9��x;�7��v�TT�n�sΊ3�b��<�J���7�uZz���������#�\�EX�}����3x����2�淇�`�}��	7�~4�z�v�1��6�설�r~(�jiru����C���?���z��.?��\��SE��W	���k�>/kuI��[B�G���X{xP���avF��td/8����%�B��m�E{��)
y���'��#�aY�����Q�>_	� W\��t�������ݧ _.�z]��c�F쿙Q�k�f���WZ||�9^�
���\4�!0b������O~�҆��l�uc1�Bh�Ř./Ո�W:��3�;�6���[PL��-D<:H"��1i���1D'���g"��dq��Nm^6�V��)���G}V��6��H��n=NnY~��f\�T�{
h��C���Ziۤ�?�5�sg-nӉ�u�)�m��;�<,f�7M���`̪�2�{��s��
&/����x�dq��S�^�J����̙Mo�`4m��V�i]��	�м��zX��g
:֗6@8�4M��p4�C����㹎��zN�����Ű��+�A,��s�}����N:n�P�+�n�����ݲ==1�l�ؑd;Nw�;��pߺw�?��p�>�],ـ8E�Q��0j�Ќz������7�O����T�2߲����R�*�l��%WT��_p>��]E��^�o�^�q2�-X��k�8�8��!-��j��_���G����*���&c[����%!n��!"K��VUROg�>���k.�2�@x*- =��|�~UC$�&QR��X8[�4=�$cK�}�<6q{�K����mX�A��%��e?��
�KJ�,�,,A	�Gr�vX^=�I��۳�Y�/�X�	\\^�:��V@��jzu�I���v�S�ھJ�`���g�V0?��FҜJ�ClS�r��8�wUո��AVm(�*:�>��Q��"�D�i{��Kp��	�����j������f����ιQ�DuU���	����Q��o��и�H��o�ix��֞�v̖�ǩ(���4"���4ǭ<}& �;�P��K�+�f]sB��,6�?B�(~AW�>M�Lb�3{��={���tRs��
�H��{���5L���/����fA�c��$�h�C	����?=J?\ƵF[-�U�e�/��c�]?ʾG�q-rlh�Y�є��'#�u=:;�f-ړ#wџr5��Q\�L�:Ւ�K�3��˜)]�Pk���5��?iIjELf���K��ųesM��5l/SI�m*�O�$�V�˺+"�)�s1��9VB�t��C�5���Ö�e����C�c�y�I�
K;?��/��f����a�I�/w�dP�d#��0.n5�-z�n�
�$6@Y�NyU�Jt�����D0]z��q�:^R�3�7�^W�w�G�5�������7tz�y5}w��I���6��w��SzQ���[OK���e]����S�e48�q�F����&�O@�4�g���+�S
�ź�`�2y�rw3��.Tp//�k�@�/�7]�+�54��F��.���ޫ�< h~���1��w��/wӺ��4��궎��-Ε�4_�J��j�R
q"տ$���
�'��9�9�ױ���e7�hZ)�Ԟ^�
��W�P�\���n��š8ʬ$��Ee��<�x3�J����t�W��B�]�TہR��DBKž�RIq%HC��GZ���M���j��z���n�ﺼQ�j���R!�_���v�I����M���	'}�_��SZ�t�7~���ӧ��X�#����PKE��Tm��~�)��%pip/_vendor/urllib3/connectionpool.py�}ks�ؑ�w�
,U.�^
��$3�ZMʱ53��Ck�q�f�qHb
��T�o��:oP�7���[a�,8�����n,�z��f˾�5�%�f[7]�ݴu�wjƿ�j���?�z�*����(����Tg~�Z��.k*x�=Xb��,���&���=]���C�b�꾳-���7NuU�EWԕ~b|���Y�޿Ep�|��?���*���~�ٽ00����WC�.>/�ֿ�>l�G��B�7q|��ݬ]��FM&2	���$^�u��.�!_l��.����r�\eM��^����:�V*w�^V�Z�S�U�}�m�{��E�#�cV��B��>�S]�s.�Qwv������7>���}��W6ҹ��_/�6[|�V�,T[|�p)�Է�
̲WҪ�9�[��U���ִi��J7½|'פI�����^��M�ݪ�}d��[;MqX�;[w�v�p�t��)��^�?�9Q�`b��fˢT�m�؅�֟`ֶ
0sMX4�2����5��ݶ-g��[�gk��*��/,@)�p~J�li�ϵӢoJ}�CSN���u�f]֬Ծ���n6YY�E�h�p�W�<�4����:8����I��S)_:8rׅ(���+����l�0�Mf/�2����7�
;=���	^��,JX��$�9曓3:��Ȑ���/�v���A@[겝&m�XÜ�3j|6O}��=̓����ISX�N��X�(y�p	뭪Ɠ$��ug�;�anU�PUw�{���%�]��ݺ�1mҷj�Æ,�]�7�)��jzu?�-�7���Y=��D��M])�Bg�E��5{��N���&���f�q���4܀���Ĭ�g�
�E�4Y;S���MM͓v��.���<��t�<D�1��rN
���zF�f&@�OZ�w��A;Z�󄹾�y�52qg�@��JF�Z��F��Q3%��q��*~(է`j'3�=Nܾ`������'�7g�)��J�t�N�H��"C��g%lQWCwǼ]Y��Yu0�"+˙Áѓvd�C0}r��`:�xRU�ݖc^��M	�Y+j���%"r�������h򎳓��*�UiݬN�����7Yv�}��T�,���*nNX؂�����>=�ݔpڌD?<�o����_��&�����^������7
��ʌ��Ӏ���z�:n��
	<8u�ɼ�g@��Mp�P�A:����!Z�X��4�D�M����LQu���#�* Pҹ?�l;�+<Y_	�Cd������Ö,���}���gL/2P�$�e]߾**B�Ŵ*GZ��������.4!�h��5K`�EN;9M� �?MO��޵�OĂ��*w�]�|�SP%W���Ӕ�M_]��-V@Ci��3�D��Y�0�G�d02gƫ2dWU^�y��LXz�3�`ݲdY�Y����@H�
�!����=1�(���2}5+X�j�ui��pY�<c�F$��t�*P��l`�%l��
��bZ�5(� �Ւ��M��K\J4���e���4�1�L��_V�e;Ē=�c)�ߋM��fg��M����a�.��m�[$����ބ�
�[���i�*9�R�s��
�dEG���qO&z�L�s���9>�*:�D�����+�����7���Z;�������@�D�wG��_=��4�08�u��p��F�S��e�`�CC#J�u������5t
���R>K��mV�Ȕ���Ƚ ���W��!ڀ<�F�*�m�+�r^[�<��Kx�aq�4,�2k������!�4R�]����;E�#��MDH��m�n���Q�s��}&C�Q����Oբ�a&w0P��r~@�Rc�a�
�Ϥ���,EW�^Q�*��+i^8�e��Z
=��!�m�@� ��<�H�g��Xt|VQ?�{ۺ��\#0�PZ�F:%:SB�NE�]xR�_g(��|��Y��ϡڟ���Tx@��A9���+�_���1b��ӝ3�<'
H��+���9l�{<C�:��a���]��G5���W�!We��>�j�?1Ű-�60��X�j;|���:��Ă�9�Q{0��CH_^|��ë���닷�mC9��Q���Hй��*�����0���/�gІ�8*@�-�U*'�!we��	Z�-�����ػ���F����T[\&�ҪE�s}?E�bF"�~v��Eڎ��r󜉗��`��S��߶@�[�8��]+�cA�@�%����0Dh�e��i�0m������'[���v|�|��+��m��,��50"4L�'	�;��"U�U�a��8Cr�*3?�z�۾#d��z�PKm���@QY"tđ���nz2y%۾قJۦ���~3s��y�$n`�StW����E5���������7٪TG(z���dž&�O�L�Vg�5h,h,Yj�d�
�}b�i�#�>xz>U��V����d9�$��עfc����<ߨm����Q��F$sOAޓ�#�a&=���O?;[>�ӈ�i�>>N�i.�<�!-�J��&�g�K��H�zv���<95-�z�.��9�@�mYa��F9R�Q>9K�g�`��:h�3:s��h�g�o�8p��A�zI=�쏞�j{:"�jz��iF��R-C�4��������Ǐ]�p����8x�Ft�S3��`���ph2O��X�-�����Ĩ'�����~E���H;���Hϛ�I���Iс~-U%�u�oepF[��>K~ދ���]V�Ժ�Y@<z�cB�:]�C��#S�	8�ĉ!��6��
�U��S(Xk��jM@z]�&�����3�p-*��*y����&�3$����h�Kd�
\��x�+y�̲�u]�#n���OH��@������/#�^��$�m`�Ŧ�$��".h�>��m�0��ħh��|�&T�S���E��dD�F�w��˥5᠒��B��>2M`� ��ZB����E+�]�%mhR���1^
$K�G�������w��t|�&VFV h�F}�d}W�Ѕ�N'�9�$�:��&rA\36�M߱h7�5y���;\!�%+E��>Ty��<�
wG�NT��$j��!:���G�����]��K7�z��'7�
���s#$���_w�RΖBc]�M��^X:�b�.�(�k�|ffs�������g$.E�J4B�<��yS����hG�"k�$l�-�("�Q9�z<�ds����U��6�Ci{�XCiW6��Rx\0c���0{�X��[��r�t#�Pt�U�sc=裂�T*
iv�#Y:biD������!0:��ԤnI�
T���rЈ�I�S�FV�2N�j�2�T.M�g�B�DB�كXz���`<��Q�C�<�x�ԁ�<e�*e�[�~,(�l�
y��\>���&������2㲀�܀B>M2���d�����W5�ڂ�'����Q�1��j�5�@�pt�>R�|Yٟ�����<���7��
�{�?��P8Ԯ�6�Q)��F�ۭQ�!�ƞ��bL�V@�C�uk��-;��2=Y��3�!1��f�MQ�n�3�!�ɓ���-]�g$����f���$���@ٹd�,!���މ���<~���Q�,���ƛ@�"#�m �a�]L�x>4�����	.K2n�����M8�$�!y�8�!��=��B{���qP��M.�3��:s�d��㘙-���PBB~խ����Ғ�+2�~�l#
f���S���	� ~]K��&��۶@�օ��"T/��/;6Q�t
Px<Ы	g��[
t���2E�W�ػ�׬h)�^�DP�N@^oݰ��m{u���7O����W�wbB���`���R��BK41
�����Q��EA�O��ߤ����эM�Ii�g�AIXHڐ��'$�N���W�T.ގ��c\s ����U4s��-+�L�y�����N\Q�;��
��P*
Y�Ⱦ0l�v�{�2}e~6��/< �B1H�%�:�ª����qD��� s�!�c�q���c��/p#�lGP������OV+�vBh�'�9�@ڢVk��')0r��#���sK]�͢�<��k$�=�w.��SVOy�d�P+{�t��L��F����)S��I%�Fy)��nR���z�<� y�h�y,p���:������Tӣ	Eu��YⱾ;�LC(�G#�9u�(���@D��A�H:����mB�	^l�q�>�Vc�zG=b�3����:|d�Y{G�9T�T�d,Q�W�W���:��\��R�
�G�P�) �+��Y�iUE:���ӱ��;B�U�a*s�
�mF f��,g�zp:���G�%�/�ޗo/t�y	i�&[�}��A3ZPjs���/�~|C[�me�)7�z�����i�p���⮂Np�[�pTS,>u)�κ�I��d����'��99==9���,���򸨎���8;6���u����j*U��񕈠䲯��Fh� R���M�{��-������:YdC񐏃S�X�|6L��[nOϷ��Z�1���#l�|z�}`��6�i8���0�%&��V'D-!�+��{�V3�8��YnM#D��5J��ܹtV�{N"�4�Ȃh]�BM�[bh$�;t�֩�A�9�7D.`�{ �
��qB[�)%��jj�
b��O�G&Q�G�A��C�v�|����]-�x���'di_A,Kɕ!�ƺ�����VŖ���i�$V5���y�b���=B�IF�Li?�.0P��͔��H&`��3sWm�e�2���җ��9\�ub�r��I��E����Q�^�%A���G/�qv`��:EKo&`w���D~W�_2�T\y�V�Ǻ,>������s�M�=��b��]AFݤ��O�h���RDr5s�Xt�Y���ᯑ��nZ����\X��3�yn���	��ΝR6���qF�m[aR��%K�~dǰ'���J��9W	�񟣁 �Tݸ'hſ,b�w
Wһ��6�㞗��@�ШTժ[F�D's0Ou�ܴ��R��y#[o��^�Y��cmi<&��y�ϊ��RJ�0��c�O�A��of&!���!�v@����ղ&�wi���p����?��m֭��x?JF���La�A;'�)%��Qit&��q�/��Rg��;.0Ө.��Ģ�T���#�y:��$0�X�p�l��2��,�B�q��Rh��+yI�U�iE;C�'�Al��\=�A���	7!��c,q:�5Xϐ���n3�fcT�����h�OEn\�����3����ά4���V�����Q�;�Ŕ<���Os^+\%w�4т�Yb�|PF�$;��*�ab�U�<��-��8�c�{\�NB�� ߑ��f�2��a��*%0���0��`H�8^{��{����:��3�:�	���M���_���(Nk	h��@s�ۑ���S���+J�"�hp�=xs��Q�f&_�I�a�V�%�I�����i��3��t��V�����-j�q|PX6h��M���w�R�"�b��t���TT_s��fSW��a��-�#�$G�&�
���1�B��"�M�7;[��O��
:zI�6�/����<g{��m�����[
���=��Gk��à*�㙻aM:���yWX�"c����=�_
H����
�{���c��'.6�]�U���z�\�}����T�H'X8�>�k�χw�H��u�	&�0��@^f]F(��\�Y����J��4
@��fשv�K}�{�TC���/��ϱ}�VǤ�yٹθ��=���CsT�v�i��dQ�<�����A�\#=9~��,^{�\�a��&Qr�/��G(��T���*��l��P�F�׍�9G���y!y�,kV&OYg+a�	z�QLB���ޅ�;��]�;�??��
Ų��	�(*f�FIN�E��������}a(��OJ㘻��C	�8�C��m��([��>i<�A��^N3�UpLEmp��j&f`W�dޚ�u4u�v�Z�x�:F�zo%J��J�gR�j0I�
*�v�
���<;i�lk�DKˢ�ï��u-
���[֐�9��p%2?`��:�]����Y�v�����������*�A�ZhNj�gON���S�Ϟ<ë���N��0��/j@tq���EU����.8Z �&j0�VǓ��h�:�b�`���k�2����kS��qam��G�/dxX�M���c�֝�O�Z5�b>D��<G�Y0wA�T�*���r�|є{S�X��$�S%q8��M�s�e�m����	����J�񜔍���)���6���Pc�)K�[>	�a��|�$Zǭ�ğ0���vC�p��m>JI"* |�>�z 3���9�!7a�88��@nh�Qx0�������<F2�h.�}�S�Wƻ�.TΊ�3��3e k��XJ$�ґ�XM�+<v}�z��^5�ˣV�Ƨ��a󲉒���ϛ�ݒ�Т��	A#��)��kޑ�
�����L�����F�Q�fGS���y�0@�������,�;E���I�dU�"t���T�W� ��Q���#��1[��tn�]0�jM��x���F��y%�Y�U��$�#GӰ�r�@\aUI�#37J�4-,���]�n�NXMFuF�r�×���o�m_�jv�-=�Ok`8���v-	��|�%J�
�ӭ3�a�b��{�k���$h�F��.���rJS����)�a��H���A�M�g#�����HS�u��J4k�+����X�D�[!��`��>K���<	O�(8�#9�^�1m�z��u(� �ֳ
��`ՠ`3v���t1���P�SGN�$�c`�)��"dfDCO���y7��Ҝ��g���#!�gώL����,i2s����mu�6)�$Z��(s
X�Q-N,��5��͙&�J�fMA�b�B���S/}���H�Pd���n�~���~�+S-��Lh[:��F	��381�S
Z�nܙ
��1��0A��-׭ⸯ�k5	4ZR�6/'^΁��ʞ��O�?�Dg�C�`��Qc.��7'B�_�۞��"K,�=�v�5�B��zp.
��������.���<���
΃�<5f�ї��)$
̟���7o.^\c���l�(2���OB��,�-��`�HL!�Q:�������>�B�,�Ɖ
��G�D��.
���2�cz�(�ѷz:v㸤���=�OJm��PuI�`���v�^��@�1�U��++�CJy7*���iY�p�<�f�
���H�GM�p'5q��,�ʝ��"��)a��浐h�oYl�P��{T����\ep��]+B"�.t=e2F�
�:�Mn�M1l�LYTp����3�1�ǵHH2BPp{�&[�侸�C]�i�O������N�[�C��\%5�,�?���1̸6d�V��:���id>��c�#;�&Q�^�7v���]C�M�T�`�^��Ƿ�3�bi6Ϋ�wq Č���"�:���(�?A=�ʸy0	��[ړ����cǡ������"�q�Z$�ak��\�ę6��<%Z�pi݉j91�A;fOޢ��ڜ�I�!ؐ0��� K���+	�@.�%��ks�[D�}��0ɞ-v(�;�	�M4]�0�3���
�J@��h��`���Q��vP�BG
bw
&�7����jtwjz�`��၉���p����ޚ�-�G^�fQ��ѭ?j;�
�0�_|��29?E��o���"G_��T���� �=&�����$M�!{��`J}絉��?oY�' Կ1���_c�
^
_W�D%����
!����֍�'w��0�G���7�xU�ϝSN�����HF��@>T��rF����l�a��Hy�bsBLoB�dO�:P�RVL�>�{���/޽�|�f����?\�;B'�<��l6��g�G�BBV�Β�PP:�2�v�a|E3� `H�n2̢�j��=�����Q��yƍJ[ 0�x��Ɏ��3VaĮ�~��$��qG�
����O�	�{�r��(0Xe��s+8�6��F��'/�ID
W,����.��{7�ݡ�@\g����[z�H���8�B%��Gg�<���V�h͝�M(:��7�s,_U,t5�x<VpJ�f�(�$���B������QԷv�"5��J�a�۩6mJ��v�=0p��������c�v�a�&fB-��(>����s#��Y�#h��i�l��n��p��z�b杪NNӧ�K?c��_~��b��nS�yH0�i,ǴE�x�/b�G�lڗJ�Q@��Pc?�!d.�=[�t��\�8�>��$��/"��!�9�T��׎�c�f�q�[	d�jw�
H]T8��WXY$Fo/��6�DfVNLf0��'4o��vצ:�~<����(���Tj;�ȱo4�`l�$� ��[a��5����^A`�}'k$�F��R��$ #G�Sk��T�G�X�q��ﲝ�wo��Cs)���q�СD���1mA����t`	��,b+��-j�Ѧp)��E�����*&�H�ž/[5�R��R���������0��
w°�͛�ҩ{�R��B�=�R�"�15^I���ʁ�	E�o�,�d�,�v�?��j8��#L��xw))ck�5GR>��t!����)�Ņ��Wa�5���J�n��0��
A�
�l�F84'����!�6a�������G?��斾2+�m�P$��ã�C��{���Vyq(�={�,�b���OG�U�c���#0����z��q϶��d|��i(ЎU!��Q]et�eZ�d�x�����X�8��X?9��)E˳B��M��c�!�l�/H7"ؿ�oۊ��HV�Igmf۝)��"^g���fYg-c��9��.�.��3{;�Wq�&�S/�̡3q���W���O��OZBPp�
�u��$v�~	"�������u���2�c�)&����)eBx��=�'�nH��7��f��R��n.�E�~���&<�������9��_���p��r9���J�-D>��6�����OjG�wt�����Qn�g6�+���\�s���/ |0����L�sl��e�m���E/:�2C�f��3��4��Fgٌs�)�߮8�1P�tAc�UT�ӭ���}`��9H��W~�75n�I�Ɇ�#�
��(>"�����Np\��:�v�?�/���܉�J��:r���&�F2�A�.8dz�E�N��� '���6�~��i������
Ih�h����Qҕ���BP�u�"�m���fB�����	M�+��t�O8
�/T-��[	��-:��/���ۣ�E�A��)�v�	7F�<��3�K\ݡ���c-�h�?sSy@����{��
�%�
��0�P<*aрTd����{Z���w��&wr�mGd*Dӽ����C���)�V�A�0x�)m�:��6����pq�B� Ut�	�cl-^G�L�񬡢R����!m��h����G�=��	6Σ�6��:C¿�h� e~Gtد��*DZ��;cW���x��8aԾ����ݺ��=x��]Q���x�o��o�
�ϭ�K��UD�U�ԗ�f��W�rJ�5:���<򜛼����ej��R�U�����n'�/v�I��0�})YcVhu�W膑��l_�Ԓ������&t:���s��Ai�|?��x�C8��pŽoE)�?��~M�i{ �����p�t�a�}�,�~*��T��)�DCnC:p_
_�.㆖��30�6�S�ӹ�"D��n��VD��{[r7ƄdO͇JC������.���=z���B`0��cm�Hd
��QW+,����G�Ԁ�s��
��ҢF�?4�U�)ZJr>2����q�g�=��b,H�+��z��\�v�����=����;��4
��$^����.�o�@�3�JRTe
���ӭA�~���R�_�خ�;-�$�	l�:�:1�����4��N��Db��_�6���z.u7I"A�G�X�3¸��r��&W����*E
}���pc���WWdqK�-�t6���MF����o�)Vw�j
T%����4�����a� �-;�tC��x*�3,��V3���� ��t�骮W �a����{�ѵ�u������j|`�F��!��k_��i��~���ډ`��[�����z�OAv`<���K�n�uc�z�\ބ��aD�#m`�1��>���?uBW��&�n�S�t�4�nwJ㻼��b;h^��a��y��T�����6�|�VU�\�mddzh����Y?-�Й�{�<���
�`y*�$�y��������^<[�+���p~����{C�_ ����p-��~��x�Ə�Du҄��{���o���4B�u���w��
U�r�g7�^0��tzv|���D1��PKE��T^�I��	 !pip/_vendor/urllib3/exceptions.py�Y]o�}ׯ �E	z_�:@��4'��qM�R�]rKr%�o�̐��][�CĒ�������wctƢhS�ˆ(b2˵q���N'"�{4��Y��G�vf��,�{��s.��T
����U��<N�
�0nNJ�:j��Fo��
�|�E�Vv4�)��}����4F�I5x91�7�i�(��Š�����e�N�T�`ֈ�� �%��(����ّz�O_!�֩���y�ҍ6L��bN*4(�Ybj
�؀W��.�&V��)M��LX���p�]ќj�2g֑4��sva��M�R/�ڍH�X�U
�o�W�F.�����k�PM0�Iyâ�P��)��h%��^V�݊�:`�V�,x�;��{Afu,�H�o��HfN4�o��R��
���.���`�rI��
�X'72�؆��2�AE!�b�VJĈ�P��t<K�ۉ�8�4F:��j�uS�t�O̔����mz���Le���vP������[�x�p:}V;�"b������3�d{�E��5�Q�B+���λ�:?C(M�Vg��J��0���s���d�������2؛9@�3X�i)g��@*ix�����	Pp8lt-S鎳Ѣ��2`��jص�>����n�3!��d0O�Y�1Udka���1R@[�
��d�9Ϲ��9�kcE�s�n�s�d��?p� c�6�C�K�
#+<4Y0�a���d�@&abEivV����ʯ,T"LzDi!$�КtEѡ6?N�_F�h8-02�T���R����l��e��0��I�/k�M��Sg���L��[�ڊ����O�:"U̇[�,�M�1ǿBnہ�s�D����
��`���ь��l�S3����#���J�*��d&t�V�,"A6@�A��p�d�
��΋�'���<�Ɗ�+%��f:�cÁ]p�Q��'d�B�l��9��+ȦvK��>���Jšpr[���=O?=��筵鮎I�ǔ��]$<0(S$�X�=��pᄥ7�f/�	�YPmD
q�tYaEĸs<ށ���#mѻR턑��ry����1��֦��m�̊�փ�oġ�f&=&MYO�4��/��u*�4+qh=��<M�l��yss��z�Z~H��,wǺxA�/�) A��^�]���0�5������_�"��1y���Ɩ��
���J?wЮ�̏I���k
�l�;O��1��){�*��A���h��d��V�aF�Ty�^��76�pjV��"bg8,Vf2�&�9�#@z,�IiPڟ��X�Hn��E/wk�֢��R�d�Ȁ�+8뙸W�J�ٸ�z�� T��z�cI�`�)�P�#��P�� �?:�}w+CE~� ���ZS�/��=��[Ǔ�Tp8�rP�\C�I1�S�ުck����Y�~_D��۟���p��:V��5vL�W����_{�	���#�>]]5����q�QoT�_�]�GІ��W�</��U��'����@Q*�Я��u��[�i&C]�V�oX�"�EH���#㏡�)�P#�\9�tu��>���*}��Q6$�+lh������.�ܡ�^7@
���W��j#���!}���@T������!n����9;�J����1��چ�_؉P���M�M��`(�j�m��l˫�p���9MO���������[�
�(�I���^��b!��]�I0Akdx�hx�����o��u��T��}�f�
i���omg�j�������GO�_a*��b#��[��V��X�~�^��6�����sx���k�ʝmU��Bm��X��[��Ƥ����Y� 7oTh}p��>�a��rl�N&1�݇H�N��O�kh�b��*H�����ѳ��Ba�F[_��O���ܐ�m=I��ڗ��9��7�㎃.$[���O*e+�tOP	�rui��H���lu�tм�^ a��2@(��'��Ҭ�r�4���k�Zۮ�:����Z��+�d��:
HZ���b��T�~�W���x��-d� ���r�����88q�7+z�6�2��(�/�%�Xq�a��\���.��%�gk�	���U��\A�h�C�K}DU+�b�����_~Nܻ�1D[9��9r5�m;0D��}��_��ao�AH��z�������PЅ�ĩ91��6�VK�?|���}

��Q|��k�Dw7��x^V�P�V���v�;^Z���q����\�h+;N]�_7-���&��
��ï��+�"��J�L�o�=m����L@���]�;�a���_|����ye꤯*�*�E\Y�Y�X�;7���.<Ǘ9�꽱����t>�]�/����NB?��:��)��8���"j"R���oo�2�D�y�#̺S���>�𾭿w�hL�k9h�
\��G��";�;�e��+#R%Xc�6�_xq��\���Н_y�J�/�Z//�[�Ķ�PKE��T�(K, 
�!pip/_vendor/urllib3/fields.py�Y{o���_�b� ��ֶ|A�*�s�q$9��mP+r%1�Hw[M��ޙ}�ˇ|ɡ���˝�y��^����ẒU�Ð$�"/%a+����~��:߱$��LRa�vɎ�}�녒�FkdKݱ
��HF�Q��dSq!�(�$�d��:Iy�v|B`�R��XQ�I�d�gGy$��
Yr�����<��#r#rˉw�YN?K��k�2�#�q^���=Js�����D�Z�+�d2���|Y+���F����5��.��ed�Y<�����akM���|�5~�ڸ-��Ƿ$/�#��.iǬ�r�d��,�e��	�u4�����;�XZ�~�i�K�����hF�e1���%G��RN4o�xs	��A�؊��I�٣`I�c�d���9A�߲R&Q��2�5_W)���,�6��`��VDK2�!˳���W��:bB��NC����$\�4��f��8}��Z����[)1?:�y�
�p��y�9��]z���'BL��˰
�>h�Z�	P�h)�P?���ȳt� R��X-
p.�SC&�r��K��ᲄ�ڀ��ݙr��2ծF��,��A{�M��B�,�e������{�נ9@˺��4���*��������N�hD�~{777�M6�hcR�����Txc򔴰]��!l�)ϴ4LDI�5��C�I���.Զ����f�%�ׂ6�	�pJ���UKP�{��ٜ�'��^n��C6�R�l���e�E����7�����B�U�O�����[aȪ�φC*¡9��;��E��r����ܞo���g�v@��p��y�����󋫋7��g���n����̛�ϧ�=1�zNj�EPdn<r��-���C�\��fa2�2=!gi�RZ���9ROU���c��'�䙆�3|��	J�"��뫃?�F@����E����x��/�!��nv��dن�(�DK�9i���a.l�Q��~�e�"��.���i�.2�㔋�d�젞
JHk�K䋶A�Lbq���M�W��j'�׀j�4�w�a�ã�$��5����=�oT�б���j��29�OE��bm$w�������+��u�U�U�[jY���w(�˒�u�Ӕ�c:���-C��B��+�e��*fT�����*���hG)	�����
���@�W+��m�vAUA����Z�B�����S&�(�	�8\A��H�����r0
$�v >�U`Ҿ��`*�ge,��P`�Y%i"��q��f`��4@��A^&<��|�\ۉ�3���фqr�����x����w�k��Ϧ�B~�z�=�mN�r�M�2�v���8����ͨf��
bh;�a�qɩ�*ڌ��`�$Y"���l(�܈���m_\'&�f���TE�nsT�19�1rP�þfgf��v��1�ϗ1�̓u�C�+��&x���O
�͑���:b�&ϜMF���,��bj'vQ"*�/�@�75 �H�
�%}��u/�j_����
��o�!�������=�'�z�<�]�M\(+H<R�t
cN6�|�13�|��H����P��duJ�)���dI֐z�r��<��B��(]?m��}U�u��|9���&_w�R3j�Ch�L��#�ٛ�j=�ġ�T����ڽ^B��WWDU����\EZ�
Y�p�5+���h>��1^�xN�+V�'�7쎣���m�VJ>���=�@5ͫqС/9Kkz�����fC@�g�]�Q��b��fa�j Z�c~��DЏ�=
Ö�
\�Ec=\���p�/�솲v��5_9�3N�F`�wd� ���b½���B��?������+P�F�w���0��9���%�3��H8~��:�h;�Y�Ѽ��z��r��;��nu}W����������Ե�g&J_�4ҟ����ϟxY&�����3ѡI������-rM7�z�����;�;�=�kZ|6x�gm�Ϡ��2]�	㵦�Փ~�m�a|u�s3���ݚ1�ت�B�&v( ��0����Mn�K�����S�zNvuk�����4�g�w`+S�V�.�؅,�=V�;��Nާ��n?f�R�N�J"�׷M����X��>���-�*u3�0;���;a�nR��u����|�C�&L��t�Oa0if���G7S����
�f�|4�&:����S;��֛i�7R
ҧ0��4]'t\!^&�7�Ao����:�e�n[F�<��5���ݦ�n8�Z�uB.ԯ����uA�򜘻چ�e{m�o�.rZE�FIK2���{+y@�6�@��u�����!�`xA�j]CQQ8P���`W�	q=����Rj ����ྂ����������"ݹZ=�\�c�U��t�HՃ�;̻�M��%h�$�b9vOw�#�[��֠�0�r`<h�V���{�>��T^}�m�[�����u/D*ϛ�{��ӄڏ���M�K�T`�v�����z�:�L���xGo3ׄ�_�iҫCg�?�PKE��T����~�	pip/_vendor/urllib3/filepost.py�U���6��+*�
�A (\�%h���Hz)�B��њ]�THjw}ɷgHQ�-{7�%r���{�aktE�n0X �^��Z��;I�z%���w����m�z<�'�7{�v�1�Y+P6v��_��_�=�o�
�&V<,v-M�U����ūI�o�>K׮O�_��$I�-�;�-�T��>�7	Г�i��8����pk������(�`/y�*�6Љ��Ҳ$;�V)��4��)�}�-W���<؋�����mLn�3�J��,
���o�T�M�ړS�]����٨���-�q����т%a���{�-HaI������"�U� �Ux�F���릖D�6)E�*�ώu/c�)�A��qUc�u"�N����ѯ��
(-��z��$�x!���<��O����>`�y�4������.F�_�~&�#Z1
�k��l�%{��@Ŀw�i�Zy
��t��v;a�T����2�Sȉ��"l�Ѧ<o�r�;Q�b���7D���E��-�O}�7�;-��ns�UQ�#[t�t���d�5��9���^�
��
�C�$��T~Y��eI��"��/|�������:�"���]L�@ß'�q\SQ�q�z�v�i���C�m�x=ւ��(}EE���0�P!ܠ

ތ��@���H�u�\.t�j���y
�a��G��mri��`�NI�p�eU���W����R��l�Χ^��x�e�-�~�T
���iDc�x��'4�����#���(q��q�:Lr�_�
���PsԺ����ퟆ���+ܾ�E���`OL�#�FӋ���иyN�z�8�V�n��n$ �p��8�+�f��bߠ��r�,_��'�PKE��T1&W�lJM"pip/_vendor/urllib3/poolmanager.py�<�o�F���ا�����MR��3�y��
��A���������H��������O���ޝ��wwvv�gv�mS�E�o��kT��?�M+���eת��O&���.K�iu]�h�U���K���//uu9�lv�Gk��j���<�bT�Z�+�����x���?~���y#zv����17���+S�n�!�`6���H|�Yv�e��͂�����U��G��xA@�����yn�BW���uo��"t��+y�<:F�F2x���k��5e��0����_k]�E��G�L�K_ߨvW���Z]f�Vxf:��@7�件=�me��Aj��%d�!�Ã�$�eY�H-��)�捬�`�t!�D��;��#D\:�4�L@�`����R���jfy^�=H�|2��x����o����/`.�tz��.Քy0�(��8��d��wc�Z5ӛ���g[uۺG��AsS7������j�"�S����yY
�	�p���e��0��IdNWb���Z�m
#��bϴ[�����B�
��B5����d��N������m�
�;CT�I�TeaR��F��օ<��c�~��6<n�^�]A��e-���Q�2�l�����Xxk8FY���jl��]�Q�,
�y3�{�ѡ��p$n�c,y�1/���DO-d�]륔ihZYm���3P�<��eS���F��^���a�NI�={���rRr!+Q�Fh,z����K��)�1w7W��k��<��`�ȳR]�R��9(́��}�F7@_�@�\�ݡTp�nR�)���#h��?}c���cc�4�!n��s�k%�yA�25F� ��6"R��M�t��s�fG�HW��+���AW�

ΖhE���n�M��O�qĐ$gS;�8O�����VL�|9�F6�?��2����pa"1�-`3)�V��KveK�Vu��%H3#�Cb/�u���93o:��/%[YY6�Q���.$QTe���>�lj:"2�/ij���O��vG�`.	Y��0W�]UF��Ze	ĤQ@'�`�Q��d�fɡͭ�!Hx$Yq�N��W[q�;q�͎�o'A�y����k
�w�\��e��
ɳ�pA�A�p�jERQ�Pn��9�!ID��Lk{B+�D��T5<�9v�V��ț ލ�D^�D��
I
_H�R�'��A��>p{��Ԅ�<���q���Z�!v�E�N�In��1�M�Z��]S������YȊH8c�`p��@p�s��Y��B\ht67J���H��- ��R�2�Æ�k�G?É�y<���F&�H�{ϲ��]��%��O�l�=H��i�GB��J��R�����>���Z��!T`�l��t��=3r���#"��C�0���V��+��g�Yˀ�,�t��f6�	 RJ�呵�����9E
i������&��|��f���%���O!�y��G �����%�ƅ٨��%�1[3��Xc@�!{���T�Jt�
0{�cB�Ր"�r��e}�@�:�dh_�#'D�2�-,7݂C}@���g�\lQ�X`��fl�1�er�1�(҈��d�u��H�4dG�q٣��/��8�	
;�=rNtB�Ml�6��-��|(^�wX�E��$i
�I�$�
�����߀H��ݨs���9e G.�K�ى(�%;f�!�NRanH��n4:��.�z
'8
tє����#;zZ���=��}#P�lw1����V
Z-�ى f��|�?
��IȜT&E��6V��ێ�t脽zD�YZ��\��7��f���'1��)8����@�A#7W�?4��4D:iHRu������k����@����
m6҆z�T�:CV����r�om�G�G~���ȝl���Bt�)#����%����n��h�?��'muU$��M��&(-P���������s��V.MK�Y*+��"��V���O<����L@c9�<[>�'�q�]��k��^~8[�3��󯾺��K�g�z��ٿ�x/u���rW�c������t�0�t�>pn�`Ӡ�NS"�C���̨r��|��I��,Ę\D~,�ެ؂
h��l�_�a��Um9^q�_��j�)��-K�_�=��!۔��GD��Ս�0C�jr��Q4D>L>+V$o�"H5$����f	t| ]<�"��\,�h�ˇ�]�I��d�m�4u��1�Oײ����#X6�3�3��eiȟ7�q#5����$B����0��
�բ��]P��7����6��y���;��\۴�h���{;|@R�&xT�K����,!dګU��A��
�X��c7������PA�y��4��M˱�5�6RSO���"�V������"�u��UB�lY!��5�R
U>�*T@��^�+X�7���Fj�������|�C���a�՟�<e�dUx^�Q��]���s
Ny������x��`�Uں�U�p"ԑ���
���ͦB`$��b����b�����^�zl+7��6$�:5{��F��V8�$��ajo�t�0���.�YS"�b�h�����	 ���/��9'7��g͒��Y�������p�i��Xr_�-V���1#ĕ�bȰ���=�y(�"�A�|�a�5���]=ޖ�r��G\w-�,~�ZE'|̵�-�O���:�p�{��ܳH+x�٨���d.�U#�û�
+t�p���CJ[�ٳ�8N&�~
���@�!��gEH���bgܭ��N!�^n�V���Ӂ����
���|]�E�g���j�!]�F�6��{�;UH�5��>���!��:�Q��(eH잚S00���M��\�6��[
�����ȐGT�E�秖'uFkN�l�0���JA���^�N�㪑���w�E��}z��y⇁��(�E������V��_�����w�)�X���f�r��T�#��;-�u�H|?H˩�i���]E�gu�s�2��^!H�����T�8���(_�q>�!�1��w��9@.3�<!=�ɞ5s�1����c�<
�?�F|$ʒ��:�@x�兩�Ia�Z��{�uti�7E�=�����R1:����J3�и�;.��J"���}�>ja�̒E,jE�r/��R<�P1ƭQ���$�	�ی,%y�3�@�e� *���<��9��|47���o��|�C����U�����U?�N~nd2��1Ws�Q�$P�6? a(_r6O�؟�y��Ok.�UZ����B�u)R�1:��cY�0�K�+��>�'��H����8\$��g���VX�Ta):H�癟��0��a��6Gϥ$��o�������*�4H�:��sHX�>+%���i*�pJ$.�Fۡ����?șPR�Hh�E�E�Ņ�� �資φQ%˭+��7������uA�9���T���9��}]���d��if,w�@��Ց�68�(E��
��m�d�9j3����4$�u��Θ��R�h���c8���n������c���6����rp�o]�uN����`��-Y]�(�bD��ը?9t�#�-à����[dQ����WH]�ꭳ�|O��m	�*�F!0�#R+��l'�"��,����&N<�!�-F��I����ۗ/>KK
��R��$�n�J=^�W�����=�ש�
�-���&&sֻ���X@k�<�I���Jp�v��bA�FeHNW�ZРCk[ՊZ|x}�l�?Q�����]]=�`�,I:��M��:���3�6��ˏ�Z�+�NM�ae`�����)w�M��N�-�e^����=�-npㆼH[�M
��y������ٵ�N��3��O�q�i
$8�=��V���oC8��P���ttS��&Q��J�n\�3l ��v!�!q�ͬ��6�1��no|�@o�Md��
,��FG	nCv�F�T�[��ko��X���k"A��͎u�<C����>3�t-%pB{��ώ�8x��p�Q��#�#�9�^��"xW7��3����t�&5��8
�
�;�\Rܞ�`�9�����3���npSa���^Y;��%�A��
��@\� ���0���R)E���� ��9̞
H�)�^�A�o�.ؖ�X)�A=:Ǹ&��s'��YbR���N
�����'qa��ʾɾ���n��t���}�,=��g����įS?�d��K+�i�ʂ3;g�o��Ł�ьIWmX卨����f|?�^6W|��Un�ݺ w��4G�,��b�6W6�w��9/�Ω���ܹ��J�7usE�yd�u|H�MP��;��4bs)vos�&���G���$���+�Y�E�Nv��1w�1�'P!�J9�h���M�H4Ը���yZ AY�1<Ϡ{+:��*0ξ�����]]�� �	���d���z���h�>�खH�ȴq���f��sc��O�շ���Z�����L{��O�ا=��@@�T�ֳ�`�ėF<�~O{�И�Tq���P�3p������=��G����W�a�=�DkV|U�!T�^�OťЭ��{_��ဋ9��E��`�B�rȞ����)ag�\��B�p�@�.c[]G�~s�corᨭo��LrYz���\(��tz@!8ZI���b_��^NK$����p�B�;��wa@%<$ !�a���Yv�}H����LOLǢ�W��庤�}`j��Y�0�Q
άO���Ӥ��m�b+~s�vRK䞐[0���RɌ��{�����xe�o,�['V�R#�mu�:z��Ie<x�x 0��v���B���c�N)/aPVV�,��sQdZt�kU��k�.�ޗ�y����{�!`4
�}6����"��kH2!^��Uڅhe[�w!�z�*�����F��7Э/�1;fT$/�R�Uo�ƫ�z@��[]
�<�A�ֱ�v�gO�~;��}�����>�o-�Y�*��˱�]^���}�����=�ݛ4�ܻ�C�̩�Q������$�\���&=<JZ��ӤŸ����ȴ��O��%�0o�����Iv��T#o<�H?��/����K=_�a��Ov�w̠���qJ�{5�dVR0��Ҕ8)��4{�z�l嬟��[�[�Jw��n$rשּ�m4�i��R"�J��"���[�"_H�����؂H4�����ߜ��<�\���^�&�}�PI�zzE>��$��O��O#NtZ#��u�yx� ��۟x#�?݆8l</"�q���2�g�����K�i�0�j�P��֯��+Dw��Ž�8UQV:��wB�A�]!5H�sjd���:
�\�P���n��>��b������wzE�w���飯M̩T�ʠ|����Nғ�*E�q����څ���*�[�u,���X�q�W��~sv1��/|��_a�T�.徫�{n�|����=���z���e ��D�,=�Ek;�{��������nō:��q��۩�A�@ٸn��Eh�<����a$�Ʒ�Q2���^`�K詿-��(u�Οc�F��Ri(�������,♣v�$�q�2*�?PKE��T����apip/_vendor/urllib3/request.py�XKo�8��W�����7�"��nL:��{h4lڢbN$QKQq<�������V��Al��b=�z)1:��&�le�fC*+��$v�N++7��l�0]��T��
��:���J�*���D�,Vx�B�ģ,�R�D�~Ưʤ��aǔ�a����l�و4���%�A���������2�:���(Kn,��'���Ռ�	��}����J�ԋ�	��;/K:4_��L�ЖVx��D2�R�X�TV��c'JZ�Î�3�Y�pK�����N�$�ؑ�iy�N䰅�F3G�`�!�Nij�p,`&�T�H{�e:'{*@����j{���X���A��i�%Ӹ�s���Rz>8��=l~
�%o���xC�-���X�ܱ�$Κp��R��c���Aҏ?|O6'��?��n��>����2���w:>���/��ۅ��T%3j�K�~<�1�ߵ������"<��?���7�oE�^���#�'$e�ҔR���*X�qEata����K&,{��H:��Jb��"{�-<�i�[3�)�E�͕U"U?KC�]�4����V� E��n�f��}Z��[��7���S�(ո�4<�/��-3�R�j�lz���u?z��4�\ҷ��JR��#���ַ��>�3	R����͢�i6R\~�Ŗ�>�5^���c�z�|VX�����3Ȼ����[��ҭ�S���T��.��t��Œ�^\<��rE��ڕֈ�m��P�'mo��'�kc���rN��3�|�>Ά������`x>W��1�m�M�tu��κ7�QM�e#����
�zcϡM������>��q�w�u�3n:i�m��4�f'J$]'�����G�D?��y�9jE�h���(�R��ԙ�+�v�H�6�[K{��h��8�e\�Ke+�u�:�J*-g.-��}R�.��c8����8WhDh�B�D��J��"�`���s�Z�o�\���&a���ȞJ���=M��[�AXU�,��~0z�|	A�|�|w�*i���./L����F�i����U'��W�n�=��Ӳ�DZ��,���i�};�́�ܮ'hy1�Dm�"��*uU{�o�
���.!I��F'0Քpf����*O�u�D6vp���������[.z�6�P��w��+��F|Q������āO/.1ކ���������"�m~;��Ga�񿜷��Ic@��#����N�UR�nlys��zc�~v�+S�S�E<]^Q-�<�Dt�m��ɴ�����nnx����+��_�Mt���ݝ��������iʬ+�<��&�鐛pe�%$J��]z�-�G-n�QR�nت�˽�ݠ�=K��L�h6O��;F�1ǝm᭵����'�g�=t<��.�>����'yz�,Ҋ[�%]}�ز�]V�V��"�����e���[H���nﮝ9�T��Vf����Y4�E�o��/�[��j6�J~�C�;+Y�D��;a���.’EɂI�wd_�<��w�����|9��H[����彎`�2+��r�+�����T޲�k-�s&#�*��O�|��;���@�n�6��r���?"z���R��Vt+̎��D�a��t�X�O��[_~Ł	�N!;��T�γ}F;��%R|�`d�=��m���<`�g��F��ޭቹ/n���3��£Q�x�����A���'h��^g��B-��L/7B˂�N4~���3��1o��n^F��r^�1���&�^_��r��8/v�vu�zfe�ML��RM}|Ԗ\^�߹�q��s���|)���s6��vN�%
Θ/gc����\b�!l��ƥ�˷ߒN+���mr��	Y�O���M�p�Ng��Wnp~pd�G_jH�\�?ޠi�����^_��s��N7��_X��b'��Z�PKE��T&�m�S�mpip/_vendor/urllib3/response.py�=ks�q�+&P���=���9�i[�(mIT���)Y,���b�!�C~{�1�y���CPw$�;�����ӯ-�r-&�e۴��LD�ޔU#�Y]�m#'���@=�J�W^�VY��_��g��%��E#�6�]SO�i��dŭ�r~/�BVUY��7����5�Z�mc[�򃃃YU�L|(y�}�ɼ�s9o���5�oo?�(Ӆ��d�F5n���Nkys�0S���s��&����
�၀��r��P6?6�xp^�7i��r9��o�\HK��zY̡G.y
H�gi�-����,V͝����G�
%P�@D8�M��z�K���J5���`��ܤ�{�7Ce�}Uo�&˓Jү�z��L�yYH��L�rr���D)JV�y�j8���ptpp0�Ӻn-�̴jX��4:%Lr	��Y3�k�/�s���d�̪��4�F��Z�^�M
of�A����(��B�t	5<bvd�;m�J
>���B%aEB�Ȫ��d�P�/P�E��S��_��D;�*�4�A�S��x(���B����n�l�u�A���m�ײ���T�1f9C����y�I�H<�G�={��O�O�/oo|t�Q !L�c�i�G�t�����m�º�vu����7����__\C�#zxu��ŵzxO�Yg|z���էɛW����Il���v{Yy��x.���}k$z�&.M�K���52��t7����=���e�-�*��;�.�%��'�.�'��G~��CV�����N�g�rU��$�D�ld%�;)h
���#�S�r�����	�BF�U��[�i�尹�UZ�`��9�� �B�@L%V0���,�:
�.M�4�Z�v�ڢ]7�T��9.A����=>�-]�`z.��pF5�����:�ixVn�
'����!���EZ,�!w?��q:�Y1�({;Qߥ ���q�'�IJ)7�aZ�^�|	5Ph�z���B��ާ CN2���e5��wi*���`Գs�&=;��`[�y�6U9G(�˼��bT��A�c$t�<�jL0����͛�8
���
���?��<��^.�&*�5j/	���@
X?H1�������R�04r��~����ʊ������\�����M��.�T���U4/.T�О2_0�<�a1 �9w(h'|\V����1��6.���u�(%�+�}}�XȺ��/��(�q����n�l3�ha���0`3��/v���xӮG�|��L��7lDa�(��0�b�
dN)�E�n����.�z��`�����q��R��
��6�
f���e�SWÒ�2�fU��v,�.�ܬK���v>�Y�\^��,/ld\T��49Ox�נ��i��_̍w-�h�S�tz�w�[k�8��!7n�t:�}:�	x^�bY�<+X�/r�O�w���t�S�@�md��s�ɣc��8&_�u)B|��]sW��60k��jwX�S��4+�	���fs؆�9*06$pz�AT)��V[z=��(��ಂl[V���_�l�M7�6Q�gtFlo*u�Pe�ڡO	 �D�N���t&ڤcoVq�^����IT���E[�]`@O��I��x��C0a�k0YA
s�Ɯ�5͹���Z�*��^V�
=1��b�� �hRT��Q�A��	<6�y��"k�u��,�5�L�*5~���]�M[m��� ��[�.�>��ȫL֖�[�<z��+�/@@c�϶�A�_����5��Z���Dճ͢��V֍��,�����IN�1���7��`w��1�D�:��`�Xy�M/�-��Ng�{H�V��,������#W�{c6��g	6���n'o.ίް?��u6�f�?_��%��9��ͽ�/�\^_��Nnn_�tsA#�<:��G'��%����Kd#������l0���"g�����gG�	n��n�G��jx���y�6���h�vt�~�4��6e��lT8x��W�%��Ӹx�Q���K�=�{W.:��%���M�6%�YJu�F	M�n,s9T�3�1�B5)QY�:~��
4,���K%�V��fA���G���K_:�L��ð.;�3뿎O,����;ۉ��K'�ʦS�䗴SE�,7����f�gX
LЪ0A@��<��A7Gf���'�D3��⳱��W��b5iv	BKh��N�b�
Y�k^���9sֹ��v5�� t2���?��I���Y�
l�i�u��ik���0�ڦ�����Љ7ۗ ^�&�@�e��Y��@�h��i�$/�ҍ<o��ͼyˑ��1+О���D��F�6h�,�z,���r�����ߑ	����J(;�(F�3d�E&�2��=.9hЮ�����y~"�I��
������#w�˥xL�����KW��#m���w��`��:�.���\d��$/�s]灓��+�|�B��	�U�%��-�����l=���d�P��F�6�2�q4�p0	8^(��-C���#�"�Y��A�(+tx^5�Tp�cX��ټu��8���R7�"�Mgg��T�:�U\�����mc�rA�)OrZI�����"�r���d�ր�Ql��٩(��<�ʉ
(K�OmUn��r�,ܛ �~J��L"�����{�H"��u�(v�Z�L��f�ݒ�񾲃`�٤:l�;��S��&ޢ;�N8!�
��J(�L%��ܨ�IgD��t�7C�k���C����y���F;g{��ގ]A�<���[�0Ԉ;���y�O��f���z|�݆p���*���#�R,�*����%Z(�V��a�.ۂ�7z�p��S܈N�S�^�5���ө;+�T�C�&�x
e��/���c�g1:���{r�5�C{� ,���Y�띛�p4�� E��"}H��_q\�����:��M\�`U����J��@���g�(Sj	��L����|`��bRظd��a?5lƒ0Gz��Fw�΋��=�:�K�``�L�B�r���7/W	(T���K��k�ledS6.���ġ�j�Ug8��"��_IP�J�,[,�&�k������������$�3�}:N��d�B��,�09�O�`�i쾎d~y�٭W��g���ɢ��y�DOw�	�� VV�F�ͤБ���+�
�E��bI�֧⻓1�?R󙣱.��V�hҺ���9�
��,Ŭhj咤T'��(�c
�2u��8�a�J3b��R�NP�����E�b!�f�pBKv}�d7q�[ݹf4T�F�7�;�$k���?�`�t�eaE!.�Թ-(:�r��5�E=�_� ��~�����K6�f-.�w�"^\b�tʾ�i��-���A:V�9�+�3P���%���ܨ���3�kXU`��cq�U�j�b�F���}0���?\}��Ϧԡ3�%�%�X�}�2�<�0 NDh�U���T�J#��pXi�����wE�n����ё����O�;��n��\���՛����Q�ER:��ϡ�͋vC��D�0“��F�;%Q{��.n=<ah�֐&��l�jF��p���vy��)��x7F���:th��V	��[��*j�t�.n�Z�04�J/��
�vn��a��@n$�st�J\����Sl(G�F;�r/c:=���qCG�b�P����\\__]O�߽��4���J���8��|$�� �r#5v+�E��b���\��i�Y�ol>��xtt%a඾)R�Ů�2���
U��$��-��(�p5u�ϫ��H��(UM���%X��H�@����J�}�{8ʩ�F��&b7���'�oϚ�����E&�G�r��)R�cJX���n���<���|ϖ�*UϷ���(���gK�׋4-
���q'N��F�/��v�O�f�A��
�=�y�Rn[���]p��p���d���~Νc�η�q?�\l�ƞ�L�/\��U��L�1FQ���@t�!�: ��=����.[ݩ>�&s��W�O֌u(0>-08����TN����o;����<�;�SP1�����_��˅$����Xat/���թ�Ux`�t<^\1����d�m�CР����T��E�L�Mb;���1mNc�D�L�F��ZP �(S� jD����!`��������xH���M
��m$�2|�@%'=����� Cٳ�?C�\)���J�������s�+�q�ļ�@����X�?�����"ܣ��(KdD�D�;�6D�̪֬���Hn2�zH7e�@j��@In�ro�1�>�قE���&��g�򝏦���g��:������|%���w�U!Y$Q����m�q#�eY����D���&F�p��A�(u�*Uܫ��1%�;*���G�x�PWl�wXiz5��y���q(�)z�gqw'��0�b�c�W�4-���)J�.��\�q�G����ӤT5�����e�$�W7g�5e��-}�A��E�%���m�mTI"�L���h��x���I=�M����{��#7�.������
����ʢm�/,���<��H������\?�-E�Xdȩ�ָ��S�T�ЛN�3ө��t�=����#,�u;�s��Qr��%(:��`P(��}�[�o��y�zC,JY��[�u�a��Bi�􏩒`c{����m��}���W���*�D<��ãƅϚE%�ț���F_bP�n�&T��0%k��0>����x�$��-3S0���u�ɨ��mW�`!���O�2x�7 0+Z���>�5�a>�)�q�?�ǧSu��cx:��4<��<�2}���(��������X�#c���H%a4��^xnf���$���t�[�߁kϺ�B%�
}o�{�
X�?`I�P���Y��:hͷ?��ܨ�Ն����޹�>�xf~��|oa��b���e<�����3qd��:.�3:E�~�~YV�JY�O��v���W���&�6?:�(�N���_j��0z �lj%�!RV�[T:*w�;�	��`i�Lށ�$�}��3��Tn�5�(���
��TPq��cqrt|"�������U�0���V�fu����O��#��hA���<�Q:�>��
��$���j����0@�#+8@|>�Hj;+��ѵ�?Z
�)��S�|���Q7:�?~m����v�c�
+��3e6p8���E������X�t��9x��Y�K�'ta���
cf\�*T��2O�i	�5�"��������xZk��|.�� �
�oYaE�paiB�LkWw����贰���I�z�q\.�R���X��s��Ư��_om����;H7���B�O�H���1�,�$��D�<��q"��F�!z܅W��XY��c��b{�6\N�&��K���rG0�����ڦ�:0{H��P�<}��
�w��#�	E8�"�����:�t���cW	�r�;�k[1D�ż��	����������68Lbw3:�
^�N�8#��b,@o��|����lvǨ�5
���zڕ(�T��9���\ij�{�Լ�Z�|�	mb�
��:m
�=�n@(�}�&���EjT.������?����s���G/�>{���pjT��6���t�G�,������t�7˜k���CŸa������|�s�)o�~�t�=�Wa�"�{.���J�[�~��8\�������%u��$����\�M{�~�.�cG�ЁkX�����<]T��	�2:y*ә�Z�sv�-���C�G���j<刳o\��ʷ�)R=#����I+U����J+}���ΘV�a�Κ�/�UD���4o:�>`#��g�+�2U;7��[�Fe������3��n�mW��i�w,��3,^�Q�,��v�)�L�%����'��L��ޛ����@�cj�Q��&l7�h��X�;�=�(MG���{�!zz�)���h���@�7
9[�#Z�/J�{z(`����!������r�=��K�ݐ��(:��8G�ٺR9IO�%�0�N��qH��S̭�X�>�G��ggܪx�
���D��W�w���T��Uق���
Kw^e���N�%z�O'��N���)��� ��iJ	��ì�Gf �jH_��=��ڠ��_۬�[@@i��/�� �*K_x��GS*?�G���g5�>����#l7�ޣ(��������?b@L#�ǎ;)�J�����ZA^ē���Z������S�@�K^D��Tӹ��s�!eA6�䢜ZFAz}��O���2g���J�|
l�R�Q�����?�[5��[��n���}
ݜ���u���=��N�
#gx{�=��2���ә{�}�* `���J��D�H|o0Ie`�WrS����
�cGy�V�K�
���p<�|d�|��?�s�X��P��O���t�c^8�T�br��)�@��𑀲wJĹTZ�
DН�;��\M��\u�5��+<��/ˤ;�O�t)'&��p/V��I��&��dD꯬9�|~��P�TY���e��Y#��[���9�8���G����1��F��y���"�O��݄��@�oB��!�lA�g�n�Hi�7��	%*O�F�[��{Pb�'�_i�O���0���r[a�H�؄t�#2(C��o0���5��k�h��U6�6c�i�NC�b����;�NU.�c�O�#`�s�ͩ�v�`�e�������h7���>D��+��Y�>����(���X�8ZWxf#_��;���O��w�ku�܊/Yux�����v�`/��E{�����ۇ�8L�����*}gIP�nt����r���aQ�>H�"}��]�n)�Y���ĝ���������K�B���7�)���L��=��DIW����p�N2x�z��3<0r���('wwn59'u�9�d��4#��Cx߬��]��� �lj4
���3��D�^��[.NRxfj3{������i��<2ʗވ�jRП�?��ʠ,�-���<=�4:.���&�x�������;B��<��_P2!�ߣ�ރ}�1��'N�;E�rʙ(d8x���J��+�Y{oƹV����;.��*;�.[���,��v�,�r�^˝흹^'s�Z��i��v���+O�n=��l~\_^��A)�A4e��2Z~~q�%�\ֶ'`�;7.��\�r�k��n:�m(�n3�%�S��p%r�j7C
\�n��t}vP�s9}�Jb6$)�bȸ��s���I];=�����ǧ��}:�k/$�"�,M����x������	�܋Ő��W~����PKE��T'pip/_vendor/urllib3/contrib/__init__.pyPKE��T*����1pip/_vendor/urllib3/contrib/_appengine_environ.pyœAk�0���.�bC.�@qB�g�J1�4k��!��dvgz�o��yzo,�(v��0�-�4�������v�q�&�
�,D�f�(E�q&��{��W��' ���O�������i�^�?��Q:�B�N�4��<;���:Sk:atθ���{"C��dC����1��Q��˞�`3$?d@HF��$����-O�5���gZvtT=X�IFF��p
���L9����j���!�l��Q��}v$��qzf��JYu�uKEC�ǙJ��U�G]���\:�`i~:��+��~���z{������v��?���?pO��J���W����M{�u6��W3`�\7_�}~��}�4�X��e�f���p��8�%�����9ߦ� �~�i��C`;LC\��-��J2��,�;i#�PKE��T8e	�g+(pip/_vendor/urllib3/contrib/appengine.py�Z�s۸�οU&c�F���Ou_��<�\�X��N{CC$$�L<���vڿ��x )�nZ�$���b�}�d2��[.I!�6g��ŎgLJ*!rRВnXM�-mH+��{!6@xQU��������X�n�
�w<e�Oۦ���Y��6�7jR���VS��2�ʳj�lEy��|��Qt�@�
i%,~~E>�Z��U��X��:�99_�&��Dݐk����(=HQ65_�N�t�*6s�e�I�l%�4|=�r:;W���l�P[Ѝ�H�wq}EVl��l͈LYɤc��$���LQ�\2Y�zEJ�H�Xs�������QokƷq�~o�l�'�/�'srb���,��f�¿ۜ��
�|26�Yt�=�VC�_Z�P0�%��ܐF(u�I��"P����
h!�
 �V �Z�d/ښ�9O��1��o�5cDTZ~�n%/7�E�(�a�}������D7��4�R���xK�y�urǝ\y%�9e�5K����{��:m��2EK��r��&*t���
S@e��!�^��Q0O]��	�o1n�jOXIW9��
X��Lh.��]���l^�T
�"�,�@�{�O�����+*9(��ba�^������,��B�,1|٢��K�z�е90C���ҷ� l��E~{ks���r��h�TLv቟��ɗ����ӛ�.�7ɏ����99iꖝD��\���ŸB��E������&\�g`���l��r�(�uY�.G��!
v�\�M[+�e@
��kQ�l��;�&Pa"���d�6`�$�	����ۆ%�{�q.�S.6�4��%|��c�����4$Sei��e]�z���ꁏ��3k�Gs]�F�"��nn>xߖ�``32�"T4�3�X�;x�qoj���&xig�j�~�_?20t&;"Y�j���ٌY���9�./��n��(bH�W̌+��w�Ԁ����S):�!WjX�Js�PC~%��|_���
k>�#T�$)i(�
)4vu�:�
���r���
��S�L8�α�/t����ƿoDY2�r\���aP
���
��q��/�^����װRn.e�hF��$��	+ZГe�H��IHd��`.�2�6�͒@ϗBS���e���bh밿�ҨȾ��C?C>^�Z�<�IM9�rX//�B�e����<�Q�c�="�S�����N�0�ɯs�ͺ�ta�Ҹl+���(�a.�?T5.�j'@��/H�6t�o��f8���P�Vۮ-�x,s2
� 7	��t�������l/T?(�AJ��GLs`{�N0��[C��%o�dꄓ,_ϻ���j��,Ѝb�?��9��I�ꆯ1p�b	%�#��J,��׋C�����a9�H�R� ҈�`�+��$`0�[�b|�����4!��k5]r��!\s��6j�6g4�x���Y�h��a
s S`��\����e����Y�֐"�5=�o��M�Ǔy��P��<Å	9vxS0���ǀ�gl8�؇L�Eጎ�>AAP59~{���ˇ�+V�=��Զ.À���*m��+��@3�
���5�wЖ�f�f�6��a�߀�{s�T_5����E�N2Axv_V"�"�)٠f��`���ik�������O_��w�ټ�����_��ܘ@Cb=<5�N��G��EH,�F�~6� �,v�X���Jb�([:���a~
,n?��f��vڢ﻾��_��?�5$�Jm��F�BgH�7�b<��}�!�D��([t>s�
����;�-/�E8�K0��u~ykd��q��L���l��
���̯J%��Cl��M!HN�
�`M�m����?��᧫}��p+�e2��%�2�WaZz��X)Y���Wg���lĢ�Fnz̘o�}�aq̔KPP��8>¦���x��P)��6��d���?���76.��u���;�z������A�a;����Jۭ�Q;�`ҝ�ڈ�`�?��^��s@�s[(	;�=�Z���u���)e�H�P&;:w5�ղa9�I�YZM�?Jq�����@�X��ޔih�ס��7[�ީݵ[������j/:5���ɑ�rl/1�Q�{ⅶ���n�IX��/^��cvn2y��D�Aҹ�׋ƼLk���߭��s='	^�Z9�g6s{�=DžV`x������.�f��Mn%�9cU�T0�O�i�r��3�j7��g#n�Kr�=&g�^099���B<^�>~��`ă��j
�2�S����1��!�a�:���>����;N4��'ȉ:H�a�m������E3��̖J����a��ZA�LIR���H;��Ҥ�c�pj�u,����c��Y DXs�N۳1t��G��TGѩ������w�_��#��UX��,شHV��݂ˑa�5�7�ڻ�E�]Lg�R
�l��S��B�"�y��ӄ���0�Ѷ$����9Y���zܰ�P����r��{����#Z���ƧlӉ�>�ԓY��A�!C��F�ɰe,_�o��~��h)׬~�ܖ����/�^{��k��i��{�|֜�ĝ��������V�����dN�my�2�c��Q,e�{��$�y�bY�����);)�`�:�!��m�+6T�I����A@��Ms����=�^�}hf��2f�[�{Q��ѮE[�
��%)��x,����9;�9xE�ۛ�*}q���W���ֆm�ȣ��ŘuxR�8jːTW��L����W�&�6����M�B��'�R���N� +��pw��8�|40��"���9�1x��4m�&�>��oM�y�ܮ7��8��{M�V��p/S}w�&�#�$�sd˽��os�����:��S5����[uKT0+�t� V�'U_���\?��=<_� cO�5R��Ճ�0ϡ�Z�j{D}���H84��5�f��k�_�̂.�v~j[o����>���
0&��Uƥ�����YV*6%�9�	t��)v��)4�X�G@�8@�b�����C�M�Կ��fa[P��#U��y�~���iMSؔD���C&�O��������%a���#���E�V��̐l81)v�|�lE�PKE��T��C�T�'pip/_vendor/urllib3/contrib/ntlmpool.py�W]o�6}���ST�T�IW`0`A�%�Ҵh\�!	Z�-6���T�l��%��rR`�����<<�~О�M�V��T*��b1Q��B�y@�%غR4��#P��c�P!� �dr!eE���,I�R���a�n9�f4�y~XV"���!��aBa�o,Y�&"��Cm*U	E��d-y��G�{2i�k"
)�o�r����g����Bey����t������S^4V���II�{��2��[���;FqƐ�'L&-�P�	�J)�lx^C�G3�r�T&!����RN�j�e�� �>?Ϻc4���8��rF��A7��
�)D����J��)(/��!A�wh!p?/$dL����UU��[��jmm�������uy��G^T�
�P)�j�Z�cyn�,p��#��vz�q��a��Xv��t2A�a�K�GQAr� \���tp��>�[О�#8�D�0�^�&���w"�q��$P��d��O��F�لn0�Y�T��f���@Y�P��+"���������B���֞fh�A���%pK-�E�8$J�`(kS[�1���D���O-[T��1�[��}xrqu{�W5���"'�wU֭�娹H����{½�hE1���:�m�aG�./��[>-3�eAjsхA2�|T��ەP�S�w{�p�srL�����fvb��
vl��ˣ����@ʜ�(h�2���>R�ɶ�MQr��{j5�4�rj��A�"��{�oy%��3��T���:e��;bj�D�D.�4	���*��$�����s4L��ݔ�Z!�p�&)�*xI_~�l��sg�H�T{����V��n�R����ׇ�7�J��'{���I����'�����c$KǪ���NQ�^�����)_�c��tA��z��[GA�\1[�r*%v������4(#��W�1v�z:�Z�}X]��������sڤ�C�8
�O6�Zs}`�~M,�M����r�C��
�Ğ�:�v;vM;��i�EHX�|��v��f��"�2�-l���ٱm��^ܢy~GB1gބax�uG%��l6H��<L�����y�.�F�t1)�CS?θ4��f�4(��+�"�5�'�l�z���6�c@t�)�h��0>M+�)���9@�uT��+NI��bKGQ��o�5z Ye����8�u�V���ӛ[\���KR7��1�A��
ț�[̘6e���S�ɛ��⣛�6K
j�O��/��X�u%�}.��vs�1��y�Ҿ�Q������<�v屪���a�6�������l}��)��'��˫�'jʈ�=����r�zwK�����juq�d�A�u��mϻw��ǥ����,��M��_y�m��̱:ዩ�c��p<��rر�D�ev4N�����%�W�l�s�ǧL��RҾw�鳹�}1;e��^����}l;�9��{8�_�h��dJ]d��O���E���8�����Q:��߃�Ԛ'�����3�'F��;�0���+Q9��'*���y�����m_o{k��>�Y��g��y��r��)#��W��.E�����0��Sn�PKE��T�@ҍ�B(pip/_vendor/urllib3/contrib/pyopenssl.py�;�s۸���(�&TNf��zsϭ:�9r�ib��Υ�L��HH�"X������]$HQ�s��>�ބ$�����ݻ[�I�����GE��R�l!�ޖ+��W��i*7�\�B�$+JUEe"��%����*��4����A�d�e�9�LI�K����R�b�(Y,�JK�&s�U���^d�|.�Dt�d��Ӣ�1.@<�$��@��'"x��0�k��T!�E�yw�� Q� 9�ytϗDoQ�4��`�|{����,d> +ay����qp<D�Hm�R.�W[['Y����$x|7b%�,�J�S)�H⌻���c��z�[� �Q3$@?H���*�V�0�2b�đT���*P%0�+:H���t�VB�0����ي?�H�Hy�<X�M#!%�^���3h$��t��Ӗn$�k��H�^bq4Oetz��Xy���N�@ZI^�l8w�%�@�``�d(=F3���;]TYt:�W�R0��A$�R%��$�/ �0�J���Z�5a$ݛpA�8K��5ǥ�ۻ�kXI025�$-3�!��lV$�������W1�ykW)x8/϶L��+��`�Z0��)r&�.XU�³��x62�k�[X��T�Sz��dM��`R{E�x���pP����ėH�%��b��j(�yQx�%���)��S�i��L1@�5hu�#�d���k����Y���Z,Ӳ.W�qt��3mC(L��W�Yq+r	�w`E��,�%���S�
Q�%�?�=W�(PQN�c~N7;������K�Y8HMa�%�lU�yq��ȂMr��"Nx ��%���
BAx��"�f�1�)4��14�~�D�J�m(��L�!!���`�l6���b�
��5H$A��6K��j��%y�v$r�0\Te�DZ���B�U)B��y�	�����M;���}w4X�_׼� +����k3�|Gc3#���t\.m��M`���v���>dƒE<�RRT�>z����&����1l8'�1͍R�������a�O�$i��q[��J. ؈�	$�yK���>8w�*����k�} ����\D(��ړ��q�����O��c}MXl�J&�ł�pD\��q�B;P�l*������}�F��0�[U&��Y֎�;�`ڨ�����:�zB$
��M'�w�����Ӡ'>Fl ��
�����?{�3�	7|[P�U�۳���ٝ�¼繖����صM�p��!X�AJ9W�J�� W��2�B�e�
�/��$t�����{���������՛��a��9����T�'�s�{[��\]=��iC� *%�l`�jG�Z$є� �.�!�4�'i20_G��ԥ���q�^=��W���W����)�¢��TCp!�0����.�����������g�a���W�g�z�'�����?>Lo&o����}�g�w��� ���k�ɚ3HJ���!�{�#���^i���8D7�M���0�B@1�J^)�{~���M��]���v��	�|����<��e��6Q�ݼ:���O�L�
�ϠE�0hBk��;x������d�Y����{�݋��(��l�*�aG��ǘ��r9�D:�Eg�K/�EPΆ� �m�X���e��px���]́��mx�����i�x{r�e�NQ���>7��x�e��+�� w��g
�Du�ǎ
��Ȏ�.�XxD�D��QBV����n�
�r.V[���V�G��"��x������������͜�h���m�Te�l��갵H�b춀�C�h�;���d�{��x�r��J�1԰6BHxa��:��3�B	�M�C3�|��!D���Y�f0ob��M�xE�#�"����=�U�:)
�1U$��n<A���6�;�eUHb�'%{�F���4�&@<cu��'�і��t�Up+yǠma�I�kP�A������̡pB!P�ƊTd%��@����&h�c���U�_-Q�2���wT����⿠�ZO����'��K_�b��[����?�x"+����[���mE��Y
�lF�2�ޚR�R7���c�z�/A�\Ŧ���Zl	(ꆁQP�e�A�@4�pi�Re	6|�ҽ��2�(87�>�=�N�,���QԽU��@���E'Q��j�ݐ�.���}Y�[��:�#-:|�>$�}��8���ȸ���u�������?����WA�Ͳiw"T��yM)�1T$��0@ͅ�Z���`{��TF�
���*�ҳ�i<Z=�
�N���O�H�N��
X'�븶����(�6�R^�T��4�+i��~�$\�� L�|�*klZ����R�9���-6Au�9�D�NQ��f��OLvZ#��.��<�t���2��.�q~�2���M+��ݱ��u��4
 !H-�/�|�/#� |n�����H���z�p�H}c��S*2�N?����PFd��Q�@��-s$�����dzI%��˳NC�AD]��H�m�
����-c���%���#>��V�
ԃ�JIq�^?�%��v�b��ݰ�PJ�Zl��1�O��;v��(&о��rq��@�آ��5�ސ�%%�~.l�`:���<s;M+n�V��`�0G�����n\��]c�gD&����`�x]��\����]O�rl1�Z��o�조���h�1����m�C��Lz�=�_�h����� W���1Hl|�35)Y��dJ@��!��;6昢���Ap����p�vG�N�u��IyE�/�n�A
@�H�H�g��NvVܷ�'���N� �I��0��@�@d�B�(��o?�=-��Q�$���l��?S�sG��r/ey!+<8k�)�N���F�IPb��[H+�2�:���BM�EK���ᒨ��}��Q{��g�	�S��n�
�����!f--;=�[y0@s�����><y�h�U^Tk��$Y�N��M܈&��`�U*�$�
%�@a$���T�!�=p4�"TbwrR�T��q��vm�2H������'w}SN��c1���H�7P��;*��Ȯ���:����3��hR�c����k�b��8�3I�lı�A�5�	B�IJ�lvO��H�[<f~`^oy�RV��\��P]Sa�=f�=�������t�hЙ9��%(�[[(ȥ���چ|�J��k;���$�C���G��x,߈��\s��P����i��;T�ʰ���v�k��]�j��$X��ô���X;�wK�
v��O��Gׁ�6�a�����:E����h�;�M���0�����a����L��jJ���x���>�i�>���O�J��ud0
=�W�}��)eb&Ȁ��)G���)��B�,��vH_���x�(mX�Ү	�Ws��r�d��0!0��۞�#�|+)C<�M#��M#sb6��rO��r)�P�E1�.��lХ�f2nz�KȜÍ
��`�R��=�-.�r��R��u�Z���L�Ý$�!80�u^q.s�[�5
�6P��*	}�4��-��Yt��4���?��v��t4f'��4�=�i����)=x����ŋ�
>9��a��p�N[�!��V4�#�mqy����2��^�@.��P3�����*��\]z
=����]�s��Q��Q�
\=<�M(yC��Tk�#GhT���2��<{�>����O�?Mބ�o?ܽ��x���!�?�q#x�O<Fg�]o8���
`}�]F-��̡�?��	�B����R�җ�p,��`����7F��yw�����Nyy}\����0(�ՙ��g��+<�(m7bK�+ߨ�����36�?k�*�|�ú��8����k�������{�����Y4��i���,�deض��L�o�����.fbmv��K�cø�Ox�j�7��x��ca{�������po�&Y%#��p�,�4]C�����(e�Ӑ���T�����rg2���:{������]�[�s����n�ҝ;&J�m�뤬�����'h[xd����F`Qw	�#���O:	�k�uHm(���2�?��'�C�,��5���gl���0��7���n��NlK�'W[t���*GL�,�o��������X��8�7��R�h���	�3� ��yk���������Ixv{	����up����2m��)�}��%�6z~`O������YZ��Ӟc�����F3��}���@�RB�n��ܽ@W��}F�m�Ht��7�L�L�-��������ӭɶȌa����NڢH~㣓���#u��>�#\tG��ɧ����n�:E�ۀ��R���N[���2�f�n(驶�Ӝ��f�l�4�@O�<�`�����Tų"�?f�FY)ԂG¶�w.�f
��
����i���r/�>�q���U���?;�8���1D��eN+��ag�4;�Nۈ~�4�[ݣ?�3�r[sf�r~��Aa�(�шQ�r������� ���5�}��!���^�ԬG
V�М���崻�>n-?��{�M�<b�4Jt�v��Z(�ZV;zk��;��5J�����v�M
�5Q	ߌ��~�FJ=�NJh������;��.�:��=��Cl*yl9��N��"��i��w|AF�L9�͔���;Lp���^.x����^T;9_#�~�5i��vrGtQ�s/]OY���׸�"��<�2�KI��P��xI�{��W��F+�dV��AK�^lK���l����o��,���4V�|}���j�q�PM
�����d�=n�5�q���\ڜ�����O�zs�"<���y�o�H��4�F�x��A+d�4�����n쨿��\Aw�
������/�1l����,6k~�dC&��o1ܤ�8�����u��2��4!d�&���A��ig
�'k�Q��K֓��ۯ�����%�ck��v��S��=TS9��c�픽={t̴fK�=Љt=�࠷S�B`g�ԁ_�eBl�����-
��z�hz���o#
��^ľ.%�������v��s���O�1�́��b�}���
�P���h}�Z(fR�+{(D�323�hXlg{�	PKE��T�,q�%��.pip/_vendor/urllib3/contrib/securetransport.py�}�s�6���+���y"s��$_��F�gT�X>K�s�T��(��"u|X������	�������+��I��h4��n���v�2,39˂d�f���
��L3Qfq�O�C���md�u:�U��up/s���ڭ������]ME�Dq0��(�
@��,i���Tl�b���(V��D�0@��D��<A#�A"�5"$��
�S�e`�+nv'7Ax���8Yȯ�q�>D�"�ӵ��É��8͎W��JfPz�YFY��\e\��F&��U�X@�U��	_�:@O�B�����/RK�G��i��6�!���A8�<�CZ18&L4��)2B���`b�1�d)��֨E�j���2�H2X�/�^��	��I<�XY�yA���*�L:���6�A�[��I���A�/�K�i�K�a�QZ�@�8Mkg��S��� mW�FҴqynF7�oOa��X��%`�Dr�H����9
b���Ug��y���,{j�I�Es�EKO�/mZ�|�q�c�D�D:z0��
�#�CxK
c\ū�ߧ 4v���`]�e�z�z�G���Db�bS7n�9s�B<%�!�Z��u:~�;X<�*-��S[�S�z9�O��G� �#��<�x(���
d��l6;�@�?(��\ �A^�"ʁ��s\l�IHBj�LK�����>M�Az�a���a�,�v�$B& ~��`�Ή̚#Wњ}��A�(V���4�M�� O��^��t/�E�<y��5�<���<�0�i[$�B����
��������<N�{�*�t��@��woO�;��}_�Z������~�Y����[������r��L�\
WAv�h�Nl��H�yD	R$ X!�'��,�A�S�<
�`���5l�����w.z�Zݩ��=�8l!�X����w���m!��C�0.i���q��x� �@Z�	�>�~��%MqS��(_��2sY���"���O)�} .@�`��4�J��H+�C���ޮ�5�+�T�
H�,��f�X�@B�����%N�i��r�(Ђ9p͋y�$��d=J�z�ի|By�	(q����e�F��3������S�Gb:��}܎�x*nn'_�.Dw0���}�e<�8�<��vp=�YL.��g����/F���v4���-�����zx��b|�A���ד����lB�*p��~�?Ÿ�����g^����a_Nn�@�ng������|{3���}=�����F�F�3F�gb�7�CL?��p8�7�3�E\�pr����Ǚ�8����#�p�j���W�񧾸||Q�	@�ybS�T|�8��8���Ɠk��pr=��?�0��Y��x:��x
(�4o'0�zM�1$$��J���<�8]�Ws��^���2>��e����WJcNJW��w����r�_p��&�_2˒T����&(V��|Z<���'�꯼~QdeX�(V �Q$�[�gr�a�
�Qϣ��%�X��V��wƫ�
�=�'W>h'|z=Sm}W��#���:L3y��)`F6WT��߆�NJ}�@
�1X)��ף�A�ʬ��z���?/�x�q��}�n?�L�B5�S�e����
���
3\�4Lz�����9C=%�e!1P���ܩ�͋lw&�+q��|#�h�gڬyG�i޼�z�>j���aG~
�cz3©>����A�sq�&���#�?����=tN���A��N�J����n�	�|��h�������1�Z��3H����q0��Ṙe%@OA���x~���P�i4OcțL�A^���8 �OV��8�wJ��@퓊�-vl�DQ밒CkZ�=1�]�����3�kex\`kˢ:B3ei�b�Jv�!�����-R��?�ѽ��k�I;����������[9,ЌU� �4�[��Q Ũ�c�WB��])s�S_��_*#]��64�l��A��F	n��Gk{�&���
�������A�*$5�sv�؎D���~�BK0�Y���G����Vh�h��jW�Bp�"�6p�'����~6馌��rX�$�.��,�՛W�kpSl=6b]�U�b��ܱ�K,H;2*Ȍ�p�q^	��i���`wmRe�0��<�e��x���3-qAVA��.��k0R3�*���? 8��My�2C	 e�������Ê�|�39�B�r�/��߂��Ք��q:���y���+x�.�+q�֬P,ȟ|���k*��
Y���^�
�{zb4���a�
�@��w�T���UY� -q06-�#�9è��[0��W��O���N�?��ێA��/��P:�+�j�t1�|�����
SF^~��ݓg�(ԟ��rF���H
�ܚ��[�	tl�-
[;�!�`Ѣ���ݟ~��LQ��yn�b��hx�q���|����h��{����!L����'�~�]�᮷/�#Ȃ5
��{��L�~>9}���P~n���5[=���%�jt}67�~����L.z��u|&�=u~�:>�c�%3{�^2����ӹ���{�� ���m����d�J=�!��*Y��\YZ!Q�U��&��HP��NQ�1���&.h��Kԧx4�!5�g�I��K�.a�2� ���*�:D�U�Ж��aHXנ�է+'o���`i��>�5�(��+��M� En:�g�g��('�k�|�B-~����� �"��^�M�����-��:xv�_��s79�Z�������O����Sq<}
����H�t��A�%~z�Gq��t<���1}_�O�t?k��/���K�zH�bP���&�rw�	
p���-9j�~�.��c%|<�+��@Ё����xB�:��#*6����h��v4�\Oo0(��66��혦m�!����m�eQ��w�lY&��o-���c�l����5�!��=в�f�货�2u}�}���;Z��"(^.�x~O��zW�|:Օ���i��j��pPm:Ӈ�2/X�(l�qT�R<�d��h֨*��x���pj���܈�w'�GUg���a8N
aG`�,�'�wW��A.kdl�
�uj�D"h�=Z�㗷��]�h-1>Ѐ
�T�z�) nҎGE�H���5@�t%ڮ0
l4�����A�T㨈��i�џa�f��\��� ɐf��=��}
�M/�򊥈=:g�F���5��AQ��Q�&�ku�{�\�c�����P�d�2�y䑼�L�y�u�����$\�ɽ�G����A6/��	ʞ�5J-���sf�RS`�jqpek��n�N�i.@i�e�B���5��qI��#(;h�="=>��^�^ś����8&o5'־�����k5�y�2oG������f|3j'���ub��
wPM����������,Z��a�{������<��|�^�V���t�(�e��~P
(�KA���%�/V�`tq�h��|��π��S��]!st0��{U�������Y�j=���oZ��hnj���˿Xc��Z��V���bj=x��ei��ֵv���?�(g��|��.1�mJ6�ǔ|t3~�&Z�%4f�u�o]�w��gbx���YGy�^G��) ^�Q��K��Y͔�w+;����F���h�5m�����p/����1��x�@��$ē�8z�t�L�� �ć���&:�T��2ih��� ��i��h?�sj��
 �����k�N1���V%Rx�W���`቟e��S��9gQ�<~�:�ì�_�R�(��6��B�n}�q��_����c�)��,_x���\=��c
n�ǘ%�<��Z����:w2E�B�����VTi=����_d�wć��V�wD�r\|t�Q;��l�u*L��x�.��]mG�/d�Z���2^�F�V��^�����^�U\�Q��Ξ�G�}H�����/͍�[�s~�/�e�c;	c�YՎvW<`��R�-�N�?�ԏ认,j��U�EP�C���!���(�uv���-�C(�p[P��N2ZI�Q%�p:I,����A4�%�e
�f8���2�(娋���˻[a�7���!�t��!�&j��]x��������/��ڍ/�A^7x�����ٝ�1�A"�9�T�/5�`x��i[�dQ���䰼b.9]
�a7�T�"�?M(�VAr+Y�xifa�:�g!���9�����D���J6ۀ��R�M�
��d�¢^��O1-����N���
8�W�1�`2T58.�̍�����w�6�������0B蜸R<��{�E�4�&�JU&���hTMËd�Wl&��I
u�f�P��Ād$l�Ğ�^{�X�&A�'}[�UD$*�l��
���!�a���b���$��*�R�@C��2��U�K�⯖0R�`%@l�\�S���c_[\��̋tMrr��׈�����@R(��"/ȷV�^A��}Nke��EΣJ֫J���H>H0�lM�mdS$˜�ii��s���uҳR���zo��)�#�m�g�`J�b�V��+XR�5J��a�^�on�v�8r8(�7Iu�+���	<5����;hM��n��ro�Nm�}��j���i�!��(��-N��"AMtkx{kn����Hة����V��=g�z�x����F�I�5z�U���%�{�k��-5�����[mA�AQ��Q�n�Aȥ�B�(ˁ,�.�7n6�Q&Q�G9���K�0�n�D!=�h�D���gnQ�Q*�ӈ�g]��^Z"S�}*�jjT
)�;���3�ƞ˪L�V>��`��D��s�q� d8Clo�]>'��@.�O��J���g��_)#��>��=���Ѕآ�i3h�l^~D	���qLo>\t�E��7�s��t^Ӌ�^y�;~�����Ȳd�(���:�O�y&�������b�6`H���_)�RF�O����� %��Jxd�JfBc��r�E������^Ϲ8�c|:z@�+-df5�G���kr
�>i.j�5���\�@5.�nu�8�۽>�=um�9E��O��vVᑏ�a��>
�@r-#��)�$C��{�tp��_�FS��s\r�S�:����Jf,Y�2�m�q�l��%�ˍ%:T���>��@�JhI����E7�w)ڸl�5�%,�ң3]���:,�w�=c*�J�,M
Y�J|@�Q/�])P��L�و�b��ʎ�Z��U�9b�yr�W56�òڀ�W-�_�n�0f�Nglv�!��.\a��S+�0bPfb8�9s�
,ҥC Xt�`)��1�<�?��a� �Gވ��"B�<�a$ì~��𓄔��!f�V���o��fo�$��w�7�虶
�(�H�[TA���
IqG,�f6�B�n�@˴�¢��H�a��s�H�`�'��:I���^2���[6%��������.#%�*�4\���uo�i���d���.3]��{]�p��w���=:,�u��Up/kӍԁ����
M���_(Cܖ�Z�WO1�R�{�a�Јh6��]�3˶YeAn�h{v*�rO�L�\�r4��xiNE�Ze%Ȱ,�@��k�������Kt��U���(2G��6��r5�K�1����GE΂�2���k���t7����9�bU��\�n%��hghg�j�Kc�dF�@6n��1.�4Z���q�;�����Ύ'xr0��~(�w�+�g����
1Ւ��M�B�u�-��wb�0�h�hy�W��<���T�{���DS��*�b�ܮYI��d�#��Nۢ��QY��/��_FTA���`��@F[[٥-��T�a�[��ɷ�������H��L��h
�
xO���890����;�2W]���y2^V�@	XQ	X|��ycb<0M-��
�DW;�`�Xa�se8�3��O8
�:�d��^�,��?<�p!�9v�bz�5�h&)�m`�q?硭��k|��[�8��	�rΊ2��iG�8AF�O*�u�K����Q)m�{�2��{|�\�54�s����_��je��]�_`��(�y��;FE-E��}3D�r`P��4(m?��+DgB�M�I�N�]:2i�E�ϰ��-�Tr���T�%;MQ�O�r�'
G)T���PܷTSI�M( ��.lQ�f��H�I2%�
`��f����Zr��m�nRɰmR���}�ou��rˊ�p�?s�s}�����a� �^�T�e=W�����ua�����1�c��Ҋ���0oɡ�$`p��'��L�������e���>�X�Z�E;jI����C��H�()���vi�I1
���{��$u�Y�_i;UC�t��*�cp�
]��o�U(��o�c���ࢴq�[J�Y9vsI����& >�o魣�rX젢��r�G�0�j4t�өC:~�S��N��GeO�`�YO�Q�����į�Pf��<C�f@��p���
�bN��Y�k4��F�*��R_4H{��zwN�ce��/�O����ω������e%~�t�?Od�B	��6���ĥd]��X��cDe�?�����w�uP]hJM��ݰx=���w=1U�|���W	38�+W�v�FM_'�Vo���4��b����$�*�b���(J1f�1!�����:
u��1�J�kX�7�t:�p�{�)�@��62�n����Uђ�
�����]�e]v�dc
�s�cyHʖ|z`������o׍(7Zբ�a���|[���5�g�.O�_��Ї��WI����j�RP�8ق��Qk�����$�uqs�8`6 ��q��ۋ)��(��K��	^�̂ǐ�.��1�X�!?�wN.�1a�x���L[uy2!���1�Ͻ1|iRQa�R�V�ˁ5a)™l�z�2s����Hu>�(�p�/�o5�;��o�2��=�~�'�
ew?�XX�%L_�Y�!�5k<IBȞo�ġ��v��~��J���<�CM��o6�R�-�y>�r�B+�i�~UcU1yU���et�ҤN/�H�=�L0߈���~���ln���\Ve�I�y23['$�Z�;)�^Z�lr19�bf��:�%(i�	�`̘c�E���܄�I��Pe�7b��'q�d�n��,�^�sQx��7�����1�h�c���Z]Ht�{v�&"�LeG�����`1��o�F���%����>�v�:���B�%ԹQ�*Dxh����s*,�6���n�-I�`��S��69��Bm[�/��6=�(KR�y:�d������_�<b��5'��aʃ�C�V�jP�gB��W���l�4���ܮ���\��
�8�a�^�t�`�,��l��UG��c�hs�)Ӎ�`�Q��ȷ"���$#s-9��ѭXc�LHᡯg6
AM!gt�in�5�*Ŷ���)���Ŕ/������=��9�N$��Ncr!wVz��:��)���Kb�4�=#��"C��H�[�����U:�{xWl�ɍ��MM�lr�@A��G���
~�C��P{��Y@G�`;�k�_i��W1�:�4�:l2:��I����\���q�FF�[���H�s>��JL^&'7��;�SCN8�$W�8*��%��*`́tL� �0�ə�Ͱ�
QY�s!��V�dڒ�`nȚ�H����W�F���\�=��9ʼû��aDww�l��Y��t�ԭn�i��-P��L'�L���6���`F^�M�+�oI���y���Z�
���m��ETq��/O�3J��g�ԇN�zkO�ז@�K��6:�����I�N��&6����=�
�F�(�
+A�t��AO�8j�����@��Y��>�&=|
�����qz�g�5�'$��(��im��lt��������fVv�L�_˻���8�������=��� ��_;��(<mS#v�j��:�U8�N�h��x�z��U7�v�C�O~���ּ-�,�b�r�{���f�8�3x�I*�Ԥf�j���g��yI�X^� ��vW���jx���͓G��R���)�n�.�>ד��'O!��Hm@�S9��M�/����u��h�s��|dw9���~����"�ڬ��zmiA�?D�v4�QAsF�4�ԉ�="`s�R}V����w��J��uT����STm|�ƥ-wm�xú`���͹��m���h�C��N���`��8��&å���^�]6x��$E�Z�C���ư�D���V_E��o��W��pAj�H]�QI��Y��Wib�V�vO�~��-���:T�T�
N��K66���J#�������N����bp�Ցӕ�d��e�
?�5�M�%�R=	$�],�W��62�t�z�nz3XG|�_��o�oW[�/��ٓ��1�/Z�����]f�+�o!����q2�@{�e�k��r�L�g;��F�Y
�� �6���kYZ��3��O"��FHK&�C(t�B���镞�Z�O��C)����,��^�Sx?������
�}́ܮ$��'���C�0�%&�R��\v3��gz]>o(��>�������t��k�d�5ـ唏�f�I%X]���̿������Em�(!GuwU���H�fwg�ۜ�#Gq��ȕ��ċ�PWG�q0Z]��`�X ���T}�����[�-[v��V���60Cu䞬�����2P��7>nUߖDR���=NC�
1 �]�
��/*�J��R`�@��&8�q�a	�H��p:�H�n�1n5�z\�|D�s���Ȯ�0��\���3��h0}�����h�Xd��
�)V�l�u�C�A:/��/mW�ٸO͵�K��Fp���7Dt�8�<����ˎlN4o������?kׯ����[W������?��>�1[}Y�������/�#�v.��9���9��N/V�}ifN~"b�o��uYu!��pmZ���O��d {��O$�u�O�g��d�W���(w�ƹ����tnْ�\�+���j�"�S39w�NW��G_��h�����f�j��U}?�f���{���\�ç/(�P�g|�pѸ[���/J���1����&Օ)>��g�U)*6��"��'}
��w�t��b�$��;
aY�_��᠓w��	��
M��<��%���#���|G�����k���f���e�V������u�j��ձ���#a
I`�xa��wwr��t��M�/��a0l��u|���!TEK���!x��T�W$s�JR*�T�|��|4,���D_�u�:S���B,ܛэ�����G�I_e�*�╊���=�u���������Ar����<��<v�6�����D}
�yr����Q�no��R|l	t�z���Z��[x�LMܶ7���w�u[�{������*�o{�Z
_7l+�����9-zv�PKE��T�R�?Y�$pip/_vendor/urllib3/contrib/socks.py�ko�F�;łAPɐ��"*Z��K���\Q�YD(.�]Z������|��6�`����y����Ś�"�˻�5j��'�a7�\��Ț�T</%�jq��\��`��*Q+�5���_[���d�Z�)W����(��?"�ӳ���]���l�K��ă���X�/�@<CR�A�wH(G��L�)W��5Ci/
v}ފ�d�[B�d`%!)q��$��[�_�(@��+?Vm@|:�	o� Ś�w@�Zm��jj�{�/��H�(�	�n8�8֝-noɠ��n���]��2����e8	7{f4��(��o�Sh�sx�H��sh>�;	uɏ�1Vq)O�Τ��ZT��(b%��cd)��RqD[g�1%X#[�h��?HȮhs�L@1ܐ�Y4�J��F��Q��hmQ4ڟ�5%��%���*so�	xFN�a-���%��0љȆ#�#F6� �>j���J[��]:߷g �nzV�Ո2|?%��B��F{c���!����=�t�)���E��v���!�q�wk���b�`�.��a}�cV��A���uav�|n(���]�T�CJ=�S�L������dSZ:b���f��V��c��nӤ>S]�������@w��:2�d�P�HJH�y�N�0$�;T}�G�hF|J�R�^{Uע��x]�Q�S��"�����%Tt*��� x���B/�ӽ���p��%J
�Ϣ6�M��E��L^ga�Z�D�b3YA���#E�����ט(��&��|���
=Cr�*��p��ƣ��d"�Q..���&�����%��:�Eu,�hۮm��(.W���bfk���<��)P��@� ��e�)8�A4���1�h�C)Π�tss��]]��m�0F��(���qgD����pVL�׊��S���E��K~G	�P ��6K
Sx��H�k	t�&N�,f��
{�e ����h�K'ۢ�������YU`^+���*̳�.:�[�����e�B�R�/���e��d!�د���$�\|<ћ���(ѱ�k�
3`h�j�7�e��TP/Z�4�e�
0d��X�)!����L�&���+ry@�޷
�a�D�4tC�|<�b�ٮ�{���r�B³ӈ�{G�a����Hk;��N'�Yo���S��;�md���BH:u���0�w��'Sz��#��a���z�c��:W���#�L�š^#�0G��3M���R5�M�=�M��خBNSp�p�euF�;�_g��ƥ�)<��
��C]\���m-/�u��%�~��"2�W���h5|�e)��J-<6�����F`��S�G$������q��	�k2�+W��37�4T�'6�9@��g��/WTЏ��߁N'�,�ؕ�i��>=���L�%R5D=<��.�#�M}��F@H�d�g�`j]ϓ�1ez>å�v�{�����hW�g96^!�!���ћ��9��n�a��Ĩw��kG<B�i1?OĿ"ވ�\:���K�Ӽx�_��CDSd��k��X�B[O�p�1�6[O�{���+�t�
=a������w�}eY.q4AM� R��e'HT����̐r�H j���L~�����=AC��RQ���Db�M��%_$���1��Φ�3L�������w��h��9E�2.�Y9��oM$Ɲ��&�x�w��/�K�[|QP�9`:&����}<��ң�+���l0��m��n)�����՘�p�bH�6յ�y���o�ihI�� ��91WSԹv�-͛a<g�UP���)�?'Ɔ�|�Ql� ������ǃt]S�l�	�(7�|ݭ����5�ku�ʧ���ӎm�V�e�wrR+@|z׋�E��M
��B�~:��a��k�#���_�y8���m6��qepҭ:�6����e�bb��MP8��o�۩�??�������W���q�E�׼�(`z�r\o��qL��ϫ����r\��SO�E�����)��������f�_�c��9�f�s��݃���yq_�~���s�3�n�����ւ���������+nO�BOY�v@��]�s�o�+����Aܻ���'R�W.��=#w��� 3���PKE��T8pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKE��T.�-M��D8pip/_vendor/urllib3/contrib/_securetransport/bindings.py�ko�H�;����j@��k2���1�&��VȘ&�bl�y쯿�n���8����hw׻���_�f����!�{�ء$iH��͇�"��mwCL��o�֎x[����!1�ۂ��F!�޾aP+�20����K�;J=�!;Pb3�~�=�J"�s���}����YJ!��l�ԍl�q���`VH���}d?�Q�F/dB�x�y��]��m`y&�I�&6vH7�!�Fő%�z1�]�`;���͇�x�����c�3x뒁K��{/Ɇ�#$�Mླ�@& k��v�6�&0m�5�a����7#P3���a�;/v6dM��`ʀSe
��k�E;�~#q�@gB�ˢ.Zd�!��K�A��o����H�j��^��#�s�)I��?�����]�F��xs��	��a^��a�^A)�ڙ�#���F|0+Zu���0-d�R���^p�Qb3=�6�&�xV�G0q���v�[[88M#�h�;�0�P�=*��lؽ-F��|�@�oP���{�s�Ԁ3�������co��T��c����8���p�@�萂q��
:$.&�d���
%&㾻��(�Z�ɶq�k�
L�8��Z� ���@̡��;��M������}��"�����g��t�;Ht=n@���U�TP����kN�n"ǭN��h�0X�dl��b�m<ԇ�90��!����~Ib1�.��و������C�_��0�l�ȍ�擱��6���_�
�NgK2ߍ�@x9cLrc�@�w�B����x2^~��6/�H{4[��˱v?,�~1�:�1���t�N��>]v�3��|�v0� ;Fop�,PV����㯷Kr;�uh��A��D��@Am2�u�pp7��3�P�z"(��<��،|�W[�gSTI�M���Ƌe��06�,����\̀
��f��NuN	ͯ�����2
��hH@F�6�0��AV�mA�_���G�=�fſ���w����%�T���9l8��q�F�Sm�}���l<]��a�֞礿�"*~c�Z���v��S��x�ڿ�U$�b.��={��ڲ��8�4�Ƚ�9v�L
��v}�z24�_$L!]�Y�aoSct÷0��V���4�f���32f�zxA�9sa�ܛ��t�>��M��h���:#
�+hn��&��*[���whko�-P�#��n�;v�jv��v�T��IZ�^�\�e� h�l�	�p!A�_H�׽b�ǥ/4`E@*s�)�6SܟHK�rw~��f��pcC�P����q��k�!��^���+ߌv�����]�O��$��t
���^\��L	�/�������K*��ɍ�H�8`5�v�m�¦߇R+"/���&�"}'X�5��d�(�c��Cq���,?���Cѿlg2�&�u�)uBZ� �13e[�#��*�2���f�8����2]>H.�!���vl<ZH��[� p��e'�W���`��Ϣ��΁��[0���gSt�&�ӭC��KчX�jCay-����U��`Qz2�OF��4<`ݭhK���84/�#,8y�Sd�4y�9�PE��(��7�*���y�lh������s4P渏��)��u��oh�{^��0�V�A`��Mwqd�Z�3�%���HiZB�-���\F&~Ҷ�dp-�ok�dP.Yf� �Ԙ�P�_������'�m�T�|/om#�Yc;g�<���V,T�%�I9j�wn �UV����f:1-���(|[�pQ����P�kD�t`峇u��FR��:լ{���a�v�<b&������1̓���s�+Z,�A�`��,��<�"����1�l�IFlG4���5:������Qp)ᰙv	n;Q�	Y��GԢi2]\��Nx����',�5錘�@e��d�E�5�5��i�u��4��Fa��c������|���AR�JT$����C�•,7�HK���_i��b�"�R���ȦE^"�2*�����@�C[R](��`G;�<��:?t2�<h��L�B�<,��H�D��M��P���${1
�u
{�~�4U��/'#���s�keF��J����j��`�f��(<(O��y�S(WA]��y��[�zS�$��!I[)Uj���=�
am�SOeZ�-A��m��f�O�=�(�ec�q���dA��(v-���&E+���RG��D�-�>��@5U���(K����1���x�LCuP�2�#��QD͛P!x|���� ��s��I�mJ�&�j���89ޙה�|_�ȣ�h�A�M�?�}"�E&\W�ԥ�x��{�d���Coib
e֟��:bܚ�&ܙO�YeHuX`�O��P.
������/�ӭ#��x��ꐆ�p�׸(K���`h�P��nM�ʓU3�`Ź]Yr��R
�'�rIj������_#��_�9��r�r��'��@���?hN��E��#։������}�<bW�[r~�d���i���&���.M-�e{E%�S��)�$���<��0_���
���8x|�"��2UTAG)�J6��P�"�Hl�F*O��_��N�b7���gy�ΎjqD���0�Z�b��5wg��$L����V����g'���Ϫ�W�Krˁ[:w*{�GJk�p����[f�I��>&�@(����~P�ϔ�|��C9�͑L�SA��rL͈Gi�H�8ɹ� Jn�7�N�r�xx�n����� ��m�����-�|���%��t��F]T:�������r�0�4Tny��RCyzL!�W�t�Sl, N�
m*�tZ�O��t42�w���k���|[��!�j�d���%;,I�#�d|���C-wD�{�7֕;i�F��s'��oQ�Giܔ @�ϭ��3�8��P�������/>BҾzI2::}7���i��2Y
�b��y�L�_�;(�J3�I(]S�*��������cȾ�(��I9nᗜ����=)��<D��$�	$�P�1���P��`V�UX7o-�P-�U6���Q���:���=�6Mvxr��ĥ�o��C�wQ�_A?e��3���2�qQ�ȱ4YB�~���y��*���A�"Ɋ�*��&�ݦ�)�	-�˲�nbRa��ݔ�E�H��>N��\Ͱ0�����Ժ9J`1���c9��T��$9ƐnM(r��I�R��TX���Uf�'FO坺Z���s<zS�6�rJ��Ƞ�R�$yKI��^% �.��k�Uޑ�-r�G�bo�K�v�U}~��vm|2c�Wb��^�oX,|�����Z{�]Vg��?��̴��T�O�Lv�9�M���g�j�T����r`?���rt%YK4�z���^���2��2�/PA��<�av�i�4x�����Vl�Bs��z���u91DkZϋ���،�������$r'ޡO?@$�������>�������vT䃲�{��;�5�1�&�?Δ�,��̴�!�����ڊZ|s`���1u-�9������}��0��n΢L�~b�R����Մsȅ-�8�~�o�^�;r��Ƕv��m�b6��*�k��	0�.n������P���L��2�e�1q�g�#�v``��|E���,��x��ei��W?C�I]�f�f����L�d'囯�6���7�"{������ݓ�_ʂ��;��cec�@�d�Aj��Y��|�)a+k�d�W�hB������"B���zݻ������Cq*AL�\�l�[/��ȝ��[;r.��)[z��Ü��`�Ch&���]�d#<@�B8���=8�3��I�^�&�r���}�8��;�KP�f�[�{I$_��7�P���tջ����81� ��\������L�M3�?�Mx�����}���i��ƶV!��x6H(��m|r��/|a̼г�����I���
�$�]�ᗓ�
� �|<���V]�۟(�O�d.9�_\�`�?����,VL���Q�-u�k�[�5+|)������r�U�[����sLx�Z�T�!-������^	$�|n�)GU��n���&�g�U|��v�*E�c�^���D+@Џ��v��F��(Q�j�I0z��L���a[%Й�7����Y�h}v�͊(�j����r���a)�S-a��|
����VM� ���E����Q�	��/*4�x�+0%&��
`�r�.J�T���PKE��T�*��Yb69pip/_vendor/urllib3/contrib/_securetransport/low_level.py�mo۸���š��җ�ِ��]��)�t��+Z�c]dQGJq�a�}�)��ݦݾ,@�">�od�����<*՝*�J��2V,��J���[����l�M#�E�(���F�+e��F�w�f�+�l��)tea�l�K��(�ʛr+�*e���zUܬܮ��.�h޺5*W�J�ʼn7���k|�hs�
�v+�*/��.6+]*1��WB/E�)�i�^�ZH�I�& .�\�>�F�6Y�Jި���-r]��E;V���-�Q��Z�F�\�	(b`��"d�P��\*yki����6�5<צ>З֪e[
	��F��!s�q��B��1�X��U??�oy����oE�L�u�
���(�dm�=6���֨u�,�����H����~���LE��)+J�lG��F`�Q7m)�P�k���(L
pc�\�;#`��E����z3x��ί�g�չ8�i��5 ����Ǐ���/oλxuqvz}N��UI��_'�U�v���Ό�!���>}�z4�F�Y�������Fل�oparL� �/ŝ��~�T�F�l�Q/������Y���o��6L��/W
��4ߒ"�,�I���jZS
D�2�3B�9�?�I�g�N�R���ZʶY���
)&8w
�q0O�Q��%0�`P	ʍ�u~���P�u^�s*�b���m�O����G4���é��`��U[��;Y�ʒޑ�+a�Z	m��4�D$�ǣO�
i��
g84��9�0hGZ�`�W�՟��M��pQ���`�2Ǚ�*�-����:2�޾ 8��FHU�������o�W�����;���~PZ���Qs�)D�=#�`]����B�|C�3X�e��Y��&�;̼��1,�E�:��!��=�a���!�����s��@�ˎ����d��MJ���C�e��M�i9/�)B��@�C
��JV�C�x��f�ύ+�TF%�=i-��[])���<ޑ��brX�"�V1��Q��g�5j9t�.o
�~��{*���1���$�PZC,J��+$�rFU���q]"�#k� �h���q�$��c���
V;�; '�ӺVՂ�I�̙:�b�K�ٲ�X��IE}�U݈0~N��/I+�q(�}�x��#�
5}/�Ȃ�ŏv,~��N�f�|�x���*0QM��윕LM��Y�_Rb�S���=�l�g�")�ء��(y_z�&&���Xq��� 7]�kJ�}}�y(
`:Y�ϱ������Yxgi&n��]^��>�J:��k&.�:z�_T�\�;0�NP�_�Ł+
q[q�zM��˥
C
;h'=��<>z�,�e����؛��Ч�߇�� Gz�f�_��9ef��ʱ�H�f�,����껬�cvv�!](R�q�,=G�3��@��,�tF���Sg���,/a�	�64���MA��"�f����
űS�f-��сE�a:O99Gǁ�N#�hJ��k�΀�$�7X��(��>���@�]�
��=�c�	�����g{Z�.�u��h���v|9�5�i�s}�o:���5�ᄓ�Ӻ$��u03a�����0X�Z'�/�P	J1���Ի�R��ZB��B��G)*t���n�3�*s�H�|�&Q,8�ʼn2Ԣ�=�`�SbQ����-dv��F8�'�Կ�����U2�f~��<��j�d
uYƤ����W�>H:���3@�6_�7F�u�x2��Acȑ���.��р��K�?y�S����Ğ8�V�1W��Ų�)��Z����^�ߚ%~K�d�ߛNB�X�_L�v�e
r��
(�=��L�&����Lb������!NC��K�/Ȱ!��l}���G<Z#q�+��9�ܘ�E�`�9?�$z��Թ�"&�h�2�.;�>K�������q�΁2L
��4��+�87�j�B�W�uQT� v{,4.��Ai��+����%ǔ2�){��g�xQX�����p���_�V��E�7�� tZ�cW���a�}P�!DP/�(��!��Ghb��:�f���i����%n�l�k�]�[��`�(��j�������̅_��Q�!(�����Q�("C�����-�7@�գ�����|/(kwĖ��m�-�H�&�D��+y���=j(+��o�;?a�C�on"��e�$-��;��G0g@x	��*��~+&2�*ܐ�c$�Y����jN,�t
�k8��Uk-6�I�
\I�V �r;
wb��C�i��~?��E�@���-X��Q��[���*|�V�2E>�R*.�zRr1u�6�!��F�#��E�/�Id�#�
��n+�R�����e�{��Z@���^A��M�,tP�+vЬ �R���QmtCz�
��!2�@n�'�-�
ώ"��ˮq��'B۴����uG�I�9>�YU�9��??�4�[�u�5Ϗ?M�7N�)�P�>�����;wK׷|N\��l�H��*|Jy'�iG�$uu���0�7]ls�q�h�*�i���i��ܥ�i���BD�7y�N�������q'��?��w
kƩ#�WyG���YD4O�=Oj*���"lܻ��/�D�c@��"�a9SE�$�$�@�G���p��XLE�mT%ο�?Pt��t��ʸ���Ď;�08wY�L-x�|3ޅ��k0�E
FAN�O��}�'� (�\A�A�Ǹ�ӕD�W�܄�I7PK�f>�`?t� �+�P@�E����g�����&�#}7�}��
�_2L\@�.�D>ƺ�t���"�
>�r�1g�@�o��'�����T�G�Hu)}(,Y�BW��`�~��cW���ˎh��|�,������5�+c�.��=�+��۱[�7�M�`��� @>���5`�B�N���=:��xqPQ=�]�Ƶ��	w[��6��(�V���3��(�t�ngP��5]��>7F��뽊s� �@U����=��^�J�b���������i0����DK�B.�=��摃I�m<K��b�G}����(p��7*	�N�◎�������6��&�}��ޖ��et����ԏ���9>#%
\q*��3S����7�=���;�e�A��{�q�*�"���a8O�H�lE�,`7h����O���_^ê8ҽ3��+�_�N��v=�*
��*�W�웂�ʒ��×��u�U,txVQ�ZЯio��TFc#|����+y���w�Ԁ$c�j��DH'%�/o�5b��4����RÀ��MH� �o������tX닭n��@���o�fP��C-��M��d+I��`ڠ��g]��D�3B	�D~�xnHg��,{A��X�[i��ڦ��M���c����ʂ�q}	�KQmO,�b�(r��:Ӑzʓ0d�8�{jCZ#��8��uY��B�y��T���4�F�S���q.��e�DT�(3��N�H��dގ��`QYC�����P7��C���@Ԧ�C�aîK�e	j��N����(S���7-:+Z��2(H�P�����W�E���؁�[��]�����D���֖lV�Q���\�n
�p�IWp��22"��i�k�nmp�Ɓ�����s�{=R_���ߜy0�!�S��yD�r�GQ��A� Pk��yQ0�Y���tݒ����)��;3~.u��Zs����7��R	6�eW��t��*�3�RGm��v5�l�zFm3�ѥ\;� ���/�2,�~E�[
�~��T�!$Q�r�q��W���4��C_ ,S�z�=E��w�6Y\���}�L�`r�>����x�ݓ�.
�Qʍ�ʻ��69i�i��*�n��@�>�~�_�/��G}��B~l�\H��jz�ru{��א���I�w{��\��	����ӠC"c����K#c���&��̏��)n0���bn��5�08�q����7���q:u�u�M"%s����$
��<䇱��C���@��o��7/v��r^}0?Hgx�H��"�L0�D.�Fh��z��CM��*���k1�ܲ�Z������I[��_Q����@|S�5QPS4
�쯗�}��Tb����Y�������u��������ۿ8ɇ�u�d|,���x�$L�Oq��T�At��
>�S?�$~↟��}
Fƒ5���
k�*�e&K���]��ʯ���
��ͱ{����ሳ�@e���}�dc{����ɵF�<R����5G���З���)��O�;�xzD3��]&k�&��f��_^�O@�@M<��T���x�Hs�F�좍�9��g�����Nwx3��Nğ�1��y��?PKE��T(pip/_vendor/urllib3/packages/__init__.pyPKE��T\��&!i�#pip/_vendor/urllib3/packages/six.py�=�s�6���)ө�*��N{w��S�q����N�^�M��Ś"U>l��|�����d9w��D$��X,v��g�(^���f���l(�^�z�b���K�VFx� 2�IG�g�g�,�4
�H�X�DN��&�L�#1O��\�^r#G"���Ŋ�E<ͼ 
���
�6[�4�g�^"�^�Ƴ��g�RF��a�� ��d)��
�?�b|�@��\�)�l�Hd�%���h�>��`�2�đ9 ��P�v$����WR�V�4��H���$��8�bA]�5ND*Cd
h�=ո���
6S�J1�~/˵	��y�DP�$,?�Q��Y�)�0��0��
����^�j�+���*q�Gq3����UV���PL��
r�J�J��4=�P��
���a&>���W�'�b|).&翎����Kx�ħ�Շ�W &�gW������w��ٻ�8��br|y)�'@l|zq2>�������w�_�[�<;�'�����:�"���%�;=�}��÷����# �~|u�tߟOġ�8�\��>�N������1������O�����+ʅ4q�+����''XP;�u� ������W��ɻcH|{��=9� jG'��ӑxwxz��1a��!2��ӇcL�2�����+st~v5���ure�?�/�G�p2�D�����b5Q��sNd�����m ����ؐ�O��%"sE5�����Y�ƁN�A)�x&=�%h����Z�WY��Eb��n{�y
��<��"X����q���{����y4��8LuB~���*{Y��tm���J����z9�@i�_sy�ǩJ�yE�:qr�S�� 4��^9�~p^B
@S9�C�<����^�J��W���4�L�B����{@8s4� �ǟ_~b��۳�1�uc���/�1���C�\蛞�?tVэK��������I�	*k�W.2�A�d�!��#K(mD^�֩�u��ƌ���.�}�X^zi���0�ͼM�TrZ�"���v>���#̺��:�y��6�5����*�2hۥ�.�R�@�?�;�?���3��^x�S�CR�����1P�,���+��b��P����B,Lt�}�9�<
%����%�$�/��b��fâH���mSwaq�������z}ּ���ӌ�b�g�d]*��áI�3���9h����$��2�3���P)q���rbZ?�ފ��Z��o�^^3U�K�7�`����oJWr�b�ƞ/[�+YP�YIp$h�]�n��F�(q�'<��Q���g��$� �q�
�!��ę;�<���[ʂ��9缑jR���Qs����(&ʙ)���]�۳�l�(��1���*�x���t��u�u��L)�HXܒ!�4�!��,�Y�Y0�	1_fh�H…�8����EěG����B��Ew�-��X�Ӯ�[A��<�s�߄*BPݒ���O��S�F���7V�$r� E��s*�j�A��V%j�w�����V�mI���e`��BF��թh��F�6	aL�T|�Ms�M�|�*�:ؽ���Q�H��0Si��L�<y��B,@���uZ�*.Rɭbz�ʰ���xFX�bQR��{�9�+BW3Q��wQʈQ�U�)�l�������;��[jc�Ԇ6�g�^�f�[�~��;*�$v���
�E��
�w�O�_0d�7�p�K�P�Ӧ�~�ʍ�0S�Sb�E
�����$E�[X�$�lf�Tgi�dm��)X����fS4��l�Xr�E������s㴑 ]�v �A50�u_Ѐ���WC�V�[���Zo���h�j�ߍ��x�VW�!�h/����aOd<�e�p
`^��CZ���L�P,��l��,�Dbp�PJ�F��q�A�S�~���Pb�������=1"���3�g�b�81���1�&j���=OP�!�AJC[5��7j3Z�����T��0�Q|�l�"���U�V����H<��i��R�@�z:=��i��R��V�}��k\�b�C��Ҡ��q%e`�6�1"m�z>0/��b����r�a}�����F���Me�1(
#����ݪYj�n{;��aU�7�n�;/H�`@ك>ٮ/�1(vg�n�n|+�B��ׄ�g^Js�T�4���<������m,�5��!H�gTgr@�k�˕�9������z�C�JcL�Ux���*����d�Aꮼ٭w�����߄idI��<1����i(�H:�\�'�R�UC_��i&�	�;Ip�Bp���7�ʑ�;�p)�Ox��5��T�\x���[Z�bL�n�1-�DP�V�Ǥj�,�?� ���,��tiҷ����\�F�֚�.�ͮ�K �4Γ�mPu�^�~�KMZQ�Y"�L�mۣ�ї���a��pծ�lda��k����xC���Lj��ej�T��ɹ`ON��w�Z��׍O�<�g�%�(�n�]S�Oȕ��?�����9]J/A������P[����2�!
e0꩙V��6����(�_*��+�k�:�Vyƃ5�)��l���5p��J
�ȁsk�Yz�n�)�i!�0��(N��95/�ѧ��Ӵ?�3%c���WI<�ik�/���`��a��pw������Q�!�k�(�J!�N��Ϛh����
��P>��qF�`%YT���Ղm[e�B[0>�2y̨i��Y���u[YE�lhT��%*󧑋�-���Z�
6����M�0.�wHD�7�@گ5�R3^%��z7���hܬp�����_�{BQK��7��G�Y-�b�%){�O����-�i5Wc�N�R�����&8�to"ve���`RxT�ipJ��������L����������Z0e"M�/�l�M|�?��e�/����"{���+�i�2tq�8S��@�k�L�c@Z������¼��US�a%h�K5�&L���]l�-�P�s:>=~[JA ��6���Bi\N"R���2���gez��d�Y�w�U@G-e@h�VL	�U)�Rp�L���BT	���Ç���K�ܱB�S��S~m�q�˸�PK�Dᒆ3e���Mtf�얣�q�OM�2'����&�D�����Ƴ[����~�Ψq;�_<��&�얂Y�R�`�xaL���yRy���B�v���V'c�t�Jg	�=�V�K���T�+�u$�(�c=��W��"��]�F��N��ՏƂ�.,hw\�
Yz�4����|��L�F�
�q2[ı�����)����r��8��z�� ;�{[V��IJ8�#�l�͓"��^u	�%�L��ҎS~��ł�VU{�۝�7OB�Kܱ��נ�qZq*
�{�.���:IjM���Iv����2��qV�5�WŘ��D�a&���p�r����(���m�vz2�8*:.E�躾��P��A��)͍�`&�"Ve�n���^���SI�鹤����zW=��|���M��Io0(&�x#��)S�7(�W�^��	k3O���T��g�I~Sʰ�{�x��⣾:��~մ^��s}5��{�|Q�f�?�V�i]��� ˵Mn��DZ�ы�e�i�^���g)ޟ�fe���=�1�;:3�g��pd��aR���GD;����MQ�;���SJΣ��6�hƫo���<}<n�X�Bܭ�b���d�K��;H�D��*b��&Б��<��Ԙ0�I�;�f�t�����G��6�5��ƾT]���	D2�����-wrt�n�����m4�/�N��K)G��]CLP�ٝ�ͽx'_���ZI��[�)+����z�6��樀��p�]�
(i��������u��*���{c.0ѫ8�\���Fs7T�����),��٩��|�Jc��,�~�z4)��٬����f_Me��Ҫ����╌�5OѺ$c�0t��lQ�
$p)�
�%�
��z���4�]�od�J⇠%`ـ=Qٻ����.��9m�c	t<��܃�9�^�;6ҚH��y*^Թ����0Bs�O��8��8�Oo�
�OA�P�5�^�܉��4�o�A���a�-�ZɯB���P�{��ר�סD5�zL=��)p�I�O�ț-�i|�h��S�H~�i�
�	o�n��f��|�6������E���(`߹�q;n8�	��3��;v�L�V�y����-��.�V�;�
�3�n�n�@�D���tE��`Zg6��E�6u����85�	VCjN�>�9�M
���hQF���q*�J��<�=�.�ی�EV�Z��h���Z���vXBY�USP�Ͷ`2�0�bm��ك��W6�"c{�� �~���[4���-��������*Ǫ�
�ؼ�h����
X_��r���7jb���Z��C��T��RIW�L�h#S���Wx�	��¤��3"拯/Q��GMS�����S�G��:�-1M_�p��F���ږ���W��|��p�y����W�Ŀ�v��v���WB�RO�i��bs�/�S����S�������yQ΁ȩ2�X	�I*�L(����N��>��GO�J->^�p�D�<�]\6�,s�Ϗ���\ؠ���ق��7I_|#�֣!�����/�\�\rr��u�Vj���q&Ab��'��ՋAg�b��ᩜ���H���s�S/T �!���U���T��Ƕ
��M50/mU(%��~�^���������]�	�C�S������}edu�2�����V�l6f^zS��]?v��a�c�z�^�`�㼳�Lj�{#����-��)UD�I��i]5%�ṣi�G��O��:*��էy����<P�c��+v��O�ti��,��i�4�b�qъ�)}}Z5��5ll�j]X��8pd�)���p �j
jw-���\X6in�Y\VI}V��N�ת���)�hj�v
�ȌO�T�Oɤ���ck�&;�X꽩�$j�:���� �8�����U;W1t�kD�][��[Tp,�׎��*��/lGU0���N�V������!�! ���i��f|�D!�]t�0T>�\m�g(�.��X-[x�4�߀��ܾ͕h��|��nG�l����ͭB�H�Fy\�0��$�jF��Q��Vsl��Q-b`�*q����6��0�Ć|�Ձ|��'{��
�6fi%U�M���;I
�+}Z�	���,	ʴ�V�?3�_Z���t���oT�qR��=<�18�\`��s�1?Y�C�IQ����4NHv.�g��m���Y�j<|E�=���%�<�K}��/h+�
0j����f3��E�
0�Ď~�����sԋa����SÒ������1R��q@��e��W_ď╵Śq't��D�ȇ������0*�u�e��ުh��Ux�RF)@�%o[����U�ݬ�,�Oqr�%���֙�^������-6(�:Rv�:�\��L����	���!�%W�3o%����
`RQ��iq�C��_lwo�}0��#����ρƳ-�|X������?�\�}hۈ������˖�a4�`Y��~ke��O<���&Br�!�Z�:�|����f�*5VG�<����{g|RMV9~�AkB�إ�,��\�EcSiO+g�t��\�&�X�=sD'�X�p�$�><g��I�U�l�:��Ȧ�s�j�cP$��z�>
4[Y�>٨08�M&]�Χjeӆ�i:���ܤo�M��-P�>"<b�LW�G�
����\��$�O�A��p(u�A�n��K� �c@�3�G����c���5�f��u�t�8M�W��k
������n{���W�`�@�Ŝh���!��fS�L@�"��*���e��܁-�t��Ǭ+%�^��*�[LY]-����D��.6�`: o�J���8�ne�5����f�K�]�\��-ب��^AW�u:�������P�F8���J��W�D�E��C���A���t��}ɮ�+�	;�xEQ�
6]��q��N��F�e�\����-r�{�7�9Gte֗�4ŵ
��#�%�d	��Qt�=���C(���$upLJ��SejP+�bqv�ԇ5 :ҴZUV3�|�h�_����BXj����c�Q�Z���x]C��W����Ѫ�HQ(3��q�E8��i��xИ�LeU'!�V?t/re���dV�h�&u	T��J�rc���,�LKg��?v	8������e�fxR-��7�x�ڌ�u�c�Wj.鴀Z�%��V5Я]s"�e͑�-j�p��
-rA�6�q�7,@��`��	��`X&��ە��
�NrC�G��0�K��T�M��ڌ�3	�="�ƓA��Q�li�������D�H��Ph0�����V����Y�E?
�t[�Z5�2�xZ�>�E&?̔���@�H�$`�+J�Qȥk�c=P]�#�h���ٿ��<]T�cLxr�(3T�X2bj�ݴ;��H+�f����4`+���T�e&�f�,��Z�A]�A'�o��k��8�{܌�oo0lys�Z�)�+��x���Z��Z�3�,��2�z�M(���.3��s}�*R��^kjf�R���e]�5Pud9�}��B�wd����sE
˱6i�s����k�7�ԑ�5W��)�7�;)j�߰��s��X
N	�J�_$h6
I�^\O�����/gxI�e��l�x����X�V(��tieͫ���zG��rG�mqE
��bh��֫5]��
MZ.߰k��R&u�Df�Ty�X����?��j:���L�s1������uº��ͦ�t`FZզ�S�6&�g-ˣ�rEF�ӃB��S�02̨_CP�T�F��rz�Fʨ���-����h���_�H���e6-b��b@�OT3jS�4�æ��E1ο�B/���ސ��N"���w��Щ����Oz�Z(�dHׁ�-.�~Hu�&m����/r�UsV��~3<����Z!����F+w�,L�
)x\8G)~=h�`��4��!@S���A��x��G���x�+h˶�
I;K<1C�=�GϽYSgF]�9�D�)N��:���J��=*�S�>�ơ]]u�����x�N�7����@���q[Gԇ�CC��\�c1��$���]X��y�/�Y���`����hJ�=��h�3j	O&q/���C���ϒAӓeͤ龜ż���Eۑ����]r�إ�w*Q��y4L��!��_��˜w�hx�<]�2�{K�z�q4�
�t����K)���x`�>��:��g
ư.���j���=��9o�*��H��`�S�����`_L����P�d���S9*�(k���I
eD�V���A:2�]�<�������9�3:���/x�<}�\oR�.�T�6��f�^�k5¼/~Rkt��5�r]@�Bpr���:�M��--j�N�,�#VTtd_ڴZ܈c.��'�<�U��@C��p��J�o�I��̼�o8,7"Nj�ւ�s#���V�(
�_��"�9�q�2�KE+��J�ż߅���^�dJ|譀f{���i�'51͂᥾u�ݺ���V���1�����s%I�0��O�@� ���5Ѽ4(���S�G:�-s{�S8v��G�\�{z�-�Cܖ��=TaH�P����.N�t\Ry]<s����.c3KKD򣝶�gLP�����
��X���U�: ��P-c�8R<AV�	K�I8�5�ny[�hz)(U.f�RG,gQ���UA}6����_q������hpoE�@S�+/}`��`f^�J{.J�F1<:���J�Ẹ��v>0iD���?������F_`d�zO!{���!Rt�Q�ǮfR]_��}�+���j��`(Ƴ�8{��5R|����-��t����P�o�à/����}ߧF��Džx� �>���a2!�o��%��J��y"�X��&�f8a�v��tP���A�Y�u�c.KtS�%�m7��!ӊ7�3�!*������3�>KW�pY#�ADGʵ`E[%1�/SG����
�MD�g��Zq
��E�6�;bp	���Y���3n�K	�^
�?�S��(�KD��;�JK%�ҽ�d"�MM	!&�H��o�a�b�k��g��,(֙ep��,�`�s���h�!�J�eݓ]�}��]�uu���[��E�Wk�Y����k�!](o�L	�����W?�ρ�(�=��ze�E݋FgB�7]�UvZ%�0�Z��N�)��'��&����Ŋm�-���=o���de_BJ>�"Y��8�R���?0�{�PKE��T2pip/_vendor/urllib3/packages/backports/__init__.pyPKE��T޸c�H�2pip/_vendor/urllib3/packages/backports/makefile.pyu�]k�0��+�xK���R_�,��XK?�M��ǫV[
�</��O��׸�h#��<��ձ_��v����9���}t;�RJ�l�����a�X��ߓ���$�p}0R�{�l��=��7h�K���V#t�<6�V��̐�	��S�Z�|
r�w&���ƕ.I�d�q�֯�W��+HgY�n&죱�������mU���_��)�֤�RR���\�_����\[��d5j�o8Y��K�ilof�:�ࢀ'��ܟ-���G1n����箻	���y�Og
&R�PS��յ��(���O���:ō���U.|��؛(cD��w躌i^ȴF{椷�at�SG�>��m�7 2���7��$��qYGޢ�<L•G]�OA�O�Za��]��Op
���f#	�v\�e�y��t��n}y�X�oַ���S@Q	q4�����AhE�`	�XC
M�m6F͎��i�p�<��~��6p8�e,r��f\M,��;x�B���u�dEI'=p?�p�^b�����ю ��@����W+�{��"}$��C֧�q�/���b�PKE��T抙���$pip/_vendor/urllib3/util/__init__.pym��n�0��~
!�l��7�!�<4h�vz؉Pl�b[%'��O�EGi��%��ҝh7�MNȃ����8I��ߚ�AV���ڊJwF:uP�r�0�Ϫư�
w�Nk�8�8"�SҌ�=U��rJ�|��p�P�6�M�w@�8�|]��-eEz
���MH��N��(k$;W�F���U�mt��֋1�����D�o�ɷ���n�۔镽,K(��)X�����ٶ,73)��[����w�~�\�\�oY���?7��Z$��ߑ�>p�$ݞ�Q��{<��
�nN�.$
X]�����T�z���Oa*��{�Rj9��T�����>�H�������Kօm����M�ʲNoᅔ�$�m�g�9X��.�G,bg#��[Vn^2��fv�N��� �¡</��J��/�<�d�s<�� vf��Y�����k3���w|��>������q�PKE��T���%&pip/_vendor/urllib3/util/connection.py�X�n#7}�WdnJ{f2q�xc'��ه hQݔĘ";$[�����[-iv���⥮�N�2zE�j\cxQ����8`K�e�x��Fq�����]��R+g�2�*X]s��\��*�_J^;��Mg?���3���M:[��ywҊ/qkτK��_���/�>i����b�@NJ�6���F_���xI:��h���hi2��'�^�~kk^��(G�?�����1<h��4�
܆C/�C�LU`7��,�ԖW����̰��7�~�����b�\��Rp��_�󧏝���_�g����u4ق�n���~��E{!%0�g�������/�&��$Q�A��7���Rkp�)�>���<��a"t�Xsǜ3>�S��x
^�ğ���h�_=��Y�R�舿u,�A� ���Ohc" �M�fa�E\��$?NI�kδ}�.N@@��Rb���b7�p�rFw���s�pq�cь<���-׍��&����H�?�6]���jT��R���,y^� ���S�6x�]�X�a�B<�L�[,�F8��mU��1w��
)�
A���`���GŁU��&a�+�%�܆9�㑝XSBU��v7`��qcQL%l��oT�V����Զ��-T�[u��;�&����=K��$���!�g��Ӏ������Ϗ?�~.~��t��y^���{|�OcA4��E���:�*��Cܘ�R5E��W�򕧖�H�1$���
I��{9�Yq�wߺ��r_,���.�F�:Y,&�Y��O�?���b���w�2��m�>B�P�P��2�v�Әt��C�!�1-��~J(B�ئ�r��_���z��¼�F�N+Z��.�3
�,�3G����E����l��_
SL /l�$!�z!�!�^����!���E�$ХPl�k�v�]�
H>)���� �`aJi���gR��oѹ�����H�Qy�X��1=�ٽp�l��x�S�W�!2��?ǑÌ�-�w�r/jvL"�z�aR�=��5Ŋm�l�Ib2��u�L����e�Ȇb/	�
�+���k�
d-U�{��˴��4��
#��n�Gis�H���F�Ys�[-��DI�
��F���KWW<�J��
�(A[����g��0ayA�̺m�9���f|�����dK.�J��(8�a�j=�o�5�i�\��&������r�i�4{~����y�����a�p��5���h��P2�!G��=�1D}݅8fLD��P�>�3��O�炊7v�".���5*�c;Ue…Z�1^,�$��p�H;��HS�'J'�_�2C��۹�8/&���c5C����lxrr�<� �l����gz/#��[��H�LJ��F�I�㧽�f�a/�����$Mg%�j��p4|=4;�Q�*���a�����p0K%������
ăT��lP�����
%;�1Q7t�̄�	.�s�MO9��>4
�d��S���t�1�s]�	�K��A͍�0OՖ3�3�*rs`l�H<�'��Wǵ����y
�/�����7}��\6���n�-D���ׇ���0ΜHb����@(����1YR�kqV����!���K��jr+:a}�X��sK�0�7ڱ8jEi��.�G�Uw���Z�g�)���L�"B�!
_,)��?RCg�'��V���>s�_[vv}�Ɔ�,�3�׍�������6�^�}��&���
9>�E�/��lr��'��y
�᫮y�`�X�WϞ��h[���扛��@Խ���dB��%C@PJoW�ęr�U43o)��fJ���1����a�)�o޾=sk٬->���\�u��������c���͙��{K�L�ʠ{��Olw�ICCj|�2~ĉ�m!�$)�O�:�J�fo��
PKE��T
�\^E!pip/_vendor/urllib3/util/proxy.py}TM��0��+F�DB\z[)���V������%bӱI6��c��\��|��f�
�=�t%�}��BE(,�u��~/+�,~���XVH�$�gf�? �U�$56�Q
+��:H�,[k��|�e	�ӓ�<�B˵V��m�.�j4V*����=��d��3�i���hR64 �l�8C���f�����j�~��]�}�"�{Ab�� NJ�qf��AQ̛��<�Bs����:���kC�u�J쐊�'5��H1��0��vy�����=s��V������DJ[�T;#��Mp'����cG�,��H�?32򝁟�3��J�@
y|�m
�@Έ@t\�@��(��j���%��^�u�������Y٣�����H?.u��h'�Tf���b���%���A��30��w�����^��t�f��a!���y[ǕA�eK?��;�h�+��V5����k����ھ�B^�4+܈����&Ni��V�da����A�X���'c�T\�����6�0���s�e�"��&=�7�c6}�Er;9n��B^LDt�$}|��^�N�Z�"�9��u4����y�"�[�,��9'�PKE��TN����!pip/_vendor/urllib3/util/queue.pymP�J�0��)��	Z���WO+({O�4�e0ͤ�Fŧ7I����@��	���	:v��؋Rv��m��^P�f���oJ'L�������"���>(Hg/��
р�1�Z�����^��
g�zI�]]?蒳��a�@}4M�&:lf<�y�<���)�:׊��,�*uy��y-4�i����f��Ɉ.8n�ILh�Wk� �K�CLw4�G��j���C��ӄ��tzS��z���n�
��PKE��T7�m��#pip/_vendor/urllib3/util/request.py�W�o�6�����P��l�Êb0��N��$X�}
���1��H*�[�������b����V9��MiK
q�D^(m_����96D��^�lh֯^�LT
�m�c�J���԰2��NU�_j�tC^��߁��xl�N���@�v_�	��57�q�c<+���
�V�-��Y��U�܋�!�
ynjʁ����f5�[��i`<M!e��*�V$<���n�)��2�� �	�V�EB�Ζ�>�Z��ȾZ�W��o�e�O���$�E��o�������wv��7o�x'�:����Ų>�A:��g��ϐWJ�VNY�E��]�*N�� X��-�o��������_I��gQLS�d�B��������o�$v������C\�`0��1���\*	SwX�7�x7dN���<"�1�[���q�J�!��	O�����]�a�o������m�f�4w���W	�6��G>/���L%�>�Lح.��/M
%JJ�
�y�Xf�eT�����{�%[#��Z����L;eh��I����Ϭ��P��z�gnԑ_���,C�-���Dt��,Qy�;���"DC03)��A`����6
�Ph0xCv�$Րc{U���)�-�o��bo�J�J�eb���ѫ���˼3�!����#M��,��N�й���Wi�W�r��D�VQ��|��'g�?�A�۠$�B�j�͙T3w2@���E�y��z��u����&S�h�Sns.���'��/^I��l�Ŕ�:<�]'`�
�B�������k�4]��}�.��xa�0B�eCC���IGL�|{�w���4Ԕ�aD�;d�xz|Oʠٷ�u8�΍��44�:�ZA��Am�~����z{��'l*����*���B�c�����N�d��N��nf� �Uǫ�Ux�����i=��zܤ#}���_��%M�C��8�p��ׇx#Pn�� '�k\Ŧ;g
��S��`$���[�
���&�N���F8j����h5:�
ӓKM�Z8	CQ�J�2�Z*�h�wq�Vɘ��<ڂ�A�zu}Z�2\�H��@���"W�>�?"�W�n�e��+��N�Ս�1(rZ"QU*6�4-�w���`�jG�[��p�l8�p�3���
+F�N��$��&����f�3��#ޖ׃���xR�?E��O�SL���Y�r!�W�\k�s-p�vK%�Y�4�a�{m�h�0X�Hz�w�Y&�^U+�[�A��}��I�t��ћ��7�L����(N����Pm�j�=�9�����t�n3�[�-�Ƣ�X�����ʹ��芩$)5f��[����.�U6�,>�'�+�����H������I�^Wq
��X:���=��ҭo�������^BY�:�����a��&�~c�53��;n��L�g��@�'��PKE��T6(մ`�
$pip/_vendor/urllib3/util/response.py�VMo�6��W�Cl�Q��u�n��!۠�.
�CK#��DzI�^�����e'Ȣ@u�%r>�����4b�([�ZZ,�j��z!��ԭ�E|�J�G�TuF�뺝wm��ZZ�7�*��gej��賓���'��L�iw����br�e�5�5��oHd�uJ��9f�w-�'�"�9�5k̆z���"�i���Z-G�QA�PnQ�qTL���|$�����ɉmE�"+�X�
iQ��Nk�D&�nD����
�F�<T����s���x����i�G�R��Gx�0*-r�H��|e�(9}�#/���l���q�\K��߽�[B�5��c��Xq�UK�>`�Om-�{%㍒�	S�*W�ޟ�4�+w�Ki�$��T3��$En��J���AM�	�}^�J���y�k܅0yU�uLO1�l������_ɭ�W��x�r�|4���ɬT��gY�q�d���˚�>y�
�ӳ4FI|O�ጬ_T����B���h�x_�"��ܐX���yNΕm]�;d����Woe{�9�����]�"�T�)�.Bj�_4�n�E���oqq�_��Yl�ѿC:���<�c�6dU����N���\�&{.1����MǑM��u�o��(�V�)�=�Bn)Ԗ����Z�OJ	
�pM�Α�-Z��U�-���A�r�B� �5h���R��z������i�uG4xG3�~�]����}�O6��F����P�i����%7������xZ"
v������E��zo[)�(��0�X��-��be�}+��q�5�݁���N�tf�
Tw�V*m"9RP�ą�H�t�Q���T��0����A��80��$,�H�fb��y����ۗ�Lv��jC 7��.
�T����)vam\Y���UP�#�C6�t���t�a�v�D�������4v`����#%e_�.�З�E�m-�pz~"�����l�|�.��4gIF�_�#֝�=?
�
w�Zi�0;JS�f���׮HÍ���"��j@=�f�<�a‚w�u��͋�q����}8��Vc���K~�ҡH򳗅?��|�!?sa��1͏����t휼���pL��u�@�}t,����$�^��١�˃����v�M ����]6���4�A�V`L�R�\_�?M�b�n�.j��iUϥ�Z��5f�>���Qk�J��݈���Up��MR&�Q�W�N� !�f�8����w�s��
X��28�Pe��Ѱee��p��U��Et�cp�������1`@ø��t?�s&� O�S���p)�3t�;�0v�.����笅���ay��G�PKE��T��5���U!pip/_vendor/urllib3/util/retry.py�<ks�F��+��K	L(���˅��D��Xuv���]�| HE�A���(���������~�=~�@�L��cz�5\��EѺ��GK����X�(�x$��z�=��I�����M�ݨ�WOU����ȠS�[�L�<M��J�TSe񖯪z�r�%�xQ�y�;T�G��$�.:�!�[�$�1��ȳ��`����E�Cj��n�4Y����Wo�+^�V��E^�B�՝��
 4�_�r����@�s/?�7\��L�z=��(څ7�z
���)E�^�����U�ʪ��������%�*Ǫ
g[^�+엯��k^V%4�Ȋ�N+�d,�g�2�]����ʋ{X��� ^�����}�a���_)��!>�U\�%>|�@�(͗12���'p�]�_�����9[�,f��rXdR2�
OY���e�%�'Ն�W�W,�{�9_Ljք勿��N#E��7$��w|0&�~���鞾����O_��{=��Lg�.ϣ__]̦�/�g�2-� �(�
�!Я�L�J��Mv�;b�����w��4e.I�Bfݞ����+�����_��r�k����b�<��~���~�����]�{�z]ȅ%�`�~Q�v^���QAl��D�jz~q5}1�^M�ΧW����g/��1���#��j����S=��/z�G���<!�F�K�3���_ƈ��9 }��e���?���[ �t.�Ǖ]����ƗJ�J�� V��$�~[*�W�H���*��0$���>�K4['7uAK	���r#�%�;0_�e��<`Ke|/�JD+�nEԣ�gʜ���vOFP���<��u�Wr6��q(����0�J�:h��l��xܳe�FN$�Ka�N�BS����a�M�3T�T�Ƽho�,F�SB����
���Pڗ�����ѐ���ӧ�.ނ.��ӣ�X�e�`��,��
�SɊ�d���w�p���*�LYNF�A;��2^�@��=ہ����_�i����[�+ נdj7�x��iL�:��L�4Y<����qR��R^�=[� 3Dp��˸�D�e\z�^B'Fǻ������ʫ85je�_YVo������Y���>d3��J�ۚ�x���j����:���P��@�_���϶O�NO��@]��q��E1X8A4*��H�]���Ð
�(+�	5GH��IK��6س�9Q*ʳHo*9�I<�
�^�{���{�������B&��S2kq�
�z�^�M�8{F�V�0�K! �z���*yq��]��?���r�E��0�H��8X�BPpN/A��~?�Qb���5Ʌڪ�V?p�B%!4��ARI�����K#IP����6���P�����z
���� �B�Z(���
�M��ې�N�I%!���� pl$�C4�4�w���t�������
G'�Яi]q�lt2�?�������f>���P��&_$].񦈑lIŷ��4$��rp��A1q�t۸Z�H
f>�0r�Ӥ��O�HA~�B97�ӥ��V=S��/�"��14@4��m�Mn6�9a����n����ҩ��4�8�Ӷ:�}t�� �+#쒛
:�]���JCC�����g���i]��7�4���Ȋ�@4�9��do�%�4 T��Q �����.$_�D(7y���N���Tb�<##VJ��S�,(x|%�0Ɂ�����T�[����db��{��1L�!A��$�QâN(j|����X/��a���[�Lwg���A*Y��P9Y������M���5
$�i���" W%U��X�K0�=�}����_�	I�K�.!��[B)��@H��}	! *�L�b`�w�p�D�{�ll){����|��!�b�<�lժ�T���G����'�R�K�u��hq��u���U^��-L����dZ�j�y����Rk%�]��N�́����<%VnAT�x��c=���נ�5����	�� �L9�!�|!��.�3����k��ɘ����Y����C�֣Ք!�D��%y� Ł�u�-���3�����p'�(<�����0?h�ʕ����8ڧ �i��X�Hj֮	�B��(��R�BM���,�Ue
;d�~�p<>�J�m�Is����\�
�6T;��f��1:�}c�馊
"N�gwwhth��Hb�`Y�q[4�(���[�[��k����@c��%Jɝ��^�h�VPF��E��E�\l#rZc4E�q���+�tx����W1�� }@�1�+pׅ�%��0�k�㊥�B�y�rd�:���.`�P���@�8�&"X*8����m,�b��pD�'�P���L���)�.H�g��Dw<��3��4 g�]MgW����M�������u���|z=G�q.��K��t��uR�RX�ՕVĀ����z����l�`�;v� !�ƫk;�*pEW���PnO�L%'�QD��p鹮�;Y�����r�1��Iן�3����;���Φ�t�vvq��5>ή�^L�h�L�����܃"��ig��=g�����ѳͩ-F��vK�G���k%��h]$�ɼ�Y��d[o��G)t�p��'����G�8QdS�tm������y��hr-Y�W�Wҭu_~x/ɉ��yB6Q9s�a��=�'M�{VԼ�].�m�J��n���w�F����\[�C�2�����&�m`�PpX���7��%x�8�_���2�F��|�$�ys�$q�#�#�q(ȵIpa����`�9 ́�́D��\�R��Rn��:��jЭ=a��CI+��_~L�8M'�n���/��T��"@����:���Ú�{ku�v`�7�C�y"��D(O�IjOh�On3ņ'�M�y�M��sEl"�
.A�f8.O��q�
�ʄ4��c��Q\��5N�+��q��rF6��{�v���wx�nA��c������j�h/�I���}�Q�} ĺ���M��,�Y1�2�p>�cOd|��ǽ��'���7��1��qU��7��3�dl�}�6y�:����%�n�0N�Nkm!�R��,�q�|�v��e#�tG(��X�����b��鴖�C_��4�A)�g7�-xP �(��������m`�[��	F�A4€���/�V��+Oi,�dC�+&��Ɋ[@��ܴtP�0f)�k1�B"�REk��9�'�
�����s����$�
!�Վ�I�>�>Qz)�B�Y�
ñt$.Gj�(j�V�y4㊀=����/1��7BE�o�냲D��;���Yn���	�Sء(
@�[E�0�D�~|���-w�O$��>0��f%*�d��*�!'I�1ɷ�N�~���#ê<^���v��Iu��n�Ԅ�0�W!�4�Ĕ{�L x��QuH��F�G�O�(��]���[I��gKhI�ِ���]���h���D��]ᤍ̢aAA��z���7�/ꛠ�"�nA�pC6���W;�w�۷�d�����E�HÈ����/�Ku����
@��L'/}�J�X�6lX�����E�U���A0)�[�%Lw�S����7Y^�xY90�!k\$�E)]�۶���� ���U����N%�ҁP$?pΓ�>���0��$v��Ov�*�#Cd�6�H��Z�:��1�H�xsl�,p<*+05t��LJP-`�X��40�7�\�Qo��x	r�Em��S��&���y�����b������I)K����ᷮ���!(�������G�?|����59~d^	���5U�膚6Q����aa�D�[;H�dN���):�\&
��kK$��_��3��>�1o��@��ic-Oؙ��z7{����������

0�ub�����L�=
�2�PR��d����O�Dń�l�%������~�&��ªڲ\,f����X���}@�u�a�h8��֓�C�C�<��X>�A�`[�����Q������6Ȩ�k��#m[_dE���g�W�h�q���:�a�"R�
8�@���������]FbE�vUP�M��l0MJ6�7)�zd�%'�ȧ��`>.�cZC���h���
Q�A�#�o�<��rǐp��:ù6j��~e� ��}�� 5�T�`��uq�[g� DȭP	�X��:�[b�ia���b9h��*�d���"R*��qn*e���*�Xbu�H�Ur�ě�q�z�&�/��\�!l[�U��D���x�ȓ�xZ$�;���GS��|8��0��F�<)��%J���@�GJ<�2���7S8��l�`��5�>Ǖ]����9��	�7��x0�T������\Z[�[�	,rh]�h��(�TJn�,N������X�h���/����
Zj*1�Be0yA	1#1;G�>��$_����T�$�2h\�v�Z<��3O��Z��x�"�b×KJ�� �]�h�-|��wX���;�����,�X��J3�]�����T�i��]/􍌩�����
�@�Yw艎qa 
�2Tb�{�.B�����GDjY�ӳ��
r�H��/k�P^���ɛ�?��3XԒޓ7��9���`�b��u��q,辰-pw�B1Ɛ�6T�x�����y���u�}�=��3�����U\�V��(��VEn�|�q���Zj�$.�:�(Q�<�pq�[X�A�<�#����偙��ԷOiӗ�J!�U�����/�1�����01��o"e�UH�cAf��XߠU�$kY��;�Mg6�eCRFE#�H���
�"�k�[%�z�j��rwN{��i�����U�dLJ콣�["sg`��E��\���;ay��h�.R��[SxٻCI��l][�nеn�ӭ�]"r3_D��/�F+��F���*������E�R��]�,.�]��T�wT�Q�҆�Jƕ��m�>�1��
�,D��#Y=��z*���FŶ���p��6ʛZIc�1ZlMԸ������~�f�t�/�)a����6U��3�P,H�$P�q��h���4��w��H*$���o��4��r]�D���	;���R���*�E�M��x�h�+��g�՚�z�b�Ж-+��
eZtg�6u**��%��x�N@S^c�k�Py��6V�[�Ӭ�P���N��CU�d��t�_g���\hrr;͔��"y����)�-��婉���#+��A����ufig��N��4�{˽l�]��I2�"�?`�<i�Z��B=���c-nB������s�.-�ifid��ߠ�r�u��ԭ"��E��[��ܻ��im;�!\\sC�QR-𮞰uNR�+���:B(�;M>�M��F#P��Vu�8�9�6����2��xM��.��j�Q��hЃl5d����^��鋋�jѡ(��剷�f��5�|Ne�7��^t	��
��VҀm�ᠵ�Ie��Xn�<'��+�����X�V8�R3���%fn~E�:�����un�d�ڤF��HJ@�c_�J#.,3V��>��>��<�Eu�׋4�~�d߷��>�"��ju)����D����@0����>5_?���~��8�I>��"�O���Y	�|/�|x��`qS4$���=;��V�!����4��LZ�x����+�GV�\��e��
?���>;�إ��V�U�'(k������*s���Πw��+��”��M*/Ts�Ж�m��_K��oO�@T��+�����
zPKE��T���ǧC pip/_vendor/urllib3/util/ssl_.py�<ks�ȑ�+&Tՙ�B�%y��tW\�^�"K:Q�-'������l6���{�A�[��RYx�����^��E�b[mEL�7yQ1>/�t[�H�w:��j�cs������/2�-���e��XJ�v%^R��l��K���*�s�N�X�������;
,�K,6�̳��:~&Y)bX�}ʫE^�Rd���_��x%��sVn78N$���v�I�%�zC�ӛqQ�E�雩7<~�Ka'.�~�-R���h|3�N�����������wp���Q�U�bW�6�>y,xV���pip�����L������-���������vz��h_
o�o����ǻ����������yx�s�s�>�Mɪ�`�ȖՊ��Y"a}�r���y*ho�b���v�)�d�`�,�$��Ϸ����&���b�6��ہ���z3�t:�X�(�m������)T�،����ڍn�KG
�U�\�\"��[���Ȍ^��B�Z��K5C�[X�\��j�������eH�t��
&�%;�W�*`<K�Yo��,E�QZ�r��n�"����S$�7�	��U�
�\UH��䦇t��{�w0L����+��G��#�v�+����i n)*^UE�:`]�}7���;���;a��W���II�e)S�jT�1�G�GP���<y_lW�MT��:J�لI6�,�̭��Uy�����
U�*�����_�fybL�i��\�x���
t�2|�J�����f���>�/.a�<�c���:��	L:��&G�c|}8�^���.h4���o����I�+3��G�w��������m�����Q
�
2޾����./ԥ3ƙ��	�"�8�a���d<ID���+���
�;N�N�~†L�S���%	��4�1�?��u�d����/�/�j,7`�A��2�9���l'�d��&Ӕ�y�<�"vY��xE4�����F�v��)��l������*��`nN7���,/�Z����>O�Z���R\�"��O���ӝ���4y
�j�ψxtK��\�
�D�`�M!��ke�V��/�!$Z�(@'2
¡YY�x�z��g���\D��@���\T�Ƅ,�b��ٞ
���G���V~/�*$����d8�1�˰v���Y�s�m��@����)�c� ��!���u�)d�,9���on߂��`HZ��{�i8*v=�*J����:�3�D�0��k�%���&��{H����Ǝ`����-��)��rE1�m'�j�ౠI��sQ@�l�����o�D ��� �f�a���g.S;����7��hr�q���;��e��?Y;٥�8<��磏C��x�i�?�xZ��̉��'�a�X��}����=O@�{�}��N���D�`)?剀���{B�ࣝ��|����}a���5�����W�t`D\�q�FhG@��8�������4�=����6�=�t����Q�S���I ����U^V_�
��ĐxEk`CC��n�n�-Hy�"_���:�H�p4]�T�$���7@���!�yB�E�^��0SL�n��.s�m��ez��4W��4Dp��B��fë��Ix�馕���
Gǃ[����E��x|4�SpHHl�뎆`��Uy!�h�`�%�tG{��̉D��9qзO�L-��s�J��Ȧ�r�J��cu�
�U�_~�ћ����\�5&6E�/z��!�
�@);c8X�	3���g�H%���i*��
@>��K�c��7`N6����I���)?݂E4���L�Jw!�_E!��oatƶ�e��<P% ;ذtڂa�
%��y�,�8�-�"r��8���`�p�I����Dvv^�_�x�1Lr�-��S�ׂ�#:�Q�1?�V��O߻{tK�����&�;�l��]co��W-��XP}kT��ZX�ȷ�o��1�_j��Ձ����w���i��*{��o�~�[�߾.���E-`SD2�U=\e��'�z�-�R�B���r#T��Q*�!B��?�N4���E���e�i��Q�|��0��H{AgV�%�K	�I:7*"���A(lE�f�*r�]�w�1���D����4��)!��]%��Z��I�Z���[���{�FsfF9��3py+��62�%����/�PY�&�N�O��Dd1t����i�fy�ol���X��_��\^�MnEj߮��;Yhp�II�l��,�D���=
���Z-�9x�Cj�Gy�)���XtMhB鐍_ ^E��E>l	��?�K���CH`��.��#f�(g!��G���@��.n������{���K9�.dl�ۭd�2ڀ�4L�rUӂ�1�鳵ד(�H�
��m�K��*�&/7��d0�1��<���n�T��B�T$��I(��Umؖ���½2@�3Ӵ0�UPu��sp��\���7��^�]�y�����p�'��YVo �h6�f�Qԫ�	�����^�Dm��y��zT����!�F�uo
� �L~��}���B��4;0�"���o�l
�
�KA���$��D��%���c�I8��*��lh��^��E*�ġ�zf�n�����gbZ�HG�h_)i�!�Mje���ufj�ꠃ��z/�ij�R	f�Y�w���CB��3�����L?�JP�Zb�U��X��<�2������j!
'ġ^�Fd:�)�S�}�]�&�.g��kUd������i臀���pʦ
r�yH��6�u�]A����
5^�~c��|0�S-2��	ac�$/B�o+�:��Ȏ�m'�G��߄�E��b���n����X
k���px�z�v^V�"a�g3�$?��l�lF�g3m�Y�!0He�u�?��?:�Yk� E	5�e f�( �6��$��)i�?͞����	�u+�\a�b����<�V�Em<�V����4�%��ۈ�E��{��U�z�?�� X���B�Dٌ�]֋Mjm1�Z|�̛^�@=�TW�,�gNU
�S؝��l4�v
^z=Q��V���/R��<��B��(����̨EZ'�R:�F賋-��a�aA��*0��,Ѩ��=h���9��u�O�31����n�>�<��ߔ������Lt���S�u�=��-%�"P�(���c��5Ԣ�YF��'��B�!˝m�>"Cs�p�F�ɟ[�K��S��7�4���[O��G`�K��Z�?a�Im��u�;+^�۔�$��|[ �����l�s��H�3��€E]�f��_:��#�,3Ⱦ������ӘA��1�G�l��<|����'!�������3�<��=M�!���_-�E��M*c	ap������
�]�A���R���9x�90g'<g��N�TaG)¶
��D{���~c�()�����,�0��cI�HJ.�HU��X}�E�]��+��zr�{{,H�Q��P��=�s�����5V~w����
�^�8��~W��U��T��Ǐ��廐��Y&b�^�iL�H���թ�������Se���ma{��W"���b1�&�eeK��6Be]

�-P�L��r��P��…�kd�K*�PmGL�0|�\ ?��߽����f`�MEu�]��Fф�w������c��,Z�}�5FX�e�q�z�O�ػ�j����AB�ٍ�po�A����\����糔|a���͑��9	���\�5��`M�G\]	��!�o2*b��0+�e� Lq�MP�n�G	Qd�,
��Ls�o��oy���GZ��:�vgt�2�`�Kv���=�4�C�1�9�8H�t�|!N�[^$n�c�y�Du���p���+�\���?�5�蠒L0����a��Iŋ=Ͱ�M��T�	�N�mG�(ʞ���Ԃb���y�=b	&	�ʖ���V`T��l��_��C��~!�t�^�o��9}c��˥.u��-�W'�,9EY1�Gr��dD�,�<��3/$b�(���0�rs����M`\�>kH~�4�XϪ���n<�
�M��u�k�����2d�^����p^��`*�w=
�^��:h����*~��e��"I�0��#p�"݉RU��<rJ'��69�Z�����©��p��é�D�S�<’#x��
�����*-�/E�G�l�N���Wz�u��[U��K)5}�؂t�L���ȃ�P��uF(?t�G�r�O��Qgx��>�NsS����ԣ�S�Ы����������I3���bP�����g�%�|�F�"�h������W��)3��N�z�R�zh?ڊ���(�)�=���o��˲�5d�l��
Sb.X�{�a�7�⛒���t@c��%:�U��p�uբ��J�޺\��v���yẹ9��&�|¾�!>��3�~���>2�ýņD�a���R%��s�%�V���ϪwVH��ZU `G�Z~
2vJ!�˃4��+��)ؘì1}C����)Mm�q
B3<D���1�s�mu�������4��#��M�m�x
Sb
*�-�d���D�	\��#UVDŽ;��p���=O{V	�0�B���Xy�����=��b<ܵ���7�S��)]�Q���*�D�\u��tb�a�@Dۊ=�����E!D0 �֔�t�w�"��d�仒�L�TE0X�?��'��*��n�tp��+��;<�\�8.�|��<�b27q�k��*#X{A�7�0/�(IQ�MD߬
LŸ���XK� T�-L���v͔�6���,#|���%�wx����r�K=�	�~u���i�']G�u�䥐md�"���Ó���zq��Bxi�=Mk
t�:��M��'�.��=��2�J(�8���H��[���&�hPS:���N�9#�g-ۍ�����M��+	,"�(�n
�P,		��v38��1�D*������w��T��R7�Ȩ̤�F7	A�E� �r���5���T���j���Õeǻ(:4��
������h��2H�'�ܘ^�h4�ת�G눵0U��7���ּ��x�Z8m��Z _9q�f������d��0��C\���22�z�{v�����,�,�;R�����M���e7�6��2�*4�=�q뢇�@�0,�yH�MwO�(��Y]:���#�
��D�?��?����6�|����ȔQ�����F�H�����'ʜ��eknӒZS|��U"���wS�F�}�����d&K[֢ΰ�Ou�ɘ��wh��{c<C�5�&�(�עT%�?���\����*�L��̉����ڙ�[ۣ�<x��[Ӂ�/�ݏ��`��y���-��^�T��0}8M&T0ɟ�N,�X~k�A���{�۴y��=�xH���B��h�	j����"' r�_���䂺�Ҏ��Yl*]
��'���2}���v��Oq_���#���������
�u�.�C�-(F��@��[^Q+���J;�e�4�$�Z��\���ݑ
w��R��K>���|]@�H}n��V[2�9{���=j��:\�k#�M��5ͬ�E5zΫ��\.�6��?��>R�rl�	F��ɿj��l�7��w�PKE��T?q���~.pip/_vendor/urllib3/util/ssl_match_hostname.py�X�OI��EiPĘ�!�m6g+���"e��^tٜ՞������__uϣ
l�{��~T}U�գ�$ɻ���p�b�0�i���ʕΝ2���,�j��|��߄��R;%*Z/���U�����dI��F;ta��һ��T�J�_�B6���5U*��J�/��_Ki�6^��F����<#��s���0���vf����V\�p�j4R��4��}�˨T-��vZ@�\�\�_��,�:ʞ?%���V�w^�r�]i�DU�\ljc�\N`��C������W���k�������:v�������?�~���f� ��jC��W�!.p/�x�Y[\]9Ue�V���1�� 8z�?�%cdu]����k6�\J��zߌ�].kG�~��iL��w��j9�f�ς"���=�A�Q^	�{)�J�'���7Q���q�Y����Y�-�椅�Pg�N���UU�)��a{d����<7M��`���/����2p�y���x�o�$r�T6Sҕ�C̜����N{k?�jU����SpII�8*t��?�t�F�kQY���U �gv���h'��J�n	k'��ȥP>WN 8�u�\��f��@�[I���Nv�����Xb�8�~
�z�b����f�]��ba�p��Pv�й�`���~�lJ�֨�
�Q$,��hn��4�P*�� G	)��^�]6�f�j�8%�BNmX�DJ�+e��D��`CbiBAbzW����%�0k��憈.7RX�!�ha6�*8/���������ˇK>���SJ�)��
�>;��Z��S(о>0������!X�j!��>���N���\��f�Iny��N����Wtq���á�{�'/	�Q(p�=]p�("	g�*_��pG�����)�\7�6JUb.�P;�u��og�+���%17��]jwo�����\T�ʪ�0!<v�V#��".®�8���دqM�D]K]���d����#�U�"���-��N��'�����۱��q�����Aso��	��˹�a#���~�X�n��#

��QT�_�^�P>3wk#3isQ˴s�s����.�:���C��Pb�hP{0�d��z�{5f��J�%���dB>֨�}�?zg����#��n4�m��4��qz�z�
P|�S�(������N}}I~ϒ�Q:e)��w@���/.ߞ�<�>�����Y�3�]�vf�ҊG���?��Õ�����<���HY7!(]��Ǔ-^��7V�|���/���vU����g�~ �C�0!���D�\)�*�Pۓ�Þ;$�h�O1��b�!�3��u�iD�aa�`s�?�����?�����YP��$�вs�t'���� K���nL�<ZzF��/�]�bl;�}J.W�]禖�8ۚO�`
7���xB
rh^��r]�2�Wp��O/`ڮ����^)��atY���i4
悍hG�-g�q��f���ӘH��H-O�����"N:�����L��:�C\~��*7�3��=J�_�d�{���Tai��w�k��.��]���՗N�N�^�{���|�`ƪ�ڃ�/
O����)ⷹ�c�����
��O\}�L�$%�BNӥF\!Ȣ�0Э�	�Z��[�iG	�6�"��3L���"F�xʙ�x'n��uf���f��[��턤�m�ޥ�go��.�ޝ_^���{~���_ߟ�={5D�_9�F�OK��vOʶS�gU�>l{N�(������0���h*G�b�ӯ����E����g_�3	��~D�;7`Ղ�y1M�����UE��cL�׼���� 4��#@�Oi_�-�x�?4#��:�@��a�����i�Լ
x[�	����l�e��������1�R��[�u�g�_i�����'>y�ޤ�vUF��J"W�/r3�[��
W�1v��o�d66;�Y�V�{q{�j�!��l-wu�2�<�ۯF���8`�߉#�C#��A�/�p"&�m8��N���z9?{�T\\s�0�����h�=(���V�Cܷm{���C�w�Ç�
�Z�!�}�s�����l!D-W8�~��=؏B
���CH���n_�h���VR�݉1�D��;�7��}{�
u�[xH��
C���J�o���F�S~�Oz��q�����1�
�~��mlO�{�:��}z��]��������k�@��Ge����~Z�"��PKE��T�����(pip/_vendor/urllib3/util/ssltransport.py�Ymo���_��pX���e���8��n�\��$�mQ�L��J�KRvܢ��3CJ&-)�õ���ř���NǤI����p�/[�Fk�+�e�;'��,���||,�����w�P��/>�h��|�o��ۻ�x�����������FEɭep�0\Y��a��3����V$��`��2��x��I�	�ã��e)�V	0�B+%
?�G����Ȝf�G���
�Z�6�q�dz���<c��R,;�ي-�����tX��1���F��0�q����ɢ.�)���b]�L�	O	�r�k� ��t[��k��
�nY��Cq���o��	C�ج5'}��E�
��+z�k��y)W܉��N<�|�M�J�K��L���wR�(�<pi�����;��r�#DVp�Ʊ�@�ZD�L���1�V`L#�QK�&��[�1"�p���7A�R�7-��F0Ub.rʚ)�ؖ[�0c�l�$0A�g�~�>ǏA3
�hҡ&yN6h������)&Sv��b�@k���N�P�)��ui��QZ�
�sYB�c0��Է
�{/"�>�Nq�-]��D��\�B&�X�k+�^�|�x%�?k%f�����
�l�*zm�S�H��F@��u�m���X���buJ���Ϥ*t��sd�(*m��7w�iJ�k��t)a������k2o��٩-���V�����f��]Ϝ�n�"��b��@u�F��%�Z�-�,�TJ*�R�ֻI$w��y˓��"�='�(�p�Q�P?S���u1�eE���D�kY
�_V�a�
Q�
���Ż�glY���P4���4kÕ`����;��p�.�C��9�H뉯%�e-���f2Ƅ��0:�`�F��DA�(Kl�t�x�J��D��t���4cjyt†���T Q"=�/�6/��3W�'����7͡(��%���^;��<Y��P+�$���K�-�Y����}�c�x,n{)�oʸe�kF��[7_��9����TH^h�qC�vIhYЋ��G�k��Q���'����v<�7s�O��?�x�lк@ͿP-F:�E�jrR������1Wz%�c3n���S�a�D��V�PJ�;�Km�]���R�LY�DۈC��oF�h�PTV����X�G3���!�A4c~3��R�L��R�VВ\
C��і��wG�A|
��Cm�ǭL߶���
��E:�m+�
W�g�0�Z�&h�){?g�"���g9���bI*Z(�]�k�&~T�1ȷeV�1����iԙ1P�P�a�!E1��pj�S[�X[bؔ����s��T�
�Q��]�@�p�X'��C�����a��8����2��<�c?��
q�s���m�������t<g�0�?/1��ُW�>�.��O��W9n��@�N
���0�^đU�6��GT�����у����T~����>���K�]���4�"_D%���G/"���v�r��>��!�'������y���iB_����'�v�MM�mJo[u�	D2�,��F<?��Z��v>��d<O4���#�Mg����`�f,$�ېj~�'Cc��!�X�+`7�R�Gx��P����e�@��i%�}X�x�S9,�N�|�c��/���C �^�Ĕ!���h]}��c�DQ�d%`�ѱ��4\�'K�,�yy����Es%
(��'��c��?t�c�tKj�����
�����ب��+fz�xK�q�i"��4v�@�_=<�=�Ww�T��W�4/���Y� KH_x�Y�\i�kU�B��Ʀ�fx�@o�o��c���̒�;��ڗ3��iv˒�=[]�+�Jj��)(�h�=MV��DL�Z������}���xS�W9�̩8	�6I=����E�p����9xz�Y\M�����E�h��"B�̘�W���Y/��ED�1[�b�@�7�Q�P�K��J��_��u:��?]�;�NԬ�b���dPk�.l�E��$���]Z�����}��
���f�&��g�t��PKE��T$���'#pip/_vendor/urllib3/util/timeout.py�Z[s۸~�����4����캳i�M3��d&�Q�HHBC,ZQ��{���H�N�δzH$88��\�u�vl�X����b��U�a|�U�������s#w����m�Ě��aZ���}�z��^���lkL[�3�ɦ�%7��-7�Q~1�s
�t+J��v��@�;[#k��;~��??�x�����-�����ǻ3�6���R�F�F�w��N�u�C�3-#Q�{^��!��-@��j����S�-S������gx�G-�T�S�2��%�k�﹬���Y�wp��E�y#�U���g��î�̒��rYs��x3{�8c�9??w�Y�����G��g�ڽӬ�
[�A9y0�Zu�U�.�<b�x���"E�ڃ٪ƾ����m`	�n�����u�W���7s�����?�o��6޺���N�,��]y'��mfW�_�]e�
���3ߵ��R�斱wkE���`��V�[��E��Jh2e,1�F���[8˼�n��~s3����ԈB��a��-���;aD����/����n�ⴽ��3~�w�0�:���Er	�^��+�W� ҚDZ�xSS�$xx���u�@n/A[�H��I�:r�Z�
��Q�H�1F�Z��7
>��=���
+e��~��$2ȭ<�wb�#_B�GlB��b�b����YE��2}h6��0�V8%��2��7�.Kl�$��!؎��~�N�������
;*=�3�\����@�	��Vq!�m���,����Ew�l+����Ǻw��
�k;�:�%����+���d��������&�>��ns]���kY����<]��z����?���[��T.�gO��i��9T��
	N.!<7҈��pP�W�N����Ar�n͕0{!<�F� oS[�Ͷkq"�[Y[�2p꧑�o~�u���[�M�H�9mB�EQ>��ּ4��)����[�CHjV���OP���"/rʆ����}�ZM~��.�g�=��J���|�ŪF��h��q�UbX �k@�:�~tA���4$�O�$�lʺ�o�f�^���@o)����M�ņ��7
eL�����:i��E�
�uLK+��FG��<��J"̳��-�!���\C!=d�D''QM�|�(%��&����Q�_��e�)�۟"4Z���� @��)X��,�-d�K*�E�{-"��p�mS&�";��:4��
j*jmޗv����������<��>{h�ܡ��%&�;��`�r�,��zT��������";��*4�L��@+�V�iК�3A�;�@�D��k6КT߱���Ү��N 
��'�ט�
��{,�J��|�QP��c�X�����)�����yL�DV��s�4X�/��?��,m#�p�T��G����œ].B�b�\,fZ�����ա�*�핫L��yY�^�_ܺ�������/s��r���G$Hk'��[،��~xr'�����Tmxg"��L`5�p��v.}~�C�~�9����n~�.�,l#A���Ţ���XdɂD�S�H��V���6 8�b���[Q�Z��ӞwU�-ŕ�!D���6�oI�H�/T[U
[��'\f��`��'�|�P�C�-W=�)͈`�Ȯ�"�US	���<�{�x��Q����F$BLLL���)~0�
�j@���h=T#�ņ=�S���)~�襱�t�l$F>�%���^�_�1
P
�h�RgM��,�j`U�`J���Q%��Ct�
�� �Z2�"pZ���w��L��A��\P�O�c*T�������l�iJ-��3���*$�Q��^S�$y��7�#l�����N�a���x7.o�3(4];"�Ri�aXegllv�#ƳH�o�Ѫ�RӼ�<w�冓Ί2!�t��͜�Ϗ�=-n@�����0��s۲9?�l2E��
`,Q0#��������#�c7h�j�s�
�M�p�����c/��ز.,�)q�qU�4 ���F���6��a�
/iN���8_�ɡ�D;۩��4ᗫt�2�l���Xy?��—�.}��0Fꂄ.����P�
�2a8�ᐤ���qm�r�,�QՇ���7x��o�h�?�lj��[�aX~�q�u��G�4C/�l�J��xPqZMq�q���JB?�*�a��!u|#�+�U���G�9TQ�E���!�Ҡ{�v���J�r��F�
q��:~;��A��h�������������j��B2�J��(ߤ��Wl�+�~C��J���zQ�4^k�����>Ot&�aփgj{AU6`^�'1t5����IZcۺ=*�]�>�����aU�}��#�\�w�m���cs��ύ��۵|t�V`��>7Pa�!qc+��
���f�aiZ�Ї��T���G��c��,d"�	2��M��l��{����{�mDx����܄_�hLQ�-�e)�T��_`*+��a�)�|�H�����#���_��μ�nj�B=<1�W���H�/(�l�A\��vi���r���MH���4<~tq�0d
��N���P���-��ܥa|����C�B�[b����C���pL�]g������"`G��4_�7:cHƃ�;�0����(�O!�k��pb�zG��SG/�c�ȁ�Q库68Dyb�ư���h������������+M�	|Trs�1̰F�J�]kG��w<�E	:	�Y��ij.�t6�/*ъ�‘����)j2:�n���"1��&����g�PV�U-��k�†�X,���(���6ؚ��S��k��ӆ�O���{P�d�I �w.�c�̐��r�4;��@����d	vE�eS�8��N���,�"��q���+�)���,O�|M$��q-�s�����dCб:tk�p�g�y4J�G��+�+L4-��e0�I)ؓR�PKE��T;:bT�7pip/_vendor/urllib3/util/url.py�;{_�H���S�e-
F&�&����$�`
��![m��,y� 8���[U�-�,���o˭zuuw=;�$�2��Y�p�e�t'�i�w��VK�'�5F�Q�|�q�*�țr?�g!o	��#>��#μ$�$�;�F��[^@��}��'��eY��=ve��	�r��/�&�=�����=1�gΓ9>��vʣ��Z+���Q8g_�(cY̢8�za�3`��/A6a^��_\����l@��a0�bA4� �e�X@�9�J�1�$���t��M�lf�NN���>�>��o�>��a*���i�������ļ0d�e�r��xJ���|�w�g�7�v2m��r�ͦ����!����ނ������l�F��']��:���N.�~�J8΂����z孏��n��:���hX-!�'s�������?;]0/�G5����5�m��kߐp��W�����+�J{s��F4��}\��wVLG�bt��/O�ޜ���8<�88>�`���v�.Pbļ"%��l=^�ַ����z��5p4z×���|kS�:�&��Q�}���-��&�Lܓ�:��))����C<��2V�a��	��c˽�g��t�=��5���.3�Y�
J��2Y�c}�}\5�J�-�h8@f����Th��i^-PC*As�9)����M�~����o-���_�l����f�����Fg�q��F�[KJ]��-��z��i{9�����*�:�������4LE���L�]��ry����[q��a��G��?�NN��?������Go8�v��s8��ٟI��w_��_7^lnm����W��z����]�jl����8�̫{�ʄ=��%1��,[����jdV7wV-�fHpAx@<,�|kM�rpx�X���ׄ��1�'[�����sO�q����`�A[^c��Ѻ8��5y�OfW����G����2ߋ��')���0��4����@�*�@(u%�^���{�����t�7���m
�l���4�?=�p�N�R���\M�?T!�^R;��l/�u�F)���I�~S�(fU���kU՛�}��R�	�����1������ч
㧿��mZ?�u�kC����iS�-z��-���Ja^a����]���, ��}�`L
htm0Z�Q��&�Yܦ��h.[�#4f�v�e�fI>�0�,G�g	�QD�*���f�)D�^
�m�<bw^��r�y4rnf�����f�c�!U���lBa,0+�l"
Ps&RC�y)_"%
2�l�7ʼn�bA(���a�j��M�8K!a�=m�1�0�/�+�~Fa�)~�0�.1�XB��0�X�j��w,��D����`LtHeQ��;ͼ$K1�0a�hЊ-��.|��Ӓ�D9V��=�ۄ1��@�^�x�C�`¦�-��V�ZI�CZ��:�����J(�5{5Kb`�͋D��͔�cm��oa�!M��%~�����0�l.r7؍�-m��ڸ��ga�ö�2[�}���F���I8� �`�
�4Y,J��\l\84s<t0Pa
���gB�Y�b�*ˈ/��K�d�`��>(Z�S�e��xƣ�y���K�|f�L׵��s
��rnmZJl�J*1V!��
t0��;%N}>�6��
��o��c%@``L<D)t1�5�)��͇>dаq`IBf6���_�%��
&m����	_�,�bSoNK7��{�,�顅$KH`A4�!����t�|:l�g,Ȕ�H��<���
i4�&�omriAN6�0�ϴn0�l⁵u@�i|�}�.5ӻ��3�#8N������;���[f��Ԁ��8�
��w�^v�V�F��K�븊U���y���|!lTq� x~�ѩ�m���x���	>(�Զ�
V��J�q^n�}"�R�j܊?h%�y�,FC��	*f�t�����pYܚ�YMсN�ٌGb��,S&)e&��
V=z��BP�5�@����bp���b���yy����D[�9�ܠ$fo��,�3}�Y�%-l��]���V�@�A�=���8���[T�o!p:����Mp�>�i�9���1R?�}�a/�����j��v"�ad������D0N@^�,�)b	%W)��Y_H
�G��0"�9�2�w��!�9��d!uFH�L#y(M�r͂��x��C����=����K���W4��=���k� t#�5HS���E�_�����D�KB�D�tȓB�
0o�{!E�����:Te��A��=X�V�>��|�="Z<Kȩ="��+�_��6��|c��J����5C���|Q%Q�ko����L]
U�S��5Y�o���+G�
`{_)k�s`��-�ˣQ�s7��g�;��51��x/�`\��0���g��x��Q��3��c]�<��
JEc"�`��9� ̘" 8�!���lV!��;V��*�騀*���cCj�ݥ��g��V^�����Eن�˝��.���TR�Q8<���)�W�Cy�LW�Jct�#PK��<l��W��"6��R`�$0Ek�&R m	%W��|�a��|�)T�M��',�#��[8g��#3L����Yđ:���%��rل|��/�kA�I|��C�� u+R�r����+�@��G�94V%
���ˌ�^�xs�����B$^t�͍DԑY�4���W�%�( x�b��7��g��b��l� �pL��*��6�#9�����5�g�J�
B�#h�DQ
h3��pA�7�b�e�a���BMTNx�	W�Y]�kB��fs)�
���
FyAX�6���զ3P�Ų��A��f��,�b����v���������Ǚ�r
YRG�<W�9�Q�8S;��؎���$���5�����io�v��<��u�M�y�'�&�^�bBf��I��S���AߧP�e�3������ �ABt*�cD0�FӓQ�Hh�n�4q�y}���
BFp0� �Z��!
n#$�!	��Rf�q��;T��h��wZ�=��
����d�!�(SI�|�AI@9�bs�۟��"_�`:��4)�p-`NX��g $��w�[�5�g$L�i�
�+�$N�o�	Ș��9�[BT�D��Zc��Š|)N�XR�!I�B�h����l*�iTIH�����v���XM24����þz�
�Ӣ=�g�P=��pE��x�cY7��eڭ&+)�s��d
�n�ŕ�^Ȫ�=]ٲ`��(�.�q��Q6)i�4�R$
�)���WW��K�n6��+Jid%���G�j�M&�k��Q�	�!����J'�&�-iW��
�JG���B�T^�@2em�q��_a��T=W.��癗6K���8U�v_���HB�;D�f�џy�	������@��x`��>�OSO[�o���lol���g �љ]#Gje��+;��QUR]"���my���q�`)�y���N?8kǙ�\�ȃV#8���꓇W�C㇣�BV9˧�-g��Ô��K蔐��7g�Skd5+P.8i�!�T�X(�k� ��i�k��|^vr�#V����Yod<�)�� ~�IU��7�%�dx��F�ɐ�ޠ�'K7w�P-L�N���]�<��y���~���h�#���d^�4��3۽�c�-��!��-��;vD���B'��?�.����~S�4.#Q����6Ѱ�Qu	Ͱ:5���X���iJ�"M[S��1�d�l�"�9�����4`-*������"7Np)۫i[U�qD&ba��ֿSVN��s��U�q^:
�Z�dX��L�TQ@v�����`�N�VDc�I��*����`X���$J�"_M�镌�� A��i$šG�ŵ>��N��W)H�+k�R�@*�le���OU�̱Z�@��C�x�ƾL���^���x,��B�Ƀ!�8=A�U�3q��fo�bB�$���S�"t���Ե"
	N_5�ɪ(�OU�0�#���	��`$Z�<ĘAu�R�C�6��]B�:5}'�S���4��Fw��b�G'吉�fLI�R�	pʰWV���]8��ܨf�����Ta�I^P�&��.q��.��Жt:�h��q/I8/7�y
��8���hw������K�e#gQ���e��X���Uq��2k�Y�H5���e��9X*W��d�M�*n�H�<��8F�n>m����mqd��6q)Y4dT�f�)Sٳ/Zc�p\�F�,�hH9��Z��WL��*Z��XO�‽�N����6�W�UC��8���*��h���]Z@F,t�I-/�h��qR�f7 �X�IU�$����9TfXO���������mGIl�B�Qb#���~��𽻳����bh����-%�9�	vE��;pVo=S�kD��(`�@tl���"���EX�;��Gt��I
ˠ����bu�A��0����l5
mX��vZ�v�
{+�T���Z���dפ �`��D��ĥbQ0k�"d+�^�j���C>�e�L�Y��J����S��i����΂ Ä{��Ij�~��-��?�_�w���9�	# a��.M�(|�VZ��,�6�`��݀"o�[�+�NL�hQx�ˏ��r��i1J���Z�I,��ʋ�����Q²E�t€R���_�{:i}.]�8`-���S�p�nДC�I�L�w3u�nj�@jP©t�a^�I�aq_����/�2\x��F�r��L���-c�-(����V�%��PKE��TV�Vտ pip/_vendor/urllib3/util/wait.py�X[o�~篘R�\�Vk\��8��T2l~b�{��rvg33����|g.�%E9�[K��e���/���X/���LT��HS�o{7���E�5�7F;�NZi��z2�v�z"�
t^ՔIj�oUL豠֋��w��K�,݈u�ZI�W+��No�g����4��)v�s1���2veI�G?�Vy�~�L&��Ήgaf�4WQ��`��4�p[��R�$Y�F���~�\��~K����0�x��{ӉB6�s$ QP�f��Z�-�dS�U��,μ�Tu:�h�#A���:�ٔ��h�GrM�p�V��K�[��'�,pm�J�/�-5A�|�FBϪ0VVx#vD��V;�Ś
��eMy��]-ʢF�	�pp�[�t��k��@l&H�����p���$�������i.��u$a�z�`�S�d�;�Z4����D�G\V uv%�L���j����s�E������5���9p����qװ��ⰓZ�ҨGr�q��"#�:��
0!$�Na�H.hK�r�����f! X%�f�ho6��<�Vm��MW�����Y�+�j��.�Hk��٢�B�W�x|[0$nNҲ�������>��4=(|H�4&�� �$��~�Ґc'��<������m���W�
�� ťw?bό���C,��rl�gM�7�j�F���9(�PT�y=����C�H��}�%��D�,#>C+�+��Ś������d���A��f�0�j�8����J/p���+�TF�})f���T�.Ŀb=�6��x��BĀ����z�8�d�}��g�b��*�z;���f:�����U3�g�	�/�C�d�$�n��]���#��4t8�@��/	}��F����^
4��p��s�g2P�[Α{۝ �o�:c��1��)�ͯě�h�\�ވW��r�.h I�K���GH����1�wQz*݅������͗KDJ5*!א�qm�v��7~����O�8M,޽�����` �=9y����˃Ǯ�;�4
�7��<�1���,�#�[09Lϒ��w�ق3 x5,���m.x�Y�����&��%ݳ�[�8v	,�s�%��/>v
�ǩgZw(���BU�CE,w�p?��?�̲ŖP�0�}	���*��n��M�ʄ'r��P^��<E������Z�4����#<\^=�(pjÍ�uE�
�O8���+�q�`�Z�bܷL�����*/RnJy��zJ}+Ѽ��$�JU�KOD@:f�Z��|�jqD@���)��N����3cǭ�.�$댆��^�W5pO��g)���<yg�l�ߓ�ّ{����ށ���cA\c{�En`��)]�T���t���<��p��e.��~����3q������m��b8�#�����F!�m��]MR `�	���xH3����`���qԹ�Q�f�O�r����ŋ����͡��h�M��'�rV��Cl�i�3��\�x��S�7z���o��)�~�ԃԼ
���\���ϒ+n�H�h�a�z�"���&:��J���0��Wgx���"ϙ�
��$�#�(;
�baMS�Mgc�j�,4��[����mT
+��J�|5����`v4�|5�u�#���M$��[��#<��%�O'ʐޑ�h:Hǜ~�#����%i���^�vŖ?h�)�B��\t�˕u��DO�6�U���e���������g�uN�"Pc���Z��f�N���3<����
W�^�c��īG�$+�|B
2& _�u��]��R�=�:a�r�L'O
���g��L��W!�A��b��8��c�V�kN8j6a?{�\�W�?���0�����3�N����ͤ��쩇bgl��G@Q��A �;��p�*�`����&�nzl��>� _�r�Vc[˺��c�C��F���Z�C?���PKE��Tx�q2S)$pip/_vendor/webencodings/__init__.py�Z�n�F�_O����J��\{.��1�8A䴸KjE�,��R�.-�y��^.Or3�A.?��P�H������cG�#Q'�* ���z������lƸ^�{�I.� ���8I���-�T&�5��`d�ӳ�˟�'c#�IyL�X	y��rܿo7�ŊE�zA����GS�L#���O���<�I�$MR�k5�([m��j!rj?����نL�%�2���k�4�, '�'C"@���b��,1ϳ%	�y!���!�0�%)xڲ0M$�i*z=��O#a����X*,���|��~����� �����x�l�L�%#�.0��X4���$74Mbkh�L>yŖt�V��������������%"|���`�x���j��ђF���q����P����L,,�r��Nx�����o�h�~�N�O��Q�܋ٜP%I�fk����ሃ@���9�ܰ$����9������I�� 2#��Dx<��,�b1.��?-&V4�K�7JN^k��G�����  ��[45�6A�L�R��($q�����=u�Q��h*�%����ce
#�h�H*J�TdJ�!��v�D�^� ���dB��f��(U�ٍ�~����X�G�����{��k�#N�s�C��u�`��"��_m���\5%�0��@u�ꬲ^$�B���H��XxN���"D& �r<;�$�J���]�@+����#{h�a�����/?��<� ���/~�ʳ��^��
� f
�>K@QŒF�w�7��æ��Y�[�Vr0Y���B5�
�Q1cdN�T����._b��T2����}>��*x����ylB:Ͳ�b�W05�l�9�%�=ظ�3d�D

k�*�"F���dzŤ˷c�E��J�,��|cWY���Ro9)V��!�M��D�&�`�z&QD�':�G�KH4A��7����S��~`	�!���"�lj�R�k���5GÝ/ 
�=W�0��� ��z���~?6����Y����WmA��Lo�v�{o�[�v�6'�@��0���%���b2���8<Qe%|����?$�(A�Z�))Z��&P� ��#�\�Y�UD*é�{"IhH�[�Äϳ�\��V�����n1-��Jk���oj�*yb�I��l!��XdEc<�b���T*�溍�M`9����Z�+I�2�\��2�*��A��>��a��]a~a�����ƺ�>B�ŷ	*K�7�K
t���̖�&�.$`�(�ԅU�����<��"ภ�J���2�����7h�C��׌��?'��9N�{m�Qo$�U����A���6l�Wm�c$�ʊ]�)
��|::�u\EF��H(�*UYb*fc{�'h�dVH*��~J�aH"��4a����lP���
4/@N�-�J�,��ɬ�{���v��(�^d�y���8gWXt�ih*A�D�a_�t�sO-�+�#�o2��Om��[���r���Fm�z����W��S�W�@YO9�r��ٮ�1��P�%v�X��ӧ:[�=��恵(�!,<��|�X{�m�`Y���Wg��MLÒ�UxN���2�
	�X� ���52�ŏ��q50iL	��`����]o�S��-�Y��&U��AwJ�)�3h���� a��	N^<�k�W���Y��Q߁��������z:�%s�0d:�C��f9�)����.m��h���Fi�Vk�.���,�ݔ�����+��eˑ��z�lQ�:˖䔃�5fª�Y\>�CK|W�v�ݯ�_{|�f�ݰU�[�8	^��wb0$k��`�
�4Yf7�J��|�x�B�\
d�ϼ��O���qGŴ�o�{�0xw��1
�*�dgAc����v	�le=2����,Ú�����ߡ�a�8��ܣ��c��2�_�Y��lQO�����ldn�4\T�� ��/�#�^izo4�X���˓neP�ř�v�9����N i͓\�]��b	��\�7Ƴ�j�5<_­�� YIZ3�wpu�35$Uy#��z`�W{}̖�p�y��%(5�Y	w�v}�pW-�l��	�*�`�16kP���T��6c�3vuNș^R*��r�D����۵��5�{�8�*3����}f�V���V�K��u�|�.|;m�,��QW�E��&ai�i<{� 1D�Ope*��P7��{Z��xX&����i(�(n'�p�<�Ɵ	��o�5a52�(�$�)��TZ-�)�LQ�|�K��E�A�7�-�rF���kӚ=���n�P;,�8�I���i�y��A:O8M/�™���s~�[,�yl����}�Mw2H��� �P~A���ÿ�J~��S'���:٬���q8���h��I���6=�랴~�9�tQ���D;���Z�m��������YQ�Gg��9D��/�;��?{�;�SC��[��
|��X���J��
q�>4Vg����k,U�X�T�a�u�����.o�'�d^2`Q,�1�0g�	��3�kr�%�Лˉn_��vMq�]F
����f��@CD�R��9�{�S���B��8Pd�(3ɵ��Au�c�7��f��s��$��h�3��r�bGo����?=��̶����G�S��8jOh֪G�xp#H[�B�-7�Z�;��ДC�w�>�v��l
�_�y�%�y�ft���!H7l�1y�Ƈx�'%�՘JZw
�UD�un���Vu"�n�F����-���W]��D�n�����L�̦盱�R�n���m/v�������S�|�� hLݴ�5uO��O>�c��Q�w�[4�g�4����!�l/\�PKE��Tǭ�#"pip/_vendor/webencodings/labels.py��Ms�6��jz�%�X`>��~:������b+���8���1H�+�9$^V�%�������՟��Y��T�/��x+Ӳ���?�~���~����U�
��'�|�6I~�,�Pm����Y
�m?٫:�{��*�ѩJdV�
��퉕R��߾~��;{���U�ҲV���3������,��ܩ�Z��A��M��տ�K���J%q�~���dWr�,}:ެ~>><�����+���Ӛ��d�vMrQ�\�7.6����cz��AF�>F�BmO͕J������(��T�i����E-�a譹�k$6�������Ё�R`4��܈ut4��1�!��C�]2�.
�K;㢀��A�ptmwQg�؁M�C�L��F�L�C�Wd�W(�+ڙ�XN�X���|��8���ރ�j<�+#�&�!�I�H냾�i��.S=���ڃ�YY���x��@Лcc4���3Ӄqoapt�?����`�l4�F�Kr+����֭%@���z�X+�G���8 ׼�$�T�L/�M�s���^w ��"2�/�<"0��V��y��iP_pDmj2<J�%�La`I!�I���̰���`y�"y�@8	�߮!��C\�-�ܮ=�_��	QfB�k��kS��ЈW�����X��3��R�%Ng�qH!}�م#I�g����O�Ci��u��7�٤ҳl	��*�H$ɔzۢI����]�f[XZcD
[[.�+��[Y�:Oai�)l=� ��5�:�ׄ7Mbp���M�kr�t=Q!�G�ݡ=w��
��!/�P��� �)`���((��
]�Nq��*/za���A�C�(��k/�S�����K�-e�]�q��2��),$�H$�J��w�3��E�v&g�xP�@��R��rJ/���3@�vz4�J]��k��;:ڏa�2Qx�h�<��h(�B��iJ֟�6;��F��&k���h9�JGёl�!�,[;�h�)4EhGa����DŐ�!#K��
��"��.
u	\�}ڂx���D��YJ��k[
���*��b����<R�ek�6��&�u�yS�jN�N������8�!ۀ�x�m��#6
mAܨk�O����8����ڀgڂxd��!a@H�2�6��B�_�E�2շn89�L����o����:���A�[�oXx�����G�A��It���N\9��\E�Ku�w�}��w��C�tqn՞8�nb
�c���.I2N(2��Z�@��J�Z�%9wo��=>�]�,j!?ߡ�\ʄ���Ԗ��t�k��H5R��IY�[���p�¨��_���g�@\+�@���fp�p����Lj�rJ#����Kt��c1@uz�Rh-!��oT��o-�'�	�Bo�$TFI���u�Ơ�j}A
E��=9k�=̮��`
5k�.'�~����P`o�`)�m���Rʂ��[�4�i�'C�����PKE��TP1D$pip/_vendor/webencodings/mklabels.py�SM��0��WL����f�="q��rX��Pz@bQd��ul�6T��}���T{�#%����=�`0�2��k�����ڢ�)���;�5R�wܢd�9��K�������WJ�����)�~�|��y�$̙�2��PZ��af���o�)l����z�A(�7Z�V�̙�8Rl�j`o��kh�Oi�+����e�B
���h���,�q�Z4�ꀆZg|�y�H;��`2igE��c��lwZF/&1�O�Rif��	,	!O��+��*|e�h�q*��
H����b��R9���w~�ǎ[�p��l�T����^�:��d�OY6�r7�ͽ,�3��*��-�Kà��>ET�"�)ٓ|��!�;��$�BV��+��2'�2^<�0�-m�I���!VӼ�ѳ"%�V�����<���v�XC��O��'�lر(�~F��-�=�����/[�G���}J^C;Z�=IC�-���]pN������Jδ��r�&�ϊKA�o���4e��eø,KҶ��*G�~";�������c�-��ޜ�)��yPKE��Tg8p���!pip/_vendor/webencodings/tests.py�WKo�F��W,�I�\$��`�`@q
�9Y��V�64)p��|�#�(��{s�K�K:�"�/�aG�Lr9�7����FA�����|�=n�z���B�'>��;��q&��|��)�1�������4�=%5
�CBon�}4��?8B��ӻ8Bs����i@"FFh<?� F���\�'�{I8�!ji�*���R�&���[�	GiD��`R�C�{����t�A���d6���� �=\�3��A��6Z��(H��8Ϥxұ�d(�ڗ��q��j-�
a�H½SF�K6YsG�J�@ݽ��
��ۯ��=�zy�0�0�nYVJ(V��縄@�T�I(�^�u�o��E1d�7����Ft*
�I�ĉ��%�r��
�9�M�ʸ)���Z\���軎�>�݋�A''H/ԉ~�C�r��(��.�h7Q�H��_���D��#"���~�G����ߊ(�vO�����8�l��k9�s%i�wO�e|Ϻ��wG�VRw���
���`!�4�2;�<�8@���D���߿.Ű�@t�(|@���P�"F9�F�C�Nz����K�J��Dj�ܸ��t�l[x��Ge�Zm���4�E���'dM0�4����Q���)_���<tb�?�
���[�`t�&|�qW�H������^��	�1	�V-�nɤB@�^XIj�Qj1�pxr���RV�,х��
�e;U٢&��!���tk$C8!��<��C<�������p
=�ݮd�N9�ɏ��ډN#�M%{�ț�6�<�q�m�w��t�������YG3:�mT�S;�����ٯ�����A�Ƅ���@a��
�\l�YZ/6�},SiU}��?���k?�P>�)�t�\���b��J ����f���>��]I}	kL�W�)��[4���ՠ`:�/����
�N�����`�;��JtL�2zv��t̶��~4�X�d�������40J˛��S)�Ɠmqn ʽTD����=����ȓ{v@��a�m#{��2�n���<�*�%��O��z���4���*/)��h��6��zO�oAt��ۚ�t��;k���xӅK#9�`��q��3c�56d�c6���F��S��z?�42s��f�q��[�8;��P{N�����%aW�jyGGLPϧ	CI�<�,��tG��6z`��t*�:}>��Q�s5v�H���ٞ*3,˛���g�T���s�8j�����]9J��3<*M5��n�iu/���r�n3Vs�7��P�iD��Bf}��-W����[�n]���$�XF��AHj���ܤ5��'�/�d��S-w_651��o��/�0I�ǰ7%�V#���dO�zZ��R�Dv������^l���P�੿�+D�9�>�+v�0b(*���fwC�_0��l�^��&��T�O5���������i��Skl�PKE��T��֥�*pip/_vendor/webencodings/x_user_defined.py��m{�4���W�����!N�6�
c�u0`/A����١-/��(�Q�]?�"_�s,K:��ܫ�j��r$���6��f�!���뱢w=Yd'�L�������8�E:[d4���e:��܈rJ�zg��/&�.�z�H�76���#q�C1�G�܈�t����4���REyA#��+
"������ʼn0s+4�2�
�t�e�|&&�,��&�U}s[�e��h��%Y����*�6���\1.��g��dQ�W�M�*�j	�V{Q���tE�/�eW��s[�[EiSU����\M9��SSigr1�56fw���2ɨ�ts����ƭ-���%��,W�~��IU����;�[��wd6>u�����j��=�y���b��by�}WWߧ�͎n{��X�EiI�^�ՙlW����!�}�ܚ����gj=�9uu��/���2��iw���N����X�i?s�����Ѹ��b���P�������i���1T��PH=Î��;��+l�ʏ�����me?�V��U��16���p������殉�r�$�\����\A���ڃ���H,l����j�m��BMݹ�q�>�`(ȝ"�<��Ӄ~��il���ͭW�~kF!�p7�C���p���yLB�|h�5
�Y�Q�4
�F��(T�J�Pi*�B��0�qeC��
�a�7�
��&s��!s��Q�f�Y�m��a~�|��2w�=�'L�,�)�&�#� ����ߑ�S�#��s��C�c��y�<e~��y���
�	�[�S�w�s��g��s���/�?1f��|��+^3�0'�_���C�O�?>��sɜ2S�o�ߙs��oל�`���W���'�yͼa�����_��;p�~g��`��$�d��.&1��d�L��ĘHLL&�}b��'F�}b��'F�}b��'F�}b��'F�}$�H��#�G��D�>}$�H��#�G��D�>}�I�'A�}�I�'A�}�I�'A�}�I�'A�}�(�Q��G��B�>
}�(�Q��G��B�>
}4�h����G��F�>}4�h����G��F�>}}}}}}}}}}}}}}}}}��1�c�Ǡ�A�>}��1�c�Ǡ�A�>�t��O�DT��66���ׇ��J�i�۷�M�PK�mW�V+�E pip-22.2.1.dist-info/LICENSE.txt]SOo�0��)�rj%�U;M�9�4�F�i�#'x"a�Y���#��NBB���!q��h�m����==}�2�ƛ>�n
v�Ƽ��
f�����+��y��`;�E�O�{�z�Z3��Ǫ���0"��n��hb��
�n*��UP��-�xw�j48�@彫m�|и�|B�U =r��Bk�YyC�'��T����ņ֝`�0ښ8b��sCޏ;{�7�Oy"={L@>c8���m�X�y�Y��Qc�z��i�6=�0�W7�7]G}OY��T�*4�*�t/�;}N��c�����:�lR�m�@,4~p]�.
%��R"�#��r��{5S��л�V�����ގ|[�������.�[}�3��x���8�s��+�\�-SD	��/"�)�X��Y[���FN(���%�|?E���U(^� �u�	�� �$ۤ"��r�!k��TK ���[Fk��.�BdB�bX
��ILi�l2��بB���(��ȗ
U���z��(�P�X�MR����%��)�Ұ�Y�qs��L�EƯR*ɘXǐ�5{�J"���ۮ���z�D�G�I"s�pcJ��A���10%J*d�$�S���	�r~e���Ӎ��7%�{I9ː�$���y�PK�mW��]��ypip-22.2.1.dist-info/METADATA�W[o�6~ׯ Ї�%債��n˜t��&A��ؓMK��F"5�r���Pr,�ISo�&��;��ǟ��w<�S+�J�at��R$��U�9>��f\�%7��]/�\]3#R]�Be"cN�͵aRYNjB�Bn��xz�sa��.EX�s��U6�cx��U�#��ฆ�i<�eb)
]H{���"a���v�����/��i�g2����upi������,a':���q��O��ˏumR�̥[Գ�$O�}�Ⴋp�'��B�H̬�w6.2a7��_|>��VΥ@N��	0smY���Y��3�S
"{{=��rM=��L
�
R;٤�+��$.�#v\UF/���쭯{*׺�)	����q#z@q�k-�b����𲤶8C�j4�7-��(}:�Uއ��ծz�۝5~�Y�������2*�B<���U���:V�����Fذ�L�O�)�mυd�>
O�ǧ��wA@|���_6�����#L�ſ �"&Kb�
�2��B�"�4�X/���e0��M.\�� BtW
�p��m#x�"ө�*X�1�Y.⟗
Ѿ!�v�'�V��DZlڲ���N<7ي�_�f)W��
�:�} h67�l�m�8�0�U�4��qB�"6���B�[�{��K��B�u��O{l���+L'trc����M㪮2J��u�M��;�3��ZY�Nb2+�~��[؈}d|gex��v�6��U�Ii�i���P�TX:F�g�p?:�z�ĕ<�4�d�^��AS^��fNz�ɏl
�FyT�I����`IU�n��fS<r(\�SHWșa���p<	v�ë�8r�EQ�ǤcF��r��#�����~�(�sU�uG0�,�Sж�!�uUi8�I���C�<\�J2]Q mO����i���`4�ٜ�1�s;@���"�)����v���&m�A�O����~�@��K�6��50�2�j�H�B& ��(�݆�FWC_��
�yZ�b�r�n~��c=[�Z�w��Do":�e:h�B`�2�'�K]V��KJ��m�T��P��ܾ�Z߾m�2DT��C�h	�_���iET���Ȥl"��k9-D	���(�����
|Xf?p���批(
b�\��Dt�'��Gv�_�C��&㼖��1��ò�s��>E��τ�R۳��n��#�8�4�����Q�K��FW=Ֆ�^x~�N3�-5��j�ӊ�W�h~�Mw��
};w+5׵ʢ�w[i��
��r�G!��6�Df��
����h{�{*~��_6t:��|d���]��/�T�k���|K��G�Ãc�2��P��
W0�	��/-���0lm6c�#ﯶQ�9�6���7�����v�<݌�V/v�gc�N��{��Q�)�>�ʵ�ܼ2s��NJ��p��wi!)E�p�7T\r2����޼y��ǽ��1�^\6u�f��k51:lFQ����tr�a2�8?�^Ge�?PK�mW�h�\\pip-22.2.1.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK�mW��C�<}%pip-22.2.1.dist-info/entry_points.txt�N��+��I�/N.�,()��*�,P�U�z�y%�Ey�9z�9�z���yV �˜%zqPK�mW���"pip-22.2.1.dist-info/top_level.txt+�,�PK�mW��.�V��pip-22.2.1.dist-info/RECORD��G��L�58��"n�͠ ��&,��	~}����;Ͻ��~��Su;R�avDF���'-��q���7]����h�	l��4��$b�;[ь��Y���3ݳ�?_�k�A0��nZ���t�E�YO�d4���w���ǣʥ�^H�<�;n��
Q�?8��@;�eؾ�Q��M�Qs-����1���F��\.�HU�)�I�Z=�W?�a�d��xQ��	�z�BL^zu��I�S@
QԊ��0��I���Ҳ�ҽ}S�A'I@ڝ��x3�|���o�)�!� XpgS��-!7I�zCz����
ħ�tϷt�w����p9^i�?�qsj������P��A����Op����$t�D�-�;2g���Kt�n��$M�8D��nU#�xU��к}Z�O�s҆E�'�ܢ��p�CE*ؤ/+�K��t�.ָ7���nx����=��@`@�=W�L�8=QA՝Rx���ah"�Y��	�P� �o�|�k��C�*�<����/IZ:8��Ĭ����n�AP�
����B�B�<��7��|ς�>*ѕ��&��R5F
W~>KQ�!@}���[�TC�}8�F�����E���޹�Y����M�4�]���Z���
	��띒0�9�L*l�`U�II�!���9eLX�7tp�\�Mߎ��o{N���0�T��~���e�~�'�:d�9�Di�uk6+��㮗f�X���}�WE}�lk�`�b[�>K�1QϨ�y�\xJ���S�N�d��ljw7}`{n:+x��>e�R��+b+O:#慳�Z�W]��E4��.�U$�~C����0\�t�ӒՒsOL=�ܧ����V�g9�L�o���
��70E�^����u��o��V��1w�z�K�S"�b�Z~#�8��7��&�ObpC|���1Ҋ'9��'����f��MW� ��N$ ��Ƅem`���y��}�݋�ɔV�}4l1�Ռ9\�c�,�0퐟9D�jd��8�m������A���l�u�9��)m)L8��=��d��D@�z��@�*nîs���7*��Tjf�f����,�"�1;���˫��u1�j�@N~�n�拡͵6�ˆfNݷp�oqw+ѽ
���+��zB&�@뚿��[Mj͂��m;�<�;p�V<uLy�����/ƉL;I���`�I�Z�
R���n?t뒃���X��y�ɔn��{�vq�&%Zةs��'k<�>��o�����@��㐀�aBY�X����cY�(.׉oYJ� $���?�X�Xx`�u����%�֋���-
�<��z�$o�_p��0g�Bd~�5���$�t'���.�b�Ru9��S���?]�/��Ƃ?۠�n���i��um�aɦAF8��.<d��>�����l�[��aㅆ�v�[��ڐ$��o[}��������?�!~�͍��5798��j���s�j��I!H���i��1�E�����V�Ϯ2
��B䆣� ������|L�n�i�I�c�R(���?�Q�˳��۬��Q�����;֓�-�|�[�K	.Î�B�\�2���]�CC�c_]��!%�sY�m+��n9�S���<��TE����>.�r?fEi�KL���D�}�0myTKg�g*F�\��ݗ��6-���if��qp�gb(SY��<N��Q�,�S��u�7(��nW���B�)���r<�d��wz1.\,���ݡ�z�c��7򙗞�{�v{B.g{�������_B�?�2iX�H���Ox�Ĩ�m�~�[�=�x:�1��A��+��%�@�qJ�]
^5����$��J� �G[�B������;��1Pn��oG��O�)t�z�ie��un���G���T����UU4?AI�j	y��䆖����H7͵��_�ź�Jy9I#��疧��SVPd ��\�0�^���e� 8�c���;�p�E���vƷ3y1���-�BQ�ũj��J�XC��"X��M����O��{<6�8;�=�h�U��p{�N���h�M��������A������J"<�͡�6
��I�Q'N�X��ƾ��j�{�x�G��s�;s�w1K�LCݰ�0|�b��fO�ZG�=�U��Z����ƭ�L�������xtTw�`
�S�1��۳�ƹiG��Q��_��7�xԔ�x<����ˢ��nl�d/�7��m����Kr��+=x���m�X�jv%��0l��jo`|S=����6�Iq��~�*��gΨoسd����|�z"�h&S�$�ߥg�x���ZH"�N�F�]?w�Љ�}��_0'�>"g�h��[@�r�c�� ��k��� F�ӥ��]5��	S����#H�{K`�ɱ �W�G�N��W� W}�,���έ��ݦ�{��"��1��|�̀՚q�gN!"�5e��^#P�]%O�SY��tܵ^C	��(��yp­>�}�L⮋�B
���i��`��@�л���n���R�5��=��8��Ѹa-!q'����[E�NUm�Y1o?D�L6�	���Pt �I38�zR"H�ض��a�R�OZS������7}sa����k���IJ�����J}{
���洘�n
��}��@g��c��v�0
jpE�{tBN[I���L�=��;n]2�#�&��D�H�����x��nI\�{RI��!w*���l%!��Ǧ��u;k��a�J�@i�9K[��՘��ӘG���1��)O�x��`�G��������7�S�!�L�'�{�RTl�ѵs�+���\��fh���Q+���7�>�Y�i��^m�N�e��(|�
�K
Α^��u��~4�'zVU���(.j�!��N�����WC�aK��4�Q�Dֆ@����MDX��T/�U�� C|�y�FAw�sN���;�$%/t�4��x�}�2Ȏ���חj��j�������K�5.�^y_k-��;��Ҋ��"{/�O3��ۈcoﵰ����gn�L��q���E�P�{��8H�5Q8C���XA;v-/Q̛������:��o�̑"�`�E�G��f~CGU[����M[=��Z��{h�Nr0�}Q��8�t4�I�B`[kw9�xu׏��?�菉�J����u��uh��H���n�yH\G�x��O��>����/�/��+4�>�0�'n�m��[���ײ��)��
R۶o�l{�\��^�����sq�`U��B�]��rA����w�ob}�r���+�џv�[����>��A�n;8]�B��4�
��;m/��t��CxF�j������?��X�����[�n���t�sPr0���v�_��=R�$r\x�����
��vქ<4]�a��';Hq<��QtSo�!̺.G�Bc[��ᙆ;0�U'�g��߻m�N=��K�hN�]�	�<���u��q�t�.��2�y�=5�TG��7�'_����N�悂H��&m2�V?��L�V����s<h�Z#�@ʰ��6�A��z�4b��=Ugr}fc�o�t/�]���
���?���?Wg.�%L�%s���<H��ճƝU��)k!t|��f���}X��T�Q��;��ΪB3h��V�1�-�$�<9#�W��?i�KS�w����=#��"����1h�a��$�#�|P+6ʧ
~�?�7w����#����Ifӛ����h�'G
�BO7h&�
�Q���7�����.���S�$�p�	3�b]��n#E���>�W�
�GF�
D��{�����-iLmu~��ٻw�Οt�\o�@�>�ݎW�V����
~��?�����.���=�*�����֑X��n�ހ{ԥ�DY��z	��Q���o��n/��2�8W\�߆�*y��Ś��G$Q���y��'�����/=�/�N�F�F9�J���1��\f��
��4�	��_VL�
�@�r\!9)*��]��|�n^�<w,�
E���	z�p��>c�t��wC<�<g�a�JNt��g�����0�цz�u�P����Z��~cDB��*��=��d��h�s����U坻{��m�A!��?�!k�
F�����\8�N��{�0�ލ���;hk�,�L��0�هWN���ݞ��Q�4��^���g��m�ń>��Nê-E��?��ϲna����)�0Dw�%�-��x�94U�qj2_���r5kOk��8�����h�2K�h1�ۅN�r/� �آP��.�b�E�����=��S�f�5�	��I4Η��-'Ü�~h �P�@@��=�A�A��R�y,sP��,T�q��>-[sU\�O|tF>:.Ob��y�\�0�d��3#���X�;[�h���\������ht�����q��#�=���ދ��,���q��S.ǜ	N(93���?�Eև�
|6��%"'Br%a�;��j�W��/��j���4����nc�W�n�Mte[�i�m�ax����6>`�ݣe��Ն	�x��m�|ۅV���Qd��g�1�:?�;�@h{��e@H��l��F��]��6�s��o�B��`��p#[RN!+�H��X
�#�jǡ�-~@?8���丹��$�M	��`֢���͆3�bLj)��ߣ��Ϧ�`�{>t��i1	w^���t�"m�h��]�6�omC���.|.e2$�`��Ke(�I��mk���{͉��7�%-F�^�
��@�u����y�Y���F�|n�ԕ��w�����ɐ���k�~��G����Ҟ��z=ͭHS#��R����낉e��e�ݛ����}��O��]�����7�K�����:>m<;�<�U�2�QuP�S�k�
�b�����CK��<	y�AB��VB������n�h;Ǻ�:�e��N^���򻌿=���v(.S�z�p�
&�,g�hF�.8ԉ���(�k�'���]T�>��s �5��3��R���I�|e1�W4�h��ik#�c�$9��n�G/�9�����Q@�ʥת�f/�9��\3����D�p��P�7���˫�jL_��F�fW�\�i���_���$GA�0�͙�iCQ�-��n���Alð��4�p���f%��B���rC�{��;����4����4CچEX�4���E�y�V���S�MEZ�z-��w�F�o%j��g��ⰥeS�v03̇8�T�j���լ���x�;U4q]'H�s�U�o;�?����XA�;����mY����K3,P������ʿ����ߘn]�K.���NR����1FWa-��q_�b�yg�7�z����hz;3�g�c��ƪb�k�f'��|ZR2!Y����˫OmϨ����~vz7~�AZ��d��R���J��n�ƼAx��a$l�o0�A�[��c��eW���Lt/�@��F��#b1N��|��0�-(���G�����>#-KS�7*�J��!|)Aξ�x|�+c�;��Vx+��?���@�m;�I��9,��>�'wkqdL��<.t.�F
ݰh�Q��o|w�?�9Fs�E㞥��x�
�j����.M�7��Ӱo��J3{��Ʊ��|�D�V/����
rC⒵d�k�*�PP�{��U[�2�1��n�W�E<;L�t�O'��Lq�r��J��bV��[�����w¯ٱ�p��o�J_��|�N�T<�!Qn���.�+�J���6��4�\��>����쵛�>,�ϣ�3u�l���Gڤ۹�UFEw��.h�&n����>�w�{ ?�_NoH����b?L�l���1ݜ,���B�`����o��I�߸�D�;U�.����d�F��Ln�…b��~`�Xh*��jo�=�=�^V��w�u�<����0�<M�k
��G�9��[���%?��ߨi���^	�?�aߺe�v�P��*9ݟ[��OHD'41��`L��BZ�Z�j(�o�����B��ڜ7`
�drQ�XN�Ư|:Ƃj<Ү�)0��).m�>l�c^�7n�v�jF)���q�C��v:�`�V{q��h����iE����<��W���c$��w]�]�d��sk"S>F%H%�9�j=.B|�����J���܉۩�5Fv�0�9;��
��K%���H4�n]/�=Э��P�U�ơ_
��fי���&
�J9aNe�PC�"dk#LS`h��T�]���T��g��֬z�E4L�V]��"��5Gt��A�]%8�|��L����y��ȫC����;�[%�Xq���I9����oqp���
[鸞�jl�GU�w(�~U��xpj@~둔�S���"q�]�ҵ&��!���n�
I~��ܾ���a�o�����bQw�H-5����jb�������<&	?h�o�1m����^"A�l�e;1�˸�l��%���4*�N���W�A��߻7S��Y�I�'���ti�h|R��d%Wιq�U���w��J�t���KAó+D��.߇6=U��
��ε�z�y��~N�<@=wq�g#���]��8�����\ٗV�َ��=�Fw�WHDߍ��/��Y2
��N]o�9�۸�K�b`+T:�B��VO|N$�s<��X��!S�Y���D�����%\�r�*�>b��*�B��=x���<`W�Zy��A���`�oG�7��6�Z;�aMPy�X�u�_yk~�>n^�7�P?O�O����‚���~�t��<V��]�1My_u�!W�7m�aT�7��wI5v�;�oݎ��T?4X�E�(ʁ�w����M��
J�^�>��k��)Q���rc��d��̲�H�yYBT�>ô�����?Xk&_��	�}Xv�W���<�����p
A�W�.u��S��|U89ۍ��?e�?ȿ�W��ۘ�p�oG�>JUy"�>�D$&��w̑���]�c�6�B��~��V��D�H,S�3��-V=�f�v�+6�/�~�nw�l��f�It��޿z�`�4~5��:
i�n�^�����7`7p�ג7�(����^���
��n0�+��G���'v��wN��C���S~�~?���")cQ0�V7�7'y��wb��v������b}E~/�������Ik�{q=�l�F;�����~|\�!�
���ۋJ<�j{��,�W�q\��[[�ڂ���餫�۸֡8
�?�?x�Ԯ5�ehY�`�x��d�(�:
��[F�����n�P��'�ں>��]���y�u;��Vn��ӧ(�����-D�3���]��q��O�|>g�rZ���Yw����K��w���bQcC�j�.��K��d	��+��e[�(N�
�l�}3���\�*W���m5O������~�ůi/ _/�/�˴Ljy2��Y}��|Do������?�￈x��n��:��{�*k-l��k����.𻬙��}Xʜd�]���R�p-Z?�5 _��r�'�4$��Q.�g˭i�EM��R���ݻ�m�F_�����V�ʬ��%u����6�s[���m�t��P��ג�ٶ6n�r�ݲ��LbPہ������&�kI�a_a���tۅ�!l�xӶ�Ȑx5R>�D��EӺl���_gu�[ H�6���@�0���⧕�'�?E��/�[�bå��6,�[��n��zi�Em�<�ޏ.r�ngv[UX���]x�0��D�y��\�I��Ÿ�Wfカ�B��n
�a 1���Ҿ���%�7ۆwu޸\O�c�������<�s�@��S �)
��4,,n��^]�7��W�����~�\˞�����l]���s��;kPcq��NT�g��b�I�$&F���10���.�|_!�mo,��t<_�t��y7��@�2hI,�ג�A=�0��|���|�E&=*Tk���1�a
S�1�%FR��ڍfD�\��u�F}�PS(���|+�]i��eߌDM���s�݊�ToA�7%��ȕ#�u�C�2\Z�S:Pm+<��v�i⼭KC;y�ڞ�5�A��v��j���P��;Y(E��WFGvP�Ec��H�[���u��6�w�]#����r��U�X��{y�jn]�E���Ƙ��.6��7pͰ٧��ǸCo�y��w�����v38Cop%t����,k�{�:o��)���{�8�/��N>xd����Ս��8��F�'�q����ǢfPUx1�n��`Y�j��t<'�IqH�Zv[d��8��;�>��mѰ{�=$$Xؤ��%_w���y�����`,l�pX�<NA����V�r[�[
�l���i��2y��-OC�q��*�Е�L�ϋ�=x��o�F)�
�e�f3�c�di��ad"���.�gq>��\@�m�@,��:)g����1?5�`*Z�`)�*lz��I&�c��#Szm���%�`�k/yDb�HK����ȂZ�w�Ը@��9�~��,��Rd�S��R�L�}R�3��#�.�D�Oe̽R�ܰ���^V%���0�d�*��#x*��틘	Y%�bD.���Aa���~!�����K4S��O�	U�Pz{/�<n�D�B�C��w��/��관�]}��E��i.HS0+xܼ+��;3�(��W]��}on{�-vWN\��5>w���b.�j��bF!?4�����p�4ɑ�V3)탊��(#n�0��#��:�x��)�Rn)��b?p���+�Dzr�D��Q������d]A���o�|�s|T-g[�F�/"��S�/�r�W|�s��?��Ut�{����z�N��]������*5g ��[_��:���#�CF;t�	Ba�f��^�Z{+���3��@��2moyW;�wv��!	���M��	���i��Zii��ԥdK~��݌pe���A�C�U~���3���i��K0-0<7��L�1$�=@g�Q���b����!~2�>-�����ˢ�ۂ9f(�\�;�4��*w�t���Qd�[���o�O+=���Á�s��N�~��Zh
���Z���Z��y����
�}g����k�a�,+A�P|ݍ�I|BhQ]����`������HR�t5��0���ɁgU�tH#�q�J�v��U@�˺�b��5=+���l��U�h 
��s�&�k�Zv+�X9�����"�[t�$��Ve1�d�B�x��g��=��o��H�^5x�_��r'DW�.ơ��1�Gx�t��ws��!
�s�i7gMVk�~G����to��o�2lx��P^���
~?����b/�*k�N�q�)yV���
�]�C=Θ>36
[�^ʍ�>B���'�x�䱜�םx������nȿ��>��O����2Ǐw��kq?N�
&�s��/L�
L�ߑ?;ǃ#[)�3u�#�y�(�r ��w�(Xb��>!O^�|iK�)�?�aN��?�~}�jĻ�Lm��|���a����^y0[���&���c����˜����v7~9�e}���ko7H��{��|��'l���iU�]�$n�_F�&��U�[|]x�쪫,�n=���)��v���G�@A�/�+A��F��n٥�
ժF��~p倹}x��Q��Sx�(�V�l3,��`c0�3h_Mi���E۱���'� �A�Sd�{E��ka�R��T+���z��y����1|��<&�v绨�cuf���fᕯ�$#܅{�o#����NA�w�{<�ݨlr�3��W��Ceِl
�i�32:���l�`�����a���ف=��F�B���D!H�0q�AE`+�������Gߊ�G��yƼK����˽`F�0	��7��R�kL��r:��o0�
���Jl3���8���&��x7lO�3��W��Z�y�Ho]�?��x���b#����fY6j�jAlJ)y��0cB�y��n0���߯O��tw$�r�����P�m�M�����]���~r���9A����U�:o=��#��]u��J�b���.��m�2V�}+^�u��]��[�Q��C)����6t{��du杧��*t���&��O��u�~��6d��U�B�/�FX�7e��S��
��3�z�������w��;,���ҁ,SYh��^��`أW��=T]G,�v$dU�7������0y���A�E/��r�"��$b�e8����?q8E>"��A���o�u�ȵS�j9Z�~�CxK�~Z��w(���Ac)���8�᯸��{��ѺC��v�S˦�r��4Ja�*��h��Pw{Z:��"�P�58<#I&hBL���N�{��u���Y�/��;��x�O�n�H� ���:�*%(��C�'�r�}eB&!��ʓ�t,�f(D�����x���b���=x��Ш�J��$��λQ�|���[��q���O�r=:�0�.|�
o�j�#�'�=
	v��2��1�|�m�[����c�K�Ql����)��'��!x%q�/ք�w'-N��<�� ����	W��9���vRM^��Lc�܍~�X5�q���J��xV���O
]ɋ�^	`�d`F)�Ĉ0�.�uY:�֣�H�ԷQ%n:#��G�D�f*�i��l���:�E�L�x�w�f�=�'j[}K>p�f@��˘�gJ�ę��(�UaҎ��-�	�%�U�G�8��*@�4�N~j�Fa�96��:hIi��N��P��m�OGXA�x>��C�N�J=
Ã����,�5C����N���ѧ'��1Ҡ���N�|�B�iɔ;a��Q�f��#��P �]4pt��ȷb���վ�5�6cUp��v�O�z{;�7����z�[j����v.L>=������A������[���g%1IЄ���*����=�A�/���lL9p���vw�?d�i>�x�@t�h9+�!��$��G)����[~�qɷ���и�mV�<�Bw��av�ڇ�f� kʼn��7��1��J�-�E#��,�f���!a�>@�`��p�L�����_>��7����-w91@{�'�DOC�MȍlP�ng3;(A=qk�~��;���aV��0�$�>D?ޫ�H@m%	{�̔p�`1�^�u�ŏ�~��s;ݓ�˝}`�}7�r��*�m.��o��""�c���[to�__�
��5Lɠ�[��w~&�Jk7��8�g�'�rnD�������
�����@�������(�7b�$ϪB�RRQ_�
�ߕ����ܴ�$eW�8���6��&"����UG�S[�yD���c�{���5W��^5�*x�i���	��%���Ȱ�t`�K2/����W�D�_S"�#���y�)��q�'���"կC~����<�`V]V�7(��W:��rx&ͦ�&4~6"�_%5~�HM���dH�M�	>��bE�2�3������1���'�D<�U�u0V�I*l�'��ض*���	����%ȡ}��	�s�]�dzh�nU�������`K3�Cl~4�Q�'u�g�g$�"��-#��0\�|���%C��a�궺W���ɟ��͜s��]������-��bv9wz1DY�ަ�L��ؙޠ��A<۸��ו�懎moX���~Ϸ��J��u޴����\k�f�A����owEnEW�)Onѝs���'�M����1zH�j��u�E�Go�����}"���F4���V?���y�"D�R�k���aM�0��j?9$-	]8}v��,�K�q$t²�x�c��J�,�Օ����L[�D|�C�hM��p>㢳�]t�۩�j.����)p�B��4��06�-���[��-�)�	�%R�Ta�e9�`U��5�p��5	o+)
tm�,�5��KM7Gp�P-{	���u�A �����a�ޠ�r����œ4�R5��<��Kp��2N�&/2t�n���¾�s!p��ҝ���>�щ���x�k���|뙹W���A0�|
�פ��Z���i,��	o�!SNC�k���,�h%�{�߅#��H5���wk9!�Œ��`�����8nj�F�IV�$�x��r���}����tE)b�]���)׌vKyO9Fa�iZ�S�x�;-\T��D�U�̺��W)��.� @�����XW��K����ǚ�_ y5U������
�|����gFb6�k������f'+���&�
�}�����';dr�a>�G���Ow��F��[-�l�mf�w�Y�����qxy��+%*k�qf�.�K�#	La�ej����zj�$j|��ރ�~=#Ї}o�������K��O�9��+�B�h)y�h�7����O�=�~[�t���F����2�O\������@�~�׉�{
|E����5�k��t�qr�1"�s�3b���Ϥ	��LM�k���-��J���xJ�dV����:N�^2�P�x\�E!��O̫wa֒	}?{Ů��آybMI@���V�r�׵�V�%+��i3eo�Lv!��(��g������ݔ���YL� _32�tٯ�%�u)����@0|Aʗ�vu
K[���@��'ɬ��k�hi��>�[��W����?�`�1��eg"�� �̮U��G�S�.$����tnN߼��g�)]7=��Sۡ�L?2�e2����ܶ���8�G)�c��裏�]�+�T��~'�|�=�&��d��.a҅c{l�ü�란?̹�vAx�8���f�fWe��-54u�m�Ѭ��o�!�q�"���V��׋�@��Z�3$z~ԗ�"Z�A[���g(�
��o���^���5�D���a��ʟ�]��E�º��)�X(=��|;�P����w�7Jo���&�ES�XE�;�wM�7�G�qʶWx�҂����r?�����
[d���ӫ�uj!�l�-���\w�xt�Ǽ��)����}a�X:�ҚU��}pY>���(��3rs}_�ǝܷiٿ��f!^w.�<Q��L�^r�����R��X�>k'X�c>ei�SFzC��w�6�/_��s�5�3
���=�Pvw"ˢ3Fh(`�a۲Ph�Gk�@���0�U��H|����۽� �՝x��K��?��>XKl����������'�p�q��3`���(�@'16a��-C���.�+.�n����?�CPw)M7�����fWf��;���'^�Ѷ�J�.�E���P�r�:��elZs�j��> [�A}�J�@��>�$�A�}����V����u,��-AF�8z����k�g�Gc��5
C��a
���+���O�E+��eŎ��t�2����
܃�=څ-�mpzg�_��x���-������Q㈊�\s�YX��됻Ç�o��B�5:|���:����B�xU�gIa6hM�j]�j���\����e*�d�/���%�g��c�쎹r���h=�׍�r��+�� �,�,�X��ea�lb;RW��E��lD4���T[�ـ`vg}�p짰�$������V@9-;���r}��	�p���-y]Ԋ�;�� ���ⶊ�g��J�J��H����TA�♠�5��<ً'8��t�
UO��x6&y�&u{��w��"PF��R ��A��� �r�"��_S#���& -�� CV���c��i�_5}`0.���~F�&��:��?��}S��;^�{[G�m!�1w�;��pН�R/���JB<���/�>��&o�-��nvr���ԛ<0���7/����zD_(�`����O^���_����<|I���x�J�r��L@6As�q�?ğ'�[�գ�5<�m/bw�Of�����Z��!�ʨa[
;�ip-�T��j���ީ��P]�=ݮYZ3�<&���������{0�y�;��1������َpQ��Y"ω�����+���U,��J�X<%�ڦ���7��@���i�ry�\��oq!Yˌ���f�"��נ���P�ۥR�G{�d��ϣG#*�2v�~�257;�
�PZ�X��N!��n3q�?�����/��5��ϛ��ƘFcN�T`Q̳x��J���)���K�`�|��n��b�1��&3V\D��OW��|�K�`r�w���q���|��!@���f  ��Bp��~kD�]Dg��]T��q��G^�`_��o��4K���ωחW�;G�xsg^JͶ��j%��;���~��ۗ�#�K�r����`�7��ݍq�7���+�����x�#�Av��c�I�R����i�H�������gZݬ�rV��������w���v(���P!�mqŒLW�f�m���[�k[n������_��E+��A�\�N�2�6_��\�NR����?N�}w�?�_Ϝ�S�h��g˃��'�#{Γ=�C��k�Y�aԿ�a�j������+@r�K��nBq�z���
.�洲ҙ�	2�E
��0����_�6��K럍���0�@�2~���C���rڏG>�-�i��g� �a׿:#�(��蠆���yQ��'u��|A���B;��՘F?��?�+�}#7�4$b�����v$X��V�=����L	�>%��=��������
A�f��)��h�=�q�`D����;�UU�����L�%�&D��r� Y��̽���t�sO��[X5j�z�Xzh,v���Q�ߨ�[��X������ˡ��|��W���e����E�)��$&k`�{�ۯ%��ͺ˟�!�
�]
�+.3r�;n��y�	B�>2�v[[I��n@oy�'�_���J�<$��4G�1��Y�Ns��+��ηkǡƝ���n�?@�M��W\<C+xt`�>><8o�Jq�я~�W�9�OcgL}I�������3���V_��%�4�`�0���IWp��ї"�)�u�8����_�y��ű!����	8	���,4Ǹ3�Y%\��`��uk�D��k_Y�S@��A��'��>�h0}W��8/q��h���ޚ?�no��7�&����� ��Q����))�$<D��b�:�V;��׻��{�XLT3�6x:
��$xK{�VM���s	�]�����[��l}�^j�7v��\��@�������$�k�
2Fr_��*~A$��A�>*f�ܛ5�p���p
zō&�:���9H/��<l/m�?H��=���[1��}�6>lf�'^�����.l+k�E��]7�S�l��L����8`v6/>HDl�0�
u
�f2�d��C��1�z:�Ī�5Z1/�f6�X����(/xP�=:J'�p꽦��W��3r�K����A?\M�8��<rn:�X��8����҉_8�����eV��H��$ף�fG�j�����g���D$�Q�ŭnL�A�0����
�Yٟ,(��{²%�`��~��9�|�0����~�Z��i�u0��8K�j~�{��(d��#��]K��b���r<��h_��a��H���\�5�'��+�Lր�����x֔��cE�=����'Y8���]Q�A���6�n{'����ӗ1��U�;��%�|K��ñ��C���U�7g_
�3
��0�}3~P�>c�
R1P��e��m�Ș�g�p��޽3WiȪ51��}��N�b�w��]�q�.�_&�!�
y9��Y���ʅ��?~�_"�R��D���v��e�@f��m���Yw�	�g�^�2��6�L�����oߐ���5�n�����8��ü
�M��Cb�%)$�ώ*� ��؎�n�x]'�O_���Y���29�i�݂%�t��*�7J���J��ޜ�_�?�,��\�."��}C`"�e�@�atr>f�ģ��:ɒ/�|���DE�NYا/BR�~����T׈
�B�ͼ�ˌ��1D|̤�!�.�����ԧ=XC�<�����d���~�Z��rk�b�����0�c���:���ޜ����
�Q�q���e��qtT���}z�IK�u�����O�=���Rx��Q�\,�
W�!�tt��P�� 3�c�����W�����!�G	����Ò������Q��9Ŕ��̰�t+t~@�9S��J�	�"
'�`ʖ�ƫ?Y>t=���$'�.u�K�/��-��6���"�����:�����yѠ6�[\�s�aB�Pukƭ����rqFk�G�/�	]�<9݂��;�����Ba䓔ݽ"�_���0!I?\Ai,������,�9��B\L�����ڒ�_��*�5{i�F�'u-x�ɦ��B�����v"r�5N���,��M��=��Qd2c��0�C��hL��m��M�B�&�1F�[�o���M���ą#���i��>H���k����7[Vs����>���-�C��}TH'��5=���=Rq��H�#��N�٫�z����q?�������v�h���fD�+@�NWY��q�"> ~�sVq5p|�pT�\B�	aӋ���mv��壄Q7��V����o��{8*u.cmQ�Gv�a��R��nT	l2p����.�7o�')���N��FO�Wy,�!Uy�Sw�19�I�~ҋH`��-n_0�n�Bo��[��-��A#��%+���d�X�Yx�C��ƭt�|ژ��
���
���0��J�V{��#��w��s�yՎ�K�`�1�ER��,yVz���{ �T���X%Hz/c� ����r����n�=�zO��ȸ;�`���9�+�.��f\l[u�Ʈ��a���E@d'���}��>b'��ʣSzh�&5�rZU�'C��/����K��w̞�i/����}%�o�TpA��*ȭ��o���B�s^����'�|��Bc�h1xsd3L��Ԝ����z����9|�R�$!�
 �7s8c>��[i�����,�*�s�wGucF�������^��A�T���?^�ZfU����/�4ZXX$��XW�PO���H�>���ʗ(J0m�K*�JA��ώn
gl_���xV�X�[������~��|�X�
t;���3��Ƚ:�2�,�l����Y��A��{�R�,Q�N�å
�@o�]�j#D�.s7���6%b3s�q�(�V�Wm��3Y�”r�pQ�awM}�)R�&X��$$��-ѭ6�=��7�ۨM�&�M]����N�s�3͙|_���um�V��z�޻�1�(���w��<A_+N��u��85ܘ���j	���&S3��m��`�?V���V�‡z�҃F��:wE�����.>��82���F}��/��v%�����S^��UwDg١���Rar:%Tf��0�B��l��b���V�!�Q]r�w�6��<Ӭ���Em���%�g+$�D��%\c���4a���N���`Z�Ši�9Ɯ"K�V�膻�!�(�U��t%�������ɋ�]�W~Uu�����!]��-�d���� Ri����O߆q\.�F3��#�a�Ɏ;��4���3�f�|p�X����S�����|��{�^4��½�\��u*��0,ғmT��ܒ|�ϯ����\R��3C�S��l(�Yp@^Ŧ�#r�R&��F��Yxs=<+>yHh\��b��A�E��ή��VP~��7q�v�
�[�C|�"�O(*-O6���\��|'v�JQLsT��Z-ʊ}�
�w�pE�h��\
"�\��p͘��a�X
�q���~!8����C`!����4�	�w��d�8���SɘŖ���V%>ӏ��c�с�⌋8�����JR���$O�hq	.��3k�Q�iy��R;�V�l���΂���q�ֻ$b���`Gz
���J~ϻ�
t���}�#��ޖ+�p��"267�A]�L��Ҍ-���&�{�+��r���r�D]������M�"➀���`�'��X�)V�	RY�Ljy=�2��
:�
„����{�n��>��w�zy��,a��X:ЇddY��e1SȂ�*S��$�^^w{�$>�9��/S��’�R��
JG�Ғ�5l1/��v�Fau��J&F|�ʶN��^�%�OS��K��G#?k��	|^6�W9�cP�1<��)�T��y\��5.�78_ظsڼk�
֞+D����V	�?�
\��#>���E��#��x�&e)�i]�uk�2�v:�=&��}�{,�U�����"`�g�2���c�o¹X�ĉ(��7_�O�6J^��r��ֺ�Ѿ2��T(�H��(�*�Q���s��;���|B�?�Q#�W�FJF�s`:l�mX��e�Cc�V������臀�^\<�/"81>��vT(��O�Bo�bO�u���0G{�9~��a#�G[6�؝7�.ܵxB���J)g�SN
��u��o�,�_0�ɾwA��G:ut�8�L��G,
ç�$M��R�v���s[%� ��t�wK�s;���v���d<��^�@l�to�}�5K�hAI��X��7�W���G��4�P\�Az�)r��z�cZ��Y4��n<�=9���]�x��:���Q#C�Ώ��w�զ6�\[T������z=�OY��V�R��MP��=�ːJ�q�3�G�,�g}��9=����ߐ�O*��R-�VDo�����A�<�x���IQ����N��E6�Aw��ҿ<�<��� �R.�N�k^>�4Q\n�T[���
Q�Нn��M���c��Ym��K��Qa.��yC�܈$cDr�s���
}_=
�>l��
Un�6-�1`������.si��l9�IJ~7���fi3��[��\{y�#!�#T'�AI����N�����A1��㟔�7�J����z��s�Q�t�_�.1�d�@7��o6X�ӎn�/ժGr��%���w�@�ِ����ycְ�$��c��LJ˾�C�ޞIՓ~��S�>���~�c{�^�}��@�`i�7�0|/��0}�Qr��P��w�:,M��Ә�G_���.no3�����Pʽ,wg�Ew!f������?f�kJ6�R��w���E7Ҕ�,�?��*��KJT�|pgI\��8JJ��=R�x<��:Z=F�:�
�����'��
��� I��9�>�ɍ����>�{��7���
aQΏ?�Cs�m�%�͸�ȓ��}�]����W7��q���G�ka��T��t1�aU0��b��s@U
+�df�DN�m:Ŀº]EϞ�9�ٱ9�ت�\qt����7s��Ժ�K�8e�m�ުE����\c|���y��
Eߑ���ׄ�ƖDZ5�j��\�y�^��܆^={|8|"�F�z>(3��#�r���8���݉�������nP�3j׿��P
^mx�;Hx~�֡����nQL�C��D��r�x�c�����z���0�,.*\MJI�XH�{�Ȭ�s��H�j8��֏���9�kx.�}��wF�z���I���Q/8tu�zʂ�uޜ��.?3J�9Y��@	*�=d�ucfĄ�H�.G֤���a޻�������S��h�vdXߜ;3,&��5"$΀!:�\���?~�0�������~�`Lz=����T;{�Mf&G��IE����`
��>S؟��e6��c:6Ki�(O�!E��Z�����r�z`h�"�O�#�"�~y!�D��ǮsPIN���m��<C���[��7�S1�9�q�Jk�%�ktpǏ��C�M��'LBśN��'��|3}@��>U\�+�s�%i�ݪs�������E���/\��hP�w���Q�z������Ⓦw��Z��T��+Y��$=�;ʵd2|�_0�y?��K�2r�
�$n��<
��(�"36�<�=����VH��DP �y�?�Q�Ǫ���pV�mx�zP�2Īv3}�����@�D�kp�V��9΢"|�e�I\��B�M�s\^6H3u�t7��`qg�!˰=~��[#�?�Et�_��0�m��$X�Lr��n٥�^(M��%�wa�
D��g���m�6��,xPU�c�Hv���STm��ux���o~N&Җ`���.���u�<�^yCll��/ْ=�`�݈[���q#X\�:����q���R���v��ܞU�K�&4���Q�
���@���~K{^�!�K�wO��k<��6)�����P%Y�Q5f����YV��3Y
�>�s�	
�݊n�C��<y��^|y_�:ϩ�x�|)e*	w)S�\��;6�D�T���
.�Z�=0�?����(�.g�S�~�i� Xx1G1C�O�O��^������5���޺����5Ȯ��y��䢫&�uv
�c��ZW��:׮���O�x��l�o����
�9�װ�r�D��x�N4�zǁ��n#�u�q9q/�5{'���N�tAz���.vM]9��l���������2�����c�~ ���>2�,��Y�=E�y5����x�v=H�X�D��T	���
˻�ĥr�崽���x���+����r��n��I��g�<J�6=v���C���Im�9(��7��w��7��=���ളG�#��gr�D�I�V2�1B��\����[̏֊����rۦ����g�һE�}z���@/�,
$��N����r�3��q 7O�l�V��B�q�-���r�Q�M#��Dj��byM��P���
���M��}ޯo�&?��]`���U�|���%���${K�j�>�	gm�_�g���\����1R{�C�tO[�x
��}0�}v��Zl4�5n���հ/�}Jlҍl��n㣶A
�/�Bj�&�=D�q\B��U�R���7�O�̀���}`��)�%�q�ڏZk��d�.��V��m�����~a�0�{� \�Q�'٧i�b���t�*l'(X���q�6�E�,���_�nj3X�L	���A�wM�[3��M�=J��n��4s��	��1��Y�l��y��jx�1���Y?�M3.v���M���"	���ِK�R7]}��{I\�-\-./����(\���zU%�q�?x�w�@&�9�u�O6N��k���Y�!��t0��qb8��,���-rE��F�DR�"�[w�k�S7����;jNq�b+2ZY��P����DK�����g/�|��(aR}�l�ycEh3�(��9F�4QhP���7~���������ڱj�n���ֈ̪s��ҟ�)R�sP���|{�eq# ��)��Q�6�Nmv������D���a�6��б6�.����{�^x����V����;oe����>�
����Bp�����_����#F�T�=������_�pk4P�Rܩy�$V�l#`����{FV��<��@�x�@�Q�\ޢ�u�Pt5�-� ���_��g�zA~�C�n�Z��%C?������c3I�+.9	��u�ha���a|�����Z���?�-�Uq����p��=O�u�#}/+����q6�����ɝ�~�~��F��8��A�3��g�o�+�������D`Wm+���ri�:	\ֺ��_?�W���"p���� \@iD�j���ֱ�!��F�fw�A.Y
�/�#��W��O�h��f�^g���&}̪��,Z�#���u|�)t�f4mibvaMЌ������ᅵ�'�e��U�,�ivB��b�ڒ���D�0���|��qO��د���PKE��T���f�e��pip/__init__.pyPKE��T#�m���$pip/__main__.pyPKE��T�}�3=���pip/__pip-runner__.pyPKE��T��5���$pip/py.typedPK�mWb�=�_K��pip/_internal/__init__.pyPKE��Tp�Ppq?%���pip/_internal/build_env.pyPKE��T<l�[�)��Mpip/_internal/cache.pyPKE��T��y�6�4��!pip/_internal/configuration.pyPKE��Tܭ����Q��u1pip/_internal/exceptions.pyPKE��T'���T���Ipip/_internal/main.pyPKE��T���.�	����Jpip/_internal/pyproject.pyPKE��TZB٤
T$���Tpip/_internal/self_outdated_check.pyPKE��T{
�'
�1��o_pip/_internal/wheel_builder.pyPKE��T�w�4h����lpip/_internal/cli/__init__.pyPKE��T@�_�#��umpip/_internal/cli/autocompletion.pyPKE��T$�-^
�!���upip/_internal/cli/base_command.pyPKE��T�iMT�!u���pip/_internal/cli/cmdoptions.pyPKE��T"GM-+$��!�pip/_internal/cli/command_context.pyPKE��TjYd|��	����pip/_internal/cli/main.pyPKE��T�o6
 ��U�pip/_internal/cli/main_parser.pyPKE��T�����A*����pip/_internal/cli/parser.pyPKE��T
6O��"����pip/_internal/cli/progress_bars.pyPKE��TdM7���F ��˺pip/_internal/cli/req_command.pyPKE��T;r�ʒ����pip/_internal/cli/spinners.pyPKE��T�zKXt!����pip/_internal/cli/status_codes.pyPKE��T��1�*"��k�pip/_internal/commands/__init__.pyPKE��T�a@0����=�pip/_internal/commands/cache.pyPKE��T6l�1�����pip/_internal/commands/check.pyPKE��T0�1��!$��m�pip/_internal/commands/completion.pyPKE��Toj�Z�
%'����pip/_internal/commands/configuration.pyPKE��T?��C����}�pip/_internal/commands/debug.pyPKE��T-�R~��"��K�pip/_internal/commands/download.pyPKE��T����� ��Cpip/_internal/commands/freeze.pyPKE��T�������B	pip/_internal/commands/hash.pyPKE��T�Ô<�l��apip/_internal/commands/help.pyPKE��T-g������pip/_internal/commands/index.pyPKE��T(Q%{�.
!���pip/_internal/commands/inspect.pyPKE��T� $ɝkv!��wpip/_internal/commands/install.pyPKE��T�at,t/��S7pip/_internal/commands/list.pyPKE��TW��/bA ���Cpip/_internal/commands/search.pyPKE��T��U�����[Kpip/_internal/commands/show.pyPKE��T+0W�`#��Spip/_internal/commands/uninstall.pyPKE��T��}����Xpip/_internal/commands/wheel.pyPKE��T�u
.;Z'��w_pip/_internal/distributions/__init__.pyPKE��T��p�#���`pip/_internal/distributions/base.pyPKE��T��wK�(��?cpip/_internal/distributions/installed.pyPKE��TA���^$���dpip/_internal/distributions/sdist.pyPKE��T�����$���kpip/_internal/distributions/wheel.pyPKE��TC?K� ��npip/_internal/index/__init__.pyPKE��T�),YMO ��vnpip/_internal/index/collector.pyPKE��T�^�^#ܒ%��
�pip/_internal/index/package_finder.pyPKE��T�+��������pip/_internal/index/sources.pyPKE��TSm�/35D#��ٰpip/_internal/locations/__init__.pyPKE��Tg?X<	n%��M�pip/_internal/locations/_distutils.pyPKE��T���
�%����pip/_internal/locations/_sysconfig.pyPKE��Tcc�~
���pip/_internal/locations/base.pyPKE��T~�N���
"����pip/_internal/metadata/__init__.pyPKE��TAm��#
����pip/_internal/metadata/_json.pyPK�mW�ζa����pip/_internal/metadata/base.pyPKE��T����
I$'���pip/_internal/metadata/pkg_resources.pyPKE��T�2sDNk,���pip/_internal/metadata/importlib/__init__.pyPKE��TLk�|��+��ypip/_internal/metadata/importlib/_compat.pyPKE��T�&P�� *���pip/_internal/metadata/importlib/_dists.pyPKE��T�>n�)���pip/_internal/metadata/importlib/_envs.pyPKE��T{�(�;? ���!pip/_internal/models/__init__.pyPKE��T0�Oy�!��G"pip/_internal/models/candidate.pyPKE��TVGL��"���#pip/_internal/models/direct_url.pyPKE��Tb�ch�	&���*pip/_internal/models/format_control.pyPKE��Tߗ�����p.pip/_internal/models/index.pyPKE��T0q��9
+��m0pip/_internal/models/installation_report.pyPKE��T�q�ל
�(���4pip/_internal/models/link.pyPKE��T��l����Bpip/_internal/models/scheme.pyPKE��T W7L�$��<Dpip/_internal/models/search_scope.pyPKE��T�����s'���Jpip/_internal/models/selection_prefs.pyPKE��TQGe�%���Mpip/_internal/models/target_python.pyPKE��T�f�D��
���Rpip/_internal/models/wheel.pyPKE��T�J22!��Xpip/_internal/network/__init__.pyPKE��T�=.RJ
�/���Xpip/_internal/network/auth.pyPKE��TLI!]Na��fpip/_internal/network/cache.pyPKE��T�+��!���ipip/_internal/network/download.pyPKE��T����	�#���ppip/_internal/network/lazy_wheel.pyPKE��T��dH ���zpip/_internal/network/session.pyPKE��T��������pip/_internal/network/utils.pyPKE��T-�{_������pip/_internal/network/xmlrpc.pyPKE��T$����pip/_internal/operations/__init__.pyPKE��T�ͯ�"�!��ƛpip/_internal/operations/check.pyPKE��To&�/
8&"��'�pip/_internal/operations/freeze.pyPKE��T΋�U��Y#����pip/_internal/operations/prepare.pyPKE��T*����pip/_internal/operations/build/__init__.pyPKE��T����%/���pip/_internal/operations/build/build_tracker.pyPKE��T���1_|*����pip/_internal/operations/build/metadata.pyPKE��TF,�t�3��z�pip/_internal/operations/build/metadata_editable.pyPKE��T2�.2�1��?�pip/_internal/operations/build/metadata_legacy.pyPKE��T�<F�''����pip/_internal/operations/build/wheel.pyPKE��T����A}0����pip/_internal/operations/build/wheel_editable.pyPKE��TGL� �.��|�pip/_internal/operations/build/wheel_legacy.pyPKE��T��{53,����pip/_internal/operations/install/__init__.pyPKE��T+Ӷ
J3��H�pip/_internal/operations/install/editable_legacy.pyPKE��T��A�d	*����pip/_internal/operations/install/legacy.pyPKE��T=�zM� �j)��^�pip/_internal/operations/install/wheel.pyPKE��T���ڕ�
��Ypip/_internal/req/__init__.pyPKE��T/�����@!��)
pip/_internal/req/constructors.pyPKE��T�p�^D��gpip/_internal/req/req_file.pyPK�mW�s/b"� ���0pip/_internal/req/req_install.pyPKE��T���E*��7Spip/_internal/req/req_set.pyPKE��Th�|v�]"���Vpip/_internal/req/req_uninstall.pyPKE��T$��rpip/_internal/resolution/__init__.pyPKE��T�˩�G ��Yrpip/_internal/resolution/base.pyPKE��T+���spip/_internal/resolution/legacy/__init__.pyPK�mW�Nջ;�^+���spip/_internal/resolution/legacy/resolver.pyPKE��T/��e�pip/_internal/resolution/resolvelib/__init__.pyPKE��T�"�Hd+����pip/_internal/resolution/resolvelib/base.pyPKE��T�K`�`J1��E�pip/_internal/resolution/resolvelib/candidates.pyPK�mW����|�n.���pip/_internal/resolution/resolvelib/factory.pyPKE��T)�Z��I7����pip/_internal/resolution/resolvelib/found_candidates.pyPKE��Tg>!
�&/����pip/_internal/resolution/resolvelib/provider.pyPKE��T�~p_�	/��;�pip/_internal/resolution/resolvelib/reporter.pyPKE��T��ֳ�O3����pip/_internal/resolution/resolvelib/requirements.pyPKE��T�ٱf
-/����pip/_internal/resolution/resolvelib/resolver.pyPKE��T����pip/_internal/utils/__init__.pyPKE��TJx9?������pip/_internal/utils/_log.pyPKE��TrB—�����pip/_internal/utils/appdirs.pyPKE��T�c�k�\����pip/_internal/utils/compat.pyPKE��T����s)���pip/_internal/utils/compatibility_tags.pyPKE��Tl=�������pip/_internal/utils/datetime.pyPKE��T ��'M6"��[�pip/_internal/utils/deprecation.pyPKE��T&��]��)���pip/_internal/utils/direct_url_helpers.pyPKE��TW��[%��	pip/_internal/utils/distutils_args.pyPKE��T[w]�>���Rpip/_internal/utils/egg_link.pyPKE��T������pip/_internal/utils/encoding.pyPK�mW0Q���"��pip/_internal/utils/entrypoints.pyPKE��T����!��)pip/_internal/utils/filesystem.pyPKE��T��O-X� ��Spip/_internal/utils/filetypes.pyPKE��TR�=U/&���pip/_internal/utils/glibc.pyPKE��T1�_����R%pip/_internal/utils/hashes.pyPKE��T���-��e,pip/_internal/utils/inject_securetransport.pyPKE��T�s�w
p-��R.pip/_internal/utils/logging.pyPKE��T���qT��<pip/_internal/utils/misc.pyPKE��T;��w����Vpip/_internal/utils/models.pyPKE��T�L���< ���Xpip/_internal/utils/packaging.pyPKE��TH6��'���\pip/_internal/utils/setuptools_build.pyPKE��T�\�p��#!���cpip/_internal/utils/subprocess.pyPKE��T�:T�	���opip/_internal/utils/temp_dir.pyPKE��T;��6�	u" ���ypip/_internal/utils/unpacking.pyPKE��T~��9���̃pip/_internal/utils/urls.pyPKE��TZ��'"�
!��>�pip/_internal/utils/virtualenv.pyPKE��T�(�K�����pip/_internal/utils/wheel.pyPKE��T/���/T��$�pip/_internal/vcs/__init__.pyPKE��T&xs�)�����pip/_internal/vcs/bazaar.pyPKE��TS�?w��F���pip/_internal/vcs/git.pyPKE��TQ��m�v��ٮpip/_internal/vcs/mercurial.pyPKE��T�T��`�-���pip/_internal/vcs/subversion.pyPKE��TF�ز�Y#����pip/_internal/vcs/versioncontrol.pyPKE��T�,��^f��m�pip/_vendor/__init__.pyPKE��T���!�����pip/_vendor/six.pyPKE��Taf��?F�& ��1pip/_vendor/typing_extensions.pyPKE��T�|��'����Jpip/_vendor/vendor.txtPKE��Ts���$��	Lpip/_vendor/cachecontrol/__init__.pyPKE��T�=��Dc ��[Mpip/_vendor/cachecontrol/_cmd.pyPKE��T��L���#���Opip/_vendor/cachecontrol/adapter.pyPKE��TH�]�!��Vpip/_vendor/cachecontrol/cache.pyPKE��T�5��O
"���Xpip/_vendor/cachecontrol/compat.pyPKE��T_H1� @&��HZpip/_vendor/cachecontrol/controller.pyPKE��T��]Ij'��tlpip/_vendor/cachecontrol/filewrapper.pyPKE��TJtn��:&��spip/_vendor/cachecontrol/heuristics.pyPKE��T�g�	�%��3ypip/_vendor/cachecontrol/serialize.pyPKE��T�Fb2#����pip/_vendor/cachecontrol/wrapper.pyPKE��T������+���pip/_vendor/cachecontrol/caches/__init__.pyPKE��T8@8�m�-���pip/_vendor/cachecontrol/caches/file_cache.pyPKE��T^���	.����pip/_vendor/cachecontrol/caches/redis_cache.pyPKE��TN��*Q^����pip/_vendor/certifi/__init__.pyPKE��T/ �����=�pip/_vendor/certifi/__main__.pyPK�mW|�������pip/_vendor/certifi/core.pyPKE��T�i�y��b�pip/_vendor/chardet/__init__.pyPKE��TsW�9*z����pip/_vendor/chardet/big5freq.pyPKE��T��+z8�!����pip/_vendor/chardet/big5prober.pyPKE��TH
�[	�%'��B�pip/_vendor/chardet/chardistribution.pyPKE��TAt��u�)����pip/_vendor/chardet/charsetgroupprober.pyPKE��T!l7y��$����pip/_vendor/chardet/charsetprober.pyPKE��T�Ct��
)��s�pip/_vendor/chardet/codingstatemachine.pyPKE��T�3d."��S�pip/_vendor/chardet/cp949prober.pyPKE��TmùS����pip/_vendor/chardet/enums.pyPKE��TI�$" ���pip/_vendor/chardet/escprober.pyPKE��T�w�yS�.��Jpip/_vendor/chardet/escsm.pyPKE��T���\"���pip/_vendor/chardet/eucjpprober.pyPKE��Th˺�m�4 ��/pip/_vendor/chardet/euckrfreq.pyPKE��T�(�4�"���$pip/_vendor/chardet/euckrprober.pyPKE��T��a�91� ��N(pip/_vendor/chardet/euctwfreq.pyPKE��Tm��4�"��cbpip/_vendor/chardet/euctwprober.pyPKE��T0��$q'�P!���epip/_vendor/chardet/gb2312freq.pyPKE��T�`�3�#����pip/_vendor/chardet/gb2312prober.pyPKE��T���_6#����pip/_vendor/chardet/hebrewprober.pyPKE��T�$�!0�d��ݣpip/_vendor/chardet/jisfreq.pyPKE��TJT�1� ��:�pip/_vendor/chardet/johabfreq.pyPKE��T���4�"��pip/_vendor/chardet/johabprober.pyPKE��Tޟ���h���	pip/_vendor/chardet/jpcntx.pyPKE��TsJi�_r�)��Lpip/_vendor/chardet/langbulgarianmodel.pyPKE��TIC[���%���;pip/_vendor/chardet/langgreekmodel.pyPKE��T\8R���&���Spip/_vendor/chardet/langhebrewmodel.pyPKE��TCcU��)���jpip/_vendor/chardet/langhungarianmodel.pyPKE��T�Hs�x'#�'��@�pip/_vendor/chardet/langrussianmodel.pyPKE��Tcp�Mv�$����pip/_vendor/chardet/langthaimodel.pyPKE��TT�-��t'��]�pip/_vendor/chardet/langturkishmodel.pyPKE��T�M�K��#��z�pip/_vendor/chardet/latin1prober.pyPKE��T�����'
&��M�pip/_vendor/chardet/mbcharsetprober.pyPKE��T����|&��e�pip/_vendor/chardet/mbcsgroupprober.pyPKE��T��XE5tu��%�pip/_vendor/chardet/mbcssm.pyPKE��T3ľ�7&���pip/_vendor/chardet/sbcharsetprober.pyPKE��T��͉!&���pip/_vendor/chardet/sbcsgroupprober.pyPKE��Trz���!���pip/_vendor/chardet/sjisprober.pyPKE��T}�"�3(���pip/_vendor/chardet/universaldetector.pyPKE��TaB�ja $��d%pip/_vendor/chardet/utf1632prober.pyPKE��TQhX7�
!���-pip/_vendor/chardet/utf8prober.pyPKE��T[��t����'2pip/_vendor/chardet/version.pyPKE��T#��3pip/_vendor/chardet/cli/__init__.pyPKE��T�t��f	%��^3pip/_vendor/chardet/cli/chardetect.pyPKE��T(���7pip/_vendor/chardet/metadata/__init__.pyPKE��T}0���3)���7pip/_vendor/chardet/metadata/languages.pyPKE��T��Բ� ��9Ipip/_vendor/colorama/__init__.pyPKE��TR٭���	��)Jpip/_vendor/colorama/ansi.pyPKE��T1�}�N*#���Mpip/_vendor/colorama/ansitowin32.pyPKE��ToEr�{"��Zpip/_vendor/colorama/initialise.pyPKE��TP���\pip/_vendor/colorama/win32.pyPKE��T�(���&��Tbpip/_vendor/colorama/winterm.pyPKE��Tu*�x]E��hpip/_vendor/distlib/__init__.pyPKE��T�&�8F++���jpip/_vendor/distlib/compat.pyPKE��T�7xڲ0������pip/_vendor/distlib/database.pyPKE��T*���bQ����pip/_vendor/distlib/index.pyPKE��T��M-3�����pip/_vendor/distlib/locators.pyPKE��Tx�5gl�9��	pip/_vendor/distlib/manifest.pyPKE��T�"@D����	pip/_vendor/distlib/markers.pyPKE��T@�]"u%y���	'	pip/_vendor/distlib/metadata.pyPKE��T��Հ�D* ���L	pip/_vendor/distlib/resources.pyPKE��T��tԎ�F���X	pip/_vendor/distlib/scripts.pyPKE��T޻���~��sn	pip/_vendor/distlib/t32.exePKE��Tj$qC>����+
pip/_vendor/distlib/t64-arm.exePKE��Tv~������jpip/_vendor/distlib/t64.exePKE��T
�]�G����6pip/_vendor/distlib/util.pyPKE��T��2�~�[���~pip/_vendor/distlib/version.pyPKE��T����f��p�pip/_vendor/distlib/w32.exePKE��TǦ���-����L
pip/_vendor/distlib/w64-arm.exePKE��Tƺ�1�����zpip/_vendor/distlib/w64.exePKE��T�g�8*z���:@pip/_vendor/distlib/wheel.pyPKE��T�`p�#����jpip/_vendor/distro/__init__.pyPKE��TT�i<@���kpip/_vendor/distro/__main__.pyPKE��T���=,ɾ��glpip/_vendor/distro/distro.pyPKE��T�x��Q��ޘpip/_vendor/idna/__init__.pyPKE��Te0�3!.
��4�pip/_vendor/idna/codec.pyPKE��TE��A����pip/_vendor/idna/compat.pyPKE��T�����1����pip/_vendor/idna/core.pyPKE��T�Ă�$����i�pip/_vendor/idna/idnadata.pyPKE��T�S!Y��d�pip/_vendor/idna/intranges.pyPKE��T��^ ����pip/_vendor/idna/package_data.pyPKE��Tt�x���p���pip/_vendor/idna/uts46data.pyPKE��Tû
�l��Enpip/_vendor/msgpack/__init__.pyPKE��T;;�ӭ9!��uppip/_vendor/msgpack/exceptions.pyPKE��T'�89����arpip/_vendor/msgpack/ext.pyPKE��T�H~E������ypip/_vendor/msgpack/fallback.pyPKE��TF�cf�"��–pip/_vendor/packaging/__about__.pyPKE��T�����!��h�pip/_vendor/packaging/__init__.pyPKE��T*:c��,#����pip/_vendor/packaging/_manylinux.pyPKE��T�t10#��d�pip/_vendor/packaging/_musllinux.pyPKE��T0��`�$��կpip/_vendor/packaging/_structures.pyPKE��Tm��?{
'! ��w�pip/_vendor/packaging/markers.pyPKE��Tn�AZ�D%��0�pip/_vendor/packaging/requirements.pyPKE��T5����u#��e�pip/_vendor/packaging/specifiers.pyPKE��T�	ms�S=����pip/_vendor/packaging/tags.pyPKE��TA��3�h��U�pip/_vendor/packaging/utils.pyPK�mWd�Y���8 ��_�pip/_vendor/packaging/version.pyPKE��T��B�w���Npip/_vendor/pep517/__init__.pyPKE��T�>R(�
��pip/_vendor/pep517/build.pyPKE��Ts������bpip/_vendor/pep517/check.pyPKE��T
�VЊ��]pip/_vendor/pep517/colorlog.pyPKE��T��5����#pip/_vendor/pep517/compat.pyPKE��T;ϸF�i��&pip/_vendor/pep517/dirtools.pyPKE��T�"����1pip/_vendor/pep517/envbuild.pyPKE��T������	���%pip/_vendor/pep517/meta.pyPKE��TUx��u4���)pip/_vendor/pep517/wrappers.pyPKE��T��$3)���6pip/_vendor/pep517/in_process/__init__.pyPKE��T�"�H�+,��8pip/_vendor/pep517/in_process/_in_process.pyPKE��T��)��s��%���Cpip/_vendor/pkg_resources/__init__.pyPKE��Ta$�K2'����pip/_vendor/pkg_resources/py31compat.pyPKE��TM]�V�2$��;�pip/_vendor/platformdirs/__init__.pyPKE��T��kUo�$��w�pip/_vendor/platformdirs/__main__.pyPKE��TR"�si�#��(�pip/_vendor/platformdirs/android.pyPKE��T	Vp�.����pip/_vendor/platformdirs/api.pyPKE��TK� |_
!���pip/_vendor/platformdirs/macos.pyPKE��T��� ����pip/_vendor/platformdirs/unix.pyPKE��T��<N#����pip/_vendor/platformdirs/version.pyPKE��Tjo��Z'#��C�pip/_vendor/platformdirs/windows.pyPKE��T���T�� ����pip/_vendor/pygments/__init__.pyPKE��T�6�_�a ����pip/_vendor/pygments/__main__.pyPKE��TjN$;cp[����pip/_vendor/pygments/cmdline.pyPKE��Ty�.����t�pip/_vendor/pygments/console.pyPKE��T���n���A�pip/_vendor/pygments/filter.pyPKE��T
�4��e!��}�pip/_vendor/pygments/formatter.pyPKE��T��\!}��Vpip/_vendor/pygments/lexer.pyPKE��T������ ���%pip/_vendor/pygments/modeline.pyPKE��T��.7S���
(pip/_vendor/pygments/plugin.pyPKE��Te)�mL ���*pip/_vendor/pygments/regexopt.pyPKE��TB��
���#/pip/_vendor/pygments/scanner.pyPKE��T"\�^!���3pip/_vendor/pygments/sphinxext.pyPKE��TvG�q��}9pip/_vendor/pygments/style.pyPKE��Ti[�n���X@pip/_vendor/pygments/token.pyPKE��Tz(|@�L�!��Hpip/_vendor/pygments/unistring.pyPKE��T
��s��#����pip/_vendor/pygments/util.pyPKE��TS�hޅd�(���pip/_vendor/pygments/filters/__init__.pyPKE��T���0��+���pip/_vendor/pygments/formatters/__init__.pyPKE��TL��ߏu+����pip/_vendor/pygments/formatters/_mapping.pyPKE��T��{�)��s�pip/_vendor/pygments/formatters/bbcode.pyPKE��T�$���(��5�pip/_vendor/pygments/formatters/groff.pyPKE��TME��&q�'����pip/_vendor/pygments/formatters/html.pyPKE��T�%W;U&���pip/_vendor/pygments/formatters/img.pyPKE��T䜳�)�&��wpip/_vendor/pygments/formatters/irc.pyPKE��TT�CH�K(���pip/_vendor/pygments/formatters/latex.pyPKE��T�ȣ�k�(��r5pip/_vendor/pygments/formatters/other.pyPKE��Tϣ�;��.��#<pip/_vendor/pygments/formatters/pangomarkup.pyPKE��T���g��&��m?pip/_vendor/pygments/formatters/rtf.pyPKE��T/�	��	�&���Fpip/_vendor/pygments/formatters/svg.pyPKE��T��f�KB+���Ppip/_vendor/pygments/formatters/terminal.pyPKE��T$/7���-.��KWpip/_vendor/pygments/formatters/terminal256.pyPKE��T����,'���cpip/_vendor/pygments/lexers/__init__.pyPKE��T�B��J<�'���ppip/_vendor/pygments/lexers/_mapping.pyPKE��T!2��*8�%��0�pip/_vendor/pygments/lexers/python.pyPKE��T���Ǧ�'����pip/_vendor/pygments/styles/__init__.pyPKE��T���jh
�#!����pip/_vendor/pyparsing/__init__.pyPKE��T/H��F ����pip/_vendor/pyparsing/actions.pyPKE��T��e~��2���pip/_vendor/pyparsing/common.pyPKE��T�{�P�`A��2pip/_vendor/pyparsing/core.pyPKE��T�6 t�
?##����pip/_vendor/pyparsing/exceptions.pyPKE��T�*,٘ ����pip/_vendor/pyparsing/helpers.pyPKE��T^���b ��
�pip/_vendor/pyparsing/results.pyPKE��T��5�[
Z4 ��Lpip/_vendor/pyparsing/testing.pyPKE��Tz��x#* ���pip/_vendor/pyparsing/unicode.pyPKE��T-G�l����A)pip/_vendor/pyparsing/util.pyPKE��T��SL�\)��j1pip/_vendor/pyparsing/diagram/__init__.pyPKE��T*��"x: ���Kpip/_vendor/requests/__init__.pyPKE��T9
�G�#��|Spip/_vendor/requests/__version__.pyPKE��TW@�yu'���Tpip/_vendor/requests/_internal_utils.pyPKE��T��r�S ���Wpip/_vendor/requests/adapters.pyPKE��T'���[���2lpip/_vendor/requests/api.pyPKE��T8wf�|�'���rpip/_vendor/requests/auth.pyPKE��T�����|~pip/_vendor/requests/certs.pyPKE��TɊ[���pip/_vendor/requests/compat.pyPKE��T/P����H��i�pip/_vendor/requests/cookies.pyPKE��T�@2J��"��c�pip/_vendor/requests/exceptions.pyPKE��T��Z.�'����pip/_vendor/requests/help.pyPKE��T��Gg���R�pip/_vendor/requests/hooks.pyPKE��T�m�ۼ&׉���pip/_vendor/requests/models.pyPKE��T<ށk� ����pip/_vendor/requests/packages.pyPKE��TH��!�u ����pip/_vendor/requests/sessions.pyPKE��T�t�.��$����pip/_vendor/requests/status_codes.pyPKE��TQL�[`"����pip/_vendor/requests/structures.pyPKE��T��7)؁��?�pip/_vendor/requests/utils.pyPKE��T��k��"��� pip/_vendor/resolvelib/__init__.pyPKE��Te�4�#���!pip/_vendor/resolvelib/providers.pyPKE��T�G�%*/#��<)pip/_vendor/resolvelib/reporters.pyPKE��T�qC�D#���+pip/_vendor/resolvelib/resolvers.pyPKE��TT��pS�!��+>pip/_vendor/resolvelib/structs.pyPKE��T)���Cpip/_vendor/resolvelib/compat/__init__.pyPKE��T�.gc�0��Dpip/_vendor/resolvelib/compat/collections_abc.pyPKE��T|���8���Dpip/_vendor/rich/__init__.pyPKE��T�e<9�h"���Lpip/_vendor/rich/__main__.pyPKE��T�À7
p' ���Ypip/_vendor/rich/_cell_widths.pyPKE��T.�,q�# ��
dpip/_vendor/rich/_emoji_codes.pyPKE��T�y��("��w�pip/_vendor/rich/_emoji_replace.pyPKE��T��w2B"����pip/_vendor/rich/_export_format.pyPKE��TIԷۛ	����pip/_vendor/rich/_extension.pyPKE��T�~t�%����pip/_vendor/rich/_inspect.pyPKE��T��������pip/_vendor/rich/_log_render.pyPKE��T��%���x�pip/_vendor/rich/_loop.pyPKE��T�W-������pip/_vendor/rich/_palettes.pyPKE��T���L������pip/_vendor/rich/_pick.pyPKE��T�d�`����pip/_vendor/rich/_ratio.pyPKE��T�1�T_�M����pip/_vendor/rich/_spinners.pyPKE��T�Q��_��Rpip/_vendor/rich/_stack.pyPKE��T`�\����f	pip/_vendor/rich/_timer.pyPKE��T?XU�$Y"���
pip/_vendor/rich/_win32_console.pyPKE��TCk�ڽ����pip/_vendor/rich/_windows.pyPKE��T��=��
%���!pip/_vendor/rich/_windows_renderer.pyPKE��T+,��0���$pip/_vendor/rich/_wrap.pyPKE��TkEQ�z���'pip/_vendor/rich/abc.pyPKE��T�&ً��(��H)pip/_vendor/rich/align.pyPKE��T?%�����'2pip/_vendor/rich/ansi.pyPKE��T���'[����9pip/_vendor/rich/bar.pyPKE��T���i
�&���>pip/_vendor/rich/box.pyPKE��T�C@����'Ipip/_vendor/rich/cells.pyPKE��T.m%F��,Opip/_vendor/rich/color.pyPKE��TiD
N�!���apip/_vendor/rich/color_triplet.pyPKE��T�LR�����cpip/_vendor/rich/columns.pyPKE��T���D�R�v���kpip/_vendor/rich/console.pyPKE��T�L�I���P�pip/_vendor/rich/constrain.pyPKE��T�.��y��i�pip/_vendor/rich/containers.pyPKE��T;!����k�pip/_vendor/rich/control.pyPKE��T';��"����pip/_vendor/rich/default_styles.pyPKE��T9G��������pip/_vendor/rich/diagnose.pyPKE��T�
E��	����pip/_vendor/rich/emoji.pyPKE��T"H!�������pip/_vendor/rich/errors.pyPKE��T7��({P���pip/_vendor/rich/file_proxy.pyPKE��Tv�*�A�	����pip/_vendor/rich/filesize.pyPKE��T?c��Aq%��C�pip/_vendor/rich/highlighter.pyPKE��T�]ݣ-�����pip/_vendor/rich/json.pyPKE��T8�Xȋ���$�pip/_vendor/rich/jupyter.pyPKE��T?��
�6���pip/_vendor/rich/layout.pyPKE��T���\7��pip/_vendor/rich/live.pyPKE��T���0S���pip/_vendor/rich/live_render.pyPKE��TH��v
�,��Ypip/_vendor/rich/logging.pyPKE��T�Cb^�	 ��)pip/_vendor/rich/markup.pyPKE��T��l���;3pip/_vendor/rich/measure.pyPKE��T���j���8pip/_vendor/rich/padding.pyPKE��T��s<���>pip/_vendor/rich/pager.pyPKE��T8>_�D
���@pip/_vendor/rich/palette.pyPKE��T8s�("���Epip/_vendor/rich/panel.pyPKE��T�Q� ���VNpip/_vendor/rich/pretty.pyPKE��Tr#Ho[.b���wopip/_vendor/rich/progress.pyPKE��T��z�	� ���pip/_vendor/rich/progress_bar.pyPKE��Tp�Y�
',��X�pip/_vendor/rich/prompt.pyPKE��TX���9o��u�pip/_vendor/rich/protocol.pyPKE��T]®�u����pip/_vendor/rich/region.pyPKE��T�/a����pip/_vendor/rich/repr.pyPKE��T�̀������pip/_vendor/rich/rule.pyPKE��T��`=t����pip/_vendor/rich/scope.pyPKE��T?5��R7��`�pip/_vendor/rich/screen.pyPKE��T�^`-/�^����pip/_vendor/rich/segment.pyPKE��T�B�rJ��R�pip/_vendor/rich/spinner.pyPKE��T�(1s�I����pip/_vendor/rich/status.pyPKE��T�(:Z�f���pip/_vendor/rich/style.pyPKE��T�
�P������pip/_vendor/rich/styled.pyPKE��T�y�y������pip/_vendor/rich/syntax.pyPKE��T���:[���Rpip/_vendor/rich/table.pyPKE��T:#ӿ�*
"���>pip/_vendor/rich/terminal_theme.pyPKE��Tn��%�&z���Cpip/_vendor/rich/text.pyPKE��T�̮+��1jpip/_vendor/rich/theme.pyPKE��TQu�PGf��opip/_vendor/rich/themes.pyPKE��TWBi��e���opip/_vendor/rich/traceback.pyPKE��T>��W
�#��x�pip/_vendor/rich/tree.pyPKE��T���QG ���pip/_vendor/tenacity/__init__.pyPKE��T�ml�� ��(�pip/_vendor/tenacity/_asyncio.pyPKE��TU<k}����pip/_vendor/tenacity/_utils.pyPKE��T�������̯pip/_vendor/tenacity/after.pyPKE��T�}婽`����pip/_vendor/tenacity/before.pyPKE��T�kbt$���pip/_vendor/tenacity/before_sleep.pyPKE��T�l���g����pip/_vendor/tenacity/nap.pyPKE��T�R-�������pip/_vendor/tenacity/retry.pyPKE��T�V�u��
����pip/_vendor/tenacity/stop.pyPKE��T�"9�a"��}�pip/_vendor/tenacity/tornadoweb.pyPKE��TZe�Y�#��i�pip/_vendor/tenacity/wait.pyPKE��T��%����6�pip/_vendor/tomli/__init__.pyPKE��T��i�iX����pip/_vendor/tomli/_parser.pyPKE��Tu�1~��N�pip/_vendor/tomli/_re.pyPKE��T��g�����pip/_vendor/tomli/_types.pyPKE��T!ImQ�
���pip/_vendor/urllib3/__init__.pyPKE��T?r
;*#����pip/_vendor/urllib3/_collections.pyPKE��T6��@@���pip/_vendor/urllib3/_version.pyPKE��T�U�'fN!��Npip/_vendor/urllib3/connection.pyPKE��Tm��~�)��%���pip/_vendor/urllib3/connectionpool.pyPKE��T^�I��	 !���Dpip/_vendor/urllib3/exceptions.pyPKE��T�(K, 
�!���Npip/_vendor/urllib3/fields.pyPKE��T����~�	��GYpip/_vendor/urllib3/filepost.pyPKE��T1&W�lJM"��]pip/_vendor/urllib3/poolmanager.pyPKE��T����a���spip/_vendor/urllib3/request.pyPKE��T&�m�S�m���{pip/_vendor/urllib3/response.pyPKE��T'��!�pip/_vendor/urllib3/contrib/__init__.pyPKE��T*����1��h�pip/_vendor/urllib3/contrib/_appengine_environ.pyPKE��T8e	�g+(��l�pip/_vendor/urllib3/contrib/appengine.pyPKE��T��C�T�'���pip/_vendor/urllib3/contrib/ntlmpool.pyPKE��T�@ҍ�B(����pip/_vendor/urllib3/contrib/pyopenssl.pyPKE��T�,q�%��.��y�pip/_vendor/urllib3/contrib/securetransport.pyPKE��T�R�?Y�$����pip/_vendor/urllib3/contrib/socks.pyPKE��T8�� �pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKE��T.�-M��D8��x�pip/_vendor/urllib3/contrib/_securetransport/bindings.pyPKE��T�*��Yb69���pip/_vendor/urllib3/contrib/_securetransport/low_level.pyPKE��T(��lpip/_vendor/urllib3/packages/__init__.pyPKE��T\��&!i�#���pip/_vendor/urllib3/packages/six.pyPKE��T2��7pip/_vendor/urllib3/packages/backports/__init__.pyPKE��T޸c�H�2��m7pip/_vendor/urllib3/packages/backports/makefile.pyPKE��T抙���$��:pip/_vendor/urllib3/util/__init__.pyPKE��T���%&��<pip/_vendor/urllib3/util/connection.pyPKE��T
�\^E!���Cpip/_vendor/urllib3/util/proxy.pyPKE��TN����!���Fpip/_vendor/urllib3/util/queue.pyPKE��T7�m��#���Gpip/_vendor/urllib3/util/request.pyPKE��T6(մ`�
$���Mpip/_vendor/urllib3/util/response.pyPKE��T��5���U!��cSpip/_vendor/urllib3/util/retry.pyPKE��T���ǧC ���jpip/_vendor/urllib3/util/ssl_.pyPKE��T?q���~.����pip/_vendor/urllib3/util/ssl_match_hostname.pyPKE��T�����(����pip/_vendor/urllib3/util/ssltransport.pyPKE��T$���'#����pip/_vendor/urllib3/util/timeout.pyPKE��T;:bT�7����pip/_vendor/urllib3/util/url.pyPKE��TV�Vտ ��I�pip/_vendor/urllib3/util/wait.pyPKE��Tx�q2S)$��F�pip/_vendor/webencodings/__init__.pyPKE��Tǭ�#"����pip/_vendor/webencodings/labels.pyPKE��TP1D$����pip/_vendor/webencodings/mklabels.pyPKE��Tg8p���!����pip/_vendor/webencodings/tests.pyPKE��T��֥�*��}�pip/_vendor/webencodings/x_user_defined.pyPK�mW�V+�E ��j�pip-22.2.1.dist-info/LICENSE.txtPK�mW��]��y��)�pip-22.2.1.dist-info/METADATAPK�mW�h�\\��X�pip-22.2.1.dist-info/WHEELPK�mW��C�<}%����pip-22.2.1.dist-info/entry_points.txtPK�mW���"��k�pip-22.2.1.dist-info/top_level.txtPK�mW��.�V�����pip-22.2.1.dist-info/RECORDPK��/��:python-wheels/setuptools-58.3.0-py3-none-any.whl000075500002207117151732726240015321 0ustar00PK��mWb�/q�distutils-precedence.pthM�=
� ����m*/ ٚ!HA�&J�Ѡ6�t��q�� W�+0ӣ�O�,�F�G|L�X3͚)ɭ1�N�*C���$_��ށ��#�L��31o.�9.y@���3�TۧQ����̈́t�c���B��PK��VS�@=�h_distutils_hack/__init__.py�Wmo�6��_A$$w.��͋�؀�@��-�t��
%�#"�(�TRa��i��I�a�В����YTJ[f3�~����v��e�~x��僙L&�DUS5�="����ɒ y\���2*TZ�������<�n�@>�JC0��W~:�?�T[[��?c�A�!�ܻ�
IU��Mю6Γ�C�P�@i��Òt�+�m]�.��N�[벽ղ"�ԉ?�6�<��F��Y����i��}n>7l�4[�SV��*SI�<o�����3��M%�a6�6����\��eϠ��R)/���.���y��x�bu�<������|�:��'��G���jp/��g����m��L����H�jo'G/���a'qp��f��,t�*���m�!���h"G"4T�H�Sqߑt�|�(d����sv�I�
ѰD:ij
�O�H-b�C&��҆ad@k\�e�ē�)�3�nL
h��6��
�ݙ�+�A�73���Y�	,��/�I��bȑ4��ڦE��]�B���(�3y�0�Q����B<s��X��E������m�$Ț���8O�#�|dG4�t1
6�o�T\��X!����&Y��A�fN~z簆�	�74�|��mi��O[�<���zFns6��� ��=I���{Z!<g2��7e�V�?�
�����Ϸ�>ݬ�����z}����f��ƦX�������`g�U"򠳛�!r���\����}?
�_m�{��{�`�GnDM�^�	
��ݡh��L|�3���aI�㶒긍{�������
������&���n찀/8DYB�	0�d6�niNU���k��n�\
ꟊ܅Ap`��+�A�	��0sO�����fu����ż���7����C�DJ����b�:wt��@A��'7*�Y)�2�-ߗ�g'�Z�!KIN���$v_���
�#�A��63����g�*a��Bci���J���1�G]�N��A���S-u�IiI
#$$���w�q��$|�ƹ�Lw��M�EX���Pg,E��g�t�n%����΄�2:��6�"N^?$����o�\@�#(�?��s��k��V[7�W�w:&y��n{:�;�1��7/�W�d��1�ӫU��A���3})0��vCҖ
��5�vP���L�%
=����xw���U0~=<?;=v�����_T�	O�p��<Jk�:"z��J�ge�/5}�9�d�\&���|yX��d��W6
���M�����c ���	�_�3������9\,ON^��W>��E��l�=�5�7����ֿmo�p$����6y�
LǗ1^�^��Q�i�WN�!O�c8����}��xy�Y~�;��;L��3Y�D��b5?�A�\���l{_C�Ceau�e���}0��	���~y
W�N�Q\9�PK��VS� ��.,_distutils_hack/override.py����-�/*���P�O�,.)-��)��HL�V��Kɏ�/K-*�LI���PK��mW�#�8ps��pkg_resources/__init__.pyԽ�vG�(��OQM���$�}�G�G-��uǖt%���(��`�D�=~�=�H�
���YY e��3��c��ȯ�����Ã��캸,�u�6��̞�~qp��<���6+�esY͊e���e6k�MQ��<��6WU
�Wz�5k���^̫u9�4�]��*�e�ȳ��U�/c��+h���l6MvU�/B��77W�5�kK����@����t:����Av{ޗk|�á7�g��X�74϶m�5mN-�U	
��n3����v	�ܰhX�EY՗0���T5�Ů`��A�a5�e[]�����_7�Y�v�n�}����%?gE=϶5>�L��&���V���,���V��QG�߫�C���ٶ�47������>��*���k���ժYohr��e��̋M1M�7�檙���\�
5��럍��j�MuS��k��f�*]c�|���b]�ʻ��p����Y������Z�!��6k�6v+��g�r	(���T�fY]�򦨖�)�t`���S,o�	l���u�r��)���E�ׯ���uߴ����Z�a�d��s�����6�ݓ�>��f�j����N��f�m���;��:�<��:�.�e��Y�OV���#��,TK���pPLQ��${����6�5�r8�p6.vx����;�nZʖ�ɍ!zzs
�gH��ugfY����7/ޝN�~����7�`���rϪ�p�ְiz��j�\��s����i��(��k\�����i�.rKco�6�]t��3��%Pע�?O��2�b6+a%��f]]l7����H�e%i�rY쐖���+ ~�M�����d��;��._�%X��M��;Q
��pT�u�#(V+X���L*E&����p�z#wMs�Z8��Ǽ�'�ZT��ǽ�.��UxS֛�|�X_sw�ɫ|RՋ&��l��8�b�˽.*8<o�5
چ�;�_��7�}��h~8��7/g�N_�ܔ���{)�Z.ᮃ������Z��b�W,܀0��@��.�MӘ��F*��ID�=ݲ��% �>vk1i7벸��g˲��+�V�@��o!�Vx]��Й�ߠ×��׽��4|{��MV
̼;�U
�xf:J"��3̥�ӊㄕ�Y(RN�Η�G�?��+�n����|�W䫠^�����^�"�xA8tm�-�q(2AFD-w6���d��5#��!]箏�����҉��18�Gx]��Pg�Û�ޢ�B���^��e5���uyY�v���9
hA���2���~<������V�"j8ʷ�96�'��G�j�ɑ�]���3�8i�����Pz��<*��t���t
��+��&ߴ
�A:�>Gg�I�� �4{>����,�u�j���_��ޱP��(��V�6���]
@�
��6d�ԑ���Y�nA�'j�B��8�3h.r$>k>|���FA����ʾNÍ:���O,.!$�X��%f8�eY�\̋�A��l�������c�D�ߡ?�ox� ׵�;� }�n�7�/1PO����
Q�c���x�"�Ǵ.�떮���&��纀�f�����l�s�|�B��k2�'떤4`���<��ECɲ?l7$
f�@��z��lvU��V
�\$o��nnq|ˑ�p\e����F����$�%��mQ�kN~�W�:C7�6�|KY]�Ō�c7 ��<�i�]W����r�z+[�b��r���P���ҹ+�]� 5w�Sr8�զ%H�	�~ ~`���i{�D�1�=^�Yϡ�r���BJ�q�����9��0�������g3�b[n<�
n^1��$�"W��zr�΋�mUzz�&f8����'-�7�>Ɇ�|��
���ѽ4�=��|4�n��u�]
?�4�s�+�[+��爆J��bK p@x�'�F�	�L��?m5�Ze�aږGxH�HF�>�5�U�
��綞��u���7:���}܅~�@c�
��h[��X�? c��v8%}qV4��i~R���0ZAc楂�����eQO�պ��/���Z7K��׹��ac�k��C~-XHK��ğ;|�B��(�v���@z*��_�+�v(�,I��qd��V3E��{��[���웢��<�|l���z����1��$�?iLB^:����gM��G�lG/��Au��H��S\*�խ�@Ԯ�WM��f��k@R�D�����xM��%cN4��������ł��}q�ι���ݚ�g���J � :�� (���euP�bls�x1_;a))�-2
��.�Q-Fӆ�t�&�u��o����B����r^ֳ�p&�F��O�<��Ë�O��}}���7�N��g>}�ﯾ}�~x~���ׯ^�w��P�Ìd�M���# �uy�㤟.��z�B����7�@-�kC�^葰?��J�~����D//��7����(�Cf���ri[��9�{��T���&X���O1x�*�	��h}*ԕ���Z���]_���K�Z�΁�g��tq[����K��຺)*:uO�ղ�3�<$��N��h���&��>�h��dE[G4/WȺԳ]��>�t�uKB*��p�kd���bԑ!�W`�i$��S������K9��#7܈.��G�S��ý8�WxҖK`��i�	���9������7��cڀ��Tt��5;8�x����F��?&�_�Pz�M/ğ�w�]�ܟ���787�r-:h���op�������|��i�X�w�u�9�b3|��M�5�<\�	�@�	��Mur�3�u���ba1�[A�
+ `QPU��<�~��2B�<�-��ȳ��C�����[��~h�G���i� <%�
���y��/�ϫ
5A�҃��ژ���,P	s�y~ߋ���e�Q���?�4��O���σ=����D��<�L�^��穡#��i��������͠�{ d��1N"�14��>k��|8�5�}/��^�M1�����p䠅SJ��b[�B�ݪ�x,xC��B��I�������!�<}?�7μ)�z�a��&�٢,�Nx�j���}Y��k��5�٪Tm��N�y�?_�A�����~�i�f�с����ÿ���,�������cѿ�������v�;���w�i�fʞ
ץ{��=Sy��D/XC��|�+X��L�7�|�,���7'�)s�x:C!��"B�9V/�"{��d��
���>��\���X:���33ITdǃ4�P}4dЯ��t��0�ΰdP�2���"�+C��j�I�4�T�,�C�,~0H��i�}6B��������e��=3������Y�^�"m�1Zھ><o
k�"-��|yb���@�O2�Ĭ�ab��z$�����X�rrv.k-��3U���i@�Ԏ �ne�B5�(�6|S�^�v��w
�� VA�qFb��-����.��z��Y�.ߖ�HR�L����`�q�Y�5�F��3iyU�����B2a1M`��q2�ZohM��ܽ)=&߆N�IC��IP�M��y�,)�/�)mf�%�uC�}H����Q�UԘx�,�zv5��Ў���us[�_?<����]�e��^`�>�� 
e�)8C|bE�]V�Z!���bu��U���%{�ւ厡	�o�
��t��p��t(�Ul���r޲�� =_2_W��]���3�n=@����^J��q�Y"��8=���)�_|�u���r�P���;�Z��?h#{m�m����9�7�H�av8�'��[�*�j[��̏?iѼ�=��F��p4~x?t�H�h��#�����hIAN�
Zh�A0:��Xq(�r	A���\����U&�����4t!	LA�v ؁u����Z�õ.���r��x�?�N��M��# Gtv"�ԁEϤ-K�vJ�;�k�ޟ�™���P�j>�F8؜�8*x� ����F�y��z[��Uh�����G[:sc$�&@.��' /�Ї:2��ǟ͊ۺ���^�-ې�XtN8��y&�͵;9q�=�ee������%��5#�k�:���P�D��cltۣ��W�p|w��)�̸��{�o�~���4(�リ�[q2����X��.J����/�]��i�(�y��r�^� /�|Ȟ�>���������\x�]��LFN����,�}YІ���	sOőn��b�}<�r%�i���O�\�3o�{u�?|��Û��|=<~�~���C/�c����oӬ��p��C�"9�w	]ɵIv"uq��R�_�γ7��� å�e���ݪf�9ɢ�N/M����?%u%����H
,���xpq�*�2�@1+@��+�=Ɛ��(A���Ɣԛ
C2�n�M�^yݎX��L�C��&c��/d�����
�cB��Խ4e�ږ�B���0pJ��V�?ttZ�^67_L��۰�cݞ
�D28��7���Z���
e����� �}_��ۮ&&�ã�E����, k8��Ɗ��*I�/�@ ��6�4gIњ[�*���V.�@���[���欦�<���w�S
�)���8�g߳�0� ����P谍��e3�����YdSz�I��S�=h��g]7DF���3*;�9�;���]A��/�Xy܎S[l����~�
�B��D��=V��@,��H?�+���ä�DkʚɎ�SJ_��F���e�ϛ�/au@��ĴY���}`�Q���]�u㸅��?�I����W���tI͂䶋eQ_�_@��Xw}]s��Ц�`I^�WՆ-�x_�8W+���v���M�I���t�� $��0?��U�w�ѐ�hn�
��<X7r�J�E��XO��,.�k�QSm�M��t_�9���kYL�G�	~��Fӣ�t�{-��E��rF!:n���v�λ˪���3t\.�;���Y�����1V>w]��]��V�
A����w\��7�\6v/M�K��PX��G�+�,��S�FM��e/�Ȁ �mL��CeGÏ(j=�
�{L`���h1d�F+*C�o�'b��Q���1b�8�3˜"'H����Хs_�������t_�J=�0揣r��Ӧ1� U2աjȻ��&"�)��!1�muS-�5���&�{��l-�"=?��$F)��A��M^φ��;�q���	���Ivv�}��`�iq/�I�Ll1�Jpڕ(�B!͏C����#�l�4�f'��p�C���#�&r��_n��h�Ζm����5F��E���ʧwnq���bw�޴ey&�N��d�;1��9�H~���¸q�l�$>N`��u�I�Ʒ�����J��y���?��V]�v.]Ex����as�%\��8���:�};߅	���e�4:�߅s�9}�])R� rQ�r�:�.G!��x�f�Q�}�������.v[4��rJ˂��έ�׏�s��z� T�1mn�,���#��qm�ys"�U,E��s*���n�焪7UK��J�vN?��4�HΎiĊ<I:���C6�•�Վ�Ȉu�?�=9絒��pQ�w�~�W�i:F�a�ө�F���Y��uo�[W`�i7��:&\zH��-�wa�Ș��f�a�p�bfr��n�^�;"0I�3�z�}8@��˅m��m8���P�ž�rVлsu���j��Y�*��T�&5+B��4��Ĭ!2Wx�kS�J7�`4�������yN��'x'%�@t��@Y��&��kon�������O_���������dM[dz����D�#��D�E�&\a��ە�m�u�E_���u���ұ�����
��G��"�,�˖��qϰ��磯���|�l�`M�E�F�A����ݔ�e�J?�T0��EXҩ�Qr��W��c���W�F'΁S��`��sjG2|�np��ɛ��5���]3U\y����}XL�j�)�Ų�|2�F�Qnx)��:��Q
T��l�1c�h>Ck�(Xe;z��F��XhYI�[S�����l	$�Za��C!�]Z�$79�-1<��;Bf
�4fS�-.F��i�u�r`.�aI'���c�[���1���רBIレt��A�
yqC)oz}�
�9)MnN�I췂J|�l�Q��.'2w�����*�Ц,G2�HT!��7 �3��>$j�kDb(�!��3&�ǺL����ۨ��4��G�;'!��ڠvt�ewnGS�
[���yz�ɗ�3	�l
�P�-�'qF�?�)U�eY��6ߙ�
ަ�[b���е����G4�bM�EF�y�l��9�����U���p �I�H|���L���A�sr�N��158nìss”X�r�9A����0��aɅ���q�́���*��yސ�:>8���N��?�	`���O����+��>T"���lۆ,���J4l/,��ڐ�2�}[��BĀ�r#]8�|j36$	��B\n�'�8��8� $l���o�%jǧ�e��Ӏ	�iHc����Jl�0��$3%j3�?��fb�Q�Qo�cS��t}�I#!"�֎��Yȿ��mׯ>Cu��X�Z���l�����·]����W�%
|F;ΐ�5rXW��MJku`0�x��\#�rCj��&(��0��Y�g�@8Ƈ�qR��Vr����_�9}b���e��QN�T~Ȇ��<� ���] �b�{O�(Pn-�)-Əœ�ٿ<�Tٺ�F��x��3
Ji�I��cx٢�2��1
K�HȘ��Z�G�7�
���:�ĩ�l@*�0+�O�v��j76)SȘb4Y(Ɉ�f��� ��9��θ�8i����\'Va;c�f9��۳�8�C� U���Z	ي��H�YQ�4.H��
D���F5�}�3�Us!�ө�"��_uKo�6$�^����8h��r��~葆�$�gO]b�h	4�-k�21�0���=X�T�QpѪ�B{�8㷅�j�\�>?P�@���i���(}��2$����@��[�ϡD{���yz@	<K���ֆJ}������I�i���M��0�C�ֳ�j���No�d��>��e֘�Iy��0�``*�o"���v].�qih狥N�@ٱ�*ų�C�g�ŋ�w��m��!�l�[�
*�Ӎ��9�
�i�'�C����ɓ������2ѴO�ф��?�#b���
﷋���ݦ��8ed�C-���I6
J!�(��N��+	Q�)I��)^�]m�4���%q}��p)sfq�&�8!�הB�OlJ�\/e����1�-C�yYQ�n���|��cr�����𼬚��QG�džl��
K�U/����f0U����B̵ù�����Nj��	�s ��5�(K��"RZq&���˅�DINJ��P2�㈦͉N�tpS�: �����0R�IB����mw��r�)�����ke?�$0�Y!�G�G������w��Ǚ�C�d�}S����b�&��D���w���ce�ԇvгѽ�
ҟ	����ۄ�"z��sv�޺*��v��o�{�:�`.�'gHY�X�H����N欠�M���Us	Y�(MT���9�^5�����fm�-�
&�P���#t�1\���w�� �L~�W�}�핋�	��F+��~��$b0H�T
)�E���av�//N9�Av�$+���L�_�3�v���d��I�����)rv �>�"�su76��7��H;�\�:�(e̛KS��Mr�Zn/�N�ԄEv~4�3&��I�Ԯ��'���Y7A��/�1�L}gF�>�P�b�S�>y�e
����BG�(7Bz���n�^����[��.��6�}������p�1hx�w'���C
�HX!W���t��`��~��ł�ԝ&����p;h�C�ջ2Z�[E�bU�G�;`N�J�5�`�c��F����(�V�s�K��u��.\�[+!jmT��V1���z�����"j�$�٭�MYp&�+Y��a>�U���8A7�He�ZY<���/0W��8�3J�$�_�\�+�\�x^�'�N�Ų@�iNF�S)B0�W�l0�1u6k�s��Xr���%Bn7A6h��9P�ܞ����"�}v��=y�
���M�8�LjBL�#�-k�Zwu��<1US`�(z]�FL
7�eN�0��:��D햒� Y��t�~b<p�jeٻm�c��Q�Ϯ�/O<�%�'č�+]��
�RM�*8�-!�O@*�Pu��\��Kxy�n4�#�-p�Tх���$��N�39��b��*.�
�Ȁ�}��Vr[��r�$\TNB���H��U�/�a�OO�M�����S��'�Wż���ab�@�Aƒ���v�k�������?㛒��f9��1\�.&؂']ï�Q��Y ��+�a>��6����ۼ�t���dr?9�J��O����A9ʍ��}�W��Ԁ�^�)ȁu�I�D>�}�!"�P�~a�=��Z؄D]�����;�Or�{�	G��
���&�Q��\e��>�m׉E��[�f'��'���E=,����R�����& ��yB?e��ٛԮF^4��.�\{��p:1�3e1�N8gh$S�0���b
�;���9��g~#�D��pմmueMN�#g�39.��Nc�"�[=�{��ĥǫ��̩{b&��7`ˎ�.9Lo��7���/�0��e�����,��N4[n�GAݞɇ�����=Vr�������{Sô�G��"P����w�R8(��޹��Pyb�V5F1ddC˦3�#��V����›�X(��iFwf�ގҚ�ѕV~���p���28��T4��҃���:�:��0c�Ű�¶�C�r�!龍P�;��>l��t�Ү.D���'���	W���ȍ@��a
�px������Ć�8��q��̆��K�Yd'��O����3�[�@�`�=��2;i�`4&�y7G�7�*�0��d�ʛ�5�8�8Et[��C��+�5OR,AA���Ǭ�D�Æ�6��U����daQ��]�m����bQTƛUJ6����M��41�qM�m\�atR�\�!�?
���~�琁!c���9���F��[vm\�4P��\,�2��+
͈}V#�8�x[bz;�PۺX�WM���P�3�$?�tXkB���Pe�lj����Y�!_QM��(b�[p�_N<n�@O;�TΙdj=��M޻�-�G���n����|�Y��֛��Y�d�Q�dS�q.�vE\	x��,z
����t�;S�5,��]�����{ř�&�<��4�L�q�eKF ���2��a���c0����ž��e���fK�/����f͇@]��~ġm��$i�l8 3W�9z�=� f���
�`��T@�9�%�A���<�	o��Qt��M��zp��D�d�=Cs�O&�Sv'y@�? ~�\>��?4�$Ϝ�߇��0�W�����BXKe��1~�0,)�vM��E�M�w8�C��b�V�	op�.��,���p��D!ݷ�ɉ�����b%�k2h�:�'H��8o��Ǻ��`��y��o.�D<� c��.TO�����Gc"a�E�����f��t�OhZ���@_+����0<4�B1V?��6\�G�	Uf�iu�mЗ(‡ĸ�Q����~�+(%�:�q2D`�N�a+��9F�]�	��A��Ԃ3��o�Q3��.��ʰ5��uբM��-md�Z
Or�I1�m�r��(R�n���.17�I�PU	d��8Z��Vf�>'`�
N����8�mо�����ݢ�Qo$���Y��VE�Fc2��2	f�z�1��G+-G���]���fr�fi_��hR"W+���㛐�::�Z*ŦY瘳3�`
W��Հҳ�\8�Ƭ{���
������~�pynx�:Ԕ�(������
bEn��L����㬱.���.�$k��V]��ƀásM_�%�yʟ����9��
=�Ws��'�V:?��S�Gtm��6�"���#��Ɩ�r0��9qmGv��W���bsCLR\�f9�C����S{����4鍗VT�0�9��g��ۓ<��A����MK�;�G�@�$�	���YJ�`�g���d���7=VQ:O��h�U�0Z�aM6onɠ�P�#yq���-y�	���SH�^q\G_Z	k����*܈��<��ș@@e��P($"8]T]1�A"u�8e�R���?n��8@�(4�2<V�&�7Ar��Z�@N-(�<�!��F��V���za���Yqpa�%��r���^�D�d_ŧ��R#n�|���X�nd����u���8�m]��I��q�����KA6�Q����L�pp5<f�I��󥍈-7�:�2�xc(�BR��)���qL:�ē�e�9�����Қ'�]K֨�:;$V/^�wu�ߝ|��
�p�]�d��j�s��FIn�n��E���V���+)�_�*�pU1�]Q��6t:�T�UǩU�>%�����㉊!�d<]�6������Ͷ�T7e\�Qj�:��Lk���䓼��Z4H����Pr�?ˤ�PT���L|h$/h��r�.�eQ^�
���������#�#�}�tѬ�˪.�Z�L�wM�P��C":�_�5�%l���u��A�"OJi(nFߕ��t�g�4GB�8X�9%Ե�cABR��%
�}Ҭ'q�<�Q�T���DR� o|��Q�'lo&�_<��<��������tB�X�K��(1�u���\�Η��+�K������p��O�5����$οv�3��#f�#�U���ƿx���!NY�8�>��p��qC��6Jp����-_�Lc���{��7������OՌ�f9z?4�ŵFg&��߫.�JtA�T���z\�:�mnVKx��n���K+څ�3�\�K��%�"tny��w�i��%�g6$�X]oߟd�~�#~�p��s%92��/r�u��*V-�Y�h+l��y�Y�)��5���9�T
��E�/%{D4��F�E����ϯ^N�|��|����b]i����5�b�N:	�y"��%U�0Jr�P�g#�q)QL:x-W�1�{�G6'XFl��X���ݓ�i�i�W߃�V8��@��p���.�M�;8��5d:��LJ�6�bv���F%H�t���$�J����?�D@lz0�����2�z�ے��(�e�ɐ�Y��zb	ʼn=7|��W+��0�w�a 3��'�4c[#0�3\�7<��� VX�3;��@�y<���ֲ�M=�C�E��[f*��/��r�]R�����|!�[v��#uH^KbV�r���eY�5DK����Q�|��v�a�o���\
bS��.eZ2���[��I�>��@���|Or�����&�~������QC�z��Š'�ײ��XY�z=��m�('�r��_��ٙ^�"Ps�sI�Ο�,��o04�������ՠݼ��sZ3�E͸@�1���G�#m��Ch�6����U����u��ܶ�ғxsl0�E���_���0��R"�([X�u�wL�[�P��g�Rm
�u/٣
*���[?nC�;�hoK�9�̎>��/h�@1/7���ح)S�f�k
#ʛZ�
&\�k�lp����y��;�t��ó�5��5e�/|9�KJ�cec����/oV6Ж#at�\Э~�ᅸ�������Q�S��X�3�Jv?�`yZ:􈺌�9�Y�w�n����M�v��W�њ�?����p�n�ˎ�m�i��,)
�C�+���)0c��5��L���D�x��Jʿ��'�Fy��g��xM��/b� i���[�$���=>�Z�-!f����(�%�����B��Cؕ1:|��矍�w�Fr��Xɼ�.VH��9��]«���OS[ʫ�#w����<%j	����M]~��_�Pq��z��rΩŒ/g4o�? �f���y�W/����ҕh.�4������k���]p�Ў�_�z�= �]c�Ҹae���5D�I�-�fV��!>i��z7
<#�l�� =�c}:$����م�W��������	��2`L�a��o�k� �T�XS-0��G(�p�4MW�ѵQ��٣�/��z�3|���
=��k��{��.$���J�{�̙�'$w��V�_����fu2;��<}w�V�fW�H�I�Ãmĵ�{:j�hb?� ��<���&�ߣa���r$N�1)�N��l�t�6[���CK4�}�`c��͚���w,������{�D�Y�ۛ��c��4�+�R3ƞ1����a*�i�>Z<u�&����|�z!r�I%ٽq��a�t*b���Zr63�ڼ\�R}0��Z�/��2ar�.�ź9�#d�:s��6f_Y	�z4�<|�l�'<�B�J$�w9�3/����S/���b���[�F�|
�[.j9��=3�)���ܐ2�~�lj�'	��tn2�h�c�'��yD@$�t
T^J!?���~�"������3.�;눲�\���Ѡ'�����\D�[;'OS^͚��S̭+h6���.�5/`���T݀ t)�0�8��L���'�u�<�n��+!�����f��r�ي�g�-KM�u]���a.ɗ-�66�����x���61M��d�px�zq$�� ��m�� G�}�#��Iv�$�Yݖ���0��T)���B/rNx�F\�4�N^�����d��u�ǧ���a�h�eEr�Cxҁ]�V�k��(DY�v	����L���u&���*���}�&���6toHc�f
/��A00�`��X‚R��p���0��~�������ǃ�:�������?=����%?�t0����4?uc�#T��TՏ�@�f,��{Y��o�n��6jcB�Zc����%
�n�5pU�\��cpq3.�J�x8�p��A�g���x��ҙd��/A	2�'��g&V(k�4q�%oc�s�{#�1��d ��#�ϫ�i�ջ� 9W���A!�dӐ�[�?.�Y�b�w�W� ^o|
����E,8,8�	�*ƣ	G�Ѥ����9F@�36!�>}�}��w�d_j�6;��\_.��g����&#�g����.��V+s�����+��M������Ar�Z��jX�[��߷d�����i��,jj��(iE�nL��!�.I���?�w W�/N��,���m��g��a"��"�v�o���C�$^>�&�6��q�y�SPB�(�`���ć �siz��<��F�cm���GJ�
�����n��>��m04��(//'1��o������˺�>_�]��Qo���XO��	V�Hor��:,�8<?l0�B�h��ҝ�ǃX����1#����6��o�U��a�)����������{�|��û�2��׹��M_��/�:у`5T��Y�~ǟ�Y(�4<		�$�ك&㟱c&����T
n��õ!�3D֣������1�Z�[>/g���fq��A�F�m]�����ߦf�����.TE~
��P�4�Z�7�fR��
�n�3�Ҥ�p�M�Ew�[���	�OS���ӓl����g����~�-�U��r�
Q\Qr�'�"�{1��L�<@��%�Y�up�{t�dl�{�rwۀ�:���~}���}�O4�{D�IMzәx��)�ש�ևD��
˨���	�_��A��}-IkBBJ�#�23GQ�Ȅ��-����g��e�u�P�m�r@Ӯ�1aGs䌢�OH�8ɺGIf奘�?�Ȗ��{��o������з�2
����3�*�����4��'?lmIu�R�i��yQ%*�����"}�Ge_gl�Bc"�MR�q<�1���l0�Hn9"�����҉"F餔�2N�9�Fs���/���l1���=o���i�;�AC��By��ZXߢy.Kٳ�叏��f�B��r�8¢�_�
�D��Wֶ6E%E���՟];�0��Èb_�cZhD.Z�/:�)�E���b�"�Gߩ!��m���o�Ax8�^W�~��Yπ�x�yu�5��-�;��$�ff��W�ͪ}��a�[m�f��\���vU���b�y������js�<��T�c��ݔ�4��W_��
%����X���7�W�����%v�-��Ĩ�5&��ꅾ��_M��X��*j��<b� L���ÏD�D�kө������`�ʱb/���C�|�U��X�i�UAiFX"Q]^m���b�R�5�0փ~H/ڻ5�~�^:�i(�}��'��-� L��l��	��j�A�l�Y�쇃J���`�}���ò��Y���Tnҝ���˦>���F�X�P��詆��:�g�w�(�c^H�?`(Z �Z�O��/W#[@?�) �h<�F�&na�A7��d��1&3��؍����!†�����Kt�����<��n�wf�]xS+s�/�+(QII�m����֗��k���G=��y�qڝa]-�E��)�9�E�'\�Bz��x
�~~Jc���,�A���-F��e	�|�۱��,�>�ÚU��#��`�L�z���I���4��'�|��rc��w�ܡ*ۑ7rh�8`��6� ���hs�
�������8�KHN�5�c��ߜ�S���A�{��o�^���Pւj��K��0��������}��l���4M���1z�|U�q�f9toh14x�_!�,t��z]z�]`���Sۣ�6���w]n�
l�
�da�����^ef�.�Y�H��xzOo��N�&`T>��(�J1*w��oTl��^�G�����2Z"�9y��BD4%�+��d
g�R��xZ��?����?�$^[7�CTE������Рd[D)Q�Ƽ����_/Q�D悽�s�[���um��V�:S���\_�ux��`��
-f�"�G��b���!�W�6gK[5D(5��d��4�?��MOP)ȿ�;��݁и<D.�<�Q�u5���kY]Ln
̺U�.k���S�%Rw�>�f�=:
�_C����}ɶT��Dy�
QЃ��px������-���w_Q�eqs1/2�O,߽_��<VߗC�`����K�A������j�MQW\�T���W+<`� ��VK-�V,���rH��G��l�mk��jY�U�݋j�9R��I���w��g�!*��`t��)�@j��u��Bͩ��@D�(X���&�sL����5f��ڭ�=VY��D-%�8���aU���?G��0�pR�����K=� JO��;�DL;
�yL-9a���,�9��6�X�}"i�:�"[�)o���~�kmH{]^��m�?c�ȗ�R<t��j8�͐���q�ɪ�e���
zq#I�"F��,�S.5�o%��D<���1���՜^p�a'�A�đ��)�c��u��3$`��(�Q�5�6t-�����=�/c�[��G�Z2���rAnR����y^�=�Gr��V&�p�P�$�tt��^��2����� ����tN�ĸ9-�S��Cq �pD(�0V`61�y�����g��^ّ�v����$��t"D����ܶ��G���B�,�j���$93��;���g��i!��9[*����5,�x˛6_~�:�.%�m�������o�X~�)S��15���h�dC)g�MO(Ū�Ъ-���xц��۬U?u���r;�IQ�~��a%��O�Ec�?v/\��f�pc+�b�FaO�.�Tʒ�k%B��'c����O;E��ƈc�\�!:���]A�#�<z����fv�Ҍ�m�mɩ�1[�3���p��4��}FKG�O�dC��
��n��ϝ<$���U���s�0DM��<&ݾ�s�L*��s 7ܽ�TQ(��#'-\x4Mlk5,<r���`��fkw7���yr�?7qpԇ�*����l���%�[|y�/�{�t�A��3ͭo<��n�ԉ�7���A�,�{cL���9���/ߜ>����.�bƛ��e�!>�l�ײ�ё����œ�ٿ<zpi�]b<�q�a�jA�3�H�+:��IJn�L�P����#��A|n
��bgp�Xt7��w��zmQAa�@���j~��Ż���o_�~��]�j�xŔrpؠ��-�}[/����e5�4r�\[�\a`b�ґ�g��)�Jeo�(+X���]�&�i��Յ�H��Ѝ#ɑD���p���oPT��\��s�����9슱�'1��{����6��CHҰ�~�*��W�G["@<�q64H���>��$���I�vɪތ�w�+��$�n��	�Z�e�A�u�r�ϑ���(gH�4�3�T
�*g�X-�y_��
#�i1�|�]�?Ӱ\�y��4}>��wɷ(�z����L:�2�r���Is�>�@ZN�^Aa�NjuU�s`�d�Q�ޗ�,M �V�0I�����dU'o|	R�g�^6�2})����׌B�[&:[nhi�(t�B�ɨ{���b��

5:�/j{�w��qS�G�G|�X���r����AU�[�c��Ya������e�PN��P�X�$:�ϒD�ؚ�2����^m8�I�,�����S7���d��[�p�ǓS��y7DbD"邐���D�$�yd-1�����1�;�ފ�O�r$�<,���p�r��Ù7O�SR�QЏz1�S�����j�ړL�,�6�ޫ(���b��g��\k�1�^����p�Ɖ�|Oo����%��輋 n�)���a��#�7^w��>�nJ���Nmx�zߴ�c
�(V�tF�rh
�M��D�/S]RIk�O�&������8�,A�׾��X���yLU��ɩ�s�
�F��vR4�}�d30�z�>Ϯ�RǤo�6�y��zL���C�A���[�-|b�4�s�y��p�<T0�#��L�뒬�d���&�n��8B��1�=FU�$^��I�)1��x�9�P/�I*�Qjc��X���rБ�1y� �7�pw��I8A|���F�x1��G��Qy�)����;�O��;*�p�2U�
�L<R�����JY���;�0�13��ɡX�SL��������.PPS<Է�i�����S(v�\�	�A�������KN����''�r��s�e�5��K��J��?�.T^�_pO:��e'i��"x�����9
y�$�#2�z���i�z��Q�l�e�@;�yh�yc���贀�'l����&��m�(EK��*�q�}�@�΀��b�;н?:{t���m�+ꓺ�ewO\o�O�)1��m��~�<^�h5�P&W�=�ܫ����(%��+�5���qv�~����&f-X���0;]�W ��Λ>��wv3�\�'a�o��`�j�gtˢH4����M�İ��_�t���.Պ��$�`�*&V7��x�ܾp��^t��� �K?�:T�Q�YPo|�u]A�<��guew�!?r� q�%޶N#�?p�h6eLj�^29�j)u���-��$�EFPJ2��z_(Zd�"�t$������ÉI��͘���G�J�k2��17����O%�����K�,R��J���4�J�s0r��C��3W#4��g�B�(�h%��(H�=b�Л1٪�l��Th���|���:S�[5r���W��
Z3h`@V�6���!(�@�X����gdg��1)�z߈W���:���_�(���K-α�qf�mC�;Ko4n����1�o��V�u�iE�n$�c�N��Myo�;�Ӝ��s�S�%+���Z`auh��	�7b�諹(�m�E�w��6��q<˞��lH�u���*�\<k�-{�U���"Iu{AG����
a�A(�ؐ��@��Ċ�L"ZBf����h9v$�Ԥ�>�^Fc�/�f���k玶��Pmʣ�D�IK�5q���R�����#�D�k�矄`���-o
�Ԟ�Xa�!?=��x+b$���$D�g6ջF�Y�.r�b�YT�ahg���)y
E4�O�L�S2�ͫ��elF�B����Z)���g���\`ZD�cm]��EA���H��~��s���Y��g�w.��� �p@��q�u	��;�_<��'?�$�d��׍��c�p���S�}���
_kv-��{ǡ���^����I��lA�5�Q3E���+���6��1&�9�w�;��n_L�Y��a$�����'	]Q]��C9M���Ĭ/��<Al@#��Ľ��;�5
�t�s����,�˄��2s˼�%���V$u�9�m>�Hs��D��=f���I�(�'	o�����I��;�ptK���"d�'�0�
�3L�H���8��
)�ȃ��ر����T�@FIN��o
Ԯ�(XR^��;n��L9v�sL�~!gM��rE��Y\�ͬ	���x0�K^:e2���`��F?9��!=TL'3:茻ţ(:�����<Y���5w��e��v�P�=c�p����.�4�-��u3�E'\��Z"�U�d�3�+�=�����5�)�=Ju^��$�m�069��E+�Y�G;b̠l�pS�
ϝ�	�'��7x�=��ף+T�Wȇ%�x =�BX(,ߗ���z!%w�D_6�+�Ƒ󧩔���t9V�[��	��&d�uM����Jѳ'0A���0E�o�Z�JL����(0�타�p~O7�3Iu�˵�<V�bY�1	P���cO��pn|&��kW��Zۿy�\	����_�M%H?�^\�xIl��_턌�c	�0Uh���+�寫rn�D׶��h�!}�O_�z���2��קϞ��u�^�:}�.�o�#�(e�9}v%�@l�+�bF( �1V&ޥ�:Ů{R��ˬ��Vᜢ�=f�0((��L�=�a{�5�)�z\��ȭ�C�;���ʓ�ߝ~�����Ǝn�N��H��lqK�1fA�� 5d�M��f�
���+��E���'�OW���b�3�\����Cʛ��J��*p����c��ఐ�����[�Xt��.q�}H��:�E��ԥo�æ&��x�&k�'���c��z�-9կ���o�+P�Rn��tJ��%@[�/nV/B��E��J���0���G�7pz���#x/�ouz�3��t��C������$i����5�)SM�jd`��W�?c�I*4�,+��X�ָN�wQD8V�FƵ��l���m
�.
��y�-\��n�t�IAOl��jga�"�Fe��rM�}(�U�d��B"�<�[ű��v���=Y>TS���f��7�,�F���_
��?n��Œ�R�_`�2�"�� |�wmZ�r����4$t�3�5euڨZ��NȀ�,�F=�O�)�-���%�\�c��z%��U�9K�=-[���u����V���`N`�L���ǜ�]SZB1�Ndc�r�F]~�c��t�`#��[F�ϕ�ptE���{'�o�L��c��vt�;���O�k��N�zXO{^�=S�&��S���
�ﲞ'��/m��T*�;@S@�DgD�6���C��NR��m�#O���8�~e-ETԛ��ax֢Şv8�jG���q��@�=;V��y�m��,�C���'��`��8�d��h�����1�9F 習��6a]RVl��)����%D��YW�($��Y��`�"�����%8�
����Uh�	o֬�^��ڤt��^C�;�'<R�����X4����$q"�\!�7kA�v��u�&g
{��g��"}��t���	�4����B�L������pP������BU���ˮm�WR&�b��ZV�t+�)l��I�����pG���X>�u����a@{�
հpL�Y��.wQ����օ7�������|�zvj�swYT�:��5&e�(&���bUbJ��t�X "&8�w��..E��L�s��ޱ/Ȱ��=�
�J��8��Z	�%uD���b��$ �Tj��׈����Q6&|-�2�fت���!Q_�9Z&a�&�$�d<�����9�s��حH���4
���7�(��uvkPF��tZ*xLU�-��!����
<AP\�(��
c:��0��p�7R�W��G���֌|�Vꚽ��m�l��n���~��?�~d�����&Gc�w�A�pc�k�}�a��ݢ
�{�w��i��*�����m��v�Xk��D5-�,�Z��f�.w�r��	m�
I~�N~�)�Pq+���g3Y�;u�1XB��g�'�w��
�x�>~Sq����۝g��
��٪�c]6]�x�s�J��T;�w;`Y�+�@u}���=�Ig��ơ9W����:`h�P����g�W�Q�������R�G�g�j9�Dm�@�����zt��>����@�*Mf�Fl�R3����W`p��ط*���m�$�KG���_��|b|������
�
��k�9L���f��j�N=��X��H��?�]�V������	��e1Z��˛�	�pּ��gMͅiA
{��틿d�=z�;4�g��N��y6�|���Vd��@xߩ6Ͼm�йΥ�����(��
�6�ȑxY�T\>8Ϟ"�ē�m���ߒ�q�n.
�x�(7����ˊ���+�� @Gm��*L���'k��Zf�l���NC�����HE^��	�4&{ҡ;�����'��KF�m�\93�.�(EsED��~J��^܎{�t��k a�z^n�~[S�v� b��U���漆ɕ�0�F=���Hڷkd��z��*��#1y+�:},L>`�@3sϾ5����.��]��<�&���Q4�~5 �6��{��x��3�T�R8��
��]�V�'�͓ާ�	q���qN���/ u`��e�CI������6���Se[g
 -<�e���(
xIC��dTڈ�}(cl�vH�\���&��Ҙ���Mp@4f7�(��'X�v���o^=���S"V�M\�p����?z�O������N^>�&j�'C}����;���>>�td��1>�����v���6�-��_�F.��?���``c9��w�o����i����ş^�zs��������EH���5`�ơ�+��K��#��(�T�B��Md�dVg_����R{2�9���&s+�	2!��

��*��ZTb��w�QD��B*Gl�(�ͷ�M	
 �X����Bh��	��H�-�D����:�!(�c{�Yk�<Ɲ�����x㳏e��`=_G}�.�A
Fv�I{>�1
�N<e�T�T�z��=��s�'�ν��M��#dx�>g�5֝y�����b�;^Mಃ�1�Q�[L��)��H,��Zb�/��#�vi���6tS�=NI�Q�3��X�<VU>���Rv�: ��P.wq�-�����T��]��|
���-R��<4,O��>uІ�m��)B�psye()yE�p?Y��v	��r���uQ�M�Oޘ��z�K0�OX�y��=��{��P�̶�i���w��26��E�_��a���,�3����F�l�0��˻�'��ߟ�����%�	nɟ��ܥ�m}]7��)�2��h��ȕ?+G�C^� �Ÿʍ8�лĬ��lw�l�xj*J��C5����qby�}�A�T�	��)�8�0;�%+��
�B�&�&i�PT��0T�tˊl�-�"��^����ҹ���չ�g��Z��$
S>lsT��.����j��څ
9
K.҅!����r���H��k@���h��w�A�s\C�n�۞W��c�Gmp �
��`�C�``�:f/����I�-ǯ�~�́��<���]m3�}O���?�S�����$K���H�z�,�Xa=%�I+0���2AEܘ��?T��Y��7���f��s��x%)�	}ͅ2>��q���.˞~v�_}�3��W����՜�ڱ���	��48��)�Ӟ��S@�9Mݱn̒�W�曇���QA0���f�R�!�W�%F���F� �B�	��ݤ��"����oJuw�= \'NeB����[̎6�&P9Yz�_�F������Q�\������uG_x�Un-�QtoѴ`��79|u�0y��&�Ɠ?�,���D�K�?�V�x�z��d�u��}�'K�Y��@�Q�7ܨ�T����VY�_��^�AN��n�t��g�r�
�(V�f��bY��<�}�d;�� pU�ە9t�*#8�>�'��4iw�I��{�"���;H1�FUOg��h��G��6ъJ�%}����N�iM�nL.�5S���;lQ�;��P	I��L�+-'	F�)~�P����mn��Q^�
�-�6��틳�IԴ�w��.��~nρ��������8ՠQ���(ԃ#�X����,E�rc!M�@��MK��ճ�;ɋ��c>&+����5���fqպ1�h����u�4�V�(�>��eJ�F��r�+dC�p��ʡ{B�=<u	�1N=:�&���Ŭ���/k�w�O߯���mF���Ӡ�h�
�8F&�5�I����iB�qlʄ��#��]jO�\�:
���O��6v1�'��:���|�f�J[$�61Z����N�P�?�,\e���`�"F��[Sx$�k]':j�m#���,���D��1�-@�@��B���x�8�}	��.��ă�{.�0��./�6�4.�������f/�.�߬��teD�ك���'��66(� o+c}�p��n�љ�r~�i�0{�����P˄�G�a�>]���k�O�@0��-3�dӃV~�mܤ9��	�i�\��O��D�`�q�����5ݡ�M��+���h�*ګ�ͪ��.9��8N4p'1���%~u˜��i	ҰA��bH� �G���U��áV��^]z�
��=�����_��~ �����
�=�>nP_�T�c/(�i
�N-��҄H�d҉�{Ἳ��\X�S���j4f�a��ԔN�L��suT}�h�׻+�$���1T;�x�Os��6��3c�;��-0;ˇ�K����B˝ĭ�Y6��2s*�nd2+v4d�$�C9=h�Q�a��K���B�p�?���`T2wV�p/�%���>A��O�g�!5K�5��U������g@+��6�uіAG�㞒���S�/��b�����9W���kz黈Y��Q&�8�� w~�1G�W\Jr-�sSή�jF�\d2}Z\�RV�P��oy���֍�F5���ܑ��a�.��B*U��z��b�6�rUl�86A��֥HCe�O"�V��p���ِ�5��\��;��m���,��%�ΤX������§YU�ӒIX��i�Y֖CU�q�J�x�8oA��x�o�V���O�h��
�?�(b��A1f�Nw<��k���nR�ʳ�6[�g�����0�Њ"��L�ma������m��%�
>p��,�|�=��p	��l��>s��zS]�is��䖺�,l����`G*
�J�?�Ȼf66&4������z2���t/����w,��7��Ȑ���<m���\�V�i��Tʘ���$+�WS�
�n] 6P�%��o0M ��;U�dW%E�=�y��s���	��.�.C�b��N�8p�:�>fw����דy�"�O��N�J�N@g4k��!g�Q��3$�>�8$N��?2���D�������V��	���\]����n����!��M�zk��"gƅZ�(eFJ� U������O�~_����"o��5%������'��`ܻd�CqZ7F�w�U���,ʢEdeL/�0ܑ_8��=%�����P�(�:�yh
)�at�,�e;q��\���؈#���O�,򕙕���r�{�wh�NBAΫ�ó+G�6�2t?]�}
��ʙ�Ð;�q�vpz~c��Dtb~ӵv��i�.
Z�����v]Uel����Y�$]ʺt�0�vw��t[rū�w���ᯅ(���",�E��A\��0k*�>�狖��S8�a	���c8C*-3��L8&&#ZC�g����^�7�5p`J߳���1�n�v;�j�(J@���yt�~t����}-Wq-�|B��PO,����5oB�칫Suϻ�]��YJ��*6ʚ�ӔC,��1f�@�����u���r�sa	u@�C7�t�ܩ�pr(!m���=ǐ�
��+߅T�.��9/�OĘ��e����[����0�N��#�8�	�+RP!9?rA�S�;ɍ�|��y	���|��9�0�z���T-����u$�T��uK���9^0�A@��	���T{&����Y���"#B��HbW�(H���l1Q�:��\�d
�,_'j7E.�s�+{�e:����x�I��=:\�w��B!E���l����K_{3ذA"������Q<iO�DV�k[�
���ٕ:��޺`��Pse��ן"vC��]���O)��[�$ ������C���\utw�&Ԟ�څ-KE��2v�8F7��q|Z|���q_��v�ؒ�ex�?iG��A�����E�p�� �Ε��ť���ԋa0�#x��=�K��lv��l�|��x~�5.�
'I��F�5EoR�~	�y�ʮ
'��֨I��)�~��XV3z��Y��NᴈTa�dif�B!�br:l��i�,�4��赦�����_��"��+�����k�Cn���p��3
-E�Hq�X�9n�fXҀ�|��~oom�Kً�� �Ѹ��<s��\hT6wmk�~2]dө�u�S�L�15&�A��~_��99a��[le���D�ON�Oh��}���X���v]h�k�-<��]iB�yB0Ļ�+��ҩN�H�D���I['���B�`��0dbh��{V��*vCe��!Hmtި8-e��+��+JOi�U#!+�p5dW�~H/dy��|�(o�M�
f���㕐I�8��,;�+���6�񲇒Y�Ӵ���id�0Qq�Qj����&(@�暝��ќ6l:�O�v��V6�v)�I��(�㋿|s�$Y��N��MӐ�fY~Ȇ�?�9z��%�
��L�����x�=��G���EN	}ܠ�Ɗ��y��:�%"����B�D8�&:�w��g�p&����i�
`6�R.	��b�B�`���w# yᲿ��q������Ni(��L�+e=�D�yju0���K�DK�
I�{i*�HwU]��d���u�ٱ���z��w_�{�yρ�;.-r�f)�C��K�ѭ��/�ps�B����ɹ�[�D�M2>Ń�V�5��F\��g�A�Z�FW\�%�>j�D�$���>v���z{S�xXG�@e�\i�f���Ӓ�όe?]&F?Z"�j�c�R���s��o1��
��@Ub�mT��g�M�B���}�]Hѽ�;�#��K�/�I�Hh@P�%���T�ۗ_��}�"L.��%=D�v~�8̀���khV�sw�b�Qr�zr�ޛ�J	�Z!���ή��m�ԋe�I��4b��;�ۦ���V!vq�^���	;�G�I�'����W�K+��Ю`��Ƹ-���Zo��f_f�QGg�4'�A�%��]�4����`B]�`:0Uo�ӧ�O�r�g^.q��9s8�W� ]��.-�8��<�س�=:+r�;�ޯ*�#Y𕐪�|_���8b!�c�Ͳ'ý�]�+J62ېX#H�"{��&�n�(�W�V
/ �jIMu�iVʏ���"�%�Q�f!t�b����j焒8����pT�@ð�O�WCJ���Ԅ&���xN9�)�ᤣ7��-jv���AR[0+�,j�8��{/T�nK����k�5�O���p�7R������
��S�d��&�r#a\m��5�q�w��2u_�1�=�E�>b.��5:${N���j���-%�&����:��!.R�QN��.���n/�M�ْ['�P�E+�K����zNyl�j�T�7�R
�1�'�x�fP
Uzh�C�P��Dpj�P���6P�3G
�>�(q�Ғ���w��>�l^���u�P���]	����uy��^4V����Q2aeb���k�)m%��İ-0�h�F�#ifV�v�?�B�bV̴f�����
�߇U�[ʵ
����bN�S�+@L�3�A�a�b7�k�=�?����O?���)��:?��y<�%N!�!L.�x�\��$����&����u�ke������}q������nJĤ*ӥ$�	W��]���%�P'tO�"릿�5/7�v��o�:.A��}�X�{�Xj��`Ǚ��
K�[Fq�6<���wO�?}��)��:�_q������9�q�0�P
�������k$�NM�N�0�H�� ^���
<�q�)gM9Ǝ;�>��G�O�)�%+r�9�c��;�Hf�⊆߷�=�y���fg��|b�J�A7)gYΗ��2;Iäo�}9�q�3��������V>��/���Y��w��#�,*[�Z�\?�Gc������@LA�1��i�������82&&�Rl�{�y譋����[�&��$,�+�oȷ\�^�?qb��&�?'�\��{�C�0	��@��^�hҍF�!���`Q��|�ʿf��=&���ҷ)[v5�A{��V������ƻ2ʎ��4���A'�Q�ZrF�'a��մ���!m�n?I^7ミ%SF�}�|���$���ؚ�1����T!�#���w�n8"`A�	��P?�{K3GiѼJ�k+9fZ�̔k��nQ�X�&�+�:ҰG�b"�Ŏ/C�}�S�#��*�a ���(���AjM�z�8۩�DZ���c������,�բRG�M�$&�]�M�L��"��d��q]b��OyB��E�e3��6�\��%�����XJ���,8���a��GH�D:��� ��k�r�e��*�4�rv|��h]����`8�+�o�|ĺ
������>{ByL{���(��F\v�޲�gsf�aN���������~����!օ�:��<��'�@�7?�$.&��~��n����K��HO��ݠ&�q�yB�;x����d�2��)x&�s��Qh�*���a��.�}%4�7&|p"��W��W�gO��:{��o�o_>���oN_�;}���WϿ$*�u���*�eZy�(Qb,�m����K��|O���7;�k�n�z�p�u�`o�5�E��
���`r�j�z�W���4�胣7���r}��GG�.�m3���D���r[��Sl��įnh�3�
�AD難�D9��0a�D0L͂�Yd'Q�gQ�=��	>���	"��j�(�f�fD�8���ePS��&8�q��8m�C��ߜ8裃�]A�m��~�9ʞb.P��I	)T��;
{��d��4:�5�| s�0�Hb?�Øٍi�%��榮�Y����7NH������V�]'5{�s]|YW3)�����u�%��d��L��8viB�,��R���M�!����%'>�ѤeF$��f�P���4�1id2��_��H�;�*�NJ�����k�X�����MXw���%������.[�BNZ�Ŕ�S}�ygQ�c��Wp�i����&�ђ�Fȃ1���4���}Z?���
��R��6�2w*�[N��@T3����>4�]-9������_�L�'>����%<h��t�`&͵#ޡ�
�;F�N�E��[���y�'f:2X����N'o�}����z!����⨯�!Sg�ⲵDw�~��f��LX�*�J�>_L��]zI*�u�̹�]mگ�9�e��_t"�n�)�kB+F��O�j��jb��P^�A7��`:v�b�t*m@$����,��e�O�f��`xx&��KjO\֒AJo
R��h�`9Dfj�8@$����ѣ<����w��/^�5֋>��G�xԔ�}7�D�xt9Ai!��R�	�АX�2��������mC>�d3c�=<��t���4�aQ�:�>�Y���~�$>~r�8-&���=�ҟ�آ��!���N/];���Iu�v��G\��щ���śk,��Jh����\Q3�ſRJ)|�Y�
�!��(�U#	5q�hy�w�Pq��x��B�Gl��"����.@HMu)�)eo�,��)]��k�.�j@�f�]�Іv�=�?���!470���jhVl9�vG�j�r�zXm����&c�]�J_��@[�K`��,$	�j��]�}��e���Ee~�Tj��Cv��C��K��'�R�ex�<b��oź�5�+�=�?����5�����p�Wg����Ax�Ϳ8R�����J��'N9�7�[�
�x�=ӅF3oq�4{^.���yq�h�?*���}91}Ӷ'������y6�H��9e����Y�՛��7�{P�0i,.����z��*�:i�H�
�ݱX0d�jJT#����򔒪[�<��=p�Q�Sz���6�~{���5*�>{p\�ł��f/F���f��ή�T�#)� �7��%�0=�#rV����n�JU�2: ��
���`S��Ͷ���p�s��i�@��޷j����$�a~��u���@�'r��8�NP�Y�_r��(e��v$QIQ��a�ey��$Ӄ�plm5m܋���T�EA�|����=�R��o��!6N@�t���ή�rb!2<#��z�f�e�Qg'�}��{>n���ԓS>�@Rn|U��.ZK%9��5x_�Ӡ�@s�>sP��X�Eu�J5��NV~�:�Q�S��h���2i�eAޒ�)��ߡ��{v�/f�Hi��#�¢&�W�2���iX
��	�aV�[<���β=L3s�?hDV�Y��Y����0�C՗��\�7�r�pɮ�l-���zyA0��b��qky��`yO��/�I�C�ZL)5,+��Y�!ä����)�R���n�Q��ܝ���J���T��PK��mW!pkg_resources/_vendor/__init__.pyPK��mW�޽Ag` pkg_resources/_vendor/appdirs.py�\�v۶��_O���G��L%M��k;�O�9Mz��� �1Eh	Ҳ�g�{�7��ugIP�,'��f�?����a@r�m�o0_�h���d��ީ��C1��p����d;[[�7v���؁�W��x	gm1H�^��I�c�w�q�?c�<���Sĵ��8o� ��K61���� �7����%��6�� �Y?��[��9g�FI2����(�o�ل������d^�g���Ź��#~�NE����`��G�LDl:ⰐD0��Z��%��ʘ�]����w��� b��^&�''��~�߿�G�������Gk�ۯ.^�n?}�������
��wKq��������b�c��4�O�<JHH�0�~�PD>�$�n�x�n�d�ǛA����(�4��������6Z��f�	�ɋ��Ĝ���L���p��IB%uX?6B�L�Z�{�c	,u�h �]���-���v��F�_w��gD��7i�$n���f�V�c2�3i.�����p�-������]5`�e��bi�as��Ԅ�&�7��š�DN����ޕWo�az6ӏ�	ٍ�1�ʆ�����Pc��E�(BL%�֘����N+��~�܈�?I:D�M�hw�N
<\0X�&o�h1=�4�4%�a��(�F��it�Ƌ`
?���t�X�'	�k2
$z������H$,�s/l�^
:��3K��
�0tx>�-��Gܿ�}2Nt�d�Y�Ā�Ǣ����k0�D��պʞA7P9�(������h�5��H	l�N
���]]0�x"�~�TD��Q�K����om��W,<l�̤�+� �'i�A�l�%#�!�g*�=�>0%	�D]�����ɐ��Ь��w2`���)��h�l [ϐTL\�kͤ��i8�c��n�Y�kk��B?@%���-��ʕ�����D,RAb&SJ'^4��a��(�z��"�rrٯ"ec�&7�d�(�
�y=�� )�^+���ELL�=/4JW��!����h�bN�S�A�r�)Ύ���Ϡ��!���<�"%�gL�
(�q��ӈa@&��p��Qc-��"3i�I#���,���30b�߱���Oz����x&�0gAx��pzB�܋ZLgL%�&�A�0��	��S�˃���qV�)�vQ��
�@��K4+�-���UR�x2�%ΞNh��?�A%4��\s���l��Y���#B1�v�X�I�?�9K���f�b/�m�������ƻ����$d�ܢF���O%� XC eʥ��u
\1!�����ч����W����)Y[a��gp����6
��47�˦���@l[�pD�?�t�.�/�^��
�HByP$N�<�U����:G)̧���<�ţa>�Wp�� ��w�b�*��V��.6o������e�EK.��(Ҍ+ҭX�B�oT������u�M9Xe�)9n�8QJ7���bDfYhpY�F�����(��3�𒓛v0($�aL~{�Ҿ	cY�!7��Y���8�퓣W݃�s\���o�:;<�2"�����!������vAh}�4�_�u��f��$���v���	z�U���$Mk4�=��!�\)t�-	�:�,Z_��<��o��<����Q��ު�d��
�[��|8����W ��*2
�Qo
he��/�
��[BZ�L��>�o�f�0'���H�f�%mFG�?�u�yp�X�
`:�^jl�G29����gf���,����m�?b1fYT;:y�f%�2-4�f*���\o��Q�,�$��6��s$��s1�4j-�/?Eh1�;�X�@�-��/�RO��x��z���b���M�Q�K�ho��`"��6-��h�6�jv��4���Lc�
٩
��[Fwʗq��?��P�X�3�P5���ӓӟ�ؑ ��"Bdi�D�hI(싞/�8��hv�oU��!�����g���ޖ�����h�a�
h1�a:RP��H�,��"H	�B�Y
�֟�^�Z���P
p����ǂ��H
���C����qƤm0A�I��
4u� ���s���A��K�g�`I%�v	m.XB.��L�K|c���"��j�HF�����=�t5e{��p�-�;��TP��� �sIYM���0�������G��r�����*�ӵU��jB�~l��N_������^A���/�o����Y^���&0�Ac�s&s>Υ��K0Z�d�ZXaQ��aj5�B�&�R�C~H�Jx�]
�s���tX[���?,��L��&���u��iR�U���vͱ��&��ه�c��$�@�W^�(�*��e�yt9�w[�Z�&U\u^����*v�W�j��]y<SHGUy�:1�ޔW��T���S
T�&�
��P���!�j+���������+8�Rz@J�RҾ�,�
Ŝ�Q�Jv�V1��u�/�3�\v�ĺ�bֲF��=[��}�q��AJ��q%o8��-"�+�F!��Z7��}�#Wb��|��V�bM�G��39)��L�C.�-X!ަw�—ʙ��AHZ

�ΰ���G�>ٵ*�4yҩ6�HDz�O�,�i`��M��Z�'���I����`�2�"8Ic:HV�1W/V����:q1��QpJl��^�_{�	�jaT�n�-C��7��p�y���t��1��	��K���v��R�ONO�N�txL#����M���Z��Me�h7��� ����M�#���0�~~�8�,p�uqR���6&�1�Ã×�K*wu�����#��|���G��G����<?�"ʍ8{����dz+�~�pN־8�8^���'c��#��x@S!a�$d	R���ۧVz�X��/G�T�:�R�Y�5(�����W���2���[P��|e7>��+�+�����/﷬>d�,�md�;+*�C�ZM��ނ7r��@c��-�u~�J�I��mjO��+O�8�ʊT����^i���{Y
�s�U)"x�E)"E��ՊR
���;�cM8����Z���N7Ź�rhNq�a�	=Xa+P�D��,�z�eו|u
Z�r�hF�`�in�K=H���֎\K�(�z�U���+H�s��L<�/�.*�,)ːR�@���{c��w�N~�I�>�eC�>��iFt(�+<�b�`e�C��P��1����ۅ�&�nC�p���U0Y�VP������q�C�r��4�����N_��f瘽�k7��9�*��nax��2	ن����z���f&h/i�[��/.2/c��\į�DA5��}��\����\~H~��K���ﻓ�\W��3H;�˄mu�RYW�����ڻ�9��1g��KX+v�2��U[ۀ?�p�dJ!2I��.�t�ṅ�I�5|�C��T�@��G�<����X�?������_��9�4��'�t�R�[�a�Ű����!_Ĉ!1ʩ�Q0Sm�� cre�ʾ���J�U�s�@w4�tW�x�������s4�vZ�>�����!-a���!�Axm����z��@�|L�U�g�N�����?��=|�����E�m��M�@��u^�RgGc��a
*��_��u��'��y�i�����TzP�����[^��S�~A<}|��[�P
�+mqsw2#:o��'��b��F����hHW�U|���?�D-��C�Z��$͆&l1豥�^c`װ{����e��#�㾇��,���R��O����ꏖ�=B��X�֭�W�-M����Ƴ<�e�a
���KZk�HL�a���G�;dMl�]q6
��^�0�ť'Hֲzy/Jף0R�r9P�v����߃�����>}��+F��"�.��C�|\$p=w�,�>~W�9�y�x��L�s�z1�.���e�d�
ɢ��7	�ڕ�M��o��Q��
W�(���FvBt��X��b�V�V���;뵚S��rާ�
U�2��|gI|������P������K��b�A��𵥃�
�����y�d��a<��zw���j+SX�)�o���=_�9_�5�=&���z^d����%��,��ngu-hZ�2.�p�F�C�5��K���N�){���V4�l���y�ދc]���BIk��Fε�p3�d�2{���7n��y������/�:�)61��!)7�~���o�p%#��}rھ88=<λ�e7e�&����Y�s)ɩ��H��y����c�'�[�t*ޡN=4i7m�b��D���h6�C�Ng�x���ţn�>�)��L�g�F�
�T��D���%}�R��gq�ʭE��p\hm'F��#�deN���ʛ)88�8�:k�Q7%�e�`溬�My�*X�f��1ۀⶔ���k�tߥ��}�w�cht��?��<�����:wt�e��[⇥��收�N�(����1���JBu����5ZU���cM�.ؼ7�!��[m�I����
���.�ݠÅ�д��ԛN�Qn�Z����l�[z�B9����/ M��wr8E6�!�/8a�5�6۝h�q����r�Hf3&n`�~y��Vf�X�W�����PK��mW��+\�x�"pkg_resources/_vendor/pyparsing.py�}m{�6��>O��ܮ��Rl��n�]�qZ�:/7v���x��m��H���xS�o��AIv�={K$0��`0/��i>�O�`v=��2����O?��v��u���WA8�kk��k�_��x>	���w�H��뤘�e��Y���yR$'�YgU2���"I��4���YU��u0K�*�'U�f�:������s�T��U\$P~�e���@�|4�&YW��i:I� �α;A�@*uz��8�'A��$P����:��UP$eU�#A��d>����t�J;��R"�y	C��F����&4��d������ɼ��%>%V�=̋�L&��h�u�4�Pf��J0F�_��S{H���y�A�ɘƝ���_�Q%���i>��W0Lh8�8�rS&���'�eB#c
��
zͽ�I�Փ-����qB�g$B�1�{RV@)��,/�]w�Տ�w��W��~���߼��޳�gAg�~w�৽��_�x@�7�/��zl��{����g��ݟ_��=8^�	�^����}{/w�|����)T}��0��{�wp_Q�mo�=G(/v��|O������=
���D���v�z����Ώ��o��?�y��`:� ��{��
4��b��!�
چ����wp�>5��#�
�r��뿿����W��v���]���]n���ii�oh�g�/��ۥ���*)}��]zMn�v�^�D��zy�~~_�9Ե�;؍��7{���o^A�]���@՗�1�}G z���ǃݺG�v����7'�'��O�CX��a����N���'�)��v&����	��qɫ�4͘(�w��W��ߙN��l}���G��)vh�J���x6+�xt�	<��uW�W�NgPW�f��R���%,�I���u<i�.$,��N���'q�g��pM��'�]u?��:���8Ϻ����$.���*(�����P0ZM$b{Ӹ��C��속
��"�L�8]�8O�� ^>�9���
;C�G����#w:׸�YÚ\#y}
3�
��'������O���F�����g� �N�sa[��p|�����2�̙�?����x�K�'�un`�8���*�Ϡ�X}�=@�D�e?�i�'7̝��og� �$��;��}�}��U���p
�On��g\A�΀NJ]��+0l�/�3'n{�*��.��Jx3��`V�mn"����3�D
t�Q;q<��ǥ*yO�"�y@S���e��P�r�^� �D��}�YG�>�	�j�����s~��?vN�h:�����N&���w`s'�Go��G]zԍ�n�����Y�X�f*�ń��b��B�ޯs@=����6h�E��l�}��I���$Edd�4)e3�.	��.=��)��^�'*z���IU��F^$l�@
4�RH����ǭo�G��N��F#�{���Hf �T�aX�$�"&�g�~"}@�+�o�78�9E�2�&
�0��é0$��z��@d�.�wX��<ɂ�"�%\%�*^�J+��ABi����$E�Q�s��4O�\��hSH3��AL>A�O�j4�Q{��sĎ�O���$��3ʧ��~�]RQ����m��O����O���)s>��ɼc��0*�w���\�yY9�+�YB�"i/�M��A�c�P`V<���]�[�f���讙���֦ $�9��	K�X����A<�"��Y�6�33�hiCf@Q½������M ��+)�Wŋ�HT7_e�z`v,3u��Oh�u���yZ��<�G������>ޅ�`�%�y��"�]���(|��wA�I'�ه�	/@�I^c<� y���k�L*���P��@��N;;�c]���a�菐�N�D�8��P2��P�{uj����.	�dPfO��K��h�ʜ�<�2"�}X�����`c��1�ӄ_��� �tL][�����*
�(�K�U���Y5��u�<eP6G	���d�%�j^vO^�~B�}��Er�vV�
��
��
xz�k_��;r2f�z]�H��b�$�d�#���h�?����xtQ?��!�P�@6�IuX���U��!6�s��T�7�9�Lލ�Y���ݢ��W1D
�e����GFEc`��d���!�8AarY� �A� ��S7�1���j��5���Ϋb��H.C���p5�+��l��
?fqX"/aQ��	wPV��6��A6X���=>
dA����y�6����|#w���p��iq}�Ix,
Fj�!���|$�=��|�W{�bΊ_q(�0��Ϊ�.���IdL�O���I���|2���p�/F��n�����?�C����˜~��j;�6�6�?&ׯ��񩏾���S�.M �Ɨ�TX�n����͂��G��*�%UK�G�rt0l�T�
>�?$�\���	f�2���f��7�Y��\��C�ʹ� �h��g�y�~�_$���#�"����?��'�X���UC��}�^���Z�L��듔�Qrg���a|&?_͒L~���I���=șpg�aG�FvM~����/�w3�N�����E����:>�؈�����f1s���^�ҷ�*%�h�	/��{��c��j:1�_�n_&��&�z���d9A��	�pEM��͟�:p	lW;�D?y]$�i>/�r����U,�O&ϒ���HQ��Y�S��l%)��R%�Dm����y6Rd0�=��Ư��N4Y%���(�f�c��p��i_0[�M�eUqv�/�pJ{��$@k�F�<KG�8�a�g6!�0���qd�I���rBV�������L���)&�f��;�p17مZ�11��x�����6RF�-bq:��>T%S�}�NQ�A<q{R�t!�m>��>|e�JGk����i�%d��y���+��2��l�x�b��۪ৈ�����c/U%q�
���x��Q��g�[JQ�C'69����
�X�{��ngO�&n��|�$�@�/��G�G�H��#x��Y>�F��$��2T�Q^�I���L|E����5�1��4�0?��g� �?+�Y?%�
9.:Z��<r�lBG"��L� �	ί ����Q.V�G�(tʠN�t"��X����_v�I��MY
HeA���E��z&)�40�	�."5J�����C��-�������a
S����I3&2	��l\�)2��ɵH,�����4�T�Y�~#C-��T�&(��T�' �_�^5y����x{� �])�9?���a
���F@��rI�gI%��!�Qu�M'�^�#��d�gC�p�R¢��{o��m/��j�ن�xz2��j3�};��h�.��V��66��ǽ�=�y�f@F����m(��ݎ��/`���~�~�9�wr����P�?��O�0���p)dR£4���B�D4�w����7u�l�V��������c�<B TJ�F�"�R�נE�����P{��O��r�d,;�1�#���4x�� N����O?!^	�;L�QE���Oإ�����q<���I�H���}��Ċь0%�S���1X�8�B�cf���tX^OO�	Nb�OOw�v�r�̍Wa�O���]��4��HpV��P�	�Y^�9��D+�3��f��ю9�8$h�F&]�zTA���B8tV�w��$dƬ��H���',�S+[��A\��tNJ�@!���φ���OPv�>n����G_|�՟���/3��o��ӝg����vG�R[r����I��;�1"�f��wgJ��;�_�4G��bT:���2�+x�e��Ոj�"C�� C�&'���u\��_�QuI�\�752A���n�smW��⍃����/whQ�E��h�R`t��7�)vI�4.I��W�ZKC���C����A(m���S�m�V#��:��$�UP��Z;4Tŋ�������1��K��o\8�o;�~c�š��){�j�†�I�J����2i��G�zg�#�x���{�sv-��tS�Z���G�#��}��X��+�"�ėy:.X��k~����N'p�-��x�>?�U��.C����d�؁/� �8���{��;�m�����=K%��ꋲ����x��PC?��3|1P|���$)�Y�P�f̅2�'��n�Z�t�E6�ZđvCA��:<�N�"���P/��X	�>��;0F���vzm��`�/��
k��S`��R���5�Y}��;��A�
Z������-�&��طv�	5����$�����)�._�+>y�[��4..��ټ�q�ä8PG�Γ�w܅����#���I�R�!�
��|����#�1*(�;���!�Y2B;5Xڎp�P�
e�[Aܖ��~�n�2�1�P"A��mMG��u?f;�}d@��I�1���;-"�H4��f�܈�A��!��TוVjI�)�"�w��ȯ26��y��P|kMm}+�y�2���̎��vs�ъ�zPT��	���n�gI��YF:(�v��*gcG���}$�����=����H�Ģ�|zN�Ok�����;X�Y�R�k�����:3�u�jvݡ0u�0(ԾCYL�x��'�$�=��k���c�xqf���C4����[`q����t:M�h!0�^�m�J'���/x�O�����(�8�����t|�=�m�k����'7p����O=3NQ},-z|�*�q�r�1f8��b4Ո�`��]8n�o�oL�MR��$�=�dU��%�7�lUFuh��!�d�>}[�B*��IMg��H���oX�m��ilrƢ�*}�}�AzJ��l��bI���i�� as��x2���]D)+��[��5�Ĭ[��X�Q14��*
����m�x��8�C-ܙ�I��J�ilj3yV��L%�@f�ж�Ȟ='��CI"�>A����,)�O��j��[�W�g���m�5�hr���i�8��1"q.PXf�j^��{�6n��*�y�6K�q�Z���[�|^���o��'�w�x1����?G�d
�F;[�f�V���snL�bJj���(G�G�n��m�k���(d,�&������sbth28����,b�H#1��$E��4���
P�
������b��SIg$Y(�{7=��6����wXRJ�hTo�֏oj�N��������Em4[.���'7�����-C²4�J���<�\'1�` >wv
}��y���Hq�A��uǔ��ɯ�����MM�gJ:�xP?��f��&͛�{�!�j�8�Un��u��Y���K�]��o�o<|�n����B ��l����N�'�l�t�^²�3F�:H�BǽN�-��m}�%lu[i�;�EwT�W$�����jc>��`��z-�x`��-��x��Y��_�w��‹{��u/��F�b���]X�0oz<X�B��!�n3�>�f�h�|D���dž�<���=D	�F|�r��U7^�k\�n��$_�xB߭]Ծ�P*H[t^R�چ`���u70��sK
��P(n�]of�q��t�p[,G^��.�i�UX�]s��(��J1����W�%`?�O_������eh�x�U�[$`�!���K���Hl�Z��*Q�8�}�����j�'ߎ6���B��{Wj�X����4�^G�؋^x9fs]�Z�U�%]҉in6p�Eh��;U���8�V��	�`�J(�uä��)ל���T�n�Y��>6���P�$]/Z��;��7Ŭ�DL��6���'��lPɨۍ��{�A�	��뫃c���c/x^y-`�͛�Q[�<������^����k!�[5e>���Mk�5�E䰤{M�hk��>� �u���5[�!�o{xT��+ψ�w�gJ٥��{�Ft��J�F�zKfs$}m�6�m\��[��c��Q���ɖy��(1"��4�R7�wk.�.��r�]��e�B�.z�]��!���‹�6���.�]`~�.-D���EdLr{'hr���6�]�Ҷ�/aA��نrx����{S�!-uiRZͯ�z�Eh�^���ڼ���p+hԷ��B$�����I���.�{Sc��yi�>��6����S�[&��{n/a�6|��ޱ��/E4b����@
��pϽܑZ�힦��3�")�ќ�p\�+ W �$�Th�_6����}8D��zւK,\$$�s��

�wA�ͧ(M&�щE��(��u٭��1�ߟ�X֏ͥlӣ0K{��Eci�J�&���RL���շ��k����D�?U��6���*Hy�Ϥ���L��wURx����GY��X�h�-X�"�.=ZmX��qIv�6*����u��܊���%�(F�m6��|�Ү�'H��jz������y���%�&z�શ�~�҃*lu?�N�R+2R(lj��¡D-D�C��:@���u�4�ŏ\Am��Sshi��C������$�k/iء+�^���C.~/</l��uk�bZ8�۶��Պ����Et�bt�~�.�0[ҦB%_2
<�Pu��{,벚�ߵ��;�C��F�Z��HPqɓ�;�I$����B9� ���_}�Rw#b1�C"�+f4��n���\�آc��lX��J��!�`t�DuD�a�Sƈ{ys��'G:�gJ`������~k5i~C�GS�G$��
�
�i��������nz���������<�:x��{��
�k�1�F�������
��!���pɂNS�C�ǣ/��=Ҁ�Pi���Mp����em@�HQ.b��ٙ�X Y��!��A��ɵ�]���אj$莑	Ƚ��fg���exM&&U�lTp��j��oZ �%`��SL���;��1���W���2}R�`a��,�U����ر�[�7�6�;=Ԧ�5�_?=���
��i�x<6��́�аݦ��$>I&N01�_ ��!�����t!��oH��P�~ZwS��z̓6FC��"1lF±Cx��TY�N�Dȴ�(*��c-F+-:V�%��V��m"�e�	܇!ܪV�K���l?�^lPҝ�%�]�[</"�w:!�2���_�a����i����
t��t=3��q�/��\�v;ĦsZov�R�ph�(s�WR����e�.z�[�T��Ү��3:�8��e�:�5�E{�*�bD�xD��51iY� /�w�,�R�n��A�EM	�LT!�#U�oX��H,QX�DG�$��2�,�|t�]K1����_o�4�!��e��& �v�ˠ�����Jб���t�b�Q`��1"hcTE�n��
���n��r�[Y�����_�&��k��r��tW"�Bu
�z�0U׾�w�P�Z��#(����^s�����F*�)�+�ma�Q��l{%�j����4��/����"Y���ޭ&�}lA�	�l�!qpk�H���ٽ߰��)B0�!��B�'
����5��n!�:"���r|Ak�dW�Zl���Ej���-n>�ࣨ��`��	��_�$�������=��j=iBu��-�jT���;�	{�E��6�;`�
{5�F"�{��)��*���Q;H��t�,;�gt��֤�h��b�{pF�_|��j��#�Xԕ���*�_�X��\i�t(�If|�t�'�O�E�2��sB�R�CR\%���1���j�c_�$,2�,�A���
����4s+�}zLٺ�]v(��ZOw�9}u�lR^�	�����`rQ
��7�b\^LN����_���B!�6T,��G��-E}����RӢ����K
1��WS2�M�TK]�I�i���=ܝeA	1	��M��GVF��tIY.�+�h��-�v�=f�X�퇨���	b�t�Z_���P55�¹ެ=�Ѱ�~Mu����k��.iN[g$'�B,Yl�t��T�W񦪏����AA��:
U���'%^yj��&���6�U:B͆�#��\�-����/i�HFO5i\z,t
}���[��L�i_�Yņ��=�۶vMg��F�zm�3<=���aA�%��mR-�T
Jm����dYLL��zk�a�tO� ǹ��L�o
,Y�c���S��Z9ccAz�=���Ea�*;t#'SO8;��Gcy ��h�p��#/S�����+Q�9��K(溱%Ζ�#Գ����s���1�E���)�m�6������V��4zV\�Lf[ݮ�;��e;Px�i4�܂�6�����Z��Fm�Z��޸ V�)e`q5���%1�'iܳ젤u,kD��2om����H��o��$i2��_u�%l�]+�7�d|�K0)�_�����	jI1��ٹ���/)�j}
��75t��i�F՜bĆ{�9�>q���N���t��]m� �+$7�ha��/�d��o�d�{F~�YEcl_�t(��gT0��j���/{��h������U��9�k�G6psm`�۬
�ⷯ�Z��
�;U��f�n�Kj��^Fjӑ_��{x�Oj�Jl�8
�wa�M�����=x�E\�c��F�㓞�����
����^���j� Sk��;>����h�Q��_u;~�����.��	6�,���#J�B�1�:��p�1f����a
�2�|���t�[:3mb���&�F��}��%��"�'�?��K���P�j�:���bi~ V�'���ѹiY�MCQz���:��c��s�iTp�mz#�|�����SN�����^��ī�PG�n���9����d0ou'o_�]��#��t�=�%hw��Hp_��s>D��6v�)���7||�t	�@�����w�
�Tg9�<���{o���~��
q��}%���Q�~�c���;l��2�f�VV#����n�4|�I�(�@o�D
]�Y��ɱ�3fu(��l�� �����
[����R�mf<j�8�+�\R:D��J���\7��c�&`Y�ڇ�b�G�@�}yt`�vx
L`�P�=��\�\E�Mr!�'eZ$�]����	��}P�ڰٿF��<��0�
�v�ӣ���r].������E��Ь����k@�%��)]�,p(�t�w_XX���`T-J�w"U~=��U5��#���[L��p�j��m^j�B����G��Ȉ�:G�*�0���<�x����Mŷ�������������[�~�n�/�1a��G��4���^��@�U�����L��E�^���x��RN�>���^wZ������i>���uf�V6���\\r`.�M���x�u�ڝ���l��5>��FUE�eօG��������DzU�,+��\F�^��~>��Ӱ.�����jgֵ�,Z5"�4%���mꀼ����-�ělX�Ʃ(==MH�5��Nӳs�� X�#ʂnā�z��̆�r���v����?���F��x�9�����؅�{ݞJ��MJJnO�3v(�1BJG6 ���O?����05*�_}�n
�T�ϒ��䩟�}����ޯ�c�@l���F�������?�Opocc���cS���<��*R�+jƬ@�]�P��%��
u{�ll4h��l�����]��._ڗ�Ɍ�>X���.�pϋ�#%#�v�^,6��պ�O����ZY�cט*��gR���}&�.�7_30��9z��������ęq�{���Dm	g�n
�g�9&(&��Z����,�K`t���~"i��y�B�VtR�)/�S�5r�ЗK�Q(�=��}�\�!��$D�5J%>7835��l���5)��?�o+,�
�/���vY�X��_H�@3� ���-��Ta���Qo��UH_52�<��;����@�-��E�Ie�Y��۹衳���u�^_]G/�&������_�P>�t>/?/����f@�"C�� �ާ#�h5Aq�
���	z�^^2qJ�[���,9M8
0q\�&f` �Bi��M$ήM7�KY,'kR�!�R6F?��׮��m3�����f���6C�9�||��_%��EA!�P/J#�s���er?x2>Z�<.��+��f�io���V�}��p8A�o��4�un�;﹵�u��I��T6Re|_��y])���{
J�2Ѝ�F?�ߟW�l���q>*��x�g=��'E\\?������
��ʶ+
W�ʢ�`��ϧ�#�KbuW��cen�7�N��h��u��X���Ǫ���r��V����D��Ma���,��$
O��`�����^����	���]�c�X[a�������|tO�ώ9 @���Q��WS�m�&ބ�����:�l3�����ś��H7��|���']L��^�|bj=��ħֈ���O�㚪���^~er�O�#��v�f�la1��n����G#���JX��n�'�0�g�m{;kt���Xoڕ�F�m5�4[�?<s.�xiZ����g+��{�"��"�v�sH�D���+A���fK�^�Nn+�Vu8����'/���l�hS$g��B�RA�Ǟ�dT��F�v�TJ)L�bd��\G���4@�?��H��s�����!:R�m��S�:�uu�{�Wɦ��Z�Ib�B2�$�f=7>)�㢙����$�K�<�6]XZ���/�9�>~�Փ��fPτW
*�M����D�L������'7�V������s�>)�bh�q�L�+ǩL�Gӱ3�+j�W�|��d�RMkϜf�t|:�_B��4�Cs�I��V��<@ϡ->����A9(@\!���	�	R�4�@�f���B�����F�un��M;�^f �\7I+�t�X8�ЖN��+*;H�@g��g��F��9`1T�ŌRu���ROl�-G�܃�M.*۴�z++�
���p�%'�3q�C�h�QK�:i6
�Av^��J��OitY@F"�o��i넟�#�1�lA�ףL{��@�@��s�Nl�3-D�x6� ������7��z��n��jtH�..C#�;jt�ΉF� �M�7���l>��-�7O�@��gy�!C�]�lPP|Qɽ���%~s&
adf�9�l��m3�]@�p@�f`9�Y�!�0�|���-��pO&%e�뎓Q����;�H�t��4�X���.۸H�k�`RAl�B=VR��`v�w���GF�=R.f���ӷ�����cj�����Ǯie4��M�*�((Dg�:�<����Q+���@�Haϔ�׈#�Q
�*uu��i�u!�WK�y�^��#��y�Q��s�4�S�ny:3�a����*�m��ƒU�z�f	��5��l��׶�C=
��l��@�h��Q!�Hߣ"/�>���&G&���S���"�.�]E���hM���QGx̋�`�LmT��̥J�&)�h���Kb �L�&�Än,8`�Ry]�� �hs�w��Q�B$H&s]�4��5WOzOga��'��PZ�L���@�dF�H���ЎvR�?j������H߹�=-�|�Q�q���H�����Я�z���KY�k�~dU'au-�"(��kVE��U�9�cXv�Uz�)jڑ֬P���æd��z��H�WxOy��Ur?���Z
b�2E��V0��[���云��J$�t��	�A̒,�T�GP�s�������g{ϟ�оR��=�_�=�y�l7�~��w�Q���ݗ�������x���� x�&x�����E�������
^�|H��3=|�����
���r'�{y����f����7�џ������+�����3�0�C���Kv�W��,""��,g
W4
0W�Z?~�;`i�Z7V�~��,�;%t��Y�,��6˶�r�mj��~��)^�tL�2؋$�i>/d{�d{n ]��)���6/�{�7�0�u�Z��N�kr	��86/'b�mbk�C?Kn[Ɔ8~�k�jى��Z��Z�i�K�e���h�Ԋ%��
H�<I��ze�Qb:�Y��-�(��c�s=yߞT���9��z����b�7�GT�
Yi�>j'0GJ&�d��,g˨�)��j�����v��$b�<_��S�e:����K�v�o��8����!��7���m��z[H!�$N�2a�XIFc98p����=����x <���O�),�T�9�����v�m._A�E:NJK�u��0�.�V&g��r�Tr�B���xk�7m���z�����/��(Ѩ�]l%����(�̿���M~�z��R���,KO�Q�9���Ƿe`�+�"�#����	n!�4CL�S�I�#8B'���.�y��i���W��3������X4��U���6�@k�X�857�]�?$���z��$~�T����o�U��!�a�<j�h�x(�°w�d�0_�	�J�Z��1K+1斬�S��zN��8���i�q�ϳ�,��m����l�Q�a�[9?!�GN^\?�=s>C��i��&!�r�qzi�+�@l��
n��tV���@Leh� �<^1*�2J:&�Up<�L�kV��Ng�*��icv�'���$�U�H�XV����\�&�C��i��e[³���u�;�,|�����L'd��/��>�x�P`��)���V[��H���/)3!�}��id�iy�Sr��b[h���c,�������	�S������$ɢ�׋B^@
�m0��^po9�LUw� u?��y]$��Ƙ��<Ek�1��b��b8%���3Ң׮@��w������I3�c_��
�SM\��1�zʎ��%�o'я�Ȕ
4�&��U�Ez���A��C�w��d��%ޯl�����z��~�w#��q�NZ����/pw�5�\AM���{�V^,6w��A�VwGud�/��ւ��X�!���ȿ\�X��Z|�嗏���_}�ţ/���+c7�u�^��&�sb�=�^	F(�;����L��͏�Hkьf�ްcs�Y����­�X���.ӷ�+;u�^� A�uC�C,�0�J)NJmA<m�)lg��e.���� ���=�z�A
(z;��X�v
��;Z�3¿�4?m�k���A/1}
 .X�E�md��:�o�yFmnC�vn���Vk�ٛV��muc��7��;)����FbG��^���=�q_oj�Ф+�q�=��y��R[��5��V8+
�3=�WdC��z+��A�/_�n2Y�Td�}\������JȖokh��wS����'Δ��z(��1�\��͘A��HB�2"
�
F���8vc�x4H1�si����|N=��8a��Uۣ�''Er�R|Ԕ��{Oa���A��qn��.ڷB��YӐ��Û��ۓ�R`էL��5ڵN��F}�l���w�@�XO6���*��ќ��H3�mw-��%F� ��%�Uع�`�:�l��5o���u�4i3/U�9B��߆�`MR��NO��t�|��>�Pl�S�����ghIȥ�l|"�Z�S`4�E���:���'I��fkR~��]���t��x�h����-`�ķm��`�4Pg��ԶKy���È���qL�ƹ��h&�@A�
���K�
p�|q�I��I$�i��a�{ew�2�1
������a6����'`�"�(>vVe�u|M7VT�I㗷��l˦�,�����X��YY���N�IAR>GW`�:tȼ��i�(�N����xm^��fTg�]�"�ֶ��]�e�q�ǣ�i�h��i�wc�V���F���f[��Fu�W�Ŝ�~����l@T�'���((�|�'�Uς�V�C��1�9p���4XU$��-3���Bţ���q�^��_�Qj�{GY���iF����
�6� �Р��c��Ґ�j�F�S���"�Ԉ�+�e�,L���
���R���1���P�$�Sx�����YW��`�t�Ĉoz��cڦ���Fy�MB�2��8�y�9$\<A]	�ַ��1
��s;�rˎ|E�q�|t�q�||r��jHN�;����o�x�/~L��o�"aJRDQ�Y�AgӦ�Ѣ��U5��X��RU`5�1_+g�
(�xL�w�3>ԮoȗG�mwIm�=��ɰ���qx��d�%9(e��uDb\�
�Q��R�TJ�,`i��G�N�['R�J
4�i����?�#VNxQD@xv�y��Z��ƃ��Ct�(���y~i�|3�LNKL��اad���ŷ���*sD[�e�L�1���3����1mjD�S
E7�n�F*"�C�0U�Hպ�$ �Jˢ�4rQ������E�������#|rb��l�'ϱH��Ai��[����sr�-ǺAi�e�������T���� �b��}
}���X���V�|I�s8B*�o���½416ݿ[�0�����/��]�ì�5�� C��ZjD#㾊�ׄ���Dbu��!fq5Z :��-���xB&G
W���5�
Z���N�+<����Tj�4NkA��
�܀{�6�Ž��6f��6�P2����r�E6u��	]��2Pᴌ0��5��;m�;��V�]Q�]Z��c7y�%Eѻi��>Do�N�n1>'�32�2F"�1Wxέ�d:#�?,&&{��F�O$aK�Bժﰪ�"���'h}m��r�CvE���f}(���͍��PX	�y�h74�r�4[J{C4���I���N�l(�,BD����,�aL���u�����
~�i�i��;S�ro� ���$��|:�5��f-tG�^}�"dZesǖ���������H���gG�(�c��+ݹo�	ض�r`_��M�+n@���BI�5��y�����Uy�&@Q�|Qհ"��/E,bu�"/f]��/I;�����j�.ɿˉ���Km���௳"?MU�Z���N<:okf��>�����
�ÆQ����V�T.Y��˃�����t'�;i����6rW?�>lX��D٪ow
6�\�iźs��L�0o���X���^ȃZ�i4,"m�
�X�A^s9������Vѡ'��l1P�yn*�iƅ%<��U\(�٬�”�F"�^�?g&o~@Q�
����V�O1L��6�|�|E�Qs�rGeA����j�Ԑ;�Қ��
��F>m�Z�J�@�8;�ʏ�Z
́Pמּ=թ;ꡪn^���b�5@�$��c��A�V����h����zhj��Ή�t&zK�1Շn���-�N�9@��bq����c����3��z��1�w��E�X��[+�ZD�jZb��Y����[~���Ր�P}di�e�����[~yK}>ަ���nk��B�(���wYea��,��Xp�t��X>�O:��u�i�����v�և���'M]�<p–��z��yX+}�� )V�V�P��؊-��er�B�%m�<ԃ��x�)<�]<\���eWl�)�;�UK^G�՞���F��=Q�?f'�TJ�|��]��赯!��u��N\U=h�8Pw��8?���a�*�y�ICZ1�D�H�"�/�҄���� A��A�|�ȱ��
c�e<��+u��Qc�	�g%�#���at�[�m�)�u�Euhh�Z���H��5
tm��p��'E2�t�-ۙP���4o#h�k�����^:�2�$���F�%W"z�nC�
��į{�,_9Q�j��.I�����5��{��~�q��\/:�����>_����%�f�2��ҥ���,g]�KZ׻ò�uﰴ�
�?v
�;~`}OSJ��e1i'�Γ��X���zWc_a���+�tiǠ���[ַ..戧��z6����k�^�{���%,��Ɍ�Z��:Y��H��6&.��y .�;u��Ck�"���z
��>q�'�|9�w��k�������_����b�#p�J��kO{C�1�}����.�1l�\}�k�5f�m�7���k�k ��F�5A;�kK����^%d?��p�f)҈c��ЙL.��,�AF~�������YO����ħ��w3���a��;�H@�^��\}xa�m�k4j�2��cn�d�!gA5�{$l\���<�sI�.j�uSY�o��#DZ[Զv�K��8�����\�n�!��m��fT	� &��Siu�E���؏�ف��އ_dֺ�r���c��`H����m�X�[[�=ó�4��&`5������jK��Fo-R���>r����EqK�~�\���,4w��(�<&N}ܧ�{isL�r����eH���H��D5�p��_;Vy�:�XGj�#Y����1�)Ӝ�W�lx�L�td[�Q�h��ʭT�di�Q�є�\�m��lf���UB��)�Ha0�I�.8+b�[�hc2lʴ?��1S���E"M�lM�;*#�C�����Œ��?Z�����$�����iҲ�F�f:��+�P����	�/�՛<�|�*Xo�"�LǮ�`���&�*ig%"n�[LQ�Re�N�K��c�,����J3H��(R��0���)��.qf�{xl����!�a�%�vv�]$�W��d�\ �Ht(ב�[�Q�)}}�
:�=WDv��B��q,ugI� ^�s�Т�����>̩+��jgL�iB	ֶ�dD��@9R3k�����N����$zWi���c�!�1���Yy=��׻���n���h��u��l���r�Â�hG��x�zC��9i��9a�^���N46*��\��$)uP�+�)�O�0,��)�</D.zjڗm�gB4�Q��p�,�]�Ks���i8�ZX�k��6��w��߂ͭ!�7��eܪ�Z�㎡�/,L�[��6�g�Ɓ�/g'�ecviJ���|v�0kz{ʑ��S��S�Iέ�-��EA���2o�f���sX�'	�1��$��
��Q�x3f��_�i��Qc�ٴ��|l
�r�g�z�\蜽�^!�2qG(���ZZf�qh��ӳ��a������E�+w���J��%G��}����M�e�?�䨥g�0(rS-��8'���l���ɹdj+ǻ9lb��}��;��
���Ü|f� UQ|��<�z�գ��&���M�m��4�&P��7�l�'�<�DIȦ
I���sg-�4}�5����'7v�q��=�t3��!�B�VĆ�o0��&��G�9���mu���z��)*�T.��_�����z3����~ܙ��=�Y7��1ź1~N�]#�3~��K�����,T,@e8ka�6#7�}��u�u�R�
|��ݵTx[+������'��4c�SEkmxE��o��l���1�--�i��1%W����p;KXF5T���!D�y���rO��vf�FMCF�l���}��+�q�z
]�8.Z_{�I�(	*�#��(1�A-1�ϑ\(����;�@C�UG�0�)�ͷ�6��
�5|���p��!���I<[&���`��2O9t�va�*�9����� ��z�
ω���B=�c=�'i!?���z�5C��r V�G0�ݬ�zN(�s��y/x�h���	�ˈ�#�0ݭ����,M��aj���펖;����A,b3K���=Ԋa��%�_r�x�pP�Ub数�Q��N9�r���hR������_“�_N���7��_���7_��cW�D��M�D)͈r�QB�Zf���X�k���t��}��A��!������Y���^�M����
��k�? ~��?��)�>Ҩ��cY)�R��?�����w����s�L�в�/�a��z�$7�sy��۸Q�.��[ES��j�)��[����؜n僠=m���Z��h�M�Ou�,b]X�Nلz/\�i��s7��I2��/�Y`{��۞�	?����&c�6ګA?d�[bv���8IΘ'+�Y}�ť���d�cr@+tk	�6��\Z�e`(��(��E:�
�q��B����
ɏ��]1G7�E:�����6S8��cK��w	���y��ֱ��J�RX�U��
��D�t�{g�PT]��L��ϲ��E$��bI�$�	$V2�1lLu�EN(�@��@z3n-�20c� ڼU�1x�x�@`U�;����E"_��2�C�*�&I���'�@wd
/�ú�5��T �����ɛ��$8��E���2�N�����9��΋�����7
�Kho���#?q{�N�W�޳����w��n��5���=��wl�e���ߢ��	&_ٵŊ{HY�E��R4���%��4�\3�U�H^
}���tH	���Q\3�K��g����
��d�!�fƁɔ�ꤦ0CG���j��<�{���:ei�@�m��-�ھ��t��LG�Enu8}�/Vڗ�m[s ��i�40�^�GQ����t�IV�hs6g�x�B�?�p�3�%O3���r4<� ��B�h����ʈ9.F��g-�#�Q ;Lںh�/�"��Z��c��Rۑ��!2��A�o������"�,�]�bK�Gv7���L��/�TH*
���>�L�#�+�u�L&����gR�::'>5�:�x��!�`m�j���7AYi�T�t0?
>Y�WP��{?�����r8��q��]��/�Ɵ>��n�i���4�;5�� �H�I�H\���m�Ʈ���A-Ϻt��v��Qp��v�������?F�c��	�(`P��_���D�m�$�\���j���dA/8���z�/�¦�+�^��Cu���>��B<w[��wI�PAe�1�&����9�q�@�KՖ���X�Ԇ�Wk{:��'!˕Fzuek�k�ٸ�oFs�$3��%/���:��4�þ2����<\��
?3LĽ��_�R.ð3���|��/��2?�BXm���A��s�%�E��L�?Nbt]�
�mJ?[��t*r��_�
��xZ�ҭ�i"��s����+o(Zr�WV�Y�#��
~Ѡϲ���nt�XþF�q�a<kW9��Z�&�!>��L�������j������Ct�FD~�,�X���%�t����%��M�„���H0gEB~P��܉0A���3�~�<A料�/����B�ᜋP�nղ������VClnA���#�����Z��>G�F�����S�0�k&uX�ፆ�AZ�ͫ��K�r�_��N�!�Q>=AE�JςV ���㜃!�(�.5��〒����E��M��d���4���pO�G��D����������
] ��1!,�T�p�P��L<�ͨ��r~bO�-f��g>j�O�V�(ow�����6�&L6L�`H��d�D�;��A�Y��?�<9��?�O���v��7�~�Z���xt�J(���gi*�����������3y�Pj�i�rs��������/�@V��+��3a���i�@�HC`K�"9�c1��o�����]�@"zo�Z��}�0���G�3��\[���Mݥ��c��%E�ɨoB|�kDit��P��E�,PT\ֳpceq��I	�3�_FG�5|�����}��O�KF]�Y_D��a�Pj�t64V�M���� 
���{�]�,bI<�VR)��|��v����b<����8�c�F>���.b���G#ÙD�+��"5=+�.����m%������a�	g�St>��<�S�X�^�pZ�m�=Tw��k�67�gP*�^���A��xG��-����#'������/[p._O����%N��-2����ٷ�[p�d��u��t�;��/׏}���e��S�P���2��=� �	S�Ц.;�uе��.G��~^����껄#t����dd�\�2��̟��l�ۼ���1�<n$7�7t�miݖ�`/Β36�%ߎ-Z�3�Jke��ux+�ar�<A��✠��x�ܞ=W��N��`a�XD�\�w�vX�Z��":4Z�y���ʣEW�ި(�>Y��J(2r�g�|�[����@�����C,5}�7�x�AXT~!��Fwz�k��cP+���s_E5znѩ�a7��9��6�
q*g.dCɋ��'k�ɒ��9��?Ύ�Ƴc���Zď4���Ci���G���C��mK�U�����U�|����c������5�t���S�G��?&��8���.?�d���Cɀ�'�:Oɒf_��>�j[�/�j;�n�_�O,���;��O� �x�l��ի�</�ќm��6����:� V"���d��_ت�k���
nl�4�l�Ŗ�h{�J���
%!�GdQJX���E]C���1"��o��<��ȧiU�����F(�}N�~��/�=K5i���<6㸊����ڰ�}��
�~��w���|T&�,w�L���
؄d�	ڹ	BZ�<�<�:�ƚKTxFe����d�_�WN�ׁ�Ϧ|^�B.�~'��ͷ���9����CY�);��h2G�e�D��S�@�����9�I_&u>�e�{�A�xt�
�b���4,�6"�@Qje�r�R�t��-��[��u��]g0�S�Y�%=ۓ��û�����4���d�	�O�FfS�2���/� �ԣ*Hd��Ԭ���Ծ�I��Z�)Vy ��9x|�H�2	b�fN��N;�B�m� *S'���6D�H�q�?�eW�?i��#V�շf��#�'ϫ���wc��RTT��1MuEc-��R�	�ERQ
D�>�Z�R
�A �C��Xɪ�_�� V�$���<'_2�dp6�<�SѼ��8��,�›o��,��ɲY|FE3�(討w.�R��Y�b�����4s?r����@�d�<���w�a0)/~w{:q�Qy�ʔ���I���>^�Q��站e6��6�[o���	Q	تBC�V7�,�����-���T_T9��V���l�A/hj�=L����L�.rH�g�
@�~j�I����MA3�Ov6�)�x�Iz
�3��\wz�-df�5�P_w�P8)%a3��,3�5X��(Q0��b���*sT�&�t�5#��n�s@�(��:
%E��&"�2�C�x�����F��%tz�[���;oբ�Q
~�*���P�-h�o�q$�sjf�OsWc��=)
߶�uc�v��N|2
�7�|�͚�_�\�5v��K
?�]��h��)�';]XX��e�-@�/����:a]=Ĩ� "_� Ĉ>���}�K_�
��z��
W�:���T�j<P����F��%6��5�e��,�;��k�y~�qP��⮎�#�a4n�?*<j?��O���ip.�M��H�a�07��`�V�[�Y�o����!�E�A�MA9�<Ʋx~�P�8{>F�<�V��:�����N�<�ؗ�6�d\F��9Eot��r��=FeJ#ٖͮ[ml�
g�KLc1R%��.�0Tb�T�|g}�r$�M��6�S�����4�E!�t5�O�2�P�l�@��q5%E&i��P?Fg3 �.�5���<"�H�����6��;��LP۾�[�7��+Ǵ�6�s��t����Έ�!�^����A;Z�d��G9+͜P$#�!ԚU�n�C3x���V�~�EX1��7�E
s��lB�K�!��쇙2AH�	}�S�ѭv��]��Ƶ��0�&B�L0���S_��O1�]b�"(���)��>rn08�TZN��h��3JP�Q�K�mV#l�Q�
;�v��[�6���Nh����_N%P�gT��#��d4��Z� ��64z�� �$�
��vP6���(�N�]�<u(�e�_�$�3�):=TY�z�o��4Z_����,X����t��_[B�j-ɜ�	"����BQ2�D�7��<��R�`ξDY尯��1R�5�j����LeI+�**�$sK,��-8i�{�OKu|�c~���.�"�[�Tڪ��}W�e�Z�t�)&(LzC�̊��:O�@ΈC�`��w��P�&ƷJ�|�KM
g��4��N09V!��r~bmH|�� 'c��`�7	�_�]����C�c�9wU��.j��{3�, 
iv"%��LJ(�!lܯ����Ker1���4�cu����̣��/&��J��Y_���K��Kfɩ�_� 6���Z��;⢍!��6��q�]ke�V�^7����ә�#u�\�#L�	��]>d����A�����u�!�ᨃ��&ya���Vgcˌ�l	�����I:���up_[��C:��D�W�馵G��zx����aǔH���›Z�b���^pޡ�Q^4�VK@6Ԑ��l��8՛E��M�w�ɥ_��aJ�V+u@�[_��x[P1�W:�\�Sa��R�P��Nf�A�M����*l�"�v%�Ra��d�$o�X3�8�^�U�|nC2�
Ib�(��N����!�6}NTG�n�
�l-��َvz�9�W��6�$��K�6E!bf��TA�;�����iÍt45/r�h�"�b�(�StK��Oڲw���P�-����l��;��^b���@s�n�듌�jj亾�B�lM���U��b����$�%n9��Upp��D��_
�6��G>PJq�:������|��5ꈶ����F�=|��s"��:g&0��u}	흈��U��%g���gi���݁����ej�<�l��j��_ֿ�Ƌ>gc��!�j5.�nc|G��؝�eTܤࣾ�mh�K�G���#��Q���Y��D�xˍ/$K/I:I�o��S:շ��K�/<aoG�_ܱ�Eg|qoCu�[`�-����Z�^�)�u����;��{c�B��[�!�i�Q��9\%B�y�MU������BLL�Fh�D�����"�.���J�Ұ�Tb�߾5B7�f��7濗�T;
f_�@�l�ldCUQ,P@P$�-��I=͠�|j׿��E���b��Ngr��+�q�=��1�nQD�Em*�v+�`k��+%Eڡ��pm?V�/Y�y��45��/�Y)ke��>:WrM�ã����j�֪Т��(饙'ej;P_���}�u9��6܂I<�"��~�iM4&\��0a��D��g8Z ih���B��a#�ϖ:��ܢ��W��̘҂��h�g>�i\O�
:�����^�!�Y"���X��\/RG�	�#*�>[<�
����,p�=�
�
ha�*U��z��I��4�۹g;��R�F��#UI�d��l�I�hқ��z��%w�n�w��}}���e�a���{l(���!i���Z+̕o�J�0�3(�ۑ�
+X����=��5�r��!��?���b��{�w��GU�T�&"6Ϸ�x�_�S���cD�+Ǚ��6×�C�T�����:���c⌓T�9�,@��k��CI<���K��H-�}t
���vof��5+C�v��a�_�0�o�끿���m�߅�w�\&�[�[u�R�#�*�ŴD�Ώ��4y4�N�������s��h(�埝�+t�}�m*��?E�<AhS�m"��P��ޖ�<���1�f�'���M���tv_�y|���y�� ���w�R��s�@B���o��.�&�߁�x*~�p�\�M�fK!G��'p0�P�L�;8�Be�&YZ���&ŭ����._TC?h�c�
��,[aL&[&0_�}�3�(��6��R� Z��cb7c�����^��}=3�-�.����<d���Ƀ�أ�ĦyuO	�B�r8Ti�������t��
�%Ƨ;
5��Y�NJ��3'��q�V��%�����Qf�9{���x�s�T���������ꦧ�X�Z$�G�G��9z�SJg���jE���h��K��N�2}^�)\���ӱ���#��H�
�:+r�A�(��K������Q���=�������!���F9�)��5�1D2�4}��X�����s���,u�6�MJ�ׇnR��A�n��:b:Q11���4��e^��p���mk��o�t�wL�\��Q(Ǹ�jꤧ����ƻJ��󾛞v)�*}��Ư��<�NL`p��GC?�jn9����z�&�@��;����K���tTWy�[b�gl����R��
��8U���M�*F���tu�C�F����5\CY2T�&��j�FI�
˽`�Y�b��g�q�,�Q�a��Z��1�4���F�]��+�o��u��[� =g�J;��<�B�6���÷NC�Q�VbK���l�������v��ӫ7φ;�o�9�E�p\>��W�6Vj�0��&�-��f�c��"�tl��J
�%��Q`K!v����wm�b�ow�w�+VEs��,_-jR}3��y�B�
[@y��fa�_4K�I����wE��4u�!�Pv����k9�BL�)��'���N��
�o�
��Z>�5�5��C]�� }A>o'L��H�Q"���Y*��y��|,���q�?��䲁&1������J���r��lC2D�#�k�w�#�TV��\|HJ�S�M�C�C�m ���u�%�;Z�Ph�ۄ����F��(�S:�Ă����D�S�:V�b�!I�va0�3
^�:l��x�t=�_��ꢠ���Y��Hs��8���t���ў�����?�L��<�
�$��[�+��Hw�V	9�ih�=��v/x�	�Ez�����apJ��_:�H
SJ^���QB�Y�ֲ���lo��ҫ��#�;��W�:�����U�`+�D����[&��s�er������\�͂�r�ig���>E�>�ݿA����h�Հ�z�o�.�"��z��KP�sz���u��VM1eX�a�`��Rj�ԷF�`�}ݷ��"��Y�D�OIG�Ȱ��F}m;E�d㴊�{!mb��>����{����y2��Y��'�Q>�*���"[�a�L>r��<��h�@[�2�6�x2@�Znp�ZeL*=|�|]�V�1�f��f����J�a6/hqc�W�J}m���Y�!1�96���a���#�0�nI��LRhAs�aS��8	g�;\�\��k+���J��l����>��m˔֍iT���2����sL��[���}sO�
W��k��=�Y���n˾[?l���p2֍��lzy���J�9l��avVB��#b<J�V˂�a���ihuMK��t�P^H_D���߾��{����u��G����	ߧ)T+}II�[T��\������I�(���D���׼�ukmJ��"��^����h��D�_��Q��A��A�?�r
4��p��[�G�p����4��1���f�ќ,�r\�ͨNQ�J�n�F�3�YJ�M�q�Mϧ~)�Q��C�i�5��Q��z��Z=lea����1=eu�����hji?dna�n�z�r'�A���E){e�1��-<�&�Ca��M[fT?�9��r��*,���y]GI����$�74�i���O��tIB��@�r�2�I�I�v��(�!I~����/1��C��
�_��k�2��Y����].A
b����ls
At��ډi*��e��~V�XFVZ:N����{� � +���l���޷�
�
V��&�H�Ժ\	��eb�\�N7���Ļh訆*:�J�r
��'$�$n�*x����'��ȹT-��	�ʣ��,Gc��b�b�W�b���j
��x���Mz�"=Y����3�$�Z��̢}��J*$����HB�QC���y�	Q��EOٽ�)�YN���ݦv�4sZ'JiT���\7c:��A�&�&t���y�bb�ә��$�}��K�
v�6κ�N���^c?@"�loo����x�H�!E!��`&b�7NPB���A}�mT'Q��I��~�ew�x�B�:F�h��u� uSC#fF��Q��d��g��|��4���9�����o����䝷\��IZ�s�8I*�};r����ޞ�����/��3��3
g_AG��|:���$�F�U	���
Z�ܲ%ɠz
��$�`��Q����i������Ѹ^�8H��9���[�������]���y��	��'B+�-�����G_|�՟���C�E�
���S����$3P?�x�V�A��Ϥ�&����@5�q#Ņ�Ȋ'�tqQ ��v�s��yYq�V�7��Au�^�*�N�
��zdؗ@�Ą�$�N���7 ,G
m��\�퉦�;���L�#��������ߏ�1�ڊ������_��1�Qy9�]ZZ���*�r�uV�K�/Q�]Q�l@*�Z����Z���J)�%��f[��?-��1���ު�h ���7#\��k4�Pz`^3���Gz���կWh��Ѫ��@HG�����2�P�mL��ٚ�Ҙ����4����m�3��v́5���tpB[k�E)�U췥ue�m3��+�'�`�&����T��� �KAbu)z�,�w<=O36�/M��‡Fx%��wˑ�K_l�<�{y�4�RŲ�������몬H�V�ۛf-�if�փ�3�.�g]���큇X)�3r��u��nkM"�"��Z�D��Q���Ŷ�E�o�;G���P�6LJ�N����{��7`4�:,�B�i��]�-�l���؏�؏��j�ɀ��kzY�v�Y4nǽ�1r��ŋ�;o�	�7�UQ���^tޞtXO�3���m[�!�d����Z7�·�*�*G��(j]������'�qЙ�VD5���:�ۢy��L}X)(ꨲ��3�k��"��BW�}����&�k�z��zt�kn����u�����E�@�n�`�R��C��=0��h���W�(A�eK)���#�㬟W�E~U��760��P�/cxln�n@
��N�h����< =�[
i�6�x��������C4�4ۦC*{<^������[}��|�E`.R��~�H��ጛg%�ь_�6D�9����}�\p�]���%t�|�rQ�Fr��H8����bA�U�� ��>sY=��:�8�����2�\�6��{���{{�nl���ԁ��{(�e^���aߡ�.Q�ʐu����ME�9c��1ͣd�؄�1��,�g�#�P]Y���s��H�=ipϰ�E�ɻ:���NYR�G���wއy��rW`��^$%%g0�RJ��m1<� �K�E��q+�c��|�9z�?���񃷃��"C���ص�$.��������S�9<x;�?�����g݃fO7��m>|Hn5�eR�N�+���:�0� 6=��Ϗ����y~���|ާ9��_��[}R`�E!V�qR�q_&�_O`S�F��Z��M��ⷝg�=���|t�������������������zJ���]J���q
A�s���c���$j'k*�s4t�!p�ƍR�Qyu�E�nH-Y{@q�
�����nr`�~Z���M�������0G�F
�lg:�.�f=����c�`7v*��=�����B
�q�D�������u��>b���<
�.k��OP�!�a��B�ű�l02@�"�8g0����T��g	�K��{��6nda��=�N{6�&-�vER�,ۉ���[��P
O�lI���MZV$�ok�R@�I�K�y�3��n�P(�B���o^��Z���{�?��h��t_=�~T"����a�|�]�\�t�>;ć�ʖ�
���$x�@�_�g+k�g���ܥ1U�vn��M���c�jM��S��#�.�=�iQk>�y�v��EG����{�
	
�~w&߃|�㸧q�����9�:!]
�n���M�	*��G9C��"D?+���/ݾ΍x�ٕ�z����1L~e
���-��=�]����_�gϐ"�k^�����f���.��C�*U�UM55vs	</�
�5�`�Xd�p9�;l�Q�� ޙ���C&
�	,QF�=(d�DH
�b!�p�^�^b�3���u�V��UQ)�/F��oD��� �F2P��YNV�Y����630�;/G|�m�GT݆�_�P�c�8�Q&�^9R�C�Q��=)t�\~�@%>1��LĐsծ�l[pJğ�(�������]�g�����HP��<?pJ�)Ryv��ggu�by��`����I��)�
��{'Q�ӻ�Q1�|R���A��h�ꪖ:c�]��)7o!Ѹ��xČ��M��A��P�p��W$s�8���#��:����v��vtTY@uvQ���H!d�-�O039�LPY'�)c�=�U���U~g�U,��EQJl����1<��T΋��˳�5����x��yX./2���(�;�YNʢ�)�8ȇ�.Ǐ��ʎ?�Z��=$,8#����Y\�O�N�ׅr�WI�,�H�I\~�rZ�([�j$G����$�|�A2;1cX���킒	��t�Q�̶^��,�l�%��6�mo�{�+7��ʥ�[oh�ƣ��p������_<�@��'/v���p���E��f��������N"���q��Y{@���o^Y�+�Z��JNWM��U�s8:��{�H�q8�&�)Yq8�Yێ�2n�k��ծ������P��:<Z9��W�x�gez�
��C��x�f��0��t=m�����
�*~���S""]ktt�����%����h����a�w�9��+�0�T ��Y�#�8���-��Tu���d�,]MQ����=���I���������-�<e��T���<׿�*�U}mmG�����%�DmJ�9jf�.	m���UJ���RZ}������|�4�8�|���*�����	���OQ�mF�ςm��P�ђb'\�dI�)�V�	?�M��g�Eѥ�~�����$D|Ӭv��AE�t����Y�Pp�$��6�`^]̏��m%E�ӭ�N��g���w�Ж[M#��^��q"�8�>��<x��}�J�h|�U�V֧�-�\&~Z}�3Y�~U�w��^�g�G�+4�ϯ��߰%s�kc��P�
E(�����4���u9��t����fr� ��߀����T_���E�'��i��;�܅>m�U}D��N��k0�0�rv�׉�T�j�&1�LIj��y�T�~��E:(z�?��Ek#z�0�������g
���&��o\�A}�@�V�ZB/�SUЉ*��t|YȐ�?�{r�<����o�C#ư�IC�(�Z������h`����|�s�c��{��{��C����]!���빗0�51�kھ��\:��V^_忤1��ʐ��-��vςF���%upz2��-d��i��/��Ղ�6�.��?����]*��@*�?Tmo�M�
HU\)��/M�;�UA�e��Ց��/E\��i�^���Va�ϣ(������6U�>P�Ă9l1�D6�5����\	�
e��G5+T���߸	���pvx8=<�7������&�
�i���RGȲY.t�u���|�dE�ϑ-n�$~�B���=E���(�z�joG�SƇ���>����3������gn雀t�;�E�
Ě�Fq��pǮ���J.������f ]�?��%Y�^�^+n����A���mCU!��4m��k7wq��ߥi�V
:l���
N.�,���vOӥդ�qy[Y��{�H�'?���y�b�r�Pg\)A�`�����$f�o���y��^)�s���ƃ�p�Y?�͔%����% ����鿑Ѩf�19�L�����N�I��p\x�أq���eDt=p��?�i׾��1�1��,��F]�俥>�
(�g��q0z�Z�4#�KS���Gح,�j��d�_�mIeN�,���"Dc���>��}fK:㤋�T
N�{���h�ib��}�gy���.N����e4�jht�ȫ/
}��m����F��#�]-[�?�`�8�)l��Ē���8?�Fʚ4#�Wh��פqP�'�+/���ZM�Swww9��/���1G�.���s*���=6��ԕ�煋*��G¡M,%����j,_�໺k'�=�sV%��
��@��F5�S�'��v�Q;b�K�d0o���2��y�&�ce\4�l4]Dn�2��G�<�>΢Qի,�ۏ`�To8���.uz��}���)'�1�bx�K�^��&���G�
���e%J�@�N��H�`��#ZIM�8��$R�z�''t����qfT�js��[`�!�	Ȅ;Q���w貏�g��qR��s(�3frz"��H�!^�mQ�j�]�����sUw�|l���f�
���i}�Y��x�������"�OΓPGy[�D�pWY)Ɖ��.�amu�J�<1�}��1f/1�ꔪR�����&��͇p���J{x|�eo�c�?S�V���6�1��DŠ��ōNW���~3H�8W�F�E��J�~�[�e5=п� �s%n.b�F�z9����b�r�bQ<����T!�����eF��s����v�}��3�ox�9��`��Xs�r�qoW^kα�#��v•��Jf��hz�1��R��>�k!LF�Z�v�g�Y`㵫W����t����ߎ�I�*)��\Fʩ™��ᱲLJ��5&�1�;��$\��KŐ���A���DAͦ�H�uǟ��7��XY7�9�G�>f<=��>��P)�Lh�E?D��0�t	�����v���=$���#_0��kcО�z!�a%�r����A
��"�i6�n���R�� Xa;N��0�T�B�+@�:�&�R��QY��l� �J�Oa2��9�hz��{8b��WӜ<�����x�H�S�5��&�}�
F�%Ru9����LE��H�1q�&�]���|T����ZD����1Y�X������OF���Go�h�:v�d6�"��M�l���f�Te��n8~i����躿�Ĭ)�Z�iP�4z3�JL�'���;&f�V���4~���:Y,ydg%Vm�n�xz�?��a�:v#�ަjU����'p�0�b���Tؙ2A���d�P�(φ(!W�~�$�β�YU��J�	p�QN����^��J,
1�����c��	��(n�~�vӞ�ho�(��0?�3()�X�1�Tp���d�W		5���9��/�5��GG�g�?W�r<$�)�k{;�(�^<�rZ?*��$ď�y��3�mf�
��󉠲4���SxxU����n�ܟs_7��5�D�a�U��H�B��Ƶn�}^]Yo8��s߯*0������P�u9��7����f��^а�T�ז�ơ��$�J�]>����B��'�.���֑&U���p�ͷ�G�F:D�P�����RR3�̒��Y�=�w�S:tGmg�����H���X�tjXqt�4Z�Q���>�C^�%�k�5���J�w�U�Q�6額�<��`3,[������M9m��O�}k%c)�%�Vf�^m�r����
�k�z��tO��B���U#�lu��/y����ٷ$��Yx;z9�_N@yQ$
s���8,m8�����@I�_�y����#G���nyV�A�����F
�,5�,��
<s����*�G�Lof�IB�MN��^6=�Sݽ{����=��ThZ����Q�����ͼ��n��*�y�8��zu��`�z%���*��\&�җjwݚ��ź����P�n0+"�jJ��M��C�P8*}%�s��f��w��
��y=Ē.��).?S�	�)r��i�q*���iE�S�bU��^�@&@��y����4r�PP'�t
���(���Mt�ذ��;��b��_J��Am��*�ق@�Q�Rz�	�<͋�����D�;H�UR�i9�j��1�:�����}�2�ۑ���d�5�]�c����5�5V��7���b	�m�J%a�[���z=�#��F[���'���%���x���iڎ���K!Vz�'��Px�ú�_C�=��ϼ�/.����j��Z����m{��?�~��
��$�f��*��B���W�]��+��{���t��U|�&���xY:!T��x�*ඉ��܎]"�]d:�Km9_n�|�k���|-*E�`<:E3n�8t��9l�+��?��|��}ǂz(P�T�vA.?�S��ѵ���ZTk�I�}T���\C︵� z�l=l}QV�Ean�l�(��5��ߡ�j!iW�<}9]]5s�BP]�VP�v�t�Æ�E��?7����[��m��m9��=��m��d�pő�#��6�V�EXhk���!L�0�*.*�VЃ�Y(�(xk�k���)\q'עN@�	uh�?V�`t�V��	�U45�R<���^�	���]E��T5-�3��Wm@��T��G�.|�� ����f�x��E��8�;��y���������
s���<��V��L���-�o�4��4b�l�Z]!�{�I���BN���Q<�+�l�qٲY�mN�=��0�u��w��B�	j�,��(��"�����`b{��{
Ƭ�BH:"��Z#q�*�(_��0li�����B��v)B���]ԫ~�}�I�h��೨��
�OY�v~�k�a��]�e�C���j����t�����`�z�i�v����~G��=�m�	I�O>����c�$�!k�S��ػ5Y�ŨhO������Һ��f����������eJ�J��J�,�-+��>���@����B"��
��4˂�Ӭ{�	l%R��CG���5��|E��;P��./O����'��׻/�{���˿E߽~��E�x�ǧѫ_��
�w��7�����/��B��.βI�Q)��7�q���h��=�~�9��/ov_G�?���w/_D/��_	j��7���2�ڤHe���J��q12u�U����ˇwdQKk��ķ��HxD=�~D����:�_��J�F�I�m8��fc���A�`�UV<�hjf����	D;����tʓ����@�z�c�莡�pS��� ��6<��P]>6�p#����|t̼H(6���h�#5���jN҈F���4jm��~����D��Ѻ��?ZO���r!^	Tsc]�3���n����%�+o
ޣ_�W��0\�qU�F����i}��`9��N��9#�-��@E#�p�]n�87܎Z�҇�$W���X�<Z����S�,�l���$ʏOC4�(�L��B�`����.�:b6Ff:F�|��	�4���6�#���K�
�݇�"�!RyuK��(��a�T�2�4�[��+컐�n^��V ~���m`��=%��sN!�6��b���I��>��+�4�.�m�OK����0�
�o��6X��0�^H~R��´���;�دQ�!
��o����1����i���$Ԧ�a�.�*�%�%�py�Ԓ�ֶT(-	ϲn6���X|�S�{Ѷ۪�e��.c��)D'ڗ$xm+Wm��<�'?��r�p����]N�*p��Fi-8�֖�$�F{ޭ7��C�[��Š!q�\�^�R���]�ǃVta�~�(i��5O�11�_�"��@8�U�&��
b��
�0��!B�*�J����8Az C�u��t���p7�}g��Z���zh.V�������(��"Ҿ���zt��t^͆
�
�.�Ù�2:�{|/ōR\�:c�rK�
E1b3�G�RE��Q,�h ͦ&K��8;45��?�Y� $׍����p��0�SL�:i;�7�����P�}�YYA�J4�ttF3�=��(}��t���X�=��&���.�_���h*�I�J,'�3b�ճ\�M��J
��A�h!�����?���§R��/��Ї+'^9��%C����U�Y�`C5�~5��n�JU.5�̬�B�j�b��{^8TA>I�6`�Ќ�&�&��?��qɘ�QM>ܣfE3�8��P�B�����6	wU,�>T��\�`��>���f�py,��T���
,r{�o���ѭ��^5�Fh�saܲ�a0��,�¹���m�������_�q�|o��ք[Iӄ�������H�+�	Kk�(0�MV�
i>4d�*s�4�L�||�KI��ϳ�<��l*�
�b�Xa�Z��
��k��$�&�Lr��
*��s����9�
�{�O�'}m�I���?d}!㱡J�p�H��ce���P����h>�9�,9[^�E��f�W0�gv�L����IE�Ө�)na�d��o�Ul[�n��kr��(��bt�o����ټ���!	`��<��mS
���mIjQ���Rķ�,<���w�&`[� ?��P�m)�R@q�I���w�3��l��T�KK��}��K��x/c��
�EՁC_�g���r��:M��ވ�#��n��7d�N�*��S���-ͯ����L�^��2�%6=��V2�y�9��.�߫�-��(��8z���iN�Qm]d#r��LǓ�";������vy
�QК��k5R�k���	��pDъ{p�P�c'
(�|;�hz�]������BUŤ�/�`1�U�"ƶ@E�{!����4`�/���;)��r�U�p*����
�
J@,�#l��A���P2�b�[:+��G��H^�h
����";��Mr�(���V�c���W�3��Rٶ�#i�4;qHH�
1��u�)ACPv$R)d.���ऀ�%|#���	���v�Љcf�{x#�:��1x�s�Ҁ�
��Wwx��$�Ӂ-��� @��V@��&a����o�,��6�K����o�!cHK�M��׆g1?Fg!�r��m[�t�Nܽ,�:�R�<�4.�2���a�".��lO0�6ʂ�I\-;'`!�r=�}�S|k�,M5��2pճ�)[����O5�BoȼȖn�.D��"hw�G�		5o��K�j��U�]2��=�
S�74�SK	�bP�Ȟ���³�`O����듪8u��"���0��[���܈�ʔEj�r�ڴ^�9���ŽeOA�����I��9e�9�F�,�ߎ�=Bg�R������4
���׹2�+�B:�#�c,����t�Ilі��F������,��Y@��ϛ���"���[ƥ�ŌdL0%��v���c�Q��1���+��nV�,9&	��	�T�VT��+�C�E/�W��#�m����M���Ο�ޮ�G�����Z����yw�̏����@���G�X)��X&`$�m1�b<�A�nK�F���K�(M
߰8���*m˘/.xH���%��`�.'�3Y�88F��w'��
Yje����épD���Q��?�Ϣ_�8��m�z��<��V��@�PddAYw����= ���AzX��@\�Uv��C
�>E�p˴6<|�>�@ŵ��¯�Zo5���[��Gt��p�W_����3�D�]ɲ�x}�P�<y2ԝPW��~��v)ԝ�'�����M�-�kE��F��)����"���/��"�����Z���z�s���*,i��D����*��V�Fu����e��G2غ�n��-�F�G�2�*�����U۞us?���l�HSSB�����DɭSƂ(�p�.N�du���yr0^i{'р�|�MhNj@�;��wA�j���W��n��ֺ@
�e��|�ZAL���H�M���	;�Ѐ���awv0�,��G^�A�ʭa�W<�*�k� C�n�{��2e�p���oA7ʓ�.A�M�)i^�'�9�+��
�
��r�G�s	Ř�s�C�F���{�����L���N�K�h��09����8*m%���<͢Lو�XI�8������(N�q���՝Ap�T�		��D�|3�Q�*�;8m���{�Ħ��^U�"�yQ���k.܈Z�pc}}��B�\p������DO�;�sh�ş�(z��/'����������K?���+�5�Ź_���\���YT\�|u�Yq�U��)�C��V�b�w��|0@2R�}L�?>��Oj���V@m=�~�5���?�|BX�
�W�����,��ɱb6F��ѥ�B@}�eI��yaP�7O_��
���\VO���aP�0ϴR���J����a�*Al���“���~�"N���E��d6�燌��B�9���cshή�	�ͼ�\�'��Xf�`:ī���MU��7~,ZQ�סR�?d��0����<�i��
w��(y�ž��%�=Jm�I\�oo[ɱB�[V:�u�([�����]t�
���tɄ'&���͇�6g5X�VB1�^���5'&��¦�
��ռD5#��5Z�
��aM�Ί���x)�1���J�%���/�Yы��;�P����k�q3R���(�ė�=����dU�=���R�����B�|F2L�T��#p:U�#U¸8��s��v���vjX]���
���>�a��^�L�=�%�`�)S��*1\t�X�&�з�e/�E0�fț>�UPe:�ձ�}_$�ͪ�8L���gӕ��c�f�t���ENv�v�y�n��2�76\���KZ;#A��lm��mm҆5A�,v����MH�g��
�+���'�B��PTZ�Ыp�B���sڴw�&OJ`'�r�j��TǛ��z��-�&�2=Ԃ��t�q�:>rr�
��H���uiQ�2
?w0���m�G)�.}�R@_Ĵ^ێ<eve�-�)V��o@��d��z'�fx|�+>��8Y���3{㴎���I��ŭ<7��`����H�<G����!b�Au{m��7�#�(�}����m0'�!�T�@+�M�0zD�t2
<a��*�.[Pz3M/�io%E�*�)ԝf�R s�)�W�Vn����']�	%�V��F����A�^��1�\'�w��%���
�^�$����(U�@�/�J����
��$�>ZJc������8nF��o׀���ʀYT�P�7��J��s4���7�)�:~�v� �YJ��3Rϡ~j*��zD�Ӷ<-�\�h��ڂ���1���9��8='��F�k�›f΁+�0�.J�~|I����cR�u#\�l�'?��4܌��4�	R��($�����¸
��C;�]��
+ �R��Qi�*�����U�7�0�� �9�Rqێ���bJ����ОL�Х��o�<ڿ�k_�ݰ�	�|���:��3��e������*�4�TQuQ�J7e:�x�L�3(�'~K�U�g*Yʂ�y��bYOGV��W>w9Ղ�*�E�`�/��$����Ğ���ߎ��~�LJ3[�d	�yЩV�C�#Eyx?|#O�%Uп��_��
�����������̵k�

�]VsI�N��5�}�㵇ޔ����r3���\���^�|���J�vꋓ� ����V/�@C��-י��}FL��h4���9�D)�b�4�AK�[���0�QҖȒUY��ll�cW�[�0�-�{6X8q-0΋o~v��8�m��{CyG�$]
�6���1W�(�1�z��kl\���墭��f�t���p4�[{j$oB̈\�Z�]|Āan��AQ��4��2��]�i�7��Q��,��]`#�5YY�$��DŽ��]Q��63J���
�1)�j�w�~:ϋ(���an++@�?p4�ξD�{W���3�"r�F4NЋ����
���@�&[��c���/Q�&��=�+�&E9��L��|���[�QTpL�9�9�n7Z�p���}k�N7˝��!>k����n���$��իY+��m&뭍�(V7�C�nc;�Q���SEDoE�����:��oН*�`�P6	D(8��4o�R��(�+�#�O\�{�F=�W-��u1޸��L�
\�XZ�{�����s���
q�����4L
�w=u!�GY�W��vьYE���7���j
Ьߗ6�^>�地Ѻ�Z��0V�G-�NV�ྑx�a��h8�e�m>R��ׁ`�z�5"	�
�J�OE����h�X����n��)HҐNmk����h�r%a��a�����e=<nn��к��ȕ�h��xŅ=�
W��?�z��5��|�5;L��Vo�!�Y<�u��,=N[��|P�r����1�4���F�!�C��å�#��z٥�,}�̧ߗ�Ⱟ�����c�g����gi�=�7$��3�À�5����HIZ�L�%�i~[:H�2��%��4��fZ��+栀�h��,;��g�2,��l�qq���Awǃ�p��CR��}��`�������x@ƨ���S�r<��IF�7��uGYM�TS�u��,��Kr��l�UѦ�����f.�.[������	_+�}>7��$�S�s�WWkA`�!�޲���
swc@,z�6�A�H��7��:�c
y����&|ǁ��-i��z�%����i�B6o����9N�J���Z��&.qu������٢zh'���V�/�(�y9��oI�W~�+���O��OHݓM���	)")]��9�G
��^	���OW�LWS�RkAhʭ�
	l�8�~�]w�~
�pw�A~��܊��!ʁ1>�|�"i4F%�:�E,Ϸ���hq���ԲªMU�ĕxno��`L���:r�֟��<9����%�#���k�h�K���q	jr���UnoPS��;ΙȇEa�3�Kc%hk
�?ێZ�Z�}�֥Qʼ�'���pV"�m0ԫen_�k�B�,<V�yv~����ː�F<YY����w-�j�E7�J�p����x>%�G����Fݴ'ĩ�ji���`��$ENz�+m���#$0�dxz2C�}��
!u��ͧZ�MZ��Ϩ�e���Lf�Q��"���Z��	L�u�t��l�Y�(u{#�m+f�$fV`����'vd&=��5�zR5)ό]�m��#�o�����MP��a='`�VV_�hM�
[5�|��Ǎ�`��4#)��H)R��9*�S�����b4T��x����w��0���{{P�t獀H{	�2�d諕��
tA-.ǹI|��,�A:��g%�b2I��ЖD�7�F����!�?l ��{�'P-������
x_���Ii����1� ���驹����T����4�8)�m"���K��S���<Z��T�_�p6P�ag��W*n�l�ޤP��� �7z�4qְ�����"�c��3<հwTŭ��Ɖ�ͼ_�����ӥ2{5�1JM��.]`���C(��8#0	[�7G2B;]��arT�Nk|�~�ve	N)�Hի���E'�=�^�a<|��t�{?Q1������|W3�3�*�O	�/�Ёc��Q�VE�3��_(����pڻ����-mF!�������Bj|���e<�8݉X��&�&����S\f�XWzb,_@�D�"�b��@j��<���<��b,hU}�(l~�7��h���SF/�N����X��]3Fw��w�iܝ�G��@K�8h�uⴋ�z���������ƀg��M_;�wa<s{cx�(�
o�~PKZ�)�@3&@xJ�@Feb�jG�</-v���E剱=Q������?:���At�@"(�!�LWo›���8�S�K-��̤���	o��B�;����P�[ɫ�n�L��*
���H�)+���/ҭ��|�RO�<��~���h�<�z��~�dd�}*���[��R�lPM=�}�T�f�l+�=ֲ���/������ɋ~�/o���+/�T�
-�.��I$�B/�C����i�x�
N�r8�])������2L����C�5����������'�O��F��%N��u�V���v-�����'��*�˜)���*K���^�و��X�F��$���"��Y�
4�-��8��x���w���R�X[h$��m/b
H�	�Es����Vб�L���G9��*�����s�21!����
�|0��(��}��fL,/�J��:��ΐ2�S�kd�B_�y+
�D�9��BA. �s��h�K}���M��޼�d�~��i��uF�z��6��8���f/`3^��r�.�}@�ipD���K��c���T���k𪇲�q��ڻ�m��ؚjoL�9s�^[o�J�� ��6o�qg��6��XI!�,��<ʵ֗��YL��_�Y`��5��s1���]���N&#�F�fjw�K�8����u<��/t$�Ց�P���Y�o�C%�5��aga�o�i�~��YL=�ǰn����,HIv�|BZ���%o+�L�t�M-7�% �ף��(��IՀM����Ս�}=l,k�g�~�K?
�W�%a���Q+^u���[eˋG|5�����I�|?��U��u=ͻ�8���N�ce�BQ���jV�Gc��B@L5D��VXfQ
��YM�}�������,28�9�x�҅j��THMb����h��p���v���hm��VQ�EO6�@�q����_�XS�>q�*/�T؜Z;S͍u3H\���X��PV潼�@�)i����nӾ��=�GX��J�ϧ�C靋,{�����M.I�0~M��O�,�V����]�N[v8+�Tz#�%�J��g�EP|ԫo��T8�ȃ�ܙ�88Ќ��f��%�ܥɖ9^����D05�V%���I�W�����w�Ǘv~�c��$6[�#��ԗr4�d�9���r8?T�7#R��>‹I���c�sˉ>2K�7"��Z������-Q�@�\��iq�"'z8g9W,CU��Vb(��:�mK�B��"������@�`/B�$�C0�N^t�I���^g�S��j4�w�R& �+6��B�����
/������i�d�ٚv�v�LJ�8��ߊ�3z=�ݾ(�6#?����$A
Q���u��y�=ul��y�{n�*�r:��HmK��av��1�����2���Ŭ��?�4ܜ�9����@�Na="�n�
`�0&{A脇hfM��6q�����9+��Ì�,�n(*�
��t�h�3��Rw�6��x0Ȼ:*�������ᰨ�=e)Z����]ˀ�c�!"B��X�A���_3>��>�Gd��R}��b���u�$UU�(�FS�*�Ŕ��ž�Y���o����+�R_�~N0���Ӕ�����L��&���̜'C�Ǖ�%��<ֿV%]�i���M,_���#�h��0��80~�ZQ����� z�����wZ�����cTl�1��)��G�ڢG�V���}���N)29F�G3�HƳ�x3ʚd_���|l~8�JA�*n=S�Ih
ܩ�0>�ڛxOa�8NXP�2��
���(T���2ܵ{$'v�2g�b�f1n`�AL���&e@<3sO��	��	)��%���8���tNv���i���Ө�Z�S����r4�����E8b��m>�ި��M�Z�T�s�M��Нu���0^�h�n
D�!�n�9���W�8���sʎZ�q�)���<
x&zZ%*&�Q/E��
Zh?��ւ��^4�	O��k��nC�or������m.��$���}��Y��@��-Q�)���7v�4���3Z�v�1%�]��_(|��(r�І"�y�����כ~�����A���^��U�bKy�R��浿�j��HSk�7�oܿJ���8��q7�<�''��XE,�7V���,fz��^]�؇�-)�*���w�b�8)1�Jz-���1�k4�VW��<+0�œ�S�TJ�֝��_W&��|9�;���@�o�8Qt@�7��p#J�hYs��<S�H�}���Jݡ`�l���M���\���8���iL#�w�hd8a�.N2H�x4�����KK1�(Z=F$�hb�@�}tnP輵.BX�'�2ϳ��8DcX�&����aѭٟ�)�c�WQ=�0G�z�9�G���&�#�:4Rhx�U�g.:
�d㤥V��C*p���WUEmzM����eo*�.��9�nj+ ,��������S�O�-<���j"�;6�a#�:`���#�GVu3�bd�h��x�Rj�|�xU�5“]J1�����:�
k�K�⌿�l�{�N�L(c~���q0�?�a��EG��Ԇ1�f��x�4�p�#*0�*���T�aC��$�R��3�
�D�!H#1�&RG]C�(���Q�|�/Ͻ<v{WzHn챉�
�s��<)k����5n�"��\�n$�"��)?�Ԝi�u��6q3א��XeǍ5͍�xX���x3Fy:���}&���+o۾�]
���1��1��������h�(a����g`8����
Y��3E��X�m��2�:މ@�E[�$���N�u��p0�dl0rX�X.I|�q��
�a�;��B�)����H��w.@��jw`((p������A��a��(�t-,*��Z%	\��d�2w q��n#+l>
�	<یl0�|ԓ��w�F���y�f�'qG�C,-6�pk`Y��V���� ���Dh���+ڳ���|�����&�ۡ�&���x�Լ�j���h�V����?H��_T�Էh⑳7�Jz盏N�c�fT���G��5t�&)UW��QϽń-gdG
d?�`�3f�d�T�!$\��r,
W�+�x%q�ȥ%�v�M.+9�P��̸ycF#�{e��+�4�0��z�&�r^{'�G<Yx�pl6�$�;�an�ׅr����=�U\g/Оfߏ9Z5�,}yQD���:{W[��wnl�&��d�f�@n�m�&T5�~��1�ͷ�ѯpK���ș�r#/?���ƃ�y��g�v��ϭ����6��/��QbG� �>��y�����e�{����:��xP�9���W�����kK�a@��|3�7�i2�oUNq�r�2�x����`��>�*̂�Dž�a�� >��t���52}�`yC�#���K�5Et���"S~����‹��Zzo�/Y^�u�]�k���>J��{��@4o#u?��Uv��q������M�b��x#Z<���-d����Y�m�@��~����z��q��xv�/;��g�D[�6�`Z;\W���/ȵM7��;+7	�}y�vڭͣ�+��Ҵ��P�:�j�hT�#��Ϟ���h�#w"m�	$�ڞ�A�A����10��\�j{��;	�㟸���g~��S�GT��J�H`v-[�n$�D���<��֜bZ�$U�QuR�z�ZQ�����C���t:�(�j��3ő�D��Q́�4��i��?��<�1�Mc'��)}�_~�u(�5~�E��.�>=�|>�Ɠ_��l�����U��ʋ�����iH�t��F$�i�06UV�P5��>�e�����d�x�B=�NI��jt���2��i[=έa���쫑���	,H�Ɍ����%E�N��wuظA�|9�������A�]���n���h��⬏;3ے�>�	a�.3�`��ww�ܘ����&o[�9dјLY���Avi`88����~��
��˰��IN*�KmA���R�JV���s���+��k
�gݦ$��T2�O(������]) ���?a�t��2˽�'�=M6���9w�/L
%�Ү̊Cw����n`��S���ZK+?�A:�\�)��HY��7��V7�D����U^���X�Ѱ;��Qչ������q��Y4����½�R�*?!庫B�9�Rvy-SP�|�?�D�`�S��FE*<�j��;,UG�B��0����O*�l������ȕ
f���6�sLȉ�7V &�{��DJ�;�HTvY��)QUn[�R!s6�7�LT���<*�g˖{�����$��E�)?�g�FIy+a(X�6C02kI��n�b�,Iz��5G�s?�̥F�`�~����t/l<����ۇ��%<�#�����ɝ�#E[�����WLq���	�a]�*�L��</0'����h�� �5jh&���\�WC��z]J�^�/�7қS���4z�/�Ӭf�bq�Y�.IQʮ���B-�D0����~�P:��j��h��e!c�4����
�\^��v��z���QHܙJ%�z)��N�r$���s�׳^O_�QĄ&��S{�~��6C����z�Bӷ|���:+��$����[�`Wf���i�'5#�p�k֬٠SjQk$�uY倜hDp��)�K��Q�Y��
���`'�����
�,�kN磃��I)�z�jEQ�EϞE�Y�ދZ�[j���2�va&o�$��=5��0^F�@��|�S<;�[,�td1��g�<�a V�1X��Ȳ���;����1*Ɣ||��p�(Xyi�(|9��W
MY�tlQG�2�pl}	?6=�o���������ޮ�������/�{������k��?߿|���i��&V���3�b�/O���~@��i�o��K�Z��P����2��?�+2r8�N#ͨ�b�l�
�EV�yz��(s����Dt�����:���ڲ�� )0=�2'�.�;�0��|�&��Q�,/�ۮ�֍-���8y�cvF<-փ"��a�m�����،,��I�vL�j����tXoJobuL_�VƜ�I~朐򶘻Xޘ��<��ZW_��&�F�!/<��NΌ�`�[tE�/{P�B�٩{��{yF/([�0��W����9@Sӌ�	a�~Ë��/q30�0�xd�>o*}�M9I�+R�TĎ��?�ŮŝƦ�aM���SF��_�Ԩn
|�4G�[��J���[��d���߇��O�>��G�Qe'�w[õ�c0� h������M�Ge
���X���ޮ�'{;��NF����؇r�w�Q�VJ{ҵ�[��:Q��_n=fp�D�QK�,�%��4H�˄��:�@�����߉��gI���㛾��ز�����qG�8��8%�)�..���;�#Ru���e��z��`ۺ�3j^�s�
�S�����V]�Z-Pr�v�����{I�m�uxLg��ON4��Ce�q�2��Ȥ�y�LiP�Vg��/��RFյ�Yo�#��Gʀ{$�i~���f����.ݼ��}�,�xǼٺ��D�$��|�>��;ō	a(�Ra��+���?m4fs�m#K3e�n�+Y�?:׆ߙ��u�3>� ih!����1Ģd{�!�Vd��)o���Tz���ɠ�G1�=�T��;�q�|1�#��f�����0 ^M���HO��ʓ���N�d��Z+�EZ�9���[}_u�Qf5\��}!��KHZ��_əVa�����gb�6Q&:X����L�sa(�,tQ���2��N�C�˜:�8�4v1.7�B���M��ṃ�
��'���̪f٩h!��*=ay�B�V����L�481�,��’a�ғ��֓�c���¢�1[�
ll��f􆝇LLL��D'}�חKٯ(���s��Ъ�@>��)���u�}�s��ͨ��w��$�O��E9�1�Y��rv&�!�9�z{;�h|�ݻ��`
����|�΄�&<c<on,�&� 6�`C3b˦�I�ģ���p�\O���&�O5�����F��h�|�'��9K���2��(�Z
���C��Q�y���e�&���t����Ǜ(!,�|���u�i�&'9���y{0Vr֙ʒ �VU5h���d#�z+����������r[��l6D����o����>z�JrE�d4������ߋwZ��h=jE�[��@�������
�����*�����1U<�#���P8���"<����m%l�H=�]���2�H�#M^+L��>"����s��W�J�.>�2�hD��:R=�k#W�!gy�c�n�qpj��'E}y��R����3�����r
CAM���&%@�P���Y�`��BH;K^�ȭH�o-�5�U	lkK���9���d�#��<q��A"0qP}��MjTO�a�()����W�߶���-+��E�7Gemt)H�����f支A�=�ua�A��*J����D�f���#DY�>ێ*���>m
�˛ʷBӢ��+2�����
�y{���$��%�S��
��U]�V���#�O9m�#j��۵ZI"~�&�7�B�V�-��7,*�1īZb4��A2j�ON�]t�8Vq���N�b��Ӊe��`#%,V�IM��m��f���Og��m� �6��(�t7�R��t��w�?۔�hv"B5��B7����'�@�Îì���+y32�Fd��Ov�b�6����:�����ف����Ͽ�� ��#8ԼP�@	�g<%���d���m���+��z�^E�1�����M�����$A7��	<6ZY:|��<�(�ݼG�!g}(S䲉�u]�M��9��g]����xl�s �}w������B��&�#�R�
rN|�1ב�z*V����Oѥ�DId�漏0#�SHך*}En۱�.���M�O�N�u'�<j���lE�|b�q�h�Q�E�=���Vb)#I1e��xԷ�᨝�8�'��Sü{���Ő�~�hE@��S�N�D�E�UC�Y_�g�4'���L�M�(�dE�k�^k�N�z`
O~t���4����N����Q�/
��IM�oA�m^�EЕ���h><ȧCh�f�>�]Z�*�1��z�z��a'tw��/ ��ԓo$k�)a���Yb���s}�j�v]q� 3T]@\��L��1v��n��AY���}@��� �l��c	bc�[@��LPd�-B[)l�,�lw,t*�*d�r�j�ԅR�j�BX�UL��R�v�[���u�ۻr���$����@_L3A�\����ʦ]��3�8��,��m���0��Q|{<�����*k8��n�sijV���,R���pF�Py-���'	�;�o��gqn)�ʂ�ˈ�)9���#��
�l��t1H�Ŗ¬3��c�a�l*HA��
kn:�Y��������>���R�[+Ӓ�
���{��VP��T�B`�p��
aVh;-��r���Z�����ݟI���ȩĢ�{�6ǯ݋�P�a��r�*�5V(}�mXI>Z{p��mxV�66�V�}����1P�p�Q�+%i��v�Q�֠~X|�|���ȱT,�Ѷ��J���%T�����ZG%gN���G�b�gi��k�%:!WM����MU���Ԟ��,�O�� �#jϦT���]OЃ#р֢3���z{�p�ƝI�U��~��Bo�'4.�-��`q�(�O��ގ�l���nĔ����<�'h�RD�JT�ļ�Ӟ�m�w��	�eo��=ehiHd��vٹ�L�Xxh�Bx;����j<M�P�	���I��21�k-�T4~��p�U�*�)�Ȣ��88㇪F/S������٪���NpG*�/�jmUTl��D��mӒ�\3�%W��K~�]Xv�[�H���iD1��8��`�p�l�9����u����+���[.�;h�mo�_��(�a����w��T���U]( ,~�Lݶ�wjq�<�|S���G�K�c�����Kֳ���]ϷA�����M;r�I,?`M/�����r��%ͨsm^yf��}nuYe� �ijN�(�$�9W��7�V�_%�����\�d�WR��eeP�8
`��M����"y痲k=�jC'%u���ZGӛ�'�>�d��/��A��&�a�5���*K-N��l�����G��+����!�ywt�N�����j��Z\+E�qbO��s<7�1)	���T�5X��j�P��kq-^���uaQ��S�互�|�>:��JI��[|�cl�q//u�����d^�����^>���4���gq���8���4|�SZjr+�t�id��m�Z�E�n����$`��D��Ф�b�=T�~��P-�B<6L36`��	������^=���%��alUWm�~떔�_IEf$�)+W��M\�۲�����<`�+��B�3�j���ZBW"^9�{*�JN��&�i�v@a�lB�@m�[�|H�<�gy>x3@'k�	����l
��,�n���G�eɰ�*���Q#Z⍜?[t 
�K��1c^DT�U����#�UL���9t&J�����*k�!h�Ց�K�Ų�x/��tX�юt�I�}wn�q#*J��X�͔�)��FUs����>�ð0�:DW�*�0��{:�H��d0�A`�)��AG�,�>��852�8�T����Z
�b����qGt���6�ϷT0��<L׸]v�����5�!ÌI���i'u��7���c���Ԯ������3Ѯ���� ��Vw�v�Z{;�Nb��+]�U����6�$]�)Ű��$I�}T��Ƨy�Q�jh#�z�K*tk�?�R.��i7���0�Sl�θ�Cz�]��)���݀��}S.^n�ߙ�;g ��
8ÿ�З�^c��z-��s.���j_�µ$��hp�pX">ք9kX��k���wb`%i�#c��D	E���َ[� &���s�w�޴^�پ2���K=�(��*%?�}���k��5���)���_)��D�fJR�VnS�:����%�k�e�X��w�@V�W�D���5�%J0�>�
 ���)&�P���i�+-��>ӻ�U��K�Z[���蒑_ct����'O������v���}�&�1+١�,������'A
������ҧ�HE'>��/�y�?�ҡG��]��L|�[ϣ?��	�ߑ(��K��Ƙ�G�zY�֤t�Z��(2ߖ�eW��Z����Ʋ����"�]S�k���+�ǰ*�m��Y����Y��r-�j�?��H�v�ݕ��8Q �{���yr����؆cŷ$\�
&h�?�	)R��-��Xr�f�����̓�B��J���L�K3V�J%)w��_�����b�Q�)ϯ*Mg\o�FG�In,�L�M&*7gU���DP9�bL%4$b��a6�Ns�H��m;1]�!Fp|.���t�J��l
]��_��S�vm�׽� Q��AN�H���T�d��C����K~9��n�J�O� �-"���@vϦ��r|�Qd�i��G"?q����,�S��/�*n��w�N���:)v�w�%����y���%^_����G�N��������I��]��Ǐ�&��n�K���Y��d��D��g�>q�%?Lޥ����erzZ�TQ��"�<~�5��e.�b6�6O�&`n�!���np�y'{����;X��$jx�!=rO�F�v�ӿ��זVS����������(N,�k�C��N���9�kxNo�n��d�u�z����(1�%�Eh[Q���!�U!l�լ7�ؘ�͵���e8��FSd�7�$S҃i�4��H���*�	��+������a�>��]K�8�+��׎ܲ�^�vm�E������p���ߙ�����п�A��!\?"�Q~@��]m�U
oj!^�P-,���QF>e��~���jO�vX�K����j�1�@�g{�k�+��G~"$�ݳ�{�*ϧ���# ��U[�����D=��O�Ƹ�)�w*��8��gےߴ���~B�YR?��,������4h���]����FL/��א����R+QbY���f6Y��誫��{Ȕ����IN�J�6���y�͖�R.�%�Es�%�D�ӕB��w��PǦ������y���&!��O��@��D���"��;�ĕu����WO�����A%8v�
8�E��?�p1���Lq2T&:͋��_��w�%
��g�RE͵H�=�ZF
q� فI>Kߦ��B�\Xߌ�dIxE���{�fd��gA�̲�W�}qTv�i�>\�]o�����+�z�_O���.̪������	V��y�<$]�TQ���
��x6WE���!5�{1�Nk�	�j��H5��!�D�A9��?I�S8C��N��q�q�l2.bV/��l}Ň5�ćLĄ��N�ϓo_m��p�4�]�� n����x�׿��,�JYk�D䐰�&2��� ;�M�VT��ב�۟F*a���.��r;p��t��u�c֟�
L�D6��9��)r}�K�|�
O�
�A��kpl�O/�����X>Иc�a���t����}˩����z���5~��>Y
�xܻ/��ˁ�ik��U���E�f3�w���Ȑ�y���g�F��8|st��FcG,Q~y3����&8~y�kW4Ԅޔ���ְi�M���e���'[���u�����ɂ���'�c[�j���w'�����\������S1 ��WΤ�^7���0�<̽�@co�*��=t��3!m�Hw�Nӡ���8#�, ;�.dE>Ac%At/K��M�i�(�	#pʪ��뷺�G��q�k�1�q�k�Uq�qT���;�x�2{=�O����Q�ռ��7�;;�'ɖj���8Vi�D�NK4J���i�Y�����o��A
�)�I����-^2,Ǝ�~؋@�=�VN�:v5�7�D�p`4����9Hje�6�"�50��
�B6��
���Y����ɷ�Œ��0jT�G����2@�L�e�~��Ѓ�`��򮎢���IÄPT�d+�'C!~�+u>�S��a�ΰʣ��R_vnR )���¿���YYC�I��:\ª��0&�1��)΀Q�@+��	8�gS�`GsB�ݽ�a�����Won�'o������-N�߼���l�1�F+�|���լ?̝��@����ϟl���[�Ne�n[�9�k9�)���e?���s9�y�M˪^>�0tQ�;���m�N睓�}��_�����l��
�fE�
T%�IUHB8�O�n��Md\8�2p/=Y+=y�l=l=��}�Es}#�x��-O'�'\)���#u�,��y��M���Œ>={v[�Oy�-l_�[��u����[�?쿳N���������rd�CL�!_[�|]�'�^"w�a���@�̯
��p��w��Q�%����(�\l�/���}��߯-�^Z�m��)UZ�mz���)�-�6���˽�)�����eDh��drˍGn(ɂ��#b`;����t����Xo~�ìd
2�B����q�v����fo�^��2��*�juin�_}aI&(�;i#fK�K2�Ff��8'�K�W�ڹ!�0�a�YZ+�Ѱ�|�]��D�^�?�돏n�m9ՈO)��8c�ق�)�*�C��65S(T2@�ՒD����J��}6m��Ѭ�w��l��n������G����F�����e��N�&�4��{�����I�r™��j����[��ЭǶ��Q6���>�da��Q`�x��UbD48�m )��z�ő��:�R�����֨�;)4�P�C�'��`���S��i��Æi��V̇�\Z��G�b>4�M�<����{5G�j6�����*�&!K�m�…�=“vh��U��I;z�\�Σ������$e��'�;������Nd��F�$P���P{�n��]�����x�G��P�:R��+��;��H��D�e;ٽr
�'�MV�c����Y���<�rOn;WcEr@�N+��B�tb�5�ĺ���xńXn��4AC	����E�nT��MUٺ��P	�&���GG����#t*?�n}K�^�ҍ�zr�\^�~��F�5nZ1gz+F����?`l 7�7u3:���`:1#��;4��iY���4�HE�sy-Jj����g�{_ʙ"T�}��f	��)�5���_����c��ZE)|��8"���e�m��$-�l����?�[<�*}N2��?ڊ��M���#t�>�S9E7xu��/o���^�Q����v2a'3z��ɛ��ﺳ
�j�b>o�$��f��=�v��>�_�3��ݽ��Y��ݦ����g�����hք��]�����.{�#2h�
��d8ێ�qwظۋ��aF�	$��,?�j]G����po�y�$��"j5PC4t���3��‡�{��L�*�t��тT�D��cQ�Y��u�VQ���|g%��;����4q�[_�5�Z�qY����C��pjO�-}�.
3͏���ɨl�7y��(Ê�`$(Ƨ8�u�w��t�ց	7ﷷHh
RJ���Z���~�f1�΂8�����6�i�=�������_~�E�tu�3[i�P�%3{�CcT�hf��ƃ�G_������ڕk(�6�ѣ��?x����ۯ��oA�!��鷯�.�l�s؃��{`�8����a�<�e��uΙ@_�"d�w��(�^§16z=!y�Ӯ/)��At����)?٤��|��^�N$GO:�b_���ٯ;���C���*Uv�
v��������p�	a���z����	年Vh0��т�����E���:V���P���̉ξwU;�)âZT�1Fp���MҐ���p�p�6�u¦�{�N}�?�#h�֡K�	��ͥT�\G�S�X�98W�ju��M9�Q��"��fsE�Ry2����2��s��\���a��&kU�F�����+�i"_j���z��=O|72�(g"�C(�����$5���f��Oh˰8����4@��NT+φ�2�U�	��t&s�nV�-\#�9�֭
t�1���5?�{�R��QT}���nj�����J�v�Z�E����|:37�)�6hE.؎��g��7c���r��@t=F��$şL�RNP*0p�xn�����$U����?�:���t0�J�����Ӊ7��8��a�?a�g��(���z�	���Xº�pH-�rKEO�/�Zw<�Gꝫ�N�(nRXDZ���19	�>he暑r�l��3��i;�0"�B�Q�ق�Mgӥ��'��T�'SHv�������_�5�b���=�ϳġ�=K�\�d�Z5߃};�,*�z#ä8���ףX�C�`+V�!mma���&P@���(���3��c2t�:���o�o����p��j�̩�<�7O����,�{@�]�`���d!pa�5�F����VtD�=Y�2|֥�I��2]�&�������ޞ��e��ͳ�g
��-�8�a���4�@����pA�G~��
dg}�$h[���pa"�3��ET�d��X	B.����O�λ :0�l��eƘ΄ta\�ה�d�S2��q$N�6FZnU�;�b5��jĤY��[2�@�%�y.��2�a��?PK��mWZ�k���,pkg_resources/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PK��mWeD2+pkg_resources/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PK��mWJzBh*pkg_resources/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PK��mW�]�מ�.pkg_resources/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PK��mW���n_*pkg_resources/_vendor/packaging/_typing.pyuT]��H|�_�h����#�@a_��ǣ�5��Q�Î�}�gl���,�4]]]U=UU}t�zֱ�vC���'
QGk(����=
�<�~���w�0�iE���I&��v6Pt��S
�c���}��S����.�5��;�g��L�ԛh�l�W���n�J�y�g
�Oܳ�m;.�;\\jk:���|�t$�0]'<k!U�`����
�h�l$mb ��n�?k�����<��*�vg�
k�汧�	И|ȥ8�hΙ��y}hE+�r�����
�W��؀����5=6),1��j>h(nt����&��N�<(�V���'��A�\���Tt�b�����E����
���U��%�;z׉,bП�IRV�ubj�\9(���"�=� L}##�$����^���᭓�V�>P�Q)1�{��ʜNI��l
�G��{�+����%�i�Zd-���MC
#���.B���ɺ,E�뒬��zn�$�H��[X3)ɪ����*E�˂>��nn���?�����o�J�=Οn��;Լ~��|�R������&ְi3�m$B�y��ߪ�*�v;����;������Tb��RH)�� �=DAZj>BRY�i�����$C@;$���іl�i�<����-��קNo���T/(0W��<��~W�e�R���HaD2~�؟	���m+���:�ya�'��X�~v!�ۮj�k���-��X��en�!�U�x�o����'�����6���~�O�.�n+���g�5̫rh�y*�op���.�M�d��{ь��U�&�o闬��^�E���W�m���n��--�Bx�˹�V�PK��mWb��.%*pkg_resources/_vendor/packaging/markers.py�ks�6�~"09V8N�:�h��8��z��>��ܝF�$1� ���o�]�P��hO$��}A{�z�I��rF�w^Ӝ�ٌ��I]̙ Պ����$|�^�J:��S
6 7LȌ�=�29Z�؛��-LB�S��'�㳫�aX�1�y�i���\f������Y�ȜU4�e�[�&i���Z�4%ٺ�"�V�X��d��e(؀�"+*@(f
�3�d�+�.�S��
����Ȟ�[~\��I^��	��)�rSR�A���\�+���R��K&뼒"+�gyUQ�R������7�\�����u9 �pqO�|@�Q�ͯ�o�y��8l?�䔐=R�?�Yt��.�ʂj��jS2i!��#v���qz������_
�,�,[d`-�ʎ�IqG�l�F`�!�!
U
�\�!�q`>�|����1�sz���~�f���L�����u]��BR:7AFy2�ժm��-���)̂��D��o���D���Yd���D&y�55.�2��5+�3�fv>$�L'e
0L� ��JI��
�k6��x��}�{T��S�d�@�=l���9�Z�����9���|N.��ßGDz�X�W1�g�xӪb�̕�%wH�Xڜ3Y샩ե�ЬzB����0�b
˼e��y��"�H.�93�OQ�a[�3>g���f�aB��ʊ�J�H�|1�5��C�eC����k�R07�8���H��<�`��nAE
@܌`�6���O\�P�z8|�^<���~��V�G�*ݤ)<���	{��3����o`N3�@]�	�	�0�y�!7`�x�#�oK��Y����J���A��}_�
�����˓�7�c��H��F��*U��NG�~��?#���i��Vb��-Zh!�����>�G��Q�:��[C���s�;8�i:lj�q.���e��p'��>���%
�N;�89�sk|l�Vu#톅��g�>r`�U]V%�ْ�6
	H8m�C8�Ž�ӓ���ۃv�VYC�Ti�_��!	w��lijH�͢
k���ڱ6l�|�nK���L@�*�<Ril���H(!�����3�M�����!�-����_^�����o/�s>�`�>�G���=�rO���8�<�]�>�Lϑ��O�`\�
��O
���O/��9:}���y���"������D�nٽ9??U������s�e��[/�������-���=�0H����2��$t�	�����r|����q���2�{��TNY~�^�zLY99���q�r>���N|E�hfq@��+��;�*��(; ���^��ū��z=���8��'�Z�ait��	�.H�:`�jX2L )�NUu�
*(0Y�b�,հ��	��N��X��Ć��rɶh�F�&�:����Jl!�ѵp�fk�j-��Q����I�dj�[*MT��E
R�yy��8�U�U��ʯm��G���U��{FV�A���kz�g�LP�)�_e�6'(a��5A&���	�^�#�0���}I�}�p��t�?�4���ꌏYi��=	&���m�5& �9V'�a�
o��<��L�#���vH��Dn#;Ԇ���(9+�lLF#�"�ܢ����XS�6�N�A���0�@��TV��M��/,W[���,�!�Ѐ
IO�>�'xVD�M��!���o��H�7Ǩ{UZQ[r�&�ɮ�V3�w�Q
���f�M��a�7�;_��+9�'u�a@��`�T�z��2K�ʎ��af�G�0��?��:^��`8>6n{.�wb�*S����H���jMm'e0�Q�}��Ħ�66�@��o������:�cj�S����SC��{k�g2㐣�=�"�AM�,͆�,�#n��k�s0�L�.��]��]���D4�%�p�8�$U�+����W���U5�̬�,�����K��P����#4�&��vV�R�9Ӷ�ƌtL��`�Y��2�v�5 ���u�S4�d�.ߧh{@���hw�����W"xj�
��w���cWL�9P@�/,��-��5뒙	��%�v�&��]a�/��)�{��K�Fk&i�ޞ��z��4�eɊy�KG���P�u?�EY�����Z���v�Qۺk#YX�j;����xm�ݢ�F���Rs،�k�T�7�Ԙ�D�f�uٴ�}yNo�^Kg%�L��F�MD�<��Ҥ�*�,��k&�X��,�Vt����
 �iz4�#Y�|6>e�{�	�����P?fz\HL�,gw,��M�?��h���<)Hu9�h��\��w\QD�E�5��Ɗ���V،��跻M~G�d	:��L�ߣC��1S����l�fi���#�ޔ唡��T!�G�(Nv[�ţ��pn�B�j���G,=
���r�U+-��������"�ˤ�aw*K貔���~��2T@s.;ڪX#oSR3]T“e������<<sxp��a��N�����xp�7y�nzs[M�!i�� 쀷=e�uÛ~��G�������!|G�C	;�ݜvu��bvI�Q�P�$�M�x2|9�	]�!���e����K�f���ް9apk�	��WQ&�c��j��vR��L���B�.�K~�7o(&���Y9	�]�:3��Q��Qi�s�[!ʦ �`gI�gdH���)�yab����������V ��_s�hDVz�;nm�g�ƋH#4�.���S+Vv��
}B�N$M�s��E��h���	6�7qk	^ͦDŽ.���\�H��W�/��%���P�T70x����xU
�
�Kl�������G�e�-���?G��@f�8mBa)��I��jr��O
�Ht&~�ߒctX��w�O�{[�U
6;�"��PK��mW&y�I3A/pkg_resources/_vendor/packaging/requirements.py�Wms�6��_��B��s���續̤���$9mN�r`��R$�v|m��=H
��k�/"���.��d��
�M3F�T4#Y�a�`	��q"���)��%,�#��#i�;��U��<�lo�
O@����pMQ�0�g�(������He����-8��2c���I�f"p��ؓ8�V��,�I�/.	�EVI��I��T�#%Os	�|#��N-!$�w�g��.�Ŝ���&��σ򹤸f�#ᅤJ�y��G
��ҜfK�-x�� Ǣ�Vj�_��?�S>.8��S�>�4�9۱�=2(��iξu��a���� y�5�ϲ��SbLq�X?��	b�\Zxˏ�(�
�'�j�=�"+�q8����ټGƚV3��m�mj�؎n��y��{\0�(n����6%��=��VȜG�!�i]]�G���ɨd�?�,M��*�l�r�}�Y�"��5��?̑����'8j[T**��#�*S<[UC�E3�ϫo��q����pr7&�:��ɢ��M���y�p.��
�������h	���\?UY"���y���G�pM�;��H~�4��ǡ��E4��i-�]��F��=vfw���.\�����2\��F����P�����C�P
����A
�
�6��Ҫ(��ˇ]�pA�@�ܜ��~^���q��C��2���/]�sQ,�����K��c�h�P>1pk��/
�V�����-~�BS�oB�yNp>D��#�^��j-m+(@��A���!I𿙢1��^��&�y4����w��ctT��śN�����tյ��p��
�."�3-�G>i�Хt�<ƜJ>QL'y��fhn�^��S�:7‹Y4����WW�_�8�sw�	�V ��#!�����>�D�����f`��SX>�m91^�h���;_�z�j
mV�>�̢z>��VM�X�ױ63<�%��S��О�<�Y��E?�˩2�m@5G'\���9�2��ƭP�V�]�]U�g�t���ѿ��h�n^�WN�WU�w�{Ȝ�!@�p���S���m+�_�"!�yqF"�kV�5!Oe�)�_*�
%
�bARI�1�=�1�H���xu�ڶ4�;�)8��Z�D��=h��Ol#Cvf�{��&6�]�����5��R�'��"�g��<�Fuq��{�F��ͮjzf@�4��.@�Z�i�=��F�g�ɯ��}����,���>�\�N2�5�a��p�&XTr��9p�Ruؽ�M
f~í
�C�ba""��!��5g@��2���zɎ�b��4��k3�'��P>�����p��Ee`�����s�Fe������K¶X�U�ű'X���׍�/�0j���>Q��O^~O&6ކ*��U����ԟd�M�4�K��®<Ž4�L9�4v����Y��HG��_}ÿ�}�//�L�T}�#;W,Ȋ
z���$߮{xދ�	��t��W��@G�ZiЏ-��:�ӽ�v_�R��@�<x�LW'�b�����yM\���O,��\����o�ϛ��Qq�3ݴu�p�Ʋ�s|�z�6��Ns&�|_M�Ӹ)��G��
��օ�JW_�&��Xt泥n�W3R�O�Ϙ;u��M�TC�eu�B}Oy~�C5�B'���i����l�GB���7�_je��V�M��J�n2���&`i)zp@ɪ-���]]q�c��嗓���LYb�g´n�4P��'�-���}�?Uк��i^��ҹ���O��R�VPN3�I�3f��}wj��oř�x��kܩ|;8+�*����������Ӱ�PK��mW��)��|-pkg_resources/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PK��mW��'^'pkg_resources/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PK��mWJ�f`�(pkg_resources/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PK��mWPz��n<*pkg_resources/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PK��mW̛��g:	 pkg_resources/extern/__init__.py�VM��0��W�zI–�
�@�B���U�&��"���!�;3v�ܖ=�J�̼xfޛ�<m=�p����6���6�M�	���Fۻ���
б�n�|z�	^�x	'����-���R5R@/�]7<��	d���tJ�����l��!蠵�Vk_)q�r�F�h����J���v�n1���p�n�bZ�̏��G���a�����Pj����C����5~'Y�n(K\M'j�3|��lYm�"��Xm�a�ܡ������W�L���K0��X灒>�aJ1/)�T��Iyn��5��@Vfg6Y���I7}��I���.&�pılm�u����Az��{"l��=�����E.�{��`/�`�_Qa�d^�gEA,ճH�P��� TC�!?	�GԒ�j�{����F��X2�iьYx2��� <E��Dű�zG�yM�5?�]1��U���ֶ���G�*F�b���Do���#�͸�C�uh($��S\�P2Y�+cZ�hya���b�'_Z���~�k4b?|o������"vS+�ۭ���W�s�;��O6k��n�g/�Yo`{馴=q%��)���j��25���4ki�=0�`�a5��Z����c����5�F:o�g2�۲���3fk��"-�J�E�s�g�^�c,M�]"'2+��8|�:�7+�P�فGV�Hg����q1)�|v��>ǭ��31PP�� 4��KE���`.��Xq�h�e[�姾m�Ϳ���r=��V���SS�.����f�TԘ��軠��m蠢��6�ޡ�כ�@p�J��<*�1��]���Fs	K<�yj�rn�!��b�I?s�*$��v�^E9���PK��mW��",Th8pkg_resources/tests/data/my-test-package-source/setup.py��-�/*Q(N-)-(���)�B0��L
. �K�M�Uʭ�-I-.�-HL�NLOU�˕�g���*�@��2��RmC�JSu�4�PK��mW_��f
�setuptools/__init__.py�Y�۸��"��u���-�`\y\��� �C?���h��,*�����o���w/��]�������/>5��ڔV4F4;%�\ۦmta#�1�(d�U_2s�
�I�y���|>��6�9�My�M��P��	�LZ5[m�5�6l��[�e]�rkga#�Iw2�'�NյΕW�4�x����x�dT��~������a�	��1�w��L�˛����K����j�I"�z��մK�������P�d
Gy������jPb|(^0�PU��;U�V[�݃)��4���TE���x;�DL)Z������ò�8l���!U��.s�>�˭���R�ʼn�#��J������l�6�� �Jui���7���BZ+^�^�^U�2�U�Z6JHQ��F��xujv�]`
QՖ�8�f�K��P�>u��˟���n����6�
�ǝ��*J��P�����*^,�.���:Z.�?O�5��ܯr��%"�,�u��ЖSF
�
��;�<pԸ`��uYg;�s2	7%B����ٝi���۪*4����6�>�
��0�NT"~~��Ƕ9j!(����:z �C�|Z�UU���d��d�`\aOe#?%Ѽ6Y8	�?�����3/�ۈ��V@�"�%]�Z�w�X
��g��a�їJjv����k��$��iם���G"F�!6~����b(���/�ă�Y6 ��Jez�,�)�S'A�{M��'��T��K����=D��t�6R��Q�`?�U�6�F1�����W�A�a,�j�]TPL��&}fI:�9��1�B̑�XN��ں��Y�H}N}��iu�$%M���L�k��3�Ŭ�vF�$a�`���e�qJ�[�k���|���eP�2:�:!���Q#�f�.Tr�nJ,������9`��669�b{Q6�(̱��ޮ~�ۡ(��Lub����o`�$�J�U�`�2U�\����w�c�G���ltB���
4n'6ߴ8�|�"��[��2��^Lpj5A��hG�[y�Ī#d��LŁ�U�6��	��x��ՠ"4��<C k�潓���BBo��pe��O�a�/��۔B;xm/�b�:�P��e�.r�j*�����.q�c�ht�A��evNZ��x��R����M"�Uj��Cz<��z@�{�&�Dn���@8��!���Z��q�x�L���Q<�,��g.��?jtv�K.���,���F�a�#��j�n�>C�Ӗ<Łs�(E禛4M�S�x��q
u��&��]]_�$JTQ�5j{y�f
Ҍ��z�Q#��B�����Z�$�.�>;�;.�P��a�K.ȷ��S<�b�]�~��j(�:q���ū��z2�m���k�7�3Ly�����誄Ng�4�<�ա�f�L�޹���4l��`�+��
T��[4m�`<4ァ'�<�mښ��<��X�ŭ����蘔����pՃ,������]qpt�dx���lxj�1�Q:�s��S�gj���	��@�tK�`e1u�P�@��R���"7f��<�\x���%�CHt�+���v��eؓ�9f��;^��sVn��cr�}�p1����Y���,C�	9�}p
g�s\�&�A�cE{������U3N��q��WO��c2�n��~.9�S��{�MI�'u'�f�~�s�tt�Ck�RTȍަ�9�z��}�L\��h��96c���Зq�<��`�O��C���iI�u;�	%�J�X�0�}@�&�9�q�#����zȾ#bQ��$����O?�__��͏rO�-
�Q���S����=�cVR*w�*!��l�T���pbc�e���t.����e�|8����H�"�lU��%g<���-��:^+��ᠿ��3�I�i[ԁT����j%^����BN"�0E]���g��✹9���qBm�\R���'.	���@S�Q�`�{��@�	��7$|����@BU�����J����ZyI���ȶhV�f5��6����{���$�q��0����C�Aw����j�~\b��uK��Yb��FA��:;���#���kj Yoq�G��b.�x�\9f�_y��k}��	F�48�����:¿������dґ�ښ�r�A遗�2lU����N���Y�b�oh6�����4��m�AcR���|��%�K�$W�-@ ~�Y+DB��% B���y�����t?v�_w��^I�������N��\`�8�p!���ieEꊇ�=� wԧL�lzcG��3f(T�~��}���]�<�DZ2�>�dT+Jdڵ9>{z+���ä�^��]=�����o�{�CAs�B;͹��q�x���[Ù%87�_�Z�6DD���َ*So�ш��H�ަz��[�=/Wn��<\��0��j �q���2����4�XY���/Q�"�(�>�����a��y�s����ֽyY������]�%0tB��׉���b5�b�Ɲj-V��D�==�����
���g/f�8Y���YŁ�7��\4�v般��>�A��j%�
���c,�]�T���F��Q�u�r-Soohu�Fg�fW�{n�]��Q����xI:���PK��mW�J��"setuptools/_deprecation_warning.pye�1�0н��2��8#� ��Mj)8U�q{�P�/߃ߗ]DU�R�sI)��L'�c��n�i�6Ƙ�gT�uH^�#�?�����m���mb]i[$��2/�!��l�	k������޴��	�w�Xc9nO~PK��mW��	�	X	setuptools/_imp.py�Vkk�0��_q�(��5t�]S�ڍaGi�:��d�l����G��16H"���s�����)9�� k�T�(g����l����*dl�D�K�����+GkP+R
�g�,q�.��B{��\ֿ�WA�q�h��v��+ʈ�x6A\nN��|]fu�K�٬SY��󼫻t6����
'���9�_{�4��N.g��%�Oq|v3����[=�N>&z��ĩ�؁M�_ɰ�>z��P?�W�ddB�0n�%K��2�2����GPP�B �$��c;@��DU�9^;�����v��3�ᖽ��B|Lw��~�J�W�V�6��	Ȫ���fkM�y�?�	7aT���o���Jc�7���7̘����o�W,^e2-xn�W,�Ȕ�������Ս$��WM��Ö���c�~k˭�v�OSʨJS�N4��Sh��yЄp|�����&�cf���@mJ��U�����)�H˥�E&e[����P���5��^8
��h&�V:9�̙7tN�i���K��qh�V�[��b8u�8�s^!�1�{J�4 }Fj����n�w3v��O�e�ð.�<*�<�O'��К��Mم��![l�Lg7��6���+��mU/��omL[H6���^<|vw�'翆��K��[�y���e��F�����6�k�$��Wd6)tE!�^	4��p�y۝��6��G�e}	�]�O_�����M�)��X�̑|Pǵ��`x�ْ�'޻FL#��PK��mW��MjO�setuptools/archive_util.py�Yݯ۶�_�9,��.��>��eK�C�6-Q6kI�H*����w�!)�����
�@pm�|�x�;T���[+ki�0�R��'�yae{b�j�2����(p���l���F6�Җ=ˮ��?-�ӟʄo�܃��SF>uܞÃB���򸩴jX)�E���6��-<��7N����Z��B��5��RjQX����~��z�g��g۷/.{��m6<�<��'��x_�=��Bo3g�m~ԩ�Ϣ��„�!��ݗ|h3�9@6�MQsc��Po:�w�ۿ��.۝e��g1���v��j�Y;1��Xi�h�
�z!�iu���;'�
��0�\�^����=�
��+Д�@��s愄�Z-oD����C<�}@~P�w񖜱C0~`V���!c�Zsi;��>6d�0�q`�0Ϊ����_0C죂���F��܃��!#r�	��-���t�����܊2�oK����+2��B&-�z���e�[8��Ɔ�t�HV�U�x�ř5���P�@�7�"
�ƀ�lS
��)^���\dG��[��b���
��z��z4&�pE����s�*2�O���1*扉B�eƘ�Ń��;��3�NȊ���j)�̅�r֪��h:{eF��-�,@$D�(��yj9�&�f�L�ȶw<�0S$���*;)X��R:K��ލU;�<�Ƥ&���B�-��}�-���A�@OH�J���<���2MLqzXЮx:s�&�N��c]�e���-S����]U?�m}�4�c3�m�Qe_���
���[;$22s��Z#xk�yqSu�����8�Pf�!^J�B�F�_��JzlLM��5���c�vr[)MU�T���:ve����
�"��l���+�,R����VFL�g/͖�:Š�ƭe�:7b�S����� 
63`G�*�p��/(é:���q��3�;�M�e��[��eer�Z�4 6l1�!�ۗf��4��MU&�/��=t�]���4>B>ghҏ�2@?�7���GFϘ�r���_�l�<��0�t�f�\3Ɂ?��T��n �O�--T��a��Re^"����b�yA͕z�[,�?�7Y�\�7��7ە��BuW�|b1(�v*�����79�h�>7��$�8Yy]
�
����l�u��aK��M�'!Ǝ]Xs���SWs��P�]?p��r���+��`�W#]i��'��z@sMp��쾏|a�{��RI���lz��[
7�$�����>\·�I��.�י0��Quo��N��?s�k��Yd�́����9;E�]��Pǭägii�~Cv�P""53}c�p)�ub������Vc�3��TI���3K�/����[!zε�eqe)LDP�h�����;bg����*�p]H�Ml�o�Ӟ[�ݎ�8�
�K�7Zb�}Ǿ�v���1�8�H:��i�jI�0�GJ��+�!C��:�B�7�9
�=V��"T�+�e{14��4�'�Cc�b5�<�0�B��b��>���	=��T���Rm�b�M�NX���z�0�ŕh���Ϊ�8���0�‹��v���I,���7���0��%Y��"���p,na�劾��T�OY��� 6߼4�i��2͗�44�¤�W�
��u�*u�;z_���z8V��-��w�!!A��?���7����i���
�P������� G�aH�
\,1m�3��1�O�_�
=��׼9��}Id�)Γ69��̋Z�]!l"�{��I}˭�6H'�GI0��;-j���P�[:d\Q��[���=�P��O���X��=e�g��^�ۃ�[=�ޠ36p���QL��߿��Cl�*E]��d�d<�����!�����L����fv��3�_�iL�����P�G �L�)$�pM<�^��_�Lg�B5���pГ�XW��
�����c����Ŭx��_-��U„ۋ�{���=�Wl�`�w���+���Nq� �p��f���R�J��V���Q����`��+ 7��o��?$�b��y@��{�lvU�fY��/PK��mW�N7�`((setuptools/build_meta.py�koܸ�~o�A�V��pa�I.������p2W�vy�D��lo���ΐ�DJ��˵@A��p�/�Z�^�o?�߿�#�u�dA3FZAk���TA�A�.:U��q�jBI��$B�U&���9)y�EI����"-K�[YR�:_�A�X�r�P�{/%�g�TKD����y�1�R4���zM
!�D��dk�c5��� Kn��Z�@�"�F�%�Xݪ5i���̐Gѕy��7̮4Is l�Ky]��8>��@"����+����Y���`蓊�{�����G����^�{Zk�h�a�$�Z��'�ڣ �A@�˄\��p�IM�,�5/��>%��/ �6!�FH���DޕLF��SY���a�Kx�$�s���@�n[b�ٕbKK�@%��
�$U{��2�@�ۄ�A� nН����;(���ZՃ~�Ӗ0��@������=0�&�v�@�U-W���Ōv�5�@�Z�d��J��9���T���Շw�t�K�bm�r��x���$���ȱ&/�4�.:�y���մb͎��u|���ǻ��q�m3@ޡohH�l�P�Rp[�Ӗ��dcn��ʣ0lFy@O�� P���@��$���e��&�h�
�o��7�/��)���e�����`�Z7a�E%T��e+�YͿ��վky��e�Omɷ<�zÂ1�'(-"��a_��~�*������Kݴi��I��
O�2\��5�c���s�2?�f��4-َf�4���FE}t~+���&���J�e��5��ۧ�5hyAD�@��!M#��bMT�2^p&��1Y�,��
hv��~BH���dx.q_:��f{�9�B�$��T��+]��6�^/xB䠉�`@$)W옚|*v՟������G'��"�A!�Ek(�e�+T��5%t���s�����Y32��3孓tL�fxJ)�w���`&$�.05� ���å��Y������r;�	�uBը�Z�}6��ad���0LPs�
M��}ۄ݆��X�S�Y��̵���=�i۔5��s�CVg����������t��9A#�Zuy�C(�XnLx�$���@�ݖ��-ǭ�|,DZ%�2��(=����90�FZmsJh�JuI�C��b�?�"�%t��tͫ�圶,Uݶ��M��:�-��X_����c��q���s� ��	W��,xm�5�8��<aEK1XS�R�)f¡�\�������"�)��b��ed,��B�ш[�s�#sk �S�/�����N�#�I���SO�^�sxc!�:O�[�f�a_z�w�w$�ؾb�=� x�B�.@مQ|���kG�5}�=�%*��i#��j��No>�\�%@�=#�]�@����iW��VaT�a���Š}�cԭt��Ĩ���XYV��X��.Q�<�I��k�b�ǡΦ�1�k_�Џ�gp�Vۢ^��e�w���T��(M�`^�<�׿��'paU�f�s!t���n��&�1�M30d�E���F��,�uq�1U��@;�P�{�U����<�>��"�x��s�	���D	���"��[��6�>������hԪ
��~k󑹪#ϯK�fnb+���
5�a�5�Q��>`B/���V؄�#�{c�:�/���tأoY�Ș(�!�f
;�
JB��juy�l	ڮ���P�45�9�K�e�y��\��ƻ���ݣ.���M�6F-�����1�G1���^$���3\ԡ�}�e�U(#\�؆��o�xMJJ��&�qj߲>WX��˨���Y���B����l�6��;���pg�q9�e���Ƕa�	���h�D~�+����l�wq���{?Jζ�3�t��94��v-3�#�=D	���o/4"4��jF,>�p��
�V�Bk
��	d4CT�z��bruE^`�x��]b\#|�!뛂E�x
���E,�[�����\����u�|֠�a�1-��i�>p�B?�6
���k��W]�NŹ�9��N�����ѧ������d�lw~R����,���%g����%�x`sSx�Z�ɨ>T�<����K�e�JƖI�]
[��a���0��Y���ty6��6	ǀ���#�fS]帗:�
-����4�_S|:N�Э¿�$v�U���|T�Aq2q ׺�1>f���T͜aP��$X�f�p��z��*�"3C�cפ�����j�7v6���ҏ'~:V�hRR<S��G-wFG) ���ڜXv��]�늓��h�r|��ۃ7�3��|s��h�CM�������2��� �3�F�G^����$����z�-v-�O5J�2�@��\2��c�E�2���o�W�nj3o��L�[��t3O��>�����m���h����h�����Tx�aV��O	�u����)S��f�2���
X�쾄s.u�49��>[��'���8:~�v���rc'�~2��7���e���T�(���'85�P=ͤ��>�G*�T��M�q���%.������2���7�3��=�u3&*�~��<߱a��EF@Mj�2�a|W,�Ӛ�j_��Q/]���:Y��t��[�c&���"��J�̻�ZА�����2su�:xP�����5y��������^�|}O��6S�����<F����ߌ�����v�~اt}��/�~F��3f�|��r<O�;�*�3��S��K�}7�����g� �μЛQx�Mz�b�,���kQ�T�HĒ]����
�J�U
48z�����?�vlb���1���@��gp�@p~֐�0N���(�@����ظ��!����&�#Yg)�a ĉNH���~���3���I�?zR�!і
���G�B��/���'�`��H��؍f��(ӛB;U琬HdE��ާ!Sl��EdDI��	Ȃ}ِ����mWY�L��B<c��Ѐ�H�c����j'�0y�5�Jh����9�r�������*[�
��3t`H�B]���_�����ak9��Cȝ��5fyr
����y$.87�r��
�����xtY�j��u:|T�i����?PK��mW�l<
ESZsetuptools/config.py�<ks�F��+f�r�1�j?\��xk�p%���
����(���~�C��&w[u,�L===�����n'Q����`�
�|Suf��Uc���f���0t��׵Wg�q؊z�:YO��+}K4rS�i�a,��Ʃ��#w��j���u7\��-�0T�C?�DC6���S۩B��0Zd���vH�k��tW�l;I����~G��]�}���w�5p��������K\��#Q;Y��V:0W~����Y�UJ��jj�o�f��ՙ�ϓ'O��$��IL�膪Ӎ[�W��W[i���(˶o��̕�6KZ0f� Yb�d[ s�M�7%��	�BߵӍv���f1�-�mZ&�4nV�<"b�^��jr�ES�F�,�}9���p��]�]SM2�T�p0�����_�N�]/���;����d6����
� �]���R�V]����~*����l�QX �L$�����lD��j{���M���_*�^��i�j����*�����x�oQ�����h�^�,��������?����Z�J�Ǝ��~b;�s��b��GqX���1�~�����n�)�|�D� ӓ`A_8�P�۪���x���������79�YD��4q��Ax��cA��`b�~�h�p�i�U�cEܗ���i�"���VWu]j�(�íd�a�����ߴך�|.
A���wG���&��D�a��@"+�U�=Lj���noe/�1����(�h��8#*�~�`[\�YW[����)u+�V�y>�3�A�n�ӄ�����\��n$~áJVc�B�������ݴ[��WR������^�]W�R%�N�3�&��!�tzIKAD�"��ÄT�R
ݭlD.���N"NiL�Q�6�q���= Y�
W��?9�Ţ�C��$w��F)v㰫���4d����w��q:��d({�0�!���e�<��:�`Ъ^])2Qsk���5�Ux�9�a�3�y���J?S��"��=�)2�LDS�qQ���a<0�����	k����ѯ9
5��7���r
g��H� (�e�咔8_ c<3{~��c㘌�l{�6��rQ� �7����CwH��t�����I������x��(�G���-x���h����,�g��f��#t�ZNC�֐��ό)�&@G�r��y)��Cs�"W[�HP0+�Y�C�����xC�8�%@�P0�����8������(���<:��z/��C�`<�?%��Ytٱ�|u(ε�����:A[��7�|0P��Y-|)1Tn��м�ǡ-��~+�*�EH�9<Z>�:��sv8o�ŽY�7f4�-�����e�2���X�"^G��vc9�1�QQ���R���MV5w�l�ԑߠ8�jo���[a��|�&�Me��}q��.`�)a�4^K;Ŷ&C���(3z+G�wvӴWu4��0��:3x1�Y	��(F�*RD�W���J�U��
p�|(���[��2;��b��+W�6�Oѝ��W�o����L�t/f� -�ڲ�P�M�D8V&�Y��r]Bb�c���/�X�XZ�6Ŋ��Y[��J�A��]ׂT�ԾB�\�>0�ۡ���|
��p����:H��Ϣ���i$h�m�0�#[ka���k+E)ׇ���wF���B��^�];�:bw�aU��`�u^Pl�]iʾ&����.�1�с��h�eyI��I2cLq��3����9Oz��e']{����Xm~ck��,�In!yc��}$��EM
����Fc�D���M������f{�z)�lQ�����)t��Gt�!���F�Rb�
�}�+
tBp�#��g��6����;%�H�Q�k��8Zg��@�Q=];�s�����]�=��%gB{3P�?ow�d��
e�-ۢ�j��&F*q�F�)K2岄oHIY��>[�������ɥ<��}���z����*��"�81??�U�:�D�2@߁C�����-��N!��1�5��~x�)�c1YX*m���y(��B,�4T���y`��	���(���V� ��o����]˺�(�z�PZsa���=�|��Z[b.|&$nVƏa,�u�7��s$!�?�{9�.�#�"	��M�*t��螝V�n�B;�r�G�ToE'�bTC���Ô`z��L�b��_�{୯s�I�T0�;��b�����l��>�{	A�R+����G�_��(Hw&���m�\o��?!�[��a����F��\=�!SW5W�k��a���o�$��3�Y�W��;"�,A��
햶wl%�=�R��R2�d�NM���ϸ�:�	���xG���ӌĠܮ�SM�y}.MG�'�xŒD~ˇ�8M�J<�<U�^��o
O�@��.$�e�4�?�($�x���v�4��S�7��#z��}'9gd(�M�Ta�T�tn��
<JM�ݢ���S�CRK;�<{����#�9�?������G���\C&�
��3!xJa���,��b�
��Z#�j��b��~$3sK�����m�c�&�-=��>E��Z������$l$�N�xnD�|�.Z5�P��T�Ax~8���?u��l�׾����Tp�e��}�١/q ����C��0���6���"臭��h��O�^]?G�+��i�^�3&��:��V�6����<i��2�HϨ�Т��J-U�ƃ��;��f�b�.���e��WW��K�R��"�V��01��J��9,�t��L'x�ê��G��U�. |R°ׁ��0�G_Ԁ<{��s�|�?H�ݛA"���g9:��:�م]�)_�?���U�G<��}v{�)ku��r����-bB��o�,�����j���T
,�΢�B������9�ǜ�+Q���n;��!�5[�D;�f[��V\%c66ؐ(���|���c���q?"ۼ���,Ѕ4����A`�z�)����.���ć��v�jy�K�o�Q���=r�4"�s�x��KX��
�s�K�إ+F{���J�{W�{,2CX��l­=֭��tC'��m�ɝS�F�������}�%�đ�J|���o^#������o�z��w_[����#L1��f�9�^���l���'�t�<�+����2h3[��~6�FW�!�N�+/�Ӈڔk�i	��a�1��ƻ��g.�7��C_S�NR����氤�^#'4`-r�J:meL�s�Z�oE��\��+j/��.@���3w|���`�Z���������(��|ԁp�z���dp�PPӢk��}=�sXg�i�ٿe�øI��ƴ/>趨��o�S�5UNNpd�9�m?�$��LU���ۺ��~�A������m=x���U�n!Fh��!6�h�0F��	\�\�b79!��v>ھ݀��Հ���B3s6�P`8H]�S�L��i��t�Qq��:����y*^�z�&j+�)�aWw��@k����B�m\3t��P��|�u1�ڴ;�X@����<����S����E�:c(�&�y�]2@[z�ʑa_̗�ަ�xˌ��X�'6\��H�D��06&b�|:��@���3	r�A���p����6�ag��n[_湯m�!��w���Kgԡh��?��
�]�b�i��\w����i���f�|OlI�]9�<���*�=Kl��SJ��Vl��T���'=����wiUO����V@�'o���.�ӄ}A泡
"5���1"f�"��Qm���4����96]h$���4�h�'-=N�Cu�.��Ai��}QwYE�([�V��f3RCQD�<l$R��2�)mxլ�����)]��jHKW���>*����g1�5�{x'c/��`�y����D��9�6)�D���Xy�<E.�|֦��eדY��⸦s��0=�q�1q�� ���)w��L����T��i*l�i[�nM"�|¼3�8/���6���?�%�bDesp�e��y��[�6�׀
��ݠ&n��f�":�3m&�i��N#H��Aj�\��(ӝ1:�h�鎆�J��]}*^
���Kp�:�&�Ѱ�j ��Q�~U�0�Y`HL���M�!7_b��-�$���F~�cu���6~>���pt�t�]���3U<S���3�'����TSչ�����i0[�Ql��_7�i߆��Rl��<@�9�aRW�MB�ZHU�YOP:F&�&���Q_��3����}r\
���V���U��k��=�(�&Ƃd��
@���i���z�5Ǒ�s��[�2�y5^c:���~�|�y,��/y��ɚ�9�;KZB:��θ;5�4�l�����l�Mig�n��
���Jd��˜�fj��B�w�j���>I��"���| p��|7����]�D ß$�"�.��W��n�):��~��;�Ў��	���j����%5}^�^P�(
S
��ĥa�e��͝v}���9�G>��s������@���L����#�%���DwVj:ɼ�����*x�ѝGPA��:p��3������0f���
cs/�n��f���ۑ`���"��J %!�H=+����n��N�oACO�8�t��J���q�c*�h$�}�b����W.����6�!"NWj��{��*ñ���i��COٵ����䩭�dA���&�0�t\�	Y�����b�IVͯ!��}�����s1�B��V���-��+!`:2ћ8��^�P�d-q���L��2�8�_A��	��^�:c�)g}9x<���N�	Z\����𡞊��:���j�OZQ������+�ԭvʔgr�H!���`?Q��G��O�E>w�.�=(�S~z'@�/�+uM��Z,�7�$:���s�l/�`y����G���t�X�����|���������xL4]X�s�=�:��M~a�u�낔��ڔ���3n�)7�T�	3Px胏��YB�nj{��H��XClT�N�8xxtWT�Ø�A�=�vb��ӻ�51��\%�m=t�����S�߽�A���te����z�0�CHs�����]����^	����z��{�{�=�9L��ؽaQ�VJ|�s?�EP�v�n��^X��vI�B��^��!^6�<r$y�2cN�-�����C��0�#������
X��R��Sq����"4�K4̑L��XC�s�"�e_utx����K���A��,F|���<qd�9���o	������V0�"�ᚳ@p�|X�M:������.��*b�-w$���2�ߚ�,7繄��=��OL�v��{J�����<�k+,��Mk���r���4j�G>�^�!�}�I0k��$�
�����1�=��QO�Q�ƶj��o��_���'E�,��ϵ����R*K��`Y�>g��D���;Ls��u"�o�1/�	�fI�'�ᖹ�
�D�>�vxl�]�-=fy��{�u���e���ӎ�~�B!�ҁ�z��U�!׎mr�� J��#>p��5ǚ��x\����R��(h�:����]��[�4��y�,�enƁ�&�dz�ݺ�H�-'��Lu�WŰ-��G<
�h<�o�lV]W��R:J#�5{�ՔQ�J?�?F'�q'���E����ۜ��ͅy��9�H)�̯E�� vR�X���j���왂�x;��o�4�}�It��^�qc�J>d�m���<."QD�;n�l�|O�(I��my������4Vv��8.�#S_a���r���s��D��(e.JB����u���0=���O|NEe�t<�8�;PK��mW+JΟ�setuptools/dep_util.py�R�n�0���� ey��z��=TU4��klkl7����&	d+!a�~�lg�1(�۞�1�@��rCg���6�����B�aR�=�Գ��Ť/�Yw����an�ԅġ��o�;ş(`46LĂ5�d��6D�eM[�4���8�{�#_��1䑂o~U �n�{C�N�rgq)�2jMZ�2#��	
#d��/�f�0�%��2�w��	X$[�M!��< y;��P=<z,\�O8K۴���^�*E�N���)�%��g.Q�WS�t�k��+�i26�񜷷���Q�Wԑ^�-�o'����2�ꅥ�9��D�&Δ4�0�*�<�)*���m�a��؞�c�Zp���2�4rF3��$V��a}�
���͗�W����#�n��k���d�B݉wL�PK��mW��f;zbsetuptools/depends.py�Xmo�6��_���$��~ږ����$H��[W�D�\$R#)'ޯ�I���t�|h-��~�ܝx�Ie���w?[��6�c)�a���pRq���l��
ot�eJs)��qc/�/�p�.g9�.�\Ty+��a+r�k����������������ק��@���E�Ӧ�s�&���k�g�KV$����-3�)s����1��hi���3�-�5��N,룣���SL��#I����HE82h|��-��)�raYT�&y�7y�ړ�O��^A[p
`ڰ*�]��Kٲ�޲u��&��8il}!\��j��˓�x��
��KBEu(�
i썓�O�ޏy��֞&=x��P����)�+�o���<	Z���<���<������,i��e�Y��]�B�RC��2hq�f�W�^!-� V��T�!����Ԉ̳�C8��<��OuB��R��3�y�"X8�Lޥ.1ډ�g�$�EBt_׼�L�fG����c�ꏱ����@b�7{	
ǿOKŨtЇ|�&G���^�\\������Л�Q�Ѿ�����O���(K�m����+6An�3`F�YF�xè*7$��,O�rV۠ײ�j��e�޺7��5F<�����SM0�n��Bp�&�c%�9�,-��Ҧg��,��0�r���ބ��p�����q�K�nsT���TQ]�$2�bq���'K�� v��E���M �-�u����0'�!�#�8(��v�(�ٴ"�-�!W�Cjؠ/(B�Y�Y�H��C{o��5{(Ygș�éRR2��hZ�~���̩
S��U3�r�+��ē��=�"�Ew�m$Ϳކb�:�ޭ�7 ��Y7
2��X�D�D�Ce<��k�1|���"6f�W�+�?�����>��$h�H��[�l�Q#��b�v�tW@R�|z�Oa��ϖ
h�jtk;�K#��8k�=����ϓ}�<�~@)��\
��kلfq�b&���$�()v�~�9����n�8ƾS\�؏���*�\R�2�x[�/����nF��]	������d0zu�gx|.�L�s�B��u��	N�L_�Ă�Ã�q��<���䢖{�9��_�'�7| �lՈ�k6-}6�fd��7����
Z��.Q���p��%��`1N��`+X緬��@W��c�T�[�N�X�dK֣�TZ�+͜����j�q)ێ�׽U�!^�0�2�Y�=TxN�eVc3�ގ
@�4����7tk�'��qL���J�^A����˄�͕�0	��t`
֖��������W�(��ۀN}mc�
d~���q�9��&��W��Q���-���?�!�g��W;ń��e�R�󎪙z:��"�?�d�:�-�,
�qucNG�N5DW����
�n~+p�C�P�Z���a;)�mdAv`E�(���G5�>"v���^��.���N�v�p�H[Kr���4�x��4�h�ޝ_�zycd��ڰ����Y����ВA��8t4�4j?m�LKna��x��c8Ãġ9:�e��I�Z�KD��DZY�z��jӉ�e�R��������yt�܃�����˗o!/n>�ً���Y��0��C�w����
��aU�^�>[�"����3������kx��H��t��<�����?��S�b����<f�g�C����J�����O�Y�.�uP�E
l���V�NAN�T�[�Z4vZD�&]C
�����Ǐ��
�`��)��1W�L�w
�
c�	K7�B��C���l��r)������M�tk@t��lx�?�9�{5�X�|�{��ߘ�Z!�bFA~��	�3��_b�8��oPK��mW2�
˹,O�setuptools/dist.py�}ks�F��w�
��Ȅ��<��jK��#qmb��H����JX����.��~�5O(�ɞ�{�*���������w��g�dQ/��8�u�ٟ��Q��u�''�i��l���ﺲ�ҳ��r���.)k�[�o���ҿ���u�T�]�6s՘?�`��l]��.j�y�Y��o1�MQ-�VM�q㿉�@�t����a�����u�G����۰Ū���\u���
����uѩ|]W��;���nR�������!I��v�M��~�~��=������-�F��&����q������ٷG�cQ��j�-Z�m�V�n�-˅`�6�%�F�mq�r|��ʵ:
穚�n�G�9��_N��W��m��!�7�ş��"W�ت��p@�m_.��� ��(D���x[,.�s��
��f��̡�@�lܗ���wU��N�
�TJ�d
�GjۨE�4��w��>v���g�s=�uY-��6ow[������.�^���wն����V�%�(�g����m/��F���Y����Y�(��Z���y����8�ܬ]�nբ\�@�tr�N�6���X>ɽɏ�vˆj���/�ѣ:��.Y��K���MV��6Јٺ���.�P�Qd||�Q]�,�"�ƭZ����XhTt]CϧI�O�ɳ�R< �����a8�&�_d�Ӊi���4t�\���qٜ����X�SUw��r�̾������%��哇3�P�Y�=��W��Zx�$���ZX2�&"�t�ຄA3��ݮˎ�

֪ӣIrr�ܷ��yл�{g�Ϯ��[��*�Y��x�k75����������~4�50-�j�d�i����q2��זtZx�ƒ3���R���P
w4��*�;�K֞�қ3Mys��o����󟞥=� ��D�.�I���M'����z2Yo�C�&��{�›�� �mj�/�����f��m� ���
�s�m����hy�3'�xL����vv��o�)o���.�}h��$��x��;��(�g�'"*�׉G���J���4!1SP�T#C^@���1�>::$9}q��҈��g�*6��:���Îu��=�L�%06о��o�=��K�;ɵJ�F!��(��]wQ7I]����.O�6.N�T����Yh`��-�Ψe����kn�|Qo�l<�]�U���%$����
�|
jZ��a�IY!�Y��Œ&��8z�M�n�axDgJp#ɇ�cpnN��l�8D��$��{相�Ld՘��}�o���k��k�_�k�LXw��ԕ%[���fc����[��Xm�J���N�����_%3���S��͝���|?��-n_��~d��ۮl�a$u�PI�6�0.o����y[�UwCo�jx9S0�$�b���B��XB�sCi9Ö�6ӂP^��PTZ��w�tqI�mY6���rI��8(q7�v�-��ԝ�_���~�t�	��%Ɲ��Gϓb7��{_ܟ��ٗ����
8t��2�]$�6E	<�#��t��*u͚<^�@i���r4��n`��4�k8��9�q��}��4
b¿�j�)�@�$�h�����h8P��Γ*�2�:':_7pE�+H����8N���}���n+��Z�M�����'O��VM~B�����;{���s\�M�%��t��vbb��mR6�ś6��Д�gs���>m��O�_�Q�i�x.����h���ݍ�ɤ���2S�6�6�XC�nkfi�Jd��������I��w�w��r��]����|<IƆ|���5��3��Ĵ�E]q[�`lg՗�Vf����>�w��M�L0#�
� �� �W�v!�/y�������I�*�g��+(
����(XS
��D\����Ax�U�7/���v�"��ǭHZQ�}����Oz�Me���v
�-����8J(
lj0��/5=`�������ԴtxCkfNtg�
��t�225\�&��x���	f�Ъ �Ns��jr�K�-8����3��V������s�*8���L�Z}1].��4���֫wQ���oK'Pnu���ӟ񑥑	�{��O:���b`˻�V
��|����^Cs=�A������ۮ)�E"�3w�śƶ��=Ɩ����5E�̞�n5�if����5Ι�K�'&��Vb4 �8jaIT�@I|��"
��-.��RL��T�%yuXv������yf��q-^���22ݏӷ'i���mz�@h�m�Te��Bm�d�k*^��M�{���G{|&h�r�m�F�@coG�6�f���v 	�d����:F"��D�Qu����O�	i).}ȉ8��<՜���,�>��43PŌ�Ѓco��y+q5�XG��CK�zx�[�dW��Ɂ�X���n�eBB�᪕Ш�
�%�TN��fD�L&X���Nfֶ74���zc�r�0y�ON���G4UW�g
�oU��-/��J>
q&�L@���JsD���K�8��f�
@
���Β(n\����El�C�1t�����I��}�b��]�{���#�9�<��k�K�y��򀬂���Naq�(ͳ�t%I�4K=�ЕP~E�
���f�I�Ӄ���}	8�^*PQ�z�v��13�&@,�^�h�Ǡ )�_9�=v'���h��3�?t���mY�[kU!�[+h}���1�qg ��Һ��2�V�E}��X��SJ��qx�i��E�*�	�M��H�n�n�
�H'"�����yK0A��X�u6�K.!�BN�����v�I��{I�sj�9����c�mOM(+B?�c���6=安��ʦ�hj�x�s�}rd���
��c���?�1�����
�O�u��7�����A0��N��l��;z��}Ҽw�;�B�O|ؼ�ߡ�dt�!�
<t<�8s:1V��^�]�D:Nf�r3�
i+��{$PyZ�Zf71�d�Bvtx^lF<�2�[�[.(�7뵹Ű*�l����n�x���3�[��M�M���h����a����y�(dч��83v>-U�+��t��˭�&������x�'P'��D�A
s���J;OMO�@�2L,�({����w��D>������(���y�'�K�3���z���\<ڬx��/�+o�I����v����N������\����)k�~ `E%�����Q�ꕯ��u�bTI
r��ҭ&p���>Z#�!eԲ����h�Z�a8`;r�yl��\���e5�ޅ˙�e��0cB�R�i4{��!�w�}G���4��x�B�N䞙��뎗z4��G�jx���bX4�zkT���q��r������|�6c�9���3:\��p�_���(�Ў�ϲ(�EStj���˙�޿����$�#�3�-v&Cx�>{��F�F!g���Қ��h�R�sB�����t�ķ t/���Qcp�9��`y�Za,���K��Zը���Ե�0i�hB�;V�`�r��x�3ZI*|i2�y��1�::
t{�����I�,���K4�W^_�Jk�j95�d�����}���@�ydHZ�ϴ����u5�,1�x���@z�H}�>��*��;�^ �`�@OQ23�`^嚌�%��_<���u��pX+� ����F	[ �N�d]�`J8,�W`�a1�UYahBu	����aZz
�n��T�RX6�j4��S�
d��y��Y�Yܜ0w"l�� �P���\�y�5�(B����-u5W��4ۅ�b���R&a�z�]G!�T�4qF��l��]�
l��1yBN�c�dASѱ�%��mNa�C�z��9�e��-��ɽ�K����F��?������!Hj=Y`X���
�E�-���*�B��,Vv�\�>��A��K�,�I<lDYW?o��d�U
���O���Ԃ� }�R���S�Lv�v[WKL|%���N�% ���*o�S8��0zA:a����qH��~i"��Ať�o���R3�z"����*�i����G��AX�頔��|��(���ޭ�fe!����$�e�B��`M�1���;�ӆL�D� �$aq>�4U)<�=z��*��V+Q �S��j­�c��C��a�\Ȑ!*��Z`�����ӎ%rnWa�x:��;�Ͷ�[)I�!�)�Taz!�ՠ�A,haZ�^�Dǝfs+rj �^�h�4�k�
k���|U�F�)�"(wy6��S���5�s�)��f
:r*���i�<�)�
8��A����p���jPup��ҩ$��U]�4/����D+}ݔ
��ɂD-}z7u��PcU�n���܇Qa:B̞�>1s��]@��aWnT&���].9wp�A��aS�-�*Y�ۚ8��U1�-7
�d�
vg���v�)���N0+��bqG�2A:�b%�&<�c�0�%�w�d��co�т�\``�n"Yt8�Zˁ&08%Y��T���ǯ*R�X���c�#\ݏ��ʴ&�d�=}����߿��<{��ŋ�/_?~���G^?�S���p�7��ɺ�̗�1�BY����BЊL��[7�8���s���N7<axX/�!���@n)9��S�+!��7e�[�� �jU;�a�s���<).�H��֐�K2#jY����||Tx����o�A��H�'�/��E�)��P��+�1�w��c����]j�]g���J�@>��L��u^��&�X�9�`�e��+��0I0Nyij�$C�Ռ�^��{��c�Lj0;��MϔM}��<���X���SM�4r#Ϝ��\L���Mv�M�%iVˁ�J��t��-bŕ��^ŏ��oG�p�{��h�߽��8��r���)|["�O�ܝQ�}k���nR{�����
�mySם3����H?����~t��f
�U[*���%�&
߂�yz@���N�����H/
tܓF���d�6�mN��xWE�rB-6�,���f�;�I�YX2�{=n�m=_���8��=t
�L1,�Zb��*�GI��9��`Z7>\h�j&���fYb��|.�ewzdOK���R�{0Cӫ��4�a#8��F���fj���a�o�(��Hr�����2���N%n�)�$;��Qt��>5jM�v���γd;o&�k���ذ�!�d�tx`�+����u��2qPt��h,9����m9�o�Ɵ��f�c1Jx��S�A�?��˪�]�>Oi�LȮ���O�Jm����5�!�|_�љ�R�~nP�H#<�z5�ܼsD�ɉ�ZG<��Ȃ�;�>%S�;�}��}7���3��mtM0Y�(x�a`qz{��k#�\�g���Vڪ#!�N�L����4=ƈRh����?OGF9Y'G��LM�<���f&lq�#Xw/�4��?��/t�5���zx���f"}	�H�b�2�w{4dH�$��@�M/�pQT�����l�݋�d[n����,y���V)
=��{|߬{�V�d
�^��|6꟝�ؾX�V����'�S���r$-��_ͩ��J�_�o#�Q�^�����=�-��ƅ}�
˃���Dt�!�Y<>:0h`:��ُ�{a�l��%����0p���8\J
�.�<wH	��3XyE�\�rl�35v���ᚼkĎ$I�h����;�P��z�U�z�Bs�
��z �$:pO����齳^[ <5��(���!�n����s98&*����K-%v���A>��r7�Ҏ;%�(����t���1���t4/�y��v��M�1��Gg���4?6��~�:��P����_�'�!b�����ű��(�߿$�#Mn*q�N"���ی5�6닆R��������-]���n�R�-�O�[o���&Ē��Y��R�!��N�6ti�!���� �g�3�L�\x��']{��sP����⾷R6z���>�yW�m?������q1�i�9�(톳˱�,Kr$")�Q�Z��k<�[��E[3��Z�\�0p`�����g)�:� H�|�R3�(E�9����q��\�Z�����Gd8R؅p��V`�`g��Vd�{����l7!��g��G(��vso�dR��b�����9���q��h81i��0��\��;׽q0�딠M,Z�?��)�D���Mz�S[�������U&�bߖ���{��1�D�S��T9(��@
�\�2Z귘b�9!"r�!,�S6�}�:-�ͨl�o/��Y<O��x�NJp�sǨL^H�
'�+��%�$�Oώ�������*������t=^�O5��=��r01�X�7ZԺj���x	���'���Z��
:����E�m��w�Q��O�߲^�RS�U�ݖ2A�b�C~���#��6���$}J�)�.�+Y�,�EɅQ��O>~v����c�UL>�Ͼ�ߟ=
/��o^�����ASjX݅D�7lP8Td\ǁ���i���€�3 .,�����7��PN�0�{����Q`�����g��}0ND���z�=��U��;�6$��6<�򼚌��M�J�#��֢
e��w:�=T�
oʖJ���U��0�I���-�*>�Xu��N����K��D�`YlqDŽ���Ь?��&����dB�tMՂȐڻy���@����v]�l�R0�&<-��g���R��֘�h�����r�uC�᬴����a��qz�EXoE7��k^���oH�ӣw�J����Pd��Hnj�.�7���ɮQ74ኖ�&;q�	nE�3�bo�[��
��j~��x�Ğ�c5x~�Z����P�wc����`��j_��@��޶��Q%�:\TU�C��;�����N�]��>㹽��1d���u=��fFA�47�5��O�Ac�?I�}J)S
qVߤ���z�;=�эng�R�$9��W�q�N��.1S����(�]�� =rJqj�q'zl;�z��Ж�j�4+)Й*�����ib����?UV;�G�̔L}���������I��$_�E��9�膜&��@l�K=���n ?o�}
��&��j��$?�wO<w+�R��9�H�k��x�4���L7�9ި�@��@&z��ZlB|���ZS�S/�@���,N�J&Y8R��BˆA��} �XV�c�����#����b�a<��+4n��{2�����Y�B
JGal��Li��ڣ���G�ߙ���ʟ��b��/�
�c�Լ��e���ͮJY'۝_|20@�k�e�~	7�.�b�T��$��9n���lIlI��۔�v��Zv8�װR���=ފ�EXmvbd�F<�&�yN��B��������g�`Փ�GF2�ݔ�mD��)s��5���W19��F'��b�/"�e�}rb?���}�Q��J>a|I2K�\	N�þ����^��'!/��x2�(b(���Au�
~ƒ����x�)Z�'�d@��	�xΧ"g�%^ ��_�-z`���h�'U�tS�o_�`�{ Y�ԗC��X��XX"��]��`�hZ�(e�T�9�b��-kբ��j�p�V4�]�����6�?��K��͒����0D��[��e@,��090���8<���<���(Y��bqy��v�����7�+"=di��?������|���7�~��C�M��J�����d�ЄQ����tS����Z4��M\�s��@��ߤç����N]�����?��*ݝ3�q%�ɀ�1��w���.1E^9�9p�~��50`�L����a>~��og9�1�$����|2��
Wu^�ǩC��]�m0p�r�轛�0ʮ�7��=�x'
K뻴c�,�MUf{�#,�J��帇'	Ta�^�O[.����,���?QWE:R|�h��g���zJ�%��QM�%���
C�݌*��"�]L�K��`a��{}]���~2P9$f��
�e�d8�֐U��������lڿ���u'b�=,,�?�p�Zg~D`D�-7�ԍ�C�����
�FFT9ɅE�u�,I�ث�6�[\h���x�$�|j%�+E
��7.�tFL}�R�<�*n���l'm�}�N����WESֻ6Y�+X.{�'��Oy=�����k�[h1���I#�*{�ӆ�'Z��x'�`�0e�閹:?om������%�
�W��0�;�P��%�{��٤i�»E�@F�7�<��M��r���[�*T��P1����un��v����\VGƥ�z���Y'����<��}����v�;�:���M�Y+�y	'2y�sk���2f��ȣ����$�4`Tb�����jM
����-l��<�#Z�B�����O����_ߴ��U`�Z��^�x��;���~Ґʝ�QZ�p��>'�8��PGpa����4�7� Q
���m���VLE=�V��9�g9�Y(�;^�9�dx�2���ԌK�77à��hz�P�t8�@���_��p̗ �Q��	�4S�\�S��Vff������^�4�WN:��`n<7�3_�џ��R����4ߘY�WK��J�|�_��&2茅�ep/}�7����}��/���/�e��RN���}(!$��%Oծ��}?_2���L���8���?���:�y���a��޶�B\�5��Hv~�/@ܡ�hBry/�"$�T,�X�x�!�#�/X�S���Վ=p���Q���U�ÿ�E��P'�\nT޽�,e�S{3�z��6?x�����!ꩪG�B�kvޮ�˹�o(D�ӔJ���S����4[�
-�q@�[H
7:�ɔ��p���r�3��CR��>{�d��>�jԜ�0soP
�?��=�������K��*a#�A��;'��1.'*�C�O���s��D�:b-�0��9��&�!=��=T�q�7�ֿ�N�op.��TV�9e�&A~�˜�D��,�aT��Z�JW'�Tm�:�A�l�vRa`�s���k}4��3Lt��76��N�wӖ�~��M��C Ѡ���?�2����yԣ�?w`{�/D�K>�92��kjD��W�������5�Rc�Kpu�+�S>�c���-�;�R<��Ĵ��ŗ��?�,R�r��U���낳�#�F�W��J ���L���s)�tr:z;:��R�K6�oS��.���u���'�u�������Q^���]Ù�S/ܔ��^�2�H�#:�M
{��*p�ɞ֖��㋮�˥WqURA�
���v';���� WZ���f����5�YWϲ�?g��?���.������l��@�%{u5o9X��b�`��S�+���r����J������O�:Bc�
�P�>�j�}�Aߩ�uH]O�ĹZ� 8y9�?3hq]���.H�E��=y-�Hư��ep��ˁ������hWa P̗̐{=ަl�ft��w)���	��Wh�*��Z�-�FN�H����]��=.��9�h�b�O�E?��BLo�[����wӍ�>����U[7�0�izv���H�n����0�0{wA�mþ��a����%L����<��m&�<���A�����+S(���O�e��5�1�%�Ko�[2�b��lq�n1�U�D!	"���n���ma&�ki�H��9�f�J��q���%�	,VA��	����ٿ�X=:��;�����X~�3��`�_=�gM��ů�
��\#n��T�Y<Ϛ�
���e8��d9�Ec��r�hU��Ħ��y2:f�A�}��z"�����>c�
���.�2�4!���)��\-)+����E����K��[r��5>��
l�ˣ��?�
�1��2q�M�*\X�$��b���fvv#����#ܾ�v�&���L��vK���$/j^��[_���μ5J���+E3���T�x"����4H�r��Q���ϭ����Co�ԏo��d�#����`����h�ﮨ�]QO鏸+ڥ�#������]Q�D\[o?���)��]1�[�+��r����\o�?��G[0��:�T�I���9&�ƒ�(Q�"�"�g3�	����/���~6����mS/�Նf@qH)�"9y���l������
C����`��F�F՞3�ɬ�=!|��c�r(6���+6�Z��i(���󮤅uy�-�j�k���2m
�QЂ�IB�$Y^�)T�=j/���I�>�O�8�c#���ʉS̼��	�*
ߎ��u�د�����b���
���Ym� ���������rj���S�.C���@�����i��M)mr�~d4e
�++]�Y#�#��'6K�@�*�$}���w�����)}�P
��3���E�C#���|���$��엵��|��G�$/9�a��w/�eH����p�9G��R��4,�jwve�E��x��Jե�����S�v�hP�CZ�IE*���w��
��01��9�v¦� i<�����ex�#�㉕Nr�I�+?�Cx
��M�g�x��pns$c0nj�Y����=�g����bx��4�k#�٭��qW9ݲ��q@!ҩ���}$&��
x}[�Ndz\�
�]NN����O lũ�^���ϼQ�e��p�7��*􀾻hB�G��N��)|��X�Q=�Q�
�F-�p?>�3���[��v
��NO��=�脉
�H�r�X����M1�E�����}��I�����ߝǎ�ap`3�ǀ�U���u�C�Y@�\V5W{��n/�XИ��p��C�k�w��N�g:���;�|T;�@h�l<9��pPXQ����Ї��j��l2h3T�FI�܎g���Ό�#�1���]w�$u��AE�����B��FF�U��C��_��N�����,��/�L<�S0��[�=�]��U�D[(�^�LyE)5O����:܊ŇZ2ł+��Þ>�	t{� ڏ(���IxpČj�P�rv�ӊ�/Y�B�D9`�Ny��g�p���˯2o%��2H�t��ב�#~�s�a��	��'x�J޼~��j���)�p��/k�����Tl3J	��!��&����(�����"��t�RQ:�w0�^<߭V���s�ݙ&��U�c�a���c����4��i���t��{�Qá��u�&:8Y����-��8�#[G�'N<۰��K���bE��m��8��8�9̑�H'��S�/������J�CSm�PK��mW��Q�
setuptools/errors.py]�Mn�0��9�Ū�F�]��W�$��X��Q��r�� ����y�{�iF)7I�s�9���|�4р���M(E��8@7�>!
�#��icƜ�R��Z@ᖲ��V�X�Ƙ�;f8cHo)��{:���\�P�z{~1�����
5�_��.nB�#��(>����|Q����1t��@�ںDZ��Y��JR���V����y�]Q� �"���;�_A���U��^�߂�-)i�
���^R�+�������U�aG�vۨ�PK��mW������setuptools/extension.py�TM��0��+Fi%`��*��nUO�ު�r�����&���
���\�<�~�͈�h�b!�>��k-���,�^H�v:��[�V�w���Q9�UQ�V�ЎZ]q���e��<Eq��ߐu������w8�}�
^m@=|IN�q'\r�݅̉%��Cگk�� �Q�er�v�K�����M����z36��4)��z�_e.��n��`����;4^�A ��w�؄|��!Hk�	SqR��Hx���آ[���vdT{��ձ�*���^U9M�+g��:(ۮ�^H�
������L��iK)��P"��P�
(>bNۡk��K<���z��뀳
��x��w�)�|�݁�ND����4aD�]fbR��Ƹ)�D�ЃVr�7���}�v`�b��_�G��Z�Mu���b��b�?�:�ސ�H�ŗy�$W��g��cZ�!��YB�&��"X�ف�{�'�=��YͱN��a-qC���
\	7�o.{�@��s�`����-~Z�Ct>J����d�ѦR���}�y��9�i�l�@"�F{�D*�Dz�5�zw����A�'I�&Y���2WB\UmgLۍ�-�F[�p$K��\�V�De��ŭ��5�z�eE�K�f���e��S���qaU#7U���~���v����yJr%N	�K����$�"�>�!'ǔ�����ϑ�?PK��mW޷Y��	setuptools/glob.py�XMs�6��Wl�%�amgz����8��z��$k$�\��)P�H̯�⋠$����顺�$v�ow��;^�`+���^,�x����Mk����z	s#3���W����6�5K����'T�E^m
�I��
Ǫ��s`������W��0?���U�
����E���&D��?�Z����պ�j�$���X1��I2�����`���spP�l��i�$.m��5ӥ�������7�c���O?�3��@ŕ6vG�`�<h���0����nA����
A�XUo�n�y˫"g�Pff�}L����
�lDş1,\X�̶
�fR_�\�����֘sVA�I��_kX4���6?�mj���ʇ�a�Nf� ӝ�s�@aT�*kB6Eam|GYC-aE9���=]K�@m�OY���.�!?���i4�	>-{"�8���ؖ���իB��'�_L:��ij�)9����⌫�C��m~��
�Q���g�\�uCpJ��dJ!1�ALu��k_]/����‚�`+eL��L��]��Vޘ�q1#=�4o�?0R=[��$c</������ �` ~���
w�u�O=���v�x�/|��ET�TI�QoȐ+�Z�����)��"��G��ι\�A�mDqru33<���Ъ�u�����/;6a�i�BA#N+��Tm��7m<�꧆c�V!M�����tg��$�0�%�\s�R��L&ر�7�)ɰ��%�,��(�3�������M:�B���Ƒ�L9�;�}Q��[�Zx�N���KO����>*7ϥ#T
��UX�Q�,���s�_Y�4B�����*�$���Lj�k �_���F�r�(�E���lM.(^�=e�T���d�V(D�{*s��+:c�9��r��r4M2�5v�rN�4{F�٧e���M���#�A�T�?[��N�r��.��*���h�j,Sފ�ՌL
�a�hT@��Y�$��=#���o_�>|HG/N��]ײ��n�Zk�N\}���{)kys��0�v�C�4)���a�vy��<j���	�!�&���Y���c��/P�f��C��~=���L�Y7��a�U�n��=C���Z�^�IL�kIbՃ~�n+��ĊiC����Q&g����>��@qxBq�Y���\N[�����<�U;��N7{�9���:&�?�Դ�}]��5v�ux7�vNv�źu��=�EM�C��Zc���fw�a;
g����{�׫5��0N�o'�!ّ��l�K.:����U1�ܪ�:���^�B&�,�t|�ց�o^'ȕ��O�����J}.��1~�0*�cX�+M��ǒV�9�pxH��̽]F��F֞���;g`�
US�Einh[����Y��P��@�E�;�׍��-��3jo�>�f�C]Q[ඵ|6�f���dH���=̲�Hi��pƬ�E<��`��5����
:6{�f�.d:y���q��*�7c
���t�/PK��mW_��
setuptools/installer.py�W]o�6}�� �I��6+��5Na`M�,]�BK��YU����s)���:?�yyx��UJ[�j5�ͳ2퓩W�V�0�ʡ{�bW�e!&k�v,���V���B�G;��Z�N�]��򤅭�y��Q�ƽ
����R��o�(Z���2�L2�f�Z>���,)d�5a�]L>ggg���Z0ښ�-�*+U�ꊭ�,s�YnL���&�Q!�LY��Tn�����>�u�z��T��a�$�1�)����:Qs��+�6�$�ZY"�<$SO!�=�`�+�w~�>���ޤa�!K���,<���ۧyk�kd��sV
�����f�
X"�8�/F�JV�oX�y�`=������A���3 f��+�	Y}�7
�86!Ŵ\��0p8Ac��(j⫁���ת.���b^�X�郯���,n>^����+�ny.N����:�#�Wn��
!%�'�U��e;��B�����+x^dS&���Zj��ޱ�٥��*iN��=}Ϸ�搸@)
�H�F�i
�p(�2娪'$�����K���'�%idXXH�r��M7W�oɗ�?<N~Y���n�!(
e�U�E��E@�@gZrXC~KmU�n�e��}�Qƚ9�A
q�(�0�����6�����(
۠Cz�CAT��P��q`����Ed'{�X
�]w�Fak,������w��k��L����X��2^<'�.p��*�dt[/ox�v����1�n�+V�N���6���hy��t��\;,b��
�.6\e�BYF���=�A]�B�|��s�@�d
W�nb-xAa�JR�nI�������=_թNa��cyGyX�L��
�>���@15 ��Lx�����tSQ\�hw��^�M׮�{Aݓ���<�J�-��]2=Z�ˠ�r�������T<�,��P$P0	��'�6g�J:�`�t{,ڔs��j'��=�~����j.?ǖ��W!���Of��x_<(�O1|��;1�$�����B�"�|7H�.~�$�a�;E�Yk���v~�~~��BNd�!S�\п����Ie5Θ��)�~e����!��Jo���10�(A��#�*&+BM��k`=�Qcw!�͔���]Q�����>����6o��G�z�c#E�
��ZM��lFȐ�ߘ�¶B��d��c�O�;ѹ�囇�%�WR�����w����(K��4͎�:	7�ס]��g��bt�{?��pd��t��h/��8[�\��'�
ǫ��Paq����H��._�\�j�ۓ�����]s�cRݏ2�
��PD�:�Q�'%3B���PjZr��㊯D�Ai5,�����<+�MS`UM�o����L����x����X����C5�tѕeU�l8��]�$���G��tqoXlN�PK��mW2S��,setuptools/launch.pyUR�n� ����`Gr-�k$��SU��D�`���:�_��8����3;�9⯚��F���A��rQ�iR��΀�D�́��	0��{JU��;*�)�H�8��x�O����w3��Ff�ƢF�\�<�i��^+B�����؜�� ���N���e�(�@��8�4�sZ��7���Ǔ��ͼ�����t��U�v�s�v@�Q�k������8EsT�.�/I)�3ZB��\E[:5�+��)(��5�k�
h���N�١��h%��IY��k�^��(�b�1�t�e�t+�q��S�(֏,�2T5kG��4B�3x̡
؟��l�v��F���𝏓�ˆ�`9��:��Vy)�?���;�f2s��7R�֙�D}��?�!t��X��oE|PK��mWE��4asetuptools/monkey.py�Xmo�6��_��($/��4ɺˇ"K��d݊aZ�m.����S���%�q���
���{y�܋zpp0�Q�=ߒ��j-�QKRc{+�)g 1M��%fk��Ib)$��+�t�٥�M�m�Ֆ}[Y���-�j�*�b�6|�Fս�AI��㕝`p�w�ʌR&%�����z��zk] N�
��$����4k՟�s(�d�z���[�y�?�+Tˤ��!��/	]q��U^I3?�����y�tk��3ܐJ2����n����b�dn�ޗ3��Q�{C�V}[�z�s�Z��k�y�E	yR�VY��_�p���BlziE'�gf�"0�ᤅJr��I]�𝝐�(8!���9-�
9�DX�岀j��xk�9����ԥ�Ғ��9Y[ۙ󣣕��~QV�9�;���%���L�
�•�K�HހO���9�� >�����^a1'�)�Y$�f�]�@dAߺ��u.,o2H��8���Y:�j	��-k+��W-s¥�O��7�)�
"ے�YԌ��9�I��d��p��Կ��bE�CD`꫱� 	�n��5��ռ��+�"�5��X5���%i�O�!�Q7�Y
PR۞�B�R�5����V�A�i�)ڴ�G�����;0�y���D�l%��4�O6O��g�a|��1�l>Q�1+0{0�i͠�H
%�%�[���> /��5��-��l��Z�l&l@P�1l����y��fmf�Y4���8��Ҽ�TM���"���'B]���W�~{��[SBgGP�.��� g9��Bw�T�b|��m
�ɢ_�5O�˱A�3��R�o;��D�Ǔ�v����C��U��0��qh$U��9>��*=~ŸO� �O�
�͓�g��lz��L�O9���B���
9�ˠ�+Vm��=�ɰ��v{{}w9\��ջ������]ݾ��������Ƀ���hI�E��
��f���n��|�AÀ��[v_��/aG�ߊ)٣�t��k��K�w�e(ܫ����x�:�e�����3t�b����5����I0�	LJ��?k��T$�ȿ���IwJ��(q���8�T�A��<��5�9��4�F�ݯ(6��`˝� ��b�#,!8�k�k�
1k5�,�R�YA��$>p3i0G�⍧A��aI��p���`���	5o^�>��D��$�ְʭ]��0��*xJq��Y�}.�SLäFp�Ȧ��k���֒������A
�-,�Fɍv΢U�m��'6�:��qD�"+U�6����+�/���n6�J�K��-�x��N	��I�͆i'w^��=��>�<�ވg�rF���M��j�ao�E�|�^|��h�|X%B��"N���/ۧ���M:�!�8�|�I�xɍ��2jiɯ����Cg'�7)^��SxϘXE*��^2=���[���9)Ϝ.�J^k�=�D�l��4LX�����a�P&������-`bB��tD�"4w�z��)�Ӭ19��z�h�t����S��`O�z���BT�>*�]�H1�i�����yC37u�w7_J�b��Oi�q���)�Rb���f�D/�u�[L�&9lO�70=zY���[��
G�n���o�QsIo�*Hj.���W�kL�Iy:R�
 �륄�PSy|�E<؝J��l�c�}8Z>>�o�]UzS�v�e"�3�E��K'�g�r�M�=�l>N�����ci��❍o�<�b�g!N�,��$�2�n�t|
l��G4+�R)Tu�[b��7�Yl;Z���PK��mWSB�(��setuptools/msvc.py�}�S�X���ZSYى�@BH�Z�mƐ*�f�S.�>-��d5w�����[:�I��U�S@>�}����>j�Z['�E����˖�E���4I��8M�d�{�Q�g^��o��ь�Y���.N�c�:����V~����ly�q~�X�o��$��������'�{�B�_�x�\g^�蝷슦7�{]/
뛿
v���`��ᶇr�\1�^����f�,If��|g��9l�΋����|9��b�W���O�&�c�T5���e�y���gY�J�]F�p�u�_��0�F3V�nM�$6knEs��YoM�d�A�,Y0�,��Y��(�z0�e�������D1�I6��'u��p���m&'q�n�Y4�O�0��˿���9H�^�`_�Y��L�eͲ��i�f�����`���*���@B��]���s����<I�PA#�.��?K6d8"����8�b���ˇ��4�d��Ta-r6ow��C�\�s����8e� ,^E)�f�]���Jt��x"�x�5�%���d	l1co��8�6� GS`m�p�Y�eb4>~~yw�_�/��Ӿw�}Lbf�rzz��Z8���{�~��M���!޿����O��dj!�9�5�m��y��4��K9@�� }/7
0d��^�
�Y���(3g
�z�]�q��s�4�2�yG��>���Nj����z��<�>c����뀾.�n��������ݳ�"g�S�v3f��sӈ����ښ�)�p8�ƫ0��٬-vJ��F��??sV�Z@�(-/O�eƈ��2��EWp�HjeD߶�{o�Th�g�YG0�[���G �4G�2\E����<�]�8�i�3b�SR��s�K0�z-�r0
�h�9LA�����e�m�SP���Β0W�g	L�8�N
�|�����k��j4.�Z��x8
a}����T�a��25�����X����`w�Swu�j�G^��D���-�O�p��g NA�+�$��?���Z>��,Ǩ�`F��e�*�-Y��z-1"4h��&x�ni'i0,�8\of�\�K����t��Y�A�s����z���Ʉ
E�l�S-^�!��Dͣ�9(s4F�֍�E���`\ϷU��
EJ|���@���Rl��OGIKB��Mom������	��8L/2���k*�
�H�H���4��(��&��6�e�c�>�Me@�Z��I2n.<6��v`ɉ3 @�_��3��b�2հ�H��E�m�,�E�{Q �1[4�{hsDc�:�u��.�),��T�q�UsK�OLq��^��K�S��B���/�$C�k�x���AM�bB+��(��
x�MO{6�'S>b)��օk��m����Ǻ�I<Mڜ�@�N�[a��&��{������q�w��M���Xf4ʄ� �gwOJ���Z+�E��Ϩ����
��%'[��Ҟ[�'p�@�-�'�+[�][L������Y�
�7}н�Zv���k6���͑�?�_?���7|�~W�����/�XjT]C��X�I�O�ގ~h(�n���h�Ʊ�q���vAm�3~V]T���V���q���kUٚ�
7��,����&[��I�,�������K��t�#:a'��"��Dv{���
��Zt�����1!~Ћ��%+}�؈y�~���q��k-�#�-��2�g��bw��ܗ��/MՔy�ݗ<8�
2��2�+[�rT�Q�J�HHf�h��oω"1N�Շ�z
�9�
�`h�
Z|�3X�2��q��h�-�a�"L�٭7�c=@�e<FI&����INt�/��rMx��|A�d�C6P�
���Gq��R��y���j�lX;M�cB'�=�n}N�0E��"d��:�Q��K1�T8❲��<���	@Տ��`1-�y��ůd��`�V�Z�Չ@7�?ڵ:�(m=���*>:e3�U�*�vW�&����e��">@/��^@�����m2گIz"f�zt|C^��db������3n Gcth��Ʒ�:�����i�~���1��j���%��N��,l��m�n���3�K>!��ޗ8�Y�h��(��&�@ܡ����"�fy͢0%�)�y��wl^�@�ˍ1g����ٰ���7<�4<�����F�~���]�dH�vz?������)o���-W�o�q�a�`��>CK�;师%��ӣ9+y�4\�2R1�;�@��_Հ�8O�0�s�/��s�#$�̗F�+���dH2�U��Q�Կ���>�Ǐ;�ؐ�{����8蝞�to���{;�VmT����%#빹h�e���%���K�u+vx�.Y����o�@Dی��>I����R�(�/�į4E�����6sL
+�s�1fc�O�B�հo�/�s��ѭj�P����@��&PS1��)��I<�8����� �AЂ좰ט\��(����I�����>�J�G�Z����R"�o��_̒k����QT��r=�+c���yfp���Z�S�۫"�7`G�w]/�vS[_b:�g�#-�]tDc�y��f������{6�Z����~���_1���C�2m{�e�;4&�}�r�[)��_�ӧ��3�+[�4<f�e��� �x�}��Gԡ ����@�[:<:��ї�$�`KŒC͕��,b�9ym���P|��kd�Y���_K�b̃|H5��J\(n�������I*��7��K1@t�{z��;��tDtm�`�(����U���`,�����mFKaə��ely������?X�w�OAg�h�P����f��p�q��
��)�G����|�V��/n5b��J��6��y�v����y��Wi\<a��~��i�	���#eㅹ{�<�v���,;0���ϡ�݇:�[�UI��"�{��/�b�<�0����B�'B~a��L&ބ�!@���+jo��R��l��.�фZ� ���%�!�p`��1v2[����@ʶw,c���L�$�%ENa&#�bF�i	�!� ��|S"�e�RE
~�p�֊�����y�Ї�AC~� ��p��'�E��/�����7is�I���E�œ��� �$��`WVj�Ǐg�8�Y�h�M��8���u0Wf7��3��3��A�-n�O49|4��
����:Y�YHҊR�>f�����t�1����� ��C����S�o�ME���,{ `�B�\�h�1����)r�Ҿ2�[H�k��4�$� ��O��V<pߪL�k��(����-�v>�o
���Q(�M�ƕ"�(.�ai1�:���p��%��^e���P�'�u����h��G("�e�/�=��`�=[���_i*���i:��A-:8>-�����ud�K��:�1����{���On<�8�4�Jx�jE
fD�J�
��2?��+��Rq���@��u�E�����)�*=��g�p��x��3|]�-�D'm<.�5Ro��(��T����@�rI��}��5O�M���x�,��}�%���>�V)9T���x�0�36���Y�#�0�g0�%[�_��1P��CF��,9���<�!�p#Y"���eI��O��tn�g=�sVa�(T��߄����q�m��O�
o^﯃R�$՜k�@$B_��so�Y�6v#`b��`w�����Xuq���9���������K����[�1�r���X��/3P=t��i4Ƹ�4�M����v�F�B[�pP�_ �$nЦ����v��D�zШn@�u=�����o6�{�$ ���@\�����Lb�-$�:u�[P���E'���{lZ*T�!���@C��2�n��
�dF#�KM9���N#�߉��1�琥M��0DC�ӽ]\��Rf0p�Xs]����w�49��7�ȃ<�ե�؁�Xlj��X�!_C~��
�]�O,v�[1�P>q8M�'y�J���JS���l��by�	
�>ʆ�vb���o�j>�T��l5WUT�}��H�No[ϒK����5�ͧ-������B�mfR�L���,��iV�Lhg�T[��Es}V�*�����ʥä#�nx���;5�þ�3�W��d��ӿ�?,6tLkf��4��ڗZ�!�.�y���� � ��j���h��u8�����<��x��8ۃ���岡�]�1�lr���zXya͝U�r��m�c"�sϤ^yx�4;Z��E����|z�>����3�-���$��3a
����S��\ث(φ��֔52���y���w�	�@��N8,F8C�D��F���*x�
�3Qՠpml�c�@-�<ɓ�x�Y�\�#:Ůo���Ol�y
�d����F�"

�1:�SֹY8�;9X�i�-�g��ɧ�3L��ᙫ���9{�5(�#Ц=�gYaD�ܗ�&�;�ϴ���Y5&��a���Pu���
�
!�`<K2f�����OlQ����[����a�nj��V�=~�E*����}IL2ϰ���v�
ig�M[%|�|�*U�kU�]�RYPs�]
$�A��SYp�>
���DN�r���y1�M{�w.�l���<��)����`�U�ea$���>{����<v��0$��E�uS�]J!ớ���ͧE���U�YV�a�<�S���t�'���[	2���zX=����p��Y�<��f�f$����-�PJ�LBD?�ti�t�?�y��FO���]ET`5��n��Ϫ��rv���4+)RRX���)�!Z�[��Wx��p�
�bْq�I����Zw�e9��i��}��ޱY΢�X^�sޗ_����Ou����ǘ���x�0?P��$��h�ֶ��_�b20f?�c{�ٺ��G�E�X�r,�E��e�u�6�I��KZ�`�<�?�ǤV�.߀�D*7�������.$�f`Fw���PT���D��ֹ*0"�2��spm�
/����2G�tC�A���`㖍��T�\�6�q�ӿQ�I�L��W�N�iՕ.��Wupj:2���uʘGΪ�U0+7���f	#�bϖ�<���s��%S��;���U�w����0��]e��@�Od�>ט`\D�:�R-�H�����ó�Db���	iR�(�p�K�N�>$
�� ��Pʄ|��K�SZ�LB�p6U0?�R��[��D�ԡ�;K�f��\�3]Dz��D�Ykm�f���VC��0��69��m����au���s*Q�6����1��F�$�.��M���<�w��-X
��D����gv�f|`M�[���r2M-
n=�M֐�۔c�Y
͗�X�Os�]�-��˒͢c�X�m�Y�7'Q�ٶk1��*�����A��� �֥� t0���{����\l��/��߶�;��ŧSntp�Ԝ$�_Q�/�5:���F�'���9�tt��q����Q[�.y�YI�:<9ofCڶ�y��S��I"l�[�
�8�6hU;��n�rx��*ZP������tg޼`T�G����.��$���d���Y�����G�;6��g�|1���B��l��')�vqb
������RкOC��”+^?�έbN*��ǝ�Ͽu*�"պaU���$�8�imsJ��l�)V��xxh������r��@��#(ӏ8oZ.�qy�����"�)x&H���6�9�d7"�������r	{.�U	��O
q�nK��s5�G���J�n��"�̳�ʊGq��S����:%�E,	)�]
��'cԂ�#��>ْߟ��G�u��*�P	�56�6ؿi�sʙ�Iԫ��4���8�{�Hn{ǔF*�&����j 0���Q��!+a��)���Ch=���y�v���k���b*�2�s4\ʀ!*|�r<�I��(�'�r�D��طa���U�����+�4rx�,��0)N�	�qv�v���7�rW)ޤ�s������^����S=�s;����Ȍ*���*"Tn=��:5㻧���0��,��/T��S�Q>8xC����-�W"ȏ���5t1�W���Rr%k�eg`*�,����x�Ë`W
��|��ѭ��庠gY��S�~~��I�~��섅�C�|�U{�G�!^�=�n��90���y��|�ݺ!�ŇrDQ�Q����}��3�:7�
V�s4��M5�QcR\��e�F�./�E#��y�1b����� ��b�W���	+�؍��}�!��_��������f��T�DIBmC��
_��3K�Eand��
�xMEI�+(2�›��n�$@#�u��L��ө˛�t���Bs��N�mURd�氀�u�"թ8��9��xCR_�D[��ȳ�6��	W�]K���jș�69�(�߯�O����|+���VV& gR>pi�I������@qRqj��?��D���]�|�z_��UK3��-�4�f$���j�����]����1]t�G�:n�^��cc]t��7����oo���Y�IJ�L��_��(-���/�oD�oZ8Eae��۱������R�
XW܀��]���<dA,�u%��9����;�b�)Q�фH�D[���_O���6O	�S�E�eeJ)���
x,Ss�c�u�¢ �붿��	�e�2��.�t�Ð���z���F����2�n��p���i��'��S���`~�t���a��g��p��"�Ls�
����e�.6���~�(�m�X�W)�x}|����v�k����X��9�"֗8BC-��N�,{�r�~t��v�6]�懨�X��V�E�N�<��vy��!	���H�˷5�����弈*���u���Ɗ���}��Pc�[���4��
f�N��.o��
�\bE��bظ�I2��=DW�G[�v����U����+~�\
�e�}�r���K��l�ґ�P�[�\����cu���C���(�&G�8
��KX��W��z�|�%z�_�����$dzmџ��wMO�(p��<��E�ʙ'HanH��Y����Ve�Ӫ�{��u��!������1�t,�K���$�L�if��+�w�{q�cz=�ı�
/g�����/��@v��(���{�*,/�#�(���/�#�6�&iSۅ�
�9�h���.��\��w�Ah�h��3�[�"ׄ�L�a��K�|SH�:��% *��l����n�kw��L��t{FS�!�
��Tw�U�b���΋ݟ|�&.ojČ6�/��������zճ���U�aW�	^�*]�Z�u�@;Ł�,r�7����ۋ�M�}ut�E؅��I��V$r���`���
�x�Rऴ��PU�	-}šw�J��-�
I��[1u�T�[�Q�~/��y�4k��M�z��A~��6i˼
���}2�6̗Q���`*�sހȐa&P����J�&/<g7y�‡�.E�qQ�Zx7�]{��r�n�V��EAPSbFcQ�����h�	@��rºx��%���!x��S����{��E� �)!��`C᝾�%�4Z�ޘ��+��8��RV��DsNHt�LE���Kg�_{q��� ��k�^%�2��'��9t�.���-�`�����ާ���B�.n�z�2O&,��G�`*]/3Σ�5�(����ښc-g�W[��]��;�������;_u��Y��}�2l��ӥ�3���'��\(K���|����-#~V�Fm�����·5W_�U�[��c������)�d��q�}:�$����i1���v���,�{�|�į'G�>���o���Y�|
7�0��cEy�ȏ�!c�7�Y�
���79��T6j��X��36�[�Xg,�s�>���db]�M��ȼ��A0�,�y���-���7��[]�i�f\����(u���K;�G���v������5�R���o{ս�~`����7հ?���
�r�
hܻZ�q�d�;17q�,T|�Fic����1�'7Ȱ֯�f��o3R��)�6g&���2��c��0�ߪ�f���5g,�@�T�
�kF�ڏV���&��C�1<��QZ�=YK�2@�w$��s*���j[�l%&�
����j������To�ê�v��.��i#�L$g��$/�N�vꏢx�<���}��������i�Q��bR����Q���
���
�)�kxZ>λ�u!u�u�*�u���GB�P�*y��P��i���uE[i�*��)���.�[�j��P#���a;��r��J�\��c]��l9��|���`�:��ofU��#z�H��3�E�H�����u�����Lx�1��Yck
?��k,���D����@�(�.��
��p(�S규7�7��F�6{σ���Q��n��.N;5L<c��0�V���5���C�׺�kc ���h��x��#[�ih��:�l�Q����o-R�K�|`y�7 Uz�N6$��5΁�Gu�ۛE��:L�1�����Y*Կ6n
�?�Y�0r�ot\E�m��uhL�h�髖AE��w���Y��T{��_��/�li_r�V	@��eʙ�`)�3qg����;*���p�3 y�����q_׺䎀� ��q+�F�C�bz#�5�m�f�Z�"&)��Q��4��VGl-���!�2���Q�ш��:nSD���wIۘ�������W�^1�a��;�|?ڭ�&�������)�hMed�W�-* �
#>Z��/3�1M��1�]}��a�n|Ӏ���c&ߘ�.�iބ�2=�= ��T`!�'�,.���إ9=��F�+3���E.n��&�����v.��H�f�cfX��w)���E�%�UTYl�W9:W�Kj���5�A+�،w(��W4�q��c�RQ�xWt�N�w$��Y^`tT�.����/�����[���G���Э(�y�ag+�|]J
�f�NQ�A��)��9��a �d��_�24�9V�Θ��"�CQ����u'^���h�LL>�9J��wS<�)}�>�;��~��,��A�C�gL�[mj��Q�C��%�ʛ6vɐv�w�2�\A�µd
-h��YY߹f��۫��LF�W]�u�b����V��jJ�Tg�
��	�:�ɶ�f��$�f�����*���a��^2_]m�8O* ��
�:a��U���ه�����W�f�e��=��<���~��U7s�)኷�y~��}��wz�PkW���"�aե�Un��.�ܧa�P�\1ƺb����}�=���F�Wq��\}��$�u~4GAŕ�����~��#"՗�u�0����]?��(X��B�Θ(q��a�J���)�ܧl"#�MҧR�,)uO���Mi6��U��������&;LW��m� �KȪ�=���@E<,��a<���_���;�5'��dK��'�l
�Qɘ;J}�K���/�߱��x��1b�3�Mm�yȯ�1~���
K2��
3�W�lhB+�ԣ���؄�1.Į%�(���_�Ob6NRf�Z��G�k!��W��{��ظ䛓��Q��9
RYXf��=��ðay�cow����'sF��S5�ظͼ�6���;,�SN�Y��0Y�7R��&"gW"�~7���jV|���rD+qW��jP�vX��s��v�p��(�o�ۻ��Ҭ#��4.��3x# ��I��*�TWRAk�d[4ʽ(�
�ۉ|O���&/70�QAn
�ǽ�L������U����3��f=���o�v�+\��`����:�J�)�d-`�I-�w��w�������kQ���H�
*�o�Y�B
�&�S�����;C�vݏA�h�>�$� �{����f��2)�Y:KkХѲS�jУj���1I�C,����FgeB
&����Ze��_��J
��zc�ݿ�F��ɮ\��כa�:=���I%_��	�$���Y�oX@,uQ<M�-���l����^!�_B���gڻ�����g7y�]e�E��9�L2&�#�P{`�����+�:�8)��!e�lŚ_�~�q	�+g��A��ق�A�''ւV;�����8��ast��<��pU��)�.a����|��x���/��X.�+̫g�]"7��\���:��0H��G��:~�*�H��*6�D:�9��}N�G�{F�|��o[�Н��o�����u�]�&Th�?��,n�p��q���k�@���PK��mWpm!Nsetuptools/namespaces.py�VK��&��W W�q���nn5�.�V]T������x2��=�m�̣��f���΃�g}D6�zoԩǨt@�\h{�M?U�>Z��n�뵈Qt[O��$�aI
O��QK@��fBZK�y�C�1�=�|����1O��v�G�Hp#�8�@��=����N��e�8`���tA��@�N/���r�+-���l`N�NC@/�T[Qx�"��F7�OK�$�1�1&���#�XU�3ezK��4e�h���UF�tnq��b9ݵ)f�[�a��p?�-� �����E��I��3d[�$7���d}�����	Y�T��9b�D@�֙��=���κ��ͿW��̩�f��H5�ZM�r��$���BYhX;}1X|/�"6�F�NȂo��u���r.U�I>��Þ����@w��ТOt
w+��ʐ=��F
z��hu�7�b_�G��M	�!��
�/�F�o���� '�#��M����|��N���,�I���J}{
�:<I�<!���.|���L'=��Ƚg�~f�S>�
q�RZQ��d��F�k���_�|��fH�A����9�:@��0�)�q�u��˝�hp�7�S7#K5e@�`-ͲeZ̯��ͫ���W��C6���Ɋ�{Wxi"�-�H��/�GDש#t��$Pt>�H�ȣ��B
�^t��횫^O�N��D%P�S⿧�����8�����[}�"kmQJ]U
]
4��i��ZF'��&eri�
g�}ft~�
�R]-eZ�e�Lz����lw=}��vή�ݼ6W2{���	U�)ڣB�������q�����^&0t����l/�^2]�.�W*��Ui��qL��X-M�j�g�d��H]

YI�s��P��	Z!�� ��v5�N�U�v�W��k�6��[�.JBS�,�5�
��xq���fuG���+ڀ�ei\�N�`��*�$�I�5E����=�O_ �P���Q�Q��0_����@m��V^	���2b�
�#欃���a���-����D�i}/̤4�R���'��E!�B�?�PK��mWT^�-Λsetuptools/package_index.py�}kw�F��w�
u=l�';��v[N|&����5D4I�@�@ɴ��۷��������9�)������^]]�7�_i�Y^�i���e:AV]�E�fy9{�rU�m�l����j���n�X�y������U]����k�6�"�� ZQ�UUh��i]��iU��*�Qk�0��U2-rQ��u#$ԧ�[-~Y���R�uU���j����	>u�j���D�^1��|u9�Ԣ��T�.�^��ߞ<�ǫ�M��x�n<˛��/�LU9�~��ɛ�GeU/�"�(&��]���~x�����*��r	s���&��M:�2]
��J�
�C��j2����`�Գ�O�{�Z�q��7r̘'����ռ�I�<S��X-�i;]�&m��M�����&�!
��'���D|v)�eU����e]永�������=���O^���ɴZ��Q�K����t�d������O�{9��W�}���y�=l�E-fc��4�=�N�����x�?_��|��s�;�C>L2@�>v|�—�����E��ۼ-�x��p��aJ@��_���|�N�
�͢��,���.W_f��&3KG��O���c
 �{?��n�����r/a��}:��r~	������N^�}���[�9HڴN�����}	���
��?�fU�m��M&iQL&��f�f����#$���ɬ�'�9�'�Ɠ|2��A64mȌ�%�-�<<��޾z���w�w/�?�M#~���U�(�:�d��D����]T�e���f�L�]տ
�� �&�v�,���p��Ъ�8��[��P=��4Q�嬊�s��W��^&fO�6[v���Y�i|�[���b�_��g����0�6�1-ւ�h�6��@�y#:�8�O�3xY�A�4Y�x�B5�Q��;� �
�XC���™���.��%l�7<�u�p��D�q��eU�!���߫�i�B -D�`P����5,����D`q�0��	Z\�#�1�D�Ys���(ā��P�����Q��Z�tz<:��<����=ԏD��h`���(�������H<=5�����B�ߋ�;�Q�̾xp�)?�:��մ�����?7���`�$7\�y$[���m��Y�I�V�=��M���
��Y3]R�f�d@#�Dh~�x���:�/Y�=kR��/�B�r9<����Y���G�0c�l��HJцd:2\x����8����9��zz��!���?2�a�3]�`�<�aV�0�/�j.��]���(�fi��I�h���\.!�&C`[]Au�o0���]s,�,]h
J��D��E���E����-�i��2�P�nq���Ǝ��jTӆ�q`�G��#�8��=r7���W�Z?Ll���j��c3`jpGD&ʩ;�����;�/�&��”cS��.<Bʂ�� �j��O�����&���j&�Y��g��p�p� K��aL;3靃��@��g�	H����E>_W�ƬQ�kJ��NK�*�v��v�{�(nB�]�1{�z�0e	v5K�f��+`Z?갈���ι�ܪ�6�st�A]!���'���Td;�/3k����Ϋ:oa�Pú6Igh�I���
�ݔ��bPg���Bc��H�&�.���
-
�&��RN�2�YbBb�8�
mWV�1q��gWz�%�CD���䦀=�N�K�bh�,j����{����ڞݞR;w���NI~��DY��#"Uh 21���Q�׿GB����d�D�+�5I����F�$dA(J���{�<��om��>fw�ڇ�`
�Sɐ�|ϐ�Q�:mE�Ȁ!�DG7A5z�����8F�;W(���c�يe`VrS��fQ�aݦ�y��s'h�t�����h�@&�����/m�(g�T8�~�/jjr���2���4,��O����mm�Ӂ\�& [P��<	iV6���&��` �o�?��F�5����i1��/;��@��`��"R0�4߻�	"32�5��fcV�D�_?�*�1��4��w�R��EЬ֠)z��Q�
�h>��0�$'H1�*��֠j5��������j�LNa	BZ��~@Z���l��a㗛�\���_�G�
#A��.��R�]%-�4�a[��y�ti����
�D��2�j�%Z"��z��1$49��V��e���tJ�+k����Yc��,�lt%��z�@��QC&2�L�-N��Ok�ŌB��"5R�@)�ZH;�W����}�_�d��!�G�g�m���%)��<���D��h��E��c)�i]H�봜��p���b4Az.���-aa�ɿ�\B<=^�ŽW0��%f��Hg��S	����&_a����X��q���:]���\#�Jʴ�c��E�&���hY�rE�9ƭ�v�-��cX_с#D? ���J��ݴ���{���Ž�`'FN`z��=[EK�@�7'�����=:����Eя��݋�q�Ȋ��	
Pȕ��q����X��&��:�6�E]]
��M٦�����@?��+g�h��h���b�/v�W ���=�f�J1,@���0�I�4�G�?�&�C^\<��� �3�	G���7�F�O�Α��Xnp��"(�F�t�J��n*`���0�c��lȩ"X��	Ҩ_���F>���V����}J��ùLL�LD����
G�8^4x�.}���5.�g��D�B(
���3�B��)��2F�.�*�A�k
iZ�!v����hǟ��޴+*xZ����.��RԮ8yz�ٔ�Snâx�
�J��t*���YR�se�	!���,���9��y�P?`��P,��'�*�5Y�
nǜ�2��
dh�9!�Oض��xĸcdp���_<���?��)�b^lC,c�:@/.��ِ��H��5��u����#`Da��pj��ē��-�����c�-J6��"A�ǯ"f��<j��𿣣��g��>�������e�y<;�Ňxn"{t��fx���cC��$/�v2�t�C����m�p��M�S�`���t��m�F�0��*U#��E��ǨFX��8���:��]O1\IC1�lV>�⠮�ot��1��
\�c�O�[�A�1�I"�A�3o�G�H�����a���]K�e����V�E�i�`D��fI!7���eG1�98�Gv���	Ճ�N�C��(X�3��>����cc<q�[�0o�)x��YátK�5��֛�YB�'E�C�mW��j�ʓ��49LP�F]TMی��n8���tr�.�BȨ��l3i�b�r,Bc�0d�&�t�ի�s5°�`p0N��]��V�� ��dIX�ۡA��7��LP�k�c��N�����릓�tE�.�),����e^���&�(&;t�VZ0RC��(7�ўt3������c7IC�S�4�A�sU��]E��O`5�Cv
�u���?&�s���8x������:A˚B9ȖrIMDq,���ts!4h�[l=��9/=���q�UW��ھ���3 #Y�p�$�D��7| 	�#��n�`;w�=��R����t1�Y�ԣo]J�	/�7�.=XoA˙T&.��h�!у9�4V|{6�u�=6��o{����B3&'��L�@c�Dz�۠D3M�tڮ1`|��]��T�!���N]4���A��mn'��)�,ѓ�mP���r%O��R��3C�r[����i0��։q�6"�s�X�F06��^� w��/J�m1vü��������N�L�}��5%�Y�,A�U��a�>Y��m��2q  9KH�n'4-�o?��\�+����u��Q��3j7+��ba�<厣�L�
l��%g�R�$
��A��d"��@�"�E��qB�YdmjX�Q�0�(Ͼ(��x0(�Ђ�h���X��:�4��N�B�V�ڗ-��	gs.R�a�^Y�ۂ�o�50*輼<�w��0E���C�M_p����Pz�+?)��W����(8>0��`~����n���c�Y�ǔ�b6$G��^F���d�8��o�9��W8�!C�R�1��c���	�3FgO3��0+� �0�������G�!��{���t�_��Qa�J���d�RIJ]mwnQAA�@�kK�'ХN�~������@|� ��.�u �Ƕ���72� 2���\2�Գt��-�����.��g
l!�E��A�bˊ��mZ����]K�2!�E�7�הR�mB{j�5�<��o��^���*�vr[ߗ|���Fz��F����/ܞ���u��I�98Z�/��?ٵ�m�M��/��Fv���"�
ߗ�f�@s����C�y�g�e��û�θ�@q��.r�\�9%w�n�7�}D{�������vYW�Q�N.��	�dc��x]� �9�!��L+�FHIG{�vj
�M5�~��1zTuz��D��� ����:-i:;���+Ǝ|��@
�C�zx��Pi�p����I^���ȾV�r���D��RV�DJX���Ua�Z��tn��D,Z���z�g��f�������` �˳����H��:�ԉ�@�I�ixz��O��+r�Tϗ�&�?y����ۓ��^��c7+�ZA\v����̢��i����d^��)rSw�3+��lȸ˄����=N�c�ó�;�}&�K\�U�-�/'P@β�W���E*y�|������Ha��j�S;8%w1�A���~�O�p=�G�к��������ئ�uǎ�)�D�}'��C)t�"�LMeڥ*�I֤>吳�_��4���,Ay����7w�.��Dտg��P���	���l�xx���<�F%�x���:.�^�d�^`1¶�(Ĉ�]h��*���-R�*�8��,� ���� �m�� 6�p�;�5���s��ˁ{J�2�-�ڄ�^G`�xٕ�,~��9�����4�;M�א�jƽ�~?�����W���BcE8s��juA0i����ty����80�4���s���ѝo��4�����g��(�kl��>�Z4tks�s;&1��u�;�̇�MDn^"��GU��3���G�=�,��u�cf�<����l�+�ႌ��ģ���ZS�����u�Uە�r�(L�/"Q�q�6�����d�=+����r��p�1�!����]�>���	��V��xW�y���l(�bӓ#ϑ$)fT�O5��P�8q�m;�?��O�0�E��B$9��}���J�I2[C�K�9�sl&$JawJ�m/�k*K�M���0��k*��֒I���s��x���܏L4�Q�v��˒���e���lբ��^���1N�'v8�!�M!�L`��-�z�_���Ł���5��1�Dc�9��L����f�Y{��ސlj���r�)'e��ג�2Iehe���Ֆ���B��nB����<n�B��y�L�p
P�`4�%-�<P�ݍ����]�q��u��&���M��3a�v��`'0�_vT������`���Q�/�{
�,�tB�Îs�I�����(Gx�c7�}��J9K�c��9��C^�ڧ�s.���G���5���l���U�r�O1yV�	0�ݶZy|(��T�y�ԉ�S��8웅�t�ٮ:��R��pW�wւe�g������
&z�'�+n��~0���
s`Q��^��ϣ��w�Z�	�e֑�JR�S��"���Z��^(	���h��;�@['g��`�ٳ����w�I�P�G	]@�S��\�,�ˤ�k�]��H_!
�"��Dl4��†D�ۜ9cV�PF���9�6i���cr���
U�E��)9�G��\�L��'e,�Y	P9�Vd�lx4��}	�Ա�z�g��q�V��e�|��곜ч��V�f��x�{����0�H��;C�{�=�^�C;�_J ��x�}��@����*ҁ���ܐ�	F@eBo�K�XnCCC�MU�0�N��)�	�nF��rhHQ���o��t��bA~�J�L�&�~v��)ߐ#�(������#�#���\p�d��M�L(0V{��e�_&�eQ�p<��M@�
����S�p8�[q�b��l^��	�-Z�)�j�L��+e�Ճ	�$3�O��kg"I7�ʐw ��J�j�%׮ffJlh�N���bMgx�`��7���ɶS����}���r���R
��é��r���BY����po��\��Դy,�2M��rٞ#
<*��c��di*�u=4�2�˩�΂j:]C�lM�g�̟�����{��$����{:j��Xp��O��`��F�N&��ׇCt*n���M�Xu1؃ts���d�|�=��Aw.�	��~6�oGR�TԾcY	2����d+����V_�n�!�HX�g�a3}��[��,���r��"g
�A�ĆJ��{��4P����:)��u�]Fb��d*���\����+�r�d`��jR]��������
`;�"��oK�5뼥�whP��,c��yn�wnif��`�,5�{I��j�;�h4��(�p$��P�<�x�	M�v(�`�+�w��,�"��b�d��b&9^�5���d���Mò�C4�J\r�
�&�N����6�5���~����G�Я�Z-z{ؼj[�=�G��ٹ���2�T�dO�c�����Zq�r�	��}ٟ�9��Ak� $�3:�J9=d�=p�);�r�x@��&]�CY��s�A��`��;�x\ˈ(Hو`�ZS����s��j�%y�ܯ
��A[��8g��%Ɩ�f/Ff�9x����OѺ�U���G�1P��W]AA��D��)�����w��jtR�XZ_*s~�kR�
$Þ�M�`�ʈ�Oe���N�N}2f���PU�S�0Q�m�B���&��E@D��0\��M����}P}�\#˜�b<?�D#;/עO�V���a}�ϑ�Qw	:�!*��?�!�H�ibS�=Z�9�,�m5!�qb��m|ѱ�� ��i����Yl����E7���"���J�i��=�$�4�u,b{}�-`�y�/O:����@�[M�F���Z��$��a�$��t�D���n���K��*�]�(Qz�"�k�����,��A��o�v'���mɵd��5J�biD��m�i��u��[�]�N����ξ�b/�g�;��g'�ߜ<}���ٗ�a��GX�V�)Z2�+���/�G��my�����(�&�$]w�B"��f���؊(t�`.����X�r�f��ۜ��g�S��Y5��]��C�.�i���:,��`1H��.��;u��:@jW(z�oY�:U!�RHU����p/����X9gm�C�p�Î� ����U�m��kd��c������]`0ݍh�:H�]�Q�3w<L���k����pU�/Ч>�J�X�
�/i��H7QRob�3c��ϭ����fo�9�t�TPo�m\�oɪV�U�7���uH�t��'�x�� �ϠC�������NR'�|T�N=Ե�;���(��ީ��m0�l1[�C<~z��-7i~�V��?�j��+>XO;���&�V��Y	���-Oޟҕ<k#Ez�t��\���d�ei�:?�xd��a*��C&�d00J���&Q΍�eItkk�wDyګU�:kit�a�%�Ld��-����C;@��0�ʹ�W�*���_�Ij�w�	�vh0�z����GVr�6n�ʹ=��\'����g֑E�~�~�/�*�k�+ P��R�U��خ���"!�Suٻxۋ��7.W�����V��m!�%�F&�p�.&�T��/�U[�f�_��%�+&���ֵ\c1��F����62���K����0o܎_8��Gs=r�3�e���;��s�9�ti��)��.O���2�@9�p�{�"I85jQ��u�S�o
qA�f������٪OJ��~��՜h}��E�׹xN�M�;�*U�J��Z.��bR��j��-ƃ�?IU�ٞ�M�}.�je�mɭ�iD�iF4�%F�{�߲ZImZ�Z�R�mGI�x��S�Q�rK��Q���Ɛ/d���[��ɬ2����[h8B�'�e{B�N@{-"��V,���>"s�ch�8*yQR��o���vթG�.a K�������n��aW	扟���ޮ4sلjn����!�P��%߲r�%�_;y&.ɼm[��9�+�RMU�a"tkmp�B3[w��Q�Әl#��<_���6m��w��P���(
�E���v)��Y��t#3	�-��5�_� Cf5oE��$𳍞�MPbI����69�6������_yle#��_T�7r�0�f�\��B��V��
�IV���a�#L�����Q/Y�U�`c�f�06?��?M�]ޑ�5�LLTe2��r�N%�G�~)+�V��5�u's��8:�{^�Ns���dyt��uU�D0�a�N@i�C�oO@%�ky�ʐ��8��֯�����I���1e/�;�<o���n9���x������N�
LxA������`��M��b�N-+Y�W�D��RS�5Ygb��e�)=�8q.Ky/��gf�@ꍵۃ7�dgm�j�ژ�N��}E��p�����1z�_0˕�٢C��#P��{]�+`��%F�Q3���N?���.Wh���ʩ��эPC��!�c�@9
��� ~�F\��}v�HJ��5�K�ޱ���a��w_G}n���Y��4�!?OK���"�1���C���~���T��|;� ��)��Nc�VS�ȕ������z�/�m,�0`��`���O�Ϡ��R���/R;�Oj��
o�c5н�+̳j�K+��n�Щ݃�u�rWG�W@}ʻD��Y�7ՂW��|7~R-�������B����98P�Ȫ�ߟ�1l,\(u���%t�]S.�/����Ј�ysE��֜����ކ���9]Ð�P�x�GQ}�*��!�I*��uUgco��H��;
n���K.ߘ��m���tن�0�x;��pӺd~�$��TAjO[�Og�a�.ʫ�O"�Dᄩh�AwGj�bv�X] ��`We}��]>�ž\Mf�I-�&v��& ,f��~Q/�N��;���[�@�+;�Y�K,�m����BG��L���V\K�ƞ��/\u�p/}��|�"�Pv�p�W��,T�ME�>S�h�1oc0��.�=�k���u��ޭ:,�Dg��fᮈ����,ԩd��6�f@�0`�����/�\��S�K��il͵�0|�ި�{Y��vBlFOu�����\���U'���;���������]��,�+yM]a�k���hz�q�z�L0�hH�;�Υtq�~]����v�ߪ��;��&��޽*{{��;.��o����e[�)^XCI�n`�3QS�m�ˆ�|��Mb{��q����C�icZ�K�H��'{<�tx�F�_��<�_?��������ٽ�������}��Q�ަH��&��OIJ\/��vz�}f(uJ�$8�qas��)��Uk�)�Ҟ�v,h��$6��+ߠ������#��$	�S�^�$����O����d�1t�<n�L��_���K��b�����<�[�e���CIS����2C���/�'m� �#����؜�M:����mk��\$>�L�D��q�.��t��Y�k&�u[{k�)!�{ٗ��{J�	kJ}�ա��Z��3ZX+Z2:��u����`����f�Odl&�{�����>�|�D98�4�����t������~����j����g��G���;��́T��^��b%2
�>�[4%תk4�^@&T�sVȀ{w/5>w���Eޏ�6Gw2��������y�Bv�J��E�%�5t������\||,a%��dX�#�m0����d3�;�*�nP���†�*}+&8����봮s��X�t P�)D��E�Zd�:I���j���"��C+��Ri�v�*D�}�')p�@��hU\3���U��5g8P�r���|�|��}x���H����;���J_�qG����O�r�ϣ)�CY'o�k��5�md��[J}G�`(�� ����So;)Ǹ����K�i�S��1�>���x8<c�Q�v��}=�����Y����Jˌ�E�SZ���5x�>Oݽ�,sh�� ���V��6��j�=61����ˆ�.t����igH~-&��|Y�C��z�:y���)���T�U<\w;��zK�.3�L/�0���p�O��������[Q��\X�5�֛�����T�r�j�� �7u1Z�ߥ[?pj0��{GށE͋G�\Nc���R٥���|a��uk������i5�(M�Z��W3��i3$��<\��{U��*�\%�×�)ߒV뷪���8i�?Z�ƶy��@R1�ݐ_.����y��V-$v��c�[B����c�*K���U<]�>���[*g.�D��a/6���>E�ȩƙc
E�
Χ#���J���_9k�������'���{'���gsE]�� ���͹0��������p?ͲS����ݠ����u���SǶ&���f�&e�#��Xh�ÎP������a]ŏ��C�
>h�b�Ef�`�;�U��b �]�c��NN�5�:m����[��q7�/ɽ�KuWU��a|�6�����BŪ��c��_u��#o�a`��r��0�g���FO�$!���t��dQv:˘Hv޶���u�!�d|S5o�*	���#����X(�74+��5�����h8Av�+y$��H.����V�5[%�
�ы y��݂~�Ӎ�K�:r��6<\o�ƾ��l�b��0^w‹�NO#8�@U�vJ�ƾ��+Ht���d��Z�ξ�f�ȵ3i�F���4�]�4'�e�ȗ�x�Ij�VN�ïB'^E>]��n��|Y�!��a�h��t�_wU�h������Gw��������8y7y��W?��#�������f��؎m���.��Sٿ�|�����Zu݆����v�LQ�3�}G��J�qz�#�n:E��o+z�+Uɼ'�y�sa��bx��b�4*�1�s��l��@�9]�kǝ7�xz�ޝ74��d]o�3�"�J(��sy¹n����Ҡ'+?U���Sl�/q~u�O
mygԌ���=4���
�	'����K�����Wg�9q�D^���s��!��CT@�d��'����\'{x���>�>�М��Gn��J�P8�c}�ӌ10c�پnÙ��`���fG�����<��z��~p������b��y��1i]���OnV��P��\�Ac�D�xi*����z�*�'qG"yr���.�:�� ��PK��mW�V�D��setuptools/py34compat.pye�M
!��9E���(t�E=�8c:J��޾U)�-x?ǜD�������_����^e�gw"IF;�Rഎ��@v�mɴ�m"���C�U�תt�{���v��7	i��kBr��?;v�mi�PK��mWQ�짟8setuptools/sandbox.py���۶�w��Lr�h銢C�+$�-@�岬-�gղ���/���)��K�a3p~P���"��5�lY�f�����k+vͺ(��]7B�������K��h��[��U+>�e��#M�m{�� yc���l�J����m*��;�	5[�z��B�][�*R�R13����a=7Xn'j�-��T��Y#�IS�v]�]�Z.[u(�M��<Z|?c�̐�Isl7u���+,�U�!y��/h�q�R`�(�Ћ���}̢��J*�7�V��9�"֋�hZ��5ᔗu%f)ȥ��1��Ҕ�e��{�;�R��Y��W���0_��g� >y����,j�DQWv\v2�k`���Ś����ߐ�%�-�/Ւ�u���a�|>����7�
�;Q�����L��,$7���~�T�^o_��@�����R�,���Aoy�в\,Y����*3~a���#�w
�!/Y�D��G8~�qň'`ߏ�E$��W�VH��{�ry���hJ���$7J��ci��HIU�j�ɰ��#�s�:��5x[h��=�~�4�h��>.f��q���(�\��و�<#��狺ڊ�#��m�L�K^H�|��%��$8p� u�>*&��[kU�ùi��������3�V?!s�c2;��iN��'�Nm���hRZa0;X�����ٿC��A��J�{[��W��$7	>$v�2}R1a!� �Ph�e#$s+Y���:�Mi%L��{�D_~T踲�w��G��(W{l
8[�XT��
i;Y1N�����h���#��=GϘ��W�����؉�WT�|�J�&����J�I5E-�����H�vA>` ��A���P
>�R��y(�H���aB�iO����G�74JI�,z�r�ހ�Ɂ.���(�mZcEY�"��ze[��e�o�IT�q4�B4��k

*d��J�kO�8�P�f�9���+o-D	Tix0%�_H#I&����IjM~R�
k�������4JubOC4zʞh���Đ?s�`��G�
{��ϑH�k���<���y@̎7�x���Z�\��׸�McI11+�mc˗��&�n�*&Pq�������ƥ��6ф\K^)�Aճ�!T=pĬ�I ��k�o]���a�]��٬
�9?��sV7G1(����ץ��C�`vMTŞ�w�^��c�*�L�*-��mc)�yn
7�,�����M1��;��Tv�Q�
RFK�"��7B��۷n�5��p�Z�HL���,T:��H�dob�ja��p���}�Q�!JHk�����]ws�T�/�R�b�YS�4��C�9���cN��\Frs�^�y�_���1�JuV�6��.�~�8'��/‰g1��'�k��r{��hF���	nV�~[�O�p�t�9�٩���/a�r
��k��|Qb��L�j�2�zHј|��sm��_�z����7��ϟ]�\?�B�N�"�ð�L��S*���-J7:`��5�J�Ft�5�A����$R�=19��xڔ�mQ�5?A%|�E`qE���=��y~n���e�+k\�8wܔEGI�d_/�?��I`�%�*��b9��P�W:�I��=�)�ʞ]pӹs�nqx����Y�
�}��<��8�ݻZ��CNV7����E%�zS,�m��������H���"�'��mU����|�-$&"4Ю��<�4e��@�����WΡL��#�H�%����؊�C��a�1��A�q!uN\{ha��2���,#U�b��ڧPrCjz����}�&�p�8�m'
|��u媣��"�Y��\SGi�a���L�:]/2�`a�S�����}���a����}��"t��0�rR�6~���gb�H�+�yi�P�=�9e"�	f�_6���sN���O�����U�|�ʵ\�����R�)z/’�X8���+Ա���8�.q�^�*�����(Mw���c�_}c7\\�Q��� �_B��1ڣ,�+8�1�T
��;�@��]�_;պ���ζ�w�Ao̎6��_����e��B����||�P�OI8��u��*n#�A��+9޶R�&���_=���i3���z�֦`�� 5"k�ne�~
�n���,UXz���>����Jo�Ď�ޚ���h`�=F=��pQ��YPbN=�r:M1g!z
���b�6�P���)��|u��X֡�|5w2E1��o�t�A#d�s�(�pĺ*\�����~#�8�r=�D�/��6�x�xH��@\�N|ղ�ł
R���V�<_����P�-Y����ǀ����b�Z|�]����2o�Bcyj�)�-�%�6e�������s����ˢ��:����2k�=�B��9R�xO�3��ia�S �R��-��a�@��+�����(�@�E�t��|�NNL?-�����S܌�9�4�$s֚O-��?c�����y��crq����� ,��!���@���*��ޜ�`$��`M9�(�Ⱥ	RHAY"�.�u8R�D!�!�\�c<�Ō|�;eL�6G_�`_�M���
_�Y��Pwm����FK���������	{$�P�P���i����!�'�tV�IP�5),���r��$�/&�ݞ������K�=���_(�ljv!��
6����0p�掟7��R��!�ۓFA_��3��L�G
�G6JP�ĞZl!�D�#�IL��\��c�S�5�\�7�RP�o���5m]���d��b
�8Ъ��s��W,z���`�#��,(mM����ghQ.�UW���Yz��������z���Z%f�,�t�J�QaP;{M#����H�<��S��5��#�(��#�m�|��C��fD�l܊����$�Ɔ��s&,48JZht��蹻	��GI��j���i���d�@�
붱1������٬�����n����q��(}-a��1m3+�'z�%��N�/<���*F��j�˸�?���^�(��*@#ź�A��/>C4\�U�,�q!��ݫG�@�K�~��coM�}ݴ�;s�exӋ�t�`�<�6��ĩ/d�|#5]�>�ċ����d�t'�h�4=�-���-��5]*�gz2�xqB�������|���9��5?��/M�Z��Sk)%
�S�S������6X��Μ\���+��q7���&H[彼���)��'J�F��Ƹ�7�#q���&�
Yߙ�;�FW&�c�ً��o�{���)������^�#뜝��»�7r�^�b��8rrK)z��������n.�M욁@(��
ݿ$نc��y�b8�H���8]�oe��E��В�'K��qx�M[��~d�h�����c�@�����L��;��
/Z�&�{���w�}w?����Q)��DQ��������z~}���󓿿k5υ��|�s�Švn�l�#y�;�_�eB��OCI-S���Z��K��s��-�2���z���_ث��ٻ+�x���g�����k���z��)~^�x�����/ssCûY�{���)�o��z�2t(�1�n�#���%EG���G=\A�[��ߜ�v�E�ƾ���C�g�]��#2�O���=��O}"wM�}��"�
�I�	k>�Xw�i���UޕB��xa�X\ru|^��-K:��q_�cH�<�nS&>r�r؁�5W�_�򈗿[m ������GĢu]Cy1/�zj+�z�QKs�E10�
�	���1��@��Ai���)a�u) ����_�^"�#�a�nP#�'<<Ko�OH�.��F �a���Z�uW��*�Z�")�
o���Ƈ��}�OG�&���
����m��m�-f�PK��VS����setuptools/script (dev).tmpl=�
�0�" �6`�a��!�੔���[k۩�o�͜B�/�
ʢ�dաi����9kv�����ޒB��E9m��@�!='��ۿ�w=X���-*o&��3��|�u�47\�%�}ly�Ѓ�4�E H]�@����6&�����1����~�!&_PK��VS�3��j�setuptools/script.tmplSVpu���q���
v��RP�(.HM�,�2��2J��sS5����RK3�R���l��♹�E%�����@U��Eɩ��zE�y�S4��*���PK��mWT+�~�setuptools/unicode_utils.py�R=o�0��+Na���*��Vj���\�j8G�����^��С�`K������XO:39�U�ې��(�&�{���;���;�a��[���>8���O��h�ɱ��M$�؆l},��4��$cϪ��8����4���`{�[�0��gYOϥ�s�XM��?Q�Q�+Êa�"n�5vH�9�	���4�?֐�f-V�Km��@�8��wK�[>)��?��E��˓�4}I�p9I��Ы0cq���c?�
�����@��(���9����
��XZ5=��\��2���
ZT�a5
�{wv�hu�K{o޽9�Ţ��!��1�!c�jQA��Ԥ:C��٫��
((<e�
�������-v�T7ޣ��_8��F?PK��mWH�Lbe�setuptools/version.pym�K
�0D�9EwՍ\z����MIR?�����<�L�����(��e$0�Zp%�;�����Z�L�SP�0d+J�,'c^���;:GJ���;�9.����PK��mW�
4�	` setuptools/wheel.py���۶�w���@R�#�4dq�[�A�k�	�eSd����%����W��{��$J��t������|�~/D��n�R�����l��˥6����?����I�"3�Jp��v3�(�,�i�2UUhP�Ou��]���?P�?��z+1kA�w��j�F��Z����I���UgJ��F(-���ux\܁x%���u��厛lע�N��Kl��*�&+�H�� F���p�ʜ��.���
�*��H%�4z6���q��9��|�bK�"�`�x��s����~R����=��ir��N��?��	a�1��nd����)�Go��@���tBĒ�v_��XXq�z��_~]%����~6C�}}��*��~�|�J_^�|�| �y�Z��4�F	�ŦȔ5�k�8��4M>���\lYS�b�6i.Ղ���C��GQ�L�jG�gB.��>2S���め_X.
a3{�P_�8�!r�B_a�.�$[0�Uzd���Y�J���n�p���J�7nIz�n�jˢ#G$զG�S%ˎ�6	@A��U{�$���\Q�m(Z	g(�B�j��ԅX�
-3"�&J����ο^��ܲ�2-���4b
�����mc*udy.DL�@�r��,3Y��@�ց"GqS���/��.���pϚ�U]m������2��Y���F�B�Ϋ�r�V5�g�Lk(�d�����O	���֌�����J�e�ҥĄ֢�v��Qm�v�-��Zg����3��bJͮ�R��T�Ԃ�ˊF���T���p�nQ@����*b;���Y�?�c��v�%)�NUM�ˍ�����a����9鬄��~�!A����P�d(Kk�`�'�q����P���c[���pT�5`="o@ځ��wlj뺐&�x�,�p �y/�$TOy�S�c�Wkhec+��T}��@���J��7��2�U���o
D�	��
�%ئ;	�	N66��2������^0:�0�1&RMa�1f�Y P�`ϳB��Ip��X��	z#Q�������'�A�g������c���k�rɢ�<F&H��`���y�Q¾e~�:u�H�\���~)5�<])�Д����G�������������A��a-�~ˑ
��A���	���ܝŖ�����E�kL��V�(��0�����Pµɔ��&Q��G�5�^(9^]�
�)��L
���D�Լ��%(Pi�S��k���i8a�[$�*�`7L�6栮Qp����KWB�� ���D:�o,Ea��}�B����"*z�/j�<cW-X?��Yzi!”��@��d��Gd��B�k�p���*Z�xq���/�3Jg�MU��&=@�C� ѴeZ�-�A�M0��)Tt%a(:I���[y�-	��ˀ��6�V��w�܀�*���W�Z2�9��-�jQ�]�q#qK�&5��g�
&/N-5L�Y��T�"����[4-]-�]�Ӓ��k���:LLt{��m���v�s=f0����:�!�a[o�p�0�p�C����.�Y��ס��ʠG4��#��O��O�p�rq�_0�b=�,?3�������Z0�R�D�zugT=�Y� `�^����k��'�A,
K��YHp���zd�z}�ʴ�aIC��{8.YiQm��t>SP/�2���}��ȣך�2�n�0�`����ayP��?���E2[�H��Vn��\��[CI�[%N9�X��.��j����y!��n�g�vfC��T���EJe�x�ÿAy�n%o�@8����
D��uMw��8�\�"<>du�XZKr#d/�Id������c�N���Fg8
¹]�N
�E_�V�-�c����x�����Z�Y�Z�?�U[���L���6]�u-0z�z{�����pq;��'���3S�����ӛ	��zI��ت;.��˗06���|R����L���p�����j@ZT���A�}U��Վ��R�H����(V�'�/�\uuL��߱�:��8�n��j�)����f���չ�3Cj�@��E1PbR�����k���|>�{^K2�½���/��[������S�#h{��
�w���,�@�`r�S	J�w�)~׈��I�\t�ia�p���ŏ���'<�~�7���GC��XaaM�����C�b�L?`y��R_d��w5����{X��W�`y������M4!�3GSB������\X��/LNҞ*��/`:��I��Gϣ�_
�\����݅��"�;Ӷz)����^9�m��{�x`��ǺQ��kz��{����͑�pf�=���c�/yfu�8�1��^�c�bF�1��*K{���uR�n����8Tc�1M�n'�7ۻ��0�·Cb�ֿ��R2�vO��rا����+��,'�v�� �mt�Q��kN�J<�j7��PK��mW���
t�setuptools/windows_support.pyuRMo�0��Wx\hj��&
	i @CB0�RZwD�I����Җn X.������$�� �}��J/��)j�X���Q{R�g+�D`��ã_��Ϛ0�lx�C}S�%,?
)Sb?م>4|����h�yԃ�ȮpyS���rae�C�"��������jŽB�c
Q�O��.#i�Y �\a@R�V�&J&�'J{����Uˣ���P�B���N���%m��B�i�ቜ7�W���z9NǴSu��;1��O
}�C�q�P	����y��y
7Re0{߬����h�X���S�{z�6\,f�Ngco�^/�Ï��{��F�a�N��~��w��6��jÄ���J>�X�1�6VJ*�f?PK��mW�B괯�!setuptools/_distutils/__init__.pyM�1�1E{��+
��+��.��
�Fa�,���Is{�-��{��s��R��L��0� ��^�/����T.i�w�jdl�P9�d�T)��ۤ}�q����YS��̥�ȭ�X�
0���6)C�1i��4�K��sDb�%Msc�@�`���;��/C����QLm�F�2=PK��mW��1MQ&setuptools/_distutils/_msvccompiler.py�<ks�8��+pteI%2�̬�|���L���.�If��bQ$$qL�<�����_w ���ݹ�:V%�	����79�'���$~��(�WE��r4:̳*L2��_|:<T�',�X�*R���\%y��9����3Q�aT��3��P��</�$*s��+�)u��������z��4���<�S��=��n�j�>]P?�:fiX��g�k*���Em���"/+�/Oc��K
�d��������m��9�3��eRU<c�
;�e���4��e��ߟ�3��
��%��e�
{�S���Y����8*����dv�׊%^�,�z�$��|���1tF�`6�Ey!"���H.K�[��d�E0q���5gG�-.3,&�a���D=+�<�y�$�*Mf��mXf�uӣΐC��Wyt3�Ek��0%���,�r�7Ꙇ�d@�h4/�{
��H����L�wg ��+��7���Q�:�$��[vC_��4B��14b�����At��i���u�WA�hP|H@T�<oADy�U�Q��,@�	�.��x	b�א}�7l_��?-x��L�<�-���/ӿ'��'����w���[�\��’��5�M����.�.~�t��c�#�}5Nr>=8b�͌7�O?��>��|oƎ���xQ��Z��0��Y��eJ�=C���R^��7#J^�e�>���#j����B�^�/㤄�S�	����&A�B+���k�u���jWf�իOaZs&��dl
����J�Xo�9[�Y�I�YΧ?�����.�D.�Di܇<H��0,��iV�z<�U�{D�Ү�M�M��>h2���F�J����B��Z�a�f�����;�	��exLO�~����F
�a����/�)����
f�����kq�y���$�x�͢
��z"OR�cG�1�N��/;J���$�q�İL�
��a����y�Eh�݈�ώ+�
7@1KY��EIҤu
Q�Gi��!\�I�����%�%�����:JG )汯�)q�s��Z���2�|0��sV�2\�,���^��1C�O7e��4w�!a)��oxG?Z���*�ʻ��Nk��y�y8ׄ9[B ���%�ap������GTN�5�ג�d��T�XZ�D�7ͷ���������w���(/�+m�Z2
�P�:�uT��O���	�Y�cܳ�fv��~߁`'�*g��³|�g0����L��싲��1K<?���lYl�����7���!RpP�%i�D��:I�V�l��_�j�0m�����2�8��������燎���Š�lO~N�WA��_/��l(W�?�ת��6�j[�uX
`���H 
)Bvج�w���?����*_�]XG%�?559k���?�̬m/G�&�^-��k;�y�'|�Am�
M3bm4��>/4��J��uW��gae[�VD�`����x�'�I�Bp�b� �z9��F+��&�;���U����9:���xy|r|��G�8}��b�<1~�y8EC�q�9Ԅ�a�!�]	�%�k��2ЗS��M��o��%_�I�L�(���w`����n����=����þ|e��r}���Ɩۚ�
�rߘ������e�k����s�j���u��Ƭ�%�w-{z�9e��B?[:	��}I����E�
����if t��Xqģ1��X#^A+aM��&�aYQ��F�{ź�E�&�Ali��t���f¯����J�.
��G��F���`��Q�Eq�İ�q���.˄�F4)�툵�T��F�+��O) ڀ	U]�@�z��a-%j�2M����,��}B���q~��볃�wL�-���+e���
��FΝ�D��华^����3��u���jV	�d�m�d�;@�W�pC�J�����yD0����H��0���v<���n�vB�ue�\|厥@x�v^H�@�)�8���@2~z�x�m�V�3̳Nz��g��A�0�a�(��eV���I��7�̋��ײv����pbE��
RP �@0�2-F�Z,!�޽�EJ���\�8'�'Y��1����5g��ߝ%�"�/�}>~:8�h#Hb�{Ս}���4���\��q��FslQ��*yzͷ1kt�0�"�.�%N%ú,*�H�G栔Ȱ^��Gc���Rr$�幭�6EU�ǧ�$��娠��X�b���P�o�#�`(��[�.VWae�����̅ #,�q����,��t�@�9�נɈ�@��P��t٬.yXG%�`A��I,	i+d
Й`��b
�pub�!�Rؖ�!�)ߍ�Z��@}��4��}b�2q
�6,e��TH	�z������
XrM2�d���3�	�c64�`~՜>+�u؈AV!�2.�o,��:Kv(��N��eĉ`M�4�dw��,Y�+׏�k�T��<|����ӽ�>����7��QQ����z��ZS�r�������ba���4;T��2 �(��y6��z�>�R���C�X4�w�$>�q�)���i�7�I�FD]��Q=�a��q��`Ȩc�vT��}"�(�@�:��{��Pd`�$<����8���1�
�#xgx�v	4fChƫѭo	Kp)L����@$�T7R2w�2�p"c�QTmZ�(����a*xKsۨpn`�1��uU�U��#@@C�[�>�Nh���%F J<�PSX�` ��z�.���I�('�9Lp���i��[�Bdm�n2��I"�I6
o
:T/r�E	��>�	��\�j�l郙�i;�ƽ���.�%`+�2`�U�6�o}t�_�=��g�CɄ�ɏq;'c�"5F
k\���*k��7	0ڞ���u;�L�1�L�M��D;|;�fh�v���ۥf��w6��:��XQ
T����݌A[�t5�7�6N�R}R%8�ΐ@�6�5��;d��?��{�A����$7`륧m��-����'������d�ZIf-����WŖ4B��e��q��auʃ~)�����]��	@*!�{�2J�*zW��;�z�NXT�B�(ހf'������KU0h��6�d�;�㾋�S��W�*ᔣ�30��>E�߄t��	�k�w�H�g�d��ϳ<�9����+���}�|BG��o>�L������ѽ3TU|`�XA���H��9�Єi<O���8<���~�<8�pJ�N.�����%�㽷ON��IO��V0�S�71�������������h�����F��>��FH2F�rt"W����!r�^�!��C��9ý�!�]���3����������˃7'SY��j�����/�zh�b�6�ΧG�雿M/����X�4|�!JL)z�����o��V�� ��6��B���>;IA8:]��e�����~��f;���
t�-dγ=���M����m�B����,�S7�7��4�:cW��>�M��vJ=�z%K��j��_'���Y{N/�oW[���E���u�n����VN�j�v\��	!�{)<�W^a����a���,��@�O\H�tN����&�
���d=D!�
>�}Y	����H
�ؤ��Ef[��i����޵�g������_��%���t�<@�F�2N7,ͳ���}�C�%��ì�~��:~����&
0|%1��,�B�<�%
cC���<�uV�^UF����5x���
>��q��M]l9˵���á��2��@:��cYM�B��K��m�9,K!i�Q=SY
!9E����a(q2�s,+n�>sW�@��Q�7t��a�E��_�::���~���fx�Y8�Y:ژM[U�y}+g7�]�
�(��02%��|��.�r����W�B���������N�Q��}���&���"м0�S�i�x��?����.�-fz*��z!5.0'�/3<@ț��zb_�d1
��`W?,A�}�V����f�5�|G�mϝZh}K�XHZf�8R̰˞��	���+-9����a�W"�^���!3�'��m���a�᳃��P	)S��T�/�(���~����Iv~+�P�4��n��0V�@��f-7�Tc-$�Y	p�NKR
��p�z��fI�o f���I����l�e�`�RFgރi�z<���OG�(P���~rv��"O�����R�8�L�&b�# ���[��@�o3�J������j瘴�\�� �	��I���π���}�j�g��!�jֿW�?$�[�ЏV�V�S��.�"�R�<��	�D��p�(|�n�;��E��\��\j��8�rߌ��P�,�p�X�Ru]w��9eЏUvƼ>`��	F��%L]�^	Ӆ:�;
�'�5�d���$���Xm����J��n�E1c�f��l�Y
�����"`t�7Rz×:=RV�����b�sm�
J��U�w䙥�дҎ���E��AX��w'����?Ju��0�Ȝ.���#n���h�:���*Q��a$��� 00�D�u��l���X¡\vG�
�hq*5�h�˿�r�_�ܝ��	S(��Q�ϮԦ�+Vm�Q7�0=s�x���w�+f�Ʊm��<�W���Q�A�#B�V���o��mR��
Ul�|�
T<h�Y<T*k2��������{6��=]�&��#�d�����3�&��_2��'w��8�bz}
@�]sh�ٶ�]=��{<䬉���=��po���ƥS��s7J{���/�\T{�uW���@�Qq���!�E��yX����9�<{"�ki��A�D1�~z^��yj��!ʪ����oэ���R�D0�.v�|7�;�34��v@���@tש�o���í[YJ7���7F��nW;�C����
�f5���&d�5��H�=(�*�*�Z�?�%�f@�u;^˼׬��Z��ۥ�Ul��~p`آk�r��+�ҽ��#��ɑ?. �
�r���nOx�TVW�ntVͺ��m���
`���V��۩6�.lkA�o����Y��l_[��W�Acݝo|��P��r�O=;=�ܣ�fE~&�lc"+����QO��]�g�|ێ�>΅vB���L�AuBL��0J�`z
�����$Z���:��J���x�DA�]�h)`.!@�w�#�}Xz�7�>���OA��2�Y	�e
��ƀ	��HM��]P�����^
�a�3WTE��q�8�BL$�����B�q;�5����	:��Ջ��neG��j>^����j��ጇ�A��yv�g`�rU���{8�oX0lY�#XM�JsT�� S;~vr����n���:�@P��{q����Iy������;�]���_Y}�1{Z��!F�6���`K�p����b��a�q��Enm�H�PS���JT�:ބ.��'{[�(BPAR���0�	$x�W��c�Z�
^B��7/}{�>��f��/�LR�_�_R_Wa.��Zy��ƭ!]b�b������k�����)��������{�Ӷ��U=�H�Ē>��	!ͫ��®������o���W`Ee�
���^�U������
�#UVg"�spA���Mzf!��û]��&\�"x�	��ul�=u�$/E��>����ޝ^|��8uv��on�2�JQM�;�
��:��"�8B�q�&H�h�Q���k���[%R��<n
��gg�$Y]��?�d,��tD�q*��xn�2nW��H��K����ރ���$����π)@���'�k�^t����і��޼���,+6��D7ѵ�������s�eh>(��ߺр�{�w�#8Nܫ���E��jF��2NF:�>�V�O��Ǯ-4:�o�iɔ�^s:ĺ�tV�9^�T��h�5��e�3̓����2Ɠ�S�-nd�q_I2�BH��Cq�R`_B����3���X�G=��ھ�݀~f���Sւp��l(n��2��-�ݗV��Tkͬ��>�;�4/�K#����%���[<��K���!�HW�PK��mW��5R
|!%setuptools/_distutils/archive_util.py�Y[���~ׯ��0H&4�:o6��.z��q�A�ȑ�.E�r��6�=ߙ;)jmA���9sns�
��(E?�e%Ҭ��_��b���ĶC��eS�m:�w<��z�40ۖ,�n�U�H�C٪�d�ﳞ���Y�e���4�Ţ<�rU,�]s`Ǭ��)�^�w#Nb��Ӌ�G/��X�=���o�����gK�Ϧ担"�$�jɽ1�o�y.�L�E�k._�E�I���m���	�٬��'��i�����=���t��7F��Zծ�*	`Q|��X]��"�� ��C3��|��^�fh�ʻ���u�K!13���w��>�D��ӻFm�����x��Z���'���	��"��M?ς�y�ZL�rj.��f���A�nN-��8�H|�G��[���m2���K��#�"aysh�D,�3H��6����Vt�u7�x�d�9ּ[�DY�|v�M��C�Q�Qn��%ŋ��'��W�;� �����>�t���ѳ
g�o9����',�`�9�	��ۜ�s�p�)c��b�|l
r����S�oj�}�<�LH�CU�B){�rXN®
�7�H	¢����)R�Y��j�q�N�{3�U�������k�ʂ�zI�|�:^�^�Ub3�Zap��v��
�B��}��K%�Kk�A(��3mW���!���{^˧(HwR���A�?��ɑ��Sk��W��9bL���E3��>�%�OH�������5�+�����Ӟ��3ƫ>Θ�7	f��iD.��KGS�8KgD$�2�	�V�N�mOB�w�e���,�3^��-�������n7О��-�y�
Z�9����$�؋*Y)8�9�.T4�)�d��mɹ/��G�ެ�`SL�96�h�2����Kf��3$��d���g�R!�v9�92�3��Um5"�_*�t䣊]dԿ��T[��i���FX�.Њ��T-��2�:��Ֆ
u��"��$-�m��-)��f��\�ٜ(c�J@;�CE����L�B��@L�<�$	�	I�+�H|���u�K����m��{и���d���~���AG�Թ4�6-�G�S9��)���it�1ϫ�!��=͊"r	dzdR_��<�,hG^!GG��2��_�үg޲��*�˰��0ED����EP�Eu��'*����hѕH�@�2��v@9�S�<0�?�ߑ�:e��~$5x��Dz��y8V_~ �q�?��	?�����6�s�eg��L��鄅�_�ȽO7U�5�\I7S����bMv^�y�==W^�3�AJ�ʮ���\1h!M1a����6��*��<���{y*`�j�%�/k�C0@9pۀcx�Hd��.��Q�ej�채��LG��Ki������z@�)�;kS�L��R�cY�?�HV�h���*�Q��J�����D*�"�tN�y�>SRֳ	{����*, 
��Y<�]S���qUy�M�zw4)�9�j�Z�藺m;��1O�Ǐ����7R9��ҡ{8E��?�r`�2;�{1Aa?Vy �8�N�;�E��Ω��(
�q�ԕ��ӭ��O�p�Vf�X�a�Xt�/=4�TSu?���C\�'�EVQAJ���1R�Ȁ��
��;�-��k�P�}�te�\���Tg��������ZH?��;
�c:�q��ُ������������7�����������!�?~���9�`��9WP�Q?�e�e�rI�sLBɈ#;�B࿚���(���,�����KT���t��Vp��?����x,��
j���1�n-��[;g�-�y�/V��L�����u�z-Mų�#�{D6؜9W
Y I>/S�z�|^)~��;�b��_�~~�~��?^}��j´{�>���^�n"W��;^%j��)��*N���&]bR�s���z��sH4�� ���+�������''��i�å&=��t��J*4��MU���kS�Sӑ�"ҿ�ChUMw�g
D��2���PMy�0p�ok��FG%�Ǝ>�3��h�ntljK�<M�|O�izW��&�8�m���#�f��Qg�h����؄E�꺔s_s��/<ף�X�w�L��>d�E��Iy^�ˣ�rJء��7�ez&Z���2W����t7��Z^��&�^�2]�j�H��y9�<��{�@u�|4�}J*���
yiA�#���+�a�KV�}j�\���2uYC|�҆C>t�xRho�w��(&9�AM�zR"4�
/U[
_
��匔o�{B:��O3]GR����ӑ����Q�4H:�1T��f4m�<���^���W�M]��_��/e9v�5�y>2�7�"C<ʏ�ʣ;��9�M�f�0?k�\V�ͰCɽ��1��@�4s�eD׳���m���v/���ł��B2��Q1\���ٴ;^Q����n'�_�C��Oz?*�w�)���$ިݕv�K�M'���ԉH�j9�|P����nec9�Ih�����W"��kD�
�tiV.3��6������+^���� �$��F}�B��d�Y�d��,�e�N����\fK��PK��mW�F9��.:%setuptools/_distutils/bcppcompiler.py�]��6�}�E ��� }�"(�4-z�6A�"�A�h�]ITIi������E���5�Ė�Ù�|sv�XB�]+J���M�˪%W�d�f���;�ʬ.^�����LTM�+ ��5�[��9�6�UY޲��e���V*��ث�O��j}�X,...���!�͑�9���C�k-�m2�o�Tb'�d���{|��U��`n�iQ����W�K�#k�M)���n?JU��,EV�5���GVJy�Y)n9bR<�,co޾G������s"M�A$ZV\֜��ʂiѲBj�p2	ɮ%2��
h�ehX�A��{�~��j�� /�Z&A�JVl8M��T$O|������{��F�Ľ����7b��o�����H����[�G��Ύ�i�x�dεNeC�"�p�_��-O�qZ�fY�	s�J����#a߽z��Q��-�Q
	�+�rs�p,Y;�&�[�����X���z�|0�
��Q2�L���j�(��H�c��K��F��%�G�[�9�
؎�V��$۪�T��\�Q棶k�>_�R�Jy��@��}�I�YHSJҵ٦�:^Fl�)�u9�
6��(7��ZT�,h7�u	ڷ�xޙ:2�
�Z��-C�,�*y��E���e�Y-������x�p��T�O(j��v�%$Z���#�-��l�g��xi��?N��zu(�6cq�A@*���W�t�����a�ܒ��9�h��^��h�G7�U�L_�Q��?8x����-]�
@�s�h"uVq44���8�_�љ�E��p�'id�U@��!��Hn��®�Id�S��Rlxb!����DQ��sV��_�?���':rG`�'`B������E��,ּ����o��/�Ͻ,�1U]=��a���9H9��m�8��Y��b����)0&���h#X�0!����[s��
W��g����"��;�j�Wp��������`�<
�k�9}���V �� ��&Ͽz�G��-���B��0h��v�zY���F��u��3Z׳�/迿���sk��֦�t�Cb�(�e�өQ[��}c�X{k����+�����W�����-�#&X�D�
�:��
��£v�i���`��4�����f޽��ҿ��
	��\Im�:/���k����3h�#*�&S;l�I����^�o�f��$��:\�0�[�eӉ��	$��kR'��Ť��g�t�>����e�س4��\ ��5�]g
"fq�ʣ���_��-$^O9o�:^j�?��|-�T8&��8�;^M�F�$4�	�5,�A�7-�'?R=E�
x܎�^�*�?��&�^C�C�ΰ�f4��R��;�/Gp��<^��(�Ҟ2��-!>H`RL��#���(A��"�}+�ђ�#<)����3"�;5��:�`�W\GS�j�g	J[��
ԃ��w褈$ѮO�啐*�և�i��$`��c���	�I�)0s�����a/5�dPe�׋���H�b���@	���r�ˑ�N�EL�+���Ne����v����5y���B�R���}w�.�^aF�`��U�i�vQ�����b1��r�j��>�l�.D�%è-��aS�'^K�U��LP���:�f��~�m /=�D��E�P ���"0�gT�Y���c��Y�rW��B�;^��ܔ�S}�9v9&L9��T�����#YU��BFș>�mvT_�,�][��ͱ^.BW�$53�W�!��<@�Q(�2Pn��An<�/��3
|�	�
{:�O]�gO���^��'ěV��7lv=5���)C�D
�GM��Y�Y��j�̸��P֝.��˝��B<�O��s�'C�uV�&�_��}îK,aɹl�}jR:�Y��}֗�a��*&Qm��������#U��ٔ.�}9V�ȉ(H,
��Ƙ?i��p>�O�헙�ˏ��wP��dE�h�@3R�H�<��ک�8
�ܭ��x��G�ͩ'�]�j�KY.�B�
ljK������.���y�ꄭ��9���I�\�y{��@u�@T<}��c�7��j#�y�=S��C����
���U3����0�l��rb��h@}��=�V��<Px*!�����Z���4���%�紜wS�g�.�r�� �Fv�T/~�]o̾��n�4��hSt��8�u��Y�B���-���4N}�+{����yw`7{��R�Į��o�lo�g���Do�H�'��T�
���?�~���o�{�z��*�2Mi��_������@�[��3ߤ���������c���pT|6��6�ga� DT���B��~$j�u��BŢ[�r��˴&��1*�T������}�����7Qzv��j�xb��J&1M��r|#��2����kH��]?�Y�� �h��Q�3s!fu�鱩���Ӏ�`�'���n(���㻷���-������qp,Լ[���n�xq��L�h�)	b]N�"53�<ns;�����כ�h�:�Pg�a�}F�_��Wں�gr����^�����Xߺ
{dF��KD�_t��7r�
mh�+�C��r���.�0��FǯB�Ǔ�����7��*A
8�;_L� F�OƲ���������L���݈Z�o�C��~��1^~1a�D�O'���aZ<{c�o�=-n���N#!�,hr�����*�J	%͚G3��1��WҙN��E+�����U�ClJ}�����S��W��"�Ϭ2����8	�;l�}X-��BTH̪२@�
�t���p墳|�ei���_8�����(�����
�v	:c߿�홝�au���>�o��NOD�`��h\��p3D �g@̉88��-d����*�C!7wBv��v�!Pj�,g�N������rUmO��J�9�6<�P�z�,<J�\�ې�����U�طj���_�צ��,	#eQ���4MCL�z����Z��,��m#�����(�� �߄.��貍CQ���sv%I���PD��A��p�W�!
L(�[l͠�U��i���������S����C�P0ŽR���+%�e�1g���v2	���,Y�����h���<K���@c�����m;0zR��^�{L� 4ji
"���c��'�2�3�Kƌ"��OSGf���s��r�e�6ԲK���I�IƘM����LL!+�>|����� ����0z�8>�JN���7�=�	L��r:[�«�iW�����pZ����N!9�,,>k��\M���-4�'��B�a��ctz�t��j�8'7��&��r�\�&���9�aNZ�cBY�*���^����RtrނG�H\O��%9l\Q��kt|���/=DxC���Lwۭ��*3�X�ػ#��OL��7\6^�4A�?$�y��(Q�[g���2E�l�q�#�}�Z��CQ���cT�aJJ6AN�䈲|���q)�i��&��ge���/�K�&ו/+��r���ޣ�ԧ\��^�o�f4;�"-�N�P��H����(�M�o�p�/�#�f_ͦ��$��՝C9���7bj����3~�J�a�>���J0�ʳ@g�q���F���]*l}	��h�uP/f�ӌ�uDʩC`re�N3Q��	�H�P�T9�.���������>x�hܰ�,,ԓ9�݂D�'�I�20�٨��NӼ���D�Ӟ���x0�we9ʰ�n���K*H��6�Q�؜�ֿ���6��>�&n�}(aU0c|M�$�M0ח2Q3�ۄx�M�*"�SŤM�u���t���D$�4�
L	���A.��d�mVg��_���v�uu�dNj	`�%}�y�ƀ(|J�,�'�-���{0����ߤ�HeB�\����ۋ��RB�9�m���	�+�x��#
��眓��w^fwfr��u��ο΂=|%:��/FG�깋A71�c�7@�/w35/O��Q��r7�AD7��4�`ϸrWM���Y�}����>KG��gJ*��l9�@)�h9QF� �(��O>^`��:��Ǫ���f���tЛɢyȃK�1��[D0_��A%3�Q�h�$�33\�>��,s�Z)�4�>Q��P��>�Ҍ����*����<;�u�+���PK��mW��| �1��"setuptools/_distutils/ccompiler.py�}�sDZ��+6P���@��!U��l�vt�-Wd��B-v�]dw!
����kfzv$�8��r�J,�������L&E�����E�7�]Y����eS�YYw�˗��<��$[u}��}��:��U�uI��Ia�em���uo�u���u��'����A*�:�6�������O�C7O�@�f��I��m�.���ï�]vW�o�a�5���_m�m�,��aˢlÆ�����2��Um�L�ܴ�~7l��u����7�)�h�}?��m[5��3ƶۏ˳~i_���	7��j�A���� X��;��,�-��˪k���K�fk�[����o��K��)�7���ƀ���?�t`�e����`7e]$Y�.x-������d�g5�&��u��HjYU�zس��o��7;-�eU��&�x��ke�]�j�~�S��e}ߖ+�
��-�p���5�n:؁ѦF�����j_���6mi�6��F��:������6�s=�C�/Z�=#���Ȳ����,�;D���o���T��bۃ�����Hp�Y�U�t���쀨F��l�J��L{�3�h�`�#Bn1l�P(o��dj'��;3ŝ�d��P��@u_�	?7Ќ�*_��� �s��.�{��m
�Ïn��`=[���
�*$����X�s7�� ��+W�Qs�+��'����+;�!S�+pS筁E9�M��J`̇�0�M��
b��0��
��P��98j�P�S��DY{H�����)�V��ji���iR��`1��	Ȍhq��Ұ�K��.9@V�5ݮ��ȡ�]�xN�w�!�Gr��K�����?#-ԛ.����.*���>�r)��fXa����
�`EQ���w�K����;Ib�P[[�L��~[�/b�9��j�����U�Az�Ѵ7َ�X�-^�x.�-�=����qqh4��]]~T���Q���cΔ���5
3�L	�8�nշB��iA&a�Z���FA��mYX�Â`��;�n��f��F}:OJ`u�L�<�x
�����b�������w��B�y=�Qt{h(��`0�n�C^2!���v��fq�4���&�ء�k`%�<�p��-iB*8�fz[��b�=hzd���+&��M��xA���� 
Ȼ�x}
��8zV�9C�-){����&H��ɪ$���wI�n��MO☩�MDAkڙ�l�� �D:���ۃ�O�m|�3�C
	�� ���ͭ�M#[�L����1�^�9(�#�.����"C��[TMNlJjD��9�:������%4��Va�(̣ޣ%��+!��6��#
�:�ϛ���4j�"k��u6���`G�cv0�j�.����3/��{5LN`�!c�<�6+���v�5��(�@� 5���cQڵ��|�M�g1��?Oh�q7@~!QPO��wDH=x�P�/��~��
�"�����aƳx��W���~�w���C[y8AK�t�~�2�l_
g�f�m�^L�jh�~��f;!�
��x�k�mn�w%��n}�n��R��䷨ø��H'�݈M[���I�og�3؀5�������¢�	�j�5`�p[~T�@���
L�|̐@o��H���w��$�&�|�[�/[�=e���&�ʖ7�VG�kx�ӧ���W��r�\�����0���[<}z�
L�6?>�f+�^;2�����m�J����y�NK�\�5��K�%����
d���`���e���W �>�]�a��BZ��[�5��/���+�����`o� ��%��%�kd�Ч�;�c	g���\�a�v-�2�#+։�‰��3U&�MʊA��ݿ�m���Z}2C�B�vas�~ԟ�Ȕ�Y�73⭖�=}����dJ�c2+(H�`u�����TaH8Y����Y<f1[��h�}��	m!v���2@�(n�5##{����rv0P�w[�`'���n8CH����eb�j!���X�c2'�<2��c���9�0x)f����\�&�=�D�u<7�L�?�\ҁ�Ue��th��0�4[,ܗ���.7�]f^����Ct����A�8BV5�!t�S%�(��K�0�v�Q�k���KְO'�����M�F�L&�|POuIRRg�w�ۙDFP�����.`B4JDb�e�'�e�Q&�Yp��.�	��vp�8��a�nJ~��"�J�ٙ�謱��{��2㠄;Ƈf�4q����.��	�:�J��g/�>�ʑ;�.�F�匙��b�v�H;��Ё��%��Z��,W~��f��3vt����)e��Lp�#��՛�������aU�F��V����5�w5gb3BC��U^�Y�ݣρ�V����؁`�5��vE�����o�
�f����L�V�%��г�P��r��HP�\pVY~��`L7���T����i�_�(=xE���F-�~hl�B�>��Lq����,w��Y8�Ha>��0�6eq���b�5��z��<�]["�m�
"��hͦuޓ[j�ٛ��;�1�%E�cNh=�!Sc�mO�ʇA+���r�!�xw�R�4eͮ�@�&帋h����@U3ǘ>r��A8[�>@�
�*XtAA"O�n� :|�c+���`Y*�N�[�":$l�?mV����¾�3�t��1�]�-�~"�BI�m�u�䳨#��ϒ���%��D�\�f�)/^�*K4�g#�/���)};G0R�=��p��s6Ug�����V,�6�f�=Y0>���n�تm2����}ruE�"k�}`Ž�ӫ�٠��$h����Q��k�!���1i�̀O@�B�<U��0U�߷���l�3j�/B�rq��+x����U��l��Os�����'����|�$nls��� ����Ϝ�8���I�ȧ�3�>�'_o�h�	u�~���<�Y��h���qH#0���1a�Е���V���F�	ȉ���4���B&�dX|;��s�쯢������E�WdcY�WMs�xH6yq��g֟#�ֿ��c�s�a)P�`5t�F�=AV�o�4�;��=�.�D��`=|?��LՉO�������#�><��QQ�N��Y����)�F��z�ʓ��;���h���xEd��t����@Y�$�򇷯A7ЃbV�V/�?̢�QK<��U>
8
y�A����-��S��I��e�<<��nu�Q�#P��
�Ÿ%��5�ߢI&�6�4���.���>_��xM���R>��1���N�}
�z�.8u$�z�M��V8���>
f:�!���=��pзóժ�3����΀�$o�8_�%�0���(:&+p����x槇n��0�Q����R�QJi܁4�e�xOB������DO��`�(�����*6Ȋb��v֒)ې
�,
t��)n�Fc�
�U
Zq"��tX�X��h���Q�L��{��%�G(U��;x��C�9�p�~�2�|�}�,,I����g������(�i�
�p��cs`�5�#��Aq�$��48�#oO|�bkL��ܧ��&�t�{��\�#��F��Zv�R�lGȘMi�)�`��3�s���k��H��>E=��v�6��s�7�C���!H�Gv��	��f�#*ƭ�V�.4Ugr�54t"��8�~ilݜ��mVʼn0ć�9'����Na(b���I'�="⒏���f�QS�6p��P�1�̓�#�5�L�?�eD�#�mdCm3�䠫Ihq�SԖ�!h)$I�%�,1�~��Q����H����K�!�=����i����ǭ'�F1E[0��z�~'�8S���t��Ca�W���.8�	!���Q�/vX�1�脎v�E���q¦;t��9V텖3V2�$h��1I�A���8�G�'�2�Ri�̚z�׼�����!���:8��h�ީ�{�m48�sj۶��!���HJ�b��>J	��J0r|�O&��	�:ټg-�c��k�iV[@ꑩ��"%�SHB��Z*�͑�&F:��i95>b'շK˂C�#B�ň@F'�Y�U�f��Ir��C���9v�lm
I>ؓ֨�+�qg�YDq����[�
l�Ǣ�VZ:�E��^��*<��Ȫ<����I����oY�eDA��,)�i�h�0���7"A��	M��}�Ø'%ߧZװ�%yDȟ.gtf���v�^�N�[����S�B.��-	�w6���F��U�d.�]&�nn����3b���B���cX�L��<eq�U�!I6��BoH����@z��ﮆ�Y�+9
P�v���ax}�s���a>�dv��+YP��)4	��i�Ypv���4IuL�}�f�J�Z�bv��F3�d+茠,Y(&�f����>�tG�)�kOnf�c#�g�8ݏFI��'a&ۃ�5;@1KU��0[�ہ(�d���c� Y΋1%�T���n���t��Q�xƸb~�E���M�ZՂ��������-��rc�~/%�)H%Օn�a.�߽���A�mVoL��=�9b���@g��կJ���M�/�ZB�)�pv�<l�<I�GS���G�N�i=��{��<�ګ�i�ň�o�d3���3 %�7���|�G�"�]S��=`N��`��-g����c��(�as�1N��`�vO�&�Ӌ|�^S?
n�t����t�	������-�x�6A&�G��46<-J�qz��PD�	=i4y��q��D����S2��	�f�;��(S 0:E�%v�)O�Q���G��3��0%
�)�e:P����IV�kP,�xb�~�	J��P�B�4�Ao�}�π�{�-?��?F9��l�R��ȋ�raDȁ6�ĆP����U���~�4�r���J�bl�1K�g�?Қq��-��Т��1�F��e۸F8zk�x����#R�!��3j��o�
Fܑh��1��N��rTQ�W����)�Q��D�j.�T�6�������b��������x�`���c�T�@ς$���ݛ�����'�r)��ݖ�ݱh�?���E��m�'Sub���@q���A$��r���0�&�����f}�7A#ҶX���!x�6�m�V�Y�X���:fm������VѢ�m��+�#���6��^Z8�%�E��*ӍIA~�}��ʡ����OTF�w(�Z�s�֘�I�ZZt���\�6�� �^7sW�D}�����\��OK��<�:Z���Qf��S�O�:\��B�Œ��^R��mV��7e�O�C��7g�ų�B�r�5WvF��(_����飿p�GM���1Wx�t�;z�7�m���O��g	�`��p���v8����w�pA����(\=�����!�����5~@�LJ�.Qp���B]���)ޢ�$�;�����;��cl��qr[��T���VU(�E�a�0�͝q�nk���c8q>�rZ�A��rsn�;n.�����~�	ݳG�\Q��S]7�%U�m�Aq��ޔ���R�i��(��ڨ�΋�BK{�?t���Ҹfemm���Ӵ��$��]���.��juP\�e��6�S�=�1D��F	���lt��^�c"n��`��t����1�pl,�4?���
��˜¡[���S���}{�����`Aߥ2�lԛ���3:�C(�	�h;
p����zu�m<�N�v�����4�;�|���l5RꐓtǪ�4��!�������C�kH
�c`����݇óS;%4�`!�fV>�\�P���JD�a��&�ܵe��iHY��3���]_`���j�T#ׅ؜;�R�����'�p�\4Qe��(`g|\��űK
�{	�h:�tj�{����p��K,��*p�g��]�7Ln����
|���#Vp�`�����`}���̐(���=^.N�`F�
�(�@Y��t�"�CY��X��]�K���'{XɱWW�h�$����� *�d3L^kF�CNlv�X2��n_C�"�E�aFǠ�R�S��do$ݘ�s�S�~d0?��� e�H�$d��"�T�G�a�����#*�:2(�aӲ�(�],�I��
�K�8��M[nJ�er'ߠ�N�DT3oNuY���v�{V��9�^e�t(�6�$墏t�;���EL�uM�u"���4���m�Xu�[>�cj�JU�Uc6�"���	K���?�Ŵ��])��E&�c�i]��G�p��6$QB}=+�0�ѫ�r7�ʱ���Z\dh�]��)�e��ٳ��ݔ�B@]���t�{ ^�<�L
r3Ae�.d�Pr�zt�T����AϓD���U�T&�y+ڽ	�9��}|S�d!��;lWMER�2��Xf�9��c�N߁��DTp�?�t*�Ӆ�dZo��&$ɩv%�$i�Q�*I�N��≿���
���N^����cg�h"�ğq^��a�>���.j$�7�:�s���*�|P
�h��
cr$����o]p�:d�.�v��\��а�Z��k��KƮ��[��0c�eg�S��r)�����EH�d(,�^�� -� �₰��]���9x��<��Q�׃@���rH�؍sP]���9*�	���Vl%���p$ǬU�t6mV�yAgDC�P����' ��Հ%�7��zP�F�%o�p�QU�&q'�*�5�J��x�S���?_9
K:�f�IQ8�����s�x6:�i��H/3�z�(
�u�m�&!��g�'s8����VA*�T��կs7�ܮ��nŎJρ��G6��\���Y���p=��3O]�$L&~�T�^�LY�6�0�N�r
?Mas��8�W@�
�\2p�(8��e^��H��ؑ�����‘By��;��;Tse��߯�h��
��$��
K��·��$�2!eU��tp�@�`�\�O`2k��膰��1�{�.,�v� �7(�7��V�R���g{���C�U?��Is�"���VUU�[�\��=�
_"T���N�4}�{U�k��-zܴv���J?��C�'�W6�2P�e=8�
�3��|�_�I4*��ԍ�=�C�pS�ǰH2�w5$Rn���\����Р�.�L�����}L���]�R�_�i�v�wc��r�����G%q�C^v��*_����Kʷ���_�Z���~��'Pt���K��6߽���_��?U#�{n���_�|�ӗ_}�5���&^��3�PL����rw�[�E�="����m���X;p���\�ka������X$/lA�ʲ7�]���J��]��韭�a({,���|
��2MchT����GVz�)��q���k$^^��VPSM�,��_k�Ȑ������b��;V�Sz4(��*��[�ýwW�A"�/����_���+� �/��5��P3ccL����Ç�����˅�#&m��{����-�nT��j�[VZ*��-ƒk3&v�E9�C.�*9��'F{vP'OR��������ΧTN�]�X�J
vY&?�A�LU�hv���*m���)4�v�^�D��'G*X���S�]����ه�\u&(4���!��Mk���ua��5'�J�?��r�!*�!�{K�Y\�za��6b�.C��v���F���s��n���V0e���8�7v��PO�3C�Z�33Xe�䷥x	`�qm��Xuc�0I�}�f�M(�����"
y�B���Gp�)���|R�3����~?k<�۷�q;ǯ�D,�(�̱C,�Xle"�K���i�,'U����>�t�훪�)���L����|�I���qc�tZ�Ko��S��Du�02�P��#�Z��vǍQ�s���~6e�Oܪ
�=|Z=h{���~�7{��=�dj��c�E���#� ��ZM�0`���x��jʤ7��`�k��Ge����j��цj�Ɓ>�� �e+��L��/6� �%��ǰ�`��d�K�x�'�^�H�KN��qL�<��G�b���ъ{�qH�j5,��-�U7�R��O=��}��a��}�a��~[ZO��5v�6�gI!S2��~_v���c�n���*��+�^z�.֝@�kN����oݣZO�U�oj���$�kT��x���3���Mg���U&t���ͷי��f�Ċ�Ef]�o���o����7��W'�G�d��>|�:���ʭ*(G�YГ-��?yM7Y���.+�?YZ�Y2A��q�6��c�E�;j���s~+��C�vN6��/��!�}Ko�ؠ��4�w����*����u&��?�mSo���� ����Ӹ����{<�ʛ:�y�^g	��yO���[L
�%�L0���S$���]ԑ\�3�l��<$U�]"��ڴ��
�\/M�����/� �����^?!��������`��+���c������>��n��D�7C��v�"�ɝ�Z<���b��"r��^`�¤@sOl�{�Y7���O�Ϩgx�C������O�7`��z�����0K�F}?��OHI���/�~�#�E��b"n5\�"��N�W�V<�`fׄ��)T�PAMJ��YU�k_�dUg�0�Uk����U���ĝM��j��1���Y�/��uj/�፽ZRG��{�û�1�o�y����~���G��B��8�`>tO��&z�@JU/�Ԋ��0�[I�{R��$v��iߒ㊩*
�r%Xk�RMt��j��P	��PBϜ=A�K<�O��{�X"�)ޒSc��ZN]9��]�BM�.��Mk_��Se0��QX�$[���ol���S�u駛�f�>��JW�	�sM|���S���]��bg<my�N�����*.>w�^i�)p�*�{�P%��Ǧ)�ȟ�c���H�3��2SC�UeS��d+:��UB<}�=z�V��,�,|�|��٪�x�Y�������U���%���uF�5Zy�a�`œ9M����U
N`W��=W�t�Y=�6��k�a��01p�9s�Y��R^*.�9=:,��^���/G?\����g��MH�<�}DF�Q�$��1�-,�<���3���������/������h�h#���_��"�I=G���y
\�~%�*],�)��)u��ꟷ�������mG�dYzw�r��o�L3��k1EUY��$`H	�Ȫ8aB���,�+�_�K��N��8����NY1��OY7^���
.ywH䣻l��\��`��P"���*UH�|;����Ȕ�8���+���MN��S��*�3��
��8�%�#�(���u���s�\��F]���xx��`R���J�ୣoc0�k��U�0.��>�5�^[���G')�,t��y��i(ю=d��_:��Z�*&��D%I�Gc�"jJ����t��;�͆�t�0����'N	C�7ݕY�>��C��V=�C�?u%�<�f#3�
�ʺ�3�e��+9��[���0�3Gpi�;�ː�횎`�C��4����|�ka!�~%TQBN�������՜�x��F�yB���8��s��#��&s�A����_>�ն�j����Q���
"�p�.�/2�/���A�W@�/j�_&��T�Z�B���R�����.��b(���Inj�Q��Y�xt�fv
;mw2���λOz)a��u
.mnIzہS�}^]=W�P5�9�)4P�A�-w`����G�Ŀϗd%6����}��F�(c���{���C��´�
�aSP���g�/5�K7�"���
��pa{
�σ�G���]vg'�o�yr~Ώ��S�V\ih����a��Z���+bEP�ǖ7�-�M|
�J��K�-�������{5��b�-��>{�|��0B�d�-π����)x��G�*�~�U�p�џ����|�>���9t�
o��kl��K����'[���~��b����w;z�� �4���ț���8[���
7��f��GN�
�~��R��o&�0s���HO66yN����oZ0�5y�����F�U��)\�#"��<f:IK����px��c��l�}��D�
�5�l6�-Lc1�ϧ�D�/
<�Z�Ch��r��_'5y$�ۭ*��͏�J�Wra@�Ja)|�:$B��'9��6R��v�=5=�ٻ`w��7�:wk�A9]t]��@ T�A-@��mO[Xl��X|��0��ʎj�A�=�7W���{\���<xDg�$��ؚqg�:�P��p�dЪa܏�����w�y��(|-]�5�������%%�G�)v�%x(
�ȅ��`4L���f���$��X'�$�z���ύ�,J&�[W	[�iS�x�0�S��3f���o��K��m
��73}�	�8D9u��ʟ�O�y�"fdK�CO@W:a��K�߬��/e����|��ظ,-qd+9��_�G��{$d�L���w�K{�Fy�M��/����ݿ}���{��qؠ.�<��>eg�w=��^���#��U�V(�0��>��;���w^j�^���V�/���Nu>�����T�G�G���x�-<Ŀ�����Q��R�I���?3WN0��M���a�J�O�F��劮�ڈ"L���ޱ�|�
��k%3Sz��i�=���r}�s!x��{���8����
~�-}D]�#�7���y(<�`r��tl$'�؏�&O��7e���\�?�_a���:X���������j���k���H&���u��#gm<m�����q��?�d\5�A�ޚ��+�Vu�@U�rڰ�纝t;	�z��i�A:K�
MgS�::@s���L��o��������\J�\��l�y�v*��%�0xɽ K�Hs�HLl�x&}��d#q�1�3'Ih-&��w^1$iX����t�����|�F�9��t`=؃ ��&'hR)�`x-�B��nX'�fo�6eR&��M�8��E�fS7�}�BY�� n�)+����5ʵ��h���*��*�r�Z��z�dYI�s��w�8�x!�h��Et�D=�(�d}5�ˠ�7
�c�[�<"��i2�ҚQw2��^���++�����6��Ca���d�FV_��%��2@�lQ�z���V-�A̭،2P��bv�w0ؔ�4�`_��@DË���%pH&�W5Ya�o�nXOi��Ds��N��,��Fu�'e=�}��AOݽ[�����ҩ�D���
~��^\D�6��Ĝԋ�R��̍�D�
����~�G*�Nm芔�U�?I8|#NkǗ���ܴΆK/^͓�w��3�X�/�o��9��k�ck�J��Mu����
^��Ћ=��5�M��k��/�c���\\?�I����-�Kx7���S�Ȭ,��Ԛ�.��+�:�N���d_���3YH5�fT���d��FS@�˗���ٸ^��p�Fu�R���K�8�G���=4�]qP�j]���bF&*H�о�}]��4�r�oMg`�]	�k�[������X)���"~��u���-*�g�貙a�L�	�T!�'a���&W�Q]N�Wxy�����\F
��⵬��M��U����776E����YU����N��{��e�H���&��/^�~]��x�<ݲ
���qu V���擎B��eM��oP��d�H�O��X��>�ed2c���lO^�#	�R�Hb�.�CDUa�[�;�P�uYOo���j$iÁg�粷��J;���қ�6���cU%��&�G\�'&�`�{����FI:|о�A3x��;��f��<�q�&+Ը�깤�.��lLL��� �N$�|U�@b� }�����빺J�_گ�x�*�te_�a�N.�q����<x*f4��'/����B�Y�H��͠Z�h��9�:6'�W���$��x9e�R[a���^�;�x��@����w��ly�/�Д� x�U��B�Xl����>��b�w'��JaC�ق��vP���k����E�)3E�`K\���{.�3b�H�	�R�\��}�Ӫ��ǎt��ލ�"�E��~��a�QsY2vDzJ�a�m���ς���)�9�C�4���ly^F:���H;[h`�9qU`�+]��l\���Vd�q�����l�\�C��_��aˮW�l�#
]K8��ݮ�>��~}�4�Z�XT���p�VBJ΁*��s��K:bt��F�*.�� ���Y4R��I:�-&պi��j��>�;����]S}�˦rߛ����m0z	%\x��ua!�@��[J�z�B��-�.%V(��r������("pL�Œ\([z*Wܒ5U��r�Sa�S)?�2>l��,���to-���F�?�k�^�7Tj�X��Ƕ<EC�IQ&Ǥn«!�wa����й�)�G�)�(�t=�#��>�=����PK��mW����w�Fsetuptools/_distutils/cmd.py�<ێ�F���
%/-�O&,�N����8�l�$�RdKb�"y���
��n}����>��GT�����U�$I�ڌ�X7fS�����Q�A����X��*�˜�m����u=*�U���-=˂�(��$IrsS�n�9���f7t��==�`�,��>ߏu�~�_�ްK�C����Ս�_��<��S�{��
�����0��?���������n�v?�
s/9uý�Vk��nG_8�6J�Q�ѻ�QE[g�;�j8�^��{�A��QF�i;t��e�z<eѨ�b��m�S�+�t�H����H����4�6�*Qp�)�5�ES��sY�Z�
qJ�h\��o���sں���}�zP�dMp��j���
�9��@���fk%{��Y�=�c�)x�u["<xg<iF��t�{�.�1������:�È��"�S�P'�Tjewo����zO��f�ΈAE{��E��m��Qu-K@�זL��O#��؍zx���0nX�@�:�����_�T\��a�S��s"BH@��d�|
bP���`�� �$�P@l���i�2SX�S��r�㡫2>V��hL���5�|	Ζ`��k��~y�R@8�%&EU9��o�ёf(xűn�Z�B&P�~���5#����=�>���Ҿ�V�M�M,��J&ɔK᳀"<����m�$6��b�zb�
p:��
��g��ȼ-@roX)�Fȅ�����n�	��i��"���k6Np �JA��x����_B�=��P��*�#��&Yg�1��][��!�}���R�W�g������T�kW����%�P��Ch�K��i�[ů�ʒIP��R�vs��?������T�C�YV�-*�0�	6:;��3/�<�`Q�+J9�А�y��)G/��ll�L3ڈH�*�Pյ5�	��@U����B��X;�Qw��n�F��y;��r>�>Zaɣ?	�Sy��|et��Ȭ�����4Ys�>������[�`�^�cs���}���f\qt����Mľ7Bl鍵�,�y;��j��]�8�@�0��9��3� ��8���C&�֯�:�x66���Y�[b���o<n;��@2#Y���E��S����a��^S���(��"zUY��:�O|��}�#ã,���	xw���
��U���l�ާ-��;bL�`In�c�A�5(pZ�ܸ��}�m�lvM��j)Z�7���J`OwD�u�`
�����E�/�g�l"D)! ��;��[����|�ဃr�i!/Z@J���P@ts��k��sB���+��k��\+�8LZ��鰦mA��+p^��D	"�K={��X���]�Ic7�g���A��<U�9�X$T�S�LB��V
y��#:�<G��t�M���?�&�BH]�π�w��Ps��@����Ѐ�l;CFB�7P��n@6W#�N��m<�S1T�hۺ��z<��;������xۏ!>0�ur�'M�uؼ�'�1�HB�|f54����Z{��^` ��3���h'�	��|
%�����AX����y�;=;�p�҃n��	�0�
2���c�c(�2]�E�!����vɝJ0?g%s!%�7�U��٫db��GO�j�RT2l��c@��n��e����3ƙj�a��B�L�E��N�;2y�n
P�;�)��9��@	3W�?8E��m������8?O�����uD�ԟ�O��y�j��D4o�_B��	���x�Ł{�'��N�-����6
0@&��'�x����1,��8
m.���T
�*$���R��ol����p|�8mD+fJT|\�6�w��zԯ�Q���Bq��[�	-�m���<�\�Z15��a�ɑW�Q��L鸕���S�L9�=DD[��S��Vf���nϑA	@��|r�+���%b/n=��\�@j[۲O�*��9�G����<����:�~`�v��%��T��J��[Uu`:@��]��9�4��Q��˂ׁ���5�@�`髛L\��r� *3I�@���	��gA(#�{Q�z��,�]�+m�<�D�$Rh�W��d^�` u�ʜͣth��MT�d!A����)J�rّ�HrQ��M3���u�Li�kI�+�^�I�D���OڒJ���N�6�eD���xo���F�F�cVL
��-'YKل�d)���\���N.�m��|����Bח�oQ��>/u1�|�B������� S5ʇX	W���Û�(Z�.q��2�D�Q�C��Pom]R��4̻�m1�Tzoń`d��0���!-�����0�ƌ�$�0h���9�FX���YT���u�[M�>��L*jwT+�`��.Ii�U v���1�0�����c�	�2(�\�(�ww*�<s�$1}n������J�1GѶ݄�&�6��A������o�}��A͂�)�Fg�V�O� �̩�A{a-��0�H�N~�y�Y��tM��_^��
c��.��g�����"�y˫�
�0,y����y�('���q��׉�v�M��Q�>�z�-��a8�B�� �XI/�ܦ�v��(Š���'hy�3�y��N��܆r)v����!2˝�7�%����G�;�Q!���)I
��-�!m��f��I.K��쭒��E��l'��(Xw���sة=U���Q����au6���V��U
ۥ��
�f�3��gEo����N���y
b�X�
�DP�������?j5��G�ȷ�>|������:�>�CG��5�׮���eJ��g��U�rh��Al��Lb@��x#�5�9��a;����Ҏ`@+��1T��3��h�OX��y�Td��$�h�e���Y����L�Μ�p�3l�
,>�u95��b�z��Z�����ٹ�j+	�n)�xG�y���q8[�|��F��RK!WK�T,���C
Gr�Š.G�{�Bw�l�Q`�����Jw�Nf�z�q:ԣ6=�wkF�D]�t4|�O\��L,��`�&�,왛��B���F#�X$�g�d3��d�H���B����l�q��7=�6���Qt�\N#Ug�6r�Y6��jT�S���g�$g6���+��2�܇ù^->��7�f�JeI�jK�
$�.CR�FK�J0|:H`�W{�����G-�"�5@d�
�26/r1���0�9���My����7�8�+�����B��˦��٥pX�~���L�t$���Qb�R�=s����gbGލ$���������v�^e����s����UTiOPs S�?]�1���Q$|+�"�>��d��"|�?$�-����X>��:7�
�k-���t.��u܅
���n�{ ص
�3z��<����Pd&XŎ����~�,}]��(��"�d�����q�������{�vY����T�w���F�_�ҟ����/	 2����
T�#,�؟niW	QC�y�a�Va��ѹ�X��]��є�_1@�����Z˴�֡7G����2>U�\g6}16���S�K,��Ӗ7i����E3'�V��%��zx�?_D�z������ �h��o��A�5��m`4^?�{�]�t.�Q���5
W�s�`���{�؆��L~����#
>�Zq���ʼ<B@��}Q�^by6q �y*��sp�qW�E�@T��S�O6�'�H"�/��G�t����i�N�9�i�Ue,���Pר��|�ei5\B�\
�'��r7}���p�"*�sYC�F
�L6�Qwl��2D�c;J��y;��E< fm|nvz��U1;:�}Ie	�&T��jnz����a/����"�HW��ؖʌ�+��'F�p/�J-/�vR��x(�Lz̈��E��|"��[��A$צ��Zv낈�F)4z��簉u�a[>*3Ú��_/�\NO���k8�V���y�ǯћ��
̕W2�#�FK`�c{숱l��)����>}�m��&[gsk霭��r��Q/�+��9�R�_��Z��n����
,��I��q7'JV��AXH�uۙ�]�/�G�s ��� *+�i��"4���Aupw���� �\.���rC�ē��sF���ڗ�p����X�����0A
|nğE��S����%.qb��X���<�-:HY"`������h��-����fI��~i��%�Ih�����#U������Mg�::���/Û3��P����;0�T�֛�ߥ����o��7Z'
��na��)�Fv �su[6S�a�+����ؗ�
	[���΁z�rw���E'�ԏ�>)v�@!��_�i~���|3��l׺�s�w�^q2�
��1ؠ�G�m/픽8d�}.b��/f��u?5\�J��I���F
va�����V=7���6ɮu����I� :��njK�����Nz��'L�7���K�h�c]����{�dG9Ʈ�w_u_�u���/�����n��Y�cn�K��X7��K	�����M
Ó����U���9o����x3!���L"�h/}]r71v?un�kGό52ѭ� 2u�pQ�ó��P<����Qt��p�̛u�
eQwWW7�Ǐs�I�-f�i"�2b��=E0�A�g�/2�#�
!��2�*�B�K
�zLj��s�Y����au�����.�
��	�ht\�S�.A��>����\�
"�6����p�w���/N�TS��h�ޝ��BQZD����Bq.�ڳ�5a`���F������\.�i�����'0f��bi���,ݩuCY{Ȫ�y
ZN$� ���y��D�K���י ��RDϙy�L���/]�=n�����17M������y���\Z�D]EPU��h���D
��I���ʳ���<�C�n���
�rq[>���g@N��Q��
���z��ɰJ���(�>b���<|�G��c��z�Uɽ�V�\9���Jip	�y�(��a���[C�Š�&���e�3|�׶%�<�J*��BC�(j��%��vžc�*��Qn��S	1�v��	.f�qN��y�4��sD��B�}��NQ��}:'ؗ�D�
�r��~�eo�Z5t͓қ�g.x.(O�I�M:���eINI�|�.��Y�.��}|Γ���V�A
���]�Z:��e�w�h[�m5�R+�T���#@ @!]���`��v/�
�3B|�-����SxmK&��E��L�b�����t=�T�K�ON6��9���^��q�e!���P~��9ՆB8����5!��N0��q��դ�ͿPK��mW$�Fq��setuptools/_distutils/config.py�XKo�6��W�I�㤗�Mw����&(�0�m��E���q����������b���8/~3�h4J��{�35)��I̤��S���22;�n�77b��yJ��*56/�R���d-�YJ|)�������؄�F��ө4y�6	F�Q�w������l�曂J�$����pc�gf9(%=�]�D��A���O�V�'t�\��9XTJˀ�){��oL*rx�� X��2gdNwlz���<��w�:(��Xd?��_Mج�&@/�8(����r�L�\��<cN�|:?�g�_n��O�K�պP���}�	�剐�ˌmhr�[��@-+_IVŵ�GX�,rfWi�sfC���"���Y�'
k��pLB���d��k�E��t��)9W�9'ϵx�����LA�.$S�`;���/��=��>ˈ�#��jbj��r/K��
�1�������`4Ym�^�d�����6�6Ks��0l�v�WF��'��_���^��r��G[a�� �lU�0����1q�ٴ�r��,Rb�ި��}	������q%p�z��SQ0c����W�W7P`��ǟ��wOcr%~��B�aL(�ƴ��� �fQ똞���3?�Wꇢ���΁z��|M��](�4nZo�i��}��(|T<�. ��홚;W!��
���38�
P�YꞆ�R�$��1�{�&��m�b��}+�VZ ��b�I�	6c��ɘ���$d��<`I�#o(xUQ���#oO(�W�q��X�_'JK^D��W�l�Q�f����g�V|Z;�T�#X�	v.��+c��łRL�m@54Ww�M�0�d���_��5�)6�rfl3$�zA
	L!�#�s��-�w'PhNخР�=(gi����D#�o�v'{)Y����mS�����p�,�Rj����D��f�t����9�Ž�*��R�w_���K���8�-02އ���8.-�g�-U�mW���P��%
$����˾g������/�J�03Q����ox�Gu^Gդ=�9���Yd�t�A!U����ÌDC@�ςgF�KL�wC�bÅ�e�g�x�
�v����T��C��Ϟf9l��ןt���R�=n��꫟p�e���eH�Af�x��,�"��.��D������}p�1���A>x�1���k55O�`�a>�٫�z}
�s~�tB�գNb#KO{X�G]�u홰W�6d��gw�F�D�nf6��4���'�zt�j���>�\�j�-���Ȋ\�N�x���;��3��	ȣ�?1�"�,��G��yYN��e4"R�p���TƘ1:��nFn+�n�s�9���],{n(���m��������{��kz�
�a����Um�_o��Ɋ�^�̜�4�<���n��Y#�_�@K���PK��mWIS^��"setuptools/_distutils/core.py�Ymo���_A8XX��B���nz=��.v����AK��FUR��+��;/�$�J��&2M�3g�-��B��ku��X�X|>*a��)�R��([Q+U8��SBW���*�c�p��X��8�r�횕�wu�jS��t�Q� ,�e	���T$���[ݴi&�]��Bׅ�*oA� }���]G�e]�w���o^J�[Y�G��8��g�؋B�u
�Z��'�3�IUd��r�X�q��n� �'Ԯ;x�����e��.Ly�X\��F{�!���Ld
����L:�/[�*��OԙX�|3L�6��a��������w/LUϭ���Ͼx��Gp>��b�ؙ�yTe#*�<(qP��"�R��t:��\�� �v����8�(j~>t���j]p7��G4,�w%�2@�q+Z�$�6��
)d4�����$�[�M����� `e7~��e��>�}/n`��Ã]�7��_X��p������>����,�Bc#9^UZ+hѫ��nfb�g1�አ�����󶵬Tz�˃�o�Nd�l��N:��Gsi�7�Z�Qޠ�]�.�L�D��BT�s�֚���SG�N���}4I�Nj�`��?n]k��ܷʂfx�/�i��_�R���O�����C[�4����d��)�֠�x��GL�zP��d��g�<)��e̎O[UI]�/�o��+�?~
kĪ���9\H5/�+��(M}؞�����;ۂ�*:/�E�5�?�T�F[�dn�U�� �����p;gJժ�M�_��!!�]���U����U�u^v�$�y-��0�l+�[C˺���/-+��J�{���魮�6��(8��[��;�LZ�p�]��<Z���$ϝ���˜�u}�3%�T5�.XiY:�������[ٶ���I��I�x�#
q-
#\��=� z��Q�'6B�`ma֘ť8����T�z�c1��Ma����w`�}�_��@�HN�$4`Cֹ��Ȃ�;,%|܃�����*Is�B�P��p�0	�x�eV�E�A���ϐ�v=���l�4�f�5ƾD�K��d���kR��iԒ4�4���D��CD>[$hr2!X2�U{�r�a/4ϰ�z�i�u` ���Q\}��xr�I[��)fq֯՘�3�sW� �'A`�_$�9W�#�+H{�r��C���$
���K��_hl31�(q�}�'G�ДN�6C�kD�G~gÈ���XaX�9
��Bg_8�d�4�|�9�8/�����9X���Ԭ7���d��0srXXJƃQ�T���v܁�$h���jo�� ���(���	!��Y�����S�
�W��U_aL؆4<�w4�d���,��s
CȜ+���ۃ�Ѣwu�ؠ•�'�a�w�0b �=���38�""�p�`�[�C02j��Q�B0n!�7��+�i�P,ˈ`�a!�a�0���B�7
�!?��d�=��1����](/�׉3��$�^���12�C����h���������ޫ���tw*��wf���}:c{�2ႇ���%W�=P[�G�\F��F(M��je�B���1q
�siN)�H�n�X.�N9+St�P4�z`�*y���d�-�*�'��/Χ�1��O@!����t��l]ѻb�ӗ�>���ˆ_�M�
y�\?��c^�b�_õ�`�,�?
y�KI�ʦ$�g���)��^KH�Y΢����[���e�'L��%��@8>��{�6�,�;���j����n>��U��n�%u.p6s1��tK(�`�t��Ľq������;�!��]�j3 �h�娍/Eь�忏i�ЁI%�[�D�̀S-��6����;kn����|Ћ�]7�4���w��K��QCi<Ic!�'ˠG�GF	L&F.�^/G��>EW5>	n��L��7#�{ݐ�)1��h0[L�������a��T~�f.���z��RF�Q�P	�$�v�d'�G�]�3���`}�+#��_�;{��Z8:(	�0팈߈�ך�ݢ��ݣ��?�&y(�u��aM�k쪮�)Y�!�YP�<�[D���� 0���U�3�? �]�R��a�*���i�-�Ģ.�~0�������V����Z�o��X���B�.��󧈠ğ�&@K��,򱍋}Kߧ�~����K���I(�Pv��/Ğ���z�k1I��܃�ҷKX���qS�z�T�4� �݄���55�q�z_d	L&��"���1�:	�v@o:ji`Ģ����K6|Zn
�J�4X	B�b�1���o��VQ�`-|�F1���AY���f�+�y�I8�*L�N�I1PO}��U��x!#�[MVQ���mWtVrm0Q��1��j74X�&*�ϔ�7�d�X�"cW	��WXA�]~�a�X�b��݈���׷O���Đ��r|~uCU�ݭb�+�4����mJ��N!�W28��`s�O�7�*2W]�
��T��>��I���,�!"ސ��<SW��EmI�Wt"�_|o�aN9̃C��u	E�3�0��Q��;�_���
�${F�G�B3/C�b����)*�k���IJh3P��{�c��cՄ%��!Y!L��Oh�m�{�J�9�_�r0�u�����.A����&%uH�Y͍+�^�X�o!`�&5b�������\m��o���$6��`^P�I����Iw�]�nhrLm��#�~�뢩t�M��8u��nE�)��>�Ȟ�k1��<�?*�Mx�5oF�e�	��+񇪂�~4]	L�[L�\_��L�G:�[՛���j�&R�2'���!���(���c�3�?�{�q��ړVec�����y��sS/e������[N^!L�ʷ�t�F�^�z���8�x)�@����
�kA�%�Odg�]�^�j���rT]q?ʱ��<��]/_���G�6Ȯ�T/]�PK��mW5��<�*B(setuptools/_distutils/cygwinccompiler.py�<ks�6��+Pz2�j����O�����f�ę$ms�ɨ	Y�P$���{��)�N�դ�D��y^�	��,Q���eE���*�y=��˛,��
gz�X�,�c!&,f�Y�wV��oE��"7�m�"��*k���ѳ���K씒��i�c�%�sQ��B�Y!F8�EV\�=�!�v�,ٰ�b[5Ю�l�`�����b����OQ��ǶL�8y�7���.W9ߊ��	���ek�/��϶�&1H����MY�^��
f����f16�h�&��7�lb�\���%<�8	�����
M~�N���c	���-m+�Vu\�ٺ�iz��4>!KjN�Y���0�a
ٟ~��@n�ь��)�2ga�
��:{�@�1_w���=�'�FV�aA\�N���ĕl����΄�k�ɪH��
.����G^�����Rrm�6���l$�p{K�߮�\ �[��4)K�—�gZ>Ռ0����Z�$FA�$�����#�B��,�A���*���w��
��3�J�ؚ��[u�s�Qp����,Dœl���L� ��l��݈�~pu#�Z��������Fߜ/wu\�i�0��6(� ^K@��e�jkN���Q���D�=0.y�����KqvaT]o����S�<�T$���5O'�4�q�u=}|�Zv��4�ajҿ�R����#��4�+5dk
�f��Eg�d�
0�>j�M�!g0����6?SX�=�N���۳����~��!�BZM����`�$�Ӄ��T+���I��j�@d���-A��,�F[-�����:��D,x�n�A���F��Y-d4֯��s�ʎlZ��>��/8��Ha�Q8W�q���*v� ��-��(xr��Z	
�A[D��믿fe3�q���!g����������=���J�^-��H�U���{���m��#��"��ҳ�3���&s)�7��_��ڏ�u��@6�4|yUV���W�_]LX���ǥ�fr�Gjn�4b��r�47K�jF��L�%>��u]������'�\�	�˨�#���c=��#h~�y2�ddB/�kY
��z�*�xg��,9��H�3���k.�������6�(�q���]��7�/X�2�l�<7�T����5Y.		�.�2��9��#���ɲ*�#�;"�3�_�Y����@XČ�j��ٹ�>��.�+=���s�m6�`�hh4m�٣��o!���b�<��l�]�D��~�w��V��cPgG�~s��߀Yx����"��q���{����8��[�Ϧ<��c�gSw�]pu��Q�=��<���	�3�
z ����TF�KX�F�z��WG̀��W�Wfܧ���?�����yQ�f)7�5콏�{��ރ�@X����~=�F;�}
���@��ж,�Y���2<_O��+0U�鄥�~	����O�������P,
a�N�}5�_�R����*�\n�q;@B���l\!H1�S��QN

�Ah�s>Ao��kx�KFA�d�˗??�����W�	�]\�`��jo�f�r�EA3a)$����yCh�y,��u�bN��E�P�x�YS��ٚk
�~'u)�!��(#�t�!�xq����-�b�O����X��ӡ�����S�hʫ�Z�s�;o _��`��%lf�x���b���i|�S��`��f�{ё?�LW��Q8e�9���
)�����@�'l��V�3�G�1�?'���B�(��?��G��
쑲�D ��Hc��B&! �����<��	������R4�|�@���qeFE�x���}�!=�%m�(��qoZ?��0T���;��<�dw�t>�
��	�an�9��zI�n�!����^]�h�у�x��{�ѡm+�TVR���w�m�v�j!�l���
E�H(d[S�0����NV܎�k���6R��s\Q��y^x��? ������SkUD������I��O����w@�
68�<�]��	z���l�;f����h�L-�
ni�^��%U�m)�o"H}k�ѳ��l޸Ak���(��xYN��H[�1�x�N�Xlz�4�fU�★!�x�AӉE9IŻx� 18��<�?��ly��;�_y
-��p�-��\f�ֻ���8ŕAcm�;���
���Il[p�R��ij�I�;Ѳ�%�B��W'��� q}-�WcJ+��B����B��M�R[a,�H@nQΰ�^��2���$%Z<a5�ܢ�v��b�ɡ� ���j�mx�`g<���˾��+�����*B>��4���g�iya��>���Jx%ٰ�>|+��k��[�	`�x��H�j�j#:\`��v�>g_n���԰�]�������1c�J��Vn�Pj��A�S.��f3H���Q�;>�A���j��zk,��GniU]_��܎��L�6f��N5G2��%���� ]J����i,y�Wź2ʅ&��`'$5�W15璲�B�n!$1������s8�c�[V��
�7�ث�Jt�P;�}��qv�gzhg/O�4C�\][���A
�L�c5m�
l����[g��N��TNWM�
�� ���;9�T�N�E���H�y,MҮ.�],~{���H�Ad��\��o76�4	}
���+��)�Qqh(���M�Q���(l!��HI�jPTAX;�`T���N�
c4tDE�ySۋ��\S$��k,�5:=N5g��$���nK��l��]�z���iEeou߄�1�������z@��\W�-�7<�ضI��ζtZ-V�\�����D�M������~�g��W9+u��
�b���*c�S\	DRv��zܸ����L›ateF l��k���أ��&��`GjH�S��?eV�f
s"�)(��s)Eȣ|��lP�
�f�������-��0�����O^�/�X5��t�dŻx����7��i�Eڵ=Col� |%+���&)ȃ�[5��Z5@`آ�s��͚���)d��)A��FH���f���}h�LnQt2([����p������1$��$�G��'J�����*Ti�]��7�J����~P!~��Q�'��{�h��P#����n6�����m����8-�s�Z��$/a���(z�X�e�C
u����Ì��ݶ�?�	8)�%YwY�RW#WY��|p���f���K��q>���؃I3
��/����!28f[�!Ƽ��Z��z񏮝��,�$�vO����3"xV�u�v�Ҙ�� `9�F���B�Y�\��K�R�X�����)�Qͫx��짟fS|��)�a�޴S���;֛����ߐt�L�,]�G�Z��]���W\Y��ᅢ�9�v�g�;�R�6�tN�8)�����T�r��3d<D�*.+6������H
+m�u�N���u��HxO9O��S�
xq�O��*Y��DUiO�Rv:urU�wS;�wD{���V�;����WSZ`hT��4v�ϙ�w�
� .ic��D<tj��J?�@߁�$�Wm��k�"
����z�G��c��*
�L�,Ǯ���%\�W	!�L�Be�
JƷ�'��f��}2$�D��	��]��:�	��v;�VF�Q�>��,�o)��W�(��扎�U�F���jj���m�X�D�#t�yg����S���
=�?�k���O�X$�M� ��*oT�C]S�
�#^}l��<�#���ȋ�i�stD� �����=���}�K4ok�t�5]�J}V��	{B��6�L�m�WG���q�z2�rҁ�-����<)�SE�LF��O�����%BiI(�l���q��<g���G՛�;G22�4wF{(Ù���Α�a��_�G^!
B_��$)U���V��F5�GO��Z�@��KuV�nC���Qqa����>����Y��#E�}�^��+��"ڃ�[��K�j~�=-t���Ćw8j��Zƅ�� ����lJ�R���ɉ�ص��m�ԃP�k��-�gT��|���PO�F|���;s�����p�X��������TS�K�~
�=_��%���Cg�(�[�������w	k,$��1m֪q[*��
q�&5S2���G�Q����>zy�V=E�������'�_�ۦHx���<u����z����#�IS����G��M%��I���Q�,
/T�V�!2���b)xM
��M3�'����C"b�u������
R� tN,���t���_��n�}SIJ��?�(zn�a^�a^���Y��Sz@9
䂍�jXGFv�ޣ�.�l�m\�8�fa�����#�@/�
]��u�q��c�tES��]��3����;����!�"�jU8�+_{�t,U���>�P��,-�%^�mϮ�enzm���i,��B$\���UGw%Q<E��b
_U�v���X�r� �i�총�UY�Q�)�^Q`�Π�IV�I�Q<�@�j	g3!C;�f�Xߚh4��_yךE.�˶!�N:�?a^APUU���o)����Z�EV�$��"��vٜ#��se��h&�em�M9��Z���Zqc�lIA]u3�A��
�E� �p�V<3;B=
�h@�L�y�ǔ~햤g�}�d�`4O$�z�����%.|�%��k���o�ix2�t0���H�9�EVQ>�m >�e�ԕ.$a�����o�_����9e�j?x����ீ�=Ɛ��Fs[�$
A�M[W�s��{�*.:�wl�C�Av�O���m�n�[hS�\��r�E}Յ�5��6�ϔ�[���Q��g��?'�����&���PQ��`|��e�ը��:V�4��!=�Spsu!
�4Q[����������8R?�*��x��V��A�]ɪ���&�䀜&��M�µר��;7u��+��P��Ϊ��6�	u��/u)J����u]6U0Gjb0������m��-D������f�>H���2�jb����S�Bdt�Z:����+(�Tu��y�l+�����
~1��04o?t�N�XpuX�hi����Z�C7M���)V� W�6����1�0�{t�
`��#{݋��UB��pϺ��w��N���#H���	V��x�PK��mW_�H%u�setuptools/_distutils/debug.py]��
�0E�|��*H��E*pk;K���
y)�k�o�[��8�㜲"cNp_���޽�w��Op�(����24�RA�8놢��+~��Xjg����D��[=X��s�I��a�\�PK��mWk"#��
!setuptools/_distutils/dep_util.py�WMo�8��W��(d���c��] ��@��� �%�"B�I���3��);��ؑ8��Ǜ�,�VX79!���3}+���pG�&�8���N�b%߀��
�͎Y��q�r�Aw�	�m�T{�����I�73(k��0\��;5}1��L1y��n˲,
tD����B��hc!>�3��?ѣ�(Zށ�n`m�d
��=w�mx!�W�&������
�*�"��MX��`x����nE'0�3偪[msw&��Vs�*���&��=�N�>�-���s�l����zR{�ܘ)��+y���s�(��6���9z��vd�߆8bc��2Wx�%��w����w���+Ѳ����[��ڢ�޵�����ŃRsI0߾?���:�?�=�ҡD��N=������ٱ"����]Q���\��#�@y��6�Ԟt���p�K��W�P02ä������S�8kzp$O䱼XZ6�nG�Z2	�'M2 �����Z����g<�#��k�)p� a>0��P�Py�u]]HCM�5�v�^��$�������Q|Y�_Äm��]�`{חu��
v���σ~5��9G�<>�[��t�&����
�Σ��Q�٣x�������4J3���`�H3ȅ|�3��dT�*�d����y� �E�W~rW�gp6���ntw�2�� p2�dy�HKL}7x*Nd1B[���8EEP��J����g
�r����?���ρ9�T\�p+l4化u���q ���Ǣ��M��6� �T6I��第�а���d�t�˷0��ʊg��Puu��I8�.�^�6+7䉥aB+�5z�	�.��6O֡b>Wp�<�Ä��v�FswV��Ye׮G��S�)�ek�7fR%-[~�암���n�.��c5�`�s=�pim�<�I��j��/�
�hѪq��cG�7�.ߥ�tΡv�WhC��5n™{����
}�������l��!3
jM5n�1M��R�ο-�R���p_f�b�{������ԑg=3-��(�c}�煍0����1����0f%��
-�a�`>̼��r�g��$B�D�i�D�|J��W����陗�����kA{��ͭ��zZ	*~��i�/T�hj��{���6<[�z���m�1)�F���M.��D���0�`�D]@�d
��ٵJ��:�_�iF�퉟,!�O���;�^8���3���.�^��7�X���Dž>�%�[/�i�EW�~Z�qa��PK��mW�3��
b!setuptools/_distutils/dir_util.py�Ym�۸��_�:$�yu�E�
�m/A�%-.) X�Eۺ�(U��q���̐�(�ޠg �]i8��g���(��mY��(�5��X����$v��ڲ�F�N�R�m_I[꽀��ڦ+�R��'a;�L�\.��n�ΊƄ�T��f��Z���a��E~�ߕ�zK�V�ڪNˊ���U�_,^���۽9������f��F�ZȢ(�/a)�*M>u��u!���2+hQUY�ZZx9�]n;��îi~������2F�!�-��t�Z�M�k�}ͫT!��~#ߋ�щ�QQ^�G�(�Q[I�d&J��Ց���`�m����+�9TlHDl��hDߊr',�s!+�Y����(��Gr���mu��o�
v�j{��QY�(�.�M�Z�ؕ�W��ׯW�Iu�ƨ��y�����������;{*dl	jDjd�4�"'�V��)_�������iBV%�4,��kl�+q<��+���Nb�w\�z1��Ķ�;D�m��H)l�n�
sV��,!s^�dL��R\O�w��S8Mf創�j�;)�on(�~����ܒb�-D�W����8�Y���d�Xt=R�"ҍV7U�i�����*4E\�hz�T��4[Y�����苓w��C�]�U����Ժ{�B��,��mS�(�M��V���`'K"�9��X*_zȫ�.�t�DL@!��g�J�.�K�ñ
զ�����.[����e��ϟ?�F$5!e�,v�R䐏�q�Z��n�Q�y=�Jc�y��F�S�ZD	��]Q��0T�8��ظN9�ʩ�I���K�����D
s:%[����*�G�w
	���|Bp�=Rn����@�6�u��.d,��f�_B:Ú��[@�9��"I����U-���ʦA�ܘє�ye��:\�U�dZL��!zϞ�/���i�Ҁ��v7#��1�
��H�
�46$9�,;���9ZFu6}�Df��9`�|��P�	L����B���(R��O5�x�,�j��91�e�#�W�Y�J���ǫE�Oa��Ue-E������<����=�k�%�^��	����v�,�հ�K��ڔz��P`�`�9��A�b���Qf�_�R�j����^�N�i��]����Y�ĹTW~"OU��t7�F���1����DH}ݪ֊~t�؆'�z��)^���������?~⚿P�ٹ.�tWF����C�r��gp��$w�1�d������C6u5��\���<Ó�~	�}@iܲ�E�!垬���+z���n�������#ݝ�-4�*@���-HE�;&��3�h��W���A��8G��3��j�%�ە�k\nSqR�M���@'�ie��.it�l�-��D͌�'~?c�D��0T�ɱ&B���c��m�X.�`K;�1A2ڍR��"fEt���YIĮ�{��*��(	��d$F��x�:�hp�Z�C�VP��Wԕ���<c���	�9�5���Z��% %��t>�}��zZX�

b��4lu�w�����%����f�%����t[K�Ua�=�5��m�(<����ޜj��Gs��׷��߾�M��`^H��+��Pb$��f�8WK�7����a����s��Y=A0%YIt�{~-��H��XWTƥ�9j���Q�O�Z��
��2��0f-��K{h�`*�J�!l�jrޏP�šS
=����TA~�5�l9*��/�����D,g3�f�+���-�E�c�z>kश�t�ݜD�%�=�޾sA]�[l�������{�MD
烽�z�,��Q�$���E4�y�(�5��k�b� 2$yC�\� z�'�������¼����]��uTt����9�a��m��ai�Sj��/g\���
��#��qr�2w��N��X�x��9^��弳�!����c�m
Գk)��p�4�[�gU_4WH=J��*�Yn���v�h�T�Ac�5���И߹d�JU,�3��ҍ��E���멌�
�?�mɷ~�S���ub�ƓA�8��tW�hn�E��)�W:��CN����[�g�^��l��#6�(�F�7�'����"Mr�3Ɍ��D�X��û�hZVˁ����mg������٦�nM��| *4�H?{Nau�Y��������XB�V�g�a8�&�.���Q�T��v �PT�gWW�t�M����������$&�L�u��@o�S�M�=���qG�Nx��캲��/^���a��\o��*�ۺ�}�(�+�4#���ZhB�N�͓?�e�0 ��VD�J�&�N�Z��`�[a�E�e�W�=M��/'{�\��PdʝO^���J.K�L��y���E��y
�K������S����_�p/���@?R�Y��(�eNˇ�񒛿4�
�l�)�~�}�F�c/hd0	ej��#x
Xڌ�p����@ϕ�4
��@�Y
P�����f���f2_^=���a�~/B��`��v߳�y:1�I�o&+��مk�K�@_X�'�8�	��ίf�|��rx��N=52I7�nx��j_�J��S�p{
�|tt׃��?	��OQ�6�x���q���#�QXN���N��
l���r_�M�gV�EWR��W��ʑ�����.�h�v�����N���!Faz��PK��mW�. A�3��setuptools/_distutils/dist.py�}mw����w�
�^�	����+?��q^���'Mv]-D%T$��d�'����̝����{v�ã��0s1/w�3�L�U��j�-𷳳��Z�.�oL�<j�+x���j[v�,���V7Yk���L�s�]�>lM�V�ϮLU_gW�j�Q�]_n�f��kb֋��drvV�M�gݱ��6�֜m�f��]Ym3y�3]W^�%�Yn��9;���Y?��lk�zwf>�̾Ͼ�ǯ۶i��m�]do� �g�bl�Yp�ů7e�:.�M�pi�5>��Ͳ�-�n[�f�m�kxC��ڞ���]���j�z����U�lgY�Y���/��[�{�����u|m���W����7ggO�͵���M�6��6Y�µ)����t��ve����y�e?�T�.�X���|�p�;h��]Vf?�@��/߼����l��y���7��֔kD�C�6m�jZk�M��	V�#�cޚ�δǬ�vնl��0��^J�+�>�/����;X>I�!�����6M��%ȉ3Zg�7-���.��%|�0n���6���?_��e!�<�����g��O���`�Zwha�a��r{0�lS���6�����l#�dy�?O`�x.`:���˪�_a`Yg�e��Ψ+�Fs[a�L��[�
�U�*b{X�2ÑeW��,/`��m�O�̄��b�p@�p������G�@��c'r���=,6������io�=R8w◌ҁ�{�k[��򇦋�.��ݮ��&�_���g���r��g�Msخqx��Ə����o�$�]��ʾ��m�*��"S�N��_࿿����;��4T��q�ߵ�?�l�	���`x��D���l�哜eo�?y~ߴ��ME����T��y_��h|N� ��zh+�q����o�v�y�́�p'�=.]��ͪ�E_gM$�mg�
Nf[�C �5��Lj�.��+@�pt�5�~{��C�ZO�y�<����4=��ym�q@p<�/�u�h�ms���Bb/��������C����<Y�
B�W�u),R����%����v�t���$0���SL
	 �9�2I$��$�n�6V{}���㾁��$FmV��d4 �0"������t�y��'�
|
�)��eFvsmhfnt��s�?��������g*�_o��rk�J
qI�D�D�#�d҆G�+����;�ۊ�-�ޛ}[����G�`���:�\��׋l�������y=A�<�/3�$�jz���(�PX_�LƓ��<�誧7�(f��*� g�v���N	X�
q��#P��D�fvjϓ������a�zc��������|x���*+��Vݔw2PZúo�Ѯ#1���0@@:�=���)��0!W@�a@,4%�v!�����,r�ؕ�&���@�䧓Y�|:S�h߰�?l/z�}��v��a��tt^��9t���*�FD6��j^��n�v��n�l��@R|eEҰS���i��5tC1ӿş������^r��xڎ���
�&�M{���;l��M�<�sB$�G���/�'j<�B��C��"
H���[��o��
r���og��÷��z��9.��>�	_v0�)�ٝ=T	ּ��o���\��gHV��n���~�k�M8�o�LQ���p�L�o�}y]����aS/ؑ��<��n8��N�6��;@�3�u�" �$����mW���;b�_���,�9l�'?�����@�c�<�lݎ��&]b�jNj��`�X���E�7$2���Q�RC�1�։��0��?n\�0���=��fۙ`���������ǿЉ�=
���
�q�C(���q8��Cq�@�8�a���g|����@��?6~$P�ՐI��
�k���(����ڇ�D}�8���7^���׻Lz�C�-��?��`6W]�5��݁�Y�^&X	��O&���g�SB�(D<�1��ߪ��<-`r��j{�1��[�J4�@a�q
�h+��f?r�+P'�� $���П �}9s~��!��d��K��P����.p��8�+f�V����>���gn4&�� d�.����J%�,�iyV��ҤQ�"�
�~O
�-b(,�fJ�>�뚕@"X�����F:A�|"�A�(^��[�\��Ē�v��PY\2�Y]��50u�{�=F���AF�u�P}s��߯S�2��п�"�έ����{�VG�(�����2peS�1��T\��\�$�mV��l;���D��хF�3e��J�b'Ã�rtJ�t�!V��Ȟ�/@_X��q�=_�ԯ���V��]��#;걇:���TO�]���<�I��W��e_f��YAo&���k$^3��d
���x��
_�Mߓ�аnh��p}��T5[�p@Y��7K.��*�y����`�!�������I���_E���1�X9N�+@2���G�9�7��Xk��ͦZUp�~7����B�����<.��&_�*�F����?}��W�?�|�m�����	-��9��N�����z�p��+���4��|�[�I	hZd���e������55p��OQ�^݂�����n`U�~��������n�G_C�b���G���)#_�;b���`т��рLt��" �-\!.���&3{�U<a�'2d��)��
L���M���M��'�Dg�
���)�]��k�ZwC�X���lU�#��H�1��q
tx��RYuH��	 @���^B;5r�)ъ/�����`#�/�S�@1]L�݋Z8���G�:9!�}R�װ��E���<�B�9��^ށԥ�I�}�r�!A��5r	ƭMMx�k�����ee��Yh+�ldeF��Aψ<���y���4S����";&�
��#������vYA��hrrT#��,�rZJ�gvC�h|���k*ê��g:1���Q�5{���z����b���9y�:�ʲh��L�g����@�h��](���~�~K#�R����
��E!�g��;6ef��������F�	-��[�р�oJ8����t�E�8p�&w���Tv�Nk\��z���\�V���a�X��ޓv)��)�+�Д¡�gi�vt�޺%�af99Si���f�RW�
{u�G���Souff5y.�b��pQ�����㉾B:"�7��h��Y@@w�zh5�xd/H	!ꎦd����[�(n�uD<��"y�1�'rYh�P\���+$���wp"����̀��'�rIzU��ad�/�ddy���D��#�.^�����q���6wf���M7&���K����kп�ݏK�Ƨ^o���IG��
l
lg����-;M��j��q��@�(=��]q�������xGD#�K��{�^5��1�+w�a�a�XeNg�9�!�,�$K�"�,������1�
�1�>�w�g�Q}\\���}oP��$���5�u���P�r���"�I��cJ��C�����խ�e<Յ��l$���p_��XD�>�[���h��U����&ʣ�����*U}�������Ȅ7�႖[ "�#�5P$4,ۑ([wh�"�:����1
�����C'!O��T����E����	�i:
q���JAa�h�7�f64-A���$�9�Ú[��X�D�u��Pt�bf1���®h�(a��@,�0���譡�'Q�5��ܫ�j�ґ({��rd��C3Eg:NF%�5�H�����[:M9,�eXd�һU�}��Y��H.t$�F��B�]�]W�l�*G^k���~����#	�j� ���aY�T4~G�/
��}�E ����6�m��UǠ��Av}([@)c�Ñ��:��P-��#� ;�5Y�" �MK���5���G)��Y��DJ�D��[�`4����%YE����6[���4�S�%[PǗ�DT�]��r��7��}�ӂ�Ƣ�)�5|l�O����	�����p������K@1�h<a�g��9G���H�?�r�5viw��<\L���$RΏ!qnH��P��,I�P&�0%8{%�Ƕ\�/E1g���x��yj�-���>�&�'�2���\Ĝ����Q��EX�`�,��0Y��UM�9�ZJ��(�Gj�`����w�Md
p#X8b�z���U����|��c��:�!��?��N!�y���dO)V�)Mh�p\��Q[�2
�$�����Rƪ�C�-�%:*�_[Q�?��h�ã�&��![Զ)�(����dB��.a���(瓠�u��a�Gu�J�F�&�<;Q��9�,
��X[�b.q1/��ڃ	����5JbH�k��	^uJ�::��5P�;Ŋ|�����������9�Ȯ1�N�k\���k��1��cd`�S�����WR�h�q�\d� �
��7�G�	�h�;Y�ԯT��)*��.�*�Cr_a�je>��֖�8B���]�
�=�����P���n�r'����/C�L;��[v{�s�l[.�qkM2�gU�M�_L&jc������سo.8R�h�`���Q�)
-���kР2T$�,���A���O3*�9`��w�DR~y��V���k�
����L(�Df��px~�7��\:;�
W��c�5��%%{/��q|B�2,��t�.s���.�S@��S�� N��||��\O��®Ұ�%���š_t�N���z�����xZ�y.��Ɯ�/����1�$`�%sp����
��ט�Qv��mlSa���|,��m�v ֙@�
�B������J<���:ߧ�����0���z:��0����df"�� d(E'c���\�H��XAT��O�*)(�5ƚB	�<�Sk��Oi���Re����/��^��~�E�t�5u�r�QɄ	[�LghH"��"�d�Tn~�=v�.�0p��u��6*z�Ya�����w_�)W/�yIa�~���ж���ႎ�T�P�0�ec�^�@$����ka�E ~�»����xC�=
�:Aɡ�G�c'���[��|�z�`�y�}�7�\,�.��8�2���h9���Tu!����@��=�AVD�X�/�{S�}�p�J2
�\L<�nNr�a�.�p'��	�$��c�JW��~{�<b�y�7r0[}j�C{���n�?̇=lV�3�S�uȐ�q��$�$�0�*l��%k'�®�#���s;��{?9�?��)R�1���O�O�	/+ܘ��+M��8(��{h�"8�$U!Թ�R0���^��8�Ʀ�x��L��w�@%�P
�ž5 ǿ���0lkɏ�U⤞d��es��e�F|��m�+����.�D=�<z$��S��_�{Q����������?���m`3�"�o�4��L��p��3{�6��h���U��J�I	���ӳ#��cOB�L����6Z
�^�:zY�~��1AJ�,1:<t��ϧ3M�xTlZ�[P������v�'I{��9il-�)!�?`�w��>cp΄��ϊ����s�>�d�:B�q���j77��dx3�66��!�8��e������O�7h�C��Q�c`�N9�DŽD���K��5Z�ԡ!������H�����G�%
?�0�	�'�"�&����70���JFr�L��
>�+�������t��{�r����H��:���%�&��I��H7��Q@96�N��"� H����ٹZ3&�^��ߧu|ܗ�l�#@Ӟ���W�S�җ��4d�m������M�D�Wa����D.�Pѧ�:p��]�d�Qº�uW�|^��\�q���a���J��8�xS�]Z��B���Jx�ì�8�̟g�j[Ρ��:�>���'��a�mGa��
�u	�����
?���@Ë��Aub�B8&�b�ɪ�6�%���\��J^��w�X��ېHˡ�\�a��X�<rP��`h�CǠ��R)d��5��c���J����U�踽�`�ԩ)�ɋA�l��?{,���n�#�ـ8�,Y2;�G��ZH����<4ddA��äj�5�Q4�6ܐ�C���_H��K*Aw��ܳB�J?b�H�J�`��H�!���n��b>�4m��~�_��� '�2���)WU�7P���U����輒O$X/h�<��D�b��ްI�G	EF:�.��"]�edd�g$��Xԣ�)R1�+y�x1YSP���z���>[�W}�[r�VF5>$�36��6q�h�}�H��ƐmO�������p����B��z�Q�5V+����Y�Ԇ[7�܂�t)0���G�-"�r:){�S�Tŵb������ie��N0��b �%���r!6�>x�7�E23����Ň��z&a��b��%Se
h��(U�])�B�9�O�|x�|0��v�j�3�X��Ƙ����C�$�6$��-[���z��
�&�<���l���Q>(���FX��c�ߓ�[���/w,�pՓ,�fxf�Т�OT�!�4!?ub�XL�}��E�i;\f	�Q�EV���3)5o$#GA�O��͉K���[ξ��/����l���X�]���!T�v8Z��&H�H��c��H���%~h�/-������(��{���m��i �k�L�5��=)i����BU��Ǯ�r�牛;�Pt�B��J4E��!���as��v{��00V'���ߡ�$�*8?��Ǥ�5�溦Bj�fF@���Q�D7dq
�g���)X�F"L<�8Q�71��٥�#Y6V��>�,��b�6��b�*%�t�)��&ڬ��.f�?�j[�5逊��ɂm�2E������)�m��06�
1*6�T�Y�J�mf3�<�۸�w����[(&[ף�jZ��m�
���]\^Q�HxS'�w��l��20���.)Z�� hോ5��p�����1��ek��BTT˟��sCu��RP����S#(U7ܜ@�G�m����)n`G���ڠ�ҳ$��%ُ&�=�ڭ�/��m�7)?�}.]vE�:4�B]��F�,[��du�"�R$�9s_��b"Q�AE�P@J.P_�Ns�Ԝ�����~(/󱆵ښ�TR��6L�>e��UT@?��˟�e�8`BY�=X1��f�;3�]Uz1���8oK�
qc*����'m�E���`Z���lZִ(��d|%���U�U+�\NX�`�I��1�E�bUgkyn�f��I<s3}�my�qbN�i���~�~��G�Èw!��E�,%���#�^#	��9�z4��Fy���v�i��������p���]�,�e��l�ɨ����d�i�7�g8���n��ЛR/���Ğ;o�kC���3;���Gu�
������q|\;pc������6_�k�2j�C�Z�eZ�([���&գu�;H��R�zC5L�LO]����`���T.C�R��>�u�4����6Շ�~4K�߁%�����1�>�d��Edg���:������uĝ�DlTk�H��'5+�I�GtL/�)�O��S��$�iҚ���i�a���x�u��>S!����\�V5����ڋg�{�F3._;��3������<�^�K�e��������<�?�XM��b���Sܟ!=�'˲�ŖL�*-�C�Q�=Op��W�섭(QX�b":
�)��e�.�&0\��%凃Nt�ҵuPij��
�o�-E��ѻH�A��T��Ca+i�P��o`	�
K�d>���/���"� ڎrҜI`�W44Ҽ3=7ӥ�l4�]_�UOzjQ%A��D��G"�I��Ȫ�����e�Fb�Uͽ�^�������a$��
L��g4��V������#�{��-p-���-��^���a��H�&W�8A!�_BCPȒ/����Գ�����w�K������<�;�jG�ҩ���"�PV'u���?��e�i�
W����(k�n���=�t��xߠc�>x+R�*�	��R��:���+��w��=
X"���t	A�/���AG��L^mȟ�oe#�Xj<�����b�%U!��,lkQu�Et�jG�����=�†*�!����p[��֜
�<���]��E(W�zL�HԪ1�%zCF2w�%�"o�}S�"��8ܓ�sR����<4$|�bb�EAڑ}:Ih$"1��Ҍ��G��u	�(q�GZ^w�ǽa�Cۮ�۴�
n�WNŸ4n�~��P픓��+&��O����	����~���v)�ڇ#�>�x>~p���{�$Y2<� �#G��<�T�#�.�3#��G9$�%^�fG^C���D�p�}��;��-�iaT�m�%E�%��&�c��oN���r
���8����!:�FmmOts�"ΘS�9�=�ɒ�]{=��0M�r�M@Ɏ�K���Z��x-7M�7M����Xj6���i�2M���a�mP�a���ID��e��G�Zr��2KTsj�=s�q��o���6�<}3��p�vw[|����U�+Hn�DקXb�Bbp��g��T#=�c]UI�c„	fA�\8|RT�;�%4���;.��9vMc|���e�2m�$�I�k\#ra�ӡ��PW\��<�ފӓ��o��C�A1u���I���b�N�����i�L:[c�5U�[S_�7Q�ѼeR���)�@ۺ�NR�VU�2�)Ј��K!�,@�
��� �x-�@,���m��4��)��x�*��L(Qw�(�ԳPFa��K�>S�莃�u<rWaM'����u�eO�u�$�~��Z�L��rF�w��
�
b��]m�t�G�.)�x����It�͂XWt[
['(����9�;�G���/N�X����GR��}MH�R\��*e� 8sä&���NL�:��F_}�>/"���m*������bh>}��M��7�h�}%�"��8c
98�\�f��80?��ta#;2�qpň������phЈ����|��b�S�Z
��?�w���p'E����<AWBZ86���áy���z�8"���c��2^^��&���O�ǐ'E�<}�8���m>�<
�R�8� O�!KO�W6E�#�l��@�ߔ��w3g���9�����SPt6T\��Z�n�?ugT����O�����@>������/ݭ���^$�,׊�n��G�qJbl�������<D��y(�����sK�oj�]{����KS9���Y��{�7p���T[^+��|��D�~��d@+&���Ii�5͋g�T�ӌC`nU�S�z��Y>'
U�̀����}�R=K�s�&'��a�T_o�߇�kOV�tZ�W���2I�.ӋAGߞ5LȎ*�۬*���{[��J��]vJyy�I,Jg���A�1��޻뤬���|�!�{���v���A��'q{�1�CB8�|�ߨK��?Fy�:FX���X�ʫ��wE��>�Z޸5fRc.�Bd��	N0��[����l,�	mp ����^E�4wS��n!J��h��l/+_<̋�KN��B}xh�5��G�t��&�Z����"'��!k����Ԝ���?�4��*����A��T���?a��m��HD�S%�I���ǁQvꢳ��������MN,H{Hu�{!I�I�ߋ���=�E'ǔ"�o�U���97RB/P�S��Q\�
N�(n���L�X�N}�K�Kz'|F���.���R�r{���hzV`�n�*�H��	
i�CW��2�3�D�]��z��'��

X
���@�[������(K<�"��)�����"̢v�7����JG.!�\HNI�!S��~p�,�l���.�a��N��|�+�uV����q�e�\}n9�`�s��a�]·/}�	�;S������÷�4k^�a,���J���42㏿jdW���J?s݁�AZ�����i�n������BM��H�$m�t#�mJ#�$;���m��K�W�KvpS}Vt뵿+�LB�t��-�kU:UhC��w����[�i�"],�;������:����`)��G��f��c��R�.ҩ����t���"yh����M:��*`����Ǖb��{(�G�#��荁���<�$���s\�����,!F�˨5'�����<��7GX"W�Y<Kʯ	���.�Gm�%�J�$�����P��]�� �\�x1�<�Q�s��gXc5�Y^����D����s�_�O�K;yܧ]�����$�:�Swş�Y7��W��iwj-��rqwpi�,��z�鍦Mn
��#��=�2���'-}��n��G1^<�U�S7J~�x�8�e�*��J9E�aJh�X�e�.�\;���x(V4[�rz���
ɇ�q$��n/� Hr���-wcJ���2D\F"�H��	|T�݉�6�ûX�l�*��c���0��V�j��N,��G���R�#����n���^��է�>($�W�&Ĝ - �8/�hLu�9�dj�W*r�lfm�Wj��1��B�(�`m@�iU�?h��_��[�����-�(�3��)�<����pK4���V�p�z�RS��C��Z?3�c�
��o��
T+Q�Hj3�T��J}L�H�}Gܻ���x50@�OZ�L5I)�x��2ې�����[:�4u�"i���n{)�9L�����Ҧ�E����Pm�zX�^*ٍVI�T�]E�_�R\"�;j*y�ވsKj s:O"
n������y��q=����ۯ�WS�G�Pc����uX[��X�`d쩴���l��A�1��"��&��VUN���o�O��������n�ʉ|r�0�땝�c|��'|Y_5Tސ�Z�W�;�E�v}
.aš�\��c��	�\��I�˘ Qu1��[����FB����y�9�c�;����1u�F]sAq{}�)��-i�9)�It���\�����8�[�!�A*��"���G3�kXA�-{��k��_�l+~�J$�݅F֮d!��cbA�v�R�?�剌�#�g�~1�Mh
O{.B�* y|
����PV/�Ҋ�x�bB&K��94�H���+>z�qn�B��C�x����q�T/�W�muՖmu�k�v��1��M���3����Z����I8`y���"r
�4	!��D��Oߋ���V!\�<]�,�6��Ǖb����5�L#��� ���4�#(h��"e![#R01��K�b"/=(�.1��of��D�܊LWʣZ
ܠ�#:#Єެ�]UT[��_�Ղj� /þ���I�Pk�q�U��B6��l�{P3XgJ��mF�|��6ʤ���n��h8<��<�J
��LP�lH������_�y�ӷ�����w�߾|��l@X@�'
eX���ٕ�T@��xi��n�/�5����P16U1_�'U���`l�vt�2��B�sEG?l�I@��O@%�� ��cU�L�I�����?��߲��k�m�w�Os�������VR�obo�n��n?E�c����
P�{MO�\�H;|i�Z��gl{�5o�h#�z�h�,���w�������b�6�H=�_�6�Ba�J��QYb��V8ۢ�h�붅2�jddԎ��#3j���ZmA�0Œ��l.�'Y8Kl���EC�Eܮ�Z�H1��~��*�െ?�����y���[g�,)"5*��Tǣ��Sۭ��!Ґc��|�H/|��T��݊�?��8�}n�u�(RMF�z�,�T6hj�F�ã����Q�xbK�lI�dꄑ����[H~�a�>�h\�ލ�M�4E��xC�|���-ho��f��s��Ŏ��	  �3)RM`H\��ČO��`�.=w|]ש���s�yW��e�������A�K!��\����$�,8���z���
�
��I�‘=�Y�L�r,%��MLNt�<D�Qy�!փ|�AN7���۪7��ȸœ�.�\WQ݉_�)q����-��Zdq�fkJtq�f$��FIt.���=˂ƫf�dv��A��w������?`ݓ.�3H,��"�P�r�Z���<�\G�X;�B�ѓK����\#on�5P���nF1qn���^�<�X��y���a6�~En5�_�5�d��:Ϟ���d���"}S��f��2����4�t�wL	��e;��dc�^L�e�t?�㽙s���s�Dwቺ���j<��H
�W�����_"�"i�07@�v��×_.�ro���"�76��|�m�Y}S10WZ�};��>���m�m�'f�K�D���f~7��C�ʳCB��b�b���U��P-iy̸~��7����c����HY��ޞϬ��z}�5�8)@i���}��5(/�ܲh�ԝ��ڲ~Q�&awK�N@p7s�g�_�ڙF`L�vsɞ���,Izج��URFg����21����)��1��@�kYã���uy�G�cV��	�w�����6r�WR��B?�Y�)���W2>ޘi�x��u��8���c�wqK�<��~'�M��Ū�pl�_��Wqtn��0CP#�t��@U���[<1�H��2�22�H�M
TW����Ŧ�X��C�	���	�Z��W �?���4�p��bLJC6<�}!"��Aq	J����FNa�Ү�E������l/�
�_�֌L3<h���)�������׉�Қ�`�B�?"�6{X�5ޣB�6Cʹ@_55|���ۜ/J	�r�Wi㻸<��ۚ���6v����xVS�*�흤�om��;J��`�KjQ���g�W��^nÐ
W��PK��mW�n���
setuptools/_distutils/errors.py�WMs�6��W��r"���N�3m㩝��K	5	p�a���o$%DZ��dد������2!�h��%��ŭw����詤.g�J�*U�*H�:Z��U���U�/	�:�Néju��6�T��V�Wg�?*cU�}4ej�_��>Djo�LT&,RH�i�J�Ϋ�f�=)W<�B��#[m����֩���Е*]�"��1�`�O-�.������ �
�F-�k�䖵w��n�ʴ��Q�[�eB�Q9������"�m����`ju��Q2L�&�r�f���:�pI��r�\,�F�pBQ���f���B�W�Q�w9�
��B��g|���^��b��c�|��h��?m�P*#x�`��q\��X����҈��+�^F1	4�@ΛU�ϙ"�8�"ۯp�s!�ܱ��)c����P�;K�&�ZYBe�6���hz�©]BJp� upMe�^��r	�9�b�Р6�H���3Z�p5�2�46��uIo��E��xXDN�������J/jm�߽8Z]^p��ۧ�v�k����w�f̓��l�B�� ��_�XR��भ���p�����NA�g��df�m{F��aS�,�p�pR:ƅ���Xn��}ߙRFW��"��'�2���*�p����;�C�.5�(���K�,εBo�.�wW�~g)*A�b@�T�����6�<�Kg�Ɣ"��@�I@xy:S�߄���=�&Q�h��.���g����Dv�#^�"���Z����Pz��U�%c�;Qx�t� asЏ��]b������˻��y�����d^�=��p^u	w|�f�+��3T����O_��÷`1a�H`�h�}��7�'#��SS���yڋ�b��;��FGȷ�I�$��ET-f�CT�㡟��,�n�V�%ov�l�af�L&��{v���C���.k���)
wqH��<��������H�<Q�#��p?��e{b�[����k�=�Ġ송���d�?�~(ifa�ns���k�\i<y��D�ȟV��k-�.�� ���#�+XH��C_V�ʂ���O3)�S��
l�mO����dnp]��7�W���������������ly�Z>ih����t����kW`���|vVk|��+��!�4���G8&0M^6n7٠7��ny-�v��g��G8��܏��\�%��)~��'��#\���k�7��_�t�X����<�}�����W��6���[��Z��b�S��~�����~�G�:��c&2���)��~�}���PK��mW]�4:%
)"setuptools/_distutils/extension.py�Zmo�F��_�G�0��Lӏj�C�m�9m�$��!�ȕ�g��rI�:܏�gfw�"Qv��N@"�ܝ�yff�(�rm�օM�c�J�M9��\��++�߅�"+��3�X���,�*�T����˗�ۿ5yS`�.�Uu��nW�$���Dow������^V�.�v2�6�:>?*%�� L�����"E�F�#���V��LX#t-�z��Ah+���V���������oLZZ�ߛ�zP�\$SaMHY@�� �z-Ti��f&�[���eM<�c��/��J���
�H�,�.������'�J���ʘ��Z
�N�hʬrBKUת��Lu�mTvӹ�X(dV7l3�E�4�\`ӛš���,#�w��b�di)8M�MS�b#Ȑ��F����Z�M9�e�+��ŁlX��&���A�T9Ԡ(2P���u2�8ӵ!7�|6�hl
�f�(@��Ѭ��k�_Ss�B���}�G"��#3���O�J�.��"���Ԫ!�DR��rY(���P)+Pÿ�1��}�jq0
\$�M���'npSzW�Z�����t������_��=�aOb��P�n�:� lV49)k��������Z%-���_@��.�#Tam���N��aX77������4U�sq�D�k�p0�䖴��*d�9tX`
V�<XS�4�=��
¯�n;%���R?����"��͵U;YI�9mɬH!��.t}@J�����f&�X3�wq������k�S�^�:��Nఇ�)��*�r@��u�����y��x$AL����r>U�ԓvw)g*M��Q��6L�!��a�	boɾɶ�v��J�j��YeX�x�3� ����Ϗ�T�S�~�D�+�$$��d>w7�s�/����㊹]��)]�0�8e1.�IC��t��nBDP��H�u����OU��х��y��OW6�A����P�\��0���U����E��z=���d���V����N��e%�ß�G�����^Ժ����$�1�L�c씘3y����TMI��u@��
���
�;�2��|U�j�\�na�B-��Q%f�/�񤨼�'^P�bQ�N�#��͸3bȕ��+485�4km�5gKuqُ
�K�]�,uI;��L�Y2Tɇ�u}T/�-N�'�����PS��T2�S[�O���p��WnMZ��o)~<7��yW��!�'\�
�u=`����wH��[~�5mGq_7[��uu���0�t�H2�:;�^/ӷ+9��`TbC&Vm�ʁ���Z�wl���h�H�+�s�B���R�J�Uo5����>v�̑ծNC몳��=l��x���K�WS~2xU�-D=�g�c���ف$B�Ժ��vkU��c�T:K�B�;�[*}��o40�&'�$���
��x."]j���t���v���Ǔ.D��$ࡆZe|s�Wd�.�б��-ѧ��\�T�?iwC�5è	{[�\7h:O{�nS�&։J�����|I_ZL:��M�K�q�0����{h���'G��ܚ���d���qZb%�n�O+�����k����D\��
@]��N����Cu���ҁޑ+x0��7Jd��V>`��i���u�P����,	KP�ˑ��7Ћ{u�c�b<��S�c�vB,��ElU��	�{���F�鷢)�Uc����U���~/��"��슱����AUfU͞Y�b��(xvY��8����&�	xvAH��^��ߟޥυ���!kcSޗf_���t��O^m��c�u�[E�Jj�[o�UI����-�j[!��'�s�{,B�3�MmE� g�;�D\�	�N?M�����lk�k!pOH˄g��?��aO��ǃ�1����n�|8�GC�Ȇ��G��僾>N-g�kխ�jt��ܐ��#ۇM|z�ԟ�0h�ӱ���֮LO���M��(=�F��!��=�sW�Ӯ��x"T�ōႶ��-nt!|!ޭzeG���RMu�j�~�b���S�b�c�J�m�vU�]n�ߔ����3�0M]%�2�P�	 ��v���G/zw��ť��e��
��	��A�g���$���=�@��W__���Ɨ@�&���\�K<��X,��t��/wĹX̞^�{#B�х���:wBB�	�N���`Pk�1���t������F���;�Y�{��^w\l��J�ás���%d�WDwF���������t<���k����QV2���o�?>ZL��u�x
C�^}O�(T���<��+���m-y>�~}����7?|�.��d����ϵm�M��?0z�`���fIG��q�*�C����dΒi&�$����7"Iq���2Ċ���V�� �҃��v�!���f�����#e��ר�������%%���(������p)]W�.�z�CJ�כ�I�U��x�')�P�u<�
�+>]�ܜ͏ŻʬN_��1�~h&[j�b>B�;:���d�!��̶�U`'L��l�dL��/�D���ׯ�w�"��a�ˢ�K�1.x��
BTM`�?�|Noױ4f�g�Cjn�IY��3�}!~�[�&��$[��A�e�^�P�J$롬�#M�n�3E~D�ϑz�$悊��׶�����q��#jN-BD��94 ���R��&B�so�J0V��~sbUl��#ۦ����ʐ(�`�h�΁�H��Aߥj�bX�+��9a4x
�xԂ}�VϐmCo������uw�͐�u~�8w�^��NC��@��i�����q�#q7b�}�O�<�v<��c��J?R�d:O8�A�q�}}w�e�i�r��b��ʿ��ߝr�Y<3�/�>tI2��۹��G��c���M��v!6��,���ǥ��Ūk�năM�M[S�z��[(�q�U*����&�H��E�!}��T�|���<�gU�ռ�����F 1P�X�,���~{�.�isL(�D��Q�G$h����~�֞���;�7T��0��=�3�BN���t\zzR�X'A�r���(k�S��;��Ǒp^"MFT8���'|�z?��7Q�C��-�f&�z冎pu���2�Ξ���
����j�óD(S~y����)�|��0���?��96���_U�����Y����ҏ��}�<�#��������5N���hP%W8k�W�_�"?�����2�m�J�z�j
��l��I]�/���*���v<:�"p��>Cb#snk�ݐZ��ʽ��kz�ßo�W�y�d��	BR8a�O�)�[|�g���}}���F����}�!h���>�3}g����O�%����|��X���?p�L�PK��mW�1ƲxE%setuptools/_distutils/fancy_getopt.py�<�s�6���@�L$�����U;����1I��9�WC��Ě$T�������I�N��4Mc������L��4�uSg�^l�29�w�V�z2���Y��RM��z/���2��T�Q���%<�kq��}�JM�*��1+w�8M�:Se����릒z9��{U��\�;�`���^&�<��eE���}|/�^�@��z&�.�"QM����eYgq���I�K���K����(j�"�N�!Z^5��45У���k-�yV
��E&�d:�N&Yq@"�	� �f���k��m�
�1YV���0k�O&�&ً<���],Y�nS�*9�f�Q�$W�� (JU�_����d@'0R�x���߿���b>�C"�ӺCVe5RW(]�o��O����$�sDI��q��D��`,��{��ͻ��{�V�,@�<+�<�bK��|�] q�GV&�7e"��u��>�F�D����^��6�ri~�����y�K ���l�˰
�y���K����_�
&jWf���Ĵ����E�g��Z
�	�[�)pU֫g�����X����#��/u�z����N��g��{#H`0*�����9*�g�$�;�_���8�Wu��d�R��PN(qOg�=`e�:�~�SV���"��trB��d�$M_�E}C��$�u���a��D���a�	T�ۦL�5d����H�p����H�ĥ� ��,6�L
!�Df1��$_`7m��%�a7�y�TO�$�$(Y�m���I�P/��C������d)�fϴ�ظ��,%ҠE`v�U�8���uB?�r+����:�2���:^��W����9l�B�
�;L����O�)��X�
x\
^�8�kQ�'f�+��UM%���0a�
��58ciC	�Y��=��=�t902�]١|g��q�k
@�"p�9�HB�����vP�2����n���Q��;`L���8�e5�'��
�(.O�)Z�ޠz�8�J�2�	t��^}Pe�����c)�%g���	$N���Y��-��W-����NX�y��>�[�څ*J�S��F����'tP����ս�3��8bt  ����� ��z�֛&�SF1d�E�*EO�}Ći��W�U*X�`W��W�2w>��h%�u�}�|�}:�!�`����r'%�ir�V�
t��,���#9`��4d]�@_��:��8@���XtH�Y	tA�B!{2eI�
�亁T���}4��A�vh(F���I(k
��Ғh�l�H�8����u~st~34„�\�ƍ#����L�����@�R�s�#���v��!�nn��֘Ǟ�Ɨd���@�Y���<#��5��k�L�TV*�6�!ډ��v��spy�FמoVU�#z	��^a̱?�n:��f��T������m����0DŽEH��dܪbb�\{��N�x�E�P�]D@�3�	ly�p���/7W����0���v��D�3���Uoᘗ�3��2g���FL
�^��wp�n���S�X��l�©�߱�	�u��� �m�%��M�����&�7xt������]��&
�Y������1m�C�pN2�!{+�ׁ9U�D�}'�,U���*�,�n��zϱ�H�,0�k���=&����3=F���f%���iP�ZD�K���
����`�O����.�d�U�T�Z?B���z�cc�d/�;S������:B�u��!�”>+�VJdخ�ݾ3�g�%"Jy��u����w�f),c��}��m4�f%��,��,o)�#v˒u�Nƀ�O�����W��6�?���T<}D�;u#W�ҿ�
��,�,�ˆ�i"{��f$�i�/�)���m-����H���sط{IiWnĤ�X�W'��0��;.�~Y+�/��N����L��(�#�.h�$�O�O�lPx�8?Ȋ�/_����0�9�����U�-R�^�̗RzN��6�V�w6��*�dosr�2	����aO"UXt�\�"�z�g���#���S�AFϹd拾��a�"K��j%^
]	"`rN�`�_�bt�=���?>�Yp�a:���a���_�R+Q���Ί��t�L"
ʨ�D=��>�f�-��k�[�n�R\V��4)U��|��A�;���������eG᠋��uaS���D�/��'7y,R]��J�d����J��HA�L�d�HGr�̦�H?*t(6�B$S�h��HŮ�(�(�[�݊�i��V(��8��;&L��-u����օ�{�������V����8��r@�~������k�ُ)���%�?X��-��O��7m �6аŋoД��-F���94m/)�!8�A&�`F#�k�f�h�	�|�Yc�ގo���U���o���i��=�eb��s�3k9�w���+=�4�م���NR�PbP�gOյ���}�m��ޢ-y�G膂�SCd�e��l�r���Ձ���
���}
{H���TC�b���>R�>M�Zs�*+Uj������dT�B ք��W���H�̥�C�U��QHl�&�}�F��m�kv�3��$�_+��<�V~�NE?�Ft�;������~
�S��Xl'�����\�{�-ޞ��Y�&��Ƣ�{�o����d�Z�Q�lK7���?yC�s�nBR6ņ~0=
`_~��g~Ǹu�߲5H���K�m�6��Ք��Џ�=�_xM$,KL	]��G�^�[�X$Qk��/���b�^�w58�[p{C����2��M�0�A����g2��u:�>����zy��\W�2�@�	�p)��B�oMQt):���;SVU�������r�
!Q�-BD~��ݡ�W����Jqh �9zGQW*��=�Y�9n��<���^��[��DN�Z����R� ƖY��"^�	lk��Q
��x9�a`X	��KOV•����4��<[�2}eg٦�v����0����n�{m�a���q��D��Ee�Kv�ò�N�渞Y���F�N��^����i~�n�1&��B��
x]��g��hP��P�Q��s=�@/��7�)T�! _���+s�	�����BP׷~�?���"�����K��|XM�����ضy�˗�h�4D��;='g9#?I��\E]��TF*�%�����[0	�S	g�e����c@���){N���5�j��' �dژ���w:0#��lj]��s;�PX���i�o=oj����b�����G�X�y$i�7H��S�����ᄛ��qmh��2W�~��G��et�kӈ�Z�MZ��I��=h���5�1okL��j�R��p�M���CJ��X�m��Dv��P)��ۧ=T�ڻUS�$es!z�E���[r(��Ά9��mo#%�!�zO�>%�w�q���{|8}���C��Ճ�]������Aj���a�H��Y��݈Y;��)�f��P��8ձR5��'ng��\�:�m9����
A	n�fS�Ѧ�N�t����oN∶�E^:��%�����⤚�z|�aD�h�kB_gp��%���YP���)l#Sm��X-X�fo�yӏ�ƛ>��3�K0�8��dC'�6|kx�[�{���8;@�B�����:�C4w��������ppxH�ڼ�V��,���/ ɰ�J�Ƣ��i���5^�]�U�7�u:d�&l.�\%w�<u�y�Uܟ���4�$��+��*�
^P�#y�v@���m���s���qA!�/��9}��{��2�i�8%�h����7�>����+:��jf�]��=�di|��0���$�X�R��9'F�Ik���R�P�:`�6�#��t�P��� R8�FO�	¬����P.A-�hXp%*o
pYp��7�u��h����z,y�Om�vv�D�����l�y�e���^��K�k�{$=ހ�����vbYOu��f��l3f��,�d?p��
�N�a�Rm����(dӌz0��ݮhfe�/`ė��g?v�l�`�Л�q_��veD
:�C���jv{��R7�L����vW�o���|�Q�G�n�ϟu�' �~�,�w~�]��vk�Ψ���ޢlk�^�!�W�vad���K��X4���n?�U����(YY�[��!_wl��07����_Ő�]/q���%�
��!R�9϶`ѱ>���SE���f�4�^�r�\q���ظ��a!!V���s'���ę�Ktjf��e��r�W��ϛT�ci��d�:�~��	
Tq+1�0��Ѵ�ڟi�~:�Gwx��m-r���A�Z�=�P
A�;x�r���‰*v��||[e�2�ϔ3���lƯǵ��poQשr�9����u~2��FCh�c���!n}!��(���Lu��FSmjg���e�o(i
p3�rk�=rV,F��\����l�����n��������y�1�EbIn�c�"�P��8�r
{�3ŝ�����4�1��/]r��:���_�~`���h"�=�2#�WM^g�No�'8�B�[q)�81��`r�v�v�)AyԦ������[.�ꕁf��L��F�/+�m���L���ϓ�8'f����n�Պ��$����N�Ff�U��3�z�n��/���;5�[,c!���@��d94i
���3��5i�5�.��{4�7(���o���2�|8�ïF���*6��q2�BǏ(1�*?Coُ��tpV�<�X��ӿ6R��7;�b�5H�:�7p��+��9?)?��q@��a�e�
�m
�<Ȟ�<�p!�JDTYz����я�V�hf�̅l�_��C-����M%�N��U�3�]�y�WT!��0�=�e~aG�]ա;��AR~�^Sf��#V=0�!t ��B"��ͨ��|n����o�2�w���`�Ѵ�O�]��&���{V� �$p#�׮A�j׳��UЈy,�
�oZ��x�o��$�R�!��I�������gݚ�7�޼���h8���S0�A��E���E}���m�c�yu�����a״�03W�9���'���T�
���TA��,���#Z��\�ϣ(.��cm�'®9��+~�˼���=�$����bc�q��;z!>�
�ԏ�#�w<���yuݹ�m��?�ĝ^�'��]8�Wy:6c@0̽|�ь6�9���/Q��ͭ�������~_�g@���y�O�vڠ�d��^d��?,@��jS�W��ύouZ�g<�
�͐6��zM3��ug�z=]�y���*����d�F�*�eHB�@��8�*�����[���z�mn�H!UiJ/\b�u:�'��;UHl��N|���7������P�������˳7�����"jE�9";�뫙x	^��?^9Ң
"���}�b-s���!ogs�Q�_M�PK��mW�È
�"setuptools/_distutils/file_util.py�Ymo���_��V��JR��MgI�Kr
p
j��x^-�H����3Cr_$9v���Z���=�p��i��o���b�+uI�����~'Vm]xmj'V�
�(+�������w�Mr��t:�L�1��&+k6����5։��e��=澢G{���\M&'����7�.�S´�i�е�
��.I�Y�M.��d�Ź��xcju&D	�|"�?�Z�2;ߢ��m�n�q��4�.dU�	�?�ɤT+q٩��ګڻ���\���Ų]���t�_���?~��?�g��7�~L�ul�	oD���S�4~-6��bF�r��	�3ˁ�j2�Ґdy�\X%K���f�s�n�fæE0Pj�:t�z)�ڱ��4$G붾v¬D6�bƂ�;����8���x��:��7FH��4��md�H���K�]�;�&�d#�6��ꪭ�M����'�70Jأ[��bc�� ��yH^^Ziw�/�0T�P�����<eUX��TeXl�!�(��oXm����Y9�����]fy7D}.��'�x>;�_f�´U)j�Y��8D�7DXI-����<�tB�
)�h�_/�g�u3�'/z�2�hk
}�0z|�.���ô��`����W�-rj�����	</�~'Q}�v���
��k*�m���
dvDѵ���
2�
�k�=#�>�B���l
"�'w�����z�h���yY��_v.�k���a
��1�(*`�,��%KJ7��G�u���7���3��50��M��<�|���T��	~itiw����큗<](��pI�^�*����\��:��ת�Vqm�X'�
C����\h��� ��.V�',
Ս'luU��5@��a��˕�<�:�W1(bF2#���n�����]C�U
0��v���R����k��dS ̕i�*U�ւ1����g�Ө`�"K���˾�[%�?�fzEF�^,��ʢ���Ǝ�G~lUUE����֘Gg�ݨa�e7Y'G�R);���6��>pt��JX�v����E`&�5f��δWy�DG�@.Ht��:���g,���v�k�P��,��3ᔧ��)����)fL��ںS�2a��LF$�d�̳Ш>����8ڡgYe�6Ly�?�Y6�(֪�&5xÃ
NR�K�p�����
)pF�C��]��
&tb)!��z�����j��kY�n�:�r<�`�71�hv�'���€@��!K��T&�q�QNvt]�AdDu~T��5�ܷ
��L:I�>�F�a��fW��^�����	��ܘ�5B�T���ⱕ)G �T�Y�Z�K�
�C��ژ��|��~��1	'u5��dE���V����J,5m`�K��7Ɍ���a��pcP��f�5�mS�|� y!�8�0�ݚ�
!�k`[���A/8e��m�X�D����ĶƮ؄��6�����b���g�x$�H��ά<o�b��������*�U�D����O���ע����7��<�����G��_�x�՜�^�Wo_���]�5"�I�Z���v}_�1-$�ʍ@1Re51ɶuG�Ah�N�^����H�����bt$���R:[�R�(�rj_d�_<����Qp{��g�w�%Q��?;���	.۫ٔiv�
�0�j��9��#c:6�<�J�ڣ�و_v�	ó��)?�Mn�w�c��;�'Y��G���t)n�;��7�٫v��"�1Luf:���G;_����q'�M�+3��R�;}F�u��f����Ƚ��1�x,�g��8<!�J�6���Q$T�e����(@��C�T>�3�y���g��I���	�ft���pK>�J!�*Y5
=@7;�AsL��D]G|<�g��uo���>�<��OA��< 	�#��K&����3�UרBc�E�3f6�u��`õh�o��8
�����$b���H�x�O辽�z�x�;n	㷩S!x�OA��Q�E>5�#���ufJ&��~t���5�[��X[�c��PV�[�~۩���z	J�(
c�xp�Rޠ��p�����Z/��z�<%�`�#�C��,Z*T@�{
u0n��z�
o�\?�~O�裰�`��	�?!����<?*�r 1(�#�G�t�)�cxh�2����
x%�(�O9aVhONO�y ��$d̵���q�1ЈC�o�s�������>_C�ԝG
��=���C�WC��wu詵�P�n�Bl֏��EKQu��S!r��||��NKu�����\�[z?1n���?P�\��%ϟ?�t�}�:$�ם ��50��D�e����iq�����{�."sI@z%�6�_�7#�$3F�y>y�G����E�8z��x����`~5n���=���g>�ۀ���f��Lv
9�5��{	Fv�Xa}�{P��x
:���\l���P�Q7��vC���x��嫟ƥ�W�N��@���|dƒC���t��?v*�*h��qတ��;F�Ý�_2�хƋ��n�pjG�����r�|^�����73L'U�~:2t�9�
�c������#�3�yǕ��
�L��p)�- �!�O ��>K"2�ԯ����-��c9
�l�]t��6���o|��J/�z=��i~����Dzu��;؏o3x����7���PK��mW��%4_4!setuptools/_distutils/filelist.py�Zm�۶��_�憔���if:�XN��I=Mb�_&�9_5	I�A�����ww�)��N�T�9��b�x����a.MUWR��B*��m0x�˭̅a�J��hf��ƌYmD��f��VK��e]%20{S���9��R�H�L
+�`2���\oJ]��'-�ӢX�*[5�u�Ue��`��嚵�_樲��
]�6�Zu�֥6��o'��+�?���E%t��wxy&�\��A�j�������̘���|�ʂ���*5�C�2x����x��F�v˵,k�`v(h�d���y@O`��d@�^��E&k9�+a�h��=V�Mq����	��J��`������j^.	W��V�35H+�dm�J��ޑa�5ħ�k2��E��Θ0��\�y!75j+wL��
Ϭu�Jt���\hLZ�J�R)&0�j��ˋ}�ÎGfm'3�:���b�f3Y�j6K�P�1�q]L*1���z9�@��ZFW
�3&�E�A'zY�a���7�1̶b�BlP�k�9�n�un8C��\*Y�2���29��\ߴ�0���Nn&�5�˻������Դ4P&<���B��W���6ˀ��5~d	�'���rT�\�7-U9�=�߳�/�6|l�<���w/x;�t��J]�t3>Wb��/�?�5�U @k*q�!ٛ��J��ډ��N'h8c�(��D]��<��Q�CEB��kc�##�������=�ގ�R�S�Α=�.�AZfŝ�z$}Բ�7�s�Վ
"O�|���`��p3p�V����6Ѓ �YU��3YtF��������E���4jT�
�)[K�	�x!0������b]n�,B�)�[cj�r�V�!
ǣh^��y�)��4��]�'c�Ř]<�3��`���M�Q����X�U���~���Uny�g��6b�)fJ™>��Ja�=l��N[�rk�SKu�����/tS�)���5�:�cإ�,2U�"�Dܹ����/�!�"��Z|�>ԨxĞ�/��j.�8�e�G�&簊Bn�o�S7�'Ϛ�/���d2d�n��8��h]��P��Q�򓫛֑ ߋ�����FnE�H�@P��Y@x���X�A�@�|2�_ދ�R�E��mt]������XfHb���~����:��PF�"�+�.n�rWx�P�P���U
�ø�%�P�`i��2�<$����(Q�OW������@�����h�\U���sX �$�d�،{Li��:
%�R	�1�$��`�v|��)�$��Whc;�^V��3�箭�>�JL-����Jg��V��q���a�IM�7���?
5ЦD�s��e��4$y��1�;,m�r@~^�@ �\ɜd�ߊ(�;;�>�HM�S�q�T!��־N� (��*'/��Ȱ�X�`�mV��H���?��%6)i����n�k<U?��(T��hn�
�M7[�z��&�J�	7���L���+�%�U��t,�ȩ����;/��ȉ����b���!��t�b�6Zl�zW{�������!�G�`��kNA��q����!{�O#U�#8ʎUm�z�C-6&���#�=n�
�'q&mX
���
����Jz=ع����/KJ���}N�E,��4�S	k��E�Xnj��^3��h�!����MDm<�҄��������֣^yR���<����)
�b�d|D*
�Q�Ю����͆C��I�����Ԧ_������` ���е�O�!��>$��԰������1:z9Ά�
�H����A�T����w���%�wl��kZ���%�
�sifZ,�]���÷4m�K�R�d�5��}{�1�;�I��Pe��!h���	�����T{(�wR��r1�$c�E���N�v,��o��l�k@��PK	���'���S���˼VP.'����C�M�+���lD&�:�V\�BC%h����4��
+?��닆�-Uap��7+��p�_��TXYR����T��;���^�,��ܙ����!�y�^���~�r9�0�,���y�*0\x�u���v�@�.up�B:%���'����Yb��Kj�s�.�\c��h���,8�ǘ͡�w����<�RG�椧Ӻ�h�T\W�T�~m/+�=0��^GA'A���2������vB���q(u<G{�cO��Ft&潩QѸ�@��g��y��zyiׅ���X��p'0��,*.:�c4,nv�`[��濢#_\�jQi^��͈�B��AZh�����r����*7���a>�@��_y�[��3�������X��NĄ�}��d��v�9�:c����!sx��f{���;/�o�ߴg8�̮S;dw�	�<jG�S�p�9	:�m�]�g�Vڭ��V�Iǽ9���*998ds�I�$<�?}i���p��{aF�nJ�X!�޶q �\g��X�`�!QV�u:�':$;L�M���P�'��ڃ����7t���56X^mp�GW��o���|�\.�v�4�f#\�� R�o�V�RB��ӊ�˅���,��_q�?�9;�/9g3�{�I/��	��SҾE��%:����u��v)>ҡg�;��{Q�A�Jg�\�J��P:�\��;I�wxUH��1h��$�C.u!��6f����tG��W�4��T�S��5S�����Ue�}���}�1�AQb��v( ��	
�nE�h�;~n���=vN^V�{�F��`�`U�n+!���ߣ������b�oK��i���0;�������t��������	!����^^JHY�W_}�׿L"A��h���Y�BH��[��t��
/N�Nd��0�epq�]��^Z`P�\�]�!�=D����8�R[�R����E�)�B��BT��p��k�N2H�!�Oq�D������!��|�Y.���Ee`E��Nn%� �8:�k���W�S�<�ӆ٨��X
����lڨ�Ym�L��Nl�@��<���nU�.����fs��vԴ�Zս/��!S#H&ɸ/��E��-P���v�܋a���t@'��r;�<�����b��,
EW���w���6����b�g�/
'F�-�XtϪ:��E��_T��X	�.����Ԛ�r{*;j�5�ރ�:��#�Pr�Vi�
�W���B�H��I��CF&M�(�:�}�/���W�����F(wEoS��Bf�X�Q>�"N��h����lj�;���O�ʒMZ�7/���c����B����-�
����Z[L�9�mi�Ǝ�1��9���啵ʑ��ZÌ����(�J��T�<�J��7��ʴ�je�WR�Z�B�M��#���?{e�O��b�tO.X��w'�F��>[�gl'Pbmš�D�Wp}�؞��BU���	���M��Yx3e�08O�j}r��ss��s�e�3�z��$M�y��ÇQ�|F�G0
9N�O��m�s���r��7[t�����&L�A����}�$q�}��a7r�jx��jM��1&X�Ɉ,\~ǂ��]ct]½�N4@�N�ִ���
-�0r'�vj%;��^p`+9ҭ�3�$�Řﷵ��ށ�l6���0�'�ddW̴�u��狛�Ձ��͎� NX���ɔG�$��<�,��h�$i�$�E;�hoK�o}q��/��>&l�/kw���7brE��/x���M'h��D0�Mr���/N?��$�j?|{n���1�����鰖�L�=o�(E&��;s���bX� t�?��{�m��B?4��z��G�"�PK��mWˆ�з�setuptools/_distutils/log.py�Umk�0��_q���Ä-�`�e��tJ[B�}%>�b�U$9Y���d�����	b��GϽ��E��*�5�6+(p��R���jLAf-<L`�i4��H�x��Z:9Z厢���<,M�SВ�$
��Z.��F�$�2�6����M�άT���Z���^�r(ķ�ק�0�w����=mF��dvG��b:���h�A�L'���(1�m��ӷfu-�J1��\�����:K�c�.7:3m|p�X=|��˾�En7<ר(�*iW�Ť�Z���01%�%�f�$�h�e�r?��pj����Kk([|���
.)�v�ı8��e܋�k�p�uWȋ��{�S5;G�j !�ޢ,���g�|��v0��~�T���v{��pc�G��D��]�����TK��_��!�`QqQ�B.�8*���k@>�K�F{p���{��j'9����2��o5��)v@�f��e�r� �W��ӫ�PY��`O��ڑ���4�1Uf�<����ql�-��k�G���H��8ƒI/�y,���,�6�YM5Cc�n�޷4C�����<�糧`����,u�wA&B,=M�	��:�����:N~|E�<�3<k�S7#[M�̚<:_ϟz �
�3�j�D���0�wޭ�.�S~;X7��|[��1�m_H;��f��Ku
���L����?PK��mW>����!�v&setuptools/_distutils/msvc9compiler.py�=�S9����Й��8��@.�K��"@.��#���{d<�x�7����_w�c�ِ�Ի:W���G��j��Z��nlj(�e��p*�Gߏ��,Iy�j�Y%�`g���CU�cQƒ�,�S�e�g,�r�Y4e�Jf�Q	��58KFE.�qɮ1�R�/�q�������V��L�x�r��x�!�zH�	��c�?��]����'P���h�`b>��EI��iX��B���I��9�)��v��j���ER�<c����b��i
�ht�c,���[���r�O#���'^�,�YĆ��|�F�&�-;�j�A9)��hT�[��Xt�1NFXW�����Im��{�L�h�`a�˅�&��Y����J�k�[�q�O-r�l�B0��H�?��1V���iT����K���(�P�O�������:&fU42��l�&�A>C����C��ց�u�-/35C��$�h�>�ۋ�~��G���CS����|
?�ZU�뮢t��Z*�z�qUGTo��|��>��>��?�{q��O?�_R�%MN/Ng��OΏ��9=������V�����x��+�8&Ԅb���}ww:čX7�E��~d;/^��t[ɘ�0�h�5��76pGlwgs��,���dD���D�8˸d�4��`����=FyQp1��қ�
�(MzF~���<˰E���~Ec}X�X��d�_Q�U�3-�}NQ��|�^���9�c�ň�/rr�~Y�_����?���`*9��@%��u~|�l8!4~WDS��w�O�[>�?0�?��RtA��i4cw|!e��#�.�n9/2v��F ;�o�h�g%u���}T�(M�aTvB�#/A1Vl*)-P�����H����X��׃h�~��lI&�E�%���֬�
@�����ևӃ��������#n�߈z���(��)�TB���k��j��d ��*]2�J�)xk"�`���Ԣ/19�u0JEfU�bw��@9����H��9R<��@���D��%����^L"F ��PjA�khrcj�(P��A�3�@�)����[M���BNU��NH�Q����0�;�H:�
]�'0���BP
c�G�M�E�E�<ϸ)?��1��m~=L��.�9w5��ϝDOi�@�"�]���g��sJOC�<���ڊ��}��ZG9�Ӗ����x���x����|q2j.q���L��4e�.Pwd`	�Z�<�b����M���߂p�=I�+3^qYߐ'p(����D�_��PL�#`�(N���v?o�o)1��.Yc�3��x*�#�$*�"�kC	��v�V��e��%�K�{�j r�+h�m/�?e	����3�j���`�~�H���j�r�*;~���sɐf0H����qO;J��<T�.�RŽ �o�u
�m��.J�Ǩ� ЩRaA���B�_���aL*���VZ�P�ec�r�R�ÓH��GI�a�|,�/}X�ٗ�C�k���Ge-������l�ƪ��!�9P��տ������}�]��a�ec�!Xv�'�V�wb�;�v}S��,��`�ӭkr� �]�i	JA9
���IZ�xD#���K��P�tFƐ�="f\�$1.���ETr;�6jT$�Țc(��4�UN@,�V�i�N�l��AY�sv��[�)
��Z�h	*M�
Z���|����C3�V�7Gl
_vwڨ2�e8[���m�����뼳�o�d'wˎR��qE��>���{�A8sp�R�L� �?,6[�c3�6���ܗm��4~��?�m1�6Z?���j�>��;
Y؆b�m7��T�S��ŗu�b7�I���\�%�QX��m��7�2��`5?�d5�&��"��8U"�,�J�x��*�mi	7(

��6����
F'�Bq����B�C���0V�c'�%�t����0�Q:���u`TE�
%(ib�2{6�|�UPDG�d����7���
>N0��>���P���i���@6�􂍝`�g��^�~�
0�X�3�#`Wp��d�&�4)�6��R��F���������ܹ�M=��mR��n����K�!�pT�*&��$��W���X� �8���[��v���H',γN�"7�#�D:�x�G2 !a�%v�_�s򾮦RCd{��_7ĝ�H!��ckr
wY�����/�^ID����8}��?�h=(8�B> ���%�(2^��+
����2&}���=��>�C%�Y^`4`Ȏ��4J�����>�ձ9�ݭl�c[1�V��M�0��f���P�b9��_G�4�%��jI2T$ ��8���K`	�5��/�T����cA���N���` �����hF2�	Z�r\���V ��{�V�v�3��Zc��\l� Gf��_+�,{��I��:Jk���"����z�r>MHb�z)*WXf�A5�!�y+{6UM��%�*ԄH�W
�ja���<���!��C%�%�À)���*�v��!ls�?
�f�MAT2cݫr	ԁ�I��$X�����������W��/��//.N��T���<��9&��\݀ �8KD�|O��J�Zjߧ�m��6h�h5�,�h�HJY6����vz�t/�Do�D@aP�[I�穐6�}��Ḣv��/S{�@W;�hH:8a3�����JWՌ$g�����Г�E�+��5��+
)�*��]�g�г��Bc"5I̠�����lL��BpM_��Xn	V�	�9 �hhP�M��/^�<�m‘?�n�M#*��U���qJ�`SeL`Zuv��j��J��V���X4!خ�h��~��u����<Mj"ٙN=PR�KR�t���b��+�,b-ƒ4Y��REow���Vv8�]�d��A�Q$��]�T��R�4��1�K���h�s(k��!� ��0g���cXL�
oIG M�f��
?`Q�i�K'�#�;���R�	1-�8���6�O���/�z�nS�H�=�f@3	�X��3�8��3,��~����?�%��9F(C�:zk�[��]�K��㲦xڈ.�l���/Y�&ݨ�T�N��R����f
�7��WC�?!h�dVؓb��m�a�_�j����?��������:.�ض�?��ѣ�I|y�h&w&0b4�i�V熰ۀ�mӅ�F��(ͅ�T�yCW꽏���
Zs��%�hf+�T���0�]�o�(�J<1?���M�a�������Ź<è20C7��
鮖EW�������Tҵ%�P&h��S�1Q�����|;��i�O!�<��|�2��lS��MW�k&(��:�F$/�d�F�D�I�Jܹ��f2�h�М�k�w��:��i)��0���_�\�
`��2�9G\l.ȗ��q��g�J:���!b�i�G>���
�:l8�7����>��D�,(*"�/ò!܌�,����w�mA�7vS�9r�B���H%S9��à�Vџ�OY����`6��$%��ƞȠ	eMq)���R���}d� �ʈ:'���<v(M�(���p�zrr�F+,~c'unT�l֬���f3���n]4!ԴY9�J5�s��י�h�����cF��	g���@ѣW񀤢�#�s�hLtc�Z�Mq�6-m扪7I%���UA���g���綀�b<���ӴeVDJ��e�:�b]aV�%�U�C��=��Z�3�
�GPf��j4�B0�U����@�it����7�#��$pU'k��9��r���R�������(�o@L�[���qvjӪ���
IU�B��g�P�`�1R5Qa�}���V��TT7�ol���9�M�;,�~�E�NK�ф�ğG�i�LyVq6�|`�)��sH�ˁp����[�Z�6U��6�t8{�#d��(�jEq" �=EK��LE��B-0h��l���ֳs�(+�S��
�����]6	�>E6�D��s�@���{]7�>:�_~�<9�cB��s��5ar'�g�~|竡5%wdD��(+�;�/QI��!�`>c@�bAf�Er;)��#P�xP�k��4�pJ	���h��`�c�>z����FC�b��AA��%�S��֪���5vA��=���H�]�9�IG�}	���&�
��Ӊ�Z���L�%+[3lbppv��(�8�q��i���U�3>���['�6Ub^��U�LPcE��S�h8B�v��g����V۰��������$�k�#�3�rrsT��Ȯ�ϻXs�C]4$�,/����aR~
.1n���:�������vVp�~#�tm�¬�j�}�"%�����,9�ПJ�\wЪ���省U���a�Zu�B��Ƴ�����Y-��Y-��l	�(%-�P+P7ͅBu����,9s�:�n��\	�BZ7&����$I�D����F�z�}������2�n`PKw�\�j��z`LmSto��X3�4�A�p�"�i�Y-5{Z_��!�����]*��ǸXj:5�a̩��A���y�������
�2�ɴ���G��&�,�ިEߴe���S3���fSݎNƮ)
�1��ɸR�n�f��,O��M�����Ύ�ϻ�g��1h{t~t���_k��7ꀂ��
;C�j�+�V��_��Ѡ���4�.��Q��?�ovؿ�P
�?H0���x�F�b }i����)���99?�x|v|~yp�w~aͪ�J+�/�t�&ݘ̓�g�HΧ�f�(~�.u��߉��:����>��
�AGj6��S9���W0:�r����TU�UM1�?�t{E�|^��%5�t�0�%�B��;[�t�*_�1�Ȏ�Pg�r*`(�Q�%�ƜJ<�4Hg�.��ZZ-ɫN������\&T9�0��u�JZ�X�!�*P%?8��r׽~y�d��3�g�AC�>��uu
�}���
嗍12��^�JyD���& b��q�����ς+/"�ґY���D��&J<e�qJ�j}��{��!H2/�𠰮����#CJ��~(q2s2	`�[�7�����w�Y�>�2�&��p�1�y��UD!���熋���XJ.�����'HoW%,����a�����ʨ�ò��\�֑��' ��E��0sB��F^�A�e�3".���r'4��D/�<u�E�ʮ�j]Dj�'��"ׇ�FӍUY.J�0�H*�����3=�ۊ�V��FL��s��@��Z5Ow�_�H��z>��V�顤Zj4����5��ʾ3�Vc��9�@���즆7;[����@k����(ul��F\u�Ṑ,����J����sn�#�(*4$�5t�őVy[UO���>�Y#M��Ӕ\H��x
��&^8&kr�Ǟ��5y
�i� �P�[�Mf�>D��
:���"A��a.$�ap��'&��'�Ai��q��jM6.)��[��6��b��wO��:{�'���Ï�H���q�Of{����QE#8�A�Fåm��4���Z�c0��$�ҳQ�P�~�㛥Wu�蘒�<N�O��	�m�w}��_�#��L-�!���P��c/Xgs����`j2�\e�^:Sy{�3s�-�Za��c����e5�+>9��f�v?ݻ[����-��aJ�r�l]��yG9��d@7���#t?�� FF�-'q�I�[��K�6"��l��!%��+�qB��MEM�K��x�m�H���0C��}2p����s)�A��[öo�^���TN����8����SO

����k�~ȹ�܀�z$~��:�Mi���B��,�H�Ki,~�(�󥷗Xų�e�r"�B���#��o����1倪�!��@�z�'�ڑ�_�b��Y' c�[�VM[��jK��W_�iI� ~�Ҭ4d�9�sU�e�����_���m`۩���A�z�T����H*4z����Y\�t��X}����b��/W�B�k��q�8P1O\No�*�'�L�ܾ9e+@?���T|��6Ͱ6�s����ƥ��=�y��=P�u�.>]��!w���;-����˃���m�?��p�
�Q�6;L���J֕�k��.�S �l��7c�qx��Ndk[�jxv��p0�F����
�]��$C���ra�q�b�ar��v��b1橷��{bC�N��m!�K>��j�3d	4����b�_s}`ְ���o��,���Gו4�9}�=�|�@���-o��L����-O���9X�>�-q��������4��i�`.�؛{��ɩ�{��vv8�)����EŁW9+	��U���/LJ�.ޞ{/�,�Dy�i�����^�2���}b���[���J�*N�vgBǍ�)�VW2�h�'/ł��R�[ǿ|��x�G��Ŵf��F`�jwm8.���ew�^��(��Ҡt�D0Jr"?�'��a��&��n�fn�|�)y�!�*^�Md�K������&���O���EwYP��!�xǷ|1�C���;B�ב����R�Gʓf\mU��P1�QG��=	�^t��L^��U:]+��l��]o�x��[*���i:���%�ށ��ꁆ�.���3^��{͘���~��7���<��c���}8=yK�oa�K�FY2�TXi,���}h㬇�F�+��s�]���۾�*-�������iO�k�L��rq��Q��&�"��>�z!���g�����^�Z�6�k6��LѸ�n�O7�}�'�+�����$M���u���x���)���J�qo�[t5`ې�L[�i�f�
��$��'1vqy�G��5H�טrQ%���V��̸���*	5�b^қE�P���\�%� !B��h`;Y��F�JP+��t\m,h�簲[�%�'�9A��Wu�yo]����묹Y�WD�m��H��,��*mS��	x�������3�o�nc_�Q�9<KB�	f'c��{d �|k �[��Le��B�e�?-`}���9Xe2�We�c�E�=�V��1I����zB{J���A��}�.0ww�IY����"�v©����[<ۜ�-����������~��
#1{��p�;�$��n�����m�0r;DnAB��!o�%e��"�R6bq��B�!�Rի��Vh��$V2���AS����;�_�;�����kRI��W6���b��8�u=�;�;|���3z��Z
@؀8�/��|F	i��5���YqlV �|Q0/n�!�/���ʓ���傇(#'?�ϓ�lm3El_]������K	�<�(c�a	I��s
�!��|���Z������|c�^�����7����:c�es�3t��b�^�=���k��F��9�ף�!Z�{m�շj`?^R�m�<J5�˕8n�(^1���az����^�/�J�4�t�x0��㠶Em�:0�W]}k�ʜ�R�[W�}�藣��i?�U�kL�Xg�@����S:�ԓ��w�]
>��̟��Yj�2��3����<Z�?ͭ{冤�4��ޗ�t����u
W��!���I��3��J3�FG��!�O�Zv�#�bL˾�P被�а���Ar�Q�RKF�`�����
̌�����x�O��|n��x���ގi?�#��;�q��8��e�x4���R���\������h��?�]�)(���8.ዟ�{�g�k��hۼR���Ŀ�%QD�B���?ت���͛�P<��<8=�I-	��I_5�HN��h���Oy���x��V����@�z�G�24'VU$I��$��a����x�'�lY~�+��.cn��U��ha���io�b/[\z�4o�U$u����a���+�ߝ�0A�k��8|(��˗�B���b��]��2��Lt��O�(�\|��"���B�h.��:�S�.ϳ��;[�j�W|B�|����JźO3*��NO�~8�|Omhb�q���J��~���7�|�A����$�ʻ��Q1�����6'���͉�#���:���v�j��Ф�;���* *dj2Z�z
���{��D�}�����1�R)�T����`�9o{N_`_U��0.�� n֫�Y���ԃ��3K��7�O�3�b�����E���0�#0׌E�S�5t���	�|F�C
�QF9e���E^�yӡs֥&�ڏ�o~iq���nNG3���0k��W�%�7�_P����b&!V~>>u[DS�o(]���62�A0v�}�'3,{�a���UOkKz���06˞�G�XY�*$����4#'?S��9�{�w�c_��P���$�ޜ ��ᔉG$����T��uny��s��[Tf�2L�p���M�;����V�g��v�r��
����8���~�ٷ�]^~C&Q�ѹ�ウ�a���gM��G��PK��mW:�kc�[%setuptools/_distutils/msvccompiler.py�\ms�8���_��/%j,�N2��s*�����;v천�=ۥ�D�bL�\������~�
�HPVv�w��݉L�F��t���(岌,�t�-�8�E�w��e����>��C�,^�	_p�\�Yʲ+眅Q�dUa6MB!z������D6+��X,Ä��egA��^o�})��)���9/�|ϒ>�����E6�S����p��y���l��X���M8*طl��fq��-;�U��"[�Ή��߂�ՠ׃�eE��JY�ق�"��B0U���9ԟ���K�w�IX�꽪�D�^�ē�WzG?�
W�h��[���x2�r�&�^��z�i��F�[����{ �}���>�)|�ѫf��b�����Ƌ,�wf�~{���w�:z�>�+]�(].�E]B�0��%�KЫ�ʫ�NC����)�KvL]�"�oU'펾|��4K���RhKBV�>��A-�{��%���)������ڢ����k����	�t��ޗ�Ha�0�EQM�~8�hFyU���R>�B�P�Rf3�]����gbYp���|U�܀��	j��Ζt��V��س2[ޠ������3{xe�?�~��H�ף�����hh�l�8�tqq��J�-xrv�d|�����ǣ�$OގFG�����%X���h�PH��P�!���8�^.��%0:h��q��],g͇9��5�TK���)Z��څl�c�J�;BW7Ң��=��0����SW�x��N���ݗl
Y\�Y'�L@,w՛� ̡/�WW����gp}b���:�F�-RrH�j '��$ai�eE���E	�&J�=�b

��?{4�.���#��]ʞ
Y��y=:da�� y���$�&])�������
[o��ucɱ�*	5���[`�,|p���"�
It�,�,�f%�_#.��a;^K$���;�Bv�`�!(vr:z�A̼�l���i\�Ǿ�����&��V��W�T]~�u�^E,������!�X��9�<�J���^��B�kO+$4�ʡ�획>\y��?�=�ܠ"DW��M��԰�3fW��u/���7��S������J�x�l/x>C6[��������(�jb����ןൗ�Ӧe�ݴFO�u�Jy�ձ������CV�y��WEd�@�R޴Ȳ�h�5!``��؟�/�^� �Z�n6(�;���s��!8�G�oO]4��� �W�l�j�c7�`��yR�e� �,�vd�^��|
H�"��`�%��	7k�5���2�0	�",9}� m6����5�� .вͲ%�0`������䋀��*[�;���`u���Q�~�F�
�a�E��¯//_1tC���)[����/<t�u7�WH5^λ�ԕU�Ǥ�K��6�H-
�g�v�yC��5|���5`7>w��MD3d{�
�d�=���?�v׮�0��d>+��I#�	��~9Q�P4����A<�A�?h�:<O�)��Z�]�İ1p�c�Z���o�*��l�i	�Q;�B�&��B����j6�^
[��Lr �	����d�XZm��@�
$)I��[@���'�u.�"앍���b�����
o�
a��ˢ��2o���~{UQ\��Z����Ҧ��"O�����"��J/�\Z��j��̀��ffv�?�zY����Kc!�b��	[̳%�	����?We-: ������K�a�=�$*�b�,�0�;��V�:����� �U
1�������Uݕ#{]���c!�<:!��U���p6象ܖ.���-�G��1q�b:�Y8��={��c���(���y=(�2)�<��䉇q�������^��
�R2��+�j�^s��^Jh#b*��1	���H1� ,�$�;�JB����Io|�oK^aWU#�h仢%L�)8QL,�{)9^��-���P�@�4dE�ES����a��WJl4(2R�[���}�vC�S��.E��d�
tW��^S���d�(mw�3��גOћ�
����?|óm��_��)|���}����^�8�vc���l�<��<��4�4��u6�6Q3V}�X�t�����[ezUHd$���׀U�|��S��eZ:�*q-(�
zX�q�_i%����d<�1T�;8��w���v�j���=Vs��R�� ��)����!�@�e\���ԗJ���"%�2�G���tY�0�c��g�XN�����8��sNJ�3��^��@��n���i|ⶠy�p.�;S+�(R_�O�h�L�1������S˟&�ŏ-���/o,���DЦ�K��`2�dK�vF�e���]߇�Da2?�L`r�,c1g���0��ز��úsR#�ӱ�a��i�F}���i��<��>>��E�RQ�Z�?.���G����*3�R(
���Yp\$�ц��!c�ǰ�)E�d̷�����v˧���F���;�$�%E�>e�o�O�F~��4����Q%�`<#G�(IZ40F	Bյ�w�g��4�A
��k<�N�L2���
YT���2ş@x
�]��&�l
U}U��"kD-�XM��,��*i�
ӄ[5�h�m[�-���f���`�/A�x���&I�v�_��[V�̷y�8K���C~/ܨ�*��`Ɏ�� d gs��f
�h���9`ouַ�0 ا
lt��|�n��TE��q�f����>���
��e�j��R39n��-���������K�����
O��WnA@5��\_�8"G�{�7Mp^z��,+!�%I
�x�3=^caRķ��?�ք7��EX��jK{��d�C�s���
���:Md�IG��)���y��֯ƨПh�(���?f^F�Bp��
�#��6%֑{&��z��p�
��]�������tcC S"
���X/��1�ª��CO�(I�F�2�:W�IW���R�C
G,aP�#�Ecᠱ0i,:ޮ#�hhz|~}���vA����ޒ�!W�)=�Uj��a��NWWQTmg��X���*��A���b��3�ܱ��$�cݡ�5��m�����oYܘ�
�a��!�]$P�ZA�gCX �^�A�w�,�n3Ļg/��C���K�緯}6�l���=�xx���o��'[G|��%4m�)������_����N�W�a��?�0�f+b͒�V�%$�\��P���G�G/ߞ�<��8Դ�:�;��̓���O��:���0�G�}���qe�@������� m�R���D�z0��|�SCJ�� 2�W��vk��Yu�uE�"��Q\@X�]*[����b}��o��,�1ǬA�;/�WC�$.QI,�k1�җ�� �1�9��Zc�GP�	L1������b�,��X8��2������j�	:202���
�����U<*�{N�W�oPl�,�%Q}u��4�X�� 6ؿ�Ձ�݆l�i%<�흻M��ܪ4��VV��÷�;�w���k�*�-D�[�(��PN/�A�j�V�r�IJB�rVJ�r�P�U���n*Q<�qB.��-�A�e$��R�{�����]Rj�Q�(���S�-��㟤Rrx\�ע?!�Jqvb�na�U)��x��m�|͜Ӡ�h2��W`ڕ������
Z˿�ڨ+-ԋ�r&��0L/�<�I�?����L�5���3MV�2Q/#�����7m0Z���s�q#R�BC+�C�C�1m|kYá�iw�I�T���ۚ3ݔtK��C���P-�����k��B!Kุhx"�h����i��=�X��*J�w#W#�j͏M)��O��RVl)KE��⻂�6�^JV�I��g�"I�.�L�t�>������,�m�ڒI�0I�I�J�J�X���+$&N�I`��>.�H��BR�@W.�ĥK^�oO�𶝀���zM�
����˩����>a��e�'��Q}~h\������[�f��v�QE38ːAпVA���#S>�����
e:~��f�]U�ZU�<h��AмMǧ�z|(ۦ�D���tK,8U�s@cc
T���O��3W��4��\M���Ы�W]�	��/�^�k�ɶ
W[gM���-�n�j��V�U��ә�:�K�,�a떣�B���F�ڸM0�A(;�[�&2pٱ^��K�vZ��D��s�C�\_��)%-�KZ���,,b�P�DLWI����U��m"���\��fa0.��0�ۥ;�=D�8���ڎ=
>�U���X��x�P���e_������
��b�#�Ա3DmG((37h���#1�db��.�ѻ)����[o�����e�r�b���#�?���`dK��H���D��Y���M��3��������[�1^s��%-@��Ӭ=�Y�s]�.d/�}�w��#�Clu�K>��U<���b�uE���Az�d,�)�&֏��\̏��*ԪYTA�,~��'��p���
@o����s���\�O��d��l���1�R��ּ4��p�
��o�6�E��}�����k۱SwD1�i�oo3@@�#���g�'�f���0}�۶�m�'o���G[�1���/�2ۉ`��f٦��iI�ᘉJ��M_�Ӳф�k��
	(�������ߋ%x�?U�?��X-&Y�,��ܐ���(�K�}T%_䮯��
�H�ź��z�á5b��8=��<�[�tw��!'�{ǭ=��
	�1�w���w�)���9�Fdž�Tw4څg]��ˬ��e�d@�V��^nj�xŧ�{L�l�3���h�tPӰ`�
��Fy������w'G��M�� q��ʑ:�d���O��A�[��t�0�?�_2+��4���	-7��[�m�,����3=�{��=�z~vq�Oɵբړ�`����zvm[vb�pG��-:B�T�WK'K��X'C��2?���OI�djo&\�x�C�}�a��Tء�\f��L�"\�ŴM+����̻3���'f
I�8^����`
JU�#`#��Y�m��z�\i�іYe�x�1��d��CI��fx ����
����u%|�(I����ձ��;ա�3�F���/�N�o�H͠�]��8�X��!�#5+�������w���Μz
�ڒU����n�K<�f�$��^�1l�_/�h)�%���)�ǹF?��_����0Ƨ�6����&ϖ�w�(B`c�̴�I"ܪ�N�&N��2���>H�em�	��%��Z�E��>��z����|(Rr���7>�Ϙ�2L�5\����h�#m*E��`{��;k�/�u�k,jDo���,T�T�j��ښt^�MS�w�P�09�!_��-��0���#&�������Y����9�	L�zz�m�#��^��Y���D�4emT��ަ�������&���w�YE�?��Q�Dv�#��/c�X	a�г,ǵ�8ByӚ+�������6}�Dz��ܰ$�'��	%�zA��Ku}���K44wtK��_F��S�4`��?'��)<<{v[���6}��D�Ȫ�\��t�0�J@��5�!jZs�Jn�V5�))�^<�>�׀�ˡ���P
��aj�4e�a'F{�R�T��jq���p"�dYr%:n*Ȣ��e�I.���P�-E�4�p����+�M��pX�$��4]�ngi+Zk���9�M�^o�#[4K����w�m5t�5�!��:Z�����o�ߨC?�?�P��K�܌�5�$}<�M���W}{�^�>���e��2_-S����N2�U�D;�߃�����!�>� I^`��,-�Z����ߚ?���"�a>��{�ךּ1ƭ�*��T�!�+co1͞7��d�-�On�w���������o|��/G������g����Ϯ����a-ngv�>���
&�2�&;����w��<��u�1g� -ŵ�'n
Or��,��oZ���K�}CWuŜ!}�]����n�G�����
G�f��-y�9��tf-�5o���Ɩ������֫lm���`�Εei��؝���ۧc4��5�i_8��0(2����Gq��#a|�d������]N�!�WƥN�9N�!ND!@P.�bi��[���V�e��S�+�C�ZU["@�Ԃ�
=�<�Zt��<�	R��I�/�p[�~��}#a�.����g��7R�`�F`�]P���l�K)�4�&R�7�0��1|C:X���.qey��LrVHh��K�e�Ȗ׹UZ�&ڲє���M���S�
%{�_We{�90�72˵��oxݗ~=��(v�&�V�W}��R�mg���>�ܸ^���Qu�,��[F��'YGE_"ܪ��q�����|sh�!&�pa�S�����ʍ�Y0O��PK��mW��v��#setuptools/_distutils/py35compat.py���J1��y�&��<�
�W�g:c��NGЧ�73��5��&_�*E�d����ql��c�\.B�y^����$ȅQw6��a|4��Z���8����@0�}Z�%�h�T`T��͔V�O��1�E��~��r��"
U�t�9u�I�:z	O�ާ/�5���Rد)�3<�$&_
�e�g�`_,����1>>���r����x��k�����v'�Q�Ɍ�PK��mW��{�#setuptools/_distutils/py38compat.pyu��
�@D���`���{�+J�����R�^��j�i�/�0-�L�#k>�������&B���#��f�RV��l�z왒�ZYxԮUZ�$��tUe������v��Gk ���
PK��mW���s�
setuptools/_distutils/spawn.py�W�n�8}�W�:da���C�
v��m�t����%�f+�I���wfH]l����C�r�;��J�|�U��{�$w��T)�����Y
U����A@e��WR��
�U�s���W�6W�ke�*Ug����*��
�[h��Xр��.ҹErS;C�O*�˕|�E�ź���Ŗ-Z�|����I��ƠE#�l6Kմ�zp�5�7�!��$dcv���:������-m��-��k�8�\w����:��j�I����M��pW��u;i����J{X�N�W�w��F��:����;}�t�
e�%�9+L�,i��@���y(��{
���m)��n�FjNShur��t�>�z��\�H,�e'K6x}����M�DHS��n�����$(m`/��W�	���W����p�=,c�l�Q~���c�9`o;	s�
#��g9��l�I��1"=��{Uװ��9ɍC����=p����<f�1J�:�B>��8D+���H��ݜAȴ�0;�l��D]�ĸ�z��AUd���������w�*�gZ0�������*�"#���$?KSpY{.�rXw>0��>9�P%��s�,}��T_�YNNy�)2���+�L�=y���F(��[c�"](%���%,�b�,�{p�te�0,��
��JK6���3�n?�'dm&"��S�,�c��3�=P��x�[N�8�w���	�>F���&)�ܠ��B��F�n�K<,��3�T��x����^������շ��O_>����簑~Ո¸�ǶƿP�������m'�z<��2u�Ih{�h:�ieTf]��Y/�B����Yy&�2l��J��B��<�~$'�4>*���#�D3�}�����Y�
��;Y��p�fp	1��b�Iq�W���,�^�!��n��hPwr t���-��0DO[k�����L̯V��#�t:Z��F<�E�1lG����Nʣ"*�
8oI|h�>�g�l�tl}�[�N�b���-t?�����|�;}B��g�^�Q�Dok����M�Q�N��⻢$y�G����4I� m����&�xb�	�7\\��4���M��=�,�}P�"�zp��g���y��+!�.'�[`k�Cs�=���A��H���+��|��aE��XsBS�o<rG��O�o�����b
�Q5#x��b�-0<3^vi��-��[s�����]�G�SOo��%����Ť��q�LМ��!kҴ�ɞ�iL �4��.]����氧'*[ؾNqƚ�o����B��З�b>��T�p%�)�@��U�&�0m�.^���I|7J��N��e�V'Ż�0h�$�y|��%l�N�q�T9�7��kz<UM_O�OPK��mW��>~T"setuptools/_distutils/sysconfig.py�<�s�6�����jd6I�w���\�i��Ğ8٦�z�0	I�)�%H;�L��{	~Hv�w37�Nc��70�N��6���Q��U.�7�*�<-�<[$˺�U�g"�y����VJ�BE�"�&݆��L�u����2I�U��X���Mҍ�V(RY!P!��Čp+���F\+Q��Lԭ�E��l9Y�*�^!��gr�fs�E��DW"_8�$.F����,�Q�#�Q'��L��*KT)����h��|Ҁ&�_ʤ�T&�7B��%��*/Jy���/e09YCc|G�?/b|�_2Zy����t:�L�u�����k��T�����dQ�k���K��x��$�熼'�z29��=�U
/�M�	CV�u�VI��NU���{�Z�\3�b���@��qu�Wz.t.~���Q�.�J!�װ�������0h��BV� ����Z$g��'���꣊B�ǣ��{�_K���0u�D8��(�U�@�I��*/7Hb�2���,�$Y��in�dZ��4�UH?���c�z��]�}�L���\����Ԫ��"*sQz	�SX�w?���I����]�Ӝ�09��&e�L����o�.�5M�m~9�j6Q�VF�RW��x�8@0d)�?n�lFpځ��KD2Ce��E�ATd���|r%VH�@���̖���X���;���Z�BkU*�u�Yʵ@lwL
Gt���:�Ҳ��<O��f�[U� �w�R	�R�����d�an�#h���z�:�O2]�4UvF$rw
���q�X�Re��W����?�Yæ��$VP):4��.#B?�1�����?�PU]L炿i�t:kW�f�2ы$m���<�z�&U��"�9]����L��L��/A���$�W��
��UU"��Ao�So.���3�V��ZVy<��7,"�l3E�:�"XZh��J#����L��
��H�t�e��p�{��ig�;�N������eQ�Hq��8�8p�m�Ew�b��v1"9:�iT��bq��2�f�ʥ&�Z�
Y$�Y���k�F��Q�I�5z7��ir�اU�
|� q�@����2Y^8z���cԂ	�	/�>oR����Э�
w��r��	��>F���0|r
v�7����dV6���G���T�@
��"Εμ
t�2`��AvPN�$Z�k������8� �Yܪ����T���K����d�ٕX�߉��X' 2V�8s���?�󅱣��V)h�V�B���0\f\Ap=�-@�{O�<��g�3/�����}�Ğ��(mї�<xv5L�G�4���ᓹ`_�N��v�84�lt~cddЖ��	��Bx��<Z	T��'�j!����-іL�!!0Y��[_z߂�7I��I��evɳ�LB4Mw�V���M�y*6̜�j�ΑH��uQ��v�%����ț�mh˜c&��iJ0�%p��ӱ� ��`���z,�Pt��N#p��xZȎ	��N>N;�ƺ�D��?�����qKѱ/�'�@�Ҽ�;ȸ�a�?Һ^�Ru�(\��Ѵ
s�Ճ�.+���++��F
�0.�>���(�C�v�ۼG�e��2�T�4�
��X��(�����S�ش�Ŷ���B��������u:t��f�1w<dZ�^@��<�~�t��[��	gx�KP���I�(,ƀ�ˢ�+>�����-Ʒ�񨉀ǎ���l=5l
�b;��zB�U]	���n�:GU��Ώ�	�Y���9E��d��0&���9!Al�G�B<,$~��Og�/#�X(UJ��[�]wwz
�:7Y~.M(�f
�G��q����M�u�������Y����{6��0VCH�o����=�)1"�-���$�wJ��ѳ�����r���I
';f��lc]5�a�M9zv�0A��\��k��&��A�rT�hg��K�{�E��6����nv],��F����q���
��|�NJG+��}��!���H/LĜ��^���z�Et���哫�����э\*
�>�j'����5�j��3��u�!�n�,�6a���5"�3w�-r�ud�%��Ne�s�WS��leaZu������(���Y>��v��y��2�"�j��A�1j��;b4}�o�B��e���V|�w
��_�I�+AX����w!�)}��u^�ds�v�f��"����(�n�y
VB]�#��gH7�Ȣ�X���Fζ��A�=)��>t��h+�s`y��و{mšAPk'�/a�)��꬯�h��R�_�%�t �&����~�g�c��/f��2��8ML����A��#�H���D�,3��w&Q��(4W���b�hV�����n30�6ۉ7"��	G`�Vy�"�#�*�%R�Rk
Uo�;5��52��&��f �jX��*]�;ɛ8���Σ�$�h�����o]8[z4Q�VU,��{!�h2�����L��ej6���L�kx�n������3'�r{r��k���ƃ��ҏ��_�;{}�����Ň��髓��l$�6�����ڸ/�u�;��ݷ�[Q�B���ޤ��G�\DAED�߈�s0j���W���)aY�@��oݕ�m\{��8j�>П���~��v[J�r���ۓ��Ջ���ϯN/޿?	���l�wl��~2uEl��"v��-��"@|Ё8:��ҹ�6Q��u�����Ȃ9�{�ı�8� ��4�֑�FY�(9a�{��t��b�g*<n]�*CL�t JQ�.�aQw��Oa�qՁђw cZӷ�|7ZE�Gz�0�>	� JM�ɴ����ɍ�M����j�>���7Q�՛�Dv3�|~܇�%�
:�xjLS�w�q�����
��@�욍,{,��	�AP�ag����q(Ve�Z2��h[��VQ7/ڸ?`��6E��.4��E�c�V^Švջ�q�㍿un޷�XK4���!Z�^��0��z�����h�Q��/={��
X���o���0|��f�LU���D��N������4M�¶>�c����1ͫ�v*|$+u��J�8h�vao�%p7�F3ݻBHz�E��n���q��-�ݛ ݞm���O��Ũ���J��L�;@_Gzh�>���y�ޕCy��x���Lݟ:��Y�:��P������^�1�?���{53;���6gt�)X��7)Av]qw�ǀ�>�f߽!h�o]hC��F�kּ�W5�/��X��αIS5��u��%����8��N��8@��
`��cF��N����慩u�`�*�65��aj�c,Y��sJc�!��e�Җ�
:���r�x]º�L?�8&,�7,����=~!�ˣ��]�?r�O��^=�	?�v�[f��Π��w��^�=z9��٣�V�����šXA	3�_~'%�>�*�kh|�<Y�f���G|����$sq������:Ϻ�V�P�$����;S��Wd	.��b���2� �v��D�-yG�G��7��p�'�-���Z���6?��
J	2t��|��H�I*1�=�T�z�*���P���͂Ihk�lQN�K�b�k��7��!���,��*y:�G����OO�}����������U�<��l���T���(Ȑ�6CT཰�6	�w��%���,�'D"�(0C�X�C�}�S���OT�!2/��B�é���RVJ�Hh���rR
�����W+zo�HR�{T���SZ��DN��fO���#�ᔀk�J�?"������X ���=�
f�M����{���l_S�g�^�)m��(J�4P��(O��ʝ�hC���ŌO��ɶH�C"\t-��_C����:�E�9A��*7 ���4GLT^W�c2��0�r�^��GL����	��&��n���r&���J</o4�ޭ�(.�u���`�B�EK�cB�e��e�ߤ�L���<�,����A�E��wz�5�׮Z'�*��ĎoZ��8֭�-�B�n�a�EЍy��L�z��k@�o`w3W��̶�����=�TVv����p���7�9��΀��gc49����Z�Q�рQ�b�����nK��C$�(,Xʚ�k�0#Sg4%�������d>��B�q��&&�Q^_]~p�\m��(��C?`���]�-P��4�����G��~��Nq0҂�� ��H��]U�9�mk���y�|pm�ܶ�5V��l�LGk�Ѿ�����
�G��,��qu��8Э�c���v^�*S������?'�;���n鳟{�5No0���֭
���"���E�e^�f�Xm�<x��p�h�*���F��]�
���Lr\�q��F�=R3�EI��CP��e
�-9�=�K�\u�V;�l���:��Jr�a��"�~�E�i��ɡ�I␧��;����6b���Z����_��u�i�矧h|�>�R��F�T��s^�\x8�!���eQ�fI�H����0
�nG:�A[�0PћӘ��J�'{u���12bͩg3�9��B3e�8��>Ţ.��Ҡ��sJ�sos�|�����^/(��=�M^�E:$�M1<����������C�˼
���H�r��$��$tR[_z�hޕ��6�`a�e�yJ��]N� x���ܢ9����
��}�VDp�1��D�i��0�����kL���3T%#�KRkxԮ�Pr��t37`:��<=��k��Y�D�&v,���^����j	�D�������[�|r
�N#�h'�����]_��][hm�m�}Щ9���b�ꑐ�4���iSR�!N������V|�����)��M&�60xH�Q9a�2�C+�L�l�M�V��J�:S���q��-S���=M}����ٛ��?�8zw�9z}��gx]$�O�:�~��Z�I�����74>t��p-�C��}�=t*Dwf�)�Le'1m1���]
C:67�A�f%�o�o< qi����xb��s:%0=�i�n�|���\�b#�=�>x���(�}��78�	�RI�cv��r�Z�كj�?X(��
�x��J�������N"�/����ޫ�_�\��r��٫?��y0��C(�>��z�F�.�����
VN7�}��J��N��z�����#g@�x����;[�ݐ��fK�l+`��'Wm�j;Ž�}�ד��go��7�rM�k`5��%܋S�4������mr̾���q�~��Y�7�j���8T��N��2�3橺sG܉��%�j`U��H9�X
J��W��W@; "%��+�f�L���:�e�M����0�-�1�J�=�Z�m��e�g���33���uK���,�5��kO��k{�
9��d_��i�� �'#��u��/�ٺ���i��^�g7��W� 7Y�Jvqʊkʅ7\�m;`v�t}|��*I�R�`�!ŀu��c�H>��E�pO����Tn�G�;���Q��`��!����h��>�:�ľ��A��)�o�a�E������8P���<5vμt�k0n0�0�E�/A�0Ow�s��5`��$M�
�=�ֵz��~�����u�k���q�� �
]������S�8�]�MzQ1 _΄�!�QY\0	r���!B%�u]Ks�v��9l;Ë6��F��Fj�wImgp�����U��At�ޯ6E�����8��]E���c٘��L�@6�bt��
�9�ݓ�ϖ[~���#߬H����c�ݗd/��"����y,���^�HF{��{5PP����K��c<��$�
t��TA<�Q��~�نo�At "O��rM���`@�/Z���p=熨�mY�6��\w�p(��~��!U��3�U��ߪm����₟�;��sץ=�ۂ�����������:Y�����h��|�[�7rHϜ�k/_�q��{���{h�C�1ҵ�fw̜˘������ft���l5REϳn�Y�Н�%.o���[��r��G
�uۯ��W����|���
����rν���A�R��E�Q'��a7�;��+���%(F�wO��ͳ\��,]{ �
���<>�3l���z��
��k����D;x��]�y#w���ֶP�d�?���W9cv���ͭ��;�0б�xc�*r����M�}��vr�HH\��\G�J;NȨ_L�yxke3׎�n�?pI��r�����ꡲky�>�ﱣ+�����������f�wn
_l���
PK��mWQ8��Z�0"setuptools/_distutils/text_file.py�Zߏ۸~߿�q���nrE_�^q���k��
�D��ʢ*J�3���͐�HI�n���Z&��{�j6�5��~��榪�c�)#����x,�B��C��>��y٨z'S%-�� �9�F�u�五Eq^�F>`K*k%�N��Ϋ*/�"�ǣ*�����Ѷ���M��
Oe���:/�~$Nys[�>�tPf=��nn�c��F�3Q�777�p��F���IfuU��h�U��`�cF�<�9�#κeB��,��$ˆ��4��J���bX�:������!�V���e#�X�t�s�)4Q3b�r&rf���:�d-S�c��X�©�T(d���Z�����P&�l
�T'fg��u�g�l�Яt��	�d���t-�Z�}��4�T8v-ğ�L��!F	V�sO������p��rS]6�.
�-�Ư���d]��8��3h����b�JU�F	ZB�a�gϖ��U+v��p6y*�N��q��P�0h�,��~���Vb����Ƕh�
����u���e
�я�Nw�'�L�]~%��\5��x��}�.��KX�M�='�-
��W6�
�tq<'g,�Q���K�d�t��Z{�E��C#�����Җ��u���d�������k¦%��<�`�9����T��V,. �V(j8m �z�Ȅ�B�{�Y�Y����1�AOL�ƴU�7��i���S��+�=΀i�fp��|b�it���딺�'�*[�m�BDh�O�h9�$�^kDD��G�auS��j
�K�O��ٔ�ģ,Z���.!r���6��p`�w��s�v^�AT��K�U6S�j}�̄$����ْ�I�1I��䂐��m�5���J�%*�a����y�H��z:�e�������ן��cEP���{��^e�4oz2��Q43��V�c|p�B�Ǽ���#$�L�(��s�2�{����ٟ�qԱj��V���D]&g
iD	}���^��{���6�2��P���v�%'z�#�����]6�d����"�n)��`�>_'�F8�H�E����=��ÀT�nL�*%�R�+_*��+4�,KRa�^�m ���t�%O���D����p�q��0���Y�*m5�d5�#��@������o���NJ&�(c�L�E�ĺ_�R��g���xm�q��!��V�"��w��Q6п!�����)w����2�FB��&�X�U�teV�����t�)kF��0�v��?�ơA�wȗt�pEq��@�O���F]ATG�<52Q<�p�,G���P�r�Kl��d�<-[n�A5���J@��qV[H��h�MH��$�}!�S6�)�<c+�8�C#��z��|�BY[��'x�4ސ���C�>��8���^����z�F��rV�N�Гk�;�K�xseq=\|�r��n�5�Q(�k�mx��K{~�T+��Ѯ5��s���E�O�}�H��g��{|dݔ��Gi�mz�����G��a�Ǎ�†���!`��xP瓮���}�V��D�:���jd��
ʞ�b&cQ8����ps/�8�Q��l"s _ �C�>��e��UH�T�j[�#�z��M�x�d�x�)�	mz���I�5)��i���C@[��*:6SFq�-�#�5��z�n
[��"�r[ܪ��Q!*A��˖~�g��emP�O�"1š�*P"$�r
�_�Q �3���uAIcޭs����1�ͳ �,?�+���+���q���Q�+��+�Ww���s��En��Ǵ�k�����t-�i�]��Ɵ�}��Eh���n��J�n��?T�r�W�O* ��ҐKP ��k�?��U�!��P?�Ĕ!�,��e8Y��:f!��/}�e�lj6Φ���%RV�Ȃ�_S����[u�-5�i��R�o���[�#�T���Cs�~7�D����K�'��"�1�^Sv.@�冞[��^�'δ��#󡫨�v�pR��'��@y���=��R0LZD
q�v"N*��
�?D��Ƶ���*٫��<�h�K�t�&�߬�g�΍¦2��a�׀�ZV4�M-^��R��I9�2�xyn�0�3ȾM[j1Ȏ1�
�W��U���x�Y\�Sd�'��/	���m[��lk�^s�<�ól`�ߩ
��ۈ��Vѽ9;"����>qO�sx�m�䀞�s-���Ǽ�u�F�7*��MlwDm&��+�F���Q�g9��[kY��Cj��;�����
��A�O���r��M�9�|�hpgS�L��.��{��it�2��Q�
E`�^��	a�Wj���C�lj�l�֌�S�>j>s*z�m(��Y�=]�g�_�����y�bdծ0Fi6��д�_,�؊�G}l��A_���uk
�2����Ydipĕu�]�:y��H�<�4YhI����0�Tɼ%zH�cC;�ؾ��x�{��x�L#}��ʱ������#WG��1kKp�c�fa�q"�~�=��8����_����~8¡��SHs�Q���N�>�[��_��h��
�GS2�[$��-��EW�CC��a�e���9�^�U$�6��o�U�D�["���o�iNWX��a�E���\��.WT����m4�B��8�p%�~��P�V7$I���@1�+�3��b]�r9>��a�����"�\z����0!��cڃ�JJ�'�s"����T���~�����aEI(p�
:�̮;�"u}:C��v7$��>A�]!��*�]��n��P-�Ó�o|W�	*���-s��D�51y�N��T�r@�O�ڟ�<�V�4�s2�%�	"mi��s�� �5O
�͉k��Hp�&m�࢜v+;�ў1=��fB�c�W�&}lV2��/F��G��X����R��(���jrV����5P��ѵFh??9q���L�$�k
B�'R�ë;�]�G�Xoh;)�3 =���fw�q��sd��ŵ2�vz��*��Q��J����[�a�Q��wbA��H#�|ҿ-%�]p���[&�`BM:
�{����J�߭����dWt���ᑗ3���8�X?'{{��<�c.�
��,��?���+[W�kng(�s�+7��_d�$����)�}��G|���#[�>�7b��B�r6�²w{����[�з�~����|Id����*%�}�Ni�"��W�p�d!�(������e����{a�_PR�|�7rr��+\��R��2��g�X��+����d�م�]0�e;>�[Z�,d�8g?�
��U�Α(�s�@�,�:$n��BË�o�KH�#Ͽ&��^.4�Xp 9]��i4t8=��>����)��nn'� �%'mW���V\��Xy����a�P�q�y�D�6�B�V+��\N�{-���vm�AQ�Wb�Ԃ�z�����{[)��xv3�-�C^\1O��3���ǯ��i�em��{��W	��/����I�h!%R��Cid=Ԏִq{vA��w��һk�6�̖'�PY:�*�,�l�'��y;�e`\T����Yz�X��6B�}� ����O��ۿ�8 ��6��~����p��6.z��u��bs���+��^'2�Mz*�d��T�	/��J
��	�iG7�o-��w��2�V��t���U�Oԗy�Pz�c$�8�7�cq�
�D��=0���j�3h�y�fؾ_�':?r>��7��7b��������u��K{�n������`�o��%c4�G���G���dU�$ݻ�}�|<c�����n��>.�E��Ą�"0	T`Fč�d�����������\�5?�^��<�O\���HMt�m����x�H�Jz�G���ӕ�}搐���=!F�?�����ͶbE�PK��mW1���8&setuptools/_distutils/unixccompiler.py�[�o�6�=�&�����p9�]���ڡi�Y��m��D�H����I���df`�-�>�����e2�ĉҕNRVyr�"�I*ʓ�+�k���`�`��ʎ�(�J�g�Z�w&7��;�َ�q*�	���c�D<��B�c*��E��]1���	c�XƣR*�
��l��[��y&n.�yZ�[Z��'~‰4!ɣ��S��ю�I)"-�D(�
%��^�iM��K>8%Ma̛s|
�[�kOh9���Q��,�J�$�匉��*��0�,��,t"s�s��Ӓ��R��1��N��2^��lZH��uz4�A�sX�<�/a�P��N&���I���L�6�#���e����ɦ����ٙ0+��&�v��X+��&�bZؙT����q�ѽ9ۊ|U��(e$�Z�)���t�EY�Ru`_��W �W8c��N���d]�����S�vm�a�r��e�./Y�r�䁑�����RU�?NNN��ϟ��]�o˥fQU�"�i-������e�8q�u�]�y��B�I�V����R)�*
�T܋2"s��Q�d(�b�G~w
��&M�>&:d�
�D1�W��x�A�戟%۝�(;AQ�_��U���3�ɯ�}��w��M�˂\W�7�yx�4��>7��	Č�9�>�L�#�8��p@��r�b|�0�[�G��\%3`?2 ��VI,@q�nTO�K��K�W���$��5�b����Q�8���@�#�8o-�E�D{l�[�������V1ٜiE\v���t���KG�!��\3W y��2YW�����~h��*��謊�AS>��
��TN^T��>\'�r$
R8���#S���8�������
���@0:�wPj'�46j��춮6\�� �1x�'�Α��/�:�<<991N��$����ʼno��xC����
��)\o��V�Y�ơ���%��]� nN�N��,
�k����\��?X0+nq��Qh䀼 �Y�PW�7����T���G��F���5�H���W�Vl'Ja��P@��G�¢L��a�4���k�e�raj�W�R�.I�&�\T��H��Ƒ�:?�0��$i�,�1v�m���t�Hs`�o�u삽����9�?
S����D���+%�'ύ��FW
j�;g�Yg%Ý��?&/i��[b#�s���3W��#o.�r�~rb���^����mS�$�cr���;�̠h�Q7�Fb�h��h!+��$n�h͕Sc���4��!�;���^=���S�
=g/!&� ���8����D��FV��z���FpR
�dN1"�_�s����A�5���
�@�xnY�����d��h���d�3	��}-����&��R��4+a�$�IA�;�7��x�޸������L9D2+��C��:�Qb�{��Ϛ
�G����J
n7�pH�I��㶧������$�9���"lY���J�^�>_ҭ�	�娙���
r;m`�1d���L���YC�&9�py�@�ae-
L}r�mg5N��e92��m�E��;��Ӈ7��>վqgg�!o�3���N�����M��AK�3���A���s�]��V"Ӟ�;}!N3J4;��O��6�'���	��Z�E�|-l��D�5i��qv�:b	Ş:�4�D�I�fg�|Ã"_N��Q�N)3Ę��E1�����P�{H��u󖩤tf�y'=�5�vӁ+7kK�!u�m��\�L��z�#�����J]G�T����
��H"Q����Lm��%O ��s�)̛56��nk�����_����("*��c���*/�q��{Ԓ΃��0��87�`I�b�����~�)�T�]���<I���yX7�Fk@�_n��qc��6q?*���F�f#sȸU}`��!^ڙ��ֱPM��|n��*��^���ꖟ1����,�w�(޻t�_:��UϚv��bpgHVh;WL��rس�x�$��٘^�W��+�M�=�ԃn���?UCt�a2h�HK�]%�������;��U���}���ٛ��wd��Ȑ�/��)����RG��2L���ы4M��aGWC��.)e 1w0r�)�@BF;�����T��2)Щ�;,ݛN�)ۨ�;"�r�����y*8&��b�_�ɐڷԃ?]��g=�K~�[��~�%q%PcEj�Tu|`*�!]��eQ�RlZ-X�M��1Kt��%��#*j�R��μo��2�P�쌂'�$w�X���K���J��LU��
D����{n�+-��>�#ͧ	�1á�5�-v=ݷq��~~pY;]�1�����[Mz�IǩimE��~'�%�ӆ�s6U���@ʔf�ِ����nM�fu�2,eb!�a�����Ik{O����>}����-��o���w:��֯��wR�h�����3D�%�2K��l�v�>���!���6�`"�A=�����N��+F�M����WW�>����aW`J��N4ś�۾�鹆Q�i�Eh�*gg�̷���p����X7f"�OJ�g�*�n2הК޹�f�J��u�/a�\2*��,UANߜ�o�p�#�|������ןC�ą}�T�	e#|[2�c*%f\���9�-�cJ��ݣh�A��' ���MmG��Jiqs~;#i��a�8�磣���e�oF,nr;�f�򷒛r��J�xrƷ9e/�|��P�%�
����D%�p���8�}u���cz�%��]�$��8��lP�:~[�χY��tf&�rz�~���''����ͤ������^�lϚ�-���"J��Għ������Y��
��Լx�iZ�|D
�1ӌm�<��Xau�E�����zC�6���aD)tU�l�x;A`�LSrJ�jEvY-�N�`��AkF�-���H��@����<�K�nΌf�C���)|z-\�����~�ͷ=���Ӻ�X.MQ�+�\�%��4rI�9,v���� �/c�y�~͓���~�-eU���|w�5���9~�V�%UW�ޕn6�ޭ7��LK3�^sk�A�����ɽ�'g�0 �c��x>�R��&E�S���{���2fm�#ȩih�`��;��+<��w�lO\ 8lu��J!��~9ga��uγƲ@j���I^|�g�_%nќ�ؕ=���`$�Ɲn���E$�9��hS�	z�Ѓx߁��)r���bGzl���~y��T�y]^�%5��@iD�a�M�_���N��:�u�1ϐX�IL��*7e6`�AP>s���`vہR7ǭ=�e��R��4��~�A�����l:����fG���_����N�п����N�W|?���M�Dsd�KF�K)t��������!Cy~>g��;�-�9�/Jd��Uy"
���t�
�[��i��C<z�,1j|���]Dړ�wF"��kwD�'��	���]���:#�.$jZqFNqC��)�ep���fқ�)���o�
ȿ�ѲMF��fz+���~8C� ґ_�si�M7(9��Ӌ��;7d�B��|�rb��P^��qC�&��)'���m�}����B�Fc��>i=X�mX�b��5ߪ��C_��T�C/�p޽����P(��j��Wo�#��Mh`�Su��ó��&��h�u_a��6~��0O^Oӽ�^�“1�5�}����S!zR�ΐ�^j^T�����}+��rl��~�/��Y,ب�R2�{o�Iyq	��?�S�2�[����UI�Y�m~�"(4�cz�9ɾ��E���ƱG���i�E����VӀN�"��x�j�fE�p�웖�T����6�|i������R��h�4۞~k�<�<�6"��#Xđw�֗B��BOCےg�����rksf�Ay�j�������p�+<_IB��[�v��(u�†��B�_M��iy�V@��nlj)ÍL��{nB���v]r�k�f�d1i��e������L�(�$�8M-I1�	d��4��Kq/RY@��K	�=�����{Q��f��y��y��a,��Q�?'��3ᆱ4̔�U}e�L_�帣�~x��uо�`�@��Q�i�X�_Գ�/�g3�$�ݏ�\��@����6�e�������M���l,(eI	����G6��S����sBmډ{�����͟��[��^и��E�g�h�d
�=�b��q��rL��5݉e0��	�Q�`2��K���T�3�Y3��8��D)H�y~q;&�Qy��3.�
����(�{ȰKL	�w�b[	�̟�!��Q%+��Ϊhf��J;1��`�.(�W�hӜ��ݫ��JT*}d,��2��>K���\yYw,1��)T�dU���#Q�""��Q�fO��cS+���n߱���Ԕ$:����A�F�H͜G�Kǡ��0Ĕ`h�ϝ��B���G:�)N�A`���%@��XS���PK��mW��	u�Osetuptools/_distutils/util.py�<ks�F��+f���$���8�))��$��#��M�'kQ 0$��b�_����[}�H`������#���Tu�ff��ާ&�Y庨��gi�U�:���ȍ�LT�o�e�/T��*���~��i�Ҽ*�\�b/��*�c�2]oժH�L���y�j]��*��Tj���d錑���*a������b���,J#����CU�\���9�^�����F�2�h���7¾ˊ����ү��:ʹ�P��y�#K�*]�Q�0!�	�Ⱥ\�~��,Z����D��BW�0U�����?@폺��\EBC>�4�y��Sm��,ၲӧJ]/S���D��4϶
N��R��e3cb�:����i���R�UQ�
Q��W5��tV����uG,��qV'���ʣ�&p�ui`4}�w&*�eZ��u�Ue�:K��V�p9NF�h���Z�bI��}##~"A�dm؊^�<1
�c4^*���ןҼ���;]�:k�JQ.�:*�4����йFy5=��o������s��>GY�
��d��$}��$���Hߍ�cS�"���L�&�ΟռƯi��6i��"��Yb��h��=S�ٳ��;y��
>��"u��,<{6V�3��ٳ��U<r@���pX�4h
e��t��;�܀f�=bt�/J�y�O>\^���a3��
��Wm*�l��B����j�$�i��;��+��9��i�>8�&G8�
�V����o(�w Q�������.��g�,+y咇�s��4hn�v\ư���8[�y�\�x�s����u��W��_~|�!b@U�N�"?�/ؾ���8�P޺0齧
<�J-#UUp�>���l�P���oj��,�uE��j������bİ�����>�Q����g/�pȇ����!�u�J��?�������K���=O���.�
��@g:2�U�w���H]�Vc��^9�:��'��	N�W�g������Q	z
�YM�Qn-���Šyd��@j�7K�噑%T�e�i���`8��0Z>���|���#�3pݛ��(�)>�e�W`w��U����Y���"��e�5�������8�[1ר��>2o|��
�=2�G�S���'Icu���х�:�H����V}#�{玔���9�s�}��^�tAs`���'<��L_8�]w���a̛���Qġ�܅�>�@^����]0H���8�AQ¬(*���e�ip7(�QS<

p�"�7�d
إ�
�	$l�h
6�L;#���p��99~����gϾ>�NO�7Vߜ���~}rtz����~��^���݁c�	�M�&�oP'��{���o������%{x^ �Q��L�����Z�}t�&J]�o��]�F5n`�O�w
�6�G���3F �.��88��&�����7����몠�o>%��'>�5}u��ݻ��V4gI�xt�Y�
�e��t�^����"�8��>DW��]�k�"����n�ݪ2��qKe|tp�����?�`[L0?�>�E�
S��ꫯ�96��_�_}���ux}I�e���>����uh�{�nٹ�m���� 'jw�:w]�vĿ���E)�~}��z��M������������LX���hh0D��s��d�����EG������C��1X9�t6Y�Y�鉖�߿z}y�[��ۏW�'���G����7o?�t���o"-|>�0f(CZ#q�w�L��+M~�l;Uo
����ZW|��(�ȗ��򞼪 &�o�1��':��1���`=3�-@����[s�֊	U���٤|�0ÅfS�����6�*J)Κ��D�� P=��)��Į�b�S&�.3/��X`t���1�
�lo��f+�=��2��j�~���/��5
m�’Q�U����*�D�`C�t����D)�����p��2M�c�]V+0�	����z7W�N)�5��`"
�)���Q1���Г��I`��==6p��-�\7��(K��6r�N7�[F�� �w�뷹�
e���	�)f�O���K�ɂ
��(�:>���r8i�yh��(���IZW��&Yˆ�*���
QbvK���(Q��θ��P?�����Ƿo��AO�����'u��b(ق9M�0+��z��ԫjS�w���74ue���������}9��7�Gc�%����4ᇑ�/;��V�pe�c�������D�j����q`��ؠ7�D]�!�I�Z��_�|�S�7<���!ڨ�Q
��o�� �O�����/��ޱ�������5�������]����^�0�FIdE���XC#��`���h+�)��St+żp�T�FwnG-�����3(Ɣ]Dִi�D�?��+���)(BZ_��c���5=�E�(k��&I���r޺�SK֘3�[%t*P��s�6���Ic������t]�Xs�8�D['_c1ed�f��'�ǀ�3mi�ĨdH8�W9�
0��R��G�@�`�����������T!�hH$L�"F�0�pCi�<�a
�N�f�[��W%��h�nb�G��S�O���hT��ٟ��1���$��d������u����Y]iL��?9���m�40�����%��c+4O%�BZ�!<IܮN_���#1����K�����q��_E��i"`w֑ؓ�a0��,�zC���!��t�s|��T��U����	�!�7z-\'ҿ�)�=���:�7�4�ẍ�ȳ�����
�*�C�w���قO���v�6�X�$f��4�ۢ輹�zj�8�3�Cr���������R|�ב��9����v�ÇC�9�̜����II�%�Lp���]�������O��.��x,��3�ý����z@{*9߁{�KJ���Q�Qze�(�8�!8����u$��[��?귞��9����7>=(W�E
�NZ첸x� �3&m?Fc�^�d�<�/Xm6���V�uS�b�*�%؏��ߪ	-���\hk�\�)�����l�zR
�}DzR{�����%"���N�n.H�\?��F���Nq�LB�G"�$�{
QU��2���M�˙7�*z���I0NZo�4�|�O�����}����`�ֱ���ҧ�^8T�u19>z��ٹ
T,�� ۊ|ٴU�{t��Q�[Gƀ��BTE3��%�nAI�*DK��>����R��J��f�p�[��������(cv��k+qtI�k�:˞·lB�V#Y$�j�W�V�� o��q�U�LØ�N0��V���/�)H����7K�c�	�qh�.à���3��|�F�I&*�c�=`XG����7���t6E���ӧ%���iT/P����5)ơ9���4����,m�D���@V��� D��CƸٺ8�.��/r��Z�޺L*L(�U@��";�"�Ri���?�X�f �B4��KA;��μ}�]��Lc��(]��Xς��UpM�x5����~8�|s�x䏅�Jֆ���$j�R_rn�3fhZF���O�ete�:�@��l��B��A`|�����=;W��ơ�^���"�L�1��[�|�T��H��)�4�&HKI`�]�6#��r`�B380&�<ŒPRc�zQ����D-�?��ꉝ��>l��-�
��+����)�
�BC��K�|��4q1��<[�{�MX��;��(֣�e�z���	|�O�#�n�p���,�R$�s=��ߝ�<����i:z�Ki���Κ���?r�L0�f-�(�o��_Gq�"���P=8<wZ��RC�!X�Q��G�j�{b��z�i��sp	���TT370�Q<���0?_HJM�p{&���*4눪F��egBb�r�2:��F��(�6�۰�_;����t��D��rʺyN�V_�m��16� �����M�[ >ۺ����f�,E�bnPĽ�.ۥF[i�O�Ѵ*_D��N�4G٢(A�Wt��F�ee�ļ��Œ�H��аE{2۶T��U�s�8���/bZU��w��6p�A�Ʒ�m5�w��B��t��0���t:m<֎�ڊLWH�K.S"��<��u��#���8��Na!����Á�a�c��
��7�Bzq\����uK$��9�?��Y����NN�GQ氯}΁�u.܆%�w��?GA�b��r�0x��n�bOWd��B�F�o��Kr�ӡ5�-k�d�[w¡�f�V� -���F搭�ܓU�9���L��a3h?���
l���1}���荻����٩�ډLV�k��#�;�[ubː�K�>u=��vER�Z1yЊ�]��H�+z�%Q0�YnR�,b%��G�?B��q���-�v�r�1+�0�u�*�q���_*���(�q���c���0�O�4���
5Q'Ƿ�>D_���s�h�6;���7���!�R^)�Y.�<Wfq�d�>���#�e�mX���@Ĉr�J�O4����|QWd���6m0��f��C�ͻ�`�U/��C��EYSG�)���fm|��>6}.l�J�	� ���u%��Qƅ�|V�lؖ,㶨_R�	>4�S)Ml�D������H���E�e�z�i
�-�Qz5+���5�2��=�ok��NFc��S0R�l{`
�]��Q��#(\/�QI=F��4��)��]^fq399g
2�*�)��'A�C�d��v���D@G��||��)6�M�N�r�N��<f���ʪ�E�p��
w"�ݖ>�e]-9�A���b��R��ȶ0�;�܉�-��n��?���Bm>"��)pxbç>��������}����Hٿ�$�#��?�n��C��#�l��)��!��M�F;��q��n���v`+�p������g>#��—���l֨ig\oCN�xts'����j��I��
�xa���u`�Րǎ���`Ӳ(�:�X�#�,ӱeNiu�����t��Y�Г��!<Ė�0ĬB�y6�-E�e(R�<ݼ�)(��(C��e2�yr�Ƀ�=��X����E)��%�����s�������Џ0N�y��^�x�'�oX`
U�5�er�Yu@y�ї��	X=���F�}Pa��q���$�q�	�����b�h�6N��sJ�� �H�l��`�K�	��@5��eq<"���K2@X�XI:'��EB�X�	�}�Z`��_^��w�L��6����B|�d�{�d%B �U�^�L�I���
�9ƅ.Bvi������Y��&�����	�[���(������H�M������9t�6�`ػ�)7E�1M٥�0tG����'(L#�;g�Gm;�tR�C��I-�;��n|��H��FqO?��.�{0����n��TؑA҅7��Nf��_��q4j0��|��)�zƫ+w�r;�P�M�B�]EifF���{g͕F��oN��\s�M�7�FJ���f?��!�v|��,(s�I�}����G
���	�c0K9w"Rcj�+P����-h��r/(�1�J�7ܞq:�%im�Ydlq�'��=��
�u�h��{���o�t����~s��{,����prz�нcT��_n��sX�����6|��a��e~�䳓��1@�"�����-^E˝�1����{��I��!rX�g��'��X��d8ⶋ��%}�L.�f��_�&dބ;q�k�PwuU�t�p1S������Iz�|4ͲO�J�� �vFI�I�R>e�P�?Idݤ����*G�|��m%ʒ�ҎΛ8`�(uw�LLbBQ�$��������N@#�/T�t0�u�����w�1o�r�P��U)v�8�RZ�M�1*�
� M����b8�yqM�D=�����F'�'c���6�N��5'/��+�*����?+���s��7�gm��
��w�ۍBCB��,j�)y83$Q��<)֘ai7�m����Z �|v�B7a���c�A��`�>��a���\�|��ꅺ����[�ΤU����,�-m|��9������>�d�����<�aٰ��W�WY��i���:��Ktӈ�!�j��B��tk85m� �}J�PN��q��'�l��9�c���&V@����,��fV��#��	�y�~b��!쀈�
/��!�Q)�vN@���VHDioҶ*
�����0�T�g3Y�e�5Sg؍+�xK�wB���LvZU���仸�60��[ώ�;��rw�z5k�FEC%%Dn�/��@$VQ�e�εa��ۻ&|0V��hw*�N�*��v���dmӝ
�ŀu%t�)���1Ô���H=Q�-��E�/�N�&�&C�)
�ԅ%�	�$'v٬�ڗ������]3��ei�oЮ��G������-G�-޺��ty#	��_�N�?N�I�!k@��%�Q��k�(��ĝ�c�Q��y�y�/[��wqg!�M���KH�z7�s�.֝ ���X>��H�Z�\��;	 �H
�e�̮^C���DZ�����l
ɇ�o(&6ځ�5���~�۱�К�$�Ȋ9�fw܎Ì+{���v|z39=���G��Őt�b�(�I4JY�ǖ4�KA�����H`�N��Hx�/t�3�Ҽ�]�X�r���<[q��N�߉�
�����f�>C`C��K$*�z��偃�G>F֒s�i��߂�Kւ���EW�λ��s�C8^�wԔ��|+�p����ǝ8��<�3{�8�0��;4��M��y��:1!ĥ�&��d��j�Q�zJ�Hؙ|Tz����9D@Ah�٭���^��g���V,�Nkyk+�pg�N8�`��W��*��4�0�)�@iA�r��0��@���xD�X0c�@!Lw�'��
F:;v,�@mH�;��o
j���!T1w��%�Pj`���R�������I(
N�RG�.���s5�3��Ӝ�eOld�W}���'^1�1**��)�HJ�T����ʼndʫ�c�~���O�wd���Ч\���r���஽P��/7m'�^3/���PK��mW�87�l�0 setuptools/_distutils/version.py�Zm��Ƒ���bµ��E�$WRN+�W�E��U.qŎSW��5��hA��KW~�=�= w#�*%�������~y�{./.Ub]UW6u_ߙ��<����%^���LV9u�����CTV6���N�yv�1�ѩm^�jo0��c�ǰ�Γ�~�%J��i��ֲ�5.�U��I����h4����lb��S��V�*MQ��Ah�9pj�gF&��F�{�#F��Sv��R?�Mi��q]� �Uu�+Wc�_��6�7ɵ����O�����<w�]\��B�j�)�I��i�ߓ�,h�[������B�Ό�@z���-��	h]����#d2���ꤥIԯ��2]O��X�	w:�ɀ��o(�u��O:��۲����D�eW6�:����L�<R�-��&!�������suQ��$3� �'�1�/�^��z����pS�^��>3�Q�B�����6q����ʚH��	��jg2S���0���Z��L=�$yp�p��ybD���eb�ZB*>�u��l�ki;�V{e���,�
E��҇�p6�M�d�#*�rc�x���k����
(a�nJf|AƓ��|q!�{K�f�����R��=�^�a��E��E0�P�&��l�^O�N�8�/b�o�p�3l7ֵ�C��2
ǵ��1�V�
�<��kY#�+!R�<�̬#G�t�Q��~H�V5l��3�v���P��8�x��o�߄�t�M��iH�k!������L������ӑ�RE�5�i��S�ͯ�3��Уm��^{�Y���z#�Ѧ'�6�JL�Ǽ�	�jo[��x�1�Q�����\|3`�|&��}Q|;`Ⳉ�[a�&���c`8Q�zvY�� �c��8��͌	��<�φˆi2��}^�<N��z�4�=�5&4�!���Us��
��x0��k#�z��I���̊"�k��T�1�nQ|����hЇ��
=�x�9��	`p�Eiis���Q�1�q��HN�����6:���w�ڟ�
�1g6�O�0�"|*����i�-xB˰0�z~��j��#q�)A�.�
}�=��m3$`�z���<�Q_hð��|�o��^gL<u���Ȏy�l��&���?�74���AWt���c ��n�{�8N	��UN��MW_�.�V��}k�]������n�;�A����sZ��D�Ni$�'y5w�L�\f`+1�\8�	T��3/Mj|F0�� ��7a�D���A}6�>5�X����f�dđ�86�w�72甿fS~�L��)9 �N	����9F�:��G+-�F��`0`CGz�ݑ~�D#~�yaZ�\�E���J�
�ebJF�L侱�|Si���(ӌc�!�il��m[g�z
��"z�=E�A��z�`Ή�����ms~�_E/�o�h>G�U��f���̓&�S>��`��U��h��E�"�<�Z�!Wq�B�Eэ/�ɟ�hwt`w����"���P�-K��b���R{�p���H�mj&�'?'Ϧ��H�äy�����ӛ����Yt? ���?��O?�U�/��77���%a�&ʆp>@A]!9�H�c7��;��!�����AB>�?TE�~?A���?��LlF
ZdF��9|^��|��c���vH}��r�V3�|�^���`��g2���7����৘�a�Ի3���vb1�3�4=R��d10��\�վ�I����b�d ��j� e{!�a�u��p��V�9!����h}�m�r�������i�~,����Ǥ��l��
'@���:���J�{2��N�R/����-��p�;�s)E�7}�2�YL����yӳiL?�y�կ�7�}b�m���?fc�1C��3�n1�8?�7z��7Oqlk��9U�`�����;F�
��
���Ze�ܵ�B_;�5E��A*�y�k��`�בF��W�#�rH�ʓi�nj���G>N��`��Ƶ$�-�ߛïz2!�����T��-�z<��O���{���#7��OP:uD�+�����@�ϐ���}�U<>��亿�))�(���&�,����A�I��:€��}�����a����K��� Y̒2�C^�}w���P�Ш��:��+2��E�~�Yz���'LsF�>��V�*��v��.GB�
�q�^�cTYYM�.�4A�jr%�G�-+ʚ
 �`�|W�bO����u5���.�����(��b��
��/��;�B�.�1T>�w��?�����㐸T�.�P�C6�(�2;n
$��0�Ϡ�rw�y�D����b��h*hS��I/[���5 ;g�	�OoRo��;��N!-��MM%'<
�.с����aQ��$xД����^g�W'I W�iݦ�B���s�"u	�ŁA���97t���QQÀ��P�m�Z} ,���^�i[���re'⣖��=2�;�~i˙;S�+�EE��;�S�נCr�
�]9Er��^׬�s��乃
C�5�L�:-�z<S㍩��|�0������b����Z�R��~�t�PF���V�(�t6qN�봳�\��gDCi�`ıv����6�VP]Rz��y����-�����5�V�L'�K�9�I[� ׎I'�P��j�3
�s�+5mw��d)�����	$��խ1G|R#�Zj(�["wĜ3/��+ynN������vkbp�*P{:. 5�ٷ`�z���(8����Ej��^�!�C�.��e���^D�Œ�C��ɹ�b��)�!b�8(7�!3o#/ۑ�,z�#�+��-8>�/
���d��K�E��ܿ�Vz�=��cՙ��w�ڟC v�	Z
�g���@��{���Ɍ���wyZ˭���PLĸ����%��b�5^������p�
8�;ש�e�s栩�-eF���!��LSh��j%85�PV�������Ȥ9W��D�x��Ь��Wb\�<K�NAb]l�]Q�}^�mM��Ad�wq��x�}��_��l�*#��
{�I��m��&
*�o�nj_�h��,P�;0���=����Wʉ*s��g
]�؈��(Q�K�363'ͽ����t���'����,G[R1br�+��f�$t��32�G�$��w�ޔ{]��.p(��2��}���3��HʑJgGaĥ%P��0��wM��_�+{SC�+v�X�>b�>9���c1�O6*����Vª��[��)��M�62�K17|c�\%pMⱑMl�c�b���,�ꯚ�ߌ��=0o���(��2�������ʪ�6����{*�+�F-�#��ܢ8*�4�r�1�[x����H��2Z^={6�����Q�Tn�����K(��z���ݸ!||䌕�}g����'4�j[^o����$��k���;eS9���dX~�m*��n/�DZ9�LHN~g���Ǝ�cw�P���<f��])�D��eNFkiZ8Ep�
�1wYX"�9��M		�E����	%������%ғ;�E�@T��.��>eJ�K�y�?����3
��g>�i�#5�{LҰ��1��͡<�w����o`T��Pni�1v�(�=�;!�*��k:~=N?���8�^���ܭ>�����ou��9�/J�Ė2������+廝b��g�%�M��͑i�Gf�Bf���?�E�ѠCĄH������M<���}�=#BP�o�M�7zٽ����~��h�
^=���y��e��u�߯�"]���_�/���/waW���ժk���RҳzpL޲�����/6KZY�0������'�i2eTB�~�r�I&#�p���g�Չ��OìA���)��
J�U�4�Nq�{�Մ�s�M�h2[5�^(�F����Z�@g�j�6SW����s4E��uɦ�ڻn�v���ERɨT��g�7X���K����ږ��G47%9���!S��BA����/���l�Kq>�z.z�<i�t��:[~��=��<�e��"�V�v� �֭j8���v-a).~�u{x�I�ʠ�Z����f7��}ީg�}��Nq��<�C�z/�j�~�"OtӚ���
�7�\��G��e{Y�_Ӑ
W��~T8�׎z�d;�x�Im��b�p��1}yѯ��{��?PK��mW2��
)setuptools/_distutils/versionpredicate.py�XKs�6��Wl�dD84Ʋ���R&�ig|h'Ӥ94v%��d6|��l+u�{w�OВ�C����o���~ˣm�a��P����T����s�¯j��F�<���Q*����y�7��"/-��y�bc�6N��g6/�B����h4*��F%q�^c��e��E�h������_������vz)�_�H��Hx��S�}|q!F�������;�
� ��>�������4^@��8Ґ����km�!M�Hb�u�26�^����~>�?���?���f���7�իz!��&��5Dh�(�k`�>a-��b���A�(��v������*ݵ�U���ߡ�ܬV+��3���9�*^W��`��,�H��2��b4�J�����K�[��M
�K֚]f��^���N+�Oh"�a�̷��Em^�T�0���_��'ɧ�@��z�޴�>����3�qh��oA�$�5�ܐ��#�!Ϝ�L��f$���Д�0�u��9S�x>��
�4T菋�.��j�?�ȓ���#��$�g�ɛ7o�du&Ƣ���Z�2S�^����j��]��
f�LyXo���Z	⠲��7:�N{Iz�?{v���0
|A��`94}٭�0���w���m���R�H�z����@}���S`�[����`�>.�Ӄ�(�u���j�%��^��*����A@l���L�L�ml��xƅ�4�f�t�K�,��d��8cۍ�N�M����jǃMì˲��b�X7��ɸ�S�Տ��~��I-��J�a��i5>.����T@�։��)ڈ�
C]�n��l��:�Z�*�${��0���	����3V��A�O��<}���{�$�A���!ʹ��y��pJ9�Y� ���K��-.���2n܊��RLdq*�3Y��糪$����{�%*��6%���P�q;�B�΀�͊f'�R�Sg��=~X�j��;\X���"LE���+
a��0�{�ذ
4&�E@5�DoTr@]0�l�naO�m���+U�d�q��jK/����)�y�'X(��T�N~J����ب%�@�e����.���:hb�L�r�z����}�9��$����;'֮iGr���	����ȞQI����Ч�K{D;��t8�N��Ǣ�N;������t���?4�%dJ��qIb۪(ܣKPȪ���˹܎CS���}��̞�մ��ҳp$�z��j���W1���_N�\B��%�4<_z��`�H�J%z�{�'�����z�Ku2
��#�@Ã�B�q��v���#з�E�:u�!���
l���^1�D{*��
7�Q�bV ڌdM>����8C��	�#n
u�9\�i�n�#
A�6Mwm�D��N�"�Sӆ�1�ֵVqT�'���U�n1�HO+��|�"nkk� v��6��
�é��|�f�ZUwF�D�;��hL�ep}:��^5݊�=9]���� ���h�gR�(�0g~�3�;Rw��*��l]��	&N:���Z����V���\@N2s	0�ϕ��mHʀ�U�k���Bl�9�Ke�V��<Z�N�C�����y@�+` ��I�r>��N�!?���	t<@��^l�|�P9h�ܨ`��5]|�A�ݥ����Eл�ܻ�f���p��s��qi�˖K!޾�A7�E�Ӂ6t�v��G����#�>v��cJ�r
�0�j���f�)���ͤ�H�SA��\���*�'܊8�)����PK��mW;��*)setuptools/_distutils/command/__init__.pym��n� ��~��{ȥ�D�窇ު
�ac�`@쒟�/Il�!p�a{��X�,��V�yFo���G���֏`��h��<�=�s K9����-A���*V��
�7C��l^;�[w�⥉�,M����d�p�iG�+f}��sm���We"4��Um���A�J��*�h,�R��
�)���qR���t�S��H*��X���&b9�D��&�>$�gɅe��Ù��M>Wi����ꪏ U,��3M`|�^�l�-�X�
�.S8ZC��p`I�,v�{~�_PK��mW��n1��&setuptools/_distutils/command/bdist.py�Xmo�6��_qPHZm��Gc��/��A;`�C�-Z�"�)�q���ݑ�^l)5��Cl���sϽRAd�Tu%
�l�~�d����lv�/��2P�8��rZ�y�6����u-�
��B2}\�HL�5�R2N� ��ľT�ef[���?\shVr�OE��J/���2���9�Ҳ`�V�l6��NR��*���B��BVP�P[`Ll]ph$!b:���[@��,��~�@�2�9��=����}�4]���?h��`�N��a�8��	+K.�(
���l��|�n9�;��\ݽYű�Yj^UǴ$��F�=;���1��~�;^�Q�����,�}�)�1\�z͞�q����@���\��݁�Y�S�9�x�by�f�_�s�p�����?T�z5�T
�����B���CM�k�B
΅d{wj9y�b Y�@�_�#�k�;��(8-&�D��.�%\�8��A~D�$JL�1�c��1phd�iax�Tʳx���ג�M��9	)�
��s5E�]K
mYM�2��\���+<� hnE)"���jG_)E��"�U�"y�ߞ�Bн��z��O$�";�Î�.TL��b:
6��X�l�<CE�U]ZT�$�$��N�Z��^+Up&���\#Eu�/�*�BZj��9wt@�k�R�������6ǿ��v�[�B�
_�!S U���S!kʿ�隊kʤC�Fc�є�T��pwG	%Ê�c&�
Q�pE��s0�h'b����ۏ��E�q��y�ׂ��s��
����{��_��!I�9�.d���#��/IS��3���TF<�K�'��@�PV$�$��o�;S!��fl5[�
��3L�e��X�9��'���%�Ńm�y�_��s�!D�
����Ə�a�pZ"x�t�C��ƀY���Fg���a{��X�6-[Y��&AN)|:N�XO�X��o/��8����B�3H��1�ii��i�`��mgC���٪�����7ueKmfE��sf����qs�5�z�����heԶ����L<��WT+��42����4J?�!��
C���p�Ǝ�v���n>_s�=�H�>���_�l��e��_i
���3f��{�Ә���5+�5��e&�ۭb{��h:}9p��Z�9���P7���hpl�oW�Ɛm�q'?��ѷ�/�G}G��kہi���US�{��k�m��<�vUj�Ƭ9Z�{앻�|G�EI�G����
�6I|�^�zŪ�}	W݆���4Q&)Y�K�TBFݮK
K��|��x�:6�
��KSk��7d��\�N��9)>#G��q"�z�Z���1�
&h��0L7o�?��;�럫�L�ޫ��&ڭt4AV���^��pFi���.S)8h���+C��Ɔ����R��vZ��+��+?������i��s؉�L�^�3́���N�}�!��z������U�W��go^����O��:�B>`�eyxeB����g޵*�Q
9ΐ4��k@���1�9��"�7����f��Z�y��F��(�+��ai�W3d���O��Ӂ$�ܙI;c�m ��/�<C��E]$�����41�ى��Dz}
��d��]��
��ާ�l�-`B�����va�9��L�96l"�X�D�=�%.�^��
�zx0�7�p�WM-
�<���ۭIZ�y]��|�\MCR:-~s^)�đ��PK��mW�wq1+setuptools/_distutils/command/bdist_dumb.py�XK��6��W��l�Iv{ ��-����>;0��N�c[�$�L��/)[~�ik`&vHJ$���03ilceavGU���v�*͚���u�%Vր=#��!�"�,!>jA@Ȃ�,l��Z�PU�݂��n�cAT ��,?#X�����3��PûZc.�@����1m��]�A �Zi��V%�C���ֹ�
��*'�i]�+]�2�ӱ��R}��j�
`e��F2�涨���[~7��9�*���{VU���t�L�b�NAp,�10�w�&�Ateh�Z�.�{{l>:p>v����l�T9KC�Oq���r��6e���-��";(��x���(��6��ɱh�cr}�8b@��(�mY�n��eay �Ȋ�Y���3�e�,6��g������`�&���U/Y,�s1_u�S�Uf;0b+�N_�ǡ�xk?�m�_d������2��˪[���
6����XQ0��1Lp�MEu"�T�!|���*����]��W�(yuc	�JWL%r�S�E�[6���OU��~�H��T90�z���ۘ�l�p��3R9����;�ϖn/�AO���~�ja�8����W*��f5��N[Q�2x=c5�"�+�5o�w��hM�k*��^��j����կ��u�rۮ��ܶÃR�j��%6�Հ����nϴ��=�C�L�=R�\�kD�e-*���#�K+E!��w*6X���!?��\jڔ�7�rwK]2�I{o�"�=��I�a*��!�)mi~M�}��c�U����q��Frd>Ϗ4n��	�� ��nG��_<K���;�d7L�Y`�̎�y�I�*���<�O;4��i��q��)�-6>����ߎX[�/���\WiFs���	��5���"/�z�3�
 �{����0�E�J�?>��HFik�F`�I�X�
X�7���As���_�a���?�k>���1�S�T�Mu�ݕ��{\R�lGn�Q��<{4��No�)���<5͡���|��V��c_�I��űP~������=M�;Y�*;=7�(f�f�}2kC��Fy�~���/8~{��g�T�|?�\�v�N���]o̮%z�X_(mGj��u��?
�u��/�К��I��,�M���ggJBo{�H��ԎV����0)�ٴTYS��෾y䱧��ѵ�o�0���ò$�ZM�(�	��Yk|<�Ы�z�s�����3w���g��q�0k+�4�jn��Ր�dz�,@�k��W=�wy��}=�I���ؽȿ z2Ji�/���:��8��8w.Ԏ��,�i��0M��☂S_��(��qr�Ǧ��.�r �p�r��N�5R��ǿ#m���md���K��S���u�跜9� ӗ���6��C�PK��mWo�Y��"��*setuptools/_distutils/command/bdist_msi.py�=iw�8���+0��X�5:l�I�{�����I���t�_��G��ıDjH��t�o��?�u �C������ĢH�P�U��[�$^<$�d���IS�:���=��$#qG����]�>��‘�R�,o���2
d"|eI8\fq"�'��sem�p=�b�i6��0J31��s?
�"�2�"CB+N�'��=9�/f*�4OC
�M����E�d"N�U�`.��M�'�$����Y�ʼn��	C+	�d�W�X"��dнbQhpG�p��Nd6X<d�8��$
�XE����~���2I�$�E_�o>Ň�6ބ����q2/��Ef�D�;�\��u�t4�s�%R����F�%2y�U�|&r���g�ϖ	�}��JK�A0���d4��T�}�'
�j>"�|�߂K݅��lރ���x�=)���~F�ŋ^DP2Y�d�"X��:-�)��(}�7�i���#:4k&�?�=@�a����N�fr��Q��G �b0q��F*g��O&)|}us�:�t��Gy�f�9��o	��]KL�0��Y����8LҬe�@��rf�m)��d)�+�pk�*䚦QH	|؞�]�?0φ�0���~�+*��~��<�
���
���	�%����[���s���B���?�HK�JxoIaއ��cIfa$�z����k��Q	 a��İ�觺M�67��|@2�b�w�\�ڞ՝2��3����p&?�F>|��?J~v��E�6� �-NF��=�#�E<���X��]#���.��.�߃?H��~����P�O����v�mE��D(�6��&`/���xM��,��]W���5
)��*:��Id�Z��q��Sk@
,x����"N���8$��E$n?1@.%����4���CyK#(�JV$�~&[S@����Rc��}`W������5��y�\�Ob�b�N��T����x��{*Zb�n>U�0�� [�U<<�k�Ȁ���_��~g���lğ��x�ֲ�"g̿����{�yȀN�+����//��G���|c|�<��"�iN"�ßD;J��W�>�X�w_!���6+��/2�]D4�?$W<JGIH���(�P��Q��8�p�\C�m��*�s�ɠ����L1C	��ءvw!X8�i��8�U�2�=��3\���!�c�j�Y
����.�
��Y��5��~��|����H&� p2g�«��P��s��6ї�#�F��)��kD�I,F}_�rĻ!s�'�a�%�$�HS��X䉯k����^��7�ٮ
��q2�X2�.�(�#���P�q�@���HT�W�*� �]����ZR��b����h/���5��vQ���?���
Ǣ�!�Z	{r����8-T�$";�\�,s�����ބ�]���
,6����IL@*�z�J�_(2��U��Q��l���#�����8��ձ�`��e�U��S0�1�Ii?Xa���8�ϖ�M�c	#�8�lv�/c��Cߏ�h��QF=hq=�aN��$4��:4h�
��'�q<�~d����T�*-�FE[U��;�]�{������>���G�\‿���!=������Z�[�sk����Z�[�sk}n��}�j���A�v~��=���.�r!�F3ς��L)�l�E�+��?
$H���4�PIp�B��:�x
:�9�^5�k!�?�i�T��W��Y �{�T��T�8H�;��Mʾ`�����S�*�(?E���B�"�,�m�W��].�
�.#�ԊiE�ceJ�+)���,E���
4��cB
}�d9��)ɾ#>�2=�ؿ���� ��R�N��
�1
:��$�x%ں�f;��)�O��~6m�=�F^	�ٱM�qb3��o4�^5�W�CS�
)ж�=�����y,��7��ˈ�$�A�LT�|@��V�����O��n؝�E�`�z��B���lI� Us�:˥�0��tq�4��`@ѕ�Asgw��j͠`a�eJC��!2�@�� �j�BQ�<�|>G��8h�zūl�����n��/�T�X��̏ͪW�~�\�dz�=��J~��
���PO��*�Z�z�
pU�??K��[
\�H��
~�,��"��IY�O<"`���t�H6��5�>xZ� �U=,��7�4
�{\x�MP�RA]kL�Q�b07���DZ~���
����A����Q�Y�R<�5L3Ɣ�9�{�'���©��S������o�;��8���#
G�	�-P���Q.�Um���#������1�ޖ8#���(�wh�[���v_�}'W�(����i��e�sZ0���;JS��b*L/E)X��x�0:�`����J4�I|�K(@ݴ]�wg���U;⟎�3��B�hܙ��0��,�iC0��*�)�郿�RrfTF��H痸M�i�j�E�쏔��*b�_�?MeRRsL���P���3����M��hVX��;�A{;�A#����q��y�uxhhӃ;����Nwy���BCM���u��2R�z�\Њ����M�_��A� �.t�2�8ݎdi���$�kl\����lX������SQ�C%�a��DުU3���6�8���u��F������1o�]��:�'�78Y��y5��O�l~��N��h���TlZ6�$�@�DT��X8��L
]EuM��n'��E�=�K>���xtSb��e��"��뇦��É�����N�໮�(ם� 0�_>�����oo�_��$����
{l}��Pf�=�A����&Z�%\Z5~��G3�ҟ�m"�3�!��rA���Ȟ�?�JΒ���E�)F$�YQ�^�\P�jܺo?�y0[��&Cp]���0���널���8v/i��.�;I�y*�o/�rl�.��Z�ժ�d�6�.��(kR�î�L`��[h�yyY�<K����D-�>�d��f[�DF��2[[���^����ʸ��&[Se������0�pTs�Q(AY�Z>��ᬬ��jV����f-�(�|��}�{`�lxǗoO�\\�\ðDś�p�f��Z@�._�_��9~��B���@�j�x�E�9�v��z���C��<V�2Py�F��19��*�z��w�a'�ì�F��|��FI�tV���)���s�;&��Ӫ���w�;�ՠ�9
����-����dq��|=ki����G�0��R�9�1g`b�`hn�|K�O�_4hb��[+��8��4�r���Sʛ�
�$hMM:i��__������1D#	����G�U%(�8y�թ�ѫIڃ��m�בծ���1��cYk��ਐ��Z%�	�O��ޑ�o�Xd([�f�s�\WS`)�ŠŠ��2���a���'�##g1O��c����h2{�u�M�XF�$r�:���OUg�v�nF� .Ϊ�	յ���-,�2̒ad��4�\ $R�<���|�iZ�Ya�R)�9��G�z�
��*\�(�Pԍ
輦���e�p��Y{/�R��C�`0�u�MC<[f�&��9��D1v�.7I��=�0�	ZMKD?Lb�w�~V��5�o䀞5��6�F	�j��?���b�i���	����J�tu�j���3_`����4���'��L"U �AL�|�#��z�q� �MǸ ӫ��,*��@5?�DQc[c5�T�X��hm��vMvw}]�<>Y]��^�l��/�� �F�T�O}�z���v�	SH��j��O�]+K�L��r1q�,�E�k��M-l�"�B���aIk�S��[W�E@x3�����-�V�n4�8��|I�]���-)7*��	#��u�����o����E��������?�\�������݅���V��i'Q�0J[��i�Z^ݸ�N*�(�����r��8�����p�A����Ǐ̂�����L";r���宕\5W��r��������ӏL!�u'��v�Q-I}��w�@��� =<
[u���7�-\u��ʲ:b�6���_(O�[W|s^�;�|��jۨ��TU�ʟ�W�V��ӽ(��%�nw�JaH�a�0:�+[�-�=,�s,_����5ܹ��~�gK�����aV�O���{��YiXu�5A�w)'�����aIbK�Z��k����Mx7�`��\[�`V+p=^,�$.�]�*�e��jܸ�FsLN�iϏI��"����ݯ{�½ ��J���_�S�2L��`s�]
3פ�V
��B�1�5��TCP��oW*Ӷ1i]��	ߌx���-���W��ڎ�;���8
•��(h/�w��Z
vQUn0z�8�	Tz����t\�Lg��+ֺ��]88�t�u>�F�j]��o.��.~6��x�޲1�\�ftl{Q-�U�ģ�A5:ޟY��ӣ�r���T�`�&��<��pJ/�)����e�;nJ�D�y0�q����Ы���^�R"�՟���
I<�\ݒ;���J#��^���3�7��	�b�[$z�@{�g�KY
4�-�Ը���S��$��C��v�%ˁھ��e�S�3m�[+dJ�3�B)��L&�8��FlwL3�x0�{<ǭ]Q(�sqd��mw���������@��^�Z�+'��wI��ƎF�cD�~������)�Ŧj�`��5��,h��Fs��6�U�3Z�D*���T�7R�,��W�lŖ{8-`���K�}�g�6J��޻�����/w�Z�M��b<̰��x�o��1n�[�I����?�+�-���%�R��<����"�WD���._U�7���.(g2彽V���݀�Io��!v���ʻs�����Y�Ԁ)e��Ajb��)[�Y�gXߝ��Q&L�ry�S��r6���j�X�@i�"���6�4gE?g�j�(Q�$�v�\�,5
��}Y0|�ij���YE0���C��T�u��Ρ���|�5Cυ�3t�DQ{ҥ��(9}.�_�j�wu�������p4�<.��W���,�B��-�ky�1ݯq�߫�S�JX����X֟�s��i߹SC$U��pk�ࡋ�al����;ǁ u��SE�U�/e�̭
h���k�v)	J�M�&h)�Q��&ޥ�nU�X�.���� R���Y|�
׿p*�@��T
�-��Mp�s
7
���9/�]h�c���	�h����`|�>��������:�SՂ��Y����;.�jVnA)�S0�c7g��)N�,�Dt���Rw)-��(��J�^5�Z�p�����tŸa�N�B���\:�����~l�V
�F���KѸ<�z��T���e\)a*�&!T��*a�0��
��i5@���kɀ���y�����aÈ�e���j�w�5uޝ��t�K)�2�F?	�)J`����?-�"}
�fK�_��:<2'���=��%��\{u�睅Q�N�i����j���*�0��2
$V'�$ݳ�:H�V���͉-�burO~>O鴥R>�e~�EW��T�u��\������V��:#����H��sm!~�E��/B���22.n���^�a�n����0NR��Lb�5qG�5���Ɵ���\*v�����!���[��Y8���E��ܷ2IO�mFG���cI�a��Q�Q�NE�,
,�ڲWQ�
((�֘�K�M��T��Oy�H��U�(%ȫ=J,�e(ttC�����>ʰ��BcrT~�@�u ߑpU#B��S�&'����j��ƣ�Į�(Mq�.
���^�����FR�*[V~kW��Ѯx2�4�<z�{�u@��M�%�/�/�ʪ�&����>kom��I�x��!�_��.uV���$-f�*.�Q�g�,uv�@�+�<�3��z�h�a�vt�Q
�
H��v\Q&���5��]�s�Ɖ��:>��h��n���Vkи�c��I����r��&���l�Qp��H�`�K�yWc7|ࡄ��8�ũ�q�/
xc��8�˃"�ZKYg �bU4*
f��ou�n�{������B��T����* 	�Z�	�mߋgé�!�|ʼn4�C��Ϊ��m�h�!���`��)��l}R=`�|w5pS��LJP����i���X`r�����)��y0O^>�#��X�7���u*-�ӭ-x�����&l�
���`�q��f�k��bd�FVI�1��vY�³����`�Y���:F������������~o�wx��(x��v8�W�d��]x�.(��^`�w��Z�`FPb̟�Voυ��L���٘Q�z�\���8��A�B��x���X{�!�R�@�{��U~5�f�A���?s`��YJ��y	0�:0�	Y
�l,~c�诳x�τ�K	��"��r;ƃ�kP�,������aև�֙���	��Yh��A�9z�����
��;���!^
܁M���׽�G�����X�
CANw����[�n��V�G� 7b�=2U=)�n�P��!bD�_��ȵ!�S���~ȉ�QL�0�E��d���}�5��aЩ{۪�j�2i�[�&�aw��g���B,�g�e2��t��f9p�T�r���pN��+ݝn�B�ӂ�n$z��<�
{�:��b=%�����\dJ�Y�M��.z�$P!A��zӖ�����xm4o_{���ɓ}�
�Z�e�Q̦I��LK�C���H���(��]
�s$�#�{�̆6���v����3(�mGN��.�v���F_���5	���hQ�M)Ŧ�!�aTކ-:go�:���\�m��B���ѳ��嚖ǿ���9A�P���NȦ�2[��N0+'��f����4�%���s�zQع=�[ө��0�KF����PmX���t� �Nq���3���>Kl{�9e���ZQ�CX#M�]%�$���e�`V�~ª�Fl�I�@���š�������[xk�2?��O���&��_��<\��:=�>}I������*.z"��V�%.Z����UQ�W�rZke�������k��4��<�&��U��B�
�1��ᆪ� ����"GI*�Vo�&9rg��x�$?���yV�J��E_����*J��z��\@��t%Iq��-:~$�x���)/GFz5?ʞZ�S�SM��i|���/��$P��v5���.���R^-�����< ]�!^-���Fd-7�.ek��%�3�8�Uɹ�bhE�حx�7��z���y��,	u�b�K+V�*۫�/�l0_"ԤE9.L~ٝD��^��0��Ek�����u�0�����T	�o��S�
��;�N��eD���y�a�[?��D����>��B:Y�t,I	��#�|�IB��PMc�������Zꬱ1�Fv&��F�$@�/tw<�؅2���<��^U��c�~ $�$�BQwx���i��Y�׫6����_~~��l!>�&��ʕ����~U��'��3�K�<;�' ��u�&�P�򵓔d�&]�����;�ga\J\$��$F�ˢ�Aܔb��N{��e���T����ηa�,����.�ВO�w�Nr���0�;�Y�9�1yD��8?���ӯR��FMj��hHX�k��XG�}Z��T^���P���W�p���^��d7�v��v0Z&�͍7Q���U
�
�4!����D�+*-`>��L����^�5̏�Ą���aE�%�:3��^��h���s�������nީ;�V^�[��댿l�w���ޑR]�"l#���)7]Dg�]�:pW�u�,7��"�0�$�\t��]���O�#���Yô��"A! �buB��	�"���T9�<x�A;hG뾲�hn��c��ʼ���*`�	�\�f���$��[��&��JK���Zb''�u���+�fP�_9ru���$[fg��^#��������\����חQN��vE^����8��^NJ4׭
��x?�mJ�\���7ͦ��:[5w�>7n���h׿��x�����	����]����e���������)E��<wg�
`���S���>��p�0�nM~V��R���-�{[���U�pu煟x���Oj�g�d���|�*2�+�+=��+��66���2P���*Uce�֫Y;��m�e�^6>	m���2RN�)L�K�r���0�����h�+�����x�"�y���j�${��L�v)
?]�d�G������K��W����:��q����.ΖrSN�~4Q/q��1�����ZxU_m
���C?Z���6�K��2%m=`:��6)f~�k�>�ޫ��=�7w������Oo,X�	�Sm[�?�����S��#]�u�*�ވJ���9�/��+i`d�hF����	;4�330L�cD1�0��L�D��q�<=������1��k;�ЂN�W9�.ѹ0�*�	ăU��lV�=����!���z��jȜSJhs�l�+9�57���7?�n�2��*�(�J�e���ۄgXz
��~%�E��=�e��\������vO�9������Au�V�Ƿ�ٺߩ�&�.�W�`��-��CT7v�𘍚����vR�^����|\�i�%
�>���$	)�3��!�ټ℞U�o�w#�W,l����|���y�B���G���e�@��2Rk�Լ�%?u(?tȴ��W�w�<�oPK��mWd]�v!T*setuptools/_distutils/command/bdist_rpm.py�<ks�8��+�\�������eg6{��$�s�XIS$Çm%��~�
�@������L6��F���d2Y&U��IZ��|����|��²���)��X��쭂e^�19��qɣ����Y�7e�>^$YT��L0<Ϫ�|2�$�"/kV5���c^U3V��:X���鼕�I�7��
��f�`����7b��<į
�Lj�c��e^V
����l���ּ�]�ɳ�����|}p�QU�V�������gɫ�L
�{�&R�QF���8�M��0'�
|�����2��⯼;�3>k߲	>�%��ܱU^2"�dk�h��6�U��LC
�?1L�b����&E����p]LX�-y�&� �&�w�m��-8�
'��/	1
����}��[z:kW@�hj��L	*,Tf��ϑ�z�bA�y��,�B\")�z�$��Լ,J���MT.�8_r$�[��hr#�vB�.&��6�\tt����)��Iܔ%lw��\L&MZ�88�Ǭ�k���z�Q$
al`	M���
���〽,�%�x��Ȧ�y�d����JS�Zɛ�k�@��1�Mۖ�Q�������F �<Vz*��uS0a f��2Η��ֹC���a7@,���������Ik�&s�>�d�#���P_�h
V���M�$��M�#I�q@����zƢ4�Yo��E0gV�.V%�r
A�,OR�\�C9�4����J�Am���#9D�$Ys;5V'}�I�
��Ps����dy�������I�%~d��u�7��*�,y\���m��y�^��I�(�x��\Z֘�|���k�5�/����$J�F��΁�<[�����x����9�����_����W��Fv�F̐z7�m6��>j@�JF�U��0����޷�E7���������#���Y��y��p�NACPi���k-��_S�H�T���0--M�7Q�}Xͭ0�%��-)E�3q�5l~�t⨈I�Ը7$ �{;����m-�ڀ�ݏN�A�1X��~|bw+xv�ԛ��,��3f�����U��?ݏu��V��r��v����˜��­�oA��(�
��M�j�Pd��@��L�cRbl�.�f�31A�i,\q^5�q]�D"5X8,�XTR!�6��F�����p^��8ƫ��U�+�|[��$��ᇳOồ׿}�&.��@���#$�� �(�`o!�e/�~�����%���%�١O�m�=��z1�����%��M�_Uv`��@_�-;�T;ʊlte�X_�ص>
,�C	/�;;?>c�=جV��k?����ߟ��`N!���ӽ(��?�>9��L$����T����%d���*�ϧ���i��;�}���,ӛ��קw"q
��j����|���v�!Z�I`��-D�qR��ũ�!|�Ij��M�������;�h��e�ٙtY�$~���a���k<�#4�5hj�� ��s\C��b�5��-sǑ�1����$��5X�k�T��w�1�'���9rr���#}*?T%
"��(M�q%���jz�b�?eՐ
?�h��׀{�%
'�|)j�W��6y��(�4�Vd��~2E�/�����lJ����5���^���-H���K�ǡ�D\oۤ��r��χ�9����4�c dx����6CI��8 h=�0�=  ��"	����e���"h����q
�8��g�큛lFH&@��l�ː"�ޫ,��$�ֶG'�q�,�|;m�x�Y���
x��e)J�`��7�bhƵ���S����l�bGKBa
`J��O%�v��X:ƣ	��Lvy#��2gA�
��E|/���6�y5Ǻ�<�|���Ao����2�	���Us~�㦎)7�yZ9�e��]��������'����AWt�w*pn���l���iS��W�VKv l��^1�Z�[o��3H�al_2��� j��]�{�R��q��%�B�d�Մ*��j�;M���)�#i�QF�B�~9��^�'D��}]�����]N]`�)Ƙ�>�vC�s�$C~[���[�ӣ��q�:�f�5.*�+�]3,Rm���<�#�0t������8�l-+�@�]n�LG��c8��=��χ�/�^~_�x�
ު��ڟ�"2>��B���ԟ�R��Wq�7b��"L򌽑T�س��f45c8�R��`�.�d�}���ߏq�ŷy}[{Ӿy���2���/�Li[H���t����	O�̣+�
��dt�
�|�r�`՛2:��БQB�0�c�R/�����ƪ���3H=�Q���Y��X6Lwñ.=W42l_�&�?(T�W�އ�Xy@;X=n�l��{��xz/�[����Z�}'�mp}7�:��?���O�C`���yi�d5_�����"�8�O���U<��PI]EMY��a��}�D\�H'|
��	���`�T�[�PX��.@ٲu�:���m�J#�b�TRp�6ɸ��s�eD����]Z�i�l2���� �*���'����:z/{d��r�ʸ'3=w�v�VO��ZN���G���R\V��P�&�ν8�-�X�>��pӏ��W�|5�c��c�$p~���K�"?~�|��#�ȏg�o����k��.�����,/���J{fl9��g���E�H6/u�l[1�95Ah��z({O�,�ڜ���(g>2�1h��A����5��P[�=]��,��H0^sGYdL{��k��Z�h�-�C�狪,"z���e^��i�ߑ�v�v��|�F�W`�M�3[fF�n����C^!��-�*�N�ɢ�G$QJg���Eא!�Z��\_���/G��P|��K�Une�Dc�p����imx��HT����.G�s��#�k�a��f��d�9�*�$��t�p-��/�.-��֕��bV(�6ӆ;tW�W���a�l�
�$��pE�$� /!�� �� �cVA<�怸>�
�:5j���c78V�q@O(Q��vI��	L���ժ@�C��$[�s��=�XUR�=��
AZA��Lo�3�#�7IX��~C/j�Bu���>ԫX���:P.!0n��nA\)h������䧭��e�="	(����j��F��3m��Y|����-��f��	��Ov4v���zΛZ��b$H5t�,�y��\��ێ�
[,w$@	�4�f?���b �z�q�]�2��r��wd�Gp�]���W�����|Uc5
Fh��&sx�+�Af�QwЀ-叧����W��rۖX
f�WH����f�*]d��n
	~LG!h�tFfN��"B�V�'ʝ���ڻrS:�?�&UaGĤ����l��Oe㰤�{�l4��$��������_��fjnE��b�4�����e�C2�S��{ч��6G��e�1��J��"%D-[�hE�餫%h'$��qT�"Y��5;��X�ݲ�NuT7��w��-l$E0{}�1��X�.JRѩ'#�#Y�.yQJ���ꩶk�2C��7�/͒i��2.L�
�]{�O����Կ���%>�QxQ��l�Z��%	@,��ot!�f�3m�5ێ�v(/�e\GP33)�Q% g����8�����v_�25�>k������	�
�ɸ�2}߻����%r�[rdן�MȱDwY�vNwZ��Y��Q�0���խ[����s�E�J��gڨkFs4�LtTs{�#:
+��*c���7u#�|
��y���K"�����ˢ.�]�"|����KлM�:--�`5�TD��2KDZ���P��N���X�b��L���֤��/�(��z3/�P6��kp6�=��R�@-�`/V��}��5�OìhEm����\�ʼ��-����駗��>Z�86�PLL=x����!I��
���y|�ߌ��e��0��'���;Eq5ľc��ۋ��:�墩��bO~���{�:F���ӳ�V�#V@(�a��I��(,
��01�Ū��eX�H�o7��Gq�"�*�BL��ɭU��̛
�
>�0%�u./�^Z��l,���Vu<�7U
��eSTD��d|��<���==��oM�]
����^���b-�ĥL9�����:+�Jn�rWS<�����s���de& �,V���(}�j����uq���YW2���iRU
���9��J����V��o��F��ᥠ3 �j�h]�s�f����]Z�!�񎨺t�eB�@�
����FހVw�r�H�Z�+�uݲ5��;#�}��4W�a5=��	_�C�1��"0]�qWǂ�����|p"q۸�!�8�W	�
r.�6���ݛ]� wM|�H��@�Gא�`+����VdBeΉ�i_}:�Ɂ��|�Î��p�&d$tL�ix`D��L���rƲ�Z;���{j���_f�n���
����y��ŷ�E�����wM8Ib��J{�T��o�j�
���W����y������@����P@���jwV�Y�%T}�c��iw�j���\0#�PX#����9mI��#��������G���x�4�<y�c���;S�C���}�\�B�i��A>���C �����45��R�4�y���ҟ��-Z�v�6���ת�~�h�G�tj�)�r���w	�.T�A���۫M��S�|����}��3,��tl�BG���δ��[m��P�j�h���	�����x@خ���k��>�c5�^&�:9pw��(�0��{vko�C-K��
��<[����Y
ErF��h0���!���tk���B�Ӫ]VG�t��yz�$������AW�p�s:s�B��\۸����!a����_��9`MQc�h_O�C�5]K�u�Wh��m!�eHmXa,.uL��kqY���̻j��g���Ct���$n�2��3�2���M���xv-�_M�˸�<!������sP
l��߂�W�:v:HZ��c�mRAh���G�#E�v���;v�&/Pu��8�{���B��u�D]l���"]|�~SHÅ����T�R�!H*(�����3���v;׬�L��������
��^��)<����̥ �-������'��im;�D��Y'��~Q<=�Fg�7�d���
Jec�k�{Kg�B�F��Ic���t�ƉC`et�⥒-���gU4���&Tq�7�$�v��!sj�7;P��6��۵��`��fj�ҌG}��gc����)�bCQ��{�2Hx)~�b&#zz�T�+zO��ꫣ�l#~\&~����~�UFb=�V�O��Ѵ):�A��=:v�hg�9�]�Qq{�KU�>}�ɜ�PF0j�t�+��*N���G5M�b��r��iI��B�gj]��_�}W,���Af��@�v�!T��x��=[cz(;m�I;@;�q^*�u��Syy�~	��A�f׸Փ�w�}�c���I�۷�ˌ߄�5	��B/� VOm��l�,G���%�x�x��b0�Ay3y�H1u��^���O�,\����1�m�ҔY]FI��6+e��[�
����N��BDajv �� z�j�?PK��mWd-�E�>.setuptools/_distutils/command/bdist_wininst.py�[[s�6�~��@��"5#q<�dw}�:�Lf��js�L�ɩ�)DBc���=ʯ��@��v�V�,�F�/_wCQ�nڦ�t����E�Ư���.kݜ���*�u�Y��;7�����W,W�7�q�
y�>�U%ԙ�,V%����(����A��I�>�c��+ ��g%��gT	fǼ6���_7d+��P�f#�~8�(U�Ub/oE�(!�C�RRi7���1��zSn�e��N�٭P���`�X���Y^q�Y ���mquv��U����%v�"'嚁P���J�f�[��;��AdH�Z�L	
4>$�W ��x�~��X��+jr��6�D�H��kpJ�HL���Ӥ�cU�5�C<��;4�cY#�دE{��B���)+��5�f�$���j�؅^D�"Їd1�������e���Z��\��tL�G�+����%bOg�
��V���
6��jv�I*����SD^nʜ=e��<����VA@�|�reY�p��BQ波,$�e��X��x���uQ�埴�|�’%�B��հ�1�\\���Y�rh��WlݖU�����e��Zk=����� ���?	^0����:�;����w�zY6�1�fvm�KÞ�*����<����V=���)+Wq�=�@p�4�O��.�cB���YC�[���_�r�2��>K\sM���
3��L��s3t����Zl0D�p�+�z�l�����
܇�q#|̽�g�}^��O�|�2�ˮԎ\-`!4�5�!�#��0��p��\h
��n���۷q�G�,�c�~��5�A��PYVO-�gV5�k9ˡ����F��hxH��8?��ɝ8�.gEXU�5�q���yuǏ�Y�3b�dp�Z�J�ڇa����Snv�?�|s�����A��_��՗W!�a6Di�_皉:�d���㷼��t,�!zY[��
�u�p�i!���_��MmX��zM�%ZT�%{�>yrs��q4�Ji7�֍rX5�In�"c�\�����.�\�c~��}9w�,�C�$wBT,1o�|+��9�hN���e�t�N��'	�Z	��p:@2�����B��$|����
L=E}�P���e����Q�̅�C������L2q���(5��:#��|l�7�NlRlJdF�ݸ�̺+7�?G	���!A40X�H�
�]�����*�/�T��Fv�t�<9�)�
s5R�s�v��p0� ��^��$kJ�E!�1�9�j�
`�䏈�Xܑ��yk	 j�x�����V�1��u�P.ԤV���3��Ét1M"��PS�˽q&�Q����M[�1焐�-��:�)��i?!�3r�,ov����~h�+
�Zc�bd�W�UFEӔ��+8��0�ˢ��,�� jx�s�d1�����C�	����+?�Q���C2,Npk�6t��E��j�ވ}�#nj#`�VƲɡ(0gN����+�r�4"��I�P)�r�g��hro�K�<h���wx��۬_�:�M�L�ub�8��M�%�y���Z	~<���A��:&���t�n\�!���z���a��A;��`���%dnzN�U�ZqU��@��dY#�MZ\�(�9!0�LԚ08���~ͺu�w F�b-x*s���̉*�qĽ��p�p^l00�#cN΅%<$�Ͳ�����L�k�P_?_��J�.�v�f4*@^�}�#,���r��D �E-x�fq����$��t�kʎ�Wm!��r��Sk�S����zL0$�u'(�"�Ԗ��\�×mԀ ��,t$��W�@��2����1��X�DN�-�*���
0��I��C~�o�����d#T�"O���F��F6�㷢â@}@��"$b�%�I\�@j
G�u(�ltW�5s$d��R��C��av|�P����א_����v�i"PRY��
ɠ�p�#�"�(b�X!���W/>����@k��������,b��1�!]��F��^ц��{L(�!pýb�	��`��7=g�j,��mr�s'�}A�O�q�  Ձ\k��t.X>j��(�&�)�{�	�2�9���۫�s#�� �"�ُ;8~�6��&���
�^�W-:# ��*���0�+�#bޟ���[�3����l����Q����t>��E�z�S�m�:�8�C6,lG�A��4��z%L�S緲,\
	�AE_˶;M��,k�{=9�u�]G��=�_ �CO.��b��C��ן���a��t[�(D��p����7��������UҨ-�5�{r�����<}�v*V��(\7u��tc�YWj��#<uܴU�G�QN�xs��?��ٵ���D�tgks���'p=�Q�,�:���sa�e�@�'�SnWNy���i�_���s�q�O�y}��
\�P*�\��dpa��{��f}���N����b���3��-I�9�{�D4�Ϊ��̜�����Ƀ��I�h�w��Ab��gYx���Q4���z��ۇ)�9�Y4��>���N}��mܖ��B�ઉ��ٹ��/y�����{�	��+9����Q�qc��qWD��Gs� h?�r8A������A������97������6�t@����u�F���؋+�7�ܞ��0A�=�L�A��s�Dkг�#�y��oj�5���V�0�){^V���0�_��jλyCz*�����u�>��[��ڈ�$�d֧F#@��'�(F�����BV�UĺW�� ޲��,�Nܸ�b1.�Jx��-�5�&{g�*7`���i�W�,0[� ��i���o�,>���*��៪e�T‘v�����igY��7���a���T&;8�"�Gȥ�'(�!���N%T�˹�9�����D���B��&{��Z\^��D�-�͏�h�+_�������uL�e-9��.�\h�Pw�W'�9!{��H�`�%��E�����n����b�.�Z����\=<fz���^���_���$��͠���A�=
p��䛭o�?��*>�����m�Ѧ��f����o��t�$�����:Z0��f����G���b�u��<�:��O`S�W\��L�9&AP�n|��!�I:��d�cC��aL��ʀ���A	鵬o��㎞R��.sYP��u^�K(���v��i�,Q�&z
�~�O�!�DH?1�
���<�_A�-����!�����ѐٙ��T�}_o���Sdw KS�N��$����6l1b��3�U#����ap�z1
vK�W ������庚�n'�J�q�W�������4�e��7R�99��<˜��qu'��_+��|�t���,�;T�2��x���-;Vϊ찑�"$��|[�n�k�����/^���}��]��ET�*��*Oԇ��=�3���U�f�d��$fs��{3e@G|>`�;eX���"d�u�����}{��^�������B�%�j3>3Z�*G�C��'`�>�[S�C͡��⭥$��,��DzQ/{����y��݉.�<�n�U��^��w+��!�Y6�3�^j�9}3b	����S�Σ��(��l�7���g���XC�bK
*�)��T,,�k���ߦz">�Q�P��հ�4s}9$�@F�
އ�zh؉p�����Ҍ+�]Y��"��9q8�;��ǔ��A���kL����uvk�.F�7�'��댊Jo��p�[����y�5�v�A���ފ�+�;Q�}����LBBOPm���jɶRze�	`�h`t��َhay��.��e5��`�h6l.�a���X.�N�M-�*Ql�J���x��Ï���b?Y �
FQ��z�{�V�P�<I�طt��]TnP��v�Ya�
�%�	�P��i�L�5�3QBg��Vm��hq���Q���v]1ӑ드V�w�+T���~��v��l��}�\_��0w��P3c-�h��ư�bx�x�Y�gwJb�{�z����d����$u����s��/��;��ы�U4�W�bQ���2쵉j���iJK�?�җ����`��J/�����HJ�{~9&5f��W����s�+���[�ƙ�l�����ಀ:N��|{}�C��~E��/�7�޽�����ۛ�߽��p�sqh�[Nך��y���ܝʡzsahQ��ƒ�1/<r��
l�����kq6�\C�;qx-j�r�)��X	���3^R+�_�†��R���=�C"ȝ%cՔX=K�4^`�tr���S�|7eQ��sz$$�c����,Mݡot�{d��������hm�4B����3�D��!]�����{�u���%�S[KU�[O�?�`���,���u?�����ݸ[��N�e+��;��M;�Z��t���_��eA��L�Cr�#�4W������@��ͦ�<r�=�_\�u�/����^~��0bpB�ѭ�/�>�pvN�u��h
�a�K
�@�vI�<��A"��8�6I�+�C�ca�"G�!���M�WRci�?PK��mW������&setuptools/_distutils/command/build.py�X�o�6�_qSH^-u�c��=�a[1�CQ�D;L%R �$�_�;~Ȣ,��PI��G���β��V���U�1�T�A��j�k׷����w>D9ȝ@Q>˲�Jt����l@��^��КCy���"\k�Mw���B�_hq�A�����m�2�W�[�V
߃�S�[<c/Z�M�~�|��(�r*s į[f8?��w�
7����2'��룽���7`i,k���
��rz?�������.ߠ��͸��k4H��*}t�?�b��>f��T?h�˄���<�s�)^tl)�`5k����
����{Q_�����
L6���
���֐��9LtD�F����n�뙂���]��l�8�kE�^�AG,%�|��	Dt3�:������S	`rf�謷pk��&�V���c����do٣�������3̯���>A�C�C��(��v3G6|7� �}�?Y.�+4,�P(�x�\�|�R�ld�3)>��9��|z-vm�Ф�q�D�{�ފ�c�w=�3��O�,۵>x|с{!�?�t�r�k���5hA��c�����N��39�����aA�F��2�q!�[,7`L�d�p�mflz~>�n!����ax�N�����ؕF�J5\a�]G��$���Q�I9�;���������l9ҽ�xj�4\��'2q6�C�
���Ey�|�(�I���W��YL�(1��"�k�biե���!\�!}}J���bM��1\L��"���8��ȢI)����53�9�'Љ'���lԣ�B�>!
%�� T�k%��0/��`	3K�j]���D�0X�
��l�]�,#�2�;�wX��M�h&_��3�铕�E� }���ت��C�O=Q��-9!�p2�l5��8�Y�eoVݚ�n�PE�
|�ci��K��%V���͗	�
�ƾb���#r6�zr�a�keI��+�Q2� sG�C�`�?i��S�EF�Fd42����=�9�j"J��Щf@�&=r�Vn��1���iR�}���:
��c�0)�	��y�Z��@��T��{�
h�ȣ��U?��O9��fOVW��L�O!����)�w~���x@��r\VÁ�r�)_f�9Qc�P��1PŬ�l���K�.�����n�l��?>�f�^/��	
�y������|j9�;�r>�1f��L[Q-�!7�	�,�1�=6��
q�v���N�|��2O�y�U�~��Qlz�
�f��6�T�>gƳ�{�D�g\E�V.D��yN�;����4<�1�	��h�&�Pz�����Z����%h�M;O��3ƹ��1O��7-��J�M�J����9��CI���`L2EK���ч"UO��}� k^$���Vϲ{�D��_x�H��i�?ռ��7M�n\x�h���E`�>�#�;́���i�Ӄ��z7�� �}ˇ?0I��+�Q�[�/�)O\�kv`0�"�La��P�G��*�����v�PS-;�y�Z���rI�&l�O�%��%^~�.�tM�w�!M�h�6�cNmN���@�h�3 �|Լ5����S��ٕ��S��hɩ#�΂��A��(�S�z;z�E�S��!�2i$)dً�N�4�t/bG<��=s_���.*R�zՙC�衝aǙ�W�A�;1oY���_PK��mWv3;��V+setuptools/_distutils/command/build_clib.py�Ym����_��"�t�:A>n��m
P\��E�8J��J�JR븿�3�(Q���M��pk���y}fH%IR	c;+j�)U�pYm�N�ն�E�Z�k���0{��0��㬔�+��*�3��z��K�Ú����e�0!˺���/�QUW#!�(ZI�HLЬℿ�jAZ��$IV��
���� ls���5o�ڡT0-��[�۱�v���K�r�:�'�ӪA ��iO�Ie��t��r��4�>��v8*���Q��Ak��XnEw��R�5�N=�����N�`�.��߃��V��HRs�g�Y�K�8=Q�/���
�=��������_f�ޡ�@����@�"��I
;^Z��*�=/KՑxJ;�(��yK�u�/�dc���n�p!Q�J�@1e��ID���,�P+\A���,����*��6��hZ�-Sf�ǵ֏>�H�O��6a���9�Rɝ؇eg�j�`��ߢ!�lI�X��jU�tP�a�����\�0!,��rK�@�e͍acBf����[R�)1\ܳ��L�������'{PQΙă��*b�{H��S�-�|����0Ȑ_4PĜ�p�omU��x�����x-F�S.�<zq�m5FYi������~�ے�=07gO�-$u�I�)>.�`vz,�:HAI��$�L�%���J+@�hZ�Oa�K���ڴP���e�!��B��ɻ�P�.cO��{��������m�	�G*��1b���E=�d��,<��Q.)��5�O�f��9�Fu�#�
����0~�F"��A֓�d_b<8-�'��NDtH�#��/o[RsVhT_ ���$��"����P�z�x���`z�Y�߰�z��j���^G5�#�cLuW��L%t��6B
��X9��e(�=%�{@&w{㿾(DX���G_"�b���$�9D/`Gj���I�V	�B�I��������#���W���;r\�?��9
�Z���wحs6cp�g�8�/��.�㎽X�;ܯk"z�_�x`$���e#��/y����>s��r��Y�������s���o��|�tM$D����3%��[,%�L@�)ފzS,%��l�Dlu~��ika3e6-�mS"5܆7@�LT8�͔Ԟ2^(��"�K�)"�td��}q��䜎PK׊?�$
��2�?PH۳I�.V>��~�Ͱ�sݘ���]$�xR6�ɬ��m��6�k�W.u�q?��|X��\��lWD3y�BD�q�e��}��xq��Q�4i*gu_�3���~�u9��[�d9��d�'�}���j�gm^j�a��Y���E5H�2�|n�P1z	�s��a=$ʒ��\��j뱲FY���$���_�����B}��ڌ2���L���5�:d,�O���ܸ�+������u�7%�u��/������;~�dN^��5YP�ћ�~����
?ra�k���l��H�&t�Y�(�6�vÙ	��v�q���*dr\����M<'�������3^חd�ΐE�7��!�
���m�D�EQK]��">+��C�[�Aҳ���g�,�Ez8]�#Ӄ��"�cݜR<DD�
}�G�v�]�+�W-+�o�~�,hc�:N\2s�Lr	ct�
t����/�H�|�:��~��4LmU{���q���^�nR�j"K�0��EP	~r��Æ��x�G���$������:3/�^]3�ϯ�,(]�j�"�0��D^^w��|5p�khLTgk��T`��]
2�6(=�9��D8%�Bo�.Έ9��F��龣+x3g�Ϸh��5�Z��ç	�da,�б^_�e��]Հ2V�^�a���bt�.F��H\q�@�WU�Gp�
J���H���",�O ��T�g�I&cY�F°d�}�	�בB�~����D-%Txvy�X͢o璞K��6ga���`�E
�:�~�羽�?#���F���?��ߐ��d�$"e'�K�u�JE�L}�s/L�����,�F�b
ur�X�Z䞟��.\��_��7����3�a/��M���ɝ?�Ţ�����a�&����W�q��2��u���Y�mw?�J~���y��X���͋`��xK�����H���1�/���
���
I��f�.73���K�_���u�a����,�Da�}�tꙡ8Sz��uyO���x���%��9w���2�f}h��A@�����PK��mW����#�{*setuptools/_distutils/command/build_ext.py�=ks��v�+6T]�1	?����SEVn4Ul��ܤu\^�XR�@�@Ѽ����Ǿ����;�j21	��={�{�p4�E��l�e��dU�.vE����ѣ�Ͷ�Yu��n�x�ۊ�i4��T��F��Zx%����G�:ߕ��r�4�<�����EW�۲����ޕ�Ȗ�γN��'O�&���$�F��m�t0~�A��X�'u�?5Rj�USo���F
���6�MS7�n�u����b�[,wmWo���9,`[��������Cw[W�{�J>���|`�l#�^�����Tɽl���m{���m/��-]�4�2�`_7A;ݤ��&�O��o�מ�ЛvZ������w��.=:��z�E+~�L�u7k�6k2$���J����/��
���;g-�[���0��]V�z2��Ij�h��g@!��*��#I3����/��������ɯi����O=z��R��l>�rrJPC��-4f�n�����2k[ax/QTcP�\�˦�v��31�v��)p��d���iYTwȂ�./����01���/�~����	a�\f���-�>�OZ��5M��]��
lR+��He��l�;�pXx-VY�<́ڠ�Xf�hw�;쳁M_�F
#h����u}G�Vv�m�=�$W�*'�ȶۦ�6����"IAk�M�i�u���^��.U턘	�-o�Е�9�2+�E�$��})d,�a�|^TE7�'
qI Bio3 Κ��Ki`�fWv�V��J�6���X�p6)0UK�	��H2�8St¨��ž��f`�±Z��w'�����^M�������
@/��;@h�4<w(�iӗ����ig#���+2�;,x��v�tV�S;��@���̐B3#k^̘4&�}Q�����]��i�S/~6�=�mq�n/Q�"^�8AF��PBH�=V�3��sĎ�d�X�ݭOm�5�)$<��\�n/a�HyE88v��i’$�"E$V*Ó��v<�Ǡq���[xIv-h"��g�=$�ʆLxq6��1��wbdD�JL厖P��h2�A��fK �@b����[A&	���a<��ۉ�����z��jd�{�l궝im�@�B�mQ��:FN��Sl{*��AW���I�XJ�A�͠XWh���.nw]u �*�"i�z�,%��(�����m�Kr�p0�R�Q�ղ��rZ�ҕ7G�Oz�B��ke�����,EH;�R��œ���_ *��6�����tW�S��q@�C H�A�J�.��4CH�jQ�@,���Yl��5Ș��I���@p6�
�Y���n�"��&DG��d�e�D5�XP�I�1�h��G��/vk���z)j�F�����2=>,x�<��`��b��E��!%���0I��]�نBh������e�:h���^w�8DyZ��$�y��f}�}t#5���E���Xϖ[Q�u]I
YI�~��#H(�\*-�B�b�B�66��ٚ����}X10H�B�%%?���eȻ�Q"��<'e�Ii�h�@��H41�?�:[�`Pe���\k��P��[��t+�퀚�WZ�&N��ĵ�hG��w��Q[���oe�R������g4�5;�8boQ���@_T���
���Y�lm`��h�(�`YG_�����bl��axL������\˳�t���o���o����DJ|1~��G\;0��9�^!�{�b@{�X��r�.�\k�܀d�Ε���1R2���䋺#1���X����v6�?��*4�pl7��d���Gw�2�z�/�u�؍G�ؕ�~��N=0��`�r]Yos�>�)O��;*c�v<?��l��;n���ZK	I�"�����>;�d�L��j�u�!)C�Jj�os���2J��ub5���NԔM�by�|��O�oD ��H��>|t�*��ڬZʤn����1�gi�e�X�s�n��Ip��e����#,��~m������_z�:` U.��-��O�+Bz��Z9w�fi���*�sN��*	@���]�oE7;
�hl�@L��ՠ��M$F�ۚ���:��^����i)��^�R��(}4<b�<���o��	��Bz��o�Ø�'b���DC�>G­�s���n<9���co{���2��ڤ+��c�Uݡc���X����(D�*�]r`��-K�5�6�
62��"�zW���1��u�9ٵ�|&�D��b�&�,#��6�f��C�������9��	S���j(��òH;�J)��Ӏ�Z�E�p��fuTM����H�+2-�TiS��K`z���7d�;/^PL����\������&�U7��G/�:�؁��s@0����3�}f X1T�$�g� ���{��_K���aQx� :�@r�p�f�E*��J�}v �PK�a�{]�S䑢�0�?M�]�u��C���g��r�s��S1"��cȲ�Њ�GW�
�Ȧk�5��	��æ=�A���Ѽ
첯�;mթ!�F��h�`���V=�M&�F�aS�5���#������CosM��
�ђ����O�@����)�� J��E'��KHiNP�
 �����v+����:��e�����)|���׶�{
���\�w��&�?����T��'T/O�|�/�5 ez�:p���d���N_~��\�h�nBc�~�w�<�_lM	pb�c�����B&��A��Qk�o���X{?�#9���e�&��NI<�@�%Ϛ�w!j��{��O�i9О���(���0>N�;)Y�����g����T�|��K�)K|�WI��I�7������/��~8{�
������w��ކz����c�D��a��P��|�Ȗ�*/(��؀���&�:�``�f�>q�{��`����6��t	C�2��LP_'$��
������"�-]A�@S�	5��:�e��e��/x47��
��W����\7��	�c���=@�*��mQ+]EO+Y0`���x�N�a(
��Vڬ�8h�PC���Ϥ=��4#����/.{`lL{��s�ޞ�rS���@OD����`L		�=��7q���/k��>n�?3ʤ�Q>O��l:�i�I`{S���Dmسct뢅�'�$&�d���15_`��>�.��>������5���9�$E��9�i)���SV��%���!6Y�:��o�O�m22�4Y�T�p:��������]��L?�J��%�qOWX}�R�`�r7%��%���f�*l��G�\��KR1�i�}RT�H>+�<"|lۆ�L��ۃ^��< �bQCXZ٬�g��Ĺ2k`y�T�=Ә�*:��x��C�ƺ��	�>��1U����0q��Qp:��y�D�<��笨�>��
A�7�u��&A�?�A�u+��8-+r�*4���{?S�ީ@�V��]l��I�`�#��x�L1��|�h�Κ*��%��`h��IΏ�07'��`申E�x�2}�h�TF?�r�}��7)*,ѝC�@F�}ù��cк���L3	�����8�F�Q���:�S�a.��󁘯����P�W�_���#�Q���i�w("�Z�DIڊ��͆aPL�"���T�ɝK��+����:�S
_ԭ��ˑ]s@bٕNt�l��݈���[֤�xE��?��%U Ԓ��nt��'%�|{�k:�!��Fsq��_A^x2���#�������
�&vP:�wi�zgIAT�"�-}u�SF�==jjsi�G��:��
2n*�VLF�>�I8�yS�o;����Ƀ��ƾ �*8��O�ѣ�4"M��R3��L!n�e��|/�^�}���.�br��|xp��0`�dc��ۯ�?��nM|����""!=w�6�Did�;Z�F�F�c;`��%q�99b���3��Ι	D|�����S3������)��|C�_Ln��Aas�w�*m52����I���~I�'K^��͖��P	b��1�cxs�G�c�ӱ��Ϫ���1E98�.+�2���[�M�	�ۦ�/0h�7��B���\�x��V(ru����.�5U��$s[���M�2��ݡ���իl����GQp�Mn}��4$�dCF�e�W���[�]#C��5�ǜ�&dE:����C����mE
�=N��
�e�yu�P"j}�M��S#���(#QM�֠>��p�YA���LV��a�(��Z����"@��v2|~"��W"�G͇������Mq���	��v�Ν��`,�S&?2�KY�	�%/>��?�;�Et%M��\܋���ro�����3Vl�Ƹ�m�*�+�u
�v��,��Y���J�d`�#g}~*]A��ЖS&��ZGw45K��m�o�ZƈPlG��5M�[ޚ��a��JX�:�\R �`�U@�d��_�rF����'|��S�W�m��Jؽ�o�H/����5���Y�CԋpP���i��<5�V��)@y��}�KC�2���~s�A;�؛�eւ���V�S�䬫gh�o��7'4ki.��#0�����x'1��^�"�j�i&�β�1�n��=!�S7��i4Ϛ���ܢ���x�8ĠG��ǎ�����Z��A� ���ۏe^�63�l�VoU�}z�J0��/k�N�`zd��,����W?3]$�/�]Pө�8+��>�Y�aJd8��T�N����g2��(��p��1k�����ű���ڠ|�O7�1����R�{��}��Vx3���f�t�<�ohD5�PQscg����ěϧ�EL��/��od�����79��,��L<^V�y��o�}��@9��[��#o��٤L��G�^B�
�T,Ή����;'Znץ���9���*�������q�ﮒ{s*@�{��%�4��l0��ٛ��3"Ni/;_�{lc;����bNĻ��CB�����kROr�{G�$uJ�g�\Qd���T�J�����\���N�+��뢅�|��$�]��#��\ϝQ�6
���lg\��ͧ�[�\�\��2[OI��Z��i]K}"��z##ʅ��S�狿c�Gu6i3���",����H�-ꐠTwKN�����hO�iO�5{���*�ן�@7[��s����5��L�~�V6�]݀���`��������b���7�`b
��v��3Ʉ��鴀�̻��;r'�,lU�$]�0�bn��m@f��uyI׈��9u�yE
#G�vz��T���p���vۆ�t�ڟ3�Os5�w��H�N��t���-6E�Ģ����U�x�1}�E�����/�6����Y���3�@Fu���r[,��^�r��ô���@)v~��bȦ�<��e�R�L�Lc���`&����C!�<����O�������	,���CJY9��Y��q?�T��#P�X�k����Z4rV?���(�������7<��(�F4e�S��(�f�_X�*T���D���4j;���o"{���RϢ]m�V�W0���1
�уm�2:�D�\�{�b�.<�`���5�ѐ�
h��K���P)^޵������K4*��,qz�{�Nl��%����b*��$��0]�IF�]�Q�9�MKv[��`��	��y���7��in��dd���1Y��WR8NJ55�Q)8���~����1�-�gõ��RH��.l
��z&z�:�
ν<�1b0i��e3+)�kR/�p̹j��sJQ��4���U�()����я 1��>2w�Y{�~~s�j�!Zn�jMû%*Ѣf]9 �Yթ|1l:c��������b[�-�ٲ	:;H)�Ef��“������|'du_4uE��}��� 1ŽX�ʬ)^_�`��zi�dꑟ��7E�C
��w\-oL7��]���.G�r���S/��[\�[U�S��Žۓ����[~�A@"8N?P�=A[���mr7[�w;)���u+�t1��^8�é�,�́���e��H��Խm�����a���n�?��0y^�;�����~n�Q�U8	�3{���.�v��g�
�hx�Fg�.��
�Sr�f:��G��EE��^
Vd�HL: X�]x [�sjبOH�0����@���&�}Ky�(�H]�F#���5Xh�ϭ��T�Gx��Cr,먲��\%�:P(���mA�M��KN�̧VT����ZO>���!���Jv��oe�Z�ğj�D�P����o��-� ��u��=巧9�^�u%1$8�o��w�6��@��c�����9�8:���j�|�末+g�q�>���a)`�Â���v�Lo����.�
��w�F?g��s�x���`J�puu	4�,_��٬�$Z�l��2��Z(�:����
�dlb��uIhj�74o��!`P�R�ֲ�|k�B$0ߋ'O����Ϙ�kmI'���4�w����b��ySo[w:Om���l&F7U�Dm�(�m�{Y�[�okk�o�/�s�h0F�z�H���.�[Sn:��|��PI�N1�=r�M�
�|�7��w�.PH`3^f���^Se���ɓ���,���cl56Qs���c~u'�45��?�1���S���{���J
�8G�#�w����c�R��$<SҸw�H���QZ�N�W�ݲ<��ֳz7���埈�|�d�1|�ˊ܂r�„�#35m�|�FU"���a�܏�/�F&���sw~��.�GK���ѕ����8aW��M�R?O�h�np�5�A@�G򏁢V=
y����]�˦�������v=,y��g���P3�'�<0�3ʲ9��@<�Rm���C?�"��c��E.���l_%f����Y=�47f�hT�BEAH��[��>u��)��7����
����MZ&�T��Hmu�xs����]�Fҽ!�3��tn>��*>��l�3qdaе�~'�蛀̙�����l_ذ���35R�m-�g˯&�t����J�7��k3�s�	�)�\'��Er�El�)����y�
P
��y>���WUxCv�<��W��c
�"�)#K�D���(ΓU,m�٦����8u��F~@���u�e8 }�
*������A�f��%�i�,�0UD#�x�\�A�p�*�)O�%^#�)�Pe�e
�(���Ʊ��
xF=1Lߋ(����H>���z"���H�����j�6V�C�	(�Ϧ�QS1��M��|����¹l�M�W�*�b�T?Ȧ��.`��h�n�o���~�H�.L���1Q�|��J�
HkאGO���
hЈ�UE�]�_���
gOq"Oͯ��ex\����)����c,T?X��
�讞~�2���]���k��ZΦG�O�Z�˫/o&*�Ŗ�K��6*l"�S/��)�ni`s�t{p(B���w��-Z�(݁��ڦ��엯4����n�݌�ӡ�!�������{�N"���<�^V�I�,��P��Ur��n�"�����w�O¸{�{��/�}nce.�N�`~�.�f4���7iGnr�_�����0KYgx�Ȁ{
���;'a_��/��|4$������1'�1Y��L尰N��/���~����_��#O���&j�d�I^h*v���&�ʲp�F�f�[�%]�%�8h��+��ӷt����s2�\���^�aL��nW�CFX����h,�tX�c�����)��2����1L��z�g�<��x�V����D,��a�����ˢ8AC����
3в����˛ٷ����m�m�ӧO���*&���i.�n��͞A��'���-�ݳ���Y�
����vYYRv���%��$4�z?�Q:x0��ꀟƓT��x6���x�r90t?�L�2"�����wJ����?��f�r4�d�J����^����������{=������3��+[��^���]�M
]�M�g��̱
��
�9y&MI"�J�\&��Ҽ,+�n��TVj�t�gL�9�Y��ݟ.���R�;�$�����Ji�{�{����2/�z��!M[d�e�c}צlz�a��@��aP��]3���J�#��)��<��)�=nɹ��n�]Uzt<��GL���#�5�����R$��J^z����W�Q���Hd���U��zF|V%S�3]��q�8ﻃ��&�2�{�y$�{���C�bT0���T)F�/�"^|;�=~�r"�^<��ZM�n��r�9(<v��d�xƼK'DzHn.���"^���:�l�5�~&��s䕕/O��������89��.�YK>u�d$Xu\��*ׯ�7o/�ߜ�j�mh����q�������|w~=5��|p
K+��@d���G�	����k.塎[�v�:�
E��|�*�#��Y�0��W�-)��dp��g/���7/'i�\\U$8gU�
�9��Xݼyw�ˌ�WF����q3j�cQ���"�q��q�l�LS�_�!7<к�ǻ��W��5}H�kL�6[쟉ﳲ���|}�X��s��U�!SZ�ê��ZoHL*��TL���?C�w�?�V�uaZ{�%�WC)���;��7����7��?�y�~~s}���7o�#2�3T�T|�*��/�����t+�j\d�_�z������j~}����1]r6|q긕�Շ�x~�ë˛���8-$L�U�Bd��G��~��˷�޼�uɐ��@h��{�a7��ʩ�����PK��mW.�8o@)setuptools/_distutils/command/build_py.py�[m��������Aҝ�����"�Ksh�+�k`�0h����%E��������h�^��awm���>3��$�Vr�����=x�]mƪޮ���՛CW��hɆ�`_��,5cRff%IruU��X+��O]mV8�|+Ov��n7WWe���I/�T���}��z>���a�6�E?�;>�qfH���K���X�W�o���l�,����a�,�1��?&�����=<8�۱�eE$�V��{Qm�El��_�DL�;�2%�%��6]�t�;)N�"9|���h��j����?�������]Ns�k�K�M�����n�n+J>�ýO�r��+����%���%t��=Ӄ9�-߾fe�þ:%����!�|�I8�ƀv��k���o`�ҽ���D��jS������˪]��;f���?t2w��+=nڶ�qU��_�xOC���8�⊝�0;�Wcn%��j�x
r5dR�%X�a?j����>�iwZ��>��߉K��[>���>�ܨ��]���̟��1+��j���zl`xՈ���5��?z0��7}ȟ8}21�'ϯ���ob�8�᧯6#�c9Þ���>�e���P<1�KV֖LkA�?�/��WQ��)�g���D&��m��j4�U��}Z���T���$`��0�3]���q�Y~3�t��R���̒���nm�⦖�Lt�6���M��]%�X��n?0�WU���1g%o��ha(i�؂�Bé�ca?��Z������K3���Y�ʹi!yKZ�)D�9�9
���W�i>�|6R0H�]�?���O���C!`�ٿy=�/,�g44K�#��Jɼ���,�KF�`��z���>I�)�c����~@ݝH�lsb:����{�NL%��o�؛o�~�_��� F�}��0��@M�{�xQ�v���A�:*`P��R�A�Xs
g,����
�
v�e������)�Z�P/� �F�hK3��8���Xjp�C��ʪPc��F��cq�r/ �J���8�u0��*��w��$�E�RǾEqNB�AS�*уz��˶LP�]�;$,���ܠs���:�(o?ڑ\#>�B��!B���~�(P��Êj��APբq�-@����ޡU)��5Շ��D�j���Q�r���G��`K��#3%K�|1�D9�EC���Cnt�pHA�(Dl
Z�]�J������~Ԃ:'�cU׀���rp8�l%; >����3�w���R��C��ڂL���\�H3)2u(�G�SLW(V���Q��FI����q��&��ZWn�#r�l���v��	1B]�]l`���B���Xjɇ%_R๚%ԉ{?b:�R?��d���S̀,d�F7)�!�A�5��l���Af`f��kU��o�s'V�6�P��M4b���)�43����E��`�y
~��Ī�P�H��>̣���7!n1�܀����웶@��pَ������V�q��j̶�%�AOk�썶��EZ�BH������ev�*�액��]]
Y��<[���d,��x�1�S��l�t�M�4^e���%0Gz����됕��S#���9�LÇ��[��w����7��t���ơ�ٺ�k��lb��op�
�a��f�����DӵK�ۆ޴`3�<��^��Xw*��(�O5��u+�0�/��h�Y
���\`_�	�_�5M3(��^�)���#>B���C�0���]������`J�ԋ
m�B�--��_��B��5�ŬAF�<�J!:L�>P�#션�vX~���-��B�1)WbШ��FY-I��n�P��D\0a��U�de��ϬOͶ�I�x�9��<��7�\�B��^8V���Lu�u�yjF���yx��Ȫss'df6L���"���d��onv�vͅ���V�o��AJv�E��C�L,�"�i�Bl�3�?�?Cc� �)�4�:���@>�E	��h���~Sg���(�S�r��r�m$�yP,�
�\U�4)k�����w$�G�*�NN'P;7��#�`&(c)� a8 ��<���l����.NT�lj#�+@��k��[�����X��墲�����
�~�V���m�%̯�Q~��};�h}�>��&g�M!�b>����؛����)����N��pF
���00@ē�-�K�x�@�Z�����J
*�U�
��(`�{ލ��MB�/�.�,Z(�'lߌR���z�*Jjsb)�%e�*�x`kr��ھ�a/��ǮSl_��ղP�u-��V��g�@���E��� ���|��#��$�h��s�O��b��Ń	�!�t��־<t�	I�\vk���E3x
��J��7��:�R��6@N�&�g�lv��k'�$�#���=2�s�Y'��
��!O�Bf��	�E�Ȭ��ZQ��x�ah\��F*�5��B:�����,.B�����P�>�d��d�ɉ�2�e��j�^x���&I��%��t�_%�L1���U�WN����Q���Ʊ�O��k:"�؈��a�H(Hj
ID��J��	��l�Y/��:@՚`L��5��'d��ݭ��o��NV5+	e�
򄽺��eHн�ao�������u�uE���U�g��e�PdA�ȱs��qǡ�s�a`�\���	r�;y�~�M����c:���/�kG3� ]��z�OH�/$���t���^+��[�|��Do�`������Gt�=����*5���a'8��O+�]2�(/�CB�A�/a��Z]�p��o$UR�C5t��0�\��k_�@r]F�(gN�F>����{��D��
(έ�6\�����#�Y���o�?�*!�͸[w=�%������1��Ȭ�7�Ǿ�����_�c����i�@��@@+�e�
�߅�S`���i�	�>�*@���j�2+��^Q�N�|����|S������N�H�aS��5���)K�e�"�`�&kڐ�-@\ D8�U�fRã%c��L�N��|����f�\u�*��X ���J':�;�U_WQ�i�/��T�
�i��,��	�bdg����A��:G�BjAC4-u�����"��:�&��>mПyb�g�ţԡΨ�,3��8`{7�-�j�b�g�W�'��h+����X#t�r�xu��,��ZT�U����ԇV~���=�rO
�t#�dP�U�$�BޙP��>}�PѠ&����-��ACr�X���Q�%(�)ܐ��_jL@J#>\!�9�k���j{�s�Mw���8M"����K�ofm'VP�I7:��N�K����%��?~Ny�A�_�|
�5���:�
C?�/:��� �Ӷ�8“��h����W�g������g�bx+�\��ꮥ5W�&��i�?g��BlO���|Z�X3��,��6ʛ;����Z_Yy e^ѸV�J%�h	�hO���0���W�A��J���.eG�^�:�^�i*��h�e�#&s�;�u�1�Y2��Dg5�~Eb:�g���nI�9W�s�!�h��,�y*q��P6H�5R��)�K&��9��Nz�?v��([�\M�v���jx��<���xw03��yZ�
�}x{#{*
�oL�ywj"��X���A~�/�Mp\Y٪�9�
l�a@OY�\yg'�4Q+Q���4a�>܆��tI�U沉btv���`pWv.
w+Ht~�|٥�2s2��3yFlN#��hd��1W�GOo���!%�C_n�\]z���3X��dUp�k���
�l���aὑp����RÙ�#�v��aϿ@�d%cO�»&w�����g��'�ި�Y^�	O�k�����[�Ӷ���$���f����*��cPW-�w��|';��17�L5�R���M5ll���$WK�~�w�u�@��ϩaՅ��H�		�-�=d����J9��h�{��A�*ߵ��WP2{�ӡ�J�I��r�t�#’�\��d�[��ք�A�%$<c���u��<n��TK�$�;�2�f��X)�N�&��Nm@�z��TE%���W�@��X���m&�Ģ}E)ft��K�W
S�8s�h���������g�-��t���k��I�Y���/��f�%}�]5 ͭ�\���GR?��=�V�
�A�%/ħ��4,7�Ku[F�#�j��B	a�C�{R�knfu�3u��"��x96?�EQ�����ҵp����14'^�]��:�ku�r�&utvJ#\�%緔f�ա� �Ju�n�nQ�N����E����R�x����B�:�Z�[I �{�g�a"	h���7{=�6��GFB��/�<o�:~���GxS]�%�y��m�kz��&��/��MQz+@��]A���:�6���u;Ů�G�LO�^��c)V'�6�*�Q��`*CD��J�
��h�"��.��^����M�	�m�d��9WI�����'�
���pu���-M$U\��AX��p�h��U<F�,��p�%�7z;�	��»Ul۟����a޽8_�\������PK��mW8�4,K.setuptools/_distutils/command/build_scripts.py�X[��4~��Iv�hyX�� ��h/h���rgj&�#�aZ.���8�6���&>���x��HcK+3�j��y�K�%+kYX3�]m�LlEn
��^6�����<o6��Bi˔Y0-f�V[f,��~������//��V�f��M��T��CD-���IQ��_C�����8�7���v3!O�������]�fsoD|�d�~�ۍʙ4,�Y&��U*���{�v�w �Bc��gnE�+�uK�
��`�2?��������Ip�n�m�$��?����Nj��/f3���j�޻����jzĪ�3p@�]Y���7�*���R���ڽ�T�_&R_��'�A(i[�����rg�x煋@�t,�7%^z��l_��\�e~�y���S��Y���ma�`b'���u&�8��B�2݃1����3�̭��~���u[i�V*<�+_K�ڶ)���<C<4��Y
�7p�Xg��W*���c{��ѝN��mUZ2X�ڊ��1����29b!i)+����N��:,�r+��#!�q�֙��B��S�w���Z�K�6j�_c�;�Ĩ���e
�p*u>�u�ңn���_��S*���"q�q(*��Ǜ:���ƢRɜ�}��H0i}ö\߃��[�����*s�s�c|ς^��r���.1(r��"���aW�����J*��I�U��I��'���oKk��ND��"EJ��ĥ�h[mu�%=tz�fQ�Amk`��=Ն`��]�2�}[	�]W#[��^ky�~�����bд��m8����2QE�*�(�h7�܈�oE�5
f"^"O��9�
��]�-r&�r=��^4hዣlF�E�^�w�Gl����Se��jI�
�ӘE��K1lξ���)H_GO&h5�D�\��J�e�L��K�+۪D����n0�m����1b
��T�dͫ����I�Й0����c���B�ݚ��ko����Q���JC��VP��� �	
Ɲ��<y��l�2�⿙��W��`�PiD�q���h@�>x6��`w�1e�t�0��3��y�!�0��eb[�}5o�^�
=v>v��C����$n�F�mн���V�w�<��B��z sPѝVe|2Ԣ��%p�:��2OU�5II�]Q�)���mn�h�S�Y�zTrF���n��ET5���d���`�:��F��3cnP�O�6��4�TW�qx�]�zy��;=Ս��C��`���7o�^����Ż�p��x��"5�:���g4�戺��hhxڇz:�� �ɽQ�y3\��L#n�@��M�-
���w?,�`%�<�@���J�WE��n�CaP�4�C�i�pw�Zu��7K)$fݳ�{�S���^O�=hi-��Z�3C��Ոt,O"��HW�	4g�hts��5�>.r���GN/���55̖D��qL�f���~�YYQ�N)���3�WH����a<pZ���i��ȃԈ!?gWie�z4U�Ĝ
�s̬��钘{���:��jP��n���
`���n��3P��_�iރ�X��1�nCn䫛f��|tk�7�f�݈R]�a�Z7���1\,G�����f��`�]��g�@wK���;G7�@����gȝ?��.ln
ĥ�������7?m�
w�@ewCӸ2ӣ����&}X
�u�]��}ʞ�ϱF�q����O�?�<<�H3T�{v�1�'�v���+�P��{ļQ�B}ꢑ�D��(ހ$�����Ç(����a����}s�}��Xs�7PK��mW�m�&setuptools/_distutils/command/check.py��n�6��_A�(���`{
�E�a��H��F:��H�FRN�a��ÛDI��U(b�<���r�,�ҝ�ʊ���(�b��b�n+�AhE���G��$�/���b#��Ĵ$^�����MA@�F�ԓ�ݵ���b��rA�yAʦp�9�J�����9��:�@��5���Z&H�I��'{4�
�x(4�\�hJP{_TL)r�+4`#	/�2O	��\p�牂j�"��d+"-x^��ٲ�WZ�׿7V=��S�}��~�" ����aM�*8�xb��o�%�5E.+���#JF����(�&_�F�A��e?"�X�A�����~j�4Թ��K���yYlyUJ�����uJ匵-:;I�t2�H:""1~�p��M�iX�kG�;��oame����{>�Cp����M������n�׷��|+�����x�t�%�•"�P�N��Hq�yos�f4ies�'�E��ӣ�&6�J��i��cvH�_Y�`�p�f�R⫍w-���-�����V�f�%ӌ4{в���ą/UHnUB~ɲ�id�q^C��W���ZC捷�OB
C�S���� �f?B�þL0G1k�#J
ߴ����z���R5�d�P���;z$r(��-�gy�,�фmř�4=*��TX��1��nC�k��5�p�m�e΢d�0hz��i*`"6�Ȗ����L�0U����
���Q	@�c�Q�u�&;Vu��n�1�汙8�½CI��b|�d�c䘙��U�����ⷘ���a��Z^5]�ꢫ�A���\l����d{�㋞Ͻl�|�Jv�կ;�	E�	)g vL�Ch���a0tF�>P�m`� Ig�SO�i T\z.g�1�RJ�
������d\���(��h��N��c�%@	eF������S�Lx5�����	�A�F#
S:"�F����<SV'��y=��F�K�z)��q~�+1�Bg�y�
-��״'	u}��s,��PM�S]�5

7��:`m8T��!X�&����"��?Ĉ&|qd8���No��^�5�]J�0�7��\���"�~A3�����jQs���Yl��=�?�Kf���35�O����5�L	dZ��I�1����浓�t~D�LO�L�$�ZYJ����ܥ�*��̂-��2��eЫ�>.əZrF�"ٟ
�NGU"�9��v�|w�X���AZ���>@WdI^��4�xۦ�J��z
8G5�A![�zq�p;��4,D���Qo�Y**�n<D��#�~������)��2�Y��y
?�,���U$�'��a�5ۣ�357��h���)���cہ�Z��Vl�g��Z�y̯�w�QB�9M��h��י��y������<�h�L���8S)�z��V�yz$�<\䰩�n�X�L>vnR���1!�7�ĺ�l@	�̀��
&��碨�l�j�k���Q����w�&�D����.���tg��ssv0��sS�M��ʴ���n���n�E�j?φJ�ц�5j�S�E�w�JSs~��,~�f���O��b�<�n����~�v�a�g&7�	0�x>��Df;�>��"�A�6'���>������D=�[�����I=�[��S������E��f�C'��J8H�U侮�ZG�Ig�2�m�;��'���/!���m7��Q�qۓ7ڥ��SdR��ij��̎�(W�O���߃\m��A��+Wf*Ψ�����F��6c��PK��mW,���V�
&setuptools/_distutils/command/clean.py�VM��0��W��Bi��,pA�]!>	Ѫr�Ikp��vXʯg�|9i��>%��73��iʅu��n
]UL�M!��$�\�+T΂�#|�q�@=>M�$��W�����g�	��D�PpV�ۂ��B�+�Qbm�
��0�����������I"�Z�&���.�n�Ck~��l�S3X�߸uq�R��Z�-:��$ZmaD�Vpi�@S�C���B����卐|'
�E�Ձ�ŏ�ѯE_���M����j؄��� �
N��ǒ5ҽ�lmF�l�.WG�R��V8!����*��;�vڌ�#��&1�*]�?p�B�{i0���n�Ȕ��!!s;c4S[�҅�
-�=�%e�6l�M[�A�6ݸ�q+P��ƺ���ú6���s�k�3��Wd\_��]_�%%����=jaQ�T�+���e��&D~j������>%'^��ֽH�!�R�ǣ�趍"8]C|@v}e���Ф���I�w�󡑞t��؁b(�'ф8�v[^��O�Ś
���726d�4j�����S'����y[K�n�QtO�5�2K=d��CIJ�R�%��M��~�ȕ�V���<�+s�
�9l��ѽ��PZ��ф�Q�7�E�=�pM�����
��P�@u�x�s�}N�6���^���/�QZ�`1�ǒ>k���q���b��l��گ8k��|��8o��gF�o��5F�D��{�_�{,~��������8=��q�#Tb�w�gt�
�	���3�*}������ 8�!f0�(�k6U��F�E	39��M�c���B�zюA�v��MW�a4=�
�|���m���?.�PK��mW���7\=3'setuptools/_distutils/command/config.py�[m����_�(8���N�u�nl���4�z�va�m�VQZ��wfH�E���i���-��yyf83d�(�r�vm^�M*˒W���q�x_օ(E�*֞�v�b="ffF�8[�R�E�b���~x�҂+�hO�e�(V�*z�J�Lu�5
�L�"�y�J�u�`�[��aUY)����<��`���+�g9���O9����Y�ٌ,30(�рL�F�����F0^��%���*���S��Ջ3�SB8�y�C��䁩��&D�)�L`�
�8;J����@�]K�e��4�F���^ru��X�6�+T�dD�~f"J�lX�'1١� ڂ���D�8��6�(����eܪ���š�%�!�̐k-�x�h	�0�,(�{�w�j<^�J�6LI;��2�����S�����͏�}��۲_�4�lR�<J߾�?�_�-
竫ł�'*m�1T��5oH��./�H�B+�d���e7�?�x�s'�GY�ľc��lO�Ʊ��E�J|�'�d��}1"�Wi�eb��Bb�ا5�^���M.��o�;T<L��t&y%���k��jd*�
%OId���JW�S"���Є	�"�7�'RE@J<���x.`�!�"���9oOs�z��j�U5���hW2W��MO�lO	sKcڄ��몄m6�8���F���z�dפb�8�eGQ�����8mQ��^޶����
Q��.�,�SmO
��q�b�hO2�(�{DcS
�L����B ��h1�	<_�/l�<@��ۜ��-�(���sc�bK��LgO١�g8�\~�����y	Ѐ����R�sH��s���v�h�ң:�/O��ƪ�ؼ��q
]�Fdv;�N�^xd�䰫U@G)X-�
��%v�:Ĺ[g��G
�f��
jȍ�d�oG�����(`�p��L�rB0�6�g��?�(� ڥT���'%��b"���e�|=Ÿ{��Z���S�y\���wDs��z_�Ɛ�1=4A�g�s�M�!ςځ��Î�*��H��C��V�ٞcZ	����H`�z0U�˼�
�{H�'��*C�'���D���_��$�;�Œ�\�h?��PC��f����!��'؎�ֆ��'��*�����+K�,t�*1ϖ�::Iߋ�k�L2Z�>W�J�A�ٗ[i�"ڈ<䉃	���%u���v�%0�7/��ԗ6'��dX��o~$��Tl�^t�k(B8z.J^M�
l�hw��i��_���,`���c��g��/
�`K���wB܉h Tf}b�TA��&p �+&�;Z�ڈ�eC�p�S\�Ì�I��r���9Z1����Xr��T^/���Ⰱ�͹�[��>7&dx����*bo���to�x/QG��Û�׷�3�
̞��F�]SY�zvrY��y��xd,դ�0k�9S��X̆F��.܍��
&�U���%�z�
�Z������y�3*��|0�k

^�e����v-�:�|bz�Q�"^8�K�}���U�ޓv:iy����h�AoD�V�򭀅ճL�� ����RnIk����
�R�Fa�Ɍt��R�
�+�c\m�����P֝k,oP�	���Jl��M�j�>��K��7G�.@7[��	��� ����ΩĜIv�f����H\�-�k�-R�#N+9�~���N�Lȳ}u5	��x��ci�	��6ky�L� �Q#Jy.~�ި(a1�7���[:�qC�j^]�m��^�����nH�!u��5��u�o��?�;?V��6�ck��ء� �shl:���'�*�P/;v�U9�0��{	�Q���BR�DV�=���J-eC	�	5�_{�g(�[?XwHƻ!���2�s�JC
����
�d��N�A0��F	[�y�]�UȐ��m:a�!�}��0�i�@|a�v�A�8���ȀZ�d�TY,���*R}l��\1���bs{=C�Oyz¥R�`m�[��S�k=���t�0�*����]�yu0�K���[j�
1�
���"L�F��B��}�E��~̖�_T+��`�
8��s��۷ԉ_� �����犊0|:����!�O�,�c
f��6YB
:Xg�{����L�E�`���ë��+�FhD�'X�V1�^v`'(A�t��[c��n��u��RQ���Ap��^.x��n�Lb���ew/ؕM��9��ߣ2c�)�Oy�Ы����lS��s����,�s�xp�U�JF�s!P�&!�	����'1�CKނ-���F�x�}g�$�"��C��=�s����;�O����@�=VAS�C��t�K'�Н:�$m��&���X8t�>��K��@՗{Y��ֈ�P#{��F��0�6}����XHN;~�������=Wfcq4_\,�'�o�-z�4S |mu�
�l������#�,���=L���h��hW]"��<�A� M�x^� b�m�r)��]�CxjF̊�`���A��u ��E�ak���\]hJ�7�����~�;˫6��KTdd��Y���y^t�>��y��Dť�H�����p/�HG'���y@�
`V��\�%H�ye.
��Ж�@��xd��Pw�&�ԇx	J�dZ���y~3ľ����Q���&ݜ
�����S�����j��ë�;o�g��VV5?W���?{2s�qS�B�xZ�^�(s���!�tW'(���)��>-z���m:�����#��!W��,�"5,>�ZU��J���WV)�_�q&�b�U�vCo�֦ې�!���[L��`'�J�=uZ��!Q�ݼć�׈^��iB���+��)����BqAWz�Se�:���h��9�}NAa�p��.zF�<x��i��(�Z;�w����=��WA|VcT*i�Jt�h�ǀ�6Ӫ\B��UK:^���;j�َ�.ְ+����v�����YZ׈��HI��H�i���˄|R;Z�"צ�L��Ե�L����u��O�9�U'�5�B�a�ԛ�Q������ȧ՜�s|L���fo�A�+�����x�a^U�a�;��(j%s8l�c�1�(�\�Ã1�D-�P�K�/�̏,�`�Y� �ļ���5�������M��-=���u�|H�_��]��&a^�(i��� v�,<�Q,qG�ۛ�Gb�QTԻj��G�%�[�v6v/!�t�m��6n�<�����@|C`��3��0^�o؆���{�
� :ST��t��E�L���܉Á�A{=�c��(ݴ�t���	��q�����]�h����N*c�lq�^'��!�[k8n ��.(7t�i
�ƫ"�,�=׾�y��~�^�7F�[�N�p������"���|��Ճ-����ؿ�{��9��9�R�;Ȯ�	�޻q#TI��Z#c{a;���ї_��y_|鬵��_n7�#������� aҸQ)����4��Z!ěvҦ�&�y��7����.�׷�Q�>�Ͱ����t���xi!a�qc��ءHI��� �&(��L�f\��a�W�6i!v!�
PK��mW�i�TE�k(setuptools/_distutils/command/install.py�=k��6���W��D&�l�>��䦮ۻqmb�b����)�"�c����ڜ�ۯ�� ��&qꮮN�JF"�ht7�
&���]ߕ�X��v��Ţ�E�U��ً��[^w�uΞ�l��̘�E��Y��5m��^�?qv�n�-3�0��jn�'�~���?��F�y����ꏀ��^�f�
����x޶Mk�2[��ʺu�n��cκ�����n۲�K��j�,��[�n�2ѯDG(�,�d�
_�M��[�)�N�ǫ]W6�܅�"U=��Ͽ_~���G�_�y~����K�]�7m���~|��٫_/_?������/g>�]��\�.��*��7��!��]v��,U#a'�����F���/����e�m�*��u������Ⱥl���G��<������n����ܵ|]~����6���ݾ�4���~	|@���-����&H�կE���T�"���٪\Wٍ�2L�UY�����>�
7
�=��S$� ������`�{(���w�#[?I@����c�ג���|k�
8q{��Y/x+���7`	�����/h��?�@�8wvmTɈ:�AO�$�ܦ>��}7:�uS4ݴ�Q�(�#��m*��	C��%���~��	��y�Єir�ހ#���jXV3�Heh���}�@Ȳz�j~˺��֬:�e�!��Hj*/R��|������w�܇�a٪y�S~��<Z���_�
o����ņG�t�|:)U�H����*B#+�.���Qp9Ѻd�%��6e}��1Y�eU����k�}$'#��
M0������
ov+xǐ9d������@���ѿ���lj>0� )��aQ�ZS��ϧ��?�`M]�5��CǴc7;���2�,wA�=��B�j��50
Z�zզ��^tD���E���&4�!рJ�����<��l}>G�w�z!��u�4e��&���ŽI��Q? ��‰���ل_�Wo�l
B��z��aW�y�U{Ý�D�h&�Q��*D��m���_�媧36͟��U75ay����"��?�-A�=���~��Mf
(*UxG4�>|���L�
�])�;V�T�ÐQO�,N��%�_�˛�T�r��A���.�����Ż�Ԕe���]����RHKСeb10���
�
���	�G��68q�,,H<9ڪ���1��
���U��Y_u�.��f>�&±��8C�H@}#=��H��^�lzg�h�t�X
&J^����D�Dҁ�������/�!4�D��#��l�!�G��-E΁�5oz�Y��m*�Kk7�VN�[;;��]EE'��$���pɸ#�<�*ޕ�9��T�CP��X�6ƭw�?�<�
��x{���Dz�E����R������`�����%��O;��l�P�
�ybk��|8u�Yp��E��B6ݶ���o�qQ��R��f�__��p@ਃ�y�!Ł��y���vS�$��*�;�˸��Cr-WY5Mų�v��kDϒ53����n��"�g�����;3���X�쁘E�8K�v��k'�ߐ���04��F�o�"��t,�2�@�hб��:�E�3H�CL���P|]�l���9�J�G��G~��Η�n�Z�Y(_�H�>B_ky�9���D�K��>�ol��8�&D«n&X��������U�}��Ѫ�)�
��
�v�jJǵd����R�]��4�hR?j�'��#o7D
=@��A�m�#��cF�%���î5��Mg�7_‰^�
U�:|O@��q�����'�
I��xRBZ��C�
\�(�R4k��Y0���v�$�����i&��w7F��>#8�w�r�9�bx���",�
�%:QL�W�I�g�у�G�:�����Hʸ]Z%w���Bj+ ��8���#��n)���|b�vWxDYK�Q�����Q8�g,�T(Z;<:%����c"`	�9��X�����c�ߋ���0�48I�'���h��ۚcX�v����Y.���w��#i��5��f3����ݶ
nv�*k���R�<�9�"�m�W"��{	cO���I�:�շ����׈�$��۵����r"r��n�%́��V���r��F��J�a��]��q�z.��y����A^�Rz9����Z�ш�D�k�
8S�q�}ӳwus��������z	�;c��ـ�����l/-�4�D�#�	iMW�=�L##P*ImQ@'p�`���mY	@$H+�B��`r�7ڛ6
'�1�3���d��L����<t�L������sA�΀yh~��d�L�J�@9!�l6��U!�z���о��(���GI�8��J.�:3]�"b)�O<�v�:R�\�u��8^���
J���f���<��-�[�
ۄ[@�oe���&oa�k��Qs�^����HN�.����|<�@��/1�.*�=���@�dO���Hm�s=`)oG=`������
��H_N�S�ٙ�m>g��j�F�7��s���9��o0Q	�@��rK����z����Rn��M�\M�N��`�Te.CK�\oʶ�ﲶۻ)Hp�j�>kK�E�|�`7%*�Tx�ϴ����KѲ��	���p��΅R[����@?���%C@�w(���2L�$�Y�'��ië�N��|��,��8�9�m���O�8�dd��N,����U���y�yD�t�C�����R�,�J��<sS(��2�m��<�*��@����+�$C'�����؁�:jGR�aU��������qҺ�	��c���FV؃��JSH�(9gUG::ÏYzZxP�)c!i0a�n��4z�ƈL$`u�fl��*Y��~x��;���*(���:/�;���/���K%)�Xj�};��x�0Z���c;臅G�����*���'��z��&�[�m�R�`�SJ�D[*{Q�n���HPpj� ��/Z�NF��	�(q5$8�t����jh�z[�Ù��)8;��/#��ꓷ��)�+8���/qr2�?�����
�k#j	�f��Ч��&�jG�B;�H�Q�A�4�ma��ʤ޻dѮ��%�戅�E����ƑSڔ�ByS�q/R��(	
d���V�.PN2���eN��]��sg�"����H�C�/d88�i@=7k��ԾMI��DJ���>�ze�,����Ͽ����#_��r�Rҩ�(��g���"2Z�,ڤL
�-���
�NIP�&��ZS���A]�u:1��T��,n?��7K�7v������{��Y��FD"�`{s���KJ|��i
-���lF��5����u��t4
W��,�3
�'�q}�aG�j�[im���2�)Iwx�/(��5���cA���g�T:PT@`��γ��6Pc��L�r*ς.K��r�!՜�	!�A��s�5�-Ȥ��MS�X�|莂S����� �]�\=��A�O`��x�[j�jc��
l�ڽ�uݒ�p�_9���]Ǟtҿ�d\��Lp6e�`�M��8�
�0��iH�7��mcJ m�����p�I�Q䞄����� ^z�Qp�X���ɳd���=(�{`�W_\���%���-�J�� p�����P��[�i��I��c{2]�0�"�C���a��a9��X��b,~�ct53]��� ��ZC��g5H�\َcVe4�s����E�F�A;Ns�op��A��-PVo�Ť����I�k<I[��D���#ݶq�G��nׂ[����o�(����w)'�>�!C��[[͉ҢE�Qҟ�z��)|\+�tW�MSO�����Tk����+!��R�~ϡ�
����С�1S�f�U(eܯ��+Xp�Qtʩ�I�~x���5pC�-rɶ�R��W�fM*�r&y�*U"3ah�FĴ��(��1��Ut�TĊ����H{aj���X�uU��yc�$H�Og���[en�&�=���Zj����>趇��37q_c�CU}"͵5��tx���Q��۝�'��lP������۞���)����W���v:P����c�P���&�
��e0�`�iSfjft�3�r�՚[��+*�S�
`ޤ�e��m	LRI�{�ۥr#�]L��T�+��'����2��s
%�_�e*œ`D��q?7e��S�Ҋz�a�5��x��m���I�6���Ƥ��{�t`��^�	h�RE�B��~�<Z�a`�����;���Jqrm�_J�����o%U@ ̿�� Qcxr# 2�&����m�}��e��oG"
����%q�a_c��Fu��A�-�
*as�Q��ũ�
*��P!x�D17n}���@w;�T�X$��B�U˝���8���?�
���
|]~�f���;�1��>g��z!yB=8"��.:X�s�O;�W���揯1�]Fc��B��]��)h3�7� ���+��t��j��z����3,�"�L�D�!�3�� p��D�=G恈��)B
U@)'wB�S6Ma��ʡxR>N�[�v2�?���:S��������էf$G��{O/ql�n�;u<��ilƲu�Z�
YV$0Բۋ�%Su��n��8H�S/�S�ȗ$�U��dp��&D�jk'N�kA4����P��Tc�I
���k���%w���=��`��N�GF��CU1��S��5��	� ��`*�;UAԪ��o�����y>�������\kjC�)��T���o��]�vd�xӄ bm��4�Q�'�Re�w�p�<p�s�t�q���5P!���0@W�a���u�p���b?*vf��O����>P�����$��I�UC|(���kN/s:]��GJC�#����I�xV��ڳLݡqƨ�ox�v��G�?�.Y_vm���V��Z�gp�
��}��M&�2��*,a�h6�N"&y%&�,����{x4�Z�g�@�dz��s6���I�F&�~��XÕ��y�	vžb�2��v9zW�5�"}��­���^�ԋ�0%��j3V�s=19tVCR��,qm��R��q����Ҕ���pK��]4`៉�x�W	�C��}��Z9�}�����G��Q��M�}���_�[ߧ�o�ގQ}���i�5�8gsZ�Y'�]�^�l�x�|��B�]�w�{v@Y��ѳr�^0y$�f�{�Oʚí<�;�R�,n�_
�g(�bL ��
����[��!�^*�C����z��2M��<S;�K{�8p@kc���`��[s��-���鷪���m0�a]
�1�e�5<�.����d5���#zfW�T���0u�E �:��'z�ş������葊,1�Υ_`�[%�@�b�V�/�i��<���x���}<^Ǿ�5�|����$7xj�/��\�+�2;ΥB�y��W�w)M����U��u2�C��v=�I�^�1�P���#�s}hѧ��#��5C�ڟj� �2iDW��L���A}E�R�xR�7�A�h����4Mh[,�:#೙]��駟4��&��M��
 �ߊ$�"
]���Qs9r��[�ވY�]S�~�jz����g��(�U�6��M�􄡼�M�@*ӑ��ÌŰ�ؔ�Ґ_g��Q�E�W�z��د��D����8�_�$Q.�¢k&���(;�Ů_QJE�em'Cs%�p�+�6�v�P�T^X�F���Yr�0ZL٣�O�%5�{�4
r�u�M�7��u҂��b��l��f~��*���g����W��ط��>U'������Ʃ.�2����i�'��ja]_M<�b���N.�^�뜖�,��k�n'�,����!�u	�e������QEW��e�9��t��+Uë���^|b�DHXt/����Hv�;��j�S�X��I9�w!�жYc�n��a����}��f��E�{��+������p�-v�k�'_?��(o!ԋ``n�ĖZ  ޛ�{�1`^�.f7B��7�#���ȷ�[n�MH-#�1Z
!p[���73�mq�xe�����=讎��7d�*v���x]�K�S<�X����rNn�NހS��	���ӗ�#‚�S���
����x
�	-���(�����+59���4�cHm�������"l��9��!X��!ʣJ'N���b�g[��l���Ԩ��)9�$�aJ��I��:�H[FӍ#]��u^�n�+%��8�h#;�a0�CC@�Ё5�)VS��6��"ٟ6��M𬅩D��p�4�}��@�i��N�
mO
��:���F^ݠo��:��>7�Oկ7;������x���E�h����H�����f���]y��Cm�i�@�G����%� �
���J��\��968�]c��V�c�?�o����])[ZK��F���r����lXa�m�Lcj�����ٓb�&,�ڸ��Z���"A�ߢ)o��t5ռ���)]Z/��۴�7Z4�73�jQ�9��<KF,�'+ΠK�a��?S'�B[WN�iHL��I��vHF�37��7/TM�N�u��2kٗ�!w����	�\A��4fa�#@>���ߵI��o�$�9Y_��!&�˦�e�N@��!@O�{
�p)��j6����q��(aAa��0�(v��C�nS�>�Vu�ի~`�aT5:�*�)���v]���hj|<4���)p��߅ B �cp<g3���@�[o�����3#� ��2��4g�
|�
�/_��`�xh��ի��j�ڨbb�ȅu�&��x\�%�謡fq��,ա���oG���E��*ۮ��xt�������PK��mW����-setuptools/_distutils/command/install_data.py�V�n�0��)F��$R@����^���B�L����N����CB�Z"@���73vDž��u��˽�k���T։��‰(z��
kT΂;"|pH��z�Jm�ߒ�5�p�^HU`��PXJY�]�qE$�����a�|�I��G�R�,DE�n�q�mT]��q���vn\C� ��P��]�v�Ѹm#�1���������lE@�@�7�qR+x����;\k�l��Y��K^i�ۢ��%�!)����NX$�
�6��l�@<J,E[�U�
�`Е�Y>p�#g�?�¡�RFN����w��~iAT���\[ ��ȱ���g�&F��C,�-���M�˝�
5LgoaH)I�����_��bUoA���4��30�׭��KF6�-�L�<�_3W۠�{C��"'��c�aT���%�R�σ��-u��8#C�
��J�}��\�$�����
]����XvI�i�lV�����5���=�tM�jd_�zy�Ǵ́��V@������髚��&Ms���@ID�PZf�����9Z��1UB�@7��IPT����@�m<_�O�'�6��b8��<�bx�D���5�8Sj��YhΙ�bV~">��h��a�c$V��F�#�>�;��/F�IGa*jd�%��7��yǜ��6��2/�.��V�lʑ����
�_Z�IQ�0��BqC��>8ӳ�
������^x�Λ}���ot��(�o�b��_:�0������gN\���� Oty��q�K��.E�*oh��?��L4QӺ��r���k�s��9��C«��U��w���_�E��y��<�\����nw)��(��y�=z�:Ƥ�'����f&s(�f,�e讂�D�PK��mW9R)S+
1setuptools/_distutils/command/install_egg_info.py�VQ��6~�W��N@��Sz�>DW�:UJ�&U����î��F��e��;6�6�TE+��of>�g�qÍ,��U�1ٔ\˄��p��lU�w���5`�?O&�lu(9�JCsy��>�&~�����ߠC�fY�qE�V,��]����u�1I�:��UW�k>*��9�McՂ�h���F@q?j�P�Vᴠ�}:.����5hj�{˕����,0s�{�����3���?�+��.(�]�C�ЍOcm�>�USv�g��|�BlI�-g��	?5(ڐ����L��*����o�� I�Klf͹N�'���$��-�f�=3(Y���SЯ?�4%�&�b��t�w�U�cә���X�O.2W5��Qy�0�(�W�"|Bm���Iz���^���n|�5�5k�i�D�){f��GŃ�9�L��\
�����b�� ��5�\X�B�ΑpC��Q�Q�6 �]His�&�튁iC�;�	+��&�V}�(����r�
�"�L�������bJ�t���"�<��?\ԅ ~`֮�)�����o�NHZ�m�WmS�+����ٕ�ٌ�[�U���^���9lS	�,)]G���T�r^����Z5��K�|��x�d�C��WQ_?Q\X����<i�]j��P���h-W5LS��?�~+�zr�jQ7����r>�?���UJ��g�F
�&�N5�l70^@M�v������066u�nD[#(Y#p�
�Z
:(.�0��>VF�K��e�Ɯ'ɝ������L�Ռ����yU���c��%��@F�^˳۷�[VY0��:Լ�����4�-5�˜�_cB'?DAR$�Q��\ci�}�<������/??��/�\)�6��E~S���'�`�c��hJ�{�CB�,��a�SĴ�J|��h6�3G$c��DZ7����t2��$
q4F62�k��Hw�S�M�iU&�gr",��.ϔ�Z}��tޘ"�S�Mx��}A��S2t0�.C^��QZ��M�7E�T_�
�~I�� �,�PK��mW*Rj&�0setuptools/_distutils/command/install_headers.py�SM��0��W������rJ/�T=F�V����Zc#۴M}�'@��S�߼�1�s!��T�jM�7ZTR;�(U��hc�Aa��;�g�oi�
4���o`>����D�BN�ϋ?M�V�AH��7�Rq���ai�"�~0��1�0�>��t��ؖh��F����q6�y�xf��Z+/���#�0Y�O̶6���<U���2������x�r�����l��]�����L�rC}���#�_�R귨U�(�Ĝ��(l�2���%ב��Q�&\�Pu�mb������q}m��}l�����K:�	.5�+2�j��m���]�.<e�vVuGs���(�-��6��F��(���u��I&��@�F�W~,��j�.�η{)�(��ԏ�s�L	u��f��aUy��wk/V��V�0������F��z��zc��j��/�K`"��PK��mW����	� ,setuptools/_distutils/command/install_lib.py�Ymoܸ����'� 	Y-��(��]>\$N�"1�DyuъI�����H���\_��J��3�yy��$I�J5�������7m/�k����б=�$j�ȟ�j��RbeW�}J��ۃ���y=vL�$IV�v?p���/��l�=��Z5��I��`v9��n8[„�B�E^��A���/W��y�U�^�#�p��|#M�nVo�~�����w?�*_���՛��oߐ�l�RuT�N�2�S~�Z����D�wF�Ӟ!s�Hd�P�&O���o�������@�Ek8��e�?l���c�GgQ.e����h���oy�����*�nV=��2�?���,��W9q+�A�}w@�E�?�w:vj���L����ebDX��v��Ĝ���;���S�{��	�3���!���k�j�B�A�=rw�k�Z�T��:�tc� )�h+
l9���ZH�T���0%�;!�q�z&���0)A���F;�X�H���5y�&��U��-���r��XB�:=� �:��u�7�ni�dG�6&%�/Q��!�C��\m*�Vܤ�~A��R\�e��I�$�c��V.ݢ�~B&����0��1�\�p�!�'��X��/L<����B���5�����3G� FQ�6��c�)�@�
�����
�l�S֮�M�W$���^���c
���/u�~JS��O	�@�W�%z
@q{�VA=�X��a�{9�N~n�B��d>�mʜ�Tl�L�7�c� ����[�k��=��_J��?C��I�_�4p�ji�t�e�uM~핺��WZk����#*�y�)�Q}�נz%~��9�ք�
����^q����W�����[���)?2�{�1m������a��ҵ�H3D�[���~.
2�!���u�6�L��l��%�(�63�0U�=���Y��5r��V��A���M�3�C
��ݷ@L�N�q�XX�����ѹ�SH�����W~Q����#�:B��ϝ��Ϡ�A��
0���9Ph����X	�!bU#*q�>2u�
��H��ȑ�Z��q���x�����IB�(y��}�T�쯴�~��-_@6�Kt?K���Q*�ed"+I>U$1��E�g��2�(;;��tE���7ش]=jZ!�B�͂�� �m����i�ظ7��-(+H䕞�x3��*�3�J.5(V��R3�m��+�f��̈�wә�Q�v��ش�x�"*�hJ���_WP
��h�#�mvT�X�K[ٳ|!Cp.*힙������!��\|�݌}e�qƏ�*��[J���A���M�YC�mp��M�{�A��62��C���L��f-wql;����ݦ�XYLBf�ͣ��áT0c���G\g��Ay\��G*�,I��)�931�i7�̼�y|�	��D_���L��_��}A��a��k;D.��ޮJ=.�(T�ipI��
)f�t
���r ]��?�]��ow�*���&E!8WIP��8]kH�^�k�*$YX`�#-�?� �$}EQ��������.��� �G�ؐ���{g'�
c'�%$����(걔B���u4���޽����P>���@ KG��)��7��$�O?
$m�)��	j�Y������7��O���PBy0�C~��o�$�ߠx�e�wF@/�ri�	ӂ�����n�����I�S|(�#Ny%�aT�V�δ?�M[)�=�/���š�ճ:j����^�q��~
*�tP�e�L��k�@8;���	+�R"[4+`�KHm���Tl��z�dCDSp_���JD����>j=(����^״~�m�M~6���}(<�y�
����*w��������X1�(D�M� �[�#}�p�>�Fj�h���x��G�ƻ���&���n�o���/Ȭ&]��h}�(��$�2�{��a�l�ܡHh%
�S��WT��:#�?��� +�r�V�����m?�9��||r.��o86�v�:Oin���d�YG7l7i�/3��5���X<.�E�AXG��%�N&Z�o*�3n�=`�ʶfB5�K3��$�;�#Ơ�x�{8;�Ȁ`�',����w�{9�G��K�F�p���
2m�BF=̀���:!MGp�wG�qQ=uz�-c��ALmB�‰C�T?�ĥ����q��4|��(}���iB�,��15Yk�[���W��0Î�������u�kq��};O�(`^{�Ehu�Rm"��4��N����3�EkҲMԄ)�-�?��3�W3�����)9��4{�Л
�V�Ɂ�/�X�x��vD1�F��8�>3��Fl']NG�Y���߷�'�SWZ�����Q�����o�1�Az����9��Im��տPK��mW�:���0setuptools/_distutils/command/install_scripts.py�UMo�0��W.:ۀ�R(����a@w+ñ�D�-��4�~�(YJbg�2K$�)&��Zh3��EE]W�z!�6e��R�7:��w}�J��lB$3�<F
)�V!7ї�ْ﷈�8���[%փ��{xSj#J	ZE]vQ$����Q���S�
�[ߎ��\����ha6&>~->~~xEQՖZ�,��Cf�Q�j
��XB�C>���8ib��Nh��1tШ
r��c�ܡ]i��j����QXR{0��Y~��D[��dm��	A��S,�E6��jUh4��{�rN�g��A�g�k
�hQπ�w��8
�$2�=s�3R�{�V�Fk�Ky*ӑ�	�*T�az���?1D�ۆ���YF����1�%�N��u
���1o>�j��7)��$�s���$����58�I��",�wr,�+={��m�K/�9����4�g���]��W��.�d�u���:#�~|�0���z������(�t�;�Yf��H/d�q�-!�I��d��
Ѹ���X
�\����7����EC�3���΀��>x��۠Mx�X/&vl���>��p{q���31�?����j�/X�s�x�
�q�-��Ύ�jj�Zǹ�0;��V��\�Ҕ�3=uO~��2��tww��+�x��iفyM�\���bՖ���!�|B:�f}��ʋl��� ��E�W�i5E
�x�Лc�oPK��mWCh�o�+setuptools/_distutils/command/py37compat.pyuR[k�0}��`m�tS�.2�����|�D�hX��$��ikqs�Kn�;9�|�q"��+˲"L Lr���E�q���-(F��*�7�=��#�(�DT�TS�`+R�K�F��5%C�-��}�cI��˦����">���ڥ�J%��ѡ��:���IǞ���5M'�p��O�vm��u*�U�s��v��n����!�"���x�_�l���E
�!t����9��ܸpW!�1�?j����4x��n�v�Ƙn���tk�z`(^D�H����֬�@:�:��]��tPY;�"m��������\H9�Nσ�
`��A$i�
����Rn�	��>K�Y��La0*,�PK��mW����t
�-)setuptools/_distutils/command/register.py�Zms�6��_���!�Ȍ�8�w<�6��I���u�J����"U���������iz����b��X�>��x<NDQV�H�0�W�(KB�0��ht�Z�|ų�`咳���y��c�*��!���%_�(s�
��x<��X,yT�?9:|r|4a7"^F2a?�/F#�Z�d^���Џ"�U2M�,\G���$��/��\�+��d&�E���<RS���k����͋J�6!�2���W�i=���(NAb�-�;l��ш�/�E,źy�Θ?6vC�![)f�C^o�%<���C����ĭ*���ĭvΎ�3����
��^
��b.�,�	�	�?1$�Hh��Q*�V�9���!��5f�y'Ҕe���B���Ĝ�V�����XG��%�Wi�E�Z�"�J/0���Y��<�o�ۺ{a�$�3���^VQͦ���.w�/y��h5K"V�t~
��xp��w'$JV��k|$�R���r|
Qܩ%.t�R(�i��2�_�����>e�g�M;ϕ�J��-V�,����|
~c"��V�r���Q���I�?u��f�o�sZ���D�A0G�Ƃ���F#�[��k
����bS�
o��cga�И�*�f�
��b�pj��o�a�5��9X{�MS���)��0P�b�w���O�����f�!.8������:3�2>���|-yL���������`��Hk�˜����&�}�� ���*��D��d<aנ�-��;�}������ ��q���.��!�
���o�{o]�I���Q���:�}['�y��.P4�$�!ޤ���`9�J�,/B{q�1-ՂO$�v-dl��W�=���g�#a��;sVS�yzȻ�#���8r=�G��kA3ؿ$JW5<�.�bj��idǝ��В�%�	�C�����۟_��ޜ__�^�����1�'#���(��9��/T��+rp����~{��!��Θ���oע2?`���cE+��8�/c�����F�'�g ��*M-l#�c��(F�?k�f%\�5��N���y���MI ��~�NL5_�X���{�p��.�}eN�����s�:���$�j�(�fW3����e
��*m���	�w5h˂]�i�Oe�Y%R�ΐf�=&�n����~��}�vΆ���$�w���}��t�E?��4�@jpo�Q�(|r�Y*B�]��&dB���1�B���wQ!bU�҃���mK�!��7���ց�Wf7��OLX���WWoΟ�A��c�%Tl�8#����5�b���
">�OI����tAw&?�c�,#�)ӈB�q���̟���
=�c��BFBv�8u"��Wg���@@�^Љ���]�Z�S0"O:�Z�S��)J����,kဆ��0��낑F˥���/s�m
p5�3�X�
�Fd-�
�eJR�oh�	˥K�4�$��B}X x�%K����.x�|��Hl�f;�p�'�b�]B�8���X,���,F*Ot�o�BN{�Q�;�	Y8H�!��/v��f�O�Zl�H�r�%�B�"E�˾ ��1{�N���b��`��kAj a���t���A�}8���w��s:�Y�!'���Br��[Y��M�c���Rv�p��F�i��#��˂g '�	g�
E��%

���ᓐ�^����T��@��$vt�~9��r���U�v"[W�EkOC[*�.�t4��>�0���Z��w��.��N4�W]�>��2P@���:W̉���*AM����R��&:z�;!c'��{�a�?���U[]���J5�0=B6�Ps�p��^�}{�y�Y��Y/�4k�!�����ۘ��辳a%�lj�~S9L���Xpb�:�})ß
��+��J�^O��
v��A�u�
w􀬛�2Y�Y�e��_�w7�Kp|x�����e�eD)�I�pu;�\lD���:ǯ�P��2`�#�({v;
�%齷��f#��9*߻Ti��V9ml�D�W�N`ގs2?�2p6��`K��yD�P�/��s5�HH�=��R��3�v�]O��J����m���>ܡ@Gto�����u��E&�+U�퓟�o�~��@��W#�Wä
������'������/��h���o�m�[\W�wB<v��<��r�شs�Az��t����@z�w뚢%��e��ď��2uwjK�,�?���N�m�C�~�v�S��\�n��Ev���w��8z�S�k�mDɵ^�}�J�x�h<l/r��Ik߁��70�1�g�nd����
$�/���K��ג�\|DxY#t���m��	f��]P��;��M�����2�G�y�_A�vuh�����gD$�f؝�eol�<�9�~Q 	�7�;�6T�'L��j����b���=p{m�*k`-�$�D���Ħb,H	�m�ޜ��,@��ob�~�R��c���.D�4�)��������^��2�)IC���o�]O���iQ`�[��̠C�sBٱpd�¥C�`>�65��r�r�\�K�&:�R�i�V���ְ�q��l�S�|�׳���:�J�'�X�u��f����
��E��⣵�Ӳ�ۋ���5{ztҒU�h��Z�u��zVH�X�u��Y�c�t�͠M�D�&_k��Y.�1��5�lr�
�wݛD��(<�_�@��}~z��	�L�2=����_c1(�Uc���'u	M�D����a�;0��ޘ�p㝽��k��w�aI��×q�C{�;�����9D�-��c�9���	�3|��{?�}��Nj^������g'O/~��ū����yr�<?yz�줱s��S����c��MR���Y���,�$yxKG}ye5|P7���tCQ�U瓌=�ρܾ��(u�w�B��:�d� j��>ma�F����6��cA�+]%���?�n�k�?�׃��tH�B�F�Ҿmȝ�p4��K���KQ�?…>E�V����d���~1����;���g��N���JC������=��r��u��<Zz$�	@$6�S�4J+��M��g�퇽cG��i�/��!�F�]��*��;_�"纩?��sK%�{����n�`V�k$�'��h����~�	8������ܤ�oʳE���R��:�n���n��֣�J��U&Z-���þ-S��i�(��^�~��^E��B|8�#�B�j�wt�id�Jq�Mm�Z�3�1�UM+��r�z���J��������S����X�b�D�O;�m��$Pwm�w�ul���I��m�⡪x�*;����L�۳��	y�K���a>O�]�Rt�X#�1J�]���v��䅿�"���W�3
D�s��O\�Z�5�{��PK��mW�t��v=J&setuptools/_distutils/command/sdist.py�<]��6���+��r��It�y����5�s���.ۗ<�>DB3�#ȑ����n|Ay���L$h4��
/����З����x�u�I|tu���V�(�^�� �s3�%4 az<K�N�^0�d3t�`��+�0����b���*�m����<˫]�پj�L?����wuY�y����+�N�w
�`�y[��̼ޕ���w��|��z�� 3�=<x	�Á8��_f��/�t|ͪه�y�7���M�C8Nt]�Y@�q�p�_���[d=���*Ď�Cs����{�.o�|��o��bTk)�-�W��ƒ�$zR���A��m�G,�냨ڵ�0R���Z�Y�̬H����ً[Z�_�Ql��?3��ۻ�|������o}������b���'�@?deN���ْǙ��u����v��M�\�ߚZ���,�A���K�L�R���|�_/�y�AR�v��kv�?��ȿ�ƚ%nK���R2�T��@B�]��|���K{�mArV�Kْ�����l�0�v,?���~s=/x�S)��C_�;�A��\���L۵�aWvқ��0� :�-��6J�$�y�Jqbeo�
?�臮f�zfp��
�d�NL�^��m�bI�8�^�(���_��3��>	�P�7��g��z�����?-�+��JЏ���
 �V�z�L&¹(�
AD��`)H#�]q�L4��b@;�����uc�Pq�D0)�:�%����P�ي�ܕ9�љ��
��O�I��o�R���38T���m��=+� Y�v(aT�	��w������h��S���DQ�}�l�����uSWg���?`b'�����\t���쌷�j�4[�Q����Y���/q���<��r��Bλ���p	j8�*�py.Z�!�,n�m'~)�w��Y:+�I��z�F'j����h9Af���ѮQ�q����k(J��{�^t��,���Sq�kG���`Y��$�Qx��?��a��
���6*~L�ohBh���\�����E-�N(��Т�;N&�D�P��[��IZ��"c@����>;��������'j5^�sF���	%�R�3�b�a͇�4�)��o-���V���k�Ho�O�'m���v�Rh܍M�>��!T�ٙ�\,�b(2�4݀0"!4�!K,VY���uJ�Z쁺b�x���67, Ut��-�1�d�P�!���ȃ��&F�'1�R#�ų翾x��D}GҩoY��w~u@��&�uٗ�*�C�0N�f6I�jZ����T'�
"=��4�5́��N� 8/������[��N�/]���#��}7�'t�`.�~N���k?�o���8�����&%�8[��j2�d�(w���ڳA�M���o�FO(FoM^C�K��^�:�3��L�4޲(|���(z�6���t�R�0,Lt����4���;/b	r44��hT��7ꅟ-/�xn�	7��:=vY�t��8w��"�}����{�d��5�h�D&��Y�ك!���y�9FQ����:D,�)c`���yY��P�SK%���Im���E6��z�
ɭ-��K�H�j���f �̛��bC>�ԩ�^��2���]6i������3H��I	��#1V豍C�5�����Gq���CtWC��00cV��2cD�0ƴy>��BN�z�2	�3҄�]Մ��v�0JN�Fx�h& _�\�3������Sv��v'Њ�7�9
�+
s�))8�@���*/�wC��(�T���Jc����y����R�s�̇��+,��(?�©m�Z+�[�x獨��
��U3����V��~I4�M����+�Tc2��/�p��v�tMI���c��3�c|�v�����	�+e�z�����r��M�0B}C5�G8)B>ueY�L�z\�dGͻI�d�F�Az��	,J�mq�b"uATf.y�ʼnmŁ?�$�F�5�ݎk���5(9U�m*
d�%X�-<���+ǿ�6a+C��g+�N�x�E�(����Ȣ�esԥ�p�v�wx[�� ģ�q��'��K푭���ҋ!�Cc�hC�FfXh�J��k7��>� ���$nJ���[���&.;�Q=;���[��ı��� WF{#�ѡM��$�#Y�t1�"�OX�/�+�g�*�4EWPؓ�i3��w��UK#��D��j_ӿN�[���Dzw���x�+ށ���Y;�m{jƟ�jB�F6�C���Z�h7�<�`̉�0����7t��͹?��<6ŀX`�����&S'��
�))�ٞY��{����V��M{^�L�͗zJ��i���\jl"#�ϓ$�jp�;��s���'@�;��8�=2���5KQ�Xb�`*FX������D�LcLZNl�.����՚-,QIJה��U�y)��J�f`*yWL$�f�^ՒL\32��8 ��9(�+@4Ӎ���/sMa5o�K:��V%�I�嫟�~ǥXK
,�0�,��s8����V�xY��F��͈��n�01�Vt�r�WN���=�q�s�ď>��a]���oeS
=靄���ٚ��É:�'�O��N���Hm)�gI��}�玓4�vG2Cp��X�9���}��#�)]7\E�z%`���&:���X>��!�Ĵ��Ф;��A�+��f�z�f�LIi�ǫ)|�f4�΄
PG0���	l��ݢ>������qPD�U�Ƒc��!��dp�Oqn̩"�jSӡ�H}���	~*E.}���N�f�>�N�.��AK,\!�u�>��*�^X��Q�)��_�a��H�yS=���ԏ�WԔ�j �KA69h���ݛvK���	5�qҡ�*1�C Fh�@�7	I�Xf,o�un݂���m%,1��D�)+�hЊѢ��I[��F9��4��
D�K��q�6�k:�m]��GϏQ�}����$���v9�KWz}5�_ά�[�y��Ξ�TT%���9��(�Y�s����Rz�'|��n(5�.$G[��Y#j�ׄ0���͘�k��&g�� �^��;X<�i�3��*ހ^C��rґ��r��)�ѰI\7:���+Rgdž����)�vh������^��g�&ˆ-�3Gi'x��q�#L�<o���9�c�D�U��S��)��]��oٖIs�/���_>j[z��wf���8�Z�[sXi����U��F��^�t)���T���%{�����:IŸx~���vLs�*���%$�C[`������òuu���U���wM�0��x}o����9G���/��!/[�!6��O���=��h;�m�c�&V
։~tΏ�0�x+����D}Y���dLM�-��S���S[	:@��i���	�O����LV2A�||�ׂcE����)��h���87��dձ5�i'G��s�NS30��F8���4lԦ���$�u%D��z!����ԭ~����:��u�XX;�W��'�3��	dnO$&.�e�q���l�c���.bȿ	���%d�3�q����-���橅{Cm1�n����Y�-�����K@_u|;���K��x�a46���S�[Q5�ج���;Zal�F�[���Nj�dx'*��>Y�/�S �R�A�V�` �^H��R���C�f�N]��FҌ�xۦ�}��c�ۻw+v�;���C
�?d�����/ �5w�dN�q��=?�:�o��d��:�ǿ���Px�Ot3�F�)��!Av��[Z/S�ך;��D#���!��@�noYr*�����c�aA�<����ī=G&O�q��\Ⲫ%������K>"���^��o����@�M���˴}W���D.S�_�]������ҵ��rEh?��f�H��5>[w�*��L5��O�Ա�E��ȱG�^T�U{
��P�L����±�R�$�h�ֹ}�:�7X��G�
����#$���h,�&y�n۱<�/��b����NN+!�p�)(K�� 0�j�_^����/�#�l��
)��{&��M_T�g��{�M�ZW��2K/g�����Q��yNM
���z�����U������G��x$ѹ��5�g��'�G�6���t���l:�:��XLu�0�8�%��n����$Hf.Jf&z��9�\ٱS	;�gs԰;�G��]?ߜ��⸚SM���R��LZ*��gF(�-�5^P5)ъ��e�������󮗈{�\'t>�����1-jrYGNI�e�X���9Jm0�"Z�l��jO2��7v�9�LL���݊����v��1�&�����#�M�L!v̊	9j}71)�Bt,1HV�'xn4�G���v��[��������k�������BJ�N@�Gu�$�6h�
H�@��Kw=��e(��C"CU���~Px�he�t[�|
�F	T�U��~3�S��p"�(�&��n9 �g�p�b������=�!d�P��:�UIAQ�G��~�Z�����8�?�-�
�p:D��ݴ5%݁\�A��H�nU(�~xGϰg�W 0���[1Q�fQ�T�(b R :7��갎%����ޘ^^��;��*�n\��txˣ�&Q0��E4"�Z�q-�Eb״&�!����,2{#���U�j�4�h�v76BX�Cr[��X����'~v��0'Ѥ*|iZN��ik!3?�8p	�2��A�4N�7�x�:,ct+&H#$$a9�x�G'��Ʊ�^#�@�=�Y���}�=?oa�k0�-�N�A&<�� ���p�1,�Nw�J7Ee�Ӫ�H݌�F��m��}V5���ɧ����X��}>fN)�
���DF��	4�~��2w�e,<�x[V�c�uq�;����w��@Fl,�+D%��[�&�^�cZ�u����7D� ���kq�F{w��S�nt��I��:p�_��1'�Ha����] �=OŽ�*Yj��(b�{��[6t�;����k�$^��(x���/ژIy(�ʽ������1᝴%u���G�D�H���~g���lqe�4�z��6�X��t��<�sr�(�Xzӑ�\����[5�luk{�]+S�B~���r�R@��-S�ڽj4ƍ��O�gԩH��e�^����W�k��Q��r��+����`�z�Hd;��S���,�ۓ2R��:n];��m?{�m�a��>5�1��mZ�A	>�sJ��nC��cy9�y��ͽn˻yd�t��M������ԝe������c�=��H���7+�2��D�P�BA�~O\�o|B�Q�Y�z!b47e|U�e��_55t�l�?�d�� ��u)�����6�DhE`;�>nj�ŧ�?PK��mWj��P�	�'setuptools/_distutils/command/upload.py�ks�:����N؋i�&�]��>�6��M&���v<d[[�I}w��	��[ϴ1��G�<o�qY75�e���-����f��Ů�َ�$���w���'�IZ$�3R���0R����/2�=�g��]U����|���r��d��$T��'�}%k�BE�J^��"-3���F,�&k
�eŊ�\��|���:�ZE�d�z��]�IՙAQ���˪�ea�-+:.W����o�ن���E�2> ̻���f�'��l[6��l*|-ɧw�����eD�?or��� Q�p���+�x�,i62����,�Rl�q)vr����V��Vo/?ߞ}�]��xvs{C��3o���2�{�a5�k�~��k/"�˂��F�[
��h���{�P5T��+�9���󇋙��1�
���ym('��boG4"{�-V�B��㐍����;�����|S��u�D��5ϙD6-�F�bC6��#�� %y�_"����zO�)
�!�����UK��e�h�������1ؚ�ל�/f���5��0si>߁�2]AwD�}�Un|(E6�Jnˇ�`���z4x��X�s�Cv;o:�-U��ڭ��?��4t��n��EY����#(�l���ʌO
�=L��\���c������O�C�1-�5߀�H`K���}�E8z�p���z�>
y�#����Rn����J��R�-��p��;�M��	��3
�\'�*�x��W�AXH`�J�{e7���${/�0� mg��׹�c���Nl6��	[{�c��ȵ�p��a�*��w'1.h)�fJ�L���c�&�(N1Tob4VSA�!9�dB/��yzX���iD��=#%�
D��U�1�R��C����6
҈�d9�	�KB�	A�O�^$\"�*紨�ʕnَF�`u^�.��
���yG쁗�=�-�GG3���r�\S#`\E�t�j�k	Y޻Ȼ(PlZ�$gȑ<�y:��p�H��
NpZ��p��M
)~�3l�������<h^�kh'�
�J`��,�qY�V��b�&����o>�`
I�����vҰ
,FIb8�/��*6�9���s��@��;C!�H�L�WP�:�c�s��h{U�hM�B6S8Ƴ�:W/(���<0�B5pXd��d����xנN灱R���ï�@�Ac@S�<�:�j��~�y	n醒O�L|�u�J=3�:��i����_UY�k�kz�e]�e�j��?���~d.ED5ЅR#�~��� p�tp�����Ʋ.���%l��Ƹ�)�]	�Z��P�+֔��9���}mJG���mi��K�8�1k|4��l@
,�X�Ȅ�r�V��6ԯ m`Y6�� �O��#���fYA�c�[�8�e�9��7��aA�H�l\崆^�����Z�\|�5���X��PM��x�:"��{vE^<?e�=���ڜ��b��6g#�2���.tw8�1s�ʝ����U�0Vɴ���W:3�>Sy��W3�ē+z�k��qK#� Y��g܈P^4n�N3K:��b�:o�w}������&��y�T�x�n�Z�j@���4��M-�4����T%��~D	'dw�n��޺M
�/�2�//$T��#��#QZ�\��}��������i�N��-��T�Ƣ��$�N�Rh��]�@�����-#��][�|�[M�	�6�;T0�`p�*��	v[x	�����,���.�t���V)�b8H���OJ�E''�z:�on�P�S=���N�0Θ��%Л��1㧋Og�n�`��W�7��iHI� 3�J���y������}|�����ɋ���x�����˓c���ɋ���2�ZY����R��>(d��j6�C
�A0$�[Bg������e�nU�
"r�Y�5��.)0���ɿ��>��M
��R۩�A.=X|��à�o�i@l��5����#cz��4�EM-
��vh�J��0���J�t���S4r�V_��G�%���6������n-�,�(�}��4bj��c ��G�TH�V�.l�z=��Gh��N\��9�tR>��x%��;���M���<�����Н�_�ax7M��空j�ki���7TCA��E�!��^�������K�~$�~`���=t�P�a�-�I�vn�u�SQ?�2��|*1r�c4M
���[ �Z&�3��h����e�������(5�<�T�X"�C]�5���k��h����]�2�������e�n��CB���	�,u��B�S�j����g#l��d똰X�5I�MQ��y��e�<X�T��]__^Oܑ��L+Ғ���0���̃�2\[�&�Z��<��}�
V����T��{=�r��q����C7��]�"|h�'�N#E2"�y����O��ڲ������CF;`���c>�Ȩo<�PK��mWsetuptools/_vendor/__init__.pyPK��mWD�*�;!setuptools/_vendor/ordered_set.py�[�o������DJ7B'�^P�H�ՠw�C��A�v)��}薻��\���K�C���8!��%9����x<��ٿ�D�"���qת*2�S]�e*�q��+E&��(��b.��*��n$�ܱ5*9�y"��h_���Eq#Vof��߹�?��+E,7(�k��4ݱM�*�
�&�䭸�x%�;���r���]V�	���*y
��8|+E*�l
[���`?�}�R�\��h�٦(᠕(��H�S<�hU‰�"MlX��L�K�o���X�F>'�]����k{ٌ/c���_�.�L����Ŧboi�weY�-��g_�R�Kut���o�[���Gv��w�s���h��(X�X��lv:�F�X��(�5)��N5(!���l+@g2�	�he��@{��T��+1LP��|ę�g��c#r�,^����
����X\1^U�\֠_�%X�2qq�jܡ�q�h%E����
d	Pu��AA�"�S���5��:�e�xY��!�ؐ�^[�-L^u� �D-�p1;�1��i�,8	D,/47V�j��ù��.`2���H��Q��L+�!h�q)`� z��Lڑ�_��>t.�BYZఫ:�q��+Yljy�`?�1����۫��|7�P��.s6�/�������-���M�s��d��sUU�DR�Ӧ�8�Jy>j�gm�~�F�ȱ�{86\������Y_�~���4b��y���缑IkN0�x4�0^y.��b�D�����]qt��㿜��3���>��r���P5H�!g�����L��T�%����# )Bm^���ajA�|wbE�4�Т������.�=�7�N�9��8%M������h$<�%q-*|�(3 ��h�"C�^C�3(�5G�bW��J��|�vEͶ2M�ɖ��FQ��\D�̑���Cڞ=��/ɧg2��;m��l��A�%]\��P�F*���|��DŽ]�%3�]?V��V�vZ@d��,P��ʢ��n�
&�;�^���܋�1�0|D�
{�t`ԺF��
���v�[GV8l��ɗ��#���xU^�!1��jv~�\��fN莋�n�0#R&ml{�/�s��D�%󐤍)�Y�*��D��q�.Ι�q�YW<zQDn�k�b��hv��:�����ܒK@�{�ܔN��R���4���w�Q9f���i���3F�^C�
���A$\�
��1��GC������
	����ӑ����9y�o锄�r�
+�nTY�?E^��r9�� U-�"<F��z٦��f�����쮴��ʺZ�t�� h�-��b��/�E��&���(\
�1�V
Ș!'�.y,V5_�(�B�ئ��
=�=L��$.1]�d�6�;�Du`(��2QO���oq�mx%1���j�"�)ŭ,j�Lݢ�~����Ӕh�϶L��w��B-G�����*A�f�nR4s9��|+�\���
 �丹�~/ ��U�=H�<Iu���׵,���҆}����Ή�ln�Ȅ'�AQ�Iv�W̤�(J8�_;D(���()��fYD󟴄�vgR���@�'�5���UI��R���?㛍ȓ�١�v�m5�%�L_G�on%�*�]� �^��9p�΃;s�eu��-E-2=���(ԛ�ŚiX����o��}H}
}1ٵ�t,�N��\��BEes=�z��T�Lof{yF��K���5�Ń��Jϗ!�	X��<��&ﵽ0�����O���̓��q4l|�K�sIP_���:E��1~S^פ��4�x�-��G
&l�L�Z�6�7`��=�+�������BD��&[���:���+�f��F�<�iOez�)��-$]
�B	0��l���+�����Q^���k_�Z�����᪦)<B�{�2e�VO��y�Q�7���LkU�:a��ŭL�5�	���TBGe���:7��"-b8���7J{[���zV��&��D]b��<��CKQ�b��d� h���/�M<Q8t6�Jd�,ݲ?_x���
�(���{��ljH�‘J���T"U��Akw*��1�mAg�g�rr�ۢ��e�X8xM�L�^kE�,ɣITiu:+i�ɔe�ZI�
��{���'���-�:��/
�g�T܁�St�}�Xi>���O�{R#��b�����-ʁ�޵�n"v�c�Τ�W<޲��g�C�i����=G��R��c�Q����q>A�=�]ڒ��n+z��J!}�����v0Vz����%�ڼn`_}B���%�(�|
���q���^��A�7=�\sot?�a�4	�'�W�3���N��K��y�y����U���9t�%�
w����}]h/�tAB���՞�u�TJ��v�ad+����yQ~J�S/7�ϙ�r������OX�w��wAPQ@[��@��\]�5{��6��8(�+*��~�D�
]�ꀵ�f��
S3{O?���5�#6i�"&�-�z¾����f�k��fM-{
��A��1��\/�-Q�o��w�V(s��-a�"��W�6��^���:�m�50ᴷT��� k�H7ru
��!
�sȦ;���C�d�l�
��o�l	��(Z�Fm���r(t s[H��Y�9��%��؊�%b�A>�<�lky]�ϧ�6�yD����ұD_�%���mb��/�z~<���,p�}8}���N�
dYq�l.�D�p���S�o4Ěp� ɘ�� bg��O�P�c'	���co��&:M��P�:�~ҍ�P�
ư�^R�m3{N偽���U+�=�(d
�kSx��-�R�:
߬�&C��[�)�0�2�
��ӦJ��cEa�z�	��Q�̽CaMh��GKl�K�1�V�`�7�v;s>����s_�d�T*��I���*
-"ZƎ�$Z]�te�7���6��p�1V���
����#��)���Z�J���\�\�>�+֫˙�b,�.}�AԾس��A5�����B�#��S7�s �\��S�O�T�^���P�Do�nׂN�s}R&����c�>���&�!�h[�zˠ#���7 {�k��+���4F��+ۼ�Y,�-6��U�AoJl���tb���҆RK���P��gN��v#\��@4=Z�M}�V�P�Q�Q�T�_����k��o'uj�e�*e����]]�Z
^���s[x"���9�0����{}����~
� j8��;W^��%}��'T�
��)Έ6Ԡt	V�b��|�5#�PW8)�Ρ�c�i��}��M/���W{�q��|
S)]���P�Jm���uQ�uH��e���)�� D�0�G���zh��j�|"�&��r������v�=g�9�&�{��&>���B��!$i���=�5>�iǀG��
��Nw��5��9gp���Y��Ч����u�f%L��ؗ�.�w!�e��E���ͽ���'c,�+a. ����5@�{�,A�HA`��C��{�h
�O�4��~��Bf��e�EU,��tw��K�4Gq��ض������"������@���6�t#B�[��bC]�b�<M*�x�s�����E�>I����Dȡ/`��\X�Y�@��9P�ud��Q�I�_z�N'*[�LP6o��Q�O�����i�3q�9�"���1P���+;���O�K�O�9���PK��mW��+\�x�setuptools/_vendor/pyparsing.py�}m{�6��>O��ܮ��Rl��n�]�qZ�:/7v���x��m��H���xS�o��AIv�={K$0��`0/��i>�O�`v=��2����O?��v��u���WA8�kk��k�_��x>	���w�H��뤘�e��Y���yR$'�YgU2���"I��4���YU��u0K�*�'U�f�:������s�T��U\$P~�e���@�|4�&YW��i:I� �α;A�@*uz��8�'A��$P����:��UP$eU�#A��d>����t�J;��R"�y	C��F����&4��d������ɼ��%>%V�=̋�L&��h�u�4�Pf��J0F�_��S{H���y�A�ɘƝ���_�Q%���i>��W0Lh8�8�rS&���'�eB#c
��
zͽ�I�Փ-����qB�g$B�1�{RV@)��,/�]w�Տ�w��W��~���߼��޳�gAg�~w�৽��_�x@�7�/��zl��{����g��ݟ_��=8^�	�^����}{/w�|����)T}��0��{�wp_Q�mo�=G(/v��|O������=
���D���v�z����Ώ��o��?�y��`:� ��{��
4��b��!�
چ����wp�>5��#�
�r��뿿����W��v���]���]n���ii�oh�g�/��ۥ���*)}��]zMn�v�^�D��zy�~~_�9Ե�;؍��7{���o^A�]���@՗�1�}G z���ǃݺG�v����7'�'��O�CX��a����N���'�)��v&����	��qɫ�4͘(�w��W��ߙN��l}���G��)vh�J���x6+�xt�	<��uW�W�NgPW�f��R���%,�I���u<i�.$,��N���'q�g��pM��'�]u?��:���8Ϻ����$.���*(�����P0ZM$b{Ӹ��C��속
��"�L�8]�8O�� ^>�9���
;C�G����#w:׸�YÚ\#y}
3�
��'������O���F�����g� �N�sa[��p|�����2�̙�?����x�K�'�un`�8���*�Ϡ�X}�=@�D�e?�i�'7̝��og� �$��;��}�}��U���p
�On��g\A�΀NJ]��+0l�/�3'n{�*��.��Jx3��`V�mn"����3�D
t�Q;q<��ǥ*yO�"�y@S���e��P�r�^� �D��}�YG�>�	�j�����s~��?vN�h:�����N&���w`s'�Go��G]zԍ�n�����Y�X�f*�ń��b��B�ޯs@=����6h�E��l�}��I���$Edd�4)e3�.	��.=��)��^�'*z���IU��F^$l�@
4�RH����ǭo�G��N��F#�{���Hf �T�aX�$�"&�g�~"}@�+�o�78�9E�2�&
�0��é0$��z��@d�.�wX��<ɂ�"�%\%�*^�J+��ABi����$E�Q�s��4O�\��hSH3��AL>A�O�j4�Q{��sĎ�O���$��3ʧ��~�]RQ����m��O����O���)s>��ɼc��0*�w���\�yY9�+�YB�"i/�M��A�c�P`V<���]�[�f���讙���֦ $�9��	K�X����A<�"��Y�6�33�hiCf@Q½������M ��+)�Wŋ�HT7_e�z`v,3u��Oh�u���yZ��<�G������>ޅ�`�%�y��"�]���(|��wA�I'�ه�	/@�I^c<� y���k�L*���P��@��N;;�c]���a�菐�N�D�8��P2��P�{uj����.	�dPfO��K��h�ʜ�<�2"�}X�����`c��1�ӄ_��� �tL][�����*
�(�K�U���Y5��u�<eP6G	���d�%�j^vO^�~B�}��Er�vV�
��
��
xz�k_��;r2f�z]�H��b�$�d�#���h�?����xtQ?��!�P�@6�IuX���U��!6�s��T�7�9�Lލ�Y���ݢ��W1D
�e����GFEc`��d���!�8AarY� �A� ��S7�1���j��5���Ϋb��H.C���p5�+��l��
?fqX"/aQ��	wPV��6��A6X���=>
dA����y�6����|#w���p��iq}�Ix,
Fj�!���|$�=��|�W{�bΊ_q(�0��Ϊ�.���IdL�O���I���|2���p�/F��n�����?�C����˜~��j;�6�6�?&ׯ��񩏾���S�.M �Ɨ�TX�n����͂��G��*�%UK�G�rt0l�T�
>�?$�\���	f�2���f��7�Y��\��C�ʹ� �h��g�y�~�_$���#�"����?��'�X���UC��}�^���Z�L��듔�Qrg���a|&?_͒L~���I���=șpg�aG�FvM~����/�w3�N�����E����:>�؈�����f1s���^�ҷ�*%�h�	/��{��c��j:1�_�n_&��&�z���d9A��	�pEM��͟�:p	lW;�D?y]$�i>/�r����U,�O&ϒ���HQ��Y�S��l%)��R%�Dm����y6Rd0�=��Ư��N4Y%���(�f�c��p��i_0[�M�eUqv�/�pJ{��$@k�F�<KG�8�a�g6!�0���qd�I���rBV�������L���)&�f��;�p17مZ�11��x�����6RF�-bq:��>T%S�}�NQ�A<q{R�t!�m>��>|e�JGk����i�%d��y���+��2��l�x�b��۪ৈ�����c/U%q�
���x��Q��g�[JQ�C'69����
�X�{��ngO�&n��|�$�@�/��G�G�H��#x��Y>�F��$��2T�Q^�I���L|E����5�1��4�0?��g� �?+�Y?%�
9.:Z��<r�lBG"��L� �	ί ����Q.V�G�(tʠN�t"��X����_v�I��MY
HeA���E��z&)�40�	�."5J�����C��-�������a
S����I3&2	��l\�)2��ɵH,�����4�T�Y�~#C-��T�&(��T�' �_�^5y����x{� �])�9?���a
���F@��rI�gI%��!�Qu�M'�^�#��d�gC�p�R¢��{o��m/��j�ن�xz2��j3�};��h�.��V��66��ǽ�=�y�f@F����m(��ݎ��/`���~�~�9�wr����P�?��O�0���p)dR£4���B�D4�w����7u�l�V��������c�<B TJ�F�"�R�נE�����P{��O��r�d,;�1�#���4x�� N����O?!^	�;L�QE���Oإ�����q<���I�H���}��Ċь0%�S���1X�8�B�cf���tX^OO�	Nb�OOw�v�r�̍Wa�O���]��4��HpV��P�	�Y^�9��D+�3��f��ю9�8$h�F&]�zTA���B8tV�w��$dƬ��H���',�S+[��A\��tNJ�@!���φ���OPv�>n����G_|�՟���/3��o��ӝg����vG�R[r����I��;�1"�f��wgJ��;�_�4G��bT:���2�+x�e��Ոj�"C�� C�&'���u\��_�QuI�\�752A���n�smW��⍃����/whQ�E��h�R`t��7�)vI�4.I��W�ZKC���C����A(m���S�m�V#��:��$�UP��Z;4Tŋ�������1��K��o\8�o;�~c�š��){�j�†�I�J����2i��G�zg�#�x���{�sv-��tS�Z���G�#��}��X��+�"�ėy:.X��k~����N'p�-��x�>?�U��.C����d�؁/� �8���{��;�m�����=K%��ꋲ����x��PC?��3|1P|���$)�Y�P�f̅2�'��n�Z�t�E6�ZđvCA��:<�N�"���P/��X	�>��;0F���vzm��`�/��
k��S`��R���5�Y}��;��A�
Z������-�&��طv�	5����$�����)�._�+>y�[��4..��ټ�q�ä8PG�Γ�w܅����#���I�R�!�
��|����#�1*(�;���!�Y2B;5Xڎp�P�
e�[Aܖ��~�n�2�1�P"A��mMG��u?f;�}d@��I�1���;-"�H4��f�܈�A��!��TוVjI�)�"�w��ȯ26��y��P|kMm}+�y�2���̎��vs�ъ�zPT��	���n�gI��YF:(�v��*gcG���}$�����=����H�Ģ�|zN�Ok�����;X�Y�R�k�����:3�u�jvݡ0u�0(ԾCYL�x��'�$�=��k���c�xqf���C4����[`q����t:M�h!0�^�m�J'���/x�O�����(�8�����t|�=�m�k����'7p����O=3NQ},-z|�*�q�r�1f8��b4Ո�`��]8n�o�oL�MR��$�=�dU��%�7�lUFuh��!�d�>}[�B*��IMg��H���oX�m��ilrƢ�*}�}�AzJ��l��bI���i�� as��x2���]D)+��[��5�Ĭ[��X�Q14��*
����m�x��8�C-ܙ�I��J�ilj3yV��L%�@f�ж�Ȟ='��CI"�>A����,)�O��j��[�W�g���m�5�hr���i�8��1"q.PXf�j^��{�6n��*�y�6K�q�Z���[�|^���o��'�w�x1����?G�d
�F;[�f�V���snL�bJj���(G�G�n��m�k���(d,�&������sbth28����,b�H#1��$E��4���
P�
������b��SIg$Y(�{7=��6����wXRJ�hTo�֏oj�N��������Em4[.���'7�����-C²4�J���<�\'1�` >wv
}��y���Hq�A��uǔ��ɯ�����MM�gJ:�xP?��f��&͛�{�!�j�8�Un��u��Y���K�]��o�o<|�n����B ��l����N�'�l�t�^²�3F�:H�BǽN�-��m}�%lu[i�;�EwT�W$�����jc>��`��z-�x`��-��x��Y��_�w��‹{��u/��F�b���]X�0oz<X�B��!�n3�>�f�h�|D���dž�<���=D	�F|�r��U7^�k\�n��$_�xB߭]Ծ�P*H[t^R�چ`���u70��sK
��P(n�]of�q��t�p[,G^��.�i�UX�]s��(��J1����W�%`?�O_������eh�x�U�[$`�!���K���Hl�Z��*Q�8�}�����j�'ߎ6���B��{Wj�X����4�^G�؋^x9fs]�Z�U�%]҉in6p�Eh��;U���8�V��	�`�J(�uä��)ל���T�n�Y��>6���P�$]/Z��;��7Ŭ�DL��6���'��lPɨۍ��{�A�	��뫃c���c/x^y-`�͛�Q[�<������^����k!�[5e>���Mk�5�E䰤{M�hk��>� �u���5[�!�o{xT��+ψ�w�gJ٥��{�Ft��J�F�zKfs$}m�6�m\��[��c��Q���ɖy��(1"��4�R7�wk.�.��r�]��e�B�.z�]��!���‹�6���.�]`~�.-D���EdLr{'hr���6�]�Ҷ�/aA��نrx����{S�!-uiRZͯ�z�Eh�^���ڼ���p+hԷ��B$�����I���.�{Sc��yi�>��6����S�[&��{n/a�6|��ޱ��/E4b����@
��pϽܑZ�힦��3�")�ќ�p\�+ W �$�Th�_6����}8D��zւK,\$$�s��

�wA�ͧ(M&�щE��(��u٭��1�ߟ�X֏ͥlӣ0K{��Eci�J�&���RL���շ��k����D�?U��6���*Hy�Ϥ���L��wURx����GY��X�h�-X�"�.=ZmX��qIv�6*����u��܊���%�(F�m6��|�Ү�'H��jz������y���%�&z�શ�~�҃*lu?�N�R+2R(lj��¡D-D�C��:@���u�4�ŏ\Am��Sshi��C������$�k/iء+�^���C.~/</l��uk�bZ8�۶��Պ����Et�bt�~�.�0[ҦB%_2
<�Pu��{,벚�ߵ��;�C��F�Z��HPqɓ�;�I$����B9� ���_}�Rw#b1�C"�+f4��n���\�آc��lX��J��!�`t�DuD�a�Sƈ{ys��'G:�gJ`������~k5i~C�GS�G$��
�
�i��������nz���������<�:x��{��
�k�1�F�������
��!���pɂNS�C�ǣ/��=Ҁ�Pi���Mp����em@�HQ.b��ٙ�X Y��!��A��ɵ�]���אj$莑	Ƚ��fg���exM&&U�lTp��j��oZ �%`��SL���;��1���W���2}R�`a��,�U����ر�[�7�6�;=Ԧ�5�_?=���
��i�x<6��́�аݦ��$>I&N01�_ ��!�����t!��oH��P�~ZwS��z̓6FC��"1lF±Cx��TY�N�Dȴ�(*��c-F+-:V�%��V��m"�e�	܇!ܪV�K���l?�^lPҝ�%�]�[</"�w:!�2���_�a����i����
t��t=3��q�/��\�v;ĦsZov�R�ph�(s�WR����e�.z�[�T��Ү��3:�8��e�:�5�E{�*�bD�xD��51iY� /�w�,�R�n��A�EM	�LT!�#U�oX��H,QX�DG�$��2�,�|t�]K1����_o�4�!��e��& �v�ˠ�����Jб���t�b�Q`��1"hcTE�n��
���n��r�[Y�����_�&��k��r��tW"�Bu
�z�0U׾�w�P�Z��#(����^s�����F*�)�+�ma�Q��l{%�j����4��/����"Y���ޭ&�}lA�	�l�!qpk�H���ٽ߰��)B0�!��B�'
����5��n!�:"���r|Ak�dW�Zl���Ej���-n>�ࣨ��`��	��_�$�������=��j=iBu��-�jT���;�	{�E��6�;`�
{5�F"�{��)��*���Q;H��t�,;�gt��֤�h��b�{pF�_|��j��#�Xԕ���*�_�X��\i�t(�If|�t�'�O�E�2��sB�R�CR\%���1���j�c_�$,2�,�A���
����4s+�}zLٺ�]v(��ZOw�9}u�lR^�	�����`rQ
��7�b\^LN����_���B!�6T,��G��-E}����RӢ����K
1��WS2�M�TK]�I�i���=ܝeA	1	��M��GVF��tIY.�+�h��-�v�=f�X�퇨���	b�t�Z_���P55�¹ެ=�Ѱ�~Mu����k��.iN[g$'�B,Yl�t��T�W񦪏����AA��:
U���'%^yj��&���6�U:B͆�#��\�-����/i�HFO5i\z,t
}���[��L�i_�Yņ��=�۶vMg��F�zm�3<=���aA�%��mR-�T
Jm����dYLL��zk�a�tO� ǹ��L�o
,Y�c���S��Z9ccAz�=���Ea�*;t#'SO8;��Gcy ��h�p��#/S�����+Q�9��K(溱%Ζ�#Գ����s���1�E���)�m�6������V��4zV\�Lf[ݮ�;��e;Px�i4�܂�6�����Z��Fm�Z��޸ V�)e`q5���%1�'iܳ젤u,kD��2om����H��o��$i2��_u�%l�]+�7�d|�K0)�_�����	jI1��ٹ���/)�j}
��75t��i�F՜bĆ{�9�>q���N���t��]m� �+$7�ha��/�d��o�d�{F~�YEcl_�t(��gT0��j���/{��h������U��9�k�G6psm`�۬
�ⷯ�Z��
�;U��f�n�Kj��^Fjӑ_��{x�Oj�Jl�8
�wa�M�����=x�E\�c��F�㓞�����
����^���j� Sk��;>����h�Q��_u;~�����.��	6�,���#J�B�1�:��p�1f����a
�2�|���t�[:3mb���&�F��}��%��"�'�?��K���P�j�:���bi~ V�'���ѹiY�MCQz���:��c��s�iTp�mz#�|�����SN�����^��ī�PG�n���9����d0ou'o_�]��#��t�=�%hw��Hp_��s>D��6v�)���7||�t	�@�����w�
�Tg9�<���{o���~��
q��}%���Q�~�c���;l��2�f�VV#����n�4|�I�(�@o�D
]�Y��ɱ�3fu(��l�� �����
[����R�mf<j�8�+�\R:D��J���\7��c�&`Y�ڇ�b�G�@�}yt`�vx
L`�P�=��\�\E�Mr!�'eZ$�]����	��}P�ڰٿF��<��0�
�v�ӣ���r].������E��Ь����k@�%��)]�,p(�t�w_XX���`T-J�w"U~=��U5��#���[L��p�j��m^j�B����G��Ȉ�:G�*�0���<�x����Mŷ�������������[�~�n�/�1a��G��4���^��@�U�����L��E�^���x��RN�>���^wZ������i>���uf�V6���\\r`.�M���x�u�ڝ���l��5>��FUE�eօG��������DzU�,+��\F�^��~>��Ӱ.�����jgֵ�,Z5"�4%���mꀼ����-�ělX�Ʃ(==MH�5��Nӳs�� X�#ʂnā�z��̆�r���v����?���F��x�9�����؅�{ݞJ��MJJnO�3v(�1BJG6 ���O?����05*�_}�n
�T�ϒ��䩟�}����ޯ�c�@l���F�������?�Opocc���cS���<��*R�+jƬ@�]�P��%��
u{�ll4h��l�����]��._ڗ�Ɍ�>X���.�pϋ�#%#�v�^,6��պ�O����ZY�cט*��gR���}&�.�7_30��9z��������ęq�{���Dm	g�n
�g�9&(&��Z����,�K`t���~"i��y�B�VtR�)/�S�5r�ЗK�Q(�=��}�\�!��$D�5J%>7835��l���5)��?�o+,�
�/���vY�X��_H�@3� ���-��Ta���Qo��UH_52�<��;����@�-��E�Ie�Y��۹衳���u�^_]G/�&������_�P>�t>/?/����f@�"C�� �ާ#�h5Aq�
���	z�^^2qJ�[���,9M8
0q\�&f` �Bi��M$ήM7�KY,'kR�!�R6F?��׮��m3�����f���6C�9�||��_%��EA!�P/J#�s���er?x2>Z�<.��+��f�io���V�}��p8A�o��4�un�;﹵�u��I��T6Re|_��y])���{
J�2Ѝ�F?�ߟW�l���q>*��x�g=��'E\\?������
��ʶ+
W�ʢ�`��ϧ�#�KbuW��cen�7�N��h��u��X���Ǫ���r��V����D��Ma���,��$
O��`�����^����	���]�c�X[a�������|tO�ώ9 @���Q��WS�m�&ބ�����:�l3�����ś��H7��|���']L��^�|bj=��ħֈ���O�㚪���^~er�O�#��v�f�la1��n����G#���JX��n�'�0�g�m{;kt���Xoڕ�F�m5�4[�?<s.�xiZ����g+��{�"��"�v�sH�D���+A���fK�^�Nn+�Vu8����'/���l�hS$g��B�RA�Ǟ�dT��F�v�TJ)L�bd��\G���4@�?��H��s�����!:R�m��S�:�uu�{�Wɦ��Z�Ib�B2�$�f=7>)�㢙����$�K�<�6]XZ���/�9�>~�Փ��fPτW
*�M����D�L������'7�V������s�>)�bh�q�L�+ǩL�Gӱ3�+j�W�|��d�RMkϜf�t|:�_B��4�Cs�I��V��<@ϡ->����A9(@\!���	�	R�4�@�f���B�����F�un��M;�^f �\7I+�t�X8�ЖN��+*;H�@g��g��F��9`1T�ŌRu���ROl�-G�܃�M.*۴�z++�
���p�%'�3q�C�h�QK�:i6
�Av^��J��OitY@F"�o��i넟�#�1�lA�ףL{��@�@��s�Nl�3-D�x6� ������7��z��n��jtH�..C#�;jt�ΉF� �M�7���l>��-�7O�@��gy�!C�]�lPP|Qɽ���%~s&
adf�9�l��m3�]@�p@�f`9�Y�!�0�|���-��pO&%e�뎓Q����;�H�t��4�X���.۸H�k�`RAl�B=VR��`v�w���GF�=R.f���ӷ�����cj�����Ǯie4��M�*�((Dg�:�<����Q+���@�Haϔ�׈#�Q
�*uu��i�u!�WK�y�^��#��y�Q��s�4�S�ny:3�a����*�m��ƒU�z�f	��5��l��׶�C=
��l��@�h��Q!�Hߣ"/�>���&G&���S���"�.�]E���hM���QGx̋�`�LmT��̥J�&)�h���Kb �L�&�Än,8`�Ry]�� �hs�w��Q�B$H&s]�4��5WOzOga��'��PZ�L���@�dF�H���ЎvR�?j������H߹�=-�|�Q�q���H�����Я�z���KY�k�~dU'au-�"(��kVE��U�9�cXv�Uz�)jڑ֬P���æd��z��H�WxOy��Ur?���Z
b�2E��V0��[���云��J$�t��	�A̒,�T�GP�s�������g{ϟ�оR��=�_�=�y�l7�~��w�Q���ݗ�������x���� x�&x�����E�������
^�|H��3=|�����
���r'�{y����f����7�џ������+�����3�0�C���Kv�W��,""��,g
W4
0W�Z?~�;`i�Z7V�~��,�;%t��Y�,��6˶�r�mj��~��)^�tL�2؋$�i>/d{�d{n ]��)���6/�{�7�0�u�Z��N�kr	��86/'b�mbk�C?Kn[Ɔ8~�k�jى��Z��Z�i�K�e���h�Ԋ%��
H�<I��ze�Qb:�Y��-�(��c�s=yߞT���9��z����b�7�GT�
Yi�>j'0GJ&�d��,g˨�)��j�����v��$b�<_��S�e:����K�v�o��8����!��7���m��z[H!�$N�2a�XIFc98p����=����x <���O�),�T�9�����v�m._A�E:NJK�u��0�.�V&g��r�Tr�B���xk�7m���z�����/��(Ѩ�]l%����(�̿���M~�z��R���,KO�Q�9���Ƿe`�+�"�#����	n!�4CL�S�I�#8B'���.�y��i���W��3������X4��U���6�@k�X�857�]�?$���z��$~�T����o�U��!�a�<j�h�x(�°w�d�0_�	�J�Z��1K+1斬�S��zN��8���i�q�ϳ�,��m����l�Q�a�[9?!�GN^\?�=s>C��i��&!�r�qzi�+�@l��
n��tV���@Leh� �<^1*�2J:&�Up<�L�kV��Ng�*��icv�'���$�U�H�XV����\�&�C��i��e[³���u�;�,|�����L'd��/��>�x�P`��)���V[��H���/)3!�}��id�iy�Sr��b[h���c,�������	�S������$ɢ�׋B^@
�m0��^po9�LUw� u?��y]$��Ƙ��<Ek�1��b��b8%���3Ң׮@��w������I3�c_��
�SM\��1�zʎ��%�o'я�Ȕ
4�&��U�Ez���A��C�w��d��%ޯl�����z��~�w#��q�NZ����/pw�5�\AM���{�V^,6w��A�VwGud�/��ւ��X�!���ȿ\�X��Z|�嗏���_}�ţ/���+c7�u�^��&�sb�=�^	F(�;����L��͏�Hkьf�ްcs�Y����­�X���.ӷ�+;u�^� A�uC�C,�0�J)NJmA<m�)lg��e.���� ���=�z�A
(z;��X�v
��;Z�3¿�4?m�k���A/1}
 .X�E�md��:�o�yFmnC�vn���Vk�ٛV��muc��7��;)����FbG��^���=�q_oj�Ф+�q�=��y��R[��5��V8+
�3=�WdC��z+��A�/_�n2Y�Td�}\������JȖokh��wS����'Δ��z(��1�\��͘A��HB�2"
�
F���8vc�x4H1�si����|N=��8a��Uۣ�''Er�R|Ԕ��{Oa���A��qn��.ڷB��YӐ��Û��ۓ�R`էL��5ڵN��F}�l���w�@�XO6���*��ќ��H3�mw-��%F� ��%�Uع�`�:�l��5o���u�4i3/U�9B��߆�`MR��NO��t�|��>�Pl�S�����ghIȥ�l|"�Z�S`4�E���:���'I��fkR~��]���t��x�h����-`�ķm��`�4Pg��ԶKy���È���qL�ƹ��h&�@A�
���K�
p�|q�I��I$�i��a�{ew�2�1
������a6����'`�"�(>vVe�u|M7VT�I㗷��l˦�,�����X��YY���N�IAR>GW`�:tȼ��i�(�N����xm^��fTg�]�"�ֶ��]�e�q�ǣ�i�h��i�wc�V���F���f[��Fu�W�Ŝ�~����l@T�'���((�|�'�Uς�V�C��1�9p���4XU$��-3���Bţ���q�^��_�Qj�{GY���iF����
�6� �Р��c��Ґ�j�F�S���"�Ԉ�+�e�,L���
���R���1���P�$�Sx�����YW��`�t�Ĉoz��cڦ���Fy�MB�2��8�y�9$\<A]	�ַ��1
��s;�rˎ|E�q�|t�q�||r��jHN�;����o�x�/~L��o�"aJRDQ�Y�AgӦ�Ѣ��U5��X��RU`5�1_+g�
(�xL�w�3>ԮoȗG�mwIm�=��ɰ���qx��d�%9(e��uDb\�
�Q��R�TJ�,`i��G�N�['R�J
4�i����?�#VNxQD@xv�y��Z��ƃ��Ct�(���y~i�|3�LNKL��اad���ŷ���*sD[�e�L�1���3����1mjD�S
E7�n�F*"�C�0U�Hպ�$ �Jˢ�4rQ������E�������#|rb��l�'ϱH��Ai��[����sr�-ǺAi�e�������T���� �b��}
}���X���V�|I�s8B*�o���½416ݿ[�0�����/��]�ì�5�� C��ZjD#㾊�ׄ���Dbu��!fq5Z :��-���xB&G
W���5�
Z���N�+<����Tj�4NkA��
�܀{�6�Ž��6f��6�P2����r�E6u��	]��2Pᴌ0��5��;m�;��V�]Q�]Z��c7y�%Eѻi��>Do�N�n1>'�32�2F"�1Wxέ�d:#�?,&&{��F�O$aK�Bժﰪ�"���'h}m��r�CvE���f}(���͍��PX	�y�h74�r�4[J{C4���I���N�l(�,BD����,�aL���u�����
~�i�i��;S�ro� ���$��|:�5��f-tG�^}�"dZesǖ���������H���gG�(�c��+ݹo�	ض�r`_��M�+n@���BI�5��y�����Uy�&@Q�|Qհ"��/E,bu�"/f]��/I;�����j�.ɿˉ���Km���௳"?MU�Z���N<:okf��>�����
�ÆQ����V�T.Y��˃�����t'�;i����6rW?�>lX��D٪ow
6�\�iźs��L�0o���X���^ȃZ�i4,"m�
�X�A^s9������Vѡ'��l1P�yn*�iƅ%<��U\(�٬�”�F"�^�?g&o~@Q�
����V�O1L��6�|�|E�Qs�rGeA����j�Ԑ;�Қ��
��F>m�Z�J�@�8;�ʏ�Z
́Pמּ=թ;ꡪn^���b�5@�$��c��A�V����h����zhj��Ή�t&zK�1Շn���-�N�9@��bq����c����3��z��1�w��E�X��[+�ZD�jZb��Y����[~���Ր�P}di�e�����[~yK}>ަ���nk��B�(���wYea��,��Xp�t��X>�O:��u�i�����v�և���'M]�<p–��z��yX+}�� )V�V�P��؊-��er�B�%m�<ԃ��x�)<�]<\���eWl�)�;�UK^G�՞���F��=Q�?f'�TJ�|��]��赯!��u��N\U=h�8Pw��8?���a�*�y�ICZ1�D�H�"�/�҄���� A��A�|�ȱ��
c�e<��+u��Qc�	�g%�#���at�[�m�)�u�Euhh�Z���H��5
tm��p��'E2�t�-ۙP���4o#h�k�����^:�2�$���F�%W"z�nC�
��į{�,_9Q�j��.I�����5��{��~�q��\/:�����>_����%�f�2��ҥ���,g]�KZ׻ò�uﰴ�
�?v
�;~`}OSJ��e1i'�Γ��X���zWc_a���+�tiǠ���[ַ..戧��z6����k�^�{���%,��Ɍ�Z��:Y��H��6&.��y .�;u��Ck�"���z
��>q�'�|9�w��k�������_����b�#p�J��kO{C�1�}����.�1l�\}�k�5f�m�7���k�k ��F�5A;�kK����^%d?��p�f)҈c��ЙL.��,�AF~�������YO����ħ��w3���a��;�H@�^��\}xa�m�k4j�2��cn�d�!gA5�{$l\���<�sI�.j�uSY�o��#DZ[Զv�K��8�����\�n�!��m��fT	� &��Siu�E���؏�ف��އ_dֺ�r���c��`H����m�X�[[�=ó�4��&`5������jK��Fo-R���>r����EqK�~�\���,4w��(�<&N}ܧ�{isL�r����eH���H��D5�p��_;Vy�:�XGj�#Y����1�)Ӝ�W�lx�L�td[�Q�h��ʭT�di�Q�є�\�m��lf���UB��)�Ha0�I�.8+b�[�hc2lʴ?��1S���E"M�lM�;*#�C�����Œ��?Z�����$�����iҲ�F�f:��+�P����	�/�՛<�|�*Xo�"�LǮ�`���&�*ig%"n�[LQ�Re�N�K��c�,����J3H��(R��0���)��.qf�{xl����!�a�%�vv�]$�W��d�\ �Ht(ב�[�Q�)}}�
:�=WDv��B��q,ugI� ^�s�Т�����>̩+��jgL�iB	ֶ�dD��@9R3k�����N����$zWi���c�!�1���Yy=��׻���n���h��u��l���r�Â�hG��x�zC��9i��9a�^���N46*��\��$)uP�+�)�O�0,��)�</D.zjڗm�gB4�Q��p�,�]�Ks���i8�ZX�k��6��w��߂ͭ!�7��eܪ�Z�㎡�/,L�[��6�g�Ɓ�/g'�ecviJ���|v�0kz{ʑ��S��S�Iέ�-��EA���2o�f���sX�'	�1��$��
��Q�x3f��_�i��Qc�ٴ��|l
�r�g�z�\蜽�^!�2qG(���ZZf�qh��ӳ��a������E�+w���J��%G��}����M�e�?�䨥g�0(rS-��8'���l���ɹdj+ǻ9lb��}��;��
���Ü|f� UQ|��<�z�գ��&���M�m��4�&P��7�l�'�<�DIȦ
I���sg-�4}�5����'7v�q��=�t3��!�B�VĆ�o0��&��G�9���mu���z��)*�T.��_�����z3����~ܙ��=�Y7��1ź1~N�]#�3~��K�����,T,@e8ka�6#7�}��u�u�R�
|��ݵTx[+������'��4c�SEkmxE��o��l���1�--�i��1%W����p;KXF5T���!D�y���rO��vf�FMCF�l���}��+�q�z
]�8.Z_{�I�(	*�#��(1�A-1�ϑ\(����;�@C�UG�0�)�ͷ�6��
�5|���p��!���I<[&���`��2O9t�va�*�9����� ��z�
ω���B=�c=�'i!?���z�5C��r V�G0�ݬ�zN(�s��y/x�h���	�ˈ�#�0ݭ����,M��aj���펖;����A,b3K���=Ԋa��%�_r�x�pP�Ub数�Q��N9�r���hR������_“�_N���7��_���7_��cW�D��M�D)͈r�QB�Zf���X�k���t��}��A��!������Y���^�M����
��k�? ~��?��)�>Ҩ��cY)�R��?�����w����s�L�в�/�a��z�$7�sy��۸Q�.��[ES��j�)��[����؜n僠=m���Z��h�M�Ou�,b]X�Nلz/\�i��s7��I2��/�Y`{��۞�	?����&c�6ګA?d�[bv���8IΘ'+�Y}�ť���d�cr@+tk	�6��\Z�e`(��(��E:�
�q��B����
ɏ��]1G7�E:�����6S8��cK��w	���y��ֱ��J�RX�U��
��D�t�{g�PT]��L��ϲ��E$��bI�$�	$V2�1lLu�EN(�@��@z3n-�20c� ڼU�1x�x�@`U�;����E"_��2�C�*�&I���'�@wd
/�ú�5��T �����ɛ��$8��E���2�N�����9��΋�����7
�Kho���#?q{�N�W�޳����w��n��5���=��wl�e���ߢ��	&_ٵŊ{HY�E��R4���%��4�\3�U�H^
}���tH	���Q\3�K��g����
��d�!�fƁɔ�ꤦ0CG���j��<�{���:ei�@�m��-�ھ��t��LG�Enu8}�/Vڗ�m[s ��i�40�^�GQ����t�IV�hs6g�x�B�?�p�3�%O3���r4<� ��B�h����ʈ9.F��g-�#�Q ;Lںh�/�"��Z��c��Rۑ��!2��A�o������"�,�]�bK�Gv7���L��/�TH*
���>�L�#�+�u�L&����gR�::'>5�:�x��!�`m�j���7AYi�T�t0?
>Y�WP��{?�����r8��q��]��/�Ɵ>��n�i���4�;5�� �H�I�H\���m�Ʈ���A-Ϻt��v��Qp��v�������?F�c��	�(`P��_���D�m�$�\���j���dA/8���z�/�¦�+�^��Cu���>��B<w[��wI�PAe�1�&����9�q�@�KՖ���X�Ԇ�Wk{:��'!˕Fzuek�k�ٸ�oFs�$3��%/���:��4�þ2����<\��
?3LĽ��_�R.ð3���|��/��2?�BXm���A��s�%�E��L�?Nbt]�
�mJ?[��t*r��_�
��xZ�ҭ�i"��s����+o(Zr�WV�Y�#��
~Ѡϲ���nt�XþF�q�a<kW9��Z�&�!>��L�������j������Ct�FD~�,�X���%�t����%��M�„���H0gEB~P��܉0A���3�~�<A料�/����B�ᜋP�nղ������VClnA���#�����Z��>G�F�����S�0�k&uX�ፆ�AZ�ͫ��K�r�_��N�!�Q>=AE�JςV ���㜃!�(�.5��〒����E��M��d���4���pO�G��D����������
] ��1!,�T�p�P��L<�ͨ��r~bO�-f��g>j�O�V�(ow�����6�&L6L�`H��d�D�;��A�Y��?�<9��?�O���v��7�~�Z���xt�J(���gi*�����������3y�Pj�i�rs��������/�@V��+��3a���i�@�HC`K�"9�c1��o�����]�@"zo�Z��}�0���G�3��\[���Mݥ��c��%E�ɨoB|�kDit��P��E�,PT\ֳpceq��I	�3�_FG�5|�����}��O�KF]�Y_D��a�Pj�t64V�M���� 
���{�]�,bI<�VR)��|��v����b<����8�c�F>���.b���G#ÙD�+��"5=+�.����m%������a�	g�St>��<�S�X�^�pZ�m�=Tw��k�67�gP*�^���A��xG��-����#'������/[p._O����%N��-2����ٷ�[p�d��u��t�;��/׏}���e��S�P���2��=� �	S�Ц.;�uе��.G��~^����껄#t����dd�\�2��̟��l�ۼ���1�<n$7�7t�miݖ�`/Β36�%ߎ-Z�3�Jke��ux+�ar�<A��✠��x�ܞ=W��N��`a�XD�\�w�vX�Z��":4Z�y���ʣEW�ި(�>Y��J(2r�g�|�[����@�����C,5}�7�x�AXT~!��Fwz�k��cP+���s_E5znѩ�a7��9��6�
q*g.dCɋ��'k�ɒ��9��?Ύ�Ƴc���Zď4���Ci���G���C��mK�U�����U�|����c������5�t���S�G��?&��8���.?�d���Cɀ�'�:Oɒf_��>�j[�/�j;�n�_�O,���;��O� �x�l��ի�</�ќm��6����:� V"���d��_ت�k���
nl�4�l�Ŗ�h{�J���
%!�GdQJX���E]C���1"��o��<��ȧiU�����F(�}N�~��/�=K5i���<6㸊����ڰ�}��
�~��w���|T&�,w�L���
؄d�	ڹ	BZ�<�<�:�ƚKTxFe����d�_�WN�ׁ�Ϧ|^�B.�~'��ͷ���9����CY�);��h2G�e�D��S�@�����9�I_&u>�e�{�A�xt�
�b���4,�6"�@Qje�r�R�t��-��[��u��]g0�S�Y�%=ۓ��û�����4���d�	�O�FfS�2���/� �ԣ*Hd��Ԭ���Ծ�I��Z�)Vy ��9x|�H�2	b�fN��N;�B�m� *S'���6D�H�q�?�eW�?i��#V�շf��#�'ϫ���wc��RTT��1MuEc-��R�	�ERQ
D�>�Z�R
�A �C��Xɪ�_�� V�$���<'_2�dp6�<�SѼ��8��,�›o��,��ɲY|FE3�(討w.�R��Y�b�����4s?r����@�d�<���w�a0)/~w{:q�Qy�ʔ���I���>^�Q��站e6��6�[o���	Q	تBC�V7�,�����-���T_T9��V���l�A/hj�=L����L�.rH�g�
@�~j�I����MA3�Ov6�)�x�Iz
�3��\wz�-df�5�P_w�P8)%a3��,3�5X��(Q0��b���*sT�&�t�5#��n�s@�(��:
%E��&"�2�C�x�����F��%tz�[���;oբ�Q
~�*���P�-h�o�q$�sjf�OsWc��=)
߶�uc�v��N|2
�7�|�͚�_�\�5v��K
?�]��h��)�';]XX��e�-@�/����:a]=Ĩ� "_� Ĉ>���}�K_�
��z��
W�:���T�j<P����F��%6��5�e��,�;��k�y~�qP��⮎�#�a4n�?*<j?��O���ip.�M��H�a�07��`�V�[�Y�o����!�E�A�MA9�<Ʋx~�P�8{>F�<�V��:�����N�<�ؗ�6�d\F��9Eot��r��=FeJ#ٖͮ[ml�
g�KLc1R%��.�0Tb�T�|g}�r$�M��6�S�����4�E!�t5�O�2�P�l�@��q5%E&i��P?Fg3 �.�5���<"�H�����6��;��LP۾�[�7��+Ǵ�6�s��t����Έ�!�^����A;Z�d��G9+͜P$#�!ԚU�n�C3x���V�~�EX1��7�E
s��lB�K�!��쇙2AH�	}�S�ѭv��]��Ƶ��0�&B�L0���S_��O1�]b�"(���)��>rn08�TZN��h��3JP�Q�K�mV#l�Q�
;�v��[�6���Nh����_N%P�gT��#��d4��Z� ��64z�� �$�
��vP6���(�N�]�<u(�e�_�$�3�):=TY�z�o��4Z_����,X����t��_[B�j-ɜ�	"����BQ2�D�7��<��R�`ξDY尯��1R�5�j����LeI+�**�$sK,��-8i�{�OKu|�c~���.�"�[�Tڪ��}W�e�Z�t�)&(LzC�̊��:O�@ΈC�`��w��P�&ƷJ�|�KM
g��4��N09V!��r~bmH|�� 'c��`�7	�_�]����C�c�9wU��.j��{3�, 
iv"%��LJ(�!lܯ����Ker1���4�cu����̣��/&��J��Y_���K��Kfɩ�_� 6���Z��;⢍!��6��q�]ke�V�^7����ә�#u�\�#L�	��]>d����A�����u�!�ᨃ��&ya���Vgcˌ�l	�����I:���up_[��C:��D�W�馵G��zx����aǔH���›Z�b���^pޡ�Q^4�VK@6Ԑ��l��8՛E��M�w�ɥ_��aJ�V+u@�[_��x[P1�W:�\�Sa��R�P��Nf�A�M����*l�"�v%�Ra��d�$o�X3�8�^�U�|nC2�
Ib�(��N����!�6}NTG�n�
�l-��َvz�9�W��6�$��K�6E!bf��TA�;�����iÍt45/r�h�"�b�(�StK��Oڲw���P�-����l��;��^b���@s�n�듌�jj亾�B�lM���U��b����$�%n9��Upp��D��_
�6��G>PJq�:������|��5ꈶ����F�=|��s"��:g&0��u}	흈��U��%g���gi���݁����ej�<�l��j��_ֿ�Ƌ>gc��!�j5.�nc|G��؝�eTܤࣾ�mh�K�G���#��Q���Y��D�xˍ/$K/I:I�o��S:շ��K�/<aoG�_ܱ�Eg|qoCu�[`�-����Z�^�)�u����;��{c�B��[�!�i�Q��9\%B�y�MU������BLL�Fh�D�����"�.���J�Ұ�Tb�߾5B7�f��7濗�T;
f_�@�l�ldCUQ,P@P$�-��I=͠�|j׿��E���b��Ngr��+�q�=��1�nQD�Em*�v+�`k��+%Eڡ��pm?V�/Y�y��45��/�Y)ke��>:WrM�ã����j�֪Т��(饙'ej;P_���}�u9��6܂I<�"��~�iM4&\��0a��D��g8Z ih���B��a#�ϖ:��ܢ��W��̘҂��h�g>�i\O�
:�����^�!�Y"���X��\/RG�	�#*�>[<�
����,p�=�
�
ha�*U��z��I��4�۹g;��R�F��#UI�d��l�I�hқ��z��%w�n�w��}}���e�a���{l(���!i���Z+̕o�J�0�3(�ۑ�
+X����=��5�r��!��?���b��{�w��GU�T�&"6Ϸ�x�_�S���cD�+Ǚ��6×�C�T�����:���c⌓T�9�,@��k��CI<���K��H-�}t
���vof��5+C�v��a�_�0�o�끿���m�߅�w�\&�[�[u�R�#�*�ŴD�Ώ��4y4�N�������s��h(�埝�+t�}�m*��?E�<AhS�m"��P��ޖ�<���1�f�'���M���tv_�y|���y�� ���w�R��s�@B���o��.�&�߁�x*~�p�\�M�fK!G��'p0�P�L�;8�Be�&YZ���&ŭ����._TC?h�c�
��,[aL&[&0_�}�3�(��6��R� Z��cb7c�����^��}=3�-�.����<d���Ƀ�أ�ĦyuO	�B�r8Ti�������t��
�%Ƨ;
5��Y�NJ��3'��q�V��%�����Qf�9{���x�s�T���������ꦧ�X�Z$�G�G��9z�SJg���jE���h��K��N�2}^�)\���ӱ���#��H�
�:+r�A�(��K������Q���=�������!���F9�)��5�1D2�4}��X�����s���,u�6�MJ�ׇnR��A�n��:b:Q11���4��e^��p���mk��o�t�wL�\��Q(Ǹ�jꤧ����ƻJ��󾛞v)�*}��Ư��<�NL`p��GC?�jn9����z�&�@��;����K���tTWy�[b�gl����R��
��8U���M�*F���tu�C�F����5\CY2T�&��j�FI�
˽`�Y�b��g�q�,�Q�a��Z��1�4���F�]��+�o��u��[� =g�J;��<�B�6���÷NC�Q�VbK���l�������v��ӫ7φ;�o�9�E�p\>��W�6Vj�0��&�-��f�c��"�tl��J
�%��Q`K!v����wm�b�ow�w�+VEs��,_-jR}3��y�B�
[@y��fa�_4K�I����wE��4u�!�Pv����k9�BL�)��'���N��
�o�
��Z>�5�5��C]�� }A>o'L��H�Q"���Y*��y��|,���q�?��䲁&1������J���r��lC2D�#�k�w�#�TV��\|HJ�S�M�C�C�m ���u�%�;Z�Ph�ۄ����F��(�S:�Ă����D�S�:V�b�!I�va0�3
^�:l��x�t=�_��ꢠ���Y��Hs��8���t���ў�����?�L��<�
�$��[�+��Hw�V	9�ih�=��v/x�	�Ez�����apJ��_:�H
SJ^���QB�Y�ֲ���lo��ҫ��#�;��W�:�����U�`+�D����[&��s�er������\�͂�r�ig���>E�>�ݿA����h�Հ�z�o�.�"��z��KP�sz���u��VM1eX�a�`��Rj�ԷF�`�}ݷ��"��Y�D�OIG�Ȱ��F}m;E�d㴊�{!mb��>����{����y2��Y��'�Q>�*���"[�a�L>r��<��h�@[�2�6�x2@�Znp�ZeL*=|�|]�V�1�f��f����J�a6/hqc�W�J}m���Y�!1�96���a���#�0�nI��LRhAs�aS��8	g�;\�\��k+���J��l����>��m˔֍iT���2����sL��[���}sO�
W��k��=�Y���n˾[?l���p2֍��lzy���J�9l��avVB��#b<J�V˂�a���ihuMK��t�P^H_D���߾��{����u��G����	ߧ)T+}II�[T��\������I�(���D���׼�ukmJ��"��^����h��D�_��Q��A��A�?�r
4��p��[�G�p����4��1���f�ќ,�r\�ͨNQ�J�n�F�3�YJ�M�q�Mϧ~)�Q��C�i�5��Q��z��Z=lea����1=eu�����hji?dna�n�z�r'�A���E){e�1��-<�&�Ca��M[fT?�9��r��*,���y]GI����$�74�i���O��tIB��@�r�2�I�I�v��(�!I~����/1��C��
�_��k�2��Y����].A
b����ls
At��ډi*��e��~V�XFVZ:N����{� � +���l���޷�
�
V��&�H�Ժ\	��eb�\�N7���Ļh訆*:�J�r
��'$�$n�*x����'��ȹT-��	�ʣ��,Gc��b�b�W�b���j
��x���Mz�"=Y����3�$�Z��̢}��J*$����HB�QC���y�	Q��EOٽ�)�YN���ݦv�4sZ'JiT���\7c:��A�&�&t���y�bb�ә��$�}��K�
v�6κ�N���^c?@"�loo����x�H�!E!��`&b�7NPB���A}�mT'Q��I��~�ew�x�B�:F�h��u� uSC#fF��Q��d��g��|��4���9�����o����䝷\��IZ�s�8I*�};r����ޞ�����/��3��3
g_AG��|:���$�F�U	���
Z�ܲ%ɠz
��$�`��Q����i������Ѹ^�8H��9���[�������]���y��	��'B+�-�����G_|�՟���C�E�
���S����$3P?�x�V�A��Ϥ�&����@5�q#Ņ�Ȋ'�tqQ ��v�s��yYq�V�7��Au�^�*�N�
��zdؗ@�Ą�$�N���7 ,G
m��\�퉦�;���L�#��������ߏ�1�ڊ������_��1�Qy9�]ZZ���*�r�uV�K�/Q�]Q�l@*�Z����Z���J)�%��f[��?-��1���ު�h ���7#\��k4�Pz`^3���Gz���կWh��Ѫ��@HG�����2�P�mL��ٚ�Ҙ����4����m�3��v́5���tpB[k�E)�U췥ue�m3��+�'�`�&����T��� �KAbu)z�,�w<=O36�/M��‡Fx%��wˑ�K_l�<�{y�4�RŲ�������몬H�V�ۛf-�if�փ�3�.�g]���큇X)�3r��u��nkM"�"��Z�D��Q���Ŷ�E�o�;G���P�6LJ�N����{��7`4�:,�B�i��]�-�l���؏�؏��j�ɀ��kzY�v�Y4nǽ�1r��ŋ�;o�	�7�UQ���^tޞtXO�3���m[�!�d����Z7�·�*�*G��(j]������'�qЙ�VD5���:�ۢy��L}X)(ꨲ��3�k��"��BW�}����&�k�z��zt�kn����u�����E�@�n�`�R��C��=0��h���W�(A�eK)���#�㬟W�E~U��760��P�/cxln�n@
��N�h����< =�[
i�6�x��������C4�4ۦC*{<^������[}��|�E`.R��~�H��ጛg%�ь_�6D�9����}�\p�]���%t�|�rQ�Fr��H8����bA�U�� ��>sY=��:�8�����2�\�6��{���{{�nl���ԁ��{(�e^���aߡ�.Q�ʐu����ME�9c��1ͣd�؄�1��,�g�#�P]Y���s��H�=ipϰ�E�ɻ:���NYR�G���wއy��rW`��^$%%g0�RJ��m1<� �K�E��q+�c��|�9z�?���񃷃��"C���ص�$.��������S�9<x;�?�����g݃fO7��m>|Hn5�eR�N�+���:�0� 6=��Ϗ����y~���|ާ9��_��[}R`�E!V�qR�q_&�_O`S�F��Z��M��ⷝg�=���|t�������������������zJ���]J���q
A�s���c���$j'k*�s4t�!p�ƍR�Qyu�E�nH-Y{@q�
�����nr`�~Z���M�������0G�F
�lg:�.�f=����c�`7v*��=�����B
�q�D�������u��>b���<
�.k��OP�!�a��B�ű�l02@�"�8g0����T��g	�K��{��6nda��=�N{6�&-�vER�,ۉ���[��P
O�lI���MZV$�ok�R@�I�K�y�3��n�P(�B���o^��Z���{�?��h��t_=�~T"����a�|�]�\�t�>;ć�ʖ�
���$x�@�_�g+k�g���ܥ1U�vn��M���c�jM��S��#�.�=�iQk>�y�v��EG����{�
	
�~w&߃|�㸧q�����9�:!]
�n���M�	*��G9C��"D?+���/ݾ΍x�ٕ�z����1L~e
���-��=�]����_�gϐ"�k^�����f���.��C�*U�UM55vs	</�
�5�`�Xd�p9�;l�Q�� ޙ���C&
�	,QF�=(d�DH
�b!�p�^�^b�3���u�V��UQ)�/F��oD��� �F2P��YNV�Y����630�;/G|�m�GT݆�_�P�c�8�Q&�^9R�C�Q��=)t�\~�@%>1��LĐsծ�l[pJğ�(�������]�g�����HP��<?pJ�)Ryv��ggu�by��`����I��)�
��{'Q�ӻ�Q1�|R���A��h�ꪖ:c�]��)7o!Ѹ��xČ��M��A��P�p��W$s�8���#��:����v��vtTY@uvQ���H!d�-�O039�LPY'�)c�=�U���U~g�U,��EQJl����1<��T΋��˳�5����x��yX./2���(�;�YNʢ�)�8ȇ�.Ǐ��ʎ?�Z��=$,8#����Y\�O�N�ׅr�WI�,�H�I\~�rZ�([�j$G����$�|�A2;1cX���킒	��t�Q�̶^��,�l�%��6�mo�{�+7��ʥ�[oh�ƣ��p������_<�@��'/v���p���E��f��������N"���q��Y{@���o^Y�+�Z��JNWM��U�s8:��{�H�q8�&�)Yq8�Yێ�2n�k��ծ������P��:<Z9��W�x�gez�
��C��x�f��0��t=m�����
�*~���S""]ktt�����%����h����a�w�9��+�0�T ��Y�#�8���-��Tu���d�,]MQ����=���I���������-�<e��T���<׿�*�U}mmG�����%�DmJ�9jf�.	m���UJ���RZ}������|�4�8�|���*�����	���OQ�mF�ςm��P�ђb'\�dI�)�V�	?�M��g�Eѥ�~�����$D|Ӭv��AE�t����Y�Pp�$��6�`^]̏��m%E�ӭ�N��g���w�Ж[M#��^��q"�8�>��<x��}�J�h|�U�V֧�-�\&~Z}�3Y�~U�w��^�g�G�+4�ϯ��߰%s�kc��P�
E(�����4���u9��t����fr� ��߀����T_���E�'��i��;�܅>m�U}D��N��k0�0�rv�׉�T�j�&1�LIj��y�T�~��E:(z�?��Ek#z�0�������g
���&��o\�A}�@�V�ZB/�SUЉ*��t|YȐ�?�{r�<����o�C#ư�IC�(�Z������h`����|�s�c��{��{��C����]!���빗0�51�kھ��\:��V^_忤1��ʐ��-��vςF���%upz2��-d��i��/��Ղ�6�.��?����]*��@*�?Tmo�M�
HU\)��/M�;�UA�e��Ց��/E\��i�^���Va�ϣ(������6U�>P�Ă9l1�D6�5����\	�
e��G5+T���߸	���pvx8=<�7������&�
�i���RGȲY.t�u���|�dE�ϑ-n�$~�B���=E���(�z�joG�SƇ���>����3������gn雀t�;�E�
Ě�Fq��pǮ���J.������f ]�?��%Y�^�^+n����A���mCU!��4m��k7wq��ߥi�V
:l���
N.�,���vOӥդ�qy[Y��{�H�'?���y�b�r�Pg\)A�`�����$f�o���y��^)�s���ƃ�p�Y?�͔%����% ����鿑Ѩf�19�L�����N�I��p\x�أq���eDt=p��?�i׾��1�1��,��F]�俥>�
(�g��q0z�Z�4#�KS���Gح,�j��d�_�mIeN�,���"Dc���>��}fK:㤋�T
N�{���h�ib��}�gy���.N����e4�jht�ȫ/
}��m����F��#�]-[�?�`�8�)l��Ē���8?�Fʚ4#�Wh��פqP�'�+/���ZM�Swww9��/���1G�.���s*���=6��ԕ�煋*��G¡M,%����j,_�໺k'�=�sV%��
��@��F5�S�'��v�Q;b�K�d0o���2��y�&�ce\4�l4]Dn�2��G�<�>΢Qի,�ۏ`�To8���.uz��}���)'�1�bx�K�^��&���G�
���e%J�@�N��H�`��#ZIM�8��$R�z�''t����qfT�js��[`�!�	Ȅ;Q���w貏�g��qR��s(�3frz"��H�!^�mQ�j�]�����sUw�|l���f�
���i}�Y��x�������"�OΓPGy[�D�pWY)Ɖ��.�amu�J�<1�}��1f/1�ꔪR�����&��͇p���J{x|�eo�c�?S�V���6�1��DŠ��ōNW���~3H�8W�F�E��J�~�[�e5=п� �s%n.b�F�z9����b�r�bQ<����T!�����eF��s����v�}��3�ox�9��`��Xs�r�qoW^kα�#��v•��Jf��hz�1��R��>�k!LF�Z�v�g�Y`㵫W����t����ߎ�I�*)��\Fʩ™��ᱲLJ��5&�1�;��$\��KŐ���A���DAͦ�H�uǟ��7��XY7�9�G�>f<=��>��P)�Lh�E?D��0�t	�����v���=$���#_0��kcО�z!�a%�r����A
��"�i6�n���R�� Xa;N��0�T�B�+@�:�&�R��QY��l� �J�Oa2��9�hz��{8b��WӜ<�����x�H�S�5��&�}�
F�%Ru9����LE��H�1q�&�]���|T����ZD����1Y�X������OF���Go�h�:v�d6�"��M�l���f�Te��n8~i����躿�Ĭ)�Z�iP�4z3�JL�'���;&f�V���4~���:Y,ydg%Vm�n�xz�?��a�:v#�ަjU����'p�0�b���Tؙ2A���d�P�(φ(!W�~�$�β�YU��J�	p�QN����^��J,
1�����c��	��(n�~�vӞ�ho�(��0?�3()�X�1�Tp���d�W		5���9��/�5��GG�g�?W�r<$�)�k{;�(�^<�rZ?*��$ď�y��3�mf�
��󉠲4���SxxU����n�ܟs_7��5�D�a�U��H�B��Ƶn�}^]Yo8��s߯*0������P�u9��7����f��^а�T�ז�ơ��$�J�]>����B��'�.���֑&U���p�ͷ�G�F:D�P�����RR3�̒��Y�=�w�S:tGmg�����H���X�tjXqt�4Z�Q���>�C^�%�k�5���J�w�U�Q�6額�<��`3,[������M9m��O�}k%c)�%�Vf�^m�r����
�k�z��tO��B���U#�lu��/y����ٷ$��Yx;z9�_N@yQ$
s���8,m8�����@I�_�y����#G���nyV�A�����F
�,5�,��
<s����*�G�Lof�IB�MN��^6=�Sݽ{����=��ThZ����Q�����ͼ��n��*�y�8��zu��`�z%���*��\&�җjwݚ��ź����P�n0+"�jJ��M��C�P8*}%�s��f��w��
��y=Ē.��).?S�	�)r��i�q*���iE�S�bU��^�@&@��y����4r�PP'�t
���(���Mt�ذ��;��b��_J��Am��*�ق@�Q�Rz�	�<͋�����D�;H�UR�i9�j��1�:�����}�2�ۑ���d�5�]�c����5�5V��7���b	�m�J%a�[���z=�#��F[���'���%���x���iڎ���K!Vz�'��Px�ú�_C�=��ϼ�/.����j��Z����m{��?�~��
��$�f��*��B���W�]��+��{���t��U|�&���xY:!T��x�*ඉ��܎]"�]d:�Km9_n�|�k���|-*E�`<:E3n�8t��9l�+��?��|��}ǂz(P�T�vA.?�S��ѵ���ZTk�I�}T���\C︵� z�l=l}QV�Ean�l�(��5��ߡ�j!iW�<}9]]5s�BP]�VP�v�t�Æ�E��?7����[��m��m9��=��m��d�pő�#��6�V�EXhk���!L�0�*.*�VЃ�Y(�(xk�k���)\q'עN@�	uh�?V�`t�V��	�U45�R<���^�	���]E��T5-�3��Wm@��T��G�.|�� ����f�x��E��8�;��y���������
s���<��V��L���-�o�4��4b�l�Z]!�{�I���BN���Q<�+�l�qٲY�mN�=��0�u��w��B�	j�,��(��"�����`b{��{
Ƭ�BH:"��Z#q�*�(_��0li�����B��v)B���]ԫ~�}�I�h��೨��
�OY�v~�k�a��]�e�C���j����t�����`�z�i�v����~G��=�m�	I�O>����c�$�!k�S��ػ5Y�ŨhO������Һ��f����������eJ�J��J�,�-+��>���@����B"��
��4˂�Ӭ{�	l%R��CG���5��|E��;P��./O����'��׻/�{���˿E߽~��E�x�ǧѫ_��
�w��7�����/��B��.βI�Q)��7�q���h��=�~�9��/ov_G�?���w/_D/��_	j��7���2�ڤHe���J��q12u�U����ˇwdQKk��ķ��HxD=�~D����:�_��J�F�I�m8��fc���A�`�UV<�hjf����	D;����tʓ����@�z�c�莡�pS��� ��6<��P]>6�p#����|t̼H(6���h�#5���jN҈F���4jm��~����D��Ѻ��?ZO���r!^	Tsc]�3���n����%�+o
ޣ_�W��0\�qU�F����i}��`9��N��9#�-��@E#�p�]n�87܎Z�҇�$W���X�<Z����S�,�l���$ʏOC4�(�L��B�`����.�:b6Ff:F�|��	�4���6�#���K�
�݇�"�!RyuK��(��a�T�2�4�[��+컐�n^��V ~���m`��=%��sN!�6��b���I��>��+�4�.�m�OK����0�
�o��6X��0�^H~R��´���;�دQ�!
��o����1����i���$Ԧ�a�.�*�%�%�py�Ԓ�ֶT(-	ϲn6���X|�S�{Ѷ۪�e��.c��)D'ڗ$xm+Wm��<�'?��r�p����]N�*p��Fi-8�֖�$�F{ޭ7��C�[��Š!q�\�^�R���]�ǃVta�~�(i��5O�11�_�"��@8�U�&��
b��
�0��!B�*�J����8Az C�u��t���p7�}g��Z���zh.V�������(��"Ҿ���zt��t^͆
�
�.�Ù�2:�{|/ōR\�:c�rK�
E1b3�G�RE��Q,�h ͦ&K��8;45��?�Y� $׍����p��0�SL�:i;�7�����P�}�YYA�J4�ttF3�=��(}��t���X�=��&���.�_���h*�I�J,'�3b�ճ\�M��J
��A�h!�����?���§R��/��Ї+'^9��%C����U�Y�`C5�~5��n�JU.5�̬�B�j�b��{^8TA>I�6`�Ќ�&�&��?��qɘ�QM>ܣfE3�8��P�B�����6	wU,�>T��\�`��>���f�py,��T���
,r{�o���ѭ��^5�Fh�saܲ�a0��,�¹���m�������_�q�|o��ք[Iӄ�������H�+�	Kk�(0�MV�
i>4d�*s�4�L�||�KI��ϳ�<��l*�
�b�Xa�Z��
��k��$�&�Lr��
*��s����9�
�{�O�'}m�I���?d}!㱡J�p�H��ce���P����h>�9�,9[^�E��f�W0�gv�L����IE�Ө�)na�d��o�Ul[�n��kr��(��bt�o����ټ���!	`��<��mS
���mIjQ���Rķ�,<���w�&`[� ?��P�m)�R@q�I���w�3��l��T�KK��}��K��x/c��
�EՁC_�g���r��:M��ވ�#��n��7d�N�*��S���-ͯ����L�^��2�%6=��V2�y�9��.�߫�-��(��8z���iN�Qm]d#r��LǓ�";������vy
�QК��k5R�k���	��pDъ{p�P�c'
(�|;�hz�]������BUŤ�/�`1�U�"ƶ@E�{!����4`�/���;)��r�U�p*����
�
J@,�#l��A���P2�b�[:+��G��H^�h
����";��Mr�(���V�c���W�3��Rٶ�#i�4;qHH�
1��u�)ACPv$R)d.���ऀ�%|#���	���v�Љcf�{x#�:��1x�s�Ҁ�
��Wwx��$�Ӂ-��� @��V@��&a����o�,��6�K����o�!cHK�M��׆g1?Fg!�r��m[�t�Nܽ,�:�R�<�4.�2���a�".��lO0�6ʂ�I\-;'`!�r=�}�S|k�,M5��2pճ�)[����O5�BoȼȖn�.D��"hw�G�		5o��K�j��U�]2��=�
S�74�SK	�bP�Ȟ���³�`O����듪8u��"���0��[���܈�ʔEj�r�ڴ^�9���ŽeOA�����I��9e�9�F�,�ߎ�=Bg�R������4
���׹2�+�B:�#�c,����t�Ilі��F������,��Y@��ϛ���"���[ƥ�ŌdL0%��v���c�Q��1���+��nV�,9&	��	�T�VT��+�C�E/�W��#�m����M���Ο�ޮ�G�����Z����yw�̏����@���G�X)��X&`$�m1�b<�A�nK�F���K�(M
߰8���*m˘/.xH���%��`�.'�3Y�88F��w'��
Yje����épD���Q��?�Ϣ_�8��m�z��<��V��@�PddAYw����= ���AzX��@\�Uv��C
�>E�p˴6<|�>�@ŵ��¯�Zo5���[��Gt��p�W_����3�D�]ɲ�x}�P�<y2ԝPW��~��v)ԝ�'�����M�-�kE��F��)����"���/��"�����Z���z�s���*,i��D����*��V�Fu����e��G2غ�n��-�F�G�2�*�����U۞us?���l�HSSB�����DɭSƂ(�p�.N�du���yr0^i{'р�|�MhNj@�;��wA�j���W��n��ֺ@
�e��|�ZAL���H�M���	;�Ѐ���awv0�,��G^�A�ʭa�W<�*�k� C�n�{��2e�p���oA7ʓ�.A�M�)i^�'�9�+��
�
��r�G�s	Ř�s�C�F���{�����L���N�K�h��09����8*m%���<͢Lو�XI�8������(N�q���՝Ap�T�		��D�|3�Q�*�;8m���{�Ħ��^U�"�yQ���k.܈Z�pc}}��B�\p������DO�;�sh�ş�(z��/'����������K?���+�5�Ź_���\���YT\�|u�Yq�U��)�C��V�b�w��|0@2R�}L�?>��Oj���V@m=�~�5���?�|BX�
�W�����,��ɱb6F��ѥ�B@}�eI��yaP�7O_��
���\VO���aP�0ϴR���J����a�*Al���“���~�"N���E��d6�燌��B�9���cshή�	�ͼ�\�'��Xf�`:ī���MU��7~,ZQ�סR�?d��0����<�i��
w��(y�ž��%�=Jm�I\�oo[ɱB�[V:�u�([�����]t�
���tɄ'&���͇�6g5X�VB1�^���5'&��¦�
��ռD5#��5Z�
��aM�Ί���x)�1���J�%���/�Yы��;�P����k�q3R���(�ė�=����dU�=���R�����B�|F2L�T��#p:U�#U¸8��s��v���vjX]���
���>�a��^�L�=�%�`�)S��*1\t�X�&�з�e/�E0�fț>�UPe:�ձ�}_$�ͪ�8L���gӕ��c�f�t���ENv�v�y�n��2�76\���KZ;#A��lm��mm҆5A�,v����MH�g��
�+���'�B��PTZ�Ыp�B���sڴw�&OJ`'�r�j��TǛ��z��-�&�2=Ԃ��t�q�:>rr�
��H���uiQ�2
?w0���m�G)�.}�R@_Ĵ^ێ<eve�-�)V��o@��d��z'�fx|�+>��8Y���3{㴎���I��ŭ<7��`����H�<G����!b�Au{m��7�#�(�}����m0'�!�T�@+�M�0zD�t2
<a��*�.[Pz3M/�io%E�*�)ԝf�R s�)�W�Vn����']�	%�V��F����A�^��1�\'�w��%���
�^�$����(U�@�/�J����
��$�>ZJc������8nF��o׀���ʀYT�P�7��J��s4���7�)�:~�v� �YJ��3Rϡ~j*��zD�Ӷ<-�\�h��ڂ���1���9��8='��F�k�›f΁+�0�.J�~|I����cR�u#\�l�'?��4܌��4�	R��($�����¸
��C;�]��
+ �R��Qi�*�����U�7�0�� �9�Rqێ���bJ����ОL�Х��o�<ڿ�k_�ݰ�	�|���:��3��e������*�4�TQuQ�J7e:�x�L�3(�'~K�U�g*Yʂ�y��bYOGV��W>w9Ղ�*�E�`�/��$����Ğ���ߎ��~�LJ3[�d	�yЩV�C�#Eyx?|#O�%Uп��_��
�����������̵k�

�]VsI�N��5�}�㵇ޔ����r3���\���^�|���J�vꋓ� ����V/�@C��-י��}FL��h4���9�D)�b�4�AK�[���0�QҖȒUY��ll�cW�[�0�-�{6X8q-0΋o~v��8�m��{CyG�$]
�6���1W�(�1�z��kl\���墭��f�t���p4�[{j$oB̈\�Z�]|Āan��AQ��4��2��]�i�7��Q��,��]`#�5YY�$��DŽ��]Q��63J���
�1)�j�w�~:ϋ(���an++@�?p4�ξD�{W���3�"r�F4NЋ����
���@�&[��c���/Q�&��=�+�&E9��L��|���[�QTpL�9�9�n7Z�p���}k�N7˝��!>k����n���$��իY+��m&뭍�(V7�C�nc;�Q���SEDoE�����:��oН*�`�P6	D(8��4o�R��(�+�#�O\�{�F=�W-��u1޸��L�
\�XZ�{�����s���
q�����4L
�w=u!�GY�W��vьYE���7���j
Ьߗ6�^>�地Ѻ�Z��0V�G-�NV�ྑx�a��h8�e�m>R��ׁ`�z�5"	�
�J�OE����h�X����n��)HҐNmk����h�r%a��a�����e=<nn��к��ȕ�h��xŅ=�
W��?�z��5��|�5;L��Vo�!�Y<�u��,=N[��|P�r����1�4���F�!�C��å�#��z٥�,}�̧ߗ�Ⱟ�����c�g����gi�=�7$��3�À�5����HIZ�L�%�i~[:H�2��%��4��fZ��+栀�h��,;��g�2,��l�qq���Awǃ�p��CR��}��`�������x@ƨ���S�r<��IF�7��uGYM�TS�u��,��Kr��l�UѦ�����f.�.[������	_+�}>7��$�S�s�WWkA`�!�޲���
swc@,z�6�A�H��7��:�c
y����&|ǁ��-i��z�%����i�B6o����9N�J���Z��&.qu������٢zh'���V�/�(�y9��oI�W~�+���O��OHݓM���	)")]��9�G
��^	���OW�LWS�RkAhʭ�
	l�8�~�]w�~
�pw�A~��܊��!ʁ1>�|�"i4F%�:�E,Ϸ���hq���ԲªMU�ĕxno��`L���:r�֟��<9����%�#���k�h�K���q	jr���UnoPS��;ΙȇEa�3�Kc%hk
�?ێZ�Z�}�֥Qʼ�'���pV"�m0ԫen_�k�B�,<V�yv~����ː�F<YY����w-�j�E7�J�p����x>%�G����Fݴ'ĩ�ji���`��$ENz�+m���#$0�dxz2C�}��
!u��ͧZ�MZ��Ϩ�e���Lf�Q��"���Z��	L�u�t��l�Y�(u{#�m+f�$fV`����'vd&=��5�zR5)ό]�m��#�o�����MP��a='`�VV_�hM�
[5�|��Ǎ�`��4#)��H)R��9*�S�����b4T��x����w��0���{{P�t獀H{	�2�d諕��
tA-.ǹI|��,�A:��g%�b2I��ЖD�7�F����!�?l ��{�'P-������
x_���Ii����1� ���驹����T����4�8)�m"���K��S���<Z��T�_�p6P�ag��W*n�l�ޤP��� �7z�4qְ�����"�c��3<հwTŭ��Ɖ�ͼ_�����ӥ2{5�1JM��.]`���C(��8#0	[�7G2B;]��arT�Nk|�~�ve	N)�Hի���E'�=�^�a<|��t�{?Q1������|W3�3�*�O	�/�Ёc��Q�VE�3��_(����pڻ����-mF!�������Bj|���e<�8݉X��&�&����S\f�XWzb,_@�D�"�b��@j��<���<��b,hU}�(l~�7��h���SF/�N����X��]3Fw��w�iܝ�G��@K�8h�uⴋ�z���������ƀg��M_;�wa<s{cx�(�
o�~PKZ�)�@3&@xJ�@Feb�jG�</-v���E剱=Q������?:���At�@"(�!�LWo›���8�S�K-��̤���	o��B�;����P�[ɫ�n�L��*
���H�)+���/ҭ��|�RO�<��~���h�<�z��~�dd�}*���[��R�lPM=�}�T�f�l+�=ֲ���/������ɋ~�/o���+/�T�
-�.��I$�B/�C����i�x�
N�r8�])������2L����C�5����������'�O��F��%N��u�V���v-�����'��*�˜)���*K���^�و��X�F��$���"��Y�
4�-��8��x���w���R�X[h$��m/b
H�	�Es����Vб�L���G9��*�����s�21!����
�|0��(��}��fL,/�J��:��ΐ2�S�kd�B_�y+
�D�9��BA. �s��h�K}���M��޼�d�~��i��uF�z��6��8���f/`3^��r�.�}@�ipD���K��c���T���k𪇲�q��ڻ�m��ؚjoL�9s�^[o�J�� ��6o�qg��6��XI!�,��<ʵ֗��YL��_�Y`��5��s1���]���N&#�F�fjw�K�8����u<��/t$�Ց�P���Y�o�C%�5��aga�o�i�~��YL=�ǰn����,HIv�|BZ���%o+�L�t�M-7�% �ף��(��IՀM����Ս�}=l,k�g�~�K?
�W�%a���Q+^u���[eˋG|5�����I�|?��U��u=ͻ�8���N�ce�BQ���jV�Gc��B@L5D��VXfQ
��YM�}�������,28�9�x�҅j��THMb����h��p���v���hm��VQ�EO6�@�q����_�XS�>q�*/�T؜Z;S͍u3H\���X��PV潼�@�)i����nӾ��=�GX��J�ϧ�C靋,{�����M.I�0~M��O�,�V����]�N[v8+�Tz#�%�J��g�EP|ԫo��T8�ȃ�ܙ�88Ќ��f��%�ܥɖ9^����D05�V%���I�W�����w�Ǘv~�c��$6[�#��ԗr4�d�9���r8?T�7#R��>‹I���c�sˉ>2K�7"��Z������-Q�@�\��iq�"'z8g9W,CU��Vb(��:�mK�B��"������@�`/B�$�C0�N^t�I���^g�S��j4�w�R& �+6��B�����
/������i�d�ٚv�v�LJ�8��ߊ�3z=�ݾ(�6#?����$A
Q���u��y�=ul��y�{n�*�r:��HmK��av��1�����2���Ŭ��?�4ܜ�9����@�Na="�n�
`�0&{A脇hfM��6q�����9+��Ì�,�n(*�
��t�h�3��Rw�6��x0Ȼ:*�������ᰨ�=e)Z����]ˀ�c�!"B��X�A���_3>��>�Gd��R}��b���u�$UU�(�FS�*�Ŕ��ž�Y���o����+�R_�~N0���Ӕ�����L��&���̜'C�Ǖ�%��<ֿV%]�i���M,_���#�h��0��80~�ZQ����� z�����wZ�����cTl�1��)��G�ڢG�V���}���N)29F�G3�HƳ�x3ʚd_���|l~8�JA�*n=S�Ih
ܩ�0>�ڛxOa�8NXP�2��
���(T���2ܵ{$'v�2g�b�f1n`�AL���&e@<3sO��	��	)��%���8���tNv���i���Ө�Z�S����r4�����E8b��m>�ި��M�Z�T�s�M��Нu���0^�h�n
D�!�n�9���W�8���sʎZ�q�)���<
x&zZ%*&�Q/E��
Zh?��ւ��^4�	O��k��nC�or������m.��$���}��Y��@��-Q�)���7v�4���3Z�v�1%�]��_(|��(r�І"�y�����כ~�����A���^��U�bKy�R��浿�j��HSk�7�oܿJ���8��q7�<�''��XE,�7V���,fz��^]�؇�-)�*���w�b�8)1�Jz-���1�k4�VW��<+0�œ�S�TJ�֝��_W&��|9�;���@�o�8Qt@�7��p#J�hYs��<S�H�}���Jݡ`�l���M���\���8���iL#�w�hd8a�.N2H�x4�����KK1�(Z=F$�hb�@�}tnP輵.BX�'�2ϳ��8DcX�&����aѭٟ�)�c�WQ=�0G�z�9�G���&�#�:4Rhx�U�g.:
�d㤥V��C*p���WUEmzM����eo*�.��9�nj+ ,��������S�O�-<���j"�;6�a#�:`���#�GVu3�bd�h��x�Rj�|�xU�5“]J1�����:�
k�K�⌿�l�{�N�L(c~���q0�?�a��EG��Ԇ1�f��x�4�p�#*0�*���T�aC��$�R��3�
�D�!H#1�&RG]C�(���Q�|�/Ͻ<v{WzHn챉�
�s��<)k����5n�"��\�n$�"��)?�Ԝi�u��6q3א��XeǍ5͍�xX���x3Fy:���}&���+o۾�]
���1��1��������h�(a����g`8����
Y��3E��X�m��2�:މ@�E[�$���N�u��p0�dl0rX�X.I|�q��
�a�;��B�)����H��w.@��jw`((p������A��a��(�t-,*��Z%	\��d�2w q��n#+l>
�	<یl0�|ԓ��w�F���y�f�'qG�C,-6�pk`Y��V���� ���Dh���+ڳ���|�����&�ۡ�&���x�Լ�j���h�V����?H��_T�Էh⑳7�Jz盏N�c�fT���G��5t�&)UW��QϽń-gdG
d?�`�3f�d�T�!$\��r,
W�+�x%q�ȥ%�v�M.+9�P��̸ycF#�{e��+�4�0��z�&�r^{'�G<Yx�pl6�$�;�an�ׅr����=�U\g/Оfߏ9Z5�,}yQD���:{W[��wnl�&��d�f�@n�m�&T5�~��1�ͷ�ѯpK���ș�r#/?���ƃ�y��g�v��ϭ����6��/��QbG� �>��y�����e�{����:��xP�9���W�����kK�a@��|3�7�i2�oUNq�r�2�x����`��>�*̂�Dž�a�� >��t���52}�`yC�#���K�5Et���"S~����‹��Zzo�/Y^�u�]�k���>J��{��@4o#u?��Uv��q������M�b��x#Z<���-d����Y�m�@��~����z��q��xv�/;��g�D[�6�`Z;\W���/ȵM7��;+7	�}y�vڭͣ�+��Ҵ��P�:�j�hT�#��Ϟ���h�#w"m�	$�ڞ�A�A����10��\�j{��;	�㟸���g~��S�GT��J�H`v-[�n$�D���<��֜bZ�$U�QuR�z�ZQ�����C���t:�(�j��3ő�D��Q́�4��i��?��<�1�Mc'��)}�_~�u(�5~�E��.�>=�|>�Ɠ_��l�����U��ʋ�����iH�t��F$�i�06UV�P5��>�e�����d�x�B=�NI��jt���2��i[=έa���쫑���	,H�Ɍ����%E�N��wuظA�|9�������A�]���n���h��⬏;3ے�>�	a�.3�`��ww�ܘ����&o[�9dјLY���Avi`88����~��
��˰��IN*�KmA���R�JV���s���+��k
�gݦ$��T2�O(������]) ���?a�t��2˽�'�=M6���9w�/L
%�Ү̊Cw����n`��S���ZK+?�A:�\�)��HY��7��V7�D����U^���X�Ѱ;��Qչ������q��Y4����½�R�*?!庫B�9�Rvy-SP�|�?�D�`�S��FE*<�j��;,UG�B��0����O*�l������ȕ
f���6�sLȉ�7V &�{��DJ�;�HTvY��)QUn[�R!s6�7�LT���<*�g˖{�����$��E�)?�g�FIy+a(X�6C02kI��n�b�,Iz��5G�s?�̥F�`�~����t/l<����ۇ��%<�#�����ɝ�#E[�����WLq���	�a]�*�L��</0'����h�� �5jh&���\�WC��z]J�^�/�7қS���4z�/�Ӭf�bq�Y�.IQʮ���B-�D0����~�P:��j��h��e!c�4����
�\^��v��z���QHܙJ%�z)��N�r$���s�׳^O_�QĄ&��S{�~��6C����z�Bӷ|���:+��$����[�`Wf���i�'5#�p�k֬٠SjQk$�uY倜hDp��)�K��Q�Y��
���`'�����
�,�kN磃��I)�z�jEQ�EϞE�Y�ދZ�[j���2�va&o�$��=5��0^F�@��|�S<;�[,�td1��g�<�a V�1X��Ȳ���;����1*Ɣ||��p�(Xyi�(|9��W
MY�tlQG�2�pl}	?6=�o���������ޮ�������/�{������k��?߿|���i��&V���3�b�/O���~@��i�o��K�Z��P����2��?�+2r8�N#ͨ�b�l�
�EV�yz��(s����Dt�����:���ڲ�� )0=�2'�.�;�0��|�&��Q�,/�ۮ�֍-���8y�cvF<-փ"��a�m�����،,��I�vL�j����tXoJobuL_�VƜ�I~朐򶘻Xޘ��<��ZW_��&�F�!/<��NΌ�`�[tE�/{P�B�٩{��{yF/([�0��W����9@Sӌ�	a�~Ë��/q30�0�xd�>o*}�M9I�+R�TĎ��?�ŮŝƦ�aM���SF��_�Ԩn
|�4G�[��J���[��d���߇��O�>��G�Qe'�w[õ�c0� h������M�Ge
���X���ޮ�'{;��NF����؇r�w�Q�VJ{ҵ�[��:Q��_n=fp�D�QK�,�%��4H�˄��:�@�����߉��gI���㛾��ز�����qG�8��8%�)�..���;�#Ru���e��z��`ۺ�3j^�s�
�S�����V]�Z-Pr�v�����{I�m�uxLg��ON4��Ce�q�2��Ȥ�y�LiP�Vg��/��RFյ�Yo�#��Gʀ{$�i~���f����.ݼ��}�,�xǼٺ��D�$��|�>��;ō	a(�Ra��+���?m4fs�m#K3e�n�+Y�?:׆ߙ��u�3>� ih!����1Ģd{�!�Vd��)o���Tz���ɠ�G1�=�T��;�q�|1�#��f�����0 ^M���HO��ʓ���N�d��Z+�EZ�9���[}_u�Qf5\��}!��KHZ��_əVa�����gb�6Q&:X����L�sa(�,tQ���2��N�C�˜:�8�4v1.7�B���M��ṃ�
��'���̪f٩h!��*=ay�B�V����L�481�,��’a�ғ��֓�c���¢�1[�
ll��f􆝇LLL��D'}�חKٯ(���s��Ъ�@>��)���u�}�s��ͨ��w��$�O��E9�1�Y��rv&�!�9�z{;�h|�ݻ��`
����|�΄�&<c<on,�&� 6�`C3b˦�I�ģ���p�\O���&�O5�����F��h�|�'��9K���2��(�Z
���C��Q�y���e�&���t����Ǜ(!,�|���u�i�&'9���y{0Vr֙ʒ �VU5h���d#�z+����������r[��l6D����o����>z�JrE�d4������ߋwZ��h=jE�[��@�������
�����*�����1U<�#���P8���"<����m%l�H=�]���2�H�#M^+L��>"����s��W�J�.>�2�hD��:R=�k#W�!gy�c�n�qpj��'E}y��R����3�����r
CAM���&%@�P���Y�`��BH;K^�ȭH�o-�5�U	lkK���9���d�#��<q��A"0qP}��MjTO�a�()����W�߶���-+��E�7Gemt)H�����f支A�=�ua�A��*J����D�f���#DY�>ێ*���>m
�˛ʷBӢ��+2�����
�y{���$��%�S��
��U]�V���#�O9m�#j��۵ZI"~�&�7�B�V�-��7,*�1īZb4��A2j�ON�]t�8Vq���N�b��Ӊe��`#%,V�IM��m��f���Og��m� �6��(�t7�R��t��w�?۔�hv"B5��B7����'�@�Îì���+y32�Fd��Ov�b�6����:�����ف����Ͽ�� ��#8ԼP�@	�g<%���d���m���+��z�^E�1�����M�����$A7��	<6ZY:|��<�(�ݼG�!g}(S䲉�u]�M��9��g]����xl�s �}w������B��&�#�R�
rN|�1ב�z*V����Oѥ�DId�漏0#�SHך*}En۱�.���M�O�N�u'�<j���lE�|b�q�h�Q�E�=���Vb)#I1e��xԷ�᨝�8�'��Sü{���Ő�~�hE@��S�N�D�E�UC�Y_�g�4'���L�M�(�dE�k�^k�N�z`
O~t���4����N����Q�/
��IM�oA�m^�EЕ���h><ȧCh�f�>�]Z�*�1��z�z��a'tw��/ ��ԓo$k�)a���Yb���s}�j�v]q� 3T]@\��L��1v��n��AY���}@��� �l��c	bc�[@��LPd�-B[)l�,�lw,t*�*d�r�j�ԅR�j�BX�UL��R�v�[���u�ۻr���$����@_L3A�\����ʦ]��3�8��,��m���0��Q|{<�����*k8��n�sijV���,R���pF�Py-���'	�;�o��gqn)�ʂ�ˈ�)9���#��
�l��t1H�Ŗ¬3��c�a�l*HA��
kn:�Y��������>���R�[+Ӓ�
���{��VP��T�B`�p��
aVh;-��r���Z�����ݟI���ȩĢ�{�6ǯ݋�P�a��r�*�5V(}�mXI>Z{p��mxV�66�V�}����1P�p�Q�+%i��v�Q�֠~X|�|���ȱT,�Ѷ��J���%T�����ZG%gN���G�b�gi��k�%:!WM����MU���Ԟ��,�O�� �#jϦT���]OЃ#р֢3���z{�p�ƝI�U��~��Bo�'4.�-��`q�(�O��ގ�l���nĔ����<�'h�RD�JT�ļ�Ӟ�m�w��	�eo��=ehiHd��vٹ�L�Xxh�Bx;����j<M�P�	���I��21�k-�T4~��p�U�*�)�Ȣ��88㇪F/S������٪���NpG*�/�jmUTl��D��mӒ�\3�%W��K~�]Xv�[�H���iD1��8��`�p�l�9����u����+���[.�;h�mo�_��(�a����w��T���U]( ,~�Lݶ�wjq�<�|S���G�K�c�����Kֳ���]ϷA�����M;r�I,?`M/�����r��%ͨsm^yf��}nuYe� �ijN�(�$�9W��7�V�_%�����\�d�WR��eeP�8
`��M����"y痲k=�jC'%u���ZGӛ�'�>�d��/��A��&�a�5���*K-N��l�����G��+����!�ywt�N�����j��Z\+E�qbO��s<7�1)	���T�5X��j�P��kq-^���uaQ��S�互�|�>:��JI��[|�cl�q//u�����d^�����^>���4���gq���8���4|�SZjr+�t�id��m�Z�E�n����$`��D��Ф�b�=T�~��P-�B<6L36`��	������^=���%��alUWm�~떔�_IEf$�)+W��M\�۲�����<`�+��B�3�j���ZBW"^9�{*�JN��&�i�v@a�lB�@m�[�|H�<�gy>x3@'k�	����l
��,�n���G�eɰ�*���Q#Z⍜?[t 
�K��1c^DT�U����#�UL���9t&J�����*k�!h�Ց�K�Ų�x/��tX�юt�I�}wn�q#*J��X�͔�)��FUs����>�ð0�:DW�*�0��{:�H��d0�A`�)��AG�,�>��852�8�T����Z
�b����qGt���6�ϷT0��<L׸]v�����5�!ÌI���i'u��7���c���Ԯ������3Ѯ���� ��Vw�v�Z{;�Nb��+]�U����6�$]�)Ű��$I�}T��Ƨy�Q�jh#�z�K*tk�?�R.��i7���0�Sl�θ�Cz�]��)���݀��}S.^n�ߙ�;g ��
8ÿ�З�^c��z-��s.���j_�µ$��hp�pX">ք9kX��k���wb`%i�#c��D	E���َ[� &���s�w�޴^�پ2���K=�(��*%?�}���k��5���)���_)��D�fJR�VnS�:����%�k�e�X��w�@V�W�D���5�%J0�>�
 ���)&�P���i�+-��>ӻ�U��K�Z[���蒑_ct����'O������v���}�&�1+١�,������'A
������ҧ�HE'>��/�y�?�ҡG��]��L|�[ϣ?��	�ߑ(��K��Ƙ�G�zY�֤t�Z��(2ߖ�eW��Z����Ʋ����"�]S�k���+�ǰ*�m��Y����Y��r-�j�?��H�v�ݕ��8Q �{���yr����؆cŷ$\�
&h�?�	)R��-��Xr�f�����̓�B��J���L�K3V�J%)w��_�����b�Q�)ϯ*Mg\o�FG�In,�L�M&*7gU���DP9�bL%4$b��a6�Ns�H��m;1]�!Fp|.���t�J��l
]��_��S�vm�׽� Q��AN�H���T�d��C����K~9��n�J�O� �-"���@vϦ��r|�Qd�i��G"?q����,�S��/�*n��w�N���:)v�w�%����y���%^_����G�N��������I��]��Ǐ�&��n�K���Y��d��D��g�>q�%?Lޥ����erzZ�TQ��"�<~�5��e.�b6�6O�&`n�!���np�y'{����;X��$jx�!=rO�F�v�ӿ��זVS����������(N,�k�C��N���9�kxNo�n��d�u�z����(1�%�Eh[Q���!�U!l�լ7�ؘ�͵���e8��FSd�7�$S҃i�4��H���*�	��+������a�>��]K�8�+��׎ܲ�^�vm�E������p���ߙ�����п�A��!\?"�Q~@��]m�U
oj!^�P-,���QF>e��~���jO�vX�K����j�1�@�g{�k�+��G~"$�ݳ�{�*ϧ���# ��U[�����D=��O�Ƹ�)�w*��8��gےߴ���~B�YR?��,������4h���]����FL/��א����R+QbY���f6Y��誫��{Ȕ����IN�J�6���y�͖�R.�%�Es�%�D�ӕB��w��PǦ������y���&!��O��@��D���"��;�ĕu����WO�����A%8v�
8�E��?�p1���Lq2T&:͋��_��w�%
��g�RE͵H�=�ZF
q� فI>Kߦ��B�\Xߌ�dIxE���{�fd��gA�̲�W�}qTv�i�>\�]o�����+�z�_O���.̪������	V��y�<$]�TQ���
��x6WE���!5�{1�Nk�	�j��H5��!�D�A9��?I�S8C��N��q�q�l2.bV/��l}Ň5�ćLĄ��N�ϓo_m��p�4�]�� n����x�׿��,�JYk�D䐰�&2��� ;�M�VT��ב�۟F*a���.��r;p��t��u�c֟�
L�D6��9��)r}�K�|�
O�
�A��kpl�O/�����X>Иc�a���t����}˩����z���5~��>Y
�xܻ/��ˁ�ik��U���E�f3�w���Ȑ�y���g�F��8|st��FcG,Q~y3����&8~y�kW4Ԅޔ���ְi�M���e���'[���u�����ɂ���'�c[�j���w'�����\������S1 ��WΤ�^7���0�<̽�@co�*��=t��3!m�Hw�Nӡ���8#�, ;�.dE>Ac%At/K��M�i�(�	#pʪ��뷺�G��q�k�1�q�k�Uq�qT���;�x�2{=�O����Q�ռ��7�;;�'ɖj���8Vi�D�NK4J���i�Y�����o��A
�)�I����-^2,Ǝ�~؋@�=�VN�:v5�7�D�p`4����9Hje�6�"�50��
�B6��
���Y����ɷ�Œ��0jT�G����2@�L�e�~��Ѓ�`��򮎢���IÄPT�d+�'C!~�+u>�S��a�ΰʣ��R_vnR )���¿���YYC�I��:\ª��0&�1��)΀Q�@+��	8�gS�`GsB�ݽ�a�����Won�'o������-N�߼���l�1�F+�|���լ?̝��@����ϟl���[�Ne�n[�9�k9�)���e?���s9�y�M˪^>�0tQ�;���m�N睓�}��_�����l��
�fE�
T%�IUHB8�O�n��Md\8�2p/=Y+=y�l=l=��}�Es}#�x��-O'�'\)���#u�,��y��M���Œ>={v[�Oy�-l_�[��u����[�?쿳N���������rd�CL�!_[�|]�'�^"w�a���@�̯
��p��w��Q�%����(�\l�/���}��߯-�^Z�m��)UZ�mz���)�-�6���˽�)�����eDh��drˍGn(ɂ��#b`;����t����Xo~�ìd
2�B����q�v����fo�^��2��*�juin�_}aI&(�;i#fK�K2�Ff��8'�K�W�ڹ!�0�a�YZ+�Ѱ�|�]��D�^�?�돏n�m9ՈO)��8c�ق�)�*�C��65S(T2@�ՒD����J��}6m��Ѭ�w��l��n������G����F�����e��N�&�4��{�����I�r™��j����[��ЭǶ��Q6���>�da��Q`�x��UbD48�m )��z�ő��:�R�����֨�;)4�P�C�'��`���S��i��Æi��V̇�\Z��G�b>4�M�<����{5G�j6�����*�&!K�m�…�=“vh��U��I;z�\�Σ������$e��'�;������Nd��F�$P���P{�n��]�����x�G��P�:R��+��;��H��D�e;ٽr
�'�MV�c����Y���<�rOn;WcEr@�N+��B�tb�5�ĺ���xńXn��4AC	����E�nT��MUٺ��P	�&���GG����#t*?�n}K�^�ҍ�zr�\^�~��F�5nZ1gz+F����?`l 7�7u3:���`:1#��;4��iY���4�HE�sy-Jj����g�{_ʙ"T�}��f	��)�5���_����c��ZE)|��8"���e�m��$-�l����?�[<�*}N2��?ڊ��M���#t�>�S9E7xu��/o���^�Q����v2a'3z��ɛ��ﺳ
�j�b>o�$��f��=�v��>�_�3��ݽ��Y��ݦ����g�����hք��]�����.{�#2h�
��d8ێ�qwظۋ��aF�	$��,?�j]G����po�y�$��"j5PC4t���3��‡�{��L�*�t��тT�D��cQ�Y��u�VQ���|g%��;����4q�[_�5�Z�qY����C��pjO�-}�.
3͏���ɨl�7y��(Ê�`$(Ƨ8�u�w��t�ց	7ﷷHh
RJ���Z���~�f1�΂8�����6�i�=�������_~�E�tu�3[i�P�%3{�CcT�hf��ƃ�G_������ڕk(�6�ѣ��?x����ۯ��oA�!��鷯�.�l�s؃��{`�8����a�<�e��uΙ@_�"d�w��(�^§16z=!y�Ӯ/)��At����)?٤��|��^�N$GO:�b_���ٯ;���C���*Uv�
v��������p�	a���z����	年Vh0��т�����E���:V���P���̉ξwU;�)âZT�1Fp���MҐ���p�p�6�u¦�{�N}�?�#h�֡K�	��ͥT�\G�S�X�98W�ju��M9�Q��"��fsE�Ry2����2��s��\���a��&kU�F�����+�i"_j���z��=O|72�(g"�C(�����$5���f��Oh˰8����4@��NT+φ�2�U�	��t&s�nV�-\#�9�֭
t�1���5?�{�R��QT}���nj�����J�v�Z�E����|:37�)�6hE.؎��g��7c���r��@t=F��$şL�RNP*0p�xn�����$U����?�:���t0�J�����Ӊ7��8��a�?a�g��(���z�	���Xº�pH-�rKEO�/�Zw<�Gꝫ�N�(nRXDZ���19	�>he暑r�l��3��i;�0"�B�Q�ق�Mgӥ��'��T�'SHv�������_�5�b���=�ϳġ�=K�\�d�Z5߃};�,*�z#ä8���ףX�C�`+V�!mma���&P@���(���3��c2t�:���o�o����p��j�̩�<�7O����,�{@�]�`���d!pa�5�F����VtD�=Y�2|֥�I��2]�&�������ޞ��e��ͳ�g
��-�8�a���4�@����pA�G~��
dg}�$h[���pa"�3��ET�d��X	B.����O�λ :0�l��eƘ΄ta\�ה�d�S2��q$N�6FZnU�;�b5��jĤY��[2�@�%�y.��2�a��?PK��mW!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPK��mW�a�h�y��)setuptools/_vendor/more_itertools/more.py�w�F�(���
�s���%;��w����l�M<��WG�IP�EZRr��zuwu�AQN2_~�t��Y]]]]�|�-�&�M�"/��'OVU�I�z�-��,�$���]�d�(Yf�t�n����?�Q����cxh*��ŊEf
�]UeE3^�]��N�\WY���,ׯ�Ů)+�����ڂ۴j�t=J�l�[�n�t[s��,�d
n��
^�|u�_�l�N�t[n�Z���?I�oq��ň���[��D��/�]V�:7?��r����^�yc�R�^7i�I���Io2�@�ɗ���t]WY
�<�M�\��fw�Q�JLf�.KX�uy�eav�)�z�m���u�K��_#��G�|UV.]n�*��Ly���*k?6;���G� Ⱥ�����uv�.�j�(����2�&��nʢl�"_F��l�o�pq�v��j��d��i^�浼ږ��c�8�7��e��x2�:x�d:M���49O.�L��:d��q�^�|T4���6����B�|��+j?W/��Mfk/��y��������l���Z��i5���US�ǰ��3�w�~5�]6%T������Y��L	�ͣMZ�L�biY�UV��vO�&��:��2ϋ�(A�%`�f״_V�|ר���K�+��^�O�`��\��n�m�����|�P�F�5/`w�fr�j�,�j���[D���4�0o開0�M%V3��5 �{�N]��r���,[�7�t�-J�~��6�>a�h������#|���{\�PٕDT�S��aY���{�}�. �P{
�p�~�Ͳ�~L��
ٶ?}8U��]1�E�j�m��f뚯�����yvk��M3�pZl;7\�iS�v�ޮ�f�6��U�g������!&?�+�d82��T�z�@{�7���'��2���$��u��.
Ql�i�.��ӟ]���ԥ�
8���?h��Jb�����QF���r��I4 �ekI]Oy��ɻt
��c�"c/O�4K��j��p ��*8�[��>�
O��Id/�
�%p�!|����g��ӧO?�C�&����3Y���r�0�&�bx����ߋ/�D��s1%'��t�<%�G�Ǘ�c0�.Lx~a�\r���'���g��S�}��a�RO�m�^'�@�U%�JU���
s5�/+�΃���y�	��	�l:����5J>%�29�JEe�o�dWgI����>ʋ�P`]7pf��d���ȳY5K��s#_=~v	pGɐWQ;�ٛj��f�~�7��6cH�3`��7Y&L�P�"У������뜾���O��HO����,U-
�s�j��G��b,��"�"��t���<)�e�&�88�{f|Q��ޠ�A��C�U<�>M��e��b�p���QP[Xvȹ�z�����DT�x]?F	�k(-,����ہ�pq<J��y�J�á���Y��nQZ��!
���%�.�[�o��yո�8U�'n}T��Ȟ�ΰ؉��:��,�/wLV��*+qtpWɊ�ң�<���r�9ڹ5
�6-�r���U�	p��+��LW@����FV���l��������͞j���DZ�">+��)�t�᱑�u�0@�‘
F�[��%ZϬlp��!��aO��[!�_�݄�Cl�,��/=H蒕�P�d� �z䖡���14���9��s�N������*T�0�u�
�]M.�������er�4�죏滫z��o��b\VW�u��N?}~��V��0�봆+t��Л��X�io@P�<�����O���<���v�i$�Mܵ&�����`6��7瓁��l�Wȶ�Gɛ�m&_�M:��7(������#{�kg�ߒ�V��l��j�>�Z{�jt��a��
��	����t���ڍ.��D�G�Nɇ�ĝL�愂�]@
 �rM���c�n�,�	���6Y��Mz
�.Me�Y��+���e�^A��lwֳ6?C�řUY��	
…����j�V�N����W����l���`ޖE��;�ff�Az���L��K{���"�Th�E�j=Ӟ�
H^��{��Лh��"L�2��(����;�&<2�L<�6zb�
��4��e|v��\c,��6L=`��u	[���I���Y�=�:_\'OaY��Oq����Z��y�Y5wݟ�F�B����E��_ԉ��鞨�_p����Y�����K��Kr��"s���pX����#n'�x�I�C�0E�����W���"Va�+`oi��H� ���ekC\_vn������v�7�U�"b�_M���m�$�%�]��Oo�J�L�gES��B�6i��$�h��Z��b0u��C��v9v�_�*���[p
��+s9�>t������6����FR,o`��o�.�Cx�۞!Ce;�Hm)����o_m�a�t����?�򥻺�d�S�y3���l�ٝ�|1�捑�"A	^�s�^(l�.��>Յ�e�n��^�i@
b��(wH��p ({q��(q~H@�x�6��m��ݓ��n��'��f�,19�u�j�ȃxE���nddY��RV���j��k-A���tK���g�f�c^!�C<�];�b�M���՘� �%���W}H���&
��W���Z��׵�	ۖf3��3b~2i�u�䅭&2$��[	����E����ؖ�{ �R!��?u0�b!����X�-k�ߍ�)T�'d�@~��eUe�橦޸��g��rW�t�ǡOl�o�t���5�o�78�s�"G� DU���o\�V���b�Q���5�`y7x�R�ـCm�{8wѡ�.o�-u4h�w}b�:��ʔ�Tr�!��F�A�MYm�u�3�p*�C��j��4�&C4���̘j$a@B�Ľ�&�_$��֤���^��,�&�	�8"1��)��U�q�<�F����M~��GfpGp�}���>-=-O8C<ـ���UeOa�x�f9��4���8���U�\�>��"����O5&w�&�(!3K�+��j��W�p�‰=֘��
p<}���AގS���-�mZ�	�r�X�(�.��"�y�Z`?˼h�{�@�ˋ>�1OcD������ԉ�B�;TEŐ��_���Ź���'��n�#hP|r����dz�KM��� As�s@B�,���ǥ�ܝ#Lܞ�A0�Ni�{�T���
t�s��Z3cĬ*gs���/0�E�n�$ӄmb�fOm?`�X=����t��k�ɺ?�jԚ�h�H�,��|���+�K����uO�{/�~�/�~�~|���?�P��}�s��%7Y�E��bk�B'7MX6٦����?�y��wxDZ���XF��Th�@+�n�M0C@ ���5;~I�Uި�� 4M�7��M,Q����f���CS@���B��PD#(kJ�w�1�rC���f��e>C;�~=@B����lb�P�-���J�B^�&����N��@��𿷬T�D*H�'��_�KAx�9�C�0�t
�YA��-�����Z>�A?'����4C}|�����9�ף~N�Tn�E���.۴&�(/Ԫ�D螱2CG���,�T�ܮ@��'�h����w�9JN��?D��Ȓ��]�iM�)xK&�c��P�j,���iU�
p�"��)^Ef�8l@�lj
tGd�x:��|�� ��G��
�(zE��D�.6���|���Xޱ� �5��Z�ZD������>;9��{��Oei���/|d�:�Q���ۖ��Ħ���WQ\ajg�;@@�n��	�pr
��6Fڔ#��zJ��$Yi��m������l�9,�_k\ȿ��^�W`GI�&8P���ȓ��H�Zp*ȭʠ���ϭ^�-���ɀ+��*��&�����G�0q�=��o��r�[)�6+!�5>_P5 ����·���,��,��π���������Z�B��
�t����'ҝ�	�����@�Ȑ�'P!�+ГZ�#�q�ɴ�?9�?�M��&瀒Jˏ�D(��H����n��o�	�&’TY@�>�0����ղ��0	�	A3ϊ�5��j�2�œ����:��d��Vp�VW����-�R��3:%Y����y�6�&~Ȳ�����y�-�e�'����K-����
b����|�4�Rr`���$0e���2a܈/Q�E���9Z��f�d\N=PO�1��'f���w�BtVj])J8����d8*M'�BLD0���v
�>~�+xp��<��\�P��1
��沬�%�6�H��]3B�^i]���N/@aU��\CB�
��b]ր�%*NC}◚��C��/XE����&��q�;{��Q�	wy�2�g�mJ|��u�,��c{�.���Od���^t;�h�?{<��̗xүD���>Z�Y�{}�&����b�-�E0|)UZ��7%��sO�o�6��CfԼ6c����{�ƛ���>�I�
���IƁV"$E'*jQ��8m�@4��x�PC���ѶwtQ����0*jdt5�N�"�[H��zU<�D[N�z�^��+�g:Oab@�*=g0����`(Uy�."���ώ��A>n?|a�	���4
ȄH��[��8�W'5م��c�˲\ �?K>��߿�����������|��7�/^�y��׎�8\Z�97�3�N�X��@��ط��|E��!��YF�{��*��z������5�v�Yہ��o�uZ����/���BU��C��C���ŐڇAo�e����ڠ�xSYPi�b��\�y�%�	�?�Aq
�)A}��>��{`0�ۡ�;�������7.z�Mوi�&��Ot���ƠI�^s�B`xG�6c]/�萺{'M��{�$��Fu5��C��ö���>\TkC4�n��l{�s�m�>�b����l�¨sc�|�m3��}kHGo`VZ|���n��(��Cn��+W�<|ܮ&�D��'��Ԉ��Lz�� ����u$���f��IzcإM_-�ț��Co��|�ޅM5-�O��R�CU������
m�L�n�\t��i�M�eh��H�y'kO-���(r�}y/_��@X��?�r�*nx�9��o��Y�ED�d������Z�2���k�Y�
.�M����у�g^lwh]�v�5��荰Cs&s��V�|��{;�ӥô"]�p�b%b���k��<316:o���@<���$%����/�0����?(}��_3dc��Y13&oM٤kײ�;k�$Ş�Ms[�����1��n%X�	og���*b��nn�D��H���e�����
Q���t��
.o�%��Ѥ��~����1�S�\_���3k�;��o�+ͭhh
����R�x�+.�ț���n�mF",�,ߪ@��~���<��z���5�//���o��.��;ُ��G��e�@�����E��.��"�%�Ǚݡ#�ܦ5$��(�ܺ�_[S�������
�g\��g\o۠z��)?Ro�B)���VY�Ҏ0�i�O�^��m7�YА��|���"�5*�X-v���5����'8��C|�!���9l:J6g�K�<\������F�{jS.I��鼔m@˸X���������Kv�u��J(ej�=����3n.kzE���I�?�r�iJ��W���Ml
4��b��
(k�Zw�{�i�B��3C��#g�`�pcWAf�pAc����md�`�Mz�ov��t�!d��&��O�j��+Y���=�)�sd���}�x�Q��R$=i�	M̈-(� 4C�<�b�2s$�w��8uja``u��/L�q��ˑ-n����5Y�"/�dMx��Z�H�C3�����8����k�(0�~��WS��|�W��������	������IW���^h�~(CaJ^92��J����Y��9��s��,^�8A�(��0z�=����a+�'�ʘ���2����L�c U�7~ڲ�g��[%ӱ
5_dc�t���ʿ�ѵ�?�P�5X压\��F�&���+E���\B�a6L�MI��]�,C�c
�����Ys��@��ј��h�/�Q⇉��ȿ���3����� �art��,���N���P]JK�H���bMf�/�㞉W`�N4{���9N��-J&G/��nو�N��-�@l}xH7h�˄��5�e����5�x�a<q<���r��9�Ƃ��	>8�<lF7 �°
����K�>��p��z�vl����t�j75����<ʂ%����z��Õ�+��OG%m(ɦ6(�G��`�
���Q��6]ܤWhbC��A�/��F3y�(�p�)9�/����t�;�od��y�l��~��y��{�E��_�X�Te��I�'�1�;�;i��ђ|7����vf3���[����1�KE��3�YqD���I�\�$�!`p�'�\"?NѝD)<f�W�>	E��o+V{*�Y&3�}-�>�Nihk ;���<P��^�?_�.=�P�Eg�T=����ߗ��������C�ϭq�!��*��ꝯ��L��&�k�o�͟��Y��7�-N~˳$��?*7_ZdX��u��$��F��봾&9��l�o�|^5��g�M���!y���٧0Xc��6a�n����5X���9�Im,ߡ+i;_ɷywIկ���r@���<�N�jn:�Cb��C������.@2H�����_�)�^x��A&�@F5��j%�?+�kD�>.`81����#i�������ja�Ty6�_�)#���i���ڈ���!C��h�	�)��UBH�`?�ikr�8�����1Rv&�4JڃF��X,*��C\�hȯ�J(3��ķ�z�Ć�!	_9j��H`���(�j㋆v]Ƽwˌ�{Ks�;9�4��ږ�Wv��}Y1��Ai02bN����e2L�9����/U=f��&�,��Y�:�s���m�o3��{���Z,�?���&M��GeT��#�h���MX-�b�n��L��H �WT����<�#}�7�ܿDcÞ�W8W�}Y4������t�4�/8Wn���z�{�@��r��豃CD�Si\pGV

����4�<���O��M8KWڏ$�݋^o����@��ꩇʴ�\�6x�|��GF���<�����
��/��;R,�f�` |6T-�G���mj/y��f��D+|�Z[��Ɔ <�(x0Be?9�$>J�^:\�`���� Xlz8��y�qgXaȔUz�Y駁����L�c8�©(NF�>�{�	���Q�$&�Yd�A�y����ⲅ�FD�l��r:|U�*���B7�\��p�e?
����y����Mh�I�1�	��z�-i�o�m�l�/I��S:{{i��x���ߒk�����I��F����H�	C	]ूb���WaNz��bb������	��7�É
�ԧ-zb٦>�V:tL���h�NT
�'^��뜺:W�e2.�L���I�:��{��Ӎ�jѭbKȐ�b��ߩ�U�LFvk�Z� ���u�c;#��F�/	��+�ɯiӄ���\)�6�[%+3&Dc�Y�0�qŚxvg�,�N��|�T8���-�(
���K�%kN��L�?kN��~X�!��CSr�rV�wǗdK�9�CW�	�p�V��|k4�2qP��XЪ���y�1�S5�K� �+�B:
�$�'^��/���c�\4�v���UNA3�X2�L=[��MD��E	�ͭݕ��t���F��#�O���{�X���z���*^r|IJPe��m�3��w�}�yC#��{�XK���ޢ�zY9,)��5l.�zh��p�›/�0�k��N�`�X7"���*V�'s�ut郫��^��%n��������^R�}��
�eB��9k��W�K�P��x�nU�9r=��o�%脎'������D��#�#�X�8��1����sI�fK��e%l@��}�h�����$+2-����] �l?,�^8%��(�X�s���R��Mm��&�N���� ̅�� ����x�l���(�s��%[p�PC'�&m�
Y(��ح�xor9�$��Nf��L𴔬�ai��,�Ӟ�z�����D��_:�p[T�Q��&��re�d�.'�>� ��*��m}���[��"����0l�h��Txz�*�:7�2 L��M$�&^j��w�����۲`
v����[�O�Yb]ZjK��ۡWa��97��v;��H�������H��>b�f���¥��GB4��w3�i���؉>eΫ��x �������cB��b�(�+&�rM��k�hT�r�Wi�R9�̾db�3S5�6D@B�c�Z�u����S��c0ݚ�AZ�Qu
����z�D�H�w85�$�)��ף.��rΟ����2��r�^:_@�+�
�f���=h��2�E�Ma�H@R#|[�Ǖ�_?*��
T�
�n�
�l�]ʃ̘�G�֜��L*��ʞ��bO�^�i�o��]nϽ����m���0�5�/e��i�̛�rr�@�z��Q�ܧ��Ǟv�%��K��h2�;��l}�]�5���qF���of�6���k��L�-,�~Zs�V0�b����I%���}���}(L]���,7���3�d�����YX����/LeV#[	]l0�Qf��:k}�$���y�B�kY��J�
(p�ô�G,J}��z(�~��r��E�{��!��2&��S���6M��F�Ny�r�3�"�I-�xNsʢ�:b�Ѩ���z��:7�z0�yÉ>y���RtA#K�5�&p�/�T<r��!��Mql[kG|�N������Xׁ;ڗl+�9��q���2Gn��!��&�Q?_�G������"m,QC�� g�c��+��悔��/�5����lM�mS���"�M]ݳBc*X
{�Q��|��ERɵ�.I�$D���l�7pOzW�K�Xq�D���ʾ�vUBE�/�E~��[03��a����5��ߢM����@k�E�t��Ѿ3�I�)¢�� �&����T��)C��%V�ũ�9���O�υe�_�0
�t.��b��h��	7��q$���i���8&�M�7��\��k����˶�������G�B���x#6Z"w�'E���"��}��ZMٲ�����Gn/{�[M�e�G��-��M+�l-��X#yyA�w�G�4����x��y+����޾\&K	��
���
�s�*�A�'��_�ʛ,bKCT���z�[�'}d���g�Y��9�L*<����P0
.4�� �;u��8��1~1[�q��˯#�s�m^��S�y�؏��aK���m����6�0y��{�d���%�˭g=y������ɘ^��H�='��Zę�����WW��m�
��f�
�Uæ�jʷ�Rsm�5Jx�qfR���vWec��7yC���hW'4k�
�$�����4��/:���"�}��`���_��<I?�ۊ��oc�X�Hs����D9�����Xs��G�y5���v�^�̙+o�9�]r&F��R���9�g�z�nՎ�gA���$r42��R(�#r&���j�M�NL�W�&���v� >P���s����Ҳ�LySz���_�������<Y�)�V���B����I�ki���^BQ�CS�3����ÝZ�+q�!*���~����+E��~K����l)�G�]G�dm;N�AF��7o�}�&��
�,҃��.��k���S?[�x�_���E��Nabu�d_�sx�s7���==kX��|���}�����L����|�+��8�?&1/����חP;�n��-x���y�K����6	E5V�Ͳ4RK�Y��7(*.������Y�>"A�T�q@�`.���O�"1��iז�nZ�	����dqW�h[�
��st��8��:ۦT5N��A����� �d~^f���d'c��FʢO;���4��
�GmV�|H潘�a�-;������F
^'���R{��wa"�l�YR$MN�s��__���E)�)�/L/��"{

�6,YrF�~-Hcc�#��%\�
�#�Zh��	Ӹ��+á�T�r�5cM�s4ܣ߂.�����b�[���*e�=��H�rc=��G��FC�[\�w��<�,�`��1�PF��|�r�z�"��x<.7�9��?��=�
>0������N�������ߛ����xNm
*�
�ݼ5�>s����o��[���xچ2�U�CԱ{S�z�ٛ��az}��㼖�>^�H\�J�P�
~�eW�=dR��$"��#�j����UY����4�)w��}�g�)��#ďBs����`� j�x��ӈ��8�Ѥ��D
���9�i�=���<i�q
	@�fa*�(*@)G�qL��(��Z�	��NJpЌ�3P�ٷب?%�n$�K"��p@��a��C���ߨ���>�y�8斮����͕M^_�Tqŀ�g��PEk��4$F�a��I^��6�_G��Kn�j�S�]:�]�R�bc�)@O.��?���A�����G�h9����2p�<R
O?J�xy�TU����{"Z�?7�yp����Hc�ڐ�$L�P�n~��E�<�bWMseh|X���3
9�S����1UF��w��X ����跛F|��ˆ��"�(ޮ[��rEd��+�)30!��$F��ɐZ��fŮ�Y����OF��g�磏�����>�V{��/��w��R��Q.ڨ$���3{^H��L�+뙻��Ǐ�\{j��Y����I��=�a%"���N.`B'Gહ�UH�)f���sftBvq���բ8�Y��kPUb]�� �y�(T�+�̒pں�)����	���`��1�94�TX�8v���2���>}:�lt,h0�x{q��lb>��
�o���y���D��Uy����'�gr���}�"G��8yYC2��3i��U�-�h�)p@Di��ܢ\�6ZEP�$Ls�$h���GEu�����ي�y7��<@cƑu�w��=�A�K��;?@���6Ŵ�9Cm�_s�<�a!�����PL0��j*)e��LD�]�ՙ<�L1IUZ��x]�u��u��ka�$�'�ӗ�Q�
�/�N�Տ�(��<�U�O�R�"��ռ�
F��'�F���\������m�J�+�p4y�͌����I�>�P�U7��R�#v� M*�a(��4�+.�OCЇRq�u�{�dNLo��	�7�s�AiA{�6�z�s��G�����3�CQ|\� �"�Rc~��8[�����gh����9��c/����	%��V�c��%��M]�x�˵��
�0��zY�b�&w/���%˙���Y�!a$���P�LY�8L
�A�����sE�F�&��e*Cƽ�n��A�\��I8�gx��oy�/.���Lh�`ى8�m����6%�������%��@�_�r8�%��}���B.��"=0|���X�b�_Np&n'a�[d�#FhҊO�N�eґ*�7ޏ;-7<F�
&B+��:�Z��Jg]�o��M�t���V�#U��4���A�Q�e�FKܚ
S%�"�h�i�����@�ȴ
��w��S~����5M�Ʀ���'�1;�hi|�,��d�^x��� �K���]��3�S;b�6^(��;5׊~�Y�p���a��o|�q��)�����ˣ@L�#($h&?c�cF��1+�i}`�a5�Օ�{)W�:k��K�$�>���c�7$�_`|_�$�Q45+g~T`�̬��e�峣���J��~�7�4I���K��P�g�a���A���A#d�4ʇ��Y�K��0�ω���)���u�Qt}X+A��x+�>_|D�/%[� ��25)KG�1��)/v��od��v��T>�X�b\"x�Y�D��
9������$f�:�:b+�0�ӥ8���fu��})��D4a��&��sDR�94�����ǞV�" /����d�'=���s��vVʿ����#�F\��0�t��!�L������0�B��T{=� ���<�|���Ȯ4�m���bD�ޙ$�8�|�r������_~���Ư�%)J��e:]��dlg�	���NqanS+X�jD�t���y�;�p�K?D�;<�
n'O�◖W�䏡�+��a�H�A�gg����=�Գ��])�Wn�x�P��,:�|�7!�QfdI��-?��Ć��5ûsF;�^��u�ÖFT'�罴'DM%���6��ey�X�yQ}�1���.�Yҵ�m[��[��uvg\�1���������`�i�w�z�_��:�,��X�b�,t�C!�u���k���<r�N�)��|��F�ިli7"xx�c��`�Ũ���Sv�"�|E�`��g_]u�2�m�ZF�k�	���KY�,�+<�\:adV��v|��s5�6A���E�A�&*��#|����^�#^.?v�;95�r�Vu��g��mJr���˄ʌ����c��&N�<E�k����[�����J*
�J&[pi��(D�F�8l�M
�p���:���R�_X}N�X���9$�*�T�Z������I�''�k���|^~�3��%�=�S��O؈�����@߀��&���y�f�cS%)zx"���"����p'N9�40��?�r+m(g
�v�2E���,��d@�N�`}ל��7�co�P":��1z�T�Wl_�
�6@�@<j
m�ު�'�:�k�۬Hh��a����7�!$�1C�C$爫gϗ�l!q�o$�m��3x�#�:���N#�j�ŃM*�Ja3*�VZ([�M\":#Y��zܼm!z�j]�T�n;pjh���Mv?ŭq�a�1�*�kG�s�*��q��%�fhzJdJji[�0�^"�P��q�r�8�6����⾡-h�A.��Q)i-
�EL]��3��β�d����P��F���f�Q&~��ਦXJ$�ʥ�"�����!mAA ��M$���x�c�\���H$ό�I<�1D"i�#ȢI�oS�K�5�ZJ���Su5����*趘.e�4�Ⅴ3�%n����j4�M�`\�u]�&M.��W�MV�ȩ�Kx�E����
4	�E�d�L���+�i�1��&��ȅ��+ �I�	�N�*l	�K{�B��
�D�Ëae�f�B�pI@h��\@�ֆ��p�{O���s�O�5R.y�7,+��o��h�h.�g�.h�#3>i��l-'SD��x�����Cefڛ0��h�2��BM�7���]�)�ud�c<�!w�0g9�ݷ���Ś�b)�� �5��ى�C�����’هt[�\����#��ǔC2��m�N1"�k���-g5,����f7y�&jv��?X'2Q�E����TG(U�g��v��O"5���9>f�k\�G8'�@nI�v4p�oR�$��ql�%���gX���\��/�qI`�?w�~H@P
��f�HE���fB3�d3��F��Q�ɷ7�������߃�����q�@Ba����9r!�\����p��70gi����H	��v���V������⩶�;�!V'�Y��~m��p��$ґ�^�tU&#"F�N�cd�/�Q^����D�O-�,�������J��+u�Fݍ�$���I��D�]g�%Ξ�1�(Gќn)���L���&۔��rj���Cl��MK�OMt�4׻C���C�3�mlQ\cy}���b�Ⱦra�B���owЗuJ�s$(�lVkNWB�R:�c�A�X۶�KToE�r�I�+y\��b�h�y��3����+ԗEb���i�5pF�$-e���ˉ��H=Z�V������r���)���[GS�x^a�x�᪥�V���/��+d��B�`X�"H%/����0"�C{,�8��k�ZI�(
$�i��V�6����S��H(���~����&ƕ��tv��<F�d���	0e�*8m�ml"���?Ԋ�"�Ӈ���|�^�d�A�Yա�N�E��k��D��0�n�]��3ϧO������0~�Y?t��fu~��?�Y��w6��Ej�4��R=���6������XX�o%!�x:�3�c�[�hEڬ�W���E���(ɠ^fE���v'*I��a�}��Xx��ř����/�����[���'z��%y�7��f�#{>C�|��S� i�d�Ju��s��B�'?aa2GN�v���O��*/��~Q{g�e`D�%M׷�}��w�#3{�{]X 7P�(�c^\�ܸ�Pn�N.HA��&ɰ�\āByL�A�F�+��	n����C��9r8H��h�s��p��R�"���?>�x�UYF2>����"������TE�ۢ��&\YJ+�[ʼ%>`��Ʊ����3���)��0<sY�Q�ݫ�"#G�[[�N� �G-׬A�*Eׅ�\*���RT�����$7K1�c�\�����d����k�+@����^�=?�,>��)e��{j�<�9�0��aA���hK
b'�.���)m�i��m��Z}��؎��9�Í�PR�1��Ywm��<�9[nq9M�:�����*�-��'rəaS34��!��,�!~��95y��Ex4�Srpx;��zsn��d_
c�[�B�)@��sc� tݩ���o�!v,�b��$B�"B �z�>S�}]�Y/ڑ�k��J�O��2�qt��l��on˄�'�F��/�����"<���_�i��&�ݻf���U�=8�j�B7	�l2����w��~���F�y�T�����m��7�j�
�����b�,YFI��]E�ZpHR�$�ໜ\�媁�RjK�d��cb���B�,2�A[�{w��A���(|9���V�F���Ȇ�s*u�e���ے����-�˙&{?f����s��6�fK�Fr�} ż$�1���\�m�J�LS��H�n`˵��抐���I g��m�A/�/��홹w��WR��ƈF�i3ny�m��6mʩj�	���b�.�}�v������&c���̱�B?;6�����:��0X�@��b��&+��lK�+}�x���ko�Vh�lTc����|���7�N2�ʇs/���;�L{v�a�,�6�]A��fEO���kb9���ꊆ����3�+��˗��?_�zճ�>N?us�܌%&�-eg�ʽ;Kލ�_�scv�Β^o��D�r%�0j?f)��dC|�^��;e�{�sRo��$��9N��!e�nX�\ej�;Mo����4����M)�aDƏ6N�6�P\��
<�(�k�1Ƣ�$7�eIw��m�`n�]c��=LW_G<�(i�Fsdžy�D4-�B��x�r+�u���,�-�XƘ�N������ĕ׹'P��
�$�}Q����C%N>x?u�i��oF
�Y2����HgJ6Ǯs����0+cN��-��V��Œ����ؖO:��7���r���3��Y�av��|����<���}p$����@vuFZ�XQ�3�Uh�{�[��n;(�A��)��E�P�6�I�%�����J[��n�Y�S�{?�?�E.p���i}�+ƒ�s8�͸�ܴ�G�Π�D�A6�+�2��&�Y"��(�:�6�'i�=ZHօ&�A�eZ���f�<�8���fT%�2���^c�r�c?J�	~����22���=7}�ȩ�G�}�H����)ϔ���3BXy�'����um��XQ�#��a�w3r�����o
O��H�8R�(ۨ�{���p���x�&�L�I \��B��_ʃ(�K6�����h�䣓Tm���k<��y�|����ʸ��=�_�����oz�u5ѿO��d��D��(@�Ϊr���ud�|�v7x��bJ̚�ly�va�L���>�;���ݖ�g(9����d��֥���_bm�orE��.�4b���@a��]��P�f�g3�dM���拍)W�����E�V���2[7�m540f�5���b��x��>Q����iX!�*���=&�%c�V=����~zFi��E���oj�Ĵa��2}��߽���?^�����C��Q�ksl�^�d��ı�s!N��ƾ��N�e��������z^��	��2�+x�Ҵ�A��H76諕$�3“����ڞ����O�}���k.�aY�zG�v=�j�2+��x�Ngy�<�!��\�q����et�Nܩc����ƃ!\���;�U�q�jƦ�)�=�1��&�,5�lE�0�40��,!S�P��i���2�e+��`^'��gכ�o
-��m��]S
̘�Z:��䃇����wNսav����S��v.���x!�xq�(t�#�=���0ȓ�	�j�f?Yh�g�N�k����#��Q҉��	O��"��I�Ch�FQ��v�I�@�C�F:Z�_A�hҌ��VL/@��y'�9�Q~G��|̱U��5Ѐ}~?�@)���@�_�Z�Ka;�E.���Mv߉!��a5�=�$6�Nak��.t���MA����U�lmc�U�'!�q)\=S��!
�`@)ۨam��u�”<��r�FNDb7 �_j����ׁt��ܶA��K��7��0��j��,�^���#@V�I���f�U|���j�3��29����\�#"���!F7�x:E׼�4���GN����n���i�A�4��ק�#���9�n���c{��=V��>.�� ¹��u\�N�I��u��c�m�x�,�m���R��nO߃���`ٽG�v����E�������"]Y5-�j"#�U�T��|��.:ڱ�>���1��~���\�Л'�-�2K1�\�|[U�^HR¡`����¨n���e<�6Jb�9�b�o#۱u�Dw�S��������ig�7�L�p0���G\/��#x�dBr�[v���������T��np���!��̤�yC��2`+��ɒv��ū?�6�}���kx�:�����w����}�׾���I�iB����p��
N�˯ք�Rf^��1A��{(��W�v�
��ܜ)L�{�R���?�Y-� ��P������r.�y�<�a<�{c��_��8��+|�4�U���^�U'g\A(��#:�j�[h���PF��I��n�p˚�UʂR���1%��qP�:����4�4{/?��<�ٓ��ϭJ�����UͿ��>o�Lp�1/�"q6�!
�b|&�o�H��>/�_���!���\�r����V,b�����SL�q��ͧGb�+�3�l���)ِ@�5E�7v��p
\��z�l�)Ơa�e~�r��+�Y1���f]�dlC���v-ŀ����DW)ȗ�&A�W�<���&P���G�.�
}��Q��/���e9�hʆB��'�q���t.��rB"��`đ�i��ɷ�V�4�H#��m�hb^Y�ڇ
�No[!1�w�§��>�ȉ�ٽ��?������@N�B/s�I�_�')$���b�䀱�5}S�x�r��Q9��9�׳='z�Qg#C<V]�����O]KMA򤄶�#3�Ե�3P�_��(�z�\�{����2��c�e�e���6q��x';Ȓ��Gl�o���OJ���3�4ob�����9���>��Sk5���S���7�v��x���� ��!��ٺ=+$���S�2����G&�_|M�\<t��od��p|2ғ�����DZ.�˜�U��i��_בr�L�,���f�aì�8��	V�gbC��u	Ľq��-�$�������ǖ�c��fT^���Ut{��U��>&>��?}�����ґ���s��=t�)D'��~3�sGcԊ]Z�Ǖ��q8�<��w'��\qպwzV!'X'�p8Sx��t���rQ����K���}UG���O�N�n=
뇵F�m�K��=���I�	����d7�]�
5�E�C�zq�k2Cn���d�KW	�z���H�S9*�S�~�{�a�����E�+��m�4�D]�)n\M��]-рmj�1�6��_(��U��K&�zP3���tXV�d�a��+�>�&���L����Ah$�k��H�B��u*)<�C$XO�9��9e|��Oq�W�ኛV�5��ky�VfR+�ܱ�^��~X)�����l��?���%��l/�f��.nn�~}|,G����s�q-�Xcz�<%�e�<�w�+�똘����	,k��0V���ٙ;wGp���u@�i�W�=z����Gz֣���qe"�@�Q愃��xf��	;V������5�7��|�d����eՂf8���e���ar$�n|�;�!#�,��Q;ޓ���2Y�	�a>�@�y�����1~<Ï���G�@>����%�'K���Y�1z sGqL���.4\L��N�H�P_�&c~B�'���c�������%b���.4v���J����	����Oer��zK͈!L���	=l+o֘+��.LiU;��xC�{�4Y�6����m��|�QpW-}����͍�`�碽��z6kTdmd�V}=v�e��[m6�|�F��[�
ET������j=�L�4*w�^N��j�m�f��t��̠�b͓�Kg���:rPo���tRBvI��A��6l����� ���n��Gb�����C.�|l��hryq|��Vi��O�1�\J�=�j鶬s$�^ɜ��]�v�a"��Ag��vo��D�R��no�H���^�����:�W�C��y�D`u�l|�&6Ҟ%����m>��b��p��f##�Be��%�e
>ꐤj�XC�[�d�&��
�02}�
;�X�r���8��1�4��`1��n���9ˠ�Q�f�$����Đ#i\��a0�����o����OjhGb��6T˴-~�!# ��8���mK`dVMp��\�h8ݦ�T��{V��6�_������9���^uk��T�[���������7��	�=�<��>{;ip��d.�Q�=h�I��߅"���
��e�I.(AcL0נ%I0��g�|��ѷx��˴M�M/AkV�M�Iy���#��
+��R��8[s�ҽ��Ƀ[�u��E~�����@j��8-Z�%��l�g�Ŀ�1��0�7�����"��+�u�_��Sm��yy"K}��|��Y9�ȣV�,}{�at@6d��@���H�K�䃁�B��ܙE�1P�A&$�
Ҍ��L�N?gڊ{׎_�V�@d���n��t��dT�����b(��s�A���X6�5?N'[�a4߈�G���X��/mYxSCo9�,F/`�[���IA�c@��
���	�{[�M�@�g[�a{wN�iR��+�I21��v`�t�A���\���
�x��NE���Ʊ.p��橑�����O0��a��{#$�p�
I΀a!��������<�H(B;9_t�`LB[O�N�'�hE�-v��YD'����ϕ�3
s%6-�MD�u:M���Cӓ��{ټ$i�m(��]�d(�W�0�șh��$���a(��	v�w�]���#��r��\�+�)��,�1PN��b�����ej�1��/�Ž8�T^�[�Hn&ު.�S��}�CRO�8.�A�όp��<��T���R;��n�q4K�G�[��RT[�.�c�L)$�̴^�bdyz+,�|�\]��MQn�XF/����4�Z���H���\8��{�{��X`��������\6�Y{�������ƌ5�ֆF%��KUJ�I���$�qɛp�)G��yOM%�f���]��i�v��N�h��b�a��Q�l�D�1vBs6�I���g ��Ʒ��t���aW��MU/?_ֶ�Ҿ��'68��4+�8/�#�����V���J��N� ���9���#��; '��(4�D�u��%��m�D���|�`d�"G�~`��R�5ѬH��I��f��9o��~6r�S��LEhs��2��ғ	�6�qGc�.nD](�J�=k�g��!6�&�;�����*d/ԓ״�$r予M�7QI�L��Y
�K��{k���%sN��*1�P��(�|��%_�h���g^��w(�E_
�x\��,`Wh.�S�{v��R�LOP�u�^�E�eߣ2�������G���6�tC�C܄���l��v0A�Ġu6���o�;ʘ�`0#k��"�si~|�hDZ�j��f�N�#�Y^��4�X�#2n�}�m�	0h�^ꈽ̬��<QLVftq����ҋJǁe���q\<��,���\��;�n��G;8��:��k�؈l�oqLB@`�����8��N\D&➵-LJ��6���c�Ί�~J1Mj�ʰ�(9O�,�t�/�R;��d���&K@�%(73�m1�PM��Db�3�9)��'���I��r�CS{�
�^Ѡ�Aػ9�{���k>N{�L9�]��R�kR�b�4���Hf����e)�d6��*Wk��[�h��H��&S���R
)��5}K��Gޟ�D|AгK;p=�N^�4cה��t
;�yf���3(j5ل|��ov��N�d��/�=o� �9:9]4%�^���W&�w����H���>}8�|��6W��2��z|�nS��\����/�l�neJ�e:�<GV��Q:cUmiۏU�����"�Cq��y���M�%�=���|�v�i���6.I����-Ş�F֨x�*;B^��f7�P�&7S�L�נ�
s��c�|�N�)���M�<�X{�S=��m����͎o��F2�"� nM>�|���[�ǃ̽���@1#6D8��+�,�<9!b&�0�M�� �\�$����6��^b���&*��c�x��͒.;��}�HE���75勓��y�qK��b�L�=��=�ॽ�IRʒ��
�;��AY����tا�k֛��>k�v����O�s�c>��Z��6�sޣ�O�cy`"mRn6=�k4,�(���ZI>9�y<2{.�l��&/i��"�J[D!��?�4���`�~�s��}���j���B�D!7�^d	�4T�{��\�;F�a�F&�6VޟƹYL"�Aaa�tה������E��(�o�eV^�6wc�/�,i�V�o�o��y
1�Bm��9����g���#���2�S��Q �|�lUX��%��=y$RL[��!�"����!Q��@T�Ɣ��*����V���t�w>i�-���� f���l�5b�-mV��ёi�
�<�?�=�~V�D��M�8�u��r��:�	\=��pַ{����|h�Y�se����ژ �G�=E4c�Xb��\���C:2Y����^W��<b���1e��#Wfšw��T����p�-�Q�ױ_����#2xHg�5͸oX��gTX��Q,`3:�k�}!Iw[L��Ʀ����^��]{����IRti,��y�|���V R�j������d�%Y��p�gE0L���ɂM�d���CW�bʲ{����}=����lf�c�Z�E1�M�{*N�ܱ��V��J�ϑ^�a����yXr���3t���>��\;��`�f|K������"�|kv}]��nG�RJhGJS�gG�SJg�[�0��Nڰ[f;�7
=]�c��q�&�	`\'�`F0Q���������(O���>;��X��w��kt�Y(�>mX^È���ӹ���[)��G�1�W�dn���~�|�Ke��#(l�E,zOv���Ҵ�!�F.O �i	�mj�ܶ�
|�1�2[��J��"#���y9�d?f��P/8���s�x�}K|��$�v���������7���o40��P���4�ᇆ��WF!�!�Q �l�J�ڤ�5�t����s�� QwJDJ���S����HvW�F�{a��"�L��|��">Y�nQ��H����*h�)l�/��t�->dd#�HP�Dr_Iၟ�wM
/߄L��@������c�C�z��_�dSܣ$D����$�C�>>zϏ#`�52�c;ɡ��Иߵ��Qs�̔�V�1�t]�u�/�c�4�����Hah���k��%�%Ӆu�wQt�tWΒ7�SV�So(Pz��c��Ӑ8�SZ5��Xlr���'�D�2��@��s�,��t1;�Z9T׻���0;�Ej��=����)����ߥz_4'��x3���:Z/lJy��n����jH��8�w��(�d�|j�rޔ�T�� cOQ�����:�v�6��8@
��]�@�۰§YZL1l�X2��IϺ�#)��:�����6�y 8��a�PCԊ]$!@j�
��[J괐,aNQ��8�nc1��é�j��0Eطj��Я�V�;qD�
B��38\�f�N&l�����M�<(E��]x�C�t*�u�l볏>B�]=�*�+���҃������?�0]�ʣ��J4���$#���d�����=��Ca9J��j(�E��@]���W��������4�j����y�jn��;5Ƕ��J���E8i���N�f��|�	SVAF�j�[����]-�\l%����eMv܆���hq�@ݬ��U�ɮJ4�pg50��{�v�.fe�N;�.�m��l�*�9���{�ͽTU	�MtA�=Y��E-���$B�B%��v0�^�Y�A�;�TŽ���}m�?F���lJZ�W�)��^���T�)��`���K0{1�l/m��sŽ�)�/����@&�
� �Y�����I
e'��B����DA��$}pFc|�IeɆ��&zY�����Ӂ����TJ�K���gI�)I~YMYڍbf���h�K���6s�KBq�:l~{���\-��c�Ï�c���F��"bhFJ�.+�;������%�&�!��
M��k"�$�#�sEw4�E3�O�
����5�}��>��2�	r6H!��A�;�ٱ����d���!O�J�b��K��an��:�s���+���͝�FO'e>���a��H�h/>�c	Oؙ/S#���3��lF!��T
��l����<�g�~�5�B���'�=�Ɏ&}��FN���o�[.���v&��K�X<��}n0$�[q�s�Y[�u5/�֋c�[+fE��̜�I(۔Ѐ�m�k���;$.]���t��u�:B/�7�S�s�c�X
�hb&V��5Gؔ��
����6W�7K�:l�.� ��Q�g���Ft��M��yp��D������q�K��������b@F1�'6�4�>׷d'.;��X��fM���|�ʡ{6���f�̍]�r	�A`��gn=�U�����S�9�	�Mj��9\nN��7{l6��(���9�c�?�gi�9��#䡐�-彊��b�"�.�Q�c<]_ֽ���6�~�M�O���x�<�rB�*�+_�0��;�� ��\�5~Nx�;R���E�Ք\�Q��V-{<�P
vOD�M�ݗ}{��>�KOu�<H�.�����𻢟��T�b�S�_4���Z��!���o���~��;iC��
����IC�(ES��`�S��ؽѦ�6�X3�|!q?�-m2,�!7N�5{P�)������&Q���#��D�ԟ"i��M�d�W���-���I�a����jxt�c�<|���}PL��1�a�&J����I�d,���ْ��z`B���xi�qN#��MO/�KX��R<:�
�##��؍u��ex��0y����/�D�2&}
8��3/��J��]�D�׈R׭��u��*�k��f&�r�I_�4����Q-a�Mz�ov�ʆ�4r�EP
ٰ_b��U�_&�-&BZ�[sؠar�b}��U�v���g21��$:��9q��F�?)�*Z�cA��h�[�6�U�����hn⩉L8���ejȱ��
���D��8��(��*�Rl�̟1����P��5V�r/=i�)ޝ6I16�CΒ�
�iq��H�d���0]P-��k8�2|o)B_��� XN�/���ڙREC۲&����#��ʪw�d�47Q�^�z��X9�؞��QO.z���H�d�ݚ���pA]\��$�W��*�o���B�$����d����v�a�t��y)���8�:)����Yӷ
�b�
�qa*c$�K��Q��>:��6���#�k{e4�%���莒�@>��d�{(7�Z]o�T�/��p3�&�(�X����"�HA?SB�����7#�F�gBY�N���7��=a������0J7q�!��[+mo�<����W)��
҅i � ��fc�^C:�+
�E���f�zML��a��L�N���X6�ח�@
,z-zQ�N'���|N0x��H���Z���?a&t�u��@����FZ�䎩�l;��s�o/��K�f8
�g{�_ʿ�����nQ���q���y�B�b?i����
ݧ��
��6*�c�!՛�0�z��_��
�5�!.o��6Ǩ[F�g�;Tw�GJ��Z��l�
,��P�i�n0���c�(^�k�D���k�L>�k�IBao��8�<;�Q����~���� ���j[#B�8&V�ͱ��	���i��2�m�u�@Y�i��)�q�aN�)��.u��%t�@߈�o�bP�{��`-j���M.���)��-N�1�"��c<�5}����,����\�8=<x��8����̔��w�x���s�wr�������JA9~�s�;���%#�^��<OiU��.�)�|��YD�B�c���l9ȵNj�n|~fs����"�[z2���[#��e•���h�@����,�0�j}��uZ�ݬ�70r�Xj
��qbV�K��t9�j��m�&GaH����G2�2���Ϛ��fe�ϭG���t)�6y����Ϡ�	�7	�#�#aݲ\�Q�Y��W��ͷ߿���?�^��o��~��˯���Wr��o��=�Ud �y��M�,y}��x�2�,6�Rv3��*Eg���N�k��Cp�[�c�i�Vw����E�	N�6KҦ��De��3���9,zV�;����S ��S>��{��ܲnFY3�>Od�3i��(.�`Q��;��.�Ej���	Scb �c١�*�U����rJ
&*�]�ì���#QꗿT�����F1�H�}�M�QLee�_��H�B0g��4E5-d.o�'���ܴ��b��U1�,�.����&ԥ�@,#���
�h[g$)�ⶬ��2��E�Ѥ�֙���	rMTь�-05$5��ݑd<��k�hEo�l�����K:�B�b��r��}	�`l�h�ì��~��1��)Ш��?N͆pՍ���'>�
�u��{*Э��9�ɿa���ʻ���@�˰e�{^�����/>%��8Ձ̠+�9��2![�%���xI�,�6�U�B���5B��CeF���
�,Oui����H]T�H3�X'^�����O��R������k����:e��ͤ�g��A\�.\ݺɁm�.��</�P�V�T�R�+Ѿ����nEx��es��ч�K�E2\$=�	D��.��r%E�it:��i�Q�ܱ=�P$���DIR��E�ަ�cR�PЙJLi�f�549�"�±�;[��E�j�{T�
�};�����V�H�	?����=�8Q[�WV��L��]��l��*C6!q�s�Y,YE�F�XZM{2L��k
-���7��y���;͗w�dk����i�����dRA")�Q�8��5 7����[ME�-K�U1!��ז�H�=5r���^�_�r�Բ��\���[���_k���|�ƀL�9�?l�>�C[�|�1
	�R}�}�2�!+>۰�Qf&^|#��9H�o��_{Ř��q����R��.w�%�[���1?�[��1�ɘ�F>�v ����2Y8
W\٠��Y�2wə�X��
p�z=����W�<�9;!=x����cw	V�&�?�����P0��� v�M����~�����yߘ���E��lَ,�Jl���Y����!�,Dy��M�CŊ�)oF&�*+8v0�����+,2̇�c����������>�}1�B�B\Q?'��c�d��ɜd�+n3�����F��A�Iž�/O_��?���$_?u�	��>{��a����;�����~OZ�2��~��т�6E�-�*��;�4��_�'�˫�7������3}�2g�Z�V��,Z�Gl�'X�
'K�g73��li�cS�(����ߍ��~YZ� ��=��Bf��"RiGq������������tmM("
�Ƌ3벜��&�f�<���G��o�����~�qgw�>�G���Hŝ����MoYЃQS�
(���Js�:n��dM�/�P��G���A{�S���qh��Jl�ILmbf�3�Z�@�����Ir��h�����&�A�iT#�w����U���O�~�#`%���>��+-��na!�P!�����Ǚ����dع���0XŒr�iɓ�c@b�
��i��*���oEN��?v�
��&_�����K~�.�֪
u�Cu������?M��5�^��k�T&�+�p]��w���N��X]��aȯUSd�(�ȑ4���Pp���**�Y��W��a��Ɲ���Լt�!�#-�m�J�v��և�੪�J">�����-(I�{�Z3�PS7�Q2%�2�S�X\VfڔS"m�I����A�gEq��TF
b�8�?��R6
�"C�4��V3h۰�V�ASd
��<���m��%s�����,�pؚ?(*'�L|k$pO��@����C9��yX��?�S��k�,%
=Ͷ�"Rsp;�Q���u~#��L�!l�Ƞ�ٗ������Yo~d�c��e�_j���B��{1a������q���Q��BW����HDM�2�y,0�h���^J�Ċ�ɜ":S��JS���D_���K�E��
E{�0z�0!�����5��:��;�J|
w����cv
7���a8͡�mH�є�`.���C�e58�r�}lYa�p&�ў�[Is�uM��`����O����7�TZJ�f\�gV�b��a0̙�n�k���i��o9�:��_We�d��rn�|��P;(;K�:AK^c��zSX�L�@�=f���H[[2�^�
�S�pߠy�-u8t9��3��8a���y���kϘj��pc"��<Ş^uیNz��M�ШG�-u4���4z�z*M���mH����LH�j/��N�9CK4�.��ӱ�X$���c���b���.�y$OI�&륰�Dt�E�?����Y��ȁ�}$AEкa�!���&�����Nm�99,�5��ћXH@
�b�fސ�Z �G��@iq3v������л%��Nwucl���&��C��.�\����Uc������s�����
AS����}�di�^G���h֠2����\�n��yZg��,F�Rd0\�ihrBVXo_����iI�w(�3Uؤ�et��9�ND�̶i23��l�@'�#,pG�X"!>�q0��o3�?a�x~�h�8a�С@��~=�G��KZsy��|�PY�gO��lFg�e��f3>�/�:b	.6��B���2[éT��:�M����%��MV��㜱�=u6�w��X��@�p#;8g@�	#Z̳�p���a0����+��ͽ��(Q�f^L�$�c;Jm�S�f�4=��,Й���4�ڭ״k��lBd��,����f,�V�����䙳�2���vł�vZ]���Η�A��(�FV�#nhW��v)b�L#!��R���W�k	��I�-�G�*6��搎ی�?,Z�Ć��ybpPz#���B���\���fߣ!�Ƙ4�������K�XR??\�Xl���w��rx�jS|��{�Z{�S�uZ���G̶4�B7��9��?i,:�_p�둜��g��J�"
9��m���L�����M�8H������7��/Qv����ky�ߤwS��֑h��2W�X�½)�f�c,�Q�`��`�)L��X�5�D�q-��ٟ渾�5K�����̺
��uC�&�G���3k�,o45Ǿd%�6�~g���##@���Y�����iJ������)���3w�,{�z*6F�^A�``�G��v���Ȕ��Ȭ��)�S<��|���
����A�i����@	�j����&o|�G>p"��iƙ�ﯶ��1fԇ���46��+
��MB|a�h8_c��v��z��G��4n�f*��J|o��~�[����F;�Ђg��<�A5-JO�1p�!�V�ؙ�3'�Ğ��-#�����M؇�٩q�g���f��<�ʋ��M�\bY��ha��x��\�k�yOe�R���Z�ulWR͉
\�C4 ��u�7�kU�KsGmŲ�O����Y�#q..V�~0��0��@�w�ۘ)�[�C��ǒ~�%��C�|�ym·�G�K���Pa�v�ۊ�r,�0�O�tm�m�����m㈡��
E���8R��Nhz�@z0K��xei-k�V���Gr8�쮬�5P"����9��Q�M���I�=��HqBd��y;�%�Gi.�t&��#	���qo�>W3o���aH���Z��qm�Ow��0{�*-F���IC��=��z�g�({?���2��j��`{��h���G��ɐ-��L�����$p�q�}�����=x	:x'&V^����>��q�!�H<��V�����_g\�T���Pe���:Z�����=�s�k�=[����í�)����9��!�Y��F�֓��ΕíL�+&vΠ4oT�>W���h�<�����J���B�8���J������V��j:�)J���7=J�-]��/�
��j��d�tM�#���<"��vQ?�c[Q��=cãI626��h���|�!	z����R7����5�����He��`���?�),�8�D*�s�{ag8����nn�X�CS��q%=��ڥ;c9��"H,t"�$�Iw�+��#֌��eRn�i�P>8�?S~C�b��O&��gd�D)vKI�s c�$	ي҆�RcM�,h��XÜ��қʝ��
]�13%.֟W�j����On)Ք�YZ�`���|5L#�9R��.rM��0\Ŕ�#��n‰�]lcʹ�&��� ��WT��Lv^�!I����)ziQ;�e�$�@��$��$��T�ٚ��p�؎�+YI G�������r”z:1�!Bez�-X�`�zz���M̟z��M������
Eg˾
�rg��`�jGc���J��赞A^��Hj�B�6��f{J"Ę��骨�I�����.�+�&�\��A��`�n�_7 B�qg��*d�pQ�޹���@f(V�ү�c�}��l�A�5����ݼ���H�㙇�7P���E�ki/���?��p��4�J�D�Ŵ�|�V�D4��O]���"�"��g*���(�Nud�!G2�5rS��!1�8J�dW那�@S�su@"b���L{�Ʀ*�8�w�PRi �.�(��ع"9#���i�fc]�vB�:�_�����
��B5o����s�R�o�D�&�h5�5��J��W�9����B8|W�{0p�h
$9\����Q�,�DO�{`������Ll)A�^~غ�
a"�[�v��o2C��-v�}�5�:�٣��+ �H�O�C�3��J$MmϷf����Eү`�ӒB�1���%�W�ld�0�3�la�%G<
�%��ס;��[꫇��
n�'�a7���sI[b�/ѭBڷ�~�ݸ����xXTt�W�1���g��EJ�&�t>��d箩݉%?4˿޼�B@7�"��AE ��Y2t����%
vЙD4�h:���>N/4���ɢ�P|Qz=H?3�\�	86���=�=D�N����ȷ�	[Set�L��dF7�:�5؏{&H�[e�l���
ĝW�#��渱�V�5�O�L��Ԯ7-��
��H��C���%*xk���JEg~��!��J
��#ԍ}}v�0������nP�o�6G�B"�lzi��?���[�t�c�s�~�˖wHX&5��d�r��%�\�n����n�Ǔl�p;͙Ջf��z�{��Ћ��}wc�-;o�5s���q'��scL��ooP4<���֮������Am�i�dY�U�{h�}�T&�x9¿AB�=�	��{qI+?b'���|���.���+�$��
���a`����a�q�XlH���yb֏��,���̍ku2�����a��(j�o&�ᄋ2��l��l���w�-t�.��j��
������(����z�W9X�x��~����a�]�,��/|���]�򈾍�:5_�o���@�b��#̕��dG?+ew��%�5D�_PK��mW�ʀ�8�?,setuptools/_vendor/more_itertools/recipes.py�;ks�6��+pN]�Rh�$�d7�x�晚ڭ�V&�w{.����5Ej	ʖ��_?�"E{��|��DA��ot7Z��矶��iU!�M����NaT�����u����K#�:�oU�J|==;{S�b��h���Wտ�ԫF6G�j�n�����z��J��).�z���V�{#W���Q���aĝ|��
���BFөH�mwW/^ ������u�yaw|�q�޵���������&�@���Ɯ=y]�ʒi'�{�oI�]r&�_~'u���z���͸�}�گǼT�u�����ڔ:�/�S��7�l�r���3��ݲ���20m�Ȩw��m�0���
ė����Q�0r���<;[.eY.��Z��>���n�(]���?ub*�y�Fֺ1�m�~κ�m�*�H���="S�ꐫ�Q��lˈ�nx'���T��>��Q��iug}���<;CU�G�G���=3{cD��0�U��Ie���{����7]��f��P����i�j�V�Y���W�z��� ;���i�����Y��d�I��H����;�Y���J]L�	Nٚ�	�|!���L�+�ׯ_3��T�~&��x�_��R1O��W|"�
����
ϲ���Ug�T�2[D���⫊!<�3����x������-8	;W��q�E�8���]�׳1�X��k�w5��%�f�Hh�8�Xh�V��Ep�ө�x��&�����
rq�!C[!s�Eر^V��&��Ё0���p`�U�
�ߺ�p�ht�kIH���M�'�D�BxyC����صi8��z*�Y�'r2`� �kQ���p%b2��,�:�W���r|*���_	��T�$�φe�9+yz+� }]>k7�2/eߖ&���0'�`��ћ������h�_�f��|3�0�I����05�EB�]��[y(Uu�ٞ��t��/�*��7,�g�:9�U;3%�Hs����Z���
э*�����5�G�wT�u�~�}kI��\<�r�`��A�y�����]]�K�
`�z�"�%�4uUx�vA�	F'�=%/�ԞA�l���G�Trk��nj���J����Y��|*.�_�rx��~i��L$�� +s�8G'�
i�>j`��-t��<��C�~�±U��~���}"cb_�w��t�x�R��${u�n�u�c�+A�h,�}�1,�˞"N����4g�߈�0*��i�aF�y���e�.�kQ�͡��������"'\�fK�E5���M{gca�6�d<�W̘=�4�}�CGs��P���M>Qڀ�6��ʯe�GG,�<eS"�&��38uQ�A��5�,!�@�t��yD����6�Gq���e|q���9���h����H �=%�R�'�'�u4f�/�g���X_ڬ
OR��B��X�b�l&�5��ok�
�SW�ԏԡK��j�@�	O6)m3�\P��F	�㇋�#�A_\� [;9s�w�#�ku���X�
�C��V��K��
"c7g�n�ŠX�&�v8�]�2 �XI
�DAx�me�
�).��ن��A�Ϋ4l��i�˺ǟ6bdzޗ�>��*w��d�c�쫽.�plW觮2�A�]��鳂س4��8�Ϧ���;�.gC	Yr�f��R�4�8�����3�s�R��`L�@ޜK����[t.Вc�����p�E�M1o_:$K^��l=(G�W��;yP9�>Ô�Ta�:�����F�y����h�AO��YE9�=��1!�ns[H��?����ٰ��GUC	���RZW)C�ZƩ%�_�Sz���ԛ����*���byH���N���QY��y1�&B����=�eW�)�HY%��6'�F�{�.�&x����F!�c2��.��R�%{�'��>�K�	>^��2pm�r�ޒ��`w��.�+!*Z9�qe+p]�E����"�0)ЫS�G�h�u�k��
����޳�R�'��z��'Jq���.CāR��~��4V����%����[�ūo?���_�Jp�Hj�/{
bF�$lt6�J���iE��4��w
KW�{�@�d�x�B�Zpސ����@��P����Q�l�~�'���I���M��_t
����ز�J��j��r:�с,W�Z�&���Ԙ��և���ۼ�I�C1�W�Q�r1/��*ma���%�y�6G��p��m�U9������
>4M�00��ZD�)̧��������ͦ�%(/����1�5��܍��`����w\��l%�8k}P��p�}uo0X�u~���Q�^�ޒ��F^sFo���F�2�����_hW�^wjs��
L���j�Jwk1�/I�c ��Ppխ��`�L����*��彂�4�4�?��dT�9D|f}e/uC$/�[1���..� ��+w��v�I�I�w�%���T����_�Zq��R�#�a)x(:�vCɢhXjG�9��
�|�j�\p���/�r0eL���a��xP����q'�:A�z���i�3]���3] #��B#��������~�R�"Y���B�0���
?���1j���������6l��*���愀���@rb�a�/��w�b��[������1� ,A�u_/C�2Hκ�NU����u�m�E�&N�i0u��|�^,����\����x�	���}-I�O�Z=S֚�l
66�ڂݘf⁂؎�5��Y ����	���Y�Eѫ��X���1#7�-��	;WKw���α�7��{j��8�*�N0���;�� %��7������vbA�ąA�3]�.d8�7���@��+��8t�F�f�3�X���x���#>��QoQ�,�7�k|r*�(���4z-��B�3�p���!$��0e�.�-��.l���Đᐳ��5���ߜ�5B�q���N�&z��ѧ;o ����P��ٯ`��]���!߸3>V�49��(3�=�6�t1��"W>�[d��p6�%�~�QըWy)���p	���{��1�C�*9#�Þn�s-<��R�ڢڻ~�D�ƪ�C��Q�j��)�>����'Z��]�=�}���s��b�Y�/}�-z�mݐ�u���� ֛Ɉc�q��CG48������v��ް�6�jy3��eg%}\C�u���h�����e^E�@kT�@u��8);%��Fo��۷o߽{O�3yS�6��Z�c:�6�%�5��6�BÕ)�����N�;�+$�?�+ǂ�J���9��Ew{e
�j��짤���8c��AZ��l���l<ː�,k�J�����zO�&d{��f^6;��PC�']Lc��n�8lI�
���z��Yل%�Rԏ'7��xd��+r|-n���4�k�a� �.�_�]5&��Gi��ӐY�VC�}L���?ʊx�S����~FN7��d�
6�EU4e*>�ȳ��y� �&���/KSҌd<�5��E�A�h�-%�s�i�Jq�L:�3-�.��ؘ���K�����R�(�2��B��W&v�o�n��Y,��]�%�4o�(O��'�9��oe�_�;J��93��c��w�`ש����K|����(rS�
�_��Z��	۫z�{�
xKlM�ۯ�|���}���]9����s�&��:�ӽ�H��C.�J�eK~�Nʻ���ڵ(*�:�Bd��+"E#u��w�30C�V�Zr�ǚ�Z�mz\�/�p���GoC�8Sa�R%��a�X��!q���e���@��oEY׻��R�ŀ��9ZNw�.��B�n�w1�r�1j0,�}#o�5,[k�IQ���XC��lԞ#Q�����m��
��z ����M�&�pS՝iXS�cN�'v��@��xf���~��3x�ۓe(�=yG�g�u�eP\2x��|�+ 8�����j3�}�'>݅��X8�WpNZ0�]�Ʉ�3�ί�A����딲uB�b���N�����m$W��5���F����=sՓ�r[��iAC]��`E�����oi�˳���U95��"�׉(:TX�-�%/�G�p��8��B@��:�]���KN�p�lg?�i�<����q2��&l�Y�rfG	x:���G����E�z�}3-�v�
n�XH���������@ꤙ{�p�'}��]�ܔ�5��gƽ�t0��|��
}�������78����d��E�a�c��ۗ�B�%q,�P���q�ڜ���V�n=�G�y�_#v*M������'�xk'4�g$� ���w�I�4�[eR�2�E)H���Џ���Jl(l�w��o�-_`P��p���/B��2���#֏�Sh�������W�F�U��"�zİ�i�y��=M3V��Y�;�o��b�ߤ"��.Ÿ�ԲwZ��2.�$OZ����z��NО�/|���X�P�l��rCũ{�:�7��AlJv��n�����Tמ��\s�0��C7 }lKr��B���=�c�zj�gn�:=ܨ���ʲ�a4M)H����b�Y�6���#�Q:ә���K
�"d9�[h������#�_��oS�H񃘍i���7>���"P�ȅ��Ģ�V#S�}!�bzv�~O��!��$�
_�x�B�3�шxE�
}���Oc��5L9�!���%f�B�9_T�ɩ?���6�^�T�q�"J]xmؼWޡ��;F�1�q�E���2�s�Q����w��������	����bB�')�
з��XV�cN4��h6�b�x4�J�?.���O!�g����X������,c��~*��໬�nE+������x���~���d�u�(QGO�vNx����b}~�,��>�u{?@��K�4`�SGL�䮿��+��w����_�V]EI�K���@0��m�1��Hc;Ƌ��*��Nt���1�ᓂ�'�uޢ}suua�tnξa�3����;����|��zfi;��^ę5�q�bEp�}�^4��̈�v1p�PK��mWZ�k���)setuptools/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PK��mWeD2(setuptools/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PK��mWJzBh'setuptools/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PK��mW�]�מ�+setuptools/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PK��mW���n_'setuptools/_vendor/packaging/_typing.pyuT]��H|�_�h����#�@a_��ǣ�5��Q�Î�}�gl���,�4]]]U=UU}t�zֱ�vC���'
QGk(����=
�<�~���w�0�iE���I&��v6Pt��S
�c���}��S����.�5��;�g��L�ԛh�l�W���n�J�y�g
�Oܳ�m;.�;\\jk:���|�t$�0]'<k!U�`����
�h�l$mb ��n�?k�����<��*�vg�
k�汧�	И|ȥ8�hΙ��y}hE+�r�����
�W��؀����5=6),1��j>h(nt����&��N�<(�V���'��A�\���Tt�b�����E����
���U��%�;z׉,bП�IRV�ubj�\9(���"�=� L}##�$����^���᭓�V�>P�Q)1�{��ʜNI��l
�G��{�+����%�i�Zd-���MC
#���.B���ɺ,E�뒬��zn�$�H��[X3)ɪ����*E�˂>��nn���?�����o�J�=Οn��;Լ~��|�R������&ְi3�m$B�y��ߪ�*�v;����;������Tb��RH)�� �=DAZj>BRY�i�����$C@;$���іl�i�<����-��קNo���T/(0W��<��~W�e�R���HaD2~�؟	���m+���:�ya�'��X�~v!�ۮj�k���-��X��en�!�U�x�o����'�����6���~�O�.�n+���g�5̫rh�y*�op���.�M�d��{ь��U�&�o闬��^�E���W�m���n��--�Bx�˹�V�PK��mW�d��{%%'setuptools/_vendor/packaging/markers.py�ks۸�~"09V8Nڛ��D�Qr���۵O[���%HbB<���:�o�.^(�IsW}�H`_X,���u&�2���EMs�gsVH� u�`�TkF*&6��z�t?�l@n��/z�er< �X(�7W?[��\1�OO�Nή&�a��畦
Vr�U\l�ޒ2�2g#V�,�Io)���鲮j�Ҕd�����[��b�~�Ev��`R�����W(h�`�	
�ܻ�OeN+`���r+{��dU]V�� �3��H�mIA��
r�l�y��JqW�L�y%DV �ꪢ(�~��o&�/&��x�(�W��r@~�➊ŀ���[\)��L�4�q�u*�)!��S��$E��ʂji�j[2i!��#v�ϋI��o������j@d���2#�PWvd@N�;�g7{��Q�R�ՆA8��;#�Q�C��b; oi����s6%�f���n�|@��'���ҹ12r��)�Vm�l@nA��^���07"S��7⿣���|�f�l��'2ɋ��Iq�	^lXQ��
��!!��`4)k�a
��TJp�nh^��\�C����q'MA��%���K�{@j�#׼�p��x�9��\��J˲cm��X5P��M��mJ�U��!8�`i�dq�V�jC��	ZJ|BR�|�5,��
k0����`0 ���<E�ۆ]���E��#�W�9	^*+�*M#���@/�L��͗
Iv�篁J��,�$Z7#����e�]5q3<�(p(j��>A��C����1zx�L<Ư�	zMZii�t�����'@���J���4��U�`t�-s��wr։9��{����=��?��aT�?�u��:/�?+�_��ߜN��"w�3�Tud�;����6@��ZH��C�h��4����rF%�{
o�
���9���:�� ��E�ǹ�Y��O��/�! �4�:A�t��x̭�i�=[Ս�����y	�يη
	H8m�C8�Ž���jr��]�U֐8U��(jH�00;��]�h�Zu��v�
ۭ���n�Gw0бJ!�*{�r��]P�$�2հqtF�ɊUQ5=���c�7�˫�������F#ؠ/��>�vO���3��΁���w���&��9r�)��Ya1�����87����7�*��a�0���L��ݛ��S���+>}_�K\���_���A�\O����#�4j;jP/c�kBW��:�O/Ɨ�3-tԏL��2�{��TNY~�\�zLM99���9_�rC'�"qD4�8 ����y�Ld��qrk�p����Q���f有9K��a;����4��IUL�"
K�)$e��
��UaB�ue!+Z̙��y^06!w�)R�7�R��<X.�
aרӄT��@e-d5�.�l-T�E�5��bV1 I��l�cK���{\��A*�0/o`G���*]]�����߰*�@�}�Ț�1���c)O��#�)�2#��l�ƞ@%l@�&���_3��
>`d&7�s(	�/NՒ���F �{Z@��)+����dӊ��"�����<,Q�`���g�•	�������md��P��`�$g����hD^�;���ukj�&�i0�4zf�אʊ�a���Y����j�ޠU��4��!�I�'��#ϊH�i����#D}8�-4���u�J+jGC��t�4��jf�3�!�W`�K�Iv2���{�k�b-����?h0,���Y�@ZfI^��Q0���(f���g�pa�_�+7�����`�E�NlWef������R����r ��R ��6�Ʀ������9^�[�x�̑`�'��sj����o-�L�r4�'\�98�	���p���r���wm�c�"�I��R�������D��G���r�6^�S��sT���昙���4Q��}	�Ju`���b���@3�Ί�^�@5g�vИ��I�l5k�"~SՎ���S�����l��m(޻�T�#zv�J�A��a��nw�>���5
1ㅥ�o�eݶf]23 ������}�t
�ء+l����?� uo�yI�h�$
�۳'45BO���%�,Y����(T�j�-b��c�(�}���B��Z��!�Z��>*a[wmd�!@��6Ӽ�M�[4ш�-{bAj�Q�~��
�Ƙs���l@�.���o� �����k�d�Yx�h��h�G�Y�T]嘅��~�$C~��%߉n[�X�T>MO���u$����Ƨ�pOs���Pꧬ@���i����ֻ��g@��==X�G#�.�m����>��+���h����X��T�
��[8�v���h��@xӃi��c�A_^08fj��7���"-�~�{�6�r��2��*�H��nk�o4W�m_�V
y����G�QuA�j��{��ܾ��Y�t�4>�Ne	]������W�
h�eG[k�]Jj��Jx��x��WX�g���;�2؋Ӵ�P�!��
Con��7$�^$����nx�/���H7t��v�2��h�{(aG��Ӿ.��]�.)�6jb�=����O�/g>��K;$~WC=�L��[~���T��6'n͂2?�*�D�^]��NJԘ��^(��Cx����ń��9<+'���Pg��� 8*�;*MwN}'D���,����="?�1/Lt�^��?~��j��s���Jo��b�-�M��xi���וbatje�ʮ����O�ى��s.�����B�;�f�&n������֑��)����E���$��*V�/����!Q!��a��R���,��v�������Zȼ�M(,�3)_M�����΄�O�[R`���=���\��i}o�`w���f]���PK��mWiS�05,setuptools/_vendor/packaging/requirements.py�Wms�6��_��B��s���續̤���$9mN�r`��R$�v|m��=H���^�/"���.��d��
�M3F�T4#Y�a�`	��q"���)��%,�#��#i�;��U��<�lo�
O@����pMQ�0�g�(������He����-8��2c���I�f"p��ؓ8�V��,�I�/.	�EVI��I��T�#%Os	�|#��N-!$�w�g��LV�,
�b�q�<(�K�;�;bI.$Uz�K�'=R�t��4[B�m�{d9}ްRk�Z��0^L���p�O�TЬG�l�>�Ƞ�ߧ9�j�Q�sD�
2"���o�W<���O�1Ņc�\{%��s�[~�E���h�~8yW��)��а���hG?��=2ִ�Q�l�n�����yќ�ȹ������W�)9��i�B�<B�O벭��&�B�a�H�4��ߪ��=˥��f�8/������0G�jv$J�O��mQ��WB]G<U�x��t
2�f�W�-�ㄣُ��nL�ul=�?�4���R�\�i$�()|�������b#�]�~ ���L�w�qmG�pM�;��|�4��ǡ��l�"�Ѵ��Φ��?����n2Xޅˡ��7w_Ɓ�;��h���\�܂�z��J�� �pP���p]^r�)'���îI8� v xnN�vE?/�Er���'�=�~!�K�\��#e�*���E<.�O�e���!�
`��`_���u����C;j�S��|��H�ׯ�ZK�

b�b$WI������2|7�ΣA���h�[��2�j�o:Q�>2�b�k����c'����Hg��a�{�S��]J��c����P��oi���Ŝ>Ū#��q#��Ehn��yu�q��>�q�.�?�
Т�0��2��O(=��.�D��"��ն
���=ڦ���R�z���N�>��C�|(3��:�cE:\�����
7n� 0I��B{��f�
�.�ʸ��D�p]v�����6n�,w*�0�z�T����=�6�G��Σ1�xu_9)_U���!s���:+ N^�lN����Ķ�M��[�Vׄ<�)F���k�(��I%at�x��Cƀ�
Q1r���u��@/��<��j�����)[�by��3�st'k�hbC٥�,�&��-l��>���$��Am/���]"4�n�S�02��`�R��zO��%��=�ƾ���a������N�d@s�;�v��5�Ý{<�`Kɱ��}Jա}����[���I��DD>PyCn�k΀/hetT!�b+'�X�-4��k3�'��P>�=���p��Ee`����s�Fe������K¶X�U�ű'X��u�_�	a�`oc}��#����L
�
U����K��?��3�Zi�w�=]y�iP�rnc�����Y��HG��_}ÿ�}�//�L�T}�#;W,Ȋ
���$߮{xދ�	���o��v�#s�4�ǖ�eZ�a}���ݗ�8�T�%4^-c��A,�FT:���>������"W��>`�����ߨ����غy���,���ީ�*�;�9�p����i��y�#�A��tz���R��ۤR�~:�&|5�!��٪3}nz��@�(��'�c����:Y�}�m�jzw>�4`K<2���A�R+�ߴ2mr�ˠt�&s���n������BY��W�^;ݒ��l$<S�X^�0��8a��2�	|������*h��:`�g3�C:W�;���O����̵!�{ƌs���w����8v�c�wj����+�uNwm���1��a�PK��mW��)��|*setuptools/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PK��mW��'^$setuptools/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PK��mWJ�f`�%setuptools/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PK��mWPz��n<'setuptools/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PK��mWR/��setuptools/command/__init__.pyu�1� Ew���B"E�R�н�"Z E�0r�'c��?�WJh�O���R2���
Նpo<*��
3�V>�SM�-��/�}~Ew9~�G%����mkoʨ;��
�_kS��v�`]<����PK��mW=��/M	setuptools/command/alias.py�UKo�0��Wp
�hb��9��0`�40[N�ْ'�]���}�ö���|P"��H~��Z�*�t�Y�r*��
X�	��~8��i&�g#��ژ(��N�6�h[«�D�[Z1]���l�a�QtYC�(�h
����D�U��q��ဧ}K��ZHh��:"�{�Ѷ�Ϲ���ͬ��,�qH�dq��h��s`>V;%t0�Obr��O'mL����'x��
�E+�{̵l�R@FTP2�|Ok�1i�
9,{
�@�R�$~Re�Y+$Ϻ2)[�R2�
k��s(�.�X�3�SH�*�b~�=u�zEe�20���A�Hڊ'��'�.viϱ=2L����la��pvG";_;l2Jx�.�?���fa;�Rc�L3����M�M�1�i��f�#3&�$s.�){����\�
7����t�v��IO������l'~��ђ�G�Ϥ���v�xӱ��IK3�}��s��^����:W�&vd�O	���pl3CJ�]o��T{n���:M�r�!=K\�Xs>:ɸN�O��ᣳ��KJ�w�d��c����:#�Cٹ�wG��	�[�7�@���T��
fxR��Y�=�z�a&���y�~ �6��$$?��.��=����N�Z�)׍���)��չ0����)L�%��?�iK��?s���n�͂�
MWU�H�������W�b��?�����/R���e �%�D/K�"�z��ho�gϩ��
��4�7bG�$���"$˥�.�$��1W��࿆edoGjDy-��8�h�h�{}#l'
�q�|k��`}q��EPK��mW�ut��@setuptools/command/bdist_egg.py�;ks�8r��W�rH�)�}Im*��s9��j�벵Yod��!1#�8$��H��� @��������h� �ж�H�v�ϛ2ݔ�2�ۭV�y�꒥p��a_mC�6"��j۷{z�����X���~`=߷w<z������f�G��N��7O_�%��+u/�B_��7��0�y��y/n�Z�������;>d\a���m�}�^[�Loġ�,�C�%2�g0)����զ���E�U���m��Φ�ȫ�p�6��q��jU�-��
PUW�(>[1��0O��(P�Xᚺlߖ��G۪�M��
�ڲ0
Y�0�B>ǟ~���q���+���ٵF����)�}��r�0�"՗Wg��_�K�/4��^f�y}�f(d ��[$��r�z���65g��1��5%�$ހ�l�v�j`���&�����&`m_�^OB�A<�& ��^$'U�[t��Hv;�=<VTl�Y-��fg�/�H�oº#Q���hGF�jEHK����*�lӶHD�eYd���]�n����m��y��g�6�h�Z�^�0����FD;@��ʴDY��p�'}<A�i4�چ�V��
`���\S|���J�����Dh�]J@�縤�Kl�7�?�T���Vz
�Ɓ�]3�aw�&�VOQ�X�I9IXx�,lk�`J�M��	ӬG�QԹ̸�H/%2%̊��e�`��9����c��@���-h	FЕ�'
i�SЀuo�d�Q��hV��Ĥ�4g���p�����B�k;ŭ#��	��gd������;��VR$X����D�V�����Ĺc�b�"�Pԇ��J^���Y(����ey]��;*�#=%,x���������ux����P��U#��$���fy����[��,`O-�E�PqS�q�gKK��q#���a��5`x�k�k���X�m՝{=,× ��	��=���e�"3p����!�\���QP���WJ]�:t���F��<�P�u��k����2�x�"0�CҤ�oQ�2�@�o�DRhx��}�(V\��9 �W��&�Zzfm����>�p^e��(�;�'
_f*N���dU�m�xN.>p��<Y���LX]	����5z��i��+������m����m�D#
�n�sB�]�:��
ZM����sX,E�ZJ���%��ױ�8K@uy'��k>F��Q`�n8�f���!y4��d�_k��y���d�`iG�|�Q MIz��B-�E.�����f�A�(�#��&#k�B�nIjY�fʠge>�S%;a����;;��w���M�&��EV��`��C�BL��ς*h�8դ�V��,b�k��ހ���H?�SS~��@�m]&���U����]]��!�*�
0ʯKW�@�+Al
ᰄA�q9�9=��z�t6�'�˪D�42�x>z�{74��(7��Y��4����Nw��)0�dη-��O��;��>Y�%kÒ+d��9��Ϯy��z�	�����g��+0�/^��k悰�y�I���Qj����^���O(}�`D�j�����sJ
Ԧ������q-��Y�z��h��Դ>z|Ʋ��ȏ�5NZ���V)��ĊYa�C6K�ei�����{�3�]{��-�LA���o2Ϲ��{��!��	;�E�Jٰ�w/_��C�����˟>��������e��=zD�G
zyS���?��4�Z*�c�
�n��Vd�����k��t\<�3x>���E�hڿ�g��<{�w�Շ��]������7�~<���[���=r�mՋa�0_w�~�H��džÖrf�<xB^�R2��&݀Z	Sw�a�\�l�ɠ�	t��{ն��=]�-�}5�ݥ��2�a�&H)�N�j���l����2�J�A��{�BP�)�
��>����}��Y?�qH�D/|4���Ds��<�G���p�Z$��>G�ur���9�I�#k��k�-��
��&�3�Po3�z�­��/�´;�B<ѾK���I���1��޿.
Ǟ�]�U����Q��.S�t��{l
�v]uט*�`G!:/(�����&��8�K7���8p�6Ə���U}�w�[Ĝ�sp�h��߾=�x�槱6����h�1��
CƜ�8���	'�$�7������t��З�j�XS���DZ�X
����́��-�
ا�<
tM��n�|�Wmw̴̆�ö�
��Q,s#�F���8l�L�R��j��"�X���v¢EtD<ʹ}�R�5��C��*M���P�����Uԭ��$���p���%�Rq���]��ЀTߺl5㔽̷|8f�:߹9ַi�
T��CAL\����i������F��V�ӟ�//?��x���E!=Dkȭ
�VA�6G���,����y1>�Yp'��� ��;��=�>�^������2u�[��ǐɻL�"�`��ΘW{x��v��M�����x�
�횆���lm�\��)��Mv�їG�cQ�����L��?T|�:\xY�h��׎gDxY*� ^���S���h#0i$yV\Q_>}4�<�N�*Wױ����"'v�B_�=��2nHlU�쭞$ã}���ôu3ofY�}�͌=f��M��I0�E��z�2�,@ӌ2��&=}�,�\?�V��5���~��L��c| ���ȋ�eK� ���n=Y4���}�x�\�_ӧ����*�z���5>�C/Y�J��P�D
�f�"e
��n�b�!w���l�t׷`�B�$�����3"�8�*`­"�Mbz�D\�����iF'fa'��Ya���G�,ޱ`�y7��>��}�/��r!�������pKŵ������,Z 
���n��� S;o⨪r
y�@�e(c=�R��>~��S�f3�fi�Z�E!�ùǔ$V~ە?�.����>�J}��W��p�|j��W0x,a��(LF�C70B�x2�e�Y��G��U��:7�����
�+�2���k=�֒=�,�$O��R"'"ẞo����;�@TB���Z�d���FְC�ǜ�@�R�X{��zl��唠��R���qxZ
�4@"�!�n�6=ة*�囉�A��"�a���c��R�W��#7i�I-[:��Z��[�qKKvHδf��*���߿��k_uܦ5�켭��s�u
‹q�x����ϳ�O���>^����ZZ<1\�.�|���(��p�!�<��A��w�o�my�����7�o'�Y�j�V��ӌك�@�A5����O���>K�ࠕ������Z��ǩ���8C�Q��x}"O#�ëLbV�3[n۫��O�B�o�E-�e�?�;��\�(�3W�P|^�V3�f�UVb�[~$�xlSZ��ZJ�żK���Q=:�d�/x�5oء�V�<�
��Y�V]��b':���3p,�٦H�F#�k�4,T�S¦�0�w:��iq�+��r�nEt
��*Vف��?a2X�@'u���Z�����̊/�����XX)�ss�14���F�S)��a�PԒ"o2�y\�&��)"t^�Jۿ�$��aq.ISP��{��z����%̭�	h�}~���Ǔ�x`��n���Þ˸���O1q膊ٺ1��"%�h<v`�̶*r�L�C#���8\�:�	A�7)����b�m|�ci	��酷���y	�$H-���h!�k"걢�=�4�!nZ8�>�[],�6��v���55����Fm4��S���S�/xD�Z����9�6A1�����g�u�զ>b9S�-�9Na�OU��l�&F�|o1�Ϩ�>�x~M҂�̌.���|�")�q���< ��_
y|f�)K�����>���n0~F�REb�N�G��r�L��¢Mؿ��6�]����
�dؿ`3��?�B��VR��?��/_,!%��v�^���(F^F�Q>��k���䏶z��m��qq�o��=
�_}�^F�=��&�S�W���ff��\_;^K�U���q�w�>��?����|�R_��V2z( x� ��sڴ;�B�,eeW�u�
�`ԝ|e=��`���B�^:H1^ǰI#�aSQ��d��j��=�>�	D��-^=��H�̪>������_e��������n��g����_)ؒ_;��D���0�����U)2�y�CY ���w�P��I�8ߧEK�w1���X��r����g+=��t:b��$jz�z�9����
��a�N��H6OC:�Y{��b;��]�����7,�*���zO}���?�?B(4�%��\���{���A4S�b�ܵ!O�
G�k�g�sq+;Y�����9�r��9)X��`<�9GrJO�벍:	I�� ��O��A��\	h!��:C����$��� ���M����t��IgUbĚ���a<Y�Z8.h���l
��έ<�i��ц�k%&N�y7:(�
�{6v��w��X##=]@�&J��D}�E��X����8�@���a
��)�&M�ڍܐ��`�9؟1�Q;NM=�X)R��ы�@�]^�(�� �X�xO����*��q�b)/	�Ζ>Zj�(�� HX��'��4Q�(F�fR�F:,��D����i��_�&�|��y�j�K�_F���(O���:i��@<�s(�s6+|"B�~���Q3p~��*�w`��K�O��(S,$�C��I;��ŝ��A>i�O_�vyj���G��Y�V��P�'.H�UF!�ӝ����̴��X�IE��@�MNAd���o~xyy�	ѣ(@uF}�r��3��؈����Z��'6)k��m0�}x�Lm8�2m.(=��ĺn,�O�[~��^y>�-��PK��mW��ȹ��setuptools/command/bdist_rpm.py��M��0��CJH��=.�P赴l)=�b{�KBqò��#�qj��E�4�gd�[�4ʇyQ����ǴU9ۃ�`��
5��i�;_�3=x�c���c���a-�2�טUEM�{��I��vx(��f���3:��pBh����-�x�ge��A�!2[=YჀǨ��R�5)��n�ԲG�r�}<_$Xg,:�@-��$6"k}�y��Xr���hѳ�e��I�Ŀ��K�He�
�g!\�<��19
�߿�.8u�	�3������#��4��i���sꍓ�?��/�����9��@BC�Y�L���qb?�	��de���$ (�y�Px�A�"ż|wmQb�.q
і��
1�&��Tӻ�ﮝ�'�|cb�xC[��	+o��ZE�Ɯ��Z�n�:�)�¡%Y�]�u������`��~�[^޲��W�����(5l�SO^��s���M5����_-��	Azo��|�g^9�p��?PK��mW!�1? setuptools/command/build_clib.py�XM��6��WL�
���h���@MM��ba���f�"�ڍ�}gHI֗�M���emsf����p�����PJ�/��SUB������J@80V�VGk��%Zk�#���'�����&��2m(ǖ��Ub�g��F�3�}-�}��'k�z�ZJ8Wh)�@Ͷ+�g�^��o��,��ģh�x���I�Ƃ7P�`v4J�g�O�U��}�W��
��)%��>9/��� ��C��D]\�]��*��H��Z*L��vB�O�4 A���`�C?�%T�"<��12��D�R
���F�m�|��qO܁������DG'���8�!ZDe��=�,��iTID�ѯ�B%�(�	�������J[iQ!H�"Q�9.�Q�����DTU{��[ޗ�rR� �"(*�J�}�R�cQ�2PA4#�5�͛[aG��{�"�c+4ҙ�p��q���;>NJ{&h�Tg ��c;�yu���'�iҮ$��^{J�������Ujұ.0m-6�
P�*̲�+�.��>]�jM�H��$`jf:ڲ���w�e�DP5�+Rcmх��e��
�k�'Jtkx
��
nٷc%[�����Lz�	`]�1�|]֛A��+�C<Ra4T���ș�e-���ԘO���Q�t��4�c��'��H�w!��|�ւ�$Dһ��O�`.�n)�Hi6��Dl�C���E���5�'g
Z�n��mi�Z����
}�A�oc�>I�{I�t�x?$���^ޝ�L�+'C��:Z�p"��
�,>!t���N6�6���A��[[��2>��O\*!O�Qh����-�:c�pm��+d��6��ѝEA(�竖/�֝k[Ü}g�.����M��<�6Lo63&+��/k�������,#~�RJ!��DN!�ߖT�F���+Gsۑ:h~c��"X�D��c���"'����v��&�S�
����R�]�o����a��R��snfG������
u��ڂ�^��Ҳ�Z"��ma�0۶�u�TIO��~�
dm�%H�
&��RY����h�<'���{
`>M�l�w�Ϝ�J�,]�q!Y(N]��DN��py����~qa�c,��Mj��nꎟ�jo��.�Y6�u7��l�6�����≗MK<4��3|��n�7��J��uP�H���g�q�"%�,:eN��Z~7��kY�2���P����z����>R��D	�:~y�8�'$��	�G��'�<�#F~���zZ�s���� �����Y�VPK��mW�I�V�3setuptools/command/build_ext.py�ko���~�FƁTB3�Ou��{4\���1���S$å�V����̾���|���ռvfv^��m��5rQ�O�h?�����b�5{�V�r��y�+k��{���wWo޿ˮ~y��ͧWW
�(e��J�y���Hׇ�*2q�T��%ˊCf�$6e%2�hP�=f�:b�ZX�d-�2�6�
�M�)���A�;���(	ۊ>SP�g>"!���i�_���U�v�~��?���6-jY6��z[�;���;^,����}/�m���`/��6M�TY�[f�Ȅ��?��k�R �
+��>dg-DQ�=0�UuLB���~������Mq��+�
v���+٤�ذ�o���/)-g��eq��{���e��>��7G�UJq�ˁ-�؞�
&�`�	��_
����X���o_^��ë��Ճ�Em�x���g�|��
�[7��bQ�~��se`�L��\�fi���^i[�`���-�ݕ�R(mZ�����N�q(;�X#9�l*���է�N�V�G}��+�#�l-�v-Ȫ�Q�3�1�i�%�l�٭z"�X4�m�N+�ޞ�l��-��(XE�_
�Zr��E�z�M1�+a���ӧO�'Q�_0��M�l�?�k�]���n'�m���0o֕�]��i@�g{߈n@�8Ŀ�6���Ur~�΋c�e��9?��8�W��in�ru�ً��Opy�꽂W>B���<���x�/fy�y%�̋�ڂ�"�) QI�蝔b�@3e�n
��kb������]����V��H�M�X<xh|2��X�
p��Z�h�}�@�҇���O�w�%�..��E>�}��{�k�u0��8��D�Ɋ*�:t�"��I����E������<l6�}�Q����������4x��u_���dn~�W��r*�3'����
�R$!�¹���K]��b6E �2�f���XDD�ײ.�;y��b�W�B��b��:PSݡ���6+'5��G
A.s��*,L�� сk*;p���e
n��%�k��^NrI�7��k¾�8N���f���:���K�T(��e}�����N�U�<�@YJZЁ�zẸ�.��ȀE^L7��V��[(��PUt=���U����=���c��A���~X�T�Q��(�BȖ�|K�&��ߛ��5���7��� m�P�O���B:���Ѐ�b�a'��3�gH������W!k�峜I�j'z�p�E����%�T��g84x�ɛ��o���w
��eJ�%-�Tjr�����R�(�8]' v�L���6��-�E��m1��2��*	�,�u#�%iE���j��@��AO��Y-D!)�\��BRw�g�;}��@�H*�$��ѩ@r��}��F��@�D�9��^}����߿�� 
���3�]�����8r+����e)f	z�󡽅�n�7(��`c��l\�X��m(�"�~mo@�0U*�d �E�U��o�hI�'���rc��e>B�����f�c�r���P[P�Xʲ�=�s����Մ�u¬��Ð�`Vwag�d��=�T��LUGq�0�dH�JWۡ��HVe}KiQW�c�p�z(���'hDEu�
7�CѠ��;ή�͚è�k�|���F�9�ϻ� X�^߄?h��_��_'�)!�4舉I����C���o�ڦ�n5 N)�v�^8_��e��~DK�l�r��P$~zAE��A({bY�'*���xK���p�%���}�~�&H86b\ޒTz�����;*��;��U���oK��k(�&��¨Q{
�	�>�����jZ}*�H
�ÐS7���m;�Ȏ�\Y�⸲!�[�D=
�P5��k�WK��я�K��ID�aY���"�m+�3Qtfلf�Ŕ�J��܋�a�S�FK�+�&� Xz�y:\��5���-4��"5�c���>ZRNw��g.F����PP�J�X�.���Iy1f>J<"��P��y�g�h	$b*� (g�X�a1U��y�3�T�8�A(֝�2ARQ;�ݍ���wM@b���o�!R��	�k3�����1[;~}�i,|��Q>>��>J<"2f�Q7�8�S�3vT��o�f���T�h�J<"❍3��NG�n��Yf&�V��������(@(>j2��a^-�Y��=�W�-ҽ�<��M%uO�fjZ=�+�u��1$;�tG]݌Nԡ�������}���Rg��m쇶A���bt��'�9�O!�;}�,!��s<��Iف@��	C��[����)�zS�� h
�B�2��<4,�	k=<�g����wp��9T����1�n������%.
�Ėv�CބRQ� 79�8�4�q�D�y�(�g�e~��dA-�D1���b7ś�[q��5^�{&�	���&����s�E�_ ��z��(�u��>�H�+#�2j̺+�(q�9����ӡ"�InP�8��,��d���3��ޯ+e~��2�K��w�BK:v`]�j�@�%4b�������Y��kU�a��;��Q��ц����[��c8��K�j$m;���>�����P���x5�!jՉ7DL/���%�#s��Lz,n�c�&�r�h���!+I,��8�6��ҋ�*�i���V�K�=��f�黎�H��t���AA�(�=��dАO\8���Q��N��/�	�d_MOFH�A]�7i�-�$��`/#Ű��%8D�����,�:���LQ���\	t�BT��2����lle[�	��WC:�����jC�'�T��n�^�o�[],�/v��jּ
1�J�:}R^�e'���^�t�?��J��^���)�58XQ-W�h�ŀMj>�y�r�F��s��u�i�g��p�qB>�P�����S0]q+{��Fc����:e�"Y=ֹ�
z�
ݐ��)�#��b~W�<<�'��Q�o+�#c��y�!Fې�6�*5$N��[�S��5S\Ͱ�Qr`!��|��-�u-릧�Dw�c!�(R����i:�*_�X{P4�:��)�����K=�jgm�G�
���R=,�(=��A
n·�5�)⩜1��;=�����	U8���m��I�I�ߜ�fW32�b����{1$h�����
�����+�f��=b_�����E��j:���g>ْ��v5�n�^v�٬��V�i���Sy��ՏAWA�̭�15�����V�B��?�㣾��v�����N��p�1A���|뺎g-�9��a�Z��Uy�/;'�! �x��_��3��&Uo��o~��ÿ�U��W:Z�%���u�	U�(��1TEH�i$��u@�Ł�(꽝���;��Za.v��-��sO�9}{'�{��KI�s!�CDl��Cݾ���[o�S7��g$�xW�ט�R��Ag����w�<��}φj}�*=:SJ}��<:M��_�;��q��ק�m|��/��)��,)�`N<�Qm]�.ꛒ�	�5���Fqy�\���^�!�(�m��([F�1�妼�A�����Pl�����K0|v> �AK����c�L$��x����"��9ؒ�x<��H�g�%_�:tMǠ�PK��mW�2-�y	T setuptools/command/build_py.py�Y�o�߿��� ��S�|����Z�A.@|����]�ZQ%��m���HQk;�l����pf�Kq&�A?OBj��ю+=k>���V�����D�i�Ɩ��8���Շ�]3]UDH~�+����6���~�t��\�ę�B\Ba@i�-��y2s5�er��B�&���#���)���nױ���#k�$��0�RSyd�z�#�#@��Ytnt�x�_
L3��M��������C�ہ*E�bJ�JP�#ss�a<ѱe)�\A�R�>Q{l��c�tTS���}�D&�>�#S;C��WPɈ�X�{�?sJ()܎���8����0,��6�>2憬R�$�_��0��IPɤc���,���\T2,%��o�%��E�ȃe�B�����ʝA��{����gf�O��$E�j�Z�Z��#�/��P�bC�l`�ۦ�^�W���ٱ.RP� �ʾ�6/��\j���� �I�Í��Q���4ou�,"ZU��}��!e�i�	fYg����E�r�J��UH���{c�V@x� 
&7*����B^�f�d��N���2��RJ��w1��t����w�e��{�h�_PV/�0v��xC�9�	Ch�g:��*jOf��#�$�1�l�1���Q&#zb�Ӭ�PP��=\4k�qi\�!�5v����ǟ7���XU�vP�eӸ���b��p'ݬ���w�����^f����2�Ҿ��z�n5���H��1V�
��S��83k;��q�nu�o�kВ���ʑk:Ml�J�K�)#�12�Jӹ����� �!4��q�W���#�VB����UU����
����0\�gJ��xPy�S�`az<F\�S���YV	��=N�ސ��sSD�۵l	`�V\Rs��~.�`����A<�Ul+�=�ƴ����cy[�G�f��V�i�,�"oO��ʹ�Bz���DaC�� ��gE���CN�Sb��ᶂ����A�oX`�t��g�g�US/&����Ȏ�-E���@�#Q�h�`V��i�(�?[�_�dڳ��qJ���Ц�a_&�AM�A���}ஊp�8h�����!�榣��1cFG7�}�{���B&�4�c�0k<�2�-�9D{��K�3�,’���o���2���T�G[:�o��=kP��,I��G�oWy���3�T���$8���M��ո8�L��-��1j��*�j��hˆ�
[p���66��ĔՁ�����/���阫����	�o߬_�=(#���P�]{+l����_ii夬�	]��:�u�R��n�k6%���3>�R]�>����g�]�O���}�R}A�Ҹ��,�����b(ƛ����/�g�Y5@9:�4j�&&��u���Z^ˈS+�O�}�}ߋ�����!�>|:!�:S,u�;��~!&�\N��㺓�lX�r޻��	;�>]���V
��*�w@�2]�ʈ�c����������t\�MC��'%��9��b܏΃.��s���Xf���3�	�?��k* �_H?���c�s�nk=��9K���w�aMp<(@1��ߠ�cPPJք����e+6����Xw��,
nA6i�wv������'*��#���5ѫe�l��aR`�ڭc�g��:��B������	���~�-D�`�]�l�R�F���7���S��+����*�b�c�4����t�{R�:"$�)�;6j��A!@�2�PE���#�u��e
aӉ4Te&��k�CTp=�ߓ��u2���H�������=�2��E�[:����W䇁a�&�V�Ĥ��Xb���0C�r�[?3�����H�Vn��&l�i�)�[r�4�f�jbp�48���nzW��|�dF��Z�-M��7�����x��a��h퉷�_�)�U:{�0ӱ��ύ�`���A�jj��S��l�4N\����*u�Q���US�5G)�	�)��Q�@��q,U>	�������]��Wմ��fc��&���j�G�&&����}u�����$P���8�"�<�=Mc��{W�N�-�o�͊�g�O�[u�2����K���3(G=�w�%���r�Y�f[6��C�'`�`��6��Y�;�y+�� =U��)��\E�
m�b��+_�)��OM�-�7�U�U(���B���9d�$���|�mP(9Q����-h
q}�����j�K�ny7/�X5���u�бr)��ށ�8��tx_�Z����$�#ޯ&S��?�#�ڒ⺗�c� ��c���=7�Vr�l�+�L`Y���O�w	��*.H�ckx���V����^�-���(6�;CM�4�(���IK|!�'�#��mʐ��rUx�MQ��vQ��y؆FKPf��PK��mW&��ddsetuptools/command/develop.py�Y[��6~���(
$%�y�A���@oh�����h�YTIj<��9�H�${��<��s��M�Iq$5W�׼Q%~~��d+�'&u�Q}X�{�J#����I)�p��O|\�����\�������7b�s��?��}%���2e�*��N���x�m]2��o���`J�lJ����TG��{2�Y�Vۆ*Ej���e���}����PZ~�"�I��7�I� z�{FvBznG�j��27k����5I�!���$
��Q�,u��b��Tm�F��%��?Yҷ�RR��ǯ��'D�"��^�$/b���"@�@��hP�������hA65�Qu|\"I��G�����o3�^�bz�������P~Ua����,d�/�(F�+"ے׌l�b�;"�6S�ٹ���>)A�~�ٱo4����q�]�l~k�P��Y~�ƈ����{�T�# 4�NT�p�I����ދpm0��\s���p:�F�&��Q�O!��hL�P^��2)�����D�
"ݝ+��k��)�מ<!�d��O��m/k.G�w��j4��H�3]��15�`�N$y�ˍ����y<͎]��D��
ȔO^K���0*&o�C�C‡l�&Sx���#I9��s6��ڰ���I�wbPM�p��.�s����B��XuǓ�W���G,��pl�)%���9ߑV�m��
z��T[�f�jJ���7H��y`؉�Z��ѿ&>og���s�򶆎V"t�?�Ue�TP��O����(�T�Zq�A���X(
A.zm�F��,�ج!�P��q�-[!�6��6�2��]%��|�K���8Ѽܛ�3��܃�#V?��oj��+���B^Bf�'��L��f�;��DPg��g��c�n~E~��(	G)�7��pJ��� 7��8���\�1�[i)�g1�/`�LӚj����i��nR�ƛ\YyS�R���N�Ī�([�7b���(��3��*ͷG��:Ē6�l2Kk���8��f-�Xei��!�7h��ӁA����X�̀�T0�(u�0u�]�-��	�4��~(��+�x��7�TZX`ar*��A�ز�XW��]����e�;LԘɍ)J��	;��廔�!Yt3c
��z?Jr����:��"��B1�߼ }�=��j�mSؘ�dS��P�^��1�R匥��u+)fW�i��4�������e�7�J��ۥ��a,K}}J�B���7�2��(e���O8�`FXn����ސ���Wt	%LVWXk4��R��R7���E���~ŽmY�Ggn%3Ŭ
;��MaUت��, ���5�jľ�Xe�w�o�V$3qVyR�VA.�!��Vh�幂x��<q�ѱ6�0LNIN�"���a�\�,�ޒ�-v�I�fV�4tDp�
���z��w��L-;,3�>������|�s��!c�~;�v��*(2��SC1:���`�����WL��T��IM��+;��/�.~���mg���Ce��
�=�2ߟr3a�m��r��&�;�c��N~�}�����)j�9��s��g�謱��Vwc��	K=x�k�/�o��S���
~ �};``��/r�o
:�'�%���#�%Bk���xT�*.��ƃ�t��zE>}�D�A�P�i��Uhp��ƅ>�nf0��IhvG΢�K��h`�&ς@����|����r�م�8���U�Dx05�(����5k�g� ;��ώ����r�O\�x���v�*檦���crp�+�n̘�zd�rk��V�3$TY.w'hPk�Pb9Mm9
GnKe7vP�"�0���Z��s�n<������>���?qQڲ�����9�ni4p��;0��z�%�w�%�lT-Bf����{�E������h]�ױm��~B�^�/^Û��ִÁ���lfg~욳WȬ�v�5<LP���iЅS�G��yt�8$�I�GB�R([�����{i�J��>��,�-����p�y7Z��
<�	㪓�Nߗ_��Ɂʄ���
����x�F�����X]}nX���t�ո~W8�W�2����	)a7�Zˁ����o�V�rWG^�'�c�g�����PK��mW����setuptools/command/dist_info.py}S�n�0��+V��	�#�P���*䘅X/������v
��0�����9{u����P�P�9ԁ�'{�Pcc,�`,����?�6��*��Gf��\�5��,7�R�C��~��W���L���1�)�;�G��j�ڙ!E�#=�/c�N@\)�GWQ���9�ô
�m�?+�G���g2h�Akle­�
z>�<X�X:5v���&����4Bp���]Vx�kb�M0�3_8�-<vM�}�M��M�\�d������=��.h7�{@R�y��Z�$ZW�ڊ\�rü5�2�En�>PK��y*�؇`4mN�}��sÄ|�'�t�Y,�[�'��!J}�?��
�^��|9�p)�٧w�
.�d��9_]���w�����i2��>�Mn�u���PK��mWE��wg[�N"setuptools/command/easy_install.pyͽi{DZ(�]�b]dZ�lJ�E�c�cK:�'��3CrB��HѾ��������)'y΋����ꭺ�����h���n�W��/W�3�y��E�7�*;o�l�ԛ���ͺ����٬�r���з�|��Wˬ9ϖu��z���ʮZfoo��f�`[.�ʋ��g����z���b��6=@m6Ӭ������r�h��rs��b���C��jN3�r]wuO�We��f]e[h��?xP�e�o��wU��⠺y[�K�	�w�y\m�ʾ���j�V���E--_��Ճ#���m��.V�YV��M��w~j�?��/��r��ܢ�\W-�-�K���Y��eۅu��m����d�ܼ}�^�{�f���O��aɷ�K);	[�eY���\f�t����/���8~����G�ӌ��u�����j.��-��P3�VE�h�mok��-�˪�TE[�5�my�q%7ˢ�P-v}y�����3_��z��l�K��O�?[p�>�14k�CӖ[�l7�߶��
J�[X8�XyU����m�,��վ\Ȕ�QU��- Q�>ԅ��c�����m�Hh*�}cj�'��~��4X�%�j�z�ó�)��6��

Z����Q��]\��U�w�n���WQ!O�ٗ�_��W���4����Ǯn+$\�w���bkQ]@=��<o�*7�Ue;�-��"۫h�kv-����ۺ����p{�\�?TBKL��Z�t��*`V��io�.�c��l����~��6�u�lp��읛G[\����@�e_B͋��ۦ���*M�J����f�Y2��Tm_z��=���Wo���:~��-���̃�]�ɚM����g�=��l6���}��5?�Ѳ:/w�~4͐�_��z0��	,@�t9�N���\WH��l�������c���M�����b̃�B�*`o��*(���/�1���W���}>yNe[�)S���\-:X�|�v4���H5ӹ|���T�����X�d�y��4�M�ϫ��,�TF€S+��]�w@E�X~n��!��������2�X��maP]�k��s�����͸Ϫ0Ys��gMY�s�q�"��`Ll z�lBUw�gm��˲+��ͥ�T��qMQu蠆�3��>��b*�;��>U}�'�%��-�0t�g���L*Iol���`@�7��-09y����YV�xן�f<��Vv�������
�աB�I8)��]EϪ�j�g�lj,O�E4�_���2�l�`G2��x�]5g�|Y-�����6�S\�������2�bUv�ljC�r�M�u�"����%���s�5����'��k4�p�1lY[����p�\I�<i;`z;<:v��y���EC�;K[𓏙��^�$M���G�o�oG���16e�\M�0r�MDz��ae��k ��욉/V]�?�T�n;�C״��(�a�d��h��h�e������r"O����Lb��+�5�7���NF0����-SÂ~}��_����t=�`����v�j&e������T��Z�n��n�h��X��^kl*��El��>���c�kW��A�
���ۄSɈU��)>�=u��s��rY#ޔ+�����A�`�׃D�bf�w6r%`EҲa����]vUU[��p���Lj�k8���o�.������M
��&����<�~7��|��|��S fo��E��ٛ'8�꠨��;�p������7��nC��
��0ڛ�f���Vxr�j�*��c�`��2�
lJ���3F�PM�Yd�2������.UG�y��L'�րy�k�U6�ŒR���!U�*8-ĵ #kw�jQ���a�8N�ڇ�if a��:��{7�:��Us3�l�X��|���4�
�.�>��8�]��8ab�>�UҬ۔���;��l 4�֢�x�.#�*g@�W�.�\�W�6o�Ѷd,C.�]3�Ftf�m�n1�����r0c��eW��~[<��%:@�:� tf��a7e���w��G|ҟ
O֬�r�<��|��z�	s�Q�Gr"�WE7��($t�:���6���� �۪.`a@b�a�~�w�s;���o+8�DT<�����&����
�t���|��_r�θԚWɬ�mtSsMװ�7p0�Ų�z�0�U�e�.�N�ELM��4h�H�NدD�g3B%*��t��������0���q�)6���A����s�cŒ�	�a��
+R4W�~��v�
b�_If�^S�P?ԴJ�4 X����[�yw�^�N˞��2��+����VΖTQ�bII��7�yD۲0*�r��i
�n&Pʂ�r�z�4�)�ܩ�:��z��dq�k�U}&e��i��ٺY�Ϟ�b0�>�M�����Y�Hu_m�MC��`��.����/?�$�w�~�]��Ωjڴf|8(�e�~<�/�ro�&��6t!UDc:�^���WG�=$�{���Z@���O/���W��^l�V��pܯM���Z�'�6�ۊ���SpX/�m�뺴T[��{L��Y!��p+Ę�*�(���ŌjY�d�w�DX�ǟ�`^P#ޓx��P�n�U���H=l�nwF�v����Y ��	Çz%>M�<��_�	�jɎ�99 `֫���][�=���Srȉ�{�2�E��n2�Ց���IUi��cGj�GKx�j�#��Ff-i�tB��Z�UKd���X��E�K6 zgMgYS/�ί�@�ya4���|����F���s_u�H��q7�jUv���{�%g��br�t������}��L-<�^iX�@�g�Lp)̻��
�ީ�o(��r�˲�xX�y�ƭʠ�𪹘#���>Ǣȇ?D��&���O�X���J�}[UJXw��sI\қ`�~{m�n���j��>�`�rb��+�U=�O�ڪ�
D祛��tk؈\M�і������tD���e�1��!ai�ˣ���ǟ�s��G�mgx�^q3�d�qx����B�~�EO��~�j�OL~�2�==�E!�#�i2��H"����#b]�|2Q�Uְ$Ƿ]_��>���a �?)��9��ϳ��}��ȅ��d�J��|�ū�~}����u�����,ϻ�
;z��T�>�Oբ��_p�ht�,ڂc�&�IU����0c�Oí�Z����|2MT3��PM;	����jo��@T�M$�u?K ش�W����OO�+l�eV8�>ѿ���aE�<7�4��-�׫�\/~P��倫ڬn3��}:�	^�d�Y}�*/��al�@�}��.M��>Vk�"���d2��
k9>5'w�t���@F��5G��G�F߾x����??����:]�dO�)��s9�{x���� Zԧ��a���yR1ۙO���U���y��j�͉�+���!&�w�U�^�{���QB������5��Z��J�����Z}ú�L[f�������z	5"��d26�`���
��N5ۈ�ҳ�L��f%70lij88P�������@�Ś���"�1��}�6�4���A:��v�W�BBs܋v��md�wя�Y� U����b#a�����)͒�h�գ��a]/���iO����q�q�:ؓ?Э���)�>�ej>��f��B��̚�� ��s#�&z�YI��j��IO�-��Q����Us���U?f9&p�� 7M�)��������� �3�F�Vh	�	�;�%	W��~%�w����#Z䝹W��x�[4��7.l�x��?��/2(E�a�=��¸|�%��$.�w�=��f��kB&%�dF�Ŗ�
����@kT���%L���z��2O����Q�UY;ԣZ�� R�_��Ӽܢ&���)��8��U���ZK<@u�1���n�y�^<�j�U���}Y.��B�P<�����ں�,��0,�Y�a\��`8A��S�%�U��O�Z�ke��&6���9�ތ����(Fr�h|�*���,B-&ㇺ*�7��S�=�);�p��<�}^/�:�2�P��y�N�(�
��ҫAj��̃jS4�KP���(xb��=k�8��.��k�`'��Le��gL5gi��_��Z�\�������� Ã�~�)[�l����`�<�7�O�6�6f��4Z�Οd�?�Ãg�/)W;���
�m�{��!���cϨ�lf�F���zJ*�g�4a>�����A4���h��;k�➎�Ʈ�xv��;1,��MкmP;��ތ(��e����{�d@Һ��iw4s�n\��h����j;���f�ow�lq�u�/��Zc��R��f9�W��H�E�6�o���-?�[u�	�b�1k��%�uw����`�����P7r�r�oQ=����́K���'0]v�Z�9��mӱFt�AU(P�q�VlW�a��rS�X��ua枆�+�@�!A��.W,��>͂�	�<*�����e�rsc�n�q�r?r
���-�v.TXji��z]4�iF
�)
�\�^{	��e��]�>#K0�A�,�-ۢ��\o?�-�5=k�Zka@���Ƨ�(��d$L��%��q� Uu�-���=���b�U��˾T�N�M6�in��F8��b��ў[�)��H�=*7�f�<I|�x:ݻ�ò��a!�I�Ü��H
/��]�/�.'0�J�؃!���js���=�رֺ�{xY������B.�� �N��k;���?V�z,+�4EԌ^��(��e}F����Gwt$�������Ls~P��Z�s)&Zf>HyZ!o��E�c=��d��T�9��x>:1�y~�I;x"��Ν�B~�	\'���EI���s�(S��I���aE��Q�'��zn*fw㭋����?+���tu��������;ۮ�-�}R�v1&���]���3S�y#��+��e��G�8诃dd�X�U`u�m����v��*eQ7�#���njf�m]h���Y�+��f7�S��/``�6[6
���=#����h��%f����ODk�;���
oOX�.?t���x���e+zj���̐�̌���m��-�pCX,��:W)в���č?��_��%�<�t���f�rKR
�~�V!�w
��N?�SS@�\*C6o>��M�Ď�}͌�	�	�Խ�����^1�f����ͱ�ſzC_��84b��v$�=�Wx���(
/��o^�}��)�J�A=���j���p����Y eO�R�9�h4a��'�{������#���܆��'�,����
�I�u�7b|��\���ƈ
��^}�AF�gh�憚�(��ctVM�4��*>]fXv�f�.�65�'w��:P��_
�2[8��k�'7��|��S!O��޿�)4{Yj����⸰���v��|�O��<D��M%�/���76��`�;bn� v�� ���ז?j����1�P���N�"���xn�M��N}��[.����e��(��[�]�Zb5�AK-�Z��q�B�kyB'`�$,J���P�����<������?!�/R�6�Ů������RD�TX.S�aHڤ��?�ء���hQ>����1����c�cn��9�	��0�����2	�a�ChZA�Ծ%!^�
�����n�`ao�,{���=��Ã�C�NyQ�od����S��A�����Dk�M�Ȭ�d~��<�o����v���1oqS@^�|�1D�9�����{�[�wd5:kn�'�� �Y���Ǒ�o}���e�q���z�����P���ϩ/kٸ��J����.�5�������ޱ�Z�dF�����ޢk���Jz�Ӡ�vt?��5��w]��1w;CSiGM�����u}��0/�UV���ׅ��ƛ�$Z�-0U[ ���)hN?�}u/�'A$���9L�0CsL�#��|r��4q����GF|��a�A ��Ҝ�`�9)���nwb�m���-�rcQ�h���zA��5�f��V>��a�E�
�8�N���"�AS�y(��!it,�����m!��BW�W=Bx�O͕�a+#��\�u�!^[jG6�*J����K?=G��E�( �Č�_�E�|�濢7)����eXQ�W�2��ף����]��ȓtq-�J�)�Es�j��8�қ�{J�$*�mI��,����(t�r��Q��p�Ƞ�ąe�k��*;ۨc��M:\#in��CՈ:f��{:NW� Eb����ml.�	��h���?��`oB[鎤�J%�5��>�"�*���
0�����݆��`h�AX�C��z_�@��P]�������`9[࿨�é�d׍����k$R=8��������G�?����>2��	-w�H�b�vMD�Ի�j�a��'��џ��9�?v�� �i�m������@�������"I���Պ�_?\>�`|̣�\vʵ$��m|��Y�W6���c���v�
����	c& {I>qk	�W���\�SMwyl�i@����� ���c��\#�}@R�D��P�$�U}U���H\�>R��H<UQ��l˫z����7��J�ͧ�N�T�3��i�Ш����<E�,bPޢ�` �CR4�����ڗʿ5�6�@�f��.
�QY]��zڻ���1���Ec(��ܾu.�S��RzC�K�(͘l�E`90l�}��W��rǨ	:�=l��8�3<v��J�߼��KY�"�Y�e�0����x0*:�Q��pPċx�"��ι��L=r����b/0N�V�W�mx�~���ڛNtH��L��A�F�J�,�U�Z:7�&�(�S��.v�\��)�akg�F�],jA�EI�x��Z�\�
��c�hG�M��lT1�X�b�Wڜ�~�[:5~����A�m�z���b=���:�}�-;����7��v�t��M�X? �7!-}�Ŀ���й��̅��'���ʌ��M�=T���W��BI��1���L�֡�7�6-���e�xT���sX���T�ɟf,��b�*��{g�ˠAztDr��hM,�Dכr�OO�����7ZB��SK��z@b�H���Z�W��������d�cRM}��(�ۅ��F��ӿ��j{����\��jzdD��	��ڨa_Ӌ$��Q��f*����V�J�:�1��$>?������P���Rb��q_�9�:#�]��ŷxty LAĽ����[���.BZ�]e�}��Q����&�]j;�6ע���o�I,RqE}�7����2����;0I6�V�
�g*Q`Q6���!�Mkl��
‧�u
�m�z��T��S7�1�񒢈��1�p�����|����X��2��`)��H��+t~4��qzS�Ma˃.�H��=�?��?*{�&�
;�ʮ6�
Ct�s��9��W��xOr��W��ub��˜�K4rQ��4%4������L�!f��:tu�-��v\∉��K�bo���p���.|�a��(Aղ��{�j)�}A"��	�dpҗ����}����	��>(;��x_��vw��4"��:��c��!X~q�P�d;p�!�({F��1�H�b4�[T��n�̀)�0}AH,��wU?`���XKV�[R���xr��/���@�"�sNh�9�f�>��VǟtO�+�؀���E�'GP�c���0��@ƱD�M���/�5N٫�uL��o���T���mB�^���f5:[�D/�-����FN�A!��!%�3���rs�#J��K�m�T(о������{�7{ei��IT^��ɦ�}m��˲S�F�V���='��<����>��n���9C}4D�������$ �(��s5�!���A�U
�0�0�E�c���G���O����׿���
c=f���m��m�p�\d��B�0�^�mU$�8��
i�v[ְh� $����r

n�1|�h|ـ�]�C�z���p�>�Z��MI�u��HO��G=FM4x\��H��)&4���|��ƒ����e��T���/yR��I�&�<��o�/Pr�E:N��)��8�ž��#�v�D�<Y\�k�:�E__��^jsǸ{u萘
﹈�T�IDNa�h�wY-�E�}��qQ����D��}�ٳ)�z]><9��J�0�~W�W�E_��ِ���@I_���۳�����P�G�.��_�-�ߪ��]d�q��Q��\v���Xs��Gxȁ�i��`��E0�EG��j�$5��uj��IOrt�B�m�=2�j��7�6P�u��Yj�8�*����f �E^)t�1�n�Z{h����i*Q�����:㜁=�����0��7�����(��<���V��9��׬��yw�j���v��s)g�\���W�H�Zp���K�����Y��(�Qy��h�gUd��Q|�m��&�\�?¢	u��v��M��D�蚃-!�%�?W��e��UuQ.nM�K���Q�7�s�s`��C=��l�e��{�#x�Ÿ��fi�\�� U���͠'��̘����R�q��=4��}a�[.o
T>C�gǁ@�I�yyO��w�^n��ۮ��Զ�=�G�iN�gw
�OI�:2�gҶ���j[b�~�Ո�;���W�W��|��~���k�V*K��u�����O?#�����x�/�+��$s@���
2�%���y���o�#b�ƥc�Jf>}L�Z~|�+��*L��B̶��F/c?�h\tS!a����ʦe��f���=�b�D�!�Hv���������$i���&��6�47�H��L�b\L�|{����n��C�&�$f�\X�i����}й��,����T������ߘ��س4���%��Xq6O+g�^9�e�)��c���omX��5�Xh�%"�	�9�|{�Jo���f�ы��Nc�mY�vq	u,�'ͯ��lFL�g�Wf�E�\Q	�us 1�bF�#�ړ!]����@��d����rG������m��PE�>Ta���UX�R?��#���A����8«7u��d�Y�C��d���� i+~(D�-��2�'��yz�N�%��-3�rJ>J��3Irn^�4�6Scx=�Z�p�Fg�ό���ކ���G<="c�EA��|����:�Zy��Wѣ.���"�=��XBQ6d1p�o*{oUŬ���.��mϾ޳�����5f`�]>��=,M�F��,?9(�M��#Kh��QQ\�Us�����#�#+aǐR�%�&�b��`2b)�9�ؗk ���O��<�I���l���
�Q����p�ǁ)Lڽnn0�W�!:�x���6�
�����
�6}ӫ�ןIRmr�/��6|ᝊ�˜A���dd��ɋ��2�N���Q�a,x���̙�S���ɵ��g|��?�^����x�q����Ņ������[��1�Zq>G���>5H�֡����Tq�kҧ�T�ʱF���
� �n�_�X���sC��7���J��n�n]�6�`��c}��V����NG��qpӪ�j�PWE��t
��^����)a����99��0��{[�֞�lVNHoT��C���ᐐ�@1BW��h']F7�
-iQw��-
�*?,z_ҥʛ	6jؓ6#&fTI����!�������~�A�'a�\A�}NB�h>̞]
��T���Ǎ$h��1�>з��&W2r24���.γ}+s�;�Xi:4PxMI&v��@��'�}(�P{�r�$`�����\����K3�!��!.�c��W��	��#�]a+�4��V���4k�/����D�{�P���ڕcI�fo�O6��/�i���o&Ef/n�
6T��!�b����L�b̥�_*�ѷ�&�e��Ј?}��/�A�҄�Z���[��9Ë�l��(;��*��JlB�Cs��^{���-oan8���Q�����~��t�np2�|�W�/4̏�c��D4���@�##� ��8�������x#��T>�<�(��&�fս"(�ȩ����cJN��`km��RX��Zo�+�1�f�G-4�Q0;f�1���^R>�HV�>ێL�X˧�4x���@�������7�zlv�JČ-P��"�z_X3���=ϞΟ|�	����4�F���0:��iw�+4��j٥�L�
�?;���h?p:^�;��B:�'��W��3���C
�x��qȺ�����%�ng�`�6��r�ա5�/����K��=�lo���i[�T�ODI�NWG����ǞZB
P��!�V�Qk����E��|ҩ�55�/E�R�B�{"z����~�f�=���٤C;F�2jp�J9Z�=��bg�!���e�u�K��h�]�'V�xc'��M�F��V����Q�GC�;�Z�?Oц��a`� �Q�l���e��^��ex޵6��Ȇ�s�!x��8@Dr��$-�<��D���'����c�8J:���.Jv���|�cvK<"8{�s�t��S��\�7�1%Q�/1���C�8�=E�q��)~\�n�;�ݶH�#���m�ij����@��l�� �L&�Lr�Q��\�7=��O���^�}�x����m��eh�m>�nI?6�*@)= ���=�$�C/N�gN������JJ�v��f���qf��f�5`h����z�:o�]H:�)&+�a��HQE��v`	A�-0��w����pφ6V ��"
뾻��^���m*���#�C��9���뿘�@����4���-�N�?����V!j�<���S}�lŝB�/H9��\�PY����L�_��������CGtfl��o;�zô���������E,E^,�R�LJ�$��=�E<�-fxkહs�xL�ġچ��d!�}�:,<z��T�u-�����#\������+2@0('�O^{(0��+��:��"�kI�\A�u�pϫ�=�:��&H%�Qv�u�}zZ�ݥč�
��яR�N�&'}�_��w(>�b}] �Ӻ?t���E�a�$���+;�Nh�)f�=��_��Zn7r`I>�;��}�%&�ڐ�qm�S v����X���Ŝ�ݘ;s�K�]���:���C9��u�*[�&6�uH���J�])���� M�V�Bf����9�7s��aN!�/���ZM���H��s�f��TB������&��e��{����{"���1v
G1�S�<�*;8F�hQ��<_L�9�Fٚ��b���g��jWH6�ֱ�[�V����` >Sv��7�:��h�h�<�x3GO9[n�ŀ����"Vˑo��e�ڞ�V�̭AV�]%�z�UI��f�a6�N��D�n�0��& !W�ˤ�o(�t��p��~�~��F�nE1�Y
����0��r�1�����GQ�O�F�A�Y��Wj��q��"��f*�L�y&�L�6�|�F,`�U���G��c�[�
�rƘ�ID���&������	��\�y��t��0D�.s����<㵩9�#){@9�U��FdL�{碑$#D|sK��Z�ü9��L:g)�]A�����i?Wn,`�5��%��5Tb�;a@d�,��+���{�>������C��$�gA�.ϱ*]���r|�c^?ɸ���m�\ftneL�����d�Ƭ*�"���?��9;��7a��?d�|�q�{�z�=ʼ���,{��	HT�Fo<é��~��ö"��=MJBQM-X�#h���&B���]jyO�I+�G�P�>?Egf�Y�#%h$����c��v�&��u	~��~A�BG���0����Ou�y�k��)��}�@�A���F��l��0��Է�+����GcX:"�lLa��G'��p�
�j�I˸tb
�+sq)"��C_4Vu�l��R�]��'��Q�2�b.A�60�N�6�%�o/�<��C��!<��㟒?N����z���l���l	���ɞ�[2�Tl`��+!e�P�Hq��&&=���4C��U��Sʻ2؁��eA/]4�e�Q����6E���DO�\7��Dro�5�B������/��̯��(D�S�ӂ�Ps*ٌ���d#�����d\�.І|�R�Lȳ����+�d��3\�VCN��ƣ�ڴ-r�=e�8��M��+L��b�$��B3&�b��׸X6`�V#��:�
H���]��	��N ,1W��F��.����̀�~Y}(v-)���5
��Ąw�e�y��V��Ѕ�}�e�W��d�b��G�P(�X�-���u�DWA�'�:�e�Dw��!G沽u!^)�r�'g�^靤�!U��z]Pn���!<�#(8�*�@�U7r
ij���S�L�'�GF৉����N:��1acژ�*�Y��
���]K]u!>�Sg�G�UR${P%"��
l�����Y�i�bp��?H�͆h��.�W3!�e��]��[����l�Įi�4E�˷����1����J�<K�#ڰV^�7�l��t��ze�qI�Y��|��U��b��κ�
I�b�.�d�A�WQ�hju4��m�Ջ�xā���[�?��� /���#�{��T=�s���U@X��m�	��ɱ��#��H�A.�p��M
E���1�Y^���=6Xr���o(Fᠣ��d��V+��
���~:��{
Y+�p:��J����nPu�d�YVg��|�y���PM�FGicu+`g@�g���S=�p��F#Q� �_Z��o�F�c�~�G�;2C�G;�y���Q�]��q�`��9lN�7H�SdO�?Fp��M���x�J�2�����'ߌ'��I��f���ɓ+I�(+E���'t֨6%q���ON��}�ϏN'�͞4���/'��`��e�Pĉs�����7FS5?��m7_66�!�Ļ�;x$?��k�uӮB"m�@��]��5���.!��+?��~���x^���fFZ8|2�5[T�O��xhN2S=^]������u)�t�56�;n�?F�o�J�ab�;.(0Vt������s���fǂp���^���jo�В\A3Y�7*r*p7*k2ɽ�5�ƒ���FvP���}Na�ܾ�Oe��0�=9�m.h�����Bm��/M�-��7GԄ�#4xڒ�+����R ���
ѽ�O�z^ͧ:�꡿��v*�`�y�\>��㎔�*�v��z��&{����k�^3�H����$(G8�!Z�l�a���݄ꕭ�6j�&��e����b�i��Sɻ@h�l��W�\���4�^��$�>X�|6���0�����uNp��S��H�R\⻼�R�W�n�%�o>�G��FQ�0��q�ΠlC@�����ar�A+������X����~�pn _!~�O�q��j��:C�!j�qy�d�w4�����̛q
^� {��ZY([8�>��h|N�:�*����|���[�i(@�k�ǨN���ӪB�u.2���V'J�}���G_����ᨿ�~}�j?n�X<��FI��8"��#Le�/oF}-�h�'V�dT,�c���ub!�����;F�Y9��X�d��7�3Ы�wP#p�*
��q^Ƨ6�W�梠J�7���V�&<�`n�b���w��W��b�ᤆ�RP�ՠ�ɽ��nw��ҙ���Gp'^���)h5b}i�Ca�$ׅL��
E赉�i_��0�i�ɹ�,>�m�$����-%� �{���`�S�t���ܸ��Đ4x�4����_�Fͱ�k�dՀ'1]u��Sg�|N���� #z�J�N��0a=������	Y[�o�X���f(���7Wʭ��b�N�j<K��&�&Gg���*q�q�F����U��Tm�-�(����T&\ä��:��G�G^�%�\X~B�Щ*��8v�p|"Bbͬ���W��?�4���'���G8Q��#{����re�(=�+=�ԣQP�TOg�h��	��{t�.�`�B�Be�lo��:����@��X�
O��j ah#�`�T���^l�ʼ� ���<{i�7R`n�v�4o
P�y��d+:U���ǖ�����*k���q�Y,����u��v�0�!����G�Hu�����{cxa� �6`�dt�S�������Y�Ap@>b썋1Q��v�9���!`=��,�e���j�p����W�d~�ş�:*�9>zW�z�|��Tܖ0t����(V��E�w�pM`M�,�����:�Ȫ/il&u���<�C������`��u����8;�1�B�(�`Dt*٨Y-g]��F��/�̮��r�f���x�q7S��aFG��՛J��V��[X�D�^���	��&.�b��W�@D��l��x�m�[a"���.�f�v	>Ⱦ��
�"�Ir�0
�$�3�Y������q��.՗Wԣ��n*j�mV�}	Ĭw�����)ƙѣ�v�i9;.Lfv-�d
;�t�wIerPo��l��bk�M����8����M���)�f ���ʋ�0��Lϣx��|+����b�ﵻۤ������
��?zp�Ӱ�T�H�e��]���|bBt��kEˈqFi!����?PBMG��.��n��ʛ��-���;i�i���u~ܞ	W�]-Mh)I��`�G��j�9�:�(��c�&bRL4�7�9�>��i6H'�<���:�m���Ϟ>��(33Es���>�g� hTW�7�0�}ߗS�ׂY�p����x���5���k`��IO�q\�Y��ȟ|x����~��_��f����	�(
��)�=���x��tW�bS���6��s��q�#x��82�>���[i� d^�W)‹�v�38���jE~~bEe���'0��<#�ј)�*W����\��#a�vL���ɗ�2MƩ6��@����ȁ�L3P�=�6��{��W�TѦ��f~Li@^�������[�D��5��0ZW�����erqGE�g` ?�׆<—�7��Գ*/<��)�+�U�f@dbu�!�lj0E�##/�+je��H>~�ͻ��^��1렦��W/���-ЕO��z�>.���aT���}�����Td"�1�E��O���b�銉�I��;�2�#�$XI��k+��0!fq ���y��!�����P0�g��ӱ��}z�������mUdι�&�
����D/Ba�|��~q�=3;�\�>XU�m�����1��;L��O���F���)�~`*Md(W<A�e�{1����-�CA�t=F����w�š�VFi�_��;��`S��4�˳����3S6Eȓ	�I�P����$$�`�M�[�8ߴ��ԫ4�(E����m_�y�q�*�.{�_ꈠ]�{u|�"��^A��D���lT	���F��G��/�d/
��+s�	�i��GdF���Z?N���)v�
���Ju%�BI�R�I�C>9�%�W�����o�p���C5�)��J�E�0���z2�W�����5�[?v�M!ba�\�$xsJi��[�Sj�-$���t ��W��0��C��%�ޱͽ��NRM�H�YO0M�f�m�䝻�S�#q�`�%yzdC����Ӓ�O*4���Q�p�a%3�@�Kg͕��.7;�t��d���P	q��47-�,ؕɡ%���2�7����V!���6�N��L��H"�Q����U(��<pS��J�������lpqI�݊�	��5�2��v;$V�!pD(�{kS:��nq�]b��T�����n.ɬ;Ѵ���P3�H��/9�h�폖�`;�Fi�Րi
w��m+Ꮌ�HRN)s���/�[���X���G4��GdZS�Gκ�)����QӰ���uV���>b��갧���!$���1�*�
~Rq��uRM��H�(��z���9уC��O4�cU���s�^���c���H���4��X.����.D���=5�c^!�>��>r{6��{|��ִQ���\,�݆U)�Xb�ԛ�Vb��C���q��?>��*�B�ԁ�TTX��$K���T�r��+I��YL�ܵ9��8��DF
ָ����Ǥ��k%.0n��aE�dA�PM�EdX���|�@�m��	�Wo%W��w�"��#8�I0��Ά��?���K1�^��S5ꚲxY��ȧߕ�=����Jg��;�1�+�3
1�'@�B绊v${�
��j��0�!���Ŋ��0A�'j�rW1)XM�0#l����9�M�yP�[��Ҷ(�
3M�,��E���>��!=���'�=
�;Jl���-����Cca?H�>ߞr�`��"*k����R�#~�l�&��7o߿y��qq���	��嗯_��7Gd2VތI�2���Bd�������q��
����b���dN���0�x|�u�a&g���^�H��7�*�@��U��K�6f��ƾ��������O�O�1����Oɹ�/02ii��F�������{�3�t9fo�X2S�Z0v���{u�B����iq�AЕ��W*]�L0�
�x��;�|	'�r�3=W�Ӭ�q�d9$D��{O~�x
��F���hSͳo�_��Q.^Nˆ��9BR^]�
���I��$�j�|L�l�”�w��� �v~Q@�����Q)�����$Q-�V����������V���֊��9w�#'`�=�������uk"��Y�TFbeA]�P�$�@����᤻�l䀬����8�&\\J+�	_
�	
�Evݢ��I�=&o,��"ˡ3�tR�[�C��e&�⢙b��J��X���U"P�͊f�ͮ�G9(�ٗ,�рa�̠d���-�8q�X��
=��)/C�����8�I�X�'v%#@U+���Vj��y��p-���a���|����I���<��n��+��h%2;��	��RgV�9.%P�%�n�7뼬W8Uԛ��=s4ώp遨\��|��3١��6�m3�WX$�d\dXƹ�ļC-3A%�����3[�\���
��n5�14⊖��[b��5��8{!��Ҥ�9��3c{jQ���P�S�A���A	r�,�1��R�D��\V��c�E��b��i;7M�CQMq��>��$g��P���h�+�l�:��V��j?b�M�a��y=�T,Ԅz£��,%r=�^/��l�vW�rj6�k܊�5ٲ5�[�؜���<Ԩ��}#.<5P���
�̥P���w�ݶ�T���^�z��ؤt���m_�<
K�Hܳp�|���~�=Y4;B 6vkc�g�� �t��)ԗ>�4��
N5�=)�;S4�P=��}%�*ηD�0Ge�h�&S�2�E-�esC�QZ:��Bݐ߬��P,D��{S�X��d�QLu-)�` �S����,�qo�*Pu7N>�ɴ�l�dDSX_�H�;�Č}F.F{Q��l|
8ߙnT��ܑ�rĕp|?	�Σo�/��d�r]1��z�\�Ⲙ�[��4>Gd6&��F���~�|l9h��u	�]ahiAZ�?�9ʇ/�5ލ�
�-�kx�t�7���W �M�Q�p�6���N��$1Q@9R`�z���Z��-�&���
aeGG����]�\~<�Ll����]G�	�f���j��x]v���N`A	�.���q�80��c�L��͸@b����ێ˼�-���ÙC���ʮ�/+ר����A��c�x�A�Z�8�ј�_�����E�p��cXQp'����π��Բ]��\�"�"8��G�����S\�Y��>M(5�w��Ϟ-רI�s��m0�Q]c� 0
�ak[�氛�N�9��ǥїG��"\�xY�* ȃ��!!ibE����BΦ�RP�ΠI�=]�ő�2's���T���>�.����ݮi�e�I��:�P9��~���cJ��8��b8�%�榎�W%��<W�(8:�'	H��ɶ�e�gQ��<{Ipp�P\6��0,��L�M���3�絝�=�RI<"���Ζa��s�8�iǾB[,�]b��jv��	`'!I���h,�vǥj��ξU��sF��}�u�^�
�?����cܡ�v��၁ͤ<��
s%�J�SƔ%����P�l��Q���L����5]�9����_o��
"����
�Cj���|L��Y��u�r]_�v�!�ၫ),"&{�	����5U��H
��#ȃ(D�
3��ħ���2�\I�iLi�f���Oy��]�y��ڜ���T@�)�J'	F��c$uAl���\-[�ȝ�.[F��-ԁ��&�{V���'�	Po��_��ٌ^�a������\#U�[��f)��cת�YE�����.O+��j�:X3.��+ܥC�D 4�����wp���N��V�!�н�ࠞ�n=W=�${zJ��|��F���ϚNy6����(W#@ݩ0��!���
�J 2�B�F|w�PCrJ�q#�Z��'n��z&�c�?2���$9�7�UX��N����DemMxۡ�h��f��3V�ƵȨ�I�YSV�Q�)��ķI<`<щ��+j�y��YN�79Ox��U�N�ʳb���9Z�:i�bv�2���&V7��*�,;�u�T:$I�2F�q`��w�s�Y��G�����\f��.Y�&�C[���[�Z����L����f_w�Q��=��fM�`�.Ȳ`ʺR��V�q��s&�8;��Q��eǼ���D��bы��Ps(@���T�0�3��Z��6��g_�7�
�����5�*�1ç��>���_���3��{k[�8`���U��gO��W1�0��}��gϞ�`�3`�W���]���_m!`�e�<�'[��9z��7������M���)`�FF;\q0΍i�����=��2�)>����g��a�qF�@c�
�@0�����	�M[58@�@�H�Ǖ����ǁӈ����e�
h�{[o�m��]�Kt[4�A���\����\}=`R�}TW��5�{#�>�"[�Qth���ji�x��ݭ$KW�ƞBE(݈�r��Q!b/�)Q�J��-j4��P�f��}����N_
	�:{����#�����K־.8+|k�S,́�Yē�\;��ڀx�R�������m7ǐ.0<IaM��Rީ>��������n�WӨ��ƌ��3��)8�HEI�<)�2C��7Roz5���c��Eeﺌ^ۗ��
�G���٤�\�F��������7���n�jV�3}0�q�#KyTԯ�+�r��L�
�v���L�9L<�q��';���-p~^/j�I`���w$������x���)�ʡjuQ��'r<5�Un�1�U�o���I�>qPx=�D���A�-$g}�??���9x�o̱]wq-g�lc�}8�=#�����U�,'?����Ǒ\f)���k$]��&�M≝�� �i��v��iv�Y�fW^���`w��4�N�x��6�e"�g�q�]f��/��_���Ĉ$�x�У��i��4͌���6��b�iֺ��1T���I��S��X��՛��	r2���0�b,�����Ͳ� �1;9���,�6�ِB	�d��	�[;���Q�w%N9���3)�dz�z��yᢤh�%Ψ�8��!�=�G�z�X	�{�5 ȈJw	���Y�?��Ed�hZ��`ܴ仛q�
�KL��dWޢ5ș�`��{p߀�	V�[fa�
�'
|����ؓ�_�v�W�bKH�`9�2�۱���|�~�E
1I@mэ�
��f�f�9a|���Y��9EO�Y�W�z1k����~��6���X�ҳ}��B��
�p��o��
��Y��0�u�d��(H<��\0�0٦�\Jy���'�ht�-�A�{�T	5)"ؚ�1��Ƞ�0�9���ٻ�d6�N��(_�r>f3���i�h����9�TQL�}&8���쪶7׬��Y�M�	��|���I�D�K�RH�K
Z,H�4�G�-�R��qb��3�kݬb��+d�X�ե3ۙH�nO�0�E�hs�O��@9% G@�g?�nd����ۿ���_��^|��G�@4�����o��g@_�&�ܱ����>��',)�(���:C�M_�%�X�O3��l��u��+ȅ<�=��	�%h��(^�5�7�3�b�]
75O��Sw,�nݟ 5��"���N��B�~�����x+�G�}��6�(幂#e�xPlb��P���>�	2�/)Y̹�i����Q�h3����f�&d��T�ga`GƼ>�o�	mf�)0*�!3H�:�:����D�î�u�K����I��)%
�}0��4��H�E<��m/ǧNE���+��\�0ӭ�t^!a+��	�^.sz�~n��b��E��Sb��c�Y���<��/W�6�]��d�m��Z���"�,�N�z�L ����F��g��'���=%'��S��S�t�"�=���p�zl��$ܞ��1<y�|�2��7{�#���G��/�8��SdV�Ut�RoL,���b�7����b{�
�;���_�a0��|G:	
7�]��Ӏ$[.M$,ͬ��2O1��Y(��v�8S�h}f�h�(�icѪ�����Ԫ���a�� ��	�vgӡe�!��S�t��WR��ɘZ?U�ы��$)���w�q0`bs<M&��aN{����伫EP��T�p��ϲ���;��:x��q{�f_.����hOb1*J}��&N�閶�����F↊{5t��,lϼԀEm*+�
B��NP۟� ��4����~�dZ��B��p��cn���(9D�ٚi�����л½���ve2W��X��Ӿ�5/���k��Kg�m��'s���&���:��S�����p�A^
��0V�1D�C�j@m�'��<�
��Vs �y;�gL"�C���w(�L���o�+M"h�`�"\�;?s[?3{�#AR��w&gY ����G�����4$��s�vG�9ԕDO��<�5x���Ǫ���
y��|�
p�66
��P�WL�>��U���r�L��;b���㒚���藓9I�30x����f����رG�(�hn����1�}rG�"KZM��\-�jpW�Z�)[����ju���ԥ�����I��&�e��n��q״�x�д%�l#��Cis:NQ�N�J��mM��2p�sl3	F@��[1��<Aɤ4��̑���Rf�G�&]Nr� u��*�KבtA��'^��hF4����h�֜-�K&q;���p�&�9�Tѕ�|���Qzh�1dF,���o$�D
a ������2�T�k�Dm��!��qĉ��C��N��[�np��p�2�h���8<
iޤ��v��w�O�«x���Z"�K���V>z�[�:�DХ����L]y3SjV�u�t�_p��yp��G(T�ؑ���Wt�Bl��gx�w(w�+�t�]�У͌wEJC6Ha��:�P�b
���8
/�˱��P��
i���8�(����$�r�v��q̆��K��gw&����r�ƻ6�Ё�y�`?���>S�8�$ͥ����4$�UNN��O\�4�B�b�P�e��)<��G�=4��Z(�5f�_�|�����&�S��߾ݽh42AI(< 5Wt��);&
�#��r�9��V}��M	C-W����$�oo���
L��+i�"�Y�]��JE2�@c��`��]���>�wR��ny��w��@Tt��-31�<Š��{	�~�P.�O�q/�V�P|n�N�[������Db�]H�9ux�H��"ب��s[�����H-(v����ŦT�<��/<����-&�mM��4���F;]�P�/sG�
�Gu�򷑿7�:8>հL�;��y\xQ.ь��<�#��*g0����F�A�I�����­��U>w�	=���r@�
�}X�wP�0�9HW�T�k���:^�t��p'�}R�b$=e2a^�bQ�����X6 %��w��'i�E��Q�/��R�|�r/�wh�D�r/�tc�q	�35O�������Vݢ���+�� ���?�~����c�

�-�8x�L�C�"��x�h��T�3¬�%vo'�~*�{E�4���]n|�޺���?:�ۛ
��6�1g�@긺A���z�۰�{4×;(i5�k崂���l�<1�$�i����n��|�<{���G�A%�t�5u�L$\#�4t��^{�+��ǘ���N4{#�U�!;$��ە�n��2)p.xd*�~�WG����5�X���`K����\��ό�;4��O�01``�ː�D��Ņ��ܛ�0[�٘����>����mW�Q��ů>;��l3�8
���ya�v��[���f ����1P9;�A��F�ɗ�vб��$�H�M��\_���N�!5{"VG_A���r�Q����!��r;����g�rBKr1ʯ��R���t�GbA���E�݄]fS��R�J�ѣ���/Udz�i��"]��
�,�Y�<�$���~�2��<����^_��"�fƄ��}�
�(�UM~�D7Ȫ�h�59���4A:=�(�[;����<$	s�`�dפvg�/��S,�Lάl׿�l4@����&��1i3W����q�
�������#Nw�ƀK%O5$c����Cv���¶��!��Q���z5�zj�H���?��f<���.1)�t�]�mU�MlM�K2���� �}肳J�
r����|�a�\p��b�.�+�S�Zbg��'͓gr�c�Ao���22{�&��]��J�߾򔶥��5LEL�w�Ʒ�E�#[���PK��mW��v�}�bsetuptools/command/egg_info.py�<�{�6����@��G*��d�ۻ��|{�<Z_ۤ_���s�2EB���m�����H�v��D��`f0/0�L��MWץJ�z�I�<��ռ����ѳV����յ�b�u)�]N�4�2��v'`��ꪓU�&���Ѳ�74F�eQ���b��m'^���{���|	ɶ�[e�<7���4m��/�9���Ѝl�y�v렟�R֫#�1�w��Y�iYn���g~��V�Ojg,j��6m��Zٖ���Y]�@U���d�d�~��
�-U�К�ܯ�mZ^�[y�um������y�́��b�o���� =ܱ�^�\�޶��+���i�VIh�i�A��	�.�J7r����
�4��j~�B���,*	_T]���.�n&
����
��]=G�"�eZ��mUdu.�,6 ���%��zaւ�,L�{_ӧI��t����o�/�e�-E������(�Kѵi�Jث(�<ƙ��B<U�Sz*��Ǔ���P��DlӔ򽈟��~y���_q��o
H�H�{�$��Z��qҽ�"QT��r�-�V���B&$g
S��r	���e�I�l�X�����"-�V�̳ۢ��QA=	N�i���Q%��G�jq]��tQo;���'��I�A��j'��f![Q/=x�T��pX�8QtD���R��,`�W"B�E���_dk@&���L���2�!�lP0%,������Zt$cB��Z%HY�S͔��OХ��TY�H�A��v��E>�9Nj��H�:���e
��x.䎄u1O?=�n���K�D&����M���G��#���@��E�(q/��x��~�E�.E��]��)��Z%T���|����G��h�M���X��irwkIcI��
6�`82�c�6yym�Tr�dQ���i0����X}|�����LX�?h&�j+q�����k��ܮk���:�RV��K���yY��EW��
�IE�`�
M��l{&ǟ�oD�90_8"�#
{	P*��}bi��֋�2d(7#����@�;�Gwg?|����s����|wOw`��щ��zbУ�*0LȖ��t›뢁nE�<��K�q���r���[/	ُF�
�џƐz�\��k�_�u��bꬬj�K��z�P8D�P�跣����m�~=��9\�|�%}DW����6.~O����c�kg�Z#e=��Vm�mf�xn0��b�����M]�5�^_�.hIE��̰^���µ��J���:AR�.�@�洭�=D����<��5/���Y�1�
�z����qx�iؐ��X���0�;0$�G�0���{X�{K�<��jtORп���V�^��7�x��4
0����F�Yӂ
n7�vC]fbY�+u�~��WoϿ:�B�����~��W_��'��b�U��ܥ��b�*�Xi�c�.���~�玲Cw�xJ�nೕK���� ��7�NV�㦩f.���j%s���vI�t��s�g"�{�N��	�˙��$,:�:h���Ǘ�����#Y�3�I�X�ìgz�=�,U��C�h�dZ���w�T���0�@��d#M��$�hq���D���B��`[X8;`l/�e*d�K
�y�de�to{��(�˽�1��I��!���x�9�'Ӑpz#D�3a�;f��
c��;gf�z�`��h:^�$��i���*PP5@LzKG8fBs�D$�IBjaA�†�p�)�3101ݖ�)��ƚmJc�����t�`d9A�#"9"�Y��.m�d��?=y��'�ӧS�͆3���ie�=����� H�>��Dw@�j��s�(����m.],/�/�xm�5�+i�r�_1�6�7�@��vz;��p�D���}���Ln�q�7d����F��5��k�7�}��ײ�;0^��t��t���$IH����0W�2�g.;�P��^�G)	&Lm��8S2bE�JU�%D}N
)�c��)C
7��ذ+�M̴�c��!ޛF�Jo�%c���mo�A�'["�"�
n]��b�vg�+I���M៮厢ꔘ�n@6UWd�n����M]��Eѵ)��VR���Bɟ���=��*')��FH2^d]�k�G`H��d�	��|[o�5P�	�d]Ï����ׯ����o^�x~�d�mm�1x�ָ(�/�/��$�cö�_X�{f>��DB��#؝`�ĭ�#I�/
f�Y�m�	άg{�`�WfA�K5��-V#�\�X�b��œ�WC/j#�z��teb:gX+af[J�:B�,����Qܝ�֪�Ͷ�C�CxN�е� G�0��q��#�S�Զ�@��ü�}2�
����XM(,��$_�ڰ��ƣ�!���BLP�!�l@��t�d�}&��}��E�R`�V�JΘ{�����F�P⼢ܓ�q�
&�.�ܚ���X� Վ`�\��>���^�;iMm��"�+GJq�6˃�C_�X�����x&�J`C�#�<�R��(�F�M��E+S���'�ӈ�%:�ɏ�z�N���2	���h7����Sw�脎V<�F���2��.H<u�l��z#�
F\���K<�;ȩW}`�잒c1�'x��;�W�e�c�|�T�F@�s�>_��߲iӠ��b�Og��kD:�|������g��6�jݡ���G:��^�Ra��jxa�5��l �X�I�Sl�70�:sbcF<)��Gw���Nd~C�K���D�g�'`�1
�IA&^��4�~�Ih	\ʆ]l��Y^��m[t`��y.Kp�h�i��vM)��		��xf��hߝ�!�+�u���2#�P[0x���4��ڑ LzѸ:���HA��s��I�NY��b�	���U2� QJywu�+���ygR$f?�����r	bث$�Å*+:�)O�Ƃ�V���ۡ�|���,H����@�ŽE'��f��ć�1���B-�5���yأk��wjr��m�P|L0{�.F��*����X*�Y�*Bu��,�U���`Z�1�Q�xX;CXO9�M��$��a2���AFi��1�	�����+�yW�x0��VS�.�N�
rF����
g#؂�a�TN�A����|vŞI'�D'{*hM���K2���"�c�8�'9I���rēm�<�t�`f3���a�>+�h�Y9�Kt��|�j��}��<ˑ�ô�n�h���{0���F�2�&cĺ�5�ǀV�D�=���\�ƍ�x?5�p����h�:�qXN+C���d�q*�Yƒƒx�:�b��b��*
T�l5�v�3���0��h�����м�^,E��"@w�z��砊�"�3sJ���BamEMXѥD����q9%ԗbXU��[�'���	�qUNG4�+��#���s��b?��
�s�b��E�y�ݷ�^��Ń[,��H�]�7
6�k�Tgś
���Бl�)n��bt6�퇻fFO�a[�h	4�%+_�G;�P�=�	6� �����D<��)����N8��#H���ժ��[�XE�(���0��t����m�^C��"�r��\B�4;�č,�f���ư��)%�e�3���T�]������
X�gx@� �<�
ٓ��?<c�Ѡn(b*4%P�V��=�1e��-�լ�x�
1ْ�)�>4�Iۢ�*�g��_�x��R�Z����W��m�rĺN�9��#���TW�X��|�	���#X����ނ�רO�����7i���ף�R����m�s�������viZŃ
!W����'w#�u+%��i��o�'��Q���_pLXK!��.��s,f�؝ǟM���z�����mĉ�ˀYĦ^�38P��wD�D�=E�N��?��N�k�	+��$ȿ����!x=d|ع[��o�3�-]����P�`;֢Ct�7��z,>�Y���Zp'-%�KС�eIE_�\��.~Ot`z
Z�춮��K��cM��ˆ�p!6x"ڦ�N��,C0�'>L�P��f���H��-�o�]�^(����F8�:~�c�$�+_�7/Ƕ�M��ci6���S�p��c��d���Á#c�Y�
����YʗrGg!c�(��FD�T�q0�P7`,���K�3�H}�&��8�`m����^8����D���;	�W�m3�zz %t�Y?]=��vT��1a�@ON�|��'�Du�!��xR�IKA�N'0PU~h�5��o�`]�P��<�ެ�?kќ��0(�#'kE•��M�h1ҖJ�b�6��4>�t"�M8������X1��\.��y�UpPA`D��@"$��)��\D��r:2�zU{<���^�FJ����'J���b�Hz�Y?o&��pk[��o8�W��x}{�0��!T��U8�0�,زd��l� 
y�o�-e����j%{�F���Ga]fju\�H�6�V�J�P�3'�0�l�t�\�#�HބQ%a���\�~��ŋC�F�p��e�V�}���Z0��ÝHw��1�^,��8]
��g��$
�&^N/�����<&p�2D,:3Mv-�VZˋ�Z���ܯ3�C�8�v�v����h�k�Iэ�n?����"��I4�Eq<��ܖ�YY��!|�V��ݬv����@�T��Q1�v�Oc#(�[H5�F����E��p���]�b^���5��(�VbXI�z���5!���R��Rl!���8�/��/��|��9����@/SqH��S7�ep}��˱e��^g�������
Qc5\���+���1��2`�H��
�3��C	�o׌)���p�{(?_t/�Y�3d��g~/C1U����Y?�Mw"z�F|'�e�^C���?��[5P5Xh�\��<�t%tM���+1!1�X��
���M�:�"��]�NlS�&�6�B�$f6#}�I�v�P�qv�2ͤ3tuU��^C�7��[��:��{�F�7�����{'�;�;�0�湺  �ÑZ]��jf#�u���Vu�Ş�v$	�k�1XgYg\���x�'�R�gl��������ʶ����x�.@oa�|]4
P`��omw�Q�V��:���v��j��]m^��@�s-�ޓ������X����F����x5����o�^-
�wM�X�30{h�;Wx�_#C��RPU�!TQ��-�[~:�6<P�e[͸����U�1_����>�d�!'1��u[t2"n��*��ek$��J^��I����h��U���bfo�3ٴT	�%O�Ǿc���1#����ÚZ-���Dt�P���y�g�upC9�v���5�w�p�?�[�Y�l#�7h����s����+.�jW��x{�9��	���|��pŖ�ӓ,E�ڕ``~�O�V\zƹ@���]�<�$����U��1��R�=��p���@M�`:�<j��>�<&�n�7j�#��6�b0KH5�
��q��p���3�eӬ_h��0�2<����w~�L�����*[,�)ȱ�'�-������e�_շ�=QB��kf��5�zƚ_�	��r��N�c{o�V�gLy��t>���-8t�e�KܗD΄���
O�a.�{�;Yf��4���=!����z4�'1�?��A�P��:�U�T�cs/�WuW�)�qBd2O�qD����ѭ�qP;�k=y����1�͂�8	��)�Pm�ʇ=��R��}�~��y~���Y<����'(���g�{.E�Sߓv
��%�eˋ&�Л��Gzw.���v,G"jτ��Gc�/`�D��a�n��W��͓��Lp��#�y��W!�Yc�����.�;vNd1,�`ԓ>�"�5����)~WPR�6B�U���z
/.��Pi龎Κ	W��O�>	4*xތaR�1�aџ~����:g���Qo�Pc[����9�Fp.�E�w�ֳ���?�6F'}��h���Dt���m4��}��g߿��]�n��n֍�����|�t�_�s��2p���(X��&kc��	]4Z�ݨ�΃���H��/�
gt_���P�y :���&=Pt��v"��wՄs@S����v�KiB3�>=v�׼s�Ndh���㠼�:r�¯���.&S�"�<��XA�����7�?Qݮ�]�~G�{g-k�}Iڊ�7f$�<]PY?v�`P
��>j�A!�Q�vlS,�Ή�&[��
?x�՛m	����2ו���u;3�a�V��HR�"N�y�v`��@�]T�C��!F.��*T���\+��0tuN�1Yv����U��h(����N4��u����x��=�Rj�\��.Ҝ�Uc���x��M�5ғ>�����OE�'�ot�%���عO�>I��wAy��;]?��6����*P滹�$�F;�W���L1��5>R���������Z�=�˭16SU�t�s�gm�j�4�S!no�&�c�pX�q�
s�'֍�2��?�B}20nc=Q����篵#_�$�9d
8r�}�_�"5u��/�H��2���9��-/~��.�����z��v9�e�_�?�}��
H��K��$�†�=���U$�b�Ù2P�ޤꮅQ�_���nJ�j@J�����U$��c ����t����Q
����_Z��CO��N���_4j��mH���D��O��Z	�+�g:��Х=�A�A�;���)�$?�}x]�7��� �`��ϑ2K�{��s.�;o�i�=��W+�M;[�@����/�w� ���q/��U9��`F
�S����z�J�Mq8wDw
B9%���:Z�A�ޠr��s�4�������'|I����kd �-��
��'�0R�>$R+:^�G#�UNJn+��'!�[��������,���𖿻�0�4�`�pTCѿx�1'�G� Zb4d�S�}����/�W��0�~�����V�4&_8X�Q��o~�]��3/V+|�n�V�ݹ�{�E��M)J{D��Ӄ���Z&�־���p�z�X���6~�<}���Dߥ0��/�j���D�E����Ğ,�%O|�^�[bCT�No���� %4|�F;L�Лh:-��F&�?PK��mW�vQ1�*setuptools/command/install.py�XMo�6��W��v�]�iO1`�;@z(��ES����]6��T6�_�7�(��:	�-��7Ù7tet�Ji]�dm3a�6�ɦ�Ʊ����ZI��l+
^�އ�7J��
�m�]�M�']�n��`��5�i#I�i��Z�um�䊽6R�4S]Ӟ���Ŗ��5��̈Z
�*掂����2��eV���L:S��)c���ε���� ݱۓI7��7��im'���/n�����$I��[ˆ��|qs�0��V�?�`���ӌ�0���;~�ɧ�R�B�B8$�Yar�:��]X�Ek�ؽ��u��r?�:w��k��yZA��s�;��!�W��v&o�Z��c���0
:ϻ�`�[�d�3�g�DN���K����
I�8lP����}��S^.��ԑ?�(3�8�II�ܧ�9�F4+
�7����uu�0���lad��G���sU@e)�����P�
̑N�Z�'�ք��jC.f��C�ϐI����5�@Tʌ����]=3X+[�W���A^�ܔv��w�7�j!L��>>�<(����NB��Q�:w2i���aU>gJ<�7���J�%�Ajt|%�E�_����q��z+���v��4��3J�V�)��U����(�YHЏ��x�&֏6z��;�t�h�:�ݮ���Ԟ�B�D��C�X]�U�>^����p~���2\��!_�+&>��,�`�0
�VP'�����]��A��d��6�"0��0*����R䊽:(m��r@ orEe��;����ST���y<��
;�-�΅�0}���E��|"�zkKi����6����%8وѓ}7gT�;C�p����XV���Ga�X�0�"5��U����$ʼ�ܕ��������Uc�z�Y2�MG����M�k��9+���Y����aY�V\�F��]?�'�oN�U�1~�	=�?��h4ۄ�r���H)<B�
�,ܠ�Y֣2B�;
���8L�����
$��v������4M$M��*e�)
�4���9�˵t�z7B��tg^d"W硫��y�"�F��f�A�u#GwM6GvnQ@
�'�R�
��[5�ftGlP��􌦞B�tGN�>C@c�E��S����)��˚ri�x�k�����%��1�>�{ZU��y�=�4�~��\��[2�5��*,gq_��!�n�eX�*����R��
�v���h�گ����`�K_a-�)���n�4�voo_�A��+��<�?��m�&�)X��*i()�P������!f��B��ϧ�lc4/M�׽�f���u���Y���T �u��t)�s��M�8I<7,�%]���˪N//�{9ZR�ZԴ�]��2�F"Š�N��N�2�

�k���;GQ1{����2�w㜂w?8�ͦ���<S�	e;#�0���1�IxO+�,���f��Z���(LgnϾ�S��R�l�;�H�5b�CW��:8L�~�J�s�E������>_�o��ێB�1pe)>d��jML���:�&�t3�~爫�t<��p��}<�z�O$N�r$Z۹����.=��:��6�{o������a��?L��b��jj�¸���Ok�I�
��?�w?�)/�kڝ/����'t�ק䊽}�����}�=G�	K
�
��p�����6�3}V%aX��~~'�3�R�fA�+Y$�s����"r�3�`�<Z�4�w'��PK��mW\Ҩ�+�&setuptools/command/install_egg_info.py�VMo�0��+,�PYrO�Sz饇Vꥪ��]���$����mv��V�~���yHeM+J��w�A���X'S��js^
�E�AP1���3f�?����|k[�����I[���fx�	{Χ�9}w�shz�<AP4)�F'�&��Ε�L���>�{`�Y`�z�0����"���r�P8c/�2V�"k��`�,�:��O�YF���f�@"�1,�GS5�x�R���|��ҟa��?gem*�d����#4�T5?���gFĔ��ѰRTJ��������JC� g�y��Q�D��!$��ݾ&�B*/ڒ��k�>�,�b�l�׸�D`?P���ުc��cO)�F:��i��9�x/`����d�ʼn� �����$h��0夥*	e0�;e����y�R`⇛�u�̵q���n�r�Ѭ'Z)U��PHi�Ą�_
m��(}�0��	�c%�����l�4x�%'QO���1C�����N�a~C�;�)��,/^Ƅn�WV�t-Bjߖo{\�V���h�-���o�z�������`�L���y�c(�JƬ�m�����8Ym��k2��.��՞�ָY�>�N��a�3��\*�i<��txVmd6[�#p��;�T�+H��?F;k�e+���2�t�NDD	�B6��;:)����I+���Rŵ�e�1���h����ьn$��̘vP�JS��@�u4�iR�~����C�x57�v$<��Y��ʝbMq�b6��D���MۆA尩���:��'��_���c_���K�ҝ�FBZ�u����iӹ�I�PK��mW,��,#!setuptools/command/install_lib.py�W[o�6~�� �[EX�X 逵���b�-�\(R ����9ԍ��t��"�;W����1m7b�e{���n�p`��Ҳ�5��J�1�ix;qTº�	i�R7
WU.�HYH�g�2m�a�ٔ�[�ܥt��m>��V�c���l���Ւ,s���x(�fJ�믽;j��-�n��
jf:�Z��(�z���U��u�<3��G�
Q/D¢V�>k�\z��'�����e%��N���W=�o�h0¶�U�%;	w��
���Q^:��[\<�+�[);�hϽ%4����b��JG�Ut�V���m�;z�0���*
�6�
u�P<�!��fB����T#�|�~�2�~��'���
��!z'��xL�z�
����� j}DjKILj��ga[(ɦ1�Ӑ9���%��,�-"̀�����|#�d����� �+Bϟ�Wˢ����@�-gT=�����#�SqrG�&�lBI�9�[`u'���ж�8���!��.M�d�޲����s��ͽ��jx��0{�� ��N�
`�آ@v����1�},
��Y�$�������}�.26��?�Nj
OG,d6Y��^����j�{m�J�R
���.�j�$Q\#��O�|�X��\�)��c����=���T�_R�i]�4f�9	�����×w�rZ%X�MO�q�\�”^�x�D9"�]b}��ں@��e-�6�{�8�H|�֡�@�r:���5	��K��AC�g*
D#)t6_ˉ�=����y�,�j�H�N��2Y��>C�L�����٬{Տ� ��2@f�_(ŋ-����ñ�Ծ@��KJ����R1%/�� �{)�Ƒ=
�i3��{>� �1�ՙ�P�E����2y�R�c��Ι�0l �bIh@9_9��R�,"��k�ƽ3b@�h�RԟfSlɨ1�������޲䒃��~�N���Un��e����m_8�5�C�j�t�[R��,�g(0�p{�-N`&E'�o�PO���I����
��M�JH�m-�(�+���TX�>�[��H�������E��W��hȪ�X��o�jb��j%�V�����t��vȹ��~���!�)�L��Nm��y���ȥ>,�U=l��m�ZSf��9Ã��!��ѣ��'nT��m�-3�Y���-f�n��d�Y��c���&�%0B:�R��Ty}���8�ɵ��:�$%��	���-�X�0���E�y@��RBlW�)��a�`��Ԝ�st��K#�kU�P��QS�';�e(�%'�+�@��PK��mW�}���!
%setuptools/command/install_scripts.py�VK��6��WL�SU�m�{��C�9�-�dv%R �u�_��AQ�N�As8�|�vct��nt�� �A�n���ʊJ��Pu!�u��J[98‚6�M��@c�Y��/�;���ń���^m2�Omi���T�y"�r�*�:Q'r@eG�e-
VN�k�$U',��t3��1��i��AiӋ&Ѣ��Ѝ䫺�m)U��b�0��_Z�N<L�
�I'E'��R��f�f6ğ�x��V-�U(]���Yt�M3���%���i��"
{-g�B�Il���q�.>���l�w�&)��G p�ӕ,�[f�4ց�L�aףkd�v�C�8F��QP~�����W��j�kz�|�� �rK>IFl
r�M�o(�F���,��&��`��l��E�im+;�M�̢<	�q�g/���t�o�)��ϟ�X�U!�<��;w8������2�Ī�=��p�db��N�:<��V)!q�N���G��P#Qf7���`���e�R��
��-q��B�٣o(?��W����m�S�.������=%������l�7�ǰQP�����|t�F���KU닽ehx�s���wΣ���
�a�j���WO�"TZ9A�A�DE�3s'��4},�^:��P�v�G������y�5�>3C�,�V=u���O���e!�S�Ͳ��J;�]�V��/��IH�F��Y�`q��Uƅ���B��F���7�8wV��u�a�GB~���k�pN�ms�u���Ksx/[ZrXo����EAn�@|K����X^x�����f�mT��
1�!f���&)��(xte��F��첏��;���aZ6��
r�i[p��Ј��#�ݲ]VK�˞&̄x��>��ɢ=����Js�����?���Q�.��Y�CzI����é\�%�{i�i�Y|��"�www��PK��VS]�)B7t(setuptools/command/launcher manifest.xml��OK1��1 �!]kAJ��҃B���1;��g�ɮ�ooR��R*&�\ޛ��K���������
g��[��AL8� ]%�wP����A.�����E����覤V`%	�z�u�۩$;�F�Y�t
^��׾ڢt菈����j�+ �8G��Th1R�M��9��Qpy��k:�
}U_ڍoy������=+`�i�V2DPF�ZL���F�QGC&�����p��g`�m4�xyD��V1P��Pw��<��Wu��e�#t`�Ig�%-\�?9k�\�4^KC�|_)��a�c��~�_����oPK��mW���3|R setuptools/command/py36compat.py�X[��4}�0�VM�x@Z4#V����J�x@(r�5��vf��z�g'ν�%m����s��eʬr���X������4���01}��*���I��i�K��ˬ�ZY�Vi����eI&r^ּ_1\��}��w�d�V�2���J�p��A*�Ƀ,���S��ej�*�{�
֤�t��=L�엋=���x�V?*V*�D&-�'2�����yK�k**�*VW�b��I�N8Y��(� �=�ϥ��g{�����|�L}p��7X��KdD��<;
�C�1^NJc�,�!+	ӯ6t��c�~����'�]l_�`�����Za���x�l�j-Z^�*��
�y*�LfR-+;���t�.���?�LsjYdIu�-l��QC�4~����� �Q�N�&�<��9���/C>q�\KazRX8ܞ�,ʔ0���mz��Bh�U��\C��Y4wH;���`�,�AZ���
��>��A���ʇi܏�p��d�����W$��v�`������uLwh�q��: Mpoi ���Z����B�%�q�*&�
��_��F�

+�#$s�D����D��
�����&��$�\�]��J��:�u�~∎Yo|T��IR�D]��ˑ�
;�'�����F�4���g��/��8⨋Z�V鮎�x���'��{�.�K~�]�B9���ݦ�Ұ�������.�Ĩ���6����}��iy�)Ubz	Y�W��zW�Jd+k�2D"�i5Q^�
@!Fg�H���#/'+Ge��YMm��/��i��%���_�^s�j����
-x/�z&R�z��F9U� �h����mt�{fN�.2�h_T���Ec��ݳm�7:XDS)���Ō��Ӽ���oߙmGš�c$x!B�eC���a;�߹��F?|�B��k��������\���n:�!#⇌��
�HܢoM�y�a�B-�6�	0d��C0=T�h�6V�SN�=��z�@�1�_�%�4m[�v��i�Ҙܘ�4�+��&�8\��4&G�؛e�U��Rۿ���sC�6,�Y�n&� ��	h�[&�4�a$=Qwu����M�-�fA�(ި�ZE�=ͩٔlԕ�`N+e�z�9h~-����6�}�!kꮴ������%�e��D2@���kê�7tη2�~�6��7(V�]nF�g5/��n0��@'ً��oʳ[�h8Izg�.�ވ����/��)]���o7��K�(l�إ����
 p�J~/W��C��ĭ>9���)�MN�v��%n�/@��^��|jor����Y�~>��
�<�}�W��}b�Xݷ���������G�,3|?sY8L]��}�.�iERK�O��+W�PK��mWv���setuptools/command/register.pym�AN�0E�9��U+F�+4H�fTq�к��&������	�;��;�<.�%�9��8�L��ӣgz�ކ�0NRC���MJ��0/1�Md&>`z����[~.=�T?۔�U�A�[Z�gb�<��$ �!�h�w;�Xp]�/Fn�M6���*�<�>M��q�&������,����9?��?]�ba�3���h�"��sLm��5:C<5���]R�#-6�
���c��]w�Z�Bǧ�f����ub�w�DR�/PK��mW�!��Psetuptools/command/rotate.py�UMo�0��W
K��P �u�u�]� Pl��jK�$�K�(9�Z��_$�'����R9�{�8����X�ѿ�S'�%�V~�Kc�,�5vrx��2�k0&7�q㓻�d�r��3g�b�V�2I���΁5^zd��1Zi�>a��4%��Ȫs�:2&ѫDWX����݈^;�kx���<T�A�F�ޡ=���?�ŲV���r�Z���<�����hf�W�,�<�"0�ߕ���2����+�^�"��I���	�#�K�}{��L5�լ�T�1�C���|�zY�ql_J+�d��pt`��6��«��óѸ�
'�m�茆)e���j�S�>�òR9ܔ#[�E)}�iܮ�BUW (0ZC`E���a'-I�䷙NSN��Z@&�T��L`]g|���j���h)k��t�iOp�^���(���>��;?d�c�
�(�v�
L�R�DX�M9���PNi�.��#΁D�7���;܍ay��N�M�1N�?�Y/���Y�g|s\+�ΩS�I�Jc9)3;y��6t�y���3糬m�7�}?���R�I��,��T7�<��9�͡�A����
]��QSmZ��8|��SFכ�
b��>�gƉ�\�Ө��i��c0��)��^Qފ�P
�	'��z����g��"��Q��H,��҇2z2����94�Y��3�M��~����?��;󱌱��;Y�t��k�P�;W��۰�D*�ǻ9��T���*�������C�7�q�>%�u��K�PK��mW��4F�setuptools/command/saveopts.pye�Mn�0���¥��r�9E�U�2!����0UU��u2�a4Y!���9:x��D�
��[+��s�/�.>DP�Qz�q����x����F���:5�f;T����w�B!�t�0��bU��"0��u��bPM�߲�^�|�T���n�i�kH]��2Rdx���;�eM�]��n&��U{Y�(i'@�[Xc�5ܕ����N[<��A���Q�x�ɻS�Y�_�V�n���#:�N
�U�v75�X��ذ��Ǩ,5��x6Ɉd�.�����Yy�%=�V�&�;N��࡟���=<���>-�	���Օ=���W�V�PK��mW�HnYsetuptools/command/sdist.py�Xmo���_�:XHBa�A��)��z���"ɶ����h�gIH*��p��3C�P�|W�@`����g��kU�B�ZY&�Fi�JuXu?�gi����Ej�qÔ��2�/s~J��Umū-�n�ڣʴ9߼�
��R����
��miͪgoN�L�Z�8�	��9��d����j�/O�����數���Ê�g�^�u�xY��,�am]̀A�j2U��~�4
��ԈTZ�3��Q��&���mc��X��l/Q��5�Ҁ�By�IKŋ8����s��,��Kn�Q<Ԇr�23��P�>��!�h�a�>ۣ�̴
FWlw^��U��g�m�1����[sm؝��f4�="�]Ȩ��ܵ(��TM�F4\s4����'�$Ds
�7 ?:E�x|>B��q�Z���r-�E_��;�Q>*��jQ�5�݊��Z8�U�̬bMkɄ%�: 3��D|�r������K-��v���3�LG�^��}��rM��Qz�j
�I�� B
i9L�|��9�yr�S��>����q�ۏ���Ͷ�~��=|����*BsRm,}�W�]ѓǃ��b�������(u��$�[_-}�&q�"t[�F�{����γ��H���*J"!��*�
�>�=�K��(~���1tX���'�t)o�I%��3q��� =|�z����,	T�G�#�q�?~��}[C��Xg�� hȨ ���@�h��f��%x:���'����[E��0���Jn��4�>6�@U��)�O���#��\p�A�6��r�?�K&dr�(kEU5��J��ߧ9������ʥ԰
GO/f�U��'h��S8�b�.�Щ������j��P�ݤ�Ӂb�=}���P��@o6���� k�wA}h���ʼ��d[�4>����~<��_J�:������t/���iQ)&���>���e�!�ҿ�Q�WbV��q�I���� �˺}c��!үM�x`t���q�ȏI�@l4I�?nw�S��e+��6�d5��왗^�)�-"�C3�$���O�S���1�5��[��.pQ�@cw#֖	�?�-
�颧�1N��~��U�|��
���l����¥��#j΍V?�*�ZU����S`�s�ކ:x�_ �4��[~�����6=r��j�U�h�!l�]+�t��L�ɢ�W<�JGO{Z7uh�r�'��y�َ���i/3��!�f��B_n_��9rdet�bux�a�C�9�Rc��=⺀.�Չ�m����-[?�:/�Bd
�O�d�#�a��R�:i40�0�h�Ϲ���]ҷ�̫��dH���$�Ў���(ܴuQ�x@X���\��)����9��0���t8L2�tO���	
���![�=
��ž
��Eh����	�6V����Fl�Ц���p]�k��q�pY��X�68��y�ڳ~�[�6,a��>��.nv�d��� J#��\��a:�ׅ[	q2P5}`�Z�Z9�T��2����]A\�xnLk$	v-J-��U���
(,�p������Jpf�m����2�^uwv��!�MNL��E¸x��L�bT��k���M���`�&��iE�Af���hwq��u��3���@,���h�N�]\#!�B^�ҭ�ȲWP�����/�ݪ��S�L�����A=��a�z�3�yL
$)�7�ؓC(,rg�4ivp��w"�e�zνS�Ƅ�e���L�!�S���z�(vkg�0�`�.e΀ť�}��t�۴DK�*�J��Pz�5��LE�%��3��[x�"j��{������k��w����O��jxE	9R���#�����TԹ*D�O}T=�|aK���TA=�S#�Ӌ�h�tW�~�\��e�,1!�dA�lz
��*���n���;�#{q�!�Sq��?\N��GoL�ްi��0�RZ'�N�[{�����U���Pa_?_�9eB����7�q6��5W5������`��&��Z"�'�\y}���{��+H#�^��kfN�i �k��t'3)蒬[�.5^Ϻ�4T��ڡ���)n��ˇ���`�����rf㳹w�v-�)�~�	K�Rl�PK��mW.
n���setuptools/command/setopt.py�XKo�8��WI��b��@�v�����!dZ�ln�)������DZJ��r$�|�̓�Q*�5��r^��7}'Rt�C��ᴪ9+Rwǫ��	�	'��x�~�ŕYs:�E��?�TH&Vڂd��]7�5
m��*�i]�9ّ�Xk��Y�!1+���w��)��J�
��&�_�V%����|�m��ꮠu�ެ\Q��2�A��6�t�zv�l�Rِc���gb;�#���h`O�Q�8��27$���P;��/��ݎ�J'��)�*��>+�c<S��s�Nf��쟎��[�ˮ�\��ɔ�\,�S��֙�+�@�<�e7@���
*
��1���8�1
q�[�؃B&~�&��ֲ��"�Fk��$(���E둩Ҝ|��bH�p�K�����QeI�C'W�m]W^&�r6X�o�P2���blw��Z���>���jFA�tU呡#�-�ddoa����3��K^��/�ęD���Py�=y��/��Jr�(�Bo�w�)-��3Bn��H�h+�T�j60�#X;p��Q�(��	��jȍt�@�oq��hA�X���J��)�[���9Ns6JO	f�&��0���%]�ZBNm�t�@ӐP�~��>��{���zN&�Lw�Ǫ
hմ9��<ސ�ID����Z��ʠ�H4��H�pe|`�L�i�sr�`@n�]����=�ɽ[�{�ag7�ܵM��XnD�;	2(��>�ka�+��3�P�*G��JQ��!iH����hӲ|������T8��us�7#���?��xM�Y�l-��<�qU$S5�aq�1�0�첞�R�g���Y��Q�ޗ=�����/y�l�5�a߅�2���'�H,T���d����B��Τ�LW�
�\�-��;ky&�樚"r��	PY�l�9N	�½���3�`I�GcQS)�7�%f����ۃ-�ԅe�pw��I���0x��莬�K��
��ܶE��Ĝ��i@���9�􁹆
�ÃM�홗�Їs����z����(���p,���`��|��U��<52I`$�c=��|�Z�{�L�p�.�l��MG�BEњ�k�
6���:>f��H`�g(���̺��͢cP�Y�VQ�ysfa=;͌�����h��3Hϕ���X�s�ù�[t~��p���k��8�W{]A��g�S����O�yK�~��[�����m}Q�Le���`�`%]��
�ä`���`L��5��ϸ�Mc�ּ
�7ջ׶���Bp�v"��/#o&<�5q�����|�@/v6CDu�B��$��~]E�W����lCQx�UG���x�3��.֪��>yQT��z$��X���U�'o�3"�}~�]��׫oɝ��>�c>%����R��l��K�\qiՄ�]�g�,;�+��g����/N����po��
���ٶsS<,T�F��i�
F��[��Sdaڹ��=ؽ� _g-��
�����kZ@'�������oڷ�ܲμ�|PK��mW$����	�setuptools/command/test.py�]��6�ݿ�� ��8����|Hڴ�mls8�B�%�ˬ,������̐�(J����V&9���<6J�L��to�мU��m��V��V|m+��Wd+t�T5�jٶ´��VGVJ�v��L&�V�0w�m��#.����V��V=h�v�����(^
����C��Q�.������y�K���U���]��>�J�W�
o��ڣ��>�F�vA�x��V�G��C��2�E+Oy��D-�����Ǐu����]j��]C��)�A��.��"t����6��:	m��W�UQqc�o�k`�
,e��E�س<� �<O���n������pe�I��d�6IW�
���	X�U�]%���ǚ�����{U��(�n�q]3�Lș�3^U��P4)�5\,k��v�'Q;ԫ׻=m�e&
�lx�p=�p����AIJ�.��瀫f�?��%j�W9�����5�
8e'K4�"ҖG�)�ZEk�!�%1���E=�(9kr�e���I,�t��Æm�KoQ���dO)6��� )гNz�G�Ģt��^��0���99r����l/���_��5?�<4!��1d@�y��}g�9NIɄ�/��n�Q�R��S��,�bx"���˿��0�ʈe�@^��|�p�_}2X���."�L*��#˺��Ǹ,xbx��d�+0�J�	����W�B()����ҝNΩvptn��c�X���� �԰�-�4UWgx�������)�9_���(\�5�r+��~�[�Ѯ�]DV/�qP�A��>�W\�῕?0��B��܈0,�Xac(n\�ja��N:RJ1q��]��-`8�]M��E&��TN���x!خ�U���1b
-���oeI)-
�[�:,�:W��"�I#����61��#<�[��vrRxL����KP�=���Dd'A��	�*���)bMI���YSKDvȀ*�Ii4"�)�����R!�42����"j�ѓ7������UX9��G"@��dD�CH��_Q����Hu��{Y/��[rH#]H��ď怶���ؑ������P�+W�`b-T�-۩�>�:
����B8�ҫ4.z���X��.k�V����Z��	�r���'������)_0'��g䯝Gړ`��/wF^5^�8E'n�Uv�|���'.,�I�ɁA�:���A\f��b4�?��|<�z�|~0����Og�aG�m�����sÒ���?�B�,��,��g�ŝ
��A�|�v�`#9K����W,�rH�_D��@:�A�d�Y���6+���Y<r]BMs���l�T,����r��4.��@S�z��̽��Bã/3'��J��ř�.��`u���$��5���3�=�WlWkC��O�&�%�%�f�Z�i!�ͫ�

#�G��yq,�`��M��2꩏<@�H52^|���M���Оp�@��9�)}�j���>7$��I�AbO��Q��
�6�n=�6=��,ƶ}z��"��qWr���3s����j$�s��<71{�|�/X3o���g�Akl��I$[�ǻ�ք�xX%W��=��{�ΎJ���\��~ה(�
�I��+
�sY0X~��.ȅ�.ğ7eISY��*[��.�^�(�?�����?���3�IjUE��N\K���m����B
�]
h���`�A��Lj��a)�F�x�%
Wx�д�
��NE����B���s�F���R<�)-������x�"��4��� �?�"��k�/��EA�M�E�:	�vN�S�jU�g�q�42	&�5�Z��Z�j�,L�w���1�;��׍B�@�����b_�����Y��@
�j����+l�\r_�
�rU�l���c���؏�'���<uw���XE���iO��|���>�(�mp/���9�E��{���K���e �yrd߬���v��Ćh뙢�>Q�i6�{X�F����pM�8�df��[7��q�`��<l_�x4����I{V�sp�ߚ$�&��ʒ�Fz噘�����w�uCsvc'�mdt
:�8� �)������ͥ
����iSn�
5�a�R��H������ D&�#k�+Z������y�w��P���_�iA��U_�h:ɨ�!Cֽ���Zۃ*͚�+�n6����b��f;�ZN���g��Aa�y�M�b����%��X�MaMd|P��zL�pئ�
;�&�?�e�A���W��j-Nס�F2�Ta�@<�d\a���w����l��x��h���+�*����Ybc���:�"�h���O�зvv�Z}����'���z!��Ƙx���Gn~�
,��]��Ηb�����0[[{(�X+��ɽ~���p�t�Λ^7�$}aX��{]B�|��8��.�B(��.�s�B���U��˚�(�����6��.8�b�:/�]��دM�=���
��Q7��$���@,�](9�91$)��PK��mW"]K��setuptools/command/upload.pym�Mn� ����bE��GꪚJ]�(�hp2�#~Z�d�v��2���gY�&����XO!�L*r k��{G�3)
*3��;b�>�v�����ꗍq�5��0��$Q1r���A9��W
ü@��!�>֫�SMk�\�d�e�H�!;q�zl���q_��7܁�v������9>�ɐ���?��	�q1a)�[J>vm�o$����*n~%
;�jR*�(�?����b�{�� �\s(�2��?�)��a?PK��mWm�� 	2!setuptools/command/upload_docs.py�io�F��~�@�A����I.l����I�h�kˆIS�vfGY��� ��w�� ��w�o�,�[�L���Fo��7��|�ԅ��*���ޕu�JViE(yÕn4/����f����UNb{@�A4����3�5SD��D�hE>�?q��v�*���5ORd?�m�(ɚ*���R��8��j��U 6�Py+�,�vp�2)�lZ>�(�	�ܙP���-��+�7�`�Q����vH�?��RQ��6M��^촮Ӭ�`���E��iM�b���v%���X+=_�ܯj��+6uV����l6�ن���b��|$Ӎ��ž����T��R͘�h͢(dU��vv����sNe��
m

<jr��
�	WU��jj��d�'�S�v�Q��Gw�ȚAL ��ח�/Vg'�>����x�OrL"4�:z����<��z'�Tȭy~�f�Hn|�(���I�� �(W�T@�ʼ�Ouj�=e�h�\L�&4͕3�9P7sr����M�wK��`��WQ��Q�_tqW��A�~�P�`��gQ���̹<���d��d!<֍�^CT3Z�p�'6dG�J�;^}�+6.���7ߤ>X��X1�t0��IXMx5΅8���#�~X7���(�2�B6�J
�l�	���>�E�Fr�)�+�9-�W�*��s`7�ı1D�XS�e:<n���!bL��e�x���F-���{����(���y��+5�J��^�Et�#�
���!R>H<����]�D��ʷ��y�M�#4ɐd�g�$+Z�8��2b,������A�0�|W���@�M館�eP�}��X,k��:&+Ҕ\B	:�xԕf{�A�Ӫ�'A�K#	�cD[�`�8�t1�I,W�U�P^���
�V���`��q<������F��}¾�G�4�1��j�B/P/e�S	rG���qd�ː9>��_���:�4��4��+�xo��9J0�w�O���3���П�Ґ-���!��`����3N�����?��
\:6�MZ(
SA�I+VO���A�Dp,�%���NB��Q��!ց��Rb���
�X�l�aDΚ
��O?�ge��Vn+Y�ۆu��}S�E�Spb�\쪊�!r�w��.B�'K�n0JҒi�SM�(��%S��3��Yy�R�I�o��TO~�X��xؤ��̟�RKƼ��LW8Wf��N�V��È�c�r�����}�[�_�ϴh�)ʵ�Ot]�CT��%䡩�`�#�z�D��`,t�c��A�x��FO����b ���{�6
�,\a��X��|R�wQԊ~e��ҼÈ���Qb�cA4��M�Bk��?������^=�aY����C���7)���=g00��8��F�)�������'���TV.,�V��ӣl��ZFc5����&�&�HJ*vW�
������|����lv��h�1�!�
z��p���4#US�����	����v��\
��ޮ���秷翜���Oo�_�8|~��/�Oߞ��z���|�:|���a����1V�\F�C�S�qfUb�:��`1u1B��q�۽ܤ
`�=^�~�\N��藣@�����@��V��F�JZ�N���'}W���F��(�R\'QKI�P9�I�|�b�o0 jZ[uh��n+��M�k��qP�Z��l8�<�׭�ȍޭ,ɢǡk�a'�w���zGD
�E71Fr%xU��'�c���A��^��&�B�@��G9:��GGf�X��JH2� '$���&�տ5Y�����(�}z��+h��z�s�d9���
������(:�d4ok�;wB��=$Ʒ�q��9�Nd�������m֋]�Z{'�j�)w|��H��Y�\k�bF�LН R�u�.f�z���ǀ�#�����؟�Fup�;��o��2�^,>#�U3F3������0FЍq$��
t�����z}V*۱���t!��Z`��%$5�b��H������u�g
����P��a�ˢ�w�n��{�FR���0�(�
ײ�ۋ�O0aṲXl5W�1Q�0���$;?����nY��N��g'�nD][M�(e�Y��d|T7ڹ=�c��7��b��I2;�~LƑ\:���i�CD�G[�T(�1�w��I�m���SH��d"�b�O`@RX5e�˭sٗ����Wv���6�Qn����'gg��l�꼈��a��_���@�G�0�=y��m�Rtnn}���@%G�V%�@
���Ėt_YjMQDy������v��Q���"ȵ�7����x��
�!p����.8e&���j��)k{J~��D;Kyn��u���縡�h�[1��g����_�Z�J���ߑW/;�U`�q��PK��mWe��g	setuptools/extern/__init__.py�VM��8������B��ۢ���\bW\V��$�n�6��L���[e���
'�nu۩z�zU9X���GɇfRҒ���V	��gНq�������߲��>��^�b����
~��>1c�4Z(5���hb�ܣ���6R���C��8�g�3s����z�����q.���T_o�5[������-n���>
U�Ey7�3�ۀr��<�2߬ny�3�z��l�X%Z(x��fO�E�����XpaZ�{�=s�~$�c�$������0���Ӗf�3�$b��܄�$���sV4ŅMQ�4�nT��3�(K�S�Q)��9����3#
��g ��Ƥ_����Hq�ك���n}Dc��tY^$=�ز�á�6!2�;�N� l�P���Q�s}KU�E@��Q�-�=
Ad�����|�j[�M�"��M�?�m렗OL��x�]�M�](o���3��0W�Xֱ�`a'����I�7�&���,�\Y�m�_���l�_ނ�l`��sθkr��	�Cn�u�By�p��\�H1�Y�5�Bw�m�����x����N�?��4���
��dFF������k��G����;�[ޝ�ɇ������g�H�ʗU��]}�P�y�x�:��D�e�fM��
����bӵ:���tQ�u,�8.�ʹ�Xg����ҙ(V��Xly�J>�
���ȉ0�r;Vl��o�b��f���(OF<V�]��9���r�Lf�-�_jlL��𽀧��>vP�0��Du�A��Mj&����Z�n5�Zs:.��,��H�E�<�v9?/��`b���M�S�%2�(_ԇ���1���)�聎����:��%n��PK��mW�Yď`#setuptools-58.3.0.dist-info/LICENSE]QK��0��W�8�RDy�,nC9fY�y�*�(6E��;�W�H�g�{ͤ��:�S�W�z	���&0V���BpXuz;��NS=F�%p�������M z��W�؉h|k7��5�(�p2�H�1����pu�u5�A���َ���wt�
�-����N"���n꽵��b�&��Z�Hp��yxk��
gs�@ί��ξsG��9���.�	t���k�b�bkGBa�~b�18�=g�p7ϐʅ+�uo�?M�;^�%��<�lV�c�H?�a�7���s�(�d�`�n�_;g��u���-�.W}�B_���>��nd��8ɇ��w����f��c.Q#�Rk��Z�����Yf"���H`/�F���9�Z/�[Y�Ԣ�@i&�e.�d��LO�B\��r+
�$����"�����|%si	[KS�Zi�Prmd�˹�r�KU	�ϐ���Z��؊�,Qk ��Ն�9I1�C���A�ʃ�O�g�+��*w)��\n��?���E3����FP��8~�����*��g�)�y��e%�ZVh���BzZ'"�L��B�Yh���"8B�]%�	!<G��!���PK��mW=k����$setuptools-58.3.0.dist-info/METADATA�Xmo�6��_�����8m�ju��I��i���ѡ��̚U����;J~w���{y��;�n��h#T�np�]�"f���UJo���]pt�A�e\W;�FȊ%j�Kœ6*���˥<`e�j���y�ʼYgו���<������/�1bk�a*���¢*x��Dn-�\;)"OY�!lՐ��q!#�cK+��H+[�t�]�r�Zo/�\^�}�]k�b��~��؉��r�-�D�Bh�@�bz_��+������/�J9�45�Y�s�!�޵�v�t��ї�1�V���*��
KiX��`>C�I�7F6��sy	z%��@l�0��m�������j������f�����1�YF~��yZ�Q�2(�t�Tz�>��ߍ*DL;5�s�a�!ai��5i_�1��*c!��cOČ�"�㪟;N��v����/,��Rh0~
1b{G��E�gBb^��O/���3� ��=��Xښ�UJ������������ʀhX��^ًm��\�X����{t_=Ω�
�ȧ���0x߂��f�c[3�n�XT)��u9�%�c�^'�oZH��1���Ĵ�Un���[�	�g�Z���1rg͂��|;�
r����
��юO ��~b�n{���Sx�$uj�rȩ`5)�	ۡ�T<mEX��n��Lh[r	��!�K.�<�a[�n�K;��@���g[9� �(��m�ڜODo�b�=�m����G��NȈ#t��B1�XԈ��͊��ˢ�a���?Y!ay���z���ճW�Oi�)���?��?�Hdi`&d�zl�D8[o>�,�c��:u��
*�w���jV7w�I��˅�x�G]UX�M�z˶��^�M�t,�܄�"�x�����k�̧%誷���y��D㯓ɥ�k�~�[�sx�X%��1��Pg��q�VH�8t<+�}�ǜ��}v[-�����cF�1 �Hlbۛo� �����!^�t\�s���TiМn��Fr5�0aܸp'�ǦL���P��5?�K_I�{󉰰XCKz��δ�ݢ�qv8o��}r���}d��ސdʑ�N�p-}1Mݑ�ׄ�6U�z[[?�V�(�4�0,�;�Ǯ�ы���}X�E#�ƣ��p5�x7ĩΉ���[��a��h�,p��BCҕ��D�7fB4X%��YRu$	D��q� 3Uʄ�+�U��j37�<�F?jl%�Q�N4��-ě4-��dn�}.S��P�{ׅ��Z�J����6��0W!"�	K56"l��P������p	c�~��\aPc,9
|^o��y�X�+�zO=4�	�J(k
3ƊR~�
��I��9��	�L+��:B�~4H��W��XI���ǻ���-��AS��`QQT�ur:�:��.On�7A�4֟aF��]�8�n�~<C��L2Nӵ����YL��cxkY��#R`�K���V��=���@/��`4��=B.��
+5�z�&�BK�l�\�p�/��E��4hq(�Y}�Y�JV@�w�u�}/j��֌1hͥ[�yVp��:HM���
���4�Xܨ�0�yא�J���#�����&�W���K������
�C�d�te���҂W�s�Xܻ�ю�2�&�z�PK��mW�h�\\!setuptools-58.3.0.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK��mW�$�|L
,setuptools-58.3.0.dist-info/entry_points.txt�UM�� ��+�4����[ժ���=��'Y���z}�b�|\��y��Na�Ҹi��(M���J����л`��D��'kF���~��a��$��xKB0�kz�;�j�T4�3��=�̳�$n��p�
�	�u��򴲸ev�B�a�-�0H��U%��/��F��n��#���*nY���C�S���vb��J]���yd�u��ia(O`�qf����V�#��L�
/b|ZX�����N[ىζ�</lƶ�e���qt�t`ځ����^$"� 0xe�ĢT@�h{�£"� �Ufy�QѾA{%��{�����"�NYU�$R/�2��+�h�F�P������M�J�#�2�HQr��Πc��ۙ��ެ��?:h�N�gS�<��p�X��ut��h��7�	:�j���B��%q�~� >�e��̉��N�F��I��>�(wk���a�yBnΞR�Ԉ��~|�����;�<�;��l�M�݇ك=���H�Oѝ�7"хm�j�C]L����HQ8�������r~8�uy['�x�?,'E��;UB!�)C%�A��ƹ��Ħ����yh�׷B�������)���W����c�PK��mW;���*))setuptools-58.3.0.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PK��mW�����4"setuptools-58.3.0.dist-info/RECORD�zɒ�ز�~�V��L�fP�D+����A4_��<7����9i�9����o�/�ۃ��!-z��B?��k�d�'.��/j#�X��֣��]*��w�Br�$E��vM����0�?N�'���~���U:8�o��'�э��O{��J�v��f�bX4����:�]r���~��$��~�]��&7:= p�h�L�����4��>ڪ����*�z���i���¾;?�;�����8%)��%5@
\Z��ʹm�
2�'!
	m�$Ÿ1a��w�(�rZ�����X�Ld�Q���d�o6�$��`�7�n�i�?�2���DPj܋h�7g��!Q����e62�y�O;�	�
r�4nקU��]�ɐ�~�ĝL�`:���Ǿzdk��Xl�"@����w�[��x��z����Իv�>#,��y�c0���ݥq�8/���_|����`�X��}�)��@PȄ�
0���r��9O����wA}2��e�O�{��ͅsn��	5Cnѳ	�� ���pK���AL��D?t�?���<��ל���-q��X��z#kF�
�V������I�ݖ��K��y���Q\�a�U��U_ζ	c���x~�F�Z��)qp��DB�6Q�]�$�u�-���2A΁�k]�+~>�q��}������w��Y]؎i�a5<���*���IY�h�	2�zU���i�1Kx]BKd�P
~[���O��kF��
9�g?�.x��8��>>�����Rt��W��!������ـ|�.a�Nu��9�Y|��=��0���A��KA�:DA����?X��Q��xT�3�uaɱK8�$� ]�=��I�B@��gC�4�Qu���3QU^	(
�:m@��ü���>�b�r	�Z}H}���QP�3��v�wō���^��n��ḡ��Cـ�-�FG�}z0x��ԗ��~����\�����?��>��ֻp-���s+��9�e�$1J�d��f�U��ɭK�����.��9	����΂�2�r�ZL����B����p��;�����6_;��U�����O堉�]&+*K"V�	�Oܐ��7U�r�[�=#���'偂�^:�Q�b+��T���n��S�Q�қ�)���$}��Gҽt���U���Nb^A�s���
��NwR��� A<CzcZN�3q�#d�'�4����~ij��Rd�)�;��I�4�L�xү�(}�]_R���w�-�1����%�0H�4Ok�s}N�,)�.+m_��3��ϟ�ggh���V
z�����
3���C҃ �v��[G��'�����5";83���(O�	���So�@Y���Ic-p���K
~��'(�Tu��R���<�Æ�!2�ړƒ4
�O���;ɗ8l��~�B�T�BB�|q36�۪h��ﱽ����rݛ�M4T�0��\^}"
Y�P��Ɂ���d�Dc��Kd��.4|�೽�P�|����{��j;�.w/6���o�٩��3)\��Z_���|���K8Ӫܢ�������\6�bHqT�}{�B��ܡ:Кp ��Kp�`���
w���	캨W��CW�����xɺ�.�����3m����B���>a�u���"B`����0���6ڄ;�Uud��Q�O4���-����?3�<P�NL7u=>m$��;Om}2�	���Drk�m�zƪ�2�7&}�/���zW--Ό냋)��}�Ώ
�i�\�l�D�M�R/Q�/+o��&LC
5׻�,v4Q��k�~���Ɂro]6S�YM;�"I�tA�/b�d)�x���o�,�K��,f��Ms��Bs8}�ߍ��b�x�&����x�N")P��mqu��bB���y� �Ztx���̲[oE�{�K���O>��oC�ulc�VF3�0�n�w�J��.ؾk[��0hg����|A���k�pU`�Xo�LC��!�A[	����҉e� �m�R�~��s�]E9Ԩ�Ot��ؾ=\��i�
g8{K�M��n|��9_�C;�hk��1?هȾ�E	��W�
~(p�xGʾr�_h`J��A�.9b�1<eX0�;� �{	�&�
]�!���#a��[�-��w��i��9c0��ڋ
��k���10�|��م+쨥�Bdj��v�*	�s�SE��M�;Ę�8�.\ӣ[K�����s�;g��|�+`|�Q�i�~"1%��D���YbS_[��-�_�{7:4�y1!���	B��i��
S~���8a!�^��A �Of�i�n%�'���h�'1~��M����5�(�@>�0�5�L(�g
f:8HR#�)�2��$����9����ҐUMC�n�Y��:�$Cj��3c!Uۡ���	5�k�L��P{�Qu�1)�S�O�~vnyQ+d��~�� A�C�,V�A��b��$Z��"!��DDOڞz��6n��n�A��ߞ��—(y��@jN$���
�����B��	�*m�I�;�%�
�;/kM��uc+w�&'en�9�����x)(�#7��h��+�<YBo|v��KݕnOxA]�nS�C �J�R�\D�	T�N�:{��oD?��qr����%,EL���ޙt~Ώ{_Bm���&�A)�r�}F6�d�W��1�:�!zQ��]'���g���ah}�=������n����"����2N��U���iև{��!��Q�݁��<�Ç��뾖Sy쇴
�q� Ɣ�%��V��~�6�C�K��4�w�
d��ܡ��sE�N�Sj?��
lEb�;r+q�p��g�(���,���8Ē�|C���"���0��%������5�-�?L�6:�3ì�&:(	���d�4����%6�d�.���k m*’G��US�6|<�Lu;f�#��kO���M�V)������N�۾>Q0����9�����Z���hܵ�A��P>��My�q�Sp>H�s�6z�P8�Ney��4���mb��u�7ͫ�F��zKL6d<�5��ڦ�}+n�Iz�Qm��0�]s�$ �E}=��^�����hy'G�@<8jq)G�%�ߡػܠ�/��#�YI3�e],#���hIrzk�Zw��M0�)n�zz.t�1�[���9z�	$�n�"ٹY ��4g��AM�r�_�/ݥ��v)�n�;�a�?���k�*��ҏE��ޫY6GC8����V��Gr?�H��-8���b:���=��K���l��(tw�����(�.G6:�$#|�z����6�he�@��ء>HA�U婫��<a�M$`o[̧J�ijK��u����]+�w��1��ݻf)_vYi�	'�x� _�.)ױ�˪�5
���_)��¤Uk�oj'$���	��j�"7]��;<�ܞ��ڃ$K���I8
�^Z�]"m2ѸM�=�|�A�;�o�.�i�;�
_i�+d�X�#��M�2�%G�j�-7%��T����˜�O]
^�p�©�)x����j�����h��1u�L�w��u�߀w��|�.�_ǎ�c�,*���#����2�hsh)p���*a��?�V��(����<h���nC����D�(����g�X)7�PH��O�್�)�lę2�0���oA/ha̿z@��[	z�䬹�S�"�o��!�᳍M�}\�<_H�{̈+�
C=	��"c.�Q�E�>�P\Sr�[��������
}�Yv�B�z	��HBOMx�ԋ���,^dG
��mr����/��{�y��
�nI7���������}rDtG~����=7�;���]g
��ǹ��#Oe����S.%-�'Ċw��e�W��b"�Np�F��y11H��K{���)�I�:U��[$P�3���qg����>��*ݰ��6�!�ɠu<4D�5��7�3Ss�F�?	��y�n��H`�o�HO��Ǒ\���@��vu)WT�z���[��ꅠ�%�Ml[�Ȍ+�<�I��?���LX�
���~���s˄�k6M�:eҞ��cBT%�@�C�ŕӉwk������_���7��W"�����y�Nmpz���x&�%u��1v=���y;��Zp>B��~�+� ���",�;
ve���
y��+Vv1��E�0������9��EjJ����}=���t+��'<^&����8�;x���i)��^�����wd�*�;���h�C94¾�x[��(��&	�J鳡W2��:�I�
z�2as��FqE�$�7��E����P3��ԡÜ�P�xQ�-8Os�]U�Ž��2]v��
�I��[���/mS���ڮz�<�i�Ύj�l[3'�Q2���ְ��i��Ļ!�O]o�{Qip����7�n��<9�?`bTr2
8-��A�m������O�'��փ��ʺ$b��@��L>t��^��;��u�\M�&�(�)�MQ��iV��/t�3s�����%�Э\��›��Y[;��kg�̺ے?�;|vG์��D��T\I7��U����
���N�ؘ��m�������7�e��c�e��7S���Q$\���{Vը�J�����$��KDP
����������-l�|�b��S�a��

�,֝��e6+�5j��}�㖹�F�i��b�r��ҦS|hy-R�<\���V�(��>���֫���.��?ެ�9�?_��9���S�s�|��_�i�3��@����kZ��V�p�sQkyχ9Zi;
���Y�1�%���,��0�a]�ө# �l2�8ә�$��(?�o	�_ߣ����D�S��A�S�c}�e����UT����F�
5b\�b#>c/��4�ֵ��X�'�[��+���Ͷ/'x�j
[�(O<��,H�����J�O�[ ��0̙�J|���t�G�a�񵋖Ag�5�����y�`���Hl\�㯋7?�չ�kA��	V'���L`U���ӪH�`2�g0���k?��D݄ˁ�s4� �ߘ~}�I=y<eS�}73
/ǪV����d�l���'��h�k�j���C{��F�t��ԘH��֞�Ow�?��%��^��ҩ�]Q&�b�[��x�U��tx,*om�u*�6aQ?�aΥ'89������
�0���x�+��d}
���w��a��ڧ��\�� ��W@E��q�@�9\�~̑�X�긣�o"t��:[1�ڬ
g��K�]�8�zc�U�#h����Y�w$����:��!pH�#���z
�
Lxȹ�@�,�%c$��c���ۄ�z\c���>֗E�X[7����y�$"-�@?W���5������a��`�Iqx��j(K󪹥��٤eB���P���l�������C�����`�Y����
ν{�ֹ� �H1�$Un�������dT����XVN�0�X��A�O�A:�7�uր��i�6��l��l?�Q�
s����\�����Ah81 �f����z�Tp����F���&O��E���n�FP\5#�H��ϲ���vPw�^��Ծ����*�m<���a�;�a��h�$�f8�["�<�����`�}]�#ߡ������*���5���Xgj���(oׄTA�\=���Ț���-h�u��5t�Kh�����t�қ_3���jf�_����3J̍��p�{�ϗƓ��2l����ȣF�m�]�30�%˞m5�8�߂߲P��1���e!Y�*��h�e���$�pƍ�T�X�"��������[�0C��TAa&p�w\�5t���Y�~�
��Qdf�;$���/��X3�T���6�c0�Ѡ�h�u����WX�<[#¿���NP�ρ�\,W�0`���0���m�G3j��qt�{��<>������o�
ID��F��D]]�أ�[��<a8s�!7
zH�A���jϪ��ߐ��>�|���#���?���	���frm����l�8bC[^��<���<��e��w�Y�J�%a�$�1Ff��z@�>zC�a�Q�)3��X�d�c�
~8����(��Z++��Ltm�tɒ������H��!�;�縛������?�ß&��JΝ7,9��P�0J��e�5u5�R����{��7��_fůF�Bq�)�l!��3B=�і'��xE=̜�ND�pH��/�x���_�Egw���/PK��mWb�/q���distutils-precedence.pthPK��VS�@=�h���_distutils_hack/__init__.pyPK��VS� ��.,���_distutils_hack/override.pyPK��mW�#�8ps�����pkg_resources/__init__.pyPK��mW!���zpkg_resources/_vendor/__init__.pyPK��mW�޽Ag` ���zpkg_resources/_vendor/appdirs.pyPK��mW��+\�x�"��d�pkg_resources/_vendor/pyparsing.pyPK��mWZ�k���,��bpkg_resources/_vendor/packaging/__about__.pyPK��mWeD2+���cpkg_resources/_vendor/packaging/__init__.pyPK��mWJzBh*��5epkg_resources/_vendor/packaging/_compat.pyPK��mW�]�מ�.���gpkg_resources/_vendor/packaging/_structures.pyPK��mW���n_*���ipkg_resources/_vendor/packaging/_typing.pyPK��mWb��.%*��Pmpkg_resources/_vendor/packaging/markers.pyPK��mW&y�I3A/��ypkg_resources/_vendor/packaging/requirements.pyPK��mW��)��|-����pkg_resources/_vendor/packaging/specifiers.pyPK��mW��'^'���pkg_resources/_vendor/packaging/tags.pyPK��mWJ�f`�(��L�pkg_resources/_vendor/packaging/utils.pyPK��mWPz��n<*����pkg_resources/_vendor/packaging/version.pyPK��mW̛��g:	 ����pkg_resources/extern/__init__.pyPK��mW��",Th8��h�pkg_resources/tests/data/my-test-package-source/setup.pyPK��mW_��f
����setuptools/__init__.pyPK��mW�J��"����setuptools/_deprecation_warning.pyPK��mW��	�	X	��w�setuptools/_imp.pyPK��mW��MjO�����setuptools/archive_util.pyPK��mW�N7�`((��7�setuptools/build_meta.pyPK��mW�l<
ESZ����setuptools/config.pyPK��mW+J���D
setuptools/dep_util.pyPK��mW��f;zb��setuptools/depends.pyPK��mW2�
˹,O����setuptools/dist.pyPK��mW��Q�
���@setuptools/errors.pyPK��mW���������Asetuptools/extension.pyPK��mW޷Y��	���Dsetuptools/glob.pyPK��mW_��
���Jsetuptools/installer.pyPK��mW2S��,���Psetuptools/launch.pyPK��mWE��4a���Rsetuptools/monkey.pyPK��mWSB�(����Zsetuptools/msvc.pyPK��mWpm!N���setuptools/namespaces.pyPK��mWT^�-Λ��n�setuptools/package_index.pyPK��mW�V�D����b�setuptools/py34compat.pyPK��mWQ�짟8���setuptools/sandbox.pyPK��VS��������setuptools/script (dev).tmplPK��VS�3��j�����setuptools/script.tmplPK��mWT+�~���e�setuptools/unicode_utils.pyPK��mWH�Lbe����setuptools/version.pyPK��mW�
4�	` ����setuptools/wheel.pyPK��mW���
t�����setuptools/windows_support.pyPK��mW�B괯�!��e�setuptools/_distutils/__init__.pyPK��mW��1MQ&��S�setuptools/_distutils/_msvccompiler.pyPK��mW��5R
|!%����setuptools/_distutils/archive_util.pyPK��mW�F9��.:%��]�setuptools/_distutils/bcppcompiler.pyPK��mW��| �1��"��w
setuptools/_distutils/ccompiler.pyPK��mW����w�F��O<setuptools/_distutils/cmd.pyPK��mW$�Fq����Rsetuptools/_distutils/config.pyPK��mWIS^��"���Wsetuptools/_distutils/core.pyPK��mW5��<�*B(��dsetuptools/_distutils/cygwinccompiler.pyPK��mW_�H%u���Lysetuptools/_distutils/debug.pyPK��mWk"#��
!���ysetuptools/_distutils/dep_util.pyPK��mW�3��
b!��?setuptools/_distutils/dir_util.pyPK��mW�. A�3�����setuptools/_distutils/dist.pyPK��mW�n���
����setuptools/_distutils/errors.pyPK��mW]�4:%
)"��L�setuptools/_distutils/extension.pyPK��mW�1ƲxE%����setuptools/_distutils/fancy_getopt.pyPK��mW�È
�"����setuptools/_distutils/file_util.pyPK��mW��%4_4!��n�setuptools/_distutils/filelist.pyPK��mWˆ�з����setuptools/_distutils/log.pyPK��mW>����!�v&���setuptools/_distutils/msvc9compiler.pyPK��mW:�kc�[%���%setuptools/_distutils/msvccompiler.pyPK��mW��v��#���?setuptools/_distutils/py35compat.pyPK��mW��{�#���@setuptools/_distutils/py38compat.pyPK��mW���s�
��aAsetuptools/_distutils/spawn.pyPK��mW��>~T"��Gsetuptools/_distutils/sysconfig.pyPK��mWQ8��Z�0"���`setuptools/_distutils/text_file.pyPK��mW1���8&��(psetuptools/_distutils/unixccompiler.pyPK��mW��	u�O��d�setuptools/_distutils/util.pyPK��mW�87�l�0 ���setuptools/_distutils/version.pyPK��mW2��
)����setuptools/_distutils/versionpredicate.pyPK��mW;��*)��׶setuptools/_distutils/command/__init__.pyPK��mW��n1��&��H�setuptools/_distutils/command/bdist.pyPK��mW�wq1+��W�setuptools/_distutils/command/bdist_dumb.pyPK��mWo�Y��"��*���setuptools/_distutils/command/bdist_msi.pyPK��mWd]�v!T*��;�setuptools/_distutils/command/bdist_rpm.pyPK��mWd-�E�>.����setuptools/_distutils/command/bdist_wininst.pyPK��mW������&���setuptools/_distutils/command/build.pyPK��mWv3;��V+��~setuptools/_distutils/command/build_clib.pyPK��mW����#�{*���!setuptools/_distutils/command/build_ext.pyPK��mW.�8o@)���Dsetuptools/_distutils/command/build_py.pyPK��mW8�4,K.��uWsetuptools/_distutils/command/build_scripts.pyPK��mW�m�&���^setuptools/_distutils/command/check.pyPK��mW,���V�
&��fsetuptools/_distutils/command/clean.pyPK��mW���7\=3'���isetuptools/_distutils/command/config.pyPK��mW�i�TE�k(��Txsetuptools/_distutils/command/install.pyPK��mW����-��ߓsetuptools/_distutils/command/install_data.pyPK��mW9R)S+
1����setuptools/_distutils/command/install_egg_info.pyPK��mW*Rj&�0���setuptools/_distutils/command/install_headers.pyPK��mW����	� ,��%�setuptools/_distutils/command/install_lib.pyPK��mW�:���0���setuptools/_distutils/command/install_scripts.pyPK��mWCh�o�+��/�setuptools/_distutils/command/py37compat.pyPK��mW����t
�-)���setuptools/_distutils/command/register.pyPK��mW�t��v=J&����setuptools/_distutils/command/sdist.pyPK��mWj��P�	�'��\�setuptools/_distutils/command/upload.pyPK��mW����setuptools/_vendor/__init__.pyPK��mWD�*�;!����setuptools/_vendor/ordered_set.pyPK��mW��+\�x�����setuptools/_vendor/pyparsing.pyPK��mW!Q8�AR-��2�setuptools/_vendor/more_itertools/__init__.pyPK��mW�a�h�y��)����setuptools/_vendor/more_itertools/more.pyPK��mW�ʀ�8�?,���8setuptools/_vendor/more_itertools/recipes.pyPK��mWZ�k���)��bMsetuptools/_vendor/packaging/__about__.pyPK��mWeD2(��7Osetuptools/_vendor/packaging/__init__.pyPK��mWJzBh'���Psetuptools/_vendor/packaging/_compat.pyPK��mW�]�מ�+��Ssetuptools/_vendor/packaging/_structures.pyPK��mW���n_'���Tsetuptools/_vendor/packaging/_typing.pyPK��mW�d��{%%'���Xsetuptools/_vendor/packaging/markers.pyPK��mWiS�05,��cdsetuptools/_vendor/packaging/requirements.pyPK��mW��)��|*���ksetuptools/_vendor/packaging/specifiers.pyPK��mW��'^$��@�setuptools/_vendor/packaging/tags.pyPK��mWJ�f`�%����setuptools/_vendor/packaging/utils.pyPK��mWPz��n<'��åsetuptools/_vendor/packaging/version.pyPK��mWR/������setuptools/command/__init__.pyPK��mW=��/M	����setuptools/command/alias.pyPK��mW�ut��@���setuptools/command/bdist_egg.pyPK��mW��ȹ������setuptools/command/bdist_rpm.pyPK��mW!�1? �� �setuptools/command/build_clib.pyPK��mW�I�V�3��^�setuptools/command/build_ext.pyPK��mW�2-�y	T ����setuptools/command/build_py.pyPK��mW&��dd����setuptools/command/develop.pyPK��mW������E�setuptools/command/dist_info.pyPK��mWE��wg[�N"���setuptools/command/easy_install.pyPK��mW��v�}�b���Ssetuptools/command/egg_info.pyPK��mW�vQ1�*��ppsetuptools/command/install.pyPK��mW\Ҩ�+�&���wsetuptools/command/install_egg_info.pyPK��mW,��,#!��{setuptools/command/install_lib.pyPK��mW�}���!
%��v�setuptools/command/install_scripts.pyPK��VS]�)B7t(��j�setuptools/command/launcher manifest.xmlPK��mW���3|R ���setuptools/command/py36compat.pyPK��mWv�������setuptools/command/register.pyPK��mW�!��P���setuptools/command/rotate.pyPK��mW��4F���$�setuptools/command/saveopts.pyPK��mW�HnY����setuptools/command/sdist.pyPK��mW.
n�����8�setuptools/command/setopt.pyPK��mW$����	���[�setuptools/command/test.pyPK��mW"]K������setuptools/command/upload.pyPK��mWm�� 	2!����setuptools/command/upload_docs.pyPK��mWe��g	����setuptools/extern/__init__.pyPK��mW�Yď`#��Y�setuptools-58.3.0.dist-info/LICENSEPK��mW=k����$����setuptools-58.3.0.dist-info/METADATAPK��mW�h�\\!����setuptools-58.3.0.dist-info/WHEELPK��mW�$�|L
,��_�setuptools-58.3.0.dist-info/entry_points.txtPK��mW;���*))��%�setuptools-58.3.0.dist-info/top_level.txtPK��mW�����4"���setuptools-58.3.0.dist-info/RECORDPK���.��bash-completion/completions/pip3000064400000000444151732726240012775 0ustar00
# pip bash completion start
_pip3_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
}
complete -o default -F _pip3_completion pip pip{,-}{3,3.5}}
# pip bash completion end

man/man1/python3.5.1000064400000032154151733306540010020 0ustar00.TH PYTHON "1"

.\" To view this file while editing, run it through groff:
.\"   groff -Tascii -man python.man | less

.SH NAME
python \- an interpreted, interactive, object-oriented programming language
.SH SYNOPSIS
.B python
[
.B \-B
]
[
.B \-b
]
[
.B \-d
]
[
.B \-E
]
[
.B \-h
]
[
.B \-i
]
[
.B \-I
]
.br
       [
.B \-m
.I module-name
]
[
.B \-q
]
[
.B \-O
]
[
.B \-OO
]
[
.B \-s
]
[
.B \-S
]
[
.B \-u
]
.br
       [
.B \-v
]
[
.B \-V
]
[
.B \-W
.I argument
]
[
.B \-x
]
[
[
.B \-X
.I option
]
.B \-?
]
.br
       [
.B \-c
.I command
|
.I script
|
\-
]
[
.I arguments
]
.SH DESCRIPTION
Python is an interpreted, interactive, object-oriented programming
language that combines remarkable power with very clear syntax.
For an introduction to programming in Python, see the Python Tutorial.
The Python Library Reference documents built-in and standard types,
constants, functions and modules.
Finally, the Python Reference Manual describes the syntax and
semantics of the core language in (perhaps too) much detail.
(These documents may be located via the
.B "INTERNET RESOURCES"
below; they may be installed on your system as well.)
.PP
Python's basic power can be extended with your own modules written in
C or C++.
On most systems such modules may be dynamically loaded.
Python is also adaptable as an extension language for existing
applications.
See the internal documentation for hints.
.PP
Documentation for installed Python modules and packages can be
viewed by running the
.B pydoc
program.
.SH COMMAND LINE OPTIONS
.TP
.B \-B
Don't write
.I .pyc
files on import. See also PYTHONDONTWRITEBYTECODE.
.TP
.B \-b
Issue warnings about str(bytes_instance), str(bytearray_instance)
and comparing bytes/bytearray with str. (-bb: issue errors)
.TP
.BI "\-c " command
Specify the command to execute (see next section).
This terminates the option list (following options are passed as
arguments to the command).
.TP
.B \-d
Turn on parser debugging output (for wizards only, depending on
compilation options).
.TP
.B \-E
Ignore environment variables like PYTHONPATH and PYTHONHOME that modify
the behavior of the interpreter.
.TP
.B \-h ", " \-? ", "\-\-help
Prints the usage for the interpreter executable and exits.
.TP
.B \-i
When a script is passed as first argument or the \fB\-c\fP option is
used, enter interactive mode after executing the script or the
command.  It does not read the $PYTHONSTARTUP file.  This can be
useful to inspect global variables or a stack trace when a script
raises an exception.
.TP
.B \-I
Run Python in isolated mode. This also implies \fB\-E\fP and \fB\-s\fP. In
isolated mode sys.path contains neither the script's directory nor the user's
site-packages directory. All PYTHON* environment variables are ignored, too.
Further restrictions may be imposed to prevent the user from injecting
malicious code.
.TP
.BI "\-m " module-name
Searches
.I sys.path
for the named module and runs the corresponding
.I .py
file as a script.
.TP
.B \-O
Turn on basic optimizations.  Given twice, causes docstrings to be discarded.
.TP
.B \-OO
Discard docstrings in addition to the \fB-O\fP optimizations.
.TP
.B \-q
Do not print the version and copyright messages. These messages are
also suppressed in non-interactive mode.
.TP
.B \-s
Don't add user site directory to sys.path.
.TP
.B \-S
Disable the import of the module
.I site
and the site-dependent manipulations of
.I sys.path
that it entails.  Also disable these manipulations if
.I site
is explicitly imported later.
.TP
.B \-u
Force the binary I/O layers of stdout and stderr to be unbuffered.
stdin is always buffered.
The text I/O layer will still be line-buffered.
.\" Note that there is internal buffering in readlines() and
.\" file-object iterators ("for line in sys.stdin") which is not
.\" influenced by this option.  To work around this, you will want to use
.\" "sys.stdin.readline()" inside a "while 1:" loop.
.TP
.B \-v
Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  When given
twice, print a message for each file that is checked for when
searching for a module.  Also provides information on module cleanup
at exit.
.TP
.B \-V ", " \-\-version
Prints the Python version number of the executable and exits.
.TP
.BI "\-W " argument
Warning control.  Python sometimes prints warning message to
.IR sys.stderr .
A typical warning message has the following form:
.IB file ":" line ": " category ": " message.
By default, each warning is printed once for each source line where it
occurs.  This option controls how often warnings are printed.
Multiple
.B \-W
options may be given; when a warning matches more than one
option, the action for the last matching option is performed.
Invalid
.B \-W
options are ignored (a warning message is printed about invalid
options when the first warning is issued).  Warnings can also be
controlled from within a Python program using the
.I warnings
module.

The simplest form of
.I argument
is one of the following
.I action
strings (or a unique abbreviation):
.B ignore
to ignore all warnings;
.B default
to explicitly request the default behavior (printing each warning once
per source line);
.B all
to print a warning each time it occurs (this may generate many
messages if a warning is triggered repeatedly for the same source
line, such as inside a loop);
.B module
to print each warning only the first time it occurs in each
module;
.B once
to print each warning only the first time it occurs in the program; or
.B error
to raise an exception instead of printing a warning message.

The full form of
.I argument
is
.IB action : message : category : module : line.
Here,
.I action
is as explained above but only applies to messages that match the
remaining fields.  Empty fields match all values; trailing empty
fields may be omitted.  The
.I message
field matches the start of the warning message printed; this match is
case-insensitive.  The
.I category
field matches the warning category.  This must be a class name; the
match test whether the actual warning category of the message is a
subclass of the specified warning category.  The full class name must
be given.  The
.I module
field matches the (fully-qualified) module name; this match is
case-sensitive.  The
.I line
field matches the line number, where zero matches all line numbers and
is thus equivalent to an omitted line number.
.TP
.BI "\-X " option
Set implementation specific option.
.TP
.B \-x
Skip the first line of the source.  This is intended for a DOS
specific hack only.  Warning: the line numbers in error messages will
be off by one!
.SH INTERPRETER INTERFACE
The interpreter interface resembles that of the UNIX shell: when
called with standard input connected to a tty device, it prompts for
commands and executes them until an EOF is read; when called with a
file name argument or with a file as standard input, it reads and
executes a
.I script
from that file;
when called with
.B \-c
.IR command ,
it executes the Python statement(s) given as
.IR command .
Here
.I command
may contain multiple statements separated by newlines.
Leading whitespace is significant in Python statements!
In non-interactive mode, the entire input is parsed before it is
executed.
.PP
If available, the script name and additional arguments thereafter are
passed to the script in the Python variable
.IR sys.argv ,
which is a list of strings (you must first
.I import sys
to be able to access it).
If no script name is given,
.I sys.argv[0]
is an empty string; if
.B \-c
is used,
.I sys.argv[0]
contains the string
.I '-c'.
Note that options interpreted by the Python interpreter itself
are not placed in
.IR sys.argv .
.PP
In interactive mode, the primary prompt is `>>>'; the second prompt
(which appears when a command is not complete) is `...'.
The prompts can be changed by assignment to
.I sys.ps1
or
.IR sys.ps2 .
The interpreter quits when it reads an EOF at a prompt.
When an unhandled exception occurs, a stack trace is printed and
control returns to the primary prompt; in non-interactive mode, the
interpreter exits after printing the stack trace.
The interrupt signal raises the
.I Keyboard\%Interrupt
exception; other UNIX signals are not caught (except that SIGPIPE is
sometimes ignored, in favor of the
.I IOError
exception).  Error messages are written to stderr.
.SH FILES AND DIRECTORIES
These are subject to difference depending on local installation
conventions; ${prefix} and ${exec_prefix} are installation-dependent
and should be interpreted as for GNU software; they may be the same.
The default for both is \fI/usr/local\fP.
.IP \fI${exec_prefix}/bin/python\fP
Recommended location of the interpreter.
.PP
.I ${prefix}/lib/python<version>
.br
.I ${exec_prefix}/lib/python<version>
.RS
Recommended locations of the directories containing the standard
modules.
.RE
.PP
.I ${prefix}/include/python<version>
.br
.I ${exec_prefix}/include/python<version>
.RS
Recommended locations of the directories containing the include files
needed for developing Python extensions and embedding the
interpreter.
.RE
.SH ENVIRONMENT VARIABLES
.IP PYTHONHOME
Change the location of the standard Python libraries.  By default, the
libraries are searched in ${prefix}/lib/python<version> and
${exec_prefix}/lib/python<version>, where ${prefix} and ${exec_prefix}
are installation-dependent directories, both defaulting to
\fI/usr/local\fP.  When $PYTHONHOME is set to a single directory, its value
replaces both ${prefix} and ${exec_prefix}.  To specify different values
for these, set $PYTHONHOME to ${prefix}:${exec_prefix}.
.IP PYTHONPATH
Augments the default search path for module files.
The format is the same as the shell's $PATH: one or more directory
pathnames separated by colons.
Non-existent directories are silently ignored.
The default search path is installation dependent, but generally
begins with ${prefix}/lib/python<version> (see PYTHONHOME above).
The default search path is always appended to $PYTHONPATH.
If a script argument is given, the directory containing the script is
inserted in the path in front of $PYTHONPATH.
The search path can be manipulated from within a Python program as the
variable
.IR sys.path .
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str, bytes and datetime objects.

If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
generating the hash() of the types covered by the hash randomization.  Its
purpose is to allow repeatable hashing, such as for selftests for the
interpreter itself, or to allow a cluster of python processes to share hash
values.

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.SH AUTHOR
The Python Software Foundation: https://www.python.org/psf/
.SH INTERNET RESOURCES
Main website:  https://www.python.org/
.br
Documentation:  https://docs.python.org/
.br
Developer resources:  https://docs.python.org/devguide/
.br
Downloads:  https://www.python.org/downloads/
.br
Module repository:  https://pypi.python.org/
.br
Newsgroups:  comp.lang.python, comp.lang.python.announce
.SH LICENSING
Python is distributed under an Open Source license.  See the file
"LICENSE" in the Python source distribution for information on terms &
conditions for accessing and otherwise using Python and for a
DISCLAIMER OF ALL WARRANTIES.
doc/alt-python35-pip/README.rst000064400000004606151733306540012052 0ustar00pip - The Python Package Installer
==================================

.. image:: https://img.shields.io/pypi/v/pip.svg
   :target: https://pypi.org/project/pip/

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest

pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.

Please take a look at our documentation for how to install and use pip:

* `Installation`_
* `Usage`_

We release updates regularly, with a new version every 3 months. Find more details in our documentation:

* `Release notes`_
* `Release process`_

In 2020, we're working on improvements to the heart of pip. Please `learn more and take our survey`_ to help us do it right.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

Code of Conduct
---------------

Everyone interacting in the pip project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installing.html
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _learn more and take our survey: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
doc/alt-python35-devel/valgrind-python.supp000064400000020254151733306540014725 0ustar00#
# This is a valgrind suppression file that should be used when using valgrind.
#
#  Here's an example of running valgrind:
#
#	cd python/dist/src
#	valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \
#		./python -E ./Lib/test/regrtest.py -u gui,network
#
# You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER
# to use the preferred suppressions with Py_ADDRESS_IN_RANGE.
#
# If you do not want to recompile Python, you can uncomment
# suppressions for PyObject_Free and PyObject_Realloc.
#
# See Misc/README.valgrind for more information.

# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Addr4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Value4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
   Memcheck:Value8
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
   Memcheck:Cond
   fun:Py_ADDRESS_IN_RANGE
}

#
# Leaks (including possible leaks)
#    Hmmm, I wonder if this masks some real leaks.  I think it does.
#    Will need to fix that.
#

{
   Suppress leaking the GIL.  Happens once per process, see comment in ceval.c.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_InitThreads
}

{
   Suppress leaking the GIL after a fork.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_ReInitThreads
}

{
   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_create_key
   fun:_PyGILState_Init
   fun:Py_InitializeEx
   fun:Py_Main
}

{
   Hmmm, is this a real leak or like the GIL?
   Memcheck:Leak
   fun:malloc
   fun:PyThread_ReInitTLS
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:realloc
   fun:_PyObject_GC_Resize
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_New
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_NewVar
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

#
# Non-python specific leaks
#

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:memalign
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Free
###}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Realloc
###}

###
### All the suppressions below are for errors that occur within libraries
### that Python uses.  The problems to not appear to be related to Python's
### use of the libraries.
###

{
   Generic ubuntu ld problems
   Memcheck:Addr8
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
}

{
   Generic gentoo ld problems
   Memcheck:Cond
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
}

{
   DBM problems, see test_dbm
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_close
}

{
   DBM problems, see test_dbm
   Memcheck:Value8
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   GDBM problems, see test_gdbm
   Memcheck:Param
   write(buf)
   fun:write
   fun:gdbm_open

}

{
   ZLIB problems, see test_gzip
   Memcheck:Cond
   obj:/lib/libz.so.1.2.3
   obj:/lib/libz.so.1.2.3
   fun:deflate
}

{
   Avoid problems w/readline doing a putenv and leaking on exit
   Memcheck:Leak
   fun:malloc
   fun:xmalloc
   fun:sh_set_lines_and_columns
   fun:_rl_get_screen_size
   fun:_rl_init_terminal_io
   obj:/lib/libreadline.so.4.3
   fun:rl_initialize
}

###
### These occur from somewhere within the SSL, when running
###  test_socket_sll.  They are too general to leave on by default.
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:memset
###}
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:memset
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:MD5_Update
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:MD5_Update
###}

# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
# See http://bugs.python.org/issue14171
{
   openssl 1.0.1 prng 1
   Memcheck:Cond
   fun:bcmp
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 2
   Memcheck:Cond
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 3
   Memcheck:Value8
   fun:_x86_64_AES_encrypt_compact
   fun:AES_encrypt
}

#
# All of these problems come from using test_socket_ssl
#
{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_bin2bn
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont
}

{
   from test_socket_ssl
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libcrypto.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_set_key_unchecked
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_encrypt2
}

{
   from test_socket_ssl
   Memcheck:Cond
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Value4
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BUF_MEM_grow_clean
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:memcpy
   fun:ssl3_read_bytes
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:SHA1_Update
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:SHA1_Update
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

{
   wcscmp_false_positive
   Memcheck:Addr8
   fun:wcscmp
   fun:_PyOS_GetOpt
   fun:Py_Main
   fun:main
}

# Additional suppressions for the unified decimal tests:
{
   test_decimal
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_decimal2
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

doc/alt-python35-devel/gdbinit000064400000011261151733306540012230 0ustar00# If you use the GNU debugger gdb to debug the Python C runtime, you
# might find some of the following commands useful.  Copy this to your
# ~/.gdbinit file and it'll get loaded into gdb automatically when you
# start it up.  Then, at the gdb prompt you can do things like:
#
#    (gdb) pyo apyobjectptr
#    <module 'foobar' (built-in)>
#    refcounts: 1
#    address    : 84a7a2c
#    $1 = void
#    (gdb)
#
# NOTE: If you have gdb 7 or later, it supports debugging of Python directly
# with embedded macros that you may find superior to what is in here.
# See Tools/gdb/libpython.py and http://bugs.python.org/issue8032.

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyObject*
define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyGC_Head*
define pyg
    print _PyGC_Dump($arg0)
end

# print the local variables of the current frame
define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = co->co_varnames
	    set $_name = _PyUnicode_AsString(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

# print the current frame - verbose
define pyframev
    pyframe
    pylocals
end

define pyframe
    set $__fn = _PyUnicode_AsString(co->co_filename)
    set $__n = _PyUnicode_AsString(co->co_name)
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

# print the entire Python call stack
define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end

# print the entire Python call stack - verbose mode
define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end

# generally useful macro to print a Unicode string
def pu
  set $uni = $arg0
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80)
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
doc/alt-python35-devel/README.valgrind000064400000010462151733306540013354 0ustar00This document describes some caveats about the use of Valgrind with
Python.  Valgrind is used periodically by Python developers to try
to ensure there are no memory leaks or invalid memory reads/writes.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must do one of the following:

  * Uncomment Py_USING_MEMORY_DEBUGGER in Objects/obmalloc.c,
    then rebuild Python
  * Uncomment the lines in Misc/valgrind-python.supp that
    suppress the warnings for PyObject_Free and PyObject_Realloc

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
doc/alt-python35-setuptools/asl.txt000064400000026136151733306540013336 0ustar00
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
doc/alt-python35-setuptools/requirements.txt000064400000000075151733306540015274 0ustar00sphinx
rst.linker>=1.9
jaraco.packaging>=3.2

setuptools>=34
doc/alt-python35-setuptools/developer-guide.txt000064400000010026151733306540015626 0ustar00================================
Developer's Guide for Setuptools
================================

If you want to know more about contributing on Setuptools, this is the place.


.. contents:: **Table of Contents**


-------------------
Recommended Reading
-------------------

Please read `How to write the perfect pull request
<https://blog.jaraco.com/how-to-write-perfect-pull-request/>`_ for some tips
on contributing to open source projects. Although the article is not
authoritative, it was authored by the maintainer of Setuptools, so reflects
his opinions and will improve the likelihood of acceptance and quality of
contribution.

------------------
Project Management
------------------

Setuptools is maintained primarily in Github at `this home
<https://github.com/pypa/setuptools>`_. Setuptools is maintained under the
Python Packaging Authority (PyPA) with several core contributors. All bugs
for Setuptools are filed and the canonical source is maintained in Github.

User support and discussions are done through the issue tracker (for specific)
issues, through the distutils-sig mailing list, or on IRC (Freenode) at
#pypa.

Discussions about development happen on the pypa-dev mailing list or on
`Gitter <https://gitter.im/pypa/setuptools>`_.

-----------------
Authoring Tickets
-----------------

Before authoring any source code, it's often prudent to file a ticket
describing the motivation behind making changes. First search to see if a
ticket already exists for your issue. If not, create one. Try to think from
the perspective of the reader. Explain what behavior you expected, what you
got instead, and what factors might have contributed to the unexpected
behavior. In Github, surround a block of code or traceback with the triple
backtick "\`\`\`" so that it is formatted nicely.

Filing a ticket provides a forum for justification, discussion, and
clarification. The ticket provides a record of the purpose for the change and
any hard decisions that were made. It provides a single place for others to
reference when trying to understand why the software operates the way it does
or why certain changes were made.

Setuptools makes extensive use of hyperlinks to tickets in the changelog so
that system integrators and other users can get a quick summary, but then
jump to the in-depth discussion about any subject referenced.

-----------
Source Code
-----------

Grab the code at Github::

    $ git checkout https://github.com/pypa/setuptools

If you want to contribute changes, we recommend you fork the repository on
Github, commit the changes to your repository, and then make a pull request
on Github. If you make some changes, don't forget to:

- add a note in CHANGES.rst

Please commit all changes in the 'master' branch against the latest available
commit or for bug-fixes, against an earlier commit or release in which the
bug occurred.

If you find yourself working on more than one issue at a time, Setuptools
generally prefers Git-style branches, so use Mercurial bookmarks or Git
branches or multiple forks to maintain separate efforts.

The Continuous Integration tests that validate every release are run
from this repository.

For posterity, the old `Bitbucket mirror
<https://bitbucket.org/pypa/setuptools>`_ is available.

-------
Testing
-------

The primary tests are run using tox. To run the tests, first make
sure you have tox installed, then invoke it::

    $ tox

Under continuous integration, additional tests may be run. See the
``.travis.yml`` file for full details on the tests run under Travis-CI.

-------------------
Semantic Versioning
-------------------

Setuptools follows ``semver``.

.. explain value of reflecting meaning in versions.

----------------------
Building Documentation
----------------------

Setuptools relies on the Sphinx system for building documentation.
To accommodate RTD, docs must be built from the docs/ directory.

To build them, you need to have installed the requirements specified
in docs/requirements.txt. One way to do this is to use rwt:

    setuptools/docs$ python -m rwt -r requirements.txt -- -m sphinx . html
doc/alt-python35-setuptools/zpl.txt000064400000004026151733306540013356 0ustar00Zope Public License (ZPL) Version 2.1

A copyright notice accompanies this license document that identifies the
copyright holders.

This license has been certified as open source. It has also been designated as
GPL compatible by the Free Software Foundation (FSF).

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions in source code must retain the accompanying copyright
notice, this list of conditions, and the following disclaimer.

2. Redistributions in binary form must reproduce the accompanying copyright
notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution.

3. Names of the copyright holders must not be used to endorse or promote
products derived from this software without prior written permission from the
copyright holders.

4. The right to distribute this software or to use it for any purpose does not
give you the right to use Servicemarks (sm) or Trademarks (tm) of the
copyright
holders. Use of them is covered by separate agreement with the copyright
holders.

5. If any files are modified, you must cause the modified files to carry
prominent notices stating that you changed the files and the date of any
change.

Disclaimer

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
doc/alt-python35-setuptools/pkg_resources.txt000064400000270267151733306540015440 0ustar00=============================================================
Package Discovery and Resource Access using ``pkg_resources``
=============================================================

The ``pkg_resources`` module distributed with ``setuptools`` provides an API
for Python libraries to access their resource files, and for extensible
applications and frameworks to automatically discover plugins.  It also
provides runtime support for using C extensions that are inside zipfile-format
eggs, support for merging packages that have separately-distributed modules or
subpackages, and APIs for managing Python's current "working set" of active
packages.


.. contents:: **Table of Contents**


--------
Overview
--------

The ``pkg_resources`` module provides runtime facilities for finding,
introspecting, activating and using installed Python distributions. Some
of the more advanced features (notably the support for parallel installation
of multiple versions) rely specifically on the "egg" format (either as a
zip archive or subdirectory), while others (such as plugin discovery) will
work correctly so long as "egg-info" metadata directories are available for
relevant distributions.

Eggs are a distribution format for Python modules, similar in concept to
Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
However, unlike a pure distribution format, eggs can also be installed and
added directly to ``sys.path`` as an import location. When installed in
this way, eggs are *discoverable*, meaning that they carry metadata that
unambiguously identifies their contents and dependencies. This means that
an installed egg can be *automatically* found and added to ``sys.path`` in
response to simple requests of the form, "get me everything I need to use
docutils' PDF support". This feature allows mutually conflicting versions of
a distribution to co-exist in the same Python installation, with individual
applications activating the desired version at runtime by manipulating the
contents of ``sys.path`` (this differs from the virtual environment
approach, which involves creating isolated environments for each
application).

The following terms are needed in order to explain the capabilities offered
by this module:

project
    A library, framework, script, plugin, application, or collection of data
    or other resources, or some combination thereof.  Projects are assumed to
    have "relatively unique" names, e.g. names registered with PyPI.

release
    A snapshot of a project at a particular point in time, denoted by a version
    identifier.

distribution
    A file or files that represent a particular release.

importable distribution
    A file or directory that, if placed on ``sys.path``, allows Python to
    import any modules contained within it.

pluggable distribution
    An importable distribution whose filename unambiguously identifies its
    release (i.e. project and version), and whose contents unambiguously
    specify what releases of other projects will satisfy its runtime
    requirements.

extra
    An "extra" is an optional feature of a release, that may impose additional
    runtime requirements.  For example, if docutils PDF support required a
    PDF support library to be present, docutils could define its PDF support as
    an "extra", and list what other project releases need to be available in
    order to provide it.

environment
    A collection of distributions potentially available for importing, but not
    necessarily active.  More than one distribution (i.e. release version) for
    a given project may be present in an environment.

working set
    A collection of distributions actually available for importing, as on
    ``sys.path``.  At most one distribution (release version) of a given
    project may be present in a working set, as otherwise there would be
    ambiguity as to what to import.

eggs
    Eggs are pluggable distributions in one of the three formats currently
    supported by ``pkg_resources``.  There are built eggs, development eggs,
    and egg links.  Built eggs are directories or zipfiles whose name ends
    with ``.egg`` and follows the egg naming conventions, and contain an
    ``EGG-INFO`` subdirectory (zipped or otherwise).  Development eggs are
    normal directories of Python code with one or more ``ProjectName.egg-info``
    subdirectories. The development egg format is also used to provide a
    default version of a distribution that is available to software that
    doesn't use ``pkg_resources`` to request specific versions. Egg links
    are ``*.egg-link`` files that contain the name of a built or
    development egg, to support symbolic linking on platforms that do not
    have native symbolic links (or where the symbolic link support is
    limited).

(For more information about these terms and concepts, see also this
`architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)

.. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html


.. -----------------
.. Developer's Guide
.. -----------------

.. This section isn't written yet.  Currently planned topics include
    Accessing Resources
    Finding and Activating Package Distributions
        get_provider()
        require()
        WorkingSet
        iter_distributions
    Running Scripts
    Configuration
    Namespace Packages
    Extensible Applications and Frameworks
        Locating entry points
        Activation listeners
        Metadata access
        Extended Discovery and Installation
    Supporting Custom PEP 302 Implementations
.. For now, please check out the extensive `API Reference`_ below.


-------------
API Reference
-------------

Namespace Package Support
=========================

A namespace package is a package that only contains other packages and modules,
with no direct contents of its own.  Such packages can be split across
multiple, separately-packaged distributions.  They are normally used to split
up large packages produced by a single organization, such as in the ``zope``
namespace package for Zope Corporation packages, and the ``peak`` namespace
package for the Python Enterprise Application Kit.

To create a namespace package, you list it in the ``namespace_packages``
argument to ``setup()``, in your project's ``setup.py``.  (See the
:ref:`setuptools documentation on namespace packages <Namespace Packages>` for
more information on this.)  Also, you must add a ``declare_namespace()`` call
in the package's ``__init__.py`` file(s):

``declare_namespace(name)``
    Declare that the dotted package name `name` is a "namespace package" whose
    contained packages and modules may be spread across multiple distributions.
    The named package's ``__path__`` will be extended to include the
    corresponding package in all distributions on ``sys.path`` that contain a
    package of that name.  (More precisely, if an importer's
    ``find_module(name)`` returns a loader, then it will also be searched for
    the package's contents.)  Whenever a Distribution's ``activate()`` method
    is invoked, it checks for the presence of namespace packages and updates
    their ``__path__`` contents accordingly.

Applications that manipulate namespace packages or directly alter ``sys.path``
at runtime may also need to use this API function:

``fixup_namespace_packages(path_item)``
    Declare that `path_item` is a newly added item on ``sys.path`` that may
    need to be used to update existing namespace packages.  Ordinarily, this is
    called for you when an egg is automatically added to ``sys.path``, but if
    your application modifies ``sys.path`` to include locations that may
    contain portions of a namespace package, you will need to call this
    function to ensure they are added to the existing namespace packages.

Although by default ``pkg_resources`` only supports namespace packages for
filesystem and zip importers, you can extend its support to other "importers"
compatible with PEP 302 using the ``register_namespace_handler()`` function.
See the section below on `Supporting Custom Importers`_ for details.


``WorkingSet`` Objects
======================

The ``WorkingSet`` class provides access to a collection of "active"
distributions.  In general, there is only one meaningful ``WorkingSet``
instance: the one that represents the distributions that are currently active
on ``sys.path``.  This global instance is available under the name
``working_set`` in the ``pkg_resources`` module.  However, specialized
tools may wish to manipulate working sets that don't correspond to
``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.

It's important to note that the global ``working_set`` object is initialized
from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs.  If
you manually modify ``sys.path``, you must invoke the appropriate methods on
the ``working_set`` instance to keep it in sync.  Unfortunately, Python does
not provide any way to detect arbitrary changes to a list object like
``sys.path``, so ``pkg_resources`` cannot automatically update the
``working_set`` based on changes to ``sys.path``.

``WorkingSet(entries=None)``
    Create a ``WorkingSet`` from an iterable of path entries.  If `entries`
    is not supplied, it defaults to the value of ``sys.path`` at the time
    the constructor is called.

    Note that you will not normally construct ``WorkingSet`` instances
    yourself, but instead you will implicitly or explicitly use the global
    ``working_set`` instance.  For the most part, the ``pkg_resources`` API
    is designed so that the ``working_set`` is used by default, such that you
    don't have to explicitly refer to it most of the time.

All distributions available directly on ``sys.path`` will be activated
automatically when ``pkg_resources`` is imported. This behaviour can cause
version conflicts for applications which require non-default versions of
those distributions. To handle this situation, ``pkg_resources`` checks for a
``__requires__`` attribute in the ``__main__`` module when initializing the
default working set, and uses this to ensure a suitable version of each
affected distribution is activated. For example::

    __requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
    import pkg_resources


Basic ``WorkingSet`` Methods
----------------------------

The following methods of ``WorkingSet`` objects are also available as module-
level functions in ``pkg_resources`` that apply to the default ``working_set``
instance.  Thus, you can use e.g. ``pkg_resources.require()`` as an
abbreviation for ``pkg_resources.working_set.require()``:


``require(*requirements)``
    Ensure that distributions matching `requirements` are activated

    `requirements` must be a string or a (possibly-nested) sequence
    thereof, specifying the distributions and versions required.  The
    return value is a sequence of the distributions that needed to be
    activated to fulfill the requirements; all relevant distributions are
    included, even if they were already activated in this working set.

    For the syntax of requirement specifiers, see the section below on
    `Requirements Parsing`_.

    In general, it should not be necessary for you to call this method
    directly.  It's intended more for use in quick-and-dirty scripting and
    interactive interpreter hacking than for production use. If you're creating
    an actual library or application, it's strongly recommended that you create
    a "setup.py" script using ``setuptools``, and declare all your requirements
    there.  That way, tools like EasyInstall can automatically detect what
    requirements your package has, and deal with them accordingly.

    Note that calling ``require('SomePackage')`` will not install
    ``SomePackage`` if it isn't already present.  If you need to do this, you
    should use the ``resolve()`` method instead, which allows you to pass an
    ``installer`` callback that will be invoked when a needed distribution
    can't be found on the local machine.  You can then have this callback
    display a dialog, automatically download the needed distribution, or
    whatever else is appropriate for your application. See the documentation
    below on the ``resolve()`` method for more information, and also on the
    ``obtain()`` method of ``Environment`` objects.

``run_script(requires, script_name)``
    Locate distribution specified by `requires` and run its `script_name`
    script.  `requires` must be a string containing a requirement specifier.
    (See `Requirements Parsing`_ below for the syntax.)

    The script, if found, will be executed in *the caller's globals*.  That's
    because this method is intended to be called from wrapper scripts that
    act as a proxy for the "real" scripts in a distribution.  A wrapper script
    usually doesn't need to do anything but invoke this function with the
    correct arguments.

    If you need more control over the script execution environment, you
    probably want to use the ``run_script()`` method of a ``Distribution``
    object's `Metadata API`_ instead.

``iter_entry_points(group, name=None)``
    Yield entry point objects from `group` matching `name`

    If `name` is None, yields all entry points in `group` from all
    distributions in the working set, otherwise only ones matching both
    `group` and `name` are yielded.  Entry points are yielded from the active
    distributions in the order that the distributions appear in the working
    set.  (For the global ``working_set``, this should be the same as the order
    that they are listed in ``sys.path``.)  Note that within the entry points
    advertised by an individual distribution, there is no particular ordering.

    Please see the section below on `Entry Points`_ for more information.


``WorkingSet`` Methods and Attributes
-------------------------------------

These methods are used to query or manipulate the contents of a specific
working set, so they must be explicitly invoked on a particular ``WorkingSet``
instance:

``add_entry(entry)``
    Add a path item to the ``entries``, finding any distributions on it.  You
    should use this when you add additional items to ``sys.path`` and you want
    the global ``working_set`` to reflect the change.  This method is also
    called by the ``WorkingSet()`` constructor during initialization.

    This method uses ``find_distributions(entry,True)`` to find distributions
    corresponding to the path entry, and then ``add()`` them.  `entry` is
    always appended to the ``entries`` attribute, even if it is already
    present, however. (This is because ``sys.path`` can contain the same value
    more than once, and the ``entries`` attribute should be able to reflect
    this.)

``__contains__(dist)``
    True if `dist` is active in this ``WorkingSet``.  Note that only one
    distribution for a given project can be active in a given ``WorkingSet``.

``__iter__()``
    Yield distributions for non-duplicate projects in the working set.
    The yield order is the order in which the items' path entries were
    added to the working set.

``find(req)``
    Find a distribution matching `req` (a ``Requirement`` instance).
    If there is an active distribution for the requested project, this
    returns it, as long as it meets the version requirement specified by
    `req`.  But, if there is an active distribution for the project and it
    does *not* meet the `req` requirement, ``VersionConflict`` is raised.
    If there is no active distribution for the requested project, ``None``
    is returned.

``resolve(requirements, env=None, installer=None)``
    List all distributions needed to (recursively) meet `requirements`

    `requirements` must be a sequence of ``Requirement`` objects.  `env`,
    if supplied, should be an ``Environment`` instance.  If
    not supplied, an ``Environment`` is created from the working set's
    ``entries``.  `installer`, if supplied, will be invoked with each
    requirement that cannot be met by an already-installed distribution; it
    should return a ``Distribution`` or ``None``.  (See the ``obtain()`` method
    of `Environment Objects`_, below, for more information on the `installer`
    argument.)

``add(dist, entry=None)``
    Add `dist` to working set, associated with `entry`

    If `entry` is unspecified, it defaults to ``dist.location``.  On exit from
    this routine, `entry` is added to the end of the working set's ``.entries``
    (if it wasn't already present).

    `dist` is only added to the working set if it's for a project that
    doesn't already have a distribution active in the set.  If it's
    successfully added, any  callbacks registered with the ``subscribe()``
    method will be called.  (See `Receiving Change Notifications`_, below.)

    Note: ``add()`` is automatically called for you by the ``require()``
    method, so you don't normally need to use this method directly.

``entries``
    This attribute represents a "shadow" ``sys.path``, primarily useful for
    debugging.  If you are experiencing import problems, you should check
    the global ``working_set`` object's ``entries`` against ``sys.path``, to
    ensure that they match.  If they do not, then some part of your program
    is manipulating ``sys.path`` without updating the ``working_set``
    accordingly.  IMPORTANT NOTE: do not directly manipulate this attribute!
    Setting it equal to ``sys.path`` will not fix your problem, any more than
    putting black tape over an "engine warning" light will fix your car!  If
    this attribute is out of sync with ``sys.path``, it's merely an *indicator*
    of the problem, not the cause of it.


Receiving Change Notifications
------------------------------

Extensible applications and frameworks may need to receive notification when
a new distribution (such as a plug-in component) has been added to a working
set.  This is what the ``subscribe()`` method and ``add_activation_listener()``
function are for.

``subscribe(callback)``
    Invoke ``callback(distribution)`` once for each active distribution that is
    in the set now, or gets added later.  Because the callback is invoked for
    already-active distributions, you do not need to loop over the working set
    yourself to deal with the existing items; just register the callback and
    be prepared for the fact that it will be called immediately by this method.

    Note that callbacks *must not* allow exceptions to propagate, or they will
    interfere with the operation of other callbacks and possibly result in an
    inconsistent working set state.  Callbacks should use a try/except block
    to ignore, log, or otherwise process any errors, especially since the code
    that caused the callback to be invoked is unlikely to be able to handle
    the errors any better than the callback itself.

``pkg_resources.add_activation_listener()`` is an alternate spelling of
``pkg_resources.working_set.subscribe()``.


Locating Plugins
----------------

Extensible applications will sometimes have a "plugin directory" or a set of
plugin directories, from which they want to load entry points or other
metadata.  The ``find_plugins()`` method allows you to do this, by scanning an
environment for the newest version of each project that can be safely loaded
without conflicts or missing requirements.

``find_plugins(plugin_env, full_env=None, fallback=True)``
   Scan `plugin_env` and identify which distributions could be added to this
   working set without version conflicts or missing requirements.

   Example usage::

       distributions, errors = working_set.find_plugins(
           Environment(plugin_dirlist)
       )
       map(working_set.add, distributions)  # add plugins+libs to sys.path
       print "Couldn't load", errors        # display errors

   The `plugin_env` should be an ``Environment`` instance that contains only
   distributions that are in the project's "plugin directory" or directories.
   The `full_env`, if supplied, should be an ``Environment`` instance that
   contains all currently-available distributions.

   If `full_env` is not supplied, one is created automatically from the
   ``WorkingSet`` this method is called on, which will typically mean that
   every directory on ``sys.path`` will be scanned for distributions.

   This method returns a 2-tuple: (`distributions`, `error_info`), where
   `distributions` is a list of the distributions found in `plugin_env` that
   were loadable, along with any other distributions that are needed to resolve
   their dependencies.  `error_info` is a dictionary mapping unloadable plugin
   distributions to an exception instance describing the error that occurred.
   Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
   instance.

   Most applications will use this method mainly on the master ``working_set``
   instance in ``pkg_resources``, and then immediately add the returned
   distributions to the working set so that they are available on sys.path.
   This will make it possible to find any entry points, and allow any other
   metadata tracking and hooks to be activated.

   The resolution algorithm used by ``find_plugins()`` is as follows.  First,
   the project names of the distributions present in `plugin_env` are sorted.
   Then, each project's eggs are tried in descending version order (i.e.,
   newest version first).

   An attempt is made to resolve each egg's dependencies. If the attempt is
   successful, the egg and its dependencies are added to the output list and to
   a temporary copy of the working set.  The resolution process continues with
   the next project name, and no older eggs for that project are tried.

   If the resolution attempt fails, however, the error is added to the error
   dictionary.  If the `fallback` flag is true, the next older version of the
   plugin is tried, until a working version is found.  If false, the resolution
   process continues with the next plugin project name.

   Some applications may have stricter fallback requirements than others. For
   example, an application that has a database schema or persistent objects
   may not be able to safely downgrade a version of a package. Others may want
   to ensure that a new plugin configuration is either 100% good or else
   revert to a known-good configuration.  (That is, they may wish to revert to
   a known configuration if the `error_info` return value is non-empty.)

   Note that this algorithm gives precedence to satisfying the dependencies of
   alphabetically prior project names in case of version conflicts. If two
   projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
   of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
   disabled due to version conflict.


``Environment`` Objects
=======================

An "environment" is a collection of ``Distribution`` objects, usually ones
that are present and potentially importable on the current platform.
``Environment`` objects are used by ``pkg_resources`` to index available
distributions during dependency resolution.

``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
    Create an environment snapshot by scanning `search_path` for distributions
    compatible with `platform` and `python`.  `search_path` should be a
    sequence of strings such as might be used on ``sys.path``.  If a
    `search_path` isn't supplied, ``sys.path`` is used.

    `platform` is an optional string specifying the name of the platform
    that platform-specific distributions must be compatible with.  If
    unspecified, it defaults to the current platform.  `python` is an
    optional string naming the desired version of Python (e.g. ``'2.4'``);
    it defaults to the currently-running version.

    You may explicitly set `platform` (and/or `python`) to ``None`` if you
    wish to include *all* distributions, not just those compatible with the
    running platform or Python version.

    Note that `search_path` is scanned immediately for distributions, and the
    resulting ``Environment`` is a snapshot of the found distributions.  It
    is not automatically updated if the system's state changes due to e.g.
    installation or removal of distributions.

``__getitem__(project_name)``
    Returns a list of distributions for the given project name, ordered
    from newest to oldest version.  (And highest to lowest format precedence
    for distributions that contain the same version of the project.)  If there
    are no distributions for the project, returns an empty list.

``__iter__()``
    Yield the unique project names of the distributions in this environment.
    The yielded names are always in lower case.

``add(dist)``
    Add `dist` to the environment if it matches the platform and python version
    specified at creation time, and only if the distribution hasn't already
    been added. (i.e., adding the same distribution more than once is a no-op.)

``remove(dist)``
    Remove `dist` from the environment.

``can_add(dist)``
    Is distribution `dist` acceptable for this environment?  If it's not
    compatible with the ``platform`` and ``python`` version values specified
    when the environment was created, a false value is returned.

``__add__(dist_or_env)``  (``+`` operator)
    Add a distribution or environment to an ``Environment`` instance, returning
    a *new* environment object that contains all the distributions previously
    contained by both.  The new environment will have a ``platform`` and
    ``python`` of ``None``, meaning that it will not reject any distributions
    from being added to it; it will simply accept whatever is added.  If you
    want the added items to be filtered for platform and Python version, or
    you want to add them to the *same* environment instance, you should use
    in-place addition (``+=``) instead.

``__iadd__(dist_or_env)``  (``+=`` operator)
    Add a distribution or environment to an ``Environment`` instance
    *in-place*, updating the existing instance and returning it.  The
    ``platform`` and ``python`` filter attributes take effect, so distributions
    in the source that do not have a suitable platform string or Python version
    are silently ignored.

``best_match(req, working_set, installer=None)``
    Find distribution best matching `req` and usable on `working_set`

    This calls the ``find(req)`` method of the `working_set` to see if a
    suitable distribution is already active.  (This may raise
    ``VersionConflict`` if an unsuitable version of the project is already
    active in the specified `working_set`.)  If a suitable distribution isn't
    active, this method returns the newest distribution in the environment
    that meets the ``Requirement`` in `req`.  If no suitable distribution is
    found, and `installer` is supplied, then the result of calling
    the environment's ``obtain(req, installer)`` method will be returned.

``obtain(requirement, installer=None)``
    Obtain a distro that matches requirement (e.g. via download).  In the
    base ``Environment`` class, this routine just returns
    ``installer(requirement)``, unless `installer` is None, in which case
    None is returned instead.  This method is a hook that allows subclasses
    to attempt other ways of obtaining a distribution before falling back
    to the `installer` argument.

``scan(search_path=None)``
    Scan `search_path` for distributions usable on `platform`

    Any distributions found are added to the environment.  `search_path` should
    be a sequence of strings such as might be used on ``sys.path``.  If not
    supplied, ``sys.path`` is used.  Only distributions conforming to
    the platform/python version defined at initialization are added.  This
    method is a shortcut for using the ``find_distributions()`` function to
    find the distributions from each item in `search_path`, and then calling
    ``add()`` to add each one to the environment.


``Requirement`` Objects
=======================

``Requirement`` objects express what versions of a project are suitable for
some purpose.  These objects (or their string form) are used by various
``pkg_resources`` APIs in order to find distributions that a script or
distribution needs.


Requirements Parsing
--------------------

``parse_requirements(s)``
    Yield ``Requirement`` objects for a string or iterable of lines.  Each
    requirement must start on a new line.  See below for syntax.

``Requirement.parse(s)``
    Create a ``Requirement`` object from a string or iterable of lines.  A
    ``ValueError`` is raised if the string or lines do not contain a valid
    requirement specifier, or if they contain more than one specifier.  (To
    parse multiple specifiers from a string or iterable of strings, use
    ``parse_requirements()`` instead.)

    The syntax of a requirement specifier is defined in full in PEP 508.

    Some examples of valid requirement specifiers::

        FooProject >= 1.2
        Fizzy [foo, bar]
        PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
        SomethingWhoseVersionIDontCareAbout
        SomethingWithMarker[foo]>1.0;python_version<"2.7"

    The project name is the only required portion of a requirement string, and
    if it's the only thing supplied, the requirement will accept any version
    of that project.

    The "extras" in a requirement are used to request optional features of a
    project, that may require additional project distributions in order to
    function.  For example, if the hypothetical "Report-O-Rama" project offered
    optional PDF support, it might require an additional library in order to
    provide that support.  Thus, a project needing Report-O-Rama's PDF features
    could use a requirement of ``Report-O-Rama[PDF]`` to request installation
    or activation of both Report-O-Rama and any libraries it needs in order to
    provide PDF support.  For example, you could use::

        easy_install.py Report-O-Rama[PDF]

    To install the necessary packages using the EasyInstall program, or call
    ``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
    distributions to sys.path at runtime.

    The "markers" in a requirement are used to specify when a requirement
    should be installed -- the requirement will be installed if the marker
    evaluates as true in the current environment. For example, specifying
    ``argparse;python_version<"2.7"`` will not install in an Python 2.7 or 3.3
    environment, but will in a Python 2.6 environment.

``Requirement`` Methods and Attributes
--------------------------------------

``__contains__(dist_or_version)``
    Return true if `dist_or_version` fits the criteria for this requirement.
    If `dist_or_version` is a ``Distribution`` object, its project name must
    match the requirement's project name, and its version must meet the
    requirement's version criteria.  If `dist_or_version` is a string, it is
    parsed using the ``parse_version()`` utility function.  Otherwise, it is
    assumed to be an already-parsed version.

    The ``Requirement`` object's version specifiers (``.specs``) are internally
    sorted into ascending version order, and used to establish what ranges of
    versions are acceptable.  Adjacent redundant conditions are effectively
    consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
    ``"<2,<3"`` produces the same results as``"<2"``). ``"!="`` versions are
    excised from the ranges they fall within.  The version being tested for
    acceptability is then checked for membership in the resulting ranges.

``__eq__(other_requirement)``
    A requirement compares equal to another requirement if they have
    case-insensitively equal project names, version specifiers, and "extras".
    (The order that extras and version specifiers are in is also ignored.)
    Equal requirements also have equal hashes, so that requirements can be
    used in sets or as dictionary keys.

``__str__()``
    The string form of a ``Requirement`` is a string that, if passed to
    ``Requirement.parse()``, would return an equal ``Requirement`` object.

``project_name``
    The name of the required project

``key``
    An all-lowercase version of the ``project_name``, useful for comparison
    or indexing.

``extras``
    A tuple of names of "extras" that this requirement calls for.  (These will
    be all-lowercase and normalized using the ``safe_extra()`` parsing utility
    function, so they may not exactly equal the extras the requirement was
    created with.)

``specs``
    A list of ``(op,version)`` tuples, sorted in ascending parsed-version
    order.  The `op` in each tuple is a comparison operator, represented as
    a string.  The `version` is the (unparsed) version number.

``marker``
    An instance of ``packaging.markers.Marker`` that allows evaluation
    against the current environment. May be None if no marker specified.

``url``
    The location to download the requirement from if specified.

Entry Points
============

Entry points are a simple way for distributions to "advertise" Python objects
(such as functions or classes) for use by other distributions.  Extensible
applications and frameworks can search for entry points with a particular name
or group, either from a specific distribution or from all active distributions
on sys.path, and then inspect or load the advertised objects at will.

Entry points belong to "groups" which are named with a dotted name similar to
a Python package or module name.  For example, the ``setuptools`` package uses
an entry point named ``distutils.commands`` in order to find commands defined
by distutils extensions.  ``setuptools`` treats the names of entry points
defined in that group as the acceptable commands for a setup script.

In a similar way, other packages can define their own entry point groups,
either using dynamic names within the group (like ``distutils.commands``), or
possibly using predefined names within the group.  For example, a blogging
framework that offers various pre- or post-publishing hooks might define an
entry point group and look for entry points named "pre_process" and
"post_process" within that group.

To advertise an entry point, a project needs to use ``setuptools`` and provide
an ``entry_points`` argument to ``setup()`` in its setup script, so that the
entry points will be included in the distribution's metadata.  For more
details, see the ``setuptools`` documentation.  (XXX link here to setuptools)

Each project distribution can advertise at most one entry point of a given
name within the same entry point group.  For example, a distutils extension
could advertise two different ``distutils.commands`` entry points, as long as
they had different names.  However, there is nothing that prevents *different*
projects from advertising entry points of the same name in the same group.  In
some cases, this is a desirable thing, since the application or framework that
uses the entry points may be calling them as hooks, or in some other way
combining them.  It is up to the application or framework to decide what to do
if multiple distributions advertise an entry point; some possibilities include
using both entry points, displaying an error message, using the first one found
in sys.path order, etc.


Convenience API
---------------

In the following functions, the `dist` argument can be a ``Distribution``
instance, a ``Requirement`` instance, or a string specifying a requirement
(i.e. project name, version, etc.).  If the argument is a string or
``Requirement``, the specified distribution is located (and added to sys.path
if not already present).  An error will be raised if a matching distribution is
not available.

The `group` argument should be a string containing a dotted identifier,
identifying an entry point group.  If you are defining an entry point group,
you should include some portion of your package's name in the group name so as
to avoid collision with other packages' entry point groups.

``load_entry_point(dist, group, name)``
    Load the named entry point from the specified distribution, or raise
    ``ImportError``.

``get_entry_info(dist, group, name)``
    Return an ``EntryPoint`` object for the given `group` and `name` from
    the specified distribution.  Returns ``None`` if the distribution has not
    advertised a matching entry point.

``get_entry_map(dist, group=None)``
    Return the distribution's entry point map for `group`, or the full entry
    map for the distribution.  This function always returns a dictionary,
    even if the distribution advertises no entry points.  If `group` is given,
    the dictionary maps entry point names to the corresponding ``EntryPoint``
    object.  If `group` is None, the dictionary maps group names to
    dictionaries that then map entry point names to the corresponding
    ``EntryPoint`` instance in that group.

``iter_entry_points(group, name=None)``
    Yield entry point objects from `group` matching `name`.

    If `name` is None, yields all entry points in `group` from all
    distributions in the working set on sys.path, otherwise only ones matching
    both `group` and `name` are yielded.  Entry points are yielded from
    the active distributions in the order that the distributions appear on
    sys.path.  (Within entry points for a particular distribution, however,
    there is no particular ordering.)

    (This API is actually a method of the global ``working_set`` object; see
    the section above on `Basic WorkingSet Methods`_ for more information.)


Creating and Parsing
--------------------

``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
    Create an ``EntryPoint`` instance.  `name` is the entry point name.  The
    `module_name` is the (dotted) name of the module containing the advertised
    object.  `attrs` is an optional tuple of names to look up from the
    module to obtain the advertised object.  For example, an `attrs` of
    ``("foo","bar")`` and a `module_name` of ``"baz"`` would mean that the
    advertised object could be obtained by the following code::

        import baz
        advertised_object = baz.foo.bar

    The `extras` are an optional tuple of "extra feature" names that the
    distribution needs in order to provide this entry point.  When the
    entry point is loaded, these extra features are looked up in the `dist`
    argument to find out what other distributions may need to be activated
    on sys.path; see the ``load()`` method for more details.  The `extras`
    argument is only meaningful if `dist` is specified.  `dist` must be
    a ``Distribution`` instance.

``EntryPoint.parse(src, dist=None)`` (classmethod)
    Parse a single entry point from string `src`

    Entry point syntax follows the form::

        name = some.module:some.attr [extra1,extra2]

    The entry name and module name are required, but the ``:attrs`` and
    ``[extras]`` parts are optional, as is the whitespace shown between
    some of the items.  The `dist` argument is passed through to the
    ``EntryPoint()`` constructor, along with the other values parsed from
    `src`.

``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
    Parse `lines` (a string or sequence of lines) to create a dictionary
    mapping entry point names to ``EntryPoint`` objects.  ``ValueError`` is
    raised if entry point names are duplicated, if `group` is not a valid
    entry point group name, or if there are any syntax errors.  (Note: the
    `group` parameter is used only for validation and to create more
    informative error messages.)  If `dist` is provided, it will be used to
    set the ``dist`` attribute of the created ``EntryPoint`` objects.

``EntryPoint.parse_map(data, dist=None)`` (classmethod)
    Parse `data` into a dictionary mapping group names to dictionaries mapping
    entry point names to ``EntryPoint`` objects.  If `data` is a dictionary,
    then the keys are used as group names and the values are passed to
    ``parse_group()`` as the `lines` argument.  If `data` is a string or
    sequence of lines, it is first split into .ini-style sections (using
    the ``split_sections()`` utility function) and the section names are used
    as group names.  In either case, the `dist` argument is passed through to
    ``parse_group()`` so that the entry points will be linked to the specified
    distribution.


``EntryPoint`` Objects
----------------------

For simple introspection, ``EntryPoint`` objects have attributes that
correspond exactly to the constructor argument names: ``name``,
``module_name``, ``attrs``, ``extras``, and ``dist`` are all available.  In
addition, the following methods are provided:

``load()``
    Load the entry point, returning the advertised Python object.  Effectively
    calls ``self.require()`` then returns ``self.resolve()``.

``require(env=None, installer=None)``
    Ensure that any "extras" needed by the entry point are available on
    sys.path.  ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
    but no ``dist``, or if the named extras are not defined by the
    distribution.  If `env` is supplied, it must be an ``Environment``, and it
    will be used to search for needed distributions if they are not already
    present on sys.path.  If `installer` is supplied, it must be a callable
    taking a ``Requirement`` instance and returning a matching importable
    ``Distribution`` instance or None.

``resolve()``
    Resolve the entry point from its module and attrs, returning the advertised
    Python object. Raises ``ImportError`` if it cannot be obtained.

``__str__()``
    The string form of an ``EntryPoint`` is a string that could be passed to
    ``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.


``Distribution`` Objects
========================

``Distribution`` objects represent collections of Python code that may or may
not be importable, and may or may not have metadata and resources associated
with them.  Their metadata may include information such as what other projects
the distribution depends on, what entry points the distribution advertises, and
so on.


Getting or Creating Distributions
---------------------------------

Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
an ``Environment``.  (See the sections above on `WorkingSet Objects`_ and
`Environment Objects`_, which are containers for active distributions and
available distributions, respectively.)  You can also obtain ``Distribution``
objects from one of these high-level APIs:

``find_distributions(path_item, only=False)``
    Yield distributions accessible via `path_item`.  If `only` is true, yield
    only distributions whose ``location`` is equal to `path_item`.  In other
    words, if `only` is true, this yields any distributions that would be
    importable if `path_item` were on ``sys.path``.  If `only` is false, this
    also yields distributions that are "in" or "under" `path_item`, but would
    not be importable unless their locations were also added to ``sys.path``.

``get_distribution(dist_spec)``
    Return a ``Distribution`` object for a given ``Requirement`` or string.
    If `dist_spec` is already a ``Distribution`` instance, it is returned.
    If it is a ``Requirement`` object or a string that can be parsed into one,
    it is used to locate and activate a matching distribution, which is then
    returned.

However, if you're creating specialized tools for working with distributions,
or creating a new distribution format, you may also need to create
``Distribution`` objects directly, using one of the three constructors below.

These constructors all take an optional `metadata` argument, which is used to
access any resources or metadata associated with the distribution.  `metadata`
must be an object that implements the ``IResourceProvider`` interface, or None.
If it is None, an ``EmptyProvider`` is used instead.  ``Distribution`` objects
implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
delegating them to the `metadata` object.

``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
    Create a distribution for `location`, which must be a string such as a
    URL, filename, or other string that might be used on ``sys.path``.
    `basename` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
    If `basename` ends with ``.egg``, then the project's name, version, python
    version and platform are extracted from the filename and used to set those
    properties of the created distribution.  Any additional keyword arguments
    are forwarded to the ``Distribution()`` constructor.

``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
    Create a distribution by parsing a local filename.  This is a shorter way
    of saying  ``Distribution.from_location(normalize_path(filename),
    os.path.basename(filename), metadata)``.  In other words, it creates a
    distribution whose location is the normalize form of the filename, parsing
    name and version information from the base portion of the filename.  Any
    additional keyword arguments are forwarded to the ``Distribution()``
    constructor.

``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
    Create a distribution by setting its properties.  All arguments are
    optional and default to None, except for `py_version` (which defaults to
    the current Python version) and `precedence` (which defaults to
    ``EGG_DIST``; for more details see ``precedence`` under `Distribution
    Attributes`_ below).  Note that it's usually easier to use the
    ``from_filename()`` or ``from_location()`` constructors than to specify
    all these arguments individually.


``Distribution`` Attributes
---------------------------

location
    A string indicating the distribution's location.  For an importable
    distribution, this is the string that would be added to ``sys.path`` to
    make it actively importable.  For non-importable distributions, this is
    simply a filename, URL, or other way of locating the distribution.

project_name
    A string, naming the project that this distribution is for.  Project names
    are defined by a project's setup script, and they are used to identify
    projects on PyPI.  When a ``Distribution`` is constructed, the
    `project_name` argument is passed through the ``safe_name()`` utility
    function to filter out any unacceptable characters.

key
    ``dist.key`` is short for ``dist.project_name.lower()``.  It's used for
    case-insensitive comparison and indexing of distributions by project name.

extras
    A list of strings, giving the names of extra features defined by the
    project's dependency list (the ``extras_require`` argument specified in
    the project's setup script).

version
    A string denoting what release of the project this distribution contains.
    When a ``Distribution`` is constructed, the `version` argument is passed
    through the ``safe_version()`` utility function to filter out any
    unacceptable characters.  If no `version` is specified at construction
    time, then attempting to access this attribute later will cause the
    ``Distribution`` to try to discover its version by reading its ``PKG-INFO``
    metadata file.  If ``PKG-INFO`` is unavailable or can't be parsed,
    ``ValueError`` is raised.

parsed_version
    The ``parsed_version`` is an object representing a "parsed" form of the
    distribution's ``version``.  ``dist.parsed_version`` is a shortcut for
    calling ``parse_version(dist.version)``.  It is used to compare or sort
    distributions by version.  (See the `Parsing Utilities`_ section below for
    more information on the ``parse_version()`` function.)  Note that accessing
    ``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
    was constructed without a `version` and without `metadata` capable of
    supplying the missing version info.

py_version
    The major/minor Python version the distribution supports, as a string.
    For example, "2.7" or "3.4".  The default is the current version of Python.

platform
    A string representing the platform the distribution is intended for, or
    ``None`` if the distribution is "pure Python" and therefore cross-platform.
    See `Platform Utilities`_ below for more information on platform strings.

precedence
    A distribution's ``precedence`` is used to determine the relative order of
    two distributions that have the same ``project_name`` and
    ``parsed_version``.  The default precedence is ``pkg_resources.EGG_DIST``,
    which is the highest (i.e. most preferred) precedence.  The full list
    of predefined precedences, from most preferred to least preferred, is:
    ``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
    ``DEVELOP_DIST``.  Normally, precedences other than ``EGG_DIST`` are used
    only by the ``setuptools.package_index`` module, when sorting distributions
    found in a package index to determine their suitability for installation.
    "System" and "Development" eggs (i.e., ones that use the ``.egg-info``
    format), however, are automatically given a precedence of ``DEVELOP_DIST``.



``Distribution`` Methods
------------------------

``activate(path=None)``
    Ensure distribution is importable on `path`.  If `path` is None,
    ``sys.path`` is used instead.  This ensures that the distribution's
    ``location`` is in the `path` list, and it also performs any necessary
    namespace package fixups or declarations.  (That is, if the distribution
    contains namespace packages, this method ensures that they are declared,
    and that the distribution's contents for those namespace packages are
    merged with the contents provided by any other active distributions.  See
    the section above on `Namespace Package Support`_ for more information.)

    ``pkg_resources`` adds a notification callback to the global ``working_set``
    that ensures this method is called whenever a distribution is added to it.
    Therefore, you should not normally need to explicitly call this method.
    (Note that this means that namespace packages on ``sys.path`` are always
    imported as soon as ``pkg_resources`` is, which is another reason why
    namespace packages should not contain any code or import statements.)

``as_requirement()``
    Return a ``Requirement`` instance that matches this distribution's project
    name and version.

``requires(extras=())``
    List the ``Requirement`` objects that specify this distribution's
    dependencies.  If `extras` is specified, it should be a sequence of names
    of "extras" defined by the distribution, and the list returned will then
    include any dependencies needed to support the named "extras".

``clone(**kw)``
    Create a copy of the distribution.  Any supplied keyword arguments override
    the corresponding argument to the ``Distribution()`` constructor, allowing
    you to change some of the copied distribution's attributes.

``egg_name()``
    Return what this distribution's standard filename should be, not including
    the ".egg" extension.  For example, a distribution for project "Foo"
    version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
    of ``Foo-1.2-py2.3-win32``.  Any dashes in the name or version are
    converted to underscores.  (``Distribution.from_location()`` will convert
    them back when parsing a ".egg" file name.)

``__cmp__(other)``, ``__hash__()``
    Distribution objects are hashed and compared on the basis of their parsed
    version and precedence, followed by their key (lowercase project name),
    location, Python version, and platform.

The following methods are used to access ``EntryPoint`` objects advertised
by the distribution.  See the section above on `Entry Points`_ for more
detailed information about these operations:

``get_entry_info(group, name)``
    Return the ``EntryPoint`` object for `group` and `name`, or None if no
    such point is advertised by this distribution.

``get_entry_map(group=None)``
    Return the entry point map for `group`.  If `group` is None, return
    a dictionary mapping group names to entry point maps for all groups.
    (An entry point map is a dictionary of entry point names to ``EntryPoint``
    objects.)

``load_entry_point(group, name)``
    Short for ``get_entry_info(group, name).load()``.  Returns the object
    advertised by the named entry point, or raises ``ImportError`` if
    the entry point isn't advertised by this distribution, or there is some
    other import problem.

In addition to the above methods, ``Distribution`` objects also implement all
of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
documented in later sections):

* ``has_metadata(name)``
* ``metadata_isdir(name)``
* ``metadata_listdir(name)``
* ``get_metadata(name)``
* ``get_metadata_lines(name)``
* ``run_script(script_name, namespace)``
* ``get_resource_filename(manager, resource_name)``
* ``get_resource_stream(manager, resource_name)``
* ``get_resource_string(manager, resource_name)``
* ``has_resource(resource_name)``
* ``resource_isdir(resource_name)``
* ``resource_listdir(resource_name)``

If the distribution was created with a `metadata` argument, these resource and
metadata access methods are all delegated to that `metadata` provider.
Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
will appear to have no resources or metadata.  This delegation approach is used
so that supporting custom importers or new distribution formats can be done
simply by creating an appropriate `IResourceProvider`_ implementation; see the
section below on `Supporting Custom Importers`_ for more details.


``ResourceManager`` API
=======================

The ``ResourceManager`` class provides uniform access to package resources,
whether those resources exist as files and directories or are compressed in
an archive of some kind.

Normally, you do not need to create or explicitly manage ``ResourceManager``
instances, as the ``pkg_resources`` module creates a global instance for you,
and makes most of its methods available as top-level names in the
``pkg_resources`` module namespace.  So, for example, this code actually
calls the ``resource_string()`` method of the global ``ResourceManager``::

    import pkg_resources
    my_data = pkg_resources.resource_string(__name__, "foo.dat")

Thus, you can use the APIs below without needing an explicit
``ResourceManager`` instance; just import and use them as needed.


Basic Resource Access
---------------------

In the following methods, the `package_or_requirement` argument may be either
a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
If it is a package or module name, the named module or package must be
importable (i.e., be in a distribution or directory on ``sys.path``), and the
`resource_name` argument is interpreted relative to the named package.  (Note
that if a module name is used, then the resource name is relative to the
package immediately containing the named module.  Also, you should not use use
a namespace package name, because a namespace package can be spread across
multiple distributions, and is therefore ambiguous as to which distribution
should be searched for the resource.)

If it is a ``Requirement``, then the requirement is automatically resolved
(searching the current ``Environment`` if necessary) and a matching
distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
already present.  (Unless the ``Requirement`` can't be satisfied, in which
case an exception is raised.)  The `resource_name` argument is then interpreted
relative to the root of the identified distribution; i.e. its first path
segment will be treated as a peer of the top-level modules or packages in the
distribution.

Note that resource names must be ``/``-separated paths and cannot be absolute
(i.e. no leading ``/``) or contain relative names like ``".."``.  Do *not* use
``os.path`` routines to manipulate resource paths, as they are *not* filesystem
paths.

``resource_exists(package_or_requirement, resource_name)``
    Does the named resource exist?  Return ``True`` or ``False`` accordingly.

``resource_stream(package_or_requirement, resource_name)``
    Return a readable file-like object for the specified resource; it may be
    an actual file, a ``StringIO``, or some similar object.  The stream is
    in "binary mode", in the sense that whatever bytes are in the resource
    will be read as-is.

``resource_string(package_or_requirement, resource_name)``
    Return the specified resource as a string.  The resource is read in
    binary fashion, such that the returned string contains exactly the bytes
    that are stored in the resource.

``resource_isdir(package_or_requirement, resource_name)``
    Is the named resource a directory?  Return ``True`` or ``False``
    accordingly.

``resource_listdir(package_or_requirement, resource_name)``
    List the contents of the named resource directory, just like ``os.listdir``
    except that it works even if the resource is in a zipfile.

Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
as to the resource type.  You cannot use ``resource_listdir()`` on a file
resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
directory resources.  Using an inappropriate method for the resource type may
result in an exception or undefined behavior, depending on the platform and
distribution format involved.


Resource Extraction
-------------------

``resource_filename(package_or_requirement, resource_name)``
    Sometimes, it is not sufficient to access a resource in string or stream
    form, and a true filesystem filename is needed.  In such cases, you can
    use this method (or module-level function) to obtain a filename for a
    resource.  If the resource is in an archive distribution (such as a zipped
    egg), it will be extracted to a cache directory, and the filename within
    the cache will be returned.  If the named resource is a directory, then
    all resources within that directory (including subdirectories) are also
    extracted.  If the named resource is a C extension or "eager resource"
    (see the ``setuptools`` documentation for details), then all C extensions
    and eager resources are extracted at the same time.

    Archived resources are extracted to a cache location that can be managed by
    the following two methods:

``set_extraction_path(path)``
    Set the base path where resources will be extracted to, if needed.

    If you do not call this routine before any extractions take place, the
    path defaults to the return value of ``get_default_cache()``.  (Which is
    based on the ``PYTHON_EGG_CACHE`` environment variable, with various
    platform-specific fallbacks.  See that routine's documentation for more
    details.)

    Resources are extracted to subdirectories of this path based upon
    information given by the resource provider.  You may set this to a
    temporary directory, but then you must call ``cleanup_resources()`` to
    delete the extracted files when done.  There is no guarantee that
    ``cleanup_resources()`` will be able to remove all extracted files.  (On
    Windows, for example, you can't unlink .pyd or .dll files that are still
    in use.)

    Note that you may not change the extraction path for a given resource
    manager once resources have been extracted, unless you first call
    ``cleanup_resources()``.

``cleanup_resources(force=False)``
    Delete all extracted resource files and directories, returning a list
    of the file and directory names that could not be successfully removed.
    This function does not have any concurrency protection, so it should
    generally only be called when the extraction path is a temporary
    directory exclusive to a single process.  This method is not
    automatically called; you must call it explicitly or register it as an
    ``atexit`` function if you wish to ensure cleanup of a temporary
    directory used for extractions.


"Provider" Interface
--------------------

If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
for a new distribution archive format, you may need to use the following
``IResourceManager`` methods to co-ordinate extraction of resources to the
filesystem.  If you're not implementing an archive format, however, you have
no need to use these methods.  Unlike the other methods listed above, they are
*not* available as top-level functions tied to the global ``ResourceManager``;
you must therefore have an explicit ``ResourceManager`` instance to use them.

``get_cache_path(archive_name, names=())``
    Return absolute location in cache for `archive_name` and `names`

    The parent directory of the resulting path will be created if it does
    not already exist.  `archive_name` should be the base filename of the
    enclosing egg (which may not be the name of the enclosing zipfile!),
    including its ".egg" extension.  `names`, if provided, should be a
    sequence of path name parts "under" the egg's extraction location.

    This method should only be called by resource providers that need to
    obtain an extraction location, and only for names they intend to
    extract, as it tracks the generated names for possible cleanup later.

``extraction_error()``
    Raise an ``ExtractionError`` describing the active exception as interfering
    with the extraction process.  You should call this if you encounter any
    OS errors extracting the file to the cache path; it will format the
    operating system exception for you, and add other information to the
    ``ExtractionError`` instance that may be needed by programs that want to
    wrap or handle extraction errors themselves.

``postprocess(tempname, filename)``
    Perform any platform-specific postprocessing of `tempname`.
    Resource providers should call this method ONLY after successfully
    extracting a compressed resource.  They must NOT call it on resources
    that are already in the filesystem.

    `tempname` is the current (temporary) name of the file, and `filename`
    is the name it will be renamed to by the caller after this routine
    returns.


Metadata API
============

The metadata API is used to access metadata resources bundled in a pluggable
distribution.  Metadata resources are virtual files or directories containing
information about the distribution, such as might be used by an extensible
application or framework to connect "plugins".  Like other kinds of resources,
metadata resource names are ``/``-separated and should not contain ``..`` or
begin with a ``/``.  You should not use ``os.path`` routines to manipulate
resource paths.

The metadata API is provided by objects implementing the ``IMetadataProvider``
or ``IResourceProvider`` interfaces.  ``Distribution`` objects implement this
interface, as do objects returned by the ``get_provider()`` function:

``get_provider(package_or_requirement)``
    If a package name is supplied, return an ``IResourceProvider`` for the
    package.  If a ``Requirement`` is supplied, resolve it by returning a
    ``Distribution`` from the current working set (searching the current
    ``Environment`` if necessary and adding the newly found ``Distribution``
    to the working set).  If the named package can't be imported, or the
    ``Requirement`` can't be satisfied, an exception is raised.

    NOTE: if you use a package name rather than a ``Requirement``, the object
    you get back may not be a pluggable distribution, depending on the method
    by which the package was installed.  In particular, "development" packages
    and "single-version externally-managed" packages do not have any way to
    map from a package name to the corresponding project's metadata.  Do not
    write code that passes a package name to ``get_provider()`` and then tries
    to retrieve project metadata from the returned object.  It may appear to
    work when the named package is in an ``.egg`` file or directory, but
    it will fail in other installation scenarios.  If you want project
    metadata, you need to ask for a *project*, not a package.


``IMetadataProvider`` Methods
-----------------------------

The methods provided by objects (such as ``Distribution`` instances) that
implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:

``has_metadata(name)``
    Does the named metadata resource exist?

``metadata_isdir(name)``
    Is the named metadata resource a directory?

``metadata_listdir(name)``
    List of metadata names in the directory (like ``os.listdir()``)

``get_metadata(name)``
    Return the named metadata resource as a string.  The data is read in binary
    mode; i.e., the exact bytes of the resource file are returned.

``get_metadata_lines(name)``
    Yield named metadata resource as list of non-blank non-comment lines.  This
    is short for calling ``yield_lines(provider.get_metadata(name))``.  See the
    section on `yield_lines()`_ below for more information on the syntax it
    recognizes.

``run_script(script_name, namespace)``
    Execute the named script in the supplied namespace dictionary.  Raises
    ``ResolutionError`` if there is no script by that name in the ``scripts``
    metadata directory.  `namespace` should be a Python dictionary, usually
    a module dictionary if the script is being run as a module.


Exceptions
==========

``pkg_resources`` provides a simple exception hierarchy for problems that may
occur when processing requests to locate and activate packages::

    ResolutionError
        DistributionNotFound
        VersionConflict
        UnknownExtra

    ExtractionError

``ResolutionError``
    This class is used as a base class for the other three exceptions, so that
    you can catch all of them with a single "except" clause.  It is also raised
    directly for miscellaneous requirement-resolution problems like trying to
    run a script that doesn't exist in the distribution it was requested from.

``DistributionNotFound``
    A distribution needed to fulfill a requirement could not be found.

``VersionConflict``
    The requested version of a project conflicts with an already-activated
    version of the same project.

``UnknownExtra``
    One of the "extras" requested was not recognized by the distribution it
    was requested from.

``ExtractionError``
    A problem occurred extracting a resource to the Python Egg cache.  The
    following attributes are available on instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail


Supporting Custom Importers
===========================

By default, ``pkg_resources`` supports normal filesystem imports, and
``zipimport`` importers.  If you wish to use the ``pkg_resources`` features
with other (PEP 302-compatible) importers or module loaders, you may need to
register various handlers and support functions using these APIs:

``register_finder(importer_type, distribution_finder)``
    Register `distribution_finder` to find distributions in ``sys.path`` items.
    `importer_type` is the type or class of a PEP 302 "Importer" (``sys.path``
    item handler), and `distribution_finder` is a callable that, when passed a
    path item, the importer instance, and an `only` flag, yields
    ``Distribution`` instances found under that path item.  (The `only` flag,
    if true, means the finder should yield only ``Distribution`` objects whose
    ``location`` is equal to the path item provided.)

    See the source of the ``pkg_resources.find_on_path`` function for an
    example finder function.

``register_loader_type(loader_type, provider_factory)``
    Register `provider_factory` to make ``IResourceProvider`` objects for
    `loader_type`.  `loader_type` is the type or class of a PEP 302
    ``module.__loader__``, and `provider_factory` is a function that, when
    passed a module object, returns an `IResourceProvider`_ for that module,
    allowing it to be used with the `ResourceManager API`_.

``register_namespace_handler(importer_type, namespace_handler)``
    Register `namespace_handler` to declare namespace packages for the given
    `importer_type`.  `importer_type` is the type or class of a PEP 302
    "importer" (sys.path item handler), and `namespace_handler` is a callable
    with a signature like this::

        def namespace_handler(importer, path_entry, moduleName, module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the relevant importer object has
    already agreed that it can handle the relevant path item.  The handler
    should only return a subpath if the module ``__path__`` does not already
    contain an equivalent subpath.  Otherwise, it should return None.

    For an example namespace handler, see the source of the
    ``pkg_resources.file_ns_handler`` function, which is used for both zipfile
    importing and regular importing.


IResourceProvider
-----------------

``IResourceProvider`` is an abstract class that documents what methods are
required of objects returned by a `provider_factory` registered with
``register_loader_type()``.  ``IResourceProvider`` is a subclass of
``IMetadataProvider``, so objects that implement this interface must also
implement all of the `IMetadataProvider Methods`_ as well as the methods
shown here.  The `manager` argument to the methods below must be an object
that supports the full `ResourceManager API`_ documented above.

``get_resource_filename(manager, resource_name)``
    Return a true filesystem path for `resource_name`, coordinating the
    extraction with `manager`, if the resource must be unpacked to the
    filesystem.

``get_resource_stream(manager, resource_name)``
    Return a readable file-like object for `resource_name`.

``get_resource_string(manager, resource_name)``
    Return a string containing the contents of `resource_name`.

``has_resource(resource_name)``
    Does the package contain the named resource?

``resource_isdir(resource_name)``
    Is the named resource a directory?  Return a false value if the resource
    does not exist or is not a directory.

``resource_listdir(resource_name)``
    Return a list of the contents of the resource directory, ala
    ``os.listdir()``.  Requesting the contents of a non-existent directory may
    raise an exception.

Note, by the way, that your provider classes need not (and should not) subclass
``IResourceProvider`` or ``IMetadataProvider``!  These classes exist solely
for documentation purposes and do not provide any useful implementation code.
You may instead wish to subclass one of the `built-in resource providers`_.


Built-in Resource Providers
---------------------------

``pkg_resources`` includes several provider classes that are automatically used
where appropriate.  Their inheritance tree looks like this::

    NullProvider
        EggProvider
            DefaultProvider
                PathMetadata
            ZipProvider
                EggMetadata
        EmptyProvider
            FileMetadata


``NullProvider``
    This provider class is just an abstract base that provides for common
    provider behaviors (such as running scripts), given a definition for just
    a few abstract methods.

``EggProvider``
    This provider class adds in some egg-specific features that are common
    to zipped and unzipped eggs.

``DefaultProvider``
    This provider class is used for unpacked eggs and "plain old Python"
    filesystem modules.

``ZipProvider``
    This provider class is used for all zipped modules, whether they are eggs
    or not.

``EmptyProvider``
    This provider class always returns answers consistent with a provider that
    has no metadata or resources.  ``Distribution`` objects created without
    a ``metadata`` argument use an instance of this provider class instead.
    Since all ``EmptyProvider`` instances are equivalent, there is no need
    to have more than one instance.  ``pkg_resources`` therefore creates a
    global instance of this class under the name ``empty_provider``, and you
    may use it if you have need of an ``EmptyProvider`` instance.

``PathMetadata(path, egg_info)``
    Create an ``IResourceProvider`` for a filesystem-based distribution, where
    `path` is the filesystem location of the importable modules, and `egg_info`
    is the filesystem location of the distribution's metadata directory.
    `egg_info` should usually be the ``EGG-INFO`` subdirectory of `path` for an
    "unpacked egg", and a ``ProjectName.egg-info`` subdirectory of `path` for
    a "development egg".  However, other uses are possible for custom purposes.

``EggMetadata(zipimporter)``
    Create an ``IResourceProvider`` for a zipfile-based distribution.  The
    `zipimporter` should be a ``zipimport.zipimporter`` instance, and may
    represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
    a specific egg *within* a basket, or a zipfile egg (where the zipfile
    itself is a ".egg").  It can also be a combination, such as a zipfile egg
    that also contains other eggs.

``FileMetadata(path_to_pkg_info)``
    Create an ``IResourceProvider`` that provides exactly one metadata
    resource: ``PKG-INFO``.  The supplied path should be a distutils PKG-INFO
    file.  This is basically the same as an ``EmptyProvider``, except that
    requests for ``PKG-INFO`` will be answered using the contents of the
    designated file.  (This provider is used to wrap ``.egg-info`` files
    installed by vendor-supplied system packages.)


Utility Functions
=================

In addition to its high-level APIs, ``pkg_resources`` also includes several
generally-useful utility routines.  These routines are used to implement the
high-level APIs, but can also be quite useful by themselves.


Parsing Utilities
-----------------

``parse_version(version)``
    Parsed a project's version string as defined by PEP 440. The returned
    value will be an object that represents the version. These objects may
    be compared to each other and sorted. The sorting algorithm is as defined
    by PEP 440 with the addition that any version which is not a valid PEP 440
    version will be considered less than any valid PEP 440 version and the
    invalid versions will continue sorting using the original algorithm.

.. _yield_lines():

``yield_lines(strs)``
    Yield non-empty/non-comment lines from a string/unicode or a possibly-
    nested sequence thereof.  If `strs` is an instance of ``basestring``, it
    is split into lines, and each non-blank, non-comment line is yielded after
    stripping leading and trailing whitespace.  (Lines whose first non-blank
    character is ``#`` are considered comment lines.)

    If `strs` is not an instance of ``basestring``, it is iterated over, and
    each item is passed recursively to ``yield_lines()``, so that an arbitrarily
    nested sequence of strings, or sequences of sequences of strings can be
    flattened out to the lines contained therein.  So for example, passing
    a file object or a list of strings to ``yield_lines`` will both work.
    (Note that between each string in a sequence of strings there is assumed to
    be an implicit line break, so lines cannot bridge two strings in a
    sequence.)

    This routine is used extensively by ``pkg_resources`` to parse metadata
    and file formats of various kinds, and most other ``pkg_resources``
    parsing functions that yield multiple values will use it to break up their
    input.  However, this routine is idempotent, so calling ``yield_lines()``
    on the output of another call to ``yield_lines()`` is completely harmless.

``split_sections(strs)``
    Split a string (or possibly-nested iterable thereof), yielding ``(section,
    content)`` pairs found using an ``.ini``-like syntax.  Each ``section`` is
    a whitespace-stripped version of the section name ("``[section]``")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any non-blank, non-comment lines before
    the first section header, they're yielded in a first ``section`` of
    ``None``.

    This routine uses ``yield_lines()`` as its front end, so you can pass in
    anything that ``yield_lines()`` accepts, such as an open text file, string,
    or sequence of strings.  ``ValueError`` is raised if a malformed section
    header is found (i.e. a line starting with ``[`` but not ending with
    ``]``).

    Note that this simplistic parser assumes that any line whose first nonblank
    character is ``[`` is a section heading, so it can't support .ini format
    variations that allow ``[`` as the first nonblank character on other lines.

``safe_name(name)``
    Return a "safe" form of a project's name, suitable for use in a
    ``Requirement`` string, as a distribution name, or a PyPI project name.
    All non-alphanumeric runs are condensed to single "-" characters, such that
    a name like "The $$$ Tree" becomes "The-Tree".  Note that if you are
    generating a filename from this value you should combine it with a call to
    ``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
    See ``to_filename()``.

``safe_version(version)``
    This will return the normalized form of any PEP 440 version, if the version
    string is not PEP 440 compatible than it is similar to ``safe_name()``
    except that spaces in the input become dots, and dots are allowed to exist
    in the output.  As with ``safe_name()``, if you are generating a filename
    from this you should replace any "-" characters in the output with
    underscores.

``safe_extra(extra)``
    Return a "safe" form of an extra's name, suitable for use in a requirement
    string or a setup script's ``extras_require`` keyword.  This routine is
    similar to ``safe_name()`` except that non-alphanumeric runs are replaced
    by a single underbar (``_``), and the result is lowercased.

``to_filename(name_or_version)``
    Escape a name or version string so it can be used in a dash-separated
    filename (or ``#egg=name-version`` tag) without ambiguity.  You
    should only pass in values that were returned by ``safe_name()`` or
    ``safe_version()``.


Platform Utilities
------------------

``get_build_platform()``
    Return this platform's identifier string.  For Windows, the return value
    is ``"win32"``, and for Mac OS X it is a string of the form
    ``"macosx-10.4-ppc"``.  All other platforms return the same uname-based
    string that the ``distutils.util.get_platform()`` function returns.
    This string is the minimum platform version required by distributions built
    on the local machine.  (Backward compatibility note: setuptools versions
    prior to 0.6b1 called this function ``get_platform()``, and the function is
    still available under that name for backward compatibility reasons.)

``get_supported_platform()`` (New in 0.6b1)
    This is the similar to ``get_build_platform()``, but is the maximum
    platform version that the local machine supports.  You will usually want
    to use this value as the ``provided`` argument to the
    ``compatible_platforms()`` function.

``compatible_platforms(provided, required)``
    Return true if a distribution built on the `provided` platform may be used
    on the `required` platform.  If either platform value is ``None``, it is
    considered a wildcard, and the platforms are therefore compatible.
    Likewise, if the platform strings are equal, they're also considered
    compatible, and ``True`` is returned.  Currently, the only non-equal
    platform strings that are considered compatible are Mac OS X platform
    strings with the same hardware type (e.g. ``ppc``) and major version
    (e.g. ``10``) with the `provided` platform's minor version being less than
    or equal to the `required` platform's minor version.

``get_default_cache()``
    Determine the default cache location for extracting resources from zipped
    eggs.  This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
    if set.  Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
    the user's "Application Data" directory.  On all other systems, it returns
    ``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
    set.


PEP 302 Utilities
-----------------

``get_importer(path_item)``
    Retrieve a PEP 302 "importer" for the given path item (which need not
    actually be on ``sys.path``).  This routine simulates the PEP 302 protocol
    for obtaining an "importer" object.  It first checks for an importer for
    the path item in ``sys.path_importer_cache``, and if not found it calls
    each of the ``sys.path_hooks`` and caches the result if a good importer is
    found.  If no importer is found, this routine returns an ``ImpWrapper``
    instance that wraps the builtin import machinery as a PEP 302-compliant
    "importer" object.  This ``ImpWrapper`` is *not* cached; instead a new
    instance is returned each time.

    (Note: When run under Python 2.5, this function is simply an alias for
    ``pkgutil.get_importer()``, and instead of ``pkg_resources.ImpWrapper``
    instances, it may return ``pkgutil.ImpImporter`` instances.)


File/Path Utilities
-------------------

``ensure_directory(path)``
    Ensure that the parent directory (``os.path.dirname``) of `path` actually
    exists, using ``os.makedirs()`` if necessary.

``normalize_path(path)``
    Return a "normalized" version of `path`, such that two paths represent
    the same filesystem location if they have equal ``normalized_path()``
    values.  Specifically, this is a shortcut for calling ``os.path.realpath``
    and ``os.path.normcase`` on `path`.  Unfortunately, on certain platforms
    (notably Cygwin and Mac OS X) the ``normcase`` function does not accurately
    reflect the platform's case-sensitivity, so there is always the possibility
    of two apparently-different paths being equal on such platforms.

History
-------

0.6c9
 * Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.

0.6c7
 * Fix package precedence problem where single-version eggs installed in
   ``site-packages`` would take precedence over ``.egg`` files (or directories)
   installed in ``site-packages``.

0.6c6
 * Fix extracted C extensions not having executable permissions under Cygwin.

 * Allow ``.egg-link`` files to contain relative paths.

 * Fix cache dir defaults on Windows when multiple environment vars are needed
   to construct a path.

0.6c4
 * Fix "dev" versions being considered newer than release candidates.

0.6c3
 * Python 2.5 compatibility fixes.

0.6c2
 * Fix a problem with eggs specified directly on ``PYTHONPATH`` on
   case-insensitive filesystems possibly not showing up in the default
   working set, due to differing normalizations of ``sys.path`` entries.

0.6b3
 * Fixed a duplicate path insertion problem on case-insensitive filesystems.

0.6b1
 * Split ``get_platform()`` into ``get_supported_platform()`` and
   ``get_build_platform()`` to work around a Mac versioning problem that caused
   the behavior of ``compatible_platforms()`` to be platform specific.

 * Fix entry point parsing when a standalone module name has whitespace
   between it and the extras.

0.6a11
 * Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
   cache permission problems get a more user-friendly explanation of the
   problem, and so that programs can catch and handle extraction errors if they
   need to.

0.6a10
 * Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
   method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
   to ``Environment``.

 * ``safe_name()`` now allows dots in project names.

 * There is a new ``to_filename()`` function that escapes project names and
   versions for safe use in constructing egg filenames from a Distribution
   object's metadata.

 * Added ``Distribution.clone()`` method, and keyword argument support to other
   ``Distribution`` constructors.

 * Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
   eggs using ``.egg-info`` format.

0.6a9
 * Don't raise an error when an invalid (unfinished) distribution is found
   unless absolutely necessary.  Warn about skipping invalid/unfinished eggs
   when building an Environment.

 * Added support for ``.egg-info`` files or directories with version/platform
   information embedded in the filename, so that system packagers have the
   option of including ``PKG-INFO`` files to indicate the presence of a
   system-installed egg, without needing to use ``.egg`` directories, zipfiles,
   or ``.pth`` manipulation.

 * Changed ``parse_version()`` to remove dashes before pre-release tags, so
   that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
   to ``0.2rc1``.  The idea that a dash *always* meant a post-release version
   was highly non-intuitive to setuptools users and Python developers, who
   seem to want to use ``-rc`` version numbers a lot.

0.6a8
 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version
   conflicts from being detected at runtime.

 * Improved runtime conflict warning message to identify a line in the user's
   program, rather than flagging the ``warn()`` call in ``pkg_resources``.

 * Avoid giving runtime conflict warnings for namespace packages, even if they
   were declared by a different package than the one currently being activated.

 * Fix path insertion algorithm for case-insensitive filesystems.

 * Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
   being set as an attribute of their parent package.

0.6a6
 * Activated distributions are now inserted in ``sys.path`` (and the working
   set) just before the directory that contains them, instead of at the end.
   This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
   the same location, and allows eggs found earlier on ``sys.path`` to override
   ones found later.

 * When a distribution is activated, it now checks whether any contained
   non-namespace modules have already been imported and issues a warning if
   a conflicting module has already been imported.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.

 * Fixed a problem extracting zipped files on Windows, when the egg in question
   has had changed contents but still has the same version number.

0.6a4
 * Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.

0.6a3
 * Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
   EntryPoint, and Distribution objects' extras handling.

0.6a1
 * Enhanced performance of ``require()`` and related operations when all
   requirements are already in the working set, and enhanced performance of
   directory scanning for distributions.

 * Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
   ``zipimport``, and the previously-broken "eager resource" support.

 * Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
   some other resource API bugs.

 * Many API changes and enhancements:

   * Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
     ``get_entry_info`` APIs for dynamic plugin discovery.

   * ``list_resources`` is now ``resource_listdir`` (and it actually works)

   * Resource API functions like ``resource_string()`` that accepted a package
     name and resource name, will now also accept a ``Requirement`` object in
     place of the package name (to allow access to non-package data files in
     an egg).

   * ``get_provider()`` will now accept a ``Requirement`` instance or a module
     name.  If it is given a ``Requirement``, it will return a corresponding
     ``Distribution`` (by calling ``require()`` if a suitable distribution
     isn't already in the working set), rather than returning a metadata and
     resource provider for a specific module.  (The difference is in how
     resource paths are interpreted; supplying a module name means resources
     path will be module-relative, rather than relative to the distribution's
     root.)

   * ``Distribution`` objects now implement the ``IResourceProvider`` and
     ``IMetadataProvider`` interfaces, so you don't need to reference the (no
     longer available) ``metadata`` attribute to get at these interfaces.

   * ``Distribution`` and ``Requirement`` both have a ``project_name``
     attribute for the project name they refer to.  (Previously these were
     ``name`` and ``distname`` attributes.)

   * The ``path`` attribute of ``Distribution`` objects is now ``location``,
     because it isn't necessarily a filesystem path (and hasn't been for some
     time now).  The ``location`` of ``Distribution`` objects in the filesystem
     should always be normalized using ``pkg_resources.normalize_path()``; all
     of the setuptools and EasyInstall code that generates distributions from
     the filesystem (including ``Distribution.from_filename()``) ensure this
     invariant, but if you use a more generic API like ``Distribution()`` or
     ``Distribution.from_location()`` you should take care that you don't
     create a distribution with an un-normalized filesystem path.

   * ``Distribution`` objects now have an ``as_requirement()`` method that
     returns a ``Requirement`` for the distribution's project name and version.

   * Distribution objects no longer have an ``installed_on()`` method, and the
     ``install_on()`` method is now ``activate()`` (but may go away altogether
     soon).  The ``depends()`` method has also been renamed to ``requires()``,
     and ``InvalidOption`` is now ``UnknownExtra``.

   * ``find_distributions()`` now takes an additional argument called ``only``,
     that tells it to only yield distributions whose location is the passed-in
     path.  (It defaults to False, so that the default behavior is unchanged.)

   * ``AvailableDistributions`` is now called ``Environment``, and the
     ``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
     because they weren't particularly useful.  ``__getitem__()`` no longer
     raises ``KeyError``; it just returns an empty list if there are no
     distributions for the named project.

   * The ``resolve()`` method of ``Environment`` is now a method of
     ``WorkingSet`` instead, and the ``best_match()`` method now uses a working
     set instead of a path list as its second argument.

   * There is a new ``pkg_resources.add_activation_listener()`` API that lets
     you register a callback for notifications about distributions added to
     ``sys.path`` (including the distributions already on it).  This is
     basically a hook for extensible applications and frameworks to be able to
     search for plugin metadata in distributions added at runtime.

0.5a13
 * Fixed a bug in resource extraction from nested packages in a zipped egg.

0.5a12
 * Updated extraction/cache mechanism for zipped resources to avoid inter-
   process and inter-thread races during extraction.  The default cache
   location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
   and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
   current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
   variable isn't set.

0.5a10
 * Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
   ``sys.path`` (e.g. if a user deletes an egg without removing it from the
   ``easy-install.pth`` file).

 * Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
   never actually went inside ``.egg`` files.

 * Made ``pkg_resources`` import the module you request resources from, if it's
   not already imported.

0.5a4
 * ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
   accept an ``installer`` argument: a callable taking one argument, a
   ``Requirement`` instance.  The callable must return a ``Distribution``
   object, or ``None`` if no distribution is found.  This feature is used by
   EasyInstall to resolve dependencies by recursively invoking itself.

0.4a4
 * Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
   directory extraction for zipped eggs.

0.4a3
 * Fixed scripts not being able to see a ``__file__`` variable in ``__main__``

 * Fixed a problem with ``resource_isdir()`` implementation that was introduced
   in 0.4a2.

0.4a1
 * Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
   ``!=``) when only one condition was included.

 * Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
   arbitrary distribution names and versions found on PyPI.

0.3a4
 * ``pkg_resources`` now supports resource directories, not just the resources
   in them.  In particular, there are ``resource_listdir()`` and
   ``resource_isdir()`` APIs.

 * ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
   multiple distributions in subdirectories whose names end with ``.egg``.
   Having such a "basket" in a directory on ``sys.path`` is equivalent to
   having the individual eggs in that directory, but the contained eggs can
   be individually added (or not) to ``sys.path``.  Currently, however, there
   is no automated way to create baskets.

 * Namespace package manipulation is now protected by the Python import lock.

0.3a1
 * Initial release.

doc/alt-python35-setuptools/psfl.txt000064400000030737151733306540013525 0ustar00A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
Reserved" are retained in Python alone or in any derivative version prepared by
Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
doc/alt-python35-setuptools/easy_install.txt000064400000223431151733306540015243 0ustar00============
Easy Install
============

Easy Install is a python module (``easy_install``) bundled with ``setuptools``
that lets you automatically download, build, install, and manage Python
packages.

Please share your experiences with us! If you encounter difficulty installing
a package, please contact us via the `distutils mailing list
<http://mail.python.org/pipermail/distutils-sig/>`_.  (Note: please DO NOT send
private email directly to the author of setuptools; it will be discarded.  The
mailing list is a searchable archive of previously-asked and answered
questions; you should begin your research there before reporting something as a
bug -- and then do so via list discussion first.)

(Also, if you'd like to learn about how you can use ``setuptools`` to make your
own packages work better with EasyInstall, or provide EasyInstall-like features
without requiring your users to use EasyInstall directly, you'll probably want
to check out the full `setuptools`_ documentation as well.)

.. contents:: **Table of Contents**


Using "Easy Install"
====================


.. _installation instructions:

Installing "Easy Install"
-------------------------

Please see the `setuptools PyPI page <https://pypi.python.org/pypi/setuptools>`_
for download links and basic installation instructions for each of the
supported platforms.

You will need at least Python 2.6.  An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform.

Note that the instructions on the setuptools PyPI page assume that you are
are installing to Python's primary ``site-packages`` directory.  If this is
not the case, you should consult the section below on `Custom Installation
Locations`_ before installing.  (And, on Windows, you should not use the
``.exe`` installer when installing to an alternate location.)

Note that ``easy_install`` normally works by downloading files from the
internet.  If you are behind an NTLM-based firewall that prevents Python
programs from accessing the net directly, you may wish to first install and use
the `APS proxy server <http://ntlmaps.sf.net/>`_, which lets you get past such
firewalls in the same way that your web browser(s) do.

(Alternately, if you do not wish easy_install to actually download anything, you
can restrict it from doing so with the ``--allow-hosts`` option; see the
sections on `restricting downloads with --allow-hosts`_ and `command-line
options`_ for more details.)


Troubleshooting
~~~~~~~~~~~~~~~

If EasyInstall/setuptools appears to install correctly, and you can run the
``easy_install`` command but it fails with an ``ImportError``, the most likely
cause is that you installed to a location other than ``site-packages``,
without taking any of the steps described in the `Custom Installation
Locations`_ section below.  Please see that section and follow the steps to
make sure that your custom location will work correctly.  Then re-install.

Similarly, if you can run ``easy_install``, and it appears to be installing
packages, but then you can't import them, the most likely issue is that you
installed EasyInstall correctly but are using it to install packages to a
non-standard location that hasn't been properly prepared.  Again, see the
section on `Custom Installation Locations`_ for more details.


Windows Notes
~~~~~~~~~~~~~

Installing setuptools will provide an ``easy_install`` command according to
the techniques described in `Executables and Launchers`_. If the
``easy_install`` command is not available after installation, that section
provides details on how to configure Windows to make the commands available.


Downloading and Installing a Package
------------------------------------

For basic use of ``easy_install``, you need only supply the filename or URL of
a source distribution or .egg file (`Python Egg`__).

__ http://peak.telecommunity.com/DevCenter/PythonEggs

**Example 1**. Install a package by name, searching PyPI for the latest
version, and automatically downloading, building, and installing it::

    easy_install SQLObject

**Example 2**. Install or upgrade a package by name and version by finding
links on a given "download page"::

    easy_install -f http://pythonpaste.org/package_index.html SQLObject

**Example 3**. Download a source distribution from a specified URL,
automatically building and installing it::

    easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

**Example 4**. Install an already-downloaded .egg file::

    easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

**Example 5**.  Upgrade an already-installed package to the latest version
listed on PyPI::

    easy_install --upgrade PyProtocols

**Example 6**.  Install a source distribution that's already downloaded and
extracted in the current directory (New in 0.5a9)::

    easy_install .

**Example 7**.  (New in 0.6a1) Find a source distribution or Subversion
checkout URL for a package, and extract it or check it out to
``~/projects/sqlobject`` (the name will always be in all-lowercase), where it
can be examined or edited.  (The package will not be installed, but it can
easily be installed with ``easy_install ~/projects/sqlobject``.  See `Editing
and Viewing Source Packages`_ below for more info.)::

    easy_install --editable --build-directory ~/projects SQLObject

**Example 7**. (New in 0.6.11) Install a distribution within your home dir::

    easy_install --user SQLAlchemy

Easy Install accepts URLs, filenames, PyPI package names (i.e., ``distutils``
"distribution" names), and package+version specifiers.  In each case, it will
attempt to locate the latest available version that meets your criteria.

When downloading or processing downloaded files, Easy Install recognizes
distutils source distribution files with extensions of .tgz, .tar, .tar.gz,
.tar.bz2, or .zip.  And of course it handles already-built .egg
distributions as well as ``.win32.exe`` installers built using distutils.

By default, packages are installed to the running Python installation's
``site-packages`` directory, unless you provide the ``-d`` or ``--install-dir``
option to specify an alternative directory, or specify an alternate location
using distutils configuration files.  (See `Configuration Files`_, below.)

By default, any scripts included with the package are installed to the running
Python installation's standard script installation location.  However, if you
specify an installation directory via the command line or a config file, then
the default directory for installing scripts will be the same as the package
installation directory, to ensure that the script will have access to the
installed package.  You can override this using the ``-s`` or ``--script-dir``
option.

Installed packages are added to an ``easy-install.pth`` file in the install
directory, so that Python will always use the most-recently-installed version
of the package.  If you would like to be able to select which version to use at
runtime, you should use the ``-m`` or ``--multi-version`` option.


Upgrading a Package
-------------------

You don't need to do anything special to upgrade a package: just install the
new version, either by requesting a specific version, e.g.::

    easy_install "SomePackage==2.0"

a version greater than the one you have now::

    easy_install "SomePackage>2.0"

using the upgrade flag, to find the latest available version on PyPI::

    easy_install --upgrade SomePackage

or by using a download page, direct download URL, or package filename::

    easy_install -f http://example.com/downloads ExamplePackage

    easy_install http://example.com/downloads/ExamplePackage-2.0-py2.4.egg

    easy_install my_downloads/ExamplePackage-2.0.tgz

If you're using ``-m`` or ``--multi-version`` , using the ``require()``
function at runtime automatically selects the newest installed version of a
package that meets your version criteria.  So, installing a newer version is
the only step needed to upgrade such packages.

If you're installing to a directory on PYTHONPATH, or a configured "site"
directory (and not using ``-m``), installing a package automatically replaces
any previous version in the ``easy-install.pth`` file, so that Python will
import the most-recently installed version by default.  So, again, installing
the newer version is the only upgrade step needed.

If you haven't suppressed script installation (using ``--exclude-scripts`` or
``-x``), then the upgraded version's scripts will be installed, and they will
be automatically patched to ``require()`` the corresponding version of the
package, so that you can use them even if they are installed in multi-version
mode.

``easy_install`` never actually deletes packages (unless you're installing a
package with the same name and version number as an existing package), so if
you want to get rid of older versions of a package, please see `Uninstalling
Packages`_, below.


Changing the Active Version
---------------------------

If you've upgraded a package, but need to revert to a previously-installed
version, you can do so like this::

    easy_install PackageName==1.2.3

Where ``1.2.3`` is replaced by the exact version number you wish to switch to.
If a package matching the requested name and version is not already installed
in a directory on ``sys.path``, it will be located via PyPI and installed.

If you'd like to switch to the latest installed version of ``PackageName``, you
can do so like this::

    easy_install PackageName

This will activate the latest installed version.  (Note: if you have set any
``find_links`` via distutils configuration files, those download pages will be
checked for the latest available version of the package, and it will be
downloaded and installed if it is newer than your current version.)

Note that changing the active version of a package will install the newly
active version's scripts, unless the ``--exclude-scripts`` or ``-x`` option is
specified.


Uninstalling Packages
---------------------

If you have replaced a package with another version, then you can just delete
the package(s) you don't need by deleting the PackageName-versioninfo.egg file
or directory (found in the installation directory).

If you want to delete the currently installed version of a package (or all
versions of a package), you should first run::

    easy_install -m PackageName

This will ensure that Python doesn't continue to search for a package you're
planning to remove. After you've done this, you can safely delete the .egg
files or directories, along with any scripts you wish to remove.


Managing Scripts
----------------

Whenever you install, upgrade, or change versions of a package, EasyInstall
automatically installs the scripts for the selected package version, unless
you tell it not to with ``-x`` or ``--exclude-scripts``.  If any scripts in
the script directory have the same name, they are overwritten.

Thus, you do not normally need to manually delete scripts for older versions of
a package, unless the newer version of the package does not include a script
of the same name.  However, if you are completely uninstalling a package, you
may wish to manually delete its scripts.

EasyInstall's default behavior means that you can normally only run scripts
from one version of a package at a time.  If you want to keep multiple versions
of a script available, however, you can simply use the ``--multi-version`` or
``-m`` option, and rename the scripts that EasyInstall creates.  This works
because EasyInstall installs scripts as short code stubs that ``require()`` the
matching version of the package the script came from, so renaming the script
has no effect on what it executes.

For example, suppose you want to use two versions of the ``rst2html`` tool
provided by the `docutils <http://docutils.sf.net/>`_ package.  You might
first install one version::

    easy_install -m docutils==0.3.9

then rename the ``rst2html.py`` to ``r2h_039``, and install another version::

    easy_install -m docutils==0.3.10

This will create another ``rst2html.py`` script, this one using docutils
version 0.3.10 instead of 0.3.9.  You now have two scripts, each using a
different version of the package.  (Notice that we used ``-m`` for both
installations, so that Python won't lock us out of using anything but the most
recently-installed version of the package.)


Executables and Launchers
-------------------------

On Unix systems, scripts are installed with as natural files with a "#!"
header and no extension and they launch under the Python version indicated in
the header.

On Windows, there is no mechanism to "execute" files without extensions, so
EasyInstall provides two techniques to mirror the Unix behavior. The behavior
is indicated by the SETUPTOOLS_LAUNCHER environment variable, which may be
"executable" (default) or "natural".

Regardless of the technique used, the script(s) will be installed to a Scripts
directory (by default in the Python installation directory). It is recommended
for EasyInstall that you ensure this directory is in the PATH environment
variable. The easiest way to ensure the Scripts directory is in the PATH is
to run ``Tools\Scripts\win_add2path.py`` from the Python directory (requires
Python 2.6 or later).

Note that instead of changing your ``PATH`` to include the Python scripts
directory, you can also retarget the installation location for scripts so they
go on a directory that's already on the ``PATH``.  For more information see
`Command-Line Options`_ and `Configuration Files`_.  During installation,
pass command line options (such as ``--script-dir``) to
``ez_setup.py`` to control where ``easy_install.exe`` will be installed.


Windows Executable Launcher
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the "executable" launcher is used, EasyInstall will create a '.exe'
launcher of the same name beside each installed script (including
``easy_install`` itself). These small .exe files launch the script of the
same name using the Python version indicated in the '#!' header.

This behavior is currently default. To force
the use of executable launchers, set ``SETUPTOOLS_LAUNCHER`` to "executable".

Natural Script Launcher
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall also supports deferring to an external launcher such as
`pylauncher <https://bitbucket.org/pypa/pylauncher>`_ for launching scripts.
Enable this experimental functionality by setting the
``SETUPTOOLS_LAUNCHER`` environment variable to "natural". EasyInstall will
then install scripts as simple
scripts with a .pya (or .pyw) extension appended. If these extensions are
associated with the pylauncher and listed in the PATHEXT environment variable,
these scripts can then be invoked simply and directly just like any other
executable. This behavior may become default in a future version.

EasyInstall uses the .pya extension instead of simply
the typical '.py' extension. This distinct extension is necessary to prevent
Python
from treating the scripts as importable modules (where name conflicts exist).
Current releases of pylauncher do not yet associate with .pya files by
default, but future versions should do so.


Tips & Techniques
-----------------

Multiple Python Versions
~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall installs itself under two names:
``easy_install`` and ``easy_install-N.N``, where ``N.N`` is the Python version
used to install it.  Thus, if you install EasyInstall for both Python 3.2 and
2.7, you can use the ``easy_install-3.2`` or ``easy_install-2.7`` scripts to
install packages for the respective Python version.

Setuptools also supplies easy_install as a runnable module which may be
invoked using ``python -m easy_install`` for any Python with Setuptools
installed.

Restricting Downloads with ``--allow-hosts``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the ``--allow-hosts`` (``-H``) option to restrict what domains
EasyInstall will look for links and downloads on.  ``--allow-hosts=None``
prevents downloading altogether.  You can also use wildcards, for example
to restrict downloading to hosts in your own intranet.  See the section below
on `Command-Line Options`_ for more details on the ``--allow-hosts`` option.

By default, there are no host restrictions in effect, but you can change this
default by editing the appropriate `configuration files`_ and adding:

.. code-block:: ini

    [easy_install]
    allow_hosts = *.myintranet.example.com,*.python.org

The above example would then allow downloads only from hosts in the
``python.org`` and ``myintranet.example.com`` domains, unless overridden on the
command line.


Installing on Un-networked Machines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Just copy the eggs or source packages you need to a directory on the target
machine, then use the ``-f`` or ``--find-links`` option to specify that
directory's location.  For example::

    easy_install -H None -f somedir SomePackage

will attempt to install SomePackage using only eggs and source packages found
in ``somedir`` and disallowing all remote access.  You should of course make
sure you have all of SomePackage's dependencies available in somedir.

If you have another machine of the same operating system and library versions
(or if the packages aren't platform-specific), you can create the directory of
eggs using a command like this::

    easy_install -zmaxd somedir SomePackage

This will tell EasyInstall to put zipped eggs or source packages for
SomePackage and all its dependencies into ``somedir``, without creating any
scripts or .pth files.  You can then copy the contents of ``somedir`` to the
target machine.  (``-z`` means zipped eggs, ``-m`` means multi-version, which
prevents .pth files from being used, ``-a`` means to copy all the eggs needed,
even if they're installed elsewhere on the machine, and ``-d`` indicates the
directory to place the eggs in.)

You can also build the eggs from local development packages that were installed
with the ``setup.py develop`` command, by including the ``-l`` option, e.g.::

    easy_install -zmaxld somedir SomePackage

This will use locally-available source distributions to build the eggs.


Packaging Others' Projects As Eggs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Need to distribute a package that isn't published in egg form?  You can use
EasyInstall to build eggs for a project.  You'll want to use the ``--zip-ok``,
``--exclude-scripts``, and possibly ``--no-deps`` options (``-z``, ``-x`` and
``-N``, respectively).  Use ``-d`` or ``--install-dir`` to specify the location
where you'd like the eggs placed.  By placing them in a directory that is
published to the web, you can then make the eggs available for download, either
in an intranet or to the internet at large.

If someone distributes a package in the form of a single ``.py`` file, you can
wrap it in an egg by tacking an ``#egg=name-version`` suffix on the file's URL.
So, something like this::

    easy_install -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will install the package as an egg, and this::

    easy_install -zmaxd. \
        -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will create a ``.egg`` file in the current directory.


Creating your own Package Index
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition to local directories and the Python Package Index, EasyInstall can
find download links on most any web page whose URL is given to the ``-f``
(``--find-links``) option.  In the simplest case, you can simply have a web
page with links to eggs or Python source packages, even an automatically
generated directory listing (such as the Apache web server provides).

If you are setting up an intranet site for package downloads, you may want to
configure the target machines to use your download site by default, adding
something like this to their `configuration files`_:

.. code-block:: ini

    [easy_install]
    find_links = http://mypackages.example.com/somedir/
                 http://turbogears.org/download/
                 http://peak.telecommunity.com/dist/

As you can see, you can list multiple URLs separated by whitespace, continuing
on multiple lines if necessary (as long as the subsequent lines are indented.

If you are more ambitious, you can also create an entirely custom package index
or PyPI mirror.  See the ``--index-url`` option under `Command-Line Options`_,
below, and also the section on `Package Index "API"`_.


Password-Protected Sites
------------------------

If a site you want to download from is password-protected using HTTP "Basic"
authentication, you can specify your credentials in the URL, like so::

    http://some_userid:some_password@some.example.com/some_path/

You can do this with both index page URLs and direct download URLs.  As long
as any HTML pages read by easy_install use *relative* links to point to the
downloads, the same user ID and password will be used to do the downloading.

Using .pypirc Credentials
-------------------------

In additional to supplying credentials in the URL, ``easy_install`` will also
honor credentials if present in the .pypirc file. Teams maintaining a private
repository of packages may already have defined access credentials for
uploading packages according to the distutils documentation. ``easy_install``
will attempt to honor those if present. Refer to the distutils documentation
for Python 2.5 or later for details on the syntax.

Controlling Build Options
~~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall respects standard distutils `Configuration Files`_, so you can use
them to configure build options for packages that it installs from source.  For
example, if you are on Windows using the MinGW compiler, you can configure the
default compiler by putting something like this:

.. code-block:: ini

    [build]
    compiler = mingw32

into the appropriate distutils configuration file.  In fact, since this is just
normal distutils configuration, it will affect any builds using that config
file, not just ones done by EasyInstall.  For example, if you add those lines
to ``distutils.cfg`` in the ``distutils`` package directory, it will be the
default compiler for *all* packages you build.  See `Configuration Files`_
below for a list of the standard configuration file locations, and links to
more documentation on using distutils configuration files.


Editing and Viewing Source Packages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sometimes a package's source distribution  contains additional documentation,
examples, configuration files, etc., that are not part of its actual code.  If
you want to be able to examine these files, you can use the ``--editable``
option to EasyInstall, and EasyInstall will look for a source distribution
or Subversion URL for the package, then download and extract it or check it out
as a subdirectory of the ``--build-directory`` you specify.  If you then wish
to install the package after editing or configuring it, you can do so by
rerunning EasyInstall with that directory as the target.

Note that using ``--editable`` stops EasyInstall from actually building or
installing the package; it just finds, obtains, and possibly unpacks it for
you.  This allows you to make changes to the package if necessary, and to
either install it in development mode using ``setup.py develop`` (if the
package uses setuptools, that is), or by running ``easy_install projectdir``
(where ``projectdir`` is the subdirectory EasyInstall created for the
downloaded package.

In order to use ``--editable`` (``-e`` for short), you *must* also supply a
``--build-directory`` (``-b`` for short).  The project will be placed in a
subdirectory of the build directory.  The subdirectory will have the same
name as the project itself, but in all-lowercase.  If a file or directory of
that name already exists, EasyInstall will print an error message and exit.

Also, when using ``--editable``, you cannot use URLs or filenames as arguments.
You *must* specify project names (and optional version requirements) so that
EasyInstall knows what directory name(s) to create.  If you need to force
EasyInstall to use a particular URL or filename, you should specify it as a
``--find-links`` item (``-f`` for short), and then also specify
the project name, e.g.::

    easy_install -eb ~/projects \
     -fhttp://prdownloads.sourceforge.net/ctypes/ctypes-0.9.6.tar.gz?download \
     ctypes==0.9.6


Dealing with Installation Conflicts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(NOTE: As of 0.6a11, this section is obsolete; it is retained here only so that
people using older versions of EasyInstall can consult it.  As of version
0.6a11, installation conflicts are handled automatically without deleting the
old or system-installed packages, and without ignoring the issue.  Instead,
eggs are automatically shifted to the front of ``sys.path`` using special
code added to the ``easy-install.pth`` file.  So, if you are using version
0.6a11 or better of setuptools, you do not need to worry about conflicts,
and the following issues do not apply to you.)

EasyInstall installs distributions in a "managed" way, such that each
distribution can be independently activated or deactivated on ``sys.path``.
However, packages that were not installed by EasyInstall are "unmanaged",
in that they usually live all in one directory and cannot be independently
activated or deactivated.

As a result, if you are using EasyInstall to upgrade an existing package, or
to install a package with the same name as an existing package, EasyInstall
will warn you of the conflict.  (This is an improvement over ``setup.py
install``, because the ``distutils`` just install new packages on top of old
ones, possibly combining two unrelated packages or leaving behind modules that
have been deleted in the newer version of the package.)

EasyInstall will stop the installation if it detects a conflict
between an existing, "unmanaged" package, and a module or package in any of
the distributions you're installing.  It will display a list of all of the
existing files and directories that would need to be deleted for the new
package to be able to function correctly.  To proceed, you must manually
delete these conflicting files and directories and re-run EasyInstall.

Of course, once you've replaced all of your existing "unmanaged" packages with
versions managed by EasyInstall, you won't have any more conflicts to worry
about!


Compressed Installation
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall tries to install packages in zipped form, if it can.  Zipping
packages can improve Python's overall import performance if you're not using
the ``--multi-version`` option, because Python processes zipfile entries on
``sys.path`` much faster than it does directories.

As of version 0.5a9, EasyInstall analyzes packages to determine whether they
can be safely installed as a zipfile, and then acts on its analysis.  (Previous
versions would not install a package as a zipfile unless you used the
``--zip-ok`` option.)

The current analysis approach is fairly conservative; it currently looks for:

 * Any use of the ``__file__`` or ``__path__`` variables (which should be
   replaced with ``pkg_resources`` API calls)

 * Possible use of ``inspect`` functions that expect to manipulate source files
   (e.g. ``inspect.getsource()``)

 * Top-level modules that might be scripts used with ``python -m`` (Python 2.4)

If any of the above are found in the package being installed, EasyInstall will
assume that the package cannot be safely run from a zipfile, and unzip it to
a directory instead.  You can override this analysis with the ``-zip-ok`` flag,
which will tell EasyInstall to install the package as a zipfile anyway.  Or,
you can use the ``--always-unzip`` flag, in which case EasyInstall will always
unzip, even if its analysis says the package is safe to run as a zipfile.

Normally, however, it is simplest to let EasyInstall handle the determination
of whether to zip or unzip, and only specify overrides when needed to work
around a problem.  If you find you need to override EasyInstall's guesses, you
may want to contact the package author and the EasyInstall maintainers, so that
they can make appropriate changes in future versions.

(Note: If a package uses ``setuptools`` in its setup script, the package author
has the option to declare the package safe or unsafe for zipped usage via the
``zip_safe`` argument to ``setup()``.  If the package author makes such a
declaration, EasyInstall believes the package's author and does not perform its
own analysis.  However, your command-line option, if any, will still override
the package author's choice.)


Reference Manual
================

Configuration Files
-------------------

(New in 0.4a2)

You may specify default options for EasyInstall using the standard
distutils configuration files, under the command heading ``easy_install``.
EasyInstall will look first for a ``setup.cfg`` file in the current directory,
then a ``~/.pydistutils.cfg`` or ``$HOME\\pydistutils.cfg`` (on Unix-like OSes
and Windows, respectively), and finally a ``distutils.cfg`` file in the
``distutils`` package directory.  Here's a simple example:

.. code-block:: ini

    [easy_install]

    # set the default location to install packages
    install_dir = /home/me/lib/python

    # Notice that indentation can be used to continue an option
    # value; this is especially useful for the "--find-links"
    # option, which tells easy_install to use download links on
    # these pages before consulting PyPI:
    #
    find_links = http://sqlobject.org/
                 http://peak.telecommunity.com/dist/

In addition to accepting configuration for its own options under
``[easy_install]``, EasyInstall also respects defaults specified for other
distutils commands.  For example, if you don't set an ``install_dir`` for
``[easy_install]``, but *have* set an ``install_lib`` for the ``[install]``
command, this will become EasyInstall's default installation directory.  Thus,
if you are already using distutils configuration files to set default install
locations, build options, etc., EasyInstall will respect your existing settings
until and unless you override them explicitly in an ``[easy_install]`` section.

For more information, see also the current Python documentation on the `use and
location of distutils configuration files <https://docs.python.org/install/index.html#inst-config-files>`_.

Notice that ``easy_install`` will use the ``setup.cfg`` from the current
working directory only if it was triggered from ``setup.py`` through the
``install_requires`` option. The standalone command will not use that file.

Command-Line Options
--------------------

``--zip-ok, -z``
    Install all packages as zip files, even if they are marked as unsafe for
    running as a zipfile.  This can be useful when EasyInstall's analysis
    of a non-setuptools package is too conservative, but keep in mind that
    the package may not work correctly.  (Changed in 0.5a9; previously this
    option was required in order for zipped installation to happen at all.)

``--always-unzip, -Z``
    Don't install any packages as zip files, even if the packages are marked
    as safe for running as a zipfile.  This can be useful if a package does
    something unsafe, but not in a way that EasyInstall can easily detect.
    EasyInstall's default analysis is currently very conservative, however, so
    you should only use this option if you've had problems with a particular
    package, and *after* reporting the problem to the package's maintainer and
    to the EasyInstall maintainers.

    (Note: the ``-z/-Z`` options only affect the installation of newly-built
    or downloaded packages that are not already installed in the target
    directory; if you want to convert an existing installed version from
    zipped to unzipped or vice versa, you'll need to delete the existing
    version first, and re-run EasyInstall.)

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``easy_install`` from
    adding an ``easy-install.pth`` entry for the package being installed, and
    if an entry for any version the package already exists, it will be removed
    upon successful installation. In multi-version mode, no specific version of
    the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``. This can be as
    simple as::

        from pkg_resources import require
        require("SomePackage", "OtherPackage", "MyPackage")

    which will put the latest installed version of the specified packages on
    ``sys.path`` for you. (For more advanced uses, like selecting specific
    versions and enabling optional dependencies, see the ``pkg_resources`` API
    doc.)

    Changed in 0.6a10: this option is no longer silently enabled when
    installing to a non-PYTHONPATH, non-"site" directory.  You must always
    explicitly use this option if you want it to be active.

``--upgrade, -U``   (New in 0.5a4)
    By default, EasyInstall only searches online if a project/version
    requirement can't be met by distributions already installed
    on sys.path or the installation directory.  However, if you supply the
    ``--upgrade`` or ``-U`` flag, EasyInstall will always check the package
    index and ``--find-links`` URLs before selecting a version to install.  In
    this way, you can force EasyInstall to use the latest available version of
    any package it installs (subject to any version requirements that might
    exclude such later versions).

``--install-dir=DIR, -d DIR``
    Set the installation directory. It is up to you to ensure that this
    directory is on ``sys.path`` at runtime, and to use
    ``pkg_resources.require()`` to enable the installed package(s) that you
    need.

    (New in 0.4a2) If this option is not directly specified on the command line
    or in a distutils configuration file, the distutils default installation
    location is used.  Normally, this would be the ``site-packages`` directory,
    but if you are using distutils configuration files, setting things like
    ``prefix`` or ``install_lib``, then those settings are taken into
    account when computing the default installation directory, as is the
    ``--prefix`` option.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't install scripts.  This is useful if you need to install multiple
    versions of a package, but do not want to reset the version that will be
    run by scripts that are already installed.

``--user`` (New in 0.6.11)
    Use the user-site-packages as specified in :pep:`370`
    instead of the global site-packages.

``--always-copy, -a``   (New in 0.5a4)
    Copy all needed distributions to the installation directory, even if they
    are already present in a directory on sys.path.  In older versions of
    EasyInstall, this was the default behavior, but now you must explicitly
    request it.  By default, EasyInstall will no longer copy such distributions
    from other sys.path directories to the installation directory, unless you
    explicitly gave the distribution's filename on the command line.

    Note that as of 0.6a10, using this option excludes "system" and
    "development" eggs from consideration because they can't be reliably
    copied.  This may cause EasyInstall to choose an older version of a package
    than what you expected, or it may cause downloading and installation of a
    fresh copy of something that's already installed.  You will see warning
    messages for any eggs that EasyInstall skips, before it falls back to an
    older version or attempts to download a fresh copy.

``--find-links=URLS_OR_FILENAMES, -f URLS_OR_FILENAMES``
    Scan the specified "download pages" or directories for direct links to eggs
    or other distributions.  Any existing file or directory names or direct
    download URLs are immediately added to EasyInstall's search cache, and any
    indirect URLs (ones that don't point to eggs or other recognized archive
    formats) are added to a list of additional places to search for download
    links.  As soon as EasyInstall has to go online to find a package (either
    because it doesn't exist locally, or because ``--upgrade`` or ``-U`` was
    used), the specified URLs will be downloaded and scanned for additional
    direct links.

    Eggs and archives found by way of ``--find-links`` are only downloaded if
    they are needed to meet a requirement specified on the command line; links
    to unneeded packages are ignored.

    If all requested packages can be found using links on the specified
    download pages, the Python Package Index will not be consulted unless you
    also specified the ``--upgrade`` or ``-U`` option.

    (Note: if you want to refer to a local HTML file containing links, you must
    use a ``file:`` URL, as filenames that do not refer to a directory, egg, or
    archive are ignored.)

    You may specify multiple URLs or file/directory names with this option,
    separated by whitespace.  Note that on the command line, you will probably
    have to surround the URL list with quotes, so that it is recognized as a
    single option value.  You can also specify URLs in a configuration file;
    see `Configuration Files`_, above.

    Changed in 0.6a10: previously all URLs and directories passed to this
    option were scanned as early as possible, but from 0.6a10 on, only
    directories and direct archive links are scanned immediately; URLs are not
    retrieved unless a package search was already going to go online due to a
    package not being available locally, or due to the use of the ``--update``
    or ``-U`` option.

``--no-find-links`` Blocks the addition of any link.
    This parameter is useful if you want to avoid adding links defined in a
    project easy_install is installing (whether it's a requested project or a
    dependency). When used, ``--find-links`` is ignored.

    Added in Distribute 0.6.11 and Setuptools 0.7.

``--index-url=URL, -i URL`` (New in 0.4a1; default changed in 0.6c7)
    Specifies the base URL of the Python Package Index.  The default is
    https://pypi.python.org/simple if not specified.  When a package is requested
    that is not locally available or linked from a ``--find-links`` download
    page, the package index will be searched for download pages for the needed
    package, and those download pages will be searched for links to download
    an egg or source distribution.

``--editable, -e`` (New in 0.6a1)
    Only find and download source distributions for the specified projects,
    unpacking them to subdirectories of the specified ``--build-directory``.
    EasyInstall will not actually build or install the requested projects or
    their dependencies; it will just find and extract them for you.  See
    `Editing and Viewing Source Packages`_ above for more details.

``--build-directory=DIR, -b DIR`` (UPDATED in 0.6a1)
    Set the directory used to build source packages.  If a package is built
    from a source distribution or checkout, it will be extracted to a
    subdirectory of the specified directory.  The subdirectory will have the
    same name as the extracted distribution's project, but in all-lowercase.
    If a file or directory of that name already exists in the given directory,
    a warning will be printed to the console, and the build will take place in
    a temporary directory instead.

    This option is most useful in combination with the ``--editable`` option,
    which forces EasyInstall to *only* find and extract (but not build and
    install) source distributions.  See `Editing and Viewing Source Packages`_,
    above, for more information.

``--verbose, -v, --quiet, -q`` (New in 0.4a4)
    Control the level of detail of EasyInstall's progress messages.  The
    default detail level is "info", which prints information only about
    relatively time-consuming operations like running a setup script, unpacking
    an archive, or retrieving a URL.  Using ``-q`` or ``--quiet`` drops the
    detail level to "warn", which will only display installation reports,
    warnings, and errors.  Using ``-v`` or ``--verbose`` increases the detail
    level to include individual file-level operations, link analysis messages,
    and distutils messages from any setup scripts that get run.  If you include
    the ``-v`` option more than once, the second and subsequent uses are passed
    down to any setup scripts, increasing the verbosity of their reporting as
    well.

``--dry-run, -n`` (New in 0.4a4)
    Don't actually install the package or scripts.  This option is passed down
    to any setup scripts run, so packages should not actually build either.
    This does *not* skip downloading, nor does it skip extracting source
    distributions to a temporary/build directory.

``--optimize=LEVEL``, ``-O LEVEL`` (New in 0.4a4)
    If you are installing from a source distribution, and are *not* using the
    ``--zip-ok`` option, this option controls the optimization level for
    compiling installed ``.py`` files to ``.pyo`` files.  It does not affect
    the compilation of modules contained in ``.egg`` files, only those in
    ``.egg`` directories.  The optimization level can be set to 0, 1, or 2;
    the default is 0 (unless it's set under ``install`` or ``install_lib`` in
    one of your distutils configuration files).

``--record=FILENAME``  (New in 0.5a4)
    Write a record of all installed files to FILENAME.  This is basically the
    same as the same option for the standard distutils "install" command, and
    is included for compatibility with tools that expect to pass this option
    to "setup.py install".

``--site-dirs=DIRLIST, -S DIRLIST``   (New in 0.6a1)
    Specify one or more custom "site" directories (separated by commas).
    "Site" directories are directories where ``.pth`` files are processed, such
    as the main Python ``site-packages`` directory.  As of 0.6a10, EasyInstall
    automatically detects whether a given directory processes ``.pth`` files
    (or can be made to do so), so you should not normally need to use this
    option.  It is is now only necessary if you want to override EasyInstall's
    judgment and force an installation directory to be treated as if it
    supported ``.pth`` files.

``--no-deps, -N``  (New in 0.6a6)
    Don't install any dependencies.  This is intended as a convenience for
    tools that wrap eggs in a platform-specific packaging system.  (We don't
    recommend that you use it for anything else.)

``--allow-hosts=PATTERNS, -H PATTERNS``   (New in 0.6a6)
    Restrict downloading and spidering to hosts matching the specified glob
    patterns.  E.g. ``-H *.python.org`` restricts web access so that only
    packages listed and downloadable from machines in the ``python.org``
    domain.  The glob patterns must match the *entire* user/host/port section of
    the target URL(s).  For example, ``*.python.org`` will NOT accept a URL
    like ``http://python.org/foo`` or ``http://www.python.org:8080/``.
    Multiple patterns can be specified by separating them with commas.  The
    default pattern is ``*``, which matches anything.

    In general, this option is mainly useful for blocking EasyInstall's web
    access altogether (e.g. ``-Hlocalhost``), or to restrict it to an intranet
    or other trusted site.  EasyInstall will do the best it can to satisfy
    dependencies given your host restrictions, but of course can fail if it
    can't find suitable packages.  EasyInstall displays all blocked URLs, so
    that you can adjust your ``--allow-hosts`` setting if it is more strict
    than you intended.  Some sites may wish to define a restrictive default
    setting for this option in their `configuration files`_, and then manually
    override the setting on the command line as needed.

``--prefix=DIR`` (New in 0.6a10)
    Use the specified directory as a base for computing the default
    installation and script directories.  On Windows, the resulting default
    directories will be ``prefix\\Lib\\site-packages`` and ``prefix\\Scripts``,
    while on other platforms the defaults will be
    ``prefix/lib/python2.X/site-packages`` (with the appropriate version
    substituted) for libraries and ``prefix/bin`` for scripts.

    Note that the ``--prefix`` option only sets the *default* installation and
    script directories, and does not override the ones set on the command line
    or in a configuration file.

``--local-snapshots-ok, -l`` (New in 0.6c6)
    Normally, EasyInstall prefers to only install *released* versions of
    projects, not in-development ones, because such projects may not
    have a currently-valid version number.  So, it usually only installs them
    when their ``setup.py`` directory is explicitly passed on the command line.

    However, if this option is used, then any in-development projects that were
    installed using the ``setup.py develop`` command, will be used to build
    eggs, effectively upgrading the "in-development" project to a snapshot
    release.  Normally, this option is used only in conjunction with the
    ``--always-copy`` option to create a distributable snapshot of every egg
    needed to run an application.

    Note that if you use this option, you must make sure that there is a valid
    version number (such as an SVN revision number tag) for any in-development
    projects that may be used, as otherwise EasyInstall may not be able to tell
    what version of the project is "newer" when future installations or
    upgrades are attempted.


.. _non-root installation:

Custom Installation Locations
-----------------------------

By default, EasyInstall installs python packages into Python's main ``site-packages`` directory,
and manages them using a custom ``.pth`` file in that same directory.

Very often though, a user or developer wants ``easy_install`` to install and manage python packages
in an alternative location, usually for one of 3 reasons:

1. They don't have access to write to the main Python site-packages directory.

2. They want a user-specific stash of packages, that is not visible to other users.

3. They want to isolate a set of packages to a specific python application, usually to minimize
   the possibility of version conflicts.

Historically, there have been many approaches to achieve custom installation.
The following section lists only the easiest and most relevant approaches [1]_.

`Use the "--user" option`_

`Use the "--user" option and customize "PYTHONUSERBASE"`_

`Use "virtualenv"`_

.. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_ in Python 2.6.

.. _PEP-370: http://www.python.org/dev/peps/pep-0370/


Use the "--user" option
~~~~~~~~~~~~~~~~~~~~~~~
With Python 2.6 came the User scheme for installation, which means that all
python distributions support an alternative install location that is specific to a user [2]_ [3]_.
The Default location for each OS is explained in the python documentation
for the ``site.USER_BASE`` variable.  This mode of installation can be turned on by
specifying the ``--user`` option to ``setup.py install`` or ``easy_install``.
This approach serves the need to have a user-specific stash of packages.

.. [2] Prior to Python2.6, Mac OS X offered a form of the User scheme. That is now subsumed into the User scheme introduced in Python 2.6.
.. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized.

Use the "--user" option and customize "PYTHONUSERBASE"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The User scheme install location can be customized by setting the ``PYTHONUSERBASE`` environment
variable, which updates the value of ``site.USER_BASE``.  To isolate packages to a specific
application, simply set the OS environment of that application to a specific value of
``PYTHONUSERBASE``, that contains just those packages.

Use "virtualenv"
~~~~~~~~~~~~~~~~
"virtualenv" is a 3rd-party python package that effectively "clones" a python installation, thereby
creating an isolated location to install packages.  The evolution of "virtualenv" started before the existence
of the User installation scheme.  "virtualenv" provides a version of ``easy_install`` that is
scoped to the cloned python install and is used in the normal way. "virtualenv" does offer various features
that the User installation scheme alone does not provide, e.g. the ability to hide the main python site-packages.

Please refer to the `virtualenv`_ documentation for more details.

.. _virtualenv: https://pypi.python.org/pypi/virtualenv



Package Index "API"
-------------------

Custom package indexes (and PyPI) must follow the following rules for
EasyInstall to be able to look up and download packages:

1. Except where stated otherwise, "pages" are HTML or XHTML, and "links"
   refer to ``href`` attributes.

2. Individual project version pages' URLs must be of the form
   ``base/projectname/version``, where ``base`` is the package index's base URL.

3. Omitting the ``/version`` part of a project page's URL (but keeping the
   trailing ``/``) should result in a page that is either:

   a) The single active version of that project, as though the version had been
      explicitly included, OR

   b) A page with links to all of the active version pages for that project.

4. Individual project version pages should contain direct links to downloadable
   distributions where possible.  It is explicitly permitted for a project's
   "long_description" to include URLs, and these should be formatted as HTML
   links by the package index, as EasyInstall does no special processing to
   identify what parts of a page are index-specific and which are part of the
   project's supplied description.

5. Where available, MD5 information should be added to download URLs by
   appending a fragment identifier of the form ``#md5=...``, where ``...`` is
   the 32-character hex MD5 digest.  EasyInstall will verify that the
   downloaded file's MD5 digest matches the given value.

6. Individual project version pages should identify any "homepage" or
   "download" URLs using ``rel="homepage"`` and ``rel="download"`` attributes
   on the HTML elements linking to those URLs. Use of these attributes will
   cause EasyInstall to always follow the provided links, unless it can be
   determined by inspection that they are downloadable distributions. If the
   links are not to downloadable distributions, they are retrieved, and if they
   are HTML, they are scanned for download links. They are *not* scanned for
   additional "homepage" or "download" links, as these are only processed for
   pages that are part of a package index site.

7. The root URL of the index, if retrieved with a trailing ``/``, must result
   in a page containing links to *all* projects' active version pages.

   (Note: This requirement is a workaround for the absence of case-insensitive
   ``safe_name()`` matching of project names in URL paths. If project names are
   matched in this fashion (e.g. via the PyPI server, mod_rewrite, or a similar
   mechanism), then it is not necessary to include this all-packages listing
   page.)

8. If a package index is accessed via a ``file://`` URL, then EasyInstall will
   automatically use ``index.html`` files, if present, when trying to read a
   directory with a trailing ``/`` on the URL.


Backward Compatibility
~~~~~~~~~~~~~~~~~~~~~~

Package indexes that wish to support setuptools versions prior to 0.6b4 should
also follow these rules:

* Homepage and download links must be preceded with ``"<th>Home Page"`` or
  ``"<th>Download URL"``, in addition to (or instead of) the ``rel=""``
  attributes on the actual links.  These marker strings do not need to be
  visible, or uncommented, however!  For example, the following is a valid
  homepage link that will work with any version of setuptools::

    <li>
     <strong>Home Page:</strong>
     <!-- <th>Home Page -->
     <a rel="homepage" href="http://sqlobject.org">http://sqlobject.org</a>
    </li>

  Even though the marker string is in an HTML comment, older versions of
  EasyInstall will still "see" it and know that the link that follows is the
  project's home page URL.

* The pages described by paragraph 3(b) of the preceding section *must*
  contain the string ``"Index of Packages</title>"`` somewhere in their text.
  This can be inside of an HTML comment, if desired, and it can be anywhere
  in the page.  (Note: this string MUST NOT appear on normal project pages, as
  described in paragraphs 2 and 3(a)!)

In addition, for compatibility with PyPI versions that do not use ``#md5=``
fragment IDs, EasyInstall uses the following regular expression to match PyPI's
displayed MD5 info (broken onto two lines for readability)::

    <a href="([^"#]+)">([^<]+)</a>\n\s+\(<a href="[^?]+\?:action=show_md5
    &amp;digest=([0-9a-f]{32})">md5</a>\)

History
=======

0.6c9
 * Fixed ``win32.exe`` support for .pth files, so unnecessary directory nesting
   is flattened out in the resulting egg.  (There was a case-sensitivity
   problem that affected some distributions, notably ``pywin32``.)

 * Prevent ``--help-commands`` and other junk from showing under Python 2.5
   when running ``easy_install --help``.

 * Fixed GUI scripts sometimes not executing on Windows

 * Fixed not picking up dependency links from recursive dependencies.

 * Only make ``.py``, ``.dll`` and ``.so`` files executable when unpacking eggs

 * Changes for Jython compatibility

 * Improved error message when a requirement is also a directory name, but the
   specified directory is not a source package.

 * Fixed ``--allow-hosts`` option blocking ``file:`` URLs

 * Fixed HTTP SVN detection failing when the page title included a project
   name (e.g. on SourceForge-hosted SVN)

 * Fix Jython script installation to handle ``#!`` lines better when
   ``sys.executable`` is a script.

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Keep site directories (e.g. ``site-packages``) from being included in
   ``.pth`` files.

0.6c7
 * ``ftp:`` download URLs now work correctly.

 * The default ``--index-url`` is now ``https://pypi.python.org/simple``, to use
   the Python Package Index's new simpler (and faster!) REST API.

0.6c6
 * EasyInstall no longer aborts the installation process if a URL it wants to
   retrieve can't be downloaded, unless the URL is an actual package download.
   Instead, it issues a warning and tries to keep going.

 * Fixed distutils-style scripts originally built on Windows having their line
   endings doubled when installed on any platform.

 * Added ``--local-snapshots-ok`` flag, to allow building eggs from projects
   installed using ``setup.py develop``.

 * Fixed not HTML-decoding URLs scraped from web pages

0.6c5
 * Fixed ``.dll`` files on Cygwin not having executable permissions when an egg
   is installed unzipped.

0.6c4
 * Added support for HTTP "Basic" authentication using ``http://user:pass@host``
   URLs.  If a password-protected page contains links to the same host (and
   protocol), those links will inherit the credentials used to access the
   original page.

 * Removed all special support for Sourceforge mirrors, as Sourceforge's
   mirror system now works well for non-browser downloads.

 * Fixed not recognizing ``win32.exe`` installers that included a custom
   bitmap.

 * Fixed not allowing ``os.open()`` of paths outside the sandbox, even if they
   are opened read-only (e.g. reading ``/dev/urandom`` for random numbers, as
   is done by ``os.urandom()`` on some platforms).

 * Fixed a problem with ``.pth`` testing on Windows when ``sys.executable``
   has a space in it (e.g., the user installed Python to a ``Program Files``
   directory).

0.6c3
 * You can once again use "python -m easy_install" with Python 2.4 and above.

 * Python 2.5 compatibility fixes added.

0.6c2
 * Windows script wrappers now support quoted arguments and arguments
   containing spaces.  (Patch contributed by Jim Fulton.)

 * The ``ez_setup.py`` script now actually works when you put a setuptools
   ``.egg`` alongside it for bootstrapping an offline machine.

 * A writable installation directory on ``sys.path`` is no longer required to
   download and extract a source distribution using ``--editable``.

 * Generated scripts now use ``-x`` on the ``#!`` line when ``sys.executable``
   contains non-ASCII characters, to prevent deprecation warnings about an
   unspecified encoding when the script is run.

0.6c1
 * EasyInstall now includes setuptools version information in the
   ``User-Agent`` string sent to websites it visits.

0.6b4
 * Fix creating Python wrappers for non-Python scripts

 * Fix ``ftp://`` directory listing URLs from causing a crash when used in the
   "Home page" or "Download URL" slots on PyPI.

 * Fix ``sys.path_importer_cache`` not being updated when an existing zipfile
   or directory is deleted/overwritten.

 * Fix not recognizing HTML 404 pages from package indexes.

 * Allow ``file://`` URLs to be used as a package index.  URLs that refer to
   directories will use an internally-generated directory listing if there is
   no ``index.html`` file in the directory.

 * Allow external links in a package index to be specified using
   ``rel="homepage"`` or ``rel="download"``, without needing the old
   PyPI-specific visible markup.

 * Suppressed warning message about possibly-misspelled project name, if an egg
   or link for that project name has already been seen.

0.6b3
 * Fix local ``--find-links`` eggs not being copied except with
   ``--always-copy``.

 * Fix sometimes not detecting local packages installed outside of "site"
   directories.

 * Fix mysterious errors during initial ``setuptools`` install, caused by
   ``ez_setup`` trying to run ``easy_install`` twice, due to a code fallthru
   after deleting the egg from which it's running.

0.6b2
 * Don't install or update a ``site.py`` patch when installing to a
   ``PYTHONPATH`` directory with ``--multi-version``, unless an
   ``easy-install.pth`` file is already in use there.

 * Construct ``.pth`` file paths in such a way that installing an egg whose
   name begins with ``import`` doesn't cause a syntax error.

 * Fixed a bogus warning message that wasn't updated since the 0.5 versions.

0.6b1
 * Better ambiguity management: accept ``#egg`` name/version even if processing
   what appears to be a correctly-named distutils file, and ignore ``.egg``
   files with no ``-``, since valid Python ``.egg`` files always have a version
   number (but Scheme eggs often don't).

 * Support ``file://`` links to directories in ``--find-links``, so that
   easy_install can build packages from local source checkouts.

 * Added automatic retry for Sourceforge mirrors.  The new download process is
   to first just try dl.sourceforge.net, then randomly select mirror IPs and
   remove ones that fail, until something works.  The removed IPs stay removed
   for the remainder of the run.

 * Ignore bdist_dumb distributions when looking at download URLs.

0.6a11
 * Process ``dependency_links.txt`` if found in a distribution, by adding the
   URLs to the list for scanning.

 * Use relative paths in ``.pth`` files when eggs are being installed to the
   same directory as the ``.pth`` file.  This maximizes portability of the
   target directory when building applications that contain eggs.

 * Added ``easy_install-N.N`` script(s) for convenience when using multiple
   Python versions.

 * Added automatic handling of installation conflicts.  Eggs are now shifted to
   the front of sys.path, in an order consistent with where they came from,
   making EasyInstall seamlessly co-operate with system package managers.

   The ``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk`` options
   are now no longer necessary, and will generate warnings at the end of a
   run if you use them.

 * Don't recursively traverse subdirectories given to ``--find-links``.

0.6a10
 * Added exhaustive testing of the install directory, including a spawn test
   for ``.pth`` file support, and directory writability/existence checks.  This
   should virtually eliminate the need to set or configure ``--site-dirs``.

 * Added ``--prefix`` option for more do-what-I-mean-ishness in the absence of
   RTFM-ing.  :)

 * Enhanced ``PYTHONPATH`` support so that you don't have to put any eggs on it
   manually to make it work.  ``--multi-version`` is no longer a silent
   default; you must explicitly use it if installing to a non-PYTHONPATH,
   non-"site" directory.

 * Expand ``$variables`` used in the ``--site-dirs``, ``--build-directory``,
   ``--install-dir``, and ``--script-dir`` options, whether on the command line
   or in configuration files.

 * Improved SourceForge mirror processing to work faster and be less affected
   by transient HTML changes made by SourceForge.

 * PyPI searches now use the exact spelling of requirements specified on the
   command line or in a project's ``install_requires``.  Previously, a
   normalized form of the name was used, which could lead to unnecessary
   full-index searches when a project's name had an underscore (``_``) in it.

 * EasyInstall can now download bare ``.py`` files and wrap them in an egg,
   as long as you include an ``#egg=name-version`` suffix on the URL, or if
   the ``.py`` file is listed as the "Download URL" on the project's PyPI page.
   This allows third parties to "package" trivial Python modules just by
   linking to them (e.g. from within their own PyPI page or download links
   page).

 * The ``--always-copy`` option now skips "system" and "development" eggs since
   they can't be reliably copied.  Note that this may cause EasyInstall to
   choose an older version of a package than what you expected, or it may cause
   downloading and installation of a fresh version of what's already installed.

 * The ``--find-links`` option previously scanned all supplied URLs and
   directories as early as possible, but now only directories and direct
   archive links are scanned immediately.  URLs are not retrieved unless a
   package search was already going to go online due to a package not being
   available locally, or due to the use of the ``--update`` or ``-U`` option.

 * Fixed the annoying ``--help-commands`` wart.

0.6a9
 * Fixed ``.pth`` file processing picking up nested eggs (i.e. ones inside
   "baskets") when they weren't explicitly listed in the ``.pth`` file.

 * If more than one URL appears to describe the exact same distribution, prefer
   the shortest one.  This helps to avoid "table of contents" CGI URLs like the
   ones on effbot.org.

 * Quote arguments to python.exe (including python's path) to avoid problems
   when Python (or a script) is installed in a directory whose name contains
   spaces on Windows.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.

0.6a8
 * Update for changed SourceForge mirror format

 * Fixed not installing dependencies for some packages fetched via Subversion

 * Fixed dependency installation with ``--always-copy`` not using the same
   dependency resolution procedure as other operations.

 * Fixed not fully removing temporary directories on Windows, if a Subversion
   checkout left read-only files behind

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

0.6a7
 * Fixed not being able to install Windows script wrappers using Python 2.3

0.6a6
 * Added support for "traditional" PYTHONPATH-based non-root installation, and
   also the convenient ``virtual-python.py`` script, based on a contribution
   by Ian Bicking.  The setuptools egg now contains a hacked ``site`` module
   that makes the PYTHONPATH-based approach work with .pth files, so that you
   can get the full EasyInstall feature set on such installations.

 * Added ``--no-deps`` and ``--allow-hosts`` options.

 * Improved Windows ``.exe`` script wrappers so that the script can have the
   same name as a module without confusing Python.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.
   Also, ensure that currently installed/selected packages aren't given
   precedence over ones desired by a package being installed, which could
   cause conflict errors.

0.6a3
 * Improved error message when trying to use old ways of running
   ``easy_install``.  Removed the ability to run via ``python -m`` or by
   running ``easy_install.py``; ``easy_install`` is the command to run on all
   supported platforms.

 * Improved wrapper script generation and runtime initialization so that a
   VersionConflict doesn't occur if you later install a competing version of a
   needed package as the default version of that package.

 * Fixed a problem parsing version numbers in ``#egg=`` links.

0.6a2
 * EasyInstall can now install "console_scripts" defined by packages that use
   ``setuptools`` and define appropriate entry points.  On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name.  On other
   platforms, the scripts are installed without a file extension.

 * Using ``python -m easy_install`` or running ``easy_install.py`` is now
   DEPRECATED, since an ``easy_install`` wrapper is now available on all
   platforms.

0.6a1
 * EasyInstall now does MD5 validation of downloads from PyPI, or from any link
   that has an "#md5=..." trailer with a 32-digit lowercase hex md5 digest.

 * EasyInstall now handles symlinks in target directories by removing the link,
   rather than attempting to overwrite the link's destination.  This makes it
   easier to set up an alternate Python "home" directory (as described above in
   the `Non-Root Installation`_ section).

 * Added support for handling MacOS platform information in ``.egg`` filenames,
   based on a contribution by Kevin Dangoor.  You may wish to delete and
   reinstall any eggs whose filename includes "darwin" and "Power_Macintosh",
   because the format for this platform information has changed so that minor
   OS X upgrades (such as 10.4.1 to 10.4.2) do not cause eggs built with a
   previous OS version to become obsolete.

 * easy_install's dependency processing algorithms have changed.  When using
   ``--always-copy``, it now ensures that dependencies are copied too.  When
   not using ``--always-copy``, it tries to use a single resolution loop,
   rather than recursing.

 * Fixed installing extra ``.pyc`` or ``.pyo`` files for scripts with ``.py``
   extensions.

 * Added ``--site-dirs`` option to allow adding custom "site" directories.
   Made ``easy-install.pth`` work in platform-specific alternate site
   directories (e.g. ``~/Library/Python/2.x/site-packages`` on Mac OS X).

 * If you manually delete the current version of a package, the next run of
   EasyInstall against the target directory will now remove the stray entry
   from the ``easy-install.pth`` file.

 * EasyInstall now recognizes URLs with a ``#egg=project_name`` fragment ID
   as pointing to the named project's source checkout.  Such URLs have a lower
   match precedence than any other kind of distribution, so they'll only be
   used if they have a higher version number than any other available
   distribution, or if you use the ``--editable`` option.  The ``#egg``
   fragment can contain a version if it's formatted as ``#egg=proj-ver``,
   where ``proj`` is the project name, and ``ver`` is the version number.  You
   *must* use the format for these values that the ``bdist_egg`` command uses;
   i.e., all non-alphanumeric runs must be condensed to single underscore
   characters.

 * Added the ``--editable`` option; see `Editing and Viewing Source Packages`_
   above for more info.  Also, slightly changed the behavior of the
   ``--build-directory`` option.

 * Fixed the setup script sandbox facility not recognizing certain paths as
   valid on case-insensitive platforms.

0.5a12
 * Fix ``python -m easy_install`` not working due to setuptools being installed
   as a zipfile.  Update safety scanner to check for modules that might be used
   as ``python -m`` scripts.

 * Misc. fixes for win32.exe support, including changes to support Python 2.4's
   changed ``bdist_wininst`` format.

0.5a10
 * Put the ``easy_install`` module back in as a module, as it's needed for
   ``python -m`` to run it!

 * Allow ``--find-links/-f`` to accept local directories or filenames as well
   as URLs.

0.5a9
 * EasyInstall now automatically detects when an "unmanaged" package or
   module is going to be on ``sys.path`` ahead of a package you're installing,
   thereby preventing the newer version from being imported.  By default, it
   will abort installation to alert you of the problem, but there are also
   new options (``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk``)
   available to change the default behavior.  (Note: this new feature doesn't
   take effect for egg files that were built with older ``setuptools``
   versions, because they lack the new metadata file required to implement it.)

 * The ``easy_install`` distutils command now uses ``DistutilsError`` as its
   base error type for errors that should just issue a message to stderr and
   exit the program without a traceback.

 * EasyInstall can now be given a path to a directory containing a setup
   script, and it will attempt to build and install the package there.

 * EasyInstall now performs a safety analysis on module contents to determine
   whether a package is likely to run in zipped form, and displays
   information about what modules may be doing introspection that would break
   when running as a zipfile.

 * Added the ``--always-unzip/-Z`` option, to force unzipping of packages that
   would ordinarily be considered safe to unzip, and changed the meaning of
   ``--zip-ok/-z`` to "always leave everything zipped".

0.5a8
 * There is now a separate documentation page for `setuptools`_; revision
   history that's not specific to EasyInstall has been moved to that page.

 .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools

0.5a5
 * Made ``easy_install`` a standard ``setuptools`` command, moving it from
   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
   that if you were importing or extending it, you must now change your imports
   accordingly.  ``easy_install.py`` is still installed as a script, but not as
   a module.

0.5a4
 * Added ``--always-copy/-a`` option to always copy needed packages to the
   installation directory, even if they're already present elsewhere on
   sys.path. (In previous versions, this was the default behavior, but now
   you must request it.)

 * Added ``--upgrade/-U`` option to force checking PyPI for latest available
   version(s) of all packages requested by name and version, even if a matching
   version is available locally.

 * Added automatic installation of dependencies declared by a distribution
   being installed.  These dependencies must be listed in the distribution's
   ``EGG-INFO`` directory, so the distribution has to have declared its
   dependencies by using setuptools.  If a package has requirements it didn't
   declare, you'll still have to deal with them yourself.  (E.g., by asking
   EasyInstall to find and install them.)

 * Added the ``--record`` option to ``easy_install`` for the benefit of tools
   that run ``setup.py install --record=filename`` on behalf of another
   packaging system.)

0.5a3
 * Fixed not setting script permissions to allow execution.

 * Improved sandboxing so that setup scripts that want a temporary directory
   (e.g. pychecker) can still run in the sandbox.

0.5a2
 * Fix stupid stupid refactoring-at-the-last-minute typos.  :(

0.5a1
 * Added support for converting ``.win32.exe`` installers to eggs on the fly.
   EasyInstall will now recognize such files by name and install them.

 * Fixed a problem with picking the "best" version to install (versions were
   being sorted as strings, rather than as parsed values)

0.4a4
 * Added support for the distutils "verbose/quiet" and "dry-run" options, as
   well as the "optimize" flag.

 * Support downloading packages that were uploaded to PyPI (by scanning all
   links on package pages, not just the homepage/download links).

0.4a3
 * Add progress messages to the search/download process so that you can tell
   what URLs it's reading to find download links.  (Hopefully, this will help
   people report out-of-date and broken links to package authors, and to tell
   when they've asked for a package that doesn't exist.)

0.4a2
 * Added support for installing scripts

 * Added support for setting options via distutils configuration files, and
   using distutils' default options as a basis for EasyInstall's defaults.

 * Renamed ``--scan-url/-s`` to ``--find-links/-f`` to free up ``-s`` for the
   script installation directory option.

 * Use ``urllib2`` instead of ``urllib``, to allow use of ``https:`` URLs if
   Python includes SSL support.

0.4a1
 * Added ``--scan-url`` and ``--index-url`` options, to scan download pages
   and search PyPI for needed packages.

0.3a4
 * Restrict ``--build-directory=DIR/-b DIR`` option to only be used with single
   URL installs, to avoid running the wrong setup.py.

0.3a3
 * Added ``--build-directory=DIR/-b DIR`` option.

 * Added "installation report" that explains how to use 'require()' when doing
   a multiversion install or alternate installation directory.

 * Added SourceForge mirror auto-select (Contributed by Ian Bicking)

 * Added "sandboxing" that stops a setup script from running if it attempts to
   write to the filesystem outside of the build area

 * Added more workarounds for packages with quirky ``install_data`` hacks

0.3a2
 * Added subversion download support for ``svn:`` and ``svn+`` URLs, as well as
   automatic recognition of HTTP subversion URLs (Contributed by Ian Bicking)

 * Misc. bug fixes

0.3a1
 * Initial release.


Future Plans
============

* Additional utilities to list/remove/verify packages
* Signature checking?  SSL?  Ability to suppress PyPI search?
* Display byte progress meter when downloading distributions and long pages?
* Redirect stdout/stderr to log during run_setup?

doc/alt-python35-setuptools/setuptools.txt000064400000367272151733306540015011 0ustar00==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
(for Python 2.6 and up) that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.  Your users don't need to
install or even know about setuptools in order to use them, and you don't
have to include the entire setuptools package in your distributions.  By
including just a single `bootstrap module`_ (a 12K .py file), your package will
automatically download and install ``setuptools`` if the user is building your
package from source and doesn't have a suitable version already installed.

.. _bootstrap module: https://bootstrap.pypa.io/ez_setup.py

Feature Highlights:

* Automatically find/download/install/upgrade dependencies at build time using
  the `EasyInstall tool <easy_install.html>`_,
  which supports downloading via HTTP, FTP, Subversion, and SourceForge, and
  automatically scans web pages linked from PyPI to find download links.  (It's
  the closest thing to CPAN currently available for Python.)

* Create `Python Eggs <http://peak.telecommunity.com/DevCenter/PythonEggs>`_ -
  a single-file importable distribution format

* Enhanced support for accessing data files hosted in zipped packages.

* Automatically include all packages in your source tree, without listing them
  individually in setup.py

* Automatically include all relevant files in your source distributions,
  without needing to create a ``MANIFEST.in`` file, and without having to force
  regeneration of the ``MANIFEST`` file when your source tree changes.

* Automatically generate wrapper scripts or Windows (console and GUI) .exe
  files for any number of "main" functions in your project.  (Note: this is not
  a py2exe replacement; the .exe files rely on the local Python installation.)

* Transparent Pyrex support, so that your setup.py can list ``.pyx`` files and
  still work even when the end-user doesn't have Pyrex installed (as long as
  you include the Pyrex-generated C in your source distribution)

* Command aliases - create project-specific, per-user, or site-wide shortcut
  names for commonly used commands and options

* PyPI upload support - upload your source distributions and eggs to PyPI

* Deploy your project in "development mode", such that it's available on
  ``sys.path``, yet can still be edited directly from its source checkout.

* Easily extend the distutils with new commands or ``setup()`` arguments, and
  distribute/reuse your extensions for multiple projects, without copying code.

* Create extensible applications and frameworks that automatically discover
  extensions, using simple "entry points" declared in a project's setup script.

.. contents:: **Table of Contents**

.. _ez_setup.py: `bootstrap module`_


-----------------
Developer's Guide
-----------------


Installing ``setuptools``
=========================

Please follow the `EasyInstall Installation Instructions`_ to install the
current stable version of setuptools.  In particular, be sure to read the
section on `Custom Installation Locations`_ if you are installing anywhere
other than Python's ``site-packages`` directory.

.. _EasyInstall Installation Instructions: easy_install.html#installation-instructions

.. _Custom Installation Locations: easy_install.html#custom-installation-locations

If you want the current in-development version of setuptools, you should first
install a stable version, and then run::

    ez_setup.py setuptools==dev

This will download and install the latest development (i.e. unstable) version
of setuptools from the Python Subversion sandbox.


Basic Use
=========

For basic use of setuptools, just import things from setuptools instead of
the distutils.  Here's a minimal setup script using setuptools::

    from setuptools import setup, find_packages
    setup(
        name="HelloWorld",
        version="0.1",
        packages=find_packages(),
    )

As you can see, it doesn't take much to use setuptools in a project.
Run that script in your project folder, alongside the Python packages
you have developed.

Invoke that script to produce eggs, upload to
PyPI, and automatically include all packages in the directory where the
setup.py lives.  See the `Command Reference`_ section below to see what
commands you can give to this setup script. For example,
to produce a source distribution, simply invoke::

    python setup.py sdist

Of course, before you release your project to PyPI, you'll want to add a bit
more information to your setup script to help people find or learn about your
project.  And maybe your project will have grown by then to include a few
dependencies, and perhaps some data files and scripts::

    from setuptools import setup, find_packages
    setup(
        name="HelloWorld",
        version="0.1",
        packages=find_packages(),
        scripts=['say_hello.py'],

        # Project uses reStructuredText, so ensure that the docutils get
        # installed or upgraded on the target machine
        install_requires=['docutils>=0.3'],

        package_data={
            # If any package contains *.txt or *.rst files, include them:
            '': ['*.txt', '*.rst'],
            # And include any *.msg files found in the 'hello' package, too:
            'hello': ['*.msg'],
        },

        # metadata for upload to PyPI
        author="Me",
        author_email="me@example.com",
        description="This is an Example Package",
        license="PSF",
        keywords="hello world example examples",
        url="http://example.com/HelloWorld/",   # project home page, if any

        # could also include long_description, download_url, classifiers, etc.
    )

In the sections that follow, we'll explain what most of these ``setup()``
arguments do (except for the metadata ones), and the various ways you might use
them in your own project(s).


Specifying Your Project's Version
---------------------------------

Setuptools can work well with most versioning schemes; there are, however, a
few special things to watch out for, in order to ensure that setuptools and
EasyInstall can always tell what version of your package is newer than another
version.  Knowing these things will also help you correctly specify what
versions of other projects your project depends on.

A version consists of an alternating series of release numbers and pre-release
or post-release tags.  A release number is a series of digits punctuated by
dots, such as ``2.4`` or ``0.5``.  Each series of digits is treated
numerically, so releases ``2.1`` and ``2.1.0`` are different ways to spell the
same release number, denoting the first subrelease of release 2.  But  ``2.10``
is the *tenth* subrelease of release 2, and so is a different and newer release
from ``2.1`` or ``2.1.0``.  Leading zeros within a series of digits are also
ignored, so ``2.01`` is the same as ``2.1``, and different from ``2.0.1``.

Following a release number, you can have either a pre-release or post-release
tag.  Pre-release tags make a version be considered *older* than the version
they are appended to.  So, revision ``2.4`` is *newer* than revision ``2.4c1``,
which in turn is newer than ``2.4b1`` or ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4-1`` and ``2.4pl3`` are newer than ``2.4``, but are *older*
than ``2.4.1`` (which has a higher release number).

A pre-release tag is a series of letters that are alphabetically before
"final".  Some examples of prerelease tags would include ``alpha``, ``beta``,
``a``, ``c``, ``dev``, and so on.  You do not have to place a dot or dash
before the prerelease tag if it's immediately after a number, but it's okay to
do so if you prefer.  Thus, ``2.4c1`` and ``2.4.c1`` and ``2.4-c1`` all
represent release candidate 1 of version ``2.4``, and are treated as identical
by setuptools.

In addition, there are three special prerelease tags that are treated as if
they were the letter ``c``: ``pre``, ``preview``, and ``rc``.  So, version
``2.4rc1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4c1``, and are treated as identical by setuptools.

A post-release tag is either a series of letters that are alphabetically
greater than or equal to "final", or a dash (``-``).  Post-release tags are
generally used to separate patch numbers, port numbers, build numbers, revision
numbers, or date stamps from the release number.  For example, the version
``2.4-r1263`` might denote Subversion revision 1263 of a post-release patch of
version ``2.4``.  Or you might use ``2.4-20051127`` to denote a date-stamped
post-release.

Notice that after each pre or post-release tag, you are free to place another
release number, followed again by more pre- or post-release tags.  For example,
``0.6a9.dev-r41475`` could denote Subversion revision 41475 of the in-
development version of the ninth alpha of release 0.6.  Notice that ``dev`` is
a pre-release tag, so this version is a *lower* version number than ``0.6a9``,
which would be the actual ninth alpha of release 0.6.  But the ``-r41475`` is
a post-release tag, so this version is *newer* than ``0.6a9.dev``.

For the most part, setuptools' interpretation of version numbers is intuitive,
but here are a few tips that will keep you out of trouble in the corner cases:

* Don't stick adjoining pre-release tags together without a dot or number
  between them.  Version ``1.9adev`` is the ``adev`` prerelease of ``1.9``,
  *not* a development pre-release of ``1.9a``.  Use ``.dev`` instead, as in
  ``1.9a.dev``, or separate the prerelease tags with a number, as in
  ``1.9a0dev``.  ``1.9a.dev``, ``1.9a0dev``, and even ``1.9.a.dev`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer.

* If you want to be certain that your chosen numbering scheme works the way
  you think it will, you can use the ``pkg_resources.parse_version()`` function
  to compare different version numbers::

    >>> from pkg_resources import parse_version
    >>> parse_version('1.9.a.dev') == parse_version('1.9a0dev')
    True
    >>> parse_version('2.1-rc2') < parse_version('2.1')
    True
    >>> parse_version('0.6a9dev-r41475') < parse_version('0.6a9')
    True

Once you've decided on a version numbering scheme for your project, you can
have setuptools automatically tag your in-development releases with various
pre- or post-release tags.  See the following sections for more details:

* `Tagging and "Daily Build" or "Snapshot" Releases`_
* `Managing "Continuous Releases" Using Subversion`_
* The `egg_info`_ command


New and Changed ``setup()`` Keywords
====================================

The following keyword arguments to ``setup()`` are added or changed by
``setuptools``.  All of them are optional; you do not have to supply them
unless you need the associated ``setuptools`` feature.

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section below on
    `Including Data Files`_.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section below on `Including Data Files`_.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section below on `Including
    Data Files`_.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section below on `Declaring
    Dependencies`_ for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See `Dynamic
    Discovery of Services and Plugins`_ for details and examples of the format
    of this argument.  In addition, this keyword is used to support `Automatic
    Script Creation`_.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section below on `Declaring
    Dependencies`_ for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``
    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (even going so far as to download them using
    ``EasyInstall``) before processing the rest of the setup script or commands.
    This argument is needed if you are using distutils extensions as part of
    your build process; for example, extensions that process setup() arguments
    and turn them into EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

``dependency_links``
    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use by tools like EasyInstall to use when installing
    an ``.egg`` file.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section below on `Namespace Packages`_ for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the `test`_ command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    `test`_ command below for more details.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (even going
    so far as to download them using ``EasyInstall``).  Note that these
    required projects will *not* be installed on the system where the tests
    are run, but only downloaded to the project's setup directory if they're
    not already installed locally.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the `names` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be '/'-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on `Automatic Resource Extraction`_.

``use_2to3``
    Convert the source code from Python 2 to Python 3 with 2to3 during the
    build process. See :doc:`python3` for more details.

``convert_2to3_doctests``
    List of doctest source files that need to be converted with 2to3.
    See :doc:`python3` for more details.

``use_2to3_fixers``
    A list of modules to search for additional fixers to be used during
    the 2to3 conversion. See :doc:`python3` for more details.


Using ``find_packages()``
-------------------------

For simple projects, it's usually easy enough to manually add packages to
the ``packages`` argument of ``setup()``.  However, for very large projects
(Twisted, PEAK, Zope, Chandler, etc.), it can be a big burden to keep the
package list updated.  That's what ``setuptools.find_packages()`` is for.

``find_packages()`` takes a source directory and two lists of package name
patterns to exclude and include.  If omitted, the source directory defaults to
the same
directory as the setup script.  Some projects use a ``src`` or ``lib``
directory as the root of their source tree, and those projects would of course
use ``"src"`` or ``"lib"`` as the first argument to ``find_packages()``.  (And
such projects also need something like ``package_dir={'':'src'}`` in their
``setup()`` arguments, but that's just a normal distutils thing.)

Anyway, ``find_packages()`` walks the target directory, filtering by inclusion
patterns, and finds Python packages (any directory). On Python 3.2 and
earlier, packages are only recognized if they include an ``__init__.py`` file.
Finally, exclusion patterns are applied to remove matching packages.

Inclusion and exclusion patterns are package names, optionally including
wildcards.  For
example, ``find_packages(exclude=["*.tests"])`` will exclude all packages whose
last name part is ``tests``.   Or, ``find_packages(exclude=["*.tests",
"*.tests.*"])`` will also exclude any subpackages of packages named ``tests``,
but it still won't exclude a top-level ``tests`` package or the children
thereof.  In fact, if you really want no ``tests`` packages at all, you'll need
something like this::

    find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])

in order to cover all the bases.  Really, the exclusion patterns are intended
to cover simpler use cases than this, like excluding a single, specified
package and its subpackages.

Regardless of the parameters, the ``find_packages()``
function returns a list of package names suitable for use as the ``packages``
argument to ``setup()``, and so is usually the easiest way to set that
argument in your setup script.  Especially since it frees you from having to
remember to modify your setup script whenever your project grows additional
top-level packages or subpackages.


Automatic Script Creation
=========================

Packaging and installing scripts can be a bit awkward with the distutils.  For
one thing, there's no easy way to have a script's filename match local
conventions on both Windows and POSIX platforms.  For another, you often have
to create a separate file just for the "main" script, when your actual "main"
is a function in a module somewhere.  And even in Python 2.4, using the ``-m``
option only works for actual ``.py`` files that aren't installed in a package.

``setuptools`` fixes all of these problems by automatically generating scripts
for you with the correct extension, and on Windows it will even create an
``.exe`` file so that users don't have to change their ``PATHEXT`` settings.
The way to use this feature is to define "entry points" in your setup script
that indicate what function the generated script should import and run.  For
example, to create two console scripts called ``foo`` and ``bar``, and a GUI
script called ``baz``, you might do something like this::

    setup(
        # other arguments here...
        entry_points={
            'console_scripts': [
                'foo = my_package.some_module:main_func',
                'bar = other_module:some_func',
            ],
            'gui_scripts': [
                'baz = my_package_gui:start_func',
            ]
        }
    )

When this project is installed on non-Windows platforms (using "setup.py
install", "setup.py develop", or by using EasyInstall), a set of ``foo``,
``bar``, and ``baz`` scripts will be installed that import ``main_func`` and
``some_func`` from the specified modules.  The functions you specify are called
with no arguments, and their return value is passed to ``sys.exit()``, so you
can return an errorlevel or message to print to stderr.

On Windows, a set of ``foo.exe``, ``bar.exe``, and ``baz.exe`` launchers are
created, alongside a set of ``foo.py``, ``bar.py``, and ``baz.pyw`` files.  The
``.exe`` wrappers find and execute the right version of Python to run the
``.py`` or ``.pyw`` file.

You may define as many "console script" and "gui script" entry points as you
like, and each one can optionally specify "extras" that it depends on, that
will be added to ``sys.path`` when the script is run.  For more information on
"extras", see the section below on `Declaring Extras`_.  For more information
on "entry points" in general, see the section below on `Dynamic Discovery of
Services and Plugins`_.


"Eggsecutable" Scripts
----------------------

Occasionally, there are situations where it's desirable to make an ``.egg``
file directly executable.  You can do this by including an entry point such
as the following::

    setup(
        # other arguments here...
        entry_points={
            'setuptools.installation': [
                'eggsecutable = my_package.some_module:main_func',
            ]
        }
    )

Any eggs built from the above setup script will include a short executable
prelude that imports and calls ``main_func()`` from ``my_package.some_module``.
The prelude can be run on Unix-like platforms (including Mac and Linux) by
invoking the egg with ``/bin/sh``, or by enabling execute permissions on the
``.egg`` file.  For the executable prelude to run, the appropriate version of
Python must be available via the ``PATH`` environment variable, under its
"long" name.  That is, if the egg is built for Python 2.3, there must be a
``python2.3`` executable present in a directory on ``PATH``.

This feature is primarily intended to support ez_setup the installation of
setuptools itself on non-Windows platforms, but may also be useful for other
projects as well.

IMPORTANT NOTE: Eggs with an "eggsecutable" header cannot be renamed, or
invoked via symlinks.  They *must* be invoked using their original filename, in
order to ensure that, once running, ``pkg_resources`` will know what project
and version is in use.  The header script will check this and exit with an
error if the ``.egg`` file has been renamed or is invoked via a symlink that
changes its base name.


Declaring Dependencies
======================

``setuptools`` supports automatically installing dependencies when a package is
installed, and including information about dependencies in Python Eggs (so that
package management tools like EasyInstall can use the information).

``setuptools`` and ``pkg_resources`` use a common syntax for specifying a
project's required dependencies.  This syntax consists of a project's PyPI
name, optionally followed by a comma-separated list of "extras" in square
brackets, optionally followed by a comma-separated list of version
specifiers.  A version specifier is one of the operators ``<``, ``>``, ``<=``,
``>=``, ``==`` or ``!=``, followed by a version identifier.  Tokens may be
separated by whitespace, but any whitespace or nonstandard characters within a
project name or version identifier must be replaced with ``-``.

Version specifiers for a given project are internally sorted into ascending
version order, and used to establish what ranges of versions are acceptable.
Adjacent redundant conditions are also consolidated (e.g. ``">1, >2"`` becomes
``">1"``, and ``"<2,<3"`` becomes ``"<3"``). ``"!="`` versions are excised from
the ranges they fall within.  A project's version is then checked for
membership in the resulting ranges. (Note that providing conflicting conditions
for the same version (e.g. "<2,>=2" or "==2,!=2") is meaningless and may
therefore produce bizarre results.)

Here are some example requirement specifiers::

    docutils >= 0.3

    # comment lines and \ continuations are allowed in requirement strings
    BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \
        ==1.6, ==1.7  # and so are line-end comments

    PEAK[FastCGI, reST]>=0.5a4

    setuptools==0.5a7

The simplest way to include requirement specifiers is to use the
``install_requires`` argument to ``setup()``.  It takes a string or list of
strings containing requirement specifiers.  If you include more than one
requirement in a string, each requirement must begin on a new line.

This has three effects:

1. When your project is installed, either by using EasyInstall, ``setup.py
   install``, or ``setup.py develop``, all of the dependencies not already
   installed will be located (via PyPI), downloaded, built (if necessary),
   and installed.

2. Any scripts in your project will be installed with wrappers that verify
   the availability of the specified dependencies at runtime, and ensure that
   the correct versions are added to ``sys.path`` (e.g. if multiple versions
   have been installed).

3. Python Egg distributions will include a metadata file listing the
   dependencies.

Note, by the way, that if you declare your dependencies in ``setup.py``, you do
*not* need to use the ``require()`` function in your scripts or modules, as
long as you either install the project or use ``setup.py develop`` to do
development work on it.  (See `"Development Mode"`_ below for more details on
using ``setup.py develop``.)


Dependencies that aren't in PyPI
--------------------------------

If your project depends on packages that aren't registered in PyPI, you may
still be able to depend on them, as long as they are available for download
as:

- an egg, in the standard distutils ``sdist`` format,
- a single ``.py`` file, or
- a VCS repository (Subversion, Mercurial, or Git).

You just need to add some URLs to the ``dependency_links`` argument to
``setup()``.

The URLs must be either:

1. direct download URLs,
2. the URLs of web pages that contain direct download links, or
3. the repository's URL

In general, it's better to link to web pages, because it is usually less
complex to update a web page than to release a new version of your project.
You can also use a SourceForge ``showfiles.php`` link in the case where a
package you depend on is distributed via SourceForge.

If you depend on a package that's distributed as a single ``.py`` file, you
must include an ``"#egg=project-version"`` suffix to the URL, to give a project
name and version number.  (Be sure to escape any dashes in the name or version
by replacing them with underscores.)  EasyInstall will recognize this suffix
and automatically create a trivial ``setup.py`` to wrap the single ``.py`` file
as an egg.

In the case of a VCS checkout, you should also append ``#egg=project-version``
in order to identify for what package that checkout should be used. You can
append ``@REV`` to the URL's path (before the fragment) to specify a revision.
Additionally, you can also force the VCS being used by prepending the URL with
a certain prefix. Currently available are:

-  ``svn+URL`` for Subversion,
-  ``git+URL`` for Git, and
-  ``hg+URL`` for Mercurial

A more complete example would be:

    ``vcs+proto://host/path@revision#egg=project-version``

Be careful with the version. It should match the one inside the project files.
If you want to disregard the version, you have to omit it both in the
``requires`` and in the URL's fragment.

This will do a checkout (or a clone, in Git and Mercurial parlance) to a
temporary folder and run ``setup.py bdist_egg``.

The ``dependency_links`` option takes the form of a list of URL strings.  For
example, the below will cause EasyInstall to search the specified page for
eggs or source distributions, if the package's dependencies aren't already
installed::

    setup(
        ...
        dependency_links=[
            "http://peak.telecommunity.com/snapshots/"
        ],
    )


.. _Declaring Extras:


Declaring "Extras" (optional features with their own dependencies)
------------------------------------------------------------------

Sometimes a project has "recommended" dependencies, that are not required for
all uses of the project.  For example, a project might offer optional PDF
output if ReportLab is installed, and reStructuredText support if docutils is
installed.  These optional features are called "extras", and setuptools allows
you to define their requirements as well.  In this way, other projects that
require these optional features can force the additional requirements to be
installed, by naming the desired extras in their ``install_requires``.

For example, let's say that Project A offers optional PDF and reST support::

    setup(
        name="Project-A",
        ...
        extras_require={
            'PDF':  ["ReportLab>=1.2", "RXP"],
            'reST': ["docutils>=0.3"],
        }
    )

As you can see, the ``extras_require`` argument takes a dictionary mapping
names of "extra" features, to strings or lists of strings describing those
features' requirements.  These requirements will *not* be automatically
installed unless another package depends on them (directly or indirectly) by
including the desired "extras" in square brackets after the associated project
name.  (Or if the extras were listed in a requirement spec on the EasyInstall
command line.)

Extras can be used by a project's `entry points`_ to specify dynamic
dependencies.  For example, if Project A includes a "rst2pdf" script, it might
declare it like this, so that the "PDF" requirements are only resolved if the
"rst2pdf" script is run::

    setup(
        name="Project-A",
        ...
        entry_points={
            'console_scripts': [
                'rst2pdf = project_a.tools.pdfgen [PDF]',
                'rst2html = project_a.tools.htmlgen',
                # more script entry points ...
            ],
        }
    )

Projects can also use another project's extras when specifying dependencies.
For example, if project B needs "project A" with PDF support installed, it
might declare the dependency like this::

    setup(
        name="Project-B",
        install_requires=["Project-A[PDF]"],
        ...
    )

This will cause ReportLab to be installed along with project A, if project B is
installed -- even if project A was already installed.  In this way, a project
can encapsulate groups of optional "downstream dependencies" under a feature
name, so that packages that depend on it don't have to know what the downstream
dependencies are.  If a later version of Project A builds in PDF support and
no longer needs ReportLab, or if it ends up needing other dependencies besides
ReportLab in order to provide PDF support, Project B's setup information does
not need to change, but the right packages will still be installed if needed.

Note, by the way, that if a project ends up not needing any other packages to
support a feature, it should keep an empty requirements list for that feature
in its ``extras_require`` argument, so that packages depending on that feature
don't break (due to an invalid feature name).  For example, if Project A above
builds in PDF support and no longer needs ReportLab, it could change its
setup to this::

    setup(
        name="Project-A",
        ...
        extras_require={
            'PDF':  [],
            'reST': ["docutils>=0.3"],
        }
    )

so that Package B doesn't have to remove the ``[PDF]`` from its requirement
specifier.


.. _Platform Specific Dependencies:


Declaring platform specific dependencies
----------------------------------------

Sometimes a project might require a dependency to run on a specific platform.
This could to a package that back ports a module so that it can be used in
older python versions.  Or it could be a package that is required to run on a
specific operating system.  This will allow a project to work on multiple
different platforms without installing dependencies that are not required for
a platform that is installing the project.

For example, here is a project that uses the ``enum`` module and ``pywin32``::

    setup(
        name="Project",
        ...
        install_requires=[
            'enum34;python_version<"3.4"',
            'pywin32 >= 1.0;platform_system=="Windows"'
        ]
    )

Since the ``enum`` module was added in Python 3.4, it should only be installed
if the python version is earlier.  Since ``pywin32`` will only be used on
windows, it should only be installed when the operating system is Windows.
Specifying version requirements for the dependencies is supported as normal.

The environmental markers that may be used for testing platform types are
detailed in `PEP 508`_.

.. _PEP 508: https://www.python.org/dev/peps/pep-0508/

Including Data Files
====================

The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location.  However, the most common use case
for data files distributed with a package is for use *by* the package, usually
by including the data files in the package directory.

Setuptools offers three ways to specify data files to be included in your
packages.  First, you can simply use the ``include_package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        include_package_data=True
    )

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
(They can also be tracked by a revision control system, using an appropriate
plugin.  See the section below on `Adding Support for Revision Control
Systems`_ for information on how to write such plugins.)

If you want finer-grained control over what files are included (for example,
if you have documentation files in your package directories and want to exclude
them from installation), then you can also use the ``package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        package_data={
            # If any package contains *.txt or *.rst files, include them:
            '': ['*.txt', '*.rst'],
            # And include any *.msg files found in the 'hello' package, too:
            'hello': ['*.msg'],
        }
    )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns.  The globs may include subdirectory names, if the data
files are contained in a subdirectory of the package.  For example, if the
package tree looks like this::

    setup.py
    src/
        mypkg/
            __init__.py
            mypkg.txt
            data/
                somefile.dat
                otherdata.dat

The setuptools setup file might look like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages('src'),  # include all packages under src
        package_dir={'':'src'},   # tell distutils packages are under src

        package_data={
            # If any package contains *.txt files, include them:
            '': ['*.txt'],
            # And include any *.dat files found in the 'data' subdirectory
            # of the 'mypkg' package, also:
            'mypkg': ['data/*.dat'],
        }
    )

Notice that if you list patterns in ``package_data`` under the empty string,
these patterns are used to find files in every package, even ones that also
have their own patterns listed.  Thus, in the above example, the ``mypkg.txt``
file gets included even though it's not listed in the patterns for ``mypkg``.

Also notice that if you use paths, you *must* use a forward slash (``/``) as
the path separator, even if you are on Windows.  Setuptools automatically
converts slashes to appropriate platform-specific separators at build time.

(Note: although the ``package_data`` argument was previously only available in
``setuptools``, it was also added to the Python ``distutils`` package as of
Python 2.4; there is `some documentation for the feature`__ available on the
python.org website.  If using the setuptools-specific ``include_package_data``
argument, files specified by ``package_data`` will *not* be automatically
added to the manifest unless they are listed in the MANIFEST.in file.)

__ http://docs.python.org/dist/node11.html

Sometimes, the ``include_package_data`` or ``package_data`` options alone
aren't sufficient to precisely define what files you want included.  For
example, you may want to include package README files in your revision control
system and source distributions, but exclude them from being installed.  So,
setuptools offers an ``exclude_package_data`` option as well, that allows you
to do things like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages('src'),  # include all packages under src
        package_dir={'':'src'},   # tell distutils packages are under src

        include_package_data=True,    # include everything in source control

        # ...but exclude README.txt from all packages
        exclude_package_data={'': ['README.txt']},
    )

The ``exclude_package_data`` option is a dictionary mapping package names to
lists of wildcard patterns, just like the ``package_data`` option.  And, just
as with that option, a key of ``''`` will apply the given pattern(s) to all
packages.  However, any files that match these patterns will be *excluded*
from installation, even if they were listed in ``package_data`` or were
included as a result of using ``include_package_data``.

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by ``MANIFEST.in``.

``package_data``
    Specify additional patterns to match files and directories that may or may
    not be matched by ``MANIFEST.in`` or found in source control.

``exclude_package_data``
    Specify patterns for data files and directories that should *not* be
    included when a package is installed, even if they would otherwise have
    been included due to the use of the preceding options.

NOTE: Due to the way the distutils build process works, a data file that you
include in your project and then stop including may be "orphaned" in your
project's build directories, requiring you to run ``setup.py clean --all`` to
fully remove them.  This may also be important for your users and contributors
if they track intermediate revisions of your project using Subversion; be sure
to let them know when you make changes that remove files from inclusion so they
can run ``setup.py clean --all``.


Accessing Data Files at Runtime
-------------------------------

Typically, existing programs manipulate a package's ``__file__`` attribute in
order to find the location of data files.  However, this manipulation isn't
compatible with PEP 302-based import hooks, including importing from zip files
and Python Eggs.  It is strongly recommended that, if you are using data files,
you should use the :ref:`ResourceManager API` of ``pkg_resources`` to access
them.  The ``pkg_resources`` module is distributed as part of setuptools, so if
you're using setuptools to distribute your package, there is no reason not to
use its resource management API.  See also `Accessing Package Resources`_ for
a quick example of converting code that uses ``__file__`` to use
``pkg_resources`` instead.

.. _Accessing Package Resources: http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources


Non-Package Data Files
----------------------

The ``distutils`` normally install general "data files" to a platform-specific
location (e.g. ``/usr/share``).  This feature intended to be used for things
like documentation, example configuration files, and the like.  ``setuptools``
does not install these data files in a separate location, however.  They are
bundled inside the egg file or directory, alongside the Python modules and
packages.  The data files can also be accessed using the :ref:`ResourceManager
API`, by specifying a ``Requirement`` instead of a package name::

    from pkg_resources import Requirement, resource_filename
    filename = resource_filename(Requirement.parse("MyProject"),"sample.conf")

The above code will obtain the filename of the "sample.conf" file in the data
root of the "MyProject" distribution.

Note, by the way, that this encapsulation of data files means that you can't
actually install data files to some arbitrary location on a user's machine;
this is a feature, not a bug.  You can always include a script in your
distribution that extracts and copies your the documentation or data files to
a user-specified location, at their discretion.  If you put related data files
in a single directory, you can use ``resource_filename()`` with the directory
name to get a filesystem directory that then can be copied with the ``shutil``
module.  (Even if your package is installed as a zipfile, calling
``resource_filename()`` on a directory will return an actual filesystem
directory, whose contents will be that entire subtree of your distribution.)

(Of course, if you're writing a new package, you can just as easily place your
data files or directories inside one of your packages, rather than using the
distutils' approach.  However, if you're updating an existing application, it
may be simpler not to change the way it currently specifies these data files.)


Automatic Resource Extraction
-----------------------------

If you are using tools that expect your resources to be "real" files, or your
project includes non-extension native libraries or other files that your C
extensions expect to be able to access, you may need to list those files in
the ``eager_resources`` argument to ``setup()``, so that the files will be
extracted together, whenever a C extension in the project is imported.

This is especially important if your project includes shared libraries *other*
than distutils-built C extensions, and those shared libraries use file
extensions other than ``.dll``, ``.so``, or ``.dylib``, which are the
extensions that setuptools 0.6a8 and higher automatically detects as shared
libraries and adds to the ``native_libs.txt`` file for you.  Any shared
libraries whose names do not end with one of those extensions should be listed
as ``eager_resources``, because they need to be present in the filesystem when
he C extensions that link to them are used.

The ``pkg_resources`` runtime for compressed packages will automatically
extract *all* C extensions and ``eager_resources`` at the same time, whenever
*any* C extension or eager resource is requested via the ``resource_filename()``
API.  (C extensions are imported using ``resource_filename()`` internally.)
This ensures that C extensions will see all of the "real" files that they
expect to see.

Note also that you can list directory resource names in ``eager_resources`` as
well, in which case the directory's contents (including subdirectories) will be
extracted whenever any C extension or eager resource is requested.

Please note that if you're not sure whether you need to use this argument, you
don't!  It's really intended to support projects with lots of non-Python
dependencies and as a last resort for crufty projects that can't otherwise
handle being compressed.  If your package is pure Python, Python plus data
files, or Python plus C, you really don't need this.  You've got to be using
either C or an external program that needs "real" files in your project before
there's any possibility of ``eager_resources`` being relevant to your project.


Extensible Applications and Frameworks
======================================


.. _Entry Points:

Dynamic Discovery of Services and Plugins
-----------------------------------------

``setuptools`` supports creating libraries that "plug in" to extensible
applications and frameworks, by letting you register "entry points" in your
project that can be imported by the application or framework.

For example, suppose that a blogging tool wants to support plugins
that provide translation for various file types to the blog's output format.
The framework might define an "entry point group" called ``blogtool.parsers``,
and then allow plugins to register entry points for the file extensions they
support.

This would allow people to create distributions that contain one or more
parsers for different file types, and then the blogging tool would be able to
find the parsers at runtime by looking up an entry point for the file
extension (or mime type, or however it wants to).

Note that if the blogging tool includes parsers for certain file formats, it
can register these as entry points in its own setup script, which means it
doesn't have to special-case its built-in formats.  They can just be treated
the same as any other plugin's entry points would be.

If you're creating a project that plugs in to an existing application or
framework, you'll need to know what entry points or entry point groups are
defined by that application or framework.  Then, you can register entry points
in your setup script.  Here are a few examples of ways you might register an
``.rst`` file parser entry point in the ``blogtool.parsers`` entry point group,
for our hypothetical blogging tool::

    setup(
        # ...
        entry_points={'blogtool.parsers': '.rst = some_module:SomeClass'}
    )

    setup(
        # ...
        entry_points={'blogtool.parsers': ['.rst = some_module:a_func']}
    )

    setup(
        # ...
        entry_points="""
            [blogtool.parsers]
            .rst = some.nested.module:SomeClass.some_classmethod [reST]
        """,
        extras_require=dict(reST="Docutils>=0.3.5")
    )

The ``entry_points`` argument to ``setup()`` accepts either a string with
``.ini``-style sections, or a dictionary mapping entry point group names to
either strings or lists of strings containing entry point specifiers.  An
entry point specifier consists of a name and value, separated by an ``=``
sign.  The value consists of a dotted module name, optionally followed by a
``:`` and a dotted identifier naming an object within the module.  It can
also include a bracketed list of "extras" that are required for the entry
point to be used.  When the invoking application or framework requests loading
of an entry point, any requirements implied by the associated extras will be
passed to ``pkg_resources.require()``, so that an appropriate error message
can be displayed if the needed package(s) are missing.  (Of course, the
invoking app or framework can ignore such errors if it wants to make an entry
point optional if a requirement isn't installed.)


Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata to include in eggs, which they can then access using the
``pkg_resources`` metadata APIs.  Ordinarily, this is done by having plugin
developers include additional files in their ``ProjectName.egg-info``
directory.  However, since it can be tedious to create such files by hand, you
may want to create a distutils extension that will create the necessary files
from arguments to ``setup()``, in much the same way that ``setuptools`` does
for many of the ``setup()`` arguments it adds.  See the section below on
`Creating distutils Extensions`_ for more details, especially the subsection on
`Adding new EGG-INFO Files`_.


"Development Mode"
==================

Under normal circumstances, the ``distutils`` assume that you are going to
build a distribution of your project, not use it in its "raw" or "unbuilt"
form.  If you were to use the ``distutils`` that way, you would have to rebuild
and reinstall your project every time you made a change to it during
development.

Another problem that sometimes comes up with the ``distutils`` is that you may
need to do development on two related projects at the same time.  You may need
to put both projects' packages in the same directory to run them, but need to
keep them separate for revision control purposes.  How can you do this?

Setuptools allows you to deploy your projects for use in a common directory or
staging area, but without copying any files.  Thus, you can edit each project's
code in its checkout directory, and only need to run build commands when you
change a project's C extensions or similarly compiled files.  You can even
deploy a project into another project's checkout directory, if that's your
preferred way of working (as opposed to using a common independent staging area
or the site-packages directory).

To do this, use the ``setup.py develop`` command.  It works very similarly to
``setup.py install`` or the EasyInstall tool, except that it doesn't actually
install anything.  Instead, it creates a special ``.egg-link`` file in the
deployment directory, that links to your project's source code.  And, if your
deployment directory is Python's ``site-packages`` directory, it will also
update the ``easy-install.pth`` file to include your project's source code,
thereby making it available on ``sys.path`` for all programs using that Python
installation.

If you have enabled the ``use_2to3`` flag, then of course the ``.egg-link``
will not link directly to your source code when run under Python 3, since
that source code would be made for Python 2 and not work under Python 3.
Instead the ``setup.py develop`` will build Python 3 code under the ``build``
directory, and link there. This means that after doing code changes you will
have to run ``setup.py build`` before these changes are picked up by your
Python 3 installation.

In addition, the ``develop`` command creates wrapper scripts in the target
script directory that will run your in-development scripts after ensuring that
all your ``install_requires`` packages are available on ``sys.path``.

You can deploy the same project to multiple staging areas, e.g. if you have
multiple projects on the same machine that are sharing the same project you're
doing development work.

When you're done with a given development task, you can remove the project
source from a staging area using ``setup.py develop --uninstall``, specifying
the desired staging area if it's not the default.

There are several options to control the precise behavior of the ``develop``
command; see the section on the `develop`_ command below for more details.

Note that you can also apply setuptools commands to non-setuptools projects,
using commands like this::

   python -c "import setuptools; execfile('setup.py')" develop

That is, you can simply list the normal setup commands and options following
the quoted part.


Distributing a ``setuptools``-based project
===========================================

Using ``setuptools``...  Without bundling it!
---------------------------------------------

.. warning:: **ez_setup** is deprecated in favor of PIP with **PEP-518** support.

Your users might not have ``setuptools`` installed on their machines, or even
if they do, it might not be the right version.  Fixing this is easy; just
download `ez_setup.py`_, and put it in the same directory as your ``setup.py``
script.  (Be sure to add it to your revision control system, too.)  Then add
these two lines to the very top of your setup script, before the script imports
anything from setuptools:

.. code-block:: python

    import ez_setup
    ez_setup.use_setuptools()

That's it.  The ``ez_setup`` module will automatically download a matching
version of ``setuptools`` from PyPI, if it isn't present on the target system.
Whenever you install an updated version of setuptools, you should also update
your projects' ``ez_setup.py`` files, so that a matching version gets installed
on the target machine(s).

By the way, setuptools supports the new PyPI "upload" command, so you can use
``setup.py sdist upload`` or ``setup.py bdist_egg upload`` to upload your
source or egg distributions respectively.  Your project's current version must
be registered with PyPI first, of course; you can use ``setup.py register`` to
do that.  Or you can do it all in one step, e.g. ``setup.py register sdist
bdist_egg upload`` will register the package, build source and egg
distributions, and then upload them both to PyPI, where they'll be easily
found by other projects that depend on them.

(By the way, if you need to distribute a specific version of ``setuptools``,
you can specify the exact version and base download URL as parameters to the
``use_setuptools()`` function.  See the function's docstring for details.)


What Your Users Should Know
---------------------------

In general, a setuptools-based project looks just like any distutils-based
project -- as long as your users have an internet connection and are installing
to ``site-packages``, that is.  But for some users, these conditions don't
apply, and they may become frustrated if this is their first encounter with
a setuptools-based project.  To keep these users happy, you should review the
following topics in your project's installation instructions, if they are
relevant to your project and your target audience isn't already familiar with
setuptools and ``easy_install``.

Network Access
    If your project is using ``ez_setup``, you should inform users of the
    need to either have network access, or to preinstall the correct version of
    setuptools using the `EasyInstall installation instructions`_.  Those
    instructions also have tips for dealing with firewalls as well as how to
    manually download and install setuptools.

Custom Installation Locations
    You should inform your users that if they are installing your project to
    somewhere other than the main ``site-packages`` directory, they should
    first install setuptools using the instructions for `Custom Installation
    Locations`_, before installing your project.

Your Project's Dependencies
    If your project depends on other projects that may need to be downloaded
    from PyPI or elsewhere, you should list them in your installation
    instructions, or tell users how to find out what they are.  While most
    users will not need this information, any users who don't have unrestricted
    internet access may have to find, download, and install the other projects
    manually.  (Note, however, that they must still install those projects
    using ``easy_install``, or your project will not know they are installed,
    and your setup script will try to download them again.)

    If you want to be especially friendly to users with limited network access,
    you may wish to build eggs for your project and its dependencies, making
    them all available for download from your site, or at least create a page
    with links to all of the needed eggs.  In this way, users with limited
    network access can manually download all the eggs to a single directory,
    then use the ``-f`` option of ``easy_install`` to specify the directory
    to find eggs in.  Users who have full network access can just use ``-f``
    with the URL of your download page, and ``easy_install`` will find all the
    needed eggs using your links directly.  This is also useful when your
    target audience isn't able to compile packages (e.g. most Windows users)
    and your package or some of its dependencies include C code.

Revision Control System Users and Co-Developers
    Users and co-developers who are tracking your in-development code using
    a revision control system should probably read this manual's sections
    regarding such development.  Alternately, you may wish to create a
    quick-reference guide containing the tips from this manual that apply to
    your particular situation.  For example, if you recommend that people use
    ``setup.py develop`` when tracking your in-development code, you should let
    them know that this needs to be run after every update or commit.

    Similarly, if you remove modules or data files from your project, you
    should remind them to run ``setup.py clean --all`` and delete any obsolete
    ``.pyc`` or ``.pyo``.  (This tip applies to the distutils in general, not
    just setuptools, but not everybody knows about them; be kind to your users
    by spelling out your project's best practices rather than leaving them
    guessing.)

Creating System Packages
    Some users want to manage all Python packages using a single package
    manager, and sometimes that package manager isn't ``easy_install``!
    Setuptools currently supports ``bdist_rpm``, ``bdist_wininst``, and
    ``bdist_dumb`` formats for system packaging.  If a user has a locally-
    installed "bdist" packaging tool that internally uses the distutils
    ``install`` command, it should be able to work with ``setuptools``.  Some
    examples of "bdist" formats that this should work with include the
    ``bdist_nsi`` and ``bdist_msi`` formats for Windows.

    However, packaging tools that build binary distributions by running
    ``setup.py install`` on the command line or as a subprocess will require
    modification to work with setuptools.  They should use the
    ``--single-version-externally-managed`` option to the ``install`` command,
    combined with the standard ``--root`` or ``--record`` options.
    See the `install command`_ documentation below for more details.  The
    ``bdist_deb`` command is an example of a command that currently requires
    this kind of patching to work with setuptools.

    If you or your users have a problem building a usable system package for
    your project, please report the problem via the mailing list so that
    either the "bdist" tool in question or setuptools can be modified to
    resolve the issue.


Setting the ``zip_safe`` flag
-----------------------------

For some use cases (such as bundling as part of a larger application), Python
packages may be run directly from a zip file.
Not all packages, however, are capable of running in compressed form, because
they may expect to be able to access either source code or data files as
normal operating system files.  So, ``setuptools`` can install your project
as a zipfile or a directory, and its default choice is determined by the
project's ``zip_safe`` flag.

You can pass a True or False value for the ``zip_safe`` argument to the
``setup()`` function, or you can omit it.  If you omit it, the ``bdist_egg``
command will analyze your project's contents to see if it can detect any
conditions that would prevent it from working in a zipfile.  It will output
notices to the console about any such conditions that it finds.

Currently, this analysis is extremely conservative: it will consider the
project unsafe if it contains any C extensions or datafiles whatsoever.  This
does *not* mean that the project can't or won't work as a zipfile!  It just
means that the ``bdist_egg`` authors aren't yet comfortable asserting that
the project *will* work.  If the project contains no C or data files, and does
no ``__file__`` or ``__path__`` introspection or source code manipulation, then
there is an extremely solid chance the project will work when installed as a
zipfile.  (And if the project uses ``pkg_resources`` for all its data file
access, then C extensions and other data files shouldn't be a problem at all.
See the `Accessing Data Files at Runtime`_ section above for more information.)

However, if ``bdist_egg`` can't be *sure* that your package will work, but
you've checked over all the warnings it issued, and you are either satisfied it
*will* work (or if you want to try it for yourself), then you should set
``zip_safe`` to ``True`` in your ``setup()`` call.  If it turns out that it
doesn't work, you can always change it to ``False``, which will force
``setuptools`` to install your project as a directory rather than as a zipfile.

Of course, the end-user can still override either decision, if they are using
EasyInstall to install your package.  And, if you want to override for testing
purposes, you can just run ``setup.py easy_install --zip-ok .`` or ``setup.py
easy_install --always-unzip .`` in your project directory. to install the
package as a zipfile or directory, respectively.

In the future, as we gain more experience with different packages and become
more satisfied with the robustness of the ``pkg_resources`` runtime, the
"zip safety" analysis may become less conservative.  However, we strongly
recommend that you determine for yourself whether your project functions
correctly when installed as a zipfile, correct any problems if you can, and
then make an explicit declaration of ``True`` or ``False`` for the ``zip_safe``
flag, so that it will not be necessary for ``bdist_egg`` or ``EasyInstall`` to
try to guess whether your project can work as a zipfile.


Namespace Packages
------------------

Sometimes, a large package is more useful if distributed as a collection of
smaller eggs.  However, Python does not normally allow the contents of a
package to be retrieved from more than one location.  "Namespace packages"
are a solution for this problem.  When you declare a package to be a namespace
package, it means that the package has no meaningful contents in its
``__init__.py``, and that it is merely a container for modules and subpackages.

The ``pkg_resources`` runtime will then automatically ensure that the contents
of namespace packages that are spread over multiple eggs or directories are
combined into a single "virtual" package.

The ``namespace_packages`` argument to ``setup()`` lets you declare your
project's namespace packages, so that they will be included in your project's
metadata.  The argument should list the namespace packages that the egg
participates in.  For example, the ZopeInterface project might do this::

    setup(
        # ...
        namespace_packages=['zope']
    )

because it contains a ``zope.interface`` package that lives in the ``zope``
namespace package.  Similarly, a project for a standalone ``zope.publisher``
would also declare the ``zope`` namespace package.  When these projects are
installed and used, Python will see them both as part of a "virtual" ``zope``
package, even though they will be installed in different locations.

Namespace packages don't have to be top-level packages.  For example, Zope 3's
``zope.app`` package is a namespace package, and in the future PEAK's
``peak.util`` package will be too.

Note, by the way, that your project's source tree must include the namespace
packages' ``__init__.py`` files (and the ``__init__.py`` of any parent
packages), in a normal Python package layout.  These ``__init__.py`` files
*must* contain the line::

    __import__('pkg_resources').declare_namespace(__name__)

This code ensures that the namespace package machinery is operating and that
the current package is registered as a namespace package.

You must NOT include any other code and data in a namespace package's
``__init__.py``.  Even though it may appear to work during development, or when
projects are installed as ``.egg`` files, it will not work when the projects
are installed using "system" packaging tools -- in such cases the
``__init__.py`` files will not be installed, let alone executed.

You must include the ``declare_namespace()``  line in the ``__init__.py`` of
*every* project that has contents for the namespace package in question, in
order to ensure that the namespace will be declared regardless of which
project's copy of ``__init__.py`` is loaded first.  If the first loaded
``__init__.py`` doesn't declare it, it will never *be* declared, because no
other copies will ever be loaded!


TRANSITIONAL NOTE
~~~~~~~~~~~~~~~~~

Setuptools automatically calls ``declare_namespace()`` for you at runtime,
but future versions may *not*.  This is because the automatic declaration
feature has some negative side effects, such as needing to import all namespace
packages during the initialization of the ``pkg_resources`` runtime, and also
the need for ``pkg_resources`` to be explicitly imported before any namespace
packages work at all.  In some future releases, you'll be responsible
for including your own declaration lines, and the automatic declaration feature
will be dropped to get rid of the negative side effects.

During the remainder of the current development cycle, therefore, setuptools
will warn you about missing ``declare_namespace()`` calls in your
``__init__.py`` files, and you should correct these as soon as possible
before the compatibility support is removed.
Namespace packages without declaration lines will not work
correctly once a user has upgraded to a later version, so it's important that
you make this change now in order to avoid having your code break in the field.
Our apologies for the inconvenience, and thank you for your patience.



Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

When a set of related projects are under development, it may be important to
track finer-grained version increments than you would normally use for e.g.
"stable" releases.  While stable releases might be measured in dotted numbers
with alpha/beta/etc. status codes, development versions of a project often
need to be tracked by revision or build number or even build date.  This is
especially true when projects in development need to refer to one another, and
therefore may literally need an up-to-the-minute version of something!

To support these scenarios, ``setuptools`` allows you to "tag" your source and
egg distributions by adding one or more of the following to the project's
"official" version identifier:

* A manually-specified pre-release tag, such as "build" or "dev", or a
  manually-specified post-release tag, such as a build or revision number
  (``--tag-build=STRING, -bSTRING``)

* An 8-character representation of the build date (``--tag-date, -d``), as
  a postrelease tag

You can add these tags by adding ``egg_info`` and the desired options to
the command line ahead of the ``sdist`` or ``bdist`` commands that you want
to generate a daily build or snapshot for.  See the section below on the
`egg_info`_ command for more details.

(Also, before you release your project, be sure to see the section above on
`Specifying Your Project's Version`_ for more information about how pre- and
post-release tags affect how setuptools and EasyInstall interpret version
numbers.  This is important in order to make sure that dependency processing
tools will know which versions of your project are newer than others.)

Finally, if you are creating builds frequently, and either building them in a
downloadable location or are copying them to a distribution server, you should
probably also check out the `rotate`_ command, which lets you automatically
delete all but the N most-recently-modified distributions matching a glob
pattern.  So, you can use a command line like::

    setup.py egg_info -rbDEV bdist_egg rotate -m.egg -k3

to build an egg whose version info includes 'DEV-rNNNN' (where NNNN is the
most recent Subversion revision that affected the source tree), and then
delete any egg files from the distribution directory except for the three
that were built most recently.

If you have to manage automated builds for multiple packages, each with
different tagging and rotation policies, you may also want to check out the
`alias`_ command, which would let each package define an alias like ``daily``
that would perform the necessary tag, build, and rotate commands.  Then, a
simpler script or cron job could just run ``setup.py daily`` in each project
directory.  (And, you could also define sitewide or per-user default versions
of the ``daily`` alias, so that projects that didn't define their own would
use the appropriate defaults.)


Generating Source Distributions
-------------------------------

``setuptools`` enhances the distutils' default algorithm for source file
selection with pluggable endpoints for looking up files to include. If you are
using a revision control system, and your source distributions only need to
include files that you're tracking in revision control, use a corresponding
plugin instead of writing a ``MANIFEST.in`` file. See the section below on
`Adding Support for Revision Control Systems`_ for information on plugins.

If you need to include automatically generated files, or files that are kept in
an unsupported revision control system, you'll need to create a ``MANIFEST.in``
file to specify any files that the default file location algorithm doesn't
catch.  See the distutils documentation for more information on the format of
the ``MANIFEST.in`` file.

But, be sure to ignore any part of the distutils documentation that deals with
``MANIFEST`` or how it's generated from ``MANIFEST.in``; setuptools shields you
from these issues and doesn't work the same way in any case.  Unlike the
distutils, setuptools regenerates the source distribution manifest file
every time you build a source distribution, and it builds it inside the
project's ``.egg-info`` directory, out of the way of your main project
directory.  You therefore need not worry about whether it is up-to-date or not.

Indeed, because setuptools' approach to determining the contents of a source
distribution is so much simpler, its ``sdist`` command omits nearly all of
the options that the distutils' more complex ``sdist`` process requires.  For
all practical purposes, you'll probably use only the ``--formats`` option, if
you use any option at all.


Making your package available for EasyInstall
---------------------------------------------

If you use the ``register`` command (``setup.py register``) to register your
package with PyPI, that's most of the battle right there.  (See the
`docs for the register command`_ for more details.)

.. _docs for the register command: http://docs.python.org/dist/package-index.html

If you also use the `upload`_ command to upload actual distributions of your
package, that's even better, because EasyInstall will be able to find and
download them directly from your project's PyPI page.

However, there may be reasons why you don't want to upload distributions to
PyPI, and just want your existing distributions (or perhaps a Subversion
checkout) to be used instead.

So here's what you need to do before running the ``register`` command.  There
are three ``setup()`` arguments that affect EasyInstall:

``url`` and ``download_url``
   These become links on your project's PyPI page.  EasyInstall will examine
   them to see if they link to a package ("primary links"), or whether they are
   HTML pages.  If they're HTML pages, EasyInstall scans all HREF's on the
   page for primary links

``long_description``
   EasyInstall will check any URLs contained in this argument to see if they
   are primary links.

A URL is considered a "primary link" if it is a link to a .tar.gz, .tgz, .zip,
.egg, .egg.zip, .tar.bz2, or .exe file, or if it has an ``#egg=project`` or
``#egg=project-version`` fragment identifier attached to it.  EasyInstall
attempts to determine a project name and optional version number from the text
of a primary link *without* downloading it.  When it has found all the primary
links, EasyInstall will select the best match based on requested version,
platform compatibility, and other criteria.

So, if your ``url`` or ``download_url`` point either directly to a downloadable
source distribution, or to HTML page(s) that have direct links to such, then
EasyInstall will be able to locate downloads automatically.  If you want to
make Subversion checkouts available, then you should create links with either
``#egg=project`` or ``#egg=project-version`` added to the URL.  You should
replace ``project`` and ``version`` with the values they would have in an egg
filename.  (Be sure to actually generate an egg and then use the initial part
of the filename, rather than trying to guess what the escaped form of the
project name and version number will be.)

Note that Subversion checkout links are of lower precedence than other kinds
of distributions, so EasyInstall will not select a Subversion checkout for
downloading unless it has a version included in the ``#egg=`` suffix, and
it's a higher version than EasyInstall has seen in any other links for your
project.

As a result, it's a common practice to use mark checkout URLs with a version of
"dev" (i.e., ``#egg=projectname-dev``), so that users can do something like
this::

    easy_install --editable projectname==dev

in order to check out the in-development version of ``projectname``.


Making "Official" (Non-Snapshot) Releases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When you make an official release, creating source or binary distributions,
you will need to override the tag settings from ``setup.cfg``, so that you
don't end up registering versions like ``foobar-0.7a1.dev-r34832``.  This is
easy to do if you are developing on the trunk and using tags or branches for
your releases - just make the change to ``setup.cfg`` after branching or
tagging the release, so the trunk will still produce development snapshots.

Alternately, if you are not branching for releases, you can override the
default version options on the command line, using something like::

    python setup.py egg_info -Db "" sdist bdist_egg register upload

The first part of this command (``egg_info -Db ""``) will override the
configured tag information, before creating source and binary eggs, registering
the project with PyPI, and uploading the files.  Thus, these commands will use
the plain version from your ``setup.py``, without adding the build designation
string.

Of course, if you will be doing this a lot, you may wish to create a personal
alias for this operation, e.g.::

    python setup.py alias -u release egg_info -Db ""

You can then use it like this::

    python setup.py release sdist bdist_egg register upload

Or of course you can create more elaborate aliases that do all of the above.
See the sections below on the `egg_info`_ and `alias`_ commands for more ideas.



Distributing Extensions compiled with Pyrex
-------------------------------------------

``setuptools`` includes transparent support for building Pyrex extensions, as
long as you define your extensions using ``setuptools.Extension``, *not*
``distutils.Extension``.  You must also not import anything from Pyrex in
your setup script.

If you follow these rules, you can safely list ``.pyx`` files as the source
of your ``Extension`` objects in the setup script.  ``setuptools`` will detect
at build time whether Pyrex is installed or not.  If it is, then ``setuptools``
will use it.  If not, then ``setuptools`` will silently change the
``Extension`` objects to refer to the ``.c`` counterparts of the ``.pyx``
files, so that the normal distutils C compilation process will occur.

Of course, for this to work, your source distributions must include the C
code generated by Pyrex, as well as your original ``.pyx`` files.  This means
that you will probably want to include current ``.c`` files in your revision
control system, rebuilding them whenever you check changes in for the ``.pyx``
source files.  This will ensure that people tracking your project in a revision
control system will be able to build it even if they don't have Pyrex
installed, and that your source releases will be similarly usable with or
without Pyrex.


-----------------
Command Reference
-----------------

.. _alias:

``alias`` - Define shortcuts for commonly used commands
=======================================================

Sometimes, you need to use the same commands over and over, but you can't
necessarily set them as defaults.  For example, if you produce both development
snapshot releases and "stable" releases of a project, you may want to put
the distributions in different places, or use different ``egg_info`` tagging
options, etc.  In these cases, it doesn't make sense to set the options in
a distutils configuration file, because the values of the options changed based
on what you're trying to do.

Setuptools therefore allows you to define "aliases" - shortcut names for
an arbitrary string of commands and options, using ``setup.py alias aliasname
expansion``, where aliasname is the name of the new alias, and the remainder of
the command line supplies its expansion.  For example, this command defines
a sitewide alias called "daily", that sets various ``egg_info`` tagging
options::

    setup.py alias --global-config daily egg_info --tag-build=development

Once the alias is defined, it can then be used with other setup commands,
e.g.::

    setup.py daily bdist_egg        # generate a daily-build .egg file
    setup.py daily sdist            # generate a daily-build source distro
    setup.py daily sdist bdist_egg  # generate both

The above commands are interpreted as if the word ``daily`` were replaced with
``egg_info --tag-build=development``.

Note that setuptools will expand each alias *at most once* in a given command
line.  This serves two purposes.  First, if you accidentally create an alias
loop, it will have no effect; you'll instead get an error message about an
unknown command.  Second, it allows you to define an alias for a command, that
uses that command.  For example, this (project-local) alias::

    setup.py alias bdist_egg bdist_egg rotate -k1 -m.egg

redefines the ``bdist_egg`` command so that it always runs the ``rotate``
command afterwards to delete all but the newest egg file.  It doesn't loop
indefinitely on ``bdist_egg`` because the alias is only expanded once when
used.

You can remove a defined alias with the ``--remove`` (or ``-r``) option, e.g.::

    setup.py alias --global-config --remove daily

would delete the "daily" alias we defined above.

Aliases can be defined on a project-specific, per-user, or sitewide basis.  The
default is to define or remove a project-specific alias, but you can use any of
the `configuration file options`_ (listed under the `saveopts`_ command, below)
to determine which distutils configuration file an aliases will be added to
(or removed from).

Note that if you omit the "expansion" argument to the ``alias`` command,
you'll get output showing that alias' current definition (and what
configuration file it's defined in).  If you omit the alias name as well,
you'll get a listing of all current aliases along with their configuration
file locations.


``bdist_egg`` - Create a Python Egg for the project
===================================================

This command generates a Python Egg (``.egg`` file) for the project.  Python
Eggs are the preferred binary distribution format for EasyInstall, because they
are cross-platform (for "pure" packages), directly importable, and contain
project metadata including scripts and information about the project's
dependencies.  They can be simply downloaded and added to ``sys.path``
directly, or they can be placed in a directory on ``sys.path`` and then
automatically discovered by the egg runtime system.

This command runs the `egg_info`_ command (if it hasn't already run) to update
the project's metadata (``.egg-info``) directory.  If you have added any extra
metadata files to the ``.egg-info`` directory, those files will be included in
the new egg file's metadata directory, for use by the egg runtime system or by
any applications or frameworks that use that metadata.

You won't usually need to specify any special options for this command; just
use ``bdist_egg`` and you're done.  But there are a few options that may
be occasionally useful:

``--dist-dir=DIR, -d DIR``
    Set the directory where the ``.egg`` file will be placed.  If you don't
    supply this, then the ``--dist-dir`` setting of the ``bdist`` command
    will be used, which is usually a directory named ``dist`` in the project
    directory.

``--plat-name=PLATFORM, -p PLATFORM``
    Set the platform name string that will be embedded in the egg's filename
    (assuming the egg contains C extensions).  This can be used to override
    the distutils default platform name with something more meaningful.  Keep
    in mind, however, that the egg runtime system expects to see eggs with
    distutils platform names, so it may ignore or reject eggs with non-standard
    platform names.  Similarly, the EasyInstall program may ignore them when
    searching web pages for download links.  However, if you are
    cross-compiling or doing some other unusual things, you might find a use
    for this option.

``--exclude-source-files``
    Don't include any modules' ``.py`` files in the egg, just compiled Python,
    C, and data files.  (Note that this doesn't affect any ``.py`` files in the
    EGG-INFO directory or its subdirectories, since for example there may be
    scripts with a ``.py`` extension which must still be retained.)  We don't
    recommend that you use this option except for packages that are being
    bundled for proprietary end-user applications, or for "embedded" scenarios
    where space is at an absolute premium.  On the other hand, if your package
    is going to be installed and used in compressed form, you might as well
    exclude the source because Python's ``traceback`` module doesn't currently
    understand how to display zipped source code anyway, or how to deal with
    files that are in a different place from where their code was compiled.

There are also some options you will probably never need, but which are there
because they were copied from similar ``bdist`` commands used as an example for
creating this one.  They may be useful for testing and debugging, however,
which is why we kept them:

``--keep-temp, -k``
    Keep the contents of the ``--bdist-dir`` tree around after creating the
    ``.egg`` file.

``--bdist-dir=DIR, -b DIR``
    Set the temporary directory for creating the distribution.  The entire
    contents of this directory are zipped to create the ``.egg`` file, after
    running various installation commands to copy the package's modules, data,
    and extensions here.

``--skip-build``
    Skip doing any "build" commands; just go straight to the
    install-and-compress phases.


.. _develop:

``develop`` - Deploy the project source in "Development Mode"
=============================================================

This command allows you to deploy your project's source for use in one or more
"staging areas" where it will be available for importing.  This deployment is
done in such a way that changes to the project source are immediately available
in the staging area(s), without needing to run a build or install step after
each change.

The ``develop`` command works by creating an ``.egg-link`` file (named for the
project) in the given staging area.  If the staging area is Python's
``site-packages`` directory, it also updates an ``easy-install.pth`` file so
that the project is on ``sys.path`` by default for all programs run using that
Python installation.

The ``develop`` command also installs wrapper scripts in the staging area (or
a separate directory, as specified) that will ensure the project's dependencies
are available on ``sys.path`` before running the project's source scripts.
And, it ensures that any missing project dependencies are available in the
staging area, by downloading and installing them if necessary.

Last, but not least, the ``develop`` command invokes the ``build_ext -i``
command to ensure any C extensions in the project have been built and are
up-to-date, and the ``egg_info`` command to ensure the project's metadata is
updated (so that the runtime and wrappers know what the project's dependencies
are).  If you make any changes to the project's setup script or C extensions,
you should rerun the ``develop`` command against all relevant staging areas to
keep the project's scripts, metadata and extensions up-to-date.  Most other
kinds of changes to your project should not require any build operations or
rerunning ``develop``, but keep in mind that even minor changes to the setup
script (e.g. changing an entry point definition) require you to re-run the
``develop`` or ``test`` commands to keep the distribution updated.

Here are some of the options that the ``develop`` command accepts.  Note that
they affect the project's dependencies as well as the project itself, so if you
have dependencies that need to be installed and you use ``--exclude-scripts``
(for example), the dependencies' scripts will not be installed either!  For
this reason, you may want to use EasyInstall to install the project's
dependencies before using the ``develop`` command, if you need finer control
over the installation options for dependencies.

``--uninstall, -u``
    Un-deploy the current project.  You may use the ``--install-dir`` or ``-d``
    option to designate the staging area.  The created ``.egg-link`` file will
    be removed, if present and it is still pointing to the project directory.
    The project directory will be removed from ``easy-install.pth`` if the
    staging area is Python's ``site-packages`` directory.

    Note that this option currently does *not* uninstall script wrappers!  You
    must uninstall them yourself, or overwrite them by using EasyInstall to
    activate a different version of the package.  You can also avoid installing
    script wrappers in the first place, if you use the ``--exclude-scripts``
    (aka ``-x``) option when you run ``develop`` to deploy the project.

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``develop`` from
    adding an ``easy-install.pth`` entry for the project(s) being deployed, and
    if an entry for any version of a project already exists, the entry will be
    removed upon successful deployment.  In multi-version mode, no specific
    version of the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``, or you are running
    a wrapper script generated by ``setuptools`` or EasyInstall.  (In which
    case the wrapper script calls ``require()`` for you.)

    Note that if you install to a directory other than ``site-packages``,
    this option is automatically in effect, because ``.pth`` files can only be
    used in ``site-packages`` (at least in Python 2.3 and 2.4). So, if you use
    the ``--install-dir`` or ``-d`` option (or they are set via configuration
    file(s)) your project and its dependencies will be deployed in multi-
    version mode.

``--install-dir=DIR, -d DIR``
    Set the installation directory (staging area).  If this option is not
    directly specified on the command line or in a distutils configuration
    file, the distutils default installation location is used.  Normally, this
    will be the ``site-packages`` directory, but if you are using distutils
    configuration files, setting things like ``prefix`` or ``install_lib``,
    then those settings are taken into account when computing the default
    staging area.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't deploy script wrappers.  This is useful if you don't want to disturb
    existing versions of the scripts in the staging area.

``--always-copy, -a``
    Copy all needed distributions to the staging area, even if they
    are already present in another directory on ``sys.path``.  By default, if
    a requirement can be met using a distribution that is already available in
    a directory on ``sys.path``, it will not be copied to the staging area.

``--egg-path=DIR``
    Force the generated ``.egg-link`` file to use a specified relative path
    to the source directory.  This can be useful in circumstances where your
    installation directory is being shared by code running under multiple
    platforms (e.g. Mac and Windows) which have different absolute locations
    for the code under development, but the same *relative* locations with
    respect to the installation directory.  If you use this option when
    installing, you must supply the same relative path when uninstalling.

In addition to the above options, the ``develop`` command also accepts all of
the same options accepted by ``easy_install``.  If you've configured any
``easy_install`` settings in your ``setup.cfg`` (or other distutils config
files), the ``develop`` command will use them as defaults, unless you override
them in a ``[develop]`` section or on the command line.


``easy_install`` - Find and install packages
============================================

This command runs the `EasyInstall tool
<easy_install.html>`_ for you.  It is exactly
equivalent to running the ``easy_install`` command.  All command line arguments
following this command are consumed and not processed further by the distutils,
so this must be the last command listed on the command line.  Please see
the EasyInstall documentation for the options reference and usage examples.
Normally, there is no reason to use this command via the command line, as you
can just use ``easy_install`` directly.  It's only listed here so that you know
it's a distutils command, which means that you can:

* create command aliases that use it,
* create distutils extensions that invoke it as a subcommand, and
* configure options for it in your ``setup.cfg`` or other distutils config
  files.


.. _egg_info:

``egg_info`` - Create egg metadata and set build tags
=====================================================

This command performs two operations: it updates a project's ``.egg-info``
metadata directory (used by the ``bdist_egg``, ``develop``, and ``test``
commands), and it allows you to temporarily change a project's version string,
to support "daily builds" or "snapshot" releases.  It is run automatically by
the ``sdist``, ``bdist_egg``, ``develop``, ``register``, and ``test`` commands
in order to update the project's metadata, but you can also specify it
explicitly in order to temporarily change the project's version string while
executing other commands.  (It also generates the``.egg-info/SOURCES.txt``
manifest file, which is used when you are building source distributions.)

In addition to writing the core egg metadata defined by ``setuptools`` and
required by ``pkg_resources``, this command can be extended to write other
metadata files as well, by defining entry points in the ``egg_info.writers``
group.  See the section on `Adding new EGG-INFO Files`_ below for more details.
Note that using additional metadata writers may require you to include a
``setup_requires`` argument to ``setup()`` in order to ensure that the desired
writers are available on ``sys.path``.


Release Tagging Options
-----------------------

The following options can be used to modify the project's version string for
all remaining commands on the setup command line.  The options are processed
in the order shown, so if you use more than one, the requested tags will be
added in the following order:

``--tag-build=NAME, -b NAME``
    Append NAME to the project's version string.  Due to the way setuptools
    processes "pre-release" version suffixes beginning with the letters "a"
    through "e" (like "alpha", "beta", and "candidate"), you will usually want
    to use a tag like ".build" or ".dev", as this will cause the version number
    to be considered *lower* than the project's default version.  (If you
    want to make the version number *higher* than the default version, you can
    always leave off --tag-build and then use one or both of the following
    options.)

    If you have a default build tag set in your ``setup.cfg``, you can suppress
    it on the command line using ``-b ""`` or ``--tag-build=""`` as an argument
    to the ``egg_info`` command.

``--tag-date, -d``
    Add a date stamp of the form "-YYYYMMDD" (e.g. "-20050528") to the
    project's version number.

``--no-date, -D``
    Don't include a date stamp in the version number.  This option is included
    so you can override a default setting in ``setup.cfg``.


(Note: Because these options modify the version number used for source and
binary distributions of your project, you should first make sure that you know
how the resulting version numbers will be interpreted by automated tools
like EasyInstall.  See the section above on `Specifying Your Project's
Version`_ for an explanation of pre- and post-release tags, as well as tips on
how to choose and verify a versioning scheme for your your project.)

For advanced uses, there is one other option that can be set, to change the
location of the project's ``.egg-info`` directory.  Commands that need to find
the project's source directory or metadata should get it from this setting:


Other ``egg_info`` Options
--------------------------

``--egg-base=SOURCEDIR, -e SOURCEDIR``
    Specify the directory that should contain the .egg-info directory.  This
    should normally be the root of your project's source tree (which is not
    necessarily the same as your project directory; some projects use a ``src``
    or ``lib`` subdirectory as the source root).  You should not normally need
    to specify this directory, as it is normally determined from the
    ``package_dir`` argument to the ``setup()`` function, if any.  If there is
    no ``package_dir`` set, this option defaults to the current directory.


``egg_info`` Examples
---------------------

Creating a dated "nightly build" snapshot egg::

    python setup.py egg_info --tag-date --tag-build=DEV bdist_egg

Creating and uploading a release with no version tags, even if some default
tags are specified in ``setup.cfg``::

    python setup.py egg_info -RDb "" sdist bdist_egg register upload

(Notice that ``egg_info`` must always appear on the command line *before* any
commands that you want the version changes to apply to.)


.. _install command:

``install`` - Run ``easy_install`` or old-style installation
============================================================

The setuptools ``install`` command is basically a shortcut to run the
``easy_install`` command on the current project.  However, for convenience
in creating "system packages" of setuptools-based projects, you can also
use this option:

``--single-version-externally-managed``
    This boolean option tells the ``install`` command to perform an "old style"
    installation, with the addition of an ``.egg-info`` directory so that the
    installed project will still have its metadata available and operate
    normally.  If you use this option, you *must* also specify the ``--root``
    or ``--record`` options (or both), because otherwise you will have no way
    to identify and remove the installed files.

This option is automatically in effect when ``install`` is invoked by another
distutils command, so that commands like ``bdist_wininst`` and ``bdist_rpm``
will create system packages of eggs.  It is also automatically in effect if
you specify the ``--root`` option.


``install_egg_info`` - Install an ``.egg-info`` directory in ``site-packages``
==============================================================================

Setuptools runs this command as part of ``install`` operations that use the
``--single-version-externally-managed`` options.  You should not invoke it
directly; it is documented here for completeness and so that distutils
extensions such as system package builders can make use of it.  This command
has only one option:

``--install-dir=DIR, -d DIR``
    The parent directory where the ``.egg-info`` directory will be placed.
    Defaults to the same as the ``--install-dir`` option specified for the
    ``install_lib`` command, which is usually the system ``site-packages``
    directory.

This command assumes that the ``egg_info`` command has been given valid options
via the command line or ``setup.cfg``, as it will invoke the ``egg_info``
command and use its options to locate the project's source ``.egg-info``
directory.


.. _rotate:

``rotate`` - Delete outdated distribution files
===============================================

As you develop new versions of your project, your distribution (``dist``)
directory will gradually fill up with older source and/or binary distribution
files.  The ``rotate`` command lets you automatically clean these up, keeping
only the N most-recently modified files matching a given pattern.

``--match=PATTERNLIST, -m PATTERNLIST``
    Comma-separated list of glob patterns to match.  This option is *required*.
    The project name and ``-*`` is prepended to the supplied patterns, in order
    to match only distributions belonging to the current project (in case you
    have a shared distribution directory for multiple projects).  Typically,
    you will use a glob pattern like ``.zip`` or ``.egg`` to match files of
    the specified type.  Note that each supplied pattern is treated as a
    distinct group of files for purposes of selecting files to delete.

``--keep=COUNT, -k COUNT``
    Number of matching distributions to keep.  For each group of files
    identified by a pattern specified with the ``--match`` option, delete all
    but the COUNT most-recently-modified files in that group.  This option is
    *required*.

``--dist-dir=DIR, -d DIR``
    Directory where the distributions are.  This defaults to the value of the
    ``bdist`` command's ``--dist-dir`` option, which will usually be the
    project's ``dist`` subdirectory.

**Example 1**: Delete all .tar.gz files from the distribution directory, except
for the 3 most recently modified ones::

    setup.py rotate --match=.tar.gz --keep=3

**Example 2**: Delete all Python 2.3 or Python 2.4 eggs from the distribution
directory, except the most recently modified one for each Python version::

    setup.py rotate --match=-py2.3*.egg,-py2.4*.egg --keep=1


.. _saveopts:

``saveopts`` - Save used options to a configuration file
========================================================

Finding and editing ``distutils`` configuration files can be a pain, especially
since you also have to translate the configuration options from command-line
form to the proper configuration file format.  You can avoid these hassles by
using the ``saveopts`` command.  Just add it to the command line to save the
options you used.  For example, this command builds the project using
the ``mingw32`` C compiler, then saves the --compiler setting as the default
for future builds (even those run implicitly by the ``install`` command)::

    setup.py build --compiler=mingw32 saveopts

The ``saveopts`` command saves all options for every command specified on the
command line to the project's local ``setup.cfg`` file, unless you use one of
the `configuration file options`_ to change where the options are saved.  For
example, this command does the same as above, but saves the compiler setting
to the site-wide (global) distutils configuration::

    setup.py build --compiler=mingw32 saveopts -g

Note that it doesn't matter where you place the ``saveopts`` command on the
command line; it will still save all the options specified for all commands.
For example, this is another valid way to spell the last example::

    setup.py saveopts -g build --compiler=mingw32

Note, however, that all of the commands specified are always run, regardless of
where ``saveopts`` is placed on the command line.


Configuration File Options
--------------------------

Normally, settings such as options and aliases are saved to the project's
local ``setup.cfg`` file.  But you can override this and save them to the
global or per-user configuration files, or to a manually-specified filename.

``--global-config, -g``
    Save settings to the global ``distutils.cfg`` file inside the ``distutils``
    package directory.  You must have write access to that directory to use
    this option.  You also can't combine this option with ``-u`` or ``-f``.

``--user-config, -u``
    Save settings to the current user's ``~/.pydistutils.cfg`` (POSIX) or
    ``$HOME/pydistutils.cfg`` (Windows) file.  You can't combine this option
    with ``-g`` or ``-f``.

``--filename=FILENAME, -f FILENAME``
    Save settings to the specified configuration file to use.  You can't
    combine this option with ``-g`` or ``-u``.  Note that if you specify a
    non-standard filename, the ``distutils`` and ``setuptools`` will not
    use the file's contents.  This option is mainly included for use in
    testing.

These options are used by other ``setuptools`` commands that modify
configuration files, such as the `alias`_ and `setopt`_ commands.


.. _setopt:

``setopt`` - Set a distutils or setuptools option in a config file
==================================================================

This command is mainly for use by scripts, but it can also be used as a quick
and dirty way to change a distutils configuration option without having to
remember what file the options are in and then open an editor.

**Example 1**.  Set the default C compiler to ``mingw32`` (using long option
names)::

    setup.py setopt --command=build --option=compiler --set-value=mingw32

**Example 2**.  Remove any setting for the distutils default package
installation directory (short option names)::

    setup.py setopt -c install -o install_lib -r


Options for the ``setopt`` command:

``--command=COMMAND, -c COMMAND``
    Command to set the option for.  This option is required.

``--option=OPTION, -o OPTION``
    The name of the option to set.  This option is required.

``--set-value=VALUE, -s VALUE``
    The value to set the option to.  Not needed if ``-r`` or ``--remove`` is
    set.

``--remove, -r``
    Remove (unset) the option, instead of setting it.

In addition to the above options, you may use any of the `configuration file
options`_ (listed under the `saveopts`_ command, above) to determine which
distutils configuration file the option will be added to (or removed from).


.. _test:

``test`` - Build package and run a unittest suite
=================================================

When doing test-driven development, or running automated builds that need
testing before they are deployed for downloading or use, it's often useful
to be able to run a project's unit tests without actually deploying the project
anywhere, even using the ``develop`` command.  The ``test`` command runs a
project's unit tests without actually deploying it, by temporarily putting the
project's source on ``sys.path``, after first running ``build_ext -i`` and
``egg_info`` to ensure that any C extensions and project metadata are
up-to-date.

To use this command, your project's tests must be wrapped in a ``unittest``
test suite by either a function, a ``TestCase`` class or method, or a module
or package containing ``TestCase`` classes.  If the named suite is a module,
and the module has an ``additional_tests()`` function, it is called and the
result (which must be a ``unittest.TestSuite``) is added to the tests to be
run.  If the named suite is a package, any submodules and subpackages are
recursively added to the overall test suite.  (Note: if your project specifies
a ``test_loader``, the rules for processing the chosen ``test_suite`` may
differ; see the `test_loader`_ documentation for more details.)

Note that many test systems including ``doctest`` support wrapping their
non-``unittest`` tests in ``TestSuite`` objects.  So, if you are using a test
package that does not support this, we suggest you encourage its developers to
implement test suite support, as this is a convenient and standard way to
aggregate a collection of tests to be run under a common test harness.

By default, tests will be run in the "verbose" mode of the ``unittest``
package's text test runner, but you can get the "quiet" mode (just dots) if
you supply the ``-q`` or ``--quiet`` option, either as a global option to
the setup script (e.g. ``setup.py -q test``) or as an option for the ``test``
command itself (e.g. ``setup.py test -q``).  There is one other option
available:

``--test-suite=NAME, -s NAME``
    Specify the test suite (or module, class, or method) to be run
    (e.g. ``some_module.test_suite``).  The default for this option can be
    set by giving a ``test_suite`` argument to the ``setup()`` function, e.g.::

        setup(
            # ...
            test_suite="my_package.tests.test_all"
        )

    If you did not set a ``test_suite`` in your ``setup()`` call, and do not
    provide a ``--test-suite`` option, an error will occur.


.. _upload:

``upload`` - Upload source and/or egg distributions to PyPI
===========================================================

The ``upload`` command is implemented and `documented
<https://docs.python.org/3.1/distutils/uploading.html>`_
in distutils.

Setuptools augments the ``upload`` command with support
for `keyring <https://pypi.python.org/pypi/keyring>`_,
allowing the password to be stored in a secure
location and not in plaintext in the .pypirc file. To use
keyring, first install keyring and set the password for
the relevant repository, e.g.::

    python -m keyring set <repository> <username>
    Password for '<username>' in '<repository>': ********

Then, in .pypirc, set the repository configuration as normal,
but omit the password. Thereafter, uploads will use the
password from the keyring.

New in 20.1: Added keyring support.


-----------------------------------------
Configuring setup() using setup.cfg files
-----------------------------------------

.. note:: New in 30.3.0 (8 Dec 2016).

.. important:: ``setup.py`` with ``setup()`` function call is still required even 
                if your configuration resides in ``setup.cfg``.

``Setuptools`` allows using configuration files (usually `setup.cfg`)
to define package’s metadata and other options which are normally supplied
to ``setup()`` function.

This approach not only allows automation scenarios, but also reduces
boilerplate code in some cases.

.. note::
    Implementation presents limited compatibility with distutils2-like
    ``setup.cfg`` sections (used by ``pbr`` and ``d2to1`` packages).

    Namely: only metadata related keys from ``metadata`` section are supported
    (except for ``description-file``); keys from ``files``, ``entry_points``
    and ``backwards_compat`` are not supported.


.. code-block:: ini

    [metadata]
    name = my_package
    version = attr: src.VERSION
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD 3-Clause License
    classifiers =
        Framework :: Django
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.5

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    scripts =
      bin/first.py
      bin/second.py

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        src.subpackage1
        src.subpackage2


Metadata and options could be set in sections with the same names.

* Keys are the same as keyword arguments one provides to ``setup()`` function.

* Complex values could be placed comma-separated or one per line
  in *dangling* sections. The following are the same:

  .. code-block:: ini

      [metadata]
      keywords = one, two

      [metadata]
      keywords =
        one
        two

* In some cases complex values could be provided in subsections for clarity.

* Some keys allow ``file:``, ``attr:`` and ``find:`` directives to cover
  common usecases.

* Unknown keys are ignored.


Specifying values
=================

Some values are treated as simple strings, some allow more logic.

Type names used below:

* ``str`` - simple string
* ``list-comma`` - dangling list or comma-separated values string
* ``list-semi`` - dangling list or semicolon-separated values string
* ``bool`` -  ``True`` is 1, yes, true
* ``dict`` - list-comma where keys from values are separated by =
* ``section`` - values could be read from a dedicated (sub)section


Special directives:

* ``attr:`` - value could be read from module attribute
* ``file:`` - value could be read from a list of files and then concatenated


.. note::
    ``file:`` directive is sandboxed and won't reach anything outside
    directory with ``setup.py``.


Metadata
--------

.. note::
    Aliases given below are supported for compatibility reasons,
    but not advised.

=================  =================  =====
Key                Aliases            Accepted value type
=================  =================  =====
name                                  str
version                               attr:, str
url                home-page          str
download_url       download-url       str
author                                str
author_email       author-email       str
maintainer                            str
maintainer_email   maintainer-email   str
classifiers        classifier         file:, list-comma
license                               file:, str
description        summary            file:, str
long_description   long-description   file:, str
keywords                              list-comma
platforms          platform           list-comma
provides                              list-comma
requires                              list-comma
obsoletes                             list-comma
=================  =================  =====

.. note::

    **version** - ``attr:`` supports callables; supports iterables;
    unsupported types are casted using ``str()``.


Options
-------

=======================  =====
Key                      Accepted value type
=======================  =====
zip_safe                 bool
setup_requires           list-semi
install_requires         list-semi
extras_require           section
python_requires          str
entry_points             file:, section
use_2to3                 bool
use_2to3_fixers          list-comma
use_2to3_exclude_fixers  list-comma
convert_2to3_doctests    list-comma
scripts                  list-comma
eager_resources          list-comma
dependency_links         list-comma
tests_require            list-semi
include_package_data     bool
packages                 find:, list-comma
package_dir              dict
package_data             section
exclude_package_data     section
namespace_packages       list-comma
py_modules               list-comma
=======================  =====

.. note::

    **packages** - ``find:`` directive can be further configured
    in a dedicated subsection `options.packages.find`. This subsection
    accepts the same keys as `setuptools.find` function:
    `where`, `include`, `exclude`.


Configuration API
=================

Some automation tools may wish to access data from a configuration file.

``Setuptools`` exposes ``read_configuration()`` function allowing
parsing ``metadata`` and ``options`` sections into a dictionary.


.. code-block:: python

    from setuptools.config import read_configuration

    conf_dict = read_configuration('/home/user/dev/package/setup.cfg')


By default ``read_configuration()`` will read only file provided
in the first argument. To include values from other configuration files
which could be in various places set `find_others` function argument
to ``True``.

If you have only a configuration file but not the whole package you can still
try to get data out of it with the help of `ignore_option_errors` function
argument. When it is set to ``True`` all options with errors possibly produced
by directives, such as ``attr:`` and others will be silently ignored.
As a consequence the resulting dictionary will include no such options.


--------------------------------
Extending and Reusing Setuptools
--------------------------------

Creating ``distutils`` Extensions
=================================

It can be hard to add new commands or setup arguments to the distutils.  But
the ``setuptools`` package makes it a bit easier, by allowing you to distribute
a distutils extension as a separate project, and then have projects that need
the extension just refer to it in their ``setup_requires`` argument.

With ``setuptools``, your distutils extension projects can hook in new
commands and ``setup()`` arguments just by defining "entry points".  These
are mappings from command or argument names to a specification of where to
import a handler from.  (See the section on `Dynamic Discovery of Services and
Plugins`_ above for some more background on entry points.)


Adding Commands
---------------

You can add new ``setup`` commands by defining entry points in the
``distutils.commands`` group.  For example, if you wanted to add a ``foo``
command, you might add something like this to your distutils extension
project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
        },
    )

(Assuming, of course, that the ``foo`` class in ``mypackage.some_module`` is
a ``setuptools.Command`` subclass.)

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running "install" or "develop" with a site-packages installation
directory) the command(s) will be available to any ``setuptools``-based setup
scripts.  It is not necessary to use the ``--command-packages`` option or
to monkeypatch the ``distutils.command`` package to install your commands;
``setuptools`` automatically adds a wrapper to the distutils to search for
entry points in the active distributions on ``sys.path``.  In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!


Adding ``setup()`` Arguments
----------------------------

Sometimes, your commands may need additional arguments to the ``setup()``
call.  You can enable this by defining entry points in the
``distutils.setup_keywords`` group.  For example, if you wanted a ``setup()``
argument called ``bar_baz``, you might add something like this to your
distutils extension project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
            "distutils.setup_keywords": [
                "bar_baz = mypackage.some_module:validate_bar_baz",
            ],
        },
    )

The idea here is that the entry point defines a function that will be called
to validate the ``setup()`` argument, if it's supplied.  The ``Distribution``
object will have the initial value of the attribute set to ``None``, and the
validation function will only be called if the ``setup()`` call sets it to
a non-None value.  Here's an example validation function::

    def assert_bool(dist, attr, value):
        """Verify that value is True, False, 0, or 1"""
        if bool(value) != value:
            raise DistutilsSetupError(
                "%r must be a boolean value (got %r)" % (attr,value)
            )

Your function should accept three arguments: the ``Distribution`` object,
the attribute name, and the attribute value.  It should raise a
``DistutilsSetupError`` (from the ``distutils.errors`` module) if the argument
is invalid.  Remember, your function will only be called with non-None values,
and the default value of arguments defined this way is always None.  So, your
commands should always be prepared for the possibility that the attribute will
be ``None`` when they access it later.

If more than one active distribution defines an entry point for the same
``setup()`` argument, *all* of them will be called.  This allows multiple
distutils extensions to define a common argument, as long as they agree on
what values of that argument are valid.

Also note that as with commands, it is not necessary to subclass or monkeypatch
the distutils ``Distribution`` class in order to add your arguments; it is
sufficient to define the entry points in your extension, as long as any setup
script using your extension lists your project in its ``setup_requires``
argument.


Adding new EGG-INFO Files
-------------------------

Some extensible applications or frameworks may want to allow third parties to
develop plugins with application or framework-specific metadata included in
the plugins' EGG-INFO directory, for easy access via the ``pkg_resources``
metadata API.  The easiest way to allow this is to create a distutils extension
to be used from the plugin projects' setup scripts (via ``setup_requires``)
that defines a new setup keyword, and then uses that data to write an EGG-INFO
file when the ``egg_info`` command is run.

The ``egg_info`` command looks for extension points in an ``egg_info.writers``
group, and calls them to write the files.  Here's a simple example of a
distutils extension defining a setup argument ``foo_bar``, which is a list of
lines that will be written to ``foo_bar.txt`` in the EGG-INFO directory of any
project that uses the argument::

    setup(
        # ...
        entry_points={
            "distutils.setup_keywords": [
                "foo_bar = setuptools.dist:assert_string_list",
            ],
            "egg_info.writers": [
                "foo_bar.txt = setuptools.command.egg_info:write_arg",
            ],
        },
    )

This simple example makes use of two utility functions defined by setuptools
for its own use: a routine to validate that a setup keyword is a sequence of
strings, and another one that looks up a setup argument and writes it to
a file.  Here's what the writer utility looks like::

    def write_arg(cmd, basename, filename):
        argname = os.path.splitext(basename)[0]
        value = getattr(cmd.distribution, argname, None)
        if value is not None:
            value = '\n'.join(value) + '\n'
        cmd.write_or_delete_file(argname, filename, value)

As you can see, ``egg_info.writers`` entry points must be a function taking
three arguments: a ``egg_info`` command instance, the basename of the file to
write (e.g. ``foo_bar.txt``), and the actual full filename that should be
written to.

In general, writer functions should honor the command object's ``dry_run``
setting when writing files, and use the ``distutils.log`` object to do any
console output.  The easiest way to conform to this requirement is to use
the ``cmd`` object's ``write_file()``, ``delete_file()``, and
``write_or_delete_file()`` methods exclusively for your file operations.  See
those methods' docstrings for more details.


Adding Support for Revision Control Systems
-------------------------------------------------

If the files you want to include in the source distribution are tracked using
Git, Mercurial or SVN, you can use the following packages to achieve that:

- Git and Mercurial: `setuptools_scm <https://pypi.python.org/pypi/setuptools_scm>`_
- SVN: `setuptools_svn <https://pypi.python.org/pypi/setuptools_svn>`_

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this::

    entry_points={
        "setuptools.file_finders": [
            "foobar = my_foobar_module:find_files_for_foobar",
        ]
    }

Then, anyone who wants to use your plugin can simply install it, and their
local setuptools installation will be able to find the necessary files.

It is not necessary to distribute source control plugins with projects that
simply use the other source control system, or to specify the plugins in
``setup_requires``.  When you create a source distribution with the ``sdist``
command, setuptools automatically records what files were found in the
``SOURCES.txt`` file.  That way, recipients of source distributions don't need
to have revision control at all.  However, if someone is working on a package
by checking out with that system, they will need the same plugin(s) that the
original author is using.

A few important points for writing revision control file finders:

* Your finder function MUST return relative paths, created by appending to the
  passed-in directory name.  Absolute paths are NOT allowed, nor are relative
  paths that reference a parent directory of the passed-in directory.

* Your finder function MUST accept an empty string as the directory name,
  meaning the current directory.  You MUST NOT convert this to a dot; just
  yield relative paths.  So, yielding a subdirectory named ``some/dir`` under
  the current directory should NOT be rendered as ``./some/dir`` or
  ``/somewhere/some/dir``, but *always* as simply ``some/dir``

* Your finder function SHOULD NOT raise any errors, and SHOULD deal gracefully
  with the absence of needed programs (i.e., ones belonging to the revision
  control system itself.  It *may*, however, use ``distutils.log.warn()`` to
  inform the user of the missing program(s).


Subclassing ``Command``
-----------------------

Sorry, this section isn't written yet, and neither is a lot of what's below
this point.

XXX


Reusing ``setuptools`` Code
===========================

``ez_setup``
------------

XXX


``setuptools.archive_util``
---------------------------

XXX


``setuptools.sandbox``
----------------------

XXX


``setuptools.package_index``
----------------------------

XXX


Mailing List and Bug Tracker
============================

Please use the `distutils-sig mailing list`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the list are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
.. _setuptools bug tracker: https://github.com/pypa/setuptools/
doc/alt-python35-setuptools/formats.txt000064400000075012151733306540014227 0ustar00=====================================
The Internal Structure of Python Eggs
=====================================

STOP! This is not the first document you should read!



.. contents:: **Table of Contents**


----------------------
Eggs and their Formats
----------------------

A "Python egg" is a logical structure embodying the release of a
specific version of a Python project, comprising its code, resources,
and metadata. There are multiple formats that can be used to physically
encode a Python egg, and others can be developed. However, a key
principle of Python eggs is that they should be discoverable and
importable. That is, it should be possible for a Python application to
easily and efficiently find out what eggs are present on a system, and
to ensure that the desired eggs' contents are importable.

There are two basic formats currently implemented for Python eggs:

1. ``.egg`` format: a directory or zipfile *containing* the project's
   code and resources, along with an ``EGG-INFO`` subdirectory that
   contains the project's metadata

2. ``.egg-info`` format: a file or directory placed *adjacent* to the
   project's code and resources, that directly contains the project's
   metadata.

Both formats can include arbitrary Python code and resources, including
static data files, package and non-package directories, Python
modules, C extension modules, and so on.  But each format is optimized
for different purposes.

The ``.egg`` format is well-suited to distribution and the easy
uninstallation or upgrades of code, since the project is essentially
self-contained within a single directory or file, unmingled with any
other projects' code or resources.  It also makes it possible to have
multiple versions of a project simultaneously installed, such that
individual programs can select the versions they wish to use.

The ``.egg-info`` format, on the other hand, was created to support
backward-compatibility, performance, and ease of installation for system
packaging tools that expect to install all projects' code and resources
to a single directory (e.g. ``site-packages``).  Placing the metadata
in that same directory simplifies the installation process, since it
isn't necessary to create ``.pth`` files or otherwise modify
``sys.path`` to include each installed egg.

Its disadvantage, however, is that it provides no support for clean
uninstallation or upgrades, and of course only a single version of a
project can be installed to a given directory. Thus, support from a
package management tool is required. (This is why setuptools' "install"
command refers to this type of egg installation as "single-version,
externally managed".)  Also, they lack sufficient data to allow them to
be copied from their installation source.  easy_install can "ship" an
application by copying ``.egg`` files or directories to a target
location, but it cannot do this for ``.egg-info`` installs, because
there is no way to tell what code and resources belong to a particular
egg -- there may be several eggs "scrambled" together in a single
installation location, and the ``.egg-info`` format does not currently
include a way to list the files that were installed.  (This may change
in a future version.)


Code and Resources
==================

The layout of the code and resources is dictated by Python's normal
import layout, relative to the egg's "base location".

For the ``.egg`` format, the base location is the ``.egg`` itself. That
is, adding the ``.egg`` filename or directory name to ``sys.path``
makes its contents importable.

For the ``.egg-info`` format, however, the base location is the
directory that *contains* the ``.egg-info``, and thus it is the
directory that must be added to ``sys.path`` to make the egg importable.
(Note that this means that the "normal" installation of a package to a
``sys.path`` directory is sufficient to make it an "egg" if it has an
``.egg-info`` file or directory installed alongside of it.)


Project Metadata
=================

If eggs contained only code and resources, there would of course be
no difference between them and any other directory or zip file on
``sys.path``.  Thus, metadata must also be included, using a metadata
file or directory.

For the ``.egg`` format, the metadata is placed in an ``EGG-INFO``
subdirectory, directly within the ``.egg`` file or directory.  For the
``.egg-info`` format, metadata is stored directly within the
``.egg-info`` directory itself.

The minimum project metadata that all eggs must have is a standard
Python ``PKG-INFO`` file, named ``PKG-INFO`` and placed within the
metadata directory appropriate to the format.  Because it's possible for
this to be the only metadata file included, ``.egg-info`` format eggs
are not required to be a directory; they can just be a ``.egg-info``
file that directly contains the ``PKG-INFO`` metadata.  This eliminates
the need to create a directory just to store one file.  This option is
*not* available for ``.egg`` formats, since setuptools always includes
other metadata.  (In fact, setuptools itself never generates
``.egg-info`` files, either; the support for using files was added so
that the requirement could easily be satisfied by other tools, such
as the distutils in Python 2.5).

In addition to the ``PKG-INFO`` file, an egg's metadata directory may
also include files and directories representing various forms of
optional standard metadata (see the section on `Standard Metadata`_,
below) or user-defined metadata required by the project.  For example,
some projects may define a metadata format to describe their application
plugins, and metadata in this format would then be included by plugin
creators in their projects' metadata directories.


Filename-Embedded Metadata
==========================

To allow introspection of installed projects and runtime resolution of
inter-project dependencies, a certain amount of information is embedded
in egg filenames.  At a minimum, this includes the project name, and
ideally will also include the project version number.  Optionally, it
can also include the target Python version and required runtime
platform if platform-specific C code is included.  The syntax of an
egg filename is as follows::

    name ["-" version ["-py" pyver ["-" required_platform]]] "." ext

The "name" and "version" should be escaped using the ``to_filename()``
function provided by ``pkg_resources``, after first processing them with
``safe_name()`` and ``safe_version()`` respectively.  These latter two
functions can also be used to later "unescape" these parts of the
filename.  (For a detailed description of these transformations, please
see the "Parsing Utilities" section of the ``pkg_resources`` manual.)

The "pyver" string is the Python major version, as found in the first
3 characters of ``sys.version``.  "required_platform" is essentially
a distutils ``get_platform()`` string, but with enhancements to properly
distinguish Mac OS versions.  (See the ``get_build_platform()``
documentation in the "Platform Utilities" section of the
``pkg_resources`` manual for more details.)

Finally, the "ext" is either ``.egg`` or ``.egg-info``, as appropriate
for the egg's format.

Normally, an egg's filename should include at least the project name and
version, as this allows the runtime system to find desired project
versions without having to read the egg's PKG-INFO to determine its
version number.

Setuptools, however, only includes the version number in the filename
when an ``.egg`` file is built using the ``bdist_egg`` command, or when
an ``.egg-info`` directory is being installed by the
``install_egg_info`` command. When generating metadata for use with the
original source tree, it only includes the project name, so that the
directory will not have to be renamed each time the project's version
changes.

This is especially important when version numbers change frequently, and
the source metadata directory is kept under version control with the
rest of the project.  (As would be the case when the project's source
includes project-defined metadata that is not generated from by
setuptools from data in the setup script.)


Egg Links
=========

In addition to the ``.egg`` and ``.egg-info`` formats, there is a third
egg-related extension that you may encounter on occasion: ``.egg-link``
files.

These files are not eggs, strictly speaking. They simply provide a way
to reference an egg that is not physically installed in the desired
location. They exist primarily as a cross-platform alternative to
symbolic links, to support "installing" code that is being developed in
a different location than the desired installation location. For
example, if a user is developing an application plugin in their home
directory, but the plugin needs to be "installed" in an application
plugin directory, running "setup.py develop -md /path/to/app/plugins"
will install an ``.egg-link`` file in ``/path/to/app/plugins``, that
tells the egg runtime system where to find the actual egg (the user's
project source directory and its ``.egg-info`` subdirectory).

``.egg-link`` files are named following the format for ``.egg`` and
``.egg-info`` names, but only the project name is included; no version,
Python version, or platform information is included.  When the runtime
searches for available eggs, ``.egg-link`` files are opened and the
actual egg file/directory name is read from them.

Each ``.egg-link`` file should contain a single file or directory name,
with no newlines.  This filename should be the base location of one or
more eggs.  That is, the name must either end in ``.egg``, or else it
should be the parent directory of one or more ``.egg-info`` format eggs.

As of setuptools 0.6c6, the path may be specified as a platform-independent
(i.e. ``/``-separated) relative path from the directory containing the
``.egg-link`` file, and a second line may appear in the file, specifying a
platform-independent relative path from the egg's base directory to its
setup script directory.  This allows installation tools such as EasyInstall
to find the project's setup directory and build eggs or perform other setup
commands on it.


-----------------
Standard Metadata
-----------------

In addition to the minimum required ``PKG-INFO`` metadata, projects can
include a variety of standard metadata files or directories, as
described below.  Except as otherwise noted, these files and directories
are automatically generated by setuptools, based on information supplied
in the setup script or through analysis of the project's code and
resources.

Most of these files and directories are generated via "egg-info
writers" during execution of the setuptools ``egg_info`` command, and
are listed in the ``egg_info.writers`` entry point group defined by
setuptools' own ``setup.py`` file.

Project authors can register their own metadata writers as entry points
in this group (as described in the setuptools manual under "Adding new
EGG-INFO Files") to cause setuptools to generate project-specific
metadata files or directories during execution of the ``egg_info``
command.  It is up to project authors to document these new metadata
formats, if they create any.


``.txt`` File Formats
=====================

Files described in this section that have ``.txt`` extensions have a
simple lexical format consisting of a sequence of text lines, each line
terminated by a linefeed character (regardless of platform).  Leading
and trailing whitespace on each line is ignored, as are blank lines and
lines whose first nonblank character is a ``#`` (comment symbol).  (This
is the parsing format defined by the ``yield_lines()`` function of
the ``pkg_resources`` module.)

All ``.txt`` files defined by this section follow this format, but some
are also "sectioned" files, meaning that their contents are divided into
sections, using square-bracketed section headers akin to Windows
``.ini`` format.  Note that this does *not* imply that the lines within
the sections follow an ``.ini`` format, however.  Please see an
individual metadata file's documentation for a description of what the
lines and section names mean in that particular file.

Sectioned files can be parsed using the ``split_sections()`` function;
see the "Parsing Utilities" section of the ``pkg_resources`` manual for
for details.


Dependency Metadata
===================


``requires.txt``
----------------

This is a "sectioned" text file.  Each section is a sequence of
"requirements", as parsed by the ``parse_requirements()`` function;
please see the ``pkg_resources`` manual for the complete requirement
parsing syntax.

The first, unnamed section (i.e., before the first section header) in
this file is the project's core requirements, which must be installed
for the project to function.  (Specified using the ``install_requires``
keyword to ``setup()``).

The remaining (named) sections describe the project's "extra"
requirements, as specified using the ``extras_require`` keyword to
``setup()``.  The section name is the name of the optional feature, and
the section body lists that feature's dependencies.

Note that it is not normally necessary to inspect this file directly;
``pkg_resources.Distribution`` objects have a ``requires()`` method
that can be used to obtain ``Requirement`` objects describing the
project's core and optional dependencies.


``setup_requires.txt``
----------------------

Much like ``requires.txt`` except represents the requirements
specified by the ``setup_requires`` parameter to the Distribution.


``dependency_links.txt``
------------------------

A list of dependency URLs, one per line, as specified using the
``dependency_links`` keyword to ``setup()``.  These may be direct
download URLs, or the URLs of web pages containing direct download
links, and will be used by EasyInstall to find dependencies, as though
the user had manually provided them via the ``--find-links`` command
line option.  Please see the setuptools manual and EasyInstall manual
for more information on specifying this option, and for information on
how EasyInstall processes ``--find-links`` URLs.


``depends.txt`` -- Obsolete, do not create!
-------------------------------------------

This file follows an identical format to ``requires.txt``, but is
obsolete and should not be used.  The earliest versions of setuptools
required users to manually create and maintain this file, so the runtime
still supports reading it, if it exists.  The new filename was created
so that it could be automatically generated from ``setup()`` information
without overwriting an existing hand-created ``depends.txt``, if one
was already present in the project's source ``.egg-info`` directory.


``namespace_packages.txt`` -- Namespace Package Metadata
========================================================

A list of namespace package names, one per line, as supplied to the
``namespace_packages`` keyword to ``setup()``.  Please see the manuals
for setuptools and ``pkg_resources`` for more information about
namespace packages.


``entry_points.txt`` -- "Entry Point"/Plugin Metadata
=====================================================

This is a "sectioned" text file, whose contents encode the
``entry_points`` keyword supplied to ``setup()``.  All sections are
named, as the section names specify the entry point groups in which the
corresponding section's entry points are registered.

Each section is a sequence of "entry point" lines, each parseable using
the ``EntryPoint.parse`` classmethod; please see the ``pkg_resources``
manual for the complete entry point parsing syntax.

Note that it is not necessary to parse this file directly; the
``pkg_resources`` module provides a variety of APIs to locate and load
entry points automatically.  Please see the setuptools and
``pkg_resources`` manuals for details on the nature and uses of entry
points.


The ``scripts`` Subdirectory
============================

This directory is currently only created for ``.egg`` files built by
the setuptools ``bdist_egg`` command.  It will contain copies of all
of the project's "traditional" scripts (i.e., those specified using the
``scripts`` keyword to ``setup()``).  This is so that they can be
reconstituted when an ``.egg`` file is installed.

The scripts are placed here using the distutils' standard
``install_scripts`` command, so any ``#!`` lines reflect the Python
installation where the egg was built.  But instead of copying the
scripts to the local script installation directory, EasyInstall writes
short wrapper scripts that invoke the original scripts from inside the
egg, after ensuring that sys.path includes the egg and any eggs it
depends on.  For more about `script wrappers`_, see the section below on
`Installation and Path Management Issues`_.


Zip Support Metadata
====================


``native_libs.txt``
-------------------

A list of C extensions and other dynamic link libraries contained in
the egg, one per line.  Paths are ``/``-separated and relative to the
egg's base location.

This file is generated as part of ``bdist_egg`` processing, and as such
only appears in ``.egg`` files (and ``.egg`` directories created by
unpacking them).  It is used to ensure that all libraries are extracted
from a zipped egg at the same time, in case there is any direct linkage
between them.  Please see the `Zip File Issues`_ section below for more
information on library and resource extraction from ``.egg`` files.


``eager_resources.txt``
-----------------------

A list of resource files and/or directories, one per line, as specified
via the ``eager_resources`` keyword to ``setup()``.  Paths are
``/``-separated and relative to the egg's base location.

Resource files or directories listed here will be extracted
simultaneously, if any of the named resources are extracted, or if any
native libraries listed in ``native_libs.txt`` are extracted.  Please
see the setuptools manual for details on what this feature is used for
and how it works, as well as the `Zip File Issues`_ section below.


``zip-safe`` and ``not-zip-safe``
---------------------------------

These are zero-length files, and either one or the other should exist.
If ``zip-safe`` exists, it means that the project will work properly
when installed as an ``.egg`` zipfile, and conversely the existence of
``not-zip-safe`` means the project should not be installed as an
``.egg`` file.  The ``zip_safe`` option to setuptools' ``setup()``
determines which file will be written. If the option isn't provided,
setuptools attempts to make its own assessment of whether the package
can work, based on code and content analysis.

If neither file is present at installation time, EasyInstall defaults
to assuming that the project should be unzipped.  (Command-line options
to EasyInstall, however, take precedence even over an existing
``zip-safe`` or ``not-zip-safe`` file.)

Note that these flag files appear only in ``.egg`` files generated by
``bdist_egg``, and in ``.egg`` directories created by unpacking such an
``.egg`` file.



``top_level.txt`` -- Conflict Management Metadata
=================================================

This file is a list of the top-level module or package names provided
by the project, one Python identifier per line.

Subpackages are not included; a project containing both a ``foo.bar``
and a ``foo.baz`` would include only one line, ``foo``, in its
``top_level.txt``.

This data is used by ``pkg_resources`` at runtime to issue a warning if
an egg is added to ``sys.path`` when its contained packages may have
already been imported.

(It was also once used to detect conflicts with non-egg packages at
installation time, but in more recent versions, setuptools installs eggs
in such a way that they always override non-egg packages, thus
preventing a problem from arising.)


``SOURCES.txt`` -- Source Files Manifest
========================================

This file is roughly equivalent to the distutils' ``MANIFEST`` file.
The differences are as follows:

* The filenames always use ``/`` as a path separator, which must be
  converted back to a platform-specific path whenever they are read.

* The file is automatically generated by setuptools whenever the
  ``egg_info`` or ``sdist`` commands are run, and it is *not*
  user-editable.

Although this metadata is included with distributed eggs, it is not
actually used at runtime for any purpose.  Its function is to ensure
that setuptools-built *source* distributions can correctly discover
what files are part of the project's source, even if the list had been
generated using revision control metadata on the original author's
system.

In other words, ``SOURCES.txt`` has little or no runtime value for being
included in distributed eggs, and it is possible that future versions of
the ``bdist_egg`` and ``install_egg_info`` commands will strip it before
installation or distribution.  Therefore, do not rely on its being
available outside of an original source directory or source
distribution.


------------------------------
Other Technical Considerations
------------------------------


Zip File Issues
===============

Although zip files resemble directories, they are not fully
substitutable for them.  Most platforms do not support loading dynamic
link libraries contained in zipfiles, so it is not possible to directly
import C extensions from ``.egg`` zipfiles.  Similarly, there are many
existing libraries -- whether in Python or C -- that require actual
operating system filenames, and do not work with arbitrary "file-like"
objects or in-memory strings, and thus cannot operate directly on the
contents of zip files.

To address these issues, the ``pkg_resources`` module provides a
"resource API" to support obtaining either the contents of a resource,
or a true operating system filename for the resource.  If the egg
containing the resource is a directory, the resource's real filename
is simply returned.  However, if the egg is a zipfile, then the
resource is first extracted to a cache directory, and the filename
within the cache is returned.

The cache directory is determined by the ``pkg_resources`` API; please
see the ``set_cache_path()`` and ``get_default_cache()`` documentation
for details.


The Extraction Process
----------------------

Resources are extracted to a cache subdirectory whose name is based
on the enclosing ``.egg`` filename and the path to the resource.  If
there is already a file of the correct name, size, and timestamp, its
filename is returned to the requester.  Otherwise, the desired file is
extracted first to a temporary name generated using
``mkstemp(".$extract",target_dir)``, and then its timestamp is set to
match the one in the zip file, before renaming it to its final name.
(Some collision detection and resolution code is used to handle the
fact that Windows doesn't overwrite files when renaming.)

If a resource directory is requested, all of its contents are
recursively extracted in this fashion, to ensure that the directory
name can be used as if it were valid all along.

If the resource requested for extraction is listed in the
``native_libs.txt`` or ``eager_resources.txt`` metadata files, then
*all* resources listed in *either* file will be extracted before the
requested resource's filename is returned, thus ensuring that all
C extensions and data used by them will be simultaneously available.


Extension Import Wrappers
-------------------------

Since Python's built-in zip import feature does not support loading
C extension modules from zipfiles, the setuptools ``bdist_egg`` command
generates special import wrappers to make it work.

The wrappers are ``.py`` files (along with corresponding ``.pyc``
and/or ``.pyo`` files) that have the same module name as the
corresponding C extension.  These wrappers are located in the same
package directory (or top-level directory) within the zipfile, so that
say, ``foomodule.so`` will get a corresponding ``foo.py``, while
``bar/baz.pyd`` will get a corresponding ``bar/baz.py``.

These wrapper files contain a short stanza of Python code that asks
``pkg_resources`` for the filename of the corresponding C extension,
then reloads the module using the obtained filename.  This will cause
``pkg_resources`` to first ensure that all of the egg's C extensions
(and any accompanying "eager resources") are extracted to the cache
before attempting to link to the C library.

Note, by the way, that ``.egg`` directories will also contain these
wrapper files.  However, Python's default import priority is such that
C extensions take precedence over same-named Python modules, so the
import wrappers are ignored unless the egg is a zipfile.


Installation and Path Management Issues
=======================================

Python's initial setup of ``sys.path`` is very dependent on the Python
version and installation platform, as well as how Python was started
(i.e., script vs. ``-c`` vs. ``-m`` vs. interactive interpreter).
In fact, Python also provides only two relatively robust ways to affect
``sys.path`` outside of direct manipulation in code: the ``PYTHONPATH``
environment variable, and ``.pth`` files.

However, with no cross-platform way to safely and persistently change
environment variables, this leaves ``.pth`` files as EasyInstall's only
real option for persistent configuration of ``sys.path``.

But ``.pth`` files are rather strictly limited in what they are allowed
to do normally.  They add directories only to the *end* of ``sys.path``,
after any locally-installed ``site-packages`` directory, and they are
only processed *in* the ``site-packages`` directory to start with.

This is a double whammy for users who lack write access to that
directory, because they can't create a ``.pth`` file that Python will
read, and even if a sympathetic system administrator adds one for them
that calls ``site.addsitedir()`` to allow some other directory to
contain ``.pth`` files, they won't be able to install newer versions of
anything that's installed in the systemwide ``site-packages``, because
their paths will still be added *after* ``site-packages``.

So EasyInstall applies two workarounds to solve these problems.

The first is that EasyInstall leverages ``.pth`` files' "import" feature
to manipulate ``sys.path`` and ensure that anything EasyInstall adds
to a ``.pth`` file will always appear before both the standard library
and the local ``site-packages`` directories.  Thus, it is always
possible for a user who can write a Python-read ``.pth`` file to ensure
that their packages come first in their own environment.

Second, when installing to a ``PYTHONPATH`` directory (as opposed to
a "site" directory like ``site-packages``) EasyInstall will also install
a special version of the ``site`` module.  Because it's in a
``PYTHONPATH`` directory, this module will get control before the
standard library version of ``site`` does.  It will record the state of
``sys.path`` before invoking the "real" ``site`` module, and then
afterwards it processes any ``.pth`` files found in ``PYTHONPATH``
directories, including all the fixups needed to ensure that eggs always
appear before the standard library in sys.path, but are in a relative
order to one another that is defined by their ``PYTHONPATH`` and
``.pth``-prescribed sequence.

The net result of these changes is that ``sys.path`` order will be
as follows at runtime:

1. The ``sys.argv[0]`` directory, or an empty string if no script
   is being executed.

2. All eggs installed by EasyInstall in any ``.pth`` file in each
   ``PYTHONPATH`` directory, in order first by ``PYTHONPATH`` order,
   then normal ``.pth`` processing order (which is to say alphabetical
   by ``.pth`` filename, then by the order of listing within each
   ``.pth`` file).

3. All eggs installed by EasyInstall in any ``.pth`` file in each "site"
   directory (such as ``site-packages``), following the same ordering
   rules as for the ones on ``PYTHONPATH``.

4. The ``PYTHONPATH`` directories themselves, in their original order

5. Any paths from ``.pth`` files found on ``PYTHONPATH`` that were *not*
   eggs installed by EasyInstall, again following the same relative
   ordering rules.

6. The standard library and "site" directories, along with the contents
   of any ``.pth`` files found in the "site" directories.

Notice that sections 1, 4, and 6 comprise the "normal" Python setup for
``sys.path``.  Sections 2 and 3 are inserted to support eggs, and
section 5 emulates what the "normal" semantics of ``.pth`` files on
``PYTHONPATH`` would be if Python natively supported them.

For further discussion of the tradeoffs that went into this design, as
well as notes on the actual magic inserted into ``.pth`` files to make
them do these things, please see also the following messages to the
distutils-SIG mailing list:

* http://mail.python.org/pipermail/distutils-sig/2006-February/006026.html
* http://mail.python.org/pipermail/distutils-sig/2006-March/006123.html


Script Wrappers
---------------

EasyInstall never directly installs a project's original scripts to
a script installation directory.  Instead, it writes short wrapper
scripts that first ensure that the project's dependencies are active
on sys.path, before invoking the original script.  These wrappers
have a #! line that points to the version of Python that was used to
install them, and their second line is always a comment that indicates
the type of script wrapper, the project version required for the script
to run, and information identifying the script to be invoked.

The format of this marker line is::

    "# EASY-INSTALL-" script_type ": " tuple_of_strings "\n"

The ``script_type`` is one of ``SCRIPT``, ``DEV-SCRIPT``, or
``ENTRY-SCRIPT``.  The ``tuple_of_strings`` is a comma-separated
sequence of Python string constants.  For ``SCRIPT`` and ``DEV-SCRIPT``
wrappers, there are two strings: the project version requirement, and
the script name (as a filename within the ``scripts`` metadata
directory).  For ``ENTRY-SCRIPT`` wrappers, there are three:
the project version requirement, the entry point group name, and the
entry point name.  (See the "Automatic Script Creation" section in the
setuptools manual for more information about entry point scripts.)

In each case, the project version requirement string will be a string
parseable with the ``pkg_resources`` modules' ``Requirement.parse()``
classmethod.  The only difference between a ``SCRIPT`` wrapper and a
``DEV-SCRIPT`` is that a ``DEV-SCRIPT`` actually executes the original
source script in the project's source tree, and is created when the
"setup.py develop" command is run.  A ``SCRIPT`` wrapper, on the other
hand, uses the "installed" script written to the ``EGG-INFO/scripts``
subdirectory of the corresponding ``.egg`` zipfile or directory.
(``.egg-info`` eggs do not have script wrappers associated with them,
except in the "setup.py develop" case.)

The purpose of including the marker line in generated script wrappers is
to facilitate introspection of installed scripts, and their relationship
to installed eggs.  For example, an uninstallation tool could use this
data to identify what scripts can safely be removed, and/or identify
what scripts would stop working if a particular egg is uninstalled.

doc/alt-python35-setuptools/releases.txt000064400000004102151733306540014347 0ustar00===============
Release Process
===============

In order to allow for rapid, predictable releases, Setuptools uses a
mechanical technique for releases, enacted by Travis following a
successful build of a tagged release per
`PyPI deployment <https://docs.travis-ci.com/user/deployment/pypi>`_.

Prior to cutting a release, please check that the CHANGES.rst reflects
the summary of changes since the last release.
Ideally, these changelog entries would have been added
along with the changes, but it's always good to check.
Think about it from the
perspective of a user not involved with the development--what would
that person want to know about what has changed--or from the
perspective of your future self wanting to know when a particular
change landed.

To cut a release, install and run ``bump2version {part}`` where ``part``
is major, minor, or patch based on the scope of the changes in the
release. Then, push the commits to the master branch. If tests pass,
the release will be uploaded to PyPI (from the Python 3.6 tests).

Release Frequency
-----------------

Some have asked why Setuptools is released so frequently. Because Setuptools
uses a mechanical release process, it's very easy to make releases whenever the
code is stable (tests are passing). As a result, the philosophy is to release
early and often.

While some find the frequent releases somewhat surprising, they only empower
the user. Although releases are made frequently, users can choose the frequency
at which they use those releases. If instead Setuptools contributions were only
released in batches, the user would be constrained to only use Setuptools when
those official releases were made. With frequent releases, the user can govern
exactly how often he wishes to update.

Frequent releases also then obviate the need for dev or beta releases in most
cases. Because releases are made early and often, bugs are discovered and
corrected quickly, in many cases before other users have yet to encounter them.

Release Managers
----------------

Additionally, anyone with push access to the master branch has access to cut
releases.
doc/alt-python35-setuptools/development.txt000064400000002702151733306540015072 0ustar00-------------------------
Development on Setuptools
-------------------------

Setuptools is maintained by the Python community under the Python Packaging
Authority (PyPA) and led by Jason R. Coombs.

This document describes the process by which Setuptools is developed.
This document assumes the reader has some passing familiarity with
*using* setuptools, the ``pkg_resources`` module, and EasyInstall.  It
does not attempt to explain basic concepts like inter-project
dependencies, nor does it contain detailed lexical syntax for most
file formats.  Neither does it explain concepts like "namespace
packages" or "resources" in any detail, as all of these subjects are
covered at length in the setuptools developer's guide and the
``pkg_resources`` reference manual.

Instead, this is **internal** documentation for how those concepts and
features are *implemented* in concrete terms.  It is intended for people
who are working on the setuptools code base, who want to be able to
troubleshoot setuptools problems, want to write code that reads the file
formats involved, or want to otherwise tinker with setuptools-generated
files and directories.

Note, however, that these are all internal implementation details and
are therefore subject to change; stick to the published API if you don't
want to be responsible for keeping your code from breaking when
setuptools changes.  You have been warned.

.. toctree::
   :maxdepth: 1

   developer-guide
   formats
   releases
doc/alt-python35-setuptools/index.txt000064400000001031151733306540013651 0ustar00Welcome to Setuptools' documentation!
=====================================

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects, where packaging includes:

 - Python package and module definitions
 - Distribution package metadata
 - Test hooks
 - Project installation
 - Platform-specific details
 - Python 3 support

Documentation content:

.. toctree::
   :maxdepth: 2

   setuptools
   easy_install
   pkg_resources
   python3
   development
   roadmap
   history
doc/alt-python35-setuptools/history.txt000064400000003537151733306540014260 0ustar00:tocdepth: 2

.. _changes:

History
*******

.. include:: ../CHANGES (links).rst

Credits
*******

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
  version of ``pkg_resources``, and supplied the OS X operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories. Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application. In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Tarek Ziadé is the principal author of the Distribute fork, which
  re-invigorated the community on the project, encouraged renewed innovation,
  and addressed many defects.

* Since the merge with Distribute, Jason R. Coombs is the
  maintainer of setuptools. The project is maintained in coordination with
  the Python Packaging Authority (PyPA) and the larger Python community.

doc/alt-python35-setuptools/python3.txt000064400000007602151733306540014160 0ustar00=====================================================
Supporting both Python 2 and Python 3 with Setuptools
=====================================================

Starting with Distribute version 0.6.2 and Setuptools 0.7, the Setuptools
project supported Python 3. Installing and
using setuptools for Python 3 code works exactly the same as for Python 2
code.

Setuptools provides a facility to invoke 2to3 on the code as a part of the
build process, by setting the keyword parameter ``use_2to3`` to True, but
the Setuptools strongly recommends instead developing a unified codebase
using `six <https://pypi.python.org/pypi/six>`_,
`future <https://pypi.python.org/pypi/future>`_, or another compatibility
library.


Using 2to3
==========

Setuptools attempts to make the porting process easier by automatically
running
2to3 as a part of running tests. To do so, you need to configure the
setup.py so that you can run the unit tests with ``python setup.py test``.

See :ref:`test` for more information on this.

Once you have the tests running under Python 2, you can add the use_2to3
keyword parameters to setup(), and start running the tests under Python 3.
The test command will now first run the build command during which the code
will be converted with 2to3, and the tests will then be run from the build
directory, as opposed from the source directory as is normally done.

Setuptools will convert all Python files, and also all doctests in Python
files. However, if you have doctests located in separate text files, these
will not automatically be converted. By adding them to the
``convert_2to3_doctests`` keyword parameter Setuptools will convert them as
well.

By default, the conversion uses all fixers in the ``lib2to3.fixers`` package.
To use additional fixers, the parameter ``use_2to3_fixers`` can be set
to a list of names of packages containing fixers. To exclude fixers, the
parameter ``use_2to3_exclude_fixers`` can be set to fixer names to be
skipped.

An example setup.py might look something like this::

    from setuptools import setup

    setup(
        name='your.module',
        version='1.0',
        description='This is your awesome module',
        author='You',
        author_email='your@email',
        package_dir={'': 'src'},
        packages=['your', 'you.module'],
        test_suite='your.module.tests',
        use_2to3=True,
        convert_2to3_doctests=['src/your/module/README.txt'],
        use_2to3_fixers=['your.fixers'],
        use_2to3_exclude_fixers=['lib2to3.fixes.fix_import'],
    )

Differential conversion
-----------------------

Note that a file will only be copied and converted during the build process
if the source file has been changed. If you add a file to the doctests
that should be converted, it will not be converted the next time you run
the tests, since it hasn't been modified. You need to remove it from the
build directory. Also if you run the build, install or test commands before
adding the use_2to3 parameter, you will have to remove the build directory
before you run the test command, as the files otherwise will seem updated,
and no conversion will happen.

In general, if code doesn't seem to be converted, deleting the build directory
and trying again is a good safeguard against the build directory getting
"out of sync" with the source directory.

Distributing Python 3 modules
=============================

You can distribute your modules with Python 3 support in different ways. A
normal source distribution will work, but can be slow in installing, as the
2to3 process will be run during the install. But you can also distribute
the module in binary format, such as a binary egg. That egg will contain the
already converted code, and hence no 2to3 conversion is needed during install.

Advanced features
=================

If you don't want to run the 2to3 conversion on the doctests in Python files,
you can turn that off by setting ``setuptools.use_2to3_on_doctests = False``.
doc/alt-python35-setuptools/roadmap.txt000064400000000247151733306540014175 0ustar00=======
Roadmap
=======

Setuptools is primarily in maintenance mode. The project attempts to address
user issues, concerns, and feature requests in a timely fashion.
doc/alt-python35-libs/README000064400000020767151733306540011412 0ustar00This is Python version 3.5.9
============================

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation.  All rights reserved.

Python 3.x is a new version of the language, which is incompatible with the
2.x line of releases.  The language is mostly the same, but many details,
especially how built-in objects like dictionaries and strings work,
have changed considerably, and a lot of deprecated features have finally
been removed.

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/


Build Instructions
------------------

On Unix, Linux, BSD, OSX, and Cygwin:

    ./configure
    make
    make test
    sudo make install

This will install Python as python3.

You can pass many options to the configure script; run "./configure --help" to
find out more.  On OSX and Cygwin, the executable is called python.exe;
elsewhere it's just python.

On Mac OS X, if you have configured Python with --enable-framework, you should
use "make frameworkinstall" to do the installation.  Note that this installs
the Python executable in a place that is not normally on your PATH, you may
want to set up a symlink in /usr/local/bin.

On Windows, see PCbuild/readme.txt.

If you wish, you can create a subdirectory and invoke configure from there.
For example:

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.
You should do a "make clean" at the toplevel first.)

To get an optimized build of Python, "configure --enable-optimizations" before
you run make.  This sets the default make targets up to enable Profile Guided
Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO)
on some platforms.  For more details, see the sections bellow.


Profile Guided Optimization
---------------------------

PGO takes advantage of recent versions of the GCC or Clang compilers.
If ran, "make profile-opt" will do several steps.

First, the entire Python directory is cleaned of temporary files that
may have resulted in a previous compilation.

Then, an instrumented version of the interpreter is built, using suitable
compiler flags for each flavour. Note that this is just an intermediary
step and the binary resulted after this step is not good for real life
workloads, as it has profiling instructions embedded inside.

After this instrumented version of the interpreter is built, the Makefile
will automatically run a training workload. This is necessary in order to
profile the interpreter execution. Note also that any output, both stdout
and stderr, that may appear at this step is suppressed.

Finally, the last step is to rebuild the interpreter, using the information
collected in the previous one. The end result will be a Python binary
that is optimized and suitable for distribution or production installation.


Link Time Optimization
----------------------

Enabled via configure's --with-lto flag.  LTO takes advantages of recent
compiler toolchains ability to optimize across the otherwise arbitrary .o file
boundary when building final executables or shared libraries for additional
performance gains.


What's New
----------

We have a comprehensive overview of the changes in the "What's New in
Python 3.5" document, found at

    http://docs.python.org/3.5/whatsnew/3.5.html

For a more detailed change log, read Misc/NEWS (though this file, too,
is incomplete, and also doesn't list anything merged in from the 2.7
release under development).

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


Documentation
-------------

Documentation for Python 3.5 is online, updated daily:

    http://docs.python.org/3.5/

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

If you would like to contribute to the development of Python, relevant
documentation is available at:

    http://docs.python.org/devguide/

For information about building Python's documentation, refer to Doc/README.txt.


Converting From Python 2.x to 3.x
---------------------------------

Python starting with 2.6 contains features to help locating code that needs to
be changed, such as optional warnings when deprecated features are used, and
backported versions of certain key Python 3.x features.

A source-to-source translation tool, "2to3", can take care of the mundane task
of converting large amounts of source code.  It is not a complete solution but
is complemented by the deprecation warnings in 2.6.  See
http://docs.python.org/3.5/library/2to3.html for more information.


Testing
-------

To test the interpreter, type "make test" in the top-level directory.
The test set produces some output.  You can generally ignore the messages
about skipped tests due to optional features which can't be imported.
If a message is printed about a failed test or a traceback or core dump
is produced, something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run "make testall".

IMPORTANT: If the tests fail and you decide to mail a bug report, *don't*
include the output of "make test".  It is useless.  Run the failing test
manually, as follows:

    ./python -m test -v test_whatever

(substituting the top of the source tree for '.' if you built in a different
directory).  This runs the test in verbose mode.


Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (--prefix argument to the configure script)
you must take care that your primary python executable is not overwritten by
the installation of a different version.  All files and directories installed
using "make altinstall" contain the major and minor version and can thus live
side-by-side.  "make install" also creates ${prefix}/bin/python3 which refers
to ${prefix}/bin/pythonX.Y.  If you intend to install multiple versions using
the same prefix you must decide which version (if any) is your "primary"
version.  Install that version using "make install".  Install all other
versions using "make altinstall".

For example, if you want to install Python 2.6, 2.7 and 3.5 with 2.7 being the
primary version, you would execute "make install" in your 2.7 build directory
and "make altinstall" in the others.


Issue Tracker and Mailing List
------------------------------

We're soliciting bug reports about all aspects of the language.  Fixes are also
welcome, preferably in unified diff format.  Please use the issue tracker:

    http://bugs.python.org/

If you're not sure whether you're dealing with a bug or a feature, use the
mailing list:

    python-dev@python.org

To subscribe to the list, use the mailman form:

    http://mail.python.org/mailman/listinfo/python-dev/


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A Python
Enhancement Proposal (PEP) may be submitted if your idea gains ground.  All
current PEPs, as well as guidelines for submitting a new PEP, are listed at
http://www.python.org/dev/peps/.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/

Release Schedule
----------------

See PEP 478 for release details: http://www.python.org/dev/peps/pep-0478/


Copyright and License Information
---------------------------------

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation.  All rights reserved.

Copyright (c) 2000 BeOpen.com.  All rights reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software,
terms & conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
doc/alt-python35-libs/LICENSE000064400000030741151733306540011530 0ustar00A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation; All Rights Reserved" are retained in Python alone or in any
derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
doc/alt-python35-libs/systemtap-example.stp000064400000001145151733306540014731 0ustar00/*
    Example usage of the Python systemtap tapset to show a nested view of all
    Python function calls (and returns) across the whole system.

    Run this using
        stap systemtap-example.stp
    to instrument all Python processes on the system, or (for example) using
        stap systemtap-example.stp -c COMMAND
    to instrument a specific program (implemented in Python)
*/
probe python.function.entry
{
  printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename, lineno);
}

probe python.function.return
{
  printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename, lineno);
}
doc/alt-python35-libs/pyfuntop.stp000064400000001031151733306540013125 0ustar00#!/usr/bin/stap 

global fn_calls;

probe python.function.entry
{ 
  fn_calls[pid(), filename, funcname, lineno] += 1;
}

probe timer.ms(1000) {
    printf("\033[2J\033[1;1H") /* clear screen */
    printf("%6s %80s %6s %30s %6s\n",
           "PID", "FILENAME", "LINE", "FUNCTION", "CALLS")
    foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
        printf("%6d %80s %6d %30s %6d\n",
            pid, filename, lineno, funcname,
            fn_calls[pid, filename, funcname, lineno]);
    }

    delete fn_calls;
}
doc/alt-python35/README000064400000020767151733306540010463 0ustar00This is Python version 3.5.9
============================

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation.  All rights reserved.

Python 3.x is a new version of the language, which is incompatible with the
2.x line of releases.  The language is mostly the same, but many details,
especially how built-in objects like dictionaries and strings work,
have changed considerably, and a lot of deprecated features have finally
been removed.

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/


Build Instructions
------------------

On Unix, Linux, BSD, OSX, and Cygwin:

    ./configure
    make
    make test
    sudo make install

This will install Python as python3.

You can pass many options to the configure script; run "./configure --help" to
find out more.  On OSX and Cygwin, the executable is called python.exe;
elsewhere it's just python.

On Mac OS X, if you have configured Python with --enable-framework, you should
use "make frameworkinstall" to do the installation.  Note that this installs
the Python executable in a place that is not normally on your PATH, you may
want to set up a symlink in /usr/local/bin.

On Windows, see PCbuild/readme.txt.

If you wish, you can create a subdirectory and invoke configure from there.
For example:

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.
You should do a "make clean" at the toplevel first.)

To get an optimized build of Python, "configure --enable-optimizations" before
you run make.  This sets the default make targets up to enable Profile Guided
Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO)
on some platforms.  For more details, see the sections bellow.


Profile Guided Optimization
---------------------------

PGO takes advantage of recent versions of the GCC or Clang compilers.
If ran, "make profile-opt" will do several steps.

First, the entire Python directory is cleaned of temporary files that
may have resulted in a previous compilation.

Then, an instrumented version of the interpreter is built, using suitable
compiler flags for each flavour. Note that this is just an intermediary
step and the binary resulted after this step is not good for real life
workloads, as it has profiling instructions embedded inside.

After this instrumented version of the interpreter is built, the Makefile
will automatically run a training workload. This is necessary in order to
profile the interpreter execution. Note also that any output, both stdout
and stderr, that may appear at this step is suppressed.

Finally, the last step is to rebuild the interpreter, using the information
collected in the previous one. The end result will be a Python binary
that is optimized and suitable for distribution or production installation.


Link Time Optimization
----------------------

Enabled via configure's --with-lto flag.  LTO takes advantages of recent
compiler toolchains ability to optimize across the otherwise arbitrary .o file
boundary when building final executables or shared libraries for additional
performance gains.


What's New
----------

We have a comprehensive overview of the changes in the "What's New in
Python 3.5" document, found at

    http://docs.python.org/3.5/whatsnew/3.5.html

For a more detailed change log, read Misc/NEWS (though this file, too,
is incomplete, and also doesn't list anything merged in from the 2.7
release under development).

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


Documentation
-------------

Documentation for Python 3.5 is online, updated daily:

    http://docs.python.org/3.5/

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

If you would like to contribute to the development of Python, relevant
documentation is available at:

    http://docs.python.org/devguide/

For information about building Python's documentation, refer to Doc/README.txt.


Converting From Python 2.x to 3.x
---------------------------------

Python starting with 2.6 contains features to help locating code that needs to
be changed, such as optional warnings when deprecated features are used, and
backported versions of certain key Python 3.x features.

A source-to-source translation tool, "2to3", can take care of the mundane task
of converting large amounts of source code.  It is not a complete solution but
is complemented by the deprecation warnings in 2.6.  See
http://docs.python.org/3.5/library/2to3.html for more information.


Testing
-------

To test the interpreter, type "make test" in the top-level directory.
The test set produces some output.  You can generally ignore the messages
about skipped tests due to optional features which can't be imported.
If a message is printed about a failed test or a traceback or core dump
is produced, something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run "make testall".

IMPORTANT: If the tests fail and you decide to mail a bug report, *don't*
include the output of "make test".  It is useless.  Run the failing test
manually, as follows:

    ./python -m test -v test_whatever

(substituting the top of the source tree for '.' if you built in a different
directory).  This runs the test in verbose mode.


Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (--prefix argument to the configure script)
you must take care that your primary python executable is not overwritten by
the installation of a different version.  All files and directories installed
using "make altinstall" contain the major and minor version and can thus live
side-by-side.  "make install" also creates ${prefix}/bin/python3 which refers
to ${prefix}/bin/pythonX.Y.  If you intend to install multiple versions using
the same prefix you must decide which version (if any) is your "primary"
version.  Install that version using "make install".  Install all other
versions using "make altinstall".

For example, if you want to install Python 2.6, 2.7 and 3.5 with 2.7 being the
primary version, you would execute "make install" in your 2.7 build directory
and "make altinstall" in the others.


Issue Tracker and Mailing List
------------------------------

We're soliciting bug reports about all aspects of the language.  Fixes are also
welcome, preferably in unified diff format.  Please use the issue tracker:

    http://bugs.python.org/

If you're not sure whether you're dealing with a bug or a feature, use the
mailing list:

    python-dev@python.org

To subscribe to the list, use the mailman form:

    http://mail.python.org/mailman/listinfo/python-dev/


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A Python
Enhancement Proposal (PEP) may be submitted if your idea gains ground.  All
current PEPs, as well as guidelines for submitting a new PEP, are listed at
http://www.python.org/dev/peps/.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/

Release Schedule
----------------

See PEP 478 for release details: http://www.python.org/dev/peps/pep-0478/


Copyright and License Information
---------------------------------

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation.  All rights reserved.

Copyright (c) 2000 BeOpen.com.  All rights reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software,
terms & conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
doc/alt-python35/LICENSE000064400000030741151733306550010602 0ustar00A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software
Foundation; All Rights Reserved" are retained in Python alone or in any
derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
licenses/alt-python35-pip/LICENSE.txt000064400000002102151733306550013234 0ustar00Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
systemtap/tapset/libpython3.5-64.stp000064400000001050151733306550013316 0ustar00/* Systemtap tapset to make it easier to trace Python */

/*
   Define python.function.entry/return:
*/
probe python.function.entry = process("python3").library("/opt/alt/python35/lib64/libpython3.5m.so.1.0").mark("function__entry")
{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
}
probe python.function.return = process("python3").library("/opt/alt/python35/lib64/libpython3.5m.so.1.0").mark("function__return")
{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
}
licenses/ea-libxml2/Copyright000064400000002442151733372260012213 0ustar00Except where otherwise noted in the source code (e.g. the files dict.c and
list.c, which are covered by a similar licence but with different Copyright
notices) all the files are:

 Copyright (C) 1998-2012 Daniel Veillard.  All Rights Reserved.
 Copyright (C) The Libxml2 Contributors.

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

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

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